Merge branch 'master' of git.sv.gnu.org:/srv/git/emacs into feature/pgtk
This commit is contained in:
commit
b64089c37b
182 changed files with 4996 additions and 1986 deletions
|
@ -4,7 +4,7 @@ AlignEscapedNewlinesLeft: true
|
|||
AlwaysBreakAfterReturnType: TopLevelDefinitions
|
||||
BreakBeforeBinaryOperators: All
|
||||
BreakBeforeBraces: GNU
|
||||
ColumnLimit: 80
|
||||
ColumnLimit: 70
|
||||
ContinuationIndentWidth: 2
|
||||
ForEachMacros: [FOR_EACH_TAIL, FOR_EACH_TAIL_SAFE]
|
||||
IncludeCategories:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -5957,6 +5957,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
|
||||
|
||||
|
|
|
@ -225,13 +225,22 @@ current buffer is restored even in case of an abnormal exit via
|
|||
|
||||
@defmac with-temp-buffer body@dots{}
|
||||
@anchor{Definition of with-temp-buffer}
|
||||
The @code{with-temp-buffer} macro evaluates the @var{body} forms
|
||||
with a temporary buffer as the current buffer. It saves the identity of
|
||||
The @code{with-temp-buffer} macro evaluates the @var{body} forms with
|
||||
a temporary buffer as the current buffer. It saves the identity of
|
||||
the current buffer, creates a temporary buffer and makes it current,
|
||||
evaluates the @var{body} forms, and finally restores the previous
|
||||
current buffer while killing the temporary buffer. By default, undo
|
||||
information (@pxref{Undo}) is not recorded in the buffer created by
|
||||
this macro (but @var{body} can enable that, if needed).
|
||||
current buffer while killing the temporary buffer.
|
||||
|
||||
@cindex undo in temporary buffers
|
||||
@cindex @code{kill-buffer-hook} in temporary buffers
|
||||
@cindex @code{kill-buffer-query-functions} in temporary buffers
|
||||
@cindex @code{buffer-list-update-hook} in temporary buffers
|
||||
By default, undo information (@pxref{Undo}) is not recorded in the
|
||||
buffer created by this macro (but @var{body} can enable that, if
|
||||
needed). The temporary buffer also does not run the hooks
|
||||
@code{kill-buffer-hook}, @code{kill-buffer-query-functions}
|
||||
(@pxref{Killing Buffers}), and @code{buffer-list-update-hook}
|
||||
(@pxref{Buffer List}).
|
||||
|
||||
The return value is the value of the last form in @var{body}. You can
|
||||
return the contents of the temporary buffer by using
|
||||
|
@ -345,9 +354,9 @@ incrementing the number until it is not the name of an existing buffer.
|
|||
|
||||
If the optional second argument @var{ignore} is non-@code{nil}, it
|
||||
should be a string, a potential buffer name. It means to consider
|
||||
that potential buffer acceptable, if it is tried, even it is the name
|
||||
of an existing buffer (which would normally be rejected). Thus, if
|
||||
buffers named @samp{foo}, @samp{foo<2>}, @samp{foo<3>} and
|
||||
that potential buffer acceptable, if it is tried, even if it is the
|
||||
name of an existing buffer (which would normally be rejected). Thus,
|
||||
if buffers named @samp{foo}, @samp{foo<2>}, @samp{foo<3>} and
|
||||
@samp{foo<4>} exist,
|
||||
|
||||
@example
|
||||
|
@ -932,13 +941,17 @@ window.
|
|||
@defvar buffer-list-update-hook
|
||||
This is a normal hook run whenever the buffer list changes. Functions
|
||||
(implicitly) running this hook are @code{get-buffer-create}
|
||||
(@pxref{Creating Buffers}), @code{rename-buffer} (@pxref{Buffer Names}),
|
||||
@code{kill-buffer} (@pxref{Killing Buffers}), @code{bury-buffer} (see
|
||||
above) and @code{select-window} (@pxref{Selecting Windows}).
|
||||
(@pxref{Creating Buffers}), @code{rename-buffer} (@pxref{Buffer
|
||||
Names}), @code{kill-buffer} (@pxref{Killing Buffers}),
|
||||
@code{bury-buffer} (see above), and @code{select-window}
|
||||
(@pxref{Selecting Windows}). This hook is not run for internal or
|
||||
temporary buffers created by @code{get-buffer-create} or
|
||||
@code{generate-new-buffer} with a non-@code{nil} argument
|
||||
@var{inhibit-buffer-hooks}.
|
||||
|
||||
Functions run by this hook should avoid calling @code{select-window}
|
||||
with a nil @var{norecord} argument or @code{with-temp-buffer} since
|
||||
either may lead to infinite recursion.
|
||||
with a @code{nil} @var{norecord} argument since this may lead to
|
||||
infinite recursion.
|
||||
@end defvar
|
||||
|
||||
@node Creating Buffers
|
||||
|
@ -951,12 +964,20 @@ either may lead to infinite recursion.
|
|||
with the specified name; @code{generate-new-buffer} always creates a new
|
||||
buffer and gives it a unique name.
|
||||
|
||||
Both functions accept an optional argument @var{inhibit-buffer-hooks}.
|
||||
If it is non-@code{nil}, the buffer they create does not run the hooks
|
||||
@code{kill-buffer-hook}, @code{kill-buffer-query-functions}
|
||||
(@pxref{Killing Buffers}), and @code{buffer-list-update-hook}
|
||||
(@pxref{Buffer List}). This avoids slowing down internal or temporary
|
||||
buffers that are never presented to users or passed on to other
|
||||
applications.
|
||||
|
||||
Other functions you can use to create buffers include
|
||||
@code{with-output-to-temp-buffer} (@pxref{Temporary Displays}) and
|
||||
@code{create-file-buffer} (@pxref{Visiting Files}). Starting a
|
||||
subprocess can also create a buffer (@pxref{Processes}).
|
||||
|
||||
@defun get-buffer-create buffer-or-name
|
||||
@defun get-buffer-create buffer-or-name &optional inhibit-buffer-hooks
|
||||
This function returns a buffer named @var{buffer-or-name}. The buffer
|
||||
returned does not become the current buffer---this function does not
|
||||
change which buffer is current.
|
||||
|
@ -980,7 +1001,7 @@ level; see @ref{Auto Major Mode}.) If the name begins with a space, the
|
|||
buffer initially disables undo information recording (@pxref{Undo}).
|
||||
@end defun
|
||||
|
||||
@defun generate-new-buffer name
|
||||
@defun generate-new-buffer name &optional inhibit-buffer-hooks
|
||||
This function returns a newly created, empty buffer, but does not make
|
||||
it current. The name of the buffer is generated by passing @var{name}
|
||||
to the function @code{generate-new-buffer-name} (@pxref{Buffer
|
||||
|
@ -1092,6 +1113,10 @@ with no arguments. The buffer being killed is the current buffer when
|
|||
they are called. The idea of this feature is that these functions will
|
||||
ask for confirmation from the user. If any of them returns @code{nil},
|
||||
@code{kill-buffer} spares the buffer's life.
|
||||
|
||||
This hook is not run for internal or temporary buffers created by
|
||||
@code{get-buffer-create} or @code{generate-new-buffer} with a
|
||||
non-@code{nil} argument @var{inhibit-buffer-hooks}.
|
||||
@end defvar
|
||||
|
||||
@defvar kill-buffer-hook
|
||||
|
@ -1100,6 +1125,10 @@ questions it is going to ask, just before actually killing the buffer.
|
|||
The buffer to be killed is current when the hook functions run.
|
||||
@xref{Hooks}. This variable is a permanent local, so its local binding
|
||||
is not cleared by changing major modes.
|
||||
|
||||
This hook is not run for internal or temporary buffers created by
|
||||
@code{get-buffer-create} or @code{generate-new-buffer} with a
|
||||
non-@code{nil} argument @var{inhibit-buffer-hooks}.
|
||||
@end defvar
|
||||
|
||||
@defopt buffer-offer-save
|
||||
|
|
|
@ -1009,13 +1009,14 @@ profiling, so we don't recommend leaving it active except when you are
|
|||
actually running the code you want to examine).
|
||||
|
||||
The profiler report buffer shows, on each line, a function that was
|
||||
called, followed by how much resources (cpu or memory) it used in
|
||||
called, preceded by how much resources (cpu or memory) it used in
|
||||
absolute and percentage terms since profiling started. If a given
|
||||
line has a @samp{+} symbol at the left-hand side, you can expand that
|
||||
line by typing @kbd{@key{RET}}, in order to see the function(s) called
|
||||
by the higher-level function. Use a prefix argument (@kbd{C-u
|
||||
@key{RET}}) to see the whole call tree below a function. Pressing
|
||||
@kbd{@key{RET}} again will collapse back to the original state.
|
||||
line has a @samp{+} symbol to the left of the function name, you can
|
||||
expand that line by typing @kbd{@key{RET}}, in order to see the
|
||||
function(s) called by the higher-level function. Use a prefix
|
||||
argument (@kbd{C-u @key{RET}}) to see the whole call tree below a
|
||||
function. Pressing @kbd{@key{RET}} again will collapse back to the
|
||||
original state.
|
||||
|
||||
Press @kbd{j} or @kbd{mouse-2} to jump to the definition of a function
|
||||
at point. Press @kbd{d} to view a function's documentation. You can
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -701,8 +701,11 @@ in @var{body}.
|
|||
The current buffer is restored even in case of an abnormal exit via
|
||||
@code{throw} or error (@pxref{Nonlocal Exits}).
|
||||
|
||||
See also @code{with-temp-buffer} in @ref{Definition of
|
||||
with-temp-buffer,, The Current Buffer}.
|
||||
Like @code{with-temp-buffer} (@pxref{Definition of with-temp-buffer,,
|
||||
Current Buffer}), the temporary buffer used by this macro does not run
|
||||
the hooks @code{kill-buffer-hook}, @code{kill-buffer-query-functions}
|
||||
(@pxref{Killing Buffers}), and @code{buffer-list-update-hook}
|
||||
(@pxref{Buffer List}).
|
||||
@end defmac
|
||||
|
||||
@node File Locks
|
||||
|
|
|
@ -2391,6 +2391,15 @@ This flag indicates that narrowing has changed in the buffer.
|
|||
This flag indicates that redisplay optimizations should not be used to
|
||||
display this buffer.
|
||||
|
||||
@item inhibit_buffer_hooks
|
||||
This flag indicates that the buffer should not run the hooks
|
||||
@code{kill-buffer-hook}, @code{kill-buffer-query-functions}
|
||||
(@pxref{Killing Buffers}), and @code{buffer-list-update-hook}
|
||||
(@pxref{Buffer List}). It is set at buffer creation (@pxref{Creating
|
||||
Buffers}), and avoids slowing down internal or temporary buffers, such
|
||||
as those created by @code{with-temp-buffer} (@pxref{Definition of
|
||||
with-temp-buffer,, Current Buffer}).
|
||||
|
||||
@item overlay_center
|
||||
This field holds the current overlay center position. @xref{Managing
|
||||
Overlays}.
|
||||
|
@ -2404,8 +2413,6 @@ after the current overlay center. @xref{Managing Overlays}.
|
|||
and @code{overlays_after} is sorted in order of increasing beginning
|
||||
position.
|
||||
|
||||
@c FIXME? the following are now all Lisp_Object BUFFER_INTERNAL_FIELD (foo).
|
||||
|
||||
@item name
|
||||
A Lisp string that names the buffer. It is guaranteed to be unique.
|
||||
@xref{Buffer Names}. This and the following fields have their names
|
||||
|
|
|
@ -381,6 +381,52 @@ 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-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
|
||||
whitespace from the start and the end of @var{string}.
|
||||
@end defun
|
||||
|
||||
@defun string-fill string length
|
||||
Attempt to Word-wrap @var{string} so that no lines are longer than
|
||||
@var{length}. Filling is done on whitespace boundaries only. If
|
||||
there are individual words that are longer than @var{length}, these
|
||||
will not be shortened.
|
||||
@end defun
|
||||
|
||||
@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
|
||||
Split @var{string} into a list of strings on newline boundaries. If
|
||||
@var{omit-nulls}, remove empty lines from the results.
|
||||
@end defun
|
||||
|
||||
@defun string-pad string length &optional padding start
|
||||
Pad @var{string} to the be of @var{length} using @var{padding} as the
|
||||
padding character (defaulting to the space character). If
|
||||
@var{string} is shorter than @var{length}, no padding is done. If
|
||||
@var{start} is @code{nil} (or not present), the padding is done to the
|
||||
end of the string, and if it's non-@code{nil}, to the start of the
|
||||
string.
|
||||
@end defun
|
||||
|
||||
@defun string-chop-newline string
|
||||
Remove the final newline, if any, from @var{string}.
|
||||
@end defun
|
||||
|
||||
@node Modifying Strings
|
||||
@section Modifying Strings
|
||||
@cindex modifying strings
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1523,10 +1523,10 @@ Now you only have to tell Gnus to include the X-face in your postings by saying
|
|||
|
||||
@example
|
||||
(setq message-default-headers
|
||||
(with-temp-buffer
|
||||
(insert "X-Face: ")
|
||||
(insert-file-contents "~/.xface")
|
||||
(buffer-string)))
|
||||
(with-temp-buffer
|
||||
(insert "X-Face: ")
|
||||
(insert-file-contents "~/.xface")
|
||||
(buffer-string)))
|
||||
@end example
|
||||
@noindent
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
@ -3584,9 +3584,6 @@ It does not set process property @code{remote-pid}.
|
|||
@item
|
||||
It does not use @code{tramp-remote-path} and
|
||||
@code{tramp-remote-process-environment}.
|
||||
|
||||
@item
|
||||
It does not set environment variable @env{INSIDE_EMACS}.
|
||||
@end itemize
|
||||
|
||||
In order to gain even more performance, it is recommended to bind
|
||||
|
@ -4880,6 +4877,8 @@ In case you have installed it from its Git repository, @ref{Recompilation}.
|
|||
@item
|
||||
I get an error @samp{Remote file error: Forbidden reentrant call of Tramp}
|
||||
|
||||
@vindex remote-file-error
|
||||
@vindex debug-ignored-errors
|
||||
Timers, process filters and sentinels, and other event based functions
|
||||
can run at any time, when a remote file operation is still running.
|
||||
This can cause @value{tramp} to block. When such a situation is
|
||||
|
@ -5021,6 +5020,7 @@ bind it to non-@code{nil} value.
|
|||
|
||||
@subsection File attributes cache
|
||||
|
||||
@vindex process-file-side-effects
|
||||
Keeping a local cache of remote file attributes in sync with the
|
||||
remote host is a time-consuming operation. Flushing and re-querying
|
||||
these attributes can tax @value{tramp} to a grinding halt on busy
|
||||
|
@ -5061,6 +5061,7 @@ root-directory, it is most likely sufficient to make the
|
|||
|
||||
@subsection Timers
|
||||
|
||||
@vindex remote-file-error
|
||||
Timers run asynchronously at any time when Emacs is waiting for
|
||||
sending a string to a process, or waiting for process output. They
|
||||
can run any remote file operation, which would conflict with the
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
75
etc/NEWS
75
etc/NEWS
|
@ -303,6 +303,14 @@ the buffer cycles the whole buffer between "only top-level headings",
|
|||
|
||||
* Changes in Specialized Modes and Packages in Emacs 28.1
|
||||
|
||||
+++
|
||||
** profiler.el
|
||||
The results displayed by 'profiler-report' now have the usage figures
|
||||
at the left hand side followed by the function name. This is intended
|
||||
to make better use of the horizontal space, in particular eliminating
|
||||
the truncation of function names. There is no way to get the former
|
||||
layout back.
|
||||
|
||||
** Loading dunnet.el in batch mode doesn't start the game any more.
|
||||
Instead you need to do "emacs -f dun-batch" to start the game in
|
||||
batch mode.
|
||||
|
@ -375,6 +383,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'.
|
||||
|
||||
|
@ -870,7 +890,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.
|
||||
|
||||
+++
|
||||
|
@ -1440,6 +1460,18 @@ that makes it a valid button.
|
|||
|
||||
** Miscellaneous
|
||||
|
||||
---
|
||||
*** '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' and 'string-chop-newline'.
|
||||
|
||||
+++
|
||||
*** New variable 'current-minibuffer-command'.
|
||||
This is like 'this-command', but it is bound recursively when entering
|
||||
|
@ -1482,7 +1514,7 @@ This new option allows the user to customize how case is converted
|
|||
when unifying entries.
|
||||
|
||||
---
|
||||
*** The user option `bibtex-maintain-sorted-entries' now permits
|
||||
*** The user option 'bibtex-maintain-sorted-entries' now permits
|
||||
user-defined sorting schemes.
|
||||
|
||||
+++
|
||||
|
@ -1821,6 +1853,13 @@ modifies the string's text properties; instead, it uses and returns
|
|||
a copy of the string. This helps avoid trouble when strings are
|
||||
shared or constants.
|
||||
|
||||
+++
|
||||
** Temporary buffers no longer run certain buffer hooks.
|
||||
The macros 'with-temp-buffer' and 'with-temp-file' no longer run the
|
||||
hooks 'kill-buffer-hook', 'kill-buffer-query-functions', and
|
||||
'buffer-list-update-hook' for the temporary buffers they create. This
|
||||
avoids slowing them down when a lot of these hooks are defined.
|
||||
|
||||
---
|
||||
** The obsolete function 'thread-alive-p' has been removed.
|
||||
|
||||
|
@ -1970,7 +2009,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.
|
||||
|
||||
+++
|
||||
|
@ -2007,7 +2046,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.
|
||||
|
||||
+++
|
||||
|
@ -2163,6 +2202,7 @@ and 'play-sound-file'.
|
|||
If this variable is non-nil, character syntax is used for printing
|
||||
numbers when this makes sense, such as '?A' for 65.
|
||||
|
||||
+++
|
||||
** New error 'remote-file-error', a subcategory of 'file-error'.
|
||||
It is signaled if a remote file operation fails due to internal
|
||||
reasons, and could block Emacs. It does not replace 'file-error'
|
||||
|
@ -2175,8 +2215,35 @@ Until it is solved you could ignore such errors by performing
|
|||
|
||||
(setq debug-ignored-errors (cons 'remote-file-error debug-ignored-errors))
|
||||
|
||||
+++
|
||||
** The error 'ftp-error' belongs also to category 'remote-file-error'.
|
||||
|
||||
+++
|
||||
** 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
|
||||
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
|
||||
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 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 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;
|
||||
}
|
||||
|
||||
|
|
|
@ -92,7 +92,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 $@ $<
|
||||
|
||||
|
@ -118,7 +118,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
|
||||
|
@ -127,7 +127,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)))
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
(keybindings :initform nil)
|
||||
(phony :initform t)
|
||||
(sourcetype :initform '(ede-source-emacs))
|
||||
(availablecompilers :initform '(ede-emacs-compiler ede-xemacs-compiler))
|
||||
(availablecompilers :initform '(ede-emacs-compiler))
|
||||
(aux-packages :initarg :aux-packages
|
||||
:initform nil
|
||||
:type list
|
||||
|
@ -104,6 +104,7 @@ For Emacs Lisp, return addsuffix command on source files."
|
|||
:name "xemacs"
|
||||
:variables '(("EMACS" . "xemacs")))
|
||||
"Compile Emacs Lisp programs with XEmacs.")
|
||||
(make-obsolete-variable 'ede-xemacs-compiler 'ede-emacs-compiler "28.1")
|
||||
|
||||
;;; Claiming files
|
||||
(cl-defmethod ede-buffer-mine ((this ede-proj-target-elisp) buffer)
|
||||
|
|
|
@ -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)))
|
||||
|
|
|
@ -825,40 +825,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
|
||||
|
|
|
@ -131,6 +131,10 @@ There can be any number of :example/:result elements."
|
|||
(mapconcat
|
||||
:eval (mapconcat (lambda (a) (concat "[" a "]"))
|
||||
'("foo" "bar" "zot") " "))
|
||||
(string-pad
|
||||
:eval (string-pad "foo" 5)
|
||||
:eval (string-pad "foobar" 5)
|
||||
:eval (string-pad "foo" 5 ?- t))
|
||||
(mapcar
|
||||
:eval (mapcar #'identity "123"))
|
||||
(format
|
||||
|
@ -139,10 +143,21 @@ There can be any number of :example/:result elements."
|
|||
(substring
|
||||
:eval (substring "foobar" 0 3)
|
||||
:eval (substring "foobar" 3))
|
||||
(string-limit
|
||||
:eval (string-limit "foobar" 3)
|
||||
:eval (string-limit "foobar" 3 t)
|
||||
: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))
|
||||
(split-string
|
||||
:eval (split-string "foo bar")
|
||||
:eval (split-string "|foo|bar|" "|")
|
||||
:eval (split-string "|foo|bar|" "|" t))
|
||||
(string-lines
|
||||
:eval (string-lines "foo\n\nbar")
|
||||
:eval (string-lines "foo\n\nbar" t))
|
||||
(string-replace
|
||||
:eval (string-replace "foo" "bar" "foozot"))
|
||||
(replace-regexp-in-string
|
||||
|
@ -167,10 +182,19 @@ There can be any number of :example/:result elements."
|
|||
(string-remove-prefix
|
||||
:no-manual t
|
||||
:eval (string-remove-prefix "foo" "foobar"))
|
||||
(string-chop-newline
|
||||
:eval (string-chop-newline "foo\n"))
|
||||
(string-clean-whitespace
|
||||
:eval (string-clean-whitespace " foo bar "))
|
||||
(string-fill
|
||||
:eval (string-fill "Three short words" 12)
|
||||
:eval (string-fill "Long-word" 3))
|
||||
(reverse
|
||||
:eval (reverse "foo"))
|
||||
(substring-no-properties
|
||||
:eval (substring-no-properties (propertize "foobar" 'face 'bold) 0 3))
|
||||
(try-completion
|
||||
:eval (try-completion "foo" '("foobar" "foozot" "gazonk")))
|
||||
"Predicates for Strings"
|
||||
(string-equal
|
||||
:eval (string-equal "foo" "foo"))
|
||||
|
|
|
@ -264,6 +264,102 @@ carriage return."
|
|||
(substring string 0 (- (length string) (length suffix)))
|
||||
string))
|
||||
|
||||
(defun string-clean-whitespace (string)
|
||||
"Clean up whitespace in STRING.
|
||||
All sequences of whitespaces in STRING are collapsed into a
|
||||
single space character, and leading/trailing whitespace is
|
||||
removed."
|
||||
(let ((blank "[[:blank:]\r\n]+"))
|
||||
(string-trim (replace-regexp-in-string blank " " string t t)
|
||||
blank blank)))
|
||||
|
||||
(defun string-fill (string length)
|
||||
"Try to word-wrap STRING so that no lines are longer than LENGTH.
|
||||
Wrapping is done where there is whitespace. If there are
|
||||
individual words in STRING that are longer than LENGTH, the
|
||||
result will have lines that are longer than LENGTH."
|
||||
(with-temp-buffer
|
||||
(insert string)
|
||||
(goto-char (point-min))
|
||||
(let ((fill-column length)
|
||||
(adaptive-fill-mode nil))
|
||||
(fill-region (point-min) (point-max)))
|
||||
(buffer-string)))
|
||||
|
||||
(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.
|
||||
|
||||
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)))
|
||||
(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-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
|
||||
should be a character.
|
||||
|
||||
If STRING is longer than the absolute value of LENGTH, no padding
|
||||
is done.
|
||||
|
||||
If START is nil (or not present), the padding is done to the end
|
||||
of the string, and if non-nil, padding is done to the start of
|
||||
the string."
|
||||
(unless (natnump length)
|
||||
(signal 'wrong-type-argument (list 'natnump length)))
|
||||
(let ((pad-length (- length (length string))))
|
||||
(if (< pad-length 0)
|
||||
string
|
||||
(concat (and start
|
||||
(make-string pad-length (or padding ?\s)))
|
||||
string
|
||||
(and (not start)
|
||||
(make-string pad-length (or padding ?\s)))))))
|
||||
|
||||
(defun string-chop-newline (string)
|
||||
"Remove the final newline (if any) from STRING."
|
||||
(string-remove-suffix "\n" string))
|
||||
|
||||
(defun replace-region-contents (beg end replace-fn
|
||||
&optional max-secs max-costs)
|
||||
"Replace the region between BEG and END using REPLACE-FN.
|
||||
|
|
|
@ -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)))
|
||||
|
|
|
@ -1850,6 +1850,10 @@ expand wildcards (if any) and replace the file with multiple files."
|
|||
The buffer being killed is current while the hook is running.
|
||||
See `kill-buffer'.
|
||||
|
||||
This hook is not run for internal or temporary buffers created by
|
||||
`get-buffer-create' or `generate-new-buffer' with argument
|
||||
INHIBIT-BUFFER-HOOKS non-nil.
|
||||
|
||||
Note: Be careful with let-binding this hook considering it is
|
||||
frequently used for cleanup.")
|
||||
|
||||
|
@ -1951,7 +1955,7 @@ this function prepends a \"|\" to the final result if necessary."
|
|||
(let ((lastname (file-name-nondirectory filename)))
|
||||
(if (string= lastname "")
|
||||
(setq lastname filename))
|
||||
(generate-new-buffer (if (string-match-p "\\` " lastname)
|
||||
(generate-new-buffer (if (string-prefix-p " " lastname)
|
||||
(concat "|" lastname)
|
||||
lastname))))
|
||||
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -1050,6 +1050,7 @@ Responsible for handling and, or, and parenthetical expressions.")
|
|||
(grouplist (or groups (gnus-search-get-active srv)))
|
||||
q-string artlist group)
|
||||
(message "Opening server %s" server)
|
||||
(gnus-open-server srv)
|
||||
;; We should only be doing this once, in
|
||||
;; `nnimap-open-connection', but it's too frustrating to try to
|
||||
;; get to the server from the process buffer.
|
||||
|
@ -1071,7 +1072,7 @@ Responsible for handling and, or, and parenthetical expressions.")
|
|||
;; A bit of backward-compatibility slash convenience: if the
|
||||
;; query string doesn't start with any known IMAP search
|
||||
;; keyword, assume it is a "TEXT" search.
|
||||
(unless (and (string-match "\\`[^ [:blank:]]+" q-string)
|
||||
(unless (and (string-match "\\`[^[:blank:]]+" q-string)
|
||||
(memql (intern-soft (downcase
|
||||
(match-string 0 q-string)))
|
||||
gnus-search-imap-search-keys))
|
||||
|
@ -1424,7 +1425,7 @@ Returns a list of [group article score] vectors."
|
|||
(string-to-number article)
|
||||
(nnmaildir-base-name-to-article-number
|
||||
(substring article 0 (string-match ":" article))
|
||||
group nil))
|
||||
group (string-remove-prefix "nnmaildir:" server)))
|
||||
(if (numberp score)
|
||||
score
|
||||
(string-to-number score)))
|
||||
|
|
|
@ -3658,6 +3658,7 @@ buffer that was in action when the last article was fetched."
|
|||
;; so we don't call gnus-data-<field> accessors on nil.
|
||||
(gnus-newsgroup-data gnus--dummy-data-list)
|
||||
(gnus-newsgroup-downloadable '(0))
|
||||
(gnus-visual nil)
|
||||
case-fold-search ignores)
|
||||
;; Here, all marks are bound to Z.
|
||||
(gnus-summary-insert-line gnus--dummy-mail-header
|
||||
|
|
|
@ -1587,8 +1587,7 @@ Gnus might fail to display all of it.")
|
|||
(save-excursion
|
||||
(switch-to-buffer (current-buffer))
|
||||
(delete-other-windows)
|
||||
(let ((buffer (get-buffer-create (generate-new-buffer-name
|
||||
"*Warning*"))))
|
||||
(let ((buffer (generate-new-buffer "*Warning*")))
|
||||
(unless
|
||||
(unwind-protect
|
||||
(with-current-buffer buffer
|
||||
|
|
|
@ -667,6 +667,9 @@ Key bindings:
|
|||
(when image-auto-resize-on-window-resize
|
||||
(add-hook 'window-state-change-functions #'image--window-state-change nil t))
|
||||
|
||||
(add-function :before-while (local 'isearch-filter-predicate)
|
||||
#'image-mode-isearch-filter)
|
||||
|
||||
(run-mode-hooks 'image-mode-hook)
|
||||
(let ((image (image-get-display-property))
|
||||
(msg1 (substitute-command-keys
|
||||
|
@ -782,6 +785,14 @@ Remove text properties that display the image."
|
|||
(if (called-interactively-p 'any)
|
||||
(message "Repeat this command to go back to displaying the image"))))
|
||||
|
||||
(defun image-mode-isearch-filter (_beg _end)
|
||||
"Show image as text when trying to search/replace in the image buffer."
|
||||
(save-match-data
|
||||
(when (and (derived-mode-p 'image-mode)
|
||||
(image-get-display-property))
|
||||
(image-mode-as-text)))
|
||||
t)
|
||||
|
||||
(defvar archive-superior-buffer)
|
||||
(defvar tar-superior-buffer)
|
||||
(declare-function image-flush "image.c" (spec &optional frame))
|
||||
|
|
|
@ -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."
|
||||
|
|
|
@ -307,12 +307,9 @@ Return t if file exists."
|
|||
(and (null noerror)
|
||||
(signal 'file-error (list "Cannot open load file" file)))
|
||||
;; Read file with code conversion, and then eval.
|
||||
(let* ((buffer
|
||||
;; We can't use `generate-new-buffer' because files.el
|
||||
;; is not yet loaded.
|
||||
(get-buffer-create (generate-new-buffer-name " *load*")))
|
||||
(load-in-progress t)
|
||||
(source (save-match-data (string-match "\\.el\\'" fullname))))
|
||||
(let ((buffer (generate-new-buffer " *load*"))
|
||||
(load-in-progress t)
|
||||
(source (string-suffix-p ".el" fullname)))
|
||||
(unless nomessage
|
||||
(if source
|
||||
(message "Loading %s (source)..." file)
|
||||
|
|
|
@ -435,7 +435,7 @@ Initialized lazily by `json-encode-string'.")
|
|||
(concat "\"" (substring-no-properties string) "\"")
|
||||
(with-current-buffer
|
||||
(or json--string-buffer
|
||||
(with-current-buffer (generate-new-buffer " *json-string*")
|
||||
(with-current-buffer (generate-new-buffer " *json-string*" t)
|
||||
;; This seems to afford decent performance gains.
|
||||
(setq-local inhibit-modification-hooks t)
|
||||
(setq json--string-buffer (current-buffer))))
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -425,8 +425,7 @@ After the image is fetched, it is stored in CACHE-FILE. It will
|
|||
be displayed in a buffer and position specified by MARKER. The
|
||||
actual display is carried out by the SENTINEL function."
|
||||
(if mh-wget-executable
|
||||
(let ((buffer (get-buffer-create (generate-new-buffer-name
|
||||
mh-temp-fetch-buffer)))
|
||||
(let ((buffer (generate-new-buffer mh-temp-fetch-buffer))
|
||||
(filename (or (mh-funcall-if-exists make-temp-file "mhe-fetch")
|
||||
(expand-file-name (make-temp-name "~/mhe-fetch")))))
|
||||
(with-current-buffer buffer
|
||||
|
|
|
@ -1033,8 +1033,7 @@ necessary. If nil, the buffer name is generated."
|
|||
(when (funcall (nth 1 (assq stream imap-stream-alist)) buffer)
|
||||
;; Stream changed?
|
||||
(if (not (eq imap-default-stream stream))
|
||||
(with-current-buffer (get-buffer-create
|
||||
(generate-new-buffer-name " *temp*"))
|
||||
(with-current-buffer (generate-new-buffer " *temp*")
|
||||
(mapc 'make-local-variable imap-local-variables)
|
||||
(set-buffer-multibyte nil)
|
||||
(buffer-disable-undo)
|
||||
|
|
|
@ -386,8 +386,7 @@ Gnus might fail to display all of it.")
|
|||
(when
|
||||
(save-window-excursion
|
||||
(delete-other-windows)
|
||||
(let ((buffer (get-buffer-create (generate-new-buffer-name
|
||||
"*Warning*"))))
|
||||
(let ((buffer (generate-new-buffer "*Warning*")))
|
||||
(unwind-protect
|
||||
(with-current-buffer buffer
|
||||
(insert (substitute-command-keys
|
||||
|
|
|
@ -1516,8 +1516,9 @@ ones, in case fg and bg are nil."
|
|||
plist)))
|
||||
|
||||
(defun shr-tag-base (dom)
|
||||
(when-let* ((base (dom-attr dom 'href)))
|
||||
(setq shr-base (shr-parse-base base)))
|
||||
(let ((base (dom-attr dom 'href)))
|
||||
(when (> (length base) 0)
|
||||
(setq shr-base (shr-parse-base base))))
|
||||
(shr-generic dom))
|
||||
|
||||
(defun shr-tag-a (dom)
|
||||
|
|
|
@ -348,11 +348,6 @@ A nil value for either argument stands for the current time."
|
|||
(lambda (fromstring tostring instring)
|
||||
(replace-regexp-in-string (regexp-quote fromstring) tostring instring))))
|
||||
|
||||
;; Error symbol `remote-file-error' is defined in Emacs 28.1. We use
|
||||
;; an adapted error message in order to see that compatible symbol.
|
||||
(unless (get 'remote-file-error 'error-conditions)
|
||||
(define-error 'remote-file-error "Remote file error (compat)" 'file-error))
|
||||
|
||||
(add-hook 'tramp-unload-hook
|
||||
(lambda ()
|
||||
(unload-feature 'tramp-loaddefs 'force)
|
||||
|
|
|
@ -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))))
|
||||
|
|
|
@ -2234,7 +2234,7 @@ the uid and gid from FILENAME."
|
|||
(file-writable-p (concat prefix localname2))))
|
||||
(tramp-do-copy-or-rename-file-directly
|
||||
op (concat prefix localname1) (concat prefix localname2)
|
||||
ok-if-already-exists keep-date t)
|
||||
ok-if-already-exists keep-date preserve-uid-gid)
|
||||
;; We must change the ownership to the local user.
|
||||
(tramp-set-file-uid-gid
|
||||
(concat prefix localname2)
|
||||
|
|
|
@ -7,10 +7,6 @@
|
|||
;; Maintainer: Michael Albinus <michael.albinus@gmx.de>
|
||||
;; Keywords: comm, processes
|
||||
;; Package: tramp
|
||||
;; Version: 2.5.0-pre
|
||||
;; Package-Requires: ((emacs "25.1"))
|
||||
;; Package-Type: multi
|
||||
;; URL: https://savannah.gnu.org/projects/tramp
|
||||
|
||||
;; This file is part of GNU Emacs.
|
||||
|
||||
|
@ -3790,23 +3786,31 @@ It does not support `:stderr'."
|
|||
(unless (or (null stderr) (bufferp stderr))
|
||||
(signal 'wrong-type-argument (list #'bufferp stderr)))
|
||||
|
||||
;; Quote shell command.
|
||||
(when (and (= (length command) 3)
|
||||
(stringp (nth 0 command))
|
||||
(string-match-p "sh$" (nth 0 command))
|
||||
(stringp (nth 1 command))
|
||||
(string-equal "-c" (nth 1 command))
|
||||
(stringp (nth 2 command)))
|
||||
(setcar (cddr command) (tramp-shell-quote-argument (nth 2 command))))
|
||||
|
||||
(let* ((buffer
|
||||
(if buffer
|
||||
(get-buffer-create buffer)
|
||||
;; BUFFER can be nil. We use a temporary buffer.
|
||||
(generate-new-buffer tramp-temp-buffer-name)))
|
||||
;; We use as environment the difference to toplevel
|
||||
;; `process-environment'.
|
||||
(env (mapcar
|
||||
(lambda (elt)
|
||||
(unless
|
||||
(member
|
||||
elt (default-toplevel-value 'process-environment))
|
||||
(when (string-match-p "=" elt) elt)))
|
||||
process-environment))
|
||||
(env (setenv-internal
|
||||
env "INSIDE_EMACS"
|
||||
(concat (or (getenv "INSIDE_EMACS") emacs-version)
|
||||
",tramp:" tramp-version)
|
||||
'keep))
|
||||
(env (mapcar #'tramp-shell-quote-argument (delq nil env)))
|
||||
;; Quote command.
|
||||
(command (mapconcat #'tramp-shell-quote-argument command " "))
|
||||
;; Set cwd and environment variables.
|
||||
(command
|
||||
(mapconcat
|
||||
#'identity (append `("cd" ,localname "&&") command) " ")))
|
||||
(append `("cd" ,localname "&&" "(" "env") env `(,command ")"))))
|
||||
|
||||
;; Check for `tramp-sh-file-name-handler', because something
|
||||
;; is different between tramp-adb.el and tramp-sh.el.
|
||||
|
@ -3861,7 +3865,7 @@ It does not support `:stderr'."
|
|||
(mapcar (lambda (x) (split-string x " ")) login-args))
|
||||
p (make-process
|
||||
:name name :buffer buffer
|
||||
:command (append `(,login-program) login-args `(,command))
|
||||
:command (append `(,login-program) login-args command)
|
||||
:coding coding :noquery noquery :connection-type connection-type
|
||||
:filter filter :sentinel sentinel :stderr stderr))
|
||||
|
||||
|
|
|
@ -7,6 +7,10 @@
|
|||
;; Maintainer: Michael Albinus <michael.albinus@gmx.de>
|
||||
;; Keywords: comm, processes
|
||||
;; Package: tramp
|
||||
;; Version: 2.5.0-pre
|
||||
;; Package-Requires: ((emacs "25.1"))
|
||||
;; Package-Type: multi
|
||||
;; URL: https://www.gnu.org/software/tramp/
|
||||
|
||||
;; This file is part of GNU Emacs.
|
||||
|
||||
|
@ -30,10 +34,10 @@
|
|||
|
||||
;;; Code:
|
||||
|
||||
;; In the Tramp GIT, the version number is auto-frobbed from tramp.el,
|
||||
;; and the bug report address is auto-frobbed from configure.ac.
|
||||
;; Emacs version check is defined in macro AC_EMACS_INFO of
|
||||
;; aclocal.m4; should be changed only there.
|
||||
;; In the Tramp GIT repository, the version number, the bug report
|
||||
;; address and the required Emacs version are auto-frobbed from
|
||||
;; configure.ac, so you should edit that file and run "autoconf &&
|
||||
;; ./configure" to change them.
|
||||
|
||||
;;;###tramp-autoload
|
||||
(defconst tramp-version "2.5.0-pre"
|
||||
|
|
|
@ -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)
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue