Imported Upstream version 1.11
[platform/upstream/gdbm.git] / tests / testsuite
index 96ee5f9..11117ab 100755 (executable)
@@ -1,17 +1,17 @@
 #! /bin/sh
-# Generated from testsuite.at by GNU Autoconf 2.63.
+# Generated from testsuite.at by GNU Autoconf 2.69.
+#
+# Copyright (C) 2009-2012 Free Software Foundation, Inc.
 #
-# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
-# Free Software Foundation, Inc.
 # This test suite is free software; the Free Software Foundation gives
 # unlimited permission to copy, distribute and modify it.
-## --------------------- ##
-## M4sh Initialization.  ##
-## --------------------- ##
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
 
 # Be more Bourne compatible
 DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
   emulate sh
   NULLCMD=:
   # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
@@ -19,23 +19,15 @@ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
   alias -g '${1+"$@"}'='"$@"'
   setopt NO_GLOB_SUBST
 else
-  case `(set -o) 2>/dev/null` in
-  *posix*) set -o posix ;;
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
 esac
-
 fi
 
 
-
-
-# PATH needs CR
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
 as_nl='
 '
 export as_nl
@@ -43,7 +35,13 @@ export as_nl
 as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
 as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
 as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
   as_echo='printf %s\n'
   as_echo_n='printf %s'
 else
@@ -54,7 +52,7 @@ else
     as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
     as_echo_n_body='eval
       arg=$1;
-      case $arg in
+      case $arg in #(
       *"$as_nl"*)
        expr "X$arg" : "X\\(.*\\)$as_nl";
        arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
@@ -77,13 +75,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
   }
 fi
 
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  as_unset=unset
-else
-  as_unset=false
-fi
-
 
 # IFS
 # We need space, tab and new line, in precisely that order.  Quoting is
@@ -93,15 +84,16 @@ fi
 IFS=" ""       $as_nl"
 
 # Find who we are.  Look in the path if we contain no directory separator.
-case $0 in
+as_myself=
+case $0 in #((
   *[\\/]* ) as_myself=$0 ;;
   *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-done
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
 IFS=$as_save_IFS
 
      ;;
@@ -113,12 +105,16 @@ if test "x$as_myself" = x; then
 fi
 if test ! -f "$as_myself"; then
   $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  { (exit 1); exit 1; }
+  exit 1
 fi
 
-# Work around bugs in pre-3.0 UWIN ksh.
-for as_var in ENV MAIL MAILPATH
-do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
 done
 PS1='$ '
 PS2='> '
@@ -130,330 +126,319 @@ export LC_ALL
 LANGUAGE=C
 export LANGUAGE
 
-# Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-
-# Name of the executable.
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-        X"$0" : 'X\(//\)$' \| \
-        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{
-           s//\1/
-           q
-         }
-         /^X\/\(\/\/\)$/{
-           s//\1/
-           q
-         }
-         /^X\/\(\/\).*/{
-           s//\1/
-           q
-         }
-         s/.*/./; q'`
-
 # CDPATH.
-$as_unset CDPATH
-
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
 if test "x$CONFIG_SHELL" = x; then
-  if (eval ":") 2>/dev/null; then
-  as_have_required=yes
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
 else
-  as_have_required=no
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
 fi
-
-  if test $as_have_required = yes &&    (eval ":
-(as_func_return () {
-  (exit \$1)
-}
-as_func_success () {
-  as_func_return 0
-}
-as_func_failure () {
-  as_func_return 1
-}
-as_func_ret_success () {
-  return 0
-}
-as_func_ret_failure () {
-  return 1
-}
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
 
 exitcode=0
-if as_func_success; then
-  :
-else
-  exitcode=1
-  echo as_func_success failed.
-fi
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
 
-if as_func_failure; then
-  exitcode=1
-  echo as_func_failure succeeded.
-fi
-
-if as_func_ret_success; then
-  :
 else
-  exitcode=1
-  echo as_func_ret_success failed.
-fi
-
-if as_func_ret_failure; then
-  exitcode=1
-  echo as_func_ret_failure succeeded.
-fi
-
-if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
-  :
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
 else
-  exitcode=1
-  echo positional parameters were not saved.
+  as_have_required=no
 fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
 
-test \$exitcode = 0) || { (exit 1); exit 1; }
-
-(
-  as_lineno_1=\$LINENO
-  as_lineno_2=\$LINENO
-  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
-  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
-") 2> /dev/null; then
-  :
 else
-  as_candidate_shells=
-    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
 for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  case $as_dir in
+  as_found=:
+  case $as_dir in #(
         /*)
           for as_base in sh bash ksh sh5; do
-            as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+            # Try only shells that exist, to save several forks.
+            as_shell=$as_dir/$as_base
+            if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+                   { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+                  if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
           done;;
        esac
+  as_found=false
 done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+             { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
 IFS=$as_save_IFS
 
 
-      for as_shell in $as_candidate_shells $SHELL; do
-        # Try only shells that exist, to save several forks.
-        if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
-               { ("$as_shell") 2> /dev/null <<\_ASEOF
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in
-  *posix*) set -o posix ;;
-esac
-
-fi
-
-
-:
-_ASEOF
-}; then
-  CONFIG_SHELL=$as_shell
-              as_have_required=yes
-              if { "$as_shell" 2> /dev/null <<\_ASEOF
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in
-  *posix*) set -o posix ;;
+      if test "x$CONFIG_SHELL" != x; then :
+  export CONFIG_SHELL
+             # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
 esac
-
-fi
-
-
-:
-(as_func_return () {
-  (exit $1)
-}
-as_func_success () {
-  as_func_return 0
-}
-as_func_failure () {
-  as_func_return 1
-}
-as_func_ret_success () {
-  return 0
-}
-as_func_ret_failure () {
-  return 1
-}
-
-exitcode=0
-if as_func_success; then
-  :
-else
-  exitcode=1
-  echo as_func_success failed.
-fi
-
-if as_func_failure; then
-  exitcode=1
-  echo as_func_failure succeeded.
-fi
-
-if as_func_ret_success; then
-  :
-else
-  exitcode=1
-  echo as_func_ret_success failed.
-fi
-
-if as_func_ret_failure; then
-  exitcode=1
-  echo as_func_ret_failure succeeded.
-fi
-
-if ( set x; as_func_ret_success y && test x = "$1" ); then
-  :
-else
-  exitcode=1
-  echo positional parameters were not saved.
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+  fi
+  exit 1
 fi
-
-test $exitcode = 0) || { (exit 1); exit 1; }
-
-(
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
-
-_ASEOF
-}; then
-  break
 fi
-
 fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
 
-      done
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
 
-      if test "x$CONFIG_SHELL" != x; then
-  for as_var in BASH_ENV ENV
-       do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
-       done
-       export CONFIG_SHELL
-       exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
-fi
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
 
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
 
-    if test $as_have_required = no; then
-  echo This script requires a shell more modern than all the
-      echo shells that I found on your system.  Please install a
-      echo modern shell, or manually run the script under such a
-      echo shell if you do have one.
-      { (exit 1); exit 1; }
-fi
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
 
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
 
-fi
 
-fi
+} # as_fn_mkdir_p
 
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
 
 
-(eval "as_func_return () {
-  (exit \$1)
-}
-as_func_success () {
-  as_func_return 0
-}
-as_func_failure () {
-  as_func_return 1
-}
-as_func_ret_success () {
-  return 0
-}
-as_func_ret_failure () {
-  return 1
-}
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
 
-exitcode=0
-if as_func_success; then
-  :
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
 else
-  exitcode=1
-  echo as_func_success failed.
-fi
-
-if as_func_failure; then
-  exitcode=1
-  echo as_func_failure succeeded.
+  as_expr=false
 fi
 
-if as_func_ret_success; then
-  :
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
 else
-  exitcode=1
-  echo as_func_ret_success failed.
+  as_basename=false
 fi
 
-if as_func_ret_failure; then
-  exitcode=1
-  echo as_func_ret_failure succeeded.
-fi
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
 
-if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
-  :
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
 else
-  exitcode=1
-  echo positional parameters were not saved.
+  as_dirname=false
 fi
 
-test \$exitcode = 0") || {
-  echo No shell found that supports shell functions.
-  echo Please tell bug-autoconf@gnu.org about your system,
-  echo including any error possibly output before this message.
-  echo This can help us improve future autoconf versions.
-  echo Configuration will now proceed without shell functions.
-}
-
-
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
 
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
 
-  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
-  # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line after each line using $LINENO; the second 'sed'
-  # does the real work.  The second script uses 'N' to pair each
-  # line-number line with the line containing $LINENO, and appends
-  # trailing '-' during substitution so that $LINENO is not a special
-  # case at line end.
-  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # scripts with optimization help from Paolo Bonzini.  Blame Lee
-  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
   sed -n '
     p
     /[$]LINENO/=
@@ -470,10 +455,12 @@ test \$exitcode = 0") || {
       s/-\n.*//
     ' >$as_me.lineno &&
   chmod +x "$as_me.lineno" ||
-    { { $as_echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
-$as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
-   { (exit 1); exit 1; }; }
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
 
+  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+  # already done that, so ensure we don't try to do so again and fall
+  # in an infinite loop.  This has already happened in practice.
+  _as_can_reexec=no; export _as_can_reexec
   # Don't try to exec as it changes $[0], causing all sort of problems
   # (the dirname of $[0] is not the place where we might find the
   # original and so on.  Autoconf is especially sensitive to this).
@@ -482,29 +469,18 @@ $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell"
   exit
 }
 
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
-
 ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in
+case `echo -n x` in #(((((
 -n*)
-  case `echo 'x\c'` in
+  case `echo 'xy\c'` in
   *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
-  *)   ECHO_C='\c';;
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='        ';;
   esac;;
 *)
   ECHO_N='-n';;
 esac
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
 
 rm -f conf$$ conf$$.exe conf$$.file
 if test -d conf$$.dir; then
@@ -519,49 +495,29 @@ if (echo >conf$$.file) 2>/dev/null; then
     # ... but there are two gotchas:
     # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
     # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
+    # In both cases, we have to default to `cp -pR'.
     ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
+      as_ln_s='cp -pR'
   elif ln conf$$.file conf$$ 2>/dev/null; then
     as_ln_s=ln
   else
-    as_ln_s='cp -p'
+    as_ln_s='cp -pR'
   fi
 else
-  as_ln_s='cp -p'
+  as_ln_s='cp -pR'
 fi
 rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
 rmdir conf$$.dir 2>/dev/null
 
 if mkdir -p . 2>/dev/null; then
-  as_mkdir_p=:
+  as_mkdir_p='mkdir -p "$as_dir"'
 else
   test -d ./-p && rmdir ./-p
   as_mkdir_p=false
 fi
 
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-       test -d "$1/.";
-      else
-       case $1 in
-       -*)set "./$1";;
-       esac;
-       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
-       ???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
 
 # Sed expression to map a string onto a valid CPP name.
 as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -591,6 +547,11 @@ at_errexit_p=false
 # Shall we be verbose?  ':' means no, empty means yes.
 at_verbose=:
 at_quiet=
+# Running several jobs in parallel, 0 means as many as test groups.
+at_jobs=1
+at_traceon=:
+at_trace_echo=:
+at_check_filter_trace=:
 
 # Shall we keep the debug scripts?  Must be `:' when the suite is
 # run by a debug script, so that the script doesn't remove itself.
@@ -605,6 +566,8 @@ at_list_p=false
 at_clean=false
 # Test groups to run
 at_groups=
+# Whether to rerun failed tests.
+at_recheck=
 # Whether a write failure occurred
 at_write_fail=0
 
@@ -618,10 +581,10 @@ esac
 # Whether -C is in effect.
 at_change_dir=false
 
+# Whether to enable colored test results.
+at_color=no
 # List of the tested programs.
 at_tested=''
-# List of the all the test groups.
-at_groups_all=' 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22'
 # As many question marks as there are digits in the last test group number.
 # Used to normalize the test group numbers so that `ls' lists them in
 # numerical order.
@@ -650,12 +613,14 @@ at_help_all="1;version.at:17;gdbm version;;
 21;cloexec02.at:17;cloexec: dbm_open;ndbm dbm_open cloexec cloexec02;
 22;cloexec03.at:17;cloexec: dbm_open -creat;ndbm dbm_open cloexec cloexec03;
 "
+# List of the all the test groups.
+at_groups_all=`$as_echo "$at_help_all" | sed 's/;.*//'`
 
-# at_func_validate_ranges [NAME...]
-# ---------------------------------
-# Validate and normalize the test group number contained in each
-# variable NAME.  Leading zeroes are treated as decimal.
-at_func_validate_ranges ()
+# at_fn_validate_ranges NAME...
+# -----------------------------
+# Validate and normalize the test group number contained in each variable
+# NAME. Leading zeroes are treated as decimal.
+at_fn_validate_ranges ()
 {
   for at_grp
   do
@@ -666,7 +631,7 @@ at_func_validate_ranges ()
     fi
     case $at_value in
       0*) # We want to treat leading 0 as decimal, like expr and test, but
-         # at_func_arith treats it as octal if it uses $(( )).
+         # AS_VAR_ARITH treats it as octal if it uses $(( )).
          # With XSI shells, ${at_value#${at_value%%[1-9]*}} avoids the
          # expr fork, but it is not worth the effort to determine if the
          # shell supports XSI when the user can just avoid leading 0.
@@ -685,8 +650,8 @@ do
   fi
 
   case $at_option in
-  *=*) at_optarg=`expr "x$at_option" : 'x[^=]*=\(.*\)'` ;;
-  *)   at_optarg= ;;
+  *=?*) at_optarg=`expr "X$at_option" : '[^=]*=\(.*\)'` ;;
+  *)    at_optarg= ;;
   esac
 
   # Accept the important Cygnus configure options, so we can diagnose typos.
@@ -708,6 +673,19 @@ do
        at_clean=:
        ;;
 
+    --color )
+       at_color=always
+       ;;
+    --color=* )
+       case $at_optarg in
+       no | never | none) at_color=never ;;
+       auto | tty | if-tty) at_color=auto ;;
+       always | yes | force) at_color=always ;;
+       *) at_optname=`echo " $at_option" | sed 's/^ //; s/=.*//'`
+          as_fn_error $? "unrecognized argument to $at_optname: $at_optarg" ;;
+       esac
+       ;;
+
     --debug | -d )
        at_debug_p=:
        ;;
@@ -722,29 +700,31 @@ do
        ;;
 
     --trace | -x )
-       at_traceon='set -x'; at_traceoff='set +x'
+       at_traceon='set -x'
+       at_trace_echo=echo
+       at_check_filter_trace=at_fn_filter_trace
        ;;
 
     [0-9] | [0-9][0-9] | [0-9][0-9][0-9] | [0-9][0-9][0-9][0-9])
-       at_func_validate_ranges at_option
-       at_groups="$at_groups$at_option "
+       at_fn_validate_ranges at_option
+       as_fn_append at_groups "$at_option$as_nl"
        ;;
 
     # Ranges
     [0-9]- | [0-9][0-9]- | [0-9][0-9][0-9]- | [0-9][0-9][0-9][0-9]-)
        at_range_start=`echo $at_option |tr -d X-`
