Merge remote-tracking branch 'savannah/master' into HEAD
This commit is contained in:
commit
8fb9463013
133 changed files with 4293 additions and 1544 deletions
|
@ -34,7 +34,8 @@ GNULIB_MODULES='
|
|||
d-type diffseq double-slash-root dtoastr dtotimespec dup2
|
||||
environ execinfo explicit_bzero faccessat
|
||||
fchmodat fcntl fcntl-h fdopendir
|
||||
filemode filename filevercmp flexmember fpieee fstatat fsusage fsync futimens
|
||||
filemode filename filevercmp flexmember fpieee
|
||||
free-posix fstatat fsusage fsync futimens
|
||||
getloadavg getopt-gnu getrandom gettime gettimeofday gitlog-to-changelog
|
||||
ieee754-h ignore-value intprops largefile libgmp lstat
|
||||
manywarnings memmem-simple mempcpy memrchr minmax mkostemp mktime nstrftime
|
||||
|
|
224
build-aux/config.guess
vendored
224
build-aux/config.guess
vendored
|
@ -2,7 +2,7 @@
|
|||
# Attempt to guess a canonical system name.
|
||||
# Copyright 1992-2020 Free Software Foundation, Inc.
|
||||
|
||||
timestamp='2020-08-17'
|
||||
timestamp='2020-12-22'
|
||||
|
||||
# This file is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by
|
||||
|
@ -27,12 +27,12 @@ timestamp='2020-08-17'
|
|||
# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
|
||||
#
|
||||
# You can get the latest version of this script from:
|
||||
# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
|
||||
# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
|
||||
#
|
||||
# Please send patches to <config-patches@gnu.org>.
|
||||
|
||||
|
||||
me=`echo "$0" | sed -e 's,.*/,,'`
|
||||
me=$(echo "$0" | sed -e 's,.*/,,')
|
||||
|
||||
usage="\
|
||||
Usage: $0 [OPTION]
|
||||
|
@ -103,7 +103,7 @@ set_cc_for_build() {
|
|||
test "$tmp" && return 0
|
||||
: "${TMPDIR=/tmp}"
|
||||
# shellcheck disable=SC2039
|
||||
{ tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
|
||||
{ tmp=$( (umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null) && test -n "$tmp" && test -d "$tmp" ; } ||
|
||||
{ test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } ||
|
||||
{ tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } ||
|
||||
{ echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; }
|
||||
|
@ -131,16 +131,14 @@ if test -f /.attbin/uname ; then
|
|||
PATH=$PATH:/.attbin ; export PATH
|
||||
fi
|
||||
|
||||
UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
|
||||
UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
|
||||
UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
|
||||
UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
|
||||
UNAME_MACHINE=$( (uname -m) 2>/dev/null) || UNAME_MACHINE=unknown
|
||||
UNAME_RELEASE=$( (uname -r) 2>/dev/null) || UNAME_RELEASE=unknown
|
||||
UNAME_SYSTEM=$( (uname -s) 2>/dev/null) || UNAME_SYSTEM=unknown
|
||||
UNAME_VERSION=$( (uname -v) 2>/dev/null) || UNAME_VERSION=unknown
|
||||
|
||||
case "$UNAME_SYSTEM" in
|
||||
Linux|GNU|GNU/*)
|
||||
# If the system lacks a compiler, then just pick glibc.
|
||||
# We could probably try harder.
|
||||
LIBC=gnu
|
||||
LIBC=unknown
|
||||
|
||||
set_cc_for_build
|
||||
cat <<-EOF > "$dummy.c"
|
||||
|
@ -149,17 +147,29 @@ Linux|GNU|GNU/*)
|
|||
LIBC=uclibc
|
||||
#elif defined(__dietlibc__)
|
||||
LIBC=dietlibc
|
||||
#else
|
||||
#elif defined(__GLIBC__)
|
||||
LIBC=gnu
|
||||
#else
|
||||
#include <stdarg.h>
|
||||
/* First heuristic to detect musl libc. */
|
||||
#ifdef __DEFINED_va_list
|
||||
LIBC=musl
|
||||
#endif
|
||||
#endif
|
||||
EOF
|
||||
eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`"
|
||||
eval "$($CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g')"
|
||||
|
||||
# If ldd exists, use it to detect musl libc.
|
||||
if command -v ldd >/dev/null && \
|
||||
ldd --version 2>&1 | grep -q ^musl
|
||||
then
|
||||
LIBC=musl
|
||||
# Second heuristic to detect musl libc.
|
||||
if [ "$LIBC" = unknown ] &&
|
||||
command -v ldd >/dev/null &&
|
||||
ldd --version 2>&1 | grep -q ^musl; then
|
||||
LIBC=musl
|
||||
fi
|
||||
|
||||
# If the system lacks a compiler, then just pick glibc.
|
||||
# We could probably try harder.
|
||||
if [ "$LIBC" = unknown ]; then
|
||||
LIBC=gnu
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
@ -179,19 +189,20 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
|
|||
# Note: NetBSD doesn't particularly care about the vendor
|
||||
# portion of the name. We always set it to "unknown".
|
||||
sysctl="sysctl -n hw.machine_arch"
|
||||
UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
|
||||
UNAME_MACHINE_ARCH=$( (uname -p 2>/dev/null || \
|
||||
"/sbin/$sysctl" 2>/dev/null || \
|
||||
"/usr/sbin/$sysctl" 2>/dev/null || \
|
||||
echo unknown)`
|
||||
echo unknown))
|
||||
case "$UNAME_MACHINE_ARCH" in
|
||||
aarch64eb) machine=aarch64_be-unknown ;;
|
||||
armeb) machine=armeb-unknown ;;
|
||||
arm*) machine=arm-unknown ;;
|
||||
sh3el) machine=shl-unknown ;;
|
||||
sh3eb) machine=sh-unknown ;;
|
||||
sh5el) machine=sh5le-unknown ;;
|
||||
earmv*)
|
||||
arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
|
||||
endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'`
|
||||
arch=$(echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,')
|
||||
endian=$(echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p')
|
||||
machine="${arch}${endian}"-unknown
|
||||
;;
|
||||
*) machine="$UNAME_MACHINE_ARCH"-unknown ;;
|
||||
|
@ -222,7 +233,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
|
|||
case "$UNAME_MACHINE_ARCH" in
|
||||
earm*)
|
||||
expr='s/^earmv[0-9]/-eabi/;s/eb$//'
|
||||
abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"`
|
||||
abi=$(echo "$UNAME_MACHINE_ARCH" | sed -e "$expr")
|
||||
;;
|
||||
esac
|
||||
# The OS release
|
||||
|
@ -235,7 +246,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
|
|||
release='-gnu'
|
||||
;;
|
||||
*)
|
||||
release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2`
|
||||
release=$(echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2)
|
||||
;;
|
||||
esac
|
||||
# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
|
||||
|
@ -244,15 +255,15 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
|
|||
echo "$machine-${os}${release}${abi-}"
|
||||
exit ;;
|
||||
*:Bitrig:*:*)
|
||||
UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
|
||||
UNAME_MACHINE_ARCH=$(arch | sed 's/Bitrig.//')
|
||||
echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE"
|
||||
exit ;;
|
||||
*:OpenBSD:*:*)
|
||||
UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
|
||||
UNAME_MACHINE_ARCH=$(arch | sed 's/OpenBSD.//')
|
||||
echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE"
|
||||
exit ;;
|
||||
*:LibertyBSD:*:*)
|
||||
UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
|
||||
UNAME_MACHINE_ARCH=$(arch | sed 's/^.*BSD\.//')
|
||||
echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE"
|
||||
exit ;;
|
||||
*:MidnightBSD:*:*)
|
||||
|
@ -288,17 +299,17 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
|
|||
alpha:OSF1:*:*)
|
||||
case $UNAME_RELEASE in
|
||||
*4.0)
|
||||
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
|
||||
UNAME_RELEASE=$(/usr/sbin/sizer -v | awk '{print $3}')
|
||||
;;
|
||||
*5.*)
|
||||
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
|
||||
UNAME_RELEASE=$(/usr/sbin/sizer -v | awk '{print $4}')
|
||||
;;
|
||||
esac
|
||||
# According to Compaq, /usr/sbin/psrinfo has been available on
|
||||
# OSF/1 and Tru64 systems produced since 1995. I hope that
|
||||
# covers most systems running today. This code pipes the CPU
|
||||
# types through head -n 1, so we only detect the type of CPU 0.
|
||||
ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
|
||||
ALPHA_CPU_TYPE=$(/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1)
|
||||
case "$ALPHA_CPU_TYPE" in
|
||||
"EV4 (21064)")
|
||||
UNAME_MACHINE=alpha ;;
|
||||
|
@ -336,7 +347,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
|
|||
# A Tn.n version is a released field test version.
|
||||
# A Xn.n version is an unreleased experimental baselevel.
|
||||
# 1.2 uses "1.2" for uname -r.
|
||||
echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`"
|
||||
echo "$UNAME_MACHINE"-dec-osf"$(echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz)"
|
||||
# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
|
||||
exitcode=$?
|
||||
trap '' 0
|
||||
|
@ -370,7 +381,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
|
|||
exit ;;
|
||||
Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
|
||||
# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
|
||||
if test "`(/bin/universe) 2>/dev/null`" = att ; then
|
||||
if test "$( (/bin/universe) 2>/dev/null)" = att ; then
|
||||
echo pyramid-pyramid-sysv3
|
||||
else
|
||||
echo pyramid-pyramid-bsd
|
||||
|
@ -383,17 +394,17 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
|
|||
echo sparc-icl-nx6
|
||||
exit ;;
|
||||
DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
|
||||
case `/usr/bin/uname -p` in
|
||||
case $(/usr/bin/uname -p) in
|
||||
sparc) echo sparc-icl-nx7; exit ;;
|
||||
esac ;;
|
||||
s390x:SunOS:*:*)
|
||||
echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`"
|
||||
echo "$UNAME_MACHINE"-ibm-solaris2"$(echo "$UNAME_RELEASE" | sed -e 's/[^.]*//')"
|
||||
exit ;;
|
||||
sun4H:SunOS:5.*:*)
|
||||
echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
|
||||
echo sparc-hal-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
|
||||
exit ;;
|
||||
sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
|
||||
echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`"
|
||||
echo sparc-sun-solaris2"$(echo "$UNAME_RELEASE" | sed -e 's/[^.]*//')"
|
||||
exit ;;
|
||||
i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
|
||||
echo i386-pc-auroraux"$UNAME_RELEASE"
|
||||
|
@ -412,30 +423,30 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
|
|||
SUN_ARCH=x86_64
|
||||
fi
|
||||
fi
|
||||
echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
|
||||
echo "$SUN_ARCH"-pc-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
|
||||
exit ;;
|
||||
sun4*:SunOS:6*:*)
|
||||
# According to config.sub, this is the proper way to canonicalize
|
||||
# SunOS6. Hard to guess exactly what SunOS6 will be like, but
|
||||
# it's likely to be more like Solaris than SunOS4.
|
||||
echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
|
||||
echo sparc-sun-solaris3"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
|
||||
exit ;;
|
||||
sun4*:SunOS:*:*)
|
||||
case "`/usr/bin/arch -k`" in
|
||||
case "$(/usr/bin/arch -k)" in
|
||||
Series*|S4*)
|
||||
UNAME_RELEASE=`uname -v`
|
||||
UNAME_RELEASE=$(uname -v)
|
||||
;;
|
||||
esac
|
||||
# Japanese Language versions have a version number like `4.1.3-JL'.
|
||||
echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`"
|
||||
echo sparc-sun-sunos"$(echo "$UNAME_RELEASE"|sed -e 's/-/_/')"
|
||||
exit ;;
|
||||
sun3*:SunOS:*:*)
|
||||
echo m68k-sun-sunos"$UNAME_RELEASE"
|
||||
exit ;;
|
||||
sun*:*:4.2BSD:*)
|
||||
UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
|
||||
UNAME_RELEASE=$( (sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null)
|
||||
test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3
|
||||
case "`/bin/arch`" in
|
||||
case "$(/bin/arch)" in
|
||||
sun3)
|
||||
echo m68k-sun-sunos"$UNAME_RELEASE"
|
||||
;;
|
||||
|
@ -515,8 +526,8 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
|
|||
}
|
||||
EOF
|
||||
$CC_FOR_BUILD -o "$dummy" "$dummy.c" &&
|
||||
dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` &&
|
||||
SYSTEM_NAME=`"$dummy" "$dummyarg"` &&
|
||||
dummyarg=$(echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p') &&
|
||||
SYSTEM_NAME=$("$dummy" "$dummyarg") &&
|
||||
{ echo "$SYSTEM_NAME"; exit; }
|
||||
echo mips-mips-riscos"$UNAME_RELEASE"
|
||||
exit ;;
|
||||
|
@ -543,7 +554,7 @@ EOF
|
|||
exit ;;
|
||||
AViiON:dgux:*:*)
|
||||
# DG/UX returns AViiON for all architectures
|
||||
UNAME_PROCESSOR=`/usr/bin/uname -p`
|
||||
UNAME_PROCESSOR=$(/usr/bin/uname -p)
|
||||
if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110
|
||||
then
|
||||
if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \
|
||||
|
@ -571,17 +582,17 @@ EOF
|
|||
echo m68k-tektronix-bsd
|
||||
exit ;;
|
||||
*:IRIX*:*:*)
|
||||
echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`"
|
||||
echo mips-sgi-irix"$(echo "$UNAME_RELEASE"|sed -e 's/-/_/g')"
|
||||
exit ;;
|
||||
????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
|
||||
echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
|
||||
exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
|
||||
exit ;; # Note that: echo "'$(uname -s)'" gives 'AIX '
|
||||
i*86:AIX:*:*)
|
||||
echo i386-ibm-aix
|
||||
exit ;;
|
||||
ia64:AIX:*:*)
|
||||
if test -x /usr/bin/oslevel ; then
|
||||
IBM_REV=`/usr/bin/oslevel`
|
||||
IBM_REV=$(/usr/bin/oslevel)
|
||||
else
|
||||
IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"
|
||||
fi
|
||||
|
@ -601,7 +612,7 @@ EOF
|
|||
exit(0);
|
||||
}
|
||||
EOF
|
||||
if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"`
|
||||
if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=$("$dummy")
|
||||
then
|
||||
echo "$SYSTEM_NAME"
|
||||
else
|
||||
|
@ -614,15 +625,15 @@ EOF
|
|||
fi
|
||||
exit ;;
|
||||
*:AIX:*:[4567])
|
||||
IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
|
||||
IBM_CPU_ID=$(/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }')
|
||||
if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then
|
||||
IBM_ARCH=rs6000
|
||||
else
|
||||
IBM_ARCH=powerpc
|
||||
fi
|
||||
if test -x /usr/bin/lslpp ; then
|
||||
IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
|
||||
awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
|
||||
IBM_REV=$(/usr/bin/lslpp -Lqc bos.rte.libc |
|
||||
awk -F: '{ print $3 }' | sed s/[0-9]*$/0/)
|
||||
else
|
||||
IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"
|
||||
fi
|
||||
|
@ -650,14 +661,14 @@ EOF
|
|||
echo m68k-hp-bsd4.4
|
||||
exit ;;
|
||||
9000/[34678]??:HP-UX:*:*)
|
||||
HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'`
|
||||
HPUX_REV=$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//')
|
||||
case "$UNAME_MACHINE" in
|
||||
9000/31?) HP_ARCH=m68000 ;;
|
||||
9000/[34]??) HP_ARCH=m68k ;;
|
||||
9000/[678][0-9][0-9])
|
||||
if test -x /usr/bin/getconf; then
|
||||
sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
|
||||
sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
|
||||
sc_cpu_version=$(/usr/bin/getconf SC_CPU_VERSION 2>/dev/null)
|
||||
sc_kernel_bits=$(/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null)
|
||||
case "$sc_cpu_version" in
|
||||
523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
|
||||
528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
|
||||
|
@ -704,7 +715,7 @@ EOF
|
|||
exit (0);
|
||||
}
|
||||
EOF
|
||||
(CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"`
|
||||
(CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=$("$dummy")
|
||||
test -z "$HP_ARCH" && HP_ARCH=hppa
|
||||
fi ;;
|
||||
esac
|
||||
|
@ -732,7 +743,7 @@ EOF
|
|||
echo "$HP_ARCH"-hp-hpux"$HPUX_REV"
|
||||
exit ;;
|
||||
ia64:HP-UX:*:*)
|
||||
HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'`
|
||||
HPUX_REV=$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//')
|
||||
echo ia64-hp-hpux"$HPUX_REV"
|
||||
exit ;;
|
||||
3050*:HI-UX:*:*)
|
||||
|
@ -762,7 +773,7 @@ EOF
|
|||
exit (0);
|
||||
}
|
||||
EOF
|
||||
$CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` &&
|
||||
$CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=$("$dummy") &&
|
||||
{ echo "$SYSTEM_NAME"; exit; }
|
||||
echo unknown-hitachi-hiuxwe2
|
||||
exit ;;
|
||||
|
@ -831,14 +842,14 @@ EOF
|
|||
echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
|
||||
exit ;;
|
||||
F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
|
||||
FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
|
||||
FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
|
||||
FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'`
|
||||
FUJITSU_PROC=$(uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz)
|
||||
FUJITSU_SYS=$(uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///')
|
||||
FUJITSU_REL=$(echo "$UNAME_RELEASE" | sed -e 's/ /_/')
|
||||
echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
|
||||
exit ;;
|
||||
5000:UNIX_System_V:4.*:*)
|
||||
FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
|
||||
FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
|
||||
FUJITSU_SYS=$(uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///')
|
||||
FUJITSU_REL=$(echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/')
|
||||
echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
|
||||
exit ;;
|
||||
i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
|
||||
|
@ -851,25 +862,25 @@ EOF
|
|||
echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE"
|
||||
exit ;;
|
||||
arm:FreeBSD:*:*)
|
||||
UNAME_PROCESSOR=`uname -p`
|
||||
UNAME_PROCESSOR=$(uname -p)
|
||||
set_cc_for_build
|
||||
if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
|
||||
| grep -q __ARM_PCS_VFP
|
||||
then
|
||||
echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabi
|
||||
echo "${UNAME_PROCESSOR}"-unknown-freebsd"$(echo ${UNAME_RELEASE}|sed -e 's/[-(].*//')"-gnueabi
|
||||
else
|
||||
echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabihf
|
||||
echo "${UNAME_PROCESSOR}"-unknown-freebsd"$(echo ${UNAME_RELEASE}|sed -e 's/[-(].*//')"-gnueabihf
|
||||
fi
|
||||
exit ;;
|
||||
*:FreeBSD:*:*)
|
||||
UNAME_PROCESSOR=`/usr/bin/uname -p`
|
||||
UNAME_PROCESSOR=$(/usr/bin/uname -p)
|
||||
case "$UNAME_PROCESSOR" in
|
||||
amd64)
|
||||
UNAME_PROCESSOR=x86_64 ;;
|
||||
i386)
|
||||
UNAME_PROCESSOR=i586 ;;
|
||||
esac
|
||||
echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`"
|
||||
echo "$UNAME_PROCESSOR"-unknown-freebsd"$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')"
|
||||
exit ;;
|
||||
i*:CYGWIN*:*)
|
||||
echo "$UNAME_MACHINE"-pc-cygwin
|
||||
|
@ -905,15 +916,15 @@ EOF
|
|||
echo x86_64-pc-cygwin
|
||||
exit ;;
|
||||
prep*:SunOS:5.*:*)
|
||||
echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
|
||||
echo powerpcle-unknown-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
|
||||
exit ;;
|
||||
*:GNU:*:*)
|
||||
# the GNU system
|
||||
echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`"
|
||||
echo "$(echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,')-unknown-$LIBC$(echo "$UNAME_RELEASE"|sed -e 's,/.*$,,')"
|
||||
exit ;;
|
||||
*:GNU/*:*:*)
|
||||
# other systems with GNU libc and userland
|
||||
echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC"
|
||||
echo "$UNAME_MACHINE-unknown-$(echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]")$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')-$LIBC"
|
||||
exit ;;
|
||||
*:Minix:*:*)
|
||||
echo "$UNAME_MACHINE"-unknown-minix
|
||||
|
@ -926,7 +937,7 @@ EOF
|
|||
echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
|
||||
exit ;;
|
||||
alpha:Linux:*:*)
|
||||
case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in
|
||||
case $(sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null) in
|
||||
EV5) UNAME_MACHINE=alphaev5 ;;
|
||||
EV56) UNAME_MACHINE=alphaev56 ;;
|
||||
PCA56) UNAME_MACHINE=alphapca56 ;;
|
||||
|
@ -985,6 +996,9 @@ EOF
|
|||
k1om:Linux:*:*)
|
||||
echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
|
||||
exit ;;
|
||||
loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*)
|
||||
echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
|
||||
exit ;;
|
||||
m32r*:Linux:*:*)
|
||||
echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
|
||||
exit ;;
|
||||
|
@ -1035,7 +1049,7 @@ EOF
|
|||
#endif
|
||||
#endif
|
||||
EOF
|
||||
eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`"
|
||||
eval "$($CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI')"
|
||||
test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; }
|
||||
;;
|
||||
mips64el:Linux:*:*)
|
||||
|
@ -1055,7 +1069,7 @@ EOF
|
|||
exit ;;
|
||||
parisc:Linux:*:* | hppa:Linux:*:*)
|
||||
# Look for CPU level
|
||||
case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
|
||||
case $(grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2) in
|
||||
PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;;
|
||||
PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;;
|
||||
*) echo hppa-unknown-linux-"$LIBC" ;;
|
||||
|
@ -1145,7 +1159,7 @@ EOF
|
|||
echo "$UNAME_MACHINE"-pc-msdosdjgpp
|
||||
exit ;;
|
||||
i*86:*:4.*:*)
|
||||
UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'`
|
||||
UNAME_REL=$(echo "$UNAME_RELEASE" | sed 's/\/MP$//')
|
||||
if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
|
||||
echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL"
|
||||
else
|
||||
|
@ -1154,7 +1168,7 @@ EOF
|
|||
exit ;;
|
||||
i*86:*:5:[678]*)
|
||||
# UnixWare 7.x, OpenUNIX and OpenServer 6.
|
||||
case `/bin/uname -X | grep "^Machine"` in
|
||||
case $(/bin/uname -X | grep "^Machine") in
|
||||
*486*) UNAME_MACHINE=i486 ;;
|
||||
*Pentium) UNAME_MACHINE=i586 ;;
|
||||
*Pent*|*Celeron) UNAME_MACHINE=i686 ;;
|
||||
|
@ -1163,10 +1177,10 @@ EOF
|
|||
exit ;;
|
||||
i*86:*:3.2:*)
|
||||
if test -f /usr/options/cb.name; then
|
||||
UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
|
||||
UNAME_REL=$(sed -n 's/.*Version //p' </usr/options/cb.name)
|
||||
echo "$UNAME_MACHINE"-pc-isc"$UNAME_REL"
|
||||
elif /bin/uname -X 2>/dev/null >/dev/null ; then
|
||||
UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
|
||||
UNAME_REL=$( (/bin/uname -X|grep Release|sed -e 's/.*= //'))
|
||||
(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
|
||||
(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
|
||||
&& UNAME_MACHINE=i586
|
||||
|
@ -1216,7 +1230,7 @@ EOF
|
|||
3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
|
||||
OS_REL=''
|
||||
test -r /etc/.relid \
|
||||
&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
|
||||
&& OS_REL=.$(sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid)
|
||||
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
|
||||
&& { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
|
||||
/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
|
||||
|
@ -1227,7 +1241,7 @@ EOF
|
|||
NCR*:*:4.2:* | MPRAS*:*:4.2:*)
|
||||
OS_REL='.3'
|
||||
test -r /etc/.relid \
|
||||
&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
|
||||
&& OS_REL=.$(sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid)
|
||||
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
|
||||
&& { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
|
||||
/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
|
||||
|
@ -1260,7 +1274,7 @@ EOF
|
|||
exit ;;
|
||||
*:SINIX-*:*:*)
|
||||
if uname -p 2>/dev/null >/dev/null ; then
|
||||
UNAME_MACHINE=`(uname -p) 2>/dev/null`
|
||||
UNAME_MACHINE=$( (uname -p) 2>/dev/null)
|
||||
echo "$UNAME_MACHINE"-sni-sysv4
|
||||
else
|
||||
echo ns32k-sni-sysv
|
||||
|
@ -1346,7 +1360,7 @@ EOF
|
|||
echo aarch64-apple-darwin"$UNAME_RELEASE"
|
||||
exit ;;
|
||||
*:Darwin:*:*)
|
||||
UNAME_PROCESSOR=`uname -p`
|
||||
UNAME_PROCESSOR=$(uname -p)
|
||||
case $UNAME_PROCESSOR in
|
||||
unknown) UNAME_PROCESSOR=powerpc ;;
|
||||
esac
|
||||
|
@ -1383,7 +1397,7 @@ EOF
|
|||
echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE"
|
||||
exit ;;
|
||||
*:procnto*:*:* | *:QNX:[0123456789]*:*)
|
||||
UNAME_PROCESSOR=`uname -p`
|
||||
UNAME_PROCESSOR=$(uname -p)
|
||||
if test "$UNAME_PROCESSOR" = x86; then
|
||||
UNAME_PROCESSOR=i386
|
||||
UNAME_MACHINE=pc
|
||||
|
@ -1451,10 +1465,10 @@ EOF
|
|||
echo mips-sei-seiux"$UNAME_RELEASE"
|
||||
exit ;;
|
||||
*:DragonFly:*:*)
|
||||
echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`"
|
||||
echo "$UNAME_MACHINE"-unknown-dragonfly"$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')"
|
||||
exit ;;
|
||||
*:*VMS:*:*)
|
||||
UNAME_MACHINE=`(uname -p) 2>/dev/null`
|
||||
UNAME_MACHINE=$( (uname -p) 2>/dev/null)
|
||||
case "$UNAME_MACHINE" in
|
||||
A*) echo alpha-dec-vms ; exit ;;
|
||||
I*) echo ia64-dec-vms ; exit ;;
|
||||
|
@ -1464,7 +1478,7 @@ EOF
|
|||
echo i386-pc-xenix
|
||||
exit ;;
|
||||
i*86:skyos:*:*)
|
||||
echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`"
|
||||
echo "$UNAME_MACHINE"-pc-skyos"$(echo "$UNAME_RELEASE" | sed -e 's/ .*$//')"
|
||||
exit ;;
|
||||
i*86:rdos:*:*)
|
||||
echo "$UNAME_MACHINE"-pc-rdos
|
||||
|
@ -1522,7 +1536,7 @@ main ()
|
|||
#define __ARCHITECTURE__ "m68k"
|
||||
#endif
|
||||
int version;
|
||||
version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
|
||||
version=$( (hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null);
|
||||
if (version < 4)
|
||||
printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
|
||||
else
|
||||
|
@ -1614,7 +1628,7 @@ main ()
|
|||
}
|
||||
EOF
|
||||
|
||||
$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`$dummy` &&
|
||||
$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=$($dummy) &&
|
||||
{ echo "$SYSTEM_NAME"; exit; }
|
||||
|
||||
# Apollos put the system type in the environment.
|
||||
|
@ -1639,14 +1653,14 @@ This script (version $timestamp), has failed to recognize the
|
|||
operating system you are using. If your script is old, overwrite *all*
|
||||
copies of config.guess and config.sub with the latest versions from:
|
||||
|
||||
https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
|
||||
https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
|
||||
and
|
||||
https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
|
||||
https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
|
||||
EOF
|
||||
|
||||
year=`echo $timestamp | sed 's,-.*,,'`
|
||||
year=$(echo $timestamp | sed 's,-.*,,')
|
||||
# shellcheck disable=SC2003
|
||||
if test "`expr "\`date +%Y\`" - "$year"`" -lt 3 ; then
|
||||
if test "$(expr "$(date +%Y)" - "$year")" -lt 3 ; then
|
||||
cat >&2 <<EOF
|
||||
|
||||
If $0 has already been updated, send the following data and any
|
||||
|
@ -1655,20 +1669,20 @@ provide the necessary information to handle your system.
|
|||
|
||||
config.guess timestamp = $timestamp
|
||||
|
||||
uname -m = `(uname -m) 2>/dev/null || echo unknown`
|
||||
uname -r = `(uname -r) 2>/dev/null || echo unknown`
|
||||
uname -s = `(uname -s) 2>/dev/null || echo unknown`
|
||||
uname -v = `(uname -v) 2>/dev/null || echo unknown`
|
||||
uname -m = $( (uname -m) 2>/dev/null || echo unknown)
|
||||
uname -r = $( (uname -r) 2>/dev/null || echo unknown)
|
||||
uname -s = $( (uname -s) 2>/dev/null || echo unknown)
|
||||
uname -v = $( (uname -v) 2>/dev/null || echo unknown)
|
||||
|
||||
/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
|
||||
/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
|
||||
/usr/bin/uname -p = $( (/usr/bin/uname -p) 2>/dev/null)
|
||||
/bin/uname -X = $( (/bin/uname -X) 2>/dev/null)
|
||||
|
||||
hostinfo = `(hostinfo) 2>/dev/null`
|
||||
/bin/universe = `(/bin/universe) 2>/dev/null`
|
||||
/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
|
||||
/bin/arch = `(/bin/arch) 2>/dev/null`
|
||||
/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
|
||||
/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
|
||||
hostinfo = $( (hostinfo) 2>/dev/null)
|
||||
/bin/universe = $( (/bin/universe) 2>/dev/null)
|
||||
/usr/bin/arch -k = $( (/usr/bin/arch -k) 2>/dev/null)
|
||||
/bin/arch = $( (/bin/arch) 2>/dev/null)
|
||||
/usr/bin/oslevel = $( (/usr/bin/oslevel) 2>/dev/null)
|
||||
/usr/convex/getsysinfo = $( (/usr/convex/getsysinfo) 2>/dev/null)
|
||||
|
||||
UNAME_MACHINE = "$UNAME_MACHINE"
|
||||
UNAME_RELEASE = "$UNAME_RELEASE"
|
||||
|
|
60
build-aux/config.sub
vendored
60
build-aux/config.sub
vendored
|
@ -2,7 +2,7 @@
|
|||
# Configuration validation subroutine script.
|
||||
# Copyright 1992-2020 Free Software Foundation, Inc.
|
||||
|
||||
timestamp='2020-08-17'
|
||||
timestamp='2020-12-22'
|
||||
|
||||
# This file is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by
|
||||
|
@ -33,7 +33,7 @@ timestamp='2020-08-17'
|
|||
# Otherwise, we print the canonical config type on stdout and succeed.
|
||||
|
||||
# You can get the latest version of this script from:
|
||||
# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
|
||||
# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
|
||||
|
||||
# This file is supposed to be the same for all GNU packages
|
||||
# and recognize all the CPU types, system types and aliases
|
||||
|
@ -50,7 +50,7 @@ timestamp='2020-08-17'
|
|||
# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
|
||||
# It is wrong to echo any other type of specification.
|
||||
|
||||
me=`echo "$0" | sed -e 's,.*/,,'`
|
||||
me=$(echo "$0" | sed -e 's,.*/,,')
|
||||
|
||||
usage="\
|
||||
Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
|
||||
|
@ -769,22 +769,22 @@ case $basic_machine in
|
|||
vendor=hp
|
||||
;;
|
||||
i*86v32)
|
||||
cpu=`echo "$1" | sed -e 's/86.*/86/'`
|
||||
cpu=$(echo "$1" | sed -e 's/86.*/86/')
|
||||
vendor=pc
|
||||
basic_os=sysv32
|
||||
;;
|
||||
i*86v4*)
|
||||
cpu=`echo "$1" | sed -e 's/86.*/86/'`
|
||||
cpu=$(echo "$1" | sed -e 's/86.*/86/')
|
||||
vendor=pc
|
||||
basic_os=sysv4
|
||||
;;
|
||||
i*86v)
|
||||
cpu=`echo "$1" | sed -e 's/86.*/86/'`
|
||||
cpu=$(echo "$1" | sed -e 's/86.*/86/')
|
||||
vendor=pc
|
||||
basic_os=sysv
|
||||
;;
|
||||
i*86sol2)
|
||||
cpu=`echo "$1" | sed -e 's/86.*/86/'`
|
||||
cpu=$(echo "$1" | sed -e 's/86.*/86/')
|
||||
vendor=pc
|
||||
basic_os=solaris2
|
||||
;;
|
||||
|
@ -917,7 +917,7 @@ case $basic_machine in
|
|||
;;
|
||||
leon-*|leon[3-9]-*)
|
||||
cpu=sparc
|
||||
vendor=`echo "$basic_machine" | sed 's/-.*//'`
|
||||
vendor=$(echo "$basic_machine" | sed 's/-.*//')
|
||||
;;
|
||||
|
||||
*-*)
|
||||
|
@ -1084,7 +1084,7 @@ case $cpu-$vendor in
|
|||
cpu=mipsisa64sb1el
|
||||
;;
|
||||
sh5e[lb]-*)
|
||||
cpu=`echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/'`
|
||||
cpu=$(echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/')
|
||||
;;
|
||||
spur-*)
|
||||
cpu=spur
|
||||
|
@ -1102,7 +1102,7 @@ case $cpu-$vendor in
|
|||
cpu=x86_64
|
||||
;;
|
||||
xscale-* | xscalee[bl]-*)
|
||||
cpu=`echo "$cpu" | sed 's/^xscale/arm/'`
|
||||
cpu=$(echo "$cpu" | sed 's/^xscale/arm/')
|
||||
;;
|
||||
arm64-*)
|
||||
cpu=aarch64
|
||||
|
@ -1185,6 +1185,7 @@ case $cpu-$vendor in
|
|||
| k1om \
|
||||
| le32 | le64 \
|
||||
| lm32 \
|
||||
| loongarch32 | loongarch64 | loongarchx32 \
|
||||
| m32c | m32r | m32rle \
|
||||
| m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
|
||||
| m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
|
||||
|
@ -1241,6 +1242,7 @@ case $cpu-$vendor in
|
|||
| sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \
|
||||
| spu \
|
||||
| tahoe \
|
||||
| thumbv7* \
|
||||
| tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \
|
||||
| tron \
|
||||
| ubicom32 \
|
||||
|
@ -1286,11 +1288,15 @@ then
|
|||
case $basic_os in
|
||||
gnu/linux*)
|
||||
kernel=linux
|
||||
os=`echo $basic_os | sed -e 's|gnu/linux|gnu|'`
|
||||
os=$(echo $basic_os | sed -e 's|gnu/linux|gnu|')
|
||||
;;
|
||||
os2-emx)
|
||||
kernel=os2
|
||||
os=$(echo $basic_os | sed -e 's|os2-emx|emx|')
|
||||
;;
|
||||
nto-qnx*)
|
||||
kernel=nto
|
||||
os=`echo $basic_os | sed -e 's|nto-qnx|qnx|'`
|
||||
os=$(echo $basic_os | sed -e 's|nto-qnx|qnx|')
|
||||
;;
|
||||
*-*)
|
||||
# shellcheck disable=SC2162
|
||||
|
@ -1301,11 +1307,11 @@ EOF
|
|||
# Default OS when just kernel was specified
|
||||
nto*)
|
||||
kernel=nto
|
||||
os=`echo $basic_os | sed -e 's|nto|qnx|'`
|
||||
os=$(echo $basic_os | sed -e 's|nto|qnx|')
|
||||
;;
|
||||
linux*)
|
||||
kernel=linux
|
||||
os=`echo $basic_os | sed -e 's|linux|gnu|'`
|
||||
os=$(echo $basic_os | sed -e 's|linux|gnu|')
|
||||
;;
|
||||
*)
|
||||
kernel=
|
||||
|
@ -1326,7 +1332,7 @@ case $os in
|
|||
os=cnk
|
||||
;;
|
||||
solaris1 | solaris1.*)
|
||||
os=`echo $os | sed -e 's|solaris1|sunos4|'`
|
||||
os=$(echo $os | sed -e 's|solaris1|sunos4|')
|
||||
;;
|
||||
solaris)
|
||||
os=solaris2
|
||||
|
@ -1355,7 +1361,7 @@ case $os in
|
|||
os=sco3.2v4
|
||||
;;
|
||||
sco3.2.[4-9]*)
|
||||
os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
|
||||
os=$(echo $os | sed -e 's/sco3.2./sco3.2v/')
|
||||
;;
|
||||
sco*v* | scout)
|
||||
# Don't match below
|
||||
|
@ -1367,13 +1373,7 @@ case $os in
|
|||
os=psos
|
||||
;;
|
||||
qnx*)
|
||||
case $cpu in
|
||||
x86 | i*86)
|
||||
;;
|
||||
*)
|
||||
os=nto-$os
|
||||
;;
|
||||
esac
|
||||
os=qnx
|
||||
;;
|
||||
hiux*)
|
||||
os=hiuxwe2
|
||||
|
@ -1391,7 +1391,7 @@ case $os in
|
|||
os=lynxos
|
||||
;;
|
||||
mac[0-9]*)
|
||||
os=`echo "$os" | sed -e 's|mac|macos|'`
|
||||
os=$(echo "$os" | sed -e 's|mac|macos|')
|
||||
;;
|
||||
opened*)
|
||||
os=openedition
|
||||
|
@ -1400,10 +1400,10 @@ case $os in
|
|||
os=os400
|
||||
;;
|
||||
sunos5*)
|
||||
os=`echo "$os" | sed -e 's|sunos5|solaris2|'`
|
||||
os=$(echo "$os" | sed -e 's|sunos5|solaris2|')
|
||||
;;
|
||||
sunos6*)
|
||||
os=`echo "$os" | sed -e 's|sunos6|solaris3|'`
|
||||
os=$(echo "$os" | sed -e 's|sunos6|solaris3|')
|
||||
;;
|
||||
wince*)
|
||||
os=wince
|
||||
|
@ -1437,7 +1437,7 @@ case $os in
|
|||
;;
|
||||
# Preserve the version number of sinix5.
|
||||
sinix5.*)
|
||||
os=`echo $os | sed -e 's|sinix|sysv|'`
|
||||
os=$(echo $os | sed -e 's|sinix|sysv|')
|
||||
;;
|
||||
sinix*)
|
||||
os=sysv4
|
||||
|
@ -1722,7 +1722,7 @@ case $os in
|
|||
| skyos* | haiku* | rdos* | toppers* | drops* | es* \
|
||||
| onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
|
||||
| midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
|
||||
| nsk* | powerunix* | genode* | zvmoe* )
|
||||
| nsk* | powerunix* | genode* | zvmoe* | qnx* | emx*)
|
||||
;;
|
||||
# This one is extra strict with allowed versions
|
||||
sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
|
||||
|
@ -1741,6 +1741,8 @@ esac
|
|||
case $kernel-$os in
|
||||
linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* | linux-musl* | linux-uclibc* )
|
||||
;;
|
||||
uclinux-uclibc* )
|
||||
;;
|
||||
-dietlibc* | -newlib* | -musl* | -uclibc* )
|
||||
# These are just libc implementations, not actual OSes, and thus
|
||||
# require a kernel.
|
||||
|
@ -1751,6 +1753,8 @@ case $kernel-$os in
|
|||
;;
|
||||
nto-qnx*)
|
||||
;;
|
||||
os2-emx)
|
||||
;;
|
||||
*-eabi* | *-gnueabi*)
|
||||
;;
|
||||
-*)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#!/bin/sh
|
||||
# install - install a program, script, or datafile
|
||||
|
||||
scriptversion=2020-07-26.22; # UTC
|
||||
scriptversion=2020-11-14.01; # UTC
|
||||
|
||||
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
||||
# later released in X11R6 (xc/config/util/install.sh) with the
|
||||
|
@ -73,6 +73,7 @@ mode=0755
|
|||
# This is like GNU 'install' as of coreutils 8.32 (2020).
|
||||
mkdir_umask=22
|
||||
|
||||
backupsuffix=
|
||||
chgrpcmd=
|
||||
chmodcmd=$chmodprog
|
||||
chowncmd=
|
||||
|
@ -103,18 +104,28 @@ Options:
|
|||
--version display version info and exit.
|
||||
|
||||
-c (ignored)
|
||||
-C install only if different (preserve the last data modification time)
|
||||
-C install only if different (preserve data modification time)
|
||||
-d create directories instead of installing files.
|
||||
-g GROUP $chgrpprog installed files to GROUP.
|
||||
-m MODE $chmodprog installed files to MODE.
|
||||
-o USER $chownprog installed files to USER.
|
||||
-p pass -p to $cpprog.
|
||||
-s $stripprog installed files.
|
||||
-S SUFFIX attempt to back up existing files, with suffix SUFFIX.
|
||||
-t DIRECTORY install into DIRECTORY.
|
||||
-T report an error if DSTFILE is a directory.
|
||||
|
||||
Environment variables override the default commands:
|
||||
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
||||
RMPROG STRIPPROG
|
||||
|
||||
By default, rm is invoked with -f; when overridden with RMPROG,
|
||||
it's up to you to specify -f if you want it.
|
||||
|
||||
If -S is not specified, no backups are attempted.
|
||||
|
||||
Email bug reports to bug-automake@gnu.org.
|
||||
Automake home page: https://www.gnu.org/software/automake/
|
||||
"
|
||||
|
||||
while test $# -ne 0; do
|
||||
|
@ -141,8 +152,13 @@ while test $# -ne 0; do
|
|||
-o) chowncmd="$chownprog $2"
|
||||
shift;;
|
||||
|
||||
-p) cpprog="$cpprog -p";;
|
||||
|
||||
-s) stripcmd=$stripprog;;
|
||||
|
||||
-S) backupsuffix="$2"
|
||||
shift;;
|
||||
|
||||
-t)
|
||||
is_target_a_directory=always
|
||||
dst_arg=$2
|
||||
|
@ -259,6 +275,10 @@ do
|
|||
dstdir=$dst
|
||||
test -d "$dstdir"
|
||||
dstdir_status=$?
|
||||
# Don't chown directories that already exist.
|
||||
if test $dstdir_status = 0; then
|
||||
chowncmd=""
|
||||
fi
|
||||
else
|
||||
|
||||
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
||||
|
@ -473,6 +493,13 @@ do
|
|||
then
|
||||
rm -f "$dsttmp"
|
||||
else
|
||||
# If $backupsuffix is set, and the file being installed
|
||||
# already exists, attempt a backup. Don't worry if it fails,
|
||||
# e.g., if mv doesn't support -f.
|
||||
if test -n "$backupsuffix" && test -f "$dst"; then
|
||||
$doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null
|
||||
fi
|
||||
|
||||
# Rename the file to the real destination.
|
||||
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
|
||||
|
||||
|
@ -487,9 +514,9 @@ do
|
|||
# file should still install successfully.
|
||||
{
|
||||
test ! -f "$dst" ||
|
||||
$doit $rmcmd -f "$dst" 2>/dev/null ||
|
||||
$doit $rmcmd "$dst" 2>/dev/null ||
|
||||
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
||||
{ $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
|
||||
{ $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
|
||||
} ||
|
||||
{ echo "$0: cannot unlink or rename $dst" >&2
|
||||
(exit 1); exit 1
|
||||
|
|
|
@ -5986,6 +5986,12 @@ if test $AUTO_DEPEND = yes; then
|
|||
AS_MKDIR_P([$dir/deps])
|
||||
done
|
||||
fi
|
||||
if $gl_gnulib_enabled_scratch_buffer; then
|
||||
AS_MKDIR_P([lib/malloc])
|
||||
if test $AUTO_DEPEND = yes; then
|
||||
AS_MKDIR_P([lib/deps/malloc])
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_OUTPUT
|
||||
|
||||
|
|
|
@ -5904,7 +5904,13 @@ string containing the image data as raw bytes. @var{image-type} should be a
|
|||
To @var{svg} add an embedded (raster) image placed at
|
||||
@var{relative-filename}. @var{relative-filename} is searched inside
|
||||
@code{file-name-directory} of the @code{:base-uri} svg image property.
|
||||
This improves the performance of embedding large images.
|
||||
@code{:base-uri} specifies a (possibly non-existing) file name of the
|
||||
svg image to be created, thus all the embedded files are searched
|
||||
relatively to the @code{:base-uri} filename's directory. If
|
||||
@code{:base-uri} is ommited, then filename from where svg image is
|
||||
loaded is used. Using @code{:base-uri} improves the performance of
|
||||
embedding large images, comparing to @code{svg-embed}, because all the
|
||||
work is done directly by librsvg.
|
||||
|
||||
@lisp
|
||||
;; Embeding /tmp/subdir/rms.jpg and /tmp/another/rms.jpg
|
||||
|
|
|
@ -116,6 +116,21 @@ If you need to compute the width of a string on display, you should use
|
|||
since @code{length} only counts the number of characters, but does not
|
||||
account for the display width of each character.
|
||||
|
||||
@defun length< sequence length
|
||||
Return non-@code{nil} if @var{sequence} is shorter than @var{length}.
|
||||
This may be more efficient than computing the length of @var{sequence}
|
||||
if @var{sequence} is a long list.
|
||||
@end defun
|
||||
|
||||
@defun length> sequence length
|
||||
Return non-@code{nil} if @var{sequence} is longer than @var{length}.
|
||||
@end defun
|
||||
|
||||
@defun length= sequence length
|
||||
Return non-@code{nil} if the length of @var{sequence} is equal to
|
||||
@var{length}.
|
||||
@end defun
|
||||
|
||||
@defun elt sequence index
|
||||
@anchor{Definition of elt}
|
||||
@cindex elements of sequences
|
||||
|
|
|
@ -381,17 +381,6 @@ The default value of @var{separators} for @code{split-string}. Its
|
|||
usual value is @w{@code{"[ \f\t\n\r\v]+"}}.
|
||||
@end defvar
|
||||
|
||||
@defun string-slice string regexp
|
||||
Split @var{string} into a list of strings on @var{regexp} boundaries.
|
||||
As opposed to @code{split-string}, the boundaries are included in the
|
||||
result set:
|
||||
|
||||
@example
|
||||
(string-slice " two words " " +")
|
||||
@result{} (" two" " words" " ")
|
||||
@end example
|
||||
@end defun
|
||||
|
||||
@defun string-clean-whitespace string
|
||||
Clean up the whitespace in @var{string} by collapsing stretches of
|
||||
whitespace to a single space character, as well as removing all
|
||||
|
@ -405,12 +394,19 @@ there are individual words that are longer than @var{length}, these
|
|||
will not be shortened.
|
||||
@end defun
|
||||
|
||||
@defun string-limit string length &optional end
|
||||
@defun string-limit string length &optional end coding-system
|
||||
If @var{string} is shorter than @var{length}, @var{string} is returned
|
||||
as is. Otherwise, return a substring of @var{string} consisting of
|
||||
the first @var{length} characters. If the optional @var{end}
|
||||
parameter is given, return a string of the @var{length} last
|
||||
characters instead.
|
||||
|
||||
If @var{coding-system} is non-@code{nil}, @var{string} will be encoded
|
||||
before limiting, and the result will be a unibyte string that's
|
||||
shorter than @code{length}. If @var{string} contains characters that
|
||||
are encoded into several bytes (for instance, when using
|
||||
@code{utf-8}), the resulting unibyte string is never truncated in the
|
||||
middle of a character representation.
|
||||
@end defun
|
||||
|
||||
@defun string-lines string &optional omit-nulls
|
||||
|
|
|
@ -901,6 +901,7 @@ status of its latest version.
|
|||
@menu
|
||||
* Origin of the term Emacs::
|
||||
* Latest version of Emacs::
|
||||
* New in Emacs 27::
|
||||
* New in Emacs 26::
|
||||
* New in Emacs 25::
|
||||
* New in Emacs 24::
|
||||
|
@ -951,7 +952,7 @@ conventions}).
|
|||
Emacs @value{EMACSVER} is the current version as of this writing. A version
|
||||
number with two components (e.g., @samp{24.5}) indicates a released
|
||||
version; three components indicate a development
|
||||
version (e.g., @samp{27.0.50} is what will eventually become @samp{27.1}).
|
||||
version (e.g., @samp{28.0.50} is what will eventually become @samp{28.1}).
|
||||
|
||||
Emacs is under active development, hosted at
|
||||
@uref{https://savannah.gnu.org/projects/emacs/, Savannah}.
|
||||
|
@ -970,6 +971,63 @@ Emacs, type @kbd{C-h C-n} (@kbd{M-x view-emacs-news}). You can give
|
|||
this command a prefix argument to read about which features were new
|
||||
in older versions.
|
||||
|
||||
@node New in Emacs 27
|
||||
@section What is different about Emacs 27?
|
||||
@cindex Differences between Emacs 26 and Emacs 27
|
||||
@cindex Emacs 27, new features in
|
||||
|
||||
@itemize
|
||||
@cindex bignum support
|
||||
@item
|
||||
Emacs now uses the GNU Multiple Precision (@acronym{GMP}) library to
|
||||
support integers whose size is too large to support natively. The
|
||||
integers supported natively are known as ``fixnums'', while the larger
|
||||
ones are ``bignums''. All the arithmetic, comparison, and logical
|
||||
(also known as ``bitwise'') operations where bignums make sense now
|
||||
support both fixnums and bignums.
|
||||
|
||||
@cindex HarfBuzz
|
||||
@item
|
||||
Emacs now uses HarfBuzz as its default shaping engine.
|
||||
|
||||
@cindex JSON, native parsing
|
||||
@item
|
||||
Native support for @acronym{JSON} parsing that is much faster than
|
||||
@file{json.el}.
|
||||
|
||||
@item
|
||||
Cairo drawing is no longer experimental.
|
||||
|
||||
@cindex portable dumper
|
||||
@item
|
||||
Emacs now uses a ``portable dumper'' instead of unexec. This improves
|
||||
compatibility with memory allocation on modern systems, and in
|
||||
particular better supports the Address Space Layout Randomization
|
||||
(@acronym{ASLR}) feature, a security technique used by most modern
|
||||
operating systems.
|
||||
|
||||
@cindex XDG convention
|
||||
@item
|
||||
Emacs can now use the @acronym{XDG} convention for init files.
|
||||
|
||||
@cindex early init file
|
||||
@item
|
||||
Emacs can now be configured using an early init file. The primary
|
||||
purpose is to allow customizing how the package system is initialized
|
||||
given that initialization now happens before loading the regular init
|
||||
file.
|
||||
|
||||
@cindex tabs
|
||||
@item
|
||||
Built-in support for tabs (tab bar and tab line).
|
||||
|
||||
@item
|
||||
Support for resizing and rotating of images without ImageMagick.
|
||||
@end itemize
|
||||
|
||||
Consult the Emacs @file{NEWS} file (@kbd{C-h n}) for the full list of
|
||||
changes in Emacs 27.
|
||||
|
||||
@node New in Emacs 26
|
||||
@section What is different about Emacs 26?
|
||||
@cindex Differences between Emacs 25 and Emacs 26
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
% Load plain if necessary, i.e., if running under initex.
|
||||
\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
|
||||
%
|
||||
\def\texinfoversion{2020-06-25.17}
|
||||
\def\texinfoversion{2020-10-24.12}
|
||||
%
|
||||
% Copyright 1985, 1986, 1988, 1990-2020 Free Software Foundation, Inc.
|
||||
%
|
||||
|
@ -1088,7 +1088,7 @@
|
|||
}
|
||||
% The -2 in the arguments here gives all the input to TeX catcode 12
|
||||
% (other) or 10 (space), preventing undefined control sequence errors. See
|
||||
% https://lists.gnu.org/r/bug-texinfo/2019-08/msg00031.html
|
||||
% https://lists.gnu.org/archive/html/bug-texinfo/2019-08/msg00031.html
|
||||
%
|
||||
\endgroup
|
||||
\def\pdfescapestring#1{\directlua{PDFescstr('\luaescapestring{#1}')}}
|
||||
|
@ -3038,10 +3038,18 @@
|
|||
% arg (if given), and not the url (which is then just the link target).
|
||||
\newif\ifurefurlonlylink
|
||||
|
||||
% The default \pretolerance setting stops the penalty inserted in
|
||||
% \urefallowbreak being a discouragement to line breaking. Set it to
|
||||
% a negative value for this paragraph only. Hopefully this does not
|
||||
% conflict with redefinitions of \par done elsewhere.
|
||||
\def\nopretolerance{%
|
||||
\pretolerance=-1
|
||||
\def\par{\endgraf\pretolerance=100 \let\par\endgraf}%
|
||||
}
|
||||
|
||||
% The main macro is \urefbreak, which allows breaking at expected
|
||||
% places within the url. (There used to be another version, which
|
||||
% didn't support automatic breaking.)
|
||||
\def\urefbreak{\begingroup \urefcatcodes \dourefbreak}
|
||||
% places within the url.
|
||||
\def\urefbreak{\nopretolerance \begingroup \urefcatcodes \dourefbreak}
|
||||
\let\uref=\urefbreak
|
||||
%
|
||||
\def\dourefbreak#1{\urefbreakfinish #1,,,\finish}
|
||||
|
@ -3152,14 +3160,14 @@
|
|||
|
||||
% Allow a ragged right output to aid breaking long URL's. There can
|
||||
% be a break at the \allowbreak with no extra glue (if the existing stretch in
|
||||
% the line is sufficient), a break at the \penalty100 with extra glue added
|
||||
% the line is sufficient), a break at the \penalty with extra glue added
|
||||
% at the end of the line, or no break at all here.
|
||||
% Changing the value of the penalty and/or the amount of stretch affects how
|
||||
% preferable one choice is over the other.
|
||||
\def\urefallowbreak{%
|
||||
\allowbreak
|
||||
\penalty0\relax
|
||||
\hskip 0pt plus 2 em\relax
|
||||
\penalty300
|
||||
\penalty1000\relax
|
||||
\hskip 0pt plus -2 em\relax
|
||||
}
|
||||
|
||||
|
@ -3356,6 +3364,25 @@
|
|||
\def\sup{\ifmmode \expandafter\ptexsp \else \expandafter\finishsup\fi}
|
||||
\def\finishsup#1{$\ptexsp{\hbox{\switchtolllsize #1}}$}%
|
||||
|
||||
% provide this command from LaTeX as it is very common
|
||||
\def\frac#1#2{{{#1}\over{#2}}}
|
||||
|
||||
% @displaymath.
|
||||
% \globaldefs is needed to recognize the end lines in \tex and
|
||||
% \end tex. Set \thisenv as @end displaymath is seen before @end tex.
|
||||
{\obeylines
|
||||
\globaldefs=1
|
||||
\envdef\displaymath{%
|
||||
\tex
|
||||
\def\thisenv{\displaymath}%
|
||||
$$%
|
||||
}
|
||||
|
||||
\def\Edisplaymath{$$
|
||||
\def\thisenv{\tex}%
|
||||
\end tex
|
||||
}}
|
||||
|
||||
% @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}.
|
||||
% Ignore unless FMTNAME == tex; then it is like @iftex and @tex,
|
||||
% except specified as a normal braced arg, so no newlines to worry about.
|
||||
|
@ -7639,7 +7666,7 @@
|
|||
\endgroup
|
||||
%
|
||||
\envdef\verbatim{%
|
||||
\setupverbatim\doverbatim
|
||||
\setnormaldispenv\setupverbatim\doverbatim
|
||||
}
|
||||
\let\Everbatim = \afterenvbreak
|
||||
|
||||
|
@ -11459,6 +11486,18 @@
|
|||
\globaldefs = 0
|
||||
}}
|
||||
|
||||
\def\bsixpaper{{\globaldefs = 1
|
||||
\afourpaper
|
||||
\internalpagesizes{140mm}{100mm}%
|
||||
{-6.35mm}{-12.7mm}%
|
||||
{\bindingoffset}{14pt}%
|
||||
{176mm}{125mm}%
|
||||
\let\SETdispenvsize=\smallword
|
||||
\lispnarrowing = 0.2in
|
||||
\globaldefs = 0
|
||||
}}
|
||||
|
||||
|
||||
% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
|
||||
% Perhaps we should allow setting the margins, \topskip, \parskip,
|
||||
% and/or leading, also. Or perhaps we should compute them somehow.
|
||||
|
@ -11472,12 +11511,12 @@
|
|||
\setleading{\textleading}%
|
||||
%
|
||||
\dimen0 = #1\relax
|
||||
\advance\dimen0 by \voffset
|
||||
\advance\dimen0 by 1in % reference point for DVI is 1 inch from top of page
|
||||
\advance\dimen0 by 2.5in % default 1in margin above heading line
|
||||
% and 1.5in to include heading, footing and
|
||||
% bottom margin
|
||||
%
|
||||
\dimen2 = \hsize
|
||||
\advance\dimen2 by \normaloffset
|
||||
\advance\dimen2 by 1in % reference point is 1 inch from left edge of page
|
||||
\advance\dimen2 by 2in % default to 1 inch margin on each side
|
||||
%
|
||||
\internalpagesizes{#1}{\hsize}%
|
||||
{\voffset}{\normaloffset}%
|
||||
|
|
|
@ -558,8 +558,8 @@ of the local file name is the share exported by the remote host,
|
|||
@cindex method @option{davs}
|
||||
@cindex @option{dav} method
|
||||
@cindex @option{davs} method
|
||||
@cindex method @option{media}
|
||||
@cindex @option{media} method
|
||||
@cindex method @option{mtp}
|
||||
@cindex @option{mtp} method
|
||||
|
||||
On systems, which have installed @acronym{GVFS, the GNOME Virtual File
|
||||
System}, its offered methods could be used by @value{tramp}. Examples
|
||||
|
@ -567,7 +567,7 @@ are @file{@trampfn{sftp,user@@host,/path/to/file}},
|
|||
@file{@trampfn{afp,user@@host,/path/to/file}} (accessing Apple's AFP
|
||||
file system), @file{@trampfn{dav,user@@host,/path/to/file}},
|
||||
@file{@trampfn{davs,user@@host,/path/to/file}} (for WebDAV shares) and
|
||||
@file{@trampfn{media,device,/path/to/file}} (for media devices).
|
||||
@file{@trampfn{mtp,device,/path/to/file}} (for media devices).
|
||||
|
||||
|
||||
@anchor{Quick Start Guide: GNOME Online Accounts based methods}
|
||||
|
@ -1246,13 +1246,13 @@ Since Google Drive uses cryptic blob file names internally,
|
|||
could produce unexpected behavior in case two files in the same
|
||||
directory have the same @code{display-name}, such a situation must be avoided.
|
||||
|
||||
@item @option{media}
|
||||
@cindex method @option{media}
|
||||
@cindex @option{media} method
|
||||
@item @option{mtp}
|
||||
@cindex method @option{mtp}
|
||||
@cindex @option{mtp} method
|
||||
@cindex media
|
||||
|
||||
Media devices, like cell phones, tablets, cameras, can be accessed via
|
||||
the @option{media} method. Just the device name is needed in order to
|
||||
the @option{mtp} method. Just the device name is needed in order to
|
||||
specify the host in the file name. However, the device must already
|
||||
be connected via USB, before accessing it. Possible device names are
|
||||
visible via host name completion, @ref{File name completion}.
|
||||
|
@ -1263,7 +1263,7 @@ different parts of their file system.
|
|||
|
||||
@value{tramp} does not require a host name as part of the remote file
|
||||
name when a single media device is connected. @value{tramp} instead
|
||||
uses @file{@trampfn{media,,}} as the default name.
|
||||
uses @file{@trampfn{mtp,,}} as the default name.
|
||||
|
||||
@item @option{nextcloud}
|
||||
@cindex method @option{nextcloud}
|
||||
|
@ -1289,7 +1289,7 @@ that for security reasons refuse @command{ssh} connections.
|
|||
@defopt tramp-gvfs-methods
|
||||
This user option is a list of external methods for @acronym{GVFS}@.
|
||||
By default, this list includes @option{afp}, @option{dav},
|
||||
@option{davs}, @option{gdrive}, @option{media}, @option{nextcloud} and
|
||||
@option{davs}, @option{gdrive}, @option{mtp}, @option{nextcloud} and
|
||||
@option{sftp}. Other methods to include are @option{ftp},
|
||||
@option{http}, @option{https} and @option{smb}. These methods are not
|
||||
intended to be used directly as @acronym{GVFS}-based method. Instead,
|
||||
|
|
|
@ -52,7 +52,7 @@ pattern ::= regstring /* a tag pattern */
|
|||
|
||||
tagname ::= regchar regstring /* a tag name */
|
||||
|
||||
position ::= realposition | "," /* charpos,linepos */
|
||||
position ::= realposition | "," /* linepos,charpos */
|
||||
|
||||
realposition ::= "," unsint | unsint "," | unsint "," unsint
|
||||
|
||||
|
|
54
etc/NEWS
54
etc/NEWS
|
@ -114,6 +114,12 @@ choosing a group, or clicking a button in the "*Help*" buffers when
|
|||
looking at the doc string of a function that belongs to one of these
|
||||
groups.
|
||||
|
||||
---
|
||||
** Improved "find definition" feature of *Help* buffers.
|
||||
Now clicking on the link to find the definition of functions generated
|
||||
by 'cl-defstruct', or variables generated by 'define-derived-mode',
|
||||
for example, will go to the exact place where they are defined.
|
||||
|
||||
** New variable 'redisplay-skip-initial-frame' to enable batch redisplay tests.
|
||||
Setting it to nil forces the redisplay to do its job even in the
|
||||
initial frame used in batch mode.
|
||||
|
@ -383,6 +389,18 @@ value of 'tab-bar-show'.
|
|||
If your mouse or trackpad supports it, you can now scroll tabs when
|
||||
the mouse pointer is in the tab line by scrolling left or right.
|
||||
|
||||
---
|
||||
*** New tab-line faces and options.
|
||||
The face 'tab-line-tab-special' is used for tabs whose buffers are
|
||||
special, i.e. not file-backed. The face
|
||||
'tab-line-tab-inactive-alternate' is used to display inactive tabs
|
||||
with an alternating background color, making them easier to
|
||||
distinguish between, especially if the face 'tab-line-tab' is
|
||||
configured to not display with a box; this alternate face is only
|
||||
applied when the option 'tab-line-tab-face-functions' is
|
||||
so-configured. That option may also be used to customize tab-line
|
||||
faces in other ways.
|
||||
|
||||
** New bindings in occur-mode, 'next-error-no-select' bound to 'n' and
|
||||
'previous-error-no-select' bound to 'p'.
|
||||
|
||||
|
@ -878,7 +896,7 @@ preferred over the eudcb-mab.el backend.
|
|||
** Tramp
|
||||
|
||||
+++
|
||||
*** New connection method "media", which allows accessing media devices
|
||||
*** New connection method "mtp", which allows accessing media devices
|
||||
like cell phones, tablets or cameras.
|
||||
|
||||
+++
|
||||
|
@ -1452,10 +1470,23 @@ that makes it a valid button.
|
|||
|
||||
** Miscellaneous
|
||||
|
||||
+++
|
||||
*** New predicate functions 'length<', 'length>' and 'length='.
|
||||
Using these functions may be more efficient than using 'length' (if
|
||||
the length of a (long) list is being computed just to compare this
|
||||
length to a number).
|
||||
|
||||
---
|
||||
*** 'remove-hook' is now an interactive command.
|
||||
|
||||
---
|
||||
*** New user option 'authinfo-hide-elements'.
|
||||
This can be set to nil to inhibit hiding passwords in ".authinfo" files.
|
||||
|
||||
+++
|
||||
*** A number of new string manipulation functions have been added.
|
||||
'string-clean-whitespace', 'string-fill', 'string-limit',
|
||||
'string-lines', 'string-pad', 'string-chop-newline' and 'string-slice'.
|
||||
'string-lines', 'string-pad' and 'string-chop-newline'.
|
||||
|
||||
+++
|
||||
*** New variable 'current-minibuffer-command'.
|
||||
|
@ -1994,7 +2025,7 @@ used in.
|
|||
+++
|
||||
** 'truncate-string-ellipsis' now uses '…' by default.
|
||||
Modes that use 'truncate-string-to-width' with non-nil, non-string
|
||||
argument 'ellipsis', will now indicate truncation using '…' when
|
||||
argument ELLIPSIS, will now indicate truncation using '…' when
|
||||
the selected frame can display it, and using "..." otherwise.
|
||||
|
||||
+++
|
||||
|
@ -2031,7 +2062,7 @@ of its file argument.
|
|||
|
||||
+++
|
||||
** New utility function 'directory-empty-p'.
|
||||
This predicate tests whether a given filename is an accessible
|
||||
This predicate tests whether a given file name is an accessible
|
||||
directory and whether it contains no other directories or files.
|
||||
|
||||
+++
|
||||
|
@ -2206,7 +2237,7 @@ Until it is solved you could ignore such errors by performing
|
|||
+++
|
||||
** Buffers can now be created with certain hooks disabled.
|
||||
The functions 'get-buffer-create' and 'generate-new-buffer' accept a
|
||||
new optional argument 'inhibit-buffer-hooks'. If non-nil, the new
|
||||
new optional argument INHIBIT-BUFFER-HOOKS. If non-nil, the new
|
||||
buffer does not run the hooks 'kill-buffer-hook',
|
||||
'kill-buffer-query-functions', and 'buffer-list-update-hook'. This
|
||||
avoids slowing down internal or temporary buffers that are never
|
||||
|
@ -2216,9 +2247,18 @@ presented to users or passed on to other applications.
|
|||
** 'start-process-shell-command' and 'start-file-process-shell-command'
|
||||
do not support the old calling conventions any longer.
|
||||
|
||||
** Functions operating on local filenames now check that the filenames
|
||||
** Functions operating on local file names now check that the file names
|
||||
don't contain any NUL bytes. This avoids subtle bugs caused by
|
||||
silently using only the part of the filename until the first NUL byte.
|
||||
silently using only the part of the file name until the first NUL byte.
|
||||
|
||||
** New coding-systems for EBCDIC variants.
|
||||
New coding-systems 'ibm256', 'ibm273', 'ibm274', 'ibm277', 'ibm278',
|
||||
'ibm280', 'ibm281', 'ibm284', 'ibm285', 'ibm290', 'ibm297'. These are
|
||||
variants of the EBCDIC encoding tailored to some European and Japanese
|
||||
locales. They are also available as aliases 'ebcdic-cp-*' (e.g.,
|
||||
'ebcdic-cp-fi' for the Finnish variant 'ibm278'), and 'cp2xx' (e.g.,
|
||||
'cp278' for 'ibm278'). There are also new charsets 'ibm2xx' to
|
||||
support these coding-systems.
|
||||
|
||||
|
||||
* Changes in Emacs 28.1 on Non-Free Operating Systems
|
||||
|
|
30
etc/TODO
30
etc/TODO
|
@ -242,6 +242,36 @@ https://lists.gnu.org/r/emacs-devel/2013-11/msg00515.html
|
|||
processing. That is why we added text properties and variable
|
||||
width fonts. However, more features are still needed to achieve this.
|
||||
|
||||
Specifically, a major mode with the following features and abilities
|
||||
should be added to Emacs:
|
||||
|
||||
. import / export MS Office documents
|
||||
. import / export Open Document Format (.odt) files
|
||||
. import / export RTF files
|
||||
. export to a PDF file
|
||||
. select a font and its size
|
||||
. apply a bold / italic / underline / strikethrough effect
|
||||
. superscripts / subscripts
|
||||
. apply a left / center / right / justified effect
|
||||
. change the font color and the background color
|
||||
. pixel-level text fill, justification, and indentation (so that
|
||||
variable-pitch fonts could be freely used)
|
||||
. create a list
|
||||
. insert and change a table
|
||||
. insert a picture
|
||||
. define / use / modify styles
|
||||
. print preview / print, in a way that is similar to what's on screen
|
||||
(e.g., wrt the place where lines wrap)
|
||||
. use footnotes
|
||||
. support for "track changes" markings, including those which come
|
||||
from Office documents
|
||||
. multiple columns
|
||||
. change page headers and footers
|
||||
. save all the properties and settings mentioned above with the text
|
||||
to a file, so that they are restored when later visiting that file
|
||||
|
||||
The existing Enriched mode can be used as a starting point.
|
||||
|
||||
** Support ligatures out of the box
|
||||
For the list of frequently-used typographical ligatures, see
|
||||
|
||||
|
|
|
@ -251,7 +251,6 @@ get_current_dir_name (void)
|
|||
bufsize_max = min (bufsize_max, PATH_MAX);
|
||||
#endif
|
||||
|
||||
char *buf;
|
||||
struct stat dotstat, pwdstat;
|
||||
size_t pwdlen;
|
||||
/* If PWD is accurate, use it instead of calling getcwd. PWD is
|
||||
|
@ -265,37 +264,23 @@ get_current_dir_name (void)
|
|||
&& stat (".", &dotstat) == 0
|
||||
&& dotstat.st_ino == pwdstat.st_ino
|
||||
&& dotstat.st_dev == pwdstat.st_dev)
|
||||
{
|
||||
buf = xmalloc (strlen (pwd) + 1);
|
||||
strcpy (buf, pwd);
|
||||
}
|
||||
return strdup (pwd);
|
||||
else
|
||||
{
|
||||
size_t buf_size = 1024;
|
||||
ptrdiff_t buf_size = min (bufsize_max, 1024);
|
||||
for (;;)
|
||||
{
|
||||
int tmp_errno;
|
||||
buf = malloc (buf_size);
|
||||
if (! buf)
|
||||
break;
|
||||
if (getcwd (buf, buf_size) == buf)
|
||||
break;
|
||||
tmp_errno = errno;
|
||||
{
|
||||
char *buf = malloc (buf_size);
|
||||
if (!buf)
|
||||
return NULL;
|
||||
if (getcwd (buf, buf_size) == buf)
|
||||
return buf;
|
||||
free (buf);
|
||||
if (tmp_errno != ERANGE)
|
||||
{
|
||||
errno = tmp_errno;
|
||||
return NULL;
|
||||
}
|
||||
buf_size *= 2;
|
||||
if (! buf_size)
|
||||
{
|
||||
errno = ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
if (errno != ERANGE || buf_size == bufsize_max)
|
||||
return NULL;
|
||||
buf_size = buf_size <= bufsize_max / 2 ? 2 * buf_size : bufsize_max;
|
||||
}
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -1643,19 +1643,10 @@ process_file_name (char *file, language *lang)
|
|||
char *cmd = concat (cmd1, "' > ", tmp_name);
|
||||
#endif
|
||||
free (cmd1);
|
||||
int tmp_errno;
|
||||
if (system (cmd) == -1)
|
||||
{
|
||||
inf = NULL;
|
||||
tmp_errno = EINVAL;
|
||||
}
|
||||
else
|
||||
{
|
||||
inf = fopen (tmp_name, "r" FOPEN_BINARY);
|
||||
tmp_errno = errno;
|
||||
}
|
||||
inf = (system (cmd) == -1
|
||||
? NULL
|
||||
: fopen (tmp_name, "r" FOPEN_BINARY));
|
||||
free (cmd);
|
||||
errno = tmp_errno;
|
||||
}
|
||||
|
||||
if (!inf)
|
||||
|
@ -7068,9 +7059,7 @@ etags_mktmp (void)
|
|||
int fd = mkostemp (templt, O_CLOEXEC);
|
||||
if (fd < 0 || close (fd) != 0)
|
||||
{
|
||||
int temp_errno = errno;
|
||||
free (templt);
|
||||
errno = temp_errno;
|
||||
templt = NULL;
|
||||
}
|
||||
#if defined (DOS_NT)
|
||||
|
|
|
@ -499,9 +499,9 @@ unlock_file (const char *filename, void *state)
|
|||
char *lockpath = (char *) state;
|
||||
int saved_errno = errno;
|
||||
int ret = unlink (lockpath);
|
||||
int unlink_errno = errno;
|
||||
if (0 <= ret)
|
||||
errno = saved_errno;
|
||||
free (lockpath);
|
||||
errno = ret < 0 ? unlink_errno : saved_errno;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -98,7 +98,7 @@ libegnu_a_OBJECTS = $(patsubst %.o,e-%.o,$(for_emacs_OBJECTS))
|
|||
$(libegnu_a_OBJECTS) $(libgnu_a_OBJECTS): $(BUILT_SOURCES)
|
||||
|
||||
.c.o:
|
||||
$(AM_V_CC)$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $<
|
||||
$(AM_V_CC)$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -o $@ $<
|
||||
e-%.o: %.c
|
||||
$(AM_V_CC)$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -Demacs -o $@ $<
|
||||
|
||||
|
@ -124,7 +124,7 @@ TAGS: $(ETAGS) $(tagsfiles)
|
|||
.PHONY: $(ETAGS) tags
|
||||
|
||||
clean:
|
||||
rm -f ./*.[ao] ./*-t \#* $(DEPDIR)/*
|
||||
rm -f ./*.[ao] ./*/*.o ./*-t \#* $(DEPDIR)/*.d $(DEPDIR)/*/*.d
|
||||
mostlyclean: clean
|
||||
rm -f $(filter-out %-t,$(MOSTLYCLEANFILES))
|
||||
distclean bootstrap-clean: mostlyclean
|
||||
|
@ -133,7 +133,7 @@ distclean bootstrap-clean: mostlyclean
|
|||
maintainer-clean: distclean
|
||||
rm -f TAGS gnulib.mk
|
||||
extraclean: distclean
|
||||
-rmdir sys 2>/dev/null
|
||||
-rmdir malloc sys 2>/dev/null
|
||||
|
||||
.PHONY: mostlyclean clean distclean bootstrap-clean maintainer-clean
|
||||
|
||||
|
|
|
@ -80,7 +80,7 @@
|
|||
/* Attributes for variadic functions. */
|
||||
|
||||
/* The variadic function expects a trailing NULL argument.
|
||||
ATTRIBUTE_SENTINEL () - The last argument is NULL.
|
||||
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)
|
||||
|
@ -170,19 +170,22 @@
|
|||
/* Applies to: function. */
|
||||
#define ATTRIBUTE_ALWAYS_INLINE _GL_ATTRIBUTE_ALWAYS_INLINE
|
||||
|
||||
/* The function does not affect observable state, and always returns a value.
|
||||
Compilers can omit duplicate calls with the same arguments if
|
||||
observable state is not changed between calls. (This attribute is
|
||||
looser than ATTRIBUTE_CONST.) */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_PURE _GL_ATTRIBUTE_PURE
|
||||
|
||||
/* The function neither depends on nor affects observable state,
|
||||
and always returns a value. Compilers can omit duplicate calls with
|
||||
the same arguments. (This attribute is stricter than ATTRIBUTE_PURE.) */
|
||||
/* 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
|
||||
|
|
|
@ -181,6 +181,14 @@
|
|||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||
#endif
|
||||
|
||||
/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
|
||||
is like _GL_CXXALIAS_MDA (func, rettype, parameters);
|
||||
except that the C function func may have a slightly different declaration.
|
||||
A cast is used to silence the "invalid conversion" error that would
|
||||
otherwise occur. */
|
||||
#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
|
||||
_GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
|
||||
|
||||
/* _GL_CXXALIAS_SYS (func, rettype, parameters);
|
||||
declares a C++ alias called GNULIB_NAMESPACE::func
|
||||
that redirects to the system provided function func, if GNULIB_NAMESPACE
|
||||
|
|
|
@ -2,18 +2,19 @@
|
|||
Copyright (C) 1996-2020 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU 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,
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public
|
||||
License along with 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
|
||||
|
@ -21,37 +22,41 @@
|
|||
# define _GL_ARG_NONNULL(params)
|
||||
|
||||
# define _GL_USE_STDLIB_ALLOC 1
|
||||
# include <config.h>
|
||||
# include <libc-config.h>
|
||||
#endif
|
||||
|
||||
#if !HAVE_CANONICALIZE_FILE_NAME || !FUNC_REALPATH_WORKS || defined _LIBC
|
||||
|
||||
/* Specification. */
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <alloca.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <limits.h>
|
||||
#if HAVE_SYS_PARAM_H || defined _LIBC
|
||||
# include <sys/param.h>
|
||||
#endif
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <limits.h>
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <eloop-threshold.h>
|
||||
#include <filename.h>
|
||||
#include <idx.h>
|
||||
#include <scratch_buffer.h>
|
||||
|
||||
#ifdef _LIBC
|
||||
# include <shlib-compat.h>
|
||||
# include <sysdep.h>
|
||||
# ifdef __ASSUME_FACCESSAT2
|
||||
# define FACCESSAT_NEVER_EOVERFLOWS __ASSUME_FACCESSAT2
|
||||
# else
|
||||
# define FACCESSAT_NEVER_EOVERFLOWS true
|
||||
# endif
|
||||
# define GCC_LINT 1
|
||||
# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
|
||||
#else
|
||||
# define SHLIB_COMPAT(lib, introduced, obsoleted) 0
|
||||
# define versioned_symbol(lib, local, symbol, version) extern int dummy
|
||||
# define compat_symbol(lib, local, symbol, version)
|
||||
# define weak_alias(local, symbol)
|
||||
# define __canonicalize_file_name canonicalize_file_name
|
||||
# define __realpath realpath
|
||||
# include "pathmax.h"
|
||||
# include "malloca.h"
|
||||
# include "filename.h"
|
||||
# define __faccessat faccessat
|
||||
# if defined _WIN32 && !defined __CYGWIN__
|
||||
# define __getcwd _getcwd
|
||||
# elif HAVE_GETCWD
|
||||
|
@ -72,57 +77,143 @@
|
|||
# else
|
||||
# define __getcwd(buf, max) getwd (buf)
|
||||
# endif
|
||||
# define __mempcpy mempcpy
|
||||
# define __pathconf pathconf
|
||||
# define __rawmemchr rawmemchr
|
||||
# define __readlink readlink
|
||||
# define __set_errno(e) errno = (e)
|
||||
# ifndef MAXSYMLINKS
|
||||
# ifdef SYMLOOP_MAX
|
||||
# define MAXSYMLINKS SYMLOOP_MAX
|
||||
# else
|
||||
# define MAXSYMLINKS 20
|
||||
# endif
|
||||
# endif
|
||||
# define __stat stat
|
||||
#endif
|
||||
|
||||
/* Suppress bogus GCC -Wmaybe-uninitialized warnings. */
|
||||
#if defined GCC_LINT || defined lint
|
||||
# define IF_LINT(Code) Code
|
||||
#else
|
||||
# define IF_LINT(Code) /* empty */
|
||||
#endif
|
||||
|
||||
#ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
|
||||
# define DOUBLE_SLASH_IS_DISTINCT_ROOT 0
|
||||
# define DOUBLE_SLASH_IS_DISTINCT_ROOT false
|
||||
#endif
|
||||
|
||||
/* Define this independently so that stdint.h is not a prerequisite. */
|
||||
#ifndef SIZE_MAX
|
||||
# define SIZE_MAX ((size_t) -1)
|
||||
#ifndef FACCESSAT_NEVER_EOVERFLOWS
|
||||
# define FACCESSAT_NEVER_EOVERFLOWS false
|
||||
#endif
|
||||
|
||||
#if !FUNC_REALPATH_WORKS || defined _LIBC
|
||||
|
||||
static void
|
||||
alloc_failed (void)
|
||||
/* Return true if FILE's existence can be shown, false (setting errno)
|
||||
otherwise. Follow symbolic links. */
|
||||
static bool
|
||||
file_accessible (char const *file)
|
||||
{
|
||||
#if defined _WIN32 && ! defined __CYGWIN__
|
||||
/* Avoid errno problem without using the malloc or realloc modules; see:
|
||||
https://lists.gnu.org/r/bug-gnulib/2016-08/msg00025.html */
|
||||
errno = ENOMEM;
|
||||
#endif
|
||||
# if defined _LIBC || HAVE_FACCESSAT
|
||||
int r = __faccessat (AT_FDCWD, file, F_OK, AT_EACCESS);
|
||||
# else
|
||||
struct stat st;
|
||||
int r = __stat (file, &st);
|
||||
# endif
|
||||
|
||||
return ((!FACCESSAT_NEVER_EOVERFLOWS && r < 0 && errno == EOVERFLOW)
|
||||
|| r == 0);
|
||||
}
|
||||
|
||||
/* Return the canonical absolute name of file NAME. A canonical name
|
||||
does not contain any ".", ".." components nor any repeated path
|
||||
separators ('/') or symlinks. All path components must exist. If
|
||||
RESOLVED is null, the result is malloc'd; otherwise, if the
|
||||
canonical name is PATH_MAX chars or more, returns null with 'errno'
|
||||
set to ENAMETOOLONG; if the name fits in fewer than PATH_MAX chars,
|
||||
returns the name in RESOLVED. If the name cannot be resolved and
|
||||
RESOLVED is non-NULL, it contains the path of the first component
|
||||
that cannot be resolved. If the path can be resolved, RESOLVED
|
||||
holds the same value as the value returned. */
|
||||
/* True if concatenating END as a suffix to a file name means that the
|
||||
code needs to check that the file name is that of a searchable
|
||||
directory, since the canonicalize_filename_mode_stk code won't
|
||||
check this later anyway when it checks an ordinary file name
|
||||
component within END. END must either be empty, or start with a
|
||||
slash. */
|
||||
|
||||
char *
|
||||
__realpath (const char *name, char *resolved)
|
||||
static bool _GL_ATTRIBUTE_PURE
|
||||
suffix_requires_dir_check (char const *end)
|
||||
{
|
||||
char *rpath, *dest, *extra_buf = NULL;
|
||||
const char *start, *end, *rpath_limit;
|
||||
long int path_max;
|
||||
/* If END does not start with a slash, the suffix is OK. */
|
||||
while (ISSLASH (*end))
|
||||
{
|
||||
/* Two or more slashes act like a single slash. */
|
||||
do
|
||||
end++;
|
||||
while (ISSLASH (*end));
|
||||
|
||||
switch (*end++)
|
||||
{
|
||||
default: return false; /* An ordinary file name component is OK. */
|
||||
case '\0': return true; /* Trailing "/" is trouble. */
|
||||
case '.': break; /* Possibly "." or "..". */
|
||||
}
|
||||
/* Trailing "/.", or "/.." even if not trailing, is trouble. */
|
||||
if (!*end || (*end == '.' && (!end[1] || ISSLASH (end[1]))))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Append this to a file name to test whether it is a searchable directory.
|
||||
On POSIX platforms "/" suffices, but "/./" is sometimes needed on
|
||||
macOS 10.13 <https://bugs.gnu.org/30350>, and should also work on
|
||||
platforms like AIX 7.2 that need at least "/.". */
|
||||
|
||||
#if defined _LIBC || defined LSTAT_FOLLOWS_SLASHED_SYMLINK
|
||||
static char const dir_suffix[] = "/";
|
||||
#else
|
||||
static char const dir_suffix[] = "/./";
|
||||
#endif
|
||||
|
||||
/* Return true if DIR is a searchable dir, false (setting errno) otherwise.
|
||||
DIREND points to the NUL byte at the end of the DIR string.
|
||||
Store garbage into DIREND[0 .. strlen (dir_suffix)]. */
|
||||
|
||||
static bool
|
||||
dir_check (char *dir, char *dirend)
|
||||
{
|
||||
strcpy (dirend, dir_suffix);
|
||||
return file_accessible (dir);
|
||||
}
|
||||
|
||||
static idx_t
|
||||
get_path_max (void)
|
||||
{
|
||||
# ifdef PATH_MAX
|
||||
long int path_max = PATH_MAX;
|
||||
# else
|
||||
/* The caller invoked realpath with a null RESOLVED, even though
|
||||
PATH_MAX is not defined as a constant. The glibc manual says
|
||||
programs should not do this, and POSIX says the behavior is undefined.
|
||||
Historically, glibc here used the result of pathconf, or 1024 if that
|
||||
failed; stay consistent with this (dubious) historical practice. */
|
||||
int err = errno;
|
||||
long int path_max = __pathconf ("/", _PC_PATH_MAX);
|
||||
__set_errno (err);
|
||||
# endif
|
||||
return path_max < 0 ? 1024 : path_max <= IDX_MAX ? path_max : IDX_MAX;
|
||||
}
|
||||
|
||||
/* Act like __realpath (see below), with an additional argument
|
||||
rname_buf that can be used as temporary storage.
|
||||
|
||||
If GCC_LINT is defined, do not inline this function with GCC 10.1
|
||||
and later, to avoid creating a pointer to the stack that GCC
|
||||
-Wreturn-local-addr incorrectly complains about. See:
|
||||
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93644
|
||||
Although the noinline attribute can hurt performance a bit, no better way
|
||||
to pacify GCC is known; even an explicit #pragma does not pacify GCC.
|
||||
When the GCC bug is fixed this workaround should be limited to the
|
||||
broken GCC versions. */
|
||||
#if __GNUC_PREREQ (10, 1)
|
||||
# if defined GCC_LINT || defined lint
|
||||
__attribute__ ((__noinline__))
|
||||
# elif __OPTIMIZE__ && !__NO_INLINE__
|
||||
# define GCC_BOGUS_WRETURN_LOCAL_ADDR
|
||||
# endif
|
||||
#endif
|
||||
static char *
|
||||
realpath_stk (const char *name, char *resolved,
|
||||
struct scratch_buffer *rname_buf)
|
||||
{
|
||||
char *dest;
|
||||
char const *start;
|
||||
char const *end;
|
||||
int num_links = 0;
|
||||
size_t prefix_len;
|
||||
|
||||
if (name == NULL)
|
||||
{
|
||||
|
@ -142,205 +233,143 @@ __realpath (const char *name, char *resolved)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
#ifdef PATH_MAX
|
||||
path_max = PATH_MAX;
|
||||
#else
|
||||
path_max = pathconf (name, _PC_PATH_MAX);
|
||||
if (path_max <= 0)
|
||||
path_max = 8192;
|
||||
#endif
|
||||
|
||||
if (resolved == NULL)
|
||||
{
|
||||
rpath = malloc (path_max);
|
||||
if (rpath == NULL)
|
||||
{
|
||||
alloc_failed ();
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
rpath = resolved;
|
||||
rpath_limit = rpath + path_max;
|
||||
struct scratch_buffer extra_buffer, link_buffer;
|
||||
scratch_buffer_init (&extra_buffer);
|
||||
scratch_buffer_init (&link_buffer);
|
||||
scratch_buffer_init (rname_buf);
|
||||
char *rname_on_stack = rname_buf->data;
|
||||
char *rname = rname_on_stack;
|
||||
bool end_in_extra_buffer = false;
|
||||
bool failed = true;
|
||||
|
||||
/* This is always zero for Posix hosts, but can be 2 for MS-Windows
|
||||
and MS-DOS X:/foo/bar file names. */
|
||||
prefix_len = FILE_SYSTEM_PREFIX_LEN (name);
|
||||
idx_t prefix_len = FILE_SYSTEM_PREFIX_LEN (name);
|
||||
|
||||
if (!IS_ABSOLUTE_FILE_NAME (name))
|
||||
{
|
||||
if (!__getcwd (rpath, path_max))
|
||||
while (!__getcwd (rname, rname_buf->length))
|
||||
{
|
||||
rpath[0] = '\0';
|
||||
goto error;
|
||||
if (errno != ERANGE)
|
||||
{
|
||||
dest = rname;
|
||||
goto error;
|
||||
}
|
||||
if (!scratch_buffer_grow (rname_buf))
|
||||
goto error_nomem;
|
||||
rname = rname_buf->data;
|
||||
}
|
||||
dest = strchr (rpath, '\0');
|
||||
dest = __rawmemchr (rname, '\0');
|
||||
start = name;
|
||||
prefix_len = FILE_SYSTEM_PREFIX_LEN (rpath);
|
||||
prefix_len = FILE_SYSTEM_PREFIX_LEN (rname);
|
||||
}
|
||||
else
|
||||
{
|
||||
dest = rpath;
|
||||
if (prefix_len)
|
||||
{
|
||||
memcpy (rpath, name, prefix_len);
|
||||
dest += prefix_len;
|
||||
}
|
||||
dest = __mempcpy (rname, name, prefix_len);
|
||||
*dest++ = '/';
|
||||
if (DOUBLE_SLASH_IS_DISTINCT_ROOT)
|
||||
{
|
||||
if (ISSLASH (name[1]) && !ISSLASH (name[2]) && !prefix_len)
|
||||
if (prefix_len == 0 /* implies ISSLASH (name[0]) */
|
||||
&& ISSLASH (name[1]) && !ISSLASH (name[2]))
|
||||
*dest++ = '/';
|
||||
*dest = '\0';
|
||||
}
|
||||
start = name + prefix_len;
|
||||
}
|
||||
|
||||
for (end = start; *start; start = end)
|
||||
for ( ; *start; start = end)
|
||||
{
|
||||
#ifdef _LIBC
|
||||
struct stat64 st;
|
||||
#else
|
||||
struct stat st;
|
||||
#endif
|
||||
|
||||
/* Skip sequence of multiple path-separators. */
|
||||
/* Skip sequence of multiple file name separators. */
|
||||
while (ISSLASH (*start))
|
||||
++start;
|
||||
|
||||
/* Find end of path component. */
|
||||
/* Find end of component. */
|
||||
for (end = start; *end && !ISSLASH (*end); ++end)
|
||||
/* Nothing. */;
|
||||
|
||||
if (end - start == 0)
|
||||
/* Length of this file name component; it can be zero if a file
|
||||
name ends in '/'. */
|
||||
idx_t startlen = end - start;
|
||||
|
||||
if (startlen == 0)
|
||||
break;
|
||||
else if (end - start == 1 && start[0] == '.')
|
||||
else if (startlen == 1 && start[0] == '.')
|
||||
/* nothing */;
|
||||
else if (end - start == 2 && start[0] == '.' && start[1] == '.')
|
||||
else if (startlen == 2 && start[0] == '.' && start[1] == '.')
|
||||
{
|
||||
/* Back up to previous component, ignore if at root already. */
|
||||
if (dest > rpath + prefix_len + 1)
|
||||
for (--dest; dest > rpath && !ISSLASH (dest[-1]); --dest)
|
||||
if (dest > rname + prefix_len + 1)
|
||||
for (--dest; dest > rname && !ISSLASH (dest[-1]); --dest)
|
||||
continue;
|
||||
if (DOUBLE_SLASH_IS_DISTINCT_ROOT
|
||||
&& dest == rpath + 1 && !prefix_len
|
||||
&& dest == rname + 1 && !prefix_len
|
||||
&& ISSLASH (*dest) && !ISSLASH (dest[1]))
|
||||
dest++;
|
||||
}
|
||||
else
|
||||
{
|
||||
size_t new_size;
|
||||
|
||||
if (!ISSLASH (dest[-1]))
|
||||
*dest++ = '/';
|
||||
|
||||
if (dest + (end - start) >= rpath_limit)
|
||||
while (rname + rname_buf->length - dest
|
||||
< startlen + sizeof dir_suffix)
|
||||
{
|
||||
ptrdiff_t dest_offset = dest - rpath;
|
||||
char *new_rpath;
|
||||
|
||||
if (resolved)
|
||||
{
|
||||
__set_errno (ENAMETOOLONG);
|
||||
if (dest > rpath + prefix_len + 1)
|
||||
dest--;
|
||||
*dest = '\0';
|
||||
goto error;
|
||||
}
|
||||
new_size = rpath_limit - rpath;
|
||||
if (end - start + 1 > path_max)
|
||||
new_size += end - start + 1;
|
||||
else
|
||||
new_size += path_max;
|
||||
new_rpath = (char *) realloc (rpath, new_size);
|
||||
if (new_rpath == NULL)
|
||||
{
|
||||
alloc_failed ();
|
||||
goto error;
|
||||
}
|
||||
rpath = new_rpath;
|
||||
rpath_limit = rpath + new_size;
|
||||
|
||||
dest = rpath + dest_offset;
|
||||
idx_t dest_offset = dest - rname;
|
||||
if (!scratch_buffer_grow_preserve (rname_buf))
|
||||
goto error_nomem;
|
||||
rname = rname_buf->data;
|
||||
dest = rname + dest_offset;
|
||||
}
|
||||
|
||||
#ifdef _LIBC
|
||||
dest = __mempcpy (dest, start, end - start);
|
||||
#else
|
||||
memcpy (dest, start, end - start);
|
||||
dest += end - start;
|
||||
#endif
|
||||
dest = __mempcpy (dest, start, startlen);
|
||||
*dest = '\0';
|
||||
|
||||
/* FIXME: if lstat fails with errno == EOVERFLOW,
|
||||
the entry exists. */
|
||||
#ifdef _LIBC
|
||||
if (__lxstat64 (_STAT_VER, rpath, &st) < 0)
|
||||
#else
|
||||
if (lstat (rpath, &st) < 0)
|
||||
#endif
|
||||
goto error;
|
||||
|
||||
if (S_ISLNK (st.st_mode))
|
||||
char *buf;
|
||||
ssize_t n;
|
||||
while (true)
|
||||
{
|
||||
char *buf;
|
||||
size_t len;
|
||||
ssize_t n;
|
||||
|
||||
if (++num_links > MAXSYMLINKS)
|
||||
buf = link_buffer.data;
|
||||
idx_t bufsize = link_buffer.length;
|
||||
n = __readlink (rname, buf, bufsize - 1);
|
||||
if (n < bufsize - 1)
|
||||
break;
|
||||
if (!scratch_buffer_grow (&link_buffer))
|
||||
goto error_nomem;
|
||||
}
|
||||
if (0 <= n)
|
||||
{
|
||||
if (++num_links > __eloop_threshold ())
|
||||
{
|
||||
__set_errno (ELOOP);
|
||||
goto error;
|
||||
}
|
||||
|
||||
buf = malloca (path_max);
|
||||
if (!buf)
|
||||
{
|
||||
__set_errno (ENOMEM);
|
||||
goto error;
|
||||
}
|
||||
|
||||
n = __readlink (rpath, buf, path_max - 1);
|
||||
if (n < 0)
|
||||
{
|
||||
int saved_errno = errno;
|
||||
freea (buf);
|
||||
__set_errno (saved_errno);
|
||||
goto error;
|
||||
}
|
||||
buf[n] = '\0';
|
||||
|
||||
if (!extra_buf)
|
||||
char *extra_buf = extra_buffer.data;
|
||||
idx_t end_idx IF_LINT (= 0);
|
||||
if (end_in_extra_buffer)
|
||||
end_idx = end - extra_buf;
|
||||
idx_t len = strlen (end);
|
||||
while (extra_buffer.length <= len + n)
|
||||
{
|
||||
extra_buf = malloca (path_max);
|
||||
if (!extra_buf)
|
||||
{
|
||||
freea (buf);
|
||||
__set_errno (ENOMEM);
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
len = strlen (end);
|
||||
/* Check that n + len + 1 doesn't overflow and is <= path_max. */
|
||||
if (n >= SIZE_MAX - len || n + len >= path_max)
|
||||
{
|
||||
freea (buf);
|
||||
__set_errno (ENAMETOOLONG);
|
||||
goto error;
|
||||
if (!scratch_buffer_grow_preserve (&extra_buffer))
|
||||
goto error_nomem;
|
||||
extra_buf = extra_buffer.data;
|
||||
}
|
||||
if (end_in_extra_buffer)
|
||||
end = extra_buf + end_idx;
|
||||
|
||||
/* Careful here, end may be a pointer into extra_buf... */
|
||||
memmove (&extra_buf[n], end, len + 1);
|
||||
name = end = memcpy (extra_buf, buf, n);
|
||||
end_in_extra_buffer = true;
|
||||
|
||||
if (IS_ABSOLUTE_FILE_NAME (buf))
|
||||
{
|
||||
size_t pfxlen = FILE_SYSTEM_PREFIX_LEN (buf);
|
||||
idx_t pfxlen = FILE_SYSTEM_PREFIX_LEN (buf);
|
||||
|
||||
if (pfxlen)
|
||||
memcpy (rpath, buf, pfxlen);
|
||||
dest = rpath + pfxlen;
|
||||
dest = __mempcpy (rname, buf, pfxlen);
|
||||
*dest++ = '/'; /* It's an absolute symlink */
|
||||
if (DOUBLE_SLASH_IS_DISTINCT_ROOT)
|
||||
{
|
||||
|
@ -355,44 +384,77 @@ __realpath (const char *name, char *resolved)
|
|||
{
|
||||
/* Back up to previous component, ignore if at root
|
||||
already: */
|
||||
if (dest > rpath + prefix_len + 1)
|
||||
for (--dest; dest > rpath && !ISSLASH (dest[-1]); --dest)
|
||||
if (dest > rname + prefix_len + 1)
|
||||
for (--dest; dest > rname && !ISSLASH (dest[-1]); --dest)
|
||||
continue;
|
||||
if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rpath + 1
|
||||
if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rname + 1
|
||||
&& ISSLASH (*dest) && !ISSLASH (dest[1]) && !prefix_len)
|
||||
dest++;
|
||||
}
|
||||
}
|
||||
else if (!S_ISDIR (st.st_mode) && *end != '\0')
|
||||
{
|
||||
__set_errno (ENOTDIR);
|
||||
goto error;
|
||||
}
|
||||
else if (! (suffix_requires_dir_check (end)
|
||||
? dir_check (rname, dest)
|
||||
: errno == EINVAL))
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
if (dest > rpath + prefix_len + 1 && ISSLASH (dest[-1]))
|
||||
if (dest > rname + prefix_len + 1 && ISSLASH (dest[-1]))
|
||||
--dest;
|
||||
if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rpath + 1 && !prefix_len
|
||||
if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rname + 1 && !prefix_len
|
||||
&& ISSLASH (*dest) && !ISSLASH (dest[1]))
|
||||
dest++;
|
||||
*dest = '\0';
|
||||
|
||||
if (extra_buf)
|
||||
freea (extra_buf);
|
||||
|
||||
return rpath;
|
||||
failed = false;
|
||||
|
||||
error:
|
||||
{
|
||||
int saved_errno = errno;
|
||||
if (extra_buf)
|
||||
freea (extra_buf);
|
||||
if (resolved == NULL)
|
||||
free (rpath);
|
||||
__set_errno (saved_errno);
|
||||
}
|
||||
return NULL;
|
||||
*dest++ = '\0';
|
||||
if (resolved != NULL && dest - rname <= get_path_max ())
|
||||
rname = strcpy (resolved, rname);
|
||||
|
||||
error_nomem:
|
||||
scratch_buffer_free (&extra_buffer);
|
||||
scratch_buffer_free (&link_buffer);
|
||||
if (failed || rname == resolved)
|
||||
scratch_buffer_free (rname_buf);
|
||||
|
||||
if (failed)
|
||||
return NULL;
|
||||
|
||||
if (rname == resolved)
|
||||
return rname;
|
||||
idx_t rname_size = dest - rname;
|
||||
if (rname == rname_on_stack)
|
||||
{
|
||||
rname = malloc (rname_size);
|
||||
if (rname == NULL)
|
||||
return NULL;
|
||||
return memcpy (rname, rname_on_stack, rname_size);
|
||||
}
|
||||
char *result = realloc (rname, rname_size);
|
||||
return result != NULL ? result : rname;
|
||||
}
|
||||
|
||||
/* Return the canonical absolute name of file NAME. A canonical name
|
||||
does not contain any ".", ".." components nor any repeated file name
|
||||
separators ('/') or symlinks. All file name components must exist. If
|
||||
RESOLVED is null, the result is malloc'd; otherwise, if the
|
||||
canonical name is PATH_MAX chars or more, returns null with 'errno'
|
||||
set to ENAMETOOLONG; if the name fits in fewer than PATH_MAX chars,
|
||||
returns the name in RESOLVED. If the name cannot be resolved and
|
||||
RESOLVED is non-NULL, it contains the name of the first component
|
||||
that cannot be resolved. If the name can be resolved, RESOLVED
|
||||
holds the same value as the value returned. */
|
||||
|
||||
char *
|
||||
__realpath (const char *name, char *resolved)
|
||||
{
|
||||
#ifdef GCC_BOGUS_WRETURN_LOCAL_ADDR
|
||||
#warning "GCC might issue a bogus -Wreturn-local-addr warning here."
|
||||
#warning "See <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93644>."
|
||||
#endif
|
||||
struct scratch_buffer rname_buffer;
|
||||
return realpath_stk (name, resolved, &rname_buffer);
|
||||
}
|
||||
libc_hidden_def (__realpath)
|
||||
versioned_symbol (libc, __realpath, realpath, GLIBC_2_3);
|
||||
#endif /* !FUNC_REALPATH_WORKS || defined _LIBC */
|
||||
|
||||
|
@ -420,11 +482,3 @@ __canonicalize_file_name (const char *name)
|
|||
return __realpath (name, NULL);
|
||||
}
|
||||
weak_alias (__canonicalize_file_name, canonicalize_file_name)
|
||||
|
||||
#else
|
||||
|
||||
/* This declaration is solely to ensure that after preprocessing
|
||||
this file is never empty. */
|
||||
typedef int dummy;
|
||||
|
||||
#endif
|
||||
|
|
|
@ -51,8 +51,12 @@ enum { STACK_BUF_SIZE = 1024 };
|
|||
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 (defined GCC_LINT || defined lint) && _GL_GNUC_PREREQ (10, 1)
|
||||
#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,
|
||||
|
@ -85,18 +89,13 @@ readlink_stk (int fd, char const *filename,
|
|||
size_t link_size;
|
||||
if (link_length < 0)
|
||||
{
|
||||
/* On AIX 5L v5.3 and HP-UX 11i v2 04/09, readlink returns -1
|
||||
with errno == ERANGE if the buffer is too small. */
|
||||
int readlinkat_errno = errno;
|
||||
if (readlinkat_errno != ERANGE)
|
||||
if (buf != buffer)
|
||||
{
|
||||
if (buf != buffer)
|
||||
{
|
||||
alloc->free (buf);
|
||||
errno = readlinkat_errno;
|
||||
}
|
||||
return NULL;
|
||||
int readlinkat_errno = errno;
|
||||
alloc->free (buf);
|
||||
errno = readlinkat_errno;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
link_size = link_length;
|
||||
|
@ -180,10 +179,11 @@ careadlinkat (int fd, char const *filename,
|
|||
/* 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.
|
||||
|
||||
If GCC -Wreturn-local-addr warns about this buffer, the warning
|
||||
is bogus; see readlink_stk. */
|
||||
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);
|
||||
|
|
|
@ -75,11 +75,11 @@
|
|||
|
||||
/* GCC can always grok prototypes. For C++ programs we add throw()
|
||||
to help it optimize the function calls. But this works only with
|
||||
gcc 2.8.x and egcs. For gcc 3.2 and up we even mark C functions
|
||||
gcc 2.8.x and egcs. For gcc 3.4 and up we even mark C functions
|
||||
as non-throwing using a function attribute since programs can use
|
||||
the -fexceptions options for C code as well. */
|
||||
# if !defined __cplusplus \
|
||||
&& (__GNUC_PREREQ (3, 3) || __glibc_clang_has_attribute (__nothrow__))
|
||||
&& (__GNUC_PREREQ (3, 4) || __glibc_clang_has_attribute (__nothrow__))
|
||||
# define __THROW __attribute__ ((__nothrow__ __LEAF))
|
||||
# define __THROWNL __attribute__ ((__nothrow__))
|
||||
# define __NTH(fct) __attribute__ ((__nothrow__ __LEAF)) fct
|
||||
|
|
83
lib/eloop-threshold.h
Normal file
83
lib/eloop-threshold.h
Normal file
|
@ -0,0 +1,83 @@
|
|||
/* Threshold at which to diagnose ELOOP. Generic version.
|
||||
Copyright (C) 2012-2020 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 3 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#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 */
|
|
@ -107,7 +107,10 @@ euidaccess (const char *file, int mode)
|
|||
safe. */
|
||||
|
||||
if (mode == F_OK)
|
||||
return stat (file, &stats);
|
||||
{
|
||||
int result = stat (file, &stats);
|
||||
return result != 0 && errno == EOVERFLOW ? 0 : result;
|
||||
}
|
||||
else
|
||||
{
|
||||
int result;
|
||||
|
@ -142,8 +145,8 @@ euidaccess (const char *file, int mode)
|
|||
/* If we are not set-uid or set-gid, access does the same. */
|
||||
return access (file, mode);
|
||||
|
||||
if (stat (file, &stats) != 0)
|
||||
return -1;
|
||||
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. */
|
||||
|
|
|
@ -32,6 +32,13 @@
|
|||
#include <sys/stat.h>
|
||||
#undef _GL_INCLUDING_UNISTD_H
|
||||
|
||||
#ifndef FACCESSAT_NEVER_EOVERFLOWS
|
||||
# define FACCESSAT_NEVER_EOVERFLOWS 0
|
||||
#endif
|
||||
#ifndef LSTAT_FOLLOWS_SLASHED_SYMLINK
|
||||
# define LSTAT_FOLLOWS_SLASHED_SYMLINK 0
|
||||
#endif
|
||||
|
||||
#if HAVE_FACCESSAT
|
||||
static int
|
||||
orig_faccessat (int fd, char const *name, int mode, int flag)
|
||||
|
@ -59,7 +66,12 @@ 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] == '/')
|
||||
if (result != 0)
|
||||
{
|
||||
if (!FACCESSAT_NEVER_EOVERFLOWS && mode == F_OK && errno == EOVERFLOW)
|
||||
return 0;
|
||||
}
|
||||
else if (!LSTAT_FOLLOWS_SLASHED_SYMLINK && file[strlen (file) - 1] == '/')
|
||||
{
|
||||
struct stat st;
|
||||
result = fstatat (fd, file, &st, 0);
|
||||
|
|
|
@ -491,7 +491,9 @@ rpl_fcntl_DUPFD_CLOEXEC (int fd, int target)
|
|||
#if !HAVE_FCNTL
|
||||
result = dupfd (fd, target, O_CLOEXEC);
|
||||
#else /* HAVE_FCNTL */
|
||||
# if defined __HAIKU__
|
||||
# if defined __NetBSD__ || defined __HAIKU__
|
||||
/* On NetBSD 9.0, the system fcntl (fd, F_DUPFD_CLOEXEC, target)
|
||||
has only the same effect as fcntl (fd, F_DUPFD, target). */
|
||||
/* On Haiku, the system fcntl (fd, F_DUPFD_CLOEXEC, target) sets
|
||||
the FD_CLOEXEC flag on fd, not on target. Therefore avoid the
|
||||
system fcntl in this case. */
|
||||
|
|
|
@ -112,9 +112,21 @@ _GL_CXXALIASWARN (creat);
|
|||
/* Assume creat is always declared. */
|
||||
_GL_WARN_ON_USE (creat, "creat is not always POSIX compliant - "
|
||||
"use gnulib module creat for portability");
|
||||
#elif defined _WIN32 && !defined __CYGWIN__
|
||||
# undef creat
|
||||
# define creat _creat
|
||||
#else
|
||||
/* 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@
|
||||
|
@ -174,9 +186,22 @@ _GL_CXXALIASWARN (open);
|
|||
/* Assume open is always declared. */
|
||||
_GL_WARN_ON_USE (open, "open is not always POSIX compliant - "
|
||||
"use gnulib module open for portability");
|
||||
#elif defined _WIN32 && !defined __CYGWIN__
|
||||
# undef open
|
||||
# define open _open
|
||||
#else
|
||||
/* 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@
|
||||
|
|
|
@ -20,17 +20,6 @@
|
|||
|
||||
#include "filemode.h"
|
||||
|
||||
/* The following is for Cray DMF (Data Migration Facility), which is a
|
||||
HSM file system. A migrated file has a 'st_dm_mode' that is
|
||||
different from the normal 'st_mode', so any tests for migrated
|
||||
files should use the former. */
|
||||
#if HAVE_ST_DM_MODE
|
||||
# define IS_MIGRATED_FILE(statp) \
|
||||
(S_ISOFD (statp->st_dm_mode) || S_ISOFL (statp->st_dm_mode))
|
||||
#else
|
||||
# define IS_MIGRATED_FILE(statp) 0
|
||||
#endif
|
||||
|
||||
#if ! HAVE_DECL_STRMODE
|
||||
|
||||
/* Return a character indicating the type of file described by
|
||||
|
@ -126,7 +115,6 @@ strmode (mode_t mode, char *str)
|
|||
for files whose type cannot be determined solely from st_mode:
|
||||
|
||||
'F' semaphore
|
||||
'M' migrated file (Cray DMF)
|
||||
'Q' message queue
|
||||
'S' shared memory object
|
||||
'T' typed memory object
|
||||
|
@ -169,8 +157,6 @@ filemodestring (struct stat const *statp, char *str)
|
|||
|
||||
if (S_TYPEISSEM (statp))
|
||||
str[0] = 'F';
|
||||
else if (IS_MIGRATED_FILE (statp))
|
||||
str[0] = 'M';
|
||||
else if (S_TYPEISMQ (statp))
|
||||
str[0] = 'Q';
|
||||
else if (S_TYPEISSHM (statp))
|
||||
|
|
|
@ -25,7 +25,8 @@
|
|||
#include "stdio-impl.h"
|
||||
|
||||
/* This file is not used on systems that already have the __fpending function,
|
||||
namely glibc >= 2.2, Solaris >= 7, Android API >= 23. */
|
||||
namely glibc >= 2.2, Solaris >= 7, UnixWare >= 7.1.4.MP4, Cygwin >= 1.7.34,
|
||||
Android API >= 23. */
|
||||
|
||||
/* Return the number of pending (aka buffered, unflushed)
|
||||
bytes on the stream, FP, that is open for writing. */
|
||||
|
@ -39,13 +40,13 @@ __fpending (FILE *fp)
|
|||
/* GNU libc, BeOS, Haiku, Linux libc5 */
|
||||
return fp->_IO_write_ptr - fp->_IO_write_base;
|
||||
#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
|
||||
/* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
|
||||
/* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin < 1.7.34, Minix 3, Android */
|
||||
return fp->_p - fp->_bf._base;
|
||||
#elif defined __EMX__ /* emx+gcc */
|
||||
return fp->_ptr - fp->_buffer;
|
||||
#elif defined __minix /* Minix */
|
||||
return fp_->_ptr - fp_->_buf;
|
||||
#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel, OpenVMS */
|
||||
#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, UnixWare, mingw, MSVC, NonStop Kernel, OpenVMS */
|
||||
return (fp_->_ptr ? fp_->_ptr - fp_->_base : 0);
|
||||
#elif defined __UCLIBC__ /* uClibc */
|
||||
return (fp->__modeflags & __FLAG_WRITING ? fp->__bufpos - fp->__bufstart : 0);
|
||||
|
|
33
lib/free.c
Normal file
33
lib/free.c
Normal file
|
@ -0,0 +1,33 @@
|
|||
/* Make free() preserve errno.
|
||||
|
||||
Copyright (C) 2003, 2006, 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU 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 <stdlib.h>
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
void
|
||||
rpl_free (void *p)
|
||||
#undef free
|
||||
{
|
||||
int err = errno;
|
||||
free (p);
|
||||
errno = err;
|
||||
}
|
103
lib/gnulib.mk.in
103
lib/gnulib.mk.in
|
@ -103,6 +103,7 @@
|
|||
# filevercmp \
|
||||
# flexmember \
|
||||
# fpieee \
|
||||
# free-posix \
|
||||
# fstatat \
|
||||
# fsusage \
|
||||
# fsync \
|
||||
|
@ -257,6 +258,7 @@ GL_GENERATE_STDINT_H = @GL_GENERATE_STDINT_H@
|
|||
GMALLOC_OBJ = @GMALLOC_OBJ@
|
||||
GMP_H = @GMP_H@
|
||||
GNULIB_ACCESS = @GNULIB_ACCESS@
|
||||
GNULIB_ALIGNED_ALLOC = @GNULIB_ALIGNED_ALLOC@
|
||||
GNULIB_ALPHASORT = @GNULIB_ALPHASORT@
|
||||
GNULIB_ATOLL = @GNULIB_ATOLL@
|
||||
GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@
|
||||
|
@ -297,6 +299,7 @@ GNULIB_FPURGE = @GNULIB_FPURGE@
|
|||
GNULIB_FPUTC = @GNULIB_FPUTC@
|
||||
GNULIB_FPUTS = @GNULIB_FPUTS@
|
||||
GNULIB_FREAD = @GNULIB_FREAD@
|
||||
GNULIB_FREE_POSIX = @GNULIB_FREE_POSIX@
|
||||
GNULIB_FREOPEN = @GNULIB_FREOPEN@
|
||||
GNULIB_FSCANF = @GNULIB_FSCANF@
|
||||
GNULIB_FSEEK = @GNULIB_FSEEK@
|
||||
|
@ -388,6 +391,7 @@ GNULIB_PERROR = @GNULIB_PERROR@
|
|||
GNULIB_PIPE = @GNULIB_PIPE@
|
||||
GNULIB_PIPE2 = @GNULIB_PIPE2@
|
||||
GNULIB_POPEN = @GNULIB_POPEN@
|
||||
GNULIB_POSIX_MEMALIGN = @GNULIB_POSIX_MEMALIGN@
|
||||
GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@
|
||||
GNULIB_PREAD = @GNULIB_PREAD@
|
||||
GNULIB_PRINTF = @GNULIB_PRINTF@
|
||||
|
@ -506,6 +510,7 @@ GTK_OBJ = @GTK_OBJ@
|
|||
GZIP_PROG = @GZIP_PROG@
|
||||
HARFBUZZ_CFLAGS = @HARFBUZZ_CFLAGS@
|
||||
HARFBUZZ_LIBS = @HARFBUZZ_LIBS@
|
||||
HAVE_ALIGNED_ALLOC = @HAVE_ALIGNED_ALLOC@
|
||||
HAVE_ALLOCA_H = @HAVE_ALLOCA_H@
|
||||
HAVE_ALPHASORT = @HAVE_ALPHASORT@
|
||||
HAVE_ATOLL = @HAVE_ATOLL@
|
||||
|
@ -515,13 +520,18 @@ HAVE_CHOWN = @HAVE_CHOWN@
|
|||
HAVE_CLOSEDIR = @HAVE_CLOSEDIR@
|
||||
HAVE_COPY_FILE_RANGE = @HAVE_COPY_FILE_RANGE@
|
||||
HAVE_DECL_DIRFD = @HAVE_DECL_DIRFD@
|
||||
HAVE_DECL_ECVT = @HAVE_DECL_ECVT@
|
||||
HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@
|
||||
HAVE_DECL_EXECVPE = @HAVE_DECL_EXECVPE@
|
||||
HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@
|
||||
HAVE_DECL_FCLOSEALL = @HAVE_DECL_FCLOSEALL@
|
||||
HAVE_DECL_FCVT = @HAVE_DECL_FCVT@
|
||||
HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@
|
||||
HAVE_DECL_FDOPENDIR = @HAVE_DECL_FDOPENDIR@
|
||||
HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@
|
||||
HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@
|
||||
HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@
|
||||
HAVE_DECL_GCVT = @HAVE_DECL_GCVT@
|
||||
HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@
|
||||
HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@
|
||||
HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@
|
||||
|
@ -621,6 +631,7 @@ HAVE_PDUMPER = @HAVE_PDUMPER@
|
|||
HAVE_PIPE = @HAVE_PIPE@
|
||||
HAVE_PIPE2 = @HAVE_PIPE2@
|
||||
HAVE_POPEN = @HAVE_POPEN@
|
||||
HAVE_POSIX_MEMALIGN = @HAVE_POSIX_MEMALIGN@
|
||||
HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@
|
||||
HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@
|
||||
HAVE_PREAD = @HAVE_PREAD@
|
||||
|
@ -863,6 +874,7 @@ PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@
|
|||
RALLOC_OBJ = @RALLOC_OBJ@
|
||||
RANLIB = @RANLIB@
|
||||
REPLACE_ACCESS = @REPLACE_ACCESS@
|
||||
REPLACE_ALIGNED_ALLOC = @REPLACE_ALIGNED_ALLOC@
|
||||
REPLACE_CALLOC = @REPLACE_CALLOC@
|
||||
REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@
|
||||
REPLACE_CHOWN = @REPLACE_CHOWN@
|
||||
|
@ -885,6 +897,7 @@ REPLACE_FFLUSH = @REPLACE_FFLUSH@
|
|||
REPLACE_FOPEN = @REPLACE_FOPEN@
|
||||
REPLACE_FPRINTF = @REPLACE_FPRINTF@
|
||||
REPLACE_FPURGE = @REPLACE_FPURGE@
|
||||
REPLACE_FREE = @REPLACE_FREE@
|
||||
REPLACE_FREOPEN = @REPLACE_FREOPEN@
|
||||
REPLACE_FSEEK = @REPLACE_FSEEK@
|
||||
REPLACE_FSEEKO = @REPLACE_FSEEKO@
|
||||
|
@ -932,6 +945,7 @@ REPLACE_OPENAT = @REPLACE_OPENAT@
|
|||
REPLACE_OPENDIR = @REPLACE_OPENDIR@
|
||||
REPLACE_PERROR = @REPLACE_PERROR@
|
||||
REPLACE_POPEN = @REPLACE_POPEN@
|
||||
REPLACE_POSIX_MEMALIGN = @REPLACE_POSIX_MEMALIGN@
|
||||
REPLACE_PREAD = @REPLACE_PREAD@
|
||||
REPLACE_PRINTF = @REPLACE_PRINTF@
|
||||
REPLACE_PSELECT = @REPLACE_PSELECT@
|
||||
|
@ -1101,12 +1115,15 @@ gl_GNULIB_ENABLED_a9786850e999ae65a836a6041e8e5ed1 = @gl_GNULIB_ENABLED_a9786850
|
|||
gl_GNULIB_ENABLED_be453cec5eecf5731a274f2de7f2db36 = @gl_GNULIB_ENABLED_be453cec5eecf5731a274f2de7f2db36@
|
||||
gl_GNULIB_ENABLED_cloexec = @gl_GNULIB_ENABLED_cloexec@
|
||||
gl_GNULIB_ENABLED_dirfd = @gl_GNULIB_ENABLED_dirfd@
|
||||
gl_GNULIB_ENABLED_ef07dc4b3077c11ea9cef586db4e5955 = @gl_GNULIB_ENABLED_ef07dc4b3077c11ea9cef586db4e5955@
|
||||
gl_GNULIB_ENABLED_euidaccess = @gl_GNULIB_ENABLED_euidaccess@
|
||||
gl_GNULIB_ENABLED_getdtablesize = @gl_GNULIB_ENABLED_getdtablesize@
|
||||
gl_GNULIB_ENABLED_getgroups = @gl_GNULIB_ENABLED_getgroups@
|
||||
gl_GNULIB_ENABLED_idx = @gl_GNULIB_ENABLED_idx@
|
||||
gl_GNULIB_ENABLED_lchmod = @gl_GNULIB_ENABLED_lchmod@
|
||||
gl_GNULIB_ENABLED_malloca = @gl_GNULIB_ENABLED_malloca@
|
||||
gl_GNULIB_ENABLED_open = @gl_GNULIB_ENABLED_open@
|
||||
gl_GNULIB_ENABLED_rawmemchr = @gl_GNULIB_ENABLED_rawmemchr@
|
||||
gl_GNULIB_ENABLED_scratch_buffer = @gl_GNULIB_ENABLED_scratch_buffer@
|
||||
gl_GNULIB_ENABLED_strtoll = @gl_GNULIB_ENABLED_strtoll@
|
||||
gl_GNULIB_ENABLED_utimens = @gl_GNULIB_ENABLED_utimens@
|
||||
gl_LIBOBJS = @gl_LIBOBJS@
|
||||
|
@ -1512,6 +1529,17 @@ EXTRA_libgnu_a_SOURCES += dup2.c
|
|||
endif
|
||||
## end gnulib module dup2
|
||||
|
||||
## begin gnulib module eloop-threshold
|
||||
ifeq (,$(OMIT_GNULIB_MODULE_eloop-threshold))
|
||||
|
||||
ifneq (,$(gl_GNULIB_ENABLED_925677f0343de64b89a9f0c790b4104c))
|
||||
|
||||
endif
|
||||
EXTRA_DIST += eloop-threshold.h
|
||||
|
||||
endif
|
||||
## end gnulib module eloop-threshold
|
||||
|
||||
## begin gnulib module errno
|
||||
ifeq (,$(OMIT_GNULIB_MODULE_errno))
|
||||
|
||||
|
@ -1731,6 +1759,17 @@ EXTRA_libgnu_a_SOURCES += fpending.c
|
|||
endif
|
||||
## end gnulib module fpending
|
||||
|
||||
## begin gnulib module free-posix
|
||||
ifeq (,$(OMIT_GNULIB_MODULE_free-posix))
|
||||
|
||||
|
||||
EXTRA_DIST += free.c
|
||||
|
||||
EXTRA_libgnu_a_SOURCES += free.c
|
||||
|
||||
endif
|
||||
## end gnulib module free-posix
|
||||
|
||||
## begin gnulib module fstatat
|
||||
ifeq (,$(OMIT_GNULIB_MODULE_fstatat))
|
||||
|
||||
|
@ -1912,6 +1951,16 @@ EXTRA_libgnu_a_SOURCES += group-member.c
|
|||
endif
|
||||
## end gnulib module group-member
|
||||
|
||||
## begin gnulib module idx
|
||||
ifeq (,$(OMIT_GNULIB_MODULE_idx))
|
||||
|
||||
ifneq (,$(gl_GNULIB_ENABLED_idx))
|
||||
libgnu_a_SOURCES += idx.h
|
||||
|
||||
endif
|
||||
endif
|
||||
## end gnulib module idx
|
||||
|
||||
## begin gnulib module ieee754-h
|
||||
ifeq (,$(OMIT_GNULIB_MODULE_ieee754-h))
|
||||
|
||||
|
@ -2094,18 +2143,6 @@ EXTRA_libgnu_a_SOURCES += lstat.c
|
|||
endif
|
||||
## end gnulib module lstat
|
||||
|
||||
## begin gnulib module malloca
|
||||
ifeq (,$(OMIT_GNULIB_MODULE_malloca))
|
||||
|
||||
ifneq (,$(gl_GNULIB_ENABLED_malloca))
|
||||
libgnu_a_SOURCES += malloca.c
|
||||
|
||||
endif
|
||||
EXTRA_DIST += malloca.h
|
||||
|
||||
endif
|
||||
## end gnulib module malloca
|
||||
|
||||
## begin gnulib module memmem-simple
|
||||
ifeq (,$(OMIT_GNULIB_MODULE_memmem-simple))
|
||||
|
||||
|
@ -2263,6 +2300,19 @@ libgnu_a_SOURCES += qcopy-acl.c
|
|||
endif
|
||||
## end gnulib module qcopy-acl
|
||||
|
||||
## begin gnulib module rawmemchr
|
||||
ifeq (,$(OMIT_GNULIB_MODULE_rawmemchr))
|
||||
|
||||
ifneq (,$(gl_GNULIB_ENABLED_rawmemchr))
|
||||
|
||||
endif
|
||||
EXTRA_DIST += rawmemchr.c rawmemchr.valgrind
|
||||
|
||||
EXTRA_libgnu_a_SOURCES += rawmemchr.c
|
||||
|
||||
endif
|
||||
## end gnulib module rawmemchr
|
||||
|
||||
## begin gnulib module readlink
|
||||
ifeq (,$(OMIT_GNULIB_MODULE_readlink))
|
||||
|
||||
|
@ -2307,6 +2357,18 @@ EXTRA_DIST += root-uid.h
|
|||
endif
|
||||
## end gnulib module root-uid
|
||||
|
||||
## begin gnulib module scratch_buffer
|
||||
ifeq (,$(OMIT_GNULIB_MODULE_scratch_buffer))
|
||||
|
||||
ifneq (,$(gl_GNULIB_ENABLED_scratch_buffer))
|
||||
libgnu_a_SOURCES += malloc/scratch_buffer_grow.c malloc/scratch_buffer_grow_preserve.c malloc/scratch_buffer_set_array_size.c
|
||||
|
||||
endif
|
||||
EXTRA_DIST += malloc/scratch_buffer.h scratch_buffer.h
|
||||
|
||||
endif
|
||||
## end gnulib module scratch_buffer
|
||||
|
||||
## begin gnulib module sig2str
|
||||
ifeq (,$(OMIT_GNULIB_MODULE_sig2str))
|
||||
|
||||
|
@ -2618,7 +2680,8 @@ stdio.h: stdio.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H)
|
|||
-e 's/@''GNULIB_VSNPRINTF''@/$(GNULIB_VSNPRINTF)/g' \
|
||||
-e 's/@''GNULIB_VSPRINTF_POSIX''@/$(GNULIB_VSPRINTF_POSIX)/g' \
|
||||
< $(srcdir)/stdio.in.h | \
|
||||
sed -e 's|@''HAVE_DECL_FPURGE''@|$(HAVE_DECL_FPURGE)|g' \
|
||||
sed -e 's|@''HAVE_DECL_FCLOSEALL''@|$(HAVE_DECL_FCLOSEALL)|g' \
|
||||
-e 's|@''HAVE_DECL_FPURGE''@|$(HAVE_DECL_FPURGE)|g' \
|
||||
-e 's|@''HAVE_DECL_FSEEKO''@|$(HAVE_DECL_FSEEKO)|g' \
|
||||
-e 's|@''HAVE_DECL_FTELLO''@|$(HAVE_DECL_FTELLO)|g' \
|
||||
-e 's|@''HAVE_DECL_GETDELIM''@|$(HAVE_DECL_GETDELIM)|g' \
|
||||
|
@ -2696,9 +2759,11 @@ stdlib.h: stdlib.in.h $(top_builddir)/config.status $(CXXDEFS_H) \
|
|||
-e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
|
||||
-e 's|@''NEXT_STDLIB_H''@|$(NEXT_STDLIB_H)|g' \
|
||||
-e 's/@''GNULIB__EXIT''@/$(GNULIB__EXIT)/g' \
|
||||
-e 's/@''GNULIB_ALIGNED_ALLOC''@/$(GNULIB_ALIGNED_ALLOC)/g' \
|
||||
-e 's/@''GNULIB_ATOLL''@/$(GNULIB_ATOLL)/g' \
|
||||
-e 's/@''GNULIB_CALLOC_POSIX''@/$(GNULIB_CALLOC_POSIX)/g' \
|
||||
-e 's/@''GNULIB_CANONICALIZE_FILE_NAME''@/$(GNULIB_CANONICALIZE_FILE_NAME)/g' \
|
||||
-e 's/@''GNULIB_FREE_POSIX''@/$(GNULIB_FREE_POSIX)/g' \
|
||||
-e 's/@''GNULIB_GETLOADAVG''@/$(GNULIB_GETLOADAVG)/g' \
|
||||
-e 's/@''GNULIB_GETSUBOPT''@/$(GNULIB_GETSUBOPT)/g' \
|
||||
-e 's/@''GNULIB_GRANTPT''@/$(GNULIB_GRANTPT)/g' \
|
||||
|
@ -2709,6 +2774,7 @@ stdlib.h: stdlib.in.h $(top_builddir)/config.status $(CXXDEFS_H) \
|
|||
-e 's/@''GNULIB_MKOSTEMPS''@/$(GNULIB_MKOSTEMPS)/g' \
|
||||
-e 's/@''GNULIB_MKSTEMP''@/$(GNULIB_MKSTEMP)/g' \
|
||||
-e 's/@''GNULIB_MKSTEMPS''@/$(GNULIB_MKSTEMPS)/g' \
|
||||
-e 's/@''GNULIB_POSIX_MEMALIGN''@/$(GNULIB_POSIX_MEMALIGN)/g' \
|
||||
-e 's/@''GNULIB_POSIX_OPENPT''@/$(GNULIB_POSIX_OPENPT)/g' \
|
||||
-e 's/@''GNULIB_PTSNAME''@/$(GNULIB_PTSNAME)/g' \
|
||||
-e 's/@''GNULIB_PTSNAME_R''@/$(GNULIB_PTSNAME_R)/g' \
|
||||
|
@ -2732,8 +2798,12 @@ stdlib.h: stdlib.in.h $(top_builddir)/config.status $(CXXDEFS_H) \
|
|||
-e 's/@''GNULIB_WCTOMB''@/$(GNULIB_WCTOMB)/g' \
|
||||
< $(srcdir)/stdlib.in.h | \
|
||||
sed -e 's|@''HAVE__EXIT''@|$(HAVE__EXIT)|g' \
|
||||
-e 's|@''HAVE_ALIGNED_ALLOC''@|$(HAVE_ALIGNED_ALLOC)|g' \
|
||||
-e 's|@''HAVE_ATOLL''@|$(HAVE_ATOLL)|g' \
|
||||
-e 's|@''HAVE_CANONICALIZE_FILE_NAME''@|$(HAVE_CANONICALIZE_FILE_NAME)|g' \
|
||||
-e 's|@''HAVE_DECL_ECVT''@|$(HAVE_DECL_ECVT)|g' \
|
||||
-e 's|@''HAVE_DECL_FCVT''@|$(HAVE_DECL_FCVT)|g' \
|
||||
-e 's|@''HAVE_DECL_GCVT''@|$(HAVE_DECL_GCVT)|g' \
|
||||
-e 's|@''HAVE_DECL_GETLOADAVG''@|$(HAVE_DECL_GETLOADAVG)|g' \
|
||||
-e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \
|
||||
-e 's|@''HAVE_GRANTPT''@|$(HAVE_GRANTPT)|g' \
|
||||
|
@ -2745,6 +2815,7 @@ stdlib.h: stdlib.in.h $(top_builddir)/config.status $(CXXDEFS_H) \
|
|||
-e 's|@''HAVE_MKOSTEMPS''@|$(HAVE_MKOSTEMPS)|g' \
|
||||
-e 's|@''HAVE_MKSTEMP''@|$(HAVE_MKSTEMP)|g' \
|
||||
-e 's|@''HAVE_MKSTEMPS''@|$(HAVE_MKSTEMPS)|g' \
|
||||
-e 's|@''HAVE_POSIX_MEMALIGN''@|$(HAVE_POSIX_MEMALIGN)|g' \
|
||||
-e 's|@''HAVE_POSIX_OPENPT''@|$(HAVE_POSIX_OPENPT)|g' \
|
||||
-e 's|@''HAVE_PTSNAME''@|$(HAVE_PTSNAME)|g' \
|
||||
-e 's|@''HAVE_PTSNAME_R''@|$(HAVE_PTSNAME_R)|g' \
|
||||
|
@ -2767,12 +2838,15 @@ stdlib.h: stdlib.in.h $(top_builddir)/config.status $(CXXDEFS_H) \
|
|||
-e 's|@''HAVE_SYS_LOADAVG_H''@|$(HAVE_SYS_LOADAVG_H)|g' \
|
||||
-e 's|@''HAVE_UNLOCKPT''@|$(HAVE_UNLOCKPT)|g' \
|
||||
-e 's|@''HAVE_DECL_UNSETENV''@|$(HAVE_DECL_UNSETENV)|g' \
|
||||
-e 's|@''REPLACE_ALIGNED_ALLOC''@|$(REPLACE_ALIGNED_ALLOC)|g' \
|
||||
-e 's|@''REPLACE_CALLOC''@|$(REPLACE_CALLOC)|g' \
|
||||
-e 's|@''REPLACE_CANONICALIZE_FILE_NAME''@|$(REPLACE_CANONICALIZE_FILE_NAME)|g' \
|
||||
-e 's|@''REPLACE_FREE''@|$(REPLACE_FREE)|g' \
|
||||
-e 's|@''REPLACE_INITSTATE''@|$(REPLACE_INITSTATE)|g' \
|
||||
-e 's|@''REPLACE_MALLOC''@|$(REPLACE_MALLOC)|g' \
|
||||
-e 's|@''REPLACE_MBTOWC''@|$(REPLACE_MBTOWC)|g' \
|
||||
-e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \
|
||||
-e 's|@''REPLACE_POSIX_MEMALIGN''@|$(REPLACE_POSIX_MEMALIGN)|g' \
|
||||
-e 's|@''REPLACE_PTSNAME''@|$(REPLACE_PTSNAME)|g' \
|
||||
-e 's|@''REPLACE_PTSNAME_R''@|$(REPLACE_PTSNAME_R)|g' \
|
||||
-e 's|@''REPLACE_PUTENV''@|$(REPLACE_PUTENV)|g' \
|
||||
|
@ -3412,6 +3486,7 @@ unistd.h: unistd.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H
|
|||
-e 's|@''HAVE_UNLINKAT''@|$(HAVE_UNLINKAT)|g' \
|
||||
-e 's|@''HAVE_USLEEP''@|$(HAVE_USLEEP)|g' \
|
||||
-e 's|@''HAVE_DECL_ENVIRON''@|$(HAVE_DECL_ENVIRON)|g' \
|
||||
-e 's|@''HAVE_DECL_EXECVPE''@|$(HAVE_DECL_EXECVPE)|g' \
|
||||
-e 's|@''HAVE_DECL_FCHDIR''@|$(HAVE_DECL_FCHDIR)|g' \
|
||||
-e 's|@''HAVE_DECL_FDATASYNC''@|$(HAVE_DECL_FDATASYNC)|g' \
|
||||
-e 's|@''HAVE_DECL_GETDOMAINNAME''@|$(HAVE_DECL_GETDOMAINNAME)|g' \
|
||||
|
|
113
lib/idx.h
Normal file
113
lib/idx.h
Normal file
|
@ -0,0 +1,113 @@
|
|||
/* A type for indices and sizes.
|
||||
|
||||
Copyright (C) 2020 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#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 '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 */
|
|
@ -226,7 +226,9 @@
|
|||
|
||||
/* True if __builtin_add_overflow (A, B, P) and __builtin_sub_overflow
|
||||
(A, B, P) work when P is non-null. */
|
||||
#if 5 <= __GNUC__ && !defined __ICC
|
||||
/* __builtin_{add,sub}_overflow exists but is not reliable in GCC 5.x and 6.x,
|
||||
see <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98269>. */
|
||||
#if 7 <= __GNUC__ && !defined __ICC
|
||||
# define _GL_HAS_BUILTIN_ADD_OVERFLOW 1
|
||||
#elif defined __has_builtin
|
||||
# define _GL_HAS_BUILTIN_ADD_OVERFLOW __has_builtin (__builtin_add_overflow)
|
||||
|
@ -244,7 +246,17 @@
|
|||
|
||||
/* True if __builtin_add_overflow_p (A, B, C) works, and similarly for
|
||||
__builtin_sub_overflow_p and __builtin_mul_overflow_p. */
|
||||
#define _GL_HAS_BUILTIN_OVERFLOW_P (7 <= __GNUC__)
|
||||
#if defined __clang__ || defined __ICC
|
||||
/* Clang 11 lacks __builtin_mul_overflow_p, and even if it did it
|
||||
would presumably run afoul of Clang bug 16404. ICC 2021.1's
|
||||
__builtin_add_overflow_p etc. are not treated as integral constant
|
||||
expressions even when all arguments are. */
|
||||
# define _GL_HAS_BUILTIN_OVERFLOW_P 0
|
||||
#elif defined __has_builtin
|
||||
# define _GL_HAS_BUILTIN_OVERFLOW_P __has_builtin (__builtin_mul_overflow_p)
|
||||
#else
|
||||
# define _GL_HAS_BUILTIN_OVERFLOW_P (7 <= __GNUC__)
|
||||
#endif
|
||||
|
||||
/* The _GL*_OVERFLOW macros have the same restrictions as the
|
||||
*_RANGE_OVERFLOW macros, except that they do not assume that operands
|
||||
|
@ -377,8 +389,9 @@
|
|||
_GL_INT_OP_WRAPV (a, b, r, -, _GL_INT_SUBTRACT_RANGE_OVERFLOW)
|
||||
#endif
|
||||
#if _GL_HAS_BUILTIN_MUL_OVERFLOW
|
||||
# if (9 < __GNUC__ + (3 <= __GNUC_MINOR__) \
|
||||
|| (__GNUC__ == 8 && 4 <= __GNUC_MINOR__))
|
||||
# if ((9 < __GNUC__ + (3 <= __GNUC_MINOR__) \
|
||||
|| (__GNUC__ == 8 && 4 <= __GNUC_MINOR__)) \
|
||||
&& !defined __ICC)
|
||||
# define INT_MULTIPLY_WRAPV(a, b, r) __builtin_mul_overflow (a, b, r)
|
||||
# else
|
||||
/* Work around GCC bug 91450. */
|
||||
|
@ -585,4 +598,33 @@
|
|||
: (tmin) / (a) < (b)) \
|
||||
: (tmax) / (b) < (a)))
|
||||
|
||||
/* The following macros compute A + B, A - B, and A * B, respectively.
|
||||
If no overflow occurs, they set *R to the result and return 1;
|
||||
otherwise, they return 0 and may modify *R.
|
||||
|
||||
Example usage:
|
||||
|
||||
long int result;
|
||||
if (INT_ADD_OK (a, b, &result))
|
||||
printf ("result is %ld\n", result);
|
||||
else
|
||||
printf ("overflow\n");
|
||||
|
||||
A, B, and *R should be integers; they need not be the same type,
|
||||
and they need not be all signed or all unsigned.
|
||||
|
||||
These macros work correctly on all known practical hosts, and do not rely
|
||||
on undefined behavior due to signed arithmetic overflow.
|
||||
|
||||
These macros are not constant expressions.
|
||||
|
||||
These macros may evaluate their arguments zero or multiple times, so the
|
||||
arguments should not have side effects.
|
||||
|
||||
These macros are tuned for B being a constant. */
|
||||
|
||||
#define INT_ADD_OK(a, b, r) ! INT_ADD_WRAPV (a, b, r)
|
||||
#define INT_SUBTRACT_OK(a, b, r) ! INT_SUBTRACT_WRAPV (a, b, r)
|
||||
#define INT_MULTIPLY_OK(a, b, r) ! INT_MULTIPLY_WRAPV (a, b, r)
|
||||
|
||||
#endif /* _GL_INTPROPS_H */
|
||||
|
|
135
lib/malloc/scratch_buffer.h
Normal file
135
lib/malloc/scratch_buffer.h
Normal file
|
@ -0,0 +1,135 @@
|
|||
/* Variable-sized buffer with on-stack default allocation.
|
||||
Copyright (C) 2015-2020 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 3 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#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 */
|
56
lib/malloc/scratch_buffer_grow.c
Normal file
56
lib/malloc/scratch_buffer_grow.c
Normal file
|
@ -0,0 +1,56 @@
|
|||
/* Variable-sized buffer with on-stack default allocation.
|
||||
Copyright (C) 2015-2020 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 3 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#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)
|
67
lib/malloc/scratch_buffer_grow_preserve.c
Normal file
67
lib/malloc/scratch_buffer_grow_preserve.c
Normal file
|
@ -0,0 +1,67 @@
|
|||
/* Variable-sized buffer with on-stack default allocation.
|
||||
Copyright (C) 2015-2020 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 3 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#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)
|
64
lib/malloc/scratch_buffer_set_array_size.c
Normal file
64
lib/malloc/scratch_buffer_set_array_size.c
Normal file
|
@ -0,0 +1,64 @@
|
|||
/* Variable-sized buffer with on-stack default allocation.
|
||||
Copyright (C) 2015-2020 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 3 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#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)
|
|
@ -32,7 +32,7 @@ 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
|
||||
neither with GMP nor with future versions of mini-gmp. */
|
||||
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,
|
||||
|
@ -1331,29 +1331,26 @@ mpn_set_str_bits (mp_ptr rp, const unsigned char *sp, size_t sn,
|
|||
unsigned bits)
|
||||
{
|
||||
mp_size_t rn;
|
||||
size_t j;
|
||||
mp_limb_t limb;
|
||||
unsigned shift;
|
||||
|
||||
for (j = sn, rn = 0, shift = 0; j-- > 0; )
|
||||
for (limb = 0, rn = 0, shift = 0; sn-- > 0; )
|
||||
{
|
||||
if (shift == 0)
|
||||
limb |= (mp_limb_t) sp[sn] << shift;
|
||||
shift += bits;
|
||||
if (shift >= GMP_LIMB_BITS)
|
||||
{
|
||||
rp[rn++] = sp[j];
|
||||
shift += bits;
|
||||
}
|
||||
else
|
||||
{
|
||||
rp[rn-1] |= (mp_limb_t) sp[j] << shift;
|
||||
shift += bits;
|
||||
if (shift >= GMP_LIMB_BITS)
|
||||
{
|
||||
shift -= GMP_LIMB_BITS;
|
||||
if (shift > 0)
|
||||
rp[rn++] = (mp_limb_t) sp[j] >> (bits - shift);
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
rn = mpn_normalized_size (rp, rn);
|
||||
if (limb != 0)
|
||||
rp[rn++] = limb;
|
||||
else
|
||||
rn = mpn_normalized_size (rp, rn);
|
||||
return rn;
|
||||
}
|
||||
|
||||
|
@ -2723,7 +2720,7 @@ mpz_make_odd (mpz_t r)
|
|||
|
||||
assert (r->_mp_size > 0);
|
||||
/* Count trailing zeros, equivalent to mpn_scan1, because we know that there is a 1 */
|
||||
shift = mpn_common_scan (r->_mp_d[0], 0, r->_mp_d, 0, 0);
|
||||
shift = mpn_scan1 (r->_mp_d, 0);
|
||||
mpz_tdiv_q_2exp (r, r, shift);
|
||||
|
||||
return shift;
|
||||
|
@ -2780,9 +2777,13 @@ mpz_gcd (mpz_t g, const mpz_t u, const mpz_t v)
|
|||
|
||||
if (tv->_mp_size == 1)
|
||||
{
|
||||
mp_limb_t vl = tv->_mp_d[0];
|
||||
mp_limb_t ul = mpz_tdiv_ui (tu, vl);
|
||||
mpz_set_ui (g, mpn_gcd_11 (ul, vl));
|
||||
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);
|
||||
|
@ -2871,7 +2872,6 @@ mpz_gcdext (mpz_t g, mpz_t s, mpz_t t, const mpz_t u, const mpz_t v)
|
|||
* s0 = 0, s1 = 2^vz
|
||||
*/
|
||||
|
||||
mpz_setbit (t0, uz);
|
||||
mpz_tdiv_qr (t1, tu, tu, tv);
|
||||
mpz_mul_2exp (t1, t1, uz);
|
||||
|
||||
|
@ -2882,8 +2882,7 @@ mpz_gcdext (mpz_t g, mpz_t s, mpz_t t, const mpz_t u, const mpz_t v)
|
|||
{
|
||||
mp_bitcnt_t shift;
|
||||
shift = mpz_make_odd (tu);
|
||||
mpz_mul_2exp (t0, t0, shift);
|
||||
mpz_mul_2exp (s0, s0, shift);
|
||||
mpz_setbit (t0, uz + shift);
|
||||
power += shift;
|
||||
|
||||
for (;;)
|
||||
|
@ -2921,6 +2920,8 @@ mpz_gcdext (mpz_t g, mpz_t s, mpz_t t, const mpz_t u, const mpz_t v)
|
|||
power += shift;
|
||||
}
|
||||
}
|
||||
else
|
||||
mpz_setbit (t0, uz);
|
||||
|
||||
/* Now tv = odd part of gcd, and -s0 and t0 are corresponding
|
||||
cofactors. */
|
||||
|
@ -3604,7 +3605,8 @@ mpz_probab_prime_p (const mpz_t n, int reps)
|
|||
/* Find q and k, where q is odd and n = 1 + 2**k * q. */
|
||||
mpz_abs (nm1, n);
|
||||
nm1->_mp_d[0] -= 1;
|
||||
k = mpz_scan1 (nm1, 0);
|
||||
/* 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 */
|
||||
|
@ -4301,7 +4303,7 @@ mpz_get_str (char *sp, int base, const mpz_t u)
|
|||
ret:
|
||||
sp[sn] = '\0';
|
||||
if (osn && osn != sn + 1)
|
||||
sp = gmp_realloc(sp, osn, sn + 1);
|
||||
sp = (char*) gmp_realloc (sp, osn, sn + 1);
|
||||
return sp;
|
||||
}
|
||||
|
||||
|
@ -4425,6 +4427,8 @@ mpz_out_str (FILE *stream, int base, const mpz_t x)
|
|||
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);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* mini-gmp, a minimalistic implementation of a GNU GMP subset.
|
||||
|
||||
Copyright 2011-2015, 2017, 2019 Free Software Foundation, Inc.
|
||||
Copyright 2011-2015, 2017, 2019-2020 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of the GNU MP Library.
|
||||
|
||||
|
@ -295,7 +295,8 @@ int mpz_init_set_str (mpz_t, const char *, int);
|
|||
|| defined (_MSL_STDIO_H) /* Metrowerks */ \
|
||||
|| defined (_STDIO_H_INCLUDED) /* QNX4 */ \
|
||||
|| defined (_ISO_STDIO_ISO_H) /* Sun C++ */ \
|
||||
|| defined (__STDIO_LOADED) /* VMS */
|
||||
|| defined (__STDIO_LOADED) /* VMS */ \
|
||||
|| defined (__DEFINED_FILE) /* musl */
|
||||
size_t mpz_out_str (FILE *, int, const mpz_t);
|
||||
#endif
|
||||
|
||||
|
|
136
lib/rawmemchr.c
Normal file
136
lib/rawmemchr.c
Normal file
|
@ -0,0 +1,136 @@
|
|||
/* Searching in a string.
|
||||
Copyright (C) 2008-2020 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Specification. */
|
||||
#include <string.h>
|
||||
|
||||
/* Find the first occurrence of C in S. */
|
||||
void *
|
||||
rawmemchr (const void *s, int c_in)
|
||||
{
|
||||
/* On 32-bit hardware, choosing longword to be a 32-bit unsigned
|
||||
long instead of a 64-bit uintmax_t tends to give better
|
||||
performance. On 64-bit hardware, unsigned long is generally 64
|
||||
bits already. Change this typedef to experiment with
|
||||
performance. */
|
||||
typedef unsigned long int longword;
|
||||
|
||||
const unsigned char *char_ptr;
|
||||
const longword *longword_ptr;
|
||||
longword repeated_one;
|
||||
longword repeated_c;
|
||||
unsigned char c;
|
||||
|
||||
c = (unsigned char) c_in;
|
||||
|
||||
/* Handle the first few bytes by reading one byte at a time.
|
||||
Do this until CHAR_PTR is aligned on a longword boundary. */
|
||||
for (char_ptr = (const unsigned char *) s;
|
||||
(size_t) char_ptr % sizeof (longword) != 0;
|
||||
++char_ptr)
|
||||
if (*char_ptr == c)
|
||||
return (void *) char_ptr;
|
||||
|
||||
longword_ptr = (const longword *) char_ptr;
|
||||
|
||||
/* All these elucidatory comments refer to 4-byte longwords,
|
||||
but the theory applies equally well to any size longwords. */
|
||||
|
||||
/* 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 NUL or
|
||||
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.
|
||||
|
||||
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_one << 7)) != 0)
|
||||
break;
|
||||
longword_ptr++;
|
||||
}
|
||||
|
||||
char_ptr = (const unsigned char *) longword_ptr;
|
||||
|
||||
/* At this point, we know that one of the sizeof (longword) bytes
|
||||
starting at char_ptr is == c. On little-endian machines, we
|
||||
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. */
|
||||
|
||||
char_ptr = (unsigned char *) longword_ptr;
|
||||
while (*char_ptr != c)
|
||||
char_ptr++;
|
||||
return (void *) char_ptr;
|
||||
}
|
28
lib/rawmemchr.valgrind
Normal file
28
lib/rawmemchr.valgrind
Normal file
|
@ -0,0 +1,28 @@
|
|||
# Suppress a valgrind message about use of uninitialized memory in rawmemchr().
|
||||
|
||||
# Copyright (C) 2008-2020 Free Software Foundation, Inc.
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
# This use is OK because it provides only a speedup.
|
||||
{
|
||||
rawmemchr-value4
|
||||
Memcheck:Value4
|
||||
fun:rawmemchr
|
||||
}
|
||||
{
|
||||
rawmemchr-value8
|
||||
Memcheck:Value8
|
||||
fun:rawmemchr
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
/* Stub for readlink().
|
||||
/* Read the contents of a symbolic link.
|
||||
Copyright (C) 2003-2007, 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
|
@ -29,7 +29,7 @@
|
|||
such as DJGPP 2.03 and mingw32. */
|
||||
|
||||
ssize_t
|
||||
readlink (const char *name, char *buf _GL_UNUSED,
|
||||
readlink (char const *file, char *buf _GL_UNUSED,
|
||||
size_t bufsize _GL_UNUSED)
|
||||
{
|
||||
struct stat statbuf;
|
||||
|
@ -37,7 +37,7 @@ readlink (const char *name, char *buf _GL_UNUSED,
|
|||
/* In general we should use lstat() here, not stat(). But on platforms
|
||||
without symbolic links, lstat() - if it exists - would be equivalent to
|
||||
stat(), therefore we can use stat(). This saves us a configure check. */
|
||||
if (stat (name, &statbuf) >= 0)
|
||||
if (stat (file, &statbuf) >= 0)
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
@ -51,24 +51,54 @@ readlink (const char *name, char *buf _GL_UNUSED,
|
|||
for Solaris 9. */
|
||||
|
||||
ssize_t
|
||||
rpl_readlink (const char *name, char *buf, size_t bufsize)
|
||||
rpl_readlink (char const *file, char *buf, size_t bufsize)
|
||||
{
|
||||
# if READLINK_TRAILING_SLASH_BUG
|
||||
size_t len = strlen (name);
|
||||
if (len && name[len - 1] == '/')
|
||||
size_t file_len = strlen (file);
|
||||
if (file_len && file[file_len - 1] == '/')
|
||||
{
|
||||
/* Even if name without the slash is a symlink to a directory,
|
||||
/* Even if FILE without the slash is a symlink to a directory,
|
||||
both lstat() and stat() must resolve the trailing slash to
|
||||
the directory rather than the symlink. We can therefore
|
||||
safely use stat() to distinguish between EINVAL and
|
||||
ENOTDIR/ENOENT, avoiding extra overhead of rpl_lstat(). */
|
||||
struct stat st;
|
||||
if (stat (name, &st) == 0)
|
||||
if (stat (file, &st) == 0 || errno == EOVERFLOW)
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
# endif /* READLINK_TRAILING_SLASH_BUG */
|
||||
return readlink (name, buf, bufsize);
|
||||
|
||||
ssize_t r = readlink (file, buf, bufsize);
|
||||
|
||||
# if READLINK_TRUNCATE_BUG
|
||||
if (r < 0 && errno == ERANGE)
|
||||
{
|
||||
/* Try again with a bigger buffer. This is just for test cases;
|
||||
real code invariably discards short reads. */
|
||||
char stackbuf[4032];
|
||||
r = readlink (file, stackbuf, sizeof stackbuf);
|
||||
if (r < 0)
|
||||
{
|
||||
if (errno == ERANGE)
|
||||
{
|
||||
/* Clear the buffer, which is good enough for real code.
|
||||
Thankfully, no test cases try short reads of enormous
|
||||
symlinks and what would be the point anyway? */
|
||||
r = bufsize;
|
||||
memset (buf, 0, r);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (bufsize < r)
|
||||
r = bufsize;
|
||||
memcpy (buf, stackbuf, r);
|
||||
}
|
||||
}
|
||||
# endif
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
#endif /* HAVE_READLINK */
|
||||
|
|
|
@ -28,10 +28,11 @@
|
|||
|
||||
#if HAVE_READLINKAT
|
||||
|
||||
# undef fstatat
|
||||
# undef readlinkat
|
||||
|
||||
ssize_t
|
||||
rpl_readlinkat (int fd, char const *file, char *buf, size_t len)
|
||||
rpl_readlinkat (int fd, char const *file, char *buf, size_t bufsize)
|
||||
{
|
||||
# if READLINK_TRAILING_SLASH_BUG
|
||||
size_t file_len = strlen (file);
|
||||
|
@ -40,15 +41,45 @@ rpl_readlinkat (int fd, char const *file, char *buf, size_t len)
|
|||
/* 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(). */
|
||||
safely use fstatat(..., 0) to distinguish between EINVAL and
|
||||
ENOTDIR/ENOENT, avoiding extra overhead of rpl_fstatat(). */
|
||||
struct stat st;
|
||||
if (stat (file, &st) == 0)
|
||||
if (fstatat (fd, file, &st, 0) == 0 || errno == EOVERFLOW)
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
# endif /* READLINK_TRAILING_SLASH_BUG */
|
||||
return readlinkat (fd, file, buf, len);
|
||||
|
||||
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
|
||||
|
@ -61,7 +92,7 @@ rpl_readlinkat (int fd, char const *file, char *buf, size_t len)
|
|||
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 LEN, in the
|
||||
/* 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
|
||||
|
@ -69,8 +100,8 @@ rpl_readlinkat (int fd, char const *file, char *buf, size_t len)
|
|||
|
||||
# define AT_FUNC_NAME readlinkat
|
||||
# define AT_FUNC_F1 readlink
|
||||
# define AT_FUNC_POST_FILE_PARAM_DECLS , char *buf, size_t len
|
||||
# define AT_FUNC_POST_FILE_ARGS , buf, len
|
||||
# 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
|
||||
|
|
|
@ -300,18 +300,20 @@ build_wcs_upper_buffer (re_string_t *pstr)
|
|||
while (byte_idx < end_idx)
|
||||
{
|
||||
wchar_t wc;
|
||||
unsigned char ch = pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx];
|
||||
|
||||
if (isascii (pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx])
|
||||
&& mbsinit (&pstr->cur_state))
|
||||
if (isascii (ch) && mbsinit (&pstr->cur_state))
|
||||
{
|
||||
/* In case of a singlebyte character. */
|
||||
pstr->mbs[byte_idx]
|
||||
= toupper (pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx]);
|
||||
/* The next step uses the assumption that wchar_t is encoded
|
||||
ASCII-safe: all ASCII values can be converted like this. */
|
||||
pstr->wcs[byte_idx] = (wchar_t) pstr->mbs[byte_idx];
|
||||
++byte_idx;
|
||||
continue;
|
||||
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;
|
||||
|
@ -348,7 +350,6 @@ build_wcs_upper_buffer (re_string_t *pstr)
|
|||
{
|
||||
/* It is an invalid character, an incomplete character
|
||||
at the end of the string, or '\0'. Just use the byte. */
|
||||
int ch = pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx];
|
||||
pstr->mbs[byte_idx] = ch;
|
||||
/* And also cast it to wide char. */
|
||||
pstr->wcs[byte_idx++] = (wchar_t) ch;
|
||||
|
|
|
@ -77,6 +77,14 @@
|
|||
# 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
|
||||
|
|
29
lib/scratch_buffer.h
Normal file
29
lib/scratch_buffer.h
Normal file
|
@ -0,0 +1,29 @@
|
|||
/* Variable-sized buffer with on-stack default allocation.
|
||||
Copyright (C) 2017-2020 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU 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, 2017. */
|
||||
|
||||
#ifndef _GL_SCRATCH_BUFFER_H
|
||||
#define _GL_SCRATCH_BUFFER_H
|
||||
|
||||
#include <libc-config.h>
|
||||
|
||||
#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
|
||||
#include <malloc/scratch_buffer.h>
|
||||
|
||||
#endif /* _GL_SCRATCH_BUFFER_H */
|
|
@ -55,13 +55,13 @@
|
|||
#ifndef _@GUARD_PREFIX@_SIGNAL_H
|
||||
#define _@GUARD_PREFIX@_SIGNAL_H
|
||||
|
||||
/* Mac OS X 10.3, FreeBSD 6.4, OpenBSD 3.8, OSF/1 4.0, Solaris 2.6, Android
|
||||
declare pthread_sigmask in <pthread.h>, not in <signal.h>.
|
||||
/* Mac OS X 10.3, FreeBSD 6.4, OpenBSD 3.8, OSF/1 4.0, Solaris 2.6, Android,
|
||||
OS/2 kLIBC declare pthread_sigmask in <pthread.h>, not in <signal.h>.
|
||||
But avoid namespace pollution on glibc systems.*/
|
||||
#if (@GNULIB_PTHREAD_SIGMASK@ || defined GNULIB_POSIXCHECK) \
|
||||
&& ((defined __APPLE__ && defined __MACH__) \
|
||||
|| defined __FreeBSD__ || defined __OpenBSD__ || defined __osf__ \
|
||||
|| defined __sun || defined __ANDROID__) \
|
||||
|| defined __sun || defined __ANDROID__ || defined __KLIBC__) \
|
||||
&& ! defined __GLIBC__
|
||||
# include <pthread.h>
|
||||
#endif
|
||||
|
|
|
@ -579,11 +579,6 @@ typedef int _verify_intmax_size[sizeof (intmax_t) == sizeof (uintmax_t)
|
|||
<wchar.h> -> <stdio.h> -> <getopt.h> -> <stdlib.h>, and the latter includes
|
||||
<stdint.h> and assumes its types are already defined. */
|
||||
# if @HAVE_WCHAR_H@ && ! (defined WCHAR_MIN && defined WCHAR_MAX)
|
||||
/* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
|
||||
included before <wchar.h>. */
|
||||
# include <stddef.h>
|
||||
# include <stdio.h>
|
||||
# include <time.h>
|
||||
# define _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
|
||||
# include <wchar.h>
|
||||
# undef _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
|
||||
|
|
|
@ -175,7 +175,7 @@
|
|||
# define fp_ fp
|
||||
# endif
|
||||
|
||||
# if defined _SCO_DS /* OpenServer */
|
||||
# if defined _SCO_DS || (defined __SCO_VERSION__ || defined __sysv5__) /* OpenServer 5, OpenServer 6, UnixWare 7 */
|
||||
# define _cnt __cnt
|
||||
# define _ptr __ptr
|
||||
# define _base __base
|
||||
|
|
183
lib/stdio.in.h
183
lib/stdio.in.h
|
@ -70,29 +70,43 @@
|
|||
# endif
|
||||
#endif
|
||||
|
||||
/* _GL_ATTRIBUTE_FORMAT_PRINTF
|
||||
/* 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. */
|
||||
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
|
||||
# define _GL_ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \
|
||||
_GL_ATTRIBUTE_FORMAT ((__gnu_printf__, formatstring_parameter, first_argument))
|
||||
#else
|
||||
# define _GL_ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \
|
||||
_GL_ATTRIBUTE_FORMAT ((__printf__, formatstring_parameter, first_argument))
|
||||
#endif
|
||||
#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,
|
||||
/* _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. */
|
||||
#if GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU
|
||||
# define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF (formatstring_parameter, first_argument)
|
||||
#else
|
||||
# define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \
|
||||
_GL_ATTRIBUTE_FORMAT ((__printf__, formatstring_parameter, first_argument))
|
||||
#endif
|
||||
#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,
|
||||
|
@ -174,13 +188,13 @@
|
|||
# define dprintf rpl_dprintf
|
||||
# endif
|
||||
_GL_FUNCDECL_RPL (dprintf, int, (int fd, const char *restrict format, ...)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
|
||||
_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 (2, 3)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
|
||||
_GL_ARG_NONNULL ((2)));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (dprintf, int, (int fd, const char *restrict format, ...));
|
||||
|
@ -215,9 +229,27 @@ _GL_WARN_ON_USE (fclose, "fclose is not always POSIX compliant - "
|
|||
"use gnulib module fclose for portable POSIX compliance");
|
||||
#endif
|
||||
|
||||
/* 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__
|
||||
# undef fcloseall
|
||||
# define fcloseall _fcloseall
|
||||
# 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__
|
||||
_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
|
||||
|
||||
#if @GNULIB_FDOPEN@
|
||||
|
@ -244,9 +276,20 @@ _GL_CXXALIASWARN (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 defined _WIN32 && !defined __CYGWIN__
|
||||
# undef fdopen
|
||||
# define fdopen _fdopen
|
||||
#else
|
||||
/* 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
|
||||
|
||||
#if @GNULIB_FFLUSH@
|
||||
|
@ -311,10 +354,19 @@ _GL_CXXALIASWARN (fgets);
|
|||
# endif
|
||||
#endif
|
||||
|
||||
/* 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__
|
||||
# undef fileno
|
||||
# define fileno _fileno
|
||||
# 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);
|
||||
|
||||
#if @GNULIB_FOPEN@
|
||||
# if @REPLACE_FOPEN@
|
||||
|
@ -351,7 +403,7 @@ _GL_WARN_ON_USE (fopen, "fopen on native Windows platforms is not POSIX complian
|
|||
# if @GNULIB_FPRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@
|
||||
_GL_FUNCDECL_RPL (fprintf, int,
|
||||
(FILE *restrict fp, const char *restrict format, ...)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
|
||||
_GL_ARG_NONNULL ((1, 2)));
|
||||
# else
|
||||
_GL_FUNCDECL_RPL (fprintf, int,
|
||||
|
@ -843,10 +895,19 @@ _GL_WARN_ON_USE (getline, "getline is unportable - "
|
|||
_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
|
||||
#endif
|
||||
|
||||
/* 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__
|
||||
# undef getw
|
||||
# define getw _getw
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# undef getw
|
||||
# define getw _getw
|
||||
# endif
|
||||
_GL_CXXALIAS_MDA (getw, int, (FILE *restrict stream));
|
||||
#else
|
||||
_GL_CXXALIAS_SYS (getw, int, (FILE *restrict stream));
|
||||
#endif
|
||||
_GL_CXXALIASWARN (getw);
|
||||
|
||||
#if @GNULIB_OBSTACK_PRINTF@ || @GNULIB_OBSTACK_PRINTF_POSIX@
|
||||
struct obstack;
|
||||
|
@ -861,7 +922,7 @@ struct obstack;
|
|||
# endif
|
||||
_GL_FUNCDECL_RPL (obstack_printf, int,
|
||||
(struct obstack *obs, const char *format, ...)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
|
||||
_GL_ARG_NONNULL ((1, 2)));
|
||||
_GL_CXXALIAS_RPL (obstack_printf, int,
|
||||
(struct obstack *obs, const char *format, ...));
|
||||
|
@ -869,7 +930,7 @@ _GL_CXXALIAS_RPL (obstack_printf, int,
|
|||
# if !@HAVE_DECL_OBSTACK_PRINTF@
|
||||
_GL_FUNCDECL_SYS (obstack_printf, int,
|
||||
(struct obstack *obs, const char *format, ...)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
|
||||
_GL_ARG_NONNULL ((1, 2)));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (obstack_printf, int,
|
||||
|
@ -882,7 +943,7 @@ _GL_CXXALIASWARN (obstack_printf);
|
|||
# endif
|
||||
_GL_FUNCDECL_RPL (obstack_vprintf, int,
|
||||
(struct obstack *obs, const char *format, va_list args)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
|
||||
_GL_ARG_NONNULL ((1, 2)));
|
||||
_GL_CXXALIAS_RPL (obstack_vprintf, int,
|
||||
(struct obstack *obs, const char *format, va_list args));
|
||||
|
@ -890,7 +951,7 @@ _GL_CXXALIAS_RPL (obstack_vprintf, int,
|
|||
# if !@HAVE_DECL_OBSTACK_PRINTF@
|
||||
_GL_FUNCDECL_SYS (obstack_vprintf, int,
|
||||
(struct obstack *obs, const char *format, va_list args)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
|
||||
_GL_ARG_NONNULL ((1, 2)));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (obstack_vprintf, int,
|
||||
|
@ -974,7 +1035,7 @@ _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 (1, 2)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (1, 2)
|
||||
_GL_ARG_NONNULL ((1)));
|
||||
# else
|
||||
_GL_FUNCDECL_RPL_1 (__printf__, int,
|
||||
|
@ -991,7 +1052,7 @@ _GL_CXXALIAS_RPL_1 (printf, __printf__, int, (const char *format, ...));
|
|||
# endif
|
||||
_GL_FUNCDECL_RPL (printf, int,
|
||||
(const char *restrict format, ...)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF (1, 2)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (1, 2)
|
||||
_GL_ARG_NONNULL ((1)));
|
||||
_GL_CXXALIAS_RPL (printf, int, (const char *restrict format, ...));
|
||||
# endif
|
||||
|
@ -1061,10 +1122,19 @@ _GL_CXXALIASWARN (puts);
|
|||
# endif
|
||||
#endif
|
||||
|
||||
/* 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__
|
||||
# undef putw
|
||||
# define putw _putw
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# undef putw
|
||||
# define putw _putw
|
||||
# endif
|
||||
_GL_CXXALIAS_MDA (putw, int, (int w, FILE *restrict stream));
|
||||
#else
|
||||
_GL_CXXALIAS_SYS (putw, int, (int w, FILE *restrict stream));
|
||||
#endif
|
||||
_GL_CXXALIASWARN (putw);
|
||||
|
||||
#if @GNULIB_REMOVE@
|
||||
# if @REPLACE_REMOVE@
|
||||
|
@ -1182,7 +1252,7 @@ _GL_CXXALIASWARN (scanf);
|
|||
_GL_FUNCDECL_RPL (snprintf, int,
|
||||
(char *restrict str, size_t size,
|
||||
const char *restrict format, ...)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF (3, 4)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 4)
|
||||
_GL_ARG_NONNULL ((3)));
|
||||
_GL_CXXALIAS_RPL (snprintf, int,
|
||||
(char *restrict str, size_t size,
|
||||
|
@ -1192,7 +1262,7 @@ _GL_CXXALIAS_RPL (snprintf, int,
|
|||
_GL_FUNCDECL_SYS (snprintf, int,
|
||||
(char *restrict str, size_t size,
|
||||
const char *restrict format, ...)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF (3, 4)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 4)
|
||||
_GL_ARG_NONNULL ((3)));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (snprintf, int,
|
||||
|
@ -1226,7 +1296,7 @@ _GL_WARN_ON_USE (snprintf, "snprintf is unportable - "
|
|||
# endif
|
||||
_GL_FUNCDECL_RPL (sprintf, int,
|
||||
(char *restrict str, const char *restrict format, ...)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
|
||||
_GL_ARG_NONNULL ((1, 2)));
|
||||
_GL_CXXALIAS_RPL (sprintf, int,
|
||||
(char *restrict str, const char *restrict format, ...));
|
||||
|
@ -1245,10 +1315,19 @@ _GL_WARN_ON_USE (sprintf, "sprintf is not always POSIX compliant - "
|
|||
"POSIX compliance");
|
||||
#endif
|
||||
|
||||
/* 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__
|
||||
# undef tempnam
|
||||
# define tempnam _tempnam
|
||||
# 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);
|
||||
|
||||
#if @GNULIB_TMPFILE@
|
||||
# if @REPLACE_TMPFILE@
|
||||
|
@ -1282,7 +1361,7 @@ _GL_WARN_ON_USE (tmpfile, "tmpfile is not usable on mingw - "
|
|||
# endif
|
||||
_GL_FUNCDECL_RPL (asprintf, int,
|
||||
(char **result, const char *format, ...)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
|
||||
_GL_ARG_NONNULL ((1, 2)));
|
||||
_GL_CXXALIAS_RPL (asprintf, int,
|
||||
(char **result, const char *format, ...));
|
||||
|
@ -1290,7 +1369,7 @@ _GL_CXXALIAS_RPL (asprintf, int,
|
|||
# if !@HAVE_VASPRINTF@
|
||||
_GL_FUNCDECL_SYS (asprintf, int,
|
||||
(char **result, const char *format, ...)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
|
||||
_GL_ARG_NONNULL ((1, 2)));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (asprintf, int,
|
||||
|
@ -1303,7 +1382,7 @@ _GL_CXXALIASWARN (asprintf);
|
|||
# endif
|
||||
_GL_FUNCDECL_RPL (vasprintf, int,
|
||||
(char **result, const char *format, va_list args)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
|
||||
_GL_ARG_NONNULL ((1, 2)));
|
||||
_GL_CXXALIAS_RPL (vasprintf, int,
|
||||
(char **result, const char *format, va_list args));
|
||||
|
@ -1311,7 +1390,7 @@ _GL_CXXALIAS_RPL (vasprintf, int,
|
|||
# if !@HAVE_VASPRINTF@
|
||||
_GL_FUNCDECL_SYS (vasprintf, int,
|
||||
(char **result, const char *format, va_list args)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
|
||||
_GL_ARG_NONNULL ((1, 2)));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (vasprintf, int,
|
||||
|
@ -1327,7 +1406,7 @@ _GL_CXXALIASWARN (vasprintf);
|
|||
# endif
|
||||
_GL_FUNCDECL_RPL (vdprintf, int,
|
||||
(int fd, const char *restrict format, va_list args)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
|
||||
_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));
|
||||
|
@ -1335,7 +1414,7 @@ _GL_CXXALIAS_RPL (vdprintf, int,
|
|||
# if !@HAVE_VDPRINTF@
|
||||
_GL_FUNCDECL_SYS (vdprintf, int,
|
||||
(int fd, const char *restrict format, va_list args)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
|
||||
_GL_ARG_NONNULL ((2)));
|
||||
# endif
|
||||
/* Need to cast, because on Solaris, the third parameter will likely be
|
||||
|
@ -1365,7 +1444,7 @@ _GL_WARN_ON_USE (vdprintf, "vdprintf is unportable - "
|
|||
_GL_FUNCDECL_RPL (vfprintf, int,
|
||||
(FILE *restrict fp,
|
||||
const char *restrict format, va_list args)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
|
||||
_GL_ARG_NONNULL ((1, 2)));
|
||||
# else
|
||||
_GL_FUNCDECL_RPL (vfprintf, int,
|
||||
|
@ -1432,7 +1511,7 @@ _GL_CXXALIASWARN (vfscanf);
|
|||
# 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 (1, 0)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (1, 0)
|
||||
_GL_ARG_NONNULL ((1)));
|
||||
# else
|
||||
_GL_FUNCDECL_RPL (vprintf, int, (const char *restrict format, va_list args)
|
||||
|
@ -1487,7 +1566,7 @@ _GL_CXXALIASWARN (vscanf);
|
|||
_GL_FUNCDECL_RPL (vsnprintf, int,
|
||||
(char *restrict str, size_t size,
|
||||
const char *restrict format, va_list args)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF (3, 0)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 0)
|
||||
_GL_ARG_NONNULL ((3)));
|
||||
_GL_CXXALIAS_RPL (vsnprintf, int,
|
||||
(char *restrict str, size_t size,
|
||||
|
@ -1497,7 +1576,7 @@ _GL_CXXALIAS_RPL (vsnprintf, int,
|
|||
_GL_FUNCDECL_SYS (vsnprintf, int,
|
||||
(char *restrict str, size_t size,
|
||||
const char *restrict format, va_list args)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF (3, 0)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 0)
|
||||
_GL_ARG_NONNULL ((3)));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (vsnprintf, int,
|
||||
|
@ -1523,7 +1602,7 @@ _GL_WARN_ON_USE (vsnprintf, "vsnprintf is unportable - "
|
|||
_GL_FUNCDECL_RPL (vsprintf, int,
|
||||
(char *restrict str,
|
||||
const char *restrict format, va_list args)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
|
||||
_GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
|
||||
_GL_ARG_NONNULL ((1, 2)));
|
||||
_GL_CXXALIAS_RPL (vsprintf, int,
|
||||
(char *restrict str,
|
||||
|
|
169
lib/stdlib.in.h
169
lib/stdlib.in.h
|
@ -53,8 +53,8 @@
|
|||
# include <sys/loadavg.h>
|
||||
#endif
|
||||
|
||||
/* Native Windows platforms declare mktemp() in <io.h>. */
|
||||
#if 0 && (defined _WIN32 && ! defined __CYGWIN__)
|
||||
/* Native Windows platforms declare _mktemp() in <io.h>. */
|
||||
#if defined _WIN32 && !defined __CYGWIN__
|
||||
# include <io.h>
|
||||
#endif
|
||||
|
||||
|
@ -149,6 +149,31 @@ _GL_WARN_ON_USE (_Exit, "_Exit is unportable - "
|
|||
#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_CXXALIAS_RPL (aligned_alloc, void *, (size_t alignment, size_t size));
|
||||
# else
|
||||
# if @HAVE_ALIGNED_ALLOC@
|
||||
_GL_CXXALIAS_SYS (aligned_alloc, void *, (size_t alignment, size_t size));
|
||||
# endif
|
||||
# endif
|
||||
# if @HAVE_ALIGNED_ALLOC@
|
||||
_GL_CXXALIASWARN (aligned_alloc);
|
||||
# endif
|
||||
#elif 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
|
||||
|
||||
#if @GNULIB_ATOLL@
|
||||
/* Parse a signed decimal integer.
|
||||
Returns the value of the integer. Errors are not detected. */
|
||||
|
@ -217,19 +242,86 @@ _GL_WARN_ON_USE (canonicalize_file_name,
|
|||
# endif
|
||||
#endif
|
||||
|
||||
/* 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__
|
||||
# undef ecvt
|
||||
# define ecvt _ecvt
|
||||
# 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
|
||||
|
||||
/* 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__
|
||||
# undef fcvt
|
||||
# define fcvt _fcvt
|
||||
# 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
|
||||
|
||||
#if @GNULIB_FREE_POSIX@
|
||||
# if @REPLACE_FREE@
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# undef free
|
||||
# define free rpl_free
|
||||
# endif
|
||||
_GL_FUNCDECL_RPL (free, void, (void *ptr));
|
||||
_GL_CXXALIAS_RPL (free, void, (void *ptr));
|
||||
# else
|
||||
_GL_CXXALIAS_SYS (free, void, (void *ptr));
|
||||
# endif
|
||||
# if __GLIBC__ >= 2
|
||||
_GL_CXXALIASWARN (free);
|
||||
# endif
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef free
|
||||
/* Assume free is always declared. */
|
||||
_GL_WARN_ON_USE (free, "free is not future POSIX compliant everywhere - "
|
||||
"use gnulib module free for portability");
|
||||
#endif
|
||||
|
||||
/* 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__
|
||||
# undef gcvt
|
||||
# define gcvt _gcvt
|
||||
# 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
|
||||
|
||||
#if @GNULIB_GETLOADAVG@
|
||||
|
@ -483,9 +575,47 @@ _GL_WARN_ON_USE (mkstemps, "mkstemps is unportable - "
|
|||
# endif
|
||||
#endif
|
||||
|
||||
/* 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__
|
||||
# undef mktemp
|
||||
# define mktemp _mktemp
|
||||
# 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);
|
||||
|
||||
/* Allocate memory with indefinite extent and specified alignment. */
|
||||
#if @GNULIB_POSIX_MEMALIGN@
|
||||
# if @REPLACE_POSIX_MEMALIGN@
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# undef posix_memalign
|
||||
# define posix_memalign rpl_posix_memalign
|
||||
# endif
|
||||
_GL_FUNCDECL_RPL (posix_memalign, int,
|
||||
(void **memptr, size_t alignment, size_t size)
|
||||
_GL_ARG_NONNULL ((1)));
|
||||
_GL_CXXALIAS_RPL (posix_memalign, int,
|
||||
(void **memptr, size_t alignment, size_t size));
|
||||
# else
|
||||
# if @HAVE_POSIX_MEMALIGN@
|
||||
_GL_CXXALIAS_SYS (posix_memalign, int,
|
||||
(void **memptr, size_t alignment, size_t size));
|
||||
# endif
|
||||
# endif
|
||||
# if @HAVE_POSIX_MEMALIGN@
|
||||
_GL_CXXALIASWARN (posix_memalign);
|
||||
# endif
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef posix_memalign
|
||||
# if HAVE_RAW_DECL_POSIX_MEMALIGN
|
||||
_GL_WARN_ON_USE (posix_memalign, "posix_memalign is not portable - "
|
||||
"use gnulib module posix_memalign for portability");
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if @GNULIB_POSIX_OPENPT@
|
||||
|
@ -576,9 +706,22 @@ _GL_CXXALIAS_MDA (putenv, int, (char *string));
|
|||
_GL_CXXALIAS_SYS (putenv, int, (char *string));
|
||||
# endif
|
||||
_GL_CXXALIASWARN (putenv);
|
||||
#elif defined _WIN32 && !defined __CYGWIN__
|
||||
# undef putenv
|
||||
# define putenv _putenv
|
||||
#else
|
||||
/* 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@
|
||||
|
|
|
@ -123,16 +123,28 @@ _GL_WARN_ON_USE (ffsll, "ffsll is not portable - use the ffsll module");
|
|||
#endif
|
||||
|
||||
|
||||
/* 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__
|
||||
# undef memccpy
|
||||
# define memccpy _memccpy
|
||||
# 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);
|
||||
|
||||
|
||||
/* 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)
|
||||
|
@ -413,9 +425,23 @@ _GL_CXXALIASWARN (strdup);
|
|||
_GL_WARN_ON_USE (strdup, "strdup is unportable - "
|
||||
"use gnulib module strdup for portability");
|
||||
# endif
|
||||
#elif defined _WIN32 && !defined __CYGWIN__
|
||||
# undef strdup
|
||||
# define strdup _strdup
|
||||
#else
|
||||
/* 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 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
|
||||
|
||||
/* Append no more than N characters from SRC onto DEST. */
|
||||
|
|
|
@ -36,7 +36,7 @@ rpl_symlink (char const *contents, char const *name)
|
|||
if (len && name[len - 1] == '/')
|
||||
{
|
||||
struct stat st;
|
||||
if (lstat (name, &st) == 0)
|
||||
if (lstat (name, &st) == 0 || errno == EOVERFLOW)
|
||||
errno = EEXIST;
|
||||
return -1;
|
||||
}
|
||||
|
|
|
@ -103,9 +103,16 @@
|
|||
/* 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 __UCLIBC__)
|
||||
#if !((defined __GLIBC__ || defined __CYGWIN__ || defined __KLIBC__) \
|
||||
&& !defined __UCLIBC__)
|
||||
# include <signal.h>
|
||||
#endif
|
||||
|
||||
|
|
|
@ -375,11 +375,11 @@ struct stat
|
|||
# define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH)
|
||||
#endif
|
||||
|
||||
/* S_IXUGO is a common extension to POSIX. */
|
||||
/* Although S_IXUGO and S_IRWXUGO are not specified by POSIX and are
|
||||
not implemented in GNU/Linux, some Gnulib-using apps use the macros. */
|
||||
#if !S_IXUGO
|
||||
# define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH)
|
||||
#endif
|
||||
|
||||
#ifndef S_IRWXUGO
|
||||
# define S_IRWXUGO (S_IRWXU | S_IRWXG | S_IRWXO)
|
||||
#endif
|
||||
|
@ -391,10 +391,20 @@ struct stat
|
|||
#endif
|
||||
|
||||
|
||||
/* 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__
|
||||
# undef chmod
|
||||
# define chmod _chmod
|
||||
# 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);
|
||||
|
||||
|
||||
#if @GNULIB_FCHMODAT@
|
||||
|
@ -808,10 +818,20 @@ _GL_WARN_ON_USE (stat, "stat is unportable - "
|
|||
#endif
|
||||
|
||||
|
||||
/* 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__
|
||||
# undef umask
|
||||
# define umask _umask
|
||||
# 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);
|
||||
|
||||
|
||||
#if @GNULIB_UTIMENSAT@
|
||||
|
|
|
@ -47,9 +47,11 @@
|
|||
#include <string.h>
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <stdalign.h>
|
||||
#include <stdint.h>
|
||||
#include <sys/random.h>
|
||||
#include <sys/stat.h>
|
||||
#include <time.h>
|
||||
|
||||
#if _LIBC
|
||||
# define struct_stat64 struct stat64
|
||||
|
@ -60,27 +62,33 @@
|
|||
# define __mkdir mkdir
|
||||
# define __open open
|
||||
# define __lxstat64(version, file, buf) lstat (file, buf)
|
||||
# define __getrandom getrandom
|
||||
# define __clock_gettime64 clock_gettime
|
||||
# define __timespec64 timespec
|
||||
#endif
|
||||
|
||||
#ifdef _LIBC
|
||||
# include <random-bits.h>
|
||||
# define RANDOM_BITS(Var) ((Var) = random_bits ())
|
||||
typedef uint32_t random_value;
|
||||
# define RANDOM_VALUE_MAX UINT32_MAX
|
||||
# define BASE_62_DIGITS 5 /* 62**5 < UINT32_MAX */
|
||||
# define BASE_62_POWER (62 * 62 * 62 * 62 * 62) /* 2**BASE_62_DIGITS */
|
||||
#else
|
||||
/* Use getrandom if it works, falling back on a 64-bit linear
|
||||
congruential generator that starts with whatever Var's value
|
||||
happens to be. */
|
||||
# define RANDOM_BITS(Var) \
|
||||
((void) (getrandom (&(Var), sizeof (Var), 0) == sizeof (Var) \
|
||||
|| ((Var) = 2862933555777941757 * (Var) + 3037000493)))
|
||||
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)
|
||||
#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)
|
||||
|
||||
static random_value
|
||||
random_bits (random_value var)
|
||||
{
|
||||
random_value r;
|
||||
if (__getrandom (&r, sizeof r, 0) == sizeof r)
|
||||
return r;
|
||||
#if _LIBC || (defined CLOCK_MONOTONIC && HAVE_CLOCK_GETTIME)
|
||||
/* Add entropy if getrandom is not supported. */
|
||||
struct __timespec64 tv;
|
||||
__clock_gettime64 (CLOCK_MONOTONIC, &tv);
|
||||
var ^= tv.tv_nsec;
|
||||
#endif
|
||||
return 2862933555777941757 * var + 3037000493;
|
||||
}
|
||||
|
||||
#if _LIBC
|
||||
/* Return nonzero if DIR is an existent directory. */
|
||||
|
@ -250,8 +258,11 @@ try_tempname_len (char *tmpl, int suffixlen, void *args,
|
|||
unsigned int attempts = ATTEMPTS_MIN;
|
||||
#endif
|
||||
|
||||
/* A random variable. */
|
||||
random_value v;
|
||||
/* A random variable. The initial value is used only the for fallback path
|
||||
on 'random_bits' on 'getrandom' failure. Its initial value tries to use
|
||||
some entropy from the ASLR and ignore possible bits from the stack
|
||||
alignment. */
|
||||
random_value v = ((uintptr_t) &v) / alignof (max_align_t);
|
||||
|
||||
/* How many random base-62 digits can currently be extracted from V. */
|
||||
int vdigits = 0;
|
||||
|
@ -279,7 +290,7 @@ try_tempname_len (char *tmpl, int suffixlen, void *args,
|
|||
if (vdigits == 0)
|
||||
{
|
||||
do
|
||||
RANDOM_BITS (v);
|
||||
v = random_bits (v);
|
||||
while (unfair_min <= v);
|
||||
|
||||
vdigits = BASE_62_DIGITS;
|
||||
|
|
|
@ -145,9 +145,20 @@ _GL_CXXALIAS_MDA (tzset, void, (void));
|
|||
_GL_CXXALIAS_SYS (tzset, void, (void));
|
||||
# endif
|
||||
_GL_CXXALIASWARN (tzset);
|
||||
# elif defined _WIN32 && !defined __CYGWIN__
|
||||
# undef tzset
|
||||
# define tzset _tzset
|
||||
# else
|
||||
/* 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. */
|
||||
|
@ -356,17 +367,17 @@ _GL_WARN_ON_USE (asctime, "asctime can overrun buffers in some cases - "
|
|||
# endif
|
||||
# if defined GNULIB_POSIXCHECK
|
||||
# undef asctime_r
|
||||
_GL_WARN_ON_USE (asctime, "asctime_r can overrun buffers in some cases - "
|
||||
_GL_WARN_ON_USE (asctime_r, "asctime_r can overrun buffers in some cases - "
|
||||
"better use strftime (or even sprintf) instead");
|
||||
# endif
|
||||
# if defined GNULIB_POSIXCHECK
|
||||
# undef ctime
|
||||
_GL_WARN_ON_USE (asctime, "ctime can overrun buffers in some cases - "
|
||||
_GL_WARN_ON_USE (ctime, "ctime can overrun buffers in some cases - "
|
||||
"better use strftime (or even sprintf) instead");
|
||||
# endif
|
||||
# if defined GNULIB_POSIXCHECK
|
||||
# undef ctime_r
|
||||
_GL_WARN_ON_USE (asctime, "ctime_r can overrun buffers in some cases - "
|
||||
_GL_WARN_ON_USE (ctime_r, "ctime_r can overrun buffers in some cases - "
|
||||
"better use strftime (or even sprintf) instead");
|
||||
# endif
|
||||
|
||||
|
|
|
@ -27,19 +27,15 @@
|
|||
#include <time.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "flexmember.h"
|
||||
#include "idx.h"
|
||||
#include "time-internal.h"
|
||||
|
||||
#ifndef SIZE_MAX
|
||||
# define SIZE_MAX ((size_t) -1)
|
||||
#endif
|
||||
|
||||
/* 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 };
|
||||
|
@ -125,14 +121,8 @@ save_abbr (timezone_t tz, struct tm *tm)
|
|||
{
|
||||
if (! (*zone_copy || (zone_copy == tz->abbrs && tz->tz_is_set)))
|
||||
{
|
||||
size_t zone_size = strlen (zone) + 1;
|
||||
size_t zone_used = zone_copy - tz->abbrs;
|
||||
if (SIZE_MAX - zone_used < zone_size)
|
||||
{
|
||||
errno = ENOMEM;
|
||||
return false;
|
||||
}
|
||||
if (zone_used + zone_size < ABBR_SIZE_MIN)
|
||||
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
|
||||
{
|
||||
|
|
386
lib/unistd.in.h
386
lib/unistd.in.h
|
@ -93,20 +93,18 @@
|
|||
# undef __need_system_stdlib_h
|
||||
#endif
|
||||
|
||||
/* Native Windows platforms declare chdir, getcwd, rmdir in
|
||||
/* Native Windows platforms declare _chdir, _getcwd, _rmdir in
|
||||
<io.h> and/or <direct.h>, not in <unistd.h>.
|
||||
They also declare access(), chmod(), close(), dup(), dup2(), isatty(),
|
||||
lseek(), read(), unlink(), write() in <io.h>. */
|
||||
#if ((@GNULIB_CHDIR@ || @GNULIB_GETCWD@ || @GNULIB_RMDIR@ \
|
||||
|| defined GNULIB_POSIXCHECK) \
|
||||
&& (defined _WIN32 && ! defined __CYGWIN__))
|
||||
# include <io.h> /* mingw32, mingw64 */
|
||||
# include <direct.h> /* mingw64, MSVC 9 */
|
||||
#elif (@GNULIB_CLOSE@ || @GNULIB_DUP@ || @GNULIB_DUP2@ || @GNULIB_ISATTY@ \
|
||||
|| @GNULIB_LSEEK@ || @GNULIB_READ@ || @GNULIB_UNLINK@ || @GNULIB_WRITE@ \
|
||||
|| defined GNULIB_POSIXCHECK) \
|
||||
&& (defined _WIN32 && ! defined __CYGWIN__)
|
||||
They also declare _access(), _chmod(), _close(), _dup(), _dup2(), _isatty(),
|
||||
_lseek(), _read(), _unlink(), _write() in <io.h>. */
|
||||
#if defined _WIN32 && !defined __CYGWIN__
|
||||
# include <io.h>
|
||||
# include <direct.h>
|
||||
#endif
|
||||
|
||||
/* Native Windows platforms declare _execl*, _execv* in <process.h>. */
|
||||
#if defined _WIN32 && !defined __CYGWIN__
|
||||
# include <process.h>
|
||||
#endif
|
||||
|
||||
/* AIX and OSF/1 5.1 declare getdomainname in <netdb.h>, not in <unistd.h>.
|
||||
|
@ -138,11 +136,8 @@
|
|||
|
||||
/* MSVC defines off_t in <sys/types.h>.
|
||||
May also define off_t to a 64-bit type on native Windows. */
|
||||
/* But avoid namespace pollution on glibc systems. */
|
||||
#ifndef __GLIBC__
|
||||
/* Get off_t, ssize_t. */
|
||||
# include <sys/types.h>
|
||||
#endif
|
||||
/* Get off_t, ssize_t, mode_t. */
|
||||
#include <sys/types.h>
|
||||
|
||||
/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
|
||||
|
||||
|
@ -292,9 +287,20 @@ _GL_WARN_ON_USE (access, "access does not always support X_OK - "
|
|||
"also, this function is a security risk - "
|
||||
"use the gnulib module faccessat instead");
|
||||
# endif
|
||||
#elif defined _WIN32 && !defined __CYGWIN__
|
||||
# undef access
|
||||
# define access _access
|
||||
#else
|
||||
/* 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
|
||||
|
||||
|
||||
|
@ -315,9 +321,20 @@ _GL_CXXALIASWARN (chdir);
|
|||
_GL_WARN_ON_USE (chown, "chdir is not always in <unistd.h> - "
|
||||
"use gnulib module chdir for portability");
|
||||
# endif
|
||||
#elif defined _WIN32 && !defined __CYGWIN__
|
||||
# undef chdir
|
||||
# define chdir _chdir
|
||||
#else
|
||||
/* 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
|
||||
|
||||
|
||||
|
@ -380,9 +397,20 @@ _GL_CXXALIASWARN (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 defined _WIN32 && !defined __CYGWIN__
|
||||
# undef close
|
||||
# define close _close
|
||||
#else
|
||||
/* 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
|
||||
|
||||
|
||||
|
@ -397,10 +425,11 @@ _GL_CXXALIAS_SYS (copy_file_range, ssize_t, (int ifd, off_t *ipos,
|
|||
# endif
|
||||
_GL_CXXALIASWARN (copy_file_range);
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
/* Assume copy_file_range is always declared. */
|
||||
# if HAVE_RAW_DECL_COPY_FILE_RANGE
|
||||
_GL_WARN_ON_USE (copy_file_range,
|
||||
"copy_file_range is unportable - "
|
||||
"use gnulib module copy_file_range for portability");
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -427,9 +456,20 @@ _GL_CXXALIASWARN (dup);
|
|||
_GL_WARN_ON_USE (dup, "dup is unportable - "
|
||||
"use gnulib module dup for portability");
|
||||
# endif
|
||||
#elif defined _WIN32 && !defined __CYGWIN__
|
||||
# undef dup
|
||||
# define dup _dup
|
||||
#else
|
||||
/* 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
|
||||
|
||||
|
||||
|
@ -461,9 +501,20 @@ _GL_CXXALIASWARN (dup2);
|
|||
_GL_WARN_ON_USE (dup2, "dup2 is unportable - "
|
||||
"use gnulib module dup2 for portability");
|
||||
# endif
|
||||
#elif defined _WIN32 && !defined __CYGWIN__
|
||||
# undef dup2
|
||||
# define dup2 _dup2
|
||||
#else
|
||||
/* 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
|
||||
|
||||
|
||||
|
@ -564,40 +615,116 @@ _GL_WARN_ON_USE (euidaccess, "euidaccess is unportable - "
|
|||
#endif
|
||||
|
||||
|
||||
/* 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__
|
||||
# undef execl
|
||||
# define execl _execl
|
||||
# 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);
|
||||
|
||||
/* 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__
|
||||
# undef execle
|
||||
# define execle _execle
|
||||
# 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);
|
||||
|
||||
/* 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__
|
||||
# undef execlp
|
||||
# define execlp _execlp
|
||||
# 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);
|
||||
|
||||
|
||||
/* 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__
|
||||
# undef execv
|
||||
# define execv _execv
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# undef execv
|
||||
# define execv _execv
|
||||
# endif
|
||||
_GL_CXXALIAS_MDA (execv, intptr_t,
|
||||
(const char *program, const char * const *argv));
|
||||
#else
|
||||
_GL_CXXALIAS_SYS (execv, int, (const char *program, char * const *argv));
|
||||
#endif
|
||||
_GL_CXXALIASWARN (execv);
|
||||
|
||||
/* 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__
|
||||
# undef execve
|
||||
# define execve _execve
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# undef execve
|
||||
# define execve _execve
|
||||
# endif
|
||||
_GL_CXXALIAS_MDA (execve, intptr_t,
|
||||
(const char *program, const char * const *argv,
|
||||
const char * const *env));
|
||||
#else
|
||||
_GL_CXXALIAS_SYS (execve, int,
|
||||
(const char *program, char * const *argv, char * const *env));
|
||||
#endif
|
||||
_GL_CXXALIASWARN (execve);
|
||||
|
||||
/* 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__
|
||||
# undef execvp
|
||||
# define execvp _execvp
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# undef execvp
|
||||
# define execvp _execvp
|
||||
# endif
|
||||
_GL_CXXALIAS_MDA (execvp, intptr_t,
|
||||
(const char *program, const char * const *argv));
|
||||
#else
|
||||
_GL_CXXALIAS_SYS (execvp, int, (const char *program, char * const *argv));
|
||||
#endif
|
||||
_GL_CXXALIASWARN (execvp);
|
||||
|
||||
/* 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__
|
||||
# undef execvpe
|
||||
# define execvpe _execvpe
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# undef execvpe
|
||||
# define execvpe _execvpe
|
||||
# endif
|
||||
_GL_CXXALIAS_MDA (execvpe, intptr_t,
|
||||
(const char *program, const char * const *argv,
|
||||
const char * const *env));
|
||||
#else
|
||||
# if @HAVE_DECL_EXECVPE@
|
||||
_GL_CXXALIAS_SYS (execvpe, int,
|
||||
(const char *program, char * const *argv, char * const *env));
|
||||
# endif
|
||||
#endif
|
||||
#if (defined _WIN32 && !defined __CYGWIN__) || @HAVE_DECL_EXECVPE@
|
||||
_GL_CXXALIASWARN (execvpe);
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -794,9 +921,22 @@ _GL_CXXALIASWARN (getcwd);
|
|||
_GL_WARN_ON_USE (getcwd, "getcwd is unportable - "
|
||||
"use gnulib module getcwd for portability");
|
||||
# endif
|
||||
#elif defined _WIN32 && !defined __CYGWIN__
|
||||
# undef getcwd
|
||||
# define getcwd _getcwd
|
||||
#else
|
||||
/* 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
|
||||
|
||||
|
||||
|
@ -1131,10 +1271,19 @@ _GL_WARN_ON_USE (getpass, "getpass is unportable - "
|
|||
#endif
|
||||
|
||||
|
||||
/* 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__
|
||||
# undef getpid
|
||||
# define getpid _getpid
|
||||
# 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);
|
||||
|
||||
|
||||
#if @GNULIB_GETUSERSHELL@
|
||||
|
@ -1225,9 +1374,20 @@ _GL_CXXALIASWARN (isatty);
|
|||
_GL_WARN_ON_USE (isatty, "isatty has portability problems on native Windows - "
|
||||
"use gnulib module isatty for portability");
|
||||
# endif
|
||||
#elif defined _WIN32 && !defined __CYGWIN__
|
||||
# undef isatty
|
||||
# define isatty _isatty
|
||||
#else
|
||||
/* 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
|
||||
|
||||
|
||||
|
@ -1355,9 +1515,20 @@ _GL_CXXALIASWARN (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 defined _WIN32 && !defined __CYGWIN__
|
||||
# undef lseek
|
||||
# define lseek _lseek
|
||||
#else
|
||||
/* 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
|
||||
|
||||
|
||||
|
@ -1497,15 +1668,27 @@ _GL_CXXALIAS_RPL (read, ssize_t, (int fd, void *buf, size_t count));
|
|||
# endif
|
||||
_GL_CXXALIAS_MDA (read, ssize_t, (int fd, void *buf, size_t count));
|
||||
# else
|
||||
/* Need to cast, because on mingw, the third parameter is
|
||||
unsigned int count
|
||||
and the return type is 'int'. */
|
||||
_GL_CXXALIAS_SYS_CAST (read, ssize_t, (int fd, void *buf, size_t count));
|
||||
_GL_CXXALIAS_SYS (read, ssize_t, (int fd, void *buf, size_t count));
|
||||
# endif
|
||||
_GL_CXXALIASWARN (read);
|
||||
#else
|
||||
/* 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);
|
||||
#elif defined _WIN32 && !defined __CYGWIN__
|
||||
# undef read
|
||||
# define read _read
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -1604,9 +1787,20 @@ _GL_CXXALIASWARN (rmdir);
|
|||
_GL_WARN_ON_USE (rmdir, "rmdir is unportable - "
|
||||
"use gnulib module rmdir for portability");
|
||||
# endif
|
||||
#elif defined _WIN32 && !defined __CYGWIN__
|
||||
# undef rmdir
|
||||
# define rmdir _rmdir
|
||||
#else
|
||||
/* 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
|
||||
|
||||
|
||||
|
@ -1665,10 +1859,19 @@ _GL_WARN_ON_USE (sleep, "sleep is unportable - "
|
|||
#endif
|
||||
|
||||
|
||||
/* 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::creat always. */
|
||||
#if defined _WIN32 && !defined __CYGWIN__
|
||||
# undef swab
|
||||
# define swab _swab
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# undef swab
|
||||
# define swab _swab
|
||||
# endif
|
||||
_GL_CXXALIAS_MDA (swab, void, (char *from, char *to, int n));
|
||||
#else
|
||||
_GL_CXXALIAS_SYS (swab, void, (const void *from, void *to, ssize_t n));
|
||||
#endif
|
||||
_GL_CXXALIASWARN (swab);
|
||||
|
||||
|
||||
#if @GNULIB_SYMLINK@
|
||||
|
@ -1811,9 +2014,20 @@ _GL_CXXALIASWARN (unlink);
|
|||
_GL_WARN_ON_USE (unlink, "unlink is not portable - "
|
||||
"use gnulib module unlink for portability");
|
||||
# endif
|
||||
#elif defined _WIN32 && !defined __CYGWIN__
|
||||
# undef unlink
|
||||
# define unlink _unlink
|
||||
#else
|
||||
/* 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
|
||||
|
||||
|
||||
|
@ -1892,15 +2106,27 @@ _GL_CXXALIAS_RPL (write, ssize_t, (int fd, const void *buf, size_t count));
|
|||
# endif
|
||||
_GL_CXXALIAS_MDA (write, ssize_t, (int fd, const void *buf, size_t count));
|
||||
# else
|
||||
/* Need to cast, because on mingw, the third parameter is
|
||||
unsigned int count
|
||||
and the return type is 'int'. */
|
||||
_GL_CXXALIAS_SYS_CAST (write, ssize_t, (int fd, const void *buf, size_t count));
|
||||
_GL_CXXALIAS_SYS (write, ssize_t, (int fd, const void *buf, size_t count));
|
||||
# endif
|
||||
_GL_CXXALIASWARN (write);
|
||||
#else
|
||||
/* 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);
|
||||
#elif defined _WIN32 && !defined __CYGWIN__
|
||||
# undef write
|
||||
# define write _write
|
||||
#endif
|
||||
|
||||
_GL_INLINE_HEADER_END
|
||||
|
|
|
@ -41,7 +41,7 @@ typedef size_t __xalloc_count_type;
|
|||
positive and N must be nonnegative. This is a macro, not a
|
||||
function, so that it works correctly even when SIZE_MAX < N. */
|
||||
|
||||
#if 7 <= __GNUC__
|
||||
#if 7 <= __GNUC__ && !defined __clang__
|
||||
# define xalloc_oversized(n, s) \
|
||||
__builtin_mul_overflow_p (n, s, (__xalloc_count_type) 1)
|
||||
#elif 5 <= __GNUC__ && !defined __ICC && !__STRICT_ANSI__
|
||||
|
|
|
@ -2408,23 +2408,51 @@ MODE can be \"login\" or \"password\"."
|
|||
(list user password auth-info)))
|
||||
|
||||
;;; Tiny mode for editing .netrc/.authinfo modes (that basically just
|
||||
;;; hides passwords).
|
||||
;;; hides passwords and adds basic syntax highlighting).
|
||||
|
||||
(defcustom authinfo-hidden "password"
|
||||
"Regexp matching elements in .authinfo/.netrc files that should be hidden."
|
||||
:type 'regexp
|
||||
:version "27.1")
|
||||
|
||||
(defcustom authinfo-hide-elements t
|
||||
"Whether to use `authinfo-hidden' to hide elements in authinfo files."
|
||||
:type 'boolean
|
||||
:version "28.1")
|
||||
|
||||
(defvar authinfo--keywords
|
||||
'(("^#.*" . font-lock-comment-face)
|
||||
("^\\(machine\\)[ \t]+\\([^ \t\n]+\\)"
|
||||
(1 font-lock-variable-name-face)
|
||||
(2 font-lock-builtin-face))
|
||||
("\\(login\\)[ \t]+\\([^ \t\n]+\\)"
|
||||
(1 font-lock-comment-delimiter-face)
|
||||
(2 font-lock-keyword-face))
|
||||
("\\(password\\)[ \t]+\\([^ \t\n]+\\)"
|
||||
(1 font-lock-comment-delimiter-face)
|
||||
(2 font-lock-doc-face))
|
||||
("\\(port\\)[ \t]+\\([^ \t\n]+\\)"
|
||||
(1 font-lock-comment-delimiter-face)
|
||||
(2 font-lock-type-face))
|
||||
("\\([^ \t\n]+\\)[, \t]+\\([^ \t\n]+\\)"
|
||||
(1 font-lock-constant-face)
|
||||
(2 nil))))
|
||||
|
||||
;;;###autoload
|
||||
(define-derived-mode authinfo-mode fundamental-mode "Authinfo"
|
||||
"Mode for editing .authinfo/.netrc files.
|
||||
|
||||
This is just like `fundamental-mode', but hides passwords. The
|
||||
passwords are revealed when point moved into the password.
|
||||
This is just like `fundamental-mode', but has basic syntax
|
||||
highlighting and hides passwords. Passwords are revealed when
|
||||
point is moved into the passwords (see `authinfo-hide-elements').
|
||||
|
||||
\\{authinfo-mode-map}"
|
||||
(authinfo--hide-passwords (point-min) (point-max))
|
||||
(reveal-mode))
|
||||
(font-lock-add-keywords nil authinfo--keywords)
|
||||
(setq-local comment-start "#")
|
||||
(setq-local comment-end "")
|
||||
(when authinfo-hide-elements
|
||||
(authinfo--hide-passwords (point-min) (point-max))
|
||||
(reveal-mode)))
|
||||
|
||||
(defun authinfo--hide-passwords (start end)
|
||||
(save-excursion
|
||||
|
@ -2436,14 +2464,15 @@ passwords are revealed when point moved into the password.
|
|||
nil t)
|
||||
(when (auth-source-netrc-looking-at-token)
|
||||
(let ((overlay (make-overlay (match-beginning 0) (match-end 0))))
|
||||
(overlay-put overlay 'display (propertize "****"
|
||||
'face 'warning))
|
||||
(overlay-put overlay 'display
|
||||
(propertize "****" 'face 'font-lock-doc-face))
|
||||
(overlay-put overlay 'reveal-toggle-invisible
|
||||
#'authinfo--toggle-display)))))))
|
||||
|
||||
(defun authinfo--toggle-display (overlay hide)
|
||||
(if hide
|
||||
(overlay-put overlay 'display (propertize "****" 'face 'warning))
|
||||
(overlay-put overlay 'display
|
||||
(propertize "****" 'face 'font-lock-doc-face))
|
||||
(overlay-put overlay 'display nil)))
|
||||
|
||||
(provide 'auth-source)
|
||||
|
|
|
@ -2745,9 +2745,10 @@ section in the category moved to."
|
|||
(setq ov (make-overlay (save-excursion (todo-item-start))
|
||||
(save-excursion (todo-item-end))))
|
||||
(overlay-put ov 'face 'todo-search))
|
||||
(let* ((pl (if (and marked (> (cdr marked) 1)) "s" ""))
|
||||
(cat+file (todo-read-category (concat "Move item" pl
|
||||
" to category: ")
|
||||
(let* ((num (if (not marked) 1 (cdr marked)))
|
||||
(cat+file (todo-read-category
|
||||
(ngettext "Move item to category: "
|
||||
"Move items to category: " num)
|
||||
nil file)))
|
||||
(while (and (equal (car cat+file) cat1)
|
||||
(equal (cdr cat+file) file1))
|
||||
|
@ -2974,7 +2975,7 @@ comments without asking."
|
|||
(interactive)
|
||||
(let* ((cat (todo-current-category))
|
||||
(marked (assoc cat todo-categories-with-marks))
|
||||
(pl (if (and marked (> (cdr marked) 1)) "s" "")))
|
||||
(num (if (not marked) 1 (cdr marked))))
|
||||
(when (or marked (todo-done-item-p))
|
||||
(let ((buffer-read-only)
|
||||
(opoint (point))
|
||||
|
@ -2982,6 +2983,9 @@ comments without asking."
|
|||
(first 'first)
|
||||
(item-count 0)
|
||||
(diary-count 0)
|
||||
(omit-prompt (ngettext "Omit comment from restored item? "
|
||||
"Omit comments from restored items? "
|
||||
num))
|
||||
start end item ov npoint undone)
|
||||
(and marked (goto-char (point-min)))
|
||||
(catch 'done
|
||||
|
@ -3013,10 +3017,7 @@ comments without asking."
|
|||
(if (eq first 'first)
|
||||
(setq first
|
||||
(if (eq todo-undo-item-omit-comment 'ask)
|
||||
(when (todo-y-or-n-p
|
||||
(concat "Omit comment" pl
|
||||
" from restored item"
|
||||
pl "? "))
|
||||
(when (todo-y-or-n-p omit-prompt)
|
||||
'omit)
|
||||
(when todo-undo-item-omit-comment 'omit)))
|
||||
t)
|
||||
|
@ -5782,11 +5783,13 @@ have been removed."
|
|||
(delete f todo-category-completions-files))
|
||||
(push f deleted)))
|
||||
(when deleted
|
||||
(let ((pl (> (length deleted) 1))
|
||||
(let ((ndeleted (length deleted))
|
||||
(names (mapconcat (lambda (f) (concat "\"" f "\"")) deleted ", ")))
|
||||
(message (concat "File" (if pl "s" "") " %s ha" (if pl "ve" "s")
|
||||
" been deleted and removed from\n"
|
||||
"the list of category completion files")
|
||||
(message (concat
|
||||
(ngettext "File %s has been deleted and removed from\n"
|
||||
"Files %s have been deleted and removed from\n"
|
||||
ndeleted)
|
||||
"the list of category completion files")
|
||||
names))
|
||||
(put 'todo-category-completions-files 'custom-type
|
||||
`(set ,@(todo--files-type-list)))
|
||||
|
|
|
@ -1169,7 +1169,9 @@
|
|||
hash-table-count
|
||||
int-to-string intern-soft isnan
|
||||
keymap-parent
|
||||
lax-plist-get ldexp length line-beginning-position line-end-position
|
||||
lax-plist-get ldexp
|
||||
length length< length> length=
|
||||
line-beginning-position line-end-position
|
||||
local-variable-if-set-p local-variable-p locale-info
|
||||
log log10 logand logb logcount logior lognot logxor lsh
|
||||
make-byte-code make-list make-string make-symbol marker-buffer max
|
||||
|
|
|
@ -592,7 +592,7 @@ already is one.)"
|
|||
"A list of entries associating symbols with buffer regions.
|
||||
Each entry is an `edebug--form-data' struct with fields:
|
||||
SYMBOL, BEGIN-MARKER, and END-MARKER. The markers
|
||||
are at the beginning and end of an entry level form and SYMBOL is
|
||||
are at the beginning and end of an instrumented form and SYMBOL is
|
||||
a symbol that holds all edebug related information for the form on its
|
||||
property list.
|
||||
|
||||
|
|
|
@ -394,7 +394,70 @@ The search is done in the source for library LIBRARY."
|
|||
(progn
|
||||
(beginning-of-line)
|
||||
(cons (current-buffer) (point)))
|
||||
(cons (current-buffer) nil)))))))))
|
||||
;; If the regexp search didn't find the location of
|
||||
;; the symbol (for example, because it is generated by
|
||||
;; a macro), try a slightly more expensive search that
|
||||
;; expands macros until it finds the symbol.
|
||||
(cons (current-buffer)
|
||||
(find-function--search-by-expanding-macros
|
||||
(current-buffer) symbol type))))))))))
|
||||
|
||||
(defun find-function--try-macroexpand (form)
|
||||
"Try to macroexpand FORM in full or partially.
|
||||
This is a best-effort operation in which if macroexpansion fails,
|
||||
this function returns FORM as is."
|
||||
(ignore-errors
|
||||
(or
|
||||
(macroexpand-all form)
|
||||
(macroexpand-1 form)
|
||||
form)))
|
||||
|
||||
(defun find-function--any-subform-p (form pred)
|
||||
"Walk FORM and apply PRED to its subexpressions.
|
||||
Return t if any PRED returns t."
|
||||
(cond
|
||||
((not (consp form)) nil)
|
||||
((funcall pred form) t)
|
||||
(t
|
||||
(cl-destructuring-bind (left-child . right-child) form
|
||||
(or
|
||||
(find-function--any-subform-p left-child pred)
|
||||
(find-function--any-subform-p right-child pred))))))
|
||||
|
||||
(defun find-function--search-by-expanding-macros (buf symbol type)
|
||||
"Expand macros in BUF to search for the definition of SYMBOL of TYPE."
|
||||
(catch 'found
|
||||
(with-current-buffer buf
|
||||
(save-excursion
|
||||
(goto-char (point-min))
|
||||
(condition-case nil
|
||||
(while t
|
||||
(let ((form (read (current-buffer)))
|
||||
(expected-symbol-p
|
||||
(lambda (form)
|
||||
(cond
|
||||
((null type)
|
||||
;; Check if a given form is a `defalias' to
|
||||
;; SYM, the function name we are searching
|
||||
;; for. All functions in Emacs Lisp
|
||||
;; ultimately expand to a `defalias' form
|
||||
;; after several steps of macroexpansion.
|
||||
(and (eq (car-safe form) 'defalias)
|
||||
(equal (car-safe (cdr form))
|
||||
`(quote ,symbol))))
|
||||
((eq type 'defvar)
|
||||
;; Variables generated by macros ultimately
|
||||
;; expand to `defvar'.
|
||||
(and (eq (car-safe form) 'defvar)
|
||||
(eq (car-safe (cdr form)) symbol)))
|
||||
(t nil)))))
|
||||
(when (find-function--any-subform-p
|
||||
(find-function--try-macroexpand form)
|
||||
expected-symbol-p)
|
||||
;; We want to return the location at the beginning
|
||||
;; of the macro, so move back one sexp.
|
||||
(throw 'found (progn (backward-sexp) (point))))))
|
||||
(end-of-file nil))))))
|
||||
|
||||
(defun find-function-library (function &optional lisp-only verbose)
|
||||
"Return the pair (ORIG-FUNCTION . LIBRARY) for FUNCTION.
|
||||
|
|
|
@ -208,6 +208,7 @@ a section."
|
|||
(when start
|
||||
(save-excursion
|
||||
(goto-char start)
|
||||
(looking-at outline-regexp)
|
||||
(let ((level (lisp-outline-level))
|
||||
(case-fold-search t)
|
||||
next-section-found)
|
||||
|
@ -218,6 +219,7 @@ a section."
|
|||
nil t))
|
||||
(> (save-excursion
|
||||
(beginning-of-line)
|
||||
(looking-at outline-regexp)
|
||||
(lisp-outline-level))
|
||||
level)))
|
||||
(min (if next-section-found
|
||||
|
|
|
@ -204,7 +204,9 @@ by counted more than once."
|
|||
(cl-incf total (memory-report--object-size counted (car value))))
|
||||
(if (cdr value)
|
||||
(if (consp (cdr value))
|
||||
(setq value (cdr value))
|
||||
(if (gethash (cdr value) counted)
|
||||
(setq value nil)
|
||||
(setq value (cdr value)))
|
||||
(cl-incf total (memory-report--object-size counted (cdr value)))
|
||||
(setq value nil))
|
||||
(setq value nil)))
|
||||
|
|
|
@ -831,40 +831,45 @@ correspond to previously loaded files (those returned by
|
|||
|
||||
(declare-function find-library-name "find-func" (library))
|
||||
|
||||
(defun package--files-load-history ()
|
||||
(delq nil
|
||||
(mapcar (lambda (x)
|
||||
(let ((f (car x)))
|
||||
(and (stringp f)
|
||||
(file-name-sans-extension (file-truename f)))))
|
||||
load-history)))
|
||||
|
||||
(defun package--list-of-conflicts (dir history)
|
||||
(delq
|
||||
nil
|
||||
(mapcar
|
||||
(lambda (x) (let* ((file (file-relative-name x dir))
|
||||
;; Previously loaded file, if any.
|
||||
(previous
|
||||
(ignore-errors
|
||||
(file-name-sans-extension
|
||||
(file-truename (find-library-name file)))))
|
||||
(pos (when previous (member previous history))))
|
||||
;; Return (RELATIVE-FILENAME . HISTORY-POSITION)
|
||||
(when pos
|
||||
(cons (file-name-sans-extension file) (length pos)))))
|
||||
(directory-files-recursively dir "\\`[^\\.].*\\.el\\'"))))
|
||||
|
||||
(defun package--list-loaded-files (dir)
|
||||
"Recursively list all files in DIR which correspond to loaded features.
|
||||
Returns the `file-name-sans-extension' of each file, relative to
|
||||
DIR, sorted by most recently loaded last."
|
||||
(let* ((history (delq nil
|
||||
(mapcar (lambda (x)
|
||||
(let ((f (car x)))
|
||||
(and (stringp f)
|
||||
(file-name-sans-extension f))))
|
||||
load-history)))
|
||||
(let* ((history (package--files-load-history))
|
||||
(dir (file-truename dir))
|
||||
;; List all files that have already been loaded.
|
||||
(list-of-conflicts
|
||||
(delq
|
||||
nil
|
||||
(mapcar
|
||||
(lambda (x) (let* ((file (file-relative-name x dir))
|
||||
;; Previously loaded file, if any.
|
||||
(previous
|
||||
(ignore-errors
|
||||
(file-name-sans-extension
|
||||
(file-truename (find-library-name file)))))
|
||||
(pos (when previous (member previous history))))
|
||||
;; Return (RELATIVE-FILENAME . HISTORY-POSITION)
|
||||
(when pos
|
||||
(cons (file-name-sans-extension file) (length pos)))))
|
||||
(directory-files-recursively dir "\\`[^\\.].*\\.el\\'")))))
|
||||
(list-of-conflicts (package--list-of-conflicts dir history)))
|
||||
;; Turn the list of (FILENAME . POS) back into a list of features. Files in
|
||||
;; subdirectories are returned relative to DIR (so not actually features).
|
||||
(let ((default-directory (file-name-as-directory dir)))
|
||||
(mapcar (lambda (x) (file-truename (car x)))
|
||||
(sort list-of-conflicts
|
||||
;; Sort the files by ascending HISTORY-POSITION.
|
||||
(lambda (x y) (< (cdr x) (cdr y))))))))
|
||||
(sort list-of-conflicts
|
||||
;; Sort the files by ascending HISTORY-POSITION.
|
||||
(lambda (x y) (< (cdr x) (cdr y))))))))
|
||||
|
||||
;;;; `package-activate'
|
||||
;; This function activates a newer version of a package if an older
|
||||
|
|
|
@ -146,7 +146,8 @@ There can be any number of :example/:result elements."
|
|||
(string-limit
|
||||
:eval (string-limit "foobar" 3)
|
||||
:eval (string-limit "foobar" 3 t)
|
||||
:eval (string-limit "foobar" 10))
|
||||
:eval (string-limit "foobar" 10)
|
||||
:eval (string-limit "fo好" 3 nil 'utf-8))
|
||||
(truncate-string-to-width
|
||||
:eval (truncate-string-to-width "foobar" 3)
|
||||
:eval (truncate-string-to-width "你好bar" 5))
|
||||
|
@ -154,9 +155,6 @@ There can be any number of :example/:result elements."
|
|||
:eval (split-string "foo bar")
|
||||
:eval (split-string "|foo|bar|" "|")
|
||||
:eval (split-string "|foo|bar|" "|" t))
|
||||
(string-slice
|
||||
:eval (string-slice "foo-bar" "-")
|
||||
:eval (string-slice "foo-bar--zot-" "-+"))
|
||||
(string-lines
|
||||
:eval (string-lines "foo\n\nbar")
|
||||
:eval (string-lines "foo\n\nbar" t))
|
||||
|
@ -620,6 +618,12 @@ There can be any number of :example/:result elements."
|
|||
"Data About Lists"
|
||||
(length
|
||||
:eval (length '(a b c)))
|
||||
(length<
|
||||
:eval (length< '(a b c) 1))
|
||||
(length>
|
||||
:eval (length> '(a b c) 1))
|
||||
(length=
|
||||
:eval (length> '(a b c) 3))
|
||||
(safe-length
|
||||
:eval (safe-length '(a b c))))
|
||||
|
||||
|
|
|
@ -286,7 +286,7 @@ result will have lines that are longer than LENGTH."
|
|||
(fill-region (point-min) (point-max)))
|
||||
(buffer-string)))
|
||||
|
||||
(defun string-limit (string length &optional end)
|
||||
(defun string-limit (string length &optional end coding-system)
|
||||
"Return (up to) a LENGTH substring of STRING.
|
||||
If STRING is shorter than or equal to LENGTH, the entire string
|
||||
is returned unchanged.
|
||||
|
@ -295,34 +295,45 @@ If STRING is longer than LENGTH, return a substring consisting of
|
|||
the first LENGTH characters of STRING. If END is non-nil, return
|
||||
the last LENGTH characters instead.
|
||||
|
||||
If CODING-SYSTEM is non-nil, STRING will be encoded before
|
||||
limiting, and LENGTH is interpreted as the number of bytes to
|
||||
limit the string to. The result will be a unibyte string that is
|
||||
shorter than LENGTH, but will not contain \"partial\" characters,
|
||||
even if CODING-SYSTEM encodes characters with several bytes per
|
||||
character.
|
||||
|
||||
When shortening strings for display purposes,
|
||||
`truncate-string-to-width' is almost always a better alternative
|
||||
than this function."
|
||||
(unless (natnump length)
|
||||
(signal 'wrong-type-argument (list 'natnump length)))
|
||||
(cond
|
||||
((<= (length string) length) string)
|
||||
(end (substring string (- (length string) length)))
|
||||
(t (substring string 0 length))))
|
||||
(if coding-system
|
||||
(let ((result nil)
|
||||
(result-length 0)
|
||||
(index (if end (1- (length string)) 0)))
|
||||
(while (let ((encoded (encode-coding-char
|
||||
(aref string index) coding-system)))
|
||||
(and (<= (+ (length encoded) result-length) length)
|
||||
(progn
|
||||
(push encoded result)
|
||||
(cl-incf result-length (length encoded))
|
||||
(setq index (if end (1- index)
|
||||
(1+ index))))
|
||||
(if end (> index -1)
|
||||
(< index (length string)))))
|
||||
;; No body.
|
||||
)
|
||||
(apply #'concat (if end result (nreverse result))))
|
||||
(cond
|
||||
((<= (length string) length) string)
|
||||
(end (substring string (- (length string) length)))
|
||||
(t (substring string 0 length)))))
|
||||
|
||||
(defun string-lines (string &optional omit-nulls)
|
||||
"Split STRING into a list of lines.
|
||||
If OMIT-NULLS, empty lines will be removed from the results."
|
||||
(split-string string "\n" omit-nulls))
|
||||
|
||||
(defun string-slice (string regexp)
|
||||
"Split STRING at REGEXP boundaries and return a list of slices.
|
||||
The boundaries that match REGEXP are included in the result.
|
||||
|
||||
Also see `split-string'."
|
||||
(if (zerop (length string))
|
||||
(list "")
|
||||
(let ((i (string-match-p regexp string 1)))
|
||||
(if i
|
||||
(cons (substring string 0 i)
|
||||
(string-slice (substring string i) regexp))
|
||||
(list string)))))
|
||||
|
||||
(defun string-pad (string length &optional padding start)
|
||||
"Pad STRING to LENGTH using PADDING.
|
||||
If PADDING is nil, the space character is used. If not nil, it
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
;;
|
||||
;; (face RELATIVE_SPECS_1 RELATIVE_SPECS_2 ... BASE_SPECS)
|
||||
;;
|
||||
;; The "specs" values are a lists of face names or face attribute-value
|
||||
;; The "specs" values are lists of face names or face attribute-value
|
||||
;; pairs, and are merged together, with earlier values taking precedence.
|
||||
;;
|
||||
;; The RELATIVE_SPECS_* values are added by `face-remap-add-relative'
|
||||
|
@ -183,13 +183,13 @@ to apply on top of the normal definition of FACE."
|
|||
This causes the remappings specified by `face-remap-add-relative'
|
||||
to apply on top of the face specification given by SPECS.
|
||||
|
||||
The remaining arguments, SPECS, should form a list of faces.
|
||||
Each list element should be either a face name or a property list
|
||||
The remaining arguments, SPECS, specify the base of the remapping.
|
||||
Each one of SPECS should be either a face name or a property list
|
||||
of face attribute/value pairs, like in a `face' text property.
|
||||
|
||||
If SPECS is empty, call `face-remap-reset-base' to use the normal
|
||||
definition of FACE as the base remapping; note that this is
|
||||
different from SPECS containing a single value nil, which means
|
||||
If SPECS is empty or a single face `eq' to FACE, call `face-remap-reset-base'
|
||||
to use the normal definition of FACE as the base remapping; note that
|
||||
this is different from SPECS containing a single value nil, which means
|
||||
not to inherit from the global definition of FACE at all."
|
||||
(while (and (consp specs) (not (null (car specs))) (null (cdr specs)))
|
||||
(setq specs (car specs)))
|
||||
|
|
|
@ -436,6 +436,14 @@ Also, initial position is at last record."
|
|||
|
||||
(defvar read-file-filter) ; bound in forms--intuit-from-file
|
||||
|
||||
;; The code used to use `run-hooks' but in a way that's actually
|
||||
;; incompatible with hooks (and with lexical scoping), so this function
|
||||
;; approximates the actual behavior that `run-hooks' provided.
|
||||
(defun forms--run-functions (functions)
|
||||
(if (functionp functions)
|
||||
(funcall functions)
|
||||
(mapc #'funcall functions)))
|
||||
|
||||
;;;###autoload
|
||||
(defun forms-mode (&optional primary)
|
||||
;; FIXME: use define-derived-mode
|
||||
|
@ -547,8 +555,6 @@ Commands: Equivalent keys in read-only mode:
|
|||
"`forms-multi-line' is equal to `forms-field-sep'")))
|
||||
(error (concat "Forms control file error: "
|
||||
"`forms-multi-line' must be nil or a one-character string"))))
|
||||
(or (fboundp 'set-text-properties)
|
||||
(setq forms-use-text-properties nil))
|
||||
|
||||
;; Validate and process forms-format-list.
|
||||
;;(message "forms: pre-processing format list...")
|
||||
|
@ -568,12 +574,12 @@ Commands: Equivalent keys in read-only mode:
|
|||
|
||||
;; Check if record filters are defined.
|
||||
(if (and forms-new-record-filter
|
||||
(not (fboundp forms-new-record-filter)))
|
||||
(not (functionp forms-new-record-filter)))
|
||||
(error (concat "Forms control file error: "
|
||||
"`forms-new-record-filter' is not a function")))
|
||||
|
||||
(if (and forms-modified-record-filter
|
||||
(not (fboundp forms-modified-record-filter)))
|
||||
(not (functionp forms-modified-record-filter)))
|
||||
(error (concat "Forms control file error: "
|
||||
"`forms-modified-record-filter' is not a function")))
|
||||
|
||||
|
@ -647,7 +653,7 @@ Commands: Equivalent keys in read-only mode:
|
|||
(with-current-buffer forms--file-buffer
|
||||
(let ((inhibit-read-only t)
|
||||
(file-modified (buffer-modified-p)))
|
||||
(mapc #'funcall read-file-filter)
|
||||
(forms--run-functions read-file-filter)
|
||||
(if (not file-modified) (set-buffer-modified-p nil)))
|
||||
(if write-file-filter
|
||||
(add-hook 'write-file-functions write-file-filter nil t)))
|
||||
|
@ -875,8 +881,7 @@ Commands: Equivalent keys in read-only mode:
|
|||
(list 'face forms--rw-face 'front-sticky '(face))))
|
||||
|
||||
;; Enable `post-command-hook' to restore the properties.
|
||||
(setq post-command-hook
|
||||
(append (list 'forms--iif-post-command-hook) post-command-hook)))
|
||||
(add-hook 'post-command-hook #'forms--iif-post-command-hook))
|
||||
|
||||
;; No action needed. Clear marker.
|
||||
(setq forms--iif-start nil)))
|
||||
|
@ -885,8 +890,7 @@ Commands: Equivalent keys in read-only mode:
|
|||
"`post-command-hook' function for read-only segments."
|
||||
|
||||
;; Disable `post-command-hook'.
|
||||
(setq post-command-hook
|
||||
(delq 'forms--iif-hook-post-command-hook post-command-hook))
|
||||
(remove-hook 'post-command-hook #'forms--iif-post-command-hook)
|
||||
|
||||
;; Restore properties.
|
||||
(if forms--iif-start
|
||||
|
@ -916,7 +920,7 @@ Commands: Equivalent keys in read-only mode:
|
|||
(if forms-use-text-properties
|
||||
`(lambda (arg)
|
||||
(let ((inhibit-read-only t))
|
||||
,@(apply 'append
|
||||
,@(apply #'append
|
||||
(mapcar #'forms--make-format-elt-using-text-properties
|
||||
forms-format-list))
|
||||
;; Prevent insertion before the first text.
|
||||
|
@ -929,7 +933,7 @@ Commands: Equivalent keys in read-only mode:
|
|||
'(rear-nonsticky nil)))
|
||||
(setq forms--iif-start nil))
|
||||
`(lambda (arg)
|
||||
,@(apply 'append
|
||||
,@(apply #'append
|
||||
(mapcar #'forms--make-format-elt forms-format-list)))))
|
||||
|
||||
;; We have tallied the number of markers and dynamic texts,
|
||||
|
@ -1100,7 +1104,7 @@ Commands: Equivalent keys in read-only mode:
|
|||
`(lambda nil
|
||||
(let (here)
|
||||
(goto-char (point-min))
|
||||
,@(apply 'append
|
||||
,@(apply #'append
|
||||
(mapcar
|
||||
#'forms--make-parser-elt
|
||||
(append forms-format-list (list nil)))))))))
|
||||
|
@ -1219,7 +1223,7 @@ Commands: Equivalent keys in read-only mode:
|
|||
(setq the-record
|
||||
(with-current-buffer forms--file-buffer
|
||||
(let ((inhibit-read-only t))
|
||||
(run-hooks 'read-file-filter))
|
||||
(forms--run-functions read-file-filter))
|
||||
(goto-char (point-min))
|
||||
(forms--get-record)))
|
||||
|
||||
|
@ -1427,7 +1431,7 @@ Commands: Equivalent keys in read-only mode:
|
|||
;;
|
||||
;; We have our own revert function - use it.
|
||||
(make-local-variable 'revert-buffer-function)
|
||||
(setq revert-buffer-function 'forms--revert-buffer)
|
||||
(setq revert-buffer-function #'forms--revert-buffer)
|
||||
|
||||
t)
|
||||
|
||||
|
@ -1900,7 +1904,7 @@ after writing out the data."
|
|||
;; Write file hooks are run via write-file-functions.
|
||||
;; (if write-file-filter
|
||||
;; (save-excursion
|
||||
;; (run-hooks 'write-file-filter)))
|
||||
;; (forms--run-functions write-file-filter)))
|
||||
|
||||
;; If they have a write-file-filter, force the buffer to be
|
||||
;; saved even if it doesn't seem to be changed. First, they
|
||||
|
@ -1912,7 +1916,7 @@ after writing out the data."
|
|||
(save-buffer args)
|
||||
(if read-file-filter
|
||||
(save-excursion
|
||||
(run-hooks 'read-file-filter)))
|
||||
(forms--run-functions read-file-filter)))
|
||||
(set-buffer-modified-p nil)))
|
||||
;; Make sure we end up with the same record number as we started.
|
||||
;; Since read-file-filter may perform arbitrary transformations on
|
||||
|
@ -2037,20 +2041,19 @@ Usage: (setq forms-number-of-fields
|
|||
(defun forms--debug (&rest args)
|
||||
"Internal debugging routine."
|
||||
(if forms--debug
|
||||
(let ((ret nil))
|
||||
(while args
|
||||
(let ((el (car-safe args)))
|
||||
(setq args (cdr-safe args))
|
||||
(if (stringp el)
|
||||
(setq ret (concat ret el))
|
||||
(setq ret (concat ret (prin1-to-string el) " = "))
|
||||
(if (boundp el)
|
||||
(let ((vel (eval el)))
|
||||
(setq ret (concat ret (prin1-to-string vel) "\n")))
|
||||
(setq ret (concat ret "<unbound>" "\n")))
|
||||
(if (fboundp el)
|
||||
(setq ret (concat ret (prin1-to-string (symbol-function el))
|
||||
"\n"))))))
|
||||
(let ((ret
|
||||
(mapconcat
|
||||
(lambda (el)
|
||||
(if (stringp el) el
|
||||
(concat (prin1-to-string el) " = "
|
||||
(if (boundp el)
|
||||
(prin1-to-string (eval el))
|
||||
"<unbound>")
|
||||
"\n"
|
||||
(if (fboundp el)
|
||||
(concat (prin1-to-string (symbol-function el))
|
||||
"\n")))))
|
||||
args "")))
|
||||
(with-current-buffer (get-buffer-create "*forms-mode debug*")
|
||||
(if (zerop (buffer-size))
|
||||
(emacs-lisp-mode))
|
||||
|
|
|
@ -1075,6 +1075,90 @@
|
|||
(define-charset-alias 'ebcdic-int 'ibm038)
|
||||
(define-charset-alias 'cp038 'ibm038)
|
||||
|
||||
(define-charset 'ibm256
|
||||
"Netherlands version of EBCDIC"
|
||||
:short-name "IBM256"
|
||||
:code-space [0 255]
|
||||
:mime-charset 'ibm256
|
||||
:map "IBM256")
|
||||
|
||||
(define-charset 'ibm273
|
||||
"Austrian / German version of EBCDIC"
|
||||
:short-name "IBM273"
|
||||
:code-space [0 255]
|
||||
:mime-charset 'ibm273
|
||||
:map "IBM273")
|
||||
|
||||
(define-charset 'ibm274
|
||||
"Belgian version of EBCDIC"
|
||||
:short-name "IBM274"
|
||||
:code-space [0 255]
|
||||
:mime-charset 'ibm274
|
||||
:map "IBM274")
|
||||
|
||||
(define-charset 'ibm275
|
||||
"Brazilian version of EBCDIC"
|
||||
:short-name "IBM275"
|
||||
:code-space [0 255]
|
||||
:mime-charset 'ibm275
|
||||
:map "IBM275")
|
||||
|
||||
(define-charset 'ibm277
|
||||
"Danish / Norwegian version of EBCDIC"
|
||||
:short-name "IBM277"
|
||||
:code-space [0 255]
|
||||
:mime-charset 'ibm277
|
||||
:map "IBM277")
|
||||
|
||||
(define-charset 'ibm278
|
||||
"Finnish / Swedish version of EBCDIC"
|
||||
:short-name "IBM278"
|
||||
:code-space [0 255]
|
||||
:mime-charset 'ibm278
|
||||
:map "IBM278")
|
||||
|
||||
(define-charset 'ibm280
|
||||
"Italian version of EBCDIC"
|
||||
:short-name "IBM280"
|
||||
:code-space [0 255]
|
||||
:mime-charset 'ibm270
|
||||
:map "IBM280")
|
||||
|
||||
(define-charset 'ibm281
|
||||
"Japanese-E version of EBCDIC"
|
||||
:short-name "IBM281"
|
||||
:code-space [0 255]
|
||||
:mime-charset 'ibm281
|
||||
:map "IBM281")
|
||||
|
||||
(define-charset 'ibm284
|
||||
"Spanish version of EBCDIC"
|
||||
:short-name "IBM284"
|
||||
:code-space [0 255]
|
||||
:mime-charset 'ibm284
|
||||
:map "IBM284")
|
||||
|
||||
(define-charset 'ibm285
|
||||
"UK english version of EBCDIC"
|
||||
:short-name "IBM285"
|
||||
:code-space [0 255]
|
||||
:mime-charset 'ibm285
|
||||
:map "IBM285")
|
||||
|
||||
(define-charset 'ibm290
|
||||
"Japanese katakana version of EBCDIC"
|
||||
:short-name "IBM290"
|
||||
:code-space [0 255]
|
||||
:mime-charset 'ibm290
|
||||
:map "IBM290")
|
||||
|
||||
(define-charset 'ibm297
|
||||
"French version of EBCDIC"
|
||||
:short-name "IBM297"
|
||||
:code-space [0 255]
|
||||
:mime-charset 'ibm297
|
||||
:map "IBM297")
|
||||
|
||||
(define-charset 'ibm1047
|
||||
;; Says groff:
|
||||
"IBM1047, `EBCDIC Latin 1/Open Systems' used by OS/390 Unix."
|
||||
|
|
|
@ -324,6 +324,87 @@ Latin-9 is sometimes nicknamed `Latin-0'."))
|
|||
:mime-charset 'windows-1257)
|
||||
(define-coding-system-alias 'cp1257 'windows-1257)
|
||||
|
||||
(define-coding-system 'ibm256
|
||||
"Netherlands version of EBCDIC"
|
||||
:coding-type 'charset
|
||||
:charset-list '(ibm256)
|
||||
:mnemonic ?*)
|
||||
(define-coding-system-alias 'ebcdic-int1 'ibm256)
|
||||
(define-coding-system-alias 'cp256 'ibm256)
|
||||
|
||||
(define-coding-system 'ibm273
|
||||
"Austrian / German version of EBCDIC"
|
||||
:coding-type 'charset
|
||||
:charset-list '(ibm273)
|
||||
:mnemonic ?*)
|
||||
(define-coding-system-alias 'cp273 'ibm273)
|
||||
|
||||
(define-coding-system 'ibm274
|
||||
"Belgian version of EBCDIC"
|
||||
:coding-type 'charset
|
||||
:charset-list '(ibm274)
|
||||
:mnemonic ?*)
|
||||
(define-coding-system-alias 'ebcdic-be 'ibm274)
|
||||
(define-coding-system-alias 'cp274 'ibm274)
|
||||
|
||||
(define-coding-system 'ibm275
|
||||
"Brazilian version of EBCDIC"
|
||||
:coding-type 'charset
|
||||
:charset-list '(ibm275)
|
||||
:mnemonic ?*)
|
||||
(define-coding-system-alias 'ebcdic-br 'ibm275)
|
||||
(define-coding-system-alias 'cp275 'ibm275)
|
||||
|
||||
(define-coding-system 'ibm277
|
||||
"Danish / Norwegian version of EBCDIC"
|
||||
:coding-type 'charset
|
||||
:charset-list '(ibm277)
|
||||
:mnemonic ?*)
|
||||
(define-coding-system-alias 'ebcdic-cp-dk 'ibm277)
|
||||
(define-coding-system-alias 'ebcdic-cp-no 'ibm277)
|
||||
(define-coding-system-alias 'cp277 'ibm277)
|
||||
|
||||
(define-coding-system 'ibm278
|
||||
"Finnish / Swedish version of EBCDIC"
|
||||
:coding-type 'charset
|
||||
:charset-list '(ibm278)
|
||||
:mnemonic ?*)
|
||||
(define-coding-system-alias 'ebcdic-cp-fi 'ibm278)
|
||||
(define-coding-system-alias 'ebcdic-cp-se 'ibm278)
|
||||
(define-coding-system-alias 'cp278 'ibm278)
|
||||
|
||||
(define-coding-system 'ibm280
|
||||
"Italian version of EBCDIC"
|
||||
:coding-type 'charset
|
||||
:charset-list '(ibm280)
|
||||
:mnemonic ?*)
|
||||
(define-coding-system-alias 'ebcdic-cp-it 'ibm280)
|
||||
(define-coding-system-alias 'cp280 'ibm280)
|
||||
|
||||
(define-coding-system 'ibm284
|
||||
"Spanish version of EBCDIC"
|
||||
:coding-type 'charset
|
||||
:charset-list '(ibm284)
|
||||
:mnemonic ?*)
|
||||
(define-coding-system-alias 'ebcdic-cp-es 'ibm284)
|
||||
(define-coding-system-alias 'cp284 'ibm284)
|
||||
|
||||
(define-coding-system 'ibm285
|
||||
"UK english version of EBCDIC"
|
||||
:coding-type 'charset
|
||||
:charset-list '(ibm285)
|
||||
:mnemonic ?*)
|
||||
(define-coding-system-alias 'ebcdic-cp-gb 'ibm285)
|
||||
(define-coding-system-alias 'cp285 'ibm285)
|
||||
|
||||
(define-coding-system 'ibm297
|
||||
"French version of EBCDIC"
|
||||
:coding-type 'charset
|
||||
:charset-list '(ibm297)
|
||||
:mnemonic ?*)
|
||||
(define-coding-system-alias 'ebcdic-cp-fr 'ibm297)
|
||||
(define-coding-system-alias 'cp297 'ibm297)
|
||||
|
||||
(define-coding-system 'cp775
|
||||
"DOS codepage 775 (PC Baltic, MS-DOS Baltic Rim)"
|
||||
:coding-type 'charset
|
||||
|
|
|
@ -188,6 +188,22 @@ eucJP-ms is defined in <http://www.opengroup.or.jp/jvc/cde/appendix.html>."
|
|||
|
||||
(define-coding-system-alias 'shift_jis-2004 'japanese-shift-jis-2004)
|
||||
|
||||
(define-coding-system 'ibm281
|
||||
"Japanese-E version of EBCDIC"
|
||||
:coding-type 'charset
|
||||
:charset-list '(ibm281)
|
||||
:mnemonic ?*)
|
||||
(define-coding-system-alias 'ebcdic-jp-e 'ibm281)
|
||||
(define-coding-system-alias 'cp281 'ibm281)
|
||||
|
||||
(define-coding-system 'ibm290
|
||||
"Japanese katakana version of EBCDIC"
|
||||
:coding-type 'charset
|
||||
:charset-list '(ibm290)
|
||||
:mnemonic ?*)
|
||||
(define-coding-system-alias 'ebcdic-jp-kana 'ibm290)
|
||||
(define-coding-system-alias 'cp290 'ibm290)
|
||||
|
||||
(set-language-info-alist
|
||||
"Japanese" '((setup-function . setup-japanese-environment-internal)
|
||||
(exit-function . use-default-char-width-table)
|
||||
|
|
|
@ -214,6 +214,16 @@ the cdr is set to t. Else, the car is set to nil."
|
|||
;; rule means this cannot be spam.
|
||||
(setcar result nil)))))
|
||||
|
||||
;; Don't spuriously advance to the next unseen message while
|
||||
;; prompting, because that causes it to then be missed while actually
|
||||
;; reading mail afterwards! Call this instead of
|
||||
;; rmail-first-unseen-message.
|
||||
(defun rsf--rmail-last-seen-message ()
|
||||
(max 1
|
||||
;; 'rmail-first-unseen-message' can return nil in a completely
|
||||
;; empty buffer.
|
||||
(1- (or (rmail-first-unseen-message) 1))))
|
||||
|
||||
(defun rmail-spam-filter (msg)
|
||||
"Return nil if message number MSG is spam based on `rsf-definitions-alist'.
|
||||
If spam, optionally output message to a file `rsf-file' and delete
|
||||
|
@ -327,8 +337,7 @@ it from rmail file. Called for each new message retrieved by
|
|||
(if (and (car maybe-spam) (cdr maybe-spam))
|
||||
;; Temporarily set rmail-current-message in order to output
|
||||
;; and delete the spam msg if needed:
|
||||
(let ((rmail-current-message msg) ; FIXME does this do anything?
|
||||
(action (cdr (assq 'action
|
||||
(let ((action (cdr (assq 'action
|
||||
(nth num-element rsf-definitions-alist))))
|
||||
(newfile (not (file-exists-p rsf-file))))
|
||||
;; Check action item in rsf-definitions-alist and do it.
|
||||
|
@ -337,7 +346,7 @@ it from rmail file. Called for each new message retrieved by
|
|||
;; Else the prompt to write a new file leaves the raw
|
||||
;; mbox buffer visible.
|
||||
(and newfile
|
||||
(rmail-show-message (rmail-first-unseen-message) t))
|
||||
(rmail-show-message (rsf--rmail-last-seen-message) t))
|
||||
(rmail-output rsf-file)
|
||||
;; Swap back, else rmail-get-new-mail-1 gets confused.
|
||||
(when newfile
|
||||
|
@ -377,7 +386,7 @@ This is called at the end of `rmail-get-new-mail-1' if there is new mail."
|
|||
(sleep-for rsf-sleep-after-message))
|
||||
(when (> nspam 0)
|
||||
;; Otherwise sleep or expunge prompt leaves raw mbox buffer showing.
|
||||
(rmail-show-message (or (rmail-first-unseen-message) 1) t)
|
||||
(rmail-show-message (or (rsf--rmail-last-seen-message) 1) t)
|
||||
(unwind-protect
|
||||
(progn
|
||||
(if rsf-beep (ding t))
|
||||
|
|
|
@ -49,12 +49,12 @@
|
|||
|
||||
;; The user option `tramp-gvfs-methods' contains the list of supported
|
||||
;; connection methods. Per default, these are "afp", "dav", "davs",
|
||||
;; "gdrive", "media", "nextcloud" and "sftp".
|
||||
;; "gdrive", "mtp", "nextcloud" and "sftp".
|
||||
|
||||
;; "gdrive" and "nextcloud" connection methods require a respective
|
||||
;; account in GNOME Online Accounts, with enabled "Files" service.
|
||||
|
||||
;; The "media" connection method is responsible for media devices,
|
||||
;; The "mtp" connection method is responsible for media devices,
|
||||
;; like cell phones, tablets, cameras etc. The device must already be
|
||||
;; connected via USB, before accessing it.
|
||||
|
||||
|
@ -131,7 +131,7 @@
|
|||
|
||||
;;;###tramp-autoload
|
||||
(defcustom tramp-gvfs-methods
|
||||
'("afp" "dav" "davs" "gdrive" "media" "nextcloud" "sftp")
|
||||
'("afp" "dav" "davs" "gdrive" "mtp" "nextcloud" "sftp")
|
||||
"List of methods for remote files, accessed with GVFS."
|
||||
:group 'tramp
|
||||
:version "28.1"
|
||||
|
@ -142,7 +142,7 @@
|
|||
(const "gdrive")
|
||||
(const "http")
|
||||
(const "https")
|
||||
(const "media")
|
||||
(const "mtp")
|
||||
(const "nextcloud")
|
||||
(const "sftp")
|
||||
(const "smb"))))
|
||||
|
@ -159,7 +159,7 @@
|
|||
|
||||
;;;###tramp-autoload
|
||||
(defvar tramp-media-methods '("afc" "gphoto2" "mtp")
|
||||
"List of GVFS methods which are covered by the \"media\" method.
|
||||
"List of GVFS methods which are covered by the \"mtp\" method.
|
||||
They are checked during start up via
|
||||
`tramp-gvfs-interface-remotevolumemonitor'.")
|
||||
|
||||
|
@ -1639,7 +1639,7 @@ ID-FORMAT valid values are `string' and `integer'."
|
|||
(if (tramp-tramp-file-p filename)
|
||||
(with-parsed-tramp-file-name filename nil
|
||||
;; Ensure that media devices are cached.
|
||||
(when (string-equal method "media")
|
||||
(when (string-equal method "mtp")
|
||||
(tramp-get-media-device v))
|
||||
(with-tramp-connection-property v "activation-uri"
|
||||
(setq localname "/")
|
||||
|
@ -1649,7 +1649,7 @@ ID-FORMAT valid values are `string' and `integer'."
|
|||
(setq method "davs"
|
||||
localname
|
||||
(concat (tramp-gvfs-get-remote-prefix v) localname)))
|
||||
(when (string-equal "media" method)
|
||||
(when (string-equal "mtp" method)
|
||||
(when-let
|
||||
((media (tramp-get-connection-property v "media-device" nil)))
|
||||
(setq method (tramp-media-device-method media)
|
||||
|
@ -2058,7 +2058,7 @@ and \"org.gtk.Private.RemoteVolumeMonitor.VolumeRemoved\" signals."
|
|||
(uri (url-generic-parse-url (nth 5 volume)))
|
||||
(method (url-type uri))
|
||||
(vec (make-tramp-file-name
|
||||
:method "media"
|
||||
:method "mtp"
|
||||
;; A host name cannot contain spaces.
|
||||
:host (tramp-compat-string-replace " " "_" (nth 1 volume))))
|
||||
(media (make-tramp-media-device
|
||||
|
@ -2363,7 +2363,7 @@ VEC is used only for traces."
|
|||
tramp-gvfs-interface-remotevolumemonitor "List")))
|
||||
(let* ((uri (url-generic-parse-url (nth 5 volume)))
|
||||
(vec (make-tramp-file-name
|
||||
:method "media"
|
||||
:method "mtp"
|
||||
;; A host name cannot contain spaces.
|
||||
:host (tramp-compat-string-replace " " "_" (nth 1 volume))))
|
||||
(media (make-tramp-media-device
|
||||
|
@ -2376,12 +2376,12 @@ VEC is used only for traces."
|
|||
(tramp-set-connection-property vec "media-device" media)
|
||||
(tramp-set-connection-property media "vector" vec))))
|
||||
|
||||
;; Adapt default host name, supporting /media:: when possible.
|
||||
;; Adapt default host name, supporting /mtp:: when possible.
|
||||
(setq tramp-default-host-alist
|
||||
(append
|
||||
`(("media" nil ,(if (= (length devices) 1) (car devices) "")))
|
||||
`(("mtp" nil ,(if (= (length devices) 1) (car devices) "")))
|
||||
(delete
|
||||
(assoc "media" tramp-default-host-alist)
|
||||
(assoc "mtp" tramp-default-host-alist)
|
||||
tramp-default-host-alist)))))
|
||||
|
||||
(defun tramp-parse-media-names (service)
|
||||
|
@ -2498,7 +2498,7 @@ This uses \"avahi-browse\" in case D-Bus is not enabled in Avahi."
|
|||
;; Add completion functions for media devices.
|
||||
(tramp-get-media-devices nil)
|
||||
(tramp-set-completion-function
|
||||
"media"
|
||||
"mtp"
|
||||
(mapcar
|
||||
(lambda (method) `(tramp-parse-media-names ,(format "_%s._tcp" method)))
|
||||
tramp-media-methods))))
|
||||
|
|
|
@ -10752,8 +10752,4 @@ when defining today."
|
|||
|
||||
(provide 'org-agenda)
|
||||
|
||||
;; Local variables:
|
||||
;; generated-autoload-file: "org-loaddefs.el"
|
||||
;; End:
|
||||
|
||||
;;; org-agenda.el ends here
|
||||
|
|
|
@ -1947,8 +1947,4 @@ Assume sexps have been marked with
|
|||
|
||||
(provide 'org-capture)
|
||||
|
||||
;; Local variables:
|
||||
;; generated-autoload-file: "org-loaddefs.el"
|
||||
;; End:
|
||||
|
||||
;;; org-capture.el ends here
|
||||
|
|
|
@ -377,18 +377,25 @@ error when the user input is empty."
|
|||
'org-time-stamp-inactive)
|
||||
(apply #'completing-read args)))
|
||||
|
||||
(defun org--mks-read-key (allowed-keys prompt)
|
||||
(defun org--mks-read-key (allowed-keys prompt navigation-keys)
|
||||
"Read a key and ensure it is a member of ALLOWED-KEYS.
|
||||
Enable keys to scroll the window if NAVIGATION-KEYS is set.
|
||||
TAB, SPC and RET are treated equivalently."
|
||||
(let* ((key (char-to-string
|
||||
(pcase (read-char-exclusive prompt)
|
||||
((or ?\s ?\t ?\r) ?\t)
|
||||
(char char)))))
|
||||
(if (member key allowed-keys)
|
||||
key
|
||||
(message "Invalid key: `%s'" key)
|
||||
(sit-for 1)
|
||||
(org--mks-read-key allowed-keys prompt))))
|
||||
(setq header-line-format (when navigation-keys "Use C-n, C-p, C-v, M-v to navigate."))
|
||||
(let ((char-key (read-char-exclusive prompt)))
|
||||
(if (and navigation-keys (memq char-key '(14 16 22 134217846)))
|
||||
(progn
|
||||
(org-scroll char-key)
|
||||
(org--mks-read-key allowed-keys prompt navigation-keys))
|
||||
(let ((key (char-to-string
|
||||
(pcase char-key
|
||||
((or ?\s ?\t ?\r) ?\t)
|
||||
(char char)))))
|
||||
(if (member key allowed-keys)
|
||||
key
|
||||
(message "Invalid key: `%s'" key)
|
||||
(sit-for 1)
|
||||
(org--mks-read-key allowed-keys prompt navigation-keys))))))
|
||||
|
||||
(defun org-mks (table title &optional prompt specials)
|
||||
"Select a member of an alist with multiple keys.
|
||||
|
@ -461,15 +468,13 @@ is selected, only the bare key is returned."
|
|||
;; Display UI and let user select an entry or
|
||||
;; a sub-level prefix.
|
||||
(goto-char (point-min))
|
||||
(setq header-line-format nil)
|
||||
(org-fit-window-to-buffer)
|
||||
(unless (pos-visible-in-window-p (1- (point-max)))
|
||||
(setq header-line-format "Use C-n, C-p or C-v to navigate.")
|
||||
(setq allowed-keys (append allowed-keys '("\C-n" "\C-p" "\C-v"))))
|
||||
(let ((pressed (org--mks-read-key allowed-keys prompt)))
|
||||
(while (and (member pressed '("\C-n" "\C-p" "\C-v")))
|
||||
(org-scroll (string-to-char pressed))
|
||||
(setq pressed (org--mks-read-key allowed-keys prompt)))
|
||||
(message "") ; With this line the prompt appears in
|
||||
; the minibuffer. Else keystrokes may
|
||||
; appear, which is spurious.
|
||||
(let ((pressed (org--mks-read-key
|
||||
allowed-keys prompt
|
||||
(not (pos-visible-in-window-p (1- (point-max)))))))
|
||||
(setq current (concat current pressed))
|
||||
(cond
|
||||
((equal pressed "\C-g") (user-error "Abort"))
|
||||
|
|
|
@ -5,13 +5,13 @@
|
|||
(defun org-release ()
|
||||
"The release version of Org.
|
||||
Inserted by installing Org mode or when a release is made."
|
||||
(let ((org-release "9.4.3"))
|
||||
(let ((org-release "9.4.4"))
|
||||
org-release))
|
||||
;;;###autoload
|
||||
(defun org-git-version ()
|
||||
"The Git version of Org mode.
|
||||
Inserted by installing Org or when a release is made."
|
||||
(let ((org-git-version "release_9.4.3"))
|
||||
(let ((org-git-version "release_9.4.4"))
|
||||
org-git-version))
|
||||
|
||||
(provide 'org-version)
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
;; Keywords: outlines, hypermedia, calendar, wp
|
||||
;; Homepage: https://orgmode.org
|
||||
|
||||
;; Version: 9.4.3
|
||||
;; Version: 9.4.4
|
||||
|
||||
;; This file is part of GNU Emacs.
|
||||
;;
|
||||
|
|
|
@ -1414,12 +1414,14 @@ comment at the start of cc-engine.el for more info."
|
|||
(setq ret 'label)))
|
||||
|
||||
;; Skip over the unary operators that can start the statement.
|
||||
(while (progn
|
||||
(c-backward-syntactic-ws lim)
|
||||
;; protect AWK post-inc/decrement operators, etc.
|
||||
(and (not (c-at-vsemi-p (point)))
|
||||
(/= (skip-chars-backward "-.+!*&~@`#") 0)))
|
||||
(while (and (> (point) lim)
|
||||
(progn
|
||||
(c-backward-syntactic-ws lim)
|
||||
;; protect AWK post-inc/decrement operators, etc.
|
||||
(and (not (c-at-vsemi-p (point)))
|
||||
(/= (skip-chars-backward "-.+!*&~@`#") 0))))
|
||||
(setq pos (point)))
|
||||
|
||||
(goto-char pos)
|
||||
ret)))
|
||||
|
||||
|
@ -3567,8 +3569,9 @@ mhtml-mode."
|
|||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Defuns which analyze the buffer, yet don't change `c-state-cache'.
|
||||
(defun c-get-fallback-scan-pos (here)
|
||||
;; Return a start position for building `c-state-cache' from
|
||||
;; scratch. This will be at the top level, 2 defuns back.
|
||||
;; Return a start position for building `c-state-cache' from scratch. This
|
||||
;; will be at the top level, 2 defuns back. Return nil if we don't find
|
||||
;; these defun starts a reasonable way back.
|
||||
(save-excursion
|
||||
(save-restriction
|
||||
(when (> here (* 10 c-state-cache-too-far))
|
||||
|
@ -11177,6 +11180,7 @@ comment at the start of cc-engine.el for more info."
|
|||
(c-backward-syntactic-ws lim)
|
||||
(not (or (memq (char-before) '(?\; ?} ?: nil))
|
||||
(c-at-vsemi-p))))
|
||||
(not (and lim (<= (point) lim)))
|
||||
(save-excursion
|
||||
(backward-char)
|
||||
(not (looking-at "\\s(")))
|
||||
|
@ -11615,6 +11619,195 @@ comment at the start of cc-engine.el for more info."
|
|||
(or (looking-at c-brace-list-key)
|
||||
(progn (goto-char here) nil))))
|
||||
|
||||
(defun c-laomib-loop (lim)
|
||||
;; The "expensive" loop from `c-looking-at-or-maybe-in-bracelist'. Move
|
||||
;; backwards over comma separated sexps as far as possible, but no further
|
||||
;; than LIM, which may be nil, meaning no limit. Return the final value of
|
||||
;; `braceassignp', which is t if we encountered "= {", usually nil
|
||||
;; otherwise.
|
||||
(let ((braceassignp 'dontknow)
|
||||
(class-key
|
||||
;; Pike can have class definitions anywhere, so we must
|
||||
;; check for the class key here.
|
||||
(and (c-major-mode-is 'pike-mode)
|
||||
c-decl-block-key)))
|
||||
(while (eq braceassignp 'dontknow)
|
||||
(cond ((eq (char-after) ?\;)
|
||||
(setq braceassignp nil))
|
||||
((and class-key
|
||||
(looking-at class-key))
|
||||
(setq braceassignp nil))
|
||||
((and c-has-compound-literals
|
||||
(looking-at c-return-key))
|
||||
(setq braceassignp t)
|
||||
nil)
|
||||
((eq (char-after) ?=)
|
||||
;; We've seen a =, but must check earlier tokens so
|
||||
;; that it isn't something that should be ignored.
|
||||
(setq braceassignp 'maybe)
|
||||
(while (and (eq braceassignp 'maybe)
|
||||
(zerop (c-backward-token-2 1 t lim)))
|
||||
(setq braceassignp
|
||||
(cond
|
||||
;; Check for operator =
|
||||
((and c-opt-op-identifier-prefix
|
||||
(looking-at c-opt-op-identifier-prefix))
|
||||
nil)
|
||||
;; Check for `<opchar>= in Pike.
|
||||
((and (c-major-mode-is 'pike-mode)
|
||||
(or (eq (char-after) ?`)
|
||||
;; Special case for Pikes
|
||||
;; `[]=, since '[' is not in
|
||||
;; the punctuation class.
|
||||
(and (eq (char-after) ?\[)
|
||||
(eq (char-before) ?`))))
|
||||
nil)
|
||||
((looking-at "\\s.") 'maybe)
|
||||
;; make sure we're not in a C++ template
|
||||
;; argument assignment
|
||||
((and
|
||||
(c-major-mode-is 'c++-mode)
|
||||
(save-excursion
|
||||
(let ((here (point))
|
||||
(pos< (progn
|
||||
(skip-chars-backward "^<>")
|
||||
(point))))
|
||||
(and (eq (char-before) ?<)
|
||||
(not (c-crosses-statement-barrier-p
|
||||
pos< here))
|
||||
(not (c-in-literal))
|
||||
))))
|
||||
nil)
|
||||
(t t)))))
|
||||
((and
|
||||
(c-major-mode-is 'c++-mode)
|
||||
(eq (char-after) ?\[)
|
||||
;; Be careful of "operator []"
|
||||
(not (save-excursion
|
||||
(c-backward-token-2 1 nil lim)
|
||||
(looking-at c-opt-op-identifier-prefix))))
|
||||
(setq braceassignp t)
|
||||
nil))
|
||||
(when (eq braceassignp 'dontknow)
|
||||
(cond ((and
|
||||
(not (eq (char-after) ?,))
|
||||
(save-excursion
|
||||
(c-backward-syntactic-ws)
|
||||
(eq (char-before) ?})))
|
||||
(setq braceassignp nil))
|
||||
((/= (c-backward-token-2 1 t lim) 0)
|
||||
(if (save-excursion
|
||||
(and c-has-compound-literals
|
||||
(eq (c-backward-token-2 1 nil lim) 0)
|
||||
(eq (char-after) ?\()))
|
||||
(setq braceassignp t)
|
||||
(setq braceassignp nil))))))
|
||||
braceassignp))
|
||||
|
||||
;; The following variable is a cache of up to four entries, each entry of
|
||||
;; which is a list representing a call to c-laomib-loop. It contains the
|
||||
;; following elements:
|
||||
;; 0: `lim' argument - used as an alist key, never nil.
|
||||
;; 1: Position in buffer where the scan started.
|
||||
;; 2: Position in buffer where the scan ended.
|
||||
;; 3: Result of the call to `c-laomib-loop'.
|
||||
(defvar c-laomib-cache nil)
|
||||
(make-variable-buffer-local 'c-laomib-cache)
|
||||
|
||||
(defun c-laomib-get-cache (containing-sexp)
|
||||
;; Get an element from `c-laomib-cache' matching CONTAINING-SEXP.
|
||||
;; Return that element or nil if one wasn't found.
|
||||
(let ((elt (assq containing-sexp c-laomib-cache)))
|
||||
(when elt
|
||||
;; Move the fetched `elt' to the front of the cache.
|
||||
(setq c-laomib-cache (delq elt c-laomib-cache))
|
||||
(push elt c-laomib-cache)
|
||||
elt)))
|
||||
|
||||
(defun c-laomib-put-cache (lim start end result)
|
||||
;; Insert a new element into `c-laomib-cache', removing another element to
|
||||
;; make room, if necessary. The four parameters LIM, START, END, RESULT are
|
||||
;; the components of the new element (see comment for `c-laomib-cache').
|
||||
;; The return value is of no significance.
|
||||
(when lim
|
||||
(let ((old-elt (assq lim c-laomib-cache))
|
||||
;; (elt (cons containing-sexp (cons start nil)))
|
||||
(new-elt (list lim start end result))
|
||||
big-ptr
|
||||
(cur-ptr c-laomib-cache)
|
||||
togo togo-ptr (size 0) cur-size
|
||||
)
|
||||
(if old-elt (setq c-laomib-cache (delq old-elt c-laomib-cache)))
|
||||
|
||||
(while (>= (length c-laomib-cache) 4)
|
||||
;; We delete the least recently used elt which doesn't enclose START,
|
||||
;; or..
|
||||
(dolist (elt c-laomib-cache)
|
||||
(if (or (<= start (cadr elt))
|
||||
(> start (car (cddr elt))))
|
||||
(setq togo elt)))
|
||||
|
||||
;; ... delete the least recently used elt which isn't the biggest.
|
||||
(when (not togo)
|
||||
(while (cdr cur-ptr)
|
||||
(setq cur-size (- (nth 2 (cadr cur-ptr)) (car (cadr cur-ptr))))
|
||||
(when (> cur-size size)
|
||||
(setq size cur-size
|
||||
big-ptr cur-ptr))
|
||||
(setq cur-ptr (cdr cur-ptr)))
|
||||
(setq togo (if (cddr big-ptr)
|
||||
(car (last big-ptr))
|
||||
(car big-ptr))))
|
||||
|
||||
(setq c-laomib-cache (delq togo c-laomib-cache)))
|
||||
|
||||
(push new-elt c-laomib-cache))))
|
||||
|
||||
(defun c-laomib-fix-elt (lwm elt paren-state)
|
||||
;; Correct a c-laomib-cache entry ELT with respect to buffer changes, either
|
||||
;; doing nothing, signalling it is to be deleted, or replacing its start
|
||||
;; point with one lower in the buffer than LWM. PAREN-STATE is the paren
|
||||
;; state at LWM. Return the corrected entry, or nil (if it needs deleting).
|
||||
;; Note that corrections are made by `setcar'ing the original structure,
|
||||
;; which thus remains intact.
|
||||
(cond
|
||||
((or (not lwm) (> lwm (cadr elt)))
|
||||
elt)
|
||||
((<= lwm (nth 2 elt))
|
||||
nil)
|
||||
(t
|
||||
(let (cur-brace)
|
||||
;; Search for the last brace in `paren-state' before (car `lim'). This
|
||||
;; brace will become our new 2nd element of `elt'.
|
||||
(while
|
||||
;; Search one brace level per iteration.
|
||||
(and paren-state
|
||||
(progn
|
||||
;; (setq cur-brace (c-laomib-next-BRACE paren-state))
|
||||
(while
|
||||
;; Go past non-brace levels, one per iteration.
|
||||
(and paren-state
|
||||
(not (eq (char-after
|
||||
(c-state-cache-top-lparen paren-state))
|
||||
?{)))
|
||||
(setq paren-state (cdr paren-state)))
|
||||
(cadr paren-state))
|
||||
(> (c-state-cache-top-lparen (cdr paren-state)) (car elt)))
|
||||
(setq paren-state (cdr paren-state)))
|
||||
(when (cadr paren-state)
|
||||
(setcar (cdr elt) (c-state-cache-top-lparen paren-state))
|
||||
elt)))))
|
||||
|
||||
(defun c-laomib-invalidate-cache (beg _end)
|
||||
;; Called from late in c-before-change. Amend `c-laomib-cache' to remove
|
||||
;; details pertaining to the buffer after position BEG.
|
||||
(save-excursion
|
||||
(goto-char beg)
|
||||
(let ((paren-state (c-parse-state)))
|
||||
(dolist (elt c-laomib-cache)
|
||||
(when (not (c-laomib-fix-elt beg elt paren-state))
|
||||
(setq c-laomib-cache (delq elt c-laomib-cache)))))))
|
||||
|
||||
(defun c-looking-at-or-maybe-in-bracelist (&optional containing-sexp lim)
|
||||
;; Point is at an open brace. If this starts a brace list, return a list
|
||||
;; whose car is the buffer position of the start of the construct which
|
||||
|
@ -11635,14 +11828,10 @@ comment at the start of cc-engine.el for more info."
|
|||
;; Here, "brace list" does not include the body of an enum.
|
||||
(save-excursion
|
||||
(let ((start (point))
|
||||
(class-key
|
||||
;; Pike can have class definitions anywhere, so we must
|
||||
;; check for the class key here.
|
||||
(and (c-major-mode-is 'pike-mode)
|
||||
c-decl-block-key))
|
||||
(braceassignp 'dontknow)
|
||||
inexpr-brace-list bufpos macro-start res pos after-type-id-pos
|
||||
in-paren parens-before-brace)
|
||||
in-paren parens-before-brace
|
||||
paren-state paren-pos)
|
||||
|
||||
(setq res (c-backward-token-2 1 t lim))
|
||||
;; Checks to do only on the first sexp before the brace.
|
||||
|
@ -11651,8 +11840,10 @@ comment at the start of cc-engine.el for more info."
|
|||
(cond
|
||||
((and (or (not (eq res 0))
|
||||
(eq (char-after) ?,))
|
||||
(c-go-up-list-backward nil lim) ; FIXME!!! Check ; `lim' 2016-07-12.
|
||||
(eq (char-after) ?\())
|
||||
(setq paren-state (c-parse-state))
|
||||
(setq paren-pos (c-pull-open-brace paren-state))
|
||||
(eq (char-after paren-pos) ?\())
|
||||
(goto-char paren-pos)
|
||||
(setq braceassignp 'c++-noassign
|
||||
in-paren 'in-paren))
|
||||
((looking-at c-pre-id-bracelist-key)
|
||||
|
@ -11669,9 +11860,11 @@ comment at the start of cc-engine.el for more info."
|
|||
(cond
|
||||
((or (not (eq res 0))
|
||||
(eq (char-after) ?,))
|
||||
(and (c-go-up-list-backward nil lim) ; FIXME!!! Check `lim' 2016-07-12.
|
||||
(eq (char-after) ?\()
|
||||
(setq in-paren 'in-paren)))
|
||||
(and (setq paren-state (c-parse-state))
|
||||
(setq paren-pos (c-pull-open-brace paren-state))
|
||||
(eq (char-after paren-pos) ?\()
|
||||
(setq in-paren 'in-paren)
|
||||
(goto-char paren-pos)))
|
||||
((looking-at c-pre-id-bracelist-key))
|
||||
((looking-at c-return-key))
|
||||
(t (setq after-type-id-pos (point))
|
||||
|
@ -11724,79 +11917,36 @@ comment at the start of cc-engine.el for more info."
|
|||
|
||||
(t
|
||||
(goto-char pos)
|
||||
;; Checks to do on all sexps before the brace, up to the
|
||||
;; beginning of the statement.
|
||||
(while (eq braceassignp 'dontknow)
|
||||
(cond ((eq (char-after) ?\;)
|
||||
(setq braceassignp nil))
|
||||
((and class-key
|
||||
(looking-at class-key))
|
||||
(setq braceassignp nil))
|
||||
((and c-has-compound-literals
|
||||
(looking-at c-return-key))
|
||||
(setq braceassignp t)
|
||||
nil)
|
||||
((eq (char-after) ?=)
|
||||
;; We've seen a =, but must check earlier tokens so
|
||||
;; that it isn't something that should be ignored.
|
||||
(setq braceassignp 'maybe)
|
||||
(while (and (eq braceassignp 'maybe)
|
||||
(zerop (c-backward-token-2 1 t lim)))
|
||||
(setq braceassignp
|
||||
(cond
|
||||
;; Check for operator =
|
||||
((and c-opt-op-identifier-prefix
|
||||
(looking-at c-opt-op-identifier-prefix))
|
||||
nil)
|
||||
;; Check for `<opchar>= in Pike.
|
||||
((and (c-major-mode-is 'pike-mode)
|
||||
(or (eq (char-after) ?`)
|
||||
;; Special case for Pikes
|
||||
;; `[]=, since '[' is not in
|
||||
;; the punctuation class.
|
||||
(and (eq (char-after) ?\[)
|
||||
(eq (char-before) ?`))))
|
||||
nil)
|
||||
((looking-at "\\s.") 'maybe)
|
||||
;; make sure we're not in a C++ template
|
||||
;; argument assignment
|
||||
((and
|
||||
(c-major-mode-is 'c++-mode)
|
||||
(save-excursion
|
||||
(let ((here (point))
|
||||
(pos< (progn
|
||||
(skip-chars-backward "^<>")
|
||||
(point))))
|
||||
(and (eq (char-before) ?<)
|
||||
(not (c-crosses-statement-barrier-p
|
||||
pos< here))
|
||||
(not (c-in-literal))
|
||||
))))
|
||||
nil)
|
||||
(t t)))))
|
||||
((and
|
||||
(c-major-mode-is 'c++-mode)
|
||||
(eq (char-after) ?\[)
|
||||
;; Be careful of "operator []"
|
||||
(not (save-excursion
|
||||
(c-backward-token-2 1 nil lim)
|
||||
(looking-at c-opt-op-identifier-prefix))))
|
||||
(setq braceassignp t)
|
||||
nil))
|
||||
(when (eq braceassignp 'dontknow)
|
||||
(cond ((and
|
||||
(not (eq (char-after) ?,))
|
||||
(save-excursion
|
||||
(c-backward-syntactic-ws)
|
||||
(eq (char-before) ?})))
|
||||
(setq braceassignp nil))
|
||||
((/= (c-backward-token-2 1 t lim) 0)
|
||||
(if (save-excursion
|
||||
(and c-has-compound-literals
|
||||
(eq (c-backward-token-2 1 nil lim) 0)
|
||||
(eq (char-after) ?\()))
|
||||
(setq braceassignp t)
|
||||
(setq braceassignp nil))))))
|
||||
(when (eq braceassignp 'dontknow)
|
||||
(let* ((cache-entry (and containing-sexp
|
||||
(c-laomib-get-cache containing-sexp)))
|
||||
(lim2 (or (cadr cache-entry) lim))
|
||||
sub-bassign-p)
|
||||
(if cache-entry
|
||||
(cond
|
||||
((<= (point) (cadr cache-entry))
|
||||
;; We're inside the region we've already scanned over, so
|
||||
;; just go to that scan's end position.
|
||||
(goto-char (nth 2 cache-entry))
|
||||
(setq braceassignp (nth 3 cache-entry)))
|
||||
((> (point) (cadr cache-entry))
|
||||
;; We're beyond the previous scan region, so just scan as
|
||||
;; far as the end of that region.
|
||||
(setq sub-bassign-p (c-laomib-loop lim2))
|
||||
(if (<= (point) (cadr cache-entry))
|
||||
(progn
|
||||
(c-laomib-put-cache containing-sexp
|
||||
start (nth 2 cache-entry)
|
||||
(nth 3 cache-entry) ;; sub-bassign-p
|
||||
)
|
||||
(setq braceassignp (nth 3 cache-entry))
|
||||
(goto-char (nth 2 cache-entry)))
|
||||
(setq braceassignp sub-bassign-p)))
|
||||
(t))
|
||||
|
||||
(setq braceassignp (c-laomib-loop lim))
|
||||
(when lim
|
||||
(c-laomib-put-cache lim start (point) braceassignp)))))
|
||||
|
||||
(cond
|
||||
(braceassignp
|
||||
|
|
|
@ -639,6 +639,8 @@ that requires a literal mode spec at compile time."
|
|||
;; doesn't work with filladapt but it's better than nothing.
|
||||
(set (make-local-variable 'fill-paragraph-function) 'c-fill-paragraph)
|
||||
|
||||
;; Initialize the cache for `c-looking-at-or-maybe-in-bracelist'.
|
||||
(setq c-laomib-cache nil)
|
||||
;; Initialize the three literal sub-caches.
|
||||
(c-truncate-lit-pos-cache 1)
|
||||
;; Initialize the cache of brace pairs, and opening braces/brackets/parens.
|
||||
|
@ -2054,7 +2056,9 @@ Note that this is a strict tail, so won't match, e.g. \"0x....\".")
|
|||
(if c-get-state-before-change-functions
|
||||
(mapc (lambda (fn)
|
||||
(funcall fn beg end))
|
||||
c-get-state-before-change-functions))))
|
||||
c-get-state-before-change-functions))
|
||||
|
||||
(c-laomib-invalidate-cache beg end)))
|
||||
(c-clear-string-fences))))
|
||||
(c-truncate-lit-pos-cache beg)
|
||||
;; The following must be done here rather than in `c-after-change'
|
||||
|
@ -2205,7 +2209,8 @@ Note that this is a strict tail, so won't match, e.g. \"0x....\".")
|
|||
old-pos
|
||||
(new-pos pos)
|
||||
capture-opener
|
||||
bod-lim bo-decl)
|
||||
bod-lim bo-decl
|
||||
paren-state containing-brace)
|
||||
(goto-char (c-point 'bol new-pos))
|
||||
(unless lit-start
|
||||
(setq bod-lim (c-determine-limit 500))
|
||||
|
@ -2224,12 +2229,16 @@ Note that this is a strict tail, so won't match, e.g. \"0x....\".")
|
|||
(setq old-pos (point))
|
||||
(let (pseudo)
|
||||
(while
|
||||
(progn
|
||||
(c-syntactic-skip-backward "^;{}" bod-lim t)
|
||||
(and (eq (char-before) ?})
|
||||
(save-excursion
|
||||
(backward-char)
|
||||
(setq pseudo (c-cheap-inside-bracelist-p (c-parse-state))))))
|
||||
(and
|
||||
;; N.B. `c-syntactic-skip-backward' doesn't check (> (point)
|
||||
;; lim) and can loop if that's not the case.
|
||||
(> (point) bod-lim)
|
||||
(progn
|
||||
(c-syntactic-skip-backward "^;{}" bod-lim t)
|
||||
(and (eq (char-before) ?})
|
||||
(save-excursion
|
||||
(backward-char)
|
||||
(setq pseudo (c-cheap-inside-bracelist-p (c-parse-state)))))))
|
||||
(goto-char pseudo))
|
||||
t)
|
||||
(> (point) bod-lim)
|
||||
|
@ -2262,7 +2271,14 @@ Note that this is a strict tail, so won't match, e.g. \"0x....\".")
|
|||
(and (eq (char-before) ?{)
|
||||
(save-excursion
|
||||
(backward-char)
|
||||
(consp (c-looking-at-or-maybe-in-bracelist))))
|
||||
(setq paren-state (c-parse-state))
|
||||
(while
|
||||
(and
|
||||
(setq containing-brace
|
||||
(c-pull-open-brace paren-state))
|
||||
(not (eq (char-after containing-brace) ?{))))
|
||||
(consp (c-looking-at-or-maybe-in-bracelist
|
||||
containing-brace containing-brace))))
|
||||
)))
|
||||
(not (bobp)))
|
||||
(backward-char)) ; back over (, [, <.
|
||||
|
|
|
@ -5666,7 +5666,7 @@ indentation and initial hashes. Behaves usually outside of comment."
|
|||
'cperl-hash-face
|
||||
'cperl-array-face)
|
||||
nil) ; arrays and hashes
|
||||
("\\(\\([$@]+\\)[a-zA-Z_:][a-zA-Z0-9_:]*\\)[ \t]*\\([[{]\\)"
|
||||
("\\(\\([$@%]+\\)[a-zA-Z_:][a-zA-Z0-9_:]*\\)[ \t]*\\([[{]\\)"
|
||||
1
|
||||
(if (= (- (match-end 2) (match-beginning 2)) 1)
|
||||
(if (eq (char-after (match-beginning 3)) ?{)
|
||||
|
|
|
@ -41,9 +41,9 @@
|
|||
;; simply aren't optimised (remotely) for this scenario, so performance can
|
||||
;; suffer significantly.
|
||||
;;
|
||||
;; When such files are detected, the command `so-long' is automatically called,
|
||||
;; overriding certain minor modes and variables with performance implications
|
||||
;; (all configurable), in order to enhance performance in the buffer.
|
||||
;; When so-long detects such a file, it calls the command `so-long', which
|
||||
;; overrides certain minor modes and variables (you can configure the details)
|
||||
;; to improve performance in the buffer.
|
||||
;;
|
||||
;; The default action enables the major mode `so-long-mode' in place of the mode
|
||||
;; that Emacs selected. This ensures that the original major mode cannot affect
|
||||
|
|
27
lisp/subr.el
27
lisp/subr.el
|
@ -1747,7 +1747,32 @@ FUNCTION isn't the value of HOOK, or, if FUNCTION doesn't appear in the
|
|||
list of hooks to run in HOOK, then nothing is done. See `add-hook'.
|
||||
|
||||
The optional third argument, LOCAL, if non-nil, says to modify
|
||||
the hook's buffer-local value rather than its default value."
|
||||
the hook's buffer-local value rather than its default value.
|
||||
|
||||
Interactively, prompt for the various arguments (skipping local
|
||||
unless HOOK has both local and global functions). If multiple
|
||||
functions have the same representation under `princ', the first
|
||||
one will be removed."
|
||||
(interactive
|
||||
(let* ((hook (intern (completing-read "Hook variable: " obarray #'boundp t)))
|
||||
(local
|
||||
(and
|
||||
(local-variable-p hook)
|
||||
(symbol-value hook)
|
||||
;; No need to prompt if there's nothing global
|
||||
(or (not (default-value hook))
|
||||
(y-or-n-p (format "%s has a buffer-local binding, use that? "
|
||||
hook)))))
|
||||
(fn-alist (mapcar
|
||||
(lambda (x) (cons (with-output-to-string (prin1 x)) x))
|
||||
(if local (symbol-value hook) (default-value hook))))
|
||||
(function (alist-get (completing-read
|
||||
(format "%s hook to remove: "
|
||||
(if local "Buffer-local" "Global"))
|
||||
fn-alist
|
||||
nil t)
|
||||
fn-alist nil nil 'string=)))
|
||||
(list hook function local)))
|
||||
(or (boundp hook) (set hook nil))
|
||||
(or (default-boundp hook) (set-default hook nil))
|
||||
;; Do nothing if LOCAL is t but this hook has no local binding.
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
|
||||
;;; Code:
|
||||
|
||||
(require 'cl-lib)
|
||||
(require 'seq) ; tab-line.el is not pre-loaded so it's safe to use it here
|
||||
|
||||
|
||||
|
@ -35,6 +36,18 @@
|
|||
:group 'convenience
|
||||
:version "27.1")
|
||||
|
||||
(defcustom tab-line-tab-face-functions '(tab-line-tab-face-special)
|
||||
"Functions called to modify tab faces.
|
||||
Each function is called with five arguments: the tab, a list of
|
||||
all tabs, the face returned by the previously called modifier,
|
||||
whether the tab is a buffer, and whether the tab is selected."
|
||||
:type '(repeat
|
||||
(choice (function-item tab-line-tab-face-special)
|
||||
(function-item tab-line-tab-face-inactive-alternating)
|
||||
(function :tag "Custom function")))
|
||||
:group 'tab-line
|
||||
:version "28.1")
|
||||
|
||||
(defgroup tab-line-faces '((tab-line custom-face)) ; tab-line is defined in faces.el
|
||||
"Faces used in the tab line."
|
||||
:group 'tab-line
|
||||
|
@ -63,6 +76,25 @@
|
|||
:version "27.1"
|
||||
:group 'tab-line-faces)
|
||||
|
||||
(defface tab-line-tab-inactive-alternate
|
||||
`((t (:inherit tab-line-tab-inactive :background "grey65")))
|
||||
"Alternate face for inactive tab-line tabs.
|
||||
Applied to alternating tabs when option
|
||||
`tab-line-tab-face-functions' includes function
|
||||
`tab-line-tab-face-inactive-alternating'."
|
||||
:version "28.1"
|
||||
:group 'tab-line-faces)
|
||||
|
||||
(defface tab-line-tab-special
|
||||
'((default (:weight bold))
|
||||
(((supports :slant italic))
|
||||
(:slant italic :weight normal)))
|
||||
"Face for special (i.e. non-file-backed) tabs.
|
||||
Applied when option `tab-line-tab-face-functions' includes
|
||||
function `tab-line-tab-face-special'."
|
||||
:version "28.1"
|
||||
:group 'tab-line-faces)
|
||||
|
||||
(defface tab-line-tab-current
|
||||
'((default
|
||||
:inherit tab-line-tab)
|
||||
|
@ -412,7 +444,14 @@ variable `tab-line-tabs-function'."
|
|||
(cdr (assq 'selected tab))))
|
||||
(name (if buffer-p
|
||||
(funcall tab-line-tab-name-function tab tabs)
|
||||
(cdr (assq 'name tab)))))
|
||||
(cdr (assq 'name tab))))
|
||||
(face (if selected-p
|
||||
(if (eq (selected-window) (old-selected-window))
|
||||
'tab-line-tab-current
|
||||
'tab-line-tab)
|
||||
'tab-line-tab-inactive)))
|
||||
(dolist (fn tab-line-tab-face-functions)
|
||||
(setf face (funcall fn tab tabs face buffer-p selected-p)))
|
||||
(concat
|
||||
separator
|
||||
(apply 'propertize
|
||||
|
@ -425,11 +464,7 @@ variable `tab-line-tabs-function'."
|
|||
`(
|
||||
tab ,tab
|
||||
,@(if selected-p '(selected t))
|
||||
face ,(if selected-p
|
||||
(if (eq (selected-window) (old-selected-window))
|
||||
'tab-line-tab-current
|
||||
'tab-line-tab)
|
||||
'tab-line-tab-inactive)
|
||||
face ,face
|
||||
mouse-face tab-line-highlight)))))
|
||||
tabs))
|
||||
(hscroll-data (tab-line-auto-hscroll strings hscroll)))
|
||||
|
@ -453,6 +488,24 @@ variable `tab-line-tabs-function'."
|
|||
tab-line-new-button)
|
||||
(list tab-line-new-button)))))
|
||||
|
||||
(defun tab-line-tab-face-inactive-alternating (tab tabs face _buffer-p selected-p)
|
||||
"Return FACE for TAB in TABS with alternation.
|
||||
When TAB is an inactive buffer and is even-numbered, make FACE
|
||||
inherit from `tab-line-tab-inactive-alternate'. For use in
|
||||
`tab-line-tab-face-functions'."
|
||||
(when (and (not selected-p) (cl-evenp (cl-position tab tabs)))
|
||||
(setf face `(:inherit (tab-line-tab-inactive-alternate ,face))))
|
||||
face)
|
||||
|
||||
(defun tab-line-tab-face-special (tab _tabs face buffer-p _selected-p)
|
||||
"Return FACE for TAB according to whether it's special.
|
||||
When TAB is a non-file-backed buffer, make FACE inherit from
|
||||
`tab-line-tab-special'. For use in
|
||||
`tab-line-tab-face-functions'."
|
||||
(when (and buffer-p (not (buffer-file-name tab)))
|
||||
(setf face `(:inherit (tab-line-tab-special ,face))))
|
||||
face)
|
||||
|
||||
(defvar tab-line-auto-hscroll)
|
||||
|
||||
(defun tab-line-format ()
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# alloca.m4 serial 18
|
||||
# alloca.m4 serial 20
|
||||
dnl Copyright (C) 2002-2004, 2006-2007, 2009-2020 Free Software Foundation,
|
||||
dnl Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
|
@ -104,5 +104,5 @@ AH_VERBATIM([STACK_DIRECTION],
|
|||
STACK_DIRECTION = 0 => direction of growth unknown */
|
||||
#undef STACK_DIRECTION])dnl
|
||||
AC_DEFINE_UNQUOTED(STACK_DIRECTION, $ac_cv_c_stack_direction)
|
||||
])
|
||||
])# _AC_LIBOBJ_ALLOCA
|
||||
])
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# canonicalize.m4 serial 33
|
||||
# canonicalize.m4 serial 34
|
||||
|
||||
dnl Copyright (C) 2003-2007, 2009-2020 Free Software Foundation, Inc.
|
||||
|
||||
|
@ -11,7 +11,9 @@ dnl with or without modifications, as long as this notice is preserved.
|
|||
AC_DEFUN([gl_FUNC_CANONICALIZE_FILENAME_MODE],
|
||||
[
|
||||
AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
|
||||
AC_CHECK_FUNCS_ONCE([canonicalize_file_name])
|
||||
AC_REQUIRE([gl_FUNC_FACCESSAT_EOVERFLOW])
|
||||
AC_REQUIRE([gl_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK])
|
||||
AC_CHECK_FUNCS_ONCE([canonicalize_file_name faccessat])
|
||||
AC_REQUIRE([gl_DOUBLE_SLASH_ROOT])
|
||||
AC_REQUIRE([gl_FUNC_REALPATH_WORKS])
|
||||
if test $ac_cv_func_canonicalize_file_name = no; then
|
||||
|
@ -56,7 +58,9 @@ AC_DEFUN([gl_CANONICALIZE_LGPL],
|
|||
AC_DEFUN([gl_CANONICALIZE_LGPL_SEPARATE],
|
||||
[
|
||||
AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
|
||||
AC_CHECK_FUNCS_ONCE([canonicalize_file_name readlink])
|
||||
AC_REQUIRE([gl_FUNC_FACCESSAT_EOVERFLOW])
|
||||
AC_REQUIRE([gl_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK])
|
||||
AC_CHECK_FUNCS_ONCE([canonicalize_file_name faccessat])
|
||||
|
||||
dnl On native Windows, we use _getcwd(), regardless whether getcwd() is
|
||||
dnl available through the linker option '-loldnames'.
|
||||
|
|
160
m4/extensions.m4
160
m4/extensions.m4
|
@ -1,4 +1,4 @@
|
|||
# serial 18 -*- Autoconf -*-
|
||||
# serial 21 -*- Autoconf -*-
|
||||
# Enable extensions on systems that normally disable them.
|
||||
|
||||
# Copyright (C) 2003, 2006-2020 Free Software Foundation, Inc.
|
||||
|
@ -6,9 +6,14 @@
|
|||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
dnl Define to empty for the benefit of Autoconf 2.69 and earlier, so that
|
||||
dnl AC_USE_SYSTEM_EXTENSIONS (below) can be used unchanged from Autoconf 2.70+.
|
||||
m4_ifndef([AC_CHECK_INCLUDES_DEFAULT],
|
||||
[AC_DEFUN([AC_CHECK_INCLUDES_DEFAULT], [])])
|
||||
|
||||
# This definition of AC_USE_SYSTEM_EXTENSIONS is stolen from git
|
||||
# Autoconf. Perhaps we can remove this once we can assume Autoconf
|
||||
# 2.70 or later everywhere, but since Autoconf mutates rapidly
|
||||
# is recent-enough everywhere, but since Autoconf mutates rapidly
|
||||
# enough in this area it's likely we'll need to redefine
|
||||
# AC_USE_SYSTEM_EXTENSIONS for quite some time.
|
||||
|
||||
|
@ -26,36 +31,27 @@
|
|||
# its dependencies. This will ensure that the gl_USE_SYSTEM_EXTENSIONS
|
||||
# invocation occurs in gl_EARLY, not in gl_INIT.
|
||||
|
||||
m4_version_prereq([2.70.1], [], [
|
||||
|
||||
# AC_USE_SYSTEM_EXTENSIONS
|
||||
# ------------------------
|
||||
# Enable extensions on systems that normally disable them,
|
||||
# typically due to standards-conformance issues.
|
||||
#
|
||||
# Remember that #undef in AH_VERBATIM gets replaced with #define by
|
||||
# AC_DEFINE. The goal here is to define all known feature-enabling
|
||||
# macros, then, if reports of conflicts are made, disable macros that
|
||||
# cause problems on some platforms (such as __EXTENSIONS__).
|
||||
# We unconditionally define as many of the known feature-enabling
|
||||
# as possible, reserving conditional behavior for macros that are
|
||||
# known to cause problems on some platforms (such as __EXTENSIONS__).
|
||||
AC_DEFUN_ONCE([AC_USE_SYSTEM_EXTENSIONS],
|
||||
[AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl
|
||||
[AC_BEFORE([$0], [AC_PREPROC_IFELSE])dnl
|
||||
AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl
|
||||
AC_BEFORE([$0], [AC_LINK_IFELSE])dnl
|
||||
AC_BEFORE([$0], [AC_RUN_IFELSE])dnl
|
||||
|
||||
AC_CHECK_HEADER([minix/config.h], [MINIX=yes], [MINIX=])
|
||||
if test "$MINIX" = yes; then
|
||||
AC_DEFINE([_POSIX_SOURCE], [1],
|
||||
[Define to 1 if you need to in order for 'stat' and other
|
||||
things to work.])
|
||||
AC_DEFINE([_POSIX_1_SOURCE], [2],
|
||||
[Define to 2 if the system does not provide POSIX.1 features
|
||||
except with this defined.])
|
||||
AC_DEFINE([_MINIX], [1],
|
||||
[Define to 1 if on MINIX.])
|
||||
AC_DEFINE([_NETBSD_SOURCE], [1],
|
||||
[Define to 1 to make NetBSD features available. MINIX 3 needs this.])
|
||||
fi
|
||||
|
||||
AC_BEFORE([$0], [AC_CHECK_INCLUDES_DEFAULT])dnl
|
||||
dnl #undef in AH_VERBATIM gets replaced with #define by AC_DEFINE.
|
||||
dnl Use a different key than __EXTENSIONS__, as that name broke existing
|
||||
dnl configure.ac when using autoheader 2.62.
|
||||
AH_VERBATIM([USE_SYSTEM_EXTENSIONS],
|
||||
dnl The macros below are in alphabetical order ignoring leading _ or __
|
||||
dnl prefixes.
|
||||
AH_VERBATIM([USE_SYSTEM_EXTENSIONS],
|
||||
[/* Enable extensions on AIX 3, Interix. */
|
||||
#ifndef _ALL_SOURCE
|
||||
# undef _ALL_SOURCE
|
||||
|
@ -64,19 +60,44 @@ dnl configure.ac when using autoheader 2.62.
|
|||
#ifndef _DARWIN_C_SOURCE
|
||||
# undef _DARWIN_C_SOURCE
|
||||
#endif
|
||||
/* Enable general extensions on Solaris. */
|
||||
#ifndef __EXTENSIONS__
|
||||
# undef __EXTENSIONS__
|
||||
#endif
|
||||
/* Enable GNU extensions on systems that have them. */
|
||||
#ifndef _GNU_SOURCE
|
||||
# undef _GNU_SOURCE
|
||||
#endif
|
||||
/* Enable NetBSD extensions on NetBSD. */
|
||||
/* Enable X/Open compliant socket functions that do not require linking
|
||||
with -lxnet on HP-UX 11.11. */
|
||||
#ifndef _HPUX_ALT_XOPEN_SOCKET_API
|
||||
# undef _HPUX_ALT_XOPEN_SOCKET_API
|
||||
#endif
|
||||
/* Identify the host operating system as Minix.
|
||||
This macro does not affect the system headers' behavior.
|
||||
A future release of Autoconf may stop defining this macro. */
|
||||
#ifndef _MINIX
|
||||
# undef _MINIX
|
||||
#endif
|
||||
/* Enable general extensions on NetBSD.
|
||||
Enable NetBSD compatibility extensions on Minix. */
|
||||
#ifndef _NETBSD_SOURCE
|
||||
# undef _NETBSD_SOURCE
|
||||
#endif
|
||||
/* Enable OpenBSD extensions on NetBSD. */
|
||||
/* Enable OpenBSD compatibility extensions on NetBSD.
|
||||
Oddly enough, this does nothing on OpenBSD. */
|
||||
#ifndef _OPENBSD_SOURCE
|
||||
# undef _OPENBSD_SOURCE
|
||||
#endif
|
||||
/* Enable threading extensions on Solaris. */
|
||||
/* Define to 1 if needed for POSIX-compatible behavior. */
|
||||
#ifndef _POSIX_SOURCE
|
||||
# undef _POSIX_SOURCE
|
||||
#endif
|
||||
/* Define to 2 if needed for POSIX-compatible behavior. */
|
||||
#ifndef _POSIX_1_SOURCE
|
||||
# undef _POSIX_1_SOURCE
|
||||
#endif
|
||||
/* Enable POSIX-compatible threading on Solaris. */
|
||||
#ifndef _POSIX_PTHREAD_SEMANTICS
|
||||
# undef _POSIX_PTHREAD_SEMANTICS
|
||||
#endif
|
||||
|
@ -112,22 +133,19 @@ dnl configure.ac when using autoheader 2.62.
|
|||
#ifndef _TANDEM_SOURCE
|
||||
# undef _TANDEM_SOURCE
|
||||
#endif
|
||||
/* Enable X/Open extensions if necessary. HP-UX 11.11 defines
|
||||
mbstate_t only if _XOPEN_SOURCE is defined to 500, regardless of
|
||||
whether compiling with -Ae or -D_HPUX_SOURCE=1. */
|
||||
/* Enable X/Open extensions. Define to 500 only if necessary
|
||||
to make mbstate_t available. */
|
||||
#ifndef _XOPEN_SOURCE
|
||||
# undef _XOPEN_SOURCE
|
||||
#endif
|
||||
/* Enable X/Open compliant socket functions that do not require linking
|
||||
with -lxnet on HP-UX 11.11. */
|
||||
#ifndef _HPUX_ALT_XOPEN_SOCKET_API
|
||||
# undef _HPUX_ALT_XOPEN_SOCKET_API
|
||||
#endif
|
||||
/* Enable general extensions on Solaris. */
|
||||
#ifndef __EXTENSIONS__
|
||||
# undef __EXTENSIONS__
|
||||
#endif
|
||||
])
|
||||
])dnl
|
||||
|
||||
AC_REQUIRE([AC_CHECK_INCLUDES_DEFAULT])dnl
|
||||
_AC_CHECK_HEADER_ONCE([wchar.h])
|
||||
_AC_CHECK_HEADER_ONCE([minix/config.h])
|
||||
|
||||
dnl Defining __EXTENSIONS__ may break the system headers on some systems.
|
||||
dnl (FIXME: Which ones?)
|
||||
AC_CACHE_CHECK([whether it is safe to define __EXTENSIONS__],
|
||||
[ac_cv_safe_to_define___extensions__],
|
||||
[AC_COMPILE_IFELSE(
|
||||
|
@ -136,11 +154,33 @@ dnl configure.ac when using autoheader 2.62.
|
|||
]AC_INCLUDES_DEFAULT])],
|
||||
[ac_cv_safe_to_define___extensions__=yes],
|
||||
[ac_cv_safe_to_define___extensions__=no])])
|
||||
test $ac_cv_safe_to_define___extensions__ = yes &&
|
||||
AC_DEFINE([__EXTENSIONS__])
|
||||
|
||||
dnl HP-UX 11.11 defines mbstate_t only if _XOPEN_SOURCE is defined to
|
||||
dnl 500, regardless of whether compiling with -Ae or -D_HPUX_SOURCE=1.
|
||||
dnl But defining _XOPEN_SOURCE may turn *off* extensions on platforms
|
||||
dnl not covered by turn-on-extensions macros (notably Dragonfly, Free,
|
||||
dnl and OpenBSD, which don't have any equivalent of _NETBSD_SOURCE) so
|
||||
dnl it should only be defined when necessary.
|
||||
AC_CACHE_CHECK([whether _XOPEN_SOURCE should be defined],
|
||||
[ac_cv_should_define__xopen_source],
|
||||
[ac_cv_should_define__xopen_source=no
|
||||
AS_IF([test $ac_cv_header_wchar_h = yes],
|
||||
[AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM([[
|
||||
#include <wchar.h>
|
||||
mbstate_t x;]])],
|
||||
[],
|
||||
[AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM([[
|
||||
#define _XOPEN_SOURCE 500
|
||||
#include <wchar.h>
|
||||
mbstate_t x;]])],
|
||||
[ac_cv_should_define__xopen_source=yes])])])])
|
||||
|
||||
AC_DEFINE([_ALL_SOURCE])
|
||||
AC_DEFINE([_DARWIN_C_SOURCE])
|
||||
AC_DEFINE([_GNU_SOURCE])
|
||||
AC_DEFINE([_HPUX_ALT_XOPEN_SOCKET_API])
|
||||
AC_DEFINE([_NETBSD_SOURCE])
|
||||
AC_DEFINE([_OPENBSD_SOURCE])
|
||||
AC_DEFINE([_POSIX_PTHREAD_SEMANTICS])
|
||||
|
@ -152,24 +192,18 @@ dnl configure.ac when using autoheader 2.62.
|
|||
AC_DEFINE([__STDC_WANT_LIB_EXT2__])
|
||||
AC_DEFINE([__STDC_WANT_MATH_SPEC_FUNCS__])
|
||||
AC_DEFINE([_TANDEM_SOURCE])
|
||||
AC_CACHE_CHECK([whether _XOPEN_SOURCE should be defined],
|
||||
[ac_cv_should_define__xopen_source],
|
||||
[ac_cv_should_define__xopen_source=no
|
||||
AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM([[
|
||||
#include <wchar.h>
|
||||
mbstate_t x;]])],
|
||||
[],
|
||||
[AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM([[
|
||||
#define _XOPEN_SOURCE 500
|
||||
#include <wchar.h>
|
||||
mbstate_t x;]])],
|
||||
[ac_cv_should_define__xopen_source=yes])])])
|
||||
test $ac_cv_should_define__xopen_source = yes &&
|
||||
AC_DEFINE([_XOPEN_SOURCE], [500])
|
||||
AC_DEFINE([_HPUX_ALT_XOPEN_SOCKET_API])
|
||||
AS_IF([test $ac_cv_header_minix_config_h = yes],
|
||||
[MINIX=yes
|
||||
AC_DEFINE([_MINIX])
|
||||
AC_DEFINE([_POSIX_SOURCE])
|
||||
AC_DEFINE([_POSIX_1_SOURCE], [2])],
|
||||
[MINIX=])
|
||||
AS_IF([test $ac_cv_safe_to_define___extensions__ = yes],
|
||||
[AC_DEFINE([__EXTENSIONS__])])
|
||||
AS_IF([test $ac_cv_should_define__xopen_source = yes],
|
||||
[AC_DEFINE([_XOPEN_SOURCE], [500])])
|
||||
])# AC_USE_SYSTEM_EXTENSIONS
|
||||
])
|
||||
|
||||
# gl_USE_SYSTEM_EXTENSIONS
|
||||
# ------------------------
|
||||
|
@ -177,13 +211,5 @@ dnl configure.ac when using autoheader 2.62.
|
|||
# typically due to standards-conformance issues.
|
||||
AC_DEFUN_ONCE([gl_USE_SYSTEM_EXTENSIONS],
|
||||
[
|
||||
dnl Require this macro before AC_USE_SYSTEM_EXTENSIONS.
|
||||
dnl gnulib does not need it. But if it gets required by third-party macros
|
||||
dnl after AC_USE_SYSTEM_EXTENSIONS is required, autoconf 2.62..2.63 emit a
|
||||
dnl warning: "AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS".
|
||||
dnl Note: We can do this only for one of the macros AC_AIX, AC_GNU_SOURCE,
|
||||
dnl AC_MINIX. If people still use AC_AIX or AC_MINIX, they are out of luck.
|
||||
AC_REQUIRE([AC_GNU_SOURCE])
|
||||
|
||||
AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
|
||||
])
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# serial 8
|
||||
# serial 9
|
||||
# See if we need to provide faccessat replacement.
|
||||
|
||||
dnl Copyright (C) 2009-2020 Free Software Foundation, Inc.
|
||||
|
@ -8,6 +8,31 @@ dnl with or without modifications, as long as this notice is preserved.
|
|||
|
||||
# Written by Eric Blake.
|
||||
|
||||
AC_DEFUN([gl_FUNC_FACCESSAT_EOVERFLOW],
|
||||
[
|
||||
AC_CHECK_FUNCS_ONCE([faccessat])
|
||||
if test "$ac_cv_func_faccessat" = yes; then
|
||||
AC_CACHE_CHECK([whether faccessat works when stat would EOVERFLOW],
|
||||
[gl_cv_func_faccessat_never_eoverflows],
|
||||
[AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM([],
|
||||
[[#ifdef __linux__
|
||||
#include <linux/version.h>
|
||||
#if (! (KERNEL_VERSION (5, 8, 0) <= LINUX_VERSION_CODE \
|
||||
&& 2 < (__GLIBC__ + (33 <= __GLIBC_MINOR__))))
|
||||
#error "faccessat might fail with EOVERFLOW"
|
||||
#endif
|
||||
#endif
|
||||
]])],
|
||||
[gl_cv_func_faccessat_never_eoverflows=yes],
|
||||
[gl_cv_func_faccessat_never_eoverflows=no])])
|
||||
if test "$gl_cv_func_faccessat_never_eoverflows" = yes; then
|
||||
AC_DEFINE([FACCESSAT_NEVER_EOVERFLOWS], 1,
|
||||
[Define to 1 if faccessat is EOVERFLOW-free.])
|
||||
fi
|
||||
fi
|
||||
])
|
||||
|
||||
AC_DEFUN([gl_FUNC_FACCESSAT],
|
||||
[
|
||||
AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
|
||||
|
@ -16,12 +41,14 @@ AC_DEFUN([gl_FUNC_FACCESSAT],
|
|||
dnl Persuade glibc <unistd.h> to declare faccessat().
|
||||
AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
|
||||
|
||||
AC_REQUIRE([gl_FUNC_FACCESSAT_EOVERFLOW])
|
||||
|
||||
AC_CHECK_FUNCS_ONCE([faccessat])
|
||||
if test $ac_cv_func_faccessat = no; then
|
||||
HAVE_FACCESSAT=0
|
||||
else
|
||||
case "$gl_cv_func_lstat_dereferences_slashed_symlink" in
|
||||
*yes) ;;
|
||||
case $gl_cv_func_lstat_dereferences_slashed_symlink,$gl_cv_func_faccessat_never_eoverflows in
|
||||
*yes,*yes) ;;
|
||||
*) REPLACE_FACCESSAT=1 ;;
|
||||
esac
|
||||
fi
|
||||
|
|
52
m4/fcntl.m4
52
m4/fcntl.m4
|
@ -1,4 +1,4 @@
|
|||
# fcntl.m4 serial 10
|
||||
# fcntl.m4 serial 11
|
||||
dnl Copyright (C) 2009-2020 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
|
@ -81,15 +81,29 @@ AC_DEFUN([gl_FUNC_FCNTL],
|
|||
behavior does not match POSIX]) ;;
|
||||
esac
|
||||
|
||||
dnl Many systems lack F_DUPFD_CLOEXEC
|
||||
dnl Many systems lack F_DUPFD_CLOEXEC.
|
||||
dnl NetBSD 9.0 declares F_DUPFD_CLOEXEC but it works only like F_DUPFD.
|
||||
AC_CACHE_CHECK([whether fcntl understands F_DUPFD_CLOEXEC],
|
||||
[gl_cv_func_fcntl_f_dupfd_cloexec],
|
||||
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
||||
#include <fcntl.h>
|
||||
#ifndef F_DUPFD_CLOEXEC
|
||||
choke me
|
||||
#endif
|
||||
]])],
|
||||
[AC_RUN_IFELSE(
|
||||
[AC_LANG_SOURCE(
|
||||
[[#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
int main (int argc, char *argv[])
|
||||
{
|
||||
if (argc == 1)
|
||||
/* parent process */
|
||||
{
|
||||
if (fcntl (1, F_DUPFD_CLOEXEC, 10) < 0)
|
||||
return 1;
|
||||
return execl ("./conftest", "./conftest", "child", NULL);
|
||||
}
|
||||
else
|
||||
/* child process */
|
||||
return (fcntl (10, F_GETFL) < 0 ? 0 : 42);
|
||||
}
|
||||
]])
|
||||
],
|
||||
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
||||
#ifdef __linux__
|
||||
/* The Linux kernel only added F_DUPFD_CLOEXEC in 2.6.24, so we always replace
|
||||
|
@ -98,12 +112,22 @@ choke me
|
|||
#endif
|
||||
]])],
|
||||
[gl_cv_func_fcntl_f_dupfd_cloexec=yes],
|
||||
[gl_cv_func_fcntl_f_dupfd_cloexec="needs runtime check"])],
|
||||
[gl_cv_func_fcntl_f_dupfd_cloexec=no])])
|
||||
if test "$gl_cv_func_fcntl_f_dupfd_cloexec" != yes; then
|
||||
gl_REPLACE_FCNTL
|
||||
dnl No witness macro needed for this bug.
|
||||
fi
|
||||
[gl_cv_func_fcntl_f_dupfd_cloexec="needs runtime check"])
|
||||
],
|
||||
[gl_cv_func_fcntl_f_dupfd_cloexec=no],
|
||||
[case "$host_os" in
|
||||
# Guess no on NetBSD.
|
||||
netbsd*) gl_cv_func_fcntl_f_dupfd_cloexec="guessing no" ;;
|
||||
*) gl_cv_func_fcntl_f_dupfd_cloexec="$gl_cross_guess_normal" ;;
|
||||
esac
|
||||
])
|
||||
])
|
||||
case "$gl_cv_func_fcntl_f_dupfd_cloexec" in
|
||||
*yes) ;;
|
||||
*) gl_REPLACE_FCNTL
|
||||
dnl No witness macro needed for this bug.
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
dnl Replace fcntl() for supporting the gnulib-defined fchdir() function,
|
||||
dnl to keep fchdir's bookkeeping up-to-date.
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# filemode.m4 serial 8
|
||||
# filemode.m4 serial 9
|
||||
dnl Copyright (C) 2002, 2005-2006, 2009-2020 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
|
@ -6,6 +6,5 @@ dnl with or without modifications, as long as this notice is preserved.
|
|||
|
||||
AC_DEFUN([gl_FILEMODE],
|
||||
[
|
||||
AC_REQUIRE([AC_STRUCT_ST_DM_MODE])
|
||||
AC_CHECK_DECLS_ONCE([strmode])
|
||||
])
|
||||
|
|
49
m4/free.m4
Normal file
49
m4/free.m4
Normal file
|
@ -0,0 +1,49 @@
|
|||
# free.m4 serial 5
|
||||
# Copyright (C) 2003-2005, 2009-2020 Free Software Foundation, Inc.
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# Written by Paul Eggert and Bruno Haible.
|
||||
|
||||
AC_DEFUN([gl_FUNC_FREE],
|
||||
[
|
||||
AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
|
||||
|
||||
dnl In the next release of POSIX, free must preserve errno.
|
||||
dnl https://www.austingroupbugs.net/view.php?id=385
|
||||
dnl https://sourceware.org/bugzilla/show_bug.cgi?id=17924
|
||||
dnl So far, we know of three platforms that do this:
|
||||
dnl * glibc >= 2.33, thanks to the fix for this bug:
|
||||
dnl <https://sourceware.org/bugzilla/show_bug.cgi?id=17924>
|
||||
dnl * OpenBSD >= 4.5, thanks to this commit:
|
||||
dnl <https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdlib/malloc.c.diff?r1=1.100&r2=1.101&f=h>
|
||||
dnl * Solaris, because its malloc() implementation is based on brk(),
|
||||
dnl not mmap(); hence its free() implementation makes no system calls.
|
||||
dnl For other platforms, you can only be sure if they state it in their
|
||||
dnl documentation, or by code inspection of the free() implementation in libc.
|
||||
AC_CACHE_CHECK([whether free is known to preserve errno],
|
||||
[gl_cv_func_free_preserves_errno],
|
||||
[AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[[#include <stdlib.h>
|
||||
]],
|
||||
[[#if 2 < __GLIBC__ + (33 <= __GLIBC_MINOR__)
|
||||
#elif defined __OpenBSD__
|
||||
#elif defined __sun
|
||||
#else
|
||||
#error "'free' is not known to preserve errno"
|
||||
#endif
|
||||
]])],
|
||||
[gl_cv_func_free_preserves_errno=yes],
|
||||
[gl_cv_func_free_preserves_errno=no])
|
||||
])
|
||||
|
||||
case $gl_cv_func_free_preserves_errno in
|
||||
*yes) ;;
|
||||
*) REPLACE_FREE=1 ;;
|
||||
esac
|
||||
])
|
||||
|
||||
# Prerequisites of lib/free.c.
|
||||
AC_DEFUN([gl_PREREQ_FREE], [:])
|
|
@ -1,4 +1,4 @@
|
|||
# serial 34
|
||||
# serial 35
|
||||
# Obtaining file system usage information.
|
||||
|
||||
# Copyright (C) 1997-1998, 2000-2001, 2003-2020 Free Software Foundation, Inc.
|
||||
|
@ -36,7 +36,6 @@ AC_DEFUN([gl_FILE_SYSTEM_USAGE],
|
|||
dnl Mac OS X >= 10.5 (32-bit mode).
|
||||
AC_REQUIRE([AC_SYS_LARGEFILE])
|
||||
|
||||
AC_MSG_CHECKING([how to get file system space usage])
|
||||
ac_fsusage_space=no
|
||||
|
||||
# Perform only the link test since it seems there are no variants of the
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# gnulib-common.m4 serial 57
|
||||
# gnulib-common.m4 serial 63
|
||||
dnl Copyright (C) 2007-2020 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
|
@ -483,23 +483,17 @@ AC_DEFUN([gl_FEATURES_H],
|
|||
# gl_PROG_CC_C99
|
||||
# Modifies the value of the shell variable CC in an attempt to make $CC
|
||||
# understand ISO C99 source code.
|
||||
# This is like AC_PROG_CC_C99, except that
|
||||
# - AC_PROG_CC_C99 does not mix well with AC_PROG_CC_STDC
|
||||
# <https://lists.gnu.org/r/bug-gnulib/2011-09/msg00367.html>,
|
||||
# but many more packages use AC_PROG_CC_STDC than AC_PROG_CC_C99
|
||||
# <https://lists.gnu.org/r/bug-gnulib/2011-09/msg00441.html>.
|
||||
# Remaining problems:
|
||||
# - When AC_PROG_CC_STDC is invoked twice, it adds the C99 enabling options
|
||||
# to CC twice
|
||||
# <https://lists.gnu.org/r/bug-gnulib/2011-09/msg00431.html>.
|
||||
# - AC_PROG_CC_STDC is likely to change now that C11 is an ISO standard.
|
||||
AC_DEFUN([gl_PROG_CC_C99],
|
||||
[
|
||||
dnl Change that version number to the minimum Autoconf version that supports
|
||||
dnl mixing AC_PROG_CC_C99 calls with AC_PROG_CC_STDC calls.
|
||||
m4_version_prereq([9.0],
|
||||
[AC_REQUIRE([AC_PROG_CC_C99])],
|
||||
[AC_REQUIRE([AC_PROG_CC_STDC])])
|
||||
dnl Just use AC_PROG_CC_C99.
|
||||
dnl When AC_PROG_CC_C99 and AC_PROG_CC_STDC are used together, the substituted
|
||||
dnl value of CC will contain the C99 enabling options twice. But this is only
|
||||
dnl a cosmetic problem.
|
||||
dnl With Autoconf >= 2.70, use AC_PROG_CC since it implies AC_PROG_CC_C99;
|
||||
dnl this avoids a "warning: The macro `AC_PROG_CC_C99' is obsolete."
|
||||
m4_version_prereq([2.70],
|
||||
[AC_REQUIRE([AC_PROG_CC])],
|
||||
[AC_REQUIRE([AC_PROG_CC_C99])])
|
||||
])
|
||||
|
||||
# gl_PROG_AR_RANLIB
|
||||
|
@ -573,16 +567,16 @@ Amsterdam
|
|||
])
|
||||
|
||||
# AC_C_RESTRICT
|
||||
# This definition is copied from post-2.69 Autoconf and overrides the
|
||||
# AC_C_RESTRICT macro from autoconf 2.60..2.69. It can be removed
|
||||
# once autoconf >= 2.70 can be assumed. It's painful to check version
|
||||
# numbers, and in practice this macro is more up-to-date than Autoconf
|
||||
# is, so override Autoconf unconditionally.
|
||||
# This definition is copied from post-2.70 Autoconf and overrides the
|
||||
# AC_C_RESTRICT macro from autoconf 2.60..2.70.
|
||||
m4_version_prereq([2.70.1], [], [
|
||||
AC_DEFUN([AC_C_RESTRICT],
|
||||
[AC_CACHE_CHECK([for C/C++ restrict keyword], [ac_cv_c_restrict],
|
||||
[ac_cv_c_restrict=no
|
||||
# The order here caters to the fact that C++ does not require restrict.
|
||||
for ac_kw in __restrict __restrict__ _Restrict restrict; do
|
||||
# Put '__restrict__' first, to avoid problems with glibc and non-GCC; see:
|
||||
# https://lists.gnu.org/archive/html/bug-autoconf/2016-02/msg00006.html
|
||||
# Put 'restrict' last, because C++ lacks it.
|
||||
for ac_kw in __restrict__ __restrict _Restrict restrict; do
|
||||
AC_COMPILE_IFELSE(
|
||||
[AC_LANG_PROGRAM(
|
||||
[[typedef int *int_ptr;
|
||||
|
@ -602,7 +596,7 @@ AC_DEFUN([AC_C_RESTRICT],
|
|||
AH_VERBATIM([restrict],
|
||||
[/* Define to the equivalent of the C99 'restrict' keyword, or to
|
||||
nothing if this is not supported. Do not define if restrict is
|
||||
supported directly. */
|
||||
supported only directly. */
|
||||
#undef restrict
|
||||
/* Work around a bug in older versions of Sun C++, which did not
|
||||
#define __restrict__ or support _Restrict or __restrict__
|
||||
|
@ -620,6 +614,7 @@ AC_DEFUN([AC_C_RESTRICT],
|
|||
*) AC_DEFINE_UNQUOTED([restrict], [$ac_cv_c_restrict]) ;;
|
||||
esac
|
||||
])# AC_C_RESTRICT
|
||||
])
|
||||
|
||||
# gl_BIGENDIAN
|
||||
# is like AC_C_BIGENDIAN, except that it can be AC_REQUIREd.
|
||||
|
@ -630,13 +625,20 @@ AC_DEFUN([gl_BIGENDIAN],
|
|||
AC_C_BIGENDIAN
|
||||
])
|
||||
|
||||
# A temporary file descriptor.
|
||||
# Must be less than 10, because dash 0.5.8 does not support redirections
|
||||
# with multi-digit file descriptors.
|
||||
m4_define([GL_TMP_FD], 9)
|
||||
|
||||
# gl_SILENT(command)
|
||||
# executes command, but without the normal configure output.
|
||||
# This is useful when you want to invoke AC_CACHE_CHECK (or AC_CHECK_FUNC etc.)
|
||||
# inside another AC_CACHE_CHECK.
|
||||
AC_DEFUN([gl_SILENT],
|
||||
[
|
||||
{
|
||||
$1
|
||||
} AS_MESSAGE_FD>/dev/null
|
||||
exec GL_TMP_FD>&AS_MESSAGE_FD AS_MESSAGE_FD>/dev/null
|
||||
$1
|
||||
exec AS_MESSAGE_FD>&GL_TMP_FD GL_TMP_FD>&-
|
||||
])
|
||||
|
||||
# gl_CACHE_VAL_SILENT(cache-id, command-to-set-it)
|
||||
|
@ -646,10 +648,9 @@ AC_DEFUN([gl_SILENT],
|
|||
# by an AC_MSG_CHECKING/AC_MSG_RESULT pair.
|
||||
AC_DEFUN([gl_CACHE_VAL_SILENT],
|
||||
[
|
||||
saved_as_echo_n="$as_echo_n"
|
||||
as_echo_n=':'
|
||||
AC_CACHE_VAL([$1], [$2])
|
||||
as_echo_n="$saved_as_echo_n"
|
||||
gl_SILENT([
|
||||
AC_CACHE_VAL([$1], [$2])
|
||||
])
|
||||
])
|
||||
|
||||
dnl Expands to some code for use in .c programs that, on native Windows, defines
|
||||
|
|
|
@ -75,6 +75,7 @@ AC_DEFUN([gl_EARLY],
|
|||
# Code from module dtoastr:
|
||||
# Code from module dtotimespec:
|
||||
# Code from module dup2:
|
||||
# Code from module eloop-threshold:
|
||||
# Code from module environ:
|
||||
# Code from module errno:
|
||||
# Code from module euidaccess:
|
||||
|
@ -94,6 +95,7 @@ AC_DEFUN([gl_EARLY],
|
|||
# Code from module fpending:
|
||||
# Code from module fpieee:
|
||||
AC_REQUIRE([gl_FP_IEEE])
|
||||
# Code from module free-posix:
|
||||
# Code from module fstatat:
|
||||
# Code from module fsusage:
|
||||
# Code from module fsync:
|
||||
|
@ -109,6 +111,7 @@ AC_DEFUN([gl_EARLY],
|
|||
# Code from module gettimeofday:
|
||||
# Code from module gitlog-to-changelog:
|
||||
# Code from module group-member:
|
||||
# Code from module idx:
|
||||
# Code from module ieee754-h:
|
||||
# Code from module ignore-value:
|
||||
# Code from module include_next:
|
||||
|
@ -121,7 +124,6 @@ AC_DEFUN([gl_EARLY],
|
|||
# Code from module libgmp:
|
||||
# Code from module limits-h:
|
||||
# Code from module lstat:
|
||||
# Code from module malloca:
|
||||
# Code from module manywarnings:
|
||||
# Code from module memmem-simple:
|
||||
# Code from module mempcpy:
|
||||
|
@ -140,10 +142,12 @@ AC_DEFUN([gl_EARLY],
|
|||
# Code from module pselect:
|
||||
# Code from module pthread_sigmask:
|
||||
# Code from module qcopy-acl:
|
||||
# Code from module rawmemchr:
|
||||
# Code from module readlink:
|
||||
# Code from module readlinkat:
|
||||
# Code from module regex:
|
||||
# Code from module root-uid:
|
||||
# Code from module scratch_buffer:
|
||||
# Code from module sig2str:
|
||||
# Code from module sigdescr_np:
|
||||
# Code from module signal-h:
|
||||
|
@ -288,6 +292,12 @@ AC_DEFUN([gl_INIT],
|
|||
if test $gl_cv_func___fpending = no; then
|
||||
AC_LIBOBJ([fpending])
|
||||
fi
|
||||
gl_FUNC_FREE
|
||||
if test $REPLACE_FREE = 1; then
|
||||
AC_LIBOBJ([free])
|
||||
gl_PREREQ_FREE
|
||||
fi
|
||||
gl_STDLIB_MODULE_INDICATOR([free-posix])
|
||||
gl_FUNC_FSTATAT
|
||||
if test $HAVE_FSTATAT = 0 || test $REPLACE_FSTATAT = 1; then
|
||||
AC_LIBOBJ([fstatat])
|
||||
|
@ -507,17 +517,20 @@ AC_DEFUN([gl_INIT],
|
|||
gl_gnulib_enabled_260941c0e5dc67ec9e87d1fb321c300b=false
|
||||
gl_gnulib_enabled_cloexec=false
|
||||
gl_gnulib_enabled_dirfd=false
|
||||
gl_gnulib_enabled_925677f0343de64b89a9f0c790b4104c=false
|
||||
gl_gnulib_enabled_euidaccess=false
|
||||
gl_gnulib_enabled_getdtablesize=false
|
||||
gl_gnulib_enabled_getgroups=false
|
||||
gl_gnulib_enabled_be453cec5eecf5731a274f2de7f2db36=false
|
||||
gl_gnulib_enabled_a9786850e999ae65a836a6041e8e5ed1=false
|
||||
gl_gnulib_enabled_idx=false
|
||||
gl_gnulib_enabled_lchmod=false
|
||||
gl_gnulib_enabled_malloca=false
|
||||
gl_gnulib_enabled_5264294aa0a5557541b53c8c741f7f31=false
|
||||
gl_gnulib_enabled_open=false
|
||||
gl_gnulib_enabled_03e0aaad4cb89ca757653bd367a6ccb7=false
|
||||
gl_gnulib_enabled_rawmemchr=false
|
||||
gl_gnulib_enabled_6099e9737f757db36c47fa9d9f02e88c=false
|
||||
gl_gnulib_enabled_scratch_buffer=false
|
||||
gl_gnulib_enabled_strtoll=false
|
||||
gl_gnulib_enabled_utimens=false
|
||||
gl_gnulib_enabled_682e609604ccaac6be382e4ee3a4eaec=false
|
||||
|
@ -551,6 +564,12 @@ AC_DEFUN([gl_INIT],
|
|||
gl_gnulib_enabled_dirfd=true
|
||||
fi
|
||||
}
|
||||
func_gl_gnulib_m4code_925677f0343de64b89a9f0c790b4104c ()
|
||||
{
|
||||
if ! $gl_gnulib_enabled_925677f0343de64b89a9f0c790b4104c; then
|
||||
gl_gnulib_enabled_925677f0343de64b89a9f0c790b4104c=true
|
||||
fi
|
||||
}
|
||||
func_gl_gnulib_m4code_euidaccess ()
|
||||
{
|
||||
if ! $gl_gnulib_enabled_euidaccess; then
|
||||
|
@ -616,6 +635,12 @@ AC_DEFUN([gl_INIT],
|
|||
fi
|
||||
fi
|
||||
}
|
||||
func_gl_gnulib_m4code_idx ()
|
||||
{
|
||||
if ! $gl_gnulib_enabled_idx; then
|
||||
gl_gnulib_enabled_idx=true
|
||||
fi
|
||||
}
|
||||
func_gl_gnulib_m4code_lchmod ()
|
||||
{
|
||||
if ! $gl_gnulib_enabled_lchmod; then
|
||||
|
@ -628,14 +653,6 @@ AC_DEFUN([gl_INIT],
|
|||
gl_gnulib_enabled_lchmod=true
|
||||
fi
|
||||
}
|
||||
func_gl_gnulib_m4code_malloca ()
|
||||
{
|
||||
if ! $gl_gnulib_enabled_malloca; then
|
||||
gl_MALLOCA
|
||||
gl_gnulib_enabled_malloca=true
|
||||
func_gl_gnulib_m4code_682e609604ccaac6be382e4ee3a4eaec
|
||||
fi
|
||||
}
|
||||
func_gl_gnulib_m4code_5264294aa0a5557541b53c8c741f7f31 ()
|
||||
{
|
||||
if ! $gl_gnulib_enabled_5264294aa0a5557541b53c8c741f7f31; then
|
||||
|
@ -668,12 +685,30 @@ AC_DEFUN([gl_INIT],
|
|||
gl_gnulib_enabled_03e0aaad4cb89ca757653bd367a6ccb7=true
|
||||
fi
|
||||
}
|
||||
func_gl_gnulib_m4code_rawmemchr ()
|
||||
{
|
||||
if ! $gl_gnulib_enabled_rawmemchr; then
|
||||
gl_FUNC_RAWMEMCHR
|
||||
if test $HAVE_RAWMEMCHR = 0; then
|
||||
AC_LIBOBJ([rawmemchr])
|
||||
gl_PREREQ_RAWMEMCHR
|
||||
fi
|
||||
gl_STRING_MODULE_INDICATOR([rawmemchr])
|
||||
gl_gnulib_enabled_rawmemchr=true
|
||||
fi
|
||||
}
|
||||
func_gl_gnulib_m4code_6099e9737f757db36c47fa9d9f02e88c ()
|
||||
{
|
||||
if ! $gl_gnulib_enabled_6099e9737f757db36c47fa9d9f02e88c; then
|
||||
gl_gnulib_enabled_6099e9737f757db36c47fa9d9f02e88c=true
|
||||
fi
|
||||
}
|
||||
func_gl_gnulib_m4code_scratch_buffer ()
|
||||
{
|
||||
if ! $gl_gnulib_enabled_scratch_buffer; then
|
||||
gl_gnulib_enabled_scratch_buffer=true
|
||||
fi
|
||||
}
|
||||
func_gl_gnulib_m4code_strtoll ()
|
||||
{
|
||||
if ! $gl_gnulib_enabled_strtoll; then
|
||||
|
@ -700,7 +735,16 @@ AC_DEFUN([gl_INIT],
|
|||
fi
|
||||
}
|
||||
if test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1; then
|
||||
func_gl_gnulib_m4code_malloca
|
||||
func_gl_gnulib_m4code_925677f0343de64b89a9f0c790b4104c
|
||||
fi
|
||||
if test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1; then
|
||||
func_gl_gnulib_m4code_idx
|
||||
fi
|
||||
if test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1; then
|
||||
func_gl_gnulib_m4code_rawmemchr
|
||||
fi
|
||||
if test $HAVE_CANONICALIZE_FILE_NAME = 0 || test $REPLACE_CANONICALIZE_FILE_NAME = 1; then
|
||||
func_gl_gnulib_m4code_scratch_buffer
|
||||
fi
|
||||
if test $HAVE_FACCESSAT = 0 || test $REPLACE_FACCESSAT = 1; then
|
||||
func_gl_gnulib_m4code_260941c0e5dc67ec9e87d1fb321c300b
|
||||
|
@ -747,15 +791,18 @@ AC_DEFUN([gl_INIT],
|
|||
if case $host_os in mingw*) false;; *) test $HAVE_GETRANDOM = 0 || test $REPLACE_GETRANDOM = 1;; esac; then
|
||||
func_gl_gnulib_m4code_open
|
||||
fi
|
||||
if test $HAVE_READLINKAT = 0; then
|
||||
if test $HAVE_READLINKAT = 0 || test $REPLACE_READLINKAT = 1; then
|
||||
func_gl_gnulib_m4code_260941c0e5dc67ec9e87d1fb321c300b
|
||||
fi
|
||||
if test $HAVE_READLINKAT = 0; then
|
||||
if test $HAVE_READLINKAT = 0 || test $REPLACE_READLINKAT = 1; then
|
||||
func_gl_gnulib_m4code_03e0aaad4cb89ca757653bd367a6ccb7
|
||||
fi
|
||||
if { test $HAVE_DECL_STRTOIMAX = 0 || test $REPLACE_STRTOIMAX = 1; } && test $ac_cv_type_long_long_int = yes; then
|
||||
func_gl_gnulib_m4code_strtoll
|
||||
fi
|
||||
if test $HAVE_TIMEZONE_T = 0; then
|
||||
func_gl_gnulib_m4code_idx
|
||||
fi
|
||||
if test $HAVE_TIMEGM = 0 || test $REPLACE_TIMEGM = 1; then
|
||||
func_gl_gnulib_m4code_5264294aa0a5557541b53c8c741f7f31
|
||||
fi
|
||||
|
@ -772,17 +819,20 @@ AC_DEFUN([gl_INIT],
|
|||
AM_CONDITIONAL([gl_GNULIB_ENABLED_260941c0e5dc67ec9e87d1fb321c300b], [$gl_gnulib_enabled_260941c0e5dc67ec9e87d1fb321c300b])
|
||||
AM_CONDITIONAL([gl_GNULIB_ENABLED_cloexec], [$gl_gnulib_enabled_cloexec])
|
||||
AM_CONDITIONAL([gl_GNULIB_ENABLED_dirfd], [$gl_gnulib_enabled_dirfd])
|
||||
AM_CONDITIONAL([gl_GNULIB_ENABLED_925677f0343de64b89a9f0c790b4104c], [$gl_gnulib_enabled_925677f0343de64b89a9f0c790b4104c])
|
||||
AM_CONDITIONAL([gl_GNULIB_ENABLED_euidaccess], [$gl_gnulib_enabled_euidaccess])
|
||||
AM_CONDITIONAL([gl_GNULIB_ENABLED_getdtablesize], [$gl_gnulib_enabled_getdtablesize])
|
||||
AM_CONDITIONAL([gl_GNULIB_ENABLED_getgroups], [$gl_gnulib_enabled_getgroups])
|
||||
AM_CONDITIONAL([gl_GNULIB_ENABLED_be453cec5eecf5731a274f2de7f2db36], [$gl_gnulib_enabled_be453cec5eecf5731a274f2de7f2db36])
|
||||
AM_CONDITIONAL([gl_GNULIB_ENABLED_a9786850e999ae65a836a6041e8e5ed1], [$gl_gnulib_enabled_a9786850e999ae65a836a6041e8e5ed1])
|
||||
AM_CONDITIONAL([gl_GNULIB_ENABLED_idx], [$gl_gnulib_enabled_idx])
|
||||
AM_CONDITIONAL([gl_GNULIB_ENABLED_lchmod], [$gl_gnulib_enabled_lchmod])
|
||||
AM_CONDITIONAL([gl_GNULIB_ENABLED_malloca], [$gl_gnulib_enabled_malloca])
|
||||
AM_CONDITIONAL([gl_GNULIB_ENABLED_5264294aa0a5557541b53c8c741f7f31], [$gl_gnulib_enabled_5264294aa0a5557541b53c8c741f7f31])
|
||||
AM_CONDITIONAL([gl_GNULIB_ENABLED_open], [$gl_gnulib_enabled_open])
|
||||
AM_CONDITIONAL([gl_GNULIB_ENABLED_03e0aaad4cb89ca757653bd367a6ccb7], [$gl_gnulib_enabled_03e0aaad4cb89ca757653bd367a6ccb7])
|
||||
AM_CONDITIONAL([gl_GNULIB_ENABLED_rawmemchr], [$gl_gnulib_enabled_rawmemchr])
|
||||
AM_CONDITIONAL([gl_GNULIB_ENABLED_6099e9737f757db36c47fa9d9f02e88c], [$gl_gnulib_enabled_6099e9737f757db36c47fa9d9f02e88c])
|
||||
AM_CONDITIONAL([gl_GNULIB_ENABLED_scratch_buffer], [$gl_gnulib_enabled_scratch_buffer])
|
||||
AM_CONDITIONAL([gl_GNULIB_ENABLED_strtoll], [$gl_gnulib_enabled_strtoll])
|
||||
AM_CONDITIONAL([gl_GNULIB_ENABLED_utimens], [$gl_gnulib_enabled_utimens])
|
||||
AM_CONDITIONAL([gl_GNULIB_ENABLED_682e609604ccaac6be382e4ee3a4eaec], [$gl_gnulib_enabled_682e609604ccaac6be382e4ee3a4eaec])
|
||||
|
@ -971,6 +1021,7 @@ AC_DEFUN([gl_FILE_LIST], [
|
|||
lib/dtoastr.c
|
||||
lib/dtotimespec.c
|
||||
lib/dup2.c
|
||||
lib/eloop-threshold.h
|
||||
lib/errno.in.h
|
||||
lib/euidaccess.c
|
||||
lib/execinfo.c
|
||||
|
@ -989,6 +1040,7 @@ AC_DEFUN([gl_FILE_LIST], [
|
|||
lib/flexmember.h
|
||||
lib/fpending.c
|
||||
lib/fpending.h
|
||||
lib/free.c
|
||||
lib/fstatat.c
|
||||
lib/fsusage.c
|
||||
lib/fsusage.h
|
||||
|
@ -1015,6 +1067,7 @@ AC_DEFUN([gl_FILE_LIST], [
|
|||
lib/gettimeofday.c
|
||||
lib/gl_openssl.h
|
||||
lib/group-member.c
|
||||
lib/idx.h
|
||||
lib/ieee754.in.h
|
||||
lib/ignore-value.h
|
||||
lib/intprops.h
|
||||
|
@ -1023,8 +1076,10 @@ AC_DEFUN([gl_FILE_LIST], [
|
|||
lib/libc-config.h
|
||||
lib/limits.in.h
|
||||
lib/lstat.c
|
||||
lib/malloca.c
|
||||
lib/malloca.h
|
||||
lib/malloc/scratch_buffer.h
|
||||
lib/malloc/scratch_buffer_grow.c
|
||||
lib/malloc/scratch_buffer_grow_preserve.c
|
||||
lib/malloc/scratch_buffer_set_array_size.c
|
||||
lib/md5.c
|
||||
lib/md5.h
|
||||
lib/memmem.c
|
||||
|
@ -1047,6 +1102,8 @@ AC_DEFUN([gl_FILE_LIST], [
|
|||
lib/pselect.c
|
||||
lib/pthread_sigmask.c
|
||||
lib/qcopy-acl.c
|
||||
lib/rawmemchr.c
|
||||
lib/rawmemchr.valgrind
|
||||
lib/readlink.c
|
||||
lib/readlinkat.c
|
||||
lib/regcomp.c
|
||||
|
@ -1056,6 +1113,7 @@ AC_DEFUN([gl_FILE_LIST], [
|
|||
lib/regex_internal.h
|
||||
lib/regexec.c
|
||||
lib/root-uid.h
|
||||
lib/scratch_buffer.h
|
||||
lib/set-permissions.c
|
||||
lib/sha1.c
|
||||
lib/sha1.h
|
||||
|
@ -1145,6 +1203,7 @@ AC_DEFUN([gl_FILE_LIST], [
|
|||
m4/flexmember.m4
|
||||
m4/fpending.m4
|
||||
m4/fpieee.m4
|
||||
m4/free.m4
|
||||
m4/fstatat.m4
|
||||
m4/fsusage.m4
|
||||
m4/fsync.m4
|
||||
|
@ -1168,7 +1227,6 @@ AC_DEFUN([gl_FILE_LIST], [
|
|||
m4/libgmp.m4
|
||||
m4/limits-h.m4
|
||||
m4/lstat.m4
|
||||
m4/malloca.m4
|
||||
m4/manywarnings-c++.m4
|
||||
m4/manywarnings.m4
|
||||
m4/mbstate_t.m4
|
||||
|
@ -1192,6 +1250,7 @@ AC_DEFUN([gl_FILE_LIST], [
|
|||
m4/pipe2.m4
|
||||
m4/pselect.m4
|
||||
m4/pthread_sigmask.m4
|
||||
m4/rawmemchr.m4
|
||||
m4/readlink.m4
|
||||
m4/readlinkat.m4
|
||||
m4/regex.m4
|
||||
|
@ -1203,7 +1262,6 @@ AC_DEFUN([gl_FILE_LIST], [
|
|||
m4/signal_h.m4
|
||||
m4/socklen.m4
|
||||
m4/ssize_t.m4
|
||||
m4/st_dm_mode.m4
|
||||
m4/stat-time.m4
|
||||
m4/std-gnu11.m4
|
||||
m4/stdalign.m4
|
||||
|
|
|
@ -25,7 +25,7 @@ AC_DEFUN([gl_SET_LARGEFILE_SOURCE],
|
|||
# The following implementation works around a problem in autoconf <= 2.69;
|
||||
# AC_SYS_LARGEFILE does not configure for large inodes on Mac OS X 10.5,
|
||||
# or configures them incorrectly in some cases.
|
||||
m4_version_prereq([2.70], [] ,[
|
||||
m4_version_prereq([2.70], [], [
|
||||
|
||||
# _AC_SYS_LARGEFILE_TEST_INCLUDES
|
||||
# -------------------------------
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue