[monitoring-plugins] gnulib changes

RincewindsHat git at monitoring-plugins.org
Sat Sep 17 03:00:13 CEST 2022


 Module: monitoring-plugins
 Branch: gnulib_2022
 Commit: 62af1d0b2a31185dc8acaf3fe8fc3149414277bd
 Author: RincewindsHat <12514511+RincewindsHat at users.noreply.github.com>
   Date: Sat Sep 17 02:56:19 2022 +0200
    URL: https://www.monitoring-plugins.org/repositories/monitoring-plugins/commit/?id=62af1d0

gnulib changes

---

 gl/Makefile.am                                     |  115 --
 gl/af_alg.c                                        |  213 ---
 gl/af_alg.h                                        |  115 --
 gl/byteswap.in.h                                   |   44 -
 gl/fflush.c                                        |  233 ---
 gl/fpurge.c                                        |  150 --
 gl/freading.c                                      |   76 -
 gl/freading.h                                      |   55 -
 gl/fseek.c                                         |   30 -
 gl/fseeko.c                                        |  164 ---
 gl/ftell.c                                         |   37 -
 gl/ftello.c                                        |  157 --
 gl/gl_openssl.h                                    |  116 --
 gl/inttypes.h                                      | 1509 ++++++++++++++++++++
 gl/limits.h                                        |  132 ++
 gl/lseek.c                                         |   89 --
 gl/m4/af_alg.m4                                    |   57 -
 gl/m4/byteswap.m4                                  |   17 -
 gl/m4/fflush.m4                                    |  100 --
 gl/m4/fpurge.m4                                    |   73 -
 gl/m4/freading.m4                                  |   11 -
 gl/m4/fseek.m4                                     |   15 -
 gl/m4/fseeko.m4                                    |   77 -
 gl/m4/ftell.m4                                     |   15 -
 gl/m4/ftello.m4                                    |  151 --
 gl/m4/gl-openssl.m4                                |   76 -
 gl/m4/gnulib-cache.m4                              |    2 -
 gl/m4/gnulib-comp.m4                               |   87 --
 gl/m4/lseek.m4                                     |   78 -
 gl/m4/sha256.m4                                    |   14 -
 gl/m4/ungetc.m4                                    |   73 -
 gl/malloc/.deps/.dirstamp                          |    0
 gl/malloc/.deps/libgnu_a-dynarray-skeleton.Po      |    1 +
 gl/malloc/.deps/libgnu_a-dynarray_at_failure.Po    |  138 ++
 .../.deps/libgnu_a-dynarray_emplace_enlarge.Po     |  138 ++
 gl/malloc/.deps/libgnu_a-dynarray_finalize.Po      |  116 ++
 gl/malloc/.deps/libgnu_a-dynarray_resize.Po        |  138 ++
 gl/malloc/.deps/libgnu_a-dynarray_resize_clear.Po  |   51 +
 gl/malloc/.dirstamp                                |    0
 gl/malloc/dynarray-skeleton.gl.h                   |  529 +++++++
 gl/malloc/dynarray.gl.h                            |  174 +++
 gl/sha256-stream.c                                 |  145 --
 gl/sha256.c                                        |  433 ------
 gl/sha256.h                                        |  121 --
 gl/stdckdint.h                                     |   38 +
 gl/stdio-impl.h                                    |  212 ---
 gl/sys-limits.h                                    |   42 -
 47 files changed, 2964 insertions(+), 3393 deletions(-)

diff --git a/gl/Makefile.am b/gl/Makefile.am
index d0acf41..8578de5 100644
--- a/gl/Makefile.am
+++ b/gl/Makefile.am
@@ -34,7 +34,6 @@
 #  --macro-prefix=gl \
 #  --no-vc-files \
 #  base64 \
-#  crypto/sha256 \
 #  dirname \
 #  environ \
 #  floorf \
@@ -179,26 +178,6 @@ endif
 
 ## end   gnulib module btowc
 
-## begin gnulib module byteswap
-
-BUILT_SOURCES += $(BYTESWAP_H)
-
-# We need the following in order to create <byteswap.h> when the system
-# doesn't have one.
-if GL_GENERATE_BYTESWAP_H
-byteswap.h: byteswap.in.h $(top_builddir)/config.status
-	$(gl_V_at)$(SED_HEADER_TO_AT_t) $(srcdir)/byteswap.in.h
-	$(AM_V_at)mv $@-t $@
-else
-byteswap.h: $(top_builddir)/config.status
-	rm -f $@
-endif
-MOSTLYCLEANFILES += byteswap.h byteswap.h-t
-
-EXTRA_DIST += byteswap.in.h
-
-## end   gnulib module byteswap
-
 ## begin gnulib module calloc-gnu
 
 
@@ -233,28 +212,6 @@ endif
 
 ## end   gnulib module close
 
-## begin gnulib module crypto/af_alg
-
-libgnu_a_SOURCES += af_alg.c
-
-EXTRA_DIST += af_alg.h sys-limits.h
-
-## end   gnulib module crypto/af_alg
-
-## begin gnulib module crypto/sha256
-
-libgnu_a_SOURCES += sha256-stream.c
-
-## end   gnulib module crypto/sha256
-
-## begin gnulib module crypto/sha256-buffer
-
-libgnu_a_SOURCES += sha256.c
-
-EXTRA_DIST += gl_openssl.h sha256.h
-
-## end   gnulib module crypto/sha256-buffer
-
 ## begin gnulib module dirname
 
 libgnu_a_SOURCES += dirname.c basename.c
@@ -417,16 +374,6 @@ EXTRA_DIST += fd-hook.h
 
 ## end   gnulib module fd-hook
 
-## begin gnulib module fflush
-
-if GL_COND_OBJ_FFLUSH
-libgnu_a_SOURCES += fflush.c
-endif
-
-EXTRA_DIST += stdio-impl.h
-
-## end   gnulib module fflush
-
 ## begin gnulib module filename
 
 
@@ -498,24 +445,6 @@ EXTRA_libgnu_a_SOURCES += fopen.c
 
 ## end   gnulib module fopen-gnu
 
-## begin gnulib module fpurge
-
-if GL_COND_OBJ_FPURGE
-libgnu_a_SOURCES += fpurge.c
-endif
-
-EXTRA_DIST += stdio-impl.h
-
-## end   gnulib module fpurge
-
-## begin gnulib module freading
-
-libgnu_a_SOURCES += freading.c
-
-EXTRA_DIST += freading.h stdio-impl.h
-
-## end   gnulib module freading
-
 ## begin gnulib module free-posix
 
 if GL_COND_OBJ_FREE
@@ -524,24 +453,6 @@ endif
 
 ## end   gnulib module free-posix
 
-## begin gnulib module fseek
-
-if GL_COND_OBJ_FSEEK
-libgnu_a_SOURCES += fseek.c
-endif
-
-## end   gnulib module fseek
-
-## begin gnulib module fseeko
-
-if GL_COND_OBJ_FSEEKO
-libgnu_a_SOURCES += fseeko.c
-endif
-
-EXTRA_DIST += stdio-impl.h
-
-## end   gnulib module fseeko
-
 ## begin gnulib module fstat
 
 if GL_COND_OBJ_FSTAT
@@ -564,24 +475,6 @@ EXTRA_DIST += fsusage.h
 
 ## end   gnulib module fsusage
 
-## begin gnulib module ftell
-
-if GL_COND_OBJ_FTELL
-libgnu_a_SOURCES += ftell.c
-endif
-
-## end   gnulib module ftell
-
-## begin gnulib module ftello
-
-if GL_COND_OBJ_FTELLO
-libgnu_a_SOURCES += ftello.c
-endif
-
-EXTRA_DIST += stdio-impl.h
-
-## end   gnulib module ftello
-
 ## begin gnulib module gen-header
 
 # In 'sed', replace the pattern space with a "DO NOT EDIT" comment.
@@ -947,14 +840,6 @@ libgnu_a_SOURCES += glthread/lock.h glthread/lock.c
 
 ## end   gnulib module lock
 
-## begin gnulib module lseek
-
-if GL_COND_OBJ_LSEEK
-libgnu_a_SOURCES += lseek.c
-endif
-
-## end   gnulib module lseek
-
 ## begin gnulib module malloc-gnu
 
 
diff --git a/gl/af_alg.c b/gl/af_alg.c
deleted file mode 100644
index 084bff6..0000000
--- a/gl/af_alg.c
+++ /dev/null
@@ -1,213 +0,0 @@
-/* af_alg.c - Compute message digests from file streams and buffers.
-   Copyright (C) 2018-2022 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 Matteo Croce <mcroce at redhat.com>, 2018.  */
-
-#include <config.h>
-
-#include "af_alg.h"
-
-#if USE_LINUX_CRYPTO_API
-
-#include <unistd.h>
-#include <string.h>
-#include <stdio.h>
-#include <errno.h>
-#include <linux/if_alg.h>
-#include <sys/stat.h>
-#include <sys/sendfile.h>
-#include <sys/socket.h>
-
-#include "sys-limits.h"
-
-#define BLOCKSIZE 32768
-
-/* Return a newly created socket for ALG.
-   On error, return a negative error number.  */
-static int
-alg_socket (char const *alg)
-{
-  struct sockaddr_alg salg = {
-    .salg_family = AF_ALG,
-    .salg_type = "hash",
-  };
-  /* Copy alg into salg.salg_name, without calling strcpy nor strlen.  */
-  for (size_t i = 0; (salg.salg_name[i] = alg[i]) != '\0'; i++)
-    if (i == sizeof salg.salg_name - 1)
-      /* alg is too long.  */
-      return -EINVAL;
-
-  int cfd = socket (AF_ALG, SOCK_SEQPACKET | SOCK_CLOEXEC, 0);
-  if (cfd < 0)
-    return -EAFNOSUPPORT;
-  int ofd = (bind (cfd, (struct sockaddr *) &salg, sizeof salg) == 0
-             ? accept4 (cfd, NULL, 0, SOCK_CLOEXEC)
-             : -1);
-  close (cfd);
-  return ofd < 0 ? -EAFNOSUPPORT : ofd;
-}
-
-int
-afalg_buffer (const char *buffer, size_t len, const char *alg,
-              void *resblock, ssize_t hashlen)
-{
-  /* On Linux < 4.9, the value for an empty stream is wrong (all zeroes).
-     See <https://patchwork.kernel.org/patch/9308641/>.
-     This was not fixed properly until November 2016,
-     see <https://patchwork.kernel.org/patch/9434741/>.  */
-  if (len == 0)
-    return -EAFNOSUPPORT;
-
-  int ofd = alg_socket (alg);
-  if (ofd < 0)
-    return ofd;
-
-  int result;
-
-  for (;;)
-    {
-      ssize_t size = (len > BLOCKSIZE ? BLOCKSIZE : len);
-      if (send (ofd, buffer, size, MSG_MORE) != size)
-        {
-          result = -EAFNOSUPPORT;
-          break;
-        }
-      buffer += size;
-      len -= size;
-      if (len == 0)
-        {
-          result = read (ofd, resblock, hashlen) == hashlen ? 0 : -EAFNOSUPPORT;
-          break;
-        }
-    }
-
-  close (ofd);
-  return result;
-}
-
-int
-afalg_stream (FILE *stream, const char *alg,
-              void *resblock, ssize_t hashlen)
-{
-  int ofd = alg_socket (alg);
-  if (ofd < 0)
-    return ofd;
-
-  /* If STREAM's size is known and nonzero and not too large, attempt
-     sendfile to pipe the data.  The nonzero restriction avoids issues
-     with /proc files that pretend to be empty, and lets the classic
-     read-write loop work around an empty-input bug noted below.  */
-  int fd = fileno (stream);
-  int result;
-  struct stat st;
-  off_t off = ftello (stream);
-  if (0 <= off && fstat (fd, &st) == 0
-      && (S_ISREG (st.st_mode) || S_TYPEISSHM (&st) || S_TYPEISTMO (&st))
-      && off < st.st_size && st.st_size - off < SYS_BUFSIZE_MAX)
-    {
-      /* Make sure the offset of fileno (stream) reflects how many bytes
-         have been read from stream before this function got invoked.
-         Note: fflush on an input stream after ungetc does not work as expected
-         on some platforms.  Therefore this situation is not supported here.  */
-      if (fflush (stream))
-        result = -EIO;
-      else
-        {
-          off_t nbytes = st.st_size - off;
-          if (sendfile (ofd, fd, &off, nbytes) == nbytes)
-            {
-              if (read (ofd, resblock, hashlen) == hashlen)
-                {
-                  /* The input buffers of stream are no longer valid.  */
-                  if (lseek (fd, off, SEEK_SET) != (off_t)-1)
-                    result = 0;
-                  else
-                    /* The file position of fd has not changed.  */
-                    result = -EAFNOSUPPORT;
-                }
-              else
-                /* The file position of fd has not changed.  */
-                result = -EAFNOSUPPORT;
-            }
-          else
-            /* The file position of fd has not changed.  */
-            result = -EAFNOSUPPORT;
-       }
-    }
-  else
-    {
-      /* sendfile not possible, do a classic read-write loop.  */
-
-      /* Number of bytes to seek (backwards) in case of error.  */
-      off_t nseek = 0;
-
-      for (;;)
-        {
-          char buf[BLOCKSIZE];
-          /* When the stream is not seekable, start with a single-byte block,
-             so that we can use ungetc() in the case that send() fails.  */
-          size_t blocksize = (nseek == 0 && off < 0 ? 1 : BLOCKSIZE);
-          ssize_t size = fread (buf, 1, blocksize, stream);
-          if (size == 0)
-            {
-              /* On Linux < 4.9, the value for an empty stream is wrong (all 0).
-                 See <https://patchwork.kernel.org/patch/9308641/>.
-                 This was not fixed properly until November 2016,
-                 see <https://patchwork.kernel.org/patch/9434741/>.  */
-              result = ferror (stream) ? -EIO : nseek == 0 ? -EAFNOSUPPORT : 0;
-              break;
-            }
-          nseek -= size;
-          if (send (ofd, buf, size, MSG_MORE) != size)
-            {
-              if (nseek == -1)
-                {
-                  /* 1 byte of pushback buffer is guaranteed on stream, even
-                     if stream is not seekable.  */
-                  ungetc ((unsigned char) buf[0], stream);
-                  result = -EAFNOSUPPORT;
-                }
-              else if (fseeko (stream, nseek, SEEK_CUR) == 0)
-                /* The position of stream has been restored.  */
-                result = -EAFNOSUPPORT;
-              else
-                result = -EIO;
-              break;
-            }
-
-          /* Don't assume that EOF is sticky. See:
-             <https://sourceware.org/bugzilla/show_bug.cgi?id=19476>.  */
-          if (feof (stream))
-            {
-              result = 0;
-              break;
-            }
-        }
-
-      if (result == 0 && read (ofd, resblock, hashlen) != hashlen)
-        {
-          if (nseek == 0 || fseeko (stream, nseek, SEEK_CUR) == 0)
-            /* The position of stream has been restored.  */
-            result = -EAFNOSUPPORT;
-          else
-            result = -EIO;
-        }
-    }
-  close (ofd);
-  return result;
-}
-
-#endif
diff --git a/gl/af_alg.h b/gl/af_alg.h
deleted file mode 100644
index ddd6568..0000000
--- a/gl/af_alg.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/* af_alg.h - Compute message digests from file streams and buffers.
-   Copyright (C) 2018-2022 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 Matteo Croce <mcroce at redhat.com>, 2018.
-   Documentation by Bruno Haible <bruno at clisp.org>, 2018.  */
-
-/* Declare specific functions for computing message digests
-   using the Linux kernel crypto API, if available.  This kernel API gives
-   access to specialized crypto instructions (that would also be available
-   in user space) or to crypto devices (not directly available in user space).
-
-   For a more complete set of facilities that use the Linux kernel crypto API,
-   look at libkcapi.  */
-
-#ifndef AF_ALG_H
-# define AF_ALG_H 1
-
-# include <stdio.h>
-# include <errno.h>
-
-# ifdef __cplusplus
-extern "C" {
-# endif
-
-# if USE_LINUX_CRYPTO_API
-
-/* Compute a message digest of a memory region.
-
-   The memory region starts at BUFFER and is LEN bytes long.
-
-   ALG is the message digest algorithm; see the file /proc/crypto.
-
-   RESBLOCK points to a block of HASHLEN bytes, for the result.
-   HASHLEN must be the length of the message digest, in bytes, in particular:
-
-      alg    | hashlen
-      -------+--------
-      md5    | 16
-      sha1   | 20
-      sha224 | 28
-      sha256 | 32
-      sha384 | 48
-      sha512 | 64
-
-   If successful, fill RESBLOCK and return 0.
-   Upon failure, return a negated error number.  */
-int
-afalg_buffer (const char *buffer, size_t len, const char *alg,
-              void *resblock, ssize_t hashlen);
-
-/* Compute a message digest of data read from STREAM.
-
-   STREAM is an open file stream.  The last operation on STREAM should
-   not be 'ungetc', and if STREAM is also open for writing it should
-   have been fflushed since its last write.  Read from the current
-   position to the end of STREAM.  Handle regular files efficiently.
-
-   ALG is the message digest algorithm; see the file /proc/crypto.
-
-   RESBLOCK points to a block of HASHLEN bytes, for the result.
-   HASHLEN must be the length of the message digest, in bytes, in particular:
-
-      alg    | hashlen
-      -------+--------
-      md5    | 16
-      sha1   | 20
-      sha224 | 28
-      sha256 | 32
-      sha384 | 48
-      sha512 | 64
-
-   If successful, fill RESBLOCK and return 0.
-   Upon failure, return a negated error number.
-   Unless returning 0 or -EIO, restore STREAM's file position so that
-   the caller can fall back on some other method.  */
-int
-afalg_stream (FILE *stream, const char *alg,
-              void *resblock, ssize_t hashlen);
-
-# else
-
-static inline int
-afalg_buffer (const char *buffer, size_t len, const char *alg,
-              void *resblock, ssize_t hashlen)
-{
-  return -EAFNOSUPPORT;
-}
-
-static inline int
-afalg_stream (FILE *stream, const char *alg,
-              void *resblock, ssize_t hashlen)
-{
-  return -EAFNOSUPPORT;
-}
-
-# endif
-
-# ifdef __cplusplus
-}
-# endif
-
-#endif /* AF_ALG_H */
diff --git a/gl/byteswap.in.h b/gl/byteswap.in.h
deleted file mode 100644
index f4746d3..0000000
--- a/gl/byteswap.in.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* byteswap.h - Byte swapping
-   Copyright (C) 2005, 2007, 2009-2022 Free Software Foundation, Inc.
-   Written by Oskar Liljeblad <oskar at osk.mine.nu>, 2005.
-
-   This file is free software: you can redistribute it and/or modify
-   it under the terms of the GNU Lesser General 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_BYTESWAP_H
-#define _GL_BYTESWAP_H
-
-/* Given an unsigned 16-bit argument X, return the value corresponding to
-   X with reversed byte order.  */
-#define bswap_16(x) ((((x) & 0x00FF) << 8) | \
-                     (((x) & 0xFF00) >> 8))
-
-/* Given an unsigned 32-bit argument X, return the value corresponding to
-   X with reversed byte order.  */
-#define bswap_32(x) ((((x) & 0x000000FF) << 24) | \
-                     (((x) & 0x0000FF00) << 8) | \
-                     (((x) & 0x00FF0000) >> 8) | \
-                     (((x) & 0xFF000000) >> 24))
-
-/* Given an unsigned 64-bit argument X, return the value corresponding to
-   X with reversed byte order.  */
-#define bswap_64(x) ((((x) & 0x00000000000000FFULL) << 56) | \
-                     (((x) & 0x000000000000FF00ULL) << 40) | \
-                     (((x) & 0x0000000000FF0000ULL) << 24) | \
-                     (((x) & 0x00000000FF000000ULL) << 8) | \
-                     (((x) & 0x000000FF00000000ULL) >> 8) | \
-                     (((x) & 0x0000FF0000000000ULL) >> 24) | \
-                     (((x) & 0x00FF000000000000ULL) >> 40) | \
-                     (((x) & 0xFF00000000000000ULL) >> 56))
-
-#endif /* _GL_BYTESWAP_H */
diff --git a/gl/fflush.c b/gl/fflush.c
deleted file mode 100644
index 69511cd..0000000
--- a/gl/fflush.c
+++ /dev/null
@@ -1,233 +0,0 @@
-/* fflush.c -- allow flushing input streams
-   Copyright (C) 2007-2022 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 <stdio.h>
-
-#include <errno.h>
-#include <unistd.h>
-
-#include "freading.h"
-
-#include "stdio-impl.h"
-
-#undef fflush
-
-
-#if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
-/* GNU libc, BeOS, Haiku, Linux libc5 */
-
-/* Clear the stream's ungetc buffer, preserving the value of ftello (fp).  */
-static void
-clear_ungetc_buffer_preserving_position (FILE *fp)
-{
-  if (fp->_flags & _IO_IN_BACKUP)
-    /* _IO_free_backup_area is a bit complicated.  Simply call fseek.  */
-    fseeko (fp, 0, SEEK_CUR);
-}
-
-#else
-
-/* Clear the stream's ungetc buffer.  May modify the value of ftello (fp).  */
-static void
-clear_ungetc_buffer (FILE *fp)
-{
-# if defined __sferror || defined __DragonFly__ || defined __ANDROID__
-  /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
-  if (HASUB (fp))
-    {
-      fp_->_p += fp_->_r;
-      fp_->_r = 0;
-    }
-# elif defined __EMX__              /* emx+gcc */
-  if (fp->_ungetc_count > 0)
-    {
-      fp->_ungetc_count = 0;
-      fp->_rcount = - fp->_rcount;
-    }
-# elif defined _IOERR               /* Minix, AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, UnixWare, mingw, MSVC, NonStop Kernel, OpenVMS */
-  /* Nothing to do.  */
-# else                              /* other implementations */
-  fseeko (fp, 0, SEEK_CUR);
-# endif
-}
-
-#endif
-
-#if ! (defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1)
-/* GNU libc, BeOS, Haiku, Linux libc5 */
-
-# if (defined __sferror || defined __DragonFly__ || defined __ANDROID__) && defined __SNPT
-/* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
-
-static int
-disable_seek_optimization (FILE *fp)
-{
-  int saved_flags = fp_->_flags & (__SOPT | __SNPT);
-  fp_->_flags = (fp_->_flags & ~__SOPT) | __SNPT;
-  return saved_flags;
-}
-
-static void
-restore_seek_optimization (FILE *fp, int saved_flags)
-{
-  fp_->_flags = (fp_->_flags & ~(__SOPT | __SNPT)) | saved_flags;
-}
-
-# else
-
-static void
-update_fpos_cache (_GL_ATTRIBUTE_MAYBE_UNUSED FILE *fp,
-                   _GL_ATTRIBUTE_MAYBE_UNUSED off_t pos)
-{
-#  if defined __sferror || defined __DragonFly__ || defined __ANDROID__
-  /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
-#   if defined __CYGWIN__
-  /* fp_->_offset is typed as an integer.  */
-  fp_->_offset = pos;
-#   else
-  /* fp_->_offset is an fpos_t.  */
-  /* Use a union, since on NetBSD, the compilation flags determine
-     whether fpos_t is typedef'd to off_t or a struct containing a
-     single off_t member.  */
-  union
-    {
-      fpos_t f;
-      off_t o;
-    } u;
-  u.o = pos;
-  fp_->_offset = u.f;
-#   endif
-  fp_->_flags |= __SOFF;
-#  endif
-}
-# endif
-#endif
-
-/* Flush all pending data on STREAM according to POSIX rules.  Both
-   output and seekable input streams are supported.  */
-int
-rpl_fflush (FILE *stream)
-{
-  /* When stream is NULL, POSIX and C99 only require flushing of "output
-     streams and update streams in which the most recent operation was not
-     input", and all implementations do this.
-
-     When stream is "an output stream or an update stream in which the most
-     recent operation was not input", POSIX and C99 requires that fflush
-     writes out any buffered data, and all implementations do this.
-
-     When stream is, however, an input stream or an update stream in
-     which the most recent operation was input, C99 specifies nothing,
-     and POSIX only specifies behavior if the stream is seekable.
-     mingw, in particular, drops the input buffer, leaving the file
-     descriptor positioned at the end of the input buffer. I.e. ftell
-     (stream) is lost.  We don't want to call the implementation's
-     fflush in this case.
-
-     We test ! freading (stream) here, rather than fwriting (stream), because
-     what we need to know is whether the stream holds a "read buffer", and on
-     mingw this is indicated by _IOREAD, regardless of _IOWRT.  */
-  if (stream == NULL || ! freading (stream))
-    return fflush (stream);
-
-#if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
-  /* GNU libc, BeOS, Haiku, Linux libc5 */
-
-  clear_ungetc_buffer_preserving_position (stream);
-
-  return fflush (stream);
-
-#else
-  {
-    /* What POSIX says:
-       1) About the file-position indicator (-> fseeko, ftello):
-          The file position indicator is incremented by fgetc() and decremented
-          by ungetc():
-          <https://pubs.opengroup.org/onlinepubs/9699919799/functions/fgetc.html>
-            "... the fgetc() function shall ... advance the associated file
-             position indicator for the stream ..."
-          <https://pubs.opengroup.org/onlinepubs/9699919799/functions/ungetc.html>
-            "The file-position indicator is decremented by each successful
-             call to ungetc()..."
-       2) fflush discards bytes pushed back by ungetc:
-          <https://pubs.opengroup.org/onlinepubs/9699919799/functions/fflush.html>
-            "...any characters pushed back onto the stream by ungetc()
-             or ungetwc() that have not subsequently been read from the
-             stream shall be discarded..."
-          This implies implicitly: fflush does not change the file position
-          indicator.
-       3) Effects on the file descriptor, if the file descriptor is capable of
-          seeking:
-          <https://pubs.opengroup.org/onlinepubs/9699919799/functions/fflush.html>
-            "...the file offset of the underlying open file description shall
-             be set to the file position of the stream..."  */
-
-    /* POSIX does not specify fflush behavior for non-seekable input
-       streams.  Some implementations purge unread data, some return
-       EBADF, some do nothing.  */
-    off_t pos = ftello (stream);
-    if (pos == -1)
-      {
-        errno = EBADF;
-        return EOF;
-      }
-
-    /* Clear the ungetc buffer.  */
-    clear_ungetc_buffer (stream);
-
-    /* To get here, we must be flushing a seekable input stream, so the
-       semantics of fpurge are now appropriate to clear the buffer.  To
-       avoid losing data, the lseek is also necessary.  */
-    {
-      int result = fpurge (stream);
-      if (result != 0)
-        return result;
-    }
-
-# if (defined __sferror || defined __DragonFly__ || defined __ANDROID__) && defined __SNPT
-    /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
-
-    {
-      /* Disable seek optimization for the next fseeko call.  This tells the
-         following fseeko call to seek to the desired position directly, rather
-         than to seek to a block-aligned boundary.  */
-      int saved_flags = disable_seek_optimization (stream);
-      int result = fseeko (stream, pos, SEEK_SET);
-
-      restore_seek_optimization (stream, saved_flags);
-      return result;
-    }
-
-# else
-
-    pos = lseek (fileno (stream), pos, SEEK_SET);
-    if (pos == -1)
-      return EOF;
-    /* After a successful lseek, update the file descriptor's position cache
-       in the stream.  */
-    update_fpos_cache (stream, pos);
-
-    return 0;
-
-# endif
-  }
-#endif
-}
diff --git a/gl/fpurge.c b/gl/fpurge.c
deleted file mode 100644
index 21e3b86..0000000
--- a/gl/fpurge.c
+++ /dev/null
@@ -1,150 +0,0 @@
-/* Flushing buffers of a FILE stream.
-   Copyright (C) 2007-2022 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 <stdio.h>
-
-#if HAVE___FPURGE                   /* glibc >= 2.2, Haiku, Solaris >= 7, UnixWare >= 7.1.4.MP4, Cygwin >= 1.7.10, Android API >= 23, musl libc */
-# if HAVE_STDIO_EXT_H
-#  include <stdio_ext.h>
-# endif
-#endif
-#include <stdlib.h>
-
-#include "stdio-impl.h"
-
-int
-fpurge (FILE *fp)
-{
-#if HAVE___FPURGE                   /* glibc >= 2.2, Haiku, Solaris >= 7, UnixWare >= 7.1.4.MP4, Cygwin >= 1.7.10, Android API >= 23, musl libc */
-
-  __fpurge (fp);
-  /* The __fpurge function does not have a return value.  */
-  return 0;
-
-#elif HAVE_FPURGE                   /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin >= 1.7 */
-
-  /* Call the system's fpurge function.  */
-# undef fpurge
-# if !HAVE_DECL_FPURGE
-  extern int fpurge (FILE *);
-# endif
-  int result = fpurge (fp);
-# if defined __sferror || defined __DragonFly__ || defined __ANDROID__
-  /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
-  if (result == 0)
-    /* Correct the invariants that fpurge broke.
-       <stdio.h> on BSD systems says:
-         "The following always hold: if _flags & __SRD, _w is 0."
-       If this invariant is not fulfilled and the stream is read-write but
-       currently reading, subsequent putc or fputc calls will write directly
-       into the buffer, although they shouldn't be allowed to.  */
-    if ((fp_->_flags & __SRD) != 0)
-      fp_->_w = 0;
-# endif
-  return result;
-
-#else
-
-  /* Most systems provide FILE as a struct and the necessary bitmask in
-     <stdio.h>, because they need it for implementing getc() and putc() as
-     fast macros.  */
-# if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
-  /* GNU libc, BeOS, Haiku, Linux libc5 */
-  fp->_IO_read_end = fp->_IO_read_ptr;
-  fp->_IO_write_ptr = fp->_IO_write_base;
-  /* Avoid memory leak when there is an active ungetc buffer.  */
-  if (fp->_IO_save_base != NULL)
-    {
-      free (fp->_IO_save_base);
-      fp->_IO_save_base = NULL;
-    }
-  return 0;
-# elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
-  /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
-  fp_->_p = fp_->_bf._base;
-  fp_->_r = 0;
-  fp_->_w = ((fp_->_flags & (__SLBF | __SNBF | __SRD)) == 0 /* fully buffered and not currently reading? */
-             ? fp_->_bf._size
-             : 0);
-  /* Avoid memory leak when there is an active ungetc buffer.  */
-  if (fp_ub._base != NULL)
-    {
-      if (fp_ub._base != fp_->_ubuf)
-        free (fp_ub._base);
-      fp_ub._base = NULL;
-    }
-  return 0;
-# elif defined __EMX__              /* emx+gcc */
-  fp->_ptr = fp->_buffer;
-  fp->_rcount = 0;
-  fp->_wcount = 0;
-  fp->_ungetc_count = 0;
-  return 0;
-# elif defined __minix              /* Minix */
-  fp->_ptr = fp->_buf;
-  if (fp->_ptr != NULL)
-    fp->_count = 0;
-  return 0;
-# elif defined _IOERR               /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, UnixWare, mingw, MSVC, NonStop Kernel, OpenVMS */
-  fp_->_ptr = fp_->_base;
-  if (fp_->_ptr != NULL)
-    fp_->_cnt = 0;
-  return 0;
-# elif defined __UCLIBC__           /* uClibc */
-#  ifdef __STDIO_BUFFERS
-  if (fp->__modeflags & __FLAG_WRITING)
-    fp->__bufpos = fp->__bufstart;
-  else if (fp->__modeflags & (__FLAG_READONLY | __FLAG_READING))
-    fp->__bufpos = fp->__bufread;
-#  endif
-  return 0;
-# elif defined __QNX__              /* QNX */
-  fp->_Rback = fp->_Back + sizeof (fp->_Back);
-  fp->_Rsave = NULL;
-  if (fp->_Mode & 0x2000 /* _MWRITE */)
-    /* fp->_Buf <= fp->_Next <= fp->_Wend */
-    fp->_Next = fp->_Buf;
-  else
-    /* fp->_Buf <= fp->_Next <= fp->_Rend */
-    fp->_Rend = fp->_Next;
-  return 0;
-# elif defined __MINT__             /* Atari FreeMiNT */
-  if (fp->__pushed_back)
-    {
-      fp->__bufp = fp->__pushback_bufp;
-      fp->__pushed_back = 0;
-    }
-  /* Preserve the current file position.  */
-  if (fp->__target != -1)
-    fp->__target += fp->__bufp - fp->__buffer;
-  fp->__bufp = fp->__buffer;
-  /* Nothing in the buffer, next getc is nontrivial.  */
-  fp->__get_limit = fp->__bufp;
-  /* Nothing in the buffer, next putc is nontrivial.  */
-  fp->__put_limit = fp->__buffer;
-  return 0;
-# elif defined EPLAN9               /* Plan9 */
-  fp->rp = fp->wp = fp->lp = fp->buf;
-  return 0;
-# else
-#  error "Please port gnulib fpurge.c to your platform! Look at the definitions of fflush, setvbuf and ungetc on your system, then report this to bug-gnulib."
-# endif
-
-#endif
-}
diff --git a/gl/freading.c b/gl/freading.c
deleted file mode 100644
index 93e96e0..0000000
--- a/gl/freading.c
+++ /dev/null
@@ -1,76 +0,0 @@
-/* Retrieve information about a FILE stream.
-   Copyright (C) 2007-2022 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 "freading.h"
-
-#include "stdio-impl.h"
-
-/* Don't use glibc's __freading function in glibc < 2.7, see
-   <https://sourceware.org/bugzilla/show_bug.cgi?id=4359>  */
-#if !(HAVE___FREADING && (!defined __GLIBC__ || defined __UCLIBC__ || __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7)))
-
-bool
-freading (FILE *fp)
-{
-  /* Most systems provide FILE as a struct and the necessary bitmask in
-     <stdio.h>, because they need it for implementing getc() and putc() as
-     fast macros.  */
-# if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
-  /* GNU libc, BeOS, Haiku, Linux libc5 */
-  return ((fp->_flags & _IO_NO_WRITES) != 0
-          || ((fp->_flags & (_IO_NO_READS | _IO_CURRENTLY_PUTTING)) == 0
-              && fp->_IO_read_base != NULL));
-# elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
-  /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin < 1.7.34, Minix 3, Android */
-  return (fp_->_flags & __SRD) != 0;
-# elif defined __EMX__               /* emx+gcc */
-  return (fp->_flags & _IOREAD) != 0;
-# elif defined __minix               /* Minix */
-  return (fp->_flags & _IOREADING) != 0;
-# elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, UnixWare, mingw, MSVC, NonStop Kernel, OpenVMS */
-#  if defined __sun                  /* Solaris */
-  return (fp_->_flag & _IOREAD) != 0 && (fp_->_flag & _IOWRT) == 0;
-#  else
-  return (fp_->_flag & _IOREAD) != 0;
-#  endif
-# elif defined __UCLIBC__            /* uClibc */
-  return (fp->__modeflags & (__FLAG_READONLY | __FLAG_READING)) != 0;
-# elif defined __QNX__               /* QNX */
-  return ((fp->_Mode & 0x2 /* _MOPENW */) == 0
-          || (fp->_Mode & 0x1000 /* _MREAD */) != 0);
-# elif defined __MINT__              /* Atari FreeMiNT */
-  if (!fp->__mode.__write)
-    return 1;
-  if (!fp->__mode.__read)
-    return 0;
-#  ifdef _IO_CURRENTLY_GETTING /* Flag added on 2009-02-28 */
-  return (fp->__flags & _IO_CURRENTLY_GETTING) != 0;
-#  else
-  return (fp->__buffer < fp->__get_limit /*|| fp->__bufp == fp->__put_limit ??*/);
-#  endif
-# elif defined EPLAN9                /* Plan9 */
-  if (fp->state == 0 /* CLOSED */ || fp->state == 4 /* WR */)
-    return 0;
-  return (fp->state == 3 /* RD */ && (fp->bufl == 0 || fp->rp < fp->wp));
-# else
-#  error "Please port gnulib freading.c to your platform!"
-# endif
-}
-
-#endif
diff --git a/gl/freading.h b/gl/freading.h
deleted file mode 100644
index 74fed22..0000000
--- a/gl/freading.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* Retrieve information about a FILE stream.
-   Copyright (C) 2007-2022 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 <stdbool.h>
-#include <stdio.h>
-
-/* Return true if the stream STREAM is opened read-only, or if the
-   last operation on the stream was a read operation.  Return false if
-   the stream is opened write-only or append-only, or if it supports
-   writing and there is no current read operation (such as fgetc).
-
-   freading and fwriting will never both be true.  If STREAM supports
-   both reads and writes, then:
-     - both freading and fwriting might be false when the stream is first
-       opened, after read encounters EOF, or after fflush,
-     - freading might be false or true and fwriting might be false
-       after repositioning (such as fseek, fsetpos, or rewind),
-   depending on the underlying implementation.
-
-   STREAM must not be wide-character oriented.  */
-
-#if HAVE___FREADING && (!defined __GLIBC__ || defined __UCLIBC__ || __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7))
-/* Solaris >= 7, UnixWare >= 7.1.4.MP4, Cygwin >= 1.7.34, Android API >= 29, not glibc >= 2.2, but glibc >= 2.7, or musl libc  */
-
-# if HAVE_STDIO_EXT_H
-#  include <stdio_ext.h>
-# endif
-# define freading(stream) (__freading (stream) != 0)
-
-#else
-
-# ifdef __cplusplus
-extern "C" {
-# endif
-
-extern bool freading (FILE *stream) _GL_ATTRIBUTE_PURE;
-
-# ifdef __cplusplus
-}
-# endif
-
-#endif
diff --git a/gl/fseek.c b/gl/fseek.c
deleted file mode 100644
index e9f9314..0000000
--- a/gl/fseek.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/* An fseek() function that, together with fflush(), is POSIX compliant.
-   Copyright (C) 2007, 2009-2022 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 <stdio.h>
-
-/* Get off_t.  */
-#include <unistd.h>
-
-int
-fseek (FILE *fp, long offset, int whence)
-{
-  /* Use the replacement fseeko function with all its workarounds.  */
-  return fseeko (fp, (off_t)offset, whence);
-}
diff --git a/gl/fseeko.c b/gl/fseeko.c
deleted file mode 100644
index 2ca2db8..0000000
--- a/gl/fseeko.c
+++ /dev/null
@@ -1,164 +0,0 @@
-/* An fseeko() function that, together with fflush(), is POSIX compliant.
-   Copyright (C) 2007-2022 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 <stdio.h>
-
-/* Get off_t, lseek, _POSIX_VERSION.  */
-#include <unistd.h>
-
-#include "stdio-impl.h"
-
-int
-fseeko (FILE *fp, off_t offset, int whence)
-#undef fseeko
-#if !HAVE_FSEEKO
-# undef fseek
-# define fseeko fseek
-#endif
-#if _GL_WINDOWS_64_BIT_OFF_T
-# undef fseeko
-# if HAVE__FSEEKI64 && HAVE_DECL__FSEEKI64 /* msvc, mingw since msvcrt8.0, mingw64 */
-#  define fseeko _fseeki64
-# else /* mingw before msvcrt8.0 */
-#  define fseeko fseeko64
-# endif
-#endif
-{
-#if LSEEK_PIPE_BROKEN
-  /* mingw gives bogus answers rather than failure on non-seekable files.  */
-  if (lseek (fileno (fp), 0, SEEK_CUR) == -1)
-    return EOF;
-#endif
-
-  /* These tests are based on fpurge.c.  */
-#if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
-  /* GNU libc, BeOS, Haiku, Linux libc5 */
-  if (fp->_IO_read_end == fp->_IO_read_ptr
-      && fp->_IO_write_ptr == fp->_IO_write_base
-      && fp->_IO_save_base == NULL)
-#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
-  /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
-# if defined __SL64 && defined __SCLE /* Cygwin */
-  if ((fp->_flags & __SL64) == 0)
-    {
-      /* Cygwin 1.5.0 through 1.5.24 failed to open stdin in 64-bit
-         mode; but has an fseeko that requires 64-bit mode.  */
-      FILE *tmp = fopen ("/dev/null", "r");
-      if (!tmp)
-        return -1;
-      fp->_flags |= __SL64;
-      fp->_seek64 = tmp->_seek64;
-      fclose (tmp);
-    }
-# endif
-  if (fp_->_p == fp_->_bf._base
-      && fp_->_r == 0
-      && fp_->_w == ((fp_->_flags & (__SLBF | __SNBF | __SRD)) == 0 /* fully buffered and not currently reading? */
-                     ? fp_->_bf._size
-                     : 0)
-      && fp_ub._base == NULL)
-#elif defined __EMX__               /* emx+gcc */
-  if (fp->_ptr == fp->_buffer
-      && fp->_rcount == 0
-      && fp->_wcount == 0
-      && fp->_ungetc_count == 0)
-#elif defined __minix               /* Minix */
-  if (fp_->_ptr == fp_->_buf
-      && (fp_->_ptr == NULL || fp_->_count == 0))
-#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, UnixWare, mingw, MSVC, NonStop Kernel, OpenVMS */
-  if (fp_->_ptr == fp_->_base
-      && (fp_->_ptr == NULL || fp_->_cnt == 0))
-#elif defined __UCLIBC__            /* uClibc */
-  if (((fp->__modeflags & __FLAG_WRITING) == 0
-       || fp->__bufpos == fp->__bufstart)
-      && ((fp->__modeflags & (__FLAG_READONLY | __FLAG_READING)) == 0
-          || fp->__bufpos == fp->__bufread))
-#elif defined __QNX__               /* QNX */
-  if ((fp->_Mode & 0x2000 /* _MWRITE */ ? fp->_Next == fp->_Buf : fp->_Next == fp->_Rend)
-      && fp->_Rback == fp->_Back + sizeof (fp->_Back)
-      && fp->_Rsave == NULL)
-#elif defined __MINT__              /* Atari FreeMiNT */
-  if (fp->__bufp == fp->__buffer
-      && fp->__get_limit == fp->__bufp
-      && fp->__put_limit == fp->__bufp
-      && !fp->__pushed_back)
-#elif defined EPLAN9                /* Plan9 */
-  if (fp->rp == fp->buf
-      && fp->wp == fp->buf)
-#elif FUNC_FFLUSH_STDIN < 0 && 200809 <= _POSIX_VERSION
-  /* Cross-compiling to some other system advertising conformance to
-     POSIX.1-2008 or later.  Assume fseeko and fflush work as advertised.
-     If this assumption is incorrect, please report the bug to
-     bug-gnulib.  */
-  if (0)
-#else
-  #error "Please port gnulib fseeko.c to your platform! Look at the code in fseeko.c, then report this to bug-gnulib."
-#endif
-    {
-      /* We get here when an fflush() call immediately preceded this one (or
-         if ftell() has created buffers but no I/O has occurred on a
-         newly-opened stream).  We know there are no buffers.  */
-      off_t pos = lseek (fileno (fp), offset, whence);
-      if (pos == -1)
-        {
-#if defined __sferror || defined __DragonFly__ || defined __ANDROID__
-          /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
-          fp_->_flags &= ~__SOFF;
-#endif
-          return -1;
-        }
-
-#if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
-      /* GNU libc, BeOS, Haiku, Linux libc5 */
-      fp->_flags &= ~_IO_EOF_SEEN;
-      fp->_offset = pos;
-#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
-      /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
-# if defined __CYGWIN__ || (defined __NetBSD__ && __NetBSD_Version__ >= 600000000) || defined __minix
-      /* fp_->_offset is typed as an integer.  */
-      fp_->_offset = pos;
-# else
-      /* fp_->_offset is an fpos_t.  */
-      {
-        /* Use a union, since on NetBSD, the compilation flags
-           determine whether fpos_t is typedef'd to off_t or a struct
-           containing a single off_t member.  */
-        union
-          {
-            fpos_t f;
-            off_t o;
-          } u;
-        u.o = pos;
-        fp_->_offset = u.f;
-      }
-# endif
-      fp_->_flags |= __SOFF;
-      fp_->_flags &= ~__SEOF;
-#elif defined __EMX__               /* emx+gcc */
-      fp->_flags &= ~_IOEOF;
-#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, UnixWare, mingw, MSVC, NonStop Kernel, OpenVMS */
-      fp_->_flag &= ~_IOEOF;
-#elif defined __MINT__              /* Atari FreeMiNT */
-      fp->__offset = pos;
-      fp->__eof = 0;
-#endif
-      return 0;
-    }
-  return fseeko (fp, offset, whence);
-}
diff --git a/gl/ftell.c b/gl/ftell.c
deleted file mode 100644
index 3fbd9e9..0000000
--- a/gl/ftell.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* An ftell() function that works around platform bugs.
-   Copyright (C) 2007-2022 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 <stdio.h>
-
-#include <errno.h>
-#include <limits.h>
-
-long
-ftell (FILE *fp)
-{
-  /* Use the replacement ftello function with all its workarounds.  */
-  off_t offset = ftello (fp);
-  if (LONG_MIN <= offset && offset <= LONG_MAX)
-    return /* (long) */ offset;
-  else
-    {
-      errno = EOVERFLOW;
-      return -1;
-    }
-}
diff --git a/gl/ftello.c b/gl/ftello.c
deleted file mode 100644
index 989614a..0000000
--- a/gl/ftello.c
+++ /dev/null
@@ -1,157 +0,0 @@
-/* An ftello() function that works around platform bugs.
-   Copyright (C) 2007, 2009-2022 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 <stdio.h>
-
-#include <errno.h>
-#include "intprops.h"
-
-/* Get lseek.  */
-#include <unistd.h>
-
-#include "stdio-impl.h"
-
-off_t
-ftello (FILE *fp)
-#undef ftello
-#if !HAVE_FTELLO
-# undef ftell
-# define ftello ftell
-#endif
-#if _GL_WINDOWS_64_BIT_OFF_T
-# undef ftello
-# if HAVE__FTELLI64 /* msvc, mingw64 */
-#  define ftello _ftelli64
-# else /* mingw */
-#  define ftello ftello64
-# endif
-#endif
-{
-#if FTELLO_BROKEN_AFTER_UNGETC /* macOS >= 10.15 */
-  /* The system's ftello() is completely broken, because it calls __sflush,
-     which makes side effects on the stream.  */
-
-  /* Handle non-seekable files first.  */
-  if (fp->_file < 0 || fp->_seek == NULL)
-    {
-      errno = ESPIPE;
-      return -1;
-    }
-
-  /* Determine the current offset, ignoring buffered and pushed-back bytes.  */
-  off_t pos;
-
-  if (fp->_flags & __SOFF)
-    pos = fp->_offset;
-  else
-    {
-      pos = fp->_seek (fp->_cookie, 0, SEEK_CUR);
-      if (pos < 0)
-        return -1;
-      if (fp->_flags & __SOPT)
-        {
-          fp->_offset = pos;
-          fp->_flags |= __SOFF;
-        }
-    }
-
-  if (fp->_flags & __SRD)
-    {
-      /* Now consider buffered and pushed-back bytes from ungetc.  */
-      if (fp->_ub._base != NULL)
-        /* Considering the buffered bytes, we are at position
-             pos - fp->_ur.
-           Considering also the pushed-back bytes, we are at position
-             pos - fp->_ur - fp->_r.  */
-        pos = pos - fp->_ur - fp->_r;
-      else
-        /* Considering the buffered bytes, we are at position
-             pos - fp->_r.  */
-        pos = pos - fp->_r;
-      if (pos < 0)
-        {
-          errno = EIO;
-          return -1;
-        }
-    }
-  else if ((fp->_flags & __SWR) && fp->_p != NULL)
-    {
-      /* Consider the buffered bytes.  */
-      off_t buffered = fp->_p - fp->_bf._base;
-
-      /* Compute pos + buffered, with overflow check.  */
-      off_t sum;
-      if (! INT_ADD_OK (pos, buffered, &sum))
-        {
-          errno = EOVERFLOW;
-          return -1;
-        }
-      pos = sum;
-    }
-
-  return pos;
-
-#else
-
-# if LSEEK_PIPE_BROKEN
-  /* mingw gives bogus answers rather than failure on non-seekable files.  */
-  if (lseek (fileno (fp), 0, SEEK_CUR) == -1)
-    return -1;
-# endif
-
-# if FTELLO_BROKEN_AFTER_SWITCHING_FROM_READ_TO_WRITE /* Solaris */
-  /* The Solaris stdio leaves the _IOREAD flag set after reading from a file
-     reaches EOF and the program then starts writing to the file.  ftello
-     gets confused by this.  */
-  if (fp_->_flag & _IOWRT)
-    {
-      off_t pos;
-
-      /* Call ftello nevertheless, for the side effects that it does on fp.  */
-      ftello (fp);
-
-      /* Compute the file position ourselves.  */
-      pos = lseek (fileno (fp), (off_t) 0, SEEK_CUR);
-      if (pos >= 0)
-        {
-          if ((fp_->_flag & _IONBF) == 0 && fp_->_base != NULL)
-            pos += fp_->_ptr - fp_->_base;
-        }
-      return pos;
-    }
-# endif
-
-# if defined __SL64 && defined __SCLE /* Cygwin */
-  if ((fp->_flags & __SL64) == 0)
-    {
-      /* Cygwin 1.5.0 through 1.5.24 failed to open stdin in 64-bit
-         mode; but has an ftello that requires 64-bit mode.  */
-      FILE *tmp = fopen ("/dev/null", "r");
-      if (!tmp)
-        return -1;
-      fp->_flags |= __SL64;
-      fp->_seek64 = tmp->_seek64;
-      fclose (tmp);
-    }
-# endif
-
-  return ftello (fp);
-
-#endif
-}
diff --git a/gl/gl_openssl.h b/gl/gl_openssl.h
deleted file mode 100644
index 4c42ac8..0000000
--- a/gl/gl_openssl.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/* Wrap openssl crypto hash routines in gnulib interface.  -*- coding: utf-8 -*-
-
-   Copyright (C) 2013-2022 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 Pádraig Brady */
-
-#ifndef GL_OPENSSL_NAME
-# error "Please define GL_OPENSSL_NAME to 1,5,256 etc."
-#endif
-
-#ifndef _GL_INLINE_HEADER_BEGIN
-# error "Please include config.h first."
-#endif
-_GL_INLINE_HEADER_BEGIN
-#ifndef GL_OPENSSL_INLINE
-# define GL_OPENSSL_INLINE _GL_INLINE
-#endif
-
-/* Concatenate two preprocessor tokens.  */
-#define _GLCRYPTO_CONCAT_(prefix, suffix) prefix##suffix
-#define _GLCRYPTO_CONCAT(prefix, suffix) _GLCRYPTO_CONCAT_ (prefix, suffix)
-
-#if GL_OPENSSL_NAME == 5
-# define OPENSSL_ALG md5
-#else
-# define OPENSSL_ALG _GLCRYPTO_CONCAT (sha, GL_OPENSSL_NAME)
-#endif
-
-/* Context type mappings.  */
-#if BASE_OPENSSL_TYPE != GL_OPENSSL_NAME
-# undef BASE_OPENSSL_TYPE
-# if GL_OPENSSL_NAME == 224
-#  define BASE_OPENSSL_TYPE 256
-# elif GL_OPENSSL_NAME == 384
-#  define BASE_OPENSSL_TYPE 512
-# endif
-# define md5_CTX MD5_CTX
-# define sha1_CTX SHA_CTX
-# define sha224_CTX SHA256_CTX
-# define sha224_ctx sha256_ctx
-# define sha256_CTX SHA256_CTX
-# define sha384_CTX SHA512_CTX
-# define sha384_ctx sha512_ctx
-# define sha512_CTX SHA512_CTX
-# undef _gl_CTX
-# undef _gl_ctx
-# define _gl_CTX _GLCRYPTO_CONCAT (OPENSSL_ALG, _CTX) /* openssl type.  */
-# define _gl_ctx _GLCRYPTO_CONCAT (OPENSSL_ALG, _ctx) /* gnulib type.  */
-
-struct _gl_ctx { _gl_CTX CTX; };
-#endif
-
-/* Function name mappings.  */
-#define md5_prefix MD5
-#define sha1_prefix SHA1
-#define sha224_prefix SHA224
-#define sha256_prefix SHA256
-#define sha384_prefix SHA384
-#define sha512_prefix SHA512
-#define _GLCRYPTO_PREFIX _GLCRYPTO_CONCAT (OPENSSL_ALG, _prefix)
-#define OPENSSL_FN(suffix) _GLCRYPTO_CONCAT (_GLCRYPTO_PREFIX, suffix)
-#define GL_CRYPTO_FN(suffix) _GLCRYPTO_CONCAT (OPENSSL_ALG, suffix)
-
-GL_OPENSSL_INLINE void
-GL_CRYPTO_FN (_init_ctx) (struct _gl_ctx *ctx)
-{ (void) OPENSSL_FN (_Init) ((_gl_CTX *) ctx); }
-
-/* These were never exposed by gnulib.  */
-#if ! (GL_OPENSSL_NAME == 224 || GL_OPENSSL_NAME == 384)
-GL_OPENSSL_INLINE void
-GL_CRYPTO_FN (_process_bytes) (const void *buf, size_t len, struct _gl_ctx *ctx)
-{ OPENSSL_FN (_Update) ((_gl_CTX *) ctx, buf, len); }
-
-GL_OPENSSL_INLINE void
-GL_CRYPTO_FN (_process_block) (const void *buf, size_t len, struct _gl_ctx *ctx)
-{ GL_CRYPTO_FN (_process_bytes) (buf, len, ctx); }
-#endif
-
-GL_OPENSSL_INLINE void *
-GL_CRYPTO_FN (_finish_ctx) (struct _gl_ctx *ctx, void *restrict res)
-{ OPENSSL_FN (_Final) ((unsigned char *) res, (_gl_CTX *) ctx); return res; }
-
-GL_OPENSSL_INLINE void *
-GL_CRYPTO_FN (_buffer) (const char *buf, size_t len, void *restrict res)
-{ return OPENSSL_FN () ((const unsigned char *) buf, len, (unsigned char *) res); }
-
-GL_OPENSSL_INLINE void *
-GL_CRYPTO_FN (_read_ctx) (const struct _gl_ctx *ctx, void *restrict res)
-{
-  /* Assume any unprocessed bytes in ctx are not to be ignored.  */
-  _gl_CTX tmp_ctx = *(_gl_CTX *) ctx;
-  OPENSSL_FN (_Final) ((unsigned char *) res, &tmp_ctx);
-  return res;
-}
-
-/* Undef so we can include multiple times.  */
-#undef GL_CRYPTO_FN
-#undef OPENSSL_FN
-#undef _GLCRYPTO_PREFIX
-#undef OPENSSL_ALG
-#undef GL_OPENSSL_NAME
-
-_GL_INLINE_HEADER_END
diff --git a/gl/inttypes.h b/gl/inttypes.h
new file mode 100644
index 0000000..445a599
--- /dev/null
+++ b/gl/inttypes.h
@@ -0,0 +1,1509 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Copyright (C) 2006-2022 Free Software Foundation, Inc.
+   Written by Paul Eggert, Bruno Haible, Derek Price.
+   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/>.  */
+
+/*
+ * ISO C 99 <inttypes.h> for platforms that lack it.
+ * <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/inttypes.h.html>
+ */
+
+#if __GNUC__ >= 3
+#pragma GCC system_header
+#endif
+
+
+/* Include the original <inttypes.h> if it exists, and if this file
+   has not been included yet or if this file includes gnulib stdint.h
+   which in turn includes this file.
+   The include_next requires a split double-inclusion guard.  */
+#if ! defined INTTYPES_H || defined _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
+# if 1
+
+   /* Some pre-C++11 <stdint.h> implementations need this.  */
+#  if defined __cplusplus && ! defined __STDC_FORMAT_MACROS
+#   define __STDC_FORMAT_MACROS 1
+#  endif
+
+#  include_next <inttypes.h>
+
+#  define _GL_FINISHED_INCLUDING_SYSTEM_INTTYPES_H
+# endif
+#endif
+
+#if ! defined INTTYPES_H && ! defined _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
+#define INTTYPES_H
+
+/* Include <stdint.h> or the gnulib replacement.
+   But avoid namespace pollution on glibc systems.  */
+#ifndef __GLIBC__
+# include <stdint.h>
+#endif
+/* Get CHAR_BIT, INT_MAX, LONG_MAX, etc.  */
+#include <limits.h>
+/* On mingw, __USE_MINGW_ANSI_STDIO only works if <stdio.h> is also included */
+#if defined _WIN32 && ! defined __CYGWIN__
+# include <stdio.h>
+#endif
+
+#if !(INT_MAX == 0x7fffffff && INT_MIN + INT_MAX == -1)
+# error "This file assumes that 'int' is 32-bit two's complement. Please report your platform and compiler to <bug-gnulib at gnu.org>."
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
+/* C++ compatible function declaration macros.
+   Copyright (C) 2010-2022 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-2022 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-2022 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) \
+_GL_WARN_EXTERN_C __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) \
+_GL_WARN_EXTERN_C __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) \
+_GL_WARN_EXTERN_C __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
+
+/* 7.8.1 Macros for format specifiers */
+
+#if defined _TNS_R_TARGET
+   /* Tandem NonStop R series and compatible platforms released before
+      July 2005 support %Ld but not %lld.  */
+# define _LONG_LONG_FORMAT_PREFIX "L"
+#else
+# define _LONG_LONG_FORMAT_PREFIX "ll"
+#endif
+
+#if !defined PRId8
+# ifdef INT8_MAX
+#  define PRId8 "d"
+# endif
+#endif
+#if !defined PRIi8
+# ifdef INT8_MAX
+#  define PRIi8 "i"
+# endif
+#endif
+#if !defined PRIo8
+# ifdef UINT8_MAX
+#  define PRIo8 "o"
+# endif
+#endif
+#if !defined PRIu8
+# ifdef UINT8_MAX
+#  define PRIu8 "u"
+# endif
+#endif
+#if !defined PRIx8
+# ifdef UINT8_MAX
+#  define PRIx8 "x"
+# endif
+#endif
+#if !defined PRIX8
+# ifdef UINT8_MAX
+#  define PRIX8 "X"
+# endif
+#endif
+#if !defined PRId16
+# ifdef INT16_MAX
+#  define PRId16 "d"
+# endif
+#endif
+#if !defined PRIi16
+# ifdef INT16_MAX
+#  define PRIi16 "i"
+# endif
+#endif
+#if !defined PRIo16
+# ifdef UINT16_MAX
+#  define PRIo16 "o"
+# endif
+#endif
+#if !defined PRIu16
+# ifdef UINT16_MAX
+#  define PRIu16 "u"
+# endif
+#endif
+#if !defined PRIx16
+# ifdef UINT16_MAX
+#  define PRIx16 "x"
+# endif
+#endif
+#if !defined PRIX16
+# ifdef UINT16_MAX
+#  define PRIX16 "X"
+# endif
+#endif
+#if !defined PRId32
+# ifdef INT32_MAX
+#  define PRId32 "d"
+# endif
+#endif
+#if !defined PRIi32
+# ifdef INT32_MAX
+#  define PRIi32 "i"
+# endif
+#endif
+#if !defined PRIo32
+# ifdef UINT32_MAX
+#  define PRIo32 "o"
+# endif
+#endif
+#if !defined PRIu32
+# ifdef UINT32_MAX
+#  define PRIu32 "u"
+# endif
+#endif
+#if !defined PRIx32
+# ifdef UINT32_MAX
+#  define PRIx32 "x"
+# endif
+#endif
+#if !defined PRIX32
+# ifdef UINT32_MAX
+#  define PRIX32 "X"
+# endif
+#endif
+#ifdef INT64_MAX
+# if (0 ? defined _LP64 : defined _LP64)
+#  define _PRI64_PREFIX "l"
+# elif defined _MSC_VER || defined __MINGW32__
+#  define _PRI64_PREFIX "I64"
+# elif LONG_MAX >> 30 == 1
+#  define _PRI64_PREFIX _LONG_LONG_FORMAT_PREFIX
+# endif
+# if !defined PRId64
+#  define PRId64 _PRI64_PREFIX "d"
+# endif
+# if !defined PRIi64
+#  define PRIi64 _PRI64_PREFIX "i"
+# endif
+#endif
+#ifdef UINT64_MAX
+# if (0 ? defined _LP64 : defined _LP64)
+#  define _PRIu64_PREFIX "l"
+# elif defined _MSC_VER || defined __MINGW32__
+#  define _PRIu64_PREFIX "I64"
+# elif ULONG_MAX >> 31 == 1
+#  define _PRIu64_PREFIX _LONG_LONG_FORMAT_PREFIX
+# endif
+# if !defined PRIo64
+#  define PRIo64 _PRIu64_PREFIX "o"
+# endif
+# if !defined PRIu64
+#  define PRIu64 _PRIu64_PREFIX "u"
+# endif
+# if !defined PRIx64
+#  define PRIx64 _PRIu64_PREFIX "x"
+# endif
+# if !defined PRIX64
+#  define PRIX64 _PRIu64_PREFIX "X"
+# endif
+#endif
+
+#if !defined PRIdLEAST8
+# define PRIdLEAST8 "d"
+#endif
+#if !defined PRIiLEAST8
+# define PRIiLEAST8 "i"
+#endif
+#if !defined PRIoLEAST8
+# define PRIoLEAST8 "o"
+#endif
+#if !defined PRIuLEAST8
+# define PRIuLEAST8 "u"
+#endif
+#if !defined PRIxLEAST8
+# define PRIxLEAST8 "x"
+#endif
+#if !defined PRIXLEAST8
+# define PRIXLEAST8 "X"
+#endif
+#if !defined PRIdLEAST16
+# define PRIdLEAST16 "d"
+#endif
+#if !defined PRIiLEAST16
+# define PRIiLEAST16 "i"
+#endif
+#if !defined PRIoLEAST16
+# define PRIoLEAST16 "o"
+#endif
+#if !defined PRIuLEAST16
+# define PRIuLEAST16 "u"
+#endif
+#if !defined PRIxLEAST16
+# define PRIxLEAST16 "x"
+#endif
+#if !defined PRIXLEAST16
+# define PRIXLEAST16 "X"
+#endif
+#if !defined PRIdLEAST32
+# define PRIdLEAST32 "d"
+#endif
+#if !defined PRIiLEAST32
+# define PRIiLEAST32 "i"
+#endif
+#if !defined PRIoLEAST32
+# define PRIoLEAST32 "o"
+#endif
+#if !defined PRIuLEAST32
+# define PRIuLEAST32 "u"
+#endif
+#if !defined PRIxLEAST32
+# define PRIxLEAST32 "x"
+#endif
+#if !defined PRIXLEAST32
+# define PRIXLEAST32 "X"
+#endif
+#ifdef INT64_MAX
+# if !defined PRIdLEAST64
+#  define PRIdLEAST64 PRId64
+# endif
+# if !defined PRIiLEAST64
+#  define PRIiLEAST64 PRIi64
+# endif
+#endif
+#ifdef UINT64_MAX
+# if !defined PRIoLEAST64
+#  define PRIoLEAST64 PRIo64
+# endif
+# if !defined PRIuLEAST64
+#  define PRIuLEAST64 PRIu64
+# endif
+# if !defined PRIxLEAST64
+#  define PRIxLEAST64 PRIx64
+# endif
+# if !defined PRIXLEAST64
+#  define PRIXLEAST64 PRIX64
+# endif
+#endif
+
+#if !defined PRIdFAST8
+# if INT_FAST8_MAX > INT32_MAX
+#  define PRIdFAST8 PRId64
+# else
+#  define PRIdFAST8 "d"
+# endif
+#endif
+#if !defined PRIiFAST8
+# if INT_FAST8_MAX > INT32_MAX
+#  define PRIiFAST8 PRIi64
+# else
+#  define PRIiFAST8 "i"
+# endif
+#endif
+#if !defined PRIoFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+#  define PRIoFAST8 PRIo64
+# else
+#  define PRIoFAST8 "o"
+# endif
+#endif
+#if !defined PRIuFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+#  define PRIuFAST8 PRIu64
+# else
+#  define PRIuFAST8 "u"
+# endif
+#endif
+#if !defined PRIxFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+#  define PRIxFAST8 PRIx64
+# else
+#  define PRIxFAST8 "x"
+# endif
+#endif
+#if !defined PRIXFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+#  define PRIXFAST8 PRIX64
+# else
+#  define PRIXFAST8 "X"
+# endif
+#endif
+#if !defined PRIdFAST16
+# if INT_FAST16_MAX > INT32_MAX
+#  define PRIdFAST16 PRId64
+# else
+#  define PRIdFAST16 "d"
+# endif
+#endif
+#if !defined PRIiFAST16
+# if INT_FAST16_MAX > INT32_MAX
+#  define PRIiFAST16 PRIi64
+# else
+#  define PRIiFAST16 "i"
+# endif
+#endif
+#if !defined PRIoFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+#  define PRIoFAST16 PRIo64
+# else
+#  define PRIoFAST16 "o"
+# endif
+#endif
+#if !defined PRIuFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+#  define PRIuFAST16 PRIu64
+# else
+#  define PRIuFAST16 "u"
+# endif
+#endif
+#if !defined PRIxFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+#  define PRIxFAST16 PRIx64
+# else
+#  define PRIxFAST16 "x"
+# endif
+#endif
+#if !defined PRIXFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+#  define PRIXFAST16 PRIX64
+# else
+#  define PRIXFAST16 "X"
+# endif
+#endif
+#if !defined PRIdFAST32
+# if INT_FAST32_MAX > INT32_MAX
+#  define PRIdFAST32 PRId64
+# else
+#  define PRIdFAST32 "d"
+# endif
+#endif
+#if !defined PRIiFAST32
+# if INT_FAST32_MAX > INT32_MAX
+#  define PRIiFAST32 PRIi64
+# else
+#  define PRIiFAST32 "i"
+# endif
+#endif
+#if !defined PRIoFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+#  define PRIoFAST32 PRIo64
+# else
+#  define PRIoFAST32 "o"
+# endif
+#endif
+#if !defined PRIuFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+#  define PRIuFAST32 PRIu64
+# else
+#  define PRIuFAST32 "u"
+# endif
+#endif
+#if !defined PRIxFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+#  define PRIxFAST32 PRIx64
+# else
+#  define PRIxFAST32 "x"
+# endif
+#endif
+#if !defined PRIXFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+#  define PRIXFAST32 PRIX64
+# else
+#  define PRIXFAST32 "X"
+# endif
+#endif
+#ifdef INT64_MAX
+# if !defined PRIdFAST64
+#  define PRIdFAST64 PRId64
+# endif
+# if !defined PRIiFAST64
+#  define PRIiFAST64 PRIi64
+# endif
+#endif
+#ifdef UINT64_MAX
+# if !defined PRIoFAST64
+#  define PRIoFAST64 PRIo64
+# endif
+# if !defined PRIuFAST64
+#  define PRIuFAST64 PRIu64
+# endif
+# if !defined PRIxFAST64
+#  define PRIxFAST64 PRIx64
+# endif
+# if !defined PRIXFAST64
+#  define PRIXFAST64 PRIX64
+# endif
+#endif
+
+#if !defined PRIdMAX
+# if 1
+#  define PRIdMAX PRId64
+# else
+#  define PRIdMAX "ld"
+# endif
+#endif
+#if !defined PRIiMAX
+# if 1
+#  define PRIiMAX PRIi64
+# else
+#  define PRIiMAX "li"
+# endif
+#endif
+#if !defined PRIoMAX
+# if 1
+#  define PRIoMAX PRIo64
+# else
+#  define PRIoMAX "lo"
+# endif
+#endif
+#if !defined PRIuMAX
+# if 1
+#  define PRIuMAX PRIu64
+# else
+#  define PRIuMAX "lu"
+# endif
+#endif
+#if !defined PRIxMAX
+# if 1
+#  define PRIxMAX PRIx64
+# else
+#  define PRIxMAX "lx"
+# endif
+#endif
+#if !defined PRIXMAX
+# if 1
+#  define PRIXMAX PRIX64
+# else
+#  define PRIXMAX "lX"
+# endif
+#endif
+
+#if !defined PRIdPTR
+# ifdef INTPTR_MAX
+#  define PRIdPTR __PRIPTR_PREFIX "d"
+# endif
+#endif
+#if !defined PRIiPTR
+# ifdef INTPTR_MAX
+#  define PRIiPTR __PRIPTR_PREFIX "i"
+# endif
+#endif
+#if !defined PRIoPTR
+# ifdef UINTPTR_MAX
+#  define PRIoPTR __PRIPTR_PREFIX "o"
+# endif
+#endif
+#if !defined PRIuPTR
+# ifdef UINTPTR_MAX
+#  define PRIuPTR __PRIPTR_PREFIX "u"
+# endif
+#endif
+#if !defined PRIxPTR
+# ifdef UINTPTR_MAX
+#  define PRIxPTR __PRIPTR_PREFIX "x"
+# endif
+#endif
+#if !defined PRIXPTR
+# ifdef UINTPTR_MAX
+#  define PRIXPTR __PRIPTR_PREFIX "X"
+# endif
+#endif
+
+#if !defined SCNd8
+# ifdef INT8_MAX
+#  define SCNd8 "hhd"
+# endif
+#endif
+#if !defined SCNi8
+# ifdef INT8_MAX
+#  define SCNi8 "hhi"
+# endif
+#endif
+#if !defined SCNo8
+# ifdef UINT8_MAX
+#  define SCNo8 "hho"
+# endif
+#endif
+#if !defined SCNu8
+# ifdef UINT8_MAX
+#  define SCNu8 "hhu"
+# endif
+#endif
+#if !defined SCNx8
+# ifdef UINT8_MAX
+#  define SCNx8 "hhx"
+# endif
+#endif
+#if !defined SCNd16
+# ifdef INT16_MAX
+#  define SCNd16 "hd"
+# endif
+#endif
+#if !defined SCNi16
+# ifdef INT16_MAX
+#  define SCNi16 "hi"
+# endif
+#endif
+#if !defined SCNo16
+# ifdef UINT16_MAX
+#  define SCNo16 "ho"
+# endif
+#endif
+#if !defined SCNu16
+# ifdef UINT16_MAX
+#  define SCNu16 "hu"
+# endif
+#endif
+#if !defined SCNx16
+# ifdef UINT16_MAX
+#  define SCNx16 "hx"
+# endif
+#endif
+#if !defined SCNd32
+# ifdef INT32_MAX
+#  define SCNd32 "d"
+# endif
+#endif
+#if !defined SCNi32
+# ifdef INT32_MAX
+#  define SCNi32 "i"
+# endif
+#endif
+#if !defined SCNo32
+# ifdef UINT32_MAX
+#  define SCNo32 "o"
+# endif
+#endif
+#if !defined SCNu32
+# ifdef UINT32_MAX
+#  define SCNu32 "u"
+# endif
+#endif
+#if !defined SCNx32
+# ifdef UINT32_MAX
+#  define SCNx32 "x"
+# endif
+#endif
+#ifdef INT64_MAX
+# if (0 ? defined _LP64 : defined _LP64)
+#  define _SCN64_PREFIX "l"
+# elif defined _MSC_VER || defined __MINGW32__
+#  define _SCN64_PREFIX "I64"
+# elif LONG_MAX >> 30 == 1
+#  define _SCN64_PREFIX _LONG_LONG_FORMAT_PREFIX
+# endif
+# if !defined SCNd64
+#  define SCNd64 _SCN64_PREFIX "d"
+# endif
+# if !defined SCNi64
+#  define SCNi64 _SCN64_PREFIX "i"
+# endif
+#endif
+#ifdef UINT64_MAX
+# if (0 ? defined _LP64 : defined _LP64)
+#  define _SCNu64_PREFIX "l"
+# elif defined _MSC_VER || defined __MINGW32__
+#  define _SCNu64_PREFIX "I64"
+# elif ULONG_MAX >> 31 == 1
+#  define _SCNu64_PREFIX _LONG_LONG_FORMAT_PREFIX
+# endif
+# if !defined SCNo64
+#  define SCNo64 _SCNu64_PREFIX "o"
+# endif
+# if !defined SCNu64
+#  define SCNu64 _SCNu64_PREFIX "u"
+# endif
+# if !defined SCNx64
+#  define SCNx64 _SCNu64_PREFIX "x"
+# endif
+#endif
+
+#if !defined SCNdLEAST8
+# define SCNdLEAST8 "hhd"
+#endif
+#if !defined SCNiLEAST8
+# define SCNiLEAST8 "hhi"
+#endif
+#if !defined SCNoLEAST8
+# define SCNoLEAST8 "hho"
+#endif
+#if !defined SCNuLEAST8
+# define SCNuLEAST8 "hhu"
+#endif
+#if !defined SCNxLEAST8
+# define SCNxLEAST8 "hhx"
+#endif
+#if !defined SCNdLEAST16
+# define SCNdLEAST16 "hd"
+#endif
+#if !defined SCNiLEAST16
+# define SCNiLEAST16 "hi"
+#endif
+#if !defined SCNoLEAST16
+# define SCNoLEAST16 "ho"
+#endif
+#if !defined SCNuLEAST16
+# define SCNuLEAST16 "hu"
+#endif
+#if !defined SCNxLEAST16
+# define SCNxLEAST16 "hx"
+#endif
+#if !defined SCNdLEAST32
+# define SCNdLEAST32 "d"
+#endif
+#if !defined SCNiLEAST32
+# define SCNiLEAST32 "i"
+#endif
+#if !defined SCNoLEAST32
+# define SCNoLEAST32 "o"
+#endif
+#if !defined SCNuLEAST32
+# define SCNuLEAST32 "u"
+#endif
+#if !defined SCNxLEAST32
+# define SCNxLEAST32 "x"
+#endif
+#ifdef INT64_MAX
+# if !defined SCNdLEAST64
+#  define SCNdLEAST64 SCNd64
+# endif
+# if !defined SCNiLEAST64
+#  define SCNiLEAST64 SCNi64
+# endif
+#endif
+#ifdef UINT64_MAX
+# if !defined SCNoLEAST64
+#  define SCNoLEAST64 SCNo64
+# endif
+# if !defined SCNuLEAST64
+#  define SCNuLEAST64 SCNu64
+# endif
+# if !defined SCNxLEAST64
+#  define SCNxLEAST64 SCNx64
+# endif
+#endif
+
+#if !defined SCNdFAST8
+# if INT_FAST8_MAX > INT32_MAX
+#  define SCNdFAST8 SCNd64
+# elif INT_FAST8_MAX == 0x7fff
+#  define SCNdFAST8 "hd"
+# elif INT_FAST8_MAX == 0x7f
+#  define SCNdFAST8 "hhd"
+# else
+#  define SCNdFAST8 "d"
+# endif
+#endif
+#if !defined SCNiFAST8
+# if INT_FAST8_MAX > INT32_MAX
+#  define SCNiFAST8 SCNi64
+# elif INT_FAST8_MAX == 0x7fff
+#  define SCNiFAST8 "hi"
+# elif INT_FAST8_MAX == 0x7f
+#  define SCNiFAST8 "hhi"
+# else
+#  define SCNiFAST8 "i"
+# endif
+#endif
+#if !defined SCNoFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+#  define SCNoFAST8 SCNo64
+# elif UINT_FAST8_MAX == 0xffff
+#  define SCNoFAST8 "ho"
+# elif UINT_FAST8_MAX == 0xff
+#  define SCNoFAST8 "hho"
+# else
+#  define SCNoFAST8 "o"
+# endif
+#endif
+#if !defined SCNuFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+#  define SCNuFAST8 SCNu64
+# elif UINT_FAST8_MAX == 0xffff
+#  define SCNuFAST8 "hu"
+# elif UINT_FAST8_MAX == 0xff
+#  define SCNuFAST8 "hhu"
+# else
+#  define SCNuFAST8 "u"
+# endif
+#endif
+#if !defined SCNxFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+#  define SCNxFAST8 SCNx64
+# elif UINT_FAST8_MAX == 0xffff
+#  define SCNxFAST8 "hx"
+# elif UINT_FAST8_MAX == 0xff
+#  define SCNxFAST8 "hhx"
+# else
+#  define SCNxFAST8 "x"
+# endif
+#endif
+#if !defined SCNdFAST16
+# if INT_FAST16_MAX > INT32_MAX
+#  define SCNdFAST16 SCNd64
+# elif INT_FAST16_MAX == 0x7fff
+#  define SCNdFAST16 "hd"
+# else
+#  define SCNdFAST16 "d"
+# endif
+#endif
+#if !defined SCNiFAST16
+# if INT_FAST16_MAX > INT32_MAX
+#  define SCNiFAST16 SCNi64
+# elif INT_FAST16_MAX == 0x7fff
+#  define SCNiFAST16 "hi"
+# else
+#  define SCNiFAST16 "i"
+# endif
+#endif
+#if !defined SCNoFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+#  define SCNoFAST16 SCNo64
+# elif UINT_FAST16_MAX == 0xffff
+#  define SCNoFAST16 "ho"
+# else
+#  define SCNoFAST16 "o"
+# endif
+#endif
+#if !defined SCNuFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+#  define SCNuFAST16 SCNu64
+# elif UINT_FAST16_MAX == 0xffff
+#  define SCNuFAST16 "hu"
+# else
+#  define SCNuFAST16 "u"
+# endif
+#endif
+#if !defined SCNxFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+#  define SCNxFAST16 SCNx64
+# elif UINT_FAST16_MAX == 0xffff
+#  define SCNxFAST16 "hx"
+# else
+#  define SCNxFAST16 "x"
+# endif
+#endif
+#if !defined SCNdFAST32
+# if INT_FAST32_MAX > INT32_MAX
+#  define SCNdFAST32 SCNd64
+# else
+#  define SCNdFAST32 "d"
+# endif
+#endif
+#if !defined SCNiFAST32
+# if INT_FAST32_MAX > INT32_MAX
+#  define SCNiFAST32 SCNi64
+# else
+#  define SCNiFAST32 "i"
+# endif
+#endif
+#if !defined SCNoFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+#  define SCNoFAST32 SCNo64
+# else
+#  define SCNoFAST32 "o"
+# endif
+#endif
+#if !defined SCNuFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+#  define SCNuFAST32 SCNu64
+# else
+#  define SCNuFAST32 "u"
+# endif
+#endif
+#if !defined SCNxFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+#  define SCNxFAST32 SCNx64
+# else
+#  define SCNxFAST32 "x"
+# endif
+#endif
+#ifdef INT64_MAX
+# if !defined SCNdFAST64
+#  define SCNdFAST64 SCNd64
+# endif
+# if !defined SCNiFAST64
+#  define SCNiFAST64 SCNi64
+# endif
+#endif
+#ifdef UINT64_MAX
+# if !defined SCNoFAST64
+#  define SCNoFAST64 SCNo64
+# endif
+# if !defined SCNuFAST64
+#  define SCNuFAST64 SCNu64
+# endif
+# if !defined SCNxFAST64
+#  define SCNxFAST64 SCNx64
+# endif
+#endif
+
+#if !defined SCNdMAX
+# if 1
+#  define SCNdMAX SCNd64
+# else
+#  define SCNdMAX "ld"
+# endif
+#endif
+#if !defined SCNiMAX
+# if 1
+#  define SCNiMAX SCNi64
+# else
+#  define SCNiMAX "li"
+# endif
+#endif
+#if !defined SCNoMAX
+# if 1
+#  define SCNoMAX SCNo64
+# else
+#  define SCNoMAX "lo"
+# endif
+#endif
+#if !defined SCNuMAX
+# if 1
+#  define SCNuMAX SCNu64
+# else
+#  define SCNuMAX "lu"
+# endif
+#endif
+#if !defined SCNxMAX
+# if 1
+#  define SCNxMAX SCNx64
+# else
+#  define SCNxMAX "lx"
+# endif
+#endif
+
+#if !defined SCNdPTR
+# ifdef INTPTR_MAX
+#  define SCNdPTR __PRIPTR_PREFIX "d"
+# endif
+#endif
+#if !defined SCNiPTR
+# ifdef INTPTR_MAX
+#  define SCNiPTR __PRIPTR_PREFIX "i"
+# endif
+#endif
+#if !defined SCNoPTR
+# ifdef UINTPTR_MAX
+#  define SCNoPTR __PRIPTR_PREFIX "o"
+# endif
+#endif
+#if !defined SCNuPTR
+# ifdef UINTPTR_MAX
+#  define SCNuPTR __PRIPTR_PREFIX "u"
+# endif
+#endif
+#if !defined SCNxPTR
+# ifdef UINTPTR_MAX
+#  define SCNxPTR __PRIPTR_PREFIX "x"
+# endif
+#endif
+
+/* 7.8.2 Functions for greatest-width integer types */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if 0
+# if !1
+extern intmax_t imaxabs (intmax_t);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef imaxabs
+# if HAVE_RAW_DECL_IMAXABS
+_GL_WARN_ON_USE (imaxabs, "imaxabs is unportable - "
+                 "use gnulib module imaxabs for portability");
+# endif
+#endif
+
+#if 0
+# if !1
+#  if !GNULIB_defined_imaxdiv_t
+typedef struct { intmax_t quot; intmax_t rem; } imaxdiv_t;
+#   define GNULIB_defined_imaxdiv_t 1
+#  endif
+# endif
+# if !1
+extern imaxdiv_t imaxdiv (intmax_t, intmax_t);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef imaxdiv
+# if HAVE_RAW_DECL_IMAXDIV
+_GL_WARN_ON_USE (imaxdiv, "imaxdiv is unportable - "
+                 "use gnulib module imaxdiv for portability");
+# endif
+#endif
+
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef strtoimax
+#   define strtoimax rpl_strtoimax
+#  endif
+_GL_FUNCDECL_RPL (strtoimax, intmax_t,
+                  (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 *restrict, char **restrict, int)
+                  _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (strtoimax, intmax_t,
+                  (const char *restrict, char **restrict, int));
+# endif
+_GL_CXXALIASWARN (strtoimax);
+#elif defined GNULIB_POSIXCHECK
+# undef strtoimax
+# if HAVE_RAW_DECL_STRTOIMAX
+_GL_WARN_ON_USE (strtoimax, "strtoimax is unportable - "
+                 "use gnulib module strtoimax for portability");
+# endif
+#endif
+
+#if 0
+# if 0
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef strtoumax
+#   define strtoumax rpl_strtoumax
+#  endif
+_GL_FUNCDECL_RPL (strtoumax, uintmax_t,
+                  (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 *restrict, char **restrict, int)
+                  _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (strtoumax, uintmax_t,
+                  (const char *restrict, char **restrict, int));
+# endif
+_GL_CXXALIASWARN (strtoumax);
+#elif defined GNULIB_POSIXCHECK
+# undef strtoumax
+# if HAVE_RAW_DECL_STRTOUMAX
+_GL_WARN_ON_USE (strtoumax, "strtoumax is unportable - "
+                 "use gnulib module strtoumax for portability");
+# endif
+#endif
+
+/* Don't bother defining or declaring wcstoimax and wcstoumax, since
+   wide-character functions like this are hardly ever useful.  */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !defined INTTYPES_H && !defined _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H */
diff --git a/gl/limits.h b/gl/limits.h
new file mode 100644
index 0000000..4f37f3c
--- /dev/null
+++ b/gl/limits.h
@@ -0,0 +1,132 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* A GNU-like <limits.h>.
+
+   Copyright 2016-2022 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 _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
+
+#ifndef LLONG_MIN
+# if defined LONG_LONG_MIN /* HP-UX 11.31 */
+#  define LLONG_MIN LONG_LONG_MIN
+# elif defined LONGLONG_MIN /* IRIX 6.5 */
+#  define LLONG_MIN LONGLONG_MIN
+# elif defined __GNUC__
+#  define LLONG_MIN (- __LONG_LONG_MAX__ - 1LL)
+# endif
+#endif
+#ifndef LLONG_MAX
+# if defined LONG_LONG_MAX /* HP-UX 11.31 */
+#  define LLONG_MAX LONG_LONG_MAX
+# elif defined LONGLONG_MAX /* IRIX 6.5 */
+#  define LLONG_MAX LONGLONG_MAX
+# elif defined __GNUC__
+#  define LLONG_MAX __LONG_LONG_MAX__
+# endif
+#endif
+#ifndef ULLONG_MAX
+# if defined ULONG_LONG_MAX /* HP-UX 11.31 */
+#  define ULLONG_MAX ULONG_LONG_MAX
+# elif defined ULONGLONG_MAX /* IRIX 6.5 */
+#  define ULLONG_MAX ULONGLONG_MAX
+# elif defined __GNUC__
+#  define ULLONG_MAX (__LONG_LONG_MAX__ * 2ULL + 1ULL)
+# endif
+#endif
+
+/* The number of usable bits in an unsigned or signed integer type
+   with minimum value MIN and maximum value MAX, as an int expression
+   suitable in #if.  Cover all known practical hosts.  This
+   implementation exploits the fact that MAX is 1 less than a power of
+   2, and merely counts the number of 1 bits in MAX; "COBn" means
+   "count the number of 1 bits in the low-order n bits").  */
+#define _GL_INTEGER_WIDTH(min, max) (((min) < 0) + _GL_COB128 (max))
+#define _GL_COB128(n) (_GL_COB64 ((n) >> 31 >> 31 >> 2) + _GL_COB64 (n))
+#define _GL_COB64(n) (_GL_COB32 ((n) >> 31 >> 1) + _GL_COB32 (n))
+#define _GL_COB32(n) (_GL_COB16 ((n) >> 16) + _GL_COB16 (n))
+#define _GL_COB16(n) (_GL_COB8 ((n) >> 8) + _GL_COB8 (n))
+#define _GL_COB8(n) (_GL_COB4 ((n) >> 4) + _GL_COB4 (n))
+#define _GL_COB4(n) (!!((n) & 8) + !!((n) & 4) + !!((n) & 2) + !!((n) & 1))
+
+#ifndef WORD_BIT
+/* Assume 'int' is 32 bits wide.  */
+# define WORD_BIT 32
+#endif
+#ifndef LONG_BIT
+/* Assume 'long' is 32 or 64 bits wide.  */
+# if LONG_MAX == INT_MAX
+#  define LONG_BIT 32
+# else
+#  define LONG_BIT 64
+# endif
+#endif
+
+/* 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 __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)
+# define SHRT_WIDTH _GL_INTEGER_WIDTH (SHRT_MIN, SHRT_MAX)
+# define USHRT_WIDTH _GL_INTEGER_WIDTH (0, USHRT_MAX)
+# define INT_WIDTH _GL_INTEGER_WIDTH (INT_MIN, INT_MAX)
+# define UINT_WIDTH _GL_INTEGER_WIDTH (0, UINT_MAX)
+# define LONG_WIDTH _GL_INTEGER_WIDTH (LONG_MIN, LONG_MAX)
+# 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
+
+/* 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/gl/lseek.c b/gl/lseek.c
deleted file mode 100644
index 1a9c49b..0000000
--- a/gl/lseek.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/* An lseek() function that detects pipes.
-   Copyright (C) 2007, 2009-2022 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__
-/* Windows platforms.  */
-/* Get GetFileType.  */
-# include <windows.h>
-/* Get _get_osfhandle.  */
-# if GNULIB_MSVC_NOTHROW
-#  include "msvc-nothrow.h"
-# else
-#  include <io.h>
-# endif
-#else
-# include <sys/stat.h>
-#endif
-#include <errno.h>
-
-#undef lseek
-
-off_t
-rpl_lseek (int fd, off_t offset, int whence)
-{
-#if defined _WIN32 && ! defined __CYGWIN__
-  /* mingw lseek mistakenly succeeds on pipes, sockets, and terminals.  */
-  HANDLE h = (HANDLE) _get_osfhandle (fd);
-  if (h == INVALID_HANDLE_VALUE)
-    {
-      errno = EBADF;
-      return -1;
-    }
-  if (GetFileType (h) != FILE_TYPE_DISK)
-    {
-      errno = ESPIPE;
-      return -1;
-    }
-#elif defined __APPLE__ && defined __MACH__ && defined SEEK_DATA
-  if (whence == SEEK_DATA)
-    {
-      /* If OFFSET points to data, macOS lseek+SEEK_DATA returns the
-         start S of the first data region that begins *after* OFFSET,
-         where the region from OFFSET to S consists of possibly-empty
-         data followed by a possibly-empty hole.  To work around this
-         portability glitch, check whether OFFSET is within data by
-         using lseek+SEEK_HOLE, and if so return to OFFSET by using
-         lseek+SEEK_SET.  Also, contrary to the macOS documentation,
-         lseek+SEEK_HOLE can fail with ENXIO if there are no holes on
-         or after OFFSET.  What a mess!  */
-      off_t next_hole = lseek (fd, offset, SEEK_HOLE);
-      if (next_hole < 0)
-        return errno == ENXIO ? offset : next_hole;
-      if (next_hole != offset)
-        whence = SEEK_SET;
-    }
-#else
-  /* BeOS lseek mistakenly succeeds on pipes...  */
-  struct stat statbuf;
-  if (fstat (fd, &statbuf) < 0)
-    return -1;
-  if (!S_ISREG (statbuf.st_mode))
-    {
-      errno = ESPIPE;
-      return -1;
-    }
-#endif
-#if _GL_WINDOWS_64_BIT_OFF_T || (defined __MINGW32__ && defined _FILE_OFFSET_BITS && (_FILE_OFFSET_BITS == 64))
-  return _lseeki64 (fd, offset, whence);
-#else
-  return lseek (fd, offset, whence);
-#endif
-}
diff --git a/gl/m4/af_alg.m4 b/gl/m4/af_alg.m4
deleted file mode 100644
index 9c7edf0..0000000
--- a/gl/m4/af_alg.m4
+++ /dev/null
@@ -1,57 +0,0 @@
-# af_alg.m4 serial 6
-dnl Copyright 2018-2022 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 Matteo Croce.
-
-AC_DEFUN_ONCE([gl_AF_ALG],
-[
-  AC_REQUIRE([gl_SYS_SOCKET_H])
-  AC_REQUIRE([AC_C_INLINE])
-
-  dnl Check whether linux/if_alg.h has needed features.
-  AC_CACHE_CHECK([whether linux/if_alg.h has struct sockaddr_alg.],
-    [gl_cv_header_linux_if_alg_salg],
-    [AC_COMPILE_IFELSE(
-       [AC_LANG_PROGRAM([[#include <sys/socket.h>
-                          #include <linux/if_alg.h>
-                          struct sockaddr_alg salg = {
-                            .salg_family = AF_ALG,
-                            .salg_type = "hash",
-                            .salg_name = "sha1",
-                          };]])],
-       [gl_cv_header_linux_if_alg_salg=yes],
-       [gl_cv_header_linux_if_alg_salg=no])])
-  if test "$gl_cv_header_linux_if_alg_salg" = yes; then
-    AC_DEFINE([HAVE_LINUX_IF_ALG_H], [1],
-      [Define to 1 if you have 'struct sockaddr_alg' defined.])
-  fi
-
-  dnl The default is to not use AF_ALG if available,
-  dnl as it's system dependent as to whether the kernel
-  dnl routines are faster than libcrypto for example.
-  use_af_alg=no
-  AC_ARG_WITH([linux-crypto],
-    [AS_HELP_STRING([[--with-linux-crypto]],
-       [use Linux kernel cryptographic API (if available) for the hash functions
-        MD5, SHA-1, SHA-224, SHA-256, SHA-384, SHA-512 on files])],
-    [use_af_alg=$withval],
-    [use_af_alg=no])
-  dnl We cannot use it if it is not available.
-  if test "$gl_cv_header_linux_if_alg_salg" != yes; then
-    if test "$use_af_alg" != no; then
-      AC_MSG_WARN([Linux kernel cryptographic API not found])
-    fi
-    use_af_alg=no
-  fi
-
-  if test "$use_af_alg" != no; then
-    USE_AF_ALG=1
-  else
-    USE_AF_ALG=0
-  fi
-  AC_DEFINE_UNQUOTED([USE_LINUX_CRYPTO_API], [$USE_AF_ALG],
-    [Define to 1 if you want to use the Linux kernel cryptographic API.])
-])
diff --git a/gl/m4/byteswap.m4 b/gl/m4/byteswap.m4
deleted file mode 100644
index 99aeb68..0000000
--- a/gl/m4/byteswap.m4
+++ /dev/null
@@ -1,17 +0,0 @@
-# byteswap.m4 serial 5
-dnl Copyright (C) 2005, 2007, 2009-2022 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 Oskar Liljeblad.
-
-AC_DEFUN([gl_BYTESWAP],
-[
-  dnl Prerequisites of lib/byteswap.in.h.
-  AC_CHECK_HEADERS([byteswap.h], [
-    GL_GENERATE_BYTESWAP_H=false
-  ], [
-    GL_GENERATE_BYTESWAP_H=true
-  ])
-])
diff --git a/gl/m4/fflush.m4 b/gl/m4/fflush.m4
deleted file mode 100644
index e36f90e..0000000
--- a/gl/m4/fflush.m4
+++ /dev/null
@@ -1,100 +0,0 @@
-# fflush.m4 serial 18
-
-# Copyright (C) 2007-2022 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 Eric Blake
-
-dnl Find out how to obey POSIX semantics of fflush(stdin) discarding
-dnl unread input on seekable streams, rather than C99 undefined semantics.
-
-AC_DEFUN([gl_FUNC_FFLUSH],
-[
-  AC_REQUIRE([gl_STDIO_H_DEFAULTS])
-  gl_FUNC_FFLUSH_STDIN
-  case "$gl_cv_func_fflush_stdin" in
-    *yes) ;;
-    *) REPLACE_FFLUSH=1 ;;
-  esac
-])
-
-dnl Determine whether fflush works on input streams.
-dnl Sets gl_cv_func_fflush_stdin.
-
-AC_DEFUN([gl_FUNC_FFLUSH_STDIN],
-[
-  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
-  AC_CHECK_HEADERS_ONCE([unistd.h])
-  AC_CACHE_CHECK([whether fflush works on input streams],
-    [gl_cv_func_fflush_stdin],
-    [echo hello world > conftest.txt
-     AC_RUN_IFELSE([AC_LANG_PROGRAM(
-       [[
-#include <stdio.h>
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else /* on Windows with MSVC */
-# include <io.h>
-#endif
-       ]GL_MDA_DEFINES],
-       [[FILE *f = fopen ("conftest.txt", "r");
-         char buffer[10];
-         int fd;
-         int c;
-         if (f == NULL)
-           return 1;
-         fd = fileno (f);
-         if (fd < 0 || fread (buffer, 1, 5, f) != 5)
-           { fclose (f); return 2; }
-         /* For deterministic results, ensure f read a bigger buffer.  */
-         if (lseek (fd, 0, SEEK_CUR) == 5)
-           { fclose (f); return 3; }
-         /* POSIX requires fflush-fseek to set file offset of fd.  This fails
-            on BSD systems and on mingw.  */
-         if (fflush (f) != 0 || fseek (f, 0, SEEK_CUR) != 0)
-           { fclose (f); return 4; }
-         if (lseek (fd, 0, SEEK_CUR) != 5)
-           { fclose (f); return 5; }
-         /* Verify behaviour of fflush after ungetc. See
-            <https://www.opengroup.org/austin/aardvark/latest/xshbug3.txt>  */
-         /* Verify behaviour of fflush after a backup ungetc.  This fails on
-            mingw.  */
-         c = fgetc (f);
-         ungetc (c, f);
-         fflush (f);
-         if (fgetc (f) != c)
-           { fclose (f); return 6; }
-         /* Verify behaviour of fflush after a non-backup ungetc.  This fails
-            on glibc 2.8 and on BSD systems.  */
-         c = fgetc (f);
-         ungetc ('@', f);
-         fflush (f);
-         if (fgetc (f) != c)
-           { fclose (f); return 7; }
-         fclose (f);
-         return 0;
-       ]])],
-       [gl_cv_func_fflush_stdin=yes],
-       [gl_cv_func_fflush_stdin=no],
-       [case "$host_os" in
-                  # Guess no on native Windows.
-          mingw*) gl_cv_func_fflush_stdin="guessing no" ;;
-          *)      gl_cv_func_fflush_stdin=cross ;;
-        esac
-       ])
-     rm conftest.txt
-    ])
-  case "$gl_cv_func_fflush_stdin" in
-    *yes) gl_func_fflush_stdin=1 ;;
-    *no)  gl_func_fflush_stdin=0 ;;
-    *)    gl_func_fflush_stdin='(-1)' ;;
-  esac
-  AC_DEFINE_UNQUOTED([FUNC_FFLUSH_STDIN], [$gl_func_fflush_stdin],
-    [Define to 1 if fflush is known to work on stdin as per POSIX.1-2008,
-     0 if fflush is known to not work, -1 if unknown.])
-])
-
-# Prerequisites of lib/fflush.c.
-AC_DEFUN([gl_PREREQ_FFLUSH], [:])
diff --git a/gl/m4/fpurge.m4 b/gl/m4/fpurge.m4
deleted file mode 100644
index 1a15454..0000000
--- a/gl/m4/fpurge.m4
+++ /dev/null
@@ -1,73 +0,0 @@
-# fpurge.m4 serial 12
-dnl Copyright (C) 2007, 2009-2022 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_FPURGE],
-[
-  AC_REQUIRE([gl_STDIO_H_DEFAULTS])
-  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
-  AC_CHECK_HEADERS_ONCE([stdio_ext.h])
-  AC_CHECK_FUNCS_ONCE([fpurge])
-  AC_CHECK_FUNCS_ONCE([__fpurge])
-  AC_CHECK_DECLS([fpurge], , , [[#include <stdio.h>]])
-  if test "x$ac_cv_func_fpurge" = xyes; then
-    HAVE_FPURGE=1
-    # Detect BSD bug.  Only cygwin 1.7 and musl are known to be immune.
-    AC_CACHE_CHECK([whether fpurge works], [gl_cv_func_fpurge_works],
-      [AC_RUN_IFELSE(
-         [AC_LANG_PROGRAM(
-            [[#include <stdio.h>
-]],
-            [[FILE *f = fopen ("conftest.txt", "w+");
-              if (!f)
-                return 1;
-              if (fputc ('a', f) != 'a')
-                { fclose (f); return 2; }
-              rewind (f);
-              if (fgetc (f) != 'a')
-                { fclose (f); return 3; }
-              if (fgetc (f) != EOF)
-                { fclose (f); return 4; }
-              if (fpurge (f) != 0)
-                { fclose (f); return 5; }
-              if (putc ('b', f) != 'b')
-                { fclose (f); return 6; }
-              if (fclose (f) != 0)
-                return 7;
-              if ((f = fopen ("conftest.txt", "r")) == NULL)
-                return 8;
-              if (fgetc (f) != 'a')
-                { fclose (f); return 9; }
-              if (fgetc (f) != 'b')
-                { fclose (f); return 10; }
-              if (fgetc (f) != EOF)
-                { fclose (f); return 11; }
-              if (fclose (f) != 0)
-                return 12;
-              if (remove ("conftest.txt") != 0)
-                return 13;
-              return 0;
-            ]])],
-         [gl_cv_func_fpurge_works=yes],
-         [gl_cv_func_fpurge_works=no],
-         [case "$host_os" in
-                     # Guess yes on musl systems.
-            *-musl*) gl_cv_func_fpurge_works="guessing yes" ;;
-                     # Otherwise obey --enable-cross-guesses.
-            *)       gl_cv_func_fpurge_works="$gl_cross_guess_normal" ;;
-          esac
-         ])
-      ])
-    case "$gl_cv_func_fpurge_works" in
-      *yes) ;;
-      *) REPLACE_FPURGE=1 ;;
-    esac
-  else
-    HAVE_FPURGE=0
-  fi
-  if test "x$ac_cv_have_decl_fpurge" = xno; then
-    HAVE_DECL_FPURGE=0
-  fi
-])
diff --git a/gl/m4/freading.m4 b/gl/m4/freading.m4
deleted file mode 100644
index 81b17a6..0000000
--- a/gl/m4/freading.m4
+++ /dev/null
@@ -1,11 +0,0 @@
-# freading.m4 serial 2
-dnl Copyright (C) 2007, 2009-2022 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_FREADING],
-[
-  AC_CHECK_HEADERS_ONCE([stdio_ext.h])
-  AC_CHECK_FUNCS_ONCE([__freading])
-])
diff --git a/gl/m4/fseek.m4 b/gl/m4/fseek.m4
deleted file mode 100644
index bd4a55b..0000000
--- a/gl/m4/fseek.m4
+++ /dev/null
@@ -1,15 +0,0 @@
-# fseek.m4 serial 4
-dnl Copyright (C) 2007, 2009-2022 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_FSEEK],
-[
-  AC_REQUIRE([gl_STDIO_H_DEFAULTS])
-  AC_REQUIRE([gl_FUNC_FSEEKO])
-  dnl When fseeko needs fixes, fseek needs them too.
-  if test $HAVE_FSEEKO = 0 || test $REPLACE_FSEEKO = 1; then
-    REPLACE_FSEEK=1
-  fi
-])
diff --git a/gl/m4/fseeko.m4 b/gl/m4/fseeko.m4
deleted file mode 100644
index e50fe39..0000000
--- a/gl/m4/fseeko.m4
+++ /dev/null
@@ -1,77 +0,0 @@
-# fseeko.m4 serial 20
-dnl Copyright (C) 2007-2022 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_FSEEKO],
-[
-  AC_REQUIRE([gl_STDIO_H_DEFAULTS])
-  AC_REQUIRE([gl_STDIN_LARGE_OFFSET])
-  AC_REQUIRE([gl_SYS_TYPES_H])
-  AC_REQUIRE([AC_PROG_CC])
-
-  dnl Persuade glibc <stdio.h> to declare fseeko().
-  AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
-
-  AC_CACHE_CHECK([for fseeko], [gl_cv_func_fseeko],
-    [
-      AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>
-]], [[fseeko (stdin, 0, 0);]])],
-        [gl_cv_func_fseeko=yes], [gl_cv_func_fseeko=no])
-    ])
-
-  AC_CHECK_DECLS_ONCE([fseeko])
-  if test $ac_cv_have_decl_fseeko = no; then
-    HAVE_DECL_FSEEKO=0
-  fi
-
-  if test $gl_cv_func_fseeko = no; then
-    HAVE_FSEEKO=0
-  else
-    if test $WINDOWS_64_BIT_OFF_T = 1; then
-      REPLACE_FSEEKO=1
-    fi
-    if test $gl_cv_var_stdin_large_offset = no; then
-      REPLACE_FSEEKO=1
-    fi
-    m4_ifdef([gl_FUNC_FFLUSH_STDIN], [
-      gl_FUNC_FFLUSH_STDIN
-      case "$gl_cv_func_fflush_stdin" in
-        *yes) ;;
-        *) REPLACE_FSEEKO=1 ;;
-      esac
-    ])
-  fi
-])
-
-dnl Code shared by fseeko and ftello.  Determine if large files are supported,
-dnl but stdin does not start as a large file by default.
-AC_DEFUN([gl_STDIN_LARGE_OFFSET],
-  [
-    AC_CACHE_CHECK([whether stdin defaults to large file offsets],
-      [gl_cv_var_stdin_large_offset],
-      [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>]],
-[[#if defined __SL64 && defined __SCLE /* cygwin */
-  /* Cygwin 1.5.24 and earlier fail to put stdin in 64-bit mode, making
-     fseeko/ftello needlessly fail.  This bug was fixed in 1.5.25, and
-     it is easier to do a version check than building a runtime test.  */
-# include <cygwin/version.h>
-# if CYGWIN_VERSION_DLL_COMBINED < CYGWIN_VERSION_DLL_MAKE_COMBINED (1005, 25)
-  choke me
-# endif
-#endif]])],
-        [gl_cv_var_stdin_large_offset=yes],
-        [gl_cv_var_stdin_large_offset=no])])
-])
-
-# Prerequisites of lib/fseeko.c.
-AC_DEFUN([gl_PREREQ_FSEEKO],
-[
-  dnl Native Windows has the function _fseeki64. mingw hides it in some
-  dnl circumstances, but mingw64 makes it usable again.
-  AC_CHECK_FUNCS([_fseeki64])
-  if test $ac_cv_func__fseeki64 = yes; then
-    AC_CHECK_DECLS([_fseeki64])
-  fi
-])
diff --git a/gl/m4/ftell.m4 b/gl/m4/ftell.m4
deleted file mode 100644
index 89f2d1b..0000000
--- a/gl/m4/ftell.m4
+++ /dev/null
@@ -1,15 +0,0 @@
-# ftell.m4 serial 3
-dnl Copyright (C) 2007, 2009-2022 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_FTELL],
-[
-  AC_REQUIRE([gl_STDIO_H_DEFAULTS])
-  AC_REQUIRE([gl_FUNC_FTELLO])
-  dnl When ftello needs fixes, ftell needs them too.
-  if test $HAVE_FTELLO = 0 || test $REPLACE_FTELLO = 1; then
-    REPLACE_FTELL=1
-  fi
-])
diff --git a/gl/m4/ftello.m4 b/gl/m4/ftello.m4
deleted file mode 100644
index 919f39d..0000000
--- a/gl/m4/ftello.m4
+++ /dev/null
@@ -1,151 +0,0 @@
-# ftello.m4 serial 14
-dnl Copyright (C) 2007-2022 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_FTELLO],
-[
-  AC_REQUIRE([gl_STDIO_H_DEFAULTS])
-  AC_REQUIRE([AC_PROG_CC])
-  AC_REQUIRE([gl_STDIN_LARGE_OFFSET])
-  AC_REQUIRE([gl_SYS_TYPES_H])
-
-  dnl Persuade glibc <stdio.h> to declare ftello().
-  AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
-
-  AC_CHECK_DECLS_ONCE([ftello])
-  if test $ac_cv_have_decl_ftello = no; then
-    HAVE_DECL_FTELLO=0
-  fi
-
-  AC_CACHE_CHECK([for ftello], [gl_cv_func_ftello],
-    [
-      AC_LINK_IFELSE(
-        [AC_LANG_PROGRAM(
-           [[#include <stdio.h>]],
-           [[ftello (stdin);]])],
-        [gl_cv_func_ftello=yes],
-        [gl_cv_func_ftello=no])
-    ])
-  if test $gl_cv_func_ftello = no; then
-    HAVE_FTELLO=0
-  else
-    if test $WINDOWS_64_BIT_OFF_T = 1; then
-      REPLACE_FTELLO=1
-    fi
-    if test $gl_cv_var_stdin_large_offset = no; then
-      REPLACE_FTELLO=1
-    fi
-    if test $REPLACE_FTELLO = 0; then
-      dnl Detect bug on Solaris.
-      dnl ftell and ftello produce incorrect results after putc that followed a
-      dnl getc call that reached EOF on Solaris. This is because the _IOREAD
-      dnl flag does not get cleared in this case, even though _IOWRT gets set,
-      dnl and ftell and ftello look whether the _IOREAD flag is set.
-      AC_REQUIRE([AC_CANONICAL_HOST])
-      AC_CACHE_CHECK([whether ftello works],
-        [gl_cv_func_ftello_works],
-        [
-          dnl Initial guess, used when cross-compiling or when /dev/tty cannot
-          dnl be opened.
-changequote(,)dnl
-          case "$host_os" in
-                      # Guess no on Solaris.
-            solaris*) gl_cv_func_ftello_works="guessing no" ;;
-                      # Guess yes on native Windows.
-            mingw*)   gl_cv_func_ftello_works="guessing yes" ;;
-                      # Guess yes otherwise.
-            *)        gl_cv_func_ftello_works="guessing yes" ;;
-          esac
-changequote([,])dnl
-          AC_RUN_IFELSE(
-            [AC_LANG_SOURCE([[
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#define TESTFILE "conftest.tmp"
-int
-main (void)
-{
-  FILE *fp;
-
-  /* Create a file with some contents.  */
-  fp = fopen (TESTFILE, "w");
-  if (fp == NULL)
-    return 70;
-  if (fwrite ("foogarsh", 1, 8, fp) < 8)
-    { fclose (fp); return 71; }
-  if (fclose (fp))
-    return 72;
-
-  /* The file's contents is now "foogarsh".  */
-
-  /* Try writing after reading to EOF.  */
-  fp = fopen (TESTFILE, "r+");
-  if (fp == NULL)
-    return 73;
-  if (fseek (fp, -1, SEEK_END))
-    { fclose (fp); return 74; }
-  if (!(getc (fp) == 'h'))
-    { fclose (fp); return 1; }
-  if (!(getc (fp) == EOF))
-    { fclose (fp); return 2; }
-  if (!(ftell (fp) == 8))
-    { fclose (fp); return 3; }
-  if (!(ftell (fp) == 8))
-    { fclose (fp); return 4; }
-  if (!(putc ('!', fp) == '!'))
-    { fclose (fp); return 5; }
-  if (!(ftell (fp) == 9))
-    { fclose (fp); return 6; }
-  if (!(fclose (fp) == 0))
-    return 7;
-  fp = fopen (TESTFILE, "r");
-  if (fp == NULL)
-    return 75;
-  {
-    char buf[10];
-    if (!(fread (buf, 1, 10, fp) == 9))
-      { fclose (fp); return 10; }
-    if (!(memcmp (buf, "foogarsh!", 9) == 0))
-      { fclose (fp); return 11; }
-  }
-  if (!(fclose (fp) == 0))
-    return 12;
-
-  /* The file's contents is now "foogarsh!".  */
-
-  return 0;
-}]])],
-            [gl_cv_func_ftello_works=yes],
-            [gl_cv_func_ftello_works=no], [:])
-        ])
-      case "$gl_cv_func_ftello_works" in
-        *yes) ;;
-        *)
-          REPLACE_FTELLO=1
-          AC_DEFINE([FTELLO_BROKEN_AFTER_SWITCHING_FROM_READ_TO_WRITE], [1],
-            [Define to 1 if the system's ftello function has the Solaris bug.])
-          ;;
-      esac
-    fi
-    if test $REPLACE_FTELLO = 0; then
-      dnl Detect bug on macOS >= 10.15.
-      gl_FUNC_UNGETC_WORKS
-      if test $gl_ftello_broken_after_ungetc = yes; then
-        REPLACE_FTELLO=1
-        AC_DEFINE([FTELLO_BROKEN_AFTER_UNGETC], [1],
-          [Define to 1 if the system's ftello function has the macOS bug.])
-      fi
-    fi
-  fi
-])
-
-# Prerequisites of lib/ftello.c.
-AC_DEFUN([gl_PREREQ_FTELLO],
-[
-  dnl Native Windows has the function _ftelli64. mingw hides it, but mingw64
-  dnl makes it usable again.
-  AC_CHECK_FUNCS([_ftelli64])
-])
diff --git a/gl/m4/gl-openssl.m4 b/gl/m4/gl-openssl.m4
deleted file mode 100644
index d076f84..0000000
--- a/gl/m4/gl-openssl.m4
+++ /dev/null
@@ -1,76 +0,0 @@
-# gl-openssl.m4 serial 6
-dnl Copyright (C) 2013-2022 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_SET_CRYPTO_CHECK_DEFAULT],
-[
-  m4_define([gl_CRYPTO_CHECK_DEFAULT], [$1])
-])
-gl_SET_CRYPTO_CHECK_DEFAULT([no])
-
-AC_DEFUN([gl_CRYPTO_CHECK],
-[
-  dnl gnulib users set this before gl_INIT with gl_SET_CRYPTO_CHECK_DEFAULT()
-  m4_divert_once([DEFAULTS], [with_openssl_default='gl_CRYPTO_CHECK_DEFAULT'])
-
-  dnl Only clear once, so crypto routines can be checked for individually
-  m4_divert_once([DEFAULTS], [LIB_CRYPTO=])
-
-  AC_ARG_WITH([openssl],
-    [[  --with-openssl[=ARG]    use libcrypto hash routines for the hash functions
-                          MD5, SHA-1, SHA-224, SHA-256, SHA-384, SHA-512.
-                          Valid ARGs are:
-                            'yes',
-                            'no',
-                            'auto' => use if any version available,
-                            'auto-gpl-compat' => use if GPL compatible version
-                                                 available,
-                            'optional' => use if available
-                                          and warn if not available;
-                          Default is ']gl_CRYPTO_CHECK_DEFAULT['.]m4_ifdef([gl_AF_ALG], [
-                          Note also --with-linux-crypto, which will enable the
-                          use of Linux kernel crypto routines (if available),
-                          which has precedence for files.])],
-    [],
-    [with_openssl=$with_openssl_default])
-
-  AC_SUBST([LIB_CRYPTO])
-  if test "x$with_openssl" != xno; then
-    if test "x$with_openssl" = xauto-gpl-compat; then
-      AC_CACHE_CHECK([whether openssl is GPL compatible],
-                     [gl_cv_openssl_gpl_compat],
-        [AC_COMPILE_IFELSE(
-           [AC_LANG_PROGRAM([[
-                #include <openssl/opensslv.h>
-                #if OPENSSL_VERSION_MAJOR < 3
-                  #error "openssl >= version 3 not found"
-                #endif
-              ]])],
-           [gl_cv_openssl_gpl_compat=yes],
-           [gl_cv_openssl_gpl_compat=no])])
-    fi
-    if test "x$with_openssl" != xauto-gpl-compat ||
-       test "x$gl_cv_openssl_gpl_compat" = xyes; then
-      AC_CHECK_LIB([crypto], [$1],
-        [AC_CHECK_HEADERS(
-           m4_if([$1], [MD5], [openssl/md5.h], [openssl/sha.h]),
-           [LIB_CRYPTO=-lcrypto
-            AC_DEFINE([HAVE_OPENSSL_$1], [1],
-              [Define to 1 if libcrypto is used for $1.])])])
-    fi
-    if test "x$LIB_CRYPTO" = x; then
-      message='openssl development library not found for $1.
-  If you want to install it, first find the pre-built package name:
-    - On Debian and Debian-based systems: libssl-dev,
-    - On Red Hat distributions: openssl-devel.
-    - Other: https://repology.org/project/openssl/versions'
-      if test "x$with_openssl" = xyes; then
-        AC_MSG_ERROR([$message])
-      elif test "x$with_openssl" = xoptional; then
-        AC_MSG_WARN([$message])
-      fi
-    fi
-  fi
-])
diff --git a/gl/m4/gnulib-cache.m4 b/gl/m4/gnulib-cache.m4
index 06fed91..7551d09 100644
--- a/gl/m4/gnulib-cache.m4
+++ b/gl/m4/gnulib-cache.m4
@@ -39,7 +39,6 @@
 #  --macro-prefix=gl \
 #  --no-vc-files \
 #  base64 \
-#  crypto/sha256 \
 #  dirname \
 #  environ \
 #  floorf \
@@ -65,7 +64,6 @@
 gl_LOCAL_DIR([])
 gl_MODULES([
   base64
-  crypto/sha256
   dirname
   environ
   floorf
diff --git a/gl/m4/gnulib-comp.m4 b/gl/m4/gnulib-comp.m4
index 93b7884..563b9ae 100644
--- a/gl/m4/gnulib-comp.m4
+++ b/gl/m4/gnulib-comp.m4
@@ -50,15 +50,11 @@ AC_DEFUN([gl_EARLY],
   # Code from module basename-lgpl:
   # Code from module btowc:
   # Code from module builtin-expect:
-  # Code from module byteswap:
   # Code from module c99:
   # Code from module calloc-gnu:
   # Code from module calloc-posix:
   # Code from module cloexec:
   # Code from module close:
-  # Code from module crypto/af_alg:
-  # Code from module crypto/sha256:
-  # Code from module crypto/sha256-buffer:
   # Code from module dirname:
   # Code from module dirname-lgpl:
   # Code from module double-slash-root:
@@ -73,24 +69,14 @@ AC_DEFUN([gl_EARLY],
   # Code from module fcntl:
   # Code from module fcntl-h:
   # Code from module fd-hook:
-  # Code from module fflush:
-  AC_REQUIRE([gl_SET_LARGEFILE_SOURCE])
   # Code from module filename:
   # Code from module float:
   # Code from module floorf:
   # Code from module fopen:
   # Code from module fopen-gnu:
-  # Code from module fpurge:
-  # Code from module freading:
   # Code from module free-posix:
-  # Code from module fseek:
-  # Code from module fseeko:
-  AC_REQUIRE([gl_SET_LARGEFILE_SOURCE])
   # Code from module fstat:
   # Code from module fsusage:
-  # Code from module ftell:
-  # Code from module ftello:
-  AC_REQUIRE([gl_SET_LARGEFILE_SOURCE])
   # Code from module gen-header:
   # Code from module getaddrinfo:
   # Code from module getdelim:
@@ -123,7 +109,6 @@ AC_DEFUN([gl_EARLY],
   # Code from module locale:
   # Code from module localeconv:
   # Code from module lock:
-  # Code from module lseek:
   # Code from module malloc-gnu:
   # Code from module malloc-posix:
   # Code from module malloca:
@@ -246,9 +231,6 @@ AC_DEFUN([gl_INIT],
   ])
   gl_WCHAR_MODULE_INDICATOR([btowc])
   gl___BUILTIN_EXPECT
-  gl_BYTESWAP
-  gl_CONDITIONAL_HEADER([byteswap.h])
-  AC_PROG_MKDIR_P
   gl_FUNC_CALLOC_GNU
   if test $REPLACE_CALLOC_FOR_CALLOC_GNU = 1; then
     AC_LIBOBJ([calloc])
@@ -263,9 +245,6 @@ AC_DEFUN([gl_INIT],
   gl_FUNC_CLOSE
   gl_CONDITIONAL([GL_COND_OBJ_CLOSE], [test $REPLACE_CLOSE = 1])
   gl_UNISTD_MODULE_INDICATOR([close])
-  gl_AF_ALG
-  AC_REQUIRE([AC_C_RESTRICT])
-  gl_SHA256
   gl_MODULE_INDICATOR([dirname])
   gl_DOUBLE_SLASH_ROOT
   gl_FUNC_DUP2
@@ -296,13 +275,6 @@ AC_DEFUN([gl_INIT],
   gl_FCNTL_H
   gl_FCNTL_H_REQUIRE_DEFAULTS
   AC_PROG_MKDIR_P
-  gl_FUNC_FFLUSH
-  gl_CONDITIONAL([GL_COND_OBJ_FFLUSH], [test $REPLACE_FFLUSH = 1])
-  AM_COND_IF([GL_COND_OBJ_FFLUSH], [
-    gl_PREREQ_FFLUSH
-  ])
-  gl_MODULE_INDICATOR([fflush])
-  gl_STDIO_MODULE_INDICATOR([fflush])
   gl_FLOAT_H
   gl_CONDITIONAL_HEADER([float.h])
   AC_PROG_MKDIR_P
@@ -325,27 +297,12 @@ AC_DEFUN([gl_INIT],
   fi
   gl_MODULE_INDICATOR([fopen-gnu])
   gl_STDIO_MODULE_INDICATOR([fopen-gnu])
-  gl_FUNC_FPURGE
-  gl_CONDITIONAL([GL_COND_OBJ_FPURGE],
-                 [test $HAVE_FPURGE = 0 || test $REPLACE_FPURGE = 1])
-  gl_STDIO_MODULE_INDICATOR([fpurge])
-  gl_FUNC_FREADING
   gl_FUNC_FREE
   gl_CONDITIONAL([GL_COND_OBJ_FREE], [test $REPLACE_FREE = 1])
   AM_COND_IF([GL_COND_OBJ_FREE], [
     gl_PREREQ_FREE
   ])
   gl_STDLIB_MODULE_INDICATOR([free-posix])
-  gl_FUNC_FSEEK
-  gl_CONDITIONAL([GL_COND_OBJ_FSEEK], [test $REPLACE_FSEEK = 1])
-  gl_STDIO_MODULE_INDICATOR([fseek])
-  gl_FUNC_FSEEKO
-  gl_CONDITIONAL([GL_COND_OBJ_FSEEKO],
-                 [test $HAVE_FSEEKO = 0 || test $REPLACE_FSEEKO = 1])
-  AM_COND_IF([GL_COND_OBJ_FSEEKO], [
-    gl_PREREQ_FSEEKO
-  ])
-  gl_STDIO_MODULE_INDICATOR([fseeko])
   gl_FUNC_FSTAT
   gl_CONDITIONAL([GL_COND_OBJ_FSTAT], [test $REPLACE_FSTAT = 1])
   AM_COND_IF([GL_COND_OBJ_FSTAT], [
@@ -362,16 +319,6 @@ AC_DEFUN([gl_INIT],
   AM_COND_IF([GL_COND_OBJ_FSUSAGE], [
     gl_PREREQ_FSUSAGE_EXTRA
   ])
-  gl_FUNC_FTELL
-  gl_CONDITIONAL([GL_COND_OBJ_FTELL], [test $REPLACE_FTELL = 1])
-  gl_STDIO_MODULE_INDICATOR([ftell])
-  gl_FUNC_FTELLO
-  gl_CONDITIONAL([GL_COND_OBJ_FTELLO],
-                 [test $HAVE_FTELLO = 0 || test $REPLACE_FTELLO = 1])
-  AM_COND_IF([GL_COND_OBJ_FTELLO], [
-    gl_PREREQ_FTELLO
-  ])
-  gl_STDIO_MODULE_INDICATOR([ftello])
   gl_GETADDRINFO
   gl_CONDITIONAL([GL_COND_OBJ_GETADDRINFO],
                  [test $HAVE_GETADDRINFO = 0 || test $REPLACE_GETADDRINFO = 1])
@@ -470,9 +417,6 @@ AC_DEFUN([gl_INIT],
   gl_LOCALE_MODULE_INDICATOR([localeconv])
   gl_LOCK
   gl_MODULE_INDICATOR([lock])
-  gl_FUNC_LSEEK
-  gl_CONDITIONAL([GL_COND_OBJ_LSEEK], [test $REPLACE_LSEEK = 1])
-  gl_UNISTD_MODULE_INDICATOR([lseek])
   gl_FUNC_MALLOC_GNU
   if test $REPLACE_MALLOC_FOR_MALLOC_GNU = 1; then
     AC_LIBOBJ([malloc])
@@ -978,8 +922,6 @@ AC_DEFUN([gltests_LIBSOURCES], [
 AC_DEFUN([gl_FILE_LIST], [
   build-aux/config.rpath
   lib/_Noreturn.h
-  lib/af_alg.c
-  lib/af_alg.h
   lib/alloca.in.h
   lib/arg-nonnull.h
   lib/arpa_inet.in.h
@@ -992,7 +934,6 @@ AC_DEFUN([gl_FILE_LIST], [
   lib/basename-lgpl.h
   lib/basename.c
   lib/btowc.c
-  lib/byteswap.in.h
   lib/c++defs.h
   lib/calloc.c
   lib/cdefs.h
@@ -1013,7 +954,6 @@ AC_DEFUN([gl_FILE_LIST], [
   lib/fcntl.in.h
   lib/fd-hook.c
   lib/fd-hook.h
-  lib/fflush.c
   lib/filename.h
   lib/float+.h
   lib/float.c
@@ -1021,17 +961,10 @@ AC_DEFUN([gl_FILE_LIST], [
   lib/floor.c
   lib/floorf.c
   lib/fopen.c
-  lib/fpurge.c
-  lib/freading.c
-  lib/freading.h
   lib/free.c
-  lib/fseek.c
-  lib/fseeko.c
   lib/fstat.c
   lib/fsusage.c
   lib/fsusage.h
-  lib/ftell.c
-  lib/ftello.c
   lib/gai_strerror.c
   lib/getaddrinfo.c
   lib/getdelim.c
@@ -1051,7 +984,6 @@ AC_DEFUN([gl_FILE_LIST], [
   lib/getprogname.c
   lib/getprogname.h
   lib/gettext.h
-  lib/gl_openssl.h
   lib/glthread/lock.c
   lib/glthread/lock.h
   lib/glthread/threadlib.c
@@ -1076,7 +1008,6 @@ AC_DEFUN([gl_FILE_LIST], [
   lib/localcharset.h
   lib/locale.in.h
   lib/localeconv.c
-  lib/lseek.c
   lib/malloc.c
   lib/malloc/dynarray-skeleton.c
   lib/malloc/dynarray.h
@@ -1130,9 +1061,6 @@ AC_DEFUN([gl_FILE_LIST], [
   lib/setlocale-lock.c
   lib/setlocale_null.c
   lib/setlocale_null.h
-  lib/sha256-stream.c
-  lib/sha256.c
-  lib/sha256.h
   lib/size_max.h
   lib/snprintf.c
   lib/sockets.c
@@ -1147,7 +1075,6 @@ AC_DEFUN([gl_FILE_LIST], [
   lib/stdckdint.in.h
   lib/stddef.in.h
   lib/stdint.in.h
-  lib/stdio-impl.h
   lib/stdio-read.c
   lib/stdio-write.c
   lib/stdio.in.h
@@ -1165,7 +1092,6 @@ AC_DEFUN([gl_FILE_LIST], [
   lib/strncasecmp.c
   lib/strsep.c
   lib/strstr.c
-  lib/sys-limits.h
   lib/sys_socket.c
   lib/sys_socket.in.h
   lib/sys_stat.in.h
@@ -1207,13 +1133,11 @@ AC_DEFUN([gl_FILE_LIST], [
   m4/00gnulib.m4
   m4/__inline.m4
   m4/absolute-header.m4
-  m4/af_alg.m4
   m4/alloca.m4
   m4/arpa_inet_h.m4
   m4/base64.m4
   m4/btowc.m4
   m4/builtin-expect.m4
-  m4/byteswap.m4
   m4/calloc.m4
   m4/close.m4
   m4/codeset.m4
@@ -1229,20 +1153,13 @@ AC_DEFUN([gl_FILE_LIST], [
   m4/fcntl-o.m4
   m4/fcntl.m4
   m4/fcntl_h.m4
-  m4/fflush.m4
   m4/float_h.m4
   m4/floorf.m4
   m4/fopen.m4
-  m4/fpurge.m4
-  m4/freading.m4
   m4/free.m4
-  m4/fseek.m4
-  m4/fseeko.m4
   m4/fstat.m4
   m4/fstypename.m4
   m4/fsusage.m4
-  m4/ftell.m4
-  m4/ftello.m4
   m4/getaddrinfo.m4
   m4/getdelim.m4
   m4/getdtablesize.m4
@@ -1252,7 +1169,6 @@ AC_DEFUN([gl_FILE_LIST], [
   m4/getopt.m4
   m4/getprogname.m4
   m4/gettext.m4
-  m4/gl-openssl.m4
   m4/gnulib-common.m4
   m4/host-cpu-c-abi.m4
   m4/hostent.m4
@@ -1278,7 +1194,6 @@ AC_DEFUN([gl_FILE_LIST], [
   m4/locale_h.m4
   m4/localeconv.m4
   m4/lock.m4
-  m4/lseek.m4
   m4/malloc.m4
   m4/malloca.m4
   m4/math_h.m4
@@ -1316,7 +1231,6 @@ AC_DEFUN([gl_FILE_LIST], [
   m4/servent.m4
   m4/setenv.m4
   m4/setlocale_null.m4
-  m4/sha256.m4
   m4/size_max.m4
   m4/snprintf.m4
   m4/socketlib.m4
@@ -1349,7 +1263,6 @@ AC_DEFUN([gl_FILE_LIST], [
   m4/time_h.m4
   m4/time_r.m4
   m4/timegm.m4
-  m4/ungetc.m4
   m4/unistd_h.m4
   m4/unlocked-io.m4
   m4/vararrays.m4
diff --git a/gl/m4/lseek.m4 b/gl/m4/lseek.m4
deleted file mode 100644
index 0583511..0000000
--- a/gl/m4/lseek.m4
+++ /dev/null
@@ -1,78 +0,0 @@
-# lseek.m4 serial 12
-dnl Copyright (C) 2007, 2009-2022 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_LSEEK],
-[
-  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
-
-  AC_REQUIRE([AC_CANONICAL_HOST])
-  AC_REQUIRE([AC_PROG_CC])
-  AC_CHECK_HEADERS_ONCE([unistd.h])
-  AC_CACHE_CHECK([whether lseek detects pipes], [gl_cv_func_lseek_pipe],
-    [case "$host_os" in
-       mingw*)
-         dnl Native Windows.
-         dnl The result of lseek (fd, (off_t)0, SEEK_CUR) or
-         dnl SetFilePointer(handle, 0, NULL, FILE_CURRENT)
-         dnl for a pipe depends on the environment: In a Cygwin 1.5
-         dnl environment it succeeds (wrong); in a Cygwin 1.7 environment
-         dnl it fails with a wrong errno value.
-         gl_cv_func_lseek_pipe=no
-         ;;
-       *)
-         if test $cross_compiling = no; then
-           AC_LINK_IFELSE([AC_LANG_PROGRAM([[
-#include <sys/types.h> /* for off_t */
-#include <stdio.h> /* for SEEK_CUR */
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#else /* on Windows with MSVC */
-# include <io.h>
-#endif
-]GL_MDA_DEFINES],
-[[
-  /* Exit with success only if stdin is seekable.  */
-  return lseek (0, (off_t)0, SEEK_CUR) < 0;
-]])],
-             [if test -s conftest$ac_exeext \
-                 && ./conftest$ac_exeext < conftest.$ac_ext \
-                 && test 1 = "`echo hi \
-                   | { ./conftest$ac_exeext; echo $?; cat >/dev/null; }`"; then
-                gl_cv_func_lseek_pipe=yes
-              else
-                gl_cv_func_lseek_pipe=no
-              fi
-             ],
-             [gl_cv_func_lseek_pipe=no])
-         else
-           AC_COMPILE_IFELSE(
-             [AC_LANG_SOURCE([[
-#if defined __BEOS__
-/* BeOS mistakenly return 0 when trying to seek on pipes.  */
-  Choke me.
-#endif]])],
-             [gl_cv_func_lseek_pipe=yes], [gl_cv_func_lseek_pipe=no])
-         fi
-         ;;
-     esac
-    ])
-  if test "$gl_cv_func_lseek_pipe" = no; then
-    REPLACE_LSEEK=1
-    AC_DEFINE([LSEEK_PIPE_BROKEN], [1],
-      [Define to 1 if lseek does not detect pipes.])
-  fi
-
-  AC_REQUIRE([gl_SYS_TYPES_H])
-  if test $WINDOWS_64_BIT_OFF_T = 1; then
-    REPLACE_LSEEK=1
-  fi
-
-  dnl macOS SEEK_DATA is incompatible with other platforms.
-  case $host_os in
-    darwin*)
-      REPLACE_LSEEK=1;;
-  esac
-])
diff --git a/gl/m4/sha256.m4 b/gl/m4/sha256.m4
deleted file mode 100644
index b3d8f92..0000000
--- a/gl/m4/sha256.m4
+++ /dev/null
@@ -1,14 +0,0 @@
-# sha256.m4 serial 8
-dnl Copyright (C) 2005, 2008-2022 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_SHA256],
-[
-  dnl Prerequisites of lib/sha256.c.
-  AC_REQUIRE([gl_BIGENDIAN])
-
-  dnl Determine HAVE_OPENSSL_SHA256 and LIB_CRYPTO
-  gl_CRYPTO_CHECK([SHA256])
-])
diff --git a/gl/m4/ungetc.m4 b/gl/m4/ungetc.m4
deleted file mode 100644
index 12a1099..0000000
--- a/gl/m4/ungetc.m4
+++ /dev/null
@@ -1,73 +0,0 @@
-# ungetc.m4 serial 10
-dnl Copyright (C) 2009-2022 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_FUNC_UNGETC_WORKS],
-[
-  AC_REQUIRE([AC_PROG_CC])
-  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
-
-  AC_CACHE_CHECK([whether ungetc works on arbitrary bytes],
-    [gl_cv_func_ungetc_works],
-    [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
-#include <stdio.h>
-      ]], [[FILE *f;
-            if (!(f = fopen ("conftest.tmp", "w+")))
-              return 1;
-            if (fputs ("abc", f) < 0)
-              { fclose (f); return 2; }
-            rewind (f);
-            if (fgetc (f) != 'a')
-              { fclose (f); return 3; }
-            if (fgetc (f) != 'b')
-              { fclose (f); return 4; }
-            if (ungetc ('d', f) != 'd')
-              { fclose (f); return 5; }
-            if (ftell (f) != 1)
-              { fclose (f); return 6; }
-            if (fgetc (f) != 'd')
-              { fclose (f); return 7; }
-            if (ftell (f) != 2)
-              { fclose (f); return 8; }
-            if (fseek (f, 0, SEEK_CUR) != 0)
-              { fclose (f); return 9; }
-            if (ftell (f) != 2)
-              { fclose (f); return 10; }
-            if (fgetc (f) != 'c')
-              { fclose (f); return 11; }
-            fclose (f);
-            remove ("conftest.tmp");
-          ]])],
-        [gl_cv_func_ungetc_works=yes], [gl_cv_func_ungetc_works=no],
-        [case "$host_os" in
-                          # Guess yes on glibc systems.
-           *-gnu* | gnu*) gl_cv_func_ungetc_works="guessing yes" ;;
-                          # Guess yes on musl systems.
-           *-musl*)       gl_cv_func_ungetc_works="guessing yes" ;;
-                          # Guess yes on bionic systems.
-           *-android*)    gl_cv_func_ungetc_works="guessing yes" ;;
-                          # Guess yes on native Windows.
-           mingw*)        gl_cv_func_ungetc_works="guessing yes" ;;
-                          # If we don't know, obey --enable-cross-guesses.
-           *)             gl_cv_func_ungetc_works="$gl_cross_guess_normal" ;;
-         esac
-        ])
-    ])
-  gl_ftello_broken_after_ungetc=no
-  case "$gl_cv_func_ungetc_works" in
-    *yes) ;;
-    *)
-      dnl On macOS >= 10.15, where the above program fails with exit code 6,
-      dnl we fix it through an ftello override.
-      case "$host_os" in
-        darwin*) gl_ftello_broken_after_ungetc=yes ;;
-        *)
-          AC_DEFINE([FUNC_UNGETC_BROKEN], [1],
-            [Define to 1 if ungetc is broken when used on arbitrary bytes.])
-          ;;
-      esac
-      ;;
-  esac
-])
diff --git a/gl/malloc/.deps/.dirstamp b/gl/malloc/.deps/.dirstamp
new file mode 100644
index 0000000..e69de29
diff --git a/gl/malloc/.deps/libgnu_a-dynarray-skeleton.Po b/gl/malloc/.deps/libgnu_a-dynarray-skeleton.Po
new file mode 100644
index 0000000..9ce06a8
--- /dev/null
+++ b/gl/malloc/.deps/libgnu_a-dynarray-skeleton.Po
@@ -0,0 +1 @@
+# dummy
diff --git a/gl/malloc/.deps/libgnu_a-dynarray_at_failure.Po b/gl/malloc/.deps/libgnu_a-dynarray_at_failure.Po
new file mode 100644
index 0000000..82befdb
--- /dev/null
+++ b/gl/malloc/.deps/libgnu_a-dynarray_at_failure.Po
@@ -0,0 +1,138 @@
+malloc/libgnu_a-dynarray_at_failure.o: malloc/dynarray_at_failure.c \
+ /usr/include/stdc-predef.h libc-config.h ../config.h \
+ /usr/include/errno.h /usr/include/features.h \
+ /usr/include/features-time64.h \
+ /usr/include/x86_64-linux-gnu/bits/wordsize.h \
+ /usr/include/x86_64-linux-gnu/bits/timesize.h \
+ /usr/include/x86_64-linux-gnu/sys/cdefs.h \
+ /usr/include/x86_64-linux-gnu/bits/long-double.h \
+ /usr/include/x86_64-linux-gnu/gnu/stubs.h \
+ /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \
+ /usr/include/x86_64-linux-gnu/bits/errno.h /usr/include/linux/errno.h \
+ /usr/include/x86_64-linux-gnu/asm/errno.h \
+ /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \
+ /usr/include/x86_64-linux-gnu/bits/types/error_t.h cdefs.h stdlib.h \
+ /usr/include/stdlib.h \
+ /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \
+ /usr/lib/gcc/x86_64-linux-gnu/12/include/stddef.h \
+ /usr/include/x86_64-linux-gnu/bits/waitflags.h \
+ /usr/include/x86_64-linux-gnu/bits/waitstatus.h \
+ /usr/include/x86_64-linux-gnu/bits/floatn.h \
+ /usr/include/x86_64-linux-gnu/bits/floatn-common.h \
+ /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h sys/types.h \
+ /usr/include/x86_64-linux-gnu/sys/types.h \
+ /usr/include/x86_64-linux-gnu/bits/types.h \
+ /usr/include/x86_64-linux-gnu/bits/typesizes.h \
+ /usr/include/x86_64-linux-gnu/bits/time64.h \
+ /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/time_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \
+ /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/endian.h \
+ /usr/include/x86_64-linux-gnu/bits/endian.h \
+ /usr/include/x86_64-linux-gnu/bits/endianness.h \
+ /usr/include/x86_64-linux-gnu/bits/byteswap.h \
+ /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \
+ /usr/include/x86_64-linux-gnu/sys/select.h \
+ /usr/include/x86_64-linux-gnu/bits/select.h \
+ /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \
+ /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \
+ /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \
+ /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \
+ /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \
+ /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \
+ /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h alloca.h \
+ /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \
+ /usr/include/x86_64-linux-gnu/bits/stdlib-float.h dynarray.h \
+ malloc/dynarray.h stdbool.h string.h /usr/include/string.h strings.h \
+ /usr/include/strings.h stdio.h /usr/include/stdio.h \
+ /usr/lib/gcc/x86_64-linux-gnu/12/include/stdarg.h \
+ /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \
+ /usr/include/x86_64-linux-gnu/bits/types/FILE.h \
+ /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \
+ /usr/include/x86_64-linux-gnu/bits/types/cookie_io_functions_t.h \
+ /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \
+ /usr/include/x86_64-linux-gnu/bits/stdio.h
+/usr/include/stdc-predef.h:
+libc-config.h:
+../config.h:
+/usr/include/errno.h:
+/usr/include/features.h:
+/usr/include/features-time64.h:
+/usr/include/x86_64-linux-gnu/bits/wordsize.h:
+/usr/include/x86_64-linux-gnu/bits/timesize.h:
+/usr/include/x86_64-linux-gnu/sys/cdefs.h:
+/usr/include/x86_64-linux-gnu/bits/long-double.h:
+/usr/include/x86_64-linux-gnu/gnu/stubs.h:
+/usr/include/x86_64-linux-gnu/gnu/stubs-64.h:
+/usr/include/x86_64-linux-gnu/bits/errno.h:
+/usr/include/linux/errno.h:
+/usr/include/x86_64-linux-gnu/asm/errno.h:
+/usr/include/asm-generic/errno.h:
+/usr/include/asm-generic/errno-base.h:
+/usr/include/x86_64-linux-gnu/bits/types/error_t.h:
+cdefs.h:
+stdlib.h:
+/usr/include/stdlib.h:
+/usr/include/x86_64-linux-gnu/bits/libc-header-start.h:
+/usr/lib/gcc/x86_64-linux-gnu/12/include/stddef.h:
+/usr/include/x86_64-linux-gnu/bits/waitflags.h:
+/usr/include/x86_64-linux-gnu/bits/waitstatus.h:
+/usr/include/x86_64-linux-gnu/bits/floatn.h:
+/usr/include/x86_64-linux-gnu/bits/floatn-common.h:
+/usr/include/x86_64-linux-gnu/bits/types/locale_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h:
+sys/types.h:
+/usr/include/x86_64-linux-gnu/sys/types.h:
+/usr/include/x86_64-linux-gnu/bits/types.h:
+/usr/include/x86_64-linux-gnu/bits/typesizes.h:
+/usr/include/x86_64-linux-gnu/bits/time64.h:
+/usr/include/x86_64-linux-gnu/bits/types/clock_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/time_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/timer_t.h:
+/usr/include/x86_64-linux-gnu/bits/stdint-intn.h:
+/usr/include/endian.h:
+/usr/include/x86_64-linux-gnu/bits/endian.h:
+/usr/include/x86_64-linux-gnu/bits/endianness.h:
+/usr/include/x86_64-linux-gnu/bits/byteswap.h:
+/usr/include/x86_64-linux-gnu/bits/uintn-identity.h:
+/usr/include/x86_64-linux-gnu/sys/select.h:
+/usr/include/x86_64-linux-gnu/bits/select.h:
+/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h:
+/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h:
+/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h:
+/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h:
+/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h:
+/usr/include/x86_64-linux-gnu/bits/struct_mutex.h:
+/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h:
+alloca.h:
+/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h:
+/usr/include/x86_64-linux-gnu/bits/stdlib-float.h:
+dynarray.h:
+malloc/dynarray.h:
+stdbool.h:
+string.h:
+/usr/include/string.h:
+strings.h:
+/usr/include/strings.h:
+stdio.h:
+/usr/include/stdio.h:
+/usr/lib/gcc/x86_64-linux-gnu/12/include/stdarg.h:
+/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/__FILE.h:
+/usr/include/x86_64-linux-gnu/bits/types/FILE.h:
+/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h:
+/usr/include/x86_64-linux-gnu/bits/types/cookie_io_functions_t.h:
+/usr/include/x86_64-linux-gnu/bits/stdio_lim.h:
+/usr/include/x86_64-linux-gnu/bits/stdio.h:
diff --git a/gl/malloc/.deps/libgnu_a-dynarray_emplace_enlarge.Po b/gl/malloc/.deps/libgnu_a-dynarray_emplace_enlarge.Po
new file mode 100644
index 0000000..d75417a
--- /dev/null
+++ b/gl/malloc/.deps/libgnu_a-dynarray_emplace_enlarge.Po
@@ -0,0 +1,138 @@
+malloc/libgnu_a-dynarray_emplace_enlarge.o: \
+ malloc/dynarray_emplace_enlarge.c /usr/include/stdc-predef.h \
+ libc-config.h ../config.h /usr/include/errno.h /usr/include/features.h \
+ /usr/include/features-time64.h \
+ /usr/include/x86_64-linux-gnu/bits/wordsize.h \
+ /usr/include/x86_64-linux-gnu/bits/timesize.h \
+ /usr/include/x86_64-linux-gnu/sys/cdefs.h \
+ /usr/include/x86_64-linux-gnu/bits/long-double.h \
+ /usr/include/x86_64-linux-gnu/gnu/stubs.h \
+ /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \
+ /usr/include/x86_64-linux-gnu/bits/errno.h /usr/include/linux/errno.h \
+ /usr/include/x86_64-linux-gnu/asm/errno.h \
+ /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \
+ /usr/include/x86_64-linux-gnu/bits/types/error_t.h cdefs.h dynarray.h \
+ malloc/dynarray.h stdbool.h \
+ /usr/lib/gcc/x86_64-linux-gnu/12/include/stddef.h string.h \
+ /usr/include/string.h \
+ /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \
+ /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h strings.h \
+ /usr/include/strings.h intprops.h intprops-internal.h limits.h \
+ /usr/lib/gcc/x86_64-linux-gnu/12/include/limits.h \
+ /usr/lib/gcc/x86_64-linux-gnu/12/include/syslimits.h \
+ /usr/include/limits.h /usr/include/x86_64-linux-gnu/bits/posix1_lim.h \
+ /usr/include/x86_64-linux-gnu/bits/local_lim.h \
+ /usr/include/linux/limits.h \
+ /usr/include/x86_64-linux-gnu/bits/pthread_stack_min-dynamic.h \
+ /usr/include/x86_64-linux-gnu/bits/posix2_lim.h \
+ /usr/include/x86_64-linux-gnu/bits/xopen_lim.h \
+ /usr/include/x86_64-linux-gnu/bits/uio_lim.h stdlib.h \
+ /usr/include/stdlib.h /usr/include/x86_64-linux-gnu/bits/waitflags.h \
+ /usr/include/x86_64-linux-gnu/bits/waitstatus.h \
+ /usr/include/x86_64-linux-gnu/bits/floatn.h \
+ /usr/include/x86_64-linux-gnu/bits/floatn-common.h sys/types.h \
+ /usr/include/x86_64-linux-gnu/sys/types.h \
+ /usr/include/x86_64-linux-gnu/bits/types.h \
+ /usr/include/x86_64-linux-gnu/bits/typesizes.h \
+ /usr/include/x86_64-linux-gnu/bits/time64.h \
+ /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/time_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \
+ /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/endian.h \
+ /usr/include/x86_64-linux-gnu/bits/endian.h \
+ /usr/include/x86_64-linux-gnu/bits/endianness.h \
+ /usr/include/x86_64-linux-gnu/bits/byteswap.h \
+ /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \
+ /usr/include/x86_64-linux-gnu/sys/select.h \
+ /usr/include/x86_64-linux-gnu/bits/select.h \
+ /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \
+ /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \
+ /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \
+ /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \
+ /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \
+ /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \
+ /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h alloca.h \
+ /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \
+ /usr/include/x86_64-linux-gnu/bits/stdlib-float.h
+/usr/include/stdc-predef.h:
+libc-config.h:
+../config.h:
+/usr/include/errno.h:
+/usr/include/features.h:
+/usr/include/features-time64.h:
+/usr/include/x86_64-linux-gnu/bits/wordsize.h:
+/usr/include/x86_64-linux-gnu/bits/timesize.h:
+/usr/include/x86_64-linux-gnu/sys/cdefs.h:
+/usr/include/x86_64-linux-gnu/bits/long-double.h:
+/usr/include/x86_64-linux-gnu/gnu/stubs.h:
+/usr/include/x86_64-linux-gnu/gnu/stubs-64.h:
+/usr/include/x86_64-linux-gnu/bits/errno.h:
+/usr/include/linux/errno.h:
+/usr/include/x86_64-linux-gnu/asm/errno.h:
+/usr/include/asm-generic/errno.h:
+/usr/include/asm-generic/errno-base.h:
+/usr/include/x86_64-linux-gnu/bits/types/error_t.h:
+cdefs.h:
+dynarray.h:
+malloc/dynarray.h:
+stdbool.h:
+/usr/lib/gcc/x86_64-linux-gnu/12/include/stddef.h:
+string.h:
+/usr/include/string.h:
+/usr/include/x86_64-linux-gnu/bits/libc-header-start.h:
+/usr/include/x86_64-linux-gnu/bits/types/locale_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h:
+strings.h:
+/usr/include/strings.h:
+intprops.h:
+intprops-internal.h:
+limits.h:
+/usr/lib/gcc/x86_64-linux-gnu/12/include/limits.h:
+/usr/lib/gcc/x86_64-linux-gnu/12/include/syslimits.h:
+/usr/include/limits.h:
+/usr/include/x86_64-linux-gnu/bits/posix1_lim.h:
+/usr/include/x86_64-linux-gnu/bits/local_lim.h:
+/usr/include/linux/limits.h:
+/usr/include/x86_64-linux-gnu/bits/pthread_stack_min-dynamic.h:
+/usr/include/x86_64-linux-gnu/bits/posix2_lim.h:
+/usr/include/x86_64-linux-gnu/bits/xopen_lim.h:
+/usr/include/x86_64-linux-gnu/bits/uio_lim.h:
+stdlib.h:
+/usr/include/stdlib.h:
+/usr/include/x86_64-linux-gnu/bits/waitflags.h:
+/usr/include/x86_64-linux-gnu/bits/waitstatus.h:
+/usr/include/x86_64-linux-gnu/bits/floatn.h:
+/usr/include/x86_64-linux-gnu/bits/floatn-common.h:
+sys/types.h:
+/usr/include/x86_64-linux-gnu/sys/types.h:
+/usr/include/x86_64-linux-gnu/bits/types.h:
+/usr/include/x86_64-linux-gnu/bits/typesizes.h:
+/usr/include/x86_64-linux-gnu/bits/time64.h:
+/usr/include/x86_64-linux-gnu/bits/types/clock_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/time_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/timer_t.h:
+/usr/include/x86_64-linux-gnu/bits/stdint-intn.h:
+/usr/include/endian.h:
+/usr/include/x86_64-linux-gnu/bits/endian.h:
+/usr/include/x86_64-linux-gnu/bits/endianness.h:
+/usr/include/x86_64-linux-gnu/bits/byteswap.h:
+/usr/include/x86_64-linux-gnu/bits/uintn-identity.h:
+/usr/include/x86_64-linux-gnu/sys/select.h:
+/usr/include/x86_64-linux-gnu/bits/select.h:
+/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h:
+/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h:
+/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h:
+/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h:
+/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h:
+/usr/include/x86_64-linux-gnu/bits/struct_mutex.h:
+/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h:
+alloca.h:
+/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h:
+/usr/include/x86_64-linux-gnu/bits/stdlib-float.h:
diff --git a/gl/malloc/.deps/libgnu_a-dynarray_finalize.Po b/gl/malloc/.deps/libgnu_a-dynarray_finalize.Po
new file mode 100644
index 0000000..5acee05
--- /dev/null
+++ b/gl/malloc/.deps/libgnu_a-dynarray_finalize.Po
@@ -0,0 +1,116 @@
+malloc/libgnu_a-dynarray_finalize.o: malloc/dynarray_finalize.c \
+ /usr/include/stdc-predef.h libc-config.h ../config.h \
+ /usr/include/errno.h /usr/include/features.h \
+ /usr/include/features-time64.h \
+ /usr/include/x86_64-linux-gnu/bits/wordsize.h \
+ /usr/include/x86_64-linux-gnu/bits/timesize.h \
+ /usr/include/x86_64-linux-gnu/sys/cdefs.h \
+ /usr/include/x86_64-linux-gnu/bits/long-double.h \
+ /usr/include/x86_64-linux-gnu/gnu/stubs.h \
+ /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \
+ /usr/include/x86_64-linux-gnu/bits/errno.h /usr/include/linux/errno.h \
+ /usr/include/x86_64-linux-gnu/asm/errno.h \
+ /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \
+ /usr/include/x86_64-linux-gnu/bits/types/error_t.h cdefs.h dynarray.h \
+ malloc/dynarray.h stdbool.h \
+ /usr/lib/gcc/x86_64-linux-gnu/12/include/stddef.h string.h \
+ /usr/include/string.h \
+ /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \
+ /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h strings.h \
+ /usr/include/strings.h stdlib.h /usr/include/stdlib.h \
+ /usr/include/x86_64-linux-gnu/bits/waitflags.h \
+ /usr/include/x86_64-linux-gnu/bits/waitstatus.h \
+ /usr/include/x86_64-linux-gnu/bits/floatn.h \
+ /usr/include/x86_64-linux-gnu/bits/floatn-common.h sys/types.h \
+ /usr/include/x86_64-linux-gnu/sys/types.h \
+ /usr/include/x86_64-linux-gnu/bits/types.h \
+ /usr/include/x86_64-linux-gnu/bits/typesizes.h \
+ /usr/include/x86_64-linux-gnu/bits/time64.h \
+ /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/time_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \
+ /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/endian.h \
+ /usr/include/x86_64-linux-gnu/bits/endian.h \
+ /usr/include/x86_64-linux-gnu/bits/endianness.h \
+ /usr/include/x86_64-linux-gnu/bits/byteswap.h \
+ /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \
+ /usr/include/x86_64-linux-gnu/sys/select.h \
+ /usr/include/x86_64-linux-gnu/bits/select.h \
+ /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \
+ /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \
+ /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \
+ /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \
+ /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \
+ /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \
+ /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h alloca.h \
+ /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \
+ /usr/include/x86_64-linux-gnu/bits/stdlib-float.h
+/usr/include/stdc-predef.h:
+libc-config.h:
+../config.h:
+/usr/include/errno.h:
+/usr/include/features.h:
+/usr/include/features-time64.h:
+/usr/include/x86_64-linux-gnu/bits/wordsize.h:
+/usr/include/x86_64-linux-gnu/bits/timesize.h:
+/usr/include/x86_64-linux-gnu/sys/cdefs.h:
+/usr/include/x86_64-linux-gnu/bits/long-double.h:
+/usr/include/x86_64-linux-gnu/gnu/stubs.h:
+/usr/include/x86_64-linux-gnu/gnu/stubs-64.h:
+/usr/include/x86_64-linux-gnu/bits/errno.h:
+/usr/include/linux/errno.h:
+/usr/include/x86_64-linux-gnu/asm/errno.h:
+/usr/include/asm-generic/errno.h:
+/usr/include/asm-generic/errno-base.h:
+/usr/include/x86_64-linux-gnu/bits/types/error_t.h:
+cdefs.h:
+dynarray.h:
+malloc/dynarray.h:
+stdbool.h:
+/usr/lib/gcc/x86_64-linux-gnu/12/include/stddef.h:
+string.h:
+/usr/include/string.h:
+/usr/include/x86_64-linux-gnu/bits/libc-header-start.h:
+/usr/include/x86_64-linux-gnu/bits/types/locale_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h:
+strings.h:
+/usr/include/strings.h:
+stdlib.h:
+/usr/include/stdlib.h:
+/usr/include/x86_64-linux-gnu/bits/waitflags.h:
+/usr/include/x86_64-linux-gnu/bits/waitstatus.h:
+/usr/include/x86_64-linux-gnu/bits/floatn.h:
+/usr/include/x86_64-linux-gnu/bits/floatn-common.h:
+sys/types.h:
+/usr/include/x86_64-linux-gnu/sys/types.h:
+/usr/include/x86_64-linux-gnu/bits/types.h:
+/usr/include/x86_64-linux-gnu/bits/typesizes.h:
+/usr/include/x86_64-linux-gnu/bits/time64.h:
+/usr/include/x86_64-linux-gnu/bits/types/clock_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/time_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/timer_t.h:
+/usr/include/x86_64-linux-gnu/bits/stdint-intn.h:
+/usr/include/endian.h:
+/usr/include/x86_64-linux-gnu/bits/endian.h:
+/usr/include/x86_64-linux-gnu/bits/endianness.h:
+/usr/include/x86_64-linux-gnu/bits/byteswap.h:
+/usr/include/x86_64-linux-gnu/bits/uintn-identity.h:
+/usr/include/x86_64-linux-gnu/sys/select.h:
+/usr/include/x86_64-linux-gnu/bits/select.h:
+/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h:
+/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h:
+/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h:
+/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h:
+/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h:
+/usr/include/x86_64-linux-gnu/bits/struct_mutex.h:
+/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h:
+alloca.h:
+/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h:
+/usr/include/x86_64-linux-gnu/bits/stdlib-float.h:
diff --git a/gl/malloc/.deps/libgnu_a-dynarray_resize.Po b/gl/malloc/.deps/libgnu_a-dynarray_resize.Po
new file mode 100644
index 0000000..2ab00d0
--- /dev/null
+++ b/gl/malloc/.deps/libgnu_a-dynarray_resize.Po
@@ -0,0 +1,138 @@
+malloc/libgnu_a-dynarray_resize.o: malloc/dynarray_resize.c \
+ /usr/include/stdc-predef.h libc-config.h ../config.h \
+ /usr/include/errno.h /usr/include/features.h \
+ /usr/include/features-time64.h \
+ /usr/include/x86_64-linux-gnu/bits/wordsize.h \
+ /usr/include/x86_64-linux-gnu/bits/timesize.h \
+ /usr/include/x86_64-linux-gnu/sys/cdefs.h \
+ /usr/include/x86_64-linux-gnu/bits/long-double.h \
+ /usr/include/x86_64-linux-gnu/gnu/stubs.h \
+ /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \
+ /usr/include/x86_64-linux-gnu/bits/errno.h /usr/include/linux/errno.h \
+ /usr/include/x86_64-linux-gnu/asm/errno.h \
+ /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \
+ /usr/include/x86_64-linux-gnu/bits/types/error_t.h cdefs.h dynarray.h \
+ malloc/dynarray.h stdbool.h \
+ /usr/lib/gcc/x86_64-linux-gnu/12/include/stddef.h string.h \
+ /usr/include/string.h \
+ /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \
+ /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h strings.h \
+ /usr/include/strings.h intprops.h intprops-internal.h limits.h \
+ /usr/lib/gcc/x86_64-linux-gnu/12/include/limits.h \
+ /usr/lib/gcc/x86_64-linux-gnu/12/include/syslimits.h \
+ /usr/include/limits.h /usr/include/x86_64-linux-gnu/bits/posix1_lim.h \
+ /usr/include/x86_64-linux-gnu/bits/local_lim.h \
+ /usr/include/linux/limits.h \
+ /usr/include/x86_64-linux-gnu/bits/pthread_stack_min-dynamic.h \
+ /usr/include/x86_64-linux-gnu/bits/posix2_lim.h \
+ /usr/include/x86_64-linux-gnu/bits/xopen_lim.h \
+ /usr/include/x86_64-linux-gnu/bits/uio_lim.h stdlib.h \
+ /usr/include/stdlib.h /usr/include/x86_64-linux-gnu/bits/waitflags.h \
+ /usr/include/x86_64-linux-gnu/bits/waitstatus.h \
+ /usr/include/x86_64-linux-gnu/bits/floatn.h \
+ /usr/include/x86_64-linux-gnu/bits/floatn-common.h sys/types.h \
+ /usr/include/x86_64-linux-gnu/sys/types.h \
+ /usr/include/x86_64-linux-gnu/bits/types.h \
+ /usr/include/x86_64-linux-gnu/bits/typesizes.h \
+ /usr/include/x86_64-linux-gnu/bits/time64.h \
+ /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/time_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \
+ /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/endian.h \
+ /usr/include/x86_64-linux-gnu/bits/endian.h \
+ /usr/include/x86_64-linux-gnu/bits/endianness.h \
+ /usr/include/x86_64-linux-gnu/bits/byteswap.h \
+ /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \
+ /usr/include/x86_64-linux-gnu/sys/select.h \
+ /usr/include/x86_64-linux-gnu/bits/select.h \
+ /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \
+ /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \
+ /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \
+ /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \
+ /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \
+ /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \
+ /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h alloca.h \
+ /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \
+ /usr/include/x86_64-linux-gnu/bits/stdlib-float.h
+/usr/include/stdc-predef.h:
+libc-config.h:
+../config.h:
+/usr/include/errno.h:
+/usr/include/features.h:
+/usr/include/features-time64.h:
+/usr/include/x86_64-linux-gnu/bits/wordsize.h:
+/usr/include/x86_64-linux-gnu/bits/timesize.h:
+/usr/include/x86_64-linux-gnu/sys/cdefs.h:
+/usr/include/x86_64-linux-gnu/bits/long-double.h:
+/usr/include/x86_64-linux-gnu/gnu/stubs.h:
+/usr/include/x86_64-linux-gnu/gnu/stubs-64.h:
+/usr/include/x86_64-linux-gnu/bits/errno.h:
+/usr/include/linux/errno.h:
+/usr/include/x86_64-linux-gnu/asm/errno.h:
+/usr/include/asm-generic/errno.h:
+/usr/include/asm-generic/errno-base.h:
+/usr/include/x86_64-linux-gnu/bits/types/error_t.h:
+cdefs.h:
+dynarray.h:
+malloc/dynarray.h:
+stdbool.h:
+/usr/lib/gcc/x86_64-linux-gnu/12/include/stddef.h:
+string.h:
+/usr/include/string.h:
+/usr/include/x86_64-linux-gnu/bits/libc-header-start.h:
+/usr/include/x86_64-linux-gnu/bits/types/locale_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h:
+strings.h:
+/usr/include/strings.h:
+intprops.h:
+intprops-internal.h:
+limits.h:
+/usr/lib/gcc/x86_64-linux-gnu/12/include/limits.h:
+/usr/lib/gcc/x86_64-linux-gnu/12/include/syslimits.h:
+/usr/include/limits.h:
+/usr/include/x86_64-linux-gnu/bits/posix1_lim.h:
+/usr/include/x86_64-linux-gnu/bits/local_lim.h:
+/usr/include/linux/limits.h:
+/usr/include/x86_64-linux-gnu/bits/pthread_stack_min-dynamic.h:
+/usr/include/x86_64-linux-gnu/bits/posix2_lim.h:
+/usr/include/x86_64-linux-gnu/bits/xopen_lim.h:
+/usr/include/x86_64-linux-gnu/bits/uio_lim.h:
+stdlib.h:
+/usr/include/stdlib.h:
+/usr/include/x86_64-linux-gnu/bits/waitflags.h:
+/usr/include/x86_64-linux-gnu/bits/waitstatus.h:
+/usr/include/x86_64-linux-gnu/bits/floatn.h:
+/usr/include/x86_64-linux-gnu/bits/floatn-common.h:
+sys/types.h:
+/usr/include/x86_64-linux-gnu/sys/types.h:
+/usr/include/x86_64-linux-gnu/bits/types.h:
+/usr/include/x86_64-linux-gnu/bits/typesizes.h:
+/usr/include/x86_64-linux-gnu/bits/time64.h:
+/usr/include/x86_64-linux-gnu/bits/types/clock_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/time_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/timer_t.h:
+/usr/include/x86_64-linux-gnu/bits/stdint-intn.h:
+/usr/include/endian.h:
+/usr/include/x86_64-linux-gnu/bits/endian.h:
+/usr/include/x86_64-linux-gnu/bits/endianness.h:
+/usr/include/x86_64-linux-gnu/bits/byteswap.h:
+/usr/include/x86_64-linux-gnu/bits/uintn-identity.h:
+/usr/include/x86_64-linux-gnu/sys/select.h:
+/usr/include/x86_64-linux-gnu/bits/select.h:
+/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h:
+/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h:
+/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h:
+/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h:
+/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h:
+/usr/include/x86_64-linux-gnu/bits/struct_mutex.h:
+/usr/include/x86_64-linux-gnu/bits/struct_rwlock.h:
+alloca.h:
+/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h:
+/usr/include/x86_64-linux-gnu/bits/stdlib-float.h:
diff --git a/gl/malloc/.deps/libgnu_a-dynarray_resize_clear.Po b/gl/malloc/.deps/libgnu_a-dynarray_resize_clear.Po
new file mode 100644
index 0000000..5af37ac
--- /dev/null
+++ b/gl/malloc/.deps/libgnu_a-dynarray_resize_clear.Po
@@ -0,0 +1,51 @@
+malloc/libgnu_a-dynarray_resize_clear.o: malloc/dynarray_resize_clear.c \
+ /usr/include/stdc-predef.h libc-config.h ../config.h \
+ /usr/include/errno.h /usr/include/features.h \
+ /usr/include/features-time64.h \
+ /usr/include/x86_64-linux-gnu/bits/wordsize.h \
+ /usr/include/x86_64-linux-gnu/bits/timesize.h \
+ /usr/include/x86_64-linux-gnu/sys/cdefs.h \
+ /usr/include/x86_64-linux-gnu/bits/long-double.h \
+ /usr/include/x86_64-linux-gnu/gnu/stubs.h \
+ /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \
+ /usr/include/x86_64-linux-gnu/bits/errno.h /usr/include/linux/errno.h \
+ /usr/include/x86_64-linux-gnu/asm/errno.h \
+ /usr/include/asm-generic/errno.h /usr/include/asm-generic/errno-base.h \
+ /usr/include/x86_64-linux-gnu/bits/types/error_t.h cdefs.h dynarray.h \
+ malloc/dynarray.h stdbool.h \
+ /usr/lib/gcc/x86_64-linux-gnu/12/include/stddef.h string.h \
+ /usr/include/string.h \
+ /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \
+ /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \
+ /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h strings.h \
+ /usr/include/strings.h
+/usr/include/stdc-predef.h:
+libc-config.h:
+../config.h:
+/usr/include/errno.h:
+/usr/include/features.h:
+/usr/include/features-time64.h:
+/usr/include/x86_64-linux-gnu/bits/wordsize.h:
+/usr/include/x86_64-linux-gnu/bits/timesize.h:
+/usr/include/x86_64-linux-gnu/sys/cdefs.h:
+/usr/include/x86_64-linux-gnu/bits/long-double.h:
+/usr/include/x86_64-linux-gnu/gnu/stubs.h:
+/usr/include/x86_64-linux-gnu/gnu/stubs-64.h:
+/usr/include/x86_64-linux-gnu/bits/errno.h:
+/usr/include/linux/errno.h:
+/usr/include/x86_64-linux-gnu/asm/errno.h:
+/usr/include/asm-generic/errno.h:
+/usr/include/asm-generic/errno-base.h:
+/usr/include/x86_64-linux-gnu/bits/types/error_t.h:
+cdefs.h:
+dynarray.h:
+malloc/dynarray.h:
+stdbool.h:
+/usr/lib/gcc/x86_64-linux-gnu/12/include/stddef.h:
+string.h:
+/usr/include/string.h:
+/usr/include/x86_64-linux-gnu/bits/libc-header-start.h:
+/usr/include/x86_64-linux-gnu/bits/types/locale_t.h:
+/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h:
+strings.h:
+/usr/include/strings.h:
diff --git a/gl/malloc/.dirstamp b/gl/malloc/.dirstamp
new file mode 100644
index 0000000..e69de29
diff --git a/gl/malloc/dynarray-skeleton.gl.h b/gl/malloc/dynarray-skeleton.gl.h
new file mode 100644
index 0000000..6eb7690
--- /dev/null
+++ b/gl/malloc/dynarray-skeleton.gl.h
@@ -0,0 +1,529 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Type-safe arrays which grow dynamically.
+   Copyright (C) 2017-2022 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/>.  */
+
+/* Pre-processor macros which act as parameters:
+
+   DYNARRAY_STRUCT
+      The struct tag of dynamic array to be defined.
+   DYNARRAY_ELEMENT
+      The type name of the element type.  Elements are copied
+      as if by memcpy, and can change address as the dynamic
+      array grows.
+   DYNARRAY_PREFIX
+      The prefix of the functions which are defined.
+
+   The following parameters are optional:
+
+   DYNARRAY_ELEMENT_FREE
+      DYNARRAY_ELEMENT_FREE (E) is evaluated to deallocate the
+      contents of elements. E is of type  DYNARRAY_ELEMENT *.
+   DYNARRAY_ELEMENT_INIT
+      DYNARRAY_ELEMENT_INIT (E) is evaluated to initialize a new
+      element.  E is of type  DYNARRAY_ELEMENT *.
+      If DYNARRAY_ELEMENT_FREE but not DYNARRAY_ELEMENT_INIT is
+      defined, new elements are automatically zero-initialized.
+      Otherwise, new elements have undefined contents.
+   DYNARRAY_INITIAL_SIZE
+      The size of the statically allocated array (default:
+      at least 2, more elements if they fit into 128 bytes).
+      Must be a preprocessor constant.  If DYNARRAY_INITIAL_SIZE is 0,
+      there is no statically allocated array at, and all non-empty
+      arrays are heap-allocated.
+   DYNARRAY_FINAL_TYPE
+      The name of the type which holds the final array.  If not
+      defined, is PREFIX##finalize not provided.  DYNARRAY_FINAL_TYPE
+      must be a struct type, with members of type DYNARRAY_ELEMENT and
+      size_t at the start (in this order).
+
+   These macros are undefined after this header file has been
+   included.
+
+   The following types are provided (their members are private to the
+   dynarray implementation):
+
+     struct DYNARRAY_STRUCT
+
+   The following functions are provided:
+
+     void DYNARRAY_PREFIX##init (struct DYNARRAY_STRUCT *);
+     void DYNARRAY_PREFIX##free (struct DYNARRAY_STRUCT *);
+     bool DYNARRAY_PREFIX##has_failed (const struct DYNARRAY_STRUCT *);
+     void DYNARRAY_PREFIX##mark_failed (struct DYNARRAY_STRUCT *);
+     size_t DYNARRAY_PREFIX##size (const struct DYNARRAY_STRUCT *);
+     DYNARRAY_ELEMENT *DYNARRAY_PREFIX##begin (const struct DYNARRAY_STRUCT *);
+     DYNARRAY_ELEMENT *DYNARRAY_PREFIX##end (const struct DYNARRAY_STRUCT *);
+     DYNARRAY_ELEMENT *DYNARRAY_PREFIX##at (struct DYNARRAY_STRUCT *, size_t);
+     void DYNARRAY_PREFIX##add (struct DYNARRAY_STRUCT *, DYNARRAY_ELEMENT);
+     DYNARRAY_ELEMENT *DYNARRAY_PREFIX##emplace (struct DYNARRAY_STRUCT *);
+     bool DYNARRAY_PREFIX##resize (struct DYNARRAY_STRUCT *, size_t);
+     void DYNARRAY_PREFIX##remove_last (struct DYNARRAY_STRUCT *);
+     void DYNARRAY_PREFIX##clear (struct DYNARRAY_STRUCT *);
+
+   The following functions are provided are provided if the
+   prerequisites are met:
+
+     bool DYNARRAY_PREFIX##finalize (struct DYNARRAY_STRUCT *,
+                                     DYNARRAY_FINAL_TYPE *);
+       (if DYNARRAY_FINAL_TYPE is defined)
+     DYNARRAY_ELEMENT *DYNARRAY_PREFIX##finalize (struct DYNARRAY_STRUCT *,
+                                                  size_t *);
+       (if DYNARRAY_FINAL_TYPE is not defined)
+*/
+
+#include <malloc/dynarray.gl.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef DYNARRAY_STRUCT
+# error "DYNARRAY_STRUCT must be defined"
+#endif
+
+#ifndef DYNARRAY_ELEMENT
+# error "DYNARRAY_ELEMENT must be defined"
+#endif
+
+#ifndef DYNARRAY_PREFIX
+# error "DYNARRAY_PREFIX must be defined"
+#endif
+
+#ifdef DYNARRAY_INITIAL_SIZE
+# if DYNARRAY_INITIAL_SIZE < 0
+#  error "DYNARRAY_INITIAL_SIZE must be non-negative"
+# endif
+# if DYNARRAY_INITIAL_SIZE > 0
+#  define DYNARRAY_HAVE_SCRATCH 1
+# else
+#  define DYNARRAY_HAVE_SCRATCH 0
+# endif
+#else
+/* Provide a reasonable default which limits the size of
+   DYNARRAY_STRUCT.  */
+# define DYNARRAY_INITIAL_SIZE \
+  (sizeof (DYNARRAY_ELEMENT) > 64 ? 2 : 128 / sizeof (DYNARRAY_ELEMENT))
+# define DYNARRAY_HAVE_SCRATCH 1
+#endif
+
+/* Public type definitions.  */
+
+/* All fields of this struct are private to the implementation.  */
+struct DYNARRAY_STRUCT
+{
+  union
+  {
+    struct dynarray_header dynarray_abstract;
+    struct
+    {
+      /* These fields must match struct dynarray_header.  */
+      size_t used;
+      size_t allocated;
+      DYNARRAY_ELEMENT *array;
+    } dynarray_header;
+  } u;
+
+#if DYNARRAY_HAVE_SCRATCH
+  /* Initial inline allocation.  */
+  DYNARRAY_ELEMENT scratch[DYNARRAY_INITIAL_SIZE];
+#endif
+};
+
+/* Internal use only: Helper macros.  */
+
+/* Ensure macro-expansion of DYNARRAY_PREFIX.  */
+#define DYNARRAY_CONCAT0(prefix, name) prefix##name
+#define DYNARRAY_CONCAT1(prefix, name) DYNARRAY_CONCAT0(prefix, name)
+#define DYNARRAY_NAME(name) DYNARRAY_CONCAT1(DYNARRAY_PREFIX, name)
+
+/* Use DYNARRAY_FREE instead of DYNARRAY_NAME (free),
+   so that Gnulib does not change 'free' to 'rpl_free'.  */
+#define DYNARRAY_FREE DYNARRAY_CONCAT1 (DYNARRAY_NAME (f), ree)
+
+/* Address of the scratch buffer if any.  */
+#if DYNARRAY_HAVE_SCRATCH
+# define DYNARRAY_SCRATCH(list) (list)->scratch
+#else
+# define DYNARRAY_SCRATCH(list) NULL
+#endif
+
+/* Internal use only: Helper functions.  */
+
+/* Internal function.  Call DYNARRAY_ELEMENT_FREE with the array
+   elements.  Name mangling needed due to the DYNARRAY_ELEMENT_FREE
+   macro expansion.  */
+static inline void
+DYNARRAY_NAME (free__elements__) (DYNARRAY_ELEMENT *__dynarray_array,
+                                  size_t __dynarray_used)
+{
+#ifdef DYNARRAY_ELEMENT_FREE
+  for (size_t __dynarray_i = 0; __dynarray_i < __dynarray_used; ++__dynarray_i)
+    DYNARRAY_ELEMENT_FREE (&__dynarray_array[__dynarray_i]);
+#endif /* DYNARRAY_ELEMENT_FREE */
+}
+
+/* Internal function.  Free the non-scratch array allocation.  */
+static inline void
+DYNARRAY_NAME (free__array__) (struct DYNARRAY_STRUCT *list)
+{
+#if DYNARRAY_HAVE_SCRATCH
+  if (list->u.dynarray_header.array != list->scratch)
+    free (list->u.dynarray_header.array);
+#else
+  free (list->u.dynarray_header.array);
+#endif
+}
+
+/* Public functions.  */
+
+/* Initialize a dynamic array object.  This must be called before any
+   use of the object.  */
+_GL_ATTRIBUTE_NONNULL ((1))
+static void
+DYNARRAY_NAME (init) (struct DYNARRAY_STRUCT *list)
+{
+  list->u.dynarray_header.used = 0;
+  list->u.dynarray_header.allocated = DYNARRAY_INITIAL_SIZE;
+  list->u.dynarray_header.array = DYNARRAY_SCRATCH (list);
+}
+
+/* Deallocate the dynamic array and its elements.  */
+_GL_ATTRIBUTE_MAYBE_UNUSED _GL_ATTRIBUTE_NONNULL ((1))
+static void
+DYNARRAY_FREE (struct DYNARRAY_STRUCT *list)
+{
+  DYNARRAY_NAME (free__elements__)
+    (list->u.dynarray_header.array, list->u.dynarray_header.used);
+  DYNARRAY_NAME (free__array__) (list);
+  DYNARRAY_NAME (init) (list);
+}
+
+/* Return true if the dynamic array is in an error state.  */
+_GL_ATTRIBUTE_NONNULL ((1))
+static inline bool
+DYNARRAY_NAME (has_failed) (const struct DYNARRAY_STRUCT *list)
+{
+  return list->u.dynarray_header.allocated == __dynarray_error_marker ();
+}
+
+/* Mark the dynamic array as failed.  All elements are deallocated as
+   a side effect.  */
+_GL_ATTRIBUTE_NONNULL ((1))
+static void
+DYNARRAY_NAME (mark_failed) (struct DYNARRAY_STRUCT *list)
+{
+  DYNARRAY_NAME (free__elements__)
+    (list->u.dynarray_header.array, list->u.dynarray_header.used);
+  DYNARRAY_NAME (free__array__) (list);
+  list->u.dynarray_header.array = DYNARRAY_SCRATCH (list);
+  list->u.dynarray_header.used = 0;
+  list->u.dynarray_header.allocated = __dynarray_error_marker ();
+}
+
+/* Return the number of elements which have been added to the dynamic
+   array.  */
+_GL_ATTRIBUTE_NONNULL ((1))
+static inline size_t
+DYNARRAY_NAME (size) (const struct DYNARRAY_STRUCT *list)
+{
+  return list->u.dynarray_header.used;
+}
+
+/* Return a pointer to the array element at INDEX.  Terminate the
+   process if INDEX is out of bounds.  */
+_GL_ATTRIBUTE_NONNULL ((1))
+static inline DYNARRAY_ELEMENT *
+DYNARRAY_NAME (at) (struct DYNARRAY_STRUCT *list, size_t index)
+{
+  if (_GL_UNLIKELY (index >= DYNARRAY_NAME (size) (list)))
+    __libc_dynarray_at_failure (DYNARRAY_NAME (size) (list), index);
+  return list->u.dynarray_header.array + index;
+}
+
+/* Return a pointer to the first array element, if any.  For a
+   zero-length array, the pointer can be NULL even though the dynamic
+   array has not entered the failure state.  */
+_GL_ATTRIBUTE_NONNULL ((1))
+static inline DYNARRAY_ELEMENT *
+DYNARRAY_NAME (begin) (struct DYNARRAY_STRUCT *list)
+{
+  return list->u.dynarray_header.array;
+}
+
+/* Return a pointer one element past the last array element.  For a
+   zero-length array, the pointer can be NULL even though the dynamic
+   array has not entered the failure state.  */
+_GL_ATTRIBUTE_NONNULL ((1))
+static inline DYNARRAY_ELEMENT *
+DYNARRAY_NAME (end) (struct DYNARRAY_STRUCT *list)
+{
+  return list->u.dynarray_header.array + list->u.dynarray_header.used;
+}
+
+/* Internal function.  Slow path for the add function below.  */
+static void
+DYNARRAY_NAME (add__) (struct DYNARRAY_STRUCT *list, DYNARRAY_ELEMENT item)
+{
+  if (_GL_UNLIKELY
+      (!__libc_dynarray_emplace_enlarge (&list->u.dynarray_abstract,
+                                         DYNARRAY_SCRATCH (list),
+                                         sizeof (DYNARRAY_ELEMENT))))
+    {
+      DYNARRAY_NAME (mark_failed) (list);
+      return;
+    }
+
+  /* Copy the new element and increase the array length.  */
+  list->u.dynarray_header.array[list->u.dynarray_header.used++] = item;
+}
+
+/* Add ITEM at the end of the array, enlarging it by one element.
+   Mark *LIST as failed if the dynamic array allocation size cannot be
+   increased.  */
+_GL_ATTRIBUTE_NONNULL ((1))
+static inline void
+DYNARRAY_NAME (add) (struct DYNARRAY_STRUCT *list, DYNARRAY_ELEMENT item)
+{
+  /* Do nothing in case of previous error.  */
+  if (DYNARRAY_NAME (has_failed) (list))
+    return;
+
+  /* Enlarge the array if necessary.  */
+  if (_GL_UNLIKELY (list->u.dynarray_header.used
+                        == list->u.dynarray_header.allocated))
+    {
+      DYNARRAY_NAME (add__) (list, item);
+      return;
+    }
+
+  /* Copy the new element and increase the array length.  */
+  list->u.dynarray_header.array[list->u.dynarray_header.used++] = item;
+}
+
+/* Internal function.  Building block for the emplace functions below.
+   Assumes space for one more element in *LIST.  */
+static inline DYNARRAY_ELEMENT *
+DYNARRAY_NAME (emplace__tail__) (struct DYNARRAY_STRUCT *list)
+{
+  DYNARRAY_ELEMENT *result
+    = &list->u.dynarray_header.array[list->u.dynarray_header.used];
+  ++list->u.dynarray_header.used;
+#if defined (DYNARRAY_ELEMENT_INIT)
+  DYNARRAY_ELEMENT_INIT (result);
+#elif defined (DYNARRAY_ELEMENT_FREE)
+  memset (result, 0, sizeof (*result));
+#endif
+  return result;
+}
+
+/* Internal function.  Slow path for the emplace function below.  */
+static DYNARRAY_ELEMENT *
+DYNARRAY_NAME (emplace__) (struct DYNARRAY_STRUCT *list)
+{
+  if (_GL_UNLIKELY
+      (!__libc_dynarray_emplace_enlarge (&list->u.dynarray_abstract,
+                                         DYNARRAY_SCRATCH (list),
+                                         sizeof (DYNARRAY_ELEMENT))))
+    {
+      DYNARRAY_NAME (mark_failed) (list);
+      return NULL;
+    }
+  return DYNARRAY_NAME (emplace__tail__) (list);
+}
+
+/* Allocate a place for a new element in *LIST and return a pointer to
+   it.  The pointer can be NULL if the dynamic array cannot be
+   enlarged due to a memory allocation failure.  */
+_GL_ATTRIBUTE_MAYBE_UNUSED _GL_ATTRIBUTE_NODISCARD
+_GL_ATTRIBUTE_NONNULL ((1))
+static
+/* Avoid inlining with the larger initialization code.  */
+#if !(defined (DYNARRAY_ELEMENT_INIT) || defined (DYNARRAY_ELEMENT_FREE))
+inline
+#endif
+DYNARRAY_ELEMENT *
+DYNARRAY_NAME (emplace) (struct DYNARRAY_STRUCT *list)
+{
+  /* Do nothing in case of previous error.  */
+  if (DYNARRAY_NAME (has_failed) (list))
+    return NULL;
+
+  /* Enlarge the array if necessary.  */
+  if (_GL_UNLIKELY (list->u.dynarray_header.used
+                        == list->u.dynarray_header.allocated))
+    return (DYNARRAY_NAME (emplace__) (list));
+  return DYNARRAY_NAME (emplace__tail__) (list);
+}
+
+/* Change the size of *LIST to SIZE.  If SIZE is larger than the
+   existing size, new elements are added (which can be initialized).
+   Otherwise, the list is truncated, and elements are freed.  Return
+   false on memory allocation failure (and mark *LIST as failed).  */
+_GL_ATTRIBUTE_MAYBE_UNUSED _GL_ATTRIBUTE_NONNULL ((1))
+static bool
+DYNARRAY_NAME (resize) (struct DYNARRAY_STRUCT *list, size_t size)
+{
+  if (size > list->u.dynarray_header.used)
+    {
+      bool ok;
+#if defined (DYNARRAY_ELEMENT_INIT)
+      /* The new elements have to be initialized.  */
+      size_t old_size = list->u.dynarray_header.used;
+      ok = __libc_dynarray_resize (&list->u.dynarray_abstract,
+                                   size, DYNARRAY_SCRATCH (list),
+                                   sizeof (DYNARRAY_ELEMENT));
+      if (ok)
+        for (size_t i = old_size; i < size; ++i)
+          {
+            DYNARRAY_ELEMENT_INIT (&list->u.dynarray_header.array[i]);
+          }
+#elif defined (DYNARRAY_ELEMENT_FREE)
+      /* Zero initialization is needed so that the elements can be
+         safely freed.  */
+      ok = __libc_dynarray_resize_clear
+        (&list->u.dynarray_abstract, size,
+         DYNARRAY_SCRATCH (list), sizeof (DYNARRAY_ELEMENT));
+#else
+      ok =  __libc_dynarray_resize (&list->u.dynarray_abstract,
+                                    size, DYNARRAY_SCRATCH (list),
+                                    sizeof (DYNARRAY_ELEMENT));
+#endif
+      if (_GL_UNLIKELY (!ok))
+        DYNARRAY_NAME (mark_failed) (list);
+      return ok;
+    }
+  else
+    {
+      /* The list has shrunk in size.  Free the removed elements.  */
+      DYNARRAY_NAME (free__elements__)
+        (list->u.dynarray_header.array + size,
+         list->u.dynarray_header.used - size);
+      list->u.dynarray_header.used = size;
+      return true;
+    }
+}
+
+/* Remove the last element of LIST if it is present.  */
+_GL_ATTRIBUTE_MAYBE_UNUSED _GL_ATTRIBUTE_NONNULL ((1))
+static void
+DYNARRAY_NAME (remove_last) (struct DYNARRAY_STRUCT *list)
+{
+  /* used > 0 implies that the array is the non-failed state.  */
+  if (list->u.dynarray_header.used > 0)
+    {
+      size_t new_length = list->u.dynarray_header.used - 1;
+#ifdef DYNARRAY_ELEMENT_FREE
+      DYNARRAY_ELEMENT_FREE (&list->u.dynarray_header.array[new_length]);
+#endif
+      list->u.dynarray_header.used = new_length;
+    }
+}
+
+/* Remove all elements from the list.  The elements are freed, but the
+   list itself is not.  */
+_GL_ATTRIBUTE_MAYBE_UNUSED _GL_ATTRIBUTE_NONNULL ((1))
+static void
+DYNARRAY_NAME (clear) (struct DYNARRAY_STRUCT *list)
+{
+  /* free__elements__ does nothing if the list is in the failed
+     state.  */
+  DYNARRAY_NAME (free__elements__)
+    (list->u.dynarray_header.array, list->u.dynarray_header.used);
+  list->u.dynarray_header.used = 0;
+}
+
+#ifdef DYNARRAY_FINAL_TYPE
+/* Transfer the dynamic array to a permanent location at *RESULT.
+   Returns true on success on false on allocation failure.  In either
+   case, *LIST is re-initialized and can be reused.  A NULL pointer is
+   stored in *RESULT if LIST refers to an empty list.  On success, the
+   pointer in *RESULT is heap-allocated and must be deallocated using
+   free.  */
+_GL_ATTRIBUTE_MAYBE_UNUSED _GL_ATTRIBUTE_NODISCARD
+_GL_ATTRIBUTE_NONNULL ((1, 2))
+static bool
+DYNARRAY_NAME (finalize) (struct DYNARRAY_STRUCT *list,
+                          DYNARRAY_FINAL_TYPE *result)
+{
+  struct dynarray_finalize_result res;
+  if (__libc_dynarray_finalize (&list->u.dynarray_abstract,
+                                DYNARRAY_SCRATCH (list),
+                                sizeof (DYNARRAY_ELEMENT), &res))
+    {
+      /* On success, the result owns all the data.  */
+      DYNARRAY_NAME (init) (list);
+      *result = (DYNARRAY_FINAL_TYPE) { res.array, res.length };
+      return true;
+    }
+  else
+    {
+      /* On error, we need to free all data.  */
+      DYNARRAY_FREE (list);
+      errno = ENOMEM;
+      return false;
+    }
+}
+#else /* !DYNARRAY_FINAL_TYPE */
+/* Transfer the dynamic array to a heap-allocated array and return a
+   pointer to it.  The pointer is NULL if memory allocation fails, or
+   if the array is empty, so this function should be used only for
+   arrays which are known not be empty (usually because they always
+   have a sentinel at the end).  If LENGTHP is not NULL, the array
+   length is written to *LENGTHP.  *LIST is re-initialized and can be
+   reused.  */
+_GL_ATTRIBUTE_MAYBE_UNUSED _GL_ATTRIBUTE_NODISCARD
+_GL_ATTRIBUTE_NONNULL ((1))
+static DYNARRAY_ELEMENT *
+DYNARRAY_NAME (finalize) (struct DYNARRAY_STRUCT *list, size_t *lengthp)
+{
+  struct dynarray_finalize_result res;
+  if (__libc_dynarray_finalize (&list->u.dynarray_abstract,
+                                DYNARRAY_SCRATCH (list),
+                                sizeof (DYNARRAY_ELEMENT), &res))
+    {
+      /* On success, the result owns all the data.  */
+      DYNARRAY_NAME (init) (list);
+      if (lengthp != NULL)
+        *lengthp = res.length;
+      return res.array;
+    }
+  else
+    {
+      /* On error, we need to free all data.  */
+      DYNARRAY_FREE (list);
+      errno = ENOMEM;
+      return NULL;
+    }
+}
+#endif /* !DYNARRAY_FINAL_TYPE */
+
+/* Undo macro definitions.  */
+
+#undef DYNARRAY_CONCAT0
+#undef DYNARRAY_CONCAT1
+#undef DYNARRAY_NAME
+#undef DYNARRAY_SCRATCH
+#undef DYNARRAY_HAVE_SCRATCH
+
+#undef DYNARRAY_STRUCT
+#undef DYNARRAY_ELEMENT
+#undef DYNARRAY_PREFIX
+#undef DYNARRAY_ELEMENT_FREE
+#undef DYNARRAY_ELEMENT_INIT
+#undef DYNARRAY_INITIAL_SIZE
+#undef DYNARRAY_FINAL_TYPE
diff --git a/gl/malloc/dynarray.gl.h b/gl/malloc/dynarray.gl.h
new file mode 100644
index 0000000..24897b2
--- /dev/null
+++ b/gl/malloc/dynarray.gl.h
@@ -0,0 +1,174 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Type-safe arrays which grow dynamically.  Shared definitions.
+   Copyright (C) 2017-2022 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/>.  */
+
+/* To use the dynarray facility, you need to include
+   <malloc/dynarray-skeleton.c> and define the parameter macros
+   documented in that file.
+
+   A minimal example which provides a growing list of integers can be
+   defined like this:
+
+     struct int_array
+     {
+       // Pointer to result array followed by its length,
+       // as required by DYNARRAY_FINAL_TYPE.
+       int *array;
+       size_t length;
+     };
+
+     #define DYNARRAY_STRUCT dynarray_int
+     #define DYNARRAY_ELEMENT int
+     #define DYNARRAY_PREFIX dynarray_int_
+     #define DYNARRAY_FINAL_TYPE struct int_array
+     #include <malloc/dynarray-skeleton.c>
+
+   To create a three-element array with elements 1, 2, 3, use this
+   code:
+
+     struct dynarray_int dyn;
+     dynarray_int_init (&dyn);
+     for (int i = 1; i <= 3; ++i)
+       {
+         int *place = dynarray_int_emplace (&dyn);
+         assert (place != NULL);
+         *place = i;
+       }
+     struct int_array result;
+     bool ok = dynarray_int_finalize (&dyn, &result);
+     assert (ok);
+     assert (result.length == 3);
+     assert (result.array[0] == 1);
+     assert (result.array[1] == 2);
+     assert (result.array[2] == 3);
+     free (result.array);
+
+   If the elements contain resources which must be freed, define
+   DYNARRAY_ELEMENT_FREE appropriately, like this:
+
+     struct str_array
+     {
+       char **array;
+       size_t length;
+     };
+
+     #define DYNARRAY_STRUCT dynarray_str
+     #define DYNARRAY_ELEMENT char *
+     #define DYNARRAY_ELEMENT_FREE(ptr) free (*ptr)
+     #define DYNARRAY_PREFIX dynarray_str_
+     #define DYNARRAY_FINAL_TYPE struct str_array
+     #include <malloc/dynarray-skeleton.c>
+
+   Compared to scratch buffers, dynamic arrays have the following
+   features:
+
+   - They have an element type, and are not just an untyped buffer of
+     bytes.
+
+   - When growing, previously stored elements are preserved.  (It is
+     expected that scratch_buffer_grow_preserve and
+     scratch_buffer_set_array_size eventually go away because all
+     current users are moved to dynamic arrays.)
+
+   - Scratch buffers have a more aggressive growth policy because
+     growing them typically means a retry of an operation (across an
+     NSS service module boundary), which is expensive.
+
+   - For the same reason, scratch buffers have a much larger initial
+     stack allocation.  */
+
+#ifndef _DYNARRAY_H
+#define _DYNARRAY_H
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <string.h>
+
+struct dynarray_header
+{
+  size_t used;
+  size_t allocated;
+  void *array;
+};
+
+/* Marker used in the allocated member to indicate that an error was
+   encountered.  */
+static inline size_t
+__dynarray_error_marker (void)
+{
+  return -1;
+}
+
+/* Internal function.  See the has_failed function in
+   dynarray-skeleton.c.  */
+static inline bool
+__dynarray_error (struct dynarray_header *list)
+{
+  return list->allocated == __dynarray_error_marker ();
+}
+
+/* Internal function.  Enlarge the dynamically allocated area of the
+   array to make room for one more element.  SCRATCH is a pointer to
+   the scratch area (which is not heap-allocated and must not be
+   freed).  ELEMENT_SIZE is the size, in bytes, of one element.
+   Return false on failure, true on success.  */
+bool __libc_dynarray_emplace_enlarge (struct dynarray_header *,
+                                      void *scratch, size_t element_size);
+
+/* Internal function.  Enlarge the dynamically allocated area of the
+   array to make room for at least SIZE elements (which must be larger
+   than the existing used part of the dynamic array).  SCRATCH is a
+   pointer to the scratch area (which is not heap-allocated and must
+   not be freed).  ELEMENT_SIZE is the size, in bytes, of one element.
+   Return false on failure, true on success.  */
+bool __libc_dynarray_resize (struct dynarray_header *, size_t size,
+                             void *scratch, size_t element_size);
+
+/* Internal function.  Like __libc_dynarray_resize, but clear the new
+   part of the dynamic array.  */
+bool __libc_dynarray_resize_clear (struct dynarray_header *, size_t size,
+                                   void *scratch, size_t element_size);
+
+/* Internal type.  */
+struct dynarray_finalize_result
+{
+  void *array;
+  size_t length;
+};
+
+/* Internal function.  Copy the dynamically-allocated area to an
+   explicitly-sized heap allocation.  SCRATCH is a pointer to the
+   embedded scratch space.  ELEMENT_SIZE is the size, in bytes, of the
+   element type.  On success, true is returned, and pointer and length
+   are written to *RESULT.  On failure, false is returned.  The caller
+   has to take care of some of the memory management; this function is
+   expected to be called from dynarray-skeleton.c.  */
+bool __libc_dynarray_finalize (struct dynarray_header *list, void *scratch,
+                               size_t element_size,
+                               struct dynarray_finalize_result *result);
+
+
+/* Internal function.  Terminate the process after an index error.
+   SIZE is the number of elements of the dynamic array.  INDEX is the
+   lookup index which triggered the failure.  */
+_Noreturn void __libc_dynarray_at_failure (size_t size, size_t index);
+
+#ifndef _ISOMAC
+#endif
+
+#endif /* _DYNARRAY_H */
diff --git a/gl/sha256-stream.c b/gl/sha256-stream.c
deleted file mode 100644
index c2e6398..0000000
--- a/gl/sha256-stream.c
+++ /dev/null
@@ -1,145 +0,0 @@
-/* sha256.c - Functions to compute SHA256 and SHA224 message digest of files or
-   memory blocks according to the NIST specification FIPS-180-2.
-
-   Copyright (C) 2005-2006, 2008-2022 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 David Madore, considerably copypasting from
-   Scott G. Miller's sha1.c
-*/
-
-#include <config.h>
-
-/* Specification.  */
-#if HAVE_OPENSSL_SHA256
-# define GL_OPENSSL_INLINE _GL_EXTERN_INLINE
-#endif
-#include "sha256.h"
-
-#include <stdlib.h>
-
-#if USE_UNLOCKED_IO
-# include "unlocked-io.h"
-#endif
-
-#include "af_alg.h"
-
-#define BLOCKSIZE 32768
-#if BLOCKSIZE % 64 != 0
-# error "invalid BLOCKSIZE"
-#endif
-
-/* Compute message digest for bytes read from STREAM using algorithm ALG.
-   Write the message digest into RESBLOCK, which contains HASHLEN bytes.
-   The initial and finishing operations are INIT_CTX and FINISH_CTX.
-   Return zero if and only if successful.  */
-static int
-shaxxx_stream (FILE *stream, char const *alg, void *resblock,
-               ssize_t hashlen, void (*init_ctx) (struct sha256_ctx *),
-               void *(*finish_ctx) (struct sha256_ctx *, void *))
-{
-  switch (afalg_stream (stream, alg, resblock, hashlen))
-    {
-    case 0: return 0;
-    case -EIO: return 1;
-    }
-
-  char *buffer = malloc (BLOCKSIZE + 72);
-  if (!buffer)
-    return 1;
-
-  struct sha256_ctx ctx;
-  init_ctx (&ctx);
-  size_t sum;
-
-  /* Iterate over full file contents.  */
-  while (1)
-    {
-      /* We read the file in blocks of BLOCKSIZE bytes.  One call of the
-         computation function processes the whole buffer so that with the
-         next round of the loop another block can be read.  */
-      size_t n;
-      sum = 0;
-
-      /* Read block.  Take care for partial reads.  */
-      while (1)
-        {
-          /* Either process a partial fread() from this loop,
-             or the fread() in afalg_stream may have gotten EOF.
-             We need to avoid a subsequent fread() as EOF may
-             not be sticky.  For details of such systems, see:
-             https://sourceware.org/bugzilla/show_bug.cgi?id=1190  */
-          if (feof (stream))
-            goto process_partial_block;
-
-          n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
-
-          sum += n;
-
-          if (sum == BLOCKSIZE)
-            break;
-
-          if (n == 0)
-            {
-              /* Check for the error flag IFF N == 0, so that we don't
-                 exit the loop after a partial read due to e.g., EAGAIN
-                 or EWOULDBLOCK.  */
-              if (ferror (stream))
-                {
-                  free (buffer);
-                  return 1;
-                }
-              goto process_partial_block;
-            }
-        }
-
-      /* Process buffer with BLOCKSIZE bytes.  Note that
-                        BLOCKSIZE % 64 == 0
-       */
-      sha256_process_block (buffer, BLOCKSIZE, &ctx);
-    }
-
- process_partial_block:;
-
-  /* Process any remaining bytes.  */
-  if (sum > 0)
-    sha256_process_bytes (buffer, sum, &ctx);
-
-  /* Construct result in desired memory.  */
-  finish_ctx (&ctx, resblock);
-  free (buffer);
-  return 0;
-}
-
-int
-sha256_stream (FILE *stream, void *resblock)
-{
-  return shaxxx_stream (stream, "sha256", resblock, SHA256_DIGEST_SIZE,
-                        sha256_init_ctx, sha256_finish_ctx);
-}
-
-int
-sha224_stream (FILE *stream, void *resblock)
-{
-  return shaxxx_stream (stream, "sha224", resblock, SHA224_DIGEST_SIZE,
-                        sha224_init_ctx, sha224_finish_ctx);
-}
-
-/*
- * Hey Emacs!
- * Local Variables:
- * coding: utf-8
- * End:
- */
diff --git a/gl/sha256.c b/gl/sha256.c
deleted file mode 100644
index c9ca618..0000000
--- a/gl/sha256.c
+++ /dev/null
@@ -1,433 +0,0 @@
-/* sha256.c - Functions to compute SHA256 and SHA224 message digest of files or
-   memory blocks according to the NIST specification FIPS-180-2.
-
-   Copyright (C) 2005-2006, 2008-2022 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 David Madore, considerably copypasting from
-   Scott G. Miller's sha1.c
-*/
-
-#include <config.h>
-
-/* Specification.  */
-#if HAVE_OPENSSL_SHA256
-# define GL_OPENSSL_INLINE _GL_EXTERN_INLINE
-#endif
-#include "sha256.h"
-
-#include <stdalign.h>
-#include <stdint.h>
-#include <string.h>
-
-#include <byteswap.h>
-#ifdef WORDS_BIGENDIAN
-# define SWAP(n) (n)
-#else
-# define SWAP(n) bswap_32 (n)
-#endif
-
-#if ! HAVE_OPENSSL_SHA256
-
-/* This array contains the bytes used to pad the buffer to the next
-   64-byte boundary.  */
-static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ...  */ };
-
-
-/*
-  Takes a pointer to a 256 bit block of data (eight 32 bit ints) and
-  initializes it to the start constants of the SHA256 algorithm.  This
-  must be called before using hash in the call to sha256_hash
-*/
-void
-sha256_init_ctx (struct sha256_ctx *ctx)
-{
-  ctx->state[0] = 0x6a09e667UL;
-  ctx->state[1] = 0xbb67ae85UL;
-  ctx->state[2] = 0x3c6ef372UL;
-  ctx->state[3] = 0xa54ff53aUL;
-  ctx->state[4] = 0x510e527fUL;
-  ctx->state[5] = 0x9b05688cUL;
-  ctx->state[6] = 0x1f83d9abUL;
-  ctx->state[7] = 0x5be0cd19UL;
-
-  ctx->total[0] = ctx->total[1] = 0;
-  ctx->buflen = 0;
-}
-
-void
-sha224_init_ctx (struct sha256_ctx *ctx)
-{
-  ctx->state[0] = 0xc1059ed8UL;
-  ctx->state[1] = 0x367cd507UL;
-  ctx->state[2] = 0x3070dd17UL;
-  ctx->state[3] = 0xf70e5939UL;
-  ctx->state[4] = 0xffc00b31UL;
-  ctx->state[5] = 0x68581511UL;
-  ctx->state[6] = 0x64f98fa7UL;
-  ctx->state[7] = 0xbefa4fa4UL;
-
-  ctx->total[0] = ctx->total[1] = 0;
-  ctx->buflen = 0;
-}
-
-/* Copy the value from v into the memory location pointed to by *CP,
-   If your architecture allows unaligned access, this is equivalent to
-   * (__typeof__ (v) *) cp = v  */
-static void
-set_uint32 (char *cp, uint32_t v)
-{
-  memcpy (cp, &v, sizeof v);
-}
-
-/* Put result from CTX in first 32 bytes following RESBUF.
-   The result must be in little endian byte order.  */
-void *
-sha256_read_ctx (const struct sha256_ctx *ctx, void *resbuf)
-{
-  int i;
-  char *r = resbuf;
-
-  for (i = 0; i < 8; i++)
-    set_uint32 (r + i * sizeof ctx->state[0], SWAP (ctx->state[i]));
-
-  return resbuf;
-}
-
-void *
-sha224_read_ctx (const struct sha256_ctx *ctx, void *resbuf)
-{
-  int i;
-  char *r = resbuf;
-
-  for (i = 0; i < 7; i++)
-    set_uint32 (r + i * sizeof ctx->state[0], SWAP (ctx->state[i]));
-
-  return resbuf;
-}
-
-/* Process the remaining bytes in the internal buffer and the usual
-   prolog according to the standard and write the result to RESBUF.  */
-static void
-sha256_conclude_ctx (struct sha256_ctx *ctx)
-{
-  /* Take yet unprocessed bytes into account.  */
-  size_t bytes = ctx->buflen;
-  size_t size = (bytes < 56) ? 64 / 4 : 64 * 2 / 4;
-
-  /* Now count remaining bytes.  */
-  ctx->total[0] += bytes;
-  if (ctx->total[0] < bytes)
-    ++ctx->total[1];
-
-  /* Put the 64-bit file length in *bits* at the end of the buffer.
-     Use set_uint32 rather than a simple assignment, to avoid risk of
-     unaligned access.  */
-  set_uint32 ((char *) &ctx->buffer[size - 2],
-              SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29)));
-  set_uint32 ((char *) &ctx->buffer[size - 1],
-              SWAP (ctx->total[0] << 3));
-
-  memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 4 - bytes);
-
-  /* Process last bytes.  */
-  sha256_process_block (ctx->buffer, size * 4, ctx);
-}
-
-void *
-sha256_finish_ctx (struct sha256_ctx *ctx, void *resbuf)
-{
-  sha256_conclude_ctx (ctx);
-  return sha256_read_ctx (ctx, resbuf);
-}
-
-void *
-sha224_finish_ctx (struct sha256_ctx *ctx, void *resbuf)
-{
-  sha256_conclude_ctx (ctx);
-  return sha224_read_ctx (ctx, resbuf);
-}
-
-/* Compute SHA256 message digest for LEN bytes beginning at BUFFER.  The
-   result is always in little endian byte order, so that a byte-wise
-   output yields to the wanted ASCII representation of the message
-   digest.  */
-void *
-sha256_buffer (const char *buffer, size_t len, void *resblock)
-{
-  struct sha256_ctx ctx;
-
-  /* Initialize the computation context.  */
-  sha256_init_ctx (&ctx);
-
-  /* Process whole buffer but last len % 64 bytes.  */
-  sha256_process_bytes (buffer, len, &ctx);
-
-  /* Put result in desired memory area.  */
-  return sha256_finish_ctx (&ctx, resblock);
-}
-
-void *
-sha224_buffer (const char *buffer, size_t len, void *resblock)
-{
-  struct sha256_ctx ctx;
-
-  /* Initialize the computation context.  */
-  sha224_init_ctx (&ctx);
-
-  /* Process whole buffer but last len % 64 bytes.  */
-  sha256_process_bytes (buffer, len, &ctx);
-
-  /* Put result in desired memory area.  */
-  return sha224_finish_ctx (&ctx, resblock);
-}
-
-void
-sha256_process_bytes (const void *buffer, size_t len, struct sha256_ctx *ctx)
-{
-  /* When we already have some bits in our internal buffer concatenate
-     both inputs first.  */
-  if (ctx->buflen != 0)
-    {
-      size_t left_over = ctx->buflen;
-      size_t add = 128 - left_over > len ? len : 128 - left_over;
-
-      memcpy (&((char *) ctx->buffer)[left_over], buffer, add);
-      ctx->buflen += add;
-
-      if (ctx->buflen > 64)
-        {
-          sha256_process_block (ctx->buffer, ctx->buflen & ~63, ctx);
-
-          ctx->buflen &= 63;
-          /* The regions in the following copy operation cannot overlap,
-             because ctx->buflen < 64 ≤ (left_over + add) & ~63.  */
-          memcpy (ctx->buffer,
-                  &((char *) ctx->buffer)[(left_over + add) & ~63],
-                  ctx->buflen);
-        }
-
-      buffer = (const char *) buffer + add;
-      len -= add;
-    }
-
-  /* Process available complete blocks.  */
-  if (len >= 64)
-    {
-#if !(_STRING_ARCH_unaligned || _STRING_INLINE_unaligned)
-# define UNALIGNED_P(p) ((uintptr_t) (p) % alignof (uint32_t) != 0)
-      if (UNALIGNED_P (buffer))
-        while (len > 64)
-          {
-            sha256_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx);
-            buffer = (const char *) buffer + 64;
-            len -= 64;
-          }
-      else
-#endif
-        {
-          sha256_process_block (buffer, len & ~63, ctx);
-          buffer = (const char *) buffer + (len & ~63);
-          len &= 63;
-        }
-    }
-
-  /* Move remaining bytes in internal buffer.  */
-  if (len > 0)
-    {
-      size_t left_over = ctx->buflen;
-
-      memcpy (&((char *) ctx->buffer)[left_over], buffer, len);
-      left_over += len;
-      if (left_over >= 64)
-        {
-          sha256_process_block (ctx->buffer, 64, ctx);
-          left_over -= 64;
-          /* The regions in the following copy operation cannot overlap,
-             because left_over ≤ 64.  */
-          memcpy (ctx->buffer, &ctx->buffer[16], left_over);
-        }
-      ctx->buflen = left_over;
-    }
-}
-
-/* --- Code below is the primary difference between sha1.c and sha256.c --- */
-
-/* SHA256 round constants */
-#define K(I) sha256_round_constants[I]
-static const uint32_t sha256_round_constants[64] = {
-  0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
-  0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
-  0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
-  0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
-  0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
-  0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
-  0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
-  0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
-  0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
-  0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
-  0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
-  0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
-  0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
-  0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
-  0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
-  0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL,
-};
-
-/* Round functions.  */
-#define F2(A,B,C) ( ( A & B ) | ( C & ( A | B ) ) )
-#define F1(E,F,G) ( G ^ ( E & ( F ^ G ) ) )
-
-/* Process LEN bytes of BUFFER, accumulating context into CTX.
-   It is assumed that LEN % 64 == 0.
-   Most of this code comes from GnuPG's cipher/sha1.c.  */
-
-void
-sha256_process_block (const void *buffer, size_t len, struct sha256_ctx *ctx)
-{
-  const uint32_t *words = buffer;
-  size_t nwords = len / sizeof (uint32_t);
-  const uint32_t *endp = words + nwords;
-  uint32_t x[16];
-  uint32_t a = ctx->state[0];
-  uint32_t b = ctx->state[1];
-  uint32_t c = ctx->state[2];
-  uint32_t d = ctx->state[3];
-  uint32_t e = ctx->state[4];
-  uint32_t f = ctx->state[5];
-  uint32_t g = ctx->state[6];
-  uint32_t h = ctx->state[7];
-  uint32_t lolen = len;
-
-  /* First increment the byte count.  FIPS PUB 180-2 specifies the possible
-     length of the file up to 2^64 bits.  Here we only compute the
-     number of bytes.  Do a double word increment.  */
-  ctx->total[0] += lolen;
-  ctx->total[1] += (len >> 31 >> 1) + (ctx->total[0] < lolen);
-
-#define rol(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
-#define S0(x) (rol(x,25)^rol(x,14)^(x>>3))
-#define S1(x) (rol(x,15)^rol(x,13)^(x>>10))
-#define SS0(x) (rol(x,30)^rol(x,19)^rol(x,10))
-#define SS1(x) (rol(x,26)^rol(x,21)^rol(x,7))
-
-#define M(I) ( tm =   S1(x[(I-2)&0x0f]) + x[(I-7)&0x0f] \
-                    + S0(x[(I-15)&0x0f]) + x[I&0x0f]    \
-               , x[I&0x0f] = tm )
-
-#define R(A,B,C,D,E,F,G,H,K,M)  do { t0 = SS0(A) + F2(A,B,C); \
-                                     t1 = H + SS1(E)  \
-                                      + F1(E,F,G)     \
-                                      + K             \
-                                      + M;            \
-                                     D += t1;  H = t0 + t1; \
-                               } while(0)
-
-  while (words < endp)
-    {
-      uint32_t tm;
-      uint32_t t0, t1;
-      int t;
-      /* FIXME: see sha1.c for a better implementation.  */
-      for (t = 0; t < 16; t++)
-        {
-          x[t] = SWAP (*words);
-          words++;
-        }
-
-      R( a, b, c, d, e, f, g, h, K( 0), x[ 0] );
-      R( h, a, b, c, d, e, f, g, K( 1), x[ 1] );
-      R( g, h, a, b, c, d, e, f, K( 2), x[ 2] );
-      R( f, g, h, a, b, c, d, e, K( 3), x[ 3] );
-      R( e, f, g, h, a, b, c, d, K( 4), x[ 4] );
-      R( d, e, f, g, h, a, b, c, K( 5), x[ 5] );
-      R( c, d, e, f, g, h, a, b, K( 6), x[ 6] );
-      R( b, c, d, e, f, g, h, a, K( 7), x[ 7] );
-      R( a, b, c, d, e, f, g, h, K( 8), x[ 8] );
-      R( h, a, b, c, d, e, f, g, K( 9), x[ 9] );
-      R( g, h, a, b, c, d, e, f, K(10), x[10] );
-      R( f, g, h, a, b, c, d, e, K(11), x[11] );
-      R( e, f, g, h, a, b, c, d, K(12), x[12] );
-      R( d, e, f, g, h, a, b, c, K(13), x[13] );
-      R( c, d, e, f, g, h, a, b, K(14), x[14] );
-      R( b, c, d, e, f, g, h, a, K(15), x[15] );
-      R( a, b, c, d, e, f, g, h, K(16), M(16) );
-      R( h, a, b, c, d, e, f, g, K(17), M(17) );
-      R( g, h, a, b, c, d, e, f, K(18), M(18) );
-      R( f, g, h, a, b, c, d, e, K(19), M(19) );
-      R( e, f, g, h, a, b, c, d, K(20), M(20) );
-      R( d, e, f, g, h, a, b, c, K(21), M(21) );
-      R( c, d, e, f, g, h, a, b, K(22), M(22) );
-      R( b, c, d, e, f, g, h, a, K(23), M(23) );
-      R( a, b, c, d, e, f, g, h, K(24), M(24) );
-      R( h, a, b, c, d, e, f, g, K(25), M(25) );
-      R( g, h, a, b, c, d, e, f, K(26), M(26) );
-      R( f, g, h, a, b, c, d, e, K(27), M(27) );
-      R( e, f, g, h, a, b, c, d, K(28), M(28) );
-      R( d, e, f, g, h, a, b, c, K(29), M(29) );
-      R( c, d, e, f, g, h, a, b, K(30), M(30) );
-      R( b, c, d, e, f, g, h, a, K(31), M(31) );
-      R( a, b, c, d, e, f, g, h, K(32), M(32) );
-      R( h, a, b, c, d, e, f, g, K(33), M(33) );
-      R( g, h, a, b, c, d, e, f, K(34), M(34) );
-      R( f, g, h, a, b, c, d, e, K(35), M(35) );
-      R( e, f, g, h, a, b, c, d, K(36), M(36) );
-      R( d, e, f, g, h, a, b, c, K(37), M(37) );
-      R( c, d, e, f, g, h, a, b, K(38), M(38) );
-      R( b, c, d, e, f, g, h, a, K(39), M(39) );
-      R( a, b, c, d, e, f, g, h, K(40), M(40) );
-      R( h, a, b, c, d, e, f, g, K(41), M(41) );
-      R( g, h, a, b, c, d, e, f, K(42), M(42) );
-      R( f, g, h, a, b, c, d, e, K(43), M(43) );
-      R( e, f, g, h, a, b, c, d, K(44), M(44) );
-      R( d, e, f, g, h, a, b, c, K(45), M(45) );
-      R( c, d, e, f, g, h, a, b, K(46), M(46) );
-      R( b, c, d, e, f, g, h, a, K(47), M(47) );
-      R( a, b, c, d, e, f, g, h, K(48), M(48) );
-      R( h, a, b, c, d, e, f, g, K(49), M(49) );
-      R( g, h, a, b, c, d, e, f, K(50), M(50) );
-      R( f, g, h, a, b, c, d, e, K(51), M(51) );
-      R( e, f, g, h, a, b, c, d, K(52), M(52) );
-      R( d, e, f, g, h, a, b, c, K(53), M(53) );
-      R( c, d, e, f, g, h, a, b, K(54), M(54) );
-      R( b, c, d, e, f, g, h, a, K(55), M(55) );
-      R( a, b, c, d, e, f, g, h, K(56), M(56) );
-      R( h, a, b, c, d, e, f, g, K(57), M(57) );
-      R( g, h, a, b, c, d, e, f, K(58), M(58) );
-      R( f, g, h, a, b, c, d, e, K(59), M(59) );
-      R( e, f, g, h, a, b, c, d, K(60), M(60) );
-      R( d, e, f, g, h, a, b, c, K(61), M(61) );
-      R( c, d, e, f, g, h, a, b, K(62), M(62) );
-      R( b, c, d, e, f, g, h, a, K(63), M(63) );
-
-      a = ctx->state[0] += a;
-      b = ctx->state[1] += b;
-      c = ctx->state[2] += c;
-      d = ctx->state[3] += d;
-      e = ctx->state[4] += e;
-      f = ctx->state[5] += f;
-      g = ctx->state[6] += g;
-      h = ctx->state[7] += h;
-    }
-}
-
-#endif
-
-/*
- * Hey Emacs!
- * Local Variables:
- * coding: utf-8
- * End:
- */
diff --git a/gl/sha256.h b/gl/sha256.h
deleted file mode 100644
index 533173a..0000000
--- a/gl/sha256.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/* Declarations of functions and data types used for SHA256 and SHA224 sum
-   library functions.
-   Copyright (C) 2005-2006, 2008-2022 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 SHA256_H
-# define SHA256_H 1
-
-# include <stdio.h>
-# include <stdint.h>
-
-# if HAVE_OPENSSL_SHA256
-#  ifndef OPENSSL_API_COMPAT
-#   define OPENSSL_API_COMPAT 0x10101000L /* FIXME: Use OpenSSL 1.1+ API.  */
-#  endif
-#  include <openssl/sha.h>
-# endif
-
-# ifdef __cplusplus
-extern "C" {
-# endif
-
-enum { SHA224_DIGEST_SIZE = 224 / 8 };
-enum { SHA256_DIGEST_SIZE = 256 / 8 };
-
-# if HAVE_OPENSSL_SHA256
-#  define GL_OPENSSL_NAME 224
-#  include "gl_openssl.h"
-#  define GL_OPENSSL_NAME 256
-#  include "gl_openssl.h"
-# else
-/* Structure to save state of computation between the single steps.  */
-struct sha256_ctx
-{
-  uint32_t state[8];
-
-  uint32_t total[2];
-  size_t buflen;       /* ≥ 0, ≤ 128 */
-  uint32_t buffer[32]; /* 128 bytes; the first buflen bytes are in use */
-};
-
-/* Initialize structure containing state of computation. */
-extern void sha256_init_ctx (struct sha256_ctx *ctx);
-extern void sha224_init_ctx (struct sha256_ctx *ctx);
-
-/* Starting with the result of former calls of this function (or the
-   initialization function update the context for the next LEN bytes
-   starting at BUFFER.
-   It is necessary that LEN is a multiple of 64!!! */
-extern void sha256_process_block (const void *buffer, size_t len,
-                                  struct sha256_ctx *ctx);
-
-/* Starting with the result of former calls of this function (or the
-   initialization function update the context for the next LEN bytes
-   starting at BUFFER.
-   It is NOT required that LEN is a multiple of 64.  */
-extern void sha256_process_bytes (const void *buffer, size_t len,
-                                  struct sha256_ctx *ctx);
-
-/* Process the remaining bytes in the buffer and put result from CTX
-   in first 32 (28) bytes following RESBUF.  The result is always in little
-   endian byte order, so that a byte-wise output yields to the wanted
-   ASCII representation of the message digest.  */
-extern void *sha256_finish_ctx (struct sha256_ctx *ctx, void *restrict resbuf);
-extern void *sha224_finish_ctx (struct sha256_ctx *ctx, void *restrict resbuf);
-
-
-/* Put result from CTX in first 32 (28) bytes following RESBUF.  The result is
-   always in little endian byte order, so that a byte-wise output yields
-   to the wanted ASCII representation of the message digest.  */
-extern void *sha256_read_ctx (const struct sha256_ctx *ctx,
-                              void *restrict resbuf);
-extern void *sha224_read_ctx (const struct sha256_ctx *ctx,
-                              void *restrict resbuf);
-
-
-/* Compute SHA256 (SHA224) message digest for LEN bytes beginning at BUFFER.
-   The result is always in little endian byte order, so that a byte-wise
-   output yields to the wanted ASCII representation of the message
-   digest.  */
-extern void *sha256_buffer (const char *buffer, size_t len,
-                            void *restrict resblock);
-extern void *sha224_buffer (const char *buffer, size_t len,
-                            void *restrict resblock);
-
-# endif
-
-/* Compute SHA256 (SHA224) message digest for bytes read from STREAM.
-   STREAM is an open file stream.  Regular files are handled more efficiently.
-   The contents of STREAM from its current position to its end will be read.
-   The case that the last operation on STREAM was an 'ungetc' is not supported.
-   The resulting message digest number will be written into the 32 (28) bytes
-   beginning at RESBLOCK.  */
-extern int sha256_stream (FILE *stream, void *resblock);
-extern int sha224_stream (FILE *stream, void *resblock);
-
-
-# ifdef __cplusplus
-}
-# endif
-
-#endif
-
-/*
- * Hey Emacs!
- * Local Variables:
- * coding: utf-8
- * End:
- */
diff --git a/gl/stdckdint.h b/gl/stdckdint.h
new file mode 100644
index 0000000..8eeac90
--- /dev/null
+++ b/gl/stdckdint.h
@@ -0,0 +1,38 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* stdckdint.h -- checked integer arithmetic
+
+   Copyright 2022 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.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 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_STDCKDINT_H
+#define _GL_STDCKDINT_H
+
+#include "intprops-internal.h"
+
+#include <stdbool.h>
+
+/* Store into *R the low-order bits of A + B, A - B, A * B, respectively.
+   Return 1 if the result overflows, 0 otherwise.
+   A, B, and *R can have any integer type other than char, bool, a
+   bit-precise integer type, or an enumeration type.
+
+   These are like the standard macros introduced in C23, except that
+   arguments should not have side effects.  */
+
+#define ckd_add(r, a, b) ((bool) _GL_INT_ADD_WRAPV (a, b, r))
+#define ckd_sub(r, a, b) ((bool) _GL_INT_SUBTRACT_WRAPV (a, b, r))
+#define ckd_mul(r, a, b) ((bool) _GL_INT_MULTIPLY_WRAPV (a, b, r))
+
+#endif /* _GL_STDCKDINT_H */
diff --git a/gl/stdio-impl.h b/gl/stdio-impl.h
deleted file mode 100644
index ed32e69..0000000
--- a/gl/stdio-impl.h
+++ /dev/null
@@ -1,212 +0,0 @@
-/* Implementation details of FILE streams.
-   Copyright (C) 2007-2008, 2010-2022 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/>.  */
-
-/* Many stdio implementations have the same logic and therefore can share
-   the same implementation of stdio extension API, except that some fields
-   have different naming conventions, or their access requires some casts.  */
-
-/* Glibc 2.28 made _IO_UNBUFFERED and _IO_IN_BACKUP private.  For now, work
-   around this problem by defining them ourselves.  FIXME: Do not rely on glibc
-   internals.  */
-#if defined _IO_EOF_SEEN
-# if !defined _IO_UNBUFFERED
-#  define _IO_UNBUFFERED 0x2
-# endif
-# if !defined _IO_IN_BACKUP
-#  define _IO_IN_BACKUP 0x100
-# endif
-#endif
-
-/* BSD stdio derived implementations.  */
-
-#if defined __NetBSD__                         /* NetBSD */
-/* Get __NetBSD_Version__.  */
-# include <sys/param.h>
-#endif
-
-#include <errno.h>                             /* For detecting Plan9.  */
-
-#if defined __sferror || defined __DragonFly__ || defined __ANDROID__
-  /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
-
-# if defined __DragonFly__          /* DragonFly */
-  /* See <https://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/lib/libc/stdio/priv_stdio.h>.  */
-#  define fp_ ((struct { struct __FILE_public pub; \
-                         struct { unsigned char *_base; int _size; } _bf; \
-                         void *cookie; \
-                         void *_close; \
-                         void *_read; \
-                         void *_seek; \
-                         void *_write; \
-                         struct { unsigned char *_base; int _size; } _ub; \
-                         int _ur; \
-                         unsigned char _ubuf[3]; \
-                         unsigned char _nbuf[1]; \
-                         struct { unsigned char *_base; int _size; } _lb; \
-                         int _blksize; \
-                         fpos_t _offset; \
-                         /* More fields, not relevant here.  */ \
-                       } *) fp)
-  /* See <https://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/include/stdio.h>.  */
-#  define _p pub._p
-#  define _flags pub._flags
-#  define _r pub._r
-#  define _w pub._w
-# elif defined __ANDROID__ /* Android */
-#  ifdef __LP64__
-#   define _gl_flags_file_t int
-#  else
-#   define _gl_flags_file_t short
-#  endif
-  /* Up to this commit from 2015-10-12
-     <https://android.googlesource.com/platform/bionic.git/+/f0141dfab10a4b332769d52fa76631a64741297a>
-     the innards of FILE were public, and fp_ub could be defined like for OpenBSD,
-     see <https://android.googlesource.com/platform/bionic.git/+/e78392637d5086384a5631ddfdfa8d7ec8326ee3/libc/stdio/fileext.h>
-     and <https://android.googlesource.com/platform/bionic.git/+/e78392637d5086384a5631ddfdfa8d7ec8326ee3/libc/stdio/local.h>.
-     After this commit, the innards of FILE are hidden.  */
-#  define fp_ ((struct { unsigned char *_p; \
-                         int _r; \
-                         int _w; \
-                         _gl_flags_file_t _flags; \
-                         _gl_flags_file_t _file; \
-                         struct { unsigned char *_base; size_t _size; } _bf; \
-                         int _lbfsize; \
-                         void *_cookie; \
-                         void *_close; \
-                         void *_read; \
-                         void *_seek; \
-                         void *_write; \
-                         struct { unsigned char *_base; size_t _size; } _ext; \
-                         unsigned char *_up; \
-                         int _ur; \
-                         unsigned char _ubuf[3]; \
-                         unsigned char _nbuf[1]; \
-                         struct { unsigned char *_base; size_t _size; } _lb; \
-                         int _blksize; \
-                         fpos_t _offset; \
-                         /* More fields, not relevant here.  */ \
-                       } *) fp)
-# else
-#  define fp_ fp
-# endif
-
-# if (defined __NetBSD__ && __NetBSD_Version__ >= 105270000) || defined __OpenBSD__ || defined __minix /* NetBSD >= 1.5ZA, OpenBSD, Minix 3 */
-  /* See <http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/stdio/fileext.h?rev=HEAD&content-type=text/x-cvsweb-markup>
-     and <https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdio/fileext.h?rev=HEAD&content-type=text/x-cvsweb-markup>
-     and <https://github.com/Stichting-MINIX-Research-Foundation/minix/blob/master/lib/libc/stdio/fileext.h> */
-  struct __sfileext
-    {
-      struct  __sbuf _ub; /* ungetc buffer */
-      /* More fields, not relevant here.  */
-    };
-#  define fp_ub ((struct __sfileext *) fp->_ext._base)->_ub
-# elif defined __ANDROID__                     /* Android */
-  struct __sfileext
-    {
-      struct { unsigned char *_base; size_t _size; } _ub; /* ungetc buffer */
-      /* More fields, not relevant here.  */
-    };
-#  define fp_ub ((struct __sfileext *) fp_->_ext._base)->_ub
-# else                                         /* FreeBSD, NetBSD <= 1.5Z, DragonFly, Mac OS X, Cygwin */
-#  define fp_ub fp_->_ub
-# endif
-
-# define HASUB(fp) (fp_ub._base != NULL)
-
-# if defined __ANDROID__ /* Android */
-  /* Needed after this commit from 2016-01-25
-     <https://android.googlesource.com/platform/bionic.git/+/e70e0e9267d069bf56a5078c99307e08a7280de7> */
-#  ifndef __SEOF
-#   define __SLBF 1
-#   define __SNBF 2
-#   define __SRD 4
-#   define __SWR 8
-#   define __SRW 0x10
-#   define __SEOF 0x20
-#   define __SERR 0x40
-#  endif
-#  ifndef __SOFF
-#   define __SOFF 0x1000
-#  endif
-# endif
-
-#endif
-
-
-/* SystemV derived implementations.  */
-
-#ifdef __TANDEM                     /* NonStop Kernel */
-# ifndef _IOERR
-/* These values were determined by the program 'stdioext-flags' at
-   <https://lists.gnu.org/r/bug-gnulib/2010-12/msg00165.html>.  */
-#  define _IOERR   0x40
-#  define _IOREAD  0x80
-#  define _IOWRT    0x4
-#  define _IORW   0x100
-# endif
-#endif
-
-#if defined _IOERR
-
-# if defined __sun && defined _LP64 /* Solaris/{SPARC,AMD64} 64-bit */
-#  define fp_ ((struct { unsigned char *_ptr; \
-                         unsigned char *_base; \
-                         unsigned char *_end; \
-                         long _cnt; \
-                         int _file; \
-                         unsigned int _flag; \
-                       } *) fp)
-# elif defined __VMS                /* OpenVMS */
-#  define fp_ ((struct _iobuf *) fp)
-# else
-#  define fp_ fp
-# endif
-
-# if defined _SCO_DS || (defined __SCO_VERSION__ || defined __sysv5__)  /* OpenServer 5, OpenServer 6, UnixWare 7 */
-#  define _cnt __cnt
-#  define _ptr __ptr
-#  define _base __base
-#  define _flag __flag
-# endif
-
-#elif defined _WIN32 && ! defined __CYGWIN__  /* newer Windows with MSVC */
-
-/* <stdio.h> does not define the innards of FILE any more.  */
-# define WINDOWS_OPAQUE_FILE
-
-struct _gl_real_FILE
-{
-  /* Note: Compared to older Windows and to mingw, it has the fields
-     _base and _cnt swapped. */
-  unsigned char *_ptr;
-  unsigned char *_base;
-  int _cnt;
-  int _flag;
-  int _file;
-  int _charbuf;
-  int _bufsiz;
-};
-# define fp_ ((struct _gl_real_FILE *) fp)
-
-/* These values were determined by a program similar to the one at
-   <https://lists.gnu.org/r/bug-gnulib/2010-12/msg00165.html>.  */
-# define _IOREAD   0x1
-# define _IOWRT    0x2
-# define _IORW     0x4
-# define _IOEOF    0x8
-# define _IOERR   0x10
-
-#endif
diff --git a/gl/sys-limits.h b/gl/sys-limits.h
deleted file mode 100644
index d154f0b..0000000
--- a/gl/sys-limits.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/* System call limits
-
-   Copyright 2018-2022 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_SYS_LIMITS_H
-#define _GL_SYS_LIMITS_H
-
-#include <limits.h>
-
-/* Maximum number of bytes to read or write in a single system call.
-   This can be useful for system calls like sendfile on GNU/Linux,
-   which do not handle more than MAX_RW_COUNT bytes correctly.
-   The Linux kernel MAX_RW_COUNT is at least INT_MAX >> 20 << 20,
-   where the 20 comes from the Hexagon port with 1 MiB pages; use that
-   as an approximation, as the exact value may not be available to us.
-
-   Using this also works around a serious Linux bug before 2.6.16; see
-   <https://bugzilla.redhat.com/show_bug.cgi?id=612839>.
-
-   Using this also works around a Tru64 5.1 bug, where attempting
-   to read INT_MAX bytes fails with errno == EINVAL.  See
-   <https://lists.gnu.org/r/bug-gnu-utils/2002-04/msg00010.html>.
-
-   Using this is likely to work around similar bugs in other operating
-   systems.  */
-
-enum { SYS_BUFSIZE_MAX = INT_MAX >> 20 << 20 };
-
-#endif



More information about the Commits mailing list