-       at_func_validate_ranges at_range_start
-       at_range=`$as_echo " $at_groups_all " | \
-         sed -e 's/^.* \('$at_range_start' \)/\1/'`
-       at_groups="$at_groups$at_range "
+       at_fn_validate_ranges at_range_start
+       at_range=`$as_echo "$at_groups_all" | \
+         sed -ne '/^'$at_range_start'$/,$p'`
+       as_fn_append at_groups "$at_range$as_nl"
        ;;
 
     -[0-9] | -[0-9][0-9] | -[0-9][0-9][0-9] | -[0-9][0-9][0-9][0-9])
        at_range_end=`echo $at_option |tr -d X-`
-       at_func_validate_ranges at_range_end
-       at_range=`$as_echo " $at_groups_all " | \
-         sed -e 's/\( '$at_range_end'\) .*$/\1/'`
-       at_groups="$at_groups$at_range "
+       at_fn_validate_ranges at_range_end
+       at_range=`$as_echo "$at_groups_all" | \
+         sed -ne '1,/^'$at_range_end'$/p'`
+       as_fn_append at_groups "$at_range$as_nl"
        ;;
 
     [0-9]-[0-9] | [0-9]-[0-9][0-9] | [0-9]-[0-9][0-9][0-9] | \
@@ -760,11 +740,10 @@ do
          at_range_end=$at_range_start
          at_range_start=$at_tmp
        fi
-       at_func_validate_ranges at_range_start at_range_end
-       at_range=`$as_echo " $at_groups_all " | \
-         sed -e 's/^.*\( '$at_range_start' \)/\1/' \
-             -e 's/\( '$at_range_end'\) .*$/\1/'`
-       at_groups="$at_groups$at_range "
+       at_fn_validate_ranges at_range_start at_range_end
+       at_range=`$as_echo "$at_groups_all" | \
+         sed -ne '/^'$at_range_start'$/,/^'$at_range_end'$/p'`
+       as_fn_append at_groups "$at_range$as_nl"
        ;;
 
     # Directory selection.
@@ -774,6 +753,25 @@ do
     --directory=* )
        at_change_dir=:
        at_dir=$at_optarg
+       if test x- = "x$at_dir" ; then
+         at_dir=./-
+       fi
+       ;;
+
+    # Parallel execution.
+    --jobs | -j )
+       at_jobs=0
+       ;;
+    --jobs=* | -j[0-9]* )
+       if test -n "$at_optarg"; then
+         at_jobs=$at_optarg
+       else
+         at_jobs=`expr X$at_option : 'X-j\(.*\)'`
+       fi
+       case $at_jobs in *[!0-9]*)
+         at_optname=`echo " $at_option" | sed 's/^ //; s/[0-9=].*//'`
+         as_fn_error $? "non-numeric argument to $at_optname: $at_jobs" ;;
+       esac
        ;;
 
     # Keywords.
@@ -800,11 +798,12 @@ do
          at_groups_selected=`$as_echo "$at_groups_selected" |
              grep -i $at_invert "^[1-9][^;]*;.*[; ]$at_keyword[ ;]"`
        done
-       # Smash the newlines.
-       at_groups_selected=`$as_echo "$at_groups_selected" | sed 's/;.*//' |
-         tr "$as_nl" ' '
-       `
-       at_groups="$at_groups$at_groups_selected "
+       # Smash the keywords.
+       at_groups_selected=`$as_echo "$at_groups_selected" | sed 's/;.*//'`
+       as_fn_append at_groups "$at_groups_selected$as_nl"
+       ;;
+    --recheck)
+       at_recheck=:
        ;;
 
     *=*)
@@ -812,14 +811,12 @@ do
        # Reject names that are not valid shell variable names.
        case $at_envvar in
          '' | [0-9]* | *[!_$as_cr_alnum]* )
-           { { $as_echo "$as_me:$LINENO: error: invalid variable name: $at_envvar" >&5
-$as_echo "$as_me: error: invalid variable name: $at_envvar" >&2;}
-   { (exit 1); exit 1; }; } ;;
+           as_fn_error $? "invalid variable name: \`$at_envvar'" ;;
        esac
        at_value=`$as_echo "$at_optarg" | sed "s/'/'\\\\\\\\''/g"`
        # Export now, but save eval for later and for debug scripts.
        export $at_envvar
-       at_debug_args="$at_debug_args $at_envvar='$at_value'"
+       as_fn_append at_debug_args " $at_envvar='$at_value'"
        ;;
 
      *) $as_echo "$as_me: invalid option: $at_option" >&2
@@ -830,19 +827,42 @@ $as_echo "$as_me: error: invalid variable name: $at_envvar" >&2;}
 done
 
 # Verify our last option didn't require an argument
-if test -n "$at_prev"; then
-  { { $as_echo "$as_me:$LINENO: error: \`$at_prev' requires an argument." >&5
-$as_echo "$as_me: error: \`$at_prev' requires an argument." >&2;}
-   { (exit 1); exit 1; }; }
+if test -n "$at_prev"; then :
+  as_fn_error $? "\`$at_prev' requires an argument"
 fi
 
+# The file containing the suite.
+at_suite_log=$at_dir/$as_me.log
 
 # Selected test groups.
-if test -z "$at_groups"; then
+if test -z "$at_groups$at_recheck"; then
   at_groups=$at_groups_all
 else
+  if test -n "$at_recheck" && test -r "$at_suite_log"; then
+    at_oldfails=`sed -n '
+      /^Failed tests:$/,/^Skipped tests:$/{
+       s/^[ ]*\([1-9][0-9]*\):.*/\1/p
+      }
+      /^Unexpected passes:$/,/^## Detailed failed tests/{
+       s/^[ ]*\([1-9][0-9]*\):.*/\1/p
+      }
+      /^## Detailed failed tests/q
+      ' "$at_suite_log"`
+    as_fn_append at_groups "$at_oldfails$as_nl"
+  fi
   # Sort the tests, removing duplicates.
-  at_groups=`$as_echo "$at_groups" | tr ' ' "$as_nl" | sort -nu`
+  at_groups=`$as_echo "$at_groups" | sort -nu | sed '/^$/d'`
+fi
+
+if test x"$at_color" = xalways \
+   || { test x"$at_color" = xauto && test -t 1; }; then
+  at_red=`printf '\033[0;31m'`
+  at_grn=`printf '\033[0;32m'`
+  at_lgn=`printf '\033[1;32m'`
+  at_blu=`printf '\033[1;34m'`
+  at_std=`printf '\033[m'`
+else
+  at_red= at_grn= at_lgn= at_blu= at_std=
 fi
 
 # Help message.
@@ -853,16 +873,17 @@ Usage: $0 [OPTION]... [VARIABLE=VALUE]... [TESTS]
 Run all the tests, or the selected TESTS, given by numeric ranges, and
 save a detailed log file.  Upon failure, create debugging scripts.
 
-You should not change environment variables unless explicitly passed
-as command line arguments.  Set \`AUTOTEST_PATH' to select the executables
+Do not change environment variables directly.  Instead, set them via
+command line arguments.  Set \`AUTOTEST_PATH' to select the executables
 to exercise.  Each relative directory is expanded as build and source
-directories relatively to the top level of this distribution.  E.g.,
+directories relative to the top level of this distribution.
+E.g., from within the build directory /tmp/foo-1.0, invoking this:
 
   $ $0 AUTOTEST_PATH=bin
 
-possibly amounts into
+is equivalent to the following, assuming the source directory is /src/foo-1.0:
 
-  PATH=/tmp/foo-1.0/bin:/src/foo-1.0/bin:\$PATH
+  PATH=/tmp/foo-1.0/bin:/src/foo-1.0/bin:\$PATH $0
 _ATEOF
 cat <<_ATEOF || at_write_fail=1
 
@@ -877,9 +898,14 @@ cat <<_ATEOF || at_write_fail=1
 Execution tuning:
   -C, --directory=DIR
                  change to directory DIR before starting
+      --color[=never|auto|always]
+                 enable colored test results on terminal, or always
+  -j, --jobs[=N]
+                 Allow N jobs at once; infinite jobs with no arg (default 1)
   -k, --keywords=KEYWORDS
                  select the tests matching all the comma-separated KEYWORDS
                  multiple \`-k' accumulate; prefixed \`!' negates a KEYWORD
+      --recheck  select all tests that failed or passed unexpectedly last time
   -e, --errexit  abort as soon as a test fails; implies --debug
   -v, --verbose  force more detailed output
                  default for debugging scripts
@@ -897,54 +923,64 @@ fi
 # List of tests.
 if $at_list_p; then
   cat <<_ATEOF || at_write_fail=1
-gdbm 1.10 test suite test groups:
+gdbm 1.11 test suite test groups:
 
  NUM: FILE-NAME:LINE     TEST-GROUP-NAME
       KEYWORDS
 
 _ATEOF
-  # Passing at_groups is tricky.  We cannot use it to form a literal string
-  # or regexp because of the limitation of AIX awk.  And Solaris' awk
-  # doesn't grok more than 99 fields in a record, so we have to use `split'.
-  # at_groups needs to be space-separated for this script to work.
-  case $at_groups in
-    *"$as_nl"* )
-      at_groups=`$as_echo "$at_groups" | tr "$as_nl" ' '` ;;
-  esac
-  $as_echo "$at_groups$as_nl$at_help_all" |
-    awk 'BEGIN { FS = ";" }
-        NR == 1 {
-          for (n = split($ 0, a, " "); n; n--) selected[a[n]] = 1
+  # Pass an empty line as separator between selected groups and help.
+  $as_echo "$at_groups$as_nl$as_nl$at_help_all" |
+    awk 'NF == 1 && FS != ";" {
+          selected[$ 1] = 1
           next
         }
-        {
+        /^$/ { FS = ";" }
+        NF > 0 {
           if (selected[$ 1]) {
             printf " %3d: %-18s %s\n", $ 1, $ 2, $ 3
-            if ($ 4) printf "      %s\n", $ 4
+            if ($ 4) {
+              lmax = 79
+              indent = "     "
+              line = indent
+              len = length (line)
+              n = split ($ 4, a, " ")
+              for (i = 1; i <= n; i++) {
+                l = length (a[i]) + 1
+                if (i > 1 && len + l > lmax) {
+                  print line
+                  line = indent " " a[i]
+                  len = length (line)
+                } else {
+                  line = line " " a[i]
+                  len += l
+                }
+              }
+              if (n)
+                print line
+            }
           }
         }' || at_write_fail=1
   exit $at_write_fail
 fi
 if $at_version_p; then
-  $as_echo "$as_me (gdbm 1.10)" &&
-  cat <<\_ACEOF || at_write_fail=1
+  $as_echo "$as_me (gdbm 1.11)" &&
+  cat <<\_ATEOF || at_write_fail=1
 
-Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
-Free Software Foundation, Inc.
+Copyright (C) 2012 Free Software Foundation, Inc.
 This test suite is free software; the Free Software Foundation gives
 unlimited permission to copy, distribute and modify it.
-_ACEOF
+_ATEOF
   exit $at_write_fail
 fi
 
-# Should we print banners?  at_groups is space-separated for entire test,
-# newline-separated if only a subset of the testsuite is run.
-case $at_groups in
-  *' '*' '* | *"$as_nl"*"$as_nl"* )
-      at_print_banners=: ;;
+# Should we print banners?  Yes if more than one test is run.
+case $at_groups in #(
+  *$as_nl* )
+      at_print_banners=: ;; #(
   * ) at_print_banners=false ;;
 esac
-# Text for banner N, set to empty once printed.
+# Text for banner N, set to a single space once printed.
 # Banner 1. testsuite.at:35
 # Category starts at test group 2.
 at_banner_text_1="GDBM interface"
@@ -960,13 +996,8 @@ at_banner_text_4="Cloexec"
 
 # Take any -C into account.
 if $at_change_dir ; then
-  if test x- = "x$at_dir" ; then
-    at_dir=./-
-  fi
   test x != "x$at_dir" && cd "$at_dir" \
-    || { { $as_echo "$as_me:$LINENO: error: unable to change directory" >&5
-$as_echo "$as_me: error: unable to change directory" >&2;}
-   { (exit 1); exit 1; }; }
+    || as_fn_error $? "unable to change directory"
   at_dir=`pwd`
 fi
 
@@ -974,13 +1005,11 @@ fi
 for at_file in atconfig atlocal
 do
   test -r $at_file || continue
-  . ./$at_file || { { $as_echo "$as_me:$LINENO: error: invalid content: $at_file" >&5
-$as_echo "$as_me: error: invalid content: $at_file" >&2;}
-   { (exit 1); exit 1; }; }
+  . ./$at_file || as_fn_error $? "invalid content: $at_file"
 done
 
 # Autoconf <=2.59b set at_top_builddir instead of at_top_build_prefix:
-: ${at_top_build_prefix=$at_top_builddir}
+: "${at_top_build_prefix=$at_top_builddir}"
 
 # Perform any assignments requested during argument parsing.
 eval "$at_debug_args"
@@ -991,8 +1020,7 @@ if test -n "$at_top_srcdir"; then
   builddir=../..
   for at_dir_var in srcdir top_srcdir top_build_prefix
   do
-    at_val=`eval 'as_val=${'at_$at_dir_var'}
-                $as_echo "$as_val"'`
+    eval at_val=\$at_$at_dir_var
     case $at_val in
       [\\/$]* | ?:[\\/]* ) at_prefix= ;;
       *) at_prefix=../../ ;;
@@ -1001,9 +1029,9 @@ if test -n "$at_top_srcdir"; then
   done
 fi
 
-## ------------------- ##
-## Directory structure ##
-## ------------------- ##
+## -------------------- ##
+## Directory structure. ##
+## -------------------- ##
 
 # This is the set of directories and files used by this script
 # (non-literals are capitalized):
@@ -1034,12 +1062,14 @@ fi
 # The directory the whole suite works in.
 # Should be absolute to let the user `cd' at will.
 at_suite_dir=$at_dir/$as_me.dir
-# The file containing the suite.
+# The file containing the suite ($at_dir might have changed since earlier).
 at_suite_log=$at_dir/$as_me.log
 # The directory containing helper files per test group.
 at_helper_dir=$at_suite_dir/at-groups
 # Stop file: if it exists, do not start new jobs.
 at_stop_file=$at_suite_dir/at-stop
+# The fifo used for the job dispatcher.
+at_job_fifo=$at_suite_dir/at-job-fifo
 
 if $at_clean; then
   test -d "$at_suite_dir" &&
@@ -1063,23 +1093,23 @@ for as_dir in $AUTOTEST_PATH $PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  test -n "$at_path" && at_path=$at_path$PATH_SEPARATOR
+    test -n "$at_path" && as_fn_append at_path $PATH_SEPARATOR
 case $as_dir in
   [\\/]* | ?:[\\/]* )
-    at_path=$at_path$as_dir
+    as_fn_append at_path "$as_dir"
     ;;
   * )
     if test -z "$at_top_build_prefix"; then
       # Stand-alone test suite.
-      at_path=$at_path$as_dir
+      as_fn_append at_path "$as_dir"
     else
       # Embedded test suite.
-      at_path=$at_path$at_top_build_prefix$as_dir$PATH_SEPARATOR
-      at_path=$at_path$at_top_srcdir/$as_dir
+      as_fn_append at_path "$at_top_build_prefix$as_dir$PATH_SEPARATOR"
+      as_fn_append at_path "$at_top_srcdir/$as_dir"
     fi
     ;;
 esac
-done
+  done
 IFS=$as_save_IFS
 
 
@@ -1093,7 +1123,7 @@ for as_dir in $at_path
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  test -d "$as_dir" || continue
+    test -d "$as_dir" || continue
 case $as_dir in
   [\\/]* | ?:[\\/]* ) ;;
   * ) as_dir=`(cd "$as_dir" && pwd) 2>/dev/null` ;;
@@ -1101,15 +1131,18 @@ esac
 case $PATH_SEPARATOR$at_new_path$PATH_SEPARATOR in
   *$PATH_SEPARATOR$as_dir$PATH_SEPARATOR*) ;;
   $PATH_SEPARATOR$PATH_SEPARATOR) at_new_path=$as_dir ;;
-  *) at_new_path=$at_new_path$PATH_SEPARATOR$as_dir ;;
+  *) as_fn_append at_new_path "$PATH_SEPARATOR$as_dir" ;;
 esac
-done
+  done
 IFS=$as_save_IFS
 
 PATH=$at_new_path
 export PATH
 
 # Setting up the FDs.
+
+
+
 # 5 is the log file.  Not to be overwritten if `-d'.
 if $at_debug_p; then
   at_suite_log=/dev/null
@@ -1119,43 +1152,28 @@ fi
 exec 5>>"$at_suite_log"
 
 # Banners and logs.
-cat <<\_ASBOX
-## --------------------- ##
-## gdbm 1.10 test suite. ##
-## --------------------- ##
-_ASBOX
+$as_echo "## --------------------- ##
+## gdbm 1.11 test suite. ##
+## --------------------- ##"
 {
-  cat <<\_ASBOX
-## --------------------- ##
-## gdbm 1.10 test suite. ##
-## --------------------- ##
-_ASBOX
+  $as_echo "## --------------------- ##
+## gdbm 1.11 test suite. ##
+## --------------------- ##"
   echo
 
   $as_echo "$as_me: command line was:"
   $as_echo "  \$ $0 $at_cli_args"
   echo
 
-  # Try to find a few ChangeLogs in case it might help determining the
-  # exact version.  Use the relative dir: if the top dir is a symlink,
-  # find will not follow it (and options to follow the links are not
-  # portable), which would result in no output here.  Prune directories
-  # matching the package tarname, since they tend to be leftovers from
-  # `make dist' or `make distcheck' and contain redundant or stale logs.
-  if test -n "$at_top_srcdir"; then
-    cat <<\_ASBOX
-## ----------- ##
-## ChangeLogs. ##
-## ----------- ##
-_ASBOX
+  # If ChangeLog exists, list a few lines in case it might help determining
+  # the exact version.
+  if test -n "$at_top_srcdir" && test -f "$at_top_srcdir/ChangeLog"; then
+    $as_echo "## ---------- ##
+## ChangeLog. ##
+## ---------- ##"
+    echo
+    sed 's/^/| /;10q' "$at_top_srcdir/ChangeLog"
     echo
-    for at_file in `find "$at_top_srcdir" -name "gdbm-*" -prune -o -name ChangeLog -print`
-    do
-      $as_echo "$as_me: $at_file:"
-      sed 's/^/| /;10q' $at_file
-      echo
-    done
-
   fi
 
   {
@@ -1188,8 +1206,8 @@ for as_dir in $PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  $as_echo "PATH: $as_dir"
-done
+    $as_echo "PATH: $as_dir"
+  done
 IFS=$as_save_IFS
 
 }
@@ -1206,53 +1224,80 @@ IFS=$as_save_IFS
 } >&5
 
 
-## --------------- ##
-## Shell functions ##
-## --------------- ##
+## ------------------------- ##
+## Autotest shell functions. ##
+## ------------------------- ##
 
-# at_func_banner NUMBER
-# ---------------------
-# Output banner NUMBER, provided the testsuite is running multiple groups
-# and this particular banner has not yet been printed.
-at_func_banner ()
+# at_fn_banner NUMBER
+# -------------------
+# Output banner NUMBER, provided the testsuite is running multiple groups and
+# this particular banner has not yet been printed.
+at_fn_banner ()
 {
   $at_print_banners || return 0
   eval at_banner_text=\$at_banner_text_$1
-  test "x$at_banner_text" = x && return 0
-  eval at_banner_text_$1=
-  $as_echo "$as_nl$at_banner_text$as_nl"
-} # at_func_banner
+  test "x$at_banner_text" = "x " && return 0
+  eval "at_banner_text_$1=\" \""
+  if test -z "$at_banner_text"; then
+    $at_first || echo
+  else
+    $as_echo "$as_nl$at_banner_text$as_nl"
+  fi
+} # at_fn_banner
 
-# at_func_check_newline COMMAND
-# -----------------------------
-# Test if COMMAND includes a newline and, if so, print a message and return
-# exit code 1
-at_func_check_newline ()
+# at_fn_check_prepare_notrace REASON LINE
+# ---------------------------------------
+# Perform AT_CHECK preparations for the command at LINE for an untraceable
+# command; REASON is the reason for disabling tracing.
+at_fn_check_prepare_notrace ()
 {
-  case "$1" in
- *'
-'*) echo 'Not enabling shell tracing (command contains an embedded newline)'
-    return 1 ;;
- *) return 0 ;;
-  esac
+  $at_trace_echo "Not enabling shell tracing (command contains $1)"
+  $as_echo "$2" >"$at_check_line_file"
+  at_check_trace=: at_check_filter=:
+  : >"$at_stdout"; : >"$at_stderr"
 }
 
-# at_func_filter_trace EXIT-CODE
+# at_fn_check_prepare_trace LINE
 # ------------------------------
-# Split the contents of file "$at_stder1" into the "set -x" trace (on stderr)
-# and the other lines (on file "$at_stderr").  Return the exit code EXIT-CODE.
-at_func_filter_trace ()
+# Perform AT_CHECK preparations for the command at LINE for a traceable
+# command.
+at_fn_check_prepare_trace ()
 {
+  $as_echo "$1" >"$at_check_line_file"
+  at_check_trace=$at_traceon at_check_filter=$at_check_filter_trace
+  : >"$at_stdout"; : >"$at_stderr"
+}
+
+# at_fn_check_prepare_dynamic COMMAND LINE
+# ----------------------------------------
+# Decide if COMMAND at LINE is traceable at runtime, and call the appropriate
+# preparation function.
+at_fn_check_prepare_dynamic ()
+{
+  case $1 in
+    *$as_nl*)
+      at_fn_check_prepare_notrace 'an embedded newline' "$2" ;;
+    *)
+      at_fn_check_prepare_trace "$2" ;;
+  esac
+}
+
+# at_fn_filter_trace
+# ------------------
+# Remove the lines in the file "$at_stderr" generated by "set -x" and print
+# them to stderr.
+at_fn_filter_trace ()
+{
+  mv "$at_stderr" "$at_stder1"
   grep '^ *+' "$at_stder1" >&2
   grep -v '^ *+' "$at_stder1" >"$at_stderr"
-  return $1
 }
 
-# at_func_log_failure FILE-LIST
-# -----------------------------
+# at_fn_log_failure FILE-LIST
+# ---------------------------
 # Copy the files in the list on stdout with a "> " prefix, and exit the shell
 # with a failure exit code.
-at_func_log_failure ()
+at_fn_log_failure ()
 {
   for file
     do $as_echo "$file:"; sed 's/^/> /' "$file"; done
@@ -1260,56 +1305,62 @@ at_func_log_failure ()
   exit 1
 }
 
-# at_func_check_skip EXIT-CODE
-# ----------------------------
-# Check whether EXIT-CODE is the special exit code 77, and if so exit the shell
-# with that same exit code.
-at_func_check_skip ()
+# at_fn_check_skip EXIT-CODE LINE
+# -------------------------------
+# Check whether EXIT-CODE is a special exit code (77 or 99), and if so exit
+# the test group subshell with that same exit code. Use LINE in any report
+# about test failure.
+at_fn_check_skip ()
 {
   case $1 in
+    99) echo 99 > "$at_status_file"; at_failed=:
+       $as_echo "$2: hard failure"; exit 99;;
     77) echo 77 > "$at_status_file"; exit 77;;
   esac
 }
 
-# at_func_check_status EXPECTED EXIT-CODE LINE
-# --------------------------------------------
-# Check whether EXIT-CODE is the expected exit code, and if so do nothing.
-# Otherwise, if it is 77 exit the shell with that same exit code; if it is
-# anything else print an error message and fail the test.
-at_func_check_status ()
+# at_fn_check_status EXPECTED EXIT-CODE LINE
+# ------------------------------------------
+# Check whether EXIT-CODE is the EXPECTED exit code, and if so do nothing.
+# Otherwise, if it is 77 or 99, exit the test group subshell with that same
+# exit code; if it is anything else print an error message referring to LINE,
+# and fail the test.
+at_fn_check_status ()
 {
   case $2 in
     $1 ) ;;
     77) echo 77 > "$at_status_file"; exit 77;;
+    99) echo 99 > "$at_status_file"; at_failed=:
+       $as_echo "$3: hard failure"; exit 99;;
     *) $as_echo "$3: exit code was $2, expected $1"
       at_failed=:;;
   esac
 }
 
-# at_func_diff_devnull FILE
-# -------------------------
-# Emit a diff between /dev/null and FILE.  Uses "test -s" to avoid useless
-# diff invocations.
-at_func_diff_devnull ()
+# at_fn_diff_devnull FILE
+# -----------------------
+# Emit a diff between /dev/null and FILE. Uses "test -s" to avoid useless diff
+# invocations.
+at_fn_diff_devnull ()
 {
   test -s "$1" || return 0
   $at_diff "$at_devnull" "$1"
 }
 
-# at_func_test NUMBER
-# -------------------
+# at_fn_test NUMBER
+# -----------------
 # Parse out test NUMBER from the tail of this file.
-at_func_test ()
+at_fn_test ()
 {
   eval at_sed=\$at_sed$1
   sed "$at_sed" "$at_myself" > "$at_test_source"
 }
 
-# at_func_create_debugging_script
-# -------------------------------
+# at_fn_create_debugging_script
+# -----------------------------
 # Create the debugging script $at_group_dir/run which will reproduce the
 # current test group.
-at_func_create_debugging_script ()
+at_fn_create_debugging_script ()
 {
   {
     echo "#! /bin/sh" &&
@@ -1321,34 +1372,13 @@ at_func_create_debugging_script ()
   chmod +x "$at_group_dir/run"
 }
 
-# at_func_arith
-# -------------
-# Arithmetic evaluation, avoids expr if the shell is sane.  The
-# interpretation of leading zeroes is unspecified.
-#
-# subshell and eval are needed to keep Solaris sh from bailing out:
-if ( eval 'test $(( 1 + 1 )) = 2' ) 2>/dev/null; then
-  # With "$@", bash does not split positional parameters:
-  eval 'at_func_arith ()
-  {
-    at_func_arith_result=$(( $* ))
-  }'
-else
-  at_func_arith ()
-  {
-    at_func_arith_result=`expr "$@"`
-  }
-fi
-
-## ---------------------- ##
-## End of shell functions ##
-## ---------------------- ##
+## -------------------------------- ##
+## End of autotest shell functions. ##
+## -------------------------------- ##
 {
-  cat <<\_ASBOX
-## ---------------- ##
+  $as_echo "## ---------------- ##
 ## Tested programs. ##
-## ---------------- ##
-_ASBOX
+## ---------------- ##"
   echo
 } >&5
 
@@ -1356,34 +1386,35 @@ _ASBOX
 for at_program in : $at_tested
 do
   test "$at_program" = : && continue
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+  case $at_program in
+    [\\/]* | ?:[\\/]* ) $at_program_=$at_program ;;
+    * )
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  test -f "$as_dir/$at_program" && break
-done
+    test -f "$as_dir/$at_program" && break
+  done
 IFS=$as_save_IFS
 
-  if test -f "$as_dir/$at_program"; then
+    at_program_=$as_dir/$at_program ;;
+  esac
+  if test -f "$at_program_"; then
     {
-      $as_echo "$at_srcdir/testsuite.at:32: $as_dir/$at_program --version"
-      "$as_dir/$at_program" --version </dev/null
+      $as_echo "$at_srcdir/testsuite.at:32: $at_program_ --version"
+      "$at_program_" --version </dev/null
       echo
     } >&5 2>&1
   else
-    { { $as_echo "$as_me:$LINENO: error: cannot find $at_program" >&5
-$as_echo "$as_me: error: cannot find $at_program" >&2;}
-   { (exit 1); exit 1; }; }
+    as_fn_error $? "cannot find $at_program" "$LINENO" 5
   fi
 done
 
 {
-  cat <<\_ASBOX
-## ------------------ ##
+  $as_echo "## ------------------ ##
 ## Running the tests. ##
-## ------------------ ##
-_ASBOX
+## ------------------ ##"
 } >&5
 
 at_start_date=`date`
@@ -1391,11 +1422,8 @@ at_start_time=`date +%s 2>/dev/null`
 $as_echo "$as_me: starting at: $at_start_date" >&5
 
 # Create the master directory if it doesn't already exist.
-test -d "$at_suite_dir" ||
-  mkdir "$at_suite_dir" ||
-  { { $as_echo "$as_me:$LINENO: error: cannot create '$at_suite_dir'" >&5
-$as_echo "$as_me: error: cannot create '$at_suite_dir'" >&2;}
-   { (exit 1); exit 1; }; }
+as_dir="$at_suite_dir"; as_fn_mkdir_p ||
+  as_fn_error $? "cannot create \`$at_suite_dir'" "$LINENO" 5
 
 # Can we diff with `/dev/null'?  DU 5.0 refuses.
 if diff /dev/null /dev/null >/dev/null 2>&1; then
@@ -1429,28 +1457,40 @@ BEGIN { FS="\a" }
   if (test == "'"$at_group"'") exit
 }' "$at_myself" > "$at_suite_dir/at-source-lines" &&
 . "$at_suite_dir/at-source-lines" ||
-  { { $as_echo "$as_me:$LINENO: error: cannot create test line number cache" >&5
-$as_echo "$as_me: error: cannot create test line number cache" >&2;}
-   { (exit 1); exit 1; }; }
+  as_fn_error $? "cannot create test line number cache" "$LINENO" 5
 rm -f "$at_suite_dir/at-source-lines"
 
+# Set number of jobs for `-j'; avoid more jobs than test groups.
+set X $at_groups; shift; at_max_jobs=$#
+if test $at_max_jobs -eq 0; then
+  at_jobs=1
+fi
+if test $at_jobs -ne 1 &&
+   { test $at_jobs -eq 0 || test $at_jobs -gt $at_max_jobs; }; then
+  at_jobs=$at_max_jobs
+fi
+
+# If parallel mode, don't output banners, don't split summary lines.
+if test $at_jobs -ne 1; then
+  at_print_banners=false
+  at_quiet=:
+fi
+
 # Set up helper dirs.
 rm -rf "$at_helper_dir" &&
 mkdir "$at_helper_dir" &&
 cd "$at_helper_dir" &&
 { test -z "$at_groups" || mkdir $at_groups; } ||
-{ { $as_echo "$as_me:$LINENO: error: testsuite directory setup failed" >&5
-$as_echo "$as_me: error: testsuite directory setup failed" >&2;}
-   { (exit 1); exit 1; }; }
+as_fn_error $? "testsuite directory setup failed" "$LINENO" 5
 
 # Functions for running a test group.  We leave the actual
 # test group execution outside of a shell function in order
 # to avoid hitting zsh 4.x exit status bugs.
 
-# at_func_group_prepare
-# ---------------------
-# Prepare running a test group
-at_func_group_prepare ()
+# at_fn_group_prepare
+# -------------------
+# Prepare for running a test group.
+at_fn_group_prepare ()
 {
   # The directory for additional per-group helper files.
   at_job_dir=$at_helper_dir/$at_group
@@ -1484,56 +1524,20 @@ at_func_group_prepare ()
 
 
   # Create a fresh directory for the next test group, and enter.
+  # If one already exists, the user may have invoked ./run from
+  # within that directory; we remove the contents, but not the
+  # directory itself, so that we aren't pulling the rug out from
+  # under the shell's notion of the current directory.
   at_group_dir=$at_suite_dir/$at_group_normalized
   at_group_log=$at_group_dir/$as_me.log
   if test -d "$at_group_dir"; then
-    find "$at_group_dir" -type d ! -perm -700 -exec chmod u+rwx \{\} \;
-    rm -fr "$at_group_dir" ||
-    { $as_echo "$as_me:$LINENO: WARNING: test directory for $at_group_normalized could not be cleaned." >&5
-$as_echo "$as_me: WARNING: test directory for $at_group_normalized could not be cleaned." >&2;}
-  fi
+  find "$at_group_dir" -type d ! -perm -700 -exec chmod u+rwx {} \;
+  rm -fr "$at_group_dir"/* "$at_group_dir"/.[!.] "$at_group_dir"/.??*
+fi ||
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: test directory for $at_group_normalized could not be cleaned" >&5
+$as_echo "$as_me: WARNING: test directory for $at_group_normalized could not be cleaned" >&2;}
   # Be tolerant if the above `rm' was not able to remove the directory.
-  { as_dir="$at_group_dir"
-  case $as_dir in #(
-  -*) as_dir=./$as_dir;;
-  esac
-  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
-    as_dirs=
-    while :; do
-      case $as_dir in #(
-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
-      *) as_qdir=$as_dir;;
-      esac
-      as_dirs="'$as_qdir' $as_dirs"
-      as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-        X"$as_dir" : 'X\(//\)[^/]' \| \
-        X"$as_dir" : 'X\(//\)$' \| \
-        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-           s//\1/
-           q
-         }
-         /^X\(\/\/\)[^/].*/{
-           s//\1/
-           q
-         }
-         /^X\(\/\/\)$/{
-           s//\1/
-           q
-         }
-         /^X\(\/\).*/{
-           s//\1/
-           q
-         }
-         s/.*/./; q'`
-      test -d "$as_dir" && break
-    done
-    test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
-$as_echo "$as_me: error: cannot create directory $as_dir" >&2;}
-   { (exit 1); exit 1; }; }; }
+  as_dir="$at_group_dir"; as_fn_mkdir_p
 
   echo 0 > "$at_status_file"
 
@@ -1546,9 +1550,29 @@ $as_echo "$as_me: error: cannot create directory $as_dir" >&2;}
   fi
 }
 
-# at_func_group_postprocess
-# -------------------------
-at_func_group_postprocess ()
+# at_fn_group_banner ORDINAL LINE DESC PAD [BANNER]
+# -------------------------------------------------
+# Declare the test group ORDINAL, located at LINE with group description DESC,
+# and residing under BANNER. Use PAD to align the status column.
+at_fn_group_banner ()
+{
+  at_setup_line="$2"
+  test -n "$5" && at_fn_banner $5
+  at_desc="$3"
+  case $1 in
+    [0-9])      at_desc_line="  $1: ";;
+    [0-9][0-9]) at_desc_line=" $1: " ;;
+    *)          at_desc_line="$1: "  ;;
+  esac
+  as_fn_append at_desc_line "$3$4"
+  $at_quiet $as_echo_n "$at_desc_line"
+  echo "#                             -*- compilation -*-" >> "$at_group_log"
+}
+
+# at_fn_group_postprocess
+# -----------------------
+# Perform cleanup after running a test group.
+at_fn_group_postprocess ()
 {
   # Be sure to come back to the suite directory, in particular
   # since below we might `rm' the group directory we are in currently.
@@ -1561,6 +1585,7 @@ at_func_group_postprocess ()
       report this failure to <bug-gdbm@gnu.org>.
 _ATEOF
     $as_echo "$at_setup_line" >"$at_check_line_file"
+    at_status=99
   fi
   $at_verbose $as_echo_n "$at_group. $at_setup_line: "
   $as_echo_n "$at_group. $at_setup_line: " >> "$at_group_log"
@@ -1569,31 +1594,41 @@ _ATEOF
        at_msg="UNEXPECTED PASS"
        at_res=xpass
        at_errexit=$at_errexit_p
+       at_color=$at_red
        ;;
     no:0)
        at_msg="ok"
        at_res=pass
        at_errexit=false
+       at_color=$at_grn
        ;;
     *:77)
        at_msg='skipped ('`cat "$at_check_line_file"`')'
        at_res=skip
        at_errexit=false
+       at_color=$at_blu
+       ;;
+    no:* | *:99)
+       at_msg='FAILED ('`cat "$at_check_line_file"`')'
+       at_res=fail
+       at_errexit=$at_errexit_p
+       at_color=$at_red
        ;;
     yes:*)
        at_msg='expected failure ('`cat "$at_check_line_file"`')'
        at_res=xfail
        at_errexit=false
-       ;;
-    no:*)
-       at_msg='FAILED ('`cat "$at_check_line_file"`')'
-       at_res=fail
-       at_errexit=$at_errexit_p
+       at_color=$at_lgn
        ;;
   esac
   echo "$at_res" > "$at_job_dir/$at_res"
-  # Make sure there is a separator even with long titles.
-  $as_echo " $at_msg"
+  # In parallel mode, output the summary line only afterwards.
+  if test $at_jobs -ne 1 && test -n "$at_verbose"; then
+    $as_echo "$at_desc_line $at_color$at_msg$at_std"
+  else
+    # Make sure there is a separator even with long titles.
+    $as_echo " $at_color$at_msg$at_std"
+  fi
   at_log_msg="$at_group. $at_desc ($at_setup_line): $at_msg"
   case $at_status in
     0|77)
@@ -1608,9 +1643,13 @@ _ATEOF
       $as_echo "$at_log_msg" >> "$at_group_log"
       $as_echo "$at_log_msg" >&5
 
-      # Cleanup the group directory, unless the user wants the files.
-      if $at_debug_p; then
-       at_func_create_debugging_script
+      # Cleanup the group directory, unless the user wants the files
+      # or the success was unexpected.
+      if $at_debug_p || test $at_res = xpass; then
+       at_fn_create_debugging_script
+       if test $at_res = xpass && $at_errexit; then
+         echo stop > "$at_stop_file"
+       fi
       else
        if test -d "$at_group_dir"; then
          find "$at_group_dir" -type d ! -perm -700 -exec chmod u+rwx \{\} \;
@@ -1627,7 +1666,7 @@ _ATEOF
 
       # Upon failure, keep the group directory for autopsy, and create
       # the debugging script.  With -e, do not start any further tests.
-      at_func_create_debugging_script
+      at_fn_create_debugging_script
       if $at_errexit; then
        echo stop > "$at_stop_file"
       fi
@@ -1640,22 +1679,134 @@ _ATEOF
 ## Driver loop. ##
 ## ------------ ##
 
+
+if (set -m && set +m && set +b) >/dev/null 2>&1; then
+  set +b
+  at_job_control_on='set -m' at_job_control_off='set +m' at_job_group=-
+else
+  at_job_control_on=: at_job_control_off=: at_job_group=
+fi
+
+for at_signal in 1 2 15; do
+  trap 'set +x; set +e
+       $at_job_control_off
+       at_signal='"$at_signal"'
+       echo stop > "$at_stop_file"
+       trap "" $at_signal
+       at_pgids=
+       for at_pgid in `jobs -p 2>/dev/null`; do
+         at_pgids="$at_pgids $at_job_group$at_pgid"
+       done
+       test -z "$at_pgids" || kill -$at_signal $at_pgids 2>/dev/null
+       wait
+       if test "$at_jobs" -eq 1 || test -z "$at_verbose"; then
+         echo >&2
+       fi
+       at_signame=`kill -l $at_signal 2>&1 || echo $at_signal`
+       set x $at_signame
+       test 0 -gt 2 && at_signame=$at_signal
+       { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: caught signal $at_signame, bailing out" >&5
+$as_echo "$as_me: WARNING: caught signal $at_signame, bailing out" >&2;}
+       as_fn_arith 128 + $at_signal && exit_status=$as_val
+       as_fn_exit $exit_status' $at_signal
+done
+
 rm -f "$at_stop_file"
 at_first=:
 
-for at_group in $at_groups; do
-  at_func_group_prepare
-  if cd "$at_group_dir" &&
-     at_func_test $at_group &&
-     . "$at_test_source"; then :; else
-    { $as_echo "$as_me:$LINENO: WARNING: unable to parse test group: $at_group" >&5
+if test $at_jobs -ne 1 &&
+     rm -f "$at_job_fifo" &&
+     test -n "$at_job_group" &&
+     ( mkfifo "$at_job_fifo" && trap 'exit 1' PIPE STOP TSTP ) 2>/dev/null
+then
+  # FIFO job dispatcher.
+
+  trap 'at_pids=
+       for at_pid in `jobs -p`; do
+         at_pids="$at_pids $at_job_group$at_pid"
+       done
+       if test -n "$at_pids"; then
+         at_sig=TSTP
+         test "${TMOUT+set}" = set && at_sig=STOP
+         kill -$at_sig $at_pids 2>/dev/null
+       fi
+       kill -STOP $$
+       test -z "$at_pids" || kill -CONT $at_pids 2>/dev/null' TSTP
+
+  echo
+  # Turn jobs into a list of numbers, starting from 1.
+  at_joblist=`$as_echo "$at_groups" | sed -n 1,${at_jobs}p`
+
+  set X $at_joblist
+  shift
+  for at_group in $at_groups; do
+    $at_job_control_on 2>/dev/null
+    (
+      # Start one test group.
+      $at_job_control_off
+      if $at_first; then
+       exec 7>"$at_job_fifo"
+      else
+       exec 6<&-
+      fi
+      trap 'set +x; set +e
+           trap "" PIPE
+           echo stop > "$at_stop_file"
+           echo >&7
+           as_fn_exit 141' PIPE
+      at_fn_group_prepare
+      if cd "$at_group_dir" &&
+        at_fn_test $at_group &&
+        . "$at_test_source"
+      then :; else
+       { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unable to parse test group: $at_group" >&5
 $as_echo "$as_me: WARNING: unable to parse test group: $at_group" >&2;}
-    at_failed=:
+       at_failed=:
+      fi
+      at_fn_group_postprocess
+      echo >&7
+    ) &
+    $at_job_control_off
+    if $at_first; then
+      at_first=false
+      exec 6<"$at_job_fifo" 7>"$at_job_fifo"
+    fi
+    shift # Consume one token.
+    if test $# -gt 0; then :; else
+      read at_token <&6 || break
+      set x $*
+    fi
+    test -f "$at_stop_file" && break
+  done
+  exec 7>&-
+  # Read back the remaining ($at_jobs - 1) tokens.
+  set X $at_joblist
+  shift
+  if test $# -gt 0; then
+    shift
+    for at_job
+    do
+      read at_token
+    done <&6
   fi
-  at_func_group_postprocess
-  test -f "$at_stop_file" && break
-  at_first=false
-done
+  exec 6<&-
+  wait
+else
+  # Run serially, avoid forks and other potential surprises.
+  for at_group in $at_groups; do
+    at_fn_group_prepare
+    if cd "$at_group_dir" &&
+       at_fn_test $at_group &&
+       . "$at_test_source"; then :; else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unable to parse test group: $at_group" >&5
+$as_echo "$as_me: WARNING: unable to parse test group: $at_group" >&2;}
+      at_failed=:
+    fi
+    at_fn_group_postprocess
+    test -f "$at_stop_file" && break
+    at_first=false
+  done
+fi
 
 # Wrap up the test suite with summary statistics.
 cd "$at_helper_dir"
@@ -1676,12 +1827,9 @@ set X $at_xfail_list; shift; at_xfail_count=$#
 set X $at_fail_list; shift; at_fail_count=$#; at_fail_list=$*
 set X $at_skip_list; shift; at_skip_count=$#
 
-at_func_arith $at_group_count - $at_skip_count
-at_run_count=$at_func_arith_result
-at_func_arith $at_xpass_count + $at_fail_count
-at_unexpected_count=$at_func_arith_result
-at_func_arith $at_xfail_count + $at_fail_count
-at_total_fail_count=$at_func_arith_result
+as_fn_arith $at_group_count - $at_skip_count && at_run_count=$as_val
+as_fn_arith $at_xpass_count + $at_fail_count && at_unexpected_count=$as_val
+as_fn_arith $at_xfail_count + $at_fail_count && at_total_fail_count=$as_val
 
 # Back to the top directory.
 cd "$at_dir"
@@ -1693,35 +1841,26 @@ at_stop_time=`date +%s 2>/dev/null`
 $as_echo "$as_me: ending at: $at_stop_date" >&5
 case $at_start_time,$at_stop_time in
   [0-9]*,[0-9]*)
-    at_func_arith $at_stop_time - $at_start_time
-    at_duration_s=$at_func_arith_result
-    at_func_arith $at_duration_s / 60
-    at_duration_m=$at_func_arith_result
-    at_func_arith $at_duration_m / 60
-    at_duration_h=$at_func_arith_result
-    at_func_arith $at_duration_s % 60
-    at_duration_s=$at_func_arith_result
-    at_func_arith $at_duration_m % 60
-    at_duration_m=$at_func_arith_result
+    as_fn_arith $at_stop_time - $at_start_time && at_duration_s=$as_val
+    as_fn_arith $at_duration_s / 60 && at_duration_m=$as_val
+    as_fn_arith $at_duration_m / 60 && at_duration_h=$as_val
+    as_fn_arith $at_duration_s % 60 && at_duration_s=$as_val
+    as_fn_arith $at_duration_m % 60 && at_duration_m=$as_val
     at_duration="${at_duration_h}h ${at_duration_m}m ${at_duration_s}s"
     $as_echo "$as_me: test suite duration: $at_duration" >&5
     ;;
 esac
 
 echo
