Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
autosetup: update to 7.2
Baptiste Daroussin committed 1 year ago
commit 6cf054054c6b04316b1854d57a1ab6d67323a543
parent 1bbda88
7 files changed +1264 -558
modified autosetup/README.autosetup
@@ -1,4 +1,4 @@
-
README.autosetup created by autosetup v0.7.1+
+
README.autosetup created by autosetup v0.7.2

This is the autosetup directory for a local install of autosetup.
It contains autosetup, support files and loadable modules.
modified autosetup/autosetup
@@ -6,7 +6,7 @@
dir=`dirname "$0"`; exec "`$dir/autosetup-find-tclsh`" "$0" "$@"

# Note that the version has a trailing + on unreleased versions
-
set autosetup(version) 0.7.1+
+
set autosetup(version) 0.7.2

# Can be set to 1 to debug early-init problems
set autosetup(debug) [expr {"--debug" in $argv}]
@@ -566,7 +566,10 @@ proc options-show {what} {
	set indent [string repeat " " [expr {$max+4}]]
	set cols [getenv COLUMNS 80]
	catch {
-
		lassign [exec stty size] rows cols
+
		lassign [exec stty size] _ sttycols
+
		if {[string is integer -strict $sttycols]} {
+
			set cols $sttycols
+
		}
	}
	incr cols -1
	# Now output
@@ -910,8 +913,7 @@ proc list-non-empty {list} {
# Searches the path for an executable with the given name.
# Note that the name may include some parameters, e.g. 'cc -mbig-endian',
# in which case the parameters are ignored.
-
# The full path to the executable if found, or "" if not found.
-
# Returns 1 if found, or 0 if not.
+
# Returns the full path to the executable if found, or "" if not found.
#
proc find-executable-path {name} {
	# Ignore any parameters
modified autosetup/autosetup-config.guess
@@ -1,14 +1,14 @@
#! /bin/sh
# Attempt to guess a canonical system name.
-
#   Copyright 1992-2021 Free Software Foundation, Inc.
+
#   Copyright 1992-2024 Free Software Foundation, Inc.

# shellcheck disable=SC2006,SC2268 # see below for rationale

-
timestamp='2021-06-03'
+
timestamp='2024-07-27'

# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
-
# the Free Software Foundation; either version 3 of the License, or
+
# 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
@@ -47,7 +47,7 @@ me=`echo "$0" | sed -e 's,.*/,,'`
usage="\
Usage: $0 [OPTION]

-
Output the configuration name of the system \`$me' is run on.
+
Output the configuration name of the system '$me' is run on.

Options:
  -h, --help         print this help, then exit
@@ -60,13 +60,13 @@ version="\
GNU config.guess ($timestamp)

Originally written by Per Bothner.
-
Copyright 1992-2021 Free Software Foundation, Inc.
+
Copyright 1992-2024 Free Software Foundation, Inc.

This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."

help="
-
Try \`$me --help' for more information."
+
Try '$me --help' for more information."

# Parse command line
while test $# -gt 0 ; do
@@ -102,8 +102,8 @@ GUESS=
# temporary files to be created and, as you can see below, it is a
# headache to deal with in a portable fashion.

-
# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-
# use `HOST_CC' if defined, but it is deprecated.
+
# Historically, 'CC_FOR_BUILD' used to be named 'HOST_CC'. We still
+
# use 'HOST_CC' if defined, but it is deprecated.

# Portable tmp directory creation inspired by the Autoconf team.

@@ -123,7 +123,7 @@ set_cc_for_build() {
    dummy=$tmp/dummy
    case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in
	,,)    echo "int x;" > "$dummy.c"
-
	       for driver in cc gcc c89 c99 ; do
+
	       for driver in cc gcc c17 c99 c89 ; do
		   if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
		       CC_FOR_BUILD=$driver
		       break
@@ -155,6 +155,9 @@ Linux|GNU|GNU/*)

	set_cc_for_build
	cat <<-EOF > "$dummy.c"
+
	#if defined(__ANDROID__)
+
	LIBC=android
+
	#else
	#include <features.h>
	#if defined(__UCLIBC__)
	LIBC=uclibc
@@ -162,6 +165,8 @@ Linux|GNU|GNU/*)
	LIBC=dietlibc
	#elif defined(__GLIBC__)
	LIBC=gnu
+
	#elif defined(__LLVM_LIBC__)
+
	LIBC=llvm
	#else
	#include <stdarg.h>
	/* First heuristic to detect musl libc.  */
@@ -169,6 +174,7 @@ Linux|GNU|GNU/*)
	LIBC=musl
	#endif
	#endif
+
	#endif
	EOF
	cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
	eval "$cc_set_libc"
@@ -437,7 +443,7 @@ case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in
	# This test works for both compilers.
	if test "$CC_FOR_BUILD" != no_compiler_found; then
	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
-
		(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+
		(CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \
		grep IS_64BIT_ARCH >/dev/null
	    then
		SUN_ARCH=x86_64
@@ -459,7 +465,7 @@ case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in
		UNAME_RELEASE=`uname -v`
		;;
	esac
-
	# Japanese Language versions have a version number like `4.1.3-JL'.
+
	# Japanese Language versions have a version number like '4.1.3-JL'.
	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'`
	GUESS=sparc-sun-sunos$SUN_REL
	;;
@@ -628,7 +634,8 @@ EOF
		sed 's/^		//' << EOF > "$dummy.c"
		#include <sys/systemcfg.h>

-
		main()
+
		int
+
		main ()
			{
			if (!__power_pc())
				exit(1);
@@ -712,7 +719,8 @@ EOF
		#include <stdlib.h>
		#include <unistd.h>

-
		int main ()
+
		int
+
		main ()
		{
		#if defined(_SC_KERNEL_BITS)
		    long bits = sysconf(_SC_KERNEL_BITS);
@@ -904,7 +912,7 @@ EOF
	fi
	;;
    *:FreeBSD:*:*)
-
	UNAME_PROCESSOR=`/usr/bin/uname -p`
+
	UNAME_PROCESSOR=`uname -p`
	case $UNAME_PROCESSOR in
	    amd64)
		UNAME_PROCESSOR=x86_64 ;;
@@ -929,6 +937,9 @@ EOF
    i*:PW*:*)
	GUESS=$UNAME_MACHINE-pc-pw32
	;;
+
    *:SerenityOS:*:*)
+
        GUESS=$UNAME_MACHINE-pc-serenity
+
        ;;
    *:Interix*:*)
	case $UNAME_MACHINE in
	    x86)
@@ -963,11 +974,37 @@ EOF
	GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
	GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC
	;;
+
    x86_64:[Mm]anagarm:*:*|i?86:[Mm]anagarm:*:*)
+
	GUESS="$UNAME_MACHINE-pc-managarm-mlibc"
+
	;;
+
    *:[Mm]anagarm:*:*)
+
	GUESS="$UNAME_MACHINE-unknown-managarm-mlibc"
+
	;;
    *:Minix:*:*)
	GUESS=$UNAME_MACHINE-unknown-minix
	;;
    aarch64:Linux:*:*)
-
	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+
	set_cc_for_build
+
	CPU=$UNAME_MACHINE
+
	LIBCABI=$LIBC
+
	if test "$CC_FOR_BUILD" != no_compiler_found; then
+
	    ABI=64
+
	    sed 's/^	    //' << EOF > "$dummy.c"
+
	    #ifdef __ARM_EABI__
+
	    #ifdef __ARM_PCS_VFP
+
	    ABI=eabihf
+
	    #else
+
	    ABI=eabi
+
	    #endif
+
	    #endif
+
EOF
+
	    cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'`
+
	    eval "$cc_set_abi"
+
	    case $ABI in
+
		eabi | eabihf) CPU=armv8l; LIBCABI=$LIBC$ABI ;;
+
	    esac
+
	fi
+
	GUESS=$CPU-unknown-linux-$LIBCABI
	;;
    aarch64_be:Linux:*:*)
	UNAME_MACHINE=aarch64_be
@@ -1033,7 +1070,16 @@ EOF
    k1om:Linux:*:*)
	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
	;;
-
    loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*)
+
    kvx:Linux:*:*)
+
	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+
	;;
+
    kvx:cos:*:*)
+
	GUESS=$UNAME_MACHINE-unknown-cos
+
	;;
+
    kvx:mbr:*:*)
+
	GUESS=$UNAME_MACHINE-unknown-mbr
+
	;;
+
    loongarch32:Linux:*:* | loongarch64:Linux:*:*)
	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
	;;
    m32r*:Linux:*:*)
@@ -1148,16 +1194,27 @@ EOF
	;;
    x86_64:Linux:*:*)
	set_cc_for_build
+
	CPU=$UNAME_MACHINE
	LIBCABI=$LIBC
	if test "$CC_FOR_BUILD" != no_compiler_found; then
-
	    if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \
-
		(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
-
		grep IS_X32 >/dev/null
-
	    then
-
		LIBCABI=${LIBC}x32
-
	    fi
+
	    ABI=64
+
	    sed 's/^	    //' << EOF > "$dummy.c"
+
	    #ifdef __i386__
+
	    ABI=x86
+
	    #else
+
	    #ifdef __ILP32__
+
	    ABI=x32
+
	    #endif
+
	    #endif
+
EOF
+
	    cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'`
+
	    eval "$cc_set_abi"
+
	    case $ABI in
+
		x86) CPU=i686 ;;
+
		x32) LIBCABI=${LIBC}x32 ;;
+
	    esac
	fi
-
	GUESS=$UNAME_MACHINE-pc-linux-$LIBCABI
+
	GUESS=$CPU-pc-linux-$LIBCABI
	;;
    xtensa*:Linux:*:*)
	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
@@ -1177,7 +1234,7 @@ EOF
	GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION
	;;
    i*86:OS/2:*:*)
-
	# If we were able to find `uname', then EMX Unix compatibility
+
	# If we were able to find 'uname', then EMX Unix compatibility
	# is probably installed.
	GUESS=$UNAME_MACHINE-pc-os2-emx
	;;
@@ -1318,7 +1375,7 @@ EOF
		GUESS=ns32k-sni-sysv
	fi
	;;
-
    PENTIUM:*:4.0*:*)	# Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+
    PENTIUM:*:4.0*:*)	# Unisys 'ClearPath HMP IX 4000' SVR4/MP effort
			# says <Richard.M.Bartel@ccMail.Census.GOV>
	GUESS=i586-unisys-sysv4
	;;
@@ -1364,8 +1421,11 @@ EOF
    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
	GUESS=i586-pc-haiku
	;;
-
    x86_64:Haiku:*:*)
-
	GUESS=x86_64-unknown-haiku
+
    ppc:Haiku:*:*)	# Haiku running on Apple PowerPC
+
	GUESS=powerpc-apple-haiku
+
	;;
+
    *:Haiku:*:*)	# Haiku modern gcc (not bound by BeOS compat)
+
	GUESS=$UNAME_MACHINE-unknown-haiku
	;;
    SX-4:SUPER-UX:*:*)
	GUESS=sx4-nec-superux$UNAME_RELEASE
@@ -1522,6 +1582,9 @@ EOF
    i*86:rdos:*:*)
	GUESS=$UNAME_MACHINE-pc-rdos
	;;
+
    i*86:Fiwix:*:*)
+
	GUESS=$UNAME_MACHINE-pc-fiwix
+
	;;
    *:AROS:*:*)
	GUESS=$UNAME_MACHINE-unknown-aros
	;;
@@ -1534,6 +1597,9 @@ EOF
    *:Unleashed:*:*)
	GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE
	;;
+
    *:Ironclad:*:*)
+
	GUESS=$UNAME_MACHINE-unknown-ironclad
+
	;;
esac

# Do we have a guess based on uname results?
@@ -1557,6 +1623,7 @@ cat > "$dummy.c" <<EOF
#endif
#endif
#endif
+
int
main ()
{
#if defined (sony)
modified autosetup/autosetup-config.sub
@@ -1,14 +1,14 @@
#! /bin/sh
# Configuration validation subroutine script.
-
#   Copyright 1992-2021 Free Software Foundation, Inc.
+
#   Copyright 1992-2024 Free Software Foundation, Inc.

-
# shellcheck disable=SC2006,SC2268 # see below for rationale
+
# shellcheck disable=SC2006,SC2268,SC2162 # see below for rationale

-
timestamp='2021-07-03'
+
timestamp='2024-05-27'

# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
-
# the Free Software Foundation; either version 3 of the License, or
+
# 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
@@ -76,13 +76,13 @@ Report bugs and patches to <config-patches@gnu.org>."
version="\
GNU config.sub ($timestamp)

-
Copyright 1992-2021 Free Software Foundation, Inc.
+
Copyright 1992-2024 Free Software Foundation, Inc.

This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."

help="
-
Try \`$me --help' for more information."
+
Try '$me --help' for more information."

# Parse command line
while test $# -gt 0 ; do
@@ -120,15 +120,16 @@ case $# in
esac

# Split fields of configuration type
-
# shellcheck disable=SC2162
+
saved_IFS=$IFS
IFS="-" read field1 field2 field3 field4 <<EOF
$1
EOF
+
IFS=$saved_IFS

# Separate into logical components for further validation
case $1 in
	*-*-*-*-*)
-
		echo Invalid configuration \`"$1"\': more than four components >&2
+
		echo "Invalid configuration '$1': more than four components" >&2
		exit 1
		;;
	*-*-*-*)
@@ -140,10 +141,21 @@ case $1 in
		# parts
		maybe_os=$field2-$field3
		case $maybe_os in
-
			nto-qnx* | linux-* | uclinux-uclibc* \
-
			| uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
-
			| netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
-
			| storm-chaos* | os2-emx* | rtmk-nova*)
+
			  cloudabi*-eabi* \
+
			| kfreebsd*-gnu* \
+
			| knetbsd*-gnu* \
+
			| kopensolaris*-gnu* \
+
			| linux-* \
+
			| managarm-* \
+
			| netbsd*-eabi* \
+
			| netbsd*-gnu* \
+
			| nto-qnx* \
+
			| os2-emx* \
+
			| rtmk-nova* \
+
			| storm-chaos* \
+
			| uclinux-gnu* \
+
			| uclinux-uclibc* \
+
			| windows-* )
				basic_machine=$field1
				basic_os=$maybe_os
				;;
@@ -158,8 +170,12 @@ case $1 in
		esac
		;;
	*-*)
-
		# A lone config we happen to match not fitting any pattern
		case $field1-$field2 in
+
			# Shorthands that happen to contain a single dash
+
			convex-c[12] | convex-c3[248])
+
				basic_machine=$field2-convex
+
				basic_os=
+
				;;
			decstation-3100)
				basic_machine=mips-dec
				basic_os=
@@ -167,24 +183,88 @@ case $1 in
			*-*)
				# Second component is usually, but not always the OS
				case $field2 in
-
					# Prevent following clause from handling this valid os
+
					# Do not treat sunos as a manufacturer
					sun*os*)
						basic_machine=$field1
						basic_os=$field2
						;;
					# Manufacturers
-
					dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \
-
					| att* | 7300* | 3300* | delta* | motorola* | sun[234]* \
-
					| unicom* | ibm* | next | hp | isi* | apollo | altos* \
-
					| convergent* | ncr* | news | 32* | 3600* | 3100* \
-
					| hitachi* | c[123]* | convex* | sun | crds | omron* | dg \
-
					| ultra | tti* | harris | dolphin | highlevel | gould \
-
					| cbm | ns | masscomp | apple | axis | knuth | cray \
-
					| microblaze* | sim | cisco \
-
					| oki | wec | wrs | winbond)
+
					  3100* \
+
					| 32* \
+
					| 3300* \
+
					| 3600* \
+
					| 7300* \
+
					| acorn \
+
					| altos* \
+
					| apollo \
+
					| apple \
+
					| atari \
+
					| att* \
+
					| axis \
+
					| be \
+
					| bull \
+
					| cbm \
+
					| ccur \
+
					| cisco \
+
					| commodore \
+
					| convergent* \
+
					| convex* \
+
					| cray \
+
					| crds \
+
					| dec* \
+
					| delta* \
+
					| dg \
+
					| digital \
+
					| dolphin \
+
					| encore* \
+
					| gould \
+
					| harris \
+
					| highlevel \
+
					| hitachi* \
+
					| hp \
+
					| ibm* \
+
					| intergraph \
+
					| isi* \
+
					| knuth \
+
					| masscomp \
+
					| microblaze* \
+
					| mips* \
+
					| motorola* \
+
					| ncr* \
+
					| news \
+
					| next \
+
					| ns \
+
					| oki \
+
					| omron* \
+
					| pc533* \
+
					| rebel \
+
					| rom68k \
+
					| rombug \
+
					| semi \
+
					| sequent* \
+
					| siemens \
+
					| sgi* \
+
					| siemens \
+
					| sim \
+
					| sni \
+
					| sony* \
+
					| stratus \
+
					| sun \
+
					| sun[234]* \
+
					| tektronix \
+
					| tti* \
+
					| ultra \
+
					| unicom* \
+
					| wec \
+
					| winbond \
+
					| wrs)
						basic_machine=$field1-$field2
						basic_os=
						;;
+
					zephyr*)
+
						basic_machine=$field1-unknown
+
						basic_os=$field2
+
						;;
					*)
						basic_machine=$field1
						basic_os=$field2
@@ -265,26 +345,6 @@ case $1 in
				basic_machine=arm-unknown
				basic_os=cegcc
				;;
-
			convex-c1)
-
				basic_machine=c1-convex
-
				basic_os=bsd
-
				;;
-
			convex-c2)
-
				basic_machine=c2-convex
-
				basic_os=bsd
-
				;;
-
			convex-c32)
-
				basic_machine=c32-convex
-
				basic_os=bsd
-
				;;
-
			convex-c34)
-
				basic_machine=c34-convex
-
				basic_os=bsd
-
				;;
-
			convex-c38)
-
				basic_machine=c38-convex
-
				basic_os=bsd
-
				;;
			cray)
				basic_machine=j90-cray
				basic_os=unicos
@@ -707,15 +767,26 @@ case $basic_machine in
		vendor=dec
		basic_os=tops20
		;;
-
	delta | 3300 | motorola-3300 | motorola-delta \
-
	      | 3300-motorola | delta-motorola)
+
	delta | 3300 | delta-motorola | 3300-motorola | motorola-delta | motorola-3300)
		cpu=m68k
		vendor=motorola
		;;
-
	dpx2*)
+
	# This used to be dpx2*, but that gets the RS6000-based
+
	# DPX/20 and the x86-based DPX/2-100 wrong.  See
+
	# https://oldskool.silicium.org/stations/bull_dpx20.htm
+
	# https://www.feb-patrimoine.com/english/bull_dpx2.htm
+
	# https://www.feb-patrimoine.com/english/unix_and_bull.htm
+
	dpx2 | dpx2[23]00 | dpx2[23]xx)
		cpu=m68k
		vendor=bull
-
		basic_os=sysv3
+
		;;
+
	dpx2100 | dpx21xx)
+
		cpu=i386
+
		vendor=bull
+
		;;
+
	dpx20)
+
		cpu=rs6000
+
		vendor=bull
		;;
	encore | umax | mmax)
		cpu=ns32k
@@ -830,18 +901,6 @@ case $basic_machine in
	next | m*-next)
		cpu=m68k
		vendor=next
-
		case $basic_os in
-
		    openstep*)
-
		        ;;
-
		    nextstep*)
-
			;;
-
		    ns2*)
-
		      basic_os=nextstep2
-
			;;
-
		    *)
-
		      basic_os=nextstep3
-
			;;
-
		esac
		;;
	np1)
		cpu=np1
@@ -930,12 +989,13 @@ case $basic_machine in
		;;

	*-*)
-
		# shellcheck disable=SC2162
+
		saved_IFS=$IFS
		IFS="-" read cpu vendor <<EOF
$basic_machine
EOF
+
		IFS=$saved_IFS
		;;
-
	# We use `pc' rather than `unknown'
+
	# We use 'pc' rather than 'unknown'
	# because (1) that's what they normally are, and
	# (2) the word "unknown" tends to confuse beginning users.
	i*86 | x86_64)
@@ -963,15 +1023,19 @@ unset -v basic_machine

# Decode basic machines in the full and proper CPU-Company form.
case $cpu-$vendor in
-
	# Here we handle the default manufacturer of certain CPU types in canonical form. It is in
-
	# some cases the only manufacturer, in others, it is the most popular.
+
	# Here we handle the default manufacturer of certain CPU types in canonical form.
+
	# It is in some cases the only manufacturer, in others, it is the most popular.
+
	c[12]-convex | c[12]-unknown | c3[248]-convex | c3[248]-unknown)
+
		vendor=convex
+
		basic_os=${basic_os:-bsd}
+
		;;
	craynv-unknown)
		vendor=cray
		basic_os=${basic_os:-unicosmp}
		;;
	c90-unknown | c90-cray)
		vendor=cray
-
		basic_os=${Basic_os:-unicos}
+
		basic_os=${basic_os:-unicos}
		;;
	fx80-unknown)
		vendor=alliant
@@ -1012,11 +1076,34 @@ case $cpu-$vendor in
		;;

	# Here we normalize CPU types with a missing or matching vendor
-
	dpx20-unknown | dpx20-bull)
-
		cpu=rs6000
-
		vendor=bull
+
	armh-unknown | armh-alt)
+
		cpu=armv7l
+
		vendor=alt
+
		basic_os=${basic_os:-linux-gnueabihf}
+
		;;
+

+
	# Normalized CPU+vendor pairs that imply an OS, if not otherwise specified
+
	m68k-isi)
+
		basic_os=${basic_os:-sysv}
+
		;;
+
	m68k-sony)
+
		basic_os=${basic_os:-newsos}
+
		;;
+
	m68k-tektronix)
+
		basic_os=${basic_os:-bsd}
+
		;;
+
	m88k-harris)
+
		basic_os=${basic_os:-sysv3}
+
		;;
+
	i386-bull | m68k-bull)
+
		basic_os=${basic_os:-sysv3}
+
		;;
+
	rs6000-bull)
		basic_os=${basic_os:-bosx}
		;;
+
	mips-sni)
+
		basic_os=${basic_os:-sysv4}
+
		;;

	# Here we normalize CPU types irrespective of the vendor
	amd64-*)
@@ -1024,7 +1111,7 @@ case $cpu-$vendor in
		;;
	blackfin-*)
		cpu=bfin
-
		basic_os=linux
+
		basic_os=${basic_os:-linux}
		;;
	c54x-*)
		cpu=tic54x
@@ -1047,7 +1134,7 @@ case $cpu-$vendor in
		;;
	m68knommu-*)
		cpu=m68k
-
		basic_os=linux
+
		basic_os=${basic_os:-linux}
		;;
	m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)
		cpu=s12z
@@ -1057,12 +1144,12 @@ case $cpu-$vendor in
		;;
	parisc-*)
		cpu=hppa
-
		basic_os=linux
+
		basic_os=${basic_os:-linux}
		;;
	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
		cpu=i586
		;;
-
	pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*)
+
	pentiumpro-* | p6-* | 6x86-* | athlon-* | athlon_*-*)
		cpu=i686
		;;
	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
@@ -1071,9 +1158,6 @@ case $cpu-$vendor in
	pentium4-*)
		cpu=i786
		;;
-
	pc98-*)
-
		cpu=i386
-
		;;
	ppc-* | ppcbe-*)
		cpu=powerpc
		;;
@@ -1107,13 +1191,10 @@ case $cpu-$vendor in
	tx39el-*)
		cpu=mipstx39el
		;;
-
	x64-*)
-
		cpu=x86_64
-
		;;
	xscale-* | xscalee[bl]-*)
		cpu=`echo "$cpu" | sed 's/^xscale/arm/'`
		;;
-
	arm64-*)
+
	arm64-* | aarch64le-*)
		cpu=aarch64
		;;

@@ -1165,114 +1246,231 @@ case $cpu-$vendor in
		# Recognize the canonical CPU types that are allowed with any
		# company name.
		case $cpu in
-
			1750a | 580 \
+
			  1750a \
+
			| 580 \
+
			| [cjt]90 \
			| a29k \
-
			| aarch64 | aarch64_be \
+
			| aarch64 \
+
			| aarch64_be \
+
			| aarch64c \
			| abacus \
-
			| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \
-
			| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \
-
			| alphapca5[67] | alpha64pca5[67] \
+
			| alpha \
+
			| alpha64 \
+
			| alpha64ev56 \
+
			| alpha64ev6[78] \
+
			| alpha64ev[4-8] \
+
			| alpha64pca5[67] \
+
			| alphaev56 \
+
			| alphaev6[78] \
+
			| alphaev[4-8] \
+
			| alphapca5[67] \
			| am33_2.0 \
			| amdgcn \
-
			| arc | arceb | arc32 | arc64 \
-
			| arm | arm[lb]e | arme[lb] | armv* \
-
			| avr | avr32 \
+
			| arc \
+
			| arc32 \
+
			| arc64 \
+
			| arceb \
+
			| arm \
+
			| arm64e \
+
			| arm64ec \
+
			| arm[lb]e \
+
			| arme[lb] \
+
			| armv* \
			| asmjs \
+
			| avr \
+
			| avr32 \
			| ba \
-
			| be32 | be64 \
-
			| bfin | bpf | bs2000 \
-
			| c[123]* | c30 | [cjt]90 | c4x \
-
			| c8051 | clipper | craynv | csky | cydra \
-
			| d10v | d30v | dlx | dsp16xx \
-
			| e2k | elxsi | epiphany \
-
			| f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \
-
			| h8300 | h8500 \
-
			| hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+
			| be32 \
+
			| be64 \
+
			| bfin \
+
			| bpf \
+
			| bs2000 \
+
			| c30 \
+
			| c4x \
+
			| c8051 \
+
			| c[123]* \
+
			| clipper \
+
			| craynv \
+
			| csky \
+
			| cydra \
+
			| d10v \
+
			| d30v \
+
			| dlx \
+
			| dsp16xx \
+
			| e2k \
+
			| elxsi \
+
			| epiphany \
+
			| f30[01] \
+
			| f700 \
+
			| fido \
+
			| fr30 \
+
			| frv \
+
			| ft32 \
+
			| fx80 \
+
			| h8300 \
+
			| h8500 \
			| hexagon \
-
			| i370 | i*86 | i860 | i960 | ia16 | ia64 \
-
			| ip2k | iq2000 \
+
			| hppa \
+
			| hppa1.[01] \
+
			| hppa2.0 \
+
			| hppa2.0[nw] \
+
			| hppa64 \
+
			| i*86 \
+
			| i370 \
+
			| i860 \
+
			| i960 \
+
			| ia16 \
+
			| ia64 \
+
			| ip2k \
+
			| iq2000 \
+
			| javascript \
			| k1om \
-
			| le32 | le64 \
+
			| kvx \
+
			| le32 \
+
			| le64 \
			| lm32 \
-
			| loongarch32 | loongarch64 | loongarchx32 \
-
			| m32c | m32r | m32rle \
-
			| m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
-
			| m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
-
			| m88110 | m88k | maxq | mb | mcore | mep | metag \
-
			| microblaze | microblazeel \
-
			| mips | mipsbe | mipseb | mipsel | mipsle \
-
			| mips16 \
-
			| mips64 | mips64eb | mips64el \
-
			| mips64octeon | mips64octeonel \
-
			| mips64orion | mips64orionel \
-
			| mips64r5900 | mips64r5900el \
-
			| mips64vr | mips64vrel \
-
			| mips64vr4100 | mips64vr4100el \
-
			| mips64vr4300 | mips64vr4300el \
-
			| mips64vr5000 | mips64vr5000el \
-
			| mips64vr5900 | mips64vr5900el \
-
			| mipsisa32 | mipsisa32el \
-
			| mipsisa32r2 | mipsisa32r2el \
-
			| mipsisa32r3 | mipsisa32r3el \
-
			| mipsisa32r5 | mipsisa32r5el \
-
			| mipsisa32r6 | mipsisa32r6el \
-
			| mipsisa64 | mipsisa64el \
-
			| mipsisa64r2 | mipsisa64r2el \
-
			| mipsisa64r3 | mipsisa64r3el \
-
			| mipsisa64r5 | mipsisa64r5el \
-
			| mipsisa64r6 | mipsisa64r6el \
-
			| mipsisa64sb1 | mipsisa64sb1el \
-
			| mipsisa64sr71k | mipsisa64sr71kel \
-
			| mipsr5900 | mipsr5900el \
-
			| mipstx39 | mipstx39el \
+
			| loongarch32 \
+
			| loongarch64 \
+
			| m32c \
+
			| m32r \
+
			| m32rle \
+
			| m5200 \
+
			| m68000 \
+
			| m680[012346]0 \
+
			| m6811 \
+
			| m6812 \
+
			| m68360 \
+
			| m683?2 \
+
			| m68hc11 \
+
			| m68hc12 \
+
			| m68hcs12x \
+
			| m68k \
+
			| m88110 \
+
			| m88k \
+
			| maxq \
+
			| mb \
+
			| mcore \
+
			| mep \
+
			| metag \
+
			| microblaze \
+
			| microblazeel \
+
			| mips* \
			| mmix \
-
			| mn10200 | mn10300 \
+
			| mn10200 \
+
			| mn10300 \
			| moxie \
-
			| mt \
			| msp430 \
-
			| nds32 | nds32le | nds32be \
+
			| mt \
+
			| nanomips* \
+
			| nds32 \
+
			| nds32be \
+
			| nds32le \
			| nfp \
-
			| nios | nios2 | nios2eb | nios2el \
-
			| none | np1 | ns16k | ns32k | nvptx \
+
			| nios \
+
			| nios2 \
+
			| nios2eb \
+
			| nios2el \
+
			| none \
+
			| np1 \
+
			| ns16k \
+
			| ns32k \
+
			| nvptx \
			| open8 \
			| or1k* \
			| or32 \
			| orion \
+
			| pdp10 \
+
			| pdp11 \
			| picochip \
-
			| pdp10 | pdp11 | pj | pjl | pn | power \
-
			| powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \
+
			| pj \
+
			| pjl \
+
			| pn \
+
			| power \
+
			| powerpc \
+
			| powerpc64 \
+
			| powerpc64le \
+
			| powerpcle \
+
			| powerpcspe \
			| pru \
			| pyramid \
-
			| riscv | riscv32 | riscv32be | riscv64 | riscv64be \
-
			| rl78 | romp | rs6000 | rx \
-
			| s390 | s390x \
+
			| riscv \
+
			| riscv32 \
+
			| riscv32be \
+
			| riscv64 \
+
			| riscv64be \
+
			| rl78 \
+
			| romp \
+
			| rs6000 \
+
			| rx \
+
			| s390 \
+
			| s390x \
			| score \
-
			| sh | shl \
-
			| sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \
-
			| sh[1234]e[lb] |  sh[12345][lb]e | sh[23]ele | sh64 | sh64le \
-
			| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \
+
			| sh \
+
			| sh64 \
+
			| sh64le \
+
			| sh[12345][lb]e \
+
			| sh[1234] \
+
			| sh[1234]e[lb] \
+
			| sh[23]e \
+
			| sh[23]ele \
+
			| sh[24]a \
+
			| sh[24]ae[lb] \
+
			| sh[lb]e \
+
			| she[lb] \
+
			| shl \
+
			| sparc \
+
			| sparc64 \
+
			| sparc64b \
+
			| sparc64v \
+
			| sparc86x \
+
			| sparclet \
			| sparclite \
-
			| sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \
+
			| sparcv8 \
+
			| sparcv9 \
+
			| sparcv9b \
+
			| sparcv9v \
			| spu \
+
			| sv1 \
+
			| sx* \
			| tahoe \
			| thumbv7* \
-
			| tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \
+
			| tic30 \
+
			| tic4x \
+
			| tic54x \
+
			| tic55x \
+
			| tic6x \
+
			| tic80 \
			| tron \
			| ubicom32 \
-
			| v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \
+
			| v70 \
+
			| v810 \
+
			| v850 \
+
			| v850e \
+
			| v850e1 \
+
			| v850e2 \
+
			| v850e2v3 \
+
			| v850es \
			| vax \
+
			| vc4 \
			| visium \
			| w65 \
-
			| wasm32 | wasm64 \
+
			| wasm32 \
+
			| wasm64 \
			| we32k \
-
			| x86 | x86_64 | xc16x | xgate | xps100 \
-
			| xstormy16 | xtensa* \
+
			| x86 \
+
			| x86_64 \
+
			| xc16x \
+
			| xgate \
+
			| xps100 \
+
			| xstormy16 \
+
			| xtensa* \
			| ymp \
-
			| z8k | z80)
+
			| z80 \
+
			| z8k)
				;;

			*)
-
				echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2
+
				echo "Invalid configuration '$1': machine '$cpu-$vendor' not recognized" 1>&2
				exit 1
				;;
		esac
@@ -1293,11 +1491,12 @@ esac

# Decode manufacturer-specific aliases for certain operating systems.

-
if test x$basic_os != x
+
if test x"$basic_os" != x
then

-
# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just
+
# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just
# set os.
+
obj=
case $basic_os in
	gnu/linux*)
		kernel=linux
@@ -1312,10 +1511,11 @@ case $basic_os in
		os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'`
		;;
	*-*)
-
		# shellcheck disable=SC2162
+
		saved_IFS=$IFS
		IFS="-" read kernel os <<EOF
$basic_os
EOF
+
		IFS=$saved_IFS
		;;
	# Default OS when just kernel was specified
	nto*)
@@ -1326,6 +1526,10 @@ EOF
		kernel=linux
		os=`echo "$basic_os" | sed -e 's|linux|gnu|'`
		;;
+
	managarm*)
+
		kernel=managarm
+
		os=`echo "$basic_os" | sed -e 's|managarm|mlibc|'`
+
		;;
	*)
		kernel=
		os=$basic_os
@@ -1353,6 +1557,23 @@ case $os in
	unixware*)
		os=sysv4.2uw
		;;
+
	# The marketing names for NeXT's operating systems were
+
	# NeXTSTEP, NeXTSTEP 2, OpenSTEP 3, OpenSTEP 4.  'openstep' is
+
	# mapped to 'openstep3', but 'openstep1' and 'openstep2' are
+
	# mapped to 'nextstep' and 'nextstep2', consistent with the
+
	# treatment of SunOS/Solaris.
+
	ns | ns1 | nextstep | nextstep1 | openstep1)
+
		os=nextstep
+
		;;
+
	ns2 | nextstep2 | openstep2)
+
		os=nextstep2
+
		;;
+
	ns3 | nextstep3 | openstep | openstep3)
+
		os=openstep3
+
		;;
+
	ns4 | nextstep4 | openstep4)
+
		os=openstep4
+
		;;
	# es1800 is here to avoid being matched by es* (a different OS)
	es1800*)
		os=ose
@@ -1423,6 +1644,7 @@ case $os in
		;;
	utek*)
		os=bsd
+
		vendor=`echo "$vendor" | sed -e 's|^unknown$|tektronix|'`
		;;
	dynix*)
		os=bsd
@@ -1439,21 +1661,25 @@ case $os in
	386bsd)
		os=bsd
		;;
-
	ctix* | uts*)
+
	ctix*)
		os=sysv
+
		vendor=`echo "$vendor" | sed -e 's|^unknown$|convergent|'`
		;;
-
	nova*)
-
		os=rtmk-nova
+
	uts*)
+
		os=sysv
		;;
-
	ns2)
-
		os=nextstep2
+
	nova*)
+
		kernel=rtmk
+
		os=nova
		;;
	# Preserve the version number of sinix5.
	sinix5.*)
		os=`echo "$os" | sed -e 's|sinix|sysv|'`
+
		vendor=`echo "$vendor" | sed -e 's|^unknown$|sni|'`
		;;
	sinix*)
		os=sysv4
+
		vendor=`echo "$vendor" | sed -e 's|^unknown$|sni|'`
		;;
	tpf*)
		os=tpf
@@ -1491,10 +1717,16 @@ case $os in
			os=eabi
			;;
		    *)
-
			os=elf
+
			os=
+
			obj=elf
			;;
		esac
		;;
+
	aout* | coff* | elf* | pe*)
+
		# These are machine code file formats, not OSes
+
		obj=$os
+
		os=
+
		;;
	*)
		# No normalization, but not necessarily accepted, that comes below.
		;;
@@ -1513,12 +1745,15 @@ else
# system, and we'll never get to this point.

kernel=
+
obj=
case $cpu-$vendor in
	score-*)
-
		os=elf
+
		os=
+
		obj=elf
		;;
	spu-*)
-
		os=elf
+
		os=
+
		obj=elf
		;;
	*-acorn)
		os=riscix1.2
@@ -1528,28 +1763,35 @@ case $cpu-$vendor in
		os=gnu
		;;
	arm*-semi)
-
		os=aout
+
		os=
+
		obj=aout
		;;
	c4x-* | tic4x-*)
-
		os=coff
+
		os=
+
		obj=coff
		;;
	c8051-*)
-
		os=elf
+
		os=
+
		obj=elf
		;;
	clipper-intergraph)
		os=clix
		;;
	hexagon-*)
-
		os=elf
+
		os=
+
		obj=elf
		;;
	tic54x-*)
-
		os=coff
+
		os=
+
		obj=coff
		;;
	tic55x-*)
-
		os=coff
+
		os=
+
		obj=coff
		;;
	tic6x-*)
-
		os=coff
+
		os=
+
		obj=coff
		;;
	# This must come before the *-dec entry.
	pdp10-*)
@@ -1571,28 +1813,43 @@ case $cpu-$vendor in
		os=sunos3
		;;
	m68*-cisco)
-
		os=aout
+
		os=
+
		obj=aout
		;;
	mep-*)
-
		os=elf
+
		os=
+
		obj=elf
+
		;;
+
	# The -sgi and -siemens entries must be before the mips- entry
+
	# or we get the wrong os.
+
	*-sgi)
+
		os=irix
+
		;;
+
	*-siemens)
+
		os=sysv4
		;;
	mips*-cisco)
-
		os=elf
+
		os=
+
		obj=elf
		;;
-
	mips*-*)
-
		os=elf
+
	mips*-*|nanomips*-*)
+
		os=
+
		obj=elf
		;;
	or32-*)
-
		os=coff
+
		os=
+
		obj=coff
		;;
-
	*-tti)	# must be before sparc entry or we get the wrong os.
+
	# This must be before the sparc-* entry or we get the wrong os.
+
	*-tti)
		os=sysv3
		;;
	sparc-* | *-sun)
		os=sunos4.1.1
		;;
	pru-*)
-
		os=elf
+
		os=
+
		obj=elf
		;;
	*-be)
		os=beos
@@ -1616,7 +1873,7 @@ case $cpu-$vendor in
		os=hpux
		;;
	*-hitachi)
-
		os=hiux
+
		os=hiuxwe2
		;;
	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
		os=sysv
@@ -1660,12 +1917,6 @@ case $cpu-$vendor in
	*-encore)
		os=bsd
		;;
-
	*-sgi)
-
		os=irix
-
		;;
-
	*-siemens)
-
		os=sysv4
-
		;;
	*-masscomp)
		os=rtu
		;;
@@ -1673,10 +1924,12 @@ case $cpu-$vendor in
		os=uxpv
		;;
	*-rom68k)
-
		os=coff
+
		os=
+
		obj=coff
		;;
	*-*bug)
-
		os=coff
+
		os=
+
		obj=coff
		;;
	*-apple)
		os=macos
@@ -1694,10 +1947,11 @@ esac

fi

-
# Now, validate our (potentially fixed-up) OS.
+
# Now, validate our (potentially fixed-up) individual pieces (OS, OBJ).
+

case $os in
	# Sometimes we do "kernel-libc", so those need to count as OSes.
-
	musl* | newlib* | uclibc*)
+
	llvm* | musl* | newlib* | relibc* | uclibc*)
		;;
	# Likewise for "kernel-abi"
	eabi* | gnueabi*)
@@ -1705,81 +1959,308 @@ case $os in
	# VxWorks passes extra cpu info in the 4th filed.
	simlinux | simwindows | spe)
		;;
+
	# See `case $cpu-$os` validation below
+
	ghcjs)
+
		;;
	# Now accept the basic system types.
-
	# The portable systems comes first.
	# Each alternative MUST end in a * to match a version number.
-
	gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
-
	     | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \
-
	     | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
-
	     | sym* |  plan9* | psp* | sim* | xray* | os68k* | v88r* \
-
	     | hiux* | abug | nacl* | netware* | windows* \
-
	     | os9* | macos* | osx* | ios* \
-
	     | mpw* | magic* | mmixware* | mon960* | lnews* \
-
	     | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
-
	     | aos* | aros* | cloudabi* | sortix* | twizzler* \
-
	     | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
-
	     | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
-
	     | mirbsd* | netbsd* | dicos* | openedition* | ose* \
-
	     | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \
-
	     | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \
-
	     | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
-
	     | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
-
	     | udi* | lites* | ieee* | go32* | aux* | hcos* \
-
	     | chorusrdb* | cegcc* | glidix* | serenity* \
-
	     | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
-
	     | midipix* | mingw32* | mingw64* | mint* \
-
	     | uxpv* | beos* | mpeix* | udk* | moxiebox* \
-
	     | interix* | uwin* | mks* | rhapsody* | darwin* \
-
	     | openstep* | oskit* | conix* | pw32* | nonstopux* \
-
	     | storm-chaos* | tops10* | tenex* | tops20* | its* \
-
	     | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \
-
	     | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \
-
	     | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
-
	     | skyos* | haiku* | rdos* | toppers* | drops* | es* \
-
	     | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
-
	     | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
-
	     | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx*)
+
	  abug \
+
	| aix* \
+
	| amdhsa* \
+
	| amigados* \
+
	| amigaos* \
+
	| android* \
+
	| aof* \
+
	| aos* \
+
	| aros* \
+
	| atheos* \
+
	| auroraux* \
+
	| aux* \
+
	| beos* \
+
	| bitrig* \
+
	| bme* \
+
	| bosx* \
+
	| bsd* \
+
	| cegcc* \
+
	| chorusos* \
+
	| chorusrdb* \
+
	| clix* \
+
	| cloudabi* \
+
	| cnk* \
+
	| conix* \
+
	| cos* \
+
	| cxux* \
+
	| cygwin* \
+
	| darwin* \
+
	| dgux* \
+
	| dicos* \
+
	| dnix* \
+
	| domain* \
+
	| dragonfly* \
+
	| drops* \
+
	| ebmon* \
+
	| ecoff* \
+
	| ekkobsd* \
+
	| emscripten* \
+
	| emx* \
+
	| es* \
+
	| fiwix* \
+
	| freebsd* \
+
	| fuchsia* \
+
	| genix* \
+
	| genode* \
+
	| glidix* \
+
	| gnu* \
+
	| go32* \
+
	| haiku* \
+
	| hcos* \
+
	| hiux* \
+
	| hms* \
+
	| hpux* \
+
	| ieee* \
+
	| interix* \
+
	| ios* \
+
	| iris* \
+
	| irix* \
+
	| ironclad* \
+
	| isc* \
+
	| its* \
+
	| l4re* \
+
	| libertybsd* \
+
	| lites* \
+
	| lnews* \
+
	| luna* \
+
	| lynxos* \
+
	| mach* \
+
	| macos* \
+
	| magic* \
+
	| mbr* \
+
	| midipix* \
+
	| midnightbsd* \
+
	| mingw32* \
+
	| mingw64* \
+
	| minix* \
+
	| mint* \
+
	| mirbsd* \
+
	| mks* \
+
	| mlibc* \
+
	| mmixware* \
+
	| mon960* \
+
	| morphos* \
+
	| moss* \
+
	| moxiebox* \
+
	| mpeix* \
+
	| mpw* \
+
	| msdos* \
+
	| msys* \
+
	| mvs* \
+
	| nacl* \
+
	| netbsd* \
+
	| netware* \
+
	| newsos* \
+
	| nextstep* \
+
	| nindy* \
+
	| nonstopux* \
+
	| nova* \
+
	| nsk* \
+
	| nucleus* \
+
	| nx6 \
+
	| nx7 \
+
	| oabi* \
+
	| ohos* \
+
	| onefs* \
+
	| openbsd* \
+
	| openedition* \
+
	| openstep* \
+
	| os108* \
+
	| os2* \
+
	| os400* \
+
	| os68k* \
+
	| os9* \
+
	| ose* \
+
	| osf* \
+
	| oskit* \
+
	| osx* \
+
	| palmos* \
+
	| phoenix* \
+
	| plan9* \
+
	| powermax* \
+
	| powerunix* \
+
	| proelf* \
+
	| psos* \
+
	| psp* \
+
	| ptx* \
+
	| pw32* \
+
	| qnx* \
+
	| rdos* \
+
	| redox* \
+
	| rhapsody* \
+
	| riscix* \
+
	| riscos* \
+
	| rtems* \
+
	| rtmk* \
+
	| rtu* \
+
	| scout* \
+
	| secbsd* \
+
	| sei* \
+
	| serenity* \
+
	| sim* \
+
	| skyos* \
+
	| solaris* \
+
	| solidbsd* \
+
	| sortix* \
+
	| storm-chaos* \
+
	| sunos \
+
	| sunos[34]* \
+
	| superux* \
+
	| syllable* \
+
	| sym* \
+
	| sysv* \
+
	| tenex* \
+
	| tirtos* \
+
	| toppers* \
+
	| tops10* \
+
	| tops20* \
+
	| tpf* \
+
	| tvos* \
+
	| twizzler* \
+
	| uclinux* \
+
	| udi* \
+
	| udk* \
+
	| ultrix* \
+
	| unicos* \
+
	| uniplus* \
+
	| unleashed* \
+
	| unos* \
+
	| uwin* \
+
	| uxpv* \
+
	| v88r* \
+
	|*vms* \
+
	| vos* \
+
	| vsta* \
+
	| vxsim* \
+
	| vxworks* \
+
	| wasi* \
+
	| watchos* \
+
	| wince* \
+
	| windiss* \
+
	| windows* \
+
	| winnt* \
+
	| xenix* \
+
	| xray* \
+
	| zephyr* \
+
	| zvmoe* )
		;;
	# This one is extra strict with allowed versions
	sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
		# Don't forget version if it is 3.2v4 or newer.
		;;
+
	# This refers to builds using the UEFI calling convention
+
	# (which depends on the architecture) and PE file format.
+
	# Note that this is both a different calling convention and
+
	# different file format than that of GNU-EFI
+
	# (x86_64-w64-mingw32).
+
	uefi)
+
		;;
	none)
		;;
+
	kernel* | msvc* )
+
		# Restricted further below
+
		;;
+
	'')
+
		if test x"$obj" = x
+
		then
+
			echo "Invalid configuration '$1': Blank OS only allowed with explicit machine code file format" 1>&2
+
		fi
+
		;;
	*)
-
		echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2
+
		echo "Invalid configuration '$1': OS '$os' not recognized" 1>&2
+
		exit 1
+
		;;
+
esac
+

+
case $obj in
+
	aout* | coff* | elf* | pe*)
+
		;;
+
	'')
+
		# empty is fine
+
		;;
+
	*)
+
		echo "Invalid configuration '$1': Machine code format '$obj' not recognized" 1>&2
+
		exit 1
+
		;;
+
esac
+

+
# Here we handle the constraint that a (synthetic) cpu and os are
+
# valid only in combination with each other and nowhere else.
+
case $cpu-$os in
+
	# The "javascript-unknown-ghcjs" triple is used by GHC; we
+
	# accept it here in order to tolerate that, but reject any
+
	# variations.
+
	javascript-ghcjs)
+
		;;
+
	javascript-* | *-ghcjs)
+
		echo "Invalid configuration '$1': cpu '$cpu' is not valid with os '$os$obj'" 1>&2
		exit 1
		;;
esac

# As a final step for OS-related things, validate the OS-kernel combination
# (given a valid OS), if there is a kernel.
-
case $kernel-$os in
-
	linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* | linux-musl* | linux-uclibc* )
+
case $kernel-$os-$obj in
+
	linux-gnu*- | linux-android*- | linux-dietlibc*- | linux-llvm*- \
+
		    | linux-mlibc*- | linux-musl*- | linux-newlib*- \
+
		    | linux-relibc*- | linux-uclibc*- | linux-ohos*- )
		;;
-
	uclinux-uclibc* )
+
	uclinux-uclibc*- | uclinux-gnu*- )
		;;
-
	-dietlibc* | -newlib* | -musl* | -uclibc* )
+
	managarm-mlibc*- | managarm-kernel*- )
+
		;;
+
	windows*-msvc*-)
+
		;;
+
	-dietlibc*- | -llvm*- | -mlibc*- | -musl*- | -newlib*- | -relibc*- \
+
		    | -uclibc*- )
		# These are just libc implementations, not actual OSes, and thus
		# require a kernel.
-
		echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2
+
		echo "Invalid configuration '$1': libc '$os' needs explicit kernel." 1>&2
		exit 1
		;;
-
	kfreebsd*-gnu* | kopensolaris*-gnu*)
+
	-kernel*- )
+
		echo "Invalid configuration '$1': '$os' needs explicit kernel." 1>&2
+
		exit 1
		;;
-
	vxworks-simlinux | vxworks-simwindows | vxworks-spe)
+
	*-kernel*- )
+
		echo "Invalid configuration '$1': '$kernel' does not support '$os'." 1>&2
+
		exit 1
		;;
-
	nto-qnx*)
+
	*-msvc*- )
+
		echo "Invalid configuration '$1': '$os' needs 'windows'." 1>&2
+
		exit 1
		;;
-
	os2-emx)
+
	kfreebsd*-gnu*- | knetbsd*-gnu*- | netbsd*-gnu*- | kopensolaris*-gnu*-)
+
		;;
+
	vxworks-simlinux- | vxworks-simwindows- | vxworks-spe-)
+
		;;
+
	nto-qnx*-)
		;;
-
	*-eabi* | *-gnueabi*)
+
	os2-emx-)
		;;
-
	-*)
+
	rtmk-nova-)
+
		;;
+
	*-eabi*- | *-gnueabi*-)
+
		;;
+
	none--*)
+
		# None (no kernel, i.e. freestanding / bare metal),
+
		# can be paired with an machine code file format
+
		;;
+
	-*-)
		# Blank kernel with real OS is always fine.
		;;
-
	*-*)
-
		echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2
+
	--*)
+
		# Blank kernel and OS with real machine code file format is always fine.
+
		;;
+
	*-*-*)
+
		echo "Invalid configuration '$1': Kernel '$kernel' not known to work with OS '$os'." 1>&2
		exit 1
		;;
esac
@@ -1792,7 +2273,7 @@ case $vendor in
			*-riscix*)
				vendor=acorn
				;;
-
			*-sunos*)
+
			*-sunos* | *-solaris*)
				vendor=sun
				;;
			*-cnk* | *-aix*)
@@ -1862,7 +2343,7 @@ case $vendor in
		;;
esac

-
echo "$cpu-$vendor-${kernel:+$kernel-}$os"
+
echo "$cpu-$vendor${kernel:+-$kernel}${os:+-$os}${obj:+-$obj}"
exit

# Local variables:
modified autosetup/autosetup-find-tclsh
@@ -9,7 +9,7 @@ for tclsh in ./jimsh0 $autosetup_tclsh jimsh tclsh tclsh8.5 tclsh8.6 tclsh8.7; d
done
echo 1>&2 "No installed jimsh or tclsh, building local bootstrap jimsh0"
for cc in ${CC_FOR_BUILD:-cc} gcc; do
-
	{ $cc -o jimsh0 "$d/jimsh0.c"; } 2>/dev/null || continue
+
	{ $cc -o jimsh0 "$d/jimsh0.c"; } >/dev/null 2>&1 || continue
	./jimsh0 "$d/${1-autosetup-test-tclsh}" && exit 0
done
echo 1>&2 "No working C compiler found. Tried ${CC_FOR_BUILD:-cc} and gcc."
modified autosetup/cc.tcl
@@ -5,7 +5,7 @@
#
# The 'cc' module supports checking various 'features' of the C or C++
# compiler/linker environment. Common commands are 'cc-check-includes',
-
# 'cc-check-types', 'cc-check-functions', 'cc-with', 'make-config-header' and 'make-template'.
+
# 'cc-check-types', 'cc-check-functions', 'cc-with' and 'make-config-header'
#
# The following environment variables are used if set:
#
modified autosetup/jimsh0.c
@@ -1,8 +1,9 @@
/* This is single source file, bootstrap version of Jim Tcl. See http://jim.tcl.tk/ */
-
#define JIM_TCL_COMPAT
+
#define JIM_COMPAT
#define JIM_ANSIC
#define JIM_REGEXP
#define HAVE_NO_AUTOCONF
+
#define JIM_TINY
#define _JIMAUTOCONF_H
#define TCL_LIBRARY "."
#define jim_ext_bootstrap
@@ -12,7 +13,6 @@
#define jim_ext_file
#define jim_ext_glob
#define jim_ext_exec
-
#define jim_ext_posix
#define jim_ext_clock
#define jim_ext_array
#define jim_ext_stdlib
@@ -62,7 +62,7 @@
#define HAVE_PIPE
#define _FILE_OFFSET_BITS 64
#endif
-
#define JIM_VERSION 82
+
#define JIM_VERSION 84
#ifndef JIM_WIN32COMPAT_H
#define JIM_WIN32COMPAT_H

@@ -95,6 +95,9 @@ char *dlerror(void);

#include <limits.h>
#define jim_wide _int64
+
#ifndef HAVE_LONG_LONG
+
#define HAVE_LONG_LONG
+
#endif
#ifndef LLONG_MAX
	#define LLONG_MAX    9223372036854775807I64
#endif
@@ -109,11 +112,7 @@ char *dlerror(void);

#include <io.h>

-
struct timeval {
-
	long tv_sec;
-
	long tv_usec;
-
};
-

+
#include <winsock.h>
int gettimeofday(struct timeval *tv, void *unused);

#define HAVE_OPENDIR
@@ -576,7 +575,7 @@ typedef struct Jim_Interp {
    Jim_Obj *result;
    int unused_errorLine;
    Jim_Obj *currentFilenameObj;
-
    int unused_addStackTrace;
+
    int break_level;
    int maxCallFrameDepth;
    int maxEvalDepth;
    int evalDepth;
@@ -720,6 +719,14 @@ JIM_EXPORT int Jim_SubstObj (Jim_Interp *interp, Jim_Obj *substObjPtr,
        Jim_Obj **resObjPtrPtr, int flags);


+
JIM_EXPORT Jim_Obj *Jim_GetSourceInfo(Jim_Interp *interp, Jim_Obj *objPtr,
+
        int *lineptr);
+

+
JIM_EXPORT void Jim_SetSourceInfo(Jim_Interp *interp, Jim_Obj *objPtr,
+
        Jim_Obj *fileNameObj, int lineNumber);
+

+

+

JIM_EXPORT void Jim_InitStack(Jim_Stack *stack);
JIM_EXPORT void Jim_FreeStack(Jim_Stack *stack);
JIM_EXPORT int Jim_StackLen(Jim_Stack *stack);
@@ -1155,7 +1162,7 @@ int Jim_OpenForWrite(const char *filename, int append);

int Jim_OpenForRead(const char *filename);

-
#if defined(__MINGW32__)
+
#if defined(__MINGW32__) || defined(_WIN32)
    #ifndef STRICT
    #define STRICT
    #endif
@@ -1190,6 +1197,7 @@ int Jim_OpenForRead(const char *filename);
    #define Jim_Stat _stat64
    #define Jim_FileStat _fstat64
    #define Jim_Lseek _lseeki64
+
    #define O_TEXT _O_TEXT

#else
    #if defined(HAVE_STAT64)
@@ -1232,10 +1240,11 @@ int Jim_OpenForRead(const char *filename);
            #define execvpe(ARG0, ARGV, ENV) execvp(ARG0, ARGV)
        #endif
    #endif
-
#endif

-
#ifndef O_TEXT
-
#define O_TEXT 0
+
    #ifndef O_TEXT
+
        #define O_TEXT 0
+
    #endif
+

#endif


@@ -1284,8 +1293,14 @@ int Jim_initjimshInit(Jim_Interp *interp)
"		if {[string match \"*/*\" $jim::argv0]} {\n"
"			set jim::exe [file join [pwd] $jim::argv0]\n"
"		} else {\n"
-
"			foreach path [split [env PATH \"\"] $tcl_platform(pathSeparator)] {\n"
-
"				set exec [file join [pwd] [string map {\\\\ /} $path] $jim::argv0]\n"
+
"			set jim::argv0 [file tail $jim::argv0]\n"
+
"			set path [split [env PATH \"\"] $tcl_platform(pathSeparator)]\n"
+
"			if {$tcl_platform(platform) eq \"windows\"} {\n"
+
"\n"
+
"				set path [lmap p [list \"\" {*}$path] { string map {\\\\ /} $p }]\n"
+
"			}\n"
+
"			foreach p $path {\n"
+
"				set exec [file join [pwd] $p $jim::argv0]\n"
"				if {[file executable $exec]} {\n"
"					set jim::exe $exec\n"
"					break\n"
@@ -1938,9 +1953,6 @@ int Jim_tclcompatInit(Jim_Interp *interp)
"			if {$cmd eq \"pid\"} {\n"
"				return $pids\n"
"			}\n"
-
"			if {$cmd eq \"getfd\"} {\n"
-
"				$f getfd\n"
-
"			}\n"
"			if {$cmd eq \"close\"} {\n"
"				$f close\n"
"\n"
@@ -2040,8 +2052,8 @@ int Jim_tclcompatInit(Jim_Interp *interp)


#define AIO_CMD_LEN 32
-
#define AIO_BUF_LEN 256
-
#define AIO_WBUF_FULL_SIZE (64 * 1024)
+
#define AIO_DEFAULT_RBUF_LEN 256
+
#define AIO_DEFAULT_WBUF_LIMIT (64 * 1024)

#define AIO_KEEPOPEN 1
#define AIO_NODELETE 2
@@ -2049,6 +2061,8 @@ int Jim_tclcompatInit(Jim_Interp *interp)
#define AIO_WBUF_NONE 8
#define AIO_NONBLOCK 16

+
#define AIO_ONEREAD 32
+

enum wbuftype {
    WBUF_OPT_NONE,
    WBUF_OPT_LINE,
@@ -2123,11 +2137,20 @@ typedef struct AioFile
    const JimAioFopsType *fops;
    Jim_Obj *readbuf;
    Jim_Obj *writebuf;
+
    char *rbuf;
+
    size_t rbuf_len;
+
    size_t wbuf_limit;
} AioFile;

+
static void aio_consume(Jim_Obj *objPtr, int n);
+

static int stdio_writer(struct AioFile *af, const char *buf, int len)
{
-
    return write(af->fd, buf, len);
+
    int ret = write(af->fd, buf, len);
+
    if (ret < 0 && errno == EPIPE) {
+
        aio_consume(af->writebuf, Jim_Length(af->writebuf));
+
    }
+
    return ret;
}

static int stdio_reader(struct AioFile *af, char *buf, int len, int nb)
@@ -2264,7 +2287,22 @@ static void aio_consume(Jim_Obj *objPtr, int n)
}


-
static int aio_autoflush(Jim_Interp *interp, void *clientData, int mask);
+
static int aio_flush(Jim_Interp *interp, AioFile *af);
+

+
#ifdef jim_ext_eventloop
+
static int aio_autoflush(Jim_Interp *interp, void *clientData, int mask)
+
{
+
    AioFile *af = clientData;
+

+
    aio_flush(interp, af);
+
    if (Jim_Length(af->writebuf) == 0) {
+

+
        return -1;
+
    }
+
    return 0;
+
}
+
#endif
+


static int aio_flush(Jim_Interp *interp, AioFile *af)
{
@@ -2299,19 +2337,7 @@ static int aio_flush(Jim_Interp *interp, AioFile *af)
    return JIM_OK;
}

-
static int aio_autoflush(Jim_Interp *interp, void *clientData, int mask)
-
{
-
    AioFile *af = clientData;
-

-
    aio_flush(interp, af);
-
    if (Jim_Length(af->writebuf) == 0) {
-

-
        return -1;
-
    }
-
    return 0;
-
}
-

-
static int aio_read_len(Jim_Interp *interp, AioFile *af, int nb, char *buf, size_t buflen, int neededLen)
+
static int aio_read_len(Jim_Interp *interp, AioFile *af, unsigned flags, int neededLen)
{
    if (!af->readbuf) {
        af->readbuf = Jim_NewStringObj(interp, NULL, 0);
@@ -2329,25 +2355,32 @@ static int aio_read_len(Jim_Interp *interp, AioFile *af, int nb, char *buf, size
        int readlen;

        if (neededLen == -1) {
-
            readlen = AIO_BUF_LEN;
+
            readlen = af->rbuf_len;
        }
        else {
-
            readlen = (neededLen > AIO_BUF_LEN ? AIO_BUF_LEN : neededLen);
+
            readlen = (neededLen > af->rbuf_len ? af->rbuf_len : neededLen);
+
        }
+

+
        if (!af->rbuf) {
+
            af->rbuf = Jim_Alloc(af->rbuf_len);
        }
-
        retval = af->fops->reader(af, buf, readlen, nb);
+
        retval = af->fops->reader(af, af->rbuf, readlen, flags & AIO_NONBLOCK);
        if (retval > 0) {
-
            Jim_AppendString(interp, af->readbuf, buf, retval);
+
            if (retval) {
+
                Jim_AppendString(interp, af->readbuf, af->rbuf, retval);
+
            }
            if (neededLen != -1) {
                neededLen -= retval;
            }
+
            if (flags & AIO_ONEREAD) {
+
                return JIM_OK;
+
            }
            continue;
        }
-
        if (JimCheckStreamError(interp, af)) {
+
        if ((flags & AIO_ONEREAD) || JimCheckStreamError(interp, af)) {
            return JIM_ERR;
        }
-
        if (nb || af->timeout) {
-
            return JIM_OK;
-
        }
+
        break;
    }

    return JIM_OK;
@@ -2415,6 +2448,7 @@ static void JimAioDelProc(Jim_Interp *interp, void *privData)
        Jim_FreeNewObj(interp, af->readbuf);
    }

+
    Jim_Free(af->rbuf);
    Jim_Free(af);
}

@@ -2428,7 +2462,6 @@ static int aio_cmd_read(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
    int option;
    int nb;
    Jim_Obj *objPtr;
-
    char buf[AIO_BUF_LEN];

    if (argc) {
        if (*Jim_String(argv[0]) == '-') {
@@ -2462,7 +2495,7 @@ static int aio_cmd_read(Jim_Interp *interp, int argc, Jim_Obj *const *argv)

    nb = aio_start_nonblocking(af);

-
    if (aio_read_len(interp, af, nb, buf, sizeof(buf), neededLen) != JIM_OK) {
+
    if (aio_read_len(interp, af, nb ? AIO_NONBLOCK : 0, neededLen) != JIM_OK) {
        aio_set_nonblocking(af, nb);
        return JIM_ERR;
    }
@@ -2517,11 +2550,6 @@ static int aio_cmd_copy(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
    AioFile *af = Jim_CmdPrivData(interp);
    jim_wide count = 0;
    jim_wide maxlen = JIM_WIDE_MAX;
-

-
    char buf[AIO_BUF_LEN];
-

-
    char *bufp = buf;
-
    int buflen = sizeof(buf);
    int ok = 1;
    Jim_Obj *objv[4];

@@ -2547,10 +2575,10 @@ static int aio_cmd_copy(Jim_Interp *interp, int argc, Jim_Obj *const *argv)

    while (count < maxlen) {
        jim_wide len = maxlen - count;
-
        if (len > buflen) {
-
            len = buflen;
+
        if (len > af->rbuf_len) {
+
            len = af->rbuf_len;
        }
-
        if (aio_read_len(interp, af, 0, bufp, buflen, len) != JIM_OK) {
+
        if (aio_read_len(interp, af, 0, len) != JIM_OK) {
            ok = 0;
            break;
        }
@@ -2563,17 +2591,13 @@ static int aio_cmd_copy(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
        if (aio_eof(af)) {
            break;
        }
-
        if (count >= 16384 && bufp == buf) {
+
        if (count >= 16384 && af->rbuf_len < 65536) {

-
            buflen = 65536;
-
            bufp = Jim_Alloc(buflen);
+
            af->rbuf_len = 65536;
+
            af->rbuf = Jim_Realloc(af->rbuf, af->rbuf_len);
        }
    }

-
    if (bufp != buf) {
-
        Jim_Free(bufp);
-
    }
-

    Jim_DecrRefCount(interp, objv[1]);
    Jim_DecrRefCount(interp, objv[2]);

@@ -2589,10 +2613,10 @@ static int aio_cmd_copy(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
static int aio_cmd_gets(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
{
    AioFile *af = Jim_CmdPrivData(interp);
-
    char buf[AIO_BUF_LEN];
    Jim_Obj *objPtr = NULL;
    int len;
    int nb;
+
    unsigned flags = AIO_ONEREAD;
    char *nl = NULL;
    int offset = 0;

@@ -2600,38 +2624,33 @@ static int aio_cmd_gets(Jim_Interp *interp, int argc, Jim_Obj *const *argv)


    nb = aio_start_nonblocking(af);
-

-
    if (!af->readbuf) {
-
        af->readbuf = Jim_NewStringObj(interp, NULL, 0);
+
    if (nb) {
+
        flags |= AIO_NONBLOCK;
    }

    while (!aio_eof(af)) {
-
        const char *pt = Jim_GetString(af->readbuf, &len);
-
        nl = memchr(pt + offset, '\n', len - offset);
-
        if (nl) {
+
        if (af->readbuf) {
+
            const char *pt = Jim_GetString(af->readbuf, &len);
+
            nl = memchr(pt + offset, '\n', len - offset);
+
            if (nl) {

-
            objPtr = Jim_NewStringObj(interp, pt, nl - pt);
-

-
            aio_consume(af->readbuf, nl - pt + 1);
-
            break;
-
        }
-

-
        offset = len;
-
        len = af->fops->reader(af, buf, AIO_BUF_LEN, nb);
-
        if (len <= 0) {
-
            if (nb || af->timeout) {
+
                objPtr = Jim_NewStringObj(interp, pt, nl - pt);

+
                aio_consume(af->readbuf, nl - pt + 1);
                break;
            }
+
            offset = len;
        }
-
        else {
-
            Jim_AppendString(interp, af->readbuf, buf, len);
+

+

+
        if (aio_read_len(interp, af, flags, -1) != JIM_OK) {
+
            break;
        }
    }

    aio_set_nonblocking(af, nb);

-
    if (!nl && aio_eof(af)) {
+
    if (!nl && aio_eof(af) && af->readbuf) {

        objPtr = af->readbuf;
        af->readbuf = NULL;
@@ -2680,6 +2699,13 @@ static int aio_cmd_puts(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
        strObj = argv[0];
    }

+
#ifdef JIM_MAINTAINER
+
    if (Jim_IsShared(af->writebuf)) {
+
        Jim_DecrRefCount(interp, af->writebuf);
+
        af->writebuf = Jim_DuplicateObj(interp, af->writebuf);
+
        Jim_IncrRefCount(af->writebuf);
+
    }
+
#endif
    Jim_AppendObj(interp, af->writebuf, strObj);
    if (nl) {
        Jim_AppendString(interp, af->writebuf, "\n", 1);
@@ -2701,7 +2727,7 @@ static int aio_cmd_puts(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
            break;

        case WBUF_OPT_FULL:
-
            if (wlen >= AIO_WBUF_FULL_SIZE) {
+
            if (wlen >= af->wbuf_limit) {
                wnow = 1;
            }
            break;
@@ -2870,6 +2896,7 @@ static int aio_cmd_sync(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
static int aio_cmd_buffering(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
{
    AioFile *af = Jim_CmdPrivData(interp);
+
    Jim_Obj *resultObj;

    static const char * const options[] = {
        "none",
@@ -2878,17 +2905,57 @@ static int aio_cmd_buffering(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
        NULL
    };

-
    if (Jim_GetEnum(interp, argv[0], options, &af->wbuft, NULL, JIM_ERRMSG) != JIM_OK) {
-
        return JIM_ERR;
+
    if (argc) {
+
        if (Jim_GetEnum(interp, argv[0], options, &af->wbuft, NULL, JIM_ERRMSG) != JIM_OK) {
+
            return JIM_ERR;
+
        }
+

+
        if (af->wbuft == WBUF_OPT_FULL && argc == 2) {
+
            long l;
+
            if (Jim_GetLong(interp, argv[1], &l) != JIM_OK || l <= 0) {
+
                return JIM_ERR;
+
            }
+
            af->wbuf_limit = l;
+
        }
+

+
        if (af->wbuft == WBUF_OPT_NONE) {
+
            if (aio_flush(interp, af) != JIM_OK) {
+
                return JIM_ERR;
+
            }
+
        }
+

    }

-
    if (af->wbuft == WBUF_OPT_NONE) {
-
        return aio_flush(interp, af);
+
    resultObj = Jim_NewListObj(interp, NULL, 0);
+
    Jim_ListAppendElement(interp, resultObj, Jim_NewStringObj(interp, options[af->wbuft], -1));
+
    if (af->wbuft == WBUF_OPT_FULL) {
+
        Jim_ListAppendElement(interp, resultObj, Jim_NewIntObj(interp, af->wbuf_limit));
    }
+
    Jim_SetResult(interp, resultObj);

    return JIM_OK;
}

+
static int aio_cmd_readsize(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
+
{
+
    AioFile *af = Jim_CmdPrivData(interp);
+

+
    if (argc) {
+
        long l;
+
        if (Jim_GetLong(interp, argv[0], &l) != JIM_OK || l <= 0) {
+
            return JIM_ERR;
+
        }
+
        af->rbuf_len = l;
+
        if (af->rbuf) {
+
            af->rbuf = Jim_Realloc(af->rbuf, af->rbuf_len);
+
        }
+
    }
+
    Jim_SetResultInt(interp, af->rbuf_len);
+

+
    return JIM_OK;
+
}
+

+
#ifdef jim_ext_eventloop
static int aio_cmd_timeout(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
{
#ifdef HAVE_SELECT
@@ -2906,7 +2973,6 @@ static int aio_cmd_timeout(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
#endif
}

-
#ifdef jim_ext_eventloop
static int aio_eventinfo(Jim_Interp *interp, AioFile * af, unsigned mask,
    int argc, Jim_Obj * const *argv)
{
@@ -3074,9 +3140,16 @@ static const jim_subcmd_type aio_command_table[] = {
    },
#endif
    {   "buffering",
-
        "none|line|full",
+
        "?none|line|full? ?size?",
        aio_cmd_buffering,
-
        1,
+
        0,
+
        2,
+

+
    },
+
    {   "readsize",
+
        "?size?",
+
        aio_cmd_readsize,
+
        0,
        1,

    },
@@ -3319,6 +3392,9 @@ static AioFile *JimMakeChannel(Jim_Interp *interp, int fd, Jim_Obj *filename,

    af->writebuf = Jim_NewStringObj(interp, NULL, 0);
    Jim_IncrRefCount(af->writebuf);
+
    af->wbuf_limit = AIO_DEFAULT_WBUF_LIMIT;
+
    af->rbuf_len = AIO_DEFAULT_RBUF_LEN;
+


    Jim_CreateCommand(interp, buf, JimAioSubCmdProc, af, JimAioDelProc);

@@ -3772,27 +3848,30 @@ int Jim_RegsubCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
    int regcomp_flags = 0;
    int regexec_flags = 0;
    int opt_all = 0;
+
    int opt_command = 0;
    int offset = 0;
    regex_t *regex;
    const char *p;
-
    int result;
+
    int result = JIM_OK;
    regmatch_t pmatch[MAX_SUB_MATCHES + 1];
    int num_matches = 0;

    int i, j, n;
    Jim_Obj *varname;
    Jim_Obj *resultObj;
+
    Jim_Obj *cmd_prefix = NULL;
+
    Jim_Obj *regcomp_obj = NULL;
    const char *source_str;
    int source_len;
-
    const char *replace_str;
+
    const char *replace_str = NULL;
    int replace_len;
    const char *pattern;
    int option;
    enum {
-
        OPT_NOCASE, OPT_LINE, OPT_ALL, OPT_START, OPT_END
+
        OPT_NOCASE, OPT_LINE, OPT_ALL, OPT_START, OPT_COMMAND, OPT_END
    };
    static const char * const options[] = {
-
        "-nocase", "-line", "-all", "-start", "--", NULL
+
        "-nocase", "-line", "-all", "-start", "-command", "--", NULL
    };

    if (argc < 4) {
@@ -3836,20 +3915,39 @@ int Jim_RegsubCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
                    return JIM_ERR;
                }
                break;
+

+
            case OPT_COMMAND:
+
                opt_command = 1;
+
                break;
        }
    }
    if (argc - i != 3 && argc - i != 4) {
        goto wrongNumArgs;
    }

-
    regex = SetRegexpFromAny(interp, argv[i], regcomp_flags);
+

+
    regcomp_obj = Jim_DuplicateObj(interp, argv[i]);
+
	Jim_IncrRefCount(regcomp_obj);
+
    regex = SetRegexpFromAny(interp, regcomp_obj, regcomp_flags);
    if (!regex) {
+
		Jim_DecrRefCount(interp, regcomp_obj);
        return JIM_ERR;
    }
    pattern = Jim_String(argv[i]);

    source_str = Jim_GetString(argv[i + 1], &source_len);
-
    replace_str = Jim_GetString(argv[i + 2], &replace_len);
+
    if (opt_command) {
+
        cmd_prefix = argv[i + 2];
+
        if (Jim_ListLength(interp, cmd_prefix) == 0) {
+
            Jim_SetResultString(interp, "command prefix must be a list of at least one element", -1);
+
			Jim_DecrRefCount(interp, regcomp_obj);
+
            return JIM_ERR;
+
        }
+
        Jim_IncrRefCount(cmd_prefix);
+
    }
+
    else {
+
        replace_str = Jim_GetString(argv[i + 2], &replace_len);
+
    }
    varname = argv[i + 3];


@@ -3893,35 +3991,58 @@ int Jim_RegsubCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)

        Jim_AppendString(interp, resultObj, p, pmatch[0].rm_so);

+
        if (opt_command) {

-
        for (j = 0; j < replace_len; j++) {
-
            int idx;
-
            int c = replace_str[j];
+
            Jim_Obj *cmdListObj = Jim_DuplicateObj(interp, cmd_prefix);
+
            for (j = 0; j < MAX_SUB_MATCHES; j++) {
+
                if (pmatch[j].rm_so == -1) {
+
                    break;
+
                }
+
                else {
+
                    Jim_Obj *srcObj = Jim_NewStringObj(interp, p + pmatch[j].rm_so, pmatch[j].rm_eo - pmatch[j].rm_so);
+
                    Jim_ListAppendElement(interp, cmdListObj, srcObj);
+
                }
+
            }
+
            Jim_IncrRefCount(cmdListObj);

-
            if (c == '&') {
-
                idx = 0;
+
            result = Jim_EvalObj(interp, cmdListObj);
+
            Jim_DecrRefCount(interp, cmdListObj);
+
            if (result != JIM_OK) {
+
                goto cmd_error;
            }
-
            else if (c == '\\' && j < replace_len) {
-
                c = replace_str[++j];
-
                if ((c >= '0') && (c <= '9')) {
-
                    idx = c - '0';
+
            Jim_AppendString(interp, resultObj, Jim_String(Jim_GetResult(interp)), -1);
+
        }
+
        else {
+

+
            for (j = 0; j < replace_len; j++) {
+
                int idx;
+
                int c = replace_str[j];
+

+
                if (c == '&') {
+
                    idx = 0;
                }
-
                else if ((c == '\\') || (c == '&')) {
-
                    Jim_AppendString(interp, resultObj, replace_str + j, 1);
-
                    continue;
+
                else if (c == '\\' && j < replace_len) {
+
                    c = replace_str[++j];
+
                    if ((c >= '0') && (c <= '9')) {
+
                        idx = c - '0';
+
                    }
+
                    else if ((c == '\\') || (c == '&')) {
+
                        Jim_AppendString(interp, resultObj, replace_str + j, 1);
+
                        continue;
+
                    }
+
                    else {
+
                        Jim_AppendString(interp, resultObj, replace_str + j - 1, (j == replace_len) ? 1 : 2);
+
                        continue;
+
                    }
                }
                else {
-
                    Jim_AppendString(interp, resultObj, replace_str + j - 1, (j == replace_len) ? 1 : 2);
+
                    Jim_AppendString(interp, resultObj, replace_str + j, 1);
                    continue;
                }
-
            }
-
            else {
-
                Jim_AppendString(interp, resultObj, replace_str + j, 1);
-
                continue;
-
            }
-
            if ((idx < MAX_SUB_MATCHES) && pmatch[idx].rm_so != -1 && pmatch[idx].rm_eo != -1) {
-
                Jim_AppendString(interp, resultObj, p + pmatch[idx].rm_so,
-
                    pmatch[idx].rm_eo - pmatch[idx].rm_so);
+
                if ((idx < MAX_SUB_MATCHES) && pmatch[idx].rm_so != -1 && pmatch[idx].rm_eo != -1) {
+
                    Jim_AppendString(interp, resultObj, p + pmatch[idx].rm_so,
+
                        pmatch[idx].rm_eo - pmatch[idx].rm_so);
+
                }
            }
        }

@@ -3958,22 +4079,34 @@ int Jim_RegsubCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)

    Jim_AppendString(interp, resultObj, p, -1);

+
cmd_error:
+
    if (result == JIM_OK) {

-
    if (argc - i == 4) {
-
        result = Jim_SetVariable(interp, varname, resultObj);
+
        if (argc - i == 4) {
+
            result = Jim_SetVariable(interp, varname, resultObj);

-
        if (result == JIM_OK) {
-
            Jim_SetResultInt(interp, num_matches);
+
            if (result == JIM_OK) {
+
                Jim_SetResultInt(interp, num_matches);
+
            }
+
            else {
+
                Jim_FreeObj(interp, resultObj);
+
            }
        }
        else {
-
            Jim_FreeObj(interp, resultObj);
+
            Jim_SetResult(interp, resultObj);
+
            result = JIM_OK;
        }
    }
    else {
-
        Jim_SetResult(interp, resultObj);
-
        result = JIM_OK;
+
        Jim_FreeObj(interp, resultObj);
+
    }
+

+
    if (opt_command) {
+
        Jim_DecrRefCount(interp, cmd_prefix);
    }

+
	Jim_DecrRefCount(interp, regcomp_obj);
+

    return result;
}

@@ -6355,6 +6488,7 @@ static int clock_cmd_scan(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
    }


+
    tm.tm_isdst = options.gmt ? 0 : -1;
    Jim_SetResultInt(interp, options.gmt ? jim_timegm(&tm) : mktime(&tm));

    return JIM_OK;
@@ -6659,53 +6793,6 @@ int Jim_arrayInit(Jim_Interp *interp)
    Jim_CreateCommand(interp, "array", Jim_SubCmdProc, (void *)array_command_table, NULL);
    return JIM_OK;
}
-

-
#include <sys/types.h>
-
#include <sys/time.h>
-
#include <sys/wait.h>
-
#include <unistd.h>
-
#include <string.h>
-
#include <errno.h>
-

-

-
#ifdef HAVE_SYS_SYSINFO_H
-
#include <sys/sysinfo.h>
-
#endif
-

-
static void Jim_PosixSetError(Jim_Interp *interp)
-
{
-
    Jim_SetResultString(interp, strerror(errno), -1);
-
}
-

-
#if defined(HAVE_FORK)
-
static int Jim_PosixForkCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
-
{
-
    pid_t pid;
-

-
    JIM_NOTUSED(argv);
-

-
    if (argc != 1) {
-
        Jim_WrongNumArgs(interp, 1, argv, "");
-
        return JIM_ERR;
-
    }
-
    if ((pid = fork()) == -1) {
-
        Jim_PosixSetError(interp);
-
        return JIM_ERR;
-
    }
-
    Jim_SetResultInt(interp, (jim_wide) pid);
-
    return JIM_OK;
-
}
-
#endif
-

-

-
int Jim_posixInit(Jim_Interp *interp)
-
{
-
    Jim_PackageProvideCheck(interp, "posix");
-
#ifdef HAVE_FORK
-
    Jim_CreateCommand(interp, "os.fork", Jim_PosixForkCommand, NULL, NULL);
-
#endif
-
    return JIM_OK;
-
}
int Jim_InitStaticExtensions(Jim_Interp *interp)
{
extern int Jim_bootstrapInit(Jim_Interp *);
@@ -6715,7 +6802,6 @@ extern int Jim_regexpInit(Jim_Interp *);
extern int Jim_fileInit(Jim_Interp *);
extern int Jim_globInit(Jim_Interp *);
extern int Jim_execInit(Jim_Interp *);
-
extern int Jim_posixInit(Jim_Interp *);
extern int Jim_clockInit(Jim_Interp *);
extern int Jim_arrayInit(Jim_Interp *);
extern int Jim_stdlibInit(Jim_Interp *);
@@ -6727,14 +6813,15 @@ Jim_regexpInit(interp);
Jim_fileInit(interp);
Jim_globInit(interp);
Jim_execInit(interp);
-
Jim_posixInit(interp);
Jim_clockInit(interp);
Jim_arrayInit(interp);
Jim_stdlibInit(interp);
Jim_tclcompatInit(interp);
return JIM_OK;
}
+
#ifndef JIM_TINY
#define JIM_OPTIMIZATION
+
#endif

#include <stdio.h>
#include <stdlib.h>
@@ -6794,7 +6881,9 @@ return JIM_OK;

#define JIM_INTEGER_SPACE 24

-
const char *jim_tt_name(int type);
+
#if defined(DEBUG_SHOW_SCRIPT) || defined(DEBUG_SHOW_SCRIPT_TOKENS) || defined(JIM_DEBUG_COMMAND) || defined(DEBUG_SHOW_SUBST)
+
static const char *jim_tt_name(int type);
+
#endif

#ifdef JIM_DEBUG_PANIC
static void JimPanicDump(int fail_condition, const char *fmt, ...);
@@ -6830,7 +6919,6 @@ static void JimPrngSeed(Jim_Interp *interp, unsigned char *seed, int seedLen);
static void JimRandomBytes(Jim_Interp *interp, void *dest, unsigned int len);
static int JimSetNewVariable(Jim_HashTable *ht, Jim_Obj *nameObjPtr, Jim_VarVal *vv);
static Jim_VarVal *JimFindVariable(Jim_HashTable *ht, Jim_Obj *nameObjPtr);
-
static void JimSetErrorStack(Jim_Interp *interp);
static int SetVariableFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr);

#define JIM_DICT_SUGAR 100
@@ -7809,6 +7897,7 @@ struct JimParserCtx
    int inquote;
    int comment;
    struct JimParseMissing missing;
+
    const char *errmsg;
};

static int JimParseScript(struct JimParserCtx *pc);
@@ -9509,17 +9598,6 @@ void DupSourceInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr)
    Jim_IncrRefCount(dupPtr->internalRep.sourceValue.fileNameObj);
}

-
static void JimSetSourceInfo(Jim_Interp *interp, Jim_Obj *objPtr,
-
    Jim_Obj *fileNameObj, int lineNumber)
-
{
-
    JimPanic((Jim_IsShared(objPtr), "JimSetSourceInfo called with shared object"));
-
    JimPanic((objPtr->typePtr != NULL, "JimSetSourceInfo called with typed object"));
-
    Jim_IncrRefCount(fileNameObj);
-
    objPtr->internalRep.sourceValue.fileNameObj = fileNameObj;
-
    objPtr->internalRep.sourceValue.lineNumber = lineNumber;
-
    objPtr->typePtr = &sourceObjType;
-
}
-

static const Jim_ObjType scriptLineObjType = {
    "scriptline",
    NULL,
@@ -9580,6 +9658,7 @@ typedef struct ScriptObj
static void JimSetScriptFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr);
static int JimParseCheckMissing(Jim_Interp *interp, int ch);
static ScriptObj *JimGetScript(Jim_Interp *interp, Jim_Obj *objPtr);
+
static void JimSetErrorStack(Jim_Interp *interp, ScriptObj *script);

void FreeScriptInternalRep(Jim_Interp *interp, Jim_Obj *objPtr)
{
@@ -9795,7 +9874,7 @@ static void ScriptObjAddTokens(Jim_Interp *interp, struct ScriptObj *script,
            token->objPtr = JimMakeScriptObj(interp, t);
            Jim_IncrRefCount(token->objPtr);

-
            JimSetSourceInfo(interp, token->objPtr, script->fileNameObj, t->line);
+
            Jim_SetSourceInfo(interp, token->objPtr, script->fileNameObj, t->line);
            token++;
        }
    }
@@ -9855,6 +9934,39 @@ static int JimParseCheckMissing(Jim_Interp *interp, int ch)
    return JIM_ERR;
}

+
Jim_Obj *Jim_GetSourceInfo(Jim_Interp *interp, Jim_Obj *objPtr, int *lineptr)
+
{
+
    int line;
+
    Jim_Obj *fileNameObj;
+

+
    if (objPtr->typePtr == &sourceObjType) {
+
        fileNameObj = objPtr->internalRep.sourceValue.fileNameObj;
+
        line = objPtr->internalRep.sourceValue.lineNumber;
+
    }
+
    else if (objPtr->typePtr == &scriptObjType) {
+
        ScriptObj *script = JimGetScript(interp, objPtr);
+
        fileNameObj = script->fileNameObj;
+
        line = script->firstline;
+
    }
+
    else {
+
        fileNameObj = interp->emptyObj;
+
        line = 1;
+
    }
+
    *lineptr = line;
+
    return fileNameObj;
+
}
+

+
void Jim_SetSourceInfo(Jim_Interp *interp, Jim_Obj *objPtr,
+
    Jim_Obj *fileNameObj, int lineNumber)
+
{
+
    JimPanic((Jim_IsShared(objPtr), "Jim_SetSourceInfo called with shared object"));
+
    Jim_FreeIntRep(interp, objPtr);
+
    Jim_IncrRefCount(fileNameObj);
+
    objPtr->internalRep.sourceValue.fileNameObj = fileNameObj;
+
    objPtr->internalRep.sourceValue.lineNumber = lineNumber;
+
    objPtr->typePtr = &sourceObjType;
+
}
+

static void SubstObjAddTokens(Jim_Interp *interp, struct ScriptObj *script,
    ParseTokenList *tokenlist)
{
@@ -9883,12 +9995,11 @@ static void JimSetScriptFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr)
    struct JimParserCtx parser;
    struct ScriptObj *script;
    ParseTokenList tokenlist;
-
    int line = 1;
+
    Jim_Obj *fileNameObj;
+
    int line;


-
    if (objPtr->typePtr == &sourceObjType) {
-
        line = objPtr->internalRep.sourceValue.lineNumber;
-
    }
+
    fileNameObj = Jim_GetSourceInfo(interp, objPtr, &line);


    ScriptTokenListInit(&tokenlist);
@@ -9907,12 +10018,7 @@ static void JimSetScriptFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr)
    script = Jim_Alloc(sizeof(*script));
    memset(script, 0, sizeof(*script));
    script->inUse = 1;
-
    if (objPtr->typePtr == &sourceObjType) {
-
        script->fileNameObj = objPtr->internalRep.sourceValue.fileNameObj;
-
    }
-
    else {
-
        script->fileNameObj = interp->emptyObj;
-
    }
+
    script->fileNameObj = fileNameObj;
    Jim_IncrRefCount(script->fileNameObj);
    script->missing = parser.missing.ch;
    script->linenr = parser.missing.line;
@@ -11377,6 +11483,9 @@ void Jim_FreeInterp(Jim_Interp *i)
        JimFreeCallFrame(i, cf, JIM_FCF_FULL);
    }

+

+
    Jim_FreeHashTable(&i->commands);
+

    Jim_DecrRefCount(i, i->emptyObj);
    Jim_DecrRefCount(i, i->trueObj);
    Jim_DecrRefCount(i, i->falseObj);
@@ -11391,7 +11500,6 @@ void Jim_FreeInterp(Jim_Interp *i)

    Jim_InterpIncrProcEpoch(i);

-
    Jim_FreeHashTable(&i->commands);
#ifdef JIM_REFERENCES
    Jim_FreeHashTable(&i->references);
#endif
@@ -11590,16 +11698,24 @@ static void JimSetStackTrace(Jim_Interp *interp, Jim_Obj *stackTraceObj)
    interp->errorFlag = 1;
}

-
static void JimSetErrorStack(Jim_Interp *interp)
+
static void JimSetErrorStack(Jim_Interp *interp, ScriptObj *script)
{
    if (!interp->errorFlag) {
        int i;
        Jim_Obj *stackTrace = Jim_NewListObj(interp, NULL, 0);

-
        for (i = 0; i <= interp->procLevel; i++) {
-
            Jim_EvalFrame *frame = JimGetEvalFrameByProcLevel(interp, -i);
-
            if (frame) {
-
                JimAddStackFrame(interp, frame, stackTrace);
+
        if (interp->procLevel == 0 && script) {
+
            Jim_ListAppendElement(interp, stackTrace, interp->emptyObj);
+
            Jim_ListAppendElement(interp, stackTrace, script->fileNameObj);
+
            Jim_ListAppendElement(interp, stackTrace, Jim_NewIntObj(interp, script->linenr));
+
            Jim_ListAppendElement(interp, stackTrace, interp->emptyObj);
+
        }
+
        else {
+
            for (i = 0; i <= interp->procLevel; i++) {
+
                Jim_EvalFrame *frame = JimGetEvalFrameByProcLevel(interp, -i);
+
                if (frame) {
+
                    JimAddStackFrame(interp, frame, stackTrace);
+
                }
            }
        }
        JimSetStackTrace(interp, stackTrace);
@@ -12290,14 +12406,7 @@ static int SetListFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr)
    }


-
    if (objPtr->typePtr == &sourceObjType) {
-
        fileNameObj = objPtr->internalRep.sourceValue.fileNameObj;
-
        linenr = objPtr->internalRep.sourceValue.lineNumber;
-
    }
-
    else {
-
        fileNameObj = interp->emptyObj;
-
        linenr = 1;
-
    }
+
    fileNameObj = Jim_GetSourceInfo(interp, objPtr, &linenr);
    Jim_IncrRefCount(fileNameObj);


@@ -12319,7 +12428,7 @@ static int SetListFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr)
            if (parser.tt != JIM_TT_STR && parser.tt != JIM_TT_ESC)
                continue;
            elementPtr = JimParserGetTokenObj(interp, &parser);
-
            JimSetSourceInfo(interp, elementPtr, fileNameObj, parser.tline);
+
            Jim_SetSourceInfo(interp, elementPtr, fileNameObj, parser.tline);
            ListAppendElement(objPtr, elementPtr);
        }
    }
@@ -12374,7 +12483,8 @@ struct lsort_info {
        JIM_LSORT_NOCASE,
        JIM_LSORT_INTEGER,
        JIM_LSORT_REAL,
-
        JIM_LSORT_COMMAND
+
        JIM_LSORT_COMMAND,
+
        JIM_LSORT_DICT
    } type;
    int order;
    Jim_Obj **indexv;
@@ -12407,6 +12517,43 @@ static int ListSortStringNoCase(Jim_Obj **lhsObj, Jim_Obj **rhsObj)
    return Jim_StringCompareObj(sort_info->interp, *lhsObj, *rhsObj, 1) * sort_info->order;
}

+
static int ListSortDict(Jim_Obj **lhsObj, Jim_Obj **rhsObj)
+
{
+

+
    const char *left = Jim_String(*lhsObj);
+
    const char *right = Jim_String(*rhsObj);
+

+
    while (1) {
+
        if (isdigit(UCHAR(*left)) && isdigit(UCHAR(*right))) {
+

+
            jim_wide lint, rint;
+
            char *lend, *rend;
+
            lint = jim_strtoull(left, &lend);
+
            rint = jim_strtoull(right, &rend);
+
            if (lint != rint) {
+
                return JimSign(lint - rint) * sort_info->order;
+
            }
+
            if (lend -left != rend - right) {
+
                return JimSign((lend - left) - (rend - right)) * sort_info->order;
+
            }
+
            left = lend;
+
            right = rend;
+
        }
+
        else {
+
            int cl, cr;
+
            left += utf8_tounicode_case(left, &cl, 1);
+
            right += utf8_tounicode_case(right, &cr, 1);
+
            if (cl != cr) {
+
                return JimSign(cl - cr) * sort_info->order;
+
            }
+
            if (cl == 0) {
+

+
                return Jim_StringCompareObj(sort_info->interp, *lhsObj, *rhsObj, 0) * sort_info->order;
+
            }
+
        }
+
    }
+
}
+

static int ListSortInteger(Jim_Obj **lhsObj, Jim_Obj **rhsObj)
{
    jim_wide lhs = 0, rhs = 0;
@@ -12521,6 +12668,9 @@ static int ListSortElements(Jim_Interp *interp, Jim_Obj *listObjPtr, struct lsor
        case JIM_LSORT_COMMAND:
            fn = ListSortCommand;
            break;
+
        case JIM_LSORT_DICT:
+
            fn = ListSortDict;
+
            break;
        default:
            fn = NULL;
            JimPanic((1, "ListSort called with invalid sort type"));
@@ -12570,6 +12720,11 @@ static void ListInsertElements(Jim_Obj *listPtr, int idx, int elemc, Jim_Obj *co
    int i;
    Jim_Obj **point;

+
    if (elemc == 0) {
+

+
        return;
+
    }
+

    if (requiredLen > listPtr->internalRep.listValue.maxLen) {
        if (currentLen) {

@@ -14334,6 +14489,8 @@ static const struct Jim_ExprOperator Jim_ExprOperators[] = {

static int JimParseExpression(struct JimParserCtx *pc)
{
+
    pc->errmsg = NULL;
+

    while (1) {

        while (isspace(UCHAR(*pc->p)) || (*(pc->p) == '\\' && *(pc->p + 1) == '\n')) {
@@ -14384,6 +14541,7 @@ singlechar:
            else {

                if (pc->tt == JIM_TT_EXPRSUGAR) {
+
                    pc->errmsg = "nesting expr in expr is not allowed";
                    return JIM_ERR;
                }
                return JIM_OK;
@@ -14528,6 +14686,7 @@ static int JimParseExprOperator(struct JimParserCtx *pc)
            p++;
        }
        if (*p != '(') {
+
            pc->errmsg = "function requires parentheses";
            return JIM_ERR;
        }
    }
@@ -14539,31 +14698,6 @@ static int JimParseExprOperator(struct JimParserCtx *pc)
    return JIM_OK;
}

-
const char *jim_tt_name(int type)
-
{
-
    static const char * const tt_names[JIM_TT_EXPR_OP] =
-
        { "NIL", "STR", "ESC", "VAR", "ARY", "CMD", "SEP", "EOL", "EOF", "LIN", "WRD", "(((", ")))", ",,,", "INT",
-
            "DBL", "BOO", "$()" };
-
    if (type < JIM_TT_EXPR_OP) {
-
        return tt_names[type];
-
    }
-
    else if (type == JIM_EXPROP_UNARYMINUS) {
-
        return "-VE";
-
    }
-
    else if (type == JIM_EXPROP_UNARYPLUS) {
-
        return "+VE";
-
    }
-
    else {
-
        const struct Jim_ExprOperator *op = JimExprOperatorInfoByOpcode(type);
-
        static char buf[20];
-

-
        if (op->name) {
-
            return op->name;
-
        }
-
        sprintf(buf, "(%d)", type);
-
        return buf;
-
    }
-
}

static void FreeExprInternalRep(Jim_Interp *interp, Jim_Obj *objPtr);
static void DupExprInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr);
@@ -14869,7 +15003,7 @@ missingoperand:
                objPtr = Jim_NewStringObj(interp, t->token, t->len);
                if (t->type == JIM_TT_CMD) {

-
                    JimSetSourceInfo(interp, objPtr, builder->fileNameObj, t->line);
+
                    Jim_SetSourceInfo(interp, objPtr, builder->fileNameObj, t->line);
                }
            }

@@ -14967,14 +15101,7 @@ static int SetExprFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr)
    int rc = JIM_ERR;


-
    if (objPtr->typePtr == &sourceObjType) {
-
        fileNameObj = objPtr->internalRep.sourceValue.fileNameObj;
-
        line = objPtr->internalRep.sourceValue.lineNumber;
-
    }
-
    else {
-
        fileNameObj = interp->emptyObj;
-
        line = 1;
-
    }
+
    fileNameObj = Jim_GetSourceInfo(interp, objPtr, &line);
    Jim_IncrRefCount(fileNameObj);

    exprText = Jim_GetString(objPtr, &exprTextLen);
@@ -14987,6 +15114,9 @@ static int SetExprFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr)
        if (JimParseExpression(&parser) != JIM_OK) {
            ScriptTokenListFree(&tokenlist);
            Jim_SetResultFormatted(interp, "syntax error in expression: \"%#s\"", objPtr);
+
            if (parser.errmsg) {
+
                Jim_AppendStrings(interp, Jim_GetResult(interp), ": ", parser.errmsg, NULL);
+
            }
            expr = NULL;
            goto err;
        }
@@ -15006,10 +15136,17 @@ static int SetExprFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr)
    }
#endif

-
    if (JimParseCheckMissing(interp, parser.missing.ch) == JIM_ERR) {
+
    if (tokenlist.count <= 1) {
+
        Jim_SetResultString(interp, "empty expression", -1);
+
        rc = JIM_ERR;
+
    }
+
    else {
+
        rc = JimParseCheckMissing(interp, parser.missing.ch);
+
    }
+
    if (rc != JIM_OK) {
        ScriptTokenListFree(&tokenlist);
        Jim_DecrRefCount(interp, fileNameObj);
-
        return JIM_ERR;
+
        return rc;
    }


@@ -15860,13 +15997,18 @@ static int JimTraceCallback(Jim_Interp *interp, const char *type, int argc, Jim_
    Jim_Obj *nargv[7];
    Jim_Obj *traceCmdObj = interp->traceCmdObj;
    Jim_Obj *resultObj = Jim_GetResult(interp);
+
    ScriptObj *script = NULL;

-
    ScriptObj *script = JimGetScript(interp, interp->evalFrame->scriptObj);
+

+

+
    if (interp->evalFrame->scriptObj) {
+
        script = JimGetScript(interp, interp->evalFrame->scriptObj);
+
    }

    nargv[0] = traceCmdObj;
    nargv[1] = Jim_NewStringObj(interp, type, -1);
-
    nargv[2] = script->fileNameObj;
-
    nargv[3] = Jim_NewIntObj(interp, script->linenr);
+
    nargv[2] = script ? script->fileNameObj : interp->emptyObj;
+
    nargv[3] = Jim_NewIntObj(interp, script ? script->linenr : 1);
    nargv[4] = resultObj;
    nargv[5] = argv[0];
    nargv[6] = Jim_NewListObj(interp, argv + 1, argc - 1);
@@ -15988,7 +16130,7 @@ tailcall:
            retcode = cmdPtr->u.native.cmdProc(interp, objc, objv);
        }
        if (retcode == JIM_ERR) {
-
            JimSetErrorStack(interp);
+
            JimSetErrorStack(interp, NULL);
        }
    }

@@ -16023,7 +16165,7 @@ out:
    JimDecrCmdRefCount(interp, cmdPtr);

    if (retcode == JIM_ERR) {
-
        JimSetErrorStack(interp);
+
        JimSetErrorStack(interp, NULL);
    }

    if (interp->framePtr->tailcallObj) {
@@ -16045,6 +16187,7 @@ int Jim_EvalObjVector(Jim_Interp *interp, int objc, Jim_Obj *const *objv)
    for (i = 0; i < objc; i++)
        Jim_IncrRefCount(objv[i]);

+

    JimPushEvalFrame(interp, &frame, NULL);

    retcode = JimInvokeCommand(interp, objc, objv);
@@ -16183,7 +16326,9 @@ static Jim_Obj *JimInterpolateTokens(Jim_Interp *interp, const ScriptToken * tok
    }
    else if (tokens && intv[0] && intv[0]->typePtr == &sourceObjType) {

-
        JimSetSourceInfo(interp, objPtr, intv[0]->internalRep.sourceValue.fileNameObj, intv[0]->internalRep.sourceValue.lineNumber);
+
        int line;
+
        Jim_Obj *fileNameObj = Jim_GetSourceInfo(interp, intv[0], &line);
+
        Jim_SetSourceInfo(interp, objPtr, fileNameObj, line);
    }


@@ -16250,7 +16395,7 @@ int Jim_EvalObj(Jim_Interp *interp, Jim_Obj *scriptObjPtr)
    Jim_IncrRefCount(scriptObjPtr);
    script = JimGetScript(interp, scriptObjPtr);
    if (JimParseCheckMissing(interp, script->missing) == JIM_ERR) {
-
        JimSetErrorStack(interp);
+
        JimSetErrorStack(interp, script);
        Jim_DecrRefCount(interp, scriptObjPtr);
        return JIM_ERR;
    }
@@ -16422,7 +16567,7 @@ int Jim_EvalObj(Jim_Interp *interp, Jim_Obj *scriptObjPtr)


    if (retcode == JIM_ERR) {
-
        JimSetErrorStack(interp);
+
        JimSetErrorStack(interp, NULL);
    }

    JimPopEvalFrame(interp);
@@ -16650,7 +16795,7 @@ int Jim_EvalSource(Jim_Interp *interp, const char *filename, int lineno, const c
    scriptObjPtr = Jim_NewStringObj(interp, script, -1);
    Jim_IncrRefCount(scriptObjPtr);
    if (filename) {
-
        JimSetSourceInfo(interp, scriptObjPtr, Jim_NewStringObj(interp, filename, -1), lineno);
+
        Jim_SetSourceInfo(interp, scriptObjPtr, Jim_NewStringObj(interp, filename, -1), lineno);
    }
    retval = Jim_EvalObj(interp, scriptObjPtr);
    Jim_DecrRefCount(interp, scriptObjPtr);
@@ -16732,7 +16877,7 @@ int Jim_EvalFile(Jim_Interp *interp, const char *filename)
    }

    filenameObj = Jim_NewStringObj(interp, filename, -1);
-
    JimSetSourceInfo(interp, scriptObjPtr, filenameObj, 1);
+
    Jim_SetSourceInfo(interp, scriptObjPtr, filenameObj, 1);

    oldFilenameObj = JimPushInterpObj(interp->currentFilenameObj, filenameObj);

@@ -16773,7 +16918,9 @@ static void JimParseSubst(struct JimParserCtx *pc, int flags)
        }

        pc->tstart = pc->p;
-
        flags |= JIM_SUBST_NOVAR;
+

+
        pc->p++;
+
        pc->len--;
    }
    while (pc->len) {
        if (*pc->p == '$' && !(flags & JIM_SUBST_NOVAR)) {
@@ -17276,7 +17423,7 @@ static int Jim_UnsetCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *ar
static int JimCheckLoopRetcode(Jim_Interp *interp, int retval)
{
    if (retval == JIM_BREAK || retval == JIM_CONTINUE) {
-
        if (--interp->returnLevel > 0) {
+
        if (--interp->break_level > 0) {
            return 1;
        }
    }
@@ -17466,15 +17613,14 @@ static int Jim_ForCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv
    while (boolean && (retval == JIM_OK || retval == JIM_CONTINUE)) {

        retval = Jim_EvalObj(interp, argv[4]);
-

+
        if (JimCheckLoopRetcode(interp, retval)) {
+
            immediate++;
+
            break;
+
        }
        if (retval == JIM_OK || retval == JIM_CONTINUE) {

JIM_IF_OPTIM(evalnext:)
            retval = Jim_EvalObj(interp, argv[3]);
-
            if (JimCheckLoopRetcode(interp, retval)) {
-
                immediate++;
-
                goto out;
-
            }
            if (retval == JIM_OK || retval == JIM_CONTINUE) {

JIM_IF_OPTIM(testcond:)
@@ -17505,7 +17651,7 @@ static int Jim_LoopCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg
{
    int retval;
    jim_wide i;
-
    jim_wide limit;
+
    jim_wide limit = 0;
    jim_wide incr = 1;
    Jim_Obj *bodyObjPtr;

@@ -18329,17 +18475,19 @@ static int Jim_LsortCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const arg
{
    static const char * const options[] = {
        "-ascii", "-nocase", "-increasing", "-decreasing", "-command", "-integer", "-real", "-index", "-unique",
-
        "-stride", NULL
+
        "-stride", "-dictionary", NULL
    };
    enum {
        OPT_ASCII, OPT_NOCASE, OPT_INCREASING, OPT_DECREASING, OPT_COMMAND, OPT_INTEGER, OPT_REAL, OPT_INDEX, OPT_UNIQUE,
-
        OPT_STRIDE
+
        OPT_STRIDE, OPT_DICT
    };
    Jim_Obj *resObj;
    int i;
    int retCode;
    int shared;
    long stride = 1;
+
    Jim_Obj **elements;
+
    int listlen;

    struct lsort_info info;

@@ -18366,6 +18514,9 @@ wrongargs:
            case OPT_ASCII:
                info.type = JIM_LSORT_ASCII;
                break;
+
            case OPT_DICT:
+
                info.type = JIM_LSORT_DICT;
+
                break;
            case OPT_NOCASE:
                info.type = JIM_LSORT_NOCASE;
                break;
@@ -18420,13 +18571,17 @@ badindex:
        }
    }
    resObj = argv[argc - 1];
+
    JimListGetElements(interp, resObj, &listlen, &elements);
+
    if (listlen <= 1) {
+

+
        Jim_SetResult(interp, resObj);
+
        return JIM_OK;
+
    }
+

    if (stride > 1) {
        Jim_Obj *tmpListObj;
-
        Jim_Obj **elements;
-
        int listlen;
        int i;

-
        JimListGetElements(interp, resObj, &listlen, &elements);
        if (listlen % stride) {
            Jim_SetResultString(interp, "list size must be a multiple of the stride length", -1);
            return JIM_ERR;
@@ -18614,7 +18769,7 @@ static int JimBreakContinueHelper(Jim_Interp *interp, int argc, Jim_Obj *const *
        if (ret != JIM_OK) {
            return ret;
        }
-
        interp->returnLevel = level;
+
        interp->break_level = level;
    }
    return retcode;
}
@@ -20332,7 +20487,6 @@ static int Jim_InfoCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg
            return JIM_OK;

        case INFO_SOURCE:{
-
                jim_wide line;
                Jim_Obj *resObjPtr;
                Jim_Obj *fileNameObj;

@@ -20341,26 +20495,16 @@ static int Jim_InfoCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg
                    return JIM_ERR;
                }
                if (argc == 5) {
+
                    jim_wide line;
                    if (Jim_GetWide(interp, argv[4], &line) != JIM_OK) {
                        return JIM_ERR;
                    }
                    resObjPtr = Jim_NewStringObj(interp, Jim_String(argv[2]), Jim_Length(argv[2]));
-
                    JimSetSourceInfo(interp, resObjPtr, argv[3], line);
+
                    Jim_SetSourceInfo(interp, resObjPtr, argv[3], line);
                }
                else {
-
                    if (argv[2]->typePtr == &sourceObjType) {
-
                        fileNameObj = argv[2]->internalRep.sourceValue.fileNameObj;
-
                        line = argv[2]->internalRep.sourceValue.lineNumber;
-
                    }
-
                    else if (argv[2]->typePtr == &scriptObjType) {
-
                        ScriptObj *script = JimGetScript(interp, argv[2]);
-
                        fileNameObj = script->fileNameObj;
-
                        line = script->firstline;
-
                    }
-
                    else {
-
                        fileNameObj = interp->emptyObj;
-
                        line = 1;
-
                    }
+
                    int line;
+
                    fileNameObj = Jim_GetSourceInfo(interp, argv[2], &line);
                    resObjPtr = Jim_NewListObj(interp, NULL, 0);
                    Jim_ListAppendElement(interp, resObjPtr, fileNameObj);
                    Jim_ListAppendElement(interp, resObjPtr, Jim_NewIntObj(interp, line));
@@ -20819,11 +20963,12 @@ char **Jim_GetEnviron(void)
{
#if defined(HAVE__NSGETENVIRON)
    return *_NSGetEnviron();
+
#elif defined(_environ)
+
    return _environ;
#else
    #if !defined(NO_ENVIRON_EXTERN)
    extern char **environ;
    #endif
-

    return environ;
#endif
}
@@ -20832,6 +20977,8 @@ void Jim_SetEnviron(char **env)
{
#if defined(HAVE__NSGETENVIRON)
    *_NSGetEnviron() = env;
+
#elif defined(_environ)
+
    _environ = env;
#else
    #if !defined(NO_ENVIRON_EXTERN)
    extern char **environ;
@@ -23450,7 +23597,7 @@ void Jim_SetResultErrno(Jim_Interp *interp, const char *msg)
    Jim_SetResultFormatted(interp, "%s: %s", msg, strerror(Jim_Errno()));
}

-
#if defined(__MINGW32__)
+
#if defined(_WIN32) || defined(WIN32)
#include <sys/stat.h>

int Jim_Errno(void)
@@ -23646,7 +23793,9 @@ int Jim_MakeTempFile(Jim_Interp *interp, const char *filename_template, int unli
    }


+
#ifdef HAVE_UMASK
    mask = umask(S_IXUSR | S_IRWXG | S_IRWXO);
+
#endif
#ifdef HAVE_MKSTEMP
    fd = mkstemp(filenameObj->bytes);
#else
@@ -23657,7 +23806,9 @@ int Jim_MakeTempFile(Jim_Interp *interp, const char *filename_template, int unli
        fd = open(filenameObj->bytes, O_RDWR | O_CREAT | O_TRUNC);
    }
#endif
+
#ifdef HAVE_UMASK
    umask(mask);
+
#endif
    if (fd < 0) {
        Jim_SetResultErrno(interp, Jim_String(filenameObj));
        Jim_FreeNewObj(interp, filenameObj);
@@ -24260,6 +24411,11 @@ int main(int argc, char *const argv[])

    Jim_SetVariableStrWithStr(interp, "jim::argv0", orig_argv0);
    Jim_SetVariableStrWithStr(interp, JIM_INTERACTIVE, argc == 1 ? "1" : "0");
+
#ifdef USE_LINENOISE
+
    Jim_SetVariableStrWithStr(interp, "jim::lineedit", "1");
+
#else
+
    Jim_SetVariableStrWithStr(interp, "jim::lineedit", "0");
+
#endif
    retcode = Jim_initjimshInit(interp);

    if (argc == 1) {