summaryrefslogtreecommitdiff
path: root/cross
diff options
context:
space:
mode:
authorPo Lu <luangruo@yahoo.com>2023-03-05 10:22:33 +0800
committerPo Lu <luangruo@yahoo.com>2023-03-05 10:22:33 +0800
commitf484f6b74f1731469fc7e080c0216269a0a79916 (patch)
treee8b22d7623462342f492e6b41cb63a6de4b6b630 /cross
parent3be448f429065cc9ed874e940ec4f40a0a1c7abf (diff)
downloademacs-f484f6b74f1731469fc7e080c0216269a0a79916.tar.gz
Remove redundant gnulib files
* cross/lib: Delete. Make configure generate it instead.
Diffstat (limited to 'cross')
-rw-r--r--cross/lib/COPYING674
-rw-r--r--cross/lib/_Noreturn.h50
-rw-r--r--cross/lib/acl-errno-valid.c52
-rw-r--r--cross/lib/acl-internal.c507
-rw-r--r--cross/lib/acl-internal.h301
-rw-r--r--cross/lib/acl.h34
-rw-r--r--cross/lib/acl_entries.c75
-rw-r--r--cross/lib/af_alg.h115
-rw-r--r--cross/lib/alloca.in.h72
-rw-r--r--cross/lib/allocator.c22
-rw-r--r--cross/lib/allocator.h58
-rw-r--r--cross/lib/arg-nonnull.h26
-rw-r--r--cross/lib/asnprintf.c34
-rw-r--r--cross/lib/asprintf.c39
-rw-r--r--cross/lib/assert.in.h27
-rw-r--r--cross/lib/at-func.c146
-rw-r--r--cross/lib/attribute.h226
-rw-r--r--cross/lib/binary-io.c39
-rw-r--r--cross/lib/binary-io.h77
-rw-r--r--cross/lib/byteswap.in.h44
-rw-r--r--cross/lib/c++defs.h331
-rw-r--r--cross/lib/c-ctype.c21
-rw-r--r--cross/lib/c-ctype.h364
-rw-r--r--cross/lib/c-strcase.h56
-rw-r--r--cross/lib/c-strcasecmp.c56
-rw-r--r--cross/lib/c-strncasecmp.c56
-rw-r--r--cross/lib/canonicalize-lgpl.c469
-rw-r--r--cross/lib/careadlinkat.c184
-rw-r--r--cross/lib/careadlinkat.h67
-rw-r--r--cross/lib/cdefs.h715
-rw-r--r--cross/lib/cloexec.c83
-rw-r--r--cross/lib/cloexec.h34
-rw-r--r--cross/lib/close-stream.c77
-rw-r--r--cross/lib/close-stream.h20
-rw-r--r--cross/lib/copy-file-range.c67
-rw-r--r--cross/lib/count-leading-zeros.c21
-rw-r--r--cross/lib/count-leading-zeros.h136
-rw-r--r--cross/lib/count-one-bits.c25
-rw-r--r--cross/lib/count-one-bits.h164
-rw-r--r--cross/lib/count-trailing-zeros.c21
-rw-r--r--cross/lib/count-trailing-zeros.h126
-rw-r--r--cross/lib/diffseq.h568
-rw-r--r--cross/lib/dirent.in.h321
-rw-r--r--cross/lib/dirfd.c98
-rw-r--r--cross/lib/dtoastr.c19
-rw-r--r--cross/lib/dtotimespec.c53
-rw-r--r--cross/lib/dup2.c189
-rw-r--r--cross/lib/dynarray.h284
-rw-r--r--cross/lib/eloop-threshold.h83
-rw-r--r--cross/lib/errno.in.h279
-rw-r--r--cross/lib/euidaccess.c226
-rw-r--r--cross/lib/execinfo.c21
-rw-r--r--cross/lib/execinfo.in.h57
-rw-r--r--cross/lib/explicit_bzero.c74
-rw-r--r--cross/lib/faccessat.c94
-rw-r--r--cross/lib/fchmodat.c142
-rw-r--r--cross/lib/fcntl.c629
-rw-r--r--cross/lib/fcntl.in.h445
-rw-r--r--cross/lib/fdopendir.c249
-rw-r--r--cross/lib/file-has-acl.c621
-rw-r--r--cross/lib/filemode.c166
-rw-r--r--cross/lib/filemode.h44
-rw-r--r--cross/lib/filename.h112
-rw-r--r--cross/lib/filevercmp.c188
-rw-r--r--cross/lib/filevercmp.h78
-rw-r--r--cross/lib/fingerprint.c66
-rw-r--r--cross/lib/fingerprint.h28
-rw-r--r--cross/lib/flexmember.h60
-rw-r--r--cross/lib/float+.h147
-rw-r--r--cross/lib/float.c33
-rw-r--r--cross/lib/float.in.h194
-rw-r--r--cross/lib/fpending.c63
-rw-r--r--cross/lib/fpending.h29
-rw-r--r--cross/lib/fpucw.h108
-rw-r--r--cross/lib/free.c53
-rw-r--r--cross/lib/frexp.c168
-rw-r--r--cross/lib/frexpl.c35
-rw-r--r--cross/lib/fseterr.c84
-rw-r--r--cross/lib/fseterr.h45
-rw-r--r--cross/lib/fstatat.c148
-rw-r--r--cross/lib/fsusage.c233
-rw-r--r--cross/lib/fsusage.h39
-rw-r--r--cross/lib/fsync.c87
-rw-r--r--cross/lib/ftoastr.c151
-rw-r--r--cross/lib/ftoastr.h152
-rw-r--r--cross/lib/futimens.c37
-rw-r--r--cross/lib/get-permissions.c291
-rw-r--r--cross/lib/getdelim.c147
-rw-r--r--cross/lib/getdtablesize.c124
-rw-r--r--cross/lib/getgroups.c125
-rw-r--r--cross/lib/getline.c27
-rw-r--r--cross/lib/getloadavg.c943
-rw-r--r--cross/lib/getopt-cdefs.in.h66
-rw-r--r--cross/lib/getopt-core.h96
-rw-r--r--cross/lib/getopt-ext.h77
-rw-r--r--cross/lib/getopt-pfx-core.h66
-rw-r--r--cross/lib/getopt-pfx-ext.h70
-rw-r--r--cross/lib/getopt.c811
-rw-r--r--cross/lib/getopt.in.h61
-rw-r--r--cross/lib/getopt1.c159
-rw-r--r--cross/lib/getopt_int.h118
-rw-r--r--cross/lib/getrandom.c190
-rw-r--r--cross/lib/gettext.h300
-rw-r--r--cross/lib/gettime.c51
-rw-r--r--cross/lib/gettimeofday.c153
-rw-r--r--cross/lib/group-member.c114
-rw-r--r--cross/lib/idx.h134
-rw-r--r--cross/lib/ieee754.in.h222
-rw-r--r--cross/lib/ignore-value.h51
-rw-r--r--cross/lib/intprops-internal.h392
-rw-r--r--cross/lib/intprops.h335
-rw-r--r--cross/lib/inttypes.in.h1028
-rw-r--r--cross/lib/isnan.c190
-rw-r--r--cross/lib/isnand-nolibm.h33
-rw-r--r--cross/lib/isnand.c19
-rw-r--r--cross/lib/isnanf-nolibm.h41
-rw-r--r--cross/lib/isnanf.c20
-rw-r--r--cross/lib/isnanl-nolibm.h34
-rw-r--r--cross/lib/isnanl.c20
-rw-r--r--cross/lib/itold.c28
-rw-r--r--cross/lib/lchmod.c94
-rw-r--r--cross/lib/libc-config.h204
-rw-r--r--cross/lib/limits.in.h134
-rw-r--r--cross/lib/lstat.c104
-rw-r--r--cross/lib/malloc.c51
-rw-r--r--cross/lib/malloc/dynarray-skeleton.c528
-rw-r--r--cross/lib/malloc/dynarray.h177
-rw-r--r--cross/lib/malloc/dynarray_at_failure.c40
-rw-r--r--cross/lib/malloc/dynarray_emplace_enlarge.c77
-rw-r--r--cross/lib/malloc/dynarray_finalize.c66
-rw-r--r--cross/lib/malloc/dynarray_resize.c68
-rw-r--r--cross/lib/malloc/dynarray_resize_clear.c39
-rw-r--r--cross/lib/malloc/scratch_buffer.h135
-rw-r--r--cross/lib/malloc/scratch_buffer_dupfree.c41
-rw-r--r--cross/lib/malloc/scratch_buffer_grow.c56
-rw-r--r--cross/lib/malloc/scratch_buffer_grow_preserve.c67
-rw-r--r--cross/lib/malloc/scratch_buffer_set_array_size.c64
-rw-r--r--cross/lib/math.c22
-rw-r--r--cross/lib/math.in.h2735
-rw-r--r--cross/lib/md5-stream.c141
-rw-r--r--cross/lib/md5.c394
-rw-r--r--cross/lib/md5.h151
-rw-r--r--cross/lib/memmem.c71
-rw-r--r--cross/lib/mempcpy.c33
-rw-r--r--cross/lib/memrchr.c161
-rw-r--r--cross/lib/memset_explicit.c55
-rw-r--r--cross/lib/min-max.h6
-rw-r--r--cross/lib/mini-gmp-gnulib.c48
-rw-r--r--cross/lib/mini-gmp.c4620
-rw-r--r--cross/lib/mini-gmp.h310
-rw-r--r--cross/lib/minmax.h60
-rw-r--r--cross/lib/mkostemp.c46
-rw-r--r--cross/lib/mktime-internal.h79
-rw-r--r--cross/lib/mktime.c578
-rw-r--r--cross/lib/nanosleep.c193
-rw-r--r--cross/lib/nproc.c404
-rw-r--r--cross/lib/nproc.h46
-rw-r--r--cross/lib/nstrftime.c1490
-rw-r--r--cross/lib/open.c209
-rw-r--r--cross/lib/openat-die.c7
-rw-r--r--cross/lib/openat-priv.h64
-rw-r--r--cross/lib/openat-proc.c154
-rw-r--r--cross/lib/openat.h124
-rw-r--r--cross/lib/pathmax.h83
-rw-r--r--cross/lib/pipe2.c166
-rw-r--r--cross/lib/printf-args.c183
-rw-r--r--cross/lib/printf-args.h150
-rw-r--r--cross/lib/printf-frexp.c190
-rw-r--r--cross/lib/printf-frexp.h23
-rw-r--r--cross/lib/printf-frexpl.c37
-rw-r--r--cross/lib/printf-frexpl.h23
-rw-r--r--cross/lib/printf-parse.c623
-rw-r--r--cross/lib/printf-parse.h193
-rw-r--r--cross/lib/printf.c40
-rw-r--r--cross/lib/pselect.c110
-rw-r--r--cross/lib/pthread_sigmask.c92
-rw-r--r--cross/lib/qcopy-acl.c85
-rw-r--r--cross/lib/rawmemchr.c123
-rw-r--r--cross/lib/rawmemchr.valgrind28
-rw-r--r--cross/lib/readlink.c104
-rw-r--r--cross/lib/readlinkat.c113
-rw-r--r--cross/lib/realloc.c63
-rw-r--r--cross/lib/regcomp.c3788
-rw-r--r--cross/lib/regex.c84
-rw-r--r--cross/lib/regex.h699
-rw-r--r--cross/lib/regex_internal.c1711
-rw-r--r--cross/lib/regex_internal.h834
-rw-r--r--cross/lib/regexec.c4221
-rw-r--r--cross/lib/root-uid.h30
-rw-r--r--cross/lib/save-cwd.c89
-rw-r--r--cross/lib/save-cwd.h34
-rw-r--r--cross/lib/scratch_buffer.h117
-rw-r--r--cross/lib/set-permissions.c847
-rw-r--r--cross/lib/sha1.c360
-rw-r--r--cross/lib/sha1.h115
-rw-r--r--cross/lib/sha256.c432
-rw-r--r--cross/lib/sha256.h121
-rw-r--r--cross/lib/sha512.c477
-rw-r--r--cross/lib/sha512.h124
-rw-r--r--cross/lib/sig2str.c364
-rw-r--r--cross/lib/sig2str.h53
-rw-r--r--cross/lib/sigdescr_np.c376
-rw-r--r--cross/lib/signal.in.h495
-rw-r--r--cross/lib/signbitd.c64
-rw-r--r--cross/lib/signbitf.c64
-rw-r--r--cross/lib/signbitl.c64
-rw-r--r--cross/lib/size_max.h30
-rw-r--r--cross/lib/stat-time.c21
-rw-r--r--cross/lib/stat-time.h251
-rw-r--r--cross/lib/stdalign.in.h49
-rw-r--r--cross/lib/stdckdint.in.h35
-rw-r--r--cross/lib/stddef.in.h147
-rw-r--r--cross/lib/stdint.in.h740
-rw-r--r--cross/lib/stdio-impl.h218
-rw-r--r--cross/lib/stdio.in.h1723
-rw-r--r--cross/lib/stdlib.in.h1678
-rw-r--r--cross/lib/stpcpy.c49
-rw-r--r--cross/lib/stpncpy.c92
-rw-r--r--cross/lib/str-two-way.h452
-rw-r--r--cross/lib/strftime.h38
-rw-r--r--cross/lib/string.in.h1359
-rw-r--r--cross/lib/strnlen.c30
-rw-r--r--cross/lib/strtoimax.c70
-rw-r--r--cross/lib/strtol.c408
-rw-r--r--cross/lib/strtoll.c33
-rw-r--r--cross/lib/symlink.c57
-rw-r--r--cross/lib/sys_random.in.h100
-rw-r--r--cross/lib/sys_select.in.h334
-rw-r--r--cross/lib/sys_stat.in.h958
-rw-r--r--cross/lib/sys_time.in.h224
-rw-r--r--cross/lib/sys_types.in.h106
-rw-r--r--cross/lib/tempname.c286
-rw-r--r--cross/lib/tempname.h72
-rw-r--r--cross/lib/time-internal.h49
-rw-r--r--cross/lib/time.in.h471
-rw-r--r--cross/lib/time_r.c44
-rw-r--r--cross/lib/time_rz.c316
-rw-r--r--cross/lib/timegm.c58
-rw-r--r--cross/lib/timespec-add.c65
-rw-r--r--cross/lib/timespec-sub.c65
-rw-r--r--cross/lib/timespec.c21
-rw-r--r--cross/lib/timespec.h102
-rw-r--r--cross/lib/u64.c22
-rw-r--r--cross/lib/u64.h179
-rw-r--r--cross/lib/unistd.c22
-rw-r--r--cross/lib/unistd.in.h2411
-rw-r--r--cross/lib/unlocked-io.h136
-rw-r--r--cross/lib/utimens.c646
-rw-r--r--cross/lib/utimens.h49
-rw-r--r--cross/lib/utimensat.c217
-rw-r--r--cross/lib/vasnprintf.c5741
-rw-r--r--cross/lib/vasnprintf.h72
-rw-r--r--cross/lib/vasprintf.c50
-rw-r--r--cross/lib/verify.h367
-rw-r--r--cross/lib/vfprintf.c70
-rw-r--r--cross/lib/vla.h53
-rw-r--r--cross/lib/warn-on-use.h149
-rw-r--r--cross/lib/xalloc-oversized.h65
-rw-r--r--cross/lib/xsize.c21
-rw-r--r--cross/lib/xsize.h108
260 files changed, 0 insertions, 72514 deletions
diff --git a/cross/lib/COPYING b/cross/lib/COPYING
deleted file mode 100644
index f288702d2fa..00000000000
--- a/cross/lib/COPYING
+++ /dev/null
@@ -1,674 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users. We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors. You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
- To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights. Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received. You must make sure that they, too, receive
-or can get the source code. And you must show them these terms so they
-know their rights.
-
- Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
- For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software. For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
- Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so. This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software. The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable. Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products. If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
- Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary. To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS
-
- 0. Definitions.
-
- "This License" refers to version 3 of the GNU General Public License.
-
- "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
-"recipients" may be individuals or organizations.
-
- To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
- A "covered work" means either the unmodified Program or a work based
-on the Program.
-
- To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
- An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
- 1. Source Code.
-
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
-form of a work.
-
- A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
- The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
- The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
- The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
- The Corresponding Source for a work in source code form is that
-same work.
-
- 2. Basic Permissions.
-
- All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
- You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
-makes it unnecessary.
-
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
- No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
- When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
- 4. Conveying Verbatim Copies.
-
- You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
- You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
- 5. Conveying Modified Source Versions.
-
- You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified
- it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is
- released under this License and any conditions added under section
- 7. This requirement modifies the requirement in section 4 to
- "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this
- License to anyone who comes into possession of a copy. This
- License will therefore apply, along with any applicable section 7
- additional terms, to the whole of the work, and all its parts,
- regardless of how they are packaged. This License gives no
- permission to license the work in any other way, but it does not
- invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display
- Appropriate Legal Notices; however, if the Program has interactive
- interfaces that do not display Appropriate Legal Notices, your
- work need not make them do so.
-
- A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
- 6. Conveying Non-Source Forms.
-
- You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by the
- Corresponding Source fixed on a durable physical medium
- customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by a
- written offer, valid for at least three years and valid for as
- long as you offer spare parts or customer support for that product
- model, to give anyone who possesses the object code either (1) a
- copy of the Corresponding Source for all the software in the
- product that is covered by this License, on a durable physical
- medium customarily used for software interchange, for a price no
- more than your reasonable cost of physically performing this
- conveying of source, or (2) access to copy the
- Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the
- written offer to provide the Corresponding Source. This
- alternative is allowed only occasionally and noncommercially, and
- only if you received the object code with such an offer, in accord
- with subsection 6b.
-
- d) Convey the object code by offering access from a designated
- place (gratis or for a charge), and offer equivalent access to the
- Corresponding Source in the same way through the same place at no
- further charge. You need not require recipients to copy the
- Corresponding Source along with the object code. If the place to
- copy the object code is a network server, the Corresponding Source
- may be on a different server (operated by you or a third party)
- that supports equivalent copying facilities, provided you maintain
- clear directions next to the object code saying where to find the
- Corresponding Source. Regardless of what server hosts the
- Corresponding Source, you remain obligated to ensure that it is
- available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided
- you inform other peers where the object code and Corresponding
- Source of the work are being offered to the general public at no
- charge under subsection 6d.
-
- A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
- A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
- "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
- If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
- The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
- Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
- 7. Additional Terms.
-
- "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
- When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
- Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the
- terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or
- author attributions in that material or in the Appropriate Legal
- Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or
- requiring that modified versions of such material be marked in
- reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or
- authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some
- trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that
- material by anyone who conveys the material (or modified versions of
- it) with contractual assumptions of liability to the recipient, for
- any liability that these contractual assumptions directly impose on
- those licensors and authors.
-
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
- If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
- Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
- 8. Termination.
-
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
- However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
- Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
- 9. Acceptance Not Required for Having Copies.
-
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
-nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
- 10. Automatic Licensing of Downstream Recipients.
-
- Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
-for enforcing compliance by third parties with this License.
-
- An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
- 11. Patents.
-
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
-work thus licensed is called the contributor's "contributor version".
-
- A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
- Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
- In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
- If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
- If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
- A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
- Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
- 12. No Surrender of Others' Freedom.
-
- If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
- 13. Use with the GNU Affero General Public License.
-
- Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work. The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
- 14. Revised Versions of this License.
-
- The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
- If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
- 15. Disclaimer of Warranty.
-
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. Limitation of Liability.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
- 17. Interpretation of Sections 15 and 16.
-
- If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
- If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
- <program> Copyright (C) <year> <name of author>
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-<https://www.gnu.org/licenses/>.
-
- The GNU General Public License does not permit incorporating your program
-into proprietary programs. If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License. But first, please read
-<https://www.gnu.org/licenses/why-not-lgpl.html>.
diff --git a/cross/lib/_Noreturn.h b/cross/lib/_Noreturn.h
deleted file mode 100644
index 6ecea98b54a..00000000000
--- a/cross/lib/_Noreturn.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/* A C macro for declaring that a function does not return.
- Copyright (C) 2011-2023 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 _Noreturn
-# if (defined __cplusplus \
- && ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \
- || (defined _MSC_VER && 1900 <= _MSC_VER)) \
- && 0)
- /* [[noreturn]] is not practically usable, because with it the syntax
- extern _Noreturn void func (...);
- would not be valid; such a declaration would only be valid with 'extern'
- and '_Noreturn' swapped, or without the 'extern' keyword. However, some
- AIX system header files and several gnulib header files use precisely
- this syntax with 'extern'. */
-# define _Noreturn [[noreturn]]
-# elif (defined __clang__ && __clang_major__ < 16 \
- && defined _GL_WORK_AROUND_LLVM_BUG_59792)
- /* Compile with -D_GL_WORK_AROUND_LLVM_BUG_59792 to work around
- that rare LLVM bug, though you may get many false-alarm warnings. */
-# define _Noreturn
-# elif ((!defined __cplusplus || defined __clang__) \
- && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
- || (!defined __STRICT_ANSI__ \
- && (4 < __GNUC__ + (7 <= __GNUC_MINOR__) \
- || (defined __apple_build_version__ \
- ? 6000000 <= __apple_build_version__ \
- : 3 < __clang_major__ + (5 <= __clang_minor__))))))
- /* _Noreturn works as-is. */
-# elif (2 < __GNUC__ + (8 <= __GNUC_MINOR__) || defined __clang__ \
- || 0x5110 <= __SUNPRO_C)
-# define _Noreturn __attribute__ ((__noreturn__))
-# elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
-# define _Noreturn __declspec (noreturn)
-# else
-# define _Noreturn
-# endif
-#endif
diff --git a/cross/lib/acl-errno-valid.c b/cross/lib/acl-errno-valid.c
deleted file mode 100644
index a4fd575e3f3..00000000000
--- a/cross/lib/acl-errno-valid.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/* Test whether ACLs are well supported on this system.
-
- Copyright 2013-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>.
-
- Written by Paul Eggert. */
-
-#include <config.h>
-
-#include <acl.h>
-
-#include <errno.h>
-
-/* Return true if errno value ERRNUM indicates that ACLs are well
- supported on this system. ERRNUM should be an errno value obtained
- after an ACL-related system call fails. */
-bool
-acl_errno_valid (int errnum)
-{
- /* Recognize some common errors such as from an NFS mount that does
- not support ACLs, even when local drives do. */
- switch (errnum)
- {
- case EBUSY: return false;
- case EINVAL: return false;
-#if defined __APPLE__ && defined __MACH__
- case ENOENT: return false;
-#endif
- case ENOSYS: return false;
-
-#if defined ENOTSUP && ENOTSUP != EOPNOTSUPP
-# if ENOTSUP != ENOSYS /* Needed for the MS-Windows port of GNU Emacs. */
- case ENOTSUP: return false;
-# endif
-#endif
-
- case EOPNOTSUPP: return false;
- default: return true;
- }
-}
diff --git a/cross/lib/acl-internal.c b/cross/lib/acl-internal.c
deleted file mode 100644
index fbe9b2c9a06..00000000000
--- a/cross/lib/acl-internal.c
+++ /dev/null
@@ -1,507 +0,0 @@
-/* Test whether a file has a nontrivial ACL. -*- coding: utf-8 -*-
-
- Copyright (C) 2002-2003, 2005-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>.
-
- Written by Paul Eggert, Andreas Grünbacher, and Bruno Haible. */
-
-#include <config.h>
-
-#include "acl.h"
-
-#include "acl-internal.h"
-
-#if USE_ACL && HAVE_ACL_GET_FILE /* Linux, FreeBSD, Mac OS X, IRIX, Tru64, Cygwin >= 2.5 */
-
-# if HAVE_ACL_TYPE_EXTENDED /* Mac OS X */
-
-/* ACL is an ACL, from a file, stored as type ACL_TYPE_EXTENDED.
- Return 1 if the given ACL is non-trivial.
- Return 0 if it is trivial. */
-int
-acl_extended_nontrivial (acl_t acl)
-{
- /* acl is non-trivial if it is non-empty. */
- return (acl_entries (acl) > 0);
-}
-
-# else /* Linux, FreeBSD, IRIX, Tru64, Cygwin >= 2.5 */
-
-/* ACL is an ACL, from a file, stored as type ACL_TYPE_ACCESS.
- Return 1 if the given ACL is non-trivial.
- Return 0 if it is trivial, i.e. equivalent to a simple stat() mode.
- Return -1 and set errno upon failure to determine it. */
-int
-acl_access_nontrivial (acl_t acl)
-{
- /* acl is non-trivial if it has some entries other than for "user::",
- "group::", and "other::". Normally these three should be present
- at least, allowing us to write
- return (3 < acl_entries (acl));
- but the following code is more robust. */
-# if HAVE_ACL_FIRST_ENTRY /* Linux, FreeBSD, Cygwin >= 2.5 */
-
- acl_entry_t ace;
- int got_one;
-
- for (got_one = acl_get_entry (acl, ACL_FIRST_ENTRY, &ace);
- got_one > 0;
- got_one = acl_get_entry (acl, ACL_NEXT_ENTRY, &ace))
- {
- acl_tag_t tag;
- if (acl_get_tag_type (ace, &tag) < 0)
- return -1;
- if (!(tag == ACL_USER_OBJ || tag == ACL_GROUP_OBJ || tag == ACL_OTHER))
- return 1;
- }
- return got_one;
-
-# elif HAVE_ACL_TO_SHORT_TEXT /* IRIX */
- /* Don't use acl_get_entry: it is undocumented. */
-
- int count = acl->acl_cnt;
- int i;
-
- for (i = 0; i < count; i++)
- {
- acl_entry_t ace = &acl->acl_entry[i];
- acl_tag_t tag = ace->ae_tag;
-
- if (!(tag == ACL_USER_OBJ || tag == ACL_GROUP_OBJ
- || tag == ACL_OTHER_OBJ))
- return 1;
- }
- return 0;
-
-# elif HAVE_ACL_FREE_TEXT /* Tru64 */
- /* Don't use acl_get_entry: it takes only one argument and does not work. */
-
- int count = acl->acl_num;
- acl_entry_t ace;
-
- for (ace = acl->acl_first; count > 0; ace = ace->next, count--)
- {
- acl_tag_t tag;
- acl_perm_t perm;
-
- tag = ace->entry->acl_type;
- if (!(tag == ACL_USER_OBJ || tag == ACL_GROUP_OBJ || tag == ACL_OTHER))
- return 1;
-
- perm = ace->entry->acl_perm;
- /* On Tru64, perm can also contain non-standard bits such as
- PERM_INSERT, PERM_DELETE, PERM_MODIFY, PERM_LOOKUP, ... */
- if ((perm & ~(ACL_READ | ACL_WRITE | ACL_EXECUTE)) != 0)
- return 1;
- }
- return 0;
-
-# else
-
- errno = ENOSYS;
- return -1;
-# endif
-}
-
-int
-acl_default_nontrivial (acl_t acl)
-{
- /* acl is non-trivial if it is non-empty. */
- return (acl_entries (acl) > 0);
-}
-
-# endif
-
-#elif USE_ACL && HAVE_FACL && defined GETACL /* Solaris, Cygwin < 2.5, not HP-UX */
-
-/* Test an ACL retrieved with GETACL.
- Return 1 if the given ACL, consisting of COUNT entries, is non-trivial.
- Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
-int
-acl_nontrivial (int count, aclent_t *entries)
-{
- int i;
-
- for (i = 0; i < count; i++)
- {
- aclent_t *ace = &entries[i];
-
- /* Note: If ace->a_type = USER_OBJ, ace->a_id is the st_uid from stat().
- If ace->a_type = GROUP_OBJ, ace->a_id is the st_gid from stat().
- We don't need to check ace->a_id in these cases. */
- if (!(ace->a_type == USER_OBJ
- || ace->a_type == GROUP_OBJ
- || ace->a_type == OTHER_OBJ
- /* Note: Cygwin does not return a CLASS_OBJ ("mask:") entry
- sometimes. */
- || ace->a_type == CLASS_OBJ))
- return 1;
- }
- return 0;
-}
-
-# ifdef ACE_GETACL
-
-/* A shortcut for a bitmask. */
-# define NEW_ACE_WRITEA_DATA (NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA)
-
-/* Test an ACL retrieved with ACE_GETACL.
- Return 1 if the given ACL, consisting of COUNT entries, is non-trivial.
- Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
-int
-acl_ace_nontrivial (int count, ace_t *entries)
-{
- int i;
-
- /* The flags in the ace_t structure changed in a binary incompatible way
- when ACL_NO_TRIVIAL etc. were introduced in <sys/acl.h> version 1.15.
- How to distinguish the two conventions at runtime?
- In the old convention, usually three ACEs have a_flags = ACE_OWNER /
- ACE_GROUP / ACE_OTHER, in the range 0x0100..0x0400. In the new
- convention, these values are not used. */
- int old_convention = 0;
-
- for (i = 0; i < count; i++)
- if (entries[i].a_flags & (OLD_ACE_OWNER | OLD_ACE_GROUP | OLD_ACE_OTHER))
- {
- old_convention = 1;
- break;
- }
-
- if (old_convention)
- /* Running on Solaris 10. */
- for (i = 0; i < count; i++)
- {
- ace_t *ace = &entries[i];
-
- /* Note:
- If ace->a_flags = ACE_OWNER, ace->a_who is the st_uid from stat().
- If ace->a_flags = ACE_GROUP, ace->a_who is the st_gid from stat().
- We don't need to check ace->a_who in these cases. */
- if (!(ace->a_type == OLD_ALLOW
- && (ace->a_flags == OLD_ACE_OWNER
- || ace->a_flags == OLD_ACE_GROUP
- || ace->a_flags == OLD_ACE_OTHER)))
- return 1;
- }
- else
- {
- /* Running on Solaris 10 (newer version) or Solaris 11. */
- unsigned int access_masks[6] =
- {
- 0, /* owner@ deny */
- 0, /* owner@ allow */
- 0, /* group@ deny */
- 0, /* group@ allow */
- 0, /* everyone@ deny */
- 0 /* everyone@ allow */
- };
-
- for (i = 0; i < count; i++)
- {
- ace_t *ace = &entries[i];
- unsigned int index1;
- unsigned int index2;
-
- if (ace->a_type == NEW_ACE_ACCESS_ALLOWED_ACE_TYPE)
- index1 = 1;
- else if (ace->a_type == NEW_ACE_ACCESS_DENIED_ACE_TYPE)
- index1 = 0;
- else
- return 1;
-
- if (ace->a_flags == NEW_ACE_OWNER)
- index2 = 0;
- else if (ace->a_flags == (NEW_ACE_GROUP | NEW_ACE_IDENTIFIER_GROUP))
- index2 = 2;
- else if (ace->a_flags == NEW_ACE_EVERYONE)
- index2 = 4;
- else
- return 1;
-
- access_masks[index1 + index2] |= ace->a_access_mask;
- }
-
- /* The same bit shouldn't be both allowed and denied. */
- if (access_masks[0] & access_masks[1])
- return 1;
- if (access_masks[2] & access_masks[3])
- return 1;
- if (access_masks[4] & access_masks[5])
- return 1;
-
- /* Check minimum masks. */
- if ((NEW_ACE_WRITE_NAMED_ATTRS
- | NEW_ACE_WRITE_ATTRIBUTES
- | NEW_ACE_WRITE_ACL
- | NEW_ACE_WRITE_OWNER)
- & ~ access_masks[1])
- return 1;
- access_masks[1] &= ~(NEW_ACE_WRITE_NAMED_ATTRS
- | NEW_ACE_WRITE_ATTRIBUTES
- | NEW_ACE_WRITE_ACL
- | NEW_ACE_WRITE_OWNER);
- if ((NEW_ACE_READ_NAMED_ATTRS
- | NEW_ACE_READ_ATTRIBUTES
- | NEW_ACE_READ_ACL
- | NEW_ACE_SYNCHRONIZE)
- & ~ access_masks[5])
- return 1;
- access_masks[5] &= ~(NEW_ACE_READ_NAMED_ATTRS
- | NEW_ACE_READ_ATTRIBUTES
- | NEW_ACE_READ_ACL
- | NEW_ACE_SYNCHRONIZE);
-
- /* Check the allowed or denied bits. */
- switch ((access_masks[0] | access_masks[1])
- & ~(NEW_ACE_READ_NAMED_ATTRS
- | NEW_ACE_READ_ATTRIBUTES
- | NEW_ACE_READ_ACL
- | NEW_ACE_SYNCHRONIZE))
- {
- case 0:
- case NEW_ACE_READ_DATA:
- case NEW_ACE_WRITEA_DATA:
- case NEW_ACE_READ_DATA | NEW_ACE_WRITEA_DATA:
- case NEW_ACE_EXECUTE:
- case NEW_ACE_READ_DATA | NEW_ACE_EXECUTE:
- case NEW_ACE_WRITEA_DATA | NEW_ACE_EXECUTE:
- case NEW_ACE_READ_DATA | NEW_ACE_WRITEA_DATA | NEW_ACE_EXECUTE:
- break;
- default:
- return 1;
- }
- switch ((access_masks[2] | access_masks[3])
- & ~(NEW_ACE_READ_NAMED_ATTRS
- | NEW_ACE_READ_ATTRIBUTES
- | NEW_ACE_READ_ACL
- | NEW_ACE_SYNCHRONIZE))
- {
- case 0:
- case NEW_ACE_READ_DATA:
- case NEW_ACE_WRITEA_DATA:
- case NEW_ACE_READ_DATA | NEW_ACE_WRITEA_DATA:
- case NEW_ACE_EXECUTE:
- case NEW_ACE_READ_DATA | NEW_ACE_EXECUTE:
- case NEW_ACE_WRITEA_DATA | NEW_ACE_EXECUTE:
- case NEW_ACE_READ_DATA | NEW_ACE_WRITEA_DATA | NEW_ACE_EXECUTE:
- break;
- default:
- return 1;
- }
- switch ((access_masks[4] | access_masks[5])
- & ~(NEW_ACE_WRITE_NAMED_ATTRS
- | NEW_ACE_WRITE_ATTRIBUTES
- | NEW_ACE_WRITE_ACL
- | NEW_ACE_WRITE_OWNER))
- {
- case 0:
- case NEW_ACE_READ_DATA:
- case NEW_ACE_WRITEA_DATA:
- case NEW_ACE_READ_DATA | NEW_ACE_WRITEA_DATA:
- case NEW_ACE_EXECUTE:
- case NEW_ACE_READ_DATA | NEW_ACE_EXECUTE:
- case NEW_ACE_WRITEA_DATA | NEW_ACE_EXECUTE:
- case NEW_ACE_READ_DATA | NEW_ACE_WRITEA_DATA | NEW_ACE_EXECUTE:
- break;
- default:
- return 1;
- }
-
- /* Check that the NEW_ACE_WRITE_DATA and NEW_ACE_APPEND_DATA bits are
- either both allowed or both denied. */
- if (((access_masks[0] & NEW_ACE_WRITE_DATA) != 0)
- != ((access_masks[0] & NEW_ACE_APPEND_DATA) != 0))
- return 1;
- if (((access_masks[2] & NEW_ACE_WRITE_DATA) != 0)
- != ((access_masks[2] & NEW_ACE_APPEND_DATA) != 0))
- return 1;
- if (((access_masks[4] & NEW_ACE_WRITE_DATA) != 0)
- != ((access_masks[4] & NEW_ACE_APPEND_DATA) != 0))
- return 1;
- }
-
- return 0;
-}
-
-# endif
-
-#elif USE_ACL && HAVE_GETACL /* HP-UX */
-
-/* Return 1 if the given ACL is non-trivial.
- Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
-int
-acl_nontrivial (int count, struct acl_entry *entries)
-{
- int i;
-
- if (count > 3)
- return 1;
-
- for (i = 0; i < count; i++)
- {
- struct acl_entry *ace = &entries[i];
-
- if (ace->uid != ACL_NSUSER && ace->gid != ACL_NSGROUP)
- return 1;
- }
- return 0;
-}
-
-# if HAVE_ACLV_H /* HP-UX >= 11.11 */
-
-/* Return 1 if the given ACL is non-trivial.
- Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
-int
-aclv_nontrivial (int count, struct acl *entries)
-{
- int i;
-
- for (i = 0; i < count; i++)
- {
- struct acl *ace = &entries[i];
-
- /* Note: If ace->a_type = USER_OBJ, ace->a_id is the st_uid from stat().
- If ace->a_type = GROUP_OBJ, ace->a_id is the st_gid from stat().
- We don't need to check ace->a_id in these cases. */
- if (!(ace->a_type == USER_OBJ /* no need to check ace->a_id here */
- || ace->a_type == GROUP_OBJ /* no need to check ace->a_id here */
- || ace->a_type == CLASS_OBJ
- || ace->a_type == OTHER_OBJ))
- return 1;
- }
- return 0;
-}
-
-# endif
-
-#elif USE_ACL && (HAVE_ACLX_GET || HAVE_STATACL) /* AIX */
-
-/* Return 1 if the given ACL is non-trivial.
- Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
-int
-acl_nontrivial (struct acl *a)
-{
- /* The normal way to iterate through an ACL is like this:
- struct acl_entry *ace;
- for (ace = a->acl_ext; ace != acl_last (a); ace = acl_nxt (ace))
- {
- struct ace_id *aei;
- switch (ace->ace_type)
- {
- case ACC_PERMIT:
- case ACC_DENY:
- case ACC_SPECIFY:
- ...;
- }
- for (aei = ace->ace_id; aei != id_last (ace); aei = id_nxt (aei))
- ...
- }
- */
- return (acl_last (a) != a->acl_ext ? 1 : 0);
-}
-
-# if HAVE_ACLX_GET && defined ACL_AIX_WIP /* newer AIX */
-
-/* Return 1 if the given ACL is non-trivial.
- Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
-int
-acl_nfs4_nontrivial (nfs4_acl_int_t *a)
-{
-# if 1 /* let's try this first */
- return (a->aclEntryN > 0 ? 1 : 0);
-# else
- int count = a->aclEntryN;
- int i;
-
- for (i = 0; i < count; i++)
- {
- nfs4_ace_int_t *ace = &a->aclEntry[i];
-
- if (!((ace->flags & ACE4_ID_SPECIAL) != 0
- && (ace->aceWho.special_whoid == ACE4_WHO_OWNER
- || ace->aceWho.special_whoid == ACE4_WHO_GROUP
- || ace->aceWho.special_whoid == ACE4_WHO_EVERYONE)
- && ace->aceType == ACE4_ACCESS_ALLOWED_ACE_TYPE
- && ace->aceFlags == 0
- && (ace->aceMask & ~(ACE4_READ_DATA | ACE4_LIST_DIRECTORY
- | ACE4_WRITE_DATA | ACE4_ADD_FILE
- | ACE4_EXECUTE)) == 0))
- return 1;
- }
- return 0;
-# endif
-}
-
-# endif
-
-#elif USE_ACL && HAVE_ACLSORT /* NonStop Kernel */
-
-/* Test an ACL retrieved with ACL_GET.
- Return 1 if the given ACL, consisting of COUNT entries, is non-trivial.
- Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
-int
-acl_nontrivial (int count, struct acl *entries)
-{
- int i;
-
- for (i = 0; i < count; i++)
- {
- struct acl *ace = &entries[i];
-
- /* Note: If ace->a_type = USER_OBJ, ace->a_id is the st_uid from stat().
- If ace->a_type = GROUP_OBJ, ace->a_id is the st_gid from stat().
- We don't need to check ace->a_id in these cases. */
- if (!(ace->a_type == USER_OBJ /* no need to check ace->a_id here */
- || ace->a_type == GROUP_OBJ /* no need to check ace->a_id here */
- || ace->a_type == CLASS_OBJ
- || ace->a_type == OTHER_OBJ))
- return 1;
- }
- return 0;
-}
-
-#endif
-
-void
-free_permission_context (struct permission_context *ctx)
-{
-#if USE_ACL
-# if HAVE_ACL_GET_FILE /* Linux, FreeBSD, Mac OS X, IRIX, Tru64, Cygwin >= 2.5 */
- if (ctx->acl)
- acl_free (ctx->acl);
-# if !HAVE_ACL_TYPE_EXTENDED
- if (ctx->default_acl)
- acl_free (ctx->default_acl);
-# endif
-
-# elif defined GETACL /* Solaris, Cygwin < 2.5 */
- free (ctx->entries);
-# ifdef ACE_GETACL
- free (ctx->ace_entries);
-# endif
-
-# elif HAVE_GETACL /* HP-UX */
-
-# if HAVE_ACLV_H
-# endif
-
-# elif HAVE_STATACL /* older AIX */
-
-# elif HAVE_ACLSORT /* NonStop Kernel */
-
-# endif
-#endif
-}
diff --git a/cross/lib/acl-internal.h b/cross/lib/acl-internal.h
deleted file mode 100644
index c97e847cdc5..00000000000
--- a/cross/lib/acl-internal.h
+++ /dev/null
@@ -1,301 +0,0 @@
-/* Internal implementation of access control lists. -*- coding: utf-8 -*-
-
- Copyright (C) 2002-2003, 2005-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>.
-
- Written by Paul Eggert, Andreas Grünbacher, and Bruno Haible. */
-
-#include "acl.h"
-
-#include <stdlib.h>
-
-/* All systems define the ACL related API in <sys/acl.h>. */
-#if HAVE_SYS_ACL_H
-# include <sys/acl.h>
-#endif
-#if defined HAVE_FACL && ! defined GETACLCNT && defined ACL_CNT
-# define GETACLCNT ACL_CNT
-#endif
-
-/* On Linux and Cygwin >= 2.5, additional ACL related API is available in
- <acl/libacl.h>. */
-#ifdef HAVE_ACL_LIBACL_H
-# include <acl/libacl.h>
-#endif
-
-/* On HP-UX >= 11.11, additional ACL API is available in <aclv.h>. */
-#if HAVE_ACLV_H
-# include <sys/types.h>
-# include <aclv.h>
-/* HP-UX 11.11 lacks these declarations. */
-extern int acl (char *, int, int, struct acl *);
-extern int aclsort (int, int, struct acl *);
-#endif
-
-#include <errno.h>
-
-#include <limits.h>
-#ifndef MIN
-# define MIN(a,b) ((a) < (b) ? (a) : (b))
-#endif
-
-#ifndef SIZE_MAX
-# define SIZE_MAX ((size_t) -1)
-#endif
-
-#ifndef HAVE_FCHMOD
-# define HAVE_FCHMOD false
-# define fchmod(fd, mode) (-1)
-#endif
-
-#ifndef _GL_INLINE_HEADER_BEGIN
- #error "Please include config.h first."
-#endif
-_GL_INLINE_HEADER_BEGIN
-#ifndef ACL_INTERNAL_INLINE
-# define ACL_INTERNAL_INLINE _GL_INLINE
-#endif
-
-#if USE_ACL
-
-# if HAVE_ACL_GET_FILE
-/* POSIX 1003.1e (draft 17 -- abandoned) specific version. */
-/* Linux, FreeBSD, Mac OS X, IRIX, Tru64, Cygwin >= 2.5 */
-
-# ifndef MIN_ACL_ENTRIES
-# define MIN_ACL_ENTRIES 4
-# endif
-
-/* POSIX 1003.1e (draft 17) */
-# ifdef HAVE_ACL_GET_FD
-/* Most platforms have a 1-argument acl_get_fd, only OSF/1 has a 2-argument
- macro(!). */
-# if HAVE_ACL_FREE_TEXT /* OSF/1 */
-ACL_INTERNAL_INLINE acl_t
-rpl_acl_get_fd (int fd)
-{
- return acl_get_fd (fd, ACL_TYPE_ACCESS);
-}
-# undef acl_get_fd
-# define acl_get_fd rpl_acl_get_fd
-# endif
-# else
-# define HAVE_ACL_GET_FD false
-# undef acl_get_fd
-# define acl_get_fd(fd) (NULL)
-# endif
-
-/* POSIX 1003.1e (draft 17) */
-# ifdef HAVE_ACL_SET_FD
-/* Most platforms have a 2-argument acl_set_fd, only OSF/1 has a 3-argument
- macro(!). */
-# if HAVE_ACL_FREE_TEXT /* OSF/1 */
-ACL_INTERNAL_INLINE int
-rpl_acl_set_fd (int fd, acl_t acl)
-{
- return acl_set_fd (fd, ACL_TYPE_ACCESS, acl);
-}
-# undef acl_set_fd
-# define acl_set_fd rpl_acl_set_fd
-# endif
-# else
-# define HAVE_ACL_SET_FD false
-# undef acl_set_fd
-# define acl_set_fd(fd, acl) (-1)
-# endif
-
-/* POSIX 1003.1e (draft 13) */
-# if ! HAVE_ACL_FREE_TEXT
-# define acl_free_text(buf) acl_free (buf)
-# endif
-
-/* Linux-specific */
-/* Cygwin >= 2.5 implements this function, but it returns 1 for all
- directories, thus is unusable. */
-# if !defined HAVE_ACL_EXTENDED_FILE || defined __CYGWIN__
-# undef HAVE_ACL_EXTENDED_FILE
-# define HAVE_ACL_EXTENDED_FILE false
-# define acl_extended_file(name) (-1)
-# endif
-
-# if ! defined HAVE_ACL_FROM_MODE && ! defined HAVE_ACL_FROM_TEXT
-# define acl_from_mode (NULL)
-# endif
-
-/* Set to 0 if a file's mode is stored independently from the ACL. */
-# if (HAVE_ACL_COPY_EXT_NATIVE && HAVE_ACL_CREATE_ENTRY_NP) || defined __sgi /* Mac OS X, IRIX */
-# define MODE_INSIDE_ACL 0
-# endif
-
-/* Return the number of entries in ACL.
- Return -1 and set errno upon failure to determine it. */
-/* Define a replacement for acl_entries if needed. (Only Linux has it.) */
-# if !HAVE_ACL_ENTRIES
-# define acl_entries rpl_acl_entries
-extern int acl_entries (acl_t);
-# endif
-
-# if HAVE_ACL_TYPE_EXTENDED /* Mac OS X */
-/* ACL is an ACL, from a file, stored as type ACL_TYPE_EXTENDED.
- Return 1 if the given ACL is non-trivial.
- Return 0 if it is trivial. */
-extern int acl_extended_nontrivial (acl_t);
-# else
-/* ACL is an ACL, from a file, stored as type ACL_TYPE_ACCESS.
- Return 1 if the given ACL is non-trivial.
- Return 0 if it is trivial, i.e. equivalent to a simple stat() mode.
- Return -1 and set errno upon failure to determine it. */
-extern int acl_access_nontrivial (acl_t);
-
-/* ACL is an ACL, from a file, stored as type ACL_TYPE_DEFAULT.
- Return 1 if the given ACL is non-trivial.
- Return 0 if it is trivial, i.e. equivalent to a simple stat() mode.
- Return -1 and set errno upon failure to determine it. */
-extern int acl_default_nontrivial (acl_t);
-# endif
-
-# elif HAVE_FACL && defined GETACL /* Solaris, Cygwin < 2.5, not HP-UX */
-
-/* Set to 0 if a file's mode is stored independently from the ACL. */
-# if defined __CYGWIN__ /* Cygwin */
-# define MODE_INSIDE_ACL 0
-# endif
-
-/* Return 1 if the given ACL is non-trivial.
- Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
-extern int acl_nontrivial (int count, aclent_t *entries) _GL_ATTRIBUTE_PURE;
-
-# ifdef ACE_GETACL /* Solaris 10 */
-
-/* Test an ACL retrieved with ACE_GETACL.
- Return 1 if the given ACL, consisting of COUNT entries, is non-trivial.
- Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
-extern int acl_ace_nontrivial (int count, ace_t *entries) _GL_ATTRIBUTE_PURE;
-
-/* Definitions for when the built executable is executed on Solaris 10
- (newer version) or Solaris 11. */
-/* For a_type. */
-# define OLD_ALLOW 0
-# define OLD_DENY 1
-# define NEW_ACE_ACCESS_ALLOWED_ACE_TYPE 0 /* replaces ALLOW */
-# define NEW_ACE_ACCESS_DENIED_ACE_TYPE 1 /* replaces DENY */
-/* For a_flags. */
-# define OLD_ACE_OWNER 0x0100
-# define OLD_ACE_GROUP 0x0200
-# define OLD_ACE_OTHER 0x0400
-# define NEW_ACE_OWNER 0x1000
-# define NEW_ACE_GROUP 0x2000
-# define NEW_ACE_IDENTIFIER_GROUP 0x0040
-# define NEW_ACE_EVERYONE 0x4000
-/* For a_access_mask. */
-# define NEW_ACE_READ_DATA 0x001 /* corresponds to 'r' */
-# define NEW_ACE_WRITE_DATA 0x002 /* corresponds to 'w' */
-# define NEW_ACE_APPEND_DATA 0x004
-# define NEW_ACE_READ_NAMED_ATTRS 0x008
-# define NEW_ACE_WRITE_NAMED_ATTRS 0x010
-# define NEW_ACE_EXECUTE 0x020
-# define NEW_ACE_DELETE_CHILD 0x040
-# define NEW_ACE_READ_ATTRIBUTES 0x080
-# define NEW_ACE_WRITE_ATTRIBUTES 0x100
-# define NEW_ACE_DELETE 0x10000
-# define NEW_ACE_READ_ACL 0x20000
-# define NEW_ACE_WRITE_ACL 0x40000
-# define NEW_ACE_WRITE_OWNER 0x80000
-# define NEW_ACE_SYNCHRONIZE 0x100000
-
-# endif
-
-# elif HAVE_GETACL /* HP-UX */
-
-/* Return 1 if the given ACL is non-trivial.
- Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
-extern int acl_nontrivial (int count, struct acl_entry *entries);
-
-# if HAVE_ACLV_H /* HP-UX >= 11.11 */
-
-/* Return 1 if the given ACL is non-trivial.
- Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
-extern int aclv_nontrivial (int count, struct acl *entries);
-
-# endif
-
-# elif HAVE_ACLX_GET && 0 /* AIX */
-
-/* TODO */
-
-# elif HAVE_STATACL /* older AIX */
-
-/* Return 1 if the given ACL is non-trivial.
- Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
-extern int acl_nontrivial (struct acl *a);
-
-# elif HAVE_ACLSORT /* NonStop Kernel */
-
-/* Return 1 if the given ACL is non-trivial.
- Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */
-extern int acl_nontrivial (int count, struct acl *entries);
-
-# endif
-
-/* Set to 1 if a file's mode is implicit by the ACL. */
-# ifndef MODE_INSIDE_ACL
-# define MODE_INSIDE_ACL 1
-# endif
-
-#endif
-
-struct permission_context {
- mode_t mode;
-#if USE_ACL
-# if HAVE_ACL_GET_FILE /* Linux, FreeBSD, Mac OS X, IRIX, Tru64, Cygwin >= 2.5 */
- acl_t acl;
-# if !HAVE_ACL_TYPE_EXTENDED
- acl_t default_acl;
-# endif
- bool acls_not_supported;
-
-# elif defined GETACL /* Solaris, Cygwin < 2.5 */
- int count;
- aclent_t *entries;
-# ifdef ACE_GETACL
- int ace_count;
- ace_t *ace_entries;
-# endif
-
-# elif HAVE_GETACL /* HP-UX */
- struct acl_entry entries[NACLENTRIES];
- int count;
-# if HAVE_ACLV_H
- struct acl aclv_entries[NACLVENTRIES];
- int aclv_count;
-# endif
-
-# elif HAVE_STATACL /* older AIX */
- union { struct acl a; char room[4096]; } u;
- bool have_u;
-
-# elif HAVE_ACLSORT /* NonStop Kernel */
- struct acl entries[NACLENTRIES];
- int count;
-
-# endif
-#endif
-};
-
-int get_permissions (const char *, int, mode_t, struct permission_context *);
-int set_permissions (struct permission_context *, const char *, int);
-void free_permission_context (struct permission_context *);
-
-_GL_INLINE_HEADER_END
diff --git a/cross/lib/acl.h b/cross/lib/acl.h
deleted file mode 100644
index 58e5797179e..00000000000
--- a/cross/lib/acl.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* acl.c - access control lists
-
- Copyright (C) 2002, 2008-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>.
-
- Written by Paul Eggert. */
-
-#ifndef _GL_ACL_H
-#define _GL_ACL_H 1
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-bool acl_errno_valid (int) _GL_ATTRIBUTE_CONST;
-int file_has_acl (char const *, struct stat const *);
-int qset_acl (char const *, int, mode_t);
-int set_acl (char const *, int, mode_t);
-int qcopy_acl (char const *, int, char const *, int, mode_t);
-int copy_acl (char const *, int, char const *, int, mode_t);
-int chmod_or_fchmod (char const *, int, mode_t);
-
-#endif
diff --git a/cross/lib/acl_entries.c b/cross/lib/acl_entries.c
deleted file mode 100644
index a59ace3f404..00000000000
--- a/cross/lib/acl_entries.c
+++ /dev/null
@@ -1,75 +0,0 @@
-/* Return the number of entries in an ACL.
-
- Copyright (C) 2002-2003, 2005-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>.
-
- Written by Paul Eggert and Andreas Gruenbacher. */
-
-#include <config.h>
-
-#include "acl-internal.h"
-
-/* This file assumes POSIX-draft like ACLs
- (Linux, FreeBSD, Mac OS X, IRIX, Tru64, Cygwin >= 2.5). */
-
-/* Return the number of entries in ACL.
- Return -1 and set errno upon failure to determine it. */
-
-int
-acl_entries (acl_t acl)
-{
- int count = 0;
-
- if (acl != NULL)
- {
-#if HAVE_ACL_FIRST_ENTRY /* Linux, FreeBSD, Mac OS X, Cygwin >= 2.5 */
-# if HAVE_ACL_TYPE_EXTENDED /* Mac OS X */
- /* acl_get_entry returns 0 when it successfully fetches an entry,
- and -1/EINVAL at the end. */
- acl_entry_t ace;
- int got_one;
-
- for (got_one = acl_get_entry (acl, ACL_FIRST_ENTRY, &ace);
- got_one >= 0;
- got_one = acl_get_entry (acl, ACL_NEXT_ENTRY, &ace))
- count++;
-# else /* Linux, FreeBSD, Cygwin >= 2.5 */
- /* acl_get_entry returns 1 when it successfully fetches an entry,
- and 0 at the end. */
- acl_entry_t ace;
- int got_one;
-
- for (got_one = acl_get_entry (acl, ACL_FIRST_ENTRY, &ace);
- got_one > 0;
- got_one = acl_get_entry (acl, ACL_NEXT_ENTRY, &ace))
- count++;
- if (got_one < 0)
- return -1;
-# endif
-#else /* IRIX, Tru64 */
-# if HAVE_ACL_TO_SHORT_TEXT /* IRIX */
- /* Don't use acl_get_entry: it is undocumented. */
- count = acl->acl_cnt;
-# endif
-# if HAVE_ACL_FREE_TEXT /* Tru64 */
- /* Don't use acl_get_entry: it takes only one argument and does not
- work. */
- count = acl->acl_num;
-# endif
-#endif
- }
-
- return count;
-}
diff --git a/cross/lib/af_alg.h b/cross/lib/af_alg.h
deleted file mode 100644
index e8ffb3f7a09..00000000000
--- a/cross/lib/af_alg.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/* af_alg.h - Compute message digests from file streams and buffers.
- Copyright (C) 2018-2023 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@redhat.com>, 2018.
- Documentation by Bruno Haible <bruno@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/cross/lib/alloca.in.h b/cross/lib/alloca.in.h
deleted file mode 100644
index a1bb3d758dc..00000000000
--- a/cross/lib/alloca.in.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* Memory allocation on the stack.
-
- Copyright (C) 1995, 1999, 2001-2004, 2006-2023 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/>. */
-
-/* Avoid using the symbol _ALLOCA_H here, as Bison assumes _ALLOCA_H
- means there is a real alloca function. */
-#ifndef _GL_ALLOCA_H
-#define _GL_ALLOCA_H
-
-/* alloca (N) returns a pointer to N bytes of memory
- allocated on the stack, which will last until the function returns.
- Use of alloca should be avoided:
- - inside arguments of function calls - undefined behaviour,
- - in inline functions - the allocation may actually last until the
- calling function returns,
- - for huge N (say, N >= 65536) - you never know how large (or small)
- the stack is, and when the stack cannot fulfill the memory allocation
- request, the program just crashes.
- */
-
-#ifndef alloca
- /* Some version of mingw have an <alloca.h> that causes trouble when
- included after 'alloca' gets defined as a macro. As a workaround,
- include this <alloca.h> first and define 'alloca' as a macro afterwards
- if needed. */
-# if defined __GNUC__ && (defined _WIN32 && ! defined __CYGWIN__) && @HAVE_ALLOCA_H@
-# include_next <alloca.h>
-# endif
-#endif
-#ifndef alloca
-# if defined __GNUC__ || (__clang_major__ >= 4)
-# define alloca __builtin_alloca
-# elif defined _AIX
-# define alloca __alloca
-# elif defined _MSC_VER
-# include <malloc.h>
-# define alloca _alloca
-# elif defined __DECC && defined __VMS
-# define alloca __ALLOCA
-# elif defined __TANDEM && defined _TNS_E_TARGET
-# ifdef __cplusplus
-extern "C"
-# endif
-void *_alloca (unsigned short);
-# pragma intrinsic (_alloca)
-# define alloca _alloca
-# elif defined __MVS__
-# include <stdlib.h>
-# else
-# include <stddef.h>
-# ifdef __cplusplus
-extern "C"
-# endif
-void *alloca (size_t);
-# endif
-#endif
-
-#endif /* _GL_ALLOCA_H */
diff --git a/cross/lib/allocator.c b/cross/lib/allocator.c
deleted file mode 100644
index 922be1fce8d..00000000000
--- a/cross/lib/allocator.c
+++ /dev/null
@@ -1,22 +0,0 @@
-/* Memory allocators such as malloc+free.
-
- Copyright (C) 2011-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#define _GL_USE_STDLIB_ALLOC 1
-#include <config.h>
-#include "allocator.h"
-#include <stdlib.h>
-struct allocator const stdlib_allocator = { malloc, realloc, free, NULL };
diff --git a/cross/lib/allocator.h b/cross/lib/allocator.h
deleted file mode 100644
index 0c830d01cda..00000000000
--- a/cross/lib/allocator.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Memory allocators such as malloc+free.
-
- Copyright (C) 2011-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert. */
-
-#ifndef _GL_ALLOCATOR_H
-#define _GL_ALLOCATOR_H
-
-#include <stddef.h>
-
-/* An object describing a memory allocator family. */
-
-struct allocator
-{
- /* Do not use GCC attributes such as __attribute__ ((malloc)) with
- the function types pointed at by these members, because these
- attributes do not work with pointers to functions. See
- <https://lists.gnu.org/r/bug-gnulib/2011-04/msg00007.html>. */
-
- /* Call ALLOCATE to allocate memory, like 'malloc'. On failure ALLOCATE
- should return NULL, though not necessarily set errno. When given
- a zero size it may return NULL even if successful. */
- void *(*allocate) (size_t);
-
- /* If nonnull, call REALLOCATE to reallocate memory, like 'realloc'.
- On failure REALLOCATE should return NULL, though not necessarily set
- errno. When given a zero size it may return NULL even if
- successful. */
- void *(*reallocate) (void *, size_t);
-
- /* Call FREE to free memory, like 'free'. */
- void (*free) (void *);
-
- /* If nonnull, call DIE (SIZE) if MALLOC (SIZE) or REALLOC (...,
- SIZE) fails. DIE should not return. SIZE should equal SIZE_MAX
- if size_t overflow was detected while calculating sizes to be
- passed to MALLOC or REALLOC. */
- void (*die) (size_t);
-};
-
-/* An allocator using the stdlib functions and a null DIE function. */
-extern struct allocator const stdlib_allocator;
-
-#endif /* _GL_ALLOCATOR_H */
diff --git a/cross/lib/arg-nonnull.h b/cross/lib/arg-nonnull.h
deleted file mode 100644
index 9498ae1f7da..00000000000
--- a/cross/lib/arg-nonnull.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* A C macro for declaring that specific arguments must not be NULL.
- Copyright (C) 2009-2023 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
diff --git a/cross/lib/asnprintf.c b/cross/lib/asnprintf.c
deleted file mode 100644
index f4861bf8457..00000000000
--- a/cross/lib/asnprintf.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Formatted output to strings.
- Copyright (C) 1999, 2002, 2006, 2009-2023 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 "vasnprintf.h"
-
-#include <stdarg.h>
-
-char *
-asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
-{
- va_list args;
- char *result;
-
- va_start (args, format);
- result = vasnprintf (resultbuf, lengthp, format, args);
- va_end (args);
- return result;
-}
diff --git a/cross/lib/asprintf.c b/cross/lib/asprintf.c
deleted file mode 100644
index ba58e06481f..00000000000
--- a/cross/lib/asprintf.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Formatted output to strings.
- Copyright (C) 1999, 2002, 2006-2007, 2009-2023 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. */
-#ifdef IN_LIBASPRINTF
-# include "vasprintf.h"
-#else
-# include <stdio.h>
-#endif
-
-#include <stdarg.h>
-
-int
-asprintf (char **resultp, const char *format, ...)
-{
- va_list args;
- int result;
-
- va_start (args, format);
- result = vasprintf (resultp, format, args);
- va_end (args);
- return result;
-}
diff --git a/cross/lib/assert.in.h b/cross/lib/assert.in.h
deleted file mode 100644
index b0ab99c776e..00000000000
--- a/cross/lib/assert.in.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Substitute for and wrapper around <assert.h>
- Copyright (C) 2011-2023 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/>. */
-
-/* Do not guard the include, since <assert.h> is supposed to define
- the assert macro each time it is included. */
-
-#if __GNUC__ >= 3
-@PRAGMA_SYSTEM_HEADER@
-#endif
-@PRAGMA_COLUMNS@
-
-#@INCLUDE_NEXT@ @NEXT_ASSERT_H@
-
-/* The definition of static_assert is copied here. */
diff --git a/cross/lib/at-func.c b/cross/lib/at-func.c
deleted file mode 100644
index 13e3fb32056..00000000000
--- a/cross/lib/at-func.c
+++ /dev/null
@@ -1,146 +0,0 @@
-/* Define at-style functions like fstatat, unlinkat, fchownat, etc.
- Copyright (C) 2006, 2009-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* written by Jim Meyering */
-
-#include "filename.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */
-
-#ifdef GNULIB_SUPPORT_ONLY_AT_FDCWD
-# include <errno.h>
-# ifndef ENOTSUP
-# define ENOTSUP EINVAL
-# endif
-#else
-# include "openat.h"
-# include "openat-priv.h"
-# include "save-cwd.h"
-#endif
-
-#ifdef AT_FUNC_USE_F1_COND
-# define CALL_FUNC(F) \
- (flag == AT_FUNC_USE_F1_COND \
- ? AT_FUNC_F1 (F AT_FUNC_POST_FILE_ARGS) \
- : AT_FUNC_F2 (F AT_FUNC_POST_FILE_ARGS))
-# define VALIDATE_FLAG(F) \
- if (flag & ~AT_FUNC_USE_F1_COND) \
- { \
- errno = EINVAL; \
- return FUNC_FAIL; \
- }
-#else
-# define CALL_FUNC(F) (AT_FUNC_F1 (F AT_FUNC_POST_FILE_ARGS))
-# define VALIDATE_FLAG(F) /* empty */
-#endif
-
-#ifdef AT_FUNC_RESULT
-# define FUNC_RESULT AT_FUNC_RESULT
-#else
-# define FUNC_RESULT int
-#endif
-
-#ifdef AT_FUNC_FAIL
-# define FUNC_FAIL AT_FUNC_FAIL
-#else
-# define FUNC_FAIL -1
-#endif
-
-/* Call AT_FUNC_F1 to operate on FILE, which is in the directory
- open on descriptor FD. If AT_FUNC_USE_F1_COND is defined to a value,
- AT_FUNC_POST_FILE_PARAM_DECLS must include a parameter named flag;
- call AT_FUNC_F2 if FLAG is 0 or fail if FLAG contains more bits than
- AT_FUNC_USE_F1_COND. Return int and fail with -1 unless AT_FUNC_RESULT
- or AT_FUNC_FAIL are defined. If possible, do it without changing the
- working directory. Otherwise, resort to using save_cwd/fchdir,
- then AT_FUNC_F?/restore_cwd. If either the save_cwd or the restore_cwd
- fails, then give a diagnostic and exit nonzero. */
-FUNC_RESULT
-AT_FUNC_NAME (int fd, char const *file AT_FUNC_POST_FILE_PARAM_DECLS)
-{
- VALIDATE_FLAG (flag);
-
- if (fd == AT_FDCWD || IS_ABSOLUTE_FILE_NAME (file))
- return CALL_FUNC (file);
-
-#ifdef GNULIB_SUPPORT_ONLY_AT_FDCWD
- errno = ENOTSUP;
- return FUNC_FAIL;
-#else
- {
- /* Be careful to choose names unlikely to conflict with
- AT_FUNC_POST_FILE_PARAM_DECLS. */
- struct saved_cwd saved_cwd;
- int saved_errno;
- FUNC_RESULT err;
-
- {
- char proc_buf[OPENAT_BUFFER_SIZE];
- char *proc_file = openat_proc_name (proc_buf, fd, file);
- if (proc_file)
- {
- FUNC_RESULT proc_result = CALL_FUNC (proc_file);
- int proc_errno = errno;
- if (proc_file != proc_buf)
- free (proc_file);
- /* If the syscall succeeds, or if it fails with an unexpected
- errno value, then return right away. Otherwise, fall through
- and resort to using save_cwd/restore_cwd. */
- if (FUNC_FAIL != proc_result)
- return proc_result;
- if (! EXPECTED_ERRNO (proc_errno))
- {
- errno = proc_errno;
- return proc_result;
- }
- }
- }
-
- if (save_cwd (&saved_cwd) != 0)
- openat_save_fail (errno);
- if (0 <= fd && fd == saved_cwd.desc)
- {
- /* If saving the working directory collides with the user's
- requested fd, then the user's fd must have been closed to
- begin with. */
- free_cwd (&saved_cwd);
- errno = EBADF;
- return FUNC_FAIL;
- }
-
- if (fchdir (fd) != 0)
- {
- saved_errno = errno;
- free_cwd (&saved_cwd);
- errno = saved_errno;
- return FUNC_FAIL;
- }
-
- err = CALL_FUNC (file);
- saved_errno = (err == FUNC_FAIL ? errno : 0);
-
- if (restore_cwd (&saved_cwd) != 0)
- openat_restore_fail (errno);
-
- free_cwd (&saved_cwd);
-
- if (saved_errno)
- errno = saved_errno;
- return err;
- }
-#endif
-}
-#undef CALL_FUNC
-#undef FUNC_RESULT
-#undef FUNC_FAIL
diff --git a/cross/lib/attribute.h b/cross/lib/attribute.h
deleted file mode 100644
index 130644d8798..00000000000
--- a/cross/lib/attribute.h
+++ /dev/null
@@ -1,226 +0,0 @@
-/* ATTRIBUTE_* macros for using attributes in GCC and similar compilers
-
- Copyright 2020-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert. */
-
-/* Provide public ATTRIBUTE_* names for the private _GL_ATTRIBUTE_*
- macros used within Gnulib. */
-
-/* These attributes can be placed in two ways:
- - At the start of a declaration (i.e. even before storage-class
- specifiers!); then they apply to all entities that are declared
- by the declaration.
- - Immediately after the name of an entity being declared by the
- declaration; then they apply to that entity only. */
-
-#ifndef _GL_ATTRIBUTE_H
-#define _GL_ATTRIBUTE_H
-
-
-/* This file defines two types of attributes:
- * C23 standard attributes. These have macro names that do not begin with
- 'ATTRIBUTE_'.
- * Selected GCC attributes; see:
- https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html
- https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html
- https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html
- These names begin with 'ATTRIBUTE_' to avoid name clashes. */
-
-
-/* =============== Attributes for specific kinds of functions =============== */
-
-/* Attributes for functions that should not be used. */
-
-/* Warn if the entity is used. */
-/* Applies to:
- - function, variable,
- - struct, union, struct/union member,
- - enumeration, enumeration item,
- - typedef,
- in C++ also: namespace, class, template specialization. */
-#define DEPRECATED _GL_ATTRIBUTE_DEPRECATED
-
-/* If a function call is not optimized way, warn with MSG. */
-/* Applies to: functions. */
-#define ATTRIBUTE_WARNING(msg) _GL_ATTRIBUTE_WARNING (msg)
-
-/* If a function call is not optimized way, report an error with MSG. */
-/* Applies to: functions. */
-#define ATTRIBUTE_ERROR(msg) _GL_ATTRIBUTE_ERROR (msg)
-
-
-/* Attributes for memory-allocating functions. */
-
-/* The function returns a pointer to freshly allocated memory. */
-/* Applies to: functions. */
-#define ATTRIBUTE_MALLOC _GL_ATTRIBUTE_MALLOC
-
-/* ATTRIBUTE_ALLOC_SIZE ((N)) - The Nth argument of the function
- is the size of the returned memory block.
- ATTRIBUTE_ALLOC_SIZE ((M, N)) - Multiply the Mth and Nth arguments
- to determine the size of the returned memory block. */
-/* Applies to: function, pointer to function, function types. */
-#define ATTRIBUTE_ALLOC_SIZE(args) _GL_ATTRIBUTE_ALLOC_SIZE (args)
-
-/* ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
- that can be freed by passing them as the Ith argument to the
- function F.
- ATTRIBUTE_DEALLOC_FREE declares that the function returns pointers that
- can be freed via 'free'; it can be used only after declaring 'free'. */
-/* Applies to: functions. Cannot be used on inline functions. */
-#define ATTRIBUTE_DEALLOC(f, i) _GL_ATTRIBUTE_DEALLOC(f, i)
-#define ATTRIBUTE_DEALLOC_FREE _GL_ATTRIBUTE_DEALLOC_FREE
-
-/* Attributes for variadic functions. */
-
-/* The variadic function expects a trailing NULL argument.
- ATTRIBUTE_SENTINEL () - The last argument is NULL (requires C99).
- ATTRIBUTE_SENTINEL ((N)) - The (N+1)st argument from the end is NULL. */
-/* Applies to: functions. */
-#define ATTRIBUTE_SENTINEL(pos) _GL_ATTRIBUTE_SENTINEL (pos)
-
-
-/* ================== Attributes for compiler diagnostics ================== */
-
-/* Attributes that help the compiler diagnose programmer mistakes.
- Some of them may also help for some compiler optimizations. */
-
-/* ATTRIBUTE_FORMAT ((ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK)) -
- The STRING-INDEXth function argument is a format string of style
- ARCHETYPE, which is one of:
- printf, gnu_printf
- scanf, gnu_scanf,
- strftime, gnu_strftime,
- strfmon,
- or the same thing prefixed and suffixed with '__'.
- If FIRST-TO-CHECK is not 0, arguments starting at FIRST-TO_CHECK
- are suitable for the format string. */
-/* Applies to: functions. */
-#define ATTRIBUTE_FORMAT(spec) _GL_ATTRIBUTE_FORMAT (spec)
-
-/* ATTRIBUTE_NONNULL ((N1, N2,...)) - Arguments N1, N2,... must not be NULL.
- ATTRIBUTE_NONNULL () - All pointer arguments must not be null. */
-/* Applies to: functions. */
-#define ATTRIBUTE_NONNULL(args) _GL_ATTRIBUTE_NONNULL (args)
-
-/* The function's return value is a non-NULL pointer. */
-/* Applies to: functions. */
-#define ATTRIBUTE_RETURNS_NONNULL _GL_ATTRIBUTE_RETURNS_NONNULL
-
-/* Warn if the caller does not use the return value,
- unless the caller uses something like ignore_value. */
-/* Applies to: function, enumeration, class. */
-#define NODISCARD _GL_ATTRIBUTE_NODISCARD
-
-
-/* Attributes that disable false alarms when the compiler diagnoses
- programmer "mistakes". */
-
-/* Do not warn if the entity is not used. */
-/* Applies to:
- - function, variable,
- - struct, union, struct/union member,
- - enumeration, enumeration item,
- - typedef,
- in C++ also: class. */
-#define MAYBE_UNUSED _GL_ATTRIBUTE_MAYBE_UNUSED
-
-/* The contents of a character array is not meant to be NUL-terminated. */
-/* Applies to: struct/union members and variables that are arrays of element
- type '[[un]signed] char'. */
-#define ATTRIBUTE_NONSTRING _GL_ATTRIBUTE_NONSTRING
-
-/* Do not warn if control flow falls through to the immediately
- following 'case' or 'default' label. */
-/* Applies to: Empty statement (;), inside a 'switch' statement. */
-#define FALLTHROUGH _GL_ATTRIBUTE_FALLTHROUGH
-
-
-/* ================== Attributes for debugging information ================== */
-
-/* Attributes regarding debugging information emitted by the compiler. */
-
-/* Omit the function from stack traces when debugging. */
-/* Applies to: function. */
-#define ATTRIBUTE_ARTIFICIAL _GL_ATTRIBUTE_ARTIFICIAL
-
-/* Make the entity visible to debuggers etc., even with '-fwhole-program'. */
-/* Applies to: functions, variables. */
-#define ATTRIBUTE_EXTERNALLY_VISIBLE _GL_ATTRIBUTE_EXTERNALLY_VISIBLE
-
-
-/* ========== Attributes that mainly direct compiler optimizations ========== */
-
-/* The function does not throw exceptions. */
-/* Applies to: functions. */
-#define ATTRIBUTE_NOTHROW _GL_ATTRIBUTE_NOTHROW
-
-/* Do not inline the function. */
-/* Applies to: functions. */
-#define ATTRIBUTE_NOINLINE _GL_ATTRIBUTE_NOINLINE
-
-/* Always inline the function, and report an error if the compiler
- cannot inline. */
-/* Applies to: function. */
-#define ATTRIBUTE_ALWAYS_INLINE _GL_ATTRIBUTE_ALWAYS_INLINE
-
-/* It is OK for a compiler to omit duplicate calls with the same arguments.
- This attribute is safe for a function that neither depends on
- nor affects observable state, and always returns exactly once -
- e.g., does not loop forever, and does not call longjmp.
- (This attribute is stricter than ATTRIBUTE_PURE.) */
-/* Applies to: functions. */
-#define ATTRIBUTE_CONST _GL_ATTRIBUTE_CONST
-
-/* It is OK for a compiler to omit duplicate calls with the same
- arguments if observable state is not changed between calls.
- This attribute is safe for a function that does not affect
- observable state, and always returns exactly once.
- (This attribute is looser than ATTRIBUTE_CONST.) */
-/* Applies to: functions. */
-#define ATTRIBUTE_PURE _GL_ATTRIBUTE_PURE
-
-/* The function is rarely executed. */
-/* Applies to: functions. */
-#define ATTRIBUTE_COLD _GL_ATTRIBUTE_COLD
-
-/* If called from some other compilation unit, the function executes
- code from that unit only by return or by exception handling,
- letting the compiler optimize that unit more aggressively. */
-/* Applies to: functions. */
-#define ATTRIBUTE_LEAF _GL_ATTRIBUTE_LEAF
-
-/* For struct members: The member has the smallest possible alignment.
- For struct, union, class: All members have the smallest possible alignment,
- minimizing the memory required. */
-/* Applies to: struct members, struct, union,
- in C++ also: class. */
-#define ATTRIBUTE_PACKED _GL_ATTRIBUTE_PACKED
-
-
-/* ================ Attributes that make invalid code valid ================ */
-
-/* Attributes that prevent fatal compiler optimizations for code that is not
- fully ISO C compliant. */
-
-/* Pointers to the type may point to the same storage as pointers to
- other types, thus disabling strict aliasing optimization. */
-/* Applies to: types. */
-#define ATTRIBUTE_MAY_ALIAS _GL_ATTRIBUTE_MAY_ALIAS
-
-
-#endif /* _GL_ATTRIBUTE_H */
diff --git a/cross/lib/binary-io.c b/cross/lib/binary-io.c
deleted file mode 100644
index 28a9e6ed69c..00000000000
--- a/cross/lib/binary-io.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Binary mode I/O.
- Copyright 2017-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-#define BINARY_IO_INLINE _GL_EXTERN_INLINE
-#include "binary-io.h"
-
-#if defined __DJGPP__ || defined __EMX__
-# include <unistd.h>
-
-int
-set_binary_mode (int fd, int mode)
-{
- if (isatty (fd))
- /* If FD refers to a console (not a pipe, not a regular file),
- O_TEXT is the only reasonable mode, both on input and on output.
- Silently ignore the request. If we were to return -1 here,
- all programs that use xset_binary_mode would fail when run
- with console input or console output. */
- return O_TEXT;
- else
- return __gl_setmode (fd, mode);
-}
-
-#endif
diff --git a/cross/lib/binary-io.h b/cross/lib/binary-io.h
deleted file mode 100644
index 6f4db253354..00000000000
--- a/cross/lib/binary-io.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/* Binary mode I/O.
- Copyright (C) 2001, 2003, 2005, 2008-2023 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 _BINARY_H
-#define _BINARY_H
-
-/* For systems that distinguish between text and binary I/O.
- O_BINARY is guaranteed by the gnulib <fcntl.h>. */
-#include <fcntl.h>
-
-/* The MSVC7 <stdio.h> doesn't like to be included after '#define fileno ...',
- so we include it here first. */
-#include <stdio.h>
-
-#ifndef _GL_INLINE_HEADER_BEGIN
- #error "Please include config.h first."
-#endif
-_GL_INLINE_HEADER_BEGIN
-#ifndef BINARY_IO_INLINE
-# define BINARY_IO_INLINE _GL_INLINE
-#endif
-
-#if O_BINARY
-# if defined __EMX__ || defined __DJGPP__ || defined __CYGWIN__
-# include <io.h> /* declares setmode() */
-# define __gl_setmode setmode
-# else
-# define __gl_setmode _setmode
-# undef fileno
-# define fileno _fileno
-# endif
-#else
- /* On reasonable systems, binary I/O is the only choice. */
- /* Use a function rather than a macro, to avoid gcc warnings
- "warning: statement with no effect". */
-BINARY_IO_INLINE int
-__gl_setmode (_GL_UNUSED int fd, _GL_UNUSED int mode)
-{
- return O_BINARY;
-}
-#endif
-
-/* Set FD's mode to MODE, which should be either O_TEXT or O_BINARY.
- Return the old mode if successful, -1 (setting errno) on failure.
- Ordinarily this function would be called 'setmode', since that is
- its old name on MS-Windows, but it is called 'set_binary_mode' here
- to avoid colliding with a BSD function of another name. */
-
-#if defined __DJGPP__ || defined __EMX__
-extern int set_binary_mode (int fd, int mode);
-#else
-BINARY_IO_INLINE int
-set_binary_mode (int fd, int mode)
-{
- return __gl_setmode (fd, mode);
-}
-#endif
-
-/* This macro is obsolescent. */
-#define SET_BINARY(fd) ((void) set_binary_mode (fd, O_BINARY))
-
-_GL_INLINE_HEADER_END
-
-#endif /* _BINARY_H */
diff --git a/cross/lib/byteswap.in.h b/cross/lib/byteswap.in.h
deleted file mode 100644
index e61be27e917..00000000000
--- a/cross/lib/byteswap.in.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* byteswap.h - Byte swapping
- Copyright (C) 2005, 2007, 2009-2023 Free Software Foundation, Inc.
- Written by Oskar Liljeblad <oskar@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/cross/lib/c++defs.h b/cross/lib/c++defs.h
deleted file mode 100644
index 8ad46951ad4..00000000000
--- a/cross/lib/c++defs.h
+++ /dev/null
@@ -1,331 +0,0 @@
-/* C++ compatible function declaration macros.
- Copyright (C) 2010-2023 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 */
diff --git a/cross/lib/c-ctype.c b/cross/lib/c-ctype.c
deleted file mode 100644
index a4343f445f0..00000000000
--- a/cross/lib/c-ctype.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Character handling in C locale.
-
- Copyright (C) 2003-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-#define C_CTYPE_INLINE _GL_EXTERN_INLINE
-#include "c-ctype.h"
diff --git a/cross/lib/c-ctype.h b/cross/lib/c-ctype.h
deleted file mode 100644
index 35ca83d7d43..00000000000
--- a/cross/lib/c-ctype.h
+++ /dev/null
@@ -1,364 +0,0 @@
-/* Character handling in C locale.
-
- These functions work like the corresponding functions in <ctype.h>,
- except that they have the C (POSIX) locale hardwired, whereas the
- <ctype.h> functions' behaviour depends on the current locale set via
- setlocale.
-
- Copyright (C) 2000-2003, 2006, 2008-2023 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 C_CTYPE_H
-#define C_CTYPE_H
-
-#ifndef _GL_INLINE_HEADER_BEGIN
- #error "Please include config.h first."
-#endif
-_GL_INLINE_HEADER_BEGIN
-#ifndef C_CTYPE_INLINE
-# define C_CTYPE_INLINE _GL_INLINE
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-/* The functions defined in this file assume the "C" locale and a character
- set without diacritics (ASCII-US or EBCDIC-US or something like that).
- Even if the "C" locale on a particular system is an extension of the ASCII
- character set (like on BeOS, where it is UTF-8, or on AmigaOS, where it
- is ISO-8859-1), the functions in this file recognize only the ASCII
- characters. */
-
-
-#if (' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
- && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
- && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
- && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
- && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
- && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
- && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
- && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
- && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
- && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
- && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
- && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
- && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
- && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
- && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
- && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
- && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
- && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
- && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
- && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
- && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
- && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
- && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)
-/* The character set is ASCII or one of its variants or extensions, not EBCDIC.
- Testing the value of '\n' and '\r' is not relevant. */
-# define C_CTYPE_ASCII 1
-#elif ! (' ' == '\x40' && '0' == '\xf0' \
- && 'A' == '\xc1' && 'J' == '\xd1' && 'S' == '\xe2' \
- && 'a' == '\x81' && 'j' == '\x91' && 's' == '\xa2')
-# error "Only ASCII and EBCDIC are supported"
-#endif
-
-#if 'A' < 0
-# error "EBCDIC and char is signed -- not supported"
-#endif
-
-/* Cases for control characters. */
-
-#define _C_CTYPE_CNTRL \
- case '\a': case '\b': case '\f': case '\n': \
- case '\r': case '\t': case '\v': \
- _C_CTYPE_OTHER_CNTRL
-
-/* ASCII control characters other than those with \-letter escapes. */
-
-#if C_CTYPE_ASCII
-# define _C_CTYPE_OTHER_CNTRL \
- case '\x00': case '\x01': case '\x02': case '\x03': \
- case '\x04': case '\x05': case '\x06': case '\x0e': \
- case '\x0f': case '\x10': case '\x11': case '\x12': \
- case '\x13': case '\x14': case '\x15': case '\x16': \
- case '\x17': case '\x18': case '\x19': case '\x1a': \
- case '\x1b': case '\x1c': case '\x1d': case '\x1e': \
- case '\x1f': case '\x7f'
-#else
- /* Use EBCDIC code page 1047's assignments for ASCII control chars;
- assume all EBCDIC code pages agree about these assignments. */
-# define _C_CTYPE_OTHER_CNTRL \
- case '\x00': case '\x01': case '\x02': case '\x03': \
- case '\x07': case '\x0e': case '\x0f': case '\x10': \
- case '\x11': case '\x12': case '\x13': case '\x18': \
- case '\x19': case '\x1c': case '\x1d': case '\x1e': \
- case '\x1f': case '\x26': case '\x27': case '\x2d': \
- case '\x2e': case '\x32': case '\x37': case '\x3c': \
- case '\x3d': case '\x3f'
-#endif
-
-/* Cases for lowercase hex letters, and lowercase letters, all offset by N. */
-
-#define _C_CTYPE_LOWER_A_THRU_F_N(N) \
- case 'a' + (N): case 'b' + (N): case 'c' + (N): case 'd' + (N): \
- case 'e' + (N): case 'f' + (N)
-#define _C_CTYPE_LOWER_N(N) \
- _C_CTYPE_LOWER_A_THRU_F_N(N): \
- case 'g' + (N): case 'h' + (N): case 'i' + (N): case 'j' + (N): \
- case 'k' + (N): case 'l' + (N): case 'm' + (N): case 'n' + (N): \
- case 'o' + (N): case 'p' + (N): case 'q' + (N): case 'r' + (N): \
- case 's' + (N): case 't' + (N): case 'u' + (N): case 'v' + (N): \
- case 'w' + (N): case 'x' + (N): case 'y' + (N): case 'z' + (N)
-
-/* Cases for hex letters, digits, lower, punct, and upper. */
-
-#define _C_CTYPE_A_THRU_F \
- _C_CTYPE_LOWER_A_THRU_F_N (0): \
- _C_CTYPE_LOWER_A_THRU_F_N ('A' - 'a')
-#define _C_CTYPE_DIGIT \
- case '0': case '1': case '2': case '3': \
- case '4': case '5': case '6': case '7': \
- case '8': case '9'
-#define _C_CTYPE_LOWER _C_CTYPE_LOWER_N (0)
-#define _C_CTYPE_PUNCT \
- case '!': case '"': case '#': case '$': \
- case '%': case '&': case '\'': case '(': \
- case ')': case '*': case '+': case ',': \
- case '-': case '.': case '/': case ':': \
- case ';': case '<': case '=': case '>': \
- case '?': case '@': case '[': case '\\': \
- case ']': case '^': case '_': case '`': \
- case '{': case '|': case '}': case '~'
-#define _C_CTYPE_UPPER _C_CTYPE_LOWER_N ('A' - 'a')
-
-
-/* Function definitions. */
-
-/* Unlike the functions in <ctype.h>, which require an argument in the range
- of the 'unsigned char' type, the functions here operate on values that are
- in the 'unsigned char' range or in the 'char' range. In other words,
- when you have a 'char' value, you need to cast it before using it as
- argument to a <ctype.h> function:
-
- const char *s = ...;
- if (isalpha ((unsigned char) *s)) ...
-
- but you don't need to cast it for the functions defined in this file:
-
- const char *s = ...;
- if (c_isalpha (*s)) ...
- */
-
-C_CTYPE_INLINE bool
-c_isalnum (int c)
-{
- switch (c)
- {
- _C_CTYPE_DIGIT:
- _C_CTYPE_LOWER:
- _C_CTYPE_UPPER:
- return true;
- default:
- return false;
- }
-}
-
-C_CTYPE_INLINE bool
-c_isalpha (int c)
-{
- switch (c)
- {
- _C_CTYPE_LOWER:
- _C_CTYPE_UPPER:
- return true;
- default:
- return false;
- }
-}
-
-/* The function isascii is not locale dependent.
- Its use in EBCDIC is questionable. */
-C_CTYPE_INLINE bool
-c_isascii (int c)
-{
- switch (c)
- {
- case ' ':
- _C_CTYPE_CNTRL:
- _C_CTYPE_DIGIT:
- _C_CTYPE_LOWER:
- _C_CTYPE_PUNCT:
- _C_CTYPE_UPPER:
- return true;
- default:
- return false;
- }
-}
-
-C_CTYPE_INLINE bool
-c_isblank (int c)
-{
- return c == ' ' || c == '\t';
-}
-
-C_CTYPE_INLINE bool
-c_iscntrl (int c)
-{
- switch (c)
- {
- _C_CTYPE_CNTRL:
- return true;
- default:
- return false;
- }
-}
-
-C_CTYPE_INLINE bool
-c_isdigit (int c)
-{
- switch (c)
- {
- _C_CTYPE_DIGIT:
- return true;
- default:
- return false;
- }
-}
-
-C_CTYPE_INLINE bool
-c_isgraph (int c)
-{
- switch (c)
- {
- _C_CTYPE_DIGIT:
- _C_CTYPE_LOWER:
- _C_CTYPE_PUNCT:
- _C_CTYPE_UPPER:
- return true;
- default:
- return false;
- }
-}
-
-C_CTYPE_INLINE bool
-c_islower (int c)
-{
- switch (c)
- {
- _C_CTYPE_LOWER:
- return true;
- default:
- return false;
- }
-}
-
-C_CTYPE_INLINE bool
-c_isprint (int c)
-{
- switch (c)
- {
- case ' ':
- _C_CTYPE_DIGIT:
- _C_CTYPE_LOWER:
- _C_CTYPE_PUNCT:
- _C_CTYPE_UPPER:
- return true;
- default:
- return false;
- }
-}
-
-C_CTYPE_INLINE bool
-c_ispunct (int c)
-{
- switch (c)
- {
- _C_CTYPE_PUNCT:
- return true;
- default:
- return false;
- }
-}
-
-C_CTYPE_INLINE bool
-c_isspace (int c)
-{
- switch (c)
- {
- case ' ': case '\t': case '\n': case '\v': case '\f': case '\r':
- return true;
- default:
- return false;
- }
-}
-
-C_CTYPE_INLINE bool
-c_isupper (int c)
-{
- switch (c)
- {
- _C_CTYPE_UPPER:
- return true;
- default:
- return false;
- }
-}
-
-C_CTYPE_INLINE bool
-c_isxdigit (int c)
-{
- switch (c)
- {
- _C_CTYPE_DIGIT:
- _C_CTYPE_A_THRU_F:
- return true;
- default:
- return false;
- }
-}
-
-C_CTYPE_INLINE int
-c_tolower (int c)
-{
- switch (c)
- {
- _C_CTYPE_UPPER:
- return c - 'A' + 'a';
- default:
- return c;
- }
-}
-
-C_CTYPE_INLINE int
-c_toupper (int c)
-{
- switch (c)
- {
- _C_CTYPE_LOWER:
- return c - 'a' + 'A';
- default:
- return c;
- }
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-_GL_INLINE_HEADER_END
-
-#endif /* C_CTYPE_H */
diff --git a/cross/lib/c-strcase.h b/cross/lib/c-strcase.h
deleted file mode 100644
index 9bcca01b27c..00000000000
--- a/cross/lib/c-strcase.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Case-insensitive string comparison functions in C locale.
- Copyright (C) 1995-1996, 2001, 2003, 2005, 2009-2023 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 C_STRCASE_H
-#define C_STRCASE_H
-
-#include <stddef.h>
-
-
-/* The functions defined in this file assume the "C" locale and a character
- set without diacritics (ASCII-US or EBCDIC-US or something like that).
- Even if the "C" locale on a particular system is an extension of the ASCII
- character set (like on BeOS, where it is UTF-8, or on AmigaOS, where it
- is ISO-8859-1), the functions in this file recognize only the ASCII
- characters. More precisely, one of the string arguments must be an ASCII
- string; the other one can also contain non-ASCII characters (but then
- the comparison result will be nonzero). */
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-/* Compare strings S1 and S2, ignoring case, returning less than, equal to or
- greater than zero if S1 is lexicographically less than, equal to or greater
- than S2. */
-extern int c_strcasecmp (const char *s1, const char *s2) _GL_ATTRIBUTE_PURE;
-
-/* Compare no more than N characters of strings S1 and S2, ignoring case,
- returning less than, equal to or greater than zero if S1 is
- lexicographically less than, equal to or greater than S2. */
-extern int c_strncasecmp (const char *s1, const char *s2, size_t n)
- _GL_ATTRIBUTE_PURE;
-
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* C_STRCASE_H */
diff --git a/cross/lib/c-strcasecmp.c b/cross/lib/c-strcasecmp.c
deleted file mode 100644
index 8a958dc4fd9..00000000000
--- a/cross/lib/c-strcasecmp.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* c-strcasecmp.c -- case insensitive string comparator in C locale
- Copyright (C) 1998-1999, 2005-2006, 2009-2023 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 "c-strcase.h"
-
-#include <limits.h>
-
-#include "c-ctype.h"
-
-int
-c_strcasecmp (const char *s1, const char *s2)
-{
- register const unsigned char *p1 = (const unsigned char *) s1;
- register const unsigned char *p2 = (const unsigned char *) s2;
- unsigned char c1, c2;
-
- if (p1 == p2)
- return 0;
-
- do
- {
- c1 = c_tolower (*p1);
- c2 = c_tolower (*p2);
-
- if (c1 == '\0')
- break;
-
- ++p1;
- ++p2;
- }
- while (c1 == c2);
-
- if (UCHAR_MAX <= INT_MAX)
- return c1 - c2;
- else
- /* On machines where 'char' and 'int' are types of the same size, the
- difference of two 'unsigned char' values - including the sign bit -
- doesn't fit in an 'int'. */
- return _GL_CMP (c1, c2);
-}
diff --git a/cross/lib/c-strncasecmp.c b/cross/lib/c-strncasecmp.c
deleted file mode 100644
index 4ca8c5f4001..00000000000
--- a/cross/lib/c-strncasecmp.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* c-strncasecmp.c -- case insensitive string comparator in C locale
- Copyright (C) 1998-1999, 2005-2006, 2009-2023 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 "c-strcase.h"
-
-#include <limits.h>
-
-#include "c-ctype.h"
-
-int
-c_strncasecmp (const char *s1, const char *s2, size_t n)
-{
- register const unsigned char *p1 = (const unsigned char *) s1;
- register const unsigned char *p2 = (const unsigned char *) s2;
- unsigned char c1, c2;
-
- if (p1 == p2 || n == 0)
- return 0;
-
- do
- {
- c1 = c_tolower (*p1);
- c2 = c_tolower (*p2);
-
- if (--n == 0 || c1 == '\0')
- break;
-
- ++p1;
- ++p2;
- }
- while (c1 == c2);
-
- if (UCHAR_MAX <= INT_MAX)
- return c1 - c2;
- else
- /* On machines where 'char' and 'int' are types of the same size, the
- difference of two 'unsigned char' values - including the sign bit -
- doesn't fit in an 'int'. */
- return _GL_CMP (c1, c2);
-}
diff --git a/cross/lib/canonicalize-lgpl.c b/cross/lib/canonicalize-lgpl.c
deleted file mode 100644
index e701297d84b..00000000000
--- a/cross/lib/canonicalize-lgpl.c
+++ /dev/null
@@ -1,469 +0,0 @@
-/* Return the canonical absolute name of a given file.
- Copyright (C) 1996-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _LIBC
-/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
- optimizes away the name == NULL test below. */
-# define _GL_ARG_NONNULL(params)
-
-# include <libc-config.h>
-#endif
-
-/* Specification. */
-#include <stdlib.h>
-
-#include <errno.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
-#include <eloop-threshold.h>
-#include <filename.h>
-#include <idx.h>
-#include <intprops.h>
-#include <scratch_buffer.h>
-
-#ifdef _LIBC
-# include <shlib-compat.h>
-# define GCC_LINT 1
-# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
-#else
-# define __canonicalize_file_name canonicalize_file_name
-# define __realpath realpath
-# define __strdup strdup
-# include "pathmax.h"
-# define __faccessat faccessat
-# if defined _WIN32 && !defined __CYGWIN__
-# define __getcwd _getcwd
-# elif HAVE_GETCWD
-# if IN_RELOCWRAPPER
- /* When building the relocatable program wrapper, use the system's getcwd
- function, not the gnulib override, otherwise we would get a link error.
- */
-# undef getcwd
-# endif
-# if defined VMS && !defined getcwd
- /* We want the directory in Unix syntax, not in VMS syntax.
- The gnulib override of 'getcwd' takes 2 arguments; the original VMS
- 'getcwd' takes 3 arguments. */
-# define __getcwd(buf, max) getcwd (buf, max, 0)
-# else
-# define __getcwd getcwd
-# endif
-# else
-# define __getcwd(buf, max) getwd (buf)
-# endif
-# define __mempcpy mempcpy
-# define __pathconf pathconf
-# define __rawmemchr rawmemchr
-# define __readlink readlink
-# if IN_RELOCWRAPPER
- /* When building the relocatable program wrapper, use the system's memmove
- function, not the gnulib override, otherwise we would get a link error.
- */
-# undef memmove
-# endif
-#endif
-
-/* Suppress bogus GCC -Wmaybe-uninitialized warnings. */
-#if defined GCC_LINT || defined lint
-# define IF_LINT(Code) Code
-#else
-# define IF_LINT(Code) /* empty */
-#endif
-
-#ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
-# define DOUBLE_SLASH_IS_DISTINCT_ROOT false
-#endif
-
-#if defined _LIBC || !FUNC_REALPATH_WORKS
-
-/* Return true if FILE's existence can be shown, false (setting errno)
- otherwise. Follow symbolic links. */
-static bool
-file_accessible (char const *file)
-{
-# if defined _LIBC || HAVE_FACCESSAT
- return __faccessat (AT_FDCWD, file, F_OK, AT_EACCESS) == 0;
-# else
- struct stat st;
- return stat (file, &st) == 0 || errno == EOVERFLOW;
-# endif
-}
-
-/* True if concatenating END as a suffix to a file name means that the
- code needs to check that the file name is that of a searchable
- directory, since the canonicalize_filename_mode_stk code won't
- check this later anyway when it checks an ordinary file name
- component within END. END must either be empty, or start with a
- slash. */
-
-static bool _GL_ATTRIBUTE_PURE
-suffix_requires_dir_check (char const *end)
-{
- /* If END does not start with a slash, the suffix is OK. */
- while (ISSLASH (*end))
- {
- /* Two or more slashes act like a single slash. */
- do
- end++;
- while (ISSLASH (*end));
-
- switch (*end++)
- {
- default: return false; /* An ordinary file name component is OK. */
- case '\0': return true; /* Trailing "/" is trouble. */
- case '.': break; /* Possibly "." or "..". */
- }
- /* Trailing "/.", or "/.." even if not trailing, is trouble. */
- if (!*end || (*end == '.' && (!end[1] || ISSLASH (end[1]))))
- return true;
- }
-
- return false;
-}
-
-/* Append this to a file name to test whether it is a searchable directory.
- On POSIX platforms "/" suffices, but "/./" is sometimes needed on
- macOS 10.13 <https://bugs.gnu.org/30350>, and should also work on
- platforms like AIX 7.2 that need at least "/.". */
-
-# if defined _LIBC || defined LSTAT_FOLLOWS_SLASHED_SYMLINK
-static char const dir_suffix[] = "/";
-# else
-static char const dir_suffix[] = "/./";
-# endif
-
-/* Return true if DIR is a searchable dir, false (setting errno) otherwise.
- DIREND points to the NUL byte at the end of the DIR string.
- Store garbage into DIREND[0 .. strlen (dir_suffix)]. */
-
-static bool
-dir_check (char *dir, char *dirend)
-{
- strcpy (dirend, dir_suffix);
- return file_accessible (dir);
-}
-
-static idx_t
-get_path_max (void)
-{
-# ifdef PATH_MAX
- long int path_max = PATH_MAX;
-# else
- /* The caller invoked realpath with a null RESOLVED, even though
- PATH_MAX is not defined as a constant. The glibc manual says
- programs should not do this, and POSIX says the behavior is undefined.
- Historically, glibc here used the result of pathconf, or 1024 if that
- failed; stay consistent with this (dubious) historical practice. */
- int err = errno;
- long int path_max = __pathconf ("/", _PC_PATH_MAX);
- __set_errno (err);
-# endif
- return path_max < 0 ? 1024 : path_max <= IDX_MAX ? path_max : IDX_MAX;
-}
-
-/* Scratch buffers used by realpath_stk and managed by __realpath. */
-struct realpath_bufs
-{
- struct scratch_buffer rname;
- struct scratch_buffer extra;
- struct scratch_buffer link;
-};
-
-static char *
-realpath_stk (const char *name, char *resolved, struct realpath_bufs *bufs)
-{
- char *dest;
- char const *start;
- char const *end;
- int num_links = 0;
-
- if (name == NULL)
- {
- /* As per Single Unix Specification V2 we must return an error if
- either parameter is a null pointer. We extend this to allow
- the RESOLVED parameter to be NULL in case the we are expected to
- allocate the room for the return value. */
- __set_errno (EINVAL);
- return NULL;
- }
-
- if (name[0] == '\0')
- {
- /* As per Single Unix Specification V2 we must return an error if
- the name argument points to an empty string. */
- __set_errno (ENOENT);
- return NULL;
- }
-
- char *rname = bufs->rname.data;
- bool end_in_extra_buffer = false;
- bool failed = true;
-
- /* This is always zero for Posix hosts, but can be 2 for MS-Windows
- and MS-DOS X:/foo/bar file names. */
- idx_t prefix_len = FILE_SYSTEM_PREFIX_LEN (name);
-
- if (!IS_ABSOLUTE_FILE_NAME (name))
- {
- while (!__getcwd (bufs->rname.data, bufs->rname.length))
- {
- if (errno != ERANGE)
- {
- dest = rname;
- goto error;
- }
- if (!scratch_buffer_grow (&bufs->rname))
- return NULL;
- rname = bufs->rname.data;
- }
- dest = __rawmemchr (rname, '\0');
- start = name;
- prefix_len = FILE_SYSTEM_PREFIX_LEN (rname);
- }
- else
- {
- dest = __mempcpy (rname, name, prefix_len);
- *dest++ = '/';
- if (DOUBLE_SLASH_IS_DISTINCT_ROOT)
- {
- if (prefix_len == 0 /* implies ISSLASH (name[0]) */
- && ISSLASH (name[1]) && !ISSLASH (name[2]))
- *dest++ = '/';
- *dest = '\0';
- }
- start = name + prefix_len;
- }
-
- for ( ; *start; start = end)
- {
- /* Skip sequence of multiple file name separators. */
- while (ISSLASH (*start))
- ++start;
-
- /* Find end of component. */
- for (end = start; *end && !ISSLASH (*end); ++end)
- /* Nothing. */;
-
- /* Length of this file name component; it can be zero if a file
- name ends in '/'. */
- idx_t startlen = end - start;
-
- if (startlen == 0)
- break;
- else if (startlen == 1 && start[0] == '.')
- /* nothing */;
- else if (startlen == 2 && start[0] == '.' && start[1] == '.')
- {
- /* Back up to previous component, ignore if at root already. */
- if (dest > rname + prefix_len + 1)
- for (--dest; dest > rname && !ISSLASH (dest[-1]); --dest)
- continue;
- if (DOUBLE_SLASH_IS_DISTINCT_ROOT
- && dest == rname + 1 && !prefix_len
- && ISSLASH (*dest) && !ISSLASH (dest[1]))
- dest++;
- }
- else
- {
- if (!ISSLASH (dest[-1]))
- *dest++ = '/';
-
- while (rname + bufs->rname.length - dest
- < startlen + sizeof dir_suffix)
- {
- idx_t dest_offset = dest - rname;
- if (!scratch_buffer_grow_preserve (&bufs->rname))
- return NULL;
- rname = bufs->rname.data;
- dest = rname + dest_offset;
- }
-
- dest = __mempcpy (dest, start, startlen);
- *dest = '\0';
-
- char *buf;
- ssize_t n;
- while (true)
- {
- buf = bufs->link.data;
- idx_t bufsize = bufs->link.length;
- n = __readlink (rname, buf, bufsize - 1);
- if (n < bufsize - 1)
- break;
- if (!scratch_buffer_grow (&bufs->link))
- return NULL;
- }
- if (0 <= n)
- {
- if (++num_links > __eloop_threshold ())
- {
- __set_errno (ELOOP);
- goto error;
- }
-
- buf[n] = '\0';
-
- char *extra_buf = bufs->extra.data;
- idx_t end_idx IF_LINT (= 0);
- if (end_in_extra_buffer)
- end_idx = end - extra_buf;
- size_t len = strlen (end);
- if (INT_ADD_OVERFLOW (len, n))
- {
- __set_errno (ENOMEM);
- return NULL;
- }
- while (bufs->extra.length <= len + n)
- {
- if (!scratch_buffer_grow_preserve (&bufs->extra))
- return NULL;
- extra_buf = bufs->extra.data;
- }
- if (end_in_extra_buffer)
- end = extra_buf + end_idx;
-
- /* Careful here, end may be a pointer into extra_buf... */
- memmove (&extra_buf[n], end, len + 1);
- name = end = memcpy (extra_buf, buf, n);
- end_in_extra_buffer = true;
-
- if (IS_ABSOLUTE_FILE_NAME (buf))
- {
- idx_t pfxlen = FILE_SYSTEM_PREFIX_LEN (buf);
-
- dest = __mempcpy (rname, buf, pfxlen);
- *dest++ = '/'; /* It's an absolute symlink */
- if (DOUBLE_SLASH_IS_DISTINCT_ROOT)
- {
- if (ISSLASH (buf[1]) && !ISSLASH (buf[2]) && !pfxlen)
- *dest++ = '/';
- *dest = '\0';
- }
- /* Install the new prefix to be in effect hereafter. */
- prefix_len = pfxlen;
- }
- else
- {
- /* Back up to previous component, ignore if at root
- already: */
- if (dest > rname + prefix_len + 1)
- for (--dest; dest > rname && !ISSLASH (dest[-1]); --dest)
- continue;
- if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rname + 1
- && ISSLASH (*dest) && !ISSLASH (dest[1]) && !prefix_len)
- dest++;
- }
- }
- else if (! (suffix_requires_dir_check (end)
- ? dir_check (rname, dest)
- : errno == EINVAL))
- goto error;
- }
- }
- if (dest > rname + prefix_len + 1 && ISSLASH (dest[-1]))
- --dest;
- if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rname + 1 && !prefix_len
- && ISSLASH (*dest) && !ISSLASH (dest[1]))
- dest++;
- failed = false;
-
-error:
- *dest++ = '\0';
- if (resolved != NULL)
- {
- /* Copy the full result on success or partial result if failure was due
- to the path not existing or not being accessible. */
- if ((!failed || errno == ENOENT || errno == EACCES)
- && dest - rname <= get_path_max ())
- {
- strcpy (resolved, rname);
- if (failed)
- return NULL;
- else
- return resolved;
- }
- if (!failed)
- __set_errno (ENAMETOOLONG);
- return NULL;
- }
- else
- {
- if (failed)
- return NULL;
- else
- return __strdup (bufs->rname.data);
- }
-}
-
-/* Return the canonical absolute name of file NAME. A canonical name
- does not contain any ".", ".." components nor any repeated file name
- separators ('/') or symlinks. All file name components must exist. If
- RESOLVED is null, the result is malloc'd; otherwise, if the
- canonical name is PATH_MAX chars or more, returns null with 'errno'
- set to ENAMETOOLONG; if the name fits in fewer than PATH_MAX chars,
- returns the name in RESOLVED. If the name cannot be resolved and
- RESOLVED is non-NULL, it contains the name of the first component
- that cannot be resolved. If the name can be resolved, RESOLVED
- holds the same value as the value returned. */
-
-char *
-__realpath (const char *name, char *resolved)
-{
- struct realpath_bufs bufs;
- scratch_buffer_init (&bufs.rname);
- scratch_buffer_init (&bufs.extra);
- scratch_buffer_init (&bufs.link);
- char *result = realpath_stk (name, resolved, &bufs);
- scratch_buffer_free (&bufs.link);
- scratch_buffer_free (&bufs.extra);
- scratch_buffer_free (&bufs.rname);
- return result;
-}
-libc_hidden_def (__realpath)
-versioned_symbol (libc, __realpath, realpath, GLIBC_2_3);
-
-#endif /* defined _LIBC || !FUNC_REALPATH_WORKS */
-
-
-#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_3)
-char *
-attribute_compat_text_section
-__old_realpath (const char *name, char *resolved)
-{
- if (resolved == NULL)
- {
- __set_errno (EINVAL);
- return NULL;
- }
-
- return __realpath (name, resolved);
-}
-compat_symbol (libc, __old_realpath, realpath, GLIBC_2_0);
-#endif
-
-
-char *
-__canonicalize_file_name (const char *name)
-{
- return __realpath (name, NULL);
-}
-weak_alias (__canonicalize_file_name, canonicalize_file_name)
diff --git a/cross/lib/careadlinkat.c b/cross/lib/careadlinkat.c
deleted file mode 100644
index 359d497396c..00000000000
--- a/cross/lib/careadlinkat.c
+++ /dev/null
@@ -1,184 +0,0 @@
-/* Read symbolic links into a buffer without size limitation, relative to fd.
-
- Copyright (C) 2001, 2003-2004, 2007, 2009-2023 Free Software Foundation,
- Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */
-
-#include <config.h>
-
-#include "careadlinkat.h"
-
-#include "idx.h"
-#include "minmax.h"
-
-#include <errno.h>
-#include <limits.h>
-#include <string.h>
-#include <unistd.h>
-
-/* Define this independently so that stdint.h is not a prerequisite. */
-#ifndef SIZE_MAX
-# define SIZE_MAX ((size_t) -1)
-#endif
-
-#ifndef SSIZE_MAX
-# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
-#endif
-
-#include "allocator.h"
-
-enum { STACK_BUF_SIZE = 1024 };
-
-/* Act like careadlinkat (see below), with an additional argument
- STACK_BUF that can be used as temporary storage.
-
- If GCC_LINT is defined, do not inline this function with GCC 10.1
- and later, to avoid creating a pointer to the stack that GCC
- -Wreturn-local-addr incorrectly complains about. See:
- https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93644
- Although the noinline attribute can hurt performance a bit, no better way
- to pacify GCC is known; even an explicit #pragma does not pacify GCC.
- When the GCC bug is fixed this workaround should be limited to the
- broken GCC versions. */
-#if _GL_GNUC_PREREQ (10, 1)
-# if defined GCC_LINT || defined lint
-__attribute__ ((__noinline__))
-# elif __OPTIMIZE__ && !__NO_INLINE__
-# define GCC_BOGUS_WRETURN_LOCAL_ADDR
-# endif
-#endif
-static char *
-readlink_stk (int fd, char const *filename,
- char *buffer, size_t buffer_size,
- struct allocator const *alloc,
- ssize_t (*preadlinkat) (int, char const *, char *, size_t),
- char stack_buf[STACK_BUF_SIZE])
-{
- if (! alloc)
- alloc = &stdlib_allocator;
-
- if (!buffer)
- {
- buffer = stack_buf;
- buffer_size = STACK_BUF_SIZE;
- }
-
- char *buf = buffer;
- idx_t buf_size_max = MIN (IDX_MAX, MIN (SSIZE_MAX, SIZE_MAX));
- idx_t buf_size = MIN (buffer_size, buf_size_max);
-
- while (buf)
- {
- /* Attempt to read the link into the current buffer. */
- idx_t link_length = preadlinkat (fd, filename, buf, buf_size);
- if (link_length < 0)
- {
- if (buf != buffer)
- {
- int readlinkat_errno = errno;
- alloc->free (buf);
- errno = readlinkat_errno;
- }
- return NULL;
- }
-
- idx_t link_size = link_length;
-
- if (link_size < buf_size)
- {
- buf[link_size++] = '\0';
-
- if (buf == stack_buf)
- {
- char *b = alloc->allocate (link_size);
- buf_size = link_size;
- if (! b)
- break;
- return memcpy (b, buf, link_size);
- }
-
- if (link_size < buf_size && buf != buffer && alloc->reallocate)
- {
- /* Shrink BUF before returning it. */
- char *b = alloc->reallocate (buf, link_size);
- if (b)
- return b;
- }
-
- return buf;
- }
-
- if (buf != buffer)
- alloc->free (buf);
-
- if (buf_size_max / 2 <= buf_size)
- {
- errno = ENAMETOOLONG;
- return NULL;
- }
-
- buf_size = 2 * buf_size + 1;
- buf = alloc->allocate (buf_size);
- }
-
- if (alloc->die)
- alloc->die (buf_size);
- errno = ENOMEM;
- return NULL;
-}
-
-
-/* Assuming the current directory is FD, get the symbolic link value
- of FILENAME as a null-terminated string and put it into a buffer.
- If FD is AT_FDCWD, FILENAME is interpreted relative to the current
- working directory, as in openat.
-
- If the link is small enough to fit into BUFFER put it there.
- BUFFER's size is BUFFER_SIZE, and BUFFER can be null
- if BUFFER_SIZE is zero.
-
- If the link is not small, put it into a dynamically allocated
- buffer managed by ALLOC. It is the caller's responsibility to free
- the returned value if it is nonnull and is not BUFFER. A null
- ALLOC stands for the standard allocator.
-
- The PREADLINKAT function specifies how to read links. It operates
- like POSIX readlinkat()
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/readlink.html>
- but can assume that its first argument is the same as FD.
-
- If successful, return the buffer address; otherwise return NULL and
- set errno. */
-
-char *
-careadlinkat (int fd, char const *filename,
- char *buffer, size_t buffer_size,
- struct allocator const *alloc,
- ssize_t (*preadlinkat) (int, char const *, char *, size_t))
-{
- /* Allocate the initial buffer on the stack. This way, in the
- common case of a symlink of small size, we get away with a
- single small malloc instead of a big malloc followed by a
- shrinking realloc. */
- #ifdef GCC_BOGUS_WRETURN_LOCAL_ADDR
- #warning "GCC might issue a bogus -Wreturn-local-addr warning here."
- #warning "See <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93644>."
- #endif
- char stack_buf[STACK_BUF_SIZE];
- return readlink_stk (fd, filename, buffer, buffer_size, alloc,
- preadlinkat, stack_buf);
-}
diff --git a/cross/lib/careadlinkat.h b/cross/lib/careadlinkat.h
deleted file mode 100644
index 201d0415fff..00000000000
--- a/cross/lib/careadlinkat.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/* Read symbolic links into a buffer without size limitation, relative to fd.
-
- Copyright (C) 2011-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */
-
-#ifndef _GL_CAREADLINKAT_H
-#define _GL_CAREADLINKAT_H
-
-#include <fcntl.h>
-#include <unistd.h>
-
-struct allocator;
-
-/* Assuming the current directory is FD, get the symbolic link value
- of FILENAME as a null-terminated string and put it into a buffer.
- If FD is AT_FDCWD, FILENAME is interpreted relative to the current
- working directory, as in openat.
-
- If the link is small enough to fit into BUFFER put it there.
- BUFFER's size is BUFFER_SIZE, and BUFFER can be null
- if BUFFER_SIZE is zero.
-
- If the link is not small, put it into a dynamically allocated
- buffer managed by ALLOC. It is the caller's responsibility to free
- the returned value if it is nonnull and is not BUFFER.
-
- The PREADLINKAT function specifies how to read links. It operates
- like POSIX readlinkat()
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/readlink.html>
- but can assume that its first argument is the same as FD.
-
- If successful, return the buffer address; otherwise return NULL and
- set errno. */
-
-char *careadlinkat (int fd, char const *filename,
- char *restrict buffer, size_t buffer_size,
- struct allocator const *alloc,
- ssize_t (*preadlinkat) (int, char const *,
- char *, size_t));
-
-/* Suitable value for careadlinkat's FD argument. */
-#if HAVE_READLINKAT
-/* AT_FDCWD is declared in <fcntl.h>. */
-#else
-/* Define AT_FDCWD independently, so that the careadlinkat module does
- not depend on the fcntl-h module. We might as well use the same value
- as fcntl-h. */
-# ifndef AT_FDCWD
-# define AT_FDCWD (-3041965)
-# endif
-#endif
-
-#endif /* _GL_CAREADLINKAT_H */
diff --git a/cross/lib/cdefs.h b/cross/lib/cdefs.h
deleted file mode 100644
index 412f036ce35..00000000000
--- a/cross/lib/cdefs.h
+++ /dev/null
@@ -1,715 +0,0 @@
-/* Copyright (C) 1992-2023 Free Software Foundation, Inc.
- Copyright The GNU Toolchain Authors.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _SYS_CDEFS_H
-#define _SYS_CDEFS_H 1
-
-/* We are almost always included from features.h. */
-#ifndef _FEATURES_H
-# include <features.h>
-#endif
-
-/* The GNU libc does not support any K&R compilers or the traditional mode
- of ISO C compilers anymore. Check for some of the combinations not
- supported anymore. */
-#if defined __GNUC__ && !defined __STDC__
-# error "You need a ISO C conforming compiler to use the glibc headers"
-#endif
-
-/* Some user header file might have defined this before. */
-#undef __P
-#undef __PMT
-
-/* Compilers that lack __has_attribute may object to
- #if defined __has_attribute && __has_attribute (...)
- even though they do not need to evaluate the right-hand side of the &&.
- Similarly for __has_builtin, etc. */
-#if (defined __has_attribute \
- && (!defined __clang_minor__ \
- || (defined __apple_build_version__ \
- ? 6000000 <= __apple_build_version__ \
- : 3 < __clang_major__ + (5 <= __clang_minor__))))
-# define __glibc_has_attribute(attr) __has_attribute (attr)
-#else
-# define __glibc_has_attribute(attr) 0
-#endif
-#ifdef __has_builtin
-# define __glibc_has_builtin(name) __has_builtin (name)
-#else
-# define __glibc_has_builtin(name) 0
-#endif
-#ifdef __has_extension
-# define __glibc_has_extension(ext) __has_extension (ext)
-#else
-# define __glibc_has_extension(ext) 0
-#endif
-
-#if defined __GNUC__ || defined __clang__
-
-/* All functions, except those with callbacks or those that
- synchronize memory, are leaf functions. */
-# if __GNUC_PREREQ (4, 6) && !defined _LIBC
-# define __LEAF , __leaf__
-# define __LEAF_ATTR __attribute__ ((__leaf__))
-# else
-# define __LEAF
-# define __LEAF_ATTR
-# endif
-
-/* GCC can always grok prototypes. For C++ programs we add throw()
- to help it optimize the function calls. But this only works with
- gcc 2.8.x and egcs. For gcc 3.4 and up we even mark C functions
- as non-throwing using a function attribute since programs can use
- the -fexceptions options for C code as well. */
-# if !defined __cplusplus \
- && (__GNUC_PREREQ (3, 4) || __glibc_has_attribute (__nothrow__))
-# define __THROW __attribute__ ((__nothrow__ __LEAF))
-# define __THROWNL __attribute__ ((__nothrow__))
-# define __NTH(fct) __attribute__ ((__nothrow__ __LEAF)) fct
-# define __NTHNL(fct) __attribute__ ((__nothrow__)) fct
-# else
-# if defined __cplusplus && (__GNUC_PREREQ (2,8) || __clang_major >= 4)
-# if __cplusplus >= 201103L
-# define __THROW noexcept (true)
-# else
-# define __THROW throw ()
-# endif
-# define __THROWNL __THROW
-# define __NTH(fct) __LEAF_ATTR fct __THROW
-# define __NTHNL(fct) fct __THROW
-# else
-# define __THROW
-# define __THROWNL
-# define __NTH(fct) fct
-# define __NTHNL(fct) fct
-# endif
-# endif
-
-#else /* Not GCC or clang. */
-
-# if (defined __cplusplus \
- || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L))
-# define __inline inline
-# else
-# define __inline /* No inline functions. */
-# endif
-
-# define __THROW
-# define __THROWNL
-# define __NTH(fct) fct
-
-#endif /* GCC || clang. */
-
-/* These two macros are not used in glibc anymore. They are kept here
- only because some other projects expect the macros to be defined. */
-#define __P(args) args
-#define __PMT(args) args
-
-/* For these things, GCC behaves the ANSI way normally,
- and the non-ANSI way under -traditional. */
-
-#define __CONCAT(x,y) x ## y
-#define __STRING(x) #x
-
-/* This is not a typedef so `const __ptr_t' does the right thing. */
-#define __ptr_t void *
-
-
-/* C++ needs to know that types and declarations are C, not C++. */
-#ifdef __cplusplus
-# define __BEGIN_DECLS extern "C" {
-# define __END_DECLS }
-#else
-# define __BEGIN_DECLS
-# define __END_DECLS
-#endif
-
-
-/* Gnulib avoids these definitions, as they don't work on non-glibc platforms.
- In particular, __bos and __bos0 are defined differently in the Android libc.
- */
-#ifndef __GNULIB_CDEFS
-
-/* Fortify support. */
-# define __bos(ptr) __builtin_object_size (ptr, __USE_FORTIFY_LEVEL > 1)
-# define __bos0(ptr) __builtin_object_size (ptr, 0)
-
-/* Use __builtin_dynamic_object_size at _FORTIFY_SOURCE=3 when available. */
-# if __USE_FORTIFY_LEVEL == 3 && (__glibc_clang_prereq (9, 0) \
- || __GNUC_PREREQ (12, 0))
-# define __glibc_objsize0(__o) __builtin_dynamic_object_size (__o, 0)
-# define __glibc_objsize(__o) __builtin_dynamic_object_size (__o, 1)
-# else
-# define __glibc_objsize0(__o) __bos0 (__o)
-# define __glibc_objsize(__o) __bos (__o)
-# endif
-
-/* Compile time conditions to choose between the regular, _chk and _chk_warn
- variants. These conditions should get evaluated to constant and optimized
- away. */
-
-# define __glibc_safe_len_cond(__l, __s, __osz) ((__l) <= (__osz) / (__s))
-# define __glibc_unsigned_or_positive(__l) \
- ((__typeof (__l)) 0 < (__typeof (__l)) -1 \
- || (__builtin_constant_p (__l) && (__l) > 0))
-
-/* Length is known to be safe at compile time if the __L * __S <= __OBJSZ
- condition can be folded to a constant and if it is true, or unknown (-1) */
-# define __glibc_safe_or_unknown_len(__l, __s, __osz) \
- ((__osz) == (__SIZE_TYPE__) -1 \
- || (__glibc_unsigned_or_positive (__l) \
- && __builtin_constant_p (__glibc_safe_len_cond ((__SIZE_TYPE__) (__l), \
- (__s), (__osz))) \
- && __glibc_safe_len_cond ((__SIZE_TYPE__) (__l), (__s), (__osz))))
-
-/* Conversely, we know at compile time that the length is unsafe if the
- __L * __S <= __OBJSZ condition can be folded to a constant and if it is
- false. */
-# define __glibc_unsafe_len(__l, __s, __osz) \
- (__glibc_unsigned_or_positive (__l) \
- && __builtin_constant_p (__glibc_safe_len_cond ((__SIZE_TYPE__) (__l), \
- __s, __osz)) \
- && !__glibc_safe_len_cond ((__SIZE_TYPE__) (__l), __s, __osz))
-
-/* Fortify function f. __f_alias, __f_chk and __f_chk_warn must be
- declared. */
-
-# define __glibc_fortify(f, __l, __s, __osz, ...) \
- (__glibc_safe_or_unknown_len (__l, __s, __osz) \
- ? __ ## f ## _alias (__VA_ARGS__) \
- : (__glibc_unsafe_len (__l, __s, __osz) \
- ? __ ## f ## _chk_warn (__VA_ARGS__, __osz) \
- : __ ## f ## _chk (__VA_ARGS__, __osz))) \
-
-/* Fortify function f, where object size argument passed to f is the number of
- elements and not total size. */
-
-# define __glibc_fortify_n(f, __l, __s, __osz, ...) \
- (__glibc_safe_or_unknown_len (__l, __s, __osz) \
- ? __ ## f ## _alias (__VA_ARGS__) \
- : (__glibc_unsafe_len (__l, __s, __osz) \
- ? __ ## f ## _chk_warn (__VA_ARGS__, (__osz) / (__s)) \
- : __ ## f ## _chk (__VA_ARGS__, (__osz) / (__s)))) \
-
-#endif
-
-
-#if __GNUC_PREREQ (4,3)
-# define __warnattr(msg) __attribute__((__warning__ (msg)))
-# define __errordecl(name, msg) \
- extern void name (void) __attribute__((__error__ (msg)))
-#else
-# define __warnattr(msg)
-# define __errordecl(name, msg) extern void name (void)
-#endif
-
-/* Support for flexible arrays.
- Headers that should use flexible arrays only if they're "real"
- (e.g. only if they won't affect sizeof()) should test
- #if __glibc_c99_flexarr_available. */
-#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L && !defined __HP_cc
-# define __flexarr []
-# define __glibc_c99_flexarr_available 1
-#elif __GNUC_PREREQ (2,97) || defined __clang__
-/* GCC 2.97 and clang support C99 flexible array members as an extension,
- even when in C89 mode or compiling C++ (any version). */
-# define __flexarr []
-# define __glibc_c99_flexarr_available 1
-#elif defined __GNUC__
-/* Pre-2.97 GCC did not support C99 flexible arrays but did have
- an equivalent extension with slightly different notation. */
-# define __flexarr [0]
-# define __glibc_c99_flexarr_available 1
-#else
-/* Some other non-C99 compiler. Approximate with [1]. */
-# define __flexarr [1]
-# define __glibc_c99_flexarr_available 0
-#endif
-
-
-/* __asm__ ("xyz") is used throughout the headers to rename functions
- at the assembly language level. This is wrapped by the __REDIRECT
- macro, in order to support compilers that can do this some other
- way. When compilers don't support asm-names at all, we have to do
- preprocessor tricks instead (which don't have exactly the right
- semantics, but it's the best we can do).
-
- Example:
- int __REDIRECT(setpgrp, (__pid_t pid, __pid_t pgrp), setpgid); */
-
-#if (defined __GNUC__ && __GNUC__ >= 2) || (__clang_major__ >= 4)
-
-# define __REDIRECT(name, proto, alias) name proto __asm__ (__ASMNAME (#alias))
-# ifdef __cplusplus
-# define __REDIRECT_NTH(name, proto, alias) \
- name proto __THROW __asm__ (__ASMNAME (#alias))
-# define __REDIRECT_NTHNL(name, proto, alias) \
- name proto __THROWNL __asm__ (__ASMNAME (#alias))
-# else
-# define __REDIRECT_NTH(name, proto, alias) \
- name proto __asm__ (__ASMNAME (#alias)) __THROW
-# define __REDIRECT_NTHNL(name, proto, alias) \
- name proto __asm__ (__ASMNAME (#alias)) __THROWNL
-# endif
-# define __ASMNAME(cname) __ASMNAME2 (__USER_LABEL_PREFIX__, cname)
-# define __ASMNAME2(prefix, cname) __STRING (prefix) cname
-
-/*
-#elif __SOME_OTHER_COMPILER__
-
-# define __REDIRECT(name, proto, alias) name proto; \
- _Pragma("let " #name " = " #alias)
-*/
-#endif
-
-/* GCC and clang have various useful declarations that can be made with
- the '__attribute__' syntax. All of the ways we use this do fine if
- they are omitted for compilers that don't understand it. */
-#if !(defined __GNUC__ || defined __clang__)
-# define __attribute__(xyz) /* Ignore */
-#endif
-
-/* At some point during the gcc 2.96 development the `malloc' attribute
- for functions was introduced. We don't want to use it unconditionally
- (although this would be possible) since it generates warnings. */
-#if __GNUC_PREREQ (2,96) || __glibc_has_attribute (__malloc__)
-# define __attribute_malloc__ __attribute__ ((__malloc__))
-#else
-# define __attribute_malloc__ /* Ignore */
-#endif
-
-/* Tell the compiler which arguments to an allocation function
- indicate the size of the allocation. */
-#if __GNUC_PREREQ (4, 3)
-# define __attribute_alloc_size__(params) \
- __attribute__ ((__alloc_size__ params))
-#else
-# define __attribute_alloc_size__(params) /* Ignore. */
-#endif
-
-/* Tell the compiler which argument to an allocation function
- indicates the alignment of the allocation. */
-#if __GNUC_PREREQ (4, 9) || __glibc_has_attribute (__alloc_align__)
-# define __attribute_alloc_align__(param) \
- __attribute__ ((__alloc_align__ param))
-#else
-# define __attribute_alloc_align__(param) /* Ignore. */
-#endif
-
-/* At some point during the gcc 2.96 development the `pure' attribute
- for functions was introduced. We don't want to use it unconditionally
- (although this would be possible) since it generates warnings. */
-#if __GNUC_PREREQ (2,96) || __glibc_has_attribute (__pure__)
-# define __attribute_pure__ __attribute__ ((__pure__))
-#else
-# define __attribute_pure__ /* Ignore */
-#endif
-
-/* This declaration tells the compiler that the value is constant. */
-#if __GNUC_PREREQ (2,5) || __glibc_has_attribute (__const__)
-# define __attribute_const__ __attribute__ ((__const__))
-#else
-# define __attribute_const__ /* Ignore */
-#endif
-
-#if __GNUC_PREREQ (2,7) || __glibc_has_attribute (__unused__)
-# define __attribute_maybe_unused__ __attribute__ ((__unused__))
-#else
-# define __attribute_maybe_unused__ /* Ignore */
-#endif
-
-/* At some point during the gcc 3.1 development the `used' attribute
- for functions was introduced. We don't want to use it unconditionally
- (although this would be possible) since it generates warnings. */
-#if __GNUC_PREREQ (3,1) || __glibc_has_attribute (__used__)
-# define __attribute_used__ __attribute__ ((__used__))
-# define __attribute_noinline__ __attribute__ ((__noinline__))
-#else
-# define __attribute_used__ __attribute__ ((__unused__))
-# define __attribute_noinline__ /* Ignore */
-#endif
-
-/* Since version 3.2, gcc allows marking deprecated functions. */
-#if __GNUC_PREREQ (3,2) || __glibc_has_attribute (__deprecated__)
-# define __attribute_deprecated__ __attribute__ ((__deprecated__))
-#else
-# define __attribute_deprecated__ /* Ignore */
-#endif
-
-/* Since version 4.5, gcc also allows one to specify the message printed
- when a deprecated function is used. clang claims to be gcc 4.2, but
- may also support this feature. */
-#if __GNUC_PREREQ (4,5) \
- || __glibc_has_extension (__attribute_deprecated_with_message__)
-# define __attribute_deprecated_msg__(msg) \
- __attribute__ ((__deprecated__ (msg)))
-#else
-# define __attribute_deprecated_msg__(msg) __attribute_deprecated__
-#endif
-
-/* At some point during the gcc 2.8 development the `format_arg' attribute
- for functions was introduced. We don't want to use it unconditionally
- (although this would be possible) since it generates warnings.
- If several `format_arg' attributes are given for the same function, in
- gcc-3.0 and older, all but the last one are ignored. In newer gccs,
- all designated arguments are considered. */
-#if __GNUC_PREREQ (2,8) || __glibc_has_attribute (__format_arg__)
-# define __attribute_format_arg__(x) __attribute__ ((__format_arg__ (x)))
-#else
-# define __attribute_format_arg__(x) /* Ignore */
-#endif
-
-/* At some point during the gcc 2.97 development the `strfmon' format
- attribute for functions was introduced. We don't want to use it
- unconditionally (although this would be possible) since it
- generates warnings. */
-#if __GNUC_PREREQ (2,97) || __glibc_has_attribute (__format__)
-# define __attribute_format_strfmon__(a,b) \
- __attribute__ ((__format__ (__strfmon__, a, b)))
-#else
-# define __attribute_format_strfmon__(a,b) /* Ignore */
-#endif
-
-/* The nonnull function attribute marks pointer parameters that
- must not be NULL. This has the name __nonnull in glibc,
- and __attribute_nonnull__ in files shared with Gnulib to avoid
- collision with a different __nonnull in DragonFlyBSD 5.9. */
-#ifndef __attribute_nonnull__
-# if __GNUC_PREREQ (3,3) || __glibc_has_attribute (__nonnull__)
-# define __attribute_nonnull__(params) __attribute__ ((__nonnull__ params))
-# else
-# define __attribute_nonnull__(params)
-# endif
-#endif
-#ifndef __nonnull
-# define __nonnull(params) __attribute_nonnull__ (params)
-#endif
-
-/* The returns_nonnull function attribute marks the return type of the function
- as always being non-null. */
-#ifndef __returns_nonnull
-# if __GNUC_PREREQ (4, 9) || __glibc_has_attribute (__returns_nonnull__)
-# define __returns_nonnull __attribute__ ((__returns_nonnull__))
-# else
-# define __returns_nonnull
-# endif
-#endif
-
-/* If fortification mode, we warn about unused results of certain
- function calls which can lead to problems. */
-#if __GNUC_PREREQ (3,4) || __glibc_has_attribute (__warn_unused_result__)
-# define __attribute_warn_unused_result__ \
- __attribute__ ((__warn_unused_result__))
-# if defined __USE_FORTIFY_LEVEL && __USE_FORTIFY_LEVEL > 0
-# define __wur __attribute_warn_unused_result__
-# endif
-#else
-# define __attribute_warn_unused_result__ /* empty */
-#endif
-#ifndef __wur
-# define __wur /* Ignore */
-#endif
-
-/* Forces a function to be always inlined. */
-#if __GNUC_PREREQ (3,2) || __glibc_has_attribute (__always_inline__)
-/* The Linux kernel defines __always_inline in stddef.h (283d7573), and
- it conflicts with this definition. Therefore undefine it first to
- allow either header to be included first. */
-# undef __always_inline
-# define __always_inline __inline __attribute__ ((__always_inline__))
-#else
-# undef __always_inline
-# define __always_inline __inline
-#endif
-
-/* Associate error messages with the source location of the call site rather
- than with the source location inside the function. */
-#if __GNUC_PREREQ (4,3) || __glibc_has_attribute (__artificial__)
-# define __attribute_artificial__ __attribute__ ((__artificial__))
-#else
-# define __attribute_artificial__ /* Ignore */
-#endif
-
-/* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99
- inline semantics, unless -fgnu89-inline is used. Using __GNUC_STDC_INLINE__
- or __GNUC_GNU_INLINE is not a good enough check for gcc because gcc versions
- older than 4.3 may define these macros and still not guarantee GNU inlining
- semantics.
-
- clang++ identifies itself as gcc-4.2, but has support for GNU inlining
- semantics, that can be checked for by using the __GNUC_STDC_INLINE_ and
- __GNUC_GNU_INLINE__ macro definitions. */
-#if (!defined __cplusplus || __GNUC_PREREQ (4,3) \
- || (defined __clang__ && (defined __GNUC_STDC_INLINE__ \
- || defined __GNUC_GNU_INLINE__)))
-# if defined __GNUC_STDC_INLINE__ || defined __cplusplus
-# define __extern_inline extern __inline __attribute__ ((__gnu_inline__))
-# define __extern_always_inline \
- extern __always_inline __attribute__ ((__gnu_inline__))
-# else
-# define __extern_inline extern __inline
-# define __extern_always_inline extern __always_inline
-# endif
-#endif
-
-#ifdef __extern_always_inline
-# define __fortify_function __extern_always_inline __attribute_artificial__
-#endif
-
-/* GCC 4.3 and above allow passing all anonymous arguments of an
- __extern_always_inline function to some other vararg function. */
-#if __GNUC_PREREQ (4,3)
-# define __va_arg_pack() __builtin_va_arg_pack ()
-# define __va_arg_pack_len() __builtin_va_arg_pack_len ()
-#endif
-
-/* It is possible to compile containing GCC extensions even if GCC is
- run in pedantic mode if the uses are carefully marked using the
- `__extension__' keyword. But this is not generally available before
- version 2.8. */
-#if !(__GNUC_PREREQ (2,8) || defined __clang__)
-# define __extension__ /* Ignore */
-#endif
-
-/* __restrict is known in EGCS 1.2 and above, and in clang.
- It works also in C++ mode (outside of arrays), but only when spelled
- as '__restrict', not 'restrict'. */
-#if !(__GNUC_PREREQ (2,92) || __clang_major__ >= 3)
-# if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
-# define __restrict restrict
-# else
-# define __restrict /* Ignore */
-# endif
-#endif
-
-/* ISO C99 also allows to declare arrays as non-overlapping. The syntax is
- array_name[restrict]
- GCC 3.1 and clang support this.
- This syntax is not usable in C++ mode. */
-#if (__GNUC_PREREQ (3,1) || __clang_major__ >= 3) && !defined __cplusplus
-# define __restrict_arr __restrict
-#else
-# ifdef __GNUC__
-# define __restrict_arr /* Not supported in old GCC. */
-# else
-# if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
-# define __restrict_arr restrict
-# else
-/* Some other non-C99 compiler. */
-# define __restrict_arr /* Not supported. */
-# endif
-# endif
-#endif
-
-#if (__GNUC__ >= 3) || __glibc_has_builtin (__builtin_expect)
-# define __glibc_unlikely(cond) __builtin_expect ((cond), 0)
-# define __glibc_likely(cond) __builtin_expect ((cond), 1)
-#else
-# define __glibc_unlikely(cond) (cond)
-# define __glibc_likely(cond) (cond)
-#endif
-
-#if (!defined _Noreturn \
- && (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 201112 \
- && !(__GNUC_PREREQ (4,7) \
- || (3 < __clang_major__ + (5 <= __clang_minor__))))
-# if __GNUC_PREREQ (2,8)
-# define _Noreturn __attribute__ ((__noreturn__))
-# else
-# define _Noreturn
-# endif
-#endif
-
-#if __GNUC_PREREQ (8, 0)
-/* Describes a char array whose address can safely be passed as the first
- argument to strncpy and strncat, as the char array is not necessarily
- a NUL-terminated string. */
-# define __attribute_nonstring__ __attribute__ ((__nonstring__))
-#else
-# define __attribute_nonstring__
-#endif
-
-/* Undefine (also defined in libc-symbols.h). */
-#undef __attribute_copy__
-#if __GNUC_PREREQ (9, 0)
-/* Copies attributes from the declaration or type referenced by
- the argument. */
-# define __attribute_copy__(arg) __attribute__ ((__copy__ (arg)))
-#else
-# define __attribute_copy__(arg)
-#endif
-
-#if (!defined _Static_assert && !defined __cplusplus \
- && (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 201112 \
- && (!(__GNUC_PREREQ (4, 6) || __clang_major__ >= 4) \
- || defined __STRICT_ANSI__))
-# define _Static_assert(expr, diagnostic) \
- extern int (*__Static_assert_function (void)) \
- [!!sizeof (struct { int __error_if_negative: (expr) ? 2 : -1; })]
-#endif
-
-/* Gnulib avoids including these, as they don't work on non-glibc or
- older glibc platforms. */
-#ifndef __GNULIB_CDEFS
-# include <bits/wordsize.h>
-# include <bits/long-double.h>
-#endif
-
-#if __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 1
-# ifdef __REDIRECT
-
-/* Alias name defined automatically. */
-# define __LDBL_REDIR(name, proto) ... unused__ldbl_redir
-# define __LDBL_REDIR_DECL(name) \
- extern __typeof (name) name __asm (__ASMNAME ("__" #name "ieee128"));
-
-/* Alias name defined automatically, with leading underscores. */
-# define __LDBL_REDIR2_DECL(name) \
- extern __typeof (__##name) __##name \
- __asm (__ASMNAME ("__" #name "ieee128"));
-
-/* Alias name defined manually. */
-# define __LDBL_REDIR1(name, proto, alias) ... unused__ldbl_redir1
-# define __LDBL_REDIR1_DECL(name, alias) \
- extern __typeof (name) name __asm (__ASMNAME (#alias));
-
-# define __LDBL_REDIR1_NTH(name, proto, alias) \
- __REDIRECT_NTH (name, proto, alias)
-# define __REDIRECT_NTH_LDBL(name, proto, alias) \
- __LDBL_REDIR1_NTH (name, proto, __##alias##ieee128)
-
-/* Unused. */
-# define __REDIRECT_LDBL(name, proto, alias) ... unused__redirect_ldbl
-# define __LDBL_REDIR_NTH(name, proto) ... unused__ldbl_redir_nth
-
-# else
-_Static_assert (0, "IEEE 128-bits long double requires redirection on this platform");
-# endif
-#elif defined __LONG_DOUBLE_MATH_OPTIONAL && defined __NO_LONG_DOUBLE_MATH
-# define __LDBL_COMPAT 1
-# ifdef __REDIRECT
-# define __LDBL_REDIR1(name, proto, alias) __REDIRECT (name, proto, alias)
-# define __LDBL_REDIR(name, proto) \
- __LDBL_REDIR1 (name, proto, __nldbl_##name)
-# define __LDBL_REDIR1_NTH(name, proto, alias) __REDIRECT_NTH (name, proto, alias)
-# define __LDBL_REDIR_NTH(name, proto) \
- __LDBL_REDIR1_NTH (name, proto, __nldbl_##name)
-# define __LDBL_REDIR2_DECL(name) \
- extern __typeof (__##name) __##name __asm (__ASMNAME ("__nldbl___" #name));
-# define __LDBL_REDIR1_DECL(name, alias) \
- extern __typeof (name) name __asm (__ASMNAME (#alias));
-# define __LDBL_REDIR_DECL(name) \
- extern __typeof (name) name __asm (__ASMNAME ("__nldbl_" #name));
-# define __REDIRECT_LDBL(name, proto, alias) \
- __LDBL_REDIR1 (name, proto, __nldbl_##alias)
-# define __REDIRECT_NTH_LDBL(name, proto, alias) \
- __LDBL_REDIR1_NTH (name, proto, __nldbl_##alias)
-# endif
-#endif
-#if (!defined __LDBL_COMPAT && __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 0) \
- || !defined __REDIRECT
-# define __LDBL_REDIR1(name, proto, alias) name proto
-# define __LDBL_REDIR(name, proto) name proto
-# define __LDBL_REDIR1_NTH(name, proto, alias) name proto __THROW
-# define __LDBL_REDIR_NTH(name, proto) name proto __THROW
-# define __LDBL_REDIR2_DECL(name)
-# define __LDBL_REDIR_DECL(name)
-# ifdef __REDIRECT
-# define __REDIRECT_LDBL(name, proto, alias) __REDIRECT (name, proto, alias)
-# define __REDIRECT_NTH_LDBL(name, proto, alias) \
- __REDIRECT_NTH (name, proto, alias)
-# endif
-#endif
-
-/* __glibc_macro_warning (MESSAGE) issues warning MESSAGE. This is
- intended for use in preprocessor macros.
-
- Note: MESSAGE must be a _single_ string; concatenation of string
- literals is not supported. */
-#if __GNUC_PREREQ (4,8) || __glibc_clang_prereq (3,5)
-# define __glibc_macro_warning1(message) _Pragma (#message)
-# define __glibc_macro_warning(message) \
- __glibc_macro_warning1 (GCC warning message)
-#else
-# define __glibc_macro_warning(msg)
-#endif
-
-/* Generic selection (ISO C11) is a C-only feature, available in GCC
- since version 4.9. Previous versions do not provide generic
- selection, even though they might set __STDC_VERSION__ to 201112L,
- when in -std=c11 mode. Thus, we must check for !defined __GNUC__
- when testing __STDC_VERSION__ for generic selection support.
- On the other hand, Clang also defines __GNUC__, so a clang-specific
- check is required to enable the use of generic selection. */
-#if !defined __cplusplus \
- && (__GNUC_PREREQ (4, 9) \
- || __glibc_has_extension (c_generic_selections) \
- || (!defined __GNUC__ && defined __STDC_VERSION__ \
- && __STDC_VERSION__ >= 201112L))
-# define __HAVE_GENERIC_SELECTION 1
-#else
-# define __HAVE_GENERIC_SELECTION 0
-#endif
-
-#if __GNUC_PREREQ (10, 0)
-/* Designates a 1-based positional argument ref-index of pointer type
- that can be used to access size-index elements of the pointed-to
- array according to access mode, or at least one element when
- size-index is not provided:
- access (access-mode, <ref-index> [, <size-index>]) */
-# define __attr_access(x) __attribute__ ((__access__ x))
-/* For _FORTIFY_SOURCE == 3 we use __builtin_dynamic_object_size, which may
- use the access attribute to get object sizes from function definition
- arguments, so we can't use them on functions we fortify. Drop the object
- size hints for such functions. */
-# if __USE_FORTIFY_LEVEL == 3
-# define __fortified_attr_access(a, o, s) __attribute__ ((__access__ (a, o)))
-# else
-# define __fortified_attr_access(a, o, s) __attr_access ((a, o, s))
-# endif
-# if __GNUC_PREREQ (11, 0)
-# define __attr_access_none(argno) __attribute__ ((__access__ (__none__, argno)))
-# else
-# define __attr_access_none(argno)
-# endif
-#else
-# define __fortified_attr_access(a, o, s)
-# define __attr_access(x)
-# define __attr_access_none(argno)
-#endif
-
-#if __GNUC_PREREQ (11, 0)
-/* Designates dealloc as a function to call to deallocate objects
- allocated by the declared function. */
-# define __attr_dealloc(dealloc, argno) \
- __attribute__ ((__malloc__ (dealloc, argno)))
-# define __attr_dealloc_free __attr_dealloc (__builtin_free, 1)
-#else
-# define __attr_dealloc(dealloc, argno)
-# define __attr_dealloc_free
-#endif
-
-/* Specify that a function such as setjmp or vfork may return
- twice. */
-#if __GNUC_PREREQ (4, 1)
-# define __attribute_returns_twice__ __attribute__ ((__returns_twice__))
-#else
-# define __attribute_returns_twice__ /* Ignore. */
-#endif
-
-#endif /* sys/cdefs.h */
diff --git a/cross/lib/cloexec.c b/cross/lib/cloexec.c
deleted file mode 100644
index e4cecbd2e8a..00000000000
--- a/cross/lib/cloexec.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/* cloexec.c - set or clear the close-on-exec descriptor flag
-
- Copyright (C) 1991, 2004-2006, 2009-2023 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/>. */
-
-/* The code is taken from glibc/manual/llio.texi */
-
-#include <config.h>
-
-#include "cloexec.h"
-
-#include <errno.h>
-#include <fcntl.h>
-#include <unistd.h>
-
-/* Set the 'FD_CLOEXEC' flag of DESC if VALUE is true,
- or clear the flag if VALUE is false.
- Return 0 on success, or -1 on error with 'errno' set.
-
- Note that on MingW, this function does NOT protect DESC from being
- inherited into spawned children. Instead, either use dup_cloexec
- followed by closing the original DESC, or use interfaces such as
- open or pipe2 that accept flags like O_CLOEXEC to create DESC
- non-inheritable in the first place. */
-
-int
-set_cloexec_flag (int desc, bool value)
-{
-#ifdef F_SETFD
-
- int flags = fcntl (desc, F_GETFD, 0);
-
- if (0 <= flags)
- {
- int newflags = (value ? flags | FD_CLOEXEC : flags & ~FD_CLOEXEC);
-
- if (flags == newflags
- || fcntl (desc, F_SETFD, newflags) != -1)
- return 0;
- }
-
- return -1;
-
-#else /* !F_SETFD */
-
- /* Use dup2 to reject invalid file descriptors; the cloexec flag
- will be unaffected. */
- if (desc < 0)
- {
- errno = EBADF;
- return -1;
- }
- if (dup2 (desc, desc) < 0)
- /* errno is EBADF here. */
- return -1;
-
- /* There is nothing we can do on this kind of platform. Punt. */
- return 0;
-#endif /* !F_SETFD */
-}
-
-
-/* Duplicates a file handle FD, while marking the copy to be closed
- prior to exec or spawn. Returns -1 and sets errno if FD could not
- be duplicated. */
-
-int
-dup_cloexec (int fd)
-{
- return fcntl (fd, F_DUPFD_CLOEXEC, 0);
-}
diff --git a/cross/lib/cloexec.h b/cross/lib/cloexec.h
deleted file mode 100644
index 057fd668c9b..00000000000
--- a/cross/lib/cloexec.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* cloexec.c - set or clear the close-on-exec descriptor flag
-
- Copyright (C) 2004, 2009-2023 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/>. */
-
-/* Set the 'FD_CLOEXEC' flag of DESC if VALUE is true,
- or clear the flag if VALUE is false.
- Return 0 on success, or -1 on error with 'errno' set.
-
- Note that on MingW, this function does NOT protect DESC from being
- inherited into spawned children. Instead, either use dup_cloexec
- followed by closing the original DESC, or use interfaces such as
- open or pipe2 that accept flags like O_CLOEXEC to create DESC
- non-inheritable in the first place. */
-
-int set_cloexec_flag (int desc, bool value);
-
-/* Duplicates a file handle FD, while marking the copy to be closed
- prior to exec or spawn. Returns -1 and sets errno if FD could not
- be duplicated. */
-
-int dup_cloexec (int fd);
diff --git a/cross/lib/close-stream.c b/cross/lib/close-stream.c
deleted file mode 100644
index ab686bac2ae..00000000000
--- a/cross/lib/close-stream.c
+++ /dev/null
@@ -1,77 +0,0 @@
-/* Close a stream, with nicer error checking than fclose's.
-
- Copyright (C) 1998-2002, 2004, 2006-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-#include "close-stream.h"
-
-#include <errno.h>
-
-#include "fpending.h"
-
-#if USE_UNLOCKED_IO
-# include "unlocked-io.h"
-#endif
-
-/* Close STREAM. Return 0 if successful, EOF (setting errno)
- otherwise. A failure might set errno to 0 if the error number
- cannot be determined.
-
- A failure with errno set to EPIPE may or may not indicate an error
- situation worth signaling to the user. See the documentation of the
- close_stdout_set_ignore_EPIPE function for details.
-
- If a program writes *anything* to STREAM, that program should close
- STREAM and make sure that it succeeds before exiting. Otherwise,
- suppose that you go to the extreme of checking the return status
- of every function that does an explicit write to STREAM. The last
- printf can succeed in writing to the internal stream buffer, and yet
- the fclose(STREAM) could still fail (due e.g., to a disk full error)
- when it tries to write out that buffered data. Thus, you would be
- left with an incomplete output file and the offending program would
- exit successfully. Even calling fflush is not always sufficient,
- since some file systems (NFS and CODA) buffer written/flushed data
- until an actual close call.
-
- Besides, it's wasteful to check the return value from every call
- that writes to STREAM -- just let the internal stream state record
- the failure. That's what the ferror test is checking below. */
-
-int
-close_stream (FILE *stream)
-{
- const bool some_pending = (__fpending (stream) != 0);
- const bool prev_fail = (ferror (stream) != 0);
- const bool fclose_fail = (fclose (stream) != 0);
-
- /* Return an error indication if there was a previous failure or if
- fclose failed, with one exception: ignore an fclose failure if
- there was no previous error, no data remains to be flushed, and
- fclose failed with EBADF. That can happen when a program like cp
- is invoked like this 'cp a b >&-' (i.e., with standard output
- closed) and doesn't generate any output (hence no previous error
- and nothing to be flushed). */
-
- if (prev_fail || (fclose_fail && (some_pending || errno != EBADF)))
- {
- if (! fclose_fail)
- errno = 0;
- return EOF;
- }
-
- return 0;
-}
diff --git a/cross/lib/close-stream.h b/cross/lib/close-stream.h
deleted file mode 100644
index 3b52cc66c3d..00000000000
--- a/cross/lib/close-stream.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Close a stream, with nicer error checking than fclose's.
-
- Copyright (C) 2006-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <stdio.h>
-
-int close_stream (FILE *stream);
diff --git a/cross/lib/copy-file-range.c b/cross/lib/copy-file-range.c
deleted file mode 100644
index 747a5a8ad1d..00000000000
--- a/cross/lib/copy-file-range.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/* Stub for copy_file_range
- Copyright 2019-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-#include <unistd.h>
-
-#include <errno.h>
-
-#if defined __linux__ && HAVE_COPY_FILE_RANGE
-# include <sys/utsname.h>
-#endif
-
-ssize_t
-copy_file_range (int infd, off_t *pinoff,
- int outfd, off_t *poutoff,
- size_t length, unsigned int flags)
-{
-#undef copy_file_range
-
-#if defined __linux__ && HAVE_COPY_FILE_RANGE
- /* The implementation of copy_file_range (which first appeared in
- Linux kernel release 4.5) had many issues before release 5.3
- <https://lwn.net/Articles/789527/>, so fail with ENOSYS for Linux
- kernels 5.2 and earlier.
-
- This workaround, and the configure-time check for Linux, can be
- removed when such kernels (released March 2016 through September
- 2019) are no longer a consideration. As of January 2021, the
- furthest-future planned kernel EOL is December 2024 for kernel
- release 4.19. */
-
- static signed char ok;
-
- if (! ok)
- {
- struct utsname name;
- uname (&name);
- char *p = name.release;
- ok = ((p[1] != '.' || '5' < p[0]
- || (p[0] == '5' && (p[3] != '.' || '2' < p[2])))
- ? 1 : -1);
- }
-
- if (0 < ok)
- return copy_file_range (infd, pinoff, outfd, poutoff, length, flags);
-#endif
-
- /* There is little need to emulate copy_file_range with read+write,
- since programs that use copy_file_range must fall back on
- read+write anyway. */
- errno = ENOSYS;
- return -1;
-}
diff --git a/cross/lib/count-leading-zeros.c b/cross/lib/count-leading-zeros.c
deleted file mode 100644
index 949f156eab1..00000000000
--- a/cross/lib/count-leading-zeros.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Count the number of leading 0 bits in a word.
-
- Copyright (C) 2012-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-#define COUNT_LEADING_ZEROS_INLINE _GL_EXTERN_INLINE
-#include "count-leading-zeros.h"
diff --git a/cross/lib/count-leading-zeros.h b/cross/lib/count-leading-zeros.h
deleted file mode 100644
index 99151d695bf..00000000000
--- a/cross/lib/count-leading-zeros.h
+++ /dev/null
@@ -1,136 +0,0 @@
-/* count-leading-zeros.h -- counts the number of leading 0 bits in a word.
- Copyright (C) 2012-2023 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. */
-
-#ifndef COUNT_LEADING_ZEROS_H
-#define COUNT_LEADING_ZEROS_H 1
-
-#include <limits.h>
-#include <stdlib.h>
-
-#ifndef _GL_INLINE_HEADER_BEGIN
- #error "Please include config.h first."
-#endif
-_GL_INLINE_HEADER_BEGIN
-#ifndef COUNT_LEADING_ZEROS_INLINE
-# define COUNT_LEADING_ZEROS_INLINE _GL_INLINE
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Assuming the GCC builtin is BUILTIN and the MSC builtin is MSC_BUILTIN,
- expand to code that computes the number of leading zeros of the local
- variable 'x' of type TYPE (an unsigned integer type) and return it
- from the current function. */
-#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) \
- || (__clang_major__ >= 4)
-# define COUNT_LEADING_ZEROS(BUILTIN, MSC_BUILTIN, TYPE) \
- return x ? BUILTIN (x) : CHAR_BIT * sizeof x;
-#elif _MSC_VER
-# pragma intrinsic (_BitScanReverse)
-# if defined _M_X64
-# pragma intrinsic (_BitScanReverse64)
-# endif
-# define COUNT_LEADING_ZEROS(BUILTIN, MSC_BUILTIN, TYPE) \
- do \
- { \
- unsigned long result; \
- if (MSC_BUILTIN (&result, x)) \
- return CHAR_BIT * sizeof x - 1 - result; \
- return CHAR_BIT * sizeof x; \
- } \
- while (0)
-#else
-# define COUNT_LEADING_ZEROS(BUILTIN, MSC_BUILTIN, TYPE) \
- do \
- { \
- int count; \
- unsigned int leading_32; \
- if (! x) \
- return CHAR_BIT * sizeof x; \
- for (count = 0; \
- (leading_32 = ((x >> (sizeof (TYPE) * CHAR_BIT - 32)) \
- & 0xffffffffU), \
- count < CHAR_BIT * sizeof x - 32 && !leading_32); \
- count += 32) \
- x = x << 31 << 1; \
- return count + count_leading_zeros_32 (leading_32); \
- } \
- while (0)
-
-/* Compute and return the number of leading zeros in X,
- where 0 < X < 2**32. */
-COUNT_LEADING_ZEROS_INLINE int
-count_leading_zeros_32 (unsigned int x)
-{
- /* <https://github.com/gibsjose/BitHacks>
- <https://www.fit.vutbr.cz/~ibarina/pub/bithacks.pdf> */
- static const char de_Bruijn_lookup[32] = {
- 31, 22, 30, 21, 18, 10, 29, 2, 20, 17, 15, 13, 9, 6, 28, 1,
- 23, 19, 11, 3, 16, 14, 7, 24, 12, 4, 8, 25, 5, 26, 27, 0
- };
-
- x |= x >> 1;
- x |= x >> 2;
- x |= x >> 4;
- x |= x >> 8;
- x |= x >> 16;
- return de_Bruijn_lookup[((x * 0x07c4acddU) & 0xffffffffU) >> 27];
-}
-#endif
-
-/* Compute and return the number of leading zeros in X. */
-COUNT_LEADING_ZEROS_INLINE int
-count_leading_zeros (unsigned int x)
-{
- COUNT_LEADING_ZEROS (__builtin_clz, _BitScanReverse, unsigned int);
-}
-
-/* Compute and return the number of leading zeros in X. */
-COUNT_LEADING_ZEROS_INLINE int
-count_leading_zeros_l (unsigned long int x)
-{
- COUNT_LEADING_ZEROS (__builtin_clzl, _BitScanReverse, unsigned long int);
-}
-
-/* Compute and return the number of leading zeros in X. */
-COUNT_LEADING_ZEROS_INLINE int
-count_leading_zeros_ll (unsigned long long int x)
-{
-#if (defined _MSC_VER && !defined __clang__) && !defined _M_X64
- /* 32-bit MSVC does not have _BitScanReverse64, only _BitScanReverse. */
- unsigned long result;
- if (_BitScanReverse (&result, (unsigned long) (x >> 32)))
- return CHAR_BIT * sizeof x - 1 - 32 - result;
- if (_BitScanReverse (&result, (unsigned long) x))
- return CHAR_BIT * sizeof x - 1 - result;
- return CHAR_BIT * sizeof x;
-#else
- COUNT_LEADING_ZEROS (__builtin_clzll, _BitScanReverse64,
- unsigned long long int);
-#endif
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-_GL_INLINE_HEADER_END
-
-#endif /* COUNT_LEADING_ZEROS_H */
diff --git a/cross/lib/count-one-bits.c b/cross/lib/count-one-bits.c
deleted file mode 100644
index 8a348f2e5a0..00000000000
--- a/cross/lib/count-one-bits.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Count the number of 1-bits in a word.
-
- Copyright (C) 2012-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-#define COUNT_ONE_BITS_INLINE _GL_EXTERN_INLINE
-#include "count-one-bits.h"
-
-#if 1500 <= _MSC_VER && (defined _M_IX86 || defined _M_X64)
-int popcount_support = -1;
-#endif
diff --git a/cross/lib/count-one-bits.h b/cross/lib/count-one-bits.h
deleted file mode 100644
index 01a60b77b85..00000000000
--- a/cross/lib/count-one-bits.h
+++ /dev/null
@@ -1,164 +0,0 @@
-/* count-one-bits.h -- counts the number of 1-bits in a word.
- Copyright (C) 2007-2023 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 Ben Pfaff. */
-
-#ifndef COUNT_ONE_BITS_H
-#define COUNT_ONE_BITS_H 1
-
-#include <limits.h>
-#include <stdlib.h>
-
-#ifndef _GL_INLINE_HEADER_BEGIN
- #error "Please include config.h first."
-#endif
-_GL_INLINE_HEADER_BEGIN
-#ifndef COUNT_ONE_BITS_INLINE
-# define COUNT_ONE_BITS_INLINE _GL_INLINE
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Assuming the GCC builtin is GCC_BUILTIN and the MSC builtin is MSC_BUILTIN,
- expand to code that computes the number of 1-bits of the local
- variable 'x' of type TYPE (an unsigned integer type) and return it
- from the current function. */
-#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) \
- || (__clang_major__ >= 4)
-# define COUNT_ONE_BITS(GCC_BUILTIN, MSC_BUILTIN, TYPE) \
- return GCC_BUILTIN (x)
-#else
-
-/* Compute and return the number of 1-bits set in the least
- significant 32 bits of X. */
-COUNT_ONE_BITS_INLINE int
-count_one_bits_32 (unsigned int x)
-{
- x = ((x & 0xaaaaaaaaU) >> 1) + (x & 0x55555555U);
- x = ((x & 0xccccccccU) >> 2) + (x & 0x33333333U);
- x = (x >> 16) + (x & 0xffff);
- x = ((x & 0xf0f0) >> 4) + (x & 0x0f0f);
- return (x >> 8) + (x & 0x00ff);
-}
-
-/* Expand to code that computes the number of 1-bits of the local
- variable 'x' of type TYPE (an unsigned integer type) and return it
- from the current function. */
-# define COUNT_ONE_BITS_GENERIC(TYPE) \
- do \
- { \
- int count = 0; \
- int bits; \
- for (bits = 0; bits < sizeof (TYPE) * CHAR_BIT; bits += 32) \
- { \
- count += count_one_bits_32 (x); \
- x = x >> 31 >> 1; \
- } \
- return count; \
- } \
- while (0)
-
-# if 1500 <= _MSC_VER && (defined _M_IX86 || defined _M_X64)
-
-/* While gcc falls back to its own generic code if the machine
- on which it's running doesn't support popcount, with Microsoft's
- compiler we need to detect and fallback ourselves. */
-
-# if 0
-# include <intrin.h>
-# else
- /* Don't pollute the namespace with too many MSVC intrinsics. */
-# pragma intrinsic (__cpuid)
-# pragma intrinsic (__popcnt)
-# if defined _M_X64
-# pragma intrinsic (__popcnt64)
-# endif
-# endif
-
-# if !defined _M_X64
-static inline __popcnt64 (unsigned long long x)
-{
- return __popcnt ((unsigned int) (x >> 32)) + __popcnt ((unsigned int) x);
-}
-# endif
-
-/* Return nonzero if popcount is supported. */
-
-/* 1 if supported, 0 if not supported, -1 if unknown. */
-extern int popcount_support;
-
-COUNT_ONE_BITS_INLINE int
-popcount_supported (void)
-{
- if (popcount_support < 0)
- {
- /* Do as described in
- <https://docs.microsoft.com/en-us/cpp/intrinsics/popcnt16-popcnt-popcnt64> */
- int cpu_info[4];
- __cpuid (cpu_info, 1);
- popcount_support = (cpu_info[2] >> 23) & 1;
- }
- return popcount_support;
-}
-
-# define COUNT_ONE_BITS(GCC_BUILTIN, MSC_BUILTIN, TYPE) \
- do \
- { \
- if (popcount_supported ()) \
- return MSC_BUILTIN (x); \
- else \
- COUNT_ONE_BITS_GENERIC (TYPE); \
- } \
- while (0)
-
-# else
-
-# define COUNT_ONE_BITS(GCC_BUILTIN, MSC_BUILTIN, TYPE) \
- COUNT_ONE_BITS_GENERIC (TYPE)
-
-# endif
-#endif
-
-/* Compute and return the number of 1-bits set in X. */
-COUNT_ONE_BITS_INLINE int
-count_one_bits (unsigned int x)
-{
- COUNT_ONE_BITS (__builtin_popcount, __popcnt, unsigned int);
-}
-
-/* Compute and return the number of 1-bits set in X. */
-COUNT_ONE_BITS_INLINE int
-count_one_bits_l (unsigned long int x)
-{
- COUNT_ONE_BITS (__builtin_popcountl, __popcnt, unsigned long int);
-}
-
-/* Compute and return the number of 1-bits set in X. */
-COUNT_ONE_BITS_INLINE int
-count_one_bits_ll (unsigned long long int x)
-{
- COUNT_ONE_BITS (__builtin_popcountll, __popcnt64, unsigned long long int);
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-_GL_INLINE_HEADER_END
-
-#endif /* COUNT_ONE_BITS_H */
diff --git a/cross/lib/count-trailing-zeros.c b/cross/lib/count-trailing-zeros.c
deleted file mode 100644
index f6fddab4232..00000000000
--- a/cross/lib/count-trailing-zeros.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Count the number of trailing 0 bits in a word.
-
- Copyright 2013-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-#define COUNT_TRAILING_ZEROS_INLINE _GL_EXTERN_INLINE
-#include "count-trailing-zeros.h"
diff --git a/cross/lib/count-trailing-zeros.h b/cross/lib/count-trailing-zeros.h
deleted file mode 100644
index ef8e164126a..00000000000
--- a/cross/lib/count-trailing-zeros.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/* count-trailing-zeros.h -- counts the number of trailing 0 bits in a word.
- Copyright 2013-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert. */
-
-#ifndef COUNT_TRAILING_ZEROS_H
-#define COUNT_TRAILING_ZEROS_H 1
-
-#include <limits.h>
-#include <stdlib.h>
-
-#ifndef _GL_INLINE_HEADER_BEGIN
- #error "Please include config.h first."
-#endif
-_GL_INLINE_HEADER_BEGIN
-#ifndef COUNT_TRAILING_ZEROS_INLINE
-# define COUNT_TRAILING_ZEROS_INLINE _GL_INLINE
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Assuming the GCC builtin is BUILTIN and the MSC builtin is MSC_BUILTIN,
- expand to code that computes the number of trailing zeros of the local
- variable 'x' of type TYPE (an unsigned integer type) and return it
- from the current function. */
-#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) \
- || (__clang_major__ >= 4)
-# define COUNT_TRAILING_ZEROS(BUILTIN, MSC_BUILTIN, TYPE) \
- return x ? BUILTIN (x) : CHAR_BIT * sizeof x;
-#elif _MSC_VER
-# pragma intrinsic (_BitScanForward)
-# if defined _M_X64
-# pragma intrinsic (_BitScanForward64)
-# endif
-# define COUNT_TRAILING_ZEROS(BUILTIN, MSC_BUILTIN, TYPE) \
- do \
- { \
- unsigned long result; \
- return MSC_BUILTIN (&result, x) ? result : CHAR_BIT * sizeof x; \
- } \
- while (0)
-#else
-# define COUNT_TRAILING_ZEROS(BUILTIN, MSC_BUILTIN, TYPE) \
- do \
- { \
- int count = 0; \
- if (! x) \
- return CHAR_BIT * sizeof x; \
- for (count = 0; \
- (count < CHAR_BIT * sizeof x - 32 \
- && ! (x & 0xffffffffU)); \
- count += 32) \
- x = x >> 31 >> 1; \
- return count + count_trailing_zeros_32 (x); \
- } \
- while (0)
-
-/* Compute and return the number of trailing zeros in the least
- significant 32 bits of X. One of these bits must be nonzero. */
-COUNT_TRAILING_ZEROS_INLINE int
-count_trailing_zeros_32 (unsigned int x)
-{
- /* <https://github.com/gibsjose/BitHacks>
- <https://www.fit.vutbr.cz/~ibarina/pub/bithacks.pdf> */
- static const char de_Bruijn_lookup[32] = {
- 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8,
- 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9
- };
- return de_Bruijn_lookup[(((x & -x) * 0x077cb531U) & 0xffffffffU) >> 27];
-}
-#endif
-
-/* Compute and return the number of trailing zeros in X. */
-COUNT_TRAILING_ZEROS_INLINE int
-count_trailing_zeros (unsigned int x)
-{
- COUNT_TRAILING_ZEROS (__builtin_ctz, _BitScanForward, unsigned int);
-}
-
-/* Compute and return the number of trailing zeros in X. */
-COUNT_TRAILING_ZEROS_INLINE int
-count_trailing_zeros_l (unsigned long int x)
-{
- COUNT_TRAILING_ZEROS (__builtin_ctzl, _BitScanForward, unsigned long int);
-}
-
-/* Compute and return the number of trailing zeros in X. */
-COUNT_TRAILING_ZEROS_INLINE int
-count_trailing_zeros_ll (unsigned long long int x)
-{
-#if (defined _MSC_VER && !defined __clang__) && !defined _M_X64
- /* 32-bit MSVC does not have _BitScanForward64, only _BitScanForward. */
- unsigned long result;
- if (_BitScanForward (&result, (unsigned long) x))
- return result;
- if (_BitScanForward (&result, (unsigned long) (x >> 32)))
- return result + 32;
- return CHAR_BIT * sizeof x;
-#else
- COUNT_TRAILING_ZEROS (__builtin_ctzll, _BitScanForward64,
- unsigned long long int);
-#endif
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-_GL_INLINE_HEADER_END
-
-#endif
diff --git a/cross/lib/diffseq.h b/cross/lib/diffseq.h
deleted file mode 100644
index dfaf4f295e8..00000000000
--- a/cross/lib/diffseq.h
+++ /dev/null
@@ -1,568 +0,0 @@
-/* Analyze differences between two vectors.
-
- Copyright (C) 1988-1989, 1992-1995, 2001-2004, 2006-2023 Free Software
- Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-
-/* The basic idea is to consider two vectors as similar if, when
- transforming the first vector into the second vector through a
- sequence of edits (inserts and deletes of one element each),
- this sequence is short - or equivalently, if the ordered list
- of elements that are untouched by these edits is long. For a
- good introduction to the subject, read about the "Levenshtein
- distance" in Wikipedia.
-
- The basic algorithm is described in:
- "An O(ND) Difference Algorithm and its Variations", Eugene W. Myers,
- Algorithmica Vol. 1, 1986, pp. 251-266,
- <https://doi.org/10.1007/BF01840446>.
- See especially section 4.2, which describes the variation used below.
-
- The basic algorithm was independently discovered as described in:
- "Algorithms for Approximate String Matching", Esko Ukkonen,
- Information and Control Vol. 64, 1985, pp. 100-118,
- <https://doi.org/10.1016/S0019-9958(85)80046-2>.
-
- Unless the 'find_minimal' flag is set, this code uses the TOO_EXPENSIVE
- heuristic, by Paul Eggert, to limit the cost to O(N**1.5 log N)
- at the price of producing suboptimal output for large inputs with
- many differences. */
-
-/* Before including this file, you need to define:
- ELEMENT The element type of the vectors being compared.
- EQUAL A two-argument macro that tests two elements for
- equality.
- OFFSET A signed integer type sufficient to hold the
- difference between two indices. Usually
- something like ptrdiff_t.
- EXTRA_CONTEXT_FIELDS Declarations of fields for 'struct context'.
- NOTE_DELETE(ctxt, xoff) Record the removal of the object xvec[xoff].
- NOTE_INSERT(ctxt, yoff) Record the insertion of the object yvec[yoff].
- NOTE_ORDERED (Optional) A boolean expression saying that
- NOTE_DELETE and NOTE_INSERT calls must be
- issued in offset order.
- EARLY_ABORT(ctxt) (Optional) A boolean expression that triggers an
- early abort of the computation.
- USE_HEURISTIC (Optional) Define if you want to support the
- heuristic for large vectors.
-
- It is also possible to use this file with abstract arrays. In this case,
- xvec and yvec are not represented in memory. They only exist conceptually.
- In this case, the list of defines above is amended as follows:
- ELEMENT Undefined.
- EQUAL Undefined.
- XVECREF_YVECREF_EQUAL(ctxt, xoff, yoff)
- A three-argument macro: References xvec[xoff] and
- yvec[yoff] and tests these elements for equality.
-
- Before including this file, you also need to include:
- #include <limits.h>
- #include "minmax.h"
- */
-
-/* Maximum value of type OFFSET. */
-#define OFFSET_MAX \
- ((((OFFSET)1 << (sizeof (OFFSET) * CHAR_BIT - 2)) - 1) * 2 + 1)
-
-/* Default to no early abort. */
-#ifndef EARLY_ABORT
-# define EARLY_ABORT(ctxt) false
-#endif
-
-#ifndef NOTE_ORDERED
-# define NOTE_ORDERED false
-#endif
-
-/* Use this to suppress gcc's "...may be used before initialized" warnings.
- Beware: The Code argument must not contain commas. */
-#ifndef IF_LINT
-# if defined GCC_LINT || defined lint
-# define IF_LINT(Code) Code
-# else
-# define IF_LINT(Code) /* empty */
-# endif
-#endif
-
-/*
- * Context of comparison operation.
- */
-struct context
-{
- #ifdef ELEMENT
- /* Vectors being compared. */
- ELEMENT const *xvec;
- ELEMENT const *yvec;
- #endif
-
- /* Extra fields. */
- EXTRA_CONTEXT_FIELDS
-
- /* Vector, indexed by diagonal, containing 1 + the X coordinate of the point
- furthest along the given diagonal in the forward search of the edit
- matrix. */
- OFFSET *fdiag;
-
- /* Vector, indexed by diagonal, containing the X coordinate of the point
- furthest along the given diagonal in the backward search of the edit
- matrix. */
- OFFSET *bdiag;
-
- #ifdef USE_HEURISTIC
- /* This corresponds to the diff --speed-large-files flag. With this
- heuristic, for vectors with a constant small density of changes,
- the algorithm is linear in the vector size. */
- bool heuristic;
- #endif
-
- /* Edit scripts longer than this are too expensive to compute. */
- OFFSET too_expensive;
-
- /* Snakes bigger than this are considered "big". */
- #define SNAKE_LIMIT 20
-};
-
-struct partition
-{
- /* Midpoints of this partition. */
- OFFSET xmid;
- OFFSET ymid;
-
- /* True if low half will be analyzed minimally. */
- bool lo_minimal;
-
- /* Likewise for high half. */
- bool hi_minimal;
-};
-
-
-/* Find the midpoint of the shortest edit script for a specified portion
- of the two vectors.
-
- Scan from the beginnings of the vectors, and simultaneously from the ends,
- doing a breadth-first search through the space of edit-sequence.
- When the two searches meet, we have found the midpoint of the shortest
- edit sequence.
-
- If FIND_MINIMAL is true, find the minimal edit script regardless of
- expense. Otherwise, if the search is too expensive, use heuristics to
- stop the search and report a suboptimal answer.
-
- Set PART->(xmid,ymid) to the midpoint (XMID,YMID). The diagonal number
- XMID - YMID equals the number of inserted elements minus the number
- of deleted elements (counting only elements before the midpoint).
-
- Set PART->lo_minimal to true iff the minimal edit script for the
- left half of the partition is known; similarly for PART->hi_minimal.
-
- This function assumes that the first elements of the specified portions
- of the two vectors do not match, and likewise that the last elements do not
- match. The caller must trim matching elements from the beginning and end
- of the portions it is going to specify.
-
- If we return the "wrong" partitions, the worst this can do is cause
- suboptimal diff output. It cannot cause incorrect diff output. */
-
-static void
-diag (OFFSET xoff, OFFSET xlim, OFFSET yoff, OFFSET ylim, bool find_minimal,
- struct partition *part, struct context *ctxt)
-{
- OFFSET *const fd = ctxt->fdiag; /* Give the compiler a chance. */
- OFFSET *const bd = ctxt->bdiag; /* Additional help for the compiler. */
-#ifdef ELEMENT
- ELEMENT const *const xv = ctxt->xvec; /* Still more help for the compiler. */
- ELEMENT const *const yv = ctxt->yvec; /* And more and more . . . */
- #define XREF_YREF_EQUAL(x,y) EQUAL (xv[x], yv[y])
-#else
- #define XREF_YREF_EQUAL(x,y) XVECREF_YVECREF_EQUAL (ctxt, x, y)
-#endif
- const OFFSET dmin = xoff - ylim; /* Minimum valid diagonal. */
- const OFFSET dmax = xlim - yoff; /* Maximum valid diagonal. */
- const OFFSET fmid = xoff - yoff; /* Center diagonal of top-down search. */
- const OFFSET bmid = xlim - ylim; /* Center diagonal of bottom-up search. */
- OFFSET fmin = fmid;
- OFFSET fmax = fmid; /* Limits of top-down search. */
- OFFSET bmin = bmid;
- OFFSET bmax = bmid; /* Limits of bottom-up search. */
- OFFSET c; /* Cost. */
- bool odd = (fmid - bmid) & 1; /* True if southeast corner is on an odd
- diagonal with respect to the northwest. */
-
- fd[fmid] = xoff;
- bd[bmid] = xlim;
-
- for (c = 1;; ++c)
- {
- OFFSET d; /* Active diagonal. */
- bool big_snake = false;
-
- /* Extend the top-down search by an edit step in each diagonal. */
- if (fmin > dmin)
- fd[--fmin - 1] = -1;
- else
- ++fmin;
- if (fmax < dmax)
- fd[++fmax + 1] = -1;
- else
- --fmax;
- for (d = fmax; d >= fmin; d -= 2)
- {
- OFFSET x;
- OFFSET y;
- OFFSET tlo = fd[d - 1];
- OFFSET thi = fd[d + 1];
- OFFSET x0 = tlo < thi ? thi : tlo + 1;
-
- for (x = x0, y = x0 - d;
- x < xlim && y < ylim && XREF_YREF_EQUAL (x, y);
- x++, y++)
- continue;
- if (x - x0 > SNAKE_LIMIT)
- big_snake = true;
- fd[d] = x;
- if (odd && bmin <= d && d <= bmax && bd[d] <= x)
- {
- part->xmid = x;
- part->ymid = y;
- part->lo_minimal = part->hi_minimal = true;
- return;
- }
- }
-
- /* Similarly extend the bottom-up search. */
- if (bmin > dmin)
- bd[--bmin - 1] = OFFSET_MAX;
- else
- ++bmin;
- if (bmax < dmax)
- bd[++bmax + 1] = OFFSET_MAX;
- else
- --bmax;
- for (d = bmax; d >= bmin; d -= 2)
- {
- OFFSET x;
- OFFSET y;
- OFFSET tlo = bd[d - 1];
- OFFSET thi = bd[d + 1];
- OFFSET x0 = tlo < thi ? tlo : thi - 1;
-
- for (x = x0, y = x0 - d;
- xoff < x && yoff < y && XREF_YREF_EQUAL (x - 1, y - 1);
- x--, y--)
- continue;
- if (x0 - x > SNAKE_LIMIT)
- big_snake = true;
- bd[d] = x;
- if (!odd && fmin <= d && d <= fmax && x <= fd[d])
- {
- part->xmid = x;
- part->ymid = y;
- part->lo_minimal = part->hi_minimal = true;
- return;
- }
- }
-
- if (find_minimal)
- continue;
-
-#ifdef USE_HEURISTIC
- bool heuristic = ctxt->heuristic;
-#else
- bool heuristic = false;
-#endif
-
- /* Heuristic: check occasionally for a diagonal that has made lots
- of progress compared with the edit distance. If we have any
- such, find the one that has made the most progress and return it
- as if it had succeeded.
-
- With this heuristic, for vectors with a constant small density
- of changes, the algorithm is linear in the vector size. */
-
- if (200 < c && big_snake && heuristic)
- {
- {
- OFFSET best = 0;
-
- for (d = fmax; d >= fmin; d -= 2)
- {
- OFFSET dd = d - fmid;
- OFFSET x = fd[d];
- OFFSET y = x - d;
- OFFSET v = (x - xoff) * 2 - dd;
-
- if (v > 12 * (c + (dd < 0 ? -dd : dd)))
- {
- if (v > best
- && xoff + SNAKE_LIMIT <= x && x < xlim
- && yoff + SNAKE_LIMIT <= y && y < ylim)
- {
- /* We have a good enough best diagonal; now insist
- that it end with a significant snake. */
- int k;
-
- for (k = 1; XREF_YREF_EQUAL (x - k, y - k); k++)
- if (k == SNAKE_LIMIT)
- {
- best = v;
- part->xmid = x;
- part->ymid = y;
- break;
- }
- }
- }
- }
- if (best > 0)
- {
- part->lo_minimal = true;
- part->hi_minimal = false;
- return;
- }
- }
-
- {
- OFFSET best = 0;
-
- for (d = bmax; d >= bmin; d -= 2)
- {
- OFFSET dd = d - bmid;
- OFFSET x = bd[d];
- OFFSET y = x - d;
- OFFSET v = (xlim - x) * 2 + dd;
-
- if (v > 12 * (c + (dd < 0 ? -dd : dd)))
- {
- if (v > best
- && xoff < x && x <= xlim - SNAKE_LIMIT
- && yoff < y && y <= ylim - SNAKE_LIMIT)
- {
- /* We have a good enough best diagonal; now insist
- that it end with a significant snake. */
- int k;
-
- for (k = 0; XREF_YREF_EQUAL (x + k, y + k); k++)
- if (k == SNAKE_LIMIT - 1)
- {
- best = v;
- part->xmid = x;
- part->ymid = y;
- break;
- }
- }
- }
- }
- if (best > 0)
- {
- part->lo_minimal = false;
- part->hi_minimal = true;
- return;
- }
- }
- }
-
- /* Heuristic: if we've gone well beyond the call of duty, give up
- and report halfway between our best results so far. */
- if (c >= ctxt->too_expensive)
- {
- OFFSET fxybest;
- OFFSET fxbest IF_LINT (= 0);
- OFFSET bxybest;
- OFFSET bxbest IF_LINT (= 0);
-
- /* Find forward diagonal that maximizes X + Y. */
- fxybest = -1;
- for (d = fmax; d >= fmin; d -= 2)
- {
- OFFSET x = MIN (fd[d], xlim);
- OFFSET y = x - d;
- if (ylim < y)
- {
- x = ylim + d;
- y = ylim;
- }
- if (fxybest < x + y)
- {
- fxybest = x + y;
- fxbest = x;
- }
- }
-
- /* Find backward diagonal that minimizes X + Y. */
- bxybest = OFFSET_MAX;
- for (d = bmax; d >= bmin; d -= 2)
- {
- OFFSET x = MAX (xoff, bd[d]);
- OFFSET y = x - d;
- if (y < yoff)
- {
- x = yoff + d;
- y = yoff;
- }
- if (x + y < bxybest)
- {
- bxybest = x + y;
- bxbest = x;
- }
- }
-
- /* Use the better of the two diagonals. */
- if ((xlim + ylim) - bxybest < fxybest - (xoff + yoff))
- {
- part->xmid = fxbest;
- part->ymid = fxybest - fxbest;
- part->lo_minimal = true;
- part->hi_minimal = false;
- }
- else
- {
- part->xmid = bxbest;
- part->ymid = bxybest - bxbest;
- part->lo_minimal = false;
- part->hi_minimal = true;
- }
- return;
- }
- }
- #undef XREF_YREF_EQUAL
-}
-
-
-/* Compare in detail contiguous subsequences of the two vectors
- which are known, as a whole, to match each other.
-
- The subsequence of vector 0 is [XOFF, XLIM) and likewise for vector 1.
-
- Note that XLIM, YLIM are exclusive bounds. All indices into the vectors
- are origin-0.
-
- If FIND_MINIMAL, find a minimal difference no matter how
- expensive it is.
-
- The results are recorded by invoking NOTE_DELETE and NOTE_INSERT.
-
- Return false if terminated normally, or true if terminated through early
- abort. */
-
-static bool
-compareseq (OFFSET xoff, OFFSET xlim, OFFSET yoff, OFFSET ylim,
- bool find_minimal, struct context *ctxt)
-{
-#ifdef ELEMENT
- ELEMENT const *xv = ctxt->xvec; /* Help the compiler. */
- ELEMENT const *yv = ctxt->yvec;
- #define XREF_YREF_EQUAL(x,y) EQUAL (xv[x], yv[y])
-#else
- #define XREF_YREF_EQUAL(x,y) XVECREF_YVECREF_EQUAL (ctxt, x, y)
-#endif
-
- while (true)
- {
- /* Slide down the bottom initial diagonal. */
- while (xoff < xlim && yoff < ylim && XREF_YREF_EQUAL (xoff, yoff))
- {
- xoff++;
- yoff++;
- }
-
- /* Slide up the top initial diagonal. */
- while (xoff < xlim && yoff < ylim && XREF_YREF_EQUAL (xlim - 1, ylim - 1))
- {
- xlim--;
- ylim--;
- }
-
- /* Handle simple cases. */
- if (xoff == xlim)
- {
- while (yoff < ylim)
- {
- NOTE_INSERT (ctxt, yoff);
- if (EARLY_ABORT (ctxt))
- return true;
- yoff++;
- }
- break;
- }
- if (yoff == ylim)
- {
- while (xoff < xlim)
- {
- NOTE_DELETE (ctxt, xoff);
- if (EARLY_ABORT (ctxt))
- return true;
- xoff++;
- }
- break;
- }
-
- struct partition part;
-
- /* Find a point of correspondence in the middle of the vectors. */
- diag (xoff, xlim, yoff, ylim, find_minimal, &part, ctxt);
-
- /* Use the partitions to split this problem into subproblems. */
- OFFSET xoff1, xlim1, yoff1, ylim1, xoff2, xlim2, yoff2, ylim2;
- bool find_minimal1, find_minimal2;
- if (!NOTE_ORDERED
- && ((xlim + ylim) - (part.xmid + part.ymid)
- < (part.xmid + part.ymid) - (xoff + yoff)))
- {
- /* The second problem is smaller and the caller doesn't
- care about order, so do the second problem first to
- lessen recursion. */
- xoff1 = part.xmid; xlim1 = xlim;
- yoff1 = part.ymid; ylim1 = ylim;
- find_minimal1 = part.hi_minimal;
-
- xoff2 = xoff; xlim2 = part.xmid;
- yoff2 = yoff; ylim2 = part.ymid;
- find_minimal2 = part.lo_minimal;
- }
- else
- {
- xoff1 = xoff; xlim1 = part.xmid;
- yoff1 = yoff; ylim1 = part.ymid;
- find_minimal1 = part.lo_minimal;
-
- xoff2 = part.xmid; xlim2 = xlim;
- yoff2 = part.ymid; ylim2 = ylim;
- find_minimal2 = part.hi_minimal;
- }
-
- /* Recurse to do one subproblem. */
- bool early = compareseq (xoff1, xlim1, yoff1, ylim1, find_minimal1, ctxt);
- if (early)
- return early;
-
- /* Iterate to do the other subproblem. */
- xoff = xoff2; xlim = xlim2;
- yoff = yoff2; ylim = ylim2;
- find_minimal = find_minimal2;
- }
-
- return false;
- #undef XREF_YREF_EQUAL
-}
-
-#undef ELEMENT
-#undef EQUAL
-#undef OFFSET
-#undef EXTRA_CONTEXT_FIELDS
-#undef NOTE_DELETE
-#undef NOTE_INSERT
-#undef EARLY_ABORT
-#undef USE_HEURISTIC
-#undef XVECREF_YVECREF_EQUAL
-#undef OFFSET_MAX
diff --git a/cross/lib/dirent.in.h b/cross/lib/dirent.in.h
deleted file mode 100644
index 2aaabd054a8..00000000000
--- a/cross/lib/dirent.in.h
+++ /dev/null
@@ -1,321 +0,0 @@
-/* A GNU-like <dirent.h>.
- Copyright (C) 2006-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#ifndef _@GUARD_PREFIX@_DIRENT_H
-
-#if __GNUC__ >= 3
-@PRAGMA_SYSTEM_HEADER@
-#endif
-@PRAGMA_COLUMNS@
-
-/* The include_next requires a split double-inclusion guard. */
-#if @HAVE_DIRENT_H@
-# @INCLUDE_NEXT@ @NEXT_DIRENT_H@
-#endif
-
-#ifndef _@GUARD_PREFIX@_DIRENT_H
-#define _@GUARD_PREFIX@_DIRENT_H
-
-/* Get ino_t. Needed on some systems, including glibc 2.8. */
-#include <sys/types.h>
-
-#if !@HAVE_DIRENT_H@
-/* Define types DIR and 'struct dirent'. */
-# if !GNULIB_defined_struct_dirent
-struct dirent
-{
- char d_type;
- char d_name[1];
-};
-/* Possible values for 'd_type'. */
-# define DT_UNKNOWN 0
-# define DT_FIFO 1 /* FIFO */
-# define DT_CHR 2 /* character device */
-# define DT_DIR 4 /* directory */
-# define DT_BLK 6 /* block device */
-# define DT_REG 8 /* regular file */
-# define DT_LNK 10 /* symbolic link */
-# define DT_SOCK 12 /* socket */
-# define DT_WHT 14 /* whiteout */
-typedef struct gl_directory DIR;
-# define GNULIB_defined_struct_dirent 1
-# endif
-#endif
-
-/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
- that can be freed by passing them as the Ith argument to the
- function F. */
-#ifndef _GL_ATTRIBUTE_DEALLOC
-# if __GNUC__ >= 11
-# define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
-# else
-# define _GL_ATTRIBUTE_DEALLOC(f, i)
-# endif
-#endif
-
-/* _GL_ATTRIBUTE_MALLOC declares that the function returns a pointer to freshly
- allocated memory. */
-/* Applies to: functions. */
-#ifndef _GL_ATTRIBUTE_MALLOC
-# if __GNUC__ >= 3 || defined __clang__
-# define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
-# else
-# define _GL_ATTRIBUTE_MALLOC
-# endif
-#endif
-
-/* The __attribute__ feature is available in gcc versions 2.5 and later.
- The attribute __pure__ was added in gcc 2.96. */
-#ifndef _GL_ATTRIBUTE_PURE
-# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
-# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
-# else
-# define _GL_ATTRIBUTE_PURE /* empty */
-# endif
-#endif
-
-/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
-
-/* The definition of _GL_ARG_NONNULL is copied here. */
-
-/* The definition of _GL_WARN_ON_USE is copied here. */
-
-
-/* Declare overridden functions. */
-
-#if @GNULIB_CLOSEDIR@
-# if @REPLACE_CLOSEDIR@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef closedir
-# define closedir rpl_closedir
-# define GNULIB_defined_closedir 1
-# endif
-_GL_FUNCDECL_RPL (closedir, int, (DIR *dirp) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (closedir, int, (DIR *dirp));
-# else
-# if !@HAVE_CLOSEDIR@
-_GL_FUNCDECL_SYS (closedir, int, (DIR *dirp) _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (closedir, int, (DIR *dirp));
-# endif
-_GL_CXXALIASWARN (closedir);
-#elif defined GNULIB_POSIXCHECK
-# undef closedir
-# if HAVE_RAW_DECL_CLOSEDIR
-_GL_WARN_ON_USE (closedir, "closedir is not portable - "
- "use gnulib module closedir for portability");
-# endif
-#endif
-
-#if @GNULIB_OPENDIR@
-# if @REPLACE_OPENDIR@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef opendir
-# define opendir rpl_opendir
-# define GNULIB_defined_opendir 1
-# endif
-_GL_FUNCDECL_RPL (opendir, DIR *,
- (const char *dir_name)
- _GL_ARG_NONNULL ((1))
- _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (closedir, 1));
-_GL_CXXALIAS_RPL (opendir, DIR *, (const char *dir_name));
-# else
-# if !@HAVE_OPENDIR@ || __GNUC__ >= 11
-_GL_FUNCDECL_SYS (opendir, DIR *,
- (const char *dir_name)
- _GL_ARG_NONNULL ((1))
- _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (closedir, 1));
-# endif
-_GL_CXXALIAS_SYS (opendir, DIR *, (const char *dir_name));
-# endif
-_GL_CXXALIASWARN (opendir);
-#else
-# if @GNULIB_CLOSEDIR@ && __GNUC__ >= 11 && !defined opendir
-/* For -Wmismatched-dealloc: Associate opendir with closedir or
- rpl_closedir. */
-_GL_FUNCDECL_SYS (opendir, DIR *,
- (const char *dir_name)
- _GL_ARG_NONNULL ((1))
- _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (closedir, 1));
-# endif
-# if defined GNULIB_POSIXCHECK
-# undef opendir
-# if HAVE_RAW_DECL_OPENDIR
-_GL_WARN_ON_USE (opendir, "opendir is not portable - "
- "use gnulib module opendir for portability");
-# endif
-# endif
-#endif
-
-#if @GNULIB_READDIR@
-# if !@HAVE_READDIR@
-_GL_FUNCDECL_SYS (readdir, struct dirent *, (DIR *dirp) _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (readdir, struct dirent *, (DIR *dirp));
-_GL_CXXALIASWARN (readdir);
-#elif defined GNULIB_POSIXCHECK
-# undef readdir
-# if HAVE_RAW_DECL_READDIR
-_GL_WARN_ON_USE (readdir, "readdir is not portable - "
- "use gnulib module readdir for portability");
-# endif
-#endif
-
-#if @GNULIB_REWINDDIR@
-# if !@HAVE_REWINDDIR@
-_GL_FUNCDECL_SYS (rewinddir, void, (DIR *dirp) _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (rewinddir, void, (DIR *dirp));
-_GL_CXXALIASWARN (rewinddir);
-#elif defined GNULIB_POSIXCHECK
-# undef rewinddir
-# if HAVE_RAW_DECL_REWINDDIR
-_GL_WARN_ON_USE (rewinddir, "rewinddir is not portable - "
- "use gnulib module rewinddir for portability");
-# endif
-#endif
-
-#if @GNULIB_DIRFD@
-/* Return the file descriptor associated with the given directory stream,
- or -1 if none exists. */
-# if @REPLACE_DIRFD@
-/* On kLIBC, dirfd() is a macro that does not work. Undefine it. */
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE) || defined dirfd
-# undef dirfd
-# define dirfd rpl_dirfd
-# endif
-_GL_FUNCDECL_RPL (dirfd, int, (DIR *) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (dirfd, int, (DIR *));
-
-# ifdef __KLIBC__
-/* Gnulib internal hooks needed to maintain the dirfd metadata. */
-_GL_EXTERN_C int _gl_register_dirp_fd (int fd, DIR *dirp)
- _GL_ARG_NONNULL ((2));
-_GL_EXTERN_C void _gl_unregister_dirp_fd (int fd);
-# endif
-# else
-# if defined __cplusplus && defined GNULIB_NAMESPACE && defined dirfd
- /* dirfd is defined as a macro and not as a function.
- Turn it into a function and get rid of the macro. */
-static inline int (dirfd) (DIR *dp) { return dirfd (dp); }
-# undef dirfd
-# endif
-# if !(@HAVE_DECL_DIRFD@ || defined dirfd)
-_GL_FUNCDECL_SYS (dirfd, int, (DIR *) _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (dirfd, int, (DIR *));
-# endif
-_GL_CXXALIASWARN (dirfd);
-#elif defined GNULIB_POSIXCHECK
-# undef dirfd
-# if HAVE_RAW_DECL_DIRFD
-_GL_WARN_ON_USE (dirfd, "dirfd is unportable - "
- "use gnulib module dirfd for portability");
-# endif
-#endif
-
-#if @GNULIB_FDOPENDIR@
-/* Open a directory stream visiting the given directory file
- descriptor. Return NULL and set errno if fd is not visiting a
- directory. On success, this function consumes fd (it will be
- implicitly closed either by this function or by a subsequent
- closedir). */
-# if @REPLACE_FDOPENDIR@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fdopendir
-# define fdopendir rpl_fdopendir
-# endif
-_GL_FUNCDECL_RPL (fdopendir, DIR *,
- (int fd)
- _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (closedir, 1));
-_GL_CXXALIAS_RPL (fdopendir, DIR *, (int fd));
-# else
-# if !@HAVE_FDOPENDIR@ || !@HAVE_DECL_FDOPENDIR@ || __GNUC__ >= 11
-_GL_FUNCDECL_SYS (fdopendir, DIR *,
- (int fd)
- _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (closedir, 1));
-# endif
-_GL_CXXALIAS_SYS (fdopendir, DIR *, (int fd));
-# endif
-_GL_CXXALIASWARN (fdopendir);
-#else
-# if @GNULIB_CLOSEDIR@ && __GNUC__ >= 11 && !defined fdopendir
-/* For -Wmismatched-dealloc: Associate fdopendir with closedir or
- rpl_closedir. */
-_GL_FUNCDECL_SYS (fdopendir, DIR *,
- (int fd)
- _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC (closedir, 1));
-# endif
-# if defined GNULIB_POSIXCHECK
-# undef fdopendir
-# if HAVE_RAW_DECL_FDOPENDIR
-_GL_WARN_ON_USE (fdopendir, "fdopendir is unportable - "
- "use gnulib module fdopendir for portability");
-# endif
-# endif
-#endif
-
-#if @GNULIB_SCANDIR@
-/* Scan the directory DIR, calling FILTER on each directory entry.
- Entries for which FILTER returns nonzero are individually malloc'd,
- sorted using qsort with CMP, and collected in a malloc'd array in
- *NAMELIST. Returns the number of entries selected, or -1 on error. */
-# if !@HAVE_SCANDIR@
-_GL_FUNCDECL_SYS (scandir, int,
- (const char *dir, struct dirent ***namelist,
- int (*filter) (const struct dirent *),
- int (*cmp) (const struct dirent **, const struct dirent **))
- _GL_ARG_NONNULL ((1, 2, 4)));
-# endif
-/* Need to cast, because on glibc systems, the fourth parameter is
- int (*cmp) (const void *, const void *). */
-_GL_CXXALIAS_SYS_CAST (scandir, int,
- (const char *dir, struct dirent ***namelist,
- int (*filter) (const struct dirent *),
- int (*cmp) (const struct dirent **, const struct dirent **)));
-_GL_CXXALIASWARN (scandir);
-#elif defined GNULIB_POSIXCHECK
-# undef scandir
-# if HAVE_RAW_DECL_SCANDIR
-_GL_WARN_ON_USE (scandir, "scandir is unportable - "
- "use gnulib module scandir for portability");
-# endif
-#endif
-
-#if @GNULIB_ALPHASORT@
-/* Compare two 'struct dirent' entries alphabetically. */
-# if !@HAVE_ALPHASORT@
-_GL_FUNCDECL_SYS (alphasort, int,
- (const struct dirent **, const struct dirent **)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1, 2)));
-# endif
-/* Need to cast, because on glibc systems, the parameters are
- (const void *, const void *). */
-_GL_CXXALIAS_SYS_CAST (alphasort, int,
- (const struct dirent **, const struct dirent **));
-_GL_CXXALIASWARN (alphasort);
-#elif defined GNULIB_POSIXCHECK
-# undef alphasort
-# if HAVE_RAW_DECL_ALPHASORT
-_GL_WARN_ON_USE (alphasort, "alphasort is unportable - "
- "use gnulib module alphasort for portability");
-# endif
-#endif
-
-
-#endif /* _@GUARD_PREFIX@_DIRENT_H */
-#endif /* _@GUARD_PREFIX@_DIRENT_H */
diff --git a/cross/lib/dirfd.c b/cross/lib/dirfd.c
deleted file mode 100644
index b2b1d25cdbd..00000000000
--- a/cross/lib/dirfd.c
+++ /dev/null
@@ -1,98 +0,0 @@
-/* dirfd.c -- return the file descriptor associated with an open DIR*
-
- Copyright (C) 2001, 2006, 2008-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Jim Meyering. */
-
-#include <config.h>
-
-#include <dirent.h>
-#include <errno.h>
-
-#ifdef __KLIBC__
-# include <stdlib.h>
-# include <io.h>
-
-static struct dirp_fd_list
-{
- DIR *dirp;
- int fd;
- struct dirp_fd_list *next;
-} *dirp_fd_start = NULL;
-
-/* Register fd associated with dirp to dirp_fd_list. */
-int
-_gl_register_dirp_fd (int fd, DIR *dirp)
-{
- struct dirp_fd_list *new_dirp_fd = malloc (sizeof *new_dirp_fd);
- if (!new_dirp_fd)
- return -1;
-
- new_dirp_fd->dirp = dirp;
- new_dirp_fd->fd = fd;
- new_dirp_fd->next = dirp_fd_start;
-
- dirp_fd_start = new_dirp_fd;
-
- return 0;
-}
-
-/* Unregister fd from dirp_fd_list with closing it */
-void
-_gl_unregister_dirp_fd (int fd)
-{
- struct dirp_fd_list *dirp_fd;
- struct dirp_fd_list *dirp_fd_prev;
-
- for (dirp_fd_prev = NULL, dirp_fd = dirp_fd_start; dirp_fd;
- dirp_fd_prev = dirp_fd, dirp_fd = dirp_fd->next)
- {
- if (dirp_fd->fd == fd)
- {
- if (dirp_fd_prev)
- dirp_fd_prev->next = dirp_fd->next;
- else /* dirp_fd == dirp_fd_start */
- dirp_fd_start = dirp_fd_start->next;
-
- close (fd);
- free (dirp_fd);
- break;
- }
- }
-}
-#endif
-
-int
-dirfd (DIR *dir_p)
-{
- int fd = DIR_TO_FD (dir_p);
- if (fd == -1)
-#ifndef __KLIBC__
- errno = ENOTSUP;
-#else
- {
- struct dirp_fd_list *dirp_fd;
-
- for (dirp_fd = dirp_fd_start; dirp_fd; dirp_fd = dirp_fd->next)
- if (dirp_fd->dirp == dir_p)
- return dirp_fd->fd;
-
- errno = EINVAL;
- }
-#endif
-
- return fd;
-}
diff --git a/cross/lib/dtoastr.c b/cross/lib/dtoastr.c
deleted file mode 100644
index 66b50995c79..00000000000
--- a/cross/lib/dtoastr.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Convert 'double' to accurate string.
-
- Copyright (C) 2010-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation, either version 3 of the License,
- or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#define LENGTH 2
-#include "ftoastr.c"
diff --git a/cross/lib/dtotimespec.c b/cross/lib/dtotimespec.c
deleted file mode 100644
index 28a44b69171..00000000000
--- a/cross/lib/dtotimespec.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Convert double to timespec.
-
- Copyright (C) 2011-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* written by Paul Eggert */
-
-/* Convert the double value SEC to a struct timespec. Round toward
- positive infinity. On overflow, return an extremal value. */
-
-#include <config.h>
-
-#include "timespec.h"
-
-#include "intprops.h"
-
-struct timespec
-dtotimespec (double sec)
-{
- if (! (TYPE_MINIMUM (time_t) < sec))
- return make_timespec (TYPE_MINIMUM (time_t), 0);
- else if (! (sec < 1.0 + TYPE_MAXIMUM (time_t)))
- return make_timespec (TYPE_MAXIMUM (time_t), TIMESPEC_HZ - 1);
- else
- {
- time_t s = sec;
- double frac = TIMESPEC_HZ * (sec - s);
- long ns = frac;
- ns += ns < frac;
- s += ns / TIMESPEC_HZ;
- ns %= TIMESPEC_HZ;
-
- if (ns < 0)
- {
- s--;
- ns += TIMESPEC_HZ;
- }
-
- return make_timespec (s, ns);
- }
-}
diff --git a/cross/lib/dup2.c b/cross/lib/dup2.c
deleted file mode 100644
index 7d197ca3123..00000000000
--- a/cross/lib/dup2.c
+++ /dev/null
@@ -1,189 +0,0 @@
-/* Duplicate an open file descriptor to a specified file descriptor.
-
- Copyright (C) 1999, 2004-2007, 2009-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* written by Paul Eggert */
-
-#include <config.h>
-
-/* Specification. */
-#include <unistd.h>
-
-#include <errno.h>
-#include <fcntl.h>
-
-#undef dup2
-
-#if defined _WIN32 && ! defined __CYGWIN__
-
-/* Get declarations of the native Windows API functions. */
-# define WIN32_LEAN_AND_MEAN
-# include <windows.h>
-
-# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
-# include "msvc-inval.h"
-# endif
-
-/* Get _get_osfhandle. */
-# if GNULIB_MSVC_NOTHROW
-# include "msvc-nothrow.h"
-# else
-# include <io.h>
-# endif
-
-# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
-static int
-dup2_nothrow (int fd, int desired_fd)
-{
- int result;
-
- TRY_MSVC_INVAL
- {
- result = _dup2 (fd, desired_fd);
- }
- CATCH_MSVC_INVAL
- {
- errno = EBADF;
- result = -1;
- }
- DONE_MSVC_INVAL;
-
- return result;
-}
-# else
-# define dup2_nothrow _dup2
-# endif
-
-static int
-ms_windows_dup2 (int fd, int desired_fd)
-{
- int result;
-
- /* If fd is closed, mingw hangs on dup2 (fd, fd). If fd is open,
- dup2 (fd, fd) returns 0, but all further attempts to use fd in
- future dup2 calls will hang. */
- if (fd == desired_fd)
- {
- if ((HANDLE) _get_osfhandle (fd) == INVALID_HANDLE_VALUE)
- {
- errno = EBADF;
- return -1;
- }
- return fd;
- }
-
- /* Wine 1.0.1 return 0 when desired_fd is negative but not -1:
- https://bugs.winehq.org/show_bug.cgi?id=21289 */
- if (desired_fd < 0)
- {
- errno = EBADF;
- return -1;
- }
-
- result = dup2_nothrow (fd, desired_fd);
-
- if (result == 0)
- result = desired_fd;
-
- return result;
-}
-
-# define dup2 ms_windows_dup2
-
-#elif defined __KLIBC__
-
-# include <InnoTekLIBC/backend.h>
-
-static int
-klibc_dup2dirfd (int fd, int desired_fd)
-{
- int tempfd;
- int dupfd;
-
- tempfd = open ("NUL", O_RDONLY);
- if (tempfd == -1)
- return -1;
-
- if (tempfd == desired_fd)
- {
- close (tempfd);
-
- char path[_MAX_PATH];
- if (__libc_Back_ioFHToPath (fd, path, sizeof (path)))
- return -1;
-
- return open(path, O_RDONLY);
- }
-
- dupfd = klibc_dup2dirfd (fd, desired_fd);
-
- close (tempfd);
-
- return dupfd;
-}
-
-static int
-klibc_dup2 (int fd, int desired_fd)
-{
- int dupfd;
- struct stat sbuf;
-
- dupfd = dup2 (fd, desired_fd);
- if (dupfd == -1 && errno == ENOTSUP \
- && !fstat (fd, &sbuf) && S_ISDIR (sbuf.st_mode))
- {
- close (desired_fd);
-
- return klibc_dup2dirfd (fd, desired_fd);
- }
-
- return dupfd;
-}
-
-# define dup2 klibc_dup2
-#endif
-
-int
-rpl_dup2 (int fd, int desired_fd)
-{
- int result;
-
-#ifdef F_GETFL
- /* On Linux kernels 2.6.26-2.6.29, dup2 (fd, fd) returns -EBADF.
- On Cygwin 1.5.x, dup2 (1, 1) returns 0.
- On Cygwin 1.7.17, dup2 (1, -1) dumps core.
- On Cygwin 1.7.25, dup2 (1, 256) can dump core.
- On Haiku, dup2 (fd, fd) mistakenly clears FD_CLOEXEC. */
-# if HAVE_SETDTABLESIZE
- setdtablesize (desired_fd + 1);
-# endif
- if (desired_fd < 0)
- fd = desired_fd;
- if (fd == desired_fd)
- return fcntl (fd, F_GETFL) == -1 ? -1 : fd;
-#endif
-
- result = dup2 (fd, desired_fd);
-
- /* Correct an errno value on FreeBSD 6.1 and Cygwin 1.5.x. */
- if (result == -1 && errno == EMFILE)
- errno = EBADF;
-#if REPLACE_FCHDIR
- if (fd != desired_fd && result != -1)
- result = _gl_register_dup (fd, result);
-#endif
- return result;
-}
diff --git a/cross/lib/dynarray.h b/cross/lib/dynarray.h
deleted file mode 100644
index 9155910934f..00000000000
--- a/cross/lib/dynarray.h
+++ /dev/null
@@ -1,284 +0,0 @@
-/* Type-safe arrays which grow dynamically.
- Copyright 2021-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert and Bruno Haible, 2021. */
-
-#ifndef _GL_DYNARRAY_H
-#define _GL_DYNARRAY_H
-
-/* Before including this file, you need to define:
-
- 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:
- */
-
-/* Initialize a dynamic array object. This must be called before any
- use of the object. */
-#if 0
-static void
- DYNARRAY_PREFIX##init (struct DYNARRAY_STRUCT *list);
-#endif
-
-/* Deallocate the dynamic array and its elements. */
-#if 0
-static void
- DYNARRAY_PREFIX##free (struct DYNARRAY_STRUCT *list);
-#endif
-
-/* Return true if the dynamic array is in an error state. */
-#if 0
-static bool
- DYNARRAY_PREFIX##has_failed (const struct DYNARRAY_STRUCT *list);
-#endif
-
-/* Mark the dynamic array as failed. All elements are deallocated as
- a side effect. */
-#if 0
-static void
- DYNARRAY_PREFIX##mark_failed (struct DYNARRAY_STRUCT *list);
-#endif
-
-/* Return the number of elements which have been added to the dynamic
- array. */
-#if 0
-static size_t
- DYNARRAY_PREFIX##size (const struct DYNARRAY_STRUCT *list);
-#endif
-
-/* 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. */
-#if 0
-static DYNARRAY_ELEMENT *
- DYNARRAY_PREFIX##begin (const struct DYNARRAY_STRUCT *list);
-#endif
-
-/* 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. */
-#if 0
-static DYNARRAY_ELEMENT *
- DYNARRAY_PREFIX##end (const struct DYNARRAY_STRUCT *list);
-#endif
-
-/* Return a pointer to the array element at INDEX. Terminate the
- process if INDEX is out of bounds. */
-#if 0
-static DYNARRAY_ELEMENT *
- DYNARRAY_PREFIX##at (struct DYNARRAY_STRUCT *list, size_t index);
-#endif
-
-/* 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. */
-#if 0
-static void
- DYNARRAY_PREFIX##add (struct DYNARRAY_STRUCT *list,
- DYNARRAY_ELEMENT item);
-#endif
-
-/* 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. */
-#if 0
-static DYNARRAY_ELEMENT *
- DYNARRAY_PREFIX##emplace (struct DYNARRAY_STRUCT *list);
-#endif
-
-/* 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). */
-#if 0
-static bool
- DYNARRAY_PREFIX##resize (struct DYNARRAY_STRUCT *list, size_t size);
-#endif
-
-/* Remove the last element of LIST if it is present. */
-#if 0
-static void
- DYNARRAY_PREFIX##remove_last (struct DYNARRAY_STRUCT *list);
-#endif
-
-/* Remove all elements from the list. The elements are freed, but the
- list itself is not. */
-#if 0
-static void
- DYNARRAY_PREFIX##clear (struct DYNARRAY_STRUCT *list);
-#endif
-
-#if defined 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. */
-#if 0
-static bool
- DYNARRAY_PREFIX##finalize (struct DYNARRAY_STRUCT *list,
- DYNARRAY_FINAL_TYPE *result);
-#endif
-#else /* !defined 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. */
-#if 0
-static DYNARRAY_ELEMENT *
- DYNARRAY_PREFIX##finalize (struct DYNARRAY_STRUCT *list,
- size_t *lengthp);
-#endif
-#endif
-
-/* 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>
- */
-
-
-/* The implementation is imported from glibc. */
-
-/* Avoid possible conflicts with symbols exported by the GNU libc. */
-#define __libc_dynarray_at_failure gl_dynarray_at_failure
-#define __libc_dynarray_emplace_enlarge gl_dynarray_emplace_enlarge
-#define __libc_dynarray_finalize gl_dynarray_finalize
-#define __libc_dynarray_resize_clear gl_dynarray_resize_clear
-#define __libc_dynarray_resize gl_dynarray_resize
-
-#if defined DYNARRAY_STRUCT || defined DYNARRAY_ELEMENT || defined DYNARRAY_PREFIX
-
-# ifndef _GL_LIKELY
-/* Rely on __builtin_expect, as provided by the module 'builtin-expect'. */
-# define _GL_LIKELY(cond) __builtin_expect ((cond), 1)
-# define _GL_UNLIKELY(cond) __builtin_expect ((cond), 0)
-# endif
-
-/* Define auxiliary structs and declare auxiliary functions, common to all
- instantiations of dynarray. */
-# include <malloc/dynarray.gl.h>
-
-/* Define the instantiation, specified through
- DYNARRAY_STRUCT
- DYNARRAY_ELEMENT
- DYNARRAY_PREFIX
- etc. */
-# include <malloc/dynarray-skeleton.gl.h>
-
-#else
-
-/* This file is being included from one of the malloc/dynarray_*.c files. */
-# include <malloc/dynarray.h>
-
-#endif
-
-#endif /* _GL_DYNARRAY_H */
diff --git a/cross/lib/eloop-threshold.h b/cross/lib/eloop-threshold.h
deleted file mode 100644
index 510f261795d..00000000000
--- a/cross/lib/eloop-threshold.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/* Threshold at which to diagnose ELOOP. Generic version.
- Copyright (C) 2012-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _ELOOP_THRESHOLD_H
-#define _ELOOP_THRESHOLD_H 1
-
-#include <limits.h>
-#ifdef _LIBC
-# include <sys/param.h>
-# define _GL_ATTRIBUTE_CONST __attribute__ ((const))
-#else
-# include <unistd.h>
-# include "minmax.h"
-# define __sysconf sysconf
-# if (!defined SYMLOOP_MAX \
- && ! (defined _SC_SYMLOOP_MAX && defined _POSIX_SYMLOOP_MAX))
-# define SYMLOOP_MAX 8
-# endif
-#endif
-
-/* POSIX specifies SYMLOOP_MAX as the "Maximum number of symbolic
- links that can be reliably traversed in the resolution of a
- pathname in the absence of a loop." This makes it a minimum that
- we should certainly accept. But it leaves open the possibility
- that more might sometimes work--just not "reliably".
-
- For example, Linux implements a complex policy whereby there is a
- small limit on the number of direct symlink traversals (a symlink
- to a symlink to a symlink), but larger limit on the total number of
- symlink traversals overall. Hence the SYMLOOP_MAX number should be
- the small one, but the limit library functions enforce on users
- should be the larger one.
-
- So, we use the larger of the reported SYMLOOP_MAX (if any) and our
- own constant MIN_ELOOP_THRESHOLD, below. This constant should be
- large enough that it never rules out a file name and directory tree
- that the underlying system (i.e. calls to 'open' et al) would
- resolve successfully. It should be small enough that actual loops
- are detected without a huge number of iterations. */
-
-#ifndef MIN_ELOOP_THRESHOLD
-# define MIN_ELOOP_THRESHOLD 40
-#endif
-
-/* Return the maximum number of symlink traversals to permit
- before diagnosing ELOOP. */
-static inline unsigned int _GL_ATTRIBUTE_CONST
-__eloop_threshold (void)
-{
-#ifdef SYMLOOP_MAX
- const int symloop_max = SYMLOOP_MAX;
-#else
- /* The function is marked 'const' even though we use memory and
- call a function, because sysconf is required to return the
- same value in every call and so it must always be safe to
- call __eloop_threshold exactly once and reuse the value. */
- static long int sysconf_symloop_max;
- if (sysconf_symloop_max == 0)
- sysconf_symloop_max = __sysconf (_SC_SYMLOOP_MAX);
- const unsigned int symloop_max = (sysconf_symloop_max <= 0
- ? _POSIX_SYMLOOP_MAX
- : sysconf_symloop_max);
-#endif
-
- return MAX (symloop_max, MIN_ELOOP_THRESHOLD);
-}
-
-#endif /* eloop-threshold.h */
diff --git a/cross/lib/errno.in.h b/cross/lib/errno.in.h
deleted file mode 100644
index 3dda9c260e6..00000000000
--- a/cross/lib/errno.in.h
+++ /dev/null
@@ -1,279 +0,0 @@
-/* A POSIX-like <errno.h>.
-
- Copyright (C) 2008-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#ifndef _@GUARD_PREFIX@_ERRNO_H
-
-#if __GNUC__ >= 3
-@PRAGMA_SYSTEM_HEADER@
-#endif
-@PRAGMA_COLUMNS@
-
-/* The include_next requires a split double-inclusion guard. */
-#@INCLUDE_NEXT@ @NEXT_ERRNO_H@
-
-#ifndef _@GUARD_PREFIX@_ERRNO_H
-#define _@GUARD_PREFIX@_ERRNO_H
-
-
-/* On native Windows platforms, many macros are not defined. */
-# if defined _WIN32 && ! defined __CYGWIN__
-
-/* These are the same values as defined by MSVC 10, for interoperability. */
-
-# ifndef ENOMSG
-# define ENOMSG 122
-# define GNULIB_defined_ENOMSG 1
-# endif
-
-# ifndef EIDRM
-# define EIDRM 111
-# define GNULIB_defined_EIDRM 1
-# endif
-
-# ifndef ENOLINK
-# define ENOLINK 121
-# define GNULIB_defined_ENOLINK 1
-# endif
-
-# ifndef EPROTO
-# define EPROTO 134
-# define GNULIB_defined_EPROTO 1
-# endif
-
-# ifndef EBADMSG
-# define EBADMSG 104
-# define GNULIB_defined_EBADMSG 1
-# endif
-
-# ifndef EOVERFLOW
-# define EOVERFLOW 132
-# define GNULIB_defined_EOVERFLOW 1
-# endif
-
-# ifndef ENOTSUP
-# define ENOTSUP 129
-# define GNULIB_defined_ENOTSUP 1
-# endif
-
-# ifndef ENETRESET
-# define ENETRESET 117
-# define GNULIB_defined_ENETRESET 1
-# endif
-
-# ifndef ECONNABORTED
-# define ECONNABORTED 106
-# define GNULIB_defined_ECONNABORTED 1
-# endif
-
-# ifndef ECANCELED
-# define ECANCELED 105
-# define GNULIB_defined_ECANCELED 1
-# endif
-
-# ifndef EOWNERDEAD
-# define EOWNERDEAD 133
-# define GNULIB_defined_EOWNERDEAD 1
-# endif
-
-# ifndef ENOTRECOVERABLE
-# define ENOTRECOVERABLE 127
-# define GNULIB_defined_ENOTRECOVERABLE 1
-# endif
-
-# ifndef EINPROGRESS
-# define EINPROGRESS 112
-# define EALREADY 103
-# define ENOTSOCK 128
-# define EDESTADDRREQ 109
-# define EMSGSIZE 115
-# define EPROTOTYPE 136
-# define ENOPROTOOPT 123
-# define EPROTONOSUPPORT 135
-# define EOPNOTSUPP 130
-# define EAFNOSUPPORT 102
-# define EADDRINUSE 100
-# define EADDRNOTAVAIL 101
-# define ENETDOWN 116
-# define ENETUNREACH 118
-# define ECONNRESET 108
-# define ENOBUFS 119
-# define EISCONN 113
-# define ENOTCONN 126
-# define ETIMEDOUT 138
-# define ECONNREFUSED 107
-# define ELOOP 114
-# define EHOSTUNREACH 110
-# define EWOULDBLOCK 140
-# define GNULIB_defined_ESOCK 1
-# endif
-
-# ifndef ETXTBSY
-# define ETXTBSY 139
-# define ENODATA 120 /* not required by POSIX */
-# define ENOSR 124 /* not required by POSIX */
-# define ENOSTR 125 /* not required by POSIX */
-# define ETIME 137 /* not required by POSIX */
-# define EOTHER 131 /* not required by POSIX */
-# define GNULIB_defined_ESTREAMS 1
-# endif
-
-/* These are intentionally the same values as the WSA* error numbers, defined
- in <winsock2.h>. */
-# define ESOCKTNOSUPPORT 10044 /* not required by POSIX */
-# define EPFNOSUPPORT 10046 /* not required by POSIX */
-# define ESHUTDOWN 10058 /* not required by POSIX */
-# define ETOOMANYREFS 10059 /* not required by POSIX */
-# define EHOSTDOWN 10064 /* not required by POSIX */
-# define EPROCLIM 10067 /* not required by POSIX */
-# define EUSERS 10068 /* not required by POSIX */
-# define EDQUOT 10069
-# define ESTALE 10070
-# define EREMOTE 10071 /* not required by POSIX */
-# define GNULIB_defined_EWINSOCK 1
-
-# endif
-
-
-/* On OSF/1 5.1, when _XOPEN_SOURCE_EXTENDED is not defined, the macros
- EMULTIHOP, ENOLINK, EOVERFLOW are not defined. */
-# if @EMULTIHOP_HIDDEN@
-# define EMULTIHOP @EMULTIHOP_VALUE@
-# define GNULIB_defined_EMULTIHOP 1
-# endif
-# if @ENOLINK_HIDDEN@
-# define ENOLINK @ENOLINK_VALUE@
-# define GNULIB_defined_ENOLINK 1
-# endif
-# if @EOVERFLOW_HIDDEN@
-# define EOVERFLOW @EOVERFLOW_VALUE@
-# define GNULIB_defined_EOVERFLOW 1
-# endif
-
-
-/* On OpenBSD 4.0 and on native Windows, the macros ENOMSG, EIDRM, ENOLINK,
- EPROTO, EMULTIHOP, EBADMSG, EOVERFLOW, ENOTSUP, ECANCELED are not defined.
- Likewise, on NonStop Kernel, EDQUOT is not defined.
- Define them here. Values >= 2000 seem safe to use: Solaris ESTALE = 151,
- HP-UX EWOULDBLOCK = 246, IRIX EDQUOT = 1133.
-
- Note: When one of these systems defines some of these macros some day,
- binaries will have to be recompiled so that they recognizes the new
- errno values from the system. */
-
-# ifndef ENOMSG
-# define ENOMSG 2000
-# define GNULIB_defined_ENOMSG 1
-# endif
-
-# ifndef EIDRM
-# define EIDRM 2001
-# define GNULIB_defined_EIDRM 1
-# endif
-
-# ifndef ENOLINK
-# define ENOLINK 2002
-# define GNULIB_defined_ENOLINK 1
-# endif
-
-# ifndef EPROTO
-# define EPROTO 2003
-# define GNULIB_defined_EPROTO 1
-# endif
-
-# ifndef EMULTIHOP
-# define EMULTIHOP 2004
-# define GNULIB_defined_EMULTIHOP 1
-# endif
-
-# ifndef EBADMSG
-# define EBADMSG 2005
-# define GNULIB_defined_EBADMSG 1
-# endif
-
-# ifndef EOVERFLOW
-# define EOVERFLOW 2006
-# define GNULIB_defined_EOVERFLOW 1
-# endif
-
-# ifndef ENOTSUP
-# define ENOTSUP 2007
-# define GNULIB_defined_ENOTSUP 1
-# endif
-
-# ifndef ENETRESET
-# define ENETRESET 2011
-# define GNULIB_defined_ENETRESET 1
-# endif
-
-# ifndef ECONNABORTED
-# define ECONNABORTED 2012
-# define GNULIB_defined_ECONNABORTED 1
-# endif
-
-# ifndef ESTALE
-# define ESTALE 2009
-# define GNULIB_defined_ESTALE 1
-# endif
-
-# ifndef EDQUOT
-# define EDQUOT 2010
-# define GNULIB_defined_EDQUOT 1
-# endif
-
-# ifndef ECANCELED
-# define ECANCELED 2008
-# define GNULIB_defined_ECANCELED 1
-# endif
-
-/* On many platforms, the macros EOWNERDEAD and ENOTRECOVERABLE are not
- defined. */
-
-# ifndef EOWNERDEAD
-# if defined __sun
- /* Use the same values as defined for Solaris >= 8, for
- interoperability. */
-# define EOWNERDEAD 58
-# define ENOTRECOVERABLE 59
-# elif defined _WIN32 && ! defined __CYGWIN__
- /* We have a conflict here: pthreads-win32 defines these values
- differently than MSVC 10. It's hairy to decide which one to use. */
-# if defined __MINGW32__ && !defined USE_WINDOWS_THREADS
- /* Use the same values as defined by pthreads-win32, for
- interoperability. */
-# define EOWNERDEAD 43
-# define ENOTRECOVERABLE 44
-# else
- /* Use the same values as defined by MSVC 10, for
- interoperability. */
-# define EOWNERDEAD 133
-# define ENOTRECOVERABLE 127
-# endif
-# else
-# define EOWNERDEAD 2013
-# define ENOTRECOVERABLE 2014
-# endif
-# define GNULIB_defined_EOWNERDEAD 1
-# define GNULIB_defined_ENOTRECOVERABLE 1
-# endif
-
-# ifndef EILSEQ
-# define EILSEQ 2015
-# define GNULIB_defined_EILSEQ 1
-# endif
-
-#endif /* _@GUARD_PREFIX@_ERRNO_H */
-#endif /* _@GUARD_PREFIX@_ERRNO_H */
diff --git a/cross/lib/euidaccess.c b/cross/lib/euidaccess.c
deleted file mode 100644
index c2ecbeff52a..00000000000
--- a/cross/lib/euidaccess.c
+++ /dev/null
@@ -1,226 +0,0 @@
-/* euidaccess -- check if effective user id can access file
-
- Copyright (C) 1990-1991, 1995, 1998, 2000, 2003-2006, 2008-2023 Free
- Software Foundation, Inc.
-
- This file is part of the GNU C Library.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by David MacKenzie and Torbjorn Granlund.
- Adapted for GNU C library by Roland McGrath. */
-
-#ifndef _LIBC
-# include <config.h>
-#endif
-
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#if defined _WIN32 && ! defined __CYGWIN__
-# include <io.h>
-#else
-# include "root-uid.h"
-#endif
-
-#if HAVE_LIBGEN_H
-# include <libgen.h>
-#endif
-
-#include <errno.h>
-#ifndef __set_errno
-# define __set_errno(val) errno = (val)
-#endif
-
-#if defined EACCES && !defined EACCESS
-# define EACCESS EACCES
-#endif
-
-#ifndef F_OK
-# define F_OK 0
-# define X_OK 1
-# define W_OK 2
-# define R_OK 4
-#endif
-
-
-#ifdef _LIBC
-
-# define access __access
-# define getuid __getuid
-# define getgid __getgid
-# define geteuid __geteuid
-# define getegid __getegid
-# define group_member __group_member
-# define euidaccess __euidaccess
-# undef stat
-# define stat stat64
-
-#endif
-
-/* Return 0 if the user has permission of type MODE on FILE;
- otherwise, return -1 and set 'errno'.
- Like access, except that it uses the effective user and group
- id's instead of the real ones, and it does not always check for read-only
- file system, text busy, etc. */
-
-int
-euidaccess (const char *file, int mode)
-{
-#if HAVE_FACCESSAT /* glibc, AIX 7, Solaris 11, Cygwin 1.7 */
- return faccessat (AT_FDCWD, file, mode, AT_EACCESS);
-#elif defined EFF_ONLY_OK /* IRIX, OSF/1, Interix */
- return access (file, mode | EFF_ONLY_OK);
-#elif defined ACC_SELF /* AIX */
- return accessx (file, mode, ACC_SELF);
-#elif HAVE_EACCESS /* FreeBSD */
- return eaccess (file, mode);
-#elif defined _WIN32 && ! defined __CYGWIN__ /* mingw */
- return _access (file, mode);
-#else /* Mac OS X, NetBSD, OpenBSD, HP-UX, Solaris, Cygwin, BeOS */
-
- uid_t uid = getuid ();
- gid_t gid = getgid ();
- uid_t euid = geteuid ();
- gid_t egid = getegid ();
- struct stat stats;
-
-# if HAVE_DECL_SETREGID && PREFER_NONREENTRANT_EUIDACCESS
-
- /* Define PREFER_NONREENTRANT_EUIDACCESS if you prefer euidaccess to
- return the correct result even if this would make it
- nonreentrant. Define this only if your entire application is
- safe even if the uid or gid might temporarily change. If your
- application uses signal handlers or threads it is probably not
- safe. */
-
- if (mode == F_OK)
- {
- int result = stat (file, &stats);
- return result != 0 && errno == EOVERFLOW ? 0 : result;
- }
- else
- {
- int result;
- int saved_errno;
-
- if (uid != euid)
- setreuid (euid, uid);
- if (gid != egid)
- setregid (egid, gid);
-
- result = access (file, mode);
- saved_errno = errno;
-
- /* Restore them. */
- if (uid != euid)
- setreuid (uid, euid);
- if (gid != egid)
- setregid (gid, egid);
-
- errno = saved_errno;
- return result;
- }
-
-# else
-
- /* The following code assumes the traditional Unix model, and is not
- correct on systems that have ACLs or the like. However, it's
- better than nothing, and it is reentrant. */
-
- unsigned int granted;
- if (uid == euid && gid == egid)
- /* If we are not set-uid or set-gid, access does the same. */
- return access (file, mode);
-
- if (stat (file, &stats) == -1)
- return mode == F_OK && errno == EOVERFLOW ? 0 : -1;
-
- /* The super-user can read and write any file, and execute any file
- that anyone can execute. */
- if (euid == ROOT_UID
- && ((mode & X_OK) == 0
- || (stats.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))))
- return 0;
-
- /* Convert the mode to traditional form, clearing any bogus bits. */
- if (R_OK == 4 && W_OK == 2 && X_OK == 1 && F_OK == 0)
- mode &= 7;
- else
- mode = ((mode & R_OK ? 4 : 0)
- + (mode & W_OK ? 2 : 0)
- + (mode & X_OK ? 1 : 0));
-
- if (mode == 0)
- return 0; /* The file exists. */
-
- /* Convert the file's permission bits to traditional form. */
- if (S_IRUSR == (4 << 6) && S_IWUSR == (2 << 6) && S_IXUSR == (1 << 6)
- && S_IRGRP == (4 << 3) && S_IWGRP == (2 << 3) && S_IXGRP == (1 << 3)
- && S_IROTH == (4 << 0) && S_IWOTH == (2 << 0) && S_IXOTH == (1 << 0))
- granted = stats.st_mode;
- else
- granted = ((stats.st_mode & S_IRUSR ? 4 << 6 : 0)
- + (stats.st_mode & S_IWUSR ? 2 << 6 : 0)
- + (stats.st_mode & S_IXUSR ? 1 << 6 : 0)
- + (stats.st_mode & S_IRGRP ? 4 << 3 : 0)
- + (stats.st_mode & S_IWGRP ? 2 << 3 : 0)
- + (stats.st_mode & S_IXGRP ? 1 << 3 : 0)
- + (stats.st_mode & S_IROTH ? 4 << 0 : 0)
- + (stats.st_mode & S_IWOTH ? 2 << 0 : 0)
- + (stats.st_mode & S_IXOTH ? 1 << 0 : 0));
-
- if (euid == stats.st_uid)
- granted >>= 6;
- else if (egid == stats.st_gid || group_member (stats.st_gid))
- granted >>= 3;
-
- if ((mode & ~granted) == 0)
- return 0;
- __set_errno (EACCESS);
- return -1;
-
-# endif
-#endif
-}
-#undef euidaccess
-#ifdef weak_alias
-weak_alias (__euidaccess, euidaccess)
-#endif
-
-#ifdef TEST
-# include <error.h>
-# include <stdio.h>
-# include <stdlib.h>
-
-int
-main (int argc, char **argv)
-{
- char *file;
- int mode;
- int err;
-
- if (argc < 3)
- abort ();
- file = argv[1];
- mode = atoi (argv[2]);
-
- err = euidaccess (file, mode);
- printf ("%d\n", err);
- if (err != 0)
- error (0, errno, "%s", file);
- exit (0);
-}
-#endif
diff --git a/cross/lib/execinfo.c b/cross/lib/execinfo.c
deleted file mode 100644
index 2048d00f5fb..00000000000
--- a/cross/lib/execinfo.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Information about executables.
-
- Copyright (C) 2012-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-#define _GL_EXECINFO_INLINE _GL_EXTERN_INLINE
-#include "execinfo.h"
diff --git a/cross/lib/execinfo.in.h b/cross/lib/execinfo.in.h
deleted file mode 100644
index ff9293b6327..00000000000
--- a/cross/lib/execinfo.in.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Information about executables.
-
- Copyright (C) 2012-2023 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/>. */
-
-/* Written by Paul Eggert. */
-
-#ifndef _GL_EXECINFO_H
-#define _GL_EXECINFO_H
-
-#ifndef _GL_INLINE_HEADER_BEGIN
- #error "Please include config.h first."
-#endif
-_GL_INLINE_HEADER_BEGIN
-#ifndef _GL_EXECINFO_INLINE
-# define _GL_EXECINFO_INLINE _GL_INLINE
-#endif
-
-_GL_EXECINFO_INLINE int
-backtrace (void **buffer, int size)
-{
- (void) buffer;
- (void) size;
- return 0;
-}
-
-_GL_EXECINFO_INLINE char **
-backtrace_symbols (void *const *buffer, int size)
-{
- (void) buffer;
- (void) size;
- return 0;
-}
-
-_GL_EXECINFO_INLINE void
-backtrace_symbols_fd (void *const *buffer, int size, int fd)
-{
- (void) buffer;
- (void) size;
- (void) fd;
-}
-
-_GL_INLINE_HEADER_END
-
-#endif
diff --git a/cross/lib/explicit_bzero.c b/cross/lib/explicit_bzero.c
deleted file mode 100644
index c33cab9e6d5..00000000000
--- a/cross/lib/explicit_bzero.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/* Erasure of sensitive data, generic implementation.
- Copyright (C) 2016-2023 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/>. */
-
-/* An assembler implementation of explicit_bzero can be created as an
- assembler alias of an optimized bzero implementation.
- Architecture-specific implementations also need to define
- __explicit_bzero_chk. */
-
-#if !_LIBC
-# include <config.h>
-#endif
-
-/* memset_s need this define */
-#if HAVE_MEMSET_S
-# define __STDC_WANT_LIB_EXT1__ 1
-#endif
-
-#include <string.h>
-
-#if defined _WIN32 && !defined __CYGWIN__
-# define WIN32_LEAN_AND_MEAN
-# include <windows.h>
-#endif
-
-#if _LIBC
-/* glibc-internal users use __explicit_bzero_chk, and explicit_bzero
- redirects to that. */
-# undef explicit_bzero
-#endif
-
-/* Set LEN bytes of S to 0. The compiler will not delete a call to
- this function, even if S is dead after the call. */
-void
-explicit_bzero (void *s, size_t len)
-{
-#if defined _WIN32 && !defined __CYGWIN__
- (void) SecureZeroMemory (s, len);
-#elif HAVE_EXPLICIT_MEMSET
- explicit_memset (s, '\0', len);
-#elif HAVE_MEMSET_S
- (void) memset_s (s, len, '\0', len);
-#elif defined __GNUC__ && !defined __clang__
- memset (s, '\0', len);
- /* Compiler barrier. */
- asm volatile ("" ::: "memory");
-#elif defined __clang__
- memset (s, '\0', len);
- /* Compiler barrier. */
- /* With asm ("" ::: "memory") LLVM analyzes uses of 's' and finds that the
- whole thing is dead and eliminates it. Use 'g' to work around this
- problem. See <https://bugs.llvm.org/show_bug.cgi?id=15495#c11>. */
- __asm__ volatile ("" : : "g"(s) : "memory");
-#else
- /* Invoke memset through a volatile function pointer. This defeats compiler
- optimizations. */
- void * (* const volatile volatile_memset) (void *, int, size_t) = memset;
- (void) volatile_memset (s, '\0', len);
-#endif
-}
diff --git a/cross/lib/faccessat.c b/cross/lib/faccessat.c
deleted file mode 100644
index ac8977cfd65..00000000000
--- a/cross/lib/faccessat.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/* Check the access rights of a file relative to an open directory.
- Copyright (C) 2009-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* written by Eric Blake */
-
-/* If the user's config.h happens to include <unistd.h>, let it include only
- the system's <unistd.h> here, so that orig_faccessat doesn't recurse to
- rpl_faccessat. */
-#define _GL_INCLUDING_UNISTD_H
-#include <config.h>
-
-/* Specification. */
-#include <unistd.h>
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/stat.h>
-#undef _GL_INCLUDING_UNISTD_H
-
-#if HAVE_FACCESSAT
-static int
-orig_faccessat (int fd, char const *name, int mode, int flag)
-{
- return faccessat (fd, name, mode, flag);
-}
-#endif
-
-/* Write "unistd.h" here, not <unistd.h>, otherwise OSF/1 5.1 DTK cc
- eliminates this include because of the preliminary #include <unistd.h>
- above. */
-#include "unistd.h"
-
-#ifndef HAVE_ACCESS
-/* Mingw lacks access, but it also lacks real vs. effective ids, so
- the gnulib euidaccess module is good enough. */
-# undef access
-# define access euidaccess
-#endif
-
-#if HAVE_FACCESSAT
-
-int
-rpl_faccessat (int fd, char const *file, int mode, int flag)
-{
- int result = orig_faccessat (fd, file, mode, flag);
-
- if (result == 0 && file[strlen (file) - 1] == '/')
- {
- struct stat st;
- result = fstatat (fd, file, &st, 0);
- if (result == 0 && !S_ISDIR (st.st_mode))
- {
- errno = ENOTDIR;
- return -1;
- }
- }
-
- return result;
-}
-
-#else /* !HAVE_FACCESSAT */
-
-/* Invoke access or euidaccess on file, FILE, using mode MODE, in the directory
- open on descriptor FD. If possible, do it without changing the
- working directory. Otherwise, resort to using save_cwd/fchdir, then
- (access|euidaccess)/restore_cwd. If either the save_cwd or the
- restore_cwd fails, then give a diagnostic and exit nonzero.
- Note that this implementation only supports AT_EACCESS, although some
- native versions also support AT_SYMLINK_NOFOLLOW. */
-
-# define AT_FUNC_NAME faccessat
-# define AT_FUNC_F1 euidaccess
-# define AT_FUNC_F2 access
-# define AT_FUNC_USE_F1_COND AT_EACCESS
-# define AT_FUNC_POST_FILE_PARAM_DECLS , int mode, int flag
-# define AT_FUNC_POST_FILE_ARGS , mode
-# include "at-func.c"
-
-#endif
diff --git a/cross/lib/fchmodat.c b/cross/lib/fchmodat.c
deleted file mode 100644
index a7b70a2af2c..00000000000
--- a/cross/lib/fchmodat.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/* Change the protections of file relative to an open directory.
- Copyright (C) 2006, 2009-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* written by Jim Meyering and Paul Eggert */
-
-/* If the user's config.h happens to include <sys/stat.h>, let it include only
- the system's <sys/stat.h> here, so that orig_fchmodat doesn't recurse to
- rpl_fchmodat. */
-#define __need_system_sys_stat_h
-#include <config.h>
-
-/* Specification. */
-#include <sys/stat.h>
-#undef __need_system_sys_stat_h
-
-#if HAVE_FCHMODAT
-static int
-orig_fchmodat (int dir, char const *file, mode_t mode, int flags)
-{
- return fchmodat (dir, file, mode, flags);
-}
-#endif
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#ifdef __osf__
-/* Write "sys/stat.h" here, not <sys/stat.h>, otherwise OSF/1 5.1 DTK cc
- eliminates this include because of the preliminary #include <sys/stat.h>
- above. */
-# include "sys/stat.h"
-#else
-# include <sys/stat.h>
-#endif
-
-#include <intprops.h>
-
-/* Invoke chmod or lchmod on FILE, using mode MODE, in the directory
- open on descriptor FD. If possible, do it without changing the
- working directory. Otherwise, resort to using save_cwd/fchdir,
- then (chmod|lchmod)/restore_cwd. If either the save_cwd or the
- restore_cwd fails, then give a diagnostic and exit nonzero.
- Note that an attempt to use a FLAG value of AT_SYMLINK_NOFOLLOW
- on a system without lchmod support causes this function to fail. */
-
-#if HAVE_FCHMODAT
-int
-fchmodat (int dir, char const *file, mode_t mode, int flags)
-{
-# if HAVE_NEARLY_WORKING_FCHMODAT
- /* Correct the trailing slash handling. */
- size_t len = strlen (file);
- if (len && file[len - 1] == '/')
- {
- struct stat st;
- if (fstatat (dir, file, &st, flags & AT_SYMLINK_NOFOLLOW) < 0)
- return -1;
- if (!S_ISDIR (st.st_mode))
- {
- errno = ENOTDIR;
- return -1;
- }
- }
-# endif
-
-# if NEED_FCHMODAT_NONSYMLINK_FIX
- if (flags == AT_SYMLINK_NOFOLLOW)
- {
-# if HAVE_READLINKAT
- char readlink_buf[1];
-
-# ifdef O_PATH
- /* Open a file descriptor with O_NOFOLLOW, to make sure we don't
- follow symbolic links, if /proc is mounted. O_PATH is used to
- avoid a failure if the file is not readable.
- Cf. <https://sourceware.org/bugzilla/show_bug.cgi?id=14578> */
- int fd = openat (dir, file, O_PATH | O_NOFOLLOW | O_CLOEXEC);
- if (fd < 0)
- return fd;
-
- int err;
- if (0 <= readlinkat (fd, "", readlink_buf, sizeof readlink_buf))
- err = EOPNOTSUPP;
- else if (errno == EINVAL)
- {
- static char const fmt[] = "/proc/self/fd/%d";
- char buf[sizeof fmt - sizeof "%d" + INT_BUFSIZE_BOUND (int)];
- sprintf (buf, fmt, fd);
- err = chmod (buf, mode) == 0 ? 0 : errno == ENOENT ? -1 : errno;
- }
- else
- err = errno == ENOENT ? -1 : errno;
-
- close (fd);
-
- errno = err;
- if (0 <= err)
- return err == 0 ? 0 : -1;
-# endif
-
- /* O_PATH + /proc is not supported. */
-
- if (0 <= readlinkat (dir, file, readlink_buf, sizeof readlink_buf))
- {
- errno = EOPNOTSUPP;
- return -1;
- }
-# endif
-
- /* Fall back on orig_fchmodat with no flags, despite a possible race. */
- flags = 0;
- }
-# endif
-
- return orig_fchmodat (dir, file, mode, flags);
-}
-#else
-# define AT_FUNC_NAME fchmodat
-# define AT_FUNC_F1 lchmod
-# define AT_FUNC_F2 chmod
-# define AT_FUNC_USE_F1_COND AT_SYMLINK_NOFOLLOW
-# define AT_FUNC_POST_FILE_PARAM_DECLS , mode_t mode, int flag
-# define AT_FUNC_POST_FILE_ARGS , mode
-# include "at-func.c"
-#endif
diff --git a/cross/lib/fcntl.c b/cross/lib/fcntl.c
deleted file mode 100644
index e220800845b..00000000000
--- a/cross/lib/fcntl.c
+++ /dev/null
@@ -1,629 +0,0 @@
-/* Provide file descriptor control.
-
- Copyright (C) 2009-2023 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 <ebb9@byu.net>. */
-
-#include <config.h>
-
-/* Specification. */
-#include <fcntl.h>
-
-#include <errno.h>
-#include <limits.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#ifdef __KLIBC__
-# define INCL_DOS
-# include <os2.h>
-#endif
-
-#if defined _WIN32 && ! defined __CYGWIN__
-/* Get declarations of the native Windows API functions. */
-# define WIN32_LEAN_AND_MEAN
-# include <windows.h>
-
-/* Get _get_osfhandle. */
-# if GNULIB_MSVC_NOTHROW
-# include "msvc-nothrow.h"
-# else
-# include <io.h>
-# endif
-
-/* Upper bound on getdtablesize(). See lib/getdtablesize.c. */
-# define OPEN_MAX_MAX 0x10000
-
-/* Duplicate OLDFD into the first available slot of at least NEWFD,
- which must be positive, with FLAGS determining whether the duplicate
- will be inheritable. */
-static int
-dupfd (int oldfd, int newfd, int flags)
-{
- /* Mingw has no way to create an arbitrary fd. Iterate until all
- file descriptors less than newfd are filled up. */
- HANDLE curr_process = GetCurrentProcess ();
- HANDLE old_handle = (HANDLE) _get_osfhandle (oldfd);
- unsigned char fds_to_close[OPEN_MAX_MAX / CHAR_BIT];
- unsigned int fds_to_close_bound = 0;
- int result;
- BOOL inherit = flags & O_CLOEXEC ? FALSE : TRUE;
- int mode;
-
- if (newfd < 0 || getdtablesize () <= newfd)
- {
- errno = EINVAL;
- return -1;
- }
- if (old_handle == INVALID_HANDLE_VALUE
- || (mode = _setmode (oldfd, O_BINARY)) == -1)
- {
- /* oldfd is not open, or is an unassigned standard file
- descriptor. */
- errno = EBADF;
- return -1;
- }
- _setmode (oldfd, mode);
- flags |= mode;
-
- for (;;)
- {
- HANDLE new_handle;
- int duplicated_fd;
- unsigned int index;
-
- if (!DuplicateHandle (curr_process, /* SourceProcessHandle */
- old_handle, /* SourceHandle */
- curr_process, /* TargetProcessHandle */
- (PHANDLE) &new_handle, /* TargetHandle */
- (DWORD) 0, /* DesiredAccess */
- inherit, /* InheritHandle */
- DUPLICATE_SAME_ACCESS)) /* Options */
- {
- switch (GetLastError ())
- {
- case ERROR_TOO_MANY_OPEN_FILES:
- errno = EMFILE;
- break;
- case ERROR_INVALID_HANDLE:
- case ERROR_INVALID_TARGET_HANDLE:
- case ERROR_DIRECT_ACCESS_HANDLE:
- errno = EBADF;
- break;
- case ERROR_INVALID_PARAMETER:
- case ERROR_INVALID_FUNCTION:
- case ERROR_INVALID_ACCESS:
- errno = EINVAL;
- break;
- default:
- errno = EACCES;
- break;
- }
- result = -1;
- break;
- }
- duplicated_fd = _open_osfhandle ((intptr_t) new_handle, flags);
- if (duplicated_fd < 0)
- {
- CloseHandle (new_handle);
- result = -1;
- break;
- }
- if (newfd <= duplicated_fd)
- {
- result = duplicated_fd;
- break;
- }
-
- /* Set the bit duplicated_fd in fds_to_close[]. */
- index = (unsigned int) duplicated_fd / CHAR_BIT;
- if (fds_to_close_bound <= index)
- {
- if (sizeof fds_to_close <= index)
- /* Need to increase OPEN_MAX_MAX. */
- abort ();
- memset (fds_to_close + fds_to_close_bound, '\0',
- index + 1 - fds_to_close_bound);
- fds_to_close_bound = index + 1;
- }
- fds_to_close[index] |= 1 << ((unsigned int) duplicated_fd % CHAR_BIT);
- }
-
- /* Close the previous fds that turned out to be too small. */
- {
- int saved_errno = errno;
- unsigned int duplicated_fd;
-
- for (duplicated_fd = 0;
- duplicated_fd < fds_to_close_bound * CHAR_BIT;
- duplicated_fd++)
- if ((fds_to_close[duplicated_fd / CHAR_BIT]
- >> (duplicated_fd % CHAR_BIT))
- & 1)
- close (duplicated_fd);
-
- errno = saved_errno;
- }
-
-# if REPLACE_FCHDIR
- if (0 <= result)
- result = _gl_register_dup (oldfd, result);
-# endif
- return result;
-}
-#endif /* W32 */
-
-/* Forward declarations, because we '#undef fcntl' in the middle of this
- compilation unit. */
-/* Our implementation of fcntl (fd, F_DUPFD, target). */
-static int rpl_fcntl_DUPFD (int fd, int target);
-/* Our implementation of fcntl (fd, F_DUPFD_CLOEXEC, target). */
-static int rpl_fcntl_DUPFD_CLOEXEC (int fd, int target);
-#ifdef __KLIBC__
-/* Adds support for fcntl on directories. */
-static int klibc_fcntl (int fd, int action, /* arg */...);
-#endif
-
-
-/* Perform the specified ACTION on the file descriptor FD, possibly
- using the argument ARG further described below. This replacement
- handles the following actions, and forwards all others on to the
- native fcntl. An unrecognized ACTION returns -1 with errno set to
- EINVAL.
-
- F_DUPFD - duplicate FD, with int ARG being the minimum target fd.
- If successful, return the duplicate, which will be inheritable;
- otherwise return -1 and set errno.
-
- F_DUPFD_CLOEXEC - duplicate FD, with int ARG being the minimum
- target fd. If successful, return the duplicate, which will not be
- inheritable; otherwise return -1 and set errno.
-
- F_GETFD - ARG need not be present. If successful, return a
- non-negative value containing the descriptor flags of FD (only
- FD_CLOEXEC is portable, but other flags may be present); otherwise
- return -1 and set errno. */
-
-int
-fcntl (int fd, int action, /* arg */...)
-#undef fcntl
-#ifdef __KLIBC__
-# define fcntl klibc_fcntl
-#endif
-{
- va_list arg;
- int result = -1;
- va_start (arg, action);
- switch (action)
- {
- case F_DUPFD:
- {
- int target = va_arg (arg, int);
- result = rpl_fcntl_DUPFD (fd, target);
- break;
- }
-
- case F_DUPFD_CLOEXEC:
- {
- int target = va_arg (arg, int);
- result = rpl_fcntl_DUPFD_CLOEXEC (fd, target);
- break;
- }
-
-#if !HAVE_FCNTL
- case F_GETFD:
- {
-# if defined _WIN32 && ! defined __CYGWIN__
- HANDLE handle = (HANDLE) _get_osfhandle (fd);
- DWORD flags;
- if (handle == INVALID_HANDLE_VALUE
- || GetHandleInformation (handle, &flags) == 0)
- errno = EBADF;
- else
- result = (flags & HANDLE_FLAG_INHERIT) ? 0 : FD_CLOEXEC;
-# else /* !W32 */
- /* Use dup2 to reject invalid file descriptors. No way to
- access this information, so punt. */
- if (0 <= dup2 (fd, fd))
- result = 0;
-# endif /* !W32 */
- break;
- } /* F_GETFD */
-#endif /* !HAVE_FCNTL */
-
- /* Implementing F_SETFD on mingw is not trivial - there is no
- API for changing the O_NOINHERIT bit on an fd, and merely
- changing the HANDLE_FLAG_INHERIT bit on the underlying handle
- can lead to odd state. It may be possible by duplicating the
- handle, using _open_osfhandle with the right flags, then
- using dup2 to move the duplicate onto the original, but that
- is not supported for now. */
-
- default:
- {
-#if HAVE_FCNTL
- switch (action)
- {
- #ifdef F_BARRIERFSYNC /* macOS */
- case F_BARRIERFSYNC:
- #endif
- #ifdef F_CHKCLEAN /* macOS */
- case F_CHKCLEAN:
- #endif
- #ifdef F_CLOSEM /* NetBSD, HP-UX */
- case F_CLOSEM:
- #endif
- #ifdef F_FLUSH_DATA /* macOS */
- case F_FLUSH_DATA:
- #endif
- #ifdef F_FREEZE_FS /* macOS */
- case F_FREEZE_FS:
- #endif
- #ifdef F_FULLFSYNC /* macOS */
- case F_FULLFSYNC:
- #endif
- #ifdef F_GETCONFINED /* macOS */
- case F_GETCONFINED:
- #endif
- #ifdef F_GETDEFAULTPROTLEVEL /* macOS */
- case F_GETDEFAULTPROTLEVEL:
- #endif
- #ifdef F_GETFD /* POSIX */
- case F_GETFD:
- #endif
- #ifdef F_GETFL /* POSIX */
- case F_GETFL:
- #endif
- #ifdef F_GETLEASE /* Linux */
- case F_GETLEASE:
- #endif
- #ifdef F_GETNOSIGPIPE /* macOS */
- case F_GETNOSIGPIPE:
- #endif
- #ifdef F_GETOWN /* POSIX */
- case F_GETOWN:
- #endif
- #ifdef F_GETPIPE_SZ /* Linux */
- case F_GETPIPE_SZ:
- #endif
- #ifdef F_GETPROTECTIONCLASS /* macOS */
- case F_GETPROTECTIONCLASS:
- #endif
- #ifdef F_GETPROTECTIONLEVEL /* macOS */
- case F_GETPROTECTIONLEVEL:
- #endif
- #ifdef F_GET_SEALS /* Linux */
- case F_GET_SEALS:
- #endif
- #ifdef F_GETSIG /* Linux */
- case F_GETSIG:
- #endif
- #ifdef F_MAXFD /* NetBSD */
- case F_MAXFD:
- #endif
- #ifdef F_RECYCLE /* macOS */
- case F_RECYCLE:
- #endif
- #ifdef F_SETFIFOENH /* HP-UX */
- case F_SETFIFOENH:
- #endif
- #ifdef F_THAW_FS /* macOS */
- case F_THAW_FS:
- #endif
- /* These actions take no argument. */
- result = fcntl (fd, action);
- break;
-
- #ifdef F_ADD_SEALS /* Linux */
- case F_ADD_SEALS:
- #endif
- #ifdef F_BADFD /* Solaris */
- case F_BADFD:
- #endif
- #ifdef F_CHECK_OPENEVT /* macOS */
- case F_CHECK_OPENEVT:
- #endif
- #ifdef F_DUP2FD /* FreeBSD, AIX, Solaris */
- case F_DUP2FD:
- #endif
- #ifdef F_DUP2FD_CLOEXEC /* FreeBSD, Solaris */
- case F_DUP2FD_CLOEXEC:
- #endif
- #ifdef F_DUP2FD_CLOFORK /* Solaris */
- case F_DUP2FD_CLOFORK:
- #endif
- #ifdef F_DUPFD /* POSIX */
- case F_DUPFD:
- #endif
- #ifdef F_DUPFD_CLOEXEC /* POSIX */
- case F_DUPFD_CLOEXEC:
- #endif
- #ifdef F_DUPFD_CLOFORK /* Solaris */
- case F_DUPFD_CLOFORK:
- #endif
- #ifdef F_GETXFL /* Solaris */
- case F_GETXFL:
- #endif
- #ifdef F_GLOBAL_NOCACHE /* macOS */
- case F_GLOBAL_NOCACHE:
- #endif
- #ifdef F_MAKECOMPRESSED /* macOS */
- case F_MAKECOMPRESSED:
- #endif
- #ifdef F_MOVEDATAEXTENTS /* macOS */
- case F_MOVEDATAEXTENTS:
- #endif
- #ifdef F_NOCACHE /* macOS */
- case F_NOCACHE:
- #endif
- #ifdef F_NODIRECT /* macOS */
- case F_NODIRECT:
- #endif
- #ifdef F_NOTIFY /* Linux */
- case F_NOTIFY:
- #endif
- #ifdef F_OPLKACK /* IRIX */
- case F_OPLKACK:
- #endif
- #ifdef F_OPLKREG /* IRIX */
- case F_OPLKREG:
- #endif
- #ifdef F_RDAHEAD /* macOS */
- case F_RDAHEAD:
- #endif
- #ifdef F_SETBACKINGSTORE /* macOS */
- case F_SETBACKINGSTORE:
- #endif
- #ifdef F_SETCONFINED /* macOS */
- case F_SETCONFINED:
- #endif
- #ifdef F_SETFD /* POSIX */
- case F_SETFD:
- #endif
- #ifdef F_SETFL /* POSIX */
- case F_SETFL:
- #endif
- #ifdef F_SETLEASE /* Linux */
- case F_SETLEASE:
- #endif
- #ifdef F_SETNOSIGPIPE /* macOS */
- case F_SETNOSIGPIPE:
- #endif
- #ifdef F_SETOWN /* POSIX */
- case F_SETOWN:
- #endif
- #ifdef F_SETPIPE_SZ /* Linux */
- case F_SETPIPE_SZ:
- #endif
- #ifdef F_SETPROTECTIONCLASS /* macOS */
- case F_SETPROTECTIONCLASS:
- #endif
- #ifdef F_SETSIG /* Linux */
- case F_SETSIG:
- #endif
- #ifdef F_SINGLE_WRITER /* macOS */
- case F_SINGLE_WRITER:
- #endif
- /* These actions take an 'int' argument. */
- {
- int x = va_arg (arg, int);
- result = fcntl (fd, action, x);
- }
- break;
-
- default:
- /* Other actions take a pointer argument. */
- {
- void *p = va_arg (arg, void *);
- result = fcntl (fd, action, p);
- }
- break;
- }
-#else
- errno = EINVAL;
-#endif
- break;
- }
- }
- va_end (arg);
- return result;
-}
-
-static int
-rpl_fcntl_DUPFD (int fd, int target)
-{
- int result;
-#if !HAVE_FCNTL
- result = dupfd (fd, target, 0);
-#elif FCNTL_DUPFD_BUGGY || REPLACE_FCHDIR
- /* Detect invalid target; needed for cygwin 1.5.x. */
- if (target < 0 || getdtablesize () <= target)
- {
- result = -1;
- errno = EINVAL;
- }
- else
- {
- /* Haiku alpha 2 loses fd flags on original. */
- int flags = fcntl (fd, F_GETFD);
- if (flags < 0)
- result = -1;
- else
- {
- result = fcntl (fd, F_DUPFD, target);
- if (0 <= result && fcntl (fd, F_SETFD, flags) == -1)
- {
- int saved_errno = errno;
- close (result);
- result = -1;
- errno = saved_errno;
- }
-# if REPLACE_FCHDIR
- if (0 <= result)
- result = _gl_register_dup (fd, result);
-# endif
- }
- }
-#else
- result = fcntl (fd, F_DUPFD, target);
-#endif
- return result;
-}
-
-static int
-rpl_fcntl_DUPFD_CLOEXEC (int fd, int target)
-{
- int result;
-#if !HAVE_FCNTL
- result = dupfd (fd, target, O_CLOEXEC);
-#else /* HAVE_FCNTL */
-# if defined __NetBSD__ || defined __HAIKU__
- /* On NetBSD 9.0, the system fcntl (fd, F_DUPFD_CLOEXEC, target)
- has only the same effect as fcntl (fd, F_DUPFD, target). */
- /* On Haiku, the system fcntl (fd, F_DUPFD_CLOEXEC, target) sets
- the FD_CLOEXEC flag on fd, not on target. Therefore avoid the
- system fcntl in this case. */
-# define have_dupfd_cloexec -1
-# else
- /* Try the system call first, if the headers claim it exists
- (that is, if GNULIB_defined_F_DUPFD_CLOEXEC is 0), since we
- may be running with a glibc that has the macro but with an
- older kernel that does not support it. Cache the
- information on whether the system call really works, but
- avoid caching failure if the corresponding F_DUPFD fails
- for any reason. 0 = unknown, 1 = yes, -1 = no. */
- static int have_dupfd_cloexec = GNULIB_defined_F_DUPFD_CLOEXEC ? -1 : 0;
- if (0 <= have_dupfd_cloexec)
- {
- result = fcntl (fd, F_DUPFD_CLOEXEC, target);
- if (0 <= result || errno != EINVAL)
- {
- have_dupfd_cloexec = 1;
-# if REPLACE_FCHDIR
- if (0 <= result)
- result = _gl_register_dup (fd, result);
-# endif
- }
- else
- {
- result = rpl_fcntl_DUPFD (fd, target);
- if (result >= 0)
- have_dupfd_cloexec = -1;
- }
- }
- else
-# endif
- result = rpl_fcntl_DUPFD (fd, target);
- if (0 <= result && have_dupfd_cloexec == -1)
- {
- int flags = fcntl (result, F_GETFD);
- if (flags < 0 || fcntl (result, F_SETFD, flags | FD_CLOEXEC) == -1)
- {
- int saved_errno = errno;
- close (result);
- errno = saved_errno;
- result = -1;
- }
- }
-#endif /* HAVE_FCNTL */
- return result;
-}
-
-#undef fcntl
-
-#ifdef __KLIBC__
-
-static int
-klibc_fcntl (int fd, int action, /* arg */...)
-{
- va_list arg_ptr;
- int arg;
- struct stat sbuf;
- int result;
-
- va_start (arg_ptr, action);
- arg = va_arg (arg_ptr, int);
- result = fcntl (fd, action, arg);
- /* EPERM for F_DUPFD, ENOTSUP for others */
- if (result == -1 && (errno == EPERM || errno == ENOTSUP)
- && !fstat (fd, &sbuf) && S_ISDIR (sbuf.st_mode))
- {
- ULONG ulMode;
-
- switch (action)
- {
- case F_DUPFD:
- /* Find available fd */
- while (fcntl (arg, F_GETFL) != -1 || errno != EBADF)
- arg++;
-
- result = dup2 (fd, arg);
- break;
-
- /* Using underlying APIs is right ? */
- case F_GETFD:
- if (DosQueryFHState (fd, &ulMode))
- break;
-
- result = (ulMode & OPEN_FLAGS_NOINHERIT) ? FD_CLOEXEC : 0;
- break;
-
- case F_SETFD:
- if (arg & ~FD_CLOEXEC)
- break;
-
- if (DosQueryFHState (fd, &ulMode))
- break;
-
- if (arg & FD_CLOEXEC)
- ulMode |= OPEN_FLAGS_NOINHERIT;
- else
- ulMode &= ~OPEN_FLAGS_NOINHERIT;
-
- /* Filter supported flags. */
- ulMode &= (OPEN_FLAGS_WRITE_THROUGH | OPEN_FLAGS_FAIL_ON_ERROR
- | OPEN_FLAGS_NO_CACHE | OPEN_FLAGS_NOINHERIT);
-
- if (DosSetFHState (fd, ulMode))
- break;
-
- result = 0;
- break;
-
- case F_GETFL:
- result = 0;
- break;
-
- case F_SETFL:
- if (arg != 0)
- break;
-
- result = 0;
- break;
-
- default:
- errno = EINVAL;
- break;
- }
- }
-
- va_end (arg_ptr);
-
- return result;
-}
-
-#endif
diff --git a/cross/lib/fcntl.in.h b/cross/lib/fcntl.in.h
deleted file mode 100644
index e034eaf9f5a..00000000000
--- a/cross/lib/fcntl.in.h
+++ /dev/null
@@ -1,445 +0,0 @@
-/* Like <fcntl.h>, but with non-working flags defined to 0.
-
- Copyright (C) 2006-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* written by Paul Eggert */
-
-#if __GNUC__ >= 3
-@PRAGMA_SYSTEM_HEADER@
-#endif
-@PRAGMA_COLUMNS@
-
-#if defined __need_system_fcntl_h
-/* Special invocation convention. */
-
-/* Needed before <sys/stat.h>.
- May also define off_t to a 64-bit type on native Windows. */
-#include <sys/types.h>
-/* On some systems other than glibc, <sys/stat.h> is a prerequisite of
- <fcntl.h>. On glibc systems, we would like to avoid namespace pollution.
- But on glibc systems, <fcntl.h> includes <sys/stat.h> inside an
- extern "C" { ... } block, which leads to errors in C++ mode with the
- overridden <sys/stat.h> from gnulib. These errors are known to be gone
- with g++ version >= 4.3. */
-#if !(defined __GLIBC__ || defined __UCLIBC__) || (defined __cplusplus && defined GNULIB_NAMESPACE && (defined __ICC || !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))))
-# include <sys/stat.h>
-#endif
-#@INCLUDE_NEXT@ @NEXT_FCNTL_H@
-
-/* Native Windows platforms declare open(), creat() in <io.h>. */
-#if (@GNULIB_CREAT@ || @GNULIB_OPEN@ || defined GNULIB_POSIXCHECK) \
- && (defined _WIN32 && ! defined __CYGWIN__)
-# include <io.h>
-#endif
-
-#else
-/* Normal invocation convention. */
-
-#ifndef _@GUARD_PREFIX@_FCNTL_H
-
-/* Needed before <sys/stat.h>.
- May also define off_t to a 64-bit type on native Windows. */
-#include <sys/types.h>
-/* On some systems other than glibc, <sys/stat.h> is a prerequisite of
- <fcntl.h>. On glibc systems, we would like to avoid namespace pollution.
- But on glibc systems, <fcntl.h> includes <sys/stat.h> inside an
- extern "C" { ... } block, which leads to errors in C++ mode with the
- overridden <sys/stat.h> from gnulib. These errors are known to be gone
- with g++ version >= 4.3. */
-#if !(defined __GLIBC__ || defined __UCLIBC__) || (defined __cplusplus && defined GNULIB_NAMESPACE && (defined __ICC || !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))))
-# include <sys/stat.h>
-#endif
-/* The include_next requires a split double-inclusion guard. */
-#@INCLUDE_NEXT@ @NEXT_FCNTL_H@
-
-/* Native Windows platforms declare open(), creat() in <io.h>. */
-#if (@GNULIB_CREAT@ || @GNULIB_OPEN@ || defined GNULIB_POSIXCHECK) \
- && (defined _WIN32 && ! defined __CYGWIN__)
-# include <io.h>
-#endif
-
-#ifndef _@GUARD_PREFIX@_FCNTL_H
-#define _@GUARD_PREFIX@_FCNTL_H
-
-#ifndef __GLIBC__ /* Avoid namespace pollution on glibc systems. */
-# include <unistd.h>
-#endif
-
-
-/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
-
-/* The definition of _GL_ARG_NONNULL is copied here. */
-
-/* The definition of _GL_WARN_ON_USE is copied here. */
-
-
-/* Declare overridden functions. */
-
-#if @GNULIB_CREAT@
-# if @REPLACE_CREAT@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef creat
-# define creat rpl_creat
-# endif
-_GL_FUNCDECL_RPL (creat, int, (const char *filename, mode_t mode)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (creat, int, (const char *filename, mode_t mode));
-# elif defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef creat
-# define creat _creat
-# endif
-_GL_CXXALIAS_MDA (creat, int, (const char *filename, mode_t mode));
-# else
-_GL_CXXALIAS_SYS (creat, int, (const char *filename, mode_t mode));
-# endif
-_GL_CXXALIASWARN (creat);
-#elif defined GNULIB_POSIXCHECK
-# undef creat
-/* Assume creat is always declared. */
-_GL_WARN_ON_USE (creat, "creat is not always POSIX compliant - "
- "use gnulib module creat for portability");
-#elif @GNULIB_MDA_CREAT@
-/* On native Windows, map 'creat' to '_creat', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::creat always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef creat
-# define creat _creat
-# endif
-/* Need to cast, because in mingw the last argument is 'int mode'. */
-_GL_CXXALIAS_MDA_CAST (creat, int, (const char *filename, mode_t mode));
-# else
-_GL_CXXALIAS_SYS (creat, int, (const char *filename, mode_t mode));
-# endif
-_GL_CXXALIASWARN (creat);
-#endif
-
-#if @GNULIB_FCNTL@
-# if @REPLACE_FCNTL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fcntl
-# define fcntl rpl_fcntl
-# endif
-_GL_FUNCDECL_RPL (fcntl, int, (int fd, int action, ...));
-_GL_CXXALIAS_RPL (fcntl, int, (int fd, int action, ...));
-# if !GNULIB_defined_rpl_fcntl
-# define GNULIB_defined_rpl_fcntl 1
-# endif
-# else
-# if !@HAVE_FCNTL@
-_GL_FUNCDECL_SYS (fcntl, int, (int fd, int action, ...));
-# if !GNULIB_defined_fcntl
-# define GNULIB_defined_fcntl 1
-# endif
-# endif
-_GL_CXXALIAS_SYS (fcntl, int, (int fd, int action, ...));
-# endif
-_GL_CXXALIASWARN (fcntl);
-#elif defined GNULIB_POSIXCHECK
-# undef fcntl
-# if HAVE_RAW_DECL_FCNTL
-_GL_WARN_ON_USE (fcntl, "fcntl is not always POSIX compliant - "
- "use gnulib module fcntl for portability");
-# endif
-#endif
-
-#if @GNULIB_OPEN@
-# if @REPLACE_OPEN@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef open
-# define open rpl_open
-# endif
-_GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
-# elif defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef open
-# define open _open
-# endif
-_GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
-# else
-_GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
-# endif
-/* On HP-UX 11, in C++ mode, open() is defined as an inline function with a
- default argument. _GL_CXXALIASWARN does not work in this case. */
-# if !defined __hpux
-_GL_CXXALIASWARN (open);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef open
-/* Assume open is always declared. */
-_GL_WARN_ON_USE (open, "open is not always POSIX compliant - "
- "use gnulib module open for portability");
-#elif @GNULIB_MDA_OPEN@
-/* On native Windows, map 'open' to '_open', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::open always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef open
-# define open _open
-# endif
-_GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
-# else
-_GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
-# endif
-# if !defined __hpux
-_GL_CXXALIASWARN (open);
-# endif
-#endif
-
-#if @GNULIB_OPENAT@
-# if @REPLACE_OPENAT@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef openat
-# define openat rpl_openat
-# endif
-_GL_FUNCDECL_RPL (openat, int,
- (int fd, char const *file, int flags, /* mode_t mode */ ...)
- _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (openat, int,
- (int fd, char const *file, int flags, /* mode_t mode */ ...));
-# else
-# if !@HAVE_OPENAT@
-_GL_FUNCDECL_SYS (openat, int,
- (int fd, char const *file, int flags, /* mode_t mode */ ...)
- _GL_ARG_NONNULL ((2)));
-# endif
-_GL_CXXALIAS_SYS (openat, int,
- (int fd, char const *file, int flags, /* mode_t mode */ ...));
-# endif
-_GL_CXXALIASWARN (openat);
-#elif defined GNULIB_POSIXCHECK
-# undef openat
-# if HAVE_RAW_DECL_OPENAT
-_GL_WARN_ON_USE (openat, "openat is not portable - "
- "use gnulib module openat for portability");
-# endif
-#endif
-
-
-/* Fix up the FD_* macros, only known to be missing on mingw. */
-
-#ifndef FD_CLOEXEC
-# define FD_CLOEXEC 1
-#endif
-
-/* Fix up the supported F_* macros. Intentionally leave other F_*
- macros undefined. Only known to be missing on mingw. */
-
-#ifndef F_DUPFD_CLOEXEC
-# define F_DUPFD_CLOEXEC 0x40000000
-/* Witness variable: 1 if gnulib defined F_DUPFD_CLOEXEC, 0 otherwise. */
-# define GNULIB_defined_F_DUPFD_CLOEXEC 1
-#else
-# define GNULIB_defined_F_DUPFD_CLOEXEC 0
-#endif
-
-#ifndef F_DUPFD
-# define F_DUPFD 1
-#endif
-
-#ifndef F_GETFD
-# define F_GETFD 2
-#endif
-
-/* Fix up the O_* macros. */
-
-/* AIX 7.1 with XL C 12.1 defines O_CLOEXEC, O_NOFOLLOW, and O_TTY_INIT
- to values outside 'int' range, so omit these misdefinitions.
- But avoid namespace pollution on non-AIX systems. */
-#ifdef _AIX
-# include <limits.h>
-# if defined O_CLOEXEC && ! (INT_MIN <= O_CLOEXEC && O_CLOEXEC <= INT_MAX)
-# undef O_CLOEXEC
-# endif
-# if defined O_NOFOLLOW && ! (INT_MIN <= O_NOFOLLOW && O_NOFOLLOW <= INT_MAX)
-# undef O_NOFOLLOW
-# endif
-# if defined O_TTY_INIT && ! (INT_MIN <= O_TTY_INIT && O_TTY_INIT <= INT_MAX)
-# undef O_TTY_INIT
-# endif
-#endif
-
-#if !defined O_DIRECT && defined O_DIRECTIO
-/* Tru64 spells it 'O_DIRECTIO'. */
-# define O_DIRECT O_DIRECTIO
-#endif
-
-#if !defined O_CLOEXEC && defined O_NOINHERIT
-/* Mingw spells it 'O_NOINHERIT'. */
-# define O_CLOEXEC O_NOINHERIT
-#endif
-
-#ifndef O_CLOEXEC
-# define O_CLOEXEC 0x40000000 /* Try to not collide with system O_* flags. */
-# define GNULIB_defined_O_CLOEXEC 1
-#else
-# define GNULIB_defined_O_CLOEXEC 0
-#endif
-
-#ifndef O_DIRECT
-# define O_DIRECT 0
-#endif
-
-#ifndef O_DIRECTORY
-# define O_DIRECTORY 0
-#endif
-
-#ifndef O_DSYNC
-# define O_DSYNC 0
-#endif
-
-#ifndef O_EXEC
-# define O_EXEC O_RDONLY /* This is often close enough in older systems. */
-#endif
-
-#ifndef O_IGNORE_CTTY
-# define O_IGNORE_CTTY 0
-#endif
-
-#ifndef O_NDELAY
-# define O_NDELAY 0
-#endif
-
-#ifndef O_NOATIME
-# define O_NOATIME 0
-#endif
-
-#ifndef O_NONBLOCK
-# define O_NONBLOCK O_NDELAY
-#endif
-
-/* If the gnulib module 'nonblocking' is in use, guarantee a working non-zero
- value of O_NONBLOCK. Otherwise, O_NONBLOCK is defined (above) to O_NDELAY
- or to 0 as fallback. */
-#if @GNULIB_NONBLOCKING@
-# if O_NONBLOCK
-# define GNULIB_defined_O_NONBLOCK 0
-# else
-# define GNULIB_defined_O_NONBLOCK 1
-# undef O_NONBLOCK
-# define O_NONBLOCK 0x40000000
-# endif
-#endif
-
-#ifndef O_NOCTTY
-# define O_NOCTTY 0
-#endif
-
-#ifndef O_NOFOLLOW
-# define O_NOFOLLOW 0
-#endif
-
-#ifndef O_NOLINK
-# define O_NOLINK 0
-#endif
-
-#ifndef O_NOLINKS
-# define O_NOLINKS 0
-#endif
-
-#ifndef O_NOTRANS
-# define O_NOTRANS 0
-#endif
-
-#ifndef O_RSYNC
-# define O_RSYNC 0
-#endif
-
-#ifndef O_SEARCH
-# define O_SEARCH O_RDONLY /* This is often close enough in older systems. */
-#endif
-
-#ifndef O_SYNC
-# define O_SYNC 0
-#endif
-
-#ifndef O_TTY_INIT
-# define O_TTY_INIT 0
-#endif
-
-#if ~O_ACCMODE & (O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH)
-# undef O_ACCMODE
-# define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH)
-#endif
-
-/* For systems that distinguish between text and binary I/O.
- O_BINARY is usually declared in fcntl.h */
-#if !defined O_BINARY && defined _O_BINARY
- /* For MSC-compatible compilers. */
-# define O_BINARY _O_BINARY
-# define O_TEXT _O_TEXT
-#endif
-
-#if defined __BEOS__ || defined __HAIKU__
- /* BeOS 5 and Haiku have O_BINARY and O_TEXT, but they have no effect. */
-# undef O_BINARY
-# undef O_TEXT
-#endif
-
-#ifndef O_BINARY
-# define O_BINARY 0
-# define O_TEXT 0
-#endif
-
-/* Fix up the AT_* macros. */
-
-/* Work around a bug in Solaris 9 and 10: AT_FDCWD is positive. Its
- value exceeds INT_MAX, so its use as an int doesn't conform to the
- C standard, and GCC and Sun C complain in some cases. If the bug
- is present, undef AT_FDCWD here, so it can be redefined below. */
-#if 0 < AT_FDCWD && AT_FDCWD == 0xffd19553
-# undef AT_FDCWD
-#endif
-
-/* Use the same bit pattern as Solaris 9, but with the proper
- signedness. The bit pattern is important, in case this actually is
- Solaris with the above workaround. */
-#ifndef AT_FDCWD
-# define AT_FDCWD (-3041965)
-#endif
-
-/* Use the same values as Solaris 9. This shouldn't matter, but
- there's no real reason to differ. */
-#ifndef AT_SYMLINK_NOFOLLOW
-# define AT_SYMLINK_NOFOLLOW 4096
-#endif
-
-#ifndef AT_REMOVEDIR
-# define AT_REMOVEDIR 1
-#endif
-
-/* Solaris 9 lacks these two, so just pick unique values. */
-#ifndef AT_SYMLINK_FOLLOW
-# define AT_SYMLINK_FOLLOW 2
-#endif
-
-#ifndef AT_EACCESS
-# define AT_EACCESS 4
-#endif
-
-/* Ignore this flag if not supported. */
-#ifndef AT_NO_AUTOMOUNT
-# define AT_NO_AUTOMOUNT 0
-#endif
-
-#endif /* _@GUARD_PREFIX@_FCNTL_H */
-#endif /* _@GUARD_PREFIX@_FCNTL_H */
-#endif
diff --git a/cross/lib/fdopendir.c b/cross/lib/fdopendir.c
deleted file mode 100644
index aa841e3e819..00000000000
--- a/cross/lib/fdopendir.c
+++ /dev/null
@@ -1,249 +0,0 @@
-/* provide a replacement fdopendir function
- Copyright (C) 2004-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* written by Jim Meyering */
-
-#include <config.h>
-
-#include <dirent.h>
-
-#include <stdlib.h>
-#include <unistd.h>
-
-#if !HAVE_FDOPENDIR
-
-# include "openat.h"
-# include "openat-priv.h"
-# include "save-cwd.h"
-
-# if GNULIB_DIRENT_SAFER
-# include "dirent--.h"
-# endif
-
-# ifndef REPLACE_FCHDIR
-# define REPLACE_FCHDIR 0
-# endif
-
-static DIR *fdopendir_with_dup (int, int, struct saved_cwd const *);
-static DIR *fd_clone_opendir (int, struct saved_cwd const *);
-
-/* Replacement for POSIX fdopendir.
-
- First, try to simulate it via opendir ("/proc/self/fd/..."). Failing
- that, simulate it by using fchdir metadata, or by doing
- save_cwd/fchdir/opendir(".")/restore_cwd.
- If either the save_cwd or the restore_cwd fails (relatively unlikely),
- then give a diagnostic and exit nonzero.
-
- If successful, the resulting stream is based on FD in
- implementations where streams are based on file descriptors and in
- applications where no other thread or signal handler allocates or
- frees file descriptors. In other cases, consult dirfd on the result
- to find out whether FD is still being used.
-
- Otherwise, this function works just like POSIX fdopendir.
-
- W A R N I N G:
-
- Unlike other fd-related functions, this one places constraints on FD.
- If this function returns successfully, FD is under control of the
- dirent.h system, and the caller should not close or modify the state of
- FD other than by the dirent.h functions. */
-# ifdef __KLIBC__
-# include <InnoTekLIBC/backend.h>
-
-DIR *
-fdopendir (int fd)
-{
- char path[_MAX_PATH];
- DIR *dirp;
-
- /* Get a path from fd */
- if (__libc_Back_ioFHToPath (fd, path, sizeof (path)))
- return NULL;
-
- dirp = opendir (path);
- if (!dirp)
- return NULL;
-
- /* Unregister fd registered by opendir() */
- _gl_unregister_dirp_fd (dirfd (dirp));
-
- /* Register our fd */
- if (_gl_register_dirp_fd (fd, dirp))
- {
- int saved_errno = errno;
-
- closedir (dirp);
-
- errno = saved_errno;
-
- dirp = NULL;
- }
-
- return dirp;
-}
-# else
-DIR *
-fdopendir (int fd)
-{
- DIR *dir = fdopendir_with_dup (fd, -1, NULL);
-
- if (! REPLACE_FCHDIR && ! dir)
- {
- int saved_errno = errno;
- if (EXPECTED_ERRNO (saved_errno))
- {
- struct saved_cwd cwd;
- if (save_cwd (&cwd) != 0)
- openat_save_fail (errno);
- dir = fdopendir_with_dup (fd, -1, &cwd);
- saved_errno = errno;
- free_cwd (&cwd);
- errno = saved_errno;
- }
- }
-
- return dir;
-}
-# endif
-
-/* Like fdopendir, except that if OLDER_DUPFD is not -1, it is known
- to be a dup of FD which is less than FD - 1 and which will be
- closed by the caller and not otherwise used by the caller. This
- function makes sure that FD is closed and all file descriptors less
- than FD are open, and then calls fd_clone_opendir on a dup of FD.
- That way, barring race conditions, fd_clone_opendir returns a
- stream whose file descriptor is FD.
-
- If REPLACE_FCHDIR or CWD is null, use opendir ("/proc/self/fd/...",
- falling back on fchdir metadata. Otherwise, CWD is a saved version
- of the working directory; use fchdir/opendir(".")/restore_cwd(CWD). */
-static DIR *
-fdopendir_with_dup (int fd, int older_dupfd, struct saved_cwd const *cwd)
-{
- int dupfd = dup (fd);
- if (dupfd < 0 && errno == EMFILE)
- dupfd = older_dupfd;
- if (dupfd < 0)
- return NULL;
- else
- {
- DIR *dir;
- int saved_errno;
- if (dupfd < fd - 1 && dupfd != older_dupfd)
- {
- dir = fdopendir_with_dup (fd, dupfd, cwd);
- saved_errno = errno;
- }
- else
- {
- close (fd);
- dir = fd_clone_opendir (dupfd, cwd);
- saved_errno = errno;
- if (! dir)
- {
- int fd1 = dup (dupfd);
- if (fd1 != fd)
- openat_save_fail (fd1 < 0 ? errno : EBADF);
- }
- }
-
- if (dupfd != older_dupfd)
- close (dupfd);
- errno = saved_errno;
- return dir;
- }
-}
-
-/* Like fdopendir, except the result controls a clone of FD. It is
- the caller's responsibility both to close FD and (if the result is
- not null) to closedir the result. */
-static DIR *
-fd_clone_opendir (int fd, struct saved_cwd const *cwd)
-{
- if (REPLACE_FCHDIR || ! cwd)
- {
- DIR *dir = NULL;
- int saved_errno = EOPNOTSUPP;
- char buf[OPENAT_BUFFER_SIZE];
- char *proc_file = openat_proc_name (buf, fd, ".");
- if (proc_file)
- {
- dir = opendir (proc_file);
- saved_errno = errno;
- if (proc_file != buf)
- free (proc_file);
- }
-# if REPLACE_FCHDIR
- if (! dir && EXPECTED_ERRNO (saved_errno))
- {
- char const *name = _gl_directory_name (fd);
- DIR *dp = name ? opendir (name) : NULL;
-
- /* The caller has done an elaborate dance to arrange for opendir to
- consume just the right file descriptor. If dirfd returns -1,
- though, we're on a system like mingw where opendir does not
- consume a file descriptor. Consume it via 'dup' instead. */
- if (dp && dirfd (dp) < 0)
- dup (fd);
-
- return dp;
- }
-# endif
- errno = saved_errno;
- return dir;
- }
- else
- {
- if (fchdir (fd) != 0)
- return NULL;
- else
- {
- DIR *dir = opendir (".");
- int saved_errno = errno;
- if (restore_cwd (cwd) != 0)
- openat_restore_fail (errno);
- errno = saved_errno;
- return dir;
- }
- }
-}
-
-#else /* HAVE_FDOPENDIR */
-
-# include <errno.h>
-# include <sys/stat.h>
-
-# undef fdopendir
-
-/* Like fdopendir, but work around GNU/Hurd bug by validating FD. */
-
-DIR *
-rpl_fdopendir (int fd)
-{
- struct stat st;
- if (fstat (fd, &st))
- return NULL;
- if (!S_ISDIR (st.st_mode))
- {
- errno = ENOTDIR;
- return NULL;
- }
- return fdopendir (fd);
-}
-
-#endif /* HAVE_FDOPENDIR */
diff --git a/cross/lib/file-has-acl.c b/cross/lib/file-has-acl.c
deleted file mode 100644
index b31a2ea2523..00000000000
--- a/cross/lib/file-has-acl.c
+++ /dev/null
@@ -1,621 +0,0 @@
-/* Test whether a file has a nontrivial ACL. -*- coding: utf-8 -*-
-
- Copyright (C) 2002-2003, 2005-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>.
-
- Written by Paul Eggert, Andreas Grünbacher, and Bruno Haible. */
-
-/* Without this pragma, gcc 4.7.0 20120126 may suggest that the
- file_has_acl function might be candidate for attribute 'const' */
-#if (__GNUC__ == 4 && 6 <= __GNUC_MINOR__) || 4 < __GNUC__
-# pragma GCC diagnostic ignored "-Wsuggest-attribute=const"
-#endif
-
-#include <config.h>
-
-#include "acl.h"
-
-#include "acl-internal.h"
-
-#if USE_ACL && GETXATTR_WITH_POSIX_ACLS
-# include <string.h>
-# include <arpa/inet.h>
-# include <sys/xattr.h>
-# include <linux/xattr.h>
-# ifndef XATTR_NAME_NFSV4_ACL
-# define XATTR_NAME_NFSV4_ACL "system.nfs4_acl"
-# endif
-
-enum {
- /* ACE4_ACCESS_ALLOWED_ACE_TYPE = 0x00000000, */
- ACE4_ACCESS_DENIED_ACE_TYPE = 0x00000001,
- ACE4_IDENTIFIER_GROUP = 0x00000040
-};
-
-/* Return 1 if given ACL in XDR format is non-trivial, 0 if it is trivial.
- -1 upon failure to determine it. Possibly change errno. Assume that
- the ACL is valid, except avoid undefined behavior even if invalid.
-
- See <https://linux.die.net/man/5/nfs4_acl>. The NFSv4 acls are
- defined in Internet RFC 7530 and as such, every NFSv4 server
- supporting ACLs should support NFSv4 ACLs (they differ from from
- POSIX draft ACLs). The ACLs can be obtained via the
- nfsv4-acl-tools, e.g., the nfs4_getfacl command. Gnulib provides
- only basic support of NFSv4 ACLs, i.e., recognize trivial vs
- nontrivial ACLs. */
-
-static int
-acl_nfs4_nontrivial (uint32_t *xattr, ssize_t nbytes)
-{
- enum { BYTES_PER_NETWORK_UINT = 4};
-
- /* Grab the number of aces in the acl. */
- nbytes -= BYTES_PER_NETWORK_UINT;
- if (nbytes < 0)
- return -1;
- uint32_t num_aces = ntohl (*xattr++);
- if (6 < num_aces)
- return 1;
- int ace_found = 0;
-
- for (int ace_n = 0; ace_n < num_aces; ace_n++)
- {
- /* Get the acl type and flag. Skip the mask; it's too risky to
- test it and it does not seem to be needed. Get the wholen. */
- nbytes -= 4 * BYTES_PER_NETWORK_UINT;
- if (nbytes < 0)
- return -1;
- uint32_t type = ntohl (xattr[0]);
- uint32_t flag = ntohl (xattr[1]);
- uint32_t wholen = ntohl (xattr[3]);
- xattr += 4;
- int whowords = (wholen / BYTES_PER_NETWORK_UINT
- + (wholen % BYTES_PER_NETWORK_UINT != 0));
- int64_t wholen4 = whowords;
- wholen4 *= BYTES_PER_NETWORK_UINT;
-
- /* Trivial ACLs have only ACE4_ACCESS_ALLOWED_ACE_TYPE or
- ACE4_ACCESS_DENIED_ACE_TYPE. */
- if (ACE4_ACCESS_DENIED_ACE_TYPE < type)
- return 1;
-
- /* RFC 7530 says FLAG should be 0, but be generous to NetApp and
- also accept the group flag. */
- if (flag & ~ACE4_IDENTIFIER_GROUP)
- return 1;
-
- /* Get the who string. Check NBYTES - WHOLEN4 before storing
- into NBYTES, to avoid truncation on conversion. */
- if (nbytes - wholen4 < 0)
- return -1;
- nbytes -= wholen4;
-
- /* For a trivial ACL, max 6 (typically 3) ACEs, 3 allow, 3 deny.
- Check that there is at most one ACE of each TYPE and WHO. */
- int who2
- = (wholen == 6 && memcmp (xattr, "OWNER@", 6) == 0 ? 0
- : wholen == 6 && memcmp (xattr, "GROUP@", 6) == 0 ? 2
- : wholen == 9 && memcmp (xattr, "EVERYONE@", 9) == 0 ? 4
- : -1);
- if (who2 < 0)
- return 1;
- int ace_found_bit = 1 << (who2 | type);
- if (ace_found & ace_found_bit)
- return 1;
- ace_found |= ace_found_bit;
-
- xattr += whowords;
- }
-
- return 0;
-}
-#endif
-
-/* Return 1 if NAME has a nontrivial access control list,
- 0 if ACLs are not supported, or if NAME has no or only a base ACL,
- and -1 (setting errno) on error. Note callers can determine
- if ACLs are not supported as errno is set in that case also.
- SB must be set to the stat buffer of NAME,
- obtained through stat() or lstat(). */
-
-int
-file_has_acl (char const *name, struct stat const *sb)
-{
-#if USE_ACL
- if (! S_ISLNK (sb->st_mode))
- {
-
-# if GETXATTR_WITH_POSIX_ACLS
-
- ssize_t ret;
- int initial_errno = errno;
-
- ret = getxattr (name, XATTR_NAME_POSIX_ACL_ACCESS, NULL, 0);
- if (ret < 0 && errno == ENODATA)
- ret = 0;
- else if (ret > 0)
- return 1;
-
- if (ret == 0 && S_ISDIR (sb->st_mode))
- {
- ret = getxattr (name, XATTR_NAME_POSIX_ACL_DEFAULT, NULL, 0);
- if (ret < 0 && errno == ENODATA)
- ret = 0;
- else if (ret > 0)
- return 1;
- }
-
- if (ret < 0)
- {
- /* Check for NFSv4 ACLs. The max length of a trivial
- ACL is 6 words for owner, 6 for group, 7 for everyone,
- all times 2 because there are both allow and deny ACEs.
- There are 6 words for owner because of type, flag, mask,
- wholen, "OWNER@"+pad and similarly for group; everyone is
- another word to hold "EVERYONE@". */
- uint32_t xattr[2 * (6 + 6 + 7)];
-
- ret = getxattr (name, XATTR_NAME_NFSV4_ACL, xattr, sizeof xattr);
- if (ret < 0)
- switch (errno)
- {
- case ENODATA: return 0;
- case ERANGE : return 1; /* ACL must be nontrivial. */
- }
- else
- {
- /* It looks like a trivial ACL, but investigate further. */
- ret = acl_nfs4_nontrivial (xattr, ret);
- if (ret < 0)
- {
- errno = EINVAL;
- return ret;
- }
- errno = initial_errno;
- }
- }
- if (ret < 0)
- return - acl_errno_valid (errno);
- return ret;
-
-# elif HAVE_ACL_GET_FILE
-
- /* POSIX 1003.1e (draft 17 -- abandoned) specific version. */
- /* Linux, FreeBSD, Mac OS X, IRIX, Tru64, Cygwin >= 2.5 */
- int ret;
-
- if (HAVE_ACL_EXTENDED_FILE) /* Linux */
- {
- /* On Linux, acl_extended_file is an optimized function: It only
- makes two calls to getxattr(), one for ACL_TYPE_ACCESS, one for
- ACL_TYPE_DEFAULT. */
- ret = acl_extended_file (name);
- }
- else /* FreeBSD, Mac OS X, IRIX, Tru64, Cygwin >= 2.5 */
- {
-# if HAVE_ACL_TYPE_EXTENDED /* Mac OS X */
- /* On Mac OS X, acl_get_file (name, ACL_TYPE_ACCESS)
- and acl_get_file (name, ACL_TYPE_DEFAULT)
- always return NULL / EINVAL. There is no point in making
- these two useless calls. The real ACL is retrieved through
- acl_get_file (name, ACL_TYPE_EXTENDED). */
- acl_t acl = acl_get_file (name, ACL_TYPE_EXTENDED);
- if (acl)
- {
- ret = acl_extended_nontrivial (acl);
- acl_free (acl);
- }
- else
- ret = -1;
-# else /* FreeBSD, IRIX, Tru64, Cygwin >= 2.5 */
- acl_t acl = acl_get_file (name, ACL_TYPE_ACCESS);
- if (acl)
- {
- int saved_errno;
-
- ret = acl_access_nontrivial (acl);
- saved_errno = errno;
- acl_free (acl);
- errno = saved_errno;
-# if HAVE_ACL_FREE_TEXT /* Tru64 */
- /* On OSF/1, acl_get_file (name, ACL_TYPE_DEFAULT) always
- returns NULL with errno not set. There is no point in
- making this call. */
-# else /* FreeBSD, IRIX, Cygwin >= 2.5 */
- /* On Linux, FreeBSD, IRIX, acl_get_file (name, ACL_TYPE_ACCESS)
- and acl_get_file (name, ACL_TYPE_DEFAULT) on a directory
- either both succeed or both fail; it depends on the
- file system. Therefore there is no point in making the second
- call if the first one already failed. */
- if (ret == 0 && S_ISDIR (sb->st_mode))
- {
- acl = acl_get_file (name, ACL_TYPE_DEFAULT);
- if (acl)
- {
-# ifdef __CYGWIN__ /* Cygwin >= 2.5 */
- ret = acl_access_nontrivial (acl);
- saved_errno = errno;
- acl_free (acl);
- errno = saved_errno;
-# else
- ret = (0 < acl_entries (acl));
- acl_free (acl);
-# endif
- }
- else
- ret = -1;
- }
-# endif
- }
- else
- ret = -1;
-# endif
- }
- if (ret < 0)
- return - acl_errno_valid (errno);
- return ret;
-
-# elif HAVE_FACL && defined GETACL /* Solaris, Cygwin < 2.5, not HP-UX */
-
-# if defined ACL_NO_TRIVIAL
-
- /* Solaris 10 (newer version), which has additional API declared in
- <sys/acl.h> (acl_t) and implemented in libsec (acl_set, acl_trivial,
- acl_fromtext, ...). */
- return acl_trivial (name);
-
-# else /* Solaris, Cygwin, general case */
-
- /* Solaris 2.5 through Solaris 10, Cygwin, and contemporaneous versions
- of Unixware. The acl() call returns the access and default ACL both
- at once. */
- {
- /* Initially, try to read the entries into a stack-allocated buffer.
- Use malloc if it does not fit. */
- enum
- {
- alloc_init = 4000 / sizeof (aclent_t), /* >= 3 */
- alloc_max = MIN (INT_MAX, SIZE_MAX / sizeof (aclent_t))
- };
- aclent_t buf[alloc_init];
- size_t alloc = alloc_init;
- aclent_t *entries = buf;
- aclent_t *malloced = NULL;
- int count;
-
- for (;;)
- {
- count = acl (name, GETACL, alloc, entries);
- if (count < 0 && errno == ENOSPC)
- {
- /* Increase the size of the buffer. */
- free (malloced);
- if (alloc > alloc_max / 2)
- {
- errno = ENOMEM;
- return -1;
- }
- alloc = 2 * alloc; /* <= alloc_max */
- entries = malloced =
- (aclent_t *) malloc (alloc * sizeof (aclent_t));
- if (entries == NULL)
- {
- errno = ENOMEM;
- return -1;
- }
- continue;
- }
- break;
- }
- if (count < 0)
- {
- if (errno == ENOSYS || errno == ENOTSUP)
- ;
- else
- {
- free (malloced);
- return -1;
- }
- }
- else if (count == 0)
- ;
- else
- {
- /* Don't use MIN_ACL_ENTRIES: It's set to 4 on Cygwin, but Cygwin
- returns only 3 entries for files with no ACL. But this is safe:
- If there are more than 4 entries, there cannot be only the
- "user::", "group::", "other:", and "mask:" entries. */
- if (count > 4)
- {
- free (malloced);
- return 1;
- }
-
- if (acl_nontrivial (count, entries))
- {
- free (malloced);
- return 1;
- }
- }
- free (malloced);
- }
-
-# ifdef ACE_GETACL
- /* Solaris also has a different variant of ACLs, used in ZFS and NFSv4
- file systems (whereas the other ones are used in UFS file systems). */
- {
- /* Initially, try to read the entries into a stack-allocated buffer.
- Use malloc if it does not fit. */
- enum
- {
- alloc_init = 4000 / sizeof (ace_t), /* >= 3 */
- alloc_max = MIN (INT_MAX, SIZE_MAX / sizeof (ace_t))
- };
- ace_t buf[alloc_init];
- size_t alloc = alloc_init;
- ace_t *entries = buf;
- ace_t *malloced = NULL;
- int count;
-
- for (;;)
- {
- count = acl (name, ACE_GETACL, alloc, entries);
- if (count < 0 && errno == ENOSPC)
- {
- /* Increase the size of the buffer. */
- free (malloced);
- if (alloc > alloc_max / 2)
- {
- errno = ENOMEM;
- return -1;
- }
- alloc = 2 * alloc; /* <= alloc_max */
- entries = malloced = (ace_t *) malloc (alloc * sizeof (ace_t));
- if (entries == NULL)
- {
- errno = ENOMEM;
- return -1;
- }
- continue;
- }
- break;
- }
- if (count < 0)
- {
- if (errno == ENOSYS || errno == EINVAL)
- ;
- else
- {
- free (malloced);
- return -1;
- }
- }
- else if (count == 0)
- ;
- else
- {
- /* In the old (original Solaris 10) convention:
- If there are more than 3 entries, there cannot be only the
- ACE_OWNER, ACE_GROUP, ACE_OTHER entries.
- In the newer Solaris 10 and Solaris 11 convention:
- If there are more than 6 entries, there cannot be only the
- ACE_OWNER, ACE_GROUP, ACE_EVERYONE entries, each once with
- NEW_ACE_ACCESS_ALLOWED_ACE_TYPE and once with
- NEW_ACE_ACCESS_DENIED_ACE_TYPE. */
- if (count > 6)
- {
- free (malloced);
- return 1;
- }
-
- if (acl_ace_nontrivial (count, entries))
- {
- free (malloced);
- return 1;
- }
- }
- free (malloced);
- }
-# endif
-
- return 0;
-# endif
-
-# elif HAVE_GETACL /* HP-UX */
-
- {
- struct acl_entry entries[NACLENTRIES];
- int count;
-
- count = getacl (name, NACLENTRIES, entries);
-
- if (count < 0)
- {
- /* ENOSYS is seen on newer HP-UX versions.
- EOPNOTSUPP is typically seen on NFS mounts.
- ENOTSUP was seen on Quantum StorNext file systems (cvfs). */
- if (errno == ENOSYS || errno == EOPNOTSUPP || errno == ENOTSUP)
- ;
- else
- return -1;
- }
- else if (count == 0)
- return 0;
- else /* count > 0 */
- {
- if (count > NACLENTRIES)
- /* If NACLENTRIES cannot be trusted, use dynamic memory
- allocation. */
- abort ();
-
- /* If there are more than 3 entries, there cannot be only the
- (uid,%), (%,gid), (%,%) entries. */
- if (count > 3)
- return 1;
-
- {
- struct stat statbuf;
-
- if (stat (name, &statbuf) == -1 && errno != EOVERFLOW)
- return -1;
-
- return acl_nontrivial (count, entries);
- }
- }
- }
-
-# if HAVE_ACLV_H /* HP-UX >= 11.11 */
-
- {
- struct acl entries[NACLVENTRIES];
- int count;
-
- count = acl ((char *) name, ACL_GET, NACLVENTRIES, entries);
-
- if (count < 0)
- {
- /* EOPNOTSUPP is seen on NFS in HP-UX 11.11, 11.23.
- EINVAL is seen on NFS in HP-UX 11.31. */
- if (errno == ENOSYS || errno == EOPNOTSUPP || errno == EINVAL)
- ;
- else
- return -1;
- }
- else if (count == 0)
- return 0;
- else /* count > 0 */
- {
- if (count > NACLVENTRIES)
- /* If NACLVENTRIES cannot be trusted, use dynamic memory
- allocation. */
- abort ();
-
- /* If there are more than 4 entries, there cannot be only the
- four base ACL entries. */
- if (count > 4)
- return 1;
-
- return aclv_nontrivial (count, entries);
- }
- }
-
-# endif
-
-# elif HAVE_ACLX_GET && defined ACL_AIX_WIP /* AIX */
-
- acl_type_t type;
- char aclbuf[1024];
- void *acl = aclbuf;
- size_t aclsize = sizeof (aclbuf);
- mode_t mode;
-
- for (;;)
- {
- /* The docs say that type being 0 is equivalent to ACL_ANY, but it
- is not true, in AIX 5.3. */
- type.u64 = ACL_ANY;
- if (aclx_get (name, 0, &type, aclbuf, &aclsize, &mode) >= 0)
- break;
- if (errno == ENOSYS)
- return 0;
- if (errno != ENOSPC)
- {
- if (acl != aclbuf)
- free (acl);
- return -1;
- }
- aclsize = 2 * aclsize;
- if (acl != aclbuf)
- free (acl);
- acl = malloc (aclsize);
- if (acl == NULL)
- {
- errno = ENOMEM;
- return -1;
- }
- }
-
- if (type.u64 == ACL_AIXC)
- {
- int result = acl_nontrivial ((struct acl *) acl);
- if (acl != aclbuf)
- free (acl);
- return result;
- }
- else if (type.u64 == ACL_NFS4)
- {
- int result = acl_nfs4_nontrivial ((nfs4_acl_int_t *) acl);
- if (acl != aclbuf)
- free (acl);
- return result;
- }
- else
- {
- /* A newer type of ACL has been introduced in the system.
- We should better support it. */
- if (acl != aclbuf)
- free (acl);
- errno = EINVAL;
- return -1;
- }
-
-# elif HAVE_STATACL /* older AIX */
-
- union { struct acl a; char room[4096]; } u;
-
- if (statacl ((char *) name, STX_NORMAL, &u.a, sizeof (u)) < 0)
- return -1;
-
- return acl_nontrivial (&u.a);
-
-# elif HAVE_ACLSORT /* NonStop Kernel */
-
- {
- struct acl entries[NACLENTRIES];
- int count;
-
- count = acl ((char *) name, ACL_GET, NACLENTRIES, entries);
-
- if (count < 0)
- {
- if (errno == ENOSYS || errno == ENOTSUP)
- ;
- else
- return -1;
- }
- else if (count == 0)
- return 0;
- else /* count > 0 */
- {
- if (count > NACLENTRIES)
- /* If NACLENTRIES cannot be trusted, use dynamic memory
- allocation. */
- abort ();
-
- /* If there are more than 4 entries, there cannot be only the
- four base ACL entries. */
- if (count > 4)
- return 1;
-
- return acl_nontrivial (count, entries);
- }
- }
-
-# endif
- }
-#endif
-
- return 0;
-}
diff --git a/cross/lib/filemode.c b/cross/lib/filemode.c
deleted file mode 100644
index 318d287f27d..00000000000
--- a/cross/lib/filemode.c
+++ /dev/null
@@ -1,166 +0,0 @@
-/* filemode.c -- make a string describing file modes
-
- Copyright (C) 1985, 1990, 1993, 1998-2000, 2004, 2006, 2009-2023 Free
- Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-#include "filemode.h"
-
-#if ! HAVE_DECL_STRMODE
-
-/* Return a character indicating the type of file described by
- file mode BITS:
- '-' regular file
- 'b' block special file
- 'c' character special file
- 'C' high performance ("contiguous data") file
- 'd' directory
- 'D' door
- 'l' symbolic link
- 'm' multiplexed file (7th edition Unix; obsolete)
- 'n' network special file (HP-UX)
- 'p' fifo (named pipe)
- 'P' port
- 's' socket
- 'w' whiteout (4.4BSD)
- '?' some other file type */
-
-static char
-ftypelet (mode_t bits)
-{
- /* These are the most common, so test for them first. */
- if (S_ISREG (bits))
- return '-';
- if (S_ISDIR (bits))
- return 'd';
-
- /* Other letters standardized by POSIX 1003.1-2004. */
- if (S_ISBLK (bits))
- return 'b';
- if (S_ISCHR (bits))
- return 'c';
- if (S_ISLNK (bits))
- return 'l';
- if (S_ISFIFO (bits))
- return 'p';
-
- /* Other file types (though not letters) standardized by POSIX. */
- if (S_ISSOCK (bits))
- return 's';
-
- /* Nonstandard file types. */
- if (S_ISCTG (bits))
- return 'C';
- if (S_ISDOOR (bits))
- return 'D';
- if (S_ISMPB (bits) || S_ISMPC (bits) || S_ISMPX (bits))
- return 'm';
- if (S_ISNWK (bits))
- return 'n';
- if (S_ISPORT (bits))
- return 'P';
- if (S_ISWHT (bits))
- return 'w';
-
- return '?';
-}
-
-/* Like filemodestring, but rely only on MODE. */
-
-void
-strmode (mode_t mode, char *str)
-{
- str[0] = ftypelet (mode);
- str[1] = mode & S_IRUSR ? 'r' : '-';
- str[2] = mode & S_IWUSR ? 'w' : '-';
- str[3] = (mode & S_ISUID
- ? (mode & S_IXUSR ? 's' : 'S')
- : (mode & S_IXUSR ? 'x' : '-'));
- str[4] = mode & S_IRGRP ? 'r' : '-';
- str[5] = mode & S_IWGRP ? 'w' : '-';
- str[6] = (mode & S_ISGID
- ? (mode & S_IXGRP ? 's' : 'S')
- : (mode & S_IXGRP ? 'x' : '-'));
- str[7] = mode & S_IROTH ? 'r' : '-';
- str[8] = mode & S_IWOTH ? 'w' : '-';
- str[9] = (mode & S_ISVTX
- ? (mode & S_IXOTH ? 't' : 'T')
- : (mode & S_IXOTH ? 'x' : '-'));
- str[10] = ' ';
- str[11] = '\0';
-}
-
-#endif /* ! HAVE_DECL_STRMODE */
-
-/* filemodestring - fill in string STR with an ls-style ASCII
- representation of the st_mode field of file stats block STATP.
- 12 characters are stored in STR.
- The characters stored in STR are:
-
- 0 File type, as in ftypelet above, except that other letters are used
- for files whose type cannot be determined solely from st_mode:
-
- 'F' semaphore
- 'Q' message queue
- 'S' shared memory object
- 'T' typed memory object
-
- 1 'r' if the owner may read, '-' otherwise.
-
- 2 'w' if the owner may write, '-' otherwise.
-
- 3 'x' if the owner may execute, 's' if the file is
- set-user-id, '-' otherwise.
- 'S' if the file is set-user-id, but the execute
- bit isn't set.
-
- 4 'r' if group members may read, '-' otherwise.
-
- 5 'w' if group members may write, '-' otherwise.
-
- 6 'x' if group members may execute, 's' if the file is
- set-group-id, '-' otherwise.
- 'S' if it is set-group-id but not executable.
-
- 7 'r' if any user may read, '-' otherwise.
-
- 8 'w' if any user may write, '-' otherwise.
-
- 9 'x' if any user may execute, 't' if the file is "sticky"
- (will be retained in swap space after execution), '-'
- otherwise.
- 'T' if the file is sticky but not executable.
-
- 10 ' ' for compatibility with 4.4BSD strmode,
- since this interface does not support ACLs.
-
- 11 '\0'. */
-
-void
-filemodestring (struct stat const *statp, char *str)
-{
- strmode (statp->st_mode, str);
-
- if (S_TYPEISSEM (statp))
- str[0] = 'F';
- else if (S_TYPEISMQ (statp))
- str[0] = 'Q';
- else if (S_TYPEISSHM (statp))
- str[0] = 'S';
- else if (S_TYPEISTMO (statp))
- str[0] = 'T';
-}
diff --git a/cross/lib/filemode.h b/cross/lib/filemode.h
deleted file mode 100644
index 15a8dcc3760..00000000000
--- a/cross/lib/filemode.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Make a string describing file modes.
-
- Copyright (C) 1998-1999, 2003, 2006, 2009-2023 Free Software Foundation,
- Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#ifndef FILEMODE_H_
-
-# include <sys/types.h>
-# include <sys/stat.h>
-
-/* Get the declaration of strmode. */
-# if HAVE_DECL_STRMODE
-# include <string.h> /* Mac OS X, FreeBSD, OpenBSD */
-# include <unistd.h> /* NetBSD */
-# endif
-
-# ifdef __cplusplus
-extern "C" {
-# endif
-
-# if !HAVE_DECL_STRMODE
-extern void strmode (mode_t mode, char *str);
-# endif
-
-extern void filemodestring (struct stat const *statp, char *str);
-
-# ifdef __cplusplus
-}
-# endif
-
-#endif
diff --git a/cross/lib/filename.h b/cross/lib/filename.h
deleted file mode 100644
index a2400a9dfe3..00000000000
--- a/cross/lib/filename.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/* Basic filename support macros.
- Copyright (C) 2001-2023 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/>. */
-
-/* From Paul Eggert and Jim Meyering. */
-
-#ifndef _FILENAME_H
-#define _FILENAME_H
-
-#include <string.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-/* Filename support.
- ISSLASH(C) tests whether C is a directory separator
- character.
- HAS_DEVICE(Filename) tests whether Filename contains a device
- specification.
- FILE_SYSTEM_PREFIX_LEN(Filename) length of the device specification
- at the beginning of Filename,
- index of the part consisting of
- alternating components and slashes.
- FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
- 1 when a non-empty device specification
- can be followed by an empty or relative
- part,
- 0 when a non-empty device specification
- must be followed by a slash,
- 0 when device specification don't exist.
- IS_ABSOLUTE_FILE_NAME(Filename)
- tests whether Filename is independent of
- any notion of "current directory".
- IS_RELATIVE_FILE_NAME(Filename)
- tests whether Filename may be concatenated
- to a directory filename.
- Note: On native Windows, OS/2, DOS, "c:" is neither an absolute nor a
- relative file name!
- IS_FILE_NAME_WITH_DIR(Filename) tests whether Filename contains a device
- or directory specification.
- */
-#if defined _WIN32 || defined __CYGWIN__ \
- || defined __EMX__ || defined __MSDOS__ || defined __DJGPP__
- /* Native Windows, Cygwin, OS/2, DOS */
-# define ISSLASH(C) ((C) == '/' || (C) == '\\')
- /* Internal macro: Tests whether a character is a drive letter. */
-# define _IS_DRIVE_LETTER(C) \
- (((C) >= 'A' && (C) <= 'Z') || ((C) >= 'a' && (C) <= 'z'))
- /* Help the compiler optimizing it. This assumes ASCII. */
-# undef _IS_DRIVE_LETTER
-# define _IS_DRIVE_LETTER(C) \
- (((unsigned int) (C) | ('a' - 'A')) - 'a' <= 'z' - 'a')
-# define HAS_DEVICE(Filename) \
- (_IS_DRIVE_LETTER ((Filename)[0]) && (Filename)[1] == ':')
-# define FILE_SYSTEM_PREFIX_LEN(Filename) (HAS_DEVICE (Filename) ? 2 : 0)
-# ifdef __CYGWIN__
-# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 0
-# else
- /* On native Windows, OS/2, DOS, the system has the notion of a
- "current directory" on each drive. */
-# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 1
-# endif
-# if FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
-# define IS_ABSOLUTE_FILE_NAME(Filename) \
- ISSLASH ((Filename)[FILE_SYSTEM_PREFIX_LEN (Filename)])
-# else
-# define IS_ABSOLUTE_FILE_NAME(Filename) \
- (ISSLASH ((Filename)[0]) || HAS_DEVICE (Filename))
-# endif
-# define IS_RELATIVE_FILE_NAME(Filename) \
- (! (ISSLASH ((Filename)[0]) || HAS_DEVICE (Filename)))
-# define IS_FILE_NAME_WITH_DIR(Filename) \
- (strchr ((Filename), '/') != NULL || strchr ((Filename), '\\') != NULL \
- || HAS_DEVICE (Filename))
-#else
- /* Unix */
-# define ISSLASH(C) ((C) == '/')
-# define HAS_DEVICE(Filename) ((void) (Filename), 0)
-# define FILE_SYSTEM_PREFIX_LEN(Filename) ((void) (Filename), 0)
-# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 0
-# define IS_ABSOLUTE_FILE_NAME(Filename) ISSLASH ((Filename)[0])
-# define IS_RELATIVE_FILE_NAME(Filename) (! ISSLASH ((Filename)[0]))
-# define IS_FILE_NAME_WITH_DIR(Filename) (strchr ((Filename), '/') != NULL)
-#endif
-
-/* Deprecated macros. For backward compatibility with old users of the
- 'filename' module. */
-#define IS_ABSOLUTE_PATH IS_ABSOLUTE_FILE_NAME
-#define IS_PATH_WITH_DIR IS_FILE_NAME_WITH_DIR
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _FILENAME_H */
diff --git a/cross/lib/filevercmp.c b/cross/lib/filevercmp.c
deleted file mode 100644
index 78e1faff536..00000000000
--- a/cross/lib/filevercmp.c
+++ /dev/null
@@ -1,188 +0,0 @@
-/* Compare file names containing version numbers.
-
- Copyright (C) 1995 Ian Jackson <iwj10@cus.cam.ac.uk>
- Copyright (C) 2001 Anthony Towns <aj@azure.humbug.org.au>
- Copyright (C) 2008-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-#include "filevercmp.h"
-
-#include <c-ctype.h>
-#include <limits.h>
-#include <idx.h>
-
-/* Return the length of a prefix of S that corresponds to the suffix
- defined by this extended regular expression in the C locale:
- (\.[A-Za-z~][A-Za-z0-9~]*)*$
- Use the longest suffix matching this regular expression,
- except do not use all of S as a suffix if S is nonempty.
- If *LEN is -1, S is a string; set *LEN to S's length.
- Otherwise, *LEN should be nonnegative, S is a char array,
- and *LEN does not change. */
-static idx_t
-file_prefixlen (char const *s, ptrdiff_t *len)
-{
- size_t n = *len; /* SIZE_MAX if N == -1. */
- idx_t prefixlen = 0;
-
- for (idx_t i = 0; ; )
- {
- if (*len < 0 ? !s[i] : i == n)
- {
- *len = i;
- return prefixlen;
- }
-
- i++;
- prefixlen = i;
- while (i + 1 < n && s[i] == '.' && (c_isalpha (s[i + 1])
- || s[i + 1] == '~'))
- for (i += 2; i < n && (c_isalnum (s[i]) || s[i] == '~'); i++)
- continue;
- }
-}
-
-/* Return a version sort comparison value for S's byte at position POS.
- S has length LEN. If POS == LEN, sort before all non-'~' bytes. */
-
-static int
-order (char const *s, idx_t pos, idx_t len)
-{
- if (pos == len)
- return -1;
-
- unsigned char c = s[pos];
- if (c_isdigit (c))
- return 0;
- else if (c_isalpha (c))
- return c;
- else if (c == '~')
- return -2;
- else
- {
- static_assert (UCHAR_MAX <= (INT_MAX - 1 - 2) / 2);
- return c + UCHAR_MAX + 1;
- }
-}
-
-/* slightly modified verrevcmp function from dpkg
- S1, S2 - compared char array
- S1_LEN, S2_LEN - length of arrays to be scanned
-
- This implements the algorithm for comparison of version strings
- specified by Debian and now widely adopted. The detailed
- specification can be found in the Debian Policy Manual in the
- section on the 'Version' control field. This version of the code
- implements that from s5.6.12 of Debian Policy v3.8.0.1
- https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Version */
-static int _GL_ATTRIBUTE_PURE
-verrevcmp (const char *s1, idx_t s1_len, const char *s2, idx_t s2_len)
-{
- idx_t s1_pos = 0;
- idx_t s2_pos = 0;
- while (s1_pos < s1_len || s2_pos < s2_len)
- {
- int first_diff = 0;
- while ((s1_pos < s1_len && !c_isdigit (s1[s1_pos]))
- || (s2_pos < s2_len && !c_isdigit (s2[s2_pos])))
- {
- int s1_c = order (s1, s1_pos, s1_len);
- int s2_c = order (s2, s2_pos, s2_len);
- if (s1_c != s2_c)
- return s1_c - s2_c;
- s1_pos++;
- s2_pos++;
- }
- while (s1_pos < s1_len && s1[s1_pos] == '0')
- s1_pos++;
- while (s2_pos < s2_len && s2[s2_pos] == '0')
- s2_pos++;
- while (s1_pos < s1_len && s2_pos < s2_len
- && c_isdigit (s1[s1_pos]) && c_isdigit (s2[s2_pos]))
- {
- if (!first_diff)
- first_diff = s1[s1_pos] - s2[s2_pos];
- s1_pos++;
- s2_pos++;
- }
- if (s1_pos < s1_len && c_isdigit (s1[s1_pos]))
- return 1;
- if (s2_pos < s2_len && c_isdigit (s2[s2_pos]))
- return -1;
- if (first_diff)
- return first_diff;
- }
- return 0;
-}
-
-/* Compare version strings S1 and S2.
- See filevercmp.h for function description. */
-int
-filevercmp (const char *s1, const char *s2)
-{
- return filenvercmp (s1, -1, s2, -1);
-}
-
-/* Compare versions A (of length ALEN) and B (of length BLEN).
- See filevercmp.h for function description. */
-int
-filenvercmp (char const *a, ptrdiff_t alen, char const *b, ptrdiff_t blen)
-{
- /* Special case for empty versions. */
- bool aempty = alen < 0 ? !a[0] : !alen;
- bool bempty = blen < 0 ? !b[0] : !blen;
- if (aempty)
- return -!bempty;
- if (bempty)
- return 1;
-
- /* Special cases for leading ".": "." sorts first, then "..", then
- other names with leading ".", then other names. */
- if (a[0] == '.')
- {
- if (b[0] != '.')
- return -1;
-
- bool adot = alen < 0 ? !a[1] : alen == 1;
- bool bdot = blen < 0 ? !b[1] : blen == 1;
- if (adot)
- return -!bdot;
- if (bdot)
- return 1;
-
- bool adotdot = a[1] == '.' && (alen < 0 ? !a[2] : alen == 2);
- bool bdotdot = b[1] == '.' && (blen < 0 ? !b[2] : blen == 2);
- if (adotdot)
- return -!bdotdot;
- if (bdotdot)
- return 1;
- }
- else if (b[0] == '.')
- return 1;
-
- /* Cut file suffixes. */
- idx_t aprefixlen = file_prefixlen (a, &alen);
- idx_t bprefixlen = file_prefixlen (b, &blen);
-
- /* If both suffixes are empty, a second pass would return the same thing. */
- bool one_pass_only = aprefixlen == alen && bprefixlen == blen;
-
- int result = verrevcmp (a, aprefixlen, b, bprefixlen);
-
- /* Return the initial result if nonzero, or if no second pass is needed.
- Otherwise, restore the suffixes and try again. */
- return result || one_pass_only ? result : verrevcmp (a, alen, b, blen);
-}
diff --git a/cross/lib/filevercmp.h b/cross/lib/filevercmp.h
deleted file mode 100644
index 6b81ab32a7f..00000000000
--- a/cross/lib/filevercmp.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/* Compare file names containing version numbers.
-
- Copyright (C) 1995 Ian Jackson <iwj10@cus.cam.ac.uk>
- Copyright (C) 2001 Anthony Towns <aj@azure.humbug.org.au>
- Copyright (C) 2008-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#ifndef FILEVERCMP_H
-#define FILEVERCMP_H
-
-#include <stddef.h>
-
-/* Compare strings A and B as file names containing version numbers,
- and return an integer that is negative, zero, or positive depending
- on whether A compares less than, equal to, or greater than B.
-
- Use the following version sort algorithm:
-
- 1. Compare the strings' maximal-length non-digit prefixes lexically.
- If there is a difference return that difference.
- Otherwise discard the prefixes and continue with the next step.
-
- 2. Compare the strings' maximal-length digit prefixes, using
- numeric comparison of the numbers represented by each prefix.
- (Treat an empty prefix as zero; this can happen only at string end.)
- If there is a difference, return that difference.
- Otherwise discard the prefixes and continue with the next step.
-
- 3. If both strings are empty, return 0. Otherwise continue with step 1.
-
- In version sort, lexical comparison is left to right, byte by byte,
- using the byte's numeric value (0-255), except that:
-
- 1. ASCII letters sort before other bytes.
- 2. A tilde sorts before anything, even an empty string.
-
- In addition to the version sort rules, the following strings have
- special priority and sort before all other strings (listed in order):
-
- 1. The empty string.
- 2. ".".
- 3. "..".
- 4. Strings starting with "." sort before other strings.
-
- Before comparing two strings where both begin with non-".",
- or where both begin with "." but neither is "." or "..",
- suffixes matching the C-locale extended regular expression
- (\.[A-Za-z~][A-Za-z0-9~]*)*$ are removed and the strings compared
- without them, using version sort without special priority;
- if they do not compare equal, this comparison result is used and
- the suffixes are effectively ignored. Otherwise, the entire
- strings are compared using version sort. When removing a suffix
- from a nonempty string, remove the maximal-length suffix such that
- the remaining string is nonempty.
-
- This function is intended to be a replacement for strverscmp. */
-int filevercmp (char const *a, char const *b) _GL_ATTRIBUTE_PURE;
-
-/* Like filevercmp, except compare the byte arrays A (of length ALEN)
- and B (of length BLEN) so that A and B can contain '\0', which
- sorts just before '\1'. But if ALEN is -1 treat A as a string
- terminated by '\0', and similarly for BLEN. */
-int filenvercmp (char const *a, ptrdiff_t alen, char const *b, ptrdiff_t blen)
- _GL_ATTRIBUTE_PURE;
-
-#endif /* FILEVERCMP_H */
diff --git a/cross/lib/fingerprint.c b/cross/lib/fingerprint.c
deleted file mode 100644
index d83de2245e8..00000000000
--- a/cross/lib/fingerprint.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Placeholder fingerprint for Emacs
-
-Copyright 2019-2023 Free Software Foundation, Inc.
-
-This file is part of GNU Emacs.
-
-GNU Emacs is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or (at
-your option) any later version.
-
-GNU Emacs is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-#include "fingerprint.h"
-
-/* This random fingerprint was generated by the shell command:
-
- shuf -i 0-255 -n 32 -r | awk '{printf " 0x%.02X,\n", $0}'
-
- In the final Emacs executable, this random fingerprint is replaced
- by a fingerprint of the temporary Emacs executable that was built
- along the way. */
-
-volatile unsigned char fingerprint[] =
- {
- 0xDE,
- 0x86,
- 0xBB,
- 0x99,
- 0xFF,
- 0xF5,
- 0x46,
- 0x9A,
- 0x9E,
- 0x3F,
- 0x9F,
- 0x5D,
- 0x9A,
- 0xDF,
- 0xF0,
- 0x91,
- 0xBD,
- 0xCD,
- 0xC1,
- 0xE8,
- 0x0C,
- 0x16,
- 0x1E,
- 0xAF,
- 0xB8,
- 0x6C,
- 0xE2,
- 0x2B,
- 0xB1,
- 0x24,
- 0xCE,
- 0xB0,
- };
diff --git a/cross/lib/fingerprint.h b/cross/lib/fingerprint.h
deleted file mode 100644
index 0bb099ceeee..00000000000
--- a/cross/lib/fingerprint.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Header file for the Emacs build fingerprint.
-
-Copyright (C) 2016, 2018-2023 Free Software Foundation, Inc.
-
-This file is part of GNU Emacs.
-
-GNU Emacs is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or (at
-your option) any later version.
-
-GNU Emacs is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
-
-#ifndef EMACS_FINGERPRINT_H
-#define EMACS_FINGERPRINT_H
-
-/* We generate fingerprint.c and fingerprint.o from all the sources in
- Emacs. This way, we have a unique value that we can use to pair
- data files (like a dump file) with a specific build of Emacs. */
-extern volatile unsigned char fingerprint[32];
-
-#endif
diff --git a/cross/lib/flexmember.h b/cross/lib/flexmember.h
deleted file mode 100644
index a6cc876a6d5..00000000000
--- a/cross/lib/flexmember.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Sizes of structs with flexible array members.
-
- Copyright 2016-2023 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/>.
-
- Written by Paul Eggert. */
-
-#include <stddef.h>
-
-/* Nonzero multiple of alignment of TYPE, suitable for FLEXSIZEOF below.
- On older platforms without _Alignof, use a pessimistic bound that is
- safe in practice even if FLEXIBLE_ARRAY_MEMBER is 1.
- On newer platforms, use _Alignof to get a tighter bound. */
-
-#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112
-# define FLEXALIGNOF(type) (sizeof (type) & ~ (sizeof (type) - 1))
-#else
-# define FLEXALIGNOF(type) _Alignof (type)
-#endif
-
-/* Yield a properly aligned upper bound on the size of a struct of
- type TYPE with a flexible array member named MEMBER that is
- followed by N bytes of other data. The result is suitable as an
- argument to malloc. For example:
-
- struct s { int n; char d[FLEXIBLE_ARRAY_MEMBER]; };
- struct s *p = malloc (FLEXSIZEOF (struct s, d, n * sizeof (char)));
-
- FLEXSIZEOF (TYPE, MEMBER, N) is not simply (sizeof (TYPE) + N),
- since FLEXIBLE_ARRAY_MEMBER may be 1 on pre-C11 platforms. Nor is
- it simply (offsetof (TYPE, MEMBER) + N), as that might yield a size
- that causes malloc to yield a pointer that is not properly aligned
- for TYPE; for example, if sizeof (int) == alignof (int) == 4,
- malloc (offsetof (struct s, d) + 3 * sizeof (char)) is equivalent
- to malloc (7) and might yield a pointer that is not a multiple of 4
- (which means the pointer is not properly aligned for struct s),
- whereas malloc (FLEXSIZEOF (struct s, d, 3 * sizeof (char))) is
- equivalent to malloc (8) and must yield a pointer that is a
- multiple of 4.
-
- Yield a value less than N if and only if arithmetic overflow occurs. */
-
-#define FLEXSIZEOF(type, member, n) \
- ((offsetof (type, member) + FLEXALIGNOF (type) - 1 + (n)) \
- & ~ (FLEXALIGNOF (type) - 1))
diff --git a/cross/lib/float+.h b/cross/lib/float+.h
deleted file mode 100644
index e7531e46a38..00000000000
--- a/cross/lib/float+.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/* Supplemental information about the floating-point formats.
- Copyright (C) 2007, 2009-2023 Free Software Foundation, Inc.
- Written by Bruno Haible <bruno@clisp.org>, 2007.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General 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 _FLOATPLUS_H
-#define _FLOATPLUS_H
-
-#include <float.h>
-#include <limits.h>
-
-/* Number of bits in the mantissa of a floating-point number, including the
- "hidden bit". */
-#if FLT_RADIX == 2
-# define FLT_MANT_BIT FLT_MANT_DIG
-# define DBL_MANT_BIT DBL_MANT_DIG
-# define LDBL_MANT_BIT LDBL_MANT_DIG
-#elif FLT_RADIX == 4
-# define FLT_MANT_BIT (FLT_MANT_DIG * 2)
-# define DBL_MANT_BIT (DBL_MANT_DIG * 2)
-# define LDBL_MANT_BIT (LDBL_MANT_DIG * 2)
-#elif FLT_RADIX == 16
-# define FLT_MANT_BIT (FLT_MANT_DIG * 4)
-# define DBL_MANT_BIT (DBL_MANT_DIG * 4)
-# define LDBL_MANT_BIT (LDBL_MANT_DIG * 4)
-#endif
-
-/* Bit mask that can be used to mask the exponent, as an unsigned number. */
-#define FLT_EXP_MASK ((FLT_MAX_EXP - FLT_MIN_EXP) | 7)
-#define DBL_EXP_MASK ((DBL_MAX_EXP - DBL_MIN_EXP) | 7)
-#define LDBL_EXP_MASK ((LDBL_MAX_EXP - LDBL_MIN_EXP) | 7)
-
-/* Number of bits used for the exponent of a floating-point number, including
- the exponent's sign. */
-#define FLT_EXP_BIT \
- (FLT_EXP_MASK < 0x100 ? 8 : \
- FLT_EXP_MASK < 0x200 ? 9 : \
- FLT_EXP_MASK < 0x400 ? 10 : \
- FLT_EXP_MASK < 0x800 ? 11 : \
- FLT_EXP_MASK < 0x1000 ? 12 : \
- FLT_EXP_MASK < 0x2000 ? 13 : \
- FLT_EXP_MASK < 0x4000 ? 14 : \
- FLT_EXP_MASK < 0x8000 ? 15 : \
- FLT_EXP_MASK < 0x10000 ? 16 : \
- FLT_EXP_MASK < 0x20000 ? 17 : \
- FLT_EXP_MASK < 0x40000 ? 18 : \
- FLT_EXP_MASK < 0x80000 ? 19 : \
- FLT_EXP_MASK < 0x100000 ? 20 : \
- FLT_EXP_MASK < 0x200000 ? 21 : \
- FLT_EXP_MASK < 0x400000 ? 22 : \
- FLT_EXP_MASK < 0x800000 ? 23 : \
- FLT_EXP_MASK < 0x1000000 ? 24 : \
- FLT_EXP_MASK < 0x2000000 ? 25 : \
- FLT_EXP_MASK < 0x4000000 ? 26 : \
- FLT_EXP_MASK < 0x8000000 ? 27 : \
- FLT_EXP_MASK < 0x10000000 ? 28 : \
- FLT_EXP_MASK < 0x20000000 ? 29 : \
- FLT_EXP_MASK < 0x40000000 ? 30 : \
- FLT_EXP_MASK <= 0x7fffffff ? 31 : \
- 32)
-#define DBL_EXP_BIT \
- (DBL_EXP_MASK < 0x100 ? 8 : \
- DBL_EXP_MASK < 0x200 ? 9 : \
- DBL_EXP_MASK < 0x400 ? 10 : \
- DBL_EXP_MASK < 0x800 ? 11 : \
- DBL_EXP_MASK < 0x1000 ? 12 : \
- DBL_EXP_MASK < 0x2000 ? 13 : \
- DBL_EXP_MASK < 0x4000 ? 14 : \
- DBL_EXP_MASK < 0x8000 ? 15 : \
- DBL_EXP_MASK < 0x10000 ? 16 : \
- DBL_EXP_MASK < 0x20000 ? 17 : \
- DBL_EXP_MASK < 0x40000 ? 18 : \
- DBL_EXP_MASK < 0x80000 ? 19 : \
- DBL_EXP_MASK < 0x100000 ? 20 : \
- DBL_EXP_MASK < 0x200000 ? 21 : \
- DBL_EXP_MASK < 0x400000 ? 22 : \
- DBL_EXP_MASK < 0x800000 ? 23 : \
- DBL_EXP_MASK < 0x1000000 ? 24 : \
- DBL_EXP_MASK < 0x2000000 ? 25 : \
- DBL_EXP_MASK < 0x4000000 ? 26 : \
- DBL_EXP_MASK < 0x8000000 ? 27 : \
- DBL_EXP_MASK < 0x10000000 ? 28 : \
- DBL_EXP_MASK < 0x20000000 ? 29 : \
- DBL_EXP_MASK < 0x40000000 ? 30 : \
- DBL_EXP_MASK <= 0x7fffffff ? 31 : \
- 32)
-#define LDBL_EXP_BIT \
- (LDBL_EXP_MASK < 0x100 ? 8 : \
- LDBL_EXP_MASK < 0x200 ? 9 : \
- LDBL_EXP_MASK < 0x400 ? 10 : \
- LDBL_EXP_MASK < 0x800 ? 11 : \
- LDBL_EXP_MASK < 0x1000 ? 12 : \
- LDBL_EXP_MASK < 0x2000 ? 13 : \
- LDBL_EXP_MASK < 0x4000 ? 14 : \
- LDBL_EXP_MASK < 0x8000 ? 15 : \
- LDBL_EXP_MASK < 0x10000 ? 16 : \
- LDBL_EXP_MASK < 0x20000 ? 17 : \
- LDBL_EXP_MASK < 0x40000 ? 18 : \
- LDBL_EXP_MASK < 0x80000 ? 19 : \
- LDBL_EXP_MASK < 0x100000 ? 20 : \
- LDBL_EXP_MASK < 0x200000 ? 21 : \
- LDBL_EXP_MASK < 0x400000 ? 22 : \
- LDBL_EXP_MASK < 0x800000 ? 23 : \
- LDBL_EXP_MASK < 0x1000000 ? 24 : \
- LDBL_EXP_MASK < 0x2000000 ? 25 : \
- LDBL_EXP_MASK < 0x4000000 ? 26 : \
- LDBL_EXP_MASK < 0x8000000 ? 27 : \
- LDBL_EXP_MASK < 0x10000000 ? 28 : \
- LDBL_EXP_MASK < 0x20000000 ? 29 : \
- LDBL_EXP_MASK < 0x40000000 ? 30 : \
- LDBL_EXP_MASK <= 0x7fffffff ? 31 : \
- 32)
-
-/* Number of bits used for a floating-point number: the mantissa (not
- counting the "hidden bit", since it may or may not be explicit), the
- exponent, and the sign. */
-#define FLT_TOTAL_BIT ((FLT_MANT_BIT - 1) + FLT_EXP_BIT + 1)
-#define DBL_TOTAL_BIT ((DBL_MANT_BIT - 1) + DBL_EXP_BIT + 1)
-#define LDBL_TOTAL_BIT ((LDBL_MANT_BIT - 1) + LDBL_EXP_BIT + 1)
-
-/* Number of bytes used for a floating-point number.
- This can be smaller than the 'sizeof'. For example, on i386 systems,
- 'long double' most often have LDBL_MANT_BIT = 64, LDBL_EXP_BIT = 16, hence
- LDBL_TOTAL_BIT = 80 bits, i.e. 10 bytes of consecutive memory, but
- sizeof (long double) = 12 or = 16. */
-#define SIZEOF_FLT ((FLT_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT)
-#define SIZEOF_DBL ((DBL_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT)
-#define SIZEOF_LDBL ((LDBL_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT)
-
-/* Verify that SIZEOF_FLT <= sizeof (float) etc. */
-typedef int verify_sizeof_flt[SIZEOF_FLT <= sizeof (float) ? 1 : -1];
-typedef int verify_sizeof_dbl[SIZEOF_DBL <= sizeof (double) ? 1 : - 1];
-typedef int verify_sizeof_ldbl[SIZEOF_LDBL <= sizeof (long double) ? 1 : - 1];
-
-#endif /* _FLOATPLUS_H */
diff --git a/cross/lib/float.c b/cross/lib/float.c
deleted file mode 100644
index f81ff33d3b7..00000000000
--- a/cross/lib/float.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Auxiliary definitions for <float.h>.
- Copyright (C) 2011-2023 Free Software Foundation, Inc.
- Written by Bruno Haible <bruno@clisp.org>, 2011.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General 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 <float.h>
-
-#if (defined _ARCH_PPC || defined _POWER) && (defined _AIX || defined __linux__) && (LDBL_MANT_DIG == 106) && defined __GNUC__
-const union gl_long_double_union gl_LDBL_MAX =
- { { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL } };
-#elif defined __i386__
-const union gl_long_double_union gl_LDBL_MAX =
- { { 0xFFFFFFFF, 0xFFFFFFFF, 32766 } };
-#else
-/* This declaration is solely to ensure that after preprocessing
- this file is never empty. */
-typedef int dummy;
-#endif
diff --git a/cross/lib/float.in.h b/cross/lib/float.in.h
deleted file mode 100644
index bf2c502c7f5..00000000000
--- a/cross/lib/float.in.h
+++ /dev/null
@@ -1,194 +0,0 @@
-/* A correct <float.h>.
-
- Copyright (C) 2007-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#ifndef _@GUARD_PREFIX@_FLOAT_H
-
-#if __GNUC__ >= 3
-@PRAGMA_SYSTEM_HEADER@
-#endif
-@PRAGMA_COLUMNS@
-
-/* The include_next requires a split double-inclusion guard. */
-#@INCLUDE_NEXT@ @NEXT_FLOAT_H@
-
-#ifndef _@GUARD_PREFIX@_FLOAT_H
-#define _@GUARD_PREFIX@_FLOAT_H
-
-/* 'long double' properties. */
-
-#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__)
-/* Number of mantissa units, in base FLT_RADIX. */
-# undef LDBL_MANT_DIG
-# define LDBL_MANT_DIG 64
-/* Number of decimal digits that is sufficient for representing a number. */
-# undef LDBL_DIG
-# define LDBL_DIG 18
-/* x-1 where x is the smallest representable number > 1. */
-# undef LDBL_EPSILON
-# define LDBL_EPSILON 1.0842021724855044340E-19L
-/* Minimum e such that FLT_RADIX^(e-1) is a normalized number. */
-# undef LDBL_MIN_EXP
-# define LDBL_MIN_EXP (-16381)
-/* Maximum e such that FLT_RADIX^(e-1) is a representable finite number. */
-# undef LDBL_MAX_EXP
-# define LDBL_MAX_EXP 16384
-/* Minimum positive normalized number. */
-# undef LDBL_MIN
-# define LDBL_MIN 3.3621031431120935063E-4932L
-/* Maximum representable finite number. */
-# undef LDBL_MAX
-# define LDBL_MAX 1.1897314953572317650E+4932L
-/* Minimum e such that 10^e is in the range of normalized numbers. */
-# undef LDBL_MIN_10_EXP
-# define LDBL_MIN_10_EXP (-4931)
-/* Maximum e such that 10^e is in the range of representable finite numbers. */
-# undef LDBL_MAX_10_EXP
-# define LDBL_MAX_10_EXP 4932
-#endif
-
-/* On FreeBSD/x86 6.4, the 'long double' type really has only 53 bits of
- precision in the compiler but 64 bits of precision at runtime. See
- <https://lists.gnu.org/r/bug-gnulib/2008-07/msg00063.html>. */
-#if defined __i386__ && (defined __FreeBSD__ || defined __DragonFly__)
-/* Number of mantissa units, in base FLT_RADIX. */
-# undef LDBL_MANT_DIG
-# define LDBL_MANT_DIG 64
-/* Number of decimal digits that is sufficient for representing a number. */
-# undef LDBL_DIG
-# define LDBL_DIG 18
-/* x-1 where x is the smallest representable number > 1. */
-# undef LDBL_EPSILON
-# define LDBL_EPSILON 1.084202172485504434007452800869941711426e-19L /* 2^-63 */
-/* Minimum e such that FLT_RADIX^(e-1) is a normalized number. */
-# undef LDBL_MIN_EXP
-# define LDBL_MIN_EXP (-16381)
-/* Maximum e such that FLT_RADIX^(e-1) is a representable finite number. */
-# undef LDBL_MAX_EXP
-# define LDBL_MAX_EXP 16384
-/* Minimum positive normalized number. */
-# undef LDBL_MIN
-# define LDBL_MIN 3.362103143112093506262677817321752E-4932L /* = 0x1p-16382L */
-/* Maximum representable finite number. */
-# undef LDBL_MAX
-/* LDBL_MAX is represented as { 0xFFFFFFFF, 0xFFFFFFFF, 32766 }.
- But the largest literal that GCC allows us to write is
- 0x0.fffffffffffff8p16384L = { 0xFFFFF800, 0xFFFFFFFF, 32766 }.
- So, define it like this through a reference to an external variable
-
- const unsigned int LDBL_MAX[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 32766 };
- extern const long double LDBL_MAX;
-
- Unfortunately, this is not a constant expression. */
-# if !GNULIB_defined_long_double_union
-union gl_long_double_union
- {
- struct { unsigned int lo; unsigned int hi; unsigned int exponent; } xd;
- long double ld;
- };
-# define GNULIB_defined_long_double_union 1
-# endif
-extern const union gl_long_double_union gl_LDBL_MAX;
-# define LDBL_MAX (gl_LDBL_MAX.ld)
-/* Minimum e such that 10^e is in the range of normalized numbers. */
-# undef LDBL_MIN_10_EXP
-# define LDBL_MIN_10_EXP (-4931)
-/* Maximum e such that 10^e is in the range of representable finite numbers. */
-# undef LDBL_MAX_10_EXP
-# define LDBL_MAX_10_EXP 4932
-#endif
-
-/* On AIX 7.1 with gcc 4.2, the values of LDBL_MIN_EXP, LDBL_MIN, LDBL_MAX are
- wrong.
- On Linux/PowerPC with gcc 4.4, the value of LDBL_MAX is wrong. */
-#if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__
-# undef LDBL_MIN_EXP
-# define LDBL_MIN_EXP DBL_MIN_EXP
-# undef LDBL_MIN_10_EXP
-# define LDBL_MIN_10_EXP DBL_MIN_10_EXP
-# undef LDBL_MIN
-# define LDBL_MIN 2.22507385850720138309023271733240406422e-308L /* DBL_MIN = 2^-1022 */
-#endif
-#if (defined _ARCH_PPC || defined _POWER) && (defined _AIX || defined __linux__) && (LDBL_MANT_DIG == 106) && defined __GNUC__
-# undef LDBL_MAX
-/* LDBL_MAX is represented as { 0x7FEFFFFF, 0xFFFFFFFF, 0x7C8FFFFF, 0xFFFFFFFF }.
- It is not easy to define:
- #define LDBL_MAX 1.79769313486231580793728971405302307166e308L
- is too small, whereas
- #define LDBL_MAX 1.79769313486231580793728971405302307167e308L
- is too large. Apparently a bug in GCC decimal-to-binary conversion.
- Also, I can't get values larger than
- #define LDBL63 ((long double) (1ULL << 63))
- #define LDBL882 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63)
- #define LDBL945 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63)
- #define LDBL1008 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63)
- #define LDBL_MAX (LDBL1008 * 65535.0L + LDBL945 * (long double) 9223372036821221375ULL + LDBL882 * (long double) 4611686018427387904ULL)
- which is represented as { 0x7FEFFFFF, 0xFFFFFFFF, 0x7C8FFFFF, 0xF8000000 }.
- So, define it like this through a reference to an external variable
-
- const double LDBL_MAX[2] = { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL };
- extern const long double LDBL_MAX;
-
- or through a pointer cast
-
- #define LDBL_MAX \
- (*(const long double *) (double[]) { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL })
-
- Unfortunately, this is not a constant expression, and the latter expression
- does not work well when GCC is optimizing.. */
-# if !GNULIB_defined_long_double_union
-union gl_long_double_union
- {
- struct { double hi; double lo; } dd;
- long double ld;
- };
-# define GNULIB_defined_long_double_union 1
-# endif
-extern const union gl_long_double_union gl_LDBL_MAX;
-# define LDBL_MAX (gl_LDBL_MAX.ld)
-#endif
-
-/* On IRIX 6.5, with cc, the value of LDBL_MANT_DIG is wrong.
- On IRIX 6.5, with gcc 4.2, the values of LDBL_MIN_EXP, LDBL_MIN, LDBL_EPSILON
- are wrong. */
-#if defined __sgi && (LDBL_MANT_DIG >= 106)
-# undef LDBL_MANT_DIG
-# define LDBL_MANT_DIG 106
-# if defined __GNUC__
-# undef LDBL_MIN_EXP
-# define LDBL_MIN_EXP DBL_MIN_EXP
-# undef LDBL_MIN_10_EXP
-# define LDBL_MIN_10_EXP DBL_MIN_10_EXP
-# undef LDBL_MIN
-# define LDBL_MIN 2.22507385850720138309023271733240406422e-308L /* DBL_MIN = 2^-1022 */
-# undef LDBL_EPSILON
-# define LDBL_EPSILON 2.46519032881566189191165176650870696773e-32L /* 2^-105 */
-# endif
-#endif
-
-#if @REPLACE_ITOLD@
-/* Pull in a function that fixes the 'int' to 'long double' conversion
- of glibc 2.7. */
-extern
-# ifdef __cplusplus
-"C"
-# endif
-void _Qp_itoq (long double *, int);
-static void (*_gl_float_fix_itold) (long double *, int) = _Qp_itoq;
-#endif
-
-#endif /* _@GUARD_PREFIX@_FLOAT_H */
-#endif /* _@GUARD_PREFIX@_FLOAT_H */
diff --git a/cross/lib/fpending.c b/cross/lib/fpending.c
deleted file mode 100644
index e57155e586e..00000000000
--- a/cross/lib/fpending.c
+++ /dev/null
@@ -1,63 +0,0 @@
-/* fpending.c -- return the number of pending output bytes on a stream
- Copyright (C) 2000, 2004, 2006-2007, 2009-2023 Free Software Foundation,
- Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Jim Meyering. */
-
-#include <config.h>
-
-/* Specification. */
-#include "fpending.h"
-
-#include "stdio-impl.h"
-
-/* This file is not used on systems that already have the __fpending function,
- namely glibc >= 2.2, Solaris >= 7, UnixWare >= 7.1.4.MP4, Cygwin >= 1.7.34,
- Android API >= 23. */
-
-/* Return the number of pending (aka buffered, unflushed)
- bytes on the stream, FP, that is open for writing. */
-size_t
-__fpending (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->_IO_write_ptr - fp->_IO_write_base;
-#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
- /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin < 1.7.34, Minix 3, Android */
- return fp_->_p - fp_->_bf._base;
-#elif defined __EMX__ /* emx+gcc */
- return fp->_ptr - fp->_buffer;
-#elif defined __minix /* Minix */
- return fp_->_ptr - fp_->_buf;
-#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, UnixWare, mingw, MSVC, NonStop Kernel, OpenVMS */
- return (fp_->_ptr ? fp_->_ptr - fp_->_base : 0);
-#elif defined __UCLIBC__ /* uClibc */
- return (fp->__modeflags & __FLAG_WRITING ? fp->__bufpos - fp->__bufstart : 0);
-#elif defined __QNX__ /* QNX */
- return (fp->_Mode & 0x2000 /*_MWRITE*/ ? fp->_Next - fp->_Buf : 0);
-#elif defined __MINT__ /* Atari FreeMiNT */
- return fp->__bufp - fp->__buffer;
-#elif defined EPLAN9 /* Plan9 */
- return fp->wp - fp->buf;
-#else
-# error "Please port gnulib fpending.c to your platform!"
- return 1;
-#endif
-}
diff --git a/cross/lib/fpending.h b/cross/lib/fpending.h
deleted file mode 100644
index 5e860db6810..00000000000
--- a/cross/lib/fpending.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Declare __fpending.
-
- Copyright (C) 2000, 2003, 2005-2006, 2009-2023 Free Software Foundation,
- Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>.
-
- Written by Jim Meyering. */
-
-#include <stddef.h>
-#include <stdio.h>
-#if HAVE_STDIO_EXT_H
-# include <stdio_ext.h>
-#endif
-
-#if !HAVE_DECL___FPENDING
-size_t __fpending (FILE *) _GL_ATTRIBUTE_PURE;
-#endif
diff --git a/cross/lib/fpucw.h b/cross/lib/fpucw.h
deleted file mode 100644
index 7dcb310eaf5..00000000000
--- a/cross/lib/fpucw.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/* Manipulating the FPU control word. -*- coding: utf-8 -*-
- Copyright (C) 2007-2023 Free Software Foundation, Inc.
- Written by Bruno Haible <bruno@clisp.org>, 2007.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General 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 _FPUCW_H
-#define _FPUCW_H
-
-/* The i386 floating point hardware (the 387 compatible FPU, not the modern
- SSE/SSE2 hardware) has a controllable rounding precision. It is specified
- through the 'PC' bits in the FPU control word ('fctrl' register). (See
- the GNU libc i386 <fpu_control.h> header for details.)
-
- On some platforms, such as Linux or Solaris, the default precision setting
- is set to "extended precision". This means that 'long double' instructions
- operate correctly, but 'double' computations often produce slightly
- different results as on strictly IEEE 754 conforming systems.
-
- On some platforms, such as NetBSD, the default precision is set to
- "double precision". This means that 'long double' instructions will operate
- only as 'double', i.e. lead to wrong results. Similarly on FreeBSD 6.4, at
- least for the division of 'long double' numbers.
-
- The FPU control word is under control of the application, i.e. it is
- not required to be set either way by the ABI. (In fact, the i386 ABI
- https://www.linux-mips.org/pub/linux/mips/doc/ABI/abi386-4.pdf page 3-12 = page 38
- is not clear about it. But in any case, gcc treats the control word
- like a "preserved" register: it emits code that assumes that the control
- word is preserved across calls, and it restores the control word at the
- end of functions that modify it.)
-
- See Vincent Lefèvre's page https://www.vinc17.net/research/extended.en.html
- for a good explanation.
- See https://web.archive.org/web/20060905133417/http://www.uwsg.iu.edu/hypermail/linux/kernel/0103.0/0453.html
- some argumentation which setting should be the default. */
-
-/* This header file provides the following facilities:
- fpucw_t integral type holding the value of 'fctrl'
- FPU_PC_MASK bit mask denoting the precision control
- FPU_PC_DOUBLE precision control for 53 bits mantissa
- FPU_PC_EXTENDED precision control for 64 bits mantissa
- GET_FPUCW () yields the current FPU control word
- SET_FPUCW (word) sets the FPU control word
- DECL_LONG_DOUBLE_ROUNDING variable declaration for
- BEGIN/END_LONG_DOUBLE_ROUNDING
- BEGIN_LONG_DOUBLE_ROUNDING () starts a sequence of instructions with
- 'long double' safe operation precision
- END_LONG_DOUBLE_ROUNDING () ends a sequence of instructions with
- 'long double' safe operation precision
- */
-
-/* Inline assembler like this works only with GNU C and clang. */
-#if (defined __i386__ || defined __x86_64__) && (defined __GNUC__ || defined __clang__)
-
-typedef unsigned short fpucw_t; /* glibc calls this fpu_control_t */
-
-# define FPU_PC_MASK 0x0300
-# define FPU_PC_DOUBLE 0x200 /* glibc calls this _FPU_DOUBLE */
-# define FPU_PC_EXTENDED 0x300 /* glibc calls this _FPU_EXTENDED */
-
-# define GET_FPUCW() __extension__ \
- ({ fpucw_t _cw; \
- __asm__ __volatile__ ("fnstcw %0" : "=m" (*&_cw)); \
- _cw; \
- })
-# define SET_FPUCW(word) __extension__ \
- (void)({ fpucw_t _ncw = (word); \
- __asm__ __volatile__ ("fldcw %0" : : "m" (*&_ncw)); \
- })
-
-# define DECL_LONG_DOUBLE_ROUNDING \
- fpucw_t oldcw;
-# define BEGIN_LONG_DOUBLE_ROUNDING() \
- (void)(oldcw = GET_FPUCW (), \
- SET_FPUCW ((oldcw & ~FPU_PC_MASK) | FPU_PC_EXTENDED))
-# define END_LONG_DOUBLE_ROUNDING() \
- SET_FPUCW (oldcw)
-
-#else
-
-typedef unsigned int fpucw_t;
-
-# define FPU_PC_MASK 0
-# define FPU_PC_DOUBLE 0
-# define FPU_PC_EXTENDED 0
-
-# define GET_FPUCW() 0
-# define SET_FPUCW(word) (void)(word)
-
-# define DECL_LONG_DOUBLE_ROUNDING
-# define BEGIN_LONG_DOUBLE_ROUNDING()
-# define END_LONG_DOUBLE_ROUNDING()
-
-#endif
-
-#endif /* _FPUCW_H */
diff --git a/cross/lib/free.c b/cross/lib/free.c
deleted file mode 100644
index 372a6b0fecf..00000000000
--- a/cross/lib/free.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Make free() preserve errno.
-
- Copyright (C) 2003, 2006, 2009-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* written by Paul Eggert */
-
-#include <config.h>
-
-/* Specification. */
-#include <stdlib.h>
-
-/* A function definition is only needed if HAVE_FREE_POSIX is not defined. */
-#if !HAVE_FREE_POSIX
-
-# include <errno.h>
-
-void
-rpl_free (void *p)
-# undef free
-{
-# if defined __GNUC__ && !defined __clang__
- /* An invalid GCC optimization
- <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98396>
- would optimize away the assignments in the code below, when link-time
- optimization (LTO) is enabled. Make the code more complicated, so that
- GCC does not grok how to optimize it. */
- int err[2];
- err[0] = errno;
- err[1] = errno;
- errno = 0;
- free (p);
- errno = err[errno == 0];
-# else
- int err = errno;
- free (p);
- errno = err;
-# endif
-}
-
-#endif
diff --git a/cross/lib/frexp.c b/cross/lib/frexp.c
deleted file mode 100644
index 78d627b5876..00000000000
--- a/cross/lib/frexp.c
+++ /dev/null
@@ -1,168 +0,0 @@
-/* Split a double into fraction and mantissa.
- Copyright (C) 2007-2023 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 Paolo Bonzini <bonzini@gnu.org>, 2003, and
- Bruno Haible <bruno@clisp.org>, 2007. */
-
-#if ! defined USE_LONG_DOUBLE
-# include <config.h>
-#endif
-
-/* Specification. */
-#include <math.h>
-
-#include <float.h>
-#ifdef USE_LONG_DOUBLE
-# include "isnanl-nolibm.h"
-# include "fpucw.h"
-#else
-# include "isnand-nolibm.h"
-#endif
-
-/* This file assumes FLT_RADIX = 2. If FLT_RADIX is a power of 2 greater
- than 2, or not even a power of 2, some rounding errors can occur, so that
- then the returned mantissa is only guaranteed to be <= 1.0, not < 1.0. */
-
-#ifdef USE_LONG_DOUBLE
-# define FUNC frexpl
-# define DOUBLE long double
-# define ISNAN isnanl
-# define DECL_ROUNDING DECL_LONG_DOUBLE_ROUNDING
-# define BEGIN_ROUNDING() BEGIN_LONG_DOUBLE_ROUNDING ()
-# define END_ROUNDING() END_LONG_DOUBLE_ROUNDING ()
-# define L_(literal) literal##L
-#else
-# define FUNC frexp
-# define DOUBLE double
-# define ISNAN isnand
-# define DECL_ROUNDING
-# define BEGIN_ROUNDING()
-# define END_ROUNDING()
-# define L_(literal) literal
-#endif
-
-DOUBLE
-FUNC (DOUBLE x, int *expptr)
-{
- int sign;
- int exponent;
- DECL_ROUNDING
-
- /* Test for NaN, infinity, and zero. */
- if (ISNAN (x) || x + x == x)
- {
- *expptr = 0;
- return x;
- }
-
- sign = 0;
- if (x < 0)
- {
- x = - x;
- sign = -1;
- }
-
- BEGIN_ROUNDING ();
-
- {
- /* Since the exponent is an 'int', it fits in 64 bits. Therefore the
- loops are executed no more than 64 times. */
- DOUBLE pow2[64]; /* pow2[i] = 2^2^i */
- DOUBLE powh[64]; /* powh[i] = 2^-2^i */
- int i;
-
- exponent = 0;
- if (x >= L_(1.0))
- {
- /* A positive exponent. */
- DOUBLE pow2_i; /* = pow2[i] */
- DOUBLE powh_i; /* = powh[i] */
-
- /* Invariants: pow2_i = 2^2^i, powh_i = 2^-2^i,
- x * 2^exponent = argument, x >= 1.0. */
- for (i = 0, pow2_i = L_(2.0), powh_i = L_(0.5);
- ;
- i++, pow2_i = pow2_i * pow2_i, powh_i = powh_i * powh_i)
- {
- if (x >= pow2_i)
- {
- exponent += (1 << i);
- x *= powh_i;
- }
- else
- break;
-
- pow2[i] = pow2_i;
- powh[i] = powh_i;
- }
- /* Avoid making x too small, as it could become a denormalized
- number and thus lose precision. */
- while (i > 0 && x < pow2[i - 1])
- {
- i--;
- powh_i = powh[i];
- }
- exponent += (1 << i);
- x *= powh_i;
- /* Here 2^-2^i <= x < 1.0. */
- }
- else
- {
- /* A negative or zero exponent. */
- DOUBLE pow2_i; /* = pow2[i] */
- DOUBLE powh_i; /* = powh[i] */
-
- /* Invariants: pow2_i = 2^2^i, powh_i = 2^-2^i,
- x * 2^exponent = argument, x < 1.0. */
- for (i = 0, pow2_i = L_(2.0), powh_i = L_(0.5);
- ;
- i++, pow2_i = pow2_i * pow2_i, powh_i = powh_i * powh_i)
- {
- if (x < powh_i)
- {
- exponent -= (1 << i);
- x *= pow2_i;
- }
- else
- break;
-
- pow2[i] = pow2_i;
- powh[i] = powh_i;
- }
- /* Here 2^-2^i <= x < 1.0. */
- }
-
- /* Invariants: x * 2^exponent = argument, and 2^-2^i <= x < 1.0. */
- while (i > 0)
- {
- i--;
- if (x < powh[i])
- {
- exponent -= (1 << i);
- x *= pow2[i];
- }
- }
- /* Here 0.5 <= x < 1.0. */
- }
-
- if (sign < 0)
- x = - x;
-
- END_ROUNDING ();
-
- *expptr = exponent;
- return x;
-}
diff --git a/cross/lib/frexpl.c b/cross/lib/frexpl.c
deleted file mode 100644
index 8b17094d50c..00000000000
--- a/cross/lib/frexpl.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Split a 'long double' into fraction and mantissa.
- Copyright (C) 2007, 2009-2023 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>
-
-#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
-
-/* Specification. */
-# include <math.h>
-
-long double
-frexpl (long double x, int *expptr)
-{
- return frexp (x, expptr);
-}
-
-#else
-
-# define USE_LONG_DOUBLE
-# include "frexp.c"
-
-#endif
diff --git a/cross/lib/fseterr.c b/cross/lib/fseterr.c
deleted file mode 100644
index 9b39305c6d5..00000000000
--- a/cross/lib/fseterr.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/* Set the error indicator of a stream.
- Copyright (C) 2007-2023 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 "fseterr.h"
-
-#include <errno.h>
-
-#include "stdio-impl.h"
-
-/* This file is not used on systems that have the __fseterr function,
- namely musl libc. */
-
-void
-fseterr (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 */
- fp->_flags |= _IO_ERR_SEEN;
-#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
- /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
- fp_->_flags |= __SERR;
-#elif defined __EMX__ /* emx+gcc */
- fp->_flags |= _IOERR;
-#elif defined __minix /* Minix */
- fp->_flags |= _IOERR;
-#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, UnixWare, mingw, MSVC, NonStop Kernel, OpenVMS */
- fp_->_flag |= _IOERR;
-#elif defined __UCLIBC__ /* uClibc */
- fp->__modeflags |= __FLAG_ERROR;
-#elif defined __QNX__ /* QNX */
- fp->_Mode |= 0x200 /* _MERR */;
-#elif defined __MINT__ /* Atari FreeMiNT */
- fp->__error = 1;
-#elif defined EPLAN9 /* Plan9 */
- if (fp->state != 0 /* CLOSED */)
- fp->state = 5 /* ERR */;
-#elif 0 /* unknown */
- /* Portable fallback, based on an idea by Rich Felker.
- Wow! 6 system calls for something that is just a bit operation!
- Not activated on any system, because there is no way to repair FP when
- the sequence of system calls fails, and library code should not call
- abort(). */
- int saved_errno;
- int fd;
- int fd2;
-
- saved_errno = errno;
- fflush (fp);
- fd = fileno (fp);
- fd2 = dup (fd);
- if (fd2 >= 0)
- {
- close (fd);
- fputc ('\0', fp); /* This should set the error indicator. */
- fflush (fp); /* Or this. */
- if (dup2 (fd2, fd) < 0)
- /* Whee... we botched the stream and now cannot restore it! */
- abort ();
- close (fd2);
- }
- errno = saved_errno;
-#else
- #error "Please port gnulib fseterr.c to your platform! Look at the definitions of ferror and clearerr on your system, then report this to bug-gnulib."
-#endif
-}
diff --git a/cross/lib/fseterr.h b/cross/lib/fseterr.h
deleted file mode 100644
index 0e9d2060aef..00000000000
--- a/cross/lib/fseterr.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Set the error indicator of a stream.
- Copyright (C) 2007, 2009-2023 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 _FSETERR_H
-#define _FSETERR_H
-
-#include <stdio.h>
-
-/* Set the error indicator of the stream FP.
- The "error indicator" is set when an I/O operation on the stream fails, and
- is cleared (together with the "end-of-file" indicator) by clearerr (FP). */
-
-#if HAVE___FSETERR /* musl libc */
-
-# include <stdio_ext.h>
-# define fseterr(fp) __fseterr (fp)
-
-#else
-
-# ifdef __cplusplus
-extern "C" {
-# endif
-
-extern void fseterr (FILE *fp);
-
-# ifdef __cplusplus
-}
-# endif
-
-#endif
-
-#endif /* _FSETERR_H */
diff --git a/cross/lib/fstatat.c b/cross/lib/fstatat.c
deleted file mode 100644
index 372965ef5f6..00000000000
--- a/cross/lib/fstatat.c
+++ /dev/null
@@ -1,148 +0,0 @@
-/* Work around an fstatat bug on Solaris 9.
-
- Copyright (C) 2006, 2009-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert and Jim Meyering. */
-
-/* If the user's config.h happens to include <sys/stat.h>, let it include only
- the system's <sys/stat.h> here, so that orig_fstatat doesn't recurse to
- rpl_fstatat. */
-#define __need_system_sys_stat_h
-#include <config.h>
-
-/* Get the original definition of fstatat. It might be defined as a macro. */
-#include <sys/types.h>
-#include <sys/stat.h>
-#undef __need_system_sys_stat_h
-
-#if HAVE_FSTATAT && HAVE_WORKING_FSTATAT_ZERO_FLAG
-static int
-orig_fstatat (int fd, char const *filename, struct stat *buf, int flags)
-{
- return fstatat (fd, filename, buf, flags);
-}
-#endif
-
-#ifdef __osf__
-/* Write "sys/stat.h" here, not <sys/stat.h>, otherwise OSF/1 5.1 DTK cc
- eliminates this include because of the preliminary #include <sys/stat.h>
- above. */
-# include "sys/stat.h"
-#else
-# include <sys/stat.h>
-#endif
-
-#include "stat-time.h"
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <string.h>
-
-#if HAVE_FSTATAT && HAVE_WORKING_FSTATAT_ZERO_FLAG
-
-# ifndef LSTAT_FOLLOWS_SLASHED_SYMLINK
-# define LSTAT_FOLLOWS_SLASHED_SYMLINK 0
-# endif
-
-static int
-normal_fstatat (int fd, char const *file, struct stat *st, int flag)
-{
- return stat_time_normalize (orig_fstatat (fd, file, st, flag), st);
-}
-
-/* fstatat should always follow symbolic links that end in /, but on
- Solaris 9 it doesn't if AT_SYMLINK_NOFOLLOW is specified.
- Likewise, trailing slash on a non-directory should be an error.
- These are the same problems that lstat.c and stat.c address, so
- solve it in a similar way.
-
- AIX 7.1 fstatat (AT_FDCWD, ..., 0) always fails, which is a bug.
- Work around this bug if FSTATAT_AT_FDCWD_0_BROKEN is nonzero. */
-
-int
-rpl_fstatat (int fd, char const *file, struct stat *st, int flag)
-{
- int result = normal_fstatat (fd, file, st, flag);
- size_t len;
-
- if (LSTAT_FOLLOWS_SLASHED_SYMLINK || result != 0)
- return result;
- len = strlen (file);
- if (flag & AT_SYMLINK_NOFOLLOW)
- {
- /* Fix lstat behavior. */
- if (file[len - 1] != '/' || S_ISDIR (st->st_mode))
- return 0;
- if (!S_ISLNK (st->st_mode))
- {
- errno = ENOTDIR;
- return -1;
- }
- result = normal_fstatat (fd, file, st, flag & ~AT_SYMLINK_NOFOLLOW);
- }
- /* Fix stat behavior. */
- if (result == 0 && !S_ISDIR (st->st_mode) && file[len - 1] == '/')
- {
- errno = ENOTDIR;
- return -1;
- }
- return result;
-}
-
-#else /* ! (HAVE_FSTATAT && HAVE_WORKING_FSTATAT_ZERO_FLAG) */
-
-/* On mingw, the gnulib <sys/stat.h> defines 'stat' as a function-like
- macro; but using it in AT_FUNC_F2 causes compilation failure
- because the preprocessor sees a use of a macro that requires two
- arguments but is only given one. Hence, we need an inline
- forwarder to get past the preprocessor. */
-static int
-stat_func (char const *name, struct stat *st)
-{
- return stat (name, st);
-}
-
-/* Likewise, if there is no native 'lstat', then the gnulib
- <sys/stat.h> defined it as stat, which also needs adjustment. */
-# if !HAVE_LSTAT
-# undef lstat
-# define lstat stat_func
-# endif
-
-/* Replacement for Solaris' function by the same name.
- <https://www.google.com/search?q=fstatat+site:docs.oracle.com>
- First, try to simulate it via l?stat ("/proc/self/fd/FD/FILE").
- Failing that, simulate it via save_cwd/fchdir/(stat|lstat)/restore_cwd.
- If either the save_cwd or the restore_cwd fails (relatively unlikely),
- then give a diagnostic and exit nonzero.
- Otherwise, this function works just like Solaris' fstatat. */
-
-# define AT_FUNC_NAME fstatat
-# define AT_FUNC_F1 lstat
-# define AT_FUNC_F2 stat_func
-# define AT_FUNC_USE_F1_COND AT_SYMLINK_NOFOLLOW
-# define AT_FUNC_POST_FILE_PARAM_DECLS , struct stat *st, int flag
-# define AT_FUNC_POST_FILE_ARGS , st
-# include "at-func.c"
-# undef AT_FUNC_NAME
-# undef AT_FUNC_F1
-# undef AT_FUNC_F2
-# undef AT_FUNC_USE_F1_COND
-# undef AT_FUNC_POST_FILE_PARAM_DECLS
-# undef AT_FUNC_POST_FILE_ARGS
-
-#endif /* !HAVE_FSTATAT */
diff --git a/cross/lib/fsusage.c b/cross/lib/fsusage.c
deleted file mode 100644
index f6f4b1c35fd..00000000000
--- a/cross/lib/fsusage.c
+++ /dev/null
@@ -1,233 +0,0 @@
-/* fsusage.c -- return space usage of mounted file systems
-
- Copyright (C) 1991-1992, 1996, 1998-1999, 2002-2006, 2009-2023 Free Software
- Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-#include "fsusage.h"
-
-#include <limits.h>
-#include <sys/types.h>
-
-#if STAT_STATVFS || STAT_STATVFS64 /* POSIX 1003.1-2001 (and later) with XSI */
-# include <sys/statvfs.h>
-#else
-/* Don't include backward-compatibility files unless they're needed.
- Eventually we'd like to remove all this cruft. */
-# include <fcntl.h>
-# include <unistd.h>
-# include <sys/stat.h>
-#if HAVE_SYS_PARAM_H
-# include <sys/param.h>
-#endif
-#if HAVE_SYS_MOUNT_H
-# include <sys/mount.h>
-#endif
-#if HAVE_SYS_VFS_H
-# include <sys/vfs.h>
-#endif
-# if HAVE_SYS_FS_S5PARAM_H /* Fujitsu UXP/V */
-# include <sys/fs/s5param.h>
-# endif
-# if HAVE_SYS_STATFS_H
-# include <sys/statfs.h>
-# endif
-#endif
-
-/* Many space usage primitives use all 1 bits to denote a value that is
- not applicable or unknown. Propagate this information by returning
- a uintmax_t value that is all 1 bits if X is all 1 bits, even if X
- is unsigned and narrower than uintmax_t. */
-#define PROPAGATE_ALL_ONES(x) \
- ((sizeof (x) < sizeof (uintmax_t) \
- && (~ (x) == (sizeof (x) < sizeof (int) \
- ? - (1 << (sizeof (x) * CHAR_BIT)) \
- : 0))) \
- ? UINTMAX_MAX : (uintmax_t) (x))
-
-/* Extract the top bit of X as an uintmax_t value. */
-#define EXTRACT_TOP_BIT(x) ((x) \
- & ((uintmax_t) 1 << (sizeof (x) * CHAR_BIT - 1)))
-
-/* If a value is negative, many space usage primitives store it into an
- integer variable by assignment, even if the variable's type is unsigned.
- So, if a space usage variable X's top bit is set, convert X to the
- uintmax_t value V such that (- (uintmax_t) V) is the negative of
- the original value. If X's top bit is clear, just yield X.
- Use PROPAGATE_TOP_BIT if the original value might be negative;
- otherwise, use PROPAGATE_ALL_ONES. */
-#define PROPAGATE_TOP_BIT(x) ((x) | ~ (EXTRACT_TOP_BIT (x) - 1))
-
-#ifdef STAT_STATVFS
-/* Return true if statvfs works. This is false for statvfs on systems
- with GNU libc on Linux kernels before 2.6.36, which stats all
- preceding entries in /proc/mounts; that makes df hang if even one
- of the corresponding file systems is hard-mounted but not available. */
-# if ! (__linux__ && (__GLIBC__ || __UCLIBC__))
-/* The FRSIZE fallback is not required in this case. */
-# undef STAT_STATFS2_FRSIZE
-static int statvfs_works (void) { return 1; }
-# else
-# include <string.h> /* for strverscmp */
-# include <sys/utsname.h>
-# include <sys/statfs.h>
-# define STAT_STATFS2_BSIZE 1
-
-static int
-statvfs_works (void)
-{
- static int statvfs_works_cache = -1;
- struct utsname name;
- if (statvfs_works_cache < 0)
- statvfs_works_cache = (uname (&name) == 0
- && 0 <= strverscmp (name.release, "2.6.36"));
- return statvfs_works_cache;
-}
-# endif
-#endif
-
-
-/* Fill in the fields of FSP with information about space usage for
- the file system on which FILE resides.
- DISK is the device on which FILE is mounted, for space-getting
- methods that need to know it.
- Return 0 if successful, -1 if not. When returning -1, ensure that
- ERRNO is either a system error value, or zero if DISK is NULL
- on a system that requires a non-NULL value. */
-int
-get_fs_usage (char const *file, char const *disk, struct fs_usage *fsp)
-{
-#ifdef STAT_STATVFS /* POSIX, except pre-2.6.36 glibc/Linux */
-
- if (statvfs_works ())
- {
- struct statvfs vfsd;
-
- if (statvfs (file, &vfsd) < 0)
- return -1;
-
- /* f_frsize isn't guaranteed to be supported. */
- fsp->fsu_blocksize = (vfsd.f_frsize
- ? PROPAGATE_ALL_ONES (vfsd.f_frsize)
- : PROPAGATE_ALL_ONES (vfsd.f_bsize));
-
- fsp->fsu_blocks = PROPAGATE_ALL_ONES (vfsd.f_blocks);
- fsp->fsu_bfree = PROPAGATE_ALL_ONES (vfsd.f_bfree);
- fsp->fsu_bavail = PROPAGATE_TOP_BIT (vfsd.f_bavail);
- fsp->fsu_bavail_top_bit_set = EXTRACT_TOP_BIT (vfsd.f_bavail) != 0;
- fsp->fsu_files = PROPAGATE_ALL_ONES (vfsd.f_files);
- fsp->fsu_ffree = PROPAGATE_ALL_ONES (vfsd.f_ffree);
- return 0;
- }
-
-#endif
-
-#if defined STAT_STATVFS64 /* AIX */
-
- struct statvfs64 fsd;
-
- if (statvfs64 (file, &fsd) < 0)
- return -1;
-
- /* f_frsize isn't guaranteed to be supported. */
- fsp->fsu_blocksize = (fsd.f_frsize
- ? PROPAGATE_ALL_ONES (fsd.f_frsize)
- : PROPAGATE_ALL_ONES (fsd.f_bsize));
-
-#elif defined STAT_STATFS3_OSF1 /* OSF/1 */
-
- struct statfs fsd;
-
- if (statfs (file, &fsd, sizeof (struct statfs)) != 0)
- return -1;
-
- fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_fsize);
-
-#elif defined STAT_STATFS2_FRSIZE /* 2.6 < glibc/Linux < 2.6.36 */
-
- struct statfs fsd;
-
- if (statfs (file, &fsd) < 0)
- return -1;
-
- fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_frsize);
-
-#elif defined STAT_STATFS2_BSIZE /* glibc/Linux < 2.6, 4.3BSD, SunOS 4, \
- Mac OS X < 10.4, FreeBSD < 5.0, \
- NetBSD < 3.0, OpenBSD < 4.4 */
-
- struct statfs fsd;
-
- if (statfs (file, &fsd) < 0)
- return -1;
-
- fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_bsize);
-
-# ifdef STATFS_TRUNCATES_BLOCK_COUNTS
-
- /* In SunOS 4.1.2, 4.1.3, and 4.1.3_U1, the block counts in the
- struct statfs are truncated to 2GB. These conditions detect that
- truncation, presumably without botching the 4.1.1 case, in which
- the values are not truncated. The correct counts are stored in
- undocumented spare fields. */
- if (fsd.f_blocks == 0x7fffffff / fsd.f_bsize && fsd.f_spare[0] > 0)
- {
- fsd.f_blocks = fsd.f_spare[0];
- fsd.f_bfree = fsd.f_spare[1];
- fsd.f_bavail = fsd.f_spare[2];
- }
-# endif /* STATFS_TRUNCATES_BLOCK_COUNTS */
-
-#elif defined STAT_STATFS2_FSIZE /* 4.4BSD and older NetBSD */
-
- struct statfs fsd;
-
- if (statfs (file, &fsd) < 0)
- return -1;
-
- fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_fsize);
-
-#elif defined STAT_STATFS4 /* SVR3, old Irix */
-
- struct statfs fsd;
-
- if (statfs (file, &fsd, sizeof fsd, 0) < 0)
- return -1;
-
- /* Empirically, the block counts on most SVR3 and SVR3-derived
- systems seem to always be in terms of 512-byte blocks,
- no matter what value f_bsize has. */
- fsp->fsu_blocksize = 512;
-
-#endif
-
-#if (defined STAT_STATVFS64 || defined STAT_STATFS3_OSF1 \
- || defined STAT_STATFS2_FRSIZE || defined STAT_STATFS2_BSIZE \
- || defined STAT_STATFS2_FSIZE || defined STAT_STATFS4)
-
- fsp->fsu_blocks = PROPAGATE_ALL_ONES (fsd.f_blocks);
- fsp->fsu_bfree = PROPAGATE_ALL_ONES (fsd.f_bfree);
- fsp->fsu_bavail = PROPAGATE_TOP_BIT (fsd.f_bavail);
- fsp->fsu_bavail_top_bit_set = EXTRACT_TOP_BIT (fsd.f_bavail) != 0;
- fsp->fsu_files = PROPAGATE_ALL_ONES (fsd.f_files);
- fsp->fsu_ffree = PROPAGATE_ALL_ONES (fsd.f_ffree);
-
-#endif
-
- (void) disk; /* avoid argument-unused warning */
- return 0;
-}
diff --git a/cross/lib/fsusage.h b/cross/lib/fsusage.h
deleted file mode 100644
index 9630b04e001..00000000000
--- a/cross/lib/fsusage.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* fsusage.h -- declarations for file system space usage info
-
- Copyright (C) 1991-1992, 1997, 2003-2006, 2009-2023 Free Software
- Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Space usage statistics for a file system. Blocks are 512-byte. */
-
-#if !defined FSUSAGE_H_
-# define FSUSAGE_H_
-
-# include <stdint.h>
-
-struct fs_usage
-{
- uintmax_t fsu_blocksize; /* Size of a block. */
- uintmax_t fsu_blocks; /* Total blocks. */
- uintmax_t fsu_bfree; /* Free blocks available to superuser. */
- uintmax_t fsu_bavail; /* Free blocks available to non-superuser. */
- bool fsu_bavail_top_bit_set; /* 1 if fsu_bavail represents a value < 0. */
- uintmax_t fsu_files; /* Total file nodes. */
- uintmax_t fsu_ffree; /* Free file nodes. */
-};
-
-int get_fs_usage (char const *file, char const *disk, struct fs_usage *fsp);
-
-#endif
diff --git a/cross/lib/fsync.c b/cross/lib/fsync.c
deleted file mode 100644
index 51314662872..00000000000
--- a/cross/lib/fsync.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/* Emulate fsync on platforms that lack it, primarily Windows and
- cross-compilers like MinGW.
-
- This is derived from sqlite3 sources.
- https://www.sqlite.org/src/finfo?name=src/os_win.c
- https://www.sqlite.org/copyright.html
-
- Written by Richard W.M. Jones <rjones.at.redhat.com>
-
- Copyright (C) 2008-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-#include <unistd.h>
-
-#if defined _WIN32 && ! defined __CYGWIN__
-
-/* FlushFileBuffers */
-# define WIN32_LEAN_AND_MEAN
-# include <windows.h>
-
-# include <errno.h>
-
-/* Get _get_osfhandle. */
-# if GNULIB_MSVC_NOTHROW
-# include "msvc-nothrow.h"
-# else
-# include <io.h>
-# endif
-
-int
-fsync (int fd)
-{
- HANDLE h = (HANDLE) _get_osfhandle (fd);
- DWORD err;
-
- if (h == INVALID_HANDLE_VALUE)
- {
- errno = EBADF;
- return -1;
- }
-
- if (!FlushFileBuffers (h))
- {
- /* Translate some Windows errors into rough approximations of Unix
- * errors. MSDN is useless as usual - in this case it doesn't
- * document the full range of errors.
- */
- err = GetLastError ();
- switch (err)
- {
- case ERROR_ACCESS_DENIED:
- /* For a read-only handle, fsync should succeed, even though we have
- no way to sync the access-time changes. */
- return 0;
-
- /* eg. Trying to fsync a tty. */
- case ERROR_INVALID_HANDLE:
- errno = EINVAL;
- break;
-
- default:
- errno = EIO;
- }
- return -1;
- }
-
- return 0;
-}
-
-#else /* !Windows */
-
-# error "This platform lacks fsync function, and Gnulib doesn't provide a replacement. This is a bug in Gnulib."
-
-#endif /* !Windows */
diff --git a/cross/lib/ftoastr.c b/cross/lib/ftoastr.c
deleted file mode 100644
index 8740a4d86c8..00000000000
--- a/cross/lib/ftoastr.c
+++ /dev/null
@@ -1,151 +0,0 @@
-/* floating point to accurate string
-
- Copyright (C) 2010-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert. */
-
-/* This code can misbehave on some buggy or older platforms, when
- operating on arguments on floating types other than 'double', or
- when given unusual combinations of options. Gnulib's
- snprintf-posix module works around many of these problems.
-
- This code relies on sprintf, strtod, etc. operating accurately;
- otherwise, the resulting strings could be inaccurate or too long. */
-
-#include <config.h>
-
-#include "ftoastr.h"
-
-#include <float.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#ifdef C_LOCALE
-# include "c-snprintf.h"
-# include "c-strtod.h"
-# define PREFIX(name) c_ ## name
-#else
-# define PREFIX(name) name
-#endif
-
-#if LENGTH == 3
-# define FLOAT long double
-# define FLOAT_DIG LDBL_DIG
-# define FLOAT_MIN LDBL_MIN
-# define FLOAT_PREC_BOUND _GL_LDBL_PREC_BOUND
-# define FTOASTR PREFIX (ldtoastr)
-# define PROMOTED_FLOAT long double
-# define STRTOF PREFIX (strtold)
-#elif LENGTH == 2
-# define FLOAT double
-# define FLOAT_DIG DBL_DIG
-# define FLOAT_MIN DBL_MIN
-# define FLOAT_PREC_BOUND _GL_DBL_PREC_BOUND
-# define FTOASTR PREFIX (dtoastr)
-# define PROMOTED_FLOAT double
-#else
-# define LENGTH 1
-# define FLOAT float
-# define FLOAT_DIG FLT_DIG
-# define FLOAT_MIN FLT_MIN
-# define FLOAT_PREC_BOUND _GL_FLT_PREC_BOUND
-# define FTOASTR PREFIX (ftoastr)
-# define PROMOTED_FLOAT double
-# if HAVE_STRTOF
-# define STRTOF strtof
-# endif
-#endif
-
-/* On pre-C99 hosts, approximate strtof with strtod. This
- may generate one or two extra digits, but that's better than not
- working at all. */
-#ifndef STRTOF
-# define STRTOF PREFIX (strtod)
-#endif
-
-/* On hosts where it's not known that snprintf works, use sprintf to
- implement the subset needed here. Typically BUFSIZE is big enough
- and there's little or no performance hit. */
-#ifdef C_LOCALE
-# undef snprintf
-# define snprintf c_snprintf
-#elif ! GNULIB_SNPRINTF
-# undef snprintf
-# define snprintf ftoastr_snprintf
-static int
-ftoastr_snprintf (char *buf, size_t bufsize, char const *format,
- int width, int prec, FLOAT x)
-{
- PROMOTED_FLOAT promoted_x = x;
- char width_0_buffer[LENGTH == 1 ? FLT_BUFSIZE_BOUND
- : LENGTH == 2 ? DBL_BUFSIZE_BOUND
- : LDBL_BUFSIZE_BOUND];
- int n = width;
- if (bufsize < sizeof width_0_buffer)
- {
- n = sprintf (width_0_buffer, format, 0, prec, promoted_x);
- if (n < 0)
- return n;
- if (n < width)
- n = width;
- }
- if (n < bufsize)
- n = sprintf (buf, format, width, prec, promoted_x);
- return n;
-}
-#endif
-
-int
-FTOASTR (char *buf, size_t bufsize, int flags, int width, FLOAT x)
-{
- /* The following method is simple but slow.
- For ideas about speeding things up, please see:
-
- Andrysco M, Jhala R, Lerner S. Printing floating-point numbers:
- a faster, always correct method. ACM SIGPLAN notices - POPL '16.
- 2016;51(1):555-67 <https://doi.org/10.1145/2914770.2837654>; draft at
- <https://cseweb.ucsd.edu/~lerner/papers/fp-printing-popl16.pdf>. */
-
- PROMOTED_FLOAT promoted_x = x;
- char format[sizeof "%-+ 0*.*Lg"];
- FLOAT abs_x = x < 0 ? -x : x;
- int prec;
-
- char *p = format;
- *p++ = '%';
-
- /* Support flags that generate output parsable by strtof. */
- *p = '-'; p += (flags & FTOASTR_LEFT_JUSTIFY ) != 0;
- *p = '+'; p += (flags & FTOASTR_ALWAYS_SIGNED ) != 0;
- *p = ' '; p += (flags & FTOASTR_SPACE_POSITIVE) != 0;
- *p = '0'; p += (flags & FTOASTR_ZERO_PAD ) != 0;
-
- *p++ = '*';
- *p++ = '.';
- *p++ = '*';
- *p = 'L'; p += 2 < LENGTH;
- *p++ = flags & FTOASTR_UPPER_E ? 'G' : 'g';
- *p = '\0';
-
- for (prec = abs_x < FLOAT_MIN ? 1 : FLOAT_DIG; ; prec++)
- {
- int n = snprintf (buf, bufsize, format, width, prec, promoted_x);
- if (n < 0
- || FLOAT_PREC_BOUND <= prec
- || (n < bufsize && STRTOF (buf, NULL) == x))
- return n;
- }
-}
diff --git a/cross/lib/ftoastr.h b/cross/lib/ftoastr.h
deleted file mode 100644
index 1ce1b7a4bc6..00000000000
--- a/cross/lib/ftoastr.h
+++ /dev/null
@@ -1,152 +0,0 @@
-/* floating point to accurate string
-
- Copyright (C) 2010-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert. */
-
-#ifndef _GL_FTOASTR_H
-#define _GL_FTOASTR_H
-
-#include "intprops.h"
-#include <float.h>
-#include <stddef.h>
-
-/* Store into BUF (of size BUFSIZE) an accurate minimal-precision
- string representation of a floating point number. FLAGS affect the
- formatting of the number. Pad the output string with spaces as
- necessary to width WIDTH bytes, in the style of printf. WIDTH must
- be nonnegative. X is the floating-point number to be converted.
-
- Return the number of bytes stored into BUF, not counting the
- terminating null. However, do not overrun BUF: if BUF is too
- small, return a fairly tight (but not necessarily exact) upper
- bound on the value that would have been returned if BUF had been
- big enough. If SIZE is zero, BUF may be a null pointer. On error
- (e.g., returned value would exceed INT_MAX), return -1 and set
- errno.
-
- Example:
-
- char buf[DBL_BUFSIZE_BOUND];
- int r = dtoastr (buf, sizeof buf, 0, 0, 0.1);
-
- In the C locale, this sets R to 3 and stores "0.1" into BUF. */
-
-int ftoastr (char *buf, size_t bufsize, int flags, int width, float x);
-int dtoastr (char *buf, size_t bufsize, int flags, int width, double x);
-int ldtoastr (char *buf, size_t bufsize, int flags, int width, long double x);
-
-/* The last two functions except that the formatting takes place in
- the C locale. */
-int c_dtoastr (char *buf, size_t bufsize, int flags, int width, double x);
-int c_ldtoastr (char *buf, size_t bufsize, int flags, int width, long double x);
-
-
-/* Flag values for ftoastr etc. These can be ORed together. */
-enum
- {
- /* Left justify within the width; the default is right justification. */
- FTOASTR_LEFT_JUSTIFY = 1,
-
- /* Output "+" before positive numbers; the default outputs nothing. */
- FTOASTR_ALWAYS_SIGNED = 2,
-
- /* Output " " before positive numbers; ignored if
- FTOASTR_ALWAYS_SIGNED is also given. */
- FTOASTR_SPACE_POSITIVE = 4,
-
- /* Pad with zeros instead of spaces; ignored if FTOASTR_LEFT_JUSTIFY
- is also given. */
- FTOASTR_ZERO_PAD = 8,
-
- /* Use 'E' instead of 'e' before the exponent. */
- FTOASTR_UPPER_E = 16
- };
-
-
-/* _GL_FLT_PREC_BOUND is an upper bound on the precision needed to
- represent a float value without losing information. Likewise for
- _GL_DBL_PREC_BOUND and double, and _GL_LDBL_PREC_BOUND and long double.
- These are macros, not enums, to work around a bug in IBM xlc 12.1. */
-
-#if FLT_RADIX == 10 /* decimal floating point */
-# define _GL_FLT_PREC_BOUND FLT_MANT_DIG
-# define _GL_DBL_PREC_BOUND DBL_MANT_DIG
-# define _GL_LDBL_PREC_BOUND LDBL_MANT_DIG
-#else
-
-/* An upper bound on the number of bits needed to represent a single
- digit in a floating-point fraction. */
-# if FLT_RADIX == 2 /* IEEE 754 floating point, VAX floating point, etc. */
-# define _GL_FLOAT_DIG_BITS_BOUND 1
-# elif FLT_RADIX <= 16 /* IBM hex floating point has FLT_RADIX == 16. */
-# define _GL_FLOAT_DIG_BITS_BOUND 4
-# else /* no machine is this bad, but let's be complete */
-# define _GL_FLOAT_DIG_BITS_BOUND ((int) TYPE_WIDTH (int) - 1)
-# endif
-
-/* An upper bound on the number of decimal digits needed to represent
- a floating point number accurately, assuming a fraction contains
- DIG digits. For why the "+ 1" is needed, see "Binary to Decimal
- Conversion" in David Goldberg's paper "What Every Computer
- Scientist Should Know About Floating-Point Arithmetic"
- <https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html>. */
-# define _GL_FLOAT_PREC_BOUND(dig) \
- (INT_BITS_STRLEN_BOUND ((dig) * _GL_FLOAT_DIG_BITS_BOUND) + 1)
-
-# define _GL_FLT_PREC_BOUND _GL_FLOAT_PREC_BOUND ( FLT_MANT_DIG)
-# define _GL_DBL_PREC_BOUND _GL_FLOAT_PREC_BOUND ( DBL_MANT_DIG)
-# define _GL_LDBL_PREC_BOUND _GL_FLOAT_PREC_BOUND (LDBL_MANT_DIG)
-#endif
-
-
-/* Bound on the number of bytes printed for an exponent in the range
- MIN..MAX, where MIN < 0 < MAX; printf always prints a sign and at
- least 2 digits. Although the maximum known exponent is 4932 for
- IEEE 754 binary128, support tight bounds for exponents up to a
- million, just in case. */
-#define _GL_FLOAT_EXPONENT_STRLEN_BOUND(min, max) \
- ( -100 < (min) && (max) < 100 ? 3 \
- : -1000 < (min) && (max) < 1000 ? 4 \
- : -10000 < (min) && (max) < 10000 ? 5 \
- : -100000 < (min) && (max) < 100000 ? 6 \
- : -1000000 < (min) && (max) < 1000000 ? 7 \
- : INT_STRLEN_BOUND (int) /* not a tight bound */)
-
-/* A reasonably tight bound on the length of a type-T floating value
- formatted with ftoastr etc. Room is needed for sign, fraction
- digits, decimal point, "e", and exponent. POINTLEN should be a
- reasonably tight bound on the string length of the decimal
- point. */
-#define _GL_FLOAT_STRLEN_BOUND_L(t, pointlen) \
- (1 + _GL_##t##_PREC_BOUND + pointlen + 1 \
- + _GL_FLOAT_EXPONENT_STRLEN_BOUND (t##_MIN_10_EXP, t##_MAX_10_EXP))
-#define FLT_STRLEN_BOUND_L(pointlen) _GL_FLOAT_STRLEN_BOUND_L ( FLT, pointlen)
-#define DBL_STRLEN_BOUND_L(pointlen) _GL_FLOAT_STRLEN_BOUND_L ( DBL, pointlen)
-#define LDBL_STRLEN_BOUND_L(pointlen) _GL_FLOAT_STRLEN_BOUND_L (LDBL, pointlen)
-
-/* Looser bounds that are locale-independent and are integral constant
- expressions. */
-#define FLT_STRLEN_BOUND FLT_STRLEN_BOUND_L (MB_LEN_MAX)
-#define DBL_STRLEN_BOUND DBL_STRLEN_BOUND_L (MB_LEN_MAX)
-#define LDBL_STRLEN_BOUND LDBL_STRLEN_BOUND_L (MB_LEN_MAX)
-
-/* Looser, locale-independent bounds that include the trailing null byte. */
-#define FLT_BUFSIZE_BOUND ( FLT_STRLEN_BOUND + 1)
-#define DBL_BUFSIZE_BOUND ( DBL_STRLEN_BOUND + 1)
-#define LDBL_BUFSIZE_BOUND (LDBL_STRLEN_BOUND + 1)
-
-#endif /* _GL_FTOASTR_H */
diff --git a/cross/lib/futimens.c b/cross/lib/futimens.c
deleted file mode 100644
index 5bb30493c7e..00000000000
--- a/cross/lib/futimens.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Set the access and modification time of an open fd.
- Copyright (C) 2009-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* written by Eric Blake */
-
-#include <config.h>
-
-#include <sys/stat.h>
-
-#include "utimens.h"
-
-/* Set the access and modification timestamps of FD to be
- TIMESPEC[0] and TIMESPEC[1], respectively.
- Fail with ENOSYS on systems without futimes (or equivalent).
- If TIMESPEC is null, set the timestamps to the current time.
- Return 0 on success, -1 (setting errno) on failure. */
-int
-futimens (int fd, struct timespec const times[2])
-{
- /* fdutimens also works around bugs in native futimens, when running
- with glibc compiled against newer headers but on a Linux kernel
- older than 2.6.32. */
- return fdutimens (fd, NULL, times);
-}
diff --git a/cross/lib/get-permissions.c b/cross/lib/get-permissions.c
deleted file mode 100644
index 545ad23195b..00000000000
--- a/cross/lib/get-permissions.c
+++ /dev/null
@@ -1,291 +0,0 @@
-/* Get permissions of a file. -*- coding: utf-8 -*-
-
- Copyright (C) 2002-2003, 2005-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>.
-
- Written by Paul Eggert, Andreas Grünbacher, and Bruno Haible. */
-
-#include <config.h>
-
-#include <string.h>
-#include "acl.h"
-
-#include "acl-internal.h"
-
-/* Read the permissions of a file into CTX. If DESC is a valid file descriptor,
- use file descriptor operations, else use filename based operations on NAME.
- MODE is the file mode obtained from a previous stat call.
- Return 0 if successful. Return -1 and set errno upon failure. */
-
-int
-get_permissions (const char *name, int desc, mode_t mode,
- struct permission_context *ctx)
-{
- memset (ctx, 0, sizeof *ctx);
- ctx->mode = mode;
-
-#if USE_ACL && HAVE_ACL_GET_FILE
- /* POSIX 1003.1e (draft 17 -- abandoned) specific version. */
- /* Linux, FreeBSD, Mac OS X, IRIX, Tru64, Cygwin >= 2.5 */
-# if !HAVE_ACL_TYPE_EXTENDED
- /* Linux, FreeBSD, IRIX, Tru64, Cygwin >= 2.5 */
-
- if (HAVE_ACL_GET_FD && desc != -1)
- ctx->acl = acl_get_fd (desc);
- else
- ctx->acl = acl_get_file (name, ACL_TYPE_ACCESS);
- if (ctx->acl == NULL)
- return acl_errno_valid (errno) ? -1 : 0;
-
- /* With POSIX ACLs, a file cannot have "no" acl; a file without
- extended permissions has a "minimal" acl which is equivalent to the
- file mode. */
-
- if (S_ISDIR (mode))
- {
- ctx->default_acl = acl_get_file (name, ACL_TYPE_DEFAULT);
- if (ctx->default_acl == NULL)
- return -1;
- }
-
-# if HAVE_ACL_TYPE_NFS4 /* FreeBSD */
-
- /* TODO (see set_permissions). */
-
-# endif
-
-# else /* HAVE_ACL_TYPE_EXTENDED */
- /* Mac OS X */
-
- /* On Mac OS X, acl_get_file (name, ACL_TYPE_ACCESS)
- and acl_get_file (name, ACL_TYPE_DEFAULT)
- always return NULL / EINVAL. You have to use
- acl_get_file (name, ACL_TYPE_EXTENDED)
- or acl_get_fd (open (name, ...))
- to retrieve an ACL.
- On the other hand,
- acl_set_file (name, ACL_TYPE_ACCESS, acl)
- and acl_set_file (name, ACL_TYPE_DEFAULT, acl)
- have the same effect as
- acl_set_file (name, ACL_TYPE_EXTENDED, acl):
- Each of these calls sets the file's ACL. */
-
- if (HAVE_ACL_GET_FD && desc != -1)
- ctx->acl = acl_get_fd (desc);
- else
- ctx->acl = acl_get_file (name, ACL_TYPE_EXTENDED);
- if (ctx->acl == NULL)
- return acl_errno_valid (errno) ? -1 : 0;
-
-# endif
-
-#elif USE_ACL && defined GETACL /* Solaris, Cygwin, not HP-UX */
-
- /* Solaris 2.5 through Solaris 10, Cygwin, and contemporaneous versions
- of Unixware. The acl() call returns the access and default ACL both
- at once. */
-# ifdef ACE_GETACL
- /* Solaris also has a different variant of ACLs, used in ZFS and NFSv4
- file systems (whereas the other ones are used in UFS file systems).
- There is an API
- pathconf (name, _PC_ACL_ENABLED)
- fpathconf (desc, _PC_ACL_ENABLED)
- that allows us to determine which of the two kinds of ACLs is supported
- for the given file. But some file systems may implement this call
- incorrectly, so better not use it.
- When fetching the source ACL, we simply fetch both ACL types.
- When setting the destination ACL, we try either ACL types, assuming
- that the kernel will translate the ACL from one form to the other.
- (See in <https://docs.oracle.com/cd/E86824_01/html/E54765/acl-2.html>
- the description of ENOTSUP.) */
- for (;;)
- {
- int ret;
-
- if (desc != -1)
- ret = facl (desc, ACE_GETACLCNT, 0, NULL);
- else
- ret = acl (name, ACE_GETACLCNT, 0, NULL);
- if (ret < 0)
- {
- if (errno == ENOSYS || errno == EINVAL)
- ret = 0;
- else
- return -1;
- }
- ctx->ace_count = ret;
-
- if (ctx->ace_count == 0)
- break;
-
- ctx->ace_entries = (ace_t *) malloc (ctx->ace_count * sizeof (ace_t));
- if (ctx->ace_entries == NULL)
- {
- errno = ENOMEM;
- return -1;
- }
-
- if (desc != -1)
- ret = facl (desc, ACE_GETACL, ctx->ace_count, ctx->ace_entries);
- else
- ret = acl (name, ACE_GETACL, ctx->ace_count, ctx->ace_entries);
- if (ret < 0)
- {
- if (errno == ENOSYS || errno == EINVAL)
- {
- free (ctx->ace_entries);
- ctx->ace_entries = NULL;
- ctx->ace_count = 0;
- break;
- }
- else
- return -1;
- }
- if (ret <= ctx->ace_count)
- {
- ctx->ace_count = ret;
- break;
- }
- /* Huh? The number of ACL entries has increased since the last call.
- Repeat. */
- free (ctx->ace_entries);
- ctx->ace_entries = NULL;
- }
-# endif
-
- for (;;)
- {
- int ret;
-
- if (desc != -1)
- ret = facl (desc, GETACLCNT, 0, NULL);
- else
- ret = acl (name, GETACLCNT, 0, NULL);
- if (ret < 0)
- {
- if (errno == ENOSYS || errno == ENOTSUP || errno == EOPNOTSUPP)
- ret = 0;
- else
- return -1;
- }
- ctx->count = ret;
-
- if (ctx->count == 0)
- break;
-
- ctx->entries = (aclent_t *) malloc (ctx->count * sizeof (aclent_t));
- if (ctx->entries == NULL)
- {
- errno = ENOMEM;
- return -1;
- }
-
- if (desc != -1)
- ret = facl (desc, GETACL, ctx->count, ctx->entries);
- else
- ret = acl (name, GETACL, ctx->count, ctx->entries);
- if (ret < 0)
- {
- if (errno == ENOSYS || errno == ENOTSUP || errno == EOPNOTSUPP)
- {
- free (ctx->entries);
- ctx->entries = NULL;
- ctx->count = 0;
- break;
- }
- else
- return -1;
- }
- if (ret <= ctx->count)
- {
- ctx->count = ret;
- break;
- }
- /* Huh? The number of ACL entries has increased since the last call.
- Repeat. */
- free (ctx->entries);
- ctx->entries = NULL;
- }
-
-#elif USE_ACL && HAVE_GETACL /* HP-UX */
-
- {
- int ret;
-
- if (desc != -1)
- ret = fgetacl (desc, NACLENTRIES, ctx->entries);
- else
- ret = getacl (name, NACLENTRIES, ctx->entries);
- if (ret < 0)
- {
- if (errno == ENOSYS || errno == EOPNOTSUPP || errno == ENOTSUP)
- ret = 0;
- else
- return -1;
- }
- else if (ret > NACLENTRIES)
- /* If NACLENTRIES cannot be trusted, use dynamic memory allocation. */
- abort ();
- ctx->count = ret;
-
-# if HAVE_ACLV_H
- ret = acl ((char *) name, ACL_GET, NACLVENTRIES, ctx->aclv_entries);
- if (ret < 0)
- {
- if (errno == ENOSYS || errno == EOPNOTSUPP || errno == EINVAL)
- ret = 0;
- else
- return -2;
- }
- else if (ret > NACLVENTRIES)
- /* If NACLVENTRIES cannot be trusted, use dynamic memory allocation. */
- abort ();
- ctx->aclv_count = ret;
-# endif
- }
-
-#elif USE_ACL && HAVE_ACLX_GET && ACL_AIX_WIP /* AIX */
-
- /* TODO (see set_permissions). */
-
-#elif USE_ACL && HAVE_STATACL /* older AIX */
-
- {
- int ret;
- if (desc != -1)
- ret = fstatacl (desc, STX_NORMAL, &ctx->u.a, sizeof ctx->u);
- else
- ret = statacl ((char *) name, STX_NORMAL, &ctx->u.a, sizeof ctx->u);
- if (ret == 0)
- ctx->have_u = true;
- }
-
-#elif USE_ACL && HAVE_ACLSORT /* NonStop Kernel */
-
- {
- int ret = acl ((char *) name, ACL_GET, NACLENTRIES, ctx->entries);
- if (ret < 0)
- return -1;
- else if (ret > NACLENTRIES)
- /* If NACLENTRIES cannot be trusted, use dynamic memory allocation. */
- abort ();
- ctx->count = ret;
- }
-
-#endif
-
- return 0;
-
-}
diff --git a/cross/lib/getdelim.c b/cross/lib/getdelim.c
deleted file mode 100644
index 79ec3dd12a3..00000000000
--- a/cross/lib/getdelim.c
+++ /dev/null
@@ -1,147 +0,0 @@
-/* getdelim.c --- Implementation of replacement getdelim function.
- Copyright (C) 1994, 1996-1998, 2001, 2003, 2005-2023 Free Software
- Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Ported from glibc by Simon Josefsson. */
-
-/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
- optimizes away the lineptr == NULL || n == NULL || fp == NULL tests below. */
-#define _GL_ARG_NONNULL(params)
-
-#include <config.h>
-
-#include <stdio.h>
-
-#include <limits.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <errno.h>
-
-#ifndef SSIZE_MAX
-# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
-#endif
-
-#if USE_UNLOCKED_IO
-# include "unlocked-io.h"
-# define getc_maybe_unlocked(fp) getc(fp)
-#elif !HAVE_FLOCKFILE || !HAVE_FUNLOCKFILE || !HAVE_DECL_GETC_UNLOCKED
-# undef flockfile
-# undef funlockfile
-# define flockfile(x) ((void) 0)
-# define funlockfile(x) ((void) 0)
-# define getc_maybe_unlocked(fp) getc(fp)
-#else
-# define getc_maybe_unlocked(fp) getc_unlocked(fp)
-#endif
-
-static void
-alloc_failed (void)
-{
-#if defined _WIN32 && ! defined __CYGWIN__
- /* Avoid errno problem without using the realloc module; see:
- https://lists.gnu.org/r/bug-gnulib/2016-08/msg00025.html */
- errno = ENOMEM;
-#endif
-}
-
-/* Read up to (and including) a DELIMITER from FP into *LINEPTR (and
- NUL-terminate it). *LINEPTR is a pointer returned from malloc (or
- NULL), pointing to *N characters of space. It is realloc'ed as
- necessary. Returns the number of characters read (not including
- the null terminator), or -1 on error or EOF. */
-
-ssize_t
-getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp)
-{
- ssize_t result;
- size_t cur_len = 0;
-
- if (lineptr == NULL || n == NULL || fp == NULL)
- {
- errno = EINVAL;
- return -1;
- }
-
- flockfile (fp);
-
- if (*lineptr == NULL || *n == 0)
- {
- char *new_lineptr;
- *n = 120;
- new_lineptr = (char *) realloc (*lineptr, *n);
- if (new_lineptr == NULL)
- {
- alloc_failed ();
- result = -1;
- goto unlock_return;
- }
- *lineptr = new_lineptr;
- }
-
- for (;;)
- {
- int i;
-
- i = getc_maybe_unlocked (fp);
- if (i == EOF)
- {
- result = -1;
- break;
- }
-
- /* Make enough space for len+1 (for final NUL) bytes. */
- if (cur_len + 1 >= *n)
- {
- size_t needed_max =
- SSIZE_MAX < SIZE_MAX ? (size_t) SSIZE_MAX + 1 : SIZE_MAX;
- size_t needed = 2 * *n + 1; /* Be generous. */
- char *new_lineptr;
-
- if (needed_max < needed)
- needed = needed_max;
- if (cur_len + 1 >= needed)
- {
- result = -1;
- errno = EOVERFLOW;
- goto unlock_return;
- }
-
- new_lineptr = (char *) realloc (*lineptr, needed);
- if (new_lineptr == NULL)
- {
- alloc_failed ();
- result = -1;
- goto unlock_return;
- }
-
- *lineptr = new_lineptr;
- *n = needed;
- }
-
- (*lineptr)[cur_len] = i;
- cur_len++;
-
- if (i == delimiter)
- break;
- }
- (*lineptr)[cur_len] = '\0';
- result = cur_len ? cur_len : result;
-
- unlock_return:
- funlockfile (fp); /* doesn't set errno */
-
- return result;
-}
diff --git a/cross/lib/getdtablesize.c b/cross/lib/getdtablesize.c
deleted file mode 100644
index ac2d1753a6b..00000000000
--- a/cross/lib/getdtablesize.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/* getdtablesize() function: Return maximum possible file descriptor value + 1.
- Copyright (C) 2008-2023 Free Software Foundation, Inc.
- Written by Bruno Haible <bruno@clisp.org>, 2008.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General 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__
-
-# include <stdio.h>
-
-# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
-# include "msvc-inval.h"
-# endif
-
-# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
-static int
-_setmaxstdio_nothrow (int newmax)
-{
- int result;
-
- TRY_MSVC_INVAL
- {
- result = _setmaxstdio (newmax);
- }
- CATCH_MSVC_INVAL
- {
- result = -1;
- }
- DONE_MSVC_INVAL;
-
- return result;
-}
-# else
-# define _setmaxstdio_nothrow _setmaxstdio
-# endif
-
-/* Cache for the previous getdtablesize () result. Safe to cache because
- Windows also lacks setrlimit. */
-static int dtablesize;
-
-int
-getdtablesize (void)
-{
- if (dtablesize == 0)
- {
- /* We are looking for the number N such that the valid file descriptors
- are 0..N-1. It can be obtained through a loop as follows:
- {
- int fd;
- for (fd = 3; fd < 65536; fd++)
- if (dup2 (0, fd) == -1)
- break;
- return fd;
- }
- On Windows XP, the result is 2048.
- The drawback of this loop is that it allocates memory for a libc
- internal array that is never freed.
-
- The number N can also be obtained as the upper bound for
- _getmaxstdio (). _getmaxstdio () returns the maximum number of open
- FILE objects. The sanity check in _setmaxstdio reveals the maximum
- number of file descriptors. This too allocates memory, but it is
- freed when we call _setmaxstdio with the original value. */
- int orig_max_stdio = _getmaxstdio ();
- unsigned int bound;
- for (bound = 0x10000; _setmaxstdio_nothrow (bound) < 0; bound = bound / 2)
- ;
- _setmaxstdio_nothrow (orig_max_stdio);
- dtablesize = bound;
- }
- return dtablesize;
-}
-
-#else
-
-# include <limits.h>
-# include <sys/resource.h>
-
-# ifndef RLIM_SAVED_CUR
-# define RLIM_SAVED_CUR RLIM_INFINITY
-# endif
-# ifndef RLIM_SAVED_MAX
-# define RLIM_SAVED_MAX RLIM_INFINITY
-# endif
-
-# ifdef __CYGWIN__
- /* Cygwin 1.7.25 auto-increases the RLIMIT_NOFILE soft limit until it
- hits the compile-time constant hard limit of 3200. We might as
- well just report the hard limit. */
-# define rlim_cur rlim_max
-# endif
-
-int
-getdtablesize (void)
-{
- struct rlimit lim;
-
- if (getrlimit (RLIMIT_NOFILE, &lim) == 0
- && 0 <= lim.rlim_cur && lim.rlim_cur <= INT_MAX
- && lim.rlim_cur != RLIM_INFINITY
- && lim.rlim_cur != RLIM_SAVED_CUR
- && lim.rlim_cur != RLIM_SAVED_MAX)
- return lim.rlim_cur;
-
- return INT_MAX;
-}
-
-#endif
diff --git a/cross/lib/getgroups.c b/cross/lib/getgroups.c
deleted file mode 100644
index 93829d3b15e..00000000000
--- a/cross/lib/getgroups.c
+++ /dev/null
@@ -1,125 +0,0 @@
-/* provide consistent interface to getgroups for systems that don't allow N==0
-
- Copyright (C) 1996, 1999, 2003, 2006-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* written by Jim Meyering */
-
-#include <config.h>
-
-#include <unistd.h>
-
-#include <errno.h>
-#include <stdlib.h>
-#include <stdint.h>
-
-#if !HAVE_GETGROUPS
-
-/* Provide a stub that fails with ENOSYS, since there is no group
- information available on mingw. */
-int
-getgroups (_GL_UNUSED int n, _GL_UNUSED GETGROUPS_T *groups)
-{
- errno = ENOSYS;
- return -1;
-}
-
-#else /* HAVE_GETGROUPS */
-
-# undef getgroups
-# ifndef GETGROUPS_ZERO_BUG
-# define GETGROUPS_ZERO_BUG 0
-# endif
-
-/* On OS X 10.6 and later, use the usual getgroups, not the one
- supplied when _DARWIN_C_SOURCE is defined. _DARWIN_C_SOURCE is
- normally defined, since it means "conform to POSIX, but add
- non-POSIX extensions even if that violates the POSIX namespace
- rules", which is what we normally want. But with getgroups there
- is an inconsistency, and _DARWIN_C_SOURCE means "change getgroups()
- so that it no longer works right". The BUGS section of compat(5)
- says that the behavior is dubious if you compile different sections
- of a program with different _DARWIN_C_SOURCE settings, so fix only
- the offending symbol. */
-# ifdef __APPLE__
-int posix_getgroups (int, gid_t []) __asm ("_getgroups");
-# define getgroups posix_getgroups
-# endif
-
-/* On at least NeXTstep 3.2, getgroups (0, NULL) always fails.
- On other systems, it returns the number of supplemental
- groups for the process. This function handles that special case
- and lets the system-provided function handle all others. However,
- it can fail with ENOMEM if memory is tight. It is unspecified
- whether the effective group id is included in the list. */
-
-int
-rpl_getgroups (int n, gid_t *group)
-{
- int n_groups;
- GETGROUPS_T *gbuf;
-
- if (n < 0)
- {
- errno = EINVAL;
- return -1;
- }
-
- if (n != 0 || !GETGROUPS_ZERO_BUG)
- {
- int result;
- if (sizeof *group == sizeof *gbuf)
- return getgroups (n, (GETGROUPS_T *) group);
-
- if (SIZE_MAX / sizeof *gbuf <= n)
- {
- errno = ENOMEM;
- return -1;
- }
- gbuf = malloc (n * sizeof *gbuf);
- if (!gbuf)
- return -1;
- result = getgroups (n, gbuf);
- if (0 <= result)
- {
- n = result;
- while (n--)
- group[n] = gbuf[n];
- }
- free (gbuf);
- return result;
- }
-
- n = 20;
- while (1)
- {
- /* No need to worry about address arithmetic overflow here,
- since the ancient systems that we're running on have low
- limits on the number of secondary groups. */
- gbuf = malloc (n * sizeof *gbuf);
- if (!gbuf)
- return -1;
- n_groups = getgroups (n, gbuf);
- if (n_groups == -1 ? errno != EINVAL : n_groups < n)
- break;
- free (gbuf);
- n *= 2;
- }
-
- free (gbuf);
- return n_groups;
-}
-
-#endif /* HAVE_GETGROUPS */
diff --git a/cross/lib/getline.c b/cross/lib/getline.c
deleted file mode 100644
index 85f16ab8bac..00000000000
--- a/cross/lib/getline.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* getline.c --- Implementation of replacement getline function.
- Copyright (C) 2005-2007, 2009-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Simon Josefsson. */
-
-#include <config.h>
-
-#include <stdio.h>
-
-ssize_t
-getline (char **lineptr, size_t *n, FILE *stream)
-{
- return getdelim (lineptr, n, '\n', stream);
-}
diff --git a/cross/lib/getloadavg.c b/cross/lib/getloadavg.c
deleted file mode 100644
index 59b53e79980..00000000000
--- a/cross/lib/getloadavg.c
+++ /dev/null
@@ -1,943 +0,0 @@
-/* Get the system load averages.
-
- Copyright (C) 1985-1989, 1991-1995, 1997, 1999-2000, 2003-2023 Free Software
- Foundation, Inc.
-
- NOTE: The canonical source of this file is maintained with gnulib.
- Bugs can be reported to bug-gnulib@gnu.org.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Compile-time symbols that this file uses:
-
- HAVE_PSTAT_GETDYNAMIC Define this if your system has the
- pstat_getdynamic function. I think it
- is unique to HPUX9. The best way to get the
- definition is through the AC_FUNC_GETLOADAVG
- macro that comes with autoconf 2.13 or newer.
- If that isn't an option, then just put
- AC_CHECK_FUNCS(pstat_getdynamic) in your
- configure.ac file.
- HAVE_LIBPERFSTAT Define this if your system has the
- perfstat_cpu_total function in libperfstat (AIX).
- FIXUP_KERNEL_SYMBOL_ADDR() Adjust address in returned struct nlist.
- KERNEL_FILE Name of the kernel file to nlist.
- LDAV_CVT() Scale the load average from the kernel.
- Returns a double.
- LDAV_SYMBOL Name of kernel symbol giving load average.
- LOAD_AVE_TYPE Type of the load average array in the kernel.
- Must be defined unless one of
- apollo, DGUX, NeXT, or UMAX is defined;
- or we have libkstat;
- otherwise, no load average is available.
- HAVE_NLIST_H nlist.h is available. NLIST_STRUCT defaults
- to this.
- NLIST_STRUCT Include nlist.h, not a.out.h.
- N_NAME_POINTER The nlist n_name element is a pointer,
- not an array.
- HAVE_STRUCT_NLIST_N_UN_N_NAME 'n_un.n_name' is member of 'struct nlist'.
- LINUX_LDAV_FILE [__linux__, __ANDROID__, __CYGWIN__]: File
- containing load averages.
-
- Specific system predefines this file uses, aside from setting
- default values if not emacs:
-
- apollo
- BSD Real BSD, not just BSD-like.
- DGUX
- eunice UNIX emulator under VMS.
- hpux
- __MSDOS__ No-op for MSDOS.
- NeXT
- sgi
- UMAX
- UMAX4_3
- VMS
- _WIN32 Native Windows (possibly also defined on Cygwin)
- __linux__, __ANDROID__ Linux: assumes /proc file system mounted.
- Support from Michael K. Johnson.
- __CYGWIN__ Cygwin emulates linux /proc/loadavg.
- __NetBSD__ NetBSD: assumes /kern file system mounted.
-
- In addition, to avoid nesting many #ifdefs, we internally set
- LDAV_DONE to indicate that the load average has been computed.
-
- We also #define LDAV_PRIVILEGED if a program will require
- special installation to be able to call getloadavg. */
-
-#include <config.h>
-
-/* Specification. */
-#include <stdlib.h>
-
-#include <errno.h>
-#include <stdio.h>
-
-# include <sys/types.h>
-
-# if HAVE_SYS_PARAM_H
-# include <sys/param.h>
-# endif
-
-# include "intprops.h"
-
-# if defined _WIN32 && ! defined __CYGWIN__ && ! defined WINDOWS32
-# define WINDOWS32
-# endif
-
-# ifdef NeXT
-/* NeXT in the 2.{0,1,2} releases defines BSD in <sys/param.h>, which
- conflicts with the definition understood in this file, that this
- really is BSD. */
-# undef BSD
-
-/* NeXT defines FSCALE in <sys/param.h>. However, we take FSCALE being
- defined to mean that the nlist method should be used, which is not true. */
-# undef FSCALE
-# endif
-
-/* Same issues as for NeXT apply to the HURD-based GNU system. */
-# ifdef __GNU__
-# undef BSD
-# undef FSCALE
-# endif /* __GNU__ */
-
-/* Set values that are different from the defaults, which are
- set a little farther down with #ifndef. */
-
-
-/* Some shorthands. */
-
-# if defined (HPUX) && !defined (hpux)
-# define hpux
-# endif
-
-# if defined (__hpux) && !defined (hpux)
-# define hpux
-# endif
-
-# if defined (__sun) && !defined (sun)
-# define sun
-# endif
-
-# if defined (hp300) && !defined (hpux)
-# define MORE_BSD
-# endif
-
-# if defined (__SVR4) && !defined (SVR4)
-# define SVR4
-# endif
-
-# if (defined (sun) && defined (SVR4)) || defined (SOLARIS2)
-# define SUNOS_5
-# endif
-
-# if defined (__osf__) && (defined (__alpha) || defined (__alpha__))
-# define OSF_ALPHA
-# include <sys/mbuf.h>
-# include <sys/socket.h>
-# include <net/route.h>
-# include <sys/table.h>
-/* Tru64 4.0D's table.h redefines sys */
-# undef sys
-# endif
-
-# if defined (__osf__) && (defined (mips) || defined (__mips__))
-# define OSF_MIPS
-# include <sys/table.h>
-# endif
-
-
-/* VAX C can't handle multi-line #ifs, or lines longer than 256 chars. */
-# ifndef LOAD_AVE_TYPE
-
-# ifdef MORE_BSD
-# define LOAD_AVE_TYPE long
-# endif
-
-# ifdef sun
-# define LOAD_AVE_TYPE long
-# endif
-
-# ifdef sgi
-# define LOAD_AVE_TYPE long
-# endif
-
-# ifdef SVR4
-# define LOAD_AVE_TYPE long
-# endif
-
-# ifdef OSF_ALPHA
-# define LOAD_AVE_TYPE long
-# endif
-
-# if defined _AIX && ! defined HAVE_LIBPERFSTAT
-# define LOAD_AVE_TYPE long
-# endif
-
-# endif /* No LOAD_AVE_TYPE. */
-
-# ifdef OSF_ALPHA
-/* <sys/param.h> defines an incorrect value for FSCALE on Alpha OSF/1,
- according to ghazi@noc.rutgers.edu. */
-# undef FSCALE
-# define FSCALE 1024.0
-# endif
-
-
-# ifndef FSCALE
-
-/* SunOS and some others define FSCALE in sys/param.h. */
-
-# ifdef MORE_BSD
-# define FSCALE 2048.0
-# endif
-
-# if defined (MIPS) || defined (SVR4)
-# define FSCALE 256
-# endif
-
-# if defined (sgi)
-/* Sometimes both MIPS and sgi are defined, so FSCALE was just defined
- above under #ifdef MIPS. But we want the sgi value. */
-# undef FSCALE
-# define FSCALE 1000.0
-# endif
-
-# if defined _AIX && !defined HAVE_LIBPERFSTAT
-# define FSCALE 65536.0
-# endif
-
-# endif /* Not FSCALE. */
-
-# if !defined (LDAV_CVT) && defined (FSCALE)
-# define LDAV_CVT(n) (((double) (n)) / FSCALE)
-# endif
-
-# ifndef NLIST_STRUCT
-# if HAVE_NLIST_H
-# define NLIST_STRUCT
-# endif
-# endif
-
-# if defined (sgi) || (defined (mips) && !defined (BSD))
-# define FIXUP_KERNEL_SYMBOL_ADDR(nl) ((nl)[0].n_value &= ~(1 << 31))
-# endif
-
-
-# if !defined (KERNEL_FILE) && defined (hpux)
-# define KERNEL_FILE "/hp-ux"
-# endif
-
-# if !defined (KERNEL_FILE) && (defined (MIPS) || defined (SVR4) || defined (ISC) || defined (sgi))
-# define KERNEL_FILE "/unix"
-# endif
-
-
-# if !defined (LDAV_SYMBOL) && (defined (hpux) || defined (SVR4) || defined (ISC) || defined (sgi) || (defined (_AIX) && !defined(HAVE_LIBPERFSTAT)))
-# define LDAV_SYMBOL "avenrun"
-# endif
-
-# ifdef HAVE_UNISTD_H
-# include <unistd.h>
-# endif
-
-/* LOAD_AVE_TYPE should only get defined if we're going to use the
- nlist method. */
-# if !defined (LOAD_AVE_TYPE) && (defined (BSD) || defined (LDAV_CVT) || defined (KERNEL_FILE) || defined (LDAV_SYMBOL))
-# define LOAD_AVE_TYPE double
-# endif
-
-# ifdef LOAD_AVE_TYPE
-
-# ifndef __VMS
-# if !(defined __linux__ || defined __ANDROID__)
-# ifndef NLIST_STRUCT
-# include <a.out.h>
-# else /* NLIST_STRUCT */
-# include <nlist.h>
-# endif /* NLIST_STRUCT */
-
-# ifdef SUNOS_5
-# include <kvm.h>
-# include <kstat.h>
-# endif
-
-# if defined (hpux) && defined (HAVE_PSTAT_GETDYNAMIC)
-# include <sys/pstat.h>
-# endif
-
-# ifndef KERNEL_FILE
-# define KERNEL_FILE "/vmunix"
-# endif /* KERNEL_FILE */
-
-# ifndef LDAV_SYMBOL
-# define LDAV_SYMBOL "_avenrun"
-# endif /* LDAV_SYMBOL */
-# endif /* __linux__ || __ANDROID__ */
-
-# else /* __VMS */
-
-# ifndef eunice
-# include <iodef.h>
-# include <descrip.h>
-# else /* eunice */
-# include <vms/iodef.h>
-# endif /* eunice */
-# endif /* __VMS */
-
-# ifndef LDAV_CVT
-# define LDAV_CVT(n) ((double) (n))
-# endif /* !LDAV_CVT */
-
-# endif /* LOAD_AVE_TYPE */
-
-# if defined HAVE_LIBPERFSTAT
-# include <sys/protosw.h>
-# include <libperfstat.h>
-# include <sys/proc.h>
-# ifndef SBITS
-# define SBITS 16
-# endif
-# endif
-
-# if defined (__GNU__) && !defined (NeXT)
-/* Note that NeXT Openstep defines __GNU__ even though it should not. */
-/* GNU system acts much like NeXT, for load average purposes,
- but not exactly. */
-# define NeXT
-# define host_self mach_host_self
-# endif
-
-# ifdef NeXT
-# ifdef HAVE_MACH_MACH_H
-# include <mach/mach.h>
-# else
-# include <mach.h>
-# endif
-# endif /* NeXT */
-
-# ifdef sgi
-# include <sys/sysmp.h>
-# endif /* sgi */
-
-# ifdef UMAX
-# include <signal.h>
-# include <sys/time.h>
-# include <sys/wait.h>
-# include <sys/syscall.h>
-
-# ifdef UMAX_43
-# include <machine/cpu.h>
-# include <inq_stats/statistics.h>
-# include <inq_stats/sysstats.h>
-# include <inq_stats/cpustats.h>
-# include <inq_stats/procstats.h>
-# else /* Not UMAX_43. */
-# include <sys/sysdefs.h>
-# include <sys/statistics.h>
-# include <sys/sysstats.h>
-# include <sys/cpudefs.h>
-# include <sys/cpustats.h>
-# include <sys/procstats.h>
-# endif /* Not UMAX_43. */
-# endif /* UMAX */
-
-# ifdef DGUX
-# include <sys/dg_sys_info.h>
-# endif
-
-# if (defined __linux__ || defined __ANDROID__ \
- || defined __CYGWIN__ || defined SUNOS_5 \
- || (defined LOAD_AVE_TYPE && ! defined __VMS))
-# include <fcntl.h>
-# endif
-
-/* Avoid static vars inside a function since in HPUX they dump as pure. */
-
-# ifdef NeXT
-static processor_set_t default_set;
-static bool getloadavg_initialized;
-# endif /* NeXT */
-
-# ifdef UMAX
-static unsigned int cpus = 0;
-static unsigned int samples;
-# endif /* UMAX */
-
-# ifdef DGUX
-static struct dg_sys_info_load_info load_info; /* what-a-mouthful! */
-# endif /* DGUX */
-
-# if !defined (HAVE_LIBKSTAT) && defined (LOAD_AVE_TYPE)
-/* File descriptor open to /dev/kmem or VMS load ave driver. */
-static int channel;
-/* True if channel is valid. */
-static bool getloadavg_initialized;
-/* Offset in kmem to seek to read load average, or 0 means invalid. */
-static long offset;
-
-# if ! defined __VMS && ! defined sgi && ! (defined __linux__ || defined __ANDROID__)
-static struct nlist name_list[2];
-# endif
-
-# ifdef SUNOS_5
-static kvm_t *kd;
-# endif /* SUNOS_5 */
-
-# endif /* LOAD_AVE_TYPE && !HAVE_LIBKSTAT */
-
-/* Put the 1 minute, 5 minute and 15 minute load averages
- into the first NELEM elements of LOADAVG.
- Return the number written (never more than 3, but may be less than NELEM),
- or -1 (setting errno) if an error occurred. */
-
-int
-getloadavg (double loadavg[], int nelem)
-{
- int elem = 0; /* Return value. */
-
-# ifdef NO_GET_LOAD_AVG
-# define LDAV_DONE
- errno = ENOSYS;
- elem = -1;
-# endif
-
-# if !defined (LDAV_DONE) && defined (HAVE_LIBKSTAT) /* Solaris <= 2.6 */
-/* Use libkstat because we don't have to be root. */
-# define LDAV_DONE
- kstat_ctl_t *kc;
- kstat_t *ksp;
- kstat_named_t *kn;
- int saved_errno;
-
- kc = kstat_open ();
- if (kc == NULL)
- return -1;
- ksp = kstat_lookup (kc, "unix", 0, "system_misc");
- if (ksp == NULL)
- return -1;
- if (kstat_read (kc, ksp, 0) == -1)
- return -1;
-
-
- kn = kstat_data_lookup (ksp, "avenrun_1min");
- if (kn == NULL)
- {
- /* Return -1 if no load average information is available. */
- nelem = 0;
- elem = -1;
- }
-
- if (nelem >= 1)
- loadavg[elem++] = (double) kn->value.ul / FSCALE;
-
- if (nelem >= 2)
- {
- kn = kstat_data_lookup (ksp, "avenrun_5min");
- if (kn != NULL)
- {
- loadavg[elem++] = (double) kn->value.ul / FSCALE;
-
- if (nelem >= 3)
- {
- kn = kstat_data_lookup (ksp, "avenrun_15min");
- if (kn != NULL)
- loadavg[elem++] = (double) kn->value.ul / FSCALE;
- }
- }
- }
-
- saved_errno = errno;
- kstat_close (kc);
- errno = saved_errno;
-# endif /* HAVE_LIBKSTAT */
-
-# if !defined (LDAV_DONE) && defined (hpux) && defined (HAVE_PSTAT_GETDYNAMIC)
- /* HP-UX */
-/* Use pstat_getdynamic() because we don't have to be root. */
-# define LDAV_DONE
-# undef LOAD_AVE_TYPE
-
- struct pst_dynamic dyn_info;
- if (pstat_getdynamic (&dyn_info, sizeof (dyn_info), 0, 0) < 0)
- return -1;
- if (nelem > 0)
- loadavg[elem++] = dyn_info.psd_avg_1_min;
- if (nelem > 1)
- loadavg[elem++] = dyn_info.psd_avg_5_min;
- if (nelem > 2)
- loadavg[elem++] = dyn_info.psd_avg_15_min;
-
-# endif /* hpux && HAVE_PSTAT_GETDYNAMIC */
-
-# if ! defined LDAV_DONE && defined HAVE_LIBPERFSTAT /* AIX */
-# define LDAV_DONE
-# undef LOAD_AVE_TYPE
-/* Use perfstat_cpu_total because we don't have to be root. */
- {
- perfstat_cpu_total_t cpu_stats;
- int result = perfstat_cpu_total (NULL, &cpu_stats, sizeof cpu_stats, 1);
- if (result == -1)
- return result;
- loadavg[0] = cpu_stats.loadavg[0] / (double)(1 << SBITS);
- loadavg[1] = cpu_stats.loadavg[1] / (double)(1 << SBITS);
- loadavg[2] = cpu_stats.loadavg[2] / (double)(1 << SBITS);
- elem = 3;
- }
-# endif
-
-# if !defined (LDAV_DONE) && (defined __linux__ || defined __ANDROID__ || defined __CYGWIN__)
- /* Linux without glibc, Android, Cygwin */
-# define LDAV_DONE
-# undef LOAD_AVE_TYPE
-
-# ifndef LINUX_LDAV_FILE
-# define LINUX_LDAV_FILE "/proc/loadavg"
-# endif
-
- char ldavgbuf[3 * (INT_STRLEN_BOUND (int) + sizeof ".00 ")];
- char const *ptr = ldavgbuf;
- int fd, count, saved_errno;
-
- fd = open (LINUX_LDAV_FILE, O_RDONLY | O_CLOEXEC);
- if (fd == -1)
- return -1;
- count = read (fd, ldavgbuf, sizeof ldavgbuf - 1);
- saved_errno = errno;
- (void) close (fd);
- errno = saved_errno;
- if (count <= 0)
- return -1;
- ldavgbuf[count] = '\0';
-
- for (elem = 0; elem < nelem; elem++)
- {
- double numerator = 0;
- double denominator = 1;
-
- while (*ptr == ' ')
- ptr++;
-
- /* Finish if this number is missing, and report an error if all
- were missing. */
- if (! ('0' <= *ptr && *ptr <= '9'))
- {
- if (elem == 0)
- {
- errno = ENOTSUP;
- return -1;
- }
- break;
- }
-
- while ('0' <= *ptr && *ptr <= '9')
- numerator = 10 * numerator + (*ptr++ - '0');
-
- if (*ptr == '.')
- for (ptr++; '0' <= *ptr && *ptr <= '9'; ptr++)
- numerator = 10 * numerator + (*ptr - '0'), denominator *= 10;
-
- loadavg[elem] = numerator / denominator;
- }
-
- return elem;
-
-# endif /* __linux__ || __ANDROID__ || __CYGWIN__ */
-
-# if !defined (LDAV_DONE) && defined (__NetBSD__) /* NetBSD < 0.9 */
-# define LDAV_DONE
-# undef LOAD_AVE_TYPE
-
-# ifndef NETBSD_LDAV_FILE
-# define NETBSD_LDAV_FILE "/kern/loadavg"
-# endif
-
- unsigned long int load_ave[3], scale;
- int count;
- char readbuf[4 * INT_BUFSIZE_BOUND (unsigned long int) + 1];
- int fd = open (NETBSD_LDAV_FILE, O_RDONLY | O_CLOEXEC);
- if (fd < 0)
- return fd;
- int nread = read (fd, readbuf, sizeof readbuf - 1);
- int err = errno;
- close (fd);
- if (nread < 0)
- {
- errno = err;
- return -1;
- }
- readbuf[nread] = '\0';
- count = sscanf (readbuf, "%lu %lu %lu %lu\n",
- &load_ave[0], &load_ave[1], &load_ave[2],
- &scale);
- if (count != 4)
- {
- errno = ENOTSUP;
- return -1;
- }
-
- for (elem = 0; elem < nelem; elem++)
- loadavg[elem] = (double) load_ave[elem] / (double) scale;
-
- return elem;
-
-# endif /* __NetBSD__ */
-
-# if !defined (LDAV_DONE) && defined (NeXT) /* NeXTStep */
-# define LDAV_DONE
- /* The NeXT code was adapted from iscreen 3.2. */
-
- host_t host;
- struct processor_set_basic_info info;
- unsigned int info_count;
-
- /* We only know how to get the 1-minute average for this system,
- so even if the caller asks for more than 1, we only return 1. */
-
- if (!getloadavg_initialized)
- {
- if (processor_set_default (host_self (), &default_set) == KERN_SUCCESS)
- getloadavg_initialized = true;
- }
-
- if (getloadavg_initialized)
- {
- info_count = PROCESSOR_SET_BASIC_INFO_COUNT;
- if (processor_set_info (default_set, PROCESSOR_SET_BASIC_INFO, &host,
- (processor_set_info_t) &info, &info_count)
- != KERN_SUCCESS)
- getloadavg_initialized = false;
- else
- {
- if (nelem > 0)
- loadavg[elem++] = (double) info.load_average / LOAD_SCALE;
- }
- }
-
- if (!getloadavg_initialized)
- {
- errno = ENOTSUP;
- return -1;
- }
-# endif /* NeXT */
-
-# if !defined (LDAV_DONE) && defined (UMAX)
-# define LDAV_DONE
-/* UMAX 4.2, which runs on the Encore Multimax multiprocessor, does not
- have a /dev/kmem. Information about the workings of the running kernel
- can be gathered with inq_stats system calls.
- We only know how to get the 1-minute average for this system. */
-
- struct proc_summary proc_sum_data;
- struct stat_descr proc_info;
- double load;
- register unsigned int i, j;
-
- if (cpus == 0)
- {
- register unsigned int c, i;
- struct cpu_config conf;
- struct stat_descr desc;
-
- desc.sd_next = 0;
- desc.sd_subsys = SUBSYS_CPU;
- desc.sd_type = CPUTYPE_CONFIG;
- desc.sd_addr = (char *) &conf;
- desc.sd_size = sizeof conf;
-
- if (inq_stats (1, &desc))
- return -1;
-
- c = 0;
- for (i = 0; i < conf.config_maxclass; ++i)
- {
- struct class_stats stats;
- memset (&stats, 0, sizeof stats);
-
- desc.sd_type = CPUTYPE_CLASS;
- desc.sd_objid = i;
- desc.sd_addr = (char *) &stats;
- desc.sd_size = sizeof stats;
-
- if (inq_stats (1, &desc))
- return -1;
-
- c += stats.class_numcpus;
- }
- cpus = c;
- samples = cpus < 2 ? 3 : (2 * cpus / 3);
- }
-
- proc_info.sd_next = 0;
- proc_info.sd_subsys = SUBSYS_PROC;
- proc_info.sd_type = PROCTYPE_SUMMARY;
- proc_info.sd_addr = (char *) &proc_sum_data;
- proc_info.sd_size = sizeof (struct proc_summary);
- proc_info.sd_sizeused = 0;
-
- if (inq_stats (1, &proc_info) != 0)
- return -1;
-
- load = proc_sum_data.ps_nrunnable;
- j = 0;
- for (i = samples - 1; i > 0; --i)
- {
- load += proc_sum_data.ps_nrun[j];
- if (j++ == PS_NRUNSIZE)
- j = 0;
- }
-
- if (nelem > 0)
- loadavg[elem++] = load / samples / cpus;
-# endif /* UMAX */
-
-# if !defined (LDAV_DONE) && defined (DGUX)
-# define LDAV_DONE
- /* This call can return -1 for an error, but with good args
- it's not supposed to fail. The first argument is for no
- apparent reason of type 'long int *'. */
- dg_sys_info ((long int *) &load_info,
- DG_SYS_INFO_LOAD_INFO_TYPE,
- DG_SYS_INFO_LOAD_VERSION_0);
-
- if (nelem > 0)
- loadavg[elem++] = load_info.one_minute;
- if (nelem > 1)
- loadavg[elem++] = load_info.five_minute;
- if (nelem > 2)
- loadavg[elem++] = load_info.fifteen_minute;
-# endif /* DGUX */
-
-# if !defined (LDAV_DONE) && defined (apollo)
-# define LDAV_DONE
-/* Apollo code from lisch@mentorg.com (Ray Lischner).
-
- This system call is not documented. The load average is obtained as
- three long integers, for the load average over the past minute,
- five minutes, and fifteen minutes. Each value is a scaled integer,
- with 16 bits of integer part and 16 bits of fraction part.
-
- I'm not sure which operating system first supported this system call,
- but I know that SR10.2 supports it. */
-
- extern void proc1_$get_loadav ();
- unsigned long load_ave[3];
-
- proc1_$get_loadav (load_ave);
-
- if (nelem > 0)
- loadavg[elem++] = load_ave[0] / 65536.0;
- if (nelem > 1)
- loadavg[elem++] = load_ave[1] / 65536.0;
- if (nelem > 2)
- loadavg[elem++] = load_ave[2] / 65536.0;
-# endif /* apollo */
-
-# if !defined (LDAV_DONE) && defined (OSF_MIPS)
-# define LDAV_DONE
-
- struct tbl_loadavg load_ave;
- table (TBL_LOADAVG, 0, &load_ave, 1, sizeof (load_ave));
- loadavg[elem++]
- = (load_ave.tl_lscale == 0
- ? load_ave.tl_avenrun.d[0]
- : (load_ave.tl_avenrun.l[0] / (double) load_ave.tl_lscale));
-# endif /* OSF_MIPS */
-
-# if !defined (LDAV_DONE) && (defined (__MSDOS__) || defined (WINDOWS32))
- /* DJGPP */
-# define LDAV_DONE
-
- /* A faithful emulation is going to have to be saved for a rainy day. */
- for ( ; elem < nelem; elem++)
- {
- loadavg[elem] = 0.0;
- }
-# endif /* __MSDOS__ || WINDOWS32 */
-
-# if !defined (LDAV_DONE) && defined (OSF_ALPHA) /* OSF/1 */
-# define LDAV_DONE
-
- struct tbl_loadavg load_ave;
- table (TBL_LOADAVG, 0, &load_ave, 1, sizeof (load_ave));
- for (elem = 0; elem < nelem; elem++)
- loadavg[elem]
- = (load_ave.tl_lscale == 0
- ? load_ave.tl_avenrun.d[elem]
- : (load_ave.tl_avenrun.l[elem] / (double) load_ave.tl_lscale));
-# endif /* OSF_ALPHA */
-
-# if ! defined LDAV_DONE && defined __VMS /* VMS */
- /* VMS specific code -- read from the Load Ave driver. */
-
- LOAD_AVE_TYPE load_ave[3];
- static bool getloadavg_initialized;
-# ifdef eunice
- struct
- {
- int dsc$w_length;
- char *dsc$a_pointer;
- } descriptor;
-# endif
-
- /* Ensure that there is a channel open to the load ave device. */
- if (!getloadavg_initialized)
- {
- /* Attempt to open the channel. */
-# ifdef eunice
- descriptor.dsc$w_length = 18;
- descriptor.dsc$a_pointer = "$$VMS_LOAD_AVERAGE";
-# else
- $DESCRIPTOR (descriptor, "LAV0:");
-# endif
- if (sys$assign (&descriptor, &channel, 0, 0) & 1)
- getloadavg_initialized = true;
- }
-
- /* Read the load average vector. */
- if (getloadavg_initialized
- && !(sys$qiow (0, channel, IO$_READVBLK, 0, 0, 0,
- load_ave, 12, 0, 0, 0, 0) & 1))
- {
- sys$dassgn (channel);
- getloadavg_initialized = false;
- }
-
- if (!getloadavg_initialized)
- {
- errno = ENOTSUP;
- return -1;
- }
-# endif /* ! defined LDAV_DONE && defined __VMS */
-
-# if ! defined LDAV_DONE && defined LOAD_AVE_TYPE && ! defined __VMS
- /* IRIX, other old systems */
-
- /* UNIX-specific code -- read the average from /dev/kmem. */
-
-# define LDAV_PRIVILEGED /* This code requires special installation. */
-
- LOAD_AVE_TYPE load_ave[3];
-
- /* Get the address of LDAV_SYMBOL. */
- if (offset == 0)
- {
-# ifndef sgi
-# if ! defined NLIST_STRUCT || ! defined N_NAME_POINTER
- strcpy (name_list[0].n_name, LDAV_SYMBOL);
- strcpy (name_list[1].n_name, "");
-# else /* NLIST_STRUCT */
-# ifdef HAVE_STRUCT_NLIST_N_UN_N_NAME
- name_list[0].n_un.n_name = LDAV_SYMBOL;
- name_list[1].n_un.n_name = 0;
-# else /* not HAVE_STRUCT_NLIST_N_UN_N_NAME */
- name_list[0].n_name = LDAV_SYMBOL;
- name_list[1].n_name = 0;
-# endif /* not HAVE_STRUCT_NLIST_N_UN_N_NAME */
-# endif /* NLIST_STRUCT */
-
-# ifndef SUNOS_5
- if (
-# if !defined (_AIX)
- nlist (KERNEL_FILE, name_list)
-# else /* _AIX */
- knlist (name_list, 1, sizeof (name_list[0]))
-# endif
- >= 0)
- /* Omit "&& name_list[0].n_type != 0 " -- it breaks on Sun386i. */
- {
-# ifdef FIXUP_KERNEL_SYMBOL_ADDR
- FIXUP_KERNEL_SYMBOL_ADDR (name_list);
-# endif
- offset = name_list[0].n_value;
- }
-# endif /* !SUNOS_5 */
-# else /* sgi */
- ptrdiff_t ldav_off = sysmp (MP_KERNADDR, MPKA_AVENRUN);
- if (ldav_off != -1)
- offset = (long int) ldav_off & 0x7fffffff;
-# endif /* sgi */
- }
-
- /* Make sure we have /dev/kmem open. */
- if (!getloadavg_initialized)
- {
-# ifndef SUNOS_5
- int fd = open ("/dev/kmem", O_RDONLY | O_CLOEXEC);
- if (0 <= fd)
- {
- channel = fd;
- getloadavg_initialized = true;
- }
-# else /* SUNOS_5 */
- /* We pass 0 for the kernel, corefile, and swapfile names
- to use the currently running kernel. */
- kd = kvm_open (0, 0, 0, O_RDONLY, 0);
- if (kd != NULL)
- {
- /* nlist the currently running kernel. */
- kvm_nlist (kd, name_list);
- offset = name_list[0].n_value;
- getloadavg_initialized = true;
- }
-# endif /* SUNOS_5 */
- }
-
- /* If we can, get the load average values. */
- if (offset && getloadavg_initialized)
- {
- /* Try to read the load. */
-# ifndef SUNOS_5
- if (lseek (channel, offset, 0) == -1L
- || read (channel, (char *) load_ave, sizeof (load_ave))
- != sizeof (load_ave))
- {
- close (channel);
- getloadavg_initialized = false;
- }
-# else /* SUNOS_5 */
- if (kvm_read (kd, offset, (char *) load_ave, sizeof (load_ave))
- != sizeof (load_ave))
- {
- kvm_close (kd);
- getloadavg_initialized = false;
- }
-# endif /* SUNOS_5 */
- }
-
- if (offset == 0 || !getloadavg_initialized)
- {
- errno = ENOTSUP;
- return -1;
- }
-# endif /* ! defined LDAV_DONE && defined LOAD_AVE_TYPE && ! defined __VMS */
-
-# if !defined (LDAV_DONE) && defined (LOAD_AVE_TYPE) /* Including VMS. */
- if (nelem > 0)
- loadavg[elem++] = LDAV_CVT (load_ave[0]);
- if (nelem > 1)
- loadavg[elem++] = LDAV_CVT (load_ave[1]);
- if (nelem > 2)
- loadavg[elem++] = LDAV_CVT (load_ave[2]);
-
-# define LDAV_DONE
-# endif /* !LDAV_DONE && LOAD_AVE_TYPE */
-
-# if !defined LDAV_DONE
- errno = ENOSYS;
- elem = -1;
-# endif
- return elem;
-}
diff --git a/cross/lib/getopt-cdefs.in.h b/cross/lib/getopt-cdefs.in.h
deleted file mode 100644
index e76c78cb212..00000000000
--- a/cross/lib/getopt-cdefs.in.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* getopt-on-non-glibc compatibility macros.
- Copyright (C) 1989-2023 Free Software Foundation, Inc.
- This file is part of gnulib.
- Unlike most of the getopt implementation, it is NOT shared
- with the GNU C Library.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General 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 _GETOPT_CDEFS_H
-#define _GETOPT_CDEFS_H 1
-
-/* This header should not be used directly; include getopt.h or
- unistd.h instead. It does not have a protective #error, because
- the guard macro for getopt.h in gnulib is not fixed. */
-
-/* getopt-core.h and getopt-ext.h are shared with GNU libc, and expect
- a number of the internal macros supplied to GNU libc's headers by
- sys/cdefs.h. Provide fallback definitions for all of them. */
-#if @HAVE_SYS_CDEFS_H@
-# include <sys/cdefs.h>
-#endif
-
-#ifndef __BEGIN_DECLS
-# ifdef __cplusplus
-# define __BEGIN_DECLS extern "C" {
-# else
-# define __BEGIN_DECLS /* nothing */
-# endif
-#endif
-#ifndef __END_DECLS
-# ifdef __cplusplus
-# define __END_DECLS }
-# else
-# define __END_DECLS /* nothing */
-# endif
-#endif
-
-#ifndef __GNUC_PREREQ
-# if defined __GNUC__ && defined __GNUC_VERSION__
-# define __GNUC_PREREQ(maj, min) \
- ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
-# else
-# define __GNUC_PREREQ(maj, min) 0
-# endif
-#endif
-
-#ifndef __THROW
-# if defined __cplusplus && (__GNUC_PREREQ (2,8) || __clang_major__ >= 4)
-# define __THROW throw ()
-# else
-# define __THROW
-# endif
-#endif
-
-#endif /* _GETOPT_CDEFS_H */
diff --git a/cross/lib/getopt-core.h b/cross/lib/getopt-core.h
deleted file mode 100644
index c5dd49363f0..00000000000
--- a/cross/lib/getopt-core.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/* Declarations for getopt (basic, portable features only).
- Copyright (C) 1989-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library and is also part of gnulib.
- Patches to this file should be submitted to both projects.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _GETOPT_CORE_H
-#define _GETOPT_CORE_H 1
-
-/* This header should not be used directly; include getopt.h or
- unistd.h instead. Unlike most bits headers, it does not have
- a protective #error, because the guard macro for getopt.h in
- gnulib is not fixed. */
-
-__BEGIN_DECLS
-
-/* For communication from 'getopt' to the caller.
- When 'getopt' finds an option that takes an argument,
- the argument value is returned here.
- Also, when 'ordering' is RETURN_IN_ORDER,
- each non-option ARGV-element is returned here. */
-
-extern char *optarg;
-
-/* Index in ARGV of the next element to be scanned.
- This is used for communication to and from the caller
- and for communication between successive calls to 'getopt'.
-
- On entry to 'getopt', zero means this is the first call; initialize.
-
- When 'getopt' returns -1, this is the index of the first of the
- non-option elements that the caller should itself scan.
-
- Otherwise, 'optind' communicates from one call to the next
- how much of ARGV has been scanned so far. */
-
-extern int optind;
-
-/* Callers store zero here to inhibit the error message 'getopt' prints
- for unrecognized options. */
-
-extern int opterr;
-
-/* Set to an option character which was unrecognized. */
-
-extern int optopt;
-
-/* Get definitions and prototypes for functions to process the
- arguments in ARGV (ARGC of them, minus the program name) for
- options given in OPTS.
-
- Return the option character from OPTS just read. Return -1 when
- there are no more options. For unrecognized options, or options
- missing arguments, 'optopt' is set to the option letter, and '?' is
- returned.
-
- The OPTS string is a list of characters which are recognized option
- letters, optionally followed by colons, specifying that that letter
- takes an argument, to be placed in 'optarg'.
-
- If a letter in OPTS is followed by two colons, its argument is
- optional. This behavior is specific to the GNU 'getopt'.
-
- The argument '--' causes premature termination of argument
- scanning, explicitly telling 'getopt' that there are no more
- options.
-
- If OPTS begins with '-', then non-option arguments are treated as
- arguments to the option '\1'. This behavior is specific to the GNU
- 'getopt'. If OPTS begins with '+', or POSIXLY_CORRECT is set in
- the environment, then do not permute arguments.
-
- For standards compliance, the 'argv' argument has the type
- char *const *, but this is inaccurate; if argument permutation is
- enabled, the argv array (not the strings it points to) must be
- writable. */
-
-extern int getopt (int ___argc, char *const *___argv, const char *__shortopts)
- __THROW _GL_ARG_NONNULL ((2, 3));
-
-__END_DECLS
-
-#endif /* _GETOPT_CORE_H */
diff --git a/cross/lib/getopt-ext.h b/cross/lib/getopt-ext.h
deleted file mode 100644
index d37c29328b2..00000000000
--- a/cross/lib/getopt-ext.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/* Declarations for getopt (GNU extensions).
- Copyright (C) 1989-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library and is also part of gnulib.
- Patches to this file should be submitted to both projects.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _GETOPT_EXT_H
-#define _GETOPT_EXT_H 1
-
-/* This header should not be used directly; include getopt.h instead.
- Unlike most bits headers, it does not have a protective #error,
- because the guard macro for getopt.h in gnulib is not fixed. */
-
-__BEGIN_DECLS
-
-/* Describe the long-named options requested by the application.
- The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
- of 'struct option' terminated by an element containing a name which is
- zero.
-
- The field 'has_arg' is:
- no_argument (or 0) if the option does not take an argument,
- required_argument (or 1) if the option requires an argument,
- optional_argument (or 2) if the option takes an optional argument.
-
- If the field 'flag' is not NULL, it points to a variable that is set
- to the value given in the field 'val' when the option is found, but
- left unchanged if the option is not found.
-
- To have a long-named option do something other than set an 'int' to
- a compiled-in constant, such as set a value from 'optarg', set the
- option's 'flag' field to zero and its 'val' field to a nonzero
- value (the equivalent single-letter option character, if there is
- one). For long options that have a zero 'flag' field, 'getopt'
- returns the contents of the 'val' field. */
-
-struct option
-{
- const char *name;
- /* has_arg can't be an enum because some compilers complain about
- type mismatches in all the code that assumes it is an int. */
- int has_arg;
- int *flag;
- int val;
-};
-
-/* Names for the values of the 'has_arg' field of 'struct option'. */
-
-#define no_argument 0
-#define required_argument 1
-#define optional_argument 2
-
-extern int getopt_long (int ___argc, char *__getopt_argv_const *___argv,
- const char *__shortopts,
- const struct option *__longopts, int *__longind)
- __THROW _GL_ARG_NONNULL ((2, 3));
-extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv,
- const char *__shortopts,
- const struct option *__longopts, int *__longind)
- __THROW _GL_ARG_NONNULL ((2, 3));
-
-__END_DECLS
-
-#endif /* _GETOPT_EXT_H */
diff --git a/cross/lib/getopt-pfx-core.h b/cross/lib/getopt-pfx-core.h
deleted file mode 100644
index 095e3930feb..00000000000
--- a/cross/lib/getopt-pfx-core.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* getopt (basic, portable features) gnulib wrapper header.
- Copyright (C) 1989-2023 Free Software Foundation, Inc.
- This file is part of gnulib.
- Unlike most of the getopt implementation, it is NOT shared
- with the GNU C Library.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General 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 _GETOPT_PFX_CORE_H
-#define _GETOPT_PFX_CORE_H 1
-
-/* This header should not be used directly; include getopt.h or
- unistd.h instead. It does not have a protective #error, because
- the guard macro for getopt.h in gnulib is not fixed. */
-
-/* Standalone applications should #define __GETOPT_PREFIX to an
- identifier that prefixes the external functions and variables
- defined in getopt-core.h and getopt-ext.h. Systematically
- rename identifiers so that they do not collide with the system
- functions and variables. Renaming avoids problems with some
- compilers and linkers. */
-#ifdef __GETOPT_PREFIX
-# ifndef __GETOPT_ID
-# define __GETOPT_CONCAT(x, y) x ## y
-# define __GETOPT_XCONCAT(x, y) __GETOPT_CONCAT (x, y)
-# define __GETOPT_ID(y) __GETOPT_XCONCAT (__GETOPT_PREFIX, y)
-# endif
-# undef getopt
-# undef optarg
-# undef opterr
-# undef optind
-# undef optopt
-# define getopt __GETOPT_ID (getopt)
-# define optarg __GETOPT_ID (optarg)
-# define opterr __GETOPT_ID (opterr)
-# define optind __GETOPT_ID (optind)
-# define optopt __GETOPT_ID (optopt)
-
-/* Work around a problem on macOS, which declares getopt with a
- trailing __DARWIN_ALIAS(getopt) that would expand to something like
- __asm("_" "rpl_getopt" "$UNIX2003") were it not for the following
- hack to suppress the macOS declaration <https://bugs.gnu.org/40205>. */
-# ifdef __APPLE__
-# define _GETOPT
-# endif
-
-/* The system's getopt.h may have already included getopt-core.h to
- declare the unprefixed identifiers. Undef _GETOPT_CORE_H so that
- getopt-core.h declares them with prefixes. */
-# undef _GETOPT_CORE_H
-#endif
-
-#include <getopt-core.h>
-
-#endif /* _GETOPT_PFX_CORE_H */
diff --git a/cross/lib/getopt-pfx-ext.h b/cross/lib/getopt-pfx-ext.h
deleted file mode 100644
index 8578d72530a..00000000000
--- a/cross/lib/getopt-pfx-ext.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/* getopt (GNU extensions) gnulib wrapper header.
- Copyright (C) 1989-2023 Free Software Foundation, Inc.
- This file is part of gnulib.
- Unlike most of the getopt implementation, it is NOT shared
- with the GNU C Library.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General 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 _GETOPT_PFX_EXT_H
-#define _GETOPT_PFX_EXT_H 1
-
-/* This header should not be used directly; include getopt.h instead.
- It does not have a protective #error, because the guard macro for
- getopt.h in gnulib is not fixed. */
-
-/* Standalone applications should #define __GETOPT_PREFIX to an
- identifier that prefixes the external functions and variables
- defined in getopt-core.h and getopt-ext.h. Systematically
- rename identifiers so that they do not collide with the system
- functions and variables. Renaming avoids problems with some
- compilers and linkers. */
-#ifdef __GETOPT_PREFIX
-# ifndef __GETOPT_ID
-# define __GETOPT_CONCAT(x, y) x ## y
-# define __GETOPT_XCONCAT(x, y) __GETOPT_CONCAT (x, y)
-# define __GETOPT_ID(y) __GETOPT_XCONCAT (__GETOPT_PREFIX, y)
-# endif
-# undef getopt_long
-# undef getopt_long_only
-# undef option
-# undef _getopt_internal
-# define getopt_long __GETOPT_ID (getopt_long)
-# define getopt_long_only __GETOPT_ID (getopt_long_only)
-# define option __GETOPT_ID (option)
-# define _getopt_internal __GETOPT_ID (getopt_internal)
-
-/* The system's getopt.h may have already included getopt-ext.h to
- declare the unprefixed identifiers. Undef _GETOPT_EXT_H so that
- getopt-ext.h declares them with prefixes. */
-# undef _GETOPT_EXT_H
-#endif
-
-/* Standalone applications get correct prototypes for getopt_long and
- getopt_long_only; they declare "char **argv". For backward
- compatibility with old applications, if __GETOPT_PREFIX is not
- defined, we supply GNU-libc-compatible, but incorrect, prototypes
- using "char *const *argv". (GNU libc is stuck with the incorrect
- prototypes, as they are baked into older versions of LSB.) */
-#ifndef __getopt_argv_const
-# if defined __GETOPT_PREFIX
-# define __getopt_argv_const /* empty */
-# else
-# define __getopt_argv_const const
-# endif
-#endif
-
-#include <getopt-ext.h>
-
-#endif /* _GETOPT_PFX_EXT_H */
diff --git a/cross/lib/getopt.c b/cross/lib/getopt.c
deleted file mode 100644
index 1e2441c4afe..00000000000
--- a/cross/lib/getopt.c
+++ /dev/null
@@ -1,811 +0,0 @@
-/* Getopt for GNU.
- Copyright (C) 1987-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library and is also part of gnulib.
- Patches to this file should be submitted to both projects.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _LIBC
-# include <config.h>
-#endif
-
-#include "getopt.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#ifdef _LIBC
-/* When used as part of glibc, error printing must be done differently
- for standards compliance. getopt is not a cancellation point, so
- it must not call functions that are, and it is specified by an
- older standard than stdio locking, so it must not refer to
- functions in the "user namespace" related to stdio locking.
- Finally, it must use glibc's internal message translation so that
- the messages are looked up in the proper text domain. */
-# include <libintl.h>
-# define fprintf __fxprintf_nocancel
-# define flockfile(fp) _IO_flockfile (fp)
-# define funlockfile(fp) _IO_funlockfile (fp)
-#else
-# include "gettext.h"
-# define _(msgid) gettext (msgid)
-/* When used standalone, flockfile and funlockfile might not be
- available. */
-# if (!defined _POSIX_THREAD_SAFE_FUNCTIONS \
- || (defined _WIN32 && ! defined __CYGWIN__))
-# define flockfile(fp) /* nop */
-# define funlockfile(fp) /* nop */
-# endif
-/* When used standalone, do not attempt to use alloca. */
-# define __libc_use_alloca(size) 0
-# undef alloca
-# define alloca(size) (abort (), (void *)0)
-#endif
-
-/* This implementation of 'getopt' has three modes for handling
- options interspersed with non-option arguments. It can stop
- scanning for options at the first non-option argument encountered,
- as POSIX specifies. It can continue scanning for options after the
- first non-option argument, but permute 'argv' as it goes so that,
- after 'getopt' is done, all the options precede all the non-option
- arguments and 'optind' points to the first non-option argument.
- Or, it can report non-option arguments as if they were arguments to
- the option character '\x01'.
-
- The default behavior of 'getopt_long' is to permute the argument list.
- When this implementation is used standalone, the default behavior of
- 'getopt' is to stop at the first non-option argument, but when it is
- used as part of GNU libc it also permutes the argument list. In both
- cases, setting the environment variable POSIXLY_CORRECT to any value
- disables permutation.
-
- If the first character of the OPTSTRING argument to 'getopt' or
- 'getopt_long' is '+', both functions will stop at the first
- non-option argument. If it is '-', both functions will report
- non-option arguments as arguments to the option character '\x01'. */
-
-#include "getopt_int.h"
-
-/* For communication from 'getopt' to the caller.
- When 'getopt' finds an option that takes an argument,
- the argument value is returned here.
- Also, when 'ordering' is RETURN_IN_ORDER,
- each non-option ARGV-element is returned here. */
-
-char *optarg;
-
-/* Index in ARGV of the next element to be scanned.
- This is used for communication to and from the caller
- and for communication between successive calls to 'getopt'.
-
- On entry to 'getopt', zero means this is the first call; initialize.
-
- When 'getopt' returns -1, this is the index of the first of the
- non-option elements that the caller should itself scan.
-
- Otherwise, 'optind' communicates from one call to the next
- how much of ARGV has been scanned so far. */
-
-/* 1003.2 says this must be 1 before any call. */
-int optind = 1;
-
-/* Callers store zero here to inhibit the error message
- for unrecognized options. */
-
-int opterr = 1;
-
-/* Set to an option character which was unrecognized.
- This must be initialized on some systems to avoid linking in the
- system's own getopt implementation. */
-
-int optopt = '?';
-
-/* Keep a global copy of all internal members of getopt_data. */
-
-static struct _getopt_data getopt_data;
-
-/* Exchange two adjacent subsequences of ARGV.
- One subsequence is elements [first_nonopt,last_nonopt)
- which contains all the non-options that have been skipped so far.
- The other is elements [last_nonopt,optind), which contains all
- the options processed since those non-options were skipped.
-
- 'first_nonopt' and 'last_nonopt' are relocated so that they describe
- the new indices of the non-options in ARGV after they are moved. */
-
-static void
-exchange (char **argv, struct _getopt_data *d)
-{
- int bottom = d->__first_nonopt;
- int middle = d->__last_nonopt;
- int top = d->optind;
- char *tem;
-
- /* Exchange the shorter segment with the far end of the longer segment.
- That puts the shorter segment into the right place.
- It leaves the longer segment in the right place overall,
- but it consists of two parts that need to be swapped next. */
-
- while (top > middle && middle > bottom)
- {
- if (top - middle > middle - bottom)
- {
- /* Bottom segment is the short one. */
- int len = middle - bottom;
- int i;
-
- /* Swap it with the top part of the top segment. */
- for (i = 0; i < len; i++)
- {
- tem = argv[bottom + i];
- argv[bottom + i] = argv[top - (middle - bottom) + i];
- argv[top - (middle - bottom) + i] = tem;
- }
- /* Exclude the moved bottom segment from further swapping. */
- top -= len;
- }
- else
- {
- /* Top segment is the short one. */
- int len = top - middle;
- int i;
-
- /* Swap it with the bottom part of the bottom segment. */
- for (i = 0; i < len; i++)
- {
- tem = argv[bottom + i];
- argv[bottom + i] = argv[middle + i];
- argv[middle + i] = tem;
- }
- /* Exclude the moved top segment from further swapping. */
- bottom += len;
- }
- }
-
- /* Update records for the slots the non-options now occupy. */
-
- d->__first_nonopt += (d->optind - d->__last_nonopt);
- d->__last_nonopt = d->optind;
-}
-
-/* Process the argument starting with d->__nextchar as a long option.
- d->optind should *not* have been advanced over this argument.
-
- If the value returned is -1, it was not actually a long option, the
- state is unchanged, and the argument should be processed as a set
- of short options (this can only happen when long_only is true).
- Otherwise, the option (and its argument, if any) have been consumed
- and the return value is the value to return from _getopt_internal_r. */
-static int
-process_long_option (int argc, char **argv, const char *optstring,
- const struct option *longopts, int *longind,
- int long_only, struct _getopt_data *d,
- int print_errors, const char *prefix)
-{
- char *nameend;
- size_t namelen;
- const struct option *p;
- const struct option *pfound = NULL;
- int n_options;
- int option_index;
-
- for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++)
- /* Do nothing. */ ;
- namelen = nameend - d->__nextchar;
-
- /* First look for an exact match, counting the options as a side
- effect. */
- for (p = longopts, n_options = 0; p->name; p++, n_options++)
- if (!strncmp (p->name, d->__nextchar, namelen)
- && namelen == strlen (p->name))
- {
- /* Exact match found. */
- pfound = p;
- option_index = n_options;
- break;
- }
-
- if (pfound == NULL)
- {
- /* Didn't find an exact match, so look for abbreviations. */
- unsigned char *ambig_set = NULL;
- int ambig_malloced = 0;
- int ambig_fallback = 0;
- int indfound = -1;
-
- for (p = longopts, option_index = 0; p->name; p++, option_index++)
- if (!strncmp (p->name, d->__nextchar, namelen))
- {
- if (pfound == NULL)
- {
- /* First nonexact match found. */
- pfound = p;
- indfound = option_index;
- }
- else if (long_only
- || pfound->has_arg != p->has_arg
- || pfound->flag != p->flag
- || pfound->val != p->val)
- {
- /* Second or later nonexact match found. */
- if (!ambig_fallback)
- {
- if (!print_errors)
- /* Don't waste effort tracking the ambig set if
- we're not going to print it anyway. */
- ambig_fallback = 1;
- else if (!ambig_set)
- {
- if (__libc_use_alloca (n_options))
- ambig_set = alloca (n_options);
- else if ((ambig_set = malloc (n_options)) == NULL)
- /* Fall back to simpler error message. */
- ambig_fallback = 1;
- else
- ambig_malloced = 1;
-
- if (ambig_set)
- {
- memset (ambig_set, 0, n_options);
- ambig_set[indfound] = 1;
- }
- }
- if (ambig_set)
- ambig_set[option_index] = 1;
- }
- }
- }
-
- if (ambig_set || ambig_fallback)
- {
- if (print_errors)
- {
- if (ambig_fallback)
- fprintf (stderr, _("%s: option '%s%s' is ambiguous\n"),
- argv[0], prefix, d->__nextchar);
- else
- {
- flockfile (stderr);
- fprintf (stderr,
- _("%s: option '%s%s' is ambiguous; possibilities:"),
- argv[0], prefix, d->__nextchar);
-
- for (option_index = 0; option_index < n_options; option_index++)
- if (ambig_set[option_index])
- fprintf (stderr, " '%s%s'",
- prefix, longopts[option_index].name);
-
- /* This must use 'fprintf' even though it's only
- printing a single character, so that it goes through
- __fxprintf_nocancel when compiled as part of glibc. */
- fprintf (stderr, "\n");
- funlockfile (stderr);
- }
- }
- if (ambig_malloced)
- free (ambig_set);
- d->__nextchar += strlen (d->__nextchar);
- d->optind++;
- d->optopt = 0;
- return '?';
- }
-
- option_index = indfound;
- }
-
- if (pfound == NULL)
- {
- /* Can't find it as a long option. If this is not getopt_long_only,
- or the option starts with '--' or is not a valid short option,
- then it's an error. */
- if (!long_only || argv[d->optind][1] == '-'
- || strchr (optstring, *d->__nextchar) == NULL)
- {
- if (print_errors)
- fprintf (stderr, _("%s: unrecognized option '%s%s'\n"),
- argv[0], prefix, d->__nextchar);
-
- d->__nextchar = NULL;
- d->optind++;
- d->optopt = 0;
- return '?';
- }
-
- /* Otherwise interpret it as a short option. */
- return -1;
- }
-
- /* We have found a matching long option. Consume it. */
- d->optind++;
- d->__nextchar = NULL;
- if (*nameend)
- {
- /* Don't test has_arg with >, because some C compilers don't
- allow it to be used on enums. */
- if (pfound->has_arg)
- d->optarg = nameend + 1;
- else
- {
- if (print_errors)
- fprintf (stderr,
- _("%s: option '%s%s' doesn't allow an argument\n"),
- argv[0], prefix, pfound->name);
-
- d->optopt = pfound->val;
- return '?';
- }
- }
- else if (pfound->has_arg == 1)
- {
- if (d->optind < argc)
- d->optarg = argv[d->optind++];
- else
- {
- if (print_errors)
- fprintf (stderr,
- _("%s: option '%s%s' requires an argument\n"),
- argv[0], prefix, pfound->name);
-
- d->optopt = pfound->val;
- return optstring[0] == ':' ? ':' : '?';
- }
- }
-
- if (longind != NULL)
- *longind = option_index;
- if (pfound->flag)
- {
- *(pfound->flag) = pfound->val;
- return 0;
- }
- return pfound->val;
-}
-
-/* Initialize internal data upon the first call to getopt. */
-
-static const char *
-_getopt_initialize (_GL_UNUSED int argc,
- _GL_UNUSED char **argv, const char *optstring,
- struct _getopt_data *d, int posixly_correct)
-{
- /* Start processing options with ARGV-element 1 (since ARGV-element 0
- is the program name); the sequence of previously skipped
- non-option ARGV-elements is empty. */
- if (d->optind == 0)
- d->optind = 1;
-
- d->__first_nonopt = d->__last_nonopt = d->optind;
- d->__nextchar = NULL;
-
- /* Determine how to handle the ordering of options and nonoptions. */
- if (optstring[0] == '-')
- {
- d->__ordering = RETURN_IN_ORDER;
- ++optstring;
- }
- else if (optstring[0] == '+')
- {
- d->__ordering = REQUIRE_ORDER;
- ++optstring;
- }
- else if (posixly_correct || !!getenv ("POSIXLY_CORRECT"))
- d->__ordering = REQUIRE_ORDER;
- else
- d->__ordering = PERMUTE;
-
- d->__initialized = 1;
- return optstring;
-}
-
-/* Scan elements of ARGV (whose length is ARGC) for option characters
- given in OPTSTRING.
-
- If an element of ARGV starts with '-', and is not exactly "-" or "--",
- then it is an option element. The characters of this element
- (aside from the initial '-') are option characters. If 'getopt'
- is called repeatedly, it returns successively each of the option characters
- from each of the option elements.
-
- If 'getopt' finds another option character, it returns that character,
- updating 'optind' and 'nextchar' so that the next call to 'getopt' can
- resume the scan with the following option character or ARGV-element.
-
- If there are no more option characters, 'getopt' returns -1.
- Then 'optind' is the index in ARGV of the first ARGV-element
- that is not an option. (The ARGV-elements have been permuted
- so that those that are not options now come last.)
-
- OPTSTRING is a string containing the legitimate option characters.
- If an option character is seen that is not listed in OPTSTRING,
- return '?' after printing an error message. If you set 'opterr' to
- zero, the error message is suppressed but we still return '?'.
-
- If a char in OPTSTRING is followed by a colon, that means it wants an arg,
- so the following text in the same ARGV-element, or the text of the following
- ARGV-element, is returned in 'optarg'. Two colons mean an option that
- wants an optional arg; if there is text in the current ARGV-element,
- it is returned in 'optarg', otherwise 'optarg' is set to zero.
-
- If OPTSTRING starts with '-' or '+', it requests different methods of
- handling the non-option ARGV-elements.
- See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
-
- Long-named options begin with '--' instead of '-'.
- Their names may be abbreviated as long as the abbreviation is unique
- or is an exact match for some defined option. If they have an
- argument, it follows the option name in the same ARGV-element, separated
- from the option name by a '=', or else the in next ARGV-element.
- When 'getopt' finds a long-named option, it returns 0 if that option's
- 'flag' field is nonzero, the value of the option's 'val' field
- if the 'flag' field is zero.
-
- The elements of ARGV aren't really const, because we permute them.
- But we pretend they're const in the prototype to be compatible
- with other systems.
-
- LONGOPTS is a vector of 'struct option' terminated by an
- element containing a name which is zero.
-
- LONGIND returns the index in LONGOPT of the long-named option found.
- It is only valid when a long-named option has been found by the most
- recent call.
-
- If LONG_ONLY is nonzero, '-' as well as '--' can introduce
- long-named options. */
-
-int
-_getopt_internal_r (int argc, char **argv, const char *optstring,
- const struct option *longopts, int *longind,
- int long_only, struct _getopt_data *d, int posixly_correct)
-{
- int print_errors = d->opterr;
-
- if (argc < 1)
- return -1;
-
- d->optarg = NULL;
-
- if (d->optind == 0 || !d->__initialized)
- optstring = _getopt_initialize (argc, argv, optstring, d, posixly_correct);
- else if (optstring[0] == '-' || optstring[0] == '+')
- optstring++;
-
- if (optstring[0] == ':')
- print_errors = 0;
-
- /* Test whether ARGV[optind] points to a non-option argument. */
-#define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0')
-
- if (d->__nextchar == NULL || *d->__nextchar == '\0')
- {
- /* Advance to the next ARGV-element. */
-
- /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
- moved back by the user (who may also have changed the arguments). */
- if (d->__last_nonopt > d->optind)
- d->__last_nonopt = d->optind;
- if (d->__first_nonopt > d->optind)
- d->__first_nonopt = d->optind;
-
- if (d->__ordering == PERMUTE)
- {
- /* If we have just processed some options following some non-options,
- exchange them so that the options come first. */
-
- if (d->__first_nonopt != d->__last_nonopt
- && d->__last_nonopt != d->optind)
- exchange (argv, d);
- else if (d->__last_nonopt != d->optind)
- d->__first_nonopt = d->optind;
-
- /* Skip any additional non-options
- and extend the range of non-options previously skipped. */
-
- while (d->optind < argc && NONOPTION_P)
- d->optind++;
- d->__last_nonopt = d->optind;
- }
-
- /* The special ARGV-element '--' means premature end of options.
- Skip it like a null option,
- then exchange with previous non-options as if it were an option,
- then skip everything else like a non-option. */
-
- if (d->optind != argc && !strcmp (argv[d->optind], "--"))
- {
- d->optind++;
-
- if (d->__first_nonopt != d->__last_nonopt
- && d->__last_nonopt != d->optind)
- exchange (argv, d);
- else if (d->__first_nonopt == d->__last_nonopt)
- d->__first_nonopt = d->optind;
- d->__last_nonopt = argc;
-
- d->optind = argc;
- }
-
- /* If we have done all the ARGV-elements, stop the scan
- and back over any non-options that we skipped and permuted. */
-
- if (d->optind == argc)
- {
- /* Set the next-arg-index to point at the non-options
- that we previously skipped, so the caller will digest them. */
- if (d->__first_nonopt != d->__last_nonopt)
- d->optind = d->__first_nonopt;
- return -1;
- }
-
- /* If we have come to a non-option and did not permute it,
- either stop the scan or describe it to the caller and pass it by. */
-
- if (NONOPTION_P)
- {
- if (d->__ordering == REQUIRE_ORDER)
- return -1;
- d->optarg = argv[d->optind++];
- return 1;
- }
-
- /* We have found another option-ARGV-element.
- Check whether it might be a long option. */
- if (longopts)
- {
- if (argv[d->optind][1] == '-')
- {
- /* "--foo" is always a long option. The special option
- "--" was handled above. */
- d->__nextchar = argv[d->optind] + 2;
- return process_long_option (argc, argv, optstring, longopts,
- longind, long_only, d,
- print_errors, "--");
- }
-
- /* If long_only and the ARGV-element has the form "-f",
- where f is a valid short option, don't consider it an
- abbreviated form of a long option that starts with f.
- Otherwise there would be no way to give the -f short
- option.
-
- On the other hand, if there's a long option "fubar" and
- the ARGV-element is "-fu", do consider that an
- abbreviation of the long option, just like "--fu", and
- not "-f" with arg "u".
-
- This distinction seems to be the most useful approach. */
- if (long_only && (argv[d->optind][2]
- || !strchr (optstring, argv[d->optind][1])))
- {
- int code;
- d->__nextchar = argv[d->optind] + 1;
- code = process_long_option (argc, argv, optstring, longopts,
- longind, long_only, d,
- print_errors, "-");
- if (code != -1)
- return code;
- }
- }
-
- /* It is not a long option. Skip the initial punctuation. */
- d->__nextchar = argv[d->optind] + 1;
- }
-
- /* Look at and handle the next short option-character. */
-
- {
- char c = *d->__nextchar++;
- const char *temp = strchr (optstring, c);
-
- /* Increment 'optind' when we start to process its last character. */
- if (*d->__nextchar == '\0')
- ++d->optind;
-
- if (temp == NULL || c == ':' || c == ';')
- {
- if (print_errors)
- fprintf (stderr, _("%s: invalid option -- '%c'\n"), argv[0], c);
- d->optopt = c;
- return '?';
- }
-
- /* Convenience. Treat POSIX -W foo same as long option --foo */
- if (temp[0] == 'W' && temp[1] == ';' && longopts != NULL)
- {
- /* This is an option that requires an argument. */
- if (*d->__nextchar != '\0')
- d->optarg = d->__nextchar;
- else if (d->optind == argc)
- {
- if (print_errors)
- fprintf (stderr,
- _("%s: option requires an argument -- '%c'\n"),
- argv[0], c);
-
- d->optopt = c;
- if (optstring[0] == ':')
- c = ':';
- else
- c = '?';
- return c;
- }
- else
- d->optarg = argv[d->optind];
-
- d->__nextchar = d->optarg;
- d->optarg = NULL;
- return process_long_option (argc, argv, optstring, longopts, longind,
- 0 /* long_only */, d, print_errors, "-W ");
- }
- if (temp[1] == ':')
- {
- if (temp[2] == ':')
- {
- /* This is an option that accepts an argument optionally. */
- if (*d->__nextchar != '\0')
- {
- d->optarg = d->__nextchar;
- d->optind++;
- }
- else
- d->optarg = NULL;
- d->__nextchar = NULL;
- }
- else
- {
- /* This is an option that requires an argument. */
- if (*d->__nextchar != '\0')
- {
- d->optarg = d->__nextchar;
- /* If we end this ARGV-element by taking the rest as an arg,
- we must advance to the next element now. */
- d->optind++;
- }
- else if (d->optind == argc)
- {
- if (print_errors)
- fprintf (stderr,
- _("%s: option requires an argument -- '%c'\n"),
- argv[0], c);
-
- d->optopt = c;
- if (optstring[0] == ':')
- c = ':';
- else
- c = '?';
- }
- else
- /* We already incremented 'optind' once;
- increment it again when taking next ARGV-elt as argument. */
- d->optarg = argv[d->optind++];
- d->__nextchar = NULL;
- }
- }
- return c;
- }
-}
-
-int
-_getopt_internal (int argc, char **argv, const char *optstring,
- const struct option *longopts, int *longind, int long_only,
- int posixly_correct)
-{
- int result;
-
- getopt_data.optind = optind;
- getopt_data.opterr = opterr;
-
- result = _getopt_internal_r (argc, argv, optstring, longopts,
- longind, long_only, &getopt_data,
- posixly_correct);
-
- optind = getopt_data.optind;
- optarg = getopt_data.optarg;
- optopt = getopt_data.optopt;
-
- return result;
-}
-
-/* glibc gets a LSB-compliant getopt and a POSIX-complaint __posix_getopt.
- Standalone applications just get a POSIX-compliant getopt.
- POSIX and LSB both require these functions to take 'char *const *argv'
- even though this is incorrect (because of the permutation). */
-#define GETOPT_ENTRY(NAME, POSIXLY_CORRECT) \
- int \
- NAME (int argc, char *const *argv, const char *optstring) \
- { \
- return _getopt_internal (argc, (char **)argv, optstring, \
- 0, 0, 0, POSIXLY_CORRECT); \
- }
-
-#ifdef _LIBC
-GETOPT_ENTRY(getopt, 0)
-GETOPT_ENTRY(__posix_getopt, 1)
-#else
-GETOPT_ENTRY(getopt, 1)
-#endif
-
-
-#ifdef TEST
-
-/* Compile with -DTEST to make an executable for use in testing
- the above definition of 'getopt'. */
-
-int
-main (int argc, char **argv)
-{
- int c;
- int digit_optind = 0;
-
- while (1)
- {
- int this_option_optind = optind ? optind : 1;
-
- c = getopt (argc, argv, "abc:d:0123456789");
- if (c == -1)
- break;
-
- switch (c)
- {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- if (digit_optind != 0 && digit_optind != this_option_optind)
- printf ("digits occur in two different argv-elements.\n");
- digit_optind = this_option_optind;
- printf ("option %c\n", c);
- break;
-
- case 'a':
- printf ("option a\n");
- break;
-
- case 'b':
- printf ("option b\n");
- break;
-
- case 'c':
- printf ("option c with value '%s'\n", optarg);
- break;
-
- case '?':
- break;
-
- default:
- printf ("?? getopt returned character code 0%o ??\n", c);
- }
- }
-
- if (optind < argc)
- {
- printf ("non-option ARGV-elements: ");
- while (optind < argc)
- printf ("%s ", argv[optind++]);
- printf ("\n");
- }
-
- exit (0);
-}
-
-#endif /* TEST */
diff --git a/cross/lib/getopt.in.h b/cross/lib/getopt.in.h
deleted file mode 100644
index 0867d365f47..00000000000
--- a/cross/lib/getopt.in.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* Declarations for getopt.
- Copyright (C) 1989-2023 Free Software Foundation, Inc.
- This file is part of gnulib.
- Unlike most of the getopt implementation, it is NOT shared
- with the GNU C Library, which supplies a different version of
- this file.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#ifndef _@GUARD_PREFIX@_GETOPT_H
-
-#if __GNUC__ >= 3
-@PRAGMA_SYSTEM_HEADER@
-#endif
-@PRAGMA_COLUMNS@
-
-/* The include_next requires a split double-inclusion guard. We must
- also inform the replacement unistd.h to not recursively use
- <getopt.h>; our definitions will be present soon enough. */
-#if @HAVE_GETOPT_H@
-# define _GL_SYSTEM_GETOPT
-# @INCLUDE_NEXT@ @NEXT_GETOPT_H@
-# undef _GL_SYSTEM_GETOPT
-#endif
-
-#define _@GUARD_PREFIX@_GETOPT_H 1
-
-/* Standalone applications should #define __GETOPT_PREFIX to an
- identifier that prefixes the external functions and variables
- defined in getopt-core.h and getopt-ext.h. When this happens,
- include the headers that might declare getopt so that they will not
- cause confusion if included after this file (if the system had
- <getopt.h>, we have already included it). */
-#if defined __GETOPT_PREFIX
-# if !@HAVE_GETOPT_H@
-# define __need_system_stdlib_h
-# include <stdlib.h>
-# undef __need_system_stdlib_h
-# include <stdio.h>
-# include <unistd.h>
-# endif
-#endif
-
-/* The definition of _GL_ARG_NONNULL is copied here. */
-
-#include <getopt-cdefs.h>
-#include <getopt-pfx-core.h>
-#include <getopt-pfx-ext.h>
-
-#endif /* _@GUARD_PREFIX@_GETOPT_H */
diff --git a/cross/lib/getopt1.c b/cross/lib/getopt1.c
deleted file mode 100644
index 49323aa8ed1..00000000000
--- a/cross/lib/getopt1.c
+++ /dev/null
@@ -1,159 +0,0 @@
-/* getopt_long and getopt_long_only entry points for GNU getopt.
- Copyright (C) 1987-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library and is also part of gnulib.
- Patches to this file should be submitted to both projects.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _LIBC
-# include <config.h>
-#endif
-
-#include "getopt.h"
-#include "getopt_int.h"
-
-int
-getopt_long (int argc, char *__getopt_argv_const *argv, const char *options,
- const struct option *long_options, int *opt_index)
-{
- return _getopt_internal (argc, (char **) argv, options, long_options,
- opt_index, 0, 0);
-}
-
-int
-_getopt_long_r (int argc, char **argv, const char *options,
- const struct option *long_options, int *opt_index,
- struct _getopt_data *d)
-{
- return _getopt_internal_r (argc, argv, options, long_options, opt_index,
- 0, d, 0);
-}
-
-/* Like getopt_long, but '-' as well as '--' can indicate a long option.
- If an option that starts with '-' (not '--') doesn't match a long option,
- but does match a short option, it is parsed as a short option
- instead. */
-
-int
-getopt_long_only (int argc, char *__getopt_argv_const *argv,
- const char *options,
- const struct option *long_options, int *opt_index)
-{
- return _getopt_internal (argc, (char **) argv, options, long_options,
- opt_index, 1, 0);
-}
-
-int
-_getopt_long_only_r (int argc, char **argv, const char *options,
- const struct option *long_options, int *opt_index,
- struct _getopt_data *d)
-{
- return _getopt_internal_r (argc, argv, options, long_options, opt_index,
- 1, d, 0);
-}
-
-
-#ifdef TEST
-
-#include <stdio.h>
-#include <stdlib.h>
-
-int
-main (int argc, char **argv)
-{
- int c;
- int digit_optind = 0;
-
- while (1)
- {
- int this_option_optind = optind ? optind : 1;
- int option_index = 0;
- static const struct option long_options[] =
- {
- {"add", 1, 0, 0},
- {"append", 0, 0, 0},
- {"delete", 1, 0, 0},
- {"verbose", 0, 0, 0},
- {"create", 0, 0, 0},
- {"file", 1, 0, 0},
- {0, 0, 0, 0}
- };
-
- c = getopt_long (argc, argv, "abc:d:0123456789",
- long_options, &option_index);
- if (c == -1)
- break;
-
- switch (c)
- {
- case 0:
- printf ("option %s", long_options[option_index].name);
- if (optarg)
- printf (" with arg %s", optarg);
- printf ("\n");
- break;
-
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- if (digit_optind != 0 && digit_optind != this_option_optind)
- printf ("digits occur in two different argv-elements.\n");
- digit_optind = this_option_optind;
- printf ("option %c\n", c);
- break;
-
- case 'a':
- printf ("option a\n");
- break;
-
- case 'b':
- printf ("option b\n");
- break;
-
- case 'c':
- printf ("option c with value '%s'\n", optarg);
- break;
-
- case 'd':
- printf ("option d with value '%s'\n", optarg);
- break;
-
- case '?':
- break;
-
- default:
- printf ("?? getopt returned character code 0%o ??\n", c);
- }
- }
-
- if (optind < argc)
- {
- printf ("non-option ARGV-elements: ");
- while (optind < argc)
- printf ("%s ", argv[optind++]);
- printf ("\n");
- }
-
- exit (0);
-}
-
-#endif /* TEST */
diff --git a/cross/lib/getopt_int.h b/cross/lib/getopt_int.h
deleted file mode 100644
index 4d9e24beebc..00000000000
--- a/cross/lib/getopt_int.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/* Internal declarations for getopt.
- Copyright (C) 1989-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library and is also part of gnulib.
- Patches to this file should be submitted to both projects.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _GETOPT_INT_H
-#define _GETOPT_INT_H 1
-
-#include <getopt.h>
-
-extern int _getopt_internal (int ___argc, char **___argv,
- const char *__shortopts,
- const struct option *__longopts, int *__longind,
- int __long_only, int __posixly_correct);
-
-
-/* Reentrant versions which can handle parsing multiple argument
- vectors at the same time. */
-
-/* Describe how to deal with options that follow non-option ARGV-elements.
-
- REQUIRE_ORDER means don't recognize them as options; stop option
- processing when the first non-option is seen. This is what POSIX
- specifies should happen.
-
- PERMUTE means permute the contents of ARGV as we scan, so that
- eventually all the non-options are at the end. This allows options
- to be given in any order, even with programs that were not written
- to expect this.
-
- RETURN_IN_ORDER is an option available to programs that were
- written to expect options and other ARGV-elements in any order
- and that care about the ordering of the two. We describe each
- non-option ARGV-element as if it were the argument of an option
- with character code 1.
-
- The special argument '--' forces an end of option-scanning regardless
- of the value of 'ordering'. In the case of RETURN_IN_ORDER, only
- '--' can cause 'getopt' to return -1 with 'optind' != ARGC. */
-
-enum __ord
- {
- REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
- };
-
-/* Data type for reentrant functions. */
-struct _getopt_data
-{
- /* These have exactly the same meaning as the corresponding global
- variables, except that they are used for the reentrant
- versions of getopt. */
- int optind;
- int opterr;
- int optopt;
- char *optarg;
-
- /* Internal members. */
-
- /* True if the internal members have been initialized. */
- int __initialized;
-
- /* The next char to be scanned in the option-element
- in which the last option character we returned was found.
- This allows us to pick up the scan where we left off.
-
- If this is zero, or a null string, it means resume the scan
- by advancing to the next ARGV-element. */
- char *__nextchar;
-
- /* See __ord above. */
- enum __ord __ordering;
-
- /* Handle permutation of arguments. */
-
- /* Describe the part of ARGV that contains non-options that have
- been skipped. 'first_nonopt' is the index in ARGV of the first
- of them; 'last_nonopt' is the index after the last of them. */
-
- int __first_nonopt;
- int __last_nonopt;
-};
-
-/* The initializer is necessary to set OPTIND and OPTERR to their
- default values and to clear the initialization flag. */
-#define _GETOPT_DATA_INITIALIZER { 1, 1 }
-
-extern int _getopt_internal_r (int ___argc, char **___argv,
- const char *__shortopts,
- const struct option *__longopts, int *__longind,
- int __long_only, struct _getopt_data *__data,
- int __posixly_correct);
-
-extern int _getopt_long_r (int ___argc, char **___argv,
- const char *__shortopts,
- const struct option *__longopts, int *__longind,
- struct _getopt_data *__data);
-
-extern int _getopt_long_only_r (int ___argc, char **___argv,
- const char *__shortopts,
- const struct option *__longopts,
- int *__longind,
- struct _getopt_data *__data);
-
-#endif /* getopt_int.h */
diff --git a/cross/lib/getrandom.c b/cross/lib/getrandom.c
deleted file mode 100644
index 19bb3429baf..00000000000
--- a/cross/lib/getrandom.c
+++ /dev/null
@@ -1,190 +0,0 @@
-/* Obtain a series of random bytes.
-
- Copyright 2020-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert. */
-
-#include <config.h>
-
-#include <sys/random.h>
-
-#include <errno.h>
-#include <fcntl.h>
-#include <unistd.h>
-
-#if defined _WIN32 && ! defined __CYGWIN__
-# define WIN32_LEAN_AND_MEAN
-# include <windows.h>
-# if HAVE_BCRYPT_H
-# include <bcrypt.h>
-# else
-# define NTSTATUS LONG
-typedef void * BCRYPT_ALG_HANDLE;
-# define BCRYPT_USE_SYSTEM_PREFERRED_RNG 0x00000002
-# if HAVE_LIB_BCRYPT
-extern NTSTATUS WINAPI BCryptGenRandom (BCRYPT_ALG_HANDLE, UCHAR *, ULONG, ULONG);
-# endif
-# endif
-# if !HAVE_LIB_BCRYPT
-# include <wincrypt.h>
-# ifndef CRYPT_VERIFY_CONTEXT
-# define CRYPT_VERIFY_CONTEXT 0xF0000000
-# endif
-# endif
-#endif
-
-#include "minmax.h"
-
-#if defined _WIN32 && ! defined __CYGWIN__
-
-/* Don't assume that UNICODE is not defined. */
-# undef LoadLibrary
-# define LoadLibrary LoadLibraryA
-# undef CryptAcquireContext
-# define CryptAcquireContext CryptAcquireContextA
-
-# if !HAVE_LIB_BCRYPT
-
-/* Avoid warnings from gcc -Wcast-function-type. */
-# define GetProcAddress \
- (void *) GetProcAddress
-
-/* BCryptGenRandom with the BCRYPT_USE_SYSTEM_PREFERRED_RNG flag works only
- starting with Windows 7. */
-typedef NTSTATUS (WINAPI * BCryptGenRandomFuncType) (BCRYPT_ALG_HANDLE, UCHAR *, ULONG, ULONG);
-static BCryptGenRandomFuncType BCryptGenRandomFunc = NULL;
-static BOOL initialized = FALSE;
-
-static void
-initialize (void)
-{
- HMODULE bcrypt = LoadLibrary ("bcrypt.dll");
- if (bcrypt != NULL)
- {
- BCryptGenRandomFunc =
- (BCryptGenRandomFuncType) GetProcAddress (bcrypt, "BCryptGenRandom");
- }
- initialized = TRUE;
-}
-
-# else
-
-# define BCryptGenRandomFunc BCryptGenRandom
-
-# endif
-
-#else
-/* These devices exist on all platforms except native Windows. */
-
-/* Name of a device through which the kernel returns high quality random
- numbers, from an entropy pool. When the pool is empty, the call blocks
- until entropy sources have added enough bits of entropy. */
-# ifndef NAME_OF_RANDOM_DEVICE
-# define NAME_OF_RANDOM_DEVICE "/dev/random"
-# endif
-
-/* Name of a device through which the kernel returns random or pseudo-random
- numbers. It uses an entropy pool, but, in order to avoid blocking, adds
- bits generated by a pseudo-random number generator, as needed. */
-# ifndef NAME_OF_NONCE_DEVICE
-# define NAME_OF_NONCE_DEVICE "/dev/urandom"
-# endif
-
-#endif
-
-/* Set BUFFER (of size LENGTH) to random bytes under the control of FLAGS.
- Return the number of bytes written (> 0).
- Upon error, return -1 and set errno. */
-ssize_t
-getrandom (void *buffer, size_t length, unsigned int flags)
-#undef getrandom
-{
-#if defined _WIN32 && ! defined __CYGWIN__
- /* BCryptGenRandom, defined in <bcrypt.h>
- <https://docs.microsoft.com/en-us/windows/win32/api/bcrypt/nf-bcrypt-bcryptgenrandom>
- with the BCRYPT_USE_SYSTEM_PREFERRED_RNG flag
- works in Windows 7 and newer. */
- static int bcrypt_not_working /* = 0 */;
- if (!bcrypt_not_working)
- {
-# if !HAVE_LIB_BCRYPT
- if (!initialized)
- initialize ();
-# endif
- if (BCryptGenRandomFunc != NULL
- && BCryptGenRandomFunc (NULL, buffer, length,
- BCRYPT_USE_SYSTEM_PREFERRED_RNG)
- == 0 /*STATUS_SUCCESS*/)
- return length;
- bcrypt_not_working = 1;
- }
-# if !HAVE_LIB_BCRYPT
- /* CryptGenRandom, defined in <wincrypt.h>
- <https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptgenrandom>
- works in older releases as well, but is now deprecated.
- CryptAcquireContext, defined in <wincrypt.h>
- <https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta> */
- {
- static int crypt_initialized /* = 0 */;
- static HCRYPTPROV provider;
- if (!crypt_initialized)
- {
- if (CryptAcquireContext (&provider, NULL, NULL, PROV_RSA_FULL,
- CRYPT_VERIFY_CONTEXT))
- crypt_initialized = 1;
- else
- crypt_initialized = -1;
- }
- if (crypt_initialized >= 0)
- {
- if (!CryptGenRandom (provider, length, buffer))
- {
- errno = EIO;
- return -1;
- }
- return length;
- }
- }
-# endif
- errno = ENOSYS;
- return -1;
-#elif HAVE_GETRANDOM
- return getrandom (buffer, length, flags);
-#else
- static int randfd[2] = { -1, -1 };
- bool devrandom = (flags & GRND_RANDOM) != 0;
- int fd = randfd[devrandom];
-
- if (fd < 0)
- {
- static char const randdevice[][MAX (sizeof NAME_OF_NONCE_DEVICE,
- sizeof NAME_OF_RANDOM_DEVICE)]
- = { NAME_OF_NONCE_DEVICE, NAME_OF_RANDOM_DEVICE };
- int oflags = (O_RDONLY + O_CLOEXEC
- + (flags & GRND_NONBLOCK ? O_NONBLOCK : 0));
- fd = open (randdevice[devrandom], oflags);
- if (fd < 0)
- {
- if (errno == ENOENT || errno == ENOTDIR)
- errno = ENOSYS;
- return -1;
- }
- randfd[devrandom] = fd;
- }
-
- return read (fd, buffer, length);
-#endif
-}
diff --git a/cross/lib/gettext.h b/cross/lib/gettext.h
deleted file mode 100644
index d0462c47e17..00000000000
--- a/cross/lib/gettext.h
+++ /dev/null
@@ -1,300 +0,0 @@
-/* Convenience header for conditional use of GNU <libintl.h>.
- Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2023 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 _LIBGETTEXT_H
-#define _LIBGETTEXT_H 1
-
-/* NLS can be disabled through the configure --disable-nls option
- or through "#define ENABLE NLS 0" before including this file. */
-#if defined ENABLE_NLS && ENABLE_NLS
-
-/* Get declarations of GNU message catalog functions. */
-# include <libintl.h>
-
-/* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by
- the gettext() and ngettext() macros. This is an alternative to calling
- textdomain(), and is useful for libraries. */
-# ifdef DEFAULT_TEXT_DOMAIN
-# undef gettext
-# define gettext(Msgid) \
- dgettext (DEFAULT_TEXT_DOMAIN, Msgid)
-# undef ngettext
-# define ngettext(Msgid1, Msgid2, N) \
- dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N)
-# endif
-
-#else
-
-/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which
- chokes if dcgettext is defined as a macro. So include it now, to make
- later inclusions of <locale.h> a NOP. We don't include <libintl.h>
- as well because people using "gettext.h" will not include <libintl.h>,
- and also including <libintl.h> would fail on SunOS 4, whereas <locale.h>
- is OK. */
-#if defined(__sun)
-# include <locale.h>
-#endif
-
-/* Many header files from the libstdc++ coming with g++ 3.3 or newer include
- <libintl.h>, which chokes if dcgettext is defined as a macro. So include
- it now, to make later inclusions of <libintl.h> a NOP. */
-#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3)
-# include <cstdlib>
-# if (__GLIBC__ >= 2 && !defined __UCLIBC__) || _GLIBCXX_HAVE_LIBINTL_H
-# include <libintl.h>
-# endif
-#endif
-
-/* Disabled NLS.
- The casts to 'const char *' serve the purpose of producing warnings
- for invalid uses of the value returned from these functions.
- On pre-ANSI systems without 'const', the config.h file is supposed to
- contain "#define const". */
-# undef gettext
-# define gettext(Msgid) ((const char *) (Msgid))
-# undef dgettext
-# define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid))
-# undef dcgettext
-# define dcgettext(Domainname, Msgid, Category) \
- ((void) (Category), dgettext (Domainname, Msgid))
-# undef ngettext
-# define ngettext(Msgid1, Msgid2, N) \
- ((N) == 1 \
- ? ((void) (Msgid2), (const char *) (Msgid1)) \
- : ((void) (Msgid1), (const char *) (Msgid2)))
-# undef dngettext
-# define dngettext(Domainname, Msgid1, Msgid2, N) \
- ((void) (Domainname), ngettext (Msgid1, Msgid2, N))
-# undef dcngettext
-# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
- ((void) (Category), dngettext (Domainname, Msgid1, Msgid2, N))
-# undef textdomain
-# define textdomain(Domainname) ((const char *) (Domainname))
-# undef bindtextdomain
-# define bindtextdomain(Domainname, Dirname) \
- ((void) (Domainname), (const char *) (Dirname))
-# undef bind_textdomain_codeset
-# define bind_textdomain_codeset(Domainname, Codeset) \
- ((void) (Domainname), (const char *) (Codeset))
-
-#endif
-
-/* Prefer gnulib's setlocale override over libintl's setlocale override. */
-#ifdef GNULIB_defined_setlocale
-# undef setlocale
-# define setlocale rpl_setlocale
-#endif
-
-/* A pseudo function call that serves as a marker for the automated
- extraction of messages, but does not call gettext(). The run-time
- translation is done at a different place in the code.
- The argument, String, should be a literal string. Concatenated strings
- and other string expressions won't work.
- The macro's expansion is not parenthesized, so that it is suitable as
- initializer for static 'char[]' or 'const char[]' variables. */
-#define gettext_noop(String) String
-
-/* The separator between msgctxt and msgid in a .mo file. */
-#define GETTEXT_CONTEXT_GLUE "\004"
-
-/* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a
- MSGID. MSGCTXT and MSGID must be string literals. MSGCTXT should be
- short and rarely need to change.
- The letter 'p' stands for 'particular' or 'special'. */
-#ifdef DEFAULT_TEXT_DOMAIN
-# define pgettext(Msgctxt, Msgid) \
- pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
-#else
-# define pgettext(Msgctxt, Msgid) \
- pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
-#endif
-#define dpgettext(Domainname, Msgctxt, Msgid) \
- pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
-#define dcpgettext(Domainname, Msgctxt, Msgid, Category) \
- pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category)
-#ifdef DEFAULT_TEXT_DOMAIN
-# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
- npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
-#else
-# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
- npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
-#endif
-#define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
- npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
-#define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \
- npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category)
-
-#if defined __GNUC__ || defined __clang__
-__inline
-#else
-#ifdef __cplusplus
-inline
-#endif
-#endif
-static const char *
-pgettext_aux (const char *domain,
- const char *msg_ctxt_id, const char *msgid,
- int category)
-{
- const char *translation = dcgettext (domain, msg_ctxt_id, category);
- if (translation == msg_ctxt_id)
- return msgid;
- else
- return translation;
-}
-
-#if defined __GNUC__ || defined __clang__
-__inline
-#else
-#ifdef __cplusplus
-inline
-#endif
-#endif
-static const char *
-npgettext_aux (const char *domain,
- const char *msg_ctxt_id, const char *msgid,
- const char *msgid_plural, unsigned long int n,
- int category)
-{
- const char *translation =
- dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
- if (translation == msg_ctxt_id || translation == msgid_plural)
- return (n == 1 ? msgid : msgid_plural);
- else
- return translation;
-}
-
-/* The same thing extended for non-constant arguments. Here MSGCTXT and MSGID
- can be arbitrary expressions. But for string literals these macros are
- less efficient than those above. */
-
-#include <string.h>
-
-/* GNULIB_NO_VLA can be defined to disable use of VLAs even if supported.
- This relates to the -Wvla and -Wvla-larger-than warnings, enabled in
- the default GCC many warnings set. This allows programs to disable use
- of VLAs, which may be unintended, or may be awkward to support portably,
- or may have security implications due to non-deterministic stack usage. */
-
-#if (!defined GNULIB_NO_VLA \
- && defined __STDC_VERSION__ && 199901L <= __STDC_VERSION__ \
- && !defined __STDC_NO_VLA__)
-# define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 1
-#else
-# define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 0
-#endif
-
-#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
-#include <stdlib.h>
-#endif
-
-#define pgettext_expr(Msgctxt, Msgid) \
- dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES)
-#define dpgettext_expr(Domainname, Msgctxt, Msgid) \
- dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES)
-
-#if defined __GNUC__ || defined __clang__
-__inline
-#else
-#ifdef __cplusplus
-inline
-#endif
-#endif
-static const char *
-dcpgettext_expr (const char *domain,
- const char *msgctxt, const char *msgid,
- int category)
-{
- size_t msgctxt_len = strlen (msgctxt) + 1;
- size_t msgid_len = strlen (msgid) + 1;
- const char *translation;
-#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
- char msg_ctxt_id[msgctxt_len + msgid_len];
-#else
- char buf[1024];
- char *msg_ctxt_id =
- (msgctxt_len + msgid_len <= sizeof (buf)
- ? buf
- : (char *) malloc (msgctxt_len + msgid_len));
- if (msg_ctxt_id != NULL)
-#endif
- {
- int found_translation;
- memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
- msg_ctxt_id[msgctxt_len - 1] = '\004';
- memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
- translation = dcgettext (domain, msg_ctxt_id, category);
- found_translation = (translation != msg_ctxt_id);
-#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
- if (msg_ctxt_id != buf)
- free (msg_ctxt_id);
-#endif
- if (found_translation)
- return translation;
- }
- return msgid;
-}
-
-#define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \
- dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
-#define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
- dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
-
-#if defined __GNUC__ || defined __clang__
-__inline
-#else
-#ifdef __cplusplus
-inline
-#endif
-#endif
-static const char *
-dcnpgettext_expr (const char *domain,
- const char *msgctxt, const char *msgid,
- const char *msgid_plural, unsigned long int n,
- int category)
-{
- size_t msgctxt_len = strlen (msgctxt) + 1;
- size_t msgid_len = strlen (msgid) + 1;
- const char *translation;
-#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
- char msg_ctxt_id[msgctxt_len + msgid_len];
-#else
- char buf[1024];
- char *msg_ctxt_id =
- (msgctxt_len + msgid_len <= sizeof (buf)
- ? buf
- : (char *) malloc (msgctxt_len + msgid_len));
- if (msg_ctxt_id != NULL)
-#endif
- {
- int found_translation;
- memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
- msg_ctxt_id[msgctxt_len - 1] = '\004';
- memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
- translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
- found_translation = !(translation == msg_ctxt_id || translation == msgid_plural);
-#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
- if (msg_ctxt_id != buf)
- free (msg_ctxt_id);
-#endif
- if (found_translation)
- return translation;
- }
- return (n == 1 ? msgid : msgid_plural);
-}
-
-#endif /* _LIBGETTEXT_H */
diff --git a/cross/lib/gettime.c b/cross/lib/gettime.c
deleted file mode 100644
index f86cc4efbff..00000000000
--- a/cross/lib/gettime.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/* gettime -- get the system clock
-
- Copyright (C) 2002, 2004-2007, 2009-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert. */
-
-#include <config.h>
-
-#include "timespec.h"
-
-#include <sys/time.h>
-
-/* Get the system time into *TS. */
-
-void
-gettime (struct timespec *ts)
-{
-#if defined CLOCK_REALTIME && HAVE_CLOCK_GETTIME
- clock_gettime (CLOCK_REALTIME, ts);
-#elif defined HAVE_TIMESPEC_GET
- timespec_get (ts, TIME_UTC);
-#else
- struct timeval tv;
- gettimeofday (&tv, NULL);
- ts->tv_sec = tv.tv_sec;
- ts->tv_nsec = tv.tv_usec * 1000;
-#endif
-}
-
-/* Return the current system time as a struct timespec. */
-
-struct timespec
-current_timespec (void)
-{
- struct timespec ts;
- gettime (&ts);
- return ts;
-}
diff --git a/cross/lib/gettimeofday.c b/cross/lib/gettimeofday.c
deleted file mode 100644
index d896ec132b9..00000000000
--- a/cross/lib/gettimeofday.c
+++ /dev/null
@@ -1,153 +0,0 @@
-/* Provide gettimeofday for systems that don't have it or for which it's broken.
-
- Copyright (C) 2001-2003, 2005-2007, 2009-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* written by Jim Meyering */
-
-#include <config.h>
-
-/* Specification. */
-#include <sys/time.h>
-
-#include <time.h>
-
-#if defined _WIN32 && ! defined __CYGWIN__
-# define WINDOWS_NATIVE
-# include <windows.h>
-#endif
-
-#ifdef WINDOWS_NATIVE
-
-/* Don't assume that UNICODE is not defined. */
-# undef LoadLibrary
-# define LoadLibrary LoadLibraryA
-
-# if !(_WIN32_WINNT >= _WIN32_WINNT_WIN8)
-
-/* Avoid warnings from gcc -Wcast-function-type. */
-# define GetProcAddress \
- (void *) GetProcAddress
-
-/* GetSystemTimePreciseAsFileTime was introduced only in Windows 8. */
-typedef void (WINAPI * GetSystemTimePreciseAsFileTimeFuncType) (FILETIME *lpTime);
-static GetSystemTimePreciseAsFileTimeFuncType GetSystemTimePreciseAsFileTimeFunc = NULL;
-static BOOL initialized = FALSE;
-
-static void
-initialize (void)
-{
- HMODULE kernel32 = LoadLibrary ("kernel32.dll");
- if (kernel32 != NULL)
- {
- GetSystemTimePreciseAsFileTimeFunc =
- (GetSystemTimePreciseAsFileTimeFuncType) GetProcAddress (kernel32, "GetSystemTimePreciseAsFileTime");
- }
- initialized = TRUE;
-}
-
-# else
-
-# define GetSystemTimePreciseAsFileTimeFunc GetSystemTimePreciseAsFileTime
-
-# endif
-
-#endif
-
-/* This is a wrapper for gettimeofday. It is used only on systems
- that lack this function, or whose implementation of this function
- causes problems.
- Work around the bug in some systems whereby gettimeofday clobbers
- the static buffer that localtime uses for its return value. The
- gettimeofday function from Mac OS X 10.0.4 (i.e., Darwin 1.3.7) has
- this problem. */
-
-int
-gettimeofday (struct timeval *restrict tv, void *restrict tz)
-{
-#undef gettimeofday
-#ifdef WINDOWS_NATIVE
-
- /* On native Windows, there are two ways to get the current time:
- GetSystemTimeAsFileTime
- <https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getsystemtimeasfiletime>
- or
- GetSystemTimePreciseAsFileTime
- <https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getsystemtimepreciseasfiletime>.
- GetSystemTimeAsFileTime produces values that jump by increments of
- 15.627 milliseconds (!) on average.
- Whereas GetSystemTimePreciseAsFileTime values usually jump by 1 or 2
- microseconds.
- More discussion on this topic:
- <http://www.windowstimestamp.com/description>. */
- FILETIME current_time;
-
-# if !(_WIN32_WINNT >= _WIN32_WINNT_WIN8)
- if (!initialized)
- initialize ();
-# endif
- if (GetSystemTimePreciseAsFileTimeFunc != NULL)
- GetSystemTimePreciseAsFileTimeFunc (&current_time);
- else
- GetSystemTimeAsFileTime (&current_time);
-
- /* Convert from FILETIME to 'struct timeval'. */
- /* FILETIME: <https://docs.microsoft.com/en-us/windows/desktop/api/minwinbase/ns-minwinbase-filetime> */
- ULONGLONG since_1601 =
- ((ULONGLONG) current_time.dwHighDateTime << 32)
- | (ULONGLONG) current_time.dwLowDateTime;
- /* Between 1601-01-01 and 1970-01-01 there were 280 normal years and 89 leap
- years, in total 134774 days. */
- ULONGLONG since_1970 =
- since_1601 - (ULONGLONG) 134774 * (ULONGLONG) 86400 * (ULONGLONG) 10000000;
- ULONGLONG microseconds_since_1970 = since_1970 / (ULONGLONG) 10;
- tv->tv_sec = microseconds_since_1970 / (ULONGLONG) 1000000;
- tv->tv_usec = microseconds_since_1970 % (ULONGLONG) 1000000;
-
- return 0;
-
-#else
-
-# if HAVE_GETTIMEOFDAY
-
-# if defined timeval /* 'struct timeval' overridden by gnulib? */
-# undef timeval
- struct timeval otv;
- int result = gettimeofday (&otv, (struct timezone *) tz);
- if (result == 0)
- {
- tv->tv_sec = otv.tv_sec;
- tv->tv_usec = otv.tv_usec;
- }
-# else
- int result = gettimeofday (tv, (struct timezone *) tz);
-# endif
-
- return result;
-
-# else
-
-# if !defined OK_TO_USE_1S_CLOCK
-# error "Only 1-second nominal clock resolution found. Is that intended?" \
- "If so, compile with the -DOK_TO_USE_1S_CLOCK option."
-# endif
- tv->tv_sec = time (NULL);
- tv->tv_usec = 0;
-
- return 0;
-
-# endif
-#endif
-}
diff --git a/cross/lib/group-member.c b/cross/lib/group-member.c
deleted file mode 100644
index 96a09f94a8f..00000000000
--- a/cross/lib/group-member.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/* group-member.c -- determine whether group id is in calling user's group list
-
- Copyright (C) 1994, 1997-1998, 2003, 2005-2006, 2009-2023 Free Software
- Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-/* Specification. */
-#include <unistd.h>
-
-#include <stdckdint.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <stdlib.h>
-
-/* Most processes have no more than this many groups, and for these
- processes we can avoid using malloc. */
-enum { GROUPBUF_SIZE = 100 };
-
-struct group_info
- {
- gid_t *group;
- gid_t groupbuf[GROUPBUF_SIZE];
- };
-
-static void
-free_group_info (struct group_info const *g)
-{
- if (g->group != g->groupbuf)
- free (g->group);
-}
-
-static int
-get_group_info (struct group_info *gi)
-{
- int n_groups = getgroups (GROUPBUF_SIZE, gi->groupbuf);
- gi->group = gi->groupbuf;
-
- if (n_groups < 0)
- {
- int n_group_slots = getgroups (0, NULL);
- size_t nbytes;
- if (! ckd_mul (&nbytes, n_group_slots, sizeof *gi->group))
- {
- gi->group = malloc (nbytes);
- if (gi->group)
- n_groups = getgroups (n_group_slots, gi->group);
- }
- }
-
- /* In case of error, the user loses. */
- return n_groups;
-}
-
-/* Return non-zero if GID is one that we have in our groups list.
- Note that the groups list is not guaranteed to contain the current
- or effective group ID, so they should generally be checked
- separately. */
-
-int
-group_member (gid_t gid)
-{
- int i;
- int found;
- struct group_info gi;
- int n_groups = get_group_info (&gi);
-
- /* Search through the list looking for GID. */
- found = 0;
- for (i = 0; i < n_groups; i++)
- {
- if (gid == gi.group[i])
- {
- found = 1;
- break;
- }
- }
-
- free_group_info (&gi);
-
- return found;
-}
-
-#ifdef TEST
-
-int
-main (int argc, char **argv)
-{
- int i;
-
- for (i = 1; i < argc; i++)
- {
- gid_t gid;
-
- gid = atoi (argv[i]);
- printf ("%d: %s\n", gid, group_member (gid) ? "yes" : "no");
- }
- exit (0);
-}
-
-#endif /* TEST */
diff --git a/cross/lib/idx.h b/cross/lib/idx.h
deleted file mode 100644
index 23020b7ec0c..00000000000
--- a/cross/lib/idx.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/* A type for indices and sizes.
- Copyright (C) 2020-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _IDX_H
-#define _IDX_H
-
-/* Get ptrdiff_t. */
-#include <stddef.h>
-
-/* Get PTRDIFF_MAX. */
-#include <stdint.h>
-
-/* The type 'idx_t' holds an (array) index or an (object) size.
- Its implementation promotes to a signed integer type,
- which can hold the values
- 0..2^63-1 (on 64-bit platforms) or
- 0..2^31-1 (on 32-bit platforms).
-
- Why a signed integer type?
-
- * Security: Signed types can be checked for overflow via
- '-fsanitize=undefined', but unsigned types cannot.
-
- * Comparisons without surprises: ISO C99 § 6.3.1.8 specifies a few
- surprising results for comparisons, such as
-
- (int) -3 < (unsigned long) 7 => false
- (int) -3 < (unsigned int) 7 => false
- and on 32-bit machines:
- (long) -3 < (unsigned int) 7 => false
-
- This is surprising because the natural comparison order is by
- value in the realm of infinite-precision signed integers (ℤ).
-
- The best way to get rid of such surprises is to use signed types
- for numerical integer values, and use unsigned types only for
- bit masks and enums.
-
- Why not use 'size_t' directly?
-
- * Because 'size_t' is an unsigned type, and a signed type is better.
- See above.
-
- Why not use 'ssize_t'?
-
- * 'ptrdiff_t' is more portable; it is standardized by ISO C
- whereas 'ssize_t' is standardized only by POSIX.
-
- * 'ssize_t' is not required to be as wide as 'size_t', and some
- now-obsolete POSIX platforms had 'size_t' wider than 'ssize_t'.
-
- * Conversely, some now-obsolete platforms had 'ptrdiff_t' wider
- than 'size_t', which can be a win and conforms to POSIX.
-
- Won't this cause a problem with objects larger than PTRDIFF_MAX?
-
- * Typical modern or large platforms do not allocate such objects,
- so this is not much of a problem in practice; for example, you
- can safely write 'idx_t len = strlen (s);'. To port to older
- small platforms where allocations larger than PTRDIFF_MAX could
- in theory be a problem, you can use Gnulib's ialloc module, or
- functions like ximalloc in Gnulib's xalloc module.
-
- Why not use 'ptrdiff_t' directly?
-
- * Maintainability: When reading and modifying code, it helps to know that
- a certain variable cannot have negative values. For example, when you
- have a loop
-
- int n = ...;
- for (int i = 0; i < n; i++) ...
-
- or
-
- ptrdiff_t n = ...;
- for (ptrdiff_t i = 0; i < n; i++) ...
-
- you have to ask yourself "what if n < 0?". Whereas in
-
- idx_t n = ...;
- for (idx_t i = 0; i < n; i++) ...
-
- you know that this case cannot happen.
-
- Similarly, when a programmer writes
-
- idx_t = ptr2 - ptr1;
-
- there is an implied assertion that ptr1 and ptr2 point into the same
- object and that ptr1 <= ptr2.
-
- * Being future-proof: In the future, range types (integers which are
- constrained to a certain range of values) may be added to C compilers
- or to the C standard. Several programming languages (Ada, Haskell,
- Common Lisp, Pascal) already have range types. Such range types may
- help producing good code and good warnings. The type 'idx_t' could
- then be typedef'ed to a range type that is signed after promotion. */
-
-/* In the future, idx_t could be typedef'ed to a signed range type.
- The clang "extended integer types", supported in Clang 11 or newer
- <https://clang.llvm.org/docs/LanguageExtensions.html#extended-integer-types>,
- are a special case of range types. However, these types don't support binary
- operators with plain integer types (e.g. expressions such as x > 1).
- Therefore, they don't behave like signed types (and not like unsigned types
- either). So, we cannot use them here. */
-
-/* Use the signed type 'ptrdiff_t'. */
-/* Note: ISO C does not mandate that 'size_t' and 'ptrdiff_t' have the same
- size, but it is so on all platforms we have seen since 1990. */
-typedef ptrdiff_t idx_t;
-
-/* IDX_MAX is the maximum value of an idx_t. */
-#define IDX_MAX PTRDIFF_MAX
-
-/* So far no need has been found for an IDX_WIDTH macro.
- Perhaps there should be another macro IDX_VALUE_BITS that does not
- count the sign bit and is therefore one less than PTRDIFF_WIDTH. */
-
-#endif /* _IDX_H */
diff --git a/cross/lib/ieee754.in.h b/cross/lib/ieee754.in.h
deleted file mode 100644
index 8de4c32be5e..00000000000
--- a/cross/lib/ieee754.in.h
+++ /dev/null
@@ -1,222 +0,0 @@
-/* Copyright (C) 1992-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _IEEE754_H
-
-#define _IEEE754_H 1
-
-#ifndef _GL_GNULIB_HEADER
-/* Ordinary glibc usage. */
-# include <features.h>
-# include <endian.h>
-#else
-/* Gnulib usage. */
-# ifndef __BEGIN_DECLS
-# ifdef __cplusplus
-# define __BEGIN_DECLS extern "C" {
-# define __END_DECLS }
-# else
-# define __BEGIN_DECLS
-# define __END_DECLS
-# endif
-# endif
-# ifndef __FLOAT_WORD_ORDER
-# define __LITTLE_ENDIAN 1234
-# define __BIG_ENDIAN 4321
-# ifdef WORDS_BIGENDIAN
-# define __BYTE_ORDER __BIG_ENDIAN
-# else
-# define __BYTE_ORDER __LITTLE_ENDIAN
-# endif
-# define __FLOAT_WORD_ORDER __BYTE_ORDER
-# endif
-#endif
-
-__BEGIN_DECLS
-
-union ieee754_float
- {
- float f;
-
- /* This is the IEEE 754 single-precision format. */
- struct
- {
-#if __BYTE_ORDER == __BIG_ENDIAN
- unsigned int negative:1;
- unsigned int exponent:8;
- unsigned int mantissa:23;
-#endif /* Big endian. */
-#if __BYTE_ORDER == __LITTLE_ENDIAN
- unsigned int mantissa:23;
- unsigned int exponent:8;
- unsigned int negative:1;
-#endif /* Little endian. */
- } ieee;
-
- /* This format makes it easier to see if a NaN is a signalling NaN. */
- struct
- {
-#if __BYTE_ORDER == __BIG_ENDIAN
- unsigned int negative:1;
- unsigned int exponent:8;
- unsigned int quiet_nan:1;
- unsigned int mantissa:22;
-#endif /* Big endian. */
-#if __BYTE_ORDER == __LITTLE_ENDIAN
- unsigned int mantissa:22;
- unsigned int quiet_nan:1;
- unsigned int exponent:8;
- unsigned int negative:1;
-#endif /* Little endian. */
- } ieee_nan;
- };
-
-#define IEEE754_FLOAT_BIAS 0x7f /* Added to exponent. */
-
-
-union ieee754_double
- {
- double d;
-
- /* This is the IEEE 754 double-precision format. */
- struct
- {
-#if __BYTE_ORDER == __BIG_ENDIAN
- unsigned int negative:1;
- unsigned int exponent:11;
- /* Together these comprise the mantissa. */
- unsigned int mantissa0:20;
- unsigned int mantissa1:32;
-#endif /* Big endian. */
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-# if __FLOAT_WORD_ORDER == __BIG_ENDIAN
- unsigned int mantissa0:20;
- unsigned int exponent:11;
- unsigned int negative:1;
- unsigned int mantissa1:32;
-# else
- /* Together these comprise the mantissa. */
- unsigned int mantissa1:32;
- unsigned int mantissa0:20;
- unsigned int exponent:11;
- unsigned int negative:1;
-# endif
-#endif /* Little endian. */
- } ieee;
-
- /* This format makes it easier to see if a NaN is a signalling NaN. */
- struct
- {
-#if __BYTE_ORDER == __BIG_ENDIAN
- unsigned int negative:1;
- unsigned int exponent:11;
- unsigned int quiet_nan:1;
- /* Together these comprise the mantissa. */
- unsigned int mantissa0:19;
- unsigned int mantissa1:32;
-#else
-# if __FLOAT_WORD_ORDER == __BIG_ENDIAN
- unsigned int mantissa0:19;
- unsigned int quiet_nan:1;
- unsigned int exponent:11;
- unsigned int negative:1;
- unsigned int mantissa1:32;
-# else
- /* Together these comprise the mantissa. */
- unsigned int mantissa1:32;
- unsigned int mantissa0:19;
- unsigned int quiet_nan:1;
- unsigned int exponent:11;
- unsigned int negative:1;
-# endif
-#endif
- } ieee_nan;
- };
-
-#define IEEE754_DOUBLE_BIAS 0x3ff /* Added to exponent. */
-
-
-union ieee854_long_double
- {
- long double d;
-
- /* This is the IEEE 854 double-extended-precision format. */
- struct
- {
-#if __BYTE_ORDER == __BIG_ENDIAN
- unsigned int negative:1;
- unsigned int exponent:15;
- unsigned int empty:16;
- unsigned int mantissa0:32;
- unsigned int mantissa1:32;
-#endif
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-# if __FLOAT_WORD_ORDER == __BIG_ENDIAN
- unsigned int exponent:15;
- unsigned int negative:1;
- unsigned int empty:16;
- unsigned int mantissa0:32;
- unsigned int mantissa1:32;
-# else
- unsigned int mantissa1:32;
- unsigned int mantissa0:32;
- unsigned int exponent:15;
- unsigned int negative:1;
- unsigned int empty:16;
-# endif
-#endif
- } ieee;
-
- /* This is for NaNs in the IEEE 854 double-extended-precision format. */
- struct
- {
-#if __BYTE_ORDER == __BIG_ENDIAN
- unsigned int negative:1;
- unsigned int exponent:15;
- unsigned int empty:16;
- unsigned int one:1;
- unsigned int quiet_nan:1;
- unsigned int mantissa0:30;
- unsigned int mantissa1:32;
-#endif
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-# if __FLOAT_WORD_ORDER == __BIG_ENDIAN
- unsigned int exponent:15;
- unsigned int negative:1;
- unsigned int empty:16;
- unsigned int mantissa0:30;
- unsigned int quiet_nan:1;
- unsigned int one:1;
- unsigned int mantissa1:32;
-# else
- unsigned int mantissa1:32;
- unsigned int mantissa0:30;
- unsigned int quiet_nan:1;
- unsigned int one:1;
- unsigned int exponent:15;
- unsigned int negative:1;
- unsigned int empty:16;
-# endif
-#endif
- } ieee_nan;
- };
-
-#define IEEE854_LONG_DOUBLE_BIAS 0x3fff
-
-__END_DECLS
-
-#endif /* ieee754.h */
diff --git a/cross/lib/ignore-value.h b/cross/lib/ignore-value.h
deleted file mode 100644
index f0b569af4a7..00000000000
--- a/cross/lib/ignore-value.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/* ignore a function return without a compiler warning. -*- coding: utf-8 -*-
-
- Copyright (C) 2008-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Jim Meyering, Eric Blake and Pádraig Brady. */
-
-/* Use "ignore_value" to avoid a warning when using a function declared with
- gcc's warn_unused_result attribute, but for which you really do want to
- ignore the result. Traditionally, people have used a "(void)" cast to
- indicate that a function's return value is deliberately unused. However,
- if the function is declared with __attribute__((warn_unused_result)),
- gcc issues a warning even with the cast.
-
- Caution: most of the time, you really should heed gcc's warning, and
- check the return value. However, in those exceptional cases in which
- you're sure you know what you're doing, use this function.
-
- For the record, here's one of the ignorable warnings:
- "copy.c:233: warning: ignoring return value of 'fchown',
- declared with attribute warn_unused_result". */
-
-#ifndef _GL_IGNORE_VALUE_H
-#define _GL_IGNORE_VALUE_H
-
-/* Normally casting an expression to void discards its value, but GCC
- versions 3.4 and newer have __attribute__ ((__warn_unused_result__))
- which may cause unwanted diagnostics in that case. Use __typeof__
- and __extension__ to work around the problem, if the workaround is
- known to be needed.
- The workaround is not needed with clang. */
-#if (3 < __GNUC__ + (4 <= __GNUC_MINOR__)) && !defined __clang__
-# define ignore_value(x) \
- (__extension__ ({ __typeof__ (x) __x = (x); (void) __x; }))
-#else
-# define ignore_value(x) ((void) (x))
-#endif
-
-#endif
diff --git a/cross/lib/intprops-internal.h b/cross/lib/intprops-internal.h
deleted file mode 100644
index 0467a9ca8f2..00000000000
--- a/cross/lib/intprops-internal.h
+++ /dev/null
@@ -1,392 +0,0 @@
-/* intprops-internal.h -- properties of integer types not visible to users
-
- Copyright (C) 2001-2023 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_INTPROPS_INTERNAL_H
-#define _GL_INTPROPS_INTERNAL_H
-
-#include <limits.h>
-
-/* Return a value with the common real type of E and V and the value of V.
- Do not evaluate E. */
-#define _GL_INT_CONVERT(e, v) ((1 ? 0 : (e)) + (v))
-
-/* Act like _GL_INT_CONVERT (E, -V) but work around a bug in IRIX 6.5 cc; see
- <https://lists.gnu.org/r/bug-gnulib/2011-05/msg00406.html>. */
-#define _GL_INT_NEGATE_CONVERT(e, v) ((1 ? 0 : (e)) - (v))
-
-/* The extra casts in the following macros work around compiler bugs,
- e.g., in Cray C 5.0.3.0. */
-
-/* True if the real type T is signed. */
-#define _GL_TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
-
-/* Return 1 if the real expression E, after promotion, has a
- signed or floating type. Do not evaluate E. */
-#define _GL_EXPR_SIGNED(e) (_GL_INT_NEGATE_CONVERT (e, 1) < 0)
-
-
-/* Minimum and maximum values for integer types and expressions. */
-
-/* The width in bits of the integer type or expression T.
- Do not evaluate T. T must not be a bit-field expression.
- Padding bits are not supported; this is checked at compile-time below. */
-#define _GL_TYPE_WIDTH(t) (sizeof (t) * CHAR_BIT)
-
-/* The maximum and minimum values for the type of the expression E,
- after integer promotion. E is not evaluated. */
-#define _GL_INT_MINIMUM(e) \
- (_GL_EXPR_SIGNED (e) \
- ? ~ _GL_SIGNED_INT_MAXIMUM (e) \
- : _GL_INT_CONVERT (e, 0))
-#define _GL_INT_MAXIMUM(e) \
- (_GL_EXPR_SIGNED (e) \
- ? _GL_SIGNED_INT_MAXIMUM (e) \
- : _GL_INT_NEGATE_CONVERT (e, 1))
-#define _GL_SIGNED_INT_MAXIMUM(e) \
- (((_GL_INT_CONVERT (e, 1) << (_GL_TYPE_WIDTH (+ (e)) - 2)) - 1) * 2 + 1)
-
-/* Work around OpenVMS incompatibility with C99. */
-#if !defined LLONG_MAX && defined __INT64_MAX
-# define LLONG_MAX __INT64_MAX
-# define LLONG_MIN __INT64_MIN
-#endif
-
-/* This include file assumes that signed types are two's complement without
- padding bits; the above macros have undefined behavior otherwise.
- If this is a problem for you, please let us know how to fix it for your host.
- This assumption is tested by the intprops-tests module. */
-
-/* Does the __typeof__ keyword work? This could be done by
- 'configure', but for now it's easier to do it by hand. */
-#if (2 <= __GNUC__ \
- || (4 <= __clang_major__) \
- || (1210 <= __IBMC__ && defined __IBM__TYPEOF__) \
- || (0x5110 <= __SUNPRO_C && !__STDC__))
-# define _GL_HAVE___TYPEOF__ 1
-#else
-# define _GL_HAVE___TYPEOF__ 0
-#endif
-
-/* Return 1 if the integer type or expression T might be signed. Return 0
- if it is definitely unsigned. T must not be a bit-field expression.
- This macro does not evaluate its argument, and expands to an
- integer constant expression. */
-#if _GL_HAVE___TYPEOF__
-# define _GL_SIGNED_TYPE_OR_EXPR(t) _GL_TYPE_SIGNED (__typeof__ (t))
-#else
-# define _GL_SIGNED_TYPE_OR_EXPR(t) 1
-#endif
-
-/* Return 1 if - A would overflow in [MIN,MAX] arithmetic.
- A should not have side effects, and A's type should be an
- integer with minimum value MIN and maximum MAX. */
-#define _GL_INT_NEGATE_RANGE_OVERFLOW(a, min, max) \
- ((min) < 0 ? (a) < - (max) : 0 < (a))
-
-/* True if __builtin_add_overflow (A, B, P) and __builtin_sub_overflow
- (A, B, P) work when P is non-null. */
-#ifdef __EDG__
-/* EDG-based compilers like nvc 22.1 cannot add 64-bit signed to unsigned
- <https://bugs.gnu.org/53256>. */
-# define _GL_HAS_BUILTIN_ADD_OVERFLOW 0
-#elif defined __has_builtin
-# define _GL_HAS_BUILTIN_ADD_OVERFLOW __has_builtin (__builtin_add_overflow)
-/* __builtin_{add,sub}_overflow exists but is not reliable in GCC 5.x and 6.x,
- see <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98269>. */
-#elif 7 <= __GNUC__
-# define _GL_HAS_BUILTIN_ADD_OVERFLOW 1
-#else
-# define _GL_HAS_BUILTIN_ADD_OVERFLOW 0
-#endif
-
-/* True if __builtin_mul_overflow (A, B, P) works when P is non-null. */
-#if defined __clang_major__ && __clang_major__ < 14
-/* Work around Clang bug <https://bugs.llvm.org/show_bug.cgi?id=16404>. */
-# define _GL_HAS_BUILTIN_MUL_OVERFLOW 0
-#else
-# define _GL_HAS_BUILTIN_MUL_OVERFLOW _GL_HAS_BUILTIN_ADD_OVERFLOW
-#endif
-
-/* True if __builtin_add_overflow_p (A, B, C) works, and similarly for
- __builtin_sub_overflow_p and __builtin_mul_overflow_p. */
-#ifdef __EDG__
-/* In EDG-based compilers like ICC 2021.3 and earlier,
- __builtin_add_overflow_p etc. are not treated as integral constant
- expressions even when all arguments are. */
-# define _GL_HAS_BUILTIN_OVERFLOW_P 0
-#elif defined __has_builtin
-# define _GL_HAS_BUILTIN_OVERFLOW_P __has_builtin (__builtin_mul_overflow_p)
-#else
-# define _GL_HAS_BUILTIN_OVERFLOW_P (7 <= __GNUC__)
-#endif
-
-#if (!defined _GL_STDCKDINT_H && 202311 <= __STDC_VERSION__ \
- && ! (_GL_HAS_BUILTIN_ADD_OVERFLOW && _GL_HAS_BUILTIN_MUL_OVERFLOW))
-# include <stdckdint.h>
-#endif
-
-/* Store the low-order bits of A + B, A - B, A * B, respectively, into *R.
- Return 1 if the result overflows. Arguments should not have side
- effects and A, B and *R can be of any integer type other than char,
- bool, a bit-precise integer type, or an enumeration type. */
-#if _GL_HAS_BUILTIN_ADD_OVERFLOW
-# define _GL_INT_ADD_WRAPV(a, b, r) __builtin_add_overflow (a, b, r)
-# define _GL_INT_SUBTRACT_WRAPV(a, b, r) __builtin_sub_overflow (a, b, r)
-#elif defined ckd_add && defined ckd_sub && !defined _GL_STDCKDINT_H
-# define _GL_INT_ADD_WRAPV(a, b, r) ckd_add (r, + (a), + (b))
-# define _GL_INT_SUBTRACT_WRAPV(a, b, r) ckd_sub (r, + (a), + (b))
-#else
-# define _GL_INT_ADD_WRAPV(a, b, r) \
- _GL_INT_OP_WRAPV (a, b, r, +, _GL_INT_ADD_RANGE_OVERFLOW)
-# define _GL_INT_SUBTRACT_WRAPV(a, b, r) \
- _GL_INT_OP_WRAPV (a, b, r, -, _GL_INT_SUBTRACT_RANGE_OVERFLOW)
-#endif
-#if _GL_HAS_BUILTIN_MUL_OVERFLOW
-# if ((9 < __GNUC__ + (3 <= __GNUC_MINOR__) \
- || (__GNUC__ == 8 && 4 <= __GNUC_MINOR__)) \
- && !defined __EDG__)
-# define _GL_INT_MULTIPLY_WRAPV(a, b, r) __builtin_mul_overflow (a, b, r)
-# else
- /* Work around GCC bug 91450. */
-# define _GL_INT_MULTIPLY_WRAPV(a, b, r) \
- ((!_GL_SIGNED_TYPE_OR_EXPR (*(r)) && _GL_EXPR_SIGNED (a) && _GL_EXPR_SIGNED (b) \
- && _GL_INT_MULTIPLY_RANGE_OVERFLOW (a, b, 0, (__typeof__ (*(r))) -1)) \
- ? ((void) __builtin_mul_overflow (a, b, r), 1) \
- : __builtin_mul_overflow (a, b, r))
-# endif
-#elif defined ckd_mul && !defined _GL_STDCKDINT_H
-# define _GL_INT_MULTIPLY_WRAPV(a, b, r) ckd_mul (r, + (a), + (b))
-#else
-# define _GL_INT_MULTIPLY_WRAPV(a, b, r) \
- _GL_INT_OP_WRAPV (a, b, r, *, _GL_INT_MULTIPLY_RANGE_OVERFLOW)
-#endif
-
-/* Nonzero if this compiler has GCC bug 68193 or Clang bug 25390. See:
- https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68193
- https://llvm.org/bugs/show_bug.cgi?id=25390
- For now, assume all versions of GCC-like compilers generate bogus
- warnings for _Generic. This matters only for compilers that
- lack relevant builtins. */
-#if __GNUC__ || defined __clang__
-# define _GL__GENERIC_BOGUS 1
-#else
-# define _GL__GENERIC_BOGUS 0
-#endif
-
-/* Store the low-order bits of A <op> B into *R, where OP specifies
- the operation and OVERFLOW the overflow predicate. Return 1 if the
- result overflows. Arguments should not have side effects,
- and A, B and *R can be of any integer type other than char, bool, a
- bit-precise integer type, or an enumeration type. */
-#if 201112 <= __STDC_VERSION__ && !_GL__GENERIC_BOGUS
-# define _GL_INT_OP_WRAPV(a, b, r, op, overflow) \
- (_Generic \
- (*(r), \
- signed char: \
- _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
- signed char, SCHAR_MIN, SCHAR_MAX), \
- unsigned char: \
- _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
- unsigned char, 0, UCHAR_MAX), \
- short int: \
- _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
- short int, SHRT_MIN, SHRT_MAX), \
- unsigned short int: \
- _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
- unsigned short int, 0, USHRT_MAX), \
- int: \
- _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
- int, INT_MIN, INT_MAX), \
- unsigned int: \
- _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
- unsigned int, 0, UINT_MAX), \
- long int: \
- _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \
- long int, LONG_MIN, LONG_MAX), \
- unsigned long int: \
- _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \
- unsigned long int, 0, ULONG_MAX), \
- long long int: \
- _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long long int, \
- long long int, LLONG_MIN, LLONG_MAX), \
- unsigned long long int: \
- _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long long int, \
- unsigned long long int, 0, ULLONG_MAX)))
-#else
-/* Store the low-order bits of A <op> B into *R, where OP specifies
- the operation and OVERFLOW the overflow predicate. If *R is
- signed, its type is ST with bounds SMIN..SMAX; otherwise its type
- is UT with bounds U..UMAX. ST and UT are narrower than int.
- Return 1 if the result overflows. Arguments should not have side
- effects, and A, B and *R can be of any integer type other than
- char, bool, a bit-precise integer type, or an enumeration type. */
-# if _GL_HAVE___TYPEOF__
-# define _GL_INT_OP_WRAPV_SMALLISH(a,b,r,op,overflow,st,smin,smax,ut,umax) \
- (_GL_TYPE_SIGNED (__typeof__ (*(r))) \
- ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, st, smin, smax) \
- : _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, ut, 0, umax))
-# else
-# define _GL_INT_OP_WRAPV_SMALLISH(a,b,r,op,overflow,st,smin,smax,ut,umax) \
- (overflow (a, b, smin, smax) \
- ? (overflow (a, b, 0, umax) \
- ? (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a,b,op,unsigned,st), 1) \
- : (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a,b,op,unsigned,st)) < 0) \
- : (overflow (a, b, 0, umax) \
- ? (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a,b,op,unsigned,st)) >= 0 \
- : (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a,b,op,unsigned,st), 0)))
-# endif
-
-# define _GL_INT_OP_WRAPV(a, b, r, op, overflow) \
- (sizeof *(r) == sizeof (signed char) \
- ? _GL_INT_OP_WRAPV_SMALLISH (a, b, r, op, overflow, \
- signed char, SCHAR_MIN, SCHAR_MAX, \
- unsigned char, UCHAR_MAX) \
- : sizeof *(r) == sizeof (short int) \
- ? _GL_INT_OP_WRAPV_SMALLISH (a, b, r, op, overflow, \
- short int, SHRT_MIN, SHRT_MAX, \
- unsigned short int, USHRT_MAX) \
- : sizeof *(r) == sizeof (int) \
- ? (_GL_EXPR_SIGNED (*(r)) \
- ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
- int, INT_MIN, INT_MAX) \
- : _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
- unsigned int, 0, UINT_MAX)) \
- : _GL_INT_OP_WRAPV_LONGISH(a, b, r, op, overflow))
-# ifdef LLONG_MAX
-# define _GL_INT_OP_WRAPV_LONGISH(a, b, r, op, overflow) \
- (sizeof *(r) == sizeof (long int) \
- ? (_GL_EXPR_SIGNED (*(r)) \
- ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \
- long int, LONG_MIN, LONG_MAX) \
- : _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \
- unsigned long int, 0, ULONG_MAX)) \
- : (_GL_EXPR_SIGNED (*(r)) \
- ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long long int, \
- long long int, LLONG_MIN, LLONG_MAX) \
- : _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long long int, \
- unsigned long long int, 0, ULLONG_MAX)))
-# else
-# define _GL_INT_OP_WRAPV_LONGISH(a, b, r, op, overflow) \
- (_GL_EXPR_SIGNED (*(r)) \
- ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \
- long int, LONG_MIN, LONG_MAX) \
- : _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \
- unsigned long int, 0, ULONG_MAX))
-# endif
-#endif
-
-/* Store the low-order bits of A <op> B into *R, where the operation
- is given by OP. Use the unsigned type UT for calculation to avoid
- overflow problems. *R's type is T, with extrema TMIN and TMAX.
- T can be any signed integer type other than char, bool, a
- bit-precise integer type, or an enumeration type.
- Return 1 if the result overflows. */
-#define _GL_INT_OP_CALC(a, b, r, op, overflow, ut, t, tmin, tmax) \
- (overflow (a, b, tmin, tmax) \
- ? (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a, b, op, ut, t), 1) \
- : (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a, b, op, ut, t), 0))
-
-/* Return 1 if the integer expressions A - B and -A would overflow,
- respectively. Arguments should not have side effects,
- and can be any signed integer type other than char, bool, a
- bit-precise integer type, or an enumeration type.
- These macros are tuned for their last input argument being a constant. */
-
-#if _GL_HAS_BUILTIN_OVERFLOW_P
-# define _GL_INT_NEGATE_OVERFLOW(a) \
- __builtin_sub_overflow_p (0, a, (__typeof__ (- (a))) 0)
-#else
-# define _GL_INT_NEGATE_OVERFLOW(a) \
- _GL_INT_NEGATE_RANGE_OVERFLOW (a, _GL_INT_MINIMUM (a), _GL_INT_MAXIMUM (a))
-#endif
-
-/* Return the low-order bits of A <op> B, where the operation is given
- by OP. Use the unsigned type UT for calculation to avoid undefined
- behavior on signed integer overflow, and convert the result to type T.
- UT is at least as wide as T and is no narrower than unsigned int,
- T is two's complement, and there is no padding or trap representations.
- Assume that converting UT to T yields the low-order bits, as is
- done in all known two's-complement C compilers. E.g., see:
- https://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html
-
- According to the C standard, converting UT to T yields an
- implementation-defined result or signal for values outside T's
- range. However, code that works around this theoretical problem
- runs afoul of a compiler bug in Oracle Studio 12.3 x86. See:
- https://lists.gnu.org/r/bug-gnulib/2017-04/msg00049.html
- As the compiler bug is real, don't try to work around the
- theoretical problem. */
-
-#define _GL_INT_OP_WRAPV_VIA_UNSIGNED(a, b, op, ut, t) \
- ((t) ((ut) (a) op (ut) (b)))
-
-/* Return true if the numeric values A + B, A - B, A * B fall outside
- the range TMIN..TMAX. Arguments should not have side effects
- and can be any integer type other than char, bool,
- a bit-precise integer type, or an enumeration type.
- TMIN should be signed and nonpositive.
- TMAX should be positive, and should be signed unless TMIN is zero. */
-#define _GL_INT_ADD_RANGE_OVERFLOW(a, b, tmin, tmax) \
- ((b) < 0 \
- ? (((tmin) \
- ? ((_GL_EXPR_SIGNED (_GL_INT_CONVERT (a, (tmin) - (b))) || (b) < (tmin)) \
- && (a) < (tmin) - (b)) \
- : (a) <= -1 - (b)) \
- || ((_GL_EXPR_SIGNED (a) ? 0 <= (a) : (tmax) < (a)) && (tmax) < (a) + (b))) \
- : (a) < 0 \
- ? (((tmin) \
- ? ((_GL_EXPR_SIGNED (_GL_INT_CONVERT (b, (tmin) - (a))) || (a) < (tmin)) \
- && (b) < (tmin) - (a)) \
- : (b) <= -1 - (a)) \
- || ((_GL_EXPR_SIGNED (_GL_INT_CONVERT (a, b)) || (tmax) < (b)) \
- && (tmax) < (a) + (b))) \
- : (tmax) < (b) || (tmax) - (b) < (a))
-#define _GL_INT_SUBTRACT_RANGE_OVERFLOW(a, b, tmin, tmax) \
- (((a) < 0) == ((b) < 0) \
- ? ((a) < (b) \
- ? !(tmin) || -1 - (tmin) < (b) - (a) - 1 \
- : (tmax) < (a) - (b)) \
- : (a) < 0 \
- ? ((!_GL_EXPR_SIGNED (_GL_INT_CONVERT ((a) - (tmin), b)) && (a) - (tmin) < 0) \
- || (a) - (tmin) < (b)) \
- : ((! (_GL_EXPR_SIGNED (_GL_INT_CONVERT (tmax, b)) \
- && _GL_EXPR_SIGNED (_GL_INT_CONVERT ((tmax) + (b), a))) \
- && (tmax) <= -1 - (b)) \
- || (tmax) + (b) < (a)))
-#define _GL_INT_MULTIPLY_RANGE_OVERFLOW(a, b, tmin, tmax) \
- ((b) < 0 \
- ? ((a) < 0 \
- ? (_GL_EXPR_SIGNED (_GL_INT_CONVERT (tmax, b)) \
- ? (a) < (tmax) / (b) \
- : ((_GL_INT_NEGATE_OVERFLOW (b) \
- ? _GL_INT_CONVERT (b, tmax) >> (_GL_TYPE_WIDTH (+ (b)) - 1) \
- : (tmax) / -(b)) \
- <= -1 - (a))) \
- : _GL_INT_NEGATE_OVERFLOW (_GL_INT_CONVERT (b, tmin)) && (b) == -1 \
- ? (_GL_EXPR_SIGNED (a) \
- ? 0 < (a) + (tmin) \
- : 0 < (a) && -1 - (tmin) < (a) - 1) \
- : (tmin) / (b) < (a)) \
- : (b) == 0 \
- ? 0 \
- : ((a) < 0 \
- ? (_GL_INT_NEGATE_OVERFLOW (_GL_INT_CONVERT (a, tmin)) && (a) == -1 \
- ? (_GL_EXPR_SIGNED (b) ? 0 < (b) + (tmin) : -1 - (tmin) < (b) - 1) \
- : (tmin) / (a) < (b)) \
- : (tmax) / (b) < (a)))
-
-#endif /* _GL_INTPROPS_INTERNAL_H */
diff --git a/cross/lib/intprops.h b/cross/lib/intprops.h
deleted file mode 100644
index 44b5e60fb9a..00000000000
--- a/cross/lib/intprops.h
+++ /dev/null
@@ -1,335 +0,0 @@
-/* intprops.h -- properties of integer types
-
- Copyright (C) 2001-2023 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_INTPROPS_H
-#define _GL_INTPROPS_H
-
-#include "intprops-internal.h"
-
-/* The extra casts in the following macros work around compiler bugs,
- e.g., in Cray C 5.0.3.0. */
-
-/* True if the arithmetic type T is an integer type. bool counts as
- an integer. */
-#define TYPE_IS_INTEGER(t) ((t) 1.5 == 1)
-
-/* True if the real type T is signed. */
-#define TYPE_SIGNED(t) _GL_TYPE_SIGNED (t)
-
-/* Return 1 if the real expression E, after promotion, has a
- signed or floating type. Do not evaluate E. */
-#define EXPR_SIGNED(e) _GL_EXPR_SIGNED (e)
-
-
-/* Minimum and maximum values for integer types and expressions. */
-
-/* The width in bits of the integer type or expression T.
- Do not evaluate T. T must not be a bit-field expression.
- Padding bits are not supported; this is checked at compile-time below. */
-#define TYPE_WIDTH(t) _GL_TYPE_WIDTH (t)
-
-/* The maximum and minimum values for the integer type T. */
-#define TYPE_MINIMUM(t) ((t) ~ TYPE_MAXIMUM (t))
-#define TYPE_MAXIMUM(t) \
- ((t) (! TYPE_SIGNED (t) \
- ? (t) -1 \
- : ((((t) 1 << (TYPE_WIDTH (t) - 2)) - 1) * 2 + 1)))
-
-/* Bound on length of the string representing an unsigned integer
- value representable in B bits. log10 (2.0) < 146/485. The
- smallest value of B where this bound is not tight is 2621. */
-#define INT_BITS_STRLEN_BOUND(b) (((b) * 146 + 484) / 485)
-
-/* Bound on length of the string representing an integer type or expression T.
- T must not be a bit-field expression.
-
- Subtract 1 for the sign bit if T is signed, and then add 1 more for
- a minus sign if needed.
-
- Because _GL_SIGNED_TYPE_OR_EXPR sometimes returns 1 when its argument is
- unsigned, this macro may overestimate the true bound by one byte when
- applied to unsigned types of size 2, 4, 16, ... bytes. */
-#define INT_STRLEN_BOUND(t) \
- (INT_BITS_STRLEN_BOUND (TYPE_WIDTH (t) - _GL_SIGNED_TYPE_OR_EXPR (t)) \
- + _GL_SIGNED_TYPE_OR_EXPR (t))
-
-/* Bound on buffer size needed to represent an integer type or expression T,
- including the terminating null. T must not be a bit-field expression. */
-#define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1)
-
-
-/* Range overflow checks.
-
- The INT_<op>_RANGE_OVERFLOW macros return 1 if the corresponding C
- operators overflow arithmetically when given the same arguments.
- These macros do not rely on undefined or implementation-defined behavior.
- Although their implementations are simple and straightforward,
- they are harder to use and may be less efficient than the
- INT_<op>_WRAPV, INT_<op>_OK, and INT_<op>_OVERFLOW macros described below.
-
- Example usage:
-
- long int i = ...;
- long int j = ...;
- if (INT_MULTIPLY_RANGE_OVERFLOW (i, j, LONG_MIN, LONG_MAX))
- printf ("multiply would overflow");
- else
- printf ("product is %ld", i * j);
-
- Restrictions on *_RANGE_OVERFLOW macros:
-
- These macros do not check for all possible numerical problems or
- undefined or unspecified behavior: they do not check for division
- by zero, for bad shift counts, or for shifting negative numbers.
-
- These macros may evaluate their arguments zero or multiple times,
- so the arguments should not have side effects. The arithmetic
- arguments (including the MIN and MAX arguments) must be of the same
- integer type after the usual arithmetic conversions, and the type
- must have minimum value MIN and maximum MAX. Unsigned types should
- use a zero MIN of the proper type.
-
- Because all arguments are subject to integer promotions, these
- macros typically do not work on types narrower than 'int'.
-
- These macros are tuned for constant MIN and MAX. For commutative
- operations such as A + B, they are also tuned for constant B. */
-
-/* Return 1 if A + B would overflow in [MIN,MAX] arithmetic.
- See above for restrictions. */
-#define INT_ADD_RANGE_OVERFLOW(a, b, min, max) \
- ((b) < 0 \
- ? (a) < (min) - (b) \
- : (max) - (b) < (a))
-
-/* Return 1 if A - B would overflow in [MIN,MAX] arithmetic.
- See above for restrictions. */
-#define INT_SUBTRACT_RANGE_OVERFLOW(a, b, min, max) \
- ((b) < 0 \
- ? (max) + (b) < (a) \
- : (a) < (min) + (b))
-
-/* Return 1 if - A would overflow in [MIN,MAX] arithmetic.
- See above for restrictions. */
-#define INT_NEGATE_RANGE_OVERFLOW(a, min, max) \
- _GL_INT_NEGATE_RANGE_OVERFLOW (a, min, max)
-
-/* Return 1 if A * B would overflow in [MIN,MAX] arithmetic.
- See above for restrictions. Avoid && and || as they tickle
- bugs in Sun C 5.11 2010/08/13 and other compilers; see
- <https://lists.gnu.org/r/bug-gnulib/2011-05/msg00401.html>. */
-#define INT_MULTIPLY_RANGE_OVERFLOW(a, b, min, max) \
- ((b) < 0 \
- ? ((a) < 0 \
- ? (a) < (max) / (b) \
- : (b) == -1 \
- ? 0 \
- : (min) / (b) < (a)) \
- : (b) == 0 \
- ? 0 \
- : ((a) < 0 \
- ? (a) < (min) / (b) \
- : (max) / (b) < (a)))
-
-/* Return 1 if A / B would overflow in [MIN,MAX] arithmetic.
- See above for restrictions. Do not check for division by zero. */
-#define INT_DIVIDE_RANGE_OVERFLOW(a, b, min, max) \
- ((min) < 0 && (b) == -1 && (a) < - (max))
-
-/* Return 1 if A % B would overflow in [MIN,MAX] arithmetic.
- See above for restrictions. Do not check for division by zero.
- Mathematically, % should never overflow, but on x86-like hosts
- INT_MIN % -1 traps, and the C standard permits this, so treat this
- as an overflow too. */
-#define INT_REMAINDER_RANGE_OVERFLOW(a, b, min, max) \
- INT_DIVIDE_RANGE_OVERFLOW (a, b, min, max)
-
-/* Return 1 if A << B would overflow in [MIN,MAX] arithmetic.
- See above for restrictions. Here, MIN and MAX are for A only, and B need
- not be of the same type as the other arguments. The C standard says that
- behavior is undefined for shifts unless 0 <= B < wordwidth, and that when
- A is negative then A << B has undefined behavior and A >> B has
- implementation-defined behavior, but do not check these other
- restrictions. */
-#define INT_LEFT_SHIFT_RANGE_OVERFLOW(a, b, min, max) \
- ((a) < 0 \
- ? (a) < (min) >> (b) \
- : (max) >> (b) < (a))
-
-/* The _GL*_OVERFLOW macros have the same restrictions as the
- *_RANGE_OVERFLOW macros, except that they do not assume that operands
- (e.g., A and B) have the same type as MIN and MAX. Instead, they assume
- that the result (e.g., A + B) has that type. */
-#if _GL_HAS_BUILTIN_OVERFLOW_P
-# define _GL_ADD_OVERFLOW(a, b, min, max) \
- __builtin_add_overflow_p (a, b, (__typeof__ ((a) + (b))) 0)
-# define _GL_SUBTRACT_OVERFLOW(a, b, min, max) \
- __builtin_sub_overflow_p (a, b, (__typeof__ ((a) - (b))) 0)
-# define _GL_MULTIPLY_OVERFLOW(a, b, min, max) \
- __builtin_mul_overflow_p (a, b, (__typeof__ ((a) * (b))) 0)
-#else
-# define _GL_ADD_OVERFLOW(a, b, min, max) \
- ((min) < 0 ? INT_ADD_RANGE_OVERFLOW (a, b, min, max) \
- : (a) < 0 ? (b) <= (a) + (b) \
- : (b) < 0 ? (a) <= (a) + (b) \
- : (a) + (b) < (b))
-# define _GL_SUBTRACT_OVERFLOW(a, b, min, max) \
- ((min) < 0 ? INT_SUBTRACT_RANGE_OVERFLOW (a, b, min, max) \
- : (a) < 0 ? 1 \
- : (b) < 0 ? (a) - (b) <= (a) \
- : (a) < (b))
-# define _GL_MULTIPLY_OVERFLOW(a, b, min, max) \
- (((min) == 0 && (((a) < 0 && 0 < (b)) || ((b) < 0 && 0 < (a)))) \
- || INT_MULTIPLY_RANGE_OVERFLOW (a, b, min, max))
-#endif
-#define _GL_DIVIDE_OVERFLOW(a, b, min, max) \
- ((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max) \
- : (a) < 0 ? (b) <= (a) + (b) - 1 \
- : (b) < 0 && (a) + (b) <= (a))
-#define _GL_REMAINDER_OVERFLOW(a, b, min, max) \
- ((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max) \
- : (a) < 0 ? (a) % (b) != ((max) - (b) + 1) % (b) \
- : (b) < 0 && ! _GL_UNSIGNED_NEG_MULTIPLE (a, b, max))
-
-/* Return a nonzero value if A is a mathematical multiple of B, where
- A is unsigned, B is negative, and MAX is the maximum value of A's
- type. A's type must be the same as (A % B)'s type. Normally (A %
- -B == 0) suffices, but things get tricky if -B would overflow. */
-#define _GL_UNSIGNED_NEG_MULTIPLE(a, b, max) \
- (((b) < -_GL_SIGNED_INT_MAXIMUM (b) \
- ? (_GL_SIGNED_INT_MAXIMUM (b) == (max) \
- ? (a) \
- : (a) % (_GL_INT_CONVERT (a, _GL_SIGNED_INT_MAXIMUM (b)) + 1)) \
- : (a) % - (b)) \
- == 0)
-
-/* Check for integer overflow, and report low order bits of answer.
-
- The INT_<op>_OVERFLOW macros return 1 if the corresponding C operators
- might not yield numerically correct answers due to arithmetic overflow.
- The INT_<op>_WRAPV macros compute the low-order bits of the sum,
- difference, and product of two C integers, and return 1 if these
- low-order bits are not numerically correct.
- These macros work correctly on all known practical hosts, and do not rely
- on undefined behavior due to signed arithmetic overflow.
-
- Example usage, assuming A and B are long int:
-
- if (INT_MULTIPLY_OVERFLOW (a, b))
- printf ("result would overflow\n");
- else
- printf ("result is %ld (no overflow)\n", a * b);
-
- Example usage with WRAPV flavor:
-
- long int result;
- bool overflow = INT_MULTIPLY_WRAPV (a, b, &result);
- printf ("result is %ld (%s)\n", result,
- overflow ? "after overflow" : "no overflow");
-
- Restrictions on these macros:
-
- These macros do not check for all possible numerical problems or
- undefined or unspecified behavior: they do not check for division
- by zero, for bad shift counts, or for shifting negative numbers.
-
- These macros may evaluate their arguments zero or multiple times, so the
- arguments should not have side effects.
-
- The WRAPV macros are not constant expressions. They support only
- +, binary -, and *.
-
- Because the WRAPV macros convert the result, they report overflow
- in different circumstances than the OVERFLOW macros do. For
- example, in the typical case with 16-bit 'short' and 32-bit 'int',
- if A, B and *R are all of type 'short' then INT_ADD_OVERFLOW (A, B)
- returns false because the addition cannot overflow after A and B
- are converted to 'int', whereas INT_ADD_WRAPV (A, B, R) returns
- true or false depending on whether the sum fits into 'short'.
-
- These macros are tuned for their last input argument being a constant.
-
- A, B, and *R should be integers; they need not be the same type,
- and they need not be all signed or all unsigned.
- However, none of the integer types should be bit-precise,
- and *R's type should not be char, bool, or an enumeration type.
-
- Return 1 if the integer expressions A * B, A - B, -A, A * B, A / B,
- A % B, and A << B would overflow, respectively. */
-
-#define INT_ADD_OVERFLOW(a, b) \
- _GL_BINARY_OP_OVERFLOW (a, b, _GL_ADD_OVERFLOW)
-#define INT_SUBTRACT_OVERFLOW(a, b) \
- _GL_BINARY_OP_OVERFLOW (a, b, _GL_SUBTRACT_OVERFLOW)
-#define INT_NEGATE_OVERFLOW(a) _GL_INT_NEGATE_OVERFLOW (a)
-#define INT_MULTIPLY_OVERFLOW(a, b) \
- _GL_BINARY_OP_OVERFLOW (a, b, _GL_MULTIPLY_OVERFLOW)
-#define INT_DIVIDE_OVERFLOW(a, b) \
- _GL_BINARY_OP_OVERFLOW (a, b, _GL_DIVIDE_OVERFLOW)
-#define INT_REMAINDER_OVERFLOW(a, b) \
- _GL_BINARY_OP_OVERFLOW (a, b, _GL_REMAINDER_OVERFLOW)
-#define INT_LEFT_SHIFT_OVERFLOW(a, b) \
- INT_LEFT_SHIFT_RANGE_OVERFLOW (a, b, \
- _GL_INT_MINIMUM (a), _GL_INT_MAXIMUM (a))
-
-/* Return 1 if the expression A <op> B would overflow,
- where OP_RESULT_OVERFLOW (A, B, MIN, MAX) does the actual test,
- assuming MIN and MAX are the minimum and maximum for the result type.
- Arguments should be free of side effects. */
-#define _GL_BINARY_OP_OVERFLOW(a, b, op_result_overflow) \
- op_result_overflow (a, b, \
- _GL_INT_MINIMUM (_GL_INT_CONVERT (a, b)), \
- _GL_INT_MAXIMUM (_GL_INT_CONVERT (a, b)))
-
-/* Store the low-order bits of A + B, A - B, A * B, respectively, into *R.
- Return 1 if the result overflows. See above for restrictions. */
-#define INT_ADD_WRAPV(a, b, r) _GL_INT_ADD_WRAPV (a, b, r)
-#define INT_SUBTRACT_WRAPV(a, b, r) _GL_INT_SUBTRACT_WRAPV (a, b, r)
-#define INT_MULTIPLY_WRAPV(a, b, r) _GL_INT_MULTIPLY_WRAPV (a, b, r)
-
-/* The following macros compute A + B, A - B, and A * B, respectively.
- If no overflow occurs, they set *R to the result and return 1;
- otherwise, they return 0 and may modify *R.
-
- Example usage:
-
- long int result;
- if (INT_ADD_OK (a, b, &result))
- printf ("result is %ld\n", result);
- else
- printf ("overflow\n");
-
- A, B, and *R should be integers; they need not be the same type,
- and they need not be all signed or all unsigned.
- However, none of the integer types should be bit-precise,
- and *R's type should not be char, bool, or an enumeration type.
-
- These macros work correctly on all known practical hosts, and do not rely
- on undefined behavior due to signed arithmetic overflow.
-
- These macros are not constant expressions.
-
- These macros may evaluate their arguments zero or multiple times, so the
- arguments should not have side effects.
-
- These macros are tuned for B being a constant. */
-
-#define INT_ADD_OK(a, b, r) (! INT_ADD_WRAPV (a, b, r))
-#define INT_SUBTRACT_OK(a, b, r) (! INT_SUBTRACT_WRAPV (a, b, r))
-#define INT_MULTIPLY_OK(a, b, r) (! INT_MULTIPLY_WRAPV (a, b, r))
-
-#endif /* _GL_INTPROPS_H */
diff --git a/cross/lib/inttypes.in.h b/cross/lib/inttypes.in.h
deleted file mode 100644
index 5b7ef12dc7e..00000000000
--- a/cross/lib/inttypes.in.h
+++ /dev/null
@@ -1,1028 +0,0 @@
-/* Copyright (C) 2006-2023 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_SYSTEM_HEADER@
-#endif
-@PRAGMA_COLUMNS@
-
-/* 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 @HAVE_INTTYPES_H@
-
- /* Some pre-C++11 <stdint.h> implementations need this. */
-# if defined __cplusplus && ! defined __STDC_FORMAT_MACROS
-# define __STDC_FORMAT_MACROS 1
-# endif
-
-# @INCLUDE_NEXT@ @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@gnu.org>."
-#endif
-
-/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
-
-/* The definition of _GL_ARG_NONNULL is copied here. */
-
-/* The definition of _GL_WARN_ON_USE is copied here. */
-
-/* 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 (@APPLE_UNIVERSAL_BUILD@ ? defined _LP64 : @INT64_MAX_EQ_LONG_MAX@)
-# 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 (@APPLE_UNIVERSAL_BUILD@ ? defined _LP64 : @UINT64_MAX_EQ_ULONG_MAX@)
-# 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 @INT32_MAX_LT_INTMAX_MAX@
-# define PRIdMAX PRId64
-# else
-# define PRIdMAX "ld"
-# endif
-#endif
-#if !defined PRIiMAX
-# if @INT32_MAX_LT_INTMAX_MAX@
-# define PRIiMAX PRIi64
-# else
-# define PRIiMAX "li"
-# endif
-#endif
-#if !defined PRIoMAX
-# if @UINT32_MAX_LT_UINTMAX_MAX@
-# define PRIoMAX PRIo64
-# else
-# define PRIoMAX "lo"
-# endif
-#endif
-#if !defined PRIuMAX
-# if @UINT32_MAX_LT_UINTMAX_MAX@
-# define PRIuMAX PRIu64
-# else
-# define PRIuMAX "lu"
-# endif
-#endif
-#if !defined PRIxMAX
-# if @UINT32_MAX_LT_UINTMAX_MAX@
-# define PRIxMAX PRIx64
-# else
-# define PRIxMAX "lx"
-# endif
-#endif
-#if !defined PRIXMAX
-# if @UINT32_MAX_LT_UINTMAX_MAX@
-# 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 (@APPLE_UNIVERSAL_BUILD@ ? defined _LP64 : @INT64_MAX_EQ_LONG_MAX@)
-# 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 (@APPLE_UNIVERSAL_BUILD@ ? defined _LP64 : @UINT64_MAX_EQ_ULONG_MAX@)
-# 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 @INT32_MAX_LT_INTMAX_MAX@
-# define SCNdMAX SCNd64
-# else
-# define SCNdMAX "ld"
-# endif
-#endif
-#if !defined SCNiMAX
-# if @INT32_MAX_LT_INTMAX_MAX@
-# define SCNiMAX SCNi64
-# else
-# define SCNiMAX "li"
-# endif
-#endif
-#if !defined SCNoMAX
-# if @UINT32_MAX_LT_UINTMAX_MAX@
-# define SCNoMAX SCNo64
-# else
-# define SCNoMAX "lo"
-# endif
-#endif
-#if !defined SCNuMAX
-# if @UINT32_MAX_LT_UINTMAX_MAX@
-# define SCNuMAX SCNu64
-# else
-# define SCNuMAX "lu"
-# endif
-#endif
-#if !defined SCNxMAX
-# if @UINT32_MAX_LT_UINTMAX_MAX@
-# 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 @GNULIB_IMAXABS@
-# if @REPLACE_IMAXABS@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef imaxabs
-# define imaxabs rpl_imaxabs
-# endif
-_GL_FUNCDECL_RPL (imaxabs, intmax_t, (intmax_t x));
-_GL_CXXALIAS_RPL (imaxabs, intmax_t, (intmax_t x));
-# else
-# if !@HAVE_DECL_IMAXABS@
-_GL_FUNCDECL_SYS (imaxabs, intmax_t, (intmax_t x));
-# endif
-_GL_CXXALIAS_SYS (imaxabs, intmax_t, (intmax_t x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (imaxabs);
-# 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 @GNULIB_IMAXDIV@
-# if !@HAVE_IMAXDIV_T@
-# if !GNULIB_defined_imaxdiv_t
-typedef struct { intmax_t quot; intmax_t rem; } imaxdiv_t;
-# define GNULIB_defined_imaxdiv_t 1
-# endif
-# endif
-# if @REPLACE_IMAXDIV@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef imaxdiv
-# define imaxdiv rpl_imaxdiv
-# endif
-_GL_FUNCDECL_RPL (imaxdiv, imaxdiv_t, (intmax_t numer, intmax_t denom));
-_GL_CXXALIAS_RPL (imaxdiv, imaxdiv_t, (intmax_t numer, intmax_t denom));
-# else
-# if !@HAVE_DECL_IMAXDIV@
-_GL_FUNCDECL_SYS (imaxdiv, imaxdiv_t, (intmax_t numer, intmax_t denom));
-# endif
-_GL_CXXALIAS_SYS (imaxdiv, imaxdiv_t, (intmax_t numer, intmax_t denom));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (imaxdiv);
-# 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 @GNULIB_STRTOIMAX@
-# if @REPLACE_STRTOIMAX@
-# 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 !@HAVE_DECL_STRTOIMAX@
-# 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 @GNULIB_STRTOUMAX@
-# if @REPLACE_STRTOUMAX@
-# 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 !@HAVE_DECL_STRTOUMAX@
-# 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/cross/lib/isnan.c b/cross/lib/isnan.c
deleted file mode 100644
index 39e193b9606..00000000000
--- a/cross/lib/isnan.c
+++ /dev/null
@@ -1,190 +0,0 @@
-/* Test for NaN that does not need libm.
- Copyright (C) 2007-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
-
-#include <config.h>
-
-/* Specification. */
-#ifdef USE_LONG_DOUBLE
-/* Specification found in math.h or isnanl-nolibm.h. */
-extern int rpl_isnanl (long double x) _GL_ATTRIBUTE_CONST;
-#elif ! defined USE_FLOAT
-/* Specification found in math.h or isnand-nolibm.h. */
-extern int rpl_isnand (double x);
-#else /* defined USE_FLOAT */
-/* Specification found in math.h or isnanf-nolibm.h. */
-extern int rpl_isnanf (float x);
-#endif
-
-#include <float.h>
-#include <string.h>
-
-#include "float+.h"
-
-#ifdef USE_LONG_DOUBLE
-# define FUNC rpl_isnanl
-# define DOUBLE long double
-# define MAX_EXP LDBL_MAX_EXP
-# define MIN_EXP LDBL_MIN_EXP
-# if defined LDBL_EXPBIT0_WORD && defined LDBL_EXPBIT0_BIT
-# define KNOWN_EXPBIT0_LOCATION
-# define EXPBIT0_WORD LDBL_EXPBIT0_WORD
-# define EXPBIT0_BIT LDBL_EXPBIT0_BIT
-# endif
-# define SIZE SIZEOF_LDBL
-# define L_(literal) literal##L
-#elif ! defined USE_FLOAT
-# define FUNC rpl_isnand
-# define DOUBLE double
-# define MAX_EXP DBL_MAX_EXP
-# define MIN_EXP DBL_MIN_EXP
-# if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT
-# define KNOWN_EXPBIT0_LOCATION
-# define EXPBIT0_WORD DBL_EXPBIT0_WORD
-# define EXPBIT0_BIT DBL_EXPBIT0_BIT
-# endif
-# define SIZE SIZEOF_DBL
-# define L_(literal) literal
-#else /* defined USE_FLOAT */
-# define FUNC rpl_isnanf
-# define DOUBLE float
-# define MAX_EXP FLT_MAX_EXP
-# define MIN_EXP FLT_MIN_EXP
-# if defined FLT_EXPBIT0_WORD && defined FLT_EXPBIT0_BIT
-# define KNOWN_EXPBIT0_LOCATION
-# define EXPBIT0_WORD FLT_EXPBIT0_WORD
-# define EXPBIT0_BIT FLT_EXPBIT0_BIT
-# endif
-# define SIZE SIZEOF_FLT
-# define L_(literal) literal##f
-#endif
-
-#define EXP_MASK ((MAX_EXP - MIN_EXP) | 7)
-
-#define NWORDS \
- ((sizeof (DOUBLE) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
-typedef union { DOUBLE value; unsigned int word[NWORDS]; } memory_double;
-
-/* Most hosts nowadays use IEEE floating point, so they use IEC 60559
- representations, have infinities and NaNs, and do not trap on
- exceptions. Define IEEE_FLOATING_POINT if this host is one of the
- typical ones. The C23 macro __STDC_IEC_60559_BFP__ macro (or its cousin,
- the now-obsolescent C11 macro __STDC_IEC_559__) is close to what is
- wanted here, but is not quite right because this file does not require
- all the features of C23 Annex F (and works even with pre-C11 platforms,
- for that matter). */
-
-#define IEEE_FLOATING_POINT (FLT_RADIX == 2 && FLT_MANT_DIG == 24 \
- && FLT_MIN_EXP == -125 && FLT_MAX_EXP == 128)
-
-int
-FUNC (DOUBLE x)
-{
-#if defined KNOWN_EXPBIT0_LOCATION && IEEE_FLOATING_POINT
-# if defined USE_LONG_DOUBLE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
- /* Special CPU dependent code is needed to treat bit patterns outside the
- IEEE 754 specification (such as Pseudo-NaNs, Pseudo-Infinities,
- Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals) as NaNs.
- These bit patterns are:
- - exponent = 0x0001..0x7FFF, mantissa bit 63 = 0,
- - exponent = 0x0000, mantissa bit 63 = 1.
- The NaN bit pattern is:
- - exponent = 0x7FFF, mantissa >= 0x8000000000000001. */
- memory_double m;
- unsigned int exponent;
-
- m.value = x;
- exponent = (m.word[EXPBIT0_WORD] >> EXPBIT0_BIT) & EXP_MASK;
-# ifdef WORDS_BIGENDIAN
- /* Big endian: EXPBIT0_WORD = 0, EXPBIT0_BIT = 16. */
- if (exponent == 0)
- return 1 & (m.word[0] >> 15);
- else if (exponent == EXP_MASK)
- return (((m.word[0] ^ 0x8000U) << 16) | m.word[1] | (m.word[2] >> 16)) != 0;
- else
- return 1 & ~(m.word[0] >> 15);
-# else
- /* Little endian: EXPBIT0_WORD = 2, EXPBIT0_BIT = 0. */
- if (exponent == 0)
- return (m.word[1] >> 31);
- else if (exponent == EXP_MASK)
- return ((m.word[1] ^ 0x80000000U) | m.word[0]) != 0;
- else
- return (m.word[1] >> 31) ^ 1;
-# endif
-# else
- /* Be careful to not do any floating-point operation on x, such as x == x,
- because x may be a signaling NaN. */
-# if defined __SUNPRO_C || defined __ICC || defined _MSC_VER \
- || defined __DECC || defined __TINYC__ \
- || (defined __sgi && !defined __GNUC__)
- /* The Sun C 5.0, Intel ICC 10.0, Microsoft Visual C/C++ 9.0, Compaq (ex-DEC)
- 6.4, and TinyCC compilers don't recognize the initializers as constant
- expressions. The Compaq compiler also fails when constant-folding
- 0.0 / 0.0 even when constant-folding is not required. The Microsoft
- Visual C/C++ compiler also fails when constant-folding 1.0 / 0.0 even
- when constant-folding is not required. The SGI MIPSpro C compiler
- complains about "floating-point operation result is out of range". */
- static DOUBLE zero = L_(0.0);
- memory_double nan;
- DOUBLE plus_inf = L_(1.0) / zero;
- DOUBLE minus_inf = -L_(1.0) / zero;
- nan.value = zero / zero;
-# else
- static memory_double nan = { L_(0.0) / L_(0.0) };
- static DOUBLE plus_inf = L_(1.0) / L_(0.0);
- static DOUBLE minus_inf = -L_(1.0) / L_(0.0);
-# endif
- {
- memory_double m;
-
- /* A NaN can be recognized through its exponent. But exclude +Infinity and
- -Infinity, which have the same exponent. */
- m.value = x;
- if (((m.word[EXPBIT0_WORD] ^ nan.word[EXPBIT0_WORD])
- & (EXP_MASK << EXPBIT0_BIT))
- == 0)
- return (memcmp (&m.value, &plus_inf, SIZE) != 0
- && memcmp (&m.value, &minus_inf, SIZE) != 0);
- else
- return 0;
- }
-# endif
-#else
- /* The configuration did not find sufficient information, or does
- not use IEEE floating point. Give up about the signaling NaNs;
- handle only the quiet NaNs. */
- if (x == x)
- {
-# if defined USE_LONG_DOUBLE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
- /* Detect any special bit patterns that pass ==; see comment above. */
- memory_double m1;
- memory_double m2;
-
- memset (&m1.value, 0, SIZE);
- memset (&m2.value, 0, SIZE);
- m1.value = x;
- m2.value = x + (x ? 0.0L : -0.0L);
- if (memcmp (&m1.value, &m2.value, SIZE) != 0)
- return 1;
-# endif
- return 0;
- }
- else
- return 1;
-#endif
-}
diff --git a/cross/lib/isnand-nolibm.h b/cross/lib/isnand-nolibm.h
deleted file mode 100644
index 9c75a8c47bf..00000000000
--- a/cross/lib/isnand-nolibm.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Test for NaN that does not need libm.
- Copyright (C) 2007-2023 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 HAVE_ISNAND_IN_LIBC
-/* Get declaration of isnan macro. */
-# include <math.h>
-# if (__GNUC__ >= 4) || (__clang_major__ >= 4)
- /* GCC >= 4.0 and clang provide a type-generic built-in for isnan. */
-# undef isnand
-# define isnand(x) __builtin_isnan ((double)(x))
-# else
-# undef isnand
-# define isnand(x) isnan ((double)(x))
-# endif
-#else
-/* Test whether X is a NaN. */
-# undef isnand
-# define isnand rpl_isnand
-extern int isnand (double x);
-#endif
diff --git a/cross/lib/isnand.c b/cross/lib/isnand.c
deleted file mode 100644
index e14d2e6fb29..00000000000
--- a/cross/lib/isnand.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Test for NaN that does not need libm.
- Copyright (C) 2008-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
-
-#include "isnan.c"
diff --git a/cross/lib/isnanf-nolibm.h b/cross/lib/isnanf-nolibm.h
deleted file mode 100644
index cc6b4198ff1..00000000000
--- a/cross/lib/isnanf-nolibm.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Test for NaN that does not need libm.
- Copyright (C) 2007-2023 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 HAVE_ISNANF_IN_LIBC
-/* Get declaration of isnan macro or (older) isnanf function. */
-# include <math.h>
-# if (__GNUC__ >= 4) || (__clang_major__ >= 4)
- /* GCC >= 4.0 and clang provide a type-generic built-in for isnan.
- GCC >= 4.0 also provides __builtin_isnanf, but clang doesn't. */
-# undef isnanf
-# define isnanf(x) __builtin_isnan ((float)(x))
-# elif defined isnan
-# undef isnanf
-# define isnanf(x) isnan ((float)(x))
-# else
- /* Get declaration of isnanf(), if not declared in <math.h>. */
-# if defined __sgi
- /* We can't include <ieeefp.h>, because it conflicts with our definition of
- isnand. Therefore declare isnanf separately. */
-extern int isnanf (float x);
-# endif
-# endif
-#else
-/* Test whether X is a NaN. */
-# undef isnanf
-# define isnanf rpl_isnanf
-extern int isnanf (float x);
-#endif
diff --git a/cross/lib/isnanf.c b/cross/lib/isnanf.c
deleted file mode 100644
index 55252ca6d6e..00000000000
--- a/cross/lib/isnanf.c
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Test for NaN that does not need libm.
- Copyright (C) 2007, 2009-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
-
-#define USE_FLOAT
-#include "isnan.c"
diff --git a/cross/lib/isnanl-nolibm.h b/cross/lib/isnanl-nolibm.h
deleted file mode 100644
index f04c489bb8e..00000000000
--- a/cross/lib/isnanl-nolibm.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Test for NaN that does not need libm.
- Copyright (C) 2007-2023 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 HAVE_ISNANL_IN_LIBC
-/* Get declaration of isnan macro or (older) isnanl function. */
-# include <math.h>
-# if (__GNUC__ >= 4) || (__clang_major__ >= 4)
- /* GCC >= 4.0 and clang provide a type-generic built-in for isnan.
- GCC >= 4.0 also provides __builtin_isnanl, but clang doesn't. */
-# undef isnanl
-# define isnanl(x) __builtin_isnan ((long double)(x))
-# elif defined isnan
-# undef isnanl
-# define isnanl(x) isnan ((long double)(x))
-# endif
-#else
-/* Test whether X is a NaN. */
-# undef isnanl
-# define isnanl rpl_isnanl
-extern int isnanl (long double x);
-#endif
diff --git a/cross/lib/isnanl.c b/cross/lib/isnanl.c
deleted file mode 100644
index 286f245097e..00000000000
--- a/cross/lib/isnanl.c
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Test for NaN that does not need libm.
- Copyright (C) 2007, 2009-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
-
-#define USE_LONG_DOUBLE
-#include "isnan.c"
diff --git a/cross/lib/itold.c b/cross/lib/itold.c
deleted file mode 100644
index 0ef4464eead..00000000000
--- a/cross/lib/itold.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Replacement for 'int' to 'long double' conversion routine.
- Copyright (C) 2011-2023 Free Software Foundation, Inc.
- Written by Bruno Haible <bruno@clisp.org>, 2011.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General 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 <float.h>
-
-void
-_Qp_itoq (long double *result, int a)
-{
- /* Convert from 'int' to 'double', then from 'double' to 'long double'. */
- *result = (double) a;
-}
diff --git a/cross/lib/lchmod.c b/cross/lib/lchmod.c
deleted file mode 100644
index b2d1b8bfde1..00000000000
--- a/cross/lib/lchmod.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/* Implement lchmod on platforms where it does not work correctly.
-
- Copyright 2020-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* written by Paul Eggert */
-
-#include <config.h>
-
-/* Specification. */
-#include <sys/stat.h>
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <intprops.h>
-
-/* Work like chmod, except when FILE is a symbolic link.
- In that case, on systems where permissions on symbolic links are unsupported
- (such as Linux), set errno to EOPNOTSUPP and return -1. */
-
-int
-lchmod (char const *file, mode_t mode)
-{
- char readlink_buf[1];
-
-#ifdef O_PATH
- /* Open a file descriptor with O_NOFOLLOW, to make sure we don't
- follow symbolic links, if /proc is mounted. O_PATH is used to
- avoid a failure if the file is not readable.
- Cf. <https://sourceware.org/bugzilla/show_bug.cgi?id=14578> */
- int fd = open (file, O_PATH | O_NOFOLLOW | O_CLOEXEC);
- if (fd < 0)
- return fd;
-
- int err;
- if (0 <= readlinkat (fd, "", readlink_buf, sizeof readlink_buf))
- err = EOPNOTSUPP;
- else if (errno == EINVAL)
- {
- static char const fmt[] = "/proc/self/fd/%d";
- char buf[sizeof fmt - sizeof "%d" + INT_BUFSIZE_BOUND (int)];
- sprintf (buf, fmt, fd);
- err = chmod (buf, mode) == 0 ? 0 : errno == ENOENT ? -1 : errno;
- }
- else
- err = errno == ENOENT ? -1 : errno;
-
- close (fd);
-
- errno = err;
- if (0 <= err)
- return err == 0 ? 0 : -1;
-#endif
-
- size_t len = strlen (file);
- if (len && file[len - 1] == '/')
- {
- struct stat st;
- if (lstat (file, &st) < 0)
- return -1;
- if (!S_ISDIR (st.st_mode))
- {
- errno = ENOTDIR;
- return -1;
- }
- }
-
- /* O_PATH + /proc is not supported. */
-
- if (0 <= readlink (file, readlink_buf, sizeof readlink_buf))
- {
- errno = EOPNOTSUPP;
- return -1;
- }
-
- /* Fall back on chmod, despite a possible race. */
- return chmod (file, mode);
-}
diff --git a/cross/lib/libc-config.h b/cross/lib/libc-config.h
deleted file mode 100644
index 5f5ad010377..00000000000
--- a/cross/lib/libc-config.h
+++ /dev/null
@@ -1,204 +0,0 @@
-/* System definitions for code taken from the GNU C Library
-
- Copyright 2017-2023 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/>. */
-
-/* Written by Paul Eggert. */
-
-/* This is intended to be a good-enough substitute for glibc system
- macros like those defined in <sys/cdefs.h>, so that Gnulib code
- shared with glibc can do this as the first #include:
-
- #ifndef _LIBC
- # include <libc-config.h>
- #endif
-
- When compiled as part of glibc this is a no-op; when compiled as
- part of Gnulib this includes Gnulib's <config.h> and defines macros
- that glibc library code would normally assume.
-
- Note: This header file MUST NOT be included by public header files
- of Gnulib. */
-
-#include <config.h>
-
-/* On glibc this includes <features.h> and <sys/cdefs.h> and #defines
- _FEATURES_H, __WORDSIZE, and __set_errno. On FreeBSD 11 and
- DragonFlyBSD 5.9 it includes <sys/cdefs.h> which defines __nonnull.
- Elsewhere it is harmless. */
-#include <errno.h>
-
-/* From glibc <errno.h>. */
-#ifndef __set_errno
-# define __set_errno(val) (errno = (val))
-#endif
-
-/* From glibc <features.h>. */
-
-#ifndef __GNUC_PREREQ
-# if defined __GNUC__ && defined __GNUC_MINOR__
-# define __GNUC_PREREQ(maj, min) ((maj) < __GNUC__ + ((min) <= __GNUC_MINOR__))
-# else
-# define __GNUC_PREREQ(maj, min) 0
-# endif
-#endif
-
-#ifndef __glibc_clang_prereq
-# if defined __clang_major__ && defined __clang_minor__
-# ifdef __apple_build_version__
-/* Apple for some reason renumbers __clang_major__ and __clang_minor__.
- Gnulib code uses only __glibc_clang_prereq (3, 5); map it to
- 6000000 <= __apple_build_version__. Support for other calls to
- __glibc_clang_prereq can be added here as needed. */
-# define __glibc_clang_prereq(maj, min) \
- ((maj) == 3 && (min) == 5 ? 6000000 <= __apple_build_version__ : 0)
-# else
-# define __glibc_clang_prereq(maj, min) \
- ((maj) < __clang_major__ + ((min) <= __clang_minor__))
-# endif
-# else
-# define __glibc_clang_prereq(maj, min) 0
-# endif
-#endif
-
-#ifndef __attribute_nonnull__
-/* <sys/cdefs.h> either does not exist, or is too old for Gnulib.
- Prepare to include <cdefs.h>, which is Gnulib's version of a
- more-recent glibc <sys/cdefs.h>. */
-
-/* Define _FEATURES_H so that <cdefs.h> does not include <features.h>. */
-# ifndef _FEATURES_H
-# define _FEATURES_H 1
-# endif
-/* Define __GNULIB_CDEFS so that <cdefs.h> does not attempt to include
- nonexistent files. */
-# define __GNULIB_CDEFS
-/* Undef the macros unconditionally defined by our copy of glibc
- <sys/cdefs.h>, so that they do not clash with any system-defined
- versions. */
-# undef _SYS_CDEFS_H
-# undef __ASMNAME
-# undef __ASMNAME2
-# undef __BEGIN_DECLS
-# undef __CONCAT
-# undef __END_DECLS
-# undef __HAVE_GENERIC_SELECTION
-# undef __LDBL_COMPAT
-# undef __LDBL_REDIR
-# undef __LDBL_REDIR1
-# undef __LDBL_REDIR1_DECL
-# undef __LDBL_REDIR1_NTH
-# undef __LDBL_REDIR2_DECL
-# undef __LDBL_REDIR_DECL
-# undef __LDBL_REDIR_NTH
-# undef __LEAF
-# undef __LEAF_ATTR
-# undef __NTH
-# undef __NTHNL
-# undef __REDIRECT
-# undef __REDIRECT_LDBL
-# undef __REDIRECT_NTH
-# undef __REDIRECT_NTHNL
-# undef __REDIRECT_NTH_LDBL
-# undef __STRING
-# undef __THROW
-# undef __THROWNL
-# undef __attr_access
-# undef __attr_access_none
-# undef __attr_dealloc
-# undef __attr_dealloc_free
-# undef __attribute__
-# undef __attribute_alloc_align__
-# undef __attribute_alloc_size__
-# undef __attribute_artificial__
-# undef __attribute_const__
-# undef __attribute_deprecated__
-# undef __attribute_deprecated_msg__
-# undef __attribute_format_arg__
-# undef __attribute_format_strfmon__
-# undef __attribute_malloc__
-# undef __attribute_maybe_unused__
-# undef __attribute_noinline__
-# undef __attribute_nonstring__
-# undef __attribute_pure__
-# undef __attribute_returns_twice__
-# undef __attribute_used__
-# undef __attribute_warn_unused_result__
-# undef __errordecl
-# undef __extension__
-# undef __extern_always_inline
-# undef __extern_inline
-# undef __flexarr
-# undef __fortified_attr_access
-# undef __fortify_function
-# undef __glibc_c99_flexarr_available
-# undef __glibc_has_attribute
-# undef __glibc_has_builtin
-# undef __glibc_has_extension
-# undef __glibc_likely
-# undef __glibc_macro_warning
-# undef __glibc_macro_warning1
-# undef __glibc_unlikely
-# undef __inline
-# undef __ptr_t
-# undef __restrict
-# undef __restrict_arr
-# undef __va_arg_pack
-# undef __va_arg_pack_len
-# undef __warnattr
-# undef __wur
-# ifndef __GNULIB_CDEFS
-# undef __bos
-# undef __bos0
-# undef __glibc_fortify
-# undef __glibc_fortify_n
-# undef __glibc_objsize
-# undef __glibc_objsize0
-# undef __glibc_safe_len_cond
-# undef __glibc_safe_or_unknown_len
-# undef __glibc_unsafe_len
-# undef __glibc_unsigned_or_positive
-# endif
-
-/* Include our copy of glibc <sys/cdefs.h>. */
-# include <cdefs.h>
-
-/* <cdefs.h> __inline is too pessimistic for non-GCC. */
-# undef __inline
-# ifndef HAVE___INLINE
-# if 199901 <= __STDC_VERSION__ || defined inline
-# define __inline inline
-# else
-# define __inline
-# endif
-# endif
-
-#endif /* defined __glibc_likely */
-
-
-/* A substitute for glibc <libc-symbols.h>, good enough for Gnulib. */
-#define attribute_hidden
-#define libc_hidden_proto(name)
-#define libc_hidden_def(name)
-#define libc_hidden_weak(name)
-#define libc_hidden_ver(local, name)
-#define strong_alias(name, aliasname)
-#define weak_alias(name, aliasname)
-
-/* A substitute for glibc <shlib-compat.h>, good enough for Gnulib. */
-#define SHLIB_COMPAT(lib, introduced, obsoleted) 0
-#define compat_symbol(lib, local, symbol, version) extern int dummy
-#define versioned_symbol(lib, local, symbol, version) extern int dummy
diff --git a/cross/lib/limits.in.h b/cross/lib/limits.in.h
deleted file mode 100644
index a01b4c6a280..00000000000
--- a/cross/lib/limits.in.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/* A GNU-like <limits.h>.
-
- Copyright 2016-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#if __GNUC__ >= 3
-@PRAGMA_SYSTEM_HEADER@
-#endif
-@PRAGMA_COLUMNS@
-
-#if defined _GL_ALREADY_INCLUDING_LIMITS_H
-/* Special invocation convention:
- On Haiku/x86_64, we have a sequence of nested includes
- <limits.h> -> <syslimits.h> -> <limits.h>.
- In this situation, LONG_MAX and INT_MAX are not yet defined,
- therefore we should not attempt to define LONG_BIT. */
-
-#@INCLUDE_NEXT@ @NEXT_LIMITS_H@
-
-#else
-/* Normal invocation convention. */
-
-#ifndef _@GUARD_PREFIX@_LIMITS_H
-
-# define _GL_ALREADY_INCLUDING_LIMITS_H
-
-/* The include_next requires a split double-inclusion guard. */
-# @INCLUDE_NEXT@ @NEXT_LIMITS_H@
-
-# undef _GL_ALREADY_INCLUDING_LIMITS_H
-
-#ifndef _@GUARD_PREFIX@_LIMITS_H
-#define _@GUARD_PREFIX@_LIMITS_H
-
-#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 C23 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 C23. */
-
-#if (defined _GNU_SOURCE \
- || (defined __STDC_VERSION__ && 201710 < __STDC_VERSION__))
-# if ! defined BOOL_WIDTH
-# define BOOL_WIDTH 1
-# define BOOL_MAX 1
-# elif ! defined BOOL_MAX
-# define BOOL_MAX ((((1U << (BOOL_WIDTH - 1)) - 1) << 1) + 1)
-# endif
-#endif
-
-#endif /* _@GUARD_PREFIX@_LIMITS_H */
-#endif /* _@GUARD_PREFIX@_LIMITS_H */
-#endif
diff --git a/cross/lib/lstat.c b/cross/lib/lstat.c
deleted file mode 100644
index 00a4ce2ab87..00000000000
--- a/cross/lib/lstat.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/* Work around a bug of lstat on some systems
-
- Copyright (C) 1997-2006, 2008-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* written by Jim Meyering */
-
-/* If the user's config.h happens to include <sys/stat.h>, let it include only
- the system's <sys/stat.h> here, so that orig_lstat doesn't recurse to
- rpl_lstat. */
-#define __need_system_sys_stat_h
-#include <config.h>
-
-#if !HAVE_LSTAT
-/* On systems that lack symlinks, our replacement <sys/stat.h> already
- defined lstat as stat, so there is nothing further to do other than
- avoid an empty file. */
-typedef int dummy;
-#else /* HAVE_LSTAT */
-
-/* Get the original definition of lstat. It might be defined as a macro. */
-# include <sys/types.h>
-# include <sys/stat.h>
-# undef __need_system_sys_stat_h
-
-static int
-orig_lstat (const char *filename, struct stat *buf)
-{
- return lstat (filename, buf);
-}
-
-/* Specification. */
-# ifdef __osf__
-/* Write "sys/stat.h" here, not <sys/stat.h>, otherwise OSF/1 5.1 DTK cc
- eliminates this include because of the preliminary #include <sys/stat.h>
- above. */
-# include "sys/stat.h"
-# else
-# include <sys/stat.h>
-# endif
-
-# include "stat-time.h"
-
-# include <string.h>
-# include <errno.h>
-
-/* lstat works differently on Linux and Solaris systems. POSIX (see
- "pathname resolution" in the glossary) requires that programs like
- 'ls' take into consideration the fact that FILE has a trailing slash
- when FILE is a symbolic link. On Linux and Solaris 10 systems, the
- lstat function already has the desired semantics (in treating
- 'lstat ("symlink/", sbuf)' just like 'lstat ("symlink/.", sbuf)',
- but on Solaris 9 and earlier it does not.
-
- If FILE has a trailing slash and specifies a symbolic link,
- then use stat() to get more info on the referent of FILE.
- If the referent is a non-directory, then set errno to ENOTDIR
- and return -1. Otherwise, return stat's result. */
-
-int
-rpl_lstat (const char *file, struct stat *sbuf)
-{
- int result = orig_lstat (file, sbuf);
-
- /* This replacement file can blindly check against '/' rather than
- using the ISSLASH macro, because all platforms with '\\' either
- lack symlinks (mingw) or have working lstat (cygwin) and thus do
- not compile this file. 0 len should have already been filtered
- out above, with a failure return of ENOENT. */
- if (result == 0)
- {
- if (S_ISDIR (sbuf->st_mode) || file[strlen (file) - 1] != '/')
- result = stat_time_normalize (result, sbuf);
- else
- {
- /* At this point, a trailing slash is permitted only on
- symlink-to-dir; but it should have found information on the
- directory, not the symlink. Call 'stat' to get info about the
- link's referent. Our replacement stat guarantees valid results,
- even if the symlink is not pointing to a directory. */
- if (!S_ISLNK (sbuf->st_mode))
- {
- errno = ENOTDIR;
- return -1;
- }
- result = stat (file, sbuf);
- }
- }
- return result;
-}
-
-#endif /* HAVE_LSTAT */
diff --git a/cross/lib/malloc.c b/cross/lib/malloc.c
deleted file mode 100644
index 3ade35cb63f..00000000000
--- a/cross/lib/malloc.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/* malloc() function that is glibc compatible.
-
- Copyright (C) 1997-1998, 2006-2007, 2009-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* written by Jim Meyering and Bruno Haible */
-
-#define _GL_USE_STDLIB_ALLOC 1
-#include <config.h>
-
-#include <stdlib.h>
-
-#include <errno.h>
-
-#include "xalloc-oversized.h"
-
-/* Allocate an N-byte block of memory from the heap, even if N is 0. */
-
-void *
-rpl_malloc (size_t n)
-{
- if (n == 0)
- n = 1;
-
- if (xalloc_oversized (n, 1))
- {
- errno = ENOMEM;
- return NULL;
- }
-
- void *result = malloc (n);
-
-#if !HAVE_MALLOC_POSIX
- if (result == NULL)
- errno = ENOMEM;
-#endif
-
- return result;
-}
diff --git a/cross/lib/malloc/dynarray-skeleton.c b/cross/lib/malloc/dynarray-skeleton.c
deleted file mode 100644
index 580c278b7c5..00000000000
--- a/cross/lib/malloc/dynarray-skeleton.c
+++ /dev/null
@@ -1,528 +0,0 @@
-/* Type-safe arrays which grow dynamically.
- Copyright (C) 2017-2023 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.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. */
-__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. */
-__attribute_maybe_unused__ __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. */
-__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. */
-__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. */
-__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. */
-__attribute_nonnull__ ((1))
-static inline DYNARRAY_ELEMENT *
-DYNARRAY_NAME (at) (struct DYNARRAY_STRUCT *list, size_t index)
-{
- if (__glibc_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. */
-__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. */
-__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 (__glibc_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. */
-__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 (__glibc_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 (__glibc_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. */
-__attribute_maybe_unused__ __attribute_warn_unused_result__
-__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 (__glibc_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). */
-__attribute_maybe_unused__ __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 (__glibc_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. */
-__attribute_maybe_unused__ __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. */
-__attribute_maybe_unused__ __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. */
-__attribute_maybe_unused__ __attribute_warn_unused_result__
-__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. */
-__attribute_maybe_unused__ __attribute_warn_unused_result__
-__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/cross/lib/malloc/dynarray.h b/cross/lib/malloc/dynarray.h
deleted file mode 100644
index a9a3b0859c1..00000000000
--- a/cross/lib/malloc/dynarray.h
+++ /dev/null
@@ -1,177 +0,0 @@
-/* Type-safe arrays which grow dynamically. Shared definitions.
- Copyright (C) 2017-2023 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 <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
-libc_hidden_proto (__libc_dynarray_emplace_enlarge)
-libc_hidden_proto (__libc_dynarray_resize)
-libc_hidden_proto (__libc_dynarray_resize_clear)
-libc_hidden_proto (__libc_dynarray_finalize)
-libc_hidden_proto (__libc_dynarray_at_failure)
-#endif
-
-#endif /* _DYNARRAY_H */
diff --git a/cross/lib/malloc/dynarray_at_failure.c b/cross/lib/malloc/dynarray_at_failure.c
deleted file mode 100644
index ebc9310982c..00000000000
--- a/cross/lib/malloc/dynarray_at_failure.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Report an dynamic array index out of bounds condition.
- Copyright (C) 2017-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _LIBC
-# include <libc-config.h>
-# include <stdlib.h>
-#endif
-
-#include <dynarray.h>
-#include <stdio.h>
-
-void
-__libc_dynarray_at_failure (size_t size, size_t index)
-{
-#ifdef _LIBC
- char buf[200];
- __snprintf (buf, sizeof (buf), "Fatal glibc error: "
- "array index %zu not less than array length %zu\n",
- index, size);
- __libc_fatal (buf);
-#else
- abort ();
-#endif
-}
-libc_hidden_def (__libc_dynarray_at_failure)
diff --git a/cross/lib/malloc/dynarray_emplace_enlarge.c b/cross/lib/malloc/dynarray_emplace_enlarge.c
deleted file mode 100644
index 7da539316c1..00000000000
--- a/cross/lib/malloc/dynarray_emplace_enlarge.c
+++ /dev/null
@@ -1,77 +0,0 @@
-/* Increase the size of a dynamic array in preparation of an emplace operation.
- Copyright (C) 2017-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _LIBC
-# include <libc-config.h>
-#endif
-
-#include <dynarray.h>
-#include <errno.h>
-#include <intprops.h>
-#include <stdlib.h>
-#include <string.h>
-
-bool
-__libc_dynarray_emplace_enlarge (struct dynarray_header *list,
- void *scratch, size_t element_size)
-{
- size_t new_allocated;
- if (list->allocated == 0)
- {
- /* No scratch buffer provided. Choose a reasonable default
- size. */
- if (element_size < 4)
- new_allocated = 16;
- else if (element_size < 8)
- new_allocated = 8;
- else
- new_allocated = 4;
- }
- else
- /* Increase the allocated size, using an exponential growth
- policy. */
- {
- new_allocated = list->allocated + list->allocated / 2 + 1;
- if (new_allocated <= list->allocated)
- {
- /* Overflow. */
- __set_errno (ENOMEM);
- return false;
- }
- }
-
- size_t new_size;
- if (INT_MULTIPLY_WRAPV (new_allocated, element_size, &new_size))
- return false;
- void *new_array;
- if (list->array == scratch)
- {
- /* The previous array was not heap-allocated. */
- new_array = malloc (new_size);
- if (new_array != NULL && list->array != NULL)
- memcpy (new_array, list->array, list->used * element_size);
- }
- else
- new_array = realloc (list->array, new_size);
- if (new_array == NULL)
- return false;
- list->array = new_array;
- list->allocated = new_allocated;
- return true;
-}
-libc_hidden_def (__libc_dynarray_emplace_enlarge)
diff --git a/cross/lib/malloc/dynarray_finalize.c b/cross/lib/malloc/dynarray_finalize.c
deleted file mode 100644
index 673595a5fad..00000000000
--- a/cross/lib/malloc/dynarray_finalize.c
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Copy the dynamically-allocated area to an explicitly-sized heap allocation.
- Copyright (C) 2017-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _LIBC
-# include <libc-config.h>
-#endif
-
-#include <dynarray.h>
-#include <stdlib.h>
-#include <string.h>
-
-bool
-__libc_dynarray_finalize (struct dynarray_header *list,
- void *scratch, size_t element_size,
- struct dynarray_finalize_result *result)
-{
- if (__dynarray_error (list))
- /* The caller will reported the deferred error. */
- return false;
-
- size_t used = list->used;
-
- /* Empty list. */
- if (used == 0)
- {
- /* An empty list could still be backed by a heap-allocated
- array. Free it if necessary. */
- if (list->array != scratch)
- free (list->array);
- *result = (struct dynarray_finalize_result) { NULL, 0 };
- return true;
- }
-
- size_t allocation_size = used * element_size;
- void *heap_array = malloc (allocation_size);
- if (heap_array != NULL)
- {
- /* The new array takes ownership of the strings. */
- if (list->array != NULL)
- memcpy (heap_array, list->array, allocation_size);
- if (list->array != scratch)
- free (list->array);
- *result = (struct dynarray_finalize_result)
- { .array = heap_array, .length = used };
- return true;
- }
- else
- /* The caller will perform the freeing operation. */
- return false;
-}
-libc_hidden_def (__libc_dynarray_finalize)
diff --git a/cross/lib/malloc/dynarray_resize.c b/cross/lib/malloc/dynarray_resize.c
deleted file mode 100644
index 7ecd4de63b9..00000000000
--- a/cross/lib/malloc/dynarray_resize.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/* Increase the size of a dynamic array.
- Copyright (C) 2017-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _LIBC
-# include <libc-config.h>
-#endif
-
-#include <dynarray.h>
-#include <errno.h>
-#include <intprops.h>
-#include <stdlib.h>
-#include <string.h>
-
-bool
-__libc_dynarray_resize (struct dynarray_header *list, size_t size,
- void *scratch, size_t element_size)
-{
- /* The existing allocation provides sufficient room. */
- if (size <= list->allocated)
- {
- list->used = size;
- return true;
- }
-
- /* Otherwise, use size as the new allocation size. The caller is
- expected to provide the final size of the array, so there is no
- over-allocation here. */
-
- size_t new_size_bytes;
- if (INT_MULTIPLY_WRAPV (size, element_size, &new_size_bytes))
- {
- /* Overflow. */
- __set_errno (ENOMEM);
- return false;
- }
- void *new_array;
- if (list->array == scratch)
- {
- /* The previous array was not heap-allocated. */
- new_array = malloc (new_size_bytes);
- if (new_array != NULL && list->array != NULL)
- memcpy (new_array, list->array, list->used * element_size);
- }
- else
- new_array = realloc (list->array, new_size_bytes);
- if (new_array == NULL)
- return false;
- list->array = new_array;
- list->allocated = size;
- list->used = size;
- return true;
-}
-libc_hidden_def (__libc_dynarray_resize)
diff --git a/cross/lib/malloc/dynarray_resize_clear.c b/cross/lib/malloc/dynarray_resize_clear.c
deleted file mode 100644
index bb23c522a14..00000000000
--- a/cross/lib/malloc/dynarray_resize_clear.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Increase the size of a dynamic array and clear the new part.
- Copyright (C) 2017-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _LIBC
-# include <libc-config.h>
-#endif
-
-#include <dynarray.h>
-#include <string.h>
-
-bool
-__libc_dynarray_resize_clear (struct dynarray_header *list, size_t size,
- void *scratch, size_t element_size)
-{
- size_t old_size = list->used;
- if (!__libc_dynarray_resize (list, size, scratch, element_size))
- return false;
- /* __libc_dynarray_resize already checked for overflow. */
- char *array = list->array;
- memset (array + (old_size * element_size), 0,
- (size - old_size) * element_size);
- return true;
-}
-libc_hidden_def (__libc_dynarray_resize_clear)
diff --git a/cross/lib/malloc/scratch_buffer.h b/cross/lib/malloc/scratch_buffer.h
deleted file mode 100644
index 33fd2b29cd5..00000000000
--- a/cross/lib/malloc/scratch_buffer.h
+++ /dev/null
@@ -1,135 +0,0 @@
-/* Variable-sized buffer with on-stack default allocation.
- Copyright (C) 2015-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _SCRATCH_BUFFER_H
-#define _SCRATCH_BUFFER_H
-
-/* Scratch buffers with a default stack allocation and fallback to
- heap allocation. It is expected that this function is used in this
- way:
-
- struct scratch_buffer tmpbuf;
- scratch_buffer_init (&tmpbuf);
-
- while (!function_that_uses_buffer (tmpbuf.data, tmpbuf.length))
- if (!scratch_buffer_grow (&tmpbuf))
- return -1;
-
- scratch_buffer_free (&tmpbuf);
- return 0;
-
- The allocation functions (scratch_buffer_grow,
- scratch_buffer_grow_preserve, scratch_buffer_set_array_size) make
- sure that the heap allocation, if any, is freed, so that the code
- above does not have a memory leak. The buffer still remains in a
- state that can be deallocated using scratch_buffer_free, so a loop
- like this is valid as well:
-
- struct scratch_buffer tmpbuf;
- scratch_buffer_init (&tmpbuf);
-
- while (!function_that_uses_buffer (tmpbuf.data, tmpbuf.length))
- if (!scratch_buffer_grow (&tmpbuf))
- break;
-
- scratch_buffer_free (&tmpbuf);
-
- scratch_buffer_grow and scratch_buffer_grow_preserve are guaranteed
- to grow the buffer by at least 512 bytes. This means that when
- using the scratch buffer as a backing store for a non-character
- array whose element size, in bytes, is 512 or smaller, the scratch
- buffer only has to grow once to make room for at least one more
- element.
-*/
-
-#include <stdbool.h>
-#include <stddef.h>
-#include <stdlib.h>
-
-/* Scratch buffer. Must be initialized with scratch_buffer_init
- before its use. */
-struct scratch_buffer {
- void *data; /* Pointer to the beginning of the scratch area. */
- size_t length; /* Allocated space at the data pointer, in bytes. */
- union { max_align_t __align; char __c[1024]; } __space;
-};
-
-/* Initializes *BUFFER so that BUFFER->data points to BUFFER->__space
- and BUFFER->length reflects the available space. */
-static inline void
-scratch_buffer_init (struct scratch_buffer *buffer)
-{
- buffer->data = buffer->__space.__c;
- buffer->length = sizeof (buffer->__space);
-}
-
-/* Deallocates *BUFFER (if it was heap-allocated). */
-static inline void
-scratch_buffer_free (struct scratch_buffer *buffer)
-{
- if (buffer->data != buffer->__space.__c)
- free (buffer->data);
-}
-
-/* Grow *BUFFER by some arbitrary amount. The buffer contents is NOT
- preserved. Return true on success, false on allocation failure (in
- which case the old buffer is freed). On success, the new buffer is
- larger than the previous size. On failure, *BUFFER is deallocated,
- but remains in a free-able state, and errno is set. */
-bool __libc_scratch_buffer_grow (struct scratch_buffer *buffer);
-libc_hidden_proto (__libc_scratch_buffer_grow)
-
-/* Alias for __libc_scratch_buffer_grow. */
-static __always_inline bool
-scratch_buffer_grow (struct scratch_buffer *buffer)
-{
- return __glibc_likely (__libc_scratch_buffer_grow (buffer));
-}
-
-/* Like __libc_scratch_buffer_grow, but preserve the old buffer
- contents on success, as a prefix of the new buffer. */
-bool __libc_scratch_buffer_grow_preserve (struct scratch_buffer *buffer);
-libc_hidden_proto (__libc_scratch_buffer_grow_preserve)
-
-/* Alias for __libc_scratch_buffer_grow_preserve. */
-static __always_inline bool
-scratch_buffer_grow_preserve (struct scratch_buffer *buffer)
-{
- return __glibc_likely (__libc_scratch_buffer_grow_preserve (buffer));
-}
-
-/* Grow *BUFFER so that it can store at least NELEM elements of SIZE
- bytes. The buffer contents are NOT preserved. Both NELEM and SIZE
- can be zero. Return true on success, false on allocation failure
- (in which case the old buffer is freed, but *BUFFER remains in a
- free-able state, and errno is set). It is unspecified whether this
- function can reduce the array size. */
-bool __libc_scratch_buffer_set_array_size (struct scratch_buffer *buffer,
- size_t nelem, size_t size);
-libc_hidden_proto (__libc_scratch_buffer_set_array_size)
-
-/* Alias for __libc_scratch_set_array_size. */
-static __always_inline bool
-scratch_buffer_set_array_size (struct scratch_buffer *buffer,
- size_t nelem, size_t size)
-{
- return __glibc_likely (__libc_scratch_buffer_set_array_size
- (buffer, nelem, size));
-}
-
-#endif /* _SCRATCH_BUFFER_H */
diff --git a/cross/lib/malloc/scratch_buffer_dupfree.c b/cross/lib/malloc/scratch_buffer_dupfree.c
deleted file mode 100644
index 2f60fbb54e8..00000000000
--- a/cross/lib/malloc/scratch_buffer_dupfree.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Variable-sized buffer with on-stack default allocation.
- Copyright (C) 2020-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _LIBC
-# include <libc-config.h>
-#endif
-
-#include <scratch_buffer.h>
-#include <string.h>
-
-void *
-__libc_scratch_buffer_dupfree (struct scratch_buffer *buffer, size_t size)
-{
- void *data = buffer->data;
- if (data == buffer->__space.__c)
- {
- void *copy = malloc (size);
- return copy != NULL ? memcpy (copy, data, size) : NULL;
- }
- else
- {
- void *copy = realloc (data, size);
- return copy != NULL ? copy : data;
- }
-}
-libc_hidden_def (__libc_scratch_buffer_dupfree)
diff --git a/cross/lib/malloc/scratch_buffer_grow.c b/cross/lib/malloc/scratch_buffer_grow.c
deleted file mode 100644
index a5e8f2f7230..00000000000
--- a/cross/lib/malloc/scratch_buffer_grow.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Variable-sized buffer with on-stack default allocation.
- Copyright (C) 2015-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _LIBC
-# include <libc-config.h>
-#endif
-
-#include <scratch_buffer.h>
-#include <errno.h>
-
-bool
-__libc_scratch_buffer_grow (struct scratch_buffer *buffer)
-{
- void *new_ptr;
- size_t new_length = buffer->length * 2;
-
- /* Discard old buffer. */
- scratch_buffer_free (buffer);
-
- /* Check for overflow. */
- if (__glibc_likely (new_length >= buffer->length))
- new_ptr = malloc (new_length);
- else
- {
- __set_errno (ENOMEM);
- new_ptr = NULL;
- }
-
- if (__glibc_unlikely (new_ptr == NULL))
- {
- /* Buffer must remain valid to free. */
- scratch_buffer_init (buffer);
- return false;
- }
-
- /* Install new heap-based buffer. */
- buffer->data = new_ptr;
- buffer->length = new_length;
- return true;
-}
-libc_hidden_def (__libc_scratch_buffer_grow)
diff --git a/cross/lib/malloc/scratch_buffer_grow_preserve.c b/cross/lib/malloc/scratch_buffer_grow_preserve.c
deleted file mode 100644
index c0b5d87b7e4..00000000000
--- a/cross/lib/malloc/scratch_buffer_grow_preserve.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/* Variable-sized buffer with on-stack default allocation.
- Copyright (C) 2015-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _LIBC
-# include <libc-config.h>
-#endif
-
-#include <scratch_buffer.h>
-#include <errno.h>
-#include <string.h>
-
-bool
-__libc_scratch_buffer_grow_preserve (struct scratch_buffer *buffer)
-{
- size_t new_length = 2 * buffer->length;
- void *new_ptr;
-
- if (buffer->data == buffer->__space.__c)
- {
- /* Move buffer to the heap. No overflow is possible because
- buffer->length describes a small buffer on the stack. */
- new_ptr = malloc (new_length);
- if (new_ptr == NULL)
- return false;
- memcpy (new_ptr, buffer->__space.__c, buffer->length);
- }
- else
- {
- /* Buffer was already on the heap. Check for overflow. */
- if (__glibc_likely (new_length >= buffer->length))
- new_ptr = realloc (buffer->data, new_length);
- else
- {
- __set_errno (ENOMEM);
- new_ptr = NULL;
- }
-
- if (__glibc_unlikely (new_ptr == NULL))
- {
- /* Deallocate, but buffer must remain valid to free. */
- free (buffer->data);
- scratch_buffer_init (buffer);
- return false;
- }
- }
-
- /* Install new heap-based buffer. */
- buffer->data = new_ptr;
- buffer->length = new_length;
- return true;
-}
-libc_hidden_def (__libc_scratch_buffer_grow_preserve)
diff --git a/cross/lib/malloc/scratch_buffer_set_array_size.c b/cross/lib/malloc/scratch_buffer_set_array_size.c
deleted file mode 100644
index 24c39350ade..00000000000
--- a/cross/lib/malloc/scratch_buffer_set_array_size.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/* Variable-sized buffer with on-stack default allocation.
- Copyright (C) 2015-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _LIBC
-# include <libc-config.h>
-#endif
-
-#include <scratch_buffer.h>
-#include <errno.h>
-#include <limits.h>
-
-bool
-__libc_scratch_buffer_set_array_size (struct scratch_buffer *buffer,
- size_t nelem, size_t size)
-{
- size_t new_length = nelem * size;
-
- /* Avoid overflow check if both values are small. */
- if ((nelem | size) >> (sizeof (size_t) * CHAR_BIT / 2) != 0
- && nelem != 0 && size != new_length / nelem)
- {
- /* Overflow. Discard the old buffer, but it must remain valid
- to free. */
- scratch_buffer_free (buffer);
- scratch_buffer_init (buffer);
- __set_errno (ENOMEM);
- return false;
- }
-
- if (new_length <= buffer->length)
- return true;
-
- /* Discard old buffer. */
- scratch_buffer_free (buffer);
-
- char *new_ptr = malloc (new_length);
- if (new_ptr == NULL)
- {
- /* Buffer must remain valid to free. */
- scratch_buffer_init (buffer);
- return false;
- }
-
- /* Install new heap-based buffer. */
- buffer->data = new_ptr;
- buffer->length = new_length;
- return true;
-}
-libc_hidden_def (__libc_scratch_buffer_set_array_size)
diff --git a/cross/lib/math.c b/cross/lib/math.c
deleted file mode 100644
index 67cabbcf8f2..00000000000
--- a/cross/lib/math.c
+++ /dev/null
@@ -1,22 +0,0 @@
-/* Inline functions for <math.h>.
-
- Copyright (C) 2012-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-#define _GL_MATH_INLINE _GL_EXTERN_INLINE
-#include "math.h"
-typedef int dummy;
diff --git a/cross/lib/math.in.h b/cross/lib/math.in.h
deleted file mode 100644
index 76d48a44437..00000000000
--- a/cross/lib/math.in.h
+++ /dev/null
@@ -1,2735 +0,0 @@
-/* A GNU-like <math.h>.
-
- Copyright (C) 2002-2003, 2007-2023 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/>. */
-
-/* On Android, in C++ mode, when /usr/include/c++/v1/math.h is being included
- and /usr/include/math.h has not yet been included, skip this file, since it
- would lead to many syntax errors. */
-#if !(defined __ANDROID__ && defined _LIBCPP_MATH_H && !defined INFINITY)
-
-#ifndef _@GUARD_PREFIX@_MATH_H
-
-#if __GNUC__ >= 3
-@PRAGMA_SYSTEM_HEADER@
-#endif
-@PRAGMA_COLUMNS@
-
-#if defined _GL_INCLUDING_MATH_H
-/* Special invocation convention:
- - On FreeBSD 12.2 we have a sequence of nested includes
- <math.h> -> <stdlib.h> -> <sys/wait.h> -> <sys/types.h> -> <sys/select.h>
- -> <signal.h> -> <pthread.h> -> <stdlib.h> -> <math.h>
- In this situation, the functions are not yet declared, therefore we cannot
- provide the C++ aliases. */
-
-#@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_MATH_H@
-
-#else
-/* Normal invocation convention. */
-
-/* The include_next requires a split double-inclusion guard. */
-#define _GL_INCLUDING_MATH_H
-#@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_MATH_H@
-#undef _GL_INCLUDING_MATH_H
-
-#ifndef _@GUARD_PREFIX@_MATH_H
-#define _@GUARD_PREFIX@_MATH_H
-
-/* On OpenVMS, NAN, INFINITY, and HUGEVAL macros are defined in <fp.h>. */
-#if defined __VMS && ! defined NAN
-# include <fp.h>
-#endif
-
-#ifndef _GL_INLINE_HEADER_BEGIN
- #error "Please include config.h first."
-#endif
-_GL_INLINE_HEADER_BEGIN
-#ifndef _GL_MATH_INLINE
-# define _GL_MATH_INLINE _GL_INLINE
-#endif
-
-/* The __attribute__ feature is available in gcc versions 2.5 and later.
- The attribute __const__ was added in gcc 2.95. */
-#ifndef _GL_ATTRIBUTE_CONST
-# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) || defined __clang__
-# define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
-# else
-# define _GL_ATTRIBUTE_CONST /* empty */
-# endif
-#endif
-
-/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
-
-/* The definition of _GL_ARG_NONNULL is copied here. */
-
-/* The definition of _GL_WARN_ON_USE is copied here. */
-
-#ifdef __cplusplus
-/* Helper macros to define type-generic function FUNC as overloaded functions,
- rather than as macros like in C. POSIX declares these with an argument of
- real-floating (that is, one of float, double, or long double). */
-# define _GL_MATH_CXX_REAL_FLOATING_DECL_1(func) \
-static inline int \
-_gl_cxx_ ## func ## f (float f) \
-{ \
- return func (f); \
-} \
-static inline int \
-_gl_cxx_ ## func ## d (double d) \
-{ \
- return func (d); \
-} \
-static inline int \
-_gl_cxx_ ## func ## l (long double l) \
-{ \
- return func (l); \
-}
-# define _GL_MATH_CXX_REAL_FLOATING_DECL_2(func,rpl_func,rettype) \
-_GL_BEGIN_NAMESPACE \
-inline rettype \
-rpl_func (float f) \
-{ \
- return _gl_cxx_ ## func ## f (f); \
-} \
-inline rettype \
-rpl_func (double d) \
-{ \
- return _gl_cxx_ ## func ## d (d); \
-} \
-inline rettype \
-rpl_func (long double l) \
-{ \
- return _gl_cxx_ ## func ## l (l); \
-} \
-_GL_END_NAMESPACE
-#endif
-
-/* Helper macros to define a portability warning for the
- classification macro FUNC called with VALUE. POSIX declares the
- classification macros with an argument of real-floating (that is,
- one of float, double, or long double). */
-#define _GL_WARN_REAL_FLOATING_DECL(func) \
-_GL_MATH_INLINE int \
-_GL_WARN_ON_USE_ATTRIBUTE (#func " is unportable - " \
- "use gnulib module " #func " for portability") \
-rpl_ ## func ## f (float f) \
-{ \
- return func (f); \
-} \
-_GL_MATH_INLINE int \
-_GL_WARN_ON_USE_ATTRIBUTE (#func " is unportable - " \
- "use gnulib module " #func " for portability") \
-rpl_ ## func ## d (double d) \
-{ \
- return func (d); \
-} \
-_GL_MATH_INLINE int \
-_GL_WARN_ON_USE_ATTRIBUTE (#func " is unportable - " \
- "use gnulib module " #func " for portability") \
-rpl_ ## func ## l (long double l) \
-{ \
- return func (l); \
-}
-#define _GL_WARN_REAL_FLOATING_IMPL(func, value) \
- (sizeof (value) == sizeof (float) ? rpl_ ## func ## f (value) \
- : sizeof (value) == sizeof (double) ? rpl_ ## func ## d (value) \
- : rpl_ ## func ## l (value))
-
-
-#if @REPLACE_ITOLD@
-/* Pull in a function that fixes the 'int' to 'long double' conversion
- of glibc 2.7. */
-_GL_EXTERN_C void _Qp_itoq (long double *, int);
-static void (*_gl_math_fix_itold) (long double *, int) = _Qp_itoq;
-#endif
-
-
-/* POSIX allows platforms that don't support NAN. But all major
- machines in the past 15 years have supported something close to
- IEEE NaN, so we define this unconditionally. We also must define
- it on platforms like Solaris 10, where NAN is present but defined
- as a function pointer rather than a floating point constant. */
-#if !defined NAN || @REPLACE_NAN@
-# if !GNULIB_defined_NAN
-# undef NAN
- /* The Compaq (ex-DEC) C 6.4 compiler and the Microsoft MSVC 9 compiler
- choke on the expression 0.0 / 0.0. */
-# if defined __DECC || defined _MSC_VER
-_GL_MATH_INLINE float
-_NaN ()
-{
- static float zero = 0.0f;
- return zero / zero;
-}
-# define NAN (_NaN())
-# else
-# define NAN (0.0f / 0.0f)
-# endif
-# define GNULIB_defined_NAN 1
-# endif
-#endif
-
-/* Solaris 10 defines HUGE_VAL, but as a function pointer rather
- than a floating point constant. */
-#if @REPLACE_HUGE_VAL@
-# undef HUGE_VALF
-# define HUGE_VALF (1.0f / 0.0f)
-# undef HUGE_VAL
-# define HUGE_VAL (1.0 / 0.0)
-# undef HUGE_VALL
-# define HUGE_VALL (1.0L / 0.0L)
-#endif
-
-/* HUGE_VALF is a 'float' Infinity. */
-#ifndef HUGE_VALF
-# if defined _MSC_VER
-/* The Microsoft MSVC 9 compiler chokes on the expression 1.0f / 0.0f. */
-# define HUGE_VALF (1e25f * 1e25f)
-# else
-# define HUGE_VALF (1.0f / 0.0f)
-# endif
-#endif
-
-/* HUGE_VAL is a 'double' Infinity. */
-#ifndef HUGE_VAL
-# if defined _MSC_VER
-/* The Microsoft MSVC 9 compiler chokes on the expression 1.0 / 0.0. */
-# define HUGE_VAL (1e250 * 1e250)
-# else
-# define HUGE_VAL (1.0 / 0.0)
-# endif
-#endif
-
-/* HUGE_VALL is a 'long double' Infinity. */
-#ifndef HUGE_VALL
-# if defined _MSC_VER
-/* The Microsoft MSVC 9 compiler chokes on the expression 1.0L / 0.0L. */
-# define HUGE_VALL (1e250L * 1e250L)
-# else
-# define HUGE_VALL (1.0L / 0.0L)
-# endif
-#endif
-
-
-#if defined FP_ILOGB0 && defined FP_ILOGBNAN
- /* Ensure FP_ILOGB0 and FP_ILOGBNAN are correct. */
-# if defined __HAIKU__
- /* Haiku: match what ilogb() does */
-# undef FP_ILOGB0
-# undef FP_ILOGBNAN
-# define FP_ILOGB0 (- 2147483647 - 1) /* INT_MIN */
-# define FP_ILOGBNAN (- 2147483647 - 1) /* INT_MIN */
-# endif
-#else
- /* Ensure FP_ILOGB0 and FP_ILOGBNAN are defined. */
-# if defined __NetBSD__ || defined __sgi
- /* NetBSD, IRIX 6.5: match what ilogb() does */
-# define FP_ILOGB0 (- 2147483647 - 1) /* INT_MIN */
-# define FP_ILOGBNAN (- 2147483647 - 1) /* INT_MIN */
-# elif defined _AIX
- /* AIX 5.1: match what ilogb() does in AIX >= 5.2 */
-# define FP_ILOGB0 (- 2147483647 - 1) /* INT_MIN */
-# define FP_ILOGBNAN 2147483647 /* INT_MAX */
-# elif defined __sun
- /* Solaris 9: match what ilogb() does */
-# define FP_ILOGB0 (- 2147483647) /* - INT_MAX */
-# define FP_ILOGBNAN 2147483647 /* INT_MAX */
-# else
- /* Gnulib defined values. */
-# define FP_ILOGB0 (- 2147483647) /* - INT_MAX */
-# define FP_ILOGBNAN (- 2147483647 - 1) /* INT_MIN */
-# endif
-#endif
-
-
-#if @GNULIB_ACOSF@
-# if @REPLACE_ACOSF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef acosf
-# define acosf rpl_acosf
-# endif
-_GL_FUNCDECL_RPL (acosf, float, (float x));
-_GL_CXXALIAS_RPL (acosf, float, (float x));
-# else
-# if !@HAVE_ACOSF@
-# undef acosf
-_GL_FUNCDECL_SYS (acosf, float, (float x));
-# endif
-_GL_CXXALIAS_SYS (acosf, float, (float x));
-# endif
-_GL_CXXALIASWARN (acosf);
-#elif defined GNULIB_POSIXCHECK
-# undef acosf
-# if HAVE_RAW_DECL_ACOSF
-_GL_WARN_ON_USE (acosf, "acosf is unportable - "
- "use gnulib module acosf for portability");
-# endif
-#endif
-
-#if @GNULIB_ACOSL@
-# if !@HAVE_ACOSL@ || !@HAVE_DECL_ACOSL@
-# undef acosl
-_GL_FUNCDECL_SYS (acosl, long double, (long double x));
-# endif
-_GL_CXXALIAS_SYS (acosl, long double, (long double x));
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (acosl);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef acosl
-# if HAVE_RAW_DECL_ACOSL
-_GL_WARN_ON_USE (acosl, "acosl is unportable - "
- "use gnulib module acosl for portability");
-# endif
-#endif
-
-
-#if @GNULIB_ASINF@
-# if @REPLACE_ASINF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef asinf
-# define asinf rpl_asinf
-# endif
-_GL_FUNCDECL_RPL (asinf, float, (float x));
-_GL_CXXALIAS_RPL (asinf, float, (float x));
-# else
-# if !@HAVE_ASINF@
-# undef asinf
-_GL_FUNCDECL_SYS (asinf, float, (float x));
-# endif
-_GL_CXXALIAS_SYS (asinf, float, (float x));
-# endif
-_GL_CXXALIASWARN (asinf);
-#elif defined GNULIB_POSIXCHECK
-# undef asinf
-# if HAVE_RAW_DECL_ASINF
-_GL_WARN_ON_USE (asinf, "asinf is unportable - "
- "use gnulib module asinf for portability");
-# endif
-#endif
-
-#if @GNULIB_ASINL@
-# if !@HAVE_ASINL@ || !@HAVE_DECL_ASINL@
-# undef asinl
-_GL_FUNCDECL_SYS (asinl, long double, (long double x));
-# endif
-_GL_CXXALIAS_SYS (asinl, long double, (long double x));
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (asinl);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef asinl
-# if HAVE_RAW_DECL_ASINL
-_GL_WARN_ON_USE (asinl, "asinl is unportable - "
- "use gnulib module asinl for portability");
-# endif
-#endif
-
-
-#if @GNULIB_ATANF@
-# if @REPLACE_ATANF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef atanf
-# define atanf rpl_atanf
-# endif
-_GL_FUNCDECL_RPL (atanf, float, (float x));
-_GL_CXXALIAS_RPL (atanf, float, (float x));
-# else
-# if !@HAVE_ATANF@
-# undef atanf
-_GL_FUNCDECL_SYS (atanf, float, (float x));
-# endif
-_GL_CXXALIAS_SYS (atanf, float, (float x));
-# endif
-_GL_CXXALIASWARN (atanf);
-#elif defined GNULIB_POSIXCHECK
-# undef atanf
-# if HAVE_RAW_DECL_ATANF
-_GL_WARN_ON_USE (atanf, "atanf is unportable - "
- "use gnulib module atanf for portability");
-# endif
-#endif
-
-#if @GNULIB_ATANL@
-# if !@HAVE_ATANL@ || !@HAVE_DECL_ATANL@
-# undef atanl
-_GL_FUNCDECL_SYS (atanl, long double, (long double x));
-# endif
-_GL_CXXALIAS_SYS (atanl, long double, (long double x));
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (atanl);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef atanl
-# if HAVE_RAW_DECL_ATANL
-_GL_WARN_ON_USE (atanl, "atanl is unportable - "
- "use gnulib module atanl for portability");
-# endif
-#endif
-
-
-#if @GNULIB_ATAN2F@
-# if @REPLACE_ATAN2F@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef atan2f
-# define atan2f rpl_atan2f
-# endif
-_GL_FUNCDECL_RPL (atan2f, float, (float y, float x));
-_GL_CXXALIAS_RPL (atan2f, float, (float y, float x));
-# else
-# if !@HAVE_ATAN2F@
-# undef atan2f
-_GL_FUNCDECL_SYS (atan2f, float, (float y, float x));
-# endif
-_GL_CXXALIAS_SYS (atan2f, float, (float y, float x));
-# endif
-_GL_CXXALIASWARN (atan2f);
-#elif defined GNULIB_POSIXCHECK
-# undef atan2f
-# if HAVE_RAW_DECL_ATAN2F
-_GL_WARN_ON_USE (atan2f, "atan2f is unportable - "
- "use gnulib module atan2f for portability");
-# endif
-#endif
-
-
-#if @GNULIB_CBRTF@
-# if @REPLACE_CBRTF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef cbrtf
-# define cbrtf rpl_cbrtf
-# endif
-_GL_FUNCDECL_RPL (cbrtf, float, (float x));
-_GL_CXXALIAS_RPL (cbrtf, float, (float x));
-# else
-# if !@HAVE_DECL_CBRTF@
-_GL_FUNCDECL_SYS (cbrtf, float, (float x));
-# endif
-_GL_CXXALIAS_SYS (cbrtf, float, (float x));
-# endif
-_GL_CXXALIASWARN (cbrtf);
-#elif defined GNULIB_POSIXCHECK
-# undef cbrtf
-# if HAVE_RAW_DECL_CBRTF
-_GL_WARN_ON_USE (cbrtf, "cbrtf is unportable - "
- "use gnulib module cbrtf for portability");
-# endif
-#endif
-
-#if @GNULIB_CBRT@
-# if !@HAVE_CBRT@
-_GL_FUNCDECL_SYS (cbrt, double, (double x));
-# endif
-_GL_CXXALIAS_SYS (cbrt, double, (double x));
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN1 (cbrt, double, (double x));
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef cbrt
-# if HAVE_RAW_DECL_CBRT
-_GL_WARN_ON_USE (cbrt, "cbrt is unportable - "
- "use gnulib module cbrt for portability");
-# endif
-#endif
-
-#if @GNULIB_CBRTL@
-# if @REPLACE_CBRTL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef cbrtl
-# define cbrtl rpl_cbrtl
-# endif
-_GL_FUNCDECL_RPL (cbrtl, long double, (long double x));
-_GL_CXXALIAS_RPL (cbrtl, long double, (long double x));
-# else
-# if !@HAVE_DECL_CBRTL@
-_GL_FUNCDECL_SYS (cbrtl, long double, (long double x));
-# endif
-_GL_CXXALIAS_SYS (cbrtl, long double, (long double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (cbrtl);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef cbrtl
-# if HAVE_RAW_DECL_CBRTL
-_GL_WARN_ON_USE (cbrtl, "cbrtl is unportable - "
- "use gnulib module cbrtl for portability");
-# endif
-#endif
-
-
-#if @GNULIB_CEILF@
-# if @REPLACE_CEILF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef ceilf
-# define ceilf rpl_ceilf
-# endif
-_GL_FUNCDECL_RPL (ceilf, float, (float x));
-_GL_CXXALIAS_RPL (ceilf, float, (float x));
-# else
-# if !@HAVE_DECL_CEILF@
-# undef ceilf
-_GL_FUNCDECL_SYS (ceilf, float, (float x));
-# endif
-_GL_CXXALIAS_SYS (ceilf, float, (float x));
-# endif
-_GL_CXXALIASWARN (ceilf);
-#elif defined GNULIB_POSIXCHECK
-# undef ceilf
-# if HAVE_RAW_DECL_CEILF
-_GL_WARN_ON_USE (ceilf, "ceilf is unportable - "
- "use gnulib module ceilf for portability");
-# endif
-#endif
-
-#if @GNULIB_CEIL@
-# if @REPLACE_CEIL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef ceil
-# define ceil rpl_ceil
-# endif
-_GL_FUNCDECL_RPL (ceil, double, (double x));
-_GL_CXXALIAS_RPL (ceil, double, (double x));
-# else
-_GL_CXXALIAS_SYS (ceil, double, (double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN1 (ceil, double, (double x));
-# endif
-#endif
-
-#if @GNULIB_CEILL@
-# if @REPLACE_CEILL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef ceill
-# define ceill rpl_ceill
-# endif
-_GL_FUNCDECL_RPL (ceill, long double, (long double x));
-_GL_CXXALIAS_RPL (ceill, long double, (long double x));
-# else
-# if !@HAVE_DECL_CEILL@
-# undef ceill
-_GL_FUNCDECL_SYS (ceill, long double, (long double x));
-# endif
-_GL_CXXALIAS_SYS (ceill, long double, (long double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (ceill);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef ceill
-# if HAVE_RAW_DECL_CEILL
-_GL_WARN_ON_USE (ceill, "ceill is unportable - "
- "use gnulib module ceill for portability");
-# endif
-#endif
-
-
-#if @GNULIB_COPYSIGNF@
-# if !@HAVE_DECL_COPYSIGNF@
-# undef copysignf
-_GL_FUNCDECL_SYS (copysignf, float, (float x, float y));
-# endif
-_GL_CXXALIAS_SYS (copysignf, float, (float x, float y));
-_GL_CXXALIASWARN (copysignf);
-#elif defined GNULIB_POSIXCHECK
-# undef copysignf
-# if HAVE_RAW_DECL_COPYSIGNF
-_GL_WARN_ON_USE (copysignf, "copysignf is unportable - "
- "use gnulib module copysignf for portability");
-# endif
-#endif
-
-#if @GNULIB_COPYSIGN@
-# if !@HAVE_COPYSIGN@
-_GL_FUNCDECL_SYS (copysign, double, (double x, double y));
-# endif
-_GL_CXXALIAS_SYS (copysign, double, (double x, double y));
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN1 (copysign, double, (double x, double y));
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef copysign
-# if HAVE_RAW_DECL_COPYSIGN
-_GL_WARN_ON_USE (copysign, "copysign is unportable - "
- "use gnulib module copysign for portability");
-# endif
-#endif
-
-#if @GNULIB_COPYSIGNL@
-# if !@HAVE_COPYSIGNL@
-_GL_FUNCDECL_SYS (copysignl, long double, (long double x, long double y));
-# endif
-_GL_CXXALIAS_SYS (copysignl, long double, (long double x, long double y));
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (copysignl);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef copysignl
-# if HAVE_RAW_DECL_COPYSIGNL
-_GL_WARN_ON_USE (copysign, "copysignl is unportable - "
- "use gnulib module copysignl for portability");
-# endif
-#endif
-
-
-#if @GNULIB_COSF@
-# if @REPLACE_COSF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef cosf
-# define cosf rpl_cosf
-# endif
-_GL_FUNCDECL_RPL (cosf, float, (float x));
-_GL_CXXALIAS_RPL (cosf, float, (float x));
-# else
-# if !@HAVE_COSF@
-# undef cosf
-_GL_FUNCDECL_SYS (cosf, float, (float x));
-# endif
-_GL_CXXALIAS_SYS (cosf, float, (float x));
-# endif
-_GL_CXXALIASWARN (cosf);
-#elif defined GNULIB_POSIXCHECK
-# undef cosf
-# if HAVE_RAW_DECL_COSF
-_GL_WARN_ON_USE (cosf, "cosf is unportable - "
- "use gnulib module cosf for portability");
-# endif
-#endif
-
-#if @GNULIB_COSL@
-# if !@HAVE_COSL@ || !@HAVE_DECL_COSL@
-# undef cosl
-_GL_FUNCDECL_SYS (cosl, long double, (long double x));
-# endif
-_GL_CXXALIAS_SYS (cosl, long double, (long double x));
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (cosl);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef cosl
-# if HAVE_RAW_DECL_COSL
-_GL_WARN_ON_USE (cosl, "cosl is unportable - "
- "use gnulib module cosl for portability");
-# endif
-#endif
-
-
-#if @GNULIB_COSHF@
-# if @REPLACE_COSHF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef coshf
-# define coshf rpl_coshf
-# endif
-_GL_FUNCDECL_RPL (coshf, float, (float x));
-_GL_CXXALIAS_RPL (coshf, float, (float x));
-# else
-# if !@HAVE_COSHF@
-# undef coshf
-_GL_FUNCDECL_SYS (coshf, float, (float x));
-# endif
-_GL_CXXALIAS_SYS (coshf, float, (float x));
-# endif
-_GL_CXXALIASWARN (coshf);
-#elif defined GNULIB_POSIXCHECK
-# undef coshf
-# if HAVE_RAW_DECL_COSHF
-_GL_WARN_ON_USE (coshf, "coshf is unportable - "
- "use gnulib module coshf for portability");
-# endif
-#endif
-
-
-#if @GNULIB_EXPF@
-# if @REPLACE_EXPF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef expf
-# define expf rpl_expf
-# endif
-_GL_FUNCDECL_RPL (expf, float, (float x));
-_GL_CXXALIAS_RPL (expf, float, (float x));
-# else
-# if !@HAVE_EXPF@
-# undef expf
-_GL_FUNCDECL_SYS (expf, float, (float x));
-# endif
-_GL_CXXALIAS_SYS (expf, float, (float x));
-# endif
-_GL_CXXALIASWARN (expf);
-#elif defined GNULIB_POSIXCHECK
-# undef expf
-# if HAVE_RAW_DECL_EXPF
-_GL_WARN_ON_USE (expf, "expf is unportable - "
- "use gnulib module expf for portability");
-# endif
-#endif
-
-#if @GNULIB_EXPL@
-# if @REPLACE_EXPL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef expl
-# define expl rpl_expl
-# endif
-_GL_FUNCDECL_RPL (expl, long double, (long double x));
-_GL_CXXALIAS_RPL (expl, long double, (long double x));
-# else
-# if !@HAVE_EXPL@ || !@HAVE_DECL_EXPL@
-# undef expl
-_GL_FUNCDECL_SYS (expl, long double, (long double x));
-# endif
-_GL_CXXALIAS_SYS (expl, long double, (long double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (expl);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef expl
-# if HAVE_RAW_DECL_EXPL
-_GL_WARN_ON_USE (expl, "expl is unportable - "
- "use gnulib module expl for portability");
-# endif
-#endif
-
-
-#if @GNULIB_EXP2F@
-# if !@HAVE_DECL_EXP2F@
-_GL_FUNCDECL_SYS (exp2f, float, (float x));
-# endif
-_GL_CXXALIAS_SYS (exp2f, float, (float x));
-_GL_CXXALIASWARN (exp2f);
-#elif defined GNULIB_POSIXCHECK
-# undef exp2f
-# if HAVE_RAW_DECL_EXP2F
-_GL_WARN_ON_USE (exp2f, "exp2f is unportable - "
- "use gnulib module exp2f for portability");
-# endif
-#endif
-
-#if @GNULIB_EXP2@
-# if @REPLACE_EXP2@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef exp2
-# define exp2 rpl_exp2
-# endif
-_GL_FUNCDECL_RPL (exp2, double, (double x));
-_GL_CXXALIAS_RPL (exp2, double, (double x));
-# else
-# if !@HAVE_DECL_EXP2@
-_GL_FUNCDECL_SYS (exp2, double, (double x));
-# endif
-_GL_CXXALIAS_SYS (exp2, double, (double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN1 (exp2, double, (double x));
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef exp2
-# if HAVE_RAW_DECL_EXP2
-_GL_WARN_ON_USE (exp2, "exp2 is unportable - "
- "use gnulib module exp2 for portability");
-# endif
-#endif
-
-#if @GNULIB_EXP2L@
-# if @REPLACE_EXP2L@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef exp2l
-# define exp2l rpl_exp2l
-# endif
-_GL_FUNCDECL_RPL (exp2l, long double, (long double x));
-_GL_CXXALIAS_RPL (exp2l, long double, (long double x));
-# else
-# if !@HAVE_DECL_EXP2L@
-# undef exp2l
-_GL_FUNCDECL_SYS (exp2l, long double, (long double x));
-# endif
-_GL_CXXALIAS_SYS (exp2l, long double, (long double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (exp2l);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef exp2l
-# if HAVE_RAW_DECL_EXP2L
-_GL_WARN_ON_USE (exp2l, "exp2l is unportable - "
- "use gnulib module exp2l for portability");
-# endif
-#endif
-
-
-#if @GNULIB_EXPM1F@
-# if @REPLACE_EXPM1F@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef expm1f
-# define expm1f rpl_expm1f
-# endif
-_GL_FUNCDECL_RPL (expm1f, float, (float x));
-_GL_CXXALIAS_RPL (expm1f, float, (float x));
-# else
-# if !@HAVE_EXPM1F@
-_GL_FUNCDECL_SYS (expm1f, float, (float x));
-# endif
-_GL_CXXALIAS_SYS (expm1f, float, (float x));
-# endif
-_GL_CXXALIASWARN (expm1f);
-#elif defined GNULIB_POSIXCHECK
-# undef expm1f
-# if HAVE_RAW_DECL_EXPM1F
-_GL_WARN_ON_USE (expm1f, "expm1f is unportable - "
- "use gnulib module expm1f for portability");
-# endif
-#endif
-
-#if @GNULIB_EXPM1@
-# if @REPLACE_EXPM1@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef expm1
-# define expm1 rpl_expm1
-# endif
-_GL_FUNCDECL_RPL (expm1, double, (double x));
-_GL_CXXALIAS_RPL (expm1, double, (double x));
-# else
-# if !@HAVE_EXPM1@
-_GL_FUNCDECL_SYS (expm1, double, (double x));
-# endif
-_GL_CXXALIAS_SYS (expm1, double, (double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN1 (expm1, double, (double x));
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef expm1
-# if HAVE_RAW_DECL_EXPM1
-_GL_WARN_ON_USE (expm1, "expm1 is unportable - "
- "use gnulib module expm1 for portability");
-# endif
-#endif
-
-#if @GNULIB_EXPM1L@
-# if @REPLACE_EXPM1L@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef expm1l
-# define expm1l rpl_expm1l
-# endif
-_GL_FUNCDECL_RPL (expm1l, long double, (long double x));
-_GL_CXXALIAS_RPL (expm1l, long double, (long double x));
-# else
-# if !@HAVE_DECL_EXPM1L@
-# undef expm1l
-# if !(defined __cplusplus && defined _AIX)
-_GL_FUNCDECL_SYS (expm1l, long double, (long double x));
-# endif
-# endif
-_GL_CXXALIAS_SYS (expm1l, long double, (long double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (expm1l);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef expm1l
-# if HAVE_RAW_DECL_EXPM1L
-_GL_WARN_ON_USE (expm1l, "expm1l is unportable - "
- "use gnulib module expm1l for portability");
-# endif
-#endif
-
-
-#if @GNULIB_FABSF@
-# if !@HAVE_FABSF@
-# undef fabsf
-_GL_FUNCDECL_SYS (fabsf, float, (float x));
-# endif
-_GL_CXXALIAS_SYS (fabsf, float, (float x));
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (fabsf);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef fabsf
-# if HAVE_RAW_DECL_FABSF
-_GL_WARN_ON_USE (fabsf, "fabsf is unportable - "
- "use gnulib module fabsf for portability");
-# endif
-#endif
-
-#if @GNULIB_FABSL@
-# if @REPLACE_FABSL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fabsl
-# define fabsl rpl_fabsl
-# endif
-_GL_FUNCDECL_RPL (fabsl, long double, (long double x));
-_GL_CXXALIAS_RPL (fabsl, long double, (long double x));
-# else
-# if !@HAVE_FABSL@
-# undef fabsl
-_GL_FUNCDECL_SYS (fabsl, long double, (long double x));
-# endif
-_GL_CXXALIAS_SYS (fabsl, long double, (long double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (fabsl);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef fabsl
-# if HAVE_RAW_DECL_FABSL
-_GL_WARN_ON_USE (fabsl, "fabsl is unportable - "
- "use gnulib module fabsl for portability");
-# endif
-#endif
-
-
-#if @GNULIB_FLOORF@
-# if @REPLACE_FLOORF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef floorf
-# define floorf rpl_floorf
-# endif
-_GL_FUNCDECL_RPL (floorf, float, (float x));
-_GL_CXXALIAS_RPL (floorf, float, (float x));
-# else
-# if !@HAVE_DECL_FLOORF@
-# undef floorf
-_GL_FUNCDECL_SYS (floorf, float, (float x));
-# endif
-_GL_CXXALIAS_SYS (floorf, float, (float x));
-# endif
-_GL_CXXALIASWARN (floorf);
-#elif defined GNULIB_POSIXCHECK
-# undef floorf
-# if HAVE_RAW_DECL_FLOORF
-_GL_WARN_ON_USE (floorf, "floorf is unportable - "
- "use gnulib module floorf for portability");
-# endif
-#endif
-
-#if @GNULIB_FLOOR@
-# if @REPLACE_FLOOR@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef floor
-# define floor rpl_floor
-# endif
-_GL_FUNCDECL_RPL (floor, double, (double x));
-_GL_CXXALIAS_RPL (floor, double, (double x));
-# else
-_GL_CXXALIAS_SYS (floor, double, (double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN1 (floor, double, (double x));
-# endif
-#endif
-
-#if @GNULIB_FLOORL@
-# if @REPLACE_FLOORL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef floorl
-# define floorl rpl_floorl
-# endif
-_GL_FUNCDECL_RPL (floorl, long double, (long double x));
-_GL_CXXALIAS_RPL (floorl, long double, (long double x));
-# else
-# if !@HAVE_DECL_FLOORL@
-# undef floorl
-_GL_FUNCDECL_SYS (floorl, long double, (long double x));
-# endif
-_GL_CXXALIAS_SYS (floorl, long double, (long double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (floorl);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef floorl
-# if HAVE_RAW_DECL_FLOORL
-_GL_WARN_ON_USE (floorl, "floorl is unportable - "
- "use gnulib module floorl for portability");
-# endif
-#endif
-
-
-#if @GNULIB_FMAF@
-# if @REPLACE_FMAF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fmaf
-# define fmaf rpl_fmaf
-# endif
-_GL_FUNCDECL_RPL (fmaf, float, (float x, float y, float z));
-_GL_CXXALIAS_RPL (fmaf, float, (float x, float y, float z));
-# else
-# if !@HAVE_FMAF@
-# undef fmaf
-_GL_FUNCDECL_SYS (fmaf, float, (float x, float y, float z));
-# endif
-_GL_CXXALIAS_SYS (fmaf, float, (float x, float y, float z));
-# endif
-_GL_CXXALIASWARN (fmaf);
-#elif defined GNULIB_POSIXCHECK
-# undef fmaf
-# if HAVE_RAW_DECL_FMAF
-_GL_WARN_ON_USE (fmaf, "fmaf is unportable - "
- "use gnulib module fmaf for portability");
-# endif
-#endif
-
-#if @GNULIB_FMA@
-# if @REPLACE_FMA@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fma
-# define fma rpl_fma
-# endif
-_GL_FUNCDECL_RPL (fma, double, (double x, double y, double z));
-_GL_CXXALIAS_RPL (fma, double, (double x, double y, double z));
-# else
-# if !@HAVE_FMA@
-# undef fma
-_GL_FUNCDECL_SYS (fma, double, (double x, double y, double z));
-# endif
-_GL_CXXALIAS_SYS (fma, double, (double x, double y, double z));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN1 (fma, double, (double x, double y, double z));
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef fma
-# if HAVE_RAW_DECL_FMA
-_GL_WARN_ON_USE (fma, "fma is unportable - "
- "use gnulib module fma for portability");
-# endif
-#endif
-
-#if @GNULIB_FMAL@
-# if @REPLACE_FMAL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fmal
-# define fmal rpl_fmal
-# endif
-_GL_FUNCDECL_RPL (fmal, long double,
- (long double x, long double y, long double z));
-_GL_CXXALIAS_RPL (fmal, long double,
- (long double x, long double y, long double z));
-# else
-# if !@HAVE_FMAL@
-# undef fmal
-# if !(defined __cplusplus && defined _AIX)
-_GL_FUNCDECL_SYS (fmal, long double,
- (long double x, long double y, long double z));
-# endif
-# endif
-_GL_CXXALIAS_SYS (fmal, long double,
- (long double x, long double y, long double z));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (fmal);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef fmal
-# if HAVE_RAW_DECL_FMAL
-_GL_WARN_ON_USE (fmal, "fmal is unportable - "
- "use gnulib module fmal for portability");
-# endif
-#endif
-
-
-#if @GNULIB_FMODF@
-# if @REPLACE_FMODF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fmodf
-# define fmodf rpl_fmodf
-# endif
-_GL_FUNCDECL_RPL (fmodf, float, (float x, float y));
-_GL_CXXALIAS_RPL (fmodf, float, (float x, float y));
-# else
-# if !@HAVE_FMODF@
-# undef fmodf
-_GL_FUNCDECL_SYS (fmodf, float, (float x, float y));
-# endif
-_GL_CXXALIAS_SYS (fmodf, float, (float x, float y));
-# endif
-_GL_CXXALIASWARN (fmodf);
-#elif defined GNULIB_POSIXCHECK
-# undef fmodf
-# if HAVE_RAW_DECL_FMODF
-_GL_WARN_ON_USE (fmodf, "fmodf is unportable - "
- "use gnulib module fmodf for portability");
-# endif
-#endif
-
-#if @GNULIB_FMOD@
-# if @REPLACE_FMOD@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fmod
-# define fmod rpl_fmod
-# endif
-_GL_FUNCDECL_RPL (fmod, double, (double x, double y));
-_GL_CXXALIAS_RPL (fmod, double, (double x, double y));
-# else
-_GL_CXXALIAS_SYS (fmod, double, (double x, double y));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN1 (fmod, double, (double x, double y));
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef fmod
-# if HAVE_RAW_DECL_FMOD
-_GL_WARN_ON_USE (fmod, "fmod has portability problems - "
- "use gnulib module fmod for portability");
-# endif
-#endif
-
-#if @GNULIB_FMODL@
-# if @REPLACE_FMODL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fmodl
-# define fmodl rpl_fmodl
-# endif
-_GL_FUNCDECL_RPL (fmodl, long double, (long double x, long double y));
-_GL_CXXALIAS_RPL (fmodl, long double, (long double x, long double y));
-# else
-# if !@HAVE_FMODL@
-# undef fmodl
-_GL_FUNCDECL_SYS (fmodl, long double, (long double x, long double y));
-# endif
-_GL_CXXALIAS_SYS (fmodl, long double, (long double x, long double y));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (fmodl);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef fmodl
-# if HAVE_RAW_DECL_FMODL
-_GL_WARN_ON_USE (fmodl, "fmodl is unportable - "
- "use gnulib module fmodl for portability");
-# endif
-#endif
-
-
-/* Write x as
- x = mantissa * 2^exp
- where
- If x finite and nonzero: 0.5 <= |mantissa| < 1.0.
- If x is zero: mantissa = x, exp = 0.
- If x is infinite or NaN: mantissa = x, exp unspecified.
- Store exp in *EXPPTR and return mantissa. */
-#if @GNULIB_FREXPF@
-# if @REPLACE_FREXPF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef frexpf
-# define frexpf rpl_frexpf
-# endif
-_GL_FUNCDECL_RPL (frexpf, float, (float x, int *expptr) _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (frexpf, float, (float x, int *expptr));
-# else
-# if !@HAVE_FREXPF@
-# undef frexpf
-_GL_FUNCDECL_SYS (frexpf, float, (float x, int *expptr) _GL_ARG_NONNULL ((2)));
-# endif
-_GL_CXXALIAS_SYS (frexpf, float, (float x, int *expptr));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (frexpf);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef frexpf
-# if HAVE_RAW_DECL_FREXPF
-_GL_WARN_ON_USE (frexpf, "frexpf is unportable - "
- "use gnulib module frexpf for portability");
-# endif
-#endif
-
-/* Write x as
- x = mantissa * 2^exp
- where
- If x finite and nonzero: 0.5 <= |mantissa| < 1.0.
- If x is zero: mantissa = x, exp = 0.
- If x is infinite or NaN: mantissa = x, exp unspecified.
- Store exp in *EXPPTR and return mantissa. */
-#if @GNULIB_FREXP@
-# if @REPLACE_FREXP@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef frexp
-# define frexp rpl_frexp
-# endif
-_GL_FUNCDECL_RPL (frexp, double, (double x, int *expptr) _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (frexp, double, (double x, int *expptr));
-# else
-_GL_CXXALIAS_SYS (frexp, double, (double x, int *expptr));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN1 (frexp, double, (double x, int *expptr));
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef frexp
-/* Assume frexp is always declared. */
-_GL_WARN_ON_USE (frexp, "frexp is unportable - "
- "use gnulib module frexp for portability");
-#endif
-
-/* Write x as
- x = mantissa * 2^exp
- where
- If x finite and nonzero: 0.5 <= |mantissa| < 1.0.
- If x is zero: mantissa = x, exp = 0.
- If x is infinite or NaN: mantissa = x, exp unspecified.
- Store exp in *EXPPTR and return mantissa. */
-#if @GNULIB_FREXPL@ && @REPLACE_FREXPL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef frexpl
-# define frexpl rpl_frexpl
-# endif
-_GL_FUNCDECL_RPL (frexpl, long double,
- (long double x, int *expptr) _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (frexpl, long double, (long double x, int *expptr));
-#else
-# if !@HAVE_DECL_FREXPL@
-_GL_FUNCDECL_SYS (frexpl, long double,
- (long double x, int *expptr) _GL_ARG_NONNULL ((2)));
-# endif
-# if @GNULIB_FREXPL@
-_GL_CXXALIAS_SYS (frexpl, long double, (long double x, int *expptr));
-# endif
-#endif
-#if @GNULIB_FREXPL@ && !(@REPLACE_FREXPL@ && !@HAVE_DECL_FREXPL@)
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (frexpl);
-# endif
-#endif
-#if !@GNULIB_FREXPL@ && defined GNULIB_POSIXCHECK
-# undef frexpl
-# if HAVE_RAW_DECL_FREXPL
-_GL_WARN_ON_USE (frexpl, "frexpl is unportable - "
- "use gnulib module frexpl for portability");
-# endif
-#endif
-
-
-/* Return sqrt(x^2+y^2). */
-#if @GNULIB_HYPOTF@
-# if @REPLACE_HYPOTF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef hypotf
-# define hypotf rpl_hypotf
-# endif
-_GL_FUNCDECL_RPL (hypotf, float, (float x, float y));
-_GL_CXXALIAS_RPL (hypotf, float, (float x, float y));
-# else
-# if !@HAVE_HYPOTF@
-_GL_FUNCDECL_SYS (hypotf, float, (float x, float y));
-# endif
-_GL_CXXALIAS_SYS (hypotf, float, (float x, float y));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (hypotf);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef hypotf
-# if HAVE_RAW_DECL_HYPOTF
-_GL_WARN_ON_USE (hypotf, "hypotf is unportable - "
- "use gnulib module hypotf for portability");
-# endif
-#endif
-
-/* Return sqrt(x^2+y^2). */
-#if @GNULIB_HYPOT@
-# if @REPLACE_HYPOT@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef hypot
-# define hypot rpl_hypot
-# endif
-_GL_FUNCDECL_RPL (hypot, double, (double x, double y));
-_GL_CXXALIAS_RPL (hypot, double, (double x, double y));
-# else
-_GL_CXXALIAS_SYS (hypot, double, (double x, double y));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN1 (hypot, double, (double x, double y));
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef hypot
-# if HAVE_RAW_DECL_HYPOT
-_GL_WARN_ON_USE (hypotf, "hypot has portability problems - "
- "use gnulib module hypot for portability");
-# endif
-#endif
-
-/* Return sqrt(x^2+y^2). */
-#if @GNULIB_HYPOTL@
-# if @REPLACE_HYPOTL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef hypotl
-# define hypotl rpl_hypotl
-# endif
-_GL_FUNCDECL_RPL (hypotl, long double, (long double x, long double y));
-_GL_CXXALIAS_RPL (hypotl, long double, (long double x, long double y));
-# else
-# if !@HAVE_HYPOTL@
-_GL_FUNCDECL_SYS (hypotl, long double, (long double x, long double y));
-# endif
-_GL_CXXALIAS_SYS (hypotl, long double, (long double x, long double y));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (hypotl);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef hypotl
-# if HAVE_RAW_DECL_HYPOTL
-_GL_WARN_ON_USE (hypotl, "hypotl is unportable - "
- "use gnulib module hypotl for portability");
-# endif
-#endif
-
-
-#if @GNULIB_ILOGBF@
-# if @REPLACE_ILOGBF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef ilogbf
-# define ilogbf rpl_ilogbf
-# endif
-_GL_FUNCDECL_RPL (ilogbf, int, (float x));
-_GL_CXXALIAS_RPL (ilogbf, int, (float x));
-# else
-# if !@HAVE_ILOGBF@
-_GL_FUNCDECL_SYS (ilogbf, int, (float x));
-# endif
-_GL_CXXALIAS_SYS (ilogbf, int, (float x));
-# endif
-_GL_CXXALIASWARN (ilogbf);
-#elif defined GNULIB_POSIXCHECK
-# undef ilogbf
-# if HAVE_RAW_DECL_ILOGBF
-_GL_WARN_ON_USE (ilogbf, "ilogbf is unportable - "
- "use gnulib module ilogbf for portability");
-# endif
-#endif
-
-#if @GNULIB_ILOGB@
-# if @REPLACE_ILOGB@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef ilogb
-# define ilogb rpl_ilogb
-# endif
-_GL_FUNCDECL_RPL (ilogb, int, (double x));
-_GL_CXXALIAS_RPL (ilogb, int, (double x));
-# else
-# if !@HAVE_ILOGB@
-_GL_FUNCDECL_SYS (ilogb, int, (double x));
-# endif
-_GL_CXXALIAS_SYS (ilogb, int, (double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN1 (ilogb, int, (double x));
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef ilogb
-# if HAVE_RAW_DECL_ILOGB
-_GL_WARN_ON_USE (ilogb, "ilogb is unportable - "
- "use gnulib module ilogb for portability");
-# endif
-#endif
-
-#if @GNULIB_ILOGBL@
-# if @REPLACE_ILOGBL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef ilogbl
-# define ilogbl rpl_ilogbl
-# endif
-_GL_FUNCDECL_RPL (ilogbl, int, (long double x));
-_GL_CXXALIAS_RPL (ilogbl, int, (long double x));
-# else
-# if !@HAVE_ILOGBL@
-# undef ilogbl
-_GL_FUNCDECL_SYS (ilogbl, int, (long double x));
-# endif
-_GL_CXXALIAS_SYS (ilogbl, int, (long double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (ilogbl);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef ilogbl
-# if HAVE_RAW_DECL_ILOGBL
-_GL_WARN_ON_USE (ilogbl, "ilogbl is unportable - "
- "use gnulib module ilogbl for portability");
-# endif
-#endif
-
-
-#if @GNULIB_MDA_J0@
-/* On native Windows, map 'j0' to '_j0', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::j0 always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef j0
-# define j0 _j0
-# endif
-_GL_CXXALIAS_MDA (j0, double, (double x));
-# else
-_GL_CXXALIAS_SYS (j0, double, (double x));
-# endif
-_GL_CXXALIASWARN (j0);
-#endif
-
-#if @GNULIB_MDA_J1@
-/* On native Windows, map 'j1' to '_j1', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::j1 always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef j1
-# define j1 _j1
-# endif
-_GL_CXXALIAS_MDA (j1, double, (double x));
-# else
-_GL_CXXALIAS_SYS (j1, double, (double x));
-# endif
-_GL_CXXALIASWARN (j1);
-#endif
-
-#if @GNULIB_MDA_JN@
-/* On native Windows, map 'jn' to '_jn', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::jn always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef jn
-# define jn _jn
-# endif
-_GL_CXXALIAS_MDA (jn, double, (int n, double x));
-# else
-_GL_CXXALIAS_SYS (jn, double, (int n, double x));
-# endif
-_GL_CXXALIASWARN (jn);
-#endif
-
-
-/* Return x * 2^exp. */
-#if @GNULIB_LDEXPF@
-# if !@HAVE_LDEXPF@
-# undef ldexpf
-_GL_FUNCDECL_SYS (ldexpf, float, (float x, int exp));
-# endif
-_GL_CXXALIAS_SYS (ldexpf, float, (float x, int exp));
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (ldexpf);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef ldexpf
-# if HAVE_RAW_DECL_LDEXPF
-_GL_WARN_ON_USE (ldexpf, "ldexpf is unportable - "
- "use gnulib module ldexpf for portability");
-# endif
-#endif
-
-/* Return x * 2^exp. */
-#if @GNULIB_LDEXPL@ && @REPLACE_LDEXPL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef ldexpl
-# define ldexpl rpl_ldexpl
-# endif
-_GL_FUNCDECL_RPL (ldexpl, long double, (long double x, int exp));
-_GL_CXXALIAS_RPL (ldexpl, long double, (long double x, int exp));
-#else
-# if !@HAVE_DECL_LDEXPL@
-_GL_FUNCDECL_SYS (ldexpl, long double, (long double x, int exp));
-# endif
-# if @GNULIB_LDEXPL@
-_GL_CXXALIAS_SYS (ldexpl, long double, (long double x, int exp));
-# endif
-#endif
-#if @GNULIB_LDEXPL@
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (ldexpl);
-# endif
-#endif
-#if !@GNULIB_LDEXPL@ && defined GNULIB_POSIXCHECK
-# undef ldexpl
-# if HAVE_RAW_DECL_LDEXPL
-_GL_WARN_ON_USE (ldexpl, "ldexpl is unportable - "
- "use gnulib module ldexpl for portability");
-# endif
-#endif
-
-
-#if @GNULIB_LOGF@
-# if @REPLACE_LOGF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef logf
-# define logf rpl_logf
-# endif
-_GL_FUNCDECL_RPL (logf, float, (float x));
-_GL_CXXALIAS_RPL (logf, float, (float x));
-# else
-# if !@HAVE_LOGF@
-# undef logf
-_GL_FUNCDECL_SYS (logf, float, (float x));
-# endif
-_GL_CXXALIAS_SYS (logf, float, (float x));
-# endif
-_GL_CXXALIASWARN (logf);
-#elif defined GNULIB_POSIXCHECK
-# undef logf
-# if HAVE_RAW_DECL_LOGF
-_GL_WARN_ON_USE (logf, "logf is unportable - "
- "use gnulib module logf for portability");
-# endif
-#endif
-
-#if @GNULIB_LOG@
-# if @REPLACE_LOG@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef log
-# define log rpl_log
-# endif
-_GL_FUNCDECL_RPL (log, double, (double x));
-_GL_CXXALIAS_RPL (log, double, (double x));
-# else
-_GL_CXXALIAS_SYS (log, double, (double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN1 (log, double, (double x));
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef log
-# if HAVE_RAW_DECL_LOG
-_GL_WARN_ON_USE (log, "log has portability problems - "
- "use gnulib module log for portability");
-# endif
-#endif
-
-#if @GNULIB_LOGL@
-# if @REPLACE_LOGL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef logl
-# define logl rpl_logl
-# endif
-_GL_FUNCDECL_RPL (logl, long double, (long double x));
-_GL_CXXALIAS_RPL (logl, long double, (long double x));
-# else
-# if !@HAVE_LOGL@ || !@HAVE_DECL_LOGL@
-# undef logl
-_GL_FUNCDECL_SYS (logl, long double, (long double x));
-# endif
-_GL_CXXALIAS_SYS (logl, long double, (long double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (logl);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef logl
-# if HAVE_RAW_DECL_LOGL
-_GL_WARN_ON_USE (logl, "logl is unportable - "
- "use gnulib module logl for portability");
-# endif
-#endif
-
-
-#if @GNULIB_LOG10F@
-# if @REPLACE_LOG10F@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef log10f
-# define log10f rpl_log10f
-# endif
-_GL_FUNCDECL_RPL (log10f, float, (float x));
-_GL_CXXALIAS_RPL (log10f, float, (float x));
-# else
-# if !@HAVE_LOG10F@
-# undef log10f
-_GL_FUNCDECL_SYS (log10f, float, (float x));
-# endif
-_GL_CXXALIAS_SYS (log10f, float, (float x));
-# endif
-_GL_CXXALIASWARN (log10f);
-#elif defined GNULIB_POSIXCHECK
-# undef log10f
-# if HAVE_RAW_DECL_LOG10F
-_GL_WARN_ON_USE (log10f, "log10f is unportable - "
- "use gnulib module log10f for portability");
-# endif
-#endif
-
-#if @GNULIB_LOG10@
-# if @REPLACE_LOG10@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef log10
-# define log10 rpl_log10
-# endif
-_GL_FUNCDECL_RPL (log10, double, (double x));
-_GL_CXXALIAS_RPL (log10, double, (double x));
-# else
-_GL_CXXALIAS_SYS (log10, double, (double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN1 (log10, double, (double x));
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef log10
-# if HAVE_RAW_DECL_LOG10
-_GL_WARN_ON_USE (log10, "log10 has portability problems - "
- "use gnulib module log10 for portability");
-# endif
-#endif
-
-#if @GNULIB_LOG10L@
-# if @REPLACE_LOG10L@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef log10l
-# define log10l rpl_log10l
-# endif
-_GL_FUNCDECL_RPL (log10l, long double, (long double x));
-_GL_CXXALIAS_RPL (log10l, long double, (long double x));
-# else
-# if !@HAVE_LOG10L@ || !@HAVE_DECL_LOG10L@
-# undef log10l
-_GL_FUNCDECL_SYS (log10l, long double, (long double x));
-# endif
-_GL_CXXALIAS_SYS (log10l, long double, (long double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (log10l);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef log10l
-# if HAVE_RAW_DECL_LOG10L
-_GL_WARN_ON_USE (log10l, "log10l is unportable - "
- "use gnulib module log10l for portability");
-# endif
-#endif
-
-
-#if @GNULIB_LOG1PF@
-# if @REPLACE_LOG1PF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef log1pf
-# define log1pf rpl_log1pf
-# endif
-_GL_FUNCDECL_RPL (log1pf, float, (float x));
-_GL_CXXALIAS_RPL (log1pf, float, (float x));
-# else
-# if !@HAVE_LOG1PF@
-_GL_FUNCDECL_SYS (log1pf, float, (float x));
-# endif
-_GL_CXXALIAS_SYS (log1pf, float, (float x));
-# endif
-_GL_CXXALIASWARN (log1pf);
-#elif defined GNULIB_POSIXCHECK
-# undef log1pf
-# if HAVE_RAW_DECL_LOG1PF
-_GL_WARN_ON_USE (log1pf, "log1pf is unportable - "
- "use gnulib module log1pf for portability");
-# endif
-#endif
-
-#if @GNULIB_LOG1P@
-# if @REPLACE_LOG1P@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef log1p
-# define log1p rpl_log1p
-# endif
-_GL_FUNCDECL_RPL (log1p, double, (double x));
-_GL_CXXALIAS_RPL (log1p, double, (double x));
-# else
-# if !@HAVE_LOG1P@
-_GL_FUNCDECL_SYS (log1p, double, (double x));
-# endif
-_GL_CXXALIAS_SYS (log1p, double, (double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN1 (log1p, double, (double x));
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef log1p
-# if HAVE_RAW_DECL_LOG1P
-_GL_WARN_ON_USE (log1p, "log1p has portability problems - "
- "use gnulib module log1p for portability");
-# endif
-#endif
-
-#if @GNULIB_LOG1PL@
-# if @REPLACE_LOG1PL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef log1pl
-# define log1pl rpl_log1pl
-# endif
-_GL_FUNCDECL_RPL (log1pl, long double, (long double x));
-_GL_CXXALIAS_RPL (log1pl, long double, (long double x));
-# else
-# if !@HAVE_LOG1PL@
-_GL_FUNCDECL_SYS (log1pl, long double, (long double x));
-# endif
-_GL_CXXALIAS_SYS (log1pl, long double, (long double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (log1pl);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef log1pl
-# if HAVE_RAW_DECL_LOG1PL
-_GL_WARN_ON_USE (log1pl, "log1pl has portability problems - "
- "use gnulib module log1pl for portability");
-# endif
-#endif
-
-
-#if @GNULIB_LOG2F@
-# if @REPLACE_LOG2F@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef log2f
-# define log2f rpl_log2f
-# endif
-_GL_FUNCDECL_RPL (log2f, float, (float x));
-_GL_CXXALIAS_RPL (log2f, float, (float x));
-# else
-# if !@HAVE_DECL_LOG2F@
-# undef log2f
-_GL_FUNCDECL_SYS (log2f, float, (float x));
-# endif
-_GL_CXXALIAS_SYS (log2f, float, (float x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (log2f);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef log2f
-# if HAVE_RAW_DECL_LOG2F
-_GL_WARN_ON_USE (log2f, "log2f is unportable - "
- "use gnulib module log2f for portability");
-# endif
-#endif
-
-#if @GNULIB_LOG2@
-# if @REPLACE_LOG2@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef log2
-# define log2 rpl_log2
-# endif
-_GL_FUNCDECL_RPL (log2, double, (double x));
-_GL_CXXALIAS_RPL (log2, double, (double x));
-# else
-# if !@HAVE_DECL_LOG2@
-# undef log2
-_GL_FUNCDECL_SYS (log2, double, (double x));
-# endif
-_GL_CXXALIAS_SYS (log2, double, (double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN1 (log2, double, (double x));
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef log2
-# if HAVE_RAW_DECL_LOG2
-_GL_WARN_ON_USE (log2, "log2 is unportable - "
- "use gnulib module log2 for portability");
-# endif
-#endif
-
-#if @GNULIB_LOG2L@
-# if @REPLACE_LOG2L@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef log2l
-# define log2l rpl_log2l
-# endif
-_GL_FUNCDECL_RPL (log2l, long double, (long double x));
-_GL_CXXALIAS_RPL (log2l, long double, (long double x));
-# else
-# if !@HAVE_DECL_LOG2L@
-_GL_FUNCDECL_SYS (log2l, long double, (long double x));
-# endif
-_GL_CXXALIAS_SYS (log2l, long double, (long double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (log2l);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef log2l
-# if HAVE_RAW_DECL_LOG2L
-_GL_WARN_ON_USE (log2l, "log2l is unportable - "
- "use gnulib module log2l for portability");
-# endif
-#endif
-
-
-#if @GNULIB_LOGBF@
-# if @REPLACE_LOGBF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef logbf
-# define logbf rpl_logbf
-# endif
-_GL_FUNCDECL_RPL (logbf, float, (float x));
-_GL_CXXALIAS_RPL (logbf, float, (float x));
-# else
-# if !@HAVE_LOGBF@
-_GL_FUNCDECL_SYS (logbf, float, (float x));
-# endif
-_GL_CXXALIAS_SYS (logbf, float, (float x));
-# endif
-_GL_CXXALIASWARN (logbf);
-#elif defined GNULIB_POSIXCHECK
-# undef logbf
-# if HAVE_RAW_DECL_LOGBF
-_GL_WARN_ON_USE (logbf, "logbf is unportable - "
- "use gnulib module logbf for portability");
-# endif
-#endif
-
-#if @GNULIB_LOGB@
-# if @REPLACE_LOGB@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef logb
-# define logb rpl_logb
-# endif
-_GL_FUNCDECL_RPL (logb, double, (double x));
-_GL_CXXALIAS_RPL (logb, double, (double x));
-# else
-# if !@HAVE_DECL_LOGB@
-_GL_FUNCDECL_SYS (logb, double, (double x));
-# endif
-_GL_CXXALIAS_SYS (logb, double, (double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN1 (logb, double, (double x));
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef logb
-# if HAVE_RAW_DECL_LOGB
-_GL_WARN_ON_USE (logb, "logb is unportable - "
- "use gnulib module logb for portability");
-# endif
-#endif
-
-#if @GNULIB_LOGBL@
-# if @REPLACE_LOGBL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef logbl
-# define logbl rpl_logbl
-# endif
-_GL_FUNCDECL_RPL (logbl, long double, (long double x));
-_GL_CXXALIAS_RPL (logbl, long double, (long double x));
-# else
-# if !@HAVE_LOGBL@
-_GL_FUNCDECL_SYS (logbl, long double, (long double x));
-# endif
-_GL_CXXALIAS_SYS (logbl, long double, (long double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (logbl);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef logbl
-# if HAVE_RAW_DECL_LOGBL
-_GL_WARN_ON_USE (logbl, "logbl is unportable - "
- "use gnulib module logbl for portability");
-# endif
-#endif
-
-
-#if @GNULIB_MODFF@
-# if @REPLACE_MODFF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef modff
-# define modff rpl_modff
-# endif
-_GL_FUNCDECL_RPL (modff, float, (float x, float *iptr) _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (modff, float, (float x, float *iptr));
-# else
-# if !@HAVE_MODFF@
-# undef modff
-_GL_FUNCDECL_SYS (modff, float, (float x, float *iptr) _GL_ARG_NONNULL ((2)));
-# endif
-_GL_CXXALIAS_SYS (modff, float, (float x, float *iptr));
-# endif
-_GL_CXXALIASWARN (modff);
-#elif defined GNULIB_POSIXCHECK
-# undef modff
-# if HAVE_RAW_DECL_MODFF
-_GL_WARN_ON_USE (modff, "modff is unportable - "
- "use gnulib module modff for portability");
-# endif
-#endif
-
-#if @GNULIB_MODF@
-# if @REPLACE_MODF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef modf
-# define modf rpl_modf
-# endif
-_GL_FUNCDECL_RPL (modf, double, (double x, double *iptr) _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (modf, double, (double x, double *iptr));
-# else
-_GL_CXXALIAS_SYS (modf, double, (double x, double *iptr));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN1 (modf, double, (double x, double *iptr));
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef modf
-# if HAVE_RAW_DECL_MODF
-_GL_WARN_ON_USE (modf, "modf has portability problems - "
- "use gnulib module modf for portability");
-# endif
-#endif
-
-#if @GNULIB_MODFL@
-# if @REPLACE_MODFL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef modfl
-# define modfl rpl_modfl
-# endif
-_GL_FUNCDECL_RPL (modfl, long double, (long double x, long double *iptr)
- _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (modfl, long double, (long double x, long double *iptr));
-# else
-# if !@HAVE_MODFL@
-# undef modfl
-_GL_FUNCDECL_SYS (modfl, long double, (long double x, long double *iptr)
- _GL_ARG_NONNULL ((2)));
-# endif
-_GL_CXXALIAS_SYS (modfl, long double, (long double x, long double *iptr));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (modfl);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef modfl
-# if HAVE_RAW_DECL_MODFL
-_GL_WARN_ON_USE (modfl, "modfl is unportable - "
- "use gnulib module modfl for portability");
-# endif
-#endif
-
-
-#if @GNULIB_POWF@
-# if !@HAVE_POWF@
-# undef powf
-_GL_FUNCDECL_SYS (powf, float, (float x, float y));
-# endif
-_GL_CXXALIAS_SYS (powf, float, (float x, float y));
-_GL_CXXALIASWARN (powf);
-#elif defined GNULIB_POSIXCHECK
-# undef powf
-# if HAVE_RAW_DECL_POWF
-_GL_WARN_ON_USE (powf, "powf is unportable - "
- "use gnulib module powf for portability");
-# endif
-#endif
-
-
-#if @GNULIB_REMAINDERF@
-# if @REPLACE_REMAINDERF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef remainderf
-# define remainderf rpl_remainderf
-# endif
-_GL_FUNCDECL_RPL (remainderf, float, (float x, float y));
-_GL_CXXALIAS_RPL (remainderf, float, (float x, float y));
-# else
-# if !@HAVE_REMAINDERF@
-_GL_FUNCDECL_SYS (remainderf, float, (float x, float y));
-# endif
-_GL_CXXALIAS_SYS (remainderf, float, (float x, float y));
-# endif
-_GL_CXXALIASWARN (remainderf);
-#elif defined GNULIB_POSIXCHECK
-# undef remainderf
-# if HAVE_RAW_DECL_REMAINDERF
-_GL_WARN_ON_USE (remainderf, "remainderf is unportable - "
- "use gnulib module remainderf for portability");
-# endif
-#endif
-
-#if @GNULIB_REMAINDER@
-# if @REPLACE_REMAINDER@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef remainder
-# define remainder rpl_remainder
-# endif
-_GL_FUNCDECL_RPL (remainder, double, (double x, double y));
-_GL_CXXALIAS_RPL (remainder, double, (double x, double y));
-# else
-# if !@HAVE_REMAINDER@ || !@HAVE_DECL_REMAINDER@
-_GL_FUNCDECL_SYS (remainder, double, (double x, double y));
-# endif
-_GL_CXXALIAS_SYS (remainder, double, (double x, double y));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN1 (remainder, double, (double x, double y));
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef remainder
-# if HAVE_RAW_DECL_REMAINDER
-_GL_WARN_ON_USE (remainder, "remainder is unportable - "
- "use gnulib module remainder for portability");
-# endif
-#endif
-
-#if @GNULIB_REMAINDERL@
-# if @REPLACE_REMAINDERL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef remainderl
-# define remainderl rpl_remainderl
-# endif
-_GL_FUNCDECL_RPL (remainderl, long double, (long double x, long double y));
-_GL_CXXALIAS_RPL (remainderl, long double, (long double x, long double y));
-# else
-# if !@HAVE_DECL_REMAINDERL@
-# undef remainderl
-# if !(defined __cplusplus && defined _AIX)
-_GL_FUNCDECL_SYS (remainderl, long double, (long double x, long double y));
-# endif
-# endif
-_GL_CXXALIAS_SYS (remainderl, long double, (long double x, long double y));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (remainderl);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef remainderl
-# if HAVE_RAW_DECL_REMAINDERL
-_GL_WARN_ON_USE (remainderl, "remainderl is unportable - "
- "use gnulib module remainderl for portability");
-# endif
-#endif
-
-
-#if @GNULIB_RINTF@
-# if !@HAVE_DECL_RINTF@
-_GL_FUNCDECL_SYS (rintf, float, (float x));
-# endif
-_GL_CXXALIAS_SYS (rintf, float, (float x));
-_GL_CXXALIASWARN (rintf);
-#elif defined GNULIB_POSIXCHECK
-# undef rintf
-# if HAVE_RAW_DECL_RINTF
-_GL_WARN_ON_USE (rintf, "rintf is unportable - "
- "use gnulib module rintf for portability");
-# endif
-#endif
-
-#if @GNULIB_RINT@
-# if !@HAVE_RINT@
-_GL_FUNCDECL_SYS (rint, double, (double x));
-# endif
-_GL_CXXALIAS_SYS (rint, double, (double x));
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN1 (rint, double, (double x));
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef rint
-# if HAVE_RAW_DECL_RINT
-_GL_WARN_ON_USE (rint, "rint is unportable - "
- "use gnulib module rint for portability");
-# endif
-#endif
-
-#if @GNULIB_RINTL@
-# if @REPLACE_RINTL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef rintl
-# define rintl rpl_rintl
-# endif
-_GL_FUNCDECL_RPL (rintl, long double, (long double x));
-_GL_CXXALIAS_RPL (rintl, long double, (long double x));
-# else
-# if !@HAVE_RINTL@
-_GL_FUNCDECL_SYS (rintl, long double, (long double x));
-# endif
-_GL_CXXALIAS_SYS (rintl, long double, (long double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (rintl);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef rintl
-# if HAVE_RAW_DECL_RINTL
-_GL_WARN_ON_USE (rintl, "rintl is unportable - "
- "use gnulib module rintl for portability");
-# endif
-#endif
-
-
-#if @GNULIB_ROUNDF@
-# if @REPLACE_ROUNDF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef roundf
-# define roundf rpl_roundf
-# endif
-_GL_FUNCDECL_RPL (roundf, float, (float x));
-_GL_CXXALIAS_RPL (roundf, float, (float x));
-# else
-# if !@HAVE_DECL_ROUNDF@
-_GL_FUNCDECL_SYS (roundf, float, (float x));
-# endif
-_GL_CXXALIAS_SYS (roundf, float, (float x));
-# endif
-_GL_CXXALIASWARN (roundf);
-#elif defined GNULIB_POSIXCHECK
-# undef roundf
-# if HAVE_RAW_DECL_ROUNDF
-_GL_WARN_ON_USE (roundf, "roundf is unportable - "
- "use gnulib module roundf for portability");
-# endif
-#endif
-
-#if @GNULIB_ROUND@
-# if @REPLACE_ROUND@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef round
-# define round rpl_round
-# endif
-_GL_FUNCDECL_RPL (round, double, (double x));
-_GL_CXXALIAS_RPL (round, double, (double x));
-# else
-# if !@HAVE_DECL_ROUND@
-_GL_FUNCDECL_SYS (round, double, (double x));
-# endif
-_GL_CXXALIAS_SYS (round, double, (double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN1 (round, double, (double x));
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef round
-# if HAVE_RAW_DECL_ROUND
-_GL_WARN_ON_USE (round, "round is unportable - "
- "use gnulib module round for portability");
-# endif
-#endif
-
-#if @GNULIB_ROUNDL@
-# if @REPLACE_ROUNDL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef roundl
-# define roundl rpl_roundl
-# endif
-_GL_FUNCDECL_RPL (roundl, long double, (long double x));
-_GL_CXXALIAS_RPL (roundl, long double, (long double x));
-# else
-# if !@HAVE_DECL_ROUNDL@
-# undef roundl
-# if !(defined __cplusplus && defined _AIX)
-_GL_FUNCDECL_SYS (roundl, long double, (long double x));
-# endif
-# endif
-_GL_CXXALIAS_SYS (roundl, long double, (long double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (roundl);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef roundl
-# if HAVE_RAW_DECL_ROUNDL
-_GL_WARN_ON_USE (roundl, "roundl is unportable - "
- "use gnulib module roundl for portability");
-# endif
-#endif
-
-
-#if @GNULIB_SINF@
-# if @REPLACE_SINF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef sinf
-# define sinf rpl_sinf
-# endif
-_GL_FUNCDECL_RPL (sinf, float, (float x));
-_GL_CXXALIAS_RPL (sinf, float, (float x));
-# else
-# if !@HAVE_SINF@
-# undef sinf
-_GL_FUNCDECL_SYS (sinf, float, (float x));
-# endif
-_GL_CXXALIAS_SYS (sinf, float, (float x));
-# endif
-_GL_CXXALIASWARN (sinf);
-#elif defined GNULIB_POSIXCHECK
-# undef sinf
-# if HAVE_RAW_DECL_SINF
-_GL_WARN_ON_USE (sinf, "sinf is unportable - "
- "use gnulib module sinf for portability");
-# endif
-#endif
-
-#if @GNULIB_SINL@
-# if !@HAVE_SINL@ || !@HAVE_DECL_SINL@
-# undef sinl
-_GL_FUNCDECL_SYS (sinl, long double, (long double x));
-# endif
-_GL_CXXALIAS_SYS (sinl, long double, (long double x));
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (sinl);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef sinl
-# if HAVE_RAW_DECL_SINL
-_GL_WARN_ON_USE (sinl, "sinl is unportable - "
- "use gnulib module sinl for portability");
-# endif
-#endif
-
-
-#if @GNULIB_SINHF@
-# if @REPLACE_SINHF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef sinhf
-# define sinhf rpl_sinhf
-# endif
-_GL_FUNCDECL_RPL (sinhf, float, (float x));
-_GL_CXXALIAS_RPL (sinhf, float, (float x));
-# else
-# if !@HAVE_SINHF@
-# undef sinhf
-_GL_FUNCDECL_SYS (sinhf, float, (float x));
-# endif
-_GL_CXXALIAS_SYS (sinhf, float, (float x));
-# endif
-_GL_CXXALIASWARN (sinhf);
-#elif defined GNULIB_POSIXCHECK
-# undef sinhf
-# if HAVE_RAW_DECL_SINHF
-_GL_WARN_ON_USE (sinhf, "sinhf is unportable - "
- "use gnulib module sinhf for portability");
-# endif
-#endif
-
-
-#if @GNULIB_SQRTF@
-# if @REPLACE_SQRTF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef sqrtf
-# define sqrtf rpl_sqrtf
-# endif
-_GL_FUNCDECL_RPL (sqrtf, float, (float x));
-_GL_CXXALIAS_RPL (sqrtf, float, (float x));
-# else
-# if !@HAVE_SQRTF@
-# undef sqrtf
-_GL_FUNCDECL_SYS (sqrtf, float, (float x));
-# endif
-_GL_CXXALIAS_SYS (sqrtf, float, (float x));
-# endif
-_GL_CXXALIASWARN (sqrtf);
-#elif defined GNULIB_POSIXCHECK
-# undef sqrtf
-# if HAVE_RAW_DECL_SQRTF
-_GL_WARN_ON_USE (sqrtf, "sqrtf is unportable - "
- "use gnulib module sqrtf for portability");
-# endif
-#endif
-
-#if @GNULIB_SQRTL@
-# if @REPLACE_SQRTL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef sqrtl
-# define sqrtl rpl_sqrtl
-# endif
-_GL_FUNCDECL_RPL (sqrtl, long double, (long double x));
-_GL_CXXALIAS_RPL (sqrtl, long double, (long double x));
-# else
-# if !@HAVE_SQRTL@ || !@HAVE_DECL_SQRTL@
-# undef sqrtl
-_GL_FUNCDECL_SYS (sqrtl, long double, (long double x));
-# endif
-_GL_CXXALIAS_SYS (sqrtl, long double, (long double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (sqrtl);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef sqrtl
-# if HAVE_RAW_DECL_SQRTL
-_GL_WARN_ON_USE (sqrtl, "sqrtl is unportable - "
- "use gnulib module sqrtl for portability");
-# endif
-#endif
-
-
-#if @GNULIB_TANF@
-# if @REPLACE_TANF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef tanf
-# define tanf rpl_tanf
-# endif
-_GL_FUNCDECL_RPL (tanf, float, (float x));
-_GL_CXXALIAS_RPL (tanf, float, (float x));
-# else
-# if !@HAVE_TANF@
-# undef tanf
-_GL_FUNCDECL_SYS (tanf, float, (float x));
-# endif
-_GL_CXXALIAS_SYS (tanf, float, (float x));
-# endif
-_GL_CXXALIASWARN (tanf);
-#elif defined GNULIB_POSIXCHECK
-# undef tanf
-# if HAVE_RAW_DECL_TANF
-_GL_WARN_ON_USE (tanf, "tanf is unportable - "
- "use gnulib module tanf for portability");
-# endif
-#endif
-
-#if @GNULIB_TANL@
-# if !@HAVE_TANL@ || !@HAVE_DECL_TANL@
-# undef tanl
-_GL_FUNCDECL_SYS (tanl, long double, (long double x));
-# endif
-_GL_CXXALIAS_SYS (tanl, long double, (long double x));
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (tanl);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef tanl
-# if HAVE_RAW_DECL_TANL
-_GL_WARN_ON_USE (tanl, "tanl is unportable - "
- "use gnulib module tanl for portability");
-# endif
-#endif
-
-
-#if @GNULIB_TANHF@
-# if @REPLACE_TANHF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef tanhf
-# define tanhf rpl_tanhf
-# endif
-_GL_FUNCDECL_RPL (tanhf, float, (float x));
-_GL_CXXALIAS_RPL (tanhf, float, (float x));
-# else
-# if !@HAVE_TANHF@
-# undef tanhf
-_GL_FUNCDECL_SYS (tanhf, float, (float x));
-# endif
-_GL_CXXALIAS_SYS (tanhf, float, (float x));
-# endif
-_GL_CXXALIASWARN (tanhf);
-#elif defined GNULIB_POSIXCHECK
-# undef tanhf
-# if HAVE_RAW_DECL_TANHF
-_GL_WARN_ON_USE (tanhf, "tanhf is unportable - "
- "use gnulib module tanhf for portability");
-# endif
-#endif
-
-
-#if @GNULIB_TRUNCF@
-# if @REPLACE_TRUNCF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef truncf
-# define truncf rpl_truncf
-# endif
-_GL_FUNCDECL_RPL (truncf, float, (float x));
-_GL_CXXALIAS_RPL (truncf, float, (float x));
-# else
-# if !@HAVE_DECL_TRUNCF@
-_GL_FUNCDECL_SYS (truncf, float, (float x));
-# endif
-_GL_CXXALIAS_SYS (truncf, float, (float x));
-# endif
-_GL_CXXALIASWARN (truncf);
-#elif defined GNULIB_POSIXCHECK
-# undef truncf
-# if HAVE_RAW_DECL_TRUNCF
-_GL_WARN_ON_USE (truncf, "truncf is unportable - "
- "use gnulib module truncf for portability");
-# endif
-#endif
-
-#if @GNULIB_TRUNC@
-# if @REPLACE_TRUNC@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef trunc
-# define trunc rpl_trunc
-# endif
-_GL_FUNCDECL_RPL (trunc, double, (double x));
-_GL_CXXALIAS_RPL (trunc, double, (double x));
-# else
-# if !@HAVE_DECL_TRUNC@
-_GL_FUNCDECL_SYS (trunc, double, (double x));
-# endif
-_GL_CXXALIAS_SYS (trunc, double, (double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN1 (trunc, double, (double x));
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef trunc
-# if HAVE_RAW_DECL_TRUNC
-_GL_WARN_ON_USE (trunc, "trunc is unportable - "
- "use gnulib module trunc for portability");
-# endif
-#endif
-
-#if @GNULIB_TRUNCL@
-# if @REPLACE_TRUNCL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef truncl
-# define truncl rpl_truncl
-# endif
-_GL_FUNCDECL_RPL (truncl, long double, (long double x));
-_GL_CXXALIAS_RPL (truncl, long double, (long double x));
-# else
-# if !@HAVE_DECL_TRUNCL@
-_GL_FUNCDECL_SYS (truncl, long double, (long double x));
-# endif
-_GL_CXXALIAS_SYS (truncl, long double, (long double x));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (truncl);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef truncl
-# if HAVE_RAW_DECL_TRUNCL
-_GL_WARN_ON_USE (truncl, "truncl is unportable - "
- "use gnulib module truncl for portability");
-# endif
-#endif
-
-
-#if @GNULIB_MDA_Y0@
-/* On native Windows, map 'y0' to '_y0', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::y0 always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef y0
-# define y0 _y0
-# endif
-_GL_CXXALIAS_MDA (y0, double, (double x));
-# else
-_GL_CXXALIAS_SYS (y0, double, (double x));
-# endif
-_GL_CXXALIASWARN (y0);
-#endif
-
-#if @GNULIB_MDA_Y1@
-/* On native Windows, map 'y1' to '_y1', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::y1 always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef y1
-# define y1 _y1
-# endif
-_GL_CXXALIAS_MDA (y1, double, (double x));
-# else
-_GL_CXXALIAS_SYS (y1, double, (double x));
-# endif
-_GL_CXXALIASWARN (y1);
-#endif
-
-#if @GNULIB_MDA_YN@
-/* On native Windows, map 'yn' to '_yn', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::yn always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef yn
-# define yn _yn
-# endif
-_GL_CXXALIAS_MDA (yn, double, (int n, double x));
-# else
-_GL_CXXALIAS_SYS (yn, double, (int n, double x));
-# endif
-_GL_CXXALIASWARN (yn);
-#endif
-
-
-/* Definitions of function-like macros come here, after the function
- declarations. */
-
-
-#if @GNULIB_ISFINITE@
-# if @REPLACE_ISFINITE@
-_GL_EXTERN_C int gl_isfinitef (float x);
-_GL_EXTERN_C int gl_isfinited (double x);
-_GL_EXTERN_C int gl_isfinitel (long double x);
-# undef isfinite
-# define isfinite(x) \
- (sizeof (x) == sizeof (long double) ? gl_isfinitel (x) : \
- sizeof (x) == sizeof (double) ? gl_isfinited (x) : \
- gl_isfinitef (x))
-# endif
-# ifdef __cplusplus
-# if defined isfinite || defined GNULIB_NAMESPACE
-_GL_MATH_CXX_REAL_FLOATING_DECL_1 (isfinite)
-# undef isfinite
-# if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined __OpenBSD__ || defined _AIX || (defined _WIN32 && !defined __CYGWIN__)))
- /* This platform's <cmath> possibly defines isfinite through a set of inline
- functions. */
-_GL_MATH_CXX_REAL_FLOATING_DECL_2 (isfinite, rpl_isfinite, bool)
-# define isfinite rpl_isfinite
-# define GNULIB_NAMESPACE_LACKS_ISFINITE 1
-# else
-_GL_MATH_CXX_REAL_FLOATING_DECL_2 (isfinite, isfinite, bool)
-# endif
-# endif
-# endif
-#elif defined GNULIB_POSIXCHECK
-# if defined isfinite
-_GL_WARN_REAL_FLOATING_DECL (isfinite);
-# undef isfinite
-# define isfinite(x) _GL_WARN_REAL_FLOATING_IMPL (isfinite, x)
-# endif
-#endif
-
-
-#if @GNULIB_ISINF@
-# if @REPLACE_ISINF@
-_GL_EXTERN_C int gl_isinff (float x);
-_GL_EXTERN_C int gl_isinfd (double x);
-_GL_EXTERN_C int gl_isinfl (long double x);
-# undef isinf
-# define isinf(x) \
- (sizeof (x) == sizeof (long double) ? gl_isinfl (x) : \
- sizeof (x) == sizeof (double) ? gl_isinfd (x) : \
- gl_isinff (x))
-# endif
-# ifdef __cplusplus
-# if defined isinf || defined GNULIB_NAMESPACE
-_GL_MATH_CXX_REAL_FLOATING_DECL_1 (isinf)
-# undef isinf
-# if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined __OpenBSD__ || (defined _WIN32 && !defined __CYGWIN__)))
- /* This platform's <cmath> possibly defines isinf through a set of inline
- functions. */
-_GL_MATH_CXX_REAL_FLOATING_DECL_2 (isinf, rpl_isinf, bool)
-# define isinf rpl_isinf
-# define GNULIB_NAMESPACE_LACKS_ISINF 1
-# else
-_GL_MATH_CXX_REAL_FLOATING_DECL_2 (isinf, isinf, bool)
-# endif
-# endif
-# endif
-#elif defined GNULIB_POSIXCHECK
-# if defined isinf
-_GL_WARN_REAL_FLOATING_DECL (isinf);
-# undef isinf
-# define isinf(x) _GL_WARN_REAL_FLOATING_IMPL (isinf, x)
-# endif
-#endif
-
-
-#if @GNULIB_ISNANF@
-/* Test for NaN for 'float' numbers. */
-# if @HAVE_ISNANF@
-/* The original <math.h> included above provides a declaration of isnan macro
- or (older) isnanf function. */
-# if (__GNUC__ >= 4) || (__clang_major__ >= 4)
- /* GCC >= 4.0 and clang provide a type-generic built-in for isnan.
- GCC >= 4.0 also provides __builtin_isnanf, but clang doesn't. */
-# undef isnanf
-# define isnanf(x) __builtin_isnan ((float)(x))
-# elif defined isnan
-# undef isnanf
-# define isnanf(x) isnan ((float)(x))
-# endif
-# else
-/* Test whether X is a NaN. */
-# undef isnanf
-# define isnanf rpl_isnanf
-_GL_EXTERN_C int isnanf (float x);
-# endif
-#endif
-
-#if @GNULIB_ISNAND@
-/* Test for NaN for 'double' numbers.
- This function is a gnulib extension, unlike isnan() which applied only
- to 'double' numbers earlier but now is a type-generic macro. */
-# if @HAVE_ISNAND@
-/* The original <math.h> included above provides a declaration of isnan
- macro. */
-# if (__GNUC__ >= 4) || (__clang_major__ >= 4)
- /* GCC >= 4.0 and clang provide a type-generic built-in for isnan. */
-# undef isnand
-# define isnand(x) __builtin_isnan ((double)(x))
-# else
-# undef isnand
-# define isnand(x) isnan ((double)(x))
-# endif
-# else
-/* Test whether X is a NaN. */
-# undef isnand
-# define isnand rpl_isnand
-_GL_EXTERN_C int isnand (double x);
-# endif
-#endif
-
-#if @GNULIB_ISNANL@
-/* Test for NaN for 'long double' numbers. */
-# if @HAVE_ISNANL@
-/* The original <math.h> included above provides a declaration of isnan
- macro or (older) isnanl function. */
-# if (__GNUC__ >= 4) || (__clang_major__ >= 4)
- /* GCC >= 4.0 and clang provide a type-generic built-in for isnan.
- GCC >= 4.0 also provides __builtin_isnanl, but clang doesn't. */
-# undef isnanl
-# define isnanl(x) __builtin_isnan ((long double)(x))
-# elif defined isnan
-# undef isnanl
-# define isnanl(x) isnan ((long double)(x))
-# endif
-# else
-/* Test whether X is a NaN. */
-# undef isnanl
-# define isnanl rpl_isnanl
-_GL_EXTERN_C int isnanl (long double x) _GL_ATTRIBUTE_CONST;
-# endif
-#endif
-
-/* This must come *after* the snippets for GNULIB_ISNANF and GNULIB_ISNANL! */
-#if @GNULIB_ISNAN@
-# if @REPLACE_ISNAN@
-/* We can't just use the isnanf macro (e.g.) as exposed by
- isnanf.h (e.g.) here, because those may end up being macros
- that recursively expand back to isnan. So use the gnulib
- replacements for them directly. */
-# if @HAVE_ISNANF@ && (__GNUC__ >= 4) || (__clang_major__ >= 4)
-# define gl_isnan_f(x) __builtin_isnan ((float)(x))
-# else
-_GL_EXTERN_C int rpl_isnanf (float x);
-# define gl_isnan_f(x) rpl_isnanf (x)
-# endif
-# if @HAVE_ISNAND@ && (__GNUC__ >= 4) || (__clang_major__ >= 4)
-# define gl_isnan_d(x) __builtin_isnan ((double)(x))
-# else
-_GL_EXTERN_C int rpl_isnand (double x);
-# define gl_isnan_d(x) rpl_isnand (x)
-# endif
-# if @HAVE_ISNANL@ && (__GNUC__ >= 4) || (__clang_major__ >= 4)
-# define gl_isnan_l(x) __builtin_isnan ((long double)(x))
-# else
-_GL_EXTERN_C int rpl_isnanl (long double x) _GL_ATTRIBUTE_CONST;
-# define gl_isnan_l(x) rpl_isnanl (x)
-# endif
-# undef isnan
-# define isnan(x) \
- (sizeof (x) == sizeof (long double) ? gl_isnan_l (x) : \
- sizeof (x) == sizeof (double) ? gl_isnan_d (x) : \
- gl_isnan_f (x))
-# elif (__GNUC__ >= 4) || (__clang_major__ >= 4)
-# undef isnan
-# define isnan(x) \
- (sizeof (x) == sizeof (long double) ? __builtin_isnan ((long double)(x)) : \
- sizeof (x) == sizeof (double) ? __builtin_isnan ((double)(x)) : \
- __builtin_isnan ((float)(x)))
-# endif
-# ifdef __cplusplus
-# if defined isnan || defined GNULIB_NAMESPACE
-_GL_MATH_CXX_REAL_FLOATING_DECL_1 (isnan)
-# undef isnan
-# if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__ && __clang_major__ != 12) || (defined __FreeBSD__ && (__clang_major__ < 7 || __clang_major__ >= 11)) || defined __OpenBSD__ || (defined _WIN32 && !defined __CYGWIN__)))
- /* This platform's <cmath> possibly defines isnan through a set of inline
- functions. */
-_GL_MATH_CXX_REAL_FLOATING_DECL_2 (isnan, rpl_isnan, bool)
-# define isnan rpl_isnan
-# define GNULIB_NAMESPACE_LACKS_ISNAN 1
-# else
-_GL_MATH_CXX_REAL_FLOATING_DECL_2 (isnan, isnan, bool)
-# endif
-# endif
-# else
-/* Ensure isnan is a macro. */
-# ifndef isnan
-# define isnan isnan
-# endif
-# endif
-#elif defined GNULIB_POSIXCHECK
-# if defined isnan
-_GL_WARN_REAL_FLOATING_DECL (isnan);
-# undef isnan
-# define isnan(x) _GL_WARN_REAL_FLOATING_IMPL (isnan, x)
-# endif
-#endif
-
-
-#if @GNULIB_SIGNBIT@
-# if (@REPLACE_SIGNBIT_USING_BUILTINS@ \
- && (!defined __cplusplus || __cplusplus < 201103))
-# undef signbit
- /* GCC >= 4.0 and clang provide three built-ins for signbit. */
-# define signbit(x) \
- (sizeof (x) == sizeof (long double) ? __builtin_signbitl (x) : \
- sizeof (x) == sizeof (double) ? __builtin_signbit (x) : \
- __builtin_signbitf (x))
-# endif
-# if @REPLACE_SIGNBIT@ && !GNULIB_defined_signbit
-# undef signbit
-_GL_EXTERN_C int gl_signbitf (float arg);
-_GL_EXTERN_C int gl_signbitd (double arg);
-_GL_EXTERN_C int gl_signbitl (long double arg);
-# if (__GNUC__ >= 2 || defined __clang__) && !defined __STRICT_ANSI__
-# define _GL_NUM_UINT_WORDS(type) \
- ((sizeof (type) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
-# if defined FLT_SIGNBIT_WORD && defined FLT_SIGNBIT_BIT && !defined gl_signbitf
-# define gl_signbitf_OPTIMIZED_MACRO
-# define gl_signbitf(arg) \
- ({ union { float _value; \
- unsigned int _word[_GL_NUM_UINT_WORDS (float)]; \
- } _m; \
- _m._value = (arg); \
- (_m._word[FLT_SIGNBIT_WORD] >> FLT_SIGNBIT_BIT) & 1; \
- })
-# endif
-# if defined DBL_SIGNBIT_WORD && defined DBL_SIGNBIT_BIT && !defined gl_signbitd
-# define gl_signbitd_OPTIMIZED_MACRO
-# define gl_signbitd(arg) \
- ({ union { double _value; \
- unsigned int _word[_GL_NUM_UINT_WORDS (double)]; \
- } _m; \
- _m._value = (arg); \
- (_m._word[DBL_SIGNBIT_WORD] >> DBL_SIGNBIT_BIT) & 1; \
- })
-# endif
-# if defined LDBL_SIGNBIT_WORD && defined LDBL_SIGNBIT_BIT && !defined gl_signbitl
-# define gl_signbitl_OPTIMIZED_MACRO
-# define gl_signbitl(arg) \
- ({ union { long double _value; \
- unsigned int _word[_GL_NUM_UINT_WORDS (long double)]; \
- } _m; \
- _m._value = (arg); \
- (_m._word[LDBL_SIGNBIT_WORD] >> LDBL_SIGNBIT_BIT) & 1; \
- })
-# endif
-# endif
-# define signbit(x) \
- (sizeof (x) == sizeof (long double) ? gl_signbitl (x) : \
- sizeof (x) == sizeof (double) ? gl_signbitd (x) : \
- gl_signbitf (x))
-# define GNULIB_defined_signbit 1
-# endif
-# ifdef __cplusplus
-# if defined signbit || defined GNULIB_NAMESPACE
-_GL_MATH_CXX_REAL_FLOATING_DECL_1 (signbit)
-# undef signbit
-# if __GNUC__ >= 6 || (defined __clang__ && !((defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined __OpenBSD__ || defined _AIX || (defined _WIN32 && !defined __CYGWIN__)))
- /* This platform's <cmath> possibly defines signbit through a set of inline
- functions. */
-_GL_MATH_CXX_REAL_FLOATING_DECL_2 (signbit, rpl_signbit, bool)
-# define signbit rpl_signbit
-# define GNULIB_NAMESPACE_LACKS_SIGNBIT 1
-# else
-_GL_MATH_CXX_REAL_FLOATING_DECL_2 (signbit, signbit, bool)
-# endif
-# endif
-# endif
-#elif defined GNULIB_POSIXCHECK
-# if defined signbit
-_GL_WARN_REAL_FLOATING_DECL (signbit);
-# undef signbit
-# define signbit(x) _GL_WARN_REAL_FLOATING_IMPL (signbit, x)
-# endif
-#endif
-
-_GL_INLINE_HEADER_END
-
-#endif /* _@GUARD_PREFIX@_MATH_H */
-#endif /* _GL_INCLUDING_MATH_H */
-#endif /* _@GUARD_PREFIX@_MATH_H */
-#endif
diff --git a/cross/lib/md5-stream.c b/cross/lib/md5-stream.c
deleted file mode 100644
index ba76792cbbe..00000000000
--- a/cross/lib/md5-stream.c
+++ /dev/null
@@ -1,141 +0,0 @@
-/* Functions to compute MD5 message digest of files or memory blocks.
- according to the definition of MD5 in RFC 1321 from April 1992.
- Copyright (C) 1995-1997, 1999-2001, 2005-2006, 2008-2023 Free Software
- Foundation, Inc.
- This file is part of the GNU C Library.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. */
-
-#include <config.h>
-
-/* Specification. */
-#if HAVE_OPENSSL_MD5
-# define GL_OPENSSL_INLINE _GL_EXTERN_INLINE
-#endif
-#include "md5.h"
-
-#include <stdlib.h>
-
-#if USE_UNLOCKED_IO
-# include "unlocked-io.h"
-#endif
-
-#include "af_alg.h"
-
-#ifdef _LIBC
-# include <endian.h>
-# if __BYTE_ORDER == __BIG_ENDIAN
-# define WORDS_BIGENDIAN 1
-# endif
-/* We need to keep the namespace clean so define the MD5 function
- protected using leading __ . */
-# define md5_init_ctx __md5_init_ctx
-# define md5_process_block __md5_process_block
-# define md5_process_bytes __md5_process_bytes
-# define md5_finish_ctx __md5_finish_ctx
-# define md5_stream __md5_stream
-#endif
-
-#define BLOCKSIZE 32768
-#if BLOCKSIZE % 64 != 0
-# error "invalid BLOCKSIZE"
-#endif
-
-/* Compute MD5 message digest for bytes read from STREAM. The
- resulting message digest number will be written into the 16 bytes
- beginning at RESBLOCK. */
-int
-md5_stream (FILE *stream, void *resblock)
-{
- switch (afalg_stream (stream, "md5", resblock, MD5_DIGEST_SIZE))
- {
- case 0: return 0;
- case -EIO: return 1;
- }
-
- char *buffer = malloc (BLOCKSIZE + 72);
- if (!buffer)
- return 1;
-
- struct md5_ctx ctx;
- md5_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
- */
- md5_process_block (buffer, BLOCKSIZE, &ctx);
- }
-
-process_partial_block:
-
- /* Process any remaining bytes. */
- if (sum > 0)
- md5_process_bytes (buffer, sum, &ctx);
-
- /* Construct result in desired memory. */
- md5_finish_ctx (&ctx, resblock);
- free (buffer);
- return 0;
-}
-
-/*
- * Hey Emacs!
- * Local Variables:
- * coding: utf-8
- * End:
- */
diff --git a/cross/lib/md5.c b/cross/lib/md5.c
deleted file mode 100644
index 4a6accf28ff..00000000000
--- a/cross/lib/md5.c
+++ /dev/null
@@ -1,394 +0,0 @@
-/* Functions to compute MD5 message digest of files or memory blocks.
- according to the definition of MD5 in RFC 1321 from April 1992.
- Copyright (C) 1995-1997, 1999-2001, 2005-2006, 2008-2023 Free Software
- Foundation, Inc.
- This file is part of the GNU C Library.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. */
-
-#include <config.h>
-
-/* Specification. */
-#if HAVE_OPENSSL_MD5
-# define GL_OPENSSL_INLINE _GL_EXTERN_INLINE
-#endif
-#include "md5.h"
-
-#include <stdint.h>
-#include <string.h>
-#include <sys/types.h>
-
-#ifdef _LIBC
-# include <endian.h>
-# if __BYTE_ORDER == __BIG_ENDIAN
-# define WORDS_BIGENDIAN 1
-# endif
-/* We need to keep the namespace clean so define the MD5 function
- protected using leading __ . */
-# define md5_init_ctx __md5_init_ctx
-# define md5_process_block __md5_process_block
-# define md5_process_bytes __md5_process_bytes
-# define md5_finish_ctx __md5_finish_ctx
-# define md5_read_ctx __md5_read_ctx
-# define md5_buffer __md5_buffer
-#endif
-
-#include <byteswap.h>
-#ifdef WORDS_BIGENDIAN
-# define SWAP(n) bswap_32 (n)
-#else
-# define SWAP(n) (n)
-#endif
-
-#if ! HAVE_OPENSSL_MD5
-
-/* This array contains the bytes used to pad the buffer to the next
- 64-byte boundary. (RFC 1321, 3.1: Step 1) */
-static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
-
-
-/* Initialize structure containing state of computation.
- (RFC 1321, 3.3: Step 3) */
-void
-md5_init_ctx (struct md5_ctx *ctx)
-{
- ctx->A = 0x67452301;
- ctx->B = 0xefcdab89;
- ctx->C = 0x98badcfe;
- ctx->D = 0x10325476;
-
- ctx->total[0] = ctx->total[1] = 0;
- ctx->buflen = 0;
-}
-
-/* Copy the 4 byte value from v into the memory location pointed to by *cp,
- If your architecture allows unaligned access this is equivalent to
- * (uint32_t *) cp = v */
-static void
-set_uint32 (char *cp, uint32_t v)
-{
- memcpy (cp, &v, sizeof v);
-}
-
-/* Put result from CTX in first 16 bytes following RESBUF. The result
- must be in little endian byte order. */
-void *
-md5_read_ctx (const struct md5_ctx *ctx, void *resbuf)
-{
- char *r = resbuf;
- set_uint32 (r + 0 * sizeof ctx->A, SWAP (ctx->A));
- set_uint32 (r + 1 * sizeof ctx->B, SWAP (ctx->B));
- set_uint32 (r + 2 * sizeof ctx->C, SWAP (ctx->C));
- set_uint32 (r + 3 * sizeof ctx->D, SWAP (ctx->D));
-
- return resbuf;
-}
-
-/* Process the remaining bytes in the internal buffer and the usual
- prolog according to the standard and write the result to RESBUF. */
-void *
-md5_finish_ctx (struct md5_ctx *ctx, void *resbuf)
-{
- /* Take yet unprocessed bytes into account. */
- uint32_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. */
- ctx->buffer[size - 2] = SWAP (ctx->total[0] << 3);
- ctx->buffer[size - 1] = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29));
-
- memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 4 - bytes);
-
- /* Process last bytes. */
- md5_process_block (ctx->buffer, size * 4, ctx);
-
- return md5_read_ctx (ctx, resbuf);
-}
-
-/* Compute MD5 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 *
-md5_buffer (const char *buffer, size_t len, void *resblock)
-{
- struct md5_ctx ctx;
-
- /* Initialize the computation context. */
- md5_init_ctx (&ctx);
-
- /* Process whole buffer but last len % 64 bytes. */
- md5_process_bytes (buffer, len, &ctx);
-
- /* Put result in desired memory area. */
- return md5_finish_ctx (&ctx, resblock);
-}
-
-
-void
-md5_process_bytes (const void *buffer, size_t len, struct md5_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)
- {
- md5_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)
- {
- md5_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx);
- buffer = (const char *) buffer + 64;
- len -= 64;
- }
- else
-#endif
- {
- md5_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)
- {
- md5_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;
- }
-}
-
-
-/* These are the four functions used in the four steps of the MD5 algorithm
- and defined in the RFC 1321. The first function is a little bit optimized
- (as found in Colin Plumbs public domain implementation). */
-/* #define FF(b, c, d) ((b & c) | (~b & d)) */
-#define FF(b, c, d) (d ^ (b & (c ^ d)))
-#define FG(b, c, d) FF (d, b, c)
-#define FH(b, c, d) (b ^ c ^ d)
-#define FI(b, c, d) (c ^ (b | ~d))
-
-/* Process LEN bytes of BUFFER, accumulating context into CTX.
- It is assumed that LEN % 64 == 0. */
-
-void
-md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx)
-{
- uint32_t correct_words[16];
- const uint32_t *words = buffer;
- size_t nwords = len / sizeof (uint32_t);
- const uint32_t *endp = words + nwords;
- uint32_t A = ctx->A;
- uint32_t B = ctx->B;
- uint32_t C = ctx->C;
- uint32_t D = ctx->D;
- uint32_t lolen = len;
-
- /* First increment the byte count. RFC 1321 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);
-
- /* Process all bytes in the buffer with 64 bytes in each round of
- the loop. */
- while (words < endp)
- {
- uint32_t *cwp = correct_words;
- uint32_t A_save = A;
- uint32_t B_save = B;
- uint32_t C_save = C;
- uint32_t D_save = D;
-
- /* First round: using the given function, the context and a constant
- the next context is computed. Because the algorithms processing
- unit is a 32-bit word and it is determined to work on words in
- little endian byte order we perhaps have to change the byte order
- before the computation. To reduce the work for the next steps
- we store the swapped words in the array CORRECT_WORDS. */
-
-#define OP(a, b, c, d, s, T) \
- do \
- { \
- a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T; \
- ++words; \
- CYCLIC (a, s); \
- a += b; \
- } \
- while (0)
-
- /* It is unfortunate that C does not provide an operator for
- cyclic rotation. Hope the C compiler is smart enough. */
-#define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s)))
-
- /* Before we start, one word to the strange constants.
- They are defined in RFC 1321 as
-
- T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
-
- Here is an equivalent invocation using Perl:
-
- perl -e 'foreach(1..64){printf "0x%08x\n", int (4294967296 * abs (sin $_))}'
- */
-
- /* Round 1. */
- OP (A, B, C, D, 7, 0xd76aa478);
- OP (D, A, B, C, 12, 0xe8c7b756);
- OP (C, D, A, B, 17, 0x242070db);
- OP (B, C, D, A, 22, 0xc1bdceee);
- OP (A, B, C, D, 7, 0xf57c0faf);
- OP (D, A, B, C, 12, 0x4787c62a);
- OP (C, D, A, B, 17, 0xa8304613);
- OP (B, C, D, A, 22, 0xfd469501);
- OP (A, B, C, D, 7, 0x698098d8);
- OP (D, A, B, C, 12, 0x8b44f7af);
- OP (C, D, A, B, 17, 0xffff5bb1);
- OP (B, C, D, A, 22, 0x895cd7be);
- OP (A, B, C, D, 7, 0x6b901122);
- OP (D, A, B, C, 12, 0xfd987193);
- OP (C, D, A, B, 17, 0xa679438e);
- OP (B, C, D, A, 22, 0x49b40821);
-
- /* For the second to fourth round we have the possibly swapped words
- in CORRECT_WORDS. Redefine the macro to take an additional first
- argument specifying the function to use. */
-#undef OP
-#define OP(f, a, b, c, d, k, s, T) \
- do \
- { \
- a += f (b, c, d) + correct_words[k] + T; \
- CYCLIC (a, s); \
- a += b; \
- } \
- while (0)
-
- /* Round 2. */
- OP (FG, A, B, C, D, 1, 5, 0xf61e2562);
- OP (FG, D, A, B, C, 6, 9, 0xc040b340);
- OP (FG, C, D, A, B, 11, 14, 0x265e5a51);
- OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa);
- OP (FG, A, B, C, D, 5, 5, 0xd62f105d);
- OP (FG, D, A, B, C, 10, 9, 0x02441453);
- OP (FG, C, D, A, B, 15, 14, 0xd8a1e681);
- OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8);
- OP (FG, A, B, C, D, 9, 5, 0x21e1cde6);
- OP (FG, D, A, B, C, 14, 9, 0xc33707d6);
- OP (FG, C, D, A, B, 3, 14, 0xf4d50d87);
- OP (FG, B, C, D, A, 8, 20, 0x455a14ed);
- OP (FG, A, B, C, D, 13, 5, 0xa9e3e905);
- OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8);
- OP (FG, C, D, A, B, 7, 14, 0x676f02d9);
- OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a);
-
- /* Round 3. */
- OP (FH, A, B, C, D, 5, 4, 0xfffa3942);
- OP (FH, D, A, B, C, 8, 11, 0x8771f681);
- OP (FH, C, D, A, B, 11, 16, 0x6d9d6122);
- OP (FH, B, C, D, A, 14, 23, 0xfde5380c);
- OP (FH, A, B, C, D, 1, 4, 0xa4beea44);
- OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9);
- OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60);
- OP (FH, B, C, D, A, 10, 23, 0xbebfbc70);
- OP (FH, A, B, C, D, 13, 4, 0x289b7ec6);
- OP (FH, D, A, B, C, 0, 11, 0xeaa127fa);
- OP (FH, C, D, A, B, 3, 16, 0xd4ef3085);
- OP (FH, B, C, D, A, 6, 23, 0x04881d05);
- OP (FH, A, B, C, D, 9, 4, 0xd9d4d039);
- OP (FH, D, A, B, C, 12, 11, 0xe6db99e5);
- OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8);
- OP (FH, B, C, D, A, 2, 23, 0xc4ac5665);
-
- /* Round 4. */
- OP (FI, A, B, C, D, 0, 6, 0xf4292244);
- OP (FI, D, A, B, C, 7, 10, 0x432aff97);
- OP (FI, C, D, A, B, 14, 15, 0xab9423a7);
- OP (FI, B, C, D, A, 5, 21, 0xfc93a039);
- OP (FI, A, B, C, D, 12, 6, 0x655b59c3);
- OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92);
- OP (FI, C, D, A, B, 10, 15, 0xffeff47d);
- OP (FI, B, C, D, A, 1, 21, 0x85845dd1);
- OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f);
- OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
- OP (FI, C, D, A, B, 6, 15, 0xa3014314);
- OP (FI, B, C, D, A, 13, 21, 0x4e0811a1);
- OP (FI, A, B, C, D, 4, 6, 0xf7537e82);
- OP (FI, D, A, B, C, 11, 10, 0xbd3af235);
- OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb);
- OP (FI, B, C, D, A, 9, 21, 0xeb86d391);
-
- /* Add the starting values of the context. */
- A += A_save;
- B += B_save;
- C += C_save;
- D += D_save;
- }
-
- /* Put checksum in context given as argument. */
- ctx->A = A;
- ctx->B = B;
- ctx->C = C;
- ctx->D = D;
-}
-
-#endif
-
-/*
- * Hey Emacs!
- * Local Variables:
- * coding: utf-8
- * End:
- */
diff --git a/cross/lib/md5.h b/cross/lib/md5.h
deleted file mode 100644
index f34e7cb8dfa..00000000000
--- a/cross/lib/md5.h
+++ /dev/null
@@ -1,151 +0,0 @@
-/* Declaration of functions and data types used for MD5 sum computing
- library functions.
- Copyright (C) 1995-1997, 1999-2001, 2004-2006, 2008-2023 Free Software
- Foundation, Inc.
- This file is part of the GNU C Library.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#ifndef _MD5_H
-#define _MD5_H 1
-
-#include <stdio.h>
-#include <stdint.h>
-
-# if HAVE_OPENSSL_MD5
-# ifndef OPENSSL_API_COMPAT
-# define OPENSSL_API_COMPAT 0x10101000L /* FIXME: Use OpenSSL 1.1+ API. */
-# endif
-# include <openssl/md5.h>
-# endif
-
-#define MD5_DIGEST_SIZE 16
-#define MD5_BLOCK_SIZE 64
-
-#ifndef __GNUC_PREREQ
-# if defined __GNUC__ && defined __GNUC_MINOR__
-# define __GNUC_PREREQ(maj, min) \
- ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
-# else
-# define __GNUC_PREREQ(maj, min) 0
-# endif
-#endif
-
-#ifndef __THROW
-# if defined __cplusplus && (__GNUC_PREREQ (2,8) || __clang_major__ >= 4)
-# define __THROW throw ()
-# else
-# define __THROW
-# endif
-#endif
-
-#ifndef _LIBC
-# define __md5_buffer md5_buffer
-# define __md5_finish_ctx md5_finish_ctx
-# define __md5_init_ctx md5_init_ctx
-# define __md5_process_block md5_process_block
-# define __md5_process_bytes md5_process_bytes
-# define __md5_read_ctx md5_read_ctx
-# define __md5_stream md5_stream
-#endif
-
-# ifdef __cplusplus
-extern "C" {
-# endif
-
-# if HAVE_OPENSSL_MD5
-# define GL_OPENSSL_NAME 5
-# include "gl_openssl.h"
-# else
-/* Structure to save state of computation between the single steps. */
-struct md5_ctx
-{
- uint32_t A;
- uint32_t B;
- uint32_t C;
- uint32_t D;
-
- uint32_t total[2];
- uint32_t buflen; /* ≥ 0, ≤ 128 */
- uint32_t buffer[32]; /* 128 bytes; the first buflen bytes are in use */
-};
-
-/*
- * The following three functions are build up the low level used in
- * the functions 'md5_stream' and 'md5_buffer'.
- */
-
-/* Initialize structure containing state of computation.
- (RFC 1321, 3.3: Step 3) */
-extern void __md5_init_ctx (struct md5_ctx *ctx) __THROW;
-
-/* 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 __md5_process_block (const void *buffer, size_t len,
- struct md5_ctx *ctx) __THROW;
-
-/* 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 __md5_process_bytes (const void *buffer, size_t len,
- struct md5_ctx *ctx) __THROW;
-
-/* Process the remaining bytes in the buffer and put result from CTX
- in first 16 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 *__md5_finish_ctx (struct md5_ctx *ctx, void *restrict resbuf)
- __THROW;
-
-
-/* Put result from CTX in first 16 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 *__md5_read_ctx (const struct md5_ctx *ctx, void *restrict resbuf)
- __THROW;
-
-
-/* Compute MD5 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 *__md5_buffer (const char *buffer, size_t len,
- void *restrict resblock) __THROW;
-
-# endif
-
-/* Compute MD5 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 16 bytes
- beginning at RESBLOCK. */
-extern int __md5_stream (FILE *stream, void *resblock) __THROW;
-
-
-# ifdef __cplusplus
-}
-# endif
-
-#endif /* md5.h */
-
-/*
- * Hey Emacs!
- * Local Variables:
- * coding: utf-8
- * End:
- */
diff --git a/cross/lib/memmem.c b/cross/lib/memmem.c
deleted file mode 100644
index c0b48c1b25d..00000000000
--- a/cross/lib/memmem.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/* Copyright (C) 1991-1994, 1996-1998, 2000, 2004, 2007-2023 Free Software
- Foundation, Inc.
- This file is part of the GNU C Library.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* This particular implementation was written by Eric Blake, 2008. */
-
-#ifndef _LIBC
-# include <config.h>
-#endif
-
-/* Specification of memmem. */
-#include <string.h>
-
-#define RETURN_TYPE void *
-#define AVAILABLE(h, h_l, j, n_l) ((j) <= (h_l) - (n_l))
-#include "str-two-way.h"
-
-/* Return the first occurrence of NEEDLE in HAYSTACK. Return HAYSTACK
- if NEEDLE_LEN is 0, otherwise NULL if NEEDLE is not found in
- HAYSTACK. */
-void *
-memmem (const void *haystack_start, size_t haystack_len,
- const void *needle_start, size_t needle_len)
-{
- /* Abstract memory is considered to be an array of 'unsigned char' values,
- not an array of 'char' values. See ISO C 99 section 6.2.6.1. */
- const unsigned char *haystack = (const unsigned char *) haystack_start;
- const unsigned char *needle = (const unsigned char *) needle_start;
-
- if (needle_len == 0)
- /* The first occurrence of the empty string is deemed to occur at
- the beginning of the string. */
- return (void *) haystack;
-
- /* Sanity check, otherwise the loop might search through the whole
- memory. */
- if (__builtin_expect (haystack_len < needle_len, 0))
- return NULL;
-
- /* Use optimizations in memchr when possible, to reduce the search
- size of haystack using a linear algorithm with a smaller
- coefficient. However, avoid memchr for long needles, since we
- can often achieve sublinear performance. */
- if (needle_len < LONG_NEEDLE_THRESHOLD)
- {
- haystack = memchr (haystack, *needle, haystack_len);
- if (!haystack || __builtin_expect (needle_len == 1, 0))
- return (void *) haystack;
- haystack_len -= haystack - (const unsigned char *) haystack_start;
- if (haystack_len < needle_len)
- return NULL;
- return two_way_short_needle (haystack, haystack_len, needle, needle_len);
- }
- else
- return two_way_long_needle (haystack, haystack_len, needle, needle_len);
-}
-
-#undef LONG_NEEDLE_THRESHOLD
diff --git a/cross/lib/mempcpy.c b/cross/lib/mempcpy.c
deleted file mode 100644
index 24a3135988f..00000000000
--- a/cross/lib/mempcpy.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Copy memory area and return pointer after last written byte.
- Copyright (C) 2003, 2007, 2009-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-/* Specification. */
-#include <string.h>
-
-/* A function definition is only needed if HAVE_MEMPCPY is not defined. */
-#if !HAVE_MEMPCPY
-
-/* Copy N bytes of SRC to DEST, return pointer to bytes after the
- last written byte. */
-void *
-mempcpy (void *dest, const void *src, size_t n)
-{
- return (char *) memcpy (dest, src, n) + n;
-}
-
-#endif
diff --git a/cross/lib/memrchr.c b/cross/lib/memrchr.c
deleted file mode 100644
index c5b1fe8b2e3..00000000000
--- a/cross/lib/memrchr.c
+++ /dev/null
@@ -1,161 +0,0 @@
-/* memrchr -- find the last occurrence of a byte in a memory block
-
- Copyright (C) 1991, 1993, 1996-1997, 1999-2000, 2003-2023 Free Software
- Foundation, Inc.
-
- Based on strlen implementation by Torbjorn Granlund (tege@sics.se),
- with help from Dan Sahlin (dan@sics.se) and
- commentary by Jim Blandy (jimb@ai.mit.edu);
- adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu),
- and implemented by Roland McGrath (roland@ai.mit.edu).
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#if defined _LIBC
-# include <memcopy.h>
-#else
-# include <config.h>
-# define reg_char char
-#endif
-
-#include <string.h>
-#include <limits.h>
-
-#undef __memrchr
-#ifdef _LIBC
-# undef memrchr
-#endif
-
-#ifndef weak_alias
-# define __memrchr memrchr
-#endif
-
-/* Search no more than N bytes of S for C. */
-void *
-__memrchr (void const *s, int c_in, size_t n)
-{
- /* On 32-bit hardware, choosing longword to be a 32-bit unsigned
- long instead of a 64-bit uintmax_t tends to give better
- performance. On 64-bit hardware, unsigned long is generally 64
- bits already. Change this typedef to experiment with
- performance. */
- typedef unsigned long int longword;
-
- const unsigned char *char_ptr;
- const longword *longword_ptr;
- longword repeated_one;
- longword repeated_c;
- unsigned reg_char c;
-
- c = (unsigned char) c_in;
-
- /* Handle the last few bytes by reading one byte at a time.
- Do this until CHAR_PTR is aligned on a longword boundary. */
- for (char_ptr = (const unsigned char *) s + n;
- n > 0 && (size_t) char_ptr % sizeof (longword) != 0;
- --n)
- if (*--char_ptr == c)
- return (void *) char_ptr;
-
- longword_ptr = (const void *) char_ptr;
-
- /* All these elucidatory comments refer to 4-byte longwords,
- but the theory applies equally well to any size longwords. */
-
- /* Compute auxiliary longword values:
- repeated_one is a value which has a 1 in every byte.
- repeated_c has c in every byte. */
- repeated_one = 0x01010101;
- repeated_c = c | (c << 8);
- repeated_c |= repeated_c << 16;
- if (0xffffffffU < (longword) -1)
- {
- repeated_one |= repeated_one << 31 << 1;
- repeated_c |= repeated_c << 31 << 1;
- if (8 < sizeof (longword))
- {
- size_t i;
-
- for (i = 64; i < sizeof (longword) * 8; i *= 2)
- {
- repeated_one |= repeated_one << i;
- repeated_c |= repeated_c << i;
- }
- }
- }
-
- /* Instead of the traditional loop which tests each byte, we will test a
- longword at a time. The tricky part is testing if *any of the four*
- bytes in the longword in question are equal to c. We first use an xor
- with repeated_c. This reduces the task to testing whether *any of the
- four* bytes in longword1 is zero.
-
- We compute tmp =
- ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7).
- That is, we perform the following operations:
- 1. Subtract repeated_one.
- 2. & ~longword1.
- 3. & a mask consisting of 0x80 in every byte.
- Consider what happens in each byte:
- - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff,
- and step 3 transforms it into 0x80. A carry can also be propagated
- to more significant bytes.
- - If a byte of longword1 is nonzero, let its lowest 1 bit be at
- position k (0 <= k <= 7); so the lowest k bits are 0. After step 1,
- the byte ends in a single bit of value 0 and k bits of value 1.
- After step 2, the result is just k bits of value 1: 2^k - 1. After
- step 3, the result is 0. And no carry is produced.
- So, if longword1 has only non-zero bytes, tmp is zero.
- Whereas if longword1 has a zero byte, call j the position of the least
- significant zero byte. Then the result has a zero at positions 0, ...,
- j-1 and a 0x80 at position j. We cannot predict the result at the more
- significant bytes (positions j+1..3), but it does not matter since we
- already have a non-zero bit at position 8*j+7.
-
- So, the test whether any byte in longword1 is zero is equivalent to
- testing whether tmp is nonzero. */
-
- while (n >= sizeof (longword))
- {
- longword longword1 = *--longword_ptr ^ repeated_c;
-
- if ((((longword1 - repeated_one) & ~longword1)
- & (repeated_one << 7)) != 0)
- {
- longword_ptr++;
- break;
- }
- n -= sizeof (longword);
- }
-
- char_ptr = (const unsigned char *) longword_ptr;
-
- /* At this point, we know that either n < sizeof (longword), or one of the
- sizeof (longword) bytes starting at char_ptr is == c. On little-endian
- machines, we could determine the first such byte without any further
- memory accesses, just by looking at the tmp result from the last loop
- iteration. But this does not work on big-endian machines. Choose code
- that works in both cases. */
-
- while (n-- > 0)
- {
- if (*--char_ptr == c)
- return (void *) char_ptr;
- }
-
- return NULL;
-}
-#ifdef weak_alias
-weak_alias (__memrchr, memrchr)
-#endif
diff --git a/cross/lib/memset_explicit.c b/cross/lib/memset_explicit.c
deleted file mode 100644
index 6d21a5e8797..00000000000
--- a/cross/lib/memset_explicit.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/* Erase sensitive data from memory.
- Copyright 2022-2023 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>
-
-/* memset_s need this define */
-#if HAVE_MEMSET_S
-# define __STDC_WANT_LIB_EXT1__ 1
-#endif
-
-#include <string.h>
-
-/* Set S's bytes to C, where S has LEN bytes. The compiler will not
- optimize effects away, even if S is dead after the call. */
-void *
-memset_explicit (void *s, int c, size_t len)
-{
-#if HAVE_EXPLICIT_MEMSET
- return explicit_memset (s, c, len);
-#elif HAVE_MEMSET_S
- (void) memset_s (s, len, c, len);
- return s;
-#elif defined __GNUC__ && !defined __clang__
- memset (s, c, len);
- /* Compiler barrier. */
- __asm__ volatile ("" ::: "memory");
- return s;
-#elif defined __clang__
- memset (s, c, len);
- /* Compiler barrier. */
- /* With asm ("" ::: "memory") LLVM analyzes uses of 's' and finds that the
- whole thing is dead and eliminates it. Use 'g' to work around this
- problem. See <https://bugs.llvm.org/show_bug.cgi?id=15495#c11>. */
- __asm__ volatile ("" : : "g"(s) : "memory");
- return s;
-#else
- /* Invoke memset through a volatile function pointer. This defeats compiler
- optimizations. */
- void * (* const volatile volatile_memset) (void *, int, size_t) = memset;
- return volatile_memset (s, c, len);
-#endif
-}
diff --git a/cross/lib/min-max.h b/cross/lib/min-max.h
deleted file mode 100644
index 997cdd191eb..00000000000
--- a/cross/lib/min-max.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef min
-# define min(a,b) ((a) < (b) ? (a) : (b))
-#endif
-#ifndef max
-# define max(a,b) ((a) > (b) ? (a) : (b))
-#endif
diff --git a/cross/lib/mini-gmp-gnulib.c b/cross/lib/mini-gmp-gnulib.c
deleted file mode 100644
index b15ce0ff754..00000000000
--- a/cross/lib/mini-gmp-gnulib.c
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Tailor mini-gmp.c for Gnulib-using applications.
-
- Copyright 2018-2023 Free Software Foundation, Inc.
-
- This file is free software.
- It is dual-licensed under "the GNU LGPLv3+ or the GNU GPLv2+".
- You can redistribute it and/or modify it under either
- - the terms of the GNU Lesser General Public License as published
- by the Free Software Foundation, either version 3, or (at your
- option) any later version, or
- - the terms of the GNU General Public License as published by the
- Free Software Foundation; either version 2, or (at your option)
- any later version, or
- - the same dual license "the GNU LGPLv3+ or the GNU GPLv2+".
-
- This file is distributed in the hope that 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 and the GNU General Public License
- for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License and of the GNU General Public License along with this
- program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-#include <stddef.h>
-#include <stdio.h>
-
-#include "mini-gmp.h"
-
-/* Pacify GCC -Wsuggest-attribute=const, pure, malloc. */
-#if 4 < __GNUC__ + (6 <= __GNUC_MINOR__)
-# pragma GCC diagnostic ignored "-Wsuggest-attribute=const"
-# pragma GCC diagnostic ignored "-Wsuggest-attribute=pure"
-#endif
-#if 8 <= __GNUC__
-# pragma GCC diagnostic ignored "-Wsuggest-attribute=malloc"
-#endif
-
-/* Pacify GCC -Wunused-variable for variables used only in 'assert' calls. */
-#if (defined NDEBUG \
- && (4 < __GNUC__ + (6 <= __GNUC_MINOR__) || defined __clang__))
-# pragma GCC diagnostic ignored "-Wunused-variable"
-#endif
-
-#include "mini-gmp.c"
diff --git a/cross/lib/mini-gmp.c b/cross/lib/mini-gmp.c
deleted file mode 100644
index ea037b801dc..00000000000
--- a/cross/lib/mini-gmp.c
+++ /dev/null
@@ -1,4620 +0,0 @@
-/* mini-gmp, a minimalistic implementation of a GNU GMP subset.
-
- Contributed to the GNU project by Niels Möller
- Additional functionalities and improvements by Marco Bodrato.
-
-Copyright 1991-1997, 1999-2022 Free Software Foundation, Inc.
-
-This file is part of the GNU MP Library.
-
-The GNU MP Library is free software; you can redistribute it and/or modify
-it under the terms of either:
-
- * the GNU Lesser General Public License as published by the Free
- Software Foundation; either version 3 of the License, or (at your
- option) any later version.
-
-or
-
- * the GNU General Public License as published by the Free Software
- Foundation; either version 2 of the License, or (at your option) any
- later version.
-
-or both in parallel, as here.
-
-The GNU MP Library is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-for more details.
-
-You should have received copies of the GNU General Public License and the
-GNU Lesser General Public License along with the GNU MP Library. If not,
-see https://www.gnu.org/licenses/. */
-
-/* NOTE: All functions in this file which are not declared in
- mini-gmp.h are internal, and are not intended to be compatible
- with GMP or with future versions of mini-gmp. */
-
-/* Much of the material copied from GMP files, including: gmp-impl.h,
- longlong.h, mpn/generic/add_n.c, mpn/generic/addmul_1.c,
- mpn/generic/lshift.c, mpn/generic/mul_1.c,
- mpn/generic/mul_basecase.c, mpn/generic/rshift.c,
- mpn/generic/sbpi1_div_qr.c, mpn/generic/sub_n.c,
- mpn/generic/submul_1.c. */
-
-#include <assert.h>
-#include <ctype.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "mini-gmp.h"
-
-#if !defined(MINI_GMP_DONT_USE_FLOAT_H)
-#include <float.h>
-#endif
-
-
-/* Macros */
-#define GMP_LIMB_BITS (sizeof(mp_limb_t) * CHAR_BIT)
-
-#define GMP_LIMB_MAX ((mp_limb_t) ~ (mp_limb_t) 0)
-#define GMP_LIMB_HIGHBIT ((mp_limb_t) 1 << (GMP_LIMB_BITS - 1))
-
-#define GMP_HLIMB_BIT ((mp_limb_t) 1 << (GMP_LIMB_BITS / 2))
-#define GMP_LLIMB_MASK (GMP_HLIMB_BIT - 1)
-
-#define GMP_ULONG_BITS (sizeof(unsigned long) * CHAR_BIT)
-#define GMP_ULONG_HIGHBIT ((unsigned long) 1 << (GMP_ULONG_BITS - 1))
-
-#define GMP_ABS(x) ((x) >= 0 ? (x) : -(x))
-#define GMP_NEG_CAST(T,x) (-((T)((x) + 1) - 1))
-
-#define GMP_MIN(a, b) ((a) < (b) ? (a) : (b))
-#define GMP_MAX(a, b) ((a) > (b) ? (a) : (b))
-
-#define GMP_CMP(a,b) (((a) > (b)) - ((a) < (b)))
-
-#if defined(DBL_MANT_DIG) && FLT_RADIX == 2
-#define GMP_DBL_MANT_BITS DBL_MANT_DIG
-#else
-#define GMP_DBL_MANT_BITS (53)
-#endif
-
-/* Return non-zero if xp,xsize and yp,ysize overlap.
- If xp+xsize<=yp there's no overlap, or if yp+ysize<=xp there's no
- overlap. If both these are false, there's an overlap. */
-#define GMP_MPN_OVERLAP_P(xp, xsize, yp, ysize) \
- ((xp) + (xsize) > (yp) && (yp) + (ysize) > (xp))
-
-#define gmp_assert_nocarry(x) do { \
- mp_limb_t __cy = (x); \
- assert (__cy == 0); \
- (void) (__cy); \
- } while (0)
-
-#define gmp_clz(count, x) do { \
- mp_limb_t __clz_x = (x); \
- unsigned __clz_c = 0; \
- int LOCAL_SHIFT_BITS = 8; \
- if (GMP_LIMB_BITS > LOCAL_SHIFT_BITS) \
- for (; \
- (__clz_x & ((mp_limb_t) 0xff << (GMP_LIMB_BITS - 8))) == 0; \
- __clz_c += 8) \
- { __clz_x <<= LOCAL_SHIFT_BITS; } \
- for (; (__clz_x & GMP_LIMB_HIGHBIT) == 0; __clz_c++) \
- __clz_x <<= 1; \
- (count) = __clz_c; \
- } while (0)
-
-#define gmp_ctz(count, x) do { \
- mp_limb_t __ctz_x = (x); \
- unsigned __ctz_c = 0; \
- gmp_clz (__ctz_c, __ctz_x & - __ctz_x); \
- (count) = GMP_LIMB_BITS - 1 - __ctz_c; \
- } while (0)
-
-#define gmp_add_ssaaaa(sh, sl, ah, al, bh, bl) \
- do { \
- mp_limb_t __x; \
- __x = (al) + (bl); \
- (sh) = (ah) + (bh) + (__x < (al)); \
- (sl) = __x; \
- } while (0)
-
-#define gmp_sub_ddmmss(sh, sl, ah, al, bh, bl) \
- do { \
- mp_limb_t __x; \
- __x = (al) - (bl); \
- (sh) = (ah) - (bh) - ((al) < (bl)); \
- (sl) = __x; \
- } while (0)
-
-#define gmp_umul_ppmm(w1, w0, u, v) \
- do { \
- int LOCAL_GMP_LIMB_BITS = GMP_LIMB_BITS; \
- if (sizeof(unsigned int) * CHAR_BIT >= 2 * GMP_LIMB_BITS) \
- { \
- unsigned int __ww = (unsigned int) (u) * (v); \
- w0 = (mp_limb_t) __ww; \
- w1 = (mp_limb_t) (__ww >> LOCAL_GMP_LIMB_BITS); \
- } \
- else if (GMP_ULONG_BITS >= 2 * GMP_LIMB_BITS) \
- { \
- unsigned long int __ww = (unsigned long int) (u) * (v); \
- w0 = (mp_limb_t) __ww; \
- w1 = (mp_limb_t) (__ww >> LOCAL_GMP_LIMB_BITS); \
- } \
- else { \
- mp_limb_t __x0, __x1, __x2, __x3; \
- unsigned __ul, __vl, __uh, __vh; \
- mp_limb_t __u = (u), __v = (v); \
- assert (sizeof (unsigned) * 2 >= sizeof (mp_limb_t)); \
- \
- __ul = __u & GMP_LLIMB_MASK; \
- __uh = __u >> (GMP_LIMB_BITS / 2); \
- __vl = __v & GMP_LLIMB_MASK; \
- __vh = __v >> (GMP_LIMB_BITS / 2); \
- \
- __x0 = (mp_limb_t) __ul * __vl; \
- __x1 = (mp_limb_t) __ul * __vh; \
- __x2 = (mp_limb_t) __uh * __vl; \
- __x3 = (mp_limb_t) __uh * __vh; \
- \
- __x1 += __x0 >> (GMP_LIMB_BITS / 2);/* this can't give carry */ \
- __x1 += __x2; /* but this indeed can */ \
- if (__x1 < __x2) /* did we get it? */ \
- __x3 += GMP_HLIMB_BIT; /* yes, add it in the proper pos. */ \
- \
- (w1) = __x3 + (__x1 >> (GMP_LIMB_BITS / 2)); \
- (w0) = (__x1 << (GMP_LIMB_BITS / 2)) + (__x0 & GMP_LLIMB_MASK); \
- } \
- } while (0)
-
-#define gmp_udiv_qrnnd_preinv(q, r, nh, nl, d, di) \
- do { \
- mp_limb_t _qh, _ql, _r, _mask; \
- gmp_umul_ppmm (_qh, _ql, (nh), (di)); \
- gmp_add_ssaaaa (_qh, _ql, _qh, _ql, (nh) + 1, (nl)); \
- _r = (nl) - _qh * (d); \
- _mask = -(mp_limb_t) (_r > _ql); /* both > and >= are OK */ \
- _qh += _mask; \
- _r += _mask & (d); \
- if (_r >= (d)) \
- { \
- _r -= (d); \
- _qh++; \
- } \
- \
- (r) = _r; \
- (q) = _qh; \
- } while (0)
-
-#define gmp_udiv_qr_3by2(q, r1, r0, n2, n1, n0, d1, d0, dinv) \
- do { \
- mp_limb_t _q0, _t1, _t0, _mask; \
- gmp_umul_ppmm ((q), _q0, (n2), (dinv)); \
- gmp_add_ssaaaa ((q), _q0, (q), _q0, (n2), (n1)); \
- \
- /* Compute the two most significant limbs of n - q'd */ \
- (r1) = (n1) - (d1) * (q); \
- gmp_sub_ddmmss ((r1), (r0), (r1), (n0), (d1), (d0)); \
- gmp_umul_ppmm (_t1, _t0, (d0), (q)); \
- gmp_sub_ddmmss ((r1), (r0), (r1), (r0), _t1, _t0); \
- (q)++; \
- \
- /* Conditionally adjust q and the remainders */ \
- _mask = - (mp_limb_t) ((r1) >= _q0); \
- (q) += _mask; \
- gmp_add_ssaaaa ((r1), (r0), (r1), (r0), _mask & (d1), _mask & (d0)); \
- if ((r1) >= (d1)) \
- { \
- if ((r1) > (d1) || (r0) >= (d0)) \
- { \
- (q)++; \
- gmp_sub_ddmmss ((r1), (r0), (r1), (r0), (d1), (d0)); \
- } \
- } \
- } while (0)
-
-/* Swap macros. */
-#define MP_LIMB_T_SWAP(x, y) \
- do { \
- mp_limb_t __mp_limb_t_swap__tmp = (x); \
- (x) = (y); \
- (y) = __mp_limb_t_swap__tmp; \
- } while (0)
-#define MP_SIZE_T_SWAP(x, y) \
- do { \
- mp_size_t __mp_size_t_swap__tmp = (x); \
- (x) = (y); \
- (y) = __mp_size_t_swap__tmp; \
- } while (0)
-#define MP_BITCNT_T_SWAP(x,y) \
- do { \
- mp_bitcnt_t __mp_bitcnt_t_swap__tmp = (x); \
- (x) = (y); \
- (y) = __mp_bitcnt_t_swap__tmp; \
- } while (0)
-#define MP_PTR_SWAP(x, y) \
- do { \
- mp_ptr __mp_ptr_swap__tmp = (x); \
- (x) = (y); \
- (y) = __mp_ptr_swap__tmp; \
- } while (0)
-#define MP_SRCPTR_SWAP(x, y) \
- do { \
- mp_srcptr __mp_srcptr_swap__tmp = (x); \
- (x) = (y); \
- (y) = __mp_srcptr_swap__tmp; \
- } while (0)
-
-#define MPN_PTR_SWAP(xp,xs, yp,ys) \
- do { \
- MP_PTR_SWAP (xp, yp); \
- MP_SIZE_T_SWAP (xs, ys); \
- } while(0)
-#define MPN_SRCPTR_SWAP(xp,xs, yp,ys) \
- do { \
- MP_SRCPTR_SWAP (xp, yp); \
- MP_SIZE_T_SWAP (xs, ys); \
- } while(0)
-
-#define MPZ_PTR_SWAP(x, y) \
- do { \
- mpz_ptr __mpz_ptr_swap__tmp = (x); \
- (x) = (y); \
- (y) = __mpz_ptr_swap__tmp; \
- } while (0)
-#define MPZ_SRCPTR_SWAP(x, y) \
- do { \
- mpz_srcptr __mpz_srcptr_swap__tmp = (x); \
- (x) = (y); \
- (y) = __mpz_srcptr_swap__tmp; \
- } while (0)
-
-const int mp_bits_per_limb = GMP_LIMB_BITS;
-
-
-/* Memory allocation and other helper functions. */
-static void
-gmp_die (const char *msg)
-{
- fprintf (stderr, "%s\n", msg);
- abort();
-}
-
-static void *
-gmp_default_alloc (size_t size)
-{
- void *p;
-
- assert (size > 0);
-
- p = malloc (size);
- if (!p)
- gmp_die("gmp_default_alloc: Virtual memory exhausted.");
-
- return p;
-}
-
-static void *
-gmp_default_realloc (void *old, size_t unused_old_size, size_t new_size)
-{
- void * p;
-
- p = realloc (old, new_size);
-
- if (!p)
- gmp_die("gmp_default_realloc: Virtual memory exhausted.");
-
- return p;
-}
-
-static void
-gmp_default_free (void *p, size_t unused_size)
-{
- free (p);
-}
-
-static void * (*gmp_allocate_func) (size_t) = gmp_default_alloc;
-static void * (*gmp_reallocate_func) (void *, size_t, size_t) = gmp_default_realloc;
-static void (*gmp_free_func) (void *, size_t) = gmp_default_free;
-
-void
-mp_get_memory_functions (void *(**alloc_func) (size_t),
- void *(**realloc_func) (void *, size_t, size_t),
- void (**free_func) (void *, size_t))
-{
- if (alloc_func)
- *alloc_func = gmp_allocate_func;
-
- if (realloc_func)
- *realloc_func = gmp_reallocate_func;
-
- if (free_func)
- *free_func = gmp_free_func;
-}
-
-void
-mp_set_memory_functions (void *(*alloc_func) (size_t),
- void *(*realloc_func) (void *, size_t, size_t),
- void (*free_func) (void *, size_t))
-{
- if (!alloc_func)
- alloc_func = gmp_default_alloc;
- if (!realloc_func)
- realloc_func = gmp_default_realloc;
- if (!free_func)
- free_func = gmp_default_free;
-
- gmp_allocate_func = alloc_func;
- gmp_reallocate_func = realloc_func;
- gmp_free_func = free_func;
-}
-
-#define gmp_alloc(size) ((*gmp_allocate_func)((size)))
-#define gmp_free(p, size) ((*gmp_free_func) ((p), (size)))
-#define gmp_realloc(ptr, old_size, size) ((*gmp_reallocate_func)(ptr, old_size, size))
-
-static mp_ptr
-gmp_alloc_limbs (mp_size_t size)
-{
- return (mp_ptr) gmp_alloc (size * sizeof (mp_limb_t));
-}
-
-static mp_ptr
-gmp_realloc_limbs (mp_ptr old, mp_size_t old_size, mp_size_t size)
-{
- assert (size > 0);
- return (mp_ptr) gmp_realloc (old, old_size * sizeof (mp_limb_t), size * sizeof (mp_limb_t));
-}
-
-static void
-gmp_free_limbs (mp_ptr old, mp_size_t size)
-{
- gmp_free (old, size * sizeof (mp_limb_t));
-}
-
-
-/* MPN interface */
-
-void
-mpn_copyi (mp_ptr d, mp_srcptr s, mp_size_t n)
-{
- mp_size_t i;
- for (i = 0; i < n; i++)
- d[i] = s[i];
-}
-
-void
-mpn_copyd (mp_ptr d, mp_srcptr s, mp_size_t n)
-{
- while (--n >= 0)
- d[n] = s[n];
-}
-
-int
-mpn_cmp (mp_srcptr ap, mp_srcptr bp, mp_size_t n)
-{
- while (--n >= 0)
- {
- if (ap[n] != bp[n])
- return ap[n] > bp[n] ? 1 : -1;
- }
- return 0;
-}
-
-static int
-mpn_cmp4 (mp_srcptr ap, mp_size_t an, mp_srcptr bp, mp_size_t bn)
-{
- if (an != bn)
- return an < bn ? -1 : 1;
- else
- return mpn_cmp (ap, bp, an);
-}
-
-static mp_size_t
-mpn_normalized_size (mp_srcptr xp, mp_size_t n)
-{
- while (n > 0 && xp[n-1] == 0)
- --n;
- return n;
-}
-
-int
-mpn_zero_p(mp_srcptr rp, mp_size_t n)
-{
- return mpn_normalized_size (rp, n) == 0;
-}
-
-void
-mpn_zero (mp_ptr rp, mp_size_t n)
-{
- while (--n >= 0)
- rp[n] = 0;
-}
-
-mp_limb_t
-mpn_add_1 (mp_ptr rp, mp_srcptr ap, mp_size_t n, mp_limb_t b)
-{
- mp_size_t i;
-
- assert (n > 0);
- i = 0;
- do
- {
- mp_limb_t r = ap[i] + b;
- /* Carry out */
- b = (r < b);
- rp[i] = r;
- }
- while (++i < n);
-
- return b;
-}
-
-mp_limb_t
-mpn_add_n (mp_ptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n)
-{
- mp_size_t i;
- mp_limb_t cy;
-
- for (i = 0, cy = 0; i < n; i++)
- {
- mp_limb_t a, b, r;
- a = ap[i]; b = bp[i];
- r = a + cy;
- cy = (r < cy);
- r += b;
- cy += (r < b);
- rp[i] = r;
- }
- return cy;
-}
-
-mp_limb_t
-mpn_add (mp_ptr rp, mp_srcptr ap, mp_size_t an, mp_srcptr bp, mp_size_t bn)
-{
- mp_limb_t cy;
-
- assert (an >= bn);
-
- cy = mpn_add_n (rp, ap, bp, bn);
- if (an > bn)
- cy = mpn_add_1 (rp + bn, ap + bn, an - bn, cy);
- return cy;
-}
-
-mp_limb_t
-mpn_sub_1 (mp_ptr rp, mp_srcptr ap, mp_size_t n, mp_limb_t b)
-{
- mp_size_t i;
-
- assert (n > 0);
-
- i = 0;
- do
- {
- mp_limb_t a = ap[i];
- /* Carry out */
- mp_limb_t cy = a < b;
- rp[i] = a - b;
- b = cy;
- }
- while (++i < n);
-
- return b;
-}
-
-mp_limb_t
-mpn_sub_n (mp_ptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n)
-{
- mp_size_t i;
- mp_limb_t cy;
-
- for (i = 0, cy = 0; i < n; i++)
- {
- mp_limb_t a, b;
- a = ap[i]; b = bp[i];
- b += cy;
- cy = (b < cy);
- cy += (a < b);
- rp[i] = a - b;
- }
- return cy;
-}
-
-mp_limb_t
-mpn_sub (mp_ptr rp, mp_srcptr ap, mp_size_t an, mp_srcptr bp, mp_size_t bn)
-{
- mp_limb_t cy;
-
- assert (an >= bn);
-
- cy = mpn_sub_n (rp, ap, bp, bn);
- if (an > bn)
- cy = mpn_sub_1 (rp + bn, ap + bn, an - bn, cy);
- return cy;
-}
-
-mp_limb_t
-mpn_mul_1 (mp_ptr rp, mp_srcptr up, mp_size_t n, mp_limb_t vl)
-{
- mp_limb_t ul, cl, hpl, lpl;
-
- assert (n >= 1);
-
- cl = 0;
- do
- {
- ul = *up++;
- gmp_umul_ppmm (hpl, lpl, ul, vl);
-
- lpl += cl;
- cl = (lpl < cl) + hpl;
-
- *rp++ = lpl;
- }
- while (--n != 0);
-
- return cl;
-}
-
-mp_limb_t
-mpn_addmul_1 (mp_ptr rp, mp_srcptr up, mp_size_t n, mp_limb_t vl)
-{
- mp_limb_t ul, cl, hpl, lpl, rl;
-
- assert (n >= 1);
-
- cl = 0;
- do
- {
- ul = *up++;
- gmp_umul_ppmm (hpl, lpl, ul, vl);
-
- lpl += cl;
- cl = (lpl < cl) + hpl;
-
- rl = *rp;
- lpl = rl + lpl;
- cl += lpl < rl;
- *rp++ = lpl;
- }
- while (--n != 0);
-
- return cl;
-}
-
-mp_limb_t
-mpn_submul_1 (mp_ptr rp, mp_srcptr up, mp_size_t n, mp_limb_t vl)
-{
- mp_limb_t ul, cl, hpl, lpl, rl;
-
- assert (n >= 1);
-
- cl = 0;
- do
- {
- ul = *up++;
- gmp_umul_ppmm (hpl, lpl, ul, vl);
-
- lpl += cl;
- cl = (lpl < cl) + hpl;
-
- rl = *rp;
- lpl = rl - lpl;
- cl += lpl > rl;
- *rp++ = lpl;
- }
- while (--n != 0);
-
- return cl;
-}
-
-mp_limb_t
-mpn_mul (mp_ptr rp, mp_srcptr up, mp_size_t un, mp_srcptr vp, mp_size_t vn)
-{
- assert (un >= vn);
- assert (vn >= 1);
- assert (!GMP_MPN_OVERLAP_P(rp, un + vn, up, un));
- assert (!GMP_MPN_OVERLAP_P(rp, un + vn, vp, vn));
-
- /* We first multiply by the low order limb. This result can be
- stored, not added, to rp. We also avoid a loop for zeroing this
- way. */
-
- rp[un] = mpn_mul_1 (rp, up, un, vp[0]);
-
- /* Now accumulate the product of up[] and the next higher limb from
- vp[]. */
-
- while (--vn >= 1)
- {
- rp += 1, vp += 1;
- rp[un] = mpn_addmul_1 (rp, up, un, vp[0]);
- }
- return rp[un];
-}
-
-void
-mpn_mul_n (mp_ptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n)
-{
- mpn_mul (rp, ap, n, bp, n);
-}
-
-void
-mpn_sqr (mp_ptr rp, mp_srcptr ap, mp_size_t n)
-{
- mpn_mul (rp, ap, n, ap, n);
-}
-
-mp_limb_t
-mpn_lshift (mp_ptr rp, mp_srcptr up, mp_size_t n, unsigned int cnt)
-{
- mp_limb_t high_limb, low_limb;
- unsigned int tnc;
- mp_limb_t retval;
-
- assert (n >= 1);
- assert (cnt >= 1);
- assert (cnt < GMP_LIMB_BITS);
-
- up += n;
- rp += n;
-
- tnc = GMP_LIMB_BITS - cnt;
- low_limb = *--up;
- retval = low_limb >> tnc;
- high_limb = (low_limb << cnt);
-
- while (--n != 0)
- {
- low_limb = *--up;
- *--rp = high_limb | (low_limb >> tnc);
- high_limb = (low_limb << cnt);
- }
- *--rp = high_limb;
-
- return retval;
-}
-
-mp_limb_t
-mpn_rshift (mp_ptr rp, mp_srcptr up, mp_size_t n, unsigned int cnt)
-{
- mp_limb_t high_limb, low_limb;
- unsigned int tnc;
- mp_limb_t retval;
-
- assert (n >= 1);
- assert (cnt >= 1);
- assert (cnt < GMP_LIMB_BITS);
-
- tnc = GMP_LIMB_BITS - cnt;
- high_limb = *up++;
- retval = (high_limb << tnc);
- low_limb = high_limb >> cnt;
-
- while (--n != 0)
- {
- high_limb = *up++;
- *rp++ = low_limb | (high_limb << tnc);
- low_limb = high_limb >> cnt;
- }
- *rp = low_limb;
-
- return retval;
-}
-
-static mp_bitcnt_t
-mpn_common_scan (mp_limb_t limb, mp_size_t i, mp_srcptr up, mp_size_t un,
- mp_limb_t ux)
-{
- unsigned cnt;
-
- assert (ux == 0 || ux == GMP_LIMB_MAX);
- assert (0 <= i && i <= un );
-
- while (limb == 0)
- {
- i++;
- if (i == un)
- return (ux == 0 ? ~(mp_bitcnt_t) 0 : un * GMP_LIMB_BITS);
- limb = ux ^ up[i];
- }
- gmp_ctz (cnt, limb);
- return (mp_bitcnt_t) i * GMP_LIMB_BITS + cnt;
-}
-
-mp_bitcnt_t
-mpn_scan1 (mp_srcptr ptr, mp_bitcnt_t bit)
-{
- mp_size_t i;
- i = bit / GMP_LIMB_BITS;
-
- return mpn_common_scan ( ptr[i] & (GMP_LIMB_MAX << (bit % GMP_LIMB_BITS)),
- i, ptr, i, 0);
-}
-
-mp_bitcnt_t
-mpn_scan0 (mp_srcptr ptr, mp_bitcnt_t bit)
-{
- mp_size_t i;
- i = bit / GMP_LIMB_BITS;
-
- return mpn_common_scan (~ptr[i] & (GMP_LIMB_MAX << (bit % GMP_LIMB_BITS)),
- i, ptr, i, GMP_LIMB_MAX);
-}
-
-void
-mpn_com (mp_ptr rp, mp_srcptr up, mp_size_t n)
-{
- while (--n >= 0)
- *rp++ = ~ *up++;
-}
-
-mp_limb_t
-mpn_neg (mp_ptr rp, mp_srcptr up, mp_size_t n)
-{
- while (*up == 0)
- {
- *rp = 0;
- if (!--n)
- return 0;
- ++up; ++rp;
- }
- *rp = - *up;
- mpn_com (++rp, ++up, --n);
- return 1;
-}
-
-
-/* MPN division interface. */
-
-/* The 3/2 inverse is defined as
-
- m = floor( (B^3-1) / (B u1 + u0)) - B
-*/
-mp_limb_t
-mpn_invert_3by2 (mp_limb_t u1, mp_limb_t u0)
-{
- mp_limb_t r, m;
-
- {
- mp_limb_t p, ql;
- unsigned ul, uh, qh;
-
- assert (sizeof (unsigned) * 2 >= sizeof (mp_limb_t));
- /* For notation, let b denote the half-limb base, so that B = b^2.
- Split u1 = b uh + ul. */
- ul = u1 & GMP_LLIMB_MASK;
- uh = u1 >> (GMP_LIMB_BITS / 2);
-
- /* Approximation of the high half of quotient. Differs from the 2/1
- inverse of the half limb uh, since we have already subtracted
- u0. */
- qh = (u1 ^ GMP_LIMB_MAX) / uh;
-
- /* Adjust to get a half-limb 3/2 inverse, i.e., we want
-
- qh' = floor( (b^3 - 1) / u) - b = floor ((b^3 - b u - 1) / u
- = floor( (b (~u) + b-1) / u),
-
- and the remainder
-
- r = b (~u) + b-1 - qh (b uh + ul)
- = b (~u - qh uh) + b-1 - qh ul
-
- Subtraction of qh ul may underflow, which implies adjustments.
- But by normalization, 2 u >= B > qh ul, so we need to adjust by
- at most 2.
- */
-
- r = ((~u1 - (mp_limb_t) qh * uh) << (GMP_LIMB_BITS / 2)) | GMP_LLIMB_MASK;
-
- p = (mp_limb_t) qh * ul;
- /* Adjustment steps taken from udiv_qrnnd_c */
- if (r < p)
- {
- qh--;
- r += u1;
- if (r >= u1) /* i.e. we didn't get carry when adding to r */
- if (r < p)
- {
- qh--;
- r += u1;
- }
- }
- r -= p;
-
- /* Low half of the quotient is
-
- ql = floor ( (b r + b-1) / u1).
-
- This is a 3/2 division (on half-limbs), for which qh is a
- suitable inverse. */
-
- p = (r >> (GMP_LIMB_BITS / 2)) * qh + r;
- /* Unlike full-limb 3/2, we can add 1 without overflow. For this to
- work, it is essential that ql is a full mp_limb_t. */
- ql = (p >> (GMP_LIMB_BITS / 2)) + 1;
-
- /* By the 3/2 trick, we don't need the high half limb. */
- r = (r << (GMP_LIMB_BITS / 2)) + GMP_LLIMB_MASK - ql * u1;
-
- if (r >= (GMP_LIMB_MAX & (p << (GMP_LIMB_BITS / 2))))
- {
- ql--;
- r += u1;
- }
- m = ((mp_limb_t) qh << (GMP_LIMB_BITS / 2)) + ql;
- if (r >= u1)
- {
- m++;
- r -= u1;
- }
- }
-
- /* Now m is the 2/1 inverse of u1. If u0 > 0, adjust it to become a
- 3/2 inverse. */
- if (u0 > 0)
- {
- mp_limb_t th, tl;
- r = ~r;
- r += u0;
- if (r < u0)
- {
- m--;
- if (r >= u1)
- {
- m--;
- r -= u1;
- }
- r -= u1;
- }
- gmp_umul_ppmm (th, tl, u0, m);
- r += th;
- if (r < th)
- {
- m--;
- m -= ((r > u1) | ((r == u1) & (tl > u0)));
- }
- }
-
- return m;
-}
-
-struct gmp_div_inverse
-{
- /* Normalization shift count. */
- unsigned shift;
- /* Normalized divisor (d0 unused for mpn_div_qr_1) */
- mp_limb_t d1, d0;
- /* Inverse, for 2/1 or 3/2. */
- mp_limb_t di;
-};
-
-static void
-mpn_div_qr_1_invert (struct gmp_div_inverse *inv, mp_limb_t d)
-{
- unsigned shift;
-
- assert (d > 0);
- gmp_clz (shift, d);
- inv->shift = shift;
- inv->d1 = d << shift;
- inv->di = mpn_invert_limb (inv->d1);
-}
-
-static void
-mpn_div_qr_2_invert (struct gmp_div_inverse *inv,
- mp_limb_t d1, mp_limb_t d0)
-{
- unsigned shift;
-
- assert (d1 > 0);
- gmp_clz (shift, d1);
- inv->shift = shift;
- if (shift > 0)
- {
- d1 = (d1 << shift) | (d0 >> (GMP_LIMB_BITS - shift));
- d0 <<= shift;
- }
- inv->d1 = d1;
- inv->d0 = d0;
- inv->di = mpn_invert_3by2 (d1, d0);
-}
-
-static void
-mpn_div_qr_invert (struct gmp_div_inverse *inv,
- mp_srcptr dp, mp_size_t dn)
-{
- assert (dn > 0);
-
- if (dn == 1)
- mpn_div_qr_1_invert (inv, dp[0]);
- else if (dn == 2)
- mpn_div_qr_2_invert (inv, dp[1], dp[0]);
- else
- {
- unsigned shift;
- mp_limb_t d1, d0;
-
- d1 = dp[dn-1];
- d0 = dp[dn-2];
- assert (d1 > 0);
- gmp_clz (shift, d1);
- inv->shift = shift;
- if (shift > 0)
- {
- d1 = (d1 << shift) | (d0 >> (GMP_LIMB_BITS - shift));
- d0 = (d0 << shift) | (dp[dn-3] >> (GMP_LIMB_BITS - shift));
- }
- inv->d1 = d1;
- inv->d0 = d0;
- inv->di = mpn_invert_3by2 (d1, d0);
- }
-}
-
-/* Not matching current public gmp interface, rather corresponding to
- the sbpi1_div_* functions. */
-static mp_limb_t
-mpn_div_qr_1_preinv (mp_ptr qp, mp_srcptr np, mp_size_t nn,
- const struct gmp_div_inverse *inv)
-{
- mp_limb_t d, di;
- mp_limb_t r;
- mp_ptr tp = NULL;
- mp_size_t tn = 0;
-
- if (inv->shift > 0)
- {
- /* Shift, reusing qp area if possible. In-place shift if qp == np. */
- tp = qp;
- if (!tp)
- {
- tn = nn;
- tp = gmp_alloc_limbs (tn);
- }
- r = mpn_lshift (tp, np, nn, inv->shift);
- np = tp;
- }
- else
- r = 0;
-
- d = inv->d1;
- di = inv->di;
- while (--nn >= 0)
- {
- mp_limb_t q;
-
- gmp_udiv_qrnnd_preinv (q, r, r, np[nn], d, di);
- if (qp)
- qp[nn] = q;
- }
- if (tn)
- gmp_free_limbs (tp, tn);
-
- return r >> inv->shift;
-}
-
-static void
-mpn_div_qr_2_preinv (mp_ptr qp, mp_ptr np, mp_size_t nn,
- const struct gmp_div_inverse *inv)
-{
- unsigned shift;
- mp_size_t i;
- mp_limb_t d1, d0, di, r1, r0;
-
- assert (nn >= 2);
- shift = inv->shift;
- d1 = inv->d1;
- d0 = inv->d0;
- di = inv->di;
-
- if (shift > 0)
- r1 = mpn_lshift (np, np, nn, shift);
- else
- r1 = 0;
-
- r0 = np[nn - 1];
-
- i = nn - 2;
- do
- {
- mp_limb_t n0, q;
- n0 = np[i];
- gmp_udiv_qr_3by2 (q, r1, r0, r1, r0, n0, d1, d0, di);
-
- if (qp)
- qp[i] = q;
- }
- while (--i >= 0);
-
- if (shift > 0)
- {
- assert ((r0 & (GMP_LIMB_MAX >> (GMP_LIMB_BITS - shift))) == 0);
- r0 = (r0 >> shift) | (r1 << (GMP_LIMB_BITS - shift));
- r1 >>= shift;
- }
-
- np[1] = r1;
- np[0] = r0;
-}
-
-static void
-mpn_div_qr_pi1 (mp_ptr qp,
- mp_ptr np, mp_size_t nn, mp_limb_t n1,
- mp_srcptr dp, mp_size_t dn,
- mp_limb_t dinv)
-{
- mp_size_t i;
-
- mp_limb_t d1, d0;
- mp_limb_t cy, cy1;
- mp_limb_t q;
-
- assert (dn > 2);
- assert (nn >= dn);
-
- d1 = dp[dn - 1];
- d0 = dp[dn - 2];
-
- assert ((d1 & GMP_LIMB_HIGHBIT) != 0);
- /* Iteration variable is the index of the q limb.
- *
- * We divide <n1, np[dn-1+i], np[dn-2+i], np[dn-3+i],..., np[i]>
- * by <d1, d0, dp[dn-3], ..., dp[0] >
- */
-
- i = nn - dn;
- do
- {
- mp_limb_t n0 = np[dn-1+i];
-
- if (n1 == d1 && n0 == d0)
- {
- q = GMP_LIMB_MAX;
- mpn_submul_1 (np+i, dp, dn, q);
- n1 = np[dn-1+i]; /* update n1, last loop's value will now be invalid */
- }
- else
- {
- gmp_udiv_qr_3by2 (q, n1, n0, n1, n0, np[dn-2+i], d1, d0, dinv);
-
- cy = mpn_submul_1 (np + i, dp, dn-2, q);
-
- cy1 = n0 < cy;
- n0 = n0 - cy;
- cy = n1 < cy1;
- n1 = n1 - cy1;
- np[dn-2+i] = n0;
-
- if (cy != 0)
- {
- n1 += d1 + mpn_add_n (np + i, np + i, dp, dn - 1);
- q--;
- }
- }
-
- if (qp)
- qp[i] = q;
- }
- while (--i >= 0);
-
- np[dn - 1] = n1;
-}
-
-static void
-mpn_div_qr_preinv (mp_ptr qp, mp_ptr np, mp_size_t nn,
- mp_srcptr dp, mp_size_t dn,
- const struct gmp_div_inverse *inv)
-{
- assert (dn > 0);
- assert (nn >= dn);
-
- if (dn == 1)
- np[0] = mpn_div_qr_1_preinv (qp, np, nn, inv);
- else if (dn == 2)
- mpn_div_qr_2_preinv (qp, np, nn, inv);
- else
- {
- mp_limb_t nh;
- unsigned shift;
-
- assert (inv->d1 == dp[dn-1]);
- assert (inv->d0 == dp[dn-2]);
- assert ((inv->d1 & GMP_LIMB_HIGHBIT) != 0);
-
- shift = inv->shift;
- if (shift > 0)
- nh = mpn_lshift (np, np, nn, shift);
- else
- nh = 0;
-
- mpn_div_qr_pi1 (qp, np, nn, nh, dp, dn, inv->di);
-
- if (shift > 0)
- gmp_assert_nocarry (mpn_rshift (np, np, dn, shift));
- }
-}
-
-static void
-mpn_div_qr (mp_ptr qp, mp_ptr np, mp_size_t nn, mp_srcptr dp, mp_size_t dn)
-{
- struct gmp_div_inverse inv;
- mp_ptr tp = NULL;
-
- assert (dn > 0);
- assert (nn >= dn);
-
- mpn_div_qr_invert (&inv, dp, dn);
- if (dn > 2 && inv.shift > 0)
- {
- tp = gmp_alloc_limbs (dn);
- gmp_assert_nocarry (mpn_lshift (tp, dp, dn, inv.shift));
- dp = tp;
- }
- mpn_div_qr_preinv (qp, np, nn, dp, dn, &inv);
- if (tp)
- gmp_free_limbs (tp, dn);
-}
-
-
-/* MPN base conversion. */
-static unsigned
-mpn_base_power_of_two_p (unsigned b)
-{
- switch (b)
- {
- case 2: return 1;
- case 4: return 2;
- case 8: return 3;
- case 16: return 4;
- case 32: return 5;
- case 64: return 6;
- case 128: return 7;
- case 256: return 8;
- default: return 0;
- }
-}
-
-struct mpn_base_info
-{
- /* bb is the largest power of the base which fits in one limb, and
- exp is the corresponding exponent. */
- unsigned exp;
- mp_limb_t bb;
-};
-
-static void
-mpn_get_base_info (struct mpn_base_info *info, mp_limb_t b)
-{
- mp_limb_t m;
- mp_limb_t p;
- unsigned exp;
-
- m = GMP_LIMB_MAX / b;
- for (exp = 1, p = b; p <= m; exp++)
- p *= b;
-
- info->exp = exp;
- info->bb = p;
-}
-
-static mp_bitcnt_t
-mpn_limb_size_in_base_2 (mp_limb_t u)
-{
- unsigned shift;
-
- assert (u > 0);
- gmp_clz (shift, u);
- return GMP_LIMB_BITS - shift;
-}
-
-static size_t
-mpn_get_str_bits (unsigned char *sp, unsigned bits, mp_srcptr up, mp_size_t un)
-{
- unsigned char mask;
- size_t sn, j;
- mp_size_t i;
- unsigned shift;
-
- sn = ((un - 1) * GMP_LIMB_BITS + mpn_limb_size_in_base_2 (up[un-1])
- + bits - 1) / bits;
-
- mask = (1U << bits) - 1;
-
- for (i = 0, j = sn, shift = 0; j-- > 0;)
- {
- unsigned char digit = up[i] >> shift;
-
- shift += bits;
-
- if (shift >= GMP_LIMB_BITS && ++i < un)
- {
- shift -= GMP_LIMB_BITS;
- digit |= up[i] << (bits - shift);
- }
- sp[j] = digit & mask;
- }
- return sn;
-}
-
-/* We generate digits from the least significant end, and reverse at
- the end. */
-static size_t
-mpn_limb_get_str (unsigned char *sp, mp_limb_t w,
- const struct gmp_div_inverse *binv)
-{
- mp_size_t i;
- for (i = 0; w > 0; i++)
- {
- mp_limb_t h, l, r;
-
- h = w >> (GMP_LIMB_BITS - binv->shift);
- l = w << binv->shift;
-
- gmp_udiv_qrnnd_preinv (w, r, h, l, binv->d1, binv->di);
- assert ((r & (GMP_LIMB_MAX >> (GMP_LIMB_BITS - binv->shift))) == 0);
- r >>= binv->shift;
-
- sp[i] = r;
- }
- return i;
-}
-
-static size_t
-mpn_get_str_other (unsigned char *sp,
- int base, const struct mpn_base_info *info,
- mp_ptr up, mp_size_t un)
-{
- struct gmp_div_inverse binv;
- size_t sn;
- size_t i;
-
- mpn_div_qr_1_invert (&binv, base);
-
- sn = 0;
-
- if (un > 1)
- {
- struct gmp_div_inverse bbinv;
- mpn_div_qr_1_invert (&bbinv, info->bb);
-
- do
- {
- mp_limb_t w;
- size_t done;
- w = mpn_div_qr_1_preinv (up, up, un, &bbinv);
- un -= (up[un-1] == 0);
- done = mpn_limb_get_str (sp + sn, w, &binv);
-
- for (sn += done; done < info->exp; done++)
- sp[sn++] = 0;
- }
- while (un > 1);
- }
- sn += mpn_limb_get_str (sp + sn, up[0], &binv);
-
- /* Reverse order */
- for (i = 0; 2*i + 1 < sn; i++)
- {
- unsigned char t = sp[i];
- sp[i] = sp[sn - i - 1];
- sp[sn - i - 1] = t;
- }
-
- return sn;
-}
-
-size_t
-mpn_get_str (unsigned char *sp, int base, mp_ptr up, mp_size_t un)
-{
- unsigned bits;
-
- assert (un > 0);
- assert (up[un-1] > 0);
-
- bits = mpn_base_power_of_two_p (base);
- if (bits)
- return mpn_get_str_bits (sp, bits, up, un);
- else
- {
- struct mpn_base_info info;
-
- mpn_get_base_info (&info, base);
- return mpn_get_str_other (sp, base, &info, up, un);
- }
-}
-
-static mp_size_t
-mpn_set_str_bits (mp_ptr rp, const unsigned char *sp, size_t sn,
- unsigned bits)
-{
- mp_size_t rn;
- mp_limb_t limb;
- unsigned shift;
-
- for (limb = 0, rn = 0, shift = 0; sn-- > 0; )
- {
- limb |= (mp_limb_t) sp[sn] << shift;
- shift += bits;
- if (shift >= GMP_LIMB_BITS)
- {
- shift -= GMP_LIMB_BITS;
- rp[rn++] = limb;
- /* Next line is correct also if shift == 0,
- bits == 8, and mp_limb_t == unsigned char. */
- limb = (unsigned int) sp[sn] >> (bits - shift);
- }
- }
- if (limb != 0)
- rp[rn++] = limb;
- else
- rn = mpn_normalized_size (rp, rn);
- return rn;
-}
-
-/* Result is usually normalized, except for all-zero input, in which
- case a single zero limb is written at *RP, and 1 is returned. */
-static mp_size_t
-mpn_set_str_other (mp_ptr rp, const unsigned char *sp, size_t sn,
- mp_limb_t b, const struct mpn_base_info *info)
-{
- mp_size_t rn;
- mp_limb_t w;
- unsigned k;
- size_t j;
-
- assert (sn > 0);
-
- k = 1 + (sn - 1) % info->exp;
-
- j = 0;
- w = sp[j++];
- while (--k != 0)
- w = w * b + sp[j++];
-
- rp[0] = w;
-
- for (rn = 1; j < sn;)
- {
- mp_limb_t cy;
-
- w = sp[j++];
- for (k = 1; k < info->exp; k++)
- w = w * b + sp[j++];
-
- cy = mpn_mul_1 (rp, rp, rn, info->bb);
- cy += mpn_add_1 (rp, rp, rn, w);
- if (cy > 0)
- rp[rn++] = cy;
- }
- assert (j == sn);
-
- return rn;
-}
-
-mp_size_t
-mpn_set_str (mp_ptr rp, const unsigned char *sp, size_t sn, int base)
-{
- unsigned bits;
-
- if (sn == 0)
- return 0;
-
- bits = mpn_base_power_of_two_p (base);
- if (bits)
- return mpn_set_str_bits (rp, sp, sn, bits);
- else
- {
- struct mpn_base_info info;
-
- mpn_get_base_info (&info, base);
- return mpn_set_str_other (rp, sp, sn, base, &info);
- }
-}
-
-
-/* MPZ interface */
-void
-mpz_init (mpz_t r)
-{
- static const mp_limb_t dummy_limb = GMP_LIMB_MAX & 0xc1a0;
-
- r->_mp_alloc = 0;
- r->_mp_size = 0;
- r->_mp_d = (mp_ptr) &dummy_limb;
-}
-
-/* The utility of this function is a bit limited, since many functions
- assigns the result variable using mpz_swap. */
-void
-mpz_init2 (mpz_t r, mp_bitcnt_t bits)
-{
- mp_size_t rn;
-
- bits -= (bits != 0); /* Round down, except if 0 */
- rn = 1 + bits / GMP_LIMB_BITS;
-
- r->_mp_alloc = rn;
- r->_mp_size = 0;
- r->_mp_d = gmp_alloc_limbs (rn);
-}
-
-void
-mpz_clear (mpz_t r)
-{
- if (r->_mp_alloc)
- gmp_free_limbs (r->_mp_d, r->_mp_alloc);
-}
-
-static mp_ptr
-mpz_realloc (mpz_t r, mp_size_t size)
-{
- size = GMP_MAX (size, 1);
-
- if (r->_mp_alloc)
- r->_mp_d = gmp_realloc_limbs (r->_mp_d, r->_mp_alloc, size);
- else
- r->_mp_d = gmp_alloc_limbs (size);
- r->_mp_alloc = size;
-
- if (GMP_ABS (r->_mp_size) > size)
- r->_mp_size = 0;
-
- return r->_mp_d;
-}
-
-/* Realloc for an mpz_t WHAT if it has less than NEEDED limbs. */
-#define MPZ_REALLOC(z,n) ((n) > (z)->_mp_alloc \
- ? mpz_realloc(z,n) \
- : (z)->_mp_d)
-
-/* MPZ assignment and basic conversions. */
-void
-mpz_set_si (mpz_t r, signed long int x)
-{
- if (x >= 0)
- mpz_set_ui (r, x);
- else /* (x < 0) */
- if (GMP_LIMB_BITS < GMP_ULONG_BITS)
- {
- mpz_set_ui (r, GMP_NEG_CAST (unsigned long int, x));
- mpz_neg (r, r);
- }
- else
- {
- r->_mp_size = -1;
- MPZ_REALLOC (r, 1)[0] = GMP_NEG_CAST (unsigned long int, x);
- }
-}
-
-void
-mpz_set_ui (mpz_t r, unsigned long int x)
-{
- if (x > 0)
- {
- r->_mp_size = 1;
- MPZ_REALLOC (r, 1)[0] = x;
- if (GMP_LIMB_BITS < GMP_ULONG_BITS)
- {
- int LOCAL_GMP_LIMB_BITS = GMP_LIMB_BITS;
- while (x >>= LOCAL_GMP_LIMB_BITS)
- {
- ++ r->_mp_size;
- MPZ_REALLOC (r, r->_mp_size)[r->_mp_size - 1] = x;
- }
- }
- }
- else
- r->_mp_size = 0;
-}
-
-void
-mpz_set (mpz_t r, const mpz_t x)
-{
- /* Allow the NOP r == x */
- if (r != x)
- {
- mp_size_t n;
- mp_ptr rp;
-
- n = GMP_ABS (x->_mp_size);
- rp = MPZ_REALLOC (r, n);
-
- mpn_copyi (rp, x->_mp_d, n);
- r->_mp_size = x->_mp_size;
- }
-}
-
-void
-mpz_init_set_si (mpz_t r, signed long int x)
-{
- mpz_init (r);
- mpz_set_si (r, x);
-}
-
-void
-mpz_init_set_ui (mpz_t r, unsigned long int x)
-{
- mpz_init (r);
- mpz_set_ui (r, x);
-}
-
-void
-mpz_init_set (mpz_t r, const mpz_t x)
-{
- mpz_init (r);
- mpz_set (r, x);
-}
-
-int
-mpz_fits_slong_p (const mpz_t u)
-{
- return mpz_cmp_si (u, LONG_MAX) <= 0 && mpz_cmp_si (u, LONG_MIN) >= 0;
-}
-
-static int
-mpn_absfits_ulong_p (mp_srcptr up, mp_size_t un)
-{
- int ulongsize = GMP_ULONG_BITS / GMP_LIMB_BITS;
- mp_limb_t ulongrem = 0;
-
- if (GMP_ULONG_BITS % GMP_LIMB_BITS != 0)
- ulongrem = (mp_limb_t) (ULONG_MAX >> GMP_LIMB_BITS * ulongsize) + 1;
-
- return un <= ulongsize || (up[ulongsize] < ulongrem && un == ulongsize + 1);
-}
-
-int
-mpz_fits_ulong_p (const mpz_t u)
-{
- mp_size_t us = u->_mp_size;
-
- return us >= 0 && mpn_absfits_ulong_p (u->_mp_d, us);
-}
-
-int
-mpz_fits_sint_p (const mpz_t u)
-{
- return mpz_cmp_si (u, INT_MAX) <= 0 && mpz_cmp_si (u, INT_MIN) >= 0;
-}
-
-int
-mpz_fits_uint_p (const mpz_t u)
-{
- return u->_mp_size >= 0 && mpz_cmpabs_ui (u, UINT_MAX) <= 0;
-}
-
-int
-mpz_fits_sshort_p (const mpz_t u)
-{
- return mpz_cmp_si (u, SHRT_MAX) <= 0 && mpz_cmp_si (u, SHRT_MIN) >= 0;
-}
-
-int
-mpz_fits_ushort_p (const mpz_t u)
-{
- return u->_mp_size >= 0 && mpz_cmpabs_ui (u, USHRT_MAX) <= 0;
-}
-
-long int
-mpz_get_si (const mpz_t u)
-{
- unsigned long r = mpz_get_ui (u);
- unsigned long c = -LONG_MAX - LONG_MIN;
-
- if (u->_mp_size < 0)
- /* This expression is necessary to properly handle -LONG_MIN */
- return -(long) c - (long) ((r - c) & LONG_MAX);
- else
- return (long) (r & LONG_MAX);
-}
-
-unsigned long int
-mpz_get_ui (const mpz_t u)
-{
- if (GMP_LIMB_BITS < GMP_ULONG_BITS)
- {
- int LOCAL_GMP_LIMB_BITS = GMP_LIMB_BITS;
- unsigned long r = 0;
- mp_size_t n = GMP_ABS (u->_mp_size);
- n = GMP_MIN (n, 1 + (mp_size_t) (GMP_ULONG_BITS - 1) / GMP_LIMB_BITS);
- while (--n >= 0)
- r = (r << LOCAL_GMP_LIMB_BITS) + u->_mp_d[n];
- return r;
- }
-
- return u->_mp_size == 0 ? 0 : u->_mp_d[0];
-}
-
-size_t
-mpz_size (const mpz_t u)
-{
- return GMP_ABS (u->_mp_size);
-}
-
-mp_limb_t
-mpz_getlimbn (const mpz_t u, mp_size_t n)
-{
- if (n >= 0 && n < GMP_ABS (u->_mp_size))
- return u->_mp_d[n];
- else
- return 0;
-}
-
-void
-mpz_realloc2 (mpz_t x, mp_bitcnt_t n)
-{
- mpz_realloc (x, 1 + (n - (n != 0)) / GMP_LIMB_BITS);
-}
-
-mp_srcptr
-mpz_limbs_read (mpz_srcptr x)
-{
- return x->_mp_d;
-}
-
-mp_ptr
-mpz_limbs_modify (mpz_t x, mp_size_t n)
-{
- assert (n > 0);
- return MPZ_REALLOC (x, n);
-}
-
-mp_ptr
-mpz_limbs_write (mpz_t x, mp_size_t n)
-{
- return mpz_limbs_modify (x, n);
-}
-
-void
-mpz_limbs_finish (mpz_t x, mp_size_t xs)
-{
- mp_size_t xn;
- xn = mpn_normalized_size (x->_mp_d, GMP_ABS (xs));
- x->_mp_size = xs < 0 ? -xn : xn;
-}
-
-static mpz_srcptr
-mpz_roinit_normal_n (mpz_t x, mp_srcptr xp, mp_size_t xs)
-{
- x->_mp_alloc = 0;
- x->_mp_d = (mp_ptr) xp;
- x->_mp_size = xs;
- return x;
-}
-
-mpz_srcptr
-mpz_roinit_n (mpz_t x, mp_srcptr xp, mp_size_t xs)
-{
- mpz_roinit_normal_n (x, xp, xs);
- mpz_limbs_finish (x, xs);
- return x;
-}
-
-
-/* Conversions and comparison to double. */
-void
-mpz_set_d (mpz_t r, double x)
-{
- int sign;
- mp_ptr rp;
- mp_size_t rn, i;
- double B;
- double Bi;
- mp_limb_t f;
-
- /* x != x is true when x is a NaN, and x == x * 0.5 is true when x is
- zero or infinity. */
- if (x != x || x == x * 0.5)
- {
- r->_mp_size = 0;
- return;
- }
-
- sign = x < 0.0 ;
- if (sign)
- x = - x;
-
- if (x < 1.0)
- {
- r->_mp_size = 0;
- return;
- }
- B = 4.0 * (double) (GMP_LIMB_HIGHBIT >> 1);
- Bi = 1.0 / B;
- for (rn = 1; x >= B; rn++)
- x *= Bi;
-
- rp = MPZ_REALLOC (r, rn);
-
- f = (mp_limb_t) x;
- x -= f;
- assert (x < 1.0);
- i = rn-1;
- rp[i] = f;
- while (--i >= 0)
- {
- x = B * x;
- f = (mp_limb_t) x;
- x -= f;
- assert (x < 1.0);
- rp[i] = f;
- }
-
- r->_mp_size = sign ? - rn : rn;
-}
-
-void
-mpz_init_set_d (mpz_t r, double x)
-{
- mpz_init (r);
- mpz_set_d (r, x);
-}
-
-double
-mpz_get_d (const mpz_t u)
-{
- int m;
- mp_limb_t l;
- mp_size_t un;
- double x;
- double B = 4.0 * (double) (GMP_LIMB_HIGHBIT >> 1);
-
- un = GMP_ABS (u->_mp_size);
-
- if (un == 0)
- return 0.0;
-
- l = u->_mp_d[--un];
- gmp_clz (m, l);
- m = m + GMP_DBL_MANT_BITS - GMP_LIMB_BITS;
- if (m < 0)
- l &= GMP_LIMB_MAX << -m;
-
- for (x = l; --un >= 0;)
- {
- x = B*x;
- if (m > 0) {
- l = u->_mp_d[un];
- m -= GMP_LIMB_BITS;
- if (m < 0)
- l &= GMP_LIMB_MAX << -m;
- x += l;
- }
- }
-
- if (u->_mp_size < 0)
- x = -x;
-
- return x;
-}
-
-int
-mpz_cmpabs_d (const mpz_t x, double d)
-{
- mp_size_t xn;
- double B, Bi;
- mp_size_t i;
-
- xn = x->_mp_size;
- d = GMP_ABS (d);
-
- if (xn != 0)
- {
- xn = GMP_ABS (xn);
-
- B = 4.0 * (double) (GMP_LIMB_HIGHBIT >> 1);
- Bi = 1.0 / B;
-
- /* Scale d so it can be compared with the top limb. */
- for (i = 1; i < xn; i++)
- d *= Bi;
-
- if (d >= B)
- return -1;
-
- /* Compare floor(d) to top limb, subtract and cancel when equal. */
- for (i = xn; i-- > 0;)
- {
- mp_limb_t f, xl;
-
- f = (mp_limb_t) d;
- xl = x->_mp_d[i];
- if (xl > f)
- return 1;
- else if (xl < f)
- return -1;
- d = B * (d - f);
- }
- }
- return - (d > 0.0);
-}
-
-int
-mpz_cmp_d (const mpz_t x, double d)
-{
- if (x->_mp_size < 0)
- {
- if (d >= 0.0)
- return -1;
- else
- return -mpz_cmpabs_d (x, d);
- }
- else
- {
- if (d < 0.0)
- return 1;
- else
- return mpz_cmpabs_d (x, d);
- }
-}
-
-
-/* MPZ comparisons and the like. */
-int
-mpz_sgn (const mpz_t u)
-{
- return GMP_CMP (u->_mp_size, 0);
-}
-
-int
-mpz_cmp_si (const mpz_t u, long v)
-{
- mp_size_t usize = u->_mp_size;
-
- if (v >= 0)
- return mpz_cmp_ui (u, v);
- else if (usize >= 0)
- return 1;
- else
- return - mpz_cmpabs_ui (u, GMP_NEG_CAST (unsigned long int, v));
-}
-
-int
-mpz_cmp_ui (const mpz_t u, unsigned long v)
-{
- mp_size_t usize = u->_mp_size;
-
- if (usize < 0)
- return -1;
- else
- return mpz_cmpabs_ui (u, v);
-}
-
-int
-mpz_cmp (const mpz_t a, const mpz_t b)
-{
- mp_size_t asize = a->_mp_size;
- mp_size_t bsize = b->_mp_size;
-
- if (asize != bsize)
- return (asize < bsize) ? -1 : 1;
- else if (asize >= 0)
- return mpn_cmp (a->_mp_d, b->_mp_d, asize);
- else
- return mpn_cmp (b->_mp_d, a->_mp_d, -asize);
-}
-
-int
-mpz_cmpabs_ui (const mpz_t u, unsigned long v)
-{
- mp_size_t un = GMP_ABS (u->_mp_size);
-
- if (! mpn_absfits_ulong_p (u->_mp_d, un))
- return 1;
- else
- {
- unsigned long uu = mpz_get_ui (u);
- return GMP_CMP(uu, v);
- }
-}
-
-int
-mpz_cmpabs (const mpz_t u, const mpz_t v)
-{
- return mpn_cmp4 (u->_mp_d, GMP_ABS (u->_mp_size),
- v->_mp_d, GMP_ABS (v->_mp_size));
-}
-
-void
-mpz_abs (mpz_t r, const mpz_t u)
-{
- mpz_set (r, u);
- r->_mp_size = GMP_ABS (r->_mp_size);
-}
-
-void
-mpz_neg (mpz_t r, const mpz_t u)
-{
- mpz_set (r, u);
- r->_mp_size = -r->_mp_size;
-}
-
-void
-mpz_swap (mpz_t u, mpz_t v)
-{
- MP_SIZE_T_SWAP (u->_mp_alloc, v->_mp_alloc);
- MPN_PTR_SWAP (u->_mp_d, u->_mp_size, v->_mp_d, v->_mp_size);
-}
-
-
-/* MPZ addition and subtraction */
-
-
-void
-mpz_add_ui (mpz_t r, const mpz_t a, unsigned long b)
-{
- mpz_t bb;
- mpz_init_set_ui (bb, b);
- mpz_add (r, a, bb);
- mpz_clear (bb);
-}
-
-void
-mpz_sub_ui (mpz_t r, const mpz_t a, unsigned long b)
-{
- mpz_ui_sub (r, b, a);
- mpz_neg (r, r);
-}
-
-void
-mpz_ui_sub (mpz_t r, unsigned long a, const mpz_t b)
-{
- mpz_neg (r, b);
- mpz_add_ui (r, r, a);
-}
-
-static mp_size_t
-mpz_abs_add (mpz_t r, const mpz_t a, const mpz_t b)
-{
- mp_size_t an = GMP_ABS (a->_mp_size);
- mp_size_t bn = GMP_ABS (b->_mp_size);
- mp_ptr rp;
- mp_limb_t cy;
-
- if (an < bn)
- {
- MPZ_SRCPTR_SWAP (a, b);
- MP_SIZE_T_SWAP (an, bn);
- }
-
- rp = MPZ_REALLOC (r, an + 1);
- cy = mpn_add (rp, a->_mp_d, an, b->_mp_d, bn);
-
- rp[an] = cy;
-
- return an + cy;
-}
-
-static mp_size_t
-mpz_abs_sub (mpz_t r, const mpz_t a, const mpz_t b)
-{
- mp_size_t an = GMP_ABS (a->_mp_size);
- mp_size_t bn = GMP_ABS (b->_mp_size);
- int cmp;
- mp_ptr rp;
-
- cmp = mpn_cmp4 (a->_mp_d, an, b->_mp_d, bn);
- if (cmp > 0)
- {
- rp = MPZ_REALLOC (r, an);
- gmp_assert_nocarry (mpn_sub (rp, a->_mp_d, an, b->_mp_d, bn));
- return mpn_normalized_size (rp, an);
- }
- else if (cmp < 0)
- {
- rp = MPZ_REALLOC (r, bn);
- gmp_assert_nocarry (mpn_sub (rp, b->_mp_d, bn, a->_mp_d, an));
- return -mpn_normalized_size (rp, bn);
- }
- else
- return 0;
-}
-
-void
-mpz_add (mpz_t r, const mpz_t a, const mpz_t b)
-{
- mp_size_t rn;
-
- if ( (a->_mp_size ^ b->_mp_size) >= 0)
- rn = mpz_abs_add (r, a, b);
- else
- rn = mpz_abs_sub (r, a, b);
-
- r->_mp_size = a->_mp_size >= 0 ? rn : - rn;
-}
-
-void
-mpz_sub (mpz_t r, const mpz_t a, const mpz_t b)
-{
- mp_size_t rn;
-
- if ( (a->_mp_size ^ b->_mp_size) >= 0)
- rn = mpz_abs_sub (r, a, b);
- else
- rn = mpz_abs_add (r, a, b);
-
- r->_mp_size = a->_mp_size >= 0 ? rn : - rn;
-}
-
-
-/* MPZ multiplication */
-void
-mpz_mul_si (mpz_t r, const mpz_t u, long int v)
-{
- if (v < 0)
- {
- mpz_mul_ui (r, u, GMP_NEG_CAST (unsigned long int, v));
- mpz_neg (r, r);
- }
- else
- mpz_mul_ui (r, u, v);
-}
-
-void
-mpz_mul_ui (mpz_t r, const mpz_t u, unsigned long int v)
-{
- mpz_t vv;
- mpz_init_set_ui (vv, v);
- mpz_mul (r, u, vv);
- mpz_clear (vv);
- return;
-}
-
-void
-mpz_mul (mpz_t r, const mpz_t u, const mpz_t v)
-{
- int sign;
- mp_size_t un, vn, rn;
- mpz_t t;
- mp_ptr tp;
-
- un = u->_mp_size;
- vn = v->_mp_size;
-
- if (un == 0 || vn == 0)
- {
- r->_mp_size = 0;
- return;
- }
-
- sign = (un ^ vn) < 0;
-
- un = GMP_ABS (un);
- vn = GMP_ABS (vn);
-
- mpz_init2 (t, (un + vn) * GMP_LIMB_BITS);
-
- tp = t->_mp_d;
- if (un >= vn)
- mpn_mul (tp, u->_mp_d, un, v->_mp_d, vn);
- else
- mpn_mul (tp, v->_mp_d, vn, u->_mp_d, un);
-
- rn = un + vn;
- rn -= tp[rn-1] == 0;
-
- t->_mp_size = sign ? - rn : rn;
- mpz_swap (r, t);
- mpz_clear (t);
-}
-
-void
-mpz_mul_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t bits)
-{
- mp_size_t un, rn;
- mp_size_t limbs;
- unsigned shift;
- mp_ptr rp;
-
- un = GMP_ABS (u->_mp_size);
- if (un == 0)
- {
- r->_mp_size = 0;
- return;
- }
-
- limbs = bits / GMP_LIMB_BITS;
- shift = bits % GMP_LIMB_BITS;
-
- rn = un + limbs + (shift > 0);
- rp = MPZ_REALLOC (r, rn);
- if (shift > 0)
- {
- mp_limb_t cy = mpn_lshift (rp + limbs, u->_mp_d, un, shift);
- rp[rn-1] = cy;
- rn -= (cy == 0);
- }
- else
- mpn_copyd (rp + limbs, u->_mp_d, un);
-
- mpn_zero (rp, limbs);
-
- r->_mp_size = (u->_mp_size < 0) ? - rn : rn;
-}
-
-void
-mpz_addmul_ui (mpz_t r, const mpz_t u, unsigned long int v)
-{
- mpz_t t;
- mpz_init_set_ui (t, v);
- mpz_mul (t, u, t);
- mpz_add (r, r, t);
- mpz_clear (t);
-}
-
-void
-mpz_submul_ui (mpz_t r, const mpz_t u, unsigned long int v)
-{
- mpz_t t;
- mpz_init_set_ui (t, v);
- mpz_mul (t, u, t);
- mpz_sub (r, r, t);
- mpz_clear (t);
-}
-
-void
-mpz_addmul (mpz_t r, const mpz_t u, const mpz_t v)
-{
- mpz_t t;
- mpz_init (t);
- mpz_mul (t, u, v);
- mpz_add (r, r, t);
- mpz_clear (t);
-}
-
-void
-mpz_submul (mpz_t r, const mpz_t u, const mpz_t v)
-{
- mpz_t t;
- mpz_init (t);
- mpz_mul (t, u, v);
- mpz_sub (r, r, t);
- mpz_clear (t);
-}
-
-
-/* MPZ division */
-enum mpz_div_round_mode { GMP_DIV_FLOOR, GMP_DIV_CEIL, GMP_DIV_TRUNC };
-
-/* Allows q or r to be zero. Returns 1 iff remainder is non-zero. */
-static int
-mpz_div_qr (mpz_t q, mpz_t r,
- const mpz_t n, const mpz_t d, enum mpz_div_round_mode mode)
-{
- mp_size_t ns, ds, nn, dn, qs;
- ns = n->_mp_size;
- ds = d->_mp_size;
-
- if (ds == 0)
- gmp_die("mpz_div_qr: Divide by zero.");
-
- if (ns == 0)
- {
- if (q)
- q->_mp_size = 0;
- if (r)
- r->_mp_size = 0;
- return 0;
- }
-
- nn = GMP_ABS (ns);
- dn = GMP_ABS (ds);
-
- qs = ds ^ ns;
-
- if (nn < dn)
- {
- if (mode == GMP_DIV_CEIL && qs >= 0)
- {
- /* q = 1, r = n - d */
- if (r)
- mpz_sub (r, n, d);
- if (q)
- mpz_set_ui (q, 1);
- }
- else if (mode == GMP_DIV_FLOOR && qs < 0)
- {
- /* q = -1, r = n + d */
- if (r)
- mpz_add (r, n, d);
- if (q)
- mpz_set_si (q, -1);
- }
- else
- {
- /* q = 0, r = d */
- if (r)
- mpz_set (r, n);
- if (q)
- q->_mp_size = 0;
- }
- return 1;
- }
- else
- {
- mp_ptr np, qp;
- mp_size_t qn, rn;
- mpz_t tq, tr;
-
- mpz_init_set (tr, n);
- np = tr->_mp_d;
-
- qn = nn - dn + 1;
-
- if (q)
- {
- mpz_init2 (tq, qn * GMP_LIMB_BITS);
- qp = tq->_mp_d;
- }
- else
- qp = NULL;
-
- mpn_div_qr (qp, np, nn, d->_mp_d, dn);
-
- if (qp)
- {
- qn -= (qp[qn-1] == 0);
-
- tq->_mp_size = qs < 0 ? -qn : qn;
- }
- rn = mpn_normalized_size (np, dn);
- tr->_mp_size = ns < 0 ? - rn : rn;
-
- if (mode == GMP_DIV_FLOOR && qs < 0 && rn != 0)
- {
- if (q)
- mpz_sub_ui (tq, tq, 1);
- if (r)
- mpz_add (tr, tr, d);
- }
- else if (mode == GMP_DIV_CEIL && qs >= 0 && rn != 0)
- {
- if (q)
- mpz_add_ui (tq, tq, 1);
- if (r)
- mpz_sub (tr, tr, d);
- }
-
- if (q)
- {
- mpz_swap (tq, q);
- mpz_clear (tq);
- }
- if (r)
- mpz_swap (tr, r);
-
- mpz_clear (tr);
-
- return rn != 0;
- }
-}
-
-void
-mpz_cdiv_qr (mpz_t q, mpz_t r, const mpz_t n, const mpz_t d)
-{
- mpz_div_qr (q, r, n, d, GMP_DIV_CEIL);
-}
-
-void
-mpz_fdiv_qr (mpz_t q, mpz_t r, const mpz_t n, const mpz_t d)
-{
- mpz_div_qr (q, r, n, d, GMP_DIV_FLOOR);
-}
-
-void
-mpz_tdiv_qr (mpz_t q, mpz_t r, const mpz_t n, const mpz_t d)
-{
- mpz_div_qr (q, r, n, d, GMP_DIV_TRUNC);
-}
-
-void
-mpz_cdiv_q (mpz_t q, const mpz_t n, const mpz_t d)
-{
- mpz_div_qr (q, NULL, n, d, GMP_DIV_CEIL);
-}
-
-void
-mpz_fdiv_q (mpz_t q, const mpz_t n, const mpz_t d)
-{
- mpz_div_qr (q, NULL, n, d, GMP_DIV_FLOOR);
-}
-
-void
-mpz_tdiv_q (mpz_t q, const mpz_t n, const mpz_t d)
-{
- mpz_div_qr (q, NULL, n, d, GMP_DIV_TRUNC);
-}
-
-void
-mpz_cdiv_r (mpz_t r, const mpz_t n, const mpz_t d)
-{
- mpz_div_qr (NULL, r, n, d, GMP_DIV_CEIL);
-}
-
-void
-mpz_fdiv_r (mpz_t r, const mpz_t n, const mpz_t d)
-{
- mpz_div_qr (NULL, r, n, d, GMP_DIV_FLOOR);
-}
-
-void
-mpz_tdiv_r (mpz_t r, const mpz_t n, const mpz_t d)
-{
- mpz_div_qr (NULL, r, n, d, GMP_DIV_TRUNC);
-}
-
-void
-mpz_mod (mpz_t r, const mpz_t n, const mpz_t d)
-{
- mpz_div_qr (NULL, r, n, d, d->_mp_size >= 0 ? GMP_DIV_FLOOR : GMP_DIV_CEIL);
-}
-
-static void
-mpz_div_q_2exp (mpz_t q, const mpz_t u, mp_bitcnt_t bit_index,
- enum mpz_div_round_mode mode)
-{
- mp_size_t un, qn;
- mp_size_t limb_cnt;
- mp_ptr qp;
- int adjust;
-
- un = u->_mp_size;
- if (un == 0)
- {
- q->_mp_size = 0;
- return;
- }
- limb_cnt = bit_index / GMP_LIMB_BITS;
- qn = GMP_ABS (un) - limb_cnt;
- bit_index %= GMP_LIMB_BITS;
-
- if (mode == ((un > 0) ? GMP_DIV_CEIL : GMP_DIV_FLOOR)) /* un != 0 here. */
- /* Note: Below, the final indexing at limb_cnt is valid because at
- that point we have qn > 0. */
- adjust = (qn <= 0
- || !mpn_zero_p (u->_mp_d, limb_cnt)
- || (u->_mp_d[limb_cnt]
- & (((mp_limb_t) 1 << bit_index) - 1)));
- else
- adjust = 0;
-
- if (qn <= 0)
- qn = 0;
- else
- {
- qp = MPZ_REALLOC (q, qn);
-
- if (bit_index != 0)
- {
- mpn_rshift (qp, u->_mp_d + limb_cnt, qn, bit_index);
- qn -= qp[qn - 1] == 0;
- }
- else
- {
- mpn_copyi (qp, u->_mp_d + limb_cnt, qn);
- }
- }
-
- q->_mp_size = qn;
-
- if (adjust)
- mpz_add_ui (q, q, 1);
- if (un < 0)
- mpz_neg (q, q);
-}
-
-static void
-mpz_div_r_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t bit_index,
- enum mpz_div_round_mode mode)
-{
- mp_size_t us, un, rn;
- mp_ptr rp;
- mp_limb_t mask;
-
- us = u->_mp_size;
- if (us == 0 || bit_index == 0)
- {
- r->_mp_size = 0;
- return;
- }
- rn = (bit_index + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS;
- assert (rn > 0);
-
- rp = MPZ_REALLOC (r, rn);
- un = GMP_ABS (us);
-
- mask = GMP_LIMB_MAX >> (rn * GMP_LIMB_BITS - bit_index);
-
- if (rn > un)
- {
- /* Quotient (with truncation) is zero, and remainder is
- non-zero */
- if (mode == ((us > 0) ? GMP_DIV_CEIL : GMP_DIV_FLOOR)) /* us != 0 here. */
- {
- /* Have to negate and sign extend. */
- mp_size_t i;
-
- gmp_assert_nocarry (! mpn_neg (rp, u->_mp_d, un));
- for (i = un; i < rn - 1; i++)
- rp[i] = GMP_LIMB_MAX;
-
- rp[rn-1] = mask;
- us = -us;
- }
- else
- {
- /* Just copy */
- if (r != u)
- mpn_copyi (rp, u->_mp_d, un);
-
- rn = un;
- }
- }
- else
- {
- if (r != u)
- mpn_copyi (rp, u->_mp_d, rn - 1);
-
- rp[rn-1] = u->_mp_d[rn-1] & mask;
-
- if (mode == ((us > 0) ? GMP_DIV_CEIL : GMP_DIV_FLOOR)) /* us != 0 here. */
- {
- /* If r != 0, compute 2^{bit_count} - r. */
- mpn_neg (rp, rp, rn);
-
- rp[rn-1] &= mask;
-
- /* us is not used for anything else, so we can modify it
- here to indicate flipped sign. */
- us = -us;
- }
- }
- rn = mpn_normalized_size (rp, rn);
- r->_mp_size = us < 0 ? -rn : rn;
-}
-
-void
-mpz_cdiv_q_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
-{
- mpz_div_q_2exp (r, u, cnt, GMP_DIV_CEIL);
-}
-
-void
-mpz_fdiv_q_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
-{
- mpz_div_q_2exp (r, u, cnt, GMP_DIV_FLOOR);
-}
-
-void
-mpz_tdiv_q_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
-{
- mpz_div_q_2exp (r, u, cnt, GMP_DIV_TRUNC);
-}
-
-void
-mpz_cdiv_r_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
-{
- mpz_div_r_2exp (r, u, cnt, GMP_DIV_CEIL);
-}
-
-void
-mpz_fdiv_r_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
-{
- mpz_div_r_2exp (r, u, cnt, GMP_DIV_FLOOR);
-}
-
-void
-mpz_tdiv_r_2exp (mpz_t r, const mpz_t u, mp_bitcnt_t cnt)
-{
- mpz_div_r_2exp (r, u, cnt, GMP_DIV_TRUNC);
-}
-
-void
-mpz_divexact (mpz_t q, const mpz_t n, const mpz_t d)
-{
- gmp_assert_nocarry (mpz_div_qr (q, NULL, n, d, GMP_DIV_TRUNC));
-}
-
-int
-mpz_divisible_p (const mpz_t n, const mpz_t d)
-{
- return mpz_div_qr (NULL, NULL, n, d, GMP_DIV_TRUNC) == 0;
-}
-
-int
-mpz_congruent_p (const mpz_t a, const mpz_t b, const mpz_t m)
-{
- mpz_t t;
- int res;
-
- /* a == b (mod 0) iff a == b */
- if (mpz_sgn (m) == 0)
- return (mpz_cmp (a, b) == 0);
-
- mpz_init (t);
- mpz_sub (t, a, b);
- res = mpz_divisible_p (t, m);
- mpz_clear (t);
-
- return res;
-}
-
-static unsigned long
-mpz_div_qr_ui (mpz_t q, mpz_t r,
- const mpz_t n, unsigned long d, enum mpz_div_round_mode mode)
-{
- unsigned long ret;
- mpz_t rr, dd;
-
- mpz_init (rr);
- mpz_init_set_ui (dd, d);
- mpz_div_qr (q, rr, n, dd, mode);
- mpz_clear (dd);
- ret = mpz_get_ui (rr);
-
- if (r)
- mpz_swap (r, rr);
- mpz_clear (rr);
-
- return ret;
-}
-
-unsigned long
-mpz_cdiv_qr_ui (mpz_t q, mpz_t r, const mpz_t n, unsigned long d)
-{
- return mpz_div_qr_ui (q, r, n, d, GMP_DIV_CEIL);
-}
-
-unsigned long
-mpz_fdiv_qr_ui (mpz_t q, mpz_t r, const mpz_t n, unsigned long d)
-{
- return mpz_div_qr_ui (q, r, n, d, GMP_DIV_FLOOR);
-}
-
-unsigned long
-mpz_tdiv_qr_ui (mpz_t q, mpz_t r, const mpz_t n, unsigned long d)
-{
- return mpz_div_qr_ui (q, r, n, d, GMP_DIV_TRUNC);
-}
-
-unsigned long
-mpz_cdiv_q_ui (mpz_t q, const mpz_t n, unsigned long d)
-{
- return mpz_div_qr_ui (q, NULL, n, d, GMP_DIV_CEIL);
-}
-
-unsigned long
-mpz_fdiv_q_ui (mpz_t q, const mpz_t n, unsigned long d)
-{
- return mpz_div_qr_ui (q, NULL, n, d, GMP_DIV_FLOOR);
-}
-
-unsigned long
-mpz_tdiv_q_ui (mpz_t q, const mpz_t n, unsigned long d)
-{
- return mpz_div_qr_ui (q, NULL, n, d, GMP_DIV_TRUNC);
-}
-
-unsigned long
-mpz_cdiv_r_ui (mpz_t r, const mpz_t n, unsigned long d)
-{
- return mpz_div_qr_ui (NULL, r, n, d, GMP_DIV_CEIL);
-}
-unsigned long
-mpz_fdiv_r_ui (mpz_t r, const mpz_t n, unsigned long d)
-{
- return mpz_div_qr_ui (NULL, r, n, d, GMP_DIV_FLOOR);
-}
-unsigned long
-mpz_tdiv_r_ui (mpz_t r, const mpz_t n, unsigned long d)
-{
- return mpz_div_qr_ui (NULL, r, n, d, GMP_DIV_TRUNC);
-}
-
-unsigned long
-mpz_cdiv_ui (const mpz_t n, unsigned long d)
-{
- return mpz_div_qr_ui (NULL, NULL, n, d, GMP_DIV_CEIL);
-}
-
-unsigned long
-mpz_fdiv_ui (const mpz_t n, unsigned long d)
-{
- return mpz_div_qr_ui (NULL, NULL, n, d, GMP_DIV_FLOOR);
-}
-
-unsigned long
-mpz_tdiv_ui (const mpz_t n, unsigned long d)
-{
- return mpz_div_qr_ui (NULL, NULL, n, d, GMP_DIV_TRUNC);
-}
-
-unsigned long
-mpz_mod_ui (mpz_t r, const mpz_t n, unsigned long d)
-{
- return mpz_div_qr_ui (NULL, r, n, d, GMP_DIV_FLOOR);
-}
-
-void
-mpz_divexact_ui (mpz_t q, const mpz_t n, unsigned long d)
-{
- gmp_assert_nocarry (mpz_div_qr_ui (q, NULL, n, d, GMP_DIV_TRUNC));
-}
-
-int
-mpz_divisible_ui_p (const mpz_t n, unsigned long d)
-{
- return mpz_div_qr_ui (NULL, NULL, n, d, GMP_DIV_TRUNC) == 0;
-}
-
-
-/* GCD */
-static mp_limb_t
-mpn_gcd_11 (mp_limb_t u, mp_limb_t v)
-{
- unsigned shift;
-
- assert ( (u | v) > 0);
-
- if (u == 0)
- return v;
- else if (v == 0)
- return u;
-
- gmp_ctz (shift, u | v);
-
- u >>= shift;
- v >>= shift;
-
- if ( (u & 1) == 0)
- MP_LIMB_T_SWAP (u, v);
-
- while ( (v & 1) == 0)
- v >>= 1;
-
- while (u != v)
- {
- if (u > v)
- {
- u -= v;
- do
- u >>= 1;
- while ( (u & 1) == 0);
- }
- else
- {
- v -= u;
- do
- v >>= 1;
- while ( (v & 1) == 0);
- }
- }
- return u << shift;
-}
-
-unsigned long
-mpz_gcd_ui (mpz_t g, const mpz_t u, unsigned long v)
-{
- mpz_t t;
- mpz_init_set_ui(t, v);
- mpz_gcd (t, u, t);
- if (v > 0)
- v = mpz_get_ui (t);
-
- if (g)
- mpz_swap (t, g);
-
- mpz_clear (t);
-
- return v;
-}
-
-static mp_bitcnt_t
-mpz_make_odd (mpz_t r)
-{
- mp_bitcnt_t shift;
-
- assert (r->_mp_size > 0);
- /* Count trailing zeros, equivalent to mpn_scan1, because we know that there is a 1 */
- shift = mpn_scan1 (r->_mp_d, 0);
- mpz_tdiv_q_2exp (r, r, shift);
-
- return shift;
-}
-
-void
-mpz_gcd (mpz_t g, const mpz_t u, const mpz_t v)
-{
- mpz_t tu, tv;
- mp_bitcnt_t uz, vz, gz;
-
- if (u->_mp_size == 0)
- {
- mpz_abs (g, v);
- return;
- }
- if (v->_mp_size == 0)
- {
- mpz_abs (g, u);
- return;
- }
-
- mpz_init (tu);
- mpz_init (tv);
-
- mpz_abs (tu, u);
- uz = mpz_make_odd (tu);
- mpz_abs (tv, v);
- vz = mpz_make_odd (tv);
- gz = GMP_MIN (uz, vz);
-
- if (tu->_mp_size < tv->_mp_size)
- mpz_swap (tu, tv);
-
- mpz_tdiv_r (tu, tu, tv);
- if (tu->_mp_size == 0)
- {
- mpz_swap (g, tv);
- }
- else
- for (;;)
- {
- int c;
-
- mpz_make_odd (tu);
- c = mpz_cmp (tu, tv);
- if (c == 0)
- {
- mpz_swap (g, tu);
- break;
- }
- if (c < 0)
- mpz_swap (tu, tv);
-
- if (tv->_mp_size == 1)
- {
- mp_limb_t *gp;
-
- mpz_tdiv_r (tu, tu, tv);
- gp = MPZ_REALLOC (g, 1); /* gp = mpz_limbs_modify (g, 1); */
- *gp = mpn_gcd_11 (tu->_mp_d[0], tv->_mp_d[0]);
-
- g->_mp_size = *gp != 0; /* mpz_limbs_finish (g, 1); */
- break;
- }
- mpz_sub (tu, tu, tv);
- }
- mpz_clear (tu);
- mpz_clear (tv);
- mpz_mul_2exp (g, g, gz);
-}
-
-void
-mpz_gcdext (mpz_t g, mpz_t s, mpz_t t, const mpz_t u, const mpz_t v)
-{
- mpz_t tu, tv, s0, s1, t0, t1;
- mp_bitcnt_t uz, vz, gz;
- mp_bitcnt_t power;
-
- if (u->_mp_size == 0)
- {
- /* g = 0 u + sgn(v) v */
- signed long sign = mpz_sgn (v);
- mpz_abs (g, v);
- if (s)
- s->_mp_size = 0;
- if (t)
- mpz_set_si (t, sign);
- return;
- }
-
- if (v->_mp_size == 0)
- {
- /* g = sgn(u) u + 0 v */
- signed long sign = mpz_sgn (u);
- mpz_abs (g, u);
- if (s)
- mpz_set_si (s, sign);
- if (t)
- t->_mp_size = 0;
- return;
- }
-
- mpz_init (tu);
- mpz_init (tv);
- mpz_init (s0);
- mpz_init (s1);
- mpz_init (t0);
- mpz_init (t1);
-
- mpz_abs (tu, u);
- uz = mpz_make_odd (tu);
- mpz_abs (tv, v);
- vz = mpz_make_odd (tv);
- gz = GMP_MIN (uz, vz);
-
- uz -= gz;
- vz -= gz;
-
- /* Cofactors corresponding to odd gcd. gz handled later. */
- if (tu->_mp_size < tv->_mp_size)
- {
- mpz_swap (tu, tv);
- MPZ_SRCPTR_SWAP (u, v);
- MPZ_PTR_SWAP (s, t);
- MP_BITCNT_T_SWAP (uz, vz);
- }
-
- /* Maintain
- *
- * u = t0 tu + t1 tv
- * v = s0 tu + s1 tv
- *
- * where u and v denote the inputs with common factors of two
- * eliminated, and det (s0, t0; s1, t1) = 2^p. Then
- *
- * 2^p tu = s1 u - t1 v
- * 2^p tv = -s0 u + t0 v
- */
-
- /* After initial division, tu = q tv + tu', we have
- *
- * u = 2^uz (tu' + q tv)
- * v = 2^vz tv
- *
- * or
- *
- * t0 = 2^uz, t1 = 2^uz q
- * s0 = 0, s1 = 2^vz
- */
-
- mpz_tdiv_qr (t1, tu, tu, tv);
- mpz_mul_2exp (t1, t1, uz);
-
- mpz_setbit (s1, vz);
- power = uz + vz;
-
- if (tu->_mp_size > 0)
- {
- mp_bitcnt_t shift;
- shift = mpz_make_odd (tu);
- mpz_setbit (t0, uz + shift);
- power += shift;
-
- for (;;)
- {
- int c;
- c = mpz_cmp (tu, tv);
- if (c == 0)
- break;
-
- if (c < 0)
- {
- /* tv = tv' + tu
- *
- * u = t0 tu + t1 (tv' + tu) = (t0 + t1) tu + t1 tv'
- * v = s0 tu + s1 (tv' + tu) = (s0 + s1) tu + s1 tv' */
-
- mpz_sub (tv, tv, tu);
- mpz_add (t0, t0, t1);
- mpz_add (s0, s0, s1);
-
- shift = mpz_make_odd (tv);
- mpz_mul_2exp (t1, t1, shift);
- mpz_mul_2exp (s1, s1, shift);
- }
- else
- {
- mpz_sub (tu, tu, tv);
- mpz_add (t1, t0, t1);
- mpz_add (s1, s0, s1);
-
- shift = mpz_make_odd (tu);
- mpz_mul_2exp (t0, t0, shift);
- mpz_mul_2exp (s0, s0, shift);
- }
- power += shift;
- }
- }
- else
- mpz_setbit (t0, uz);
-
- /* Now tv = odd part of gcd, and -s0 and t0 are corresponding
- cofactors. */
-
- mpz_mul_2exp (tv, tv, gz);
- mpz_neg (s0, s0);
-
- /* 2^p g = s0 u + t0 v. Eliminate one factor of two at a time. To
- adjust cofactors, we need u / g and v / g */
-
- mpz_divexact (s1, v, tv);
- mpz_abs (s1, s1);
- mpz_divexact (t1, u, tv);
- mpz_abs (t1, t1);
-
- while (power-- > 0)
- {
- /* s0 u + t0 v = (s0 - v/g) u - (t0 + u/g) v */
- if (mpz_odd_p (s0) || mpz_odd_p (t0))
- {
- mpz_sub (s0, s0, s1);
- mpz_add (t0, t0, t1);
- }
- assert (mpz_even_p (t0) && mpz_even_p (s0));
- mpz_tdiv_q_2exp (s0, s0, 1);
- mpz_tdiv_q_2exp (t0, t0, 1);
- }
-
- /* Arrange so that |s| < |u| / 2g */
- mpz_add (s1, s0, s1);
- if (mpz_cmpabs (s0, s1) > 0)
- {
- mpz_swap (s0, s1);
- mpz_sub (t0, t0, t1);
- }
- if (u->_mp_size < 0)
- mpz_neg (s0, s0);
- if (v->_mp_size < 0)
- mpz_neg (t0, t0);
-
- mpz_swap (g, tv);
- if (s)
- mpz_swap (s, s0);
- if (t)
- mpz_swap (t, t0);
-
- mpz_clear (tu);
- mpz_clear (tv);
- mpz_clear (s0);
- mpz_clear (s1);
- mpz_clear (t0);
- mpz_clear (t1);
-}
-
-void
-mpz_lcm (mpz_t r, const mpz_t u, const mpz_t v)
-{
- mpz_t g;
-
- if (u->_mp_size == 0 || v->_mp_size == 0)
- {
- r->_mp_size = 0;
- return;
- }
-
- mpz_init (g);
-
- mpz_gcd (g, u, v);
- mpz_divexact (g, u, g);
- mpz_mul (r, g, v);
-
- mpz_clear (g);
- mpz_abs (r, r);
-}
-
-void
-mpz_lcm_ui (mpz_t r, const mpz_t u, unsigned long v)
-{
- if (v == 0 || u->_mp_size == 0)
- {
- r->_mp_size = 0;
- return;
- }
-
- v /= mpz_gcd_ui (NULL, u, v);
- mpz_mul_ui (r, u, v);
-
- mpz_abs (r, r);
-}
-
-int
-mpz_invert (mpz_t r, const mpz_t u, const mpz_t m)
-{
- mpz_t g, tr;
- int invertible;
-
- if (u->_mp_size == 0 || mpz_cmpabs_ui (m, 1) <= 0)
- return 0;
-
- mpz_init (g);
- mpz_init (tr);
-
- mpz_gcdext (g, tr, NULL, u, m);
- invertible = (mpz_cmp_ui (g, 1) == 0);
-
- if (invertible)
- {
- if (tr->_mp_size < 0)
- {
- if (m->_mp_size >= 0)
- mpz_add (tr, tr, m);
- else
- mpz_sub (tr, tr, m);
- }
- mpz_swap (r, tr);
- }
-
- mpz_clear (g);
- mpz_clear (tr);
- return invertible;
-}
-
-
-/* Higher level operations (sqrt, pow and root) */
-
-void
-mpz_pow_ui (mpz_t r, const mpz_t b, unsigned long e)
-{
- unsigned long bit;
- mpz_t tr;
- mpz_init_set_ui (tr, 1);
-
- bit = GMP_ULONG_HIGHBIT;
- do
- {
- mpz_mul (tr, tr, tr);
- if (e & bit)
- mpz_mul (tr, tr, b);
- bit >>= 1;
- }
- while (bit > 0);
-
- mpz_swap (r, tr);
- mpz_clear (tr);
-}
-
-void
-mpz_ui_pow_ui (mpz_t r, unsigned long blimb, unsigned long e)
-{
- mpz_t b;
-
- mpz_init_set_ui (b, blimb);
- mpz_pow_ui (r, b, e);
- mpz_clear (b);
-}
-
-void
-mpz_powm (mpz_t r, const mpz_t b, const mpz_t e, const mpz_t m)
-{
- mpz_t tr;
- mpz_t base;
- mp_size_t en, mn;
- mp_srcptr mp;
- struct gmp_div_inverse minv;
- unsigned shift;
- mp_ptr tp = NULL;
-
- en = GMP_ABS (e->_mp_size);
- mn = GMP_ABS (m->_mp_size);
- if (mn == 0)
- gmp_die ("mpz_powm: Zero modulo.");
-
- if (en == 0)
- {
- mpz_set_ui (r, mpz_cmpabs_ui (m, 1));
- return;
- }
-
- mp = m->_mp_d;
- mpn_div_qr_invert (&minv, mp, mn);
- shift = minv.shift;
-
- if (shift > 0)
- {
- /* To avoid shifts, we do all our reductions, except the final
- one, using a *normalized* m. */
- minv.shift = 0;
-
- tp = gmp_alloc_limbs (mn);
- gmp_assert_nocarry (mpn_lshift (tp, mp, mn, shift));
- mp = tp;
- }
-
- mpz_init (base);
-
- if (e->_mp_size < 0)
- {
- if (!mpz_invert (base, b, m))
- gmp_die ("mpz_powm: Negative exponent and non-invertible base.");
- }
- else
- {
- mp_size_t bn;
- mpz_abs (base, b);
-
- bn = base->_mp_size;
- if (bn >= mn)
- {
- mpn_div_qr_preinv (NULL, base->_mp_d, base->_mp_size, mp, mn, &minv);
- bn = mn;
- }
-
- /* We have reduced the absolute value. Now take care of the
- sign. Note that we get zero represented non-canonically as
- m. */
- if (b->_mp_size < 0)
- {
- mp_ptr bp = MPZ_REALLOC (base, mn);
- gmp_assert_nocarry (mpn_sub (bp, mp, mn, bp, bn));
- bn = mn;
- }
- base->_mp_size = mpn_normalized_size (base->_mp_d, bn);
- }
- mpz_init_set_ui (tr, 1);
-
- while (--en >= 0)
- {
- mp_limb_t w = e->_mp_d[en];
- mp_limb_t bit;
-
- bit = GMP_LIMB_HIGHBIT;
- do
- {
- mpz_mul (tr, tr, tr);
- if (w & bit)
- mpz_mul (tr, tr, base);
- if (tr->_mp_size > mn)
- {
- mpn_div_qr_preinv (NULL, tr->_mp_d, tr->_mp_size, mp, mn, &minv);
- tr->_mp_size = mpn_normalized_size (tr->_mp_d, mn);
- }
- bit >>= 1;
- }
- while (bit > 0);
- }
-
- /* Final reduction */
- if (tr->_mp_size >= mn)
- {
- minv.shift = shift;
- mpn_div_qr_preinv (NULL, tr->_mp_d, tr->_mp_size, mp, mn, &minv);
- tr->_mp_size = mpn_normalized_size (tr->_mp_d, mn);
- }
- if (tp)
- gmp_free_limbs (tp, mn);
-
- mpz_swap (r, tr);
- mpz_clear (tr);
- mpz_clear (base);
-}
-
-void
-mpz_powm_ui (mpz_t r, const mpz_t b, unsigned long elimb, const mpz_t m)
-{
- mpz_t e;
-
- mpz_init_set_ui (e, elimb);
- mpz_powm (r, b, e, m);
- mpz_clear (e);
-}
-
-/* x=trunc(y^(1/z)), r=y-x^z */
-void
-mpz_rootrem (mpz_t x, mpz_t r, const mpz_t y, unsigned long z)
-{
- int sgn;
- mp_bitcnt_t bc;
- mpz_t t, u;
-
- sgn = y->_mp_size < 0;
- if ((~z & sgn) != 0)
- gmp_die ("mpz_rootrem: Negative argument, with even root.");
- if (z == 0)
- gmp_die ("mpz_rootrem: Zeroth root.");
-
- if (mpz_cmpabs_ui (y, 1) <= 0) {
- if (x)
- mpz_set (x, y);
- if (r)
- r->_mp_size = 0;
- return;
- }
-
- mpz_init (u);
- mpz_init (t);
- bc = (mpz_sizeinbase (y, 2) - 1) / z + 1;
- mpz_setbit (t, bc);
-
- if (z == 2) /* simplify sqrt loop: z-1 == 1 */
- do {
- mpz_swap (u, t); /* u = x */
- mpz_tdiv_q (t, y, u); /* t = y/x */
- mpz_add (t, t, u); /* t = y/x + x */
- mpz_tdiv_q_2exp (t, t, 1); /* x'= (y/x + x)/2 */
- } while (mpz_cmpabs (t, u) < 0); /* |x'| < |x| */
- else /* z != 2 */ {
- mpz_t v;
-
- mpz_init (v);
- if (sgn)
- mpz_neg (t, t);
-
- do {
- mpz_swap (u, t); /* u = x */
- mpz_pow_ui (t, u, z - 1); /* t = x^(z-1) */
- mpz_tdiv_q (t, y, t); /* t = y/x^(z-1) */
- mpz_mul_ui (v, u, z - 1); /* v = x*(z-1) */
- mpz_add (t, t, v); /* t = y/x^(z-1) + x*(z-1) */
- mpz_tdiv_q_ui (t, t, z); /* x'=(y/x^(z-1) + x*(z-1))/z */
- } while (mpz_cmpabs (t, u) < 0); /* |x'| < |x| */
-
- mpz_clear (v);
- }
-
- if (r) {
- mpz_pow_ui (t, u, z);
- mpz_sub (r, y, t);
- }
- if (x)
- mpz_swap (x, u);
- mpz_clear (u);
- mpz_clear (t);
-}
-
-int
-mpz_root (mpz_t x, const mpz_t y, unsigned long z)
-{
- int res;
- mpz_t r;
-
- mpz_init (r);
- mpz_rootrem (x, r, y, z);
- res = r->_mp_size == 0;
- mpz_clear (r);
-
- return res;
-}
-
-/* Compute s = floor(sqrt(u)) and r = u - s^2. Allows r == NULL */
-void
-mpz_sqrtrem (mpz_t s, mpz_t r, const mpz_t u)
-{
- mpz_rootrem (s, r, u, 2);
-}
-
-void
-mpz_sqrt (mpz_t s, const mpz_t u)
-{
- mpz_rootrem (s, NULL, u, 2);
-}
-
-int
-mpz_perfect_square_p (const mpz_t u)
-{
- if (u->_mp_size <= 0)
- return (u->_mp_size == 0);
- else
- return mpz_root (NULL, u, 2);
-}
-
-int
-mpn_perfect_square_p (mp_srcptr p, mp_size_t n)
-{
- mpz_t t;
-
- assert (n > 0);
- assert (p [n-1] != 0);
- return mpz_root (NULL, mpz_roinit_normal_n (t, p, n), 2);
-}
-
-mp_size_t
-mpn_sqrtrem (mp_ptr sp, mp_ptr rp, mp_srcptr p, mp_size_t n)
-{
- mpz_t s, r, u;
- mp_size_t res;
-
- assert (n > 0);
- assert (p [n-1] != 0);
-
- mpz_init (r);
- mpz_init (s);
- mpz_rootrem (s, r, mpz_roinit_normal_n (u, p, n), 2);
-
- assert (s->_mp_size == (n+1)/2);
- mpn_copyd (sp, s->_mp_d, s->_mp_size);
- mpz_clear (s);
- res = r->_mp_size;
- if (rp)
- mpn_copyd (rp, r->_mp_d, res);
- mpz_clear (r);
- return res;
-}
-
-/* Combinatorics */
-
-void
-mpz_mfac_uiui (mpz_t x, unsigned long n, unsigned long m)
-{
- mpz_set_ui (x, n + (n == 0));
- if (m + 1 < 2) return;
- while (n > m + 1)
- mpz_mul_ui (x, x, n -= m);
-}
-
-void
-mpz_2fac_ui (mpz_t x, unsigned long n)
-{
- mpz_mfac_uiui (x, n, 2);
-}
-
-void
-mpz_fac_ui (mpz_t x, unsigned long n)
-{
- mpz_mfac_uiui (x, n, 1);
-}
-
-void
-mpz_bin_uiui (mpz_t r, unsigned long n, unsigned long k)
-{
- mpz_t t;
-
- mpz_set_ui (r, k <= n);
-
- if (k > (n >> 1))
- k = (k <= n) ? n - k : 0;
-
- mpz_init (t);
- mpz_fac_ui (t, k);
-
- for (; k > 0; --k)
- mpz_mul_ui (r, r, n--);
-
- mpz_divexact (r, r, t);
- mpz_clear (t);
-}
-
-
-/* Primality testing */
-
-/* Computes Kronecker (a/b) with odd b, a!=0 and GCD(a,b) = 1 */
-/* Adapted from JACOBI_BASE_METHOD==4 in mpn/generic/jacbase.c */
-static int
-gmp_jacobi_coprime (mp_limb_t a, mp_limb_t b)
-{
- int c, bit = 0;
-
- assert (b & 1);
- assert (a != 0);
- /* assert (mpn_gcd_11 (a, b) == 1); */
-
- /* Below, we represent a and b shifted right so that the least
- significant one bit is implicit. */
- b >>= 1;
-
- gmp_ctz(c, a);
- a >>= 1;
-
- for (;;)
- {
- a >>= c;
- /* (2/b) = -1 if b = 3 or 5 mod 8 */
- bit ^= c & (b ^ (b >> 1));
- if (a < b)
- {
- if (a == 0)
- return bit & 1 ? -1 : 1;
- bit ^= a & b;
- a = b - a;
- b -= a;
- }
- else
- {
- a -= b;
- assert (a != 0);
- }
-
- gmp_ctz(c, a);
- ++c;
- }
-}
-
-static void
-gmp_lucas_step_k_2k (mpz_t V, mpz_t Qk, const mpz_t n)
-{
- mpz_mod (Qk, Qk, n);
- /* V_{2k} <- V_k ^ 2 - 2Q^k */
- mpz_mul (V, V, V);
- mpz_submul_ui (V, Qk, 2);
- mpz_tdiv_r (V, V, n);
- /* Q^{2k} = (Q^k)^2 */
- mpz_mul (Qk, Qk, Qk);
-}
-
-/* Computes V_k, Q^k (mod n) for the Lucas' sequence */
-/* with P=1, Q=Q; k = (n>>b0)|1. */
-/* Requires an odd n > 4; b0 > 0; -2*Q must not overflow a long */
-/* Returns (U_k == 0) and sets V=V_k and Qk=Q^k. */
-static int
-gmp_lucas_mod (mpz_t V, mpz_t Qk, long Q,
- mp_bitcnt_t b0, const mpz_t n)
-{
- mp_bitcnt_t bs;
- mpz_t U;
- int res;
-
- assert (b0 > 0);
- assert (Q <= - (LONG_MIN / 2));
- assert (Q >= - (LONG_MAX / 2));
- assert (mpz_cmp_ui (n, 4) > 0);
- assert (mpz_odd_p (n));
-
- mpz_init_set_ui (U, 1); /* U1 = 1 */
- mpz_set_ui (V, 1); /* V1 = 1 */
- mpz_set_si (Qk, Q);
-
- for (bs = mpz_sizeinbase (n, 2) - 1; --bs >= b0;)
- {
- /* U_{2k} <- U_k * V_k */
- mpz_mul (U, U, V);
- /* V_{2k} <- V_k ^ 2 - 2Q^k */
- /* Q^{2k} = (Q^k)^2 */
- gmp_lucas_step_k_2k (V, Qk, n);
-
- /* A step k->k+1 is performed if the bit in $n$ is 1 */
- /* mpz_tstbit(n,bs) or the bit is 0 in $n$ but */
- /* should be 1 in $n+1$ (bs == b0) */
- if (b0 == bs || mpz_tstbit (n, bs))
- {
- /* Q^{k+1} <- Q^k * Q */
- mpz_mul_si (Qk, Qk, Q);
- /* U_{k+1} <- (U_k + V_k) / 2 */
- mpz_swap (U, V); /* Keep in V the old value of U_k */
- mpz_add (U, U, V);
- /* We have to compute U/2, so we need an even value, */
- /* equivalent (mod n) */
- if (mpz_odd_p (U))
- mpz_add (U, U, n);
- mpz_tdiv_q_2exp (U, U, 1);
- /* V_{k+1} <-(D*U_k + V_k) / 2 =
- U_{k+1} + (D-1)/2*U_k = U_{k+1} - 2Q*U_k */
- mpz_mul_si (V, V, -2*Q);
- mpz_add (V, U, V);
- mpz_tdiv_r (V, V, n);
- }
- mpz_tdiv_r (U, U, n);
- }
-
- res = U->_mp_size == 0;
- mpz_clear (U);
- return res;
-}
-
-/* Performs strong Lucas' test on x, with parameters suggested */
-/* for the BPSW test. Qk is only passed to recycle a variable. */
-/* Requires GCD (x,6) = 1.*/
-static int
-gmp_stronglucas (const mpz_t x, mpz_t Qk)
-{
- mp_bitcnt_t b0;
- mpz_t V, n;
- mp_limb_t maxD, D; /* The absolute value is stored. */
- long Q;
- mp_limb_t tl;
-
- /* Test on the absolute value. */
- mpz_roinit_normal_n (n, x->_mp_d, GMP_ABS (x->_mp_size));
-
- assert (mpz_odd_p (n));
- /* assert (mpz_gcd_ui (NULL, n, 6) == 1); */
- if (mpz_root (Qk, n, 2))
- return 0; /* A square is composite. */
-
- /* Check Ds up to square root (in case, n is prime)
- or avoid overflows */
- maxD = (Qk->_mp_size == 1) ? Qk->_mp_d [0] - 1 : GMP_LIMB_MAX;
-
- D = 3;
- /* Search a D such that (D/n) = -1 in the sequence 5,-7,9,-11,.. */
- /* For those Ds we have (D/n) = (n/|D|) */
- do
- {
- if (D >= maxD)
- return 1 + (D != GMP_LIMB_MAX); /* (1 + ! ~ D) */
- D += 2;
- tl = mpz_tdiv_ui (n, D);
- if (tl == 0)
- return 0;
- }
- while (gmp_jacobi_coprime (tl, D) == 1);
-
- mpz_init (V);
-
- /* n-(D/n) = n+1 = d*2^{b0}, with d = (n>>b0) | 1 */
- b0 = mpn_common_scan (~ n->_mp_d[0], 0, n->_mp_d, n->_mp_size, GMP_LIMB_MAX);
- /* b0 = mpz_scan0 (n, 0); */
-
- /* D= P^2 - 4Q; P = 1; Q = (1-D)/4 */
- Q = (D & 2) ? (long) (D >> 2) + 1 : -(long) (D >> 2);
-
- if (! gmp_lucas_mod (V, Qk, Q, b0, n)) /* If Ud != 0 */
- while (V->_mp_size != 0 && --b0 != 0) /* while Vk != 0 */
- /* V <- V ^ 2 - 2Q^k */
- /* Q^{2k} = (Q^k)^2 */
- gmp_lucas_step_k_2k (V, Qk, n);
-
- mpz_clear (V);
- return (b0 != 0);
-}
-
-static int
-gmp_millerrabin (const mpz_t n, const mpz_t nm1, mpz_t y,
- const mpz_t q, mp_bitcnt_t k)
-{
- assert (k > 0);
-
- /* Caller must initialize y to the base. */
- mpz_powm (y, y, q, n);
-
- if (mpz_cmp_ui (y, 1) == 0 || mpz_cmp (y, nm1) == 0)
- return 1;
-
- while (--k > 0)
- {
- mpz_powm_ui (y, y, 2, n);
- if (mpz_cmp (y, nm1) == 0)
- return 1;
- }
- return 0;
-}
-
-/* This product is 0xc0cfd797, and fits in 32 bits. */
-#define GMP_PRIME_PRODUCT \
- (3UL*5UL*7UL*11UL*13UL*17UL*19UL*23UL*29UL)
-
-/* Bit (p+1)/2 is set, for each odd prime <= 61 */
-#define GMP_PRIME_MASK 0xc96996dcUL
-
-int
-mpz_probab_prime_p (const mpz_t n, int reps)
-{
- mpz_t nm1;
- mpz_t q;
- mpz_t y;
- mp_bitcnt_t k;
- int is_prime;
- int j;
-
- /* Note that we use the absolute value of n only, for compatibility
- with the real GMP. */
- if (mpz_even_p (n))
- return (mpz_cmpabs_ui (n, 2) == 0) ? 2 : 0;
-
- /* Above test excludes n == 0 */
- assert (n->_mp_size != 0);
-
- if (mpz_cmpabs_ui (n, 64) < 0)
- return (GMP_PRIME_MASK >> (n->_mp_d[0] >> 1)) & 2;
-
- if (mpz_gcd_ui (NULL, n, GMP_PRIME_PRODUCT) != 1)
- return 0;
-
- /* All prime factors are >= 31. */
- if (mpz_cmpabs_ui (n, 31*31) < 0)
- return 2;
-
- mpz_init (nm1);
- mpz_init (q);
-
- /* Find q and k, where q is odd and n = 1 + 2**k * q. */
- mpz_abs (nm1, n);
- nm1->_mp_d[0] -= 1;
- /* Count trailing zeros, equivalent to mpn_scan1, because we know that there is a 1 */
- k = mpn_scan1 (nm1->_mp_d, 0);
- mpz_tdiv_q_2exp (q, nm1, k);
-
- /* BPSW test */
- mpz_init_set_ui (y, 2);
- is_prime = gmp_millerrabin (n, nm1, y, q, k) && gmp_stronglucas (n, y);
- reps -= 24; /* skip the first 24 repetitions */
-
- /* Use Miller-Rabin, with a deterministic sequence of bases, a[j] =
- j^2 + j + 41 using Euler's polynomial. We potentially stop early,
- if a[j] >= n - 1. Since n >= 31*31, this can happen only if reps >
- 30 (a[30] == 971 > 31*31 == 961). */
-
- for (j = 0; is_prime & (j < reps); j++)
- {
- mpz_set_ui (y, (unsigned long) j*j+j+41);
- if (mpz_cmp (y, nm1) >= 0)
- {
- /* Don't try any further bases. This "early" break does not affect
- the result for any reasonable reps value (<=5000 was tested) */
- assert (j >= 30);
- break;
- }
- is_prime = gmp_millerrabin (n, nm1, y, q, k);
- }
- mpz_clear (nm1);
- mpz_clear (q);
- mpz_clear (y);
-
- return is_prime;
-}
-
-
-/* Logical operations and bit manipulation. */
-
-/* Numbers are treated as if represented in two's complement (and
- infinitely sign extended). For a negative values we get the two's
- complement from -x = ~x + 1, where ~ is bitwise complement.
- Negation transforms
-
- xxxx10...0
-
- into
-
- yyyy10...0
-
- where yyyy is the bitwise complement of xxxx. So least significant
- bits, up to and including the first one bit, are unchanged, and
- the more significant bits are all complemented.
-
- To change a bit from zero to one in a negative number, subtract the
- corresponding power of two from the absolute value. This can never
- underflow. To change a bit from one to zero, add the corresponding
- power of two, and this might overflow. E.g., if x = -001111, the
- two's complement is 110001. Clearing the least significant bit, we
- get two's complement 110000, and -010000. */
-
-int
-mpz_tstbit (const mpz_t d, mp_bitcnt_t bit_index)
-{
- mp_size_t limb_index;
- unsigned shift;
- mp_size_t ds;
- mp_size_t dn;
- mp_limb_t w;
- int bit;
-
- ds = d->_mp_size;
- dn = GMP_ABS (ds);
- limb_index = bit_index / GMP_LIMB_BITS;
- if (limb_index >= dn)
- return ds < 0;
-
- shift = bit_index % GMP_LIMB_BITS;
- w = d->_mp_d[limb_index];
- bit = (w >> shift) & 1;
-
- if (ds < 0)
- {
- /* d < 0. Check if any of the bits below is set: If so, our bit
- must be complemented. */
- if (shift > 0 && (mp_limb_t) (w << (GMP_LIMB_BITS - shift)) > 0)
- return bit ^ 1;
- while (--limb_index >= 0)
- if (d->_mp_d[limb_index] > 0)
- return bit ^ 1;
- }
- return bit;
-}
-
-static void
-mpz_abs_add_bit (mpz_t d, mp_bitcnt_t bit_index)
-{
- mp_size_t dn, limb_index;
- mp_limb_t bit;
- mp_ptr dp;
-
- dn = GMP_ABS (d->_mp_size);
-
- limb_index = bit_index / GMP_LIMB_BITS;
- bit = (mp_limb_t) 1 << (bit_index % GMP_LIMB_BITS);
-
- if (limb_index >= dn)
- {
- mp_size_t i;
- /* The bit should be set outside of the end of the number.
- We have to increase the size of the number. */
- dp = MPZ_REALLOC (d, limb_index + 1);
-
- dp[limb_index] = bit;
- for (i = dn; i < limb_index; i++)
- dp[i] = 0;
- dn = limb_index + 1;
- }
- else
- {
- mp_limb_t cy;
-
- dp = d->_mp_d;
-
- cy = mpn_add_1 (dp + limb_index, dp + limb_index, dn - limb_index, bit);
- if (cy > 0)
- {
- dp = MPZ_REALLOC (d, dn + 1);
- dp[dn++] = cy;
- }
- }
-
- d->_mp_size = (d->_mp_size < 0) ? - dn : dn;
-}
-
-static void
-mpz_abs_sub_bit (mpz_t d, mp_bitcnt_t bit_index)
-{
- mp_size_t dn, limb_index;
- mp_ptr dp;
- mp_limb_t bit;
-
- dn = GMP_ABS (d->_mp_size);
- dp = d->_mp_d;
-
- limb_index = bit_index / GMP_LIMB_BITS;
- bit = (mp_limb_t) 1 << (bit_index % GMP_LIMB_BITS);
-
- assert (limb_index < dn);
-
- gmp_assert_nocarry (mpn_sub_1 (dp + limb_index, dp + limb_index,
- dn - limb_index, bit));
- dn = mpn_normalized_size (dp, dn);
- d->_mp_size = (d->_mp_size < 0) ? - dn : dn;
-}
-
-void
-mpz_setbit (mpz_t d, mp_bitcnt_t bit_index)
-{
- if (!mpz_tstbit (d, bit_index))
- {
- if (d->_mp_size >= 0)
- mpz_abs_add_bit (d, bit_index);
- else
- mpz_abs_sub_bit (d, bit_index);
- }
-}
-
-void
-mpz_clrbit (mpz_t d, mp_bitcnt_t bit_index)
-{
- if (mpz_tstbit (d, bit_index))
- {
- if (d->_mp_size >= 0)
- mpz_abs_sub_bit (d, bit_index);
- else
- mpz_abs_add_bit (d, bit_index);
- }
-}
-
-void
-mpz_combit (mpz_t d, mp_bitcnt_t bit_index)
-{
- if (mpz_tstbit (d, bit_index) ^ (d->_mp_size < 0))
- mpz_abs_sub_bit (d, bit_index);
- else
- mpz_abs_add_bit (d, bit_index);
-}
-
-void
-mpz_com (mpz_t r, const mpz_t u)
-{
- mpz_add_ui (r, u, 1);
- mpz_neg (r, r);
-}
-
-void
-mpz_and (mpz_t r, const mpz_t u, const mpz_t v)
-{
- mp_size_t un, vn, rn, i;
- mp_ptr up, vp, rp;
-
- mp_limb_t ux, vx, rx;
- mp_limb_t uc, vc, rc;
- mp_limb_t ul, vl, rl;
-
- un = GMP_ABS (u->_mp_size);
- vn = GMP_ABS (v->_mp_size);
- if (un < vn)
- {
- MPZ_SRCPTR_SWAP (u, v);
- MP_SIZE_T_SWAP (un, vn);
- }
- if (vn == 0)
- {
- r->_mp_size = 0;
- return;
- }
-
- uc = u->_mp_size < 0;
- vc = v->_mp_size < 0;
- rc = uc & vc;
-
- ux = -uc;
- vx = -vc;
- rx = -rc;
-
- /* If the smaller input is positive, higher limbs don't matter. */
- rn = vx ? un : vn;
-
- rp = MPZ_REALLOC (r, rn + (mp_size_t) rc);
-
- up = u->_mp_d;
- vp = v->_mp_d;
-
- i = 0;
- do
- {
- ul = (up[i] ^ ux) + uc;
- uc = ul < uc;
-
- vl = (vp[i] ^ vx) + vc;
- vc = vl < vc;
-
- rl = ( (ul & vl) ^ rx) + rc;
- rc = rl < rc;
- rp[i] = rl;
- }
- while (++i < vn);
- assert (vc == 0);
-
- for (; i < rn; i++)
- {
- ul = (up[i] ^ ux) + uc;
- uc = ul < uc;
-
- rl = ( (ul & vx) ^ rx) + rc;
- rc = rl < rc;
- rp[i] = rl;
- }
- if (rc)
- rp[rn++] = rc;
- else
- rn = mpn_normalized_size (rp, rn);
-
- r->_mp_size = rx ? -rn : rn;
-}
-
-void
-mpz_ior (mpz_t r, const mpz_t u, const mpz_t v)
-{
- mp_size_t un, vn, rn, i;
- mp_ptr up, vp, rp;
-
- mp_limb_t ux, vx, rx;
- mp_limb_t uc, vc, rc;
- mp_limb_t ul, vl, rl;
-
- un = GMP_ABS (u->_mp_size);
- vn = GMP_ABS (v->_mp_size);
- if (un < vn)
- {
- MPZ_SRCPTR_SWAP (u, v);
- MP_SIZE_T_SWAP (un, vn);
- }
- if (vn == 0)
- {
- mpz_set (r, u);
- return;
- }
-
- uc = u->_mp_size < 0;
- vc = v->_mp_size < 0;
- rc = uc | vc;
-
- ux = -uc;
- vx = -vc;
- rx = -rc;
-
- /* If the smaller input is negative, by sign extension higher limbs
- don't matter. */
- rn = vx ? vn : un;
-
- rp = MPZ_REALLOC (r, rn + (mp_size_t) rc);
-
- up = u->_mp_d;
- vp = v->_mp_d;
-
- i = 0;
- do
- {
- ul = (up[i] ^ ux) + uc;
- uc = ul < uc;
-
- vl = (vp[i] ^ vx) + vc;
- vc = vl < vc;
-
- rl = ( (ul | vl) ^ rx) + rc;
- rc = rl < rc;
- rp[i] = rl;
- }
- while (++i < vn);
- assert (vc == 0);
-
- for (; i < rn; i++)
- {
- ul = (up[i] ^ ux) + uc;
- uc = ul < uc;
-
- rl = ( (ul | vx) ^ rx) + rc;
- rc = rl < rc;
- rp[i] = rl;
- }
- if (rc)
- rp[rn++] = rc;
- else
- rn = mpn_normalized_size (rp, rn);
-
- r->_mp_size = rx ? -rn : rn;
-}
-
-void
-mpz_xor (mpz_t r, const mpz_t u, const mpz_t v)
-{
- mp_size_t un, vn, i;
- mp_ptr up, vp, rp;
-
- mp_limb_t ux, vx, rx;
- mp_limb_t uc, vc, rc;
- mp_limb_t ul, vl, rl;
-
- un = GMP_ABS (u->_mp_size);
- vn = GMP_ABS (v->_mp_size);
- if (un < vn)
- {
- MPZ_SRCPTR_SWAP (u, v);
- MP_SIZE_T_SWAP (un, vn);
- }
- if (vn == 0)
- {
- mpz_set (r, u);
- return;
- }
-
- uc = u->_mp_size < 0;
- vc = v->_mp_size < 0;
- rc = uc ^ vc;
-
- ux = -uc;
- vx = -vc;
- rx = -rc;
-
- rp = MPZ_REALLOC (r, un + (mp_size_t) rc);
-
- up = u->_mp_d;
- vp = v->_mp_d;
-
- i = 0;
- do
- {
- ul = (up[i] ^ ux) + uc;
- uc = ul < uc;
-
- vl = (vp[i] ^ vx) + vc;
- vc = vl < vc;
-
- rl = (ul ^ vl ^ rx) + rc;
- rc = rl < rc;
- rp[i] = rl;
- }
- while (++i < vn);
- assert (vc == 0);
-
- for (; i < un; i++)
- {
- ul = (up[i] ^ ux) + uc;
- uc = ul < uc;
-
- rl = (ul ^ ux) + rc;
- rc = rl < rc;
- rp[i] = rl;
- }
- if (rc)
- rp[un++] = rc;
- else
- un = mpn_normalized_size (rp, un);
-
- r->_mp_size = rx ? -un : un;
-}
-
-static unsigned
-gmp_popcount_limb (mp_limb_t x)
-{
- unsigned c;
-
- /* Do 16 bits at a time, to avoid limb-sized constants. */
- int LOCAL_SHIFT_BITS = 16;
- for (c = 0; x > 0;)
- {
- unsigned w = x - ((x >> 1) & 0x5555);
- w = ((w >> 2) & 0x3333) + (w & 0x3333);
- w = (w >> 4) + w;
- w = ((w >> 8) & 0x000f) + (w & 0x000f);
- c += w;
- if (GMP_LIMB_BITS > LOCAL_SHIFT_BITS)
- x >>= LOCAL_SHIFT_BITS;
- else
- x = 0;
- }
- return c;
-}
-
-mp_bitcnt_t
-mpn_popcount (mp_srcptr p, mp_size_t n)
-{
- mp_size_t i;
- mp_bitcnt_t c;
-
- for (c = 0, i = 0; i < n; i++)
- c += gmp_popcount_limb (p[i]);
-
- return c;
-}
-
-mp_bitcnt_t
-mpz_popcount (const mpz_t u)
-{
- mp_size_t un;
-
- un = u->_mp_size;
-
- if (un < 0)
- return ~(mp_bitcnt_t) 0;
-
- return mpn_popcount (u->_mp_d, un);
-}
-
-mp_bitcnt_t
-mpz_hamdist (const mpz_t u, const mpz_t v)
-{
- mp_size_t un, vn, i;
- mp_limb_t uc, vc, ul, vl, comp;
- mp_srcptr up, vp;
- mp_bitcnt_t c;
-
- un = u->_mp_size;
- vn = v->_mp_size;
-
- if ( (un ^ vn) < 0)
- return ~(mp_bitcnt_t) 0;
-
- comp = - (uc = vc = (un < 0));
- if (uc)
- {
- assert (vn < 0);
- un = -un;
- vn = -vn;
- }
-
- up = u->_mp_d;
- vp = v->_mp_d;
-
- if (un < vn)
- MPN_SRCPTR_SWAP (up, un, vp, vn);
-
- for (i = 0, c = 0; i < vn; i++)
- {
- ul = (up[i] ^ comp) + uc;
- uc = ul < uc;
-
- vl = (vp[i] ^ comp) + vc;
- vc = vl < vc;
-
- c += gmp_popcount_limb (ul ^ vl);
- }
- assert (vc == 0);
-
- for (; i < un; i++)
- {
- ul = (up[i] ^ comp) + uc;
- uc = ul < uc;
-
- c += gmp_popcount_limb (ul ^ comp);
- }
-
- return c;
-}
-
-mp_bitcnt_t
-mpz_scan1 (const mpz_t u, mp_bitcnt_t starting_bit)
-{
- mp_ptr up;
- mp_size_t us, un, i;
- mp_limb_t limb, ux;
-
- us = u->_mp_size;
- un = GMP_ABS (us);
- i = starting_bit / GMP_LIMB_BITS;
-
- /* Past the end there's no 1 bits for u>=0, or an immediate 1 bit
- for u<0. Notice this test picks up any u==0 too. */
- if (i >= un)
- return (us >= 0 ? ~(mp_bitcnt_t) 0 : starting_bit);
-
- up = u->_mp_d;
- ux = 0;
- limb = up[i];
-
- if (starting_bit != 0)
- {
- if (us < 0)
- {
- ux = mpn_zero_p (up, i);
- limb = ~ limb + ux;
- ux = - (mp_limb_t) (limb >= ux);
- }
-
- /* Mask to 0 all bits before starting_bit, thus ignoring them. */
- limb &= GMP_LIMB_MAX << (starting_bit % GMP_LIMB_BITS);
- }
-
- return mpn_common_scan (limb, i, up, un, ux);
-}
-
-mp_bitcnt_t
-mpz_scan0 (const mpz_t u, mp_bitcnt_t starting_bit)
-{
- mp_ptr up;
- mp_size_t us, un, i;
- mp_limb_t limb, ux;
-
- us = u->_mp_size;
- ux = - (mp_limb_t) (us >= 0);
- un = GMP_ABS (us);
- i = starting_bit / GMP_LIMB_BITS;
-
- /* When past end, there's an immediate 0 bit for u>=0, or no 0 bits for
- u<0. Notice this test picks up all cases of u==0 too. */
- if (i >= un)
- return (ux ? starting_bit : ~(mp_bitcnt_t) 0);
-
- up = u->_mp_d;
- limb = up[i] ^ ux;
-
- if (ux == 0)
- limb -= mpn_zero_p (up, i); /* limb = ~(~limb + zero_p) */
-
- /* Mask all bits before starting_bit, thus ignoring them. */
- limb &= GMP_LIMB_MAX << (starting_bit % GMP_LIMB_BITS);
-
- return mpn_common_scan (limb, i, up, un, ux);
-}
-
-
-/* MPZ base conversion. */
-
-size_t
-mpz_sizeinbase (const mpz_t u, int base)
-{
- mp_size_t un, tn;
- mp_srcptr up;
- mp_ptr tp;
- mp_bitcnt_t bits;
- struct gmp_div_inverse bi;
- size_t ndigits;
-
- assert (base >= 2);
- assert (base <= 62);
-
- un = GMP_ABS (u->_mp_size);
- if (un == 0)
- return 1;
-
- up = u->_mp_d;
-
- bits = (un - 1) * GMP_LIMB_BITS + mpn_limb_size_in_base_2 (up[un-1]);
- switch (base)
- {
- case 2:
- return bits;
- case 4:
- return (bits + 1) / 2;
- case 8:
- return (bits + 2) / 3;
- case 16:
- return (bits + 3) / 4;
- case 32:
- return (bits + 4) / 5;
- /* FIXME: Do something more clever for the common case of base
- 10. */
- }
-
- tp = gmp_alloc_limbs (un);
- mpn_copyi (tp, up, un);
- mpn_div_qr_1_invert (&bi, base);
-
- tn = un;
- ndigits = 0;
- do
- {
- ndigits++;
- mpn_div_qr_1_preinv (tp, tp, tn, &bi);
- tn -= (tp[tn-1] == 0);
- }
- while (tn > 0);
-
- gmp_free_limbs (tp, un);
- return ndigits;
-}
-
-char *
-mpz_get_str (char *sp, int base, const mpz_t u)
-{
- unsigned bits;
- const char *digits;
- mp_size_t un;
- size_t i, sn, osn;
-
- digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
- if (base > 1)
- {
- if (base <= 36)
- digits = "0123456789abcdefghijklmnopqrstuvwxyz";
- else if (base > 62)
- return NULL;
- }
- else if (base >= -1)
- base = 10;
- else
- {
- base = -base;
- if (base > 36)
- return NULL;
- }
-
- sn = 1 + mpz_sizeinbase (u, base);
- if (!sp)
- {
- osn = 1 + sn;
- sp = (char *) gmp_alloc (osn);
- }
- else
- osn = 0;
- un = GMP_ABS (u->_mp_size);
-
- if (un == 0)
- {
- sp[0] = '0';
- sn = 1;
- goto ret;
- }
-
- i = 0;
-
- if (u->_mp_size < 0)
- sp[i++] = '-';
-
- bits = mpn_base_power_of_two_p (base);
-
- if (bits)
- /* Not modified in this case. */
- sn = i + mpn_get_str_bits ((unsigned char *) sp + i, bits, u->_mp_d, un);
- else
- {
- struct mpn_base_info info;
- mp_ptr tp;
-
- mpn_get_base_info (&info, base);
- tp = gmp_alloc_limbs (un);
- mpn_copyi (tp, u->_mp_d, un);
-
- sn = i + mpn_get_str_other ((unsigned char *) sp + i, base, &info, tp, un);
- gmp_free_limbs (tp, un);
- }
-
- for (; i < sn; i++)
- sp[i] = digits[(unsigned char) sp[i]];
-
-ret:
- sp[sn] = '\0';
- if (osn && osn != sn + 1)
- sp = (char*) gmp_realloc (sp, osn, sn + 1);
- return sp;
-}
-
-int
-mpz_set_str (mpz_t r, const char *sp, int base)
-{
- unsigned bits, value_of_a;
- mp_size_t rn, alloc;
- mp_ptr rp;
- size_t dn, sn;
- int sign;
- unsigned char *dp;
-
- assert (base == 0 || (base >= 2 && base <= 62));
-
- while (isspace( (unsigned char) *sp))
- sp++;
-
- sign = (*sp == '-');
- sp += sign;
-
- if (base == 0)
- {
- if (sp[0] == '0')
- {
- if (sp[1] == 'x' || sp[1] == 'X')
- {
- base = 16;
- sp += 2;
- }
- else if (sp[1] == 'b' || sp[1] == 'B')
- {
- base = 2;
- sp += 2;
- }
- else
- base = 8;
- }
- else
- base = 10;
- }
-
- if (!*sp)
- {
- r->_mp_size = 0;
- return -1;
- }
- sn = strlen(sp);
- dp = (unsigned char *) gmp_alloc (sn);
-
- value_of_a = (base > 36) ? 36 : 10;
- for (dn = 0; *sp; sp++)
- {
- unsigned digit;
-
- if (isspace ((unsigned char) *sp))
- continue;
- else if (*sp >= '0' && *sp <= '9')
- digit = *sp - '0';
- else if (*sp >= 'a' && *sp <= 'z')
- digit = *sp - 'a' + value_of_a;
- else if (*sp >= 'A' && *sp <= 'Z')
- digit = *sp - 'A' + 10;
- else
- digit = base; /* fail */
-
- if (digit >= (unsigned) base)
- {
- gmp_free (dp, sn);
- r->_mp_size = 0;
- return -1;
- }
-
- dp[dn++] = digit;
- }
-
- if (!dn)
- {
- gmp_free (dp, sn);
- r->_mp_size = 0;
- return -1;
- }
- bits = mpn_base_power_of_two_p (base);
-
- if (bits > 0)
- {
- alloc = (dn * bits + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS;
- rp = MPZ_REALLOC (r, alloc);
- rn = mpn_set_str_bits (rp, dp, dn, bits);
- }
- else
- {
- struct mpn_base_info info;
- mpn_get_base_info (&info, base);
- alloc = (dn + info.exp - 1) / info.exp;
- rp = MPZ_REALLOC (r, alloc);
- rn = mpn_set_str_other (rp, dp, dn, base, &info);
- /* Normalization, needed for all-zero input. */
- assert (rn > 0);
- rn -= rp[rn-1] == 0;
- }
- assert (rn <= alloc);
- gmp_free (dp, sn);
-
- r->_mp_size = sign ? - rn : rn;
-
- return 0;
-}
-
-int
-mpz_init_set_str (mpz_t r, const char *sp, int base)
-{
- mpz_init (r);
- return mpz_set_str (r, sp, base);
-}
-
-size_t
-mpz_out_str (FILE *stream, int base, const mpz_t x)
-{
- char *str;
- size_t len, n;
-
- str = mpz_get_str (NULL, base, x);
- if (!str)
- return 0;
- len = strlen (str);
- n = fwrite (str, 1, len, stream);
- gmp_free (str, len + 1);
- return n;
-}
-
-
-static int
-gmp_detect_endian (void)
-{
- static const int i = 2;
- const unsigned char *p = (const unsigned char *) &i;
- return 1 - *p;
-}
-
-/* Import and export. Does not support nails. */
-void
-mpz_import (mpz_t r, size_t count, int order, size_t size, int endian,
- size_t nails, const void *src)
-{
- const unsigned char *p;
- ptrdiff_t word_step;
- mp_ptr rp;
- mp_size_t rn;
-
- /* The current (partial) limb. */
- mp_limb_t limb;
- /* The number of bytes already copied to this limb (starting from
- the low end). */
- size_t bytes;
- /* The index where the limb should be stored, when completed. */
- mp_size_t i;
-
- if (nails != 0)
- gmp_die ("mpz_import: Nails not supported.");
-
- assert (order == 1 || order == -1);
- assert (endian >= -1 && endian <= 1);
-
- if (endian == 0)
- endian = gmp_detect_endian ();
-
- p = (unsigned char *) src;
-
- word_step = (order != endian) ? 2 * size : 0;
-
- /* Process bytes from the least significant end, so point p at the
- least significant word. */
- if (order == 1)
- {
- p += size * (count - 1);
- word_step = - word_step;
- }
-
- /* And at least significant byte of that word. */
- if (endian == 1)
- p += (size - 1);
-
- rn = (size * count + sizeof(mp_limb_t) - 1) / sizeof(mp_limb_t);
- rp = MPZ_REALLOC (r, rn);
-
- for (limb = 0, bytes = 0, i = 0; count > 0; count--, p += word_step)
- {
- size_t j;
- for (j = 0; j < size; j++, p -= (ptrdiff_t) endian)
- {
- limb |= (mp_limb_t) *p << (bytes++ * CHAR_BIT);
- if (bytes == sizeof(mp_limb_t))
- {
- rp[i++] = limb;
- bytes = 0;
- limb = 0;
- }
- }
- }
- assert (i + (bytes > 0) == rn);
- if (limb != 0)
- rp[i++] = limb;
- else
- i = mpn_normalized_size (rp, i);
-
- r->_mp_size = i;
-}
-
-void *
-mpz_export (void *r, size_t *countp, int order, size_t size, int endian,
- size_t nails, const mpz_t u)
-{
- size_t count;
- mp_size_t un;
-
- if (nails != 0)
- gmp_die ("mpz_export: Nails not supported.");
-
- assert (order == 1 || order == -1);
- assert (endian >= -1 && endian <= 1);
- assert (size > 0 || u->_mp_size == 0);
-
- un = u->_mp_size;
- count = 0;
- if (un != 0)
- {
- size_t k;
- unsigned char *p;
- ptrdiff_t word_step;
- /* The current (partial) limb. */
- mp_limb_t limb;
- /* The number of bytes left to do in this limb. */
- size_t bytes;
- /* The index where the limb was read. */
- mp_size_t i;
-
- un = GMP_ABS (un);
-
- /* Count bytes in top limb. */
- limb = u->_mp_d[un-1];
- assert (limb != 0);
-
- k = (GMP_LIMB_BITS <= CHAR_BIT);
- if (!k)
- {
- do {
- int LOCAL_CHAR_BIT = CHAR_BIT;
- k++; limb >>= LOCAL_CHAR_BIT;
- } while (limb != 0);
- }
- /* else limb = 0; */
-
- count = (k + (un-1) * sizeof (mp_limb_t) + size - 1) / size;
-
- if (!r)
- r = gmp_alloc (count * size);
-
- if (endian == 0)
- endian = gmp_detect_endian ();
-
- p = (unsigned char *) r;
-
- word_step = (order != endian) ? 2 * size : 0;
-
- /* Process bytes from the least significant end, so point p at the
- least significant word. */
- if (order == 1)
- {
- p += size * (count - 1);
- word_step = - word_step;
- }
-
- /* And at least significant byte of that word. */
- if (endian == 1)
- p += (size - 1);
-
- for (bytes = 0, i = 0, k = 0; k < count; k++, p += word_step)
- {
- size_t j;
- for (j = 0; j < size; ++j, p -= (ptrdiff_t) endian)
- {
- if (sizeof (mp_limb_t) == 1)
- {
- if (i < un)
- *p = u->_mp_d[i++];
- else
- *p = 0;
- }
- else
- {
- int LOCAL_CHAR_BIT = CHAR_BIT;
- if (bytes == 0)
- {
- if (i < un)
- limb = u->_mp_d[i++];
- bytes = sizeof (mp_limb_t);
- }
- *p = limb;
- limb >>= LOCAL_CHAR_BIT;
- bytes--;
- }
- }
- }
- assert (i == un);
- assert (k == count);
- }
-
- if (countp)
- *countp = count;
-
- return r;
-}
diff --git a/cross/lib/mini-gmp.h b/cross/lib/mini-gmp.h
deleted file mode 100644
index 59c24cf5111..00000000000
--- a/cross/lib/mini-gmp.h
+++ /dev/null
@@ -1,310 +0,0 @@
-/* mini-gmp, a minimalistic implementation of a GNU GMP subset.
-
-Copyright 2011-2015, 2017, 2019-2021 Free Software Foundation, Inc.
-
-This file is part of the GNU MP Library.
-
-The GNU MP Library is free software; you can redistribute it and/or modify
-it under the terms of either:
-
- * the GNU Lesser General Public License as published by the Free
- Software Foundation; either version 3 of the License, or (at your
- option) any later version.
-
-or
-
- * the GNU General Public License as published by the Free Software
- Foundation; either version 2 of the License, or (at your option) any
- later version.
-
-or both in parallel, as here.
-
-The GNU MP Library is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-for more details.
-
-You should have received copies of the GNU General Public License and the
-GNU Lesser General Public License along with the GNU MP Library. If not,
-see https://www.gnu.org/licenses/. */
-
-/* About mini-gmp: This is a minimal implementation of a subset of the
- GMP interface. It is intended for inclusion into applications which
- have modest bignums needs, as a fallback when the real GMP library
- is not installed.
-
- This file defines the public interface. */
-
-#ifndef __MINI_GMP_H__
-#define __MINI_GMP_H__
-
-/* For size_t */
-#include <stddef.h>
-
-#if defined (__cplusplus)
-extern "C" {
-#endif
-
-void mp_set_memory_functions (void *(*) (size_t),
- void *(*) (void *, size_t, size_t),
- void (*) (void *, size_t));
-
-void mp_get_memory_functions (void *(**) (size_t),
- void *(**) (void *, size_t, size_t),
- void (**) (void *, size_t));
-
-#ifndef MINI_GMP_LIMB_TYPE
-#define MINI_GMP_LIMB_TYPE long
-#endif
-
-typedef unsigned MINI_GMP_LIMB_TYPE mp_limb_t;
-typedef long mp_size_t;
-typedef unsigned long mp_bitcnt_t;
-
-typedef mp_limb_t *mp_ptr;
-typedef const mp_limb_t *mp_srcptr;
-
-typedef struct
-{
- int _mp_alloc; /* Number of *limbs* allocated and pointed
- to by the _mp_d field. */
- int _mp_size; /* abs(_mp_size) is the number of limbs the
- last field points to. If _mp_size is
- negative this is a negative number. */
- mp_limb_t *_mp_d; /* Pointer to the limbs. */
-} __mpz_struct;
-
-typedef __mpz_struct mpz_t[1];
-
-typedef __mpz_struct *mpz_ptr;
-typedef const __mpz_struct *mpz_srcptr;
-
-extern const int mp_bits_per_limb;
-
-void mpn_copyi (mp_ptr, mp_srcptr, mp_size_t);
-void mpn_copyd (mp_ptr, mp_srcptr, mp_size_t);
-void mpn_zero (mp_ptr, mp_size_t);
-
-int mpn_cmp (mp_srcptr, mp_srcptr, mp_size_t);
-int mpn_zero_p (mp_srcptr, mp_size_t);
-
-mp_limb_t mpn_add_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
-mp_limb_t mpn_add_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
-mp_limb_t mpn_add (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
-
-mp_limb_t mpn_sub_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
-mp_limb_t mpn_sub_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
-mp_limb_t mpn_sub (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
-
-mp_limb_t mpn_mul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
-mp_limb_t mpn_addmul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
-mp_limb_t mpn_submul_1 (mp_ptr, mp_srcptr, mp_size_t, mp_limb_t);
-
-mp_limb_t mpn_mul (mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t);
-void mpn_mul_n (mp_ptr, mp_srcptr, mp_srcptr, mp_size_t);
-void mpn_sqr (mp_ptr, mp_srcptr, mp_size_t);
-int mpn_perfect_square_p (mp_srcptr, mp_size_t);
-mp_size_t mpn_sqrtrem (mp_ptr, mp_ptr, mp_srcptr, mp_size_t);
-
-mp_limb_t mpn_lshift (mp_ptr, mp_srcptr, mp_size_t, unsigned int);
-mp_limb_t mpn_rshift (mp_ptr, mp_srcptr, mp_size_t, unsigned int);
-
-mp_bitcnt_t mpn_scan0 (mp_srcptr, mp_bitcnt_t);
-mp_bitcnt_t mpn_scan1 (mp_srcptr, mp_bitcnt_t);
-
-void mpn_com (mp_ptr, mp_srcptr, mp_size_t);
-mp_limb_t mpn_neg (mp_ptr, mp_srcptr, mp_size_t);
-
-mp_bitcnt_t mpn_popcount (mp_srcptr, mp_size_t);
-
-mp_limb_t mpn_invert_3by2 (mp_limb_t, mp_limb_t);
-#define mpn_invert_limb(x) mpn_invert_3by2 ((x), 0)
-
-size_t mpn_get_str (unsigned char *, int, mp_ptr, mp_size_t);
-mp_size_t mpn_set_str (mp_ptr, const unsigned char *, size_t, int);
-
-void mpz_init (mpz_t);
-void mpz_init2 (mpz_t, mp_bitcnt_t);
-void mpz_clear (mpz_t);
-
-#define mpz_odd_p(z) (((z)->_mp_size != 0) & (int) (z)->_mp_d[0])
-#define mpz_even_p(z) (! mpz_odd_p (z))
-
-int mpz_sgn (const mpz_t);
-int mpz_cmp_si (const mpz_t, long);
-int mpz_cmp_ui (const mpz_t, unsigned long);
-int mpz_cmp (const mpz_t, const mpz_t);
-int mpz_cmpabs_ui (const mpz_t, unsigned long);
-int mpz_cmpabs (const mpz_t, const mpz_t);
-int mpz_cmp_d (const mpz_t, double);
-int mpz_cmpabs_d (const mpz_t, double);
-
-void mpz_abs (mpz_t, const mpz_t);
-void mpz_neg (mpz_t, const mpz_t);
-void mpz_swap (mpz_t, mpz_t);
-
-void mpz_add_ui (mpz_t, const mpz_t, unsigned long);
-void mpz_add (mpz_t, const mpz_t, const mpz_t);
-void mpz_sub_ui (mpz_t, const mpz_t, unsigned long);
-void mpz_ui_sub (mpz_t, unsigned long, const mpz_t);
-void mpz_sub (mpz_t, const mpz_t, const mpz_t);
-
-void mpz_mul_si (mpz_t, const mpz_t, long int);
-void mpz_mul_ui (mpz_t, const mpz_t, unsigned long int);
-void mpz_mul (mpz_t, const mpz_t, const mpz_t);
-void mpz_mul_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
-void mpz_addmul_ui (mpz_t, const mpz_t, unsigned long int);
-void mpz_addmul (mpz_t, const mpz_t, const mpz_t);
-void mpz_submul_ui (mpz_t, const mpz_t, unsigned long int);
-void mpz_submul (mpz_t, const mpz_t, const mpz_t);
-
-void mpz_cdiv_qr (mpz_t, mpz_t, const mpz_t, const mpz_t);
-void mpz_fdiv_qr (mpz_t, mpz_t, const mpz_t, const mpz_t);
-void mpz_tdiv_qr (mpz_t, mpz_t, const mpz_t, const mpz_t);
-void mpz_cdiv_q (mpz_t, const mpz_t, const mpz_t);
-void mpz_fdiv_q (mpz_t, const mpz_t, const mpz_t);
-void mpz_tdiv_q (mpz_t, const mpz_t, const mpz_t);
-void mpz_cdiv_r (mpz_t, const mpz_t, const mpz_t);
-void mpz_fdiv_r (mpz_t, const mpz_t, const mpz_t);
-void mpz_tdiv_r (mpz_t, const mpz_t, const mpz_t);
-
-void mpz_cdiv_q_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
-void mpz_fdiv_q_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
-void mpz_tdiv_q_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
-void mpz_cdiv_r_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
-void mpz_fdiv_r_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
-void mpz_tdiv_r_2exp (mpz_t, const mpz_t, mp_bitcnt_t);
-
-void mpz_mod (mpz_t, const mpz_t, const mpz_t);
-
-void mpz_divexact (mpz_t, const mpz_t, const mpz_t);
-
-int mpz_divisible_p (const mpz_t, const mpz_t);
-int mpz_congruent_p (const mpz_t, const mpz_t, const mpz_t);
-
-unsigned long mpz_cdiv_qr_ui (mpz_t, mpz_t, const mpz_t, unsigned long);
-unsigned long mpz_fdiv_qr_ui (mpz_t, mpz_t, const mpz_t, unsigned long);
-unsigned long mpz_tdiv_qr_ui (mpz_t, mpz_t, const mpz_t, unsigned long);
-unsigned long mpz_cdiv_q_ui (mpz_t, const mpz_t, unsigned long);
-unsigned long mpz_fdiv_q_ui (mpz_t, const mpz_t, unsigned long);
-unsigned long mpz_tdiv_q_ui (mpz_t, const mpz_t, unsigned long);
-unsigned long mpz_cdiv_r_ui (mpz_t, const mpz_t, unsigned long);
-unsigned long mpz_fdiv_r_ui (mpz_t, const mpz_t, unsigned long);
-unsigned long mpz_tdiv_r_ui (mpz_t, const mpz_t, unsigned long);
-unsigned long mpz_cdiv_ui (const mpz_t, unsigned long);
-unsigned long mpz_fdiv_ui (const mpz_t, unsigned long);
-unsigned long mpz_tdiv_ui (const mpz_t, unsigned long);
-
-unsigned long mpz_mod_ui (mpz_t, const mpz_t, unsigned long);
-
-void mpz_divexact_ui (mpz_t, const mpz_t, unsigned long);
-
-int mpz_divisible_ui_p (const mpz_t, unsigned long);
-
-unsigned long mpz_gcd_ui (mpz_t, const mpz_t, unsigned long);
-void mpz_gcd (mpz_t, const mpz_t, const mpz_t);
-void mpz_gcdext (mpz_t, mpz_t, mpz_t, const mpz_t, const mpz_t);
-void mpz_lcm_ui (mpz_t, const mpz_t, unsigned long);
-void mpz_lcm (mpz_t, const mpz_t, const mpz_t);
-int mpz_invert (mpz_t, const mpz_t, const mpz_t);
-
-void mpz_sqrtrem (mpz_t, mpz_t, const mpz_t);
-void mpz_sqrt (mpz_t, const mpz_t);
-int mpz_perfect_square_p (const mpz_t);
-
-void mpz_pow_ui (mpz_t, const mpz_t, unsigned long);
-void mpz_ui_pow_ui (mpz_t, unsigned long, unsigned long);
-void mpz_powm (mpz_t, const mpz_t, const mpz_t, const mpz_t);
-void mpz_powm_ui (mpz_t, const mpz_t, unsigned long, const mpz_t);
-
-void mpz_rootrem (mpz_t, mpz_t, const mpz_t, unsigned long);
-int mpz_root (mpz_t, const mpz_t, unsigned long);
-
-void mpz_fac_ui (mpz_t, unsigned long);
-void mpz_2fac_ui (mpz_t, unsigned long);
-void mpz_mfac_uiui (mpz_t, unsigned long, unsigned long);
-void mpz_bin_uiui (mpz_t, unsigned long, unsigned long);
-
-int mpz_probab_prime_p (const mpz_t, int);
-
-int mpz_tstbit (const mpz_t, mp_bitcnt_t);
-void mpz_setbit (mpz_t, mp_bitcnt_t);
-void mpz_clrbit (mpz_t, mp_bitcnt_t);
-void mpz_combit (mpz_t, mp_bitcnt_t);
-
-void mpz_com (mpz_t, const mpz_t);
-void mpz_and (mpz_t, const mpz_t, const mpz_t);
-void mpz_ior (mpz_t, const mpz_t, const mpz_t);
-void mpz_xor (mpz_t, const mpz_t, const mpz_t);
-
-mp_bitcnt_t mpz_popcount (const mpz_t);
-mp_bitcnt_t mpz_hamdist (const mpz_t, const mpz_t);
-mp_bitcnt_t mpz_scan0 (const mpz_t, mp_bitcnt_t);
-mp_bitcnt_t mpz_scan1 (const mpz_t, mp_bitcnt_t);
-
-int mpz_fits_slong_p (const mpz_t);
-int mpz_fits_ulong_p (const mpz_t);
-int mpz_fits_sint_p (const mpz_t);
-int mpz_fits_uint_p (const mpz_t);
-int mpz_fits_sshort_p (const mpz_t);
-int mpz_fits_ushort_p (const mpz_t);
-long int mpz_get_si (const mpz_t);
-unsigned long int mpz_get_ui (const mpz_t);
-double mpz_get_d (const mpz_t);
-size_t mpz_size (const mpz_t);
-mp_limb_t mpz_getlimbn (const mpz_t, mp_size_t);
-
-void mpz_realloc2 (mpz_t, mp_bitcnt_t);
-mp_srcptr mpz_limbs_read (mpz_srcptr);
-mp_ptr mpz_limbs_modify (mpz_t, mp_size_t);
-mp_ptr mpz_limbs_write (mpz_t, mp_size_t);
-void mpz_limbs_finish (mpz_t, mp_size_t);
-mpz_srcptr mpz_roinit_n (mpz_t, mp_srcptr, mp_size_t);
-
-#define MPZ_ROINIT_N(xp, xs) {{0, (xs),(xp) }}
-
-void mpz_set_si (mpz_t, signed long int);
-void mpz_set_ui (mpz_t, unsigned long int);
-void mpz_set (mpz_t, const mpz_t);
-void mpz_set_d (mpz_t, double);
-
-void mpz_init_set_si (mpz_t, signed long int);
-void mpz_init_set_ui (mpz_t, unsigned long int);
-void mpz_init_set (mpz_t, const mpz_t);
-void mpz_init_set_d (mpz_t, double);
-
-size_t mpz_sizeinbase (const mpz_t, int);
-char *mpz_get_str (char *, int, const mpz_t);
-int mpz_set_str (mpz_t, const char *, int);
-int mpz_init_set_str (mpz_t, const char *, int);
-
-/* This long list taken from gmp.h. */
-/* For reference, "defined(EOF)" cannot be used here. In g++ 2.95.4,
- <iostream> defines EOF but not FILE. */
-#if defined (FILE) \
- || defined (H_STDIO) \
- || defined (_H_STDIO) /* AIX */ \
- || defined (_STDIO_H) /* glibc, Sun, SCO */ \
- || defined (_STDIO_H_) /* BSD, OSF */ \
- || defined (__STDIO_H) /* Borland */ \
- || defined (__STDIO_H__) /* IRIX */ \
- || defined (_STDIO_INCLUDED) /* HPUX */ \
- || defined (__dj_include_stdio_h_) /* DJGPP */ \
- || defined (_FILE_DEFINED) /* Microsoft */ \
- || defined (__STDIO__) /* Apple MPW MrC */ \
- || defined (_MSL_STDIO_H) /* Metrowerks */ \
- || defined (_STDIO_H_INCLUDED) /* QNX4 */ \
- || defined (_ISO_STDIO_ISO_H) /* Sun C++ */ \
- || defined (__STDIO_LOADED) /* VMS */ \
- || defined (_STDIO) /* HPE NonStop */ \
- || defined (__DEFINED_FILE) /* musl */
-size_t mpz_out_str (FILE *, int, const mpz_t);
-#endif
-
-void mpz_import (mpz_t, size_t, int, size_t, int, size_t, const void *);
-void *mpz_export (void *, size_t *, int, size_t, int, size_t, const mpz_t);
-
-#if defined (__cplusplus)
-}
-#endif
-#endif /* __MINI_GMP_H__ */
diff --git a/cross/lib/minmax.h b/cross/lib/minmax.h
deleted file mode 100644
index 1fbfc6616cf..00000000000
--- a/cross/lib/minmax.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/* MIN, MAX macros.
- Copyright (C) 1995, 1998, 2001, 2003, 2005, 2009-2023 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 _MINMAX_H
-#define _MINMAX_H
-
-/* Note: MIN, MAX are also defined in <sys/param.h> on some systems
- (glibc, IRIX, HP-UX, OSF/1). Therefore you might get warnings about
- MIN, MAX macro redefinitions on some systems; the workaround is to
- #include this file as the last one among the #include list. */
-
-/* Before we define the following symbols we get the <limits.h> file
- since otherwise we get redefinitions on some systems if <limits.h> is
- included after this file. Likewise for <sys/param.h>.
- If more than one of these system headers define MIN and MAX, pick just
- one of the headers (because the definitions most likely are the same). */
-#if HAVE_MINMAX_IN_LIMITS_H
-# include <limits.h>
-#elif HAVE_MINMAX_IN_SYS_PARAM_H
-# include <sys/param.h>
-#endif
-
-/* Note: MIN and MAX should be used with two arguments of the
- same type. They might not return the minimum and maximum of their two
- arguments, if the arguments have different types or have unusual
- floating-point values. For example, on a typical host with 32-bit 'int',
- 64-bit 'long long', and 64-bit IEEE 754 'double' types:
-
- MAX (-1, 2147483648) returns 4294967295.
- MAX (9007199254740992.0, 9007199254740993) returns 9007199254740992.0.
- MAX (NaN, 0.0) returns 0.0.
- MAX (+0.0, -0.0) returns -0.0.
-
- and in each case the answer is in some sense bogus. */
-
-/* MAX(a,b) returns the maximum of A and B. */
-#ifndef MAX
-# define MAX(a,b) ((a) > (b) ? (a) : (b))
-#endif
-
-/* MIN(a,b) returns the minimum of A and B. */
-#ifndef MIN
-# define MIN(a,b) ((a) < (b) ? (a) : (b))
-#endif
-
-#endif /* _MINMAX_H */
diff --git a/cross/lib/mkostemp.c b/cross/lib/mkostemp.c
deleted file mode 100644
index 5cd5b3ac583..00000000000
--- a/cross/lib/mkostemp.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Copyright (C) 1998-1999, 2001, 2005-2007, 2009-2023 Free Software
- Foundation, Inc.
- This file is derived from the one in the GNU C Library.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#if !_LIBC
-# include <config.h>
-#endif
-
-#include <stdlib.h>
-
-#if !_LIBC
-# include "tempname.h"
-# define __gen_tempname gen_tempname
-# ifndef __GTFILE
-# define __GT_FILE GT_FILE
-# endif
-#endif
-
-#include <stdio.h>
-
-#ifndef __GT_FILE
-# define __GT_FILE 0
-#endif
-
-/* Generate a unique temporary file name from XTEMPLATE.
- The last six characters of XTEMPLATE must be "XXXXXX";
- they are replaced with a string that makes the file name unique.
- Then open the file and return a fd. */
-int
-mkostemp (char *xtemplate, int flags)
-{
- return __gen_tempname (xtemplate, 0, flags, __GT_FILE);
-}
diff --git a/cross/lib/mktime-internal.h b/cross/lib/mktime-internal.h
deleted file mode 100644
index 709c36bdf56..00000000000
--- a/cross/lib/mktime-internal.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* Internals of mktime and related functions
- Copyright 2016-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Paul Eggert <eggert@cs.ucla.edu>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _LIBC
-# include <time.h>
-#endif
-
-/* mktime_offset_t is a signed type wide enough to hold a UTC offset
- in seconds, and used as part of the type of the offset-guess
- argument to mktime_internal. In Glibc, it is always long int.
- When in Gnulib, use time_t on platforms where time_t
- is signed, to be compatible with platforms like BeOS that export
- this implementation detail of mktime. On platforms where time_t is
- unsigned, GNU and POSIX code can assume 'int' is at least 32 bits
- which is wide enough for a UTC offset. */
-#ifdef _LIBC
-typedef long int mktime_offset_t;
-#elif defined TIME_T_IS_SIGNED
-typedef time_t mktime_offset_t;
-#else
-typedef int mktime_offset_t;
-#endif
-
-/* The source code uses identifiers like __time64_t for glibc
- timestamps that can contain 64-bit values even when time_t is only
- 32 bits. These are just macros for the ordinary identifiers unless
- compiling within glibc when time_t is 32 bits. */
-#if ! (defined _LIBC && __TIMESIZE != 64)
-# undef __time64_t
-# define __time64_t time_t
-# define __gmtime64_r __gmtime_r
-# define __localtime64_r __localtime_r
-# define __mktime64 mktime
-# define __timegm64 timegm
-#endif
-
-#ifndef _LIBC
-
-/* Although glibc source code uses leading underscores, Gnulib wants
- ordinary names.
-
- Portable standalone applications should supply a <time.h> that
- declares a POSIX-compliant localtime_r, for the benefit of older
- implementations that lack localtime_r or have a nonstandard one.
- Similarly for gmtime_r. See the gnulib time_r module for one way
- to implement this. */
-
-# undef __gmtime_r
-# undef __localtime_r
-# define __gmtime_r gmtime_r
-# define __localtime_r localtime_r
-
-# define __mktime_internal mktime_internal
-
-#endif
-
-/* Subroutine of mktime. Return the time_t representation of TP and
- normalize TP, given that a struct tm * maps to a time_t as performed
- by FUNC. Record next guess for localtime-gmtime offset in *OFFSET. */
-extern __time64_t __mktime_internal (struct tm *tp,
- struct tm *(*func) (__time64_t const *,
- struct tm *),
- mktime_offset_t *offset) attribute_hidden;
diff --git a/cross/lib/mktime.c b/cross/lib/mktime.c
deleted file mode 100644
index 94a4320e6ca..00000000000
--- a/cross/lib/mktime.c
+++ /dev/null
@@ -1,578 +0,0 @@
-/* Convert a 'struct tm' to a time_t value.
- Copyright (C) 1993-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Paul Eggert <eggert@twinsun.com>.
-
- 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/>. */
-
-/* The following macros influence what gets defined when this file is compiled:
-
- Macro/expression Which gnulib module This compilation unit
- should define
-
- _LIBC (glibc proper) mktime
-
- NEED_MKTIME_WORKING mktime rpl_mktime
- || NEED_MKTIME_WINDOWS
-
- NEED_MKTIME_INTERNAL mktime-internal mktime_internal
- */
-
-#ifndef _LIBC
-# include <libc-config.h>
-#endif
-
-/* Assume that leap seconds are possible, unless told otherwise.
- If the host has a 'zic' command with a '-L leapsecondfilename' option,
- then it supports leap seconds; otherwise it probably doesn't. */
-#ifndef LEAP_SECONDS_POSSIBLE
-# define LEAP_SECONDS_POSSIBLE 1
-#endif
-
-#include <time.h>
-
-#include <errno.h>
-#include <limits.h>
-#include <stdbool.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <intprops.h>
-#include <verify.h>
-
-#ifndef NEED_MKTIME_INTERNAL
-# define NEED_MKTIME_INTERNAL 0
-#endif
-#ifndef NEED_MKTIME_WINDOWS
-# define NEED_MKTIME_WINDOWS 0
-#endif
-#ifndef NEED_MKTIME_WORKING
-# define NEED_MKTIME_WORKING 0
-#endif
-
-#include "mktime-internal.h"
-
-#if !defined _LIBC && (NEED_MKTIME_WORKING || NEED_MKTIME_WINDOWS)
-static void
-my_tzset (void)
-{
-# if NEED_MKTIME_WINDOWS
- /* Rectify the value of the environment variable TZ.
- There are four possible kinds of such values:
- - Traditional US time zone names, e.g. "PST8PDT". Syntax: see
- <https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/tzset>
- - Time zone names based on geography, that contain one or more
- slashes, e.g. "Europe/Moscow".
- - Time zone names based on geography, without slashes, e.g.
- "Singapore".
- - Time zone names that contain explicit DST rules. Syntax: see
- <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_03>
- The Microsoft CRT understands only the first kind. It produces incorrect
- results if the value of TZ is of the other kinds.
- But in a Cygwin environment, /etc/profile.d/tzset.sh sets TZ to a value
- of the second kind for most geographies, or of the first kind in a few
- other geographies. If it is of the second kind, neutralize it. For the
- Microsoft CRT, an absent or empty TZ means the time zone that the user
- has set in the Windows Control Panel.
- If the value of TZ is of the third or fourth kind -- Cygwin programs
- understand these syntaxes as well --, it does not matter whether we
- neutralize it or not, since these values occur only when a Cygwin user
- has set TZ explicitly; this case is 1. rare and 2. under the user's
- responsibility. */
- const char *tz = getenv ("TZ");
- if (tz != NULL && strchr (tz, '/') != NULL)
- _putenv ("TZ=");
-# else
- tzset ();
-# endif
-}
-# undef __tzset
-# define __tzset() my_tzset ()
-#endif
-
-#if defined _LIBC || NEED_MKTIME_WORKING || NEED_MKTIME_INTERNAL
-
-/* A signed type that can represent an integer number of years
- multiplied by four times the number of seconds in a year. It is
- needed when converting a tm_year value times the number of seconds
- in a year. The factor of four comes because these products need
- to be subtracted from each other, and sometimes with an offset
- added to them, and then with another timestamp added, without
- worrying about overflow.
-
- Much of the code uses long_int to represent __time64_t values, to
- lessen the hassle of dealing with platforms where __time64_t is
- unsigned, and because long_int should suffice to represent all
- __time64_t values that mktime can generate even on platforms where
- __time64_t is wider than the int components of struct tm. */
-
-#if INT_MAX <= LONG_MAX / 4 / 366 / 24 / 60 / 60
-typedef long int long_int;
-#else
-typedef long long int long_int;
-#endif
-verify (INT_MAX <= TYPE_MAXIMUM (long_int) / 4 / 366 / 24 / 60 / 60);
-
-/* Shift A right by B bits portably, by dividing A by 2**B and
- truncating towards minus infinity. B should be in the range 0 <= B
- <= LONG_INT_BITS - 2, where LONG_INT_BITS is the number of useful
- bits in a long_int. LONG_INT_BITS is at least 32.
-
- ISO C99 says that A >> B is implementation-defined if A < 0. Some
- implementations (e.g., UNICOS 9.0 on a Cray Y-MP EL) don't shift
- right in the usual way when A < 0, so SHR falls back on division if
- ordinary A >> B doesn't seem to be the usual signed shift. */
-
-static long_int
-shr (long_int a, int b)
-{
- long_int one = 1;
- return (-one >> 1 == -1
- ? a >> b
- : (a + (a < 0)) / (one << b) - (a < 0));
-}
-
-/* Bounds for the intersection of __time64_t and long_int. */
-
-static long_int const mktime_min
- = ((TYPE_SIGNED (__time64_t)
- && TYPE_MINIMUM (__time64_t) < TYPE_MINIMUM (long_int))
- ? TYPE_MINIMUM (long_int) : TYPE_MINIMUM (__time64_t));
-static long_int const mktime_max
- = (TYPE_MAXIMUM (long_int) < TYPE_MAXIMUM (__time64_t)
- ? TYPE_MAXIMUM (long_int) : TYPE_MAXIMUM (__time64_t));
-
-#define EPOCH_YEAR 1970
-#define TM_YEAR_BASE 1900
-verify (TM_YEAR_BASE % 100 == 0);
-
-/* Is YEAR + TM_YEAR_BASE a leap year? */
-static bool
-leapyear (long_int year)
-{
- /* Don't add YEAR to TM_YEAR_BASE, as that might overflow.
- Also, work even if YEAR is negative. */
- return
- ((year & 3) == 0
- && (year % 100 != 0
- || ((year / 100) & 3) == (- (TM_YEAR_BASE / 100) & 3)));
-}
-
-/* How many days come before each month (0-12). */
-#ifndef _LIBC
-static
-#endif
-const unsigned short int __mon_yday[2][13] =
- {
- /* Normal years. */
- { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
- /* Leap years. */
- { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
- };
-
-
-/* Do the values A and B differ according to the rules for tm_isdst?
- A and B differ if one is zero and the other positive. */
-static bool
-isdst_differ (int a, int b)
-{
- return (!a != !b) && (0 <= a) && (0 <= b);
-}
-
-/* Return an integer value measuring (YEAR1-YDAY1 HOUR1:MIN1:SEC1) -
- (YEAR0-YDAY0 HOUR0:MIN0:SEC0) in seconds, assuming that the clocks
- were not adjusted between the timestamps.
-
- The YEAR values uses the same numbering as TP->tm_year. Values
- need not be in the usual range. However, YEAR1 - YEAR0 must not
- overflow even when multiplied by three times the number of seconds
- in a year, and likewise for YDAY1 - YDAY0 and three times the
- number of seconds in a day. */
-
-static long_int
-ydhms_diff (long_int year1, long_int yday1, int hour1, int min1, int sec1,
- int year0, int yday0, int hour0, int min0, int sec0)
-{
- verify (-1 / 2 == 0);
-
- /* Compute intervening leap days correctly even if year is negative.
- Take care to avoid integer overflow here. */
- int a4 = shr (year1, 2) + shr (TM_YEAR_BASE, 2) - ! (year1 & 3);
- int b4 = shr (year0, 2) + shr (TM_YEAR_BASE, 2) - ! (year0 & 3);
- int a100 = (a4 + (a4 < 0)) / 25 - (a4 < 0);
- int b100 = (b4 + (b4 < 0)) / 25 - (b4 < 0);
- int a400 = shr (a100, 2);
- int b400 = shr (b100, 2);
- int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400);
-
- /* Compute the desired time without overflowing. */
- long_int years = year1 - year0;
- long_int days = 365 * years + yday1 - yday0 + intervening_leap_days;
- long_int hours = 24 * days + hour1 - hour0;
- long_int minutes = 60 * hours + min1 - min0;
- long_int seconds = 60 * minutes + sec1 - sec0;
- return seconds;
-}
-
-/* Return the average of A and B, even if A + B would overflow.
- Round toward positive infinity. */
-static long_int
-long_int_avg (long_int a, long_int b)
-{
- return shr (a, 1) + shr (b, 1) + ((a | b) & 1);
-}
-
-/* Return a long_int value corresponding to (YEAR-YDAY HOUR:MIN:SEC)
- minus *TP seconds, assuming no clock adjustments occurred between
- the two timestamps.
-
- YEAR and YDAY must not be so large that multiplying them by three times the
- number of seconds in a year (or day, respectively) would overflow long_int.
- *TP should be in the usual range. */
-static long_int
-tm_diff (long_int year, long_int yday, int hour, int min, int sec,
- struct tm const *tp)
-{
- return ydhms_diff (year, yday, hour, min, sec,
- tp->tm_year, tp->tm_yday,
- tp->tm_hour, tp->tm_min, tp->tm_sec);
-}
-
-/* Use CONVERT to convert T to a struct tm value in *TM. T must be in
- range for __time64_t. Return TM if successful, NULL (setting errno) on
- failure. */
-static struct tm *
-convert_time (struct tm *(*convert) (const __time64_t *, struct tm *),
- long_int t, struct tm *tm)
-{
- __time64_t x = t;
- return convert (&x, tm);
-}
-
-/* Use CONVERT to convert *T to a broken down time in *TP.
- If *T is out of range for conversion, adjust it so that
- it is the nearest in-range value and then convert that.
- A value is in range if it fits in both __time64_t and long_int.
- Return TP on success, NULL (setting errno) on failure. */
-static struct tm *
-ranged_convert (struct tm *(*convert) (const __time64_t *, struct tm *),
- long_int *t, struct tm *tp)
-{
- long_int t1 = (*t < mktime_min ? mktime_min
- : *t <= mktime_max ? *t : mktime_max);
- struct tm *r = convert_time (convert, t1, tp);
- if (r)
- {
- *t = t1;
- return r;
- }
- if (errno != EOVERFLOW)
- return NULL;
-
- long_int bad = t1;
- long_int ok = 0;
- struct tm oktm; oktm.tm_sec = -1;
-
- /* BAD is a known out-of-range value, and OK is a known in-range one.
- Use binary search to narrow the range between BAD and OK until
- they differ by 1. */
- while (true)
- {
- long_int mid = long_int_avg (ok, bad);
- if (mid == ok || mid == bad)
- break;
- if (convert_time (convert, mid, tp))
- ok = mid, oktm = *tp;
- else if (errno != EOVERFLOW)
- return NULL;
- else
- bad = mid;
- }
-
- if (oktm.tm_sec < 0)
- return NULL;
- *t = ok;
- *tp = oktm;
- return tp;
-}
-
-
-/* Convert *TP to a __time64_t value, inverting
- the monotonic and mostly-unit-linear conversion function CONVERT.
- Use *OFFSET to keep track of a guess at the offset of the result,
- compared to what the result would be for UTC without leap seconds.
- If *OFFSET's guess is correct, only one CONVERT call is needed.
- If successful, set *TP to the canonicalized struct tm;
- otherwise leave *TP alone, return ((time_t) -1) and set errno.
- This function is external because it is used also by timegm.c. */
-__time64_t
-__mktime_internal (struct tm *tp,
- struct tm *(*convert) (const __time64_t *, struct tm *),
- mktime_offset_t *offset)
-{
- struct tm tm;
-
- /* The maximum number of probes (calls to CONVERT) should be enough
- to handle any combinations of time zone rule changes, solar time,
- leap seconds, and oscillations around a spring-forward gap.
- POSIX.1 prohibits leap seconds, but some hosts have them anyway. */
- int remaining_probes = 6;
-
- /* Time requested. Copy it in case CONVERT modifies *TP; this can
- occur if TP is localtime's returned value and CONVERT is localtime. */
- int sec = tp->tm_sec;
- int min = tp->tm_min;
- int hour = tp->tm_hour;
- int mday = tp->tm_mday;
- int mon = tp->tm_mon;
- int year_requested = tp->tm_year;
- int isdst = tp->tm_isdst;
-
- /* 1 if the previous probe was DST. */
- int dst2 = 0;
-
- /* Ensure that mon is in range, and set year accordingly. */
- int mon_remainder = mon % 12;
- int negative_mon_remainder = mon_remainder < 0;
- int mon_years = mon / 12 - negative_mon_remainder;
- long_int lyear_requested = year_requested;
- long_int year = lyear_requested + mon_years;
-
- /* The other values need not be in range:
- the remaining code handles overflows correctly. */
-
- /* Calculate day of year from year, month, and day of month.
- The result need not be in range. */
- int mon_yday = ((__mon_yday[leapyear (year)]
- [mon_remainder + 12 * negative_mon_remainder])
- - 1);
- long_int lmday = mday;
- long_int yday = mon_yday + lmday;
-
- mktime_offset_t off = *offset;
- int negative_offset_guess;
-
- int sec_requested = sec;
-
- if (LEAP_SECONDS_POSSIBLE)
- {
- /* Handle out-of-range seconds specially,
- since ydhms_diff assumes every minute has 60 seconds. */
- if (sec < 0)
- sec = 0;
- if (59 < sec)
- sec = 59;
- }
-
- /* Invert CONVERT by probing. First assume the same offset as last
- time. */
-
- INT_SUBTRACT_WRAPV (0, off, &negative_offset_guess);
- long_int t0 = ydhms_diff (year, yday, hour, min, sec,
- EPOCH_YEAR - TM_YEAR_BASE, 0, 0, 0,
- negative_offset_guess);
- long_int t = t0, t1 = t0, t2 = t0;
-
- /* Repeatedly use the error to improve the guess. */
-
- while (true)
- {
- if (! ranged_convert (convert, &t, &tm))
- return -1;
- long_int dt = tm_diff (year, yday, hour, min, sec, &tm);
- if (dt == 0)
- break;
-
- if (t == t1 && t != t2
- && (tm.tm_isdst < 0
- || (isdst < 0
- ? dst2 <= (tm.tm_isdst != 0)
- : (isdst != 0) != (tm.tm_isdst != 0))))
- /* We can't possibly find a match, as we are oscillating
- between two values. The requested time probably falls
- within a spring-forward gap of size DT. Follow the common
- practice in this case, which is to return a time that is DT
- away from the requested time, preferring a time whose
- tm_isdst differs from the requested value. (If no tm_isdst
- was requested and only one of the two values has a nonzero
- tm_isdst, prefer that value.) In practice, this is more
- useful than returning -1. */
- goto offset_found;
-
- remaining_probes--;
- if (remaining_probes == 0)
- {
- __set_errno (EOVERFLOW);
- return -1;
- }
-
- t1 = t2, t2 = t, t += dt, dst2 = tm.tm_isdst != 0;
- }
-
- /* We have a match. Check whether tm.tm_isdst has the requested
- value, if any. */
- if (isdst_differ (isdst, tm.tm_isdst))
- {
- /* tm.tm_isdst has the wrong value. Look for a neighboring
- time with the right value, and use its UTC offset.
-
- Heuristic: probe the adjacent timestamps in both directions,
- looking for the desired isdst. If none is found within a
- reasonable duration bound, assume a one-hour DST difference.
- This should work for all real time zone histories in the tz
- database. */
-
- /* +1 if we wanted standard time but got DST, -1 if the reverse. */
- int dst_difference = (isdst == 0) - (tm.tm_isdst == 0);
-
- /* Distance between probes when looking for a DST boundary. In
- tzdata2003a, the shortest period of DST is 601200 seconds
- (e.g., America/Recife starting 2000-10-08 01:00), and the
- shortest period of non-DST surrounded by DST is 694800
- seconds (Africa/Tunis starting 1943-04-17 01:00). Use the
- minimum of these two values, so we don't miss these short
- periods when probing. */
- int stride = 601200;
-
- /* In TZDB 2021e, the longest period of DST (or of non-DST), in
- which the DST (or adjacent DST) difference is not one hour,
- is 457243209 seconds: e.g., America/Cambridge_Bay with leap
- seconds, starting 1965-10-31 00:00 in a switch from
- double-daylight time (-05) to standard time (-07), and
- continuing to 1980-04-27 02:00 in a switch from standard time
- (-07) to daylight time (-06). */
- int duration_max = 457243209;
-
- /* Search in both directions, so the maximum distance is half
- the duration; add the stride to avoid off-by-1 problems. */
- int delta_bound = duration_max / 2 + stride;
-
- int delta, direction;
-
- for (delta = stride; delta < delta_bound; delta += stride)
- for (direction = -1; direction <= 1; direction += 2)
- {
- long_int ot;
- if (! INT_ADD_WRAPV (t, delta * direction, &ot))
- {
- struct tm otm;
- if (! ranged_convert (convert, &ot, &otm))
- return -1;
- if (! isdst_differ (isdst, otm.tm_isdst))
- {
- /* We found the desired tm_isdst.
- Extrapolate back to the desired time. */
- long_int gt = ot + tm_diff (year, yday, hour, min, sec,
- &otm);
- if (mktime_min <= gt && gt <= mktime_max)
- {
- if (convert_time (convert, gt, &tm))
- {
- t = gt;
- goto offset_found;
- }
- if (errno != EOVERFLOW)
- return -1;
- }
- }
- }
- }
-
- /* No unusual DST offset was found nearby. Assume one-hour DST. */
- t += 60 * 60 * dst_difference;
- if (mktime_min <= t && t <= mktime_max && convert_time (convert, t, &tm))
- goto offset_found;
-
- __set_errno (EOVERFLOW);
- return -1;
- }
-
- offset_found:
- /* Set *OFFSET to the low-order bits of T - T0 - NEGATIVE_OFFSET_GUESS.
- This is just a heuristic to speed up the next mktime call, and
- correctness is unaffected if integer overflow occurs here. */
- INT_SUBTRACT_WRAPV (t, t0, offset);
- INT_SUBTRACT_WRAPV (*offset, negative_offset_guess, offset);
-
- if (LEAP_SECONDS_POSSIBLE && sec_requested != tm.tm_sec)
- {
- /* Adjust time to reflect the tm_sec requested, not the normalized value.
- Also, repair any damage from a false match due to a leap second. */
- long_int sec_adjustment = sec == 0 && tm.tm_sec == 60;
- sec_adjustment -= sec;
- sec_adjustment += sec_requested;
- if (INT_ADD_WRAPV (t, sec_adjustment, &t)
- || ! (mktime_min <= t && t <= mktime_max))
- {
- __set_errno (EOVERFLOW);
- return -1;
- }
- if (! convert_time (convert, t, &tm))
- return -1;
- }
-
- *tp = tm;
- return t;
-}
-
-#endif /* _LIBC || NEED_MKTIME_WORKING || NEED_MKTIME_INTERNAL */
-
-#if defined _LIBC || NEED_MKTIME_WORKING || NEED_MKTIME_WINDOWS
-
-/* Convert *TP to a __time64_t value. */
-__time64_t
-__mktime64 (struct tm *tp)
-{
- /* POSIX.1 8.1.1 requires that whenever mktime() is called, the
- time zone names contained in the external variable 'tzname' shall
- be set as if the tzset() function had been called. */
- __tzset ();
-
-# if defined _LIBC || NEED_MKTIME_WORKING
- static mktime_offset_t localtime_offset;
- return __mktime_internal (tp, __localtime64_r, &localtime_offset);
-# else
-# undef mktime
- return mktime (tp);
-# endif
-}
-#endif /* _LIBC || NEED_MKTIME_WORKING || NEED_MKTIME_WINDOWS */
-
-#if defined _LIBC && __TIMESIZE != 64
-
-libc_hidden_def (__mktime64)
-
-time_t
-mktime (struct tm *tp)
-{
- struct tm tm = *tp;
- __time64_t t = __mktime64 (&tm);
- if (in_time_t_range (t))
- {
- *tp = tm;
- return t;
- }
- else
- {
- __set_errno (EOVERFLOW);
- return -1;
- }
-}
-
-#endif
-
-weak_alias (mktime, timelocal)
-libc_hidden_def (mktime)
-libc_hidden_weak (timelocal)
diff --git a/cross/lib/nanosleep.c b/cross/lib/nanosleep.c
deleted file mode 100644
index 3f295f49b5d..00000000000
--- a/cross/lib/nanosleep.c
+++ /dev/null
@@ -1,193 +0,0 @@
-/* Provide a replacement for the POSIX nanosleep function.
-
- Copyright (C) 1999-2000, 2002, 2004-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* written by Jim Meyering
- and Bruno Haible for the native Windows part */
-
-#include <config.h>
-
-#include <time.h>
-
-#include "intprops.h"
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/select.h>
-#include <signal.h>
-
-#include <errno.h>
-
-#include <unistd.h>
-
-
-enum { BILLION = 1000 * 1000 * 1000 };
-
-#if HAVE_BUG_BIG_NANOSLEEP
-
-int
-nanosleep (const struct timespec *requested_delay,
- struct timespec *remaining_delay)
-# undef nanosleep
-{
- /* nanosleep mishandles large sleeps due to internal overflow problems.
- The worst known case of this is Linux 2.6.9 with glibc 2.3.4, which
- can't sleep more than 24.85 days (2^31 milliseconds). Similarly,
- cygwin 1.5.x, which can't sleep more than 49.7 days (2^32 milliseconds).
- Solve this by breaking the sleep up into smaller chunks. */
-
- if (requested_delay->tv_nsec < 0 || BILLION <= requested_delay->tv_nsec)
- {
- errno = EINVAL;
- return -1;
- }
-
- {
- /* Verify that time_t is large enough. */
- static_assert (TYPE_MAXIMUM (time_t) / 24 / 24 / 60 / 60);
- const time_t limit = 24 * 24 * 60 * 60;
- time_t seconds = requested_delay->tv_sec;
- struct timespec intermediate;
- intermediate.tv_nsec = requested_delay->tv_nsec;
-
- while (limit < seconds)
- {
- int result;
- intermediate.tv_sec = limit;
- result = nanosleep (&intermediate, remaining_delay);
- seconds -= limit;
- if (result)
- {
- if (remaining_delay)
- remaining_delay->tv_sec += seconds;
- return result;
- }
- intermediate.tv_nsec = 0;
- }
- intermediate.tv_sec = seconds;
- return nanosleep (&intermediate, remaining_delay);
- }
-}
-
-#elif defined _WIN32 && ! defined __CYGWIN__
-/* Native Windows platforms. */
-
-# define WIN32_LEAN_AND_MEAN
-# include <windows.h>
-
-/* The Windows API function Sleep() has a resolution of about 15 ms and takes
- at least 5 ms to execute. We use this function for longer time periods.
- Additionally, we use busy-looping over short time periods, to get a
- resolution of about 0.01 ms. In order to measure such short timespans,
- we use the QueryPerformanceCounter() function. */
-
-int
-nanosleep (const struct timespec *requested_delay,
- struct timespec *remaining_delay)
-{
- static bool initialized;
- /* Number of performance counter increments per nanosecond,
- or zero if it could not be determined. */
- static double ticks_per_nanosecond;
-
- if (requested_delay->tv_nsec < 0 || BILLION <= requested_delay->tv_nsec)
- {
- errno = EINVAL;
- return -1;
- }
-
- /* For requested delays of one second or more, 15ms resolution is
- sufficient. */
- if (requested_delay->tv_sec == 0)
- {
- if (!initialized)
- {
- /* Initialize ticks_per_nanosecond. */
- LARGE_INTEGER ticks_per_second;
-
- if (QueryPerformanceFrequency (&ticks_per_second))
- ticks_per_nanosecond =
- (double) ticks_per_second.QuadPart / 1000000000.0;
-
- initialized = true;
- }
- if (ticks_per_nanosecond)
- {
- /* QueryPerformanceFrequency worked. We can use
- QueryPerformanceCounter. Use a combination of Sleep and
- busy-looping. */
- /* Number of milliseconds to pass to the Sleep function.
- Since Sleep can take up to 8 ms less or 8 ms more than requested
- (or maybe more if the system is loaded), we subtract 10 ms. */
- int sleep_millis = (int) requested_delay->tv_nsec / 1000000 - 10;
- /* Determine how many ticks to delay. */
- LONGLONG wait_ticks = requested_delay->tv_nsec * ticks_per_nanosecond;
- /* Start. */
- LARGE_INTEGER counter_before;
- if (QueryPerformanceCounter (&counter_before))
- {
- /* Wait until the performance counter has reached this value.
- We don't need to worry about overflow, because the performance
- counter is reset at reboot, and with a frequency of 3.6E6
- ticks per second 63 bits suffice for over 80000 years. */
- LONGLONG wait_until = counter_before.QuadPart + wait_ticks;
- /* Use Sleep for the longest part. */
- if (sleep_millis > 0)
- Sleep (sleep_millis);
- /* Busy-loop for the rest. */
- for (;;)
- {
- LARGE_INTEGER counter_after;
- if (!QueryPerformanceCounter (&counter_after))
- /* QueryPerformanceCounter failed, but succeeded earlier.
- Should not happen. */
- break;
- if (counter_after.QuadPart >= wait_until)
- /* The requested time has elapsed. */
- break;
- }
- goto done;
- }
- }
- }
- /* Implementation for long delays and as fallback. */
- Sleep (requested_delay->tv_sec * 1000 + requested_delay->tv_nsec / 1000000);
-
- done:
- /* Sleep is not interruptible. So there is no remaining delay. */
- if (remaining_delay != NULL)
- {
- remaining_delay->tv_sec = 0;
- remaining_delay->tv_nsec = 0;
- }
- return 0;
-}
-
-#else
-/* Other platforms lacking nanosleep.
- It's not clear whether these are still practical porting targets.
- For now, just fall back on pselect. */
-
-/* Suspend execution for at least *REQUESTED_DELAY seconds. The
- *REMAINING_DELAY part isn't implemented yet. */
-
-int
-nanosleep (const struct timespec *requested_delay,
- struct timespec *remaining_delay)
-{
- return pselect (0, NULL, NULL, NULL, requested_delay, NULL);
-}
-#endif
diff --git a/cross/lib/nproc.c b/cross/lib/nproc.c
deleted file mode 100644
index 2740c458c11..00000000000
--- a/cross/lib/nproc.c
+++ /dev/null
@@ -1,404 +0,0 @@
-/* Detect the number of processors.
-
- Copyright (C) 2009-2023 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 Glen Lenker and Bruno Haible. */
-
-#include <config.h>
-#include "nproc.h"
-
-#include <limits.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#if HAVE_PTHREAD_GETAFFINITY_NP && 0
-# include <pthread.h>
-# include <sched.h>
-#endif
-#if HAVE_SCHED_GETAFFINITY_LIKE_GLIBC || HAVE_SCHED_GETAFFINITY_NP
-# include <sched.h>
-#endif
-
-#include <sys/types.h>
-
-#if HAVE_SYS_PSTAT_H
-# include <sys/pstat.h>
-#endif
-
-#if HAVE_SYS_SYSMP_H
-# include <sys/sysmp.h>
-#endif
-
-#if HAVE_SYS_PARAM_H
-# include <sys/param.h>
-#endif
-
-#if HAVE_SYS_SYSCTL_H && ! defined __GLIBC__
-# include <sys/sysctl.h>
-#endif
-
-#if defined _WIN32 && ! defined __CYGWIN__
-# define WIN32_LEAN_AND_MEAN
-# include <windows.h>
-#endif
-
-#include "c-ctype.h"
-
-#include "minmax.h"
-
-#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
-
-/* Return the number of processors available to the current process, based
- on a modern system call that returns the "affinity" between the current
- process and each CPU. Return 0 if unknown or if such a system call does
- not exist. */
-static unsigned long
-num_processors_via_affinity_mask (void)
-{
- /* glibc >= 2.3.3 with NPTL and NetBSD 5 have pthread_getaffinity_np,
- but with different APIs. Also it requires linking with -lpthread.
- Therefore this code is not enabled.
- glibc >= 2.3.4 has sched_getaffinity whereas NetBSD 5 has
- sched_getaffinity_np. */
-#if HAVE_PTHREAD_GETAFFINITY_NP && defined __GLIBC__ && 0
- {
- cpu_set_t set;
-
- if (pthread_getaffinity_np (pthread_self (), sizeof (set), &set) == 0)
- {
- unsigned long count;
-
-# ifdef CPU_COUNT
- /* glibc >= 2.6 has the CPU_COUNT macro. */
- count = CPU_COUNT (&set);
-# else
- size_t i;
-
- count = 0;
- for (i = 0; i < CPU_SETSIZE; i++)
- if (CPU_ISSET (i, &set))
- count++;
-# endif
- if (count > 0)
- return count;
- }
- }
-#elif HAVE_PTHREAD_GETAFFINITY_NP && defined __NetBSD__ && 0
- {
- cpuset_t *set;
-
- set = cpuset_create ();
- if (set != NULL)
- {
- unsigned long count = 0;
-
- if (pthread_getaffinity_np (pthread_self (), cpuset_size (set), set)
- == 0)
- {
- cpuid_t i;
-
- for (i = 0;; i++)
- {
- int ret = cpuset_isset (i, set);
- if (ret < 0)
- break;
- if (ret > 0)
- count++;
- }
- }
- cpuset_destroy (set);
- if (count > 0)
- return count;
- }
- }
-#elif HAVE_SCHED_GETAFFINITY_LIKE_GLIBC /* glibc >= 2.3.4 */
- {
- cpu_set_t set;
-
- if (sched_getaffinity (0, sizeof (set), &set) == 0)
- {
- unsigned long count;
-
-# ifdef CPU_COUNT
- /* glibc >= 2.6 has the CPU_COUNT macro. */
- count = CPU_COUNT (&set);
-# else
- size_t i;
-
- count = 0;
- for (i = 0; i < CPU_SETSIZE; i++)
- if (CPU_ISSET (i, &set))
- count++;
-# endif
- if (count > 0)
- return count;
- }
- }
-#elif HAVE_SCHED_GETAFFINITY_NP /* NetBSD >= 5 */
- {
- cpuset_t *set;
-
- set = cpuset_create ();
- if (set != NULL)
- {
- unsigned long count = 0;
-
- if (sched_getaffinity_np (getpid (), cpuset_size (set), set) == 0)
- {
- cpuid_t i;
-
- for (i = 0;; i++)
- {
- int ret = cpuset_isset (i, set);
- if (ret < 0)
- break;
- if (ret > 0)
- count++;
- }
- }
- cpuset_destroy (set);
- if (count > 0)
- return count;
- }
- }
-#endif
-
-#if defined _WIN32 && ! defined __CYGWIN__
- { /* This works on native Windows platforms. */
- DWORD_PTR process_mask;
- DWORD_PTR system_mask;
-
- if (GetProcessAffinityMask (GetCurrentProcess (),
- &process_mask, &system_mask))
- {
- DWORD_PTR mask = process_mask;
- unsigned long count = 0;
-
- for (; mask != 0; mask = mask >> 1)
- if (mask & 1)
- count++;
- if (count > 0)
- return count;
- }
- }
-#endif
-
- return 0;
-}
-
-
-/* Return the total number of processors. Here QUERY must be one of
- NPROC_ALL, NPROC_CURRENT. The result is guaranteed to be at least 1. */
-static unsigned long int
-num_processors_ignoring_omp (enum nproc_query query)
-{
- /* On systems with a modern affinity mask system call, we have
- sysconf (_SC_NPROCESSORS_CONF)
- >= sysconf (_SC_NPROCESSORS_ONLN)
- >= num_processors_via_affinity_mask ()
- The first number is the number of CPUs configured in the system.
- The second number is the number of CPUs available to the scheduler.
- The third number is the number of CPUs available to the current process.
-
- Note! On Linux systems with glibc, the first and second number come from
- the /sys and /proc file systems (see
- glibc/sysdeps/unix/sysv/linux/getsysstats.c).
- In some situations these file systems are not mounted, and the sysconf call
- returns 1 or 2 (<https://sourceware.org/bugzilla/show_bug.cgi?id=21542>),
- which does not reflect the reality. */
-
- if (query == NPROC_CURRENT)
- {
- /* Try the modern affinity mask system call. */
- {
- unsigned long nprocs = num_processors_via_affinity_mask ();
-
- if (nprocs > 0)
- return nprocs;
- }
-
-#if defined _SC_NPROCESSORS_ONLN
- { /* This works on glibc, Mac OS X 10.5, FreeBSD, AIX, OSF/1, Solaris,
- Cygwin, Haiku. */
- long int nprocs = sysconf (_SC_NPROCESSORS_ONLN);
- if (nprocs > 0)
- return nprocs;
- }
-#endif
- }
- else /* query == NPROC_ALL */
- {
-#if defined _SC_NPROCESSORS_CONF
- { /* This works on glibc, Mac OS X 10.5, FreeBSD, AIX, OSF/1, Solaris,
- Cygwin, Haiku. */
- long int nprocs = sysconf (_SC_NPROCESSORS_CONF);
-
-# if __GLIBC__ >= 2 && defined __linux__
- /* On Linux systems with glibc, this information comes from the /sys and
- /proc file systems (see glibc/sysdeps/unix/sysv/linux/getsysstats.c).
- In some situations these file systems are not mounted, and the
- sysconf call returns 1 or 2. But we wish to guarantee that
- num_processors (NPROC_ALL) >= num_processors (NPROC_CURRENT). */
- if (nprocs == 1 || nprocs == 2)
- {
- unsigned long nprocs_current = num_processors_via_affinity_mask ();
-
- if (/* nprocs_current > 0 && */ nprocs_current > nprocs)
- nprocs = nprocs_current;
- }
-# endif
-
- if (nprocs > 0)
- return nprocs;
- }
-#endif
- }
-
-#if HAVE_PSTAT_GETDYNAMIC
- { /* This works on HP-UX. */
- struct pst_dynamic psd;
- if (pstat_getdynamic (&psd, sizeof psd, 1, 0) >= 0)
- {
- /* The field psd_proc_cnt contains the number of active processors.
- In newer releases of HP-UX 11, the field psd_max_proc_cnt includes
- deactivated processors. */
- if (query == NPROC_CURRENT)
- {
- if (psd.psd_proc_cnt > 0)
- return psd.psd_proc_cnt;
- }
- else
- {
- if (psd.psd_max_proc_cnt > 0)
- return psd.psd_max_proc_cnt;
- }
- }
- }
-#endif
-
-#if HAVE_SYSMP && defined MP_NAPROCS && defined MP_NPROCS
- { /* This works on IRIX. */
- /* MP_NPROCS yields the number of installed processors.
- MP_NAPROCS yields the number of processors available to unprivileged
- processes. */
- int nprocs =
- sysmp (query == NPROC_CURRENT && getuid () != 0
- ? MP_NAPROCS
- : MP_NPROCS);
- if (nprocs > 0)
- return nprocs;
- }
-#endif
-
- /* Finally, as fallback, use the APIs that don't distinguish between
- NPROC_CURRENT and NPROC_ALL. */
-
-#if HAVE_SYSCTL && ! defined __GLIBC__ && defined HW_NCPU
- { /* This works on macOS, FreeBSD, NetBSD, OpenBSD.
- macOS 10.14 does not allow mib to be const. */
- int nprocs;
- size_t len = sizeof (nprocs);
- static int mib[][2] = {
-# ifdef HW_NCPUONLINE
- { CTL_HW, HW_NCPUONLINE },
-# endif
- { CTL_HW, HW_NCPU }
- };
- for (int i = 0; i < ARRAY_SIZE (mib); i++)
- {
- if (sysctl (mib[i], ARRAY_SIZE (mib[i]), &nprocs, &len, NULL, 0) == 0
- && len == sizeof (nprocs)
- && 0 < nprocs)
- return nprocs;
- }
- }
-#endif
-
-#if defined _WIN32 && ! defined __CYGWIN__
- { /* This works on native Windows platforms. */
- SYSTEM_INFO system_info;
- GetSystemInfo (&system_info);
- if (0 < system_info.dwNumberOfProcessors)
- return system_info.dwNumberOfProcessors;
- }
-#endif
-
- return 1;
-}
-
-/* Parse OMP environment variables without dependence on OMP.
- Return 0 for invalid values. */
-static unsigned long int
-parse_omp_threads (char const* threads)
-{
- unsigned long int ret = 0;
-
- if (threads == NULL)
- return ret;
-
- /* The OpenMP spec says that the value assigned to the environment variables
- "may have leading and trailing white space". */
- while (*threads != '\0' && c_isspace (*threads))
- threads++;
-
- /* Convert it from positive decimal to 'unsigned long'. */
- if (c_isdigit (*threads))
- {
- char *endptr = NULL;
- unsigned long int value = strtoul (threads, &endptr, 10);
-
- if (endptr != NULL)
- {
- while (*endptr != '\0' && c_isspace (*endptr))
- endptr++;
- if (*endptr == '\0')
- return value;
- /* Also accept the first value in a nesting level,
- since we can't determine the nesting level from env vars. */
- else if (*endptr == ',')
- return value;
- }
- }
-
- return ret;
-}
-
-unsigned long int
-num_processors (enum nproc_query query)
-{
- unsigned long int omp_env_limit = ULONG_MAX;
-
- if (query == NPROC_CURRENT_OVERRIDABLE)
- {
- unsigned long int omp_env_threads;
- /* Honor the OpenMP environment variables, recognized also by all
- programs that are based on OpenMP. */
- omp_env_threads = parse_omp_threads (getenv ("OMP_NUM_THREADS"));
- omp_env_limit = parse_omp_threads (getenv ("OMP_THREAD_LIMIT"));
- if (! omp_env_limit)
- omp_env_limit = ULONG_MAX;
-
- if (omp_env_threads)
- return MIN (omp_env_threads, omp_env_limit);
-
- query = NPROC_CURRENT;
- }
- /* Here query is one of NPROC_ALL, NPROC_CURRENT. */
- {
- unsigned long nprocs = num_processors_ignoring_omp (query);
- return MIN (nprocs, omp_env_limit);
- }
-}
diff --git a/cross/lib/nproc.h b/cross/lib/nproc.h
deleted file mode 100644
index 7b8b16d37cd..00000000000
--- a/cross/lib/nproc.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Detect the number of processors.
-
- Copyright (C) 2009-2023 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 Glen Lenker and Bruno Haible. */
-
-/* Allow the use in C++ code. */
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* A "processor" in this context means a thread execution unit, that is either
- - an execution core in a (possibly multi-core) chip, in a (possibly multi-
- chip) module, in a single computer, or
- - a thread execution unit inside a core
- (hyper-threading, see <https://en.wikipedia.org/wiki/Hyper-threading>).
- Which of the two definitions is used, is unspecified. */
-
-enum nproc_query
-{
- NPROC_ALL, /* total number of processors */
- NPROC_CURRENT, /* processors available to the current process */
- NPROC_CURRENT_OVERRIDABLE /* likewise, but overridable through the
- OMP_NUM_THREADS environment variable */
-};
-
-/* Return the total number of processors. The result is guaranteed to
- be at least 1. */
-extern unsigned long int num_processors (enum nproc_query query);
-
-#ifdef __cplusplus
-}
-#endif /* C++ */
diff --git a/cross/lib/nstrftime.c b/cross/lib/nstrftime.c
deleted file mode 100644
index 68bb560910d..00000000000
--- a/cross/lib/nstrftime.c
+++ /dev/null
@@ -1,1490 +0,0 @@
-/* Copyright (C) 1991-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#ifdef _LIBC
-# define USE_IN_EXTENDED_LOCALE_MODEL 1
-# define HAVE_STRUCT_ERA_ENTRY 1
-# define HAVE_TM_GMTOFF 1
-# define HAVE_STRUCT_TM_TM_ZONE 1
-# define HAVE_TZNAME 1
-# include "../locale/localeinfo.h"
-#else
-# include <libc-config.h>
-# if FPRINTFTIME
-# include "fprintftime.h"
-# else
-# include "strftime.h"
-# endif
-# include "time-internal.h"
-#endif
-
-#include <ctype.h>
-#include <errno.h>
-#include <time.h>
-
-#if HAVE_TZNAME && !HAVE_DECL_TZNAME
-extern char *tzname[];
-#endif
-
-/* Do multibyte processing if multibyte encodings are supported, unless
- multibyte sequences are safe in formats. Multibyte sequences are
- safe if they cannot contain byte sequences that look like format
- conversion specifications. The multibyte encodings used by the
- C library on the various platforms (UTF-8, GB2312, GBK, CP936,
- GB18030, EUC-TW, BIG5, BIG5-HKSCS, CP950, EUC-JP, EUC-KR, CP949,
- SHIFT_JIS, CP932, JOHAB) are safe for formats, because the byte '%'
- cannot occur in a multibyte character except in the first byte.
-
- The DEC-HANYU encoding used on OSF/1 is not safe for formats, but
- this encoding has never been seen in real-life use, so we ignore
- it. */
-#if !(defined __osf__ && 0)
-# define MULTIBYTE_IS_FORMAT_SAFE 1
-#endif
-#define DO_MULTIBYTE (! MULTIBYTE_IS_FORMAT_SAFE)
-
-#if DO_MULTIBYTE
-# include <wchar.h>
- static const mbstate_t mbstate_zero;
-#endif
-
-#include <limits.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "attribute.h"
-#include <intprops.h>
-
-#ifdef COMPILE_WIDE
-# include <endian.h>
-# define CHAR_T wchar_t
-# define UCHAR_T unsigned int
-# define L_(Str) L##Str
-# define NLW(Sym) _NL_W##Sym
-
-# define MEMCPY(d, s, n) __wmemcpy (d, s, n)
-# define STRLEN(s) __wcslen (s)
-
-#else
-# define CHAR_T char
-# define UCHAR_T unsigned char
-# define L_(Str) Str
-# define NLW(Sym) Sym
-# define ABALTMON_1 _NL_ABALTMON_1
-
-# define MEMCPY(d, s, n) memcpy (d, s, n)
-# define STRLEN(s) strlen (s)
-
-#endif
-
-/* Shift A right by B bits portably, by dividing A by 2**B and
- truncating towards minus infinity. A and B should be free of side
- effects, and B should be in the range 0 <= B <= INT_BITS - 2, where
- INT_BITS is the number of useful bits in an int. GNU code can
- assume that INT_BITS is at least 32.
-
- ISO C99 says that A >> B is implementation-defined if A < 0. Some
- implementations (e.g., UNICOS 9.0 on a Cray Y-MP EL) don't shift
- right in the usual way when A < 0, so SHR falls back on division if
- ordinary A >> B doesn't seem to be the usual signed shift. */
-#define SHR(a, b) \
- (-1 >> 1 == -1 \
- ? (a) >> (b) \
- : ((a) + ((a) < 0)) / (1 << (b)) - ((a) < 0))
-
-#define TM_YEAR_BASE 1900
-
-#ifndef __isleap
-/* Nonzero if YEAR is a leap year (every 4 years,
- except every 100th isn't, and every 400th is). */
-# define __isleap(year) \
- ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
-#endif
-
-
-#ifdef _LIBC
-# define mktime_z(tz, tm) mktime (tm)
-# define tzname __tzname
-# define tzset __tzset
-#endif
-
-#ifndef FPRINTFTIME
-# define FPRINTFTIME 0
-#endif
-
-#if FPRINTFTIME
-# define STREAM_OR_CHAR_T FILE
-# define STRFTIME_ARG(x) /* empty */
-#else
-# define STREAM_OR_CHAR_T CHAR_T
-# define STRFTIME_ARG(x) x,
-#endif
-
-#if FPRINTFTIME
-# define memset_byte(P, Len, Byte) \
- do { size_t _i; for (_i = 0; _i < Len; _i++) fputc (Byte, P); } while (0)
-# define memset_space(P, Len) memset_byte (P, Len, ' ')
-# define memset_zero(P, Len) memset_byte (P, Len, '0')
-#elif defined COMPILE_WIDE
-# define memset_space(P, Len) (wmemset (P, L' ', Len), (P) += (Len))
-# define memset_zero(P, Len) (wmemset (P, L'0', Len), (P) += (Len))
-#else
-# define memset_space(P, Len) (memset (P, ' ', Len), (P) += (Len))
-# define memset_zero(P, Len) (memset (P, '0', Len), (P) += (Len))
-#endif
-
-#if FPRINTFTIME
-# define advance(P, N)
-#else
-# define advance(P, N) ((P) += (N))
-#endif
-
-#define add(n, f) width_add (width, n, f)
-#define width_add(width, n, f) \
- do \
- { \
- size_t _n = (n); \
- size_t _w = pad == L_('-') || width < 0 ? 0 : width; \
- size_t _incr = _n < _w ? _w : _n; \
- if (_incr >= maxsize - i) \
- { \
- errno = ERANGE; \
- return 0; \
- } \
- if (p) \
- { \
- if (_n < _w) \
- { \
- size_t _delta = _w - _n; \
- if (pad == L_('0') || pad == L_('+')) \
- memset_zero (p, _delta); \
- else \
- memset_space (p, _delta); \
- } \
- f; \
- advance (p, _n); \
- } \
- i += _incr; \
- } while (0)
-
-#define add1(c) width_add1 (width, c)
-#if FPRINTFTIME
-# define width_add1(width, c) width_add (width, 1, fputc (c, p))
-#else
-# define width_add1(width, c) width_add (width, 1, *p = c)
-#endif
-
-#define cpy(n, s) width_cpy (width, n, s)
-#if FPRINTFTIME
-# define width_cpy(width, n, s) \
- width_add (width, n, \
- do \
- { \
- if (to_lowcase) \
- fwrite_lowcase (p, (s), _n); \
- else if (to_uppcase) \
- fwrite_uppcase (p, (s), _n); \
- else \
- { \
- /* Ignore the value of fwrite. The caller can determine whether \
- an error occurred by inspecting ferror (P). All known fwrite \
- implementations set the stream's error indicator when they \
- fail due to ENOMEM etc., even though C11 and POSIX.1-2008 do \
- not require this. */ \
- fwrite (s, _n, 1, p); \
- } \
- } \
- while (0) \
- )
-#else
-# define width_cpy(width, n, s) \
- width_add (width, n, \
- if (to_lowcase) \
- memcpy_lowcase (p, (s), _n LOCALE_ARG); \
- else if (to_uppcase) \
- memcpy_uppcase (p, (s), _n LOCALE_ARG); \
- else \
- MEMCPY ((void *) p, (void const *) (s), _n))
-#endif
-
-#ifdef COMPILE_WIDE
-# ifndef USE_IN_EXTENDED_LOCALE_MODEL
-# undef __mbsrtowcs_l
-# define __mbsrtowcs_l(d, s, l, st, loc) __mbsrtowcs (d, s, l, st)
-# endif
-# define widen(os, ws, l) \
- { \
- mbstate_t __st; \
- const char *__s = os; \
- memset (&__st, '\0', sizeof (__st)); \
- l = __mbsrtowcs_l (NULL, &__s, 0, &__st, loc); \
- ws = (wchar_t *) alloca ((l + 1) * sizeof (wchar_t)); \
- (void) __mbsrtowcs_l (ws, &__s, l, &__st, loc); \
- }
-#endif
-
-
-#if defined _LIBC && defined USE_IN_EXTENDED_LOCALE_MODEL
-/* We use this code also for the extended locale handling where the
- function gets as an additional argument the locale which has to be
- used. To access the values we have to redefine the _NL_CURRENT
- macro. */
-# define strftime __strftime_l
-# define wcsftime __wcsftime_l
-# undef _NL_CURRENT
-# define _NL_CURRENT(category, item) \
- (current->values[_NL_ITEM_INDEX (item)].string)
-# define LOCALE_PARAM , locale_t loc
-# define LOCALE_ARG , loc
-# define HELPER_LOCALE_ARG , current
-#else
-# define LOCALE_PARAM
-# define LOCALE_ARG
-# ifdef _LIBC
-# define HELPER_LOCALE_ARG , _NL_CURRENT_DATA (LC_TIME)
-# else
-# define HELPER_LOCALE_ARG
-# endif
-#endif
-
-#ifdef COMPILE_WIDE
-# ifdef USE_IN_EXTENDED_LOCALE_MODEL
-# define TOUPPER(Ch, L) __towupper_l (Ch, L)
-# define TOLOWER(Ch, L) __towlower_l (Ch, L)
-# else
-# define TOUPPER(Ch, L) towupper (Ch)
-# define TOLOWER(Ch, L) towlower (Ch)
-# endif
-#else
-# ifdef USE_IN_EXTENDED_LOCALE_MODEL
-# define TOUPPER(Ch, L) __toupper_l (Ch, L)
-# define TOLOWER(Ch, L) __tolower_l (Ch, L)
-# else
-# define TOUPPER(Ch, L) toupper (Ch)
-# define TOLOWER(Ch, L) tolower (Ch)
-# endif
-#endif
-/* We don't use 'isdigit' here since the locale dependent
- interpretation is not what we want here. We only need to accept
- the arabic digits in the ASCII range. One day there is perhaps a
- more reliable way to accept other sets of digits. */
-#define ISDIGIT(Ch) ((unsigned int) (Ch) - L_('0') <= 9)
-
-#if FPRINTFTIME
-static void
-fwrite_lowcase (FILE *fp, const CHAR_T *src, size_t len)
-{
- while (len-- > 0)
- {
- fputc (TOLOWER ((UCHAR_T) *src, loc), fp);
- ++src;
- }
-}
-
-static void
-fwrite_uppcase (FILE *fp, const CHAR_T *src, size_t len)
-{
- while (len-- > 0)
- {
- fputc (TOUPPER ((UCHAR_T) *src, loc), fp);
- ++src;
- }
-}
-#else
-static CHAR_T *memcpy_lowcase (CHAR_T *dest, const CHAR_T *src,
- size_t len LOCALE_PARAM);
-
-static CHAR_T *
-memcpy_lowcase (CHAR_T *dest, const CHAR_T *src, size_t len LOCALE_PARAM)
-{
- while (len-- > 0)
- dest[len] = TOLOWER ((UCHAR_T) src[len], loc);
- return dest;
-}
-
-static CHAR_T *memcpy_uppcase (CHAR_T *dest, const CHAR_T *src,
- size_t len LOCALE_PARAM);
-
-static CHAR_T *
-memcpy_uppcase (CHAR_T *dest, const CHAR_T *src, size_t len LOCALE_PARAM)
-{
- while (len-- > 0)
- dest[len] = TOUPPER ((UCHAR_T) src[len], loc);
- return dest;
-}
-#endif
-
-
-#if ! HAVE_TM_GMTOFF
-/* Yield the difference between *A and *B,
- measured in seconds, ignoring leap seconds. */
-# define tm_diff ftime_tm_diff
-static int tm_diff (const struct tm *, const struct tm *);
-static int
-tm_diff (const struct tm *a, const struct tm *b)
-{
- /* Compute intervening leap days correctly even if year is negative.
- Take care to avoid int overflow in leap day calculations,
- but it's OK to assume that A and B are close to each other. */
- int a4 = SHR (a->tm_year, 2) + SHR (TM_YEAR_BASE, 2) - ! (a->tm_year & 3);
- int b4 = SHR (b->tm_year, 2) + SHR (TM_YEAR_BASE, 2) - ! (b->tm_year & 3);
- int a100 = (a4 + (a4 < 0)) / 25 - (a4 < 0);
- int b100 = (b4 + (b4 < 0)) / 25 - (b4 < 0);
- int a400 = SHR (a100, 2);
- int b400 = SHR (b100, 2);
- int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400);
- int years = a->tm_year - b->tm_year;
- int days = (365 * years + intervening_leap_days
- + (a->tm_yday - b->tm_yday));
- return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour))
- + (a->tm_min - b->tm_min))
- + (a->tm_sec - b->tm_sec));
-}
-#endif /* ! HAVE_TM_GMTOFF */
-
-
-
-/* The number of days from the first day of the first ISO week of this
- year to the year day YDAY with week day WDAY. ISO weeks start on
- Monday; the first ISO week has the year's first Thursday. YDAY may
- be as small as YDAY_MINIMUM. */
-#define ISO_WEEK_START_WDAY 1 /* Monday */
-#define ISO_WEEK1_WDAY 4 /* Thursday */
-#define YDAY_MINIMUM (-366)
-static int iso_week_days (int, int);
-static __inline int
-iso_week_days (int yday, int wday)
-{
- /* Add enough to the first operand of % to make it nonnegative. */
- int big_enough_multiple_of_7 = (-YDAY_MINIMUM / 7 + 2) * 7;
- return (yday
- - (yday - wday + ISO_WEEK1_WDAY + big_enough_multiple_of_7) % 7
- + ISO_WEEK1_WDAY - ISO_WEEK_START_WDAY);
-}
-
-
-/* When compiling this file, GNU applications can #define my_strftime
- to a symbol (typically nstrftime) to get an extended strftime with
- extra arguments TZ and NS. */
-
-#if FPRINTFTIME
-# undef my_strftime
-# define my_strftime fprintftime
-#endif
-
-#ifdef my_strftime
-# define extra_args , tz, ns
-# define extra_args_spec , timezone_t tz, int ns
-#else
-# if defined COMPILE_WIDE
-# define my_strftime wcsftime
-# define nl_get_alt_digit _nl_get_walt_digit
-# else
-# define my_strftime strftime
-# define nl_get_alt_digit _nl_get_alt_digit
-# endif
-# define extra_args
-# define extra_args_spec
-/* We don't have this information in general. */
-# define tz 1
-# define ns 0
-#endif
-
-static size_t __strftime_internal (STREAM_OR_CHAR_T *, STRFTIME_ARG (size_t)
- const CHAR_T *, const struct tm *,
- bool, int, int, bool *
- extra_args_spec LOCALE_PARAM);
-
-/* Write information from TP into S according to the format
- string FORMAT, writing no more that MAXSIZE characters
- (including the terminating '\0') and returning number of
- characters written. If S is NULL, nothing will be written
- anywhere, so to determine how many characters would be
- written, use NULL for S and (size_t) -1 for MAXSIZE. */
-size_t
-my_strftime (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize)
- const CHAR_T *format,
- const struct tm *tp extra_args_spec LOCALE_PARAM)
-{
- bool tzset_called = false;
- return __strftime_internal (s, STRFTIME_ARG (maxsize) format, tp, false,
- 0, -1, &tzset_called extra_args LOCALE_ARG);
-}
-libc_hidden_def (my_strftime)
-
-/* Just like my_strftime, above, but with more parameters.
- UPCASE indicates that the result should be converted to upper case.
- YR_SPEC and WIDTH specify the padding and width for the year.
- *TZSET_CALLED indicates whether tzset has been called here. */
-static size_t
-__strftime_internal (STREAM_OR_CHAR_T *s, STRFTIME_ARG (size_t maxsize)
- const CHAR_T *format,
- const struct tm *tp, bool upcase,
- int yr_spec, int width, bool *tzset_called
- extra_args_spec LOCALE_PARAM)
-{
-#if defined _LIBC && defined USE_IN_EXTENDED_LOCALE_MODEL
- struct __locale_data *const current = loc->__locales[LC_TIME];
-#endif
-#if FPRINTFTIME
- size_t maxsize = (size_t) -1;
-#endif
-
- int saved_errno = errno;
- int hour12 = tp->tm_hour;
-#ifdef _NL_CURRENT
- /* We cannot make the following values variables since we must delay
- the evaluation of these values until really needed since some
- expressions might not be valid in every situation. The 'struct tm'
- might be generated by a strptime() call that initialized
- only a few elements. Dereference the pointers only if the format
- requires this. Then it is ok to fail if the pointers are invalid. */
-# define a_wkday \
- ((const CHAR_T *) (tp->tm_wday < 0 || tp->tm_wday > 6 \
- ? "?" : _NL_CURRENT (LC_TIME, NLW(ABDAY_1) + tp->tm_wday)))
-# define f_wkday \
- ((const CHAR_T *) (tp->tm_wday < 0 || tp->tm_wday > 6 \
- ? "?" : _NL_CURRENT (LC_TIME, NLW(DAY_1) + tp->tm_wday)))
-# define a_month \
- ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11 \
- ? "?" : _NL_CURRENT (LC_TIME, NLW(ABMON_1) + tp->tm_mon)))
-# define f_month \
- ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11 \
- ? "?" : _NL_CURRENT (LC_TIME, NLW(MON_1) + tp->tm_mon)))
-# define a_altmonth \
- ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11 \
- ? "?" : _NL_CURRENT (LC_TIME, NLW(ABALTMON_1) + tp->tm_mon)))
-# define f_altmonth \
- ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11 \
- ? "?" : _NL_CURRENT (LC_TIME, NLW(ALTMON_1) + tp->tm_mon)))
-# define ampm \
- ((const CHAR_T *) _NL_CURRENT (LC_TIME, tp->tm_hour > 11 \
- ? NLW(PM_STR) : NLW(AM_STR)))
-
-# define aw_len STRLEN (a_wkday)
-# define am_len STRLEN (a_month)
-# define aam_len STRLEN (a_altmonth)
-# define ap_len STRLEN (ampm)
-#endif
-#if HAVE_TZNAME
- char **tzname_vec = tzname;
-#endif
- const char *zone;
- size_t i = 0;
- STREAM_OR_CHAR_T *p = s;
- const CHAR_T *f;
-#if DO_MULTIBYTE && !defined COMPILE_WIDE
- const char *format_end = NULL;
-#endif
-
- zone = NULL;
-#if HAVE_STRUCT_TM_TM_ZONE
- /* The POSIX test suite assumes that setting
- the environment variable TZ to a new value before calling strftime()
- will influence the result (the %Z format) even if the information in
- TP is computed with a totally different time zone.
- This is bogus: though POSIX allows bad behavior like this,
- POSIX does not require it. Do the right thing instead. */
- zone = (const char *) tp->tm_zone;
-#endif
-#if HAVE_TZNAME
- if (!tz)
- {
- if (! (zone && *zone))
- zone = "GMT";
- }
- else
- {
-# if !HAVE_STRUCT_TM_TM_ZONE
- /* Infer the zone name from *TZ instead of from TZNAME. */
- tzname_vec = tz->tzname_copy;
-# endif
- }
- /* The tzset() call might have changed the value. */
- if (!(zone && *zone) && tp->tm_isdst >= 0)
- {
- /* POSIX.1 requires that local time zone information be used as
- though strftime called tzset. */
-# ifndef my_strftime
- if (!*tzset_called)
- {
- tzset ();
- *tzset_called = true;
- }
-# endif
- zone = tzname_vec[tp->tm_isdst != 0];
- }
-#endif
- if (! zone)
- zone = "";
-
- if (hour12 > 12)
- hour12 -= 12;
- else
- if (hour12 == 0)
- hour12 = 12;
-
- for (f = format; *f != '\0'; width = -1, f++)
- {
- int pad = 0; /* Padding for number ('_', '-', '+', '0', or 0). */
- int modifier; /* Field modifier ('E', 'O', or 0). */
- int digits = 0; /* Max digits for numeric format. */
- int number_value; /* Numeric value to be printed. */
- unsigned int u_number_value; /* (unsigned int) number_value. */
- bool negative_number; /* The number is negative. */
- bool always_output_a_sign; /* +/- should always be output. */
- int tz_colon_mask; /* Bitmask of where ':' should appear. */
- const CHAR_T *subfmt;
- CHAR_T *bufp;
- CHAR_T buf[1
- + 2 /* for the two colons in a %::z or %:::z time zone */
- + (sizeof (int) < sizeof (time_t)
- ? INT_STRLEN_BOUND (time_t)
- : INT_STRLEN_BOUND (int))];
- bool to_lowcase = false;
- bool to_uppcase = upcase;
- size_t colons;
- bool change_case = false;
- int format_char;
- int subwidth;
-
-#if DO_MULTIBYTE && !defined COMPILE_WIDE
- switch (*f)
- {
- case L_('%'):
- break;
-
- case L_('\b'): case L_('\t'): case L_('\n'):
- case L_('\v'): case L_('\f'): case L_('\r'):
- case L_(' '): case L_('!'): case L_('"'): case L_('#'): case L_('&'):
- case L_('\''): case L_('('): case L_(')'): case L_('*'): case L_('+'):
- case L_(','): case L_('-'): case L_('.'): case L_('/'): case L_('0'):
- case L_('1'): case L_('2'): case L_('3'): case L_('4'): case L_('5'):
- case L_('6'): case L_('7'): case L_('8'): case L_('9'): case L_(':'):
- case L_(';'): case L_('<'): case L_('='): case L_('>'): case L_('?'):
- case L_('A'): case L_('B'): case L_('C'): case L_('D'): case L_('E'):
- case L_('F'): case L_('G'): case L_('H'): case L_('I'): case L_('J'):
- case L_('K'): case L_('L'): case L_('M'): case L_('N'): case L_('O'):
- case L_('P'): case L_('Q'): case L_('R'): case L_('S'): case L_('T'):
- case L_('U'): case L_('V'): case L_('W'): case L_('X'): case L_('Y'):
- case L_('Z'): case L_('['): case L_('\\'): case L_(']'): case L_('^'):
- case L_('_'): case L_('a'): case L_('b'): case L_('c'): case L_('d'):
- case L_('e'): case L_('f'): case L_('g'): case L_('h'): case L_('i'):
- case L_('j'): case L_('k'): case L_('l'): case L_('m'): case L_('n'):
- case L_('o'): case L_('p'): case L_('q'): case L_('r'): case L_('s'):
- case L_('t'): case L_('u'): case L_('v'): case L_('w'): case L_('x'):
- case L_('y'): case L_('z'): case L_('{'): case L_('|'): case L_('}'):
- case L_('~'):
- /* The C Standard requires these 98 characters (plus '%') to
- be in the basic execution character set. None of these
- characters can start a multibyte sequence, so they need
- not be analyzed further. */
- add1 (*f);
- continue;
-
- default:
- /* Copy this multibyte sequence until we reach its end, find
- an error, or come back to the initial shift state. */
- {
- mbstate_t mbstate = mbstate_zero;
- size_t len = 0;
- size_t fsize;
-
- if (! format_end)
- format_end = f + strlen (f) + 1;
- fsize = format_end - f;
-
- do
- {
- size_t bytes = mbrlen (f + len, fsize - len, &mbstate);
-
- if (bytes == 0)
- break;
-
- if (bytes == (size_t) -2)
- {
- len += strlen (f + len);
- break;
- }
-
- if (bytes == (size_t) -1)
- {
- len++;
- break;
- }
-
- len += bytes;
- }
- while (! mbsinit (&mbstate));
-
- cpy (len, f);
- f += len - 1;
- continue;
- }
- }
-
-#else /* ! DO_MULTIBYTE */
-
- /* Either multibyte encodings are not supported, they are
- safe for formats, so any non-'%' byte can be copied through,
- or this is the wide character version. */
- if (*f != L_('%'))
- {
- add1 (*f);
- continue;
- }
-
-#endif /* ! DO_MULTIBYTE */
-
- char const *percent = f;
-
- /* Check for flags that can modify a format. */
- while (1)
- {
- switch (*++f)
- {
- /* This influences the number formats. */
- case L_('_'):
- case L_('-'):
- case L_('+'):
- case L_('0'):
- pad = *f;
- continue;
-
- /* This changes textual output. */
- case L_('^'):
- to_uppcase = true;
- continue;
- case L_('#'):
- change_case = true;
- continue;
-
- default:
- break;
- }
- break;
- }
-
- if (ISDIGIT (*f))
- {
- width = 0;
- do
- {
- if (INT_MULTIPLY_WRAPV (width, 10, &width)
- || INT_ADD_WRAPV (width, *f - L_('0'), &width))
- width = INT_MAX;
- ++f;
- }
- while (ISDIGIT (*f));
- }
-
- /* Check for modifiers. */
- switch (*f)
- {
- case L_('E'):
- case L_('O'):
- modifier = *f++;
- break;
-
- default:
- modifier = 0;
- break;
- }
-
- /* Now do the specified format. */
- format_char = *f;
- switch (format_char)
- {
-#define DO_NUMBER(d, v) \
- do \
- { \
- digits = d; \
- number_value = v; \
- goto do_number; \
- } \
- while (0)
-#define DO_SIGNED_NUMBER(d, negative, v) \
- DO_MAYBE_SIGNED_NUMBER (d, negative, v, do_signed_number)
-#define DO_YEARISH(d, negative, v) \
- DO_MAYBE_SIGNED_NUMBER (d, negative, v, do_yearish)
-#define DO_MAYBE_SIGNED_NUMBER(d, negative, v, label) \
- do \
- { \
- digits = d; \
- negative_number = negative; \
- u_number_value = v; \
- goto label; \
- } \
- while (0)
-
- /* The mask is not what you might think.
- When the ordinal i'th bit is set, insert a colon
- before the i'th digit of the time zone representation. */
-#define DO_TZ_OFFSET(d, mask, v) \
- do \
- { \
- digits = d; \
- tz_colon_mask = mask; \
- u_number_value = v; \
- goto do_tz_offset; \
- } \
- while (0)
-#define DO_NUMBER_SPACEPAD(d, v) \
- do \
- { \
- digits = d; \
- number_value = v; \
- goto do_number_spacepad; \
- } \
- while (0)
-
- case L_('%'):
- if (f - 1 != percent)
- goto bad_percent;
- add1 (*f);
- break;
-
- case L_('a'):
- if (modifier != 0)
- goto bad_format;
- if (change_case)
- {
- to_uppcase = true;
- to_lowcase = false;
- }
-#ifdef _NL_CURRENT
- cpy (aw_len, a_wkday);
- break;
-#else
- goto underlying_strftime;
-#endif
-
- case 'A':
- if (modifier != 0)
- goto bad_format;
- if (change_case)
- {
- to_uppcase = true;
- to_lowcase = false;
- }
-#ifdef _NL_CURRENT
- cpy (STRLEN (f_wkday), f_wkday);
- break;
-#else
- goto underlying_strftime;
-#endif
-
- case L_('b'):
- case L_('h'):
- if (change_case)
- {
- to_uppcase = true;
- to_lowcase = false;
- }
- if (modifier == L_('E'))
- goto bad_format;
-#ifdef _NL_CURRENT
- if (modifier == L_('O'))
- cpy (aam_len, a_altmonth);
- else
- cpy (am_len, a_month);
- break;
-#else
- goto underlying_strftime;
-#endif
-
- case L_('B'):
- if (modifier == L_('E'))
- goto bad_format;
- if (change_case)
- {
- to_uppcase = true;
- to_lowcase = false;
- }
-#ifdef _NL_CURRENT
- if (modifier == L_('O'))
- cpy (STRLEN (f_altmonth), f_altmonth);
- else
- cpy (STRLEN (f_month), f_month);
- break;
-#else
- goto underlying_strftime;
-#endif
-
- case L_('c'):
- if (modifier == L_('O'))
- goto bad_format;
-#ifdef _NL_CURRENT
- if (! (modifier == L_('E')
- && (*(subfmt =
- (const CHAR_T *) _NL_CURRENT (LC_TIME,
- NLW(ERA_D_T_FMT)))
- != '\0')))
- subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(D_T_FMT));
-#else
- goto underlying_strftime;
-#endif
-
- subformat:
- subwidth = -1;
- subformat_width:
- {
- size_t len = __strftime_internal (NULL, STRFTIME_ARG ((size_t) -1)
- subfmt, tp, to_uppcase,
- pad, subwidth, tzset_called
- extra_args LOCALE_ARG);
- add (len, __strftime_internal (p,
- STRFTIME_ARG (maxsize - i)
- subfmt, tp, to_uppcase,
- pad, subwidth, tzset_called
- extra_args LOCALE_ARG));
- }
- break;
-
-#if !(defined _NL_CURRENT && HAVE_STRUCT_ERA_ENTRY)
- underlying_strftime:
- {
- /* The relevant information is available only via the
- underlying strftime implementation, so use that. */
- char ufmt[5];
- char *u = ufmt;
- char ubuf[1024]; /* enough for any single format in practice */
- size_t len;
- /* Make sure we're calling the actual underlying strftime.
- In some cases, config.h contains something like
- "#define strftime rpl_strftime". */
-# ifdef strftime
-# undef strftime
- size_t strftime ();
-# endif
-
- /* The space helps distinguish strftime failure from empty
- output. */
- *u++ = ' ';
- *u++ = '%';
- if (modifier != 0)
- *u++ = modifier;
- *u++ = format_char;
- *u = '\0';
- len = strftime (ubuf, sizeof ubuf, ufmt, tp);
- if (len != 0)
- cpy (len - 1, ubuf + 1);
- }
- break;
-#endif
-
- case L_('C'):
- if (modifier == L_('E'))
- {
-#if HAVE_STRUCT_ERA_ENTRY
- struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG);
- if (era)
- {
-# ifdef COMPILE_WIDE
- size_t len = __wcslen (era->era_wname);
- cpy (len, era->era_wname);
-# else
- size_t len = strlen (era->era_name);
- cpy (len, era->era_name);
-# endif
- break;
- }
-#else
- goto underlying_strftime;
-#endif
- }
-
- {
- bool negative_year = tp->tm_year < - TM_YEAR_BASE;
- bool zero_thru_1899 = !negative_year & (tp->tm_year < 0);
- int century = ((tp->tm_year - 99 * zero_thru_1899) / 100
- + TM_YEAR_BASE / 100);
- DO_YEARISH (2, negative_year, century);
- }
-
- case L_('x'):
- if (modifier == L_('O'))
- goto bad_format;
-#ifdef _NL_CURRENT
- if (! (modifier == L_('E')
- && (*(subfmt =
- (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ERA_D_FMT)))
- != L_('\0'))))
- subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(D_FMT));
- goto subformat;
-#else
- goto underlying_strftime;
-#endif
- case L_('D'):
- if (modifier != 0)
- goto bad_format;
- subfmt = L_("%m/%d/%y");
- goto subformat;
-
- case L_('d'):
- if (modifier == L_('E'))
- goto bad_format;
-
- DO_NUMBER (2, tp->tm_mday);
-
- case L_('e'):
- if (modifier == L_('E'))
- goto bad_format;
-
- DO_NUMBER_SPACEPAD (2, tp->tm_mday);
-
- /* All numeric formats set DIGITS and NUMBER_VALUE (or U_NUMBER_VALUE)
- and then jump to one of these labels. */
-
- do_tz_offset:
- always_output_a_sign = true;
- goto do_number_body;
-
- do_yearish:
- if (pad == 0)
- pad = yr_spec;
- always_output_a_sign
- = (pad == L_('+')
- && ((digits == 2 ? 99 : 9999) < u_number_value
- || digits < width));
- goto do_maybe_signed_number;
-
- do_number_spacepad:
- if (pad == 0)
- pad = L_('_');
-
- do_number:
- /* Format NUMBER_VALUE according to the MODIFIER flag. */
- negative_number = number_value < 0;
- u_number_value = number_value;
-
- do_signed_number:
- always_output_a_sign = false;
-
- do_maybe_signed_number:
- tz_colon_mask = 0;
-
- do_number_body:
- /* Format U_NUMBER_VALUE according to the MODIFIER flag.
- NEGATIVE_NUMBER is nonzero if the original number was
- negative; in this case it was converted directly to
- unsigned int (i.e., modulo (UINT_MAX + 1)) without
- negating it. */
- if (modifier == L_('O') && !negative_number)
- {
-#ifdef _NL_CURRENT
- /* Get the locale specific alternate representation of
- the number. If none exist NULL is returned. */
- const CHAR_T *cp = nl_get_alt_digit (u_number_value
- HELPER_LOCALE_ARG);
-
- if (cp != NULL)
- {
- size_t digitlen = STRLEN (cp);
- if (digitlen != 0)
- {
- cpy (digitlen, cp);
- break;
- }
- }
-#else
- goto underlying_strftime;
-#endif
- }
-
- bufp = buf + sizeof (buf) / sizeof (buf[0]);
-
- if (negative_number)
- u_number_value = - u_number_value;
-
- do
- {
- if (tz_colon_mask & 1)
- *--bufp = ':';
- tz_colon_mask >>= 1;
- *--bufp = u_number_value % 10 + L_('0');
- u_number_value /= 10;
- }
- while (u_number_value != 0 || tz_colon_mask != 0);
-
- do_number_sign_and_padding:
- if (pad == 0)
- pad = L_('0');
- if (width < 0)
- width = digits;
-
- {
- CHAR_T sign_char = (negative_number ? L_('-')
- : always_output_a_sign ? L_('+')
- : 0);
- int numlen = buf + sizeof buf / sizeof buf[0] - bufp;
- int shortage = width - !!sign_char - numlen;
- int padding = pad == L_('-') || shortage <= 0 ? 0 : shortage;
-
- if (sign_char)
- {
- if (pad == L_('_'))
- {
- if (p)
- memset_space (p, padding);
- i += padding;
- width -= padding;
- }
- width_add1 (0, sign_char);
- width--;
- }
-
- cpy (numlen, bufp);
- }
- break;
-
- case L_('F'):
- if (modifier != 0)
- goto bad_format;
- if (pad == 0 && width < 0)
- {
- pad = L_('+');
- subwidth = 4;
- }
- else
- {
- subwidth = width - 6;
- if (subwidth < 0)
- subwidth = 0;
- }
- subfmt = L_("%Y-%m-%d");
- goto subformat_width;
-
- case L_('H'):
- if (modifier == L_('E'))
- goto bad_format;
-
- DO_NUMBER (2, tp->tm_hour);
-
- case L_('I'):
- if (modifier == L_('E'))
- goto bad_format;
-
- DO_NUMBER (2, hour12);
-
- case L_('k'): /* GNU extension. */
- if (modifier == L_('E'))
- goto bad_format;
-
- DO_NUMBER_SPACEPAD (2, tp->tm_hour);
-
- case L_('l'): /* GNU extension. */
- if (modifier == L_('E'))
- goto bad_format;
-
- DO_NUMBER_SPACEPAD (2, hour12);
-
- case L_('j'):
- if (modifier == L_('E'))
- goto bad_format;
-
- DO_SIGNED_NUMBER (3, tp->tm_yday < -1, tp->tm_yday + 1U);
-
- case L_('M'):
- if (modifier == L_('E'))
- goto bad_format;
-
- DO_NUMBER (2, tp->tm_min);
-
- case L_('m'):
- if (modifier == L_('E'))
- goto bad_format;
-
- DO_SIGNED_NUMBER (2, tp->tm_mon < -1, tp->tm_mon + 1U);
-
-#ifndef _LIBC
- case L_('N'): /* GNU extension. */
- if (modifier == L_('E'))
- goto bad_format;
- {
- int n = ns, ns_digits = 9;
- if (width <= 0)
- width = ns_digits;
- int ndigs = ns_digits;
- while (width < ndigs || (1 < ndigs && n % 10 == 0))
- ndigs--, n /= 10;
- for (int j = ndigs; 0 < j; j--)
- buf[j - 1] = n % 10 + L_('0'), n /= 10;
- if (!pad)
- pad = L_('0');
- width_cpy (0, ndigs, buf);
- width_add (width - ndigs, 0, (void) 0);
- }
- break;
-#endif
-
- case L_('n'):
- add1 (L_('\n'));
- break;
-
- case L_('P'):
- to_lowcase = true;
-#ifndef _NL_CURRENT
- format_char = L_('p');
-#endif
- FALLTHROUGH;
- case L_('p'):
- if (change_case)
- {
- to_uppcase = false;
- to_lowcase = true;
- }
-#ifdef _NL_CURRENT
- cpy (ap_len, ampm);
- break;
-#else
- goto underlying_strftime;
-#endif
-
- case L_('q'): /* GNU extension. */
- DO_SIGNED_NUMBER (1, false, ((tp->tm_mon * 11) >> 5) + 1);
-
- case L_('R'):
- subfmt = L_("%H:%M");
- goto subformat;
-
- case L_('r'):
-#ifdef _NL_CURRENT
- if (*(subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME,
- NLW(T_FMT_AMPM)))
- == L_('\0'))
- subfmt = L_("%I:%M:%S %p");
- goto subformat;
-#else
- goto underlying_strftime;
-#endif
-
- case L_('S'):
- if (modifier == L_('E'))
- goto bad_format;
-
- DO_NUMBER (2, tp->tm_sec);
-
- case L_('s'): /* GNU extension. */
- {
- struct tm ltm;
- time_t t;
-
- ltm = *tp;
- ltm.tm_yday = -1;
- t = mktime_z (tz, &ltm);
- if (ltm.tm_yday < 0)
- {
- errno = EOVERFLOW;
- return 0;
- }
-
- /* Generate string value for T using time_t arithmetic;
- this works even if sizeof (long) < sizeof (time_t). */
-
- bufp = buf + sizeof (buf) / sizeof (buf[0]);
- negative_number = t < 0;
-
- do
- {
- int d = t % 10;
- t /= 10;
- *--bufp = (negative_number ? -d : d) + L_('0');
- }
- while (t != 0);
-
- digits = 1;
- always_output_a_sign = false;
- goto do_number_sign_and_padding;
- }
-
- case L_('X'):
- if (modifier == L_('O'))
- goto bad_format;
-#ifdef _NL_CURRENT
- if (! (modifier == L_('E')
- && (*(subfmt =
- (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ERA_T_FMT)))
- != L_('\0'))))
- subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(T_FMT));
- goto subformat;
-#else
- goto underlying_strftime;
-#endif
- case L_('T'):
- subfmt = L_("%H:%M:%S");
- goto subformat;
-
- case L_('t'):
- add1 (L_('\t'));
- break;
-
- case L_('u'):
- DO_NUMBER (1, (tp->tm_wday - 1 + 7) % 7 + 1);
-
- case L_('U'):
- if (modifier == L_('E'))
- goto bad_format;
-
- DO_NUMBER (2, (tp->tm_yday - tp->tm_wday + 7) / 7);
-
- case L_('V'):
- case L_('g'):
- case L_('G'):
- if (modifier == L_('E'))
- goto bad_format;
- {
- /* YEAR is a leap year if and only if (tp->tm_year + TM_YEAR_BASE)
- is a leap year, except that YEAR and YEAR - 1 both work
- correctly even when (tp->tm_year + TM_YEAR_BASE) would
- overflow. */
- int year = (tp->tm_year
- + (tp->tm_year < 0
- ? TM_YEAR_BASE % 400
- : TM_YEAR_BASE % 400 - 400));
- int year_adjust = 0;
- int days = iso_week_days (tp->tm_yday, tp->tm_wday);
-
- if (days < 0)
- {
- /* This ISO week belongs to the previous year. */
- year_adjust = -1;
- days = iso_week_days (tp->tm_yday + (365 + __isleap (year - 1)),
- tp->tm_wday);
- }
- else
- {
- int d = iso_week_days (tp->tm_yday - (365 + __isleap (year)),
- tp->tm_wday);
- if (0 <= d)
- {
- /* This ISO week belongs to the next year. */
- year_adjust = 1;
- days = d;
- }
- }
-
- switch (*f)
- {
- case L_('g'):
- {
- int yy = (tp->tm_year % 100 + year_adjust) % 100;
- DO_YEARISH (2, false,
- (0 <= yy
- ? yy
- : tp->tm_year < -TM_YEAR_BASE - year_adjust
- ? -yy
- : yy + 100));
- }
-
- case L_('G'):
- DO_YEARISH (4, tp->tm_year < -TM_YEAR_BASE - year_adjust,
- (tp->tm_year + (unsigned int) TM_YEAR_BASE
- + year_adjust));
-
- default:
- DO_NUMBER (2, days / 7 + 1);
- }
- }
-
- case L_('W'):
- if (modifier == L_('E'))
- goto bad_format;
-
- DO_NUMBER (2, (tp->tm_yday - (tp->tm_wday - 1 + 7) % 7 + 7) / 7);
-
- case L_('w'):
- if (modifier == L_('E'))
- goto bad_format;
-
- DO_NUMBER (1, tp->tm_wday);
-
- case L_('Y'):
- if (modifier == L_('E'))
- {
-#if HAVE_STRUCT_ERA_ENTRY
- struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG);
- if (era)
- {
-# ifdef COMPILE_WIDE
- subfmt = era->era_wformat;
-# else
- subfmt = era->era_format;
-# endif
- if (pad == 0)
- pad = yr_spec;
- goto subformat;
- }
-#else
- goto underlying_strftime;
-#endif
- }
- if (modifier == L_('O'))
- goto bad_format;
-
- DO_YEARISH (4, tp->tm_year < -TM_YEAR_BASE,
- tp->tm_year + (unsigned int) TM_YEAR_BASE);
-
- case L_('y'):
- if (modifier == L_('E'))
- {
-#if HAVE_STRUCT_ERA_ENTRY
- struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG);
- if (era)
- {
- int delta = tp->tm_year - era->start_date[0];
- if (pad == 0)
- pad = yr_spec;
- DO_NUMBER (2, (era->offset
- + delta * era->absolute_direction));
- }
-#else
- goto underlying_strftime;
-#endif
- }
-
- {
- int yy = tp->tm_year % 100;
- if (yy < 0)
- yy = tp->tm_year < - TM_YEAR_BASE ? -yy : yy + 100;
- DO_YEARISH (2, false, yy);
- }
-
- case L_('Z'):
- if (change_case)
- {
- to_uppcase = false;
- to_lowcase = true;
- }
-
-#ifdef COMPILE_WIDE
- {
- /* The zone string is always given in multibyte form. We have
- to transform it first. */
- wchar_t *wczone;
- size_t len;
- widen (zone, wczone, len);
- cpy (len, wczone);
- }
-#else
- cpy (strlen (zone), zone);
-#endif
- break;
-
- case L_(':'):
- /* :, ::, and ::: are valid only just before 'z'.
- :::: etc. are rejected later. */
- for (colons = 1; f[colons] == L_(':'); colons++)
- continue;
- if (f[colons] != L_('z'))
- goto bad_format;
- f += colons;
- goto do_z_conversion;
-
- case L_('z'):
- colons = 0;
-
- do_z_conversion:
- if (tp->tm_isdst < 0)
- break;
-
- {
- int diff;
- int hour_diff;
- int min_diff;
- int sec_diff;
-#if HAVE_TM_GMTOFF
- diff = tp->tm_gmtoff;
-#else
- if (!tz)
- diff = 0;
- else
- {
- struct tm gtm;
- struct tm ltm;
- time_t lt;
-
- /* POSIX.1 requires that local time zone information be used as
- though strftime called tzset. */
-# ifndef my_strftime
- if (!*tzset_called)
- {
- tzset ();
- *tzset_called = true;
- }
-# endif
-
- ltm = *tp;
- ltm.tm_wday = -1;
- lt = mktime_z (tz, &ltm);
- if (ltm.tm_wday < 0 || ! localtime_rz (0, &lt, &gtm))
- break;
- diff = tm_diff (&ltm, &gtm);
- }
-#endif
-
- negative_number = diff < 0 || (diff == 0 && *zone == '-');
- hour_diff = diff / 60 / 60;
- min_diff = diff / 60 % 60;
- sec_diff = diff % 60;
-
- switch (colons)
- {
- case 0: /* +hhmm */
- DO_TZ_OFFSET (5, 0, hour_diff * 100 + min_diff);
-
- case 1: tz_hh_mm: /* +hh:mm */
- DO_TZ_OFFSET (6, 04, hour_diff * 100 + min_diff);
-
- case 2: tz_hh_mm_ss: /* +hh:mm:ss */
- DO_TZ_OFFSET (9, 024,
- hour_diff * 10000 + min_diff * 100 + sec_diff);
-
- case 3: /* +hh if possible, else +hh:mm, else +hh:mm:ss */
- if (sec_diff != 0)
- goto tz_hh_mm_ss;
- if (min_diff != 0)
- goto tz_hh_mm;
- DO_TZ_OFFSET (3, 0, hour_diff);
-
- default:
- goto bad_format;
- }
- }
-
- case L_('\0'): /* GNU extension: % at end of format. */
- bad_percent:
- --f;
- FALLTHROUGH;
- default:
- /* Unknown format; output the format, including the '%',
- since this is most likely the right thing to do if a
- multibyte string has been misparsed. */
- bad_format:
- cpy (f - percent + 1, percent);
- break;
- }
- }
-
-#if ! FPRINTFTIME
- if (p && maxsize != 0)
- *p = L_('\0');
-#endif
-
- errno = saved_errno;
- return i;
-}
diff --git a/cross/lib/open.c b/cross/lib/open.c
deleted file mode 100644
index 7ec8fdc35dc..00000000000
--- a/cross/lib/open.c
+++ /dev/null
@@ -1,209 +0,0 @@
-/* Open a descriptor to a file.
- Copyright (C) 2007-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
-
-/* If the user's config.h happens to include <fcntl.h>, let it include only
- the system's <fcntl.h> here, so that orig_open doesn't recurse to
- rpl_open. */
-#define __need_system_fcntl_h
-#include <config.h>
-
-/* Get the original definition of open. It might be defined as a macro. */
-#include <fcntl.h>
-#include <sys/types.h>
-#undef __need_system_fcntl_h
-
-static int
-orig_open (const char *filename, int flags, mode_t mode)
-{
-#if defined _WIN32 && !defined __CYGWIN__
- return _open (filename, flags, mode);
-#else
- return open (filename, flags, mode);
-#endif
-}
-
-/* Specification. */
-/* Write "fcntl.h" here, not <fcntl.h>, otherwise OSF/1 5.1 DTK cc eliminates
- this include because of the preliminary #include <fcntl.h> above. */
-#include "fcntl.h"
-
-#include "cloexec.h"
-
-#include <errno.h>
-#include <stdarg.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
-#ifndef REPLACE_OPEN_DIRECTORY
-# define REPLACE_OPEN_DIRECTORY 0
-#endif
-
-int
-open (const char *filename, int flags, ...)
-{
- /* 0 = unknown, 1 = yes, -1 = no. */
-#if GNULIB_defined_O_CLOEXEC
- int have_cloexec = -1;
-#else
- static int have_cloexec;
-#endif
-
- mode_t mode;
- int fd;
-
- mode = 0;
- if (flags & O_CREAT)
- {
- va_list arg;
- va_start (arg, flags);
-
- /* We have to use PROMOTED_MODE_T instead of mode_t, otherwise GCC 4
- creates crashing code when 'mode_t' is smaller than 'int'. */
- mode = va_arg (arg, PROMOTED_MODE_T);
-
- va_end (arg);
- }
-
-#if GNULIB_defined_O_NONBLOCK
- /* The only known platform that lacks O_NONBLOCK is mingw, but it
- also lacks named pipes and Unix sockets, which are the only two
- file types that require non-blocking handling in open().
- Therefore, it is safe to ignore O_NONBLOCK here. It is handy
- that mingw also lacks openat(), so that is also covered here. */
- flags &= ~O_NONBLOCK;
-#endif
-
-#if defined _WIN32 && ! defined __CYGWIN__
- if (strcmp (filename, "/dev/null") == 0)
- filename = "NUL";
-#endif
-
-#if OPEN_TRAILING_SLASH_BUG
- /* Fail if one of O_CREAT, O_WRONLY, O_RDWR is specified and the filename
- ends in a slash, as POSIX says such a filename must name a directory
- <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13>:
- "A pathname that contains at least one non-<slash> character and that
- ends with one or more trailing <slash> characters shall not be resolved
- successfully unless the last pathname component before the trailing
- <slash> characters names an existing directory"
- If the named file already exists as a directory, then
- - if O_CREAT is specified, open() must fail because of the semantics
- of O_CREAT,
- - if O_WRONLY or O_RDWR is specified, open() must fail because POSIX
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html>
- says that it fails with errno = EISDIR in this case.
- If the named file does not exist or does not name a directory, then
- - if O_CREAT is specified, open() must fail since open() cannot create
- directories,
- - if O_WRONLY or O_RDWR is specified, open() must fail because the
- file does not contain a '.' directory. */
- if ((flags & O_CREAT)
- || (flags & O_ACCMODE) == O_RDWR
- || (flags & O_ACCMODE) == O_WRONLY)
- {
- size_t len = strlen (filename);
- if (len > 0 && filename[len - 1] == '/')
- {
- errno = EISDIR;
- return -1;
- }
- }
-#endif
-
- fd = orig_open (filename,
- flags & ~(have_cloexec < 0 ? O_CLOEXEC : 0), mode);
-
- if (flags & O_CLOEXEC)
- {
- if (! have_cloexec)
- {
- if (0 <= fd)
- have_cloexec = 1;
- else if (errno == EINVAL)
- {
- fd = orig_open (filename, flags & ~O_CLOEXEC, mode);
- have_cloexec = -1;
- }
- }
- if (have_cloexec < 0 && 0 <= fd)
- set_cloexec_flag (fd, true);
- }
-
-
-#if REPLACE_FCHDIR
- /* Implementing fchdir and fdopendir requires the ability to open a
- directory file descriptor. If open doesn't support that (as on
- mingw), we use a dummy file that behaves the same as directories
- on Linux (ie. always reports EOF on attempts to read()), and
- override fstat() in fchdir.c to hide the fact that we have a
- dummy. */
- if (REPLACE_OPEN_DIRECTORY && fd < 0 && errno == EACCES
- && ((flags & O_ACCMODE) == O_RDONLY
- || (O_SEARCH != O_RDONLY && (flags & O_ACCMODE) == O_SEARCH)))
- {
- struct stat statbuf;
- if (stat (filename, &statbuf) == 0 && S_ISDIR (statbuf.st_mode))
- {
- /* Maximum recursion depth of 1. */
- fd = open ("/dev/null", flags, mode);
- if (0 <= fd)
- fd = _gl_register_fd (fd, filename);
- }
- else
- errno = EACCES;
- }
-#endif
-
-#if OPEN_TRAILING_SLASH_BUG
- /* If the filename ends in a slash and fd does not refer to a directory,
- then fail.
- Rationale: POSIX says such a filename must name a directory
- <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13>:
- "A pathname that contains at least one non-<slash> character and that
- ends with one or more trailing <slash> characters shall not be resolved
- successfully unless the last pathname component before the trailing
- <slash> characters names an existing directory"
- If the named file without the slash is not a directory, open() must fail
- with ENOTDIR. */
- if (fd >= 0)
- {
- /* We know len is positive, since open did not fail with ENOENT. */
- size_t len = strlen (filename);
- if (filename[len - 1] == '/')
- {
- struct stat statbuf;
-
- if (fstat (fd, &statbuf) >= 0 && !S_ISDIR (statbuf.st_mode))
- {
- close (fd);
- errno = ENOTDIR;
- return -1;
- }
- }
- }
-#endif
-
-#if REPLACE_FCHDIR
- if (!REPLACE_OPEN_DIRECTORY && 0 <= fd)
- fd = _gl_register_fd (fd, filename);
-#endif
-
- return fd;
-}
diff --git a/cross/lib/openat-die.c b/cross/lib/openat-die.c
deleted file mode 100644
index 8dab8b97429..00000000000
--- a/cross/lib/openat-die.c
+++ /dev/null
@@ -1,7 +0,0 @@
-/* Respond to a save- or restore-cwd failure.
- This should never happen with Emacs. */
-#include <config.h>
-#include "openat.h"
-#include <stdlib.h>
-void openat_save_fail (int errnum) { abort (); }
-void openat_restore_fail (int errnum) { abort (); }
diff --git a/cross/lib/openat-priv.h b/cross/lib/openat-priv.h
deleted file mode 100644
index 1d31c4e83cb..00000000000
--- a/cross/lib/openat-priv.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* Internals for openat-like functions.
-
- Copyright (C) 2005-2006, 2009-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* written by Jim Meyering */
-
-#ifndef _GL_HEADER_OPENAT_PRIV
-#define _GL_HEADER_OPENAT_PRIV
-
-#include <errno.h>
-#include <limits.h>
-#include <stdlib.h>
-
-/* Maximum number of bytes that it is safe to allocate as a single
- array on the stack, and that is known as a compile-time constant.
- The assumption is that we'll touch the array very quickly, or a
- temporary very near the array, provoking an out-of-memory trap. On
- some operating systems, there is only one guard page for the stack,
- and a page size can be as small as 4096 bytes. Subtract 64 in the
- hope that this will let the compiler touch a nearby temporary and
- provoke a trap. */
-#define SAFER_ALLOCA_MAX (4096 - 64)
-
-#define SAFER_ALLOCA(m) ((m) < SAFER_ALLOCA_MAX ? (m) : SAFER_ALLOCA_MAX)
-
-#if defined PATH_MAX
-# define OPENAT_BUFFER_SIZE SAFER_ALLOCA (PATH_MAX)
-#elif defined _XOPEN_PATH_MAX
-# define OPENAT_BUFFER_SIZE SAFER_ALLOCA (_XOPEN_PATH_MAX)
-#else
-# define OPENAT_BUFFER_SIZE SAFER_ALLOCA (1024)
-#endif
-
-char *openat_proc_name (char buf[OPENAT_BUFFER_SIZE], int fd, char const *file);
-
-/* Trying to access a BUILD_PROC_NAME file will fail on systems without
- /proc support, and even on systems *with* ProcFS support. Return
- nonzero if the failure may be legitimate, e.g., because /proc is not
- readable, or the particular .../fd/N directory is not present. */
-#define EXPECTED_ERRNO(Errno) \
- ((Errno) == ENOTDIR || (Errno) == ENOENT \
- || (Errno) == EPERM || (Errno) == EACCES \
- || (Errno) == ENOSYS /* Solaris 8 */ \
- || (Errno) == EOPNOTSUPP /* FreeBSD */)
-
-/* Wrapper function shared among linkat and renameat. */
-int at_func2 (int fd1, char const *file1,
- int fd2, char const *file2,
- int (*func) (char const *file1, char const *file2));
-
-#endif /* _GL_HEADER_OPENAT_PRIV */
diff --git a/cross/lib/openat-proc.c b/cross/lib/openat-proc.c
deleted file mode 100644
index 88f70be4f59..00000000000
--- a/cross/lib/openat-proc.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/* Create /proc/self/fd-related names for subfiles of open directories.
-
- Copyright (C) 2006, 2009-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert. */
-
-#include <config.h>
-
-#include "openat-priv.h"
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#ifdef __KLIBC__ /* OS/2 */
-# include <InnoTekLIBC/backend.h>
-#endif
-#ifdef __MVS__ /* z/OS */
-# include <termios.h>
-#endif
-
-#include "intprops.h"
-
-/* Set BUF to the name of the subfile of the directory identified by
- FD, where the subfile is named FILE. If successful, return BUF if
- the result fits in BUF, dynamically allocated memory otherwise.
- Return NULL (setting errno) on error. */
-char *
-openat_proc_name (char buf[OPENAT_BUFFER_SIZE], int fd, char const *file)
-{
- char *result = buf;
- int dirlen;
-
- /* Make sure the caller gets ENOENT when appropriate. */
- if (!*file)
- {
- buf[0] = '\0';
- return buf;
- }
-
-#if !(defined __KLIBC__ || defined __MVS__)
- /* Generic code for Linux, Solaris, and similar platforms. */
-# define PROC_SELF_FD_FORMAT "/proc/self/fd/%d/"
- {
- enum {
- PROC_SELF_FD_DIR_SIZE_BOUND
- = (sizeof PROC_SELF_FD_FORMAT - (sizeof "%d" - 1)
- + INT_STRLEN_BOUND (int))
- };
-
- static int proc_status = 0;
- if (! proc_status)
- {
- /* Set PROC_STATUS to a positive value if /proc/self/fd is
- reliable, and a negative value otherwise. Solaris 10
- /proc/self/fd mishandles "..", and any file name might expand
- to ".." after symbolic link expansion, so avoid /proc/self/fd
- if it mishandles "..". Solaris 10 has openat, but this
- problem is exhibited on code that built on Solaris 8 and
- running on Solaris 10. */
-
- int proc_self_fd =
- open ("/proc/self/fd",
- O_SEARCH | O_DIRECTORY | O_NOCTTY | O_NONBLOCK | O_CLOEXEC);
- if (proc_self_fd < 0)
- proc_status = -1;
- else
- {
- /* Detect whether /proc/self/fd/%i/../fd exists, where %i is the
- number of a file descriptor open on /proc/self/fd. On Linux,
- that name resolves to /proc/self/fd, which was opened above.
- However, on Solaris, it may resolve to /proc/self/fd/fd, which
- cannot exist, since all names in /proc/self/fd are numeric. */
- char dotdot_buf[PROC_SELF_FD_DIR_SIZE_BOUND + sizeof "../fd" - 1];
- sprintf (dotdot_buf, PROC_SELF_FD_FORMAT "../fd", proc_self_fd);
- proc_status = access (dotdot_buf, F_OK) ? -1 : 1;
- close (proc_self_fd);
- }
- }
-
- if (proc_status < 0)
- return NULL;
- else
- {
- size_t bufsize = PROC_SELF_FD_DIR_SIZE_BOUND + strlen (file);
- if (OPENAT_BUFFER_SIZE < bufsize)
- {
- result = malloc (bufsize);
- if (! result)
- return NULL;
- }
-
- dirlen = sprintf (result, PROC_SELF_FD_FORMAT, fd);
- }
- }
-#else /* (defined __KLIBC__ || defined __MVS__), i.e. OS/2 or z/OS */
- /* OS/2 kLIBC provides a function to retrieve a path from a fd. */
- {
- size_t bufsize;
-
-# ifdef __KLIBC__
- char dir[_MAX_PATH];
- if (__libc_Back_ioFHToPath (fd, dir, sizeof dir))
- return NULL;
-# endif
-# ifdef __MVS__
- char dir[_XOPEN_PATH_MAX];
- /* Documentation:
- https://www.ibm.com/docs/en/zos/2.2.0?topic=functions-w-ioctl-w-pioctl-control-devices */
- if (w_ioctl (fd, _IOCC_GPN, sizeof dir, dir) < 0)
- return NULL;
- /* Documentation:
- https://www.ibm.com/docs/en/zos/2.2.0?topic=functions-e2a-l-convert-characters-from-ebcdic-ascii */
- dirlen = __e2a_l (dir, strlen (dir));
- if (dirlen < 0 || dirlen >= sizeof dir)
- return NULL;
- dir[dirlen] = '\0';
-# endif
-
- dirlen = strlen (dir);
- bufsize = dirlen + 1 + strlen (file) + 1; /* 1 for '/', 1 for null */
- if (OPENAT_BUFFER_SIZE < bufsize)
- {
- result = malloc (bufsize);
- if (! result)
- return NULL;
- }
-
- strcpy (result, dir);
- result[dirlen++] = '/';
- }
-#endif
-
- strcpy (result + dirlen, file);
- return result;
-}
diff --git a/cross/lib/openat.h b/cross/lib/openat.h
deleted file mode 100644
index 37d8eedbee4..00000000000
--- a/cross/lib/openat.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/* provide a replacement openat function
- Copyright (C) 2004-2006, 2008-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* written by Jim Meyering */
-
-#ifndef _GL_HEADER_OPENAT
-#define _GL_HEADER_OPENAT
-
-#include <fcntl.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
-#ifndef _GL_INLINE_HEADER_BEGIN
- #error "Please include config.h first."
-#endif
-_GL_INLINE_HEADER_BEGIN
-
-#if !HAVE_OPENAT
-
-int openat_permissive (int fd, char const *file, int flags, mode_t mode,
- int *cwd_errno);
-bool openat_needs_fchdir (void);
-
-#else
-
-# define openat_permissive(Fd, File, Flags, Mode, Cwd_errno) \
- openat (Fd, File, Flags, Mode)
-# define openat_needs_fchdir() false
-
-#endif
-
-_Noreturn void openat_restore_fail (int);
-_Noreturn void openat_save_fail (int);
-
-/* Using these function names makes application code
- slightly more readable than it would be with
- fchownat (..., 0) or fchownat (..., AT_SYMLINK_NOFOLLOW). */
-
-#if GNULIB_CHOWNAT
-
-# ifndef CHOWNAT_INLINE
-# define CHOWNAT_INLINE _GL_INLINE
-# endif
-
-CHOWNAT_INLINE int
-chownat (int fd, char const *file, uid_t owner, gid_t group)
-{
- return fchownat (fd, file, owner, group, 0);
-}
-
-CHOWNAT_INLINE int
-lchownat (int fd, char const *file, uid_t owner, gid_t group)
-{
- return fchownat (fd, file, owner, group, AT_SYMLINK_NOFOLLOW);
-}
-
-#endif
-
-#if GNULIB_CHMODAT
-
-# ifndef CHMODAT_INLINE
-# define CHMODAT_INLINE _GL_INLINE
-# endif
-
-CHMODAT_INLINE int
-chmodat (int fd, char const *file, mode_t mode)
-{
- return fchmodat (fd, file, mode, 0);
-}
-
-CHMODAT_INLINE int
-lchmodat (int fd, char const *file, mode_t mode)
-{
- return fchmodat (fd, file, mode, AT_SYMLINK_NOFOLLOW);
-}
-
-#endif
-
-#if GNULIB_STATAT
-
-# ifndef STATAT_INLINE
-# define STATAT_INLINE _GL_INLINE
-# endif
-
-_GL_ATTRIBUTE_DEPRECATED
-STATAT_INLINE int
-statat (int fd, char const *name, struct stat *st)
-{
- return fstatat (fd, name, st, 0);
-}
-
-_GL_ATTRIBUTE_DEPRECATED
-STATAT_INLINE int
-lstatat (int fd, char const *name, struct stat *st)
-{
- return fstatat (fd, name, st, AT_SYMLINK_NOFOLLOW);
-}
-
-#endif
-
-/* For now, there are no wrappers named laccessat or leuidaccessat,
- since gnulib doesn't support faccessat(,AT_SYMLINK_NOFOLLOW) and
- since access rights on symlinks are of limited utility. Likewise,
- wrappers are not provided for accessat or euidaccessat, so as to
- avoid dragging in -lgen on some platforms. */
-
-_GL_INLINE_HEADER_END
-
-#endif /* _GL_HEADER_OPENAT */
diff --git a/cross/lib/pathmax.h b/cross/lib/pathmax.h
deleted file mode 100644
index 0dd8f3bc5ce..00000000000
--- a/cross/lib/pathmax.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/* Define PATH_MAX somehow. Requires sys/types.h.
- Copyright (C) 1992, 1999, 2001, 2003, 2005, 2009-2023 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 _PATHMAX_H
-# define _PATHMAX_H
-
-/* POSIX:2008 defines PATH_MAX to be the maximum number of bytes in a filename,
- including the terminating NUL byte.
- <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html>
- PATH_MAX is not defined on systems which have no limit on filename length,
- such as GNU/Hurd.
-
- This file does *not* define PATH_MAX always. Programs that use this file
- can handle the GNU/Hurd case in several ways:
- - Either with a package-wide handling, or with a per-file handling,
- - Either through a
- #ifdef PATH_MAX
- or through a fallback like
- #ifndef PATH_MAX
- # define PATH_MAX 8192
- #endif
- or through a fallback like
- #ifndef PATH_MAX
- # define PATH_MAX pathconf ("/", _PC_PATH_MAX)
- #endif
- */
-
-# include <unistd.h>
-
-# include <limits.h>
-
-# ifndef _POSIX_PATH_MAX
-# define _POSIX_PATH_MAX 256
-# endif
-
-/* Don't include sys/param.h if it already has been. */
-# if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN
-# include <sys/param.h>
-# endif
-
-# if !defined PATH_MAX && defined MAXPATHLEN
-# define PATH_MAX MAXPATHLEN
-# endif
-
-# ifdef __hpux
-/* On HP-UX, PATH_MAX designates the maximum number of bytes in a filename,
- *not* including the terminating NUL byte, and is set to 1023.
- Additionally, when _XOPEN_SOURCE is defined to 500 or more, PATH_MAX is
- not defined at all any more. */
-# undef PATH_MAX
-# define PATH_MAX 1024
-# endif
-
-# if defined _WIN32 && ! defined __CYGWIN__
-/* The page "Naming Files, Paths, and Namespaces" on msdn.microsoft.com,
- section "Maximum Path Length Limitation",
- <https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file#maximum-path-length-limitation>
- explains that the maximum size of a filename, including the terminating
- NUL byte, is 260 = 3 + 256 + 1.
- This is the same value as
- - FILENAME_MAX in <stdio.h>,
- - _MAX_PATH in <stdlib.h>,
- - MAX_PATH in <windef.h>.
- Undefine the original value, because mingw's <limits.h> gets it wrong. */
-# undef PATH_MAX
-# define PATH_MAX 260
-# endif
-
-#endif /* _PATHMAX_H */
diff --git a/cross/lib/pipe2.c b/cross/lib/pipe2.c
deleted file mode 100644
index 8f06575a1dd..00000000000
--- a/cross/lib/pipe2.c
+++ /dev/null
@@ -1,166 +0,0 @@
-/* Create a pipe, with specific opening flags.
- Copyright (C) 2009-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-/* Specification. */
-#include <unistd.h>
-
-#include <errno.h>
-#include <fcntl.h>
-
-#include "binary-io.h"
-
-#if GNULIB_defined_O_NONBLOCK
-# include "nonblocking.h"
-#endif
-
-#if defined _WIN32 && ! defined __CYGWIN__
-/* Native Windows API. */
-
-# include <io.h>
-
-#endif
-
-int
-pipe2 (int fd[2], int flags)
-{
- /* Mingw _pipe() corrupts fd on failure; also, if we succeed at
- creating the pipe but later fail at changing fcntl, we want
- to leave fd unchanged: http://austingroupbugs.net/view.php?id=467 */
- int tmp[2];
- tmp[0] = fd[0];
- tmp[1] = fd[1];
-
-#if HAVE_PIPE2
-# undef pipe2
- /* Try the system call first, if it exists. (We may be running with a glibc
- that has the function but with an older kernel that lacks it.) */
- {
- /* Cache the information whether the system call really exists. */
- static int have_pipe2_really; /* 0 = unknown, 1 = yes, -1 = no */
- if (have_pipe2_really >= 0)
- {
- int result = pipe2 (fd, flags);
- if (!(result < 0 && errno == ENOSYS))
- {
- have_pipe2_really = 1;
- return result;
- }
- have_pipe2_really = -1;
- }
- }
-#endif
-
- /* Check the supported flags. */
- if ((flags & ~(O_CLOEXEC | O_NONBLOCK | O_BINARY | O_TEXT)) != 0)
- {
- errno = EINVAL;
- return -1;
- }
-
-#if defined _WIN32 && ! defined __CYGWIN__
-/* Native Windows API. */
-
- if (_pipe (fd, 4096, flags & ~O_NONBLOCK) < 0)
- {
- fd[0] = tmp[0];
- fd[1] = tmp[1];
- return -1;
- }
-
- /* O_NONBLOCK handling.
- On native Windows platforms, O_NONBLOCK is defined by gnulib. Use the
- functions defined by the gnulib module 'nonblocking'. */
-# if GNULIB_defined_O_NONBLOCK
- if (flags & O_NONBLOCK)
- {
- if (set_nonblocking_flag (fd[0], true) != 0
- || set_nonblocking_flag (fd[1], true) != 0)
- goto fail;
- }
-# else
- {
- static_assert (O_NONBLOCK == 0);
- }
-# endif
-
- return 0;
-
-#else
-/* Unix API. */
-
- if (pipe (fd) < 0)
- return -1;
-
- /* POSIX <https://pubs.opengroup.org/onlinepubs/9699919799/functions/pipe.html>
- says that initially, the O_NONBLOCK and FD_CLOEXEC flags are cleared on
- both fd[0] and fd[1]. */
-
- /* O_NONBLOCK handling.
- On Unix platforms, O_NONBLOCK is defined by the system. Use fcntl(). */
- if (flags & O_NONBLOCK)
- {
- int fcntl_flags;
-
- if ((fcntl_flags = fcntl (fd[1], F_GETFL, 0)) < 0
- || fcntl (fd[1], F_SETFL, fcntl_flags | O_NONBLOCK) == -1
- || (fcntl_flags = fcntl (fd[0], F_GETFL, 0)) < 0
- || fcntl (fd[0], F_SETFL, fcntl_flags | O_NONBLOCK) == -1)
- goto fail;
- }
-
- if (flags & O_CLOEXEC)
- {
- int fcntl_flags;
-
- if ((fcntl_flags = fcntl (fd[1], F_GETFD, 0)) < 0
- || fcntl (fd[1], F_SETFD, fcntl_flags | FD_CLOEXEC) == -1
- || (fcntl_flags = fcntl (fd[0], F_GETFD, 0)) < 0
- || fcntl (fd[0], F_SETFD, fcntl_flags | FD_CLOEXEC) == -1)
- goto fail;
- }
-
-# if O_BINARY
- if (flags & O_BINARY)
- {
- set_binary_mode (fd[1], O_BINARY);
- set_binary_mode (fd[0], O_BINARY);
- }
- else if (flags & O_TEXT)
- {
- set_binary_mode (fd[1], O_TEXT);
- set_binary_mode (fd[0], O_TEXT);
- }
-# endif
-
- return 0;
-
-#endif
-
-#if GNULIB_defined_O_NONBLOCK || !(defined _WIN32 && ! defined __CYGWIN__)
- fail:
- {
- int saved_errno = errno;
- close (fd[0]);
- close (fd[1]);
- fd[0] = tmp[0];
- fd[1] = tmp[1];
- errno = saved_errno;
- return -1;
- }
-#endif
-}
diff --git a/cross/lib/printf-args.c b/cross/lib/printf-args.c
deleted file mode 100644
index 5e14f654794..00000000000
--- a/cross/lib/printf-args.c
+++ /dev/null
@@ -1,183 +0,0 @@
-/* Decomposed printf argument list.
- Copyright (C) 1999, 2002-2003, 2005-2007, 2009-2023 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/>. */
-
-/* This file can be parametrized with the following macros:
- ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
- PRINTF_FETCHARGS Name of the function to be defined.
- STATIC Set to 'static' to declare the function static. */
-
-#ifndef PRINTF_FETCHARGS
-# include <config.h>
-#endif
-
-/* Specification. */
-#ifndef PRINTF_FETCHARGS
-# include "printf-args.h"
-#endif
-
-#ifdef STATIC
-STATIC
-#endif
-int
-PRINTF_FETCHARGS (va_list args, arguments *a)
-{
- size_t i;
- argument *ap;
-
- for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++)
- switch (ap->type)
- {
- case TYPE_SCHAR:
- ap->a.a_schar = va_arg (args, /*signed char*/ int);
- break;
- case TYPE_UCHAR:
- ap->a.a_uchar = va_arg (args, /*unsigned char*/ int);
- break;
- case TYPE_SHORT:
- ap->a.a_short = va_arg (args, /*short*/ int);
- break;
- case TYPE_USHORT:
- ap->a.a_ushort = va_arg (args, /*unsigned short*/ int);
- break;
- case TYPE_INT:
- ap->a.a_int = va_arg (args, int);
- break;
- case TYPE_UINT:
- ap->a.a_uint = va_arg (args, unsigned int);
- break;
- case TYPE_LONGINT:
- ap->a.a_longint = va_arg (args, long int);
- break;
- case TYPE_ULONGINT:
- ap->a.a_ulongint = va_arg (args, unsigned long int);
- break;
- case TYPE_LONGLONGINT:
- ap->a.a_longlongint = va_arg (args, long long int);
- break;
- case TYPE_ULONGLONGINT:
- ap->a.a_ulonglongint = va_arg (args, unsigned long long int);
- break;
- case TYPE_DOUBLE:
- ap->a.a_double = va_arg (args, double);
- break;
- case TYPE_LONGDOUBLE:
- ap->a.a_longdouble = va_arg (args, long double);
- break;
- case TYPE_CHAR:
- ap->a.a_char = va_arg (args, int);
- break;
-#if HAVE_WINT_T
- case TYPE_WIDE_CHAR:
- /* Although ISO C 99 7.24.1.(2) says that wint_t is "unchanged by
- default argument promotions", this is not the case in mingw32,
- where wint_t is 'unsigned short'. */
- ap->a.a_wide_char =
- (sizeof (wint_t) < sizeof (int)
- ? (wint_t) va_arg (args, int)
- : va_arg (args, wint_t));
- break;
-#endif
- case TYPE_STRING:
- ap->a.a_string = va_arg (args, const char *);
- /* A null pointer is an invalid argument for "%s", but in practice
- it occurs quite frequently in printf statements that produce
- debug output. Use a fallback in this case. */
- if (ap->a.a_string == NULL)
- ap->a.a_string = "(NULL)";
- break;
-#if HAVE_WCHAR_T
- case TYPE_WIDE_STRING:
- ap->a.a_wide_string = va_arg (args, const wchar_t *);
- /* A null pointer is an invalid argument for "%ls", but in practice
- it occurs quite frequently in printf statements that produce
- debug output. Use a fallback in this case. */
- if (ap->a.a_wide_string == NULL)
- {
- static const wchar_t wide_null_string[] =
- {
- (wchar_t)'(',
- (wchar_t)'N', (wchar_t)'U', (wchar_t)'L', (wchar_t)'L',
- (wchar_t)')',
- (wchar_t)0
- };
- ap->a.a_wide_string = wide_null_string;
- }
- break;
-#endif
- case TYPE_POINTER:
- ap->a.a_pointer = va_arg (args, void *);
- break;
- case TYPE_COUNT_SCHAR_POINTER:
- ap->a.a_count_schar_pointer = va_arg (args, signed char *);
- break;
- case TYPE_COUNT_SHORT_POINTER:
- ap->a.a_count_short_pointer = va_arg (args, short *);
- break;
- case TYPE_COUNT_INT_POINTER:
- ap->a.a_count_int_pointer = va_arg (args, int *);
- break;
- case TYPE_COUNT_LONGINT_POINTER:
- ap->a.a_count_longint_pointer = va_arg (args, long int *);
- break;
- case TYPE_COUNT_LONGLONGINT_POINTER:
- ap->a.a_count_longlongint_pointer = va_arg (args, long long int *);
- break;
-#if ENABLE_UNISTDIO
- /* The unistdio extensions. */
- case TYPE_U8_STRING:
- ap->a.a_u8_string = va_arg (args, const uint8_t *);
- /* A null pointer is an invalid argument for "%U", but in practice
- it occurs quite frequently in printf statements that produce
- debug output. Use a fallback in this case. */
- if (ap->a.a_u8_string == NULL)
- {
- static const uint8_t u8_null_string[] =
- { '(', 'N', 'U', 'L', 'L', ')', 0 };
- ap->a.a_u8_string = u8_null_string;
- }
- break;
- case TYPE_U16_STRING:
- ap->a.a_u16_string = va_arg (args, const uint16_t *);
- /* A null pointer is an invalid argument for "%lU", but in practice
- it occurs quite frequently in printf statements that produce
- debug output. Use a fallback in this case. */
- if (ap->a.a_u16_string == NULL)
- {
- static const uint16_t u16_null_string[] =
- { '(', 'N', 'U', 'L', 'L', ')', 0 };
- ap->a.a_u16_string = u16_null_string;
- }
- break;
- case TYPE_U32_STRING:
- ap->a.a_u32_string = va_arg (args, const uint32_t *);
- /* A null pointer is an invalid argument for "%llU", but in practice
- it occurs quite frequently in printf statements that produce
- debug output. Use a fallback in this case. */
- if (ap->a.a_u32_string == NULL)
- {
- static const uint32_t u32_null_string[] =
- { '(', 'N', 'U', 'L', 'L', ')', 0 };
- ap->a.a_u32_string = u32_null_string;
- }
- break;
-#endif
- default:
- /* Unknown type. */
- return -1;
- }
- return 0;
-}
diff --git a/cross/lib/printf-args.h b/cross/lib/printf-args.h
deleted file mode 100644
index f303cb19e9b..00000000000
--- a/cross/lib/printf-args.h
+++ /dev/null
@@ -1,150 +0,0 @@
-/* Decomposed printf argument list.
- Copyright (C) 1999, 2002-2003, 2006-2007, 2011-2023 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 _PRINTF_ARGS_H
-#define _PRINTF_ARGS_H
-
-/* This file can be parametrized with the following macros:
- ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
- PRINTF_FETCHARGS Name of the function to be declared.
- STATIC Set to 'static' to declare the function static. */
-
-/* Default parameters. */
-#ifndef PRINTF_FETCHARGS
-# define PRINTF_FETCHARGS printf_fetchargs
-#endif
-
-/* Get size_t. */
-#include <stddef.h>
-
-/* Get wchar_t. */
-#if HAVE_WCHAR_T
-# include <stddef.h>
-#endif
-
-/* Get wint_t. */
-#if HAVE_WINT_T
-# include <wchar.h>
-#endif
-
-/* Get va_list. */
-#include <stdarg.h>
-
-
-/* Argument types */
-typedef enum
-{
- TYPE_NONE,
- TYPE_SCHAR,
- TYPE_UCHAR,
- TYPE_SHORT,
- TYPE_USHORT,
- TYPE_INT,
- TYPE_UINT,
- TYPE_LONGINT,
- TYPE_ULONGINT,
- TYPE_LONGLONGINT,
- TYPE_ULONGLONGINT,
- TYPE_DOUBLE,
- TYPE_LONGDOUBLE,
- TYPE_CHAR,
-#if HAVE_WINT_T
- TYPE_WIDE_CHAR,
-#endif
- TYPE_STRING,
-#if HAVE_WCHAR_T
- TYPE_WIDE_STRING,
-#endif
- TYPE_POINTER,
- TYPE_COUNT_SCHAR_POINTER,
- TYPE_COUNT_SHORT_POINTER,
- TYPE_COUNT_INT_POINTER,
- TYPE_COUNT_LONGINT_POINTER,
- TYPE_COUNT_LONGLONGINT_POINTER
-#if ENABLE_UNISTDIO
- /* The unistdio extensions. */
-, TYPE_U8_STRING
-, TYPE_U16_STRING
-, TYPE_U32_STRING
-#endif
-} arg_type;
-
-/* Polymorphic argument */
-typedef struct
-{
- arg_type type;
- union
- {
- signed char a_schar;
- unsigned char a_uchar;
- short a_short;
- unsigned short a_ushort;
- int a_int;
- unsigned int a_uint;
- long int a_longint;
- unsigned long int a_ulongint;
- long long int a_longlongint;
- unsigned long long int a_ulonglongint;
- float a_float;
- double a_double;
- long double a_longdouble;
- int a_char;
-#if HAVE_WINT_T
- wint_t a_wide_char;
-#endif
- const char* a_string;
-#if HAVE_WCHAR_T
- const wchar_t* a_wide_string;
-#endif
- void* a_pointer;
- signed char * a_count_schar_pointer;
- short * a_count_short_pointer;
- int * a_count_int_pointer;
- long int * a_count_longint_pointer;
- long long int * a_count_longlongint_pointer;
-#if ENABLE_UNISTDIO
- /* The unistdio extensions. */
- const uint8_t * a_u8_string;
- const uint16_t * a_u16_string;
- const uint32_t * a_u32_string;
-#endif
- }
- a;
-}
-argument;
-
-/* Number of directly allocated arguments (no malloc() needed). */
-#define N_DIRECT_ALLOC_ARGUMENTS 7
-
-typedef struct
-{
- size_t count;
- argument *arg;
- argument direct_alloc_arg[N_DIRECT_ALLOC_ARGUMENTS];
-}
-arguments;
-
-
-/* Fetch the arguments, putting them into a. */
-#ifdef STATIC
-STATIC
-#else
-extern
-#endif
-int PRINTF_FETCHARGS (va_list args, arguments *a);
-
-#endif /* _PRINTF_ARGS_H */
diff --git a/cross/lib/printf-frexp.c b/cross/lib/printf-frexp.c
deleted file mode 100644
index 8252b0656cb..00000000000
--- a/cross/lib/printf-frexp.c
+++ /dev/null
@@ -1,190 +0,0 @@
-/* Split a double into fraction and mantissa, for hexadecimal printf.
- Copyright (C) 2007, 2009-2023 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 ! defined USE_LONG_DOUBLE
-# include <config.h>
-#endif
-
-/* Specification. */
-#ifdef USE_LONG_DOUBLE
-# include "printf-frexpl.h"
-#else
-# include "printf-frexp.h"
-#endif
-
-#include <float.h>
-#include <math.h>
-#ifdef USE_LONG_DOUBLE
-# include "fpucw.h"
-#endif
-
-/* This file assumes FLT_RADIX = 2. If FLT_RADIX is a power of 2 greater
- than 2, or not even a power of 2, some rounding errors can occur, so that
- then the returned mantissa is only guaranteed to be <= 2.0, not < 2.0. */
-
-#ifdef USE_LONG_DOUBLE
-# define FUNC printf_frexpl
-# define DOUBLE long double
-# define MIN_EXP LDBL_MIN_EXP
-# if HAVE_FREXPL_IN_LIBC && HAVE_LDEXPL_IN_LIBC
-# define USE_FREXP_LDEXP
-# define FREXP frexpl
-# define LDEXP ldexpl
-# endif
-# define DECL_ROUNDING DECL_LONG_DOUBLE_ROUNDING
-# define BEGIN_ROUNDING() BEGIN_LONG_DOUBLE_ROUNDING ()
-# define END_ROUNDING() END_LONG_DOUBLE_ROUNDING ()
-# define L_(literal) literal##L
-#else
-# define FUNC printf_frexp
-# define DOUBLE double
-# define MIN_EXP DBL_MIN_EXP
-# if HAVE_FREXP_IN_LIBC && HAVE_LDEXP_IN_LIBC
-# define USE_FREXP_LDEXP
-# define FREXP frexp
-# define LDEXP ldexp
-# endif
-# define DECL_ROUNDING
-# define BEGIN_ROUNDING()
-# define END_ROUNDING()
-# define L_(literal) literal
-#endif
-
-DOUBLE
-FUNC (DOUBLE x, int *expptr)
-{
- int exponent;
- DECL_ROUNDING
-
- BEGIN_ROUNDING ();
-
-#ifdef USE_FREXP_LDEXP
- /* frexp and ldexp are usually faster than the loop below. */
- x = FREXP (x, &exponent);
-
- x = x + x;
- exponent -= 1;
-
- if (exponent < MIN_EXP - 1)
- {
- x = LDEXP (x, exponent - (MIN_EXP - 1));
- exponent = MIN_EXP - 1;
- }
-#else
- {
- /* Since the exponent is an 'int', it fits in 64 bits. Therefore the
- loops are executed no more than 64 times. */
- DOUBLE pow2[64]; /* pow2[i] = 2^2^i */
- DOUBLE powh[64]; /* powh[i] = 2^-2^i */
- int i;
-
- exponent = 0;
- if (x >= L_(1.0))
- {
- /* A nonnegative exponent. */
- {
- DOUBLE pow2_i; /* = pow2[i] */
- DOUBLE powh_i; /* = powh[i] */
-
- /* Invariants: pow2_i = 2^2^i, powh_i = 2^-2^i,
- x * 2^exponent = argument, x >= 1.0. */
- for (i = 0, pow2_i = L_(2.0), powh_i = L_(0.5);
- ;
- i++, pow2_i = pow2_i * pow2_i, powh_i = powh_i * powh_i)
- {
- if (x >= pow2_i)
- {
- exponent += (1 << i);
- x *= powh_i;
- }
- else
- break;
-
- pow2[i] = pow2_i;
- powh[i] = powh_i;
- }
- }
- /* Here 1.0 <= x < 2^2^i. */
- }
- else
- {
- /* A negative exponent. */
- {
- DOUBLE pow2_i; /* = pow2[i] */
- DOUBLE powh_i; /* = powh[i] */
-
- /* Invariants: pow2_i = 2^2^i, powh_i = 2^-2^i,
- x * 2^exponent = argument, x < 1.0, exponent >= MIN_EXP - 1. */
- for (i = 0, pow2_i = L_(2.0), powh_i = L_(0.5);
- ;
- i++, pow2_i = pow2_i * pow2_i, powh_i = powh_i * powh_i)
- {
- if (exponent - (1 << i) < MIN_EXP - 1)
- break;
-
- exponent -= (1 << i);
- x *= pow2_i;
- if (x >= L_(1.0))
- break;
-
- pow2[i] = pow2_i;
- powh[i] = powh_i;
- }
- }
- /* Here either x < 1.0 and exponent - 2^i < MIN_EXP - 1 <= exponent,
- or 1.0 <= x < 2^2^i and exponent >= MIN_EXP - 1. */
-
- if (x < L_(1.0))
- /* Invariants: x * 2^exponent = argument, x < 1.0 and
- exponent - 2^i < MIN_EXP - 1 <= exponent. */
- while (i > 0)
- {
- i--;
- if (exponent - (1 << i) >= MIN_EXP - 1)
- {
- exponent -= (1 << i);
- x *= pow2[i];
- if (x >= L_(1.0))
- break;
- }
- }
-
- /* Here either x < 1.0 and exponent = MIN_EXP - 1,
- or 1.0 <= x < 2^2^i and exponent >= MIN_EXP - 1. */
- }
-
- /* Invariants: x * 2^exponent = argument, and
- either x < 1.0 and exponent = MIN_EXP - 1,
- or 1.0 <= x < 2^2^i and exponent >= MIN_EXP - 1. */
- while (i > 0)
- {
- i--;
- if (x >= pow2[i])
- {
- exponent += (1 << i);
- x *= powh[i];
- }
- }
- /* Here either x < 1.0 and exponent = MIN_EXP - 1,
- or 1.0 <= x < 2.0 and exponent >= MIN_EXP - 1. */
- }
-#endif
-
- END_ROUNDING ();
-
- *expptr = exponent;
- return x;
-}
diff --git a/cross/lib/printf-frexp.h b/cross/lib/printf-frexp.h
deleted file mode 100644
index 7c3f9e585db..00000000000
--- a/cross/lib/printf-frexp.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Split a double into fraction and mantissa, for hexadecimal printf.
- Copyright (C) 2007, 2009-2023 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/>. */
-
-/* Write a finite, positive number x as
- x = mantissa * 2^exp
- where exp >= DBL_MIN_EXP - 1,
- mantissa < 2.0,
- if x is not a denormalized number then mantissa >= 1.0.
- Store exp in *EXPPTR and return mantissa. */
-extern double printf_frexp (double x, int *expptr);
diff --git a/cross/lib/printf-frexpl.c b/cross/lib/printf-frexpl.c
deleted file mode 100644
index ba7b579b987..00000000000
--- a/cross/lib/printf-frexpl.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Split a 'long double' into fraction and mantissa, for hexadecimal printf.
- Copyright (C) 2007, 2009-2023 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>
-
-#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
-
-/* Specification. */
-# include "printf-frexpl.h"
-
-# include "printf-frexp.h"
-
-long double
-printf_frexpl (long double x, int *expptr)
-{
- return printf_frexp (x, expptr);
-}
-
-#else
-
-# define USE_LONG_DOUBLE
-# include "printf-frexp.c"
-
-#endif
diff --git a/cross/lib/printf-frexpl.h b/cross/lib/printf-frexpl.h
deleted file mode 100644
index 827443ec579..00000000000
--- a/cross/lib/printf-frexpl.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Split a 'long double' into fraction and mantissa, for hexadecimal printf.
- Copyright (C) 2007, 2009-2023 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/>. */
-
-/* Write a finite, positive number x as
- x = mantissa * 2^exp
- where exp >= LDBL_MIN_EXP - 1,
- mantissa < 2.0,
- if x is not a denormalized number then mantissa >= 1.0.
- Store exp in *EXPPTR and return mantissa. */
-extern long double printf_frexpl (long double x, int *expptr);
diff --git a/cross/lib/printf-parse.c b/cross/lib/printf-parse.c
deleted file mode 100644
index 3040749abdf..00000000000
--- a/cross/lib/printf-parse.c
+++ /dev/null
@@ -1,623 +0,0 @@
-/* Formatted output to strings.
- Copyright (C) 1999-2000, 2002-2003, 2006-2023 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/>. */
-
-/* This file can be parametrized with the following macros:
- CHAR_T The element type of the format string.
- CHAR_T_ONLY_ASCII Set to 1 to enable verification that all characters
- in the format string are ASCII.
- DIRECTIVE Structure denoting a format directive.
- Depends on CHAR_T.
- DIRECTIVES Structure denoting the set of format directives of a
- format string. Depends on CHAR_T.
- PRINTF_PARSE Function that parses a format string.
- Depends on CHAR_T.
- STATIC Set to 'static' to declare the function static.
- ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions. */
-
-#ifndef PRINTF_PARSE
-# include <config.h>
-#endif
-
-/* Specification. */
-#ifndef PRINTF_PARSE
-# include "printf-parse.h"
-#endif
-
-/* Default parameters. */
-#ifndef PRINTF_PARSE
-# define PRINTF_PARSE printf_parse
-# define CHAR_T char
-# define DIRECTIVE char_directive
-# define DIRECTIVES char_directives
-#endif
-
-/* Get size_t, NULL. */
-#include <stddef.h>
-
-/* Get intmax_t. */
-#include <stdint.h>
-
-/* malloc(), realloc(), free(). */
-#include <stdlib.h>
-
-/* memcpy(). */
-#include <string.h>
-
-/* errno. */
-#include <errno.h>
-
-/* Checked size_t computations. */
-#include "xsize.h"
-
-#if CHAR_T_ONLY_ASCII
-/* c_isascii(). */
-# include "c-ctype.h"
-#endif
-
-#ifdef STATIC
-STATIC
-#endif
-int
-PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
-{
- const CHAR_T *cp = format; /* pointer into format */
- size_t arg_posn = 0; /* number of regular arguments consumed */
- size_t d_allocated; /* allocated elements of d->dir */
- size_t a_allocated; /* allocated elements of a->arg */
- size_t max_width_length = 0;
- size_t max_precision_length = 0;
-
- d->count = 0;
- d_allocated = N_DIRECT_ALLOC_DIRECTIVES;
- d->dir = d->direct_alloc_dir;
-
- a->count = 0;
- a_allocated = N_DIRECT_ALLOC_ARGUMENTS;
- a->arg = a->direct_alloc_arg;
-
-#define REGISTER_ARG(_index_,_type_) \
- { \
- size_t n = (_index_); \
- if (n >= a_allocated) \
- { \
- size_t memory_size; \
- argument *memory; \
- \
- a_allocated = xtimes (a_allocated, 2); \
- if (a_allocated <= n) \
- a_allocated = xsum (n, 1); \
- memory_size = xtimes (a_allocated, sizeof (argument)); \
- if (size_overflow_p (memory_size)) \
- /* Overflow, would lead to out of memory. */ \
- goto out_of_memory; \
- memory = (argument *) (a->arg != a->direct_alloc_arg \
- ? realloc (a->arg, memory_size) \
- : malloc (memory_size)); \
- if (memory == NULL) \
- /* Out of memory. */ \
- goto out_of_memory; \
- if (a->arg == a->direct_alloc_arg) \
- memcpy (memory, a->arg, a->count * sizeof (argument)); \
- a->arg = memory; \
- } \
- while (a->count <= n) \
- a->arg[a->count++].type = TYPE_NONE; \
- if (a->arg[n].type == TYPE_NONE) \
- a->arg[n].type = (_type_); \
- else if (a->arg[n].type != (_type_)) \
- /* Ambiguous type for positional argument. */ \
- goto error; \
- }
-
- while (*cp != '\0')
- {
- CHAR_T c = *cp++;
- if (c == '%')
- {
- size_t arg_index = ARG_NONE;
- DIRECTIVE *dp = &d->dir[d->count]; /* pointer to next directive */
-
- /* Initialize the next directive. */
- dp->dir_start = cp - 1;
- dp->flags = 0;
- dp->width_start = NULL;
- dp->width_end = NULL;
- dp->width_arg_index = ARG_NONE;
- dp->precision_start = NULL;
- dp->precision_end = NULL;
- dp->precision_arg_index = ARG_NONE;
- dp->arg_index = ARG_NONE;
-
- /* Test for positional argument. */
- if (*cp >= '0' && *cp <= '9')
- {
- const CHAR_T *np;
-
- for (np = cp; *np >= '0' && *np <= '9'; np++)
- ;
- if (*np == '$')
- {
- size_t n = 0;
-
- for (np = cp; *np >= '0' && *np <= '9'; np++)
- n = xsum (xtimes (n, 10), *np - '0');
- if (n == 0)
- /* Positional argument 0. */
- goto error;
- if (size_overflow_p (n))
- /* n too large, would lead to out of memory later. */
- goto error;
- arg_index = n - 1;
- cp = np + 1;
- }
- }
-
- /* Read the flags. */
- for (;;)
- {
- if (*cp == '\'')
- {
- dp->flags |= FLAG_GROUP;
- cp++;
- }
- else if (*cp == '-')
- {
- dp->flags |= FLAG_LEFT;
- cp++;
- }
- else if (*cp == '+')
- {
- dp->flags |= FLAG_SHOWSIGN;
- cp++;
- }
- else if (*cp == ' ')
- {
- dp->flags |= FLAG_SPACE;
- cp++;
- }
- else if (*cp == '#')
- {
- dp->flags |= FLAG_ALT;
- cp++;
- }
- else if (*cp == '0')
- {
- dp->flags |= FLAG_ZERO;
- cp++;
- }
-#if __GLIBC__ >= 2 && !defined __UCLIBC__
- else if (*cp == 'I')
- {
- dp->flags |= FLAG_LOCALIZED;
- cp++;
- }
-#endif
- else
- break;
- }
-
- /* Parse the field width. */
- if (*cp == '*')
- {
- dp->width_start = cp;
- cp++;
- dp->width_end = cp;
- if (max_width_length < 1)
- max_width_length = 1;
-
- /* Test for positional argument. */
- if (*cp >= '0' && *cp <= '9')
- {
- const CHAR_T *np;
-
- for (np = cp; *np >= '0' && *np <= '9'; np++)
- ;
- if (*np == '$')
- {
- size_t n = 0;
-
- for (np = cp; *np >= '0' && *np <= '9'; np++)
- n = xsum (xtimes (n, 10), *np - '0');
- if (n == 0)
- /* Positional argument 0. */
- goto error;
- if (size_overflow_p (n))
- /* n too large, would lead to out of memory later. */
- goto error;
- dp->width_arg_index = n - 1;
- cp = np + 1;
- }
- }
- if (dp->width_arg_index == ARG_NONE)
- {
- dp->width_arg_index = arg_posn++;
- if (dp->width_arg_index == ARG_NONE)
- /* arg_posn wrapped around. */
- goto error;
- }
- REGISTER_ARG (dp->width_arg_index, TYPE_INT);
- }
- else if (*cp >= '0' && *cp <= '9')
- {
- size_t width_length;
-
- dp->width_start = cp;
- for (; *cp >= '0' && *cp <= '9'; cp++)
- ;
- dp->width_end = cp;
- width_length = dp->width_end - dp->width_start;
- if (max_width_length < width_length)
- max_width_length = width_length;
- }
-
- /* Parse the precision. */
- if (*cp == '.')
- {
- cp++;
- if (*cp == '*')
- {
- dp->precision_start = cp - 1;
- cp++;
- dp->precision_end = cp;
- if (max_precision_length < 2)
- max_precision_length = 2;
-
- /* Test for positional argument. */
- if (*cp >= '0' && *cp <= '9')
- {
- const CHAR_T *np;
-
- for (np = cp; *np >= '0' && *np <= '9'; np++)
- ;
- if (*np == '$')
- {
- size_t n = 0;
-
- for (np = cp; *np >= '0' && *np <= '9'; np++)
- n = xsum (xtimes (n, 10), *np - '0');
- if (n == 0)
- /* Positional argument 0. */
- goto error;
- if (size_overflow_p (n))
- /* n too large, would lead to out of memory
- later. */
- goto error;
- dp->precision_arg_index = n - 1;
- cp = np + 1;
- }
- }
- if (dp->precision_arg_index == ARG_NONE)
- {
- dp->precision_arg_index = arg_posn++;
- if (dp->precision_arg_index == ARG_NONE)
- /* arg_posn wrapped around. */
- goto error;
- }
- REGISTER_ARG (dp->precision_arg_index, TYPE_INT);
- }
- else
- {
- size_t precision_length;
-
- dp->precision_start = cp - 1;
- for (; *cp >= '0' && *cp <= '9'; cp++)
- ;
- dp->precision_end = cp;
- precision_length = dp->precision_end - dp->precision_start;
- if (max_precision_length < precision_length)
- max_precision_length = precision_length;
- }
- }
-
- {
- arg_type type;
-
- /* Parse argument type/size specifiers. */
- {
- int flags = 0;
-
- for (;;)
- {
- if (*cp == 'h')
- {
- flags |= (1 << (flags & 1));
- cp++;
- }
- else if (*cp == 'L')
- {
- flags |= 4;
- cp++;
- }
- else if (*cp == 'l')
- {
- flags += 8;
- cp++;
- }
- else if (*cp == 'j')
- {
- if (sizeof (intmax_t) > sizeof (long))
- {
- /* intmax_t = long long */
- flags += 16;
- }
- else if (sizeof (intmax_t) > sizeof (int))
- {
- /* intmax_t = long */
- flags += 8;
- }
- cp++;
- }
- else if (*cp == 'z' || *cp == 'Z')
- {
- /* 'z' is standardized in ISO C 99, but glibc uses 'Z'
- because the warning facility in gcc-2.95.2 understands
- only 'Z' (see gcc-2.95.2/gcc/c-common.c:1784). */
- if (sizeof (size_t) > sizeof (long))
- {
- /* size_t = long long */
- flags += 16;
- }
- else if (sizeof (size_t) > sizeof (int))
- {
- /* size_t = long */
- flags += 8;
- }
- cp++;
- }
- else if (*cp == 't')
- {
- if (sizeof (ptrdiff_t) > sizeof (long))
- {
- /* ptrdiff_t = long long */
- flags += 16;
- }
- else if (sizeof (ptrdiff_t) > sizeof (int))
- {
- /* ptrdiff_t = long */
- flags += 8;
- }
- cp++;
- }
-#if defined __APPLE__ && defined __MACH__
- /* On Mac OS X 10.3, PRIdMAX is defined as "qd".
- We cannot change it to "lld" because PRIdMAX must also
- be understood by the system's printf routines. */
- else if (*cp == 'q')
- {
- if (64 / 8 > sizeof (long))
- {
- /* int64_t = long long */
- flags += 16;
- }
- else
- {
- /* int64_t = long */
- flags += 8;
- }
- cp++;
- }
-#endif
-#if defined _WIN32 && ! defined __CYGWIN__
- /* On native Windows, PRIdMAX is defined as "I64d".
- We cannot change it to "lld" because PRIdMAX must also
- be understood by the system's printf routines. */
- else if (*cp == 'I' && cp[1] == '6' && cp[2] == '4')
- {
- if (64 / 8 > sizeof (long))
- {
- /* __int64 = long long */
- flags += 16;
- }
- else
- {
- /* __int64 = long */
- flags += 8;
- }
- cp += 3;
- }
-#endif
- else
- break;
- }
-
- /* Read the conversion character. */
- c = *cp++;
- switch (c)
- {
- case 'd': case 'i':
- /* If 'long long' is larger than 'long': */
- if (flags >= 16 || (flags & 4))
- type = TYPE_LONGLONGINT;
- else
- /* If 'long long' is the same as 'long', we parse "lld" into
- TYPE_LONGINT. */
- if (flags >= 8)
- type = TYPE_LONGINT;
- else if (flags & 2)
- type = TYPE_SCHAR;
- else if (flags & 1)
- type = TYPE_SHORT;
- else
- type = TYPE_INT;
- break;
- case 'o': case 'u': case 'x': case 'X':
- /* If 'unsigned long long' is larger than 'unsigned long': */
- if (flags >= 16 || (flags & 4))
- type = TYPE_ULONGLONGINT;
- else
- /* If 'unsigned long long' is the same as 'unsigned long', we
- parse "llu" into TYPE_ULONGINT. */
- if (flags >= 8)
- type = TYPE_ULONGINT;
- else if (flags & 2)
- type = TYPE_UCHAR;
- else if (flags & 1)
- type = TYPE_USHORT;
- else
- type = TYPE_UINT;
- break;
- case 'f': case 'F': case 'e': case 'E': case 'g': case 'G':
- case 'a': case 'A':
- if (flags >= 16 || (flags & 4))
- type = TYPE_LONGDOUBLE;
- else
- type = TYPE_DOUBLE;
- break;
- case 'c':
- if (flags >= 8)
-#if HAVE_WINT_T
- type = TYPE_WIDE_CHAR;
-#else
- goto error;
-#endif
- else
- type = TYPE_CHAR;
- break;
-#if HAVE_WINT_T
- case 'C':
- type = TYPE_WIDE_CHAR;
- c = 'c';
- break;
-#endif
- case 's':
- if (flags >= 8)
-#if HAVE_WCHAR_T
- type = TYPE_WIDE_STRING;
-#else
- goto error;
-#endif
- else
- type = TYPE_STRING;
- break;
-#if HAVE_WCHAR_T
- case 'S':
- type = TYPE_WIDE_STRING;
- c = 's';
- break;
-#endif
- case 'p':
- type = TYPE_POINTER;
- break;
- case 'n':
- /* If 'long long' is larger than 'long': */
- if (flags >= 16 || (flags & 4))
- type = TYPE_COUNT_LONGLONGINT_POINTER;
- else
- /* If 'long long' is the same as 'long', we parse "lln" into
- TYPE_COUNT_LONGINT_POINTER. */
- if (flags >= 8)
- type = TYPE_COUNT_LONGINT_POINTER;
- else if (flags & 2)
- type = TYPE_COUNT_SCHAR_POINTER;
- else if (flags & 1)
- type = TYPE_COUNT_SHORT_POINTER;
- else
- type = TYPE_COUNT_INT_POINTER;
- break;
-#if ENABLE_UNISTDIO
- /* The unistdio extensions. */
- case 'U':
- if (flags >= 16)
- type = TYPE_U32_STRING;
- else if (flags >= 8)
- type = TYPE_U16_STRING;
- else
- type = TYPE_U8_STRING;
- break;
-#endif
- case '%':
- type = TYPE_NONE;
- break;
- default:
- /* Unknown conversion character. */
- goto error;
- }
- }
-
- if (type != TYPE_NONE)
- {
- dp->arg_index = arg_index;
- if (dp->arg_index == ARG_NONE)
- {
- dp->arg_index = arg_posn++;
- if (dp->arg_index == ARG_NONE)
- /* arg_posn wrapped around. */
- goto error;
- }
- REGISTER_ARG (dp->arg_index, type);
- }
- dp->conversion = c;
- dp->dir_end = cp;
- }
-
- d->count++;
- if (d->count >= d_allocated)
- {
- size_t memory_size;
- DIRECTIVE *memory;
-
- d_allocated = xtimes (d_allocated, 2);
- memory_size = xtimes (d_allocated, sizeof (DIRECTIVE));
- if (size_overflow_p (memory_size))
- /* Overflow, would lead to out of memory. */
- goto out_of_memory;
- memory = (DIRECTIVE *) (d->dir != d->direct_alloc_dir
- ? realloc (d->dir, memory_size)
- : malloc (memory_size));
- if (memory == NULL)
- /* Out of memory. */
- goto out_of_memory;
- if (d->dir == d->direct_alloc_dir)
- memcpy (memory, d->dir, d->count * sizeof (DIRECTIVE));
- d->dir = memory;
- }
- }
-#if CHAR_T_ONLY_ASCII
- else if (!c_isascii (c))
- {
- /* Non-ASCII character. Not supported. */
- goto error;
- }
-#endif
- }
- d->dir[d->count].dir_start = cp;
-
- d->max_width_length = max_width_length;
- d->max_precision_length = max_precision_length;
- return 0;
-
-error:
- if (a->arg != a->direct_alloc_arg)
- free (a->arg);
- if (d->dir != d->direct_alloc_dir)
- free (d->dir);
- errno = EINVAL;
- return -1;
-
-out_of_memory:
- if (a->arg != a->direct_alloc_arg)
- free (a->arg);
- if (d->dir != d->direct_alloc_dir)
- free (d->dir);
- errno = ENOMEM;
- return -1;
-}
-
-#undef PRINTF_PARSE
-#undef DIRECTIVES
-#undef DIRECTIVE
-#undef CHAR_T_ONLY_ASCII
-#undef CHAR_T
diff --git a/cross/lib/printf-parse.h b/cross/lib/printf-parse.h
deleted file mode 100644
index 1f86e32c99e..00000000000
--- a/cross/lib/printf-parse.h
+++ /dev/null
@@ -1,193 +0,0 @@
-/* Parse printf format string.
- Copyright (C) 1999, 2002-2003, 2005, 2007, 2010-2023 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 _PRINTF_PARSE_H
-#define _PRINTF_PARSE_H
-
-/* This file can be parametrized with the following macros:
- ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
- STATIC Set to 'static' to declare the function static. */
-
-#if HAVE_FEATURES_H
-# include <features.h> /* for __GLIBC__, __UCLIBC__ */
-#endif
-
-#include "printf-args.h"
-
-
-/* Flags */
-#define FLAG_GROUP 1 /* ' flag */
-#define FLAG_LEFT 2 /* - flag */
-#define FLAG_SHOWSIGN 4 /* + flag */
-#define FLAG_SPACE 8 /* space flag */
-#define FLAG_ALT 16 /* # flag */
-#define FLAG_ZERO 32
-#if __GLIBC__ >= 2 && !defined __UCLIBC__
-# define FLAG_LOCALIZED 64 /* I flag, uses localized digits */
-#endif
-
-/* arg_index value indicating that no argument is consumed. */
-#define ARG_NONE (~(size_t)0)
-
-/* xxx_directive: A parsed directive.
- xxx_directives: A parsed format string. */
-
-/* Number of directly allocated directives (no malloc() needed). */
-#define N_DIRECT_ALLOC_DIRECTIVES 7
-
-/* A parsed directive. */
-typedef struct
-{
- const char* dir_start;
- const char* dir_end;
- int flags;
- const char* width_start;
- const char* width_end;
- size_t width_arg_index;
- const char* precision_start;
- const char* precision_end;
- size_t precision_arg_index;
- char conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
- size_t arg_index;
-}
-char_directive;
-
-/* A parsed format string. */
-typedef struct
-{
- size_t count;
- char_directive *dir;
- size_t max_width_length;
- size_t max_precision_length;
- char_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
-}
-char_directives;
-
-#if ENABLE_UNISTDIO
-
-/* A parsed directive. */
-typedef struct
-{
- const uint8_t* dir_start;
- const uint8_t* dir_end;
- int flags;
- const uint8_t* width_start;
- const uint8_t* width_end;
- size_t width_arg_index;
- const uint8_t* precision_start;
- const uint8_t* precision_end;
- size_t precision_arg_index;
- uint8_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
- size_t arg_index;
-}
-u8_directive;
-
-/* A parsed format string. */
-typedef struct
-{
- size_t count;
- u8_directive *dir;
- size_t max_width_length;
- size_t max_precision_length;
- u8_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
-}
-u8_directives;
-
-/* A parsed directive. */
-typedef struct
-{
- const uint16_t* dir_start;
- const uint16_t* dir_end;
- int flags;
- const uint16_t* width_start;
- const uint16_t* width_end;
- size_t width_arg_index;
- const uint16_t* precision_start;
- const uint16_t* precision_end;
- size_t precision_arg_index;
- uint16_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
- size_t arg_index;
-}
-u16_directive;
-
-/* A parsed format string. */
-typedef struct
-{
- size_t count;
- u16_directive *dir;
- size_t max_width_length;
- size_t max_precision_length;
- u16_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
-}
-u16_directives;
-
-/* A parsed directive. */
-typedef struct
-{
- const uint32_t* dir_start;
- const uint32_t* dir_end;
- int flags;
- const uint32_t* width_start;
- const uint32_t* width_end;
- size_t width_arg_index;
- const uint32_t* precision_start;
- const uint32_t* precision_end;
- size_t precision_arg_index;
- uint32_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
- size_t arg_index;
-}
-u32_directive;
-
-/* A parsed format string. */
-typedef struct
-{
- size_t count;
- u32_directive *dir;
- size_t max_width_length;
- size_t max_precision_length;
- u32_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
-}
-u32_directives;
-
-#endif
-
-
-/* Parses the format string. Fills in the number N of directives, and fills
- in directives[0], ..., directives[N-1], and sets directives[N].dir_start
- to the end of the format string. Also fills in the arg_type fields of the
- arguments and the needed count of arguments. */
-#if ENABLE_UNISTDIO
-extern int
- ulc_printf_parse (const char *format, char_directives *d, arguments *a);
-extern int
- u8_printf_parse (const uint8_t *format, u8_directives *d, arguments *a);
-extern int
- u16_printf_parse (const uint16_t *format, u16_directives *d,
- arguments *a);
-extern int
- u32_printf_parse (const uint32_t *format, u32_directives *d,
- arguments *a);
-#else
-# ifdef STATIC
-STATIC
-# else
-extern
-# endif
-int printf_parse (const char *format, char_directives *d, arguments *a);
-#endif
-
-#endif /* _PRINTF_PARSE_H */
diff --git a/cross/lib/printf.c b/cross/lib/printf.c
deleted file mode 100644
index 00483271292..00000000000
--- a/cross/lib/printf.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Formatted output to a stream.
- Copyright (C) 2007, 2010-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-/* Specification. */
-#include <stdio.h>
-
-#include <stdarg.h>
-
-/* Print formatted output to standard output.
- Return string length of formatted string. On error, return a negative
- value. */
-int
-printf (const char *format, ...)
-{
- int retval;
- va_list args;
-
- va_start (args, format);
- retval = vfprintf (stdout, format, args);
- va_end (args);
-
- return retval;
-}
diff --git a/cross/lib/pselect.c b/cross/lib/pselect.c
deleted file mode 100644
index f5d21e1048a..00000000000
--- a/cross/lib/pselect.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/* pselect - synchronous I/O multiplexing
-
- Copyright 2011-2023 Free Software Foundation, Inc.
-
- This file is part of gnulib.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* written by Paul Eggert */
-
-#include <config.h>
-
-#include <sys/select.h>
-
-#include <errno.h>
-#include <signal.h>
-
-/* Examine the size-NFDS file descriptor sets in RFDS, WFDS, and XFDS
- to see whether some of their descriptors are ready for reading,
- ready for writing, or have exceptions pending. Wait for at most
- TIMEOUT seconds, and use signal mask SIGMASK while waiting. A null
- pointer parameter stands for no descriptors, an infinite timeout,
- or an unaffected signal mask. */
-
-#if !HAVE_PSELECT
-
-int
-pselect (int nfds, fd_set *restrict rfds,
- fd_set *restrict wfds, fd_set *restrict xfds,
- struct timespec const *restrict timeout,
- sigset_t const *restrict sigmask)
-{
- int select_result;
- sigset_t origmask;
- struct timeval tv, *tvp;
-
- if (timeout)
- {
- if (! (0 <= timeout->tv_nsec && timeout->tv_nsec < 1000000000))
- {
- errno = EINVAL;
- return -1;
- }
-
- tv.tv_sec = timeout->tv_sec;
- tv.tv_usec = (timeout->tv_nsec + 999) / 1000;
- tvp = &tv;
- }
- else
- tvp = NULL;
-
- /* Signal mask munging should be atomic, but this is the best we can
- do in this emulation. */
- if (sigmask)
- pthread_sigmask (SIG_SETMASK, sigmask, &origmask);
-
- select_result = select (nfds, rfds, wfds, xfds, tvp);
-
- if (sigmask)
- {
- int select_errno = errno;
- pthread_sigmask (SIG_SETMASK, &origmask, NULL);
- errno = select_errno;
- }
-
- return select_result;
-}
-
-#else /* HAVE_PSELECT */
-# include <unistd.h>
-# undef pselect
-
-int
-rpl_pselect (int nfds, fd_set *restrict rfds,
- fd_set *restrict wfds, fd_set *restrict xfds,
- struct timespec const *restrict timeout,
- sigset_t const *restrict sigmask)
-{
- int i;
-
- /* FreeBSD 8.2 has a bug: it does not always detect invalid fds. */
- if (nfds < 0 || nfds > FD_SETSIZE)
- {
- errno = EINVAL;
- return -1;
- }
- for (i = 0; i < nfds; i++)
- {
- if (((rfds && FD_ISSET (i, rfds))
- || (wfds && FD_ISSET (i, wfds))
- || (xfds && FD_ISSET (i, xfds)))
- && dup2 (i, i) != i)
- return -1;
- }
-
- return pselect (nfds, rfds, wfds, xfds, timeout, sigmask);
-}
-
-#endif
diff --git a/cross/lib/pthread_sigmask.c b/cross/lib/pthread_sigmask.c
deleted file mode 100644
index 128107582a7..00000000000
--- a/cross/lib/pthread_sigmask.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/* POSIX compatible signal blocking for threads.
- Copyright (C) 2011-2023 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 <signal.h>
-
-#include <errno.h>
-#include <stddef.h>
-
-#if PTHREAD_SIGMASK_INEFFECTIVE
-# include <string.h>
-#endif
-
-#if PTHREAD_SIGMASK_UNBLOCK_BUG
-# include <unistd.h>
-#endif
-
-int
-pthread_sigmask (int how, const sigset_t *new_mask, sigset_t *old_mask)
-#undef pthread_sigmask
-{
-#if HAVE_PTHREAD_SIGMASK
- int ret;
-
-# if PTHREAD_SIGMASK_INEFFECTIVE
- sigset_t omask, omask_copy;
- sigset_t *old_mask_ptr = &omask;
- sigemptyset (&omask);
- /* Add a signal unlikely to be blocked, so that OMASK_COPY
- is unlikely to match the actual mask. */
- sigaddset (&omask, SIGILL);
- memcpy (&omask_copy, &omask, sizeof omask);
-# else
- sigset_t *old_mask_ptr = old_mask;
-# endif
-
- ret = pthread_sigmask (how, new_mask, old_mask_ptr);
-
-# if PTHREAD_SIGMASK_INEFFECTIVE
- if (ret == 0)
- {
- /* Detect whether pthread_sigmask is currently ineffective.
- Don't cache the information: libpthread.so could be dynamically
- loaded after the program started and after pthread_sigmask was
- called for the first time. */
- if (memcmp (&omask_copy, &omask, sizeof omask) == 0
- && pthread_sigmask (1729, &omask_copy, NULL) == 0)
- {
- /* pthread_sigmask is currently ineffective. The program is not
- linked to -lpthread. So use sigprocmask instead. */
- return (sigprocmask (how, new_mask, old_mask) < 0 ? errno : 0);
- }
-
- if (old_mask)
- memcpy (old_mask, &omask, sizeof omask);
- }
-# endif
-# if PTHREAD_SIGMASK_FAILS_WITH_ERRNO
- if (ret == -1)
- return errno;
-# endif
-# if PTHREAD_SIGMASK_UNBLOCK_BUG
- if (ret == 0
- && new_mask != NULL
- && (how == SIG_UNBLOCK || how == SIG_SETMASK))
- {
- /* Give the OS the opportunity to raise signals that were pending before
- the pthread_sigmask call and have now been unblocked. */
- usleep (1);
- }
-# endif
- return ret;
-#else
- int ret = sigprocmask (how, new_mask, old_mask);
- return (ret < 0 ? errno : 0);
-#endif
-}
diff --git a/cross/lib/qcopy-acl.c b/cross/lib/qcopy-acl.c
deleted file mode 100644
index 0f4159b7fd9..00000000000
--- a/cross/lib/qcopy-acl.c
+++ /dev/null
@@ -1,85 +0,0 @@
-/* Copy access control list from one file to another. -*- coding: utf-8 -*-
-
- Copyright (C) 2002-2003, 2005-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>.
-
- Written by Paul Eggert, Andreas Grünbacher, and Bruno Haible. */
-
-#include <config.h>
-
-#include "acl.h"
-
-#include "acl-internal.h"
-
-#if USE_XATTR
-
-# include <attr/libattr.h>
-
-/* Returns 1 if NAME is the name of an extended attribute that is related
- to permissions, i.e. ACLs. Returns 0 otherwise. */
-
-static int
-is_attr_permissions (const char *name, struct error_context *ctx)
-{
- return attr_copy_action (name, ctx) == ATTR_ACTION_PERMISSIONS;
-}
-
-#endif /* USE_XATTR */
-
-/* Copy access control lists from one file to another. If SOURCE_DESC is
- a valid file descriptor, use file descriptor operations, else use
- filename based operations on SRC_NAME. Likewise for DEST_DESC and
- DST_NAME.
- If access control lists are not available, fchmod the target file to
- MODE. Also sets the non-permission bits of the destination file
- (S_ISUID, S_ISGID, S_ISVTX) to those from MODE if any are set.
- Return 0 if successful.
- Return -2 and set errno for an error relating to the source file.
- Return -1 and set errno for an error relating to the destination file. */
-
-int
-qcopy_acl (const char *src_name, int source_desc, const char *dst_name,
- int dest_desc, mode_t mode)
-{
- int ret;
-
-#ifdef USE_XATTR
- /* in case no ACLs present and also to set higher mode bits
- we chmod before setting ACLs as doing it after could overwrite them
- (especially true for NFSv4, posix ACL has that ugly "mask" hack that
- nobody understands) */
- ret = chmod_or_fchmod (dst_name, dest_desc, mode);
- /* Rather than fiddling with acls one by one, we just copy the whole ACL xattrs
- (Posix or NFSv4). Of course, that won't address ACLs conversion
- (i.e. posix <-> nfs4) but we can't do it anyway, so for now, we don't care
- Functions attr_copy_* return 0 in case we copied something OR nothing
- to copy */
- if (ret == 0)
- ret = source_desc <= 0 || dest_desc <= 0
- ? attr_copy_file (src_name, dst_name, is_attr_permissions, NULL)
- : attr_copy_fd (src_name, source_desc, dst_name, dest_desc,
- is_attr_permissions, NULL);
-#else
- /* no XATTR, so we proceed the old dusty way */
- struct permission_context ctx;
-
- ret = get_permissions (src_name, source_desc, mode, &ctx);
- if (ret != 0)
- return -2;
- ret = set_permissions (&ctx, dst_name, dest_desc);
- free_permission_context (&ctx);
-#endif
- return ret;
-}
diff --git a/cross/lib/rawmemchr.c b/cross/lib/rawmemchr.c
deleted file mode 100644
index 45c6cd35276..00000000000
--- a/cross/lib/rawmemchr.c
+++ /dev/null
@@ -1,123 +0,0 @@
-/* Searching in a string.
- Copyright (C) 2008-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-/* Specification. */
-#include <string.h>
-
-/* A function definition is only needed if HAVE_RAWMEMCHR is not defined. */
-#if !HAVE_RAWMEMCHR
-
-# include <limits.h>
-# include <stdint.h>
-
-
-/* Find the first occurrence of C in S. */
-void *
-rawmemchr (const void *s, int c_in)
-{
- /* Change this typedef to experiment with performance. */
- typedef uintptr_t longword;
- /* If you change the "uintptr_t", you should change UINTPTR_WIDTH to match.
- This verifies that the type does not have padding bits. */
- static_assert (UINTPTR_WIDTH == UCHAR_WIDTH * sizeof (longword));
-
- const unsigned char *char_ptr;
- unsigned char c = c_in;
-
- /* Handle the first few bytes by reading one byte at a time.
- Do this until CHAR_PTR is aligned on a longword boundary. */
- for (char_ptr = (const unsigned char *) s;
- (uintptr_t) char_ptr % alignof (longword) != 0;
- ++char_ptr)
- if (*char_ptr == c)
- return (void *) char_ptr;
-
- longword const *longword_ptr = s = char_ptr;
-
- /* Compute auxiliary longword values:
- repeated_one is a value which has a 1 in every byte.
- repeated_c has c in every byte. */
- longword repeated_one = (longword) -1 / UCHAR_MAX;
- longword repeated_c = repeated_one * c;
- longword repeated_hibit = repeated_one * (UCHAR_MAX / 2 + 1);
-
- /* Instead of the traditional loop which tests each byte, we will
- test a longword at a time. The tricky part is testing if any of
- the bytes in the longword in question are equal to
- c. We first use an xor with repeated_c. This reduces the task
- to testing whether any of the bytes in longword1 is zero.
-
- (The following comments assume 8-bit bytes, as POSIX requires;
- the code's use of UCHAR_MAX should work even if bytes have more
- than 8 bits.)
-
- We compute tmp =
- ((longword1 - repeated_one) & ~longword1) & (repeated_one * 0x80).
- That is, we perform the following operations:
- 1. Subtract repeated_one.
- 2. & ~longword1.
- 3. & a mask consisting of 0x80 in every byte.
- Consider what happens in each byte:
- - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff,
- and step 3 transforms it into 0x80. A carry can also be propagated
- to more significant bytes.
- - If a byte of longword1 is nonzero, let its lowest 1 bit be at
- position k (0 <= k <= 7); so the lowest k bits are 0. After step 1,
- the byte ends in a single bit of value 0 and k bits of value 1.
- After step 2, the result is just k bits of value 1: 2^k - 1. After
- step 3, the result is 0. And no carry is produced.
- So, if longword1 has only non-zero bytes, tmp is zero.
- Whereas if longword1 has a zero byte, call j the position of the least
- significant zero byte. Then the result has a zero at positions 0, ...,
- j-1 and a 0x80 at position j. We cannot predict the result at the more
- significant bytes (positions j+1..3), but it does not matter since we
- already have a non-zero bit at position 8*j+7.
-
- The test whether any byte in longword1 is zero is equivalent
- to testing whether tmp is nonzero.
-
- This test can read beyond the end of a string, depending on where
- C_IN is encountered. However, this is considered safe since the
- initialization phase ensured that the read will be aligned,
- therefore, the read will not cross page boundaries and will not
- cause a fault. */
-
- while (1)
- {
- longword longword1 = *longword_ptr ^ repeated_c;
-
- if ((((longword1 - repeated_one) & ~longword1) & repeated_hibit) != 0)
- break;
- longword_ptr++;
- }
-
- char_ptr = s = longword_ptr;
-
- /* At this point, we know that one of the sizeof (longword) bytes
- starting at char_ptr is == c. If we knew endianness, we
- could determine the first such byte without any further memory
- accesses, just by looking at the tmp result from the last loop
- iteration. However, the following simple and portable code does
- not attempt this potential optimization. */
-
- while (*char_ptr != c)
- char_ptr++;
- return (void *) char_ptr;
-}
-
-#endif
diff --git a/cross/lib/rawmemchr.valgrind b/cross/lib/rawmemchr.valgrind
deleted file mode 100644
index f3e4cb0f655..00000000000
--- a/cross/lib/rawmemchr.valgrind
+++ /dev/null
@@ -1,28 +0,0 @@
-# Suppress a valgrind message about use of uninitialized memory in rawmemchr().
-
-# Copyright (C) 2008-2023 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/>.
-
-# This use is OK because it provides only a speedup.
-{
- rawmemchr-value4
- Memcheck:Value4
- fun:rawmemchr
-}
-{
- rawmemchr-value8
- Memcheck:Value8
- fun:rawmemchr
-}
diff --git a/cross/lib/readlink.c b/cross/lib/readlink.c
deleted file mode 100644
index 14bbb7f10ca..00000000000
--- a/cross/lib/readlink.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/* Read the contents of a symbolic link.
- Copyright (C) 2003-2007, 2009-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-/* Specification. */
-#include <unistd.h>
-
-#include <errno.h>
-#include <string.h>
-#include <sys/stat.h>
-
-#if !HAVE_READLINK
-
-/* readlink() substitute for systems that don't have a readlink() function,
- such as DJGPP 2.03 and mingw32. */
-
-ssize_t
-readlink (char const *file, _GL_UNUSED char *buf,
- _GL_UNUSED size_t bufsize)
-{
- struct stat statbuf;
-
- /* In general we should use lstat() here, not stat(). But on platforms
- without symbolic links, lstat() - if it exists - would be equivalent to
- stat(), therefore we can use stat(). This saves us a configure check. */
- if (stat (file, &statbuf) >= 0)
- errno = EINVAL;
- return -1;
-}
-
-#else /* HAVE_READLINK */
-
-# undef readlink
-
-/* readlink() wrapper that uses correct types, for systems like cygwin
- 1.5.x where readlink returns int, and which rejects trailing slash,
- for Solaris 9. */
-
-ssize_t
-rpl_readlink (char const *file, char *buf, size_t bufsize)
-{
-# if READLINK_TRAILING_SLASH_BUG
- size_t file_len = strlen (file);
- if (file_len && file[file_len - 1] == '/')
- {
- /* Even if FILE without the slash is a symlink to a directory,
- both lstat() and stat() must resolve the trailing slash to
- the directory rather than the symlink. We can therefore
- safely use stat() to distinguish between EINVAL and
- ENOTDIR/ENOENT, avoiding extra overhead of rpl_lstat(). */
- struct stat st;
- if (stat (file, &st) == 0 || errno == EOVERFLOW)
- errno = EINVAL;
- return -1;
- }
-# endif /* READLINK_TRAILING_SLASH_BUG */
-
- ssize_t r = readlink (file, buf, bufsize);
-
-# if READLINK_TRUNCATE_BUG
- if (r < 0 && errno == ERANGE)
- {
- /* Try again with a bigger buffer. This is just for test cases;
- real code invariably discards short reads. */
- char stackbuf[4032];
- r = readlink (file, stackbuf, sizeof stackbuf);
- if (r < 0)
- {
- if (errno == ERANGE)
- {
- /* Clear the buffer, which is good enough for real code.
- Thankfully, no test cases try short reads of enormous
- symlinks and what would be the point anyway? */
- r = bufsize;
- memset (buf, 0, r);
- }
- }
- else
- {
- if (bufsize < r)
- r = bufsize;
- memcpy (buf, stackbuf, r);
- }
- }
-# endif
-
- return r;
-}
-
-#endif /* HAVE_READLINK */
diff --git a/cross/lib/readlinkat.c b/cross/lib/readlinkat.c
deleted file mode 100644
index 7738ba8bfd5..00000000000
--- a/cross/lib/readlinkat.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/* Read a symlink relative to an open directory.
- Copyright (C) 2009-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* written by Eric Blake */
-
-#include <config.h>
-
-/* Specification. */
-#include <unistd.h>
-
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/stat.h>
-
-#if HAVE_READLINKAT
-
-# undef fstatat
-# undef readlinkat
-
-ssize_t
-rpl_readlinkat (int fd, char const *file, char *buf, size_t bufsize)
-{
-# if READLINK_TRAILING_SLASH_BUG
- size_t file_len = strlen (file);
- if (file_len && file[file_len - 1] == '/')
- {
- /* Even if FILE without the slash is a symlink to a directory,
- both lstat() and stat() must resolve the trailing slash to
- the directory rather than the symlink. We can therefore
- safely use fstatat(..., 0) to distinguish between EINVAL and
- ENOTDIR/ENOENT, avoiding extra overhead of rpl_fstatat(). */
- struct stat st;
- if (fstatat (fd, file, &st, 0) == 0 || errno == EOVERFLOW)
- errno = EINVAL;
- return -1;
- }
-# endif /* READLINK_TRAILING_SLASH_BUG */
-
- ssize_t r = readlinkat (fd, file, buf, bufsize);
-
-# if READLINK_TRUNCATE_BUG
- if (r < 0 && errno == ERANGE)
- {
- /* Try again with a bigger buffer. This is just for test cases;
- real code invariably discards short reads. */
- char stackbuf[4032];
- r = readlinkat (fd, file, stackbuf, sizeof stackbuf);
- if (r < 0)
- {
- if (errno == ERANGE)
- {
- /* Clear the buffer, which is good enough for real code.
- Thankfully, no test cases try short reads of enormous
- symlinks and what would be the point anyway? */
- r = bufsize;
- memset (buf, 0, r);
- }
- }
- else
- {
- if (bufsize < r)
- r = bufsize;
- memcpy (buf, stackbuf, r);
- }
- }
-# endif
-
- return r;
-}
-
-#else
-
-/* Gnulib provides a readlink stub for mingw; use it for distinction
- between EINVAL and ENOENT, rather than always failing with ENOSYS. */
-
-/* POSIX 2008 says that unlike readlink, readlinkat returns 0 for
- success instead of the buffer length. But this would render
- readlinkat worthless since readlink does not guarantee a
- NUL-terminated buffer. Assume this was a bug in POSIX. */
-
-/* Read the contents of symlink FILE into buffer BUF of size BUFSIZE, in the
- directory open on descriptor FD. If possible, do it without changing
- the working directory. Otherwise, resort to using save_cwd/fchdir,
- then readlink/restore_cwd. If either the save_cwd or the restore_cwd
- fails, then give a diagnostic and exit nonzero. */
-
-# define AT_FUNC_NAME readlinkat
-# define AT_FUNC_F1 readlink
-# define AT_FUNC_POST_FILE_PARAM_DECLS , char *buf, size_t bufsize
-# define AT_FUNC_POST_FILE_ARGS , buf, bufsize
-# define AT_FUNC_RESULT ssize_t
-# include "at-func.c"
-# undef AT_FUNC_NAME
-# undef AT_FUNC_F1
-# undef AT_FUNC_POST_FILE_PARAM_DECLS
-# undef AT_FUNC_POST_FILE_ARGS
-# undef AT_FUNC_RESULT
-
-#endif
diff --git a/cross/lib/realloc.c b/cross/lib/realloc.c
deleted file mode 100644
index 1063eb09874..00000000000
--- a/cross/lib/realloc.c
+++ /dev/null
@@ -1,63 +0,0 @@
-/* realloc() function that is glibc compatible.
-
- Copyright (C) 1997, 2003-2004, 2006-2007, 2009-2023 Free Software
- Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* written by Jim Meyering and Bruno Haible */
-
-#include <config.h>
-
-#include <stdlib.h>
-
-#include <errno.h>
-
-#include "xalloc-oversized.h"
-
-/* Call the system's realloc below. This file does not define
- _GL_USE_STDLIB_ALLOC because it needs Gnulib's malloc if present. */
-#undef realloc
-
-/* Change the size of an allocated block of memory P to N bytes,
- with error checking. If P is NULL, use malloc. Otherwise if N is zero,
- free P and return NULL. */
-
-void *
-rpl_realloc (void *p, size_t n)
-{
- if (p == NULL)
- return malloc (n);
-
- if (n == 0)
- {
- free (p);
- return NULL;
- }
-
- if (xalloc_oversized (n, 1))
- {
- errno = ENOMEM;
- return NULL;
- }
-
- void *result = realloc (p, n);
-
-#if !HAVE_MALLOC_POSIX
- if (result == NULL)
- errno = ENOMEM;
-#endif
-
- return result;
-}
diff --git a/cross/lib/regcomp.c b/cross/lib/regcomp.c
deleted file mode 100644
index 89478396855..00000000000
--- a/cross/lib/regcomp.c
+++ /dev/null
@@ -1,3788 +0,0 @@
-/* Extended regular expression matching and search library.
- Copyright (C) 2002-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
-
- 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/>. */
-
-#ifdef _LIBC
-# include <locale/weight.h>
-#endif
-
-static reg_errcode_t re_compile_internal (regex_t *preg, const char * pattern,
- size_t length, reg_syntax_t syntax);
-static void re_compile_fastmap_iter (regex_t *bufp,
- const re_dfastate_t *init_state,
- char *fastmap);
-static reg_errcode_t init_dfa (re_dfa_t *dfa, size_t pat_len);
-static void free_charset (re_charset_t *cset);
-static void free_workarea_compile (regex_t *preg);
-static reg_errcode_t create_initial_state (re_dfa_t *dfa);
-static void optimize_utf8 (re_dfa_t *dfa);
-static reg_errcode_t analyze (regex_t *preg);
-static reg_errcode_t preorder (bin_tree_t *root,
- reg_errcode_t (fn (void *, bin_tree_t *)),
- void *extra);
-static reg_errcode_t postorder (bin_tree_t *root,
- reg_errcode_t (fn (void *, bin_tree_t *)),
- void *extra);
-static reg_errcode_t optimize_subexps (void *extra, bin_tree_t *node);
-static reg_errcode_t lower_subexps (void *extra, bin_tree_t *node);
-static bin_tree_t *lower_subexp (reg_errcode_t *err, regex_t *preg,
- bin_tree_t *node);
-static reg_errcode_t calc_first (void *extra, bin_tree_t *node);
-static reg_errcode_t calc_next (void *extra, bin_tree_t *node);
-static reg_errcode_t link_nfa_nodes (void *extra, bin_tree_t *node);
-static Idx duplicate_node (re_dfa_t *dfa, Idx org_idx, unsigned int constraint);
-static Idx search_duplicated_node (const re_dfa_t *dfa, Idx org_node,
- unsigned int constraint);
-static reg_errcode_t calc_eclosure (re_dfa_t *dfa);
-static reg_errcode_t calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa,
- Idx node, bool root);
-static reg_errcode_t calc_inveclosure (re_dfa_t *dfa);
-static Idx fetch_number (re_string_t *input, re_token_t *token,
- reg_syntax_t syntax);
-static int peek_token (re_token_t *token, re_string_t *input,
- reg_syntax_t syntax);
-static bin_tree_t *parse (re_string_t *regexp, regex_t *preg,
- reg_syntax_t syntax, reg_errcode_t *err);
-static bin_tree_t *parse_reg_exp (re_string_t *regexp, regex_t *preg,
- re_token_t *token, reg_syntax_t syntax,
- Idx nest, reg_errcode_t *err);
-static bin_tree_t *parse_branch (re_string_t *regexp, regex_t *preg,
- re_token_t *token, reg_syntax_t syntax,
- Idx nest, reg_errcode_t *err);
-static bin_tree_t *parse_expression (re_string_t *regexp, regex_t *preg,
- re_token_t *token, reg_syntax_t syntax,
- Idx nest, reg_errcode_t *err);
-static bin_tree_t *parse_sub_exp (re_string_t *regexp, regex_t *preg,
- re_token_t *token, reg_syntax_t syntax,
- Idx nest, reg_errcode_t *err);
-static bin_tree_t *parse_dup_op (bin_tree_t *dup_elem, re_string_t *regexp,
- re_dfa_t *dfa, re_token_t *token,
- reg_syntax_t syntax, reg_errcode_t *err);
-static bin_tree_t *parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa,
- re_token_t *token, reg_syntax_t syntax,
- reg_errcode_t *err);
-static reg_errcode_t parse_bracket_element (bracket_elem_t *elem,
- re_string_t *regexp,
- re_token_t *token, int token_len,
- re_dfa_t *dfa,
- reg_syntax_t syntax,
- bool accept_hyphen);
-static reg_errcode_t parse_bracket_symbol (bracket_elem_t *elem,
- re_string_t *regexp,
- re_token_t *token);
-static reg_errcode_t build_equiv_class (bitset_t sbcset,
- re_charset_t *mbcset,
- Idx *equiv_class_alloc,
- const unsigned char *name);
-static reg_errcode_t build_charclass (RE_TRANSLATE_TYPE trans,
- bitset_t sbcset,
- re_charset_t *mbcset,
- Idx *char_class_alloc,
- const char *class_name,
- reg_syntax_t syntax);
-static bin_tree_t *build_charclass_op (re_dfa_t *dfa,
- RE_TRANSLATE_TYPE trans,
- const char *class_name,
- const char *extra,
- bool non_match, reg_errcode_t *err);
-static bin_tree_t *create_tree (re_dfa_t *dfa,
- bin_tree_t *left, bin_tree_t *right,
- re_token_type_t type);
-static bin_tree_t *create_token_tree (re_dfa_t *dfa,
- bin_tree_t *left, bin_tree_t *right,
- const re_token_t *token);
-static bin_tree_t *duplicate_tree (const bin_tree_t *src, re_dfa_t *dfa);
-static void free_token (re_token_t *node);
-static reg_errcode_t free_tree (void *extra, bin_tree_t *node);
-static reg_errcode_t mark_opt_subexp (void *extra, bin_tree_t *node);
-
-/* This table gives an error message for each of the error codes listed
- in regex.h. Obviously the order here has to be same as there.
- POSIX doesn't require that we do anything for REG_NOERROR,
- but why not be nice? */
-
-static const char __re_error_msgid[] =
- {
-#define REG_NOERROR_IDX 0
- gettext_noop ("Success") /* REG_NOERROR */
- "\0"
-#define REG_NOMATCH_IDX (REG_NOERROR_IDX + sizeof "Success")
- gettext_noop ("No match") /* REG_NOMATCH */
- "\0"
-#define REG_BADPAT_IDX (REG_NOMATCH_IDX + sizeof "No match")
- gettext_noop ("Invalid regular expression") /* REG_BADPAT */
- "\0"
-#define REG_ECOLLATE_IDX (REG_BADPAT_IDX + sizeof "Invalid regular expression")
- gettext_noop ("Invalid collation character") /* REG_ECOLLATE */
- "\0"
-#define REG_ECTYPE_IDX (REG_ECOLLATE_IDX + sizeof "Invalid collation character")
- gettext_noop ("Invalid character class name") /* REG_ECTYPE */
- "\0"
-#define REG_EESCAPE_IDX (REG_ECTYPE_IDX + sizeof "Invalid character class name")
- gettext_noop ("Trailing backslash") /* REG_EESCAPE */
- "\0"
-#define REG_ESUBREG_IDX (REG_EESCAPE_IDX + sizeof "Trailing backslash")
- gettext_noop ("Invalid back reference") /* REG_ESUBREG */
- "\0"
-#define REG_EBRACK_IDX (REG_ESUBREG_IDX + sizeof "Invalid back reference")
- gettext_noop ("Unmatched [, [^, [:, [., or [=") /* REG_EBRACK */
- "\0"
-#define REG_EPAREN_IDX (REG_EBRACK_IDX + sizeof "Unmatched [, [^, [:, [., or [=")
- gettext_noop ("Unmatched ( or \\(") /* REG_EPAREN */
- "\0"
-#define REG_EBRACE_IDX (REG_EPAREN_IDX + sizeof "Unmatched ( or \\(")
- gettext_noop ("Unmatched \\{") /* REG_EBRACE */
- "\0"
-#define REG_BADBR_IDX (REG_EBRACE_IDX + sizeof "Unmatched \\{")
- gettext_noop ("Invalid content of \\{\\}") /* REG_BADBR */
- "\0"
-#define REG_ERANGE_IDX (REG_BADBR_IDX + sizeof "Invalid content of \\{\\}")
- gettext_noop ("Invalid range end") /* REG_ERANGE */
- "\0"
-#define REG_ESPACE_IDX (REG_ERANGE_IDX + sizeof "Invalid range end")
- gettext_noop ("Memory exhausted") /* REG_ESPACE */
- "\0"
-#define REG_BADRPT_IDX (REG_ESPACE_IDX + sizeof "Memory exhausted")
- gettext_noop ("Invalid preceding regular expression") /* REG_BADRPT */
- "\0"
-#define REG_EEND_IDX (REG_BADRPT_IDX + sizeof "Invalid preceding regular expression")
- gettext_noop ("Premature end of regular expression") /* REG_EEND */
- "\0"
-#define REG_ESIZE_IDX (REG_EEND_IDX + sizeof "Premature end of regular expression")
- gettext_noop ("Regular expression too big") /* REG_ESIZE */
- "\0"
-#define REG_ERPAREN_IDX (REG_ESIZE_IDX + sizeof "Regular expression too big")
- gettext_noop ("Unmatched ) or \\)") /* REG_ERPAREN */
- };
-
-static const size_t __re_error_msgid_idx[] =
- {
- REG_NOERROR_IDX,
- REG_NOMATCH_IDX,
- REG_BADPAT_IDX,
- REG_ECOLLATE_IDX,
- REG_ECTYPE_IDX,
- REG_EESCAPE_IDX,
- REG_ESUBREG_IDX,
- REG_EBRACK_IDX,
- REG_EPAREN_IDX,
- REG_EBRACE_IDX,
- REG_BADBR_IDX,
- REG_ERANGE_IDX,
- REG_ESPACE_IDX,
- REG_BADRPT_IDX,
- REG_EEND_IDX,
- REG_ESIZE_IDX,
- REG_ERPAREN_IDX
- };
-
-/* Entry points for GNU code. */
-
-/* re_compile_pattern is the GNU regular expression compiler: it
- compiles PATTERN (of length LENGTH) and puts the result in BUFP.
- Returns 0 if the pattern was valid, otherwise an error string.
-
- Assumes the 'allocated' (and perhaps 'buffer') and 'translate' fields
- are set in BUFP on entry. */
-
-const char *
-re_compile_pattern (const char *pattern, size_t length,
- struct re_pattern_buffer *bufp)
-{
- reg_errcode_t ret;
-
- /* And GNU code determines whether or not to get register information
- by passing null for the REGS argument to re_match, etc., not by
- setting no_sub, unless RE_NO_SUB is set. */
- bufp->no_sub = !!(re_syntax_options & RE_NO_SUB);
-
- /* Match anchors at newline. */
- bufp->newline_anchor = 1;
-
- ret = re_compile_internal (bufp, pattern, length, re_syntax_options);
-
- if (!ret)
- return NULL;
- return gettext (__re_error_msgid + __re_error_msgid_idx[(int) ret]);
-}
-weak_alias (__re_compile_pattern, re_compile_pattern)
-
-/* Set by 're_set_syntax' to the current regexp syntax to recognize. Can
- also be assigned to arbitrarily: each pattern buffer stores its own
- syntax, so it can be changed between regex compilations. */
-/* This has no initializer because initialized variables in Emacs
- become read-only after dumping. */
-reg_syntax_t re_syntax_options;
-
-
-/* Specify the precise syntax of regexps for compilation. This provides
- for compatibility for various utilities which historically have
- different, incompatible syntaxes.
-
- The argument SYNTAX is a bit mask comprised of the various bits
- defined in regex.h. We return the old syntax. */
-
-reg_syntax_t
-re_set_syntax (reg_syntax_t syntax)
-{
- reg_syntax_t ret = re_syntax_options;
-
- re_syntax_options = syntax;
- return ret;
-}
-weak_alias (__re_set_syntax, re_set_syntax)
-
-int
-re_compile_fastmap (struct re_pattern_buffer *bufp)
-{
- re_dfa_t *dfa = bufp->buffer;
- char *fastmap = bufp->fastmap;
-
- memset (fastmap, '\0', sizeof (char) * SBC_MAX);
- re_compile_fastmap_iter (bufp, dfa->init_state, fastmap);
- if (dfa->init_state != dfa->init_state_word)
- re_compile_fastmap_iter (bufp, dfa->init_state_word, fastmap);
- if (dfa->init_state != dfa->init_state_nl)
- re_compile_fastmap_iter (bufp, dfa->init_state_nl, fastmap);
- if (dfa->init_state != dfa->init_state_begbuf)
- re_compile_fastmap_iter (bufp, dfa->init_state_begbuf, fastmap);
- bufp->fastmap_accurate = 1;
- return 0;
-}
-weak_alias (__re_compile_fastmap, re_compile_fastmap)
-
-static __always_inline void
-re_set_fastmap (char *fastmap, bool icase, int ch)
-{
- fastmap[ch] = 1;
- if (icase)
- fastmap[tolower (ch)] = 1;
-}
-
-/* Helper function for re_compile_fastmap.
- Compile fastmap for the initial_state INIT_STATE. */
-
-static void
-re_compile_fastmap_iter (regex_t *bufp, const re_dfastate_t *init_state,
- char *fastmap)
-{
- re_dfa_t *dfa = bufp->buffer;
- Idx node_cnt;
- bool icase = (dfa->mb_cur_max == 1 && (bufp->syntax & RE_ICASE));
- for (node_cnt = 0; node_cnt < init_state->nodes.nelem; ++node_cnt)
- {
- Idx node = init_state->nodes.elems[node_cnt];
- re_token_type_t type = dfa->nodes[node].type;
-
- if (type == CHARACTER)
- {
- re_set_fastmap (fastmap, icase, dfa->nodes[node].opr.c);
- if ((bufp->syntax & RE_ICASE) && dfa->mb_cur_max > 1)
- {
- unsigned char buf[MB_LEN_MAX];
- unsigned char *p;
- wchar_t wc;
- mbstate_t state;
-
- p = buf;
- *p++ = dfa->nodes[node].opr.c;
- while (++node < dfa->nodes_len
- && dfa->nodes[node].type == CHARACTER
- && dfa->nodes[node].mb_partial)
- *p++ = dfa->nodes[node].opr.c;
- memset (&state, '\0', sizeof (state));
- if (__mbrtowc (&wc, (const char *) buf, p - buf,
- &state) == p - buf
- && (__wcrtomb ((char *) buf, __towlower (wc), &state)
- != (size_t) -1))
- re_set_fastmap (fastmap, false, buf[0]);
- }
- }
- else if (type == SIMPLE_BRACKET)
- {
- int i, ch;
- for (i = 0, ch = 0; i < BITSET_WORDS; ++i)
- {
- int j;
- bitset_word_t w = dfa->nodes[node].opr.sbcset[i];
- for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch)
- if (w & ((bitset_word_t) 1 << j))
- re_set_fastmap (fastmap, icase, ch);
- }
- }
- else if (type == COMPLEX_BRACKET)
- {
- re_charset_t *cset = dfa->nodes[node].opr.mbcset;
- Idx i;
-
-#ifdef _LIBC
- /* See if we have to try all bytes which start multiple collation
- elements.
- e.g. In da_DK, we want to catch 'a' since "aa" is a valid
- collation element, and don't catch 'b' since 'b' is
- the only collation element which starts from 'b' (and
- it is caught by SIMPLE_BRACKET). */
- if (_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES) != 0
- && (cset->ncoll_syms || cset->nranges))
- {
- const int32_t *table = (const int32_t *)
- _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
- for (i = 0; i < SBC_MAX; ++i)
- if (table[i] < 0)
- re_set_fastmap (fastmap, icase, i);
- }
-#endif /* _LIBC */
-
- /* See if we have to start the match at all multibyte characters,
- i.e. where we would not find an invalid sequence. This only
- applies to multibyte character sets; for single byte character
- sets, the SIMPLE_BRACKET again suffices. */
- if (dfa->mb_cur_max > 1
- && (cset->nchar_classes || cset->non_match || cset->nranges
-#ifdef _LIBC
- || cset->nequiv_classes
-#endif /* _LIBC */
- ))
- {
- unsigned char c = 0;
- do
- {
- mbstate_t mbs;
- memset (&mbs, 0, sizeof (mbs));
- if (__mbrtowc (NULL, (char *) &c, 1, &mbs) == (size_t) -2)
- re_set_fastmap (fastmap, false, (int) c);
- }
- while (++c != 0);
- }
-
- else
- {
- /* ... Else catch all bytes which can start the mbchars. */
- for (i = 0; i < cset->nmbchars; ++i)
- {
- char buf[256];
- mbstate_t state;
- memset (&state, '\0', sizeof (state));
- if (__wcrtomb (buf, cset->mbchars[i], &state) != (size_t) -1)
- re_set_fastmap (fastmap, icase, *(unsigned char *) buf);
- if ((bufp->syntax & RE_ICASE) && dfa->mb_cur_max > 1)
- {
- if (__wcrtomb (buf, __towlower (cset->mbchars[i]), &state)
- != (size_t) -1)
- re_set_fastmap (fastmap, false, *(unsigned char *) buf);
- }
- }
- }
- }
- else if (type == OP_PERIOD || type == OP_UTF8_PERIOD || type == END_OF_RE)
- {
- memset (fastmap, '\1', sizeof (char) * SBC_MAX);
- if (type == END_OF_RE)
- bufp->can_be_null = 1;
- return;
- }
- }
-}
-
-/* Entry point for POSIX code. */
-/* regcomp takes a regular expression as a string and compiles it.
-
- PREG is a regex_t *. We do not expect any fields to be initialized,
- since POSIX says we shouldn't. Thus, we set
-
- 'buffer' to the compiled pattern;
- 'used' to the length of the compiled pattern;
- 'syntax' to RE_SYNTAX_POSIX_EXTENDED if the
- REG_EXTENDED bit in CFLAGS is set; otherwise, to
- RE_SYNTAX_POSIX_BASIC;
- 'newline_anchor' to REG_NEWLINE being set in CFLAGS;
- 'fastmap' to an allocated space for the fastmap;
- 'fastmap_accurate' to zero;
- 're_nsub' to the number of subexpressions in PATTERN.
-
- PATTERN is the address of the pattern string.
-
- CFLAGS is a series of bits which affect compilation.
-
- If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we
- use POSIX basic syntax.
-
- If REG_NEWLINE is set, then . and [^...] don't match newline.
- Also, regexec will try a match beginning after every newline.
-
- If REG_ICASE is set, then we considers upper- and lowercase
- versions of letters to be equivalent when matching.
-
- If REG_NOSUB is set, then when PREG is passed to regexec, that
- routine will report only success or failure, and nothing about the
- registers.
-
- It returns 0 if it succeeds, nonzero if it doesn't. (See regex.h for
- the return codes and their meanings.) */
-
-int
-regcomp (regex_t *__restrict preg, const char *__restrict pattern, int cflags)
-{
- reg_errcode_t ret;
- reg_syntax_t syntax = ((cflags & REG_EXTENDED) ? RE_SYNTAX_POSIX_EXTENDED
- : RE_SYNTAX_POSIX_BASIC);
-
- preg->buffer = NULL;
- preg->allocated = 0;
- preg->used = 0;
-
- /* Try to allocate space for the fastmap. */
- preg->fastmap = re_malloc (char, SBC_MAX);
- if (__glibc_unlikely (preg->fastmap == NULL))
- return REG_ESPACE;
-
- syntax |= (cflags & REG_ICASE) ? RE_ICASE : 0;
-
- /* If REG_NEWLINE is set, newlines are treated differently. */
- if (cflags & REG_NEWLINE)
- { /* REG_NEWLINE implies neither . nor [^...] match newline. */
- syntax &= ~RE_DOT_NEWLINE;
- syntax |= RE_HAT_LISTS_NOT_NEWLINE;
- /* It also changes the matching behavior. */
- preg->newline_anchor = 1;
- }
- else
- preg->newline_anchor = 0;
- preg->no_sub = !!(cflags & REG_NOSUB);
- preg->translate = NULL;
-
- ret = re_compile_internal (preg, pattern, strlen (pattern), syntax);
-
- /* POSIX doesn't distinguish between an unmatched open-group and an
- unmatched close-group: both are REG_EPAREN. */
- if (ret == REG_ERPAREN)
- ret = REG_EPAREN;
-
- /* We have already checked preg->fastmap != NULL. */
- if (__glibc_likely (ret == REG_NOERROR))
- /* Compute the fastmap now, since regexec cannot modify the pattern
- buffer. This function never fails in this implementation. */
- (void) re_compile_fastmap (preg);
- else
- {
- /* Some error occurred while compiling the expression. */
- re_free (preg->fastmap);
- preg->fastmap = NULL;
- }
-
- return (int) ret;
-}
-libc_hidden_def (__regcomp)
-weak_alias (__regcomp, regcomp)
-
-/* Returns a message corresponding to an error code, ERRCODE, returned
- from either regcomp or regexec. We don't use PREG here. */
-
-size_t
-regerror (int errcode, const regex_t *__restrict preg, char *__restrict errbuf,
- size_t errbuf_size)
-{
- const char *msg;
- size_t msg_size;
- int nerrcodes = sizeof __re_error_msgid_idx / sizeof __re_error_msgid_idx[0];
-
- if (__glibc_unlikely (errcode < 0 || errcode >= nerrcodes))
- /* Only error codes returned by the rest of the code should be passed
- to this routine. If we are given anything else, or if other regex
- code generates an invalid error code, then the program has a bug.
- Dump core so we can fix it. */
- abort ();
-
- msg = gettext (__re_error_msgid + __re_error_msgid_idx[errcode]);
-
- msg_size = strlen (msg) + 1; /* Includes the null. */
-
- if (__glibc_likely (errbuf_size != 0))
- {
- size_t cpy_size = msg_size;
- if (__glibc_unlikely (msg_size > errbuf_size))
- {
- cpy_size = errbuf_size - 1;
- errbuf[cpy_size] = '\0';
- }
- memcpy (errbuf, msg, cpy_size);
- }
-
- return msg_size;
-}
-weak_alias (__regerror, regerror)
-
-
-/* This static array is used for the map to single-byte characters when
- UTF-8 is used. Otherwise we would allocate memory just to initialize
- it the same all the time. UTF-8 is the preferred encoding so this is
- a worthwhile optimization. */
-static const bitset_t utf8_sb_map =
-{
- /* Set the first 128 bits. */
-#if (defined __GNUC__ || __clang_major__ >= 4) && !defined __STRICT_ANSI__
- [0 ... 0x80 / BITSET_WORD_BITS - 1] = BITSET_WORD_MAX
-#else
-# if 4 * BITSET_WORD_BITS < ASCII_CHARS
-# error "bitset_word_t is narrower than 32 bits"
-# elif 3 * BITSET_WORD_BITS < ASCII_CHARS
- BITSET_WORD_MAX, BITSET_WORD_MAX, BITSET_WORD_MAX,
-# elif 2 * BITSET_WORD_BITS < ASCII_CHARS
- BITSET_WORD_MAX, BITSET_WORD_MAX,
-# elif 1 * BITSET_WORD_BITS < ASCII_CHARS
- BITSET_WORD_MAX,
-# endif
- (BITSET_WORD_MAX
- >> (SBC_MAX % BITSET_WORD_BITS == 0
- ? 0
- : BITSET_WORD_BITS - SBC_MAX % BITSET_WORD_BITS))
-#endif
-};
-
-
-static void
-free_dfa_content (re_dfa_t *dfa)
-{
- Idx i, j;
-
- if (dfa->nodes)
- for (i = 0; i < dfa->nodes_len; ++i)
- free_token (dfa->nodes + i);
- re_free (dfa->nexts);
- for (i = 0; i < dfa->nodes_len; ++i)
- {
- if (dfa->eclosures != NULL)
- re_node_set_free (dfa->eclosures + i);
- if (dfa->inveclosures != NULL)
- re_node_set_free (dfa->inveclosures + i);
- if (dfa->edests != NULL)
- re_node_set_free (dfa->edests + i);
- }
- re_free (dfa->edests);
- re_free (dfa->eclosures);
- re_free (dfa->inveclosures);
- re_free (dfa->nodes);
-
- if (dfa->state_table)
- for (i = 0; i <= dfa->state_hash_mask; ++i)
- {
- struct re_state_table_entry *entry = dfa->state_table + i;
- for (j = 0; j < entry->num; ++j)
- {
- re_dfastate_t *state = entry->array[j];
- free_state (state);
- }
- re_free (entry->array);
- }
- re_free (dfa->state_table);
- if (dfa->sb_char != utf8_sb_map)
- re_free (dfa->sb_char);
- re_free (dfa->subexp_map);
-#ifdef DEBUG
- re_free (dfa->re_str);
-#endif
-
- re_free (dfa);
-}
-
-
-/* Free dynamically allocated space used by PREG. */
-
-void
-regfree (regex_t *preg)
-{
- re_dfa_t *dfa = preg->buffer;
- if (__glibc_likely (dfa != NULL))
- {
- lock_fini (dfa->lock);
- free_dfa_content (dfa);
- }
- preg->buffer = NULL;
- preg->allocated = 0;
-
- re_free (preg->fastmap);
- preg->fastmap = NULL;
-
- re_free (preg->translate);
- preg->translate = NULL;
-}
-libc_hidden_def (__regfree)
-weak_alias (__regfree, regfree)
-
-/* Entry points compatible with 4.2 BSD regex library. We don't define
- them unless specifically requested. */
-
-#if defined _REGEX_RE_COMP || defined _LIBC
-
-/* BSD has one and only one pattern buffer. */
-static struct re_pattern_buffer re_comp_buf;
-
-char *
-# ifdef _LIBC
-/* Make these definitions weak in libc, so POSIX programs can redefine
- these names if they don't use our functions, and still use
- regcomp/regexec above without link errors. */
-weak_function
-# endif
-re_comp (const char *s)
-{
- reg_errcode_t ret;
- char *fastmap;
-
- if (!s)
- {
- if (!re_comp_buf.buffer)
- return gettext ("No previous regular expression");
- return 0;
- }
-
- if (re_comp_buf.buffer)
- {
- fastmap = re_comp_buf.fastmap;
- re_comp_buf.fastmap = NULL;
- __regfree (&re_comp_buf);
- memset (&re_comp_buf, '\0', sizeof (re_comp_buf));
- re_comp_buf.fastmap = fastmap;
- }
-
- if (re_comp_buf.fastmap == NULL)
- {
- re_comp_buf.fastmap = re_malloc (char, SBC_MAX);
- if (re_comp_buf.fastmap == NULL)
- return (char *) gettext (__re_error_msgid
- + __re_error_msgid_idx[(int) REG_ESPACE]);
- }
-
- /* Since 're_exec' always passes NULL for the 'regs' argument, we
- don't need to initialize the pattern buffer fields which affect it. */
-
- /* Match anchors at newlines. */
- re_comp_buf.newline_anchor = 1;
-
- ret = re_compile_internal (&re_comp_buf, s, strlen (s), re_syntax_options);
-
- if (!ret)
- return NULL;
-
- /* Yes, we're discarding 'const' here if !HAVE_LIBINTL. */
- return (char *) gettext (__re_error_msgid + __re_error_msgid_idx[(int) ret]);
-}
-
-#ifdef _LIBC
-libc_freeres_fn (free_mem)
-{
- __regfree (&re_comp_buf);
-}
-#endif
-
-#endif /* _REGEX_RE_COMP */
-
-/* Internal entry point.
- Compile the regular expression PATTERN, whose length is LENGTH.
- SYNTAX indicate regular expression's syntax. */
-
-static reg_errcode_t
-re_compile_internal (regex_t *preg, const char * pattern, size_t length,
- reg_syntax_t syntax)
-{
- reg_errcode_t err = REG_NOERROR;
- re_dfa_t *dfa;
- re_string_t regexp;
-
- /* Initialize the pattern buffer. */
- preg->fastmap_accurate = 0;
- preg->syntax = syntax;
- preg->not_bol = preg->not_eol = 0;
- preg->used = 0;
- preg->re_nsub = 0;
- preg->can_be_null = 0;
- preg->regs_allocated = REGS_UNALLOCATED;
-
- /* Initialize the dfa. */
- dfa = preg->buffer;
- if (__glibc_unlikely (preg->allocated < sizeof (re_dfa_t)))
- {
- /* If zero allocated, but buffer is non-null, try to realloc
- enough space. This loses if buffer's address is bogus, but
- that is the user's responsibility. If ->buffer is NULL this
- is a simple allocation. */
- dfa = re_realloc (preg->buffer, re_dfa_t, 1);
- if (dfa == NULL)
- return REG_ESPACE;
- preg->allocated = sizeof (re_dfa_t);
- preg->buffer = dfa;
- }
- preg->used = sizeof (re_dfa_t);
-
- err = init_dfa (dfa, length);
- if (__glibc_unlikely (err == REG_NOERROR && lock_init (dfa->lock) != 0))
- err = REG_ESPACE;
- if (__glibc_unlikely (err != REG_NOERROR))
- {
- free_dfa_content (dfa);
- preg->buffer = NULL;
- preg->allocated = 0;
- return err;
- }
-#ifdef DEBUG
- /* Note: length+1 will not overflow since it is checked in init_dfa. */
- dfa->re_str = re_malloc (char, length + 1);
- strncpy (dfa->re_str, pattern, length + 1);
-#endif
-
- err = re_string_construct (&regexp, pattern, length, preg->translate,
- (syntax & RE_ICASE) != 0, dfa);
- if (__glibc_unlikely (err != REG_NOERROR))
- {
- re_compile_internal_free_return:
- free_workarea_compile (preg);
- re_string_destruct (&regexp);
- lock_fini (dfa->lock);
- free_dfa_content (dfa);
- preg->buffer = NULL;
- preg->allocated = 0;
- return err;
- }
-
- /* Parse the regular expression, and build a structure tree. */
- preg->re_nsub = 0;
- dfa->str_tree = parse (&regexp, preg, syntax, &err);
- if (__glibc_unlikely (dfa->str_tree == NULL))
- goto re_compile_internal_free_return;
-
- /* Analyze the tree and create the nfa. */
- err = analyze (preg);
- if (__glibc_unlikely (err != REG_NOERROR))
- goto re_compile_internal_free_return;
-
- /* If possible, do searching in single byte encoding to speed things up. */
- if (dfa->is_utf8 && !(syntax & RE_ICASE) && preg->translate == NULL)
- optimize_utf8 (dfa);
-
- /* Then create the initial state of the dfa. */
- err = create_initial_state (dfa);
-
- /* Release work areas. */
- free_workarea_compile (preg);
- re_string_destruct (&regexp);
-
- if (__glibc_unlikely (err != REG_NOERROR))
- {
- lock_fini (dfa->lock);
- free_dfa_content (dfa);
- preg->buffer = NULL;
- preg->allocated = 0;
- }
-
- return err;
-}
-
-/* Initialize DFA. We use the length of the regular expression PAT_LEN
- as the initial length of some arrays. */
-
-static reg_errcode_t
-init_dfa (re_dfa_t *dfa, size_t pat_len)
-{
- __re_size_t table_size;
-#ifndef _LIBC
- const char *codeset_name;
-#endif
- size_t max_i18n_object_size = MAX (sizeof (wchar_t), sizeof (wctype_t));
- size_t max_object_size =
- MAX (sizeof (struct re_state_table_entry),
- MAX (sizeof (re_token_t),
- MAX (sizeof (re_node_set),
- MAX (sizeof (regmatch_t),
- max_i18n_object_size))));
-
- memset (dfa, '\0', sizeof (re_dfa_t));
-
- /* Force allocation of str_tree_storage the first time. */
- dfa->str_tree_storage_idx = BIN_TREE_STORAGE_SIZE;
-
- /* Avoid overflows. The extra "/ 2" is for the table_size doubling
- calculation below, and for similar doubling calculations
- elsewhere. And it's <= rather than <, because some of the
- doubling calculations add 1 afterwards. */
- if (__glibc_unlikely (MIN (IDX_MAX, SIZE_MAX / max_object_size) / 2
- <= pat_len))
- return REG_ESPACE;
-
- dfa->nodes_alloc = pat_len + 1;
- dfa->nodes = re_malloc (re_token_t, dfa->nodes_alloc);
-
- /* table_size = 2 ^ ceil(log pat_len) */
- for (table_size = 1; ; table_size <<= 1)
- if (table_size > pat_len)
- break;
-
- dfa->state_table = calloc (sizeof (struct re_state_table_entry), table_size);
- dfa->state_hash_mask = table_size - 1;
-
- dfa->mb_cur_max = MB_CUR_MAX;
-#ifdef _LIBC
- if (dfa->mb_cur_max == 6
- && strcmp (_NL_CURRENT (LC_CTYPE, _NL_CTYPE_CODESET_NAME), "UTF-8") == 0)
- dfa->is_utf8 = 1;
- dfa->map_notascii = (_NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MAP_TO_NONASCII)
- != 0);
-#else
- codeset_name = nl_langinfo (CODESET);
- if ((codeset_name[0] == 'U' || codeset_name[0] == 'u')
- && (codeset_name[1] == 'T' || codeset_name[1] == 't')
- && (codeset_name[2] == 'F' || codeset_name[2] == 'f')
- && strcmp (codeset_name + 3 + (codeset_name[3] == '-'), "8") == 0)
- dfa->is_utf8 = 1;
-
- /* We check exhaustively in the loop below if this charset is a
- superset of ASCII. */
- dfa->map_notascii = 0;
-#endif
-
- if (dfa->mb_cur_max > 1)
- {
- if (dfa->is_utf8)
- dfa->sb_char = (re_bitset_ptr_t) utf8_sb_map;
- else
- {
- int i, j, ch;
-
- dfa->sb_char = (re_bitset_ptr_t) calloc (sizeof (bitset_t), 1);
- if (__glibc_unlikely (dfa->sb_char == NULL))
- return REG_ESPACE;
-
- /* Set the bits corresponding to single byte chars. */
- for (i = 0, ch = 0; i < BITSET_WORDS; ++i)
- for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch)
- {
- wint_t wch = __btowc (ch);
- if (wch != WEOF)
- dfa->sb_char[i] |= (bitset_word_t) 1 << j;
-#ifndef _LIBC
- if (isascii (ch) && wch != ch)
- dfa->map_notascii = 1;
-#endif
- }
- }
- }
-
- if (__glibc_unlikely (dfa->nodes == NULL || dfa->state_table == NULL))
- return REG_ESPACE;
- return REG_NOERROR;
-}
-
-/* Initialize WORD_CHAR table, which indicate which character is
- "word". In this case "word" means that it is the word construction
- character used by some operators like "\<", "\>", etc. */
-
-static void
-init_word_char (re_dfa_t *dfa)
-{
- int i = 0;
- int j;
- int ch = 0;
- dfa->word_ops_used = 1;
- if (__glibc_likely (dfa->map_notascii == 0))
- {
- bitset_word_t bits0 = 0x00000000;
- bitset_word_t bits1 = 0x03ff0000;
- bitset_word_t bits2 = 0x87fffffe;
- bitset_word_t bits3 = 0x07fffffe;
- if (BITSET_WORD_BITS == 64)
- {
- /* Pacify gcc -Woverflow on 32-bit platformns. */
- dfa->word_char[0] = bits1 << 31 << 1 | bits0;
- dfa->word_char[1] = bits3 << 31 << 1 | bits2;
- i = 2;
- }
- else if (BITSET_WORD_BITS == 32)
- {
- dfa->word_char[0] = bits0;
- dfa->word_char[1] = bits1;
- dfa->word_char[2] = bits2;
- dfa->word_char[3] = bits3;
- i = 4;
- }
- else
- goto general_case;
- ch = 128;
-
- if (__glibc_likely (dfa->is_utf8))
- {
- memset (&dfa->word_char[i], '\0', (SBC_MAX - ch) / 8);
- return;
- }
- }
-
- general_case:
- for (; i < BITSET_WORDS; ++i)
- for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch)
- if (isalnum (ch) || ch == '_')
- dfa->word_char[i] |= (bitset_word_t) 1 << j;
-}
-
-/* Free the work area which are only used while compiling. */
-
-static void
-free_workarea_compile (regex_t *preg)
-{
- re_dfa_t *dfa = preg->buffer;
- bin_tree_storage_t *storage, *next;
- for (storage = dfa->str_tree_storage; storage; storage = next)
- {
- next = storage->next;
- re_free (storage);
- }
- dfa->str_tree_storage = NULL;
- dfa->str_tree_storage_idx = BIN_TREE_STORAGE_SIZE;
- dfa->str_tree = NULL;
- re_free (dfa->org_indices);
- dfa->org_indices = NULL;
-}
-
-/* Create initial states for all contexts. */
-
-static reg_errcode_t
-create_initial_state (re_dfa_t *dfa)
-{
- Idx first, i;
- reg_errcode_t err;
- re_node_set init_nodes;
-
- /* Initial states have the epsilon closure of the node which is
- the first node of the regular expression. */
- first = dfa->str_tree->first->node_idx;
- dfa->init_node = first;
- err = re_node_set_init_copy (&init_nodes, dfa->eclosures + first);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
-
- /* The back-references which are in initial states can epsilon transit,
- since in this case all of the subexpressions can be null.
- Then we add epsilon closures of the nodes which are the next nodes of
- the back-references. */
- if (dfa->nbackref > 0)
- for (i = 0; i < init_nodes.nelem; ++i)
- {
- Idx node_idx = init_nodes.elems[i];
- re_token_type_t type = dfa->nodes[node_idx].type;
-
- Idx clexp_idx;
- if (type != OP_BACK_REF)
- continue;
- for (clexp_idx = 0; clexp_idx < init_nodes.nelem; ++clexp_idx)
- {
- re_token_t *clexp_node;
- clexp_node = dfa->nodes + init_nodes.elems[clexp_idx];
- if (clexp_node->type == OP_CLOSE_SUBEXP
- && clexp_node->opr.idx == dfa->nodes[node_idx].opr.idx)
- break;
- }
- if (clexp_idx == init_nodes.nelem)
- continue;
-
- if (type == OP_BACK_REF)
- {
- Idx dest_idx = dfa->edests[node_idx].elems[0];
- if (!re_node_set_contains (&init_nodes, dest_idx))
- {
- reg_errcode_t merge_err
- = re_node_set_merge (&init_nodes, dfa->eclosures + dest_idx);
- if (merge_err != REG_NOERROR)
- return merge_err;
- i = 0;
- }
- }
- }
-
- /* It must be the first time to invoke acquire_state. */
- dfa->init_state = re_acquire_state_context (&err, dfa, &init_nodes, 0);
- /* We don't check ERR here, since the initial state must not be NULL. */
- if (__glibc_unlikely (dfa->init_state == NULL))
- return err;
- if (dfa->init_state->has_constraint)
- {
- dfa->init_state_word = re_acquire_state_context (&err, dfa, &init_nodes,
- CONTEXT_WORD);
- dfa->init_state_nl = re_acquire_state_context (&err, dfa, &init_nodes,
- CONTEXT_NEWLINE);
- dfa->init_state_begbuf = re_acquire_state_context (&err, dfa,
- &init_nodes,
- CONTEXT_NEWLINE
- | CONTEXT_BEGBUF);
- if (__glibc_unlikely (dfa->init_state_word == NULL
- || dfa->init_state_nl == NULL
- || dfa->init_state_begbuf == NULL))
- return err;
- }
- else
- dfa->init_state_word = dfa->init_state_nl
- = dfa->init_state_begbuf = dfa->init_state;
-
- re_node_set_free (&init_nodes);
- return REG_NOERROR;
-}
-
-/* If it is possible to do searching in single byte encoding instead of UTF-8
- to speed things up, set dfa->mb_cur_max to 1, clear is_utf8 and change
- DFA nodes where needed. */
-
-static void
-optimize_utf8 (re_dfa_t *dfa)
-{
- Idx node;
- int i;
- bool mb_chars = false;
- bool has_period = false;
-
- for (node = 0; node < dfa->nodes_len; ++node)
- switch (dfa->nodes[node].type)
- {
- case CHARACTER:
- if (dfa->nodes[node].opr.c >= ASCII_CHARS)
- mb_chars = true;
- break;
- case ANCHOR:
- switch (dfa->nodes[node].opr.ctx_type)
- {
- case LINE_FIRST:
- case LINE_LAST:
- case BUF_FIRST:
- case BUF_LAST:
- break;
- default:
- /* Word anchors etc. cannot be handled. It's okay to test
- opr.ctx_type since constraints (for all DFA nodes) are
- created by ORing one or more opr.ctx_type values. */
- return;
- }
- break;
- case OP_PERIOD:
- has_period = true;
- break;
- case OP_BACK_REF:
- case OP_ALT:
- case END_OF_RE:
- case OP_DUP_ASTERISK:
- case OP_OPEN_SUBEXP:
- case OP_CLOSE_SUBEXP:
- break;
- case COMPLEX_BRACKET:
- return;
- case SIMPLE_BRACKET:
- /* Just double check. */
- {
- int rshift = (ASCII_CHARS % BITSET_WORD_BITS == 0
- ? 0
- : BITSET_WORD_BITS - ASCII_CHARS % BITSET_WORD_BITS);
- for (i = ASCII_CHARS / BITSET_WORD_BITS; i < BITSET_WORDS; ++i)
- {
- if (dfa->nodes[node].opr.sbcset[i] >> rshift != 0)
- return;
- rshift = 0;
- }
- }
- break;
- default:
- abort ();
- }
-
- if (mb_chars || has_period)
- for (node = 0; node < dfa->nodes_len; ++node)
- {
- if (dfa->nodes[node].type == CHARACTER
- && dfa->nodes[node].opr.c >= ASCII_CHARS)
- dfa->nodes[node].mb_partial = 0;
- else if (dfa->nodes[node].type == OP_PERIOD)
- dfa->nodes[node].type = OP_UTF8_PERIOD;
- }
-
- /* The search can be in single byte locale. */
- dfa->mb_cur_max = 1;
- dfa->is_utf8 = 0;
- dfa->has_mb_node = dfa->nbackref > 0 || has_period;
-}
-
-/* Analyze the structure tree, and calculate "first", "next", "edest",
- "eclosure", and "inveclosure". */
-
-static reg_errcode_t
-analyze (regex_t *preg)
-{
- re_dfa_t *dfa = preg->buffer;
- reg_errcode_t ret;
-
- /* Allocate arrays. */
- dfa->nexts = re_malloc (Idx, dfa->nodes_alloc);
- dfa->org_indices = re_malloc (Idx, dfa->nodes_alloc);
- dfa->edests = re_malloc (re_node_set, dfa->nodes_alloc);
- dfa->eclosures = re_malloc (re_node_set, dfa->nodes_alloc);
- if (__glibc_unlikely (dfa->nexts == NULL || dfa->org_indices == NULL
- || dfa->edests == NULL || dfa->eclosures == NULL))
- return REG_ESPACE;
-
- dfa->subexp_map = re_malloc (Idx, preg->re_nsub);
- if (dfa->subexp_map != NULL)
- {
- Idx i;
- for (i = 0; i < preg->re_nsub; i++)
- dfa->subexp_map[i] = i;
- preorder (dfa->str_tree, optimize_subexps, dfa);
- for (i = 0; i < preg->re_nsub; i++)
- if (dfa->subexp_map[i] != i)
- break;
- if (i == preg->re_nsub)
- {
- re_free (dfa->subexp_map);
- dfa->subexp_map = NULL;
- }
- }
-
- ret = postorder (dfa->str_tree, lower_subexps, preg);
- if (__glibc_unlikely (ret != REG_NOERROR))
- return ret;
- ret = postorder (dfa->str_tree, calc_first, dfa);
- if (__glibc_unlikely (ret != REG_NOERROR))
- return ret;
- preorder (dfa->str_tree, calc_next, dfa);
- ret = preorder (dfa->str_tree, link_nfa_nodes, dfa);
- if (__glibc_unlikely (ret != REG_NOERROR))
- return ret;
- ret = calc_eclosure (dfa);
- if (__glibc_unlikely (ret != REG_NOERROR))
- return ret;
-
- /* We only need this during the prune_impossible_nodes pass in regexec.c;
- skip it if p_i_n will not run, as calc_inveclosure can be quadratic. */
- if ((!preg->no_sub && preg->re_nsub > 0 && dfa->has_plural_match)
- || dfa->nbackref)
- {
- dfa->inveclosures = re_malloc (re_node_set, dfa->nodes_len);
- if (__glibc_unlikely (dfa->inveclosures == NULL))
- return REG_ESPACE;
- ret = calc_inveclosure (dfa);
- }
-
- return ret;
-}
-
-/* Our parse trees are very unbalanced, so we cannot use a stack to
- implement parse tree visits. Instead, we use parent pointers and
- some hairy code in these two functions. */
-static reg_errcode_t
-postorder (bin_tree_t *root, reg_errcode_t (fn (void *, bin_tree_t *)),
- void *extra)
-{
- bin_tree_t *node, *prev;
-
- for (node = root; ; )
- {
- /* Descend down the tree, preferably to the left (or to the right
- if that's the only child). */
- while (node->left || node->right)
- if (node->left)
- node = node->left;
- else
- node = node->right;
-
- do
- {
- reg_errcode_t err = fn (extra, node);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- if (node->parent == NULL)
- return REG_NOERROR;
- prev = node;
- node = node->parent;
- }
- /* Go up while we have a node that is reached from the right. */
- while (node->right == prev || node->right == NULL);
- node = node->right;
- }
-}
-
-static reg_errcode_t
-preorder (bin_tree_t *root, reg_errcode_t (fn (void *, bin_tree_t *)),
- void *extra)
-{
- bin_tree_t *node;
-
- for (node = root; ; )
- {
- reg_errcode_t err = fn (extra, node);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
-
- /* Go to the left node, or up and to the right. */
- if (node->left)
- node = node->left;
- else
- {
- bin_tree_t *prev = NULL;
- while (node->right == prev || node->right == NULL)
- {
- prev = node;
- node = node->parent;
- if (!node)
- return REG_NOERROR;
- }
- node = node->right;
- }
- }
-}
-
-/* Optimization pass: if a SUBEXP is entirely contained, strip it and tell
- re_search_internal to map the inner one's opr.idx to this one's. Adjust
- backreferences as well. Requires a preorder visit. */
-static reg_errcode_t
-optimize_subexps (void *extra, bin_tree_t *node)
-{
- re_dfa_t *dfa = (re_dfa_t *) extra;
-
- if (node->token.type == OP_BACK_REF && dfa->subexp_map)
- {
- int idx = node->token.opr.idx;
- node->token.opr.idx = dfa->subexp_map[idx];
- dfa->used_bkref_map |= 1 << node->token.opr.idx;
- }
-
- else if (node->token.type == SUBEXP
- && node->left && node->left->token.type == SUBEXP)
- {
- Idx other_idx = node->left->token.opr.idx;
-
- node->left = node->left->left;
- if (node->left)
- node->left->parent = node;
-
- dfa->subexp_map[other_idx] = dfa->subexp_map[node->token.opr.idx];
- if (other_idx < BITSET_WORD_BITS)
- dfa->used_bkref_map &= ~((bitset_word_t) 1 << other_idx);
- }
-
- return REG_NOERROR;
-}
-
-/* Lowering pass: Turn each SUBEXP node into the appropriate concatenation
- of OP_OPEN_SUBEXP, the body of the SUBEXP (if any) and OP_CLOSE_SUBEXP. */
-static reg_errcode_t
-lower_subexps (void *extra, bin_tree_t *node)
-{
- regex_t *preg = (regex_t *) extra;
- reg_errcode_t err = REG_NOERROR;
-
- if (node->left && node->left->token.type == SUBEXP)
- {
- node->left = lower_subexp (&err, preg, node->left);
- if (node->left)
- node->left->parent = node;
- }
- if (node->right && node->right->token.type == SUBEXP)
- {
- node->right = lower_subexp (&err, preg, node->right);
- if (node->right)
- node->right->parent = node;
- }
-
- return err;
-}
-
-static bin_tree_t *
-lower_subexp (reg_errcode_t *err, regex_t *preg, bin_tree_t *node)
-{
- re_dfa_t *dfa = preg->buffer;
- bin_tree_t *body = node->left;
- bin_tree_t *op, *cls, *tree1, *tree;
-
- if (preg->no_sub
- /* We do not optimize empty subexpressions, because otherwise we may
- have bad CONCAT nodes with NULL children. This is obviously not
- very common, so we do not lose much. An example that triggers
- this case is the sed "script" /\(\)/x. */
- && node->left != NULL
- && (node->token.opr.idx >= BITSET_WORD_BITS
- || !(dfa->used_bkref_map
- & ((bitset_word_t) 1 << node->token.opr.idx))))
- return node->left;
-
- /* Convert the SUBEXP node to the concatenation of an
- OP_OPEN_SUBEXP, the contents, and an OP_CLOSE_SUBEXP. */
- op = create_tree (dfa, NULL, NULL, OP_OPEN_SUBEXP);
- cls = create_tree (dfa, NULL, NULL, OP_CLOSE_SUBEXP);
- tree1 = body ? create_tree (dfa, body, cls, CONCAT) : cls;
- tree = create_tree (dfa, op, tree1, CONCAT);
- if (__glibc_unlikely (tree == NULL || tree1 == NULL
- || op == NULL || cls == NULL))
- {
- *err = REG_ESPACE;
- return NULL;
- }
-
- op->token.opr.idx = cls->token.opr.idx = node->token.opr.idx;
- op->token.opt_subexp = cls->token.opt_subexp = node->token.opt_subexp;
- return tree;
-}
-
-/* Pass 1 in building the NFA: compute FIRST and create unlinked automaton
- nodes. Requires a postorder visit. */
-static reg_errcode_t
-calc_first (void *extra, bin_tree_t *node)
-{
- re_dfa_t *dfa = (re_dfa_t *) extra;
- if (node->token.type == CONCAT)
- {
- node->first = node->left->first;
- node->node_idx = node->left->node_idx;
- }
- else
- {
- node->first = node;
- node->node_idx = re_dfa_add_node (dfa, node->token);
- if (__glibc_unlikely (node->node_idx == -1))
- return REG_ESPACE;
- if (node->token.type == ANCHOR)
- dfa->nodes[node->node_idx].constraint = node->token.opr.ctx_type;
- }
- return REG_NOERROR;
-}
-
-/* Pass 2: compute NEXT on the tree. Preorder visit. */
-static reg_errcode_t
-calc_next (void *extra, bin_tree_t *node)
-{
- switch (node->token.type)
- {
- case OP_DUP_ASTERISK:
- node->left->next = node;
- break;
- case CONCAT:
- node->left->next = node->right->first;
- node->right->next = node->next;
- break;
- default:
- if (node->left)
- node->left->next = node->next;
- if (node->right)
- node->right->next = node->next;
- break;
- }
- return REG_NOERROR;
-}
-
-/* Pass 3: link all DFA nodes to their NEXT node (any order will do). */
-static reg_errcode_t
-link_nfa_nodes (void *extra, bin_tree_t *node)
-{
- re_dfa_t *dfa = (re_dfa_t *) extra;
- Idx idx = node->node_idx;
- reg_errcode_t err = REG_NOERROR;
-
- switch (node->token.type)
- {
- case CONCAT:
- break;
-
- case END_OF_RE:
- DEBUG_ASSERT (node->next == NULL);
- break;
-
- case OP_DUP_ASTERISK:
- case OP_ALT:
- {
- Idx left, right;
- dfa->has_plural_match = 1;
- if (node->left != NULL)
- left = node->left->first->node_idx;
- else
- left = node->next->node_idx;
- if (node->right != NULL)
- right = node->right->first->node_idx;
- else
- right = node->next->node_idx;
- DEBUG_ASSERT (left > -1);
- DEBUG_ASSERT (right > -1);
- err = re_node_set_init_2 (dfa->edests + idx, left, right);
- }
- break;
-
- case ANCHOR:
- case OP_OPEN_SUBEXP:
- case OP_CLOSE_SUBEXP:
- err = re_node_set_init_1 (dfa->edests + idx, node->next->node_idx);
- break;
-
- case OP_BACK_REF:
- dfa->nexts[idx] = node->next->node_idx;
- if (node->token.type == OP_BACK_REF)
- err = re_node_set_init_1 (dfa->edests + idx, dfa->nexts[idx]);
- break;
-
- default:
- DEBUG_ASSERT (!IS_EPSILON_NODE (node->token.type));
- dfa->nexts[idx] = node->next->node_idx;
- break;
- }
-
- return err;
-}
-
-/* Duplicate the epsilon closure of the node ROOT_NODE.
- Note that duplicated nodes have constraint INIT_CONSTRAINT in addition
- to their own constraint. */
-
-static reg_errcode_t
-duplicate_node_closure (re_dfa_t *dfa, Idx top_org_node, Idx top_clone_node,
- Idx root_node, unsigned int init_constraint)
-{
- Idx org_node, clone_node;
- bool ok;
- unsigned int constraint = init_constraint;
- for (org_node = top_org_node, clone_node = top_clone_node;;)
- {
- Idx org_dest, clone_dest;
- if (dfa->nodes[org_node].type == OP_BACK_REF)
- {
- /* If the back reference epsilon-transit, its destination must
- also have the constraint. Then duplicate the epsilon closure
- of the destination of the back reference, and store it in
- edests of the back reference. */
- org_dest = dfa->nexts[org_node];
- re_node_set_empty (dfa->edests + clone_node);
- clone_dest = duplicate_node (dfa, org_dest, constraint);
- if (__glibc_unlikely (clone_dest == -1))
- return REG_ESPACE;
- dfa->nexts[clone_node] = dfa->nexts[org_node];
- ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
- if (__glibc_unlikely (! ok))
- return REG_ESPACE;
- }
- else if (dfa->edests[org_node].nelem == 0)
- {
- /* In case of the node can't epsilon-transit, don't duplicate the
- destination and store the original destination as the
- destination of the node. */
- dfa->nexts[clone_node] = dfa->nexts[org_node];
- break;
- }
- else if (dfa->edests[org_node].nelem == 1)
- {
- /* In case of the node can epsilon-transit, and it has only one
- destination. */
- org_dest = dfa->edests[org_node].elems[0];
- re_node_set_empty (dfa->edests + clone_node);
- /* If the node is root_node itself, it means the epsilon closure
- has a loop. Then tie it to the destination of the root_node. */
- if (org_node == root_node && clone_node != org_node)
- {
- ok = re_node_set_insert (dfa->edests + clone_node, org_dest);
- if (__glibc_unlikely (! ok))
- return REG_ESPACE;
- break;
- }
- /* In case the node has another constraint, append it. */
- constraint |= dfa->nodes[org_node].constraint;
- clone_dest = duplicate_node (dfa, org_dest, constraint);
- if (__glibc_unlikely (clone_dest == -1))
- return REG_ESPACE;
- ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
- if (__glibc_unlikely (! ok))
- return REG_ESPACE;
- }
- else /* dfa->edests[org_node].nelem == 2 */
- {
- /* In case of the node can epsilon-transit, and it has two
- destinations. In the bin_tree_t and DFA, that's '|' and '*'. */
- org_dest = dfa->edests[org_node].elems[0];
- re_node_set_empty (dfa->edests + clone_node);
- /* Search for a duplicated node which satisfies the constraint. */
- clone_dest = search_duplicated_node (dfa, org_dest, constraint);
- if (clone_dest == -1)
- {
- /* There is no such duplicated node, create a new one. */
- reg_errcode_t err;
- clone_dest = duplicate_node (dfa, org_dest, constraint);
- if (__glibc_unlikely (clone_dest == -1))
- return REG_ESPACE;
- ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
- if (__glibc_unlikely (! ok))
- return REG_ESPACE;
- err = duplicate_node_closure (dfa, org_dest, clone_dest,
- root_node, constraint);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- }
- else
- {
- /* There is a duplicated node which satisfies the constraint,
- use it to avoid infinite loop. */
- ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
- if (__glibc_unlikely (! ok))
- return REG_ESPACE;
- }
-
- org_dest = dfa->edests[org_node].elems[1];
- clone_dest = duplicate_node (dfa, org_dest, constraint);
- if (__glibc_unlikely (clone_dest == -1))
- return REG_ESPACE;
- ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
- if (__glibc_unlikely (! ok))
- return REG_ESPACE;
- }
- org_node = org_dest;
- clone_node = clone_dest;
- }
- return REG_NOERROR;
-}
-
-/* Search for a node which is duplicated from the node ORG_NODE, and
- satisfies the constraint CONSTRAINT. */
-
-static Idx
-search_duplicated_node (const re_dfa_t *dfa, Idx org_node,
- unsigned int constraint)
-{
- Idx idx;
- for (idx = dfa->nodes_len - 1; dfa->nodes[idx].duplicated && idx > 0; --idx)
- {
- if (org_node == dfa->org_indices[idx]
- && constraint == dfa->nodes[idx].constraint)
- return idx; /* Found. */
- }
- return -1; /* Not found. */
-}
-
-/* Duplicate the node whose index is ORG_IDX and set the constraint CONSTRAINT.
- Return the index of the new node, or -1 if insufficient storage is
- available. */
-
-static Idx
-duplicate_node (re_dfa_t *dfa, Idx org_idx, unsigned int constraint)
-{
- Idx dup_idx = re_dfa_add_node (dfa, dfa->nodes[org_idx]);
- if (__glibc_likely (dup_idx != -1))
- {
- dfa->nodes[dup_idx].constraint = constraint;
- dfa->nodes[dup_idx].constraint |= dfa->nodes[org_idx].constraint;
- dfa->nodes[dup_idx].duplicated = 1;
-
- /* Store the index of the original node. */
- dfa->org_indices[dup_idx] = org_idx;
- }
- return dup_idx;
-}
-
-static reg_errcode_t
-calc_inveclosure (re_dfa_t *dfa)
-{
- Idx src, idx;
- bool ok;
- for (idx = 0; idx < dfa->nodes_len; ++idx)
- re_node_set_init_empty (dfa->inveclosures + idx);
-
- for (src = 0; src < dfa->nodes_len; ++src)
- {
- Idx *elems = dfa->eclosures[src].elems;
- for (idx = 0; idx < dfa->eclosures[src].nelem; ++idx)
- {
- ok = re_node_set_insert_last (dfa->inveclosures + elems[idx], src);
- if (__glibc_unlikely (! ok))
- return REG_ESPACE;
- }
- }
-
- return REG_NOERROR;
-}
-
-/* Calculate "eclosure" for all the node in DFA. */
-
-static reg_errcode_t
-calc_eclosure (re_dfa_t *dfa)
-{
- Idx node_idx;
- bool incomplete;
- DEBUG_ASSERT (dfa->nodes_len > 0);
- incomplete = false;
- /* For each nodes, calculate epsilon closure. */
- for (node_idx = 0; ; ++node_idx)
- {
- reg_errcode_t err;
- re_node_set eclosure_elem;
- if (node_idx == dfa->nodes_len)
- {
- if (!incomplete)
- break;
- incomplete = false;
- node_idx = 0;
- }
-
- DEBUG_ASSERT (dfa->eclosures[node_idx].nelem != -1);
-
- /* If we have already calculated, skip it. */
- if (dfa->eclosures[node_idx].nelem != 0)
- continue;
- /* Calculate epsilon closure of 'node_idx'. */
- err = calc_eclosure_iter (&eclosure_elem, dfa, node_idx, true);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
-
- if (dfa->eclosures[node_idx].nelem == 0)
- {
- incomplete = true;
- re_node_set_free (&eclosure_elem);
- }
- }
- return REG_NOERROR;
-}
-
-/* Calculate epsilon closure of NODE. */
-
-static reg_errcode_t
-calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa, Idx node, bool root)
-{
- reg_errcode_t err;
- Idx i;
- re_node_set eclosure;
- bool incomplete = false;
- err = re_node_set_alloc (&eclosure, dfa->edests[node].nelem + 1);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
-
- /* An epsilon closure includes itself. */
- eclosure.elems[eclosure.nelem++] = node;
-
- /* This indicates that we are calculating this node now.
- We reference this value to avoid infinite loop. */
- dfa->eclosures[node].nelem = -1;
-
- /* If the current node has constraints, duplicate all nodes
- since they must inherit the constraints. */
- if (dfa->nodes[node].constraint
- && dfa->edests[node].nelem
- && !dfa->nodes[dfa->edests[node].elems[0]].duplicated)
- {
- err = duplicate_node_closure (dfa, node, node, node,
- dfa->nodes[node].constraint);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- }
-
- /* Expand each epsilon destination nodes. */
- if (IS_EPSILON_NODE(dfa->nodes[node].type))
- for (i = 0; i < dfa->edests[node].nelem; ++i)
- {
- re_node_set eclosure_elem;
- Idx edest = dfa->edests[node].elems[i];
- /* If calculating the epsilon closure of 'edest' is in progress,
- return intermediate result. */
- if (dfa->eclosures[edest].nelem == -1)
- {
- incomplete = true;
- continue;
- }
- /* If we haven't calculated the epsilon closure of 'edest' yet,
- calculate now. Otherwise use calculated epsilon closure. */
- if (dfa->eclosures[edest].nelem == 0)
- {
- err = calc_eclosure_iter (&eclosure_elem, dfa, edest, false);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- }
- else
- eclosure_elem = dfa->eclosures[edest];
- /* Merge the epsilon closure of 'edest'. */
- err = re_node_set_merge (&eclosure, &eclosure_elem);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- /* If the epsilon closure of 'edest' is incomplete,
- the epsilon closure of this node is also incomplete. */
- if (dfa->eclosures[edest].nelem == 0)
- {
- incomplete = true;
- re_node_set_free (&eclosure_elem);
- }
- }
-
- if (incomplete && !root)
- dfa->eclosures[node].nelem = 0;
- else
- dfa->eclosures[node] = eclosure;
- *new_set = eclosure;
- return REG_NOERROR;
-}
-
-/* Functions for token which are used in the parser. */
-
-/* Fetch a token from INPUT.
- We must not use this function inside bracket expressions. */
-
-static void
-fetch_token (re_token_t *result, re_string_t *input, reg_syntax_t syntax)
-{
- re_string_skip_bytes (input, peek_token (result, input, syntax));
-}
-
-/* Peek a token from INPUT, and return the length of the token.
- We must not use this function inside bracket expressions. */
-
-static int
-peek_token (re_token_t *token, re_string_t *input, reg_syntax_t syntax)
-{
- unsigned char c;
-
- if (re_string_eoi (input))
- {
- token->type = END_OF_RE;
- return 0;
- }
-
- c = re_string_peek_byte (input, 0);
- token->opr.c = c;
-
- token->word_char = 0;
- token->mb_partial = 0;
- if (input->mb_cur_max > 1
- && !re_string_first_byte (input, re_string_cur_idx (input)))
- {
- token->type = CHARACTER;
- token->mb_partial = 1;
- return 1;
- }
- if (c == '\\')
- {
- unsigned char c2;
- if (re_string_cur_idx (input) + 1 >= re_string_length (input))
- {
- token->type = BACK_SLASH;
- return 1;
- }
-
- c2 = re_string_peek_byte_case (input, 1);
- token->opr.c = c2;
- token->type = CHARACTER;
- if (input->mb_cur_max > 1)
- {
- wint_t wc = re_string_wchar_at (input,
- re_string_cur_idx (input) + 1);
- token->word_char = IS_WIDE_WORD_CHAR (wc) != 0;
- }
- else
- token->word_char = IS_WORD_CHAR (c2) != 0;
-
- switch (c2)
- {
- case '|':
- if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_NO_BK_VBAR))
- token->type = OP_ALT;
- break;
- case '1': case '2': case '3': case '4': case '5':
- case '6': case '7': case '8': case '9':
- if (!(syntax & RE_NO_BK_REFS))
- {
- token->type = OP_BACK_REF;
- token->opr.idx = c2 - '1';
- }
- break;
- case '<':
- if (!(syntax & RE_NO_GNU_OPS))
- {
- token->type = ANCHOR;
- token->opr.ctx_type = WORD_FIRST;
- }
- break;
- case '>':
- if (!(syntax & RE_NO_GNU_OPS))
- {
- token->type = ANCHOR;
- token->opr.ctx_type = WORD_LAST;
- }
- break;
- case 'b':
- if (!(syntax & RE_NO_GNU_OPS))
- {
- token->type = ANCHOR;
- token->opr.ctx_type = WORD_DELIM;
- }
- break;
- case 'B':
- if (!(syntax & RE_NO_GNU_OPS))
- {
- token->type = ANCHOR;
- token->opr.ctx_type = NOT_WORD_DELIM;
- }
- break;
- case 'w':
- if (!(syntax & RE_NO_GNU_OPS))
- token->type = OP_WORD;
- break;
- case 'W':
- if (!(syntax & RE_NO_GNU_OPS))
- token->type = OP_NOTWORD;
- break;
- case 's':
- if (!(syntax & RE_NO_GNU_OPS))
- token->type = OP_SPACE;
- break;
- case 'S':
- if (!(syntax & RE_NO_GNU_OPS))
- token->type = OP_NOTSPACE;
- break;
- case '`':
- if (!(syntax & RE_NO_GNU_OPS))
- {
- token->type = ANCHOR;
- token->opr.ctx_type = BUF_FIRST;
- }
- break;
- case '\'':
- if (!(syntax & RE_NO_GNU_OPS))
- {
- token->type = ANCHOR;
- token->opr.ctx_type = BUF_LAST;
- }
- break;
- case '(':
- if (!(syntax & RE_NO_BK_PARENS))
- token->type = OP_OPEN_SUBEXP;
- break;
- case ')':
- if (!(syntax & RE_NO_BK_PARENS))
- token->type = OP_CLOSE_SUBEXP;
- break;
- case '+':
- if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_BK_PLUS_QM))
- token->type = OP_DUP_PLUS;
- break;
- case '?':
- if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_BK_PLUS_QM))
- token->type = OP_DUP_QUESTION;
- break;
- case '{':
- if ((syntax & RE_INTERVALS) && (!(syntax & RE_NO_BK_BRACES)))
- token->type = OP_OPEN_DUP_NUM;
- break;
- case '}':
- if ((syntax & RE_INTERVALS) && (!(syntax & RE_NO_BK_BRACES)))
- token->type = OP_CLOSE_DUP_NUM;
- break;
- default:
- break;
- }
- return 2;
- }
-
- token->type = CHARACTER;
- if (input->mb_cur_max > 1)
- {
- wint_t wc = re_string_wchar_at (input, re_string_cur_idx (input));
- token->word_char = IS_WIDE_WORD_CHAR (wc) != 0;
- }
- else
- token->word_char = IS_WORD_CHAR (token->opr.c);
-
- switch (c)
- {
- case '\n':
- if (syntax & RE_NEWLINE_ALT)
- token->type = OP_ALT;
- break;
- case '|':
- if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_NO_BK_VBAR))
- token->type = OP_ALT;
- break;
- case '*':
- token->type = OP_DUP_ASTERISK;
- break;
- case '+':
- if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_BK_PLUS_QM))
- token->type = OP_DUP_PLUS;
- break;
- case '?':
- if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_BK_PLUS_QM))
- token->type = OP_DUP_QUESTION;
- break;
- case '{':
- if ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
- token->type = OP_OPEN_DUP_NUM;
- break;
- case '}':
- if ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
- token->type = OP_CLOSE_DUP_NUM;
- break;
- case '(':
- if (syntax & RE_NO_BK_PARENS)
- token->type = OP_OPEN_SUBEXP;
- break;
- case ')':
- if (syntax & RE_NO_BK_PARENS)
- token->type = OP_CLOSE_SUBEXP;
- break;
- case '[':
- token->type = OP_OPEN_BRACKET;
- break;
- case '.':
- token->type = OP_PERIOD;
- break;
- case '^':
- if (!(syntax & (RE_CONTEXT_INDEP_ANCHORS | RE_CARET_ANCHORS_HERE))
- && re_string_cur_idx (input) != 0)
- {
- char prev = re_string_peek_byte (input, -1);
- if (!(syntax & RE_NEWLINE_ALT) || prev != '\n')
- break;
- }
- token->type = ANCHOR;
- token->opr.ctx_type = LINE_FIRST;
- break;
- case '$':
- if (!(syntax & RE_CONTEXT_INDEP_ANCHORS)
- && re_string_cur_idx (input) + 1 != re_string_length (input))
- {
- re_token_t next;
- re_string_skip_bytes (input, 1);
- peek_token (&next, input, syntax);
- re_string_skip_bytes (input, -1);
- if (next.type != OP_ALT && next.type != OP_CLOSE_SUBEXP)
- break;
- }
- token->type = ANCHOR;
- token->opr.ctx_type = LINE_LAST;
- break;
- default:
- break;
- }
- return 1;
-}
-
-/* Peek a token from INPUT, and return the length of the token.
- We must not use this function out of bracket expressions. */
-
-static int
-peek_token_bracket (re_token_t *token, re_string_t *input, reg_syntax_t syntax)
-{
- unsigned char c;
- if (re_string_eoi (input))
- {
- token->type = END_OF_RE;
- return 0;
- }
- c = re_string_peek_byte (input, 0);
- token->opr.c = c;
-
- if (input->mb_cur_max > 1
- && !re_string_first_byte (input, re_string_cur_idx (input)))
- {
- token->type = CHARACTER;
- return 1;
- }
-
- if (c == '\\' && (syntax & RE_BACKSLASH_ESCAPE_IN_LISTS)
- && re_string_cur_idx (input) + 1 < re_string_length (input))
- {
- /* In this case, '\' escape a character. */
- unsigned char c2;
- re_string_skip_bytes (input, 1);
- c2 = re_string_peek_byte (input, 0);
- token->opr.c = c2;
- token->type = CHARACTER;
- return 1;
- }
- if (c == '[') /* '[' is a special char in a bracket exps. */
- {
- unsigned char c2;
- int token_len;
- if (re_string_cur_idx (input) + 1 < re_string_length (input))
- c2 = re_string_peek_byte (input, 1);
- else
- c2 = 0;
- token->opr.c = c2;
- token_len = 2;
- switch (c2)
- {
- case '.':
- token->type = OP_OPEN_COLL_ELEM;
- break;
-
- case '=':
- token->type = OP_OPEN_EQUIV_CLASS;
- break;
-
- case ':':
- if (syntax & RE_CHAR_CLASSES)
- {
- token->type = OP_OPEN_CHAR_CLASS;
- break;
- }
- FALLTHROUGH;
- default:
- token->type = CHARACTER;
- token->opr.c = c;
- token_len = 1;
- break;
- }
- return token_len;
- }
- switch (c)
- {
- case ']':
- token->type = OP_CLOSE_BRACKET;
- break;
- case '^':
- token->type = OP_NON_MATCH_LIST;
- break;
- case '-':
- /* In V7 Unix grep and Unix awk and mawk, [...---...]
- (3 adjacent minus signs) stands for a single minus sign.
- Support that without breaking anything else. */
- if (! (re_string_cur_idx (input) + 2 < re_string_length (input)
- && re_string_peek_byte (input, 1) == '-'
- && re_string_peek_byte (input, 2) == '-'))
- {
- token->type = OP_CHARSET_RANGE;
- break;
- }
- re_string_skip_bytes (input, 2);
- FALLTHROUGH;
- default:
- token->type = CHARACTER;
- }
- return 1;
-}
-
-/* Functions for parser. */
-
-/* Entry point of the parser.
- Parse the regular expression REGEXP and return the structure tree.
- If an error occurs, ERR is set by error code, and return NULL.
- This function build the following tree, from regular expression <reg_exp>:
- CAT
- / \
- / \
- <reg_exp> EOR
-
- CAT means concatenation.
- EOR means end of regular expression. */
-
-static bin_tree_t *
-parse (re_string_t *regexp, regex_t *preg, reg_syntax_t syntax,
- reg_errcode_t *err)
-{
- re_dfa_t *dfa = preg->buffer;
- bin_tree_t *tree, *eor, *root;
- re_token_t current_token;
- dfa->syntax = syntax;
- fetch_token (&current_token, regexp, syntax | RE_CARET_ANCHORS_HERE);
- tree = parse_reg_exp (regexp, preg, &current_token, syntax, 0, err);
- if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL))
- return NULL;
- eor = create_tree (dfa, NULL, NULL, END_OF_RE);
- if (tree != NULL)
- root = create_tree (dfa, tree, eor, CONCAT);
- else
- root = eor;
- if (__glibc_unlikely (eor == NULL || root == NULL))
- {
- *err = REG_ESPACE;
- return NULL;
- }
- return root;
-}
-
-/* This function build the following tree, from regular expression
- <branch1>|<branch2>:
- ALT
- / \
- / \
- <branch1> <branch2>
-
- ALT means alternative, which represents the operator '|'. */
-
-static bin_tree_t *
-parse_reg_exp (re_string_t *regexp, regex_t *preg, re_token_t *token,
- reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
-{
- re_dfa_t *dfa = preg->buffer;
- bin_tree_t *tree, *branch = NULL;
- bitset_word_t initial_bkref_map = dfa->completed_bkref_map;
- tree = parse_branch (regexp, preg, token, syntax, nest, err);
- if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL))
- return NULL;
-
- while (token->type == OP_ALT)
- {
- fetch_token (token, regexp, syntax | RE_CARET_ANCHORS_HERE);
- if (token->type != OP_ALT && token->type != END_OF_RE
- && (nest == 0 || token->type != OP_CLOSE_SUBEXP))
- {
- bitset_word_t accumulated_bkref_map = dfa->completed_bkref_map;
- dfa->completed_bkref_map = initial_bkref_map;
- branch = parse_branch (regexp, preg, token, syntax, nest, err);
- if (__glibc_unlikely (*err != REG_NOERROR && branch == NULL))
- {
- if (tree != NULL)
- postorder (tree, free_tree, NULL);
- return NULL;
- }
- dfa->completed_bkref_map |= accumulated_bkref_map;
- }
- else
- branch = NULL;
- tree = create_tree (dfa, tree, branch, OP_ALT);
- if (__glibc_unlikely (tree == NULL))
- {
- *err = REG_ESPACE;
- return NULL;
- }
- }
- return tree;
-}
-
-/* This function build the following tree, from regular expression
- <exp1><exp2>:
- CAT
- / \
- / \
- <exp1> <exp2>
-
- CAT means concatenation. */
-
-static bin_tree_t *
-parse_branch (re_string_t *regexp, regex_t *preg, re_token_t *token,
- reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
-{
- bin_tree_t *tree, *expr;
- re_dfa_t *dfa = preg->buffer;
- tree = parse_expression (regexp, preg, token, syntax, nest, err);
- if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL))
- return NULL;
-
- while (token->type != OP_ALT && token->type != END_OF_RE
- && (nest == 0 || token->type != OP_CLOSE_SUBEXP))
- {
- expr = parse_expression (regexp, preg, token, syntax, nest, err);
- if (__glibc_unlikely (*err != REG_NOERROR && expr == NULL))
- {
- if (tree != NULL)
- postorder (tree, free_tree, NULL);
- return NULL;
- }
- if (tree != NULL && expr != NULL)
- {
- bin_tree_t *newtree = create_tree (dfa, tree, expr, CONCAT);
- if (newtree == NULL)
- {
- postorder (expr, free_tree, NULL);
- postorder (tree, free_tree, NULL);
- *err = REG_ESPACE;
- return NULL;
- }
- tree = newtree;
- }
- else if (tree == NULL)
- tree = expr;
- /* Otherwise expr == NULL, we don't need to create new tree. */
- }
- return tree;
-}
-
-/* This function build the following tree, from regular expression a*:
- *
- |
- a
-*/
-
-static bin_tree_t *
-parse_expression (re_string_t *regexp, regex_t *preg, re_token_t *token,
- reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
-{
- re_dfa_t *dfa = preg->buffer;
- bin_tree_t *tree;
- switch (token->type)
- {
- case CHARACTER:
- tree = create_token_tree (dfa, NULL, NULL, token);
- if (__glibc_unlikely (tree == NULL))
- {
- *err = REG_ESPACE;
- return NULL;
- }
- if (dfa->mb_cur_max > 1)
- {
- while (!re_string_eoi (regexp)
- && !re_string_first_byte (regexp, re_string_cur_idx (regexp)))
- {
- bin_tree_t *mbc_remain;
- fetch_token (token, regexp, syntax);
- mbc_remain = create_token_tree (dfa, NULL, NULL, token);
- tree = create_tree (dfa, tree, mbc_remain, CONCAT);
- if (__glibc_unlikely (mbc_remain == NULL || tree == NULL))
- {
- *err = REG_ESPACE;
- return NULL;
- }
- }
- }
- break;
-
- case OP_OPEN_SUBEXP:
- tree = parse_sub_exp (regexp, preg, token, syntax, nest + 1, err);
- if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL))
- return NULL;
- break;
-
- case OP_OPEN_BRACKET:
- tree = parse_bracket_exp (regexp, dfa, token, syntax, err);
- if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL))
- return NULL;
- break;
-
- case OP_BACK_REF:
- if (!__glibc_likely (dfa->completed_bkref_map & (1 << token->opr.idx)))
- {
- *err = REG_ESUBREG;
- return NULL;
- }
- dfa->used_bkref_map |= 1 << token->opr.idx;
- tree = create_token_tree (dfa, NULL, NULL, token);
- if (__glibc_unlikely (tree == NULL))
- {
- *err = REG_ESPACE;
- return NULL;
- }
- ++dfa->nbackref;
- dfa->has_mb_node = 1;
- break;
-
- case OP_OPEN_DUP_NUM:
- if (syntax & RE_CONTEXT_INVALID_DUP)
- {
- *err = REG_BADRPT;
- return NULL;
- }
- FALLTHROUGH;
- case OP_DUP_ASTERISK:
- case OP_DUP_PLUS:
- case OP_DUP_QUESTION:
- if (syntax & RE_CONTEXT_INVALID_OPS)
- {
- *err = REG_BADRPT;
- return NULL;
- }
- else if (syntax & RE_CONTEXT_INDEP_OPS)
- {
- fetch_token (token, regexp, syntax);
- return parse_expression (regexp, preg, token, syntax, nest, err);
- }
- FALLTHROUGH;
- case OP_CLOSE_SUBEXP:
- if ((token->type == OP_CLOSE_SUBEXP)
- && !(syntax & RE_UNMATCHED_RIGHT_PAREN_ORD))
- {
- *err = REG_ERPAREN;
- return NULL;
- }
- FALLTHROUGH;
- case OP_CLOSE_DUP_NUM:
- /* We treat it as a normal character. */
-
- /* Then we can these characters as normal characters. */
- token->type = CHARACTER;
- /* mb_partial and word_char bits should be initialized already
- by peek_token. */
- tree = create_token_tree (dfa, NULL, NULL, token);
- if (__glibc_unlikely (tree == NULL))
- {
- *err = REG_ESPACE;
- return NULL;
- }
- break;
-
- case ANCHOR:
- if ((token->opr.ctx_type
- & (WORD_DELIM | NOT_WORD_DELIM | WORD_FIRST | WORD_LAST))
- && dfa->word_ops_used == 0)
- init_word_char (dfa);
- if (token->opr.ctx_type == WORD_DELIM
- || token->opr.ctx_type == NOT_WORD_DELIM)
- {
- bin_tree_t *tree_first, *tree_last;
- if (token->opr.ctx_type == WORD_DELIM)
- {
- token->opr.ctx_type = WORD_FIRST;
- tree_first = create_token_tree (dfa, NULL, NULL, token);
- token->opr.ctx_type = WORD_LAST;
- }
- else
- {
- token->opr.ctx_type = INSIDE_WORD;
- tree_first = create_token_tree (dfa, NULL, NULL, token);
- token->opr.ctx_type = INSIDE_NOTWORD;
- }
- tree_last = create_token_tree (dfa, NULL, NULL, token);
- tree = create_tree (dfa, tree_first, tree_last, OP_ALT);
- if (__glibc_unlikely (tree_first == NULL || tree_last == NULL
- || tree == NULL))
- {
- *err = REG_ESPACE;
- return NULL;
- }
- }
- else
- {
- tree = create_token_tree (dfa, NULL, NULL, token);
- if (__glibc_unlikely (tree == NULL))
- {
- *err = REG_ESPACE;
- return NULL;
- }
- }
- /* We must return here, since ANCHORs can't be followed
- by repetition operators.
- eg. RE"^*" is invalid or "<ANCHOR(^)><CHAR(*)>",
- it must not be "<ANCHOR(^)><REPEAT(*)>". */
- fetch_token (token, regexp, syntax);
- return tree;
-
- case OP_PERIOD:
- tree = create_token_tree (dfa, NULL, NULL, token);
- if (__glibc_unlikely (tree == NULL))
- {
- *err = REG_ESPACE;
- return NULL;
- }
- if (dfa->mb_cur_max > 1)
- dfa->has_mb_node = 1;
- break;
-
- case OP_WORD:
- case OP_NOTWORD:
- tree = build_charclass_op (dfa, regexp->trans,
- "alnum",
- "_",
- token->type == OP_NOTWORD, err);
- if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL))
- return NULL;
- break;
-
- case OP_SPACE:
- case OP_NOTSPACE:
- tree = build_charclass_op (dfa, regexp->trans,
- "space",
- "",
- token->type == OP_NOTSPACE, err);
- if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL))
- return NULL;
- break;
-
- case OP_ALT:
- case END_OF_RE:
- return NULL;
-
- case BACK_SLASH:
- *err = REG_EESCAPE;
- return NULL;
-
- default:
- /* Must not happen? */
- DEBUG_ASSERT (false);
- return NULL;
- }
- fetch_token (token, regexp, syntax);
-
- while (token->type == OP_DUP_ASTERISK || token->type == OP_DUP_PLUS
- || token->type == OP_DUP_QUESTION || token->type == OP_OPEN_DUP_NUM)
- {
- bin_tree_t *dup_tree = parse_dup_op (tree, regexp, dfa, token,
- syntax, err);
- if (__glibc_unlikely (*err != REG_NOERROR && dup_tree == NULL))
- {
- if (tree != NULL)
- postorder (tree, free_tree, NULL);
- return NULL;
- }
- tree = dup_tree;
- /* In BRE consecutive duplications are not allowed. */
- if ((syntax & RE_CONTEXT_INVALID_DUP)
- && (token->type == OP_DUP_ASTERISK
- || token->type == OP_OPEN_DUP_NUM))
- {
- if (tree != NULL)
- postorder (tree, free_tree, NULL);
- *err = REG_BADRPT;
- return NULL;
- }
- }
-
- return tree;
-}
-
-/* This function build the following tree, from regular expression
- (<reg_exp>):
- SUBEXP
- |
- <reg_exp>
-*/
-
-static bin_tree_t *
-parse_sub_exp (re_string_t *regexp, regex_t *preg, re_token_t *token,
- reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
-{
- re_dfa_t *dfa = preg->buffer;
- bin_tree_t *tree;
- size_t cur_nsub;
- cur_nsub = preg->re_nsub++;
-
- fetch_token (token, regexp, syntax | RE_CARET_ANCHORS_HERE);
-
- /* The subexpression may be a null string. */
- if (token->type == OP_CLOSE_SUBEXP)
- tree = NULL;
- else
- {
- tree = parse_reg_exp (regexp, preg, token, syntax, nest, err);
- if (__glibc_unlikely (*err == REG_NOERROR
- && token->type != OP_CLOSE_SUBEXP))
- {
- if (tree != NULL)
- postorder (tree, free_tree, NULL);
- *err = REG_EPAREN;
- }
- if (__glibc_unlikely (*err != REG_NOERROR))
- return NULL;
- }
-
- if (cur_nsub <= '9' - '1')
- dfa->completed_bkref_map |= 1 << cur_nsub;
-
- tree = create_tree (dfa, tree, NULL, SUBEXP);
- if (__glibc_unlikely (tree == NULL))
- {
- *err = REG_ESPACE;
- return NULL;
- }
- tree->token.opr.idx = cur_nsub;
- return tree;
-}
-
-/* This function parse repetition operators like "*", "+", "{1,3}" etc. */
-
-static bin_tree_t *
-parse_dup_op (bin_tree_t *elem, re_string_t *regexp, re_dfa_t *dfa,
- re_token_t *token, reg_syntax_t syntax, reg_errcode_t *err)
-{
- bin_tree_t *tree = NULL, *old_tree = NULL;
- Idx i, start, end, start_idx = re_string_cur_idx (regexp);
- re_token_t start_token = *token;
-
- if (token->type == OP_OPEN_DUP_NUM)
- {
- end = 0;
- start = fetch_number (regexp, token, syntax);
- if (start == -1)
- {
- if (token->type == CHARACTER && token->opr.c == ',')
- start = 0; /* We treat "{,m}" as "{0,m}". */
- else
- {
- *err = REG_BADBR; /* <re>{} is invalid. */
- return NULL;
- }
- }
- if (__glibc_likely (start != -2))
- {
- /* We treat "{n}" as "{n,n}". */
- end = ((token->type == OP_CLOSE_DUP_NUM) ? start
- : ((token->type == CHARACTER && token->opr.c == ',')
- ? fetch_number (regexp, token, syntax) : -2));
- }
- if (__glibc_unlikely (start == -2 || end == -2))
- {
- /* Invalid sequence. */
- if (__glibc_unlikely (!(syntax & RE_INVALID_INTERVAL_ORD)))
- {
- if (token->type == END_OF_RE)
- *err = REG_EBRACE;
- else
- *err = REG_BADBR;
-
- return NULL;
- }
-
- /* If the syntax bit is set, rollback. */
- re_string_set_index (regexp, start_idx);
- *token = start_token;
- token->type = CHARACTER;
- /* mb_partial and word_char bits should be already initialized by
- peek_token. */
- return elem;
- }
-
- if (__glibc_unlikely ((end != -1 && start > end)
- || token->type != OP_CLOSE_DUP_NUM))
- {
- /* First number greater than second. */
- *err = REG_BADBR;
- return NULL;
- }
-
- if (__glibc_unlikely (RE_DUP_MAX < (end == -1 ? start : end)))
- {
- *err = REG_ESIZE;
- return NULL;
- }
- }
- else
- {
- start = (token->type == OP_DUP_PLUS) ? 1 : 0;
- end = (token->type == OP_DUP_QUESTION) ? 1 : -1;
- }
-
- fetch_token (token, regexp, syntax);
-
- if (__glibc_unlikely (elem == NULL))
- return NULL;
- if (__glibc_unlikely (start == 0 && end == 0))
- {
- postorder (elem, free_tree, NULL);
- return NULL;
- }
-
- /* Extract "<re>{n,m}" to "<re><re>...<re><re>{0,<m-n>}". */
- if (__glibc_unlikely (start > 0))
- {
- tree = elem;
- for (i = 2; i <= start; ++i)
- {
- elem = duplicate_tree (elem, dfa);
- tree = create_tree (dfa, tree, elem, CONCAT);
- if (__glibc_unlikely (elem == NULL || tree == NULL))
- goto parse_dup_op_espace;
- }
-
- if (start == end)
- return tree;
-
- /* Duplicate ELEM before it is marked optional. */
- elem = duplicate_tree (elem, dfa);
- if (__glibc_unlikely (elem == NULL))
- goto parse_dup_op_espace;
- old_tree = tree;
- }
- else
- old_tree = NULL;
-
- if (elem->token.type == SUBEXP)
- {
- uintptr_t subidx = elem->token.opr.idx;
- postorder (elem, mark_opt_subexp, (void *) subidx);
- }
-
- tree = create_tree (dfa, elem, NULL,
- (end == -1 ? OP_DUP_ASTERISK : OP_ALT));
- if (__glibc_unlikely (tree == NULL))
- goto parse_dup_op_espace;
-
- /* This loop is actually executed only when end != -1,
- to rewrite <re>{0,n} as (<re>(<re>...<re>?)?)?... We have
- already created the start+1-th copy. */
- if (TYPE_SIGNED (Idx) || end != -1)
- for (i = start + 2; i <= end; ++i)
- {
- elem = duplicate_tree (elem, dfa);
- tree = create_tree (dfa, tree, elem, CONCAT);
- if (__glibc_unlikely (elem == NULL || tree == NULL))
- goto parse_dup_op_espace;
-
- tree = create_tree (dfa, tree, NULL, OP_ALT);
- if (__glibc_unlikely (tree == NULL))
- goto parse_dup_op_espace;
- }
-
- if (old_tree)
- tree = create_tree (dfa, old_tree, tree, CONCAT);
-
- return tree;
-
- parse_dup_op_espace:
- *err = REG_ESPACE;
- return NULL;
-}
-
-/* Size of the names for collating symbol/equivalence_class/character_class.
- I'm not sure, but maybe enough. */
-#define BRACKET_NAME_BUF_SIZE 32
-
-#ifndef _LIBC
-
-/* Convert the byte B to the corresponding wide character. In a
- unibyte locale, treat B as itself. In a multibyte locale, return
- WEOF if B is an encoding error. */
-static wint_t
-parse_byte (unsigned char b, re_dfa_t const *dfa)
-{
- return dfa->mb_cur_max > 1 ? __btowc (b) : b;
-}
-
-/* Local function for parse_bracket_exp used in _LIBC environment.
- Build the range expression which starts from START_ELEM, and ends
- at END_ELEM. The result are written to MBCSET and SBCSET.
- RANGE_ALLOC is the allocated size of mbcset->range_starts, and
- mbcset->range_ends, is a pointer argument since we may
- update it. */
-
-static reg_errcode_t
-build_range_exp (bitset_t sbcset, re_charset_t *mbcset, Idx *range_alloc,
- bracket_elem_t *start_elem, bracket_elem_t *end_elem,
- re_dfa_t *dfa, reg_syntax_t syntax, uint_fast32_t nrules,
- const unsigned char *collseqmb, const char *collseqwc,
- int_fast32_t table_size, const void *symb_table,
- const unsigned char *extra)
-{
- /* Equivalence Classes and Character Classes can't be a range start/end. */
- if (__glibc_unlikely (start_elem->type == EQUIV_CLASS
- || start_elem->type == CHAR_CLASS
- || end_elem->type == EQUIV_CLASS
- || end_elem->type == CHAR_CLASS))
- return REG_ERANGE;
-
- /* We can handle no multi character collating elements without libc
- support. */
- if (__glibc_unlikely ((start_elem->type == COLL_SYM
- && strlen ((char *) start_elem->opr.name) > 1)
- || (end_elem->type == COLL_SYM
- && strlen ((char *) end_elem->opr.name) > 1)))
- return REG_ECOLLATE;
-
- unsigned int
- start_ch = ((start_elem->type == SB_CHAR) ? start_elem->opr.ch
- : ((start_elem->type == COLL_SYM) ? start_elem->opr.name[0]
- : 0)),
- end_ch = ((end_elem->type == SB_CHAR) ? end_elem->opr.ch
- : ((end_elem->type == COLL_SYM) ? end_elem->opr.name[0]
- : 0));
- wint_t
- start_wc = ((start_elem->type == SB_CHAR || start_elem->type == COLL_SYM)
- ? parse_byte (start_ch, dfa) : start_elem->opr.wch),
- end_wc = ((end_elem->type == SB_CHAR || end_elem->type == COLL_SYM)
- ? parse_byte (end_ch, dfa) : end_elem->opr.wch);
-
- if (start_wc == WEOF || end_wc == WEOF)
- return REG_ECOLLATE;
- else if (__glibc_unlikely ((syntax & RE_NO_EMPTY_RANGES)
- && start_wc > end_wc))
- return REG_ERANGE;
-
- /* Got valid collation sequence values, add them as a new entry.
- However, for !_LIBC we have no collation elements: if the
- character set is single byte, the single byte character set
- that we build below suffices. parse_bracket_exp passes
- no MBCSET if dfa->mb_cur_max == 1. */
- if (dfa->mb_cur_max > 1)
- {
- /* Check the space of the arrays. */
- if (__glibc_unlikely (*range_alloc == mbcset->nranges))
- {
- /* There is not enough space, need realloc. */
- wchar_t *new_array_start, *new_array_end;
- Idx new_nranges;
-
- /* +1 in case of mbcset->nranges is 0. */
- new_nranges = 2 * mbcset->nranges + 1;
- /* Use realloc since mbcset->range_starts and mbcset->range_ends
- are NULL if *range_alloc == 0. */
- new_array_start = re_realloc (mbcset->range_starts, wchar_t,
- new_nranges);
- new_array_end = re_realloc (mbcset->range_ends, wchar_t,
- new_nranges);
-
- if (__glibc_unlikely (new_array_start == NULL
- || new_array_end == NULL))
- {
- re_free (new_array_start);
- re_free (new_array_end);
- return REG_ESPACE;
- }
-
- mbcset->range_starts = new_array_start;
- mbcset->range_ends = new_array_end;
- *range_alloc = new_nranges;
- }
-
- mbcset->range_starts[mbcset->nranges] = start_wc;
- mbcset->range_ends[mbcset->nranges++] = end_wc;
- }
-
- /* Build the table for single byte characters. */
- for (wchar_t wc = 0; wc < SBC_MAX; ++wc)
- {
- if (start_wc <= wc && wc <= end_wc)
- bitset_set (sbcset, wc);
- }
-
- return REG_NOERROR;
-}
-#endif /* not _LIBC */
-
-#ifndef _LIBC
-/* Helper function for parse_bracket_exp only used in case of NOT _LIBC.
- Build the collating element which is represented by NAME.
- The result are written to MBCSET and SBCSET.
- COLL_SYM_ALLOC is the allocated size of mbcset->coll_sym, is a
- pointer argument since we may update it. */
-
-static reg_errcode_t
-build_collating_symbol (bitset_t sbcset, re_charset_t *mbcset,
- Idx *coll_sym_alloc, const unsigned char *name,
- uint_fast32_t nrules, int_fast32_t table_size,
- const void *symb_table, const unsigned char *extra)
-{
- size_t name_len = strlen ((const char *) name);
- if (__glibc_unlikely (name_len != 1))
- return REG_ECOLLATE;
- else
- {
- bitset_set (sbcset, name[0]);
- return REG_NOERROR;
- }
-}
-#endif /* not _LIBC */
-
-#ifdef _LIBC
-/* Local function for parse_bracket_exp used in _LIBC environment.
- Seek the collating symbol entry corresponding to NAME.
- Return the index of the symbol in the SYMB_TABLE,
- or -1 if not found. */
-
-static __always_inline int32_t
-seek_collating_symbol_entry (const unsigned char *name, size_t name_len,
- const int32_t *symb_table,
- int_fast32_t table_size,
- const unsigned char *extra)
-{
- int_fast32_t elem;
-
- for (elem = 0; elem < table_size; elem++)
- if (symb_table[2 * elem] != 0)
- {
- int32_t idx = symb_table[2 * elem + 1];
- /* Skip the name of collating element name. */
- idx += 1 + extra[idx];
- if (/* Compare the length of the name. */
- name_len == extra[idx]
- /* Compare the name. */
- && memcmp (name, &extra[idx + 1], name_len) == 0)
- /* Yep, this is the entry. */
- return elem;
- }
- return -1;
-}
-
-/* Local function for parse_bracket_exp used in _LIBC environment.
- Look up the collation sequence value of BR_ELEM.
- Return the value if succeeded, UINT_MAX otherwise. */
-
-static __always_inline unsigned int
-lookup_collation_sequence_value (bracket_elem_t *br_elem, uint32_t nrules,
- const unsigned char *collseqmb,
- const char *collseqwc,
- int_fast32_t table_size,
- const int32_t *symb_table,
- const unsigned char *extra)
-{
- if (br_elem->type == SB_CHAR)
- {
- /* if (MB_CUR_MAX == 1) */
- if (nrules == 0)
- return collseqmb[br_elem->opr.ch];
- else
- {
- wint_t wc = __btowc (br_elem->opr.ch);
- return __collseq_table_lookup (collseqwc, wc);
- }
- }
- else if (br_elem->type == MB_CHAR)
- {
- if (nrules != 0)
- return __collseq_table_lookup (collseqwc, br_elem->opr.wch);
- }
- else if (br_elem->type == COLL_SYM)
- {
- size_t sym_name_len = strlen ((char *) br_elem->opr.name);
- if (nrules != 0)
- {
- int32_t elem, idx;
- elem = seek_collating_symbol_entry (br_elem->opr.name,
- sym_name_len,
- symb_table, table_size,
- extra);
- if (elem != -1)
- {
- /* We found the entry. */
- idx = symb_table[2 * elem + 1];
- /* Skip the name of collating element name. */
- idx += 1 + extra[idx];
- /* Skip the byte sequence of the collating element. */
- idx += 1 + extra[idx];
- /* Adjust for the alignment. */
- idx = (idx + 3) & ~3;
- /* Skip the multibyte collation sequence value. */
- idx += sizeof (unsigned int);
- /* Skip the wide char sequence of the collating element. */
- idx += sizeof (unsigned int) *
- (1 + *(unsigned int *) (extra + idx));
- /* Return the collation sequence value. */
- return *(unsigned int *) (extra + idx);
- }
- else if (sym_name_len == 1)
- {
- /* No valid character. Match it as a single byte
- character. */
- return collseqmb[br_elem->opr.name[0]];
- }
- }
- else if (sym_name_len == 1)
- return collseqmb[br_elem->opr.name[0]];
- }
- return UINT_MAX;
-}
-
-/* Local function for parse_bracket_exp used in _LIBC environment.
- Build the range expression which starts from START_ELEM, and ends
- at END_ELEM. The result are written to MBCSET and SBCSET.
- RANGE_ALLOC is the allocated size of mbcset->range_starts, and
- mbcset->range_ends, is a pointer argument since we may
- update it. */
-
-static __always_inline reg_errcode_t
-build_range_exp (bitset_t sbcset, re_charset_t *mbcset, Idx *range_alloc,
- bracket_elem_t *start_elem, bracket_elem_t *end_elem,
- re_dfa_t *dfa, reg_syntax_t syntax, uint32_t nrules,
- const unsigned char *collseqmb, const char *collseqwc,
- int_fast32_t table_size, const int32_t *symb_table,
- const unsigned char *extra)
-{
- unsigned int ch;
- uint32_t start_collseq;
- uint32_t end_collseq;
-
- /* Equivalence Classes and Character Classes can't be a range
- start/end. */
- if (__glibc_unlikely (start_elem->type == EQUIV_CLASS
- || start_elem->type == CHAR_CLASS
- || end_elem->type == EQUIV_CLASS
- || end_elem->type == CHAR_CLASS))
- return REG_ERANGE;
-
- /* FIXME: Implement rational ranges here, too. */
- start_collseq = lookup_collation_sequence_value (start_elem, nrules, collseqmb, collseqwc,
- table_size, symb_table, extra);
- end_collseq = lookup_collation_sequence_value (end_elem, nrules, collseqmb, collseqwc,
- table_size, symb_table, extra);
- /* Check start/end collation sequence values. */
- if (__glibc_unlikely (start_collseq == UINT_MAX
- || end_collseq == UINT_MAX))
- return REG_ECOLLATE;
- if (__glibc_unlikely ((syntax & RE_NO_EMPTY_RANGES)
- && start_collseq > end_collseq))
- return REG_ERANGE;
-
- /* Got valid collation sequence values, add them as a new entry.
- However, if we have no collation elements, and the character set
- is single byte, the single byte character set that we
- build below suffices. */
- if (nrules > 0 || dfa->mb_cur_max > 1)
- {
- /* Check the space of the arrays. */
- if (__glibc_unlikely (*range_alloc == mbcset->nranges))
- {
- /* There is not enough space, need realloc. */
- uint32_t *new_array_start;
- uint32_t *new_array_end;
- int new_nranges;
-
- /* +1 in case of mbcset->nranges is 0. */
- new_nranges = 2 * mbcset->nranges + 1;
- new_array_start = re_realloc (mbcset->range_starts, uint32_t,
- new_nranges);
- new_array_end = re_realloc (mbcset->range_ends, uint32_t,
- new_nranges);
-
- if (__glibc_unlikely (new_array_start == NULL
- || new_array_end == NULL))
- return REG_ESPACE;
-
- mbcset->range_starts = new_array_start;
- mbcset->range_ends = new_array_end;
- *range_alloc = new_nranges;
- }
-
- mbcset->range_starts[mbcset->nranges] = start_collseq;
- mbcset->range_ends[mbcset->nranges++] = end_collseq;
- }
-
- /* Build the table for single byte characters. */
- for (ch = 0; ch < SBC_MAX; ch++)
- {
- uint32_t ch_collseq;
- /* if (MB_CUR_MAX == 1) */
- if (nrules == 0)
- ch_collseq = collseqmb[ch];
- else
- ch_collseq = __collseq_table_lookup (collseqwc, __btowc (ch));
- if (start_collseq <= ch_collseq && ch_collseq <= end_collseq)
- bitset_set (sbcset, ch);
- }
- return REG_NOERROR;
-}
-
-/* Local function for parse_bracket_exp used in _LIBC environment.
- Build the collating element which is represented by NAME.
- The result are written to MBCSET and SBCSET.
- COLL_SYM_ALLOC is the allocated size of mbcset->coll_sym, is a
- pointer argument since we may update it. */
-
-static __always_inline reg_errcode_t
-build_collating_symbol (bitset_t sbcset, re_charset_t *mbcset,
- Idx *coll_sym_alloc, const unsigned char *name,
- uint_fast32_t nrules, int_fast32_t table_size,
- const int32_t *symb_table, const unsigned char *extra)
-{
- int32_t elem, idx;
- size_t name_len = strlen ((const char *) name);
- if (nrules != 0)
- {
- elem = seek_collating_symbol_entry (name, name_len, symb_table,
- table_size, extra);
- if (elem != -1)
- {
- /* We found the entry. */
- idx = symb_table[2 * elem + 1];
- /* Skip the name of collating element name. */
- idx += 1 + extra[idx];
- }
- else if (name_len == 1)
- {
- /* No valid character, treat it as a normal
- character. */
- bitset_set (sbcset, name[0]);
- return REG_NOERROR;
- }
- else
- return REG_ECOLLATE;
-
- /* Got valid collation sequence, add it as a new entry. */
- /* Check the space of the arrays. */
- if (__glibc_unlikely (*coll_sym_alloc == mbcset->ncoll_syms))
- {
- /* Not enough, realloc it. */
- /* +1 in case of mbcset->ncoll_syms is 0. */
- int new_coll_sym_alloc = 2 * mbcset->ncoll_syms + 1;
- /* Use realloc since mbcset->coll_syms is NULL
- if *alloc == 0. */
- int32_t *new_coll_syms = re_realloc (mbcset->coll_syms, int32_t,
- new_coll_sym_alloc);
- if (__glibc_unlikely (new_coll_syms == NULL))
- return REG_ESPACE;
- mbcset->coll_syms = new_coll_syms;
- *coll_sym_alloc = new_coll_sym_alloc;
- }
- mbcset->coll_syms[mbcset->ncoll_syms++] = idx;
- return REG_NOERROR;
- }
- else
- {
- if (__glibc_unlikely (name_len != 1))
- return REG_ECOLLATE;
- else
- {
- bitset_set (sbcset, name[0]);
- return REG_NOERROR;
- }
- }
-}
-#endif /* _LIBC */
-
-/* This function parse bracket expression like "[abc]", "[a-c]",
- "[[.a-a.]]" etc. */
-
-static bin_tree_t *
-parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token,
- reg_syntax_t syntax, reg_errcode_t *err)
-{
- const unsigned char *collseqmb = NULL;
- const char *collseqwc = NULL;
- uint_fast32_t nrules = 0;
- int_fast32_t table_size = 0;
- const void *symb_table = NULL;
- const unsigned char *extra = NULL;
-
- re_token_t br_token;
- re_bitset_ptr_t sbcset;
- re_charset_t *mbcset;
- Idx coll_sym_alloc = 0, range_alloc = 0, mbchar_alloc = 0;
- Idx equiv_class_alloc = 0, char_class_alloc = 0;
- bool non_match = false;
- bin_tree_t *work_tree;
- int token_len;
- bool first_round = true;
-#ifdef _LIBC
- collseqmb = (const unsigned char *)
- _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQMB);
- nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
- if (nrules)
- {
- /*
- if (MB_CUR_MAX > 1)
- */
- collseqwc = _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQWC);
- table_size = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_SYMB_HASH_SIZEMB);
- symb_table = _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_TABLEMB);
- extra = (const unsigned char *) _NL_CURRENT (LC_COLLATE,
- _NL_COLLATE_SYMB_EXTRAMB);
- }
-#endif
- sbcset = (re_bitset_ptr_t) calloc (sizeof (bitset_t), 1);
- mbcset = (re_charset_t *) calloc (sizeof (re_charset_t), 1);
- if (__glibc_unlikely (sbcset == NULL || mbcset == NULL))
- {
- re_free (sbcset);
- re_free (mbcset);
- *err = REG_ESPACE;
- return NULL;
- }
-
- token_len = peek_token_bracket (token, regexp, syntax);
- if (__glibc_unlikely (token->type == END_OF_RE))
- {
- *err = REG_BADPAT;
- goto parse_bracket_exp_free_return;
- }
- if (token->type == OP_NON_MATCH_LIST)
- {
- mbcset->non_match = 1;
- non_match = true;
- if (syntax & RE_HAT_LISTS_NOT_NEWLINE)
- bitset_set (sbcset, '\n');
- re_string_skip_bytes (regexp, token_len); /* Skip a token. */
- token_len = peek_token_bracket (token, regexp, syntax);
- if (__glibc_unlikely (token->type == END_OF_RE))
- {
- *err = REG_BADPAT;
- goto parse_bracket_exp_free_return;
- }
- }
-
- /* We treat the first ']' as a normal character. */
- if (token->type == OP_CLOSE_BRACKET)
- token->type = CHARACTER;
-
- while (1)
- {
- bracket_elem_t start_elem, end_elem;
- unsigned char start_name_buf[BRACKET_NAME_BUF_SIZE];
- unsigned char end_name_buf[BRACKET_NAME_BUF_SIZE];
- reg_errcode_t ret;
- int token_len2 = 0;
- bool is_range_exp = false;
- re_token_t token2;
-
- start_elem.opr.name = start_name_buf;
- start_elem.type = COLL_SYM;
- ret = parse_bracket_element (&start_elem, regexp, token, token_len, dfa,
- syntax, first_round);
- if (__glibc_unlikely (ret != REG_NOERROR))
- {
- *err = ret;
- goto parse_bracket_exp_free_return;
- }
- first_round = false;
-
- /* Get information about the next token. We need it in any case. */
- token_len = peek_token_bracket (token, regexp, syntax);
-
- /* Do not check for ranges if we know they are not allowed. */
- if (start_elem.type != CHAR_CLASS && start_elem.type != EQUIV_CLASS)
- {
- if (__glibc_unlikely (token->type == END_OF_RE))
- {
- *err = REG_EBRACK;
- goto parse_bracket_exp_free_return;
- }
- if (token->type == OP_CHARSET_RANGE)
- {
- re_string_skip_bytes (regexp, token_len); /* Skip '-'. */
- token_len2 = peek_token_bracket (&token2, regexp, syntax);
- if (__glibc_unlikely (token2.type == END_OF_RE))
- {
- *err = REG_EBRACK;
- goto parse_bracket_exp_free_return;
- }
- if (token2.type == OP_CLOSE_BRACKET)
- {
- /* We treat the last '-' as a normal character. */
- re_string_skip_bytes (regexp, -token_len);
- token->type = CHARACTER;
- }
- else
- is_range_exp = true;
- }
- }
-
- if (is_range_exp == true)
- {
- end_elem.opr.name = end_name_buf;
- end_elem.type = COLL_SYM;
- ret = parse_bracket_element (&end_elem, regexp, &token2, token_len2,
- dfa, syntax, true);
- if (__glibc_unlikely (ret != REG_NOERROR))
- {
- *err = ret;
- goto parse_bracket_exp_free_return;
- }
-
- token_len = peek_token_bracket (token, regexp, syntax);
-
- *err = build_range_exp (sbcset, mbcset, &range_alloc,
- &start_elem, &end_elem,
- dfa, syntax, nrules, collseqmb, collseqwc,
- table_size, symb_table, extra);
- if (__glibc_unlikely (*err != REG_NOERROR))
- goto parse_bracket_exp_free_return;
- }
- else
- {
- switch (start_elem.type)
- {
- case SB_CHAR:
- bitset_set (sbcset, start_elem.opr.ch);
- break;
- case MB_CHAR:
- /* Check whether the array has enough space. */
- if (__glibc_unlikely (mbchar_alloc == mbcset->nmbchars))
- {
- wchar_t *new_mbchars;
- /* Not enough, realloc it. */
- /* +1 in case of mbcset->nmbchars is 0. */
- mbchar_alloc = 2 * mbcset->nmbchars + 1;
- /* Use realloc since array is NULL if *alloc == 0. */
- new_mbchars = re_realloc (mbcset->mbchars, wchar_t,
- mbchar_alloc);
- if (__glibc_unlikely (new_mbchars == NULL))
- goto parse_bracket_exp_espace;
- mbcset->mbchars = new_mbchars;
- }
- mbcset->mbchars[mbcset->nmbchars++] = start_elem.opr.wch;
- break;
- case EQUIV_CLASS:
- *err = build_equiv_class (sbcset,
- mbcset, &equiv_class_alloc,
- start_elem.opr.name);
- if (__glibc_unlikely (*err != REG_NOERROR))
- goto parse_bracket_exp_free_return;
- break;
- case COLL_SYM:
- *err = build_collating_symbol (sbcset,
- mbcset, &coll_sym_alloc,
- start_elem.opr.name,
- nrules, table_size, symb_table, extra);
- if (__glibc_unlikely (*err != REG_NOERROR))
- goto parse_bracket_exp_free_return;
- break;
- case CHAR_CLASS:
- *err = build_charclass (regexp->trans, sbcset,
- mbcset, &char_class_alloc,
- (const char *) start_elem.opr.name,
- syntax);
- if (__glibc_unlikely (*err != REG_NOERROR))
- goto parse_bracket_exp_free_return;
- break;
- default:
- DEBUG_ASSERT (false);
- break;
- }
- }
- if (__glibc_unlikely (token->type == END_OF_RE))
- {
- *err = REG_EBRACK;
- goto parse_bracket_exp_free_return;
- }
- if (token->type == OP_CLOSE_BRACKET)
- break;
- }
-
- re_string_skip_bytes (regexp, token_len); /* Skip a token. */
-
- /* If it is non-matching list. */
- if (non_match)
- bitset_not (sbcset);
-
- /* Ensure only single byte characters are set. */
- if (dfa->mb_cur_max > 1)
- bitset_mask (sbcset, dfa->sb_char);
-
- if (mbcset->nmbchars || mbcset->ncoll_syms || mbcset->nequiv_classes
- || mbcset->nranges || (dfa->mb_cur_max > 1 && (mbcset->nchar_classes
- || mbcset->non_match)))
- {
- bin_tree_t *mbc_tree;
- int sbc_idx;
- /* Build a tree for complex bracket. */
- dfa->has_mb_node = 1;
- br_token.type = COMPLEX_BRACKET;
- br_token.opr.mbcset = mbcset;
- mbc_tree = create_token_tree (dfa, NULL, NULL, &br_token);
- if (__glibc_unlikely (mbc_tree == NULL))
- goto parse_bracket_exp_espace;
- for (sbc_idx = 0; sbc_idx < BITSET_WORDS; ++sbc_idx)
- if (sbcset[sbc_idx])
- break;
- /* If there are no bits set in sbcset, there is no point
- of having both SIMPLE_BRACKET and COMPLEX_BRACKET. */
- if (sbc_idx < BITSET_WORDS)
- {
- /* Build a tree for simple bracket. */
- br_token.type = SIMPLE_BRACKET;
- br_token.opr.sbcset = sbcset;
- work_tree = create_token_tree (dfa, NULL, NULL, &br_token);
- if (__glibc_unlikely (work_tree == NULL))
- goto parse_bracket_exp_espace;
-
- /* Then join them by ALT node. */
- work_tree = create_tree (dfa, work_tree, mbc_tree, OP_ALT);
- if (__glibc_unlikely (work_tree == NULL))
- goto parse_bracket_exp_espace;
- }
- else
- {
- re_free (sbcset);
- work_tree = mbc_tree;
- }
- }
- else
- {
- free_charset (mbcset);
- /* Build a tree for simple bracket. */
- br_token.type = SIMPLE_BRACKET;
- br_token.opr.sbcset = sbcset;
- work_tree = create_token_tree (dfa, NULL, NULL, &br_token);
- if (__glibc_unlikely (work_tree == NULL))
- goto parse_bracket_exp_espace;
- }
- return work_tree;
-
- parse_bracket_exp_espace:
- *err = REG_ESPACE;
- parse_bracket_exp_free_return:
- re_free (sbcset);
- free_charset (mbcset);
- return NULL;
-}
-
-/* Parse an element in the bracket expression. */
-
-static reg_errcode_t
-parse_bracket_element (bracket_elem_t *elem, re_string_t *regexp,
- re_token_t *token, int token_len, re_dfa_t *dfa,
- reg_syntax_t syntax, bool accept_hyphen)
-{
- int cur_char_size;
- cur_char_size = re_string_char_size_at (regexp, re_string_cur_idx (regexp));
- if (cur_char_size > 1)
- {
- elem->type = MB_CHAR;
- elem->opr.wch = re_string_wchar_at (regexp, re_string_cur_idx (regexp));
- re_string_skip_bytes (regexp, cur_char_size);
- return REG_NOERROR;
- }
- re_string_skip_bytes (regexp, token_len); /* Skip a token. */
- if (token->type == OP_OPEN_COLL_ELEM || token->type == OP_OPEN_CHAR_CLASS
- || token->type == OP_OPEN_EQUIV_CLASS)
- return parse_bracket_symbol (elem, regexp, token);
- if (__glibc_unlikely (token->type == OP_CHARSET_RANGE) && !accept_hyphen)
- {
- /* A '-' must only appear as anything but a range indicator before
- the closing bracket. Everything else is an error. */
- re_token_t token2;
- (void) peek_token_bracket (&token2, regexp, syntax);
- if (token2.type != OP_CLOSE_BRACKET)
- /* The actual error value is not standardized since this whole
- case is undefined. But ERANGE makes good sense. */
- return REG_ERANGE;
- }
- elem->type = SB_CHAR;
- elem->opr.ch = token->opr.c;
- return REG_NOERROR;
-}
-
-/* Parse a bracket symbol in the bracket expression. Bracket symbols are
- such as [:<character_class>:], [.<collating_element>.], and
- [=<equivalent_class>=]. */
-
-static reg_errcode_t
-parse_bracket_symbol (bracket_elem_t *elem, re_string_t *regexp,
- re_token_t *token)
-{
- unsigned char ch, delim = token->opr.c;
- int i = 0;
- if (re_string_eoi(regexp))
- return REG_EBRACK;
- for (;; ++i)
- {
- if (i >= BRACKET_NAME_BUF_SIZE)
- return REG_EBRACK;
- if (token->type == OP_OPEN_CHAR_CLASS)
- ch = re_string_fetch_byte_case (regexp);
- else
- ch = re_string_fetch_byte (regexp);
- if (re_string_eoi(regexp))
- return REG_EBRACK;
- if (ch == delim && re_string_peek_byte (regexp, 0) == ']')
- break;
- elem->opr.name[i] = ch;
- }
- re_string_skip_bytes (regexp, 1);
- elem->opr.name[i] = '\0';
- switch (token->type)
- {
- case OP_OPEN_COLL_ELEM:
- elem->type = COLL_SYM;
- break;
- case OP_OPEN_EQUIV_CLASS:
- elem->type = EQUIV_CLASS;
- break;
- case OP_OPEN_CHAR_CLASS:
- elem->type = CHAR_CLASS;
- break;
- default:
- break;
- }
- return REG_NOERROR;
-}
-
- /* Helper function for parse_bracket_exp.
- Build the equivalence class which is represented by NAME.
- The result are written to MBCSET and SBCSET.
- EQUIV_CLASS_ALLOC is the allocated size of mbcset->equiv_classes,
- is a pointer argument since we may update it. */
-
-static reg_errcode_t
-build_equiv_class (bitset_t sbcset, re_charset_t *mbcset,
- Idx *equiv_class_alloc, const unsigned char *name)
-{
-#ifdef _LIBC
- uint32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
- if (nrules != 0)
- {
- const int32_t *table, *indirect;
- const unsigned char *weights, *extra, *cp;
- unsigned char char_buf[2];
- int32_t idx1, idx2;
- unsigned int ch;
- size_t len;
- /* Calculate the index for equivalence class. */
- cp = name;
- table = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
- weights = (const unsigned char *) _NL_CURRENT (LC_COLLATE,
- _NL_COLLATE_WEIGHTMB);
- extra = (const unsigned char *) _NL_CURRENT (LC_COLLATE,
- _NL_COLLATE_EXTRAMB);
- indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE,
- _NL_COLLATE_INDIRECTMB);
- idx1 = findidx (table, indirect, extra, &cp, -1);
- if (__glibc_unlikely (idx1 == 0 || *cp != '\0'))
- /* This isn't a valid character. */
- return REG_ECOLLATE;
-
- /* Build single byte matching table for this equivalence class. */
- len = weights[idx1 & 0xffffff];
- for (ch = 0; ch < SBC_MAX; ++ch)
- {
- char_buf[0] = ch;
- cp = char_buf;
- idx2 = findidx (table, indirect, extra, &cp, 1);
-/*
- idx2 = table[ch];
-*/
- if (idx2 == 0)
- /* This isn't a valid character. */
- continue;
- /* Compare only if the length matches and the collation rule
- index is the same. */
- if (len == weights[idx2 & 0xffffff] && (idx1 >> 24) == (idx2 >> 24)
- && memcmp (weights + (idx1 & 0xffffff) + 1,
- weights + (idx2 & 0xffffff) + 1, len) == 0)
- bitset_set (sbcset, ch);
- }
- /* Check whether the array has enough space. */
- if (__glibc_unlikely (*equiv_class_alloc == mbcset->nequiv_classes))
- {
- /* Not enough, realloc it. */
- /* +1 in case of mbcset->nequiv_classes is 0. */
- Idx new_equiv_class_alloc = 2 * mbcset->nequiv_classes + 1;
- /* Use realloc since the array is NULL if *alloc == 0. */
- int32_t *new_equiv_classes = re_realloc (mbcset->equiv_classes,
- int32_t,
- new_equiv_class_alloc);
- if (__glibc_unlikely (new_equiv_classes == NULL))
- return REG_ESPACE;
- mbcset->equiv_classes = new_equiv_classes;
- *equiv_class_alloc = new_equiv_class_alloc;
- }
- mbcset->equiv_classes[mbcset->nequiv_classes++] = idx1;
- }
- else
-#endif /* _LIBC */
- {
- if (__glibc_unlikely (strlen ((const char *) name) != 1))
- return REG_ECOLLATE;
- bitset_set (sbcset, *name);
- }
- return REG_NOERROR;
-}
-
- /* Helper function for parse_bracket_exp.
- Build the character class which is represented by NAME.
- The result are written to MBCSET and SBCSET.
- CHAR_CLASS_ALLOC is the allocated size of mbcset->char_classes,
- is a pointer argument since we may update it. */
-
-static reg_errcode_t
-build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset,
- re_charset_t *mbcset, Idx *char_class_alloc,
- const char *class_name, reg_syntax_t syntax)
-{
- int i;
- const char *name = class_name;
-
- /* In case of REG_ICASE "upper" and "lower" match the both of
- upper and lower cases. */
- if ((syntax & RE_ICASE)
- && (strcmp (name, "upper") == 0 || strcmp (name, "lower") == 0))
- name = "alpha";
-
- /* Check the space of the arrays. */
- if (__glibc_unlikely (*char_class_alloc == mbcset->nchar_classes))
- {
- /* Not enough, realloc it. */
- /* +1 in case of mbcset->nchar_classes is 0. */
- Idx new_char_class_alloc = 2 * mbcset->nchar_classes + 1;
- /* Use realloc since array is NULL if *alloc == 0. */
- wctype_t *new_char_classes = re_realloc (mbcset->char_classes, wctype_t,
- new_char_class_alloc);
- if (__glibc_unlikely (new_char_classes == NULL))
- return REG_ESPACE;
- mbcset->char_classes = new_char_classes;
- *char_class_alloc = new_char_class_alloc;
- }
- mbcset->char_classes[mbcset->nchar_classes++] = __wctype (name);
-
-#define BUILD_CHARCLASS_LOOP(ctype_func) \
- do { \
- if (__glibc_unlikely (trans != NULL)) \
- { \
- for (i = 0; i < SBC_MAX; ++i) \
- if (ctype_func (i)) \
- bitset_set (sbcset, trans[i]); \
- } \
- else \
- { \
- for (i = 0; i < SBC_MAX; ++i) \
- if (ctype_func (i)) \
- bitset_set (sbcset, i); \
- } \
- } while (0)
-
- if (strcmp (name, "alnum") == 0)
- BUILD_CHARCLASS_LOOP (isalnum);
- else if (strcmp (name, "cntrl") == 0)
- BUILD_CHARCLASS_LOOP (iscntrl);
- else if (strcmp (name, "lower") == 0)
- BUILD_CHARCLASS_LOOP (islower);
- else if (strcmp (name, "space") == 0)
- BUILD_CHARCLASS_LOOP (isspace);
- else if (strcmp (name, "alpha") == 0)
- BUILD_CHARCLASS_LOOP (isalpha);
- else if (strcmp (name, "digit") == 0)
- BUILD_CHARCLASS_LOOP (isdigit);
- else if (strcmp (name, "print") == 0)
- BUILD_CHARCLASS_LOOP (isprint);
- else if (strcmp (name, "upper") == 0)
- BUILD_CHARCLASS_LOOP (isupper);
- else if (strcmp (name, "blank") == 0)
- BUILD_CHARCLASS_LOOP (isblank);
- else if (strcmp (name, "graph") == 0)
- BUILD_CHARCLASS_LOOP (isgraph);
- else if (strcmp (name, "punct") == 0)
- BUILD_CHARCLASS_LOOP (ispunct);
- else if (strcmp (name, "xdigit") == 0)
- BUILD_CHARCLASS_LOOP (isxdigit);
- else
- return REG_ECTYPE;
-
- return REG_NOERROR;
-}
-
-static bin_tree_t *
-build_charclass_op (re_dfa_t *dfa, RE_TRANSLATE_TYPE trans,
- const char *class_name,
- const char *extra, bool non_match,
- reg_errcode_t *err)
-{
- re_bitset_ptr_t sbcset;
- re_charset_t *mbcset;
- Idx alloc = 0;
- reg_errcode_t ret;
- bin_tree_t *tree;
-
- sbcset = (re_bitset_ptr_t) calloc (sizeof (bitset_t), 1);
- if (__glibc_unlikely (sbcset == NULL))
- {
- *err = REG_ESPACE;
- return NULL;
- }
- mbcset = (re_charset_t *) calloc (sizeof (re_charset_t), 1);
- if (__glibc_unlikely (mbcset == NULL))
- {
- re_free (sbcset);
- *err = REG_ESPACE;
- return NULL;
- }
- mbcset->non_match = non_match;
-
- /* We don't care the syntax in this case. */
- ret = build_charclass (trans, sbcset, mbcset, &alloc, class_name, 0);
-
- if (__glibc_unlikely (ret != REG_NOERROR))
- {
- re_free (sbcset);
- free_charset (mbcset);
- *err = ret;
- return NULL;
- }
- /* \w match '_' also. */
- for (; *extra; extra++)
- bitset_set (sbcset, *extra);
-
- /* If it is non-matching list. */
- if (non_match)
- bitset_not (sbcset);
-
- /* Ensure only single byte characters are set. */
- if (dfa->mb_cur_max > 1)
- bitset_mask (sbcset, dfa->sb_char);
-
- /* Build a tree for simple bracket. */
- re_token_t br_token = { .type = SIMPLE_BRACKET, .opr.sbcset = sbcset };
- tree = create_token_tree (dfa, NULL, NULL, &br_token);
- if (__glibc_unlikely (tree == NULL))
- goto build_word_op_espace;
-
- if (dfa->mb_cur_max > 1)
- {
- bin_tree_t *mbc_tree;
- /* Build a tree for complex bracket. */
- br_token.type = COMPLEX_BRACKET;
- br_token.opr.mbcset = mbcset;
- dfa->has_mb_node = 1;
- mbc_tree = create_token_tree (dfa, NULL, NULL, &br_token);
- if (__glibc_unlikely (mbc_tree == NULL))
- goto build_word_op_espace;
- /* Then join them by ALT node. */
- tree = create_tree (dfa, tree, mbc_tree, OP_ALT);
- if (__glibc_likely (mbc_tree != NULL))
- return tree;
- }
- else
- {
- free_charset (mbcset);
- return tree;
- }
-
- build_word_op_espace:
- re_free (sbcset);
- free_charset (mbcset);
- *err = REG_ESPACE;
- return NULL;
-}
-
-/* This is intended for the expressions like "a{1,3}".
- Fetch a number from 'input', and return the number.
- Return -1 if the number field is empty like "{,1}".
- Return RE_DUP_MAX + 1 if the number field is too large.
- Return -2 if an error occurred. */
-
-static Idx
-fetch_number (re_string_t *input, re_token_t *token, reg_syntax_t syntax)
-{
- Idx num = -1;
- unsigned char c;
- while (1)
- {
- fetch_token (token, input, syntax);
- c = token->opr.c;
- if (__glibc_unlikely (token->type == END_OF_RE))
- return -2;
- if (token->type == OP_CLOSE_DUP_NUM || c == ',')
- break;
- num = ((token->type != CHARACTER || c < '0' || '9' < c || num == -2)
- ? -2
- : num == -1
- ? c - '0'
- : MIN (RE_DUP_MAX + 1, num * 10 + c - '0'));
- }
- return num;
-}
-
-static void
-free_charset (re_charset_t *cset)
-{
- re_free (cset->mbchars);
-#ifdef _LIBC
- re_free (cset->coll_syms);
- re_free (cset->equiv_classes);
-#endif
- re_free (cset->range_starts);
- re_free (cset->range_ends);
- re_free (cset->char_classes);
- re_free (cset);
-}
-
-/* Functions for binary tree operation. */
-
-/* Create a tree node. */
-
-static bin_tree_t *
-create_tree (re_dfa_t *dfa, bin_tree_t *left, bin_tree_t *right,
- re_token_type_t type)
-{
- re_token_t t = { .type = type };
- return create_token_tree (dfa, left, right, &t);
-}
-
-static bin_tree_t *
-create_token_tree (re_dfa_t *dfa, bin_tree_t *left, bin_tree_t *right,
- const re_token_t *token)
-{
- bin_tree_t *tree;
- if (__glibc_unlikely (dfa->str_tree_storage_idx == BIN_TREE_STORAGE_SIZE))
- {
- bin_tree_storage_t *storage = re_malloc (bin_tree_storage_t, 1);
-
- if (storage == NULL)
- return NULL;
- storage->next = dfa->str_tree_storage;
- dfa->str_tree_storage = storage;
- dfa->str_tree_storage_idx = 0;
- }
- tree = &dfa->str_tree_storage->data[dfa->str_tree_storage_idx++];
-
- tree->parent = NULL;
- tree->left = left;
- tree->right = right;
- tree->token = *token;
- tree->token.duplicated = 0;
- tree->token.opt_subexp = 0;
- tree->first = NULL;
- tree->next = NULL;
- tree->node_idx = -1;
-
- if (left != NULL)
- left->parent = tree;
- if (right != NULL)
- right->parent = tree;
- return tree;
-}
-
-/* Mark the tree SRC as an optional subexpression.
- To be called from preorder or postorder. */
-
-static reg_errcode_t
-mark_opt_subexp (void *extra, bin_tree_t *node)
-{
- Idx idx = (uintptr_t) extra;
- if (node->token.type == SUBEXP && node->token.opr.idx == idx)
- node->token.opt_subexp = 1;
-
- return REG_NOERROR;
-}
-
-/* Free the allocated memory inside NODE. */
-
-static void
-free_token (re_token_t *node)
-{
- if (node->type == COMPLEX_BRACKET && node->duplicated == 0)
- free_charset (node->opr.mbcset);
- else if (node->type == SIMPLE_BRACKET && node->duplicated == 0)
- re_free (node->opr.sbcset);
-}
-
-/* Worker function for tree walking. Free the allocated memory inside NODE
- and its children. */
-
-static reg_errcode_t
-free_tree (void *extra, bin_tree_t *node)
-{
- free_token (&node->token);
- return REG_NOERROR;
-}
-
-
-/* Duplicate the node SRC, and return new node. This is a preorder
- visit similar to the one implemented by the generic visitor, but
- we need more infrastructure to maintain two parallel trees --- so,
- it's easier to duplicate. */
-
-static bin_tree_t *
-duplicate_tree (const bin_tree_t *root, re_dfa_t *dfa)
-{
- const bin_tree_t *node;
- bin_tree_t *dup_root;
- bin_tree_t **p_new = &dup_root, *dup_node = root->parent;
-
- for (node = root; ; )
- {
- /* Create a new tree and link it back to the current parent. */
- *p_new = create_token_tree (dfa, NULL, NULL, &node->token);
- if (*p_new == NULL)
- return NULL;
- (*p_new)->parent = dup_node;
- (*p_new)->token.duplicated = 1;
- dup_node = *p_new;
-
- /* Go to the left node, or up and to the right. */
- if (node->left)
- {
- node = node->left;
- p_new = &dup_node->left;
- }
- else
- {
- const bin_tree_t *prev = NULL;
- while (node->right == prev || node->right == NULL)
- {
- prev = node;
- node = node->parent;
- dup_node = dup_node->parent;
- if (!node)
- return dup_root;
- }
- node = node->right;
- p_new = &dup_node->right;
- }
- }
-}
diff --git a/cross/lib/regex.c b/cross/lib/regex.c
deleted file mode 100644
index 3beb0deb987..00000000000
--- a/cross/lib/regex.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/* Extended regular expression matching and search library.
- Copyright (C) 2002-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
-
- 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/>. */
-
-#define __STDC_WANT_IEC_60559_BFP_EXT__
-
-#ifndef _LIBC
-# include <libc-config.h>
-
-# if __GNUC_PREREQ (4, 6)
-# pragma GCC diagnostic ignored "-Wsuggest-attribute=pure"
-# pragma GCC diagnostic ignored "-Wvla"
-# endif
-# if __GNUC_PREREQ (4, 3)
-# pragma GCC diagnostic ignored "-Wold-style-definition"
-# pragma GCC diagnostic ignored "-Wtype-limits"
-# endif
-#endif
-
-/* Make sure no one compiles this code with a C++ compiler. */
-#if defined __cplusplus && defined _LIBC
-# error "This is C code, use a C compiler"
-#endif
-
-#ifdef _LIBC
-/* We have to keep the namespace clean. */
-# define regfree(preg) __regfree (preg)
-# define regexec(pr, st, nm, pm, ef) __regexec (pr, st, nm, pm, ef)
-# define regcomp(preg, pattern, cflags) __regcomp (preg, pattern, cflags)
-# define regerror(errcode, preg, errbuf, errbuf_size) \
- __regerror(errcode, preg, errbuf, errbuf_size)
-# define re_set_registers(bu, re, nu, st, en) \
- __re_set_registers (bu, re, nu, st, en)
-# define re_match_2(bufp, string1, size1, string2, size2, pos, regs, stop) \
- __re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop)
-# define re_match(bufp, string, size, pos, regs) \
- __re_match (bufp, string, size, pos, regs)
-# define re_search(bufp, string, size, startpos, range, regs) \
- __re_search (bufp, string, size, startpos, range, regs)
-# define re_compile_pattern(pattern, length, bufp) \
- __re_compile_pattern (pattern, length, bufp)
-# define re_set_syntax(syntax) __re_set_syntax (syntax)
-# define re_search_2(bufp, st1, s1, st2, s2, startpos, range, regs, stop) \
- __re_search_2 (bufp, st1, s1, st2, s2, startpos, range, regs, stop)
-# define re_compile_fastmap(bufp) __re_compile_fastmap (bufp)
-
-# include "../locale/localeinfo.h"
-#endif
-
-/* On some systems, limits.h sets RE_DUP_MAX to a lower value than
- GNU regex allows. Include it before <regex.h>, which correctly
- #undefs RE_DUP_MAX and sets it to the right value. */
-#include <limits.h>
-
-#include <regex.h>
-#include "regex_internal.h"
-
-#include "regex_internal.c"
-#include "regcomp.c"
-#include "regexec.c"
-
-/* Binary backward compatibility. */
-#if _LIBC
-# include <shlib-compat.h>
-# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3)
-link_warning (re_max_failures, "the 're_max_failures' variable is obsolete and will go away.")
-int re_max_failures = 2000;
-# endif
-#endif
diff --git a/cross/lib/regex.h b/cross/lib/regex.h
deleted file mode 100644
index 9ef0252ffff..00000000000
--- a/cross/lib/regex.h
+++ /dev/null
@@ -1,699 +0,0 @@
-/* Definitions for data structures and routines for the regular
- expression library.
- Copyright (C) 1985, 1989-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _REGEX_H
-#define _REGEX_H 1
-
-#include <sys/types.h>
-
-/* Allow the use in C++ code. */
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Define __USE_GNU to declare GNU extensions that violate the
- POSIX name space rules. */
-#ifdef _GNU_SOURCE
-# define __USE_GNU 1
-#endif
-
-#ifdef _REGEX_LARGE_OFFSETS
-
-/* Use types and values that are wide enough to represent signed and
- unsigned byte offsets in memory. This currently works only when
- the regex code is used outside of the GNU C library; it is not yet
- supported within glibc itself, and glibc users should not define
- _REGEX_LARGE_OFFSETS. */
-
-/* The type of object sizes. */
-typedef size_t __re_size_t;
-
-/* The type of object sizes, in places where the traditional code
- uses unsigned long int. */
-typedef size_t __re_long_size_t;
-
-#else
-
-/* The traditional GNU regex implementation mishandles strings longer
- than INT_MAX. */
-typedef unsigned int __re_size_t;
-typedef unsigned long int __re_long_size_t;
-
-#endif
-
-/* The following two types have to be signed and unsigned integer type
- wide enough to hold a value of a pointer. For most ANSI compilers
- ptrdiff_t and size_t should be likely OK. Still size of these two
- types is 2 for Microsoft C. Ugh... */
-typedef long int s_reg_t;
-typedef unsigned long int active_reg_t;
-
-/* The following bits are used to determine the regexp syntax we
- recognize. The set/not-set meanings are chosen so that Emacs syntax
- remains the value 0. The bits are given in alphabetical order, and
- the definitions shifted by one from the previous bit; thus, when we
- add or remove a bit, only one other definition need change. */
-typedef unsigned long int reg_syntax_t;
-
-#ifdef __USE_GNU
-/* If this bit is not set, then \ inside a bracket expression is literal.
- If set, then such a \ quotes the following character. */
-# define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long int) 1)
-
-/* If this bit is not set, then + and ? are operators, and \+ and \? are
- literals.
- If set, then \+ and \? are operators and + and ? are literals. */
-# define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1)
-
-/* If this bit is set, then character classes are supported. They are:
- [:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:],
- [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:].
- If not set, then character classes are not supported. */
-# define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1)
-
-/* If this bit is set, then ^ and $ are always anchors (outside bracket
- expressions, of course).
- If this bit is not set, then it depends:
- ^ is an anchor if it is at the beginning of a regular
- expression or after an open-group or an alternation operator;
- $ is an anchor if it is at the end of a regular expression, or
- before a close-group or an alternation operator.
-
- This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because
- POSIX draft 11.2 says that * etc. in leading positions is undefined.
- We already implemented a previous draft which made those constructs
- invalid, though, so we haven't changed the code back. */
-# define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1)
-
-/* If this bit is set, then special characters are always special
- regardless of where they are in the pattern.
- If this bit is not set, then special characters are special only in
- some contexts; otherwise they are ordinary. Specifically,
- * + ? and intervals are only special when not after the beginning,
- open-group, or alternation operator. */
-# define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1)
-
-/* If this bit is set, then *, +, ?, and { cannot be first in an re or
- immediately after an alternation or begin-group operator. */
-# define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1)
-
-/* If this bit is set, then . matches newline.
- If not set, then it doesn't. */
-# define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1)
-
-/* If this bit is set, then . doesn't match NUL.
- If not set, then it does. */
-# define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1)
-
-/* If this bit is set, nonmatching lists [^...] do not match newline.
- If not set, they do. */
-# define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1)
-
-/* If this bit is set, either \{...\} or {...} defines an
- interval, depending on RE_NO_BK_BRACES.
- If not set, \{, \}, {, and } are literals. */
-# define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1)
-
-/* If this bit is set, +, ? and | aren't recognized as operators.
- If not set, they are. */
-# define RE_LIMITED_OPS (RE_INTERVALS << 1)
-
-/* If this bit is set, newline is an alternation operator.
- If not set, newline is literal. */
-# define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1)
-
-/* If this bit is set, then '{...}' defines an interval, and \{ and \}
- are literals.
- If not set, then '\{...\}' defines an interval. */
-# define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1)
-
-/* If this bit is set, (...) defines a group, and \( and \) are literals.
- If not set, \(...\) defines a group, and ( and ) are literals. */
-# define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1)
-
-/* If this bit is set, then \<digit> matches <digit>.
- If not set, then \<digit> is a back-reference. */
-# define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1)
-
-/* If this bit is set, then | is an alternation operator, and \| is literal.
- If not set, then \| is an alternation operator, and | is literal. */
-# define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1)
-
-/* If this bit is set, then an ending range point collating higher
- than the starting range point, as in [z-a], is invalid.
- If not set, then when ending range point collates higher than the
- starting range point, the range is ignored. */
-# define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1)
-
-/* If this bit is set, then an unmatched ) is ordinary.
- If not set, then an unmatched ) is invalid. */
-# define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1)
-
-/* If this bit is set, succeed as soon as we match the whole pattern,
- without further backtracking. */
-# define RE_NO_POSIX_BACKTRACKING (RE_UNMATCHED_RIGHT_PAREN_ORD << 1)
-
-/* If this bit is set, do not process the GNU regex operators.
- If not set, then the GNU regex operators are recognized. */
-# define RE_NO_GNU_OPS (RE_NO_POSIX_BACKTRACKING << 1)
-
-/* If this bit is set, turn on internal regex debugging.
- If not set, and debugging was on, turn it off.
- This only works if regex.c is compiled -DDEBUG.
- We define this bit always, so that all that's needed to turn on
- debugging is to recompile regex.c; the calling code can always have
- this bit set, and it won't affect anything in the normal case. */
-# define RE_DEBUG (RE_NO_GNU_OPS << 1)
-
-/* If this bit is set, a syntactically invalid interval is treated as
- a string of ordinary characters. For example, the ERE 'a{1' is
- treated as 'a\{1'. */
-# define RE_INVALID_INTERVAL_ORD (RE_DEBUG << 1)
-
-/* If this bit is set, then ignore case when matching.
- If not set, then case is significant. */
-# define RE_ICASE (RE_INVALID_INTERVAL_ORD << 1)
-
-/* This bit is used internally like RE_CONTEXT_INDEP_ANCHORS but only
- for ^, because it is difficult to scan the regex backwards to find
- whether ^ should be special. */
-# define RE_CARET_ANCHORS_HERE (RE_ICASE << 1)
-
-/* If this bit is set, then \{ cannot be first in a regex or
- immediately after an alternation, open-group or \} operator. */
-# define RE_CONTEXT_INVALID_DUP (RE_CARET_ANCHORS_HERE << 1)
-
-/* If this bit is set, then no_sub will be set to 1 during
- re_compile_pattern. */
-# define RE_NO_SUB (RE_CONTEXT_INVALID_DUP << 1)
-#endif
-
-/* This global variable defines the particular regexp syntax to use (for
- some interfaces). When a regexp is compiled, the syntax used is
- stored in the pattern buffer, so changing this does not affect
- already-compiled regexps. */
-extern reg_syntax_t re_syntax_options;
-
-#ifdef __USE_GNU
-/* Define combinations of the above bits for the standard possibilities.
- (The [[[ comments delimit what gets put into the Texinfo file, so
- don't delete them!) */
-/* [[[begin syntaxes]]] */
-# define RE_SYNTAX_EMACS 0
-
-# define RE_SYNTAX_AWK \
- (RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \
- | RE_NO_BK_PARENS | RE_NO_BK_REFS \
- | RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \
- | RE_DOT_NEWLINE | RE_CONTEXT_INDEP_ANCHORS \
- | RE_CHAR_CLASSES \
- | RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS)
-
-# define RE_SYNTAX_GNU_AWK \
- ((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS \
- | RE_INVALID_INTERVAL_ORD) \
- & ~(RE_DOT_NOT_NULL | RE_CONTEXT_INDEP_OPS \
- | RE_CONTEXT_INVALID_OPS ))
-
-# define RE_SYNTAX_POSIX_AWK \
- (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS \
- | RE_INTERVALS | RE_NO_GNU_OPS \
- | RE_INVALID_INTERVAL_ORD)
-
-# define RE_SYNTAX_GREP \
- ((RE_SYNTAX_POSIX_BASIC | RE_NEWLINE_ALT) \
- & ~(RE_CONTEXT_INVALID_DUP | RE_DOT_NOT_NULL))
-
-# define RE_SYNTAX_EGREP \
- ((RE_SYNTAX_POSIX_EXTENDED | RE_INVALID_INTERVAL_ORD | RE_NEWLINE_ALT) \
- & ~(RE_CONTEXT_INVALID_OPS | RE_DOT_NOT_NULL))
-
-/* POSIX grep -E behavior is no longer incompatible with GNU. */
-# define RE_SYNTAX_POSIX_EGREP \
- RE_SYNTAX_EGREP
-
-/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */
-# define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC
-
-# define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC
-
-/* Syntax bits common to both basic and extended POSIX regex syntax. */
-# define _RE_SYNTAX_POSIX_COMMON \
- (RE_CHAR_CLASSES | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \
- | RE_INTERVALS | RE_NO_EMPTY_RANGES)
-
-# define RE_SYNTAX_POSIX_BASIC \
- (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM | RE_CONTEXT_INVALID_DUP)
-
-/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes
- RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this
- isn't minimal, since other operators, such as \`, aren't disabled. */
-# define RE_SYNTAX_POSIX_MINIMAL_BASIC \
- (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS)
-
-# define RE_SYNTAX_POSIX_EXTENDED \
- (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \
- | RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES \
- | RE_NO_BK_PARENS | RE_NO_BK_VBAR \
- | RE_CONTEXT_INVALID_OPS | RE_UNMATCHED_RIGHT_PAREN_ORD)
-
-/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INDEP_OPS is
- removed and RE_NO_BK_REFS is added. */
-# define RE_SYNTAX_POSIX_MINIMAL_EXTENDED \
- (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \
- | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES \
- | RE_NO_BK_PARENS | RE_NO_BK_REFS \
- | RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD)
-/* [[[end syntaxes]]] */
-
-/* Maximum number of duplicates an interval can allow. POSIX-conforming
- systems might define this in <limits.h>, but we want our
- value, so remove any previous define. */
-# ifdef _REGEX_INCLUDE_LIMITS_H
-# include <limits.h>
-# endif
-# ifdef RE_DUP_MAX
-# undef RE_DUP_MAX
-# endif
-
-/* RE_DUP_MAX is 2**15 - 1 because an earlier implementation stored
- the counter as a 2-byte signed integer. This is no longer true, so
- RE_DUP_MAX could be increased to (INT_MAX / 10 - 1), or to
- ((SIZE_MAX - 9) / 10) if _REGEX_LARGE_OFFSETS is defined.
- However, there would be a huge performance problem if someone
- actually used a pattern like a\{214748363\}, so RE_DUP_MAX retains
- its historical value. */
-# define RE_DUP_MAX (0x7fff)
-#endif
-
-
-/* POSIX 'cflags' bits (i.e., information for 'regcomp'). */
-
-/* If this bit is set, then use extended regular expression syntax.
- If not set, then use basic regular expression syntax. */
-#define REG_EXTENDED 1
-
-/* If this bit is set, then ignore case when matching.
- If not set, then case is significant. */
-#define REG_ICASE (1 << 1)
-
-/* If this bit is set, then anchors do not match at newline
- characters in the string.
- If not set, then anchors do match at newlines. */
-#define REG_NEWLINE (1 << 2)
-
-/* If this bit is set, then report only success or fail in regexec.
- If not set, then returns differ between not matching and errors. */
-#define REG_NOSUB (1 << 3)
-
-
-/* POSIX 'eflags' bits (i.e., information for regexec). */
-
-/* If this bit is set, then the beginning-of-line operator doesn't match
- the beginning of the string (presumably because it's not the
- beginning of a line).
- If not set, then the beginning-of-line operator does match the
- beginning of the string. */
-#define REG_NOTBOL 1
-
-/* Like REG_NOTBOL, except for the end-of-line. */
-#define REG_NOTEOL (1 << 1)
-
-/* Use PMATCH[0] to delimit the start and end of the search in the
- buffer. */
-#define REG_STARTEND (1 << 2)
-
-
-/* If any error codes are removed, changed, or added, update the
- '__re_error_msgid' table in regcomp.c. */
-
-typedef enum
-{
- _REG_ENOSYS = -1, /* This will never happen for this implementation. */
- _REG_NOERROR = 0, /* Success. */
- _REG_NOMATCH, /* Didn't find a match (for regexec). */
-
- /* POSIX regcomp return error codes. (In the order listed in the
- standard.) */
- _REG_BADPAT, /* Invalid pattern. */
- _REG_ECOLLATE, /* Invalid collating element. */
- _REG_ECTYPE, /* Invalid character class name. */
- _REG_EESCAPE, /* Trailing backslash. */
- _REG_ESUBREG, /* Invalid back reference. */
- _REG_EBRACK, /* Unmatched left bracket. */
- _REG_EPAREN, /* Parenthesis imbalance. */
- _REG_EBRACE, /* Unmatched \{. */
- _REG_BADBR, /* Invalid contents of \{\}. */
- _REG_ERANGE, /* Invalid range end. */
- _REG_ESPACE, /* Ran out of memory. */
- _REG_BADRPT, /* No preceding re for repetition op. */
-
- /* Error codes we've added. */
- _REG_EEND, /* Premature end. */
- _REG_ESIZE, /* Too large (e.g., repeat count too large). */
- _REG_ERPAREN /* Unmatched ) or \); not returned from regcomp. */
-} reg_errcode_t;
-
-#if defined _XOPEN_SOURCE || defined __USE_XOPEN2K
-# define REG_ENOSYS _REG_ENOSYS
-#endif
-#define REG_NOERROR _REG_NOERROR
-#define REG_NOMATCH _REG_NOMATCH
-#define REG_BADPAT _REG_BADPAT
-#define REG_ECOLLATE _REG_ECOLLATE
-#define REG_ECTYPE _REG_ECTYPE
-#define REG_EESCAPE _REG_EESCAPE
-#define REG_ESUBREG _REG_ESUBREG
-#define REG_EBRACK _REG_EBRACK
-#define REG_EPAREN _REG_EPAREN
-#define REG_EBRACE _REG_EBRACE
-#define REG_BADBR _REG_BADBR
-#define REG_ERANGE _REG_ERANGE
-#define REG_ESPACE _REG_ESPACE
-#define REG_BADRPT _REG_BADRPT
-#define REG_EEND _REG_EEND
-#define REG_ESIZE _REG_ESIZE
-#define REG_ERPAREN _REG_ERPAREN
-
-/* This data structure represents a compiled pattern. Before calling
- the pattern compiler, the fields 'buffer', 'allocated', 'fastmap',
- and 'translate' can be set. After the pattern has been compiled,
- the fields 're_nsub', 'not_bol' and 'not_eol' are available. All
- other fields are private to the regex routines. */
-
-#ifndef RE_TRANSLATE_TYPE
-# define __RE_TRANSLATE_TYPE unsigned char *
-# ifdef __USE_GNU
-# define RE_TRANSLATE_TYPE __RE_TRANSLATE_TYPE
-# endif
-#endif
-
-#ifdef __USE_GNU
-# define __REPB_PREFIX(name) name
-#else
-# define __REPB_PREFIX(name) __##name
-#endif
-
-struct re_pattern_buffer
-{
- /* Space that holds the compiled pattern. The type
- 'struct re_dfa_t' is private and is not declared here. */
- struct re_dfa_t *__REPB_PREFIX(buffer);
-
- /* Number of bytes to which 'buffer' points. */
- __re_long_size_t __REPB_PREFIX(allocated);
-
- /* Number of bytes actually used in 'buffer'. */
- __re_long_size_t __REPB_PREFIX(used);
-
- /* Syntax setting with which the pattern was compiled. */
- reg_syntax_t __REPB_PREFIX(syntax);
-
- /* Pointer to a fastmap, if any, otherwise zero. re_search uses the
- fastmap, if there is one, to skip over impossible starting points
- for matches. */
- char *__REPB_PREFIX(fastmap);
-
- /* Either a translate table to apply to all characters before
- comparing them, or zero for no translation. The translation is
- applied to a pattern when it is compiled and to a string when it
- is matched. */
- __RE_TRANSLATE_TYPE __REPB_PREFIX(translate);
-
- /* Number of subexpressions found by the compiler. */
- size_t re_nsub;
-
- /* Zero if this pattern cannot match the empty string, one else.
- Well, in truth it's used only in 're_search_2', to see whether or
- not we should use the fastmap, so we don't set this absolutely
- perfectly; see 're_compile_fastmap' (the "duplicate" case). */
- unsigned __REPB_PREFIX(can_be_null) : 1;
-
- /* If REGS_UNALLOCATED, allocate space in the 'regs' structure
- for 'max (RE_NREGS, re_nsub + 1)' groups.
- If REGS_REALLOCATE, reallocate space if necessary.
- If REGS_FIXED, use what's there. */
-#ifdef __USE_GNU
-# define REGS_UNALLOCATED 0
-# define REGS_REALLOCATE 1
-# define REGS_FIXED 2
-#endif
- unsigned __REPB_PREFIX(regs_allocated) : 2;
-
- /* Set to zero when 're_compile_pattern' compiles a pattern; set to
- one by 're_compile_fastmap' if it updates the fastmap. */
- unsigned __REPB_PREFIX(fastmap_accurate) : 1;
-
- /* If set, 're_match_2' does not return information about
- subexpressions. */
- unsigned __REPB_PREFIX(no_sub) : 1;
-
- /* If set, a beginning-of-line anchor doesn't match at the beginning
- of the string. */
- unsigned __REPB_PREFIX(not_bol) : 1;
-
- /* Similarly for an end-of-line anchor. */
- unsigned __REPB_PREFIX(not_eol) : 1;
-
- /* If true, an anchor at a newline matches. */
- unsigned __REPB_PREFIX(newline_anchor) : 1;
-};
-
-typedef struct re_pattern_buffer regex_t;
-
-/* Type for byte offsets within the string. POSIX mandates this. */
-#ifdef _REGEX_LARGE_OFFSETS
-/* POSIX 1003.1-2008 requires that regoff_t be at least as wide as
- ptrdiff_t and ssize_t. We don't know of any hosts where ptrdiff_t
- is wider than ssize_t, so ssize_t is safe. ptrdiff_t is not
- visible here, so use ssize_t. */
-typedef ssize_t regoff_t;
-#else
-/* The traditional GNU regex implementation mishandles strings longer
- than INT_MAX. */
-typedef int regoff_t;
-#endif
-
-
-#ifdef __USE_GNU
-/* This is the structure we store register match data in. See
- regex.texinfo for a full description of what registers match. */
-struct re_registers
-{
- __re_size_t num_regs;
- regoff_t *start;
- regoff_t *end;
-};
-
-
-/* If 'regs_allocated' is REGS_UNALLOCATED in the pattern buffer,
- 're_match_2' returns information about at least this many registers
- the first time a 'regs' structure is passed. */
-# ifndef RE_NREGS
-# define RE_NREGS 30
-# endif
-#endif
-
-
-/* POSIX specification for registers. Aside from the different names than
- 're_registers', POSIX uses an array of structures, instead of a
- structure of arrays. */
-typedef struct
-{
- regoff_t rm_so; /* Byte offset from string's start to substring's start. */
- regoff_t rm_eo; /* Byte offset from string's start to substring's end. */
-} regmatch_t;
-
-/* Declarations for routines. */
-
-#ifndef _REGEX_NELTS
-# if (defined __STDC_VERSION__ && 199901L <= __STDC_VERSION__ \
- && !defined __STDC_NO_VLA__)
-# define _REGEX_NELTS(n) n
-# else
-# define _REGEX_NELTS(n)
-# endif
-#endif
-
-#if defined __GNUC__ && 4 < __GNUC__ + (6 <= __GNUC_MINOR__)
-# pragma GCC diagnostic push
-# pragma GCC diagnostic ignored "-Wvla"
-#endif
-
-#ifndef _Attr_access_
-# ifdef __attr_access
-# define _Attr_access_(arg) __attr_access (arg)
-# elif defined __GNUC__ && 10 <= __GNUC__
-# define _Attr_access_(x) __attribute__ ((__access__ x))
-# else
-# define _Attr_access_(x)
-# endif
-#endif
-
-#ifdef __USE_GNU
-/* Sets the current default syntax to SYNTAX, and return the old syntax.
- You can also simply assign to the 're_syntax_options' variable. */
-extern reg_syntax_t re_set_syntax (reg_syntax_t __syntax);
-
-/* Compile the regular expression PATTERN, with length LENGTH
- and syntax given by the global 're_syntax_options', into the buffer
- BUFFER. Return NULL if successful, and an error string if not.
-
- To free the allocated storage, you must call 'regfree' on BUFFER.
- Note that the translate table must either have been initialized by
- 'regcomp', with a malloc'ed value, or set to NULL before calling
- 'regfree'. */
-extern const char *re_compile_pattern (const char *__pattern, size_t __length,
- struct re_pattern_buffer *__buffer)
- _Attr_access_ ((__read_only__, 1, 2));
-
-
-/* Compile a fastmap for the compiled pattern in BUFFER; used to
- accelerate searches. Return 0 if successful and -2 if was an
- internal error. */
-extern int re_compile_fastmap (struct re_pattern_buffer *__buffer);
-
-
-/* Search in the string STRING (with length LENGTH) for the pattern
- compiled into BUFFER. Start searching at position START, for RANGE
- characters. Return the starting position of the match, -1 for no
- match, or -2 for an internal error. Also return register
- information in REGS (if REGS and BUFFER->no_sub are nonzero). */
-extern regoff_t re_search (struct re_pattern_buffer *__buffer,
- const char *__String, regoff_t __length,
- regoff_t __start, regoff_t __range,
- struct re_registers *__regs)
- _Attr_access_ ((__read_only__, 2, 3));
-
-
-/* Like 're_search', but search in the concatenation of STRING1 and
- STRING2. Also, stop searching at index START + STOP. */
-extern regoff_t re_search_2 (struct re_pattern_buffer *__buffer,
- const char *__string1, regoff_t __length1,
- const char *__string2, regoff_t __length2,
- regoff_t __start, regoff_t __range,
- struct re_registers *__regs,
- regoff_t __stop)
- _Attr_access_ ((__read_only__, 2, 3))
- _Attr_access_ ((__read_only__, 4, 5));
-
-
-/* Like 're_search', but return how many characters in STRING the regexp
- in BUFFER matched, starting at position START. */
-extern regoff_t re_match (struct re_pattern_buffer *__buffer,
- const char *__String, regoff_t __length,
- regoff_t __start, struct re_registers *__regs)
- _Attr_access_ ((__read_only__, 2, 3));
-
-
-/* Relates to 're_match' as 're_search_2' relates to 're_search'. */
-extern regoff_t re_match_2 (struct re_pattern_buffer *__buffer,
- const char *__string1, regoff_t __length1,
- const char *__string2, regoff_t __length2,
- regoff_t __start, struct re_registers *__regs,
- regoff_t __stop)
- _Attr_access_ ((__read_only__, 2, 3))
- _Attr_access_ ((__read_only__, 4, 5));
-
-
-/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
- ENDS. Subsequent matches using BUFFER and REGS will use this memory
- for recording register information. STARTS and ENDS must be
- allocated with malloc, and must each be at least 'NUM_REGS * sizeof
- (regoff_t)' bytes long.
-
- If NUM_REGS == 0, then subsequent matches should allocate their own
- register data.
-
- Unless this function is called, the first search or match using
- BUFFER will allocate its own register data, without
- freeing the old data. */
-extern void re_set_registers (struct re_pattern_buffer *__buffer,
- struct re_registers *__regs,
- __re_size_t __num_regs,
- regoff_t *__starts, regoff_t *__ends);
-#endif /* Use GNU */
-
-#if defined _REGEX_RE_COMP || (defined _LIBC && defined __USE_MISC)
-/* 4.2 bsd compatibility. */
-extern char *re_comp (const char *);
-extern int re_exec (const char *);
-#endif
-
-/* For plain 'restrict', use glibc's __restrict if defined.
- Otherwise, GCC 2.95 and later have "__restrict"; C99 compilers have
- "restrict", and "configure" may have defined "restrict".
- Other compilers use __restrict, __restrict__, and _Restrict, and
- 'configure' might #define 'restrict' to those words, so pick a
- different name. */
-#ifndef _Restrict_
-# if defined __restrict \
- || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \
- || __clang_major__ >= 3
-# define _Restrict_ __restrict
-# elif 199901L <= __STDC_VERSION__ || defined restrict
-# define _Restrict_ restrict
-# else
-# define _Restrict_
-# endif
-#endif
-/* For the ISO C99 syntax
- array_name[restrict]
- use glibc's __restrict_arr if available.
- Otherwise, GCC 3.1 and clang support this syntax (but not in C++ mode).
- Other ISO C99 compilers support it as well. */
-#ifndef _Restrict_arr_
-# ifdef __restrict_arr
-# define _Restrict_arr_ __restrict_arr
-# elif ((199901L <= __STDC_VERSION__ \
- || 3 < __GNUC__ + (1 <= __GNUC_MINOR__) \
- || __clang_major__ >= 3) \
- && !defined __cplusplus)
-# define _Restrict_arr_ _Restrict_
-# else
-# define _Restrict_arr_
-# endif
-#endif
-
-/* POSIX compatibility. */
-extern int regcomp (regex_t *_Restrict_ __preg,
- const char *_Restrict_ __pattern,
- int __cflags);
-
-extern int regexec (const regex_t *_Restrict_ __preg,
- const char *_Restrict_ __String, size_t __nmatch,
- regmatch_t __pmatch[_Restrict_arr_
- _REGEX_NELTS (__nmatch)],
- int __eflags);
-
-extern size_t regerror (int __errcode, const regex_t *_Restrict_ __preg,
- char *_Restrict_ __errbuf, size_t __errbuf_size)
- _Attr_access_ ((__write_only__, 3, 4));
-
-extern void regfree (regex_t *__preg);
-
-#if defined __GNUC__ && 4 < __GNUC__ + (6 <= __GNUC_MINOR__)
-# pragma GCC diagnostic pop
-#endif
-
-#ifdef __cplusplus
-}
-#endif /* C++ */
-
-#endif /* regex.h */
diff --git a/cross/lib/regex_internal.c b/cross/lib/regex_internal.c
deleted file mode 100644
index 998a19b7241..00000000000
--- a/cross/lib/regex_internal.c
+++ /dev/null
@@ -1,1711 +0,0 @@
-/* Extended regular expression matching and search library.
- Copyright (C) 2002-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
-
- 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/>. */
-
-static void re_string_construct_common (const char *str, Idx len,
- re_string_t *pstr,
- RE_TRANSLATE_TYPE trans, bool icase,
- const re_dfa_t *dfa);
-static re_dfastate_t *create_ci_newstate (const re_dfa_t *dfa,
- const re_node_set *nodes,
- re_hashval_t hash);
-static re_dfastate_t *create_cd_newstate (const re_dfa_t *dfa,
- const re_node_set *nodes,
- unsigned int context,
- re_hashval_t hash);
-static reg_errcode_t re_string_realloc_buffers (re_string_t *pstr,
- Idx new_buf_len);
-static void build_wcs_buffer (re_string_t *pstr);
-static reg_errcode_t build_wcs_upper_buffer (re_string_t *pstr);
-static void build_upper_buffer (re_string_t *pstr);
-static void re_string_translate_buffer (re_string_t *pstr);
-static unsigned int re_string_context_at (const re_string_t *input, Idx idx,
- int eflags) __attribute__ ((pure));
-
-/* Functions for string operation. */
-
-/* This function allocate the buffers. It is necessary to call
- re_string_reconstruct before using the object. */
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-re_string_allocate (re_string_t *pstr, const char *str, Idx len, Idx init_len,
- RE_TRANSLATE_TYPE trans, bool icase, const re_dfa_t *dfa)
-{
- reg_errcode_t ret;
- Idx init_buf_len;
-
- /* Ensure at least one character fits into the buffers. */
- if (init_len < dfa->mb_cur_max)
- init_len = dfa->mb_cur_max;
- init_buf_len = (len + 1 < init_len) ? len + 1: init_len;
- re_string_construct_common (str, len, pstr, trans, icase, dfa);
-
- ret = re_string_realloc_buffers (pstr, init_buf_len);
- if (__glibc_unlikely (ret != REG_NOERROR))
- return ret;
-
- pstr->word_char = dfa->word_char;
- pstr->word_ops_used = dfa->word_ops_used;
- pstr->mbs = pstr->mbs_allocated ? pstr->mbs : (unsigned char *) str;
- pstr->valid_len = (pstr->mbs_allocated || dfa->mb_cur_max > 1) ? 0 : len;
- pstr->valid_raw_len = pstr->valid_len;
- return REG_NOERROR;
-}
-
-/* This function allocate the buffers, and initialize them. */
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-re_string_construct (re_string_t *pstr, const char *str, Idx len,
- RE_TRANSLATE_TYPE trans, bool icase, const re_dfa_t *dfa)
-{
- reg_errcode_t ret;
- memset (pstr, '\0', sizeof (re_string_t));
- re_string_construct_common (str, len, pstr, trans, icase, dfa);
-
- if (len > 0)
- {
- ret = re_string_realloc_buffers (pstr, len + 1);
- if (__glibc_unlikely (ret != REG_NOERROR))
- return ret;
- }
- pstr->mbs = pstr->mbs_allocated ? pstr->mbs : (unsigned char *) str;
-
- if (icase)
- {
- if (dfa->mb_cur_max > 1)
- {
- while (1)
- {
- ret = build_wcs_upper_buffer (pstr);
- if (__glibc_unlikely (ret != REG_NOERROR))
- return ret;
- if (pstr->valid_raw_len >= len)
- break;
- if (pstr->bufs_len > pstr->valid_len + dfa->mb_cur_max)
- break;
- ret = re_string_realloc_buffers (pstr, pstr->bufs_len * 2);
- if (__glibc_unlikely (ret != REG_NOERROR))
- return ret;
- }
- }
- else
- build_upper_buffer (pstr);
- }
- else
- {
- if (dfa->mb_cur_max > 1)
- build_wcs_buffer (pstr);
- else
- {
- if (trans != NULL)
- re_string_translate_buffer (pstr);
- else
- {
- pstr->valid_len = pstr->bufs_len;
- pstr->valid_raw_len = pstr->bufs_len;
- }
- }
- }
-
- return REG_NOERROR;
-}
-
-/* Helper functions for re_string_allocate, and re_string_construct. */
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-re_string_realloc_buffers (re_string_t *pstr, Idx new_buf_len)
-{
- if (pstr->mb_cur_max > 1)
- {
- wint_t *new_wcs;
-
- /* Avoid overflow in realloc. */
- const size_t max_object_size = MAX (sizeof (wint_t), sizeof (Idx));
- if (__glibc_unlikely (MIN (IDX_MAX, SIZE_MAX / max_object_size)
- < new_buf_len))
- return REG_ESPACE;
-
- new_wcs = re_realloc (pstr->wcs, wint_t, new_buf_len);
- if (__glibc_unlikely (new_wcs == NULL))
- return REG_ESPACE;
- pstr->wcs = new_wcs;
- if (pstr->offsets != NULL)
- {
- Idx *new_offsets = re_realloc (pstr->offsets, Idx, new_buf_len);
- if (__glibc_unlikely (new_offsets == NULL))
- return REG_ESPACE;
- pstr->offsets = new_offsets;
- }
- }
- if (pstr->mbs_allocated)
- {
- unsigned char *new_mbs = re_realloc (pstr->mbs, unsigned char,
- new_buf_len);
- if (__glibc_unlikely (new_mbs == NULL))
- return REG_ESPACE;
- pstr->mbs = new_mbs;
- }
- pstr->bufs_len = new_buf_len;
- return REG_NOERROR;
-}
-
-
-static void
-re_string_construct_common (const char *str, Idx len, re_string_t *pstr,
- RE_TRANSLATE_TYPE trans, bool icase,
- const re_dfa_t *dfa)
-{
- pstr->raw_mbs = (const unsigned char *) str;
- pstr->len = len;
- pstr->raw_len = len;
- pstr->trans = trans;
- pstr->icase = icase;
- pstr->mbs_allocated = (trans != NULL || icase);
- pstr->mb_cur_max = dfa->mb_cur_max;
- pstr->is_utf8 = dfa->is_utf8;
- pstr->map_notascii = dfa->map_notascii;
- pstr->stop = pstr->len;
- pstr->raw_stop = pstr->stop;
-}
-
-
-/* Build wide character buffer PSTR->WCS.
- If the byte sequence of the string are:
- <mb1>(0), <mb1>(1), <mb2>(0), <mb2>(1), <sb3>
- Then wide character buffer will be:
- <wc1> , WEOF , <wc2> , WEOF , <wc3>
- We use WEOF for padding, they indicate that the position isn't
- a first byte of a multibyte character.
-
- Note that this function assumes PSTR->VALID_LEN elements are already
- built and starts from PSTR->VALID_LEN. */
-
-static void
-build_wcs_buffer (re_string_t *pstr)
-{
-#ifdef _LIBC
- unsigned char buf[MB_LEN_MAX];
- DEBUG_ASSERT (MB_LEN_MAX >= pstr->mb_cur_max);
-#else
- unsigned char buf[64];
-#endif
- mbstate_t prev_st;
- Idx byte_idx, end_idx, remain_len;
- size_t mbclen;
-
- /* Build the buffers from pstr->valid_len to either pstr->len or
- pstr->bufs_len. */
- end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len;
- for (byte_idx = pstr->valid_len; byte_idx < end_idx;)
- {
- wchar_t wc;
- const char *p;
-
- remain_len = end_idx - byte_idx;
- prev_st = pstr->cur_state;
- /* Apply the translation if we need. */
- if (__glibc_unlikely (pstr->trans != NULL))
- {
- int i, ch;
-
- for (i = 0; i < pstr->mb_cur_max && i < remain_len; ++i)
- {
- ch = pstr->raw_mbs [pstr->raw_mbs_idx + byte_idx + i];
- buf[i] = pstr->mbs[byte_idx + i] = pstr->trans[ch];
- }
- p = (const char *) buf;
- }
- else
- p = (const char *) pstr->raw_mbs + pstr->raw_mbs_idx + byte_idx;
- mbclen = __mbrtowc (&wc, p, remain_len, &pstr->cur_state);
- if (__glibc_unlikely (mbclen == (size_t) -1 || mbclen == 0
- || (mbclen == (size_t) -2
- && pstr->bufs_len >= pstr->len)))
- {
- /* We treat these cases as a singlebyte character. */
- mbclen = 1;
- wc = (wchar_t) pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx];
- if (__glibc_unlikely (pstr->trans != NULL))
- wc = pstr->trans[wc];
- pstr->cur_state = prev_st;
- }
- else if (__glibc_unlikely (mbclen == (size_t) -2))
- {
- /* The buffer doesn't have enough space, finish to build. */
- pstr->cur_state = prev_st;
- break;
- }
-
- /* Write wide character and padding. */
- pstr->wcs[byte_idx++] = wc;
- /* Write paddings. */
- for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;)
- pstr->wcs[byte_idx++] = WEOF;
- }
- pstr->valid_len = byte_idx;
- pstr->valid_raw_len = byte_idx;
-}
-
-/* Build wide character buffer PSTR->WCS like build_wcs_buffer,
- but for REG_ICASE. */
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-build_wcs_upper_buffer (re_string_t *pstr)
-{
- mbstate_t prev_st;
- Idx src_idx, byte_idx, end_idx, remain_len;
- size_t mbclen;
-#ifdef _LIBC
- char buf[MB_LEN_MAX];
- DEBUG_ASSERT (pstr->mb_cur_max <= MB_LEN_MAX);
-#else
- char buf[64];
-#endif
-
- byte_idx = pstr->valid_len;
- end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len;
-
- /* The following optimization assumes that ASCII characters can be
- mapped to wide characters with a simple cast. */
- if (! pstr->map_notascii && pstr->trans == NULL && !pstr->offsets_needed)
- {
- while (byte_idx < end_idx)
- {
- wchar_t wc;
- unsigned char ch = pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx];
-
- if (isascii (ch) && mbsinit (&pstr->cur_state))
- {
- /* The next step uses the assumption that wchar_t is encoded
- ASCII-safe: all ASCII values can be converted like this. */
- wchar_t wcu = __towupper (ch);
- if (isascii (wcu))
- {
- pstr->mbs[byte_idx] = wcu;
- pstr->wcs[byte_idx] = wcu;
- byte_idx++;
- continue;
- }
- }
-
- remain_len = end_idx - byte_idx;
- prev_st = pstr->cur_state;
- mbclen = __mbrtowc (&wc,
- ((const char *) pstr->raw_mbs + pstr->raw_mbs_idx
- + byte_idx), remain_len, &pstr->cur_state);
- if (__glibc_likely (0 < mbclen && mbclen < (size_t) -2))
- {
- wchar_t wcu = __towupper (wc);
- if (wcu != wc)
- {
- size_t mbcdlen;
-
- mbcdlen = __wcrtomb (buf, wcu, &prev_st);
- if (__glibc_likely (mbclen == mbcdlen))
- memcpy (pstr->mbs + byte_idx, buf, mbclen);
- else
- {
- src_idx = byte_idx;
- goto offsets_needed;
- }
- }
- else
- memcpy (pstr->mbs + byte_idx,
- pstr->raw_mbs + pstr->raw_mbs_idx + byte_idx, mbclen);
- pstr->wcs[byte_idx++] = wcu;
- /* Write paddings. */
- for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;)
- pstr->wcs[byte_idx++] = WEOF;
- }
- else if (mbclen == (size_t) -1 || mbclen == 0
- || (mbclen == (size_t) -2 && pstr->bufs_len >= pstr->len))
- {
- /* It is an invalid character, an incomplete character
- at the end of the string, or '\0'. Just use the byte. */
- pstr->mbs[byte_idx] = ch;
- /* And also cast it to wide char. */
- pstr->wcs[byte_idx++] = (wchar_t) ch;
- if (__glibc_unlikely (mbclen == (size_t) -1))
- pstr->cur_state = prev_st;
- }
- else
- {
- /* The buffer doesn't have enough space, finish to build. */
- pstr->cur_state = prev_st;
- break;
- }
- }
- pstr->valid_len = byte_idx;
- pstr->valid_raw_len = byte_idx;
- return REG_NOERROR;
- }
- else
- for (src_idx = pstr->valid_raw_len; byte_idx < end_idx;)
- {
- wchar_t wc;
- const char *p;
- offsets_needed:
- remain_len = end_idx - byte_idx;
- prev_st = pstr->cur_state;
- if (__glibc_unlikely (pstr->trans != NULL))
- {
- int i, ch;
-
- for (i = 0; i < pstr->mb_cur_max && i < remain_len; ++i)
- {
- ch = pstr->raw_mbs [pstr->raw_mbs_idx + src_idx + i];
- buf[i] = pstr->trans[ch];
- }
- p = (const char *) buf;
- }
- else
- p = (const char *) pstr->raw_mbs + pstr->raw_mbs_idx + src_idx;
- mbclen = __mbrtowc (&wc, p, remain_len, &pstr->cur_state);
- if (__glibc_likely (0 < mbclen && mbclen < (size_t) -2))
- {
- wchar_t wcu = __towupper (wc);
- if (wcu != wc)
- {
- size_t mbcdlen;
-
- mbcdlen = __wcrtomb ((char *) buf, wcu, &prev_st);
- if (__glibc_likely (mbclen == mbcdlen))
- memcpy (pstr->mbs + byte_idx, buf, mbclen);
- else if (mbcdlen != (size_t) -1)
- {
- size_t i;
-
- if (byte_idx + mbcdlen > pstr->bufs_len)
- {
- pstr->cur_state = prev_st;
- break;
- }
-
- if (pstr->offsets == NULL)
- {
- pstr->offsets = re_malloc (Idx, pstr->bufs_len);
-
- if (pstr->offsets == NULL)
- return REG_ESPACE;
- }
- if (!pstr->offsets_needed)
- {
- for (i = 0; i < (size_t) byte_idx; ++i)
- pstr->offsets[i] = i;
- pstr->offsets_needed = 1;
- }
-
- memcpy (pstr->mbs + byte_idx, buf, mbcdlen);
- pstr->wcs[byte_idx] = wcu;
- pstr->offsets[byte_idx] = src_idx;
- for (i = 1; i < mbcdlen; ++i)
- {
- pstr->offsets[byte_idx + i]
- = src_idx + (i < mbclen ? i : mbclen - 1);
- pstr->wcs[byte_idx + i] = WEOF;
- }
- pstr->len += mbcdlen - mbclen;
- if (pstr->raw_stop > src_idx)
- pstr->stop += mbcdlen - mbclen;
- end_idx = (pstr->bufs_len > pstr->len)
- ? pstr->len : pstr->bufs_len;
- byte_idx += mbcdlen;
- src_idx += mbclen;
- continue;
- }
- else
- memcpy (pstr->mbs + byte_idx, p, mbclen);
- }
- else
- memcpy (pstr->mbs + byte_idx, p, mbclen);
-
- if (__glibc_unlikely (pstr->offsets_needed != 0))
- {
- size_t i;
- for (i = 0; i < mbclen; ++i)
- pstr->offsets[byte_idx + i] = src_idx + i;
- }
- src_idx += mbclen;
-
- pstr->wcs[byte_idx++] = wcu;
- /* Write paddings. */
- for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;)
- pstr->wcs[byte_idx++] = WEOF;
- }
- else if (mbclen == (size_t) -1 || mbclen == 0
- || (mbclen == (size_t) -2 && pstr->bufs_len >= pstr->len))
- {
- /* It is an invalid character or '\0'. Just use the byte. */
- int ch = pstr->raw_mbs[pstr->raw_mbs_idx + src_idx];
-
- if (__glibc_unlikely (pstr->trans != NULL))
- ch = pstr->trans [ch];
- pstr->mbs[byte_idx] = ch;
-
- if (__glibc_unlikely (pstr->offsets_needed != 0))
- pstr->offsets[byte_idx] = src_idx;
- ++src_idx;
-
- /* And also cast it to wide char. */
- pstr->wcs[byte_idx++] = (wchar_t) ch;
- if (__glibc_unlikely (mbclen == (size_t) -1))
- pstr->cur_state = prev_st;
- }
- else
- {
- /* The buffer doesn't have enough space, finish to build. */
- pstr->cur_state = prev_st;
- break;
- }
- }
- pstr->valid_len = byte_idx;
- pstr->valid_raw_len = src_idx;
- return REG_NOERROR;
-}
-
-/* Skip characters until the index becomes greater than NEW_RAW_IDX.
- Return the index. */
-
-static Idx
-re_string_skip_chars (re_string_t *pstr, Idx new_raw_idx, wint_t *last_wc)
-{
- mbstate_t prev_st;
- Idx rawbuf_idx;
- size_t mbclen;
- wint_t wc = WEOF;
-
- /* Skip the characters which are not necessary to check. */
- for (rawbuf_idx = pstr->raw_mbs_idx + pstr->valid_raw_len;
- rawbuf_idx < new_raw_idx;)
- {
- wchar_t wc2;
- Idx remain_len = pstr->raw_len - rawbuf_idx;
- prev_st = pstr->cur_state;
- mbclen = __mbrtowc (&wc2, (const char *) pstr->raw_mbs + rawbuf_idx,
- remain_len, &pstr->cur_state);
- if (__glibc_unlikely (mbclen == (size_t) -2 || mbclen == (size_t) -1
- || mbclen == 0))
- {
- /* We treat these cases as a single byte character. */
- if (mbclen == 0 || remain_len == 0)
- wc = L'\0';
- else
- wc = *(unsigned char *) (pstr->raw_mbs + rawbuf_idx);
- mbclen = 1;
- pstr->cur_state = prev_st;
- }
- else
- wc = wc2;
- /* Then proceed the next character. */
- rawbuf_idx += mbclen;
- }
- *last_wc = wc;
- return rawbuf_idx;
-}
-
-/* Build the buffer PSTR->MBS, and apply the translation if we need.
- This function is used in case of REG_ICASE. */
-
-static void
-build_upper_buffer (re_string_t *pstr)
-{
- Idx char_idx, end_idx;
- end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len;
-
- for (char_idx = pstr->valid_len; char_idx < end_idx; ++char_idx)
- {
- int ch = pstr->raw_mbs[pstr->raw_mbs_idx + char_idx];
- if (__glibc_unlikely (pstr->trans != NULL))
- ch = pstr->trans[ch];
- pstr->mbs[char_idx] = toupper (ch);
- }
- pstr->valid_len = char_idx;
- pstr->valid_raw_len = char_idx;
-}
-
-/* Apply TRANS to the buffer in PSTR. */
-
-static void
-re_string_translate_buffer (re_string_t *pstr)
-{
- Idx buf_idx, end_idx;
- end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len;
-
- for (buf_idx = pstr->valid_len; buf_idx < end_idx; ++buf_idx)
- {
- int ch = pstr->raw_mbs[pstr->raw_mbs_idx + buf_idx];
- pstr->mbs[buf_idx] = pstr->trans[ch];
- }
-
- pstr->valid_len = buf_idx;
- pstr->valid_raw_len = buf_idx;
-}
-
-/* This function re-construct the buffers.
- Concretely, convert to wide character in case of pstr->mb_cur_max > 1,
- convert to upper case in case of REG_ICASE, apply translation. */
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-re_string_reconstruct (re_string_t *pstr, Idx idx, int eflags)
-{
- Idx offset;
-
- if (__glibc_unlikely (pstr->raw_mbs_idx <= idx))
- offset = idx - pstr->raw_mbs_idx;
- else
- {
- /* Reset buffer. */
- if (pstr->mb_cur_max > 1)
- memset (&pstr->cur_state, '\0', sizeof (mbstate_t));
- pstr->len = pstr->raw_len;
- pstr->stop = pstr->raw_stop;
- pstr->valid_len = 0;
- pstr->raw_mbs_idx = 0;
- pstr->valid_raw_len = 0;
- pstr->offsets_needed = 0;
- pstr->tip_context = ((eflags & REG_NOTBOL) ? CONTEXT_BEGBUF
- : CONTEXT_NEWLINE | CONTEXT_BEGBUF);
- if (!pstr->mbs_allocated)
- pstr->mbs = (unsigned char *) pstr->raw_mbs;
- offset = idx;
- }
-
- if (__glibc_likely (offset != 0))
- {
- /* Should the already checked characters be kept? */
- if (__glibc_likely (offset < pstr->valid_raw_len))
- {
- /* Yes, move them to the front of the buffer. */
- if (__glibc_unlikely (pstr->offsets_needed))
- {
- Idx low = 0, high = pstr->valid_len, mid;
- do
- {
- mid = (high + low) / 2;
- if (pstr->offsets[mid] > offset)
- high = mid;
- else if (pstr->offsets[mid] < offset)
- low = mid + 1;
- else
- break;
- }
- while (low < high);
- if (pstr->offsets[mid] < offset)
- ++mid;
- pstr->tip_context = re_string_context_at (pstr, mid - 1,
- eflags);
- /* This can be quite complicated, so handle specially
- only the common and easy case where the character with
- different length representation of lower and upper
- case is present at or after offset. */
- if (pstr->valid_len > offset
- && mid == offset && pstr->offsets[mid] == offset)
- {
- memmove (pstr->wcs, pstr->wcs + offset,
- (pstr->valid_len - offset) * sizeof (wint_t));
- memmove (pstr->mbs, pstr->mbs + offset, pstr->valid_len - offset);
- pstr->valid_len -= offset;
- pstr->valid_raw_len -= offset;
- for (low = 0; low < pstr->valid_len; low++)
- pstr->offsets[low] = pstr->offsets[low + offset] - offset;
- }
- else
- {
- /* Otherwise, just find out how long the partial multibyte
- character at offset is and fill it with WEOF/255. */
- pstr->len = pstr->raw_len - idx + offset;
- pstr->stop = pstr->raw_stop - idx + offset;
- pstr->offsets_needed = 0;
- while (mid > 0 && pstr->offsets[mid - 1] == offset)
- --mid;
- while (mid < pstr->valid_len)
- if (pstr->wcs[mid] != WEOF)
- break;
- else
- ++mid;
- if (mid == pstr->valid_len)
- pstr->valid_len = 0;
- else
- {
- pstr->valid_len = pstr->offsets[mid] - offset;
- if (pstr->valid_len)
- {
- for (low = 0; low < pstr->valid_len; ++low)
- pstr->wcs[low] = WEOF;
- memset (pstr->mbs, 255, pstr->valid_len);
- }
- }
- pstr->valid_raw_len = pstr->valid_len;
- }
- }
- else
- {
- pstr->tip_context = re_string_context_at (pstr, offset - 1,
- eflags);
- if (pstr->mb_cur_max > 1)
- memmove (pstr->wcs, pstr->wcs + offset,
- (pstr->valid_len - offset) * sizeof (wint_t));
- if (__glibc_unlikely (pstr->mbs_allocated))
- memmove (pstr->mbs, pstr->mbs + offset,
- pstr->valid_len - offset);
- pstr->valid_len -= offset;
- pstr->valid_raw_len -= offset;
- DEBUG_ASSERT (pstr->valid_len > 0);
- }
- }
- else
- {
- /* No, skip all characters until IDX. */
- Idx prev_valid_len = pstr->valid_len;
-
- if (__glibc_unlikely (pstr->offsets_needed))
- {
- pstr->len = pstr->raw_len - idx + offset;
- pstr->stop = pstr->raw_stop - idx + offset;
- pstr->offsets_needed = 0;
- }
- pstr->valid_len = 0;
- if (pstr->mb_cur_max > 1)
- {
- Idx wcs_idx;
- wint_t wc = WEOF;
-
- if (pstr->is_utf8)
- {
- const unsigned char *raw, *p, *end;
-
- /* Special case UTF-8. Multi-byte chars start with any
- byte other than 0x80 - 0xbf. */
- raw = pstr->raw_mbs + pstr->raw_mbs_idx;
- end = raw + (offset - pstr->mb_cur_max);
- if (end < pstr->raw_mbs)
- end = pstr->raw_mbs;
- p = raw + offset - 1;
-#ifdef _LIBC
- /* We know the wchar_t encoding is UCS4, so for the simple
- case, ASCII characters, skip the conversion step. */
- if (isascii (*p) && __glibc_likely (pstr->trans == NULL))
- {
- memset (&pstr->cur_state, '\0', sizeof (mbstate_t));
- /* pstr->valid_len = 0; */
- wc = (wchar_t) *p;
- }
- else
-#endif
- for (; p >= end; --p)
- if ((*p & 0xc0) != 0x80)
- {
- mbstate_t cur_state;
- wchar_t wc2;
- Idx mlen = raw + pstr->len - p;
- unsigned char buf[6];
- size_t mbclen;
-
- const unsigned char *pp = p;
- if (__glibc_unlikely (pstr->trans != NULL))
- {
- int i = mlen < 6 ? mlen : 6;
- while (--i >= 0)
- buf[i] = pstr->trans[p[i]];
- pp = buf;
- }
- /* XXX Don't use mbrtowc, we know which conversion
- to use (UTF-8 -> UCS4). */
- memset (&cur_state, 0, sizeof (cur_state));
- mbclen = __mbrtowc (&wc2, (const char *) pp, mlen,
- &cur_state);
- if (raw + offset - p <= mbclen
- && mbclen < (size_t) -2)
- {
- memset (&pstr->cur_state, '\0',
- sizeof (mbstate_t));
- pstr->valid_len = mbclen - (raw + offset - p);
- wc = wc2;
- }
- break;
- }
- }
-
- if (wc == WEOF)
- pstr->valid_len = re_string_skip_chars (pstr, idx, &wc) - idx;
- if (wc == WEOF)
- pstr->tip_context
- = re_string_context_at (pstr, prev_valid_len - 1, eflags);
- else
- pstr->tip_context = ((__glibc_unlikely (pstr->word_ops_used != 0)
- && IS_WIDE_WORD_CHAR (wc))
- ? CONTEXT_WORD
- : ((IS_WIDE_NEWLINE (wc)
- && pstr->newline_anchor)
- ? CONTEXT_NEWLINE : 0));
- if (__glibc_unlikely (pstr->valid_len))
- {
- for (wcs_idx = 0; wcs_idx < pstr->valid_len; ++wcs_idx)
- pstr->wcs[wcs_idx] = WEOF;
- if (pstr->mbs_allocated)
- memset (pstr->mbs, 255, pstr->valid_len);
- }
- pstr->valid_raw_len = pstr->valid_len;
- }
- else
- {
- int c = pstr->raw_mbs[pstr->raw_mbs_idx + offset - 1];
- pstr->valid_raw_len = 0;
- if (pstr->trans)
- c = pstr->trans[c];
- pstr->tip_context = (bitset_contain (pstr->word_char, c)
- ? CONTEXT_WORD
- : ((IS_NEWLINE (c) && pstr->newline_anchor)
- ? CONTEXT_NEWLINE : 0));
- }
- }
- if (!__glibc_unlikely (pstr->mbs_allocated))
- pstr->mbs += offset;
- }
- pstr->raw_mbs_idx = idx;
- pstr->len -= offset;
- pstr->stop -= offset;
-
- /* Then build the buffers. */
- if (pstr->mb_cur_max > 1)
- {
- if (pstr->icase)
- {
- reg_errcode_t ret = build_wcs_upper_buffer (pstr);
- if (__glibc_unlikely (ret != REG_NOERROR))
- return ret;
- }
- else
- build_wcs_buffer (pstr);
- }
- else
- if (__glibc_unlikely (pstr->mbs_allocated))
- {
- if (pstr->icase)
- build_upper_buffer (pstr);
- else if (pstr->trans != NULL)
- re_string_translate_buffer (pstr);
- }
- else
- pstr->valid_len = pstr->len;
-
- pstr->cur_idx = 0;
- return REG_NOERROR;
-}
-
-static unsigned char
-__attribute__ ((pure))
-re_string_peek_byte_case (const re_string_t *pstr, Idx idx)
-{
- int ch;
- Idx off;
-
- /* Handle the common (easiest) cases first. */
- if (__glibc_likely (!pstr->mbs_allocated))
- return re_string_peek_byte (pstr, idx);
-
- if (pstr->mb_cur_max > 1
- && ! re_string_is_single_byte_char (pstr, pstr->cur_idx + idx))
- return re_string_peek_byte (pstr, idx);
-
- off = pstr->cur_idx + idx;
- if (pstr->offsets_needed)
- off = pstr->offsets[off];
-
- ch = pstr->raw_mbs[pstr->raw_mbs_idx + off];
-
- /* Ensure that e.g. for tr_TR.UTF-8 BACKSLASH DOTLESS SMALL LETTER I
- this function returns CAPITAL LETTER I instead of first byte of
- DOTLESS SMALL LETTER I. The latter would confuse the parser,
- since peek_byte_case doesn't advance cur_idx in any way. */
- if (pstr->offsets_needed && !isascii (ch))
- return re_string_peek_byte (pstr, idx);
-
- return ch;
-}
-
-static unsigned char
-re_string_fetch_byte_case (re_string_t *pstr)
-{
- if (__glibc_likely (!pstr->mbs_allocated))
- return re_string_fetch_byte (pstr);
-
- if (pstr->offsets_needed)
- {
- Idx off;
- int ch;
-
- /* For tr_TR.UTF-8 [[:islower:]] there is
- [[: CAPITAL LETTER I WITH DOT lower:]] in mbs. Skip
- in that case the whole multi-byte character and return
- the original letter. On the other side, with
- [[: DOTLESS SMALL LETTER I return [[:I, as doing
- anything else would complicate things too much. */
-
- if (!re_string_first_byte (pstr, pstr->cur_idx))
- return re_string_fetch_byte (pstr);
-
- off = pstr->offsets[pstr->cur_idx];
- ch = pstr->raw_mbs[pstr->raw_mbs_idx + off];
-
- if (! isascii (ch))
- return re_string_fetch_byte (pstr);
-
- re_string_skip_bytes (pstr,
- re_string_char_size_at (pstr, pstr->cur_idx));
- return ch;
- }
-
- return pstr->raw_mbs[pstr->raw_mbs_idx + pstr->cur_idx++];
-}
-
-static void
-re_string_destruct (re_string_t *pstr)
-{
- re_free (pstr->wcs);
- re_free (pstr->offsets);
- if (pstr->mbs_allocated)
- re_free (pstr->mbs);
-}
-
-/* Return the context at IDX in INPUT. */
-
-static unsigned int
-re_string_context_at (const re_string_t *input, Idx idx, int eflags)
-{
- int c;
- if (__glibc_unlikely (idx < 0))
- /* In this case, we use the value stored in input->tip_context,
- since we can't know the character in input->mbs[-1] here. */
- return input->tip_context;
- if (__glibc_unlikely (idx == input->len))
- return ((eflags & REG_NOTEOL) ? CONTEXT_ENDBUF
- : CONTEXT_NEWLINE | CONTEXT_ENDBUF);
- if (input->mb_cur_max > 1)
- {
- wint_t wc;
- Idx wc_idx = idx;
- while(input->wcs[wc_idx] == WEOF)
- {
- DEBUG_ASSERT (wc_idx >= 0);
- --wc_idx;
- if (wc_idx < 0)
- return input->tip_context;
- }
- wc = input->wcs[wc_idx];
- if (__glibc_unlikely (input->word_ops_used != 0)
- && IS_WIDE_WORD_CHAR (wc))
- return CONTEXT_WORD;
- return (IS_WIDE_NEWLINE (wc) && input->newline_anchor
- ? CONTEXT_NEWLINE : 0);
- }
- else
- {
- c = re_string_byte_at (input, idx);
- if (bitset_contain (input->word_char, c))
- return CONTEXT_WORD;
- return IS_NEWLINE (c) && input->newline_anchor ? CONTEXT_NEWLINE : 0;
- }
-}
-
-/* Functions for set operation. */
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-re_node_set_alloc (re_node_set *set, Idx size)
-{
- set->alloc = size;
- set->nelem = 0;
- set->elems = re_malloc (Idx, size);
- if (__glibc_unlikely (set->elems == NULL)
- && (MALLOC_0_IS_NONNULL || size != 0))
- return REG_ESPACE;
- return REG_NOERROR;
-}
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-re_node_set_init_1 (re_node_set *set, Idx elem)
-{
- set->alloc = 1;
- set->nelem = 1;
- set->elems = re_malloc (Idx, 1);
- if (__glibc_unlikely (set->elems == NULL))
- {
- set->alloc = set->nelem = 0;
- return REG_ESPACE;
- }
- set->elems[0] = elem;
- return REG_NOERROR;
-}
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-re_node_set_init_2 (re_node_set *set, Idx elem1, Idx elem2)
-{
- set->alloc = 2;
- set->elems = re_malloc (Idx, 2);
- if (__glibc_unlikely (set->elems == NULL))
- return REG_ESPACE;
- if (elem1 == elem2)
- {
- set->nelem = 1;
- set->elems[0] = elem1;
- }
- else
- {
- set->nelem = 2;
- if (elem1 < elem2)
- {
- set->elems[0] = elem1;
- set->elems[1] = elem2;
- }
- else
- {
- set->elems[0] = elem2;
- set->elems[1] = elem1;
- }
- }
- return REG_NOERROR;
-}
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-re_node_set_init_copy (re_node_set *dest, const re_node_set *src)
-{
- dest->nelem = src->nelem;
- if (src->nelem > 0)
- {
- dest->alloc = dest->nelem;
- dest->elems = re_malloc (Idx, dest->alloc);
- if (__glibc_unlikely (dest->elems == NULL))
- {
- dest->alloc = dest->nelem = 0;
- return REG_ESPACE;
- }
- memcpy (dest->elems, src->elems, src->nelem * sizeof (Idx));
- }
- else
- re_node_set_init_empty (dest);
- return REG_NOERROR;
-}
-
-/* Calculate the intersection of the sets SRC1 and SRC2. And merge it to
- DEST. Return value indicate the error code or REG_NOERROR if succeeded.
- Note: We assume dest->elems is NULL, when dest->alloc is 0. */
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-re_node_set_add_intersect (re_node_set *dest, const re_node_set *src1,
- const re_node_set *src2)
-{
- Idx i1, i2, is, id, delta, sbase;
- if (src1->nelem == 0 || src2->nelem == 0)
- return REG_NOERROR;
-
- /* We need dest->nelem + 2 * elems_in_intersection; this is a
- conservative estimate. */
- if (src1->nelem + src2->nelem + dest->nelem > dest->alloc)
- {
- Idx new_alloc = src1->nelem + src2->nelem + dest->alloc;
- Idx *new_elems = re_realloc (dest->elems, Idx, new_alloc);
- if (__glibc_unlikely (new_elems == NULL))
- return REG_ESPACE;
- dest->elems = new_elems;
- dest->alloc = new_alloc;
- }
-
- /* Find the items in the intersection of SRC1 and SRC2, and copy
- into the top of DEST those that are not already in DEST itself. */
- sbase = dest->nelem + src1->nelem + src2->nelem;
- i1 = src1->nelem - 1;
- i2 = src2->nelem - 1;
- id = dest->nelem - 1;
- for (;;)
- {
- if (src1->elems[i1] == src2->elems[i2])
- {
- /* Try to find the item in DEST. Maybe we could binary search? */
- while (id >= 0 && dest->elems[id] > src1->elems[i1])
- --id;
-
- if (id < 0 || dest->elems[id] != src1->elems[i1])
- dest->elems[--sbase] = src1->elems[i1];
-
- if (--i1 < 0 || --i2 < 0)
- break;
- }
-
- /* Lower the highest of the two items. */
- else if (src1->elems[i1] < src2->elems[i2])
- {
- if (--i2 < 0)
- break;
- }
- else
- {
- if (--i1 < 0)
- break;
- }
- }
-
- id = dest->nelem - 1;
- is = dest->nelem + src1->nelem + src2->nelem - 1;
- delta = is - sbase + 1;
-
- /* Now copy. When DELTA becomes zero, the remaining
- DEST elements are already in place; this is more or
- less the same loop that is in re_node_set_merge. */
- dest->nelem += delta;
- if (delta > 0 && id >= 0)
- for (;;)
- {
- if (dest->elems[is] > dest->elems[id])
- {
- /* Copy from the top. */
- dest->elems[id + delta--] = dest->elems[is--];
- if (delta == 0)
- break;
- }
- else
- {
- /* Slide from the bottom. */
- dest->elems[id + delta] = dest->elems[id];
- if (--id < 0)
- break;
- }
- }
-
- /* Copy remaining SRC elements. */
- memcpy (dest->elems, dest->elems + sbase, delta * sizeof (Idx));
-
- return REG_NOERROR;
-}
-
-/* Calculate the union set of the sets SRC1 and SRC2. And store it to
- DEST. Return value indicate the error code or REG_NOERROR if succeeded. */
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-re_node_set_init_union (re_node_set *dest, const re_node_set *src1,
- const re_node_set *src2)
-{
- Idx i1, i2, id;
- if (src1 != NULL && src1->nelem > 0 && src2 != NULL && src2->nelem > 0)
- {
- dest->alloc = src1->nelem + src2->nelem;
- dest->elems = re_malloc (Idx, dest->alloc);
- if (__glibc_unlikely (dest->elems == NULL))
- return REG_ESPACE;
- }
- else
- {
- if (src1 != NULL && src1->nelem > 0)
- return re_node_set_init_copy (dest, src1);
- else if (src2 != NULL && src2->nelem > 0)
- return re_node_set_init_copy (dest, src2);
- else
- re_node_set_init_empty (dest);
- return REG_NOERROR;
- }
- for (i1 = i2 = id = 0 ; i1 < src1->nelem && i2 < src2->nelem ;)
- {
- if (src1->elems[i1] > src2->elems[i2])
- {
- dest->elems[id++] = src2->elems[i2++];
- continue;
- }
- if (src1->elems[i1] == src2->elems[i2])
- ++i2;
- dest->elems[id++] = src1->elems[i1++];
- }
- if (i1 < src1->nelem)
- {
- memcpy (dest->elems + id, src1->elems + i1,
- (src1->nelem - i1) * sizeof (Idx));
- id += src1->nelem - i1;
- }
- else if (i2 < src2->nelem)
- {
- memcpy (dest->elems + id, src2->elems + i2,
- (src2->nelem - i2) * sizeof (Idx));
- id += src2->nelem - i2;
- }
- dest->nelem = id;
- return REG_NOERROR;
-}
-
-/* Calculate the union set of the sets DEST and SRC. And store it to
- DEST. Return value indicate the error code or REG_NOERROR if succeeded. */
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-re_node_set_merge (re_node_set *dest, const re_node_set *src)
-{
- Idx is, id, sbase, delta;
- if (src == NULL || src->nelem == 0)
- return REG_NOERROR;
- if (dest->alloc < 2 * src->nelem + dest->nelem)
- {
- Idx new_alloc = 2 * (src->nelem + dest->alloc);
- Idx *new_buffer = re_realloc (dest->elems, Idx, new_alloc);
- if (__glibc_unlikely (new_buffer == NULL))
- return REG_ESPACE;
- dest->elems = new_buffer;
- dest->alloc = new_alloc;
- }
-
- if (__glibc_unlikely (dest->nelem == 0))
- {
- /* Although we already guaranteed above that dest->alloc != 0 and
- therefore dest->elems != NULL, add a debug assertion to pacify
- GCC 11.2.1's -fanalyzer. */
- DEBUG_ASSERT (dest->elems);
- dest->nelem = src->nelem;
- memcpy (dest->elems, src->elems, src->nelem * sizeof (Idx));
- return REG_NOERROR;
- }
-
- /* Copy into the top of DEST the items of SRC that are not
- found in DEST. Maybe we could binary search in DEST? */
- for (sbase = dest->nelem + 2 * src->nelem,
- is = src->nelem - 1, id = dest->nelem - 1; is >= 0 && id >= 0; )
- {
- if (dest->elems[id] == src->elems[is])
- is--, id--;
- else if (dest->elems[id] < src->elems[is])
- dest->elems[--sbase] = src->elems[is--];
- else /* if (dest->elems[id] > src->elems[is]) */
- --id;
- }
-
- if (is >= 0)
- {
- /* If DEST is exhausted, the remaining items of SRC must be unique. */
- sbase -= is + 1;
- memcpy (dest->elems + sbase, src->elems, (is + 1) * sizeof (Idx));
- }
-
- id = dest->nelem - 1;
- is = dest->nelem + 2 * src->nelem - 1;
- delta = is - sbase + 1;
- if (delta == 0)
- return REG_NOERROR;
-
- /* Now copy. When DELTA becomes zero, the remaining
- DEST elements are already in place. */
- dest->nelem += delta;
- for (;;)
- {
- if (dest->elems[is] > dest->elems[id])
- {
- /* Copy from the top. */
- dest->elems[id + delta--] = dest->elems[is--];
- if (delta == 0)
- break;
- }
- else
- {
- /* Slide from the bottom. */
- dest->elems[id + delta] = dest->elems[id];
- if (--id < 0)
- {
- /* Copy remaining SRC elements. */
- memcpy (dest->elems, dest->elems + sbase,
- delta * sizeof (Idx));
- break;
- }
- }
- }
-
- return REG_NOERROR;
-}
-
-/* Insert the new element ELEM to the re_node_set* SET.
- SET should not already have ELEM.
- Return true if successful. */
-
-static bool
-__attribute_warn_unused_result__
-re_node_set_insert (re_node_set *set, Idx elem)
-{
- Idx idx;
- /* In case the set is empty. */
- if (set->alloc == 0)
- return __glibc_likely (re_node_set_init_1 (set, elem) == REG_NOERROR);
-
- if (__glibc_unlikely (set->nelem) == 0)
- {
- /* Although we already guaranteed above that set->alloc != 0 and
- therefore set->elems != NULL, add a debug assertion to pacify
- GCC 11.2 -fanalyzer. */
- DEBUG_ASSERT (set->elems);
- set->elems[0] = elem;
- ++set->nelem;
- return true;
- }
-
- /* Realloc if we need. */
- if (set->alloc == set->nelem)
- {
- Idx *new_elems;
- set->alloc = set->alloc * 2;
- new_elems = re_realloc (set->elems, Idx, set->alloc);
- if (__glibc_unlikely (new_elems == NULL))
- return false;
- set->elems = new_elems;
- }
-
- /* Move the elements which follows the new element. Test the
- first element separately to skip a check in the inner loop. */
- if (elem < set->elems[0])
- {
- for (idx = set->nelem; idx > 0; idx--)
- set->elems[idx] = set->elems[idx - 1];
- }
- else
- {
- for (idx = set->nelem; set->elems[idx - 1] > elem; idx--)
- set->elems[idx] = set->elems[idx - 1];
- DEBUG_ASSERT (set->elems[idx - 1] < elem);
- }
-
- /* Insert the new element. */
- set->elems[idx] = elem;
- ++set->nelem;
- return true;
-}
-
-/* Insert the new element ELEM to the re_node_set* SET.
- SET should not already have any element greater than or equal to ELEM.
- Return true if successful. */
-
-static bool
-__attribute_warn_unused_result__
-re_node_set_insert_last (re_node_set *set, Idx elem)
-{
- /* Realloc if we need. */
- if (set->alloc == set->nelem)
- {
- Idx *new_elems;
- set->alloc = (set->alloc + 1) * 2;
- new_elems = re_realloc (set->elems, Idx, set->alloc);
- if (__glibc_unlikely (new_elems == NULL))
- return false;
- set->elems = new_elems;
- }
-
- /* Insert the new element. */
- set->elems[set->nelem++] = elem;
- return true;
-}
-
-/* Compare two node sets SET1 and SET2.
- Return true if SET1 and SET2 are equivalent. */
-
-static bool
-__attribute__ ((pure))
-re_node_set_compare (const re_node_set *set1, const re_node_set *set2)
-{
- Idx i;
- if (set1 == NULL || set2 == NULL || set1->nelem != set2->nelem)
- return false;
- for (i = set1->nelem ; --i >= 0 ; )
- if (set1->elems[i] != set2->elems[i])
- return false;
- return true;
-}
-
-/* Return (idx + 1) if SET contains the element ELEM, return 0 otherwise. */
-
-static Idx
-__attribute__ ((pure))
-re_node_set_contains (const re_node_set *set, Idx elem)
-{
- __re_size_t idx, right, mid;
- if (set->nelem <= 0)
- return 0;
-
- /* Binary search the element. */
- idx = 0;
- right = set->nelem - 1;
- while (idx < right)
- {
- mid = (idx + right) / 2;
- if (set->elems[mid] < elem)
- idx = mid + 1;
- else
- right = mid;
- }
- return set->elems[idx] == elem ? idx + 1 : 0;
-}
-
-static void
-re_node_set_remove_at (re_node_set *set, Idx idx)
-{
- if (idx < 0 || idx >= set->nelem)
- return;
- --set->nelem;
- for (; idx < set->nelem; idx++)
- set->elems[idx] = set->elems[idx + 1];
-}
-
-
-/* Add the token TOKEN to dfa->nodes, and return the index of the token.
- Or return -1 if an error occurred. */
-
-static Idx
-re_dfa_add_node (re_dfa_t *dfa, re_token_t token)
-{
- if (__glibc_unlikely (dfa->nodes_len >= dfa->nodes_alloc))
- {
- size_t new_nodes_alloc = dfa->nodes_alloc * 2;
- Idx *new_nexts, *new_indices;
- re_node_set *new_edests, *new_eclosures;
- re_token_t *new_nodes;
-
- /* Avoid overflows in realloc. */
- const size_t max_object_size = MAX (sizeof (re_token_t),
- MAX (sizeof (re_node_set),
- sizeof (Idx)));
- if (__glibc_unlikely (MIN (IDX_MAX, SIZE_MAX / max_object_size)
- < new_nodes_alloc))
- return -1;
-
- new_nodes = re_realloc (dfa->nodes, re_token_t, new_nodes_alloc);
- if (__glibc_unlikely (new_nodes == NULL))
- return -1;
- dfa->nodes = new_nodes;
- dfa->nodes_alloc = new_nodes_alloc;
- new_nexts = re_realloc (dfa->nexts, Idx, new_nodes_alloc);
- if (new_nexts != NULL)
- dfa->nexts = new_nexts;
- new_indices = re_realloc (dfa->org_indices, Idx, new_nodes_alloc);
- if (new_indices != NULL)
- dfa->org_indices = new_indices;
- new_edests = re_realloc (dfa->edests, re_node_set, new_nodes_alloc);
- if (new_edests != NULL)
- dfa->edests = new_edests;
- new_eclosures = re_realloc (dfa->eclosures, re_node_set, new_nodes_alloc);
- if (new_eclosures != NULL)
- dfa->eclosures = new_eclosures;
- if (__glibc_unlikely (new_nexts == NULL || new_indices == NULL
- || new_edests == NULL || new_eclosures == NULL))
- return -1;
- }
- dfa->nodes[dfa->nodes_len] = token;
- dfa->nodes[dfa->nodes_len].constraint = 0;
- dfa->nodes[dfa->nodes_len].accept_mb =
- ((token.type == OP_PERIOD && dfa->mb_cur_max > 1)
- || token.type == COMPLEX_BRACKET);
- dfa->nexts[dfa->nodes_len] = -1;
- re_node_set_init_empty (dfa->edests + dfa->nodes_len);
- re_node_set_init_empty (dfa->eclosures + dfa->nodes_len);
- return dfa->nodes_len++;
-}
-
-static re_hashval_t
-calc_state_hash (const re_node_set *nodes, unsigned int context)
-{
- re_hashval_t hash = nodes->nelem + context;
- Idx i;
- for (i = 0 ; i < nodes->nelem ; i++)
- hash += nodes->elems[i];
- return hash;
-}
-
-/* Search for the state whose node_set is equivalent to NODES.
- Return the pointer to the state, if we found it in the DFA.
- Otherwise create the new one and return it. In case of an error
- return NULL and set the error code in ERR.
- Note: - We assume NULL as the invalid state, then it is possible that
- return value is NULL and ERR is REG_NOERROR.
- - We never return non-NULL value in case of any errors, it is for
- optimization. */
-
-static re_dfastate_t *
-__attribute_warn_unused_result__
-re_acquire_state (reg_errcode_t *err, const re_dfa_t *dfa,
- const re_node_set *nodes)
-{
- re_hashval_t hash;
- re_dfastate_t *new_state;
- struct re_state_table_entry *spot;
- Idx i;
-#if defined GCC_LINT || defined lint
- /* Suppress bogus uninitialized-variable warnings. */
- *err = REG_NOERROR;
-#endif
- if (__glibc_unlikely (nodes->nelem == 0))
- {
- *err = REG_NOERROR;
- return NULL;
- }
- hash = calc_state_hash (nodes, 0);
- spot = dfa->state_table + (hash & dfa->state_hash_mask);
-
- for (i = 0 ; i < spot->num ; i++)
- {
- re_dfastate_t *state = spot->array[i];
- if (hash != state->hash)
- continue;
- if (re_node_set_compare (&state->nodes, nodes))
- return state;
- }
-
- /* There are no appropriate state in the dfa, create the new one. */
- new_state = create_ci_newstate (dfa, nodes, hash);
- if (__glibc_unlikely (new_state == NULL))
- *err = REG_ESPACE;
-
- return new_state;
-}
-
-/* Search for the state whose node_set is equivalent to NODES and
- whose context is equivalent to CONTEXT.
- Return the pointer to the state, if we found it in the DFA.
- Otherwise create the new one and return it. In case of an error
- return NULL and set the error code in ERR.
- Note: - We assume NULL as the invalid state, then it is possible that
- return value is NULL and ERR is REG_NOERROR.
- - We never return non-NULL value in case of any errors, it is for
- optimization. */
-
-static re_dfastate_t *
-__attribute_warn_unused_result__
-re_acquire_state_context (reg_errcode_t *err, const re_dfa_t *dfa,
- const re_node_set *nodes, unsigned int context)
-{
- re_hashval_t hash;
- re_dfastate_t *new_state;
- struct re_state_table_entry *spot;
- Idx i;
-#if defined GCC_LINT || defined lint
- /* Suppress bogus uninitialized-variable warnings. */
- *err = REG_NOERROR;
-#endif
- if (nodes->nelem == 0)
- {
- *err = REG_NOERROR;
- return NULL;
- }
- hash = calc_state_hash (nodes, context);
- spot = dfa->state_table + (hash & dfa->state_hash_mask);
-
- for (i = 0 ; i < spot->num ; i++)
- {
- re_dfastate_t *state = spot->array[i];
- if (state->hash == hash
- && state->context == context
- && re_node_set_compare (state->entrance_nodes, nodes))
- return state;
- }
- /* There are no appropriate state in 'dfa', create the new one. */
- new_state = create_cd_newstate (dfa, nodes, context, hash);
- if (__glibc_unlikely (new_state == NULL))
- *err = REG_ESPACE;
-
- return new_state;
-}
-
-/* Finish initialization of the new state NEWSTATE, and using its hash value
- HASH put in the appropriate bucket of DFA's state table. Return value
- indicates the error code if failed. */
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-register_state (const re_dfa_t *dfa, re_dfastate_t *newstate,
- re_hashval_t hash)
-{
- struct re_state_table_entry *spot;
- reg_errcode_t err;
- Idx i;
-
- newstate->hash = hash;
- err = re_node_set_alloc (&newstate->non_eps_nodes, newstate->nodes.nelem);
- if (__glibc_unlikely (err != REG_NOERROR))
- return REG_ESPACE;
- for (i = 0; i < newstate->nodes.nelem; i++)
- {
- Idx elem = newstate->nodes.elems[i];
- if (!IS_EPSILON_NODE (dfa->nodes[elem].type))
- if (! re_node_set_insert_last (&newstate->non_eps_nodes, elem))
- return REG_ESPACE;
- }
-
- spot = dfa->state_table + (hash & dfa->state_hash_mask);
- if (__glibc_unlikely (spot->alloc <= spot->num))
- {
- Idx new_alloc = 2 * spot->num + 2;
- re_dfastate_t **new_array = re_realloc (spot->array, re_dfastate_t *,
- new_alloc);
- if (__glibc_unlikely (new_array == NULL))
- return REG_ESPACE;
- spot->array = new_array;
- spot->alloc = new_alloc;
- }
- spot->array[spot->num++] = newstate;
- return REG_NOERROR;
-}
-
-static void
-free_state (re_dfastate_t *state)
-{
- re_node_set_free (&state->non_eps_nodes);
- re_node_set_free (&state->inveclosure);
- if (state->entrance_nodes != &state->nodes)
- {
- re_node_set_free (state->entrance_nodes);
- re_free (state->entrance_nodes);
- }
- re_node_set_free (&state->nodes);
- re_free (state->word_trtable);
- re_free (state->trtable);
- re_free (state);
-}
-
-/* Create the new state which is independent of contexts.
- Return the new state if succeeded, otherwise return NULL. */
-
-static re_dfastate_t *
-__attribute_warn_unused_result__
-create_ci_newstate (const re_dfa_t *dfa, const re_node_set *nodes,
- re_hashval_t hash)
-{
- Idx i;
- reg_errcode_t err;
- re_dfastate_t *newstate;
-
- newstate = (re_dfastate_t *) calloc (sizeof (re_dfastate_t), 1);
- if (__glibc_unlikely (newstate == NULL))
- return NULL;
- err = re_node_set_init_copy (&newstate->nodes, nodes);
- if (__glibc_unlikely (err != REG_NOERROR))
- {
- re_free (newstate);
- return NULL;
- }
-
- newstate->entrance_nodes = &newstate->nodes;
- for (i = 0 ; i < nodes->nelem ; i++)
- {
- re_token_t *node = dfa->nodes + nodes->elems[i];
- re_token_type_t type = node->type;
- if (type == CHARACTER && !node->constraint)
- continue;
- newstate->accept_mb |= node->accept_mb;
-
- /* If the state has the halt node, the state is a halt state. */
- if (type == END_OF_RE)
- newstate->halt = 1;
- else if (type == OP_BACK_REF)
- newstate->has_backref = 1;
- else if (type == ANCHOR || node->constraint)
- newstate->has_constraint = 1;
- }
- err = register_state (dfa, newstate, hash);
- if (__glibc_unlikely (err != REG_NOERROR))
- {
- free_state (newstate);
- newstate = NULL;
- }
- return newstate;
-}
-
-/* Create the new state which is depend on the context CONTEXT.
- Return the new state if succeeded, otherwise return NULL. */
-
-static re_dfastate_t *
-__attribute_warn_unused_result__
-create_cd_newstate (const re_dfa_t *dfa, const re_node_set *nodes,
- unsigned int context, re_hashval_t hash)
-{
- Idx i, nctx_nodes = 0;
- reg_errcode_t err;
- re_dfastate_t *newstate;
-
- newstate = (re_dfastate_t *) calloc (sizeof (re_dfastate_t), 1);
- if (__glibc_unlikely (newstate == NULL))
- return NULL;
- err = re_node_set_init_copy (&newstate->nodes, nodes);
- if (__glibc_unlikely (err != REG_NOERROR))
- {
- re_free (newstate);
- return NULL;
- }
-
- newstate->context = context;
- newstate->entrance_nodes = &newstate->nodes;
-
- for (i = 0 ; i < nodes->nelem ; i++)
- {
- re_token_t *node = dfa->nodes + nodes->elems[i];
- re_token_type_t type = node->type;
- unsigned int constraint = node->constraint;
-
- if (type == CHARACTER && !constraint)
- continue;
- newstate->accept_mb |= node->accept_mb;
-
- /* If the state has the halt node, the state is a halt state. */
- if (type == END_OF_RE)
- newstate->halt = 1;
- else if (type == OP_BACK_REF)
- newstate->has_backref = 1;
-
- if (constraint)
- {
- if (newstate->entrance_nodes == &newstate->nodes)
- {
- re_node_set *entrance_nodes = re_malloc (re_node_set, 1);
- if (__glibc_unlikely (entrance_nodes == NULL))
- {
- free_state (newstate);
- return NULL;
- }
- newstate->entrance_nodes = entrance_nodes;
- if (re_node_set_init_copy (newstate->entrance_nodes, nodes)
- != REG_NOERROR)
- {
- free_state (newstate);
- return NULL;
- }
- nctx_nodes = 0;
- newstate->has_constraint = 1;
- }
-
- if (NOT_SATISFY_PREV_CONSTRAINT (constraint,context))
- {
- re_node_set_remove_at (&newstate->nodes, i - nctx_nodes);
- ++nctx_nodes;
- }
- }
- }
- err = register_state (dfa, newstate, hash);
- if (__glibc_unlikely (err != REG_NOERROR))
- {
- free_state (newstate);
- newstate = NULL;
- }
- return newstate;
-}
diff --git a/cross/lib/regex_internal.h b/cross/lib/regex_internal.h
deleted file mode 100644
index 149ec2e868a..00000000000
--- a/cross/lib/regex_internal.h
+++ /dev/null
@@ -1,834 +0,0 @@
-/* Extended regular expression matching and search library.
- Copyright (C) 2002-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _REGEX_INTERNAL_H
-#define _REGEX_INTERNAL_H 1
-
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <langinfo.h>
-#include <locale.h>
-#include <wchar.h>
-#include <wctype.h>
-#include <stdint.h>
-
-#ifndef _LIBC
-# include <dynarray.h>
-#endif
-
-#include <intprops.h>
-#include <verify.h>
-
-#if defined DEBUG && DEBUG != 0
-# include <assert.h>
-# define DEBUG_ASSERT(x) assert (x)
-#else
-# define DEBUG_ASSERT(x) assume (x)
-#endif
-
-#ifdef _LIBC
-# include <libc-lock.h>
-# define lock_define(name) __libc_lock_define (, name)
-# define lock_init(lock) (__libc_lock_init (lock), 0)
-# define lock_fini(lock) ((void) 0)
-# define lock_lock(lock) __libc_lock_lock (lock)
-# define lock_unlock(lock) __libc_lock_unlock (lock)
-#elif defined GNULIB_LOCK && !defined GNULIB_REGEX_SINGLE_THREAD
-# include "glthread/lock.h"
-# define lock_define(name) gl_lock_define (, name)
-# define lock_init(lock) glthread_lock_init (&(lock))
-# define lock_fini(lock) glthread_lock_destroy (&(lock))
-# define lock_lock(lock) glthread_lock_lock (&(lock))
-# define lock_unlock(lock) glthread_lock_unlock (&(lock))
-#elif defined GNULIB_PTHREAD && !defined GNULIB_REGEX_SINGLE_THREAD
-# include <pthread.h>
-# define lock_define(name) pthread_mutex_t name;
-# define lock_init(lock) pthread_mutex_init (&(lock), 0)
-# define lock_fini(lock) pthread_mutex_destroy (&(lock))
-# define lock_lock(lock) pthread_mutex_lock (&(lock))
-# define lock_unlock(lock) pthread_mutex_unlock (&(lock))
-#else
-# define lock_define(name)
-# define lock_init(lock) 0
-# define lock_fini(lock) ((void) 0)
- /* The 'dfa' avoids an "unused variable 'dfa'" warning from GCC. */
-# define lock_lock(lock) ((void) dfa)
-# define lock_unlock(lock) ((void) 0)
-#endif
-
-/* In case that the system doesn't have isblank(). */
-#if !defined _LIBC && ! (defined isblank || (HAVE_ISBLANK && HAVE_DECL_ISBLANK))
-# define isblank(ch) ((ch) == ' ' || (ch) == '\t')
-#endif
-
-/* regex code assumes isascii has its usual numeric meaning,
- even if the portable character set uses EBCDIC encoding,
- and even if wint_t is wider than int. */
-#ifndef _LIBC
-# undef isascii
-# define isascii(c) (((c) & ~0x7f) == 0)
-#endif
-
-#ifdef _LIBC
-# ifndef _RE_DEFINE_LOCALE_FUNCTIONS
-# define _RE_DEFINE_LOCALE_FUNCTIONS 1
-# include <locale/localeinfo.h>
-# include <locale/coll-lookup.h>
-# endif
-#endif
-
-/* This is for other GNU distributions with internationalized messages. */
-#if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC
-# include <libintl.h>
-# ifdef _LIBC
-# undef gettext
-# define gettext(msgid) \
- __dcgettext (_libc_intl_domainname, msgid, LC_MESSAGES)
-# endif
-#else
-# undef gettext
-# define gettext(msgid) (msgid)
-#endif
-
-#ifndef gettext_noop
-/* This define is so xgettext can find the internationalizable
- strings. */
-# define gettext_noop(String) String
-#endif
-
-/* Number of ASCII characters. */
-#define ASCII_CHARS 0x80
-
-/* Number of single byte characters. */
-#define SBC_MAX (UCHAR_MAX + 1)
-
-#define COLL_ELEM_LEN_MAX 8
-
-/* The character which represents newline. */
-#define NEWLINE_CHAR '\n'
-#define WIDE_NEWLINE_CHAR L'\n'
-
-/* Rename to standard API for using out of glibc. */
-#ifndef _LIBC
-# undef __wctype
-# undef __iswalnum
-# undef __iswctype
-# undef __towlower
-# undef __towupper
-# define __wctype wctype
-# define __iswalnum iswalnum
-# define __iswctype iswctype
-# define __towlower towlower
-# define __towupper towupper
-# define __btowc btowc
-# define __mbrtowc mbrtowc
-# define __wcrtomb wcrtomb
-# define __regfree regfree
-#endif /* not _LIBC */
-
-/* Types related to integers. Unless protected by #ifdef _LIBC, the
- regex code should avoid exact-width types like int32_t and uint64_t
- as some non-GCC platforms lack them, an issue when this code is
- used in Gnulib. */
-
-#ifndef SSIZE_MAX
-# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
-#endif
-#ifndef ULONG_WIDTH
-# define ULONG_WIDTH REGEX_UINTEGER_WIDTH (ULONG_MAX)
-/* The number of usable bits in an unsigned integer type with 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 REGEX_UINTEGER_WIDTH(max) REGEX_COB128 (max)
-# define REGEX_COB128(n) (REGEX_COB64 ((n) >> 31 >> 31 >> 2) + REGEX_COB64 (n))
-# define REGEX_COB64(n) (REGEX_COB32 ((n) >> 31 >> 1) + REGEX_COB32 (n))
-# define REGEX_COB32(n) (REGEX_COB16 ((n) >> 16) + REGEX_COB16 (n))
-# define REGEX_COB16(n) (REGEX_COB8 ((n) >> 8) + REGEX_COB8 (n))
-# define REGEX_COB8(n) (REGEX_COB4 ((n) >> 4) + REGEX_COB4 (n))
-# define REGEX_COB4(n) (!!((n) & 8) + !!((n) & 4) + !!((n) & 2) + ((n) & 1))
-# if ULONG_MAX / 2 + 1 != 1ul << (ULONG_WIDTH - 1)
-# error "ULONG_MAX out of range"
-# endif
-#endif
-
-/* The type of indexes into strings. This is signed, not size_t,
- since the API requires indexes to fit in regoff_t anyway, and using
- signed integers makes the code a bit smaller and presumably faster.
- The traditional GNU regex implementation uses int for indexes.
- The POSIX-compatible implementation uses a possibly-wider type.
- The name 'Idx' is three letters to minimize the hassle of
- reindenting a lot of regex code that formerly used 'int'. */
-typedef regoff_t Idx;
-#ifdef _REGEX_LARGE_OFFSETS
-# define IDX_MAX SSIZE_MAX
-#else
-# define IDX_MAX INT_MAX
-#endif
-
-/* A hash value, suitable for computing hash tables. */
-typedef __re_size_t re_hashval_t;
-
-/* An integer used to represent a set of bits. It must be unsigned,
- and must be at least as wide as unsigned int. */
-typedef unsigned long int bitset_word_t;
-/* All bits set in a bitset_word_t. */
-#define BITSET_WORD_MAX ULONG_MAX
-/* Number of bits in a bitset_word_t. */
-#define BITSET_WORD_BITS ULONG_WIDTH
-
-/* Number of bitset_word_t values in a bitset_t. */
-#define BITSET_WORDS ((SBC_MAX + BITSET_WORD_BITS - 1) / BITSET_WORD_BITS)
-
-typedef bitset_word_t bitset_t[BITSET_WORDS];
-typedef bitset_word_t *re_bitset_ptr_t;
-typedef const bitset_word_t *re_const_bitset_ptr_t;
-
-#define PREV_WORD_CONSTRAINT 0x0001
-#define PREV_NOTWORD_CONSTRAINT 0x0002
-#define NEXT_WORD_CONSTRAINT 0x0004
-#define NEXT_NOTWORD_CONSTRAINT 0x0008
-#define PREV_NEWLINE_CONSTRAINT 0x0010
-#define NEXT_NEWLINE_CONSTRAINT 0x0020
-#define PREV_BEGBUF_CONSTRAINT 0x0040
-#define NEXT_ENDBUF_CONSTRAINT 0x0080
-#define WORD_DELIM_CONSTRAINT 0x0100
-#define NOT_WORD_DELIM_CONSTRAINT 0x0200
-
-typedef enum
-{
- INSIDE_WORD = PREV_WORD_CONSTRAINT | NEXT_WORD_CONSTRAINT,
- WORD_FIRST = PREV_NOTWORD_CONSTRAINT | NEXT_WORD_CONSTRAINT,
- WORD_LAST = PREV_WORD_CONSTRAINT | NEXT_NOTWORD_CONSTRAINT,
- INSIDE_NOTWORD = PREV_NOTWORD_CONSTRAINT | NEXT_NOTWORD_CONSTRAINT,
- LINE_FIRST = PREV_NEWLINE_CONSTRAINT,
- LINE_LAST = NEXT_NEWLINE_CONSTRAINT,
- BUF_FIRST = PREV_BEGBUF_CONSTRAINT,
- BUF_LAST = NEXT_ENDBUF_CONSTRAINT,
- WORD_DELIM = WORD_DELIM_CONSTRAINT,
- NOT_WORD_DELIM = NOT_WORD_DELIM_CONSTRAINT
-} re_context_type;
-
-typedef struct
-{
- Idx alloc;
- Idx nelem;
- Idx *elems;
-} re_node_set;
-
-typedef enum
-{
- NON_TYPE = 0,
-
- /* Node type, These are used by token, node, tree. */
- CHARACTER = 1,
- END_OF_RE = 2,
- SIMPLE_BRACKET = 3,
- OP_BACK_REF = 4,
- OP_PERIOD = 5,
- COMPLEX_BRACKET = 6,
- OP_UTF8_PERIOD = 7,
-
- /* We define EPSILON_BIT as a macro so that OP_OPEN_SUBEXP is used
- when the debugger shows values of this enum type. */
-#define EPSILON_BIT 8
- OP_OPEN_SUBEXP = EPSILON_BIT | 0,
- OP_CLOSE_SUBEXP = EPSILON_BIT | 1,
- OP_ALT = EPSILON_BIT | 2,
- OP_DUP_ASTERISK = EPSILON_BIT | 3,
- ANCHOR = EPSILON_BIT | 4,
-
- /* Tree type, these are used only by tree. */
- CONCAT = 16,
- SUBEXP = 17,
-
- /* Token type, these are used only by token. */
- OP_DUP_PLUS = 18,
- OP_DUP_QUESTION,
- OP_OPEN_BRACKET,
- OP_CLOSE_BRACKET,
- OP_CHARSET_RANGE,
- OP_OPEN_DUP_NUM,
- OP_CLOSE_DUP_NUM,
- OP_NON_MATCH_LIST,
- OP_OPEN_COLL_ELEM,
- OP_CLOSE_COLL_ELEM,
- OP_OPEN_EQUIV_CLASS,
- OP_CLOSE_EQUIV_CLASS,
- OP_OPEN_CHAR_CLASS,
- OP_CLOSE_CHAR_CLASS,
- OP_WORD,
- OP_NOTWORD,
- OP_SPACE,
- OP_NOTSPACE,
- BACK_SLASH
-
-} re_token_type_t;
-
-typedef struct
-{
- /* Multibyte characters. */
- wchar_t *mbchars;
-
-#ifdef _LIBC
- /* Collating symbols. */
- int32_t *coll_syms;
-#endif
-
-#ifdef _LIBC
- /* Equivalence classes. */
- int32_t *equiv_classes;
-#endif
-
- /* Range expressions. */
-#ifdef _LIBC
- uint32_t *range_starts;
- uint32_t *range_ends;
-#else
- wchar_t *range_starts;
- wchar_t *range_ends;
-#endif
-
- /* Character classes. */
- wctype_t *char_classes;
-
- /* If this character set is the non-matching list. */
- unsigned int non_match : 1;
-
- /* # of multibyte characters. */
- Idx nmbchars;
-
- /* # of collating symbols. */
- Idx ncoll_syms;
-
- /* # of equivalence classes. */
- Idx nequiv_classes;
-
- /* # of range expressions. */
- Idx nranges;
-
- /* # of character classes. */
- Idx nchar_classes;
-} re_charset_t;
-
-typedef struct
-{
- union
- {
- unsigned char c; /* for CHARACTER */
- re_bitset_ptr_t sbcset; /* for SIMPLE_BRACKET */
- re_charset_t *mbcset; /* for COMPLEX_BRACKET */
- Idx idx; /* for BACK_REF */
- re_context_type ctx_type; /* for ANCHOR */
- } opr;
-#if (__GNUC__ >= 2 || defined __clang__) && !defined __STRICT_ANSI__
- re_token_type_t type : 8;
-#else
- re_token_type_t type;
-#endif
- unsigned int constraint : 10; /* context constraint */
- unsigned int duplicated : 1;
- unsigned int opt_subexp : 1;
- unsigned int accept_mb : 1;
- /* These 2 bits can be moved into the union if needed (e.g. if running out
- of bits; move opr.c to opr.c.c and move the flags to opr.c.flags). */
- unsigned int mb_partial : 1;
- unsigned int word_char : 1;
-} re_token_t;
-
-#define IS_EPSILON_NODE(type) ((type) & EPSILON_BIT)
-
-struct re_string_t
-{
- /* Indicate the raw buffer which is the original string passed as an
- argument of regexec(), re_search(), etc.. */
- const unsigned char *raw_mbs;
- /* Store the multibyte string. In case of "case insensitive mode" like
- REG_ICASE, upper cases of the string are stored, otherwise MBS points
- the same address that RAW_MBS points. */
- unsigned char *mbs;
- /* Store the wide character string which is corresponding to MBS. */
- wint_t *wcs;
- Idx *offsets;
- mbstate_t cur_state;
- /* Index in RAW_MBS. Each character mbs[i] corresponds to
- raw_mbs[raw_mbs_idx + i]. */
- Idx raw_mbs_idx;
- /* The length of the valid characters in the buffers. */
- Idx valid_len;
- /* The corresponding number of bytes in raw_mbs array. */
- Idx valid_raw_len;
- /* The length of the buffers MBS and WCS. */
- Idx bufs_len;
- /* The index in MBS, which is updated by re_string_fetch_byte. */
- Idx cur_idx;
- /* length of RAW_MBS array. */
- Idx raw_len;
- /* This is RAW_LEN - RAW_MBS_IDX + VALID_LEN - VALID_RAW_LEN. */
- Idx len;
- /* End of the buffer may be shorter than its length in the cases such
- as re_match_2, re_search_2. Then, we use STOP for end of the buffer
- instead of LEN. */
- Idx raw_stop;
- /* This is RAW_STOP - RAW_MBS_IDX adjusted through OFFSETS. */
- Idx stop;
-
- /* The context of mbs[0]. We store the context independently, since
- the context of mbs[0] may be different from raw_mbs[0], which is
- the beginning of the input string. */
- unsigned int tip_context;
- /* The translation passed as a part of an argument of re_compile_pattern. */
- RE_TRANSLATE_TYPE trans;
- /* Copy of re_dfa_t's word_char. */
- re_const_bitset_ptr_t word_char;
- /* true if REG_ICASE. */
- unsigned char icase;
- unsigned char is_utf8;
- unsigned char map_notascii;
- unsigned char mbs_allocated;
- unsigned char offsets_needed;
- unsigned char newline_anchor;
- unsigned char word_ops_used;
- int mb_cur_max;
-};
-typedef struct re_string_t re_string_t;
-
-
-struct re_dfa_t;
-typedef struct re_dfa_t re_dfa_t;
-
-#ifndef _LIBC
-# define IS_IN(libc) false
-#endif
-
-#define re_string_peek_byte(pstr, offset) \
- ((pstr)->mbs[(pstr)->cur_idx + offset])
-#define re_string_fetch_byte(pstr) \
- ((pstr)->mbs[(pstr)->cur_idx++])
-#define re_string_first_byte(pstr, idx) \
- ((idx) == (pstr)->valid_len || (pstr)->wcs[idx] != WEOF)
-#define re_string_is_single_byte_char(pstr, idx) \
- ((pstr)->wcs[idx] != WEOF && ((pstr)->valid_len == (idx) + 1 \
- || (pstr)->wcs[(idx) + 1] != WEOF))
-#define re_string_eoi(pstr) ((pstr)->stop <= (pstr)->cur_idx)
-#define re_string_cur_idx(pstr) ((pstr)->cur_idx)
-#define re_string_get_buffer(pstr) ((pstr)->mbs)
-#define re_string_length(pstr) ((pstr)->len)
-#define re_string_byte_at(pstr,idx) ((pstr)->mbs[idx])
-#define re_string_skip_bytes(pstr,idx) ((pstr)->cur_idx += (idx))
-#define re_string_set_index(pstr,idx) ((pstr)->cur_idx = (idx))
-
-#ifdef _LIBC
-# define MALLOC_0_IS_NONNULL 1
-#elif !defined MALLOC_0_IS_NONNULL
-# define MALLOC_0_IS_NONNULL 0
-#endif
-
-#ifndef MAX
-# define MAX(a,b) ((a) < (b) ? (b) : (a))
-#endif
-#ifndef MIN
-# define MIN(a,b) ((a) < (b) ? (a) : (b))
-#endif
-
-#define re_malloc(t,n) ((t *) malloc ((n) * sizeof (t)))
-#define re_realloc(p,t,n) ((t *) realloc (p, (n) * sizeof (t)))
-#define re_free(p) free (p)
-
-struct bin_tree_t
-{
- struct bin_tree_t *parent;
- struct bin_tree_t *left;
- struct bin_tree_t *right;
- struct bin_tree_t *first;
- struct bin_tree_t *next;
-
- re_token_t token;
-
- /* 'node_idx' is the index in dfa->nodes, if 'type' == 0.
- Otherwise 'type' indicate the type of this node. */
- Idx node_idx;
-};
-typedef struct bin_tree_t bin_tree_t;
-
-#define BIN_TREE_STORAGE_SIZE \
- ((1024 - sizeof (void *)) / sizeof (bin_tree_t))
-
-struct bin_tree_storage_t
-{
- struct bin_tree_storage_t *next;
- bin_tree_t data[BIN_TREE_STORAGE_SIZE];
-};
-typedef struct bin_tree_storage_t bin_tree_storage_t;
-
-#define CONTEXT_WORD 1
-#define CONTEXT_NEWLINE (CONTEXT_WORD << 1)
-#define CONTEXT_BEGBUF (CONTEXT_NEWLINE << 1)
-#define CONTEXT_ENDBUF (CONTEXT_BEGBUF << 1)
-
-#define IS_WORD_CONTEXT(c) ((c) & CONTEXT_WORD)
-#define IS_NEWLINE_CONTEXT(c) ((c) & CONTEXT_NEWLINE)
-#define IS_BEGBUF_CONTEXT(c) ((c) & CONTEXT_BEGBUF)
-#define IS_ENDBUF_CONTEXT(c) ((c) & CONTEXT_ENDBUF)
-#define IS_ORDINARY_CONTEXT(c) ((c) == 0)
-
-#define IS_WORD_CHAR(ch) (isalnum (ch) || (ch) == '_')
-#define IS_NEWLINE(ch) ((ch) == NEWLINE_CHAR)
-#define IS_WIDE_WORD_CHAR(ch) (__iswalnum (ch) || (ch) == L'_')
-#define IS_WIDE_NEWLINE(ch) ((ch) == WIDE_NEWLINE_CHAR)
-
-#define NOT_SATISFY_PREV_CONSTRAINT(constraint,context) \
- ((((constraint) & PREV_WORD_CONSTRAINT) && !IS_WORD_CONTEXT (context)) \
- || ((constraint & PREV_NOTWORD_CONSTRAINT) && IS_WORD_CONTEXT (context)) \
- || ((constraint & PREV_NEWLINE_CONSTRAINT) && !IS_NEWLINE_CONTEXT (context))\
- || ((constraint & PREV_BEGBUF_CONSTRAINT) && !IS_BEGBUF_CONTEXT (context)))
-
-#define NOT_SATISFY_NEXT_CONSTRAINT(constraint,context) \
- ((((constraint) & NEXT_WORD_CONSTRAINT) && !IS_WORD_CONTEXT (context)) \
- || (((constraint) & NEXT_NOTWORD_CONSTRAINT) && IS_WORD_CONTEXT (context)) \
- || (((constraint) & NEXT_NEWLINE_CONSTRAINT) && !IS_NEWLINE_CONTEXT (context)) \
- || (((constraint) & NEXT_ENDBUF_CONSTRAINT) && !IS_ENDBUF_CONTEXT (context)))
-
-struct re_dfastate_t
-{
- re_hashval_t hash;
- re_node_set nodes;
- re_node_set non_eps_nodes;
- re_node_set inveclosure;
- re_node_set *entrance_nodes;
- struct re_dfastate_t **trtable, **word_trtable;
- unsigned int context : 4;
- unsigned int halt : 1;
- /* If this state can accept "multi byte".
- Note that we refer to multibyte characters, and multi character
- collating elements as "multi byte". */
- unsigned int accept_mb : 1;
- /* If this state has backreference node(s). */
- unsigned int has_backref : 1;
- unsigned int has_constraint : 1;
-};
-typedef struct re_dfastate_t re_dfastate_t;
-
-struct re_state_table_entry
-{
- Idx num;
- Idx alloc;
- re_dfastate_t **array;
-};
-
-/* Array type used in re_sub_match_last_t and re_sub_match_top_t. */
-
-typedef struct
-{
- Idx next_idx;
- Idx alloc;
- re_dfastate_t **array;
-} state_array_t;
-
-/* Store information about the node NODE whose type is OP_CLOSE_SUBEXP. */
-
-typedef struct
-{
- Idx node;
- Idx str_idx; /* The position NODE match at. */
- state_array_t path;
-} re_sub_match_last_t;
-
-/* Store information about the node NODE whose type is OP_OPEN_SUBEXP.
- And information about the node, whose type is OP_CLOSE_SUBEXP,
- corresponding to NODE is stored in LASTS. */
-
-typedef struct
-{
- Idx str_idx;
- Idx node;
- state_array_t *path;
- Idx alasts; /* Allocation size of LASTS. */
- Idx nlasts; /* The number of LASTS. */
- re_sub_match_last_t **lasts;
-} re_sub_match_top_t;
-
-struct re_backref_cache_entry
-{
- Idx node;
- Idx str_idx;
- Idx subexp_from;
- Idx subexp_to;
- bitset_word_t eps_reachable_subexps_map;
- char more;
-};
-
-typedef struct
-{
- /* The string object corresponding to the input string. */
- re_string_t input;
- const re_dfa_t *const dfa;
- /* EFLAGS of the argument of regexec. */
- int eflags;
- /* Where the matching ends. */
- Idx match_last;
- Idx last_node;
- /* The state log used by the matcher. */
- re_dfastate_t **state_log;
- Idx state_log_top;
- /* Back reference cache. */
- Idx nbkref_ents;
- Idx abkref_ents;
- struct re_backref_cache_entry *bkref_ents;
- int max_mb_elem_len;
- Idx nsub_tops;
- Idx asub_tops;
- re_sub_match_top_t **sub_tops;
-} re_match_context_t;
-
-typedef struct
-{
- re_dfastate_t **sifted_states;
- re_dfastate_t **limited_states;
- Idx last_node;
- Idx last_str_idx;
- re_node_set limits;
-} re_sift_context_t;
-
-struct re_fail_stack_ent_t
-{
- Idx idx;
- Idx node;
- regmatch_t *regs;
- re_node_set eps_via_nodes;
-};
-
-struct re_fail_stack_t
-{
- Idx num;
- Idx alloc;
- struct re_fail_stack_ent_t *stack;
-};
-
-struct re_dfa_t
-{
- re_token_t *nodes;
- size_t nodes_alloc;
- size_t nodes_len;
- Idx *nexts;
- Idx *org_indices;
- re_node_set *edests;
- re_node_set *eclosures;
- re_node_set *inveclosures;
- struct re_state_table_entry *state_table;
- re_dfastate_t *init_state;
- re_dfastate_t *init_state_word;
- re_dfastate_t *init_state_nl;
- re_dfastate_t *init_state_begbuf;
- bin_tree_t *str_tree;
- bin_tree_storage_t *str_tree_storage;
- re_bitset_ptr_t sb_char;
- int str_tree_storage_idx;
-
- /* number of subexpressions 're_nsub' is in regex_t. */
- re_hashval_t state_hash_mask;
- Idx init_node;
- Idx nbackref; /* The number of backreference in this dfa. */
-
- /* Bitmap expressing which backreference is used. */
- bitset_word_t used_bkref_map;
- bitset_word_t completed_bkref_map;
-
- unsigned int has_plural_match : 1;
- /* If this dfa has "multibyte node", which is a backreference or
- a node which can accept multibyte character or multi character
- collating element. */
- unsigned int has_mb_node : 1;
- unsigned int is_utf8 : 1;
- unsigned int map_notascii : 1;
- unsigned int word_ops_used : 1;
- int mb_cur_max;
- bitset_t word_char;
- reg_syntax_t syntax;
- Idx *subexp_map;
-#ifdef DEBUG
- char* re_str;
-#endif
- lock_define (lock)
-};
-
-#define re_node_set_init_empty(set) memset (set, '\0', sizeof (re_node_set))
-#define re_node_set_remove(set,id) \
- (re_node_set_remove_at (set, re_node_set_contains (set, id) - 1))
-#define re_node_set_empty(p) ((p)->nelem = 0)
-#define re_node_set_free(set) re_free ((set)->elems)
-
-
-typedef enum
-{
- SB_CHAR,
- MB_CHAR,
- EQUIV_CLASS,
- COLL_SYM,
- CHAR_CLASS
-} bracket_elem_type;
-
-typedef struct
-{
- bracket_elem_type type;
- union
- {
- unsigned char ch;
- unsigned char *name;
- wchar_t wch;
- } opr;
-} bracket_elem_t;
-
-
-/* Functions for bitset_t operation. */
-
-static inline void
-bitset_set (bitset_t set, Idx i)
-{
- set[i / BITSET_WORD_BITS] |= (bitset_word_t) 1 << i % BITSET_WORD_BITS;
-}
-
-static inline void
-bitset_clear (bitset_t set, Idx i)
-{
- set[i / BITSET_WORD_BITS] &= ~ ((bitset_word_t) 1 << i % BITSET_WORD_BITS);
-}
-
-static inline bool
-bitset_contain (const bitset_t set, Idx i)
-{
- return (set[i / BITSET_WORD_BITS] >> i % BITSET_WORD_BITS) & 1;
-}
-
-static inline void
-bitset_empty (bitset_t set)
-{
- memset (set, '\0', sizeof (bitset_t));
-}
-
-static inline void
-bitset_set_all (bitset_t set)
-{
- memset (set, -1, sizeof (bitset_word_t) * (SBC_MAX / BITSET_WORD_BITS));
- if (SBC_MAX % BITSET_WORD_BITS != 0)
- set[BITSET_WORDS - 1] =
- ((bitset_word_t) 1 << SBC_MAX % BITSET_WORD_BITS) - 1;
-}
-
-static inline void
-bitset_copy (bitset_t dest, const bitset_t src)
-{
- memcpy (dest, src, sizeof (bitset_t));
-}
-
-static inline void
-bitset_not (bitset_t set)
-{
- int bitset_i;
- for (bitset_i = 0; bitset_i < SBC_MAX / BITSET_WORD_BITS; ++bitset_i)
- set[bitset_i] = ~set[bitset_i];
- if (SBC_MAX % BITSET_WORD_BITS != 0)
- set[BITSET_WORDS - 1] =
- ((((bitset_word_t) 1 << SBC_MAX % BITSET_WORD_BITS) - 1)
- & ~set[BITSET_WORDS - 1]);
-}
-
-static inline void
-bitset_merge (bitset_t dest, const bitset_t src)
-{
- int bitset_i;
- for (bitset_i = 0; bitset_i < BITSET_WORDS; ++bitset_i)
- dest[bitset_i] |= src[bitset_i];
-}
-
-static inline void
-bitset_mask (bitset_t dest, const bitset_t src)
-{
- int bitset_i;
- for (bitset_i = 0; bitset_i < BITSET_WORDS; ++bitset_i)
- dest[bitset_i] &= src[bitset_i];
-}
-
-/* Functions for re_string. */
-static int
-__attribute__ ((pure, unused))
-re_string_char_size_at (const re_string_t *pstr, Idx idx)
-{
- int byte_idx;
- if (pstr->mb_cur_max == 1)
- return 1;
- for (byte_idx = 1; idx + byte_idx < pstr->valid_len; ++byte_idx)
- if (pstr->wcs[idx + byte_idx] != WEOF)
- break;
- return byte_idx;
-}
-
-static wint_t
-__attribute__ ((pure, unused))
-re_string_wchar_at (const re_string_t *pstr, Idx idx)
-{
- if (pstr->mb_cur_max == 1)
- return (wint_t) pstr->mbs[idx];
- return (wint_t) pstr->wcs[idx];
-}
-
-#ifdef _LIBC
-# include <locale/weight.h>
-#endif
-
-static int
-__attribute__ ((pure, unused))
-re_string_elem_size_at (const re_string_t *pstr, Idx idx)
-{
-#ifdef _LIBC
- const unsigned char *p, *extra;
- const int32_t *table, *indirect;
- uint_fast32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
-
- if (nrules != 0)
- {
- table = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
- extra = (const unsigned char *)
- _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
- indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE,
- _NL_COLLATE_INDIRECTMB);
- p = pstr->mbs + idx;
- findidx (table, indirect, extra, &p, pstr->len - idx);
- return p - pstr->mbs - idx;
- }
-#endif /* _LIBC */
-
- return 1;
-}
-
-#ifdef _LIBC
-# if __GNUC__ >= 7
-# define FALLTHROUGH __attribute__ ((__fallthrough__))
-# else
-# define FALLTHROUGH ((void) 0)
-# endif
-#else
-# include "attribute.h"
-#endif
-
-#endif /* _REGEX_INTERNAL_H */
diff --git a/cross/lib/regexec.c b/cross/lib/regexec.c
deleted file mode 100644
index 13e0349e727..00000000000
--- a/cross/lib/regexec.c
+++ /dev/null
@@ -1,4221 +0,0 @@
-/* Extended regular expression matching and search library.
- Copyright (C) 2002-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
-
- 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/>. */
-
-static reg_errcode_t match_ctx_init (re_match_context_t *cache, int eflags,
- Idx n);
-static void match_ctx_clean (re_match_context_t *mctx);
-static void match_ctx_free (re_match_context_t *cache);
-static reg_errcode_t match_ctx_add_entry (re_match_context_t *cache, Idx node,
- Idx str_idx, Idx from, Idx to);
-static Idx search_cur_bkref_entry (const re_match_context_t *mctx, Idx str_idx);
-static reg_errcode_t match_ctx_add_subtop (re_match_context_t *mctx, Idx node,
- Idx str_idx);
-static re_sub_match_last_t * match_ctx_add_sublast (re_sub_match_top_t *subtop,
- Idx node, Idx str_idx);
-static void sift_ctx_init (re_sift_context_t *sctx, re_dfastate_t **sifted_sts,
- re_dfastate_t **limited_sts, Idx last_node,
- Idx last_str_idx);
-static reg_errcode_t re_search_internal (const regex_t *preg,
- const char *string, Idx length,
- Idx start, Idx last_start, Idx stop,
- size_t nmatch, regmatch_t pmatch[],
- int eflags);
-static regoff_t re_search_2_stub (struct re_pattern_buffer *bufp,
- const char *string1, Idx length1,
- const char *string2, Idx length2,
- Idx start, regoff_t range,
- struct re_registers *regs,
- Idx stop, bool ret_len);
-static regoff_t re_search_stub (struct re_pattern_buffer *bufp,
- const char *string, Idx length, Idx start,
- regoff_t range, Idx stop,
- struct re_registers *regs,
- bool ret_len);
-static unsigned re_copy_regs (struct re_registers *regs, regmatch_t *pmatch,
- Idx nregs, int regs_allocated);
-static reg_errcode_t prune_impossible_nodes (re_match_context_t *mctx);
-static Idx check_matching (re_match_context_t *mctx, bool fl_longest_match,
- Idx *p_match_first);
-static Idx check_halt_state_context (const re_match_context_t *mctx,
- const re_dfastate_t *state, Idx idx);
-static void update_regs (const re_dfa_t *dfa, regmatch_t *pmatch,
- regmatch_t *prev_idx_match, Idx cur_node,
- Idx cur_idx, Idx nmatch);
-static reg_errcode_t push_fail_stack (struct re_fail_stack_t *fs,
- Idx str_idx, Idx dest_node, Idx nregs,
- regmatch_t *regs, regmatch_t *prevregs,
- re_node_set *eps_via_nodes);
-static reg_errcode_t set_regs (const regex_t *preg,
- const re_match_context_t *mctx,
- size_t nmatch, regmatch_t *pmatch,
- bool fl_backtrack);
-static reg_errcode_t free_fail_stack_return (struct re_fail_stack_t *fs);
-
-static int sift_states_iter_mb (const re_match_context_t *mctx,
- re_sift_context_t *sctx,
- Idx node_idx, Idx str_idx, Idx max_str_idx);
-static reg_errcode_t sift_states_backward (const re_match_context_t *mctx,
- re_sift_context_t *sctx);
-static reg_errcode_t build_sifted_states (const re_match_context_t *mctx,
- re_sift_context_t *sctx, Idx str_idx,
- re_node_set *cur_dest);
-static reg_errcode_t update_cur_sifted_state (const re_match_context_t *mctx,
- re_sift_context_t *sctx,
- Idx str_idx,
- re_node_set *dest_nodes);
-static reg_errcode_t add_epsilon_src_nodes (const re_dfa_t *dfa,
- re_node_set *dest_nodes,
- const re_node_set *candidates);
-static bool check_dst_limits (const re_match_context_t *mctx,
- const re_node_set *limits,
- Idx dst_node, Idx dst_idx, Idx src_node,
- Idx src_idx);
-static int check_dst_limits_calc_pos_1 (const re_match_context_t *mctx,
- int boundaries, Idx subexp_idx,
- Idx from_node, Idx bkref_idx);
-static int check_dst_limits_calc_pos (const re_match_context_t *mctx,
- Idx limit, Idx subexp_idx,
- Idx node, Idx str_idx,
- Idx bkref_idx);
-static reg_errcode_t check_subexp_limits (const re_dfa_t *dfa,
- re_node_set *dest_nodes,
- const re_node_set *candidates,
- re_node_set *limits,
- struct re_backref_cache_entry *bkref_ents,
- Idx str_idx);
-static reg_errcode_t sift_states_bkref (const re_match_context_t *mctx,
- re_sift_context_t *sctx,
- Idx str_idx, const re_node_set *candidates);
-static reg_errcode_t merge_state_array (const re_dfa_t *dfa,
- re_dfastate_t **dst,
- re_dfastate_t **src, Idx num);
-static re_dfastate_t *find_recover_state (reg_errcode_t *err,
- re_match_context_t *mctx);
-static re_dfastate_t *transit_state (reg_errcode_t *err,
- re_match_context_t *mctx,
- re_dfastate_t *state);
-static re_dfastate_t *merge_state_with_log (reg_errcode_t *err,
- re_match_context_t *mctx,
- re_dfastate_t *next_state);
-static reg_errcode_t check_subexp_matching_top (re_match_context_t *mctx,
- re_node_set *cur_nodes,
- Idx str_idx);
-#if 0
-static re_dfastate_t *transit_state_sb (reg_errcode_t *err,
- re_match_context_t *mctx,
- re_dfastate_t *pstate);
-#endif
-static reg_errcode_t transit_state_mb (re_match_context_t *mctx,
- re_dfastate_t *pstate);
-static reg_errcode_t transit_state_bkref (re_match_context_t *mctx,
- const re_node_set *nodes);
-static reg_errcode_t get_subexp (re_match_context_t *mctx,
- Idx bkref_node, Idx bkref_str_idx);
-static reg_errcode_t get_subexp_sub (re_match_context_t *mctx,
- const re_sub_match_top_t *sub_top,
- re_sub_match_last_t *sub_last,
- Idx bkref_node, Idx bkref_str);
-static Idx find_subexp_node (const re_dfa_t *dfa, const re_node_set *nodes,
- Idx subexp_idx, int type);
-static reg_errcode_t check_arrival (re_match_context_t *mctx,
- state_array_t *path, Idx top_node,
- Idx top_str, Idx last_node, Idx last_str,
- int type);
-static reg_errcode_t check_arrival_add_next_nodes (re_match_context_t *mctx,
- Idx str_idx,
- re_node_set *cur_nodes,
- re_node_set *next_nodes);
-static reg_errcode_t check_arrival_expand_ecl (const re_dfa_t *dfa,
- re_node_set *cur_nodes,
- Idx ex_subexp, int type);
-static reg_errcode_t check_arrival_expand_ecl_sub (const re_dfa_t *dfa,
- re_node_set *dst_nodes,
- Idx target, Idx ex_subexp,
- int type);
-static reg_errcode_t expand_bkref_cache (re_match_context_t *mctx,
- re_node_set *cur_nodes, Idx cur_str,
- Idx subexp_num, int type);
-static bool build_trtable (const re_dfa_t *dfa, re_dfastate_t *state);
-static int check_node_accept_bytes (const re_dfa_t *dfa, Idx node_idx,
- const re_string_t *input, Idx idx);
-#ifdef _LIBC
-static unsigned int find_collation_sequence_value (const unsigned char *mbs,
- size_t name_len);
-#endif
-static Idx group_nodes_into_DFAstates (const re_dfa_t *dfa,
- const re_dfastate_t *state,
- re_node_set *states_node,
- bitset_t *states_ch);
-static bool check_node_accept (const re_match_context_t *mctx,
- const re_token_t *node, Idx idx);
-static reg_errcode_t extend_buffers (re_match_context_t *mctx, int min_len);
-
-/* Entry point for POSIX code. */
-
-/* regexec searches for a given pattern, specified by PREG, in the
- string STRING.
-
- If NMATCH is zero or REG_NOSUB was set in the cflags argument to
- 'regcomp', we ignore PMATCH. Otherwise, we assume PMATCH has at
- least NMATCH elements, and we set them to the offsets of the
- corresponding matched substrings.
-
- EFLAGS specifies "execution flags" which affect matching: if
- REG_NOTBOL is set, then ^ does not match at the beginning of the
- string; if REG_NOTEOL is set, then $ does not match at the end.
-
- Return 0 if a match is found, REG_NOMATCH if not, REG_BADPAT if
- EFLAGS is invalid. */
-
-int
-regexec (const regex_t *__restrict preg, const char *__restrict string,
- size_t nmatch, regmatch_t pmatch[_REGEX_NELTS (nmatch)], int eflags)
-{
- reg_errcode_t err;
- Idx start, length;
- re_dfa_t *dfa = preg->buffer;
-
- if (eflags & ~(REG_NOTBOL | REG_NOTEOL | REG_STARTEND))
- return REG_BADPAT;
-
- if (eflags & REG_STARTEND)
- {
- start = pmatch[0].rm_so;
- length = pmatch[0].rm_eo;
- }
- else
- {
- start = 0;
- length = strlen (string);
- }
-
- lock_lock (dfa->lock);
- if (preg->no_sub)
- err = re_search_internal (preg, string, length, start, length,
- length, 0, NULL, eflags);
- else
- err = re_search_internal (preg, string, length, start, length,
- length, nmatch, pmatch, eflags);
- lock_unlock (dfa->lock);
- return err != REG_NOERROR;
-}
-
-#ifdef _LIBC
-libc_hidden_def (__regexec)
-
-# include <shlib-compat.h>
-versioned_symbol (libc, __regexec, regexec, GLIBC_2_3_4);
-
-# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)
-__typeof__ (__regexec) __compat_regexec;
-
-int
-attribute_compat_text_section
-__compat_regexec (const regex_t *__restrict preg,
- const char *__restrict string, size_t nmatch,
- regmatch_t pmatch[_REGEX_NELTS (nmatch)], int eflags)
-{
- return regexec (preg, string, nmatch, pmatch,
- eflags & (REG_NOTBOL | REG_NOTEOL));
-}
-compat_symbol (libc, __compat_regexec, regexec, GLIBC_2_0);
-# endif
-#endif
-
-/* Entry points for GNU code. */
-
-/* re_match, re_search, re_match_2, re_search_2
-
- The former two functions operate on STRING with length LENGTH,
- while the later two operate on concatenation of STRING1 and STRING2
- with lengths LENGTH1 and LENGTH2, respectively.
-
- re_match() matches the compiled pattern in BUFP against the string,
- starting at index START.
-
- re_search() first tries matching at index START, then it tries to match
- starting from index START + 1, and so on. The last start position tried
- is START + RANGE. (Thus RANGE = 0 forces re_search to operate the same
- way as re_match().)
-
- The parameter STOP of re_{match,search}_2 specifies that no match exceeding
- the first STOP characters of the concatenation of the strings should be
- concerned.
-
- If REGS is not NULL, and BUFP->no_sub is not set, the offsets of the match
- and all groups is stored in REGS. (For the "_2" variants, the offsets are
- computed relative to the concatenation, not relative to the individual
- strings.)
-
- On success, re_match* functions return the length of the match, re_search*
- return the position of the start of the match. They return -1 on
- match failure, -2 on error. */
-
-regoff_t
-re_match (struct re_pattern_buffer *bufp, const char *string, Idx length,
- Idx start, struct re_registers *regs)
-{
- return re_search_stub (bufp, string, length, start, 0, length, regs, true);
-}
-#ifdef _LIBC
-weak_alias (__re_match, re_match)
-#endif
-
-regoff_t
-re_search (struct re_pattern_buffer *bufp, const char *string, Idx length,
- Idx start, regoff_t range, struct re_registers *regs)
-{
- return re_search_stub (bufp, string, length, start, range, length, regs,
- false);
-}
-#ifdef _LIBC
-weak_alias (__re_search, re_search)
-#endif
-
-regoff_t
-re_match_2 (struct re_pattern_buffer *bufp, const char *string1, Idx length1,
- const char *string2, Idx length2, Idx start,
- struct re_registers *regs, Idx stop)
-{
- return re_search_2_stub (bufp, string1, length1, string2, length2,
- start, 0, regs, stop, true);
-}
-#ifdef _LIBC
-weak_alias (__re_match_2, re_match_2)
-#endif
-
-regoff_t
-re_search_2 (struct re_pattern_buffer *bufp, const char *string1, Idx length1,
- const char *string2, Idx length2, Idx start, regoff_t range,
- struct re_registers *regs, Idx stop)
-{
- return re_search_2_stub (bufp, string1, length1, string2, length2,
- start, range, regs, stop, false);
-}
-#ifdef _LIBC
-weak_alias (__re_search_2, re_search_2)
-#endif
-
-static regoff_t
-re_search_2_stub (struct re_pattern_buffer *bufp, const char *string1,
- Idx length1, const char *string2, Idx length2, Idx start,
- regoff_t range, struct re_registers *regs,
- Idx stop, bool ret_len)
-{
- const char *str;
- regoff_t rval;
- Idx len;
- char *s = NULL;
-
- if (__glibc_unlikely ((length1 < 0 || length2 < 0 || stop < 0
- || INT_ADD_WRAPV (length1, length2, &len))))
- return -2;
-
- /* Concatenate the strings. */
- if (length2 > 0)
- if (length1 > 0)
- {
- s = re_malloc (char, len);
-
- if (__glibc_unlikely (s == NULL))
- return -2;
-#ifdef _LIBC
- memcpy (__mempcpy (s, string1, length1), string2, length2);
-#else
- memcpy (s, string1, length1);
- memcpy (s + length1, string2, length2);
-#endif
- str = s;
- }
- else
- str = string2;
- else
- str = string1;
-
- rval = re_search_stub (bufp, str, len, start, range, stop, regs,
- ret_len);
- re_free (s);
- return rval;
-}
-
-/* The parameters have the same meaning as those of re_search.
- Additional parameters:
- If RET_LEN is true the length of the match is returned (re_match style);
- otherwise the position of the match is returned. */
-
-static regoff_t
-re_search_stub (struct re_pattern_buffer *bufp, const char *string, Idx length,
- Idx start, regoff_t range, Idx stop, struct re_registers *regs,
- bool ret_len)
-{
- reg_errcode_t result;
- regmatch_t *pmatch;
- Idx nregs;
- regoff_t rval;
- int eflags = 0;
- re_dfa_t *dfa = bufp->buffer;
- Idx last_start = start + range;
-
- /* Check for out-of-range. */
- if (__glibc_unlikely (start < 0 || start > length))
- return -1;
- if (__glibc_unlikely (length < last_start
- || (0 <= range && last_start < start)))
- last_start = length;
- else if (__glibc_unlikely (last_start < 0
- || (range < 0 && start <= last_start)))
- last_start = 0;
-
- lock_lock (dfa->lock);
-
- eflags |= (bufp->not_bol) ? REG_NOTBOL : 0;
- eflags |= (bufp->not_eol) ? REG_NOTEOL : 0;
-
- /* Compile fastmap if we haven't yet. */
- if (start < last_start && bufp->fastmap != NULL && !bufp->fastmap_accurate)
- re_compile_fastmap (bufp);
-
- if (__glibc_unlikely (bufp->no_sub))
- regs = NULL;
-
- /* We need at least 1 register. */
- if (regs == NULL)
- nregs = 1;
- else if (__glibc_unlikely (bufp->regs_allocated == REGS_FIXED
- && regs->num_regs <= bufp->re_nsub))
- {
- nregs = regs->num_regs;
- if (__glibc_unlikely (nregs < 1))
- {
- /* Nothing can be copied to regs. */
- regs = NULL;
- nregs = 1;
- }
- }
- else
- nregs = bufp->re_nsub + 1;
- pmatch = re_malloc (regmatch_t, nregs);
- if (__glibc_unlikely (pmatch == NULL))
- {
- rval = -2;
- goto out;
- }
-
- result = re_search_internal (bufp, string, length, start, last_start, stop,
- nregs, pmatch, eflags);
-
- rval = 0;
-
- /* I hope we needn't fill their regs with -1's when no match was found. */
- if (result != REG_NOERROR)
- rval = result == REG_NOMATCH ? -1 : -2;
- else if (regs != NULL)
- {
- /* If caller wants register contents data back, copy them. */
- bufp->regs_allocated = re_copy_regs (regs, pmatch, nregs,
- bufp->regs_allocated);
- if (__glibc_unlikely (bufp->regs_allocated == REGS_UNALLOCATED))
- rval = -2;
- }
-
- if (__glibc_likely (rval == 0))
- {
- if (ret_len)
- {
- DEBUG_ASSERT (pmatch[0].rm_so == start);
- rval = pmatch[0].rm_eo - start;
- }
- else
- rval = pmatch[0].rm_so;
- }
- re_free (pmatch);
- out:
- lock_unlock (dfa->lock);
- return rval;
-}
-
-static unsigned
-re_copy_regs (struct re_registers *regs, regmatch_t *pmatch, Idx nregs,
- int regs_allocated)
-{
- int rval = REGS_REALLOCATE;
- Idx i;
- Idx need_regs = nregs + 1;
- /* We need one extra element beyond 'num_regs' for the '-1' marker GNU code
- uses. */
-
- /* Have the register data arrays been allocated? */
- if (regs_allocated == REGS_UNALLOCATED)
- { /* No. So allocate them with malloc. */
- regs->start = re_malloc (regoff_t, need_regs);
- if (__glibc_unlikely (regs->start == NULL))
- return REGS_UNALLOCATED;
- regs->end = re_malloc (regoff_t, need_regs);
- if (__glibc_unlikely (regs->end == NULL))
- {
- re_free (regs->start);
- return REGS_UNALLOCATED;
- }
- regs->num_regs = need_regs;
- }
- else if (regs_allocated == REGS_REALLOCATE)
- { /* Yes. If we need more elements than were already
- allocated, reallocate them. If we need fewer, just
- leave it alone. */
- if (__glibc_unlikely (need_regs > regs->num_regs))
- {
- regoff_t *new_start = re_realloc (regs->start, regoff_t, need_regs);
- regoff_t *new_end;
- if (__glibc_unlikely (new_start == NULL))
- return REGS_UNALLOCATED;
- new_end = re_realloc (regs->end, regoff_t, need_regs);
- if (__glibc_unlikely (new_end == NULL))
- {
- re_free (new_start);
- return REGS_UNALLOCATED;
- }
- regs->start = new_start;
- regs->end = new_end;
- regs->num_regs = need_regs;
- }
- }
- else
- {
- DEBUG_ASSERT (regs_allocated == REGS_FIXED);
- /* This function may not be called with REGS_FIXED and nregs too big. */
- DEBUG_ASSERT (nregs <= regs->num_regs);
- rval = REGS_FIXED;
- }
-
- /* Copy the regs. */
- for (i = 0; i < nregs; ++i)
- {
- regs->start[i] = pmatch[i].rm_so;
- regs->end[i] = pmatch[i].rm_eo;
- }
- for ( ; i < regs->num_regs; ++i)
- regs->start[i] = regs->end[i] = -1;
-
- return rval;
-}
-
-/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
- ENDS. Subsequent matches using PATTERN_BUFFER and REGS will use
- this memory for recording register information. STARTS and ENDS
- must be allocated using the malloc library routine, and must each
- be at least NUM_REGS * sizeof (regoff_t) bytes long.
-
- If NUM_REGS == 0, then subsequent matches should allocate their own
- register data.
-
- Unless this function is called, the first search or match using
- PATTERN_BUFFER will allocate its own register data, without
- freeing the old data. */
-
-void
-re_set_registers (struct re_pattern_buffer *bufp, struct re_registers *regs,
- __re_size_t num_regs, regoff_t *starts, regoff_t *ends)
-{
- if (num_regs)
- {
- bufp->regs_allocated = REGS_REALLOCATE;
- regs->num_regs = num_regs;
- regs->start = starts;
- regs->end = ends;
- }
- else
- {
- bufp->regs_allocated = REGS_UNALLOCATED;
- regs->num_regs = 0;
- regs->start = regs->end = NULL;
- }
-}
-#ifdef _LIBC
-weak_alias (__re_set_registers, re_set_registers)
-#endif
-
-/* Entry points compatible with 4.2 BSD regex library. We don't define
- them unless specifically requested. */
-
-#if defined _REGEX_RE_COMP || defined _LIBC
-int
-# ifdef _LIBC
-weak_function
-# endif
-re_exec (const char *s)
-{
- return 0 == regexec (&re_comp_buf, s, 0, NULL, 0);
-}
-#endif /* _REGEX_RE_COMP */
-
-/* Internal entry point. */
-
-/* Searches for a compiled pattern PREG in the string STRING, whose
- length is LENGTH. NMATCH, PMATCH, and EFLAGS have the same
- meaning as with regexec. LAST_START is START + RANGE, where
- START and RANGE have the same meaning as with re_search.
- Return REG_NOERROR if we find a match, and REG_NOMATCH if not,
- otherwise return the error code.
- Note: We assume front end functions already check ranges.
- (0 <= LAST_START && LAST_START <= LENGTH) */
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-re_search_internal (const regex_t *preg, const char *string, Idx length,
- Idx start, Idx last_start, Idx stop, size_t nmatch,
- regmatch_t pmatch[], int eflags)
-{
- reg_errcode_t err;
- const re_dfa_t *dfa = preg->buffer;
- Idx left_lim, right_lim;
- int incr;
- bool fl_longest_match;
- int match_kind;
- Idx match_first;
- Idx match_last = -1;
- Idx extra_nmatch;
- bool sb;
- int ch;
- re_match_context_t mctx = { .dfa = dfa };
- char *fastmap = ((preg->fastmap != NULL && preg->fastmap_accurate
- && start != last_start && !preg->can_be_null)
- ? preg->fastmap : NULL);
- RE_TRANSLATE_TYPE t = preg->translate;
-
- extra_nmatch = (nmatch > preg->re_nsub) ? nmatch - (preg->re_nsub + 1) : 0;
- nmatch -= extra_nmatch;
-
- /* Check if the DFA haven't been compiled. */
- if (__glibc_unlikely (preg->used == 0 || dfa->init_state == NULL
- || dfa->init_state_word == NULL
- || dfa->init_state_nl == NULL
- || dfa->init_state_begbuf == NULL))
- return REG_NOMATCH;
-
- /* We assume front-end functions already check them. */
- DEBUG_ASSERT (0 <= last_start && last_start <= length);
-
- /* If initial states with non-begbuf contexts have no elements,
- the regex must be anchored. If preg->newline_anchor is set,
- we'll never use init_state_nl, so do not check it. */
- if (dfa->init_state->nodes.nelem == 0
- && dfa->init_state_word->nodes.nelem == 0
- && (dfa->init_state_nl->nodes.nelem == 0
- || !preg->newline_anchor))
- {
- if (start != 0 && last_start != 0)
- return REG_NOMATCH;
- start = last_start = 0;
- }
-
- /* We must check the longest matching, if nmatch > 0. */
- fl_longest_match = (nmatch != 0 || dfa->nbackref);
-
- err = re_string_allocate (&mctx.input, string, length, dfa->nodes_len + 1,
- preg->translate, (preg->syntax & RE_ICASE) != 0,
- dfa);
- if (__glibc_unlikely (err != REG_NOERROR))
- goto free_return;
- mctx.input.stop = stop;
- mctx.input.raw_stop = stop;
- mctx.input.newline_anchor = preg->newline_anchor;
-
- err = match_ctx_init (&mctx, eflags, dfa->nbackref * 2);
- if (__glibc_unlikely (err != REG_NOERROR))
- goto free_return;
-
- /* We will log all the DFA states through which the dfa pass,
- if nmatch > 1, or this dfa has "multibyte node", which is a
- back-reference or a node which can accept multibyte character or
- multi character collating element. */
- if (nmatch > 1 || dfa->has_mb_node)
- {
- /* Avoid overflow. */
- if (__glibc_unlikely ((MIN (IDX_MAX, SIZE_MAX / sizeof (re_dfastate_t *))
- <= mctx.input.bufs_len)))
- {
- err = REG_ESPACE;
- goto free_return;
- }
-
- mctx.state_log = re_malloc (re_dfastate_t *, mctx.input.bufs_len + 1);
- if (__glibc_unlikely (mctx.state_log == NULL))
- {
- err = REG_ESPACE;
- goto free_return;
- }
- }
-
- match_first = start;
- mctx.input.tip_context = (eflags & REG_NOTBOL) ? CONTEXT_BEGBUF
- : CONTEXT_NEWLINE | CONTEXT_BEGBUF;
-
- /* Check incrementally whether the input string matches. */
- incr = (last_start < start) ? -1 : 1;
- left_lim = (last_start < start) ? last_start : start;
- right_lim = (last_start < start) ? start : last_start;
- sb = dfa->mb_cur_max == 1;
- match_kind =
- (fastmap
- ? ((sb || !(preg->syntax & RE_ICASE || t) ? 4 : 0)
- | (start <= last_start ? 2 : 0)
- | (t != NULL ? 1 : 0))
- : 8);
-
- for (;; match_first += incr)
- {
- err = REG_NOMATCH;
- if (match_first < left_lim || right_lim < match_first)
- goto free_return;
-
- /* Advance as rapidly as possible through the string, until we
- find a plausible place to start matching. This may be done
- with varying efficiency, so there are various possibilities:
- only the most common of them are specialized, in order to
- save on code size. We use a switch statement for speed. */
- switch (match_kind)
- {
- case 8:
- /* No fastmap. */
- break;
-
- case 7:
- /* Fastmap with single-byte translation, match forward. */
- while (__glibc_likely (match_first < right_lim)
- && !fastmap[t[(unsigned char) string[match_first]]])
- ++match_first;
- goto forward_match_found_start_or_reached_end;
-
- case 6:
- /* Fastmap without translation, match forward. */
- while (__glibc_likely (match_first < right_lim)
- && !fastmap[(unsigned char) string[match_first]])
- ++match_first;
-
- forward_match_found_start_or_reached_end:
- if (__glibc_unlikely (match_first == right_lim))
- {
- ch = match_first >= length
- ? 0 : (unsigned char) string[match_first];
- if (!fastmap[t ? t[ch] : ch])
- goto free_return;
- }
- break;
-
- case 4:
- case 5:
- /* Fastmap without multi-byte translation, match backwards. */
- while (match_first >= left_lim)
- {
- ch = match_first >= length
- ? 0 : (unsigned char) string[match_first];
- if (fastmap[t ? t[ch] : ch])
- break;
- --match_first;
- }
- if (match_first < left_lim)
- goto free_return;
- break;
-
- default:
- /* In this case, we can't determine easily the current byte,
- since it might be a component byte of a multibyte
- character. Then we use the constructed buffer instead. */
- for (;;)
- {
- /* If MATCH_FIRST is out of the valid range, reconstruct the
- buffers. */
- __re_size_t offset = match_first - mctx.input.raw_mbs_idx;
- if (__glibc_unlikely (offset
- >= (__re_size_t) mctx.input.valid_raw_len))
- {
- err = re_string_reconstruct (&mctx.input, match_first,
- eflags);
- if (__glibc_unlikely (err != REG_NOERROR))
- goto free_return;
-
- offset = match_first - mctx.input.raw_mbs_idx;
- }
- /* Use buffer byte if OFFSET is in buffer, otherwise '\0'. */
- ch = (offset < mctx.input.valid_len
- ? re_string_byte_at (&mctx.input, offset) : 0);
- if (fastmap[ch])
- break;
- match_first += incr;
- if (match_first < left_lim || match_first > right_lim)
- {
- err = REG_NOMATCH;
- goto free_return;
- }
- }
- break;
- }
-
- /* Reconstruct the buffers so that the matcher can assume that
- the matching starts from the beginning of the buffer. */
- err = re_string_reconstruct (&mctx.input, match_first, eflags);
- if (__glibc_unlikely (err != REG_NOERROR))
- goto free_return;
-
- /* Don't consider this char as a possible match start if it part,
- yet isn't the head, of a multibyte character. */
- if (!sb && !re_string_first_byte (&mctx.input, 0))
- continue;
-
- /* It seems to be appropriate one, then use the matcher. */
- /* We assume that the matching starts from 0. */
- mctx.state_log_top = mctx.nbkref_ents = mctx.max_mb_elem_len = 0;
- match_last = check_matching (&mctx, fl_longest_match,
- start <= last_start ? &match_first : NULL);
- if (match_last != -1)
- {
- if (__glibc_unlikely (match_last == -2))
- {
- err = REG_ESPACE;
- goto free_return;
- }
- else
- {
- mctx.match_last = match_last;
- if ((!preg->no_sub && nmatch > 1) || dfa->nbackref)
- {
- re_dfastate_t *pstate = mctx.state_log[match_last];
- mctx.last_node = check_halt_state_context (&mctx, pstate,
- match_last);
- }
- if ((!preg->no_sub && nmatch > 1 && dfa->has_plural_match)
- || dfa->nbackref)
- {
- err = prune_impossible_nodes (&mctx);
- if (err == REG_NOERROR)
- break;
- if (__glibc_unlikely (err != REG_NOMATCH))
- goto free_return;
- match_last = -1;
- }
- else
- break; /* We found a match. */
- }
- }
-
- match_ctx_clean (&mctx);
- }
-
- DEBUG_ASSERT (match_last != -1);
- DEBUG_ASSERT (err == REG_NOERROR);
-
- /* Set pmatch[] if we need. */
- if (nmatch > 0)
- {
- Idx reg_idx;
-
- /* Initialize registers. */
- for (reg_idx = 1; reg_idx < nmatch; ++reg_idx)
- pmatch[reg_idx].rm_so = pmatch[reg_idx].rm_eo = -1;
-
- /* Set the points where matching start/end. */
- pmatch[0].rm_so = 0;
- pmatch[0].rm_eo = mctx.match_last;
- /* FIXME: This function should fail if mctx.match_last exceeds
- the maximum possible regoff_t value. We need a new error
- code REG_OVERFLOW. */
-
- if (!preg->no_sub && nmatch > 1)
- {
- err = set_regs (preg, &mctx, nmatch, pmatch,
- dfa->has_plural_match && dfa->nbackref > 0);
- if (__glibc_unlikely (err != REG_NOERROR))
- goto free_return;
- }
-
- /* At last, add the offset to each register, since we slid
- the buffers so that we could assume that the matching starts
- from 0. */
- for (reg_idx = 0; reg_idx < nmatch; ++reg_idx)
- if (pmatch[reg_idx].rm_so != -1)
- {
- if (__glibc_unlikely (mctx.input.offsets_needed != 0))
- {
- pmatch[reg_idx].rm_so =
- (pmatch[reg_idx].rm_so == mctx.input.valid_len
- ? mctx.input.valid_raw_len
- : mctx.input.offsets[pmatch[reg_idx].rm_so]);
- pmatch[reg_idx].rm_eo =
- (pmatch[reg_idx].rm_eo == mctx.input.valid_len
- ? mctx.input.valid_raw_len
- : mctx.input.offsets[pmatch[reg_idx].rm_eo]);
- }
- pmatch[reg_idx].rm_so += match_first;
- pmatch[reg_idx].rm_eo += match_first;
- }
- for (reg_idx = 0; reg_idx < extra_nmatch; ++reg_idx)
- {
- pmatch[nmatch + reg_idx].rm_so = -1;
- pmatch[nmatch + reg_idx].rm_eo = -1;
- }
-
- if (dfa->subexp_map)
- for (reg_idx = 0; reg_idx + 1 < nmatch; reg_idx++)
- if (dfa->subexp_map[reg_idx] != reg_idx)
- {
- pmatch[reg_idx + 1].rm_so
- = pmatch[dfa->subexp_map[reg_idx] + 1].rm_so;
- pmatch[reg_idx + 1].rm_eo
- = pmatch[dfa->subexp_map[reg_idx] + 1].rm_eo;
- }
- }
-
- free_return:
- re_free (mctx.state_log);
- if (dfa->nbackref)
- match_ctx_free (&mctx);
- re_string_destruct (&mctx.input);
- return err;
-}
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-prune_impossible_nodes (re_match_context_t *mctx)
-{
- const re_dfa_t *const dfa = mctx->dfa;
- Idx halt_node, match_last;
- reg_errcode_t ret;
- re_dfastate_t **sifted_states;
- re_dfastate_t **lim_states = NULL;
- re_sift_context_t sctx;
- DEBUG_ASSERT (mctx->state_log != NULL);
- match_last = mctx->match_last;
- halt_node = mctx->last_node;
-
- /* Avoid overflow. */
- if (__glibc_unlikely (MIN (IDX_MAX, SIZE_MAX / sizeof (re_dfastate_t *))
- <= match_last))
- return REG_ESPACE;
-
- sifted_states = re_malloc (re_dfastate_t *, match_last + 1);
- if (__glibc_unlikely (sifted_states == NULL))
- {
- ret = REG_ESPACE;
- goto free_return;
- }
- if (dfa->nbackref)
- {
- lim_states = re_malloc (re_dfastate_t *, match_last + 1);
- if (__glibc_unlikely (lim_states == NULL))
- {
- ret = REG_ESPACE;
- goto free_return;
- }
- while (1)
- {
- memset (lim_states, '\0',
- sizeof (re_dfastate_t *) * (match_last + 1));
- sift_ctx_init (&sctx, sifted_states, lim_states, halt_node,
- match_last);
- ret = sift_states_backward (mctx, &sctx);
- re_node_set_free (&sctx.limits);
- if (__glibc_unlikely (ret != REG_NOERROR))
- goto free_return;
- if (sifted_states[0] != NULL || lim_states[0] != NULL)
- break;
- do
- {
- --match_last;
- if (match_last < 0)
- {
- ret = REG_NOMATCH;
- goto free_return;
- }
- } while (mctx->state_log[match_last] == NULL
- || !mctx->state_log[match_last]->halt);
- halt_node = check_halt_state_context (mctx,
- mctx->state_log[match_last],
- match_last);
- }
- ret = merge_state_array (dfa, sifted_states, lim_states,
- match_last + 1);
- re_free (lim_states);
- lim_states = NULL;
- if (__glibc_unlikely (ret != REG_NOERROR))
- goto free_return;
- }
- else
- {
- sift_ctx_init (&sctx, sifted_states, lim_states, halt_node, match_last);
- ret = sift_states_backward (mctx, &sctx);
- re_node_set_free (&sctx.limits);
- if (__glibc_unlikely (ret != REG_NOERROR))
- goto free_return;
- if (sifted_states[0] == NULL)
- {
- ret = REG_NOMATCH;
- goto free_return;
- }
- }
- re_free (mctx->state_log);
- mctx->state_log = sifted_states;
- sifted_states = NULL;
- mctx->last_node = halt_node;
- mctx->match_last = match_last;
- ret = REG_NOERROR;
- free_return:
- re_free (sifted_states);
- re_free (lim_states);
- return ret;
-}
-
-/* Acquire an initial state and return it.
- We must select appropriate initial state depending on the context,
- since initial states may have constraints like "\<", "^", etc.. */
-
-static __always_inline re_dfastate_t *
-acquire_init_state_context (reg_errcode_t *err, const re_match_context_t *mctx,
- Idx idx)
-{
- const re_dfa_t *const dfa = mctx->dfa;
- if (dfa->init_state->has_constraint)
- {
- unsigned int context;
- context = re_string_context_at (&mctx->input, idx - 1, mctx->eflags);
- if (IS_WORD_CONTEXT (context))
- return dfa->init_state_word;
- else if (IS_ORDINARY_CONTEXT (context))
- return dfa->init_state;
- else if (IS_BEGBUF_CONTEXT (context) && IS_NEWLINE_CONTEXT (context))
- return dfa->init_state_begbuf;
- else if (IS_NEWLINE_CONTEXT (context))
- return dfa->init_state_nl;
- else if (IS_BEGBUF_CONTEXT (context))
- {
- /* It is relatively rare case, then calculate on demand. */
- return re_acquire_state_context (err, dfa,
- dfa->init_state->entrance_nodes,
- context);
- }
- else
- /* Must not happen? */
- return dfa->init_state;
- }
- else
- return dfa->init_state;
-}
-
-/* Check whether the regular expression match input string INPUT or not,
- and return the index where the matching end. Return -1 if
- there is no match, and return -2 in case of an error.
- FL_LONGEST_MATCH means we want the POSIX longest matching.
- If P_MATCH_FIRST is not NULL, and the match fails, it is set to the
- next place where we may want to try matching.
- Note that the matcher assumes that the matching starts from the current
- index of the buffer. */
-
-static Idx
-__attribute_warn_unused_result__
-check_matching (re_match_context_t *mctx, bool fl_longest_match,
- Idx *p_match_first)
-{
- const re_dfa_t *const dfa = mctx->dfa;
- reg_errcode_t err;
- Idx match = 0;
- Idx match_last = -1;
- Idx cur_str_idx = re_string_cur_idx (&mctx->input);
- re_dfastate_t *cur_state;
- bool at_init_state = p_match_first != NULL;
- Idx next_start_idx = cur_str_idx;
-
- err = REG_NOERROR;
- cur_state = acquire_init_state_context (&err, mctx, cur_str_idx);
- /* An initial state must not be NULL (invalid). */
- if (__glibc_unlikely (cur_state == NULL))
- {
- DEBUG_ASSERT (err == REG_ESPACE);
- return -2;
- }
-
- if (mctx->state_log != NULL)
- {
- mctx->state_log[cur_str_idx] = cur_state;
-
- /* Check OP_OPEN_SUBEXP in the initial state in case that we use them
- later. E.g. Processing back references. */
- if (__glibc_unlikely (dfa->nbackref))
- {
- at_init_state = false;
- err = check_subexp_matching_top (mctx, &cur_state->nodes, 0);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
-
- if (cur_state->has_backref)
- {
- err = transit_state_bkref (mctx, &cur_state->nodes);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- }
- }
- }
-
- /* If the RE accepts NULL string. */
- if (__glibc_unlikely (cur_state->halt))
- {
- if (!cur_state->has_constraint
- || check_halt_state_context (mctx, cur_state, cur_str_idx))
- {
- if (!fl_longest_match)
- return cur_str_idx;
- else
- {
- match_last = cur_str_idx;
- match = 1;
- }
- }
- }
-
- while (!re_string_eoi (&mctx->input))
- {
- re_dfastate_t *old_state = cur_state;
- Idx next_char_idx = re_string_cur_idx (&mctx->input) + 1;
-
- if ((__glibc_unlikely (next_char_idx >= mctx->input.bufs_len)
- && mctx->input.bufs_len < mctx->input.len)
- || (__glibc_unlikely (next_char_idx >= mctx->input.valid_len)
- && mctx->input.valid_len < mctx->input.len))
- {
- err = extend_buffers (mctx, next_char_idx + 1);
- if (__glibc_unlikely (err != REG_NOERROR))
- {
- DEBUG_ASSERT (err == REG_ESPACE);
- return -2;
- }
- }
-
- cur_state = transit_state (&err, mctx, cur_state);
- if (mctx->state_log != NULL)
- cur_state = merge_state_with_log (&err, mctx, cur_state);
-
- if (cur_state == NULL)
- {
- /* Reached the invalid state or an error. Try to recover a valid
- state using the state log, if available and if we have not
- already found a valid (even if not the longest) match. */
- if (__glibc_unlikely (err != REG_NOERROR))
- return -2;
-
- if (mctx->state_log == NULL
- || (match && !fl_longest_match)
- || (cur_state = find_recover_state (&err, mctx)) == NULL)
- break;
- }
-
- if (__glibc_unlikely (at_init_state))
- {
- if (old_state == cur_state)
- next_start_idx = next_char_idx;
- else
- at_init_state = false;
- }
-
- if (cur_state->halt)
- {
- /* Reached a halt state.
- Check the halt state can satisfy the current context. */
- if (!cur_state->has_constraint
- || check_halt_state_context (mctx, cur_state,
- re_string_cur_idx (&mctx->input)))
- {
- /* We found an appropriate halt state. */
- match_last = re_string_cur_idx (&mctx->input);
- match = 1;
-
- /* We found a match, do not modify match_first below. */
- p_match_first = NULL;
- if (!fl_longest_match)
- break;
- }
- }
- }
-
- if (p_match_first)
- *p_match_first += next_start_idx;
-
- return match_last;
-}
-
-/* Check NODE match the current context. */
-
-static bool
-check_halt_node_context (const re_dfa_t *dfa, Idx node, unsigned int context)
-{
- re_token_type_t type = dfa->nodes[node].type;
- unsigned int constraint = dfa->nodes[node].constraint;
- if (type != END_OF_RE)
- return false;
- if (!constraint)
- return true;
- if (NOT_SATISFY_NEXT_CONSTRAINT (constraint, context))
- return false;
- return true;
-}
-
-/* Check the halt state STATE match the current context.
- Return 0 if not match, if the node, STATE has, is a halt node and
- match the context, return the node. */
-
-static Idx
-check_halt_state_context (const re_match_context_t *mctx,
- const re_dfastate_t *state, Idx idx)
-{
- Idx i;
- unsigned int context;
- DEBUG_ASSERT (state->halt);
- context = re_string_context_at (&mctx->input, idx, mctx->eflags);
- for (i = 0; i < state->nodes.nelem; ++i)
- if (check_halt_node_context (mctx->dfa, state->nodes.elems[i], context))
- return state->nodes.elems[i];
- return 0;
-}
-
-/* Compute the next node to which "NFA" transit from NODE("NFA" is a NFA
- corresponding to the DFA).
- Return the destination node, and update EPS_VIA_NODES;
- return -1 on match failure, -2 on error. */
-
-static Idx
-proceed_next_node (const re_match_context_t *mctx, Idx nregs, regmatch_t *regs,
- regmatch_t *prevregs,
- Idx *pidx, Idx node, re_node_set *eps_via_nodes,
- struct re_fail_stack_t *fs)
-{
- const re_dfa_t *const dfa = mctx->dfa;
- if (IS_EPSILON_NODE (dfa->nodes[node].type))
- {
- re_node_set *cur_nodes = &mctx->state_log[*pidx]->nodes;
- re_node_set *edests = &dfa->edests[node];
-
- if (! re_node_set_contains (eps_via_nodes, node))
- {
- bool ok = re_node_set_insert (eps_via_nodes, node);
- if (__glibc_unlikely (! ok))
- return -2;
- }
-
- /* Pick a valid destination, or return -1 if none is found. */
- Idx dest_node = -1;
- for (Idx i = 0; i < edests->nelem; i++)
- {
- Idx candidate = edests->elems[i];
- if (!re_node_set_contains (cur_nodes, candidate))
- continue;
- if (dest_node == -1)
- dest_node = candidate;
-
- else
- {
- /* In order to avoid infinite loop like "(a*)*", return the second
- epsilon-transition if the first was already considered. */
- if (re_node_set_contains (eps_via_nodes, dest_node))
- return candidate;
-
- /* Otherwise, push the second epsilon-transition on the fail stack. */
- else if (fs != NULL
- && push_fail_stack (fs, *pidx, candidate, nregs, regs,
- prevregs, eps_via_nodes))
- return -2;
-
- /* We know we are going to exit. */
- break;
- }
- }
- return dest_node;
- }
- else
- {
- Idx naccepted = 0;
- re_token_type_t type = dfa->nodes[node].type;
-
- if (dfa->nodes[node].accept_mb)
- naccepted = check_node_accept_bytes (dfa, node, &mctx->input, *pidx);
- else if (type == OP_BACK_REF)
- {
- Idx subexp_idx = dfa->nodes[node].opr.idx + 1;
- if (subexp_idx < nregs)
- naccepted = regs[subexp_idx].rm_eo - regs[subexp_idx].rm_so;
- if (fs != NULL)
- {
- if (subexp_idx >= nregs
- || regs[subexp_idx].rm_so == -1
- || regs[subexp_idx].rm_eo == -1)
- return -1;
- else if (naccepted)
- {
- char *buf = (char *) re_string_get_buffer (&mctx->input);
- if (mctx->input.valid_len - *pidx < naccepted
- || (memcmp (buf + regs[subexp_idx].rm_so, buf + *pidx,
- naccepted)
- != 0))
- return -1;
- }
- }
-
- if (naccepted == 0)
- {
- Idx dest_node;
- bool ok = re_node_set_insert (eps_via_nodes, node);
- if (__glibc_unlikely (! ok))
- return -2;
- dest_node = dfa->edests[node].elems[0];
- if (re_node_set_contains (&mctx->state_log[*pidx]->nodes,
- dest_node))
- return dest_node;
- }
- }
-
- if (naccepted != 0
- || check_node_accept (mctx, dfa->nodes + node, *pidx))
- {
- Idx dest_node = dfa->nexts[node];
- *pidx = (naccepted == 0) ? *pidx + 1 : *pidx + naccepted;
- if (fs && (*pidx > mctx->match_last || mctx->state_log[*pidx] == NULL
- || !re_node_set_contains (&mctx->state_log[*pidx]->nodes,
- dest_node)))
- return -1;
- re_node_set_empty (eps_via_nodes);
- return dest_node;
- }
- }
- return -1;
-}
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-push_fail_stack (struct re_fail_stack_t *fs, Idx str_idx, Idx dest_node,
- Idx nregs, regmatch_t *regs, regmatch_t *prevregs,
- re_node_set *eps_via_nodes)
-{
- reg_errcode_t err;
- Idx num = fs->num;
- if (num == fs->alloc)
- {
- struct re_fail_stack_ent_t *new_array;
- new_array = re_realloc (fs->stack, struct re_fail_stack_ent_t,
- fs->alloc * 2);
- if (new_array == NULL)
- return REG_ESPACE;
- fs->alloc *= 2;
- fs->stack = new_array;
- }
- fs->stack[num].idx = str_idx;
- fs->stack[num].node = dest_node;
- fs->stack[num].regs = re_malloc (regmatch_t, 2 * nregs);
- if (fs->stack[num].regs == NULL)
- return REG_ESPACE;
- fs->num = num + 1;
- memcpy (fs->stack[num].regs, regs, sizeof (regmatch_t) * nregs);
- memcpy (fs->stack[num].regs + nregs, prevregs, sizeof (regmatch_t) * nregs);
- err = re_node_set_init_copy (&fs->stack[num].eps_via_nodes, eps_via_nodes);
- return err;
-}
-
-static Idx
-pop_fail_stack (struct re_fail_stack_t *fs, Idx *pidx, Idx nregs,
- regmatch_t *regs, regmatch_t *prevregs,
- re_node_set *eps_via_nodes)
-{
- if (fs == NULL || fs->num == 0)
- return -1;
- Idx num = --fs->num;
- *pidx = fs->stack[num].idx;
- memcpy (regs, fs->stack[num].regs, sizeof (regmatch_t) * nregs);
- memcpy (prevregs, fs->stack[num].regs + nregs, sizeof (regmatch_t) * nregs);
- re_node_set_free (eps_via_nodes);
- re_free (fs->stack[num].regs);
- *eps_via_nodes = fs->stack[num].eps_via_nodes;
- DEBUG_ASSERT (0 <= fs->stack[num].node);
- return fs->stack[num].node;
-}
-
-
-#define DYNARRAY_STRUCT regmatch_list
-#define DYNARRAY_ELEMENT regmatch_t
-#define DYNARRAY_PREFIX regmatch_list_
-#include <malloc/dynarray-skeleton.c>
-
-/* Set the positions where the subexpressions are starts/ends to registers
- PMATCH.
- Note: We assume that pmatch[0] is already set, and
- pmatch[i].rm_so == pmatch[i].rm_eo == -1 for 0 < i < nmatch. */
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-set_regs (const regex_t *preg, const re_match_context_t *mctx, size_t nmatch,
- regmatch_t *pmatch, bool fl_backtrack)
-{
- const re_dfa_t *dfa = preg->buffer;
- Idx idx, cur_node;
- re_node_set eps_via_nodes;
- struct re_fail_stack_t *fs;
- struct re_fail_stack_t fs_body = { 0, 2, NULL };
- struct regmatch_list prev_match;
- regmatch_list_init (&prev_match);
-
- DEBUG_ASSERT (nmatch > 1);
- DEBUG_ASSERT (mctx->state_log != NULL);
- if (fl_backtrack)
- {
- fs = &fs_body;
- fs->stack = re_malloc (struct re_fail_stack_ent_t, fs->alloc);
- if (fs->stack == NULL)
- return REG_ESPACE;
- }
- else
- fs = NULL;
-
- cur_node = dfa->init_node;
- re_node_set_init_empty (&eps_via_nodes);
-
- if (!regmatch_list_resize (&prev_match, nmatch))
- {
- regmatch_list_free (&prev_match);
- free_fail_stack_return (fs);
- return REG_ESPACE;
- }
- regmatch_t *prev_idx_match = regmatch_list_begin (&prev_match);
- memcpy (prev_idx_match, pmatch, sizeof (regmatch_t) * nmatch);
-
- for (idx = pmatch[0].rm_so; idx <= pmatch[0].rm_eo ;)
- {
- update_regs (dfa, pmatch, prev_idx_match, cur_node, idx, nmatch);
-
- if ((idx == pmatch[0].rm_eo && cur_node == mctx->last_node)
- || (fs && re_node_set_contains (&eps_via_nodes, cur_node)))
- {
- Idx reg_idx;
- cur_node = -1;
- if (fs)
- {
- for (reg_idx = 0; reg_idx < nmatch; ++reg_idx)
- if (pmatch[reg_idx].rm_so > -1 && pmatch[reg_idx].rm_eo == -1)
- {
- cur_node = pop_fail_stack (fs, &idx, nmatch, pmatch,
- prev_idx_match, &eps_via_nodes);
- break;
- }
- }
- if (cur_node < 0)
- {
- re_node_set_free (&eps_via_nodes);
- regmatch_list_free (&prev_match);
- return free_fail_stack_return (fs);
- }
- }
-
- /* Proceed to next node. */
- cur_node = proceed_next_node (mctx, nmatch, pmatch, prev_idx_match,
- &idx, cur_node,
- &eps_via_nodes, fs);
-
- if (__glibc_unlikely (cur_node < 0))
- {
- if (__glibc_unlikely (cur_node == -2))
- {
- re_node_set_free (&eps_via_nodes);
- regmatch_list_free (&prev_match);
- free_fail_stack_return (fs);
- return REG_ESPACE;
- }
- cur_node = pop_fail_stack (fs, &idx, nmatch, pmatch,
- prev_idx_match, &eps_via_nodes);
- if (cur_node < 0)
- {
- re_node_set_free (&eps_via_nodes);
- regmatch_list_free (&prev_match);
- free_fail_stack_return (fs);
- return REG_NOMATCH;
- }
- }
- }
- re_node_set_free (&eps_via_nodes);
- regmatch_list_free (&prev_match);
- return free_fail_stack_return (fs);
-}
-
-static reg_errcode_t
-free_fail_stack_return (struct re_fail_stack_t *fs)
-{
- if (fs)
- {
- Idx fs_idx;
- for (fs_idx = 0; fs_idx < fs->num; ++fs_idx)
- {
- re_node_set_free (&fs->stack[fs_idx].eps_via_nodes);
- re_free (fs->stack[fs_idx].regs);
- }
- re_free (fs->stack);
- }
- return REG_NOERROR;
-}
-
-static void
-update_regs (const re_dfa_t *dfa, regmatch_t *pmatch,
- regmatch_t *prev_idx_match, Idx cur_node, Idx cur_idx, Idx nmatch)
-{
- int type = dfa->nodes[cur_node].type;
- if (type == OP_OPEN_SUBEXP)
- {
- Idx reg_num = dfa->nodes[cur_node].opr.idx + 1;
-
- /* We are at the first node of this sub expression. */
- if (reg_num < nmatch)
- {
- pmatch[reg_num].rm_so = cur_idx;
- pmatch[reg_num].rm_eo = -1;
- }
- }
- else if (type == OP_CLOSE_SUBEXP)
- {
- /* We are at the last node of this sub expression. */
- Idx reg_num = dfa->nodes[cur_node].opr.idx + 1;
- if (reg_num < nmatch)
- {
- if (pmatch[reg_num].rm_so < cur_idx)
- {
- pmatch[reg_num].rm_eo = cur_idx;
- /* This is a non-empty match or we are not inside an optional
- subexpression. Accept this right away. */
- memcpy (prev_idx_match, pmatch, sizeof (regmatch_t) * nmatch);
- }
- else
- {
- if (dfa->nodes[cur_node].opt_subexp
- && prev_idx_match[reg_num].rm_so != -1)
- /* We transited through an empty match for an optional
- subexpression, like (a?)*, and this is not the subexp's
- first match. Copy back the old content of the registers
- so that matches of an inner subexpression are undone as
- well, like in ((a?))*. */
- memcpy (pmatch, prev_idx_match, sizeof (regmatch_t) * nmatch);
- else
- /* We completed a subexpression, but it may be part of
- an optional one, so do not update PREV_IDX_MATCH. */
- pmatch[reg_num].rm_eo = cur_idx;
- }
- }
- }
-}
-
-/* This function checks the STATE_LOG from the SCTX->last_str_idx to 0
- and sift the nodes in each states according to the following rules.
- Updated state_log will be wrote to STATE_LOG.
-
- Rules: We throw away the Node 'a' in the STATE_LOG[STR_IDX] if...
- 1. When STR_IDX == MATCH_LAST(the last index in the state_log):
- If 'a' isn't the LAST_NODE and 'a' can't epsilon transit to
- the LAST_NODE, we throw away the node 'a'.
- 2. When 0 <= STR_IDX < MATCH_LAST and 'a' accepts
- string 's' and transit to 'b':
- i. If 'b' isn't in the STATE_LOG[STR_IDX+strlen('s')], we throw
- away the node 'a'.
- ii. If 'b' is in the STATE_LOG[STR_IDX+strlen('s')] but 'b' is
- thrown away, we throw away the node 'a'.
- 3. When 0 <= STR_IDX < MATCH_LAST and 'a' epsilon transit to 'b':
- i. If 'b' isn't in the STATE_LOG[STR_IDX], we throw away the
- node 'a'.
- ii. If 'b' is in the STATE_LOG[STR_IDX] but 'b' is thrown away,
- we throw away the node 'a'. */
-
-#define STATE_NODE_CONTAINS(state,node) \
- ((state) != NULL && re_node_set_contains (&(state)->nodes, node))
-
-static reg_errcode_t
-sift_states_backward (const re_match_context_t *mctx, re_sift_context_t *sctx)
-{
- reg_errcode_t err;
- int null_cnt = 0;
- Idx str_idx = sctx->last_str_idx;
- re_node_set cur_dest;
-
- DEBUG_ASSERT (mctx->state_log != NULL && mctx->state_log[str_idx] != NULL);
-
- /* Build sifted state_log[str_idx]. It has the nodes which can epsilon
- transit to the last_node and the last_node itself. */
- err = re_node_set_init_1 (&cur_dest, sctx->last_node);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- err = update_cur_sifted_state (mctx, sctx, str_idx, &cur_dest);
- if (__glibc_unlikely (err != REG_NOERROR))
- goto free_return;
-
- /* Then check each states in the state_log. */
- while (str_idx > 0)
- {
- /* Update counters. */
- null_cnt = (sctx->sifted_states[str_idx] == NULL) ? null_cnt + 1 : 0;
- if (null_cnt > mctx->max_mb_elem_len)
- {
- memset (sctx->sifted_states, '\0',
- sizeof (re_dfastate_t *) * str_idx);
- re_node_set_free (&cur_dest);
- return REG_NOERROR;
- }
- re_node_set_empty (&cur_dest);
- --str_idx;
-
- if (mctx->state_log[str_idx])
- {
- err = build_sifted_states (mctx, sctx, str_idx, &cur_dest);
- if (__glibc_unlikely (err != REG_NOERROR))
- goto free_return;
- }
-
- /* Add all the nodes which satisfy the following conditions:
- - It can epsilon transit to a node in CUR_DEST.
- - It is in CUR_SRC.
- And update state_log. */
- err = update_cur_sifted_state (mctx, sctx, str_idx, &cur_dest);
- if (__glibc_unlikely (err != REG_NOERROR))
- goto free_return;
- }
- err = REG_NOERROR;
- free_return:
- re_node_set_free (&cur_dest);
- return err;
-}
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-build_sifted_states (const re_match_context_t *mctx, re_sift_context_t *sctx,
- Idx str_idx, re_node_set *cur_dest)
-{
- const re_dfa_t *const dfa = mctx->dfa;
- const re_node_set *cur_src = &mctx->state_log[str_idx]->non_eps_nodes;
- Idx i;
-
- /* Then build the next sifted state.
- We build the next sifted state on 'cur_dest', and update
- 'sifted_states[str_idx]' with 'cur_dest'.
- Note:
- 'cur_dest' is the sifted state from 'state_log[str_idx + 1]'.
- 'cur_src' points the node_set of the old 'state_log[str_idx]'
- (with the epsilon nodes pre-filtered out). */
- for (i = 0; i < cur_src->nelem; i++)
- {
- Idx prev_node = cur_src->elems[i];
- int naccepted = 0;
- bool ok;
- DEBUG_ASSERT (!IS_EPSILON_NODE (dfa->nodes[prev_node].type));
-
- /* If the node may accept "multi byte". */
- if (dfa->nodes[prev_node].accept_mb)
- naccepted = sift_states_iter_mb (mctx, sctx, prev_node,
- str_idx, sctx->last_str_idx);
-
- /* We don't check backreferences here.
- See update_cur_sifted_state(). */
- if (!naccepted
- && check_node_accept (mctx, dfa->nodes + prev_node, str_idx)
- && STATE_NODE_CONTAINS (sctx->sifted_states[str_idx + 1],
- dfa->nexts[prev_node]))
- naccepted = 1;
-
- if (naccepted == 0)
- continue;
-
- if (sctx->limits.nelem)
- {
- Idx to_idx = str_idx + naccepted;
- if (check_dst_limits (mctx, &sctx->limits,
- dfa->nexts[prev_node], to_idx,
- prev_node, str_idx))
- continue;
- }
- ok = re_node_set_insert (cur_dest, prev_node);
- if (__glibc_unlikely (! ok))
- return REG_ESPACE;
- }
-
- return REG_NOERROR;
-}
-
-/* Helper functions. */
-
-static reg_errcode_t
-clean_state_log_if_needed (re_match_context_t *mctx, Idx next_state_log_idx)
-{
- Idx top = mctx->state_log_top;
-
- if ((next_state_log_idx >= mctx->input.bufs_len
- && mctx->input.bufs_len < mctx->input.len)
- || (next_state_log_idx >= mctx->input.valid_len
- && mctx->input.valid_len < mctx->input.len))
- {
- reg_errcode_t err;
- err = extend_buffers (mctx, next_state_log_idx + 1);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- }
-
- if (top < next_state_log_idx)
- {
- DEBUG_ASSERT (mctx->state_log != NULL);
- memset (mctx->state_log + top + 1, '\0',
- sizeof (re_dfastate_t *) * (next_state_log_idx - top));
- mctx->state_log_top = next_state_log_idx;
- }
- return REG_NOERROR;
-}
-
-static reg_errcode_t
-merge_state_array (const re_dfa_t *dfa, re_dfastate_t **dst,
- re_dfastate_t **src, Idx num)
-{
- Idx st_idx;
- reg_errcode_t err;
- for (st_idx = 0; st_idx < num; ++st_idx)
- {
- if (dst[st_idx] == NULL)
- dst[st_idx] = src[st_idx];
- else if (src[st_idx] != NULL)
- {
- re_node_set merged_set;
- err = re_node_set_init_union (&merged_set, &dst[st_idx]->nodes,
- &src[st_idx]->nodes);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- dst[st_idx] = re_acquire_state (&err, dfa, &merged_set);
- re_node_set_free (&merged_set);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- }
- }
- return REG_NOERROR;
-}
-
-static reg_errcode_t
-update_cur_sifted_state (const re_match_context_t *mctx,
- re_sift_context_t *sctx, Idx str_idx,
- re_node_set *dest_nodes)
-{
- const re_dfa_t *const dfa = mctx->dfa;
- reg_errcode_t err = REG_NOERROR;
- const re_node_set *candidates;
- candidates = ((mctx->state_log[str_idx] == NULL) ? NULL
- : &mctx->state_log[str_idx]->nodes);
-
- if (dest_nodes->nelem == 0)
- sctx->sifted_states[str_idx] = NULL;
- else
- {
- if (candidates)
- {
- /* At first, add the nodes which can epsilon transit to a node in
- DEST_NODE. */
- err = add_epsilon_src_nodes (dfa, dest_nodes, candidates);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
-
- /* Then, check the limitations in the current sift_context. */
- if (sctx->limits.nelem)
- {
- err = check_subexp_limits (dfa, dest_nodes, candidates, &sctx->limits,
- mctx->bkref_ents, str_idx);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- }
- }
-
- sctx->sifted_states[str_idx] = re_acquire_state (&err, dfa, dest_nodes);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- }
-
- if (candidates && mctx->state_log[str_idx]->has_backref)
- {
- err = sift_states_bkref (mctx, sctx, str_idx, candidates);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- }
- return REG_NOERROR;
-}
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-add_epsilon_src_nodes (const re_dfa_t *dfa, re_node_set *dest_nodes,
- const re_node_set *candidates)
-{
- reg_errcode_t err = REG_NOERROR;
- Idx i;
-
- re_dfastate_t *state = re_acquire_state (&err, dfa, dest_nodes);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
-
- if (!state->inveclosure.alloc)
- {
- err = re_node_set_alloc (&state->inveclosure, dest_nodes->nelem);
- if (__glibc_unlikely (err != REG_NOERROR))
- return REG_ESPACE;
- for (i = 0; i < dest_nodes->nelem; i++)
- {
- err = re_node_set_merge (&state->inveclosure,
- dfa->inveclosures + dest_nodes->elems[i]);
- if (__glibc_unlikely (err != REG_NOERROR))
- return REG_ESPACE;
- }
- }
- return re_node_set_add_intersect (dest_nodes, candidates,
- &state->inveclosure);
-}
-
-static reg_errcode_t
-sub_epsilon_src_nodes (const re_dfa_t *dfa, Idx node, re_node_set *dest_nodes,
- const re_node_set *candidates)
-{
- Idx ecl_idx;
- reg_errcode_t err;
- re_node_set *inv_eclosure = dfa->inveclosures + node;
- re_node_set except_nodes;
- re_node_set_init_empty (&except_nodes);
- for (ecl_idx = 0; ecl_idx < inv_eclosure->nelem; ++ecl_idx)
- {
- Idx cur_node = inv_eclosure->elems[ecl_idx];
- if (cur_node == node)
- continue;
- if (IS_EPSILON_NODE (dfa->nodes[cur_node].type))
- {
- Idx edst1 = dfa->edests[cur_node].elems[0];
- Idx edst2 = ((dfa->edests[cur_node].nelem > 1)
- ? dfa->edests[cur_node].elems[1] : -1);
- if ((!re_node_set_contains (inv_eclosure, edst1)
- && re_node_set_contains (dest_nodes, edst1))
- || (edst2 > 0
- && !re_node_set_contains (inv_eclosure, edst2)
- && re_node_set_contains (dest_nodes, edst2)))
- {
- err = re_node_set_add_intersect (&except_nodes, candidates,
- dfa->inveclosures + cur_node);
- if (__glibc_unlikely (err != REG_NOERROR))
- {
- re_node_set_free (&except_nodes);
- return err;
- }
- }
- }
- }
- for (ecl_idx = 0; ecl_idx < inv_eclosure->nelem; ++ecl_idx)
- {
- Idx cur_node = inv_eclosure->elems[ecl_idx];
- if (!re_node_set_contains (&except_nodes, cur_node))
- {
- Idx idx = re_node_set_contains (dest_nodes, cur_node) - 1;
- re_node_set_remove_at (dest_nodes, idx);
- }
- }
- re_node_set_free (&except_nodes);
- return REG_NOERROR;
-}
-
-static bool
-check_dst_limits (const re_match_context_t *mctx, const re_node_set *limits,
- Idx dst_node, Idx dst_idx, Idx src_node, Idx src_idx)
-{
- const re_dfa_t *const dfa = mctx->dfa;
- Idx lim_idx, src_pos, dst_pos;
-
- Idx dst_bkref_idx = search_cur_bkref_entry (mctx, dst_idx);
- Idx src_bkref_idx = search_cur_bkref_entry (mctx, src_idx);
- for (lim_idx = 0; lim_idx < limits->nelem; ++lim_idx)
- {
- Idx subexp_idx;
- struct re_backref_cache_entry *ent;
- ent = mctx->bkref_ents + limits->elems[lim_idx];
- subexp_idx = dfa->nodes[ent->node].opr.idx;
-
- dst_pos = check_dst_limits_calc_pos (mctx, limits->elems[lim_idx],
- subexp_idx, dst_node, dst_idx,
- dst_bkref_idx);
- src_pos = check_dst_limits_calc_pos (mctx, limits->elems[lim_idx],
- subexp_idx, src_node, src_idx,
- src_bkref_idx);
-
- /* In case of:
- <src> <dst> ( <subexp> )
- ( <subexp> ) <src> <dst>
- ( <subexp1> <src> <subexp2> <dst> <subexp3> ) */
- if (src_pos == dst_pos)
- continue; /* This is unrelated limitation. */
- else
- return true;
- }
- return false;
-}
-
-static int
-check_dst_limits_calc_pos_1 (const re_match_context_t *mctx, int boundaries,
- Idx subexp_idx, Idx from_node, Idx bkref_idx)
-{
- const re_dfa_t *const dfa = mctx->dfa;
- const re_node_set *eclosures = dfa->eclosures + from_node;
- Idx node_idx;
-
- /* Else, we are on the boundary: examine the nodes on the epsilon
- closure. */
- for (node_idx = 0; node_idx < eclosures->nelem; ++node_idx)
- {
- Idx node = eclosures->elems[node_idx];
- switch (dfa->nodes[node].type)
- {
- case OP_BACK_REF:
- if (bkref_idx != -1)
- {
- struct re_backref_cache_entry *ent = mctx->bkref_ents + bkref_idx;
- do
- {
- Idx dst;
- int cpos;
-
- if (ent->node != node)
- continue;
-
- if (subexp_idx < BITSET_WORD_BITS
- && !(ent->eps_reachable_subexps_map
- & ((bitset_word_t) 1 << subexp_idx)))
- continue;
-
- /* Recurse trying to reach the OP_OPEN_SUBEXP and
- OP_CLOSE_SUBEXP cases below. But, if the
- destination node is the same node as the source
- node, don't recurse because it would cause an
- infinite loop: a regex that exhibits this behavior
- is ()\1*\1* */
- dst = dfa->edests[node].elems[0];
- if (dst == from_node)
- {
- if (boundaries & 1)
- return -1;
- else /* if (boundaries & 2) */
- return 0;
- }
-
- cpos =
- check_dst_limits_calc_pos_1 (mctx, boundaries, subexp_idx,
- dst, bkref_idx);
- if (cpos == -1 /* && (boundaries & 1) */)
- return -1;
- if (cpos == 0 && (boundaries & 2))
- return 0;
-
- if (subexp_idx < BITSET_WORD_BITS)
- ent->eps_reachable_subexps_map
- &= ~((bitset_word_t) 1 << subexp_idx);
- }
- while (ent++->more);
- }
- break;
-
- case OP_OPEN_SUBEXP:
- if ((boundaries & 1) && subexp_idx == dfa->nodes[node].opr.idx)
- return -1;
- break;
-
- case OP_CLOSE_SUBEXP:
- if ((boundaries & 2) && subexp_idx == dfa->nodes[node].opr.idx)
- return 0;
- break;
-
- default:
- break;
- }
- }
-
- return (boundaries & 2) ? 1 : 0;
-}
-
-static int
-check_dst_limits_calc_pos (const re_match_context_t *mctx, Idx limit,
- Idx subexp_idx, Idx from_node, Idx str_idx,
- Idx bkref_idx)
-{
- struct re_backref_cache_entry *lim = mctx->bkref_ents + limit;
- int boundaries;
-
- /* If we are outside the range of the subexpression, return -1 or 1. */
- if (str_idx < lim->subexp_from)
- return -1;
-
- if (lim->subexp_to < str_idx)
- return 1;
-
- /* If we are within the subexpression, return 0. */
- boundaries = (str_idx == lim->subexp_from);
- boundaries |= (str_idx == lim->subexp_to) << 1;
- if (boundaries == 0)
- return 0;
-
- /* Else, examine epsilon closure. */
- return check_dst_limits_calc_pos_1 (mctx, boundaries, subexp_idx,
- from_node, bkref_idx);
-}
-
-/* Check the limitations of sub expressions LIMITS, and remove the nodes
- which are against limitations from DEST_NODES. */
-
-static reg_errcode_t
-check_subexp_limits (const re_dfa_t *dfa, re_node_set *dest_nodes,
- const re_node_set *candidates, re_node_set *limits,
- struct re_backref_cache_entry *bkref_ents, Idx str_idx)
-{
- reg_errcode_t err;
- Idx node_idx, lim_idx;
-
- for (lim_idx = 0; lim_idx < limits->nelem; ++lim_idx)
- {
- Idx subexp_idx;
- struct re_backref_cache_entry *ent;
- ent = bkref_ents + limits->elems[lim_idx];
-
- if (str_idx <= ent->subexp_from || ent->str_idx < str_idx)
- continue; /* This is unrelated limitation. */
-
- subexp_idx = dfa->nodes[ent->node].opr.idx;
- if (ent->subexp_to == str_idx)
- {
- Idx ops_node = -1;
- Idx cls_node = -1;
- for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx)
- {
- Idx node = dest_nodes->elems[node_idx];
- re_token_type_t type = dfa->nodes[node].type;
- if (type == OP_OPEN_SUBEXP
- && subexp_idx == dfa->nodes[node].opr.idx)
- ops_node = node;
- else if (type == OP_CLOSE_SUBEXP
- && subexp_idx == dfa->nodes[node].opr.idx)
- cls_node = node;
- }
-
- /* Check the limitation of the open subexpression. */
- /* Note that (ent->subexp_to = str_idx != ent->subexp_from). */
- if (ops_node >= 0)
- {
- err = sub_epsilon_src_nodes (dfa, ops_node, dest_nodes,
- candidates);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- }
-
- /* Check the limitation of the close subexpression. */
- if (cls_node >= 0)
- for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx)
- {
- Idx node = dest_nodes->elems[node_idx];
- if (!re_node_set_contains (dfa->inveclosures + node,
- cls_node)
- && !re_node_set_contains (dfa->eclosures + node,
- cls_node))
- {
- /* It is against this limitation.
- Remove it form the current sifted state. */
- err = sub_epsilon_src_nodes (dfa, node, dest_nodes,
- candidates);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- --node_idx;
- }
- }
- }
- else /* (ent->subexp_to != str_idx) */
- {
- for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx)
- {
- Idx node = dest_nodes->elems[node_idx];
- re_token_type_t type = dfa->nodes[node].type;
- if (type == OP_CLOSE_SUBEXP || type == OP_OPEN_SUBEXP)
- {
- if (subexp_idx != dfa->nodes[node].opr.idx)
- continue;
- /* It is against this limitation.
- Remove it form the current sifted state. */
- err = sub_epsilon_src_nodes (dfa, node, dest_nodes,
- candidates);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- }
- }
- }
- }
- return REG_NOERROR;
-}
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-sift_states_bkref (const re_match_context_t *mctx, re_sift_context_t *sctx,
- Idx str_idx, const re_node_set *candidates)
-{
- const re_dfa_t *const dfa = mctx->dfa;
- reg_errcode_t err;
- Idx node_idx, node;
- re_sift_context_t local_sctx;
- Idx first_idx = search_cur_bkref_entry (mctx, str_idx);
-
- if (first_idx == -1)
- return REG_NOERROR;
-
- local_sctx.sifted_states = NULL; /* Mark that it hasn't been initialized. */
-
- for (node_idx = 0; node_idx < candidates->nelem; ++node_idx)
- {
- Idx enabled_idx;
- re_token_type_t type;
- struct re_backref_cache_entry *entry;
- node = candidates->elems[node_idx];
- type = dfa->nodes[node].type;
- /* Avoid infinite loop for the REs like "()\1+". */
- if (node == sctx->last_node && str_idx == sctx->last_str_idx)
- continue;
- if (type != OP_BACK_REF)
- continue;
-
- entry = mctx->bkref_ents + first_idx;
- enabled_idx = first_idx;
- do
- {
- Idx subexp_len;
- Idx to_idx;
- Idx dst_node;
- bool ok;
- re_dfastate_t *cur_state;
-
- if (entry->node != node)
- continue;
- subexp_len = entry->subexp_to - entry->subexp_from;
- to_idx = str_idx + subexp_len;
- dst_node = (subexp_len ? dfa->nexts[node]
- : dfa->edests[node].elems[0]);
-
- if (to_idx > sctx->last_str_idx
- || sctx->sifted_states[to_idx] == NULL
- || !STATE_NODE_CONTAINS (sctx->sifted_states[to_idx], dst_node)
- || check_dst_limits (mctx, &sctx->limits, node,
- str_idx, dst_node, to_idx))
- continue;
-
- if (local_sctx.sifted_states == NULL)
- {
- local_sctx = *sctx;
- err = re_node_set_init_copy (&local_sctx.limits, &sctx->limits);
- if (__glibc_unlikely (err != REG_NOERROR))
- goto free_return;
- }
- local_sctx.last_node = node;
- local_sctx.last_str_idx = str_idx;
- ok = re_node_set_insert (&local_sctx.limits, enabled_idx);
- if (__glibc_unlikely (! ok))
- {
- err = REG_ESPACE;
- goto free_return;
- }
- cur_state = local_sctx.sifted_states[str_idx];
- err = sift_states_backward (mctx, &local_sctx);
- if (__glibc_unlikely (err != REG_NOERROR))
- goto free_return;
- if (sctx->limited_states != NULL)
- {
- err = merge_state_array (dfa, sctx->limited_states,
- local_sctx.sifted_states,
- str_idx + 1);
- if (__glibc_unlikely (err != REG_NOERROR))
- goto free_return;
- }
- local_sctx.sifted_states[str_idx] = cur_state;
- re_node_set_remove (&local_sctx.limits, enabled_idx);
-
- /* mctx->bkref_ents may have changed, reload the pointer. */
- entry = mctx->bkref_ents + enabled_idx;
- }
- while (enabled_idx++, entry++->more);
- }
- err = REG_NOERROR;
- free_return:
- if (local_sctx.sifted_states != NULL)
- {
- re_node_set_free (&local_sctx.limits);
- }
-
- return err;
-}
-
-
-static int
-sift_states_iter_mb (const re_match_context_t *mctx, re_sift_context_t *sctx,
- Idx node_idx, Idx str_idx, Idx max_str_idx)
-{
- const re_dfa_t *const dfa = mctx->dfa;
- int naccepted;
- /* Check the node can accept "multi byte". */
- naccepted = check_node_accept_bytes (dfa, node_idx, &mctx->input, str_idx);
- if (naccepted > 0 && str_idx + naccepted <= max_str_idx
- && !STATE_NODE_CONTAINS (sctx->sifted_states[str_idx + naccepted],
- dfa->nexts[node_idx]))
- /* The node can't accept the "multi byte", or the
- destination was already thrown away, then the node
- couldn't accept the current input "multi byte". */
- naccepted = 0;
- /* Otherwise, it is sure that the node could accept
- 'naccepted' bytes input. */
- return naccepted;
-}
-
-/* Functions for state transition. */
-
-/* Return the next state to which the current state STATE will transit by
- accepting the current input byte, and update STATE_LOG if necessary.
- Return NULL on failure.
- If STATE can accept a multibyte char/collating element/back reference
- update the destination of STATE_LOG. */
-
-static re_dfastate_t *
-__attribute_warn_unused_result__
-transit_state (reg_errcode_t *err, re_match_context_t *mctx,
- re_dfastate_t *state)
-{
- re_dfastate_t **trtable;
- unsigned char ch;
-
- /* If the current state can accept multibyte. */
- if (__glibc_unlikely (state->accept_mb))
- {
- *err = transit_state_mb (mctx, state);
- if (__glibc_unlikely (*err != REG_NOERROR))
- return NULL;
- }
-
- /* Then decide the next state with the single byte. */
-#if 0
- if (0)
- /* don't use transition table */
- return transit_state_sb (err, mctx, state);
-#endif
-
- /* Use transition table */
- ch = re_string_fetch_byte (&mctx->input);
- for (;;)
- {
- trtable = state->trtable;
- if (__glibc_likely (trtable != NULL))
- return trtable[ch];
-
- trtable = state->word_trtable;
- if (__glibc_likely (trtable != NULL))
- {
- unsigned int context;
- context
- = re_string_context_at (&mctx->input,
- re_string_cur_idx (&mctx->input) - 1,
- mctx->eflags);
- if (IS_WORD_CONTEXT (context))
- return trtable[ch + SBC_MAX];
- else
- return trtable[ch];
- }
-
- if (!build_trtable (mctx->dfa, state))
- {
- *err = REG_ESPACE;
- return NULL;
- }
-
- /* Retry, we now have a transition table. */
- }
-}
-
-/* Update the state_log if we need */
-static re_dfastate_t *
-merge_state_with_log (reg_errcode_t *err, re_match_context_t *mctx,
- re_dfastate_t *next_state)
-{
- const re_dfa_t *const dfa = mctx->dfa;
- Idx cur_idx = re_string_cur_idx (&mctx->input);
-
- if (cur_idx > mctx->state_log_top)
- {
- mctx->state_log[cur_idx] = next_state;
- mctx->state_log_top = cur_idx;
- }
- else if (mctx->state_log[cur_idx] == 0)
- {
- mctx->state_log[cur_idx] = next_state;
- }
- else
- {
- re_dfastate_t *pstate;
- unsigned int context;
- re_node_set next_nodes, *log_nodes, *table_nodes = NULL;
- /* If (state_log[cur_idx] != 0), it implies that cur_idx is
- the destination of a multibyte char/collating element/
- back reference. Then the next state is the union set of
- these destinations and the results of the transition table. */
- pstate = mctx->state_log[cur_idx];
- log_nodes = pstate->entrance_nodes;
- if (next_state != NULL)
- {
- table_nodes = next_state->entrance_nodes;
- *err = re_node_set_init_union (&next_nodes, table_nodes,
- log_nodes);
- if (__glibc_unlikely (*err != REG_NOERROR))
- return NULL;
- }
- else
- next_nodes = *log_nodes;
- /* Note: We already add the nodes of the initial state,
- then we don't need to add them here. */
-
- context = re_string_context_at (&mctx->input,
- re_string_cur_idx (&mctx->input) - 1,
- mctx->eflags);
- next_state = mctx->state_log[cur_idx]
- = re_acquire_state_context (err, dfa, &next_nodes, context);
- /* We don't need to check errors here, since the return value of
- this function is next_state and ERR is already set. */
-
- if (table_nodes != NULL)
- re_node_set_free (&next_nodes);
- }
-
- if (__glibc_unlikely (dfa->nbackref) && next_state != NULL)
- {
- /* Check OP_OPEN_SUBEXP in the current state in case that we use them
- later. We must check them here, since the back references in the
- next state might use them. */
- *err = check_subexp_matching_top (mctx, &next_state->nodes,
- cur_idx);
- if (__glibc_unlikely (*err != REG_NOERROR))
- return NULL;
-
- /* If the next state has back references. */
- if (next_state->has_backref)
- {
- *err = transit_state_bkref (mctx, &next_state->nodes);
- if (__glibc_unlikely (*err != REG_NOERROR))
- return NULL;
- next_state = mctx->state_log[cur_idx];
- }
- }
-
- return next_state;
-}
-
-/* Skip bytes in the input that correspond to part of a
- multi-byte match, then look in the log for a state
- from which to restart matching. */
-static re_dfastate_t *
-find_recover_state (reg_errcode_t *err, re_match_context_t *mctx)
-{
- re_dfastate_t *cur_state;
- do
- {
- Idx max = mctx->state_log_top;
- Idx cur_str_idx = re_string_cur_idx (&mctx->input);
-
- do
- {
- if (++cur_str_idx > max)
- return NULL;
- re_string_skip_bytes (&mctx->input, 1);
- }
- while (mctx->state_log[cur_str_idx] == NULL);
-
- cur_state = merge_state_with_log (err, mctx, NULL);
- }
- while (*err == REG_NOERROR && cur_state == NULL);
- return cur_state;
-}
-
-/* Helper functions for transit_state. */
-
-/* From the node set CUR_NODES, pick up the nodes whose types are
- OP_OPEN_SUBEXP and which have corresponding back references in the regular
- expression. And register them to use them later for evaluating the
- corresponding back references. */
-
-static reg_errcode_t
-check_subexp_matching_top (re_match_context_t *mctx, re_node_set *cur_nodes,
- Idx str_idx)
-{
- const re_dfa_t *const dfa = mctx->dfa;
- Idx node_idx;
- reg_errcode_t err;
-
- /* TODO: This isn't efficient.
- Because there might be more than one nodes whose types are
- OP_OPEN_SUBEXP and whose index is SUBEXP_IDX, we must check all
- nodes.
- E.g. RE: (a){2} */
- for (node_idx = 0; node_idx < cur_nodes->nelem; ++node_idx)
- {
- Idx node = cur_nodes->elems[node_idx];
- if (dfa->nodes[node].type == OP_OPEN_SUBEXP
- && dfa->nodes[node].opr.idx < BITSET_WORD_BITS
- && (dfa->used_bkref_map
- & ((bitset_word_t) 1 << dfa->nodes[node].opr.idx)))
- {
- err = match_ctx_add_subtop (mctx, node, str_idx);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- }
- }
- return REG_NOERROR;
-}
-
-#if 0
-/* Return the next state to which the current state STATE will transit by
- accepting the current input byte. Return NULL on failure. */
-
-static re_dfastate_t *
-transit_state_sb (reg_errcode_t *err, re_match_context_t *mctx,
- re_dfastate_t *state)
-{
- const re_dfa_t *const dfa = mctx->dfa;
- re_node_set next_nodes;
- re_dfastate_t *next_state;
- Idx node_cnt, cur_str_idx = re_string_cur_idx (&mctx->input);
- unsigned int context;
-
- *err = re_node_set_alloc (&next_nodes, state->nodes.nelem + 1);
- if (__glibc_unlikely (*err != REG_NOERROR))
- return NULL;
- for (node_cnt = 0; node_cnt < state->nodes.nelem; ++node_cnt)
- {
- Idx cur_node = state->nodes.elems[node_cnt];
- if (check_node_accept (mctx, dfa->nodes + cur_node, cur_str_idx))
- {
- *err = re_node_set_merge (&next_nodes,
- dfa->eclosures + dfa->nexts[cur_node]);
- if (__glibc_unlikely (*err != REG_NOERROR))
- {
- re_node_set_free (&next_nodes);
- return NULL;
- }
- }
- }
- context = re_string_context_at (&mctx->input, cur_str_idx, mctx->eflags);
- next_state = re_acquire_state_context (err, dfa, &next_nodes, context);
- /* We don't need to check errors here, since the return value of
- this function is next_state and ERR is already set. */
-
- re_node_set_free (&next_nodes);
- re_string_skip_bytes (&mctx->input, 1);
- return next_state;
-}
-#endif
-
-static reg_errcode_t
-transit_state_mb (re_match_context_t *mctx, re_dfastate_t *pstate)
-{
- const re_dfa_t *const dfa = mctx->dfa;
- reg_errcode_t err;
- Idx i;
-
- for (i = 0; i < pstate->nodes.nelem; ++i)
- {
- re_node_set dest_nodes, *new_nodes;
- Idx cur_node_idx = pstate->nodes.elems[i];
- int naccepted;
- Idx dest_idx;
- unsigned int context;
- re_dfastate_t *dest_state;
-
- if (!dfa->nodes[cur_node_idx].accept_mb)
- continue;
-
- if (dfa->nodes[cur_node_idx].constraint)
- {
- context = re_string_context_at (&mctx->input,
- re_string_cur_idx (&mctx->input),
- mctx->eflags);
- if (NOT_SATISFY_NEXT_CONSTRAINT (dfa->nodes[cur_node_idx].constraint,
- context))
- continue;
- }
-
- /* How many bytes the node can accept? */
- naccepted = check_node_accept_bytes (dfa, cur_node_idx, &mctx->input,
- re_string_cur_idx (&mctx->input));
- if (naccepted == 0)
- continue;
-
- /* The node can accepts 'naccepted' bytes. */
- dest_idx = re_string_cur_idx (&mctx->input) + naccepted;
- mctx->max_mb_elem_len = ((mctx->max_mb_elem_len < naccepted) ? naccepted
- : mctx->max_mb_elem_len);
- err = clean_state_log_if_needed (mctx, dest_idx);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- DEBUG_ASSERT (dfa->nexts[cur_node_idx] != -1);
- new_nodes = dfa->eclosures + dfa->nexts[cur_node_idx];
-
- dest_state = mctx->state_log[dest_idx];
- if (dest_state == NULL)
- dest_nodes = *new_nodes;
- else
- {
- err = re_node_set_init_union (&dest_nodes,
- dest_state->entrance_nodes, new_nodes);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- }
- context = re_string_context_at (&mctx->input, dest_idx - 1,
- mctx->eflags);
- mctx->state_log[dest_idx]
- = re_acquire_state_context (&err, dfa, &dest_nodes, context);
- if (dest_state != NULL)
- re_node_set_free (&dest_nodes);
- if (__glibc_unlikely (mctx->state_log[dest_idx] == NULL
- && err != REG_NOERROR))
- return err;
- }
- return REG_NOERROR;
-}
-
-static reg_errcode_t
-transit_state_bkref (re_match_context_t *mctx, const re_node_set *nodes)
-{
- const re_dfa_t *const dfa = mctx->dfa;
- reg_errcode_t err;
- Idx i;
- Idx cur_str_idx = re_string_cur_idx (&mctx->input);
-
- for (i = 0; i < nodes->nelem; ++i)
- {
- Idx dest_str_idx, prev_nelem, bkc_idx;
- Idx node_idx = nodes->elems[i];
- unsigned int context;
- const re_token_t *node = dfa->nodes + node_idx;
- re_node_set *new_dest_nodes;
-
- /* Check whether 'node' is a backreference or not. */
- if (node->type != OP_BACK_REF)
- continue;
-
- if (node->constraint)
- {
- context = re_string_context_at (&mctx->input, cur_str_idx,
- mctx->eflags);
- if (NOT_SATISFY_NEXT_CONSTRAINT (node->constraint, context))
- continue;
- }
-
- /* 'node' is a backreference.
- Check the substring which the substring matched. */
- bkc_idx = mctx->nbkref_ents;
- err = get_subexp (mctx, node_idx, cur_str_idx);
- if (__glibc_unlikely (err != REG_NOERROR))
- goto free_return;
-
- /* And add the epsilon closures (which is 'new_dest_nodes') of
- the backreference to appropriate state_log. */
- DEBUG_ASSERT (dfa->nexts[node_idx] != -1);
- for (; bkc_idx < mctx->nbkref_ents; ++bkc_idx)
- {
- Idx subexp_len;
- re_dfastate_t *dest_state;
- struct re_backref_cache_entry *bkref_ent;
- bkref_ent = mctx->bkref_ents + bkc_idx;
- if (bkref_ent->node != node_idx || bkref_ent->str_idx != cur_str_idx)
- continue;
- subexp_len = bkref_ent->subexp_to - bkref_ent->subexp_from;
- new_dest_nodes = (subexp_len == 0
- ? dfa->eclosures + dfa->edests[node_idx].elems[0]
- : dfa->eclosures + dfa->nexts[node_idx]);
- dest_str_idx = (cur_str_idx + bkref_ent->subexp_to
- - bkref_ent->subexp_from);
- context = re_string_context_at (&mctx->input, dest_str_idx - 1,
- mctx->eflags);
- dest_state = mctx->state_log[dest_str_idx];
- prev_nelem = ((mctx->state_log[cur_str_idx] == NULL) ? 0
- : mctx->state_log[cur_str_idx]->nodes.nelem);
- /* Add 'new_dest_node' to state_log. */
- if (dest_state == NULL)
- {
- mctx->state_log[dest_str_idx]
- = re_acquire_state_context (&err, dfa, new_dest_nodes,
- context);
- if (__glibc_unlikely (mctx->state_log[dest_str_idx] == NULL
- && err != REG_NOERROR))
- goto free_return;
- }
- else
- {
- re_node_set dest_nodes;
- err = re_node_set_init_union (&dest_nodes,
- dest_state->entrance_nodes,
- new_dest_nodes);
- if (__glibc_unlikely (err != REG_NOERROR))
- {
- re_node_set_free (&dest_nodes);
- goto free_return;
- }
- mctx->state_log[dest_str_idx]
- = re_acquire_state_context (&err, dfa, &dest_nodes, context);
- re_node_set_free (&dest_nodes);
- if (__glibc_unlikely (mctx->state_log[dest_str_idx] == NULL
- && err != REG_NOERROR))
- goto free_return;
- }
- /* We need to check recursively if the backreference can epsilon
- transit. */
- if (subexp_len == 0
- && mctx->state_log[cur_str_idx]->nodes.nelem > prev_nelem)
- {
- err = check_subexp_matching_top (mctx, new_dest_nodes,
- cur_str_idx);
- if (__glibc_unlikely (err != REG_NOERROR))
- goto free_return;
- err = transit_state_bkref (mctx, new_dest_nodes);
- if (__glibc_unlikely (err != REG_NOERROR))
- goto free_return;
- }
- }
- }
- err = REG_NOERROR;
- free_return:
- return err;
-}
-
-/* Enumerate all the candidates which the backreference BKREF_NODE can match
- at BKREF_STR_IDX, and register them by match_ctx_add_entry().
- Note that we might collect inappropriate candidates here.
- However, the cost of checking them strictly here is too high, then we
- delay these checking for prune_impossible_nodes(). */
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-get_subexp (re_match_context_t *mctx, Idx bkref_node, Idx bkref_str_idx)
-{
- const re_dfa_t *const dfa = mctx->dfa;
- Idx subexp_num, sub_top_idx;
- const char *buf = (const char *) re_string_get_buffer (&mctx->input);
- /* Return if we have already checked BKREF_NODE at BKREF_STR_IDX. */
- Idx cache_idx = search_cur_bkref_entry (mctx, bkref_str_idx);
- if (cache_idx != -1)
- {
- const struct re_backref_cache_entry *entry
- = mctx->bkref_ents + cache_idx;
- do
- if (entry->node == bkref_node)
- return REG_NOERROR; /* We already checked it. */
- while (entry++->more);
- }
-
- subexp_num = dfa->nodes[bkref_node].opr.idx;
-
- /* For each sub expression */
- for (sub_top_idx = 0; sub_top_idx < mctx->nsub_tops; ++sub_top_idx)
- {
- reg_errcode_t err;
- re_sub_match_top_t *sub_top = mctx->sub_tops[sub_top_idx];
- re_sub_match_last_t *sub_last;
- Idx sub_last_idx, sl_str, bkref_str_off;
-
- if (dfa->nodes[sub_top->node].opr.idx != subexp_num)
- continue; /* It isn't related. */
-
- sl_str = sub_top->str_idx;
- bkref_str_off = bkref_str_idx;
- /* At first, check the last node of sub expressions we already
- evaluated. */
- for (sub_last_idx = 0; sub_last_idx < sub_top->nlasts; ++sub_last_idx)
- {
- regoff_t sl_str_diff;
- sub_last = sub_top->lasts[sub_last_idx];
- sl_str_diff = sub_last->str_idx - sl_str;
- /* The matched string by the sub expression match with the substring
- at the back reference? */
- if (sl_str_diff > 0)
- {
- if (__glibc_unlikely (bkref_str_off + sl_str_diff
- > mctx->input.valid_len))
- {
- /* Not enough chars for a successful match. */
- if (bkref_str_off + sl_str_diff > mctx->input.len)
- break;
-
- err = clean_state_log_if_needed (mctx,
- bkref_str_off
- + sl_str_diff);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- buf = (const char *) re_string_get_buffer (&mctx->input);
- }
- if (memcmp (buf + bkref_str_off, buf + sl_str, sl_str_diff) != 0)
- /* We don't need to search this sub expression any more. */
- break;
- }
- bkref_str_off += sl_str_diff;
- sl_str += sl_str_diff;
- err = get_subexp_sub (mctx, sub_top, sub_last, bkref_node,
- bkref_str_idx);
-
- /* Reload buf, since the preceding call might have reallocated
- the buffer. */
- buf = (const char *) re_string_get_buffer (&mctx->input);
-
- if (err == REG_NOMATCH)
- continue;
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- }
-
- if (sub_last_idx < sub_top->nlasts)
- continue;
- if (sub_last_idx > 0)
- ++sl_str;
- /* Then, search for the other last nodes of the sub expression. */
- for (; sl_str <= bkref_str_idx; ++sl_str)
- {
- Idx cls_node;
- regoff_t sl_str_off;
- const re_node_set *nodes;
- sl_str_off = sl_str - sub_top->str_idx;
- /* The matched string by the sub expression match with the substring
- at the back reference? */
- if (sl_str_off > 0)
- {
- if (__glibc_unlikely (bkref_str_off >= mctx->input.valid_len))
- {
- /* If we are at the end of the input, we cannot match. */
- if (bkref_str_off >= mctx->input.len)
- break;
-
- err = extend_buffers (mctx, bkref_str_off + 1);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
-
- buf = (const char *) re_string_get_buffer (&mctx->input);
- }
- if (buf [bkref_str_off++] != buf[sl_str - 1])
- break; /* We don't need to search this sub expression
- any more. */
- }
- if (mctx->state_log[sl_str] == NULL)
- continue;
- /* Does this state have a ')' of the sub expression? */
- nodes = &mctx->state_log[sl_str]->nodes;
- cls_node = find_subexp_node (dfa, nodes, subexp_num,
- OP_CLOSE_SUBEXP);
- if (cls_node == -1)
- continue; /* No. */
- if (sub_top->path == NULL)
- {
- sub_top->path = calloc (sizeof (state_array_t),
- sl_str - sub_top->str_idx + 1);
- if (sub_top->path == NULL)
- return REG_ESPACE;
- }
- /* Can the OP_OPEN_SUBEXP node arrive the OP_CLOSE_SUBEXP node
- in the current context? */
- err = check_arrival (mctx, sub_top->path, sub_top->node,
- sub_top->str_idx, cls_node, sl_str,
- OP_CLOSE_SUBEXP);
- if (err == REG_NOMATCH)
- continue;
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- sub_last = match_ctx_add_sublast (sub_top, cls_node, sl_str);
- if (__glibc_unlikely (sub_last == NULL))
- return REG_ESPACE;
- err = get_subexp_sub (mctx, sub_top, sub_last, bkref_node,
- bkref_str_idx);
- buf = (const char *) re_string_get_buffer (&mctx->input);
- if (err == REG_NOMATCH)
- continue;
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- }
- }
- return REG_NOERROR;
-}
-
-/* Helper functions for get_subexp(). */
-
-/* Check SUB_LAST can arrive to the back reference BKREF_NODE at BKREF_STR.
- If it can arrive, register the sub expression expressed with SUB_TOP
- and SUB_LAST. */
-
-static reg_errcode_t
-get_subexp_sub (re_match_context_t *mctx, const re_sub_match_top_t *sub_top,
- re_sub_match_last_t *sub_last, Idx bkref_node, Idx bkref_str)
-{
- reg_errcode_t err;
- Idx to_idx;
- /* Can the subexpression arrive the back reference? */
- err = check_arrival (mctx, &sub_last->path, sub_last->node,
- sub_last->str_idx, bkref_node, bkref_str,
- OP_OPEN_SUBEXP);
- if (err != REG_NOERROR)
- return err;
- err = match_ctx_add_entry (mctx, bkref_node, bkref_str, sub_top->str_idx,
- sub_last->str_idx);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- to_idx = bkref_str + sub_last->str_idx - sub_top->str_idx;
- return clean_state_log_if_needed (mctx, to_idx);
-}
-
-/* Find the first node which is '(' or ')' and whose index is SUBEXP_IDX.
- Search '(' if FL_OPEN, or search ')' otherwise.
- TODO: This function isn't efficient...
- Because there might be more than one nodes whose types are
- OP_OPEN_SUBEXP and whose index is SUBEXP_IDX, we must check all
- nodes.
- E.g. RE: (a){2} */
-
-static Idx
-find_subexp_node (const re_dfa_t *dfa, const re_node_set *nodes,
- Idx subexp_idx, int type)
-{
- Idx cls_idx;
- for (cls_idx = 0; cls_idx < nodes->nelem; ++cls_idx)
- {
- Idx cls_node = nodes->elems[cls_idx];
- const re_token_t *node = dfa->nodes + cls_node;
- if (node->type == type
- && node->opr.idx == subexp_idx)
- return cls_node;
- }
- return -1;
-}
-
-/* Check whether the node TOP_NODE at TOP_STR can arrive to the node
- LAST_NODE at LAST_STR. We record the path onto PATH since it will be
- heavily reused.
- Return REG_NOERROR if it can arrive, REG_NOMATCH if it cannot,
- REG_ESPACE if memory is exhausted. */
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-check_arrival (re_match_context_t *mctx, state_array_t *path, Idx top_node,
- Idx top_str, Idx last_node, Idx last_str, int type)
-{
- const re_dfa_t *const dfa = mctx->dfa;
- reg_errcode_t err = REG_NOERROR;
- Idx subexp_num, backup_cur_idx, str_idx, null_cnt;
- re_dfastate_t *cur_state = NULL;
- re_node_set *cur_nodes, next_nodes;
- re_dfastate_t **backup_state_log;
- unsigned int context;
-
- subexp_num = dfa->nodes[top_node].opr.idx;
- /* Extend the buffer if we need. */
- if (__glibc_unlikely (path->alloc < last_str + mctx->max_mb_elem_len + 1))
- {
- re_dfastate_t **new_array;
- Idx old_alloc = path->alloc;
- Idx incr_alloc = last_str + mctx->max_mb_elem_len + 1;
- Idx new_alloc;
- if (__glibc_unlikely (IDX_MAX - old_alloc < incr_alloc))
- return REG_ESPACE;
- new_alloc = old_alloc + incr_alloc;
- if (__glibc_unlikely (SIZE_MAX / sizeof (re_dfastate_t *) < new_alloc))
- return REG_ESPACE;
- new_array = re_realloc (path->array, re_dfastate_t *, new_alloc);
- if (__glibc_unlikely (new_array == NULL))
- return REG_ESPACE;
- path->array = new_array;
- path->alloc = new_alloc;
- memset (new_array + old_alloc, '\0',
- sizeof (re_dfastate_t *) * (path->alloc - old_alloc));
- }
-
- str_idx = path->next_idx ? path->next_idx : top_str;
-
- /* Temporary modify MCTX. */
- backup_state_log = mctx->state_log;
- backup_cur_idx = mctx->input.cur_idx;
- mctx->state_log = path->array;
- mctx->input.cur_idx = str_idx;
-
- /* Setup initial node set. */
- context = re_string_context_at (&mctx->input, str_idx - 1, mctx->eflags);
- if (str_idx == top_str)
- {
- err = re_node_set_init_1 (&next_nodes, top_node);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- err = check_arrival_expand_ecl (dfa, &next_nodes, subexp_num, type);
- if (__glibc_unlikely (err != REG_NOERROR))
- {
- re_node_set_free (&next_nodes);
- return err;
- }
- }
- else
- {
- cur_state = mctx->state_log[str_idx];
- if (cur_state && cur_state->has_backref)
- {
- err = re_node_set_init_copy (&next_nodes, &cur_state->nodes);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- }
- else
- re_node_set_init_empty (&next_nodes);
- }
- if (str_idx == top_str || (cur_state && cur_state->has_backref))
- {
- if (next_nodes.nelem)
- {
- err = expand_bkref_cache (mctx, &next_nodes, str_idx,
- subexp_num, type);
- if (__glibc_unlikely (err != REG_NOERROR))
- {
- re_node_set_free (&next_nodes);
- return err;
- }
- }
- cur_state = re_acquire_state_context (&err, dfa, &next_nodes, context);
- if (__glibc_unlikely (cur_state == NULL && err != REG_NOERROR))
- {
- re_node_set_free (&next_nodes);
- return err;
- }
- mctx->state_log[str_idx] = cur_state;
- }
-
- for (null_cnt = 0; str_idx < last_str && null_cnt <= mctx->max_mb_elem_len;)
- {
- re_node_set_empty (&next_nodes);
- if (mctx->state_log[str_idx + 1])
- {
- err = re_node_set_merge (&next_nodes,
- &mctx->state_log[str_idx + 1]->nodes);
- if (__glibc_unlikely (err != REG_NOERROR))
- {
- re_node_set_free (&next_nodes);
- return err;
- }
- }
- if (cur_state)
- {
- err = check_arrival_add_next_nodes (mctx, str_idx,
- &cur_state->non_eps_nodes,
- &next_nodes);
- if (__glibc_unlikely (err != REG_NOERROR))
- {
- re_node_set_free (&next_nodes);
- return err;
- }
- }
- ++str_idx;
- if (next_nodes.nelem)
- {
- err = check_arrival_expand_ecl (dfa, &next_nodes, subexp_num, type);
- if (__glibc_unlikely (err != REG_NOERROR))
- {
- re_node_set_free (&next_nodes);
- return err;
- }
- err = expand_bkref_cache (mctx, &next_nodes, str_idx,
- subexp_num, type);
- if (__glibc_unlikely (err != REG_NOERROR))
- {
- re_node_set_free (&next_nodes);
- return err;
- }
- }
- context = re_string_context_at (&mctx->input, str_idx - 1, mctx->eflags);
- cur_state = re_acquire_state_context (&err, dfa, &next_nodes, context);
- if (__glibc_unlikely (cur_state == NULL && err != REG_NOERROR))
- {
- re_node_set_free (&next_nodes);
- return err;
- }
- mctx->state_log[str_idx] = cur_state;
- null_cnt = cur_state == NULL ? null_cnt + 1 : 0;
- }
- re_node_set_free (&next_nodes);
- cur_nodes = (mctx->state_log[last_str] == NULL ? NULL
- : &mctx->state_log[last_str]->nodes);
- path->next_idx = str_idx;
-
- /* Fix MCTX. */
- mctx->state_log = backup_state_log;
- mctx->input.cur_idx = backup_cur_idx;
-
- /* Then check the current node set has the node LAST_NODE. */
- if (cur_nodes != NULL && re_node_set_contains (cur_nodes, last_node))
- return REG_NOERROR;
-
- return REG_NOMATCH;
-}
-
-/* Helper functions for check_arrival. */
-
-/* Calculate the destination nodes of CUR_NODES at STR_IDX, and append them
- to NEXT_NODES.
- TODO: This function is similar to the functions transit_state*(),
- however this function has many additional works.
- Can't we unify them? */
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-check_arrival_add_next_nodes (re_match_context_t *mctx, Idx str_idx,
- re_node_set *cur_nodes, re_node_set *next_nodes)
-{
- const re_dfa_t *const dfa = mctx->dfa;
- bool ok;
- Idx cur_idx;
- reg_errcode_t err = REG_NOERROR;
- re_node_set union_set;
- re_node_set_init_empty (&union_set);
- for (cur_idx = 0; cur_idx < cur_nodes->nelem; ++cur_idx)
- {
- int naccepted = 0;
- Idx cur_node = cur_nodes->elems[cur_idx];
- DEBUG_ASSERT (!IS_EPSILON_NODE (dfa->nodes[cur_node].type));
-
- /* If the node may accept "multi byte". */
- if (dfa->nodes[cur_node].accept_mb)
- {
- naccepted = check_node_accept_bytes (dfa, cur_node, &mctx->input,
- str_idx);
- if (naccepted > 1)
- {
- re_dfastate_t *dest_state;
- Idx next_node = dfa->nexts[cur_node];
- Idx next_idx = str_idx + naccepted;
- dest_state = mctx->state_log[next_idx];
- re_node_set_empty (&union_set);
- if (dest_state)
- {
- err = re_node_set_merge (&union_set, &dest_state->nodes);
- if (__glibc_unlikely (err != REG_NOERROR))
- {
- re_node_set_free (&union_set);
- return err;
- }
- }
- ok = re_node_set_insert (&union_set, next_node);
- if (__glibc_unlikely (! ok))
- {
- re_node_set_free (&union_set);
- return REG_ESPACE;
- }
- mctx->state_log[next_idx] = re_acquire_state (&err, dfa,
- &union_set);
- if (__glibc_unlikely (mctx->state_log[next_idx] == NULL
- && err != REG_NOERROR))
- {
- re_node_set_free (&union_set);
- return err;
- }
- }
- }
-
- if (naccepted
- || check_node_accept (mctx, dfa->nodes + cur_node, str_idx))
- {
- ok = re_node_set_insert (next_nodes, dfa->nexts[cur_node]);
- if (__glibc_unlikely (! ok))
- {
- re_node_set_free (&union_set);
- return REG_ESPACE;
- }
- }
- }
- re_node_set_free (&union_set);
- return REG_NOERROR;
-}
-
-/* For all the nodes in CUR_NODES, add the epsilon closures of them to
- CUR_NODES, however exclude the nodes which are:
- - inside the sub expression whose number is EX_SUBEXP, if FL_OPEN.
- - out of the sub expression whose number is EX_SUBEXP, if !FL_OPEN.
-*/
-
-static reg_errcode_t
-check_arrival_expand_ecl (const re_dfa_t *dfa, re_node_set *cur_nodes,
- Idx ex_subexp, int type)
-{
- reg_errcode_t err;
- Idx idx, outside_node;
- re_node_set new_nodes;
- DEBUG_ASSERT (cur_nodes->nelem);
- err = re_node_set_alloc (&new_nodes, cur_nodes->nelem);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- /* Create a new node set NEW_NODES with the nodes which are epsilon
- closures of the node in CUR_NODES. */
-
- for (idx = 0; idx < cur_nodes->nelem; ++idx)
- {
- Idx cur_node = cur_nodes->elems[idx];
- const re_node_set *eclosure = dfa->eclosures + cur_node;
- outside_node = find_subexp_node (dfa, eclosure, ex_subexp, type);
- if (outside_node == -1)
- {
- /* There are no problematic nodes, just merge them. */
- err = re_node_set_merge (&new_nodes, eclosure);
- if (__glibc_unlikely (err != REG_NOERROR))
- {
- re_node_set_free (&new_nodes);
- return err;
- }
- }
- else
- {
- /* There are problematic nodes, re-calculate incrementally. */
- err = check_arrival_expand_ecl_sub (dfa, &new_nodes, cur_node,
- ex_subexp, type);
- if (__glibc_unlikely (err != REG_NOERROR))
- {
- re_node_set_free (&new_nodes);
- return err;
- }
- }
- }
- re_node_set_free (cur_nodes);
- *cur_nodes = new_nodes;
- return REG_NOERROR;
-}
-
-/* Helper function for check_arrival_expand_ecl.
- Check incrementally the epsilon closure of TARGET, and if it isn't
- problematic append it to DST_NODES. */
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-check_arrival_expand_ecl_sub (const re_dfa_t *dfa, re_node_set *dst_nodes,
- Idx target, Idx ex_subexp, int type)
-{
- Idx cur_node;
- for (cur_node = target; !re_node_set_contains (dst_nodes, cur_node);)
- {
- bool ok;
-
- if (dfa->nodes[cur_node].type == type
- && dfa->nodes[cur_node].opr.idx == ex_subexp)
- {
- if (type == OP_CLOSE_SUBEXP)
- {
- ok = re_node_set_insert (dst_nodes, cur_node);
- if (__glibc_unlikely (! ok))
- return REG_ESPACE;
- }
- break;
- }
- ok = re_node_set_insert (dst_nodes, cur_node);
- if (__glibc_unlikely (! ok))
- return REG_ESPACE;
- if (dfa->edests[cur_node].nelem == 0)
- break;
- if (dfa->edests[cur_node].nelem == 2)
- {
- reg_errcode_t err;
- err = check_arrival_expand_ecl_sub (dfa, dst_nodes,
- dfa->edests[cur_node].elems[1],
- ex_subexp, type);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- }
- cur_node = dfa->edests[cur_node].elems[0];
- }
- return REG_NOERROR;
-}
-
-
-/* For all the back references in the current state, calculate the
- destination of the back references by the appropriate entry
- in MCTX->BKREF_ENTS. */
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-expand_bkref_cache (re_match_context_t *mctx, re_node_set *cur_nodes,
- Idx cur_str, Idx subexp_num, int type)
-{
- const re_dfa_t *const dfa = mctx->dfa;
- reg_errcode_t err;
- Idx cache_idx_start = search_cur_bkref_entry (mctx, cur_str);
- struct re_backref_cache_entry *ent;
-
- if (cache_idx_start == -1)
- return REG_NOERROR;
-
- restart:
- ent = mctx->bkref_ents + cache_idx_start;
- do
- {
- Idx to_idx, next_node;
-
- /* Is this entry ENT is appropriate? */
- if (!re_node_set_contains (cur_nodes, ent->node))
- continue; /* No. */
-
- to_idx = cur_str + ent->subexp_to - ent->subexp_from;
- /* Calculate the destination of the back reference, and append it
- to MCTX->STATE_LOG. */
- if (to_idx == cur_str)
- {
- /* The backreference did epsilon transit, we must re-check all the
- node in the current state. */
- re_node_set new_dests;
- reg_errcode_t err2, err3;
- next_node = dfa->edests[ent->node].elems[0];
- if (re_node_set_contains (cur_nodes, next_node))
- continue;
- err = re_node_set_init_1 (&new_dests, next_node);
- err2 = check_arrival_expand_ecl (dfa, &new_dests, subexp_num, type);
- err3 = re_node_set_merge (cur_nodes, &new_dests);
- re_node_set_free (&new_dests);
- if (__glibc_unlikely (err != REG_NOERROR || err2 != REG_NOERROR
- || err3 != REG_NOERROR))
- {
- err = (err != REG_NOERROR ? err
- : (err2 != REG_NOERROR ? err2 : err3));
- return err;
- }
- /* TODO: It is still inefficient... */
- goto restart;
- }
- else
- {
- re_node_set union_set;
- next_node = dfa->nexts[ent->node];
- if (mctx->state_log[to_idx])
- {
- bool ok;
- if (re_node_set_contains (&mctx->state_log[to_idx]->nodes,
- next_node))
- continue;
- err = re_node_set_init_copy (&union_set,
- &mctx->state_log[to_idx]->nodes);
- ok = re_node_set_insert (&union_set, next_node);
- if (__glibc_unlikely (err != REG_NOERROR || ! ok))
- {
- re_node_set_free (&union_set);
- err = err != REG_NOERROR ? err : REG_ESPACE;
- return err;
- }
- }
- else
- {
- err = re_node_set_init_1 (&union_set, next_node);
- if (__glibc_unlikely (err != REG_NOERROR))
- return err;
- }
- mctx->state_log[to_idx] = re_acquire_state (&err, dfa, &union_set);
- re_node_set_free (&union_set);
- if (__glibc_unlikely (mctx->state_log[to_idx] == NULL
- && err != REG_NOERROR))
- return err;
- }
- }
- while (ent++->more);
- return REG_NOERROR;
-}
-
-/* Build transition table for the state.
- Return true if successful. */
-
-static bool __attribute_noinline__
-build_trtable (const re_dfa_t *dfa, re_dfastate_t *state)
-{
- reg_errcode_t err;
- Idx i, j;
- int ch;
- bool need_word_trtable = false;
- bitset_word_t elem, mask;
- Idx ndests; /* Number of the destination states from 'state'. */
- re_dfastate_t **trtable;
- re_dfastate_t *dest_states[SBC_MAX];
- re_dfastate_t *dest_states_word[SBC_MAX];
- re_dfastate_t *dest_states_nl[SBC_MAX];
- re_node_set follows;
- bitset_t acceptable;
-
- /* We build DFA states which corresponds to the destination nodes
- from 'state'. 'dests_node[i]' represents the nodes which i-th
- destination state contains, and 'dests_ch[i]' represents the
- characters which i-th destination state accepts. */
- re_node_set dests_node[SBC_MAX];
- bitset_t dests_ch[SBC_MAX];
-
- /* Initialize transition table. */
- state->word_trtable = state->trtable = NULL;
-
- /* At first, group all nodes belonging to 'state' into several
- destinations. */
- ndests = group_nodes_into_DFAstates (dfa, state, dests_node, dests_ch);
- if (__glibc_unlikely (ndests <= 0))
- {
- /* Return false in case of an error, true otherwise. */
- if (ndests == 0)
- {
- state->trtable = (re_dfastate_t **)
- calloc (sizeof (re_dfastate_t *), SBC_MAX);
- if (__glibc_unlikely (state->trtable == NULL))
- return false;
- return true;
- }
- return false;
- }
-
- err = re_node_set_alloc (&follows, ndests + 1);
- if (__glibc_unlikely (err != REG_NOERROR))
- {
- out_free:
- re_node_set_free (&follows);
- for (i = 0; i < ndests; ++i)
- re_node_set_free (dests_node + i);
- return false;
- }
-
- bitset_empty (acceptable);
-
- /* Then build the states for all destinations. */
- for (i = 0; i < ndests; ++i)
- {
- Idx next_node;
- re_node_set_empty (&follows);
- /* Merge the follows of this destination states. */
- for (j = 0; j < dests_node[i].nelem; ++j)
- {
- next_node = dfa->nexts[dests_node[i].elems[j]];
- if (next_node != -1)
- {
- err = re_node_set_merge (&follows, dfa->eclosures + next_node);
- if (__glibc_unlikely (err != REG_NOERROR))
- goto out_free;
- }
- }
- dest_states[i] = re_acquire_state_context (&err, dfa, &follows, 0);
- if (__glibc_unlikely (dest_states[i] == NULL && err != REG_NOERROR))
- goto out_free;
- /* If the new state has context constraint,
- build appropriate states for these contexts. */
- if (dest_states[i]->has_constraint)
- {
- dest_states_word[i] = re_acquire_state_context (&err, dfa, &follows,
- CONTEXT_WORD);
- if (__glibc_unlikely (dest_states_word[i] == NULL
- && err != REG_NOERROR))
- goto out_free;
-
- if (dest_states[i] != dest_states_word[i] && dfa->mb_cur_max > 1)
- need_word_trtable = true;
-
- dest_states_nl[i] = re_acquire_state_context (&err, dfa, &follows,
- CONTEXT_NEWLINE);
- if (__glibc_unlikely (dest_states_nl[i] == NULL && err != REG_NOERROR))
- goto out_free;
- }
- else
- {
- dest_states_word[i] = dest_states[i];
- dest_states_nl[i] = dest_states[i];
- }
- bitset_merge (acceptable, dests_ch[i]);
- }
-
- if (!__glibc_unlikely (need_word_trtable))
- {
- /* We don't care about whether the following character is a word
- character, or we are in a single-byte character set so we can
- discern by looking at the character code: allocate a
- 256-entry transition table. */
- trtable = state->trtable =
- (re_dfastate_t **) calloc (sizeof (re_dfastate_t *), SBC_MAX);
- if (__glibc_unlikely (trtable == NULL))
- goto out_free;
-
- /* For all characters ch...: */
- for (i = 0; i < BITSET_WORDS; ++i)
- for (ch = i * BITSET_WORD_BITS, elem = acceptable[i], mask = 1;
- elem;
- mask <<= 1, elem >>= 1, ++ch)
- if (__glibc_unlikely (elem & 1))
- {
- /* There must be exactly one destination which accepts
- character ch. See group_nodes_into_DFAstates. */
- for (j = 0; (dests_ch[j][i] & mask) == 0; ++j)
- ;
-
- /* j-th destination accepts the word character ch. */
- if (dfa->word_char[i] & mask)
- trtable[ch] = dest_states_word[j];
- else
- trtable[ch] = dest_states[j];
- }
- }
- else
- {
- /* We care about whether the following character is a word
- character, and we are in a multi-byte character set: discern
- by looking at the character code: build two 256-entry
- transition tables, one starting at trtable[0] and one
- starting at trtable[SBC_MAX]. */
- trtable = state->word_trtable =
- (re_dfastate_t **) calloc (sizeof (re_dfastate_t *), 2 * SBC_MAX);
- if (__glibc_unlikely (trtable == NULL))
- goto out_free;
-
- /* For all characters ch...: */
- for (i = 0; i < BITSET_WORDS; ++i)
- for (ch = i * BITSET_WORD_BITS, elem = acceptable[i], mask = 1;
- elem;
- mask <<= 1, elem >>= 1, ++ch)
- if (__glibc_unlikely (elem & 1))
- {
- /* There must be exactly one destination which accepts
- character ch. See group_nodes_into_DFAstates. */
- for (j = 0; (dests_ch[j][i] & mask) == 0; ++j)
- ;
-
- /* j-th destination accepts the word character ch. */
- trtable[ch] = dest_states[j];
- trtable[ch + SBC_MAX] = dest_states_word[j];
- }
- }
-
- /* new line */
- if (bitset_contain (acceptable, NEWLINE_CHAR))
- {
- /* The current state accepts newline character. */
- for (j = 0; j < ndests; ++j)
- if (bitset_contain (dests_ch[j], NEWLINE_CHAR))
- {
- /* k-th destination accepts newline character. */
- trtable[NEWLINE_CHAR] = dest_states_nl[j];
- if (need_word_trtable)
- trtable[NEWLINE_CHAR + SBC_MAX] = dest_states_nl[j];
- /* There must be only one destination which accepts
- newline. See group_nodes_into_DFAstates. */
- break;
- }
- }
-
- re_node_set_free (&follows);
- for (i = 0; i < ndests; ++i)
- re_node_set_free (dests_node + i);
- return true;
-}
-
-/* Group all nodes belonging to STATE into several destinations.
- Then for all destinations, set the nodes belonging to the destination
- to DESTS_NODE[i] and set the characters accepted by the destination
- to DEST_CH[i]. Return the number of destinations if successful,
- -1 on internal error. */
-
-static Idx
-group_nodes_into_DFAstates (const re_dfa_t *dfa, const re_dfastate_t *state,
- re_node_set *dests_node, bitset_t *dests_ch)
-{
- reg_errcode_t err;
- bool ok;
- Idx i, j, k;
- Idx ndests; /* Number of the destinations from 'state'. */
- bitset_t accepts; /* Characters a node can accept. */
- const re_node_set *cur_nodes = &state->nodes;
- bitset_empty (accepts);
- ndests = 0;
-
- /* For all the nodes belonging to 'state', */
- for (i = 0; i < cur_nodes->nelem; ++i)
- {
- re_token_t *node = &dfa->nodes[cur_nodes->elems[i]];
- re_token_type_t type = node->type;
- unsigned int constraint = node->constraint;
-
- /* Enumerate all single byte character this node can accept. */
- if (type == CHARACTER)
- bitset_set (accepts, node->opr.c);
- else if (type == SIMPLE_BRACKET)
- {
- bitset_merge (accepts, node->opr.sbcset);
- }
- else if (type == OP_PERIOD)
- {
- if (dfa->mb_cur_max > 1)
- bitset_merge (accepts, dfa->sb_char);
- else
- bitset_set_all (accepts);
- if (!(dfa->syntax & RE_DOT_NEWLINE))
- bitset_clear (accepts, '\n');
- if (dfa->syntax & RE_DOT_NOT_NULL)
- bitset_clear (accepts, '\0');
- }
- else if (type == OP_UTF8_PERIOD)
- {
- if (ASCII_CHARS % BITSET_WORD_BITS == 0)
- memset (accepts, -1, ASCII_CHARS / CHAR_BIT);
- else
- bitset_merge (accepts, utf8_sb_map);
- if (!(dfa->syntax & RE_DOT_NEWLINE))
- bitset_clear (accepts, '\n');
- if (dfa->syntax & RE_DOT_NOT_NULL)
- bitset_clear (accepts, '\0');
- }
- else
- continue;
-
- /* Check the 'accepts' and sift the characters which are not
- match it the context. */
- if (constraint)
- {
- if (constraint & NEXT_NEWLINE_CONSTRAINT)
- {
- bool accepts_newline = bitset_contain (accepts, NEWLINE_CHAR);
- bitset_empty (accepts);
- if (accepts_newline)
- bitset_set (accepts, NEWLINE_CHAR);
- else
- continue;
- }
- if (constraint & NEXT_ENDBUF_CONSTRAINT)
- {
- bitset_empty (accepts);
- continue;
- }
-
- if (constraint & NEXT_WORD_CONSTRAINT)
- {
- bitset_word_t any_set = 0;
- if (type == CHARACTER && !node->word_char)
- {
- bitset_empty (accepts);
- continue;
- }
- if (dfa->mb_cur_max > 1)
- for (j = 0; j < BITSET_WORDS; ++j)
- any_set |= (accepts[j] &= (dfa->word_char[j] | ~dfa->sb_char[j]));
- else
- for (j = 0; j < BITSET_WORDS; ++j)
- any_set |= (accepts[j] &= dfa->word_char[j]);
- if (!any_set)
- continue;
- }
- if (constraint & NEXT_NOTWORD_CONSTRAINT)
- {
- bitset_word_t any_set = 0;
- if (type == CHARACTER && node->word_char)
- {
- bitset_empty (accepts);
- continue;
- }
- if (dfa->mb_cur_max > 1)
- for (j = 0; j < BITSET_WORDS; ++j)
- any_set |= (accepts[j] &= ~(dfa->word_char[j] & dfa->sb_char[j]));
- else
- for (j = 0; j < BITSET_WORDS; ++j)
- any_set |= (accepts[j] &= ~dfa->word_char[j]);
- if (!any_set)
- continue;
- }
- }
-
- /* Then divide 'accepts' into DFA states, or create a new
- state. Above, we make sure that accepts is not empty. */
- for (j = 0; j < ndests; ++j)
- {
- bitset_t intersec; /* Intersection sets, see below. */
- bitset_t remains;
- /* Flags, see below. */
- bitset_word_t has_intersec, not_subset, not_consumed;
-
- /* Optimization, skip if this state doesn't accept the character. */
- if (type == CHARACTER && !bitset_contain (dests_ch[j], node->opr.c))
- continue;
-
- /* Enumerate the intersection set of this state and 'accepts'. */
- has_intersec = 0;
- for (k = 0; k < BITSET_WORDS; ++k)
- has_intersec |= intersec[k] = accepts[k] & dests_ch[j][k];
- /* And skip if the intersection set is empty. */
- if (!has_intersec)
- continue;
-
- /* Then check if this state is a subset of 'accepts'. */
- not_subset = not_consumed = 0;
- for (k = 0; k < BITSET_WORDS; ++k)
- {
- not_subset |= remains[k] = ~accepts[k] & dests_ch[j][k];
- not_consumed |= accepts[k] = accepts[k] & ~dests_ch[j][k];
- }
-
- /* If this state isn't a subset of 'accepts', create a
- new group state, which has the 'remains'. */
- if (not_subset)
- {
- bitset_copy (dests_ch[ndests], remains);
- bitset_copy (dests_ch[j], intersec);
- err = re_node_set_init_copy (dests_node + ndests, &dests_node[j]);
- if (__glibc_unlikely (err != REG_NOERROR))
- goto error_return;
- ++ndests;
- }
-
- /* Put the position in the current group. */
- ok = re_node_set_insert (&dests_node[j], cur_nodes->elems[i]);
- if (__glibc_unlikely (! ok))
- goto error_return;
-
- /* If all characters are consumed, go to next node. */
- if (!not_consumed)
- break;
- }
- /* Some characters remain, create a new group. */
- if (j == ndests)
- {
- bitset_copy (dests_ch[ndests], accepts);
- err = re_node_set_init_1 (dests_node + ndests, cur_nodes->elems[i]);
- if (__glibc_unlikely (err != REG_NOERROR))
- goto error_return;
- ++ndests;
- bitset_empty (accepts);
- }
- }
- assume (ndests <= SBC_MAX);
- return ndests;
- error_return:
- for (j = 0; j < ndests; ++j)
- re_node_set_free (dests_node + j);
- return -1;
-}
-
-/* Check how many bytes the node 'dfa->nodes[node_idx]' accepts.
- Return the number of the bytes the node accepts.
- STR_IDX is the current index of the input string.
-
- This function handles the nodes which can accept one character, or
- one collating element like '.', '[a-z]', opposite to the other nodes
- can only accept one byte. */
-
-#ifdef _LIBC
-# include <locale/weight.h>
-#endif
-
-static int
-check_node_accept_bytes (const re_dfa_t *dfa, Idx node_idx,
- const re_string_t *input, Idx str_idx)
-{
- const re_token_t *node = dfa->nodes + node_idx;
- int char_len, elem_len;
- Idx i;
-
- if (__glibc_unlikely (node->type == OP_UTF8_PERIOD))
- {
- unsigned char c = re_string_byte_at (input, str_idx), d;
- if (__glibc_likely (c < 0xc2))
- return 0;
-
- if (str_idx + 2 > input->len)
- return 0;
-
- d = re_string_byte_at (input, str_idx + 1);
- if (c < 0xe0)
- return (d < 0x80 || d > 0xbf) ? 0 : 2;
- else if (c < 0xf0)
- {
- char_len = 3;
- if (c == 0xe0 && d < 0xa0)
- return 0;
- }
- else if (c < 0xf8)
- {
- char_len = 4;
- if (c == 0xf0 && d < 0x90)
- return 0;
- }
- else if (c < 0xfc)
- {
- char_len = 5;
- if (c == 0xf8 && d < 0x88)
- return 0;
- }
- else if (c < 0xfe)
- {
- char_len = 6;
- if (c == 0xfc && d < 0x84)
- return 0;
- }
- else
- return 0;
-
- if (str_idx + char_len > input->len)
- return 0;
-
- for (i = 1; i < char_len; ++i)
- {
- d = re_string_byte_at (input, str_idx + i);
- if (d < 0x80 || d > 0xbf)
- return 0;
- }
- return char_len;
- }
-
- char_len = re_string_char_size_at (input, str_idx);
- if (node->type == OP_PERIOD)
- {
- if (char_len <= 1)
- return 0;
- /* FIXME: I don't think this if is needed, as both '\n'
- and '\0' are char_len == 1. */
- /* '.' accepts any one character except the following two cases. */
- if ((!(dfa->syntax & RE_DOT_NEWLINE)
- && re_string_byte_at (input, str_idx) == '\n')
- || ((dfa->syntax & RE_DOT_NOT_NULL)
- && re_string_byte_at (input, str_idx) == '\0'))
- return 0;
- return char_len;
- }
-
- elem_len = re_string_elem_size_at (input, str_idx);
- if ((elem_len <= 1 && char_len <= 1) || char_len == 0)
- return 0;
-
- if (node->type == COMPLEX_BRACKET)
- {
- const re_charset_t *cset = node->opr.mbcset;
-#ifdef _LIBC
- const unsigned char *pin
- = ((const unsigned char *) re_string_get_buffer (input) + str_idx);
- Idx j;
- uint32_t nrules;
-#endif
- int match_len = 0;
- wchar_t wc = ((cset->nranges || cset->nchar_classes || cset->nmbchars)
- ? re_string_wchar_at (input, str_idx) : 0);
-
- /* match with multibyte character? */
- for (i = 0; i < cset->nmbchars; ++i)
- if (wc == cset->mbchars[i])
- {
- match_len = char_len;
- goto check_node_accept_bytes_match;
- }
- /* match with character_class? */
- for (i = 0; i < cset->nchar_classes; ++i)
- {
- wctype_t wt = cset->char_classes[i];
- if (__iswctype (wc, wt))
- {
- match_len = char_len;
- goto check_node_accept_bytes_match;
- }
- }
-
-#ifdef _LIBC
- nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
- if (nrules != 0)
- {
- unsigned int in_collseq = 0;
- const int32_t *table, *indirect;
- const unsigned char *weights, *extra;
- const char *collseqwc;
-
- /* match with collating_symbol? */
- if (cset->ncoll_syms)
- extra = (const unsigned char *)
- _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB);
- for (i = 0; i < cset->ncoll_syms; ++i)
- {
- const unsigned char *coll_sym = extra + cset->coll_syms[i];
- /* Compare the length of input collating element and
- the length of current collating element. */
- if (*coll_sym != elem_len)
- continue;
- /* Compare each bytes. */
- for (j = 0; j < *coll_sym; j++)
- if (pin[j] != coll_sym[1 + j])
- break;
- if (j == *coll_sym)
- {
- /* Match if every bytes is equal. */
- match_len = j;
- goto check_node_accept_bytes_match;
- }
- }
-
- if (cset->nranges)
- {
- if (elem_len <= char_len)
- {
- collseqwc = _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQWC);
- in_collseq = __collseq_table_lookup (collseqwc, wc);
- }
- else
- in_collseq = find_collation_sequence_value (pin, elem_len);
- }
- /* match with range expression? */
- /* FIXME: Implement rational ranges here, too. */
- for (i = 0; i < cset->nranges; ++i)
- if (cset->range_starts[i] <= in_collseq
- && in_collseq <= cset->range_ends[i])
- {
- match_len = elem_len;
- goto check_node_accept_bytes_match;
- }
-
- /* match with equivalence_class? */
- if (cset->nequiv_classes)
- {
- const unsigned char *cp = pin;
- table = (const int32_t *)
- _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
- weights = (const unsigned char *)
- _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTMB);
- extra = (const unsigned char *)
- _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
- indirect = (const int32_t *)
- _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB);
- int32_t idx = findidx (table, indirect, extra, &cp, elem_len);
- int32_t rule = idx >> 24;
- idx &= 0xffffff;
- if (idx > 0)
- {
- size_t weight_len = weights[idx];
- for (i = 0; i < cset->nequiv_classes; ++i)
- {
- int32_t equiv_class_idx = cset->equiv_classes[i];
- int32_t equiv_class_rule = equiv_class_idx >> 24;
- equiv_class_idx &= 0xffffff;
- if (weights[equiv_class_idx] == weight_len
- && equiv_class_rule == rule
- && memcmp (weights + idx + 1,
- weights + equiv_class_idx + 1,
- weight_len) == 0)
- {
- match_len = elem_len;
- goto check_node_accept_bytes_match;
- }
- }
- }
- }
- }
- else
-#endif /* _LIBC */
- {
- /* match with range expression? */
- for (i = 0; i < cset->nranges; ++i)
- {
- if (cset->range_starts[i] <= wc && wc <= cset->range_ends[i])
- {
- match_len = char_len;
- goto check_node_accept_bytes_match;
- }
- }
- }
- check_node_accept_bytes_match:
- if (!cset->non_match)
- return match_len;
- else
- {
- if (match_len > 0)
- return 0;
- else
- return (elem_len > char_len) ? elem_len : char_len;
- }
- }
- return 0;
-}
-
-#ifdef _LIBC
-static unsigned int
-find_collation_sequence_value (const unsigned char *mbs, size_t mbs_len)
-{
- uint32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
- if (nrules == 0)
- {
- if (mbs_len == 1)
- {
- /* No valid character. Match it as a single byte character. */
- const unsigned char *collseq = (const unsigned char *)
- _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQMB);
- return collseq[mbs[0]];
- }
- return UINT_MAX;
- }
- else
- {
- int32_t idx;
- const unsigned char *extra = (const unsigned char *)
- _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB);
- int32_t extrasize = (const unsigned char *)
- _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB + 1) - extra;
-
- for (idx = 0; idx < extrasize;)
- {
- int mbs_cnt;
- bool found = false;
- int32_t elem_mbs_len;
- /* Skip the name of collating element name. */
- idx = idx + extra[idx] + 1;
- elem_mbs_len = extra[idx++];
- if (mbs_len == elem_mbs_len)
- {
- for (mbs_cnt = 0; mbs_cnt < elem_mbs_len; ++mbs_cnt)
- if (extra[idx + mbs_cnt] != mbs[mbs_cnt])
- break;
- if (mbs_cnt == elem_mbs_len)
- /* Found the entry. */
- found = true;
- }
- /* Skip the byte sequence of the collating element. */
- idx += elem_mbs_len;
- /* Adjust for the alignment. */
- idx = (idx + 3) & ~3;
- /* Skip the collation sequence value. */
- idx += sizeof (uint32_t);
- /* Skip the wide char sequence of the collating element. */
- idx = idx + sizeof (uint32_t) * (*(int32_t *) (extra + idx) + 1);
- /* If we found the entry, return the sequence value. */
- if (found)
- return *(uint32_t *) (extra + idx);
- /* Skip the collation sequence value. */
- idx += sizeof (uint32_t);
- }
- return UINT_MAX;
- }
-}
-#endif /* _LIBC */
-
-/* Check whether the node accepts the byte which is IDX-th
- byte of the INPUT. */
-
-static bool
-check_node_accept (const re_match_context_t *mctx, const re_token_t *node,
- Idx idx)
-{
- unsigned char ch;
- ch = re_string_byte_at (&mctx->input, idx);
- switch (node->type)
- {
- case CHARACTER:
- if (node->opr.c != ch)
- return false;
- break;
-
- case SIMPLE_BRACKET:
- if (!bitset_contain (node->opr.sbcset, ch))
- return false;
- break;
-
- case OP_UTF8_PERIOD:
- if (ch >= ASCII_CHARS)
- return false;
- FALLTHROUGH;
- case OP_PERIOD:
- if ((ch == '\n' && !(mctx->dfa->syntax & RE_DOT_NEWLINE))
- || (ch == '\0' && (mctx->dfa->syntax & RE_DOT_NOT_NULL)))
- return false;
- break;
-
- default:
- return false;
- }
-
- if (node->constraint)
- {
- /* The node has constraints. Check whether the current context
- satisfies the constraints. */
- unsigned int context = re_string_context_at (&mctx->input, idx,
- mctx->eflags);
- if (NOT_SATISFY_NEXT_CONSTRAINT (node->constraint, context))
- return false;
- }
-
- return true;
-}
-
-/* Extend the buffers, if the buffers have run out. */
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-extend_buffers (re_match_context_t *mctx, int min_len)
-{
- reg_errcode_t ret;
- re_string_t *pstr = &mctx->input;
-
- /* Avoid overflow. */
- if (__glibc_unlikely (MIN (IDX_MAX, SIZE_MAX / sizeof (re_dfastate_t *)) / 2
- <= pstr->bufs_len))
- return REG_ESPACE;
-
- /* Double the lengths of the buffers, but allocate at least MIN_LEN. */
- ret = re_string_realloc_buffers (pstr,
- MAX (min_len,
- MIN (pstr->len, pstr->bufs_len * 2)));
- if (__glibc_unlikely (ret != REG_NOERROR))
- return ret;
-
- if (mctx->state_log != NULL)
- {
- /* And double the length of state_log. */
- /* XXX We have no indication of the size of this buffer. If this
- allocation fail we have no indication that the state_log array
- does not have the right size. */
- re_dfastate_t **new_array = re_realloc (mctx->state_log, re_dfastate_t *,
- pstr->bufs_len + 1);
- if (__glibc_unlikely (new_array == NULL))
- return REG_ESPACE;
- mctx->state_log = new_array;
- }
-
- /* Then reconstruct the buffers. */
- if (pstr->icase)
- {
- if (pstr->mb_cur_max > 1)
- {
- ret = build_wcs_upper_buffer (pstr);
- if (__glibc_unlikely (ret != REG_NOERROR))
- return ret;
- }
- else
- build_upper_buffer (pstr);
- }
- else
- {
- if (pstr->mb_cur_max > 1)
- build_wcs_buffer (pstr);
- else
- {
- if (pstr->trans != NULL)
- re_string_translate_buffer (pstr);
- }
- }
- return REG_NOERROR;
-}
-
-
-/* Functions for matching context. */
-
-/* Initialize MCTX. */
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-match_ctx_init (re_match_context_t *mctx, int eflags, Idx n)
-{
- mctx->eflags = eflags;
- mctx->match_last = -1;
- if (n > 0)
- {
- /* Avoid overflow. */
- size_t max_object_size =
- MAX (sizeof (struct re_backref_cache_entry),
- sizeof (re_sub_match_top_t *));
- if (__glibc_unlikely (MIN (IDX_MAX, SIZE_MAX / max_object_size) < n))
- return REG_ESPACE;
-
- mctx->bkref_ents = re_malloc (struct re_backref_cache_entry, n);
- mctx->sub_tops = re_malloc (re_sub_match_top_t *, n);
- if (__glibc_unlikely (mctx->bkref_ents == NULL || mctx->sub_tops == NULL))
- return REG_ESPACE;
- }
- /* Already zero-ed by the caller.
- else
- mctx->bkref_ents = NULL;
- mctx->nbkref_ents = 0;
- mctx->nsub_tops = 0; */
- mctx->abkref_ents = n;
- mctx->max_mb_elem_len = 1;
- mctx->asub_tops = n;
- return REG_NOERROR;
-}
-
-/* Clean the entries which depend on the current input in MCTX.
- This function must be invoked when the matcher changes the start index
- of the input, or changes the input string. */
-
-static void
-match_ctx_clean (re_match_context_t *mctx)
-{
- Idx st_idx;
- for (st_idx = 0; st_idx < mctx->nsub_tops; ++st_idx)
- {
- Idx sl_idx;
- re_sub_match_top_t *top = mctx->sub_tops[st_idx];
- for (sl_idx = 0; sl_idx < top->nlasts; ++sl_idx)
- {
- re_sub_match_last_t *last = top->lasts[sl_idx];
- re_free (last->path.array);
- re_free (last);
- }
- re_free (top->lasts);
- if (top->path)
- {
- re_free (top->path->array);
- re_free (top->path);
- }
- re_free (top);
- }
-
- mctx->nsub_tops = 0;
- mctx->nbkref_ents = 0;
-}
-
-/* Free all the memory associated with MCTX. */
-
-static void
-match_ctx_free (re_match_context_t *mctx)
-{
- /* First, free all the memory associated with MCTX->SUB_TOPS. */
- match_ctx_clean (mctx);
- re_free (mctx->sub_tops);
- re_free (mctx->bkref_ents);
-}
-
-/* Add a new backreference entry to MCTX.
- Note that we assume that caller never call this function with duplicate
- entry, and call with STR_IDX which isn't smaller than any existing entry.
-*/
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-match_ctx_add_entry (re_match_context_t *mctx, Idx node, Idx str_idx, Idx from,
- Idx to)
-{
- if (mctx->nbkref_ents >= mctx->abkref_ents)
- {
- struct re_backref_cache_entry* new_entry;
- new_entry = re_realloc (mctx->bkref_ents, struct re_backref_cache_entry,
- mctx->abkref_ents * 2);
- if (__glibc_unlikely (new_entry == NULL))
- {
- re_free (mctx->bkref_ents);
- return REG_ESPACE;
- }
- mctx->bkref_ents = new_entry;
- memset (mctx->bkref_ents + mctx->nbkref_ents, '\0',
- sizeof (struct re_backref_cache_entry) * mctx->abkref_ents);
- mctx->abkref_ents *= 2;
- }
- if (mctx->nbkref_ents > 0
- && mctx->bkref_ents[mctx->nbkref_ents - 1].str_idx == str_idx)
- mctx->bkref_ents[mctx->nbkref_ents - 1].more = 1;
-
- mctx->bkref_ents[mctx->nbkref_ents].node = node;
- mctx->bkref_ents[mctx->nbkref_ents].str_idx = str_idx;
- mctx->bkref_ents[mctx->nbkref_ents].subexp_from = from;
- mctx->bkref_ents[mctx->nbkref_ents].subexp_to = to;
-
- /* This is a cache that saves negative results of check_dst_limits_calc_pos.
- If bit N is clear, means that this entry won't epsilon-transition to
- an OP_OPEN_SUBEXP or OP_CLOSE_SUBEXP for the N+1-th subexpression. If
- it is set, check_dst_limits_calc_pos_1 will recurse and try to find one
- such node.
-
- A backreference does not epsilon-transition unless it is empty, so set
- to all zeros if FROM != TO. */
- mctx->bkref_ents[mctx->nbkref_ents].eps_reachable_subexps_map
- = (from == to ? -1 : 0);
-
- mctx->bkref_ents[mctx->nbkref_ents++].more = 0;
- if (mctx->max_mb_elem_len < to - from)
- mctx->max_mb_elem_len = to - from;
- return REG_NOERROR;
-}
-
-/* Return the first entry with the same str_idx, or -1 if none is
- found. Note that MCTX->BKREF_ENTS is already sorted by MCTX->STR_IDX. */
-
-static Idx
-search_cur_bkref_entry (const re_match_context_t *mctx, Idx str_idx)
-{
- Idx left, right, mid, last;
- last = right = mctx->nbkref_ents;
- for (left = 0; left < right;)
- {
- mid = (left + right) / 2;
- if (mctx->bkref_ents[mid].str_idx < str_idx)
- left = mid + 1;
- else
- right = mid;
- }
- if (left < last && mctx->bkref_ents[left].str_idx == str_idx)
- return left;
- else
- return -1;
-}
-
-/* Register the node NODE, whose type is OP_OPEN_SUBEXP, and which matches
- at STR_IDX. */
-
-static reg_errcode_t
-__attribute_warn_unused_result__
-match_ctx_add_subtop (re_match_context_t *mctx, Idx node, Idx str_idx)
-{
- DEBUG_ASSERT (mctx->sub_tops != NULL);
- DEBUG_ASSERT (mctx->asub_tops > 0);
- if (__glibc_unlikely (mctx->nsub_tops == mctx->asub_tops))
- {
- Idx new_asub_tops = mctx->asub_tops * 2;
- re_sub_match_top_t **new_array = re_realloc (mctx->sub_tops,
- re_sub_match_top_t *,
- new_asub_tops);
- if (__glibc_unlikely (new_array == NULL))
- return REG_ESPACE;
- mctx->sub_tops = new_array;
- mctx->asub_tops = new_asub_tops;
- }
- mctx->sub_tops[mctx->nsub_tops] = calloc (1, sizeof (re_sub_match_top_t));
- if (__glibc_unlikely (mctx->sub_tops[mctx->nsub_tops] == NULL))
- return REG_ESPACE;
- mctx->sub_tops[mctx->nsub_tops]->node = node;
- mctx->sub_tops[mctx->nsub_tops++]->str_idx = str_idx;
- return REG_NOERROR;
-}
-
-/* Register the node NODE, whose type is OP_CLOSE_SUBEXP, and which matches
- at STR_IDX, whose corresponding OP_OPEN_SUBEXP is SUB_TOP.
- Return the new entry if successful, NULL if memory is exhausted. */
-
-static re_sub_match_last_t *
-match_ctx_add_sublast (re_sub_match_top_t *subtop, Idx node, Idx str_idx)
-{
- re_sub_match_last_t *new_entry;
- if (__glibc_unlikely (subtop->nlasts == subtop->alasts))
- {
- Idx new_alasts = 2 * subtop->alasts + 1;
- re_sub_match_last_t **new_array = re_realloc (subtop->lasts,
- re_sub_match_last_t *,
- new_alasts);
- if (__glibc_unlikely (new_array == NULL))
- return NULL;
- subtop->lasts = new_array;
- subtop->alasts = new_alasts;
- }
- new_entry = calloc (1, sizeof (re_sub_match_last_t));
- if (__glibc_likely (new_entry != NULL))
- {
- subtop->lasts[subtop->nlasts] = new_entry;
- new_entry->node = node;
- new_entry->str_idx = str_idx;
- ++subtop->nlasts;
- }
- return new_entry;
-}
-
-static void
-sift_ctx_init (re_sift_context_t *sctx, re_dfastate_t **sifted_sts,
- re_dfastate_t **limited_sts, Idx last_node, Idx last_str_idx)
-{
- sctx->sifted_states = sifted_sts;
- sctx->limited_states = limited_sts;
- sctx->last_node = last_node;
- sctx->last_str_idx = last_str_idx;
- re_node_set_init_empty (&sctx->limits);
-}
diff --git a/cross/lib/root-uid.h b/cross/lib/root-uid.h
deleted file mode 100644
index 1905575e47b..00000000000
--- a/cross/lib/root-uid.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* The user ID that always has appropriate privileges in the POSIX sense.
-
- Copyright 2012-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert. */
-
-#ifndef ROOT_UID_H_
-#define ROOT_UID_H_
-
-/* The user ID that always has appropriate privileges in the POSIX sense. */
-#ifdef __TANDEM
-# define ROOT_UID 65535
-#else
-# define ROOT_UID 0
-#endif
-
-#endif
diff --git a/cross/lib/save-cwd.c b/cross/lib/save-cwd.c
deleted file mode 100644
index 7c517d1c819..00000000000
--- a/cross/lib/save-cwd.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/* save-cwd.c -- Save and restore current working directory.
-
- Copyright (C) 1995, 1997-1998, 2003-2006, 2009-2023 Free Software
- Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Gnulib needs to save and restore the current working directory to
- fully emulate functions like fstatat. But Emacs doesn't care what
- the current working directory is; it always uses absolute file
- names. This module replaces the Gnulib module by omitting the code
- that Emacs does not need. */
-
-#include <config.h>
-
-#include "save-cwd.h"
-
-#include <fcntl.h>
-#include <unistd.h>
-
-/* Record the location of the current working directory in CWD so that
- the program may change to other directories and later use restore_cwd
- to return to the recorded location. This function may allocate
- space using malloc (via getcwd) or leave a file descriptor open;
- use free_cwd to perform the necessary free or close. Upon failure,
- no memory is allocated, any locally opened file descriptors are
- closed; return non-zero -- in that case, free_cwd need not be
- called, but doing so is ok. Otherwise, return zero.
-
- The _raison d'etre_ for this interface is that the working directory
- is sometimes inaccessible, and getcwd is not robust or as efficient.
- So, we prefer to use the open/fchdir approach, but fall back on
- getcwd if necessary. This module works for most cases with just
- the getcwd-lgpl module, but to be truly robust, use the getcwd module.
-
- Some systems lack fchdir altogether: e.g., OS/2, pre-2001 Cygwin,
- SCO Xenix. Also, SunOS 4 and Irix 5.3 provide the function, yet it
- doesn't work for partitions on which auditing is enabled. If
- you're still using an obsolete system with these problems, please
- send email to the maintainer of this code. */
-
-#if !defined HAVE_FCHDIR && !defined fchdir
-# define fchdir(fd) (-1)
-#endif
-
-int
-save_cwd (struct saved_cwd *cwd)
-{
- cwd->desc = open (".", O_SEARCH | O_CLOEXEC);
- /* The 'name' member is present only to minimize differences from
- gnulib. Initialize it to zero, if only to simplify debugging. */
- cwd->name = 0;
- return 0;
-}
-
-/* Change to recorded location, CWD, in directory hierarchy.
- Upon failure, return -1 (errno is set by chdir or fchdir).
- Upon success, return zero. */
-
-int
-restore_cwd (const struct saved_cwd *cwd)
-{
- /* Restore the previous directory if possible, to avoid tying down
- the file system of the new directory (Bug#18232).
- Don't worry if fchdir fails, as Emacs doesn't care what the
- working directory is. The fchdir call is inside an 'if' merely to
- pacify compilers that complain if fchdir's return value is ignored. */
- if (fchdir (cwd->desc) == 0)
- return 0;
-
- return 0;
-}
-
-void
-free_cwd (struct saved_cwd *cwd)
-{
- close (cwd->desc);
-}
diff --git a/cross/lib/save-cwd.h b/cross/lib/save-cwd.h
deleted file mode 100644
index d089b0e2145..00000000000
--- a/cross/lib/save-cwd.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Save and restore current working directory.
-
- Copyright (C) 1995, 1997-1998, 2003, 2009-2023 Free Software Foundation,
- Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Jim Meyering. */
-
-#ifndef SAVE_CWD_H
-# define SAVE_CWD_H 1
-
-struct saved_cwd
- {
- int desc;
- char *name;
- };
-
-int save_cwd (struct saved_cwd *cwd);
-int restore_cwd (const struct saved_cwd *cwd);
-void free_cwd (struct saved_cwd *cwd);
-
-#endif /* SAVE_CWD_H */
diff --git a/cross/lib/scratch_buffer.h b/cross/lib/scratch_buffer.h
deleted file mode 100644
index 4cf60d232b7..00000000000
--- a/cross/lib/scratch_buffer.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/* Variable-sized buffer with on-stack default allocation.
- Copyright (C) 2017-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert, 2017. */
-
-#ifndef _GL_SCRATCH_BUFFER_H
-#define _GL_SCRATCH_BUFFER_H
-
-/* Scratch buffers with a default stack allocation and fallback to
- heap allocation. It is expected that this function is used in this
- way:
-
- struct scratch_buffer tmpbuf;
- scratch_buffer_init (&tmpbuf);
-
- while (!function_that_uses_buffer (tmpbuf.data, tmpbuf.length))
- if (!scratch_buffer_grow (&tmpbuf))
- return -1;
-
- scratch_buffer_free (&tmpbuf);
- return 0;
-
- The allocation functions (scratch_buffer_grow,
- scratch_buffer_grow_preserve, scratch_buffer_set_array_size) make
- sure that the heap allocation, if any, is freed, so that the code
- above does not have a memory leak. The buffer still remains in a
- state that can be deallocated using scratch_buffer_free, so a loop
- like this is valid as well:
-
- struct scratch_buffer tmpbuf;
- scratch_buffer_init (&tmpbuf);
-
- while (!function_that_uses_buffer (tmpbuf.data, tmpbuf.length))
- if (!scratch_buffer_grow (&tmpbuf))
- break;
-
- scratch_buffer_free (&tmpbuf);
-
- scratch_buffer_grow and scratch_buffer_grow_preserve are guaranteed
- to grow the buffer by at least 512 bytes. This means that when
- using the scratch buffer as a backing store for a non-character
- array whose element size, in bytes, is 512 or smaller, the scratch
- buffer only has to grow once to make room for at least one more
- element.
-*/
-
-/* Scratch buffer. Must be initialized with scratch_buffer_init
- before its use. */
-struct scratch_buffer;
-
-/* Initializes *BUFFER so that BUFFER->data points to BUFFER->__space
- and BUFFER->length reflects the available space. */
-#if 0
-extern void scratch_buffer_init (struct scratch_buffer *buffer);
-#endif
-
-/* Deallocates *BUFFER (if it was heap-allocated). */
-#if 0
-extern void scratch_buffer_free (struct scratch_buffer *buffer);
-#endif
-
-/* Grow *BUFFER by some arbitrary amount. The buffer contents is NOT
- preserved. Return true on success, false on allocation failure (in
- which case the old buffer is freed). On success, the new buffer is
- larger than the previous size. On failure, *BUFFER is deallocated,
- but remains in a free-able state, and errno is set. */
-#if 0
-extern bool scratch_buffer_grow (struct scratch_buffer *buffer);
-#endif
-
-/* Like scratch_buffer_grow, but preserve the old buffer
- contents on success, as a prefix of the new buffer. */
-#if 0
-extern bool scratch_buffer_grow_preserve (struct scratch_buffer *buffer);
-#endif
-
-/* Grow *BUFFER so that it can store at least NELEM elements of SIZE
- bytes. The buffer contents are NOT preserved. Both NELEM and SIZE
- can be zero. Return true on success, false on allocation failure
- (in which case the old buffer is freed, but *BUFFER remains in a
- free-able state, and errno is set). It is unspecified whether this
- function can reduce the array size. */
-#if 0
-extern bool scratch_buffer_set_array_size (struct scratch_buffer *buffer,
- size_t nelem, size_t size);
-#endif
-
-
-/* The implementation is imported from glibc. */
-
-/* Avoid possible conflicts with symbols exported by the GNU libc. */
-#define __libc_scratch_buffer_grow gl_scratch_buffer_grow
-#define __libc_scratch_buffer_grow_preserve gl_scratch_buffer_grow_preserve
-#define __libc_scratch_buffer_set_array_size gl_scratch_buffer_set_array_size
-
-#ifndef _GL_LIKELY
-/* Rely on __builtin_expect, as provided by the module 'builtin-expect'. */
-# define _GL_LIKELY(cond) __builtin_expect ((cond), 1)
-# define _GL_UNLIKELY(cond) __builtin_expect ((cond), 0)
-#endif
-
-#include <malloc/scratch_buffer.gl.h>
-
-#endif /* _GL_SCRATCH_BUFFER_H */
diff --git a/cross/lib/set-permissions.c b/cross/lib/set-permissions.c
deleted file mode 100644
index 1d6732cc78f..00000000000
--- a/cross/lib/set-permissions.c
+++ /dev/null
@@ -1,847 +0,0 @@
-/* Set permissions of a file. -*- coding: utf-8 -*-
-
- Copyright (C) 2002-2003, 2005-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>.
-
- Written by Paul Eggert, Andreas Grünbacher, and Bruno Haible. */
-
-#include <config.h>
-
-#include "acl.h"
-
-#include "acl-internal.h"
-
-#if USE_ACL
-# if ! defined HAVE_ACL_FROM_MODE && defined HAVE_ACL_FROM_TEXT /* FreeBSD, IRIX, Tru64, Cygwin >= 2.5 */
-# if HAVE_ACL_GET_FILE && !HAVE_ACL_TYPE_EXTENDED
-
-static acl_t
-acl_from_mode (mode_t mode)
-{
-# if HAVE_ACL_FREE_TEXT /* Tru64 */
- char acl_text[] = "u::---,g::---,o::---,";
-# else /* FreeBSD, IRIX, Cygwin >= 2.5 */
- char acl_text[] = "u::---,g::---,o::---";
-# endif
-
- if (mode & S_IRUSR) acl_text[ 3] = 'r';
- if (mode & S_IWUSR) acl_text[ 4] = 'w';
- if (mode & S_IXUSR) acl_text[ 5] = 'x';
- if (mode & S_IRGRP) acl_text[10] = 'r';
- if (mode & S_IWGRP) acl_text[11] = 'w';
- if (mode & S_IXGRP) acl_text[12] = 'x';
- if (mode & S_IROTH) acl_text[17] = 'r';
- if (mode & S_IWOTH) acl_text[18] = 'w';
- if (mode & S_IXOTH) acl_text[19] = 'x';
-
- return acl_from_text (acl_text);
-}
-# endif
-# endif
-
-# if HAVE_FACL && defined GETACL /* Solaris, Cygwin < 2.5, not HP-UX */
-static int
-set_acls_from_mode (const char *name, int desc, mode_t mode, bool *must_chmod)
-{
-# ifdef ACE_GETACL
- /* Solaris also has a different variant of ACLs, used in ZFS and NFSv4
- file systems (whereas the other ones are used in UFS file systems). */
-
- /* The flags in the ace_t structure changed in a binary incompatible way
- when ACL_NO_TRIVIAL etc. were introduced in <sys/acl.h> version 1.15.
- How to distinguish the two conventions at runtime?
- We fetch the existing ACL. In the old convention, usually three ACEs have
- a_flags = ACE_OWNER / ACE_GROUP / ACE_OTHER, in the range 0x0100..0x0400.
- In the new convention, these values are not used. */
- int convention;
-
- {
- /* Initially, try to read the entries into a stack-allocated buffer.
- Use malloc if it does not fit. */
- enum
- {
- alloc_init = 4000 / sizeof (ace_t), /* >= 3 */
- alloc_max = MIN (INT_MAX, SIZE_MAX / sizeof (ace_t))
- };
- ace_t buf[alloc_init];
- size_t alloc = alloc_init;
- ace_t *entries = buf;
- ace_t *malloced = NULL;
- int count;
-
- for (;;)
- {
- count = (desc != -1
- ? facl (desc, ACE_GETACL, alloc, entries)
- : acl (name, ACE_GETACL, alloc, entries));
- if (count < 0 && errno == ENOSPC)
- {
- /* Increase the size of the buffer. */
- free (malloced);
- if (alloc > alloc_max / 2)
- {
- errno = ENOMEM;
- return -1;
- }
- alloc = 2 * alloc; /* <= alloc_max */
- entries = malloced = (ace_t *) malloc (alloc * sizeof (ace_t));
- if (entries == NULL)
- {
- errno = ENOMEM;
- return -1;
- }
- continue;
- }
- break;
- }
-
- if (count <= 0)
- convention = -1;
- else
- {
- int i;
-
- convention = 0;
- for (i = 0; i < count; i++)
- if (entries[i].a_flags & (OLD_ACE_OWNER | OLD_ACE_GROUP | OLD_ACE_OTHER))
- {
- convention = 1;
- break;
- }
- }
- free (malloced);
- }
-
- if (convention >= 0)
- {
- ace_t entries[6];
- int count;
- int ret;
-
- if (convention)
- {
- /* Running on Solaris 10. */
- entries[0].a_type = OLD_ALLOW;
- entries[0].a_flags = OLD_ACE_OWNER;
- entries[0].a_who = 0; /* irrelevant */
- entries[0].a_access_mask = (mode >> 6) & 7;
- entries[1].a_type = OLD_ALLOW;
- entries[1].a_flags = OLD_ACE_GROUP;
- entries[1].a_who = 0; /* irrelevant */
- entries[1].a_access_mask = (mode >> 3) & 7;
- entries[2].a_type = OLD_ALLOW;
- entries[2].a_flags = OLD_ACE_OTHER;
- entries[2].a_who = 0;
- entries[2].a_access_mask = mode & 7;
- count = 3;
- }
- else
- {
- /* Running on Solaris 10 (newer version) or Solaris 11.
- The details here were found through "/bin/ls -lvd somefiles". */
- entries[0].a_type = NEW_ACE_ACCESS_DENIED_ACE_TYPE;
- entries[0].a_flags = NEW_ACE_OWNER;
- entries[0].a_who = 0; /* irrelevant */
- entries[0].a_access_mask = 0;
- entries[1].a_type = NEW_ACE_ACCESS_ALLOWED_ACE_TYPE;
- entries[1].a_flags = NEW_ACE_OWNER;
- entries[1].a_who = 0; /* irrelevant */
- entries[1].a_access_mask = NEW_ACE_WRITE_NAMED_ATTRS
- | NEW_ACE_WRITE_ATTRIBUTES
- | NEW_ACE_WRITE_ACL
- | NEW_ACE_WRITE_OWNER;
- if (mode & 0400)
- entries[1].a_access_mask |= NEW_ACE_READ_DATA;
- else
- entries[0].a_access_mask |= NEW_ACE_READ_DATA;
- if (mode & 0200)
- entries[1].a_access_mask |= NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA;
- else
- entries[0].a_access_mask |= NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA;
- if (mode & 0100)
- entries[1].a_access_mask |= NEW_ACE_EXECUTE;
- else
- entries[0].a_access_mask |= NEW_ACE_EXECUTE;
- entries[2].a_type = NEW_ACE_ACCESS_DENIED_ACE_TYPE;
- entries[2].a_flags = NEW_ACE_GROUP | NEW_ACE_IDENTIFIER_GROUP;
- entries[2].a_who = 0; /* irrelevant */
- entries[2].a_access_mask = 0;
- entries[3].a_type = NEW_ACE_ACCESS_ALLOWED_ACE_TYPE;
- entries[3].a_flags = NEW_ACE_GROUP | NEW_ACE_IDENTIFIER_GROUP;
- entries[3].a_who = 0; /* irrelevant */
- entries[3].a_access_mask = 0;
- if (mode & 0040)
- entries[3].a_access_mask |= NEW_ACE_READ_DATA;
- else
- entries[2].a_access_mask |= NEW_ACE_READ_DATA;
- if (mode & 0020)
- entries[3].a_access_mask |= NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA;
- else
- entries[2].a_access_mask |= NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA;
- if (mode & 0010)
- entries[3].a_access_mask |= NEW_ACE_EXECUTE;
- else
- entries[2].a_access_mask |= NEW_ACE_EXECUTE;
- entries[4].a_type = NEW_ACE_ACCESS_DENIED_ACE_TYPE;
- entries[4].a_flags = NEW_ACE_EVERYONE;
- entries[4].a_who = 0;
- entries[4].a_access_mask = NEW_ACE_WRITE_NAMED_ATTRS
- | NEW_ACE_WRITE_ATTRIBUTES
- | NEW_ACE_WRITE_ACL
- | NEW_ACE_WRITE_OWNER;
- entries[5].a_type = NEW_ACE_ACCESS_ALLOWED_ACE_TYPE;
- entries[5].a_flags = NEW_ACE_EVERYONE;
- entries[5].a_who = 0;
- entries[5].a_access_mask = NEW_ACE_READ_NAMED_ATTRS
- | NEW_ACE_READ_ATTRIBUTES
- | NEW_ACE_READ_ACL
- | NEW_ACE_SYNCHRONIZE;
- if (mode & 0004)
- entries[5].a_access_mask |= NEW_ACE_READ_DATA;
- else
- entries[4].a_access_mask |= NEW_ACE_READ_DATA;
- if (mode & 0002)
- entries[5].a_access_mask |= NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA;
- else
- entries[4].a_access_mask |= NEW_ACE_WRITE_DATA | NEW_ACE_APPEND_DATA;
- if (mode & 0001)
- entries[5].a_access_mask |= NEW_ACE_EXECUTE;
- else
- entries[4].a_access_mask |= NEW_ACE_EXECUTE;
- count = 6;
- }
- if (desc != -1)
- ret = facl (desc, ACE_SETACL, count, entries);
- else
- ret = acl (name, ACE_SETACL, count, entries);
- if (ret < 0 && errno != EINVAL && errno != ENOTSUP)
- {
- if (errno == ENOSYS)
- {
- *must_chmod = true;
- return 0;
- }
- return -1;
- }
- if (ret == 0)
- return 0;
- }
-# endif
-
- {
- aclent_t entries[3];
- int ret;
-
- entries[0].a_type = USER_OBJ;
- entries[0].a_id = 0; /* irrelevant */
- entries[0].a_perm = (mode >> 6) & 7;
- entries[1].a_type = GROUP_OBJ;
- entries[1].a_id = 0; /* irrelevant */
- entries[1].a_perm = (mode >> 3) & 7;
- entries[2].a_type = OTHER_OBJ;
- entries[2].a_id = 0;
- entries[2].a_perm = mode & 7;
-
- if (desc != -1)
- ret = facl (desc, SETACL,
- sizeof (entries) / sizeof (aclent_t), entries);
- else
- ret = acl (name, SETACL,
- sizeof (entries) / sizeof (aclent_t), entries);
- if (ret < 0)
- {
- if (errno == ENOSYS || errno == EOPNOTSUPP)
- {
- *must_chmod = true;
- return 0;
- }
- return -1;
- }
- return 0;
- }
-}
-
-# elif HAVE_GETACL /* HP-UX */
-static int
-context_acl_from_mode (struct permission_context *ctx, const char *name, int desc)
-{
- struct stat statbuf;
- int ret;
-
- if (desc != -1)
- ret = fstat (desc, &statbuf);
- else
- ret = stat (name, &statbuf);
- if (ret < 0)
- return -1;
-
- ctx->entries[0].uid = statbuf.st_uid;
- ctx->entries[0].gid = ACL_NSGROUP;
- ctx->entries[0].mode = (ctx->mode >> 6) & 7;
- ctx->entries[1].uid = ACL_NSUSER;
- ctx->entries[1].gid = statbuf.st_gid;
- ctx->entries[1].mode = (ctx->mode >> 3) & 7;
- ctx->entries[2].uid = ACL_NSUSER;
- ctx->entries[2].gid = ACL_NSGROUP;
- ctx->entries[2].mode = ctx->mode & 7;
- ctx->count = 3;
- return 0;
-}
-
-# if HAVE_ACLV_H /* HP-UX >= 11.11 */
-static int
-context_aclv_from_mode (struct permission_context *ctx)
-{
- int ret;
-
- ctx->aclv_entries[0].a_type = USER_OBJ;
- ctx->aclv_entries[0].a_id = 0; /* irrelevant */
- ctx->aclv_entries[0].a_perm = (ctx->mode >> 6) & 7;
- ctx->aclv_entries[1].a_type = GROUP_OBJ;
- ctx->aclv_entries[1].a_id = 0; /* irrelevant */
- ctx->aclv_entries[1].a_perm = (ctx->mode >> 3) & 7;
- ctx->aclv_entries[2].a_type = CLASS_OBJ;
- ctx->aclv_entries[2].a_id = 0;
- ctx->aclv_entries[2].a_perm = (ctx->mode >> 3) & 7;
- ctx->aclv_entries[3].a_type = OTHER_OBJ;
- ctx->aclv_entries[3].a_id = 0;
- ctx->aclv_entries[3].a_perm = ctx->mode & 7;
- ctx->aclv_count = 4;
-
- ret = aclsort (ctx->aclv_count, 1, ctx->aclv_entries);
- if (ret > 0)
- abort ();
- return ret;
-}
-# endif
-
-# elif HAVE_ACLX_GET && defined ACL_AIX_WIP /* AIX */
-static int
-set_acls_from_mode (const char *name, int desc, mode_t mode, bool *must_chmod)
-{
- acl_type_list_t types;
- size_t types_size = sizeof (types);
- acl_type_t type;
-
- if (aclx_gettypes (name, &types, &types_size) < 0
- || types.num_entries == 0)
- {
- *must_chmod = true;
- return 0;
- }
-
- /* XXX Do we need to clear all types of ACLs for the given file, or is it
- sufficient to clear the first one? */
- type = types.entries[0];
- if (type.u64 == ACL_AIXC)
- {
- union { struct acl a; char room[128]; } u;
- int ret;
-
- u.a.acl_len = (char *) &u.a.acl_ext[0] - (char *) &u.a; /* no entries */
- u.a.acl_mode = mode & ~(S_IXACL | 0777);
- u.a.u_access = (mode >> 6) & 7;
- u.a.g_access = (mode >> 3) & 7;
- u.a.o_access = mode & 7;
-
- if (desc != -1)
- ret = aclx_fput (desc, SET_ACL | SET_MODE_S_BITS,
- type, &u.a, u.a.acl_len, mode);
- else
- ret = aclx_put (name, SET_ACL | SET_MODE_S_BITS,
- type, &u.a, u.a.acl_len, mode);
- if (!(ret < 0 && errno == ENOSYS))
- return ret;
- }
- else if (type.u64 == ACL_NFS4)
- {
- union { nfs4_acl_int_t a; char room[128]; } u;
- nfs4_ace_int_t *ace;
- int ret;
-
- u.a.aclVersion = NFS4_ACL_INT_STRUCT_VERSION;
- u.a.aclEntryN = 0;
- ace = &u.a.aclEntry[0];
- {
- ace->flags = ACE4_ID_SPECIAL;
- ace->aceWho.special_whoid = ACE4_WHO_OWNER;
- ace->aceType = ACE4_ACCESS_ALLOWED_ACE_TYPE;
- ace->aceFlags = 0;
- ace->aceMask =
- (mode & 0400 ? ACE4_READ_DATA | ACE4_LIST_DIRECTORY : 0)
- | (mode & 0200
- ? ACE4_WRITE_DATA | ACE4_ADD_FILE | ACE4_APPEND_DATA
- | ACE4_ADD_SUBDIRECTORY
- : 0)
- | (mode & 0100 ? ACE4_EXECUTE : 0);
- ace->aceWhoString[0] = '\0';
- ace->entryLen = (char *) &ace->aceWhoString[4] - (char *) ace;
- ace = (nfs4_ace_int_t *) (char *) &ace->aceWhoString[4];
- u.a.aclEntryN++;
- }
- {
- ace->flags = ACE4_ID_SPECIAL;
- ace->aceWho.special_whoid = ACE4_WHO_GROUP;
- ace->aceType = ACE4_ACCESS_ALLOWED_ACE_TYPE;
- ace->aceFlags = 0;
- ace->aceMask =
- (mode & 0040 ? ACE4_READ_DATA | ACE4_LIST_DIRECTORY : 0)
- | (mode & 0020
- ? ACE4_WRITE_DATA | ACE4_ADD_FILE | ACE4_APPEND_DATA
- | ACE4_ADD_SUBDIRECTORY
- : 0)
- | (mode & 0010 ? ACE4_EXECUTE : 0);
- ace->aceWhoString[0] = '\0';
- ace->entryLen = (char *) &ace->aceWhoString[4] - (char *) ace;
- ace = (nfs4_ace_int_t *) (char *) &ace->aceWhoString[4];
- u.a.aclEntryN++;
- }
- {
- ace->flags = ACE4_ID_SPECIAL;
- ace->aceWho.special_whoid = ACE4_WHO_EVERYONE;
- ace->aceType = ACE4_ACCESS_ALLOWED_ACE_TYPE;
- ace->aceFlags = 0;
- ace->aceMask =
- (mode & 0004 ? ACE4_READ_DATA | ACE4_LIST_DIRECTORY : 0)
- | (mode & 0002
- ? ACE4_WRITE_DATA | ACE4_ADD_FILE | ACE4_APPEND_DATA
- | ACE4_ADD_SUBDIRECTORY
- : 0)
- | (mode & 0001 ? ACE4_EXECUTE : 0);
- ace->aceWhoString[0] = '\0';
- ace->entryLen = (char *) &ace->aceWhoString[4] - (char *) ace;
- ace = (nfs4_ace_int_t *) (char *) &ace->aceWhoString[4];
- u.a.aclEntryN++;
- }
- u.a.aclLength = (char *) ace - (char *) &u.a;
-
- if (desc != -1)
- ret = aclx_fput (desc, SET_ACL | SET_MODE_S_BITS,
- type, &u.a, u.a.aclLength, mode);
- else
- ret = aclx_put (name, SET_ACL | SET_MODE_S_BITS,
- type, &u.a, u.a.aclLength, mode);
- if (!(ret < 0 && errno == ENOSYS))
- return ret;
- }
-
- *must_chmod = true;
- return 0;
-}
-
-# elif HAVE_STATACL /* older AIX */
-static int
-context_acl_from_mode (struct permission_context *ctx)
-{
- ctx->u.a.acl_len = (char *) &ctx->u.a.acl_ext[0] - (char *) &ctx->u.a; /* no entries */
- ctx->u.a.acl_mode = ctx->mode & ~(S_IXACL | 0777);
- ctx->u.a.u_access = (ctx->mode >> 6) & 7;
- ctx->u.a.g_access = (ctx->mode >> 3) & 7;
- ctx->u.a.o_access = ctx->mode & 7;
- ctx->have_u = true;
- return 0;
-}
-
-# elif HAVE_ACLSORT /* NonStop Kernel */
-static int
-context_acl_from_mode (struct permission_context *ctx)
-{
- int ret;
-
- ctx->entries[0].a_type = USER_OBJ;
- ctx->entries[0].a_id = 0; /* irrelevant */
- ctx->entries[0].a_perm = (ctx->mode >> 6) & 7;
- ctx->entries[1].a_type = GROUP_OBJ;
- ctx->entries[1].a_id = 0; /* irrelevant */
- ctx->entries[1].a_perm = (ctx->mode >> 3) & 7;
- ctx->entries[2].a_type = CLASS_OBJ;
- ctx->entries[2].a_id = 0;
- ctx->entries[2].a_perm = (ctx->mode >> 3) & 7;
- ctx->entries[3].a_type = OTHER_OBJ;
- ctx->entries[3].a_id = 0;
- ctx->entries[3].a_perm = ctx->mode & 7;
- ctx->count = 4;
-
- ret = aclsort (ctx->count, 1, entries);
- if (ret > 0)
- abort ();
- return ret;
-}
-# endif
-
-static int
-set_acls (struct permission_context *ctx, const char *name, int desc,
- int from_mode, bool *must_chmod, bool *acls_set)
-{
- int ret = 0;
-
-# if HAVE_ACL_GET_FILE
- /* POSIX 1003.1e (draft 17 -- abandoned) specific version. */
- /* Linux, FreeBSD, Mac OS X, IRIX, Tru64, Cygwin >= 2.5 */
-# if !HAVE_ACL_TYPE_EXTENDED
- /* Linux, FreeBSD, IRIX, Tru64, Cygwin >= 2.5 */
-
-# ifndef HAVE_ACL_FROM_TEXT
-# error Must have acl_from_text (see POSIX 1003.1e draft 17).
-# endif
-# ifndef HAVE_ACL_DELETE_DEF_FILE
-# error Must have acl_delete_def_file (see POSIX 1003.1e draft 17).
-# endif
-
- if (! ctx->acls_not_supported)
- {
- if (ret == 0 && from_mode)
- {
- if (ctx->acl)
- acl_free (ctx->acl);
- ctx->acl = acl_from_mode (ctx->mode);
- if (ctx->acl == NULL)
- ret = -1;
- }
-
- if (ret == 0 && ctx->acl)
- {
- if (HAVE_ACL_SET_FD && desc != -1)
- ret = acl_set_fd (desc, ctx->acl);
- else
- ret = acl_set_file (name, ACL_TYPE_ACCESS, ctx->acl);
- if (ret != 0)
- {
- if (! acl_errno_valid (errno))
- {
- ctx->acls_not_supported = true;
- if (from_mode || acl_access_nontrivial (ctx->acl) == 0)
- ret = 0;
- }
- }
- else
- {
- *acls_set = true;
- if (S_ISDIR(ctx->mode))
- {
- if (! from_mode && ctx->default_acl &&
- acl_default_nontrivial (ctx->default_acl))
- ret = acl_set_file (name, ACL_TYPE_DEFAULT,
- ctx->default_acl);
- else
- ret = acl_delete_def_file (name);
- }
- }
- }
- }
-
-# if HAVE_ACL_TYPE_NFS4 /* FreeBSD */
-
- /* File systems either support POSIX ACLs (for example, ufs) or NFS4 ACLs
- (for example, zfs). */
-
- /* TODO: Implement setting ACLs once get_permissions() reads them. */
-
-# endif
-
-# else /* HAVE_ACL_TYPE_EXTENDED */
- /* Mac OS X */
-
- /* On Mac OS X, acl_get_file (name, ACL_TYPE_ACCESS)
- and acl_get_file (name, ACL_TYPE_DEFAULT)
- always return NULL / EINVAL. You have to use
- acl_get_file (name, ACL_TYPE_EXTENDED)
- or acl_get_fd (open (name, ...))
- to retrieve an ACL.
- On the other hand,
- acl_set_file (name, ACL_TYPE_ACCESS, acl)
- and acl_set_file (name, ACL_TYPE_DEFAULT, acl)
- have the same effect as
- acl_set_file (name, ACL_TYPE_EXTENDED, acl):
- Each of these calls sets the file's ACL. */
-
- if (ctx->acl == NULL)
- {
- acl_t acl;
-
- /* Remove ACLs if the file has ACLs. */
- if (HAVE_ACL_GET_FD && desc != -1)
- acl = acl_get_fd (desc);
- else
- acl = acl_get_file (name, ACL_TYPE_EXTENDED);
- if (acl)
- {
- acl_free (acl);
-
- acl = acl_init (0);
- if (acl)
- {
- if (HAVE_ACL_SET_FD && desc != -1)
- ret = acl_set_fd (desc, acl);
- else
- ret = acl_set_file (name, ACL_TYPE_EXTENDED, acl);
- acl_free (acl);
- }
- else
- ret = -1;
- }
- }
- else
- {
- if (HAVE_ACL_SET_FD && desc != -1)
- ret = acl_set_fd (desc, ctx->acl);
- else
- ret = acl_set_file (name, ACL_TYPE_EXTENDED, ctx->acl);
- if (ret != 0)
- {
- if (! acl_errno_valid (errno)
- && ! acl_extended_nontrivial (ctx->acl))
- ret = 0;
- }
- }
- *acls_set = true;
-
-# endif
-
-# elif defined GETACL /* Solaris, Cygwin, not HP-UX */
-
- /* Solaris 2.5 through Solaris 10, Cygwin, and contemporaneous versions
- of Unixware. The acl() call returns the access and default ACL both
- at once. */
-
- /* If both ace_entries and entries are available, try SETACL before
- ACE_SETACL, because SETACL cannot fail with ENOTSUP whereas ACE_SETACL
- can. */
-
- if (from_mode)
- return set_acls_from_mode (name, desc, ctx->mode, must_chmod);
-
- if (ret == 0 && ctx->count)
- {
- if (desc != -1)
- ret = facl (desc, SETACL, ctx->count, ctx->entries);
- else
- ret = acl (name, SETACL, ctx->count, ctx->entries);
- if (ret < 0)
- {
- if ((errno == ENOSYS || errno == EOPNOTSUPP || errno == EINVAL)
- && acl_nontrivial (ctx->count, ctx->entries) == 0)
- ret = 0;
- }
- else
- *acls_set = true;
- }
-
-# ifdef ACE_GETACL
- if (ret == 0 && ctx->ace_count)
- {
- if (desc != -1)
- ret = facl (desc, ACE_SETACL, ctx->ace_count, ctx->ace_entries);
- else
- ret = acl (name, ACE_SETACL, ctx->ace_count, ctx->ace_entries);
- if (ret < 0)
- {
- if ((errno == ENOSYS || errno == EINVAL || errno == ENOTSUP)
- && acl_ace_nontrivial (ctx->ace_count, ctx->ace_entries) == 0)
- ret = 0;
- }
- else
- *acls_set = true;
- }
-# endif
-
-# elif HAVE_GETACL /* HP-UX */
-
- if (from_mode)
- ret = context_acl_from_mode (ctx, name, desc);
-
- if (ret == 0 && ctx->count > 0)
- {
- if (desc != -1)
- ret = fsetacl (desc, ctx->count, ctx->entries);
- else
- ret = setacl (name, ctx->count, ctx->entries);
- if (ret < 0)
- {
- if ((errno == ENOSYS || errno == EOPNOTSUPP || errno == ENOTSUP)
- && (from_mode || !acl_nontrivial (ctx->count, ctx->entries)))
- ret = 0;
- }
- else
- *acls_set = true;
- }
-
-# if HAVE_ACLV_H
- if (from_mode)
- ret = context_aclv_from_mode (ctx);
-
- if (ret == 0 && ctx->aclv_count > 0)
- {
- ret = acl ((char *) name, ACL_SET, ctx->aclv_count, ctx->aclv_entries);
- if (ret < 0)
- {
- if ((errno == ENOSYS || errno == EOPNOTSUPP || errno == EINVAL)
- && (from_mode || !aclv_nontrivial (ctx->aclv_count, ctx->aclv_entries)))
- ret = 0;
- }
- else
- *acls_set = true;
- }
-# endif
-
-# elif HAVE_ACLX_GET && ACL_AIX_WIP /* AIX */
-
- /* TODO: Implement setting ACLs once get_permissions() reads them. */
-
- if (from_mode)
- ret = set_acls_from_mode (name, desc, mode, must_chmod);
-
-# elif HAVE_STATACL /* older AIX */
-
- if (from_mode)
- ret = context_acl_from_mode (ctx);
-
- if (ret == 0 && ctx->have_u)
- {
- if (desc != -1)
- ret = fchacl (desc, &ctx->u.a, ctx->u.a.acl_len);
- else
- ret = chacl ((char *) name, &ctx->u.a, ctx->u.a.acl_len);
- if (ret < 0)
- {
- if (errno == ENOSYS && from_mode)
- ret = 0;
- }
- else
- *acls_set = true;
- }
-
-# elif HAVE_ACLSORT /* NonStop Kernel */
-
- if (from_mode)
- ret = context_acl_from_mode (ctx);
-
- if (ret == 0 && ctx->count)
- {
- ret = acl ((char *) name, ACL_SET, ctx->count, ctx->entries);
- if (ret != 0)
- {
- if (!acl_nontrivial (ctx->count, ctx->entries))
- ret = 0;
- }
- else
- *acls_set = true;
- }
-
-# else /* No ACLs */
-
- /* Nothing to do. */
-
-# endif
-
- return ret;
-}
-#endif
-
-/* If DESC is a valid file descriptor use fchmod to change the
- file's mode to MODE on systems that have fchmod. On systems
- that don't have fchmod and if DESC is invalid, use chmod on
- NAME instead.
- Return 0 if successful. Return -1 and set errno upon failure. */
-
-int
-chmod_or_fchmod (const char *name, int desc, mode_t mode)
-{
- if (HAVE_FCHMOD && desc != -1)
- return fchmod (desc, mode);
- else
- return chmod (name, mode);
-}
-
-/* Set the permissions in CTX on a file. If DESC is a valid file descriptor,
- use file descriptor operations, else use filename based operations on NAME.
- If access control lists are not available, fchmod the target file to the
- mode in CTX. Also sets the non-permission bits of the destination file
- (S_ISUID, S_ISGID, S_ISVTX) to those from the mode in CTX if any are set.
- Return 0 if successful. Return -1 and set errno upon failure. */
-
-int
-set_permissions (struct permission_context *ctx, const char *name, int desc)
-{
- _GL_UNUSED bool acls_set = false;
- bool early_chmod;
- bool must_chmod = false;
- int ret = 0;
-
-#if USE_ACL
-# if HAVE_STATACL
- /* older AIX */
- /* There is no need to call chmod_or_fchmod, since the mode
- bits S_ISUID, S_ISGID, S_ISVTX are also stored in the ACL. */
-
- early_chmod = false;
-# else
- /* All other platforms */
- /* On Cygwin, it is necessary to call chmod before acl, because
- chmod can change the contents of the ACL (in ways that don't
- change the allowed accesses, but still visible). */
-
- early_chmod = (! MODE_INSIDE_ACL || (ctx->mode & (S_ISUID | S_ISGID | S_ISVTX)));
-# endif
-#else
- /* No ACLs */
-
- early_chmod = true;
-#endif
-
- if (early_chmod)
- {
- ret = chmod_or_fchmod (name, desc, ctx->mode);
- if (ret != 0)
- return -1;
- }
-
-#if USE_ACL
- ret = set_acls (ctx, name, desc, false, &must_chmod, &acls_set);
- if (! acls_set)
- {
- int saved_errno = ret ? errno : 0;
-
- /* If we can't set an acl which we expect to be able to set, try setting
- the permissions to ctx->mode. Due to possible inherited permissions,
- we cannot simply chmod. */
-
- ret = set_acls (ctx, name, desc, true, &must_chmod, &acls_set);
- if (! acls_set)
- must_chmod = true;
-
- if (saved_errno)
- {
- errno = saved_errno;
- ret = -1;
- }
- }
-#endif
-
- if (must_chmod && ! early_chmod)
- {
- int saved_errno = ret ? errno : 0;
-
- ret = chmod_or_fchmod (name, desc, ctx->mode);
-
- if (saved_errno)
- {
- errno = saved_errno;
- ret = -1;
- }
- }
-
- return ret;
-}
diff --git a/cross/lib/sha1.c b/cross/lib/sha1.c
deleted file mode 100644
index 80f0b7a3314..00000000000
--- a/cross/lib/sha1.c
+++ /dev/null
@@ -1,360 +0,0 @@
-/* sha1.c - Functions to compute SHA1 message digest of files or
- memory blocks according to the NIST specification FIPS-180-1.
-
- Copyright (C) 2000-2001, 2003-2006, 2008-2023 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 Scott G. Miller
- Credits:
- Robert Klep <robert@ilse.nl> -- Expansion function fix
-*/
-
-#include <config.h>
-
-/* Specification. */
-#if HAVE_OPENSSL_SHA1
-# define GL_OPENSSL_INLINE _GL_EXTERN_INLINE
-#endif
-#include "sha1.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_SHA1
-
-/* This array contains the bytes used to pad the buffer to the next
- 64-byte boundary. (RFC 1321, 3.1: Step 1) */
-static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
-
-
-/* Take a pointer to a 160 bit block of data (five 32 bit ints) and
- initialize it to the start constants of the SHA1 algorithm. This
- must be called before using hash in the call to sha1_hash. */
-void
-sha1_init_ctx (struct sha1_ctx *ctx)
-{
- ctx->A = 0x67452301;
- ctx->B = 0xefcdab89;
- ctx->C = 0x98badcfe;
- ctx->D = 0x10325476;
- ctx->E = 0xc3d2e1f0;
-
- ctx->total[0] = ctx->total[1] = 0;
- ctx->buflen = 0;
-}
-
-/* Copy the 4 byte value from v into the memory location pointed to by *cp,
- If your architecture allows unaligned access this is equivalent to
- * (uint32_t *) cp = v */
-static void
-set_uint32 (char *cp, uint32_t v)
-{
- memcpy (cp, &v, sizeof v);
-}
-
-/* Put result from CTX in first 20 bytes following RESBUF. The result
- must be in little endian byte order. */
-void *
-sha1_read_ctx (const struct sha1_ctx *ctx, void *resbuf)
-{
- char *r = resbuf;
- set_uint32 (r + 0 * sizeof ctx->A, SWAP (ctx->A));
- set_uint32 (r + 1 * sizeof ctx->B, SWAP (ctx->B));
- set_uint32 (r + 2 * sizeof ctx->C, SWAP (ctx->C));
- set_uint32 (r + 3 * sizeof ctx->D, SWAP (ctx->D));
- set_uint32 (r + 4 * sizeof ctx->E, SWAP (ctx->E));
-
- return resbuf;
-}
-
-/* Process the remaining bytes in the internal buffer and the usual
- prolog according to the standard and write the result to RESBUF. */
-void *
-sha1_finish_ctx (struct sha1_ctx *ctx, void *resbuf)
-{
- /* Take yet unprocessed bytes into account. */
- uint32_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. */
- ctx->buffer[size - 2] = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29));
- ctx->buffer[size - 1] = SWAP (ctx->total[0] << 3);
-
- memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 4 - bytes);
-
- /* Process last bytes. */
- sha1_process_block (ctx->buffer, size * 4, ctx);
-
- return sha1_read_ctx (ctx, resbuf);
-}
-
-/* Compute SHA1 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 *
-sha1_buffer (const char *buffer, size_t len, void *resblock)
-{
- struct sha1_ctx ctx;
-
- /* Initialize the computation context. */
- sha1_init_ctx (&ctx);
-
- /* Process whole buffer but last len % 64 bytes. */
- sha1_process_bytes (buffer, len, &ctx);
-
- /* Put result in desired memory area. */
- return sha1_finish_ctx (&ctx, resblock);
-}
-
-void
-sha1_process_bytes (const void *buffer, size_t len, struct sha1_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)
- {
- sha1_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)
- {
- sha1_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx);
- buffer = (const char *) buffer + 64;
- len -= 64;
- }
- else
-#endif
- {
- sha1_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)
- {
- sha1_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 md5.c and sha1.c --- */
-
-/* SHA1 round constants */
-#define K1 0x5a827999
-#define K2 0x6ed9eba1
-#define K3 0x8f1bbcdc
-#define K4 0xca62c1d6
-
-/* Round functions. Note that F2 is the same as F4. */
-#define F1(B,C,D) ( D ^ ( B & ( C ^ D ) ) )
-#define F2(B,C,D) (B ^ C ^ D)
-#define F3(B,C,D) ( ( B & C ) | ( D & ( B | C ) ) )
-#define F4(B,C,D) (B ^ C ^ D)
-
-/* 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
-sha1_process_block (const void *buffer, size_t len, struct sha1_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->A;
- uint32_t b = ctx->B;
- uint32_t c = ctx->C;
- uint32_t d = ctx->D;
- uint32_t e = ctx->E;
- uint32_t lolen = len;
-
- /* First increment the byte count. RFC 1321 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)) | ((uint32_t) (x) >> (32 - (n))))
-
-#define M(I) ( tm = x[I&0x0f] ^ x[(I-14)&0x0f] \
- ^ x[(I-8)&0x0f] ^ x[(I-3)&0x0f] \
- , (x[I&0x0f] = rol(tm, 1)) )
-
-#define R(A,B,C,D,E,F,K,M) do { E += rol( A, 5 ) \
- + F( B, C, D ) \
- + K \
- + M; \
- B = rol( B, 30 ); \
- } while(0)
-
- while (words < endp)
- {
- uint32_t tm;
- int t;
- for (t = 0; t < 16; t++)
- {
- x[t] = SWAP (*words);
- words++;
- }
-
- R( a, b, c, d, e, F1, K1, x[ 0] );
- R( e, a, b, c, d, F1, K1, x[ 1] );
- R( d, e, a, b, c, F1, K1, x[ 2] );
- R( c, d, e, a, b, F1, K1, x[ 3] );
- R( b, c, d, e, a, F1, K1, x[ 4] );
- R( a, b, c, d, e, F1, K1, x[ 5] );
- R( e, a, b, c, d, F1, K1, x[ 6] );
- R( d, e, a, b, c, F1, K1, x[ 7] );
- R( c, d, e, a, b, F1, K1, x[ 8] );
- R( b, c, d, e, a, F1, K1, x[ 9] );
- R( a, b, c, d, e, F1, K1, x[10] );
- R( e, a, b, c, d, F1, K1, x[11] );
- R( d, e, a, b, c, F1, K1, x[12] );
- R( c, d, e, a, b, F1, K1, x[13] );
- R( b, c, d, e, a, F1, K1, x[14] );
- R( a, b, c, d, e, F1, K1, x[15] );
- R( e, a, b, c, d, F1, K1, M(16) );
- R( d, e, a, b, c, F1, K1, M(17) );
- R( c, d, e, a, b, F1, K1, M(18) );
- R( b, c, d, e, a, F1, K1, M(19) );
- R( a, b, c, d, e, F2, K2, M(20) );
- R( e, a, b, c, d, F2, K2, M(21) );
- R( d, e, a, b, c, F2, K2, M(22) );
- R( c, d, e, a, b, F2, K2, M(23) );
- R( b, c, d, e, a, F2, K2, M(24) );
- R( a, b, c, d, e, F2, K2, M(25) );
- R( e, a, b, c, d, F2, K2, M(26) );
- R( d, e, a, b, c, F2, K2, M(27) );
- R( c, d, e, a, b, F2, K2, M(28) );
- R( b, c, d, e, a, F2, K2, M(29) );
- R( a, b, c, d, e, F2, K2, M(30) );
- R( e, a, b, c, d, F2, K2, M(31) );
- R( d, e, a, b, c, F2, K2, M(32) );
- R( c, d, e, a, b, F2, K2, M(33) );
- R( b, c, d, e, a, F2, K2, M(34) );
- R( a, b, c, d, e, F2, K2, M(35) );
- R( e, a, b, c, d, F2, K2, M(36) );
- R( d, e, a, b, c, F2, K2, M(37) );
- R( c, d, e, a, b, F2, K2, M(38) );
- R( b, c, d, e, a, F2, K2, M(39) );
- R( a, b, c, d, e, F3, K3, M(40) );
- R( e, a, b, c, d, F3, K3, M(41) );
- R( d, e, a, b, c, F3, K3, M(42) );
- R( c, d, e, a, b, F3, K3, M(43) );
- R( b, c, d, e, a, F3, K3, M(44) );
- R( a, b, c, d, e, F3, K3, M(45) );
- R( e, a, b, c, d, F3, K3, M(46) );
- R( d, e, a, b, c, F3, K3, M(47) );
- R( c, d, e, a, b, F3, K3, M(48) );
- R( b, c, d, e, a, F3, K3, M(49) );
- R( a, b, c, d, e, F3, K3, M(50) );
- R( e, a, b, c, d, F3, K3, M(51) );
- R( d, e, a, b, c, F3, K3, M(52) );
- R( c, d, e, a, b, F3, K3, M(53) );
- R( b, c, d, e, a, F3, K3, M(54) );
- R( a, b, c, d, e, F3, K3, M(55) );
- R( e, a, b, c, d, F3, K3, M(56) );
- R( d, e, a, b, c, F3, K3, M(57) );
- R( c, d, e, a, b, F3, K3, M(58) );
- R( b, c, d, e, a, F3, K3, M(59) );
- R( a, b, c, d, e, F4, K4, M(60) );
- R( e, a, b, c, d, F4, K4, M(61) );
- R( d, e, a, b, c, F4, K4, M(62) );
- R( c, d, e, a, b, F4, K4, M(63) );
- R( b, c, d, e, a, F4, K4, M(64) );
- R( a, b, c, d, e, F4, K4, M(65) );
- R( e, a, b, c, d, F4, K4, M(66) );
- R( d, e, a, b, c, F4, K4, M(67) );
- R( c, d, e, a, b, F4, K4, M(68) );
- R( b, c, d, e, a, F4, K4, M(69) );
- R( a, b, c, d, e, F4, K4, M(70) );
- R( e, a, b, c, d, F4, K4, M(71) );
- R( d, e, a, b, c, F4, K4, M(72) );
- R( c, d, e, a, b, F4, K4, M(73) );
- R( b, c, d, e, a, F4, K4, M(74) );
- R( a, b, c, d, e, F4, K4, M(75) );
- R( e, a, b, c, d, F4, K4, M(76) );
- R( d, e, a, b, c, F4, K4, M(77) );
- R( c, d, e, a, b, F4, K4, M(78) );
- R( b, c, d, e, a, F4, K4, M(79) );
-
- a = ctx->A += a;
- b = ctx->B += b;
- c = ctx->C += c;
- d = ctx->D += d;
- e = ctx->E += e;
- }
-}
-
-#endif
-
-/*
- * Hey Emacs!
- * Local Variables:
- * coding: utf-8
- * End:
- */
diff --git a/cross/lib/sha1.h b/cross/lib/sha1.h
deleted file mode 100644
index 5a58b567ceb..00000000000
--- a/cross/lib/sha1.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/* Declarations of functions and data types used for SHA1 sum
- library functions.
- Copyright (C) 2000-2001, 2003, 2005-2006, 2008-2023 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 SHA1_H
-# define SHA1_H 1
-
-# include <stdio.h>
-# include <stdint.h>
-
-# if HAVE_OPENSSL_SHA1
-# 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
-
-# define SHA1_DIGEST_SIZE 20
-
-# if HAVE_OPENSSL_SHA1
-# define GL_OPENSSL_NAME 1
-# include "gl_openssl.h"
-# else
-/* Structure to save state of computation between the single steps. */
-struct sha1_ctx
-{
- uint32_t A;
- uint32_t B;
- uint32_t C;
- uint32_t D;
- uint32_t E;
-
- uint32_t total[2];
- uint32_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 sha1_init_ctx (struct sha1_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 sha1_process_block (const void *buffer, size_t len,
- struct sha1_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 sha1_process_bytes (const void *buffer, size_t len,
- struct sha1_ctx *ctx);
-
-/* Process the remaining bytes in the buffer and put result from CTX
- in first 20 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 *sha1_finish_ctx (struct sha1_ctx *ctx, void *restrict resbuf);
-
-
-/* Put result from CTX in first 20 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 *sha1_read_ctx (const struct sha1_ctx *ctx, void *restrict resbuf);
-
-
-/* Compute SHA1 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 *sha1_buffer (const char *buffer, size_t len,
- void *restrict resblock);
-
-# endif
-
-/* Compute SHA1 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 20 bytes
- beginning at RESBLOCK. */
-extern int sha1_stream (FILE *stream, void *resblock);
-
-
-# ifdef __cplusplus
-}
-# endif
-
-#endif
-
-/*
- * Hey Emacs!
- * Local Variables:
- * coding: utf-8
- * End:
- */
diff --git a/cross/lib/sha256.c b/cross/lib/sha256.c
deleted file mode 100644
index e5fea02bc2e..00000000000
--- a/cross/lib/sha256.c
+++ /dev/null
@@ -1,432 +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-2023 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 <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/cross/lib/sha256.h b/cross/lib/sha256.h
deleted file mode 100644
index 2879477e89c..00000000000
--- a/cross/lib/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-2023 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/cross/lib/sha512.c b/cross/lib/sha512.c
deleted file mode 100644
index 8ca7fa319f5..00000000000
--- a/cross/lib/sha512.c
+++ /dev/null
@@ -1,477 +0,0 @@
-/* sha512.c - Functions to compute SHA512 and SHA384 message digest of files or
- memory blocks according to the NIST specification FIPS-180-2.
-
- Copyright (C) 2005-2006, 2008-2023 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_SHA512
-# define GL_OPENSSL_INLINE _GL_EXTERN_INLINE
-#endif
-#include "sha512.h"
-
-#include <stdint.h>
-#include <string.h>
-
-#include <byteswap.h>
-#ifdef WORDS_BIGENDIAN
-# define SWAP(n) (n)
-#else
-# define SWAP(n) bswap_64 (n)
-#endif
-
-#if ! HAVE_OPENSSL_SHA512
-
-/* This array contains the bytes used to pad the buffer to the next
- 128-byte boundary. */
-static const unsigned char fillbuf[128] = { 0x80, 0 /* , 0, 0, ... */ };
-
-
-/*
- Takes a pointer to a 512 bit block of data (eight 64 bit ints) and
- initializes it to the start constants of the SHA512 algorithm. This
- must be called before using hash in the call to sha512_hash
-*/
-void
-sha512_init_ctx (struct sha512_ctx *ctx)
-{
- ctx->state[0] = u64hilo (0x6a09e667, 0xf3bcc908);
- ctx->state[1] = u64hilo (0xbb67ae85, 0x84caa73b);
- ctx->state[2] = u64hilo (0x3c6ef372, 0xfe94f82b);
- ctx->state[3] = u64hilo (0xa54ff53a, 0x5f1d36f1);
- ctx->state[4] = u64hilo (0x510e527f, 0xade682d1);
- ctx->state[5] = u64hilo (0x9b05688c, 0x2b3e6c1f);
- ctx->state[6] = u64hilo (0x1f83d9ab, 0xfb41bd6b);
- ctx->state[7] = u64hilo (0x5be0cd19, 0x137e2179);
-
- ctx->total[0] = ctx->total[1] = u64lo (0);
- ctx->buflen = 0;
-}
-
-void
-sha384_init_ctx (struct sha512_ctx *ctx)
-{
- ctx->state[0] = u64hilo (0xcbbb9d5d, 0xc1059ed8);
- ctx->state[1] = u64hilo (0x629a292a, 0x367cd507);
- ctx->state[2] = u64hilo (0x9159015a, 0x3070dd17);
- ctx->state[3] = u64hilo (0x152fecd8, 0xf70e5939);
- ctx->state[4] = u64hilo (0x67332667, 0xffc00b31);
- ctx->state[5] = u64hilo (0x8eb44a87, 0x68581511);
- ctx->state[6] = u64hilo (0xdb0c2e0d, 0x64f98fa7);
- ctx->state[7] = u64hilo (0x47b5481d, 0xbefa4fa4);
-
- ctx->total[0] = ctx->total[1] = u64lo (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_uint64 (char *cp, u64 v)
-{
- memcpy (cp, &v, sizeof v);
-}
-
-/* Put result from CTX in first 64 bytes following RESBUF.
- The result must be in little endian byte order. */
-void *
-sha512_read_ctx (const struct sha512_ctx *ctx, void *resbuf)
-{
- int i;
- char *r = resbuf;
-
- for (i = 0; i < 8; i++)
- set_uint64 (r + i * sizeof ctx->state[0], SWAP (ctx->state[i]));
-
- return resbuf;
-}
-
-void *
-sha384_read_ctx (const struct sha512_ctx *ctx, void *resbuf)
-{
- int i;
- char *r = resbuf;
-
- for (i = 0; i < 6; i++)
- set_uint64 (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
-sha512_conclude_ctx (struct sha512_ctx *ctx)
-{
- /* Take yet unprocessed bytes into account. */
- size_t bytes = ctx->buflen;
- size_t size = (bytes < 112) ? 128 / 8 : 128 * 2 / 8;
-
- /* Now count remaining bytes. */
- ctx->total[0] = u64plus (ctx->total[0], u64lo (bytes));
- if (u64lt (ctx->total[0], u64lo (bytes)))
- ctx->total[1] = u64plus (ctx->total[1], u64lo (1));
-
- /* Put the 128-bit file length in *bits* at the end of the buffer.
- Use set_uint64 rather than a simple assignment, to avoid risk of
- unaligned access. */
- set_uint64 ((char *) &ctx->buffer[size - 2],
- SWAP (u64or (u64shl (ctx->total[1], 3),
- u64shr (ctx->total[0], 61))));
- set_uint64 ((char *) &ctx->buffer[size - 1],
- SWAP (u64shl (ctx->total[0], 3)));
-
- memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 8 - bytes);
-
- /* Process last bytes. */
- sha512_process_block (ctx->buffer, size * 8, ctx);
-}
-
-void *
-sha512_finish_ctx (struct sha512_ctx *ctx, void *resbuf)
-{
- sha512_conclude_ctx (ctx);
- return sha512_read_ctx (ctx, resbuf);
-}
-
-void *
-sha384_finish_ctx (struct sha512_ctx *ctx, void *resbuf)
-{
- sha512_conclude_ctx (ctx);
- return sha384_read_ctx (ctx, resbuf);
-}
-
-/* Compute SHA512 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 *
-sha512_buffer (const char *buffer, size_t len, void *resblock)
-{
- struct sha512_ctx ctx;
-
- /* Initialize the computation context. */
- sha512_init_ctx (&ctx);
-
- /* Process whole buffer but last len % 128 bytes. */
- sha512_process_bytes (buffer, len, &ctx);
-
- /* Put result in desired memory area. */
- return sha512_finish_ctx (&ctx, resblock);
-}
-
-void *
-sha384_buffer (const char *buffer, size_t len, void *resblock)
-{
- struct sha512_ctx ctx;
-
- /* Initialize the computation context. */
- sha384_init_ctx (&ctx);
-
- /* Process whole buffer but last len % 128 bytes. */
- sha512_process_bytes (buffer, len, &ctx);
-
- /* Put result in desired memory area. */
- return sha384_finish_ctx (&ctx, resblock);
-}
-
-void
-sha512_process_bytes (const void *buffer, size_t len, struct sha512_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 = 256 - left_over > len ? len : 256 - left_over;
-
- memcpy (&((char *) ctx->buffer)[left_over], buffer, add);
- ctx->buflen += add;
-
- if (ctx->buflen > 128)
- {
- sha512_process_block (ctx->buffer, ctx->buflen & ~127, ctx);
-
- ctx->buflen &= 127;
- /* The regions in the following copy operation cannot overlap,
- because ctx->buflen < 128 ≤ (left_over + add) & ~127. */
- memcpy (ctx->buffer,
- &((char *) ctx->buffer)[(left_over + add) & ~127],
- ctx->buflen);
- }
-
- buffer = (const char *) buffer + add;
- len -= add;
- }
-
- /* Process available complete blocks. */
- if (len >= 128)
- {
-#if !(_STRING_ARCH_unaligned || _STRING_INLINE_unaligned)
-# define UNALIGNED_P(p) ((uintptr_t) (p) % alignof (u64) != 0)
- if (UNALIGNED_P (buffer))
- while (len > 128)
- {
- sha512_process_block (memcpy (ctx->buffer, buffer, 128), 128, ctx);
- buffer = (const char *) buffer + 128;
- len -= 128;
- }
- else
-#endif
- {
- sha512_process_block (buffer, len & ~127, ctx);
- buffer = (const char *) buffer + (len & ~127);
- len &= 127;
- }
- }
-
- /* 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 >= 128)
- {
- sha512_process_block (ctx->buffer, 128, ctx);
- left_over -= 128;
- /* The regions in the following copy operation cannot overlap,
- because left_over ≤ 128. */
- memcpy (ctx->buffer, &ctx->buffer[16], left_over);
- }
- ctx->buflen = left_over;
- }
-}
-
-/* --- Code below is the primary difference between sha1.c and sha512.c --- */
-
-/* SHA512 round constants */
-#define K(I) sha512_round_constants[I]
-static u64 const sha512_round_constants[80] = {
- u64init (0x428a2f98, 0xd728ae22), u64init (0x71374491, 0x23ef65cd),
- u64init (0xb5c0fbcf, 0xec4d3b2f), u64init (0xe9b5dba5, 0x8189dbbc),
- u64init (0x3956c25b, 0xf348b538), u64init (0x59f111f1, 0xb605d019),
- u64init (0x923f82a4, 0xaf194f9b), u64init (0xab1c5ed5, 0xda6d8118),
- u64init (0xd807aa98, 0xa3030242), u64init (0x12835b01, 0x45706fbe),
- u64init (0x243185be, 0x4ee4b28c), u64init (0x550c7dc3, 0xd5ffb4e2),
- u64init (0x72be5d74, 0xf27b896f), u64init (0x80deb1fe, 0x3b1696b1),
- u64init (0x9bdc06a7, 0x25c71235), u64init (0xc19bf174, 0xcf692694),
- u64init (0xe49b69c1, 0x9ef14ad2), u64init (0xefbe4786, 0x384f25e3),
- u64init (0x0fc19dc6, 0x8b8cd5b5), u64init (0x240ca1cc, 0x77ac9c65),
- u64init (0x2de92c6f, 0x592b0275), u64init (0x4a7484aa, 0x6ea6e483),
- u64init (0x5cb0a9dc, 0xbd41fbd4), u64init (0x76f988da, 0x831153b5),
- u64init (0x983e5152, 0xee66dfab), u64init (0xa831c66d, 0x2db43210),
- u64init (0xb00327c8, 0x98fb213f), u64init (0xbf597fc7, 0xbeef0ee4),
- u64init (0xc6e00bf3, 0x3da88fc2), u64init (0xd5a79147, 0x930aa725),
- u64init (0x06ca6351, 0xe003826f), u64init (0x14292967, 0x0a0e6e70),
- u64init (0x27b70a85, 0x46d22ffc), u64init (0x2e1b2138, 0x5c26c926),
- u64init (0x4d2c6dfc, 0x5ac42aed), u64init (0x53380d13, 0x9d95b3df),
- u64init (0x650a7354, 0x8baf63de), u64init (0x766a0abb, 0x3c77b2a8),
- u64init (0x81c2c92e, 0x47edaee6), u64init (0x92722c85, 0x1482353b),
- u64init (0xa2bfe8a1, 0x4cf10364), u64init (0xa81a664b, 0xbc423001),
- u64init (0xc24b8b70, 0xd0f89791), u64init (0xc76c51a3, 0x0654be30),
- u64init (0xd192e819, 0xd6ef5218), u64init (0xd6990624, 0x5565a910),
- u64init (0xf40e3585, 0x5771202a), u64init (0x106aa070, 0x32bbd1b8),
- u64init (0x19a4c116, 0xb8d2d0c8), u64init (0x1e376c08, 0x5141ab53),
- u64init (0x2748774c, 0xdf8eeb99), u64init (0x34b0bcb5, 0xe19b48a8),
- u64init (0x391c0cb3, 0xc5c95a63), u64init (0x4ed8aa4a, 0xe3418acb),
- u64init (0x5b9cca4f, 0x7763e373), u64init (0x682e6ff3, 0xd6b2b8a3),
- u64init (0x748f82ee, 0x5defb2fc), u64init (0x78a5636f, 0x43172f60),
- u64init (0x84c87814, 0xa1f0ab72), u64init (0x8cc70208, 0x1a6439ec),
- u64init (0x90befffa, 0x23631e28), u64init (0xa4506ceb, 0xde82bde9),
- u64init (0xbef9a3f7, 0xb2c67915), u64init (0xc67178f2, 0xe372532b),
- u64init (0xca273ece, 0xea26619c), u64init (0xd186b8c7, 0x21c0c207),
- u64init (0xeada7dd6, 0xcde0eb1e), u64init (0xf57d4f7f, 0xee6ed178),
- u64init (0x06f067aa, 0x72176fba), u64init (0x0a637dc5, 0xa2c898a6),
- u64init (0x113f9804, 0xbef90dae), u64init (0x1b710b35, 0x131c471b),
- u64init (0x28db77f5, 0x23047d84), u64init (0x32caab7b, 0x40c72493),
- u64init (0x3c9ebe0a, 0x15c9bebc), u64init (0x431d67c4, 0x9c100d4c),
- u64init (0x4cc5d4be, 0xcb3e42b6), u64init (0x597f299c, 0xfc657e2a),
- u64init (0x5fcb6fab, 0x3ad6faec), u64init (0x6c44198c, 0x4a475817),
-};
-
-/* Round functions. */
-#define F2(A, B, C) u64or (u64and (A, B), u64and (C, u64or (A, B)))
-#define F1(E, F, G) u64xor (G, u64and (E, u64xor (F, G)))
-
-/* Process LEN bytes of BUFFER, accumulating context into CTX.
- It is assumed that LEN % 128 == 0.
- Most of this code comes from GnuPG's cipher/sha1.c. */
-
-void
-sha512_process_block (const void *buffer, size_t len, struct sha512_ctx *ctx)
-{
- u64 const *words = buffer;
- u64 const *endp = words + len / sizeof (u64);
- u64 x[16];
- u64 a = ctx->state[0];
- u64 b = ctx->state[1];
- u64 c = ctx->state[2];
- u64 d = ctx->state[3];
- u64 e = ctx->state[4];
- u64 f = ctx->state[5];
- u64 g = ctx->state[6];
- u64 h = ctx->state[7];
- u64 lolen = u64size (len);
-
- /* First increment the byte count. FIPS PUB 180-2 specifies the possible
- length of the file up to 2^128 bits. Here we only compute the
- number of bytes. Do a double word increment. */
- ctx->total[0] = u64plus (ctx->total[0], lolen);
- ctx->total[1] = u64plus (ctx->total[1],
- u64plus (u64size (len >> 31 >> 31 >> 2),
- u64lo (u64lt (ctx->total[0], lolen))));
-
-#define S0(x) u64xor (u64rol(x, 63), u64xor (u64rol (x, 56), u64shr (x, 7)))
-#define S1(x) u64xor (u64rol (x, 45), u64xor (u64rol (x, 3), u64shr (x, 6)))
-#define SS0(x) u64xor (u64rol (x, 36), u64xor (u64rol (x, 30), u64rol (x, 25)))
-#define SS1(x) u64xor (u64rol(x, 50), u64xor (u64rol (x, 46), u64rol (x, 23)))
-
-#define M(I) (x[(I) & 15] \
- = u64plus (x[(I) & 15], \
- u64plus (S1 (x[((I) - 2) & 15]), \
- u64plus (x[((I) - 7) & 15], \
- S0 (x[((I) - 15) & 15])))))
-
-#define R(A, B, C, D, E, F, G, H, K, M) \
- do \
- { \
- u64 t0 = u64plus (SS0 (A), F2 (A, B, C)); \
- u64 t1 = \
- u64plus (H, u64plus (SS1 (E), \
- u64plus (F1 (E, F, G), u64plus (K, M)))); \
- D = u64plus (D, t1); \
- H = u64plus (t0, t1); \
- } \
- while (0)
-
- while (words < endp)
- {
- 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) );
- R( a, b, c, d, e, f, g, h, K(64), M(64) );
- R( h, a, b, c, d, e, f, g, K(65), M(65) );
- R( g, h, a, b, c, d, e, f, K(66), M(66) );
- R( f, g, h, a, b, c, d, e, K(67), M(67) );
- R( e, f, g, h, a, b, c, d, K(68), M(68) );
- R( d, e, f, g, h, a, b, c, K(69), M(69) );
- R( c, d, e, f, g, h, a, b, K(70), M(70) );
- R( b, c, d, e, f, g, h, a, K(71), M(71) );
- R( a, b, c, d, e, f, g, h, K(72), M(72) );
- R( h, a, b, c, d, e, f, g, K(73), M(73) );
- R( g, h, a, b, c, d, e, f, K(74), M(74) );
- R( f, g, h, a, b, c, d, e, K(75), M(75) );
- R( e, f, g, h, a, b, c, d, K(76), M(76) );
- R( d, e, f, g, h, a, b, c, K(77), M(77) );
- R( c, d, e, f, g, h, a, b, K(78), M(78) );
- R( b, c, d, e, f, g, h, a, K(79), M(79) );
-
- a = ctx->state[0] = u64plus (ctx->state[0], a);
- b = ctx->state[1] = u64plus (ctx->state[1], b);
- c = ctx->state[2] = u64plus (ctx->state[2], c);
- d = ctx->state[3] = u64plus (ctx->state[3], d);
- e = ctx->state[4] = u64plus (ctx->state[4], e);
- f = ctx->state[5] = u64plus (ctx->state[5], f);
- g = ctx->state[6] = u64plus (ctx->state[6], g);
- h = ctx->state[7] = u64plus (ctx->state[7], h);
- }
-}
-
-#endif
-
-/*
- * Hey Emacs!
- * Local Variables:
- * coding: utf-8
- * End:
- */
diff --git a/cross/lib/sha512.h b/cross/lib/sha512.h
deleted file mode 100644
index e3a98a2644c..00000000000
--- a/cross/lib/sha512.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/* Declarations of functions and data types used for SHA512 and SHA384 sum
- library functions.
- Copyright (C) 2005-2006, 2008-2023 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 SHA512_H
-# define SHA512_H 1
-
-# include <stdio.h>
-# include "u64.h"
-
-# if HAVE_OPENSSL_SHA512
-# 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 { SHA384_DIGEST_SIZE = 384 / 8 };
-enum { SHA512_DIGEST_SIZE = 512 / 8 };
-
-# if HAVE_OPENSSL_SHA512
-# define GL_OPENSSL_NAME 384
-# include "gl_openssl.h"
-# define GL_OPENSSL_NAME 512
-# include "gl_openssl.h"
-# else
-/* Structure to save state of computation between the single steps. */
-struct sha512_ctx
-{
- u64 state[8];
-
- u64 total[2];
- size_t buflen; /* ≥ 0, ≤ 256 */
- u64 buffer[32]; /* 256 bytes; the first buflen bytes are in use */
-};
-
-/* Initialize structure containing state of computation. */
-extern void sha512_init_ctx (struct sha512_ctx *ctx);
-extern void sha384_init_ctx (struct sha512_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 128!!! */
-extern void sha512_process_block (const void *buffer, size_t len,
- struct sha512_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 128. */
-extern void sha512_process_bytes (const void *buffer, size_t len,
- struct sha512_ctx *ctx);
-
-/* Process the remaining bytes in the buffer and put result from CTX
- in first 64 (48) 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 *sha512_finish_ctx (struct sha512_ctx *ctx, void *restrict resbuf);
-extern void *sha384_finish_ctx (struct sha512_ctx *ctx, void *restrict resbuf);
-
-
-/* Put result from CTX in first 64 (48) 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.
-
- IMPORTANT: On some systems it is required that RESBUF is correctly
- aligned for a 32 bits value. */
-extern void *sha512_read_ctx (const struct sha512_ctx *ctx,
- void *restrict resbuf);
-extern void *sha384_read_ctx (const struct sha512_ctx *ctx,
- void *restrict resbuf);
-
-
-/* Compute SHA512 (SHA384) 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 *sha512_buffer (const char *buffer, size_t len,
- void *restrict resblock);
-extern void *sha384_buffer (const char *buffer, size_t len,
- void *restrict resblock);
-
-# endif
-
-/* Compute SHA512 (SHA384) 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 64 (48) bytes
- beginning at RESBLOCK. */
-extern int sha512_stream (FILE *stream, void *resblock);
-extern int sha384_stream (FILE *stream, void *resblock);
-
-
-# ifdef __cplusplus
-}
-# endif
-
-#endif
-
-/*
- * Hey Emacs!
- * Local Variables:
- * coding: utf-8
- * End:
- */
diff --git a/cross/lib/sig2str.c b/cross/lib/sig2str.c
deleted file mode 100644
index c5219caaaed..00000000000
--- a/cross/lib/sig2str.c
+++ /dev/null
@@ -1,364 +0,0 @@
-/* sig2str.c -- convert between signal names and numbers
-
- Copyright (C) 2002, 2004, 2006, 2009-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert. */
-
-#include <config.h>
-
-#include <limits.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "sig2str.h"
-
-#ifndef SIGRTMIN
-# define SIGRTMIN 0
-# undef SIGRTMAX
-#endif
-#ifndef SIGRTMAX
-# define SIGRTMAX (SIGRTMIN - 1)
-#endif
-
-#define NUMNAME(name) { SIG##name, #name }
-
-/* Signal names and numbers. Put the preferred name first. */
-static struct numname { int num; char const name[8]; } numname_table[] =
- {
- /* Signals required by POSIX 1003.1-2001 base, listed in
- traditional numeric order where possible. */
-#ifdef SIGHUP
- NUMNAME (HUP),
-#endif
-#ifdef SIGINT
- NUMNAME (INT),
-#endif
-#ifdef SIGQUIT
- NUMNAME (QUIT),
-#endif
-#ifdef SIGILL
- NUMNAME (ILL),
-#endif
-#ifdef SIGTRAP
- NUMNAME (TRAP),
-#endif
-#ifdef SIGABRT
- NUMNAME (ABRT),
-#endif
-#ifdef SIGFPE
- NUMNAME (FPE),
-#endif
-#ifdef SIGKILL
- NUMNAME (KILL),
-#endif
-#ifdef SIGSEGV
- NUMNAME (SEGV),
-#endif
- /* On Haiku, SIGSEGV == SIGBUS, but we prefer SIGSEGV to match
- strsignal.c output, so SIGBUS must be listed second. */
-#ifdef SIGBUS
- NUMNAME (BUS),
-#endif
-#ifdef SIGPIPE
- NUMNAME (PIPE),
-#endif
-#ifdef SIGALRM
- NUMNAME (ALRM),
-#endif
-#ifdef SIGTERM
- NUMNAME (TERM),
-#endif
-#ifdef SIGUSR1
- NUMNAME (USR1),
-#endif
-#ifdef SIGUSR2
- NUMNAME (USR2),
-#endif
-#ifdef SIGCHLD
- NUMNAME (CHLD),
-#endif
-#ifdef SIGURG
- NUMNAME (URG),
-#endif
-#ifdef SIGSTOP
- NUMNAME (STOP),
-#endif
-#ifdef SIGTSTP
- NUMNAME (TSTP),
-#endif
-#ifdef SIGCONT
- NUMNAME (CONT),
-#endif
-#ifdef SIGTTIN
- NUMNAME (TTIN),
-#endif
-#ifdef SIGTTOU
- NUMNAME (TTOU),
-#endif
-
- /* Signals required by POSIX 1003.1-2001 with the XSI extension. */
-#ifdef SIGSYS
- NUMNAME (SYS),
-#endif
-#ifdef SIGPOLL
- NUMNAME (POLL),
-#endif
-#ifdef SIGVTALRM
- NUMNAME (VTALRM),
-#endif
-#ifdef SIGPROF
- NUMNAME (PROF),
-#endif
-#ifdef SIGXCPU
- NUMNAME (XCPU),
-#endif
-#ifdef SIGXFSZ
- NUMNAME (XFSZ),
-#endif
-
- /* Unix Version 7. */
-#ifdef SIGIOT
- NUMNAME (IOT), /* Older name for ABRT. */
-#endif
-#ifdef SIGEMT
- NUMNAME (EMT),
-#endif
-
- /* USG Unix. */
-#ifdef SIGPHONE
- NUMNAME (PHONE),
-#endif
-#ifdef SIGWIND
- NUMNAME (WIND),
-#endif
-
- /* Unix System V. */
-#ifdef SIGCLD
- NUMNAME (CLD),
-#endif
-#ifdef SIGPWR
- NUMNAME (PWR),
-#endif
-
- /* GNU/Linux 2.2 and Solaris 8. */
-#ifdef SIGCANCEL
- NUMNAME (CANCEL),
-#endif
-#ifdef SIGLWP
- NUMNAME (LWP),
-#endif
-#ifdef SIGWAITING
- NUMNAME (WAITING),
-#endif
-#ifdef SIGFREEZE
- NUMNAME (FREEZE),
-#endif
-#ifdef SIGTHAW
- NUMNAME (THAW),
-#endif
-#ifdef SIGLOST
- NUMNAME (LOST),
-#endif
-#ifdef SIGWINCH
- NUMNAME (WINCH),
-#endif
-
- /* GNU/Linux 2.2. */
-#ifdef SIGINFO
- NUMNAME (INFO),
-#endif
-#ifdef SIGIO
- NUMNAME (IO),
-#endif
-#ifdef SIGSTKFLT
- NUMNAME (STKFLT),
-#endif
-
- /* AIX 7. */
-#ifdef SIGCPUFAIL
- NUMNAME (CPUFAIL),
-#endif
-
- /* AIX 5L. */
-#ifdef SIGDANGER
- NUMNAME (DANGER),
-#endif
-#ifdef SIGGRANT
- NUMNAME (GRANT),
-#endif
-#ifdef SIGMIGRATE
- NUMNAME (MIGRATE),
-#endif
-#ifdef SIGMSG
- NUMNAME (MSG),
-#endif
-#ifdef SIGPRE
- NUMNAME (PRE),
-#endif
-#ifdef SIGRETRACT
- NUMNAME (RETRACT),
-#endif
-#ifdef SIGSAK
- NUMNAME (SAK),
-#endif
-#ifdef SIGSOUND
- NUMNAME (SOUND),
-#endif
-
- /* Older AIX versions. */
-#ifdef SIGALRM1
- NUMNAME (ALRM1), /* unknown; taken from Bash 2.05 */
-#endif
-#ifdef SIGKAP
- NUMNAME (KAP), /* Older name for SIGGRANT. */
-#endif
-#ifdef SIGVIRT
- NUMNAME (VIRT), /* unknown; taken from Bash 2.05 */
-#endif
-#ifdef SIGWINDOW
- NUMNAME (WINDOW), /* Older name for SIGWINCH. */
-#endif
-
- /* OpenBSD. */
-#ifdef SIGTHR
- NUMNAME (THR),
-#endif
-
- /* BeOS, Haiku */
-#ifdef SIGKILLTHR
- NUMNAME (KILLTHR),
-#endif
-
- /* Older HP-UX versions. */
-#ifdef SIGDIL
- NUMNAME (DIL),
-#endif
-
- /* native Windows */
-#ifdef SIGBREAK
- NUMNAME (BREAK),
-#endif
-
- /* Korn shell and Bash, of uncertain vintage. */
- { 0, "EXIT" }
- };
-
-#define NUMNAME_ENTRIES (sizeof numname_table / sizeof numname_table[0])
-
-/* ISDIGIT differs from isdigit, as follows:
- - Its arg may be any int or unsigned int; it need not be an unsigned char
- or EOF.
- - It's typically faster.
- POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to
- isdigit unless it's important to use the locale's definition
- of "digit" even when the host does not conform to POSIX. */
-#define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)
-
-/* Convert the signal name SIGNAME to a signal number. Return the
- signal number if successful, -1 otherwise. */
-
-static int
-str2signum (char const *signame)
-{
- if (ISDIGIT (*signame))
- {
- char *endp;
- long int n = strtol (signame, &endp, 10);
- if (! *endp && n <= SIGNUM_BOUND)
- return n;
- }
- else
- {
- unsigned int i;
- for (i = 0; i < NUMNAME_ENTRIES; i++)
- if (strcmp (numname_table[i].name, signame) == 0)
- return numname_table[i].num;
-
- {
- char *endp;
- int rtmin = SIGRTMIN;
- int rtmax = SIGRTMAX;
-
- if (0 < rtmin && strncmp (signame, "RTMIN", 5) == 0)
- {
- long int n = strtol (signame + 5, &endp, 10);
- if (! *endp && 0 <= n && n <= rtmax - rtmin)
- return rtmin + n;
- }
- else if (0 < rtmax && strncmp (signame, "RTMAX", 5) == 0)
- {
- long int n = strtol (signame + 5, &endp, 10);
- if (! *endp && rtmin - rtmax <= n && n <= 0)
- return rtmax + n;
- }
- }
- }
-
- return -1;
-}
-
-/* Convert the signal name SIGNAME to the signal number *SIGNUM.
- Return 0 if successful, -1 otherwise. */
-
-int
-str2sig (char const *signame, int *signum)
-{
- *signum = str2signum (signame);
- return *signum < 0 ? -1 : 0;
-}
-
-/* Convert SIGNUM to a signal name in SIGNAME. SIGNAME must point to
- a buffer of at least SIG2STR_MAX bytes. Return 0 if successful, -1
- otherwise. */
-
-int
-sig2str (int signum, char *signame)
-{
- unsigned int i;
- for (i = 0; i < NUMNAME_ENTRIES; i++)
- if (numname_table[i].num == signum)
- {
- strcpy (signame, numname_table[i].name);
- return 0;
- }
-
- {
- int rtmin = SIGRTMIN;
- int rtmax = SIGRTMAX;
- int base, delta;
-
- if (! (rtmin <= signum && signum <= rtmax))
- return -1;
-
- if (signum <= rtmin + (rtmax - rtmin) / 2)
- {
- strcpy (signame, "RTMIN");
- base = rtmin;
- }
- else
- {
- strcpy (signame, "RTMAX");
- base = rtmax;
- }
-
- delta = signum - base;
- if (delta != 0)
- sprintf (signame + 5, "%+d", delta);
- return 0;
- }
-}
diff --git a/cross/lib/sig2str.h b/cross/lib/sig2str.h
deleted file mode 100644
index 1e5253658e7..00000000000
--- a/cross/lib/sig2str.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* sig2str.h -- convert between signal names and numbers
-
- Copyright (C) 2002, 2005, 2009-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert. */
-
-#include <signal.h>
-
-/* Don't override system declarations of SIG2STR_MAX, sig2str, str2sig. */
-#ifndef SIG2STR_MAX
-
-# include "intprops.h"
-
-/* Size of a buffer needed to hold a signal name like "HUP". */
-# define SIG2STR_MAX (sizeof "SIGRTMAX" + INT_STRLEN_BOUND (int) - 1)
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int sig2str (int, char *);
-int str2sig (char const *, int *);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
-/* An upper bound on signal numbers allowed by the system. */
-
-#if defined _sys_nsig
-# define SIGNUM_BOUND (_sys_nsig - 1)
-#elif defined _SIG_MAXSIG
-# define SIGNUM_BOUND (_SIG_MAXSIG - 2) /* FreeBSD >= 7. */
-#elif defined NSIG
-# define SIGNUM_BOUND (NSIG - 1)
-#else
-# define SIGNUM_BOUND 64
-#endif
diff --git a/cross/lib/sigdescr_np.c b/cross/lib/sigdescr_np.c
deleted file mode 100644
index fc8a4ad47a2..00000000000
--- a/cross/lib/sigdescr_np.c
+++ /dev/null
@@ -1,376 +0,0 @@
-/* English descriptions of signals.
- Copyright (C) 2020-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Bruno Haible <bruno@clisp.org>, 2020. */
-
-#include <config.h>
-
-/* Specification. */
-#include <string.h>
-
-#include <signal.h>
-
-const char *
-sigdescr_np (int sig)
-{
- /* Note: Some platforms (glibc, FreeBSD, NetBSD, OpenBSD, AIX, IRIX, Haiku,
- Android) have an array 'sys_siglist'. (On AIX, you need to declare it
- yourself, and it has fewer than NSIG elements.) Its contents varies
- depending on the OS.
- On other OSes, you can invoke strsignal (sig) in the C locale.
- In the code below, we show the differences.
- You can see how cryptic some of these strings are. We try to pick more
- understandable wordings. */
-
- switch (sig)
- {
- /* Signals specified by ISO C. */
- case SIGABRT:
- /* glibc: "Aborted". *BSD: "Abort trap". Solaris: "Abort". */
- return "Aborted";
- case SIGFPE:
- /* glibc, *BSD: "Floating point exception". Solaris: "Arithmetic exception".
- The latter is more correct, because of integer division by 0 or -1. */
- return "Arithmetic exception";
- case SIGILL:
- return "Illegal instruction";
- case SIGINT:
- return "Interrupt";
- case SIGSEGV:
- return "Segmentation fault";
- case SIGTERM:
- return "Terminated";
-
- /* Signals specified by POSIX.
- <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html> */
- #if defined SIGALRM
- case SIGALRM:
- return "Alarm clock";
- #endif
- #if defined SIGBUS
- case SIGBUS:
- return "Bus error";
- #endif
- #if defined SIGCHLD
- case SIGCHLD:
- /* glibc, *BSD: "Child exited". Solaris: "Child status changed". */
- return "Child stopped or exited";
- #endif
- #if defined SIGCONT
- case SIGCONT:
- return "Continued";
- #endif
- #if defined SIGHUP
- case SIGHUP:
- return "Hangup";
- #endif
- #if defined SIGKILL
- case SIGKILL:
- return "Killed";
- #endif
- #if defined SIGPIPE
- case SIGPIPE:
- return "Broken pipe";
- #endif
- #if defined SIGQUIT
- case SIGQUIT:
- return "Quit";
- #endif
- #if defined SIGSTOP
- case SIGSTOP:
- /* glibc, Solaris: "Stopped (signal)". *BSD: "Suspended (signal)". */
- return "Stopped (signal)";
- #endif
- #if defined SIGTSTP
- case SIGTSTP:
- /* glibc: "Stopped". *BSD: "Suspended". Solaris: "Stopped (user)". */
- return "Stopped";
- #endif
- #if defined SIGTTIN
- case SIGTTIN:
- return "Stopped (tty input)";
- #endif
- #if defined SIGTTOU
- case SIGTTOU:
- return "Stopped (tty output)";
- #endif
- #if defined SIGUSR1
- case SIGUSR1:
- /* glibc, *BSD: "User defined signal 1". Solaris: "User signal 1". */
- return "User defined signal 1";
- #endif
- #if defined SIGUSR2
- case SIGUSR2:
- /* glibc, *BSD: "User defined signal 2". Solaris: "User signal 2". */
- return "User defined signal 2";
- #endif
- #if defined SIGPOLL
- case SIGPOLL:
- /* glibc: "I/O possible". Solaris: "Pollable event". */
- return "I/O possible";
- #endif
- #if defined SIGPROF
- case SIGPROF:
- return "Profiling timer expired";
- #endif
- #if defined SIGSYS
- case SIGSYS:
- return "Bad system call";
- #endif
- #if defined SIGTRAP
- case SIGTRAP:
- /* glibc, Solaris: "Trace/breakpoint trap". *BSD: "Trace/BPT trap". */
- return "Trace/breakpoint trap";
- #endif
- #if defined SIGURG
- case SIGURG:
- /* glibc, *BSD: "Urgent I/O condition". Solaris: "Urgent socket condition". */
- return "Urgent I/O condition";
- #endif
- #if defined SIGVTALRM
- case SIGVTALRM:
- return "Virtual timer expired";
- #endif
- #if defined SIGXCPU
- case SIGXCPU:
- /* glibc, *BSD: "CPU time limit exceeded". Solaris: "Cpu limit exceeded". */
- return "CPU time limit exceeded";
- #endif
- #if defined SIGXFSZ
- case SIGXFSZ:
- return "File size limit exceeded";
- #endif
-
- /* Other signals on other systems. */
- /* native Windows */
- #if defined SIGBREAK
- case SIGBREAK:
- return "Ctrl-Break";
- #endif
- /* IRIX */
- #if defined SIGCKPT
- case SIGCKPT:
- return "Checkpoint"; /* See man 1 cpr, man 3C atcheckpoint */
- #endif
- /* Linux, IRIX, Cygwin */
- #if defined SIGCLD && SIGCLD != SIGCHLD
- case SIGCLD:
- return "Child stopped or exited";
- #endif
- /* AIX */
- #if defined SIGCPUFAIL
- case SIGCPUFAIL:
- /* AIX: "CPU failure predicted". */
- return "CPU going down"; /* See man bindprocessor */
- #endif
- /* AIX */
- #if defined SIGDANGER
- case SIGDANGER:
- /* AIX: "Paging space low". */
- return "Swap space nearly exhausted";
- #endif
- /* Mac OS X, FreeBSD, NetBSD, OpenBSD, Minix, AIX, IRIX, Cygwin, mingw */
- #if defined SIGEMT
- case SIGEMT:
- /* glibc/Hurd, *BSD: "EMT trap". Solaris: "Emulation trap". */
- return "Instruction emulation needed";
- #endif
- /* Mac OS X, FreeBSD, NetBSD, OpenBSD, Minix */
- #if defined SIGINFO && SIGINFO != SIGPWR
- case SIGINFO:
- return "Information request";
- #endif
- /* Linux, Mac OS X, FreeBSD, NetBSD, OpenBSD, Minix, AIX, IRIX, Cygwin */
- #if defined SIGIO && SIGIO != SIGPOLL
- case SIGIO:
- return "I/O possible";
- #endif
- /* Linux, IRIX, Cygwin, mingw */
- #if defined SIGIOT && SIGIOT != SIGABRT
- case SIGIOT:
- return "IOT instruction"; /* a PDP-11 instruction */
- #endif
- /* AIX */
- #if defined SIGKAP
- case SIGKAP:
- /* Process must issue a KSKAPACK ioctl, or will be killed in 30 seconds. */
- /* AIX: "Monitor mode granted". */
- return "Keep Alive Poll";
- #endif
- /* Haiku */
- #if defined SIGKILLTHR
- case SIGKILLTHR:
- return "Kill thread";
- #endif
- /* Minix */
- #if defined SIGKMEM
- case SIGKMEM:
- return "Kernel memory request";
- #endif
- /* Minix */
- #if defined SIGKMESS
- case SIGKMESS:
- return "Kernel message";
- #endif
- /* Minix */
- #if defined SIGKSIG
- case SIGKSIG:
- return "Kernel signal";
- #endif
- /* Minix */
- #if defined SIGKSIGSM
- case SIGKSIGSM:
- return "Kernel signal for signal manager";
- #endif
- /* FreeBSD */
- #if defined SIGLIBRT
- case SIGLIBRT:
- return "Real-time library interrupt";
- #endif
- /* Cygwin */
- #if defined SIGLOST && SIGLOST != SIGABRT && SIGLOST != SIGPWR
- case SIGLOST:
- /* Solaris: "Resource lost". */
- return "File lock lost";
- #endif
- /* AIX */
- #if defined SIGMIGRATE
- case SIGMIGRATE:
- return "Process migration";
- #endif
- /* AIX */
- #if defined SIGMSG
- case SIGMSG:
- /* AIX: "Input device data". */
- return "Message in the ring";
- #endif
- /* ACM */
- #if defined SIGPLAN
- case SIGPLAN:
- return "Programming language anomaly";
- #endif
- /* AIX */
- #if defined SIGPRE
- case SIGPRE:
- return "Programmed exception";
- #endif
- /* IRIX */
- #if defined SIGPTINTR
- case SIGPTINTR:
- return "Pthread interrupt";
- #endif
- /* IRIX */
- #if defined SIGPTRESCHED
- case SIGPTRESCHED:
- return "Pthread rescheduling";
- #endif
- /* Linux, NetBSD, Minix, AIX, IRIX, Cygwin */
- #if defined SIGPWR
- case SIGPWR:
- /* glibc: "Power failure". NetBSD: "Power fail/restart". */
- return "Power failure";
- #endif
- /* AIX */
- #if defined SIGRECONFIG
- case SIGRECONFIG:
- return "Dynamic logical partitioning changed";
- #endif
- /* AIX */
- #if defined SIGRECOVERY
- case SIGRECOVERY:
- return "Kernel recovery";
- #endif
- /* IRIX */
- #if defined SIGRESTART
- case SIGRESTART:
- return "Checkpoint restart"; /* See man 1 cpr, man 3C atrestart */
- #endif
- /* AIX */
- #if defined SIGRETRACT
- case SIGRETRACT:
- /* AIX: "Monitor mode retracted". */
- return "Retracting Keep Alive Poll";
- #endif
- /* AIX */
- #if defined SIGSAK
- case SIGSAK:
- /* AIX: "Secure attention". */
- return "Secure Attention Key";
- #endif
- /* ACM */
- #if defined SIGSAM
- case SIGSAM:
- return "Symbolic computation failed";
- #endif
- /* Minix */
- #if defined SIGSNDELAY
- case SIGSNDELAY:
- return "Done sending message";
- #endif
- /* AIX */
- #if defined SIGSOUND
- case SIGSOUND:
- /* AIX: "Sound completed". */
- return "Sound configuration changed";
- #endif
- /* Linux */
- #if defined SIGSTKFLT
- case SIGSTKFLT:
- return "Stack fault";
- #endif
- /* AIX */
- #if defined SIGSYSERROR
- case SIGSYSERROR:
- return "Kernel error";
- #endif
- /* AIX */
- #if defined SIGTALRM
- case SIGTALRM:
- return "Thread alarm clock";
- #endif
- /* FreeBSD, OpenBSD */
- #if defined SIGTHR
- case SIGTHR:
- /* OpenBSD: "Thread AST". */
- return "Thread library interrupt";
- #endif
- /* IRIX */
- #if defined SIGUME
- case SIGUME:
- return "Uncorrectable memory error";
- #endif
- /* AIX */
- #if defined SIGVIRT
- case SIGVIRT:
- return "Virtual time alarm clock";
- #endif
- /* AIX */
- #if defined SIGWAITING
- case SIGWAITING:
- /* AIX: "No runnable lwp". */
- return "Thread waiting";
- #endif
- /* Linux, Mac OS X, FreeBSD, NetBSD, OpenBSD, Minix, AIX, IRIX, Cygwin, Haiku */
- #if defined SIGWINCH
- case SIGWINCH:
- /* glibc: "Window changed". *BSD: "Window size changed" or "Window size changes". */
- return "Window size changed";
- #endif
-
- default:
- return NULL;
- }
-}
diff --git a/cross/lib/signal.in.h b/cross/lib/signal.in.h
deleted file mode 100644
index fea12e6572d..00000000000
--- a/cross/lib/signal.in.h
+++ /dev/null
@@ -1,495 +0,0 @@
-/* A GNU-like <signal.h>.
-
- Copyright (C) 2006-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#if __GNUC__ >= 3
-@PRAGMA_SYSTEM_HEADER@
-#endif
-@PRAGMA_COLUMNS@
-
-#if defined __need_sig_atomic_t || defined __need_sigset_t || defined _GL_ALREADY_INCLUDING_SIGNAL_H || (defined _SIGNAL_H && !defined __SIZEOF_PTHREAD_MUTEX_T)
-/* Special invocation convention:
- - Inside glibc header files.
- - On glibc systems we have a sequence of nested includes
- <signal.h> -> <ucontext.h> -> <signal.h>.
- In this situation, the functions are not yet declared, therefore we cannot
- provide the C++ aliases.
- - On glibc systems with GCC 4.3 we have a sequence of nested includes
- <csignal> -> </usr/include/signal.h> -> <sys/ucontext.h> -> <signal.h>.
- In this situation, some of the functions are not yet declared, therefore
- we cannot provide the C++ aliases. */
-
-# @INCLUDE_NEXT@ @NEXT_SIGNAL_H@
-
-#else
-/* Normal invocation convention. */
-
-#ifndef _@GUARD_PREFIX@_SIGNAL_H
-
-#define _GL_ALREADY_INCLUDING_SIGNAL_H
-
-/* Define pid_t, uid_t.
- Also, mingw defines sigset_t not in <signal.h>, but in <sys/types.h>.
- On Solaris 10, <signal.h> includes <sys/types.h>, which eventually includes
- us; so include <sys/types.h> now, before the second inclusion guard. */
-#include <sys/types.h>
-
-/* The include_next requires a split double-inclusion guard. */
-#@INCLUDE_NEXT@ @NEXT_SIGNAL_H@
-
-#undef _GL_ALREADY_INCLUDING_SIGNAL_H
-
-#ifndef _@GUARD_PREFIX@_SIGNAL_H
-#define _@GUARD_PREFIX@_SIGNAL_H
-
-/* For testing the OpenBSD version. */
-#if (@GNULIB_PTHREAD_SIGMASK@ || defined GNULIB_POSIXCHECK) \
- && defined __OpenBSD__
-# include <sys/param.h>
-#endif
-
-/* Mac OS X 10.3, FreeBSD < 8.0, OpenBSD < 5.1, OSF/1 4.0, Solaris 2.6, Android,
- OS/2 kLIBC declare pthread_sigmask in <pthread.h>, not in <signal.h>.
- But avoid namespace pollution on glibc systems.*/
-#if (@GNULIB_PTHREAD_SIGMASK@ || defined GNULIB_POSIXCHECK) \
- && ((defined __APPLE__ && defined __MACH__) \
- || (defined __FreeBSD__ && __FreeBSD__ < 8) \
- || (defined __OpenBSD__ && OpenBSD < 201205) \
- || defined __osf__ || defined __sun || defined __ANDROID__ \
- || defined __KLIBC__) \
- && ! defined __GLIBC__
-# include <pthread.h>
-#endif
-
-/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
-
-/* The definition of _GL_ARG_NONNULL is copied here. */
-
-/* The definition of _GL_WARN_ON_USE is copied here. */
-
-/* On AIX, sig_atomic_t already includes volatile. C99 requires that
- 'volatile sig_atomic_t' ignore the extra modifier, but C89 did not.
- Hence, redefine this to a non-volatile type as needed. */
-#if ! @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@
-# if !GNULIB_defined_sig_atomic_t
-typedef int rpl_sig_atomic_t;
-# undef sig_atomic_t
-# define sig_atomic_t rpl_sig_atomic_t
-# define GNULIB_defined_sig_atomic_t 1
-# endif
-#endif
-
-/* A set or mask of signals. */
-#if !@HAVE_SIGSET_T@
-# if !GNULIB_defined_sigset_t
-typedef unsigned int sigset_t;
-# define GNULIB_defined_sigset_t 1
-# endif
-#endif
-
-/* Define sighandler_t, the type of signal handlers. A GNU extension. */
-#if !@HAVE_SIGHANDLER_T@
-# ifdef __cplusplus
-extern "C" {
-# endif
-# if !GNULIB_defined_sighandler_t
-typedef void (*sighandler_t) (int);
-# define GNULIB_defined_sighandler_t 1
-# endif
-# ifdef __cplusplus
-}
-# endif
-#endif
-
-
-#if @GNULIB_SIGNAL_H_SIGPIPE@
-# ifndef SIGPIPE
-/* Define SIGPIPE to a value that does not overlap with other signals. */
-# define SIGPIPE 13
-# define GNULIB_defined_SIGPIPE 1
-/* To actually use SIGPIPE, you also need the gnulib modules 'sigprocmask',
- 'write', 'stdio'. */
-# endif
-#endif
-
-
-/* Maximum signal number + 1. */
-#ifndef NSIG
-# if defined __TANDEM
-# define NSIG 32
-# endif
-#endif
-
-
-#if @GNULIB_PTHREAD_SIGMASK@
-# if @REPLACE_PTHREAD_SIGMASK@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef pthread_sigmask
-# define pthread_sigmask rpl_pthread_sigmask
-# endif
-_GL_FUNCDECL_RPL (pthread_sigmask, int,
- (int how,
- const sigset_t *restrict new_mask,
- sigset_t *restrict old_mask));
-_GL_CXXALIAS_RPL (pthread_sigmask, int,
- (int how,
- const sigset_t *restrict new_mask,
- sigset_t *restrict old_mask));
-# else
-# if !(@HAVE_PTHREAD_SIGMASK@ || defined pthread_sigmask)
-_GL_FUNCDECL_SYS (pthread_sigmask, int,
- (int how,
- const sigset_t *restrict new_mask,
- sigset_t *restrict old_mask));
-# endif
-_GL_CXXALIAS_SYS (pthread_sigmask, int,
- (int how,
- const sigset_t *restrict new_mask,
- sigset_t *restrict old_mask));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (pthread_sigmask);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef pthread_sigmask
-# if HAVE_RAW_DECL_PTHREAD_SIGMASK
-_GL_WARN_ON_USE (pthread_sigmask, "pthread_sigmask is not portable - "
- "use gnulib module pthread_sigmask for portability");
-# endif
-#endif
-
-
-#if @GNULIB_RAISE@
-# if @REPLACE_RAISE@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef raise
-# define raise rpl_raise
-# endif
-_GL_FUNCDECL_RPL (raise, int, (int sig));
-_GL_CXXALIAS_RPL (raise, int, (int sig));
-# else
-# if !@HAVE_RAISE@
-_GL_FUNCDECL_SYS (raise, int, (int sig));
-# endif
-_GL_CXXALIAS_SYS (raise, int, (int sig));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (raise);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef raise
-/* Assume raise is always declared. */
-_GL_WARN_ON_USE (raise, "raise can crash on native Windows - "
- "use gnulib module raise for portability");
-#endif
-
-
-#if @GNULIB_SIGPROCMASK@
-# if !@HAVE_POSIX_SIGNALBLOCKING@
-
-# ifndef GNULIB_defined_signal_blocking
-# define GNULIB_defined_signal_blocking 1
-# endif
-
-/* Maximum signal number + 1. */
-# ifndef NSIG
-# define NSIG 32
-# endif
-
-/* This code supports only 32 signals. */
-# if !GNULIB_defined_verify_NSIG_constraint
-typedef int verify_NSIG_constraint[NSIG <= 32 ? 1 : -1];
-# define GNULIB_defined_verify_NSIG_constraint 1
-# endif
-
-# endif
-
-/* When also using extern inline, suppress the use of static inline in
- standard headers of problematic Apple configurations, as Libc at
- least through Libc-825.26 (2013-04-09) mishandles it; see, e.g.,
- <https://lists.gnu.org/r/bug-gnulib/2012-12/msg00023.html>.
- Perhaps Apple will fix this some day. */
-#if (defined _GL_EXTERN_INLINE_IN_USE && defined __APPLE__ \
- && (defined __i386__ || defined __x86_64__))
-# undef sigaddset
-# undef sigdelset
-# undef sigemptyset
-# undef sigfillset
-# undef sigismember
-#endif
-
-/* Test whether a given signal is contained in a signal set. */
-# if @HAVE_POSIX_SIGNALBLOCKING@
-/* This function is defined as a macro on Mac OS X. */
-# if defined __cplusplus && defined GNULIB_NAMESPACE
-# undef sigismember
-# endif
-# else
-_GL_FUNCDECL_SYS (sigismember, int, (const sigset_t *set, int sig)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (sigismember, int, (const sigset_t *set, int sig));
-_GL_CXXALIASWARN (sigismember);
-
-/* Initialize a signal set to the empty set. */
-# if @HAVE_POSIX_SIGNALBLOCKING@
-/* This function is defined as a macro on Mac OS X. */
-# if defined __cplusplus && defined GNULIB_NAMESPACE
-# undef sigemptyset
-# endif
-# else
-_GL_FUNCDECL_SYS (sigemptyset, int, (sigset_t *set) _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (sigemptyset, int, (sigset_t *set));
-_GL_CXXALIASWARN (sigemptyset);
-
-/* Add a signal to a signal set. */
-# if @HAVE_POSIX_SIGNALBLOCKING@
-/* This function is defined as a macro on Mac OS X. */
-# if defined __cplusplus && defined GNULIB_NAMESPACE
-# undef sigaddset
-# endif
-# else
-_GL_FUNCDECL_SYS (sigaddset, int, (sigset_t *set, int sig)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (sigaddset, int, (sigset_t *set, int sig));
-_GL_CXXALIASWARN (sigaddset);
-
-/* Remove a signal from a signal set. */
-# if @HAVE_POSIX_SIGNALBLOCKING@
-/* This function is defined as a macro on Mac OS X. */
-# if defined __cplusplus && defined GNULIB_NAMESPACE
-# undef sigdelset
-# endif
-# else
-_GL_FUNCDECL_SYS (sigdelset, int, (sigset_t *set, int sig)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (sigdelset, int, (sigset_t *set, int sig));
-_GL_CXXALIASWARN (sigdelset);
-
-/* Fill a signal set with all possible signals. */
-# if @HAVE_POSIX_SIGNALBLOCKING@
-/* This function is defined as a macro on Mac OS X. */
-# if defined __cplusplus && defined GNULIB_NAMESPACE
-# undef sigfillset
-# endif
-# else
-_GL_FUNCDECL_SYS (sigfillset, int, (sigset_t *set) _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (sigfillset, int, (sigset_t *set));
-_GL_CXXALIASWARN (sigfillset);
-
-/* Return the set of those blocked signals that are pending. */
-# if !@HAVE_POSIX_SIGNALBLOCKING@
-_GL_FUNCDECL_SYS (sigpending, int, (sigset_t *set) _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (sigpending, int, (sigset_t *set));
-_GL_CXXALIASWARN (sigpending);
-
-/* If OLD_SET is not NULL, put the current set of blocked signals in *OLD_SET.
- Then, if SET is not NULL, affect the current set of blocked signals by
- combining it with *SET as indicated in OPERATION.
- In this implementation, you are not allowed to change a signal handler
- while the signal is blocked. */
-# if !@HAVE_POSIX_SIGNALBLOCKING@
-# define SIG_BLOCK 0 /* blocked_set = blocked_set | *set; */
-# define SIG_SETMASK 1 /* blocked_set = *set; */
-# define SIG_UNBLOCK 2 /* blocked_set = blocked_set & ~*set; */
-_GL_FUNCDECL_SYS (sigprocmask, int,
- (int operation,
- const sigset_t *restrict set,
- sigset_t *restrict old_set));
-# endif
-_GL_CXXALIAS_SYS (sigprocmask, int,
- (int operation,
- const sigset_t *restrict set,
- sigset_t *restrict old_set));
-_GL_CXXALIASWARN (sigprocmask);
-
-/* Install the handler FUNC for signal SIG, and return the previous
- handler. */
-# ifdef __cplusplus
-extern "C" {
-# endif
-# if !GNULIB_defined_function_taking_int_returning_void_t
-typedef void (*_gl_function_taking_int_returning_void_t) (int);
-# define GNULIB_defined_function_taking_int_returning_void_t 1
-# endif
-# ifdef __cplusplus
-}
-# endif
-# if !@HAVE_POSIX_SIGNALBLOCKING@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define signal rpl_signal
-# endif
-_GL_FUNCDECL_RPL (signal, _gl_function_taking_int_returning_void_t,
- (int sig, _gl_function_taking_int_returning_void_t func));
-_GL_CXXALIAS_RPL (signal, _gl_function_taking_int_returning_void_t,
- (int sig, _gl_function_taking_int_returning_void_t func));
-# else
-/* On OpenBSD, the declaration of 'signal' may not be present at this point,
- because it occurs in <sys/signal.h>, not <signal.h> directly. */
-# if defined __OpenBSD__
-_GL_FUNCDECL_SYS (signal, _gl_function_taking_int_returning_void_t,
- (int sig, _gl_function_taking_int_returning_void_t func));
-# endif
-_GL_CXXALIAS_SYS (signal, _gl_function_taking_int_returning_void_t,
- (int sig, _gl_function_taking_int_returning_void_t func));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (signal);
-# endif
-
-# if !@HAVE_POSIX_SIGNALBLOCKING@ && GNULIB_defined_SIGPIPE
-/* Raise signal SIGPIPE. */
-_GL_EXTERN_C int _gl_raise_SIGPIPE (void);
-# endif
-
-#elif defined GNULIB_POSIXCHECK
-# undef sigaddset
-# if HAVE_RAW_DECL_SIGADDSET
-_GL_WARN_ON_USE (sigaddset, "sigaddset is unportable - "
- "use the gnulib module sigprocmask for portability");
-# endif
-# undef sigdelset
-# if HAVE_RAW_DECL_SIGDELSET
-_GL_WARN_ON_USE (sigdelset, "sigdelset is unportable - "
- "use the gnulib module sigprocmask for portability");
-# endif
-# undef sigemptyset
-# if HAVE_RAW_DECL_SIGEMPTYSET
-_GL_WARN_ON_USE (sigemptyset, "sigemptyset is unportable - "
- "use the gnulib module sigprocmask for portability");
-# endif
-# undef sigfillset
-# if HAVE_RAW_DECL_SIGFILLSET
-_GL_WARN_ON_USE (sigfillset, "sigfillset is unportable - "
- "use the gnulib module sigprocmask for portability");
-# endif
-# undef sigismember
-# if HAVE_RAW_DECL_SIGISMEMBER
-_GL_WARN_ON_USE (sigismember, "sigismember is unportable - "
- "use the gnulib module sigprocmask for portability");
-# endif
-# undef sigpending
-# if HAVE_RAW_DECL_SIGPENDING
-_GL_WARN_ON_USE (sigpending, "sigpending is unportable - "
- "use the gnulib module sigprocmask for portability");
-# endif
-# undef sigprocmask
-# if HAVE_RAW_DECL_SIGPROCMASK
-_GL_WARN_ON_USE (sigprocmask, "sigprocmask is unportable - "
- "use the gnulib module sigprocmask for portability");
-# endif
-#endif /* @GNULIB_SIGPROCMASK@ */
-
-
-#if @GNULIB_SIGACTION@
-# if !@HAVE_SIGACTION@
-
-# if !@HAVE_SIGINFO_T@
-
-# if !GNULIB_defined_siginfo_types
-
-/* Present to allow compilation, but unsupported by gnulib. */
-union sigval
-{
- int sival_int;
- void *sival_ptr;
-};
-
-/* Present to allow compilation, but unsupported by gnulib. */
-struct siginfo_t
-{
- int si_signo;
- int si_code;
- int si_errno;
- pid_t si_pid;
- uid_t si_uid;
- void *si_addr;
- int si_status;
- long si_band;
- union sigval si_value;
-};
-typedef struct siginfo_t siginfo_t;
-
-# define GNULIB_defined_siginfo_types 1
-# endif
-
-# endif /* !@HAVE_SIGINFO_T@ */
-
-/* We assume that platforms which lack the sigaction() function also lack
- the 'struct sigaction' type, and vice versa. */
-
-# if !GNULIB_defined_struct_sigaction
-
-struct sigaction
-{
- union
- {
- void (*_sa_handler) (int);
- /* Present to allow compilation, but unsupported by gnulib. POSIX
- says that implementations may, but not must, make sa_sigaction
- overlap with sa_handler, but we know of no implementation where
- they do not overlap. */
- void (*_sa_sigaction) (int, siginfo_t *, void *);
- } _sa_func;
- sigset_t sa_mask;
- /* Not all POSIX flags are supported. */
- int sa_flags;
-};
-# define sa_handler _sa_func._sa_handler
-# define sa_sigaction _sa_func._sa_sigaction
-/* Unsupported flags are not present. */
-# define SA_RESETHAND 1
-# define SA_NODEFER 2
-# define SA_RESTART 4
-
-# define GNULIB_defined_struct_sigaction 1
-# endif
-
-_GL_FUNCDECL_SYS (sigaction, int, (int, const struct sigaction *restrict,
- struct sigaction *restrict));
-
-# elif !@HAVE_STRUCT_SIGACTION_SA_SIGACTION@
-
-# define sa_sigaction sa_handler
-
-# endif /* !@HAVE_SIGACTION@, !@HAVE_STRUCT_SIGACTION_SA_SIGACTION@ */
-
-_GL_CXXALIAS_SYS (sigaction, int, (int, const struct sigaction *restrict,
- struct sigaction *restrict));
-_GL_CXXALIASWARN (sigaction);
-
-#elif defined GNULIB_POSIXCHECK
-# undef sigaction
-# if HAVE_RAW_DECL_SIGACTION
-_GL_WARN_ON_USE (sigaction, "sigaction is unportable - "
- "use the gnulib module sigaction for portability");
-# endif
-#endif
-
-/* Some systems don't have SA_NODEFER. */
-#ifndef SA_NODEFER
-# define SA_NODEFER 0
-#endif
-
-
-#endif /* _@GUARD_PREFIX@_SIGNAL_H */
-#endif /* _@GUARD_PREFIX@_SIGNAL_H */
-#endif
diff --git a/cross/lib/signbitd.c b/cross/lib/signbitd.c
deleted file mode 100644
index 706ea394414..00000000000
--- a/cross/lib/signbitd.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/* signbit() macro: Determine the sign bit of a floating-point number.
- Copyright (C) 2007-2023 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 <math.h>
-
-#include <string.h>
-#include "isnand-nolibm.h"
-#include "float+.h"
-
-#ifdef gl_signbitd_OPTIMIZED_MACRO
-# undef gl_signbitd
-#endif
-
-int
-gl_signbitd (double arg)
-{
-#if defined DBL_SIGNBIT_WORD && defined DBL_SIGNBIT_BIT
- /* The use of a union to extract the bits of the representation of a
- 'long double' is safe in practice, despite of the "aliasing rules" of
- C99, because the GCC docs say
- "Even with '-fstrict-aliasing', type-punning is allowed, provided the
- memory is accessed through the union type."
- and similarly for other compilers. */
-# define NWORDS \
- ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
- union { double value; unsigned int word[NWORDS]; } m;
- m.value = arg;
- return (m.word[DBL_SIGNBIT_WORD] >> DBL_SIGNBIT_BIT) & 1;
-#elif HAVE_COPYSIGN_IN_LIBC
- return copysign (1.0, arg) < 0;
-#else
- /* This does not do the right thing for NaN, but this is irrelevant for
- most use cases. */
- if (isnand (arg))
- return 0;
- if (arg < 0.0)
- return 1;
- else if (arg == 0.0)
- {
- /* Distinguish 0.0 and -0.0. */
- static double plus_zero = 0.0;
- double arg_mem = arg;
- return (memcmp (&plus_zero, &arg_mem, SIZEOF_DBL) != 0);
- }
- else
- return 0;
-#endif
-}
diff --git a/cross/lib/signbitf.c b/cross/lib/signbitf.c
deleted file mode 100644
index c25bb64a0d2..00000000000
--- a/cross/lib/signbitf.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/* signbit() macro: Determine the sign bit of a floating-point number.
- Copyright (C) 2007, 2009-2023 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 <math.h>
-
-#include <string.h>
-#include "isnanf-nolibm.h"
-#include "float+.h"
-
-#ifdef gl_signbitf_OPTIMIZED_MACRO
-# undef gl_signbitf
-#endif
-
-int
-gl_signbitf (float arg)
-{
-#if defined FLT_SIGNBIT_WORD && defined FLT_SIGNBIT_BIT
- /* The use of a union to extract the bits of the representation of a
- 'long double' is safe in practice, despite of the "aliasing rules" of
- C99, because the GCC docs say
- "Even with '-fstrict-aliasing', type-punning is allowed, provided the
- memory is accessed through the union type."
- and similarly for other compilers. */
-# define NWORDS \
- ((sizeof (float) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
- union { float value; unsigned int word[NWORDS]; } m;
- m.value = arg;
- return (m.word[FLT_SIGNBIT_WORD] >> FLT_SIGNBIT_BIT) & 1;
-#elif HAVE_COPYSIGNF_IN_LIBC
- return copysignf (1.0f, arg) < 0;
-#else
- /* This does not do the right thing for NaN, but this is irrelevant for
- most use cases. */
- if (isnanf (arg))
- return 0;
- if (arg < 0.0f)
- return 1;
- else if (arg == 0.0f)
- {
- /* Distinguish 0.0f and -0.0f. */
- static float plus_zero = 0.0f;
- float arg_mem = arg;
- return (memcmp (&plus_zero, &arg_mem, SIZEOF_FLT) != 0);
- }
- else
- return 0;
-#endif
-}
diff --git a/cross/lib/signbitl.c b/cross/lib/signbitl.c
deleted file mode 100644
index 9d459caf879..00000000000
--- a/cross/lib/signbitl.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/* signbit() macro: Determine the sign bit of a floating-point number.
- Copyright (C) 2007, 2009-2023 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 <math.h>
-
-#include <string.h>
-#include "isnanl-nolibm.h"
-#include "float+.h"
-
-#ifdef gl_signbitl_OPTIMIZED_MACRO
-# undef gl_signbitl
-#endif
-
-int
-gl_signbitl (long double arg)
-{
-#if defined LDBL_SIGNBIT_WORD && defined LDBL_SIGNBIT_BIT
- /* The use of a union to extract the bits of the representation of a
- 'long double' is safe in practice, despite of the "aliasing rules" of
- C99, because the GCC docs say
- "Even with '-fstrict-aliasing', type-punning is allowed, provided the
- memory is accessed through the union type."
- and similarly for other compilers. */
-# define NWORDS \
- ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
- union { long double value; unsigned int word[NWORDS]; } m;
- m.value = arg;
- return (m.word[LDBL_SIGNBIT_WORD] >> LDBL_SIGNBIT_BIT) & 1;
-#elif HAVE_COPYSIGNL_IN_LIBC
- return copysignl (1.0L, arg) < 0;
-#else
- /* This does not do the right thing for NaN, but this is irrelevant for
- most use cases. */
- if (isnanl (arg))
- return 0;
- if (arg < 0.0L)
- return 1;
- else if (arg == 0.0L)
- {
- /* Distinguish 0.0L and -0.0L. */
- static long double plus_zero = 0.0L;
- long double arg_mem = arg;
- return (memcmp (&plus_zero, &arg_mem, SIZEOF_LDBL) != 0);
- }
- else
- return 0;
-#endif
-}
diff --git a/cross/lib/size_max.h b/cross/lib/size_max.h
deleted file mode 100644
index 48af0250556..00000000000
--- a/cross/lib/size_max.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* size_max.h -- declare SIZE_MAX through system headers
- Copyright (C) 2005-2006, 2009-2023 Free Software Foundation, Inc.
- Written by Simon Josefsson.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General 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 GNULIB_SIZE_MAX_H
-#define GNULIB_SIZE_MAX_H
-
-/* Get SIZE_MAX declaration on systems like Solaris 7/8/9. */
-# include <limits.h>
-/* Get SIZE_MAX declaration on systems like glibc 2. */
-# if HAVE_STDINT_H
-# include <stdint.h>
-# endif
-/* On systems where these include files don't define it, SIZE_MAX is defined
- in config.h. */
-
-#endif /* GNULIB_SIZE_MAX_H */
diff --git a/cross/lib/stat-time.c b/cross/lib/stat-time.c
deleted file mode 100644
index bc282232ab3..00000000000
--- a/cross/lib/stat-time.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* stat-related time functions.
-
- Copyright (C) 2012-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-#define _GL_STAT_TIME_INLINE _GL_EXTERN_INLINE
-#include "stat-time.h"
diff --git a/cross/lib/stat-time.h b/cross/lib/stat-time.h
deleted file mode 100644
index 92aa1e64e20..00000000000
--- a/cross/lib/stat-time.h
+++ /dev/null
@@ -1,251 +0,0 @@
-/* stat-related time functions.
-
- Copyright (C) 2005, 2007, 2009-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert. */
-
-#ifndef STAT_TIME_H
-#define STAT_TIME_H 1
-
-#include <errno.h>
-#include <stdckdint.h>
-#include <stddef.h>
-#include <sys/stat.h>
-#include <time.h>
-
-#ifndef _GL_INLINE_HEADER_BEGIN
- #error "Please include config.h first."
-#endif
-_GL_INLINE_HEADER_BEGIN
-#ifndef _GL_STAT_TIME_INLINE
-# define _GL_STAT_TIME_INLINE _GL_INLINE
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* STAT_TIMESPEC (ST, ST_XTIM) is the ST_XTIM member for *ST of type
- struct timespec, if available. If not, then STAT_TIMESPEC_NS (ST,
- ST_XTIM) is the nanosecond component of the ST_XTIM member for *ST,
- if available. ST_XTIM can be st_atim, st_ctim, st_mtim, or st_birthtim
- for access, status change, data modification, or birth (creation)
- time respectively.
-
- These macros are private to stat-time.h. */
-#if _GL_WINDOWS_STAT_TIMESPEC || defined HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC
-# if _GL_WINDOWS_STAT_TIMESPEC || defined TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC
-# define STAT_TIMESPEC(st, st_xtim) ((st)->st_xtim)
-# else
-# define STAT_TIMESPEC_NS(st, st_xtim) ((st)->st_xtim.tv_nsec)
-# endif
-#elif defined HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC
-# define STAT_TIMESPEC(st, st_xtim) ((st)->st_xtim##espec)
-#elif defined HAVE_STRUCT_STAT_ST_ATIMENSEC
-# define STAT_TIMESPEC_NS(st, st_xtim) ((st)->st_xtim##ensec)
-#elif defined HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC
-# define STAT_TIMESPEC_NS(st, st_xtim) ((st)->st_xtim.st__tim.tv_nsec)
-#endif
-
-/* Return the nanosecond component of *ST's access time. */
-_GL_STAT_TIME_INLINE long int _GL_ATTRIBUTE_PURE
-get_stat_atime_ns (struct stat const *st)
-{
-# if defined STAT_TIMESPEC
- return STAT_TIMESPEC (st, st_atim).tv_nsec;
-# elif defined STAT_TIMESPEC_NS
- return STAT_TIMESPEC_NS (st, st_atim);
-# else
- return 0;
-# endif
-}
-
-/* Return the nanosecond component of *ST's status change time. */
-_GL_STAT_TIME_INLINE long int _GL_ATTRIBUTE_PURE
-get_stat_ctime_ns (struct stat const *st)
-{
-# if defined STAT_TIMESPEC
- return STAT_TIMESPEC (st, st_ctim).tv_nsec;
-# elif defined STAT_TIMESPEC_NS
- return STAT_TIMESPEC_NS (st, st_ctim);
-# else
- return 0;
-# endif
-}
-
-/* Return the nanosecond component of *ST's data modification time. */
-_GL_STAT_TIME_INLINE long int _GL_ATTRIBUTE_PURE
-get_stat_mtime_ns (struct stat const *st)
-{
-# if defined STAT_TIMESPEC
- return STAT_TIMESPEC (st, st_mtim).tv_nsec;
-# elif defined STAT_TIMESPEC_NS
- return STAT_TIMESPEC_NS (st, st_mtim);
-# else
- return 0;
-# endif
-}
-
-/* Return the nanosecond component of *ST's birth time. */
-_GL_STAT_TIME_INLINE long int _GL_ATTRIBUTE_PURE
-get_stat_birthtime_ns (_GL_UNUSED struct stat const *st)
-{
-# if defined HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC
- return STAT_TIMESPEC (st, st_birthtim).tv_nsec;
-# elif defined HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC
- return STAT_TIMESPEC_NS (st, st_birthtim);
-# else
- return 0;
-# endif
-}
-
-/* Return *ST's access time. */
-_GL_STAT_TIME_INLINE struct timespec _GL_ATTRIBUTE_PURE
-get_stat_atime (struct stat const *st)
-{
-#ifdef STAT_TIMESPEC
- return STAT_TIMESPEC (st, st_atim);
-#else
- struct timespec t;
- t.tv_sec = st->st_atime;
- t.tv_nsec = get_stat_atime_ns (st);
- return t;
-#endif
-}
-
-/* Return *ST's status change time. */
-_GL_STAT_TIME_INLINE struct timespec _GL_ATTRIBUTE_PURE
-get_stat_ctime (struct stat const *st)
-{
-#ifdef STAT_TIMESPEC
- return STAT_TIMESPEC (st, st_ctim);
-#else
- struct timespec t;
- t.tv_sec = st->st_ctime;
- t.tv_nsec = get_stat_ctime_ns (st);
- return t;
-#endif
-}
-
-/* Return *ST's data modification time. */
-_GL_STAT_TIME_INLINE struct timespec _GL_ATTRIBUTE_PURE
-get_stat_mtime (struct stat const *st)
-{
-#ifdef STAT_TIMESPEC
- return STAT_TIMESPEC (st, st_mtim);
-#else
- struct timespec t;
- t.tv_sec = st->st_mtime;
- t.tv_nsec = get_stat_mtime_ns (st);
- return t;
-#endif
-}
-
-/* Return *ST's birth time, if available; otherwise return a value
- with tv_sec and tv_nsec both equal to -1. */
-_GL_STAT_TIME_INLINE struct timespec _GL_ATTRIBUTE_PURE
-get_stat_birthtime (_GL_UNUSED struct stat const *st)
-{
- struct timespec t;
-
-#if (defined HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC \
- || defined HAVE_STRUCT_STAT_ST_BIRTHTIM_TV_NSEC)
- t = STAT_TIMESPEC (st, st_birthtim);
-#elif defined HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC
- t.tv_sec = st->st_birthtime;
- t.tv_nsec = st->st_birthtimensec;
-#elif defined _WIN32 && ! defined __CYGWIN__
- /* Native Windows platforms (but not Cygwin) put the "file creation
- time" in st_ctime (!). See
- <https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/stat-functions>. */
-# if _GL_WINDOWS_STAT_TIMESPEC
- t = st->st_ctim;
-# else
- t.tv_sec = st->st_ctime;
- t.tv_nsec = 0;
-# endif
-#else
- /* Birth time is not supported. */
- t.tv_sec = -1;
- t.tv_nsec = -1;
-#endif
-
-#if (defined HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC \
- || defined HAVE_STRUCT_STAT_ST_BIRTHTIM_TV_NSEC \
- || defined HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC)
- /* FreeBSD and NetBSD sometimes signal the absence of knowledge by
- using zero. Attempt to work around this problem. Alas, this can
- report failure even for valid timestamps. Also, NetBSD
- sometimes returns junk in the birth time fields; work around this
- bug if it is detected. */
- if (! (t.tv_sec && 0 <= t.tv_nsec && t.tv_nsec < 1000000000))
- {
- t.tv_sec = -1;
- t.tv_nsec = -1;
- }
-#endif
-
- return t;
-}
-
-/* If a stat-like function returned RESULT, normalize the timestamps
- in *ST, in case this platform suffers from the Solaris 11 bug where
- tv_nsec might be negative. Return the adjusted RESULT, setting
- errno to EOVERFLOW if normalization overflowed. This function
- is intended to be private to this .h file. */
-_GL_STAT_TIME_INLINE int
-stat_time_normalize (int result, _GL_UNUSED struct stat *st)
-{
-#if defined __sun && defined STAT_TIMESPEC
- if (result == 0)
- {
- long int timespec_hz = 1000000000;
- short int const ts_off[] = { offsetof (struct stat, st_atim),
- offsetof (struct stat, st_mtim),
- offsetof (struct stat, st_ctim) };
- int i;
- for (i = 0; i < sizeof ts_off / sizeof *ts_off; i++)
- {
- struct timespec *ts = (struct timespec *) ((char *) st + ts_off[i]);
- long int q = ts->tv_nsec / timespec_hz;
- long int r = ts->tv_nsec % timespec_hz;
- if (r < 0)
- {
- r += timespec_hz;
- q--;
- }
- ts->tv_nsec = r;
- /* Overflow is possible, as Solaris 11 stat can yield
- tv_sec == TYPE_MINIMUM (time_t) && tv_nsec == -1000000000.
- INT_ADD_WRAPV is OK, since time_t is signed on Solaris. */
- if (ckd_add (&ts->tv_sec, q, ts->tv_sec))
- {
- errno = EOVERFLOW;
- return -1;
- }
- }
- }
-#endif
- return result;
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-_GL_INLINE_HEADER_END
-
-#endif
diff --git a/cross/lib/stdalign.in.h b/cross/lib/stdalign.in.h
deleted file mode 100644
index b616c100fdc..00000000000
--- a/cross/lib/stdalign.in.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* A substitute for ISO C11 <stdalign.h>.
-
- Copyright 2011-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert and Bruno Haible. */
-
-/* Define two obsolescent C11 macros, assuming alignas and alignof are
- either keywords or alignasof-defined macros. */
-
-#ifndef _@GUARD_PREFIX@_STDALIGN_H
-
-#if __GNUC__ >= 3
-@PRAGMA_SYSTEM_HEADER@
-#endif
-@PRAGMA_COLUMNS@
-
-/* We need to include the system's <stdalign.h> when it exists, because it might
- define 'alignof' as a macro when it's not a keyword or compiler built-in. */
-#if @HAVE_STDALIGN_H@
-/* The include_next requires a split double-inclusion guard. */
-# @INCLUDE_NEXT@ @NEXT_STDALIGN_H@
-#endif
-
-#ifndef _@GUARD_PREFIX@_STDALIGN_H
-#define _@GUARD_PREFIX@_STDALIGN_H
-
-#if (defined alignas \
- || (defined __STDC_VERSION__ && 202311 <= __STDC_VERSION__) \
- || (defined __cplusplus && (201103 <= __cplusplus || defined _MSC_VER)))
-# define __alignas_is_defined 1
-#endif
-
-#define __alignof_is_defined 1
-
-#endif /* _@GUARD_PREFIX@_STDALIGN_H */
-#endif /* _@GUARD_PREFIX@_STDALIGN_H */
diff --git a/cross/lib/stdckdint.in.h b/cross/lib/stdckdint.in.h
deleted file mode 100644
index 71bab5f0c9e..00000000000
--- a/cross/lib/stdckdint.in.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* stdckdint.h -- checked integer arithmetic
-
- Copyright 2022-2023 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"
-
-/* 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/cross/lib/stddef.in.h b/cross/lib/stddef.in.h
deleted file mode 100644
index 6eadcc3d5a4..00000000000
--- a/cross/lib/stddef.in.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/* A substitute for POSIX 2008 <stddef.h>, for platforms that have issues.
-
- Copyright (C) 2009-2023 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. */
-
-/*
- * POSIX 2008 <stddef.h> for platforms that have issues.
- * <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stddef.h.html>
- */
-
-#if __GNUC__ >= 3
-@PRAGMA_SYSTEM_HEADER@
-#endif
-@PRAGMA_COLUMNS@
-
-#if defined __need_wchar_t || defined __need_size_t \
- || defined __need_ptrdiff_t || defined __need_NULL \
- || defined __need_wint_t
-/* Special invocation convention inside gcc header files. In
- particular, gcc provides a version of <stddef.h> that blindly
- redefines NULL even when __need_wint_t was defined, even though
- wint_t is not normally provided by <stddef.h>. Hence, we must
- remember if special invocation has ever been used to obtain wint_t,
- in which case we need to clean up NULL yet again. */
-
-# if !(defined _@GUARD_PREFIX@_STDDEF_H && defined _GL_STDDEF_WINT_T)
-# ifdef __need_wint_t
-# define _GL_STDDEF_WINT_T
-# endif
-# @INCLUDE_NEXT@ @NEXT_STDDEF_H@
- /* On TinyCC, make sure that the macros that indicate the special invocation
- convention get undefined. */
-# undef __need_wchar_t
-# undef __need_size_t
-# undef __need_ptrdiff_t
-# undef __need_NULL
-# undef __need_wint_t
-# endif
-
-#else
-/* Normal invocation convention. */
-
-# ifndef _@GUARD_PREFIX@_STDDEF_H
-
-/* On AIX 7.2, with xlc in 64-bit mode, <stddef.h> defines max_align_t to a
- type with alignment 4, but 'long' has alignment 8. */
-# if defined _AIX && defined __LP64__
-# if !GNULIB_defined_max_align_t
-# ifdef _MAX_ALIGN_T
-/* /usr/include/stddef.h has already defined max_align_t. Override it. */
-typedef long rpl_max_align_t;
-# define max_align_t rpl_max_align_t
-# else
-/* Prevent /usr/include/stddef.h from defining max_align_t. */
-typedef long max_align_t;
-# define _MAX_ALIGN_T
-# endif
-# define GNULIB_defined_max_align_t 1
-# endif
-# endif
-
-/* The include_next requires a split double-inclusion guard. */
-
-# @INCLUDE_NEXT@ @NEXT_STDDEF_H@
-
-/* On NetBSD 5.0, the definition of NULL lacks proper parentheses. */
-# if (@REPLACE_NULL@ \
- && (!defined _@GUARD_PREFIX@_STDDEF_H || defined _GL_STDDEF_WINT_T))
-# undef NULL
-# ifdef __cplusplus
- /* ISO C++ says that the macro NULL must expand to an integer constant
- expression, hence '((void *) 0)' is not allowed in C++. */
-# if __GNUG__ >= 3
- /* GNU C++ has a __null macro that behaves like an integer ('int' or
- 'long') but has the same size as a pointer. Use that, to avoid
- warnings. */
-# define NULL __null
-# else
-# define NULL 0L
-# endif
-# else
-# define NULL ((void *) 0)
-# endif
-# endif
-
-# ifndef _@GUARD_PREFIX@_STDDEF_H
-# define _@GUARD_PREFIX@_STDDEF_H
-
-/* Some platforms lack wchar_t. */
-#if !@HAVE_WCHAR_T@
-# define wchar_t int
-#endif
-
-/* Some platforms lack max_align_t. The check for _GCC_MAX_ALIGN_T is
- a hack in case the configure-time test was done with g++ even though
- we are currently compiling with gcc.
- On MSVC, max_align_t is defined only in C++ mode, after <cstddef> was
- included. Its definition is good since it has an alignment of 8 (on x86
- and x86_64).
- Similarly on OS/2 kLIBC. */
-#if (defined _MSC_VER || (defined __KLIBC__ && !defined __LIBCN__)) \
- && defined __cplusplus
-# include <cstddef>
-#else
-# if ! (@HAVE_MAX_ALIGN_T@ || (defined _GCC_MAX_ALIGN_T && !defined __clang__))
-# if !GNULIB_defined_max_align_t
-/* On the x86, the maximum storage alignment of double, long, etc. is 4,
- but GCC's C11 ABI for x86 says that max_align_t has an alignment of 8,
- and the C11 standard allows this. Work around this problem by
- using __alignof__ (which returns 8 for double) rather than _Alignof
- (which returns 4), and align each union member accordingly. */
-# if defined __GNUC__ || (__clang_major__ >= 4)
-# define _GL_STDDEF_ALIGNAS(type) \
- __attribute__ ((__aligned__ (__alignof__ (type))))
-# else
-# define _GL_STDDEF_ALIGNAS(type) /* */
-# endif
-typedef union
-{
- char *__p _GL_STDDEF_ALIGNAS (char *);
- double __d _GL_STDDEF_ALIGNAS (double);
- long double __ld _GL_STDDEF_ALIGNAS (long double);
- long int __i _GL_STDDEF_ALIGNAS (long int);
-} rpl_max_align_t;
-# define max_align_t rpl_max_align_t
-# define GNULIB_defined_max_align_t 1
-# endif
-# endif
-#endif
-
-# endif /* _@GUARD_PREFIX@_STDDEF_H */
-# endif /* _@GUARD_PREFIX@_STDDEF_H */
-#endif /* __need_XXX */
diff --git a/cross/lib/stdint.in.h b/cross/lib/stdint.in.h
deleted file mode 100644
index 5ddc644b8ee..00000000000
--- a/cross/lib/stdint.in.h
+++ /dev/null
@@ -1,740 +0,0 @@
-/* Copyright (C) 2001-2002, 2004-2023 Free Software Foundation, Inc.
- Written by Paul Eggert, Bruno Haible, Sam Steingold, Peter Burwood.
- 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 <stdint.h> for platforms that lack it.
- * <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stdint.h.html>
- */
-
-#ifndef _@GUARD_PREFIX@_STDINT_H
-
-#if __GNUC__ >= 3
-@PRAGMA_SYSTEM_HEADER@
-#endif
-@PRAGMA_COLUMNS@
-
-/* When including a system file that in turn includes <inttypes.h>,
- use the system <inttypes.h>, not our substitute. This avoids
- problems with (for example) VMS, whose <sys/bitypes.h> includes
- <inttypes.h>. */
-#define _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
-
-/* On Android (Bionic libc), <sys/types.h> includes this file before
- having defined 'time_t'. Therefore in this case avoid including
- other system header files; just include the system's <stdint.h>.
- Ideally we should test __BIONIC__ here, but it is only defined after
- <sys/cdefs.h> has been included; hence test __ANDROID__ instead. */
-#if defined __ANDROID__ && defined _GL_INCLUDING_SYS_TYPES_H
-# @INCLUDE_NEXT@ @NEXT_STDINT_H@
-#else
-
-/* Get those types that are already defined in other system include
- files, so that we can "#define int8_t signed char" below without
- worrying about a later system include file containing a "typedef
- signed char int8_t;" that will get messed up by our macro. Our
- macros should all be consistent with the system versions, except
- for the "fast" types and macros, which we recommend against using
- in public interfaces due to compiler differences. */
-
-#if @HAVE_STDINT_H@
-# if defined __sgi && ! defined __c99
- /* Bypass IRIX's <stdint.h> if in C89 mode, since it merely annoys users
- with "This header file is to be used only for c99 mode compilations"
- diagnostics. */
-# define __STDINT_H__
-# endif
-
- /* Some pre-C++11 <stdint.h> implementations need this. */
-# ifdef __cplusplus
-# ifndef __STDC_CONSTANT_MACROS
-# define __STDC_CONSTANT_MACROS 1
-# endif
-# ifndef __STDC_LIMIT_MACROS
-# define __STDC_LIMIT_MACROS 1
-# endif
-# endif
-
- /* Other systems may have an incomplete or buggy <stdint.h>.
- Include it before <inttypes.h>, since any "#include <stdint.h>"
- in <inttypes.h> would reinclude us, skipping our contents because
- _@GUARD_PREFIX@_STDINT_H is defined.
- The include_next requires a split double-inclusion guard. */
-# @INCLUDE_NEXT@ @NEXT_STDINT_H@
-#endif
-
-#if ! defined _@GUARD_PREFIX@_STDINT_H && ! defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H
-#define _@GUARD_PREFIX@_STDINT_H
-
-/* Get SCHAR_MIN, SCHAR_MAX, UCHAR_MAX, INT_MIN, INT_MAX,
- LONG_MIN, LONG_MAX, ULONG_MAX, _GL_INTEGER_WIDTH. */
-#include <limits.h>
-
-/* Override WINT_MIN and WINT_MAX if gnulib's <wchar.h> or <wctype.h> overrides
- wint_t. */
-#if @GNULIBHEADERS_OVERRIDE_WINT_T@
-# undef WINT_MIN
-# undef WINT_MAX
-# define WINT_MIN 0x0U
-# define WINT_MAX 0xffffffffU
-#endif
-
-#if ! @HAVE_C99_STDINT_H@
-
-/* <sys/types.h> defines some of the stdint.h types as well, on glibc,
- IRIX 6.5, and OpenBSD 3.8 (via <machine/types.h>).
- AIX 5.2 <sys/types.h> isn't needed and causes troubles.
- Mac OS X 10.4.6 <sys/types.h> includes <stdint.h> (which is us), but
- relies on the system <stdint.h> definitions, so include
- <sys/types.h> after @NEXT_STDINT_H@. */
-# if @HAVE_SYS_TYPES_H@ && ! defined _AIX
-# include <sys/types.h>
-# endif
-
-# if @HAVE_INTTYPES_H@
- /* In OpenBSD 3.8, <inttypes.h> includes <machine/types.h>, which defines
- int{8,16,32,64}_t, uint{8,16,32,64}_t and __BIT_TYPES_DEFINED__.
- <inttypes.h> also defines intptr_t and uintptr_t. */
-# include <inttypes.h>
-# elif @HAVE_SYS_INTTYPES_H@
- /* Solaris 7 <sys/inttypes.h> has the types except the *_fast*_t types, and
- the macros except for *_FAST*_*, INTPTR_MIN, PTRDIFF_MIN, PTRDIFF_MAX. */
-# include <sys/inttypes.h>
-# endif
-
-# if @HAVE_SYS_BITYPES_H@ && ! defined __BIT_TYPES_DEFINED__
- /* Linux libc4 >= 4.6.7 and libc5 have a <sys/bitypes.h> that defines
- int{8,16,32,64}_t and __BIT_TYPES_DEFINED__. In libc5 >= 5.2.2 it is
- included by <sys/types.h>. */
-# include <sys/bitypes.h>
-# endif
-
-# undef _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
-
-/* Minimum and maximum values for an integer type under the usual assumption.
- Return an unspecified value if BITS == 0, adding a check to pacify
- picky compilers. */
-
-/* These are separate macros, because if you try to merge these macros into
- a single one, HP-UX cc rejects the resulting expression in constant
- expressions. */
-# define _STDINT_UNSIGNED_MIN(bits, zero) \
- (zero)
-# define _STDINT_SIGNED_MIN(bits, zero) \
- (~ _STDINT_MAX (1, bits, zero))
-
-# define _STDINT_MAX(signed, bits, zero) \
- (((((zero) + 1) << ((bits) ? (bits) - 1 - (signed) : 0)) - 1) * 2 + 1)
-
-#if !GNULIB_defined_stdint_types
-
-/* 7.18.1.1. Exact-width integer types */
-
-/* Here we assume a standard architecture where the hardware integer
- types have 8, 16, 32, optionally 64 bits. */
-
-# undef int8_t
-# undef uint8_t
-typedef signed char gl_int8_t;
-typedef unsigned char gl_uint8_t;
-# define int8_t gl_int8_t
-# define uint8_t gl_uint8_t
-
-# undef int16_t
-# undef uint16_t
-typedef short int gl_int16_t;
-typedef unsigned short int gl_uint16_t;
-# define int16_t gl_int16_t
-# define uint16_t gl_uint16_t
-
-# undef int32_t
-# undef uint32_t
-typedef int gl_int32_t;
-typedef unsigned int gl_uint32_t;
-# define int32_t gl_int32_t
-# define uint32_t gl_uint32_t
-
-/* If the system defines INT64_MAX, assume int64_t works. That way,
- if the underlying platform defines int64_t to be a 64-bit long long
- int, the code below won't mistakenly define it to be a 64-bit long
- int, which would mess up C++ name mangling. We must use #ifdef
- rather than #if, to avoid an error with HP-UX 10.20 cc. */
-
-# ifdef INT64_MAX
-# define GL_INT64_T
-# else
-/* Do not undefine int64_t if gnulib is not being used with 64-bit
- types, since otherwise it breaks platforms like Tandem/NSK. */
-# if LONG_MAX >> 31 >> 31 == 1
-# undef int64_t
-typedef long int gl_int64_t;
-# define int64_t gl_int64_t
-# define GL_INT64_T
-# elif defined _MSC_VER
-# undef int64_t
-typedef __int64 gl_int64_t;
-# define int64_t gl_int64_t
-# define GL_INT64_T
-# else
-# undef int64_t
-typedef long long int gl_int64_t;
-# define int64_t gl_int64_t
-# define GL_INT64_T
-# endif
-# endif
-
-# ifdef UINT64_MAX
-# define GL_UINT64_T
-# else
-# if ULONG_MAX >> 31 >> 31 >> 1 == 1
-# undef uint64_t
-typedef unsigned long int gl_uint64_t;
-# define uint64_t gl_uint64_t
-# define GL_UINT64_T
-# elif defined _MSC_VER
-# undef uint64_t
-typedef unsigned __int64 gl_uint64_t;
-# define uint64_t gl_uint64_t
-# define GL_UINT64_T
-# else
-# undef uint64_t
-typedef unsigned long long int gl_uint64_t;
-# define uint64_t gl_uint64_t
-# define GL_UINT64_T
-# endif
-# endif
-
-/* Avoid collision with Solaris 2.5.1 <pthread.h> etc. */
-# define _UINT8_T
-# define _UINT32_T
-# define _UINT64_T
-
-
-/* 7.18.1.2. Minimum-width integer types */
-
-/* Here we assume a standard architecture where the hardware integer
- types have 8, 16, 32, optionally 64 bits. Therefore the leastN_t types
- are the same as the corresponding N_t types. */
-
-# undef int_least8_t
-# undef uint_least8_t
-# undef int_least16_t
-# undef uint_least16_t
-# undef int_least32_t
-# undef uint_least32_t
-# undef int_least64_t
-# undef uint_least64_t
-# define int_least8_t int8_t
-# define uint_least8_t uint8_t
-# define int_least16_t int16_t
-# define uint_least16_t uint16_t
-# define int_least32_t int32_t
-# define uint_least32_t uint32_t
-# ifdef GL_INT64_T
-# define int_least64_t int64_t
-# endif
-# ifdef GL_UINT64_T
-# define uint_least64_t uint64_t
-# endif
-
-/* 7.18.1.3. Fastest minimum-width integer types */
-
-/* Note: Other <stdint.h> substitutes may define these types differently.
- It is not recommended to use these types in public header files. */
-
-/* Here we assume a standard architecture where the hardware integer
- types have 8, 16, 32, optionally 64 bits. Therefore the fastN_t types
- are taken from the same list of types. The following code normally
- uses types consistent with glibc, as that lessens the chance of
- incompatibility with older GNU hosts. */
-
-# undef int_fast8_t
-# undef uint_fast8_t
-# undef int_fast16_t
-# undef uint_fast16_t
-# undef int_fast32_t
-# undef uint_fast32_t
-# undef int_fast64_t
-# undef uint_fast64_t
-typedef signed char gl_int_fast8_t;
-typedef unsigned char gl_uint_fast8_t;
-
-# ifdef __sun
-/* Define types compatible with SunOS 5.10, so that code compiled under
- earlier SunOS versions works with code compiled under SunOS 5.10. */
-typedef int gl_int_fast32_t;
-typedef unsigned int gl_uint_fast32_t;
-# else
-typedef long int gl_int_fast32_t;
-typedef unsigned long int gl_uint_fast32_t;
-# endif
-typedef gl_int_fast32_t gl_int_fast16_t;
-typedef gl_uint_fast32_t gl_uint_fast16_t;
-
-# define int_fast8_t gl_int_fast8_t
-# define uint_fast8_t gl_uint_fast8_t
-# define int_fast16_t gl_int_fast16_t
-# define uint_fast16_t gl_uint_fast16_t
-# define int_fast32_t gl_int_fast32_t
-# define uint_fast32_t gl_uint_fast32_t
-# ifdef GL_INT64_T
-# define int_fast64_t int64_t
-# endif
-# ifdef GL_UINT64_T
-# define uint_fast64_t uint64_t
-# endif
-
-/* 7.18.1.4. Integer types capable of holding object pointers */
-
-/* kLIBC's <stdint.h> defines _INTPTR_T_DECLARED and needs its own
- definitions of intptr_t and uintptr_t (which use int and unsigned)
- to avoid clashes with declarations of system functions like sbrk.
- Similarly, MinGW WSL-5.4.1 <stdint.h> needs its own intptr_t and
- uintptr_t to avoid conflicting declarations of system functions like
- _findclose in <io.h>. */
-# if !((defined __KLIBC__ && defined _INTPTR_T_DECLARED) \
- || defined __MINGW32__)
-# undef intptr_t
-# undef uintptr_t
-# ifdef _WIN64
-typedef long long int gl_intptr_t;
-typedef unsigned long long int gl_uintptr_t;
-# else
-typedef long int gl_intptr_t;
-typedef unsigned long int gl_uintptr_t;
-# endif
-# define intptr_t gl_intptr_t
-# define uintptr_t gl_uintptr_t
-# endif
-
-/* 7.18.1.5. Greatest-width integer types */
-
-/* Note: These types are compiler dependent. It may be unwise to use them in
- public header files. */
-
-/* If the system defines INTMAX_MAX, assume that intmax_t works, and
- similarly for UINTMAX_MAX and uintmax_t. This avoids problems with
- assuming one type where another is used by the system. */
-
-# ifndef INTMAX_MAX
-# undef INTMAX_C
-# undef intmax_t
-# if LONG_MAX >> 30 == 1
-typedef long long int gl_intmax_t;
-# define intmax_t gl_intmax_t
-# elif defined GL_INT64_T
-# define intmax_t int64_t
-# else
-typedef long int gl_intmax_t;
-# define intmax_t gl_intmax_t
-# endif
-# endif
-
-# ifndef UINTMAX_MAX
-# undef UINTMAX_C
-# undef uintmax_t
-# if ULONG_MAX >> 31 == 1
-typedef unsigned long long int gl_uintmax_t;
-# define uintmax_t gl_uintmax_t
-# elif defined GL_UINT64_T
-# define uintmax_t uint64_t
-# else
-typedef unsigned long int gl_uintmax_t;
-# define uintmax_t gl_uintmax_t
-# endif
-# endif
-
-/* Verify that intmax_t and uintmax_t have the same size. Too much code
- breaks if this is not the case. If this check fails, the reason is likely
- to be found in the autoconf macros. */
-typedef int _verify_intmax_size[sizeof (intmax_t) == sizeof (uintmax_t)
- ? 1 : -1];
-
-# define GNULIB_defined_stdint_types 1
-# endif /* !GNULIB_defined_stdint_types */
-
-/* 7.18.2. Limits of specified-width integer types */
-
-/* 7.18.2.1. Limits of exact-width integer types */
-
-/* Here we assume a standard architecture where the hardware integer
- types have 8, 16, 32, optionally 64 bits. */
-
-# undef INT8_MIN
-# undef INT8_MAX
-# undef UINT8_MAX
-# define INT8_MIN (~ INT8_MAX)
-# define INT8_MAX 127
-# define UINT8_MAX 255
-
-# undef INT16_MIN
-# undef INT16_MAX
-# undef UINT16_MAX
-# define INT16_MIN (~ INT16_MAX)
-# define INT16_MAX 32767
-# define UINT16_MAX 65535
-
-# undef INT32_MIN
-# undef INT32_MAX
-# undef UINT32_MAX
-# define INT32_MIN (~ INT32_MAX)
-# define INT32_MAX 2147483647
-# define UINT32_MAX 4294967295U
-
-# if defined GL_INT64_T && ! defined INT64_MAX
-/* Prefer (- INTMAX_C (1) << 63) over (~ INT64_MAX) because SunPRO C 5.0
- evaluates the latter incorrectly in preprocessor expressions. */
-# define INT64_MIN (- INTMAX_C (1) << 63)
-# define INT64_MAX INTMAX_C (9223372036854775807)
-# endif
-
-# if defined GL_UINT64_T && ! defined UINT64_MAX
-# define UINT64_MAX UINTMAX_C (18446744073709551615)
-# endif
-
-/* 7.18.2.2. Limits of minimum-width integer types */
-
-/* Here we assume a standard architecture where the hardware integer
- types have 8, 16, 32, optionally 64 bits. Therefore the leastN_t types
- are the same as the corresponding N_t types. */
-
-# undef INT_LEAST8_MIN
-# undef INT_LEAST8_MAX
-# undef UINT_LEAST8_MAX
-# define INT_LEAST8_MIN INT8_MIN
-# define INT_LEAST8_MAX INT8_MAX
-# define UINT_LEAST8_MAX UINT8_MAX
-
-# undef INT_LEAST16_MIN
-# undef INT_LEAST16_MAX
-# undef UINT_LEAST16_MAX
-# define INT_LEAST16_MIN INT16_MIN
-# define INT_LEAST16_MAX INT16_MAX
-# define UINT_LEAST16_MAX UINT16_MAX
-
-# undef INT_LEAST32_MIN
-# undef INT_LEAST32_MAX
-# undef UINT_LEAST32_MAX
-# define INT_LEAST32_MIN INT32_MIN
-# define INT_LEAST32_MAX INT32_MAX
-# define UINT_LEAST32_MAX UINT32_MAX
-
-# undef INT_LEAST64_MIN
-# undef INT_LEAST64_MAX
-# ifdef GL_INT64_T
-# define INT_LEAST64_MIN INT64_MIN
-# define INT_LEAST64_MAX INT64_MAX
-# endif
-
-# undef UINT_LEAST64_MAX
-# ifdef GL_UINT64_T
-# define UINT_LEAST64_MAX UINT64_MAX
-# endif
-
-/* 7.18.2.3. Limits of fastest minimum-width integer types */
-
-/* Here we assume a standard architecture where the hardware integer
- types have 8, 16, 32, optionally 64 bits. Therefore the fastN_t types
- are taken from the same list of types. */
-
-# undef INT_FAST8_MIN
-# undef INT_FAST8_MAX
-# undef UINT_FAST8_MAX
-# define INT_FAST8_MIN SCHAR_MIN
-# define INT_FAST8_MAX SCHAR_MAX
-# define UINT_FAST8_MAX UCHAR_MAX
-
-# undef INT_FAST16_MIN
-# undef INT_FAST16_MAX
-# undef UINT_FAST16_MAX
-# define INT_FAST16_MIN INT_FAST32_MIN
-# define INT_FAST16_MAX INT_FAST32_MAX
-# define UINT_FAST16_MAX UINT_FAST32_MAX
-
-# undef INT_FAST32_MIN
-# undef INT_FAST32_MAX
-# undef UINT_FAST32_MAX
-# ifdef __sun
-# define INT_FAST32_MIN INT_MIN
-# define INT_FAST32_MAX INT_MAX
-# define UINT_FAST32_MAX UINT_MAX
-# else
-# define INT_FAST32_MIN LONG_MIN
-# define INT_FAST32_MAX LONG_MAX
-# define UINT_FAST32_MAX ULONG_MAX
-# endif
-
-# undef INT_FAST64_MIN
-# undef INT_FAST64_MAX
-# ifdef GL_INT64_T
-# define INT_FAST64_MIN INT64_MIN
-# define INT_FAST64_MAX INT64_MAX
-# endif
-
-# undef UINT_FAST64_MAX
-# ifdef GL_UINT64_T
-# define UINT_FAST64_MAX UINT64_MAX
-# endif
-
-/* 7.18.2.4. Limits of integer types capable of holding object pointers */
-
-# undef INTPTR_MIN
-# undef INTPTR_MAX
-# undef UINTPTR_MAX
-# ifdef _WIN64
-# define INTPTR_MIN LLONG_MIN
-# define INTPTR_MAX LLONG_MAX
-# define UINTPTR_MAX ULLONG_MAX
-# else
-# define INTPTR_MIN LONG_MIN
-# define INTPTR_MAX LONG_MAX
-# define UINTPTR_MAX ULONG_MAX
-# endif
-
-/* 7.18.2.5. Limits of greatest-width integer types */
-
-# ifndef INTMAX_MAX
-# undef INTMAX_MIN
-# ifdef INT64_MAX
-# define INTMAX_MIN INT64_MIN
-# define INTMAX_MAX INT64_MAX
-# else
-# define INTMAX_MIN INT32_MIN
-# define INTMAX_MAX INT32_MAX
-# endif
-# endif
-
-# ifndef UINTMAX_MAX
-# ifdef UINT64_MAX
-# define UINTMAX_MAX UINT64_MAX
-# else
-# define UINTMAX_MAX UINT32_MAX
-# endif
-# endif
-
-/* 7.18.3. Limits of other integer types */
-
-/* ptrdiff_t limits */
-# undef PTRDIFF_MIN
-# undef PTRDIFF_MAX
-# if @APPLE_UNIVERSAL_BUILD@
-# ifdef _LP64
-# define PTRDIFF_MIN _STDINT_SIGNED_MIN (64, 0l)
-# define PTRDIFF_MAX _STDINT_MAX (1, 64, 0l)
-# else
-# define PTRDIFF_MIN _STDINT_SIGNED_MIN (32, 0)
-# define PTRDIFF_MAX _STDINT_MAX (1, 32, 0)
-# endif
-# else
-# define PTRDIFF_MIN \
- _STDINT_SIGNED_MIN (@BITSIZEOF_PTRDIFF_T@, 0@PTRDIFF_T_SUFFIX@)
-# define PTRDIFF_MAX \
- _STDINT_MAX (1, @BITSIZEOF_PTRDIFF_T@, 0@PTRDIFF_T_SUFFIX@)
-# endif
-
-/* sig_atomic_t limits */
-# undef SIG_ATOMIC_MIN
-# undef SIG_ATOMIC_MAX
-# if @HAVE_SIGNED_SIG_ATOMIC_T@
-# define SIG_ATOMIC_MIN \
- _STDINT_SIGNED_MIN (@BITSIZEOF_SIG_ATOMIC_T@, 0@SIG_ATOMIC_T_SUFFIX@)
-# else
-# define SIG_ATOMIC_MIN \
- _STDINT_UNSIGNED_MIN (@BITSIZEOF_SIG_ATOMIC_T@, 0@SIG_ATOMIC_T_SUFFIX@)
-# endif
-# define SIG_ATOMIC_MAX \
- _STDINT_MAX (@HAVE_SIGNED_SIG_ATOMIC_T@, @BITSIZEOF_SIG_ATOMIC_T@, \
- 0@SIG_ATOMIC_T_SUFFIX@)
-
-
-/* size_t limit */
-# undef SIZE_MAX
-# if @APPLE_UNIVERSAL_BUILD@
-# ifdef _LP64
-# define SIZE_MAX _STDINT_MAX (0, 64, 0ul)
-# else
-# define SIZE_MAX _STDINT_MAX (0, 32, 0ul)
-# endif
-# else
-# define SIZE_MAX _STDINT_MAX (0, @BITSIZEOF_SIZE_T@, 0@SIZE_T_SUFFIX@)
-# endif
-
-/* wchar_t limits */
-/* Get WCHAR_MIN, WCHAR_MAX.
- This include is not on the top, above, because on OSF/1 4.0 we have a
- sequence of nested includes
- <wchar.h> -> <stdio.h> -> <getopt.h> -> <stdlib.h>, and the latter includes
- <stdint.h> and assumes its types are already defined. */
-# if @HAVE_WCHAR_H@ && ! (defined WCHAR_MIN && defined WCHAR_MAX)
-# define _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
-# include <wchar.h>
-# undef _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
-# endif
-# undef WCHAR_MIN
-# undef WCHAR_MAX
-# if @HAVE_SIGNED_WCHAR_T@
-# define WCHAR_MIN \
- _STDINT_SIGNED_MIN (@BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@)
-# else
-# define WCHAR_MIN \
- _STDINT_UNSIGNED_MIN (@BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@)
-# endif
-# define WCHAR_MAX \
- _STDINT_MAX (@HAVE_SIGNED_WCHAR_T@, @BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@)
-
-/* wint_t limits */
-/* If gnulib's <wchar.h> or <wctype.h> overrides wint_t, @WINT_T_SUFFIX@ is not
- accurate, therefore use the definitions from above. */
-# if !@GNULIBHEADERS_OVERRIDE_WINT_T@
-# undef WINT_MIN
-# undef WINT_MAX
-# if @HAVE_SIGNED_WINT_T@
-# define WINT_MIN \
- _STDINT_SIGNED_MIN (@BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
-# else
-# define WINT_MIN \
- _STDINT_UNSIGNED_MIN (@BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
-# endif
-# define WINT_MAX \
- _STDINT_MAX (@HAVE_SIGNED_WINT_T@, @BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
-# endif
-
-/* 7.18.4. Macros for integer constants */
-
-/* 7.18.4.1. Macros for minimum-width integer constants */
-/* According to ISO C 99 Technical Corrigendum 1 */
-
-/* Here we assume a standard architecture where the hardware integer
- types have 8, 16, 32, optionally 64 bits, and int is 32 bits. */
-
-# undef INT8_C
-# undef UINT8_C
-# define INT8_C(x) x
-# define UINT8_C(x) x
-
-# undef INT16_C
-# undef UINT16_C
-# define INT16_C(x) x
-# define UINT16_C(x) x
-
-# undef INT32_C
-# undef UINT32_C
-# define INT32_C(x) x
-# define UINT32_C(x) x ## U
-
-# undef INT64_C
-# undef UINT64_C
-# if LONG_MAX >> 31 >> 31 == 1
-# define INT64_C(x) x##L
-# elif defined _MSC_VER
-# define INT64_C(x) x##i64
-# else
-# define INT64_C(x) x##LL
-# endif
-# if ULONG_MAX >> 31 >> 31 >> 1 == 1
-# define UINT64_C(x) x##UL
-# elif defined _MSC_VER
-# define UINT64_C(x) x##ui64
-# else
-# define UINT64_C(x) x##ULL
-# endif
-
-/* 7.18.4.2. Macros for greatest-width integer constants */
-
-# ifndef INTMAX_C
-# if LONG_MAX >> 30 == 1
-# define INTMAX_C(x) x##LL
-# elif defined GL_INT64_T
-# define INTMAX_C(x) INT64_C(x)
-# else
-# define INTMAX_C(x) x##L
-# endif
-# endif
-
-# ifndef UINTMAX_C
-# if ULONG_MAX >> 31 == 1
-# define UINTMAX_C(x) x##ULL
-# elif defined GL_UINT64_T
-# define UINTMAX_C(x) UINT64_C(x)
-# else
-# define UINTMAX_C(x) x##UL
-# endif
-# endif
-
-#endif /* !@HAVE_C99_STDINT_H@ */
-
-/* Macros specified by ISO/IEC TS 18661-1:2014. */
-
-#if (!defined UINTMAX_WIDTH \
- && (defined _GNU_SOURCE || defined __STDC_WANT_IEC_60559_BFP_EXT__))
-# ifdef INT8_MAX
-# define INT8_WIDTH _GL_INTEGER_WIDTH (INT8_MIN, INT8_MAX)
-# endif
-# ifdef UINT8_MAX
-# define UINT8_WIDTH _GL_INTEGER_WIDTH (0, UINT8_MAX)
-# endif
-# ifdef INT16_MAX
-# define INT16_WIDTH _GL_INTEGER_WIDTH (INT16_MIN, INT16_MAX)
-# endif
-# ifdef UINT16_MAX
-# define UINT16_WIDTH _GL_INTEGER_WIDTH (0, UINT16_MAX)
-# endif
-# ifdef INT32_MAX
-# define INT32_WIDTH _GL_INTEGER_WIDTH (INT32_MIN, INT32_MAX)
-# endif
-# ifdef UINT32_MAX
-# define UINT32_WIDTH _GL_INTEGER_WIDTH (0, UINT32_MAX)
-# endif
-# ifdef INT64_MAX
-# define INT64_WIDTH _GL_INTEGER_WIDTH (INT64_MIN, INT64_MAX)
-# endif
-# ifdef UINT64_MAX
-# define UINT64_WIDTH _GL_INTEGER_WIDTH (0, UINT64_MAX)
-# endif
-# define INT_LEAST8_WIDTH _GL_INTEGER_WIDTH (INT_LEAST8_MIN, INT_LEAST8_MAX)
-# define UINT_LEAST8_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST8_MAX)
-# define INT_LEAST16_WIDTH _GL_INTEGER_WIDTH (INT_LEAST16_MIN, INT_LEAST16_MAX)
-# define UINT_LEAST16_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST16_MAX)
-# define INT_LEAST32_WIDTH _GL_INTEGER_WIDTH (INT_LEAST32_MIN, INT_LEAST32_MAX)
-# define UINT_LEAST32_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST32_MAX)
-# define INT_LEAST64_WIDTH _GL_INTEGER_WIDTH (INT_LEAST64_MIN, INT_LEAST64_MAX)
-# define UINT_LEAST64_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST64_MAX)
-# define INT_FAST8_WIDTH _GL_INTEGER_WIDTH (INT_FAST8_MIN, INT_FAST8_MAX)
-# define UINT_FAST8_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST8_MAX)
-# define INT_FAST16_WIDTH _GL_INTEGER_WIDTH (INT_FAST16_MIN, INT_FAST16_MAX)
-# define UINT_FAST16_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST16_MAX)
-# define INT_FAST32_WIDTH _GL_INTEGER_WIDTH (INT_FAST32_MIN, INT_FAST32_MAX)
-# define UINT_FAST32_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST32_MAX)
-# define INT_FAST64_WIDTH _GL_INTEGER_WIDTH (INT_FAST64_MIN, INT_FAST64_MAX)
-# define UINT_FAST64_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST64_MAX)
-# define INTPTR_WIDTH _GL_INTEGER_WIDTH (INTPTR_MIN, INTPTR_MAX)
-# define UINTPTR_WIDTH _GL_INTEGER_WIDTH (0, UINTPTR_MAX)
-# define INTMAX_WIDTH _GL_INTEGER_WIDTH (INTMAX_MIN, INTMAX_MAX)
-# define UINTMAX_WIDTH _GL_INTEGER_WIDTH (0, UINTMAX_MAX)
-# define PTRDIFF_WIDTH _GL_INTEGER_WIDTH (PTRDIFF_MIN, PTRDIFF_MAX)
-# define SIZE_WIDTH _GL_INTEGER_WIDTH (0, SIZE_MAX)
-# define WCHAR_WIDTH _GL_INTEGER_WIDTH (WCHAR_MIN, WCHAR_MAX)
-# ifdef WINT_MAX
-# define WINT_WIDTH _GL_INTEGER_WIDTH (WINT_MIN, WINT_MAX)
-# endif
-# ifdef SIG_ATOMIC_MAX
-# define SIG_ATOMIC_WIDTH _GL_INTEGER_WIDTH (SIG_ATOMIC_MIN, SIG_ATOMIC_MAX)
-# endif
-#endif /* !WINT_WIDTH && (_GNU_SOURCE || __STDC_WANT_IEC_60559_BFP_EXT__) */
-
-#endif /* _@GUARD_PREFIX@_STDINT_H */
-#endif /* !(defined __ANDROID__ && ...) */
-#endif /* !defined _@GUARD_PREFIX@_STDINT_H && !defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H */
diff --git a/cross/lib/stdio-impl.h b/cross/lib/stdio-impl.h
deleted file mode 100644
index 46608bed198..00000000000
--- a/cross/lib/stdio-impl.h
+++ /dev/null
@@ -1,218 +0,0 @@
-/* Implementation details of FILE streams.
- Copyright (C) 2007-2008, 2010-2023 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
-# ifdef __LP64__
-# define _gl_file_offset_t int64_t
-# else
- /* see https://android.googlesource.com/platform/bionic/+/master/docs/32-bit-abi.md */
-# define _gl_file_offset_t __kernel_off_t
-# 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; \
- _gl_file_offset_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/cross/lib/stdio.in.h b/cross/lib/stdio.in.h
deleted file mode 100644
index 3f8ea985335..00000000000
--- a/cross/lib/stdio.in.h
+++ /dev/null
@@ -1,1723 +0,0 @@
-/* A GNU-like <stdio.h>.
-
- Copyright (C) 2004, 2007-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#if __GNUC__ >= 3
-@PRAGMA_SYSTEM_HEADER@
-#endif
-@PRAGMA_COLUMNS@
-
-#if defined __need_FILE || defined __need___FILE || defined _GL_ALREADY_INCLUDING_STDIO_H
-/* Special invocation convention:
- - Inside glibc header files.
- - On OSF/1 5.1 we have a sequence of nested includes
- <stdio.h> -> <getopt.h> -> <ctype.h> -> <sys/localedef.h> ->
- <sys/lc_core.h> -> <nl_types.h> -> <mesg.h> -> <stdio.h>.
- In this situation, the functions are not yet declared, therefore we cannot
- provide the C++ aliases. */
-
-#@INCLUDE_NEXT@ @NEXT_STDIO_H@
-
-#else
-/* Normal invocation convention. */
-
-#ifndef _@GUARD_PREFIX@_STDIO_H
-
-#define _GL_ALREADY_INCLUDING_STDIO_H
-
-/* The include_next requires a split double-inclusion guard. */
-#@INCLUDE_NEXT@ @NEXT_STDIO_H@
-
-#undef _GL_ALREADY_INCLUDING_STDIO_H
-
-#ifndef _@GUARD_PREFIX@_STDIO_H
-#define _@GUARD_PREFIX@_STDIO_H
-
-/* Get va_list. Needed on many systems, including glibc 2.8. */
-#include <stdarg.h>
-
-#include <stddef.h>
-
-/* Get off_t and ssize_t. Needed on many systems, including glibc 2.8
- and eglibc 2.11.2.
- May also define off_t to a 64-bit type on native Windows. */
-#include <sys/types.h>
-
-/* Solaris 10 and NetBSD 7.0 declare renameat in <unistd.h>, not in <stdio.h>. */
-/* But in any case avoid namespace pollution on glibc systems. */
-#if (@GNULIB_RENAMEAT@ || defined GNULIB_POSIXCHECK) && (defined __sun || defined __NetBSD__) \
- && ! defined __GLIBC__
-# include <unistd.h>
-#endif
-
-/* Android 4.3 declares renameat in <sys/stat.h>, not in <stdio.h>. */
-/* But in any case avoid namespace pollution on glibc systems. */
-#if (@GNULIB_RENAMEAT@ || defined GNULIB_POSIXCHECK) && defined __ANDROID__ \
- && ! defined __GLIBC__
-# include <sys/stat.h>
-#endif
-
-/* MSVC declares 'perror' in <stdlib.h>, not in <stdio.h>. We must include
- it before we #define perror rpl_perror. */
-/* But in any case avoid namespace pollution on glibc systems. */
-#if (@GNULIB_PERROR@ || defined GNULIB_POSIXCHECK) \
- && (defined _WIN32 && ! defined __CYGWIN__) \
- && ! defined __GLIBC__
-# include <stdlib.h>
-#endif
-
-/* MSVC declares 'remove' in <io.h>, not in <stdio.h>. We must include
- it before we #define remove rpl_remove. */
-/* MSVC declares 'rename' in <io.h>, not in <stdio.h>. We must include
- it before we #define rename rpl_rename. */
-/* But in any case avoid namespace pollution on glibc systems. */
-#if (@GNULIB_REMOVE@ || @GNULIB_RENAME@ || defined GNULIB_POSIXCHECK) \
- && (defined _WIN32 && ! defined __CYGWIN__) \
- && ! defined __GLIBC__
-# include <io.h>
-#endif
-
-
-/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
- that can be freed by passing them as the Ith argument to the
- function F. */
-#ifndef _GL_ATTRIBUTE_DEALLOC
-# if __GNUC__ >= 11
-# define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
-# else
-# define _GL_ATTRIBUTE_DEALLOC(f, i)
-# endif
-#endif
-
-/* The __attribute__ feature is available in gcc versions 2.5 and later.
- The __-protected variants of the attributes 'format' and 'printf' are
- accepted by gcc versions 2.6.4 (effectively 2.7) and later.
- We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
- gnulib and libintl do '#define printf __printf__' when they override
- the 'printf' function. */
-#ifndef _GL_ATTRIBUTE_FORMAT
-# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) || defined __clang__
-# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
-# else
-# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
-# endif
-#endif
-
-/* An __attribute__ __format__ specifier for a function that takes a format
- string and arguments, where the format string directives are the ones
- standardized by ISO C99 and POSIX.
- _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD */
-/* __gnu_printf__ is supported in GCC >= 4.4. */
-#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
-# define _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD __gnu_printf__
-#else
-# define _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD __printf__
-#endif
-
-/* An __attribute__ __format__ specifier for a function that takes a format
- string and arguments, where the format string directives are the ones of the
- system printf(), rather than the ones standardized by ISO C99 and POSIX.
- _GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM */
-/* On mingw, Gnulib sets __USE_MINGW_ANSI_STDIO in order to get closer to
- the standards. The macro GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU indicates
- whether this change is effective. On older mingw, it is not. */
-#if GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU
-# define _GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD
-#else
-# define _GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM __printf__
-#endif
-
-/* _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD
- indicates to GCC that the function takes a format string and arguments,
- where the format string directives are the ones standardized by ISO C99
- and POSIX. */
-#define _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD(formatstring_parameter, first_argument) \
- _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, formatstring_parameter, first_argument))
-
-/* _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD,
- except that it indicates to GCC that the supported format string directives
- are the ones of the system printf(), rather than the ones standardized by
- ISO C99 and POSIX. */
-#define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \
- _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM, formatstring_parameter, first_argument))
-
-/* _GL_ATTRIBUTE_FORMAT_SCANF
- indicates to GCC that the function takes a format string and arguments,
- where the format string directives are the ones standardized by ISO C99
- and POSIX. */
-#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
-# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
- _GL_ATTRIBUTE_FORMAT ((__gnu_scanf__, formatstring_parameter, first_argument))
-#else
-# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
- _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
-#endif
-
-/* _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_SCANF,
- except that it indicates to GCC that the supported format string directives
- are the ones of the system scanf(), rather than the ones standardized by
- ISO C99 and POSIX. */
-#define _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM(formatstring_parameter, first_argument) \
- _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
-
-/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
-
-/* The definition of _GL_ARG_NONNULL is copied here. */
-
-/* The definition of _GL_WARN_ON_USE is copied here. */
-
-/* Macros for stringification. */
-#define _GL_STDIO_STRINGIZE(token) #token
-#define _GL_STDIO_MACROEXPAND_AND_STRINGIZE(token) _GL_STDIO_STRINGIZE(token)
-
-/* When also using extern inline, suppress the use of static inline in
- standard headers of problematic Apple configurations, as Libc at
- least through Libc-825.26 (2013-04-09) mishandles it; see, e.g.,
- <https://lists.gnu.org/r/bug-gnulib/2012-12/msg00023.html>.
- Perhaps Apple will fix this some day. */
-#if (defined _GL_EXTERN_INLINE_IN_USE && defined __APPLE__ \
- && defined __GNUC__ && defined __STDC__)
-# undef putc_unlocked
-#endif
-
-#if @GNULIB_DPRINTF@
-# if @REPLACE_DPRINTF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define dprintf rpl_dprintf
-# endif
-_GL_FUNCDECL_RPL (dprintf, int, (int fd, const char *restrict format, ...)
- _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
- _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (dprintf, int, (int fd, const char *restrict format, ...));
-# else
-# if !@HAVE_DPRINTF@
-_GL_FUNCDECL_SYS (dprintf, int, (int fd, const char *restrict format, ...)
- _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
- _GL_ARG_NONNULL ((2)));
-# endif
-_GL_CXXALIAS_SYS (dprintf, int, (int fd, const char *restrict format, ...));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (dprintf);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef dprintf
-# if HAVE_RAW_DECL_DPRINTF
-_GL_WARN_ON_USE (dprintf, "dprintf is unportable - "
- "use gnulib module dprintf for portability");
-# endif
-#endif
-
-#if @GNULIB_FCLOSE@
-/* Close STREAM and its underlying file descriptor. */
-# if @REPLACE_FCLOSE@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define fclose rpl_fclose
-# endif
-_GL_FUNCDECL_RPL (fclose, int, (FILE *stream) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (fclose, int, (FILE *stream));
-# else
-_GL_CXXALIAS_SYS (fclose, int, (FILE *stream));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (fclose);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef fclose
-/* Assume fclose is always declared. */
-_GL_WARN_ON_USE (fclose, "fclose is not always POSIX compliant - "
- "use gnulib module fclose for portable POSIX compliance");
-#endif
-
-#if @GNULIB_MDA_FCLOSEALL@
-/* On native Windows, map 'fcloseall' to '_fcloseall', so that -loldnames is
- not required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::fcloseall on all platforms that have
- it. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fcloseall
-# define fcloseall _fcloseall
-# endif
-_GL_CXXALIAS_MDA (fcloseall, int, (void));
-# else
-# if @HAVE_DECL_FCLOSEALL@
-# if defined __FreeBSD__ || defined __DragonFly__
-_GL_CXXALIAS_SYS (fcloseall, void, (void));
-# else
-_GL_CXXALIAS_SYS (fcloseall, int, (void));
-# endif
-# endif
-# endif
-# if (defined _WIN32 && !defined __CYGWIN__) || @HAVE_DECL_FCLOSEALL@
-_GL_CXXALIASWARN (fcloseall);
-# endif
-#endif
-
-#if @GNULIB_FDOPEN@
-# if @REPLACE_FDOPEN@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fdopen
-# define fdopen rpl_fdopen
-# endif
-_GL_FUNCDECL_RPL (fdopen, FILE *,
- (int fd, const char *mode)
- _GL_ARG_NONNULL ((2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
-_GL_CXXALIAS_RPL (fdopen, FILE *, (int fd, const char *mode));
-# elif defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fdopen
-# define fdopen _fdopen
-# endif
-_GL_CXXALIAS_MDA (fdopen, FILE *, (int fd, const char *mode));
-# else
-# if __GNUC__ >= 11
-/* For -Wmismatched-dealloc: Associate fdopen with fclose or rpl_fclose. */
-_GL_FUNCDECL_SYS (fdopen, FILE *,
- (int fd, const char *mode)
- _GL_ARG_NONNULL ((2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
-# endif
-_GL_CXXALIAS_SYS (fdopen, FILE *, (int fd, const char *mode));
-# endif
-_GL_CXXALIASWARN (fdopen);
-#else
-# if @GNULIB_FCLOSE@ && __GNUC__ >= 11 && !defined fdopen
-/* For -Wmismatched-dealloc: Associate fdopen with fclose or rpl_fclose. */
-_GL_FUNCDECL_SYS (fdopen, FILE *,
- (int fd, const char *mode)
- _GL_ARG_NONNULL ((2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
-# endif
-# if defined GNULIB_POSIXCHECK
-# undef fdopen
-/* Assume fdopen is always declared. */
-_GL_WARN_ON_USE (fdopen, "fdopen on native Windows platforms is not POSIX compliant - "
- "use gnulib module fdopen for portability");
-# elif @GNULIB_MDA_FDOPEN@
-/* On native Windows, map 'fdopen' to '_fdopen', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::fdopen always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fdopen
-# define fdopen _fdopen
-# endif
-_GL_CXXALIAS_MDA (fdopen, FILE *, (int fd, const char *mode));
-# else
-_GL_CXXALIAS_SYS (fdopen, FILE *, (int fd, const char *mode));
-# endif
-_GL_CXXALIASWARN (fdopen);
-# endif
-#endif
-
-#if @GNULIB_FFLUSH@
-/* Flush all pending data on STREAM according to POSIX rules. Both
- output and seekable input streams are supported.
- Note! LOSS OF DATA can occur if fflush is applied on an input stream
- that is _not_seekable_ or on an update stream that is _not_seekable_
- and in which the most recent operation was input. Seekability can
- be tested with lseek(fileno(fp),0,SEEK_CUR). */
-# if @REPLACE_FFLUSH@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define fflush rpl_fflush
-# endif
-_GL_FUNCDECL_RPL (fflush, int, (FILE *gl_stream));
-_GL_CXXALIAS_RPL (fflush, int, (FILE *gl_stream));
-# else
-_GL_CXXALIAS_SYS (fflush, int, (FILE *gl_stream));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (fflush);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef fflush
-/* Assume fflush is always declared. */
-_GL_WARN_ON_USE (fflush, "fflush is not always POSIX compliant - "
- "use gnulib module fflush for portable POSIX compliance");
-#endif
-
-#if @GNULIB_FGETC@
-# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fgetc
-# define fgetc rpl_fgetc
-# endif
-_GL_FUNCDECL_RPL (fgetc, int, (FILE *stream) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (fgetc, int, (FILE *stream));
-# else
-_GL_CXXALIAS_SYS (fgetc, int, (FILE *stream));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (fgetc);
-# endif
-#endif
-
-#if @GNULIB_FGETS@
-# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fgets
-# define fgets rpl_fgets
-# endif
-_GL_FUNCDECL_RPL (fgets, char *,
- (char *restrict s, int n, FILE *restrict stream)
- _GL_ARG_NONNULL ((1, 3)));
-_GL_CXXALIAS_RPL (fgets, char *,
- (char *restrict s, int n, FILE *restrict stream));
-# else
-_GL_CXXALIAS_SYS (fgets, char *,
- (char *restrict s, int n, FILE *restrict stream));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (fgets);
-# endif
-#endif
-
-#if @GNULIB_MDA_FILENO@
-/* On native Windows, map 'fileno' to '_fileno', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::fileno always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fileno
-# define fileno _fileno
-# endif
-_GL_CXXALIAS_MDA (fileno, int, (FILE *restrict stream));
-# else
-_GL_CXXALIAS_SYS (fileno, int, (FILE *restrict stream));
-# endif
-_GL_CXXALIASWARN (fileno);
-#endif
-
-#if @GNULIB_FOPEN@
-# if (@GNULIB_FOPEN@ && @REPLACE_FOPEN@) \
- || (@GNULIB_FOPEN_GNU@ && @REPLACE_FOPEN_FOR_FOPEN_GNU@)
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fopen
-# define fopen rpl_fopen
-# endif
-_GL_FUNCDECL_RPL (fopen, FILE *,
- (const char *restrict filename, const char *restrict mode)
- _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
-_GL_CXXALIAS_RPL (fopen, FILE *,
- (const char *restrict filename, const char *restrict mode));
-# else
-# if __GNUC__ >= 11
-/* For -Wmismatched-dealloc: Associate fopen with fclose or rpl_fclose. */
-_GL_FUNCDECL_SYS (fopen, FILE *,
- (const char *restrict filename, const char *restrict mode)
- _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
-# endif
-_GL_CXXALIAS_SYS (fopen, FILE *,
- (const char *restrict filename, const char *restrict mode));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (fopen);
-# endif
-#else
-# if @GNULIB_FCLOSE@ && __GNUC__ >= 11 && !defined fopen
-/* For -Wmismatched-dealloc: Associate fopen with fclose or rpl_fclose. */
-_GL_FUNCDECL_SYS (fopen, FILE *,
- (const char *restrict filename, const char *restrict mode)
- _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (fclose, 1));
-# endif
-# if defined GNULIB_POSIXCHECK
-# undef fopen
-/* Assume fopen is always declared. */
-_GL_WARN_ON_USE (fopen, "fopen on native Windows platforms is not POSIX compliant - "
- "use gnulib module fopen for portability");
-# endif
-#endif
-
-#if @GNULIB_FPRINTF_POSIX@ || @GNULIB_FPRINTF@
-# if (@GNULIB_FPRINTF_POSIX@ && @REPLACE_FPRINTF@) \
- || (@GNULIB_FPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@))
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define fprintf rpl_fprintf
-# endif
-# define GNULIB_overrides_fprintf 1
-# if @GNULIB_FPRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@
-_GL_FUNCDECL_RPL (fprintf, int,
- (FILE *restrict fp, const char *restrict format, ...)
- _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
- _GL_ARG_NONNULL ((1, 2)));
-# else
-_GL_FUNCDECL_RPL (fprintf, int,
- (FILE *restrict fp, const char *restrict format, ...)
- _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 3)
- _GL_ARG_NONNULL ((1, 2)));
-# endif
-_GL_CXXALIAS_RPL (fprintf, int,
- (FILE *restrict fp, const char *restrict format, ...));
-# else
-_GL_CXXALIAS_SYS (fprintf, int,
- (FILE *restrict fp, const char *restrict format, ...));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (fprintf);
-# endif
-#endif
-#if !@GNULIB_FPRINTF_POSIX@ && defined GNULIB_POSIXCHECK
-# if !GNULIB_overrides_fprintf
-# undef fprintf
-# endif
-/* Assume fprintf is always declared. */
-_GL_WARN_ON_USE (fprintf, "fprintf is not always POSIX compliant - "
- "use gnulib module fprintf-posix for portable "
- "POSIX compliance");
-#endif
-
-#if @GNULIB_FPURGE@
-/* Discard all pending buffered I/O data on STREAM.
- STREAM must not be wide-character oriented.
- When discarding pending output, the file position is set back to where it
- was before the write calls. When discarding pending input, the file
- position is advanced to match the end of the previously read input.
- Return 0 if successful. Upon error, return -1 and set errno. */
-# if @REPLACE_FPURGE@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define fpurge rpl_fpurge
-# endif
-_GL_FUNCDECL_RPL (fpurge, int, (FILE *gl_stream) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (fpurge, int, (FILE *gl_stream));
-# else
-# if !@HAVE_DECL_FPURGE@
-_GL_FUNCDECL_SYS (fpurge, int, (FILE *gl_stream) _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (fpurge, int, (FILE *gl_stream));
-# endif
-_GL_CXXALIASWARN (fpurge);
-#elif defined GNULIB_POSIXCHECK
-# undef fpurge
-# if HAVE_RAW_DECL_FPURGE
-_GL_WARN_ON_USE (fpurge, "fpurge is not always present - "
- "use gnulib module fpurge for portability");
-# endif
-#endif
-
-#if @GNULIB_FPUTC@
-# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fputc
-# define fputc rpl_fputc
-# endif
-_GL_FUNCDECL_RPL (fputc, int, (int c, FILE *stream) _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (fputc, int, (int c, FILE *stream));
-# else
-_GL_CXXALIAS_SYS (fputc, int, (int c, FILE *stream));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (fputc);
-# endif
-#endif
-
-#if @GNULIB_FPUTS@
-# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fputs
-# define fputs rpl_fputs
-# endif
-_GL_FUNCDECL_RPL (fputs, int,
- (const char *restrict string, FILE *restrict stream)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (fputs, int,
- (const char *restrict string, FILE *restrict stream));
-# else
-_GL_CXXALIAS_SYS (fputs, int,
- (const char *restrict string, FILE *restrict stream));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (fputs);
-# endif
-#endif
-
-#if @GNULIB_FREAD@
-# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fread
-# define fread rpl_fread
-# endif
-_GL_FUNCDECL_RPL (fread, size_t,
- (void *restrict ptr, size_t s, size_t n,
- FILE *restrict stream)
- _GL_ARG_NONNULL ((4)));
-_GL_CXXALIAS_RPL (fread, size_t,
- (void *restrict ptr, size_t s, size_t n,
- FILE *restrict stream));
-# else
-_GL_CXXALIAS_SYS (fread, size_t,
- (void *restrict ptr, size_t s, size_t n,
- FILE *restrict stream));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (fread);
-# endif
-#endif
-
-#if @GNULIB_FREOPEN@
-# if @REPLACE_FREOPEN@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef freopen
-# define freopen rpl_freopen
-# endif
-_GL_FUNCDECL_RPL (freopen, FILE *,
- (const char *restrict filename, const char *restrict mode,
- FILE *restrict stream)
- _GL_ARG_NONNULL ((2, 3)));
-_GL_CXXALIAS_RPL (freopen, FILE *,
- (const char *restrict filename, const char *restrict mode,
- FILE *restrict stream));
-# else
-_GL_CXXALIAS_SYS (freopen, FILE *,
- (const char *restrict filename, const char *restrict mode,
- FILE *restrict stream));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (freopen);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef freopen
-/* Assume freopen is always declared. */
-_GL_WARN_ON_USE (freopen,
- "freopen on native Windows platforms is not POSIX compliant - "
- "use gnulib module freopen for portability");
-#endif
-
-#if @GNULIB_FSCANF@
-# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fscanf
-# define fscanf rpl_fscanf
-# endif
-_GL_FUNCDECL_RPL (fscanf, int,
- (FILE *restrict stream, const char *restrict format, ...)
- _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 3)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (fscanf, int,
- (FILE *restrict stream, const char *restrict format, ...));
-# else
-_GL_CXXALIAS_SYS (fscanf, int,
- (FILE *restrict stream, const char *restrict format, ...));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (fscanf);
-# endif
-#endif
-
-
-/* Set up the following warnings, based on which modules are in use.
- GNU Coding Standards discourage the use of fseek, since it imposes
- an arbitrary limitation on some 32-bit hosts. Remember that the
- fseek module depends on the fseeko module, so we only have three
- cases to consider:
-
- 1. The developer is not using either module. Issue a warning under
- GNULIB_POSIXCHECK for both functions, to remind them that both
- functions have bugs on some systems. _GL_NO_LARGE_FILES has no
- impact on this warning.
-
- 2. The developer is using both modules. They may be unaware of the
- arbitrary limitations of fseek, so issue a warning under
- GNULIB_POSIXCHECK. On the other hand, they may be using both
- modules intentionally, so the developer can define
- _GL_NO_LARGE_FILES in the compilation units where the use of fseek
- is safe, to silence the warning.
-
- 3. The developer is using the fseeko module, but not fseek. Gnulib
- guarantees that fseek will still work around platform bugs in that
- case, but we presume that the developer is aware of the pitfalls of
- fseek and was trying to avoid it, so issue a warning even when
- GNULIB_POSIXCHECK is undefined. Again, _GL_NO_LARGE_FILES can be
- defined to silence the warning in particular compilation units.
- In C++ compilations with GNULIB_NAMESPACE, in order to avoid that
- fseek gets defined as a macro, it is recommended that the developer
- uses the fseek module, even if he is not calling the fseek function.
-
- Most gnulib clients that perform stream operations should fall into
- category 3. */
-
-#if @GNULIB_FSEEK@
-# if defined GNULIB_POSIXCHECK && !defined _GL_NO_LARGE_FILES
-# define _GL_FSEEK_WARN /* Category 2, above. */
-# undef fseek
-# endif
-# if @REPLACE_FSEEK@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fseek
-# define fseek rpl_fseek
-# endif
-_GL_FUNCDECL_RPL (fseek, int, (FILE *fp, long offset, int whence)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (fseek, int, (FILE *fp, long offset, int whence));
-# else
-_GL_CXXALIAS_SYS (fseek, int, (FILE *fp, long offset, int whence));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (fseek);
-# endif
-#endif
-
-#if @GNULIB_FSEEKO@
-# if !@GNULIB_FSEEK@ && !defined _GL_NO_LARGE_FILES
-# define _GL_FSEEK_WARN /* Category 3, above. */
-# undef fseek
-# endif
-# if @REPLACE_FSEEKO@
-/* Provide an fseeko function that is aware of a preceding fflush(), and which
- detects pipes. */
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fseeko
-# define fseeko rpl_fseeko
-# endif
-_GL_FUNCDECL_RPL (fseeko, int, (FILE *fp, off_t offset, int whence)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (fseeko, int, (FILE *fp, off_t offset, int whence));
-# else
-# if ! @HAVE_DECL_FSEEKO@
-_GL_FUNCDECL_SYS (fseeko, int, (FILE *fp, off_t offset, int whence)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (fseeko, int, (FILE *fp, off_t offset, int whence));
-# endif
-_GL_CXXALIASWARN (fseeko);
-#elif defined GNULIB_POSIXCHECK
-# define _GL_FSEEK_WARN /* Category 1, above. */
-# undef fseek
-# undef fseeko
-# if HAVE_RAW_DECL_FSEEKO
-_GL_WARN_ON_USE (fseeko, "fseeko is unportable - "
- "use gnulib module fseeko for portability");
-# endif
-#endif
-
-#ifdef _GL_FSEEK_WARN
-# undef _GL_FSEEK_WARN
-/* Here, either fseek is undefined (but C89 guarantees that it is
- declared), or it is defined as rpl_fseek (declared above). */
-_GL_WARN_ON_USE (fseek, "fseek cannot handle files larger than 4 GB "
- "on 32-bit platforms - "
- "use fseeko function for handling of large files");
-#endif
-
-
-/* ftell, ftello. See the comments on fseek/fseeko. */
-
-#if @GNULIB_FTELL@
-# if defined GNULIB_POSIXCHECK && !defined _GL_NO_LARGE_FILES
-# define _GL_FTELL_WARN /* Category 2, above. */
-# undef ftell
-# endif
-# if @REPLACE_FTELL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef ftell
-# define ftell rpl_ftell
-# endif
-_GL_FUNCDECL_RPL (ftell, long, (FILE *fp) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (ftell, long, (FILE *fp));
-# else
-_GL_CXXALIAS_SYS (ftell, long, (FILE *fp));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (ftell);
-# endif
-#endif
-
-#if @GNULIB_FTELLO@
-# if !@GNULIB_FTELL@ && !defined _GL_NO_LARGE_FILES
-# define _GL_FTELL_WARN /* Category 3, above. */
-# undef ftell
-# endif
-# if @REPLACE_FTELLO@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef ftello
-# define ftello rpl_ftello
-# endif
-_GL_FUNCDECL_RPL (ftello, off_t, (FILE *fp) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (ftello, off_t, (FILE *fp));
-# else
-# if ! @HAVE_DECL_FTELLO@
-_GL_FUNCDECL_SYS (ftello, off_t, (FILE *fp) _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (ftello, off_t, (FILE *fp));
-# endif
-_GL_CXXALIASWARN (ftello);
-#elif defined GNULIB_POSIXCHECK
-# define _GL_FTELL_WARN /* Category 1, above. */
-# undef ftell
-# undef ftello
-# if HAVE_RAW_DECL_FTELLO
-_GL_WARN_ON_USE (ftello, "ftello is unportable - "
- "use gnulib module ftello for portability");
-# endif
-#endif
-
-#ifdef _GL_FTELL_WARN
-# undef _GL_FTELL_WARN
-/* Here, either ftell is undefined (but C89 guarantees that it is
- declared), or it is defined as rpl_ftell (declared above). */
-_GL_WARN_ON_USE (ftell, "ftell cannot handle files larger than 4 GB "
- "on 32-bit platforms - "
- "use ftello function for handling of large files");
-#endif
-
-
-#if @GNULIB_FWRITE@
-# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fwrite
-# define fwrite rpl_fwrite
-# endif
-_GL_FUNCDECL_RPL (fwrite, size_t,
- (const void *restrict ptr, size_t s, size_t n,
- FILE *restrict stream)
- _GL_ARG_NONNULL ((1, 4)));
-_GL_CXXALIAS_RPL (fwrite, size_t,
- (const void *restrict ptr, size_t s, size_t n,
- FILE *restrict stream));
-# else
-_GL_CXXALIAS_SYS (fwrite, size_t,
- (const void *restrict ptr, size_t s, size_t n,
- FILE *restrict stream));
-
-/* Work around bug 11959 when fortifying glibc 2.4 through 2.15
- <https://sourceware.org/bugzilla/show_bug.cgi?id=11959>,
- which sometimes causes an unwanted diagnostic for fwrite calls.
- This affects only function declaration attributes under certain
- versions of gcc and clang, and is not needed for C++. */
-# if (0 < __USE_FORTIFY_LEVEL \
- && __GLIBC__ == 2 && 4 <= __GLIBC_MINOR__ && __GLIBC_MINOR__ <= 15 \
- && 3 < __GNUC__ + (4 <= __GNUC_MINOR__) \
- && !defined __cplusplus)
-# undef fwrite
-# undef fwrite_unlocked
-extern size_t __REDIRECT (rpl_fwrite,
- (const void *__restrict, size_t, size_t,
- FILE *__restrict),
- fwrite);
-extern size_t __REDIRECT (rpl_fwrite_unlocked,
- (const void *__restrict, size_t, size_t,
- FILE *__restrict),
- fwrite_unlocked);
-# define fwrite rpl_fwrite
-# define fwrite_unlocked rpl_fwrite_unlocked
-# endif
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (fwrite);
-# endif
-#endif
-
-#if @GNULIB_GETC@
-# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef getc
-# define getc rpl_fgetc
-# endif
-_GL_FUNCDECL_RPL (fgetc, int, (FILE *stream) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL_1 (getc, rpl_fgetc, int, (FILE *stream));
-# else
-_GL_CXXALIAS_SYS (getc, int, (FILE *stream));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (getc);
-# endif
-#endif
-
-#if @GNULIB_GETCHAR@
-# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef getchar
-# define getchar rpl_getchar
-# endif
-_GL_FUNCDECL_RPL (getchar, int, (void));
-_GL_CXXALIAS_RPL (getchar, int, (void));
-# else
-_GL_CXXALIAS_SYS (getchar, int, (void));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (getchar);
-# endif
-#endif
-
-#if @GNULIB_GETDELIM@
-/* Read input, up to (and including) the next occurrence of DELIMITER, from
- STREAM, store it in *LINEPTR (and NUL-terminate it).
- *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE
- bytes of space. It is realloc'd as necessary.
- Return the number of bytes read and stored at *LINEPTR (not including the
- NUL terminator), or -1 on error or EOF. */
-# if @REPLACE_GETDELIM@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef getdelim
-# define getdelim rpl_getdelim
-# endif
-_GL_FUNCDECL_RPL (getdelim, ssize_t,
- (char **restrict lineptr, size_t *restrict linesize,
- int delimiter,
- FILE *restrict stream)
- _GL_ARG_NONNULL ((1, 2, 4)));
-_GL_CXXALIAS_RPL (getdelim, ssize_t,
- (char **restrict lineptr, size_t *restrict linesize,
- int delimiter,
- FILE *restrict stream));
-# else
-# if !@HAVE_DECL_GETDELIM@
-_GL_FUNCDECL_SYS (getdelim, ssize_t,
- (char **restrict lineptr, size_t *restrict linesize,
- int delimiter,
- FILE *restrict stream)
- _GL_ARG_NONNULL ((1, 2, 4)));
-# endif
-_GL_CXXALIAS_SYS (getdelim, ssize_t,
- (char **restrict lineptr, size_t *restrict linesize,
- int delimiter,
- FILE *restrict stream));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (getdelim);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef getdelim
-# if HAVE_RAW_DECL_GETDELIM
-_GL_WARN_ON_USE (getdelim, "getdelim is unportable - "
- "use gnulib module getdelim for portability");
-# endif
-#endif
-
-#if @GNULIB_GETLINE@
-/* Read a line, up to (and including) the next newline, from STREAM, store it
- in *LINEPTR (and NUL-terminate it).
- *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE
- bytes of space. It is realloc'd as necessary.
- Return the number of bytes read and stored at *LINEPTR (not including the
- NUL terminator), or -1 on error or EOF. */
-# if @REPLACE_GETLINE@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef getline
-# define getline rpl_getline
-# endif
-_GL_FUNCDECL_RPL (getline, ssize_t,
- (char **restrict lineptr, size_t *restrict linesize,
- FILE *restrict stream)
- _GL_ARG_NONNULL ((1, 2, 3)));
-_GL_CXXALIAS_RPL (getline, ssize_t,
- (char **restrict lineptr, size_t *restrict linesize,
- FILE *restrict stream));
-# else
-# if !@HAVE_DECL_GETLINE@
-_GL_FUNCDECL_SYS (getline, ssize_t,
- (char **restrict lineptr, size_t *restrict linesize,
- FILE *restrict stream)
- _GL_ARG_NONNULL ((1, 2, 3)));
-# endif
-_GL_CXXALIAS_SYS (getline, ssize_t,
- (char **restrict lineptr, size_t *restrict linesize,
- FILE *restrict stream));
-# endif
-# if __GLIBC__ >= 2 && @HAVE_DECL_GETLINE@
-_GL_CXXALIASWARN (getline);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef getline
-# if HAVE_RAW_DECL_GETLINE
-_GL_WARN_ON_USE (getline, "getline is unportable - "
- "use gnulib module getline for portability");
-# endif
-#endif
-
-/* It is very rare that the developer ever has full control of stdin,
- so any use of gets warrants an unconditional warning; besides, C11
- removed it. */
-#undef gets
-#if HAVE_RAW_DECL_GETS && !defined __cplusplus
-_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
-#endif
-
-#if @GNULIB_MDA_GETW@
-/* On native Windows, map 'getw' to '_getw', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::getw always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef getw
-# define getw _getw
-# endif
-_GL_CXXALIAS_MDA (getw, int, (FILE *restrict stream));
-# else
-# if @HAVE_DECL_GETW@
-_GL_CXXALIAS_SYS (getw, int, (FILE *restrict stream));
-# endif
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (getw);
-# endif
-#endif
-
-#if @GNULIB_OBSTACK_PRINTF@ || @GNULIB_OBSTACK_PRINTF_POSIX@
-struct obstack;
-/* Grow an obstack with formatted output. Return the number of
- bytes added to OBS. No trailing nul byte is added, and the
- object should be closed with obstack_finish before use. Upon
- memory allocation error, call obstack_alloc_failed_handler. Upon
- other error, return -1. */
-# if @REPLACE_OBSTACK_PRINTF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define obstack_printf rpl_obstack_printf
-# endif
-_GL_FUNCDECL_RPL (obstack_printf, int,
- (struct obstack *obs, const char *format, ...)
- _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (obstack_printf, int,
- (struct obstack *obs, const char *format, ...));
-# else
-# if !@HAVE_DECL_OBSTACK_PRINTF@
-_GL_FUNCDECL_SYS (obstack_printf, int,
- (struct obstack *obs, const char *format, ...)
- _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
- _GL_ARG_NONNULL ((1, 2)));
-# endif
-_GL_CXXALIAS_SYS (obstack_printf, int,
- (struct obstack *obs, const char *format, ...));
-# endif
-_GL_CXXALIASWARN (obstack_printf);
-# if @REPLACE_OBSTACK_PRINTF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define obstack_vprintf rpl_obstack_vprintf
-# endif
-_GL_FUNCDECL_RPL (obstack_vprintf, int,
- (struct obstack *obs, const char *format, va_list args)
- _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (obstack_vprintf, int,
- (struct obstack *obs, const char *format, va_list args));
-# else
-# if !@HAVE_DECL_OBSTACK_PRINTF@
-_GL_FUNCDECL_SYS (obstack_vprintf, int,
- (struct obstack *obs, const char *format, va_list args)
- _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
- _GL_ARG_NONNULL ((1, 2)));
-# endif
-_GL_CXXALIAS_SYS (obstack_vprintf, int,
- (struct obstack *obs, const char *format, va_list args));
-# endif
-_GL_CXXALIASWARN (obstack_vprintf);
-#endif
-
-#if @GNULIB_PCLOSE@
-# if !@HAVE_PCLOSE@
-_GL_FUNCDECL_SYS (pclose, int, (FILE *stream) _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (pclose, int, (FILE *stream));
-_GL_CXXALIASWARN (pclose);
-#elif defined GNULIB_POSIXCHECK
-# undef pclose
-# if HAVE_RAW_DECL_PCLOSE
-_GL_WARN_ON_USE (pclose, "pclose is unportable - "
- "use gnulib module pclose for more portability");
-# endif
-#endif
-
-#if @GNULIB_PERROR@
-/* Print a message to standard error, describing the value of ERRNO,
- (if STRING is not NULL and not empty) prefixed with STRING and ": ",
- and terminated with a newline. */
-# if @REPLACE_PERROR@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define perror rpl_perror
-# endif
-_GL_FUNCDECL_RPL (perror, void, (const char *string));
-_GL_CXXALIAS_RPL (perror, void, (const char *string));
-# else
-_GL_CXXALIAS_SYS (perror, void, (const char *string));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (perror);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef perror
-/* Assume perror is always declared. */
-_GL_WARN_ON_USE (perror, "perror is not always POSIX compliant - "
- "use gnulib module perror for portability");
-#endif
-
-#if @GNULIB_POPEN@
-# if @REPLACE_POPEN@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef popen
-# define popen rpl_popen
-# endif
-_GL_FUNCDECL_RPL (popen, FILE *,
- (const char *cmd, const char *mode)
- _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (pclose, 1));
-_GL_CXXALIAS_RPL (popen, FILE *, (const char *cmd, const char *mode));
-# else
-# if !@HAVE_POPEN@ || __GNUC__ >= 11
-_GL_FUNCDECL_SYS (popen, FILE *,
- (const char *cmd, const char *mode)
- _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (pclose, 1));
-# endif
-_GL_CXXALIAS_SYS (popen, FILE *, (const char *cmd, const char *mode));
-# endif
-_GL_CXXALIASWARN (popen);
-#else
-# if @GNULIB_PCLOSE@ && __GNUC__ >= 11 && !defined popen
-/* For -Wmismatched-dealloc: Associate popen with pclose or rpl_pclose. */
-_GL_FUNCDECL_SYS (popen, FILE *,
- (const char *cmd, const char *mode)
- _GL_ARG_NONNULL ((1, 2)) _GL_ATTRIBUTE_DEALLOC (pclose, 1));
-# endif
-# if defined GNULIB_POSIXCHECK
-# undef popen
-# if HAVE_RAW_DECL_POPEN
-_GL_WARN_ON_USE (popen, "popen is buggy on some platforms - "
- "use gnulib module popen or pipe for more portability");
-# endif
-# endif
-#endif
-
-#if @GNULIB_PRINTF_POSIX@ || @GNULIB_PRINTF@
-# if (@GNULIB_PRINTF_POSIX@ && @REPLACE_PRINTF@) \
- || (@GNULIB_PRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@))
-# if defined __GNUC__ || defined __clang__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-/* Don't break __attribute__((format(printf,M,N))). */
-# define printf __printf__
-# endif
-# if @GNULIB_PRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@
-_GL_FUNCDECL_RPL_1 (__printf__, int,
- (const char *restrict format, ...)
- __asm__ (@ASM_SYMBOL_PREFIX@
- _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf))
- _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (1, 2)
- _GL_ARG_NONNULL ((1)));
-# else
-_GL_FUNCDECL_RPL_1 (__printf__, int,
- (const char *restrict format, ...)
- __asm__ (@ASM_SYMBOL_PREFIX@
- _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf))
- _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (1, 2)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_RPL_1 (printf, __printf__, int, (const char *format, ...));
-# else
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define printf rpl_printf
-# endif
-_GL_FUNCDECL_RPL (printf, int,
- (const char *restrict format, ...)
- _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (1, 2)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (printf, int, (const char *restrict format, ...));
-# endif
-# define GNULIB_overrides_printf 1
-# else
-_GL_CXXALIAS_SYS (printf, int, (const char *restrict format, ...));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (printf);
-# endif
-#endif
-#if !@GNULIB_PRINTF_POSIX@ && defined GNULIB_POSIXCHECK
-# if !GNULIB_overrides_printf
-# undef printf
-# endif
-/* Assume printf is always declared. */
-_GL_WARN_ON_USE (printf, "printf is not always POSIX compliant - "
- "use gnulib module printf-posix for portable "
- "POSIX compliance");
-#endif
-
-#if @GNULIB_PUTC@
-# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef putc
-# define putc rpl_fputc
-# endif
-_GL_FUNCDECL_RPL (fputc, int, (int c, FILE *stream) _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL_1 (putc, rpl_fputc, int, (int c, FILE *stream));
-# else
-_GL_CXXALIAS_SYS (putc, int, (int c, FILE *stream));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (putc);
-# endif
-#endif
-
-#if @GNULIB_PUTCHAR@
-# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef putchar
-# define putchar rpl_putchar
-# endif
-_GL_FUNCDECL_RPL (putchar, int, (int c));
-_GL_CXXALIAS_RPL (putchar, int, (int c));
-# else
-_GL_CXXALIAS_SYS (putchar, int, (int c));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (putchar);
-# endif
-#endif
-
-#if @GNULIB_PUTS@
-# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef puts
-# define puts rpl_puts
-# endif
-_GL_FUNCDECL_RPL (puts, int, (const char *string) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (puts, int, (const char *string));
-# else
-_GL_CXXALIAS_SYS (puts, int, (const char *string));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (puts);
-# endif
-#endif
-
-#if @GNULIB_MDA_PUTW@
-/* On native Windows, map 'putw' to '_putw', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::putw always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef putw
-# define putw _putw
-# endif
-_GL_CXXALIAS_MDA (putw, int, (int w, FILE *restrict stream));
-# else
-# if @HAVE_DECL_PUTW@
-_GL_CXXALIAS_SYS (putw, int, (int w, FILE *restrict stream));
-# endif
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (putw);
-# endif
-#endif
-
-#if @GNULIB_REMOVE@
-# if @REPLACE_REMOVE@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef remove
-# define remove rpl_remove
-# endif
-_GL_FUNCDECL_RPL (remove, int, (const char *name) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (remove, int, (const char *name));
-# else
-_GL_CXXALIAS_SYS (remove, int, (const char *name));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (remove);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef remove
-/* Assume remove is always declared. */
-_GL_WARN_ON_USE (remove, "remove cannot handle directories on some platforms - "
- "use gnulib module remove for more portability");
-#endif
-
-#if @GNULIB_RENAME@
-# if @REPLACE_RENAME@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef rename
-# define rename rpl_rename
-# endif
-_GL_FUNCDECL_RPL (rename, int,
- (const char *old_filename, const char *new_filename)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (rename, int,
- (const char *old_filename, const char *new_filename));
-# else
-_GL_CXXALIAS_SYS (rename, int,
- (const char *old_filename, const char *new_filename));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (rename);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef rename
-/* Assume rename is always declared. */
-_GL_WARN_ON_USE (rename, "rename is buggy on some platforms - "
- "use gnulib module rename for more portability");
-#endif
-
-#if @GNULIB_RENAMEAT@
-# if @REPLACE_RENAMEAT@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef renameat
-# define renameat rpl_renameat
-# endif
-_GL_FUNCDECL_RPL (renameat, int,
- (int fd1, char const *file1, int fd2, char const *file2)
- _GL_ARG_NONNULL ((2, 4)));
-_GL_CXXALIAS_RPL (renameat, int,
- (int fd1, char const *file1, int fd2, char const *file2));
-# else
-# if !@HAVE_RENAMEAT@
-_GL_FUNCDECL_SYS (renameat, int,
- (int fd1, char const *file1, int fd2, char const *file2)
- _GL_ARG_NONNULL ((2, 4)));
-# endif
-_GL_CXXALIAS_SYS (renameat, int,
- (int fd1, char const *file1, int fd2, char const *file2));
-# endif
-_GL_CXXALIASWARN (renameat);
-#elif defined GNULIB_POSIXCHECK
-# undef renameat
-# if HAVE_RAW_DECL_RENAMEAT
-_GL_WARN_ON_USE (renameat, "renameat is not portable - "
- "use gnulib module renameat for portability");
-# endif
-#endif
-
-#if @GNULIB_SCANF@
-# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
-# if defined __GNUC__ || defined __clang__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef scanf
-/* Don't break __attribute__((format(scanf,M,N))). */
-# define scanf __scanf__
-# endif
-_GL_FUNCDECL_RPL_1 (__scanf__, int,
- (const char *restrict format, ...)
- __asm__ (@ASM_SYMBOL_PREFIX@
- _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_scanf))
- _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 2)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL_1 (scanf, __scanf__, int, (const char *restrict format, ...));
-# else
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef scanf
-# define scanf rpl_scanf
-# endif
-_GL_FUNCDECL_RPL (scanf, int, (const char *restrict format, ...)
- _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 2)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (scanf, int, (const char *restrict format, ...));
-# endif
-# else
-_GL_CXXALIAS_SYS (scanf, int, (const char *restrict format, ...));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (scanf);
-# endif
-#endif
-
-#if @GNULIB_SNPRINTF@
-# if @REPLACE_SNPRINTF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define snprintf rpl_snprintf
-# endif
-# define GNULIB_overrides_snprintf 1
-_GL_FUNCDECL_RPL (snprintf, int,
- (char *restrict str, size_t size,
- const char *restrict format, ...)
- _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 4)
- _GL_ARG_NONNULL ((3)));
-_GL_CXXALIAS_RPL (snprintf, int,
- (char *restrict str, size_t size,
- const char *restrict format, ...));
-# else
-# if !@HAVE_DECL_SNPRINTF@
-_GL_FUNCDECL_SYS (snprintf, int,
- (char *restrict str, size_t size,
- const char *restrict format, ...)
- _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 4)
- _GL_ARG_NONNULL ((3)));
-# endif
-_GL_CXXALIAS_SYS (snprintf, int,
- (char *restrict str, size_t size,
- const char *restrict format, ...));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (snprintf);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef snprintf
-# if HAVE_RAW_DECL_SNPRINTF
-_GL_WARN_ON_USE (snprintf, "snprintf is unportable - "
- "use gnulib module snprintf for portability");
-# endif
-#endif
-
-/* Some people would argue that all sprintf uses should be warned about
- (for example, OpenBSD issues a link warning for it),
- since it can cause security holes due to buffer overruns.
- However, we believe that sprintf can be used safely, and is more
- efficient than snprintf in those safe cases; and as proof of our
- belief, we use sprintf in several gnulib modules. So this header
- intentionally avoids adding a warning to sprintf except when
- GNULIB_POSIXCHECK is defined. */
-
-#if @GNULIB_SPRINTF_POSIX@
-# if @REPLACE_SPRINTF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define sprintf rpl_sprintf
-# endif
-# define GNULIB_overrides_sprintf 1
-_GL_FUNCDECL_RPL (sprintf, int,
- (char *restrict str, const char *restrict format, ...)
- _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (sprintf, int,
- (char *restrict str, const char *restrict format, ...));
-# else
-_GL_CXXALIAS_SYS (sprintf, int,
- (char *restrict str, const char *restrict format, ...));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (sprintf);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef sprintf
-/* Assume sprintf is always declared. */
-_GL_WARN_ON_USE (sprintf, "sprintf is not always POSIX compliant - "
- "use gnulib module sprintf-posix for portable "
- "POSIX compliance");
-#endif
-
-#if @GNULIB_MDA_TEMPNAM@
-/* On native Windows, map 'tempnam' to '_tempnam', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::tempnam always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef tempnam
-# define tempnam _tempnam
-# endif
-_GL_CXXALIAS_MDA (tempnam, char *, (const char *dir, const char *prefix));
-# else
-_GL_CXXALIAS_SYS (tempnam, char *, (const char *dir, const char *prefix));
-# endif
-_GL_CXXALIASWARN (tempnam);
-#endif
-
-#if @GNULIB_TMPFILE@
-# if @REPLACE_TMPFILE@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define tmpfile rpl_tmpfile
-# endif
-_GL_FUNCDECL_RPL (tmpfile, FILE *, (void)
- _GL_ATTRIBUTE_DEALLOC (fclose, 1));
-_GL_CXXALIAS_RPL (tmpfile, FILE *, (void));
-# else
-# if __GNUC__ >= 11
-/* For -Wmismatched-dealloc: Associate tmpfile with fclose or rpl_fclose. */
-_GL_FUNCDECL_SYS (tmpfile, FILE *, (void)
- _GL_ATTRIBUTE_DEALLOC (fclose, 1));
-# endif
-_GL_CXXALIAS_SYS (tmpfile, FILE *, (void));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (tmpfile);
-# endif
-#else
-# if @GNULIB_FCLOSE@ && __GNUC__ >= 11 && !defined tmpfile
-/* For -Wmismatched-dealloc: Associate tmpfile with fclose or rpl_fclose. */
-_GL_FUNCDECL_SYS (tmpfile, FILE *, (void)
- _GL_ATTRIBUTE_DEALLOC (fclose, 1));
-# endif
-# if defined GNULIB_POSIXCHECK
-# undef tmpfile
-# if HAVE_RAW_DECL_TMPFILE
-_GL_WARN_ON_USE (tmpfile, "tmpfile is not usable on mingw - "
- "use gnulib module tmpfile for portability");
-# endif
-# endif
-#endif
-
-#if @GNULIB_VASPRINTF@
-/* Write formatted output to a string dynamically allocated with malloc().
- If the memory allocation succeeds, store the address of the string in
- *RESULT and return the number of resulting bytes, excluding the trailing
- NUL. Upon memory allocation error, or some other error, return -1. */
-# if @REPLACE_VASPRINTF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define asprintf rpl_asprintf
-# endif
-# define GNULIB_overrides_asprintf
-_GL_FUNCDECL_RPL (asprintf, int,
- (char **result, const char *format, ...)
- _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (asprintf, int,
- (char **result, const char *format, ...));
-# else
-# if !@HAVE_VASPRINTF@
-_GL_FUNCDECL_SYS (asprintf, int,
- (char **result, const char *format, ...)
- _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
- _GL_ARG_NONNULL ((1, 2)));
-# endif
-_GL_CXXALIAS_SYS (asprintf, int,
- (char **result, const char *format, ...));
-# endif
-_GL_CXXALIASWARN (asprintf);
-# if @REPLACE_VASPRINTF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define vasprintf rpl_vasprintf
-# endif
-# define GNULIB_overrides_vasprintf 1
-_GL_FUNCDECL_RPL (vasprintf, int,
- (char **result, const char *format, va_list args)
- _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (vasprintf, int,
- (char **result, const char *format, va_list args));
-# else
-# if !@HAVE_VASPRINTF@
-_GL_FUNCDECL_SYS (vasprintf, int,
- (char **result, const char *format, va_list args)
- _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
- _GL_ARG_NONNULL ((1, 2)));
-# endif
-_GL_CXXALIAS_SYS (vasprintf, int,
- (char **result, const char *format, va_list args));
-# endif
-_GL_CXXALIASWARN (vasprintf);
-#endif
-
-#if @GNULIB_VDPRINTF@
-# if @REPLACE_VDPRINTF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define vdprintf rpl_vdprintf
-# endif
-_GL_FUNCDECL_RPL (vdprintf, int,
- (int fd, const char *restrict format, va_list args)
- _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
- _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (vdprintf, int,
- (int fd, const char *restrict format, va_list args));
-# else
-# if !@HAVE_VDPRINTF@
-_GL_FUNCDECL_SYS (vdprintf, int,
- (int fd, const char *restrict format, va_list args)
- _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
- _GL_ARG_NONNULL ((2)));
-# endif
-/* Need to cast, because on Solaris, the third parameter will likely be
- __va_list args. */
-_GL_CXXALIAS_SYS_CAST (vdprintf, int,
- (int fd, const char *restrict format, va_list args));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (vdprintf);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef vdprintf
-# if HAVE_RAW_DECL_VDPRINTF
-_GL_WARN_ON_USE (vdprintf, "vdprintf is unportable - "
- "use gnulib module vdprintf for portability");
-# endif
-#endif
-
-#if @GNULIB_VFPRINTF_POSIX@ || @GNULIB_VFPRINTF@
-# if (@GNULIB_VFPRINTF_POSIX@ && @REPLACE_VFPRINTF@) \
- || (@GNULIB_VFPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@))
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define vfprintf rpl_vfprintf
-# endif
-# define GNULIB_overrides_vfprintf 1
-# if @GNULIB_VFPRINTF_POSIX@
-_GL_FUNCDECL_RPL (vfprintf, int,
- (FILE *restrict fp,
- const char *restrict format, va_list args)
- _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
- _GL_ARG_NONNULL ((1, 2)));
-# else
-_GL_FUNCDECL_RPL (vfprintf, int,
- (FILE *restrict fp,
- const char *restrict format, va_list args)
- _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 0)
- _GL_ARG_NONNULL ((1, 2)));
-# endif
-_GL_CXXALIAS_RPL (vfprintf, int,
- (FILE *restrict fp,
- const char *restrict format, va_list args));
-# else
-/* Need to cast, because on Solaris, the third parameter is
- __va_list args
- and GCC's fixincludes did not change this to __gnuc_va_list. */
-_GL_CXXALIAS_SYS_CAST (vfprintf, int,
- (FILE *restrict fp,
- const char *restrict format, va_list args));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (vfprintf);
-# endif
-#endif
-#if !@GNULIB_VFPRINTF_POSIX@ && defined GNULIB_POSIXCHECK
-# if !GNULIB_overrides_vfprintf
-# undef vfprintf
-# endif
-/* Assume vfprintf is always declared. */
-_GL_WARN_ON_USE (vfprintf, "vfprintf is not always POSIX compliant - "
- "use gnulib module vfprintf-posix for portable "
- "POSIX compliance");
-#endif
-
-#if @GNULIB_VFSCANF@
-# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef vfscanf
-# define vfscanf rpl_vfscanf
-# endif
-_GL_FUNCDECL_RPL (vfscanf, int,
- (FILE *restrict stream,
- const char *restrict format, va_list args)
- _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 0)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (vfscanf, int,
- (FILE *restrict stream,
- const char *restrict format, va_list args));
-# else
-_GL_CXXALIAS_SYS (vfscanf, int,
- (FILE *restrict stream,
- const char *restrict format, va_list args));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (vfscanf);
-# endif
-#endif
-
-#if @GNULIB_VPRINTF_POSIX@ || @GNULIB_VPRINTF@
-# if (@GNULIB_VPRINTF_POSIX@ && @REPLACE_VPRINTF@) \
- || (@GNULIB_VPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@))
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define vprintf rpl_vprintf
-# endif
-# define GNULIB_overrides_vprintf 1
-# if @GNULIB_VPRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@
-_GL_FUNCDECL_RPL (vprintf, int, (const char *restrict format, va_list args)
- _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (1, 0)
- _GL_ARG_NONNULL ((1)));
-# else
-_GL_FUNCDECL_RPL (vprintf, int, (const char *restrict format, va_list args)
- _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (1, 0)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_RPL (vprintf, int, (const char *restrict format, va_list args));
-# else
-/* Need to cast, because on Solaris, the second parameter is
- __va_list args
- and GCC's fixincludes did not change this to __gnuc_va_list. */
-_GL_CXXALIAS_SYS_CAST (vprintf, int,
- (const char *restrict format, va_list args));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (vprintf);
-# endif
-#endif
-#if !@GNULIB_VPRINTF_POSIX@ && defined GNULIB_POSIXCHECK
-# if !GNULIB_overrides_vprintf
-# undef vprintf
-# endif
-/* Assume vprintf is always declared. */
-_GL_WARN_ON_USE (vprintf, "vprintf is not always POSIX compliant - "
- "use gnulib module vprintf-posix for portable "
- "POSIX compliance");
-#endif
-
-#if @GNULIB_VSCANF@
-# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef vscanf
-# define vscanf rpl_vscanf
-# endif
-_GL_FUNCDECL_RPL (vscanf, int, (const char *restrict format, va_list args)
- _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 0)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (vscanf, int, (const char *restrict format, va_list args));
-# else
-_GL_CXXALIAS_SYS (vscanf, int, (const char *restrict format, va_list args));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (vscanf);
-# endif
-#endif
-
-#if @GNULIB_VSNPRINTF@
-# if @REPLACE_VSNPRINTF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define vsnprintf rpl_vsnprintf
-# endif
-# define GNULIB_overrides_vsnprintf 1
-_GL_FUNCDECL_RPL (vsnprintf, int,
- (char *restrict str, size_t size,
- const char *restrict format, va_list args)
- _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 0)
- _GL_ARG_NONNULL ((3)));
-_GL_CXXALIAS_RPL (vsnprintf, int,
- (char *restrict str, size_t size,
- const char *restrict format, va_list args));
-# else
-# if !@HAVE_DECL_VSNPRINTF@
-_GL_FUNCDECL_SYS (vsnprintf, int,
- (char *restrict str, size_t size,
- const char *restrict format, va_list args)
- _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 0)
- _GL_ARG_NONNULL ((3)));
-# endif
-_GL_CXXALIAS_SYS (vsnprintf, int,
- (char *restrict str, size_t size,
- const char *restrict format, va_list args));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (vsnprintf);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef vsnprintf
-# if HAVE_RAW_DECL_VSNPRINTF
-_GL_WARN_ON_USE (vsnprintf, "vsnprintf is unportable - "
- "use gnulib module vsnprintf for portability");
-# endif
-#endif
-
-#if @GNULIB_VSPRINTF_POSIX@
-# if @REPLACE_VSPRINTF@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define vsprintf rpl_vsprintf
-# endif
-# define GNULIB_overrides_vsprintf 1
-_GL_FUNCDECL_RPL (vsprintf, int,
- (char *restrict str,
- const char *restrict format, va_list args)
- _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (vsprintf, int,
- (char *restrict str,
- const char *restrict format, va_list args));
-# else
-/* Need to cast, because on Solaris, the third parameter is
- __va_list args
- and GCC's fixincludes did not change this to __gnuc_va_list. */
-_GL_CXXALIAS_SYS_CAST (vsprintf, int,
- (char *restrict str,
- const char *restrict format, va_list args));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (vsprintf);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef vsprintf
-/* Assume vsprintf is always declared. */
-_GL_WARN_ON_USE (vsprintf, "vsprintf is not always POSIX compliant - "
- "use gnulib module vsprintf-posix for portable "
- "POSIX compliance");
-#endif
-
-#endif /* _@GUARD_PREFIX@_STDIO_H */
-#endif /* _@GUARD_PREFIX@_STDIO_H */
-#endif
diff --git a/cross/lib/stdlib.in.h b/cross/lib/stdlib.in.h
deleted file mode 100644
index a91f4e23d67..00000000000
--- a/cross/lib/stdlib.in.h
+++ /dev/null
@@ -1,1678 +0,0 @@
-/* A GNU-like <stdlib.h>.
-
- Copyright (C) 1995, 2001-2004, 2006-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#if __GNUC__ >= 3
-@PRAGMA_SYSTEM_HEADER@
-#endif
-@PRAGMA_COLUMNS@
-
-#if defined __need_system_stdlib_h || defined __need_malloc_and_calloc
-/* Special invocation conventions inside some gnulib header files,
- and inside some glibc header files, respectively. */
-
-#@INCLUDE_NEXT@ @NEXT_STDLIB_H@
-
-#else
-/* Normal invocation convention. */
-
-#ifndef _@GUARD_PREFIX@_STDLIB_H
-
-/* The include_next requires a split double-inclusion guard. */
-#@INCLUDE_NEXT@ @NEXT_STDLIB_H@
-
-#ifndef _@GUARD_PREFIX@_STDLIB_H
-#define _@GUARD_PREFIX@_STDLIB_H
-
-/* NetBSD 5.0 mis-defines NULL. */
-#include <stddef.h>
-
-/* MirBSD 10 defines WEXITSTATUS in <sys/wait.h>, not in <stdlib.h>. */
-#if @GNULIB_SYSTEM_POSIX@ && !defined WEXITSTATUS
-# include <sys/wait.h>
-#endif
-
-/* Solaris declares getloadavg() in <sys/loadavg.h>. */
-#if (@GNULIB_GETLOADAVG@ || defined GNULIB_POSIXCHECK) && @HAVE_SYS_LOADAVG_H@
-/* OpenIndiana has a bug: <sys/time.h> must be included before
- <sys/loadavg.h>. */
-# include <sys/time.h>
-# include <sys/loadavg.h>
-#endif
-
-/* Native Windows platforms declare _mktemp() in <io.h>. */
-#if defined _WIN32 && !defined __CYGWIN__
-# include <io.h>
-#endif
-
-#if @GNULIB_RANDOM_R@
-
-/* OSF/1 5.1 declares 'struct random_data' in <random.h>, which is included
- from <stdlib.h> if _REENTRANT is defined. Include it whenever we need
- 'struct random_data'. */
-# if @HAVE_RANDOM_H@
-# include <random.h>
-# endif
-
-# if !@HAVE_STRUCT_RANDOM_DATA@ || @REPLACE_RANDOM_R@ || !@HAVE_RANDOM_R@
-# include <stdint.h>
-# endif
-
-# if !@HAVE_STRUCT_RANDOM_DATA@
-/* Define 'struct random_data'.
- But allow multiple gnulib generated <stdlib.h> replacements to coexist. */
-# if !GNULIB_defined_struct_random_data
-struct random_data
-{
- int32_t *fptr; /* Front pointer. */
- int32_t *rptr; /* Rear pointer. */
- int32_t *state; /* Array of state values. */
- int rand_type; /* Type of random number generator. */
- int rand_deg; /* Degree of random number generator. */
- int rand_sep; /* Distance between front and rear. */
- int32_t *end_ptr; /* Pointer behind state table. */
-};
-# define GNULIB_defined_struct_random_data 1
-# endif
-# endif
-#endif
-
-#if (@GNULIB_MKSTEMP@ || @GNULIB_MKSTEMPS@ || @GNULIB_MKOSTEMP@ || @GNULIB_MKOSTEMPS@ || @GNULIB_GETSUBOPT@ || defined GNULIB_POSIXCHECK) && ! defined __GLIBC__ && !(defined _WIN32 && ! defined __CYGWIN__)
-/* On Mac OS X 10.3, only <unistd.h> declares mkstemp. */
-/* On Mac OS X 10.5, only <unistd.h> declares mkstemps. */
-/* On Mac OS X 10.13, only <unistd.h> declares mkostemp and mkostemps. */
-/* On Cygwin 1.7.1, only <unistd.h> declares getsubopt. */
-/* But avoid namespace pollution on glibc systems and native Windows. */
-# include <unistd.h>
-#endif
-
-/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
- that can be freed by passing them as the Ith argument to the
- function F. */
-#ifndef _GL_ATTRIBUTE_DEALLOC
-# if __GNUC__ >= 11
-# define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
-# else
-# define _GL_ATTRIBUTE_DEALLOC(f, i)
-# endif
-#endif
-
-/* _GL_ATTRIBUTE_DEALLOC_FREE declares that the function returns pointers that
- can be freed via 'free'; it can be used only after declaring 'free'. */
-/* Applies to: functions. Cannot be used on inline functions. */
-#ifndef _GL_ATTRIBUTE_DEALLOC_FREE
-# define _GL_ATTRIBUTE_DEALLOC_FREE _GL_ATTRIBUTE_DEALLOC (free, 1)
-#endif
-
-/* _GL_ATTRIBUTE_MALLOC declares that the function returns a pointer to freshly
- allocated memory. */
-/* Applies to: functions. */
-#ifndef _GL_ATTRIBUTE_MALLOC
-# if __GNUC__ >= 3 || defined __clang__
-# define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
-# else
-# define _GL_ATTRIBUTE_MALLOC
-# endif
-#endif
-
-/* The __attribute__ feature is available in gcc versions 2.5 and later.
- The attribute __pure__ was added in gcc 2.96. */
-#ifndef _GL_ATTRIBUTE_PURE
-# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
-# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
-# else
-# define _GL_ATTRIBUTE_PURE /* empty */
-# endif
-#endif
-
-/* The definition of _Noreturn is copied here. */
-
-/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
-
-/* The definition of _GL_ARG_NONNULL is copied here. */
-
-/* The definition of _GL_WARN_ON_USE is copied here. */
-
-
-/* Some systems do not define EXIT_*, despite otherwise supporting C89. */
-#ifndef EXIT_SUCCESS
-# define EXIT_SUCCESS 0
-#endif
-/* Tandem/NSK and other platforms that define EXIT_FAILURE as -1 interfere
- with proper operation of xargs. */
-#ifndef EXIT_FAILURE
-# define EXIT_FAILURE 1
-#elif EXIT_FAILURE != 1
-# undef EXIT_FAILURE
-# define EXIT_FAILURE 1
-#endif
-
-
-#if @GNULIB__EXIT@
-/* Terminate the current process with the given return code, without running
- the 'atexit' handlers. */
-# if @REPLACE__EXIT@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef _Exit
-# define _Exit rpl__Exit
-# endif
-_GL_FUNCDECL_RPL (_Exit, _Noreturn void, (int status));
-_GL_CXXALIAS_RPL (_Exit, void, (int status));
-# else
-# if !@HAVE__EXIT@
-_GL_FUNCDECL_SYS (_Exit, _Noreturn void, (int status));
-# endif
-_GL_CXXALIAS_SYS (_Exit, void, (int status));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (_Exit);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef _Exit
-# if HAVE_RAW_DECL__EXIT
-_GL_WARN_ON_USE (_Exit, "_Exit is unportable - "
- "use gnulib module _Exit for portability");
-# endif
-#endif
-
-
-#if @GNULIB_FREE_POSIX@
-# if @REPLACE_FREE@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef free
-# define free rpl_free
-# endif
-# if defined __cplusplus && (__GLIBC__ + (__GLIBC_MINOR__ >= 14) > 2)
-_GL_FUNCDECL_RPL (free, void, (void *ptr) throw ());
-# else
-_GL_FUNCDECL_RPL (free, void, (void *ptr));
-# endif
-_GL_CXXALIAS_RPL (free, void, (void *ptr));
-# else
-_GL_CXXALIAS_SYS (free, void, (void *ptr));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (free);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef free
-/* Assume free is always declared. */
-_GL_WARN_ON_USE (free, "free is not future POSIX compliant everywhere - "
- "use gnulib module free for portability");
-#endif
-
-
-/* Allocate memory with indefinite extent and specified alignment. */
-#if @GNULIB_ALIGNED_ALLOC@
-# if @REPLACE_ALIGNED_ALLOC@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef aligned_alloc
-# define aligned_alloc rpl_aligned_alloc
-# endif
-_GL_FUNCDECL_RPL (aligned_alloc, void *,
- (size_t alignment, size_t size)
- _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
-_GL_CXXALIAS_RPL (aligned_alloc, void *, (size_t alignment, size_t size));
-# else
-# if @HAVE_ALIGNED_ALLOC@
-# if __GNUC__ >= 11
-/* For -Wmismatched-dealloc: Associate aligned_alloc with free or rpl_free. */
-_GL_FUNCDECL_SYS (aligned_alloc, void *,
- (size_t alignment, size_t size)
- _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
-# endif
-_GL_CXXALIAS_SYS (aligned_alloc, void *, (size_t alignment, size_t size));
-# endif
-# endif
-# if (__GLIBC__ >= 2) && @HAVE_ALIGNED_ALLOC@
-_GL_CXXALIASWARN (aligned_alloc);
-# endif
-#else
-# if @GNULIB_FREE_POSIX@ && __GNUC__ >= 11 && !defined aligned_alloc
-/* For -Wmismatched-dealloc: Associate aligned_alloc with free or rpl_free. */
-_GL_FUNCDECL_SYS (aligned_alloc, void *,
- (size_t alignment, size_t size)
- _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
-# endif
-# if defined GNULIB_POSIXCHECK
-# undef aligned_alloc
-# if HAVE_RAW_DECL_ALIGNED_ALLOC
-_GL_WARN_ON_USE (aligned_alloc, "aligned_alloc is not portable - "
- "use gnulib module aligned_alloc for portability");
-# endif
-# endif
-#endif
-
-#if @GNULIB_ATOLL@
-/* Parse a signed decimal integer.
- Returns the value of the integer. Errors are not detected. */
-# if !@HAVE_ATOLL@
-_GL_FUNCDECL_SYS (atoll, long long, (const char *string)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (atoll, long long, (const char *string));
-_GL_CXXALIASWARN (atoll);
-#elif defined GNULIB_POSIXCHECK
-# undef atoll
-# if HAVE_RAW_DECL_ATOLL
-_GL_WARN_ON_USE (atoll, "atoll is unportable - "
- "use gnulib module atoll for portability");
-# endif
-#endif
-
-#if @GNULIB_CALLOC_POSIX@
-# if (@GNULIB_CALLOC_POSIX@ && @REPLACE_CALLOC_FOR_CALLOC_POSIX@) \
- || (@GNULIB_CALLOC_GNU@ && @REPLACE_CALLOC_FOR_CALLOC_GNU@)
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef calloc
-# define calloc rpl_calloc
-# endif
-_GL_FUNCDECL_RPL (calloc, void *,
- (size_t nmemb, size_t size)
- _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
-_GL_CXXALIAS_RPL (calloc, void *, (size_t nmemb, size_t size));
-# else
-# if __GNUC__ >= 11
-/* For -Wmismatched-dealloc: Associate calloc with free or rpl_free. */
-_GL_FUNCDECL_SYS (calloc, void *,
- (size_t nmemb, size_t size)
- _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
-# endif
-_GL_CXXALIAS_SYS (calloc, void *, (size_t nmemb, size_t size));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (calloc);
-# endif
-#else
-# if @GNULIB_FREE_POSIX@ && __GNUC__ >= 11 && !defined calloc
-/* For -Wmismatched-dealloc: Associate calloc with free or rpl_free. */
-_GL_FUNCDECL_SYS (calloc, void *,
- (size_t nmemb, size_t size)
- _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
-# endif
-# if defined GNULIB_POSIXCHECK
-# undef calloc
-/* Assume calloc is always declared. */
-_GL_WARN_ON_USE (calloc, "calloc is not POSIX compliant everywhere - "
- "use gnulib module calloc-posix for portability");
-# endif
-#endif
-
-#if @GNULIB_CANONICALIZE_FILE_NAME@
-# if @REPLACE_CANONICALIZE_FILE_NAME@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define canonicalize_file_name rpl_canonicalize_file_name
-# endif
-_GL_FUNCDECL_RPL (canonicalize_file_name, char *,
- (const char *name)
- _GL_ARG_NONNULL ((1))
- _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
-_GL_CXXALIAS_RPL (canonicalize_file_name, char *, (const char *name));
-# else
-# if !@HAVE_CANONICALIZE_FILE_NAME@ || __GNUC__ >= 11
-_GL_FUNCDECL_SYS (canonicalize_file_name, char *,
- (const char *name)
- _GL_ARG_NONNULL ((1))
- _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
-# endif
-_GL_CXXALIAS_SYS (canonicalize_file_name, char *, (const char *name));
-# endif
-# ifndef GNULIB_defined_canonicalize_file_name
-# define GNULIB_defined_canonicalize_file_name \
- (!@HAVE_CANONICALIZE_FILE_NAME@ || @REPLACE_CANONICALIZE_FILE_NAME@)
-# endif
-_GL_CXXALIASWARN (canonicalize_file_name);
-#else
-# if @GNULIB_FREE_POSIX@ && __GNUC__ >= 11 && !defined canonicalize_file_name
-/* For -Wmismatched-dealloc: Associate canonicalize_file_name with free or
- rpl_free. */
-_GL_FUNCDECL_SYS (canonicalize_file_name, char *,
- (const char *name)
- _GL_ARG_NONNULL ((1))
- _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
-# endif
-# if defined GNULIB_POSIXCHECK
-# undef canonicalize_file_name
-# if HAVE_RAW_DECL_CANONICALIZE_FILE_NAME
-_GL_WARN_ON_USE (canonicalize_file_name,
- "canonicalize_file_name is unportable - "
- "use gnulib module canonicalize-lgpl for portability");
-# endif
-# endif
-#endif
-
-#if @GNULIB_MDA_ECVT@
-/* On native Windows, map 'ecvt' to '_ecvt', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::ecvt on all platforms that have
- it. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef ecvt
-# define ecvt _ecvt
-# endif
-_GL_CXXALIAS_MDA (ecvt, char *,
- (double number, int ndigits, int *decptp, int *signp));
-# else
-# if @HAVE_DECL_ECVT@
-_GL_CXXALIAS_SYS (ecvt, char *,
- (double number, int ndigits, int *decptp, int *signp));
-# endif
-# endif
-# if (defined _WIN32 && !defined __CYGWIN__) || @HAVE_DECL_ECVT@
-_GL_CXXALIASWARN (ecvt);
-# endif
-#endif
-
-#if @GNULIB_MDA_FCVT@
-/* On native Windows, map 'fcvt' to '_fcvt', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::fcvt on all platforms that have
- it. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fcvt
-# define fcvt _fcvt
-# endif
-_GL_CXXALIAS_MDA (fcvt, char *,
- (double number, int ndigits, int *decptp, int *signp));
-# else
-# if @HAVE_DECL_FCVT@
-_GL_CXXALIAS_SYS (fcvt, char *,
- (double number, int ndigits, int *decptp, int *signp));
-# endif
-# endif
-# if (defined _WIN32 && !defined __CYGWIN__) || @HAVE_DECL_FCVT@
-_GL_CXXALIASWARN (fcvt);
-# endif
-#endif
-
-#if @GNULIB_MDA_GCVT@
-/* On native Windows, map 'gcvt' to '_gcvt', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::gcvt on all platforms that have
- it. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef gcvt
-# define gcvt _gcvt
-# endif
-_GL_CXXALIAS_MDA (gcvt, char *, (double number, int ndigits, char *buf));
-# else
-# if @HAVE_DECL_GCVT@
-_GL_CXXALIAS_SYS (gcvt, char *, (double number, int ndigits, char *buf));
-# endif
-# endif
-# if (defined _WIN32 && !defined __CYGWIN__) || @HAVE_DECL_GCVT@
-_GL_CXXALIASWARN (gcvt);
-# endif
-#endif
-
-#if @GNULIB_GETLOADAVG@
-/* Store max(NELEM,3) load average numbers in LOADAVG[].
- The three numbers are the load average of the last 1 minute, the last 5
- minutes, and the last 15 minutes, respectively.
- LOADAVG is an array of NELEM numbers. */
-# if @REPLACE_GETLOADAVG@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef getloadavg
-# define getloadavg rpl_getloadavg
-# endif
-_GL_FUNCDECL_RPL (getloadavg, int, (double loadavg[], int nelem)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (getloadavg, int, (double loadavg[], int nelem));
-# else
-# if !@HAVE_DECL_GETLOADAVG@
-_GL_FUNCDECL_SYS (getloadavg, int, (double loadavg[], int nelem)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (getloadavg, int, (double loadavg[], int nelem));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (getloadavg);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef getloadavg
-# if HAVE_RAW_DECL_GETLOADAVG
-_GL_WARN_ON_USE (getloadavg, "getloadavg is not portable - "
- "use gnulib module getloadavg for portability");
-# endif
-#endif
-
-#if @GNULIB_GETPROGNAME@
-/* Return the base name of the executing program.
- On native Windows this will usually end in ".exe" or ".EXE". */
-# if @REPLACE_GETPROGNAME@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef getprogname
-# define getprogname rpl_getprogname
-# endif
-# ifdef HAVE_DECL_PROGRAM_INVOCATION_NAME
-_GL_FUNCDECL_RPL (getprogname, const char *, (void) _GL_ATTRIBUTE_PURE);
-# else
-_GL_FUNCDECL_RPL (getprogname, const char *, (void));
-# endif
-_GL_CXXALIAS_RPL (getprogname, const char *, (void));
-# else
-# if !@HAVE_GETPROGNAME@
-# ifdef HAVE_DECL_PROGRAM_INVOCATION_NAME
-_GL_FUNCDECL_SYS (getprogname, const char *, (void) _GL_ATTRIBUTE_PURE);
-# else
-_GL_FUNCDECL_SYS (getprogname, const char *, (void));
-# endif
-# endif
-_GL_CXXALIAS_SYS (getprogname, const char *, (void));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (getprogname);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef getprogname
-# if HAVE_RAW_DECL_GETPROGNAME
-_GL_WARN_ON_USE (getprogname, "getprogname is unportable - "
- "use gnulib module getprogname for portability");
-# endif
-#endif
-
-#if @GNULIB_GETSUBOPT@
-/* Assuming *OPTIONP is a comma separated list of elements of the form
- "token" or "token=value", getsubopt parses the first of these elements.
- If the first element refers to a "token" that is member of the given
- NULL-terminated array of tokens:
- - It replaces the comma with a NUL byte, updates *OPTIONP to point past
- the first option and the comma, sets *VALUEP to the value of the
- element (or NULL if it doesn't contain an "=" sign),
- - It returns the index of the "token" in the given array of tokens.
- Otherwise it returns -1, and *OPTIONP and *VALUEP are undefined.
- For more details see the POSIX specification.
- https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsubopt.html */
-# if @REPLACE_GETSUBOPT@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef getsubopt
-# define getsubopt rpl_getsubopt
-# endif
-_GL_FUNCDECL_RPL (getsubopt, int,
- (char **optionp, char *const *tokens, char **valuep)
- _GL_ARG_NONNULL ((1, 2, 3)));
-_GL_CXXALIAS_RPL (getsubopt, int,
- (char **optionp, char *const *tokens, char **valuep));
-# else
-# if !@HAVE_GETSUBOPT@
-_GL_FUNCDECL_SYS (getsubopt, int,
- (char **optionp, char *const *tokens, char **valuep)
- _GL_ARG_NONNULL ((1, 2, 3)));
-# endif
-_GL_CXXALIAS_SYS (getsubopt, int,
- (char **optionp, char *const *tokens, char **valuep));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (getsubopt);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef getsubopt
-# if HAVE_RAW_DECL_GETSUBOPT
-_GL_WARN_ON_USE (getsubopt, "getsubopt is unportable - "
- "use gnulib module getsubopt for portability");
-# endif
-#endif
-
-#if @GNULIB_GRANTPT@
-/* Change the ownership and access permission of the slave side of the
- pseudo-terminal whose master side is specified by FD. */
-# if !@HAVE_GRANTPT@
-_GL_FUNCDECL_SYS (grantpt, int, (int fd));
-# endif
-_GL_CXXALIAS_SYS (grantpt, int, (int fd));
-_GL_CXXALIASWARN (grantpt);
-#elif defined GNULIB_POSIXCHECK
-# undef grantpt
-# if HAVE_RAW_DECL_GRANTPT
-_GL_WARN_ON_USE (grantpt, "grantpt is not portable - "
- "use gnulib module grantpt for portability");
-# endif
-#endif
-
-/* If _GL_USE_STDLIB_ALLOC is nonzero, the including module does not
- rely on GNU or POSIX semantics for malloc and realloc (for example,
- by never specifying a zero size), so it does not need malloc or
- realloc to be redefined. */
-#if @GNULIB_MALLOC_POSIX@
-# if (@GNULIB_MALLOC_POSIX@ && @REPLACE_MALLOC_FOR_MALLOC_POSIX@) \
- || (@GNULIB_MALLOC_GNU@ && @REPLACE_MALLOC_FOR_MALLOC_GNU@)
-# if !((defined __cplusplus && defined GNULIB_NAMESPACE) \
- || _GL_USE_STDLIB_ALLOC)
-# undef malloc
-# define malloc rpl_malloc
-# endif
-_GL_FUNCDECL_RPL (malloc, void *,
- (size_t size)
- _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
-_GL_CXXALIAS_RPL (malloc, void *, (size_t size));
-# else
-# if __GNUC__ >= 11
-/* For -Wmismatched-dealloc: Associate malloc with free or rpl_free. */
-_GL_FUNCDECL_SYS (malloc, void *,
- (size_t size)
- _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
-# endif
-_GL_CXXALIAS_SYS (malloc, void *, (size_t size));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (malloc);
-# endif
-#else
-# if @GNULIB_FREE_POSIX@ && __GNUC__ >= 11 && !defined malloc
-/* For -Wmismatched-dealloc: Associate malloc with free or rpl_free. */
-_GL_FUNCDECL_SYS (malloc, void *,
- (size_t size)
- _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
-# endif
-# if defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
-# undef malloc
-/* Assume malloc is always declared. */
-_GL_WARN_ON_USE (malloc, "malloc is not POSIX compliant everywhere - "
- "use gnulib module malloc-posix for portability");
-# endif
-#endif
-
-/* Convert a multibyte character to a wide character. */
-#if @GNULIB_MBTOWC@
-# if @REPLACE_MBTOWC@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef mbtowc
-# define mbtowc rpl_mbtowc
-# endif
-_GL_FUNCDECL_RPL (mbtowc, int,
- (wchar_t *restrict pwc, const char *restrict s, size_t n));
-_GL_CXXALIAS_RPL (mbtowc, int,
- (wchar_t *restrict pwc, const char *restrict s, size_t n));
-# else
-# if !@HAVE_MBTOWC@
-_GL_FUNCDECL_SYS (mbtowc, int,
- (wchar_t *restrict pwc, const char *restrict s, size_t n));
-# endif
-_GL_CXXALIAS_SYS (mbtowc, int,
- (wchar_t *restrict pwc, const char *restrict s, size_t n));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (mbtowc);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef mbtowc
-# if HAVE_RAW_DECL_MBTOWC
-_GL_WARN_ON_USE (mbtowc, "mbtowc is not portable - "
- "use gnulib module mbtowc for portability");
-# endif
-#endif
-
-#if @GNULIB_MKDTEMP@
-/* Create a unique temporary directory from TEMPLATE.
- The last six characters of TEMPLATE must be "XXXXXX";
- they are replaced with a string that makes the directory name unique.
- Returns TEMPLATE, or a null pointer if it cannot get a unique name.
- The directory is created mode 700. */
-# if !@HAVE_MKDTEMP@
-_GL_FUNCDECL_SYS (mkdtemp, char *, (char * /*template*/) _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (mkdtemp, char *, (char * /*template*/));
-_GL_CXXALIASWARN (mkdtemp);
-#elif defined GNULIB_POSIXCHECK
-# undef mkdtemp
-# if HAVE_RAW_DECL_MKDTEMP
-_GL_WARN_ON_USE (mkdtemp, "mkdtemp is unportable - "
- "use gnulib module mkdtemp for portability");
-# endif
-#endif
-
-#if @GNULIB_MKOSTEMP@
-/* Create a unique temporary file from TEMPLATE.
- The last six characters of TEMPLATE must be "XXXXXX";
- they are replaced with a string that makes the file name unique.
- The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
- and O_TEXT, O_BINARY (defined in "binary-io.h").
- The file is then created, with the specified flags, ensuring it didn't exist
- before.
- The file is created read-write (mask at least 0600 & ~umask), but it may be
- world-readable and world-writable (mask 0666 & ~umask), depending on the
- implementation.
- Returns the open file descriptor if successful, otherwise -1 and errno
- set. */
-# if @REPLACE_MKOSTEMP@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef mkostemp
-# define mkostemp rpl_mkostemp
-# endif
-_GL_FUNCDECL_RPL (mkostemp, int, (char * /*template*/, int /*flags*/)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (mkostemp, int, (char * /*template*/, int /*flags*/));
-# else
-# if !@HAVE_MKOSTEMP@
-_GL_FUNCDECL_SYS (mkostemp, int, (char * /*template*/, int /*flags*/)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (mkostemp, int, (char * /*template*/, int /*flags*/));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (mkostemp);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef mkostemp
-# if HAVE_RAW_DECL_MKOSTEMP
-_GL_WARN_ON_USE (mkostemp, "mkostemp is unportable - "
- "use gnulib module mkostemp for portability");
-# endif
-#endif
-
-#if @GNULIB_MKOSTEMPS@
-/* Create a unique temporary file from TEMPLATE.
- The last six characters of TEMPLATE before a suffix of length
- SUFFIXLEN must be "XXXXXX";
- they are replaced with a string that makes the file name unique.
- The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
- and O_TEXT, O_BINARY (defined in "binary-io.h").
- The file is then created, with the specified flags, ensuring it didn't exist
- before.
- The file is created read-write (mask at least 0600 & ~umask), but it may be
- world-readable and world-writable (mask 0666 & ~umask), depending on the
- implementation.
- Returns the open file descriptor if successful, otherwise -1 and errno
- set. */
-# if @REPLACE_MKOSTEMPS@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef mkostemps
-# define mkostemps rpl_mkostemps
-# endif
-_GL_FUNCDECL_RPL (mkostemps, int,
- (char * /*template*/, int /*suffixlen*/, int /*flags*/)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (mkostemps, int,
- (char * /*template*/, int /*suffixlen*/, int /*flags*/));
-# else
-# if !@HAVE_MKOSTEMPS@
-_GL_FUNCDECL_SYS (mkostemps, int,
- (char * /*template*/, int /*suffixlen*/, int /*flags*/)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (mkostemps, int,
- (char * /*template*/, int /*suffixlen*/, int /*flags*/));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (mkostemps);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef mkostemps
-# if HAVE_RAW_DECL_MKOSTEMPS
-_GL_WARN_ON_USE (mkostemps, "mkostemps is unportable - "
- "use gnulib module mkostemps for portability");
-# endif
-#endif
-
-#if @GNULIB_MKSTEMP@
-/* Create a unique temporary file from TEMPLATE.
- The last six characters of TEMPLATE must be "XXXXXX";
- they are replaced with a string that makes the file name unique.
- The file is then created, ensuring it didn't exist before.
- The file is created read-write (mask at least 0600 & ~umask), but it may be
- world-readable and world-writable (mask 0666 & ~umask), depending on the
- implementation.
- Returns the open file descriptor if successful, otherwise -1 and errno
- set. */
-# if @REPLACE_MKSTEMP@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define mkstemp rpl_mkstemp
-# endif
-_GL_FUNCDECL_RPL (mkstemp, int, (char * /*template*/) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (mkstemp, int, (char * /*template*/));
-# else
-# if ! @HAVE_MKSTEMP@
-_GL_FUNCDECL_SYS (mkstemp, int, (char * /*template*/) _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (mkstemp, int, (char * /*template*/));
-# endif
-_GL_CXXALIASWARN (mkstemp);
-#elif defined GNULIB_POSIXCHECK
-# undef mkstemp
-# if HAVE_RAW_DECL_MKSTEMP
-_GL_WARN_ON_USE (mkstemp, "mkstemp is unportable - "
- "use gnulib module mkstemp for portability");
-# endif
-#endif
-
-#if @GNULIB_MKSTEMPS@
-/* Create a unique temporary file from TEMPLATE.
- The last six characters of TEMPLATE prior to a suffix of length
- SUFFIXLEN must be "XXXXXX";
- they are replaced with a string that makes the file name unique.
- The file is then created, ensuring it didn't exist before.
- The file is created read-write (mask at least 0600 & ~umask), but it may be
- world-readable and world-writable (mask 0666 & ~umask), depending on the
- implementation.
- Returns the open file descriptor if successful, otherwise -1 and errno
- set. */
-# if !@HAVE_MKSTEMPS@
-_GL_FUNCDECL_SYS (mkstemps, int, (char * /*template*/, int /*suffixlen*/)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (mkstemps, int, (char * /*template*/, int /*suffixlen*/));
-_GL_CXXALIASWARN (mkstemps);
-#elif defined GNULIB_POSIXCHECK
-# undef mkstemps
-# if HAVE_RAW_DECL_MKSTEMPS
-_GL_WARN_ON_USE (mkstemps, "mkstemps is unportable - "
- "use gnulib module mkstemps for portability");
-# endif
-#endif
-
-#if @GNULIB_MDA_MKTEMP@
-/* On native Windows, map 'mktemp' to '_mktemp', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::mktemp always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef mktemp
-# define mktemp _mktemp
-# endif
-_GL_CXXALIAS_MDA (mktemp, char *, (char * /*template*/));
-# else
-_GL_CXXALIAS_SYS (mktemp, char *, (char * /*template*/));
-# endif
-_GL_CXXALIASWARN (mktemp);
-#endif
-
-/* Allocate memory with indefinite extent and specified alignment. */
-#if @GNULIB_POSIX_MEMALIGN@
-# if @REPLACE_POSIX_MEMALIGN@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef posix_memalign
-# define posix_memalign rpl_posix_memalign
-# endif
-_GL_FUNCDECL_RPL (posix_memalign, int,
- (void **memptr, size_t alignment, size_t size)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (posix_memalign, int,
- (void **memptr, size_t alignment, size_t size));
-# else
-# if @HAVE_POSIX_MEMALIGN@
-_GL_CXXALIAS_SYS (posix_memalign, int,
- (void **memptr, size_t alignment, size_t size));
-# endif
-# endif
-# if __GLIBC__ >= 2 && @HAVE_POSIX_MEMALIGN@
-_GL_CXXALIASWARN (posix_memalign);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef posix_memalign
-# if HAVE_RAW_DECL_POSIX_MEMALIGN
-_GL_WARN_ON_USE (posix_memalign, "posix_memalign is not portable - "
- "use gnulib module posix_memalign for portability");
-# endif
-#endif
-
-#if @GNULIB_POSIX_OPENPT@
-/* Return an FD open to the master side of a pseudo-terminal. Flags should
- include O_RDWR, and may also include O_NOCTTY. */
-# if @REPLACE_POSIX_OPENPT@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef posix_openpt
-# define posix_openpt rpl_posix_openpt
-# endif
-_GL_FUNCDECL_RPL (posix_openpt, int, (int flags));
-_GL_CXXALIAS_RPL (posix_openpt, int, (int flags));
-# else
-# if !@HAVE_POSIX_OPENPT@
-_GL_FUNCDECL_SYS (posix_openpt, int, (int flags));
-# endif
-_GL_CXXALIAS_SYS (posix_openpt, int, (int flags));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (posix_openpt);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef posix_openpt
-# if HAVE_RAW_DECL_POSIX_OPENPT
-_GL_WARN_ON_USE (posix_openpt, "posix_openpt is not portable - "
- "use gnulib module posix_openpt for portability");
-# endif
-#endif
-
-#if @GNULIB_PTSNAME@
-/* Return the pathname of the pseudo-terminal slave associated with
- the master FD is open on, or NULL on errors. */
-# if @REPLACE_PTSNAME@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef ptsname
-# define ptsname rpl_ptsname
-# endif
-_GL_FUNCDECL_RPL (ptsname, char *, (int fd));
-_GL_CXXALIAS_RPL (ptsname, char *, (int fd));
-# else
-# if !@HAVE_PTSNAME@
-_GL_FUNCDECL_SYS (ptsname, char *, (int fd));
-# endif
-_GL_CXXALIAS_SYS (ptsname, char *, (int fd));
-# endif
-_GL_CXXALIASWARN (ptsname);
-#elif defined GNULIB_POSIXCHECK
-# undef ptsname
-# if HAVE_RAW_DECL_PTSNAME
-_GL_WARN_ON_USE (ptsname, "ptsname is not portable - "
- "use gnulib module ptsname for portability");
-# endif
-#endif
-
-#if @GNULIB_PTSNAME_R@
-/* Set the pathname of the pseudo-terminal slave associated with
- the master FD is open on and return 0, or set errno and return
- non-zero on errors. */
-# if @REPLACE_PTSNAME_R@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef ptsname_r
-# define ptsname_r rpl_ptsname_r
-# endif
-_GL_FUNCDECL_RPL (ptsname_r, int, (int fd, char *buf, size_t len));
-_GL_CXXALIAS_RPL (ptsname_r, int, (int fd, char *buf, size_t len));
-# else
-# if !@HAVE_PTSNAME_R@
-_GL_FUNCDECL_SYS (ptsname_r, int, (int fd, char *buf, size_t len));
-# endif
-_GL_CXXALIAS_SYS (ptsname_r, int, (int fd, char *buf, size_t len));
-# endif
-# ifndef GNULIB_defined_ptsname_r
-# define GNULIB_defined_ptsname_r (!@HAVE_PTSNAME_R@ || @REPLACE_PTSNAME_R@)
-# endif
-_GL_CXXALIASWARN (ptsname_r);
-#elif defined GNULIB_POSIXCHECK
-# undef ptsname_r
-# if HAVE_RAW_DECL_PTSNAME_R
-_GL_WARN_ON_USE (ptsname_r, "ptsname_r is not portable - "
- "use gnulib module ptsname_r for portability");
-# endif
-#endif
-
-#if @GNULIB_PUTENV@
-# if @REPLACE_PUTENV@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef putenv
-# define putenv rpl_putenv
-# endif
-_GL_FUNCDECL_RPL (putenv, int, (char *string) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (putenv, int, (char *string));
-# elif defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef putenv
-# define putenv _putenv
-# endif
-_GL_CXXALIAS_MDA (putenv, int, (char *string));
-# else
-_GL_CXXALIAS_SYS (putenv, int, (char *string));
-# endif
-_GL_CXXALIASWARN (putenv);
-#elif @GNULIB_MDA_PUTENV@
-/* On native Windows, map 'putenv' to '_putenv', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::putenv always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef putenv
-# define putenv _putenv
-# endif
-/* Need to cast, because on mingw, the parameter is either
- 'const char *string' or 'char *string'. */
-_GL_CXXALIAS_MDA_CAST (putenv, int, (char *string));
-# else
-_GL_CXXALIAS_SYS (putenv, int, (char *string));
-# endif
-_GL_CXXALIASWARN (putenv);
-#endif
-
-#if @GNULIB_QSORT_R@
-/* Sort an array of NMEMB elements, starting at address BASE, each element
- occupying SIZE bytes, in ascending order according to the comparison
- function COMPARE. */
-# ifdef __cplusplus
-extern "C" {
-# endif
-# if !GNULIB_defined_qsort_r_fn_types
-typedef int (*_gl_qsort_r_compar_fn) (void const *, void const *, void *);
-# define GNULIB_defined_qsort_r_fn_types 1
-# endif
-# ifdef __cplusplus
-}
-# endif
-# if @REPLACE_QSORT_R@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef qsort_r
-# define qsort_r rpl_qsort_r
-# endif
-_GL_FUNCDECL_RPL (qsort_r, void, (void *base, size_t nmemb, size_t size,
- _gl_qsort_r_compar_fn compare,
- void *arg) _GL_ARG_NONNULL ((1, 4)));
-_GL_CXXALIAS_RPL (qsort_r, void, (void *base, size_t nmemb, size_t size,
- _gl_qsort_r_compar_fn compare,
- void *arg));
-# else
-# if !@HAVE_QSORT_R@
-_GL_FUNCDECL_SYS (qsort_r, void, (void *base, size_t nmemb, size_t size,
- _gl_qsort_r_compar_fn compare,
- void *arg) _GL_ARG_NONNULL ((1, 4)));
-# endif
-_GL_CXXALIAS_SYS (qsort_r, void, (void *base, size_t nmemb, size_t size,
- _gl_qsort_r_compar_fn compare,
- void *arg));
-# endif
-_GL_CXXALIASWARN (qsort_r);
-#elif defined GNULIB_POSIXCHECK
-# undef qsort_r
-# if HAVE_RAW_DECL_QSORT_R
-_GL_WARN_ON_USE (qsort_r, "qsort_r is not portable - "
- "use gnulib module qsort_r for portability");
-# endif
-#endif
-
-
-#if @GNULIB_RANDOM_R@
-# if !@HAVE_RANDOM_R@
-# ifndef RAND_MAX
-# define RAND_MAX 2147483647
-# endif
-# endif
-#endif
-
-
-#if @GNULIB_RANDOM@
-# if @REPLACE_RANDOM@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef random
-# define random rpl_random
-# endif
-_GL_FUNCDECL_RPL (random, long, (void));
-_GL_CXXALIAS_RPL (random, long, (void));
-# else
-# if !@HAVE_RANDOM@
-_GL_FUNCDECL_SYS (random, long, (void));
-# endif
-/* Need to cast, because on Haiku, the return type is
- int. */
-_GL_CXXALIAS_SYS_CAST (random, long, (void));
-# endif
-_GL_CXXALIASWARN (random);
-#elif defined GNULIB_POSIXCHECK
-# undef random
-# if HAVE_RAW_DECL_RANDOM
-_GL_WARN_ON_USE (random, "random is unportable - "
- "use gnulib module random for portability");
-# endif
-#endif
-
-#if @GNULIB_RANDOM@
-# if @REPLACE_RANDOM@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef srandom
-# define srandom rpl_srandom
-# endif
-_GL_FUNCDECL_RPL (srandom, void, (unsigned int seed));
-_GL_CXXALIAS_RPL (srandom, void, (unsigned int seed));
-# else
-# if !@HAVE_RANDOM@
-_GL_FUNCDECL_SYS (srandom, void, (unsigned int seed));
-# endif
-/* Need to cast, because on FreeBSD, the first parameter is
- unsigned long seed. */
-_GL_CXXALIAS_SYS_CAST (srandom, void, (unsigned int seed));
-# endif
-_GL_CXXALIASWARN (srandom);
-#elif defined GNULIB_POSIXCHECK
-# undef srandom
-# if HAVE_RAW_DECL_SRANDOM
-_GL_WARN_ON_USE (srandom, "srandom is unportable - "
- "use gnulib module random for portability");
-# endif
-#endif
-
-#if @GNULIB_RANDOM@
-# if @REPLACE_INITSTATE@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef initstate
-# define initstate rpl_initstate
-# endif
-_GL_FUNCDECL_RPL (initstate, char *,
- (unsigned int seed, char *buf, size_t buf_size)
- _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (initstate, char *,
- (unsigned int seed, char *buf, size_t buf_size));
-# else
-# if !@HAVE_INITSTATE@ || !@HAVE_DECL_INITSTATE@
-_GL_FUNCDECL_SYS (initstate, char *,
- (unsigned int seed, char *buf, size_t buf_size)
- _GL_ARG_NONNULL ((2)));
-# endif
-/* Need to cast, because on FreeBSD, the first parameter is
- unsigned long seed. */
-_GL_CXXALIAS_SYS_CAST (initstate, char *,
- (unsigned int seed, char *buf, size_t buf_size));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (initstate);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef initstate
-# if HAVE_RAW_DECL_INITSTATE
-_GL_WARN_ON_USE (initstate, "initstate is unportable - "
- "use gnulib module random for portability");
-# endif
-#endif
-
-#if @GNULIB_RANDOM@
-# if @REPLACE_SETSTATE@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef setstate
-# define setstate rpl_setstate
-# endif
-_GL_FUNCDECL_RPL (setstate, char *, (char *arg_state) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (setstate, char *, (char *arg_state));
-# else
-# if !@HAVE_SETSTATE@ || !@HAVE_DECL_SETSTATE@
-_GL_FUNCDECL_SYS (setstate, char *, (char *arg_state) _GL_ARG_NONNULL ((1)));
-# endif
-/* Need to cast, because on Mac OS X 10.13, HP-UX, Solaris the first parameter
- is const char *arg_state. */
-_GL_CXXALIAS_SYS_CAST (setstate, char *, (char *arg_state));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (setstate);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef setstate
-# if HAVE_RAW_DECL_SETSTATE
-_GL_WARN_ON_USE (setstate, "setstate is unportable - "
- "use gnulib module random for portability");
-# endif
-#endif
-
-
-#if @GNULIB_RANDOM_R@
-# if @REPLACE_RANDOM_R@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef random_r
-# define random_r rpl_random_r
-# endif
-_GL_FUNCDECL_RPL (random_r, int, (struct random_data *buf, int32_t *result)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (random_r, int, (struct random_data *buf, int32_t *result));
-# else
-# if !@HAVE_RANDOM_R@
-_GL_FUNCDECL_SYS (random_r, int, (struct random_data *buf, int32_t *result)
- _GL_ARG_NONNULL ((1, 2)));
-# endif
-_GL_CXXALIAS_SYS (random_r, int, (struct random_data *buf, int32_t *result));
-# endif
-_GL_CXXALIASWARN (random_r);
-#elif defined GNULIB_POSIXCHECK
-# undef random_r
-# if HAVE_RAW_DECL_RANDOM_R
-_GL_WARN_ON_USE (random_r, "random_r is unportable - "
- "use gnulib module random_r for portability");
-# endif
-#endif
-
-#if @GNULIB_RANDOM_R@
-# if @REPLACE_RANDOM_R@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef srandom_r
-# define srandom_r rpl_srandom_r
-# endif
-_GL_FUNCDECL_RPL (srandom_r, int,
- (unsigned int seed, struct random_data *rand_state)
- _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (srandom_r, int,
- (unsigned int seed, struct random_data *rand_state));
-# else
-# if !@HAVE_RANDOM_R@
-_GL_FUNCDECL_SYS (srandom_r, int,
- (unsigned int seed, struct random_data *rand_state)
- _GL_ARG_NONNULL ((2)));
-# endif
-_GL_CXXALIAS_SYS (srandom_r, int,
- (unsigned int seed, struct random_data *rand_state));
-# endif
-_GL_CXXALIASWARN (srandom_r);
-#elif defined GNULIB_POSIXCHECK
-# undef srandom_r
-# if HAVE_RAW_DECL_SRANDOM_R
-_GL_WARN_ON_USE (srandom_r, "srandom_r is unportable - "
- "use gnulib module random_r for portability");
-# endif
-#endif
-
-#if @GNULIB_RANDOM_R@
-# if @REPLACE_RANDOM_R@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef initstate_r
-# define initstate_r rpl_initstate_r
-# endif
-_GL_FUNCDECL_RPL (initstate_r, int,
- (unsigned int seed, char *buf, size_t buf_size,
- struct random_data *rand_state)
- _GL_ARG_NONNULL ((2, 4)));
-_GL_CXXALIAS_RPL (initstate_r, int,
- (unsigned int seed, char *buf, size_t buf_size,
- struct random_data *rand_state));
-# else
-# if !@HAVE_RANDOM_R@
-_GL_FUNCDECL_SYS (initstate_r, int,
- (unsigned int seed, char *buf, size_t buf_size,
- struct random_data *rand_state)
- _GL_ARG_NONNULL ((2, 4)));
-# endif
-/* Need to cast, because on Haiku, the third parameter is
- unsigned long buf_size. */
-_GL_CXXALIAS_SYS_CAST (initstate_r, int,
- (unsigned int seed, char *buf, size_t buf_size,
- struct random_data *rand_state));
-# endif
-_GL_CXXALIASWARN (initstate_r);
-#elif defined GNULIB_POSIXCHECK
-# undef initstate_r
-# if HAVE_RAW_DECL_INITSTATE_R
-_GL_WARN_ON_USE (initstate_r, "initstate_r is unportable - "
- "use gnulib module random_r for portability");
-# endif
-#endif
-
-#if @GNULIB_RANDOM_R@
-# if @REPLACE_RANDOM_R@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef setstate_r
-# define setstate_r rpl_setstate_r
-# endif
-_GL_FUNCDECL_RPL (setstate_r, int,
- (char *arg_state, struct random_data *rand_state)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (setstate_r, int,
- (char *arg_state, struct random_data *rand_state));
-# else
-# if !@HAVE_RANDOM_R@
-_GL_FUNCDECL_SYS (setstate_r, int,
- (char *arg_state, struct random_data *rand_state)
- _GL_ARG_NONNULL ((1, 2)));
-# endif
-/* Need to cast, because on Haiku, the first parameter is
- void *arg_state. */
-_GL_CXXALIAS_SYS_CAST (setstate_r, int,
- (char *arg_state, struct random_data *rand_state));
-# endif
-_GL_CXXALIASWARN (setstate_r);
-#elif defined GNULIB_POSIXCHECK
-# undef setstate_r
-# if HAVE_RAW_DECL_SETSTATE_R
-_GL_WARN_ON_USE (setstate_r, "setstate_r is unportable - "
- "use gnulib module random_r for portability");
-# endif
-#endif
-
-
-#if @GNULIB_REALLOC_POSIX@
-# if (@GNULIB_REALLOC_POSIX@ && @REPLACE_REALLOC_FOR_REALLOC_POSIX@) \
- || (@GNULIB_REALLOC_GNU@ && @REPLACE_REALLOC_FOR_REALLOC_GNU@)
-# if !((defined __cplusplus && defined GNULIB_NAMESPACE) \
- || _GL_USE_STDLIB_ALLOC)
-# undef realloc
-# define realloc rpl_realloc
-# endif
-_GL_FUNCDECL_RPL (realloc, void *, (void *ptr, size_t size)
- _GL_ATTRIBUTE_DEALLOC_FREE);
-_GL_CXXALIAS_RPL (realloc, void *, (void *ptr, size_t size));
-# else
-# if __GNUC__ >= 11
-/* For -Wmismatched-dealloc: Associate realloc with free or rpl_free. */
-_GL_FUNCDECL_SYS (realloc, void *, (void *ptr, size_t size)
- _GL_ATTRIBUTE_DEALLOC_FREE);
-# endif
-_GL_CXXALIAS_SYS (realloc, void *, (void *ptr, size_t size));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (realloc);
-# endif
-#else
-# if @GNULIB_FREE_POSIX@ && __GNUC__ >= 11 && !defined realloc
-/* For -Wmismatched-dealloc: Associate realloc with free or rpl_free. */
-_GL_FUNCDECL_SYS (realloc, void *, (void *ptr, size_t size)
- _GL_ATTRIBUTE_DEALLOC_FREE);
-# endif
-# if defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
-# undef realloc
-/* Assume realloc is always declared. */
-_GL_WARN_ON_USE (realloc, "realloc is not POSIX compliant everywhere - "
- "use gnulib module realloc-posix for portability");
-# endif
-#endif
-
-
-#if @GNULIB_REALLOCARRAY@
-# if @REPLACE_REALLOCARRAY@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef reallocarray
-# define reallocarray rpl_reallocarray
-# endif
-_GL_FUNCDECL_RPL (reallocarray, void *,
- (void *ptr, size_t nmemb, size_t size));
-_GL_CXXALIAS_RPL (reallocarray, void *,
- (void *ptr, size_t nmemb, size_t size));
-# else
-# if ! @HAVE_REALLOCARRAY@
-_GL_FUNCDECL_SYS (reallocarray, void *,
- (void *ptr, size_t nmemb, size_t size));
-# endif
-_GL_CXXALIAS_SYS (reallocarray, void *,
- (void *ptr, size_t nmemb, size_t size));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (reallocarray);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef reallocarray
-# if HAVE_RAW_DECL_REALLOCARRAY
-_GL_WARN_ON_USE (reallocarray, "reallocarray is not portable - "
- "use gnulib module reallocarray for portability");
-# endif
-#endif
-
-#if @GNULIB_REALPATH@
-# if @REPLACE_REALPATH@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define realpath rpl_realpath
-# endif
-_GL_FUNCDECL_RPL (realpath, char *,
- (const char *restrict name, char *restrict resolved)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (realpath, char *,
- (const char *restrict name, char *restrict resolved));
-# else
-# if !@HAVE_REALPATH@
-_GL_FUNCDECL_SYS (realpath, char *,
- (const char *restrict name, char *restrict resolved)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (realpath, char *,
- (const char *restrict name, char *restrict resolved));
-# endif
-_GL_CXXALIASWARN (realpath);
-#elif defined GNULIB_POSIXCHECK
-# undef realpath
-# if HAVE_RAW_DECL_REALPATH
-_GL_WARN_ON_USE (realpath, "realpath is unportable - use gnulib module "
- "canonicalize or canonicalize-lgpl for portability");
-# endif
-#endif
-
-#if @GNULIB_RPMATCH@
-/* Test a user response to a question.
- Return 1 if it is affirmative, 0 if it is negative, or -1 if not clear. */
-# if !@HAVE_RPMATCH@
-_GL_FUNCDECL_SYS (rpmatch, int, (const char *response) _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (rpmatch, int, (const char *response));
-_GL_CXXALIASWARN (rpmatch);
-#elif defined GNULIB_POSIXCHECK
-# undef rpmatch
-# if HAVE_RAW_DECL_RPMATCH
-_GL_WARN_ON_USE (rpmatch, "rpmatch is unportable - "
- "use gnulib module rpmatch for portability");
-# endif
-#endif
-
-#if @GNULIB_SECURE_GETENV@
-/* Look up NAME in the environment, returning 0 in insecure situations. */
-# if !@HAVE_SECURE_GETENV@
-_GL_FUNCDECL_SYS (secure_getenv, char *,
- (char const *name) _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (secure_getenv, char *, (char const *name));
-_GL_CXXALIASWARN (secure_getenv);
-#elif defined GNULIB_POSIXCHECK
-# undef secure_getenv
-# if HAVE_RAW_DECL_SECURE_GETENV
-_GL_WARN_ON_USE (secure_getenv, "secure_getenv is unportable - "
- "use gnulib module secure_getenv for portability");
-# endif
-#endif
-
-#if @GNULIB_SETENV@
-/* Set NAME to VALUE in the environment.
- If REPLACE is nonzero, overwrite an existing value. */
-# if @REPLACE_SETENV@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef setenv
-# define setenv rpl_setenv
-# endif
-_GL_FUNCDECL_RPL (setenv, int,
- (const char *name, const char *value, int replace)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (setenv, int,
- (const char *name, const char *value, int replace));
-# else
-# if !@HAVE_DECL_SETENV@
-_GL_FUNCDECL_SYS (setenv, int,
- (const char *name, const char *value, int replace)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (setenv, int,
- (const char *name, const char *value, int replace));
-# endif
-# if !(@REPLACE_SETENV@ && !@HAVE_DECL_SETENV@)
-_GL_CXXALIASWARN (setenv);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef setenv
-# if HAVE_RAW_DECL_SETENV
-_GL_WARN_ON_USE (setenv, "setenv is unportable - "
- "use gnulib module setenv for portability");
-# endif
-#endif
-
-#if @GNULIB_STRTOD@
- /* Parse a double from STRING, updating ENDP if appropriate. */
-# if @REPLACE_STRTOD@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define strtod rpl_strtod
-# endif
-# define GNULIB_defined_strtod_function 1
-_GL_FUNCDECL_RPL (strtod, double,
- (const char *restrict str, char **restrict endp)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (strtod, double,
- (const char *restrict str, char **restrict endp));
-# else
-# if !@HAVE_STRTOD@
-_GL_FUNCDECL_SYS (strtod, double,
- (const char *restrict str, char **restrict endp)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (strtod, double,
- (const char *restrict str, char **restrict endp));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (strtod);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef strtod
-# if HAVE_RAW_DECL_STRTOD
-_GL_WARN_ON_USE (strtod, "strtod is unportable - "
- "use gnulib module strtod for portability");
-# endif
-#endif
-
-#if @GNULIB_STRTOLD@
- /* Parse a 'long double' from STRING, updating ENDP if appropriate. */
-# if @REPLACE_STRTOLD@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define strtold rpl_strtold
-# endif
-# define GNULIB_defined_strtold_function 1
-_GL_FUNCDECL_RPL (strtold, long double,
- (const char *restrict str, char **restrict endp)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (strtold, long double,
- (const char *restrict str, char **restrict endp));
-# else
-# if !@HAVE_STRTOLD@
-_GL_FUNCDECL_SYS (strtold, long double,
- (const char *restrict str, char **restrict endp)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (strtold, long double,
- (const char *restrict str, char **restrict endp));
-# endif
-_GL_CXXALIASWARN (strtold);
-#elif defined GNULIB_POSIXCHECK
-# undef strtold
-# if HAVE_RAW_DECL_STRTOLD
-_GL_WARN_ON_USE (strtold, "strtold is unportable - "
- "use gnulib module strtold for portability");
-# endif
-#endif
-
-#if @GNULIB_STRTOL@
-/* Parse a signed integer whose textual representation starts at STRING.
- The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
- it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
- "0x").
- If ENDPTR is not NULL, the address of the first byte after the integer is
- stored in *ENDPTR.
- Upon overflow, the return value is LONG_MAX or LONG_MIN, and errno is set
- to ERANGE. */
-# if @REPLACE_STRTOL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define strtol rpl_strtol
-# endif
-# define GNULIB_defined_strtol_function 1
-_GL_FUNCDECL_RPL (strtol, long,
- (const char *restrict string, char **restrict endptr,
- int base)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (strtol, long,
- (const char *restrict string, char **restrict endptr,
- int base));
-# else
-# if !@HAVE_STRTOL@
-_GL_FUNCDECL_SYS (strtol, long,
- (const char *restrict string, char **restrict endptr,
- int base)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (strtol, long,
- (const char *restrict string, char **restrict endptr,
- int base));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (strtol);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef strtol
-# if HAVE_RAW_DECL_STRTOL
-_GL_WARN_ON_USE (strtol, "strtol is unportable - "
- "use gnulib module strtol for portability");
-# endif
-#endif
-
-#if @GNULIB_STRTOLL@
-/* Parse a signed integer whose textual representation starts at STRING.
- The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
- it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
- "0x").
- If ENDPTR is not NULL, the address of the first byte after the integer is
- stored in *ENDPTR.
- Upon overflow, the return value is LLONG_MAX or LLONG_MIN, and errno is set
- to ERANGE. */
-# if @REPLACE_STRTOLL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define strtoll rpl_strtoll
-# endif
-# define GNULIB_defined_strtoll_function 1
-_GL_FUNCDECL_RPL (strtoll, long long,
- (const char *restrict string, char **restrict endptr,
- int base)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (strtoll, long long,
- (const char *restrict string, char **restrict endptr,
- int base));
-# else
-# if !@HAVE_STRTOLL@
-_GL_FUNCDECL_SYS (strtoll, long long,
- (const char *restrict string, char **restrict endptr,
- int base)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (strtoll, long long,
- (const char *restrict string, char **restrict endptr,
- int base));
-# endif
-_GL_CXXALIASWARN (strtoll);
-#elif defined GNULIB_POSIXCHECK
-# undef strtoll
-# if HAVE_RAW_DECL_STRTOLL
-_GL_WARN_ON_USE (strtoll, "strtoll is unportable - "
- "use gnulib module strtoll for portability");
-# endif
-#endif
-
-#if @GNULIB_STRTOUL@
-/* Parse an unsigned integer whose textual representation starts at STRING.
- The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
- it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
- "0x").
- If ENDPTR is not NULL, the address of the first byte after the integer is
- stored in *ENDPTR.
- Upon overflow, the return value is ULONG_MAX, and errno is set to ERANGE. */
-# if @REPLACE_STRTOUL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define strtoul rpl_strtoul
-# endif
-# define GNULIB_defined_strtoul_function 1
-_GL_FUNCDECL_RPL (strtoul, unsigned long,
- (const char *restrict string, char **restrict endptr,
- int base)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (strtoul, unsigned long,
- (const char *restrict string, char **restrict endptr,
- int base));
-# else
-# if !@HAVE_STRTOUL@
-_GL_FUNCDECL_SYS (strtoul, unsigned long,
- (const char *restrict string, char **restrict endptr,
- int base)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (strtoul, unsigned long,
- (const char *restrict string, char **restrict endptr,
- int base));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (strtoul);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef strtoul
-# if HAVE_RAW_DECL_STRTOUL
-_GL_WARN_ON_USE (strtoul, "strtoul is unportable - "
- "use gnulib module strtoul for portability");
-# endif
-#endif
-
-#if @GNULIB_STRTOULL@
-/* Parse an unsigned integer whose textual representation starts at STRING.
- The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
- it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
- "0x").
- If ENDPTR is not NULL, the address of the first byte after the integer is
- stored in *ENDPTR.
- Upon overflow, the return value is ULLONG_MAX, and errno is set to
- ERANGE. */
-# if @REPLACE_STRTOULL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define strtoull rpl_strtoull
-# endif
-# define GNULIB_defined_strtoull_function 1
-_GL_FUNCDECL_RPL (strtoull, unsigned long long,
- (const char *restrict string, char **restrict endptr,
- int base)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (strtoull, unsigned long long,
- (const char *restrict string, char **restrict endptr,
- int base));
-# else
-# if !@HAVE_STRTOULL@
-_GL_FUNCDECL_SYS (strtoull, unsigned long long,
- (const char *restrict string, char **restrict endptr,
- int base)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (strtoull, unsigned long long,
- (const char *restrict string, char **restrict endptr,
- int base));
-# endif
-_GL_CXXALIASWARN (strtoull);
-#elif defined GNULIB_POSIXCHECK
-# undef strtoull
-# if HAVE_RAW_DECL_STRTOULL
-_GL_WARN_ON_USE (strtoull, "strtoull is unportable - "
- "use gnulib module strtoull for portability");
-# endif
-#endif
-
-#if @GNULIB_UNLOCKPT@
-/* Unlock the slave side of the pseudo-terminal whose master side is specified
- by FD, so that it can be opened. */
-# if !@HAVE_UNLOCKPT@
-_GL_FUNCDECL_SYS (unlockpt, int, (int fd));
-# endif
-_GL_CXXALIAS_SYS (unlockpt, int, (int fd));
-_GL_CXXALIASWARN (unlockpt);
-#elif defined GNULIB_POSIXCHECK
-# undef unlockpt
-# if HAVE_RAW_DECL_UNLOCKPT
-_GL_WARN_ON_USE (unlockpt, "unlockpt is not portable - "
- "use gnulib module unlockpt for portability");
-# endif
-#endif
-
-#if @GNULIB_UNSETENV@
-/* Remove the variable NAME from the environment. */
-# if @REPLACE_UNSETENV@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef unsetenv
-# define unsetenv rpl_unsetenv
-# endif
-_GL_FUNCDECL_RPL (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (unsetenv, int, (const char *name));
-# else
-# if !@HAVE_DECL_UNSETENV@
-_GL_FUNCDECL_SYS (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (unsetenv, int, (const char *name));
-# endif
-# if !(@REPLACE_UNSETENV@ && !@HAVE_DECL_UNSETENV@)
-_GL_CXXALIASWARN (unsetenv);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef unsetenv
-# if HAVE_RAW_DECL_UNSETENV
-_GL_WARN_ON_USE (unsetenv, "unsetenv is unportable - "
- "use gnulib module unsetenv for portability");
-# endif
-#endif
-
-/* Convert a wide character to a multibyte character. */
-#if @GNULIB_WCTOMB@
-# if @REPLACE_WCTOMB@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef wctomb
-# define wctomb rpl_wctomb
-# endif
-_GL_FUNCDECL_RPL (wctomb, int, (char *s, wchar_t wc));
-_GL_CXXALIAS_RPL (wctomb, int, (char *s, wchar_t wc));
-# else
-_GL_CXXALIAS_SYS (wctomb, int, (char *s, wchar_t wc));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (wctomb);
-# endif
-#endif
-
-
-#endif /* _@GUARD_PREFIX@_STDLIB_H */
-#endif /* _@GUARD_PREFIX@_STDLIB_H */
-#endif
diff --git a/cross/lib/stpcpy.c b/cross/lib/stpcpy.c
deleted file mode 100644
index 73c1eb786ff..00000000000
--- a/cross/lib/stpcpy.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/* stpcpy.c -- copy a string and return pointer to end of new string
- Copyright (C) 1992, 1995, 1997-1998, 2006, 2009-2023 Free Software
- Foundation, Inc.
-
- NOTE: The canonical source of this file is maintained with the GNU C Library.
- Bugs can be reported to bug-glibc@prep.ai.mit.edu.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-#include <string.h>
-
-#undef __stpcpy
-#ifdef _LIBC
-# undef stpcpy
-#endif
-
-#ifndef weak_alias
-# define __stpcpy stpcpy
-#endif
-
-/* Copy SRC to DEST, returning the address of the terminating '\0' in DEST. */
-char *
-__stpcpy (char *dest, const char *src)
-{
- register char *d = dest;
- register const char *s = src;
-
- do
- *d++ = *s;
- while (*s++ != '\0');
-
- return d - 1;
-}
-#ifdef weak_alias
-weak_alias (__stpcpy, stpcpy)
-#endif
diff --git a/cross/lib/stpncpy.c b/cross/lib/stpncpy.c
deleted file mode 100644
index d1422a927df..00000000000
--- a/cross/lib/stpncpy.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/* Copyright (C) 1993, 1995-1997, 2002-2003, 2005-2007, 2009-2023 Free Software
- * Foundation, Inc.
-
- NOTE: The canonical source of this file is maintained with the GNU C Library.
- Bugs can be reported to bug-glibc@gnu.org.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* This is almost copied from strncpy.c, written by Torbjorn Granlund. */
-
-#include <config.h>
-
-/* Specification. */
-#include <string.h>
-
-#ifndef weak_alias
-# define __stpncpy stpncpy
-#endif
-
-/* Copy no more than N bytes of SRC to DST, returning a pointer past the
- last non-NUL byte written into DST. */
-char *
-(__stpncpy) (char *dest, const char *src, size_t n)
-{
- char c;
- char *s = dest;
-
- if (n >= 4)
- {
- size_t n4 = n >> 2;
-
- for (;;)
- {
- c = *src++;
- *dest++ = c;
- if (c == '\0')
- break;
- c = *src++;
- *dest++ = c;
- if (c == '\0')
- break;
- c = *src++;
- *dest++ = c;
- if (c == '\0')
- break;
- c = *src++;
- *dest++ = c;
- if (c == '\0')
- break;
- if (--n4 == 0)
- goto last_chars;
- }
- n -= dest - s;
- goto zero_fill;
- }
-
- last_chars:
- n &= 3;
- if (n == 0)
- return dest;
-
- for (;;)
- {
- c = *src++;
- --n;
- *dest++ = c;
- if (c == '\0')
- break;
- if (n == 0)
- return dest;
- }
-
- zero_fill:
- while (n-- > 0)
- dest[n] = '\0';
-
- return dest - 1;
-}
-#ifdef weak_alias
-weak_alias (__stpncpy, stpncpy)
-#endif
diff --git a/cross/lib/str-two-way.h b/cross/lib/str-two-way.h
deleted file mode 100644
index dfe702241c0..00000000000
--- a/cross/lib/str-two-way.h
+++ /dev/null
@@ -1,452 +0,0 @@
-/* Byte-wise substring search, using the Two-Way algorithm.
- Copyright (C) 2008-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Written by Eric Blake <ebb9@byu.net>, 2008.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General 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/>. */
-
-/* Before including this file, you need to include <config.h> and
- <string.h>, and define:
- RETURN_TYPE A macro that expands to the return type.
- AVAILABLE(h, h_l, j, n_l)
- A macro that returns nonzero if there are
- at least N_L bytes left starting at H[J].
- H is 'unsigned char *', H_L, J, and N_L
- are 'size_t'; H_L is an lvalue. For
- NUL-terminated searches, H_L can be
- modified each iteration to avoid having
- to compute the end of H up front.
-
- For case-insensitivity, you may optionally define:
- CMP_FUNC(p1, p2, l) A macro that returns 0 iff the first L
- characters of P1 and P2 are equal.
- CANON_ELEMENT(c) A macro that canonicalizes an element right after
- it has been fetched from one of the two strings.
- The argument is an 'unsigned char'; the result
- must be an 'unsigned char' as well.
-
- This file undefines the macros documented above, and defines
- LONG_NEEDLE_THRESHOLD.
-*/
-
-#include <limits.h>
-#include <stdint.h>
-
-/* We use the Two-Way string matching algorithm (also known as
- Chrochemore-Perrin), which guarantees linear complexity with
- constant space. Additionally, for long needles, we also use a bad
- character shift table similar to the Boyer-Moore algorithm to
- achieve improved (potentially sub-linear) performance.
-
- See https://www-igm.univ-mlv.fr/~lecroq/string/node26.html#SECTION00260,
- https://en.wikipedia.org/wiki/Boyer-Moore_string_search_algorithm,
- https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.34.6641&rep=rep1&type=pdf
-*/
-
-/* Point at which computing a bad-byte shift table is likely to be
- worthwhile. Small needles should not compute a table, since it
- adds (1 << CHAR_BIT) + NEEDLE_LEN computations of preparation for a
- speedup no greater than a factor of NEEDLE_LEN. The larger the
- needle, the better the potential performance gain. On the other
- hand, on non-POSIX systems with CHAR_BIT larger than eight, the
- memory required for the table is prohibitive. */
-#if CHAR_BIT < 10
-# define LONG_NEEDLE_THRESHOLD 32U
-#else
-# define LONG_NEEDLE_THRESHOLD SIZE_MAX
-#endif
-
-#ifndef MAX
-# define MAX(a, b) ((a < b) ? (b) : (a))
-#endif
-
-#ifndef CANON_ELEMENT
-# define CANON_ELEMENT(c) c
-#endif
-#ifndef CMP_FUNC
-# define CMP_FUNC memcmp
-#endif
-
-/* Perform a critical factorization of NEEDLE, of length NEEDLE_LEN.
- Return the index of the first byte in the right half, and set
- *PERIOD to the global period of the right half.
-
- The global period of a string is the smallest index (possibly its
- length) at which all remaining bytes in the string are repetitions
- of the prefix (the last repetition may be a subset of the prefix).
-
- When NEEDLE is factored into two halves, a local period is the
- length of the smallest word that shares a suffix with the left half
- and shares a prefix with the right half. All factorizations of a
- non-empty NEEDLE have a local period of at least 1 and no greater
- than NEEDLE_LEN.
-
- A critical factorization has the property that the local period
- equals the global period. All strings have at least one critical
- factorization with the left half smaller than the global period.
- And while some strings have more than one critical factorization,
- it is provable that with an ordered alphabet, at least one of the
- critical factorizations corresponds to a maximal suffix.
-
- Given an ordered alphabet, a critical factorization can be computed
- in linear time, with 2 * NEEDLE_LEN comparisons, by computing the
- shorter of two ordered maximal suffixes. The ordered maximal
- suffixes are determined by lexicographic comparison while tracking
- periodicity. */
-static size_t
-critical_factorization (const unsigned char *needle, size_t needle_len,
- size_t *period)
-{
- /* Index of last byte of left half, or SIZE_MAX. */
- size_t max_suffix, max_suffix_rev;
- size_t j; /* Index into NEEDLE for current candidate suffix. */
- size_t k; /* Offset into current period. */
- size_t p; /* Intermediate period. */
- unsigned char a, b; /* Current comparison bytes. */
-
- /* Special case NEEDLE_LEN of 1 or 2 (all callers already filtered
- out 0-length needles. */
- if (needle_len < 3)
- {
- *period = 1;
- return needle_len - 1;
- }
-
- /* Invariants:
- 0 <= j < NEEDLE_LEN - 1
- -1 <= max_suffix{,_rev} < j (treating SIZE_MAX as if it were signed)
- min(max_suffix, max_suffix_rev) < global period of NEEDLE
- 1 <= p <= global period of NEEDLE
- p == global period of the substring NEEDLE[max_suffix{,_rev}+1...j]
- 1 <= k <= p
- */
-
- /* Perform lexicographic search. */
- max_suffix = SIZE_MAX;
- j = 0;
- k = p = 1;
- while (j + k < needle_len)
- {
- a = CANON_ELEMENT (needle[j + k]);
- b = CANON_ELEMENT (needle[max_suffix + k]);
- if (a < b)
- {
- /* Suffix is smaller, period is entire prefix so far. */
- j += k;
- k = 1;
- p = j - max_suffix;
- }
- else if (a == b)
- {
- /* Advance through repetition of the current period. */
- if (k != p)
- ++k;
- else
- {
- j += p;
- k = 1;
- }
- }
- else /* b < a */
- {
- /* Suffix is larger, start over from current location. */
- max_suffix = j++;
- k = p = 1;
- }
- }
- *period = p;
-
- /* Perform reverse lexicographic search. */
- max_suffix_rev = SIZE_MAX;
- j = 0;
- k = p = 1;
- while (j + k < needle_len)
- {
- a = CANON_ELEMENT (needle[j + k]);
- b = CANON_ELEMENT (needle[max_suffix_rev + k]);
- if (b < a)
- {
- /* Suffix is smaller, period is entire prefix so far. */
- j += k;
- k = 1;
- p = j - max_suffix_rev;
- }
- else if (a == b)
- {
- /* Advance through repetition of the current period. */
- if (k != p)
- ++k;
- else
- {
- j += p;
- k = 1;
- }
- }
- else /* a < b */
- {
- /* Suffix is larger, start over from current location. */
- max_suffix_rev = j++;
- k = p = 1;
- }
- }
-
- /* Choose the shorter suffix. Return the index of the first byte of
- the right half, rather than the last byte of the left half.
-
- For some examples, 'banana' has two critical factorizations, both
- exposed by the two lexicographic extreme suffixes of 'anana' and
- 'nana', where both suffixes have a period of 2. On the other
- hand, with 'aab' and 'bba', both strings have a single critical
- factorization of the last byte, with the suffix having a period
- of 1. While the maximal lexicographic suffix of 'aab' is 'b',
- the maximal lexicographic suffix of 'bba' is 'ba', which is not a
- critical factorization. Conversely, the maximal reverse
- lexicographic suffix of 'a' works for 'bba', but not 'ab' for
- 'aab'. The shorter suffix of the two will always be a critical
- factorization. */
- if (max_suffix_rev + 1 < max_suffix + 1)
- return max_suffix + 1;
- *period = p;
- return max_suffix_rev + 1;
-}
-
-/* Return the first location of non-empty NEEDLE within HAYSTACK, or
- NULL. HAYSTACK_LEN is the minimum known length of HAYSTACK. This
- method is optimized for NEEDLE_LEN < LONG_NEEDLE_THRESHOLD.
- Performance is guaranteed to be linear, with an initialization cost
- of 2 * NEEDLE_LEN comparisons.
-
- If AVAILABLE does not modify HAYSTACK_LEN (as in memmem), then at
- most 2 * HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching.
- If AVAILABLE modifies HAYSTACK_LEN (as in strstr), then at most 3 *
- HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching. */
-static RETURN_TYPE _GL_ATTRIBUTE_PURE
-two_way_short_needle (const unsigned char *haystack, size_t haystack_len,
- const unsigned char *needle, size_t needle_len)
-{
- size_t i; /* Index into current byte of NEEDLE. */
- size_t j; /* Index into current window of HAYSTACK. */
- size_t period; /* The period of the right half of needle. */
- size_t suffix; /* The index of the right half of needle. */
-
- /* Factor the needle into two halves, such that the left half is
- smaller than the global period, and the right half is
- periodic (with a period as large as NEEDLE_LEN - suffix). */
- suffix = critical_factorization (needle, needle_len, &period);
-
- /* Perform the search. Each iteration compares the right half
- first. */
- if (CMP_FUNC (needle, needle + period, suffix) == 0)
- {
- /* Entire needle is periodic; a mismatch in the left half can
- only advance by the period, so use memory to avoid rescanning
- known occurrences of the period in the right half. */
- size_t memory = 0;
- j = 0;
- while (AVAILABLE (haystack, haystack_len, j, needle_len))
- {
- /* Scan for matches in right half. */
- i = MAX (suffix, memory);
- while (i < needle_len && (CANON_ELEMENT (needle[i])
- == CANON_ELEMENT (haystack[i + j])))
- ++i;
- if (needle_len <= i)
- {
- /* Scan for matches in left half. */
- i = suffix - 1;
- while (memory < i + 1 && (CANON_ELEMENT (needle[i])
- == CANON_ELEMENT (haystack[i + j])))
- --i;
- if (i + 1 < memory + 1)
- return (RETURN_TYPE) (haystack + j);
- /* No match, so remember how many repetitions of period
- on the right half were scanned. */
- j += period;
- memory = needle_len - period;
- }
- else
- {
- j += i - suffix + 1;
- memory = 0;
- }
- }
- }
- else
- {
- /* The two halves of needle are distinct; no extra memory is
- required, and any mismatch results in a maximal shift. */
- period = MAX (suffix, needle_len - suffix) + 1;
- j = 0;
- while (AVAILABLE (haystack, haystack_len, j, needle_len))
- {
- /* Scan for matches in right half. */
- i = suffix;
- while (i < needle_len && (CANON_ELEMENT (needle[i])
- == CANON_ELEMENT (haystack[i + j])))
- ++i;
- if (needle_len <= i)
- {
- /* Scan for matches in left half. */
- i = suffix - 1;
- while (i != SIZE_MAX && (CANON_ELEMENT (needle[i])
- == CANON_ELEMENT (haystack[i + j])))
- --i;
- if (i == SIZE_MAX)
- return (RETURN_TYPE) (haystack + j);
- j += period;
- }
- else
- j += i - suffix + 1;
- }
- }
- return NULL;
-}
-
-/* Return the first location of non-empty NEEDLE within HAYSTACK, or
- NULL. HAYSTACK_LEN is the minimum known length of HAYSTACK. This
- method is optimized for LONG_NEEDLE_THRESHOLD <= NEEDLE_LEN.
- Performance is guaranteed to be linear, with an initialization cost
- of 3 * NEEDLE_LEN + (1 << CHAR_BIT) operations.
-
- If AVAILABLE does not modify HAYSTACK_LEN (as in memmem), then at
- most 2 * HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching,
- and sublinear performance O(HAYSTACK_LEN / NEEDLE_LEN) is possible.
- If AVAILABLE modifies HAYSTACK_LEN (as in strstr), then at most 3 *
- HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching, and
- sublinear performance is not possible. */
-static RETURN_TYPE _GL_ATTRIBUTE_PURE
-two_way_long_needle (const unsigned char *haystack, size_t haystack_len,
- const unsigned char *needle, size_t needle_len)
-{
- size_t i; /* Index into current byte of NEEDLE. */
- size_t j; /* Index into current window of HAYSTACK. */
- size_t period; /* The period of the right half of needle. */
- size_t suffix; /* The index of the right half of needle. */
- size_t shift_table[1U << CHAR_BIT]; /* See below. */
-
- /* Factor the needle into two halves, such that the left half is
- smaller than the global period, and the right half is
- periodic (with a period as large as NEEDLE_LEN - suffix). */
- suffix = critical_factorization (needle, needle_len, &period);
-
- /* Populate shift_table. For each possible byte value c,
- shift_table[c] is the distance from the last occurrence of c to
- the end of NEEDLE, or NEEDLE_LEN if c is absent from the NEEDLE.
- shift_table[NEEDLE[NEEDLE_LEN - 1]] contains the only 0. */
- for (i = 0; i < 1U << CHAR_BIT; i++)
- shift_table[i] = needle_len;
- for (i = 0; i < needle_len; i++)
- shift_table[CANON_ELEMENT (needle[i])] = needle_len - i - 1;
-
- /* Perform the search. Each iteration compares the right half
- first. */
- if (CMP_FUNC (needle, needle + period, suffix) == 0)
- {
- /* Entire needle is periodic; a mismatch in the left half can
- only advance by the period, so use memory to avoid rescanning
- known occurrences of the period in the right half. */
- size_t memory = 0;
- size_t shift;
- j = 0;
- while (AVAILABLE (haystack, haystack_len, j, needle_len))
- {
- /* Check the last byte first; if it does not match, then
- shift to the next possible match location. */
- shift = shift_table[CANON_ELEMENT (haystack[j + needle_len - 1])];
- if (0 < shift)
- {
- if (memory && shift < period)
- {
- /* Since needle is periodic, but the last period has
- a byte out of place, there can be no match until
- after the mismatch. */
- shift = needle_len - period;
- }
- memory = 0;
- j += shift;
- continue;
- }
- /* Scan for matches in right half. The last byte has
- already been matched, by virtue of the shift table. */
- i = MAX (suffix, memory);
- while (i < needle_len - 1 && (CANON_ELEMENT (needle[i])
- == CANON_ELEMENT (haystack[i + j])))
- ++i;
- if (needle_len - 1 <= i)
- {
- /* Scan for matches in left half. */
- i = suffix - 1;
- while (memory < i + 1 && (CANON_ELEMENT (needle[i])
- == CANON_ELEMENT (haystack[i + j])))
- --i;
- if (i + 1 < memory + 1)
- return (RETURN_TYPE) (haystack + j);
- /* No match, so remember how many repetitions of period
- on the right half were scanned. */
- j += period;
- memory = needle_len - period;
- }
- else
- {
- j += i - suffix + 1;
- memory = 0;
- }
- }
- }
- else
- {
- /* The two halves of needle are distinct; no extra memory is
- required, and any mismatch results in a maximal shift. */
- size_t shift;
- period = MAX (suffix, needle_len - suffix) + 1;
- j = 0;
- while (AVAILABLE (haystack, haystack_len, j, needle_len))
- {
- /* Check the last byte first; if it does not match, then
- shift to the next possible match location. */
- shift = shift_table[CANON_ELEMENT (haystack[j + needle_len - 1])];
- if (0 < shift)
- {
- j += shift;
- continue;
- }
- /* Scan for matches in right half. The last byte has
- already been matched, by virtue of the shift table. */
- i = suffix;
- while (i < needle_len - 1 && (CANON_ELEMENT (needle[i])
- == CANON_ELEMENT (haystack[i + j])))
- ++i;
- if (needle_len - 1 <= i)
- {
- /* Scan for matches in left half. */
- i = suffix - 1;
- while (i != SIZE_MAX && (CANON_ELEMENT (needle[i])
- == CANON_ELEMENT (haystack[i + j])))
- --i;
- if (i == SIZE_MAX)
- return (RETURN_TYPE) (haystack + j);
- j += period;
- }
- else
- j += i - suffix + 1;
- }
- }
- return NULL;
-}
-
-#undef AVAILABLE
-#undef CANON_ELEMENT
-#undef CMP_FUNC
-#undef MAX
-#undef RETURN_TYPE
diff --git a/cross/lib/strftime.h b/cross/lib/strftime.h
deleted file mode 100644
index 88c1f73928f..00000000000
--- a/cross/lib/strftime.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* declarations for strftime.c
-
- Copyright (C) 2002, 2004, 2008-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <time.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Just like strftime, but with two more arguments:
- POSIX requires that strftime use the local timezone information.
- Use the timezone __TZ instead. Use __NS as the number of
- nanoseconds in the %N directive.
-
- On error, set errno and return 0. Otherwise, return the number of
- bytes generated (not counting the trailing NUL), preserving errno
- if the number is 0. This errno behavior is in draft POSIX 202x
- plus some requested changes to POSIX. */
-size_t nstrftime (char *restrict, size_t, char const *, struct tm const *,
- timezone_t __tz, int __ns);
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/cross/lib/string.in.h b/cross/lib/string.in.h
deleted file mode 100644
index b6bf432e1f1..00000000000
--- a/cross/lib/string.in.h
+++ /dev/null
@@ -1,1359 +0,0 @@
-/* A GNU-like <string.h>.
-
- Copyright (C) 1995-1996, 2001-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#if __GNUC__ >= 3
-@PRAGMA_SYSTEM_HEADER@
-#endif
-@PRAGMA_COLUMNS@
-
-#if defined _GL_ALREADY_INCLUDING_STRING_H
-/* Special invocation convention:
- - On OS X/NetBSD we have a sequence of nested includes
- <string.h> -> <strings.h> -> "string.h"
- In this situation system _chk variants due to -D_FORTIFY_SOURCE
- might be used after any replacements defined here. */
-
-#@INCLUDE_NEXT@ @NEXT_STRING_H@
-
-#else
-/* Normal invocation convention. */
-
-#ifndef _@GUARD_PREFIX@_STRING_H
-
-#define _GL_ALREADY_INCLUDING_STRING_H
-
-/* The include_next requires a split double-inclusion guard. */
-#@INCLUDE_NEXT@ @NEXT_STRING_H@
-
-#undef _GL_ALREADY_INCLUDING_STRING_H
-
-#ifndef _@GUARD_PREFIX@_STRING_H
-#define _@GUARD_PREFIX@_STRING_H
-
-/* NetBSD 5.0 mis-defines NULL. */
-#include <stddef.h>
-
-/* MirBSD defines mbslen as a macro. */
-#if @GNULIB_MBSLEN@ && defined __MirBSD__
-# include <wchar.h>
-#endif
-
-/* NetBSD 5.0 declares strsignal in <unistd.h>, not in <string.h>. */
-/* But in any case avoid namespace pollution on glibc systems. */
-#if (@GNULIB_STRSIGNAL@ || defined GNULIB_POSIXCHECK) && defined __NetBSD__ \
- && ! defined __GLIBC__
-# include <unistd.h>
-#endif
-
-/* AIX 7.2 and Android 13 declare ffsl and ffsll in <strings.h>, not in
- <string.h>. */
-/* But in any case avoid namespace pollution on glibc systems. */
-#if ((@GNULIB_FFSL@ || @GNULIB_FFSLL@ || defined GNULIB_POSIXCHECK) \
- && (defined _AIX || defined __ANDROID__)) \
- && ! defined __GLIBC__
-# include <strings.h>
-#endif
-
-/* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
- that can be freed by passing them as the Ith argument to the
- function F. */
-#ifndef _GL_ATTRIBUTE_DEALLOC
-# if __GNUC__ >= 11
-# define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
-# else
-# define _GL_ATTRIBUTE_DEALLOC(f, i)
-# endif
-#endif
-
-/* _GL_ATTRIBUTE_DEALLOC_FREE declares that the function returns pointers that
- can be freed via 'free'; it can be used only after declaring 'free'. */
-/* Applies to: functions. Cannot be used on inline functions. */
-#ifndef _GL_ATTRIBUTE_DEALLOC_FREE
-# if defined __cplusplus && defined __GNUC__ && !defined __clang__
-/* Work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108231> */
-# define _GL_ATTRIBUTE_DEALLOC_FREE \
- _GL_ATTRIBUTE_DEALLOC ((void (*) (void *)) free, 1)
-# else
-# define _GL_ATTRIBUTE_DEALLOC_FREE \
- _GL_ATTRIBUTE_DEALLOC (free, 1)
-# endif
-#endif
-
-/* _GL_ATTRIBUTE_MALLOC declares that the function returns a pointer to freshly
- allocated memory. */
-/* Applies to: functions. */
-#ifndef _GL_ATTRIBUTE_MALLOC
-# if __GNUC__ >= 3 || defined __clang__
-# define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
-# else
-# define _GL_ATTRIBUTE_MALLOC
-# endif
-#endif
-
-/* The __attribute__ feature is available in gcc versions 2.5 and later.
- The attribute __pure__ was added in gcc 2.96. */
-#ifndef _GL_ATTRIBUTE_PURE
-# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
-# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
-# else
-# define _GL_ATTRIBUTE_PURE /* empty */
-# endif
-#endif
-
-/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
-
-/* The definition of _GL_ARG_NONNULL is copied here. */
-
-/* The definition of _GL_WARN_ON_USE is copied here. */
-
-/* Make _GL_ATTRIBUTE_DEALLOC_FREE work, even though <stdlib.h> may not have
- been included yet. */
-#if @GNULIB_FREE_POSIX@
-# if (@REPLACE_FREE@ && !defined free \
- && !(defined __cplusplus && defined GNULIB_NAMESPACE))
-/* We can't do '#define free rpl_free' here. */
-# if defined __cplusplus && (__GLIBC__ + (__GLIBC_MINOR__ >= 14) > 2)
-_GL_EXTERN_C void rpl_free (void *) throw ();
-# else
-_GL_EXTERN_C void rpl_free (void *);
-# endif
-# undef _GL_ATTRIBUTE_DEALLOC_FREE
-# define _GL_ATTRIBUTE_DEALLOC_FREE _GL_ATTRIBUTE_DEALLOC (rpl_free, 1)
-# else
-# if defined _MSC_VER && !defined free
-_GL_EXTERN_C
-# if defined _DLL
- __declspec (dllimport)
-# endif
- void __cdecl free (void *);
-# else
-# if defined __cplusplus && (__GLIBC__ + (__GLIBC_MINOR__ >= 14) > 2)
-_GL_EXTERN_C void free (void *) throw ();
-# else
-_GL_EXTERN_C void free (void *);
-# endif
-# endif
-# endif
-#else
-# if defined _MSC_VER && !defined free
-_GL_EXTERN_C
-# if defined _DLL
- __declspec (dllimport)
-# endif
- void __cdecl free (void *);
-# else
-# if defined __cplusplus && (__GLIBC__ + (__GLIBC_MINOR__ >= 14) > 2)
-_GL_EXTERN_C void free (void *) throw ();
-# else
-_GL_EXTERN_C void free (void *);
-# endif
-# endif
-#endif
-
-/* Clear a block of memory. The compiler will not delete a call to
- this function, even if the block is dead after the call. */
-#if @GNULIB_EXPLICIT_BZERO@
-# if ! @HAVE_EXPLICIT_BZERO@
-_GL_FUNCDECL_SYS (explicit_bzero, void,
- (void *__dest, size_t __n) _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (explicit_bzero, void, (void *__dest, size_t __n));
-_GL_CXXALIASWARN (explicit_bzero);
-#elif defined GNULIB_POSIXCHECK
-# undef explicit_bzero
-# if HAVE_RAW_DECL_EXPLICIT_BZERO
-_GL_WARN_ON_USE (explicit_bzero, "explicit_bzero is unportable - "
- "use gnulib module explicit_bzero for portability");
-# endif
-#endif
-
-/* Find the index of the least-significant set bit. */
-#if @GNULIB_FFSL@
-# if !@HAVE_FFSL@
-_GL_FUNCDECL_SYS (ffsl, int, (long int i));
-# endif
-_GL_CXXALIAS_SYS (ffsl, int, (long int i));
-_GL_CXXALIASWARN (ffsl);
-#elif defined GNULIB_POSIXCHECK
-# undef ffsl
-# if HAVE_RAW_DECL_FFSL
-_GL_WARN_ON_USE (ffsl, "ffsl is not portable - use the ffsl module");
-# endif
-#endif
-
-
-/* Find the index of the least-significant set bit. */
-#if @GNULIB_FFSLL@
-# if @REPLACE_FFSLL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define ffsll rpl_ffsll
-# endif
-_GL_FUNCDECL_RPL (ffsll, int, (long long int i));
-_GL_CXXALIAS_RPL (ffsll, int, (long long int i));
-# else
-# if !@HAVE_FFSLL@
-_GL_FUNCDECL_SYS (ffsll, int, (long long int i));
-# endif
-_GL_CXXALIAS_SYS (ffsll, int, (long long int i));
-# endif
-_GL_CXXALIASWARN (ffsll);
-#elif defined GNULIB_POSIXCHECK
-# undef ffsll
-# if HAVE_RAW_DECL_FFSLL
-_GL_WARN_ON_USE (ffsll, "ffsll is not portable - use the ffsll module");
-# endif
-#endif
-
-
-#if @GNULIB_MDA_MEMCCPY@
-/* On native Windows, map 'memccpy' to '_memccpy', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::memccpy always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef memccpy
-# define memccpy _memccpy
-# endif
-_GL_CXXALIAS_MDA (memccpy, void *,
- (void *dest, const void *src, int c, size_t n));
-# else
-_GL_CXXALIAS_SYS (memccpy, void *,
- (void *dest, const void *src, int c, size_t n));
-# endif
-_GL_CXXALIASWARN (memccpy);
-#endif
-
-
-/* Return the first instance of C within N bytes of S, or NULL. */
-#if @GNULIB_MEMCHR@
-# if @REPLACE_MEMCHR@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef memchr
-# define memchr rpl_memchr
-# endif
-_GL_FUNCDECL_RPL (memchr, void *, (void const *__s, int __c, size_t __n)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (memchr, void *, (void const *__s, int __c, size_t __n));
-# else
- /* On some systems, this function is defined as an overloaded function:
- extern "C" { const void * std::memchr (const void *, int, size_t); }
- extern "C++" { void * std::memchr (void *, int, size_t); } */
-_GL_CXXALIAS_SYS_CAST2 (memchr,
- void *, (void const *__s, int __c, size_t __n),
- void const *, (void const *__s, int __c, size_t __n));
-# endif
-# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
- && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) \
- || defined __clang__)
-_GL_CXXALIASWARN1 (memchr, void *, (void *__s, int __c, size_t __n) throw ());
-_GL_CXXALIASWARN1 (memchr, void const *,
- (void const *__s, int __c, size_t __n) throw ());
-# elif __GLIBC__ >= 2
-_GL_CXXALIASWARN (memchr);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef memchr
-/* Assume memchr is always declared. */
-_GL_WARN_ON_USE (memchr, "memchr has platform-specific bugs - "
- "use gnulib module memchr for portability" );
-#endif
-
-/* Return the first occurrence of NEEDLE in HAYSTACK. */
-#if @GNULIB_MEMMEM@
-# if @REPLACE_MEMMEM@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define memmem rpl_memmem
-# endif
-_GL_FUNCDECL_RPL (memmem, void *,
- (void const *__haystack, size_t __haystack_len,
- void const *__needle, size_t __needle_len)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1, 3)));
-_GL_CXXALIAS_RPL (memmem, void *,
- (void const *__haystack, size_t __haystack_len,
- void const *__needle, size_t __needle_len));
-# else
-# if ! @HAVE_DECL_MEMMEM@
-_GL_FUNCDECL_SYS (memmem, void *,
- (void const *__haystack, size_t __haystack_len,
- void const *__needle, size_t __needle_len)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1, 3)));
-# endif
-_GL_CXXALIAS_SYS (memmem, void *,
- (void const *__haystack, size_t __haystack_len,
- void const *__needle, size_t __needle_len));
-# endif
-_GL_CXXALIASWARN (memmem);
-#elif defined GNULIB_POSIXCHECK
-# undef memmem
-# if HAVE_RAW_DECL_MEMMEM
-_GL_WARN_ON_USE (memmem, "memmem is unportable and often quadratic - "
- "use gnulib module memmem-simple for portability, "
- "and module memmem for speed" );
-# endif
-#endif
-
-/* Copy N bytes of SRC to DEST, return pointer to bytes after the
- last written byte. */
-#if @GNULIB_MEMPCPY@
-# if @REPLACE_MEMPCPY@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef mempcpy
-# define mempcpy rpl_mempcpy
-# endif
-_GL_FUNCDECL_RPL (mempcpy, void *,
- (void *restrict __dest, void const *restrict __src,
- size_t __n)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (mempcpy, void *,
- (void *restrict __dest, void const *restrict __src,
- size_t __n));
-# else
-# if !@HAVE_MEMPCPY@
-_GL_FUNCDECL_SYS (mempcpy, void *,
- (void *restrict __dest, void const *restrict __src,
- size_t __n)
- _GL_ARG_NONNULL ((1, 2)));
-# endif
-_GL_CXXALIAS_SYS (mempcpy, void *,
- (void *restrict __dest, void const *restrict __src,
- size_t __n));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (mempcpy);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef mempcpy
-# if HAVE_RAW_DECL_MEMPCPY
-_GL_WARN_ON_USE (mempcpy, "mempcpy is unportable - "
- "use gnulib module mempcpy for portability");
-# endif
-#endif
-
-/* Search backwards through a block for a byte (specified as an int). */
-#if @GNULIB_MEMRCHR@
-# if ! @HAVE_DECL_MEMRCHR@
-_GL_FUNCDECL_SYS (memrchr, void *, (void const *, int, size_t)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1)));
-# endif
- /* On some systems, this function is defined as an overloaded function:
- extern "C++" { const void * std::memrchr (const void *, int, size_t); }
- extern "C++" { void * std::memrchr (void *, int, size_t); } */
-_GL_CXXALIAS_SYS_CAST2 (memrchr,
- void *, (void const *, int, size_t),
- void const *, (void const *, int, size_t));
-# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
- && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) \
- || defined __clang__)
-_GL_CXXALIASWARN1 (memrchr, void *, (void *, int, size_t) throw ());
-_GL_CXXALIASWARN1 (memrchr, void const *, (void const *, int, size_t) throw ());
-# elif __GLIBC__ >= 2
-_GL_CXXALIASWARN (memrchr);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef memrchr
-# if HAVE_RAW_DECL_MEMRCHR
-_GL_WARN_ON_USE (memrchr, "memrchr is unportable - "
- "use gnulib module memrchr for portability");
-# endif
-#endif
-
-/* Overwrite a block of memory. The compiler will not optimize
- effects away, even if the block is dead after the call. */
-#if @GNULIB_MEMSET_EXPLICIT@
-# if ! @HAVE_MEMSET_EXPLICIT@
-_GL_FUNCDECL_SYS (memset_explicit, void *,
- (void *__dest, int __c, size_t __n) _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (memset_explicit, void *, (void *__dest, int __c, size_t __n));
-_GL_CXXALIASWARN (memset_explicit);
-#elif defined GNULIB_POSIXCHECK
-# undef memset_explicit
-# if HAVE_RAW_DECL_MEMSET_EXPLICIT
-_GL_WARN_ON_USE (memset_explicit, "memset_explicit is unportable - "
- "use gnulib module memset_explicit for portability");
-# endif
-#endif
-
-/* Find the first occurrence of C in S. More efficient than
- memchr(S,C,N), at the expense of undefined behavior if C does not
- occur within N bytes. */
-#if @GNULIB_RAWMEMCHR@
-# if ! @HAVE_RAWMEMCHR@
-_GL_FUNCDECL_SYS (rawmemchr, void *, (void const *__s, int __c_in)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1)));
-# endif
- /* On some systems, this function is defined as an overloaded function:
- extern "C++" { const void * std::rawmemchr (const void *, int); }
- extern "C++" { void * std::rawmemchr (void *, int); } */
-_GL_CXXALIAS_SYS_CAST2 (rawmemchr,
- void *, (void const *__s, int __c_in),
- void const *, (void const *__s, int __c_in));
-# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
- && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) \
- || defined __clang__)
-_GL_CXXALIASWARN1 (rawmemchr, void *, (void *__s, int __c_in) throw ());
-_GL_CXXALIASWARN1 (rawmemchr, void const *,
- (void const *__s, int __c_in) throw ());
-# else
-_GL_CXXALIASWARN (rawmemchr);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef rawmemchr
-# if HAVE_RAW_DECL_RAWMEMCHR
-_GL_WARN_ON_USE (rawmemchr, "rawmemchr is unportable - "
- "use gnulib module rawmemchr for portability");
-# endif
-#endif
-
-/* Copy SRC to DST, returning the address of the terminating '\0' in DST. */
-#if @GNULIB_STPCPY@
-# if @REPLACE_STPCPY@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef stpcpy
-# define stpcpy rpl_stpcpy
-# endif
-_GL_FUNCDECL_RPL (stpcpy, char *,
- (char *restrict __dst, char const *restrict __src)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (stpcpy, char *,
- (char *restrict __dst, char const *restrict __src));
-# else
-# if !@HAVE_STPCPY@
-_GL_FUNCDECL_SYS (stpcpy, char *,
- (char *restrict __dst, char const *restrict __src)
- _GL_ARG_NONNULL ((1, 2)));
-# endif
-_GL_CXXALIAS_SYS (stpcpy, char *,
- (char *restrict __dst, char const *restrict __src));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (stpcpy);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef stpcpy
-# if HAVE_RAW_DECL_STPCPY
-_GL_WARN_ON_USE (stpcpy, "stpcpy is unportable - "
- "use gnulib module stpcpy for portability");
-# endif
-#endif
-
-/* Copy no more than N bytes of SRC to DST, returning a pointer past the
- last non-NUL byte written into DST. */
-#if @GNULIB_STPNCPY@
-# if @REPLACE_STPNCPY@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef stpncpy
-# define stpncpy rpl_stpncpy
-# endif
-_GL_FUNCDECL_RPL (stpncpy, char *,
- (char *restrict __dst, char const *restrict __src,
- size_t __n)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (stpncpy, char *,
- (char *restrict __dst, char const *restrict __src,
- size_t __n));
-# else
-# if ! @HAVE_STPNCPY@
-_GL_FUNCDECL_SYS (stpncpy, char *,
- (char *restrict __dst, char const *restrict __src,
- size_t __n)
- _GL_ARG_NONNULL ((1, 2)));
-# endif
-_GL_CXXALIAS_SYS (stpncpy, char *,
- (char *restrict __dst, char const *restrict __src,
- size_t __n));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (stpncpy);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef stpncpy
-# if HAVE_RAW_DECL_STPNCPY
-_GL_WARN_ON_USE (stpncpy, "stpncpy is unportable - "
- "use gnulib module stpncpy for portability");
-# endif
-#endif
-
-#if defined GNULIB_POSIXCHECK
-/* strchr() does not work with multibyte strings if the locale encoding is
- GB18030 and the character to be searched is a digit. */
-# undef strchr
-/* Assume strchr is always declared. */
-_GL_WARN_ON_USE_CXX (strchr,
- const char *, char *, (const char *, int),
- "strchr cannot work correctly on character strings "
- "in some multibyte locales - "
- "use mbschr if you care about internationalization");
-#endif
-
-/* Find the first occurrence of C in S or the final NUL byte. */
-#if @GNULIB_STRCHRNUL@
-# if @REPLACE_STRCHRNUL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define strchrnul rpl_strchrnul
-# endif
-_GL_FUNCDECL_RPL (strchrnul, char *, (const char *__s, int __c_in)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (strchrnul, char *,
- (const char *str, int ch));
-# else
-# if ! @HAVE_STRCHRNUL@
-_GL_FUNCDECL_SYS (strchrnul, char *, (char const *__s, int __c_in)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1)));
-# endif
- /* On some systems, this function is defined as an overloaded function:
- extern "C++" { const char * std::strchrnul (const char *, int); }
- extern "C++" { char * std::strchrnul (char *, int); } */
-_GL_CXXALIAS_SYS_CAST2 (strchrnul,
- char *, (char const *__s, int __c_in),
- char const *, (char const *__s, int __c_in));
-# endif
-# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
- && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) \
- || defined __clang__)
-_GL_CXXALIASWARN1 (strchrnul, char *, (char *__s, int __c_in) throw ());
-_GL_CXXALIASWARN1 (strchrnul, char const *,
- (char const *__s, int __c_in) throw ());
-# elif __GLIBC__ >= 2
-_GL_CXXALIASWARN (strchrnul);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef strchrnul
-# if HAVE_RAW_DECL_STRCHRNUL
-_GL_WARN_ON_USE (strchrnul, "strchrnul is unportable - "
- "use gnulib module strchrnul for portability");
-# endif
-#endif
-
-/* Duplicate S, returning an identical malloc'd string. */
-#if @GNULIB_STRDUP@
-# if @REPLACE_STRDUP@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef strdup
-# define strdup rpl_strdup
-# endif
-_GL_FUNCDECL_RPL (strdup, char *,
- (char const *__s)
- _GL_ARG_NONNULL ((1))
- _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
-_GL_CXXALIAS_RPL (strdup, char *, (char const *__s));
-# elif defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef strdup
-# define strdup _strdup
-# endif
-_GL_CXXALIAS_MDA (strdup, char *, (char const *__s));
-# else
-# if defined __cplusplus && defined GNULIB_NAMESPACE && defined strdup
- /* strdup exists as a function and as a macro. Get rid of the macro. */
-# undef strdup
-# endif
-# if (!@HAVE_DECL_STRDUP@ || __GNUC__ >= 11) && !defined strdup
-_GL_FUNCDECL_SYS (strdup, char *,
- (char const *__s)
- _GL_ARG_NONNULL ((1))
- _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
-# endif
-_GL_CXXALIAS_SYS (strdup, char *, (char const *__s));
-# endif
-_GL_CXXALIASWARN (strdup);
-#else
-# if __GNUC__ >= 11 && !defined strdup
-/* For -Wmismatched-dealloc: Associate strdup with free or rpl_free. */
-_GL_FUNCDECL_SYS (strdup, char *,
- (char const *__s)
- _GL_ARG_NONNULL ((1))
- _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
-# endif
-# if defined GNULIB_POSIXCHECK
-# undef strdup
-# if HAVE_RAW_DECL_STRDUP
-_GL_WARN_ON_USE (strdup, "strdup is unportable - "
- "use gnulib module strdup for portability");
-# endif
-# elif @GNULIB_MDA_STRDUP@
-/* On native Windows, map 'creat' to '_creat', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::strdup always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef strdup
-# define strdup _strdup
-# endif
-_GL_CXXALIAS_MDA (strdup, char *, (char const *__s));
-# else
-# if defined __cplusplus && defined GNULIB_NAMESPACE && defined strdup
-# undef strdup
-# endif
-_GL_CXXALIAS_SYS (strdup, char *, (char const *__s));
-# endif
-_GL_CXXALIASWARN (strdup);
-# endif
-#endif
-
-/* Append no more than N characters from SRC onto DEST. */
-#if @GNULIB_STRNCAT@
-# if @REPLACE_STRNCAT@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef strncat
-# define strncat rpl_strncat
-# endif
-_GL_FUNCDECL_RPL (strncat, char *,
- (char *restrict dest, const char *restrict src, size_t n)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (strncat, char *,
- (char *restrict dest, const char *restrict src, size_t n));
-# else
-_GL_CXXALIAS_SYS (strncat, char *,
- (char *restrict dest, const char *restrict src, size_t n));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (strncat);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef strncat
-# if HAVE_RAW_DECL_STRNCAT
-_GL_WARN_ON_USE (strncat, "strncat is unportable - "
- "use gnulib module strncat for portability");
-# endif
-#endif
-
-/* Return a newly allocated copy of at most N bytes of STRING. */
-#if @GNULIB_STRNDUP@
-# if @REPLACE_STRNDUP@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef strndup
-# define strndup rpl_strndup
-# endif
-_GL_FUNCDECL_RPL (strndup, char *,
- (char const *__s, size_t __n)
- _GL_ARG_NONNULL ((1))
- _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
-_GL_CXXALIAS_RPL (strndup, char *, (char const *__s, size_t __n));
-# else
-# if !@HAVE_DECL_STRNDUP@ || (__GNUC__ >= 11 && !defined strndup)
-_GL_FUNCDECL_SYS (strndup, char *,
- (char const *__s, size_t __n)
- _GL_ARG_NONNULL ((1))
- _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
-# endif
-_GL_CXXALIAS_SYS (strndup, char *, (char const *__s, size_t __n));
-# endif
-_GL_CXXALIASWARN (strndup);
-#else
-# if __GNUC__ >= 11 && !defined strndup
-/* For -Wmismatched-dealloc: Associate strndup with free or rpl_free. */
-_GL_FUNCDECL_SYS (strndup, char *,
- (char const *__s, size_t __n)
- _GL_ARG_NONNULL ((1))
- _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE);
-# endif
-# if defined GNULIB_POSIXCHECK
-# undef strndup
-# if HAVE_RAW_DECL_STRNDUP
-_GL_WARN_ON_USE (strndup, "strndup is unportable - "
- "use gnulib module strndup for portability");
-# endif
-# endif
-#endif
-
-/* Find the length (number of bytes) of STRING, but scan at most
- MAXLEN bytes. If no '\0' terminator is found in that many bytes,
- return MAXLEN. */
-#if @GNULIB_STRNLEN@
-# if @REPLACE_STRNLEN@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef strnlen
-# define strnlen rpl_strnlen
-# endif
-_GL_FUNCDECL_RPL (strnlen, size_t, (char const *__s, size_t __maxlen)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (strnlen, size_t, (char const *__s, size_t __maxlen));
-# else
-# if ! @HAVE_DECL_STRNLEN@
-_GL_FUNCDECL_SYS (strnlen, size_t, (char const *__s, size_t __maxlen)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (strnlen, size_t, (char const *__s, size_t __maxlen));
-# endif
-_GL_CXXALIASWARN (strnlen);
-#elif defined GNULIB_POSIXCHECK
-# undef strnlen
-# if HAVE_RAW_DECL_STRNLEN
-_GL_WARN_ON_USE (strnlen, "strnlen is unportable - "
- "use gnulib module strnlen for portability");
-# endif
-#endif
-
-#if defined GNULIB_POSIXCHECK
-/* strcspn() assumes the second argument is a list of single-byte characters.
- Even in this simple case, it does not work with multibyte strings if the
- locale encoding is GB18030 and one of the characters to be searched is a
- digit. */
-# undef strcspn
-/* Assume strcspn is always declared. */
-_GL_WARN_ON_USE (strcspn, "strcspn cannot work correctly on character strings "
- "in multibyte locales - "
- "use mbscspn if you care about internationalization");
-#endif
-
-/* Find the first occurrence in S of any character in ACCEPT. */
-#if @GNULIB_STRPBRK@
-# if ! @HAVE_STRPBRK@
-_GL_FUNCDECL_SYS (strpbrk, char *, (char const *__s, char const *__accept)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1, 2)));
-# endif
- /* On some systems, this function is defined as an overloaded function:
- extern "C" { const char * strpbrk (const char *, const char *); }
- extern "C++" { char * strpbrk (char *, const char *); } */
-_GL_CXXALIAS_SYS_CAST2 (strpbrk,
- char *, (char const *__s, char const *__accept),
- const char *, (char const *__s, char const *__accept));
-# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
- && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) \
- || defined __clang__)
-_GL_CXXALIASWARN1 (strpbrk, char *, (char *__s, char const *__accept) throw ());
-_GL_CXXALIASWARN1 (strpbrk, char const *,
- (char const *__s, char const *__accept) throw ());
-# elif __GLIBC__ >= 2
-_GL_CXXALIASWARN (strpbrk);
-# endif
-# if defined GNULIB_POSIXCHECK
-/* strpbrk() assumes the second argument is a list of single-byte characters.
- Even in this simple case, it does not work with multibyte strings if the
- locale encoding is GB18030 and one of the characters to be searched is a
- digit. */
-# undef strpbrk
-_GL_WARN_ON_USE_CXX (strpbrk,
- const char *, char *, (const char *, const char *),
- "strpbrk cannot work correctly on character strings "
- "in multibyte locales - "
- "use mbspbrk if you care about internationalization");
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef strpbrk
-# if HAVE_RAW_DECL_STRPBRK
-_GL_WARN_ON_USE_CXX (strpbrk,
- const char *, char *, (const char *, const char *),
- "strpbrk is unportable - "
- "use gnulib module strpbrk for portability");
-# endif
-#endif
-
-#if defined GNULIB_POSIXCHECK
-/* strspn() assumes the second argument is a list of single-byte characters.
- Even in this simple case, it cannot work with multibyte strings. */
-# undef strspn
-/* Assume strspn is always declared. */
-_GL_WARN_ON_USE (strspn, "strspn cannot work correctly on character strings "
- "in multibyte locales - "
- "use mbsspn if you care about internationalization");
-#endif
-
-#if defined GNULIB_POSIXCHECK
-/* strrchr() does not work with multibyte strings if the locale encoding is
- GB18030 and the character to be searched is a digit. */
-# undef strrchr
-/* Assume strrchr is always declared. */
-_GL_WARN_ON_USE_CXX (strrchr,
- const char *, char *, (const char *, int),
- "strrchr cannot work correctly on character strings "
- "in some multibyte locales - "
- "use mbsrchr if you care about internationalization");
-#endif
-
-/* Search the next delimiter (char listed in DELIM) starting at *STRINGP.
- If one is found, overwrite it with a NUL, and advance *STRINGP
- to point to the next char after it. Otherwise, set *STRINGP to NULL.
- If *STRINGP was already NULL, nothing happens.
- Return the old value of *STRINGP.
-
- This is a variant of strtok() that is multithread-safe and supports
- empty fields.
-
- Caveat: It modifies the original string.
- Caveat: These functions cannot be used on constant strings.
- Caveat: The identity of the delimiting character is lost.
- Caveat: It doesn't work with multibyte strings unless all of the delimiter
- characters are ASCII characters < 0x30.
-
- See also strtok_r(). */
-#if @GNULIB_STRSEP@
-# if ! @HAVE_STRSEP@
-_GL_FUNCDECL_SYS (strsep, char *,
- (char **restrict __stringp, char const *restrict __delim)
- _GL_ARG_NONNULL ((1, 2)));
-# endif
-_GL_CXXALIAS_SYS (strsep, char *,
- (char **restrict __stringp, char const *restrict __delim));
-_GL_CXXALIASWARN (strsep);
-# if defined GNULIB_POSIXCHECK
-# undef strsep
-_GL_WARN_ON_USE (strsep, "strsep cannot work correctly on character strings "
- "in multibyte locales - "
- "use mbssep if you care about internationalization");
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef strsep
-# if HAVE_RAW_DECL_STRSEP
-_GL_WARN_ON_USE (strsep, "strsep is unportable - "
- "use gnulib module strsep for portability");
-# endif
-#endif
-
-#if @GNULIB_STRSTR@
-# if @REPLACE_STRSTR@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define strstr rpl_strstr
-# endif
-_GL_FUNCDECL_RPL (strstr, char *, (const char *haystack, const char *needle)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (strstr, char *, (const char *haystack, const char *needle));
-# else
- /* On some systems, this function is defined as an overloaded function:
- extern "C++" { const char * strstr (const char *, const char *); }
- extern "C++" { char * strstr (char *, const char *); } */
-_GL_CXXALIAS_SYS_CAST2 (strstr,
- char *, (const char *haystack, const char *needle),
- const char *, (const char *haystack, const char *needle));
-# endif
-# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
- && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) \
- || defined __clang__)
-_GL_CXXALIASWARN1 (strstr, char *,
- (char *haystack, const char *needle) throw ());
-_GL_CXXALIASWARN1 (strstr, const char *,
- (const char *haystack, const char *needle) throw ());
-# elif __GLIBC__ >= 2
-_GL_CXXALIASWARN (strstr);
-# endif
-#elif defined GNULIB_POSIXCHECK
-/* strstr() does not work with multibyte strings if the locale encoding is
- different from UTF-8:
- POSIX says that it operates on "strings", and "string" in POSIX is defined
- as a sequence of bytes, not of characters. */
-# undef strstr
-/* Assume strstr is always declared. */
-_GL_WARN_ON_USE (strstr, "strstr is quadratic on many systems, and cannot "
- "work correctly on character strings in most "
- "multibyte locales - "
- "use mbsstr if you care about internationalization, "
- "or use strstr if you care about speed");
-#endif
-
-/* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive
- comparison. */
-#if @GNULIB_STRCASESTR@
-# if @REPLACE_STRCASESTR@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define strcasestr rpl_strcasestr
-# endif
-_GL_FUNCDECL_RPL (strcasestr, char *,
- (const char *haystack, const char *needle)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (strcasestr, char *,
- (const char *haystack, const char *needle));
-# else
-# if ! @HAVE_STRCASESTR@
-_GL_FUNCDECL_SYS (strcasestr, char *,
- (const char *haystack, const char *needle)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1, 2)));
-# endif
- /* On some systems, this function is defined as an overloaded function:
- extern "C++" { const char * strcasestr (const char *, const char *); }
- extern "C++" { char * strcasestr (char *, const char *); } */
-_GL_CXXALIAS_SYS_CAST2 (strcasestr,
- char *, (const char *haystack, const char *needle),
- const char *, (const char *haystack, const char *needle));
-# endif
-# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
- && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) \
- || defined __clang__)
-_GL_CXXALIASWARN1 (strcasestr, char *,
- (char *haystack, const char *needle) throw ());
-_GL_CXXALIASWARN1 (strcasestr, const char *,
- (const char *haystack, const char *needle) throw ());
-# elif __GLIBC__ >= 2
-_GL_CXXALIASWARN (strcasestr);
-# endif
-#elif defined GNULIB_POSIXCHECK
-/* strcasestr() does not work with multibyte strings:
- It is a glibc extension, and glibc implements it only for unibyte
- locales. */
-# undef strcasestr
-# if HAVE_RAW_DECL_STRCASESTR
-_GL_WARN_ON_USE (strcasestr, "strcasestr does work correctly on character "
- "strings in multibyte locales - "
- "use mbscasestr if you care about "
- "internationalization, or use c-strcasestr if you want "
- "a locale independent function");
-# endif
-#endif
-
-/* Parse S into tokens separated by characters in DELIM.
- If S is NULL, the saved pointer in SAVE_PTR is used as
- the next starting point. For example:
- char s[] = "-abc-=-def";
- char *sp;
- x = strtok_r(s, "-", &sp); // x = "abc", sp = "=-def"
- x = strtok_r(NULL, "-=", &sp); // x = "def", sp = NULL
- x = strtok_r(NULL, "=", &sp); // x = NULL
- // s = "abc\0-def\0"
-
- This is a variant of strtok() that is multithread-safe.
-
- For the POSIX documentation for this function, see:
- https://pubs.opengroup.org/onlinepubs/9699919799/functions/strtok.html
-
- Caveat: It modifies the original string.
- Caveat: These functions cannot be used on constant strings.
- Caveat: The identity of the delimiting character is lost.
- Caveat: It doesn't work with multibyte strings unless all of the delimiter
- characters are ASCII characters < 0x30.
-
- See also strsep(). */
-#if @GNULIB_STRTOK_R@
-# if @REPLACE_STRTOK_R@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef strtok_r
-# define strtok_r rpl_strtok_r
-# endif
-_GL_FUNCDECL_RPL (strtok_r, char *,
- (char *restrict s, char const *restrict delim,
- char **restrict save_ptr)
- _GL_ARG_NONNULL ((2, 3)));
-_GL_CXXALIAS_RPL (strtok_r, char *,
- (char *restrict s, char const *restrict delim,
- char **restrict save_ptr));
-# else
-# if @UNDEFINE_STRTOK_R@ || defined GNULIB_POSIXCHECK
-# undef strtok_r
-# endif
-# if ! @HAVE_DECL_STRTOK_R@
-_GL_FUNCDECL_SYS (strtok_r, char *,
- (char *restrict s, char const *restrict delim,
- char **restrict save_ptr)
- _GL_ARG_NONNULL ((2, 3)));
-# endif
-_GL_CXXALIAS_SYS (strtok_r, char *,
- (char *restrict s, char const *restrict delim,
- char **restrict save_ptr));
-# endif
-_GL_CXXALIASWARN (strtok_r);
-# if defined GNULIB_POSIXCHECK
-_GL_WARN_ON_USE (strtok_r, "strtok_r cannot work correctly on character "
- "strings in multibyte locales - "
- "use mbstok_r if you care about internationalization");
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef strtok_r
-# if HAVE_RAW_DECL_STRTOK_R
-_GL_WARN_ON_USE (strtok_r, "strtok_r is unportable - "
- "use gnulib module strtok_r for portability");
-# endif
-#endif
-
-
-/* The following functions are not specified by POSIX. They are gnulib
- extensions. */
-
-#if @GNULIB_MBSLEN@
-/* Return the number of multibyte characters in the character string STRING.
- This considers multibyte characters, unlike strlen, which counts bytes. */
-# ifdef __MirBSD__ /* MirBSD defines mbslen as a macro. Override it. */
-# undef mbslen
-# endif
-# if @HAVE_MBSLEN@ /* AIX, OSF/1, MirBSD define mbslen already in libc. */
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define mbslen rpl_mbslen
-# endif
-_GL_FUNCDECL_RPL (mbslen, size_t, (const char *string)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (mbslen, size_t, (const char *string));
-# else
-_GL_FUNCDECL_SYS (mbslen, size_t, (const char *string)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_SYS (mbslen, size_t, (const char *string));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (mbslen);
-# endif
-#endif
-
-#if @GNULIB_MBSNLEN@
-/* Return the number of multibyte characters in the character string starting
- at STRING and ending at STRING + LEN. */
-_GL_EXTERN_C size_t mbsnlen (const char *string, size_t len)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1));
-#endif
-
-#if @GNULIB_MBSCHR@
-/* Locate the first single-byte character C in the character string STRING,
- and return a pointer to it. Return NULL if C is not found in STRING.
- Unlike strchr(), this function works correctly in multibyte locales with
- encodings such as GB18030. */
-# if defined __hpux
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define mbschr rpl_mbschr /* avoid collision with HP-UX function */
-# endif
-_GL_FUNCDECL_RPL (mbschr, char *, (const char *string, int c)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (mbschr, char *, (const char *string, int c));
-# else
-_GL_FUNCDECL_SYS (mbschr, char *, (const char *string, int c)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_SYS (mbschr, char *, (const char *string, int c));
-# endif
-_GL_CXXALIASWARN (mbschr);
-#endif
-
-#if @GNULIB_MBSRCHR@
-/* Locate the last single-byte character C in the character string STRING,
- and return a pointer to it. Return NULL if C is not found in STRING.
- Unlike strrchr(), this function works correctly in multibyte locales with
- encodings such as GB18030. */
-# if defined __hpux || defined __INTERIX
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define mbsrchr rpl_mbsrchr /* avoid collision with system function */
-# endif
-_GL_FUNCDECL_RPL (mbsrchr, char *, (const char *string, int c)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (mbsrchr, char *, (const char *string, int c));
-# else
-_GL_FUNCDECL_SYS (mbsrchr, char *, (const char *string, int c)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_SYS (mbsrchr, char *, (const char *string, int c));
-# endif
-_GL_CXXALIASWARN (mbsrchr);
-#endif
-
-#if @GNULIB_MBSSTR@
-/* Find the first occurrence of the character string NEEDLE in the character
- string HAYSTACK. Return NULL if NEEDLE is not found in HAYSTACK.
- Unlike strstr(), this function works correctly in multibyte locales with
- encodings different from UTF-8. */
-_GL_EXTERN_C char * mbsstr (const char *haystack, const char *needle)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1, 2));
-#endif
-
-#if @GNULIB_MBSCASECMP@
-/* Compare the character strings S1 and S2, ignoring case, returning less than,
- equal to or greater than zero if S1 is lexicographically less than, equal to
- or greater than S2.
- Note: This function may, in multibyte locales, return 0 for strings of
- different lengths!
- Unlike strcasecmp(), this function works correctly in multibyte locales. */
-_GL_EXTERN_C int mbscasecmp (const char *s1, const char *s2)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1, 2));
-#endif
-
-#if @GNULIB_MBSNCASECMP@
-/* Compare the initial segment of the character string S1 consisting of at most
- N characters with the initial segment of the character string S2 consisting
- of at most N characters, ignoring case, returning less than, equal to or
- greater than zero if the initial segment of S1 is lexicographically less
- than, equal to or greater than the initial segment of S2.
- Note: This function may, in multibyte locales, return 0 for initial segments
- of different lengths!
- Unlike strncasecmp(), this function works correctly in multibyte locales.
- But beware that N is not a byte count but a character count! */
-_GL_EXTERN_C int mbsncasecmp (const char *s1, const char *s2, size_t n)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1, 2));
-#endif
-
-#if @GNULIB_MBSPCASECMP@
-/* Compare the initial segment of the character string STRING consisting of
- at most mbslen (PREFIX) characters with the character string PREFIX,
- ignoring case. If the two match, return a pointer to the first byte
- after this prefix in STRING. Otherwise, return NULL.
- Note: This function may, in multibyte locales, return non-NULL if STRING
- is of smaller length than PREFIX!
- Unlike strncasecmp(), this function works correctly in multibyte
- locales. */
-_GL_EXTERN_C char * mbspcasecmp (const char *string, const char *prefix)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1, 2));
-#endif
-
-#if @GNULIB_MBSCASESTR@
-/* Find the first occurrence of the character string NEEDLE in the character
- string HAYSTACK, using case-insensitive comparison.
- Note: This function may, in multibyte locales, return success even if
- strlen (haystack) < strlen (needle) !
- Unlike strcasestr(), this function works correctly in multibyte locales. */
-_GL_EXTERN_C char * mbscasestr (const char *haystack, const char *needle)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1, 2));
-#endif
-
-#if @GNULIB_MBSCSPN@
-/* Find the first occurrence in the character string STRING of any character
- in the character string ACCEPT. Return the number of bytes from the
- beginning of the string to this occurrence, or to the end of the string
- if none exists.
- Unlike strcspn(), this function works correctly in multibyte locales. */
-_GL_EXTERN_C size_t mbscspn (const char *string, const char *accept)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1, 2));
-#endif
-
-#if @GNULIB_MBSPBRK@
-/* Find the first occurrence in the character string STRING of any character
- in the character string ACCEPT. Return the pointer to it, or NULL if none
- exists.
- Unlike strpbrk(), this function works correctly in multibyte locales. */
-# if defined __hpux
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define mbspbrk rpl_mbspbrk /* avoid collision with HP-UX function */
-# endif
-_GL_FUNCDECL_RPL (mbspbrk, char *, (const char *string, const char *accept)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (mbspbrk, char *, (const char *string, const char *accept));
-# else
-_GL_FUNCDECL_SYS (mbspbrk, char *, (const char *string, const char *accept)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_SYS (mbspbrk, char *, (const char *string, const char *accept));
-# endif
-_GL_CXXALIASWARN (mbspbrk);
-#endif
-
-#if @GNULIB_MBSSPN@
-/* Find the first occurrence in the character string STRING of any character
- not in the character string REJECT. Return the number of bytes from the
- beginning of the string to this occurrence, or to the end of the string
- if none exists.
- Unlike strspn(), this function works correctly in multibyte locales. */
-_GL_EXTERN_C size_t mbsspn (const char *string, const char *reject)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1, 2));
-#endif
-
-#if @GNULIB_MBSSEP@
-/* Search the next delimiter (multibyte character listed in the character
- string DELIM) starting at the character string *STRINGP.
- If one is found, overwrite it with a NUL, and advance *STRINGP to point
- to the next multibyte character after it. Otherwise, set *STRINGP to NULL.
- If *STRINGP was already NULL, nothing happens.
- Return the old value of *STRINGP.
-
- This is a variant of mbstok_r() that supports empty fields.
-
- Caveat: It modifies the original string.
- Caveat: These functions cannot be used on constant strings.
- Caveat: The identity of the delimiting character is lost.
-
- See also mbstok_r(). */
-_GL_EXTERN_C char * mbssep (char **stringp, const char *delim)
- _GL_ARG_NONNULL ((1, 2));
-#endif
-
-#if @GNULIB_MBSTOK_R@
-/* Parse the character string STRING into tokens separated by characters in
- the character string DELIM.
- If STRING is NULL, the saved pointer in SAVE_PTR is used as
- the next starting point. For example:
- char s[] = "-abc-=-def";
- char *sp;
- x = mbstok_r(s, "-", &sp); // x = "abc", sp = "=-def"
- x = mbstok_r(NULL, "-=", &sp); // x = "def", sp = NULL
- x = mbstok_r(NULL, "=", &sp); // x = NULL
- // s = "abc\0-def\0"
-
- Caveat: It modifies the original string.
- Caveat: These functions cannot be used on constant strings.
- Caveat: The identity of the delimiting character is lost.
-
- See also mbssep(). */
-_GL_EXTERN_C char * mbstok_r (char *restrict string, const char *delim,
- char **save_ptr)
- _GL_ARG_NONNULL ((2, 3));
-#endif
-
-/* Map any int, typically from errno, into an error message. */
-#if @GNULIB_STRERROR@
-# if @REPLACE_STRERROR@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef strerror
-# define strerror rpl_strerror
-# endif
-_GL_FUNCDECL_RPL (strerror, char *, (int));
-_GL_CXXALIAS_RPL (strerror, char *, (int));
-# else
-_GL_CXXALIAS_SYS (strerror, char *, (int));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (strerror);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef strerror
-/* Assume strerror is always declared. */
-_GL_WARN_ON_USE (strerror, "strerror is unportable - "
- "use gnulib module strerror to guarantee non-NULL result");
-#endif
-
-/* Map any int, typically from errno, into an error message. Multithread-safe.
- Uses the POSIX declaration, not the glibc declaration. */
-#if @GNULIB_STRERROR_R@
-# if @REPLACE_STRERROR_R@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef strerror_r
-# define strerror_r rpl_strerror_r
-# endif
-_GL_FUNCDECL_RPL (strerror_r, int, (int errnum, char *buf, size_t buflen)
- _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (strerror_r, int, (int errnum, char *buf, size_t buflen));
-# else
-# if !@HAVE_DECL_STRERROR_R@
-_GL_FUNCDECL_SYS (strerror_r, int, (int errnum, char *buf, size_t buflen)
- _GL_ARG_NONNULL ((2)));
-# endif
-_GL_CXXALIAS_SYS (strerror_r, int, (int errnum, char *buf, size_t buflen));
-# endif
-# if __GLIBC__ >= 2 && @HAVE_DECL_STRERROR_R@
-_GL_CXXALIASWARN (strerror_r);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef strerror_r
-# if HAVE_RAW_DECL_STRERROR_R
-_GL_WARN_ON_USE (strerror_r, "strerror_r is unportable - "
- "use gnulib module strerror_r-posix for portability");
-# endif
-#endif
-
-/* Return the name of the system error code ERRNUM. */
-#if @GNULIB_STRERRORNAME_NP@
-# if @REPLACE_STRERRORNAME_NP@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef strerrorname_np
-# define strerrorname_np rpl_strerrorname_np
-# endif
-_GL_FUNCDECL_RPL (strerrorname_np, const char *, (int errnum));
-_GL_CXXALIAS_RPL (strerrorname_np, const char *, (int errnum));
-# else
-# if !@HAVE_STRERRORNAME_NP@
-_GL_FUNCDECL_SYS (strerrorname_np, const char *, (int errnum));
-# endif
-_GL_CXXALIAS_SYS (strerrorname_np, const char *, (int errnum));
-# endif
-_GL_CXXALIASWARN (strerrorname_np);
-#elif defined GNULIB_POSIXCHECK
-# undef strerrorname_np
-# if HAVE_RAW_DECL_STRERRORNAME_NP
-_GL_WARN_ON_USE (strerrorname_np, "strerrorname_np is unportable - "
- "use gnulib module strerrorname_np for portability");
-# endif
-#endif
-
-/* Return an abbreviation string for the signal number SIG. */
-#if @GNULIB_SIGABBREV_NP@
-# if ! @HAVE_SIGABBREV_NP@
-_GL_FUNCDECL_SYS (sigabbrev_np, const char *, (int sig));
-# endif
-_GL_CXXALIAS_SYS (sigabbrev_np, const char *, (int sig));
-_GL_CXXALIASWARN (sigabbrev_np);
-#elif defined GNULIB_POSIXCHECK
-# undef sigabbrev_np
-# if HAVE_RAW_DECL_SIGABBREV_NP
-_GL_WARN_ON_USE (sigabbrev_np, "sigabbrev_np is unportable - "
- "use gnulib module sigabbrev_np for portability");
-# endif
-#endif
-
-/* Return an English description string for the signal number SIG. */
-#if @GNULIB_SIGDESCR_NP@
-# if ! @HAVE_SIGDESCR_NP@
-_GL_FUNCDECL_SYS (sigdescr_np, const char *, (int sig));
-# endif
-_GL_CXXALIAS_SYS (sigdescr_np, const char *, (int sig));
-_GL_CXXALIASWARN (sigdescr_np);
-#elif defined GNULIB_POSIXCHECK
-# undef sigdescr_np
-# if HAVE_RAW_DECL_SIGDESCR_NP
-_GL_WARN_ON_USE (sigdescr_np, "sigdescr_np is unportable - "
- "use gnulib module sigdescr_np for portability");
-# endif
-#endif
-
-#if @GNULIB_STRSIGNAL@
-# if @REPLACE_STRSIGNAL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define strsignal rpl_strsignal
-# endif
-_GL_FUNCDECL_RPL (strsignal, char *, (int __sig));
-_GL_CXXALIAS_RPL (strsignal, char *, (int __sig));
-# else
-# if ! @HAVE_DECL_STRSIGNAL@
-_GL_FUNCDECL_SYS (strsignal, char *, (int __sig));
-# endif
-/* Need to cast, because on Cygwin 1.5.x systems, the return type is
- 'const char *'. */
-_GL_CXXALIAS_SYS_CAST (strsignal, char *, (int __sig));
-# endif
-_GL_CXXALIASWARN (strsignal);
-#elif defined GNULIB_POSIXCHECK
-# undef strsignal
-# if HAVE_RAW_DECL_STRSIGNAL
-_GL_WARN_ON_USE (strsignal, "strsignal is unportable - "
- "use gnulib module strsignal for portability");
-# endif
-#endif
-
-#if @GNULIB_STRVERSCMP@
-# if !@HAVE_STRVERSCMP@
-_GL_FUNCDECL_SYS (strverscmp, int, (const char *, const char *)
- _GL_ATTRIBUTE_PURE
- _GL_ARG_NONNULL ((1, 2)));
-# endif
-_GL_CXXALIAS_SYS (strverscmp, int, (const char *, const char *));
-_GL_CXXALIASWARN (strverscmp);
-#elif defined GNULIB_POSIXCHECK
-# undef strverscmp
-# if HAVE_RAW_DECL_STRVERSCMP
-_GL_WARN_ON_USE (strverscmp, "strverscmp is unportable - "
- "use gnulib module strverscmp for portability");
-# endif
-#endif
-
-
-#endif /* _@GUARD_PREFIX@_STRING_H */
-#endif /* _@GUARD_PREFIX@_STRING_H */
-#endif
diff --git a/cross/lib/strnlen.c b/cross/lib/strnlen.c
deleted file mode 100644
index 09c010eac42..00000000000
--- a/cross/lib/strnlen.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Find the length of STRING, but scan at most MAXLEN characters.
- Copyright (C) 2005-2007, 2009-2023 Free Software Foundation, Inc.
- Written by Simon Josefsson.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-#include <string.h>
-
-/* Find the length of STRING, but scan at most MAXLEN characters.
- If no '\0' terminator is found in that many characters, return MAXLEN. */
-
-size_t
-strnlen (const char *string, size_t maxlen)
-{
- const char *end = memchr (string, '\0', maxlen);
- return end ? (size_t) (end - string) : maxlen;
-}
diff --git a/cross/lib/strtoimax.c b/cross/lib/strtoimax.c
deleted file mode 100644
index f7977e28e64..00000000000
--- a/cross/lib/strtoimax.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Convert string representation of a number into an intmax_t value.
-
- Copyright (C) 1999, 2001-2004, 2006, 2009-2023 Free Software Foundation,
- Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert. */
-
-#include <config.h>
-
-/* Verify interface. */
-#include <inttypes.h>
-
-#include <stdlib.h>
-
-#ifdef UNSIGNED
-# ifndef HAVE_DECL_STRTOULL
-"this configure-time declaration test was not run"
-# endif
-# if !HAVE_DECL_STRTOULL
-unsigned long long int strtoull (char const *, char **, int);
-# endif
-
-#else
-
-# ifndef HAVE_DECL_STRTOLL
-"this configure-time declaration test was not run"
-# endif
-# if !HAVE_DECL_STRTOLL
-long long int strtoll (char const *, char **, int);
-# endif
-#endif
-
-#ifdef UNSIGNED
-# define Int uintmax_t
-# define Strtoimax strtoumax
-# define Strtol strtoul
-# define Strtoll strtoull
-# define Unsigned unsigned
-#else
-# define Int intmax_t
-# define Strtoimax strtoimax
-# define Strtol strtol
-# define Strtoll strtoll
-# define Unsigned
-#endif
-
-Int
-Strtoimax (char const *ptr, char **endptr, int base)
-{
- static_assert (sizeof (Int) == sizeof (Unsigned long int)
- || sizeof (Int) == sizeof (Unsigned long long int));
-
- if (sizeof (Int) != sizeof (Unsigned long int))
- return Strtoll (ptr, endptr, base);
-
- return Strtol (ptr, endptr, base);
-}
diff --git a/cross/lib/strtol.c b/cross/lib/strtol.c
deleted file mode 100644
index d11269b2622..00000000000
--- a/cross/lib/strtol.c
+++ /dev/null
@@ -1,408 +0,0 @@
-/* Convert string representation of a number into an integer value.
-
- Copyright (C) 1991-1992, 1994-1999, 2003, 2005-2007, 2009-2023 Free Software
- Foundation, Inc.
-
- NOTE: The canonical source of this file is maintained with the GNU C
- Library. Bugs can be reported to bug-glibc@gnu.org.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#ifdef _LIBC
-# define USE_NUMBER_GROUPING
-#else
-# include <config.h>
-#endif
-
-#include <ctype.h>
-#include <errno.h>
-#ifndef __set_errno
-# define __set_errno(Val) errno = (Val)
-#endif
-
-#include <limits.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-
-#ifdef USE_NUMBER_GROUPING
-# include "../locale/localeinfo.h"
-#endif
-
-/* Nonzero if we are defining 'strtoul' or 'strtoull', operating on
- unsigned integers. */
-#ifndef UNSIGNED
-# define UNSIGNED 0
-# define INT LONG int
-#else
-# define INT unsigned LONG int
-#endif
-
-/* Determine the name. */
-#ifdef USE_IN_EXTENDED_LOCALE_MODEL
-# undef strtol
-# if UNSIGNED
-# ifdef USE_WIDE_CHAR
-# ifdef QUAD
-# define strtol __wcstoull_l
-# else
-# define strtol __wcstoul_l
-# endif
-# else
-# ifdef QUAD
-# define strtol __strtoull_l
-# else
-# define strtol __strtoul_l
-# endif
-# endif
-# else
-# ifdef USE_WIDE_CHAR
-# ifdef QUAD
-# define strtol __wcstoll_l
-# else
-# define strtol __wcstol_l
-# endif
-# else
-# ifdef QUAD
-# define strtol __strtoll_l
-# else
-# define strtol __strtol_l
-# endif
-# endif
-# endif
-#else
-# if UNSIGNED
-# undef strtol
-# ifdef USE_WIDE_CHAR
-# ifdef QUAD
-# define strtol wcstoull
-# else
-# define strtol wcstoul
-# endif
-# else
-# ifdef QUAD
-# define strtol strtoull
-# else
-# define strtol strtoul
-# endif
-# endif
-# else
-# ifdef USE_WIDE_CHAR
-# undef strtol
-# ifdef QUAD
-# define strtol wcstoll
-# else
-# define strtol wcstol
-# endif
-# else
-# ifdef QUAD
-# undef strtol
-# define strtol strtoll
-# endif
-# endif
-# endif
-#endif
-
-/* If QUAD is defined, we are defining 'strtoll' or 'strtoull',
- operating on 'long long int's. */
-#ifdef QUAD
-# define LONG long long
-# define STRTOL_LONG_MIN LLONG_MIN
-# define STRTOL_LONG_MAX LLONG_MAX
-# define STRTOL_ULONG_MAX ULLONG_MAX
-# if __GNUC__ == 2 && __GNUC_MINOR__ < 7
- /* Work around gcc bug with using this constant. */
- static const unsigned long long int maxquad = ULLONG_MAX;
-# undef STRTOL_ULONG_MAX
-# define STRTOL_ULONG_MAX maxquad
-# endif
-#else
-# define LONG long
-# define STRTOL_LONG_MIN LONG_MIN
-# define STRTOL_LONG_MAX LONG_MAX
-# define STRTOL_ULONG_MAX ULONG_MAX
-#endif
-
-
-#ifdef USE_NUMBER_GROUPING
-# define GROUP_PARAM_PROTO , int group
-#else
-# define GROUP_PARAM_PROTO
-#endif
-
-/* We use this code also for the extended locale handling where the
- function gets as an additional argument the locale which has to be
- used. To access the values we have to redefine the _NL_CURRENT
- macro. */
-#ifdef USE_IN_EXTENDED_LOCALE_MODEL
-# undef _NL_CURRENT
-# define _NL_CURRENT(category, item) \
- (current->values[_NL_ITEM_INDEX (item)].string)
-# define LOCALE_PARAM , loc
-# define LOCALE_PARAM_PROTO , __locale_t loc
-#else
-# define LOCALE_PARAM
-# define LOCALE_PARAM_PROTO
-#endif
-
-#ifdef USE_WIDE_CHAR
-# include <wchar.h>
-# include <wctype.h>
-# define L_(Ch) L##Ch
-# define UCHAR_TYPE wint_t
-# define STRING_TYPE wchar_t
-# ifdef USE_IN_EXTENDED_LOCALE_MODEL
-# define ISSPACE(Ch) __iswspace_l ((Ch), loc)
-# define ISALPHA(Ch) __iswalpha_l ((Ch), loc)
-# define TOUPPER(Ch) __towupper_l ((Ch), loc)
-# else
-# define ISSPACE(Ch) iswspace (Ch)
-# define ISALPHA(Ch) iswalpha (Ch)
-# define TOUPPER(Ch) towupper (Ch)
-# endif
-#else
-# define L_(Ch) Ch
-# define UCHAR_TYPE unsigned char
-# define STRING_TYPE char
-# ifdef USE_IN_EXTENDED_LOCALE_MODEL
-# define ISSPACE(Ch) __isspace_l ((unsigned char) (Ch), loc)
-# define ISALPHA(Ch) __isalpha_l ((unsigned char) (Ch), loc)
-# define TOUPPER(Ch) __toupper_l ((unsigned char) (Ch), loc)
-# else
-# define ISSPACE(Ch) isspace ((unsigned char) (Ch))
-# define ISALPHA(Ch) isalpha ((unsigned char) (Ch))
-# define TOUPPER(Ch) toupper ((unsigned char) (Ch))
-# endif
-#endif
-
-#ifdef USE_NUMBER_GROUPING
-# define INTERNAL(X) INTERNAL1(X)
-# define INTERNAL1(X) __##X##_internal
-# define WEAKNAME(X) WEAKNAME1(X)
-#else
-# define INTERNAL(X) X
-#endif
-
-#ifdef USE_NUMBER_GROUPING
-/* This file defines a function to check for correct grouping. */
-# include "grouping.h"
-#endif
-
-
-
-/* Convert NPTR to an 'unsigned long int' or 'long int' in base BASE.
- If BASE is 0 the base is determined by the presence of a leading
- zero, indicating octal or a leading "0x" or "0X", indicating hexadecimal.
- If BASE is < 2 or > 36, it is reset to 10.
- If ENDPTR is not NULL, a pointer to the character after the last
- one converted is stored in *ENDPTR. */
-
-INT
-INTERNAL (strtol) (const STRING_TYPE *nptr, STRING_TYPE **endptr,
- int base GROUP_PARAM_PROTO LOCALE_PARAM_PROTO)
-{
- int negative;
- register unsigned LONG int cutoff;
- register unsigned int cutlim;
- register unsigned LONG int i;
- register const STRING_TYPE *s;
- register UCHAR_TYPE c;
- const STRING_TYPE *save, *end;
- int overflow;
-
-#ifdef USE_NUMBER_GROUPING
-# ifdef USE_IN_EXTENDED_LOCALE_MODEL
- struct locale_data *current = loc->__locales[LC_NUMERIC];
-# endif
- /* The thousands character of the current locale. */
- wchar_t thousands = L'\0';
- /* The numeric grouping specification of the current locale,
- in the format described in <locale.h>. */
- const char *grouping;
-
- if (group)
- {
- grouping = _NL_CURRENT (LC_NUMERIC, GROUPING);
- if (*grouping <= 0 || *grouping == CHAR_MAX)
- grouping = NULL;
- else
- {
- /* Figure out the thousands separator character. */
-# if defined _LIBC || defined _HAVE_BTOWC
- thousands = __btowc (*_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP));
- if (thousands == WEOF)
- thousands = L'\0';
-# endif
- if (thousands == L'\0')
- grouping = NULL;
- }
- }
- else
- grouping = NULL;
-#endif
-
- if (base < 0 || base == 1 || base > 36)
- {
- __set_errno (EINVAL);
- return 0;
- }
-
- save = s = nptr;
-
- /* Skip white space. */
- while (ISSPACE (*s))
- ++s;
- if (*s == L_('\0'))
- goto noconv;
-
- /* Check for a sign. */
- if (*s == L_('-'))
- {
- negative = 1;
- ++s;
- }
- else if (*s == L_('+'))
- {
- negative = 0;
- ++s;
- }
- else
- negative = 0;
-
- /* Recognize number prefix and if BASE is zero, figure it out ourselves. */
- if (*s == L_('0'))
- {
- if ((base == 0 || base == 16) && TOUPPER (s[1]) == L_('X'))
- {
- s += 2;
- base = 16;
- }
- else if (base == 0)
- base = 8;
- }
- else if (base == 0)
- base = 10;
-
- /* Save the pointer so we can check later if anything happened. */
- save = s;
-
-#ifdef USE_NUMBER_GROUPING
- if (group)
- {
- /* Find the end of the digit string and check its grouping. */
- end = s;
- for (c = *end; c != L_('\0'); c = *++end)
- if ((wchar_t) c != thousands
- && ((wchar_t) c < L_('0') || (wchar_t) c > L_('9'))
- && (!ISALPHA (c) || (int) (TOUPPER (c) - L_('A') + 10) >= base))
- break;
- if (*s == thousands)
- end = s;
- else
- end = correctly_grouped_prefix (s, end, thousands, grouping);
- }
- else
-#endif
- end = NULL;
-
- cutoff = STRTOL_ULONG_MAX / (unsigned LONG int) base;
- cutlim = STRTOL_ULONG_MAX % (unsigned LONG int) base;
-
- overflow = 0;
- i = 0;
- for (c = *s; c != L_('\0'); c = *++s)
- {
- if (s == end)
- break;
- if (c >= L_('0') && c <= L_('9'))
- c -= L_('0');
- else if (ISALPHA (c))
- c = TOUPPER (c) - L_('A') + 10;
- else
- break;
- if ((int) c >= base)
- break;
- /* Check for overflow. */
- if (i > cutoff || (i == cutoff && c > cutlim))
- overflow = 1;
- else
- {
- i *= (unsigned LONG int) base;
- i += c;
- }
- }
-
- /* Check if anything actually happened. */
- if (s == save)
- goto noconv;
-
- /* Store in ENDPTR the address of one character
- past the last character we converted. */
- if (endptr != NULL)
- *endptr = (STRING_TYPE *) s;
-
-#if !UNSIGNED
- /* Check for a value that is within the range of
- 'unsigned LONG int', but outside the range of 'LONG int'. */
- if (overflow == 0
- && i > (negative
- ? -((unsigned LONG int) (STRTOL_LONG_MIN + 1)) + 1
- : (unsigned LONG int) STRTOL_LONG_MAX))
- overflow = 1;
-#endif
-
- if (overflow)
- {
- __set_errno (ERANGE);
-#if UNSIGNED
- return STRTOL_ULONG_MAX;
-#else
- return negative ? STRTOL_LONG_MIN : STRTOL_LONG_MAX;
-#endif
- }
-
- /* Return the result of the appropriate sign. */
- return negative ? -i : i;
-
-noconv:
- /* We must handle a special case here: the base is 0 or 16 and the
- first two characters are '0' and 'x', but the rest are no
- hexadecimal digits. This is no error case. We return 0 and
- ENDPTR points to the 'x'. */
- if (endptr != NULL)
- {
- if (save - nptr >= 2 && TOUPPER (save[-1]) == L_('X')
- && save[-2] == L_('0'))
- *endptr = (STRING_TYPE *) &save[-1];
- else
- /* There was no number to convert. */
- *endptr = (STRING_TYPE *) nptr;
- }
-
- return 0L;
-}
-
-#ifdef USE_NUMBER_GROUPING
-/* External user entry point. */
-
-INT
-# ifdef weak_function
-weak_function
-# endif
-strtol (const STRING_TYPE *nptr, STRING_TYPE **endptr,
- int base LOCALE_PARAM_PROTO)
-{
- return INTERNAL (strtol) (nptr, endptr, base, 0 LOCALE_PARAM);
-}
-#endif
diff --git a/cross/lib/strtoll.c b/cross/lib/strtoll.c
deleted file mode 100644
index 9fdfa19b220..00000000000
--- a/cross/lib/strtoll.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Function to parse a 'long long int' from text.
- Copyright (C) 1995-1997, 1999, 2001, 2009-2023 Free Software Foundation,
- Inc.
- This file is part of the GNU C Library.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#define QUAD 1
-
-#include <strtol.c>
-
-#ifdef _LIBC
-# ifdef SHARED
-# include <shlib-compat.h>
-
-# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
-compat_symbol (libc, __strtoll_internal, __strtoq_internal, GLIBC_2_0);
-# endif
-
-# endif
-weak_alias (strtoll, strtoq)
-#endif
diff --git a/cross/lib/symlink.c b/cross/lib/symlink.c
deleted file mode 100644
index b5009ae8355..00000000000
--- a/cross/lib/symlink.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Stub for symlink().
- Copyright (C) 2009-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-/* Specification. */
-#include <unistd.h>
-
-#include <errno.h>
-#include <string.h>
-#include <sys/stat.h>
-
-
-#if HAVE_SYMLINK
-
-# undef symlink
-
-/* Create a symlink, but reject trailing slash. */
-int
-rpl_symlink (char const *contents, char const *name)
-{
- size_t len = strlen (name);
- if (len && name[len - 1] == '/')
- {
- struct stat st;
- if (lstat (name, &st) == 0 || errno == EOVERFLOW)
- errno = EEXIST;
- return -1;
- }
- return symlink (contents, name);
-}
-
-#else /* !HAVE_SYMLINK */
-
-/* The system does not support symlinks. */
-int
-symlink (_GL_UNUSED char const *contents,
- _GL_UNUSED char const *name)
-{
- errno = ENOSYS;
- return -1;
-}
-
-#endif /* !HAVE_SYMLINK */
diff --git a/cross/lib/sys_random.in.h b/cross/lib/sys_random.in.h
deleted file mode 100644
index 8dca1326837..00000000000
--- a/cross/lib/sys_random.in.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/* Substitute for <sys/random.h>.
- Copyright (C) 2020-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-# if __GNUC__ >= 3
-@PRAGMA_SYSTEM_HEADER@
-# endif
-@PRAGMA_COLUMNS@
-
-#ifndef _@GUARD_PREFIX@_SYS_RANDOM_H
-
-#if @HAVE_SYS_RANDOM_H@
-
-/* On uClibc < 1.0.35, <sys/random.h> assumes prior inclusion of <stddef.h>.
- Do not use __UCLIBC__ here, as it might not be defined yet.
- But avoid namespace pollution on glibc systems. */
-# ifndef __GLIBC__
-# include <stddef.h>
-# endif
-/* On Mac OS X 10.5, <sys/random.h> assumes prior inclusion of <sys/types.h>.
- On Max OS X 10.13, <sys/random.h> assumes prior inclusion of a file that
- includes <Availability.h>, such as <stdlib.h> or <unistd.h>. */
-# if defined __APPLE__ && defined __MACH__ /* Mac OS X */
-# include <sys/types.h>
-# include <stdlib.h>
-# endif
-
-/* The include_next requires a split double-inclusion guard. */
-# @INCLUDE_NEXT@ @NEXT_SYS_RANDOM_H@
-
-#endif
-
-#ifndef _@GUARD_PREFIX@_SYS_RANDOM_H
-#define _@GUARD_PREFIX@_SYS_RANDOM_H
-
-#include <sys/types.h>
-
-/* Define the GRND_* constants. */
-#ifndef GRND_NONBLOCK
-# define GRND_NONBLOCK 1
-# define GRND_RANDOM 2
-#endif
-
-/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
-
-/* The definition of _GL_ARG_NONNULL is copied here. */
-
-/* The definition of _GL_WARN_ON_USE is copied here. */
-
-
-/* Declare overridden functions. */
-
-
-#if @GNULIB_GETRANDOM@
-/* Fill a buffer with random bytes. */
-# if @REPLACE_GETRANDOM@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef getrandom
-# define getrandom rpl_getrandom
-# endif
-_GL_FUNCDECL_RPL (getrandom, ssize_t,
- (void *buffer, size_t length, unsigned int flags)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (getrandom, ssize_t,
- (void *buffer, size_t length, unsigned int flags));
-# else
-# if !@HAVE_GETRANDOM@
-_GL_FUNCDECL_SYS (getrandom, ssize_t,
- (void *buffer, size_t length, unsigned int flags)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (getrandom, ssize_t,
- (void *buffer, size_t length, unsigned int flags));
-# endif
-# if __GLIBC__ + (__GLIBC_MINOR__ >= 25) > 2
-_GL_CXXALIASWARN (getrandom);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef getrandom
-# if HAVE_RAW_DECL_GETRANDOM
-_GL_WARN_ON_USE (getrandom, "getrandom is unportable - "
- "use gnulib module getrandom for portability");
-# endif
-#endif
-
-
-#endif /* _@GUARD_PREFIX@_SYS_RANDOM_H */
-#endif /* _@GUARD_PREFIX@_SYS_RANDOM_H */
diff --git a/cross/lib/sys_select.in.h b/cross/lib/sys_select.in.h
deleted file mode 100644
index 13440fa6f0a..00000000000
--- a/cross/lib/sys_select.in.h
+++ /dev/null
@@ -1,334 +0,0 @@
-/* Substitute for <sys/select.h>.
- Copyright (C) 2007-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-# if __GNUC__ >= 3
-@PRAGMA_SYSTEM_HEADER@
-# endif
-@PRAGMA_COLUMNS@
-
-/* On OSF/1 and Solaris 2.6, <sys/types.h> and <sys/time.h>
- both include <sys/select.h>.
- On Cygwin and OpenBSD, <sys/time.h> includes <sys/select.h>.
- Simply delegate to the system's header in this case. */
-#if (@HAVE_SYS_SELECT_H@ \
- && !defined _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TYPES_H \
- && ((defined __osf__ && defined _SYS_TYPES_H_ \
- && defined _OSF_SOURCE) \
- || (defined __sun && defined _SYS_TYPES_H \
- && (! (defined _XOPEN_SOURCE || defined _POSIX_C_SOURCE) \
- || defined __EXTENSIONS__))))
-
-# define _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TYPES_H
-# @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@
-
-#elif (@HAVE_SYS_SELECT_H@ \
- && (defined _CYGWIN_SYS_TIME_H \
- || (!defined _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TIME_H \
- && ((defined __osf__ && defined _SYS_TIME_H_ \
- && defined _OSF_SOURCE) \
- || (defined __OpenBSD__ && defined _SYS_TIME_H_) \
- || (defined __sun && defined _SYS_TIME_H \
- && (! (defined _XOPEN_SOURCE \
- || defined _POSIX_C_SOURCE) \
- || defined __EXTENSIONS__))))))
-
-# define _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TIME_H
-# @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@
-
-/* On IRIX 6.5, <sys/timespec.h> includes <sys/types.h>, which includes
- <sys/bsd_types.h>, which includes <sys/select.h>. At this point we cannot
- include <signal.h>, because that includes <internal/signal_core.h>, which
- gives a syntax error because <sys/timespec.h> has not been completely
- processed. Simply delegate to the system's header in this case. */
-#elif @HAVE_SYS_SELECT_H@ && defined __sgi && (defined _SYS_BSD_TYPES_H && !defined _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_BSD_TYPES_H)
-
-# define _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_BSD_TYPES_H
-# @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@
-
-/* On OpenBSD 5.0, <pthread.h> includes <sys/types.h>, which includes
- <sys/select.h>. At this point we cannot include <signal.h>, because that
- includes gnulib's pthread.h override, which gives a syntax error because
- /usr/include/pthread.h has not been completely processed. Simply delegate
- to the system's header in this case. */
-#elif @HAVE_SYS_SELECT_H@ && defined __OpenBSD__ && (defined _PTHREAD_H_ && !defined PTHREAD_MUTEX_INITIALIZER)
-
-# @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@
-
-#else
-
-#ifndef _@GUARD_PREFIX@_SYS_SELECT_H
-
-/* On many platforms, <sys/select.h> assumes prior inclusion of
- <sys/types.h>. Also, mingw defines sigset_t there, instead of
- in <signal.h> where it belongs. */
-#include <sys/types.h>
-
-#if @HAVE_SYS_SELECT_H@
-
-/* On OSF/1 4.0, <sys/select.h> provides only a forward declaration
- of 'struct timeval', and no definition of this type.
- Also, Mac OS X, AIX, HP-UX, IRIX, Solaris, Interix declare select()
- in <sys/time.h>.
- But avoid namespace pollution on glibc systems, a circular include
- <sys/select.h> -> <sys/time.h> -> <sys/select.h> on FreeBSD 13.1, and
- "unknown type name" problems on Cygwin. */
-# if !(defined __GLIBC__ || defined __FreeBSD__ || defined __CYGWIN__)
-# include <sys/time.h>
-# endif
-
-/* On AIX 7 and Solaris 10, <sys/select.h> provides an FD_ZERO implementation
- that relies on memset(), but without including <string.h>.
- But in any case avoid namespace pollution on glibc systems. */
-# if (defined __OpenBSD__ || defined _AIX || defined __sun || defined __osf__ || defined __BEOS__) \
- && ! defined __GLIBC__
-# include <string.h>
-# endif
-
-/* The include_next requires a split double-inclusion guard. */
-# @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@
-
-#endif
-
-/* Get definition of 'sigset_t'.
- But avoid namespace pollution on glibc systems and "unknown type
- name" problems on Cygwin.
- On OS/2 kLIBC, sigset_t is defined in <sys/select.h>, too. In addition,
- if <sys/param.h> is included, <types.h> -> <sys/types.h> -> <sys/select.h>
- are included. Then <signal.h> -> <pthread.h> are included by GNULIB. By the
- way, <pthread.h> requires PAGE_SIZE defined in <sys/param.h>. However,
- <sys/param.h> has not been processed, yet. As a result, 'PAGE_SIZE'
- undeclared error occurs in <pthread.h>.
- Do this after the include_next (for the sake of OpenBSD 5.0) but before
- the split double-inclusion guard (for the sake of Solaris). */
-#if !((defined __GLIBC__ || defined __CYGWIN__ || defined __KLIBC__) \
- && !defined __UCLIBC__)
-# include <signal.h>
-#endif
-
-#ifndef _@GUARD_PREFIX@_SYS_SELECT_H
-#define _@GUARD_PREFIX@_SYS_SELECT_H
-
-#if !@HAVE_SYS_SELECT_H@
-/* A platform that lacks <sys/select.h>. */
-/* Get the 'struct timeval' and 'fd_set' types and the FD_* macros
- on most platforms. */
-# include <sys/time.h>
-/* On HP-UX 11, <sys/time.h> provides an FD_ZERO implementation
- that relies on memset(), but without including <string.h>. */
-# if defined __hpux
-# include <string.h>
-# endif
-/* On native Windows platforms:
- Get the 'fd_set' type.
- Get the close() declaration before we override it. */
-# if @HAVE_WINSOCK2_H@
-# if !defined _GL_INCLUDING_WINSOCK2_H
-# define _GL_INCLUDING_WINSOCK2_H
-# include <winsock2.h>
-# undef _GL_INCLUDING_WINSOCK2_H
-# endif
-# include <io.h>
-# endif
-#endif
-
-/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
-
-/* The definition of _GL_WARN_ON_USE is copied here. */
-
-
-/* Fix some definitions from <winsock2.h>. */
-
-#if @HAVE_WINSOCK2_H@
-
-# if !GNULIB_defined_rpl_fd_isset
-
-/* Re-define FD_ISSET to avoid a WSA call while we are not using
- network sockets. */
-static int
-rpl_fd_isset (SOCKET fd, fd_set * set)
-{
- u_int i;
- if (set == NULL)
- return 0;
-
- for (i = 0; i < set->fd_count; i++)
- if (set->fd_array[i] == fd)
- return 1;
-
- return 0;
-}
-
-# define GNULIB_defined_rpl_fd_isset 1
-# endif
-
-# undef FD_ISSET
-# define FD_ISSET(fd, set) rpl_fd_isset(fd, set)
-
-#endif
-
-/* Hide some function declarations from <winsock2.h>. */
-
-#if @HAVE_WINSOCK2_H@
-# if !defined _@GUARD_PREFIX@_UNISTD_H
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef close
-# define close close_used_without_including_unistd_h
-# elif !defined __clang__
- _GL_WARN_ON_USE (close,
- "close() used without including <unistd.h>");
-# endif
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef gethostname
-# define gethostname gethostname_used_without_including_unistd_h
-# elif !defined __clang__
- _GL_WARN_ON_USE (gethostname,
- "gethostname() used without including <unistd.h>");
-# endif
-# endif
-# if !defined _@GUARD_PREFIX@_SYS_SOCKET_H
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef socket
-# define socket socket_used_without_including_sys_socket_h
-# undef connect
-# define connect connect_used_without_including_sys_socket_h
-# undef accept
-# define accept accept_used_without_including_sys_socket_h
-# undef bind
-# define bind bind_used_without_including_sys_socket_h
-# undef getpeername
-# define getpeername getpeername_used_without_including_sys_socket_h
-# undef getsockname
-# define getsockname getsockname_used_without_including_sys_socket_h
-# undef getsockopt
-# define getsockopt getsockopt_used_without_including_sys_socket_h
-# undef listen
-# define listen listen_used_without_including_sys_socket_h
-# undef recv
-# define recv recv_used_without_including_sys_socket_h
-# undef send
-# define send send_used_without_including_sys_socket_h
-# undef recvfrom
-# define recvfrom recvfrom_used_without_including_sys_socket_h
-# undef sendto
-# define sendto sendto_used_without_including_sys_socket_h
-# undef setsockopt
-# define setsockopt setsockopt_used_without_including_sys_socket_h
-# undef shutdown
-# define shutdown shutdown_used_without_including_sys_socket_h
-# elif !defined __clang__
- _GL_WARN_ON_USE (socket,
- "socket() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (connect,
- "connect() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (accept,
- "accept() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (bind,
- "bind() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (getpeername,
- "getpeername() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (getsockname,
- "getsockname() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (getsockopt,
- "getsockopt() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (listen,
- "listen() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (recv,
- "recv() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (send,
- "send() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (recvfrom,
- "recvfrom() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (sendto,
- "sendto() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (setsockopt,
- "setsockopt() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (shutdown,
- "shutdown() used without including <sys/socket.h>");
-# endif
-# endif
-#endif
-
-
-#if @GNULIB_PSELECT@
-# if @REPLACE_PSELECT@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef pselect
-# define pselect rpl_pselect
-# endif
-_GL_FUNCDECL_RPL (pselect, int,
- (int, fd_set *restrict, fd_set *restrict, fd_set *restrict,
- struct timespec const *restrict, const sigset_t *restrict));
-_GL_CXXALIAS_RPL (pselect, int,
- (int, fd_set *restrict, fd_set *restrict, fd_set *restrict,
- struct timespec const *restrict, const sigset_t *restrict));
-# else
-# if !@HAVE_PSELECT@
-_GL_FUNCDECL_SYS (pselect, int,
- (int, fd_set *restrict, fd_set *restrict, fd_set *restrict,
- struct timespec const *restrict, const sigset_t *restrict));
-# endif
-/* Need to cast, because on AIX 7, the second, third, fourth argument may be
- void *restrict, void *restrict, void *restrict. */
-_GL_CXXALIAS_SYS_CAST (pselect, int,
- (int,
- fd_set *restrict, fd_set *restrict, fd_set *restrict,
- struct timespec const *restrict,
- const sigset_t *restrict));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (pselect);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef pselect
-# if HAVE_RAW_DECL_PSELECT
-_GL_WARN_ON_USE (pselect, "pselect is not portable - "
- "use gnulib module pselect for portability");
-# endif
-#endif
-
-#if @GNULIB_SELECT@
-# if @REPLACE_SELECT@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef select
-# define select rpl_select
-# endif
-_GL_FUNCDECL_RPL (select, int,
- (int, fd_set *restrict, fd_set *restrict, fd_set *restrict,
- struct timeval *restrict));
-_GL_CXXALIAS_RPL (select, int,
- (int, fd_set *restrict, fd_set *restrict, fd_set *restrict,
- timeval *restrict));
-# else
-_GL_CXXALIAS_SYS (select, int,
- (int, fd_set *restrict, fd_set *restrict, fd_set *restrict,
- timeval *restrict));
-# endif
-_GL_CXXALIASWARN (select);
-#elif @HAVE_WINSOCK2_H@
-# undef select
-# define select select_used_without_requesting_gnulib_module_select
-#elif defined GNULIB_POSIXCHECK
-# undef select
-# if HAVE_RAW_DECL_SELECT
-_GL_WARN_ON_USE (select, "select is not always POSIX compliant - "
- "use gnulib module select for portability");
-# endif
-#endif
-
-
-#endif /* _@GUARD_PREFIX@_SYS_SELECT_H */
-#endif /* _@GUARD_PREFIX@_SYS_SELECT_H */
-#endif /* OSF/1 */
diff --git a/cross/lib/sys_stat.in.h b/cross/lib/sys_stat.in.h
deleted file mode 100644
index 0c2f39c12bf..00000000000
--- a/cross/lib/sys_stat.in.h
+++ /dev/null
@@ -1,958 +0,0 @@
-/* Provide a more complete sys/stat.h header file.
- Copyright (C) 2005-2023 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, Paul Eggert, and Jim Meyering. */
-
-/* This file is supposed to be used on platforms where <sys/stat.h> is
- incomplete. It is intended to provide definitions and prototypes
- needed by an application. Start with what the system provides. */
-
-#if __GNUC__ >= 3
-@PRAGMA_SYSTEM_HEADER@
-#endif
-@PRAGMA_COLUMNS@
-
-#if defined __need_system_sys_stat_h
-/* Special invocation convention. */
-
-#@INCLUDE_NEXT@ @NEXT_SYS_STAT_H@
-
-#else
-/* Normal invocation convention. */
-
-#ifndef _@GUARD_PREFIX@_SYS_STAT_H
-
-/* Get nlink_t.
- May also define off_t to a 64-bit type on native Windows. */
-#include <sys/types.h>
-
-/* Get struct timespec. */
-#include <time.h>
-
-/* The include_next requires a split double-inclusion guard. */
-#@INCLUDE_NEXT@ @NEXT_SYS_STAT_H@
-
-#ifndef _@GUARD_PREFIX@_SYS_STAT_H
-#define _@GUARD_PREFIX@_SYS_STAT_H
-
-/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
-
-/* The definition of _GL_ARG_NONNULL is copied here. */
-
-/* The definition of _GL_WARN_ON_USE is copied here. */
-
-/* Before doing "#define mknod rpl_mknod" below, we need to include all
- headers that may declare mknod(). OS/2 kLIBC declares mknod() in
- <unistd.h>, not in <sys/stat.h>. */
-#ifdef __KLIBC__
-# include <unistd.h>
-#endif
-
-/* Before doing "#define mkdir rpl_mkdir" below, we need to include all
- headers that may declare mkdir(). Native Windows platforms declare mkdir
- in <io.h> and/or <direct.h>, not in <sys/stat.h>. */
-#if defined _WIN32 && ! defined __CYGWIN__
-# include <io.h> /* mingw32, mingw64 */
-# include <direct.h> /* mingw64, MSVC 9 */
-#endif
-
-/* Native Windows platforms declare umask() in <io.h>. */
-#if 0 && (defined _WIN32 && ! defined __CYGWIN__)
-# include <io.h>
-#endif
-
-/* Large File Support on native Windows. */
-#if @WINDOWS_64_BIT_ST_SIZE@
-# define stat _stati64
-#endif
-
-/* Optionally, override 'struct stat' on native Windows. */
-#if @GNULIB_OVERRIDES_STRUCT_STAT@
-
-# undef stat
-# if @GNULIB_STAT@
-# define stat rpl_stat
-# else
- /* Provoke a clear link error if stat() is used as a function and
- module 'stat' is not in use. */
-# define stat stat_used_without_requesting_gnulib_module_stat
-# endif
-
-# if !GNULIB_defined_struct_stat
-struct stat
-{
- dev_t st_dev;
- ino_t st_ino;
- mode_t st_mode;
- nlink_t st_nlink;
-# if 0
- uid_t st_uid;
-# else /* uid_t is not defined by default on native Windows. */
- short st_uid;
-# endif
-# if 0
- gid_t st_gid;
-# else /* gid_t is not defined by default on native Windows. */
- short st_gid;
-# endif
- dev_t st_rdev;
- off_t st_size;
-# if 0
- blksize_t st_blksize;
- blkcnt_t st_blocks;
-# endif
-
-# if @WINDOWS_STAT_TIMESPEC@
- struct timespec st_atim;
- struct timespec st_mtim;
- struct timespec st_ctim;
-# else
- time_t st_atime;
- time_t st_mtime;
- time_t st_ctime;
-# endif
-};
-# if @WINDOWS_STAT_TIMESPEC@
-# define st_atime st_atim.tv_sec
-# define st_mtime st_mtim.tv_sec
-# define st_ctime st_ctim.tv_sec
- /* Indicator, for gnulib internal purposes. */
-# define _GL_WINDOWS_STAT_TIMESPEC 1
-# endif
-# define GNULIB_defined_struct_stat 1
-# endif
-
-/* Other possible values of st_mode. */
-# if 0
-# define _S_IFBLK 0x6000
-# endif
-# if 0
-# define _S_IFLNK 0xA000
-# endif
-# if 0
-# define _S_IFSOCK 0xC000
-# endif
-
-#endif
-
-#ifndef S_IFIFO
-# ifdef _S_IFIFO
-# define S_IFIFO _S_IFIFO
-# endif
-#endif
-
-#ifndef S_IFMT
-# define S_IFMT 0170000
-#endif
-
-#if STAT_MACROS_BROKEN
-# undef S_ISBLK
-# undef S_ISCHR
-# undef S_ISDIR
-# undef S_ISFIFO
-# undef S_ISLNK
-# undef S_ISNAM
-# undef S_ISMPB
-# undef S_ISMPC
-# undef S_ISNWK
-# undef S_ISREG
-# undef S_ISSOCK
-#endif
-
-#ifndef S_ISBLK
-# ifdef S_IFBLK
-# define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
-# else
-# define S_ISBLK(m) 0
-# endif
-#endif
-
-#ifndef S_ISCHR
-# ifdef S_IFCHR
-# define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
-# else
-# define S_ISCHR(m) 0
-# endif
-#endif
-
-#ifndef S_ISDIR
-# ifdef S_IFDIR
-# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
-# else
-# define S_ISDIR(m) 0
-# endif
-#endif
-
-#ifndef S_ISDOOR /* Solaris 2.5 and up */
-# define S_ISDOOR(m) 0
-#endif
-
-#ifndef S_ISFIFO
-# ifdef S_IFIFO
-# define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
-# else
-# define S_ISFIFO(m) 0
-# endif
-#endif
-
-#ifndef S_ISLNK
-# ifdef S_IFLNK
-# define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
-# else
-# define S_ISLNK(m) 0
-# endif
-#endif
-
-#ifndef S_ISMPB /* V7 */
-# ifdef S_IFMPB
-# define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB)
-# define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC)
-# else
-# define S_ISMPB(m) 0
-# define S_ISMPC(m) 0
-# endif
-#endif
-
-#ifndef S_ISMPX /* AIX */
-# define S_ISMPX(m) 0
-#endif
-
-#ifndef S_ISNAM /* Xenix */
-# ifdef S_IFNAM
-# define S_ISNAM(m) (((m) & S_IFMT) == S_IFNAM)
-# else
-# define S_ISNAM(m) 0
-# endif
-#endif
-
-#ifndef S_ISNWK /* HP/UX */
-# ifdef S_IFNWK
-# define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK)
-# else
-# define S_ISNWK(m) 0
-# endif
-#endif
-
-#ifndef S_ISPORT /* Solaris 10 and up */
-# define S_ISPORT(m) 0
-#endif
-
-#ifndef S_ISREG
-# ifdef S_IFREG
-# define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
-# else
-# define S_ISREG(m) 0
-# endif
-#endif
-
-#ifndef S_ISSOCK
-# ifdef S_IFSOCK
-# define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
-# else
-# define S_ISSOCK(m) 0
-# endif
-#endif
-
-
-#ifndef S_TYPEISMQ
-# define S_TYPEISMQ(p) 0
-#endif
-
-#ifndef S_TYPEISTMO
-# define S_TYPEISTMO(p) 0
-#endif
-
-
-#ifndef S_TYPEISSEM
-# ifdef S_INSEM
-# define S_TYPEISSEM(p) (S_ISNAM ((p)->st_mode) && (p)->st_rdev == S_INSEM)
-# else
-# define S_TYPEISSEM(p) 0
-# endif
-#endif
-
-#ifndef S_TYPEISSHM
-# ifdef S_INSHD
-# define S_TYPEISSHM(p) (S_ISNAM ((p)->st_mode) && (p)->st_rdev == S_INSHD)
-# else
-# define S_TYPEISSHM(p) 0
-# endif
-#endif
-
-/* high performance ("contiguous data") */
-#ifndef S_ISCTG
-# define S_ISCTG(p) 0
-#endif
-
-/* Cray DMF (data migration facility): off line, with data */
-#ifndef S_ISOFD
-# define S_ISOFD(p) 0
-#endif
-
-/* Cray DMF (data migration facility): off line, with no data */
-#ifndef S_ISOFL
-# define S_ISOFL(p) 0
-#endif
-
-/* 4.4BSD whiteout */
-#ifndef S_ISWHT
-# define S_ISWHT(m) 0
-#endif
-
-/* If any of the following are undefined,
- define them to their de facto standard values. */
-#if !S_ISUID
-# define S_ISUID 04000
-#endif
-#if !S_ISGID
-# define S_ISGID 02000
-#endif
-
-/* S_ISVTX is a common extension to POSIX. */
-#ifndef S_ISVTX
-# define S_ISVTX 01000
-#endif
-
-#if !S_IRUSR && S_IREAD
-# define S_IRUSR S_IREAD
-#endif
-#if !S_IRUSR
-# define S_IRUSR 00400
-#endif
-#if !S_IRGRP
-# define S_IRGRP (S_IRUSR >> 3)
-#endif
-#if !S_IROTH
-# define S_IROTH (S_IRUSR >> 6)
-#endif
-
-#if !S_IWUSR && S_IWRITE
-# define S_IWUSR S_IWRITE
-#endif
-#if !S_IWUSR
-# define S_IWUSR 00200
-#endif
-#if !S_IWGRP
-# define S_IWGRP (S_IWUSR >> 3)
-#endif
-#if !S_IWOTH
-# define S_IWOTH (S_IWUSR >> 6)
-#endif
-
-#if !S_IXUSR && S_IEXEC
-# define S_IXUSR S_IEXEC
-#endif
-#if !S_IXUSR
-# define S_IXUSR 00100
-#endif
-#if !S_IXGRP
-# define S_IXGRP (S_IXUSR >> 3)
-#endif
-#if !S_IXOTH
-# define S_IXOTH (S_IXUSR >> 6)
-#endif
-
-#if !S_IRWXU
-# define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR)
-#endif
-#if !S_IRWXG
-# define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP)
-#endif
-#if !S_IRWXO
-# define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH)
-#endif
-
-/* Although S_IXUGO and S_IRWXUGO are not specified by POSIX and are
- not implemented in GNU/Linux, some Gnulib-using apps use the macros. */
-#if !S_IXUGO
-# define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH)
-#endif
-#ifndef S_IRWXUGO
-# define S_IRWXUGO (S_IRWXU | S_IRWXG | S_IRWXO)
-#endif
-
-/* Macros for futimens and utimensat. */
-#ifndef UTIME_NOW
-# define UTIME_NOW (-1)
-# define UTIME_OMIT (-2)
-#endif
-
-
-#if @GNULIB_CHMOD@
-# if @REPLACE_CHMOD@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef chmod
-# define chmod rpl_chmod
-# endif
-_GL_FUNCDECL_RPL (chmod, int, (const char *filename, mode_t mode)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (chmod, int, (const char *filename, mode_t mode));
-# elif defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef chmod
-# define chmod _chmod
-# endif
-/* Need to cast, because in mingw the last argument is 'int mode'. */
-_GL_CXXALIAS_MDA_CAST (chmod, int, (const char *filename, mode_t mode));
-# else
-_GL_CXXALIAS_SYS (chmod, int, (const char *filename, mode_t mode));
-# endif
-_GL_CXXALIASWARN (chmod);
-#elif defined GNULIB_POSIXCHECK
-# undef chmod
-# if HAVE_RAW_DECL_CHMOD
-_GL_WARN_ON_USE (chmod, "chmod has portability problems - "
- "use gnulib module chmod for portability");
-# endif
-#elif @GNULIB_MDA_CHMOD@
-/* On native Windows, map 'chmod' to '_chmod', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::chmod always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef chmod
-# define chmod _chmod
-# endif
-/* Need to cast, because in mingw the last argument is 'int mode'. */
-_GL_CXXALIAS_MDA_CAST (chmod, int, (const char *filename, mode_t mode));
-# else
-_GL_CXXALIAS_SYS (chmod, int, (const char *filename, mode_t mode));
-# endif
-_GL_CXXALIASWARN (chmod);
-#endif
-
-
-#if @GNULIB_FCHMODAT@
-# if @REPLACE_FCHMODAT@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fchmodat
-# define fchmodat rpl_fchmodat
-# endif
-_GL_FUNCDECL_RPL (fchmodat, int,
- (int fd, char const *file, mode_t mode, int flag)
- _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (fchmodat, int,
- (int fd, char const *file, mode_t mode, int flag));
-# else
-# if !@HAVE_FCHMODAT@
-_GL_FUNCDECL_SYS (fchmodat, int,
- (int fd, char const *file, mode_t mode, int flag)
- _GL_ARG_NONNULL ((2)));
-# endif
-_GL_CXXALIAS_SYS (fchmodat, int,
- (int fd, char const *file, mode_t mode, int flag));
-# endif
-_GL_CXXALIASWARN (fchmodat);
-#elif defined GNULIB_POSIXCHECK
-# undef fchmodat
-# if HAVE_RAW_DECL_FCHMODAT
-_GL_WARN_ON_USE (fchmodat, "fchmodat is not portable - "
- "use gnulib module openat for portability");
-# endif
-#endif
-
-
-#if @GNULIB_FSTAT@
-# if @REPLACE_FSTAT@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fstat
-# define fstat rpl_fstat
-# endif
-_GL_FUNCDECL_RPL (fstat, int, (int fd, struct stat *buf) _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (fstat, int, (int fd, struct stat *buf));
-# else
-_GL_CXXALIAS_SYS (fstat, int, (int fd, struct stat *buf));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (fstat);
-# endif
-#elif @GNULIB_OVERRIDES_STRUCT_STAT@
-# undef fstat
-# define fstat fstat_used_without_requesting_gnulib_module_fstat
-#elif @WINDOWS_64_BIT_ST_SIZE@
-/* Above, we define stat to _stati64. */
-# define fstat _fstati64
-#elif defined GNULIB_POSIXCHECK
-# undef fstat
-# if HAVE_RAW_DECL_FSTAT
-_GL_WARN_ON_USE (fstat, "fstat has portability problems - "
- "use gnulib module fstat for portability");
-# endif
-#endif
-
-
-#if @GNULIB_FSTATAT@
-# if @REPLACE_FSTATAT@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fstatat
-# define fstatat rpl_fstatat
-# endif
-_GL_FUNCDECL_RPL (fstatat, int,
- (int fd, char const *restrict name, struct stat *restrict st,
- int flags)
- _GL_ARG_NONNULL ((2, 3)));
-_GL_CXXALIAS_RPL (fstatat, int,
- (int fd, char const *restrict name, struct stat *restrict st,
- int flags));
-# else
-# if !@HAVE_FSTATAT@
-_GL_FUNCDECL_SYS (fstatat, int,
- (int fd, char const *restrict name, struct stat *restrict st,
- int flags)
- _GL_ARG_NONNULL ((2, 3)));
-# endif
-_GL_CXXALIAS_SYS (fstatat, int,
- (int fd, char const *restrict name, struct stat *restrict st,
- int flags));
-# endif
-_GL_CXXALIASWARN (fstatat);
-#elif @GNULIB_OVERRIDES_STRUCT_STAT@
-# undef fstatat
-# define fstatat fstatat_used_without_requesting_gnulib_module_fstatat
-#elif defined GNULIB_POSIXCHECK
-# undef fstatat
-# if HAVE_RAW_DECL_FSTATAT
-_GL_WARN_ON_USE (fstatat, "fstatat is not portable - "
- "use gnulib module openat for portability");
-# endif
-#endif
-
-
-#if @GNULIB_FUTIMENS@
-/* Use the rpl_ prefix also on Solaris <= 9, because on Solaris 9 our futimens
- implementation relies on futimesat, which on Solaris 10 makes an invocation
- to futimens that is meant to invoke the libc's futimens(), not gnulib's
- futimens(). */
-# if @REPLACE_FUTIMENS@ || (!@HAVE_FUTIMENS@ && defined __sun)
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef futimens
-# define futimens rpl_futimens
-# endif
-_GL_FUNCDECL_RPL (futimens, int, (int fd, struct timespec const times[2]));
-_GL_CXXALIAS_RPL (futimens, int, (int fd, struct timespec const times[2]));
-# else
-# if !@HAVE_FUTIMENS@
-_GL_FUNCDECL_SYS (futimens, int, (int fd, struct timespec const times[2]));
-# endif
-_GL_CXXALIAS_SYS (futimens, int, (int fd, struct timespec const times[2]));
-# endif
-# if __GLIBC__ >= 2 && @HAVE_FUTIMENS@
-_GL_CXXALIASWARN (futimens);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef futimens
-# if HAVE_RAW_DECL_FUTIMENS
-_GL_WARN_ON_USE (futimens, "futimens is not portable - "
- "use gnulib module futimens for portability");
-# endif
-#endif
-
-
-#if @GNULIB_GETUMASK@
-# if !@HAVE_GETUMASK@
-_GL_FUNCDECL_SYS (getumask, mode_t, (void));
-# endif
-_GL_CXXALIAS_SYS (getumask, mode_t, (void));
-# if @HAVE_GETUMASK@
-_GL_CXXALIASWARN (getumask);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef getumask
-# if HAVE_RAW_DECL_GETUMASK
-_GL_WARN_ON_USE (getumask, "getumask is not portable - "
- "use gnulib module getumask for portability");
-# endif
-#endif
-
-
-#if @GNULIB_LCHMOD@
-/* Change the mode of FILENAME to MODE, without dereferencing it if FILENAME
- denotes a symbolic link. */
-# if !@HAVE_LCHMOD@ || defined __hpux
-_GL_FUNCDECL_SYS (lchmod, int, (const char *filename, mode_t mode)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (lchmod, int, (const char *filename, mode_t mode));
-_GL_CXXALIASWARN (lchmod);
-#elif defined GNULIB_POSIXCHECK
-# undef lchmod
-# if HAVE_RAW_DECL_LCHMOD
-_GL_WARN_ON_USE (lchmod, "lchmod is unportable - "
- "use gnulib module lchmod for portability");
-# endif
-#endif
-
-
-#if @GNULIB_MKDIR@
-# if @REPLACE_MKDIR@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef mkdir
-# define mkdir rpl_mkdir
-# endif
-_GL_FUNCDECL_RPL (mkdir, int, (char const *name, mode_t mode)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (mkdir, int, (char const *name, mode_t mode));
-# elif defined _WIN32 && !defined __CYGWIN__
-/* mingw's _mkdir() function has 1 argument, but we pass 2 arguments.
- Additionally, it declares _mkdir (and depending on compile flags, an
- alias mkdir), only in the nonstandard includes <direct.h> and <io.h>,
- which are included above. */
-# if !GNULIB_defined_rpl_mkdir
-static int
-rpl_mkdir (char const *name, mode_t mode)
-{
- return _mkdir (name);
-}
-# define GNULIB_defined_rpl_mkdir 1
-# endif
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef mkdir
-# define mkdir rpl_mkdir
-# endif
-_GL_CXXALIAS_RPL (mkdir, int, (char const *name, mode_t mode));
-# else
-_GL_CXXALIAS_SYS (mkdir, int, (char const *name, mode_t mode));
-# endif
-_GL_CXXALIASWARN (mkdir);
-#elif defined GNULIB_POSIXCHECK
-# undef mkdir
-# if HAVE_RAW_DECL_MKDIR
-_GL_WARN_ON_USE (mkdir, "mkdir does not always support two parameters - "
- "use gnulib module mkdir for portability");
-# endif
-#elif @GNULIB_MDA_MKDIR@
-/* On native Windows, map 'mkdir' to '_mkdir', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::mkdir always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !GNULIB_defined_rpl_mkdir
-static int
-rpl_mkdir (char const *name, mode_t mode)
-{
- return _mkdir (name);
-}
-# define GNULIB_defined_rpl_mkdir 1
-# endif
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef mkdir
-# define mkdir rpl_mkdir
-# endif
-_GL_CXXALIAS_RPL (mkdir, int, (char const *name, mode_t mode));
-# else
-_GL_CXXALIAS_SYS (mkdir, int, (char const *name, mode_t mode));
-# endif
-_GL_CXXALIASWARN (mkdir);
-#endif
-
-
-#if @GNULIB_MKDIRAT@
-# if !@HAVE_MKDIRAT@
-_GL_FUNCDECL_SYS (mkdirat, int, (int fd, char const *file, mode_t mode)
- _GL_ARG_NONNULL ((2)));
-# endif
-_GL_CXXALIAS_SYS (mkdirat, int, (int fd, char const *file, mode_t mode));
-_GL_CXXALIASWARN (mkdirat);
-#elif defined GNULIB_POSIXCHECK
-# undef mkdirat
-# if HAVE_RAW_DECL_MKDIRAT
-_GL_WARN_ON_USE (mkdirat, "mkdirat is not portable - "
- "use gnulib module openat for portability");
-# endif
-#endif
-
-
-#if @GNULIB_MKFIFO@
-# if @REPLACE_MKFIFO@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef mkfifo
-# define mkfifo rpl_mkfifo
-# endif
-_GL_FUNCDECL_RPL (mkfifo, int, (char const *file, mode_t mode)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (mkfifo, int, (char const *file, mode_t mode));
-# else
-# if !@HAVE_MKFIFO@
-_GL_FUNCDECL_SYS (mkfifo, int, (char const *file, mode_t mode)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (mkfifo, int, (char const *file, mode_t mode));
-# endif
-_GL_CXXALIASWARN (mkfifo);
-#elif defined GNULIB_POSIXCHECK
-# undef mkfifo
-# if HAVE_RAW_DECL_MKFIFO
-_GL_WARN_ON_USE (mkfifo, "mkfifo is not portable - "
- "use gnulib module mkfifo for portability");
-# endif
-#endif
-
-
-#if @GNULIB_MKFIFOAT@
-# if @REPLACE_MKFIFOAT@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef mkfifoat
-# define mkfifoat rpl_mkfifoat
-# endif
-_GL_FUNCDECL_RPL (mkfifoat, int, (int fd, char const *file, mode_t mode)
- _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (mkfifoat, int, (int fd, char const *file, mode_t mode));
-# else
-# if !@HAVE_MKFIFOAT@
-_GL_FUNCDECL_SYS (mkfifoat, int, (int fd, char const *file, mode_t mode)
- _GL_ARG_NONNULL ((2)));
-# endif
-_GL_CXXALIAS_SYS (mkfifoat, int, (int fd, char const *file, mode_t mode));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (mkfifoat);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef mkfifoat
-# if HAVE_RAW_DECL_MKFIFOAT
-_GL_WARN_ON_USE (mkfifoat, "mkfifoat is not portable - "
- "use gnulib module mkfifoat for portability");
-# endif
-#endif
-
-
-#if @GNULIB_MKNOD@
-# if @REPLACE_MKNOD@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef mknod
-# define mknod rpl_mknod
-# endif
-_GL_FUNCDECL_RPL (mknod, int, (char const *file, mode_t mode, dev_t dev)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (mknod, int, (char const *file, mode_t mode, dev_t dev));
-# else
-# if !@HAVE_MKNOD@
-_GL_FUNCDECL_SYS (mknod, int, (char const *file, mode_t mode, dev_t dev)
- _GL_ARG_NONNULL ((1)));
-# endif
-/* Need to cast, because on OSF/1 5.1, the third parameter is '...'. */
-_GL_CXXALIAS_SYS_CAST (mknod, int, (char const *file, mode_t mode, dev_t dev));
-# endif
-_GL_CXXALIASWARN (mknod);
-#elif defined GNULIB_POSIXCHECK
-# undef mknod
-# if HAVE_RAW_DECL_MKNOD
-_GL_WARN_ON_USE (mknod, "mknod is not portable - "
- "use gnulib module mknod for portability");
-# endif
-#endif
-
-
-#if @GNULIB_MKNODAT@
-# if @REPLACE_MKNODAT@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef mknodat
-# define mknodat rpl_mknodat
-# endif
-_GL_FUNCDECL_RPL (mknodat, int,
- (int fd, char const *file, mode_t mode, dev_t dev)
- _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (mknodat, int,
- (int fd, char const *file, mode_t mode, dev_t dev));
-# else
-# if !@HAVE_MKNODAT@
-_GL_FUNCDECL_SYS (mknodat, int,
- (int fd, char const *file, mode_t mode, dev_t dev)
- _GL_ARG_NONNULL ((2)));
-# endif
-_GL_CXXALIAS_SYS (mknodat, int,
- (int fd, char const *file, mode_t mode, dev_t dev));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (mknodat);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef mknodat
-# if HAVE_RAW_DECL_MKNODAT
-_GL_WARN_ON_USE (mknodat, "mknodat is not portable - "
- "use gnulib module mkfifoat for portability");
-# endif
-#endif
-
-
-#if @GNULIB_STAT@
-# if @REPLACE_STAT@
-# if !@GNULIB_OVERRIDES_STRUCT_STAT@
- /* We can't use the object-like #define stat rpl_stat, because of
- struct stat. This means that rpl_stat will not be used if the user
- does (stat)(a,b). Oh well. */
-# if defined _AIX && defined stat && defined _LARGE_FILES
- /* With _LARGE_FILES defined, AIX (only) defines stat to stat64,
- so we have to replace stat64() instead of stat(). */
-# undef stat64
-# define stat64(name, st) rpl_stat (name, st)
-# elif @WINDOWS_64_BIT_ST_SIZE@
- /* Above, we define stat to _stati64. */
-# if defined __MINGW32__ && defined _stati64
-# ifndef _USE_32BIT_TIME_T
- /* The system headers define _stati64 to _stat64. */
-# undef _stat64
-# define _stat64(name, st) rpl_stat (name, st)
-# endif
-# elif defined _MSC_VER && defined _stati64
-# ifdef _USE_32BIT_TIME_T
- /* The system headers define _stati64 to _stat32i64. */
-# undef _stat32i64
-# define _stat32i64(name, st) rpl_stat (name, st)
-# else
- /* The system headers define _stati64 to _stat64. */
-# undef _stat64
-# define _stat64(name, st) rpl_stat (name, st)
-# endif
-# else
-# undef _stati64
-# define _stati64(name, st) rpl_stat (name, st)
-# endif
-# elif defined __MINGW32__ && defined stat
-# ifdef _USE_32BIT_TIME_T
- /* The system headers define stat to _stat32i64. */
-# undef _stat32i64
-# define _stat32i64(name, st) rpl_stat (name, st)
-# else
- /* The system headers define stat to _stat64. */
-# undef _stat64
-# define _stat64(name, st) rpl_stat (name, st)
-# endif
-# elif defined _MSC_VER && defined stat
-# ifdef _USE_32BIT_TIME_T
- /* The system headers define stat to _stat32. */
-# undef _stat32
-# define _stat32(name, st) rpl_stat (name, st)
-# else
- /* The system headers define stat to _stat64i32. */
-# undef _stat64i32
-# define _stat64i32(name, st) rpl_stat (name, st)
-# endif
-# else /* !(_AIX || __MINGW32__ || _MSC_VER) */
-# undef stat
-# define stat(name, st) rpl_stat (name, st)
-# endif /* !_LARGE_FILES */
-# endif /* !@GNULIB_OVERRIDES_STRUCT_STAT@ */
-_GL_EXTERN_C int stat (const char *restrict name, struct stat *restrict buf)
- _GL_ARG_NONNULL ((1, 2));
-# endif
-#elif @GNULIB_OVERRIDES_STRUCT_STAT@
-/* see above:
- #define stat stat_used_without_requesting_gnulib_module_stat
- */
-#elif defined GNULIB_POSIXCHECK
-# undef stat
-# if HAVE_RAW_DECL_STAT
-_GL_WARN_ON_USE (stat, "stat is unportable - "
- "use gnulib module stat for portability");
-# endif
-#endif
-
-
-#if @GNULIB_LSTAT@
-# if ! @HAVE_LSTAT@
-/* mingw does not support symlinks, therefore it does not have lstat. But
- without links, stat does just fine. */
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define lstat stat
-# endif
-_GL_CXXALIAS_RPL_1 (lstat, stat, int,
- (const char *restrict name, struct stat *restrict buf));
-# elif @REPLACE_LSTAT@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef lstat
-# define lstat rpl_lstat
-# endif
-_GL_FUNCDECL_RPL (lstat, int,
- (const char *restrict name, struct stat *restrict buf)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (lstat, int,
- (const char *restrict name, struct stat *restrict buf));
-# else
-_GL_CXXALIAS_SYS (lstat, int,
- (const char *restrict name, struct stat *restrict buf));
-# endif
-# if @HAVE_LSTAT@
-_GL_CXXALIASWARN (lstat);
-# endif
-#elif @GNULIB_OVERRIDES_STRUCT_STAT@
-# undef lstat
-# define lstat lstat_used_without_requesting_gnulib_module_lstat
-#elif defined GNULIB_POSIXCHECK
-# undef lstat
-# if HAVE_RAW_DECL_LSTAT
-_GL_WARN_ON_USE (lstat, "lstat is unportable - "
- "use gnulib module lstat for portability");
-# endif
-#endif
-
-
-#if @GNULIB_MDA_UMASK@
-/* On native Windows, map 'umask' to '_umask', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::umask always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef umask
-# define umask _umask
-# endif
-/* Need to cast, because in mingw the last argument is 'int mode'. */
-_GL_CXXALIAS_MDA_CAST (umask, mode_t, (mode_t mask));
-# else
-_GL_CXXALIAS_SYS (umask, mode_t, (mode_t mask));
-# endif
-_GL_CXXALIASWARN (umask);
-#endif
-
-
-#if @GNULIB_UTIMENSAT@
-/* Use the rpl_ prefix also on Solaris <= 9, because on Solaris 9 our utimensat
- implementation relies on futimesat, which on Solaris 10 makes an invocation
- to utimensat that is meant to invoke the libc's utimensat(), not gnulib's
- utimensat(). */
-# if @REPLACE_UTIMENSAT@ || (!@HAVE_UTIMENSAT@ && defined __sun)
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef utimensat
-# define utimensat rpl_utimensat
-# endif
-_GL_FUNCDECL_RPL (utimensat, int, (int fd, char const *name,
- struct timespec const times[2], int flag)
- _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (utimensat, int, (int fd, char const *name,
- struct timespec const times[2], int flag));
-# else
-# if !@HAVE_UTIMENSAT@
-_GL_FUNCDECL_SYS (utimensat, int, (int fd, char const *name,
- struct timespec const times[2], int flag)
- _GL_ARG_NONNULL ((2)));
-# endif
-_GL_CXXALIAS_SYS (utimensat, int, (int fd, char const *name,
- struct timespec const times[2], int flag));
-# endif
-# if __GLIBC__ >= 2 && @HAVE_UTIMENSAT@
-_GL_CXXALIASWARN (utimensat);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef utimensat
-# if HAVE_RAW_DECL_UTIMENSAT
-_GL_WARN_ON_USE (utimensat, "utimensat is not portable - "
- "use gnulib module utimensat for portability");
-# endif
-#endif
-
-
-#endif /* _@GUARD_PREFIX@_SYS_STAT_H */
-#endif /* _@GUARD_PREFIX@_SYS_STAT_H */
-#endif
diff --git a/cross/lib/sys_time.in.h b/cross/lib/sys_time.in.h
deleted file mode 100644
index e833d551677..00000000000
--- a/cross/lib/sys_time.in.h
+++ /dev/null
@@ -1,224 +0,0 @@
-/* Provide a more complete sys/time.h.
-
- Copyright (C) 2007-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert. */
-
-#ifndef _@GUARD_PREFIX@_SYS_TIME_H
-
-#if __GNUC__ >= 3
-@PRAGMA_SYSTEM_HEADER@
-#endif
-@PRAGMA_COLUMNS@
-
-/* On Cygwin and on many BSDish systems, <sys/time.h> includes itself
- recursively via <sys/select.h>.
- Simply delegate to the system's header in this case; it is a no-op.
- Without this extra ifdef, the C++ gettimeofday declaration below
- would be a forward declaration in gnulib's nested <sys/time.h>. */
-#if defined _CYGWIN_SYS_TIME_H || defined _SYS_TIME_H || defined _SYS_TIME_H_
-# @INCLUDE_NEXT@ @NEXT_SYS_TIME_H@
-#else
-
-/* The include_next requires a split double-inclusion guard. */
-#if @HAVE_SYS_TIME_H@
-# @INCLUDE_NEXT@ @NEXT_SYS_TIME_H@
-#endif
-
-#ifndef _@GUARD_PREFIX@_SYS_TIME_H
-#define _@GUARD_PREFIX@_SYS_TIME_H
-
-#if ! @HAVE_SYS_TIME_H@
-# include <time.h>
-#endif
-
-/* On native Windows with MSVC, get the 'struct timeval' type.
- Also, on native Windows with a 64-bit time_t, where we are overriding the
- 'struct timeval' type, get all declarations of system functions whose
- signature contains 'struct timeval'. */
-#if (defined _MSC_VER || @REPLACE_STRUCT_TIMEVAL@) && @HAVE_WINSOCK2_H@ && !defined _GL_INCLUDING_WINSOCK2_H
-# define _GL_INCLUDING_WINSOCK2_H
-# include <winsock2.h>
-# undef _GL_INCLUDING_WINSOCK2_H
-#endif
-
-/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
-
-/* The definition of _GL_ARG_NONNULL is copied here. */
-
-/* The definition of _GL_WARN_ON_USE is copied here. */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if !@HAVE_STRUCT_TIMEVAL@ || @REPLACE_STRUCT_TIMEVAL@
-
-# if @REPLACE_STRUCT_TIMEVAL@
-# define timeval rpl_timeval
-# endif
-
-# if !GNULIB_defined_struct_timeval
-struct timeval
-{
- time_t tv_sec;
- long int tv_usec;
-};
-# define GNULIB_defined_struct_timeval 1
-# endif
-
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#if @GNULIB_GETTIMEOFDAY@
-# if @REPLACE_GETTIMEOFDAY@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef gettimeofday
-# define gettimeofday rpl_gettimeofday
-# endif
-_GL_FUNCDECL_RPL (gettimeofday, int,
- (struct timeval *restrict, void *restrict)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (gettimeofday, int,
- (struct timeval *restrict, void *restrict));
-# else
-# if !@HAVE_GETTIMEOFDAY@
-_GL_FUNCDECL_SYS (gettimeofday, int,
- (struct timeval *restrict, void *restrict)
- _GL_ARG_NONNULL ((1)));
-# endif
-/* Need to cast, because on glibc systems, by default, the second argument is
- struct timezone *. */
-_GL_CXXALIAS_SYS_CAST (gettimeofday, int,
- (struct timeval *restrict, void *restrict));
-# endif
-_GL_CXXALIASWARN (gettimeofday);
-# if defined __cplusplus && defined GNULIB_NAMESPACE
-namespace GNULIB_NAMESPACE {
- typedef ::timeval
-# undef timeval
- timeval;
-# if @REPLACE_STRUCT_TIMEVAL@
-# define timeval rpl_timeval
- typedef ::timeval timeval;
-# endif
-}
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef gettimeofday
-# if HAVE_RAW_DECL_GETTIMEOFDAY
-_GL_WARN_ON_USE (gettimeofday, "gettimeofday is unportable - "
- "use gnulib module gettimeofday for portability");
-# endif
-#endif
-
-/* Hide some function declarations from <winsock2.h>. */
-
-#if defined _MSC_VER && @HAVE_WINSOCK2_H@
-# if !defined _@GUARD_PREFIX@_UNISTD_H
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef close
-# define close close_used_without_including_unistd_h
-# elif !defined __clang__
- _GL_WARN_ON_USE (close,
- "close() used without including <unistd.h>");
-# endif
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef gethostname
-# define gethostname gethostname_used_without_including_unistd_h
-# else
- _GL_WARN_ON_USE (gethostname,
- "gethostname() used without including <unistd.h>");
-# endif
-# endif
-# if !defined _@GUARD_PREFIX@_SYS_SOCKET_H
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef socket
-# define socket socket_used_without_including_sys_socket_h
-# undef connect
-# define connect connect_used_without_including_sys_socket_h
-# undef accept
-# define accept accept_used_without_including_sys_socket_h
-# undef bind
-# define bind bind_used_without_including_sys_socket_h
-# undef getpeername
-# define getpeername getpeername_used_without_including_sys_socket_h
-# undef getsockname
-# define getsockname getsockname_used_without_including_sys_socket_h
-# undef getsockopt
-# define getsockopt getsockopt_used_without_including_sys_socket_h
-# undef listen
-# define listen listen_used_without_including_sys_socket_h
-# undef recv
-# define recv recv_used_without_including_sys_socket_h
-# undef send
-# define send send_used_without_including_sys_socket_h
-# undef recvfrom
-# define recvfrom recvfrom_used_without_including_sys_socket_h
-# undef sendto
-# define sendto sendto_used_without_including_sys_socket_h
-# undef setsockopt
-# define setsockopt setsockopt_used_without_including_sys_socket_h
-# undef shutdown
-# define shutdown shutdown_used_without_including_sys_socket_h
-# else
- _GL_WARN_ON_USE (socket,
- "socket() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (connect,
- "connect() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (accept,
- "accept() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (bind,
- "bind() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (getpeername,
- "getpeername() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (getsockname,
- "getsockname() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (getsockopt,
- "getsockopt() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (listen,
- "listen() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (recv,
- "recv() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (send,
- "send() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (recvfrom,
- "recvfrom() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (sendto,
- "sendto() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (setsockopt,
- "setsockopt() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (shutdown,
- "shutdown() used without including <sys/socket.h>");
-# endif
-# endif
-# if !defined _@GUARD_PREFIX@_SYS_SELECT_H
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef select
-# define select select_used_without_including_sys_select_h
-# else
- _GL_WARN_ON_USE (select,
- "select() used without including <sys/select.h>");
-# endif
-# endif
-#endif
-
-#endif /* _@GUARD_PREFIX@_SYS_TIME_H */
-#endif /* _CYGWIN_SYS_TIME_H */
-#endif /* _@GUARD_PREFIX@_SYS_TIME_H */
diff --git a/cross/lib/sys_types.in.h b/cross/lib/sys_types.in.h
deleted file mode 100644
index 082a6c674de..00000000000
--- a/cross/lib/sys_types.in.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/* Provide a more complete sys/types.h.
-
- Copyright (C) 2011-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#if __GNUC__ >= 3
-@PRAGMA_SYSTEM_HEADER@
-#endif
-@PRAGMA_COLUMNS@
-
-#if defined _WIN32 && !defined __CYGWIN__ \
- && (defined __need_off_t || defined __need___off64_t \
- || defined __need_ssize_t || defined __need_time_t)
-
-/* Special invocation convention inside mingw header files. */
-
-#@INCLUDE_NEXT@ @NEXT_SYS_TYPES_H@
-
-#else
-/* Normal invocation convention. */
-
-#ifndef _@GUARD_PREFIX@_SYS_TYPES_H
-
-/* The include_next requires a split double-inclusion guard. */
-# define _GL_INCLUDING_SYS_TYPES_H
-#@INCLUDE_NEXT@ @NEXT_SYS_TYPES_H@
-# undef _GL_INCLUDING_SYS_TYPES_H
-
-#ifndef _@GUARD_PREFIX@_SYS_TYPES_H
-#define _@GUARD_PREFIX@_SYS_TYPES_H
-
-/* Override off_t if Large File Support is requested on native Windows. */
-#if @WINDOWS_64_BIT_OFF_T@
-/* Same as int64_t in <stdint.h>. */
-# if defined _MSC_VER
-# define off_t __int64
-# else
-# define off_t long long int
-# endif
-/* Indicator, for gnulib internal purposes. */
-# define _GL_WINDOWS_64_BIT_OFF_T 1
-#endif
-
-/* Override dev_t and ino_t if distinguishable inodes support is requested
- on native Windows. */
-#if @WINDOWS_STAT_INODES@
-
-# if @WINDOWS_STAT_INODES@ == 2
-/* Experimental, not useful in Windows 10. */
-
-/* Define dev_t to a 64-bit type. */
-# if !defined GNULIB_defined_dev_t
-typedef unsigned long long int rpl_dev_t;
-# undef dev_t
-# define dev_t rpl_dev_t
-# define GNULIB_defined_dev_t 1
-# endif
-
-/* Define ino_t to a 128-bit type. */
-# if !defined GNULIB_defined_ino_t
-/* MSVC does not have a 128-bit integer type.
- GCC has a 128-bit integer type __int128, but only on 64-bit targets. */
-typedef struct { unsigned long long int _gl_ino[2]; } rpl_ino_t;
-# undef ino_t
-# define ino_t rpl_ino_t
-# define GNULIB_defined_ino_t 1
-# endif
-
-# else /* @WINDOWS_STAT_INODES@ == 1 */
-
-/* Define ino_t to a 64-bit type. */
-# if !defined GNULIB_defined_ino_t
-typedef unsigned long long int rpl_ino_t;
-# undef ino_t
-# define ino_t rpl_ino_t
-# define GNULIB_defined_ino_t 1
-# endif
-
-# endif
-
-/* Indicator, for gnulib internal purposes. */
-# define _GL_WINDOWS_STAT_INODES @WINDOWS_STAT_INODES@
-
-#endif
-
-/* MSVC 9 defines size_t in <stddef.h>, not in <sys/types.h>. */
-/* But avoid namespace pollution on glibc systems. */
-#if (defined _WIN32 && ! defined __CYGWIN__) && ! defined __GLIBC__
-# include <stddef.h>
-#endif
-
-#endif /* _@GUARD_PREFIX@_SYS_TYPES_H */
-#endif /* _@GUARD_PREFIX@_SYS_TYPES_H */
-#endif /* __need_XXX */
diff --git a/cross/lib/tempname.c b/cross/lib/tempname.c
deleted file mode 100644
index bf362db6e17..00000000000
--- a/cross/lib/tempname.c
+++ /dev/null
@@ -1,286 +0,0 @@
-/* Copyright (C) 1991-2023 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/>. */
-
-#if !_LIBC
-# include <libc-config.h>
-# include "tempname.h"
-#endif
-
-#include <errno.h>
-
-#include <stdio.h>
-#ifndef TMP_MAX
-# define TMP_MAX 238328
-#endif
-#ifndef __GT_FILE
-# define __GT_FILE 0
-# define __GT_DIR 1
-# define __GT_NOCREATE 2
-#endif
-#if !_LIBC && (GT_FILE != __GT_FILE || GT_DIR != __GT_DIR \
- || GT_NOCREATE != __GT_NOCREATE)
-# error report this to bug-gnulib@gnu.org
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <fcntl.h>
-#include <stdint.h>
-#include <sys/random.h>
-#include <sys/stat.h>
-#include <time.h>
-
-#if _LIBC
-# define struct_stat64 struct __stat64_t64
-#else
-# define struct_stat64 struct stat
-# define __gen_tempname gen_tempname
-# define __mkdir mkdir
-# define __open open
-# define __lstat64_time64(file, buf) lstat (file, buf)
-# define __getrandom getrandom
-# define __clock_gettime64 clock_gettime
-# define __timespec64 timespec
-#endif
-
-/* Use getrandom if it works, falling back on a 64-bit linear
- congruential generator that starts with Var's value
- mixed in with a clock's low-order bits if available. */
-typedef uint_fast64_t random_value;
-#define RANDOM_VALUE_MAX UINT_FAST64_MAX
-#define BASE_62_DIGITS 10 /* 62**10 < UINT_FAST64_MAX */
-#define BASE_62_POWER (62LL * 62 * 62 * 62 * 62 * 62 * 62 * 62 * 62 * 62)
-
-/* Return the result of mixing the entropy from R and S.
- Assume that R and S are not particularly random,
- and that the result should look randomish to an untrained eye. */
-
-static random_value
-mix_random_values (random_value r, random_value s)
-{
- /* As this code is used only when high-quality randomness is neither
- available nor necessary, there is no need for fancier polynomials
- such as those in the Linux kernel's 'random' driver. */
- return (2862933555777941757 * r + 3037000493) ^ s;
-}
-
-/* Set *R to a random value.
- Return true if *R is set to high-quality value taken from getrandom.
- Otherwise return false, falling back to a low-quality *R that might
- depend on S.
-
- This function returns false only when getrandom fails.
- On GNU systems this should happen only early in the boot process,
- when the fallback should be good enough for programs using tempname
- because any attacker likely has root privileges already. */
-
-static bool
-random_bits (random_value *r, random_value s)
-{
- /* Without GRND_NONBLOCK it can be blocked for minutes on some systems. */
- if (__getrandom (r, sizeof *r, GRND_NONBLOCK) == sizeof *r)
- return true;
-
- /* If getrandom did not work, use ersatz entropy based on low-order
- clock bits. On GNU systems getrandom should fail only
- early in booting, when ersatz should be good enough.
- Do not use ASLR-based entropy, as that would leak ASLR info into
- the resulting file name which is typically public.
-
- Of course we are in a state of sin here. */
-
- random_value v = s;
-
-#if _LIBC || (defined CLOCK_REALTIME && HAVE_CLOCK_GETTIME)
- struct __timespec64 tv;
- __clock_gettime64 (CLOCK_REALTIME, &tv);
- v = mix_random_values (v, tv.tv_sec);
- v = mix_random_values (v, tv.tv_nsec);
-#endif
-
- *r = mix_random_values (v, clock ());
- return false;
-}
-
-#if _LIBC
-static int try_tempname_len (char *, int, void *, int (*) (char *, void *),
- size_t);
-#endif
-
-static int
-try_file (char *tmpl, void *flags)
-{
- int *openflags = flags;
- return __open (tmpl,
- (*openflags & ~O_ACCMODE)
- | O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
-}
-
-static int
-try_dir (char *tmpl, _GL_UNUSED void *flags)
-{
- return __mkdir (tmpl, S_IRUSR | S_IWUSR | S_IXUSR);
-}
-
-static int
-try_nocreate (char *tmpl, _GL_UNUSED void *flags)
-{
- struct_stat64 st;
-
- if (__lstat64_time64 (tmpl, &st) == 0 || errno == EOVERFLOW)
- __set_errno (EEXIST);
- return errno == ENOENT ? 0 : -1;
-}
-
-/* These are the characters used in temporary file names. */
-static const char letters[] =
-"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
-
-/* Generate a temporary file name based on TMPL. TMPL must match the
- rules for mk[s]temp (i.e., end in at least X_SUFFIX_LEN "X"s,
- possibly with a suffix).
- The name constructed does not exist at the time of the call to
- this function. TMPL is overwritten with the result.
-
- KIND may be one of:
- __GT_NOCREATE: simply verify that the name does not exist
- at the time of the call.
- __GT_FILE: create the file using open(O_CREAT|O_EXCL)
- and return a read-write fd. The file is mode 0600.
- __GT_DIR: create a directory, which will be mode 0700.
-
- */
-#ifdef _LIBC
-static
-#endif
-int
-gen_tempname_len (char *tmpl, int suffixlen, int flags, int kind,
- size_t x_suffix_len)
-{
- static int (*const tryfunc[]) (char *, void *) =
- {
- [__GT_FILE] = try_file,
- [__GT_DIR] = try_dir,
- [__GT_NOCREATE] = try_nocreate
- };
- return try_tempname_len (tmpl, suffixlen, &flags, tryfunc[kind],
- x_suffix_len);
-}
-
-#ifdef _LIBC
-static
-#endif
-int
-try_tempname_len (char *tmpl, int suffixlen, void *args,
- int (*tryfunc) (char *, void *), size_t x_suffix_len)
-{
- size_t len;
- char *XXXXXX;
- unsigned int count;
- int fd = -1;
- int save_errno = errno;
-
- /* A lower bound on the number of temporary files to attempt to
- generate. The maximum total number of temporary file names that
- can exist for a given template is 62**6. It should never be
- necessary to try all of these combinations. Instead if a reasonable
- number of names is tried (we define reasonable as 62**3) fail to
- give the system administrator the chance to remove the problems.
- This value requires that X_SUFFIX_LEN be at least 3. */
-#define ATTEMPTS_MIN (62 * 62 * 62)
-
- /* The number of times to attempt to generate a temporary file. To
- conform to POSIX, this must be no smaller than TMP_MAX. */
-#if ATTEMPTS_MIN < TMP_MAX
- unsigned int attempts = TMP_MAX;
-#else
- unsigned int attempts = ATTEMPTS_MIN;
-#endif
-
- /* A random variable. */
- random_value v = 0;
-
- /* A value derived from the random variable, and how many random
- base-62 digits can currently be extracted from VDIGBUF. */
- random_value vdigbuf;
- int vdigits = 0;
-
- /* Least biased value for V. If V is less than this, V can generate
- BASE_62_DIGITS unbiased digits. Otherwise the digits are biased. */
- random_value const biased_min
- = RANDOM_VALUE_MAX - RANDOM_VALUE_MAX % BASE_62_POWER;
-
- len = strlen (tmpl);
- if (len < x_suffix_len + suffixlen
- || strspn (&tmpl[len - x_suffix_len - suffixlen], "X") < x_suffix_len)
- {
- __set_errno (EINVAL);
- return -1;
- }
-
- /* This is where the Xs start. */
- XXXXXX = &tmpl[len - x_suffix_len - suffixlen];
-
- for (count = 0; count < attempts; ++count)
- {
- for (size_t i = 0; i < x_suffix_len; i++)
- {
- if (vdigits == 0)
- {
- /* Worry about bias only if the bits are high quality. */
- while (random_bits (&v, v) && biased_min <= v)
- continue;
-
- vdigbuf = v;
- vdigits = BASE_62_DIGITS;
- }
-
- XXXXXX[i] = letters[vdigbuf % 62];
- vdigbuf /= 62;
- vdigits--;
- }
-
- fd = tryfunc (tmpl, args);
- if (fd >= 0)
- {
- __set_errno (save_errno);
- return fd;
- }
- else if (errno != EEXIST)
- return -1;
- }
-
- /* We got out of the loop because we ran out of combinations to try. */
- __set_errno (EEXIST);
- return -1;
-}
-
-int
-__gen_tempname (char *tmpl, int suffixlen, int flags, int kind)
-{
- return gen_tempname_len (tmpl, suffixlen, flags, kind, 6);
-}
-
-#if !_LIBC
-int
-try_tempname (char *tmpl, int suffixlen, void *args,
- int (*tryfunc) (char *, void *))
-{
- return try_tempname_len (tmpl, suffixlen, args, tryfunc, 6);
-}
-#endif
diff --git a/cross/lib/tempname.h b/cross/lib/tempname.h
deleted file mode 100644
index 36a51381548..00000000000
--- a/cross/lib/tempname.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* Create a temporary file or directory.
-
- Copyright (C) 2006, 2009-2023 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/>. */
-
-/* header written by Eric Blake */
-
-#ifndef GL_TEMPNAME_H
-# define GL_TEMPNAME_H
-
-# include <stdio.h>
-
-# ifdef __GT_FILE
-# define GT_FILE __GT_FILE
-# define GT_DIR __GT_DIR
-# define GT_NOCREATE __GT_NOCREATE
-# else
-# define GT_FILE 0
-# define GT_DIR 1
-# define GT_NOCREATE 2
-# endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Generate a temporary file name based on TMPL. TMPL must match the
- rules for mk[s]temp (i.e. end in "XXXXXX", possibly with a suffix).
- The name constructed does not exist at the time of the call to
- gen_tempname. TMPL is overwritten with the result.
-
- KIND may be one of:
- GT_NOCREATE: simply verify that the name does not exist
- at the time of the call.
- GT_FILE: create a large file using open(O_CREAT|O_EXCL)
- and return a read-write fd. The file is mode 0600.
- GT_DIR: create a directory, which will be mode 0700.
-
- */
-extern int gen_tempname (char *tmpl, int suffixlen, int flags, int kind);
-/* Similar, except X_SUFFIX_LEN gives the number of Xs. */
-extern int gen_tempname_len (char *tmpl, int suffixlen, int flags, int kind,
- size_t x_suffix_len);
-
-/* Similar to gen_tempname, but TRYFUNC is called for each temporary
- name to try. If TRYFUNC returns a non-negative number, TRY_GEN_TEMPNAME
- returns with this value. Otherwise, if errno is set to EEXIST, another
- name is tried, or else TRY_GEN_TEMPNAME returns -1. */
-extern int try_tempname (char *tmpl, int suffixlen, void *args,
- int (*tryfunc) (char *, void *));
-/* Similar, except X_SUFFIX_LEN gives the number of Xs. */
-extern int try_tempname_len (char *tmpl, int suffixlen, void *args,
- int (*tryfunc) (char *, void *),
- size_t x_suffix_len);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* GL_TEMPNAME_H */
diff --git a/cross/lib/time-internal.h b/cross/lib/time-internal.h
deleted file mode 100644
index 51423c94ca9..00000000000
--- a/cross/lib/time-internal.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Time internal interface
-
- Copyright 2015-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert. */
-
-/* A time zone rule. */
-struct tm_zone
-{
- /* More abbreviations, should they be needed. Their TZ_IS_SET
- members are zero. */
- struct tm_zone *next;
-
-#if HAVE_TZNAME && !HAVE_STRUCT_TM_TM_ZONE
- /* Copies of recent strings taken from tzname[0] and tzname[1].
- The copies are in ABBRS, so that they survive tzset. Null if unknown. */
- char *tzname_copy[2];
-#endif
-
- /* If nonzero, the rule represents the TZ environment variable set
- to the first "abbreviation" (this may be the empty string).
- Otherwise, it represents an unset TZ. */
- char tz_is_set;
-
- /* A sequence of null-terminated strings packed next to each other.
- The strings are followed by an extra null byte. If TZ_IS_SET,
- there must be at least one string and the first string (which is
- actually a TZ environment value) may be empty. Otherwise all
- strings must be nonempty.
-
- Abbreviations are stored here because otherwise the values of
- tm_zone and/or tzname would be dead after changing TZ and calling
- tzset. Abbreviations never move once allocated, and are live
- until tzfree is called. */
- char abbrs[FLEXIBLE_ARRAY_MEMBER];
-};
diff --git a/cross/lib/time.in.h b/cross/lib/time.in.h
deleted file mode 100644
index 87cda21413b..00000000000
--- a/cross/lib/time.in.h
+++ /dev/null
@@ -1,471 +0,0 @@
-/* A more-standard <time.h>.
-
- Copyright (C) 2007-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#if __GNUC__ >= 3
-@PRAGMA_SYSTEM_HEADER@
-#endif
-@PRAGMA_COLUMNS@
-
-/* Don't get in the way of glibc when it includes time.h merely to
- declare a few standard symbols, rather than to declare all the
- symbols. (However, skip this for MinGW as it treats __need_time_t
- incompatibly.) Also, Solaris 8 <time.h> eventually includes itself
- recursively; if that is happening, just include the system <time.h>
- without adding our own declarations. */
-#if (((defined __need_time_t || defined __need_clock_t \
- || defined __need_timespec) \
- && !defined __MINGW32__) \
- || defined _@GUARD_PREFIX@_TIME_H)
-
-# @INCLUDE_NEXT@ @NEXT_TIME_H@
-
-#else
-
-# define _@GUARD_PREFIX@_TIME_H
-
-/* mingw's <time.h> provides the functions asctime_r, ctime_r, gmtime_r,
- localtime_r only if <unistd.h> or <pthread.h> has been included before. */
-# if defined __MINGW32__
-# include <unistd.h>
-# endif
-
-# @INCLUDE_NEXT@ @NEXT_TIME_H@
-
-/* NetBSD 5.0 mis-defines NULL. */
-# include <stddef.h>
-
-/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
-
-/* The definition of _GL_ARG_NONNULL is copied here. */
-
-/* The definition of _GL_WARN_ON_USE is copied here. */
-
-/* Some systems don't define struct timespec (e.g., AIX 4.1).
- Or they define it with the wrong member names or define it in <sys/time.h>
- (e.g., FreeBSD circa 1997). Stock Mingw prior to 3.0 does not define it,
- but the pthreads-win32 library defines it in <pthread.h>. */
-# if ! @TIME_H_DEFINES_STRUCT_TIMESPEC@
-# if @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@
-# include <sys/time.h>
-# elif @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@
-# include <pthread.h>
-# elif @UNISTD_H_DEFINES_STRUCT_TIMESPEC@
-# include <unistd.h>
-# else
-
-# ifdef __cplusplus
-extern "C" {
-# endif
-
-# if !GNULIB_defined_struct_timespec
-# undef timespec
-# define timespec rpl_timespec
-struct timespec
-{
- time_t tv_sec;
- long int tv_nsec;
-};
-# define GNULIB_defined_struct_timespec 1
-# endif
-
-# ifdef __cplusplus
-}
-# endif
-
-# endif
-# endif
-
-# if !GNULIB_defined_struct_time_t_must_be_integral
-/* https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_types.h.html
- requires time_t to be an integer type, even though C99 permits floating
- point. We don't know of any implementation that uses floating
- point, and it is much easier to write code that doesn't have to
- worry about that corner case, so we force the issue. */
-struct __time_t_must_be_integral {
- unsigned int __floating_time_t_unsupported : (time_t) 1;
-};
-# define GNULIB_defined_struct_time_t_must_be_integral 1
-# endif
-
-/* Define TIME_UTC, a positive integer constant used for timespec_get(). */
-# if ! @TIME_H_DEFINES_TIME_UTC@
-# if !GNULIB_defined_TIME_UTC
-# define TIME_UTC 1
-# define GNULIB_defined_TIME_UTC 1
-# endif
-# endif
-
-/* Set *TS to the current time, and return BASE.
- Upon failure, return 0. */
-# if @GNULIB_TIMESPEC_GET@
-# if @REPLACE_TIMESPEC_GET@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef timespec_get
-# define timespec_get rpl_timespec_get
-# endif
-_GL_FUNCDECL_RPL (timespec_get, int, (struct timespec *ts, int base)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (timespec_get, int, (struct timespec *ts, int base));
-# else
-# if !@HAVE_TIMESPEC_GET@
-_GL_FUNCDECL_SYS (timespec_get, int, (struct timespec *ts, int base)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (timespec_get, int, (struct timespec *ts, int base));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (timespec_get);
-# endif
-# endif
-
-/* Set *TS to the current time resolution, and return BASE.
- Upon failure, return 0. */
-# if @GNULIB_TIMESPEC_GETRES@
-# if ! @HAVE_TIMESPEC_GETRES@
-_GL_FUNCDECL_SYS (timespec_getres, int, (struct timespec *ts, int base)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (timespec_getres, int, (struct timespec *ts, int base));
-_GL_CXXALIASWARN (timespec_getres);
-# endif
-
-/* Sleep for at least RQTP seconds unless interrupted, If interrupted,
- return -1 and store the remaining time into RMTP. See
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/nanosleep.html>. */
-# if @GNULIB_NANOSLEEP@
-# if @REPLACE_NANOSLEEP@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define nanosleep rpl_nanosleep
-# endif
-_GL_FUNCDECL_RPL (nanosleep, int,
- (struct timespec const *__rqtp, struct timespec *__rmtp)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (nanosleep, int,
- (struct timespec const *__rqtp, struct timespec *__rmtp));
-# else
-# if ! @HAVE_NANOSLEEP@
-_GL_FUNCDECL_SYS (nanosleep, int,
- (struct timespec const *__rqtp, struct timespec *__rmtp)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (nanosleep, int,
- (struct timespec const *__rqtp, struct timespec *__rmtp));
-# endif
-_GL_CXXALIASWARN (nanosleep);
-# endif
-
-/* Initialize time conversion information. */
-# if @GNULIB_TZSET@
-# if @REPLACE_TZSET@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef tzset
-# define tzset rpl_tzset
-# endif
-_GL_FUNCDECL_RPL (tzset, void, (void));
-_GL_CXXALIAS_RPL (tzset, void, (void));
-# elif defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef tzset
-# define tzset _tzset
-# endif
-_GL_CXXALIAS_MDA (tzset, void, (void));
-# else
-_GL_CXXALIAS_SYS (tzset, void, (void));
-# endif
-_GL_CXXALIASWARN (tzset);
-# elif @GNULIB_MDA_TZSET@
-/* On native Windows, map 'tzset' to '_tzset', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::tzset always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef tzset
-# define tzset _tzset
-# endif
-_GL_CXXALIAS_MDA (tzset, void, (void));
-# else
-_GL_CXXALIAS_SYS (tzset, void, (void));
-# endif
-_GL_CXXALIASWARN (tzset);
-# endif
-
-/* Return the 'time_t' representation of TP and normalize TP. */
-# if @GNULIB_MKTIME@
-# if @REPLACE_MKTIME@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define mktime rpl_mktime
-# endif
-_GL_FUNCDECL_RPL (mktime, time_t, (struct tm *__tp) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (mktime, time_t, (struct tm *__tp));
-# else
-_GL_CXXALIAS_SYS (mktime, time_t, (struct tm *__tp));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (mktime);
-# endif
-# endif
-
-/* Convert TIMER to RESULT, assuming local time and UTC respectively. See
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/localtime_r.html> and
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/gmtime_r.html>. */
-# if @GNULIB_TIME_R@
-# if @REPLACE_LOCALTIME_R@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef localtime_r
-# define localtime_r rpl_localtime_r
-# endif
-_GL_FUNCDECL_RPL (localtime_r, struct tm *, (time_t const *restrict __timer,
- struct tm *restrict __result)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (localtime_r, struct tm *, (time_t const *restrict __timer,
- struct tm *restrict __result));
-# else
-# if ! @HAVE_DECL_LOCALTIME_R@
-_GL_FUNCDECL_SYS (localtime_r, struct tm *, (time_t const *restrict __timer,
- struct tm *restrict __result)
- _GL_ARG_NONNULL ((1, 2)));
-# endif
-_GL_CXXALIAS_SYS (localtime_r, struct tm *, (time_t const *restrict __timer,
- struct tm *restrict __result));
-# endif
-# if @HAVE_DECL_LOCALTIME_R@
-_GL_CXXALIASWARN (localtime_r);
-# endif
-# if @REPLACE_LOCALTIME_R@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef gmtime_r
-# define gmtime_r rpl_gmtime_r
-# endif
-_GL_FUNCDECL_RPL (gmtime_r, struct tm *, (time_t const *restrict __timer,
- struct tm *restrict __result)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (gmtime_r, struct tm *, (time_t const *restrict __timer,
- struct tm *restrict __result));
-# else
-# if ! @HAVE_DECL_LOCALTIME_R@
-_GL_FUNCDECL_SYS (gmtime_r, struct tm *, (time_t const *restrict __timer,
- struct tm *restrict __result)
- _GL_ARG_NONNULL ((1, 2)));
-# endif
-_GL_CXXALIAS_SYS (gmtime_r, struct tm *, (time_t const *restrict __timer,
- struct tm *restrict __result));
-# endif
-# if @HAVE_DECL_LOCALTIME_R@
-_GL_CXXALIASWARN (gmtime_r);
-# endif
-# endif
-
-/* Convert TIMER to RESULT, assuming local time and UTC respectively. See
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/localtime.html> and
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/gmtime.html>. */
-# if @GNULIB_LOCALTIME@ || @REPLACE_LOCALTIME@
-# if @REPLACE_LOCALTIME@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef localtime
-# define localtime rpl_localtime
-# endif
-_GL_FUNCDECL_RPL (localtime, struct tm *, (time_t const *__timer)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (localtime, struct tm *, (time_t const *__timer));
-# else
-_GL_CXXALIAS_SYS (localtime, struct tm *, (time_t const *__timer));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (localtime);
-# endif
-# endif
-
-# if 0 || @REPLACE_GMTIME@
-# if @REPLACE_GMTIME@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef gmtime
-# define gmtime rpl_gmtime
-# endif
-_GL_FUNCDECL_RPL (gmtime, struct tm *, (time_t const *__timer)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (gmtime, struct tm *, (time_t const *__timer));
-# else
-_GL_CXXALIAS_SYS (gmtime, struct tm *, (time_t const *__timer));
-# endif
-_GL_CXXALIASWARN (gmtime);
-# endif
-
-/* Parse BUF as a timestamp, assuming FORMAT specifies its layout, and store
- the resulting broken-down time into TM. See
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/strptime.html>. */
-# if @GNULIB_STRPTIME@
-# if ! @HAVE_STRPTIME@
-_GL_FUNCDECL_SYS (strptime, char *, (char const *restrict __buf,
- char const *restrict __format,
- struct tm *restrict __tm)
- _GL_ARG_NONNULL ((1, 2, 3)));
-# endif
-_GL_CXXALIAS_SYS (strptime, char *, (char const *restrict __buf,
- char const *restrict __format,
- struct tm *restrict __tm));
-_GL_CXXALIASWARN (strptime);
-# endif
-
-/* Convert *TP to a date and time string. See
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/ctime.html>. */
-# if @GNULIB_CTIME@
-# if @REPLACE_CTIME@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define ctime rpl_ctime
-# endif
-_GL_ATTRIBUTE_DEPRECATED
-_GL_FUNCDECL_RPL (ctime, char *, (time_t const *__tp)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (ctime, char *, (time_t const *__tp));
-# else
-_GL_CXXALIAS_SYS (ctime, char *, (time_t const *__tp));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (ctime);
-# endif
-# endif
-
-/* Convert *TP to a date and time string. See
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/strftime.html>. */
-# if @GNULIB_STRFTIME@
-# if @REPLACE_STRFTIME@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define strftime rpl_strftime
-# endif
-_GL_FUNCDECL_RPL (strftime, size_t,
- (char *restrict __buf, size_t __bufsize,
- const char *restrict __fmt, const struct tm *restrict __tp)
- _GL_ARG_NONNULL ((1, 3, 4)));
-_GL_CXXALIAS_RPL (strftime, size_t,
- (char *restrict __buf, size_t __bufsize,
- const char *restrict __fmt, const struct tm *restrict __tp));
-# else
-_GL_CXXALIAS_SYS (strftime, size_t,
- (char *restrict __buf, size_t __bufsize,
- const char *restrict __fmt, const struct tm *restrict __tp));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (strftime);
-# endif
-# endif
-
-# if defined _GNU_SOURCE && @GNULIB_TIME_RZ@ && ! @HAVE_TIMEZONE_T@
-/* Functions that use a first-class time zone data type, instead of
- relying on an implicit global time zone.
- Inspired by NetBSD. */
-
-/* Represents a time zone.
- (timezone_t) NULL stands for UTC. */
-typedef struct tm_zone *timezone_t;
-
-/* tzalloc (name)
- Returns a time zone object for the given time zone NAME. This object
- represents the time zone that other functions would use it the TZ
- environment variable was set to NAME.
- If NAME is NULL, the result represents the time zone that other functions
- would use it the TZ environment variable was unset.
- May return NULL if NAME is invalid (this is platform dependent) or
- upon memory allocation failure. */
-_GL_FUNCDECL_SYS (tzalloc, timezone_t, (char const *__name));
-_GL_CXXALIAS_SYS (tzalloc, timezone_t, (char const *__name));
-
-/* tzfree (tz)
- Frees a time zone object.
- The argument must have been returned by tzalloc(). */
-_GL_FUNCDECL_SYS (tzfree, void, (timezone_t __tz));
-_GL_CXXALIAS_SYS (tzfree, void, (timezone_t __tz));
-
-/* localtime_rz (tz, &t, &result)
- Converts an absolute time T to a broken-down time RESULT, assuming the
- time zone TZ.
- This function is like 'localtime_r', but relies on the argument TZ instead
- of an implicit global time zone. */
-_GL_FUNCDECL_SYS (localtime_rz, struct tm *,
- (timezone_t __tz, time_t const *restrict __timer,
- struct tm *restrict __result) _GL_ARG_NONNULL ((2, 3)));
-_GL_CXXALIAS_SYS (localtime_rz, struct tm *,
- (timezone_t __tz, time_t const *restrict __timer,
- struct tm *restrict __result));
-
-/* mktime_z (tz, &tm)
- Normalizes the broken-down time TM and converts it to an absolute time,
- assuming the time zone TZ. Returns the absolute time.
- This function is like 'mktime', but relies on the argument TZ instead
- of an implicit global time zone. */
-_GL_FUNCDECL_SYS (mktime_z, time_t,
- (timezone_t __tz, struct tm *restrict __tm)
- _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_SYS (mktime_z, time_t,
- (timezone_t __tz, struct tm *restrict __tm));
-
-/* Time zone abbreviation strings (returned by 'localtime_rz' or 'mktime_z'
- in the 'tm_zone' member of 'struct tm') are valid as long as
- - the 'struct tm' argument is not destroyed or overwritten,
- and
- - the 'timezone_t' argument is not freed through tzfree(). */
-
-# endif
-
-/* Convert TM to a time_t value, assuming UTC. */
-# if @GNULIB_TIMEGM@
-# if @REPLACE_TIMEGM@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef timegm
-# define timegm rpl_timegm
-# endif
-_GL_FUNCDECL_RPL (timegm, time_t, (struct tm *__tm) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (timegm, time_t, (struct tm *__tm));
-# else
-# if ! @HAVE_TIMEGM@
-_GL_FUNCDECL_SYS (timegm, time_t, (struct tm *__tm) _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (timegm, time_t, (struct tm *__tm));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (timegm);
-# endif
-# endif
-
-/* Encourage applications to avoid unsafe functions that can overrun
- buffers when given outlandish struct tm values. Portable
- applications should use strftime (or even sprintf) instead. */
-# if defined GNULIB_POSIXCHECK
-# undef asctime
-_GL_WARN_ON_USE (asctime, "asctime can overrun buffers in some cases - "
- "better use strftime (or even sprintf) instead");
-# endif
-# if defined GNULIB_POSIXCHECK
-# undef asctime_r
-# if HAVE_RAW_DECL_ASCTIME_R
-_GL_WARN_ON_USE (asctime_r, "asctime_r can overrun buffers in some cases - "
- "better use strftime (or even sprintf) instead");
-# endif
-# endif
-# if defined GNULIB_POSIXCHECK
-# undef ctime
-_GL_WARN_ON_USE (ctime, "ctime can overrun buffers in some cases - "
- "better use strftime (or even sprintf) instead");
-# endif
-# if defined GNULIB_POSIXCHECK
-# undef ctime_r
-# if HAVE_RAW_DECL_CTIME_R
-_GL_WARN_ON_USE (ctime_r, "ctime_r can overrun buffers in some cases - "
- "better use strftime (or even sprintf) instead");
-# endif
-# endif
-
-#endif
diff --git a/cross/lib/time_r.c b/cross/lib/time_r.c
deleted file mode 100644
index 97be4fd0544..00000000000
--- a/cross/lib/time_r.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Reentrant time functions like localtime_r.
-
- Copyright (C) 2003, 2006-2007, 2010-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert. */
-
-#include <config.h>
-
-#include <time.h>
-
-static struct tm *
-copy_tm_result (struct tm *dest, struct tm const *src)
-{
- if (! src)
- return 0;
- *dest = *src;
- return dest;
-}
-
-
-struct tm *
-gmtime_r (time_t const * restrict t, struct tm * restrict tp)
-{
- return copy_tm_result (tp, gmtime (t));
-}
-
-struct tm *
-localtime_r (time_t const * restrict t, struct tm * restrict tp)
-{
- return copy_tm_result (tp, localtime (t));
-}
diff --git a/cross/lib/time_rz.c b/cross/lib/time_rz.c
deleted file mode 100644
index da0d57b8b1a..00000000000
--- a/cross/lib/time_rz.c
+++ /dev/null
@@ -1,316 +0,0 @@
-/* Time zone functions such as tzalloc and localtime_rz
-
- Copyright 2015-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert. */
-
-/* Although this module is not thread-safe, any races should be fairly
- rare and reasonably benign. For complete thread-safety, use a C
- library with a working timezone_t type, so that this module is not
- needed. */
-
-#include <config.h>
-
-#include <time.h>
-
-#include <errno.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "flexmember.h"
-#include "idx.h"
-#include "time-internal.h"
-
-/* The approximate size to use for small allocation requests. This is
- the largest "small" request for the GNU C library malloc. */
-enum { DEFAULT_MXFAST = 64 * sizeof (size_t) / 4 };
-
-/* Minimum size of the ABBRS member of struct tm_zone. ABBRS is larger
- only in the unlikely case where an abbreviation longer than this is
- used. */
-enum { ABBR_SIZE_MIN = DEFAULT_MXFAST - offsetof (struct tm_zone, abbrs) };
-
-/* Magic cookie timezone_t value, for local time. It differs from
- NULL and from all other timezone_t values. Only the address
- matters; the pointer is never dereferenced. */
-static timezone_t const local_tz = (timezone_t) 1;
-
-/* Copy to ABBRS the abbreviation at ABBR with size ABBR_SIZE (this
- includes its trailing null byte). Append an extra null byte to
- mark the end of ABBRS. */
-static void
-extend_abbrs (char *abbrs, char const *abbr, size_t abbr_size)
-{
- memcpy (abbrs, abbr, abbr_size);
- abbrs[abbr_size] = '\0';
-}
-
-/* Return a newly allocated time zone for NAME, or NULL on failure.
- A null NAME stands for wall clock time (which is like unset TZ). */
-timezone_t
-tzalloc (char const *name)
-{
- size_t name_size = name ? strlen (name) + 1 : 0;
- size_t abbr_size = name_size < ABBR_SIZE_MIN ? ABBR_SIZE_MIN : name_size + 1;
- timezone_t tz = malloc (FLEXSIZEOF (struct tm_zone, abbrs, abbr_size));
- if (tz)
- {
- tz->next = NULL;
-#if HAVE_TZNAME && !HAVE_STRUCT_TM_TM_ZONE
- tz->tzname_copy[0] = tz->tzname_copy[1] = NULL;
-#endif
- tz->tz_is_set = !!name;
- tz->abbrs[0] = '\0';
- if (name)
- extend_abbrs (tz->abbrs, name, name_size);
- }
- return tz;
-}
-
-/* Save into TZ any nontrivial time zone abbreviation used by TM, and
- update *TM (if HAVE_STRUCT_TM_TM_ZONE) or *TZ (if
- !HAVE_STRUCT_TM_TM_ZONE && HAVE_TZNAME) if they use the abbreviation.
- Return true if successful, false (setting errno) otherwise. */
-static bool
-save_abbr (timezone_t tz, struct tm *tm)
-{
-#if HAVE_STRUCT_TM_TM_ZONE || HAVE_TZNAME
- char const *zone = NULL;
- char *zone_copy = (char *) "";
-
-# if HAVE_TZNAME
- int tzname_index = -1;
-# endif
-
-# if HAVE_STRUCT_TM_TM_ZONE
- zone = tm->tm_zone;
-# endif
-
-# if HAVE_TZNAME
- if (! (zone && *zone) && 0 <= tm->tm_isdst)
- {
- tzname_index = tm->tm_isdst != 0;
- zone = tzname[tzname_index];
- }
-# endif
-
- /* No need to replace null zones, or zones within the struct tm. */
- if (!zone || ((char *) tm <= zone && zone < (char *) (tm + 1)))
- return true;
-
- if (*zone)
- {
- zone_copy = tz->abbrs;
-
- while (strcmp (zone_copy, zone) != 0)
- {
- if (! (*zone_copy || (zone_copy == tz->abbrs && tz->tz_is_set)))
- {
- idx_t zone_size = strlen (zone) + 1;
- if (zone_size < tz->abbrs + ABBR_SIZE_MIN - zone_copy)
- extend_abbrs (zone_copy, zone, zone_size);
- else
- {
- tz = tz->next = tzalloc (zone);
- if (!tz)
- return false;
- tz->tz_is_set = 0;
- zone_copy = tz->abbrs;
- }
- break;
- }
-
- zone_copy += strlen (zone_copy) + 1;
- if (!*zone_copy && tz->next)
- {
- tz = tz->next;
- zone_copy = tz->abbrs;
- }
- }
- }
-
- /* Replace the zone name so that its lifetime matches that of TZ. */
-# if HAVE_STRUCT_TM_TM_ZONE
- tm->tm_zone = zone_copy;
-# else
- if (0 <= tzname_index)
- tz->tzname_copy[tzname_index] = zone_copy;
-# endif
-#endif
-
- return true;
-}
-
-/* Free a time zone. */
-void
-tzfree (timezone_t tz)
-{
- if (tz != local_tz)
- while (tz)
- {
- timezone_t next = tz->next;
- free (tz);
- tz = next;
- }
-}
-
-/* Get and set the TZ environment variable. These functions can be
- overridden by programs like Emacs that manage their own environment. */
-
-#ifndef getenv_TZ
-static char *
-getenv_TZ (void)
-{
- return getenv ("TZ");
-}
-#endif
-
-#ifndef setenv_TZ
-static int
-setenv_TZ (char const *tz)
-{
- return tz ? setenv ("TZ", tz, 1) : unsetenv ("TZ");
-}
-#endif
-
-/* Change the environment to match the specified timezone_t value.
- Return true if successful, false (setting errno) otherwise. */
-static bool
-change_env (timezone_t tz)
-{
- if (setenv_TZ (tz->tz_is_set ? tz->abbrs : NULL) != 0)
- return false;
- tzset ();
- return true;
-}
-
-/* Temporarily set the time zone to TZ, which must not be null.
- Return LOCAL_TZ if the time zone setting is already correct.
- Otherwise return a newly allocated time zone representing the old
- setting, or NULL (setting errno) on failure. */
-static timezone_t
-set_tz (timezone_t tz)
-{
- char *env_tz = getenv_TZ ();
- if (env_tz
- ? tz->tz_is_set && strcmp (tz->abbrs, env_tz) == 0
- : !tz->tz_is_set)
- return local_tz;
- else
- {
- timezone_t old_tz = tzalloc (env_tz);
- if (!old_tz)
- return old_tz;
- if (! change_env (tz))
- {
- int saved_errno = errno;
- tzfree (old_tz);
- errno = saved_errno;
- return NULL;
- }
- return old_tz;
- }
-}
-
-/* Restore an old setting returned by set_tz. It must not be null.
- Return true (preserving errno) if successful, false (setting errno)
- otherwise. */
-static bool
-revert_tz (timezone_t tz)
-{
- if (tz == local_tz)
- return true;
- else
- {
- int saved_errno = errno;
- bool ok = change_env (tz);
- if (!ok)
- saved_errno = errno;
- tzfree (tz);
- errno = saved_errno;
- return ok;
- }
-}
-
-/* Use time zone TZ to compute localtime_r (T, TM). */
-struct tm *
-localtime_rz (timezone_t tz, time_t const *t, struct tm *tm)
-{
-#ifdef HAVE_LOCALTIME_INFLOOP_BUG
- /* The -67768038400665599 comes from:
- https://lists.gnu.org/r/bug-gnulib/2017-07/msg00142.html
- On affected platforms the greatest POSIX-compatible time_t value
- that could return nonnull is 67768036191766798 (when
- TZ="XXX24:59:59" it resolves to the year 2**31 - 1 + 1900, on
- 12-31 at 23:59:59), so test for that too while we're in the
- neighborhood. */
- if (! (-67768038400665599 <= *t && *t <= 67768036191766798))
- {
- errno = EOVERFLOW;
- return NULL;
- }
-#endif
-
- if (!tz)
- return gmtime_r (t, tm);
- else
- {
- timezone_t old_tz = set_tz (tz);
- if (old_tz)
- {
- bool abbr_saved = localtime_r (t, tm) && save_abbr (tz, tm);
- if (revert_tz (old_tz) && abbr_saved)
- return tm;
- }
- return NULL;
- }
-}
-
-/* Use time zone TZ to compute mktime (TM). */
-time_t
-mktime_z (timezone_t tz, struct tm *tm)
-{
- if (!tz)
- return timegm (tm);
- else
- {
- timezone_t old_tz = set_tz (tz);
- if (old_tz)
- {
- struct tm tm_1;
- tm_1.tm_sec = tm->tm_sec;
- tm_1.tm_min = tm->tm_min;
- tm_1.tm_hour = tm->tm_hour;
- tm_1.tm_mday = tm->tm_mday;
- tm_1.tm_mon = tm->tm_mon;
- tm_1.tm_year = tm->tm_year;
- tm_1.tm_yday = -1;
- tm_1.tm_isdst = tm->tm_isdst;
- time_t t = mktime (&tm_1);
- bool ok = 0 <= tm_1.tm_yday;
-#if HAVE_STRUCT_TM_TM_ZONE || HAVE_TZNAME
- ok = ok && save_abbr (tz, &tm_1);
-#endif
- if (revert_tz (old_tz) && ok)
- {
- *tm = tm_1;
- return t;
- }
- }
- return -1;
- }
-}
diff --git a/cross/lib/timegm.c b/cross/lib/timegm.c
deleted file mode 100644
index b47025a0545..00000000000
--- a/cross/lib/timegm.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Convert UTC calendar time to simple time. Like mktime but assumes UTC.
-
- Copyright (C) 1994-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifndef _LIBC
-# include <libc-config.h>
-#endif
-
-#include <time.h>
-#include <errno.h>
-
-#include "mktime-internal.h"
-
-__time64_t
-__timegm64 (struct tm *tmp)
-{
- static mktime_offset_t gmtime_offset;
- tmp->tm_isdst = 0;
- return __mktime_internal (tmp, __gmtime64_r, &gmtime_offset);
-}
-
-#if defined _LIBC && __TIMESIZE != 64
-
-libc_hidden_def (__timegm64)
-
-time_t
-timegm (struct tm *tmp)
-{
- struct tm tm = *tmp;
- __time64_t t = __timegm64 (&tm);
- if (in_time_t_range (t))
- {
- *tmp = tm;
- return t;
- }
- else
- {
- __set_errno (EOVERFLOW);
- return -1;
- }
-}
-
-#endif
diff --git a/cross/lib/timespec-add.c b/cross/lib/timespec-add.c
deleted file mode 100644
index cb3017803b4..00000000000
--- a/cross/lib/timespec-add.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/* Add two struct timespec values.
-
- Copyright (C) 2011-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert. */
-
-/* Return the sum of two timespec values A and B. On overflow, return
- an extremal value. This assumes 0 <= tv_nsec < TIMESPEC_HZ. */
-
-#include <config.h>
-#include "timespec.h"
-
-#include "intprops.h"
-
-struct timespec
-timespec_add (struct timespec a, struct timespec b)
-{
- time_t rs = a.tv_sec;
- time_t bs = b.tv_sec;
- int ns = a.tv_nsec + b.tv_nsec;
- int nsd = ns - TIMESPEC_HZ;
- int rns = ns;
-
- if (0 <= nsd)
- {
- rns = nsd;
- time_t bs1;
- if (!INT_ADD_WRAPV (bs, 1, &bs1))
- bs = bs1;
- else if (rs < 0)
- rs++;
- else
- goto high_overflow;
- }
-
- if (INT_ADD_WRAPV (rs, bs, &rs))
- {
- if (bs < 0)
- {
- rs = TYPE_MINIMUM (time_t);
- rns = 0;
- }
- else
- {
- high_overflow:
- rs = TYPE_MAXIMUM (time_t);
- rns = TIMESPEC_HZ - 1;
- }
- }
-
- return make_timespec (rs, rns);
-}
diff --git a/cross/lib/timespec-sub.c b/cross/lib/timespec-sub.c
deleted file mode 100644
index 822c2831089..00000000000
--- a/cross/lib/timespec-sub.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/* Subtract two struct timespec values.
-
- Copyright (C) 2011-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert. */
-
-/* Return the difference between two timespec values A and B. On
- overflow, return an extremal value. This assumes 0 <= tv_nsec <
- TIMESPEC_HZ. */
-
-#include <config.h>
-#include "timespec.h"
-
-#include "intprops.h"
-
-struct timespec
-timespec_sub (struct timespec a, struct timespec b)
-{
- time_t rs = a.tv_sec;
- time_t bs = b.tv_sec;
- int ns = a.tv_nsec - b.tv_nsec;
- int rns = ns;
-
- if (ns < 0)
- {
- rns = ns + TIMESPEC_HZ;
- time_t bs1;
- if (!INT_ADD_WRAPV (bs, 1, &bs1))
- bs = bs1;
- else if (- TYPE_SIGNED (time_t) < rs)
- rs--;
- else
- goto low_overflow;
- }
-
- if (INT_SUBTRACT_WRAPV (rs, bs, &rs))
- {
- if (0 < bs)
- {
- low_overflow:
- rs = TYPE_MINIMUM (time_t);
- rns = 0;
- }
- else
- {
- rs = TYPE_MAXIMUM (time_t);
- rns = TIMESPEC_HZ - 1;
- }
- }
-
- return make_timespec (rs, rns);
-}
diff --git a/cross/lib/timespec.c b/cross/lib/timespec.c
deleted file mode 100644
index 5f7ffbdd45f..00000000000
--- a/cross/lib/timespec.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Inline functions for <timespec.h>.
-
- Copyright (C) 2012-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-#define _GL_TIMESPEC_INLINE _GL_EXTERN_INLINE
-#include "timespec.h"
diff --git a/cross/lib/timespec.h b/cross/lib/timespec.h
deleted file mode 100644
index ba78647f09a..00000000000
--- a/cross/lib/timespec.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/* timespec -- System time interface
-
- Copyright (C) 2000, 2002, 2004-2005, 2007, 2009-2023 Free Software
- Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#if ! defined TIMESPEC_H
-#define TIMESPEC_H
-
-#include <time.h>
-
-#ifndef _GL_INLINE_HEADER_BEGIN
- #error "Please include config.h first."
-#endif
-_GL_INLINE_HEADER_BEGIN
-#ifndef _GL_TIMESPEC_INLINE
-# define _GL_TIMESPEC_INLINE _GL_INLINE
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "arg-nonnull.h"
-
-/* Inverse resolution of timespec timestamps (in units per second),
- and log base 10 of the inverse resolution. */
-
-enum { TIMESPEC_HZ = 1000000000 };
-enum { LOG10_TIMESPEC_HZ = 9 };
-
-/* Obsolescent names for backward compatibility.
- They are misnomers, because TIMESPEC_RESOLUTION is not a resolution. */
-
-enum { TIMESPEC_RESOLUTION = TIMESPEC_HZ };
-enum { LOG10_TIMESPEC_RESOLUTION = LOG10_TIMESPEC_HZ };
-
-/* Return a timespec with seconds S and nanoseconds NS. */
-
-_GL_TIMESPEC_INLINE struct timespec
-make_timespec (time_t s, long int ns)
-{
- struct timespec r;
- r.tv_sec = s;
- r.tv_nsec = ns;
- return r;
-}
-
-/* Return negative, zero, positive if A < B, A == B, A > B, respectively. */
-
-_GL_TIMESPEC_INLINE int _GL_ATTRIBUTE_PURE
-timespec_cmp (struct timespec a, struct timespec b)
-{
- return 2 * _GL_CMP (a.tv_sec, b.tv_sec) + _GL_CMP (a.tv_nsec, b.tv_nsec);
-}
-
-/* Return -1, 0, 1, depending on the sign of A. A.tv_nsec must be
- nonnegative. */
-_GL_TIMESPEC_INLINE int _GL_ATTRIBUTE_PURE
-timespec_sign (struct timespec a)
-{
- return _GL_CMP (a.tv_sec, 0) + (!a.tv_sec & !!a.tv_nsec);
-}
-
-struct timespec timespec_add (struct timespec, struct timespec)
- _GL_ATTRIBUTE_CONST;
-struct timespec timespec_sub (struct timespec, struct timespec)
- _GL_ATTRIBUTE_CONST;
-struct timespec dtotimespec (double)
- _GL_ATTRIBUTE_CONST;
-
-/* Return an approximation to A, of type 'double'. */
-_GL_TIMESPEC_INLINE double
-timespectod (struct timespec a)
-{
- return a.tv_sec + a.tv_nsec / 1e9;
-}
-
-long int gettime_res (void);
-struct timespec current_timespec (void);
-void gettime (struct timespec *) _GL_ARG_NONNULL ((1));
-int settime (struct timespec const *) _GL_ARG_NONNULL ((1));
-
-#ifdef __cplusplus
-}
-#endif
-
-_GL_INLINE_HEADER_END
-
-#endif
diff --git a/cross/lib/u64.c b/cross/lib/u64.c
deleted file mode 100644
index ca088b45463..00000000000
--- a/cross/lib/u64.c
+++ /dev/null
@@ -1,22 +0,0 @@
-/* uint64_t-like operations that work even on hosts lacking uint64_t
-
- Copyright (C) 2012-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-#define _GL_U64_INLINE _GL_EXTERN_INLINE
-#include "u64.h"
-typedef int dummy;
diff --git a/cross/lib/u64.h b/cross/lib/u64.h
deleted file mode 100644
index 0353ad4d9af..00000000000
--- a/cross/lib/u64.h
+++ /dev/null
@@ -1,179 +0,0 @@
-/* uint64_t-like operations that work even on hosts lacking uint64_t
-
- Copyright (C) 2006, 2009-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert. */
-
-#include <stdint.h>
-
-#ifndef _GL_INLINE_HEADER_BEGIN
- #error "Please include config.h first."
-#endif
-_GL_INLINE_HEADER_BEGIN
-#ifndef _GL_U64_INLINE
-# define _GL_U64_INLINE _GL_INLINE
-#endif
-
-/* Return X rotated left by N bits, where 0 < N < 64. */
-#define u64rol(x, n) u64or (u64shl (x, n), u64shr (x, 64 - n))
-
-#ifdef UINT64_MAX
-
-/* Native implementations are trivial. See below for comments on what
- these operations do. */
-typedef uint64_t u64;
-# define u64hilo(hi, lo) ((u64) (((u64) (hi) << 32) + (lo)))
-# define u64init(hi, lo) u64hilo (hi, lo)
-# define u64lo(x) ((u64) (x))
-# define u64size(x) u64lo (x)
-# define u64lt(x, y) ((x) < (y))
-# define u64and(x, y) ((x) & (y))
-# define u64or(x, y) ((x) | (y))
-# define u64xor(x, y) ((x) ^ (y))
-# define u64plus(x, y) ((x) + (y))
-# define u64shl(x, n) ((x) << (n))
-# define u64shr(x, n) ((x) >> (n))
-
-#else
-
-/* u64 is a 64-bit unsigned integer value.
- u64init (HI, LO), is like u64hilo (HI, LO), but for use in
- initializer contexts. */
-# ifdef WORDS_BIGENDIAN
-typedef struct { uint32_t hi, lo; } u64;
-# define u64init(hi, lo) { hi, lo }
-# else
-typedef struct { uint32_t lo, hi; } u64;
-# define u64init(hi, lo) { lo, hi }
-# endif
-
-/* Given the high and low-order 32-bit quantities HI and LO, return a u64
- value representing (HI << 32) + LO. */
-_GL_U64_INLINE u64
-u64hilo (uint32_t hi, uint32_t lo)
-{
- u64 r;
- r.hi = hi;
- r.lo = lo;
- return r;
-}
-
-/* Return a u64 value representing LO. */
-_GL_U64_INLINE u64
-u64lo (uint32_t lo)
-{
- u64 r;
- r.hi = 0;
- r.lo = lo;
- return r;
-}
-
-/* Return a u64 value representing SIZE. */
-_GL_U64_INLINE u64
-u64size (size_t size)
-{
- u64 r;
- r.hi = size >> 31 >> 1;
- r.lo = size;
- return r;
-}
-
-/* Return X < Y. */
-_GL_U64_INLINE int
-u64lt (u64 x, u64 y)
-{
- return x.hi < y.hi || (x.hi == y.hi && x.lo < y.lo);
-}
-
-/* Return X & Y. */
-_GL_U64_INLINE u64
-u64and (u64 x, u64 y)
-{
- u64 r;
- r.hi = x.hi & y.hi;
- r.lo = x.lo & y.lo;
- return r;
-}
-
-/* Return X | Y. */
-_GL_U64_INLINE u64
-u64or (u64 x, u64 y)
-{
- u64 r;
- r.hi = x.hi | y.hi;
- r.lo = x.lo | y.lo;
- return r;
-}
-
-/* Return X ^ Y. */
-_GL_U64_INLINE u64
-u64xor (u64 x, u64 y)
-{
- u64 r;
- r.hi = x.hi ^ y.hi;
- r.lo = x.lo ^ y.lo;
- return r;
-}
-
-/* Return X + Y. */
-_GL_U64_INLINE u64
-u64plus (u64 x, u64 y)
-{
- u64 r;
- r.lo = x.lo + y.lo;
- r.hi = x.hi + y.hi + (r.lo < x.lo);
- return r;
-}
-
-/* Return X << N. */
-_GL_U64_INLINE u64
-u64shl (u64 x, int n)
-{
- u64 r;
- if (n < 32)
- {
- r.hi = (x.hi << n) | (x.lo >> (32 - n));
- r.lo = x.lo << n;
- }
- else
- {
- r.hi = x.lo << (n - 32);
- r.lo = 0;
- }
- return r;
-}
-
-/* Return X >> N. */
-_GL_U64_INLINE u64
-u64shr (u64 x, int n)
-{
- u64 r;
- if (n < 32)
- {
- r.hi = x.hi >> n;
- r.lo = (x.hi << (32 - n)) | (x.lo >> n);
- }
- else
- {
- r.hi = 0;
- r.lo = x.hi >> (n - 32);
- }
- return r;
-}
-
-#endif
-
-_GL_INLINE_HEADER_END
diff --git a/cross/lib/unistd.c b/cross/lib/unistd.c
deleted file mode 100644
index be7a8255033..00000000000
--- a/cross/lib/unistd.c
+++ /dev/null
@@ -1,22 +0,0 @@
-/* Inline functions for <unistd.h>.
-
- Copyright (C) 2012-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-#define _GL_UNISTD_INLINE _GL_EXTERN_INLINE
-#include "unistd.h"
-typedef int dummy;
diff --git a/cross/lib/unistd.in.h b/cross/lib/unistd.in.h
deleted file mode 100644
index 8ba9867894e..00000000000
--- a/cross/lib/unistd.in.h
+++ /dev/null
@@ -1,2411 +0,0 @@
-/* Substitute for and wrapper around <unistd.h>.
- Copyright (C) 2003-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#ifndef _@GUARD_PREFIX@_UNISTD_H
-
-#if __GNUC__ >= 3
-@PRAGMA_SYSTEM_HEADER@
-#endif
-@PRAGMA_COLUMNS@
-
-#if @HAVE_UNISTD_H@ && defined _GL_INCLUDING_UNISTD_H
-/* Special invocation convention:
- - On Mac OS X 10.3.9 we have a sequence of nested includes
- <unistd.h> -> <signal.h> -> <pthread.h> -> <unistd.h>
- In this situation, the functions are not yet declared, therefore we cannot
- provide the C++ aliases. */
-
-#@INCLUDE_NEXT@ @NEXT_UNISTD_H@
-
-#else
-/* Normal invocation convention. */
-
-/* The include_next requires a split double-inclusion guard. */
-#if @HAVE_UNISTD_H@
-# define _GL_INCLUDING_UNISTD_H
-# @INCLUDE_NEXT@ @NEXT_UNISTD_H@
-# undef _GL_INCLUDING_UNISTD_H
-#endif
-
-/* Avoid lseek bugs in FreeBSD, macOS <https://bugs.gnu.org/61386>.
- This bug is fixed after FreeBSD 13; see <https://bugs.freebsd.org/256205>.
- Use macOS "9999" to stand for a future fixed macOS version. */
-#if defined __FreeBSD__ && __FreeBSD__ < 14
-# undef SEEK_DATA
-# undef SEEK_HOLE
-#elif defined __APPLE__ && defined __MACH__ && defined SEEK_DATA
-# ifdef __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
-# include <AvailabilityMacros.h>
-# endif
-# if (!defined MAC_OS_X_VERSION_MIN_REQUIRED \
- || MAC_OS_X_VERSION_MIN_REQUIRED < 99990000)
-# include <sys/fcntl.h> /* It also defines the two macros. */
-# undef SEEK_DATA
-# undef SEEK_HOLE
-# endif
-#endif
-
-/* Get all possible declarations of gethostname(). */
-#if @GNULIB_GETHOSTNAME@ && @UNISTD_H_HAVE_WINSOCK2_H@ \
- && !defined _GL_INCLUDING_WINSOCK2_H
-# define _GL_INCLUDING_WINSOCK2_H
-# include <winsock2.h>
-# undef _GL_INCLUDING_WINSOCK2_H
-#endif
-
-#if !defined _@GUARD_PREFIX@_UNISTD_H && !defined _GL_INCLUDING_WINSOCK2_H
-#define _@GUARD_PREFIX@_UNISTD_H
-
-/* NetBSD 5.0 mis-defines NULL. Also get size_t. */
-/* But avoid namespace pollution on glibc systems. */
-#ifndef __GLIBC__
-# include <stddef.h>
-#endif
-
-/* mingw doesn't define the SEEK_* or *_FILENO macros in <unistd.h>. */
-/* MSVC declares 'unlink' in <stdio.h>, not in <unistd.h>. We must include
- it before we #define unlink rpl_unlink. */
-/* Cygwin 1.7.1 declares symlinkat in <stdio.h>, not in <unistd.h>. */
-/* But avoid namespace pollution on glibc systems. */
-#if (!(defined SEEK_CUR && defined SEEK_END && defined SEEK_SET) \
- || ((@GNULIB_UNLINK@ || defined GNULIB_POSIXCHECK) \
- && (defined _WIN32 && ! defined __CYGWIN__)) \
- || ((@GNULIB_SYMLINKAT@ || defined GNULIB_POSIXCHECK) \
- && defined __CYGWIN__)) \
- && ! defined __GLIBC__
-# include <stdio.h>
-#endif
-
-/* Cygwin 1.7.1 and Android 4.3 declare unlinkat in <fcntl.h>, not in
- <unistd.h>. */
-/* But avoid namespace pollution on glibc systems. */
-#if (@GNULIB_UNLINKAT@ || defined GNULIB_POSIXCHECK) \
- && (defined __CYGWIN__ || defined __ANDROID__) \
- && ! defined __GLIBC__
-# include <fcntl.h>
-#endif
-
-/* mingw fails to declare _exit in <unistd.h>. */
-/* mingw, MSVC, BeOS, Haiku declare environ in <stdlib.h>, not in
- <unistd.h>. */
-/* Solaris declares getcwd not only in <unistd.h> but also in <stdlib.h>. */
-/* OSF Tru64 Unix cannot see gnulib rpl_strtod when system <stdlib.h> is
- included here. */
-/* But avoid namespace pollution on glibc systems. */
-#if !defined __GLIBC__ && !defined __osf__
-# define __need_system_stdlib_h
-# include <stdlib.h>
-# undef __need_system_stdlib_h
-#endif
-
-/* Native Windows platforms declare _chdir, _getcwd, _rmdir in
- <io.h> and/or <direct.h>, not in <unistd.h>.
- They also declare _access(), _chmod(), _close(), _dup(), _dup2(), _isatty(),
- _lseek(), _read(), _unlink(), _write() in <io.h>. */
-#if defined _WIN32 && !defined __CYGWIN__
-# include <io.h>
-# include <direct.h>
-#endif
-
-/* Native Windows platforms declare _execl*, _execv* in <process.h>. */
-#if defined _WIN32 && !defined __CYGWIN__
-# include <process.h>
-#endif
-
-/* AIX and OSF/1 5.1 declare getdomainname in <netdb.h>, not in <unistd.h>.
- NonStop Kernel declares gethostname in <netdb.h>, not in <unistd.h>. */
-/* But avoid namespace pollution on glibc systems. */
-#if ((@GNULIB_GETDOMAINNAME@ && (defined _AIX || defined __osf__)) \
- || (@GNULIB_GETHOSTNAME@ && defined __TANDEM)) \
- && !defined __GLIBC__
-# include <netdb.h>
-#endif
-
-/* Mac OS X 10.13, Solaris 11.4, and Android 9.0 declare getentropy in
- <sys/random.h>, not in <unistd.h>. */
-/* But avoid namespace pollution on glibc systems. */
-#if (@GNULIB_GETENTROPY@ || defined GNULIB_POSIXCHECK) \
- && ((defined __APPLE__ && defined __MACH__) || defined __sun \
- || defined __ANDROID__) \
- && @UNISTD_H_HAVE_SYS_RANDOM_H@ \
- && !defined __GLIBC__
-# include <sys/random.h>
-#endif
-
-/* Android 4.3 declares fchownat in <sys/stat.h>, not in <unistd.h>. */
-/* But avoid namespace pollution on glibc systems. */
-#if (@GNULIB_FCHOWNAT@ || defined GNULIB_POSIXCHECK) && defined __ANDROID__ \
- && !defined __GLIBC__
-# include <sys/stat.h>
-#endif
-
-/* MSVC defines off_t in <sys/types.h>.
- May also define off_t to a 64-bit type on native Windows. */
-/* Get off_t, ssize_t, mode_t. */
-#include <sys/types.h>
-
-/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
-
-/* The definition of _GL_ARG_NONNULL is copied here. */
-
-/* The definition of _GL_WARN_ON_USE is copied here. */
-
-
-/* Get getopt(), optarg, optind, opterr, optopt. */
-#if @GNULIB_GETOPT_POSIX@ && @GNULIB_UNISTD_H_GETOPT@ && !defined _GL_SYSTEM_GETOPT
-# include <getopt-cdefs.h>
-# include <getopt-pfx-core.h>
-#endif
-
-#ifndef _GL_INLINE_HEADER_BEGIN
- #error "Please include config.h first."
-#endif
-_GL_INLINE_HEADER_BEGIN
-#ifndef _GL_UNISTD_INLINE
-# define _GL_UNISTD_INLINE _GL_INLINE
-#endif
-
-/* Hide some function declarations from <winsock2.h>. */
-
-#if @GNULIB_GETHOSTNAME@ && @UNISTD_H_HAVE_WINSOCK2_H@
-# if !defined _@GUARD_PREFIX@_SYS_SOCKET_H
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef socket
-# define socket socket_used_without_including_sys_socket_h
-# undef connect
-# define connect connect_used_without_including_sys_socket_h
-# undef accept
-# define accept accept_used_without_including_sys_socket_h
-# undef bind
-# define bind bind_used_without_including_sys_socket_h
-# undef getpeername
-# define getpeername getpeername_used_without_including_sys_socket_h
-# undef getsockname
-# define getsockname getsockname_used_without_including_sys_socket_h
-# undef getsockopt
-# define getsockopt getsockopt_used_without_including_sys_socket_h
-# undef listen
-# define listen listen_used_without_including_sys_socket_h
-# undef recv
-# define recv recv_used_without_including_sys_socket_h
-# undef send
-# define send send_used_without_including_sys_socket_h
-# undef recvfrom
-# define recvfrom recvfrom_used_without_including_sys_socket_h
-# undef sendto
-# define sendto sendto_used_without_including_sys_socket_h
-# undef setsockopt
-# define setsockopt setsockopt_used_without_including_sys_socket_h
-# undef shutdown
-# define shutdown shutdown_used_without_including_sys_socket_h
-# else
- _GL_WARN_ON_USE (socket,
- "socket() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (connect,
- "connect() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (accept,
- "accept() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (bind,
- "bind() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (getpeername,
- "getpeername() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (getsockname,
- "getsockname() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (getsockopt,
- "getsockopt() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (listen,
- "listen() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (recv,
- "recv() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (send,
- "send() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (recvfrom,
- "recvfrom() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (sendto,
- "sendto() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (setsockopt,
- "setsockopt() used without including <sys/socket.h>");
- _GL_WARN_ON_USE (shutdown,
- "shutdown() used without including <sys/socket.h>");
-# endif
-# endif
-# if !defined _@GUARD_PREFIX@_SYS_SELECT_H
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef select
-# define select select_used_without_including_sys_select_h
-# else
- _GL_WARN_ON_USE (select,
- "select() used without including <sys/select.h>");
-# endif
-# endif
-#endif
-
-
-/* OS/2 EMX lacks these macros. */
-#ifndef STDIN_FILENO
-# define STDIN_FILENO 0
-#endif
-#ifndef STDOUT_FILENO
-# define STDOUT_FILENO 1
-#endif
-#ifndef STDERR_FILENO
-# define STDERR_FILENO 2
-#endif
-
-/* Ensure *_OK macros exist. */
-#ifndef F_OK
-# define F_OK 0
-# define X_OK 1
-# define W_OK 2
-# define R_OK 4
-#endif
-
-
-/* Declare overridden functions. */
-
-
-#if @GNULIB_ACCESS@
-# if @REPLACE_ACCESS@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef access
-# define access rpl_access
-# endif
-_GL_FUNCDECL_RPL (access, int, (const char *file, int mode)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (access, int, (const char *file, int mode));
-# elif defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef access
-# define access _access
-# endif
-_GL_CXXALIAS_MDA (access, int, (const char *file, int mode));
-# else
-_GL_CXXALIAS_SYS (access, int, (const char *file, int mode));
-# endif
-_GL_CXXALIASWARN (access);
-#elif defined GNULIB_POSIXCHECK
-# undef access
-# if HAVE_RAW_DECL_ACCESS
-/* The access() function is a security risk. */
-_GL_WARN_ON_USE (access, "access does not always support X_OK - "
- "use gnulib module access for portability; "
- "also, this function is a security risk - "
- "use the gnulib module faccessat instead");
-# endif
-#elif @GNULIB_MDA_ACCESS@
-/* On native Windows, map 'access' to '_access', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::access always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef access
-# define access _access
-# endif
-_GL_CXXALIAS_MDA (access, int, (const char *file, int mode));
-# else
-_GL_CXXALIAS_SYS (access, int, (const char *file, int mode));
-# endif
-_GL_CXXALIASWARN (access);
-#endif
-
-
-#if @GNULIB_CHDIR@
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef chdir
-# define chdir _chdir
-# endif
-_GL_CXXALIAS_MDA (chdir, int, (const char *file));
-# else
-_GL_CXXALIAS_SYS (chdir, int, (const char *file) _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIASWARN (chdir);
-#elif defined GNULIB_POSIXCHECK
-# undef chdir
-# if HAVE_RAW_DECL_CHDIR
-_GL_WARN_ON_USE (chown, "chdir is not always in <unistd.h> - "
- "use gnulib module chdir for portability");
-# endif
-#elif @GNULIB_MDA_CHDIR@
-/* On native Windows, map 'chdir' to '_chdir', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::chdir always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef chdir
-# define chdir _chdir
-# endif
-_GL_CXXALIAS_MDA (chdir, int, (const char *file));
-# else
-_GL_CXXALIAS_SYS (chdir, int, (const char *file) _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIASWARN (chdir);
-#endif
-
-
-#if @GNULIB_CHOWN@
-/* Change the owner of FILE to UID (if UID is not -1) and the group of FILE
- to GID (if GID is not -1). Follow symbolic links.
- Return 0 if successful, otherwise -1 and errno set.
- See the POSIX:2008 specification
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/chown.html. */
-# if @REPLACE_CHOWN@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef chown
-# define chown rpl_chown
-# endif
-_GL_FUNCDECL_RPL (chown, int, (const char *file, uid_t uid, gid_t gid)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (chown, int, (const char *file, uid_t uid, gid_t gid));
-# else
-# if !@HAVE_CHOWN@
-_GL_FUNCDECL_SYS (chown, int, (const char *file, uid_t uid, gid_t gid)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (chown, int, (const char *file, uid_t uid, gid_t gid));
-# endif
-_GL_CXXALIASWARN (chown);
-#elif defined GNULIB_POSIXCHECK
-# undef chown
-# if HAVE_RAW_DECL_CHOWN
-_GL_WARN_ON_USE (chown, "chown fails to follow symlinks on some systems and "
- "doesn't treat a uid or gid of -1 on some systems - "
- "use gnulib module chown for portability");
-# endif
-#endif
-
-
-#if @GNULIB_CLOSE@
-# if @REPLACE_CLOSE@
-/* Automatically included by modules that need a replacement for close. */
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef close
-# define close rpl_close
-# endif
-_GL_FUNCDECL_RPL (close, int, (int fd));
-_GL_CXXALIAS_RPL (close, int, (int fd));
-# elif defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef close
-# define close _close
-# endif
-_GL_CXXALIAS_MDA (close, int, (int fd));
-# else
-_GL_CXXALIAS_SYS (close, int, (int fd));
-# endif
-_GL_CXXALIASWARN (close);
-#elif @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
-# undef close
-# define close close_used_without_requesting_gnulib_module_close
-#elif defined GNULIB_POSIXCHECK
-# undef close
-/* Assume close is always declared. */
-_GL_WARN_ON_USE (close, "close does not portably work on sockets - "
- "use gnulib module close for portability");
-#elif @GNULIB_MDA_CLOSE@
-/* On native Windows, map 'close' to '_close', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::close always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef close
-# define close _close
-# endif
-_GL_CXXALIAS_MDA (close, int, (int fd));
-# else
-_GL_CXXALIAS_SYS (close, int, (int fd));
-# endif
-_GL_CXXALIASWARN (close);
-#endif
-
-
-#if @GNULIB_COPY_FILE_RANGE@
-# if @REPLACE_COPY_FILE_RANGE@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef copy_file_range
-# define copy_file_range rpl_copy_file_range
-# endif
-_GL_FUNCDECL_RPL (copy_file_range, ssize_t, (int ifd, off_t *ipos,
- int ofd, off_t *opos,
- size_t len, unsigned flags));
-_GL_CXXALIAS_RPL (copy_file_range, ssize_t, (int ifd, off_t *ipos,
- int ofd, off_t *opos,
- size_t len, unsigned flags));
-# else
-# if !@HAVE_COPY_FILE_RANGE@
-_GL_FUNCDECL_SYS (copy_file_range, ssize_t, (int ifd, off_t *ipos,
- int ofd, off_t *opos,
- size_t len, unsigned flags));
-# endif
-_GL_CXXALIAS_SYS (copy_file_range, ssize_t, (int ifd, off_t *ipos,
- int ofd, off_t *opos,
- size_t len, unsigned flags));
-# endif
-_GL_CXXALIASWARN (copy_file_range);
-#elif defined GNULIB_POSIXCHECK
-# undef copy_file_range
-# if HAVE_RAW_DECL_COPY_FILE_RANGE
-_GL_WARN_ON_USE (copy_file_range,
- "copy_file_range is unportable - "
- "use gnulib module copy_file_range for portability");
-# endif
-#endif
-
-
-#if @GNULIB_DUP@
-# if @REPLACE_DUP@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define dup rpl_dup
-# endif
-_GL_FUNCDECL_RPL (dup, int, (int oldfd));
-_GL_CXXALIAS_RPL (dup, int, (int oldfd));
-# elif defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef dup
-# define dup _dup
-# endif
-_GL_CXXALIAS_MDA (dup, int, (int oldfd));
-# else
-_GL_CXXALIAS_SYS (dup, int, (int oldfd));
-# endif
-_GL_CXXALIASWARN (dup);
-#elif defined GNULIB_POSIXCHECK
-# undef dup
-# if HAVE_RAW_DECL_DUP
-_GL_WARN_ON_USE (dup, "dup is unportable - "
- "use gnulib module dup for portability");
-# endif
-#elif @GNULIB_MDA_DUP@
-/* On native Windows, map 'dup' to '_dup', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::dup always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef dup
-# define dup _dup
-# endif
-_GL_CXXALIAS_MDA (dup, int, (int oldfd));
-# else
-_GL_CXXALIAS_SYS (dup, int, (int oldfd));
-# endif
-_GL_CXXALIASWARN (dup);
-#endif
-
-
-#if @GNULIB_DUP2@
-/* Copy the file descriptor OLDFD into file descriptor NEWFD. Do nothing if
- NEWFD = OLDFD, otherwise close NEWFD first if it is open.
- Return newfd if successful, otherwise -1 and errno set.
- See the POSIX:2008 specification
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/dup2.html>. */
-# if @REPLACE_DUP2@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define dup2 rpl_dup2
-# endif
-_GL_FUNCDECL_RPL (dup2, int, (int oldfd, int newfd));
-_GL_CXXALIAS_RPL (dup2, int, (int oldfd, int newfd));
-# elif defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef dup2
-# define dup2 _dup2
-# endif
-_GL_CXXALIAS_MDA (dup2, int, (int oldfd, int newfd));
-# else
-_GL_CXXALIAS_SYS (dup2, int, (int oldfd, int newfd));
-# endif
-_GL_CXXALIASWARN (dup2);
-#elif defined GNULIB_POSIXCHECK
-# undef dup2
-# if HAVE_RAW_DECL_DUP2
-_GL_WARN_ON_USE (dup2, "dup2 is unportable - "
- "use gnulib module dup2 for portability");
-# endif
-#elif @GNULIB_MDA_DUP2@
-/* On native Windows, map 'dup2' to '_dup2', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::dup2 always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef dup2
-# define dup2 _dup2
-# endif
-_GL_CXXALIAS_MDA (dup2, int, (int oldfd, int newfd));
-# else
-_GL_CXXALIAS_SYS (dup2, int, (int oldfd, int newfd));
-# endif
-_GL_CXXALIASWARN (dup2);
-#endif
-
-
-#if @GNULIB_DUP3@
-/* Copy the file descriptor OLDFD into file descriptor NEWFD, with the
- specified flags.
- The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
- and O_TEXT, O_BINARY (defined in "binary-io.h").
- Close NEWFD first if it is open.
- Return newfd if successful, otherwise -1 and errno set.
- See the Linux man page at
- <https://www.kernel.org/doc/man-pages/online/pages/man2/dup3.2.html>. */
-# if @REPLACE_DUP3@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef dup3
-# define dup3 rpl_dup3
-# endif
-_GL_FUNCDECL_RPL (dup3, int, (int oldfd, int newfd, int flags));
-_GL_CXXALIAS_RPL (dup3, int, (int oldfd, int newfd, int flags));
-# else
-# if !@HAVE_DUP3@
-_GL_FUNCDECL_SYS (dup3, int, (int oldfd, int newfd, int flags));
-# endif
-_GL_CXXALIAS_SYS (dup3, int, (int oldfd, int newfd, int flags));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (dup3);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef dup3
-# if HAVE_RAW_DECL_DUP3
-_GL_WARN_ON_USE (dup3, "dup3 is unportable - "
- "use gnulib module dup3 for portability");
-# endif
-#endif
-
-
-#if @GNULIB_ENVIRON@
-# if defined __CYGWIN__ && !defined __i386__
-/* The 'environ' variable is defined in a DLL. Therefore its declaration needs
- the '__declspec(dllimport)' attribute, but the system's <unistd.h> lacks it.
- This leads to a link error on 64-bit Cygwin when the option
- -Wl,--disable-auto-import is in use. */
-_GL_EXTERN_C __declspec(dllimport) char **environ;
-# endif
-# if !@HAVE_DECL_ENVIRON@
-/* Set of environment variables and values. An array of strings of the form
- "VARIABLE=VALUE", terminated with a NULL. */
-# if defined __APPLE__ && defined __MACH__
-# include <TargetConditionals.h>
-# if !TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR
-# define _GL_USE_CRT_EXTERNS
-# endif
-# endif
-# ifdef _GL_USE_CRT_EXTERNS
-# include <crt_externs.h>
-# define environ (*_NSGetEnviron ())
-# else
-# ifdef __cplusplus
-extern "C" {
-# endif
-extern char **environ;
-# ifdef __cplusplus
-}
-# endif
-# endif
-# endif
-#elif defined GNULIB_POSIXCHECK
-# if HAVE_RAW_DECL_ENVIRON
-_GL_UNISTD_INLINE char ***
-_GL_WARN_ON_USE_ATTRIBUTE ("environ is unportable - "
- "use gnulib module environ for portability")
-rpl_environ (void)
-{
- return &environ;
-}
-# undef environ
-# define environ (*rpl_environ ())
-# endif
-#endif
-
-
-#if @GNULIB_EUIDACCESS@
-/* Like access(), except that it uses the effective user id and group id of
- the current process. */
-# if !@HAVE_EUIDACCESS@
-_GL_FUNCDECL_SYS (euidaccess, int, (const char *filename, int mode)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (euidaccess, int, (const char *filename, int mode));
-_GL_CXXALIASWARN (euidaccess);
-# if defined GNULIB_POSIXCHECK
-/* Like access(), this function is a security risk. */
-_GL_WARN_ON_USE (euidaccess, "the euidaccess function is a security risk - "
- "use the gnulib module faccessat instead");
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef euidaccess
-# if HAVE_RAW_DECL_EUIDACCESS
-_GL_WARN_ON_USE (euidaccess, "euidaccess is unportable - "
- "use gnulib module euidaccess for portability");
-# endif
-#endif
-
-
-#if @GNULIB_EXECL@
-# if @REPLACE_EXECL@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef execl
-# define execl rpl_execl
-# endif
-_GL_FUNCDECL_RPL (execl, int, (const char *program, const char *arg, ...)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (execl, int, (const char *program, const char *arg, ...));
-# else
-_GL_CXXALIAS_SYS (execl, int, (const char *program, const char *arg, ...));
-# endif
-_GL_CXXALIASWARN (execl);
-#elif defined GNULIB_POSIXCHECK
-# undef execl
-# if HAVE_RAW_DECL_EXECL
-_GL_WARN_ON_USE (execl, "execl behaves very differently on mingw - "
- "use gnulib module execl for portability");
-# endif
-#elif @GNULIB_MDA_EXECL@
-/* On native Windows, map 'execl' to '_execl', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::execl always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef execl
-# define execl _execl
-# endif
-_GL_CXXALIAS_MDA (execl, intptr_t, (const char *program, const char *arg, ...));
-# else
-_GL_CXXALIAS_SYS (execl, int, (const char *program, const char *arg, ...));
-# endif
-_GL_CXXALIASWARN (execl);
-#endif
-
-#if @GNULIB_EXECLE@
-# if @REPLACE_EXECLE@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef execle
-# define execle rpl_execle
-# endif
-_GL_FUNCDECL_RPL (execle, int, (const char *program, const char *arg, ...)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (execle, int, (const char *program, const char *arg, ...));
-# else
-_GL_CXXALIAS_SYS (execle, int, (const char *program, const char *arg, ...));
-# endif
-_GL_CXXALIASWARN (execle);
-#elif defined GNULIB_POSIXCHECK
-# undef execle
-# if HAVE_RAW_DECL_EXECLE
-_GL_WARN_ON_USE (execle, "execle behaves very differently on mingw - "
- "use gnulib module execle for portability");
-# endif
-#elif @GNULIB_MDA_EXECLE@
-/* On native Windows, map 'execle' to '_execle', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::execle always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef execle
-# define execle _execle
-# endif
-_GL_CXXALIAS_MDA (execle, intptr_t,
- (const char *program, const char *arg, ...));
-# else
-_GL_CXXALIAS_SYS (execle, int, (const char *program, const char *arg, ...));
-# endif
-_GL_CXXALIASWARN (execle);
-#endif
-
-#if @GNULIB_EXECLP@
-# if @REPLACE_EXECLP@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef execlp
-# define execlp rpl_execlp
-# endif
-_GL_FUNCDECL_RPL (execlp, int, (const char *program, const char *arg, ...)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (execlp, int, (const char *program, const char *arg, ...));
-# else
-_GL_CXXALIAS_SYS (execlp, int, (const char *program, const char *arg, ...));
-# endif
-_GL_CXXALIASWARN (execlp);
-#elif defined GNULIB_POSIXCHECK
-# undef execlp
-# if HAVE_RAW_DECL_EXECLP
-_GL_WARN_ON_USE (execlp, "execlp behaves very differently on mingw - "
- "use gnulib module execlp for portability");
-# endif
-#elif @GNULIB_MDA_EXECLP@
-/* On native Windows, map 'execlp' to '_execlp', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::execlp always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef execlp
-# define execlp _execlp
-# endif
-_GL_CXXALIAS_MDA (execlp, intptr_t,
- (const char *program, const char *arg, ...));
-# else
-_GL_CXXALIAS_SYS (execlp, int, (const char *program, const char *arg, ...));
-# endif
-_GL_CXXALIASWARN (execlp);
-#endif
-
-
-#if @GNULIB_EXECV@
-# if @REPLACE_EXECV@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef execv
-# define execv rpl_execv
-# endif
-_GL_FUNCDECL_RPL (execv, int, (const char *program, char * const *argv)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (execv, int, (const char *program, char * const *argv));
-# else
-_GL_CXXALIAS_SYS (execv, int, (const char *program, char * const *argv));
-# endif
-_GL_CXXALIASWARN (execv);
-#elif defined GNULIB_POSIXCHECK
-# undef execv
-# if HAVE_RAW_DECL_EXECV
-_GL_WARN_ON_USE (execv, "execv behaves very differently on mingw - "
- "use gnulib module execv for portability");
-# endif
-#elif @GNULIB_MDA_EXECV@
-/* On native Windows, map 'execv' to '_execv', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::execv always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef execv
-# define execv _execv
-# endif
-_GL_CXXALIAS_MDA_CAST (execv, intptr_t,
- (const char *program, char * const *argv));
-# else
-_GL_CXXALIAS_SYS (execv, int, (const char *program, char * const *argv));
-# endif
-_GL_CXXALIASWARN (execv);
-#endif
-
-#if @GNULIB_EXECVE@
-# if @REPLACE_EXECVE@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef execve
-# define execve rpl_execve
-# endif
-_GL_FUNCDECL_RPL (execve, int,
- (const char *program, char * const *argv, char * const *env)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (execve, int,
- (const char *program, char * const *argv, char * const *env));
-# else
-_GL_CXXALIAS_SYS (execve, int,
- (const char *program, char * const *argv, char * const *env));
-# endif
-_GL_CXXALIASWARN (execve);
-#elif defined GNULIB_POSIXCHECK
-# undef execve
-# if HAVE_RAW_DECL_EXECVE
-_GL_WARN_ON_USE (execve, "execve behaves very differently on mingw - "
- "use gnulib module execve for portability");
-# endif
-#elif @GNULIB_MDA_EXECVE@
-/* On native Windows, map 'execve' to '_execve', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::execve always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef execve
-# define execve _execve
-# endif
-_GL_CXXALIAS_MDA_CAST (execve, intptr_t,
- (const char *program, char * const *argv,
- char * const *env));
-# else
-_GL_CXXALIAS_SYS (execve, int,
- (const char *program, char * const *argv, char * const *env));
-# endif
-_GL_CXXALIASWARN (execve);
-#endif
-
-#if @GNULIB_EXECVP@
-# if @REPLACE_EXECVP@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef execvp
-# define execvp rpl_execvp
-# endif
-_GL_FUNCDECL_RPL (execvp, int, (const char *program, char * const *argv)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (execvp, int, (const char *program, char * const *argv));
-# else
-_GL_CXXALIAS_SYS (execvp, int, (const char *program, char * const *argv));
-# endif
-_GL_CXXALIASWARN (execvp);
-#elif defined GNULIB_POSIXCHECK
-# undef execvp
-# if HAVE_RAW_DECL_EXECVP
-_GL_WARN_ON_USE (execvp, "execvp behaves very differently on mingw - "
- "use gnulib module execvp for portability");
-# endif
-#elif @GNULIB_MDA_EXECVP@
-/* On native Windows, map 'execvp' to '_execvp', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::execvp always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef execvp
-# define execvp _execvp
-# endif
-_GL_CXXALIAS_MDA_CAST (execvp, intptr_t,
- (const char *program, char * const *argv));
-# else
-_GL_CXXALIAS_SYS (execvp, int, (const char *program, char * const *argv));
-# endif
-_GL_CXXALIASWARN (execvp);
-#endif
-
-#if @GNULIB_EXECVPE@
-# if @REPLACE_EXECVPE@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef execvpe
-# define execvpe rpl_execvpe
-# endif
-_GL_FUNCDECL_RPL (execvpe, int,
- (const char *program, char * const *argv, char * const *env)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (execvpe, int,
- (const char *program, char * const *argv, char * const *env));
-# else
-# if !@HAVE_DECL_EXECVPE@
-_GL_FUNCDECL_SYS (execvpe, int,
- (const char *program, char * const *argv, char * const *env)
- _GL_ARG_NONNULL ((1, 2)));
-# endif
-_GL_CXXALIAS_SYS (execvpe, int,
- (const char *program, char * const *argv, char * const *env));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (execvpe);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef execvpe
-# if HAVE_RAW_DECL_EXECVPE
-_GL_WARN_ON_USE (execvpe, "execvpe behaves very differently on mingw - "
- "use gnulib module execvpe for portability");
-# endif
-#elif @GNULIB_MDA_EXECVPE@
-/* On native Windows, map 'execvpe' to '_execvpe', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::execvpe on all platforms that have
- it. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef execvpe
-# define execvpe _execvpe
-# endif
-_GL_CXXALIAS_MDA_CAST (execvpe, intptr_t,
- (const char *program, char * const *argv,
- char * const *env));
-# elif @HAVE_EXECVPE@
-# if !@HAVE_DECL_EXECVPE@
-_GL_FUNCDECL_SYS (execvpe, int,
- (const char *program, char * const *argv, char * const *env)
- _GL_ARG_NONNULL ((1, 2)));
-# endif
-_GL_CXXALIAS_SYS (execvpe, int,
- (const char *program, char * const *argv, char * const *env));
-# endif
-# if (defined _WIN32 && !defined __CYGWIN__) || @HAVE_EXECVPE@
-_GL_CXXALIASWARN (execvpe);
-# endif
-#endif
-
-
-#if @GNULIB_FACCESSAT@
-# if @REPLACE_FACCESSAT@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef faccessat
-# define faccessat rpl_faccessat
-# endif
-_GL_FUNCDECL_RPL (faccessat, int,
- (int fd, char const *name, int mode, int flag)
- _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (faccessat, int,
- (int fd, char const *name, int mode, int flag));
-# else
-# if !@HAVE_FACCESSAT@
-_GL_FUNCDECL_SYS (faccessat, int,
- (int fd, char const *file, int mode, int flag)
- _GL_ARG_NONNULL ((2)));
-# endif
-_GL_CXXALIAS_SYS (faccessat, int,
- (int fd, char const *file, int mode, int flag));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (faccessat);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef faccessat
-# if HAVE_RAW_DECL_FACCESSAT
-_GL_WARN_ON_USE (faccessat, "faccessat is not portable - "
- "use gnulib module faccessat for portability");
-# endif
-#endif
-
-
-#if @GNULIB_FCHDIR@
-/* Change the process' current working directory to the directory on which
- the given file descriptor is open.
- Return 0 if successful, otherwise -1 and errno set.
- See the POSIX:2008 specification
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/fchdir.html>. */
-# if ! @HAVE_FCHDIR@
-_GL_FUNCDECL_SYS (fchdir, int, (int /*fd*/));
-
-/* Gnulib internal hooks needed to maintain the fchdir metadata. */
-_GL_EXTERN_C int _gl_register_fd (int fd, const char *filename)
- _GL_ARG_NONNULL ((2));
-_GL_EXTERN_C void _gl_unregister_fd (int fd);
-_GL_EXTERN_C int _gl_register_dup (int oldfd, int newfd);
-_GL_EXTERN_C const char *_gl_directory_name (int fd);
-
-# else
-# if !@HAVE_DECL_FCHDIR@
-_GL_FUNCDECL_SYS (fchdir, int, (int /*fd*/));
-# endif
-# endif
-_GL_CXXALIAS_SYS (fchdir, int, (int /*fd*/));
-_GL_CXXALIASWARN (fchdir);
-#elif defined GNULIB_POSIXCHECK
-# undef fchdir
-# if HAVE_RAW_DECL_FCHDIR
-_GL_WARN_ON_USE (fchdir, "fchdir is unportable - "
- "use gnulib module fchdir for portability");
-# endif
-#endif
-
-
-#if @GNULIB_FCHOWNAT@
-# if @REPLACE_FCHOWNAT@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fchownat
-# define fchownat rpl_fchownat
-# endif
-_GL_FUNCDECL_RPL (fchownat, int, (int fd, char const *file,
- uid_t owner, gid_t group, int flag)
- _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (fchownat, int, (int fd, char const *file,
- uid_t owner, gid_t group, int flag));
-# else
-# if !@HAVE_FCHOWNAT@
-_GL_FUNCDECL_SYS (fchownat, int, (int fd, char const *file,
- uid_t owner, gid_t group, int flag)
- _GL_ARG_NONNULL ((2)));
-# endif
-_GL_CXXALIAS_SYS (fchownat, int, (int fd, char const *file,
- uid_t owner, gid_t group, int flag));
-# endif
-_GL_CXXALIASWARN (fchownat);
-#elif defined GNULIB_POSIXCHECK
-# undef fchownat
-# if HAVE_RAW_DECL_FCHOWNAT
-_GL_WARN_ON_USE (fchownat, "fchownat is not portable - "
- "use gnulib module fchownat for portability");
-# endif
-#endif
-
-
-#if @GNULIB_FDATASYNC@
-/* Synchronize changes to a file.
- Return 0 if successful, otherwise -1 and errno set.
- See POSIX:2008 specification
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/fdatasync.html>. */
-# if @REPLACE_FDATASYNC@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef fdatasync
-# define fdatasync rpl_fdatasync
-# endif
-_GL_FUNCDECL_RPL (fdatasync, int, (int fd));
-_GL_CXXALIAS_RPL (fdatasync, int, (int fd));
-# else
-# if !@HAVE_FDATASYNC@|| !@HAVE_DECL_FDATASYNC@
-_GL_FUNCDECL_SYS (fdatasync, int, (int fd));
-# endif
-_GL_CXXALIAS_SYS (fdatasync, int, (int fd));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (fdatasync);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef fdatasync
-# if HAVE_RAW_DECL_FDATASYNC
-_GL_WARN_ON_USE (fdatasync, "fdatasync is unportable - "
- "use gnulib module fdatasync for portability");
-# endif
-#endif
-
-
-#if @GNULIB_FSYNC@
-/* Synchronize changes, including metadata, to a file.
- Return 0 if successful, otherwise -1 and errno set.
- See POSIX:2008 specification
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/fsync.html>. */
-# if !@HAVE_FSYNC@
-_GL_FUNCDECL_SYS (fsync, int, (int fd));
-# endif
-_GL_CXXALIAS_SYS (fsync, int, (int fd));
-_GL_CXXALIASWARN (fsync);
-#elif defined GNULIB_POSIXCHECK
-# undef fsync
-# if HAVE_RAW_DECL_FSYNC
-_GL_WARN_ON_USE (fsync, "fsync is unportable - "
- "use gnulib module fsync for portability");
-# endif
-#endif
-
-
-#if @GNULIB_FTRUNCATE@
-/* Change the size of the file to which FD is opened to become equal to LENGTH.
- Return 0 if successful, otherwise -1 and errno set.
- See the POSIX:2008 specification
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/ftruncate.html>. */
-# if @REPLACE_FTRUNCATE@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef ftruncate
-# define ftruncate rpl_ftruncate
-# endif
-_GL_FUNCDECL_RPL (ftruncate, int, (int fd, off_t length));
-_GL_CXXALIAS_RPL (ftruncate, int, (int fd, off_t length));
-# else
-# if !@HAVE_FTRUNCATE@
-_GL_FUNCDECL_SYS (ftruncate, int, (int fd, off_t length));
-# endif
-_GL_CXXALIAS_SYS (ftruncate, int, (int fd, off_t length));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (ftruncate);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef ftruncate
-# if HAVE_RAW_DECL_FTRUNCATE
-_GL_WARN_ON_USE (ftruncate, "ftruncate is unportable - "
- "use gnulib module ftruncate for portability");
-# endif
-#endif
-
-
-#if @GNULIB_GETCWD@
-/* Get the name of the current working directory, and put it in SIZE bytes
- of BUF.
- Return BUF if successful, or NULL if the directory couldn't be determined
- or SIZE was too small.
- See the POSIX:2008 specification
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html>.
- Additionally, the gnulib module 'getcwd' guarantees the following GNU
- extension: If BUF is NULL, an array is allocated with 'malloc'; the array
- is SIZE bytes long, unless SIZE == 0, in which case it is as big as
- necessary. */
-# if @REPLACE_GETCWD@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define getcwd rpl_getcwd
-# endif
-_GL_FUNCDECL_RPL (getcwd, char *, (char *buf, size_t size));
-_GL_CXXALIAS_RPL (getcwd, char *, (char *buf, size_t size));
-# elif defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef getcwd
-# define getcwd _getcwd
-# endif
-_GL_CXXALIAS_MDA (getcwd, char *, (char *buf, size_t size));
-# else
-/* Need to cast, because on mingw, the second parameter is
- int size. */
-_GL_CXXALIAS_SYS_CAST (getcwd, char *, (char *buf, size_t size));
-# endif
-_GL_CXXALIASWARN (getcwd);
-#elif defined GNULIB_POSIXCHECK
-# undef getcwd
-# if HAVE_RAW_DECL_GETCWD
-_GL_WARN_ON_USE (getcwd, "getcwd is unportable - "
- "use gnulib module getcwd for portability");
-# endif
-#elif @GNULIB_MDA_GETCWD@
-/* On native Windows, map 'getcwd' to '_getcwd', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::getcwd always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef getcwd
-# define getcwd _getcwd
-# endif
-/* Need to cast, because on mingw, the second parameter is either
- 'int size' or 'size_t size'. */
-_GL_CXXALIAS_MDA_CAST (getcwd, char *, (char *buf, size_t size));
-# else
-_GL_CXXALIAS_SYS_CAST (getcwd, char *, (char *buf, size_t size));
-# endif
-_GL_CXXALIASWARN (getcwd);
-#endif
-
-
-#if @GNULIB_GETDOMAINNAME@
-/* Return the NIS domain name of the machine.
- WARNING! The NIS domain name is unrelated to the fully qualified host name
- of the machine. It is also unrelated to email addresses.
- WARNING! The NIS domain name is usually the empty string or "(none)" when
- not using NIS.
-
- Put up to LEN bytes of the NIS domain name into NAME.
- Null terminate it if the name is shorter than LEN.
- If the NIS domain name is longer than LEN, set errno = EINVAL and return -1.
- Return 0 if successful, otherwise set errno and return -1. */
-# if @REPLACE_GETDOMAINNAME@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef getdomainname
-# define getdomainname rpl_getdomainname
-# endif
-_GL_FUNCDECL_RPL (getdomainname, int, (char *name, size_t len)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (getdomainname, int, (char *name, size_t len));
-# else
-# if !@HAVE_DECL_GETDOMAINNAME@
-_GL_FUNCDECL_SYS (getdomainname, int, (char *name, size_t len)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (getdomainname, int, (char *name, size_t len));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (getdomainname);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef getdomainname
-# if HAVE_RAW_DECL_GETDOMAINNAME
-_GL_WARN_ON_USE (getdomainname, "getdomainname is unportable - "
- "use gnulib module getdomainname for portability");
-# endif
-#endif
-
-
-#if @GNULIB_GETDTABLESIZE@
-/* Return the maximum number of file descriptors in the current process.
- In POSIX, this is same as sysconf (_SC_OPEN_MAX). */
-# if @REPLACE_GETDTABLESIZE@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef getdtablesize
-# define getdtablesize rpl_getdtablesize
-# endif
-_GL_FUNCDECL_RPL (getdtablesize, int, (void));
-_GL_CXXALIAS_RPL (getdtablesize, int, (void));
-# else
-# if !@HAVE_GETDTABLESIZE@
-_GL_FUNCDECL_SYS (getdtablesize, int, (void));
-# endif
-/* Need to cast, because on AIX, the parameter list is
- (...). */
-_GL_CXXALIAS_SYS_CAST (getdtablesize, int, (void));
-# endif
-_GL_CXXALIASWARN (getdtablesize);
-#elif defined GNULIB_POSIXCHECK
-# undef getdtablesize
-# if HAVE_RAW_DECL_GETDTABLESIZE
-_GL_WARN_ON_USE (getdtablesize, "getdtablesize is unportable - "
- "use gnulib module getdtablesize for portability");
-# endif
-#endif
-
-
-#if @GNULIB_GETENTROPY@
-/* Fill a buffer with random bytes. */
-# if @REPLACE_GETENTROPY@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef getentropy
-# define getentropy rpl_getentropy
-# endif
-_GL_FUNCDECL_RPL (getentropy, int, (void *buffer, size_t length));
-_GL_CXXALIAS_RPL (getentropy, int, (void *buffer, size_t length));
-# else
-# if !@HAVE_GETENTROPY@
-_GL_FUNCDECL_SYS (getentropy, int, (void *buffer, size_t length));
-# endif
-_GL_CXXALIAS_SYS (getentropy, int, (void *buffer, size_t length));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (getentropy);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef getentropy
-# if HAVE_RAW_DECL_GETENTROPY
-_GL_WARN_ON_USE (getentropy, "getentropy is unportable - "
- "use gnulib module getentropy for portability");
-# endif
-#endif
-
-
-#if @GNULIB_GETGROUPS@
-/* Return the supplemental groups that the current process belongs to.
- It is unspecified whether the effective group id is in the list.
- If N is 0, return the group count; otherwise, N describes how many
- entries are available in GROUPS. Return -1 and set errno if N is
- not 0 and not large enough. Fails with ENOSYS on some systems. */
-# if @REPLACE_GETGROUPS@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef getgroups
-# define getgroups rpl_getgroups
-# endif
-_GL_FUNCDECL_RPL (getgroups, int, (int n, gid_t *groups));
-_GL_CXXALIAS_RPL (getgroups, int, (int n, gid_t *groups));
-# else
-# if !@HAVE_GETGROUPS@
-_GL_FUNCDECL_SYS (getgroups, int, (int n, gid_t *groups));
-# endif
-_GL_CXXALIAS_SYS (getgroups, int, (int n, gid_t *groups));
-# endif
-_GL_CXXALIASWARN (getgroups);
-#elif defined GNULIB_POSIXCHECK
-# undef getgroups
-# if HAVE_RAW_DECL_GETGROUPS
-_GL_WARN_ON_USE (getgroups, "getgroups is unportable - "
- "use gnulib module getgroups for portability");
-# endif
-#endif
-
-
-#if @GNULIB_GETHOSTNAME@
-/* Return the standard host name of the machine.
- WARNING! The host name may or may not be fully qualified.
-
- Put up to LEN bytes of the host name into NAME.
- Null terminate it if the name is shorter than LEN.
- If the host name is longer than LEN, set errno = EINVAL and return -1.
- Return 0 if successful, otherwise set errno and return -1. */
-# if @UNISTD_H_HAVE_WINSOCK2_H@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef gethostname
-# define gethostname rpl_gethostname
-# endif
-_GL_FUNCDECL_RPL (gethostname, int, (char *name, size_t len)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (gethostname, int, (char *name, size_t len));
-# else
-# if !@HAVE_GETHOSTNAME@
-_GL_FUNCDECL_SYS (gethostname, int, (char *name, size_t len)
- _GL_ARG_NONNULL ((1)));
-# endif
-/* Need to cast, because on Solaris 10 and OSF/1 5.1 systems, the second
- parameter is
- int len. */
-_GL_CXXALIAS_SYS_CAST (gethostname, int, (char *name, size_t len));
-# endif
-_GL_CXXALIASWARN (gethostname);
-#elif @UNISTD_H_HAVE_WINSOCK2_H@
-# undef gethostname
-# define gethostname gethostname_used_without_requesting_gnulib_module_gethostname
-#elif defined GNULIB_POSIXCHECK
-# undef gethostname
-# if HAVE_RAW_DECL_GETHOSTNAME
-_GL_WARN_ON_USE (gethostname, "gethostname is unportable - "
- "use gnulib module gethostname for portability");
-# endif
-#endif
-
-
-#if @GNULIB_GETLOGIN@
-/* Returns the user's login name, or NULL if it cannot be found. Upon error,
- returns NULL with errno set.
-
- See <https://pubs.opengroup.org/onlinepubs/9699919799/functions/getlogin.html>.
-
- Most programs don't need to use this function, because the information is
- available through environment variables:
- ${LOGNAME-$USER} on Unix platforms,
- $USERNAME on native Windows platforms.
- */
-# if !@HAVE_DECL_GETLOGIN@
-_GL_FUNCDECL_SYS (getlogin, char *, (void));
-# endif
-_GL_CXXALIAS_SYS (getlogin, char *, (void));
-_GL_CXXALIASWARN (getlogin);
-#elif defined GNULIB_POSIXCHECK
-# undef getlogin
-# if HAVE_RAW_DECL_GETLOGIN
-_GL_WARN_ON_USE (getlogin, "getlogin is unportable - "
- "use gnulib module getlogin for portability");
-# endif
-#endif
-
-
-#if @GNULIB_GETLOGIN_R@
-/* Copies the user's login name to NAME.
- The array pointed to by NAME has room for SIZE bytes.
-
- Returns 0 if successful. Upon error, an error number is returned, or -1 in
- the case that the login name cannot be found but no specific error is
- provided (this case is hopefully rare but is left open by the POSIX spec).
-
- See <https://pubs.opengroup.org/onlinepubs/9699919799/functions/getlogin.html>.
-
- Most programs don't need to use this function, because the information is
- available through environment variables:
- ${LOGNAME-$USER} on Unix platforms,
- $USERNAME on native Windows platforms.
- */
-# if @REPLACE_GETLOGIN_R@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define getlogin_r rpl_getlogin_r
-# endif
-_GL_FUNCDECL_RPL (getlogin_r, int, (char *name, size_t size)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (getlogin_r, int, (char *name, size_t size));
-# else
-# if !@HAVE_DECL_GETLOGIN_R@
-_GL_FUNCDECL_SYS (getlogin_r, int, (char *name, size_t size)
- _GL_ARG_NONNULL ((1)));
-# endif
-/* Need to cast, because on Solaris 10 systems, the second argument is
- int size. */
-_GL_CXXALIAS_SYS_CAST (getlogin_r, int, (char *name, size_t size));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (getlogin_r);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef getlogin_r
-# if HAVE_RAW_DECL_GETLOGIN_R
-_GL_WARN_ON_USE (getlogin_r, "getlogin_r is unportable - "
- "use gnulib module getlogin_r for portability");
-# endif
-#endif
-
-
-#if @GNULIB_GETPAGESIZE@
-# if @REPLACE_GETPAGESIZE@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define getpagesize rpl_getpagesize
-# endif
-_GL_FUNCDECL_RPL (getpagesize, int, (void));
-_GL_CXXALIAS_RPL (getpagesize, int, (void));
-# else
-/* On HP-UX, getpagesize exists, but it is not declared in <unistd.h> even if
- the compiler options -D_HPUX_SOURCE -D_XOPEN_SOURCE=600 are used. */
-# if defined __hpux
-_GL_FUNCDECL_SYS (getpagesize, int, (void));
-# endif
-# if !@HAVE_GETPAGESIZE@
-# if !defined getpagesize
-/* This is for POSIX systems. */
-# if !defined _gl_getpagesize && defined _SC_PAGESIZE
-# if ! (defined __VMS && __VMS_VER < 70000000)
-# define _gl_getpagesize() sysconf (_SC_PAGESIZE)
-# endif
-# endif
-/* This is for older VMS. */
-# if !defined _gl_getpagesize && defined __VMS
-# ifdef __ALPHA
-# define _gl_getpagesize() 8192
-# else
-# define _gl_getpagesize() 512
-# endif
-# endif
-/* This is for BeOS. */
-# if !defined _gl_getpagesize && @HAVE_OS_H@
-# include <OS.h>
-# if defined B_PAGE_SIZE
-# define _gl_getpagesize() B_PAGE_SIZE
-# endif
-# endif
-/* This is for AmigaOS4.0. */
-# if !defined _gl_getpagesize && defined __amigaos4__
-# define _gl_getpagesize() 2048
-# endif
-/* This is for older Unix systems. */
-# if !defined _gl_getpagesize && @HAVE_SYS_PARAM_H@
-# include <sys/param.h>
-# ifdef EXEC_PAGESIZE
-# define _gl_getpagesize() EXEC_PAGESIZE
-# else
-# ifdef NBPG
-# ifndef CLSIZE
-# define CLSIZE 1
-# endif
-# define _gl_getpagesize() (NBPG * CLSIZE)
-# else
-# ifdef NBPC
-# define _gl_getpagesize() NBPC
-# endif
-# endif
-# endif
-# endif
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define getpagesize() _gl_getpagesize ()
-# else
-# if !GNULIB_defined_getpagesize_function
-_GL_UNISTD_INLINE int
-getpagesize ()
-{
- return _gl_getpagesize ();
-}
-# define GNULIB_defined_getpagesize_function 1
-# endif
-# endif
-# endif
-# endif
-/* Need to cast, because on Cygwin 1.5.x systems, the return type is size_t. */
-_GL_CXXALIAS_SYS_CAST (getpagesize, int, (void));
-# endif
-# if @HAVE_DECL_GETPAGESIZE@
-_GL_CXXALIASWARN (getpagesize);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef getpagesize
-# if HAVE_RAW_DECL_GETPAGESIZE
-_GL_WARN_ON_USE (getpagesize, "getpagesize is unportable - "
- "use gnulib module getpagesize for portability");
-# endif
-#endif
-
-
-#if @GNULIB_GETPASS@
-/* Function getpass() from module 'getpass':
- Read a password from /dev/tty or stdin.
- Function getpass() from module 'getpass-gnu':
- Read a password of arbitrary length from /dev/tty or stdin. */
-# if (@GNULIB_GETPASS@ && @REPLACE_GETPASS@) \
- || (@GNULIB_GETPASS_GNU@ && @REPLACE_GETPASS_FOR_GETPASS_GNU@)
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef getpass
-# define getpass rpl_getpass
-# endif
-_GL_FUNCDECL_RPL (getpass, char *, (const char *prompt)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (getpass, char *, (const char *prompt));
-# else
-# if !@HAVE_GETPASS@
-_GL_FUNCDECL_SYS (getpass, char *, (const char *prompt)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (getpass, char *, (const char *prompt));
-# endif
-_GL_CXXALIASWARN (getpass);
-#elif defined GNULIB_POSIXCHECK
-# undef getpass
-# if HAVE_RAW_DECL_GETPASS
-_GL_WARN_ON_USE (getpass, "getpass is unportable - "
- "use gnulib module getpass or getpass-gnu for portability");
-# endif
-#endif
-
-
-#if @GNULIB_MDA_GETPID@
-/* On native Windows, map 'getpid' to '_getpid', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::getpid always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef getpid
-# define getpid _getpid
-# endif
-_GL_CXXALIAS_MDA (getpid, int, (void));
-# else
-_GL_CXXALIAS_SYS (getpid, pid_t, (void));
-# endif
-_GL_CXXALIASWARN (getpid);
-#endif
-
-
-#if @GNULIB_GETUSERSHELL@
-/* Return the next valid login shell on the system, or NULL when the end of
- the list has been reached. */
-# if !@HAVE_DECL_GETUSERSHELL@
-_GL_FUNCDECL_SYS (getusershell, char *, (void));
-# endif
-_GL_CXXALIAS_SYS (getusershell, char *, (void));
-_GL_CXXALIASWARN (getusershell);
-#elif defined GNULIB_POSIXCHECK
-# undef getusershell
-# if HAVE_RAW_DECL_GETUSERSHELL
-_GL_WARN_ON_USE (getusershell, "getusershell is unportable - "
- "use gnulib module getusershell for portability");
-# endif
-#endif
-
-#if @GNULIB_GETUSERSHELL@
-/* Rewind to pointer that is advanced at each getusershell() call. */
-# if !@HAVE_DECL_GETUSERSHELL@
-_GL_FUNCDECL_SYS (setusershell, void, (void));
-# endif
-_GL_CXXALIAS_SYS (setusershell, void, (void));
-_GL_CXXALIASWARN (setusershell);
-#elif defined GNULIB_POSIXCHECK
-# undef setusershell
-# if HAVE_RAW_DECL_SETUSERSHELL
-_GL_WARN_ON_USE (setusershell, "setusershell is unportable - "
- "use gnulib module getusershell for portability");
-# endif
-#endif
-
-#if @GNULIB_GETUSERSHELL@
-/* Free the pointer that is advanced at each getusershell() call and
- associated resources. */
-# if !@HAVE_DECL_GETUSERSHELL@
-_GL_FUNCDECL_SYS (endusershell, void, (void));
-# endif
-_GL_CXXALIAS_SYS (endusershell, void, (void));
-_GL_CXXALIASWARN (endusershell);
-#elif defined GNULIB_POSIXCHECK
-# undef endusershell
-# if HAVE_RAW_DECL_ENDUSERSHELL
-_GL_WARN_ON_USE (endusershell, "endusershell is unportable - "
- "use gnulib module getusershell for portability");
-# endif
-#endif
-
-
-#if @GNULIB_GROUP_MEMBER@
-/* Determine whether group id is in calling user's group list. */
-# if !@HAVE_GROUP_MEMBER@
-_GL_FUNCDECL_SYS (group_member, int, (gid_t gid));
-# endif
-_GL_CXXALIAS_SYS (group_member, int, (gid_t gid));
-_GL_CXXALIASWARN (group_member);
-#elif defined GNULIB_POSIXCHECK
-# undef group_member
-# if HAVE_RAW_DECL_GROUP_MEMBER
-_GL_WARN_ON_USE (group_member, "group_member is unportable - "
- "use gnulib module group-member for portability");
-# endif
-#endif
-
-
-#if @GNULIB_ISATTY@
-# if @REPLACE_ISATTY@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef isatty
-# define isatty rpl_isatty
-# endif
-# define GNULIB_defined_isatty 1
-_GL_FUNCDECL_RPL (isatty, int, (int fd));
-_GL_CXXALIAS_RPL (isatty, int, (int fd));
-# elif defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef isatty
-# define isatty _isatty
-# endif
-_GL_CXXALIAS_MDA (isatty, int, (int fd));
-# else
-_GL_CXXALIAS_SYS (isatty, int, (int fd));
-# endif
-_GL_CXXALIASWARN (isatty);
-#elif defined GNULIB_POSIXCHECK
-# undef isatty
-# if HAVE_RAW_DECL_ISATTY
-_GL_WARN_ON_USE (isatty, "isatty has portability problems on native Windows - "
- "use gnulib module isatty for portability");
-# endif
-#elif @GNULIB_MDA_ISATTY@
-/* On native Windows, map 'isatty' to '_isatty', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::isatty always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef isatty
-# define isatty _isatty
-# endif
-_GL_CXXALIAS_MDA (isatty, int, (int fd));
-# else
-_GL_CXXALIAS_SYS (isatty, int, (int fd));
-# endif
-_GL_CXXALIASWARN (isatty);
-#endif
-
-
-#if @GNULIB_LCHOWN@
-/* Change the owner of FILE to UID (if UID is not -1) and the group of FILE
- to GID (if GID is not -1). Do not follow symbolic links.
- Return 0 if successful, otherwise -1 and errno set.
- See the POSIX:2008 specification
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/lchown.html>. */
-# if @REPLACE_LCHOWN@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef lchown
-# define lchown rpl_lchown
-# endif
-_GL_FUNCDECL_RPL (lchown, int, (char const *file, uid_t owner, gid_t group)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (lchown, int, (char const *file, uid_t owner, gid_t group));
-# else
-# if !@HAVE_LCHOWN@
-_GL_FUNCDECL_SYS (lchown, int, (char const *file, uid_t owner, gid_t group)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (lchown, int, (char const *file, uid_t owner, gid_t group));
-# endif
-_GL_CXXALIASWARN (lchown);
-#elif defined GNULIB_POSIXCHECK
-# undef lchown
-# if HAVE_RAW_DECL_LCHOWN
-_GL_WARN_ON_USE (lchown, "lchown is unportable to pre-POSIX.1-2001 systems - "
- "use gnulib module lchown for portability");
-# endif
-#endif
-
-
-#if @GNULIB_LINK@
-/* Create a new hard link for an existing file.
- Return 0 if successful, otherwise -1 and errno set.
- See POSIX:2008 specification
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/link.html>. */
-# if @REPLACE_LINK@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define link rpl_link
-# endif
-_GL_FUNCDECL_RPL (link, int, (const char *path1, const char *path2)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (link, int, (const char *path1, const char *path2));
-# else
-# if !@HAVE_LINK@
-_GL_FUNCDECL_SYS (link, int, (const char *path1, const char *path2)
- _GL_ARG_NONNULL ((1, 2)));
-# endif
-_GL_CXXALIAS_SYS (link, int, (const char *path1, const char *path2));
-# endif
-_GL_CXXALIASWARN (link);
-#elif defined GNULIB_POSIXCHECK
-# undef link
-# if HAVE_RAW_DECL_LINK
-_GL_WARN_ON_USE (link, "link is unportable - "
- "use gnulib module link for portability");
-# endif
-#endif
-
-
-#if @GNULIB_LINKAT@
-/* Create a new hard link for an existing file, relative to two
- directories. FLAG controls whether symlinks are followed.
- Return 0 if successful, otherwise -1 and errno set. */
-# if @REPLACE_LINKAT@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef linkat
-# define linkat rpl_linkat
-# endif
-_GL_FUNCDECL_RPL (linkat, int,
- (int fd1, const char *path1, int fd2, const char *path2,
- int flag)
- _GL_ARG_NONNULL ((2, 4)));
-_GL_CXXALIAS_RPL (linkat, int,
- (int fd1, const char *path1, int fd2, const char *path2,
- int flag));
-# else
-# if !@HAVE_LINKAT@
-_GL_FUNCDECL_SYS (linkat, int,
- (int fd1, const char *path1, int fd2, const char *path2,
- int flag)
- _GL_ARG_NONNULL ((2, 4)));
-# endif
-_GL_CXXALIAS_SYS (linkat, int,
- (int fd1, const char *path1, int fd2, const char *path2,
- int flag));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (linkat);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef linkat
-# if HAVE_RAW_DECL_LINKAT
-_GL_WARN_ON_USE (linkat, "linkat is unportable - "
- "use gnulib module linkat for portability");
-# endif
-#endif
-
-
-#if @GNULIB_LSEEK@
-/* Set the offset of FD relative to SEEK_SET, SEEK_CUR, or SEEK_END.
- Return the new offset if successful, otherwise -1 and errno set.
- See the POSIX:2008 specification
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/lseek.html>. */
-# if @REPLACE_LSEEK@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define lseek rpl_lseek
-# endif
-_GL_FUNCDECL_RPL (lseek, off_t, (int fd, off_t offset, int whence));
-_GL_CXXALIAS_RPL (lseek, off_t, (int fd, off_t offset, int whence));
-# elif defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef lseek
-# define lseek _lseek
-# endif
-_GL_CXXALIAS_MDA (lseek, off_t, (int fd, off_t offset, int whence));
-# else
-_GL_CXXALIAS_SYS (lseek, off_t, (int fd, off_t offset, int whence));
-# endif
-_GL_CXXALIASWARN (lseek);
-#elif defined GNULIB_POSIXCHECK
-# undef lseek
-# if HAVE_RAW_DECL_LSEEK
-_GL_WARN_ON_USE (lseek, "lseek does not fail with ESPIPE on pipes on some "
- "systems - use gnulib module lseek for portability");
-# endif
-#elif @GNULIB_MDA_LSEEK@
-/* On native Windows, map 'lseek' to '_lseek', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::lseek always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef lseek
-# define lseek _lseek
-# endif
-_GL_CXXALIAS_MDA (lseek, long, (int fd, long offset, int whence));
-# else
-_GL_CXXALIAS_SYS (lseek, off_t, (int fd, off_t offset, int whence));
-# endif
-_GL_CXXALIASWARN (lseek);
-#endif
-
-
-#if @GNULIB_PIPE@
-/* Create a pipe, defaulting to O_BINARY mode.
- Store the read-end as fd[0] and the write-end as fd[1].
- Return 0 upon success, or -1 with errno set upon failure. */
-# if !@HAVE_PIPE@
-_GL_FUNCDECL_SYS (pipe, int, (int fd[2]) _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (pipe, int, (int fd[2]));
-_GL_CXXALIASWARN (pipe);
-#elif defined GNULIB_POSIXCHECK
-# undef pipe
-# if HAVE_RAW_DECL_PIPE
-_GL_WARN_ON_USE (pipe, "pipe is unportable - "
- "use gnulib module pipe-posix for portability");
-# endif
-#endif
-
-
-#if @GNULIB_PIPE2@
-/* Create a pipe, applying the given flags when opening the read-end of the
- pipe and the write-end of the pipe.
- The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
- and O_TEXT, O_BINARY (defined in "binary-io.h").
- Store the read-end as fd[0] and the write-end as fd[1].
- Return 0 upon success, or -1 with errno set upon failure.
- See also the Linux man page at
- <https://www.kernel.org/doc/man-pages/online/pages/man2/pipe2.2.html>. */
-# if @REPLACE_PIPE2@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef pipe2
-# define pipe2 rpl_pipe2
-# endif
-_GL_FUNCDECL_RPL (pipe2, int, (int fd[2], int flags) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (pipe2, int, (int fd[2], int flags));
-# else
-_GL_FUNCDECL_SYS (pipe2, int, (int fd[2], int flags) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_SYS (pipe2, int, (int fd[2], int flags));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (pipe2);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef pipe2
-# if HAVE_RAW_DECL_PIPE2
-_GL_WARN_ON_USE (pipe2, "pipe2 is unportable - "
- "use gnulib module pipe2 for portability");
-# endif
-#endif
-
-
-#if @GNULIB_PREAD@
-/* Read at most BUFSIZE bytes from FD into BUF, starting at OFFSET.
- Return the number of bytes placed into BUF if successful, otherwise
- set errno and return -1. 0 indicates EOF.
- See the POSIX:2008 specification
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/pread.html>. */
-# if @REPLACE_PREAD@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef pread
-# define pread rpl_pread
-# endif
-_GL_FUNCDECL_RPL (pread, ssize_t,
- (int fd, void *buf, size_t bufsize, off_t offset)
- _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (pread, ssize_t,
- (int fd, void *buf, size_t bufsize, off_t offset));
-# else
-# if !@HAVE_PREAD@
-_GL_FUNCDECL_SYS (pread, ssize_t,
- (int fd, void *buf, size_t bufsize, off_t offset)
- _GL_ARG_NONNULL ((2)));
-# endif
-_GL_CXXALIAS_SYS (pread, ssize_t,
- (int fd, void *buf, size_t bufsize, off_t offset));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (pread);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef pread
-# if HAVE_RAW_DECL_PREAD
-_GL_WARN_ON_USE (pread, "pread is unportable - "
- "use gnulib module pread for portability");
-# endif
-#endif
-
-
-#if @GNULIB_PWRITE@
-/* Write at most BUFSIZE bytes from BUF into FD, starting at OFFSET.
- Return the number of bytes written if successful, otherwise
- set errno and return -1. 0 indicates nothing written. See the
- POSIX:2008 specification
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/pwrite.html>. */
-# if @REPLACE_PWRITE@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef pwrite
-# define pwrite rpl_pwrite
-# endif
-_GL_FUNCDECL_RPL (pwrite, ssize_t,
- (int fd, const void *buf, size_t bufsize, off_t offset)
- _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (pwrite, ssize_t,
- (int fd, const void *buf, size_t bufsize, off_t offset));
-# else
-# if !@HAVE_PWRITE@
-_GL_FUNCDECL_SYS (pwrite, ssize_t,
- (int fd, const void *buf, size_t bufsize, off_t offset)
- _GL_ARG_NONNULL ((2)));
-# endif
-_GL_CXXALIAS_SYS (pwrite, ssize_t,
- (int fd, const void *buf, size_t bufsize, off_t offset));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (pwrite);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef pwrite
-# if HAVE_RAW_DECL_PWRITE
-_GL_WARN_ON_USE (pwrite, "pwrite is unportable - "
- "use gnulib module pwrite for portability");
-# endif
-#endif
-
-
-#if @GNULIB_READ@
-/* Read up to COUNT bytes from file descriptor FD into the buffer starting
- at BUF. See the POSIX:2008 specification
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/read.html>. */
-# if @REPLACE_READ@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef read
-# define read rpl_read
-# endif
-_GL_FUNCDECL_RPL (read, ssize_t, (int fd, void *buf, size_t count)
- _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (read, ssize_t, (int fd, void *buf, size_t count));
-# elif defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef read
-# define read _read
-# endif
-_GL_CXXALIAS_MDA (read, ssize_t, (int fd, void *buf, size_t count));
-# else
-_GL_CXXALIAS_SYS (read, ssize_t, (int fd, void *buf, size_t count));
-# endif
-_GL_CXXALIASWARN (read);
-#elif @GNULIB_MDA_READ@
-/* On native Windows, map 'read' to '_read', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::read always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef read
-# define read _read
-# endif
-# ifdef __MINGW32__
-_GL_CXXALIAS_MDA (read, int, (int fd, void *buf, unsigned int count));
-# else
-_GL_CXXALIAS_MDA (read, ssize_t, (int fd, void *buf, unsigned int count));
-# endif
-# else
-_GL_CXXALIAS_SYS (read, ssize_t, (int fd, void *buf, size_t count));
-# endif
-_GL_CXXALIASWARN (read);
-#endif
-
-
-#if @GNULIB_READLINK@
-/* Read the contents of the symbolic link FILE and place the first BUFSIZE
- bytes of it into BUF. Return the number of bytes placed into BUF if
- successful, otherwise -1 and errno set.
- See the POSIX:2008 specification
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/readlink.html>. */
-# if @REPLACE_READLINK@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define readlink rpl_readlink
-# endif
-_GL_FUNCDECL_RPL (readlink, ssize_t,
- (const char *restrict file,
- char *restrict buf, size_t bufsize)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (readlink, ssize_t,
- (const char *restrict file,
- char *restrict buf, size_t bufsize));
-# else
-# if !@HAVE_READLINK@
-_GL_FUNCDECL_SYS (readlink, ssize_t,
- (const char *restrict file,
- char *restrict buf, size_t bufsize)
- _GL_ARG_NONNULL ((1, 2)));
-# endif
-_GL_CXXALIAS_SYS (readlink, ssize_t,
- (const char *restrict file,
- char *restrict buf, size_t bufsize));
-# endif
-_GL_CXXALIASWARN (readlink);
-#elif defined GNULIB_POSIXCHECK
-# undef readlink
-# if HAVE_RAW_DECL_READLINK
-_GL_WARN_ON_USE (readlink, "readlink is unportable - "
- "use gnulib module readlink for portability");
-# endif
-#endif
-
-
-#if @GNULIB_READLINKAT@
-# if @REPLACE_READLINKAT@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define readlinkat rpl_readlinkat
-# endif
-_GL_FUNCDECL_RPL (readlinkat, ssize_t,
- (int fd, char const *restrict file,
- char *restrict buf, size_t len)
- _GL_ARG_NONNULL ((2, 3)));
-_GL_CXXALIAS_RPL (readlinkat, ssize_t,
- (int fd, char const *restrict file,
- char *restrict buf, size_t len));
-# else
-# if !@HAVE_READLINKAT@
-_GL_FUNCDECL_SYS (readlinkat, ssize_t,
- (int fd, char const *restrict file,
- char *restrict buf, size_t len)
- _GL_ARG_NONNULL ((2, 3)));
-# endif
-_GL_CXXALIAS_SYS (readlinkat, ssize_t,
- (int fd, char const *restrict file,
- char *restrict buf, size_t len));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (readlinkat);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef readlinkat
-# if HAVE_RAW_DECL_READLINKAT
-_GL_WARN_ON_USE (readlinkat, "readlinkat is not portable - "
- "use gnulib module readlinkat for portability");
-# endif
-#endif
-
-
-#if @GNULIB_RMDIR@
-/* Remove the directory DIR. */
-# if @REPLACE_RMDIR@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define rmdir rpl_rmdir
-# endif
-_GL_FUNCDECL_RPL (rmdir, int, (char const *name) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (rmdir, int, (char const *name));
-# elif defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef rmdir
-# define rmdir _rmdir
-# endif
-_GL_CXXALIAS_MDA (rmdir, int, (char const *name));
-# else
-_GL_CXXALIAS_SYS (rmdir, int, (char const *name));
-# endif
-_GL_CXXALIASWARN (rmdir);
-#elif defined GNULIB_POSIXCHECK
-# undef rmdir
-# if HAVE_RAW_DECL_RMDIR
-_GL_WARN_ON_USE (rmdir, "rmdir is unportable - "
- "use gnulib module rmdir for portability");
-# endif
-#elif @GNULIB_MDA_RMDIR@
-/* On native Windows, map 'rmdir' to '_rmdir', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::rmdir always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef rmdir
-# define rmdir _rmdir
-# endif
-_GL_CXXALIAS_MDA (rmdir, int, (char const *name));
-# else
-_GL_CXXALIAS_SYS (rmdir, int, (char const *name));
-# endif
-_GL_CXXALIASWARN (rmdir);
-#endif
-
-
-#if @GNULIB_SETHOSTNAME@
-/* Set the host name of the machine.
- The host name may or may not be fully qualified.
-
- Put LEN bytes of NAME into the host name.
- Return 0 if successful, otherwise, set errno and return -1.
-
- Platforms with no ability to set the hostname return -1 and set
- errno = ENOSYS. */
-# if @REPLACE_SETHOSTNAME@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef sethostname
-# define sethostname rpl_sethostname
-# endif
-_GL_FUNCDECL_RPL (sethostname, int, (const char *name, size_t len)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (sethostname, int, (const char *name, size_t len));
-# else
-# if !@HAVE_SETHOSTNAME@ || !@HAVE_DECL_SETHOSTNAME@
-_GL_FUNCDECL_SYS (sethostname, int, (const char *name, size_t len)
- _GL_ARG_NONNULL ((1)));
-# endif
-/* Need to cast, because on Solaris 11 2011-10, Mac OS X 10.5, IRIX 6.5
- and FreeBSD 6.4 the second parameter is int. On Solaris 11
- 2011-10, the first parameter is not const. */
-_GL_CXXALIAS_SYS_CAST (sethostname, int, (const char *name, size_t len));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (sethostname);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef sethostname
-# if HAVE_RAW_DECL_SETHOSTNAME
-_GL_WARN_ON_USE (sethostname, "sethostname is unportable - "
- "use gnulib module sethostname for portability");
-# endif
-#endif
-
-
-#if @GNULIB_SLEEP@
-/* Pause the execution of the current thread for N seconds.
- Returns the number of seconds left to sleep.
- See the POSIX:2008 specification
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/sleep.html>. */
-# if @REPLACE_SLEEP@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef sleep
-# define sleep rpl_sleep
-# endif
-_GL_FUNCDECL_RPL (sleep, unsigned int, (unsigned int n));
-_GL_CXXALIAS_RPL (sleep, unsigned int, (unsigned int n));
-# else
-# if !@HAVE_SLEEP@
-_GL_FUNCDECL_SYS (sleep, unsigned int, (unsigned int n));
-# endif
-_GL_CXXALIAS_SYS (sleep, unsigned int, (unsigned int n));
-# endif
-_GL_CXXALIASWARN (sleep);
-#elif defined GNULIB_POSIXCHECK
-# undef sleep
-# if HAVE_RAW_DECL_SLEEP
-_GL_WARN_ON_USE (sleep, "sleep is unportable - "
- "use gnulib module sleep for portability");
-# endif
-#endif
-
-
-#if @GNULIB_MDA_SWAB@
-/* On native Windows, map 'swab' to '_swab', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::swab always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef swab
-# define swab _swab
-# endif
-/* Need to cast, because in old mingw the arguments are
- (const char *from, char *to, size_t n). */
-_GL_CXXALIAS_MDA_CAST (swab, void, (char *from, char *to, int n));
-# else
-# if defined __hpux /* HP-UX */
-_GL_CXXALIAS_SYS (swab, void, (const char *from, char *to, int n));
-# elif defined __sun && (defined __SunOS_5_10 || defined __XOPEN_OR_POSIX) && !defined _XPG4 /* Solaris */
-_GL_CXXALIAS_SYS (swab, void, (const char *from, char *to, ssize_t n));
-# else
-_GL_CXXALIAS_SYS (swab, void, (const void *from, void *to, ssize_t n));
-# endif
-# endif
-_GL_CXXALIASWARN (swab);
-#endif
-
-
-#if @GNULIB_SYMLINK@
-# if @REPLACE_SYMLINK@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef symlink
-# define symlink rpl_symlink
-# endif
-_GL_FUNCDECL_RPL (symlink, int, (char const *contents, char const *file)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (symlink, int, (char const *contents, char const *file));
-# else
-# if !@HAVE_SYMLINK@
-_GL_FUNCDECL_SYS (symlink, int, (char const *contents, char const *file)
- _GL_ARG_NONNULL ((1, 2)));
-# endif
-_GL_CXXALIAS_SYS (symlink, int, (char const *contents, char const *file));
-# endif
-_GL_CXXALIASWARN (symlink);
-#elif defined GNULIB_POSIXCHECK
-# undef symlink
-# if HAVE_RAW_DECL_SYMLINK
-_GL_WARN_ON_USE (symlink, "symlink is not portable - "
- "use gnulib module symlink for portability");
-# endif
-#endif
-
-
-#if @GNULIB_SYMLINKAT@
-# if @REPLACE_SYMLINKAT@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef symlinkat
-# define symlinkat rpl_symlinkat
-# endif
-_GL_FUNCDECL_RPL (symlinkat, int,
- (char const *contents, int fd, char const *file)
- _GL_ARG_NONNULL ((1, 3)));
-_GL_CXXALIAS_RPL (symlinkat, int,
- (char const *contents, int fd, char const *file));
-# else
-# if !@HAVE_SYMLINKAT@
-_GL_FUNCDECL_SYS (symlinkat, int,
- (char const *contents, int fd, char const *file)
- _GL_ARG_NONNULL ((1, 3)));
-# endif
-_GL_CXXALIAS_SYS (symlinkat, int,
- (char const *contents, int fd, char const *file));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (symlinkat);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef symlinkat
-# if HAVE_RAW_DECL_SYMLINKAT
-_GL_WARN_ON_USE (symlinkat, "symlinkat is not portable - "
- "use gnulib module symlinkat for portability");
-# endif
-#endif
-
-
-#if @GNULIB_TRUNCATE@
-/* Change the size of the file designated by FILENAME to become equal to LENGTH.
- Return 0 if successful, otherwise -1 and errno set.
- See the POSIX:2008 specification
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/truncate.html>. */
-# if @REPLACE_TRUNCATE@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef truncate
-# define truncate rpl_truncate
-# endif
-_GL_FUNCDECL_RPL (truncate, int, (const char *filename, off_t length)
- _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (truncate, int, (const char *filename, off_t length));
-# else
-# if !@HAVE_DECL_TRUNCATE@
-_GL_FUNCDECL_SYS (truncate, int, (const char *filename, off_t length)
- _GL_ARG_NONNULL ((1)));
-# endif
-_GL_CXXALIAS_SYS (truncate, int, (const char *filename, off_t length));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (truncate);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef truncate
-# if HAVE_RAW_DECL_TRUNCATE
-_GL_WARN_ON_USE (truncate, "truncate is unportable - "
- "use gnulib module truncate for portability");
-# endif
-#endif
-
-
-#if @GNULIB_TTYNAME_R@
-/* Store at most BUFLEN characters of the pathname of the terminal FD is
- open on in BUF. Return 0 on success, otherwise an error number. */
-# if @REPLACE_TTYNAME_R@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef ttyname_r
-# define ttyname_r rpl_ttyname_r
-# endif
-_GL_FUNCDECL_RPL (ttyname_r, int,
- (int fd, char *buf, size_t buflen) _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (ttyname_r, int,
- (int fd, char *buf, size_t buflen));
-# else
-# if !@HAVE_DECL_TTYNAME_R@
-_GL_FUNCDECL_SYS (ttyname_r, int,
- (int fd, char *buf, size_t buflen) _GL_ARG_NONNULL ((2)));
-# endif
-_GL_CXXALIAS_SYS (ttyname_r, int,
- (int fd, char *buf, size_t buflen));
-# endif
-# if __GLIBC__ >= 2
-_GL_CXXALIASWARN (ttyname_r);
-# endif
-#elif defined GNULIB_POSIXCHECK
-# undef ttyname_r
-# if HAVE_RAW_DECL_TTYNAME_R
-_GL_WARN_ON_USE (ttyname_r, "ttyname_r is not portable - "
- "use gnulib module ttyname_r for portability");
-# endif
-#endif
-
-
-#if @GNULIB_UNLINK@
-# if @REPLACE_UNLINK@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef unlink
-# define unlink rpl_unlink
-# endif
-_GL_FUNCDECL_RPL (unlink, int, (char const *file) _GL_ARG_NONNULL ((1)));
-_GL_CXXALIAS_RPL (unlink, int, (char const *file));
-# elif defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef unlink
-# define unlink _unlink
-# endif
-_GL_CXXALIAS_MDA (unlink, int, (char const *file));
-# else
-_GL_CXXALIAS_SYS (unlink, int, (char const *file));
-# endif
-_GL_CXXALIASWARN (unlink);
-#elif defined GNULIB_POSIXCHECK
-# undef unlink
-# if HAVE_RAW_DECL_UNLINK
-_GL_WARN_ON_USE (unlink, "unlink is not portable - "
- "use gnulib module unlink for portability");
-# endif
-#elif @GNULIB_MDA_UNLINK@
-/* On native Windows, map 'unlink' to '_unlink', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::unlink always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef unlink
-# define unlink _unlink
-# endif
-_GL_CXXALIAS_MDA (unlink, int, (char const *file));
-# else
-_GL_CXXALIAS_SYS (unlink, int, (char const *file));
-# endif
-_GL_CXXALIASWARN (unlink);
-#endif
-
-
-#if @GNULIB_UNLINKAT@
-# if @REPLACE_UNLINKAT@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef unlinkat
-# define unlinkat rpl_unlinkat
-# endif
-_GL_FUNCDECL_RPL (unlinkat, int, (int fd, char const *file, int flag)
- _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (unlinkat, int, (int fd, char const *file, int flag));
-# else
-# if !@HAVE_UNLINKAT@
-_GL_FUNCDECL_SYS (unlinkat, int, (int fd, char const *file, int flag)
- _GL_ARG_NONNULL ((2)));
-# endif
-_GL_CXXALIAS_SYS (unlinkat, int, (int fd, char const *file, int flag));
-# endif
-_GL_CXXALIASWARN (unlinkat);
-#elif defined GNULIB_POSIXCHECK
-# undef unlinkat
-# if HAVE_RAW_DECL_UNLINKAT
-_GL_WARN_ON_USE (unlinkat, "unlinkat is not portable - "
- "use gnulib module unlinkat for portability");
-# endif
-#endif
-
-
-#if @GNULIB_USLEEP@
-/* Pause the execution of the current thread for N microseconds.
- Returns 0 on completion, or -1 on range error.
- See the POSIX:2001 specification
- <https://pubs.opengroup.org/onlinepubs/009695399/functions/usleep.html>. */
-# if @REPLACE_USLEEP@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef usleep
-# define usleep rpl_usleep
-# endif
-_GL_FUNCDECL_RPL (usleep, int, (useconds_t n));
-_GL_CXXALIAS_RPL (usleep, int, (useconds_t n));
-# else
-# if !@HAVE_USLEEP@
-_GL_FUNCDECL_SYS (usleep, int, (useconds_t n));
-# endif
-/* Need to cast, because on Haiku, the first parameter is
- unsigned int n. */
-_GL_CXXALIAS_SYS_CAST (usleep, int, (useconds_t n));
-# endif
-_GL_CXXALIASWARN (usleep);
-#elif defined GNULIB_POSIXCHECK
-# undef usleep
-# if HAVE_RAW_DECL_USLEEP
-_GL_WARN_ON_USE (usleep, "usleep is unportable - "
- "use gnulib module usleep for portability");
-# endif
-#endif
-
-
-#if @GNULIB_WRITE@
-/* Write up to COUNT bytes starting at BUF to file descriptor FD.
- See the POSIX:2008 specification
- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html>. */
-# if @REPLACE_WRITE@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef write
-# define write rpl_write
-# endif
-_GL_FUNCDECL_RPL (write, ssize_t, (int fd, const void *buf, size_t count)
- _GL_ARG_NONNULL ((2)));
-_GL_CXXALIAS_RPL (write, ssize_t, (int fd, const void *buf, size_t count));
-# elif defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef write
-# define write _write
-# endif
-_GL_CXXALIAS_MDA (write, ssize_t, (int fd, const void *buf, size_t count));
-# else
-_GL_CXXALIAS_SYS (write, ssize_t, (int fd, const void *buf, size_t count));
-# endif
-_GL_CXXALIASWARN (write);
-#elif @GNULIB_MDA_WRITE@
-/* On native Windows, map 'write' to '_write', so that -loldnames is not
- required. In C++ with GNULIB_NAMESPACE, avoid differences between
- platforms by defining GNULIB_NAMESPACE::write always. */
-# if defined _WIN32 && !defined __CYGWIN__
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# undef write
-# define write _write
-# endif
-# ifdef __MINGW32__
-_GL_CXXALIAS_MDA (write, int, (int fd, const void *buf, unsigned int count));
-# else
-_GL_CXXALIAS_MDA (write, ssize_t, (int fd, const void *buf, unsigned int count));
-# endif
-# else
-_GL_CXXALIAS_SYS (write, ssize_t, (int fd, const void *buf, size_t count));
-# endif
-_GL_CXXALIASWARN (write);
-#endif
-
-_GL_INLINE_HEADER_END
-
-#endif /* _@GUARD_PREFIX@_UNISTD_H */
-#endif /* _GL_INCLUDING_UNISTD_H */
-#endif /* _@GUARD_PREFIX@_UNISTD_H */
diff --git a/cross/lib/unlocked-io.h b/cross/lib/unlocked-io.h
deleted file mode 100644
index fdef624ab9c..00000000000
--- a/cross/lib/unlocked-io.h
+++ /dev/null
@@ -1,136 +0,0 @@
-/* Prefer faster, non-thread-safe stdio functions if available.
-
- Copyright (C) 2001-2004, 2009-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Jim Meyering. */
-
-#ifndef UNLOCKED_IO_H
-# define UNLOCKED_IO_H 1
-
-/* These are wrappers for functions/macros from the GNU C library, and
- from other C libraries supporting POSIX's optional thread-safe functions.
-
- The standard I/O functions are thread-safe. These *_unlocked ones are
- more efficient but not thread-safe. That they're not thread-safe is
- fine since all of the applications in this package are single threaded.
-
- Also, some code that is shared with the GNU C library may invoke
- the *_unlocked functions directly. On hosts that lack those
- functions, invoke the non-thread-safe versions instead. */
-
-# include <stdio.h>
-
-# if HAVE_DECL_CLEARERR_UNLOCKED || defined clearerr_unlocked
-# undef clearerr
-# define clearerr(x) clearerr_unlocked (x)
-# else
-# define clearerr_unlocked(x) clearerr (x)
-# endif
-
-# if HAVE_DECL_FEOF_UNLOCKED || defined feof_unlocked
-# undef feof
-# define feof(x) feof_unlocked (x)
-# else
-# define feof_unlocked(x) feof (x)
-# endif
-
-# if HAVE_DECL_FERROR_UNLOCKED || defined ferror_unlocked
-# undef ferror
-# define ferror(x) ferror_unlocked (x)
-# else
-# define ferror_unlocked(x) ferror (x)
-# endif
-
-# if HAVE_DECL_FFLUSH_UNLOCKED || defined fflush_unlocked
-# undef fflush
-# define fflush(x) fflush_unlocked (x)
-# else
-# define fflush_unlocked(x) fflush (x)
-# endif
-
-# if HAVE_DECL_FGETS_UNLOCKED || defined fgets_unlocked
-# undef fgets
-# define fgets(x,y,z) fgets_unlocked (x,y,z)
-# else
-# define fgets_unlocked(x,y,z) fgets (x,y,z)
-# endif
-
-# if HAVE_DECL_FPUTC_UNLOCKED || defined fputc_unlocked
-# undef fputc
-# define fputc(x,y) fputc_unlocked (x,y)
-# else
-# define fputc_unlocked(x,y) fputc (x,y)
-# endif
-
-# if HAVE_DECL_FPUTS_UNLOCKED || defined fputs_unlocked
-# undef fputs
-# define fputs(x,y) fputs_unlocked (x,y)
-# else
-# define fputs_unlocked(x,y) fputs (x,y)
-# endif
-
-# if HAVE_DECL_FREAD_UNLOCKED || defined fread_unlocked
-# undef fread
-# define fread(w,x,y,z) fread_unlocked (w,x,y,z)
-# else
-# define fread_unlocked(w,x,y,z) fread (w,x,y,z)
-# endif
-
-# if HAVE_DECL_FWRITE_UNLOCKED || defined fwrite_unlocked
-# undef fwrite
-# define fwrite(w,x,y,z) fwrite_unlocked (w,x,y,z)
-# else
-# define fwrite_unlocked(w,x,y,z) fwrite (w,x,y,z)
-# endif
-
-# if HAVE_DECL_GETC_UNLOCKED || defined get_unlocked
-# undef getc
-# define getc(x) getc_unlocked (x)
-# else
-# define getc_unlocked(x) getc (x)
-# endif
-
-# if HAVE_DECL_GETCHAR_UNLOCKED || defined getchar_unlocked
-# undef getchar
-# define getchar() getchar_unlocked ()
-# else
-# define getchar_unlocked() getchar ()
-# endif
-
-# if HAVE_DECL_PUTC_UNLOCKED || defined putc_unlocked
-# undef putc
-# define putc(x,y) putc_unlocked (x,y)
-# else
-# define putc_unlocked(x,y) putc (x,y)
-# endif
-
-# if HAVE_DECL_PUTCHAR_UNLOCKED || defined putchar_unlocked
-# undef putchar
-# define putchar(x) putchar_unlocked (x)
-# else
-# define putchar_unlocked(x) putchar (x)
-# endif
-
-# undef flockfile
-# define flockfile(x) ((void) 0)
-
-# undef ftrylockfile
-# define ftrylockfile(x) 0
-
-# undef funlockfile
-# define funlockfile(x) ((void) 0)
-
-#endif /* UNLOCKED_IO_H */
diff --git a/cross/lib/utimens.c b/cross/lib/utimens.c
deleted file mode 100644
index 4c5377eca0f..00000000000
--- a/cross/lib/utimens.c
+++ /dev/null
@@ -1,646 +0,0 @@
-/* Set file access and modification times.
-
- Copyright (C) 2003-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert. */
-
-/* derived from a function in touch.c */
-
-#include <config.h>
-
-#define _GL_UTIMENS_INLINE _GL_EXTERN_INLINE
-#include "utimens.h"
-
-#include <errno.h>
-#include <fcntl.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <unistd.h>
-#include <utime.h>
-
-#include "stat-time.h"
-#include "timespec.h"
-
-/* On native Windows, use SetFileTime; but avoid this when compiling
- GNU Emacs, which arranges for this in some other way and which
- defines WIN32_LEAN_AND_MEAN itself. */
-
-#if defined _WIN32 && ! defined __CYGWIN__ && ! defined EMACS_CONFIGURATION
-# define USE_SETFILETIME
-# define WIN32_LEAN_AND_MEAN
-# include <windows.h>
-# if GNULIB_MSVC_NOTHROW
-# include "msvc-nothrow.h"
-# else
-# include <io.h>
-# endif
-#endif
-
-/* Avoid recursion with rpl_futimens or rpl_utimensat. */
-#undef futimens
-#if !HAVE_NEARLY_WORKING_UTIMENSAT
-# undef utimensat
-#endif
-
-/* Solaris 9 mistakenly succeeds when given a non-directory with a
- trailing slash. Force the use of rpl_stat for a fix. */
-#ifndef REPLACE_FUNC_STAT_FILE
-# define REPLACE_FUNC_STAT_FILE 0
-#endif
-
-#if HAVE_UTIMENSAT || HAVE_FUTIMENS
-/* Cache variables for whether the utimensat syscall works; used to
- avoid calling the syscall if we know it will just fail with ENOSYS,
- and to avoid unnecessary work in massaging timestamps if the
- syscall will work. Multiple variables are needed, to distinguish
- between the following scenarios on Linux:
- utimensat doesn't exist, or is in glibc but kernel 2.6.18 fails with ENOSYS
- kernel 2.6.22 and earlier rejects AT_SYMLINK_NOFOLLOW
- kernel 2.6.25 and earlier reject UTIME_NOW/UTIME_OMIT with non-zero tv_sec
- kernel 2.6.32 used with xfs or ntfs-3g fail to honor UTIME_OMIT
- utimensat completely works
- For each cache variable: 0 = unknown, 1 = yes, -1 = no. */
-static int utimensat_works_really;
-static int lutimensat_works_really;
-#endif /* HAVE_UTIMENSAT || HAVE_FUTIMENS */
-
-/* Validate the requested timestamps. Return 0 if the resulting
- timespec can be used for utimensat (after possibly modifying it to
- work around bugs in utimensat). Return a positive value if the
- timespec needs further adjustment based on stat results: 1 if any
- adjustment is needed for utimes, and 2 if any adjustment is needed
- for Linux utimensat. Return -1, with errno set to EINVAL, if
- timespec is out of range. */
-static int
-validate_timespec (struct timespec timespec[2])
-{
- int result = 0;
- int utime_omit_count = 0;
- if ((timespec[0].tv_nsec != UTIME_NOW
- && timespec[0].tv_nsec != UTIME_OMIT
- && ! (0 <= timespec[0].tv_nsec
- && timespec[0].tv_nsec < TIMESPEC_HZ))
- || (timespec[1].tv_nsec != UTIME_NOW
- && timespec[1].tv_nsec != UTIME_OMIT
- && ! (0 <= timespec[1].tv_nsec
- && timespec[1].tv_nsec < TIMESPEC_HZ)))
- {
- errno = EINVAL;
- return -1;
- }
- /* Work around Linux kernel 2.6.25 bug, where utimensat fails with
- EINVAL if tv_sec is not 0 when using the flag values of tv_nsec.
- Flag a Linux kernel 2.6.32 bug, where an mtime of UTIME_OMIT
- fails to bump ctime. */
- if (timespec[0].tv_nsec == UTIME_NOW
- || timespec[0].tv_nsec == UTIME_OMIT)
- {
- timespec[0].tv_sec = 0;
- result = 1;
- if (timespec[0].tv_nsec == UTIME_OMIT)
- utime_omit_count++;
- }
- if (timespec[1].tv_nsec == UTIME_NOW
- || timespec[1].tv_nsec == UTIME_OMIT)
- {
- timespec[1].tv_sec = 0;
- result = 1;
- if (timespec[1].tv_nsec == UTIME_OMIT)
- utime_omit_count++;
- }
- return result + (utime_omit_count == 1);
-}
-
-/* Normalize any UTIME_NOW or UTIME_OMIT values in (*TS)[0] and (*TS)[1],
- using STATBUF to obtain the current timestamps of the file. If
- both times are UTIME_NOW, set *TS to NULL (as this can avoid some
- permissions issues). If both times are UTIME_OMIT, return true
- (nothing further beyond the prior collection of STATBUF is
- necessary); otherwise return false. */
-static bool
-update_timespec (struct stat const *statbuf, struct timespec **ts)
-{
- struct timespec *timespec = *ts;
- if (timespec[0].tv_nsec == UTIME_OMIT
- && timespec[1].tv_nsec == UTIME_OMIT)
- return true;
- if (timespec[0].tv_nsec == UTIME_NOW
- && timespec[1].tv_nsec == UTIME_NOW)
- {
- *ts = NULL;
- return false;
- }
-
- if (timespec[0].tv_nsec == UTIME_OMIT)
- timespec[0] = get_stat_atime (statbuf);
- else if (timespec[0].tv_nsec == UTIME_NOW)
- gettime (&timespec[0]);
-
- if (timespec[1].tv_nsec == UTIME_OMIT)
- timespec[1] = get_stat_mtime (statbuf);
- else if (timespec[1].tv_nsec == UTIME_NOW)
- gettime (&timespec[1]);
-
- return false;
-}
-
-/* Set the access and modification timestamps of FD (a.k.a. FILE) to be
- TIMESPEC[0] and TIMESPEC[1], respectively.
- FD must be either negative -- in which case it is ignored --
- or a file descriptor that is open on FILE.
- If FD is nonnegative, then FILE can be NULL, which means
- use just futimes (or equivalent) instead of utimes (or equivalent),
- and fail if on an old system without futimes (or equivalent).
- If TIMESPEC is null, set the timestamps to the current time.
- Return 0 on success, -1 (setting errno) on failure. */
-
-int
-fdutimens (int fd, char const *file, struct timespec const timespec[2])
-{
- struct timespec adjusted_timespec[2];
- struct timespec *ts = timespec ? adjusted_timespec : NULL;
- int adjustment_needed = 0;
- struct stat st;
-
- if (ts)
- {
- adjusted_timespec[0] = timespec[0];
- adjusted_timespec[1] = timespec[1];
- adjustment_needed = validate_timespec (ts);
- }
- if (adjustment_needed < 0)
- return -1;
-
- /* Require that at least one of FD or FILE are potentially valid, to avoid
- a Linux bug where futimens (AT_FDCWD, NULL) changes "." rather
- than failing. */
- if (fd < 0 && !file)
- {
- errno = EBADF;
- return -1;
- }
-
- /* Some Linux-based NFS clients are buggy, and mishandle timestamps
- of files in NFS file systems in some cases. We have no
- configure-time test for this, but please see
- <https://bugs.gentoo.org/show_bug.cgi?id=132673> for references to
- some of the problems with Linux 2.6.16. If this affects you,
- compile with -DHAVE_BUGGY_NFS_TIME_STAMPS; this is reported to
- help in some cases, albeit at a cost in performance. But you
- really should upgrade your kernel to a fixed version, since the
- problem affects many applications. */
-
-#if HAVE_BUGGY_NFS_TIME_STAMPS
- if (fd < 0)
- sync ();
- else
- fsync (fd);
-#endif
-
- /* POSIX 2008 added two interfaces to set file timestamps with
- nanosecond resolution; newer Linux implements both functions via
- a single syscall. We provide a fallback for ENOSYS (for example,
- compiling against Linux 2.6.25 kernel headers and glibc 2.7, but
- running on Linux 2.6.18 kernel). */
-#if HAVE_UTIMENSAT || HAVE_FUTIMENS
- if (0 <= utimensat_works_really)
- {
- int result;
-# if __linux__ || __sun
- /* As recently as Linux kernel 2.6.32 (Dec 2009), several file
- systems (xfs, ntfs-3g) have bugs with a single UTIME_OMIT,
- but work if both times are either explicitly specified or
- UTIME_NOW. Work around it with a preparatory [f]stat prior
- to calling futimens/utimensat; fortunately, there is not much
- timing impact due to the extra syscall even on file systems
- where UTIME_OMIT would have worked.
-
- The same bug occurs in Solaris 11.1 (Apr 2013).
-
- FIXME: Simplify this for Linux in 2016 and for Solaris in
- 2024, when file system bugs are no longer common. */
- if (adjustment_needed == 2)
- {
- if (fd < 0 ? stat (file, &st) : fstat (fd, &st))
- return -1;
- if (ts[0].tv_nsec == UTIME_OMIT)
- ts[0] = get_stat_atime (&st);
- else if (ts[1].tv_nsec == UTIME_OMIT)
- ts[1] = get_stat_mtime (&st);
- /* Note that st is good, in case utimensat gives ENOSYS. */
- adjustment_needed++;
- }
-# endif
-# if HAVE_UTIMENSAT
- if (fd < 0)
- {
-# if defined __APPLE__ && defined __MACH__
- size_t len = strlen (file);
- if (len > 0 && file[len - 1] == '/')
- {
- struct stat statbuf;
- if (stat (file, &statbuf) < 0)
- return -1;
- if (!S_ISDIR (statbuf.st_mode))
- {
- errno = ENOTDIR;
- return -1;
- }
- }
-# endif
- result = utimensat (AT_FDCWD, file, ts, 0);
-# ifdef __linux__
- /* Work around a kernel bug:
- https://bugzilla.redhat.com/show_bug.cgi?id=442352
- https://bugzilla.redhat.com/show_bug.cgi?id=449910
- It appears that utimensat can mistakenly return 280 rather
- than -1 upon ENOSYS failure.
- FIXME: remove in 2010 or whenever the offending kernels
- are no longer in common use. */
- if (0 < result)
- errno = ENOSYS;
-# endif /* __linux__ */
- if (result == 0 || errno != ENOSYS)
- {
- utimensat_works_really = 1;
- return result;
- }
- }
-# endif /* HAVE_UTIMENSAT */
-# if HAVE_FUTIMENS
- if (0 <= fd)
- {
- result = futimens (fd, ts);
-# ifdef __linux__
- /* Work around the same bug as above. */
- if (0 < result)
- errno = ENOSYS;
-# endif /* __linux__ */
- if (result == 0 || errno != ENOSYS)
- {
- utimensat_works_really = 1;
- return result;
- }
- }
-# endif /* HAVE_FUTIMENS */
- }
- utimensat_works_really = -1;
- lutimensat_works_really = -1;
-#endif /* HAVE_UTIMENSAT || HAVE_FUTIMENS */
-
-#ifdef USE_SETFILETIME
- /* On native Windows, use SetFileTime(). See
- <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-setfiletime>
- <https://docs.microsoft.com/en-us/windows/desktop/api/minwinbase/ns-minwinbase-filetime> */
- if (0 <= fd)
- {
- HANDLE handle;
- FILETIME current_time;
- FILETIME last_access_time;
- FILETIME last_write_time;
-
- handle = (HANDLE) _get_osfhandle (fd);
- if (handle == INVALID_HANDLE_VALUE)
- {
- errno = EBADF;
- return -1;
- }
-
- if (ts == NULL || ts[0].tv_nsec == UTIME_NOW || ts[1].tv_nsec == UTIME_NOW)
- {
- /* GetSystemTimeAsFileTime
- <https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getsystemtimeasfiletime>.
- It would be overkill to use
- GetSystemTimePreciseAsFileTime
- <https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getsystemtimepreciseasfiletime>. */
- GetSystemTimeAsFileTime (&current_time);
- }
-
- if (ts == NULL || ts[0].tv_nsec == UTIME_NOW)
- {
- last_access_time = current_time;
- }
- else if (ts[0].tv_nsec == UTIME_OMIT)
- {
- last_access_time.dwLowDateTime = 0;
- last_access_time.dwHighDateTime = 0;
- }
- else
- {
- ULONGLONG time_since_16010101 =
- (ULONGLONG) ts[0].tv_sec * 10000000 + ts[0].tv_nsec / 100 + 116444736000000000LL;
- last_access_time.dwLowDateTime = (DWORD) time_since_16010101;
- last_access_time.dwHighDateTime = time_since_16010101 >> 32;
- }
-
- if (ts == NULL || ts[1].tv_nsec == UTIME_NOW)
- {
- last_write_time = current_time;
- }
- else if (ts[1].tv_nsec == UTIME_OMIT)
- {
- last_write_time.dwLowDateTime = 0;
- last_write_time.dwHighDateTime = 0;
- }
- else
- {
- ULONGLONG time_since_16010101 =
- (ULONGLONG) ts[1].tv_sec * 10000000 + ts[1].tv_nsec / 100 + 116444736000000000LL;
- last_write_time.dwLowDateTime = (DWORD) time_since_16010101;
- last_write_time.dwHighDateTime = time_since_16010101 >> 32;
- }
-
- if (SetFileTime (handle, NULL, &last_access_time, &last_write_time))
- return 0;
- else
- {
- DWORD sft_error = GetLastError ();
- #if 0
- fprintf (stderr, "fdutimens SetFileTime error 0x%x\n", (unsigned int) sft_error);
- #endif
- switch (sft_error)
- {
- case ERROR_ACCESS_DENIED: /* fd was opened without O_RDWR */
- errno = EACCES; /* not specified by POSIX */
- break;
- default:
- errno = EINVAL;
- break;
- }
- return -1;
- }
- }
-#endif
-
- /* The platform lacks an interface to set file timestamps with
- nanosecond resolution, so do the best we can, discarding any
- fractional part of the timestamp. */
-
- if (adjustment_needed || (REPLACE_FUNC_STAT_FILE && fd < 0))
- {
- if (adjustment_needed != 3
- && (fd < 0 ? stat (file, &st) : fstat (fd, &st)))
- return -1;
- if (ts && update_timespec (&st, &ts))
- return 0;
- }
-
- {
-#if HAVE_FUTIMESAT || HAVE_WORKING_UTIMES
- struct timeval timeval[2];
- struct timeval *t;
- if (ts)
- {
- timeval[0].tv_sec = ts[0].tv_sec;
- timeval[0].tv_usec = ts[0].tv_nsec / 1000;
- timeval[1].tv_sec = ts[1].tv_sec;
- timeval[1].tv_usec = ts[1].tv_nsec / 1000;
- t = timeval;
- }
- else
- t = NULL;
-
- if (fd < 0)
- {
-# if HAVE_FUTIMESAT
- return futimesat (AT_FDCWD, file, t);
-# endif
- }
- else
- {
- /* If futimesat or futimes fails here, don't try to speed things
- up by returning right away. glibc can incorrectly fail with
- errno == ENOENT if /proc isn't mounted. Also, Mandrake 10.0
- in high security mode doesn't allow ordinary users to read
- /proc/self, so glibc incorrectly fails with errno == EACCES.
- If errno == EIO, EPERM, or EROFS, it's probably safe to fail
- right away, but these cases are rare enough that they're not
- worth optimizing, and who knows what other messed-up systems
- are out there? So play it safe and fall back on the code
- below. */
-
-# if (HAVE_FUTIMESAT && !FUTIMESAT_NULL_BUG) || HAVE_FUTIMES
-# if HAVE_FUTIMESAT && !FUTIMESAT_NULL_BUG
-# undef futimes
-# define futimes(fd, t) futimesat (fd, NULL, t)
-# endif
- if (futimes (fd, t) == 0)
- {
-# if __linux__ && __GLIBC__
- /* Work around a longstanding glibc bug, still present as
- of 2010-12-27. On older Linux kernels that lack both
- utimensat and utimes, glibc's futimes rounds instead of
- truncating when falling back on utime. The same bug
- occurs in futimesat with a null 2nd arg. */
- if (t)
- {
- bool abig = 500000 <= t[0].tv_usec;
- bool mbig = 500000 <= t[1].tv_usec;
- if ((abig | mbig) && fstat (fd, &st) == 0)
- {
- /* If these two subtractions overflow, they'll
- track the overflows inside the buggy glibc. */
- time_t adiff = st.st_atime - t[0].tv_sec;
- time_t mdiff = st.st_mtime - t[1].tv_sec;
-
- struct timeval *tt = NULL;
- struct timeval truncated_timeval[2];
- truncated_timeval[0] = t[0];
- truncated_timeval[1] = t[1];
- if (abig && adiff == 1 && get_stat_atime_ns (&st) == 0)
- {
- tt = truncated_timeval;
- tt[0].tv_usec = 0;
- }
- if (mbig && mdiff == 1 && get_stat_mtime_ns (&st) == 0)
- {
- tt = truncated_timeval;
- tt[1].tv_usec = 0;
- }
- if (tt)
- futimes (fd, tt);
- }
- }
-# endif
-
- return 0;
- }
-# endif
- }
-#endif /* HAVE_FUTIMESAT || HAVE_WORKING_UTIMES */
-
- if (!file)
- {
-#if ! ((HAVE_FUTIMESAT && !FUTIMESAT_NULL_BUG) \
- || (HAVE_WORKING_UTIMES && HAVE_FUTIMES))
- errno = ENOSYS;
-#endif
- return -1;
- }
-
-#ifdef USE_SETFILETIME
- return _gl_utimens_windows (file, ts);
-#elif HAVE_WORKING_UTIMES
- return utimes (file, t);
-#else
- {
- struct utimbuf utimbuf;
- struct utimbuf *ut;
- if (ts)
- {
- utimbuf.actime = ts[0].tv_sec;
- utimbuf.modtime = ts[1].tv_sec;
- ut = &utimbuf;
- }
- else
- ut = NULL;
-
- return utime (file, ut);
- }
-#endif /* !HAVE_WORKING_UTIMES */
- }
-}
-
-/* Set the access and modification timestamps of FILE to be
- TIMESPEC[0] and TIMESPEC[1], respectively. */
-int
-utimens (char const *file, struct timespec const timespec[2])
-{
- return fdutimens (-1, file, timespec);
-}
-
-/* Set the access and modification timestamps of FILE to be
- TIMESPEC[0] and TIMESPEC[1], respectively, without dereferencing
- symlinks. Fail with ENOSYS if the platform does not support
- changing symlink timestamps, but FILE was a symlink. */
-int
-lutimens (char const *file, struct timespec const timespec[2])
-{
- struct timespec adjusted_timespec[2];
- struct timespec *ts = timespec ? adjusted_timespec : NULL;
- int adjustment_needed = 0;
- struct stat st;
-
- if (ts)
- {
- adjusted_timespec[0] = timespec[0];
- adjusted_timespec[1] = timespec[1];
- adjustment_needed = validate_timespec (ts);
- }
- if (adjustment_needed < 0)
- return -1;
-
- /* The Linux kernel did not support symlink timestamps until
- utimensat, in version 2.6.22, so we don't need to mimic
- fdutimens' worry about buggy NFS clients. But we do have to
- worry about bogus return values. */
-
-#if HAVE_UTIMENSAT
- if (0 <= lutimensat_works_really)
- {
- int result;
-# if __linux__ || __sun
- /* As recently as Linux kernel 2.6.32 (Dec 2009), several file
- systems (xfs, ntfs-3g) have bugs with a single UTIME_OMIT,
- but work if both times are either explicitly specified or
- UTIME_NOW. Work around it with a preparatory lstat prior to
- calling utimensat; fortunately, there is not much timing
- impact due to the extra syscall even on file systems where
- UTIME_OMIT would have worked.
-
- The same bug occurs in Solaris 11.1 (Apr 2013).
-
- FIXME: Simplify this for Linux in 2016 and for Solaris in
- 2024, when file system bugs are no longer common. */
- if (adjustment_needed == 2)
- {
- if (lstat (file, &st))
- return -1;
- if (ts[0].tv_nsec == UTIME_OMIT)
- ts[0] = get_stat_atime (&st);
- else if (ts[1].tv_nsec == UTIME_OMIT)
- ts[1] = get_stat_mtime (&st);
- /* Note that st is good, in case utimensat gives ENOSYS. */
- adjustment_needed++;
- }
-# endif
- result = utimensat (AT_FDCWD, file, ts, AT_SYMLINK_NOFOLLOW);
-# ifdef __linux__
- /* Work around a kernel bug:
- https://bugzilla.redhat.com/show_bug.cgi?id=442352
- https://bugzilla.redhat.com/show_bug.cgi?id=449910
- It appears that utimensat can mistakenly return 280 rather
- than -1 upon ENOSYS failure.
- FIXME: remove in 2010 or whenever the offending kernels
- are no longer in common use. */
- if (0 < result)
- errno = ENOSYS;
-# endif
- if (result == 0 || errno != ENOSYS)
- {
- utimensat_works_really = 1;
- lutimensat_works_really = 1;
- return result;
- }
- }
- lutimensat_works_really = -1;
-#endif /* HAVE_UTIMENSAT */
-
- /* The platform lacks an interface to set file timestamps with
- nanosecond resolution, so do the best we can, discarding any
- fractional part of the timestamp. */
-
- if (adjustment_needed || REPLACE_FUNC_STAT_FILE)
- {
- if (adjustment_needed != 3 && lstat (file, &st))
- return -1;
- if (ts && update_timespec (&st, &ts))
- return 0;
- }
-
- /* On Linux, lutimes is a thin wrapper around utimensat, so there is
- no point trying lutimes if utimensat failed with ENOSYS. */
-#if HAVE_LUTIMES && !HAVE_UTIMENSAT
- {
- struct timeval timeval[2];
- struct timeval *t;
- int result;
- if (ts)
- {
- timeval[0].tv_sec = ts[0].tv_sec;
- timeval[0].tv_usec = ts[0].tv_nsec / 1000;
- timeval[1].tv_sec = ts[1].tv_sec;
- timeval[1].tv_usec = ts[1].tv_nsec / 1000;
- t = timeval;
- }
- else
- t = NULL;
-
- result = lutimes (file, t);
- if (result == 0 || errno != ENOSYS)
- return result;
- }
-#endif /* HAVE_LUTIMES && !HAVE_UTIMENSAT */
-
- /* Out of luck for symlinks, but we still handle regular files. */
- if (!(adjustment_needed || REPLACE_FUNC_STAT_FILE) && lstat (file, &st))
- return -1;
- if (!S_ISLNK (st.st_mode))
- return fdutimens (-1, file, ts);
- errno = ENOSYS;
- return -1;
-}
diff --git a/cross/lib/utimens.h b/cross/lib/utimens.h
deleted file mode 100644
index a7056981f32..00000000000
--- a/cross/lib/utimens.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Set file access and modification times.
-
- Copyright 2012-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert. */
-
-#include <time.h>
-int fdutimens (int, char const *, struct timespec const [2]);
-int utimens (char const *, struct timespec const [2]);
-int lutimens (char const *, struct timespec const [2]);
-
-#if GNULIB_FDUTIMENSAT
-# include <fcntl.h>
-# include <sys/stat.h>
-
-#ifndef _GL_INLINE_HEADER_BEGIN
- #error "Please include config.h first."
-#endif
-_GL_INLINE_HEADER_BEGIN
-#ifndef _GL_UTIMENS_INLINE
-# define _GL_UTIMENS_INLINE _GL_INLINE
-#endif
-
-int fdutimensat (int fd, int dir, char const *name, struct timespec const [2],
- int atflag);
-
-/* Using this function makes application code slightly more readable. */
-_GL_UTIMENS_INLINE int
-lutimensat (int dir, char const *file, struct timespec const times[2])
-{
- return utimensat (dir, file, times, AT_SYMLINK_NOFOLLOW);
-}
-
-_GL_INLINE_HEADER_END
-
-#endif
diff --git a/cross/lib/utimensat.c b/cross/lib/utimensat.c
deleted file mode 100644
index 5cff11cd0a9..00000000000
--- a/cross/lib/utimensat.c
+++ /dev/null
@@ -1,217 +0,0 @@
-/* Set the access and modification time of a file relative to directory fd.
- Copyright (C) 2009-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* written by Eric Blake */
-
-#include <config.h>
-
-/* Specification. */
-#include <sys/stat.h>
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/stat.h>
-
-#include "stat-time.h"
-#include "timespec.h"
-#include "utimens.h"
-
-#if HAVE_NEARLY_WORKING_UTIMENSAT
-
-/* Use the original utimensat(), but correct the trailing slash handling. */
-int
-rpl_utimensat (int fd, char const *file, struct timespec const times[2],
- int flag)
-# undef utimensat
-{
- size_t len = strlen (file);
- if (len && file[len - 1] == '/')
- {
- struct stat st;
- if (fstatat (fd, file, &st, flag & AT_SYMLINK_NOFOLLOW) < 0)
- return -1;
- if (!S_ISDIR (st.st_mode))
- {
- errno = ENOTDIR;
- return -1;
- }
- }
-
- return utimensat (fd, file, times, flag);
-}
-
-#else
-
-# if HAVE_UTIMENSAT
-
-/* If we have a native utimensat, but are compiling this file, then
- utimensat was defined to rpl_utimensat by our replacement
- sys/stat.h. We assume the native version might fail with ENOSYS,
- or succeed without properly affecting ctime (as is the case when
- using newer glibc but older Linux kernel). In this scenario,
- rpl_utimensat checks whether the native version is usable, and
- local_utimensat provides the fallback manipulation. */
-
-static int local_utimensat (int, char const *, struct timespec const[2], int);
-# define AT_FUNC_NAME local_utimensat
-
-/* Like utimensat, but work around native bugs. */
-
-int
-rpl_utimensat (int fd, char const *file, struct timespec const times[2],
- int flag)
-# undef utimensat
-{
-# if defined __linux__ || defined __sun
- struct timespec ts[2];
-# endif
-
- /* See comments in utimens.c for details. */
- static int utimensat_works_really; /* 0 = unknown, 1 = yes, -1 = no. */
- if (0 <= utimensat_works_really)
- {
- int result;
-# if defined __linux__ || defined __sun
- struct stat st;
- /* As recently as Linux kernel 2.6.32 (Dec 2009), several file
- systems (xfs, ntfs-3g) have bugs with a single UTIME_OMIT,
- but work if both times are either explicitly specified or
- UTIME_NOW. Work around it with a preparatory [l]stat prior
- to calling utimensat; fortunately, there is not much timing
- impact due to the extra syscall even on file systems where
- UTIME_OMIT would have worked.
-
- The same bug occurs in Solaris 11.1 (Apr 2013).
-
- FIXME: Simplify this in 2024, when these file system bugs are
- no longer common on Gnulib target platforms. */
- if (times && (times[0].tv_nsec == UTIME_OMIT
- || times[1].tv_nsec == UTIME_OMIT))
- {
- if (fstatat (fd, file, &st, flag))
- return -1;
- if (times[0].tv_nsec == UTIME_OMIT && times[1].tv_nsec == UTIME_OMIT)
- return 0;
- if (times[0].tv_nsec == UTIME_OMIT)
- ts[0] = get_stat_atime (&st);
- else
- ts[0] = times[0];
- if (times[1].tv_nsec == UTIME_OMIT)
- ts[1] = get_stat_mtime (&st);
- else
- ts[1] = times[1];
- times = ts;
- }
-# ifdef __hppa__
- /* Linux kernel 2.6.22.19 on hppa does not reject invalid tv_nsec
- values. */
- else if (times
- && ((times[0].tv_nsec != UTIME_NOW
- && ! (0 <= times[0].tv_nsec
- && times[0].tv_nsec < TIMESPEC_HZ))
- || (times[1].tv_nsec != UTIME_NOW
- && ! (0 <= times[1].tv_nsec
- && times[1].tv_nsec < TIMESPEC_HZ))))
- {
- errno = EINVAL;
- return -1;
- }
-# endif
-# endif
-# if defined __APPLE__ && defined __MACH__
- /* macOS 10.13 does not reject invalid tv_nsec values either. */
- if (times
- && ((times[0].tv_nsec != UTIME_OMIT
- && times[0].tv_nsec != UTIME_NOW
- && ! (0 <= times[0].tv_nsec
- && times[0].tv_nsec < TIMESPEC_HZ))
- || (times[1].tv_nsec != UTIME_OMIT
- && times[1].tv_nsec != UTIME_NOW
- && ! (0 <= times[1].tv_nsec
- && times[1].tv_nsec < TIMESPEC_HZ))))
- {
- errno = EINVAL;
- return -1;
- }
- size_t len = strlen (file);
- if (len > 0 && file[len - 1] == '/')
- {
- struct stat statbuf;
- if (fstatat (fd, file, &statbuf, 0) < 0)
- return -1;
- if (!S_ISDIR (statbuf.st_mode))
- {
- errno = ENOTDIR;
- return -1;
- }
- }
-# endif
- result = utimensat (fd, file, times, flag);
- /* Linux kernel 2.6.25 has a bug where it returns EINVAL for
- UTIME_NOW or UTIME_OMIT with non-zero tv_sec, which
- local_utimensat works around. Meanwhile, EINVAL for a bad
- flag is indeterminate whether the native utimensat works, but
- local_utimensat will also reject it. */
- if (result == -1 && errno == EINVAL && (flag & ~AT_SYMLINK_NOFOLLOW))
- return result;
- if (result == 0 || (errno != ENOSYS && errno != EINVAL))
- {
- utimensat_works_really = 1;
- return result;
- }
- }
- /* No point in trying openat/futimens, since on Linux, futimens is
- implemented with the same syscall as utimensat. Only avoid the
- native utimensat due to an ENOSYS failure; an EINVAL error was
- data-dependent, and the next caller may pass valid data. */
- if (0 <= utimensat_works_really && errno == ENOSYS)
- utimensat_works_really = -1;
- return local_utimensat (fd, file, times, flag);
-}
-
-# else /* !HAVE_UTIMENSAT */
-
-# define AT_FUNC_NAME utimensat
-
-# endif /* !HAVE_UTIMENSAT */
-
-/* Set the access and modification timestamps of FILE to be
- TIMESPEC[0] and TIMESPEC[1], respectively; relative to directory
- FD. If flag is AT_SYMLINK_NOFOLLOW, change the times of a symlink,
- or fail with ENOSYS if not possible. If TIMESPEC is null, set the
- timestamps to the current time. If possible, do it without
- changing the working directory. Otherwise, resort to using
- save_cwd/fchdir, then utimens/restore_cwd. If either the save_cwd
- or the restore_cwd fails, then give a diagnostic and exit nonzero.
- Return 0 on success, -1 (setting errno) on failure. */
-
-/* AT_FUNC_NAME is now utimensat or local_utimensat. */
-# define AT_FUNC_F1 lutimens
-# define AT_FUNC_F2 utimens
-# define AT_FUNC_USE_F1_COND AT_SYMLINK_NOFOLLOW
-# define AT_FUNC_POST_FILE_PARAM_DECLS , struct timespec const ts[2], int flag
-# define AT_FUNC_POST_FILE_ARGS , ts
-# include "at-func.c"
-# undef AT_FUNC_NAME
-# undef AT_FUNC_F1
-# undef AT_FUNC_F2
-# undef AT_FUNC_USE_F1_COND
-# undef AT_FUNC_POST_FILE_PARAM_DECLS
-# undef AT_FUNC_POST_FILE_ARGS
-
-#endif /* !HAVE_NEARLY_WORKING_UTIMENSAT */
diff --git a/cross/lib/vasnprintf.c b/cross/lib/vasnprintf.c
deleted file mode 100644
index 72b8cdbfa6b..00000000000
--- a/cross/lib/vasnprintf.c
+++ /dev/null
@@ -1,5741 +0,0 @@
-/* vsprintf with automatic memory allocation.
- Copyright (C) 1999, 2002-2023 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/>. */
-
-/* This file can be parametrized with the following macros:
- VASNPRINTF The name of the function being defined.
- FCHAR_T The element type of the format string.
- DCHAR_T The element type of the destination (result) string.
- FCHAR_T_ONLY_ASCII Set to 1 to enable verification that all characters
- in the format string are ASCII. MUST be set if
- FCHAR_T and DCHAR_T are not the same type.
- DIRECTIVE Structure denoting a format directive.
- Depends on FCHAR_T.
- DIRECTIVES Structure denoting the set of format directives of a
- format string. Depends on FCHAR_T.
- PRINTF_PARSE Function that parses a format string.
- Depends on FCHAR_T.
- DCHAR_CPY memcpy like function for DCHAR_T[] arrays.
- DCHAR_SET memset like function for DCHAR_T[] arrays.
- DCHAR_MBSNLEN mbsnlen like function for DCHAR_T[] arrays.
- SNPRINTF The system's snprintf (or similar) function.
- This may be either snprintf or swprintf.
- TCHAR_T The element type of the argument and result string
- of the said SNPRINTF function. This may be either
- char or wchar_t. The code exploits that
- sizeof (TCHAR_T) | sizeof (DCHAR_T) and
- alignof (TCHAR_T) <= alignof (DCHAR_T).
- DCHAR_IS_TCHAR Set to 1 if DCHAR_T and TCHAR_T are the same type.
- DCHAR_CONV_FROM_ENCODING A function to convert from char[] to DCHAR[].
- DCHAR_IS_UINT8_T Set to 1 if DCHAR_T is uint8_t.
- DCHAR_IS_UINT16_T Set to 1 if DCHAR_T is uint16_t.
- DCHAR_IS_UINT32_T Set to 1 if DCHAR_T is uint32_t.
- ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
- ENABLE_WCHAR_FALLBACK Set to 1 to avoid EILSEQ during conversion of wide
- characters (wchar_t) and wide character strings
- (wchar_t[]) to multibyte sequences. The fallback is the
- hexadecimal escape syntax (\unnnn or \Unnnnnnnn) or,
- if wchar_t is not Unicode encoded, \wnnnn or \Wnnnnnnnn.
- */
-
-/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
- This must come before <config.h> because <config.h> may include
- <features.h>, and once <features.h> has been included, it's too late. */
-#ifndef _GNU_SOURCE
-# define _GNU_SOURCE 1
-#endif
-
-#ifndef VASNPRINTF
-# include <config.h>
-#endif
-
-/* As of GCC 11.2.1, gcc -Wanalyzer-too-complex reports that main's
- use of CHECK macros expands to code that is too complicated for gcc
- -fanalyzer. Suppress the resulting bogus warnings. */
-#if 10 <= __GNUC__
-# pragma GCC diagnostic ignored "-Wanalyzer-null-argument"
-#endif
-
-#include <alloca.h>
-
-/* Specification. */
-#ifndef VASNPRINTF
-# if WIDE_CHAR_VERSION
-# include "vasnwprintf.h"
-# else
-# include "vasnprintf.h"
-# endif
-#endif
-
-#include <locale.h> /* localeconv() */
-#include <stdio.h> /* snprintf(), sprintf() */
-#include <stdlib.h> /* abort(), malloc(), realloc(), free() */
-#include <string.h> /* memcpy(), strlen() */
-#include <wchar.h> /* mbstate_t, mbrtowc(), mbrlen(), wcrtomb() */
-#include <errno.h> /* errno */
-#include <limits.h> /* CHAR_BIT */
-#include <float.h> /* DBL_MAX_EXP, LDBL_MAX_EXP */
-#if HAVE_NL_LANGINFO
-# include <langinfo.h>
-#endif
-#ifndef VASNPRINTF
-# if WIDE_CHAR_VERSION
-# include "wprintf-parse.h"
-# else
-# include "printf-parse.h"
-# endif
-#endif
-
-/* Checked size_t computations. */
-#include "xsize.h"
-
-#include "attribute.h"
-
-#if (NEED_PRINTF_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL
-# include <math.h>
-# include "float+.h"
-#endif
-
-#if (NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && !defined IN_LIBINTL
-# include <math.h>
-# include "isnand-nolibm.h"
-#endif
-
-#if (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE) && !defined IN_LIBINTL
-# include <math.h>
-# include "isnanl-nolibm.h"
-# include "fpucw.h"
-#endif
-
-#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL
-# include <math.h>
-# include "isnand-nolibm.h"
-# include "printf-frexp.h"
-#endif
-
-#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL
-# include <math.h>
-# include "isnanl-nolibm.h"
-# include "printf-frexpl.h"
-# include "fpucw.h"
-#endif
-
-/* Default parameters. */
-#ifndef VASNPRINTF
-# if WIDE_CHAR_VERSION
-# define VASNPRINTF vasnwprintf
-# define FCHAR_T wchar_t
-# define DCHAR_T wchar_t
-# define TCHAR_T wchar_t
-# define DCHAR_IS_TCHAR 1
-# define DIRECTIVE wchar_t_directive
-# define DIRECTIVES wchar_t_directives
-# define PRINTF_PARSE wprintf_parse
-# define DCHAR_CPY wmemcpy
-# define DCHAR_SET wmemset
-# else
-# define VASNPRINTF vasnprintf
-# define FCHAR_T char
-# define DCHAR_T char
-# define TCHAR_T char
-# define DCHAR_IS_TCHAR 1
-# define DIRECTIVE char_directive
-# define DIRECTIVES char_directives
-# define PRINTF_PARSE printf_parse
-# define DCHAR_CPY memcpy
-# define DCHAR_SET memset
-# endif
-#endif
-#if WIDE_CHAR_VERSION
- /* TCHAR_T is wchar_t. */
-# define USE_SNPRINTF 1
-# if HAVE_DECL__SNWPRINTF
- /* On Windows, the function swprintf() has a different signature than
- on Unix; we use the function _snwprintf() or - on mingw - snwprintf()
- instead. The mingw function snwprintf() has fewer bugs than the
- MSVCRT function _snwprintf(), so prefer that. */
-# if defined __MINGW32__
-# define SNPRINTF snwprintf
-# else
-# define SNPRINTF _snwprintf
-# define USE_MSVC__SNPRINTF 1
-# endif
-# else
- /* Unix. */
-# define SNPRINTF swprintf
-# endif
-#else
- /* TCHAR_T is char. */
- /* Use snprintf if it exists under the name 'snprintf' or '_snprintf'.
- But don't use it on BeOS, since BeOS snprintf produces no output if the
- size argument is >= 0x3000000.
- Also don't use it on Linux libc5, since there snprintf with size = 1
- writes any output without bounds, like sprintf. */
-# if (HAVE_DECL__SNPRINTF || HAVE_SNPRINTF) && !defined __BEOS__ && !(__GNU_LIBRARY__ == 1)
-# define USE_SNPRINTF 1
-# else
-# define USE_SNPRINTF 0
-# endif
-# if HAVE_DECL__SNPRINTF
- /* Windows. The mingw function snprintf() has fewer bugs than the MSVCRT
- function _snprintf(), so prefer that. */
-# if defined __MINGW32__
-# define SNPRINTF snprintf
- /* Here we need to call the native snprintf, not rpl_snprintf. */
-# undef snprintf
-# else
- /* MSVC versions < 14 did not have snprintf, only _snprintf. */
-# define SNPRINTF _snprintf
-# define USE_MSVC__SNPRINTF 1
-# endif
-# else
- /* Unix. */
-# define SNPRINTF snprintf
- /* Here we need to call the native snprintf, not rpl_snprintf. */
-# undef snprintf
-# endif
-#endif
-/* Here we need to call the native sprintf, not rpl_sprintf. */
-#undef sprintf
-
-/* GCC >= 4.0 with -Wall emits unjustified "... may be used uninitialized"
- warnings in this file. Use -Dlint to suppress them. */
-#if defined GCC_LINT || defined lint
-# define IF_LINT(Code) Code
-#else
-# define IF_LINT(Code) /* empty */
-#endif
-
-/* Avoid some warnings from "gcc -Wshadow".
- This file doesn't use the exp() and remainder() functions. */
-#undef exp
-#define exp expo
-#undef remainder
-#define remainder rem
-
-#if (!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF) && !WIDE_CHAR_VERSION
-# if (HAVE_STRNLEN && !defined _AIX)
-# define local_strnlen strnlen
-# else
-# ifndef local_strnlen_defined
-# define local_strnlen_defined 1
-static size_t
-local_strnlen (const char *string, size_t maxlen)
-{
- const char *end = memchr (string, '\0', maxlen);
- return end ? (size_t) (end - string) : maxlen;
-}
-# endif
-# endif
-#endif
-
-#if (((!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF) && WIDE_CHAR_VERSION) || ((!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || (NEED_PRINTF_DIRECTIVE_LS && !defined IN_LIBINTL)) && !WIDE_CHAR_VERSION && DCHAR_IS_TCHAR)) && HAVE_WCHAR_T
-# if HAVE_WCSLEN
-# define local_wcslen wcslen
-# else
- /* Solaris 2.5.1 has wcslen() in a separate library libw.so. To avoid
- a dependency towards this library, here is a local substitute.
- Define this substitute only once, even if this file is included
- twice in the same compilation unit. */
-# ifndef local_wcslen_defined
-# define local_wcslen_defined 1
-static size_t
-local_wcslen (const wchar_t *s)
-{
- const wchar_t *ptr;
-
- for (ptr = s; *ptr != (wchar_t) 0; ptr++)
- ;
- return ptr - s;
-}
-# endif
-# endif
-#endif
-
-#if (!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF) && HAVE_WCHAR_T && WIDE_CHAR_VERSION
-# if HAVE_WCSNLEN
-# define local_wcsnlen wcsnlen
-# else
-# ifndef local_wcsnlen_defined
-# define local_wcsnlen_defined 1
-static size_t
-local_wcsnlen (const wchar_t *s, size_t maxlen)
-{
- const wchar_t *ptr;
-
- for (ptr = s; maxlen > 0 && *ptr != (wchar_t) 0; ptr++, maxlen--)
- ;
- return ptr - s;
-}
-# endif
-# endif
-#endif
-
-#if (((!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || (NEED_PRINTF_DIRECTIVE_LS && !defined IN_LIBINTL) || ENABLE_WCHAR_FALLBACK) && HAVE_WCHAR_T) || (ENABLE_WCHAR_FALLBACK && HAVE_WINT_T)) && !WIDE_CHAR_VERSION
-# if ENABLE_WCHAR_FALLBACK
-static size_t
-wctomb_fallback (char *s, wchar_t wc)
-{
- static char hex[16] = "0123456789ABCDEF";
-
- s[0] = '\\';
- if (sizeof (wchar_t) > 2 && wc > 0xffff)
- {
-# if __STDC_ISO_10646__ || (__GLIBC__ >= 2) || (defined _WIN32 || defined __CYGWIN__)
- s[1] = 'U';
-# else
- s[1] = 'W';
-# endif
- s[2] = hex[(wc & 0xf0000000U) >> 28];
- s[3] = hex[(wc & 0xf000000U) >> 24];
- s[4] = hex[(wc & 0xf00000U) >> 20];
- s[5] = hex[(wc & 0xf0000U) >> 16];
- s[6] = hex[(wc & 0xf000U) >> 12];
- s[7] = hex[(wc & 0xf00U) >> 8];
- s[8] = hex[(wc & 0xf0U) >> 4];
- s[9] = hex[wc & 0xfU];
- return 10;
- }
- else
- {
-# if __STDC_ISO_10646__ || (__GLIBC__ >= 2) || (defined _WIN32 || defined __CYGWIN__)
- s[1] = 'u';
-# else
- s[1] = 'w';
-# endif
- s[2] = hex[(wc & 0xf000U) >> 12];
- s[3] = hex[(wc & 0xf00U) >> 8];
- s[4] = hex[(wc & 0xf0U) >> 4];
- s[5] = hex[wc & 0xfU];
- return 6;
- }
-}
-# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
-static size_t
-local_wcrtomb (char *s, wchar_t wc, mbstate_t *ps)
-{
- size_t count = wcrtomb (s, wc, ps);
- if (count == (size_t)(-1))
- count = wctomb_fallback (s, wc);
- return count;
-}
-# else
-static int
-local_wctomb (char *s, wchar_t wc)
-{
- int count = wctomb (s, wc);
- if (count < 0)
- count = wctomb_fallback (s, wc);
- return count;
-}
-# define local_wcrtomb(S, WC, PS) local_wctomb ((S), (WC))
-# endif
-# else
-# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
-# define local_wcrtomb(S, WC, PS) wcrtomb ((S), (WC), (PS))
-# else
-# define local_wcrtomb(S, WC, PS) wctomb ((S), (WC))
-# endif
-# endif
-#endif
-
-#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE || NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && !defined IN_LIBINTL
-/* Determine the decimal-point character according to the current locale. */
-# ifndef decimal_point_char_defined
-# define decimal_point_char_defined 1
-static char
-decimal_point_char (void)
-{
- const char *point;
- /* Determine it in a multithread-safe way. We know nl_langinfo is
- multithread-safe on glibc systems and Mac OS X systems, but is not required
- to be multithread-safe by POSIX. sprintf(), however, is multithread-safe.
- localeconv() is rarely multithread-safe. */
-# if HAVE_NL_LANGINFO && (__GLIBC__ || defined __UCLIBC__ || (defined __APPLE__ && defined __MACH__))
- point = nl_langinfo (RADIXCHAR);
-# elif 1
- char pointbuf[5];
- sprintf (pointbuf, "%#.0f", 1.0);
- point = &pointbuf[1];
-# else
- point = localeconv () -> decimal_point;
-# endif
- /* The decimal point is always a single byte: either '.' or ','. */
- return (point[0] != '\0' ? point[0] : '.');
-}
-# endif
-#endif
-
-#if NEED_PRINTF_INFINITE_DOUBLE && !NEED_PRINTF_DOUBLE && !defined IN_LIBINTL
-
-/* Equivalent to !isfinite(x) || x == 0, but does not require libm. */
-static int
-is_infinite_or_zero (double x)
-{
- return isnand (x) || x + x == x;
-}
-
-#endif
-
-#if NEED_PRINTF_INFINITE_LONG_DOUBLE && !NEED_PRINTF_LONG_DOUBLE && !defined IN_LIBINTL
-
-/* Equivalent to !isfinite(x) || x == 0, but does not require libm. */
-static int
-is_infinite_or_zerol (long double x)
-{
- return isnanl (x) || x + x == x;
-}
-
-#endif
-
-#if (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL
-
-/* Converting 'long double' to decimal without rare rounding bugs requires
- real bignums. We use the naming conventions of GNU gmp, but vastly simpler
- (and slower) algorithms. */
-
-typedef unsigned int mp_limb_t;
-# define GMP_LIMB_BITS 32
-static_assert (sizeof (mp_limb_t) * CHAR_BIT == GMP_LIMB_BITS);
-
-typedef unsigned long long mp_twolimb_t;
-# define GMP_TWOLIMB_BITS 64
-static_assert (sizeof (mp_twolimb_t) * CHAR_BIT == GMP_TWOLIMB_BITS);
-
-/* Representation of a bignum >= 0. */
-typedef struct
-{
- size_t nlimbs;
- mp_limb_t *limbs; /* Bits in little-endian order, allocated with malloc(). */
-} mpn_t;
-
-/* Compute the product of two bignums >= 0.
- Return the allocated memory in case of success, NULL in case of memory
- allocation failure. */
-static void *
-multiply (mpn_t src1, mpn_t src2, mpn_t *dest)
-{
- const mp_limb_t *p1;
- const mp_limb_t *p2;
- size_t len1;
- size_t len2;
-
- if (src1.nlimbs <= src2.nlimbs)
- {
- len1 = src1.nlimbs;
- p1 = src1.limbs;
- len2 = src2.nlimbs;
- p2 = src2.limbs;
- }
- else
- {
- len1 = src2.nlimbs;
- p1 = src2.limbs;
- len2 = src1.nlimbs;
- p2 = src1.limbs;
- }
- /* Now 0 <= len1 <= len2. */
- if (len1 == 0)
- {
- /* src1 or src2 is zero. */
- dest->nlimbs = 0;
- dest->limbs = (mp_limb_t *) malloc (1);
- }
- else
- {
- /* Here 1 <= len1 <= len2. */
- size_t dlen;
- mp_limb_t *dp;
- size_t k, i, j;
-
- dlen = len1 + len2;
- dp = (mp_limb_t *) malloc (dlen * sizeof (mp_limb_t));
- if (dp == NULL)
- return NULL;
- for (k = len2; k > 0; )
- dp[--k] = 0;
- for (i = 0; i < len1; i++)
- {
- mp_limb_t digit1 = p1[i];
- mp_twolimb_t carry = 0;
- for (j = 0; j < len2; j++)
- {
- mp_limb_t digit2 = p2[j];
- carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2;
- carry += dp[i + j];
- dp[i + j] = (mp_limb_t) carry;
- carry = carry >> GMP_LIMB_BITS;
- }
- dp[i + len2] = (mp_limb_t) carry;
- }
- /* Normalise. */
- while (dlen > 0 && dp[dlen - 1] == 0)
- dlen--;
- dest->nlimbs = dlen;
- dest->limbs = dp;
- }
- return dest->limbs;
-}
-
-/* Compute the quotient of a bignum a >= 0 and a bignum b > 0.
- a is written as a = q * b + r with 0 <= r < b. q is the quotient, r
- the remainder.
- Finally, round-to-even is performed: If r > b/2 or if r = b/2 and q is odd,
- q is incremented.
- Return the allocated memory in case of success, NULL in case of memory
- allocation failure. */
-static void *
-divide (mpn_t a, mpn_t b, mpn_t *q)
-{
- /* Algorithm:
- First normalise a and b: a=[a[m-1],...,a[0]], b=[b[n-1],...,b[0]]
- with m>=0 and n>0 (in base beta = 2^GMP_LIMB_BITS).
- If m<n, then q:=0 and r:=a.
- If m>=n=1, perform a single-precision division:
- r:=0, j:=m,
- while j>0 do
- {Here (q[m-1]*beta^(m-1)+...+q[j]*beta^j) * b[0] + r*beta^j =
- = a[m-1]*beta^(m-1)+...+a[j]*beta^j und 0<=r<b[0]<beta}
- j:=j-1, r:=r*beta+a[j], q[j]:=floor(r/b[0]), r:=r-b[0]*q[j].
- Normalise [q[m-1],...,q[0]], yields q.
- If m>=n>1, perform a multiple-precision division:
- We have a/b < beta^(m-n+1).
- s:=intDsize-1-(highest bit in b[n-1]), 0<=s<intDsize.
- Shift a and b left by s bits, copying them. r:=a.
- r=[r[m],...,r[0]], b=[b[n-1],...,b[0]] with b[n-1]>=beta/2.
- For j=m-n,...,0: {Here 0 <= r < b*beta^(j+1).}
- Compute q* :
- q* := floor((r[j+n]*beta+r[j+n-1])/b[n-1]).
- In case of overflow (q* >= beta) set q* := beta-1.
- Compute c2 := ((r[j+n]*beta+r[j+n-1]) - q* * b[n-1])*beta + r[j+n-2]
- and c3 := b[n-2] * q*.
- {We have 0 <= c2 < 2*beta^2, even 0 <= c2 < beta^2 if no overflow
- occurred. Furthermore 0 <= c3 < beta^2.
- If there was overflow and
- r[j+n]*beta+r[j+n-1] - q* * b[n-1] >= beta, i.e. c2 >= beta^2,
- the next test can be skipped.}
- While c3 > c2, {Here 0 <= c2 < c3 < beta^2}
- Put q* := q* - 1, c2 := c2 + b[n-1]*beta, c3 := c3 - b[n-2].
- If q* > 0:
- Put r := r - b * q* * beta^j. In detail:
- [r[n+j],...,r[j]] := [r[n+j],...,r[j]] - q* * [b[n-1],...,b[0]].
- hence: u:=0, for i:=0 to n-1 do
- u := u + q* * b[i],
- r[j+i]:=r[j+i]-(u mod beta) (+ beta, if carry),
- u:=u div beta (+ 1, if carry in subtraction)
- r[n+j]:=r[n+j]-u.
- {Since always u = (q* * [b[i-1],...,b[0]] div beta^i) + 1
- < q* + 1 <= beta,
- the carry u does not overflow.}
- If a negative carry occurs, put q* := q* - 1
- and [r[n+j],...,r[j]] := [r[n+j],...,r[j]] + [0,b[n-1],...,b[0]].
- Set q[j] := q*.
- Normalise [q[m-n],..,q[0]]; this yields the quotient q.
- Shift [r[n-1],...,r[0]] right by s bits and normalise; this yields the
- rest r.
- The room for q[j] can be allocated at the memory location of r[n+j].
- Finally, round-to-even:
- Shift r left by 1 bit.
- If r > b or if r = b and q[0] is odd, q := q+1.
- */
- const mp_limb_t *a_ptr = a.limbs;
- size_t a_len = a.nlimbs;
- const mp_limb_t *b_ptr = b.limbs;
- size_t b_len = b.nlimbs;
- mp_limb_t *roomptr;
- mp_limb_t *tmp_roomptr = NULL;
- mp_limb_t *q_ptr;
- size_t q_len;
- mp_limb_t *r_ptr;
- size_t r_len;
-
- /* Allocate room for a_len+2 digits.
- (Need a_len+1 digits for the real division and 1 more digit for the
- final rounding of q.) */
- roomptr = (mp_limb_t *) malloc ((a_len + 2) * sizeof (mp_limb_t));
- if (roomptr == NULL)
- return NULL;
-
- /* Normalise a. */
- while (a_len > 0 && a_ptr[a_len - 1] == 0)
- a_len--;
-
- /* Normalise b. */
- for (;;)
- {
- if (b_len == 0)
- /* Division by zero. */
- abort ();
- if (b_ptr[b_len - 1] == 0)
- b_len--;
- else
- break;
- }
-
- /* Here m = a_len >= 0 and n = b_len > 0. */
-
- if (a_len < b_len)
- {
- /* m<n: trivial case. q=0, r := copy of a. */
- r_ptr = roomptr;
- r_len = a_len;
- memcpy (r_ptr, a_ptr, a_len * sizeof (mp_limb_t));
- q_ptr = roomptr + a_len;
- q_len = 0;
- }
- else if (b_len == 1)
- {
- /* n=1: single precision division.
- beta^(m-1) <= a < beta^m ==> beta^(m-2) <= a/b < beta^m */
- r_ptr = roomptr;
- q_ptr = roomptr + 1;
- {
- mp_limb_t den = b_ptr[0];
- mp_limb_t remainder = 0;
- const mp_limb_t *sourceptr = a_ptr + a_len;
- mp_limb_t *destptr = q_ptr + a_len;
- size_t count;
- for (count = a_len; count > 0; count--)
- {
- mp_twolimb_t num =
- ((mp_twolimb_t) remainder << GMP_LIMB_BITS) | *--sourceptr;
- *--destptr = num / den;
- remainder = num % den;
- }
- /* Normalise and store r. */
- if (remainder > 0)
- {
- r_ptr[0] = remainder;
- r_len = 1;
- }
- else
- r_len = 0;
- /* Normalise q. */
- q_len = a_len;
- if (q_ptr[q_len - 1] == 0)
- q_len--;
- }
- }
- else
- {
- /* n>1: multiple precision division.
- beta^(m-1) <= a < beta^m, beta^(n-1) <= b < beta^n ==>
- beta^(m-n-1) <= a/b < beta^(m-n+1). */
- /* Determine s. */
- size_t s;
- {
- mp_limb_t msd = b_ptr[b_len - 1]; /* = b[n-1], > 0 */
- /* Determine s = GMP_LIMB_BITS - integer_length (msd).
- Code copied from gnulib's integer_length.c. */
-# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) \
- || (__clang_major__ >= 4)
- s = __builtin_clz (msd);
-# else
-# if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT
- if (GMP_LIMB_BITS <= DBL_MANT_BIT)
- {
- /* Use 'double' operations.
- Assumes an IEEE 754 'double' implementation. */
-# define DBL_EXP_MASK ((DBL_MAX_EXP - DBL_MIN_EXP) | 7)
-# define DBL_EXP_BIAS (DBL_EXP_MASK / 2 - 1)
-# define NWORDS \
- ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
- union { double value; unsigned int word[NWORDS]; } m;
-
- /* Use a single integer to floating-point conversion. */
- m.value = msd;
-
- s = GMP_LIMB_BITS
- - (((m.word[DBL_EXPBIT0_WORD] >> DBL_EXPBIT0_BIT) & DBL_EXP_MASK)
- - DBL_EXP_BIAS);
- }
- else
-# undef NWORDS
-# endif
- {
- s = 31;
- if (msd >= 0x10000)
- {
- msd = msd >> 16;
- s -= 16;
- }
- if (msd >= 0x100)
- {
- msd = msd >> 8;
- s -= 8;
- }
- if (msd >= 0x10)
- {
- msd = msd >> 4;
- s -= 4;
- }
- if (msd >= 0x4)
- {
- msd = msd >> 2;
- s -= 2;
- }
- if (msd >= 0x2)
- {
- msd = msd >> 1;
- s -= 1;
- }
- }
-# endif
- }
- /* 0 <= s < GMP_LIMB_BITS.
- Copy b, shifting it left by s bits. */
- if (s > 0)
- {
- tmp_roomptr = (mp_limb_t *) malloc (b_len * sizeof (mp_limb_t));
- if (tmp_roomptr == NULL)
- {
- free (roomptr);
- return NULL;
- }
- {
- const mp_limb_t *sourceptr = b_ptr;
- mp_limb_t *destptr = tmp_roomptr;
- mp_twolimb_t accu = 0;
- size_t count;
- for (count = b_len; count > 0; count--)
- {
- accu += (mp_twolimb_t) *sourceptr++ << s;
- *destptr++ = (mp_limb_t) accu;
- accu = accu >> GMP_LIMB_BITS;
- }
- /* accu must be zero, since that was how s was determined. */
- if (accu != 0)
- abort ();
- }
- b_ptr = tmp_roomptr;
- }
- /* Copy a, shifting it left by s bits, yields r.
- Memory layout:
- At the beginning: r = roomptr[0..a_len],
- at the end: r = roomptr[0..b_len-1], q = roomptr[b_len..a_len] */
- r_ptr = roomptr;
- if (s == 0)
- {
- memcpy (r_ptr, a_ptr, a_len * sizeof (mp_limb_t));
- r_ptr[a_len] = 0;
- }
- else
- {
- const mp_limb_t *sourceptr = a_ptr;
- mp_limb_t *destptr = r_ptr;
- mp_twolimb_t accu = 0;
- size_t count;
- for (count = a_len; count > 0; count--)
- {
- accu += (mp_twolimb_t) *sourceptr++ << s;
- *destptr++ = (mp_limb_t) accu;
- accu = accu >> GMP_LIMB_BITS;
- }
- *destptr++ = (mp_limb_t) accu;
- }
- q_ptr = roomptr + b_len;
- q_len = a_len - b_len + 1; /* q will have m-n+1 limbs */
- {
- size_t j = a_len - b_len; /* m-n */
- mp_limb_t b_msd = b_ptr[b_len - 1]; /* b[n-1] */
- mp_limb_t b_2msd = b_ptr[b_len - 2]; /* b[n-2] */
- mp_twolimb_t b_msdd = /* b[n-1]*beta+b[n-2] */
- ((mp_twolimb_t) b_msd << GMP_LIMB_BITS) | b_2msd;
- /* Division loop, traversed m-n+1 times.
- j counts down, b is unchanged, beta/2 <= b[n-1] < beta. */
- for (;;)
- {
- mp_limb_t q_star;
- mp_limb_t c1;
- if (r_ptr[j + b_len] < b_msd) /* r[j+n] < b[n-1] ? */
- {
- /* Divide r[j+n]*beta+r[j+n-1] by b[n-1], no overflow. */
- mp_twolimb_t num =
- ((mp_twolimb_t) r_ptr[j + b_len] << GMP_LIMB_BITS)
- | r_ptr[j + b_len - 1];
- q_star = num / b_msd;
- c1 = num % b_msd;
- }
- else
- {
- /* Overflow, hence r[j+n]*beta+r[j+n-1] >= beta*b[n-1]. */
- q_star = (mp_limb_t)~(mp_limb_t)0; /* q* = beta-1 */
- /* Test whether r[j+n]*beta+r[j+n-1] - (beta-1)*b[n-1] >= beta
- <==> r[j+n]*beta+r[j+n-1] + b[n-1] >= beta*b[n-1]+beta
- <==> b[n-1] < floor((r[j+n]*beta+r[j+n-1]+b[n-1])/beta)
- {<= beta !}.
- If yes, jump directly to the subtraction loop.
- (Otherwise, r[j+n]*beta+r[j+n-1] - (beta-1)*b[n-1] < beta
- <==> floor((r[j+n]*beta+r[j+n-1]+b[n-1])/beta) = b[n-1] ) */
- if (r_ptr[j + b_len] > b_msd
- || (c1 = r_ptr[j + b_len - 1] + b_msd) < b_msd)
- /* r[j+n] >= b[n-1]+1 or
- r[j+n] = b[n-1] and the addition r[j+n-1]+b[n-1] gives a
- carry. */
- goto subtract;
- }
- /* q_star = q*,
- c1 = (r[j+n]*beta+r[j+n-1]) - q* * b[n-1] (>=0, <beta). */
- {
- mp_twolimb_t c2 = /* c1*beta+r[j+n-2] */
- ((mp_twolimb_t) c1 << GMP_LIMB_BITS) | r_ptr[j + b_len - 2];
- mp_twolimb_t c3 = /* b[n-2] * q* */
- (mp_twolimb_t) b_2msd * (mp_twolimb_t) q_star;
- /* While c2 < c3, increase c2 and decrease c3.
- Consider c3-c2. While it is > 0, decrease it by
- b[n-1]*beta+b[n-2]. Because of b[n-1]*beta+b[n-2] >= beta^2/2
- this can happen only twice. */
- if (c3 > c2)
- {
- q_star = q_star - 1; /* q* := q* - 1 */
- if (c3 - c2 > b_msdd)
- q_star = q_star - 1; /* q* := q* - 1 */
- }
- }
- if (q_star > 0)
- subtract:
- {
- /* Subtract r := r - b * q* * beta^j. */
- mp_limb_t cr;
- {
- const mp_limb_t *sourceptr = b_ptr;
- mp_limb_t *destptr = r_ptr + j;
- mp_twolimb_t carry = 0;
- size_t count;
- for (count = b_len; count > 0; count--)
- {
- /* Here 0 <= carry <= q*. */
- carry =
- carry
- + (mp_twolimb_t) q_star * (mp_twolimb_t) *sourceptr++
- + (mp_limb_t) ~(*destptr);
- /* Here 0 <= carry <= beta*q* + beta-1. */
- *destptr++ = ~(mp_limb_t) carry;
- carry = carry >> GMP_LIMB_BITS; /* <= q* */
- }
- cr = (mp_limb_t) carry;
- }
- /* Subtract cr from r_ptr[j + b_len], then forget about
- r_ptr[j + b_len]. */
- if (cr > r_ptr[j + b_len])
- {
- /* Subtraction gave a carry. */
- q_star = q_star - 1; /* q* := q* - 1 */
- /* Add b back. */
- {
- const mp_limb_t *sourceptr = b_ptr;
- mp_limb_t *destptr = r_ptr + j;
- mp_limb_t carry = 0;
- size_t count;
- for (count = b_len; count > 0; count--)
- {
- mp_limb_t source1 = *sourceptr++;
- mp_limb_t source2 = *destptr;
- *destptr++ = source1 + source2 + carry;
- carry =
- (carry
- ? source1 >= (mp_limb_t) ~source2
- : source1 > (mp_limb_t) ~source2);
- }
- }
- /* Forget about the carry and about r[j+n]. */
- }
- }
- /* q* is determined. Store it as q[j]. */
- q_ptr[j] = q_star;
- if (j == 0)
- break;
- j--;
- }
- }
- r_len = b_len;
- /* Normalise q. */
- if (q_ptr[q_len - 1] == 0)
- q_len--;
-# if 0 /* Not needed here, since we need r only to compare it with b/2, and
- b is shifted left by s bits. */
- /* Shift r right by s bits. */
- if (s > 0)
- {
- mp_limb_t ptr = r_ptr + r_len;
- mp_twolimb_t accu = 0;
- size_t count;
- for (count = r_len; count > 0; count--)
- {
- accu = (mp_twolimb_t) (mp_limb_t) accu << GMP_LIMB_BITS;
- accu += (mp_twolimb_t) *--ptr << (GMP_LIMB_BITS - s);
- *ptr = (mp_limb_t) (accu >> GMP_LIMB_BITS);
- }
- }
-# endif
- /* Normalise r. */
- while (r_len > 0 && r_ptr[r_len - 1] == 0)
- r_len--;
- }
- /* Compare r << 1 with b. */
- if (r_len > b_len)
- goto increment_q;
- {
- size_t i;
- for (i = b_len;;)
- {
- mp_limb_t r_i =
- (i <= r_len && i > 0 ? r_ptr[i - 1] >> (GMP_LIMB_BITS - 1) : 0)
- | (i < r_len ? r_ptr[i] << 1 : 0);
- mp_limb_t b_i = (i < b_len ? b_ptr[i] : 0);
- if (r_i > b_i)
- goto increment_q;
- if (r_i < b_i)
- goto keep_q;
- if (i == 0)
- break;
- i--;
- }
- }
- if (q_len > 0 && ((q_ptr[0] & 1) != 0))
- /* q is odd. */
- increment_q:
- {
- size_t i;
- for (i = 0; i < q_len; i++)
- if (++(q_ptr[i]) != 0)
- goto keep_q;
- q_ptr[q_len++] = 1;
- }
- keep_q:
- free (tmp_roomptr);
- q->limbs = q_ptr;
- q->nlimbs = q_len;
- return roomptr;
-}
-
-/* Convert a bignum a >= 0, multiplied with 10^extra_zeroes, to decimal
- representation.
- Destroys the contents of a.
- Return the allocated memory - containing the decimal digits in low-to-high
- order, terminated with a NUL character - in case of success, NULL in case
- of memory allocation failure. */
-static char *
-convert_to_decimal (mpn_t a, size_t extra_zeroes)
-{
- mp_limb_t *a_ptr = a.limbs;
- size_t a_len = a.nlimbs;
- /* 0.03345 is slightly larger than log(2)/(9*log(10)). */
- size_t c_len = 9 * ((size_t)(a_len * (GMP_LIMB_BITS * 0.03345f)) + 1);
- /* We need extra_zeroes bytes for zeroes, followed by c_len bytes for the
- digits of a, followed by 1 byte for the terminating NUL. */
- char *c_ptr = (char *) malloc (xsum (xsum (extra_zeroes, c_len), 1));
- if (c_ptr != NULL)
- {
- char *d_ptr = c_ptr;
- for (; extra_zeroes > 0; extra_zeroes--)
- *d_ptr++ = '0';
- while (a_len > 0)
- {
- /* Divide a by 10^9, in-place. */
- mp_limb_t remainder = 0;
- mp_limb_t *ptr = a_ptr + a_len;
- size_t count;
- for (count = a_len; count > 0; count--)
- {
- mp_twolimb_t num =
- ((mp_twolimb_t) remainder << GMP_LIMB_BITS) | *--ptr;
- *ptr = num / 1000000000;
- remainder = num % 1000000000;
- }
- /* Store the remainder as 9 decimal digits. */
- for (count = 9; count > 0; count--)
- {
- *d_ptr++ = '0' + (remainder % 10);
- remainder = remainder / 10;
- }
- /* Normalize a. */
- if (a_ptr[a_len - 1] == 0)
- a_len--;
- }
- /* Remove leading zeroes. */
- while (d_ptr > c_ptr && d_ptr[-1] == '0')
- d_ptr--;
- /* But keep at least one zero. */
- if (d_ptr == c_ptr)
- *d_ptr++ = '0';
- /* Terminate the string. */
- *d_ptr = '\0';
- }
- return c_ptr;
-}
-
-# if NEED_PRINTF_LONG_DOUBLE
-
-/* Assuming x is finite and >= 0:
- write x as x = 2^e * m, where m is a bignum.
- Return the allocated memory in case of success, NULL in case of memory
- allocation failure. */
-static void *
-decode_long_double (long double x, int *ep, mpn_t *mp)
-{
- mpn_t m;
- int exp;
- long double y;
- size_t i;
-
- /* Allocate memory for result. */
- m.nlimbs = (LDBL_MANT_BIT + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS;
- m.limbs = (mp_limb_t *) malloc (m.nlimbs * sizeof (mp_limb_t));
- if (m.limbs == NULL)
- return NULL;
- /* Split into exponential part and mantissa. */
- y = frexpl (x, &exp);
- if (!(y >= 0.0L && y < 1.0L))
- abort ();
- /* x = 2^exp * y = 2^(exp - LDBL_MANT_BIT) * (y * 2^LDBL_MANT_BIT), and the
- latter is an integer. */
- /* Convert the mantissa (y * 2^LDBL_MANT_BIT) to a sequence of limbs.
- I'm not sure whether it's safe to cast a 'long double' value between
- 2^31 and 2^32 to 'unsigned int', therefore play safe and cast only
- 'long double' values between 0 and 2^16 (to 'unsigned int' or 'int',
- doesn't matter). */
-# if (LDBL_MANT_BIT % GMP_LIMB_BITS) != 0
-# if (LDBL_MANT_BIT % GMP_LIMB_BITS) > GMP_LIMB_BITS / 2
- {
- mp_limb_t hi, lo;
- y *= (mp_limb_t) 1 << (LDBL_MANT_BIT % (GMP_LIMB_BITS / 2));
- hi = (int) y;
- y -= hi;
- if (!(y >= 0.0L && y < 1.0L))
- abort ();
- y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
- lo = (int) y;
- y -= lo;
- if (!(y >= 0.0L && y < 1.0L))
- abort ();
- m.limbs[LDBL_MANT_BIT / GMP_LIMB_BITS] = (hi << (GMP_LIMB_BITS / 2)) | lo;
- }
-# else
- {
- mp_limb_t d;
- y *= (mp_limb_t) 1 << (LDBL_MANT_BIT % GMP_LIMB_BITS);
- d = (int) y;
- y -= d;
- if (!(y >= 0.0L && y < 1.0L))
- abort ();
- m.limbs[LDBL_MANT_BIT / GMP_LIMB_BITS] = d;
- }
-# endif
-# endif
- for (i = LDBL_MANT_BIT / GMP_LIMB_BITS; i > 0; )
- {
- mp_limb_t hi, lo;
- y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
- hi = (int) y;
- y -= hi;
- if (!(y >= 0.0L && y < 1.0L))
- abort ();
- y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
- lo = (int) y;
- y -= lo;
- if (!(y >= 0.0L && y < 1.0L))
- abort ();
- m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo;
- }
-# if 0 /* On FreeBSD 6.1/x86, 'long double' numbers sometimes have excess
- precision. */
- if (!(y == 0.0L))
- abort ();
-# endif
- /* Normalise. */
- while (m.nlimbs > 0 && m.limbs[m.nlimbs - 1] == 0)
- m.nlimbs--;
- *mp = m;
- *ep = exp - LDBL_MANT_BIT;
- return m.limbs;
-}
-
-# endif
-
-# if NEED_PRINTF_DOUBLE
-
-/* Assuming x is finite and >= 0:
- write x as x = 2^e * m, where m is a bignum.
- Return the allocated memory in case of success, NULL in case of memory
- allocation failure. */
-static void *
-decode_double (double x, int *ep, mpn_t *mp)
-{
- mpn_t m;
- int exp;
- double y;
- size_t i;
-
- /* Allocate memory for result. */
- m.nlimbs = (DBL_MANT_BIT + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS;
- m.limbs = (mp_limb_t *) malloc (m.nlimbs * sizeof (mp_limb_t));
- if (m.limbs == NULL)
- return NULL;
- /* Split into exponential part and mantissa. */
- y = frexp (x, &exp);
- if (!(y >= 0.0 && y < 1.0))
- abort ();
- /* x = 2^exp * y = 2^(exp - DBL_MANT_BIT) * (y * 2^DBL_MANT_BIT), and the
- latter is an integer. */
- /* Convert the mantissa (y * 2^DBL_MANT_BIT) to a sequence of limbs.
- I'm not sure whether it's safe to cast a 'double' value between
- 2^31 and 2^32 to 'unsigned int', therefore play safe and cast only
- 'double' values between 0 and 2^16 (to 'unsigned int' or 'int',
- doesn't matter). */
-# if (DBL_MANT_BIT % GMP_LIMB_BITS) != 0
-# if (DBL_MANT_BIT % GMP_LIMB_BITS) > GMP_LIMB_BITS / 2
- {
- mp_limb_t hi, lo;
- y *= (mp_limb_t) 1 << (DBL_MANT_BIT % (GMP_LIMB_BITS / 2));
- hi = (int) y;
- y -= hi;
- if (!(y >= 0.0 && y < 1.0))
- abort ();
- y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
- lo = (int) y;
- y -= lo;
- if (!(y >= 0.0 && y < 1.0))
- abort ();
- m.limbs[DBL_MANT_BIT / GMP_LIMB_BITS] = (hi << (GMP_LIMB_BITS / 2)) | lo;
- }
-# else
- {
- mp_limb_t d;
- y *= (mp_limb_t) 1 << (DBL_MANT_BIT % GMP_LIMB_BITS);
- d = (int) y;
- y -= d;
- if (!(y >= 0.0 && y < 1.0))
- abort ();
- m.limbs[DBL_MANT_BIT / GMP_LIMB_BITS] = d;
- }
-# endif
-# endif
- for (i = DBL_MANT_BIT / GMP_LIMB_BITS; i > 0; )
- {
- mp_limb_t hi, lo;
- y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
- hi = (int) y;
- y -= hi;
- if (!(y >= 0.0 && y < 1.0))
- abort ();
- y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
- lo = (int) y;
- y -= lo;
- if (!(y >= 0.0 && y < 1.0))
- abort ();
- m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo;
- }
- if (!(y == 0.0))
- abort ();
- /* Normalise. */
- while (m.nlimbs > 0 && m.limbs[m.nlimbs - 1] == 0)
- m.nlimbs--;
- *mp = m;
- *ep = exp - DBL_MANT_BIT;
- return m.limbs;
-}
-
-# endif
-
-/* Assuming x = 2^e * m is finite and >= 0, and n is an integer:
- Returns the decimal representation of round (x * 10^n).
- Return the allocated memory - containing the decimal digits in low-to-high
- order, terminated with a NUL character - in case of success, NULL in case
- of memory allocation failure. */
-static char *
-scale10_round_decimal_decoded (int e, mpn_t m, void *memory, int n)
-{
- int s;
- size_t extra_zeroes;
- unsigned int abs_n;
- unsigned int abs_s;
- mp_limb_t *pow5_ptr;
- size_t pow5_len;
- unsigned int s_limbs;
- unsigned int s_bits;
- mpn_t pow5;
- mpn_t z;
- void *z_memory;
- char *digits;
-
- if (memory == NULL)
- return NULL;
- /* x = 2^e * m, hence
- y = round (2^e * 10^n * m) = round (2^(e+n) * 5^n * m)
- = round (2^s * 5^n * m). */
- s = e + n;
- extra_zeroes = 0;
- /* Factor out a common power of 10 if possible. */
- if (s > 0 && n > 0)
- {
- extra_zeroes = (s < n ? s : n);
- s -= extra_zeroes;
- n -= extra_zeroes;
- }
- /* Here y = round (2^s * 5^n * m) * 10^extra_zeroes.
- Before converting to decimal, we need to compute
- z = round (2^s * 5^n * m). */
- /* Compute 5^|n|, possibly shifted by |s| bits if n and s have the same
- sign. 2.322 is slightly larger than log(5)/log(2). */
- abs_n = (n >= 0 ? n : -n);
- abs_s = (s >= 0 ? s : -s);
- pow5_ptr = (mp_limb_t *) malloc (((int)(abs_n * (2.322f / GMP_LIMB_BITS)) + 1
- + abs_s / GMP_LIMB_BITS + 1)
- * sizeof (mp_limb_t));
- if (pow5_ptr == NULL)
- {
- free (memory);
- return NULL;
- }
- /* Initialize with 1. */
- pow5_ptr[0] = 1;
- pow5_len = 1;
- /* Multiply with 5^|n|. */
- if (abs_n > 0)
- {
- static mp_limb_t const small_pow5[13 + 1] =
- {
- 1, 5, 25, 125, 625, 3125, 15625, 78125, 390625, 1953125, 9765625,
- 48828125, 244140625, 1220703125
- };
- unsigned int n13;
- for (n13 = 0; n13 <= abs_n; n13 += 13)
- {
- mp_limb_t digit1 = small_pow5[n13 + 13 <= abs_n ? 13 : abs_n - n13];
- size_t j;
- mp_twolimb_t carry = 0;
- for (j = 0; j < pow5_len; j++)
- {
- mp_limb_t digit2 = pow5_ptr[j];
- carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2;
- pow5_ptr[j] = (mp_limb_t) carry;
- carry = carry >> GMP_LIMB_BITS;
- }
- if (carry > 0)
- pow5_ptr[pow5_len++] = (mp_limb_t) carry;
- }
- }
- s_limbs = abs_s / GMP_LIMB_BITS;
- s_bits = abs_s % GMP_LIMB_BITS;
- if (n >= 0 ? s >= 0 : s <= 0)
- {
- /* Multiply with 2^|s|. */
- if (s_bits > 0)
- {
- mp_limb_t *ptr = pow5_ptr;
- mp_twolimb_t accu = 0;
- size_t count;
- for (count = pow5_len; count > 0; count--)
- {
- accu += (mp_twolimb_t) *ptr << s_bits;
- *ptr++ = (mp_limb_t) accu;
- accu = accu >> GMP_LIMB_BITS;
- }
- if (accu > 0)
- {
- *ptr = (mp_limb_t) accu;
- pow5_len++;
- }
- }
- if (s_limbs > 0)
- {
- size_t count;
- for (count = pow5_len; count > 0;)
- {
- count--;
- pow5_ptr[s_limbs + count] = pow5_ptr[count];
- }
- for (count = s_limbs; count > 0;)
- {
- count--;
- pow5_ptr[count] = 0;
- }
- pow5_len += s_limbs;
- }
- pow5.limbs = pow5_ptr;
- pow5.nlimbs = pow5_len;
- if (n >= 0)
- {
- /* Multiply m with pow5. No division needed. */
- z_memory = multiply (m, pow5, &z);
- }
- else
- {
- /* Divide m by pow5 and round. */
- z_memory = divide (m, pow5, &z);
- }
- }
- else
- {
- pow5.limbs = pow5_ptr;
- pow5.nlimbs = pow5_len;
- if (n >= 0)
- {
- /* n >= 0, s < 0.
- Multiply m with pow5, then divide by 2^|s|. */
- mpn_t numerator;
- mpn_t denominator;
- void *tmp_memory;
- tmp_memory = multiply (m, pow5, &numerator);
- if (tmp_memory == NULL)
- {
- free (pow5_ptr);
- free (memory);
- return NULL;
- }
- /* Construct 2^|s|. */
- {
- mp_limb_t *ptr = pow5_ptr + pow5_len;
- size_t i;
- for (i = 0; i < s_limbs; i++)
- ptr[i] = 0;
- ptr[s_limbs] = (mp_limb_t) 1 << s_bits;
- denominator.limbs = ptr;
- denominator.nlimbs = s_limbs + 1;
- }
- z_memory = divide (numerator, denominator, &z);
- free (tmp_memory);
- }
- else
- {
- /* n < 0, s > 0.
- Multiply m with 2^s, then divide by pow5. */
- mpn_t numerator;
- mp_limb_t *num_ptr;
- num_ptr = (mp_limb_t *) malloc ((m.nlimbs + s_limbs + 1)
- * sizeof (mp_limb_t));
- if (num_ptr == NULL)
- {
- free (pow5_ptr);
- free (memory);
- return NULL;
- }
- {
- mp_limb_t *destptr = num_ptr;
- {
- size_t i;
- for (i = 0; i < s_limbs; i++)
- *destptr++ = 0;
- }
- if (s_bits > 0)
- {
- const mp_limb_t *sourceptr = m.limbs;
- mp_twolimb_t accu = 0;
- size_t count;
- for (count = m.nlimbs; count > 0; count--)
- {
- accu += (mp_twolimb_t) *sourceptr++ << s_bits;
- *destptr++ = (mp_limb_t) accu;
- accu = accu >> GMP_LIMB_BITS;
- }
- if (accu > 0)
- *destptr++ = (mp_limb_t) accu;
- }
- else
- {
- const mp_limb_t *sourceptr = m.limbs;
- size_t count;
- for (count = m.nlimbs; count > 0; count--)
- *destptr++ = *sourceptr++;
- }
- numerator.limbs = num_ptr;
- numerator.nlimbs = destptr - num_ptr;
- }
- z_memory = divide (numerator, pow5, &z);
- free (num_ptr);
- }
- }
- free (pow5_ptr);
- free (memory);
-
- /* Here y = round (x * 10^n) = z * 10^extra_zeroes. */
-
- if (z_memory == NULL)
- return NULL;
- digits = convert_to_decimal (z, extra_zeroes);
- free (z_memory);
- return digits;
-}
-
-# if NEED_PRINTF_LONG_DOUBLE
-
-/* Assuming x is finite and >= 0, and n is an integer:
- Returns the decimal representation of round (x * 10^n).
- Return the allocated memory - containing the decimal digits in low-to-high
- order, terminated with a NUL character - in case of success, NULL in case
- of memory allocation failure. */
-static char *
-scale10_round_decimal_long_double (long double x, int n)
-{
- int e IF_LINT(= 0);
- mpn_t m;
- void *memory = decode_long_double (x, &e, &m);
- return scale10_round_decimal_decoded (e, m, memory, n);
-}
-
-# endif
-
-# if NEED_PRINTF_DOUBLE
-
-/* Assuming x is finite and >= 0, and n is an integer:
- Returns the decimal representation of round (x * 10^n).
- Return the allocated memory - containing the decimal digits in low-to-high
- order, terminated with a NUL character - in case of success, NULL in case
- of memory allocation failure. */
-static char *
-scale10_round_decimal_double (double x, int n)
-{
- int e IF_LINT(= 0);
- mpn_t m;
- void *memory = decode_double (x, &e, &m);
- return scale10_round_decimal_decoded (e, m, memory, n);
-}
-
-# endif
-
-# if NEED_PRINTF_LONG_DOUBLE
-
-/* Assuming x is finite and > 0:
- Return an approximation for n with 10^n <= x < 10^(n+1).
- The approximation is usually the right n, but may be off by 1 sometimes. */
-static int
-floorlog10l (long double x)
-{
- int exp;
- long double y;
- double z;
- double l;
-
- /* Split into exponential part and mantissa. */
- y = frexpl (x, &exp);
- if (!(y >= 0.0L && y < 1.0L))
- abort ();
- if (y == 0.0L)
- return INT_MIN;
- if (y < 0.5L)
- {
- while (y < (1.0L / (1 << (GMP_LIMB_BITS / 2)) / (1 << (GMP_LIMB_BITS / 2))))
- {
- y *= 1.0L * (1 << (GMP_LIMB_BITS / 2)) * (1 << (GMP_LIMB_BITS / 2));
- exp -= GMP_LIMB_BITS;
- }
- if (y < (1.0L / (1 << 16)))
- {
- y *= 1.0L * (1 << 16);
- exp -= 16;
- }
- if (y < (1.0L / (1 << 8)))
- {
- y *= 1.0L * (1 << 8);
- exp -= 8;
- }
- if (y < (1.0L / (1 << 4)))
- {
- y *= 1.0L * (1 << 4);
- exp -= 4;
- }
- if (y < (1.0L / (1 << 2)))
- {
- y *= 1.0L * (1 << 2);
- exp -= 2;
- }
- if (y < (1.0L / (1 << 1)))
- {
- y *= 1.0L * (1 << 1);
- exp -= 1;
- }
- }
- if (!(y >= 0.5L && y < 1.0L))
- abort ();
- /* Compute an approximation for l = log2(x) = exp + log2(y). */
- l = exp;
- z = y;
- if (z < 0.70710678118654752444)
- {
- z *= 1.4142135623730950488;
- l -= 0.5;
- }
- if (z < 0.8408964152537145431)
- {
- z *= 1.1892071150027210667;
- l -= 0.25;
- }
- if (z < 0.91700404320467123175)
- {
- z *= 1.0905077326652576592;
- l -= 0.125;
- }
- if (z < 0.9576032806985736469)
- {
- z *= 1.0442737824274138403;
- l -= 0.0625;
- }
- /* Now 0.95 <= z <= 1.01. */
- z = 1 - z;
- /* log2(1-z) = 1/log(2) * (- z - z^2/2 - z^3/3 - z^4/4 - ...)
- Four terms are enough to get an approximation with error < 10^-7. */
- l -= 1.4426950408889634074 * z * (1.0 + z * (0.5 + z * ((1.0 / 3) + z * 0.25)));
- /* Finally multiply with log(2)/log(10), yields an approximation for
- log10(x). */
- l *= 0.30102999566398119523;
- /* Round down to the next integer. */
- return (int) l + (l < 0 ? -1 : 0);
-}
-
-# endif
-
-# if NEED_PRINTF_DOUBLE
-
-/* Assuming x is finite and > 0:
- Return an approximation for n with 10^n <= x < 10^(n+1).
- The approximation is usually the right n, but may be off by 1 sometimes. */
-static int
-floorlog10 (double x)
-{
- int exp;
- double y;
- double z;
- double l;
-
- /* Split into exponential part and mantissa. */
- y = frexp (x, &exp);
- if (!(y >= 0.0 && y < 1.0))
- abort ();
- if (y == 0.0)
- return INT_MIN;
- if (y < 0.5)
- {
- while (y < (1.0 / (1 << (GMP_LIMB_BITS / 2)) / (1 << (GMP_LIMB_BITS / 2))))
- {
- y *= 1.0 * (1 << (GMP_LIMB_BITS / 2)) * (1 << (GMP_LIMB_BITS / 2));
- exp -= GMP_LIMB_BITS;
- }
- if (y < (1.0 / (1 << 16)))
- {
- y *= 1.0 * (1 << 16);
- exp -= 16;
- }
- if (y < (1.0 / (1 << 8)))
- {
- y *= 1.0 * (1 << 8);
- exp -= 8;
- }
- if (y < (1.0 / (1 << 4)))
- {
- y *= 1.0 * (1 << 4);
- exp -= 4;
- }
- if (y < (1.0 / (1 << 2)))
- {
- y *= 1.0 * (1 << 2);
- exp -= 2;
- }
- if (y < (1.0 / (1 << 1)))
- {
- y *= 1.0 * (1 << 1);
- exp -= 1;
- }
- }
- if (!(y >= 0.5 && y < 1.0))
- abort ();
- /* Compute an approximation for l = log2(x) = exp + log2(y). */
- l = exp;
- z = y;
- if (z < 0.70710678118654752444)
- {
- z *= 1.4142135623730950488;
- l -= 0.5;
- }
- if (z < 0.8408964152537145431)
- {
- z *= 1.1892071150027210667;
- l -= 0.25;
- }
- if (z < 0.91700404320467123175)
- {
- z *= 1.0905077326652576592;
- l -= 0.125;
- }
- if (z < 0.9576032806985736469)
- {
- z *= 1.0442737824274138403;
- l -= 0.0625;
- }
- /* Now 0.95 <= z <= 1.01. */
- z = 1 - z;
- /* log2(1-z) = 1/log(2) * (- z - z^2/2 - z^3/3 - z^4/4 - ...)
- Four terms are enough to get an approximation with error < 10^-7. */
- l -= 1.4426950408889634074 * z * (1.0 + z * (0.5 + z * ((1.0 / 3) + z * 0.25)));
- /* Finally multiply with log(2)/log(10), yields an approximation for
- log10(x). */
- l *= 0.30102999566398119523;
- /* Round down to the next integer. */
- return (int) l + (l < 0 ? -1 : 0);
-}
-
-# endif
-
-/* Tests whether a string of digits consists of exactly PRECISION zeroes and
- a single '1' digit. */
-static int
-is_borderline (const char *digits, size_t precision)
-{
- for (; precision > 0; precision--, digits++)
- if (*digits != '0')
- return 0;
- if (*digits != '1')
- return 0;
- digits++;
- return *digits == '\0';
-}
-
-#endif
-
-#if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF
-
-/* Use a different function name, to make it possible that the 'wchar_t'
- parametrization and the 'char' parametrization get compiled in the same
- translation unit. */
-# if WIDE_CHAR_VERSION
-# define MAX_ROOM_NEEDED wmax_room_needed
-# else
-# define MAX_ROOM_NEEDED max_room_needed
-# endif
-
-/* Returns the number of TCHAR_T units needed as temporary space for the result
- of sprintf or SNPRINTF of a single conversion directive. */
-static size_t
-MAX_ROOM_NEEDED (const arguments *ap, size_t arg_index, FCHAR_T conversion,
- arg_type type, int flags, size_t width, int has_precision,
- size_t precision, int pad_ourselves)
-{
- size_t tmp_length;
-
- switch (conversion)
- {
- case 'd': case 'i': case 'u':
- if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
- tmp_length =
- (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
- * 0.30103 /* binary -> decimal */
- )
- + 1; /* turn floor into ceil */
- else if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
- tmp_length =
- (unsigned int) (sizeof (unsigned long) * CHAR_BIT
- * 0.30103 /* binary -> decimal */
- )
- + 1; /* turn floor into ceil */
- else
- tmp_length =
- (unsigned int) (sizeof (unsigned int) * CHAR_BIT
- * 0.30103 /* binary -> decimal */
- )
- + 1; /* turn floor into ceil */
- if (tmp_length < precision)
- tmp_length = precision;
- /* Multiply by 2, as an estimate for FLAG_GROUP. */
- tmp_length = xsum (tmp_length, tmp_length);
- /* Add 1, to account for a leading sign. */
- tmp_length = xsum (tmp_length, 1);
- break;
-
- case 'o':
- if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
- tmp_length =
- (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
- * 0.333334 /* binary -> octal */
- )
- + 1; /* turn floor into ceil */
- else if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
- tmp_length =
- (unsigned int) (sizeof (unsigned long) * CHAR_BIT
- * 0.333334 /* binary -> octal */
- )
- + 1; /* turn floor into ceil */
- else
- tmp_length =
- (unsigned int) (sizeof (unsigned int) * CHAR_BIT
- * 0.333334 /* binary -> octal */
- )
- + 1; /* turn floor into ceil */
- if (tmp_length < precision)
- tmp_length = precision;
- /* Add 1, to account for a leading sign. */
- tmp_length = xsum (tmp_length, 1);
- break;
-
- case 'x': case 'X':
- if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
- tmp_length =
- (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
- * 0.25 /* binary -> hexadecimal */
- )
- + 1; /* turn floor into ceil */
- else if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
- tmp_length =
- (unsigned int) (sizeof (unsigned long) * CHAR_BIT
- * 0.25 /* binary -> hexadecimal */
- )
- + 1; /* turn floor into ceil */
- else
- tmp_length =
- (unsigned int) (sizeof (unsigned int) * CHAR_BIT
- * 0.25 /* binary -> hexadecimal */
- )
- + 1; /* turn floor into ceil */
- if (tmp_length < precision)
- tmp_length = precision;
- /* Add 2, to account for a leading sign or alternate form. */
- tmp_length = xsum (tmp_length, 2);
- break;
-
- case 'f': case 'F':
- if (type == TYPE_LONGDOUBLE)
- tmp_length =
- (unsigned int) (LDBL_MAX_EXP
- * 0.30103 /* binary -> decimal */
- * 2 /* estimate for FLAG_GROUP */
- )
- + 1 /* turn floor into ceil */
- + 10; /* sign, decimal point etc. */
- else
- tmp_length =
- (unsigned int) (DBL_MAX_EXP
- * 0.30103 /* binary -> decimal */
- * 2 /* estimate for FLAG_GROUP */
- )
- + 1 /* turn floor into ceil */
- + 10; /* sign, decimal point etc. */
- tmp_length = xsum (tmp_length, precision);
- break;
-
- case 'e': case 'E': case 'g': case 'G':
- tmp_length =
- 12; /* sign, decimal point, exponent etc. */
- tmp_length = xsum (tmp_length, precision);
- break;
-
- case 'a': case 'A':
- if (type == TYPE_LONGDOUBLE)
- tmp_length =
- (unsigned int) (LDBL_DIG
- * 0.831 /* decimal -> hexadecimal */
- )
- + 1; /* turn floor into ceil */
- else
- tmp_length =
- (unsigned int) (DBL_DIG
- * 0.831 /* decimal -> hexadecimal */
- )
- + 1; /* turn floor into ceil */
- if (tmp_length < precision)
- tmp_length = precision;
- /* Account for sign, decimal point etc. */
- tmp_length = xsum (tmp_length, 12);
- break;
-
- case 'c':
-# if HAVE_WINT_T && !WIDE_CHAR_VERSION
- if (type == TYPE_WIDE_CHAR)
- {
- tmp_length = MB_CUR_MAX;
-# if ENABLE_WCHAR_FALLBACK
- if (tmp_length < (sizeof (wchar_t) > 2 ? 10 : 6))
- tmp_length = (sizeof (wchar_t) > 2 ? 10 : 6);
-# endif
- }
- else
-# endif
- tmp_length = 1;
- break;
-
- case 's':
-# if HAVE_WCHAR_T
- if (type == TYPE_WIDE_STRING)
- {
-# if WIDE_CHAR_VERSION
- /* ISO C says about %ls in fwprintf:
- "If the precision is not specified or is greater than the size
- of the array, the array shall contain a null wide character."
- So if there is a precision, we must not use wcslen. */
- const wchar_t *arg = ap->arg[arg_index].a.a_wide_string;
-
- if (has_precision)
- tmp_length = local_wcsnlen (arg, precision);
- else
- tmp_length = local_wcslen (arg);
-# else
- /* ISO C says about %ls in fprintf:
- "If a precision is specified, no more than that many bytes are
- written (including shift sequences, if any), and the array
- shall contain a null wide character if, to equal the multibyte
- character sequence length given by the precision, the function
- would need to access a wide character one past the end of the
- array."
- So if there is a precision, we must not use wcslen. */
- /* This case has already been handled separately in VASNPRINTF. */
- abort ();
-# endif
- }
- else
-# endif
- {
-# if WIDE_CHAR_VERSION
- /* ISO C says about %s in fwprintf:
- "If the precision is not specified or is greater than the size
- of the converted array, the converted array shall contain a
- null wide character."
- So if there is a precision, we must not use strlen. */
- /* This case has already been handled separately in VASNPRINTF. */
- abort ();
-# else
- /* ISO C says about %s in fprintf:
- "If the precision is not specified or greater than the size of
- the array, the array shall contain a null character."
- So if there is a precision, we must not use strlen. */
- const char *arg = ap->arg[arg_index].a.a_string;
-
- if (has_precision)
- tmp_length = local_strnlen (arg, precision);
- else
- tmp_length = strlen (arg);
-# endif
- }
- break;
-
- case 'p':
- tmp_length =
- (unsigned int) (sizeof (void *) * CHAR_BIT
- * 0.25 /* binary -> hexadecimal */
- )
- + 1 /* turn floor into ceil */
- + 2; /* account for leading 0x */
- break;
-
- default:
- abort ();
- }
-
- if (!pad_ourselves)
- {
-# if ENABLE_UNISTDIO
- /* Padding considers the number of characters, therefore the number of
- elements after padding may be
- > max (tmp_length, width)
- but is certainly
- <= tmp_length + width. */
- tmp_length = xsum (tmp_length, width);
-# else
- /* Padding considers the number of elements, says POSIX. */
- if (tmp_length < width)
- tmp_length = width;
-# endif
- }
-
- tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
-
- return tmp_length;
-}
-
-#endif
-
-DCHAR_T *
-VASNPRINTF (DCHAR_T *resultbuf, size_t *lengthp,
- const FCHAR_T *format, va_list args)
-{
- DIRECTIVES d;
- arguments a;
-
- if (PRINTF_PARSE (format, &d, &a) < 0)
- /* errno is already set. */
- return NULL;
-
- /* Frees the memory allocated by this function. Preserves errno. */
-#define CLEANUP() \
- if (d.dir != d.direct_alloc_dir) \
- free (d.dir); \
- if (a.arg != a.direct_alloc_arg) \
- free (a.arg);
-
- if (PRINTF_FETCHARGS (args, &a) < 0)
- goto fail_1_with_EINVAL;
-
- {
- size_t buf_neededlength;
- TCHAR_T *buf;
- TCHAR_T *buf_malloced;
- const FCHAR_T *cp;
- size_t i;
- DIRECTIVE *dp;
- /* Output string accumulator. */
- DCHAR_T *result;
- size_t allocated;
- size_t length;
-
- /* Allocate a small buffer that will hold a directive passed to
- sprintf or snprintf. */
- buf_neededlength =
- xsum4 (7, d.max_width_length, d.max_precision_length, 6);
-#if HAVE_ALLOCA
- if (buf_neededlength < 4000 / sizeof (TCHAR_T))
- {
- buf = (TCHAR_T *) alloca (buf_neededlength * sizeof (TCHAR_T));
- buf_malloced = NULL;
- }
- else
-#endif
- {
- size_t buf_memsize = xtimes (buf_neededlength, sizeof (TCHAR_T));
- if (size_overflow_p (buf_memsize))
- goto out_of_memory_1;
- buf = (TCHAR_T *) malloc (buf_memsize);
- if (buf == NULL)
- goto out_of_memory_1;
- buf_malloced = buf;
- }
-
- result = resultbuf;
- allocated = (resultbuf != NULL ? *lengthp : 0);
- length = 0;
- /* Invariants:
- result is either == resultbuf or malloc-allocated.
- If result == NULL, resultbuf is == NULL as well.
- If length > 0, then result != NULL. */
-
- /* Ensures that allocated >= needed. Aborts through a jump to
- out_of_memory if needed is SIZE_MAX or otherwise too big. */
-#define ENSURE_ALLOCATION_ELSE(needed, oom_statement) \
- if ((needed) > allocated) \
- { \
- size_t memory_size; \
- DCHAR_T *memory; \
- \
- allocated = (allocated > 0 ? xtimes (allocated, 2) : 12); \
- if ((needed) > allocated) \
- allocated = (needed); \
- memory_size = xtimes (allocated, sizeof (DCHAR_T)); \
- if (size_overflow_p (memory_size)) \
- oom_statement \
- if (result == resultbuf) \
- memory = (DCHAR_T *) malloc (memory_size); \
- else \
- memory = (DCHAR_T *) realloc (result, memory_size); \
- if (memory == NULL) \
- oom_statement \
- if (result == resultbuf && length > 0) \
- DCHAR_CPY (memory, result, length); \
- result = memory; \
- }
-#define ENSURE_ALLOCATION(needed) \
- ENSURE_ALLOCATION_ELSE((needed), goto out_of_memory; )
-
- for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++)
- {
- if (cp != dp->dir_start)
- {
- size_t n = dp->dir_start - cp;
- size_t augmented_length = xsum (length, n);
-
- ENSURE_ALLOCATION (augmented_length);
- /* This copies a piece of FCHAR_T[] into a DCHAR_T[]. Here we
- need that the format string contains only ASCII characters
- if FCHAR_T and DCHAR_T are not the same type. */
- if (sizeof (FCHAR_T) == sizeof (DCHAR_T))
- {
- DCHAR_CPY (result + length, (const DCHAR_T *) cp, n);
- length = augmented_length;
- }
- else
- {
- do
- result[length++] = *cp++;
- while (--n > 0);
- }
- }
- if (i == d.count)
- break;
-
- /* Execute a single directive. */
- if (dp->conversion == '%')
- {
- size_t augmented_length;
-
- if (!(dp->arg_index == ARG_NONE))
- abort ();
- augmented_length = xsum (length, 1);
- ENSURE_ALLOCATION (augmented_length);
- result[length] = '%';
- length = augmented_length;
- }
- else
- {
- if (!(dp->arg_index != ARG_NONE))
- abort ();
-
- if (dp->conversion == 'n')
- {
- switch (a.arg[dp->arg_index].type)
- {
- case TYPE_COUNT_SCHAR_POINTER:
- *a.arg[dp->arg_index].a.a_count_schar_pointer = length;
- break;
- case TYPE_COUNT_SHORT_POINTER:
- *a.arg[dp->arg_index].a.a_count_short_pointer = length;
- break;
- case TYPE_COUNT_INT_POINTER:
- *a.arg[dp->arg_index].a.a_count_int_pointer = length;
- break;
- case TYPE_COUNT_LONGINT_POINTER:
- *a.arg[dp->arg_index].a.a_count_longint_pointer = length;
- break;
- case TYPE_COUNT_LONGLONGINT_POINTER:
- *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length;
- break;
- default:
- abort ();
- }
- }
-#if ENABLE_UNISTDIO
- /* The unistdio extensions. */
- else if (dp->conversion == 'U')
- {
- arg_type type = a.arg[dp->arg_index].type;
- int flags = dp->flags;
- int has_width;
- size_t width;
- int has_precision;
- size_t precision;
-
- has_width = 0;
- width = 0;
- if (dp->width_start != dp->width_end)
- {
- if (dp->width_arg_index != ARG_NONE)
- {
- int arg;
-
- if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
- abort ();
- arg = a.arg[dp->width_arg_index].a.a_int;
- width = arg;
- if (arg < 0)
- {
- /* "A negative field width is taken as a '-' flag
- followed by a positive field width." */
- flags |= FLAG_LEFT;
- width = -width;
- }
- }
- else
- {
- const FCHAR_T *digitp = dp->width_start;
-
- do
- width = xsum (xtimes (width, 10), *digitp++ - '0');
- while (digitp != dp->width_end);
- }
- has_width = 1;
- }
-
- has_precision = 0;
- precision = 0;
- if (dp->precision_start != dp->precision_end)
- {
- if (dp->precision_arg_index != ARG_NONE)
- {
- int arg;
-
- if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
- abort ();
- arg = a.arg[dp->precision_arg_index].a.a_int;
- /* "A negative precision is taken as if the precision
- were omitted." */
- if (arg >= 0)
- {
- precision = arg;
- has_precision = 1;
- }
- }
- else
- {
- const FCHAR_T *digitp = dp->precision_start + 1;
-
- precision = 0;
- while (digitp != dp->precision_end)
- precision = xsum (xtimes (precision, 10), *digitp++ - '0');
- has_precision = 1;
- }
- }
-
- switch (type)
- {
- case TYPE_U8_STRING:
- {
- const uint8_t *arg = a.arg[dp->arg_index].a.a_u8_string;
- const uint8_t *arg_end;
- size_t characters;
-
- if (has_precision)
- {
- /* Use only PRECISION characters, from the left. */
- arg_end = arg;
- characters = 0;
- for (; precision > 0; precision--)
- {
- int count = u8_strmblen (arg_end);
- if (count == 0)
- break;
- if (count < 0)
- goto fail_with_EILSEQ;
- arg_end += count;
- characters++;
- }
- }
- else if (has_width)
- {
- /* Use the entire string, and count the number of
- characters. */
- arg_end = arg;
- characters = 0;
- for (;;)
- {
- int count = u8_strmblen (arg_end);
- if (count == 0)
- break;
- if (count < 0)
- goto fail_with_EILSEQ;
- arg_end += count;
- characters++;
- }
- }
- else
- {
- /* Use the entire string. */
- arg_end = arg + u8_strlen (arg);
- /* The number of characters doesn't matter. */
- characters = 0;
- }
-
- if (characters < width && !(flags & FLAG_LEFT))
- {
- size_t n = width - characters;
- ENSURE_ALLOCATION (xsum (length, n));
- DCHAR_SET (result + length, ' ', n);
- length += n;
- }
-
-# if DCHAR_IS_UINT8_T
- {
- size_t n = arg_end - arg;
- ENSURE_ALLOCATION (xsum (length, n));
- DCHAR_CPY (result + length, arg, n);
- length += n;
- }
-# else
- { /* Convert. */
- DCHAR_T *converted = result + length;
- size_t converted_len = allocated - length;
-# if DCHAR_IS_TCHAR
- /* Convert from UTF-8 to locale encoding. */
- converted =
- u8_conv_to_encoding (locale_charset (),
- iconveh_question_mark,
- arg, arg_end - arg, NULL,
- converted, &converted_len);
-# else
- /* Convert from UTF-8 to UTF-16/UTF-32. */
- converted =
- U8_TO_DCHAR (arg, arg_end - arg,
- converted, &converted_len);
-# endif
- if (converted == NULL)
- goto fail_with_errno;
- if (converted != result + length)
- {
- ENSURE_ALLOCATION_ELSE (xsum (length, converted_len),
- { free (converted); goto out_of_memory; });
- DCHAR_CPY (result + length, converted, converted_len);
- free (converted);
- }
- length += converted_len;
- }
-# endif
-
- if (characters < width && (flags & FLAG_LEFT))
- {
- size_t n = width - characters;
- ENSURE_ALLOCATION (xsum (length, n));
- DCHAR_SET (result + length, ' ', n);
- length += n;
- }
- }
- break;
-
- case TYPE_U16_STRING:
- {
- const uint16_t *arg = a.arg[dp->arg_index].a.a_u16_string;
- const uint16_t *arg_end;
- size_t characters;
-
- if (has_precision)
- {
- /* Use only PRECISION characters, from the left. */
- arg_end = arg;
- characters = 0;
- for (; precision > 0; precision--)
- {
- int count = u16_strmblen (arg_end);
- if (count == 0)
- break;
- if (count < 0)
- goto fail_with_EILSEQ;
- arg_end += count;
- characters++;
- }
- }
- else if (has_width)
- {
- /* Use the entire string, and count the number of
- characters. */
- arg_end = arg;
- characters = 0;
- for (;;)
- {
- int count = u16_strmblen (arg_end);
- if (count == 0)
- break;
- if (count < 0)
- goto fail_with_EILSEQ;
- arg_end += count;
- characters++;
- }
- }
- else
- {
- /* Use the entire string. */
- arg_end = arg + u16_strlen (arg);
- /* The number of characters doesn't matter. */
- characters = 0;
- }
-
- if (characters < width && !(flags & FLAG_LEFT))
- {
- size_t n = width - characters;
- ENSURE_ALLOCATION (xsum (length, n));
- DCHAR_SET (result + length, ' ', n);
- length += n;
- }
-
-# if DCHAR_IS_UINT16_T
- {
- size_t n = arg_end - arg;
- ENSURE_ALLOCATION (xsum (length, n));
- DCHAR_CPY (result + length, arg, n);
- length += n;
- }
-# else
- { /* Convert. */
- DCHAR_T *converted = result + length;
- size_t converted_len = allocated - length;
-# if DCHAR_IS_TCHAR
- /* Convert from UTF-16 to locale encoding. */
- converted =
- u16_conv_to_encoding (locale_charset (),
- iconveh_question_mark,
- arg, arg_end - arg, NULL,
- converted, &converted_len);
-# else
- /* Convert from UTF-16 to UTF-8/UTF-32. */
- converted =
- U16_TO_DCHAR (arg, arg_end - arg,
- converted, &converted_len);
-# endif
- if (converted == NULL)
- goto fail_with_errno;
- if (converted != result + length)
- {
- ENSURE_ALLOCATION_ELSE (xsum (length, converted_len),
- { free (converted); goto out_of_memory; });
- DCHAR_CPY (result + length, converted, converted_len);
- free (converted);
- }
- length += converted_len;
- }
-# endif
-
- if (characters < width && (flags & FLAG_LEFT))
- {
- size_t n = width - characters;
- ENSURE_ALLOCATION (xsum (length, n));
- DCHAR_SET (result + length, ' ', n);
- length += n;
- }
- }
- break;
-
- case TYPE_U32_STRING:
- {
- const uint32_t *arg = a.arg[dp->arg_index].a.a_u32_string;
- const uint32_t *arg_end;
- size_t characters;
-
- if (has_precision)
- {
- /* Use only PRECISION characters, from the left. */
- arg_end = arg;
- characters = 0;
- for (; precision > 0; precision--)
- {
- int count = u32_strmblen (arg_end);
- if (count == 0)
- break;
- if (count < 0)
- goto fail_with_EILSEQ;
- arg_end += count;
- characters++;
- }
- }
- else if (has_width)
- {
- /* Use the entire string, and count the number of
- characters. */
- arg_end = arg;
- characters = 0;
- for (;;)
- {
- int count = u32_strmblen (arg_end);
- if (count == 0)
- break;
- if (count < 0)
- goto fail_with_EILSEQ;
- arg_end += count;
- characters++;
- }
- }
- else
- {
- /* Use the entire string. */
- arg_end = arg + u32_strlen (arg);
- /* The number of characters doesn't matter. */
- characters = 0;
- }
-
- if (characters < width && !(flags & FLAG_LEFT))
- {
- size_t n = width - characters;
- ENSURE_ALLOCATION (xsum (length, n));
- DCHAR_SET (result + length, ' ', n);
- length += n;
- }
-
-# if DCHAR_IS_UINT32_T
- {
- size_t n = arg_end - arg;
- ENSURE_ALLOCATION (xsum (length, n));
- DCHAR_CPY (result + length, arg, n);
- length += n;
- }
-# else
- { /* Convert. */
- DCHAR_T *converted = result + length;
- size_t converted_len = allocated - length;
-# if DCHAR_IS_TCHAR
- /* Convert from UTF-32 to locale encoding. */
- converted =
- u32_conv_to_encoding (locale_charset (),
- iconveh_question_mark,
- arg, arg_end - arg, NULL,
- converted, &converted_len);
-# else
- /* Convert from UTF-32 to UTF-8/UTF-16. */
- converted =
- U32_TO_DCHAR (arg, arg_end - arg,
- converted, &converted_len);
-# endif
- if (converted == NULL)
- goto fail_with_errno;
- if (converted != result + length)
- {
- ENSURE_ALLOCATION_ELSE (xsum (length, converted_len),
- { free (converted); goto out_of_memory; });
- DCHAR_CPY (result + length, converted, converted_len);
- free (converted);
- }
- length += converted_len;
- }
-# endif
-
- if (characters < width && (flags & FLAG_LEFT))
- {
- size_t n = width - characters;
- ENSURE_ALLOCATION (xsum (length, n));
- DCHAR_SET (result + length, ' ', n);
- length += n;
- }
- }
- break;
-
- default:
- abort ();
- }
- }
-#endif
-#if (!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || (NEED_PRINTF_DIRECTIVE_LS && !defined IN_LIBINTL) || ENABLE_WCHAR_FALLBACK) && HAVE_WCHAR_T
- else if (dp->conversion == 's'
-# if WIDE_CHAR_VERSION
- && a.arg[dp->arg_index].type != TYPE_WIDE_STRING
-# else
- && a.arg[dp->arg_index].type == TYPE_WIDE_STRING
-# endif
- )
- {
- /* The normal handling of the 's' directive below requires
- allocating a temporary buffer. The determination of its
- length (tmp_length), in the case when a precision is
- specified, below requires a conversion between a char[]
- string and a wchar_t[] wide string. It could be done, but
- we have no guarantee that the implementation of sprintf will
- use the exactly same algorithm. Without this guarantee, it
- is possible to have buffer overrun bugs. In order to avoid
- such bugs, we implement the entire processing of the 's'
- directive ourselves. */
- int flags = dp->flags;
- int has_width;
- size_t width;
- int has_precision;
- size_t precision;
-
- has_width = 0;
- width = 0;
- if (dp->width_start != dp->width_end)
- {
- if (dp->width_arg_index != ARG_NONE)
- {
- int arg;
-
- if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
- abort ();
- arg = a.arg[dp->width_arg_index].a.a_int;
- width = arg;
- if (arg < 0)
- {
- /* "A negative field width is taken as a '-' flag
- followed by a positive field width." */
- flags |= FLAG_LEFT;
- width = -width;
- }
- }
- else
- {
- const FCHAR_T *digitp = dp->width_start;
-
- do
- width = xsum (xtimes (width, 10), *digitp++ - '0');
- while (digitp != dp->width_end);
- }
- has_width = 1;
- }
-
- has_precision = 0;
- precision = 6;
- if (dp->precision_start != dp->precision_end)
- {
- if (dp->precision_arg_index != ARG_NONE)
- {
- int arg;
-
- if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
- abort ();
- arg = a.arg[dp->precision_arg_index].a.a_int;
- /* "A negative precision is taken as if the precision
- were omitted." */
- if (arg >= 0)
- {
- precision = arg;
- has_precision = 1;
- }
- }
- else
- {
- const FCHAR_T *digitp = dp->precision_start + 1;
-
- precision = 0;
- while (digitp != dp->precision_end)
- precision = xsum (xtimes (precision, 10), *digitp++ - '0');
- has_precision = 1;
- }
- }
-
-# if WIDE_CHAR_VERSION
- /* %s in vasnwprintf. See the specification of fwprintf. */
- {
- const char *arg = a.arg[dp->arg_index].a.a_string;
- const char *arg_end;
- size_t characters;
-
- if (has_precision)
- {
- /* Use only as many bytes as needed to produce PRECISION
- wide characters, from the left. */
-# if HAVE_MBRTOWC
- mbstate_t state;
- memset (&state, '\0', sizeof (mbstate_t));
-# endif
- arg_end = arg;
- characters = 0;
- for (; precision > 0; precision--)
- {
- int count;
-# if HAVE_MBRTOWC
- count = mbrlen (arg_end, MB_CUR_MAX, &state);
-# else
- count = mblen (arg_end, MB_CUR_MAX);
-# endif
- if (count == 0)
- /* Found the terminating NUL. */
- break;
- if (count < 0)
- /* Invalid or incomplete multibyte character. */
- goto fail_with_EILSEQ;
- arg_end += count;
- characters++;
- }
- }
- else if (has_width)
- {
- /* Use the entire string, and count the number of wide
- characters. */
-# if HAVE_MBRTOWC
- mbstate_t state;
- memset (&state, '\0', sizeof (mbstate_t));
-# endif
- arg_end = arg;
- characters = 0;
- for (;;)
- {
- int count;
-# if HAVE_MBRTOWC
- count = mbrlen (arg_end, MB_CUR_MAX, &state);
-# else
- count = mblen (arg_end, MB_CUR_MAX);
-# endif
- if (count == 0)
- /* Found the terminating NUL. */
- break;
- if (count < 0)
- /* Invalid or incomplete multibyte character. */
- goto fail_with_EILSEQ;
- arg_end += count;
- characters++;
- }
- }
- else
- {
- /* Use the entire string. */
- arg_end = arg + strlen (arg);
- /* The number of characters doesn't matter. */
- characters = 0;
- }
-
- if (characters < width && !(flags & FLAG_LEFT))
- {
- size_t n = width - characters;
- ENSURE_ALLOCATION (xsum (length, n));
- DCHAR_SET (result + length, ' ', n);
- length += n;
- }
-
- if (has_precision || has_width)
- {
- /* We know the number of wide characters in advance. */
- size_t remaining;
-# if HAVE_MBRTOWC
- mbstate_t state;
- memset (&state, '\0', sizeof (mbstate_t));
-# endif
- ENSURE_ALLOCATION (xsum (length, characters));
- for (remaining = characters; remaining > 0; remaining--)
- {
- wchar_t wc;
- int count;
-# if HAVE_MBRTOWC
- count = mbrtowc (&wc, arg, arg_end - arg, &state);
-# else
- count = mbtowc (&wc, arg, arg_end - arg);
-# endif
- if (count <= 0)
- /* mbrtowc not consistent with mbrlen, or mbtowc
- not consistent with mblen. */
- abort ();
- result[length++] = wc;
- arg += count;
- }
- if (!(arg == arg_end))
- abort ();
- }
- else
- {
-# if HAVE_MBRTOWC
- mbstate_t state;
- memset (&state, '\0', sizeof (mbstate_t));
-# endif
- while (arg < arg_end)
- {
- wchar_t wc;
- int count;
-# if HAVE_MBRTOWC
- count = mbrtowc (&wc, arg, arg_end - arg, &state);
-# else
- count = mbtowc (&wc, arg, arg_end - arg);
-# endif
- if (count <= 0)
- /* mbrtowc not consistent with mbrlen, or mbtowc
- not consistent with mblen. */
- abort ();
- ENSURE_ALLOCATION (xsum (length, 1));
- result[length++] = wc;
- arg += count;
- }
- }
-
- if (characters < width && (flags & FLAG_LEFT))
- {
- size_t n = width - characters;
- ENSURE_ALLOCATION (xsum (length, n));
- DCHAR_SET (result + length, ' ', n);
- length += n;
- }
- }
-# else
- /* %ls in vasnprintf. See the specification of fprintf. */
- {
- const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string;
- const wchar_t *arg_end;
- size_t characters;
-# if !DCHAR_IS_TCHAR
- /* This code assumes that TCHAR_T is 'char'. */
- static_assert (sizeof (TCHAR_T) == 1);
- TCHAR_T *tmpsrc;
- DCHAR_T *tmpdst;
- size_t tmpdst_len;
-# endif
- size_t w;
-
- if (has_precision)
- {
- /* Use only as many wide characters as needed to produce
- at most PRECISION bytes, from the left. */
-# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
- mbstate_t state;
- memset (&state, '\0', sizeof (mbstate_t));
-# endif
- arg_end = arg;
- characters = 0;
- while (precision > 0)
- {
- char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
- int count;
-
- if (*arg_end == 0)
- /* Found the terminating null wide character. */
- break;
- count = local_wcrtomb (cbuf, *arg_end, &state);
- if (count < 0)
- /* Cannot convert. */
- goto fail_with_EILSEQ;
- if (precision < (unsigned int) count)
- break;
- arg_end++;
- characters += count;
- precision -= count;
- }
- }
-# if DCHAR_IS_TCHAR
- else if (has_width)
-# else
- else
-# endif
- {
- /* Use the entire string, and count the number of
- bytes. */
-# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
- mbstate_t state;
- memset (&state, '\0', sizeof (mbstate_t));
-# endif
- arg_end = arg;
- characters = 0;
- for (;;)
- {
- char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
- int count;
-
- if (*arg_end == 0)
- /* Found the terminating null wide character. */
- break;
- count = local_wcrtomb (cbuf, *arg_end, &state);
- if (count < 0)
- /* Cannot convert. */
- goto fail_with_EILSEQ;
- arg_end++;
- characters += count;
- }
- }
-# if DCHAR_IS_TCHAR
- else
- {
- /* Use the entire string. */
- arg_end = arg + local_wcslen (arg);
- /* The number of bytes doesn't matter. */
- characters = 0;
- }
-# endif
-
-# if !DCHAR_IS_TCHAR
- /* Convert the string into a piece of temporary memory. */
- tmpsrc = (TCHAR_T *) malloc (characters * sizeof (TCHAR_T));
- if (tmpsrc == NULL)
- goto out_of_memory;
- {
- TCHAR_T *tmpptr = tmpsrc;
- size_t remaining;
-# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
- mbstate_t state;
- memset (&state, '\0', sizeof (mbstate_t));
-# endif
- for (remaining = characters; remaining > 0; )
- {
- char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
- int count;
-
- if (*arg == 0)
- abort ();
- count = local_wcrtomb (cbuf, *arg, &state);
- if (count <= 0)
- /* Inconsistency. */
- abort ();
- memcpy (tmpptr, cbuf, count);
- tmpptr += count;
- arg++;
- remaining -= count;
- }
- if (!(arg == arg_end))
- abort ();
- }
-
- /* Convert from TCHAR_T[] to DCHAR_T[]. */
- tmpdst =
- DCHAR_CONV_FROM_ENCODING (locale_charset (),
- iconveh_question_mark,
- tmpsrc, characters,
- NULL,
- NULL, &tmpdst_len);
- if (tmpdst == NULL)
- {
- free (tmpsrc);
- goto fail_with_errno;
- }
- free (tmpsrc);
-# endif
-
- if (has_width)
- {
-# if ENABLE_UNISTDIO
- /* Outside POSIX, it's preferable to compare the width
- against the number of _characters_ of the converted
- value. */
- w = DCHAR_MBSNLEN (result + length, characters);
-# else
- /* The width is compared against the number of _bytes_
- of the converted value, says POSIX. */
- w = characters;
-# endif
- }
- else
- /* w doesn't matter. */
- w = 0;
-
- if (w < width && !(flags & FLAG_LEFT))
- {
- size_t n = width - w;
- ENSURE_ALLOCATION (xsum (length, n));
- DCHAR_SET (result + length, ' ', n);
- length += n;
- }
-
-# if DCHAR_IS_TCHAR
- if (has_precision || has_width)
- {
- /* We know the number of bytes in advance. */
- size_t remaining;
-# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
- mbstate_t state;
- memset (&state, '\0', sizeof (mbstate_t));
-# endif
- ENSURE_ALLOCATION (xsum (length, characters));
- for (remaining = characters; remaining > 0; )
- {
- char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
- int count;
-
- if (*arg == 0)
- abort ();
- count = local_wcrtomb (cbuf, *arg, &state);
- if (count <= 0)
- /* Inconsistency. */
- abort ();
- memcpy (result + length, cbuf, count);
- length += count;
- arg++;
- remaining -= count;
- }
- if (!(arg == arg_end))
- abort ();
- }
- else
- {
-# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
- mbstate_t state;
- memset (&state, '\0', sizeof (mbstate_t));
-# endif
- while (arg < arg_end)
- {
- char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
- int count;
-
- if (*arg == 0)
- abort ();
- count = local_wcrtomb (cbuf, *arg, &state);
- if (count <= 0)
- /* Cannot convert. */
- goto fail_with_EILSEQ;
- ENSURE_ALLOCATION (xsum (length, count));
- memcpy (result + length, cbuf, count);
- length += count;
- arg++;
- }
- }
-# else
- ENSURE_ALLOCATION_ELSE (xsum (length, tmpdst_len),
- { free (tmpdst); goto out_of_memory; });
- DCHAR_CPY (result + length, tmpdst, tmpdst_len);
- free (tmpdst);
- length += tmpdst_len;
-# endif
-
- if (w < width && (flags & FLAG_LEFT))
- {
- size_t n = width - w;
- ENSURE_ALLOCATION (xsum (length, n));
- DCHAR_SET (result + length, ' ', n);
- length += n;
- }
- }
-# endif
- }
-#endif
-#if ENABLE_WCHAR_FALLBACK && HAVE_WINT_T && !WIDE_CHAR_VERSION
- else if (dp->conversion == 'c'
- && a.arg[dp->arg_index].type == TYPE_WIDE_CHAR)
- {
- /* Implement the 'lc' directive ourselves, in order to provide
- the fallback that avoids EILSEQ. */
- int flags = dp->flags;
- int has_width;
- size_t width;
-
- has_width = 0;
- width = 0;
- if (dp->width_start != dp->width_end)
- {
- if (dp->width_arg_index != ARG_NONE)
- {
- int arg;
-
- if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
- abort ();
- arg = a.arg[dp->width_arg_index].a.a_int;
- width = arg;
- if (arg < 0)
- {
- /* "A negative field width is taken as a '-' flag
- followed by a positive field width." */
- flags |= FLAG_LEFT;
- width = -width;
- }
- }
- else
- {
- const FCHAR_T *digitp = dp->width_start;
-
- do
- width = xsum (xtimes (width, 10), *digitp++ - '0');
- while (digitp != dp->width_end);
- }
- has_width = 1;
- }
-
- /* %lc in vasnprintf. See the specification of fprintf. */
- {
- wchar_t arg = (wchar_t) a.arg[dp->arg_index].a.a_wide_char;
- size_t characters;
-# if !DCHAR_IS_TCHAR
- /* This code assumes that TCHAR_T is 'char'. */
- static_assert (sizeof (TCHAR_T) == 1);
- TCHAR_T tmpsrc[64]; /* Assume MB_CUR_MAX <= 64. */
- DCHAR_T *tmpdst;
- size_t tmpdst_len;
-# endif
- size_t w;
-
-# if DCHAR_IS_TCHAR
- if (has_width)
-# endif
- {
- /* Count the number of bytes. */
- characters = 0;
- if (arg != 0)
- {
- char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
- int count;
-# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
- mbstate_t state;
- memset (&state, '\0', sizeof (mbstate_t));
-# endif
-
- count = local_wcrtomb (cbuf, arg, &state);
- if (count < 0)
- /* Inconsistency. */
- abort ();
- characters = count;
- }
- }
-# if DCHAR_IS_TCHAR
- else
- {
- /* The number of bytes doesn't matter. */
- characters = 0;
- }
-# endif
-
-# if !DCHAR_IS_TCHAR
- /* Convert the string into a piece of temporary memory. */
- if (characters > 0) /* implies arg != 0 */
- {
- char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
- int count;
-# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
- mbstate_t state;
- memset (&state, '\0', sizeof (mbstate_t));
-# endif
-
- count = local_wcrtomb (cbuf, arg, &state);
- if (count <= 0)
- /* Inconsistency. */
- abort ();
- memcpy (tmpsrc, cbuf, count);
- }
-
- /* Convert from TCHAR_T[] to DCHAR_T[]. */
- tmpdst =
- DCHAR_CONV_FROM_ENCODING (locale_charset (),
- iconveh_question_mark,
- tmpsrc, characters,
- NULL,
- NULL, &tmpdst_len);
- if (tmpdst == NULL)
- goto fail_with_errno;
-# endif
-
- if (has_width)
- {
-# if ENABLE_UNISTDIO
- /* Outside POSIX, it's preferable to compare the width
- against the number of _characters_ of the converted
- value. */
- w = DCHAR_MBSNLEN (result + length, characters);
-# else
- /* The width is compared against the number of _bytes_
- of the converted value, says POSIX. */
- w = characters;
-# endif
- }
- else
- /* w doesn't matter. */
- w = 0;
-
- if (w < width && !(flags & FLAG_LEFT))
- {
- size_t n = width - w;
- ENSURE_ALLOCATION (xsum (length, n));
- DCHAR_SET (result + length, ' ', n);
- length += n;
- }
-
-# if DCHAR_IS_TCHAR
- if (has_width)
- {
- /* We know the number of bytes in advance. */
- ENSURE_ALLOCATION (xsum (length, characters));
- if (characters > 0) /* implies arg != 0 */
- {
- int count;
-# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
- mbstate_t state;
- memset (&state, '\0', sizeof (mbstate_t));
-# endif
-
- count = local_wcrtomb (result + length, arg, &state);
- if (count <= 0)
- /* Inconsistency. */
- abort ();
- length += count;
- }
- }
- else
- {
- if (arg != 0)
- {
- char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
- int count;
-# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
- mbstate_t state;
- memset (&state, '\0', sizeof (mbstate_t));
-# endif
-
- count = local_wcrtomb (cbuf, arg, &state);
- if (count <= 0)
- /* Inconsistency. */
- abort ();
- ENSURE_ALLOCATION (xsum (length, count));
- memcpy (result + length, cbuf, count);
- length += count;
- }
- }
-# else
- ENSURE_ALLOCATION_ELSE (xsum (length, tmpdst_len),
- { free (tmpdst); goto out_of_memory; });
- DCHAR_CPY (result + length, tmpdst, tmpdst_len);
- free (tmpdst);
- length += tmpdst_len;
-# endif
-
- if (w < width && (flags & FLAG_LEFT))
- {
- size_t n = width - w;
- ENSURE_ALLOCATION (xsum (length, n));
- DCHAR_SET (result + length, ' ', n);
- length += n;
- }
- }
- }
-#endif
-#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL
- else if ((dp->conversion == 'a' || dp->conversion == 'A')
-# if !(NEED_PRINTF_DIRECTIVE_A || (NEED_PRINTF_LONG_DOUBLE && NEED_PRINTF_DOUBLE))
- && (0
-# if NEED_PRINTF_DOUBLE
- || a.arg[dp->arg_index].type == TYPE_DOUBLE
-# endif
-# if NEED_PRINTF_LONG_DOUBLE
- || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
-# endif
- )
-# endif
- )
- {
- arg_type type = a.arg[dp->arg_index].type;
- int flags = dp->flags;
- size_t width;
- int has_precision;
- size_t precision;
- size_t tmp_length;
- size_t count;
- DCHAR_T tmpbuf[700];
- DCHAR_T *tmp;
- DCHAR_T *pad_ptr;
- DCHAR_T *p;
-
- width = 0;
- if (dp->width_start != dp->width_end)
- {
- if (dp->width_arg_index != ARG_NONE)
- {
- int arg;
-
- if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
- abort ();
- arg = a.arg[dp->width_arg_index].a.a_int;
- width = arg;
- if (arg < 0)
- {
- /* "A negative field width is taken as a '-' flag
- followed by a positive field width." */
- flags |= FLAG_LEFT;
- width = -width;
- }
- }
- else
- {
- const FCHAR_T *digitp = dp->width_start;
-
- do
- width = xsum (xtimes (width, 10), *digitp++ - '0');
- while (digitp != dp->width_end);
- }
- }
-
- has_precision = 0;
- precision = 0;
- if (dp->precision_start != dp->precision_end)
- {
- if (dp->precision_arg_index != ARG_NONE)
- {
- int arg;
-
- if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
- abort ();
- arg = a.arg[dp->precision_arg_index].a.a_int;
- /* "A negative precision is taken as if the precision
- were omitted." */
- if (arg >= 0)
- {
- precision = arg;
- has_precision = 1;
- }
- }
- else
- {
- const FCHAR_T *digitp = dp->precision_start + 1;
-
- precision = 0;
- while (digitp != dp->precision_end)
- precision = xsum (xtimes (precision, 10), *digitp++ - '0');
- has_precision = 1;
- }
- }
-
- /* Allocate a temporary buffer of sufficient size. */
- if (type == TYPE_LONGDOUBLE)
- tmp_length =
- (unsigned int) ((LDBL_DIG + 1)
- * 0.831 /* decimal -> hexadecimal */
- )
- + 1; /* turn floor into ceil */
- else
- tmp_length =
- (unsigned int) ((DBL_DIG + 1)
- * 0.831 /* decimal -> hexadecimal */
- )
- + 1; /* turn floor into ceil */
- if (tmp_length < precision)
- tmp_length = precision;
- /* Account for sign, decimal point etc. */
- tmp_length = xsum (tmp_length, 12);
-
- if (tmp_length < width)
- tmp_length = width;
-
- tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
-
- if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T))
- tmp = tmpbuf;
- else
- {
- size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T));
-
- if (size_overflow_p (tmp_memsize))
- /* Overflow, would lead to out of memory. */
- goto out_of_memory;
- tmp = (DCHAR_T *) malloc (tmp_memsize);
- if (tmp == NULL)
- /* Out of memory. */
- goto out_of_memory;
- }
-
- pad_ptr = NULL;
- p = tmp;
- if (type == TYPE_LONGDOUBLE)
- {
-# if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE
- long double arg = a.arg[dp->arg_index].a.a_longdouble;
-
- if (isnanl (arg))
- {
- if (dp->conversion == 'A')
- {
- *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
- }
- else
- {
- *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
- }
- }
- else
- {
- int sign = 0;
- DECL_LONG_DOUBLE_ROUNDING
-
- BEGIN_LONG_DOUBLE_ROUNDING ();
-
- if (signbit (arg)) /* arg < 0.0L or negative zero */
- {
- sign = -1;
- arg = -arg;
- }
-
- if (sign < 0)
- *p++ = '-';
- else if (flags & FLAG_SHOWSIGN)
- *p++ = '+';
- else if (flags & FLAG_SPACE)
- *p++ = ' ';
-
- if (arg > 0.0L && arg + arg == arg)
- {
- if (dp->conversion == 'A')
- {
- *p++ = 'I'; *p++ = 'N'; *p++ = 'F';
- }
- else
- {
- *p++ = 'i'; *p++ = 'n'; *p++ = 'f';
- }
- }
- else
- {
- int exponent;
- long double mantissa;
-
- if (arg > 0.0L)
- mantissa = printf_frexpl (arg, &exponent);
- else
- {
- exponent = 0;
- mantissa = 0.0L;
- }
-
- if (has_precision
- && precision < (unsigned int) ((LDBL_DIG + 1) * 0.831) + 1)
- {
- /* Round the mantissa. */
- long double tail = mantissa;
- size_t q;
-
- for (q = precision; ; q--)
- {
- int digit = (int) tail;
- tail -= digit;
- if (q == 0)
- {
- if (digit & 1 ? tail >= 0.5L : tail > 0.5L)
- tail = 1 - tail;
- else
- tail = - tail;
- break;
- }
- tail *= 16.0L;
- }
- if (tail != 0.0L)
- for (q = precision; q > 0; q--)
- tail *= 0.0625L;
- mantissa += tail;
- }
-
- *p++ = '0';
- *p++ = dp->conversion - 'A' + 'X';
- pad_ptr = p;
- {
- int digit;
-
- digit = (int) mantissa;
- mantissa -= digit;
- *p++ = '0' + digit;
- if ((flags & FLAG_ALT)
- || mantissa > 0.0L || precision > 0)
- {
- *p++ = decimal_point_char ();
- /* This loop terminates because we assume
- that FLT_RADIX is a power of 2. */
- while (mantissa > 0.0L)
- {
- mantissa *= 16.0L;
- digit = (int) mantissa;
- mantissa -= digit;
- *p++ = digit
- + (digit < 10
- ? '0'
- : dp->conversion - 10);
- if (precision > 0)
- precision--;
- }
- while (precision > 0)
- {
- *p++ = '0';
- precision--;
- }
- }
- }
- *p++ = dp->conversion - 'A' + 'P';
-# if WIDE_CHAR_VERSION
- {
- static const wchar_t decimal_format[] =
- { '%', '+', 'd', '\0' };
- SNPRINTF (p, 6 + 1, decimal_format, exponent);
- }
- while (*p != '\0')
- p++;
-# else
- if (sizeof (DCHAR_T) == 1)
- {
- sprintf ((char *) p, "%+d", exponent);
- while (*p != '\0')
- p++;
- }
- else
- {
- char expbuf[6 + 1];
- const char *ep;
- sprintf (expbuf, "%+d", exponent);
- for (ep = expbuf; (*p = *ep) != '\0'; ep++)
- p++;
- }
-# endif
- }
-
- END_LONG_DOUBLE_ROUNDING ();
- }
-# else
- abort ();
-# endif
- }
- else
- {
-# if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE
- double arg = a.arg[dp->arg_index].a.a_double;
-
- if (isnand (arg))
- {
- if (dp->conversion == 'A')
- {
- *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
- }
- else
- {
- *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
- }
- }
- else
- {
- int sign = 0;
-
- if (signbit (arg)) /* arg < 0.0 or negative zero */
- {
- sign = -1;
- arg = -arg;
- }
-
- if (sign < 0)
- *p++ = '-';
- else if (flags & FLAG_SHOWSIGN)
- *p++ = '+';
- else if (flags & FLAG_SPACE)
- *p++ = ' ';
-
- if (arg > 0.0 && arg + arg == arg)
- {
- if (dp->conversion == 'A')
- {
- *p++ = 'I'; *p++ = 'N'; *p++ = 'F';
- }
- else
- {
- *p++ = 'i'; *p++ = 'n'; *p++ = 'f';
- }
- }
- else
- {
- int exponent;
- double mantissa;
-
- if (arg > 0.0)
- mantissa = printf_frexp (arg, &exponent);
- else
- {
- exponent = 0;
- mantissa = 0.0;
- }
-
- if (has_precision
- && precision < (unsigned int) ((DBL_DIG + 1) * 0.831) + 1)
- {
- /* Round the mantissa. */
- double tail = mantissa;
- size_t q;
-
- for (q = precision; ; q--)
- {
- int digit = (int) tail;
- tail -= digit;
- if (q == 0)
- {
- if (digit & 1 ? tail >= 0.5 : tail > 0.5)
- tail = 1 - tail;
- else
- tail = - tail;
- break;
- }
- tail *= 16.0;
- }
- if (tail != 0.0)
- for (q = precision; q > 0; q--)
- tail *= 0.0625;
- mantissa += tail;
- }
-
- *p++ = '0';
- *p++ = dp->conversion - 'A' + 'X';
- pad_ptr = p;
- {
- int digit;
-
- digit = (int) mantissa;
- mantissa -= digit;
- *p++ = '0' + digit;
- if ((flags & FLAG_ALT)
- || mantissa > 0.0 || precision > 0)
- {
- *p++ = decimal_point_char ();
- /* This loop terminates because we assume
- that FLT_RADIX is a power of 2. */
- while (mantissa > 0.0)
- {
- mantissa *= 16.0;
- digit = (int) mantissa;
- mantissa -= digit;
- *p++ = digit
- + (digit < 10
- ? '0'
- : dp->conversion - 10);
- if (precision > 0)
- precision--;
- }
- while (precision > 0)
- {
- *p++ = '0';
- precision--;
- }
- }
- }
- *p++ = dp->conversion - 'A' + 'P';
-# if WIDE_CHAR_VERSION
- {
- static const wchar_t decimal_format[] =
- { '%', '+', 'd', '\0' };
- SNPRINTF (p, 6 + 1, decimal_format, exponent);
- }
- while (*p != '\0')
- p++;
-# else
- if (sizeof (DCHAR_T) == 1)
- {
- sprintf ((char *) p, "%+d", exponent);
- while (*p != '\0')
- p++;
- }
- else
- {
- char expbuf[6 + 1];
- const char *ep;
- sprintf (expbuf, "%+d", exponent);
- for (ep = expbuf; (*p = *ep) != '\0'; ep++)
- p++;
- }
-# endif
- }
- }
-# else
- abort ();
-# endif
- }
-
- /* The generated string now extends from tmp to p, with the
- zero padding insertion point being at pad_ptr. */
- count = p - tmp;
-
- if (count < width)
- {
- size_t pad = width - count;
- DCHAR_T *end = p + pad;
-
- if (flags & FLAG_LEFT)
- {
- /* Pad with spaces on the right. */
- for (; pad > 0; pad--)
- *p++ = ' ';
- }
- else if ((flags & FLAG_ZERO) && pad_ptr != NULL)
- {
- /* Pad with zeroes. */
- DCHAR_T *q = end;
-
- while (p > pad_ptr)
- *--q = *--p;
- for (; pad > 0; pad--)
- *p++ = '0';
- }
- else
- {
- /* Pad with spaces on the left. */
- DCHAR_T *q = end;
-
- while (p > tmp)
- *--q = *--p;
- for (; pad > 0; pad--)
- *p++ = ' ';
- }
-
- p = end;
- }
-
- count = p - tmp;
-
- if (count >= tmp_length)
- /* tmp_length was incorrectly calculated - fix the
- code above! */
- abort ();
-
- /* Make room for the result. */
- if (count >= allocated - length)
- {
- size_t n = xsum (length, count);
-
- ENSURE_ALLOCATION (n);
- }
-
- /* Append the result. */
- memcpy (result + length, tmp, count * sizeof (DCHAR_T));
- if (tmp != tmpbuf)
- free (tmp);
- length += count;
- }
-#endif
-#if (NEED_PRINTF_INFINITE_DOUBLE || NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL
- else if ((dp->conversion == 'f' || dp->conversion == 'F'
- || dp->conversion == 'e' || dp->conversion == 'E'
- || dp->conversion == 'g' || dp->conversion == 'G'
- || dp->conversion == 'a' || dp->conversion == 'A')
- && (0
-# if NEED_PRINTF_DOUBLE
- || a.arg[dp->arg_index].type == TYPE_DOUBLE
-# elif NEED_PRINTF_INFINITE_DOUBLE
- || (a.arg[dp->arg_index].type == TYPE_DOUBLE
- /* The systems (mingw) which produce wrong output
- for Inf, -Inf, and NaN also do so for -0.0.
- Therefore we treat this case here as well. */
- && is_infinite_or_zero (a.arg[dp->arg_index].a.a_double))
-# endif
-# if NEED_PRINTF_LONG_DOUBLE
- || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
-# elif NEED_PRINTF_INFINITE_LONG_DOUBLE
- || (a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
- /* Some systems produce wrong output for Inf,
- -Inf, and NaN. Some systems in this category
- (IRIX 5.3) also do so for -0.0. Therefore we
- treat this case here as well. */
- && is_infinite_or_zerol (a.arg[dp->arg_index].a.a_longdouble))
-# endif
- ))
- {
-# if (NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE)
- arg_type type = a.arg[dp->arg_index].type;
-# endif
- int flags = dp->flags;
- size_t width;
- size_t count;
- int has_precision;
- size_t precision;
- size_t tmp_length;
- DCHAR_T tmpbuf[700];
- DCHAR_T *tmp;
- DCHAR_T *pad_ptr;
- DCHAR_T *p;
-
- width = 0;
- if (dp->width_start != dp->width_end)
- {
- if (dp->width_arg_index != ARG_NONE)
- {
- int arg;
-
- if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
- abort ();
- arg = a.arg[dp->width_arg_index].a.a_int;
- width = arg;
- if (arg < 0)
- {
- /* "A negative field width is taken as a '-' flag
- followed by a positive field width." */
- flags |= FLAG_LEFT;
- width = -width;
- }
- }
- else
- {
- const FCHAR_T *digitp = dp->width_start;
-
- do
- width = xsum (xtimes (width, 10), *digitp++ - '0');
- while (digitp != dp->width_end);
- }
- }
-
- has_precision = 0;
- precision = 0;
- if (dp->precision_start != dp->precision_end)
- {
- if (dp->precision_arg_index != ARG_NONE)
- {
- int arg;
-
- if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
- abort ();
- arg = a.arg[dp->precision_arg_index].a.a_int;
- /* "A negative precision is taken as if the precision
- were omitted." */
- if (arg >= 0)
- {
- precision = arg;
- has_precision = 1;
- }
- }
- else
- {
- const FCHAR_T *digitp = dp->precision_start + 1;
-
- precision = 0;
- while (digitp != dp->precision_end)
- precision = xsum (xtimes (precision, 10), *digitp++ - '0');
- has_precision = 1;
- }
- }
-
- /* POSIX specifies the default precision to be 6 for %f, %F,
- %e, %E, but not for %g, %G. Implementations appear to use
- the same default precision also for %g, %G. But for %a, %A,
- the default precision is 0. */
- if (!has_precision)
- if (!(dp->conversion == 'a' || dp->conversion == 'A'))
- precision = 6;
-
- /* Allocate a temporary buffer of sufficient size. */
-# if NEED_PRINTF_DOUBLE && NEED_PRINTF_LONG_DOUBLE
- tmp_length = (type == TYPE_LONGDOUBLE ? LDBL_DIG + 1 : DBL_DIG + 1);
-# elif NEED_PRINTF_INFINITE_DOUBLE && NEED_PRINTF_LONG_DOUBLE
- tmp_length = (type == TYPE_LONGDOUBLE ? LDBL_DIG + 1 : 0);
-# elif NEED_PRINTF_LONG_DOUBLE
- tmp_length = LDBL_DIG + 1;
-# elif NEED_PRINTF_DOUBLE
- tmp_length = DBL_DIG + 1;
-# else
- tmp_length = 0;
-# endif
- if (tmp_length < precision)
- tmp_length = precision;
-# if NEED_PRINTF_LONG_DOUBLE
-# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
- if (type == TYPE_LONGDOUBLE)
-# endif
- if (dp->conversion == 'f' || dp->conversion == 'F')
- {
- long double arg = a.arg[dp->arg_index].a.a_longdouble;
- if (!(isnanl (arg) || arg + arg == arg))
- {
- /* arg is finite and nonzero. */
- int exponent = floorlog10l (arg < 0 ? -arg : arg);
- if (exponent >= 0 && tmp_length < exponent + precision)
- tmp_length = exponent + precision;
- }
- }
-# endif
-# if NEED_PRINTF_DOUBLE
-# if NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE
- if (type == TYPE_DOUBLE)
-# endif
- if (dp->conversion == 'f' || dp->conversion == 'F')
- {
- double arg = a.arg[dp->arg_index].a.a_double;
- if (!(isnand (arg) || arg + arg == arg))
- {
- /* arg is finite and nonzero. */
- int exponent = floorlog10 (arg < 0 ? -arg : arg);
- if (exponent >= 0 && tmp_length < exponent + precision)
- tmp_length = exponent + precision;
- }
- }
-# endif
- /* Account for sign, decimal point etc. */
- tmp_length = xsum (tmp_length, 12);
-
- if (tmp_length < width)
- tmp_length = width;
-
- tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
-
- if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T))
- tmp = tmpbuf;
- else
- {
- size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T));
-
- if (size_overflow_p (tmp_memsize))
- /* Overflow, would lead to out of memory. */
- goto out_of_memory;
- tmp = (DCHAR_T *) malloc (tmp_memsize);
- if (tmp == NULL)
- /* Out of memory. */
- goto out_of_memory;
- }
-
- pad_ptr = NULL;
- p = tmp;
-
-# if NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE
-# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
- if (type == TYPE_LONGDOUBLE)
-# endif
- {
- long double arg = a.arg[dp->arg_index].a.a_longdouble;
-
- if (isnanl (arg))
- {
- if (dp->conversion >= 'A' && dp->conversion <= 'Z')
- {
- *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
- }
- else
- {
- *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
- }
- }
- else
- {
- int sign = 0;
- DECL_LONG_DOUBLE_ROUNDING
-
- BEGIN_LONG_DOUBLE_ROUNDING ();
-
- if (signbit (arg)) /* arg < 0.0L or negative zero */
- {
- sign = -1;
- arg = -arg;
- }
-
- if (sign < 0)
- *p++ = '-';
- else if (flags & FLAG_SHOWSIGN)
- *p++ = '+';
- else if (flags & FLAG_SPACE)
- *p++ = ' ';
-
- if (arg > 0.0L && arg + arg == arg)
- {
- if (dp->conversion >= 'A' && dp->conversion <= 'Z')
- {
- *p++ = 'I'; *p++ = 'N'; *p++ = 'F';
- }
- else
- {
- *p++ = 'i'; *p++ = 'n'; *p++ = 'f';
- }
- }
- else
- {
-# if NEED_PRINTF_LONG_DOUBLE
- pad_ptr = p;
-
- if (dp->conversion == 'f' || dp->conversion == 'F')
- {
- char *digits;
- size_t ndigits;
-
- digits =
- scale10_round_decimal_long_double (arg, precision);
- if (digits == NULL)
- {
- END_LONG_DOUBLE_ROUNDING ();
- goto out_of_memory;
- }
- ndigits = strlen (digits);
-
- if (ndigits > precision)
- do
- {
- --ndigits;
- *p++ = digits[ndigits];
- }
- while (ndigits > precision);
- else
- *p++ = '0';
- /* Here ndigits <= precision. */
- if ((flags & FLAG_ALT) || precision > 0)
- {
- *p++ = decimal_point_char ();
- for (; precision > ndigits; precision--)
- *p++ = '0';
- while (ndigits > 0)
- {
- --ndigits;
- *p++ = digits[ndigits];
- }
- }
-
- free (digits);
- }
- else if (dp->conversion == 'e' || dp->conversion == 'E')
- {
- int exponent;
-
- if (arg == 0.0L)
- {
- exponent = 0;
- *p++ = '0';
- if ((flags & FLAG_ALT) || precision > 0)
- {
- *p++ = decimal_point_char ();
- for (; precision > 0; precision--)
- *p++ = '0';
- }
- }
- else
- {
- /* arg > 0.0L. */
- int adjusted;
- char *digits;
- size_t ndigits;
-
- exponent = floorlog10l (arg);
- adjusted = 0;
- for (;;)
- {
- digits =
- scale10_round_decimal_long_double (arg,
- (int)precision - exponent);
- if (digits == NULL)
- {
- END_LONG_DOUBLE_ROUNDING ();
- goto out_of_memory;
- }
- ndigits = strlen (digits);
-
- if (ndigits == precision + 1)
- break;
- if (ndigits < precision
- || ndigits > precision + 2)
- /* The exponent was not guessed
- precisely enough. */
- abort ();
- if (adjusted)
- /* None of two values of exponent is
- the right one. Prevent an endless
- loop. */
- abort ();
- free (digits);
- if (ndigits == precision)
- exponent -= 1;
- else
- exponent += 1;
- adjusted = 1;
- }
- /* Here ndigits = precision+1. */
- if (is_borderline (digits, precision))
- {
- /* Maybe the exponent guess was too high
- and a smaller exponent can be reached
- by turning a 10...0 into 9...9x. */
- char *digits2 =
- scale10_round_decimal_long_double (arg,
- (int)precision - exponent + 1);
- if (digits2 == NULL)
- {
- free (digits);
- END_LONG_DOUBLE_ROUNDING ();
- goto out_of_memory;
- }
- if (strlen (digits2) == precision + 1)
- {
- free (digits);
- digits = digits2;
- exponent -= 1;
- }
- else
- free (digits2);
- }
- /* Here ndigits = precision+1. */
-
- *p++ = digits[--ndigits];
- if ((flags & FLAG_ALT) || precision > 0)
- {
- *p++ = decimal_point_char ();
- while (ndigits > 0)
- {
- --ndigits;
- *p++ = digits[ndigits];
- }
- }
-
- free (digits);
- }
-
- *p++ = dp->conversion; /* 'e' or 'E' */
-# if WIDE_CHAR_VERSION
- {
- static const wchar_t decimal_format[] =
- { '%', '+', '.', '2', 'd', '\0' };
- SNPRINTF (p, 6 + 1, decimal_format, exponent);
- }
- while (*p != '\0')
- p++;
-# else
- if (sizeof (DCHAR_T) == 1)
- {
- sprintf ((char *) p, "%+.2d", exponent);
- while (*p != '\0')
- p++;
- }
- else
- {
- char expbuf[6 + 1];
- const char *ep;
- sprintf (expbuf, "%+.2d", exponent);
- for (ep = expbuf; (*p = *ep) != '\0'; ep++)
- p++;
- }
-# endif
- }
- else if (dp->conversion == 'g' || dp->conversion == 'G')
- {
- if (precision == 0)
- precision = 1;
- /* precision >= 1. */
-
- if (arg == 0.0L)
- /* The exponent is 0, >= -4, < precision.
- Use fixed-point notation. */
- {
- size_t ndigits = precision;
- /* Number of trailing zeroes that have to be
- dropped. */
- size_t nzeroes =
- (flags & FLAG_ALT ? 0 : precision - 1);
-
- --ndigits;
- *p++ = '0';
- if ((flags & FLAG_ALT) || ndigits > nzeroes)
- {
- *p++ = decimal_point_char ();
- while (ndigits > nzeroes)
- {
- --ndigits;
- *p++ = '0';
- }
- }
- }
- else
- {
- /* arg > 0.0L. */
- int exponent;
- int adjusted;
- char *digits;
- size_t ndigits;
- size_t nzeroes;
-
- exponent = floorlog10l (arg);
- adjusted = 0;
- for (;;)
- {
- digits =
- scale10_round_decimal_long_double (arg,
- (int)(precision - 1) - exponent);
- if (digits == NULL)
- {
- END_LONG_DOUBLE_ROUNDING ();
- goto out_of_memory;
- }
- ndigits = strlen (digits);
-
- if (ndigits == precision)
- break;
- if (ndigits < precision - 1
- || ndigits > precision + 1)
- /* The exponent was not guessed
- precisely enough. */
- abort ();
- if (adjusted)
- /* None of two values of exponent is
- the right one. Prevent an endless
- loop. */
- abort ();
- free (digits);
- if (ndigits < precision)
- exponent -= 1;
- else
- exponent += 1;
- adjusted = 1;
- }
- /* Here ndigits = precision. */
- if (is_borderline (digits, precision - 1))
- {
- /* Maybe the exponent guess was too high
- and a smaller exponent can be reached
- by turning a 10...0 into 9...9x. */
- char *digits2 =
- scale10_round_decimal_long_double (arg,
- (int)(precision - 1) - exponent + 1);
- if (digits2 == NULL)
- {
- free (digits);
- END_LONG_DOUBLE_ROUNDING ();
- goto out_of_memory;
- }
- if (strlen (digits2) == precision)
- {
- free (digits);
- digits = digits2;
- exponent -= 1;
- }
- else
- free (digits2);
- }
- /* Here ndigits = precision. */
-
- /* Determine the number of trailing zeroes
- that have to be dropped. */
- nzeroes = 0;
- if ((flags & FLAG_ALT) == 0)
- while (nzeroes < ndigits
- && digits[nzeroes] == '0')
- nzeroes++;
-
- /* The exponent is now determined. */
- if (exponent >= -4
- && exponent < (long)precision)
- {
- /* Fixed-point notation:
- max(exponent,0)+1 digits, then the
- decimal point, then the remaining
- digits without trailing zeroes. */
- if (exponent >= 0)
- {
- size_t ecount = exponent + 1;
- /* Note: count <= precision = ndigits. */
- for (; ecount > 0; ecount--)
- *p++ = digits[--ndigits];
- if ((flags & FLAG_ALT) || ndigits > nzeroes)
- {
- *p++ = decimal_point_char ();
- while (ndigits > nzeroes)
- {
- --ndigits;
- *p++ = digits[ndigits];
- }
- }
- }
- else
- {
- size_t ecount = -exponent - 1;
- *p++ = '0';
- *p++ = decimal_point_char ();
- for (; ecount > 0; ecount--)
- *p++ = '0';
- while (ndigits > nzeroes)
- {
- --ndigits;
- *p++ = digits[ndigits];
- }
- }
- }
- else
- {
- /* Exponential notation. */
- *p++ = digits[--ndigits];
- if ((flags & FLAG_ALT) || ndigits > nzeroes)
- {
- *p++ = decimal_point_char ();
- while (ndigits > nzeroes)
- {
- --ndigits;
- *p++ = digits[ndigits];
- }
- }
- *p++ = dp->conversion - 'G' + 'E'; /* 'e' or 'E' */
-# if WIDE_CHAR_VERSION
- {
- static const wchar_t decimal_format[] =
- { '%', '+', '.', '2', 'd', '\0' };
- SNPRINTF (p, 6 + 1, decimal_format, exponent);
- }
- while (*p != '\0')
- p++;
-# else
- if (sizeof (DCHAR_T) == 1)
- {
- sprintf ((char *) p, "%+.2d", exponent);
- while (*p != '\0')
- p++;
- }
- else
- {
- char expbuf[6 + 1];
- const char *ep;
- sprintf (expbuf, "%+.2d", exponent);
- for (ep = expbuf; (*p = *ep) != '\0'; ep++)
- p++;
- }
-# endif
- }
-
- free (digits);
- }
- }
- else
- abort ();
-# else
- /* arg is finite. */
- if (!(arg == 0.0L))
- abort ();
-
- pad_ptr = p;
-
- if (dp->conversion == 'f' || dp->conversion == 'F')
- {
- *p++ = '0';
- if ((flags & FLAG_ALT) || precision > 0)
- {
- *p++ = decimal_point_char ();
- for (; precision > 0; precision--)
- *p++ = '0';
- }
- }
- else if (dp->conversion == 'e' || dp->conversion == 'E')
- {
- *p++ = '0';
- if ((flags & FLAG_ALT) || precision > 0)
- {
- *p++ = decimal_point_char ();
- for (; precision > 0; precision--)
- *p++ = '0';
- }
- *p++ = dp->conversion; /* 'e' or 'E' */
- *p++ = '+';
- *p++ = '0';
- *p++ = '0';
- }
- else if (dp->conversion == 'g' || dp->conversion == 'G')
- {
- *p++ = '0';
- if (flags & FLAG_ALT)
- {
- size_t ndigits =
- (precision > 0 ? precision - 1 : 0);
- *p++ = decimal_point_char ();
- for (; ndigits > 0; --ndigits)
- *p++ = '0';
- }
- }
- else if (dp->conversion == 'a' || dp->conversion == 'A')
- {
- *p++ = '0';
- *p++ = dp->conversion - 'A' + 'X';
- pad_ptr = p;
- *p++ = '0';
- if ((flags & FLAG_ALT) || precision > 0)
- {
- *p++ = decimal_point_char ();
- for (; precision > 0; precision--)
- *p++ = '0';
- }
- *p++ = dp->conversion - 'A' + 'P';
- *p++ = '+';
- *p++ = '0';
- }
- else
- abort ();
-# endif
- }
-
- END_LONG_DOUBLE_ROUNDING ();
- }
- }
-# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
- else
-# endif
-# endif
-# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
- {
- double arg = a.arg[dp->arg_index].a.a_double;
-
- if (isnand (arg))
- {
- if (dp->conversion >= 'A' && dp->conversion <= 'Z')
- {
- *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
- }
- else
- {
- *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
- }
- }
- else
- {
- int sign = 0;
-
- if (signbit (arg)) /* arg < 0.0 or negative zero */
- {
- sign = -1;
- arg = -arg;
- }
-
- if (sign < 0)
- *p++ = '-';
- else if (flags & FLAG_SHOWSIGN)
- *p++ = '+';
- else if (flags & FLAG_SPACE)
- *p++ = ' ';
-
- if (arg > 0.0 && arg + arg == arg)
- {
- if (dp->conversion >= 'A' && dp->conversion <= 'Z')
- {
- *p++ = 'I'; *p++ = 'N'; *p++ = 'F';
- }
- else
- {
- *p++ = 'i'; *p++ = 'n'; *p++ = 'f';
- }
- }
- else
- {
-# if NEED_PRINTF_DOUBLE
- pad_ptr = p;
-
- if (dp->conversion == 'f' || dp->conversion == 'F')
- {
- char *digits;
- size_t ndigits;
-
- digits =
- scale10_round_decimal_double (arg, precision);
- if (digits == NULL)
- goto out_of_memory;
- ndigits = strlen (digits);
-
- if (ndigits > precision)
- do
- {
- --ndigits;
- *p++ = digits[ndigits];
- }
- while (ndigits > precision);
- else
- *p++ = '0';
- /* Here ndigits <= precision. */
- if ((flags & FLAG_ALT) || precision > 0)
- {
- *p++ = decimal_point_char ();
- for (; precision > ndigits; precision--)
- *p++ = '0';
- while (ndigits > 0)
- {
- --ndigits;
- *p++ = digits[ndigits];
- }
- }
-
- free (digits);
- }
- else if (dp->conversion == 'e' || dp->conversion == 'E')
- {
- int exponent;
-
- if (arg == 0.0)
- {
- exponent = 0;
- *p++ = '0';
- if ((flags & FLAG_ALT) || precision > 0)
- {
- *p++ = decimal_point_char ();
- for (; precision > 0; precision--)
- *p++ = '0';
- }
- }
- else
- {
- /* arg > 0.0. */
- int adjusted;
- char *digits;
- size_t ndigits;
-
- exponent = floorlog10 (arg);
- adjusted = 0;
- for (;;)
- {
- digits =
- scale10_round_decimal_double (arg,
- (int)precision - exponent);
- if (digits == NULL)
- goto out_of_memory;
- ndigits = strlen (digits);
-
- if (ndigits == precision + 1)
- break;
- if (ndigits < precision
- || ndigits > precision + 2)
- /* The exponent was not guessed
- precisely enough. */
- abort ();
- if (adjusted)
- /* None of two values of exponent is
- the right one. Prevent an endless
- loop. */
- abort ();
- free (digits);
- if (ndigits == precision)
- exponent -= 1;
- else
- exponent += 1;
- adjusted = 1;
- }
- /* Here ndigits = precision+1. */
- if (is_borderline (digits, precision))
- {
- /* Maybe the exponent guess was too high
- and a smaller exponent can be reached
- by turning a 10...0 into 9...9x. */
- char *digits2 =
- scale10_round_decimal_double (arg,
- (int)precision - exponent + 1);
- if (digits2 == NULL)
- {
- free (digits);
- goto out_of_memory;
- }
- if (strlen (digits2) == precision + 1)
- {
- free (digits);
- digits = digits2;
- exponent -= 1;
- }
- else
- free (digits2);
- }
- /* Here ndigits = precision+1. */
-
- *p++ = digits[--ndigits];
- if ((flags & FLAG_ALT) || precision > 0)
- {
- *p++ = decimal_point_char ();
- while (ndigits > 0)
- {
- --ndigits;
- *p++ = digits[ndigits];
- }
- }
-
- free (digits);
- }
-
- *p++ = dp->conversion; /* 'e' or 'E' */
-# if WIDE_CHAR_VERSION
- {
- static const wchar_t decimal_format[] =
- /* Produce the same number of exponent digits
- as the native printf implementation. */
-# if defined _WIN32 && ! defined __CYGWIN__
- { '%', '+', '.', '3', 'd', '\0' };
-# else
- { '%', '+', '.', '2', 'd', '\0' };
-# endif
- SNPRINTF (p, 6 + 1, decimal_format, exponent);
- }
- while (*p != '\0')
- p++;
-# else
- {
- static const char decimal_format[] =
- /* Produce the same number of exponent digits
- as the native printf implementation. */
-# if defined _WIN32 && ! defined __CYGWIN__
- "%+.3d";
-# else
- "%+.2d";
-# endif
- if (sizeof (DCHAR_T) == 1)
- {
- sprintf ((char *) p, decimal_format, exponent);
- while (*p != '\0')
- p++;
- }
- else
- {
- char expbuf[6 + 1];
- const char *ep;
- sprintf (expbuf, decimal_format, exponent);
- for (ep = expbuf; (*p = *ep) != '\0'; ep++)
- p++;
- }
- }
-# endif
- }
- else if (dp->conversion == 'g' || dp->conversion == 'G')
- {
- if (precision == 0)
- precision = 1;
- /* precision >= 1. */
-
- if (arg == 0.0)
- /* The exponent is 0, >= -4, < precision.
- Use fixed-point notation. */
- {
- size_t ndigits = precision;
- /* Number of trailing zeroes that have to be
- dropped. */
- size_t nzeroes =
- (flags & FLAG_ALT ? 0 : precision - 1);
-
- --ndigits;
- *p++ = '0';
- if ((flags & FLAG_ALT) || ndigits > nzeroes)
- {
- *p++ = decimal_point_char ();
- while (ndigits > nzeroes)
- {
- --ndigits;
- *p++ = '0';
- }
- }
- }
- else
- {
- /* arg > 0.0. */
- int exponent;
- int adjusted;
- char *digits;
- size_t ndigits;
- size_t nzeroes;
-
- exponent = floorlog10 (arg);
- adjusted = 0;
- for (;;)
- {
- digits =
- scale10_round_decimal_double (arg,
- (int)(precision - 1) - exponent);
- if (digits == NULL)
- goto out_of_memory;
- ndigits = strlen (digits);
-
- if (ndigits == precision)
- break;
- if (ndigits < precision - 1
- || ndigits > precision + 1)
- /* The exponent was not guessed
- precisely enough. */
- abort ();
- if (adjusted)
- /* None of two values of exponent is
- the right one. Prevent an endless
- loop. */
- abort ();
- free (digits);
- if (ndigits < precision)
- exponent -= 1;
- else
- exponent += 1;
- adjusted = 1;
- }
- /* Here ndigits = precision. */
- if (is_borderline (digits, precision - 1))
- {
- /* Maybe the exponent guess was too high
- and a smaller exponent can be reached
- by turning a 10...0 into 9...9x. */
- char *digits2 =
- scale10_round_decimal_double (arg,
- (int)(precision - 1) - exponent + 1);
- if (digits2 == NULL)
- {
- free (digits);
- goto out_of_memory;
- }
- if (strlen (digits2) == precision)
- {
- free (digits);
- digits = digits2;
- exponent -= 1;
- }
- else
- free (digits2);
- }
- /* Here ndigits = precision. */
-
- /* Determine the number of trailing zeroes
- that have to be dropped. */
- nzeroes = 0;
- if ((flags & FLAG_ALT) == 0)
- while (nzeroes < ndigits
- && digits[nzeroes] == '0')
- nzeroes++;
-
- /* The exponent is now determined. */
- if (exponent >= -4
- && exponent < (long)precision)
- {
- /* Fixed-point notation:
- max(exponent,0)+1 digits, then the
- decimal point, then the remaining
- digits without trailing zeroes. */
- if (exponent >= 0)
- {
- size_t ecount = exponent + 1;
- /* Note: ecount <= precision = ndigits. */
- for (; ecount > 0; ecount--)
- *p++ = digits[--ndigits];
- if ((flags & FLAG_ALT) || ndigits > nzeroes)
- {
- *p++ = decimal_point_char ();
- while (ndigits > nzeroes)
- {
- --ndigits;
- *p++ = digits[ndigits];
- }
- }
- }
- else
- {
- size_t ecount = -exponent - 1;
- *p++ = '0';
- *p++ = decimal_point_char ();
- for (; ecount > 0; ecount--)
- *p++ = '0';
- while (ndigits > nzeroes)
- {
- --ndigits;
- *p++ = digits[ndigits];
- }
- }
- }
- else
- {
- /* Exponential notation. */
- *p++ = digits[--ndigits];
- if ((flags & FLAG_ALT) || ndigits > nzeroes)
- {
- *p++ = decimal_point_char ();
- while (ndigits > nzeroes)
- {
- --ndigits;
- *p++ = digits[ndigits];
- }
- }
- *p++ = dp->conversion - 'G' + 'E'; /* 'e' or 'E' */
-# if WIDE_CHAR_VERSION
- {
- static const wchar_t decimal_format[] =
- /* Produce the same number of exponent digits
- as the native printf implementation. */
-# if defined _WIN32 && ! defined __CYGWIN__
- { '%', '+', '.', '3', 'd', '\0' };
-# else
- { '%', '+', '.', '2', 'd', '\0' };
-# endif
- SNPRINTF (p, 6 + 1, decimal_format, exponent);
- }
- while (*p != '\0')
- p++;
-# else
- {
- static const char decimal_format[] =
- /* Produce the same number of exponent digits
- as the native printf implementation. */
-# if defined _WIN32 && ! defined __CYGWIN__
- "%+.3d";
-# else
- "%+.2d";
-# endif
- if (sizeof (DCHAR_T) == 1)
- {
- sprintf ((char *) p, decimal_format, exponent);
- while (*p != '\0')
- p++;
- }
- else
- {
- char expbuf[6 + 1];
- const char *ep;
- sprintf (expbuf, decimal_format, exponent);
- for (ep = expbuf; (*p = *ep) != '\0'; ep++)
- p++;
- }
- }
-# endif
- }
-
- free (digits);
- }
- }
- else
- abort ();
-# else
- /* arg is finite. */
- if (!(arg == 0.0))
- abort ();
-
- pad_ptr = p;
-
- if (dp->conversion == 'f' || dp->conversion == 'F')
- {
- *p++ = '0';
- if ((flags & FLAG_ALT) || precision > 0)
- {
- *p++ = decimal_point_char ();
- for (; precision > 0; precision--)
- *p++ = '0';
- }
- }
- else if (dp->conversion == 'e' || dp->conversion == 'E')
- {
- *p++ = '0';
- if ((flags & FLAG_ALT) || precision > 0)
- {
- *p++ = decimal_point_char ();
- for (; precision > 0; precision--)
- *p++ = '0';
- }
- *p++ = dp->conversion; /* 'e' or 'E' */
- *p++ = '+';
- /* Produce the same number of exponent digits as
- the native printf implementation. */
-# if defined _WIN32 && ! defined __CYGWIN__
- *p++ = '0';
-# endif
- *p++ = '0';
- *p++ = '0';
- }
- else if (dp->conversion == 'g' || dp->conversion == 'G')
- {
- *p++ = '0';
- if (flags & FLAG_ALT)
- {
- size_t ndigits =
- (precision > 0 ? precision - 1 : 0);
- *p++ = decimal_point_char ();
- for (; ndigits > 0; --ndigits)
- *p++ = '0';
- }
- }
- else
- abort ();
-# endif
- }
- }
- }
-# endif
-
- /* The generated string now extends from tmp to p, with the
- zero padding insertion point being at pad_ptr. */
- count = p - tmp;
-
- if (count < width)
- {
- size_t pad = width - count;
- DCHAR_T *end = p + pad;
-
- if (flags & FLAG_LEFT)
- {
- /* Pad with spaces on the right. */
- for (; pad > 0; pad--)
- *p++ = ' ';
- }
- else if ((flags & FLAG_ZERO) && pad_ptr != NULL)
- {
- /* Pad with zeroes. */
- DCHAR_T *q = end;
-
- while (p > pad_ptr)
- *--q = *--p;
- for (; pad > 0; pad--)
- *p++ = '0';
- }
- else
- {
- /* Pad with spaces on the left. */
- DCHAR_T *q = end;
-
- while (p > tmp)
- *--q = *--p;
- for (; pad > 0; pad--)
- *p++ = ' ';
- }
-
- p = end;
- }
-
- count = p - tmp;
-
- if (count >= tmp_length)
- /* tmp_length was incorrectly calculated - fix the
- code above! */
- abort ();
-
- /* Make room for the result. */
- if (count >= allocated - length)
- {
- size_t n = xsum (length, count);
-
- ENSURE_ALLOCATION (n);
- }
-
- /* Append the result. */
- memcpy (result + length, tmp, count * sizeof (DCHAR_T));
- if (tmp != tmpbuf)
- free (tmp);
- length += count;
- }
-#endif
- else
- {
- arg_type type = a.arg[dp->arg_index].type;
- int flags = dp->flags;
-#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
- int has_width;
-#endif
-#if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
- size_t width;
-#endif
-#if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || NEED_PRINTF_UNBOUNDED_PRECISION
- int has_precision;
- size_t precision;
-#endif
-#if NEED_PRINTF_UNBOUNDED_PRECISION
- int prec_ourselves;
-#else
-# define prec_ourselves 0
-#endif
-#if NEED_PRINTF_FLAG_LEFTADJUST
-# define pad_ourselves 1
-#elif !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
- int pad_ourselves;
-#else
-# define pad_ourselves 0
-#endif
- TCHAR_T *fbp;
- unsigned int prefix_count;
- int prefixes[2] IF_LINT (= { 0 });
- int orig_errno;
-#if !USE_SNPRINTF
- size_t tmp_length;
- TCHAR_T tmpbuf[700];
- TCHAR_T *tmp;
-#endif
-
-#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
- has_width = 0;
-#endif
-#if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
- width = 0;
- if (dp->width_start != dp->width_end)
- {
- if (dp->width_arg_index != ARG_NONE)
- {
- int arg;
-
- if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
- abort ();
- arg = a.arg[dp->width_arg_index].a.a_int;
- width = arg;
- if (arg < 0)
- {
- /* "A negative field width is taken as a '-' flag
- followed by a positive field width." */
- flags |= FLAG_LEFT;
- width = -width;
- }
- }
- else
- {
- const FCHAR_T *digitp = dp->width_start;
-
- do
- width = xsum (xtimes (width, 10), *digitp++ - '0');
- while (digitp != dp->width_end);
- }
-#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
- has_width = 1;
-#endif
- }
-#endif
-
-#if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || NEED_PRINTF_UNBOUNDED_PRECISION
- has_precision = 0;
- precision = 6;
- if (dp->precision_start != dp->precision_end)
- {
- if (dp->precision_arg_index != ARG_NONE)
- {
- int arg;
-
- if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
- abort ();
- arg = a.arg[dp->precision_arg_index].a.a_int;
- /* "A negative precision is taken as if the precision
- were omitted." */
- if (arg >= 0)
- {
- precision = arg;
- has_precision = 1;
- }
- }
- else
- {
- const FCHAR_T *digitp = dp->precision_start + 1;
-
- precision = 0;
- while (digitp != dp->precision_end)
- precision = xsum (xtimes (precision, 10), *digitp++ - '0');
- has_precision = 1;
- }
- }
-#endif
-
- /* Decide whether to handle the precision ourselves. */
-#if NEED_PRINTF_UNBOUNDED_PRECISION
- switch (dp->conversion)
- {
- case 'd': case 'i': case 'u':
- case 'o':
- case 'x': case 'X': case 'p':
- prec_ourselves = has_precision && (precision > 0);
- break;
- default:
- prec_ourselves = 0;
- break;
- }
-#endif
-
- /* Decide whether to perform the padding ourselves. */
-#if !NEED_PRINTF_FLAG_LEFTADJUST && (!DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION)
- switch (dp->conversion)
- {
-# if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO
- /* If we need conversion from TCHAR_T[] to DCHAR_T[], we need
- to perform the padding after this conversion. Functions
- with unistdio extensions perform the padding based on
- character count rather than element count. */
- case 'c': case 's':
-# endif
-# if NEED_PRINTF_FLAG_ZERO
- case 'f': case 'F': case 'e': case 'E': case 'g': case 'G':
- case 'a': case 'A':
-# endif
- pad_ourselves = 1;
- break;
- default:
- pad_ourselves = prec_ourselves;
- break;
- }
-#endif
-
-#if !USE_SNPRINTF
- /* Allocate a temporary buffer of sufficient size for calling
- sprintf. */
- tmp_length =
- MAX_ROOM_NEEDED (&a, dp->arg_index, dp->conversion, type,
- flags, width, has_precision, precision,
- pad_ourselves);
-
- if (tmp_length <= sizeof (tmpbuf) / sizeof (TCHAR_T))
- tmp = tmpbuf;
- else
- {
- size_t tmp_memsize = xtimes (tmp_length, sizeof (TCHAR_T));
-
- if (size_overflow_p (tmp_memsize))
- /* Overflow, would lead to out of memory. */
- goto out_of_memory;
- tmp = (TCHAR_T *) malloc (tmp_memsize);
- if (tmp == NULL)
- /* Out of memory. */
- goto out_of_memory;
- }
-#endif
-
- /* Construct the format string for calling snprintf or
- sprintf. */
- fbp = buf;
- *fbp++ = '%';
-#if NEED_PRINTF_FLAG_GROUPING
- /* The underlying implementation doesn't support the ' flag.
- Produce no grouping characters in this case; this is
- acceptable because the grouping is locale dependent. */
-#else
- if (flags & FLAG_GROUP)
- *fbp++ = '\'';
-#endif
- if (flags & FLAG_LEFT)
- *fbp++ = '-';
- if (flags & FLAG_SHOWSIGN)
- *fbp++ = '+';
- if (flags & FLAG_SPACE)
- *fbp++ = ' ';
- if (flags & FLAG_ALT)
- *fbp++ = '#';
-#if __GLIBC__ >= 2 && !defined __UCLIBC__
- if (flags & FLAG_LOCALIZED)
- *fbp++ = 'I';
-#endif
- if (!pad_ourselves)
- {
- if (flags & FLAG_ZERO)
- *fbp++ = '0';
- if (dp->width_start != dp->width_end)
- {
- size_t n = dp->width_end - dp->width_start;
- /* The width specification is known to consist only
- of standard ASCII characters. */
- if (sizeof (FCHAR_T) == sizeof (TCHAR_T))
- {
- memcpy (fbp, dp->width_start, n * sizeof (TCHAR_T));
- fbp += n;
- }
- else
- {
- const FCHAR_T *mp = dp->width_start;
- do
- *fbp++ = *mp++;
- while (--n > 0);
- }
- }
- }
- if (!prec_ourselves)
- {
- if (dp->precision_start != dp->precision_end)
- {
- size_t n = dp->precision_end - dp->precision_start;
- /* The precision specification is known to consist only
- of standard ASCII characters. */
- if (sizeof (FCHAR_T) == sizeof (TCHAR_T))
- {
- memcpy (fbp, dp->precision_start, n * sizeof (TCHAR_T));
- fbp += n;
- }
- else
- {
- const FCHAR_T *mp = dp->precision_start;
- do
- *fbp++ = *mp++;
- while (--n > 0);
- }
- }
- }
-
- switch (type)
- {
- case TYPE_LONGLONGINT:
- case TYPE_ULONGLONGINT:
-#if defined _WIN32 && ! defined __CYGWIN__
- *fbp++ = 'I';
- *fbp++ = '6';
- *fbp++ = '4';
- break;
-#else
- *fbp++ = 'l';
-#endif
- FALLTHROUGH;
- case TYPE_LONGINT:
- case TYPE_ULONGINT:
-#if HAVE_WINT_T
- case TYPE_WIDE_CHAR:
-#endif
-#if HAVE_WCHAR_T
- case TYPE_WIDE_STRING:
-#endif
- *fbp++ = 'l';
- break;
- case TYPE_LONGDOUBLE:
- *fbp++ = 'L';
- break;
- default:
- break;
- }
-#if NEED_PRINTF_DIRECTIVE_F
- if (dp->conversion == 'F')
- *fbp = 'f';
- else
-#endif
- *fbp = dp->conversion;
-#if USE_SNPRINTF
-# if ((HAVE_SNPRINTF_RETVAL_C99 && HAVE_SNPRINTF_TRUNCATION_C99) \
- || ((__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3)) \
- && !defined __UCLIBC__) \
- || (defined __APPLE__ && defined __MACH__) \
- || defined __ANDROID__ \
- || (defined _WIN32 && ! defined __CYGWIN__))
- /* On systems where we know that snprintf's return value
- conforms to ISO C 99 (HAVE_SNPRINTF_RETVAL_C99) and that
- snprintf always produces NUL-terminated strings
- (HAVE_SNPRINTF_TRUNCATION_C99), it is possible to avoid
- using %n. And it is desirable to do so, because more and
- more platforms no longer support %n, for "security reasons".
- In particular, the following platforms:
- - On glibc2 systems from 2004-10-18 or newer, the use of
- %n in format strings in writable memory may crash the
- program (if compiled with _FORTIFY_SOURCE=2).
- - On Mac OS X 10.13 or newer, the use of %n in format
- strings in writable memory by default crashes the
- program.
- - On Android, starting on 2018-03-07, the use of %n in
- format strings produces a fatal error (see
- <https://android.googlesource.com/platform/bionic/+/41398d03b7e8e0dfb951660ae713e682e9fc0336>).
- On these platforms, HAVE_SNPRINTF_RETVAL_C99 and
- HAVE_SNPRINTF_TRUNCATION_C99 are 1. We have listed them
- explicitly in the condition above, in case of cross-
- compilation (just to be sure). */
- /* On native Windows systems (such as mingw), we can avoid using
- %n because:
- - Although the gl_SNPRINTF_TRUNCATION_C99 test fails,
- snprintf does not write more than the specified number
- of bytes. (snprintf (buf, 3, "%d %d", 4567, 89) writes
- '4', '5', '6' into buf, not '4', '5', '\0'.)
- - Although the gl_SNPRINTF_RETVAL_C99 test fails, snprintf
- allows us to recognize the case of an insufficient
- buffer size: it returns -1 in this case.
- On native Windows systems (such as mingw) where the OS is
- Windows Vista, the use of %n in format strings by default
- crashes the program. See
- <https://gcc.gnu.org/ml/gcc/2007-06/msg00122.html> and
- <https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/set-printf-count-output>
- So we should avoid %n in this situation. */
- fbp[1] = '\0';
-# else /* AIX <= 5.1, HP-UX, IRIX, OSF/1, Solaris <= 9, BeOS */
- fbp[1] = '%';
- fbp[2] = 'n';
- fbp[3] = '\0';
-# endif
-#else
- fbp[1] = '\0';
-#endif
-
- /* Construct the arguments for calling snprintf or sprintf. */
- prefix_count = 0;
- if (!pad_ourselves && dp->width_arg_index != ARG_NONE)
- {
- if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
- abort ();
- prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int;
- }
- if (!prec_ourselves && dp->precision_arg_index != ARG_NONE)
- {
- if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
- abort ();
- prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int;
- }
-
-#if USE_SNPRINTF
- /* The SNPRINTF result is appended after result[0..length].
- The latter is an array of DCHAR_T; SNPRINTF appends an
- array of TCHAR_T to it. This is possible because
- sizeof (TCHAR_T) divides sizeof (DCHAR_T) and
- alignof (TCHAR_T) <= alignof (DCHAR_T). */
-# define TCHARS_PER_DCHAR (sizeof (DCHAR_T) / sizeof (TCHAR_T))
- /* Ensure that maxlen below will be >= 2. Needed on BeOS,
- where an snprintf() with maxlen==1 acts like sprintf(). */
- ENSURE_ALLOCATION (xsum (length,
- (2 + TCHARS_PER_DCHAR - 1)
- / TCHARS_PER_DCHAR));
- /* Prepare checking whether snprintf returns the count
- via %n. */
- *(TCHAR_T *) (result + length) = '\0';
-#endif
-
- orig_errno = errno;
-
- for (;;)
- {
- int count = -1;
-
-#if USE_SNPRINTF
- int retcount = 0;
- size_t maxlen = allocated - length;
- /* SNPRINTF can fail if its second argument is
- > INT_MAX. */
- if (maxlen > INT_MAX / TCHARS_PER_DCHAR)
- maxlen = INT_MAX / TCHARS_PER_DCHAR;
- maxlen = maxlen * TCHARS_PER_DCHAR;
-# define SNPRINTF_BUF(arg) \
- switch (prefix_count) \
- { \
- case 0: \
- retcount = SNPRINTF ((TCHAR_T *) (result + length), \
- maxlen, buf, \
- arg, &count); \
- break; \
- case 1: \
- retcount = SNPRINTF ((TCHAR_T *) (result + length), \
- maxlen, buf, \
- prefixes[0], arg, &count); \
- break; \
- case 2: \
- retcount = SNPRINTF ((TCHAR_T *) (result + length), \
- maxlen, buf, \
- prefixes[0], prefixes[1], arg, \
- &count); \
- break; \
- default: \
- abort (); \
- }
-#else
-# define SNPRINTF_BUF(arg) \
- switch (prefix_count) \
- { \
- case 0: \
- count = sprintf (tmp, buf, arg); \
- break; \
- case 1: \
- count = sprintf (tmp, buf, prefixes[0], arg); \
- break; \
- case 2: \
- count = sprintf (tmp, buf, prefixes[0], prefixes[1],\
- arg); \
- break; \
- default: \
- abort (); \
- }
-#endif
-
- errno = 0;
- switch (type)
- {
- case TYPE_SCHAR:
- {
- int arg = a.arg[dp->arg_index].a.a_schar;
- SNPRINTF_BUF (arg);
- }
- break;
- case TYPE_UCHAR:
- {
- unsigned int arg = a.arg[dp->arg_index].a.a_uchar;
- SNPRINTF_BUF (arg);
- }
- break;
- case TYPE_SHORT:
- {
- int arg = a.arg[dp->arg_index].a.a_short;
- SNPRINTF_BUF (arg);
- }
- break;
- case TYPE_USHORT:
- {
- unsigned int arg = a.arg[dp->arg_index].a.a_ushort;
- SNPRINTF_BUF (arg);
- }
- break;
- case TYPE_INT:
- {
- int arg = a.arg[dp->arg_index].a.a_int;
- SNPRINTF_BUF (arg);
- }
- break;
- case TYPE_UINT:
- {
- unsigned int arg = a.arg[dp->arg_index].a.a_uint;
- SNPRINTF_BUF (arg);
- }
- break;
- case TYPE_LONGINT:
- {
- long int arg = a.arg[dp->arg_index].a.a_longint;
- SNPRINTF_BUF (arg);
- }
- break;
- case TYPE_ULONGINT:
- {
- unsigned long int arg = a.arg[dp->arg_index].a.a_ulongint;
- SNPRINTF_BUF (arg);
- }
- break;
- case TYPE_LONGLONGINT:
- {
- long long int arg = a.arg[dp->arg_index].a.a_longlongint;
- SNPRINTF_BUF (arg);
- }
- break;
- case TYPE_ULONGLONGINT:
- {
- unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint;
- SNPRINTF_BUF (arg);
- }
- break;
- case TYPE_DOUBLE:
- {
- double arg = a.arg[dp->arg_index].a.a_double;
- SNPRINTF_BUF (arg);
- }
- break;
- case TYPE_LONGDOUBLE:
- {
- long double arg = a.arg[dp->arg_index].a.a_longdouble;
- SNPRINTF_BUF (arg);
- }
- break;
- case TYPE_CHAR:
- {
- int arg = a.arg[dp->arg_index].a.a_char;
- SNPRINTF_BUF (arg);
- }
- break;
-#if HAVE_WINT_T
- case TYPE_WIDE_CHAR:
- {
- wint_t arg = a.arg[dp->arg_index].a.a_wide_char;
- SNPRINTF_BUF (arg);
- }
- break;
-#endif
- case TYPE_STRING:
- {
- const char *arg = a.arg[dp->arg_index].a.a_string;
- SNPRINTF_BUF (arg);
- }
- break;
-#if HAVE_WCHAR_T
- case TYPE_WIDE_STRING:
- {
- const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string;
- SNPRINTF_BUF (arg);
- }
- break;
-#endif
- case TYPE_POINTER:
- {
- void *arg = a.arg[dp->arg_index].a.a_pointer;
- SNPRINTF_BUF (arg);
- }
- break;
- default:
- abort ();
- }
-
-#if USE_SNPRINTF
- /* Portability: Not all implementations of snprintf()
- are ISO C 99 compliant. Determine the number of
- bytes that snprintf() has produced or would have
- produced. */
- if (count >= 0)
- {
- /* Verify that snprintf() has NUL-terminated its
- result. */
- if ((unsigned int) count < maxlen
- && ((TCHAR_T *) (result + length)) [count] != '\0')
- abort ();
- /* Portability hack. */
- if (retcount > count)
- count = retcount;
- }
- else
- {
- /* snprintf() doesn't understand the '%n'
- directive. */
- if (fbp[1] != '\0')
- {
- /* Don't use the '%n' directive; instead, look
- at the snprintf() return value. */
- fbp[1] = '\0';
- continue;
- }
- else
- {
- /* Look at the snprintf() return value. */
- if (retcount < 0)
- {
-# if !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF
- /* HP-UX 10.20 snprintf() is doubly deficient:
- It doesn't understand the '%n' directive,
- *and* it returns -1 (rather than the length
- that would have been required) when the
- buffer is too small.
- But a failure at this point can also come
- from other reasons than a too small buffer,
- such as an invalid wide string argument to
- the %ls directive, or possibly an invalid
- floating-point argument. */
- size_t tmp_length =
- MAX_ROOM_NEEDED (&a, dp->arg_index,
- dp->conversion, type, flags,
- width,
- has_precision,
- precision, pad_ourselves);
-
- if (maxlen < tmp_length)
- {
- /* Make more room. But try to do through
- this reallocation only once. */
- size_t bigger_need =
- xsum (length,
- xsum (tmp_length,
- TCHARS_PER_DCHAR - 1)
- / TCHARS_PER_DCHAR);
- /* And always grow proportionally.
- (There may be several arguments, each
- needing a little more room than the
- previous one.) */
- size_t bigger_need2 =
- xsum (xtimes (allocated, 2), 12);
- if (bigger_need < bigger_need2)
- bigger_need = bigger_need2;
- ENSURE_ALLOCATION (bigger_need);
- continue;
- }
-# endif
- }
- else
- count = retcount;
- }
- }
-#endif
-
- /* Attempt to handle failure. */
- if (count < 0)
- {
- /* SNPRINTF or sprintf failed. Use the errno that it
- has set, if any. */
- if (errno == 0)
- {
- if (dp->conversion == 'c' || dp->conversion == 's')
- errno = EILSEQ;
- else
- errno = EINVAL;
- }
-
- goto fail_with_errno;
- }
-
-#if USE_SNPRINTF
- /* Handle overflow of the allocated buffer.
- If such an overflow occurs, a C99 compliant snprintf()
- returns a count >= maxlen. However, a non-compliant
- snprintf() function returns only count = maxlen - 1. To
- cover both cases, test whether count >= maxlen - 1. */
- if ((unsigned int) count + 1 >= maxlen)
- {
- /* If maxlen already has attained its allowed maximum,
- allocating more memory will not increase maxlen.
- Instead of looping, bail out. */
- if (maxlen == INT_MAX / TCHARS_PER_DCHAR)
- goto overflow;
- else
- {
- /* Need at least (count + 1) * sizeof (TCHAR_T)
- bytes. (The +1 is for the trailing NUL.)
- But ask for (count + 2) * sizeof (TCHAR_T)
- bytes, so that in the next round, we likely get
- maxlen > (unsigned int) count + 1
- and so we don't get here again.
- And allocate proportionally, to avoid looping
- eternally if snprintf() reports a too small
- count. */
- size_t n =
- xmax (xsum (length,
- ((unsigned int) count + 2
- + TCHARS_PER_DCHAR - 1)
- / TCHARS_PER_DCHAR),
- xtimes (allocated, 2));
-
- ENSURE_ALLOCATION (n);
- continue;
- }
- }
-#endif
-
-#if NEED_PRINTF_UNBOUNDED_PRECISION
- if (prec_ourselves)
- {
- /* Handle the precision. */
- TCHAR_T *prec_ptr =
-# if USE_SNPRINTF
- (TCHAR_T *) (result + length);
-# else
- tmp;
-# endif
- size_t prefix_count;
- size_t move;
-
- prefix_count = 0;
- /* Put the additional zeroes after the sign. */
- if (count >= 1
- && (*prec_ptr == '-' || *prec_ptr == '+'
- || *prec_ptr == ' '))
- prefix_count = 1;
- /* Put the additional zeroes after the 0x prefix if
- (flags & FLAG_ALT) || (dp->conversion == 'p'). */
- else if (count >= 2
- && prec_ptr[0] == '0'
- && (prec_ptr[1] == 'x' || prec_ptr[1] == 'X'))
- prefix_count = 2;
-
- move = count - prefix_count;
- if (precision > move)
- {
- /* Insert zeroes. */
- size_t insert = precision - move;
- TCHAR_T *prec_end;
-
-# if USE_SNPRINTF
- size_t n =
- xsum (length,
- (count + insert + TCHARS_PER_DCHAR - 1)
- / TCHARS_PER_DCHAR);
- length += (count + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR;
- ENSURE_ALLOCATION (n);
- length -= (count + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR;
- prec_ptr = (TCHAR_T *) (result + length);
-# endif
-
- prec_end = prec_ptr + count;
- prec_ptr += prefix_count;
-
- while (prec_end > prec_ptr)
- {
- prec_end--;
- prec_end[insert] = prec_end[0];
- }
-
- prec_end += insert;
- do
- *--prec_end = '0';
- while (prec_end > prec_ptr);
-
- count += insert;
- }
- }
-#endif
-
-#if !USE_SNPRINTF
- if (count >= tmp_length)
- /* tmp_length was incorrectly calculated - fix the
- code above! */
- abort ();
-#endif
-
-#if !DCHAR_IS_TCHAR
- /* Convert from TCHAR_T[] to DCHAR_T[]. */
- if (dp->conversion == 'c' || dp->conversion == 's')
- {
- /* type = TYPE_CHAR or TYPE_WIDE_CHAR or TYPE_STRING
- TYPE_WIDE_STRING.
- The result string is not certainly ASCII. */
- const TCHAR_T *tmpsrc;
- DCHAR_T *tmpdst;
- size_t tmpdst_len;
- /* This code assumes that TCHAR_T is 'char'. */
- static_assert (sizeof (TCHAR_T) == 1);
-# if USE_SNPRINTF
- tmpsrc = (TCHAR_T *) (result + length);
-# else
- tmpsrc = tmp;
-# endif
- tmpdst =
- DCHAR_CONV_FROM_ENCODING (locale_charset (),
- iconveh_question_mark,
- tmpsrc, count,
- NULL,
- NULL, &tmpdst_len);
- if (tmpdst == NULL)
- goto fail_with_errno;
- ENSURE_ALLOCATION_ELSE (xsum (length, tmpdst_len),
- { free (tmpdst); goto out_of_memory; });
- DCHAR_CPY (result + length, tmpdst, tmpdst_len);
- free (tmpdst);
- count = tmpdst_len;
- }
- else
- {
- /* The result string is ASCII.
- Simple 1:1 conversion. */
-# if USE_SNPRINTF
- /* If sizeof (DCHAR_T) == sizeof (TCHAR_T), it's a
- no-op conversion, in-place on the array starting
- at (result + length). */
- if (sizeof (DCHAR_T) != sizeof (TCHAR_T))
-# endif
- {
- const TCHAR_T *tmpsrc;
- DCHAR_T *tmpdst;
- size_t n;
-
-# if USE_SNPRINTF
- if (result == resultbuf)
- {
- tmpsrc = (TCHAR_T *) (result + length);
- /* ENSURE_ALLOCATION will not move tmpsrc
- (because it's part of resultbuf). */
- ENSURE_ALLOCATION (xsum (length, count));
- }
- else
- {
- /* ENSURE_ALLOCATION will move the array
- (because it uses realloc(). */
- ENSURE_ALLOCATION (xsum (length, count));
- tmpsrc = (TCHAR_T *) (result + length);
- }
-# else
- tmpsrc = tmp;
- ENSURE_ALLOCATION (xsum (length, count));
-# endif
- tmpdst = result + length;
- /* Copy backwards, because of overlapping. */
- tmpsrc += count;
- tmpdst += count;
- for (n = count; n > 0; n--)
- *--tmpdst = *--tmpsrc;
- }
- }
-#endif
-
-#if DCHAR_IS_TCHAR && !USE_SNPRINTF
- /* Make room for the result. */
- if (count > allocated - length)
- {
- /* Need at least count elements. But allocate
- proportionally. */
- size_t n =
- xmax (xsum (length, count), xtimes (allocated, 2));
-
- ENSURE_ALLOCATION (n);
- }
-#endif
-
- /* Here count <= allocated - length. */
-
- /* Perform padding. */
-#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
- if (pad_ourselves && has_width)
- {
- size_t w;
-# if ENABLE_UNISTDIO
- /* Outside POSIX, it's preferable to compare the width
- against the number of _characters_ of the converted
- value. */
- w = DCHAR_MBSNLEN (result + length, count);
-# else
- /* The width is compared against the number of _bytes_
- of the converted value, says POSIX. */
- w = count;
-# endif
- if (w < width)
- {
- size_t pad = width - w;
-
- /* Make room for the result. */
- if (xsum (count, pad) > allocated - length)
- {
- /* Need at least count + pad elements. But
- allocate proportionally. */
- size_t n =
- xmax (xsum3 (length, count, pad),
- xtimes (allocated, 2));
-
-# if USE_SNPRINTF
- length += count;
- ENSURE_ALLOCATION (n);
- length -= count;
-# else
- ENSURE_ALLOCATION (n);
-# endif
- }
- /* Here count + pad <= allocated - length. */
-
- {
-# if !DCHAR_IS_TCHAR || USE_SNPRINTF
- DCHAR_T * const rp = result + length;
-# else
- DCHAR_T * const rp = tmp;
-# endif
- DCHAR_T *p = rp + count;
- DCHAR_T *end = p + pad;
- DCHAR_T *pad_ptr;
-# if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO
- if (dp->conversion == 'c'
- || dp->conversion == 's')
- /* No zero-padding for string directives. */
- pad_ptr = NULL;
- else
-# endif
- {
- pad_ptr = (*rp == '-' ? rp + 1 : rp);
- /* No zero-padding of "inf" and "nan". */
- if ((*pad_ptr >= 'A' && *pad_ptr <= 'Z')
- || (*pad_ptr >= 'a' && *pad_ptr <= 'z'))
- pad_ptr = NULL;
- }
- /* The generated string now extends from rp to p,
- with the zero padding insertion point being at
- pad_ptr. */
-
- count = count + pad; /* = end - rp */
-
- if (flags & FLAG_LEFT)
- {
- /* Pad with spaces on the right. */
- for (; pad > 0; pad--)
- *p++ = ' ';
- }
- else if ((flags & FLAG_ZERO) && pad_ptr != NULL)
- {
- /* Pad with zeroes. */
- DCHAR_T *q = end;
-
- while (p > pad_ptr)
- *--q = *--p;
- for (; pad > 0; pad--)
- *p++ = '0';
- }
- else
- {
- /* Pad with spaces on the left. */
- DCHAR_T *q = end;
-
- while (p > rp)
- *--q = *--p;
- for (; pad > 0; pad--)
- *p++ = ' ';
- }
- }
- }
- }
-#endif
-
- /* Here still count <= allocated - length. */
-
-#if !DCHAR_IS_TCHAR || USE_SNPRINTF
- /* The snprintf() result did fit. */
-#else
- /* Append the sprintf() result. */
- memcpy (result + length, tmp, count * sizeof (DCHAR_T));
-#endif
-#if !USE_SNPRINTF
- if (tmp != tmpbuf)
- free (tmp);
-#endif
-
-#if NEED_PRINTF_DIRECTIVE_F
- if (dp->conversion == 'F')
- {
- /* Convert the %f result to upper case for %F. */
- DCHAR_T *rp = result + length;
- size_t rc;
- for (rc = count; rc > 0; rc--, rp++)
- if (*rp >= 'a' && *rp <= 'z')
- *rp = *rp - 'a' + 'A';
- }
-#endif
-
- length += count;
- break;
- }
- errno = orig_errno;
-#undef pad_ourselves
-#undef prec_ourselves
- }
- }
- }
-
- /* Add the final NUL. */
- ENSURE_ALLOCATION (xsum (length, 1));
- result[length] = '\0';
-
- if (result != resultbuf && length + 1 < allocated)
- {
- /* Shrink the allocated memory if possible. */
- DCHAR_T *memory;
-
- memory = (DCHAR_T *) realloc (result, (length + 1) * sizeof (DCHAR_T));
- if (memory != NULL)
- result = memory;
- }
-
- if (buf_malloced != NULL)
- free (buf_malloced);
- CLEANUP ();
- *lengthp = length;
- /* Note that we can produce a big string of a length > INT_MAX. POSIX
- says that snprintf() fails with errno = EOVERFLOW in this case, but
- that's only because snprintf() returns an 'int'. This function does
- not have this limitation. */
- return result;
-
-#if USE_SNPRINTF
- overflow:
- errno = EOVERFLOW;
- goto fail_with_errno;
-#endif
-
- out_of_memory:
- errno = ENOMEM;
- goto fail_with_errno;
-
-#if ENABLE_UNISTDIO || ((!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || (NEED_PRINTF_DIRECTIVE_LS && !defined IN_LIBINTL) || ENABLE_WCHAR_FALLBACK) && HAVE_WCHAR_T)
- fail_with_EILSEQ:
- errno = EILSEQ;
- goto fail_with_errno;
-#endif
-
- fail_with_errno:
- if (result != resultbuf)
- free (result);
- if (buf_malloced != NULL)
- free (buf_malloced);
- CLEANUP ();
- return NULL;
- }
-
- out_of_memory_1:
- errno = ENOMEM;
- goto fail_1_with_errno;
-
- fail_1_with_EINVAL:
- errno = EINVAL;
- goto fail_1_with_errno;
-
- fail_1_with_errno:
- CLEANUP ();
- return NULL;
-}
-
-#undef MAX_ROOM_NEEDED
-#undef TCHARS_PER_DCHAR
-#undef SNPRINTF
-#undef USE_SNPRINTF
-#undef DCHAR_SET
-#undef DCHAR_CPY
-#undef PRINTF_PARSE
-#undef DIRECTIVES
-#undef DIRECTIVE
-#undef DCHAR_IS_TCHAR
-#undef TCHAR_T
-#undef DCHAR_T
-#undef FCHAR_T
-#undef VASNPRINTF
diff --git a/cross/lib/vasnprintf.h b/cross/lib/vasnprintf.h
deleted file mode 100644
index f69649fb457..00000000000
--- a/cross/lib/vasnprintf.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* vsprintf with automatic memory allocation.
- Copyright (C) 2002-2004, 2007-2023 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 _VASNPRINTF_H
-#define _VASNPRINTF_H
-
-/* Get va_list. */
-#include <stdarg.h>
-
-/* Get size_t. */
-#include <stddef.h>
-
-/* Get _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD. */
-#include <stdio.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Write formatted output to a string dynamically allocated with malloc().
- You can pass a preallocated buffer for the result in RESULTBUF and its
- size in *LENGTHP; otherwise you pass RESULTBUF = NULL.
- If successful, return the address of the string (this may be = RESULTBUF
- if no dynamic memory allocation was necessary) and set *LENGTHP to the
- number of resulting bytes, excluding the trailing NUL. Upon error, set
- errno and return NULL.
-
- When dynamic memory allocation occurs, the preallocated buffer is left
- alone (with possibly modified contents). This makes it possible to use
- a statically allocated or stack-allocated buffer, like this:
-
- char buf[100];
- size_t len = sizeof (buf);
- char *output = vasnprintf (buf, &len, format, args);
- if (output == NULL)
- ... error handling ...;
- else
- {
- ... use the output string ...;
- if (output != buf)
- free (output);
- }
- */
-#if REPLACE_VASNPRINTF
-# define asnprintf rpl_asnprintf
-# define vasnprintf rpl_vasnprintf
-#endif
-extern char * asnprintf (char *restrict resultbuf, size_t *lengthp,
- const char *format, ...)
- _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, 3, 4));
-extern char * vasnprintf (char *restrict resultbuf, size_t *lengthp,
- const char *format, va_list args)
- _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, 3, 0));
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _VASNPRINTF_H */
diff --git a/cross/lib/vasprintf.c b/cross/lib/vasprintf.c
deleted file mode 100644
index d2878cd91d8..00000000000
--- a/cross/lib/vasprintf.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/* Formatted output to strings.
- Copyright (C) 1999, 2002, 2006-2023 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. */
-#ifdef IN_LIBASPRINTF
-# include "vasprintf.h"
-#else
-# include <stdio.h>
-#endif
-
-#include <errno.h>
-#include <limits.h>
-#include <stdlib.h>
-
-#include "vasnprintf.h"
-
-int
-vasprintf (char **resultp, const char *format, va_list args)
-{
- size_t length;
- char *result = vasnprintf (NULL, &length, format, args);
- if (result == NULL)
- return -1;
-
- if (length > INT_MAX)
- {
- free (result);
- errno = EOVERFLOW;
- return -1;
- }
-
- *resultp = result;
- /* Return the number of resulting bytes, excluding the trailing NUL. */
- return length;
-}
diff --git a/cross/lib/verify.h b/cross/lib/verify.h
deleted file mode 100644
index f0b3fc5851b..00000000000
--- a/cross/lib/verify.h
+++ /dev/null
@@ -1,367 +0,0 @@
-/* Compile-time assert-like macros.
-
- Copyright (C) 2005-2006, 2009-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-/* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */
-
-#ifndef _GL_VERIFY_H
-#define _GL_VERIFY_H
-
-
-/* Define _GL_HAVE__STATIC_ASSERT to 1 if _Static_assert (R, DIAGNOSTIC)
- works as per C11. This is supported by GCC 4.6.0+ and by clang 4+.
-
- Define _GL_HAVE__STATIC_ASSERT1 to 1 if _Static_assert (R) works as
- per C23. This is supported by GCC 9.1+.
-
- Support compilers claiming conformance to the relevant standard,
- and also support GCC when not pedantic. If we were willing to slow
- 'configure' down we could also use it with other compilers, but
- since this affects only the quality of diagnostics, why bother? */
-#ifndef __cplusplus
-# if (201112 <= __STDC_VERSION__ \
- || (!defined __STRICT_ANSI__ \
- && (4 < __GNUC__ + (6 <= __GNUC_MINOR__) || 5 <= __clang_major__)))
-# define _GL_HAVE__STATIC_ASSERT 1
-# endif
-# if (202311 <= __STDC_VERSION__ \
- || (!defined __STRICT_ANSI__ && 9 <= __GNUC__))
-# define _GL_HAVE__STATIC_ASSERT1 1
-# endif
-#endif
-
-/* FreeBSD 9.1 <sys/cdefs.h>, included by <stddef.h> and lots of other
- system headers, defines a conflicting _Static_assert that is no
- better than ours; override it. */
-#ifndef _GL_HAVE__STATIC_ASSERT
-# include <stddef.h>
-# undef _Static_assert
-#endif
-
-/* Each of these macros verifies that its argument R is nonzero. To
- be portable, R should be an integer constant expression. Unlike
- assert (R), there is no run-time overhead.
-
- If _Static_assert works, verify (R) uses it directly. Similarly,
- _GL_VERIFY_TRUE works by packaging a _Static_assert inside a struct
- that is an operand of sizeof.
-
- The code below uses several ideas for C++ compilers, and for C
- compilers that do not support _Static_assert:
-
- * The first step is ((R) ? 1 : -1). Given an expression R, of
- integral or boolean or floating-point type, this yields an
- expression of integral type, whose value is later verified to be
- constant and nonnegative.
-
- * Next this expression W is wrapped in a type
- struct _gl_verify_type {
- unsigned int _gl_verify_error_if_negative: W;
- }.
- If W is negative, this yields a compile-time error. No compiler can
- deal with a bit-field of negative size.
-
- One might think that an array size check would have the same
- effect, that is, that the type struct { unsigned int dummy[W]; }
- would work as well. However, inside a function, some compilers
- (such as C++ compilers and GNU C) allow local parameters and
- variables inside array size expressions. With these compilers,
- an array size check would not properly diagnose this misuse of
- the verify macro:
-
- void function (int n) { verify (n < 0); }
-
- * For the verify macro, the struct _gl_verify_type will need to
- somehow be embedded into a declaration. To be portable, this
- declaration must declare an object, a constant, a function, or a
- typedef name. If the declared entity uses the type directly,
- such as in
-
- struct dummy {...};
- typedef struct {...} dummy;
- extern struct {...} *dummy;
- extern void dummy (struct {...} *);
- extern struct {...} *dummy (void);
-
- two uses of the verify macro would yield colliding declarations
- if the entity names are not disambiguated. A workaround is to
- attach the current line number to the entity name:
-
- #define _GL_CONCAT0(x, y) x##y
- #define _GL_CONCAT(x, y) _GL_CONCAT0 (x, y)
- extern struct {...} * _GL_CONCAT (dummy, __LINE__);
-
- But this has the problem that two invocations of verify from
- within the same macro would collide, since the __LINE__ value
- would be the same for both invocations. (The GCC __COUNTER__
- macro solves this problem, but is not portable.)
-
- A solution is to use the sizeof operator. It yields a number,
- getting rid of the identity of the type. Declarations like
-
- extern int dummy [sizeof (struct {...})];
- extern void dummy (int [sizeof (struct {...})]);
- extern int (*dummy (void)) [sizeof (struct {...})];
-
- can be repeated.
-
- * Should the implementation use a named struct or an unnamed struct?
- Which of the following alternatives can be used?
-
- extern int dummy [sizeof (struct {...})];
- extern int dummy [sizeof (struct _gl_verify_type {...})];
- extern void dummy (int [sizeof (struct {...})]);
- extern void dummy (int [sizeof (struct _gl_verify_type {...})]);
- extern int (*dummy (void)) [sizeof (struct {...})];
- extern int (*dummy (void)) [sizeof (struct _gl_verify_type {...})];
-
- In the second and sixth case, the struct type is exported to the
- outer scope; two such declarations therefore collide. GCC warns
- about the first, third, and fourth cases. So the only remaining
- possibility is the fifth case:
-
- extern int (*dummy (void)) [sizeof (struct {...})];
-
- * GCC warns about duplicate declarations of the dummy function if
- -Wredundant-decls is used. GCC 4.3 and later have a builtin
- __COUNTER__ macro that can let us generate unique identifiers for
- each dummy function, to suppress this warning.
-
- * This implementation exploits the fact that older versions of GCC,
- which do not support _Static_assert, also do not warn about the
- last declaration mentioned above.
-
- * GCC warns if -Wnested-externs is enabled and 'verify' is used
- within a function body; but inside a function, you can always
- arrange to use verify_expr instead.
-
- * In C++, any struct definition inside sizeof is invalid.
- Use a template type to work around the problem. */
-
-/* Concatenate two preprocessor tokens. */
-#define _GL_CONCAT(x, y) _GL_CONCAT0 (x, y)
-#define _GL_CONCAT0(x, y) x##y
-
-/* _GL_COUNTER is an integer, preferably one that changes each time we
- use it. Use __COUNTER__ if it works, falling back on __LINE__
- otherwise. __LINE__ isn't perfect, but it's better than a
- constant. */
-#if defined __COUNTER__ && __COUNTER__ != __COUNTER__
-# define _GL_COUNTER __COUNTER__
-#else
-# define _GL_COUNTER __LINE__
-#endif
-
-/* Generate a symbol with the given prefix, making it unique if
- possible. */
-#define _GL_GENSYM(prefix) _GL_CONCAT (prefix, _GL_COUNTER)
-
-/* Verify requirement R at compile-time, as an integer constant expression
- that returns 1. If R is false, fail at compile-time, preferably
- with a diagnostic that includes the string-literal DIAGNOSTIC. */
-
-#define _GL_VERIFY_TRUE(R, DIAGNOSTIC) \
- (!!sizeof (_GL_VERIFY_TYPE (R, DIAGNOSTIC)))
-
-#ifdef __cplusplus
-# if !GNULIB_defined_struct__gl_verify_type
-template <int w>
- struct _gl_verify_type {
- unsigned int _gl_verify_error_if_negative: w;
- };
-# define GNULIB_defined_struct__gl_verify_type 1
-# endif
-# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \
- _gl_verify_type<(R) ? 1 : -1>
-#elif defined _GL_HAVE__STATIC_ASSERT
-# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \
- struct { \
- _Static_assert (R, DIAGNOSTIC); \
- int _gl_dummy; \
- }
-#else
-# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \
- struct { unsigned int _gl_verify_error_if_negative: (R) ? 1 : -1; }
-#endif
-
-/* Verify requirement R at compile-time, as a declaration without a
- trailing ';'. If R is false, fail at compile-time.
-
- This macro requires three or more arguments but uses at most the first
- two, so that the _Static_assert macro optionally defined below supports
- both the C11 two-argument syntax and the C23 one-argument syntax.
-
- Unfortunately, unlike C11, this implementation must appear as an
- ordinary declaration, and cannot appear inside struct { ... }. */
-
-#if 202311 <= __STDC_VERSION__ || 200410 <= __cpp_static_assert
-# define _GL_VERIFY(R, DIAGNOSTIC, ...) static_assert (R, DIAGNOSTIC)
-#elif defined _GL_HAVE__STATIC_ASSERT
-# define _GL_VERIFY(R, DIAGNOSTIC, ...) _Static_assert (R, DIAGNOSTIC)
-#else
-# define _GL_VERIFY(R, DIAGNOSTIC, ...) \
- extern int (*_GL_GENSYM (_gl_verify_function) (void)) \
- [_GL_VERIFY_TRUE (R, DIAGNOSTIC)]
-# if 4 < __GNUC__ + (6 <= __GNUC_MINOR__)
-# pragma GCC diagnostic ignored "-Wnested-externs"
-# endif
-#endif
-
-/* _GL_STATIC_ASSERT_H is defined if this code is copied into assert.h. */
-#ifdef _GL_STATIC_ASSERT_H
-/* Define _Static_assert if needed. */
-/* With clang ≥ 3.8.0 in C++ mode, _Static_assert already works and accepts
- 1 or 2 arguments. We better don't override it, because clang's standard
- C++ library uses static_assert inside classes in several places, and our
- replacement via _GL_VERIFY does not work in these contexts. */
-# if (defined __cplusplus && defined __clang__ \
- && (4 <= __clang_major__ + (8 <= __clang_minor__)))
-# if 5 <= __clang_major__
-/* Avoid "warning: 'static_assert' with no message is a C++17 extension". */
-# pragma clang diagnostic ignored "-Wc++17-extensions"
-# else
-/* Avoid "warning: static_assert with no message is a C++1z extension". */
-# pragma clang diagnostic ignored "-Wc++1z-extensions"
-# endif
-# elif !defined _GL_HAVE__STATIC_ASSERT1 && !defined _Static_assert
-# if !defined _MSC_VER || defined __clang__
-# define _Static_assert(...) \
- _GL_VERIFY (__VA_ARGS__, "static assertion failed", -)
-# else
- /* Work around MSVC preprocessor incompatibility with ISO C; see
- <https://stackoverflow.com/questions/5134523/>. */
-# define _Static_assert(R, ...) \
- _GL_VERIFY ((R), "static assertion failed", -)
-# endif
-# endif
-/* Define static_assert if needed. */
-# if (!defined static_assert \
- && __STDC_VERSION__ < 202311 \
- && (!defined __cplusplus \
- || (__cpp_static_assert < 201411 \
- && __GNUG__ < 6 && __clang_major__ < 6)))
-# if defined __cplusplus && _MSC_VER >= 1900 && !defined __clang__
-/* MSVC 14 in C++ mode supports the two-arguments static_assert but not
- the one-argument static_assert, and it does not support _Static_assert.
- We have to play preprocessor tricks to distinguish the two cases.
- Since the MSVC preprocessor is not ISO C compliant (see above),.
- the solution is specific to MSVC. */
-# define _GL_EXPAND(x) x
-# define _GL_SA1(a1) static_assert ((a1), "static assertion failed")
-# define _GL_SA2 static_assert
-# define _GL_SA3 static_assert
-# define _GL_SA_PICK(x1,x2,x3,x4,...) x4
-# define static_assert(...) _GL_EXPAND(_GL_SA_PICK(__VA_ARGS__,_GL_SA3,_GL_SA2,_GL_SA1)) (__VA_ARGS__)
-/* Avoid "fatal error C1189: #error: The C++ Standard Library forbids macroizing keywords." */
-# define _ALLOW_KEYWORD_MACROS 1
-# else
-# define static_assert _Static_assert /* C11 requires this #define. */
-# endif
-# endif
-#endif
-
-/* @assert.h omit start@ */
-
-#if defined __clang_major__ && __clang_major__ < 5
-# define _GL_HAS_BUILTIN_TRAP 0
-#elif 3 < __GNUC__ + (3 < __GNUC_MINOR__ + (4 <= __GNUC_PATCHLEVEL__))
-# define _GL_HAS_BUILTIN_TRAP 1
-#elif defined __has_builtin
-# define _GL_HAS_BUILTIN_TRAP __has_builtin (__builtin_trap)
-#else
-# define _GL_HAS_BUILTIN_TRAP 0
-#endif
-
-#if defined __clang_major__ && __clang_major__ < 5
-# define _GL_HAS_BUILTIN_UNREACHABLE 0
-#elif 4 < __GNUC__ + (5 <= __GNUC_MINOR__)
-# define _GL_HAS_BUILTIN_UNREACHABLE 1
-#elif defined __has_builtin
-# define _GL_HAS_BUILTIN_UNREACHABLE __has_builtin (__builtin_unreachable)
-#else
-# define _GL_HAS_BUILTIN_UNREACHABLE 0
-#endif
-
-/* Each of these macros verifies that its argument R is nonzero. To
- be portable, R should be an integer constant expression. Unlike
- assert (R), there is no run-time overhead.
-
- There are two macros, since no single macro can be used in all
- contexts in C. verify_expr (R, E) is for scalar contexts, including
- integer constant expression contexts. verify (R) is for declaration
- contexts, e.g., the top level. */
-
-/* Verify requirement R at compile-time. Return the value of the
- expression E. */
-
-#define verify_expr(R, E) \
- (_GL_VERIFY_TRUE (R, "verify_expr (" #R ", " #E ")") ? (E) : (E))
-
-/* Verify requirement R at compile-time, as a declaration without a
- trailing ';'. verify (R) acts like static_assert (R) except that
- it is portable to C11/C++14 and earlier, it can issue better
- diagnostics, and its name is shorter and may be more convenient. */
-
-#ifdef __PGI
-/* PGI barfs if R is long. */
-# define verify(R) _GL_VERIFY (R, "verify (...)", -)
-#else
-# define verify(R) _GL_VERIFY (R, "verify (" #R ")", -)
-#endif
-
-/* Assume that R always holds. Behavior is undefined if R is false,
- fails to evaluate, or has side effects.
-
- 'assume (R)' is a directive from the programmer telling the
- compiler that R is true so the compiler needn't generate code to
- test R. This is why 'assume' is in verify.h: it's related to
- static checking (in this case, static checking done by the
- programmer), not dynamic checking.
-
- 'assume (R)' can affect compilation of all the code, not just code
- that happens to be executed after the assume (R) is "executed".
- For example, if the code mistakenly does 'assert (R); assume (R);'
- the compiler is entitled to optimize away the 'assert (R)'.
-
- Although assuming R can help a compiler generate better code or
- diagnostics, performance can suffer if R uses hard-to-optimize
- features such as function calls not inlined by the compiler.
-
- Avoid Clang's __builtin_assume, as it breaks GNU Emacs master
- as of 2020-08-23T21:09:49Z!eggert@cs.ucla.edu; see
- <https://bugs.gnu.org/43152#71>. It's not known whether this breakage
- is a Clang bug or an Emacs bug; play it safe for now. */
-
-#if _GL_HAS_BUILTIN_UNREACHABLE
-# define assume(R) ((R) ? (void) 0 : __builtin_unreachable ())
-#elif 1200 <= _MSC_VER
-# define assume(R) __assume (R)
-#elif 202311 <= __STDC_VERSION__
-# include <stddef.h>
-# define assume(R) ((R) ? (void) 0 : unreachable ())
-#elif (defined GCC_LINT || defined lint) && _GL_HAS_BUILTIN_TRAP
- /* Doing it this way helps various packages when configured with
- --enable-gcc-warnings, which compiles with -Dlint. It's nicer
- if 'assume' silences warnings with GCC 3.4 through GCC 4.4.7 (2012). */
-# define assume(R) ((R) ? (void) 0 : __builtin_trap ())
-#else
- /* Some older tools grok NOTREACHED, e.g., Oracle Studio 12.6 (2017). */
-# define assume(R) ((R) ? (void) 0 : /*NOTREACHED*/ (void) 0)
-#endif
-
-/* @assert.h omit end@ */
-
-#endif
diff --git a/cross/lib/vfprintf.c b/cross/lib/vfprintf.c
deleted file mode 100644
index 01d79a2beca..00000000000
--- a/cross/lib/vfprintf.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Formatted output to a stream.
- Copyright (C) 2004, 2006-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-/* Specification. */
-#include <stdio.h>
-
-#include <errno.h>
-#include <limits.h>
-#include <stdarg.h>
-#include <stdlib.h>
-
-#include "fseterr.h"
-#include "vasnprintf.h"
-
-/* Print formatted output to the stream FP.
- Return string length of formatted string. On error, return a negative
- value. */
-int
-vfprintf (FILE *fp, const char *format, va_list args)
-{
- char buf[2000];
- char *output;
- size_t len;
- size_t lenbuf = sizeof (buf);
-
- output = vasnprintf (buf, &lenbuf, format, args);
- len = lenbuf;
-
- if (!output)
- {
- fseterr (fp);
- return -1;
- }
-
- if (fwrite (output, 1, len, fp) < len)
- {
- if (output != buf)
- free (output);
- return -1;
- }
-
- if (output != buf)
- free (output);
-
- if (len > INT_MAX)
- {
- errno = EOVERFLOW;
- fseterr (fp);
- return -1;
- }
-
- return len;
-}
diff --git a/cross/lib/vla.h b/cross/lib/vla.h
deleted file mode 100644
index 55f112a060a..00000000000
--- a/cross/lib/vla.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* vla.h - variable length arrays
-
- Copyright 2014-2023 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>.
-
- Written by Paul Eggert. */
-
-/* The VLA_ELEMS macro does not allocate variable-length arrays (VLAs),
- so it does not have the security or performance issues commonly
- associated with VLAs. VLA_ELEMS is for exploiting a C11 feature
- where a function can start like this:
-
- double scan_array (int n, double v[static n])
-
- to require a caller to pass a vector V with at least N elements;
- this allows better static checking and performance in some cases.
- In C11 this feature means that V is a VLA, so the feature is
- supported only if __STDC_NO_VLA__ is defined, and for compatibility
- to platforms that do not support VLAs, VLA_ELEMS (n) expands to
- nothing when __STDC_NO_VLA__ is not defined. */
-
-/* A function's argument must point to an array with at least N elements.
- Example: 'int main (int argc, char *argv[VLA_ELEMS (argc)]);'. */
-
-#ifdef __STDC_NO_VLA__
-# define VLA_ELEMS(n)
-#else
-# define VLA_ELEMS(n) static n
-#endif
-
-/* Although C99 requires support for variable-length arrays (VLAs),
- some C compilers never supported VLAs and VLAs are optional in C11.
- VLAs are controversial because their allocation may be unintended
- or awkward to support, and large VLAs might cause security or
- performance problems. GCC can diagnose the use of VLAs via the
- -Wvla and -Wvla-larger-than warnings options, and defining the
- macro GNULIB_NO_VLA disables the allocation of VLAs in Gnulib code.
-
- The VLA_ELEMS macro is unaffected by GNULIB_NO_VLA, since it does
- not allocate VLAs. Programs that use VLA_ELEMS should be compiled
- with 'gcc -Wvla-larger-than' instead of with 'gcc -Wvla'. */
diff --git a/cross/lib/warn-on-use.h b/cross/lib/warn-on-use.h
deleted file mode 100644
index 30756034aff..00000000000
--- a/cross/lib/warn-on-use.h
+++ /dev/null
@@ -1,149 +0,0 @@
-/* A C macro for emitting warnings if a function is used.
- Copyright (C) 2010-2023 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
diff --git a/cross/lib/xalloc-oversized.h b/cross/lib/xalloc-oversized.h
deleted file mode 100644
index 5dbdfb5506a..00000000000
--- a/cross/lib/xalloc-oversized.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/* xalloc-oversized.h -- memory allocation size checking
-
- Copyright (C) 1990-2000, 2003-2004, 2006-2023 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 XALLOC_OVERSIZED_H_
-#define XALLOC_OVERSIZED_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-/* True if N * S does not fit into both ptrdiff_t and size_t.
- N and S should be nonnegative and free of side effects.
- This expands to a constant expression if N and S are both constants.
- By gnulib convention, SIZE_MAX represents overflow in size_t
- calculations, so the conservative size_t-based dividend to use here
- is SIZE_MAX - 1. */
-#define __xalloc_oversized(n, s) \
- ((s) != 0 \
- && ((size_t) (PTRDIFF_MAX < SIZE_MAX ? PTRDIFF_MAX : SIZE_MAX - 1) / (s) \
- < (n)))
-
-/* Return 1 if and only if an array of N objects, each of size S,
- cannot exist reliably because its total size in bytes would exceed
- MIN (PTRDIFF_MAX, SIZE_MAX - 1).
-
- N and S should be nonnegative and free of side effects.
-
- Warning: (xalloc_oversized (N, S) ? NULL : malloc (N * S)) can
- misbehave if N and S are both narrower than ptrdiff_t and size_t,
- and can be rewritten as (xalloc_oversized (N, S) ? NULL
- : malloc (N * (size_t) S)).
-
- This is a macro, not a function, so that it works even if an
- argument exceeds MAX (PTRDIFF_MAX, SIZE_MAX). */
-#if 7 <= __GNUC__ && !defined __clang__ && PTRDIFF_MAX < SIZE_MAX
-# define xalloc_oversized(n, s) \
- __builtin_mul_overflow_p (n, s, (ptrdiff_t) 1)
-#elif (5 <= __GNUC__ && !defined __ICC && !__STRICT_ANSI__ \
- && PTRDIFF_MAX < SIZE_MAX)
-# define xalloc_oversized(n, s) \
- (__builtin_constant_p (n) && __builtin_constant_p (s) \
- ? __xalloc_oversized (n, s) \
- : ({ ptrdiff_t __xalloc_count; \
- __builtin_mul_overflow (n, s, &__xalloc_count); }))
-
-/* Other compilers use integer division; this may be slower but is
- more portable. */
-#else
-# define xalloc_oversized(n, s) __xalloc_oversized (n, s)
-#endif
-
-#endif /* !XALLOC_OVERSIZED_H_ */
diff --git a/cross/lib/xsize.c b/cross/lib/xsize.c
deleted file mode 100644
index 279ae824f87..00000000000
--- a/cross/lib/xsize.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Checked size_t computations.
-
- Copyright (C) 2012-2023 Free Software Foundation, Inc.
-
- This file is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as
- published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
-
- This file is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see <https://www.gnu.org/licenses/>. */
-
-#include <config.h>
-
-#define XSIZE_INLINE _GL_EXTERN_INLINE
-#include "xsize.h"
diff --git a/cross/lib/xsize.h b/cross/lib/xsize.h
deleted file mode 100644
index 1ec78e776fc..00000000000
--- a/cross/lib/xsize.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/* xsize.h -- Checked size_t computations.
-
- Copyright (C) 2003, 2008-2023 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 _XSIZE_H
-#define _XSIZE_H
-
-/* Get size_t. */
-#include <stddef.h>
-
-/* Get SIZE_MAX. */
-#include <limits.h>
-#if HAVE_STDINT_H
-# include <stdint.h>
-#endif
-
-/* Get ATTRIBUTE_PURE. */
-#include "attribute.h"
-
-#ifndef _GL_INLINE_HEADER_BEGIN
- #error "Please include config.h first."
-#endif
-_GL_INLINE_HEADER_BEGIN
-#ifndef XSIZE_INLINE
-# define XSIZE_INLINE _GL_INLINE
-#endif
-
-/* The size of memory objects is often computed through expressions of
- type size_t. Example:
- void* p = malloc (header_size + n * element_size).
- These computations can lead to overflow. When this happens, malloc()
- returns a piece of memory that is way too small, and the program then
- crashes while attempting to fill the memory.
- To avoid this, the functions and macros in this file check for overflow.
- The convention is that SIZE_MAX represents overflow.
- malloc (SIZE_MAX) is not guaranteed to fail -- think of a malloc
- implementation that uses mmap --, it's recommended to use size_overflow_p()
- or size_in_bounds_p() before invoking malloc().
- The example thus becomes:
- size_t size = xsum (header_size, xtimes (n, element_size));
- void *p = (size_in_bounds_p (size) ? malloc (size) : NULL);
-*/
-
-/* Convert an arbitrary value >= 0 to type size_t. */
-#define xcast_size_t(N) \
- ((N) <= SIZE_MAX ? (size_t) (N) : SIZE_MAX)
-
-/* Sum of two sizes, with overflow check. */
-XSIZE_INLINE size_t ATTRIBUTE_PURE
-xsum (size_t size1, size_t size2)
-{
- size_t sum = size1 + size2;
- return (sum >= size1 ? sum : SIZE_MAX);
-}
-
-/* Sum of three sizes, with overflow check. */
-XSIZE_INLINE size_t ATTRIBUTE_PURE
-xsum3 (size_t size1, size_t size2, size_t size3)
-{
- return xsum (xsum (size1, size2), size3);
-}
-
-/* Sum of four sizes, with overflow check. */
-XSIZE_INLINE size_t ATTRIBUTE_PURE
-xsum4 (size_t size1, size_t size2, size_t size3, size_t size4)
-{
- return xsum (xsum (xsum (size1, size2), size3), size4);
-}
-
-/* Maximum of two sizes, with overflow check. */
-XSIZE_INLINE size_t ATTRIBUTE_PURE
-xmax (size_t size1, size_t size2)
-{
- /* No explicit check is needed here, because for any n:
- max (SIZE_MAX, n) == SIZE_MAX and max (n, SIZE_MAX) == SIZE_MAX. */
- return (size1 >= size2 ? size1 : size2);
-}
-
-/* Multiplication of a count with an element size, with overflow check.
- The count must be >= 0 and the element size must be > 0.
- This is a macro, not a function, so that it works correctly even
- when N is of a wider type and N > SIZE_MAX. */
-#define xtimes(N, ELSIZE) \
- ((N) <= SIZE_MAX / (ELSIZE) ? (size_t) (N) * (ELSIZE) : SIZE_MAX)
-
-/* Check for overflow. */
-#define size_overflow_p(SIZE) \
- ((SIZE) == SIZE_MAX)
-/* Check against overflow. */
-#define size_in_bounds_p(SIZE) \
- ((SIZE) != SIZE_MAX)
-
-_GL_INLINE_HEADER_END
-
-#endif /* _XSIZE_H */