-cat <<\_ASBOX
-## ------------- ##
+$as_echo "## ------------- ##
 ## Test results. ##
-## ------------- ##
-_ASBOX
+## ------------- ##"
 echo
 {
   echo
-  cat <<\_ASBOX
-## ------------- ##
+  $as_echo "## ------------- ##
 ## Test results. ##
-## ------------- ##
-_ASBOX
+## ------------- ##"
   echo
 } >&5
 
@@ -1739,12 +1878,14 @@ if $at_errexit_p && test $at_unexpected_count != 0; then
     at_result="$at_result $at_were run, one failed"
   fi
   at_result="$at_result unexpectedly and inhibited subsequent tests."
+  at_color=$at_red
 else
   # Don't you just love exponential explosion of the number of cases?
+  at_color=$at_red
   case $at_xpass_count:$at_fail_count:$at_xfail_count in
     # So far, so good.
-    0:0:0) at_result="$at_result $at_were successful." ;;
-    0:0:*) at_result="$at_result behaved as expected." ;;
+    0:0:0) at_result="$at_result $at_were successful." at_color=$at_grn ;;
+    0:0:*) at_result="$at_result behaved as expected." at_color=$at_lgn ;;
 
     # Some unexpected failures
     0:*:0) at_result="$at_result $at_were run,
@@ -1790,18 +1931,16 @@ $at_skip_count tests were skipped." ;;
 esac
 
 if test $at_unexpected_count = 0; then
-  echo "$at_result"
+  echo "$at_color$at_result$at_std"
   echo "$at_result" >&5
 else
-  echo "ERROR: $at_result" >&2
+  echo "${at_color}ERROR: $at_result$at_std" >&2
   echo "ERROR: $at_result" >&5
   {
     echo
-    cat <<\_ASBOX
-## ------------------------ ##
+    $as_echo "## ------------------------ ##
 ## Summary of the failures. ##
-## ------------------------ ##
-_ASBOX
+## ------------------------ ##"
 
     # Summary of failed and skipped tests.
     if test $at_fail_count != 0; then
@@ -1820,11 +1959,9 @@ _ASBOX
       echo
     fi
     if test $at_fail_count != 0; then
-      cat <<\_ASBOX
-## ---------------------- ##
+      $as_echo "## ---------------------- ##
 ## Detailed failed tests. ##
-## ---------------------- ##
-_ASBOX
+## ---------------------- ##"
       echo
       for at_group in $at_fail_list
       do
@@ -1856,19 +1993,21 @@ _ASBOX
 _ASBOX
 
   echo
-  $as_echo "Please send \`${at_testdir+${at_testdir}/}$as_me.log' and all information you think might help:
+  if $at_debug_p; then
+    at_msg='per-test log files'
+  else
+    at_msg="\`${at_testdir+${at_testdir}/}$as_me.log'"
+  fi
+  $as_echo "Please send $at_msg and all information you think might help:
 
    To: <bug-gdbm@gnu.org>
-   Subject: [gdbm 1.10] $as_me: $at_fail_list${at_fail_list:+ failed${at_xpass_list:+, }}$at_xpass_list${at_xpass_list:+ passed unexpectedly}
+   Subject: [gdbm 1.11] $as_me: $at_fail_list${at_fail_list:+ failed${at_xpass_list:+, }}$at_xpass_list${at_xpass_list:+ passed unexpectedly}
+
+You may investigate any problem if you feel able to do so, in which
+case the test suite provides a good starting point.  Its output may
+be found below \`${at_testdir+${at_testdir}/}$as_me.dir'.
 "
-  if test $at_debug_p = false; then
-    echo
-    echo 'You may investigate any problem if you feel able to do so, in which'
-    echo 'case the test suite provides a good starting point.  Its output may'
-    $as_echo "be found below \`${at_testdir+${at_testdir}/}$as_me.dir'."
-    echo
-  fi
-    exit 1
+  exit 1
 fi
 
 exit 0
@@ -1877,262 +2016,189 @@ exit 0
 ## Actual tests. ##
 ## ------------- ##
 #AT_START_1
-# 1. version.at:17: gdbm version
-at_setup_line='version.at:17'
-at_desc="gdbm version"
-$at_quiet $as_echo_n "  1: $at_desc                                   "
+at_fn_group_banner 1 'version.at:17' \
+  "gdbm version" "                                   "
 at_xfail=no
-echo "#                             -*- compilation -*-" >> "$at_group_log"
 (
-  $as_echo "1. version.at:17: testing ..."
+  $as_echo "1. $at_setup_line: testing $at_desc ..."
   $at_traceon
 
 
-{ $at_traceoff
+{ set +x
 $as_echo "$at_srcdir/version.at:19: gtver -lib -full -header -full"
-echo version.at:19 >"$at_check_line_file"
-
-if test -n "$at_traceon"; then
-  ( $at_traceon; gtver -lib -full -header -full ) >"$at_stdout" 2>"$at_stder1"
-  at_func_filter_trace $?
-else
-  ( :; gtver -lib -full -header -full ) >"$at_stdout" 2>"$at_stderr"
-fi
-at_status=$?
-at_failed=false
-at_func_diff_devnull "$at_stderr" || at_failed=:
-echo >>"$at_stdout"; $as_echo "1.10.0
-1.10.0
+at_fn_check_prepare_trace "version.at:19"
+( $at_check_trace; gtver -lib -full -header -full
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+echo >>"$at_stdout"; $as_echo "1.11.0
+1.11.0
 " | \
   $at_diff - "$at_stdout" || at_failed=:
-at_func_check_status 0 $at_status "$at_srcdir/version.at:19"
-
-$at_failed && at_func_log_failure
+at_fn_check_status 0 $at_status "$at_srcdir/version.at:19"
+$at_failed && at_fn_log_failure
 $at_traceon; }
 
 
-  $at_traceoff
+  set +x
   $at_times_p && times >"$at_times_file"
-) 5>&1 2>&1 | eval $at_tee_pipe
-at_status=`cat "$at_status_file"`
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
 #AT_STOP_1
 #AT_START_2
-# 2. create00.at:17: create database
-at_setup_line='create00.at:17'
-at_func_banner 1
-at_desc="create database"
-$at_quiet $as_echo_n "  2: $at_desc                                "
+at_fn_group_banner 2 'create00.at:17' \
+  "create database" "                                " 1
 at_xfail=no
-echo "#                             -*- compilation -*-" >> "$at_group_log"
 (
-  $as_echo "2. create00.at:17: testing ..."
+  $as_echo "2. $at_setup_line: testing $at_desc ..."
   $at_traceon
 
 
 
-{ $at_traceoff
+{ set +x
 $as_echo "$at_srcdir/create00.at:20:
 
-test -z "`sort < /dev/null 2>&1`" || exit 77
+test -z \"\`sort < /dev/null 2>&1\`\" || exit 77
 
 num2word 1:1000 > input
 gtload test.db < input
 gtdump test.db | sort -k1,2 -n > output
-diff -u input output
+cmp -s input output || diff -u input output
 "
-echo create00.at:20 >"$at_check_line_file"
-
-if { echo 'Not enabling shell tracing (command contains an embedded newline)'
-   false; }; then
-  ( $at_traceon;
-
-test -z "`sort < /dev/null 2>&1`" || exit 77
-
-num2word 1:1000 > input
-gtload test.db < input
-gtdump test.db | sort -k1,2 -n > output
-diff -u input output
- ) >"$at_stdout" 2>"$at_stder1"
-  at_func_filter_trace $?
-else
-  ( :;
+at_fn_check_prepare_notrace 'a `...` command substitution' "create00.at:20"
+( $at_check_trace;
 
 test -z "`sort < /dev/null 2>&1`" || exit 77
 
 num2word 1:1000 > input
 gtload test.db < input
 gtdump test.db | sort -k1,2 -n > output
-diff -u input output
- ) >"$at_stdout" 2>"$at_stderr"
-fi
-at_status=$?
-at_failed=false
-at_func_diff_devnull "$at_stderr" || at_failed=:
-at_func_diff_devnull "$at_stdout" || at_failed=:
-at_func_check_status 0 $at_status "$at_srcdir/create00.at:20"
-
-$at_failed && at_func_log_failure
+cmp -s input output || diff -u input output
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/create00.at:20"
+$at_failed && at_fn_log_failure
 $at_traceon; }
 
 
-  $at_traceoff
+  set +x
   $at_times_p && times >"$at_times_file"
-) 5>&1 2>&1 | eval $at_tee_pipe
-at_status=`cat "$at_status_file"`
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
 #AT_STOP_2
 #AT_START_3
-# 3. fetch00.at:17: fetch a record
-at_setup_line='fetch00.at:17'
-at_func_banner 1
-at_desc="fetch a record"
-$at_quiet $as_echo_n "  3: $at_desc                                 "
+at_fn_group_banner 3 'fetch00.at:17' \
+  "fetch a record" "                                 " 1
 at_xfail=no
-echo "#                             -*- compilation -*-" >> "$at_group_log"
 (
-  $as_echo "3. fetch00.at:17: testing ..."
+  $as_echo "3. $at_setup_line: testing $at_desc ..."
   $at_traceon
 
 
 
-{ $at_traceoff
+{ set +x
 $as_echo "$at_srcdir/fetch00.at:20:
 num2word 1:10000 | gtload test.db
 gtfetch test.db 1 2745 9999
 "
-echo fetch00.at:20 >"$at_check_line_file"
-
-if { echo 'Not enabling shell tracing (command contains an embedded newline)'
-   false; }; then
-  ( $at_traceon;
-num2word 1:10000 | gtload test.db
-gtfetch test.db 1 2745 9999
- ) >"$at_stdout" 2>"$at_stder1"
-  at_func_filter_trace $?
-else
-  ( :;
+at_fn_check_prepare_notrace 'an embedded newline' "fetch00.at:20"
+( $at_check_trace;
 num2word 1:10000 | gtload test.db
 gtfetch test.db 1 2745 9999
- ) >"$at_stdout" 2>"$at_stderr"
-fi
-at_status=$?
-at_failed=false
-at_func_diff_devnull "$at_stderr" || at_failed=:
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
 echo >>"$at_stdout"; $as_echo "one
 two thousand seven hundred and fourty-five
 nine thousand nine hundred and ninety-nine
 " | \
   $at_diff - "$at_stdout" || at_failed=:
-at_func_check_status 0 $at_status "$at_srcdir/fetch00.at:20"
-
-$at_failed && at_func_log_failure
+at_fn_check_status 0 $at_status "$at_srcdir/fetch00.at:20"
+$at_failed && at_fn_log_failure
 $at_traceon; }
 
 
-  $at_traceoff
+  set +x
   $at_times_p && times >"$at_times_file"
-) 5>&1 2>&1 | eval $at_tee_pipe
-at_status=`cat "$at_status_file"`
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
 #AT_STOP_3
 #AT_START_4
-# 4. fetch01.at:17: fetch: nonexisting record
-at_setup_line='fetch01.at:17'
-at_func_banner 1
-at_desc="fetch: nonexisting record"
-$at_quiet $as_echo_n "  4: $at_desc                      "
+at_fn_group_banner 4 'fetch01.at:17' \
+  "fetch: nonexisting record" "                      " 1
 at_xfail=no
-echo "#                             -*- compilation -*-" >> "$at_group_log"
 (
-  $as_echo "4. fetch01.at:17: testing ..."
+  $as_echo "4. $at_setup_line: testing $at_desc ..."
   $at_traceon
 
 
 
-{ $at_traceoff
+{ set +x
 $as_echo "$at_srcdir/fetch01.at:20:
 num2word 1:10000 | gtload test.db
 gtfetch test.db 0
 "
-echo fetch01.at:20 >"$at_check_line_file"
-
-if { echo 'Not enabling shell tracing (command contains an embedded newline)'
-   false; }; then
-  ( $at_traceon;
-num2word 1:10000 | gtload test.db
-gtfetch test.db 0
- ) >"$at_stdout" 2>"$at_stder1"
-  at_func_filter_trace $?
-else
-  ( :;
+at_fn_check_prepare_notrace 'an embedded newline' "fetch01.at:20"
+( $at_check_trace;
 num2word 1:10000 | gtload test.db
 gtfetch test.db 0
- ) >"$at_stdout" 2>"$at_stderr"
-fi
-at_status=$?
-at_failed=false
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
 echo >>"$at_stderr"; $as_echo "gtfetch: 0: not found
 " | \
   $at_diff - "$at_stderr" || at_failed=:
-at_func_diff_devnull "$at_stdout" || at_failed=:
-at_func_check_status 2 $at_status "$at_srcdir/fetch01.at:20"
-
-$at_failed && at_func_log_failure
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 2 $at_status "$at_srcdir/fetch01.at:20"
+$at_failed && at_fn_log_failure
 $at_traceon; }
 
 
-  $at_traceoff
+  set +x
   $at_times_p && times >"$at_times_file"
-) 5>&1 2>&1 | eval $at_tee_pipe
-at_status=`cat "$at_status_file"`
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
 #AT_STOP_4
 #AT_START_5
-# 5. delete00.at:17: delete a record
-at_setup_line='delete00.at:17'
-at_func_banner 1
-at_desc="delete a record"
-$at_quiet $as_echo_n "  5: $at_desc                                "
+at_fn_group_banner 5 'delete00.at:17' \
+  "delete a record" "                                " 1
 at_xfail=no
-echo "#                             -*- compilation -*-" >> "$at_group_log"
 (
-  $as_echo "5. delete00.at:17: testing ..."
+  $as_echo "5. $at_setup_line: testing $at_desc ..."
   $at_traceon
 
 
 
-{ $at_traceoff
+{ set +x
 $as_echo "$at_srcdir/delete00.at:20:
 
-test -z "`sort < /dev/null 2>&1`" || exit 77
+test -z \"\`sort < /dev/null 2>&1\`\" || exit 77
 
 num2word 1:10 | gtload test.db
 gtdel test.db 8
 gtdump test.db | sort -k1,2 -n
 "
-echo delete00.at:20 >"$at_check_line_file"
-
-if { echo 'Not enabling shell tracing (command contains an embedded newline)'
-   false; }; then
-  ( $at_traceon;
+at_fn_check_prepare_notrace 'a `...` command substitution' "delete00.at:20"
+( $at_check_trace;
 
 test -z "`sort < /dev/null 2>&1`" || exit 77
 
 num2word 1:10 | gtload test.db
 gtdel test.db 8
 gtdump test.db | sort -k1,2 -n
- ) >"$at_stdout" 2>"$at_stder1"
-  at_func_filter_trace $?
-else
-  ( :;
-
-test -z "`sort < /dev/null 2>&1`" || exit 77
 
-num2word 1:10 | gtload test.db
-gtdel test.db 8
-gtdump test.db | sort -k1,2 -n
- ) >"$at_stdout" 2>"$at_stderr"
-fi
-at_status=$?
-at_failed=false
-at_func_diff_devnull "$at_stderr" || at_failed=:
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
 echo >>"$at_stdout"; $as_echo "1       one
 2      two
 3      three
@@ -2144,175 +2210,121 @@ echo >>"$at_stdout"; $as_echo "1      one
 10     ten
 " | \
   $at_diff - "$at_stdout" || at_failed=:
-at_func_check_status 0 $at_status "$at_srcdir/delete00.at:20"
-
-$at_failed && at_func_log_failure
+at_fn_check_status 0 $at_status "$at_srcdir/delete00.at:20"
+$at_failed && at_fn_log_failure
 $at_traceon; }
 
 
-  $at_traceoff
+  set +x
   $at_times_p && times >"$at_times_file"
-) 5>&1 2>&1 | eval $at_tee_pipe
-at_status=`cat "$at_status_file"`
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
 #AT_STOP_5
 #AT_START_6
-# 6. delete01.at:17: delete: non existing record
-at_setup_line='delete01.at:17'
-at_func_banner 1
-at_desc="delete: non existing record"
-$at_quiet $as_echo_n "  6: $at_desc                    "
+at_fn_group_banner 6 'delete01.at:17' \
+  "delete: non existing record" "                    " 1
 at_xfail=no
-echo "#                             -*- compilation -*-" >> "$at_group_log"
 (
-  $as_echo "6. delete01.at:17: testing ..."
+  $as_echo "6. $at_setup_line: testing $at_desc ..."
   $at_traceon
 
 
 
-{ $at_traceoff
+{ set +x
 $as_echo "$at_srcdir/delete01.at:20:
 
-test -z "`sort < /dev/null 2>&1`" || exit 77
+test -z \"\`sort < /dev/null 2>&1\`\" || exit 77
 
 num2word 1:10 | gtload test.db
 gtdel test.db 11
 "
-echo delete01.at:20 >"$at_check_line_file"
-
-if { echo 'Not enabling shell tracing (command contains an embedded newline)'
-   false; }; then
-  ( $at_traceon;
+at_fn_check_prepare_notrace 'a `...` command substitution' "delete01.at:20"
+( $at_check_trace;
 
 test -z "`sort < /dev/null 2>&1`" || exit 77
 
 num2word 1:10 | gtload test.db
 gtdel test.db 11
- ) >"$at_stdout" 2>"$at_stder1"
-  at_func_filter_trace $?
-else
-  ( :;
 
-test -z "`sort < /dev/null 2>&1`" || exit 77
-
-num2word 1:10 | gtload test.db
-gtdel test.db 11
- ) >"$at_stdout" 2>"$at_stderr"
-fi
-at_status=$?
-at_failed=false
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
 echo >>"$at_stderr"; $as_echo "gtdel: cannot delete 11: Item not found
 " | \
   $at_diff - "$at_stderr" || at_failed=:
-at_func_diff_devnull "$at_stdout" || at_failed=:
-at_func_check_status 2 $at_status "$at_srcdir/delete01.at:20"
-
-$at_failed && at_func_log_failure
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 2 $at_status "$at_srcdir/delete01.at:20"
+$at_failed && at_fn_log_failure
 $at_traceon; }
 
 
-  $at_traceoff
+  set +x
   $at_times_p && times >"$at_times_file"
-) 5>&1 2>&1 | eval $at_tee_pipe
-at_status=`cat "$at_status_file"`
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
 #AT_STOP_6
 #AT_START_7
-# 7. delete02.at:17: delete: all records
-at_setup_line='delete02.at:17'
-at_func_banner 1
-at_desc="delete: all records"
-$at_quiet $as_echo_n "  7: $at_desc                            "
+at_fn_group_banner 7 'delete02.at:17' \
+  "delete: all records" "                            " 1
 at_xfail=no
-echo "#                             -*- compilation -*-" >> "$at_group_log"
 (
-  $as_echo "7. delete02.at:17: testing ..."
+  $as_echo "7. $at_setup_line: testing $at_desc ..."
   $at_traceon
 
 
 
-{ $at_traceoff
+{ set +x
 $as_echo "$at_srcdir/delete02.at:20:
 num2word 1:10 | gtload test.db
 gtdel test.db 1 2 3 4 5 6 7 8 9 10
 gtdump test.db
 "
-echo delete02.at:20 >"$at_check_line_file"
-
-if { echo 'Not enabling shell tracing (command contains an embedded newline)'
-   false; }; then
-  ( $at_traceon;
-num2word 1:10 | gtload test.db
-gtdel test.db 1 2 3 4 5 6 7 8 9 10
-gtdump test.db
- ) >"$at_stdout" 2>"$at_stder1"
-  at_func_filter_trace $?
-else
-  ( :;
+at_fn_check_prepare_notrace 'an embedded newline' "delete02.at:20"
+( $at_check_trace;
 num2word 1:10 | gtload test.db
 gtdel test.db 1 2 3 4 5 6 7 8 9 10
 gtdump test.db
- ) >"$at_stdout" 2>"$at_stderr"
-fi
-at_status=$?
-at_failed=false
-at_func_diff_devnull "$at_stderr" || at_failed=:
-at_func_diff_devnull "$at_stdout" || at_failed=:
-at_func_check_status 0 $at_status "$at_srcdir/delete02.at:20"
 
-$at_failed && at_func_log_failure
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/delete02.at:20"
+$at_failed && at_fn_log_failure
 $at_traceon; }
 
 
-  $at_traceoff
+  set +x
   $at_times_p && times >"$at_times_file"
-) 5>&1 2>&1 | eval $at_tee_pipe
-at_status=`cat "$at_status_file"`
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
 #AT_STOP_7
 #AT_START_8
-# 8. dbmcreate00.at:17: create database
-at_setup_line='dbmcreate00.at:17'
-at_func_banner 2
-at_desc="create database"
-$at_quiet $as_echo_n "  8: $at_desc                                "
+at_fn_group_banner 8 'dbmcreate00.at:17' \
+  "create database" "                                " 2
 at_xfail=no
-echo "#                             -*- compilation -*-" >> "$at_group_log"
 (
-  $as_echo "8. dbmcreate00.at:17: testing ..."
+  $as_echo "8. $at_setup_line: testing $at_desc ..."
   $at_traceon
 
 
 
-{ $at_traceoff
+{ set +x
 $as_echo "$at_srcdir/dbmcreate00.at:20:
 
-test $COMPAT -eq 1 || exit 77
+test \$COMPAT -eq 1 || exit 77
 
 
-test -z "`sort < /dev/null 2>&1`" || exit 77
+test -z \"\`sort < /dev/null 2>&1\`\" || exit 77
 
 num2word 1:1000 > input
 dtload test < input
 dtdump test | sort -k1,2 -n > output
-diff -u input output
+cmp -s input output || diff -u input output
 "
-echo dbmcreate00.at:20 >"$at_check_line_file"
-
-if { echo 'Not enabling shell tracing (command contains an embedded newline)'
-   false; }; then
-  ( $at_traceon;
-
-test $COMPAT -eq 1 || exit 77
-
-
-test -z "`sort < /dev/null 2>&1`" || exit 77
-
-num2word 1:1000 > input
-dtload test < input
-dtdump test | sort -k1,2 -n > output
-diff -u input output
- ) >"$at_stdout" 2>"$at_stder1"
-  at_func_filter_trace $?
-else
-  ( :;
+at_fn_check_prepare_notrace 'a `...` command substitution' "dbmcreate00.at:20"
+( $at_check_trace;
 
 test $COMPAT -eq 1 || exit 77
 
@@ -2322,42 +2334,37 @@ test -z "`sort < /dev/null 2>&1`" || exit 77
 num2word 1:1000 > input
 dtload test < input
 dtdump test | sort -k1,2 -n > output
-diff -u input output
- ) >"$at_stdout" 2>"$at_stderr"
-fi
-at_status=$?
-at_failed=false
-at_func_diff_devnull "$at_stderr" || at_failed=:
-at_func_diff_devnull "$at_stdout" || at_failed=:
-at_func_check_status 0 $at_status "$at_srcdir/dbmcreate00.at:20"
-
-$at_failed && at_func_log_failure
+cmp -s input output || diff -u input output
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/dbmcreate00.at:20"
+$at_failed && at_fn_log_failure
 $at_traceon; }
 
 
-  $at_traceoff
+  set +x
   $at_times_p && times >"$at_times_file"
-) 5>&1 2>&1 | eval $at_tee_pipe
-at_status=`cat "$at_status_file"`
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
 #AT_STOP_8
 #AT_START_9
-# 9. dbmcvt.at:17: converting a 1.8-style database
-at_setup_line='dbmcvt.at:17'
-at_func_banner 2
-at_desc="converting a 1.8-style database"
-$at_quiet $as_echo_n "  9: $at_desc                "
+at_fn_group_banner 9 'dbmcvt.at:17' \
+  "converting a 1.8-style database" "                " 2
 at_xfail=no
-echo "#                             -*- compilation -*-" >> "$at_group_log"
 (
-  $as_echo "9. dbmcvt.at:17: testing ..."
+  $as_echo "9. $at_setup_line: testing $at_desc ..."
   $at_traceon
 
 
 
-{ $at_traceoff
+{ set +x
 $as_echo "$at_srcdir/dbmcvt.at:20:
 
-test $COMPAT -eq 1 || exit 77
+test \$COMPAT -eq 1 || exit 77
 
 num2word 1:10 | dtload test
 rm test.dir
@@ -2366,11 +2373,8 @@ dtfetch test 6
 cmp test.pag test.dir >/dev/null 2>&1 && exit 1
 exit 0
 "
-echo dbmcvt.at:20 >"$at_check_line_file"
-
-if { echo 'Not enabling shell tracing (command contains an embedded newline)'
-   false; }; then
-  ( $at_traceon;
+at_fn_check_prepare_notrace 'an embedded newline' "dbmcvt.at:20"
+( $at_check_trace;
 
 test $COMPAT -eq 1 || exit 77
 
@@ -2380,242 +2384,172 @@ ln test.pag test.dir
 dtfetch test 6
 cmp test.pag test.dir >/dev/null 2>&1 && exit 1
 exit 0
- ) >"$at_stdout" 2>"$at_stder1"
-  at_func_filter_trace $?
-else
-  ( :;
-
-test $COMPAT -eq 1 || exit 77
 
-num2word 1:10 | dtload test
-rm test.dir
-ln test.pag test.dir
-dtfetch test 6
-cmp test.pag test.dir >/dev/null 2>&1 && exit 1
-exit 0
- ) >"$at_stdout" 2>"$at_stderr"
-fi
-at_status=$?
-at_failed=false
-at_func_diff_devnull "$at_stderr" || at_failed=:
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
 echo >>"$at_stdout"; $as_echo "six
 " | \
   $at_diff - "$at_stdout" || at_failed=:
-at_func_check_status 0 $at_status "$at_srcdir/dbmcvt.at:20"
-
-$at_failed && at_func_log_failure
+at_fn_check_status 0 $at_status "$at_srcdir/dbmcvt.at:20"
+$at_failed && at_fn_log_failure
 $at_traceon; }
 
 
-  $at_traceoff
+  set +x
   $at_times_p && times >"$at_times_file"
-) 5>&1 2>&1 | eval $at_tee_pipe
-at_status=`cat "$at_status_file"`
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
 #AT_STOP_9
 #AT_START_10
-# 10. dbmfetch00.at:17: fetch a record
-at_setup_line='dbmfetch00.at:17'
-at_func_banner 2
-at_desc="fetch a record"
-$at_quiet $as_echo_n " 10: $at_desc                                 "
+at_fn_group_banner 10 'dbmfetch00.at:17' \
+  "fetch a record" "                                 " 2
 at_xfail=no
-echo "#                             -*- compilation -*-" >> "$at_group_log"
 (
-  $as_echo "10. dbmfetch00.at:17: testing ..."
+  $as_echo "10. $at_setup_line: testing $at_desc ..."
   $at_traceon
 
 
 
-{ $at_traceoff
+{ set +x
 $as_echo "$at_srcdir/dbmfetch00.at:20:
 
-test $COMPAT -eq 1 || exit 77
+test \$COMPAT -eq 1 || exit 77
 
 num2word 1:10000 | dtload test
 dtfetch test 1 2745 9999
 "
-echo dbmfetch00.at:20 >"$at_check_line_file"
-
-if { echo 'Not enabling shell tracing (command contains an embedded newline)'
-   false; }; then
-  ( $at_traceon;
+at_fn_check_prepare_notrace 'an embedded newline' "dbmfetch00.at:20"
+( $at_check_trace;
 
 test $COMPAT -eq 1 || exit 77
 
 num2word 1:10000 | dtload test
 dtfetch test 1 2745 9999
- ) >"$at_stdout" 2>"$at_stder1"
-  at_func_filter_trace $?
-else
-  ( :;
-
-test $COMPAT -eq 1 || exit 77
 
-num2word 1:10000 | dtload test
-dtfetch test 1 2745 9999
- ) >"$at_stdout" 2>"$at_stderr"
-fi
-at_status=$?
-at_failed=false
-at_func_diff_devnull "$at_stderr" || at_failed=:
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
 echo >>"$at_stdout"; $as_echo "one
 two thousand seven hundred and fourty-five
 nine thousand nine hundred and ninety-nine
 " | \
   $at_diff - "$at_stdout" || at_failed=:
-at_func_check_status 0 $at_status "$at_srcdir/dbmfetch00.at:20"
-
-$at_failed && at_func_log_failure
+at_fn_check_status 0 $at_status "$at_srcdir/dbmfetch00.at:20"
+$at_failed && at_fn_log_failure
 $at_traceon; }
 
 
-  $at_traceoff
+  set +x
   $at_times_p && times >"$at_times_file"
-) 5>&1 2>&1 | eval $at_tee_pipe
-at_status=`cat "$at_status_file"`
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
 #AT_STOP_10
 #AT_START_11
-# 11. dbmfetch01.at:17: fetch: nonexisting record
-at_setup_line='dbmfetch01.at:17'
-at_func_banner 2
-at_desc="fetch: nonexisting record"
-$at_quiet $as_echo_n " 11: $at_desc                      "
+at_fn_group_banner 11 'dbmfetch01.at:17' \
+  "fetch: nonexisting record" "                      " 2
 at_xfail=no
-echo "#                             -*- compilation -*-" >> "$at_group_log"
 (
-  $as_echo "11. dbmfetch01.at:17: testing ..."
+  $as_echo "11. $at_setup_line: testing $at_desc ..."
   $at_traceon
 
 
 
-{ $at_traceoff
+{ set +x
 $as_echo "$at_srcdir/dbmfetch01.at:20:
 
-test $COMPAT -eq 1 || exit 77
+test \$COMPAT -eq 1 || exit 77
 
 num2word 1:10000 | dtload test
 dtfetch test 0
 "
-echo dbmfetch01.at:20 >"$at_check_line_file"
-
-if { echo 'Not enabling shell tracing (command contains an embedded newline)'
-   false; }; then
-  ( $at_traceon;
+at_fn_check_prepare_notrace 'an embedded newline' "dbmfetch01.at:20"
+( $at_check_trace;
 
 test $COMPAT -eq 1 || exit 77
 
 num2word 1:10000 | dtload test
 dtfetch test 0
- ) >"$at_stdout" 2>"$at_stder1"
-  at_func_filter_trace $?
-else
-  ( :;
 
-test $COMPAT -eq 1 || exit 77
-
-num2word 1:10000 | dtload test
-dtfetch test 0
- ) >"$at_stdout" 2>"$at_stderr"
-fi
-at_status=$?
-at_failed=false
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
 echo >>"$at_stderr"; $as_echo "dtfetch: 0: not found
 " | \
   $at_diff - "$at_stderr" || at_failed=:
-at_func_diff_devnull "$at_stdout" || at_failed=:
-at_func_check_status 2 $at_status "$at_srcdir/dbmfetch01.at:20"
-
-$at_failed && at_func_log_failure
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 2 $at_status "$at_srcdir/dbmfetch01.at:20"
+$at_failed && at_fn_log_failure
 $at_traceon; }
 
 
-  $at_traceoff
+  set +x
   $at_times_p && times >"$at_times_file"
-) 5>&1 2>&1 | eval $at_tee_pipe
-at_status=`cat "$at_status_file"`
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
 #AT_STOP_11
 #AT_START_12
-# 12. dbmfetch02.at:17: fetch from a read-only database
-at_setup_line='dbmfetch02.at:17'
-at_func_banner 2
-at_desc="fetch from a read-only database"
-$at_quiet $as_echo_n " 12: $at_desc                "
+at_fn_group_banner 12 'dbmfetch02.at:17' \
+  "fetch from a read-only database" "                " 2
 at_xfail=no
-echo "#                             -*- compilation -*-" >> "$at_group_log"
 (
-  $as_echo "12. dbmfetch02.at:17: testing ..."
+  $as_echo "12. $at_setup_line: testing $at_desc ..."
   $at_traceon
 
 
 
-{ $at_traceoff
+{ set +x
 $as_echo "$at_srcdir/dbmfetch02.at:20:
 
-test $COMPAT -eq 1 || exit 77
+test \$COMPAT -eq 1 || exit 77
 
 num2word 1:10 | dtload test
 chmod -w test.dir test.pag
 dtfetch test 6 10
 "
-echo dbmfetch02.at:20 >"$at_check_line_file"
-
-if { echo 'Not enabling shell tracing (command contains an embedded newline)'
-   false; }; then
-  ( $at_traceon;
+at_fn_check_prepare_notrace 'an embedded newline' "dbmfetch02.at:20"
+( $at_check_trace;
 
 test $COMPAT -eq 1 || exit 77
 
 num2word 1:10 | dtload test
 chmod -w test.dir test.pag
 dtfetch test 6 10
- ) >"$at_stdout" 2>"$at_stder1"
-  at_func_filter_trace $?
-else
-  ( :;
-
-test $COMPAT -eq 1 || exit 77
 
-num2word 1:10 | dtload test
-chmod -w test.dir test.pag
-dtfetch test 6 10
- ) >"$at_stdout" 2>"$at_stderr"
-fi
-at_status=$?
-at_failed=false
-at_func_diff_devnull "$at_stderr" || at_failed=:
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
 echo >>"$at_stdout"; $as_echo "six
 ten
 " | \
   $at_diff - "$at_stdout" || at_failed=:
-at_func_check_status 0 $at_status "$at_srcdir/dbmfetch02.at:20"
-
-$at_failed && at_func_log_failure
+at_fn_check_status 0 $at_status "$at_srcdir/dbmfetch02.at:20"
+$at_failed && at_fn_log_failure
 $at_traceon; }
 
 
-  $at_traceoff
+  set +x
   $at_times_p && times >"$at_times_file"
-) 5>&1 2>&1 | eval $at_tee_pipe
-at_status=`cat "$at_status_file"`
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
 #AT_STOP_12
 #AT_START_13
-# 13. dbmfetch03.at:17: fetch from a read-only 1.8-style database
-at_setup_line='dbmfetch03.at:17'
-at_func_banner 2
-at_desc="fetch from a read-only 1.8-style database"
-$at_quiet $as_echo_n " 13: $at_desc      "
+at_fn_group_banner 13 'dbmfetch03.at:17' \
+  "fetch from a read-only 1.8-style database" "      " 2
 at_xfail=no
-echo "#                             -*- compilation -*-" >> "$at_group_log"
 (
-  $as_echo "13. dbmfetch03.at:17: testing ..."
+  $as_echo "13. $at_setup_line: testing $at_desc ..."
   $at_traceon
 
 
 
-{ $at_traceoff
+{ set +x
 $as_echo "$at_srcdir/dbmfetch03.at:20:
 
-test $COMPAT -eq 1 || exit 77
+test \$COMPAT -eq 1 || exit 77
 
 mkdir dir
 cd dir
@@ -2625,11 +2559,8 @@ ln test.pag test.dir
 chmod -w test.dir test.pag .
 dtfetch test 6 10
 "
-echo dbmfetch03.at:20 >"$at_check_line_file"
-
-if { echo 'Not enabling shell tracing (command contains an embedded newline)'
-   false; }; then
-  ( $at_traceon;
+at_fn_check_prepare_notrace 'an embedded newline' "dbmfetch03.at:20"
+( $at_check_trace;
 
 test $COMPAT -eq 1 || exit 77
 
@@ -2640,71 +2571,49 @@ rm test.dir
 ln test.pag test.dir
 chmod -w test.dir test.pag .
 dtfetch test 6 10
- ) >"$at_stdout" 2>"$at_stder1"
-  at_func_filter_trace $?
-else
-  ( :;
-
-test $COMPAT -eq 1 || exit 77
 
-mkdir dir
-cd dir
-num2word 1:10 | dtload test
-rm test.dir
-ln test.pag test.dir
-chmod -w test.dir test.pag .
-dtfetch test 6 10
- ) >"$at_stdout" 2>"$at_stderr"
-fi
-at_status=$?
-at_failed=false
-at_func_diff_devnull "$at_stderr" || at_failed=:
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
 echo >>"$at_stdout"; $as_echo "six
 ten
 " | \
   $at_diff - "$at_stdout" || at_failed=:
-at_func_check_status 0 $at_status "$at_srcdir/dbmfetch03.at:20"
-
-$at_failed && at_func_log_failure
+at_fn_check_status 0 $at_status "$at_srcdir/dbmfetch03.at:20"
+$at_failed && at_fn_log_failure
 $at_traceon; }
 
 
-  $at_traceoff
+  set +x
   $at_times_p && times >"$at_times_file"
-) 5>&1 2>&1 | eval $at_tee_pipe
-at_status=`cat "$at_status_file"`
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
 #AT_STOP_13
 #AT_START_14
-# 14. dbmdel00.at:17: delete a record
-at_setup_line='dbmdel00.at:17'
-at_func_banner 2
-at_desc="delete a record"
-$at_quiet $as_echo_n " 14: $at_desc                                "
+at_fn_group_banner 14 'dbmdel00.at:17' \
+  "delete a record" "                                " 2
 at_xfail=no
-echo "#                             -*- compilation -*-" >> "$at_group_log"
 (
-  $as_echo "14. dbmdel00.at:17: testing ..."
+  $as_echo "14. $at_setup_line: testing $at_desc ..."
   $at_traceon
 
 
 
-{ $at_traceoff
+{ set +x
 $as_echo "$at_srcdir/dbmdel00.at:20:
 
-test $COMPAT -eq 1 || exit 77
+test \$COMPAT -eq 1 || exit 77
 
 
-test -z "`sort < /dev/null 2>&1`" || exit 77
+test -z \"\`sort < /dev/null 2>&1\`\" || exit 77
 
 num2word 1:10 | dtload test
 dtdel test 8
 dtdump test | sort -k1,2 -n
 "
-echo dbmdel00.at:20 >"$at_check_line_file"
-
-if { echo 'Not enabling shell tracing (command contains an embedded newline)'
-   false; }; then
-  ( $at_traceon;
+at_fn_check_prepare_notrace 'a `...` command substitution' "dbmdel00.at:20"
+( $at_check_trace;
 
 test $COMPAT -eq 1 || exit 77
 
@@ -2714,24 +2623,11 @@ test -z "`sort < /dev/null 2>&1`" || exit 77
 num2word 1:10 | dtload test
 dtdel test 8
 dtdump test | sort -k1,2 -n
- ) >"$at_stdout" 2>"$at_stder1"
-  at_func_filter_trace $?
-else
-  ( :;
-
-test $COMPAT -eq 1 || exit 77
 
-
-test -z "`sort < /dev/null 2>&1`" || exit 77
-
-num2word 1:10 | dtload test
-dtdel test 8
-dtdump test | sort -k1,2 -n
- ) >"$at_stdout" 2>"$at_stderr"
-fi
-at_status=$?
-at_failed=false
-at_func_diff_devnull "$at_stderr" || at_failed=:
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
 echo >>"$at_stdout"; $as_echo "1       one
 2      two
 3      three
@@ -2743,47 +2639,39 @@ echo >>"$at_stdout"; $as_echo "1        one
 10     ten
 " | \
   $at_diff - "$at_stdout" || at_failed=:
-at_func_check_status 0 $at_status "$at_srcdir/dbmdel00.at:20"
-
-$at_failed && at_func_log_failure
+at_fn_check_status 0 $at_status "$at_srcdir/dbmdel00.at:20"
+$at_failed && at_fn_log_failure
 $at_traceon; }
 
 
-  $at_traceoff
+  set +x
   $at_times_p && times >"$at_times_file"
-) 5>&1 2>&1 | eval $at_tee_pipe
-at_status=`cat "$at_status_file"`
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
 #AT_STOP_14
 #AT_START_15
-# 15. dbmdel01.at:17: delete: non existing record
-at_setup_line='dbmdel01.at:17'
-at_func_banner 2
-at_desc="delete: non existing record"
-$at_quiet $as_echo_n " 15: $at_desc                    "
+at_fn_group_banner 15 'dbmdel01.at:17' \
+  "delete: non existing record" "                    " 2
 at_xfail=no
-echo "#                             -*- compilation -*-" >> "$at_group_log"
 (
-  $as_echo "15. dbmdel01.at:17: testing ..."
+  $as_echo "15. $at_setup_line: testing $at_desc ..."
   $at_traceon
 
 
 
-{ $at_traceoff
+{ set +x
 $as_echo "$at_srcdir/dbmdel01.at:20:
 
-test $COMPAT -eq 1 || exit 77
+test \$COMPAT -eq 1 || exit 77
 
 
-test -z "`sort < /dev/null 2>&1`" || exit 77
+test -z \"\`sort < /dev/null 2>&1\`\" || exit 77
 
 num2word 1:10 | dtload test
 dtdel test 11
 "
-echo dbmdel01.at:20 >"$at_check_line_file"
-
-if { echo 'Not enabling shell tracing (command contains an embedded newline)'
-   false; }; then
-  ( $at_traceon;
+at_fn_check_prepare_notrace 'a `...` command substitution' "dbmdel01.at:20"
+( $at_check_trace;
 
 test $COMPAT -eq 1 || exit 77
 
@@ -2792,135 +2680,91 @@ test -z "`sort < /dev/null 2>&1`" || exit 77
 
 num2word 1:10 | dtload test
 dtdel test 11
- ) >"$at_stdout" 2>"$at_stder1"
-  at_func_filter_trace $?
-else
-  ( :;
-
-test $COMPAT -eq 1 || exit 77
-
-
-test -z "`sort < /dev/null 2>&1`" || exit 77
 
-num2word 1:10 | dtload test
-dtdel test 11
- ) >"$at_stdout" 2>"$at_stderr"
-fi
-at_status=$?
-at_failed=false
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
 echo >>"$at_stderr"; $as_echo "dtdel: cannot delete 11: Item not found
 " | \
   $at_diff - "$at_stderr" || at_failed=:
-at_func_diff_devnull "$at_stdout" || at_failed=:
-at_func_check_status 2 $at_status "$at_srcdir/dbmdel01.at:20"
-
-$at_failed && at_func_log_failure
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 2 $at_status "$at_srcdir/dbmdel01.at:20"
+$at_failed && at_fn_log_failure
 $at_traceon; }
 
 
-  $at_traceoff
+  set +x
   $at_times_p && times >"$at_times_file"
-) 5>&1 2>&1 | eval $at_tee_pipe
-at_status=`cat "$at_status_file"`
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
 #AT_STOP_15
 #AT_START_16
-# 16. dbmdel02.at:17: delete: all records
-at_setup_line='dbmdel02.at:17'
-at_func_banner 2
-at_desc="delete: all records"
-$at_quiet $as_echo_n " 16: $at_desc                            "
+at_fn_group_banner 16 'dbmdel02.at:17' \
+  "delete: all records" "                            " 2
 at_xfail=no
-echo "#                             -*- compilation -*-" >> "$at_group_log"
 (
-  $as_echo "16. dbmdel02.at:17: testing ..."
+  $as_echo "16. $at_setup_line: testing $at_desc ..."
   $at_traceon
 
 
 
-{ $at_traceoff
+{ set +x
 $as_echo "$at_srcdir/dbmdel02.at:20:
 
-test $COMPAT -eq 1 || exit 77
+test \$COMPAT -eq 1 || exit 77
 
 num2word 1:10 | dtload test
 dtdel test 1 2 3 4 5 6 7 8 9 10
 dtdump test
 "
-echo dbmdel02.at:20 >"$at_check_line_file"
-
-if { echo 'Not enabling shell tracing (command contains an embedded newline)'
-   false; }; then
-  ( $at_traceon;
-
-test $COMPAT -eq 1 || exit 77
-
-num2word 1:10 | dtload test
-dtdel test 1 2 3 4 5 6 7 8 9 10
-dtdump test
- ) >"$at_stdout" 2>"$at_stder1"
-  at_func_filter_trace $?
-else
-  ( :;
+at_fn_check_prepare_notrace 'an embedded newline' "dbmdel02.at:20"
+( $at_check_trace;
 
 test $COMPAT -eq 1 || exit 77
 
 num2word 1:10 | dtload test
 dtdel test 1 2 3 4 5 6 7 8 9 10
 dtdump test
- ) >"$at_stdout" 2>"$at_stderr"
-fi
-at_status=$?
-at_failed=false
-at_func_diff_devnull "$at_stderr" || at_failed=:
-at_func_diff_devnull "$at_stdout" || at_failed=:
-at_func_check_status 0 $at_status "$at_srcdir/dbmdel02.at:20"
 
-$at_failed && at_func_log_failure
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/dbmdel02.at:20"
+$at_failed && at_fn_log_failure
 $at_traceon; }
 
 
-  $at_traceoff
+  set +x
   $at_times_p && times >"$at_times_file"
-) 5>&1 2>&1 | eval $at_tee_pipe
-at_status=`cat "$at_status_file"`
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
 #AT_STOP_16
 #AT_START_17
-# 17. setopt00.at:17: setopt
-at_setup_line='setopt00.at:17'
-at_func_banner 3
-at_desc="setopt"
-$at_quiet $as_echo_n " 17: $at_desc                                         "
+at_fn_group_banner 17 'setopt00.at:17' \
+  "setopt" "                                         " 3
 at_xfail=no
-echo "#                             -*- compilation -*-" >> "$at_group_log"
 (
-  $as_echo "17. setopt00.at:17: testing ..."
+  $as_echo "17. $at_setup_line: testing $at_desc ..."
   $at_traceon
 
 
 
-{ $at_traceoff
+{ set +x
 $as_echo "$at_srcdir/setopt00.at:20:
 num2word 1:1000 | gtload test.db || exit 2
 gtopt test.db '!MMAP'
 "
-echo setopt00.at:20 >"$at_check_line_file"
-
-if { echo 'Not enabling shell tracing (command contains an embedded newline)'
-   false; }; then
-  ( $at_traceon;
+at_fn_check_prepare_notrace 'an embedded newline' "setopt00.at:20"
+( $at_check_trace;
 num2word 1:1000 | gtload test.db || exit 2
 gtopt test.db '!MMAP'
- ) >"$at_stdout" 2>"$at_stder1"
-  at_func_filter_trace $?
-else
-  ( :;
-num2word 1:1000 | gtload test.db || exit 2
-gtopt test.db '!MMAP'
- ) >"$at_stdout" 2>"$at_stderr"
-fi
-at_status=$?
-at_failed=false
-at_func_diff_devnull "$at_stderr" || at_failed=:
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
 echo >>"$at_stdout"; $as_echo "GDBM_GETFLAGS: PASS
 * CACHESIZE:
 initial GDBM_SETCACHESIZE: PASS
@@ -2953,60 +2797,44 @@ GDBM_GETCOALESCEBLKS: PASS
 GDBM_GETDBNAME: PASS
 " | \
   $at_diff - "$at_stdout" || at_failed=:
-at_func_check_status 0 $at_status "$at_srcdir/setopt00.at:20"
-
-$at_failed && at_func_log_failure
+at_fn_check_status 0 $at_status "$at_srcdir/setopt00.at:20"
+$at_failed && at_fn_log_failure
 $at_traceon; }
 
 
-  $at_traceoff
+  set +x
   $at_times_p && times >"$at_times_file"
-) 5>&1 2>&1 | eval $at_tee_pipe
-at_status=`cat "$at_status_file"`
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
 #AT_STOP_17
 #AT_START_18
-# 18. setopt01.at:17: setopt: mmap options
-at_setup_line='setopt01.at:17'
-at_func_banner 3
-at_desc="setopt: mmap options"
-$at_quiet $as_echo_n " 18: $at_desc                           "
+at_fn_group_banner 18 'setopt01.at:17' \
+  "setopt: mmap options" "                           " 3
 at_xfail=no
-echo "#                             -*- compilation -*-" >> "$at_group_log"
 (
-  $as_echo "18. setopt01.at:17: testing ..."
+  $as_echo "18. $at_setup_line: testing $at_desc ..."
   $at_traceon
 
 
 
-{ $at_traceoff
+{ set +x
 $as_echo "$at_srcdir/setopt01.at:20:
 num2word 1:1000 | gtload test.db || exit 2
 gtopt test.db 'MMAP' > out
 grep 'MMAP: SKIP' out >/dev/null && exit 77
 cat out
 "
-echo setopt01.at:20 >"$at_check_line_file"
-
-if { echo 'Not enabling shell tracing (command contains an embedded newline)'
-   false; }; then
-  ( $at_traceon;
-num2word 1:1000 | gtload test.db || exit 2
-gtopt test.db 'MMAP' > out
-grep 'MMAP: SKIP' out >/dev/null && exit 77
-cat out
- ) >"$at_stdout" 2>"$at_stder1"
-  at_func_filter_trace $?
-else
-  ( :;
+at_fn_check_prepare_notrace 'an embedded newline' "setopt01.at:20"
+( $at_check_trace;
 num2word 1:1000 | gtload test.db || exit 2
 gtopt test.db 'MMAP' > out
 grep 'MMAP: SKIP' out >/dev/null && exit 77
 cat out
- ) >"$at_stdout" 2>"$at_stderr"
-fi
-at_status=$?
-at_failed=false
-at_func_diff_devnull "$at_stderr" || at_failed=:
+
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
 echo >>"$at_stdout"; $as_echo "* MMAP:
 initial GDBM_GETMMAP: PASS
 GDBM_SETMMAP false: PASS
@@ -3016,219 +2844,159 @@ GDBM_SETMAXMAPSIZE: PASS
 GDBM_GETMAXMAPSIZE: PASS
 " | \
   $at_diff - "$at_stdout" || at_failed=:
-at_func_check_status 0 $at_status "$at_srcdir/setopt01.at:20"
-
-$at_failed && at_func_log_failure
+at_fn_check_status 0 $at_status "$at_srcdir/setopt01.at:20"
+$at_failed && at_fn_log_failure
 $at_traceon; }
 
 
-  $at_traceoff
+  set +x
   $at_times_p && times >"$at_times_file"
-) 5>&1 2>&1 | eval $at_tee_pipe
-at_status=`cat "$at_status_file"`
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
 #AT_STOP_18
 #AT_START_19
-# 19. cloexec00.at:17: cloexec: gdbm_open
-at_setup_line='cloexec00.at:17'
-at_func_banner 4
-at_desc="cloexec: gdbm_open"
-$at_quiet $as_echo_n " 19: $at_desc                             "
+at_fn_group_banner 19 'cloexec00.at:17' \
+  "cloexec: gdbm_open" "                             " 4
 at_xfail=no
-echo "#                             -*- compilation -*-" >> "$at_group_log"
 (
-  $as_echo "19. cloexec00.at:17: testing ..."
+  $as_echo "19. $at_setup_line: testing $at_desc ..."
   $at_traceon
 
 
 
-{ $at_traceoff
+{ set +x
 $as_echo "$at_srcdir/cloexec00.at:20:
 g_open_ce \"\$abs_builddir/fdop\"
 "
-echo cloexec00.at:20 >"$at_check_line_file"
-
-if { echo 'Not enabling shell tracing (command contains an embedded newline)'
-   false; }; then
-  ( $at_traceon;
+at_fn_check_prepare_notrace 'an embedded newline' "cloexec00.at:20"
+( $at_check_trace;
 g_open_ce "$abs_builddir/fdop"
- ) >"$at_stdout" 2>"$at_stder1"
-  at_func_filter_trace $?
-else
-  ( :;
-g_open_ce "$abs_builddir/fdop"
- ) >"$at_stdout" 2>"$at_stderr"
-fi
-at_status=$?
-at_failed=false
-at_func_diff_devnull "$at_stderr" || at_failed=:
-at_func_diff_devnull "$at_stdout" || at_failed=:
-at_func_check_status 0 $at_status "$at_srcdir/cloexec00.at:20"
 
-$at_failed && at_func_log_failure
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/cloexec00.at:20"
+$at_failed && at_fn_log_failure
 $at_traceon; }
 
 
-  $at_traceoff
+  set +x
   $at_times_p && times >"$at_times_file"
-) 5>&1 2>&1 | eval $at_tee_pipe
-at_status=`cat "$at_status_file"`
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
 #AT_STOP_19
 #AT_START_20
-# 20. cloexec01.at:17: cloexec: gdbm_reorganize
-at_setup_line='cloexec01.at:17'
-at_func_banner 4
-at_desc="cloexec: gdbm_reorganize"
-$at_quiet $as_echo_n " 20: $at_desc                       "
+at_fn_group_banner 20 'cloexec01.at:17' \
+  "cloexec: gdbm_reorganize" "                       " 4
 at_xfail=no
-echo "#                             -*- compilation -*-" >> "$at_group_log"
 (
-  $as_echo "20. cloexec01.at:17: testing ..."
+  $as_echo "20. $at_setup_line: testing $at_desc ..."
   $at_traceon
 
 
 
-{ $at_traceoff
+{ set +x
 $as_echo "$at_srcdir/cloexec01.at:20:
 g_reorg_ce \"\$abs_builddir/fdop\"
 "
-echo cloexec01.at:20 >"$at_check_line_file"
-
-if { echo 'Not enabling shell tracing (command contains an embedded newline)'
-   false; }; then
-  ( $at_traceon;
+at_fn_check_prepare_notrace 'an embedded newline' "cloexec01.at:20"
+( $at_check_trace;
 g_reorg_ce "$abs_builddir/fdop"
- ) >"$at_stdout" 2>"$at_stder1"
-  at_func_filter_trace $?
-else
-  ( :;
-g_reorg_ce "$abs_builddir/fdop"
- ) >"$at_stdout" 2>"$at_stderr"
-fi
-at_status=$?
-at_failed=false
-at_func_diff_devnull "$at_stderr" || at_failed=:
-at_func_diff_devnull "$at_stdout" || at_failed=:
-at_func_check_status 0 $at_status "$at_srcdir/cloexec01.at:20"
 
-$at_failed && at_func_log_failure
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/cloexec01.at:20"
+$at_failed && at_fn_log_failure
 $at_traceon; }
 
 
-  $at_traceoff
+  set +x
   $at_times_p && times >"$at_times_file"
-) 5>&1 2>&1 | eval $at_tee_pipe
-at_status=`cat "$at_status_file"`
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
 #AT_STOP_20
 #AT_START_21
-# 21. cloexec02.at:17: cloexec: dbm_open
-at_setup_line='cloexec02.at:17'
-at_func_banner 4
-at_desc="cloexec: dbm_open"
-$at_quiet $as_echo_n " 21: $at_desc                              "
+at_fn_group_banner 21 'cloexec02.at:17' \
+  "cloexec: dbm_open" "                              " 4
 at_xfail=no
-echo "#                             -*- compilation -*-" >> "$at_group_log"
 (
-  $as_echo "21. cloexec02.at:17: testing ..."
+  $as_echo "21. $at_setup_line: testing $at_desc ..."
   $at_traceon
 
 
 
-{ $at_traceoff
+{ set +x
 $as_echo "$at_srcdir/cloexec02.at:20:
 
-test $COMPAT -eq 1 || exit 77
+test \$COMPAT -eq 1 || exit 77
 
 num2word 1:10 | dtload file
 d_creat_ce \"\$abs_builddir/fdop\"
 "
-echo cloexec02.at:20 >"$at_check_line_file"
-
-if { echo 'Not enabling shell tracing (command contains an embedded newline)'
-   false; }; then
-  ( $at_traceon;
-
-test $COMPAT -eq 1 || exit 77
-
-num2word 1:10 | dtload file
-d_creat_ce "$abs_builddir/fdop"
- ) >"$at_stdout" 2>"$at_stder1"
-  at_func_filter_trace $?
-else
-  ( :;
+at_fn_check_prepare_notrace 'an embedded newline' "cloexec02.at:20"
+( $at_check_trace;
 
 test $COMPAT -eq 1 || exit 77
 
 num2word 1:10 | dtload file
 d_creat_ce "$abs_builddir/fdop"
- ) >"$at_stdout" 2>"$at_stderr"
-fi
-at_status=$?
-at_failed=false
-at_func_diff_devnull "$at_stderr" || at_failed=:
-at_func_diff_devnull "$at_stdout" || at_failed=:
-at_func_check_status 0 $at_status "$at_srcdir/cloexec02.at:20"
 
-$at_failed && at_func_log_failure
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/cloexec02.at:20"
+$at_failed && at_fn_log_failure
 $at_traceon; }
 
 
-  $at_traceoff
+  set +x
   $at_times_p && times >"$at_times_file"
-) 5>&1 2>&1 | eval $at_tee_pipe
-at_status=`cat "$at_status_file"`
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
 #AT_STOP_21
 #AT_START_22
-# 22. cloexec03.at:17: cloexec: dbm_open -creat
-at_setup_line='cloexec03.at:17'
-at_func_banner 4
-at_desc="cloexec: dbm_open -creat"
-$at_quiet $as_echo_n " 22: $at_desc                       "
+at_fn_group_banner 22 'cloexec03.at:17' \
+  "cloexec: dbm_open -creat" "                       " 4
 at_xfail=no
-echo "#                             -*- compilation -*-" >> "$at_group_log"
 (
-  $as_echo "22. cloexec03.at:17: testing ..."
+  $as_echo "22. $at_setup_line: testing $at_desc ..."
   $at_traceon
 
 
 
-{ $at_traceoff
+{ set +x
 $as_echo "$at_srcdir/cloexec03.at:20:
 
-test $COMPAT -eq 1 || exit 77
+test \$COMPAT -eq 1 || exit 77
 
 d_creat_ce \"\$abs_builddir/fdop\" -creat
 "
-echo cloexec03.at:20 >"$at_check_line_file"
-
-if { echo 'Not enabling shell tracing (command contains an embedded newline)'
-   false; }; then
-  ( $at_traceon;
-
-test $COMPAT -eq 1 || exit 77
-
-d_creat_ce "$abs_builddir/fdop" -creat
- ) >"$at_stdout" 2>"$at_stder1"
-  at_func_filter_trace $?
-else
-  ( :;
+at_fn_check_prepare_notrace 'an embedded newline' "cloexec03.at:20"
+( $at_check_trace;
 
 test $COMPAT -eq 1 || exit 77
 
 d_creat_ce "$abs_builddir/fdop" -creat
- ) >"$at_stdout" 2>"$at_stderr"
-fi
-at_status=$?
-at_failed=false
-at_func_diff_devnull "$at_stderr" || at_failed=:
-at_func_diff_devnull "$at_stdout" || at_failed=:
-at_func_check_status 0 $at_status "$at_srcdir/cloexec03.at:20"
 
-$at_failed && at_func_log_failure
+) >>"$at_stdout" 2>>"$at_stderr" 5>&-
+at_status=$? at_failed=false
+$at_check_filter
+at_fn_diff_devnull "$at_stderr" || at_failed=:
+at_fn_diff_devnull "$at_stdout" || at_failed=:
+at_fn_check_status 0 $at_status "$at_srcdir/cloexec03.at:20"
+$at_failed && at_fn_log_failure
 $at_traceon; }
 
 
-  $at_traceoff
+  set +x
   $at_times_p && times >"$at_times_file"
-) 5>&1 2>&1 | eval $at_tee_pipe
-at_status=`cat "$at_status_file"`
+) 5>&1 2>&1 7>&- | eval $at_tee_pipe
+read at_status <"$at_status_file"
 #AT_STOP_22