]> git.ipfire.org Git - thirdparty/bash.git/commitdiff
commit bash-20120914 snapshot
authorChet Ramey <chet@caleb.ins.cwru.edu>
Wed, 10 Oct 2012 13:36:15 +0000 (09:36 -0400)
committerChet Ramey <chet@caleb.ins.cwru.edu>
Wed, 10 Oct 2012 13:36:15 +0000 (09:36 -0400)
23 files changed:
CWRU/CWRU.chlog
CWRU/CWRU.chlog~
autom4te.cache/output.3
autom4te.cache/traces.3
bashline.c
config.h.in
configure
configure.ac
doc/bashref.texi
doc/version.texi
execute_cmd.c
execute_cmd.c~ [new file with mode: 0644]
lib/glob/sm_loop.c
lib/glob/sm_loop.c~ [new file with mode: 0644]
lib/readline/colors.h
lib/readline/colors.h~ [new file with mode: 0644]
lib/sh/shquote.c
lib/sh/shquote.c~ [new file with mode: 0644]
parse.y
po/vi.po
shell.c
subst.c
subst.c~ [new file with mode: 0644]

index 278c047fbe138180abd6684442f241c93d9f9835..59f95de912d0fd961d8b3e9891e7f75270205b3d 100644 (file)
@@ -3537,3 +3537,43 @@ expr.c
          short-circuiting evaluation completely.  readtok will leave curtok
          set correctly without re-entering the evaluator at all.  Rest of
          fix for bug reported by Dan Douglas <ormaaj@gmail.com>
+
+                                  9/11
+                                  ----
+
+parse.y
+       - parse_comsub: make sure the `reserved word ok in this context' flag
+         is preserved after we read `do' followed by whitespace.  Fixes bug
+         reported by Benoit Vaugon <benoit.vaugon@gmail.com>
+
+                                  9/13
+                                  ----
+configure.ac,config.h.in
+       - enable-direxpand-default: new configure option, turns the `direxpand'
+         shell option on by default
+
+bashline.c
+       - dircomplete_expand, dircomplete_expand_relpath: initialize to 1 if
+         DIRCOMPLETE_EXPAND_DEFAULT is defined and non-zero
+
+doc/bashref.texi
+       - enable-direxpand-default: document new configure option
+
+                                  9/14
+                                  ----
+shell.c
+       - --protected: make option valid only when wordexp is compiled into
+         the shell.  Fix from Roman Rakus <rrakus@redhat.com>
+
+configure.ac
+       - HP NonStop (*-nsk*): compile --without-bash-malloc. Change from
+         Joachim Schmitz <jojo@schmitz-digital.de>
+
+                                  9/16
+                                  ----
+subst.c,execute_cmd.c,lib/glob/sm_loop.c,lib/sh/shquote.c
+       - minor code cleanups from Joachim Schmitz <jojo@schmitz-digital.de>
+
+lib/readline/colors.h
+       - workaround for HP NonStop compiler issue with <stdbool.h> from
+         Joachim Schmitz <jojo@schmitz-digital.de>
index 502228207ea0708ca7fafab750420211addf3300..32ab9149cc7e0389a3a2d20cea04ef350da009f2 100644 (file)
@@ -3508,10 +3508,6 @@ redir.c
                                    9/8
                                    ---
 expr.c
-       - expr_streval: save and restore the value of `noeval' around any call
-         to get_array_value, since that can end up recursively calling
-         evalexp to perform array subscript evaluation.  Fixes bug reported
-         by Dan Douglas <ormaaj@gmail.com>
        - readtok: invalidate previous contents of `curlval' before freeing
          and reallocating tokstr (which, chances are, will get the same
          pointer as before and render curlval inconsistent).  Fixes other
@@ -3535,3 +3531,45 @@ lib/readline/display.c
 lib/readline/{terminal.c,rlprivate.h}
        - move CUSTOM_REDISPLAY_FUNC and CUSTOM_INPUT_FUNC defines from
          terminal.c to rlprivate.h so other files can use them
+
+expr.c
+       - expr_streval: if noeval is non-zero, just return 0 right away,
+         short-circuiting evaluation completely.  readtok will leave curtok
+         set correctly without re-entering the evaluator at all.  Rest of
+         fix for bug reported by Dan Douglas <ormaaj@gmail.com>
+
+                                  9/11
+                                  ----
+
+parse.y
+       - parse_comsub: make sure the `reserved word ok in this context' flag
+         is preserved after we read `do' followed by whitespace.  Fixes bug
+         reported by Benoit Vaugon <benoit.vaugon@gmail.com>
+
+                                  9/13
+                                  ----
+configure.ac,config.h.in
+       - enable-direxpand-default: new configure option, turns the `direxpand'
+         shell option on by default
+
+bashline.c
+       - dircomplete_expand, dircomplete_expand_relpath: initialize to 1 if
+         DIRCOMPLETE_EXPAND_DEFAULT is defined and non-zero
+
+doc/bashref.texi
+       - enable-direxpand-default: document new configure option
+
+                                  9/14
+                                  ----
+shell.c
+       - --protected: make option valid only when wordexp is compiled into
+         the shell.  Fix from Roman Rakus <rrakus@redhat.com>
+
+configure.ac
+       - HP NonStop (*-nsk*): compile --without-bash-malloc. Change from
+         Joachim Schmitz <jojo@schmitz-digital.de>
+
+                                  9/16
+                                  ----
+subst.c,execute_cmd.c,lib/glob/sm_loop.c,lib/sh/shquote.c
+       - minor code cleanups from Joachim Schmitz <jojo@schmitz-digital.de>
index 96bc37b30e731f794b18ff9845662f9bdfe7f4eb..8974b3196eae94c93efe5de0d5cbd8ead436cdfa 100644 (file)
@@ -1,5 +1,5 @@
 @%:@! /bin/sh
-@%:@ From configure.ac for Bash 4.2, version 4.050.
+@%:@ From configure.ac for Bash 4.2, version 4.052.
 @%:@ Guess values for system-dependent variables and create Makefiles.
 @%:@ Generated by GNU Autoconf 2.68 for bash 4.2-maint.
 @%:@
@@ -783,6 +783,7 @@ enable_cond_command
 enable_cond_regexp
 enable_coprocesses
 enable_debugger
+enable_direxpand_default
 enable_directory_stack
 enable_disabled_builtins
 enable_dparen_arithmetic
@@ -1466,6 +1467,8 @@ Optional Features:
   --enable-coprocesses    enable coprocess support and the coproc reserved
                           word
   --enable-debugger       enable support for bash debugger
+  --enable-direxpand-default 
+                          enable the direxpand shell option by default
   --enable-directory-stack 
                           enable builtins pushd/popd/dirs
   --enable-disabled-builtins 
@@ -2837,6 +2840,7 @@ sparc-linux*)     opt_bash_malloc=no ;;   # sparc running linux; requires ELF
 *-beos*)       opt_bash_malloc=no ;;   # they say it's suitable
 *-cygwin*)     opt_bash_malloc=no ;;   # Cygnus's CYGWIN environment
 *-opennt*|*-interix*)  opt_bash_malloc=no ;;   # Interix, now owned by Microsoft
+*-nsk*)                opt_bash_malloc=no ;;   # HP NonStop
 esac
 
 # memory scrambling on free()
@@ -2967,6 +2971,7 @@ opt_single_longdoc_strings=yes
 opt_casemod_attrs=yes
 opt_casemod_expansions=yes
 opt_extglob_default=no
+opt_dircomplete_expand_default=no
 
 opt_static_link=no
 opt_profiling=no
@@ -3049,6 +3054,11 @@ if test "${enable_debugger+set}" = set; then :
   enableval=$enable_debugger; opt_debugger=$enableval
 fi
 
+@%:@ Check whether --enable-direxpand-default was given.
+if test "${enable_direxpand_default+set}" = set; then :
+  enableval=$enable_direxpand_default; opt_dircomplete_expand_default=$enableval
+fi
+
 @%:@ Check whether --enable-directory-stack was given.
 if test "${enable_directory_stack+set}" = set; then :
   enableval=$enable_directory_stack; opt_dirstack=$enableval
@@ -3284,6 +3294,10 @@ fi
 if test $opt_casemod_expansions = yes; then
 $as_echo "@%:@define CASEMOD_EXPANSIONS 1" >>confdefs.h
 
+fi
+if test $opt_dircomplete_expand_default = yes; then
+$as_echo "@%:@define DIRCOMPLETE_EXPAND_DEFAULT 1" >>confdefs.h
+
 fi
 
 if test $opt_memscramble = yes; then
index b09e4820b7075adfcebc3cbf36511e9643f4980a..8994efa02991a012acf013ea71c780964730d671 100644 (file)
@@ -177,12 +177,9 @@ m4trace:configure.ac:51: -1- AC_SUBST([host_os])
 m4trace:configure.ac:51: -1- AC_SUBST_TRACE([host_os])
 m4trace:configure.ac:51: -1- m4_pattern_allow([^host_os$])
 m4trace:configure.ac:52: -1- AC_CANONICAL_BUILD
-m4trace:configure.ac:104: -1- AC_SUBST([DEBUGGER_START_FILE])
-m4trace:configure.ac:104: -1- AC_SUBST_TRACE([DEBUGGER_START_FILE])
-m4trace:configure.ac:104: -1- m4_pattern_allow([^DEBUGGER_START_FILE$])
-m4trace:configure.ac:108: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete.
-You should run autoupdate.], [../../lib/autoconf/general.m4:209: AC_HELP_STRING is expanded from...
-configure.ac:108: the top level])
+m4trace:configure.ac:105: -1- AC_SUBST([DEBUGGER_START_FILE])
+m4trace:configure.ac:105: -1- AC_SUBST_TRACE([DEBUGGER_START_FILE])
+m4trace:configure.ac:105: -1- m4_pattern_allow([^DEBUGGER_START_FILE$])
 m4trace:configure.ac:109: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:209: AC_HELP_STRING is expanded from...
 configure.ac:109: the top level])
@@ -201,21 +198,18 @@ configure.ac:113: the top level])
 m4trace:configure.ac:114: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:209: AC_HELP_STRING is expanded from...
 configure.ac:114: the top level])
-m4trace:configure.ac:125: -1- AC_DEFINE_TRACE_LITERAL([USING_BASH_MALLOC])
-m4trace:configure.ac:125: -1- m4_pattern_allow([^USING_BASH_MALLOC$])
-m4trace:configure.ac:135: -1- AC_DEFINE_TRACE_LITERAL([DISABLE_MALLOC_WRAPPERS])
-m4trace:configure.ac:135: -1- m4_pattern_allow([^DISABLE_MALLOC_WRAPPERS$])
-m4trace:configure.ac:145: -1- AC_DEFINE_TRACE_LITERAL([AFS])
-m4trace:configure.ac:145: -1- m4_pattern_allow([^AFS$])
-m4trace:configure.ac:197: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete.
-You should run autoupdate.], [../../lib/autoconf/general.m4:209: AC_HELP_STRING is expanded from...
-configure.ac:197: the top level])
-m4trace:configure.ac:213: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete.
+m4trace:configure.ac:115: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:209: AC_HELP_STRING is expanded from...
-configure.ac:213: the top level])
-m4trace:configure.ac:214: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete.
+configure.ac:115: the top level])
+m4trace:configure.ac:126: -1- AC_DEFINE_TRACE_LITERAL([USING_BASH_MALLOC])
+m4trace:configure.ac:126: -1- m4_pattern_allow([^USING_BASH_MALLOC$])
+m4trace:configure.ac:136: -1- AC_DEFINE_TRACE_LITERAL([DISABLE_MALLOC_WRAPPERS])
+m4trace:configure.ac:136: -1- m4_pattern_allow([^DISABLE_MALLOC_WRAPPERS$])
+m4trace:configure.ac:146: -1- AC_DEFINE_TRACE_LITERAL([AFS])
+m4trace:configure.ac:146: -1- m4_pattern_allow([^AFS$])
+m4trace:configure.ac:199: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:209: AC_HELP_STRING is expanded from...
-configure.ac:214: the top level])
+configure.ac:199: the top level])
 m4trace:configure.ac:215: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:209: AC_HELP_STRING is expanded from...
 configure.ac:215: the top level])
@@ -309,215 +303,226 @@ configure.ac:244: the top level])
 m4trace:configure.ac:245: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:209: AC_HELP_STRING is expanded from...
 configure.ac:245: the top level])
+m4trace:configure.ac:246: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:209: AC_HELP_STRING is expanded from...
+configure.ac:246: the top level])
+m4trace:configure.ac:247: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:209: AC_HELP_STRING is expanded from...
+configure.ac:247: the top level])
 m4trace:configure.ac:248: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:209: AC_HELP_STRING is expanded from...
 configure.ac:248: the top level])
-m4trace:configure.ac:249: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete.
+m4trace:configure.ac:251: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete.
+You should run autoupdate.], [../../lib/autoconf/general.m4:209: AC_HELP_STRING is expanded from...
+configure.ac:251: the top level])
+m4trace:configure.ac:252: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:209: AC_HELP_STRING is expanded from...
-configure.ac:249: the top level])
-m4trace:configure.ac:250: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete.
+configure.ac:252: the top level])
+m4trace:configure.ac:253: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:209: AC_HELP_STRING is expanded from...
-configure.ac:250: the top level])
-m4trace:configure.ac:253: -1- AC_SUBST([CC_FOR_BUILD])
-m4trace:configure.ac:253: -1- AC_SUBST_TRACE([CC_FOR_BUILD])
-m4trace:configure.ac:253: -1- m4_pattern_allow([^CC_FOR_BUILD$])
-m4trace:configure.ac:254: -1- AC_SUBST([CFLAGS_FOR_BUILD])
-m4trace:configure.ac:254: -1- AC_SUBST_TRACE([CFLAGS_FOR_BUILD])
-m4trace:configure.ac:254: -1- m4_pattern_allow([^CFLAGS_FOR_BUILD$])
-m4trace:configure.ac:255: -1- AC_SUBST([LDFLAGS_FOR_BUILD])
-m4trace:configure.ac:255: -1- AC_SUBST_TRACE([LDFLAGS_FOR_BUILD])
-m4trace:configure.ac:255: -1- m4_pattern_allow([^LDFLAGS_FOR_BUILD$])
-m4trace:configure.ac:256: -1- AC_SUBST([CPPFLAGS_FOR_BUILD])
-m4trace:configure.ac:256: -1- AC_SUBST_TRACE([CPPFLAGS_FOR_BUILD])
-m4trace:configure.ac:256: -1- m4_pattern_allow([^CPPFLAGS_FOR_BUILD$])
-m4trace:configure.ac:265: -1- AC_DEFINE_TRACE_LITERAL([ALIAS])
-m4trace:configure.ac:265: -1- m4_pattern_allow([^ALIAS$])
-m4trace:configure.ac:268: -1- AC_DEFINE_TRACE_LITERAL([PUSHD_AND_POPD])
-m4trace:configure.ac:268: -1- m4_pattern_allow([^PUSHD_AND_POPD$])
-m4trace:configure.ac:271: -1- AC_DEFINE_TRACE_LITERAL([RESTRICTED_SHELL])
-m4trace:configure.ac:271: -1- m4_pattern_allow([^RESTRICTED_SHELL$])
-m4trace:configure.ac:274: -1- AC_DEFINE_TRACE_LITERAL([PROCESS_SUBSTITUTION])
-m4trace:configure.ac:274: -1- m4_pattern_allow([^PROCESS_SUBSTITUTION$])
-m4trace:configure.ac:277: -1- AC_DEFINE_TRACE_LITERAL([PROMPT_STRING_DECODE])
-m4trace:configure.ac:277: -1- m4_pattern_allow([^PROMPT_STRING_DECODE$])
-m4trace:configure.ac:280: -1- AC_DEFINE_TRACE_LITERAL([SELECT_COMMAND])
-m4trace:configure.ac:280: -1- m4_pattern_allow([^SELECT_COMMAND$])
-m4trace:configure.ac:283: -1- AC_DEFINE_TRACE_LITERAL([HELP_BUILTIN])
-m4trace:configure.ac:283: -1- m4_pattern_allow([^HELP_BUILTIN$])
-m4trace:configure.ac:286: -1- AC_DEFINE_TRACE_LITERAL([ARRAY_VARS])
-m4trace:configure.ac:286: -1- m4_pattern_allow([^ARRAY_VARS$])
-m4trace:configure.ac:289: -1- AC_DEFINE_TRACE_LITERAL([DPAREN_ARITHMETIC])
-m4trace:configure.ac:289: -1- m4_pattern_allow([^DPAREN_ARITHMETIC$])
-m4trace:configure.ac:292: -1- AC_DEFINE_TRACE_LITERAL([BRACE_EXPANSION])
-m4trace:configure.ac:292: -1- m4_pattern_allow([^BRACE_EXPANSION$])
-m4trace:configure.ac:295: -1- AC_DEFINE_TRACE_LITERAL([DISABLED_BUILTINS])
-m4trace:configure.ac:295: -1- m4_pattern_allow([^DISABLED_BUILTINS$])
-m4trace:configure.ac:298: -1- AC_DEFINE_TRACE_LITERAL([COMMAND_TIMING])
-m4trace:configure.ac:298: -1- m4_pattern_allow([^COMMAND_TIMING$])
-m4trace:configure.ac:301: -1- AC_DEFINE_TRACE_LITERAL([DEFAULT_ECHO_TO_XPG])
-m4trace:configure.ac:301: -1- m4_pattern_allow([^DEFAULT_ECHO_TO_XPG$])
-m4trace:configure.ac:304: -1- AC_DEFINE_TRACE_LITERAL([STRICT_POSIX])
-m4trace:configure.ac:304: -1- m4_pattern_allow([^STRICT_POSIX$])
-m4trace:configure.ac:307: -1- AC_DEFINE_TRACE_LITERAL([EXTENDED_GLOB])
-m4trace:configure.ac:307: -1- m4_pattern_allow([^EXTENDED_GLOB$])
-m4trace:configure.ac:310: -1- AC_DEFINE_TRACE_LITERAL([EXTGLOB_DEFAULT])
-m4trace:configure.ac:310: -1- m4_pattern_allow([^EXTGLOB_DEFAULT$])
-m4trace:configure.ac:312: -1- AC_DEFINE_TRACE_LITERAL([EXTGLOB_DEFAULT])
-m4trace:configure.ac:312: -1- m4_pattern_allow([^EXTGLOB_DEFAULT$])
-m4trace:configure.ac:315: -1- AC_DEFINE_TRACE_LITERAL([COND_COMMAND])
-m4trace:configure.ac:315: -1- m4_pattern_allow([^COND_COMMAND$])
-m4trace:configure.ac:318: -1- AC_DEFINE_TRACE_LITERAL([COND_REGEXP])
-m4trace:configure.ac:318: -1- m4_pattern_allow([^COND_REGEXP$])
-m4trace:configure.ac:321: -1- AC_DEFINE_TRACE_LITERAL([COPROCESS_SUPPORT])
-m4trace:configure.ac:321: -1- m4_pattern_allow([^COPROCESS_SUPPORT$])
-m4trace:configure.ac:324: -1- AC_DEFINE_TRACE_LITERAL([ARITH_FOR_COMMAND])
-m4trace:configure.ac:324: -1- m4_pattern_allow([^ARITH_FOR_COMMAND$])
-m4trace:configure.ac:327: -1- AC_DEFINE_TRACE_LITERAL([NETWORK_REDIRECTIONS])
-m4trace:configure.ac:327: -1- m4_pattern_allow([^NETWORK_REDIRECTIONS$])
-m4trace:configure.ac:330: -1- AC_DEFINE_TRACE_LITERAL([PROGRAMMABLE_COMPLETION])
-m4trace:configure.ac:330: -1- m4_pattern_allow([^PROGRAMMABLE_COMPLETION$])
-m4trace:configure.ac:333: -1- AC_DEFINE_TRACE_LITERAL([NO_MULTIBYTE_SUPPORT])
-m4trace:configure.ac:333: -1- m4_pattern_allow([^NO_MULTIBYTE_SUPPORT$])
-m4trace:configure.ac:336: -1- AC_DEFINE_TRACE_LITERAL([DEBUGGER])
-m4trace:configure.ac:336: -1- m4_pattern_allow([^DEBUGGER$])
-m4trace:configure.ac:339: -1- AC_DEFINE_TRACE_LITERAL([CASEMOD_ATTRS])
-m4trace:configure.ac:339: -1- m4_pattern_allow([^CASEMOD_ATTRS$])
-m4trace:configure.ac:342: -1- AC_DEFINE_TRACE_LITERAL([CASEMOD_EXPANSIONS])
-m4trace:configure.ac:342: -1- m4_pattern_allow([^CASEMOD_EXPANSIONS$])
-m4trace:configure.ac:346: -1- AC_DEFINE_TRACE_LITERAL([MEMSCRAMBLE])
-m4trace:configure.ac:346: -1- m4_pattern_allow([^MEMSCRAMBLE$])
-m4trace:configure.ac:372: -1- AC_SUBST([TESTSCRIPT])
-m4trace:configure.ac:372: -1- AC_SUBST_TRACE([TESTSCRIPT])
-m4trace:configure.ac:372: -1- m4_pattern_allow([^TESTSCRIPT$])
-m4trace:configure.ac:373: -1- AC_SUBST([PURIFY])
-m4trace:configure.ac:373: -1- AC_SUBST_TRACE([PURIFY])
-m4trace:configure.ac:373: -1- m4_pattern_allow([^PURIFY$])
-m4trace:configure.ac:374: -1- AC_SUBST([MALLOC_TARGET])
-m4trace:configure.ac:374: -1- AC_SUBST_TRACE([MALLOC_TARGET])
-m4trace:configure.ac:374: -1- m4_pattern_allow([^MALLOC_TARGET$])
-m4trace:configure.ac:375: -1- AC_SUBST([MALLOC_SRC])
-m4trace:configure.ac:375: -1- AC_SUBST_TRACE([MALLOC_SRC])
-m4trace:configure.ac:375: -1- m4_pattern_allow([^MALLOC_SRC$])
-m4trace:configure.ac:377: -1- AC_SUBST([MALLOC_LIB])
-m4trace:configure.ac:377: -1- AC_SUBST_TRACE([MALLOC_LIB])
-m4trace:configure.ac:377: -1- m4_pattern_allow([^MALLOC_LIB$])
-m4trace:configure.ac:378: -1- AC_SUBST([MALLOC_LIBRARY])
-m4trace:configure.ac:378: -1- AC_SUBST_TRACE([MALLOC_LIBRARY])
-m4trace:configure.ac:378: -1- m4_pattern_allow([^MALLOC_LIBRARY$])
-m4trace:configure.ac:379: -1- AC_SUBST([MALLOC_LDFLAGS])
-m4trace:configure.ac:379: -1- AC_SUBST_TRACE([MALLOC_LDFLAGS])
-m4trace:configure.ac:379: -1- m4_pattern_allow([^MALLOC_LDFLAGS$])
-m4trace:configure.ac:380: -1- AC_SUBST([MALLOC_DEP])
-m4trace:configure.ac:380: -1- AC_SUBST_TRACE([MALLOC_DEP])
-m4trace:configure.ac:380: -1- m4_pattern_allow([^MALLOC_DEP$])
-m4trace:configure.ac:382: -1- AC_SUBST([htmldir])
-m4trace:configure.ac:382: -1- AC_SUBST_TRACE([htmldir])
-m4trace:configure.ac:382: -1- m4_pattern_allow([^htmldir$])
-m4trace:configure.ac:384: -1- AC_SUBST([HELPDIR])
-m4trace:configure.ac:384: -1- AC_SUBST_TRACE([HELPDIR])
-m4trace:configure.ac:384: -1- m4_pattern_allow([^HELPDIR$])
-m4trace:configure.ac:385: -1- AC_SUBST([HELPDIRDEFINE])
-m4trace:configure.ac:385: -1- AC_SUBST_TRACE([HELPDIRDEFINE])
-m4trace:configure.ac:385: -1- m4_pattern_allow([^HELPDIRDEFINE$])
-m4trace:configure.ac:386: -1- AC_SUBST([HELPINSTALL])
-m4trace:configure.ac:386: -1- AC_SUBST_TRACE([HELPINSTALL])
-m4trace:configure.ac:386: -1- m4_pattern_allow([^HELPINSTALL$])
-m4trace:configure.ac:387: -1- AC_SUBST([HELPFILES_TARGET])
-m4trace:configure.ac:387: -1- AC_SUBST_TRACE([HELPFILES_TARGET])
-m4trace:configure.ac:387: -1- m4_pattern_allow([^HELPFILES_TARGET$])
-m4trace:configure.ac:388: -1- AC_SUBST([HELPSTRINGS])
-m4trace:configure.ac:388: -1- AC_SUBST_TRACE([HELPSTRINGS])
-m4trace:configure.ac:388: -1- m4_pattern_allow([^HELPSTRINGS$])
-m4trace:configure.ac:397: -1- AC_SUBST([CC])
-m4trace:configure.ac:397: -1- AC_SUBST_TRACE([CC])
-m4trace:configure.ac:397: -1- m4_pattern_allow([^CC$])
-m4trace:configure.ac:397: -1- AC_SUBST([CFLAGS])
-m4trace:configure.ac:397: -1- AC_SUBST_TRACE([CFLAGS])
-m4trace:configure.ac:397: -1- m4_pattern_allow([^CFLAGS$])
-m4trace:configure.ac:397: -1- AC_SUBST([LDFLAGS])
-m4trace:configure.ac:397: -1- AC_SUBST_TRACE([LDFLAGS])
-m4trace:configure.ac:397: -1- m4_pattern_allow([^LDFLAGS$])
-m4trace:configure.ac:397: -1- AC_SUBST([LIBS])
-m4trace:configure.ac:397: -1- AC_SUBST_TRACE([LIBS])
-m4trace:configure.ac:397: -1- m4_pattern_allow([^LIBS$])
-m4trace:configure.ac:397: -1- AC_SUBST([CPPFLAGS])
-m4trace:configure.ac:397: -1- AC_SUBST_TRACE([CPPFLAGS])
-m4trace:configure.ac:397: -1- m4_pattern_allow([^CPPFLAGS$])
-m4trace:configure.ac:397: -1- AC_SUBST([CC])
-m4trace:configure.ac:397: -1- AC_SUBST_TRACE([CC])
-m4trace:configure.ac:397: -1- m4_pattern_allow([^CC$])
-m4trace:configure.ac:397: -1- AC_SUBST([CC])
-m4trace:configure.ac:397: -1- AC_SUBST_TRACE([CC])
-m4trace:configure.ac:397: -1- m4_pattern_allow([^CC$])
-m4trace:configure.ac:397: -1- AC_SUBST([CC])
-m4trace:configure.ac:397: -1- AC_SUBST_TRACE([CC])
-m4trace:configure.ac:397: -1- m4_pattern_allow([^CC$])
-m4trace:configure.ac:397: -1- AC_SUBST([CC])
-m4trace:configure.ac:397: -1- AC_SUBST_TRACE([CC])
-m4trace:configure.ac:397: -1- m4_pattern_allow([^CC$])
-m4trace:configure.ac:397: -1- AC_SUBST([ac_ct_CC])
-m4trace:configure.ac:397: -1- AC_SUBST_TRACE([ac_ct_CC])
-m4trace:configure.ac:397: -1- m4_pattern_allow([^ac_ct_CC$])
-m4trace:configure.ac:397: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext])
-m4trace:configure.ac:397: -1- AC_SUBST_TRACE([EXEEXT])
-m4trace:configure.ac:397: -1- m4_pattern_allow([^EXEEXT$])
-m4trace:configure.ac:397: -1- AC_SUBST([OBJEXT], [$ac_cv_objext])
-m4trace:configure.ac:397: -1- AC_SUBST_TRACE([OBJEXT])
-m4trace:configure.ac:397: -1- m4_pattern_allow([^OBJEXT$])
-m4trace:configure.ac:401: -1- _m4_warn([obsolete], [The macro `AC_MINIX' is obsolete.
+configure.ac:253: the top level])
+m4trace:configure.ac:256: -1- AC_SUBST([CC_FOR_BUILD])
+m4trace:configure.ac:256: -1- AC_SUBST_TRACE([CC_FOR_BUILD])
+m4trace:configure.ac:256: -1- m4_pattern_allow([^CC_FOR_BUILD$])
+m4trace:configure.ac:257: -1- AC_SUBST([CFLAGS_FOR_BUILD])
+m4trace:configure.ac:257: -1- AC_SUBST_TRACE([CFLAGS_FOR_BUILD])
+m4trace:configure.ac:257: -1- m4_pattern_allow([^CFLAGS_FOR_BUILD$])
+m4trace:configure.ac:258: -1- AC_SUBST([LDFLAGS_FOR_BUILD])
+m4trace:configure.ac:258: -1- AC_SUBST_TRACE([LDFLAGS_FOR_BUILD])
+m4trace:configure.ac:258: -1- m4_pattern_allow([^LDFLAGS_FOR_BUILD$])
+m4trace:configure.ac:259: -1- AC_SUBST([CPPFLAGS_FOR_BUILD])
+m4trace:configure.ac:259: -1- AC_SUBST_TRACE([CPPFLAGS_FOR_BUILD])
+m4trace:configure.ac:259: -1- m4_pattern_allow([^CPPFLAGS_FOR_BUILD$])
+m4trace:configure.ac:268: -1- AC_DEFINE_TRACE_LITERAL([ALIAS])
+m4trace:configure.ac:268: -1- m4_pattern_allow([^ALIAS$])
+m4trace:configure.ac:271: -1- AC_DEFINE_TRACE_LITERAL([PUSHD_AND_POPD])
+m4trace:configure.ac:271: -1- m4_pattern_allow([^PUSHD_AND_POPD$])
+m4trace:configure.ac:274: -1- AC_DEFINE_TRACE_LITERAL([RESTRICTED_SHELL])
+m4trace:configure.ac:274: -1- m4_pattern_allow([^RESTRICTED_SHELL$])
+m4trace:configure.ac:277: -1- AC_DEFINE_TRACE_LITERAL([PROCESS_SUBSTITUTION])
+m4trace:configure.ac:277: -1- m4_pattern_allow([^PROCESS_SUBSTITUTION$])
+m4trace:configure.ac:280: -1- AC_DEFINE_TRACE_LITERAL([PROMPT_STRING_DECODE])
+m4trace:configure.ac:280: -1- m4_pattern_allow([^PROMPT_STRING_DECODE$])
+m4trace:configure.ac:283: -1- AC_DEFINE_TRACE_LITERAL([SELECT_COMMAND])
+m4trace:configure.ac:283: -1- m4_pattern_allow([^SELECT_COMMAND$])
+m4trace:configure.ac:286: -1- AC_DEFINE_TRACE_LITERAL([HELP_BUILTIN])
+m4trace:configure.ac:286: -1- m4_pattern_allow([^HELP_BUILTIN$])
+m4trace:configure.ac:289: -1- AC_DEFINE_TRACE_LITERAL([ARRAY_VARS])
+m4trace:configure.ac:289: -1- m4_pattern_allow([^ARRAY_VARS$])
+m4trace:configure.ac:292: -1- AC_DEFINE_TRACE_LITERAL([DPAREN_ARITHMETIC])
+m4trace:configure.ac:292: -1- m4_pattern_allow([^DPAREN_ARITHMETIC$])
+m4trace:configure.ac:295: -1- AC_DEFINE_TRACE_LITERAL([BRACE_EXPANSION])
+m4trace:configure.ac:295: -1- m4_pattern_allow([^BRACE_EXPANSION$])
+m4trace:configure.ac:298: -1- AC_DEFINE_TRACE_LITERAL([DISABLED_BUILTINS])
+m4trace:configure.ac:298: -1- m4_pattern_allow([^DISABLED_BUILTINS$])
+m4trace:configure.ac:301: -1- AC_DEFINE_TRACE_LITERAL([COMMAND_TIMING])
+m4trace:configure.ac:301: -1- m4_pattern_allow([^COMMAND_TIMING$])
+m4trace:configure.ac:304: -1- AC_DEFINE_TRACE_LITERAL([DEFAULT_ECHO_TO_XPG])
+m4trace:configure.ac:304: -1- m4_pattern_allow([^DEFAULT_ECHO_TO_XPG$])
+m4trace:configure.ac:307: -1- AC_DEFINE_TRACE_LITERAL([STRICT_POSIX])
+m4trace:configure.ac:307: -1- m4_pattern_allow([^STRICT_POSIX$])
+m4trace:configure.ac:310: -1- AC_DEFINE_TRACE_LITERAL([EXTENDED_GLOB])
+m4trace:configure.ac:310: -1- m4_pattern_allow([^EXTENDED_GLOB$])
+m4trace:configure.ac:313: -1- AC_DEFINE_TRACE_LITERAL([EXTGLOB_DEFAULT])
+m4trace:configure.ac:313: -1- m4_pattern_allow([^EXTGLOB_DEFAULT$])
+m4trace:configure.ac:315: -1- AC_DEFINE_TRACE_LITERAL([EXTGLOB_DEFAULT])
+m4trace:configure.ac:315: -1- m4_pattern_allow([^EXTGLOB_DEFAULT$])
+m4trace:configure.ac:318: -1- AC_DEFINE_TRACE_LITERAL([COND_COMMAND])
+m4trace:configure.ac:318: -1- m4_pattern_allow([^COND_COMMAND$])
+m4trace:configure.ac:321: -1- AC_DEFINE_TRACE_LITERAL([COND_REGEXP])
+m4trace:configure.ac:321: -1- m4_pattern_allow([^COND_REGEXP$])
+m4trace:configure.ac:324: -1- AC_DEFINE_TRACE_LITERAL([COPROCESS_SUPPORT])
+m4trace:configure.ac:324: -1- m4_pattern_allow([^COPROCESS_SUPPORT$])
+m4trace:configure.ac:327: -1- AC_DEFINE_TRACE_LITERAL([ARITH_FOR_COMMAND])
+m4trace:configure.ac:327: -1- m4_pattern_allow([^ARITH_FOR_COMMAND$])
+m4trace:configure.ac:330: -1- AC_DEFINE_TRACE_LITERAL([NETWORK_REDIRECTIONS])
+m4trace:configure.ac:330: -1- m4_pattern_allow([^NETWORK_REDIRECTIONS$])
+m4trace:configure.ac:333: -1- AC_DEFINE_TRACE_LITERAL([PROGRAMMABLE_COMPLETION])
+m4trace:configure.ac:333: -1- m4_pattern_allow([^PROGRAMMABLE_COMPLETION$])
+m4trace:configure.ac:336: -1- AC_DEFINE_TRACE_LITERAL([NO_MULTIBYTE_SUPPORT])
+m4trace:configure.ac:336: -1- m4_pattern_allow([^NO_MULTIBYTE_SUPPORT$])
+m4trace:configure.ac:339: -1- AC_DEFINE_TRACE_LITERAL([DEBUGGER])
+m4trace:configure.ac:339: -1- m4_pattern_allow([^DEBUGGER$])
+m4trace:configure.ac:342: -1- AC_DEFINE_TRACE_LITERAL([CASEMOD_ATTRS])
+m4trace:configure.ac:342: -1- m4_pattern_allow([^CASEMOD_ATTRS$])
+m4trace:configure.ac:345: -1- AC_DEFINE_TRACE_LITERAL([CASEMOD_EXPANSIONS])
+m4trace:configure.ac:345: -1- m4_pattern_allow([^CASEMOD_EXPANSIONS$])
+m4trace:configure.ac:348: -1- AC_DEFINE_TRACE_LITERAL([DIRCOMPLETE_EXPAND_DEFAULT])
+m4trace:configure.ac:348: -1- m4_pattern_allow([^DIRCOMPLETE_EXPAND_DEFAULT$])
+m4trace:configure.ac:352: -1- AC_DEFINE_TRACE_LITERAL([MEMSCRAMBLE])
+m4trace:configure.ac:352: -1- m4_pattern_allow([^MEMSCRAMBLE$])
+m4trace:configure.ac:378: -1- AC_SUBST([TESTSCRIPT])
+m4trace:configure.ac:378: -1- AC_SUBST_TRACE([TESTSCRIPT])
+m4trace:configure.ac:378: -1- m4_pattern_allow([^TESTSCRIPT$])
+m4trace:configure.ac:379: -1- AC_SUBST([PURIFY])
+m4trace:configure.ac:379: -1- AC_SUBST_TRACE([PURIFY])
+m4trace:configure.ac:379: -1- m4_pattern_allow([^PURIFY$])
+m4trace:configure.ac:380: -1- AC_SUBST([MALLOC_TARGET])
+m4trace:configure.ac:380: -1- AC_SUBST_TRACE([MALLOC_TARGET])
+m4trace:configure.ac:380: -1- m4_pattern_allow([^MALLOC_TARGET$])
+m4trace:configure.ac:381: -1- AC_SUBST([MALLOC_SRC])
+m4trace:configure.ac:381: -1- AC_SUBST_TRACE([MALLOC_SRC])
+m4trace:configure.ac:381: -1- m4_pattern_allow([^MALLOC_SRC$])
+m4trace:configure.ac:383: -1- AC_SUBST([MALLOC_LIB])
+m4trace:configure.ac:383: -1- AC_SUBST_TRACE([MALLOC_LIB])
+m4trace:configure.ac:383: -1- m4_pattern_allow([^MALLOC_LIB$])
+m4trace:configure.ac:384: -1- AC_SUBST([MALLOC_LIBRARY])
+m4trace:configure.ac:384: -1- AC_SUBST_TRACE([MALLOC_LIBRARY])
+m4trace:configure.ac:384: -1- m4_pattern_allow([^MALLOC_LIBRARY$])
+m4trace:configure.ac:385: -1- AC_SUBST([MALLOC_LDFLAGS])
+m4trace:configure.ac:385: -1- AC_SUBST_TRACE([MALLOC_LDFLAGS])
+m4trace:configure.ac:385: -1- m4_pattern_allow([^MALLOC_LDFLAGS$])
+m4trace:configure.ac:386: -1- AC_SUBST([MALLOC_DEP])
+m4trace:configure.ac:386: -1- AC_SUBST_TRACE([MALLOC_DEP])
+m4trace:configure.ac:386: -1- m4_pattern_allow([^MALLOC_DEP$])
+m4trace:configure.ac:388: -1- AC_SUBST([htmldir])
+m4trace:configure.ac:388: -1- AC_SUBST_TRACE([htmldir])
+m4trace:configure.ac:388: -1- m4_pattern_allow([^htmldir$])
+m4trace:configure.ac:390: -1- AC_SUBST([HELPDIR])
+m4trace:configure.ac:390: -1- AC_SUBST_TRACE([HELPDIR])
+m4trace:configure.ac:390: -1- m4_pattern_allow([^HELPDIR$])
+m4trace:configure.ac:391: -1- AC_SUBST([HELPDIRDEFINE])
+m4trace:configure.ac:391: -1- AC_SUBST_TRACE([HELPDIRDEFINE])
+m4trace:configure.ac:391: -1- m4_pattern_allow([^HELPDIRDEFINE$])
+m4trace:configure.ac:392: -1- AC_SUBST([HELPINSTALL])
+m4trace:configure.ac:392: -1- AC_SUBST_TRACE([HELPINSTALL])
+m4trace:configure.ac:392: -1- m4_pattern_allow([^HELPINSTALL$])
+m4trace:configure.ac:393: -1- AC_SUBST([HELPFILES_TARGET])
+m4trace:configure.ac:393: -1- AC_SUBST_TRACE([HELPFILES_TARGET])
+m4trace:configure.ac:393: -1- m4_pattern_allow([^HELPFILES_TARGET$])
+m4trace:configure.ac:394: -1- AC_SUBST([HELPSTRINGS])
+m4trace:configure.ac:394: -1- AC_SUBST_TRACE([HELPSTRINGS])
+m4trace:configure.ac:394: -1- m4_pattern_allow([^HELPSTRINGS$])
+m4trace:configure.ac:403: -1- AC_SUBST([CC])
+m4trace:configure.ac:403: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.ac:403: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:403: -1- AC_SUBST([CFLAGS])
+m4trace:configure.ac:403: -1- AC_SUBST_TRACE([CFLAGS])
+m4trace:configure.ac:403: -1- m4_pattern_allow([^CFLAGS$])
+m4trace:configure.ac:403: -1- AC_SUBST([LDFLAGS])
+m4trace:configure.ac:403: -1- AC_SUBST_TRACE([LDFLAGS])
+m4trace:configure.ac:403: -1- m4_pattern_allow([^LDFLAGS$])
+m4trace:configure.ac:403: -1- AC_SUBST([LIBS])
+m4trace:configure.ac:403: -1- AC_SUBST_TRACE([LIBS])
+m4trace:configure.ac:403: -1- m4_pattern_allow([^LIBS$])
+m4trace:configure.ac:403: -1- AC_SUBST([CPPFLAGS])
+m4trace:configure.ac:403: -1- AC_SUBST_TRACE([CPPFLAGS])
+m4trace:configure.ac:403: -1- m4_pattern_allow([^CPPFLAGS$])
+m4trace:configure.ac:403: -1- AC_SUBST([CC])
+m4trace:configure.ac:403: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.ac:403: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:403: -1- AC_SUBST([CC])
+m4trace:configure.ac:403: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.ac:403: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:403: -1- AC_SUBST([CC])
+m4trace:configure.ac:403: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.ac:403: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:403: -1- AC_SUBST([CC])
+m4trace:configure.ac:403: -1- AC_SUBST_TRACE([CC])
+m4trace:configure.ac:403: -1- m4_pattern_allow([^CC$])
+m4trace:configure.ac:403: -1- AC_SUBST([ac_ct_CC])
+m4trace:configure.ac:403: -1- AC_SUBST_TRACE([ac_ct_CC])
+m4trace:configure.ac:403: -1- m4_pattern_allow([^ac_ct_CC$])
+m4trace:configure.ac:403: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext])
+m4trace:configure.ac:403: -1- AC_SUBST_TRACE([EXEEXT])
+m4trace:configure.ac:403: -1- m4_pattern_allow([^EXEEXT$])
+m4trace:configure.ac:403: -1- AC_SUBST([OBJEXT], [$ac_cv_objext])
+m4trace:configure.ac:403: -1- AC_SUBST_TRACE([OBJEXT])
+m4trace:configure.ac:403: -1- m4_pattern_allow([^OBJEXT$])
+m4trace:configure.ac:407: -1- _m4_warn([obsolete], [The macro `AC_MINIX' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/specific.m4:437: AC_MINIX is expanded from...
-configure.ac:401: the top level])
-m4trace:configure.ac:401: -1- AC_SUBST([CPP])
-m4trace:configure.ac:401: -1- AC_SUBST_TRACE([CPP])
-m4trace:configure.ac:401: -1- m4_pattern_allow([^CPP$])
-m4trace:configure.ac:401: -1- AC_SUBST([CPPFLAGS])
-m4trace:configure.ac:401: -1- AC_SUBST_TRACE([CPPFLAGS])
-m4trace:configure.ac:401: -1- m4_pattern_allow([^CPPFLAGS$])
-m4trace:configure.ac:401: -1- AC_SUBST([CPP])
-m4trace:configure.ac:401: -1- AC_SUBST_TRACE([CPP])
-m4trace:configure.ac:401: -1- m4_pattern_allow([^CPP$])
-m4trace:configure.ac:401: -1- AC_SUBST([GREP])
-m4trace:configure.ac:401: -1- AC_SUBST_TRACE([GREP])
-m4trace:configure.ac:401: -1- m4_pattern_allow([^GREP$])
-m4trace:configure.ac:401: -1- AC_SUBST([EGREP])
-m4trace:configure.ac:401: -1- AC_SUBST_TRACE([EGREP])
-m4trace:configure.ac:401: -1- m4_pattern_allow([^EGREP$])
-m4trace:configure.ac:401: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS])
-m4trace:configure.ac:401: -1- m4_pattern_allow([^STDC_HEADERS$])
-m4trace:configure.ac:401: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */
+configure.ac:407: the top level])
+m4trace:configure.ac:407: -1- AC_SUBST([CPP])
+m4trace:configure.ac:407: -1- AC_SUBST_TRACE([CPP])
+m4trace:configure.ac:407: -1- m4_pattern_allow([^CPP$])
+m4trace:configure.ac:407: -1- AC_SUBST([CPPFLAGS])
+m4trace:configure.ac:407: -1- AC_SUBST_TRACE([CPPFLAGS])
+m4trace:configure.ac:407: -1- m4_pattern_allow([^CPPFLAGS$])
+m4trace:configure.ac:407: -1- AC_SUBST([CPP])
+m4trace:configure.ac:407: -1- AC_SUBST_TRACE([CPP])
+m4trace:configure.ac:407: -1- m4_pattern_allow([^CPP$])
+m4trace:configure.ac:407: -1- AC_SUBST([GREP])
+m4trace:configure.ac:407: -1- AC_SUBST_TRACE([GREP])
+m4trace:configure.ac:407: -1- m4_pattern_allow([^GREP$])
+m4trace:configure.ac:407: -1- AC_SUBST([EGREP])
+m4trace:configure.ac:407: -1- AC_SUBST_TRACE([EGREP])
+m4trace:configure.ac:407: -1- m4_pattern_allow([^EGREP$])
+m4trace:configure.ac:407: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS])
+m4trace:configure.ac:407: -1- m4_pattern_allow([^STDC_HEADERS$])
+m4trace:configure.ac:407: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */
 @%:@undef STDC_HEADERS])
-m4trace:configure.ac:401: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the <sys/types.h> header file. */
+m4trace:configure.ac:407: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the <sys/types.h> header file. */
 @%:@undef HAVE_SYS_TYPES_H])
-m4trace:configure.ac:401: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the <sys/stat.h> header file. */
+m4trace:configure.ac:407: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the <sys/stat.h> header file. */
 @%:@undef HAVE_SYS_STAT_H])
-m4trace:configure.ac:401: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the <stdlib.h> header file. */
+m4trace:configure.ac:407: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the <stdlib.h> header file. */
 @%:@undef HAVE_STDLIB_H])
-m4trace:configure.ac:401: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the <string.h> header file. */
+m4trace:configure.ac:407: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the <string.h> header file. */
 @%:@undef HAVE_STRING_H])
-m4trace:configure.ac:401: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the <memory.h> header file. */
+m4trace:configure.ac:407: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the <memory.h> header file. */
 @%:@undef HAVE_MEMORY_H])
-m4trace:configure.ac:401: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the <strings.h> header file. */
+m4trace:configure.ac:407: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the <strings.h> header file. */
 @%:@undef HAVE_STRINGS_H])
-m4trace:configure.ac:401: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the <inttypes.h> header file. */
+m4trace:configure.ac:407: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the <inttypes.h> header file. */
 @%:@undef HAVE_INTTYPES_H])
-m4trace:configure.ac:401: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the <stdint.h> header file. */
+m4trace:configure.ac:407: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the <stdint.h> header file. */
 @%:@undef HAVE_STDINT_H])
-m4trace:configure.ac:401: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the <unistd.h> header file. */
+m4trace:configure.ac:407: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the <unistd.h> header file. */
 @%:@undef HAVE_UNISTD_H])
-m4trace:configure.ac:401: -1- AC_DEFINE_TRACE_LITERAL([_POSIX_SOURCE])
-m4trace:configure.ac:401: -1- m4_pattern_allow([^_POSIX_SOURCE$])
-m4trace:configure.ac:401: -1- AH_OUTPUT([_POSIX_SOURCE], [/* Define to 1 if you need to in order for `stat\' and other things to work. */
+m4trace:configure.ac:407: -1- AC_DEFINE_TRACE_LITERAL([_POSIX_SOURCE])
+m4trace:configure.ac:407: -1- m4_pattern_allow([^_POSIX_SOURCE$])
+m4trace:configure.ac:407: -1- AH_OUTPUT([_POSIX_SOURCE], [/* Define to 1 if you need to in order for `stat\' and other things to work. */
 @%:@undef _POSIX_SOURCE])
-m4trace:configure.ac:401: -1- AC_DEFINE_TRACE_LITERAL([_POSIX_1_SOURCE])
-m4trace:configure.ac:401: -1- m4_pattern_allow([^_POSIX_1_SOURCE$])
-m4trace:configure.ac:401: -1- AH_OUTPUT([_POSIX_1_SOURCE], [/* Define to 2 if the system does not provide POSIX.1 features except with
+m4trace:configure.ac:407: -1- AC_DEFINE_TRACE_LITERAL([_POSIX_1_SOURCE])
+m4trace:configure.ac:407: -1- m4_pattern_allow([^_POSIX_1_SOURCE$])
+m4trace:configure.ac:407: -1- AH_OUTPUT([_POSIX_1_SOURCE], [/* Define to 2 if the system does not provide POSIX.1 features except with
    this defined. */
 @%:@undef _POSIX_1_SOURCE])
-m4trace:configure.ac:401: -1- AC_DEFINE_TRACE_LITERAL([_MINIX])
-m4trace:configure.ac:401: -1- m4_pattern_allow([^_MINIX$])
-m4trace:configure.ac:401: -1- AH_OUTPUT([_MINIX], [/* Define to 1 if on MINIX. */
+m4trace:configure.ac:407: -1- AC_DEFINE_TRACE_LITERAL([_MINIX])
+m4trace:configure.ac:407: -1- m4_pattern_allow([^_MINIX$])
+m4trace:configure.ac:407: -1- AH_OUTPUT([_MINIX], [/* Define to 1 if on MINIX. */
 @%:@undef _MINIX])
-m4trace:configure.ac:401: -1- AH_OUTPUT([USE_SYSTEM_EXTENSIONS], [/* Enable extensions on AIX 3, Interix.  */
+m4trace:configure.ac:407: -1- AH_OUTPUT([USE_SYSTEM_EXTENSIONS], [/* Enable extensions on AIX 3, Interix.  */
 #ifndef _ALL_SOURCE
 # undef _ALL_SOURCE
 #endif
@@ -538,171 +543,171 @@ m4trace:configure.ac:401: -1- AH_OUTPUT([USE_SYSTEM_EXTENSIONS], [/* Enable exte
 # undef __EXTENSIONS__
 #endif
 ])
-m4trace:configure.ac:401: -1- AC_DEFINE_TRACE_LITERAL([__EXTENSIONS__])
-m4trace:configure.ac:401: -1- m4_pattern_allow([^__EXTENSIONS__$])
-m4trace:configure.ac:401: -1- AC_DEFINE_TRACE_LITERAL([_ALL_SOURCE])
-m4trace:configure.ac:401: -1- m4_pattern_allow([^_ALL_SOURCE$])
-m4trace:configure.ac:401: -1- AC_DEFINE_TRACE_LITERAL([_GNU_SOURCE])
-m4trace:configure.ac:401: -1- m4_pattern_allow([^_GNU_SOURCE$])
-m4trace:configure.ac:401: -1- AC_DEFINE_TRACE_LITERAL([_POSIX_PTHREAD_SEMANTICS])
-m4trace:configure.ac:401: -1- m4_pattern_allow([^_POSIX_PTHREAD_SEMANTICS$])
-m4trace:configure.ac:401: -1- AC_DEFINE_TRACE_LITERAL([_TANDEM_SOURCE])
-m4trace:configure.ac:401: -1- m4_pattern_allow([^_TANDEM_SOURCE$])
-m4trace:configure.ac:403: -1- AC_DEFINE_TRACE_LITERAL([_FILE_OFFSET_BITS])
-m4trace:configure.ac:403: -1- m4_pattern_allow([^_FILE_OFFSET_BITS$])
-m4trace:configure.ac:403: -1- AH_OUTPUT([_FILE_OFFSET_BITS], [/* Number of bits in a file offset, on hosts where this is settable. */
+m4trace:configure.ac:407: -1- AC_DEFINE_TRACE_LITERAL([__EXTENSIONS__])
+m4trace:configure.ac:407: -1- m4_pattern_allow([^__EXTENSIONS__$])
+m4trace:configure.ac:407: -1- AC_DEFINE_TRACE_LITERAL([_ALL_SOURCE])
+m4trace:configure.ac:407: -1- m4_pattern_allow([^_ALL_SOURCE$])
+m4trace:configure.ac:407: -1- AC_DEFINE_TRACE_LITERAL([_GNU_SOURCE])
+m4trace:configure.ac:407: -1- m4_pattern_allow([^_GNU_SOURCE$])
+m4trace:configure.ac:407: -1- AC_DEFINE_TRACE_LITERAL([_POSIX_PTHREAD_SEMANTICS])
+m4trace:configure.ac:407: -1- m4_pattern_allow([^_POSIX_PTHREAD_SEMANTICS$])
+m4trace:configure.ac:407: -1- AC_DEFINE_TRACE_LITERAL([_TANDEM_SOURCE])
+m4trace:configure.ac:407: -1- m4_pattern_allow([^_TANDEM_SOURCE$])
+m4trace:configure.ac:409: -1- AC_DEFINE_TRACE_LITERAL([_FILE_OFFSET_BITS])
+m4trace:configure.ac:409: -1- m4_pattern_allow([^_FILE_OFFSET_BITS$])
+m4trace:configure.ac:409: -1- AH_OUTPUT([_FILE_OFFSET_BITS], [/* Number of bits in a file offset, on hosts where this is settable. */
 @%:@undef _FILE_OFFSET_BITS])
-m4trace:configure.ac:403: -1- AC_DEFINE_TRACE_LITERAL([_LARGE_FILES])
-m4trace:configure.ac:403: -1- m4_pattern_allow([^_LARGE_FILES$])
-m4trace:configure.ac:403: -1- AH_OUTPUT([_LARGE_FILES], [/* Define for large files, on AIX-style hosts. */
+m4trace:configure.ac:409: -1- AC_DEFINE_TRACE_LITERAL([_LARGE_FILES])
+m4trace:configure.ac:409: -1- m4_pattern_allow([^_LARGE_FILES$])
+m4trace:configure.ac:409: -1- AH_OUTPUT([_LARGE_FILES], [/* Define for large files, on AIX-style hosts. */
 @%:@undef _LARGE_FILES])
-m4trace:configure.ac:440: -1- AC_SUBST([CROSS_COMPILE])
-m4trace:configure.ac:440: -1- AC_SUBST_TRACE([CROSS_COMPILE])
-m4trace:configure.ac:440: -1- m4_pattern_allow([^CROSS_COMPILE$])
-m4trace:configure.ac:442: -1- AC_SUBST([SIGNAMES_H])
-m4trace:configure.ac:442: -1- AC_SUBST_TRACE([SIGNAMES_H])
-m4trace:configure.ac:442: -1- m4_pattern_allow([^SIGNAMES_H$])
-m4trace:configure.ac:443: -1- AC_SUBST([SIGNAMES_O])
-m4trace:configure.ac:443: -1- AC_SUBST_TRACE([SIGNAMES_O])
-m4trace:configure.ac:443: -1- m4_pattern_allow([^SIGNAMES_O$])
-m4trace:configure.ac:477: -1- _m4_warn([obsolete], [The macro `ac_cv_prog_gcc' is obsolete.
+m4trace:configure.ac:446: -1- AC_SUBST([CROSS_COMPILE])
+m4trace:configure.ac:446: -1- AC_SUBST_TRACE([CROSS_COMPILE])
+m4trace:configure.ac:446: -1- m4_pattern_allow([^CROSS_COMPILE$])
+m4trace:configure.ac:448: -1- AC_SUBST([SIGNAMES_H])
+m4trace:configure.ac:448: -1- AC_SUBST_TRACE([SIGNAMES_H])
+m4trace:configure.ac:448: -1- m4_pattern_allow([^SIGNAMES_H$])
+m4trace:configure.ac:449: -1- AC_SUBST([SIGNAMES_O])
+m4trace:configure.ac:449: -1- AC_SUBST_TRACE([SIGNAMES_O])
+m4trace:configure.ac:449: -1- m4_pattern_allow([^SIGNAMES_O$])
+m4trace:configure.ac:483: -1- _m4_warn([obsolete], [The macro `ac_cv_prog_gcc' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/c.m4:436: ac_cv_prog_gcc is expanded from...
-configure.ac:477: the top level])
-m4trace:configure.ac:504: -1- AC_SUBST([CFLAGS])
-m4trace:configure.ac:504: -1- AC_SUBST_TRACE([CFLAGS])
-m4trace:configure.ac:504: -1- m4_pattern_allow([^CFLAGS$])
-m4trace:configure.ac:505: -1- AC_SUBST([CPPFLAGS])
-m4trace:configure.ac:505: -1- AC_SUBST_TRACE([CPPFLAGS])
-m4trace:configure.ac:505: -1- m4_pattern_allow([^CPPFLAGS$])
-m4trace:configure.ac:506: -1- AC_SUBST([LDFLAGS])
-m4trace:configure.ac:506: -1- AC_SUBST_TRACE([LDFLAGS])
-m4trace:configure.ac:506: -1- m4_pattern_allow([^LDFLAGS$])
-m4trace:configure.ac:507: -1- AC_SUBST([STATIC_LD])
-m4trace:configure.ac:507: -1- AC_SUBST_TRACE([STATIC_LD])
-m4trace:configure.ac:507: -1- m4_pattern_allow([^STATIC_LD$])
-m4trace:configure.ac:509: -1- AC_SUBST([CC_FOR_BUILD])
-m4trace:configure.ac:509: -1- AC_SUBST_TRACE([CC_FOR_BUILD])
-m4trace:configure.ac:509: -1- m4_pattern_allow([^CC_FOR_BUILD$])
-m4trace:configure.ac:510: -1- AC_SUBST([CFLAGS_FOR_BUILD])
-m4trace:configure.ac:510: -1- AC_SUBST_TRACE([CFLAGS_FOR_BUILD])
-m4trace:configure.ac:510: -1- m4_pattern_allow([^CFLAGS_FOR_BUILD$])
-m4trace:configure.ac:511: -1- AC_SUBST([CPPFLAGS_FOR_BUILD])
-m4trace:configure.ac:511: -1- AC_SUBST_TRACE([CPPFLAGS_FOR_BUILD])
-m4trace:configure.ac:511: -1- m4_pattern_allow([^CPPFLAGS_FOR_BUILD$])
-m4trace:configure.ac:512: -1- AC_SUBST([LDFLAGS_FOR_BUILD])
-m4trace:configure.ac:512: -1- AC_SUBST_TRACE([LDFLAGS_FOR_BUILD])
-m4trace:configure.ac:512: -1- m4_pattern_allow([^LDFLAGS_FOR_BUILD$])
-m4trace:configure.ac:513: -1- AC_SUBST([LIBS_FOR_BUILD])
-m4trace:configure.ac:513: -1- AC_SUBST_TRACE([LIBS_FOR_BUILD])
-m4trace:configure.ac:513: -1- m4_pattern_allow([^LIBS_FOR_BUILD$])
-m4trace:configure.ac:527: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
+configure.ac:483: the top level])
+m4trace:configure.ac:510: -1- AC_SUBST([CFLAGS])
+m4trace:configure.ac:510: -1- AC_SUBST_TRACE([CFLAGS])
+m4trace:configure.ac:510: -1- m4_pattern_allow([^CFLAGS$])
+m4trace:configure.ac:511: -1- AC_SUBST([CPPFLAGS])
+m4trace:configure.ac:511: -1- AC_SUBST_TRACE([CPPFLAGS])
+m4trace:configure.ac:511: -1- m4_pattern_allow([^CPPFLAGS$])
+m4trace:configure.ac:512: -1- AC_SUBST([LDFLAGS])
+m4trace:configure.ac:512: -1- AC_SUBST_TRACE([LDFLAGS])
+m4trace:configure.ac:512: -1- m4_pattern_allow([^LDFLAGS$])
+m4trace:configure.ac:513: -1- AC_SUBST([STATIC_LD])
+m4trace:configure.ac:513: -1- AC_SUBST_TRACE([STATIC_LD])
+m4trace:configure.ac:513: -1- m4_pattern_allow([^STATIC_LD$])
+m4trace:configure.ac:515: -1- AC_SUBST([CC_FOR_BUILD])
+m4trace:configure.ac:515: -1- AC_SUBST_TRACE([CC_FOR_BUILD])
+m4trace:configure.ac:515: -1- m4_pattern_allow([^CC_FOR_BUILD$])
+m4trace:configure.ac:516: -1- AC_SUBST([CFLAGS_FOR_BUILD])
+m4trace:configure.ac:516: -1- AC_SUBST_TRACE([CFLAGS_FOR_BUILD])
+m4trace:configure.ac:516: -1- m4_pattern_allow([^CFLAGS_FOR_BUILD$])
+m4trace:configure.ac:517: -1- AC_SUBST([CPPFLAGS_FOR_BUILD])
+m4trace:configure.ac:517: -1- AC_SUBST_TRACE([CPPFLAGS_FOR_BUILD])
+m4trace:configure.ac:517: -1- m4_pattern_allow([^CPPFLAGS_FOR_BUILD$])
+m4trace:configure.ac:518: -1- AC_SUBST([LDFLAGS_FOR_BUILD])
+m4trace:configure.ac:518: -1- AC_SUBST_TRACE([LDFLAGS_FOR_BUILD])
+m4trace:configure.ac:518: -1- m4_pattern_allow([^LDFLAGS_FOR_BUILD$])
+m4trace:configure.ac:519: -1- AC_SUBST([LIBS_FOR_BUILD])
+m4trace:configure.ac:519: -1- AC_SUBST_TRACE([LIBS_FOR_BUILD])
+m4trace:configure.ac:519: -1- m4_pattern_allow([^LIBS_FOR_BUILD$])
+m4trace:configure.ac:533: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:1806: RL_LIB_READLINE_VERSION is expanded from...
-configure.ac:527: the top level])
-m4trace:configure.ac:527: -1- AC_DEFINE_TRACE_LITERAL([RL_READLINE_VERSION])
-m4trace:configure.ac:527: -1- m4_pattern_allow([^RL_READLINE_VERSION$])
-m4trace:configure.ac:527: -1- AH_OUTPUT([RL_READLINE_VERSION], [/* encoded version of the installed readline library */
+configure.ac:533: the top level])
+m4trace:configure.ac:533: -1- AC_DEFINE_TRACE_LITERAL([RL_READLINE_VERSION])
+m4trace:configure.ac:533: -1- m4_pattern_allow([^RL_READLINE_VERSION$])
+m4trace:configure.ac:533: -1- AH_OUTPUT([RL_READLINE_VERSION], [/* encoded version of the installed readline library */
 @%:@undef RL_READLINE_VERSION])
-m4trace:configure.ac:527: -1- AC_DEFINE_TRACE_LITERAL([RL_VERSION_MAJOR])
-m4trace:configure.ac:527: -1- m4_pattern_allow([^RL_VERSION_MAJOR$])
-m4trace:configure.ac:527: -1- AH_OUTPUT([RL_VERSION_MAJOR], [/* major version of installed readline library */
+m4trace:configure.ac:533: -1- AC_DEFINE_TRACE_LITERAL([RL_VERSION_MAJOR])
+m4trace:configure.ac:533: -1- m4_pattern_allow([^RL_VERSION_MAJOR$])
+m4trace:configure.ac:533: -1- AH_OUTPUT([RL_VERSION_MAJOR], [/* major version of installed readline library */
 @%:@undef RL_VERSION_MAJOR])
-m4trace:configure.ac:527: -1- AC_DEFINE_TRACE_LITERAL([RL_VERSION_MINOR])
-m4trace:configure.ac:527: -1- m4_pattern_allow([^RL_VERSION_MINOR$])
-m4trace:configure.ac:527: -1- AH_OUTPUT([RL_VERSION_MINOR], [/* minor version of installed readline library */
+m4trace:configure.ac:533: -1- AC_DEFINE_TRACE_LITERAL([RL_VERSION_MINOR])
+m4trace:configure.ac:533: -1- m4_pattern_allow([^RL_VERSION_MINOR$])
+m4trace:configure.ac:533: -1- AH_OUTPUT([RL_VERSION_MINOR], [/* minor version of installed readline library */
 @%:@undef RL_VERSION_MINOR])
-m4trace:configure.ac:527: -1- AC_SUBST([RL_VERSION])
-m4trace:configure.ac:527: -1- AC_SUBST_TRACE([RL_VERSION])
-m4trace:configure.ac:527: -1- m4_pattern_allow([^RL_VERSION$])
-m4trace:configure.ac:527: -1- AC_SUBST([RL_MAJOR])
-m4trace:configure.ac:527: -1- AC_SUBST_TRACE([RL_MAJOR])
-m4trace:configure.ac:527: -1- m4_pattern_allow([^RL_MAJOR$])
-m4trace:configure.ac:527: -1- AC_SUBST([RL_MINOR])
-m4trace:configure.ac:527: -1- AC_SUBST_TRACE([RL_MINOR])
-m4trace:configure.ac:527: -1- m4_pattern_allow([^RL_MINOR$])
-m4trace:configure.ac:540: -1- AC_DEFINE_TRACE_LITERAL([READLINE])
-m4trace:configure.ac:540: -1- m4_pattern_allow([^READLINE$])
-m4trace:configure.ac:575: -1- AC_DEFINE_TRACE_LITERAL([HISTORY])
-m4trace:configure.ac:575: -1- m4_pattern_allow([^HISTORY$])
-m4trace:configure.ac:578: -1- AC_DEFINE_TRACE_LITERAL([BANG_HISTORY])
-m4trace:configure.ac:578: -1- m4_pattern_allow([^BANG_HISTORY$])
-m4trace:configure.ac:608: -1- AC_SUBST([READLINE_LIB])
-m4trace:configure.ac:608: -1- AC_SUBST_TRACE([READLINE_LIB])
-m4trace:configure.ac:608: -1- m4_pattern_allow([^READLINE_LIB$])
-m4trace:configure.ac:609: -1- AC_SUBST([READLINE_DEP])
-m4trace:configure.ac:609: -1- AC_SUBST_TRACE([READLINE_DEP])
-m4trace:configure.ac:609: -1- m4_pattern_allow([^READLINE_DEP$])
-m4trace:configure.ac:610: -1- AC_SUBST([RL_LIBDIR])
-m4trace:configure.ac:610: -1- AC_SUBST_TRACE([RL_LIBDIR])
-m4trace:configure.ac:610: -1- m4_pattern_allow([^RL_LIBDIR$])
-m4trace:configure.ac:611: -1- AC_SUBST([RL_INCLUDEDIR])
-m4trace:configure.ac:611: -1- AC_SUBST_TRACE([RL_INCLUDEDIR])
-m4trace:configure.ac:611: -1- m4_pattern_allow([^RL_INCLUDEDIR$])
-m4trace:configure.ac:612: -1- AC_SUBST([RL_INCLUDE])
-m4trace:configure.ac:612: -1- AC_SUBST_TRACE([RL_INCLUDE])
-m4trace:configure.ac:612: -1- m4_pattern_allow([^RL_INCLUDE$])
-m4trace:configure.ac:613: -1- AC_SUBST([HISTORY_LIB])
-m4trace:configure.ac:613: -1- AC_SUBST_TRACE([HISTORY_LIB])
-m4trace:configure.ac:613: -1- m4_pattern_allow([^HISTORY_LIB$])
-m4trace:configure.ac:614: -1- AC_SUBST([HISTORY_DEP])
-m4trace:configure.ac:614: -1- AC_SUBST_TRACE([HISTORY_DEP])
-m4trace:configure.ac:614: -1- m4_pattern_allow([^HISTORY_DEP$])
-m4trace:configure.ac:615: -1- AC_SUBST([HIST_LIBDIR])
-m4trace:configure.ac:615: -1- AC_SUBST_TRACE([HIST_LIBDIR])
-m4trace:configure.ac:615: -1- m4_pattern_allow([^HIST_LIBDIR$])
-m4trace:configure.ac:616: -1- AC_SUBST([TILDE_LIB])
-m4trace:configure.ac:616: -1- AC_SUBST_TRACE([TILDE_LIB])
-m4trace:configure.ac:616: -1- m4_pattern_allow([^TILDE_LIB$])
-m4trace:configure.ac:621: -1- AC_REQUIRE_AUX_FILE([install-sh])
-m4trace:configure.ac:621: -1- AC_SUBST([INSTALL_PROGRAM])
-m4trace:configure.ac:621: -1- AC_SUBST_TRACE([INSTALL_PROGRAM])
-m4trace:configure.ac:621: -1- m4_pattern_allow([^INSTALL_PROGRAM$])
-m4trace:configure.ac:621: -1- AC_SUBST([INSTALL_SCRIPT])
-m4trace:configure.ac:621: -1- AC_SUBST_TRACE([INSTALL_SCRIPT])
-m4trace:configure.ac:621: -1- m4_pattern_allow([^INSTALL_SCRIPT$])
-m4trace:configure.ac:621: -1- AC_SUBST([INSTALL_DATA])
-m4trace:configure.ac:621: -1- AC_SUBST_TRACE([INSTALL_DATA])
-m4trace:configure.ac:621: -1- m4_pattern_allow([^INSTALL_DATA$])
-m4trace:configure.ac:622: -1- AC_SUBST([AR])
-m4trace:configure.ac:622: -1- AC_SUBST_TRACE([AR])
-m4trace:configure.ac:622: -1- m4_pattern_allow([^AR$])
-m4trace:configure.ac:626: -1- AC_SUBST([RANLIB])
-m4trace:configure.ac:626: -1- AC_SUBST_TRACE([RANLIB])
-m4trace:configure.ac:626: -1- m4_pattern_allow([^RANLIB$])
-m4trace:configure.ac:627: -1- AC_SUBST([YACC])
-m4trace:configure.ac:627: -1- AC_SUBST_TRACE([YACC])
-m4trace:configure.ac:627: -1- m4_pattern_allow([^YACC$])
-m4trace:configure.ac:627: -1- AC_SUBST([YACC])
-m4trace:configure.ac:627: -1- AC_SUBST_TRACE([YACC])
-m4trace:configure.ac:627: -1- m4_pattern_allow([^YACC$])
-m4trace:configure.ac:627: -1- AC_SUBST([YFLAGS])
-m4trace:configure.ac:627: -1- AC_SUBST_TRACE([YFLAGS])
-m4trace:configure.ac:627: -1- m4_pattern_allow([^YFLAGS$])
-m4trace:configure.ac:628: -1- AC_SUBST([SET_MAKE])
-m4trace:configure.ac:628: -1- AC_SUBST_TRACE([SET_MAKE])
-m4trace:configure.ac:628: -1- m4_pattern_allow([^SET_MAKE$])
-m4trace:configure.ac:634: -1- AC_SUBST([MAKE_SHELL])
-m4trace:configure.ac:634: -1- AC_SUBST_TRACE([MAKE_SHELL])
-m4trace:configure.ac:634: -1- m4_pattern_allow([^MAKE_SHELL$])
-m4trace:configure.ac:656: -1- AC_SUBST([SIZE])
-m4trace:configure.ac:656: -1- AC_SUBST_TRACE([SIZE])
-m4trace:configure.ac:656: -1- m4_pattern_allow([^SIZE$])
-m4trace:configure.ac:658: -1- m4_include([m4/stat-time.m4])
-m4trace:configure.ac:659: -1- m4_include([m4/timespec.m4])
-m4trace:configure.ac:662: -1- AC_DEFINE_TRACE_LITERAL([_GNU_SOURCE])
-m4trace:configure.ac:662: -1- m4_pattern_allow([^_GNU_SOURCE$])
-m4trace:configure.ac:665: -1- AC_DEFINE_TRACE_LITERAL([const])
-m4trace:configure.ac:665: -1- m4_pattern_allow([^const$])
-m4trace:configure.ac:665: -1- AH_OUTPUT([const], [/* Define to empty if `const\' does not conform to ANSI C. */
+m4trace:configure.ac:533: -1- AC_SUBST([RL_VERSION])
+m4trace:configure.ac:533: -1- AC_SUBST_TRACE([RL_VERSION])
+m4trace:configure.ac:533: -1- m4_pattern_allow([^RL_VERSION$])
+m4trace:configure.ac:533: -1- AC_SUBST([RL_MAJOR])
+m4trace:configure.ac:533: -1- AC_SUBST_TRACE([RL_MAJOR])
+m4trace:configure.ac:533: -1- m4_pattern_allow([^RL_MAJOR$])
+m4trace:configure.ac:533: -1- AC_SUBST([RL_MINOR])
+m4trace:configure.ac:533: -1- AC_SUBST_TRACE([RL_MINOR])
+m4trace:configure.ac:533: -1- m4_pattern_allow([^RL_MINOR$])
+m4trace:configure.ac:546: -1- AC_DEFINE_TRACE_LITERAL([READLINE])
+m4trace:configure.ac:546: -1- m4_pattern_allow([^READLINE$])
+m4trace:configure.ac:581: -1- AC_DEFINE_TRACE_LITERAL([HISTORY])
+m4trace:configure.ac:581: -1- m4_pattern_allow([^HISTORY$])
+m4trace:configure.ac:584: -1- AC_DEFINE_TRACE_LITERAL([BANG_HISTORY])
+m4trace:configure.ac:584: -1- m4_pattern_allow([^BANG_HISTORY$])
+m4trace:configure.ac:614: -1- AC_SUBST([READLINE_LIB])
+m4trace:configure.ac:614: -1- AC_SUBST_TRACE([READLINE_LIB])
+m4trace:configure.ac:614: -1- m4_pattern_allow([^READLINE_LIB$])
+m4trace:configure.ac:615: -1- AC_SUBST([READLINE_DEP])
+m4trace:configure.ac:615: -1- AC_SUBST_TRACE([READLINE_DEP])
+m4trace:configure.ac:615: -1- m4_pattern_allow([^READLINE_DEP$])
+m4trace:configure.ac:616: -1- AC_SUBST([RL_LIBDIR])
+m4trace:configure.ac:616: -1- AC_SUBST_TRACE([RL_LIBDIR])
+m4trace:configure.ac:616: -1- m4_pattern_allow([^RL_LIBDIR$])
+m4trace:configure.ac:617: -1- AC_SUBST([RL_INCLUDEDIR])
+m4trace:configure.ac:617: -1- AC_SUBST_TRACE([RL_INCLUDEDIR])
+m4trace:configure.ac:617: -1- m4_pattern_allow([^RL_INCLUDEDIR$])
+m4trace:configure.ac:618: -1- AC_SUBST([RL_INCLUDE])
+m4trace:configure.ac:618: -1- AC_SUBST_TRACE([RL_INCLUDE])
+m4trace:configure.ac:618: -1- m4_pattern_allow([^RL_INCLUDE$])
+m4trace:configure.ac:619: -1- AC_SUBST([HISTORY_LIB])
+m4trace:configure.ac:619: -1- AC_SUBST_TRACE([HISTORY_LIB])
+m4trace:configure.ac:619: -1- m4_pattern_allow([^HISTORY_LIB$])
+m4trace:configure.ac:620: -1- AC_SUBST([HISTORY_DEP])
+m4trace:configure.ac:620: -1- AC_SUBST_TRACE([HISTORY_DEP])
+m4trace:configure.ac:620: -1- m4_pattern_allow([^HISTORY_DEP$])
+m4trace:configure.ac:621: -1- AC_SUBST([HIST_LIBDIR])
+m4trace:configure.ac:621: -1- AC_SUBST_TRACE([HIST_LIBDIR])
+m4trace:configure.ac:621: -1- m4_pattern_allow([^HIST_LIBDIR$])
+m4trace:configure.ac:622: -1- AC_SUBST([TILDE_LIB])
+m4trace:configure.ac:622: -1- AC_SUBST_TRACE([TILDE_LIB])
+m4trace:configure.ac:622: -1- m4_pattern_allow([^TILDE_LIB$])
+m4trace:configure.ac:627: -1- AC_REQUIRE_AUX_FILE([install-sh])
+m4trace:configure.ac:627: -1- AC_SUBST([INSTALL_PROGRAM])
+m4trace:configure.ac:627: -1- AC_SUBST_TRACE([INSTALL_PROGRAM])
+m4trace:configure.ac:627: -1- m4_pattern_allow([^INSTALL_PROGRAM$])
+m4trace:configure.ac:627: -1- AC_SUBST([INSTALL_SCRIPT])
+m4trace:configure.ac:627: -1- AC_SUBST_TRACE([INSTALL_SCRIPT])
+m4trace:configure.ac:627: -1- m4_pattern_allow([^INSTALL_SCRIPT$])
+m4trace:configure.ac:627: -1- AC_SUBST([INSTALL_DATA])
+m4trace:configure.ac:627: -1- AC_SUBST_TRACE([INSTALL_DATA])
+m4trace:configure.ac:627: -1- m4_pattern_allow([^INSTALL_DATA$])
+m4trace:configure.ac:628: -1- AC_SUBST([AR])
+m4trace:configure.ac:628: -1- AC_SUBST_TRACE([AR])
+m4trace:configure.ac:628: -1- m4_pattern_allow([^AR$])
+m4trace:configure.ac:632: -1- AC_SUBST([RANLIB])
+m4trace:configure.ac:632: -1- AC_SUBST_TRACE([RANLIB])
+m4trace:configure.ac:632: -1- m4_pattern_allow([^RANLIB$])
+m4trace:configure.ac:633: -1- AC_SUBST([YACC])
+m4trace:configure.ac:633: -1- AC_SUBST_TRACE([YACC])
+m4trace:configure.ac:633: -1- m4_pattern_allow([^YACC$])
+m4trace:configure.ac:633: -1- AC_SUBST([YACC])
+m4trace:configure.ac:633: -1- AC_SUBST_TRACE([YACC])
+m4trace:configure.ac:633: -1- m4_pattern_allow([^YACC$])
+m4trace:configure.ac:633: -1- AC_SUBST([YFLAGS])
+m4trace:configure.ac:633: -1- AC_SUBST_TRACE([YFLAGS])
+m4trace:configure.ac:633: -1- m4_pattern_allow([^YFLAGS$])
+m4trace:configure.ac:634: -1- AC_SUBST([SET_MAKE])
+m4trace:configure.ac:634: -1- AC_SUBST_TRACE([SET_MAKE])
+m4trace:configure.ac:634: -1- m4_pattern_allow([^SET_MAKE$])
+m4trace:configure.ac:640: -1- AC_SUBST([MAKE_SHELL])
+m4trace:configure.ac:640: -1- AC_SUBST_TRACE([MAKE_SHELL])
+m4trace:configure.ac:640: -1- m4_pattern_allow([^MAKE_SHELL$])
+m4trace:configure.ac:662: -1- AC_SUBST([SIZE])
+m4trace:configure.ac:662: -1- AC_SUBST_TRACE([SIZE])
+m4trace:configure.ac:662: -1- m4_pattern_allow([^SIZE$])
+m4trace:configure.ac:664: -1- m4_include([m4/stat-time.m4])
+m4trace:configure.ac:665: -1- m4_include([m4/timespec.m4])
+m4trace:configure.ac:668: -1- AC_DEFINE_TRACE_LITERAL([_GNU_SOURCE])
+m4trace:configure.ac:668: -1- m4_pattern_allow([^_GNU_SOURCE$])
+m4trace:configure.ac:671: -1- AC_DEFINE_TRACE_LITERAL([const])
+m4trace:configure.ac:671: -1- m4_pattern_allow([^const$])
+m4trace:configure.ac:671: -1- AH_OUTPUT([const], [/* Define to empty if `const\' does not conform to ANSI C. */
 @%:@undef const])
-m4trace:configure.ac:666: -1- AH_OUTPUT([inline], [/* Define to `__inline__\' or `__inline\' if that\'s what the C compiler
+m4trace:configure.ac:672: -1- AH_OUTPUT([inline], [/* Define to `__inline__\' or `__inline\' if that\'s what the C compiler
    calls it, or to nothing if \'inline\' is not supported under any name.  */
 #ifndef __cplusplus
 #undef inline
 #endif])
-m4trace:configure.ac:667: -1- AH_OUTPUT([WORDS_BIGENDIAN], [/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+m4trace:configure.ac:673: -1- AH_OUTPUT([WORDS_BIGENDIAN], [/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
    significant byte first (like Motorola and SPARC, unlike Intel). */
 #if defined AC_APPLE_UNIVERSAL_BUILD
 # if defined __BIG_ENDIAN__
@@ -713,49 +718,49 @@ m4trace:configure.ac:667: -1- AH_OUTPUT([WORDS_BIGENDIAN], [/* Define WORDS_BIGE
 #  undef WORDS_BIGENDIAN
 # endif
 #endif])
-m4trace:configure.ac:667: -1- AC_DEFINE_TRACE_LITERAL([WORDS_BIGENDIAN])
-m4trace:configure.ac:667: -1- m4_pattern_allow([^WORDS_BIGENDIAN$])
-m4trace:configure.ac:667: -1- AC_DEFINE_TRACE_LITERAL([AC_APPLE_UNIVERSAL_BUILD])
-m4trace:configure.ac:667: -1- m4_pattern_allow([^AC_APPLE_UNIVERSAL_BUILD$])
-m4trace:configure.ac:667: -1- AH_OUTPUT([AC_APPLE_UNIVERSAL_BUILD], [/* Define if building universal (internal helper macro) */
+m4trace:configure.ac:673: -1- AC_DEFINE_TRACE_LITERAL([WORDS_BIGENDIAN])
+m4trace:configure.ac:673: -1- m4_pattern_allow([^WORDS_BIGENDIAN$])
+m4trace:configure.ac:673: -1- AC_DEFINE_TRACE_LITERAL([AC_APPLE_UNIVERSAL_BUILD])
+m4trace:configure.ac:673: -1- m4_pattern_allow([^AC_APPLE_UNIVERSAL_BUILD$])
+m4trace:configure.ac:673: -1- AH_OUTPUT([AC_APPLE_UNIVERSAL_BUILD], [/* Define if building universal (internal helper macro) */
 @%:@undef AC_APPLE_UNIVERSAL_BUILD])
-m4trace:configure.ac:668: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRINGIZE])
-m4trace:configure.ac:668: -1- m4_pattern_allow([^HAVE_STRINGIZE$])
-m4trace:configure.ac:668: -1- AH_OUTPUT([HAVE_STRINGIZE], [/* Define to 1 if cpp supports the ANSI @%:@ stringizing operator. */
+m4trace:configure.ac:674: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRINGIZE])
+m4trace:configure.ac:674: -1- m4_pattern_allow([^HAVE_STRINGIZE$])
+m4trace:configure.ac:674: -1- AH_OUTPUT([HAVE_STRINGIZE], [/* Define to 1 if cpp supports the ANSI @%:@ stringizing operator. */
 @%:@undef HAVE_STRINGIZE])
-m4trace:configure.ac:669: -1- _m4_warn([obsolete], [The macro `AC_C_LONG_DOUBLE' is obsolete.
+m4trace:configure.ac:675: -1- _m4_warn([obsolete], [The macro `AC_C_LONG_DOUBLE' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/types.m4:451: AC_C_LONG_DOUBLE is expanded from...
-configure.ac:669: the top level])
-m4trace:configure.ac:669: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LONG_DOUBLE_WIDER])
-m4trace:configure.ac:669: -1- m4_pattern_allow([^HAVE_LONG_DOUBLE_WIDER$])
-m4trace:configure.ac:669: -1- AH_OUTPUT([HAVE_LONG_DOUBLE_WIDER], [/* Define to 1 if the type `long double\' works and has more range or precision
+configure.ac:675: the top level])
+m4trace:configure.ac:675: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LONG_DOUBLE_WIDER])
+m4trace:configure.ac:675: -1- m4_pattern_allow([^HAVE_LONG_DOUBLE_WIDER$])
+m4trace:configure.ac:675: -1- AH_OUTPUT([HAVE_LONG_DOUBLE_WIDER], [/* Define to 1 if the type `long double\' works and has more range or precision
    than `double\'. */
 @%:@undef HAVE_LONG_DOUBLE_WIDER])
-m4trace:configure.ac:669: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LONG_DOUBLE])
-m4trace:configure.ac:669: -1- m4_pattern_allow([^HAVE_LONG_DOUBLE$])
-m4trace:configure.ac:669: -1- AH_OUTPUT([HAVE_LONG_DOUBLE], [/* Define to 1 if the type `long double\' works and has more range or precision
+m4trace:configure.ac:675: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LONG_DOUBLE])
+m4trace:configure.ac:675: -1- m4_pattern_allow([^HAVE_LONG_DOUBLE$])
+m4trace:configure.ac:675: -1- AH_OUTPUT([HAVE_LONG_DOUBLE], [/* Define to 1 if the type `long double\' works and has more range or precision
    than `double\'. */
 @%:@undef HAVE_LONG_DOUBLE])
-m4trace:configure.ac:670: -1- AC_DEFINE_TRACE_LITERAL([PROTOTYPES])
-m4trace:configure.ac:670: -1- m4_pattern_allow([^PROTOTYPES$])
-m4trace:configure.ac:670: -1- AH_OUTPUT([PROTOTYPES], [/* Define to 1 if the C compiler supports function prototypes. */
+m4trace:configure.ac:676: -1- AC_DEFINE_TRACE_LITERAL([PROTOTYPES])
+m4trace:configure.ac:676: -1- m4_pattern_allow([^PROTOTYPES$])
+m4trace:configure.ac:676: -1- AH_OUTPUT([PROTOTYPES], [/* Define to 1 if the C compiler supports function prototypes. */
 @%:@undef PROTOTYPES])
-m4trace:configure.ac:670: -1- AC_DEFINE_TRACE_LITERAL([__PROTOTYPES])
-m4trace:configure.ac:670: -1- m4_pattern_allow([^__PROTOTYPES$])
-m4trace:configure.ac:670: -1- AH_OUTPUT([__PROTOTYPES], [/* Define like PROTOTYPES; this can be used by system headers. */
+m4trace:configure.ac:676: -1- AC_DEFINE_TRACE_LITERAL([__PROTOTYPES])
+m4trace:configure.ac:676: -1- m4_pattern_allow([^__PROTOTYPES$])
+m4trace:configure.ac:676: -1- AH_OUTPUT([__PROTOTYPES], [/* Define like PROTOTYPES; this can be used by system headers. */
 @%:@undef __PROTOTYPES])
-m4trace:configure.ac:671: -1- AH_OUTPUT([__CHAR_UNSIGNED__], [/* Define to 1 if type `char\' is unsigned and you are not using gcc.  */
+m4trace:configure.ac:677: -1- AH_OUTPUT([__CHAR_UNSIGNED__], [/* Define to 1 if type `char\' is unsigned and you are not using gcc.  */
 #ifndef __CHAR_UNSIGNED__
 # undef __CHAR_UNSIGNED__
 #endif])
-m4trace:configure.ac:671: -1- AC_DEFINE_TRACE_LITERAL([__CHAR_UNSIGNED__])
-m4trace:configure.ac:671: -1- m4_pattern_allow([^__CHAR_UNSIGNED__$])
-m4trace:configure.ac:672: -1- AC_DEFINE_TRACE_LITERAL([volatile])
-m4trace:configure.ac:672: -1- m4_pattern_allow([^volatile$])
-m4trace:configure.ac:672: -1- AH_OUTPUT([volatile], [/* Define to empty if the keyword `volatile\' does not work. Warning: valid
+m4trace:configure.ac:677: -1- AC_DEFINE_TRACE_LITERAL([__CHAR_UNSIGNED__])
+m4trace:configure.ac:677: -1- m4_pattern_allow([^__CHAR_UNSIGNED__$])
+m4trace:configure.ac:678: -1- AC_DEFINE_TRACE_LITERAL([volatile])
+m4trace:configure.ac:678: -1- m4_pattern_allow([^volatile$])
+m4trace:configure.ac:678: -1- AH_OUTPUT([volatile], [/* Define to empty if the keyword `volatile\' does not work. Warning: valid
    code using `volatile\' can become incorrect without. Disable with care. */
 @%:@undef volatile])
-m4trace:configure.ac:673: -1- AH_OUTPUT([restrict], [/* Define to the equivalent of the C99 \'restrict\' keyword, or to
+m4trace:configure.ac:679: -1- AH_OUTPUT([restrict], [/* Define to the equivalent of the C99 \'restrict\' keyword, or to
    nothing if this is not supported.  Do not define if restrict is
    supported directly.  */
 #undef restrict
@@ -768,93 +773,93 @@ m4trace:configure.ac:673: -1- AH_OUTPUT([restrict], [/* Define to the equivalent
 # define _Restrict
 # define __restrict__
 #endif])
-m4trace:configure.ac:673: -1- AC_DEFINE_TRACE_LITERAL([restrict])
-m4trace:configure.ac:673: -1- m4_pattern_allow([^restrict$])
-m4trace:configure.ac:673: -1- AC_DEFINE_TRACE_LITERAL([restrict])
-m4trace:configure.ac:673: -1- m4_pattern_allow([^restrict$])
-m4trace:configure.ac:676: -1- AM_GNU_GETTEXT([no-libtool], [need-ngettext], [lib/intl])
-m4trace:configure.ac:676: -1- AC_SUBST([MKINSTALLDIRS])
-m4trace:configure.ac:676: -1- AC_SUBST_TRACE([MKINSTALLDIRS])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^MKINSTALLDIRS$])
-m4trace:configure.ac:676: -1- AM_NLS
-m4trace:configure.ac:676: -1- AC_SUBST([USE_NLS])
-m4trace:configure.ac:676: -1- AC_SUBST_TRACE([USE_NLS])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^USE_NLS$])
-m4trace:configure.ac:676: -1- AC_SUBST([MSGFMT])
-m4trace:configure.ac:676: -1- AC_SUBST_TRACE([MSGFMT])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^MSGFMT$])
-m4trace:configure.ac:676: -1- AC_SUBST([GMSGFMT])
-m4trace:configure.ac:676: -1- AC_SUBST_TRACE([GMSGFMT])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^GMSGFMT$])
-m4trace:configure.ac:676: -1- AC_SUBST([XGETTEXT])
-m4trace:configure.ac:676: -1- AC_SUBST_TRACE([XGETTEXT])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^XGETTEXT$])
-m4trace:configure.ac:676: -1- AC_SUBST([MSGMERGE])
-m4trace:configure.ac:676: -1- AC_SUBST_TRACE([MSGMERGE])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^MSGMERGE$])
-m4trace:configure.ac:676: -1- _m4_warn([obsolete], [The macro `AC_OUTPUT_COMMANDS' is obsolete.
+m4trace:configure.ac:679: -1- AC_DEFINE_TRACE_LITERAL([restrict])
+m4trace:configure.ac:679: -1- m4_pattern_allow([^restrict$])
+m4trace:configure.ac:679: -1- AC_DEFINE_TRACE_LITERAL([restrict])
+m4trace:configure.ac:679: -1- m4_pattern_allow([^restrict$])
+m4trace:configure.ac:682: -1- AM_GNU_GETTEXT([no-libtool], [need-ngettext], [lib/intl])
+m4trace:configure.ac:682: -1- AC_SUBST([MKINSTALLDIRS])
+m4trace:configure.ac:682: -1- AC_SUBST_TRACE([MKINSTALLDIRS])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^MKINSTALLDIRS$])
+m4trace:configure.ac:682: -1- AM_NLS
+m4trace:configure.ac:682: -1- AC_SUBST([USE_NLS])
+m4trace:configure.ac:682: -1- AC_SUBST_TRACE([USE_NLS])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^USE_NLS$])
+m4trace:configure.ac:682: -1- AC_SUBST([MSGFMT])
+m4trace:configure.ac:682: -1- AC_SUBST_TRACE([MSGFMT])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^MSGFMT$])
+m4trace:configure.ac:682: -1- AC_SUBST([GMSGFMT])
+m4trace:configure.ac:682: -1- AC_SUBST_TRACE([GMSGFMT])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^GMSGFMT$])
+m4trace:configure.ac:682: -1- AC_SUBST([XGETTEXT])
+m4trace:configure.ac:682: -1- AC_SUBST_TRACE([XGETTEXT])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^XGETTEXT$])
+m4trace:configure.ac:682: -1- AC_SUBST([MSGMERGE])
+m4trace:configure.ac:682: -1- AC_SUBST_TRACE([MSGMERGE])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^MSGMERGE$])
+m4trace:configure.ac:682: -1- _m4_warn([obsolete], [The macro `AC_OUTPUT_COMMANDS' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/status.m4:1028: AC_OUTPUT_COMMANDS is expanded from...
 aclocal.m4:3707: AM_PO_SUBDIRS is expanded from...
 aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
-configure.ac:676: the top level])
-m4trace:configure.ac:676: -1- AC_DEFINE_TRACE_LITERAL([off_t])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^off_t$])
-m4trace:configure.ac:676: -1- AH_OUTPUT([off_t], [/* Define to `long int\' if <sys/types.h> does not define. */
+configure.ac:682: the top level])
+m4trace:configure.ac:682: -1- AC_DEFINE_TRACE_LITERAL([off_t])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^off_t$])
+m4trace:configure.ac:682: -1- AH_OUTPUT([off_t], [/* Define to `long int\' if <sys/types.h> does not define. */
 @%:@undef off_t])
-m4trace:configure.ac:676: -1- AC_DEFINE_TRACE_LITERAL([size_t])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^size_t$])
-m4trace:configure.ac:676: -1- AH_OUTPUT([size_t], [/* Define to `unsigned int\' if <sys/types.h> does not define. */
+m4trace:configure.ac:682: -1- AC_DEFINE_TRACE_LITERAL([size_t])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^size_t$])
+m4trace:configure.ac:682: -1- AH_OUTPUT([size_t], [/* Define to `unsigned int\' if <sys/types.h> does not define. */
 @%:@undef size_t])
-m4trace:configure.ac:676: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ALLOCA_H])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^HAVE_ALLOCA_H$])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_ALLOCA_H], [/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
+m4trace:configure.ac:682: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ALLOCA_H])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^HAVE_ALLOCA_H$])
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_ALLOCA_H], [/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
    */
 @%:@undef HAVE_ALLOCA_H])
-m4trace:configure.ac:676: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ALLOCA])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^HAVE_ALLOCA$])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_ALLOCA], [/* Define to 1 if you have `alloca\', as a function or macro. */
+m4trace:configure.ac:682: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ALLOCA])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^HAVE_ALLOCA$])
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_ALLOCA], [/* Define to 1 if you have `alloca\', as a function or macro. */
 @%:@undef HAVE_ALLOCA])
-m4trace:configure.ac:676: -1- AC_LIBSOURCE([alloca.c])
-m4trace:configure.ac:676: -1- AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.$ac_objext])
-m4trace:configure.ac:676: -1- AC_SUBST_TRACE([ALLOCA])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^ALLOCA$])
-m4trace:configure.ac:676: -1- AC_DEFINE_TRACE_LITERAL([C_ALLOCA])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^C_ALLOCA$])
-m4trace:configure.ac:676: -1- AH_OUTPUT([C_ALLOCA], [/* Define to 1 if using `alloca.c\'. */
+m4trace:configure.ac:682: -1- AC_LIBSOURCE([alloca.c])
+m4trace:configure.ac:682: -1- AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.$ac_objext])
+m4trace:configure.ac:682: -1- AC_SUBST_TRACE([ALLOCA])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^ALLOCA$])
+m4trace:configure.ac:682: -1- AC_DEFINE_TRACE_LITERAL([C_ALLOCA])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^C_ALLOCA$])
+m4trace:configure.ac:682: -1- AH_OUTPUT([C_ALLOCA], [/* Define to 1 if using `alloca.c\'. */
 @%:@undef C_ALLOCA])
-m4trace:configure.ac:676: -1- AC_DEFINE_TRACE_LITERAL([CRAY_STACKSEG_END])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^CRAY_STACKSEG_END$])
-m4trace:configure.ac:676: -1- AH_OUTPUT([CRAY_STACKSEG_END], [/* Define to one of `_getb67\', `GETB67\', `getb67\' for Cray-2 and Cray-YMP
+m4trace:configure.ac:682: -1- AC_DEFINE_TRACE_LITERAL([CRAY_STACKSEG_END])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^CRAY_STACKSEG_END$])
+m4trace:configure.ac:682: -1- AH_OUTPUT([CRAY_STACKSEG_END], [/* Define to one of `_getb67\', `GETB67\', `getb67\' for Cray-2 and Cray-YMP
    systems. This function is required for `alloca.c\' support on those systems.
    */
 @%:@undef CRAY_STACKSEG_END])
-m4trace:configure.ac:676: -1- AH_OUTPUT([STACK_DIRECTION], [/* If using the C implementation of alloca, define if you know the
+m4trace:configure.ac:682: -1- AH_OUTPUT([STACK_DIRECTION], [/* If using the C implementation of alloca, define if you know the
    direction of stack growth for your system; otherwise it will be
    automatically deduced at runtime.
        STACK_DIRECTION > 0 => grows toward higher addresses
        STACK_DIRECTION < 0 => grows toward lower addresses
        STACK_DIRECTION = 0 => direction of growth unknown */
 @%:@undef STACK_DIRECTION])
-m4trace:configure.ac:676: -1- AC_DEFINE_TRACE_LITERAL([STACK_DIRECTION])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^STACK_DIRECTION$])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the <stdlib.h> header file. */
+m4trace:configure.ac:682: -1- AC_DEFINE_TRACE_LITERAL([STACK_DIRECTION])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^STACK_DIRECTION$])
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the <stdlib.h> header file. */
 @%:@undef HAVE_STDLIB_H])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the <unistd.h> header file. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the <unistd.h> header file. */
 @%:@undef HAVE_UNISTD_H])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_SYS_PARAM_H], [/* Define to 1 if you have the <sys/param.h> header file. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_SYS_PARAM_H], [/* Define to 1 if you have the <sys/param.h> header file. */
 @%:@undef HAVE_SYS_PARAM_H])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_GETPAGESIZE], [/* Define to 1 if you have the `getpagesize\' function. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_GETPAGESIZE], [/* Define to 1 if you have the `getpagesize\' function. */
 @%:@undef HAVE_GETPAGESIZE])
-m4trace:configure.ac:676: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GETPAGESIZE])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^HAVE_GETPAGESIZE$])
-m4trace:configure.ac:676: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MMAP])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^HAVE_MMAP$])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_MMAP], [/* Define to 1 if you have a working `mmap\' system call. */
+m4trace:configure.ac:682: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GETPAGESIZE])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^HAVE_GETPAGESIZE$])
+m4trace:configure.ac:682: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MMAP])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^HAVE_MMAP$])
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_MMAP], [/* Define to 1 if you have a working `mmap\' system call. */
 @%:@undef HAVE_MMAP])
-m4trace:configure.ac:676: -1- AC_SUBST([GLIBC21])
-m4trace:configure.ac:676: -1- AC_SUBST_TRACE([GLIBC21])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^GLIBC21$])
-m4trace:configure.ac:676: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
+m4trace:configure.ac:682: -1- AC_SUBST([GLIBC21])
+m4trace:configure.ac:682: -1- AC_SUBST_TRACE([GLIBC21])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^GLIBC21$])
+m4trace:configure.ac:682: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
@@ -862,12 +867,12 @@ You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is
 aclocal.m4:2613: gt_INTDIV0 is expanded from...
 aclocal.m4:2399: AM_INTL_SUBDIR is expanded from...
 aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
-configure.ac:676: the top level])
-m4trace:configure.ac:676: -1- AC_DEFINE_TRACE_LITERAL([INTDIV0_RAISES_SIGFPE])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^INTDIV0_RAISES_SIGFPE$])
-m4trace:configure.ac:676: -1- AH_OUTPUT([INTDIV0_RAISES_SIGFPE], [/* Define if integer division by zero raises signal SIGFPE. */
+configure.ac:682: the top level])
+m4trace:configure.ac:682: -1- AC_DEFINE_TRACE_LITERAL([INTDIV0_RAISES_SIGFPE])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^INTDIV0_RAISES_SIGFPE$])
+m4trace:configure.ac:682: -1- AH_OUTPUT([INTDIV0_RAISES_SIGFPE], [/* Define if integer division by zero raises signal SIGFPE. */
 @%:@undef INTDIV0_RAISES_SIGFPE])
-m4trace:configure.ac:676: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
+m4trace:configure.ac:682: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
@@ -876,13 +881,13 @@ aclocal.m4:2715: jm_AC_HEADER_INTTYPES_H is expanded from...
 aclocal.m4:4016: jm_AC_TYPE_UINTMAX_T is expanded from...
 aclocal.m4:2399: AM_INTL_SUBDIR is expanded from...
 aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
-configure.ac:676: the top level])
-m4trace:configure.ac:676: -1- AC_DEFINE_TRACE_LITERAL([HAVE_INTTYPES_H_WITH_UINTMAX])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^HAVE_INTTYPES_H_WITH_UINTMAX$])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_INTTYPES_H_WITH_UINTMAX], [/* Define if <inttypes.h> exists, doesn\'t clash with <sys/types.h>, and
+configure.ac:682: the top level])
+m4trace:configure.ac:682: -1- AC_DEFINE_TRACE_LITERAL([HAVE_INTTYPES_H_WITH_UINTMAX])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^HAVE_INTTYPES_H_WITH_UINTMAX$])
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_INTTYPES_H_WITH_UINTMAX], [/* Define if <inttypes.h> exists, doesn\'t clash with <sys/types.h>, and
    declares uintmax_t. */
 @%:@undef HAVE_INTTYPES_H_WITH_UINTMAX])
-m4trace:configure.ac:676: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
+m4trace:configure.ac:682: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
@@ -891,13 +896,13 @@ aclocal.m4:3986: jm_AC_HEADER_STDINT_H is expanded from...
 aclocal.m4:4016: jm_AC_TYPE_UINTMAX_T is expanded from...
 aclocal.m4:2399: AM_INTL_SUBDIR is expanded from...
 aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
-configure.ac:676: the top level])
-m4trace:configure.ac:676: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STDINT_H_WITH_UINTMAX])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^HAVE_STDINT_H_WITH_UINTMAX$])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_STDINT_H_WITH_UINTMAX], [/* Define if <stdint.h> exists, doesn\'t clash with <sys/types.h>, and declares
+configure.ac:682: the top level])
+m4trace:configure.ac:682: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STDINT_H_WITH_UINTMAX])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^HAVE_STDINT_H_WITH_UINTMAX$])
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_STDINT_H_WITH_UINTMAX], [/* Define if <stdint.h> exists, doesn\'t clash with <sys/types.h>, and declares
    uintmax_t. */
 @%:@undef HAVE_STDINT_H_WITH_UINTMAX])
-m4trace:configure.ac:676: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+m4trace:configure.ac:682: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
@@ -906,21 +911,21 @@ aclocal.m4:4043: jm_AC_TYPE_UNSIGNED_LONG_LONG is expanded from...
 aclocal.m4:4016: jm_AC_TYPE_UINTMAX_T is expanded from...
 aclocal.m4:2399: AM_INTL_SUBDIR is expanded from...
 aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
-configure.ac:676: the top level])
-m4trace:configure.ac:676: -1- AC_DEFINE_TRACE_LITERAL([HAVE_UNSIGNED_LONG_LONG])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^HAVE_UNSIGNED_LONG_LONG$])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_UNSIGNED_LONG_LONG], [/* Define if you have the unsigned long long type. */
+configure.ac:682: the top level])
+m4trace:configure.ac:682: -1- AC_DEFINE_TRACE_LITERAL([HAVE_UNSIGNED_LONG_LONG])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^HAVE_UNSIGNED_LONG_LONG$])
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_UNSIGNED_LONG_LONG], [/* Define if you have the unsigned long long type. */
 @%:@undef HAVE_UNSIGNED_LONG_LONG])
-m4trace:configure.ac:676: -1- AC_DEFINE_TRACE_LITERAL([uintmax_t])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^uintmax_t$])
-m4trace:configure.ac:676: -1- AH_OUTPUT([uintmax_t], [/* Define to unsigned long or unsigned long long if <stdint.h> and
+m4trace:configure.ac:682: -1- AC_DEFINE_TRACE_LITERAL([uintmax_t])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^uintmax_t$])
+m4trace:configure.ac:682: -1- AH_OUTPUT([uintmax_t], [/* Define to unsigned long or unsigned long long if <stdint.h> and
    <inttypes.h> don\'t define. */
 @%:@undef uintmax_t])
-m4trace:configure.ac:676: -1- AC_DEFINE_TRACE_LITERAL([HAVE_UINTMAX_T])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^HAVE_UINTMAX_T$])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_UINTMAX_T], [/* Define if you have the \'uintmax_t\' type in <stdint.h> or <inttypes.h>. */
+m4trace:configure.ac:682: -1- AC_DEFINE_TRACE_LITERAL([HAVE_UINTMAX_T])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^HAVE_UINTMAX_T$])
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_UINTMAX_T], [/* Define if you have the \'uintmax_t\' type in <stdint.h> or <inttypes.h>. */
 @%:@undef HAVE_UINTMAX_T])
-m4trace:configure.ac:676: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
+m4trace:configure.ac:682: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
@@ -928,12 +933,12 @@ You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE
 aclocal.m4:2688: gt_HEADER_INTTYPES_H is expanded from...
 aclocal.m4:2399: AM_INTL_SUBDIR is expanded from...
 aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
-configure.ac:676: the top level])
-m4trace:configure.ac:676: -1- AC_DEFINE_TRACE_LITERAL([HAVE_INTTYPES_H])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^HAVE_INTTYPES_H$])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define if <inttypes.h> exists and doesn\'t clash with <sys/types.h>. */
+configure.ac:682: the top level])
+m4trace:configure.ac:682: -1- AC_DEFINE_TRACE_LITERAL([HAVE_INTTYPES_H])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^HAVE_INTTYPES_H$])
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define if <inttypes.h> exists and doesn\'t clash with <sys/types.h>. */
 @%:@undef HAVE_INTTYPES_H])
-m4trace:configure.ac:676: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
+m4trace:configure.ac:682: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
@@ -941,78 +946,78 @@ You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE
 aclocal.m4:2743: gt_INTTYPES_PRI is expanded from...
 aclocal.m4:2399: AM_INTL_SUBDIR is expanded from...
 aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
-configure.ac:676: the top level])
-m4trace:configure.ac:676: -1- AC_DEFINE_TRACE_LITERAL([PRI_MACROS_BROKEN])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^PRI_MACROS_BROKEN$])
-m4trace:configure.ac:676: -1- AH_OUTPUT([PRI_MACROS_BROKEN], [/* Define if <inttypes.h> exists and defines unusable PRI* macros. */
+configure.ac:682: the top level])
+m4trace:configure.ac:682: -1- AC_DEFINE_TRACE_LITERAL([PRI_MACROS_BROKEN])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^PRI_MACROS_BROKEN$])
+m4trace:configure.ac:682: -1- AH_OUTPUT([PRI_MACROS_BROKEN], [/* Define if <inttypes.h> exists and defines unusable PRI* macros. */
 @%:@undef PRI_MACROS_BROKEN])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_ARGZ_H], [/* Define to 1 if you have the <argz.h> header file. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_ARGZ_H], [/* Define to 1 if you have the <argz.h> header file. */
 @%:@undef HAVE_ARGZ_H])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_LIMITS_H], [/* Define to 1 if you have the <limits.h> header file. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_LIMITS_H], [/* Define to 1 if you have the <limits.h> header file. */
 @%:@undef HAVE_LIMITS_H])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_LOCALE_H], [/* Define to 1 if you have the <locale.h> header file. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_LOCALE_H], [/* Define to 1 if you have the <locale.h> header file. */
 @%:@undef HAVE_LOCALE_H])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_NL_TYPES_H], [/* Define to 1 if you have the <nl_types.h> header file. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_NL_TYPES_H], [/* Define to 1 if you have the <nl_types.h> header file. */
 @%:@undef HAVE_NL_TYPES_H])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_MALLOC_H], [/* Define to 1 if you have the <malloc.h> header file. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_MALLOC_H], [/* Define to 1 if you have the <malloc.h> header file. */
 @%:@undef HAVE_MALLOC_H])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_STDDEF_H], [/* Define to 1 if you have the <stddef.h> header file. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_STDDEF_H], [/* Define to 1 if you have the <stddef.h> header file. */
 @%:@undef HAVE_STDDEF_H])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the <stdlib.h> header file. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the <stdlib.h> header file. */
 @%:@undef HAVE_STDLIB_H])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the <string.h> header file. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the <string.h> header file. */
 @%:@undef HAVE_STRING_H])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the <unistd.h> header file. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the <unistd.h> header file. */
 @%:@undef HAVE_UNISTD_H])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_SYS_PARAM_H], [/* Define to 1 if you have the <sys/param.h> header file. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_SYS_PARAM_H], [/* Define to 1 if you have the <sys/param.h> header file. */
 @%:@undef HAVE_SYS_PARAM_H])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_FEOF_UNLOCKED], [/* Define to 1 if you have the `feof_unlocked\' function. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_FEOF_UNLOCKED], [/* Define to 1 if you have the `feof_unlocked\' function. */
 @%:@undef HAVE_FEOF_UNLOCKED])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_FGETS_UNLOCKED], [/* Define to 1 if you have the `fgets_unlocked\' function. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_FGETS_UNLOCKED], [/* Define to 1 if you have the `fgets_unlocked\' function. */
 @%:@undef HAVE_FGETS_UNLOCKED])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_GETC_UNLOCKED], [/* Define to 1 if you have the `getc_unlocked\' function. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_GETC_UNLOCKED], [/* Define to 1 if you have the `getc_unlocked\' function. */
 @%:@undef HAVE_GETC_UNLOCKED])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_GETCWD], [/* Define to 1 if you have the `getcwd\' function. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_GETCWD], [/* Define to 1 if you have the `getcwd\' function. */
 @%:@undef HAVE_GETCWD])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_GETEGID], [/* Define to 1 if you have the `getegid\' function. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_GETEGID], [/* Define to 1 if you have the `getegid\' function. */
 @%:@undef HAVE_GETEGID])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_GETEUID], [/* Define to 1 if you have the `geteuid\' function. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_GETEUID], [/* Define to 1 if you have the `geteuid\' function. */
 @%:@undef HAVE_GETEUID])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_GETGID], [/* Define to 1 if you have the `getgid\' function. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_GETGID], [/* Define to 1 if you have the `getgid\' function. */
 @%:@undef HAVE_GETGID])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_GETUID], [/* Define to 1 if you have the `getuid\' function. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_GETUID], [/* Define to 1 if you have the `getuid\' function. */
 @%:@undef HAVE_GETUID])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_MEMPCPY], [/* Define to 1 if you have the `mempcpy\' function. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_MEMPCPY], [/* Define to 1 if you have the `mempcpy\' function. */
 @%:@undef HAVE_MEMPCPY])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_MUNMAP], [/* Define to 1 if you have the `munmap\' function. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_MUNMAP], [/* Define to 1 if you have the `munmap\' function. */
 @%:@undef HAVE_MUNMAP])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_PUTENV], [/* Define to 1 if you have the `putenv\' function. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_PUTENV], [/* Define to 1 if you have the `putenv\' function. */
 @%:@undef HAVE_PUTENV])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_SETENV], [/* Define to 1 if you have the `setenv\' function. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_SETENV], [/* Define to 1 if you have the `setenv\' function. */
 @%:@undef HAVE_SETENV])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_SETLOCALE], [/* Define to 1 if you have the `setlocale\' function. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_SETLOCALE], [/* Define to 1 if you have the `setlocale\' function. */
 @%:@undef HAVE_SETLOCALE])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_LOCALECONV], [/* Define to 1 if you have the `localeconv\' function. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_LOCALECONV], [/* Define to 1 if you have the `localeconv\' function. */
 @%:@undef HAVE_LOCALECONV])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_STPCPY], [/* Define to 1 if you have the `stpcpy\' function. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_STPCPY], [/* Define to 1 if you have the `stpcpy\' function. */
 @%:@undef HAVE_STPCPY])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_STRCASECMP], [/* Define to 1 if you have the `strcasecmp\' function. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_STRCASECMP], [/* Define to 1 if you have the `strcasecmp\' function. */
 @%:@undef HAVE_STRCASECMP])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_STRDUP], [/* Define to 1 if you have the `strdup\' function. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_STRDUP], [/* Define to 1 if you have the `strdup\' function. */
 @%:@undef HAVE_STRDUP])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_STRTOUL], [/* Define to 1 if you have the `strtoul\' function. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_STRTOUL], [/* Define to 1 if you have the `strtoul\' function. */
 @%:@undef HAVE_STRTOUL])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_TSEARCH], [/* Define to 1 if you have the `tsearch\' function. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_TSEARCH], [/* Define to 1 if you have the `tsearch\' function. */
 @%:@undef HAVE_TSEARCH])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE___ARGZ_COUNT], [/* Define to 1 if you have the `__argz_count\' function. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE___ARGZ_COUNT], [/* Define to 1 if you have the `__argz_count\' function. */
 @%:@undef HAVE___ARGZ_COUNT])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE___ARGZ_STRINGIFY], [/* Define to 1 if you have the `__argz_stringify\' function. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE___ARGZ_STRINGIFY], [/* Define to 1 if you have the `__argz_stringify\' function. */
 @%:@undef HAVE___ARGZ_STRINGIFY])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE___ARGZ_NEXT], [/* Define to 1 if you have the `__argz_next\' function. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE___ARGZ_NEXT], [/* Define to 1 if you have the `__argz_next\' function. */
 @%:@undef HAVE___ARGZ_NEXT])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE___FSETLOCKING], [/* Define to 1 if you have the `__fsetlocking\' function. */
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE___FSETLOCKING], [/* Define to 1 if you have the `__fsetlocking\' function. */
 @%:@undef HAVE___FSETLOCKING])
-m4trace:configure.ac:676: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+m4trace:configure.ac:682: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
@@ -1021,8 +1026,8 @@ aclocal.m4:2521: AM_ICONV_LINK is expanded from...
 aclocal.m4:2576: AM_ICONV is expanded from...
 aclocal.m4:2399: AM_INTL_SUBDIR is expanded from...
 aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
-configure.ac:676: the top level])
-m4trace:configure.ac:676: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+configure.ac:682: the top level])
+m4trace:configure.ac:682: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
@@ -1031,30 +1036,30 @@ aclocal.m4:2521: AM_ICONV_LINK is expanded from...
 aclocal.m4:2576: AM_ICONV is expanded from...
 aclocal.m4:2399: AM_INTL_SUBDIR is expanded from...
 aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
-configure.ac:676: the top level])
-m4trace:configure.ac:676: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ICONV])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^HAVE_ICONV$])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_ICONV], [/* Define if you have the iconv() function. */
+configure.ac:682: the top level])
+m4trace:configure.ac:682: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ICONV])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^HAVE_ICONV$])
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_ICONV], [/* Define if you have the iconv() function. */
 @%:@undef HAVE_ICONV])
-m4trace:configure.ac:676: -1- AC_SUBST([LIBICONV])
-m4trace:configure.ac:676: -1- AC_SUBST_TRACE([LIBICONV])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^LIBICONV$])
-m4trace:configure.ac:676: -1- AC_SUBST([LTLIBICONV])
-m4trace:configure.ac:676: -1- AC_SUBST_TRACE([LTLIBICONV])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^LTLIBICONV$])
-m4trace:configure.ac:676: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
+m4trace:configure.ac:682: -1- AC_SUBST([LIBICONV])
+m4trace:configure.ac:682: -1- AC_SUBST_TRACE([LIBICONV])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^LIBICONV$])
+m4trace:configure.ac:682: -1- AC_SUBST([LTLIBICONV])
+m4trace:configure.ac:682: -1- AC_SUBST_TRACE([LTLIBICONV])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^LTLIBICONV$])
+m4trace:configure.ac:682: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:2576: AM_ICONV is expanded from...
 aclocal.m4:2399: AM_INTL_SUBDIR is expanded from...
 aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
-configure.ac:676: the top level])
-m4trace:configure.ac:676: -1- AC_DEFINE_TRACE_LITERAL([ICONV_CONST])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^ICONV_CONST$])
-m4trace:configure.ac:676: -1- AH_OUTPUT([ICONV_CONST], [/* Define as const if the declaration of iconv() needs const. */
+configure.ac:682: the top level])
+m4trace:configure.ac:682: -1- AC_DEFINE_TRACE_LITERAL([ICONV_CONST])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^ICONV_CONST$])
+m4trace:configure.ac:682: -1- AH_OUTPUT([ICONV_CONST], [/* Define as const if the declaration of iconv() needs const. */
 @%:@undef ICONV_CONST])
-m4trace:configure.ac:676: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+m4trace:configure.ac:682: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
@@ -1062,12 +1067,12 @@ You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is
 aclocal.m4:2040: AM_LANGINFO_CODESET is expanded from...
 aclocal.m4:2399: AM_INTL_SUBDIR is expanded from...
 aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
-configure.ac:676: the top level])
-m4trace:configure.ac:676: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LANGINFO_CODESET])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^HAVE_LANGINFO_CODESET$])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_LANGINFO_CODESET], [/* Define if you have <langinfo.h> and nl_langinfo(CODESET). */
+configure.ac:682: the top level])
+m4trace:configure.ac:682: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LANGINFO_CODESET])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^HAVE_LANGINFO_CODESET$])
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_LANGINFO_CODESET], [/* Define if you have <langinfo.h> and nl_langinfo(CODESET). */
 @%:@undef HAVE_LANGINFO_CODESET])
-m4trace:configure.ac:676: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+m4trace:configure.ac:682: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
@@ -1075,1106 +1080,1106 @@ You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is
 aclocal.m4:2810: AM_LC_MESSAGES is expanded from...
 aclocal.m4:2399: AM_INTL_SUBDIR is expanded from...
 aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
-configure.ac:676: the top level])
-m4trace:configure.ac:676: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LC_MESSAGES])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^HAVE_LC_MESSAGES$])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_LC_MESSAGES], [/* Define if your <locale.h> file defines LC_MESSAGES. */
+configure.ac:682: the top level])
+m4trace:configure.ac:682: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LC_MESSAGES])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^HAVE_LC_MESSAGES$])
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_LC_MESSAGES], [/* Define if your <locale.h> file defines LC_MESSAGES. */
 @%:@undef HAVE_LC_MESSAGES])
-m4trace:configure.ac:676: -1- AC_SUBST([INTLBISON])
-m4trace:configure.ac:676: -1- AC_SUBST_TRACE([INTLBISON])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^INTLBISON$])
-m4trace:configure.ac:676: -1- AM_NLS
-m4trace:configure.ac:676: -1- AC_SUBST([USE_NLS])
-m4trace:configure.ac:676: -1- AC_SUBST_TRACE([USE_NLS])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^USE_NLS$])
-m4trace:configure.ac:676: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+m4trace:configure.ac:682: -1- AC_SUBST([INTLBISON])
+m4trace:configure.ac:682: -1- AC_SUBST_TRACE([INTLBISON])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^INTLBISON$])
+m4trace:configure.ac:682: -1- AM_NLS
+m4trace:configure.ac:682: -1- AC_SUBST([USE_NLS])
+m4trace:configure.ac:682: -1- AC_SUBST_TRACE([USE_NLS])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^USE_NLS$])
+m4trace:configure.ac:682: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
 aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
-configure.ac:676: the top level])
-m4trace:configure.ac:676: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+configure.ac:682: the top level])
+m4trace:configure.ac:682: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
 aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
-configure.ac:676: the top level])
-m4trace:configure.ac:676: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+configure.ac:682: the top level])
+m4trace:configure.ac:682: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
 aclocal.m4:2111: AM_GNU_GETTEXT is expanded from...
-configure.ac:676: the top level])
-m4trace:configure.ac:676: -1- AC_DEFINE_TRACE_LITERAL([ENABLE_NLS])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^ENABLE_NLS$])
-m4trace:configure.ac:676: -1- AH_OUTPUT([ENABLE_NLS], [/* Define to 1 if translation of program messages to the user\'s native
+configure.ac:682: the top level])
+m4trace:configure.ac:682: -1- AC_DEFINE_TRACE_LITERAL([ENABLE_NLS])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^ENABLE_NLS$])
+m4trace:configure.ac:682: -1- AH_OUTPUT([ENABLE_NLS], [/* Define to 1 if translation of program messages to the user\'s native
    language is requested. */
 @%:@undef ENABLE_NLS])
-m4trace:configure.ac:676: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GETTEXT])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^HAVE_GETTEXT$])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_GETTEXT], [/* Define if the GNU gettext() function is already present or preinstalled. */
+m4trace:configure.ac:682: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GETTEXT])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^HAVE_GETTEXT$])
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_GETTEXT], [/* Define if the GNU gettext() function is already present or preinstalled. */
 @%:@undef HAVE_GETTEXT])
-m4trace:configure.ac:676: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DCGETTEXT])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^HAVE_DCGETTEXT$])
-m4trace:configure.ac:676: -1- AH_OUTPUT([HAVE_DCGETTEXT], [/* Define if the GNU dcgettext() function is already present or preinstalled.
+m4trace:configure.ac:682: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DCGETTEXT])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^HAVE_DCGETTEXT$])
+m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_DCGETTEXT], [/* Define if the GNU dcgettext() function is already present or preinstalled.
    */
 @%:@undef HAVE_DCGETTEXT])
-m4trace:configure.ac:676: -1- AC_SUBST([BUILD_INCLUDED_LIBINTL])
-m4trace:configure.ac:676: -1- AC_SUBST_TRACE([BUILD_INCLUDED_LIBINTL])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^BUILD_INCLUDED_LIBINTL$])
-m4trace:configure.ac:676: -1- AC_SUBST([USE_INCLUDED_LIBINTL])
-m4trace:configure.ac:676: -1- AC_SUBST_TRACE([USE_INCLUDED_LIBINTL])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^USE_INCLUDED_LIBINTL$])
-m4trace:configure.ac:676: -1- AC_SUBST([CATOBJEXT])
-m4trace:configure.ac:676: -1- AC_SUBST_TRACE([CATOBJEXT])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^CATOBJEXT$])
-m4trace:configure.ac:676: -1- AC_SUBST([DATADIRNAME])
-m4trace:configure.ac:676: -1- AC_SUBST_TRACE([DATADIRNAME])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^DATADIRNAME$])
-m4trace:configure.ac:676: -1- AC_SUBST([INSTOBJEXT])
-m4trace:configure.ac:676: -1- AC_SUBST_TRACE([INSTOBJEXT])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^INSTOBJEXT$])
-m4trace:configure.ac:676: -1- AC_SUBST([GENCAT])
-m4trace:configure.ac:676: -1- AC_SUBST_TRACE([GENCAT])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^GENCAT$])
-m4trace:configure.ac:676: -1- AC_SUBST([INTLOBJS])
-m4trace:configure.ac:676: -1- AC_SUBST_TRACE([INTLOBJS])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^INTLOBJS$])
-m4trace:configure.ac:676: -1- AC_SUBST([INTL_LIBTOOL_SUFFIX_PREFIX])
-m4trace:configure.ac:676: -1- AC_SUBST_TRACE([INTL_LIBTOOL_SUFFIX_PREFIX])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^INTL_LIBTOOL_SUFFIX_PREFIX$])
-m4trace:configure.ac:676: -1- AC_SUBST([INTLLIBS])
-m4trace:configure.ac:676: -1- AC_SUBST_TRACE([INTLLIBS])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^INTLLIBS$])
-m4trace:configure.ac:676: -1- AC_SUBST([LIBINTL])
-m4trace:configure.ac:676: -1- AC_SUBST_TRACE([LIBINTL])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^LIBINTL$])
-m4trace:configure.ac:676: -1- AC_SUBST([LTLIBINTL])
-m4trace:configure.ac:676: -1- AC_SUBST_TRACE([LTLIBINTL])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^LTLIBINTL$])
-m4trace:configure.ac:676: -1- AC_SUBST([POSUB])
-m4trace:configure.ac:676: -1- AC_SUBST_TRACE([POSUB])
-m4trace:configure.ac:676: -1- m4_pattern_allow([^POSUB$])
-m4trace:configure.ac:679: -1- AH_OUTPUT([HAVE_DIRENT_H], [/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR\'.
+m4trace:configure.ac:682: -1- AC_SUBST([BUILD_INCLUDED_LIBINTL])
+m4trace:configure.ac:682: -1- AC_SUBST_TRACE([BUILD_INCLUDED_LIBINTL])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^BUILD_INCLUDED_LIBINTL$])
+m4trace:configure.ac:682: -1- AC_SUBST([USE_INCLUDED_LIBINTL])
+m4trace:configure.ac:682: -1- AC_SUBST_TRACE([USE_INCLUDED_LIBINTL])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^USE_INCLUDED_LIBINTL$])
+m4trace:configure.ac:682: -1- AC_SUBST([CATOBJEXT])
+m4trace:configure.ac:682: -1- AC_SUBST_TRACE([CATOBJEXT])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^CATOBJEXT$])
+m4trace:configure.ac:682: -1- AC_SUBST([DATADIRNAME])
+m4trace:configure.ac:682: -1- AC_SUBST_TRACE([DATADIRNAME])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^DATADIRNAME$])
+m4trace:configure.ac:682: -1- AC_SUBST([INSTOBJEXT])
+m4trace:configure.ac:682: -1- AC_SUBST_TRACE([INSTOBJEXT])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^INSTOBJEXT$])
+m4trace:configure.ac:682: -1- AC_SUBST([GENCAT])
+m4trace:configure.ac:682: -1- AC_SUBST_TRACE([GENCAT])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^GENCAT$])
+m4trace:configure.ac:682: -1- AC_SUBST([INTLOBJS])
+m4trace:configure.ac:682: -1- AC_SUBST_TRACE([INTLOBJS])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^INTLOBJS$])
+m4trace:configure.ac:682: -1- AC_SUBST([INTL_LIBTOOL_SUFFIX_PREFIX])
+m4trace:configure.ac:682: -1- AC_SUBST_TRACE([INTL_LIBTOOL_SUFFIX_PREFIX])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^INTL_LIBTOOL_SUFFIX_PREFIX$])
+m4trace:configure.ac:682: -1- AC_SUBST([INTLLIBS])
+m4trace:configure.ac:682: -1- AC_SUBST_TRACE([INTLLIBS])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^INTLLIBS$])
+m4trace:configure.ac:682: -1- AC_SUBST([LIBINTL])
+m4trace:configure.ac:682: -1- AC_SUBST_TRACE([LIBINTL])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^LIBINTL$])
+m4trace:configure.ac:682: -1- AC_SUBST([LTLIBINTL])
+m4trace:configure.ac:682: -1- AC_SUBST_TRACE([LTLIBINTL])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^LTLIBINTL$])
+m4trace:configure.ac:682: -1- AC_SUBST([POSUB])
+m4trace:configure.ac:682: -1- AC_SUBST_TRACE([POSUB])
+m4trace:configure.ac:682: -1- m4_pattern_allow([^POSUB$])
+m4trace:configure.ac:685: -1- AH_OUTPUT([HAVE_DIRENT_H], [/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR\'.
    */
 @%:@undef HAVE_DIRENT_H])
-m4trace:configure.ac:679: -1- AH_OUTPUT([HAVE_SYS_NDIR_H], [/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR\'.
+m4trace:configure.ac:685: -1- AH_OUTPUT([HAVE_SYS_NDIR_H], [/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR\'.
    */
 @%:@undef HAVE_SYS_NDIR_H])
-m4trace:configure.ac:679: -1- AH_OUTPUT([HAVE_SYS_DIR_H], [/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR\'.
+m4trace:configure.ac:685: -1- AH_OUTPUT([HAVE_SYS_DIR_H], [/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR\'.
    */
 @%:@undef HAVE_SYS_DIR_H])
-m4trace:configure.ac:679: -1- AH_OUTPUT([HAVE_NDIR_H], [/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR\'. */
+m4trace:configure.ac:685: -1- AH_OUTPUT([HAVE_NDIR_H], [/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR\'. */
 @%:@undef HAVE_NDIR_H])
-m4trace:configure.ac:680: -1- AC_DEFINE_TRACE_LITERAL([TIME_WITH_SYS_TIME])
-m4trace:configure.ac:680: -1- m4_pattern_allow([^TIME_WITH_SYS_TIME$])
-m4trace:configure.ac:680: -1- AH_OUTPUT([TIME_WITH_SYS_TIME], [/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+m4trace:configure.ac:686: -1- AC_DEFINE_TRACE_LITERAL([TIME_WITH_SYS_TIME])
+m4trace:configure.ac:686: -1- m4_pattern_allow([^TIME_WITH_SYS_TIME$])
+m4trace:configure.ac:686: -1- AH_OUTPUT([TIME_WITH_SYS_TIME], [/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
 @%:@undef TIME_WITH_SYS_TIME])
-m4trace:configure.ac:682: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the <inttypes.h> header file. */
+m4trace:configure.ac:688: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the <inttypes.h> header file. */
 @%:@undef HAVE_INTTYPES_H])
-m4trace:configure.ac:682: -1- AC_DEFINE_TRACE_LITERAL([HAVE_INTTYPES_H])
-m4trace:configure.ac:682: -1- m4_pattern_allow([^HAVE_INTTYPES_H$])
-m4trace:configure.ac:684: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the <unistd.h> header file. */
+m4trace:configure.ac:688: -1- AC_DEFINE_TRACE_LITERAL([HAVE_INTTYPES_H])
+m4trace:configure.ac:688: -1- m4_pattern_allow([^HAVE_INTTYPES_H$])
+m4trace:configure.ac:690: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the <unistd.h> header file. */
 @%:@undef HAVE_UNISTD_H])
-m4trace:configure.ac:684: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the <stdlib.h> header file. */
+m4trace:configure.ac:690: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the <stdlib.h> header file. */
 @%:@undef HAVE_STDLIB_H])
-m4trace:configure.ac:684: -1- AH_OUTPUT([HAVE_STDARG_H], [/* Define to 1 if you have the <stdarg.h> header file. */
+m4trace:configure.ac:690: -1- AH_OUTPUT([HAVE_STDARG_H], [/* Define to 1 if you have the <stdarg.h> header file. */
 @%:@undef HAVE_STDARG_H])
-m4trace:configure.ac:684: -1- AH_OUTPUT([HAVE_VARARGS_H], [/* Define to 1 if you have the <varargs.h> header file. */
+m4trace:configure.ac:690: -1- AH_OUTPUT([HAVE_VARARGS_H], [/* Define to 1 if you have the <varargs.h> header file. */
 @%:@undef HAVE_VARARGS_H])
-m4trace:configure.ac:684: -1- AH_OUTPUT([HAVE_LIMITS_H], [/* Define to 1 if you have the <limits.h> header file. */
+m4trace:configure.ac:690: -1- AH_OUTPUT([HAVE_LIMITS_H], [/* Define to 1 if you have the <limits.h> header file. */
 @%:@undef HAVE_LIMITS_H])
-m4trace:configure.ac:684: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the <string.h> header file. */
+m4trace:configure.ac:690: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the <string.h> header file. */
 @%:@undef HAVE_STRING_H])
-m4trace:configure.ac:684: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the <memory.h> header file. */
+m4trace:configure.ac:690: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the <memory.h> header file. */
 @%:@undef HAVE_MEMORY_H])
-m4trace:configure.ac:684: -1- AH_OUTPUT([HAVE_LOCALE_H], [/* Define to 1 if you have the <locale.h> header file. */
+m4trace:configure.ac:690: -1- AH_OUTPUT([HAVE_LOCALE_H], [/* Define to 1 if you have the <locale.h> header file. */
 @%:@undef HAVE_LOCALE_H])
-m4trace:configure.ac:684: -1- AH_OUTPUT([HAVE_TERMCAP_H], [/* Define to 1 if you have the <termcap.h> header file. */
+m4trace:configure.ac:690: -1- AH_OUTPUT([HAVE_TERMCAP_H], [/* Define to 1 if you have the <termcap.h> header file. */
 @%:@undef HAVE_TERMCAP_H])
-m4trace:configure.ac:684: -1- AH_OUTPUT([HAVE_TERMIO_H], [/* Define to 1 if you have the <termio.h> header file. */
+m4trace:configure.ac:690: -1- AH_OUTPUT([HAVE_TERMIO_H], [/* Define to 1 if you have the <termio.h> header file. */
 @%:@undef HAVE_TERMIO_H])
-m4trace:configure.ac:684: -1- AH_OUTPUT([HAVE_TERMIOS_H], [/* Define to 1 if you have the <termios.h> header file. */
+m4trace:configure.ac:690: -1- AH_OUTPUT([HAVE_TERMIOS_H], [/* Define to 1 if you have the <termios.h> header file. */
 @%:@undef HAVE_TERMIOS_H])
-m4trace:configure.ac:684: -1- AH_OUTPUT([HAVE_DLFCN_H], [/* Define to 1 if you have the <dlfcn.h> header file. */
+m4trace:configure.ac:690: -1- AH_OUTPUT([HAVE_DLFCN_H], [/* Define to 1 if you have the <dlfcn.h> header file. */
 @%:@undef HAVE_DLFCN_H])
-m4trace:configure.ac:684: -1- AH_OUTPUT([HAVE_STDBOOL_H], [/* Define to 1 if you have the <stdbool.h> header file. */
+m4trace:configure.ac:690: -1- AH_OUTPUT([HAVE_STDBOOL_H], [/* Define to 1 if you have the <stdbool.h> header file. */
 @%:@undef HAVE_STDBOOL_H])
-m4trace:configure.ac:684: -1- AH_OUTPUT([HAVE_STDDEF_H], [/* Define to 1 if you have the <stddef.h> header file. */
+m4trace:configure.ac:690: -1- AH_OUTPUT([HAVE_STDDEF_H], [/* Define to 1 if you have the <stddef.h> header file. */
 @%:@undef HAVE_STDDEF_H])
-m4trace:configure.ac:684: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the <stdint.h> header file. */
+m4trace:configure.ac:690: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the <stdint.h> header file. */
 @%:@undef HAVE_STDINT_H])
-m4trace:configure.ac:684: -1- AH_OUTPUT([HAVE_NETDB_H], [/* Define to 1 if you have the <netdb.h> header file. */
+m4trace:configure.ac:690: -1- AH_OUTPUT([HAVE_NETDB_H], [/* Define to 1 if you have the <netdb.h> header file. */
 @%:@undef HAVE_NETDB_H])
-m4trace:configure.ac:684: -1- AH_OUTPUT([HAVE_PWD_H], [/* Define to 1 if you have the <pwd.h> header file. */
+m4trace:configure.ac:690: -1- AH_OUTPUT([HAVE_PWD_H], [/* Define to 1 if you have the <pwd.h> header file. */
 @%:@undef HAVE_PWD_H])
-m4trace:configure.ac:684: -1- AH_OUTPUT([HAVE_GRP_H], [/* Define to 1 if you have the <grp.h> header file. */
+m4trace:configure.ac:690: -1- AH_OUTPUT([HAVE_GRP_H], [/* Define to 1 if you have the <grp.h> header file. */
 @%:@undef HAVE_GRP_H])
-m4trace:configure.ac:684: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the <strings.h> header file. */
+m4trace:configure.ac:690: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the <strings.h> header file. */
 @%:@undef HAVE_STRINGS_H])
-m4trace:configure.ac:684: -1- AH_OUTPUT([HAVE_REGEX_H], [/* Define to 1 if you have the <regex.h> header file. */
+m4trace:configure.ac:690: -1- AH_OUTPUT([HAVE_REGEX_H], [/* Define to 1 if you have the <regex.h> header file. */
 @%:@undef HAVE_REGEX_H])
-m4trace:configure.ac:684: -1- AH_OUTPUT([HAVE_SYSLOG_H], [/* Define to 1 if you have the <syslog.h> header file. */
+m4trace:configure.ac:690: -1- AH_OUTPUT([HAVE_SYSLOG_H], [/* Define to 1 if you have the <syslog.h> header file. */
 @%:@undef HAVE_SYSLOG_H])
-m4trace:configure.ac:684: -1- AH_OUTPUT([HAVE_ULIMIT_H], [/* Define to 1 if you have the <ulimit.h> header file. */
+m4trace:configure.ac:690: -1- AH_OUTPUT([HAVE_ULIMIT_H], [/* Define to 1 if you have the <ulimit.h> header file. */
 @%:@undef HAVE_ULIMIT_H])
-m4trace:configure.ac:688: -1- AH_OUTPUT([HAVE_SYS_PTE_H], [/* Define to 1 if you have the <sys/pte.h> header file. */
+m4trace:configure.ac:694: -1- AH_OUTPUT([HAVE_SYS_PTE_H], [/* Define to 1 if you have the <sys/pte.h> header file. */
 @%:@undef HAVE_SYS_PTE_H])
-m4trace:configure.ac:688: -1- AH_OUTPUT([HAVE_SYS_STREAM_H], [/* Define to 1 if you have the <sys/stream.h> header file. */
+m4trace:configure.ac:694: -1- AH_OUTPUT([HAVE_SYS_STREAM_H], [/* Define to 1 if you have the <sys/stream.h> header file. */
 @%:@undef HAVE_SYS_STREAM_H])
-m4trace:configure.ac:688: -1- AH_OUTPUT([HAVE_SYS_SELECT_H], [/* Define to 1 if you have the <sys/select.h> header file. */
+m4trace:configure.ac:694: -1- AH_OUTPUT([HAVE_SYS_SELECT_H], [/* Define to 1 if you have the <sys/select.h> header file. */
 @%:@undef HAVE_SYS_SELECT_H])
-m4trace:configure.ac:688: -1- AH_OUTPUT([HAVE_SYS_FILE_H], [/* Define to 1 if you have the <sys/file.h> header file. */
+m4trace:configure.ac:694: -1- AH_OUTPUT([HAVE_SYS_FILE_H], [/* Define to 1 if you have the <sys/file.h> header file. */
 @%:@undef HAVE_SYS_FILE_H])
-m4trace:configure.ac:688: -1- AH_OUTPUT([HAVE_SYS_RESOURCE_H], [/* Define to 1 if you have the <sys/resource.h> header file. */
+m4trace:configure.ac:694: -1- AH_OUTPUT([HAVE_SYS_RESOURCE_H], [/* Define to 1 if you have the <sys/resource.h> header file. */
 @%:@undef HAVE_SYS_RESOURCE_H])
-m4trace:configure.ac:688: -1- AH_OUTPUT([HAVE_SYS_PARAM_H], [/* Define to 1 if you have the <sys/param.h> header file. */
+m4trace:configure.ac:694: -1- AH_OUTPUT([HAVE_SYS_PARAM_H], [/* Define to 1 if you have the <sys/param.h> header file. */
 @%:@undef HAVE_SYS_PARAM_H])
-m4trace:configure.ac:688: -1- AH_OUTPUT([HAVE_SYS_SOCKET_H], [/* Define to 1 if you have the <sys/socket.h> header file. */
+m4trace:configure.ac:694: -1- AH_OUTPUT([HAVE_SYS_SOCKET_H], [/* Define to 1 if you have the <sys/socket.h> header file. */
 @%:@undef HAVE_SYS_SOCKET_H])
-m4trace:configure.ac:688: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the <sys/stat.h> header file. */
+m4trace:configure.ac:694: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the <sys/stat.h> header file. */
 @%:@undef HAVE_SYS_STAT_H])
-m4trace:configure.ac:688: -1- AH_OUTPUT([HAVE_SYS_TIME_H], [/* Define to 1 if you have the <sys/time.h> header file. */
+m4trace:configure.ac:694: -1- AH_OUTPUT([HAVE_SYS_TIME_H], [/* Define to 1 if you have the <sys/time.h> header file. */
 @%:@undef HAVE_SYS_TIME_H])
-m4trace:configure.ac:688: -1- AH_OUTPUT([HAVE_SYS_TIMES_H], [/* Define to 1 if you have the <sys/times.h> header file. */
+m4trace:configure.ac:694: -1- AH_OUTPUT([HAVE_SYS_TIMES_H], [/* Define to 1 if you have the <sys/times.h> header file. */
 @%:@undef HAVE_SYS_TIMES_H])
-m4trace:configure.ac:688: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the <sys/types.h> header file. */
+m4trace:configure.ac:694: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the <sys/types.h> header file. */
 @%:@undef HAVE_SYS_TYPES_H])
-m4trace:configure.ac:688: -1- AH_OUTPUT([HAVE_SYS_WAIT_H], [/* Define to 1 if you have the <sys/wait.h> header file. */
+m4trace:configure.ac:694: -1- AH_OUTPUT([HAVE_SYS_WAIT_H], [/* Define to 1 if you have the <sys/wait.h> header file. */
 @%:@undef HAVE_SYS_WAIT_H])
-m4trace:configure.ac:691: -1- AH_OUTPUT([HAVE_NETINET_IN_H], [/* Define to 1 if you have the <netinet/in.h> header file. */
+m4trace:configure.ac:697: -1- AH_OUTPUT([HAVE_NETINET_IN_H], [/* Define to 1 if you have the <netinet/in.h> header file. */
 @%:@undef HAVE_NETINET_IN_H])
-m4trace:configure.ac:691: -1- AH_OUTPUT([HAVE_ARPA_INET_H], [/* Define to 1 if you have the <arpa/inet.h> header file. */
+m4trace:configure.ac:697: -1- AH_OUTPUT([HAVE_ARPA_INET_H], [/* Define to 1 if you have the <arpa/inet.h> header file. */
 @%:@undef HAVE_ARPA_INET_H])
-m4trace:configure.ac:702: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ALLOCA_H])
-m4trace:configure.ac:702: -1- m4_pattern_allow([^HAVE_ALLOCA_H$])
-m4trace:configure.ac:702: -1- AH_OUTPUT([HAVE_ALLOCA_H], [/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
+m4trace:configure.ac:708: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ALLOCA_H])
+m4trace:configure.ac:708: -1- m4_pattern_allow([^HAVE_ALLOCA_H$])
+m4trace:configure.ac:708: -1- AH_OUTPUT([HAVE_ALLOCA_H], [/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
    */
 @%:@undef HAVE_ALLOCA_H])
-m4trace:configure.ac:702: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ALLOCA])
-m4trace:configure.ac:702: -1- m4_pattern_allow([^HAVE_ALLOCA$])
-m4trace:configure.ac:702: -1- AH_OUTPUT([HAVE_ALLOCA], [/* Define to 1 if you have `alloca\', as a function or macro. */
+m4trace:configure.ac:708: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ALLOCA])
+m4trace:configure.ac:708: -1- m4_pattern_allow([^HAVE_ALLOCA$])
+m4trace:configure.ac:708: -1- AH_OUTPUT([HAVE_ALLOCA], [/* Define to 1 if you have `alloca\', as a function or macro. */
 @%:@undef HAVE_ALLOCA])
-m4trace:configure.ac:702: -1- AC_LIBSOURCE([alloca.c])
-m4trace:configure.ac:702: -1- AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.$ac_objext])
-m4trace:configure.ac:702: -1- AC_SUBST_TRACE([ALLOCA])
-m4trace:configure.ac:702: -1- m4_pattern_allow([^ALLOCA$])
-m4trace:configure.ac:702: -1- AC_DEFINE_TRACE_LITERAL([C_ALLOCA])
-m4trace:configure.ac:702: -1- m4_pattern_allow([^C_ALLOCA$])
-m4trace:configure.ac:702: -1- AH_OUTPUT([C_ALLOCA], [/* Define to 1 if using `alloca.c\'. */
+m4trace:configure.ac:708: -1- AC_LIBSOURCE([alloca.c])
+m4trace:configure.ac:708: -1- AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.$ac_objext])
+m4trace:configure.ac:708: -1- AC_SUBST_TRACE([ALLOCA])
+m4trace:configure.ac:708: -1- m4_pattern_allow([^ALLOCA$])
+m4trace:configure.ac:708: -1- AC_DEFINE_TRACE_LITERAL([C_ALLOCA])
+m4trace:configure.ac:708: -1- m4_pattern_allow([^C_ALLOCA$])
+m4trace:configure.ac:708: -1- AH_OUTPUT([C_ALLOCA], [/* Define to 1 if using `alloca.c\'. */
 @%:@undef C_ALLOCA])
-m4trace:configure.ac:702: -1- AC_DEFINE_TRACE_LITERAL([CRAY_STACKSEG_END])
-m4trace:configure.ac:702: -1- m4_pattern_allow([^CRAY_STACKSEG_END$])
-m4trace:configure.ac:702: -1- AH_OUTPUT([CRAY_STACKSEG_END], [/* Define to one of `_getb67\', `GETB67\', `getb67\' for Cray-2 and Cray-YMP
+m4trace:configure.ac:708: -1- AC_DEFINE_TRACE_LITERAL([CRAY_STACKSEG_END])
+m4trace:configure.ac:708: -1- m4_pattern_allow([^CRAY_STACKSEG_END$])
+m4trace:configure.ac:708: -1- AH_OUTPUT([CRAY_STACKSEG_END], [/* Define to one of `_getb67\', `GETB67\', `getb67\' for Cray-2 and Cray-YMP
    systems. This function is required for `alloca.c\' support on those systems.
    */
 @%:@undef CRAY_STACKSEG_END])
-m4trace:configure.ac:702: -1- AH_OUTPUT([STACK_DIRECTION], [/* If using the C implementation of alloca, define if you know the
+m4trace:configure.ac:708: -1- AH_OUTPUT([STACK_DIRECTION], [/* If using the C implementation of alloca, define if you know the
    direction of stack growth for your system; otherwise it will be
    automatically deduced at runtime.
        STACK_DIRECTION > 0 => grows toward higher addresses
        STACK_DIRECTION < 0 => grows toward lower addresses
        STACK_DIRECTION = 0 => direction of growth unknown */
 @%:@undef STACK_DIRECTION])
-m4trace:configure.ac:702: -1- AC_DEFINE_TRACE_LITERAL([STACK_DIRECTION])
-m4trace:configure.ac:702: -1- m4_pattern_allow([^STACK_DIRECTION$])
-m4trace:configure.ac:703: -1- AC_DEFINE_TRACE_LITERAL([GETPGRP_VOID])
-m4trace:configure.ac:703: -1- m4_pattern_allow([^GETPGRP_VOID$])
-m4trace:configure.ac:703: -1- AH_OUTPUT([GETPGRP_VOID], [/* Define to 1 if the `getpgrp\' function requires zero arguments. */
+m4trace:configure.ac:708: -1- AC_DEFINE_TRACE_LITERAL([STACK_DIRECTION])
+m4trace:configure.ac:708: -1- m4_pattern_allow([^STACK_DIRECTION$])
+m4trace:configure.ac:709: -1- AC_DEFINE_TRACE_LITERAL([GETPGRP_VOID])
+m4trace:configure.ac:709: -1- m4_pattern_allow([^GETPGRP_VOID$])
+m4trace:configure.ac:709: -1- AH_OUTPUT([GETPGRP_VOID], [/* Define to 1 if the `getpgrp\' function requires zero arguments. */
 @%:@undef GETPGRP_VOID])
-m4trace:configure.ac:704: -1- _m4_warn([obsolete], [The macro `AC_FUNC_SETVBUF_REVERSED' is obsolete.  Remove it and all references to SETVBUF_REVERSED.], [../../lib/autoconf/functions.m4:1714: AC_FUNC_SETVBUF_REVERSED is expanded from...
-configure.ac:704: the top level])
-m4trace:configure.ac:705: -1- AH_OUTPUT([HAVE_VPRINTF], [/* Define to 1 if you have the `vprintf\' function. */
+m4trace:configure.ac:710: -1- _m4_warn([obsolete], [The macro `AC_FUNC_SETVBUF_REVERSED' is obsolete.  Remove it and all references to SETVBUF_REVERSED.], [../../lib/autoconf/functions.m4:1714: AC_FUNC_SETVBUF_REVERSED is expanded from...
+configure.ac:710: the top level])
+m4trace:configure.ac:711: -1- AH_OUTPUT([HAVE_VPRINTF], [/* Define to 1 if you have the `vprintf\' function. */
 @%:@undef HAVE_VPRINTF])
-m4trace:configure.ac:705: -1- AC_DEFINE_TRACE_LITERAL([HAVE_VPRINTF])
-m4trace:configure.ac:705: -1- m4_pattern_allow([^HAVE_VPRINTF$])
-m4trace:configure.ac:705: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DOPRNT])
-m4trace:configure.ac:705: -1- m4_pattern_allow([^HAVE_DOPRNT$])
-m4trace:configure.ac:705: -1- AH_OUTPUT([HAVE_DOPRNT], [/* Define to 1 if you don\'t have `vprintf\' but do have `_doprnt.\' */
+m4trace:configure.ac:711: -1- AC_DEFINE_TRACE_LITERAL([HAVE_VPRINTF])
+m4trace:configure.ac:711: -1- m4_pattern_allow([^HAVE_VPRINTF$])
+m4trace:configure.ac:711: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DOPRNT])
+m4trace:configure.ac:711: -1- m4_pattern_allow([^HAVE_DOPRNT$])
+m4trace:configure.ac:711: -1- AH_OUTPUT([HAVE_DOPRNT], [/* Define to 1 if you don\'t have `vprintf\' but do have `_doprnt.\' */
 @%:@undef HAVE_DOPRNT])
-m4trace:configure.ac:706: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRCOLL])
-m4trace:configure.ac:706: -1- m4_pattern_allow([^HAVE_STRCOLL$])
-m4trace:configure.ac:706: -1- AH_OUTPUT([HAVE_STRCOLL], [/* Define to 1 if you have the `strcoll\' function and it is properly defined.
+m4trace:configure.ac:712: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRCOLL])
+m4trace:configure.ac:712: -1- m4_pattern_allow([^HAVE_STRCOLL$])
+m4trace:configure.ac:712: -1- AH_OUTPUT([HAVE_STRCOLL], [/* Define to 1 if you have the `strcoll\' function and it is properly defined.
    */
 @%:@undef HAVE_STRCOLL])
-m4trace:configure.ac:727: -1- AC_DEFINE_TRACE_LITERAL([HAVE_VPRINTF])
-m4trace:configure.ac:727: -1- m4_pattern_allow([^HAVE_VPRINTF$])
-m4trace:configure.ac:732: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS vprint.$ac_objext"])
-m4trace:configure.ac:732: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
-m4trace:configure.ac:732: -1- m4_pattern_allow([^LIB@&t@OBJS$])
-m4trace:configure.ac:732: -1- AC_LIBSOURCE([vprint.c])
-m4trace:configure.ac:736: -1- _m4_warn([obsolete], [The macro `AC_TYPE_SIGNAL' is obsolete.
+m4trace:configure.ac:733: -1- AC_DEFINE_TRACE_LITERAL([HAVE_VPRINTF])
+m4trace:configure.ac:733: -1- m4_pattern_allow([^HAVE_VPRINTF$])
+m4trace:configure.ac:738: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS vprint.$ac_objext"])
+m4trace:configure.ac:738: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:738: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:738: -1- AC_LIBSOURCE([vprint.c])
+m4trace:configure.ac:742: -1- _m4_warn([obsolete], [The macro `AC_TYPE_SIGNAL' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/types.m4:738: AC_TYPE_SIGNAL is expanded from...
-configure.ac:736: the top level])
-m4trace:configure.ac:736: -1- AC_DEFINE_TRACE_LITERAL([RETSIGTYPE])
-m4trace:configure.ac:736: -1- m4_pattern_allow([^RETSIGTYPE$])
-m4trace:configure.ac:736: -1- AH_OUTPUT([RETSIGTYPE], [/* Define as the return type of signal handlers (`int\' or `void\'). */
+configure.ac:742: the top level])
+m4trace:configure.ac:742: -1- AC_DEFINE_TRACE_LITERAL([RETSIGTYPE])
+m4trace:configure.ac:742: -1- m4_pattern_allow([^RETSIGTYPE$])
+m4trace:configure.ac:742: -1- AH_OUTPUT([RETSIGTYPE], [/* Define as the return type of signal handlers (`int\' or `void\'). */
 @%:@undef RETSIGTYPE])
-m4trace:configure.ac:739: -2- AC_DEFINE_TRACE_LITERAL([HAVE_SETOSTYPE])
-m4trace:configure.ac:739: -2- m4_pattern_allow([^HAVE_SETOSTYPE$])
-m4trace:configure.ac:740: -2- AC_DEFINE_TRACE_LITERAL([HAVE_WAIT3])
-m4trace:configure.ac:740: -2- m4_pattern_allow([^HAVE_WAIT3$])
-m4trace:configure.ac:743: -2- AC_DEFINE_TRACE_LITERAL([HAVE_MKFIFO])
-m4trace:configure.ac:743: -2- m4_pattern_allow([^HAVE_MKFIFO$])
-m4trace:configure.ac:743: -2- AC_DEFINE_TRACE_LITERAL([MKFIFO_MISSING])
-m4trace:configure.ac:743: -2- m4_pattern_allow([^MKFIFO_MISSING$])
-m4trace:configure.ac:746: -1- AH_OUTPUT([HAVE_DUP2], [/* Define to 1 if you have the `dup2\' function. */
+m4trace:configure.ac:745: -2- AC_DEFINE_TRACE_LITERAL([HAVE_SETOSTYPE])
+m4trace:configure.ac:745: -2- m4_pattern_allow([^HAVE_SETOSTYPE$])
+m4trace:configure.ac:746: -2- AC_DEFINE_TRACE_LITERAL([HAVE_WAIT3])
+m4trace:configure.ac:746: -2- m4_pattern_allow([^HAVE_WAIT3$])
+m4trace:configure.ac:749: -2- AC_DEFINE_TRACE_LITERAL([HAVE_MKFIFO])
+m4trace:configure.ac:749: -2- m4_pattern_allow([^HAVE_MKFIFO$])
+m4trace:configure.ac:749: -2- AC_DEFINE_TRACE_LITERAL([MKFIFO_MISSING])
+m4trace:configure.ac:749: -2- m4_pattern_allow([^MKFIFO_MISSING$])
+m4trace:configure.ac:752: -1- AH_OUTPUT([HAVE_DUP2], [/* Define to 1 if you have the `dup2\' function. */
 @%:@undef HAVE_DUP2])
-m4trace:configure.ac:746: -1- AH_OUTPUT([HAVE_EACCESS], [/* Define to 1 if you have the `eaccess\' function. */
+m4trace:configure.ac:752: -1- AH_OUTPUT([HAVE_EACCESS], [/* Define to 1 if you have the `eaccess\' function. */
 @%:@undef HAVE_EACCESS])
-m4trace:configure.ac:746: -1- AH_OUTPUT([HAVE_FCNTL], [/* Define to 1 if you have the `fcntl\' function. */
+m4trace:configure.ac:752: -1- AH_OUTPUT([HAVE_FCNTL], [/* Define to 1 if you have the `fcntl\' function. */
 @%:@undef HAVE_FCNTL])
-m4trace:configure.ac:746: -1- AH_OUTPUT([HAVE_GETDTABLESIZE], [/* Define to 1 if you have the `getdtablesize\' function. */
+m4trace:configure.ac:752: -1- AH_OUTPUT([HAVE_GETDTABLESIZE], [/* Define to 1 if you have the `getdtablesize\' function. */
 @%:@undef HAVE_GETDTABLESIZE])
-m4trace:configure.ac:746: -1- AH_OUTPUT([HAVE_GETGROUPS], [/* Define to 1 if you have the `getgroups\' function. */
+m4trace:configure.ac:752: -1- AH_OUTPUT([HAVE_GETGROUPS], [/* Define to 1 if you have the `getgroups\' function. */
 @%:@undef HAVE_GETGROUPS])
-m4trace:configure.ac:746: -1- AH_OUTPUT([HAVE_GETHOSTNAME], [/* Define to 1 if you have the `gethostname\' function. */
+m4trace:configure.ac:752: -1- AH_OUTPUT([HAVE_GETHOSTNAME], [/* Define to 1 if you have the `gethostname\' function. */
 @%:@undef HAVE_GETHOSTNAME])
-m4trace:configure.ac:746: -1- AH_OUTPUT([HAVE_GETPAGESIZE], [/* Define to 1 if you have the `getpagesize\' function. */
+m4trace:configure.ac:752: -1- AH_OUTPUT([HAVE_GETPAGESIZE], [/* Define to 1 if you have the `getpagesize\' function. */
 @%:@undef HAVE_GETPAGESIZE])
-m4trace:configure.ac:746: -1- AH_OUTPUT([HAVE_GETPEERNAME], [/* Define to 1 if you have the `getpeername\' function. */
+m4trace:configure.ac:752: -1- AH_OUTPUT([HAVE_GETPEERNAME], [/* Define to 1 if you have the `getpeername\' function. */
 @%:@undef HAVE_GETPEERNAME])
-m4trace:configure.ac:746: -1- AH_OUTPUT([HAVE_GETRLIMIT], [/* Define to 1 if you have the `getrlimit\' function. */
+m4trace:configure.ac:752: -1- AH_OUTPUT([HAVE_GETRLIMIT], [/* Define to 1 if you have the `getrlimit\' function. */
 @%:@undef HAVE_GETRLIMIT])
-m4trace:configure.ac:746: -1- AH_OUTPUT([HAVE_GETRUSAGE], [/* Define to 1 if you have the `getrusage\' function. */
+m4trace:configure.ac:752: -1- AH_OUTPUT([HAVE_GETRUSAGE], [/* Define to 1 if you have the `getrusage\' function. */
 @%:@undef HAVE_GETRUSAGE])
-m4trace:configure.ac:746: -1- AH_OUTPUT([HAVE_GETTIMEOFDAY], [/* Define to 1 if you have the `gettimeofday\' function. */
+m4trace:configure.ac:752: -1- AH_OUTPUT([HAVE_GETTIMEOFDAY], [/* Define to 1 if you have the `gettimeofday\' function. */
 @%:@undef HAVE_GETTIMEOFDAY])
-m4trace:configure.ac:746: -1- AH_OUTPUT([HAVE_KILL], [/* Define to 1 if you have the `kill\' function. */
+m4trace:configure.ac:752: -1- AH_OUTPUT([HAVE_KILL], [/* Define to 1 if you have the `kill\' function. */
 @%:@undef HAVE_KILL])
-m4trace:configure.ac:746: -1- AH_OUTPUT([HAVE_KILLPG], [/* Define to 1 if you have the `killpg\' function. */
+m4trace:configure.ac:752: -1- AH_OUTPUT([HAVE_KILLPG], [/* Define to 1 if you have the `killpg\' function. */
 @%:@undef HAVE_KILLPG])
-m4trace:configure.ac:746: -1- AH_OUTPUT([HAVE_LSTAT], [/* Define to 1 if you have the `lstat\' function. */
+m4trace:configure.ac:752: -1- AH_OUTPUT([HAVE_LSTAT], [/* Define to 1 if you have the `lstat\' function. */
 @%:@undef HAVE_LSTAT])
-m4trace:configure.ac:746: -1- AH_OUTPUT([HAVE_READLINK], [/* Define to 1 if you have the `readlink\' function. */
+m4trace:configure.ac:752: -1- AH_OUTPUT([HAVE_READLINK], [/* Define to 1 if you have the `readlink\' function. */
 @%:@undef HAVE_READLINK])
-m4trace:configure.ac:746: -1- AH_OUTPUT([HAVE_SBRK], [/* Define to 1 if you have the `sbrk\' function. */
+m4trace:configure.ac:752: -1- AH_OUTPUT([HAVE_SBRK], [/* Define to 1 if you have the `sbrk\' function. */
 @%:@undef HAVE_SBRK])
-m4trace:configure.ac:746: -1- AH_OUTPUT([HAVE_SELECT], [/* Define to 1 if you have the `select\' function. */
+m4trace:configure.ac:752: -1- AH_OUTPUT([HAVE_SELECT], [/* Define to 1 if you have the `select\' function. */
 @%:@undef HAVE_SELECT])
-m4trace:configure.ac:746: -1- AH_OUTPUT([HAVE_SETDTABLESIZE], [/* Define to 1 if you have the `setdtablesize\' function. */
+m4trace:configure.ac:752: -1- AH_OUTPUT([HAVE_SETDTABLESIZE], [/* Define to 1 if you have the `setdtablesize\' function. */
 @%:@undef HAVE_SETDTABLESIZE])
-m4trace:configure.ac:746: -1- AH_OUTPUT([HAVE_SETITIMER], [/* Define to 1 if you have the `setitimer\' function. */
+m4trace:configure.ac:752: -1- AH_OUTPUT([HAVE_SETITIMER], [/* Define to 1 if you have the `setitimer\' function. */
 @%:@undef HAVE_SETITIMER])
-m4trace:configure.ac:746: -1- AH_OUTPUT([HAVE_TCGETPGRP], [/* Define to 1 if you have the `tcgetpgrp\' function. */
+m4trace:configure.ac:752: -1- AH_OUTPUT([HAVE_TCGETPGRP], [/* Define to 1 if you have the `tcgetpgrp\' function. */
 @%:@undef HAVE_TCGETPGRP])
-m4trace:configure.ac:746: -1- AH_OUTPUT([HAVE_UNAME], [/* Define to 1 if you have the `uname\' function. */
+m4trace:configure.ac:752: -1- AH_OUTPUT([HAVE_UNAME], [/* Define to 1 if you have the `uname\' function. */
 @%:@undef HAVE_UNAME])
-m4trace:configure.ac:746: -1- AH_OUTPUT([HAVE_ULIMIT], [/* Define to 1 if you have the `ulimit\' function. */
+m4trace:configure.ac:752: -1- AH_OUTPUT([HAVE_ULIMIT], [/* Define to 1 if you have the `ulimit\' function. */
 @%:@undef HAVE_ULIMIT])
-m4trace:configure.ac:746: -1- AH_OUTPUT([HAVE_WAITPID], [/* Define to 1 if you have the `waitpid\' function. */
+m4trace:configure.ac:752: -1- AH_OUTPUT([HAVE_WAITPID], [/* Define to 1 if you have the `waitpid\' function. */
 @%:@undef HAVE_WAITPID])
-m4trace:configure.ac:750: -1- AH_OUTPUT([HAVE_RENAME], [/* Define to 1 if you have the `rename\' function. */
+m4trace:configure.ac:756: -1- AH_OUTPUT([HAVE_RENAME], [/* Define to 1 if you have the `rename\' function. */
 @%:@undef HAVE_RENAME])
-m4trace:configure.ac:750: -1- AC_DEFINE_TRACE_LITERAL([HAVE_RENAME])
-m4trace:configure.ac:750: -1- m4_pattern_allow([^HAVE_RENAME$])
-m4trace:configure.ac:750: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS rename.$ac_objext"])
-m4trace:configure.ac:750: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
-m4trace:configure.ac:750: -1- m4_pattern_allow([^LIB@&t@OBJS$])
-m4trace:configure.ac:750: -1- AC_LIBSOURCE([rename.c])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_BCOPY], [/* Define to 1 if you have the `bcopy\' function. */
+m4trace:configure.ac:756: -1- AC_DEFINE_TRACE_LITERAL([HAVE_RENAME])
+m4trace:configure.ac:756: -1- m4_pattern_allow([^HAVE_RENAME$])
+m4trace:configure.ac:756: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS rename.$ac_objext"])
+m4trace:configure.ac:756: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:756: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:756: -1- AC_LIBSOURCE([rename.c])
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_BCOPY], [/* Define to 1 if you have the `bcopy\' function. */
 @%:@undef HAVE_BCOPY])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_BZERO], [/* Define to 1 if you have the `bzero\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_BZERO], [/* Define to 1 if you have the `bzero\' function. */
 @%:@undef HAVE_BZERO])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_CONFSTR], [/* Define to 1 if you have the `confstr\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_CONFSTR], [/* Define to 1 if you have the `confstr\' function. */
 @%:@undef HAVE_CONFSTR])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_FACCESSAT], [/* Define to 1 if you have the `faccessat\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_FACCESSAT], [/* Define to 1 if you have the `faccessat\' function. */
 @%:@undef HAVE_FACCESSAT])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_FNMATCH], [/* Define to 1 if you have the `fnmatch\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_FNMATCH], [/* Define to 1 if you have the `fnmatch\' function. */
 @%:@undef HAVE_FNMATCH])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_GETADDRINFO], [/* Define to 1 if you have the `getaddrinfo\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_GETADDRINFO], [/* Define to 1 if you have the `getaddrinfo\' function. */
 @%:@undef HAVE_GETADDRINFO])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_GETHOSTBYNAME], [/* Define to 1 if you have the `gethostbyname\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_GETHOSTBYNAME], [/* Define to 1 if you have the `gethostbyname\' function. */
 @%:@undef HAVE_GETHOSTBYNAME])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_GETSERVBYNAME], [/* Define to 1 if you have the `getservbyname\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_GETSERVBYNAME], [/* Define to 1 if you have the `getservbyname\' function. */
 @%:@undef HAVE_GETSERVBYNAME])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_GETSERVENT], [/* Define to 1 if you have the `getservent\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_GETSERVENT], [/* Define to 1 if you have the `getservent\' function. */
 @%:@undef HAVE_GETSERVENT])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_INET_ATON], [/* Define to 1 if you have the `inet_aton\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_INET_ATON], [/* Define to 1 if you have the `inet_aton\' function. */
 @%:@undef HAVE_INET_ATON])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_IMAXDIV], [/* Define to 1 if you have the `imaxdiv\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_IMAXDIV], [/* Define to 1 if you have the `imaxdiv\' function. */
 @%:@undef HAVE_IMAXDIV])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_MEMMOVE], [/* Define to 1 if you have the `memmove\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_MEMMOVE], [/* Define to 1 if you have the `memmove\' function. */
 @%:@undef HAVE_MEMMOVE])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_PATHCONF], [/* Define to 1 if you have the `pathconf\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_PATHCONF], [/* Define to 1 if you have the `pathconf\' function. */
 @%:@undef HAVE_PATHCONF])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_PUTENV], [/* Define to 1 if you have the `putenv\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_PUTENV], [/* Define to 1 if you have the `putenv\' function. */
 @%:@undef HAVE_PUTENV])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_RAISE], [/* Define to 1 if you have the `raise\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_RAISE], [/* Define to 1 if you have the `raise\' function. */
 @%:@undef HAVE_RAISE])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_REGCOMP], [/* Define to 1 if you have the `regcomp\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_REGCOMP], [/* Define to 1 if you have the `regcomp\' function. */
 @%:@undef HAVE_REGCOMP])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_REGEXEC], [/* Define to 1 if you have the `regexec\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_REGEXEC], [/* Define to 1 if you have the `regexec\' function. */
 @%:@undef HAVE_REGEXEC])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_SETENV], [/* Define to 1 if you have the `setenv\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_SETENV], [/* Define to 1 if you have the `setenv\' function. */
 @%:@undef HAVE_SETENV])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_SETLINEBUF], [/* Define to 1 if you have the `setlinebuf\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_SETLINEBUF], [/* Define to 1 if you have the `setlinebuf\' function. */
 @%:@undef HAVE_SETLINEBUF])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_SETLOCALE], [/* Define to 1 if you have the `setlocale\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_SETLOCALE], [/* Define to 1 if you have the `setlocale\' function. */
 @%:@undef HAVE_SETLOCALE])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_SETVBUF], [/* Define to 1 if you have the `setvbuf\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_SETVBUF], [/* Define to 1 if you have the `setvbuf\' function. */
 @%:@undef HAVE_SETVBUF])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_SIGINTERRUPT], [/* Define to 1 if you have the `siginterrupt\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_SIGINTERRUPT], [/* Define to 1 if you have the `siginterrupt\' function. */
 @%:@undef HAVE_SIGINTERRUPT])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_STRCHR], [/* Define to 1 if you have the `strchr\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_STRCHR], [/* Define to 1 if you have the `strchr\' function. */
 @%:@undef HAVE_STRCHR])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_SYSCONF], [/* Define to 1 if you have the `sysconf\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_SYSCONF], [/* Define to 1 if you have the `sysconf\' function. */
 @%:@undef HAVE_SYSCONF])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_SYSLOG], [/* Define to 1 if you have the `syslog\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_SYSLOG], [/* Define to 1 if you have the `syslog\' function. */
 @%:@undef HAVE_SYSLOG])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_TCGETATTR], [/* Define to 1 if you have the `tcgetattr\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_TCGETATTR], [/* Define to 1 if you have the `tcgetattr\' function. */
 @%:@undef HAVE_TCGETATTR])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_TIMES], [/* Define to 1 if you have the `times\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_TIMES], [/* Define to 1 if you have the `times\' function. */
 @%:@undef HAVE_TIMES])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_TTYNAME], [/* Define to 1 if you have the `ttyname\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_TTYNAME], [/* Define to 1 if you have the `ttyname\' function. */
 @%:@undef HAVE_TTYNAME])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_TZSET], [/* Define to 1 if you have the `tzset\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_TZSET], [/* Define to 1 if you have the `tzset\' function. */
 @%:@undef HAVE_TZSET])
-m4trace:configure.ac:753: -1- AH_OUTPUT([HAVE_UNSETENV], [/* Define to 1 if you have the `unsetenv\' function. */
+m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_UNSETENV], [/* Define to 1 if you have the `unsetenv\' function. */
 @%:@undef HAVE_UNSETENV])
-m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_VASPRINTF], [/* Define to 1 if you have the `vasprintf\' function. */
+m4trace:configure.ac:765: -1- AH_OUTPUT([HAVE_VASPRINTF], [/* Define to 1 if you have the `vasprintf\' function. */
 @%:@undef HAVE_VASPRINTF])
-m4trace:configure.ac:759: -1- AH_OUTPUT([HAVE_ASPRINTF], [/* Define to 1 if you have the `asprintf\' function. */
+m4trace:configure.ac:765: -1- AH_OUTPUT([HAVE_ASPRINTF], [/* Define to 1 if you have the `asprintf\' function. */
 @%:@undef HAVE_ASPRINTF])
-m4trace:configure.ac:760: -1- AH_OUTPUT([HAVE_ISASCII], [/* Define to 1 if you have the `isascii\' function. */
+m4trace:configure.ac:766: -1- AH_OUTPUT([HAVE_ISASCII], [/* Define to 1 if you have the `isascii\' function. */
 @%:@undef HAVE_ISASCII])
-m4trace:configure.ac:760: -1- AH_OUTPUT([HAVE_ISBLANK], [/* Define to 1 if you have the `isblank\' function. */
+m4trace:configure.ac:766: -1- AH_OUTPUT([HAVE_ISBLANK], [/* Define to 1 if you have the `isblank\' function. */
 @%:@undef HAVE_ISBLANK])
-m4trace:configure.ac:760: -1- AH_OUTPUT([HAVE_ISGRAPH], [/* Define to 1 if you have the `isgraph\' function. */
+m4trace:configure.ac:766: -1- AH_OUTPUT([HAVE_ISGRAPH], [/* Define to 1 if you have the `isgraph\' function. */
 @%:@undef HAVE_ISGRAPH])
-m4trace:configure.ac:760: -1- AH_OUTPUT([HAVE_ISPRINT], [/* Define to 1 if you have the `isprint\' function. */
+m4trace:configure.ac:766: -1- AH_OUTPUT([HAVE_ISPRINT], [/* Define to 1 if you have the `isprint\' function. */
 @%:@undef HAVE_ISPRINT])
-m4trace:configure.ac:760: -1- AH_OUTPUT([HAVE_ISSPACE], [/* Define to 1 if you have the `isspace\' function. */
+m4trace:configure.ac:766: -1- AH_OUTPUT([HAVE_ISSPACE], [/* Define to 1 if you have the `isspace\' function. */
 @%:@undef HAVE_ISSPACE])
-m4trace:configure.ac:760: -1- AH_OUTPUT([HAVE_ISXDIGIT], [/* Define to 1 if you have the `isxdigit\' function. */
+m4trace:configure.ac:766: -1- AH_OUTPUT([HAVE_ISXDIGIT], [/* Define to 1 if you have the `isxdigit\' function. */
 @%:@undef HAVE_ISXDIGIT])
-m4trace:configure.ac:761: -1- AH_OUTPUT([HAVE_GETPWENT], [/* Define to 1 if you have the `getpwent\' function. */
+m4trace:configure.ac:767: -1- AH_OUTPUT([HAVE_GETPWENT], [/* Define to 1 if you have the `getpwent\' function. */
 @%:@undef HAVE_GETPWENT])
-m4trace:configure.ac:761: -1- AH_OUTPUT([HAVE_GETPWNAM], [/* Define to 1 if you have the `getpwnam\' function. */
+m4trace:configure.ac:767: -1- AH_OUTPUT([HAVE_GETPWNAM], [/* Define to 1 if you have the `getpwnam\' function. */
 @%:@undef HAVE_GETPWNAM])
-m4trace:configure.ac:761: -1- AH_OUTPUT([HAVE_GETPWUID], [/* Define to 1 if you have the `getpwuid\' function. */
+m4trace:configure.ac:767: -1- AH_OUTPUT([HAVE_GETPWUID], [/* Define to 1 if you have the `getpwuid\' function. */
 @%:@undef HAVE_GETPWUID])
-m4trace:configure.ac:762: -1- AH_OUTPUT([HAVE_GETCWD], [/* Define to 1 if you have the `getcwd\' function. */
+m4trace:configure.ac:768: -1- AH_OUTPUT([HAVE_GETCWD], [/* Define to 1 if you have the `getcwd\' function. */
 @%:@undef HAVE_GETCWD])
-m4trace:configure.ac:762: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GETCWD])
-m4trace:configure.ac:762: -1- m4_pattern_allow([^HAVE_GETCWD$])
-m4trace:configure.ac:762: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS getcwd.$ac_objext"])
-m4trace:configure.ac:762: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
-m4trace:configure.ac:762: -1- m4_pattern_allow([^LIB@&t@OBJS$])
-m4trace:configure.ac:762: -1- AC_LIBSOURCE([getcwd.c])
-m4trace:configure.ac:762: -1- AH_OUTPUT([HAVE_MEMSET], [/* Define to 1 if you have the `memset\' function. */
+m4trace:configure.ac:768: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GETCWD])
+m4trace:configure.ac:768: -1- m4_pattern_allow([^HAVE_GETCWD$])
+m4trace:configure.ac:768: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS getcwd.$ac_objext"])
+m4trace:configure.ac:768: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:768: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:768: -1- AC_LIBSOURCE([getcwd.c])
+m4trace:configure.ac:768: -1- AH_OUTPUT([HAVE_MEMSET], [/* Define to 1 if you have the `memset\' function. */
 @%:@undef HAVE_MEMSET])
-m4trace:configure.ac:762: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MEMSET])
-m4trace:configure.ac:762: -1- m4_pattern_allow([^HAVE_MEMSET$])
-m4trace:configure.ac:762: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS memset.$ac_objext"])
-m4trace:configure.ac:762: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
-m4trace:configure.ac:762: -1- m4_pattern_allow([^LIB@&t@OBJS$])
-m4trace:configure.ac:762: -1- AC_LIBSOURCE([memset.c])
-m4trace:configure.ac:763: -1- AH_OUTPUT([HAVE_STRCASECMP], [/* Define to 1 if you have the `strcasecmp\' function. */
+m4trace:configure.ac:768: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MEMSET])
+m4trace:configure.ac:768: -1- m4_pattern_allow([^HAVE_MEMSET$])
+m4trace:configure.ac:768: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS memset.$ac_objext"])
+m4trace:configure.ac:768: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:768: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:768: -1- AC_LIBSOURCE([memset.c])
+m4trace:configure.ac:769: -1- AH_OUTPUT([HAVE_STRCASECMP], [/* Define to 1 if you have the `strcasecmp\' function. */
 @%:@undef HAVE_STRCASECMP])
-m4trace:configure.ac:763: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRCASECMP])
-m4trace:configure.ac:763: -1- m4_pattern_allow([^HAVE_STRCASECMP$])
-m4trace:configure.ac:763: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strcasecmp.$ac_objext"])
-m4trace:configure.ac:763: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
-m4trace:configure.ac:763: -1- m4_pattern_allow([^LIB@&t@OBJS$])
-m4trace:configure.ac:763: -1- AC_LIBSOURCE([strcasecmp.c])
-m4trace:configure.ac:763: -1- AH_OUTPUT([HAVE_STRCASESTR], [/* Define to 1 if you have the `strcasestr\' function. */
+m4trace:configure.ac:769: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRCASECMP])
+m4trace:configure.ac:769: -1- m4_pattern_allow([^HAVE_STRCASECMP$])
+m4trace:configure.ac:769: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strcasecmp.$ac_objext"])
+m4trace:configure.ac:769: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:769: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:769: -1- AC_LIBSOURCE([strcasecmp.c])
+m4trace:configure.ac:769: -1- AH_OUTPUT([HAVE_STRCASESTR], [/* Define to 1 if you have the `strcasestr\' function. */
 @%:@undef HAVE_STRCASESTR])
-m4trace:configure.ac:763: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRCASESTR])
-m4trace:configure.ac:763: -1- m4_pattern_allow([^HAVE_STRCASESTR$])
-m4trace:configure.ac:763: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strcasestr.$ac_objext"])
-m4trace:configure.ac:763: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
-m4trace:configure.ac:763: -1- m4_pattern_allow([^LIB@&t@OBJS$])
-m4trace:configure.ac:763: -1- AC_LIBSOURCE([strcasestr.c])
-m4trace:configure.ac:763: -1- AH_OUTPUT([HAVE_STRERROR], [/* Define to 1 if you have the `strerror\' function. */
+m4trace:configure.ac:769: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRCASESTR])
+m4trace:configure.ac:769: -1- m4_pattern_allow([^HAVE_STRCASESTR$])
+m4trace:configure.ac:769: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strcasestr.$ac_objext"])
+m4trace:configure.ac:769: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:769: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:769: -1- AC_LIBSOURCE([strcasestr.c])
+m4trace:configure.ac:769: -1- AH_OUTPUT([HAVE_STRERROR], [/* Define to 1 if you have the `strerror\' function. */
 @%:@undef HAVE_STRERROR])
-m4trace:configure.ac:763: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRERROR])
-m4trace:configure.ac:763: -1- m4_pattern_allow([^HAVE_STRERROR$])
-m4trace:configure.ac:763: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strerror.$ac_objext"])
-m4trace:configure.ac:763: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
-m4trace:configure.ac:763: -1- m4_pattern_allow([^LIB@&t@OBJS$])
-m4trace:configure.ac:763: -1- AC_LIBSOURCE([strerror.c])
-m4trace:configure.ac:763: -1- AH_OUTPUT([HAVE_STRFTIME], [/* Define to 1 if you have the `strftime\' function. */
+m4trace:configure.ac:769: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRERROR])
+m4trace:configure.ac:769: -1- m4_pattern_allow([^HAVE_STRERROR$])
+m4trace:configure.ac:769: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strerror.$ac_objext"])
+m4trace:configure.ac:769: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:769: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:769: -1- AC_LIBSOURCE([strerror.c])
+m4trace:configure.ac:769: -1- AH_OUTPUT([HAVE_STRFTIME], [/* Define to 1 if you have the `strftime\' function. */
 @%:@undef HAVE_STRFTIME])
-m4trace:configure.ac:763: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRFTIME])
-m4trace:configure.ac:763: -1- m4_pattern_allow([^HAVE_STRFTIME$])
-m4trace:configure.ac:763: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strftime.$ac_objext"])
-m4trace:configure.ac:763: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
-m4trace:configure.ac:763: -1- m4_pattern_allow([^LIB@&t@OBJS$])
-m4trace:configure.ac:763: -1- AC_LIBSOURCE([strftime.c])
-m4trace:configure.ac:763: -1- AH_OUTPUT([HAVE_STRNLEN], [/* Define to 1 if you have the `strnlen\' function. */
+m4trace:configure.ac:769: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRFTIME])
+m4trace:configure.ac:769: -1- m4_pattern_allow([^HAVE_STRFTIME$])
+m4trace:configure.ac:769: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strftime.$ac_objext"])
+m4trace:configure.ac:769: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:769: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:769: -1- AC_LIBSOURCE([strftime.c])
+m4trace:configure.ac:769: -1- AH_OUTPUT([HAVE_STRNLEN], [/* Define to 1 if you have the `strnlen\' function. */
 @%:@undef HAVE_STRNLEN])
-m4trace:configure.ac:763: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRNLEN])
-m4trace:configure.ac:763: -1- m4_pattern_allow([^HAVE_STRNLEN$])
-m4trace:configure.ac:763: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strnlen.$ac_objext"])
-m4trace:configure.ac:763: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
-m4trace:configure.ac:763: -1- m4_pattern_allow([^LIB@&t@OBJS$])
-m4trace:configure.ac:763: -1- AC_LIBSOURCE([strnlen.c])
-m4trace:configure.ac:763: -1- AH_OUTPUT([HAVE_STRPBRK], [/* Define to 1 if you have the `strpbrk\' function. */
+m4trace:configure.ac:769: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRNLEN])
+m4trace:configure.ac:769: -1- m4_pattern_allow([^HAVE_STRNLEN$])
+m4trace:configure.ac:769: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strnlen.$ac_objext"])
+m4trace:configure.ac:769: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:769: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:769: -1- AC_LIBSOURCE([strnlen.c])
+m4trace:configure.ac:769: -1- AH_OUTPUT([HAVE_STRPBRK], [/* Define to 1 if you have the `strpbrk\' function. */
 @%:@undef HAVE_STRPBRK])
-m4trace:configure.ac:763: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRPBRK])
-m4trace:configure.ac:763: -1- m4_pattern_allow([^HAVE_STRPBRK$])
-m4trace:configure.ac:763: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strpbrk.$ac_objext"])
-m4trace:configure.ac:763: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
-m4trace:configure.ac:763: -1- m4_pattern_allow([^LIB@&t@OBJS$])
-m4trace:configure.ac:763: -1- AC_LIBSOURCE([strpbrk.c])
-m4trace:configure.ac:763: -1- AH_OUTPUT([HAVE_STRSTR], [/* Define to 1 if you have the `strstr\' function. */
+m4trace:configure.ac:769: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRPBRK])
+m4trace:configure.ac:769: -1- m4_pattern_allow([^HAVE_STRPBRK$])
+m4trace:configure.ac:769: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strpbrk.$ac_objext"])
+m4trace:configure.ac:769: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:769: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:769: -1- AC_LIBSOURCE([strpbrk.c])
+m4trace:configure.ac:769: -1- AH_OUTPUT([HAVE_STRSTR], [/* Define to 1 if you have the `strstr\' function. */
 @%:@undef HAVE_STRSTR])
-m4trace:configure.ac:763: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRSTR])
-m4trace:configure.ac:763: -1- m4_pattern_allow([^HAVE_STRSTR$])
-m4trace:configure.ac:763: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strstr.$ac_objext"])
-m4trace:configure.ac:763: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
-m4trace:configure.ac:763: -1- m4_pattern_allow([^LIB@&t@OBJS$])
-m4trace:configure.ac:763: -1- AC_LIBSOURCE([strstr.c])
-m4trace:configure.ac:764: -1- AH_OUTPUT([HAVE_STRTOD], [/* Define to 1 if you have the `strtod\' function. */
+m4trace:configure.ac:769: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRSTR])
+m4trace:configure.ac:769: -1- m4_pattern_allow([^HAVE_STRSTR$])
+m4trace:configure.ac:769: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strstr.$ac_objext"])
+m4trace:configure.ac:769: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:769: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:769: -1- AC_LIBSOURCE([strstr.c])
+m4trace:configure.ac:770: -1- AH_OUTPUT([HAVE_STRTOD], [/* Define to 1 if you have the `strtod\' function. */
 @%:@undef HAVE_STRTOD])
-m4trace:configure.ac:764: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRTOD])
-m4trace:configure.ac:764: -1- m4_pattern_allow([^HAVE_STRTOD$])
-m4trace:configure.ac:764: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strtod.$ac_objext"])
-m4trace:configure.ac:764: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
-m4trace:configure.ac:764: -1- m4_pattern_allow([^LIB@&t@OBJS$])
-m4trace:configure.ac:764: -1- AC_LIBSOURCE([strtod.c])
-m4trace:configure.ac:764: -1- AH_OUTPUT([HAVE_STRTOL], [/* Define to 1 if you have the `strtol\' function. */
+m4trace:configure.ac:770: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRTOD])
+m4trace:configure.ac:770: -1- m4_pattern_allow([^HAVE_STRTOD$])
+m4trace:configure.ac:770: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strtod.$ac_objext"])
+m4trace:configure.ac:770: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:770: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:770: -1- AC_LIBSOURCE([strtod.c])
+m4trace:configure.ac:770: -1- AH_OUTPUT([HAVE_STRTOL], [/* Define to 1 if you have the `strtol\' function. */
 @%:@undef HAVE_STRTOL])
-m4trace:configure.ac:764: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRTOL])
-m4trace:configure.ac:764: -1- m4_pattern_allow([^HAVE_STRTOL$])
-m4trace:configure.ac:764: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strtol.$ac_objext"])
-m4trace:configure.ac:764: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
-m4trace:configure.ac:764: -1- m4_pattern_allow([^LIB@&t@OBJS$])
-m4trace:configure.ac:764: -1- AC_LIBSOURCE([strtol.c])
-m4trace:configure.ac:764: -1- AH_OUTPUT([HAVE_STRTOUL], [/* Define to 1 if you have the `strtoul\' function. */
+m4trace:configure.ac:770: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRTOL])
+m4trace:configure.ac:770: -1- m4_pattern_allow([^HAVE_STRTOL$])
+m4trace:configure.ac:770: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strtol.$ac_objext"])
+m4trace:configure.ac:770: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:770: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:770: -1- AC_LIBSOURCE([strtol.c])
+m4trace:configure.ac:770: -1- AH_OUTPUT([HAVE_STRTOUL], [/* Define to 1 if you have the `strtoul\' function. */
 @%:@undef HAVE_STRTOUL])
-m4trace:configure.ac:764: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRTOUL])
-m4trace:configure.ac:764: -1- m4_pattern_allow([^HAVE_STRTOUL$])
-m4trace:configure.ac:764: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strtoul.$ac_objext"])
-m4trace:configure.ac:764: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
-m4trace:configure.ac:764: -1- m4_pattern_allow([^LIB@&t@OBJS$])
-m4trace:configure.ac:764: -1- AC_LIBSOURCE([strtoul.c])
-m4trace:configure.ac:764: -1- AH_OUTPUT([HAVE_STRTOLL], [/* Define to 1 if you have the `strtoll\' function. */
+m4trace:configure.ac:770: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRTOUL])
+m4trace:configure.ac:770: -1- m4_pattern_allow([^HAVE_STRTOUL$])
+m4trace:configure.ac:770: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strtoul.$ac_objext"])
+m4trace:configure.ac:770: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:770: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:770: -1- AC_LIBSOURCE([strtoul.c])
+m4trace:configure.ac:770: -1- AH_OUTPUT([HAVE_STRTOLL], [/* Define to 1 if you have the `strtoll\' function. */
 @%:@undef HAVE_STRTOLL])
-m4trace:configure.ac:764: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRTOLL])
-m4trace:configure.ac:764: -1- m4_pattern_allow([^HAVE_STRTOLL$])
-m4trace:configure.ac:764: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strtoll.$ac_objext"])
-m4trace:configure.ac:764: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
-m4trace:configure.ac:764: -1- m4_pattern_allow([^LIB@&t@OBJS$])
-m4trace:configure.ac:764: -1- AC_LIBSOURCE([strtoll.c])
-m4trace:configure.ac:764: -1- AH_OUTPUT([HAVE_STRTOULL], [/* Define to 1 if you have the `strtoull\' function. */
+m4trace:configure.ac:770: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRTOLL])
+m4trace:configure.ac:770: -1- m4_pattern_allow([^HAVE_STRTOLL$])
+m4trace:configure.ac:770: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strtoll.$ac_objext"])
+m4trace:configure.ac:770: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:770: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:770: -1- AC_LIBSOURCE([strtoll.c])
+m4trace:configure.ac:770: -1- AH_OUTPUT([HAVE_STRTOULL], [/* Define to 1 if you have the `strtoull\' function. */
 @%:@undef HAVE_STRTOULL])
-m4trace:configure.ac:764: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRTOULL])
-m4trace:configure.ac:764: -1- m4_pattern_allow([^HAVE_STRTOULL$])
-m4trace:configure.ac:764: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strtoull.$ac_objext"])
-m4trace:configure.ac:764: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
-m4trace:configure.ac:764: -1- m4_pattern_allow([^LIB@&t@OBJS$])
-m4trace:configure.ac:764: -1- AC_LIBSOURCE([strtoull.c])
-m4trace:configure.ac:764: -1- AH_OUTPUT([HAVE_STRTOIMAX], [/* Define to 1 if you have the `strtoimax\' function. */
+m4trace:configure.ac:770: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRTOULL])
+m4trace:configure.ac:770: -1- m4_pattern_allow([^HAVE_STRTOULL$])
+m4trace:configure.ac:770: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strtoull.$ac_objext"])
+m4trace:configure.ac:770: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:770: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:770: -1- AC_LIBSOURCE([strtoull.c])
+m4trace:configure.ac:770: -1- AH_OUTPUT([HAVE_STRTOIMAX], [/* Define to 1 if you have the `strtoimax\' function. */
 @%:@undef HAVE_STRTOIMAX])
-m4trace:configure.ac:764: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRTOIMAX])
-m4trace:configure.ac:764: -1- m4_pattern_allow([^HAVE_STRTOIMAX$])
-m4trace:configure.ac:764: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strtoimax.$ac_objext"])
-m4trace:configure.ac:764: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
-m4trace:configure.ac:764: -1- m4_pattern_allow([^LIB@&t@OBJS$])
-m4trace:configure.ac:764: -1- AC_LIBSOURCE([strtoimax.c])
-m4trace:configure.ac:764: -1- AH_OUTPUT([HAVE_STRTOUMAX], [/* Define to 1 if you have the `strtoumax\' function. */
+m4trace:configure.ac:770: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRTOIMAX])
+m4trace:configure.ac:770: -1- m4_pattern_allow([^HAVE_STRTOIMAX$])
+m4trace:configure.ac:770: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strtoimax.$ac_objext"])
+m4trace:configure.ac:770: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:770: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:770: -1- AC_LIBSOURCE([strtoimax.c])
+m4trace:configure.ac:770: -1- AH_OUTPUT([HAVE_STRTOUMAX], [/* Define to 1 if you have the `strtoumax\' function. */
 @%:@undef HAVE_STRTOUMAX])
-m4trace:configure.ac:764: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRTOUMAX])
-m4trace:configure.ac:764: -1- m4_pattern_allow([^HAVE_STRTOUMAX$])
-m4trace:configure.ac:764: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strtoumax.$ac_objext"])
-m4trace:configure.ac:764: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
-m4trace:configure.ac:764: -1- m4_pattern_allow([^LIB@&t@OBJS$])
-m4trace:configure.ac:764: -1- AC_LIBSOURCE([strtoumax.c])
-m4trace:configure.ac:765: -1- AH_OUTPUT([HAVE_DPRINTF], [/* Define to 1 if you have the `dprintf\' function. */
+m4trace:configure.ac:770: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRTOUMAX])
+m4trace:configure.ac:770: -1- m4_pattern_allow([^HAVE_STRTOUMAX$])
+m4trace:configure.ac:770: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strtoumax.$ac_objext"])
+m4trace:configure.ac:770: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:770: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:770: -1- AC_LIBSOURCE([strtoumax.c])
+m4trace:configure.ac:771: -1- AH_OUTPUT([HAVE_DPRINTF], [/* Define to 1 if you have the `dprintf\' function. */
 @%:@undef HAVE_DPRINTF])
-m4trace:configure.ac:765: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DPRINTF])
-m4trace:configure.ac:765: -1- m4_pattern_allow([^HAVE_DPRINTF$])
-m4trace:configure.ac:765: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS dprintf.$ac_objext"])
-m4trace:configure.ac:765: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
-m4trace:configure.ac:765: -1- m4_pattern_allow([^LIB@&t@OBJS$])
-m4trace:configure.ac:765: -1- AC_LIBSOURCE([dprintf.c])
-m4trace:configure.ac:766: -1- AH_OUTPUT([HAVE_STRCHRNUL], [/* Define to 1 if you have the `strchrnul\' function. */
+m4trace:configure.ac:771: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DPRINTF])
+m4trace:configure.ac:771: -1- m4_pattern_allow([^HAVE_DPRINTF$])
+m4trace:configure.ac:771: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS dprintf.$ac_objext"])
+m4trace:configure.ac:771: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:771: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:771: -1- AC_LIBSOURCE([dprintf.c])
+m4trace:configure.ac:772: -1- AH_OUTPUT([HAVE_STRCHRNUL], [/* Define to 1 if you have the `strchrnul\' function. */
 @%:@undef HAVE_STRCHRNUL])
-m4trace:configure.ac:766: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRCHRNUL])
-m4trace:configure.ac:766: -1- m4_pattern_allow([^HAVE_STRCHRNUL$])
-m4trace:configure.ac:766: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strchrnul.$ac_objext"])
-m4trace:configure.ac:766: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
-m4trace:configure.ac:766: -1- m4_pattern_allow([^LIB@&t@OBJS$])
-m4trace:configure.ac:766: -1- AC_LIBSOURCE([strchrnul.c])
-m4trace:configure.ac:768: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_AUDIT_USER_TTY])
-m4trace:configure.ac:768: -1- m4_pattern_allow([^HAVE_DECL_AUDIT_USER_TTY$])
-m4trace:configure.ac:768: -1- AH_OUTPUT([HAVE_DECL_AUDIT_USER_TTY], [/* Define to 1 if you have the declaration of `AUDIT_USER_TTY\', and to 0 if
+m4trace:configure.ac:772: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRCHRNUL])
+m4trace:configure.ac:772: -1- m4_pattern_allow([^HAVE_STRCHRNUL$])
+m4trace:configure.ac:772: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS strchrnul.$ac_objext"])
+m4trace:configure.ac:772: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:772: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:772: -1- AC_LIBSOURCE([strchrnul.c])
+m4trace:configure.ac:774: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_AUDIT_USER_TTY])
+m4trace:configure.ac:774: -1- m4_pattern_allow([^HAVE_DECL_AUDIT_USER_TTY$])
+m4trace:configure.ac:774: -1- AH_OUTPUT([HAVE_DECL_AUDIT_USER_TTY], [/* Define to 1 if you have the declaration of `AUDIT_USER_TTY\', and to 0 if
    you don\'t. */
 @%:@undef HAVE_DECL_AUDIT_USER_TTY])
-m4trace:configure.ac:770: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_CONFSTR])
-m4trace:configure.ac:770: -1- m4_pattern_allow([^HAVE_DECL_CONFSTR$])
-m4trace:configure.ac:770: -1- AH_OUTPUT([HAVE_DECL_CONFSTR], [/* Define to 1 if you have the declaration of `confstr\', and to 0 if you
+m4trace:configure.ac:776: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_CONFSTR])
+m4trace:configure.ac:776: -1- m4_pattern_allow([^HAVE_DECL_CONFSTR$])
+m4trace:configure.ac:776: -1- AH_OUTPUT([HAVE_DECL_CONFSTR], [/* Define to 1 if you have the declaration of `confstr\', and to 0 if you
    don\'t. */
 @%:@undef HAVE_DECL_CONFSTR])
-m4trace:configure.ac:771: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_PRINTF])
-m4trace:configure.ac:771: -1- m4_pattern_allow([^HAVE_DECL_PRINTF$])
-m4trace:configure.ac:771: -1- AH_OUTPUT([HAVE_DECL_PRINTF], [/* Define to 1 if you have the declaration of `printf\', and to 0 if you don\'t.
+m4trace:configure.ac:777: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_PRINTF])
+m4trace:configure.ac:777: -1- m4_pattern_allow([^HAVE_DECL_PRINTF$])
+m4trace:configure.ac:777: -1- AH_OUTPUT([HAVE_DECL_PRINTF], [/* Define to 1 if you have the declaration of `printf\', and to 0 if you don\'t.
    */
 @%:@undef HAVE_DECL_PRINTF])
-m4trace:configure.ac:772: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_SBRK])
-m4trace:configure.ac:772: -1- m4_pattern_allow([^HAVE_DECL_SBRK$])
-m4trace:configure.ac:772: -1- AH_OUTPUT([HAVE_DECL_SBRK], [/* Define to 1 if you have the declaration of `sbrk\', and to 0 if you don\'t.
+m4trace:configure.ac:778: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_SBRK])
+m4trace:configure.ac:778: -1- m4_pattern_allow([^HAVE_DECL_SBRK$])
+m4trace:configure.ac:778: -1- AH_OUTPUT([HAVE_DECL_SBRK], [/* Define to 1 if you have the declaration of `sbrk\', and to 0 if you don\'t.
    */
 @%:@undef HAVE_DECL_SBRK])
-m4trace:configure.ac:773: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_SETREGID])
-m4trace:configure.ac:773: -1- m4_pattern_allow([^HAVE_DECL_SETREGID$])
-m4trace:configure.ac:773: -1- AH_OUTPUT([HAVE_DECL_SETREGID], [/* Define to 1 if you have the declaration of `setregid\', and to 0 if you
+m4trace:configure.ac:779: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_SETREGID])
+m4trace:configure.ac:779: -1- m4_pattern_allow([^HAVE_DECL_SETREGID$])
+m4trace:configure.ac:779: -1- AH_OUTPUT([HAVE_DECL_SETREGID], [/* Define to 1 if you have the declaration of `setregid\', and to 0 if you
    don\'t. */
 @%:@undef HAVE_DECL_SETREGID])
-m4trace:configure.ac:774: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_STRCPY])
-m4trace:configure.ac:774: -1- m4_pattern_allow([^HAVE_DECL_STRCPY$])
-m4trace:configure.ac:774: -1- AH_OUTPUT([HAVE_DECL_STRCPY], [/* Define to 1 if you have the declaration of `strcpy\', and to 0 if you don\'t.
+m4trace:configure.ac:780: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_STRCPY])
+m4trace:configure.ac:780: -1- m4_pattern_allow([^HAVE_DECL_STRCPY$])
+m4trace:configure.ac:780: -1- AH_OUTPUT([HAVE_DECL_STRCPY], [/* Define to 1 if you have the declaration of `strcpy\', and to 0 if you don\'t.
    */
 @%:@undef HAVE_DECL_STRCPY])
-m4trace:configure.ac:775: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_STRSIGNAL])
-m4trace:configure.ac:775: -1- m4_pattern_allow([^HAVE_DECL_STRSIGNAL$])
-m4trace:configure.ac:775: -1- AH_OUTPUT([HAVE_DECL_STRSIGNAL], [/* Define to 1 if you have the declaration of `strsignal\', and to 0 if you
+m4trace:configure.ac:781: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_STRSIGNAL])
+m4trace:configure.ac:781: -1- m4_pattern_allow([^HAVE_DECL_STRSIGNAL$])
+m4trace:configure.ac:781: -1- AH_OUTPUT([HAVE_DECL_STRSIGNAL], [/* Define to 1 if you have the declaration of `strsignal\', and to 0 if you
    don\'t. */
 @%:@undef HAVE_DECL_STRSIGNAL])
-m4trace:configure.ac:778: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_STRTOLD])
-m4trace:configure.ac:778: -1- m4_pattern_allow([^HAVE_DECL_STRTOLD$])
-m4trace:configure.ac:778: -1- AH_OUTPUT([HAVE_DECL_STRTOLD], [/* Define to 1 if you have the declaration of `strtold\', and to 0 if you
+m4trace:configure.ac:784: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_STRTOLD])
+m4trace:configure.ac:784: -1- m4_pattern_allow([^HAVE_DECL_STRTOLD$])
+m4trace:configure.ac:784: -1- AH_OUTPUT([HAVE_DECL_STRTOLD], [/* Define to 1 if you have the declaration of `strtold\', and to 0 if you
    don\'t. */
 @%:@undef HAVE_DECL_STRTOLD])
-m4trace:configure.ac:778: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
+m4trace:configure.ac:784: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2881: AC_CHECK_DECLS is expanded from...
-configure.ac:778: the top level])
-m4trace:configure.ac:778: -1- AC_DEFINE_TRACE_LITERAL([STRTOLD_BROKEN])
-m4trace:configure.ac:778: -1- m4_pattern_allow([^STRTOLD_BROKEN$])
-m4trace:configure.ac:794: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+configure.ac:784: the top level])
+m4trace:configure.ac:784: -1- AC_DEFINE_TRACE_LITERAL([STRTOLD_BROKEN])
+m4trace:configure.ac:784: -1- m4_pattern_allow([^STRTOLD_BROKEN$])
+m4trace:configure.ac:800: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
 aclocal.m4:103: BASH_CHECK_DECL is expanded from...
-configure.ac:794: the top level])
-m4trace:configure.ac:795: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+configure.ac:800: the top level])
+m4trace:configure.ac:801: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
 aclocal.m4:103: BASH_CHECK_DECL is expanded from...
-configure.ac:795: the top level])
-m4trace:configure.ac:796: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+configure.ac:801: the top level])
+m4trace:configure.ac:802: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
 aclocal.m4:103: BASH_CHECK_DECL is expanded from...
-configure.ac:796: the top level])
-m4trace:configure.ac:797: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+configure.ac:802: the top level])
+m4trace:configure.ac:803: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
 aclocal.m4:103: BASH_CHECK_DECL is expanded from...
-configure.ac:797: the top level])
-m4trace:configure.ac:798: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+configure.ac:803: the top level])
+m4trace:configure.ac:804: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
 aclocal.m4:103: BASH_CHECK_DECL is expanded from...
-configure.ac:798: the top level])
-m4trace:configure.ac:799: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+configure.ac:804: the top level])
+m4trace:configure.ac:805: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
 aclocal.m4:103: BASH_CHECK_DECL is expanded from...
-configure.ac:799: the top level])
-m4trace:configure.ac:801: -1- AH_OUTPUT([HAVE_SYS_TIME_H], [/* Define to 1 if you have the <sys/time.h> header file. */
+configure.ac:805: the top level])
+m4trace:configure.ac:807: -1- AH_OUTPUT([HAVE_SYS_TIME_H], [/* Define to 1 if you have the <sys/time.h> header file. */
 @%:@undef HAVE_SYS_TIME_H])
-m4trace:configure.ac:801: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the <unistd.h> header file. */
+m4trace:configure.ac:807: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the <unistd.h> header file. */
 @%:@undef HAVE_UNISTD_H])
-m4trace:configure.ac:801: -1- AH_OUTPUT([HAVE_ALARM], [/* Define to 1 if you have the `alarm\' function. */
+m4trace:configure.ac:807: -1- AH_OUTPUT([HAVE_ALARM], [/* Define to 1 if you have the `alarm\' function. */
 @%:@undef HAVE_ALARM])
-m4trace:configure.ac:801: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS mktime.$ac_objext"])
-m4trace:configure.ac:801: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
-m4trace:configure.ac:801: -1- m4_pattern_allow([^LIB@&t@OBJS$])
-m4trace:configure.ac:801: -1- AC_LIBSOURCE([mktime.c])
-m4trace:configure.ac:808: -1- AH_OUTPUT([HAVE_ARGZ_H], [/* Define to 1 if you have the <argz.h> header file. */
+m4trace:configure.ac:807: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS mktime.$ac_objext"])
+m4trace:configure.ac:807: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:807: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:807: -1- AC_LIBSOURCE([mktime.c])
+m4trace:configure.ac:814: -1- AH_OUTPUT([HAVE_ARGZ_H], [/* Define to 1 if you have the <argz.h> header file. */
 @%:@undef HAVE_ARGZ_H])
-m4trace:configure.ac:808: -1- AH_OUTPUT([HAVE_ERRNO_H], [/* Define to 1 if you have the <errno.h> header file. */
+m4trace:configure.ac:814: -1- AH_OUTPUT([HAVE_ERRNO_H], [/* Define to 1 if you have the <errno.h> header file. */
 @%:@undef HAVE_ERRNO_H])
-m4trace:configure.ac:808: -1- AH_OUTPUT([HAVE_FCNTL_H], [/* Define to 1 if you have the <fcntl.h> header file. */
+m4trace:configure.ac:814: -1- AH_OUTPUT([HAVE_FCNTL_H], [/* Define to 1 if you have the <fcntl.h> header file. */
 @%:@undef HAVE_FCNTL_H])
-m4trace:configure.ac:808: -1- AH_OUTPUT([HAVE_MALLOC_H], [/* Define to 1 if you have the <malloc.h> header file. */
+m4trace:configure.ac:814: -1- AH_OUTPUT([HAVE_MALLOC_H], [/* Define to 1 if you have the <malloc.h> header file. */
 @%:@undef HAVE_MALLOC_H])
-m4trace:configure.ac:808: -1- AH_OUTPUT([HAVE_STDIO_EXT_H], [/* Define to 1 if you have the <stdio_ext.h> header file. */
+m4trace:configure.ac:814: -1- AH_OUTPUT([HAVE_STDIO_EXT_H], [/* Define to 1 if you have the <stdio_ext.h> header file. */
 @%:@undef HAVE_STDIO_EXT_H])
-m4trace:configure.ac:811: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the <stdlib.h> header file. */
+m4trace:configure.ac:817: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the <stdlib.h> header file. */
 @%:@undef HAVE_STDLIB_H])
-m4trace:configure.ac:811: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the <unistd.h> header file. */
+m4trace:configure.ac:817: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the <unistd.h> header file. */
 @%:@undef HAVE_UNISTD_H])
-m4trace:configure.ac:811: -1- AH_OUTPUT([HAVE_SYS_PARAM_H], [/* Define to 1 if you have the <sys/param.h> header file. */
+m4trace:configure.ac:817: -1- AH_OUTPUT([HAVE_SYS_PARAM_H], [/* Define to 1 if you have the <sys/param.h> header file. */
 @%:@undef HAVE_SYS_PARAM_H])
-m4trace:configure.ac:811: -1- AH_OUTPUT([HAVE_GETPAGESIZE], [/* Define to 1 if you have the `getpagesize\' function. */
+m4trace:configure.ac:817: -1- AH_OUTPUT([HAVE_GETPAGESIZE], [/* Define to 1 if you have the `getpagesize\' function. */
 @%:@undef HAVE_GETPAGESIZE])
-m4trace:configure.ac:811: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GETPAGESIZE])
-m4trace:configure.ac:811: -1- m4_pattern_allow([^HAVE_GETPAGESIZE$])
-m4trace:configure.ac:811: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MMAP])
-m4trace:configure.ac:811: -1- m4_pattern_allow([^HAVE_MMAP$])
-m4trace:configure.ac:811: -1- AH_OUTPUT([HAVE_MMAP], [/* Define to 1 if you have a working `mmap\' system call. */
+m4trace:configure.ac:817: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GETPAGESIZE])
+m4trace:configure.ac:817: -1- m4_pattern_allow([^HAVE_GETPAGESIZE$])
+m4trace:configure.ac:817: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MMAP])
+m4trace:configure.ac:817: -1- m4_pattern_allow([^HAVE_MMAP$])
+m4trace:configure.ac:817: -1- AH_OUTPUT([HAVE_MMAP], [/* Define to 1 if you have a working `mmap\' system call. */
 @%:@undef HAVE_MMAP])
-m4trace:configure.ac:812: -1- AH_OUTPUT([HAVE___ARGZ_COUNT], [/* Define to 1 if you have the `__argz_count\' function. */
+m4trace:configure.ac:818: -1- AH_OUTPUT([HAVE___ARGZ_COUNT], [/* Define to 1 if you have the `__argz_count\' function. */
 @%:@undef HAVE___ARGZ_COUNT])
-m4trace:configure.ac:812: -1- AH_OUTPUT([HAVE___ARGZ_NEXT], [/* Define to 1 if you have the `__argz_next\' function. */
+m4trace:configure.ac:818: -1- AH_OUTPUT([HAVE___ARGZ_NEXT], [/* Define to 1 if you have the `__argz_next\' function. */
 @%:@undef HAVE___ARGZ_NEXT])
-m4trace:configure.ac:812: -1- AH_OUTPUT([HAVE___ARGZ_STRINGIFY], [/* Define to 1 if you have the `__argz_stringify\' function. */
+m4trace:configure.ac:818: -1- AH_OUTPUT([HAVE___ARGZ_STRINGIFY], [/* Define to 1 if you have the `__argz_stringify\' function. */
 @%:@undef HAVE___ARGZ_STRINGIFY])
-m4trace:configure.ac:812: -1- AH_OUTPUT([HAVE_DCGETTEXT], [/* Define to 1 if you have the `dcgettext\' function. */
+m4trace:configure.ac:818: -1- AH_OUTPUT([HAVE_DCGETTEXT], [/* Define to 1 if you have the `dcgettext\' function. */
 @%:@undef HAVE_DCGETTEXT])
-m4trace:configure.ac:812: -1- AH_OUTPUT([HAVE_MEMPCPY], [/* Define to 1 if you have the `mempcpy\' function. */
+m4trace:configure.ac:818: -1- AH_OUTPUT([HAVE_MEMPCPY], [/* Define to 1 if you have the `mempcpy\' function. */
 @%:@undef HAVE_MEMPCPY])
-m4trace:configure.ac:812: -1- AH_OUTPUT([HAVE_MUNMAP], [/* Define to 1 if you have the `munmap\' function. */
+m4trace:configure.ac:818: -1- AH_OUTPUT([HAVE_MUNMAP], [/* Define to 1 if you have the `munmap\' function. */
 @%:@undef HAVE_MUNMAP])
-m4trace:configure.ac:812: -1- AH_OUTPUT([HAVE_STPCPY], [/* Define to 1 if you have the `stpcpy\' function. */
+m4trace:configure.ac:818: -1- AH_OUTPUT([HAVE_STPCPY], [/* Define to 1 if you have the `stpcpy\' function. */
 @%:@undef HAVE_STPCPY])
-m4trace:configure.ac:812: -1- AH_OUTPUT([HAVE_STRCSPN], [/* Define to 1 if you have the `strcspn\' function. */
+m4trace:configure.ac:818: -1- AH_OUTPUT([HAVE_STRCSPN], [/* Define to 1 if you have the `strcspn\' function. */
 @%:@undef HAVE_STRCSPN])
-m4trace:configure.ac:812: -1- AH_OUTPUT([HAVE_STRDUP], [/* Define to 1 if you have the `strdup\' function. */
+m4trace:configure.ac:818: -1- AH_OUTPUT([HAVE_STRDUP], [/* Define to 1 if you have the `strdup\' function. */
 @%:@undef HAVE_STRDUP])
-m4trace:configure.ac:821: -1- AC_SUBST([INTL_DEP])
-m4trace:configure.ac:821: -1- AC_SUBST_TRACE([INTL_DEP])
-m4trace:configure.ac:821: -1- m4_pattern_allow([^INTL_DEP$])
-m4trace:configure.ac:822: -1- AC_SUBST([INTL_INC])
-m4trace:configure.ac:822: -1- AC_SUBST_TRACE([INTL_INC])
-m4trace:configure.ac:822: -1- m4_pattern_allow([^INTL_INC$])
-m4trace:configure.ac:823: -1- AC_SUBST([LIBINTL_H])
-m4trace:configure.ac:823: -1- AC_SUBST_TRACE([LIBINTL_H])
-m4trace:configure.ac:823: -1- m4_pattern_allow([^LIBINTL_H$])
-m4trace:configure.ac:829: -1- AH_OUTPUT([HAVE_WCTYPE_H], [/* Define to 1 if you have the <wctype.h> header file. */
+m4trace:configure.ac:827: -1- AC_SUBST([INTL_DEP])
+m4trace:configure.ac:827: -1- AC_SUBST_TRACE([INTL_DEP])
+m4trace:configure.ac:827: -1- m4_pattern_allow([^INTL_DEP$])
+m4trace:configure.ac:828: -1- AC_SUBST([INTL_INC])
+m4trace:configure.ac:828: -1- AC_SUBST_TRACE([INTL_INC])
+m4trace:configure.ac:828: -1- m4_pattern_allow([^INTL_INC$])
+m4trace:configure.ac:829: -1- AC_SUBST([LIBINTL_H])
+m4trace:configure.ac:829: -1- AC_SUBST_TRACE([LIBINTL_H])
+m4trace:configure.ac:829: -1- m4_pattern_allow([^LIBINTL_H$])
+m4trace:configure.ac:835: -1- AH_OUTPUT([HAVE_WCTYPE_H], [/* Define to 1 if you have the <wctype.h> header file. */
 @%:@undef HAVE_WCTYPE_H])
-m4trace:configure.ac:829: -1- AC_DEFINE_TRACE_LITERAL([HAVE_WCTYPE_H])
-m4trace:configure.ac:829: -1- m4_pattern_allow([^HAVE_WCTYPE_H$])
-m4trace:configure.ac:829: -1- AH_OUTPUT([HAVE_WCHAR_H], [/* Define to 1 if you have the <wchar.h> header file. */
+m4trace:configure.ac:835: -1- AC_DEFINE_TRACE_LITERAL([HAVE_WCTYPE_H])
+m4trace:configure.ac:835: -1- m4_pattern_allow([^HAVE_WCTYPE_H$])
+m4trace:configure.ac:835: -1- AH_OUTPUT([HAVE_WCHAR_H], [/* Define to 1 if you have the <wchar.h> header file. */
 @%:@undef HAVE_WCHAR_H])
-m4trace:configure.ac:829: -1- AC_DEFINE_TRACE_LITERAL([HAVE_WCHAR_H])
-m4trace:configure.ac:829: -1- m4_pattern_allow([^HAVE_WCHAR_H$])
-m4trace:configure.ac:829: -1- AH_OUTPUT([HAVE_LANGINFO_H], [/* Define to 1 if you have the <langinfo.h> header file. */
+m4trace:configure.ac:835: -1- AC_DEFINE_TRACE_LITERAL([HAVE_WCHAR_H])
+m4trace:configure.ac:835: -1- m4_pattern_allow([^HAVE_WCHAR_H$])
+m4trace:configure.ac:835: -1- AH_OUTPUT([HAVE_LANGINFO_H], [/* Define to 1 if you have the <langinfo.h> header file. */
 @%:@undef HAVE_LANGINFO_H])
-m4trace:configure.ac:829: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LANGINFO_H])
-m4trace:configure.ac:829: -1- m4_pattern_allow([^HAVE_LANGINFO_H$])
-m4trace:configure.ac:829: -2- AC_DEFINE_TRACE_LITERAL([HAVE_MBRLEN])
-m4trace:configure.ac:829: -2- m4_pattern_allow([^HAVE_MBRLEN$])
-m4trace:configure.ac:829: -2- AC_DEFINE_TRACE_LITERAL([HAVE_MBSCMP])
-m4trace:configure.ac:829: -2- m4_pattern_allow([^HAVE_MBSCMP$])
-m4trace:configure.ac:829: -2- AC_DEFINE_TRACE_LITERAL([HAVE_MBSCMP])
-m4trace:configure.ac:829: -2- m4_pattern_allow([^HAVE_MBSCMP$])
-m4trace:configure.ac:829: -2- AC_DEFINE_TRACE_LITERAL([HAVE_MBSNRTOWCS])
-m4trace:configure.ac:829: -2- m4_pattern_allow([^HAVE_MBSNRTOWCS$])
-m4trace:configure.ac:829: -2- AC_DEFINE_TRACE_LITERAL([HAVE_MBSRTOWCS])
-m4trace:configure.ac:829: -2- m4_pattern_allow([^HAVE_MBSRTOWCS$])
-m4trace:configure.ac:829: -1- AH_OUTPUT([HAVE_MBSCHR], [/* Define to 1 if you have the `mbschr\' function. */
+m4trace:configure.ac:835: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LANGINFO_H])
+m4trace:configure.ac:835: -1- m4_pattern_allow([^HAVE_LANGINFO_H$])
+m4trace:configure.ac:835: -2- AC_DEFINE_TRACE_LITERAL([HAVE_MBRLEN])
+m4trace:configure.ac:835: -2- m4_pattern_allow([^HAVE_MBRLEN$])
+m4trace:configure.ac:835: -2- AC_DEFINE_TRACE_LITERAL([HAVE_MBSCMP])
+m4trace:configure.ac:835: -2- m4_pattern_allow([^HAVE_MBSCMP$])
+m4trace:configure.ac:835: -2- AC_DEFINE_TRACE_LITERAL([HAVE_MBSCMP])
+m4trace:configure.ac:835: -2- m4_pattern_allow([^HAVE_MBSCMP$])
+m4trace:configure.ac:835: -2- AC_DEFINE_TRACE_LITERAL([HAVE_MBSNRTOWCS])
+m4trace:configure.ac:835: -2- m4_pattern_allow([^HAVE_MBSNRTOWCS$])
+m4trace:configure.ac:835: -2- AC_DEFINE_TRACE_LITERAL([HAVE_MBSRTOWCS])
+m4trace:configure.ac:835: -2- m4_pattern_allow([^HAVE_MBSRTOWCS$])
+m4trace:configure.ac:835: -1- AH_OUTPUT([HAVE_MBSCHR], [/* Define to 1 if you have the `mbschr\' function. */
 @%:@undef HAVE_MBSCHR])
-m4trace:configure.ac:829: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MBSCHR])
-m4trace:configure.ac:829: -1- m4_pattern_allow([^HAVE_MBSCHR$])
-m4trace:configure.ac:829: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS mbschr.$ac_objext"])
-m4trace:configure.ac:829: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
-m4trace:configure.ac:829: -1- m4_pattern_allow([^LIB@&t@OBJS$])
-m4trace:configure.ac:829: -1- AC_LIBSOURCE([mbschr.c])
-m4trace:configure.ac:829: -2- AC_DEFINE_TRACE_LITERAL([HAVE_WCRTOMB])
-m4trace:configure.ac:829: -2- m4_pattern_allow([^HAVE_WCRTOMB$])
-m4trace:configure.ac:829: -2- AC_DEFINE_TRACE_LITERAL([HAVE_WCSCOLL])
-m4trace:configure.ac:829: -2- m4_pattern_allow([^HAVE_WCSCOLL$])
-m4trace:configure.ac:829: -2- AC_DEFINE_TRACE_LITERAL([HAVE_WCSDUP])
-m4trace:configure.ac:829: -2- m4_pattern_allow([^HAVE_WCSDUP$])
-m4trace:configure.ac:829: -2- AC_DEFINE_TRACE_LITERAL([HAVE_WCWIDTH])
-m4trace:configure.ac:829: -2- m4_pattern_allow([^HAVE_WCWIDTH$])
-m4trace:configure.ac:829: -2- AC_DEFINE_TRACE_LITERAL([HAVE_WCTYPE])
-m4trace:configure.ac:829: -2- m4_pattern_allow([^HAVE_WCTYPE$])
-m4trace:configure.ac:829: -1- AH_OUTPUT([HAVE_WCSWIDTH], [/* Define to 1 if you have the `wcswidth\' function. */
+m4trace:configure.ac:835: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MBSCHR])
+m4trace:configure.ac:835: -1- m4_pattern_allow([^HAVE_MBSCHR$])
+m4trace:configure.ac:835: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS mbschr.$ac_objext"])
+m4trace:configure.ac:835: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:835: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:835: -1- AC_LIBSOURCE([mbschr.c])
+m4trace:configure.ac:835: -2- AC_DEFINE_TRACE_LITERAL([HAVE_WCRTOMB])
+m4trace:configure.ac:835: -2- m4_pattern_allow([^HAVE_WCRTOMB$])
+m4trace:configure.ac:835: -2- AC_DEFINE_TRACE_LITERAL([HAVE_WCSCOLL])
+m4trace:configure.ac:835: -2- m4_pattern_allow([^HAVE_WCSCOLL$])
+m4trace:configure.ac:835: -2- AC_DEFINE_TRACE_LITERAL([HAVE_WCSDUP])
+m4trace:configure.ac:835: -2- m4_pattern_allow([^HAVE_WCSDUP$])
+m4trace:configure.ac:835: -2- AC_DEFINE_TRACE_LITERAL([HAVE_WCWIDTH])
+m4trace:configure.ac:835: -2- m4_pattern_allow([^HAVE_WCWIDTH$])
+m4trace:configure.ac:835: -2- AC_DEFINE_TRACE_LITERAL([HAVE_WCTYPE])
+m4trace:configure.ac:835: -2- m4_pattern_allow([^HAVE_WCTYPE$])
+m4trace:configure.ac:835: -1- AH_OUTPUT([HAVE_WCSWIDTH], [/* Define to 1 if you have the `wcswidth\' function. */
 @%:@undef HAVE_WCSWIDTH])
-m4trace:configure.ac:829: -1- AC_DEFINE_TRACE_LITERAL([HAVE_WCSWIDTH])
-m4trace:configure.ac:829: -1- m4_pattern_allow([^HAVE_WCSWIDTH$])
-m4trace:configure.ac:829: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS wcswidth.$ac_objext"])
-m4trace:configure.ac:829: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
-m4trace:configure.ac:829: -1- m4_pattern_allow([^LIB@&t@OBJS$])
-m4trace:configure.ac:829: -1- AC_LIBSOURCE([wcswidth.c])
-m4trace:configure.ac:829: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MBRTOWC])
-m4trace:configure.ac:829: -1- m4_pattern_allow([^HAVE_MBRTOWC$])
-m4trace:configure.ac:829: -1- AH_OUTPUT([HAVE_MBRTOWC], [/* Define to 1 if mbrtowc and mbstate_t are properly declared. */
+m4trace:configure.ac:835: -1- AC_DEFINE_TRACE_LITERAL([HAVE_WCSWIDTH])
+m4trace:configure.ac:835: -1- m4_pattern_allow([^HAVE_WCSWIDTH$])
+m4trace:configure.ac:835: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS wcswidth.$ac_objext"])
+m4trace:configure.ac:835: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:835: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:835: -1- AC_LIBSOURCE([wcswidth.c])
+m4trace:configure.ac:835: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MBRTOWC])
+m4trace:configure.ac:835: -1- m4_pattern_allow([^HAVE_MBRTOWC$])
+m4trace:configure.ac:835: -1- AH_OUTPUT([HAVE_MBRTOWC], [/* Define to 1 if mbrtowc and mbstate_t are properly declared. */
 @%:@undef HAVE_MBRTOWC])
-m4trace:configure.ac:829: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MBSTATE_T])
-m4trace:configure.ac:829: -1- m4_pattern_allow([^HAVE_MBSTATE_T$])
-m4trace:configure.ac:829: -1- AH_OUTPUT([HAVE_ISWLOWER], [/* Define to 1 if you have the `iswlower\' function. */
+m4trace:configure.ac:835: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MBSTATE_T])
+m4trace:configure.ac:835: -1- m4_pattern_allow([^HAVE_MBSTATE_T$])
+m4trace:configure.ac:835: -1- AH_OUTPUT([HAVE_ISWLOWER], [/* Define to 1 if you have the `iswlower\' function. */
 @%:@undef HAVE_ISWLOWER])
-m4trace:configure.ac:829: -1- AH_OUTPUT([HAVE_ISWUPPER], [/* Define to 1 if you have the `iswupper\' function. */
+m4trace:configure.ac:835: -1- AH_OUTPUT([HAVE_ISWUPPER], [/* Define to 1 if you have the `iswupper\' function. */
 @%:@undef HAVE_ISWUPPER])
-m4trace:configure.ac:829: -1- AH_OUTPUT([HAVE_TOWLOWER], [/* Define to 1 if you have the `towlower\' function. */
+m4trace:configure.ac:835: -1- AH_OUTPUT([HAVE_TOWLOWER], [/* Define to 1 if you have the `towlower\' function. */
 @%:@undef HAVE_TOWLOWER])
-m4trace:configure.ac:829: -1- AH_OUTPUT([HAVE_TOWUPPER], [/* Define to 1 if you have the `towupper\' function. */
+m4trace:configure.ac:835: -1- AH_OUTPUT([HAVE_TOWUPPER], [/* Define to 1 if you have the `towupper\' function. */
 @%:@undef HAVE_TOWUPPER])
-m4trace:configure.ac:829: -1- AH_OUTPUT([HAVE_ISWCTYPE], [/* Define to 1 if you have the `iswctype\' function. */
+m4trace:configure.ac:835: -1- AH_OUTPUT([HAVE_ISWCTYPE], [/* Define to 1 if you have the `iswctype\' function. */
 @%:@undef HAVE_ISWCTYPE])
-m4trace:configure.ac:829: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+m4trace:configure.ac:835: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
 aclocal.m4:1689: BASH_CHECK_MULTIBYTE is expanded from...
-configure.ac:829: the top level])
-m4trace:configure.ac:829: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LANGINFO_CODESET])
-m4trace:configure.ac:829: -1- m4_pattern_allow([^HAVE_LANGINFO_CODESET$])
-m4trace:configure.ac:829: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
+configure.ac:835: the top level])
+m4trace:configure.ac:835: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LANGINFO_CODESET])
+m4trace:configure.ac:835: -1- m4_pattern_allow([^HAVE_LANGINFO_CODESET$])
+m4trace:configure.ac:835: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
 aclocal.m4:1689: BASH_CHECK_MULTIBYTE is expanded from...
-configure.ac:829: the top level])
-m4trace:configure.ac:829: -1- AC_DEFINE_TRACE_LITERAL([HAVE_WCHAR_T])
-m4trace:configure.ac:829: -1- m4_pattern_allow([^HAVE_WCHAR_T$])
-m4trace:configure.ac:829: -1- AH_OUTPUT([HAVE_WCHAR_T], [/* systems should define this type here */
+configure.ac:835: the top level])
+m4trace:configure.ac:835: -1- AC_DEFINE_TRACE_LITERAL([HAVE_WCHAR_T])
+m4trace:configure.ac:835: -1- m4_pattern_allow([^HAVE_WCHAR_T$])
+m4trace:configure.ac:835: -1- AH_OUTPUT([HAVE_WCHAR_T], [/* systems should define this type here */
 @%:@undef HAVE_WCHAR_T])
-m4trace:configure.ac:829: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
+m4trace:configure.ac:835: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
 aclocal.m4:1689: BASH_CHECK_MULTIBYTE is expanded from...
-configure.ac:829: the top level])
-m4trace:configure.ac:829: -1- AC_DEFINE_TRACE_LITERAL([HAVE_WCTYPE_T])
-m4trace:configure.ac:829: -1- m4_pattern_allow([^HAVE_WCTYPE_T$])
-m4trace:configure.ac:829: -1- AH_OUTPUT([HAVE_WCTYPE_T], [/* systems should define this type here */
+configure.ac:835: the top level])
+m4trace:configure.ac:835: -1- AC_DEFINE_TRACE_LITERAL([HAVE_WCTYPE_T])
+m4trace:configure.ac:835: -1- m4_pattern_allow([^HAVE_WCTYPE_T$])
+m4trace:configure.ac:835: -1- AH_OUTPUT([HAVE_WCTYPE_T], [/* systems should define this type here */
 @%:@undef HAVE_WCTYPE_T])
-m4trace:configure.ac:829: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
+m4trace:configure.ac:835: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
 aclocal.m4:1689: BASH_CHECK_MULTIBYTE is expanded from...
-configure.ac:829: the top level])
-m4trace:configure.ac:829: -1- AC_DEFINE_TRACE_LITERAL([HAVE_WINT_T])
-m4trace:configure.ac:829: -1- m4_pattern_allow([^HAVE_WINT_T$])
-m4trace:configure.ac:829: -1- AH_OUTPUT([HAVE_WINT_T], [/* systems should define this type here */
+configure.ac:835: the top level])
+m4trace:configure.ac:835: -1- AC_DEFINE_TRACE_LITERAL([HAVE_WINT_T])
+m4trace:configure.ac:835: -1- m4_pattern_allow([^HAVE_WINT_T$])
+m4trace:configure.ac:835: -1- AH_OUTPUT([HAVE_WINT_T], [/* systems should define this type here */
 @%:@undef HAVE_WINT_T])
-m4trace:configure.ac:829: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
+m4trace:configure.ac:835: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
 aclocal.m4:1689: BASH_CHECK_MULTIBYTE is expanded from...
-configure.ac:829: the top level])
-m4trace:configure.ac:829: -1- _m4_warn([cross], [AC_RUN_IFELSE called without default to allow cross compiling], [../../lib/autoconf/general.m4:2749: AC_RUN_IFELSE is expanded from...
+configure.ac:835: the top level])
+m4trace:configure.ac:835: -1- _m4_warn([cross], [AC_RUN_IFELSE called without default to allow cross compiling], [../../lib/autoconf/general.m4:2749: AC_RUN_IFELSE is expanded from...
 ../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
 aclocal.m4:1689: BASH_CHECK_MULTIBYTE is expanded from...
-configure.ac:829: the top level])
-m4trace:configure.ac:829: -1- AC_DEFINE_TRACE_LITERAL([WCWIDTH_BROKEN])
-m4trace:configure.ac:829: -1- m4_pattern_allow([^WCWIDTH_BROKEN$])
-m4trace:configure.ac:829: -1- AH_OUTPUT([WCWIDTH_BROKEN], [/* wcwidth is usually not broken */
+configure.ac:835: the top level])
+m4trace:configure.ac:835: -1- AC_DEFINE_TRACE_LITERAL([WCWIDTH_BROKEN])
+m4trace:configure.ac:835: -1- m4_pattern_allow([^WCWIDTH_BROKEN$])
+m4trace:configure.ac:835: -1- AH_OUTPUT([WCWIDTH_BROKEN], [/* wcwidth is usually not broken */
 @%:@undef WCWIDTH_BROKEN])
-m4trace:configure.ac:829: -1- AH_OUTPUT([HAVE_LOCALE_CHARSET], [/* Define to 1 if you have the `locale_charset\' function. */
+m4trace:configure.ac:835: -1- AH_OUTPUT([HAVE_LOCALE_CHARSET], [/* Define to 1 if you have the `locale_charset\' function. */
 @%:@undef HAVE_LOCALE_CHARSET])
-m4trace:configure.ac:829: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LOCALE_CHARSET])
-m4trace:configure.ac:829: -1- m4_pattern_allow([^HAVE_LOCALE_CHARSET$])
-m4trace:configure.ac:833: -1- AH_OUTPUT([HAVE_LIBDL], [/* Define to 1 if you have the `dl\' library (-ldl). */
+m4trace:configure.ac:835: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LOCALE_CHARSET])
+m4trace:configure.ac:835: -1- m4_pattern_allow([^HAVE_LOCALE_CHARSET$])
+m4trace:configure.ac:839: -1- AH_OUTPUT([HAVE_LIBDL], [/* Define to 1 if you have the `dl\' library (-ldl). */
 @%:@undef HAVE_LIBDL])
-m4trace:configure.ac:833: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBDL])
-m4trace:configure.ac:833: -1- m4_pattern_allow([^HAVE_LIBDL$])
-m4trace:configure.ac:834: -1- AH_OUTPUT([HAVE_DLOPEN], [/* Define to 1 if you have the `dlopen\' function. */
+m4trace:configure.ac:839: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBDL])
+m4trace:configure.ac:839: -1- m4_pattern_allow([^HAVE_LIBDL$])
+m4trace:configure.ac:840: -1- AH_OUTPUT([HAVE_DLOPEN], [/* Define to 1 if you have the `dlopen\' function. */
 @%:@undef HAVE_DLOPEN])
-m4trace:configure.ac:834: -1- AH_OUTPUT([HAVE_DLCLOSE], [/* Define to 1 if you have the `dlclose\' function. */
+m4trace:configure.ac:840: -1- AH_OUTPUT([HAVE_DLCLOSE], [/* Define to 1 if you have the `dlclose\' function. */
 @%:@undef HAVE_DLCLOSE])
-m4trace:configure.ac:834: -1- AH_OUTPUT([HAVE_DLSYM], [/* Define to 1 if you have the `dlsym\' function. */
+m4trace:configure.ac:840: -1- AH_OUTPUT([HAVE_DLSYM], [/* Define to 1 if you have the `dlsym\' function. */
 @%:@undef HAVE_DLSYM])
-m4trace:configure.ac:838: -1- _m4_warn([obsolete], [The macro `AC_DECL_SYS_SIGLIST' is obsolete.
+m4trace:configure.ac:844: -1- _m4_warn([obsolete], [The macro `AC_DECL_SYS_SIGLIST' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/specific.m4:41: AC_DECL_SYS_SIGLIST is expanded from...
-configure.ac:838: the top level])
-m4trace:configure.ac:838: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_SYS_SIGLIST])
-m4trace:configure.ac:838: -1- m4_pattern_allow([^HAVE_DECL_SYS_SIGLIST$])
-m4trace:configure.ac:838: -1- AH_OUTPUT([HAVE_DECL_SYS_SIGLIST], [/* Define to 1 if you have the declaration of `sys_siglist\', and to 0 if you
+configure.ac:844: the top level])
+m4trace:configure.ac:844: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_SYS_SIGLIST])
+m4trace:configure.ac:844: -1- m4_pattern_allow([^HAVE_DECL_SYS_SIGLIST$])
+m4trace:configure.ac:844: -1- AH_OUTPUT([HAVE_DECL_SYS_SIGLIST], [/* Define to 1 if you have the declaration of `sys_siglist\', and to 0 if you
    don\'t. */
 @%:@undef HAVE_DECL_SYS_SIGLIST])
-m4trace:configure.ac:842: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+m4trace:configure.ac:848: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
 aclocal.m4:563: BASH_FUNC_INET_ATON is expanded from...
-configure.ac:842: the top level])
-m4trace:configure.ac:842: -1- AC_DEFINE_TRACE_LITERAL([HAVE_INET_ATON])
-m4trace:configure.ac:842: -1- m4_pattern_allow([^HAVE_INET_ATON$])
-m4trace:configure.ac:842: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS inet_aton.$ac_objext"])
-m4trace:configure.ac:842: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
-m4trace:configure.ac:842: -1- m4_pattern_allow([^LIB@&t@OBJS$])
-m4trace:configure.ac:842: -1- AC_LIBSOURCE([inet_aton.c])
-m4trace:configure.ac:848: -1- AH_OUTPUT([HAVE_LIBSUN], [/* Define to 1 if you have the `sun\' library (-lsun). */
+configure.ac:848: the top level])
+m4trace:configure.ac:848: -1- AC_DEFINE_TRACE_LITERAL([HAVE_INET_ATON])
+m4trace:configure.ac:848: -1- m4_pattern_allow([^HAVE_INET_ATON$])
+m4trace:configure.ac:848: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS inet_aton.$ac_objext"])
+m4trace:configure.ac:848: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:848: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:848: -1- AC_LIBSOURCE([inet_aton.c])
+m4trace:configure.ac:854: -1- AH_OUTPUT([HAVE_LIBSUN], [/* Define to 1 if you have the `sun\' library (-lsun). */
 @%:@undef HAVE_LIBSUN])
-m4trace:configure.ac:848: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBSUN])
-m4trace:configure.ac:848: -1- m4_pattern_allow([^HAVE_LIBSUN$])
-m4trace:configure.ac:853: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBSOCKET])
-m4trace:configure.ac:853: -1- m4_pattern_allow([^HAVE_LIBSOCKET$])
-m4trace:configure.ac:853: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GETPEERNAME])
-m4trace:configure.ac:853: -1- m4_pattern_allow([^HAVE_GETPEERNAME$])
-m4trace:configure.ac:857: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+m4trace:configure.ac:854: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBSUN])
+m4trace:configure.ac:854: -1- m4_pattern_allow([^HAVE_LIBSUN$])
+m4trace:configure.ac:859: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBSOCKET])
+m4trace:configure.ac:859: -1- m4_pattern_allow([^HAVE_LIBSOCKET$])
+m4trace:configure.ac:859: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GETPEERNAME])
+m4trace:configure.ac:859: -1- m4_pattern_allow([^HAVE_GETPEERNAME$])
+m4trace:configure.ac:863: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:732: BASH_FUNC_GETHOSTBYNAME is expanded from...
-configure.ac:857: the top level])
-m4trace:configure.ac:857: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GETHOSTBYNAME])
-m4trace:configure.ac:857: -1- m4_pattern_allow([^HAVE_GETHOSTBYNAME$])
-m4trace:configure.ac:861: -1- AC_DEFINE_TRACE_LITERAL([uid_t])
-m4trace:configure.ac:861: -1- m4_pattern_allow([^uid_t$])
-m4trace:configure.ac:861: -1- AH_OUTPUT([uid_t], [/* Define to `int\' if <sys/types.h> doesn\'t define. */
+configure.ac:863: the top level])
+m4trace:configure.ac:863: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GETHOSTBYNAME])
+m4trace:configure.ac:863: -1- m4_pattern_allow([^HAVE_GETHOSTBYNAME$])
+m4trace:configure.ac:867: -1- AC_DEFINE_TRACE_LITERAL([uid_t])
+m4trace:configure.ac:867: -1- m4_pattern_allow([^uid_t$])
+m4trace:configure.ac:867: -1- AH_OUTPUT([uid_t], [/* Define to `int\' if <sys/types.h> doesn\'t define. */
 @%:@undef uid_t])
-m4trace:configure.ac:861: -1- AC_DEFINE_TRACE_LITERAL([gid_t])
-m4trace:configure.ac:861: -1- m4_pattern_allow([^gid_t$])
-m4trace:configure.ac:861: -1- AH_OUTPUT([gid_t], [/* Define to `int\' if <sys/types.h> doesn\'t define. */
+m4trace:configure.ac:867: -1- AC_DEFINE_TRACE_LITERAL([gid_t])
+m4trace:configure.ac:867: -1- m4_pattern_allow([^gid_t$])
+m4trace:configure.ac:867: -1- AH_OUTPUT([gid_t], [/* Define to `int\' if <sys/types.h> doesn\'t define. */
 @%:@undef gid_t])
-m4trace:configure.ac:861: -1- AC_DEFINE_TRACE_LITERAL([GETGROUPS_T])
-m4trace:configure.ac:861: -1- m4_pattern_allow([^GETGROUPS_T$])
-m4trace:configure.ac:861: -1- AH_OUTPUT([GETGROUPS_T], [/* Define to the type of elements in the array set by `getgroups\'. Usually
+m4trace:configure.ac:867: -1- AC_DEFINE_TRACE_LITERAL([GETGROUPS_T])
+m4trace:configure.ac:867: -1- m4_pattern_allow([^GETGROUPS_T$])
+m4trace:configure.ac:867: -1- AH_OUTPUT([GETGROUPS_T], [/* Define to the type of elements in the array set by `getgroups\'. Usually
    this is either `int\' or `gid_t\'. */
 @%:@undef GETGROUPS_T])
-m4trace:configure.ac:862: -1- AC_DEFINE_TRACE_LITERAL([off_t])
-m4trace:configure.ac:862: -1- m4_pattern_allow([^off_t$])
-m4trace:configure.ac:862: -1- AH_OUTPUT([off_t], [/* Define to `long int\' if <sys/types.h> does not define. */
+m4trace:configure.ac:868: -1- AC_DEFINE_TRACE_LITERAL([off_t])
+m4trace:configure.ac:868: -1- m4_pattern_allow([^off_t$])
+m4trace:configure.ac:868: -1- AH_OUTPUT([off_t], [/* Define to `long int\' if <sys/types.h> does not define. */
 @%:@undef off_t])
-m4trace:configure.ac:863: -1- AC_DEFINE_TRACE_LITERAL([mode_t])
-m4trace:configure.ac:863: -1- m4_pattern_allow([^mode_t$])
-m4trace:configure.ac:863: -1- AH_OUTPUT([mode_t], [/* Define to `int\' if <sys/types.h> does not define. */
+m4trace:configure.ac:869: -1- AC_DEFINE_TRACE_LITERAL([mode_t])
+m4trace:configure.ac:869: -1- m4_pattern_allow([^mode_t$])
+m4trace:configure.ac:869: -1- AH_OUTPUT([mode_t], [/* Define to `int\' if <sys/types.h> does not define. */
 @%:@undef mode_t])
-m4trace:configure.ac:864: -1- AC_DEFINE_TRACE_LITERAL([uid_t])
-m4trace:configure.ac:864: -1- m4_pattern_allow([^uid_t$])
-m4trace:configure.ac:864: -1- AH_OUTPUT([uid_t], [/* Define to `int\' if <sys/types.h> doesn\'t define. */
+m4trace:configure.ac:870: -1- AC_DEFINE_TRACE_LITERAL([uid_t])
+m4trace:configure.ac:870: -1- m4_pattern_allow([^uid_t$])
+m4trace:configure.ac:870: -1- AH_OUTPUT([uid_t], [/* Define to `int\' if <sys/types.h> doesn\'t define. */
 @%:@undef uid_t])
-m4trace:configure.ac:864: -1- AC_DEFINE_TRACE_LITERAL([gid_t])
-m4trace:configure.ac:864: -1- m4_pattern_allow([^gid_t$])
-m4trace:configure.ac:864: -1- AH_OUTPUT([gid_t], [/* Define to `int\' if <sys/types.h> doesn\'t define. */
+m4trace:configure.ac:870: -1- AC_DEFINE_TRACE_LITERAL([gid_t])
+m4trace:configure.ac:870: -1- m4_pattern_allow([^gid_t$])
+m4trace:configure.ac:870: -1- AH_OUTPUT([gid_t], [/* Define to `int\' if <sys/types.h> doesn\'t define. */
 @%:@undef gid_t])
-m4trace:configure.ac:865: -1- AC_DEFINE_TRACE_LITERAL([pid_t])
-m4trace:configure.ac:865: -1- m4_pattern_allow([^pid_t$])
-m4trace:configure.ac:865: -1- AH_OUTPUT([pid_t], [/* Define to `int\' if <sys/types.h> does not define. */
+m4trace:configure.ac:871: -1- AC_DEFINE_TRACE_LITERAL([pid_t])
+m4trace:configure.ac:871: -1- m4_pattern_allow([^pid_t$])
+m4trace:configure.ac:871: -1- AH_OUTPUT([pid_t], [/* Define to `int\' if <sys/types.h> does not define. */
 @%:@undef pid_t])
-m4trace:configure.ac:866: -1- AC_DEFINE_TRACE_LITERAL([size_t])
-m4trace:configure.ac:866: -1- m4_pattern_allow([^size_t$])
-m4trace:configure.ac:866: -1- AH_OUTPUT([size_t], [/* Define to `unsigned int\' if <sys/types.h> does not define. */
+m4trace:configure.ac:872: -1- AC_DEFINE_TRACE_LITERAL([size_t])
+m4trace:configure.ac:872: -1- m4_pattern_allow([^size_t$])
+m4trace:configure.ac:872: -1- AH_OUTPUT([size_t], [/* Define to `unsigned int\' if <sys/types.h> does not define. */
 @%:@undef size_t])
-m4trace:configure.ac:867: -1- AC_DEFINE_TRACE_LITERAL([ssize_t])
-m4trace:configure.ac:867: -1- m4_pattern_allow([^ssize_t$])
-m4trace:configure.ac:867: -1- AH_OUTPUT([ssize_t], [/* Define to `int\' if <sys/types.h> does not define. */
+m4trace:configure.ac:873: -1- AC_DEFINE_TRACE_LITERAL([ssize_t])
+m4trace:configure.ac:873: -1- m4_pattern_allow([^ssize_t$])
+m4trace:configure.ac:873: -1- AH_OUTPUT([ssize_t], [/* Define to `int\' if <sys/types.h> does not define. */
 @%:@undef ssize_t])
-m4trace:configure.ac:868: -1- AC_DEFINE_TRACE_LITERAL([time_t])
-m4trace:configure.ac:868: -1- m4_pattern_allow([^time_t$])
-m4trace:configure.ac:868: -1- AH_OUTPUT([time_t], [/* Define to `long\' if <sys/types.h> does not define. */
+m4trace:configure.ac:874: -1- AC_DEFINE_TRACE_LITERAL([time_t])
+m4trace:configure.ac:874: -1- m4_pattern_allow([^time_t$])
+m4trace:configure.ac:874: -1- AH_OUTPUT([time_t], [/* Define to `long\' if <sys/types.h> does not define. */
 @%:@undef time_t])
-m4trace:configure.ac:870: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+m4trace:configure.ac:876: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
 aclocal.m4:472: BASH_TYPE_LONG_LONG is expanded from...
-configure.ac:870: the top level])
-m4trace:configure.ac:870: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LONG_LONG])
-m4trace:configure.ac:870: -1- m4_pattern_allow([^HAVE_LONG_LONG$])
-m4trace:configure.ac:871: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+configure.ac:876: the top level])
+m4trace:configure.ac:876: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LONG_LONG])
+m4trace:configure.ac:876: -1- m4_pattern_allow([^HAVE_LONG_LONG$])
+m4trace:configure.ac:877: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
 aclocal.m4:486: BASH_TYPE_UNSIGNED_LONG_LONG is expanded from...
-configure.ac:871: the top level])
-m4trace:configure.ac:871: -1- AC_DEFINE_TRACE_LITERAL([HAVE_UNSIGNED_LONG_LONG])
-m4trace:configure.ac:871: -1- m4_pattern_allow([^HAVE_UNSIGNED_LONG_LONG$])
-m4trace:configure.ac:873: -1- _m4_warn([obsolete], [The macro `AC_TYPE_SIGNAL' is obsolete.
+configure.ac:877: the top level])
+m4trace:configure.ac:877: -1- AC_DEFINE_TRACE_LITERAL([HAVE_UNSIGNED_LONG_LONG])
+m4trace:configure.ac:877: -1- m4_pattern_allow([^HAVE_UNSIGNED_LONG_LONG$])
+m4trace:configure.ac:879: -1- _m4_warn([obsolete], [The macro `AC_TYPE_SIGNAL' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/types.m4:738: AC_TYPE_SIGNAL is expanded from...
-configure.ac:873: the top level])
-m4trace:configure.ac:873: -1- AC_DEFINE_TRACE_LITERAL([RETSIGTYPE])
-m4trace:configure.ac:873: -1- m4_pattern_allow([^RETSIGTYPE$])
-m4trace:configure.ac:873: -1- AH_OUTPUT([RETSIGTYPE], [/* Define as the return type of signal handlers (`int\' or `void\'). */
+configure.ac:879: the top level])
+m4trace:configure.ac:879: -1- AC_DEFINE_TRACE_LITERAL([RETSIGTYPE])
+m4trace:configure.ac:879: -1- m4_pattern_allow([^RETSIGTYPE$])
+m4trace:configure.ac:879: -1- AH_OUTPUT([RETSIGTYPE], [/* Define as the return type of signal handlers (`int\' or `void\'). */
 @%:@undef RETSIGTYPE])
-m4trace:configure.ac:874: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+m4trace:configure.ac:880: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
 aclocal.m4:537: BASH_TYPE_SIG_ATOMIC_T is expanded from...
-configure.ac:874: the top level])
-m4trace:configure.ac:874: -1- AC_DEFINE_TRACE_LITERAL([sig_atomic_t])
-m4trace:configure.ac:874: -1- m4_pattern_allow([^sig_atomic_t$])
-m4trace:configure.ac:874: -1- AH_OUTPUT([sig_atomic_t], [/* Define to `int\' if <sys/types.h> does not define. */
+configure.ac:880: the top level])
+m4trace:configure.ac:880: -1- AC_DEFINE_TRACE_LITERAL([sig_atomic_t])
+m4trace:configure.ac:880: -1- m4_pattern_allow([^sig_atomic_t$])
+m4trace:configure.ac:880: -1- AH_OUTPUT([sig_atomic_t], [/* Define to `int\' if <sys/types.h> does not define. */
 @%:@undef sig_atomic_t])
-m4trace:configure.ac:876: -1- AC_DEFINE_TRACE_LITERAL([SIZEOF_CHAR])
-m4trace:configure.ac:876: -1- m4_pattern_allow([^SIZEOF_CHAR$])
-m4trace:configure.ac:876: -1- AH_OUTPUT([SIZEOF_CHAR], [/* The size of `char\', as computed by sizeof. */
+m4trace:configure.ac:882: -1- AC_DEFINE_TRACE_LITERAL([SIZEOF_CHAR])
+m4trace:configure.ac:882: -1- m4_pattern_allow([^SIZEOF_CHAR$])
+m4trace:configure.ac:882: -1- AH_OUTPUT([SIZEOF_CHAR], [/* The size of `char\', as computed by sizeof. */
 @%:@undef SIZEOF_CHAR])
-m4trace:configure.ac:877: -1- AC_DEFINE_TRACE_LITERAL([SIZEOF_SHORT])
-m4trace:configure.ac:877: -1- m4_pattern_allow([^SIZEOF_SHORT$])
-m4trace:configure.ac:877: -1- AH_OUTPUT([SIZEOF_SHORT], [/* The size of `short\', as computed by sizeof. */
+m4trace:configure.ac:883: -1- AC_DEFINE_TRACE_LITERAL([SIZEOF_SHORT])
+m4trace:configure.ac:883: -1- m4_pattern_allow([^SIZEOF_SHORT$])
+m4trace:configure.ac:883: -1- AH_OUTPUT([SIZEOF_SHORT], [/* The size of `short\', as computed by sizeof. */
 @%:@undef SIZEOF_SHORT])
-m4trace:configure.ac:878: -1- AC_DEFINE_TRACE_LITERAL([SIZEOF_INT])
-m4trace:configure.ac:878: -1- m4_pattern_allow([^SIZEOF_INT$])
-m4trace:configure.ac:878: -1- AH_OUTPUT([SIZEOF_INT], [/* The size of `int\', as computed by sizeof. */
+m4trace:configure.ac:884: -1- AC_DEFINE_TRACE_LITERAL([SIZEOF_INT])
+m4trace:configure.ac:884: -1- m4_pattern_allow([^SIZEOF_INT$])
+m4trace:configure.ac:884: -1- AH_OUTPUT([SIZEOF_INT], [/* The size of `int\', as computed by sizeof. */
 @%:@undef SIZEOF_INT])
-m4trace:configure.ac:879: -1- AC_DEFINE_TRACE_LITERAL([SIZEOF_LONG])
-m4trace:configure.ac:879: -1- m4_pattern_allow([^SIZEOF_LONG$])
-m4trace:configure.ac:879: -1- AH_OUTPUT([SIZEOF_LONG], [/* The size of `long\', as computed by sizeof. */
+m4trace:configure.ac:885: -1- AC_DEFINE_TRACE_LITERAL([SIZEOF_LONG])
+m4trace:configure.ac:885: -1- m4_pattern_allow([^SIZEOF_LONG$])
+m4trace:configure.ac:885: -1- AH_OUTPUT([SIZEOF_LONG], [/* The size of `long\', as computed by sizeof. */
 @%:@undef SIZEOF_LONG])
-m4trace:configure.ac:880: -1- AC_DEFINE_TRACE_LITERAL([SIZEOF_CHAR_P])
-m4trace:configure.ac:880: -1- m4_pattern_allow([^SIZEOF_CHAR_P$])
-m4trace:configure.ac:880: -1- AH_OUTPUT([SIZEOF_CHAR_P], [/* The size of `char *\', as computed by sizeof. */
+m4trace:configure.ac:886: -1- AC_DEFINE_TRACE_LITERAL([SIZEOF_CHAR_P])
+m4trace:configure.ac:886: -1- m4_pattern_allow([^SIZEOF_CHAR_P$])
+m4trace:configure.ac:886: -1- AH_OUTPUT([SIZEOF_CHAR_P], [/* The size of `char *\', as computed by sizeof. */
 @%:@undef SIZEOF_CHAR_P])
-m4trace:configure.ac:881: -1- AC_DEFINE_TRACE_LITERAL([SIZEOF_DOUBLE])
-m4trace:configure.ac:881: -1- m4_pattern_allow([^SIZEOF_DOUBLE$])
-m4trace:configure.ac:881: -1- AH_OUTPUT([SIZEOF_DOUBLE], [/* The size of `double\', as computed by sizeof. */
+m4trace:configure.ac:887: -1- AC_DEFINE_TRACE_LITERAL([SIZEOF_DOUBLE])
+m4trace:configure.ac:887: -1- m4_pattern_allow([^SIZEOF_DOUBLE$])
+m4trace:configure.ac:887: -1- AH_OUTPUT([SIZEOF_DOUBLE], [/* The size of `double\', as computed by sizeof. */
 @%:@undef SIZEOF_DOUBLE])
-m4trace:configure.ac:882: -1- AC_DEFINE_TRACE_LITERAL([SIZEOF_LONG_LONG])
-m4trace:configure.ac:882: -1- m4_pattern_allow([^SIZEOF_LONG_LONG$])
-m4trace:configure.ac:882: -1- AH_OUTPUT([SIZEOF_LONG_LONG], [/* The size of `long long\', as computed by sizeof. */
+m4trace:configure.ac:888: -1- AC_DEFINE_TRACE_LITERAL([SIZEOF_LONG_LONG])
+m4trace:configure.ac:888: -1- m4_pattern_allow([^SIZEOF_LONG_LONG$])
+m4trace:configure.ac:888: -1- AH_OUTPUT([SIZEOF_LONG_LONG], [/* The size of `long long\', as computed by sizeof. */
 @%:@undef SIZEOF_LONG_LONG])
-m4trace:configure.ac:884: -1- AC_DEFINE_TRACE_LITERAL([u_int])
-m4trace:configure.ac:884: -1- m4_pattern_allow([^u_int$])
-m4trace:configure.ac:884: -1- AH_OUTPUT([u_int], [/* Define to `unsigned int\' if <sys/types.h> does not define. */
+m4trace:configure.ac:890: -1- AC_DEFINE_TRACE_LITERAL([u_int])
+m4trace:configure.ac:890: -1- m4_pattern_allow([^u_int$])
+m4trace:configure.ac:890: -1- AH_OUTPUT([u_int], [/* Define to `unsigned int\' if <sys/types.h> does not define. */
 @%:@undef u_int])
-m4trace:configure.ac:885: -1- AC_DEFINE_TRACE_LITERAL([u_long])
-m4trace:configure.ac:885: -1- m4_pattern_allow([^u_long$])
-m4trace:configure.ac:885: -1- AH_OUTPUT([u_long], [/* Define to `unsigned long\' if <sys/types.h> does not define. */
+m4trace:configure.ac:891: -1- AC_DEFINE_TRACE_LITERAL([u_long])
+m4trace:configure.ac:891: -1- m4_pattern_allow([^u_long$])
+m4trace:configure.ac:891: -1- AH_OUTPUT([u_long], [/* Define to `unsigned long\' if <sys/types.h> does not define. */
 @%:@undef u_long])
-m4trace:configure.ac:887: -1- AC_DEFINE_TRACE_LITERAL([bits16_t])
-m4trace:configure.ac:887: -1- m4_pattern_allow([^bits16_t$])
-m4trace:configure.ac:887: -1- AH_OUTPUT([bits16_t], [/* Define to `short\' if <sys/types.h> does not define. */
+m4trace:configure.ac:893: -1- AC_DEFINE_TRACE_LITERAL([bits16_t])
+m4trace:configure.ac:893: -1- m4_pattern_allow([^bits16_t$])
+m4trace:configure.ac:893: -1- AH_OUTPUT([bits16_t], [/* Define to `short\' if <sys/types.h> does not define. */
 @%:@undef bits16_t])
-m4trace:configure.ac:887: -1- AC_DEFINE_TRACE_LITERAL([bits16_t])
-m4trace:configure.ac:887: -1- m4_pattern_allow([^bits16_t$])
-m4trace:configure.ac:887: -1- AH_OUTPUT([bits16_t], [/* Define to `char\' if <sys/types.h> does not define. */
+m4trace:configure.ac:893: -1- AC_DEFINE_TRACE_LITERAL([bits16_t])
+m4trace:configure.ac:893: -1- m4_pattern_allow([^bits16_t$])
+m4trace:configure.ac:893: -1- AH_OUTPUT([bits16_t], [/* Define to `char\' if <sys/types.h> does not define. */
 @%:@undef bits16_t])
-m4trace:configure.ac:887: -1- AC_DEFINE_TRACE_LITERAL([bits16_t])
-m4trace:configure.ac:887: -1- m4_pattern_allow([^bits16_t$])
-m4trace:configure.ac:887: -1- AH_OUTPUT([bits16_t], [/* Define to `short\' if <sys/types.h> does not define. */
+m4trace:configure.ac:893: -1- AC_DEFINE_TRACE_LITERAL([bits16_t])
+m4trace:configure.ac:893: -1- m4_pattern_allow([^bits16_t$])
+m4trace:configure.ac:893: -1- AH_OUTPUT([bits16_t], [/* Define to `short\' if <sys/types.h> does not define. */
 @%:@undef bits16_t])
-m4trace:configure.ac:888: -1- AC_DEFINE_TRACE_LITERAL([u_bits16_t])
-m4trace:configure.ac:888: -1- m4_pattern_allow([^u_bits16_t$])
-m4trace:configure.ac:888: -1- AH_OUTPUT([u_bits16_t], [/* Define to `unsigned short\' if <sys/types.h> does not define. */
+m4trace:configure.ac:894: -1- AC_DEFINE_TRACE_LITERAL([u_bits16_t])
+m4trace:configure.ac:894: -1- m4_pattern_allow([^u_bits16_t$])
+m4trace:configure.ac:894: -1- AH_OUTPUT([u_bits16_t], [/* Define to `unsigned short\' if <sys/types.h> does not define. */
 @%:@undef u_bits16_t])
-m4trace:configure.ac:888: -1- AC_DEFINE_TRACE_LITERAL([u_bits16_t])
-m4trace:configure.ac:888: -1- m4_pattern_allow([^u_bits16_t$])
-m4trace:configure.ac:888: -1- AH_OUTPUT([u_bits16_t], [/* Define to `unsigned char\' if <sys/types.h> does not define. */
+m4trace:configure.ac:894: -1- AC_DEFINE_TRACE_LITERAL([u_bits16_t])
+m4trace:configure.ac:894: -1- m4_pattern_allow([^u_bits16_t$])
+m4trace:configure.ac:894: -1- AH_OUTPUT([u_bits16_t], [/* Define to `unsigned char\' if <sys/types.h> does not define. */
 @%:@undef u_bits16_t])
-m4trace:configure.ac:888: -1- AC_DEFINE_TRACE_LITERAL([u_bits16_t])
-m4trace:configure.ac:888: -1- m4_pattern_allow([^u_bits16_t$])
-m4trace:configure.ac:888: -1- AH_OUTPUT([u_bits16_t], [/* Define to `unsigned short\' if <sys/types.h> does not define. */
+m4trace:configure.ac:894: -1- AC_DEFINE_TRACE_LITERAL([u_bits16_t])
+m4trace:configure.ac:894: -1- m4_pattern_allow([^u_bits16_t$])
+m4trace:configure.ac:894: -1- AH_OUTPUT([u_bits16_t], [/* Define to `unsigned short\' if <sys/types.h> does not define. */
 @%:@undef u_bits16_t])
-m4trace:configure.ac:889: -1- AC_DEFINE_TRACE_LITERAL([bits32_t])
-m4trace:configure.ac:889: -1- m4_pattern_allow([^bits32_t$])
-m4trace:configure.ac:889: -1- AH_OUTPUT([bits32_t], [/* Define to `int\' if <sys/types.h> does not define. */
+m4trace:configure.ac:895: -1- AC_DEFINE_TRACE_LITERAL([bits32_t])
+m4trace:configure.ac:895: -1- m4_pattern_allow([^bits32_t$])
+m4trace:configure.ac:895: -1- AH_OUTPUT([bits32_t], [/* Define to `int\' if <sys/types.h> does not define. */
 @%:@undef bits32_t])
-m4trace:configure.ac:889: -1- AC_DEFINE_TRACE_LITERAL([bits32_t])
-m4trace:configure.ac:889: -1- m4_pattern_allow([^bits32_t$])
-m4trace:configure.ac:889: -1- AH_OUTPUT([bits32_t], [/* Define to `long\' if <sys/types.h> does not define. */
+m4trace:configure.ac:895: -1- AC_DEFINE_TRACE_LITERAL([bits32_t])
+m4trace:configure.ac:895: -1- m4_pattern_allow([^bits32_t$])
+m4trace:configure.ac:895: -1- AH_OUTPUT([bits32_t], [/* Define to `long\' if <sys/types.h> does not define. */
 @%:@undef bits32_t])
-m4trace:configure.ac:889: -1- AC_DEFINE_TRACE_LITERAL([bits32_t])
-m4trace:configure.ac:889: -1- m4_pattern_allow([^bits32_t$])
-m4trace:configure.ac:889: -1- AH_OUTPUT([bits32_t], [/* Define to `int\' if <sys/types.h> does not define. */
+m4trace:configure.ac:895: -1- AC_DEFINE_TRACE_LITERAL([bits32_t])
+m4trace:configure.ac:895: -1- m4_pattern_allow([^bits32_t$])
+m4trace:configure.ac:895: -1- AH_OUTPUT([bits32_t], [/* Define to `int\' if <sys/types.h> does not define. */
 @%:@undef bits32_t])
-m4trace:configure.ac:890: -1- AC_DEFINE_TRACE_LITERAL([u_bits32_t])
-m4trace:configure.ac:890: -1- m4_pattern_allow([^u_bits32_t$])
-m4trace:configure.ac:890: -1- AH_OUTPUT([u_bits32_t], [/* Define to `unsigned int\' if <sys/types.h> does not define. */
+m4trace:configure.ac:896: -1- AC_DEFINE_TRACE_LITERAL([u_bits32_t])
+m4trace:configure.ac:896: -1- m4_pattern_allow([^u_bits32_t$])
+m4trace:configure.ac:896: -1- AH_OUTPUT([u_bits32_t], [/* Define to `unsigned int\' if <sys/types.h> does not define. */
 @%:@undef u_bits32_t])
-m4trace:configure.ac:890: -1- AC_DEFINE_TRACE_LITERAL([u_bits32_t])
-m4trace:configure.ac:890: -1- m4_pattern_allow([^u_bits32_t$])
-m4trace:configure.ac:890: -1- AH_OUTPUT([u_bits32_t], [/* Define to `unsigned long\' if <sys/types.h> does not define. */
+m4trace:configure.ac:896: -1- AC_DEFINE_TRACE_LITERAL([u_bits32_t])
+m4trace:configure.ac:896: -1- m4_pattern_allow([^u_bits32_t$])
+m4trace:configure.ac:896: -1- AH_OUTPUT([u_bits32_t], [/* Define to `unsigned long\' if <sys/types.h> does not define. */
 @%:@undef u_bits32_t])
-m4trace:configure.ac:890: -1- AC_DEFINE_TRACE_LITERAL([u_bits32_t])
-m4trace:configure.ac:890: -1- m4_pattern_allow([^u_bits32_t$])
-m4trace:configure.ac:890: -1- AH_OUTPUT([u_bits32_t], [/* Define to `unsigned int\' if <sys/types.h> does not define. */
+m4trace:configure.ac:896: -1- AC_DEFINE_TRACE_LITERAL([u_bits32_t])
+m4trace:configure.ac:896: -1- m4_pattern_allow([^u_bits32_t$])
+m4trace:configure.ac:896: -1- AH_OUTPUT([u_bits32_t], [/* Define to `unsigned int\' if <sys/types.h> does not define. */
 @%:@undef u_bits32_t])
-m4trace:configure.ac:891: -1- AC_DEFINE_TRACE_LITERAL([bits64_t])
-m4trace:configure.ac:891: -1- m4_pattern_allow([^bits64_t$])
-m4trace:configure.ac:891: -1- AH_OUTPUT([bits64_t], [/* Define to `char *\' if <sys/types.h> does not define. */
+m4trace:configure.ac:897: -1- AC_DEFINE_TRACE_LITERAL([bits64_t])
+m4trace:configure.ac:897: -1- m4_pattern_allow([^bits64_t$])
+m4trace:configure.ac:897: -1- AH_OUTPUT([bits64_t], [/* Define to `char *\' if <sys/types.h> does not define. */
 @%:@undef bits64_t])
-m4trace:configure.ac:891: -1- AC_DEFINE_TRACE_LITERAL([bits64_t])
-m4trace:configure.ac:891: -1- m4_pattern_allow([^bits64_t$])
-m4trace:configure.ac:891: -1- AH_OUTPUT([bits64_t], [/* Define to `double\' if <sys/types.h> does not define. */
+m4trace:configure.ac:897: -1- AC_DEFINE_TRACE_LITERAL([bits64_t])
+m4trace:configure.ac:897: -1- m4_pattern_allow([^bits64_t$])
+m4trace:configure.ac:897: -1- AH_OUTPUT([bits64_t], [/* Define to `double\' if <sys/types.h> does not define. */
 @%:@undef bits64_t])
-m4trace:configure.ac:891: -1- AC_DEFINE_TRACE_LITERAL([bits64_t])
-m4trace:configure.ac:891: -1- m4_pattern_allow([^bits64_t$])
-m4trace:configure.ac:891: -1- AH_OUTPUT([bits64_t], [/* Define to `long long\' if <sys/types.h> does not define. */
+m4trace:configure.ac:897: -1- AC_DEFINE_TRACE_LITERAL([bits64_t])
+m4trace:configure.ac:897: -1- m4_pattern_allow([^bits64_t$])
+m4trace:configure.ac:897: -1- AH_OUTPUT([bits64_t], [/* Define to `long long\' if <sys/types.h> does not define. */
 @%:@undef bits64_t])
-m4trace:configure.ac:891: -1- AC_DEFINE_TRACE_LITERAL([bits64_t])
-m4trace:configure.ac:891: -1- m4_pattern_allow([^bits64_t$])
-m4trace:configure.ac:891: -1- AH_OUTPUT([bits64_t], [/* Define to `long\' if <sys/types.h> does not define. */
+m4trace:configure.ac:897: -1- AC_DEFINE_TRACE_LITERAL([bits64_t])
+m4trace:configure.ac:897: -1- m4_pattern_allow([^bits64_t$])
+m4trace:configure.ac:897: -1- AH_OUTPUT([bits64_t], [/* Define to `long\' if <sys/types.h> does not define. */
 @%:@undef bits64_t])
-m4trace:configure.ac:891: -1- AC_DEFINE_TRACE_LITERAL([bits64_t])
-m4trace:configure.ac:891: -1- m4_pattern_allow([^bits64_t$])
-m4trace:configure.ac:891: -1- AH_OUTPUT([bits64_t], [/* Define to `double\' if <sys/types.h> does not define. */
+m4trace:configure.ac:897: -1- AC_DEFINE_TRACE_LITERAL([bits64_t])
+m4trace:configure.ac:897: -1- m4_pattern_allow([^bits64_t$])
+m4trace:configure.ac:897: -1- AH_OUTPUT([bits64_t], [/* Define to `double\' if <sys/types.h> does not define. */
 @%:@undef bits64_t])
-m4trace:configure.ac:893: -1- AC_DEFINE_TRACE_LITERAL([ptrdiff_t])
-m4trace:configure.ac:893: -1- m4_pattern_allow([^ptrdiff_t$])
-m4trace:configure.ac:893: -1- AH_OUTPUT([ptrdiff_t], [/* Define to `int\' if <sys/types.h> does not define. */
+m4trace:configure.ac:899: -1- AC_DEFINE_TRACE_LITERAL([ptrdiff_t])
+m4trace:configure.ac:899: -1- m4_pattern_allow([^ptrdiff_t$])
+m4trace:configure.ac:899: -1- AH_OUTPUT([ptrdiff_t], [/* Define to `int\' if <sys/types.h> does not define. */
 @%:@undef ptrdiff_t])
-m4trace:configure.ac:893: -1- AC_DEFINE_TRACE_LITERAL([ptrdiff_t])
-m4trace:configure.ac:893: -1- m4_pattern_allow([^ptrdiff_t$])
-m4trace:configure.ac:893: -1- AH_OUTPUT([ptrdiff_t], [/* Define to `long\' if <sys/types.h> does not define. */
+m4trace:configure.ac:899: -1- AC_DEFINE_TRACE_LITERAL([ptrdiff_t])
+m4trace:configure.ac:899: -1- m4_pattern_allow([^ptrdiff_t$])
+m4trace:configure.ac:899: -1- AH_OUTPUT([ptrdiff_t], [/* Define to `long\' if <sys/types.h> does not define. */
 @%:@undef ptrdiff_t])
-m4trace:configure.ac:893: -1- AC_DEFINE_TRACE_LITERAL([ptrdiff_t])
-m4trace:configure.ac:893: -1- m4_pattern_allow([^ptrdiff_t$])
-m4trace:configure.ac:893: -1- AH_OUTPUT([ptrdiff_t], [/* Define to `long long\' if <sys/types.h> does not define. */
+m4trace:configure.ac:899: -1- AC_DEFINE_TRACE_LITERAL([ptrdiff_t])
+m4trace:configure.ac:899: -1- m4_pattern_allow([^ptrdiff_t$])
+m4trace:configure.ac:899: -1- AH_OUTPUT([ptrdiff_t], [/* Define to `long long\' if <sys/types.h> does not define. */
 @%:@undef ptrdiff_t])
-m4trace:configure.ac:893: -1- AC_DEFINE_TRACE_LITERAL([ptrdiff_t])
-m4trace:configure.ac:893: -1- m4_pattern_allow([^ptrdiff_t$])
-m4trace:configure.ac:893: -1- AH_OUTPUT([ptrdiff_t], [/* Define to `int\' if <sys/types.h> does not define. */
+m4trace:configure.ac:899: -1- AC_DEFINE_TRACE_LITERAL([ptrdiff_t])
+m4trace:configure.ac:899: -1- m4_pattern_allow([^ptrdiff_t$])
+m4trace:configure.ac:899: -1- AH_OUTPUT([ptrdiff_t], [/* Define to `int\' if <sys/types.h> does not define. */
 @%:@undef ptrdiff_t])
-m4trace:configure.ac:896: -1- AC_DEFINE_TRACE_LITERAL([STAT_MACROS_BROKEN])
-m4trace:configure.ac:896: -1- m4_pattern_allow([^STAT_MACROS_BROKEN$])
-m4trace:configure.ac:896: -1- AH_OUTPUT([STAT_MACROS_BROKEN], [/* Define to 1 if the `S_IS*\' macros in <sys/stat.h> do not work properly. */
+m4trace:configure.ac:902: -1- AC_DEFINE_TRACE_LITERAL([STAT_MACROS_BROKEN])
+m4trace:configure.ac:902: -1- m4_pattern_allow([^STAT_MACROS_BROKEN$])
+m4trace:configure.ac:902: -1- AH_OUTPUT([STAT_MACROS_BROKEN], [/* Define to 1 if the `S_IS*\' macros in <sys/stat.h> do not work properly. */
 @%:@undef STAT_MACROS_BROKEN])
-m4trace:configure.ac:901: -1- AC_DEFINE_TRACE_LITERAL([HAVE_HASH_BANG_EXEC])
-m4trace:configure.ac:901: -1- m4_pattern_allow([^HAVE_HASH_BANG_EXEC$])
-m4trace:configure.ac:906: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+m4trace:configure.ac:907: -1- AC_DEFINE_TRACE_LITERAL([HAVE_HASH_BANG_EXEC])
+m4trace:configure.ac:907: -1- m4_pattern_allow([^HAVE_HASH_BANG_EXEC$])
+m4trace:configure.ac:912: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
 aclocal.m4:549: BASH_FUNC_LSTAT is expanded from...
-configure.ac:906: the top level])
-m4trace:configure.ac:906: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LSTAT])
-m4trace:configure.ac:906: -1- m4_pattern_allow([^HAVE_LSTAT$])
-m4trace:configure.ac:910: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
+configure.ac:912: the top level])
+m4trace:configure.ac:912: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LSTAT])
+m4trace:configure.ac:912: -1- m4_pattern_allow([^HAVE_LSTAT$])
+m4trace:configure.ac:916: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:1920: BASH_FUNC_CTYPE_NONASCII is expanded from...
-configure.ac:910: the top level])
-m4trace:configure.ac:910: -1- AC_DEFINE_TRACE_LITERAL([CTYPE_NON_ASCII])
-m4trace:configure.ac:910: -1- m4_pattern_allow([^CTYPE_NON_ASCII$])
-m4trace:configure.ac:911: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
+configure.ac:916: the top level])
+m4trace:configure.ac:916: -1- AC_DEFINE_TRACE_LITERAL([CTYPE_NON_ASCII])
+m4trace:configure.ac:916: -1- m4_pattern_allow([^CTYPE_NON_ASCII$])
+m4trace:configure.ac:917: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:270: BASH_FUNC_DUP2_CLOEXEC_CHECK is expanded from...
-configure.ac:911: the top level])
-m4trace:configure.ac:911: -1- AC_DEFINE_TRACE_LITERAL([DUP2_BROKEN])
-m4trace:configure.ac:911: -1- m4_pattern_allow([^DUP2_BROKEN$])
-m4trace:configure.ac:912: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
+configure.ac:917: the top level])
+m4trace:configure.ac:917: -1- AC_DEFINE_TRACE_LITERAL([DUP2_BROKEN])
+m4trace:configure.ac:917: -1- m4_pattern_allow([^DUP2_BROKEN$])
+m4trace:configure.ac:918: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:1235: BASH_SYS_PGRP_SYNC is expanded from...
-configure.ac:912: the top level])
-m4trace:configure.ac:912: -1- AC_DEFINE_TRACE_LITERAL([PGRP_PIPE])
-m4trace:configure.ac:912: -1- m4_pattern_allow([^PGRP_PIPE$])
-m4trace:configure.ac:913: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+configure.ac:918: the top level])
+m4trace:configure.ac:918: -1- AC_DEFINE_TRACE_LITERAL([PGRP_PIPE])
+m4trace:configure.ac:918: -1- m4_pattern_allow([^PGRP_PIPE$])
+m4trace:configure.ac:919: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:1195: BASH_SYS_SIGNAL_VINTAGE is expanded from...
-configure.ac:913: the top level])
-m4trace:configure.ac:913: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+configure.ac:919: the top level])
+m4trace:configure.ac:919: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2662: _AC_LINK_IFELSE is expanded from...
@@ -2183,8 +2188,8 @@ You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:1195: BASH_SYS_SIGNAL_VINTAGE is expanded from...
-configure.ac:913: the top level])
-m4trace:configure.ac:913: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+configure.ac:919: the top level])
+m4trace:configure.ac:919: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2662: _AC_LINK_IFELSE is expanded from...
@@ -2197,77 +2202,77 @@ You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:1195: BASH_SYS_SIGNAL_VINTAGE is expanded from...
-configure.ac:913: the top level])
-m4trace:configure.ac:913: -1- AC_DEFINE_TRACE_LITERAL([HAVE_POSIX_SIGNALS])
-m4trace:configure.ac:913: -1- m4_pattern_allow([^HAVE_POSIX_SIGNALS$])
-m4trace:configure.ac:913: -1- AC_DEFINE_TRACE_LITERAL([HAVE_BSD_SIGNALS])
-m4trace:configure.ac:913: -1- m4_pattern_allow([^HAVE_BSD_SIGNALS$])
-m4trace:configure.ac:913: -1- AC_DEFINE_TRACE_LITERAL([HAVE_USG_SIGHOLD])
-m4trace:configure.ac:913: -1- m4_pattern_allow([^HAVE_USG_SIGHOLD$])
-m4trace:configure.ac:916: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+configure.ac:919: the top level])
+m4trace:configure.ac:919: -1- AC_DEFINE_TRACE_LITERAL([HAVE_POSIX_SIGNALS])
+m4trace:configure.ac:919: -1- m4_pattern_allow([^HAVE_POSIX_SIGNALS$])
+m4trace:configure.ac:919: -1- AC_DEFINE_TRACE_LITERAL([HAVE_BSD_SIGNALS])
+m4trace:configure.ac:919: -1- m4_pattern_allow([^HAVE_BSD_SIGNALS$])
+m4trace:configure.ac:919: -1- AC_DEFINE_TRACE_LITERAL([HAVE_USG_SIGHOLD])
+m4trace:configure.ac:919: -1- m4_pattern_allow([^HAVE_USG_SIGHOLD$])
+m4trace:configure.ac:922: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:253: BASH_SYS_ERRLIST is expanded from...
-configure.ac:916: the top level])
-m4trace:configure.ac:916: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SYS_ERRLIST])
-m4trace:configure.ac:916: -1- m4_pattern_allow([^HAVE_SYS_ERRLIST$])
-m4trace:configure.ac:917: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
+configure.ac:922: the top level])
+m4trace:configure.ac:922: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SYS_ERRLIST])
+m4trace:configure.ac:922: -1- m4_pattern_allow([^HAVE_SYS_ERRLIST$])
+m4trace:configure.ac:923: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:211: BASH_SYS_SIGLIST is expanded from...
-configure.ac:917: the top level])
-m4trace:configure.ac:917: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SYS_SIGLIST])
-m4trace:configure.ac:917: -1- m4_pattern_allow([^HAVE_SYS_SIGLIST$])
-m4trace:configure.ac:918: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
+configure.ac:923: the top level])
+m4trace:configure.ac:923: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SYS_SIGLIST])
+m4trace:configure.ac:923: -1- m4_pattern_allow([^HAVE_SYS_SIGLIST$])
+m4trace:configure.ac:924: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:167: BASH_DECL_UNDER_SYS_SIGLIST is expanded from...
 aclocal.m4:184: BASH_UNDER_SYS_SIGLIST is expanded from...
-configure.ac:918: the top level])
-m4trace:configure.ac:918: -1- AC_DEFINE_TRACE_LITERAL([UNDER_SYS_SIGLIST_DECLARED])
-m4trace:configure.ac:918: -1- m4_pattern_allow([^UNDER_SYS_SIGLIST_DECLARED$])
-m4trace:configure.ac:918: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
+configure.ac:924: the top level])
+m4trace:configure.ac:924: -1- AC_DEFINE_TRACE_LITERAL([UNDER_SYS_SIGLIST_DECLARED])
+m4trace:configure.ac:924: -1- m4_pattern_allow([^UNDER_SYS_SIGLIST_DECLARED$])
+m4trace:configure.ac:924: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:184: BASH_UNDER_SYS_SIGLIST is expanded from...
-configure.ac:918: the top level])
-m4trace:configure.ac:918: -1- AC_DEFINE_TRACE_LITERAL([HAVE_UNDER_SYS_SIGLIST])
-m4trace:configure.ac:918: -1- m4_pattern_allow([^HAVE_UNDER_SYS_SIGLIST$])
-m4trace:configure.ac:921: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
+configure.ac:924: the top level])
+m4trace:configure.ac:924: -1- AC_DEFINE_TRACE_LITERAL([HAVE_UNDER_SYS_SIGLIST])
+m4trace:configure.ac:924: -1- m4_pattern_allow([^HAVE_UNDER_SYS_SIGLIST$])
+m4trace:configure.ac:927: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:366: BASH_TYPE_SIGHANDLER is expanded from...
-configure.ac:921: the top level])
-m4trace:configure.ac:921: -1- AC_DEFINE_TRACE_LITERAL([VOID_SIGHANDLER])
-m4trace:configure.ac:921: -1- m4_pattern_allow([^VOID_SIGHANDLER$])
-m4trace:configure.ac:922: -1- AC_DEFINE_TRACE_LITERAL([clock_t])
-m4trace:configure.ac:922: -1- m4_pattern_allow([^clock_t$])
-m4trace:configure.ac:923: -1- AC_DEFINE_TRACE_LITERAL([sigset_t])
-m4trace:configure.ac:923: -1- m4_pattern_allow([^sigset_t$])
-m4trace:configure.ac:924: -1- AC_DEFINE_TRACE_LITERAL([HAVE_QUAD_T])
-m4trace:configure.ac:924: -1- m4_pattern_allow([^HAVE_QUAD_T$])
-m4trace:configure.ac:924: -1- AC_DEFINE_TRACE_LITERAL([quad_t])
-m4trace:configure.ac:924: -1- m4_pattern_allow([^quad_t$])
-m4trace:configure.ac:925: -1- AC_DEFINE_TRACE_LITERAL([intmax_t])
-m4trace:configure.ac:925: -1- m4_pattern_allow([^intmax_t$])
-m4trace:configure.ac:926: -1- AC_DEFINE_TRACE_LITERAL([uintmax_t])
-m4trace:configure.ac:926: -1- m4_pattern_allow([^uintmax_t$])
-m4trace:configure.ac:928: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SOCKLEN_T])
-m4trace:configure.ac:928: -1- m4_pattern_allow([^HAVE_SOCKLEN_T$])
-m4trace:configure.ac:928: -1- AC_DEFINE_TRACE_LITERAL([socklen_t])
-m4trace:configure.ac:928: -1- m4_pattern_allow([^socklen_t$])
-m4trace:configure.ac:930: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
+configure.ac:927: the top level])
+m4trace:configure.ac:927: -1- AC_DEFINE_TRACE_LITERAL([VOID_SIGHANDLER])
+m4trace:configure.ac:927: -1- m4_pattern_allow([^VOID_SIGHANDLER$])
+m4trace:configure.ac:928: -1- AC_DEFINE_TRACE_LITERAL([clock_t])
+m4trace:configure.ac:928: -1- m4_pattern_allow([^clock_t$])
+m4trace:configure.ac:929: -1- AC_DEFINE_TRACE_LITERAL([sigset_t])
+m4trace:configure.ac:929: -1- m4_pattern_allow([^sigset_t$])
+m4trace:configure.ac:930: -1- AC_DEFINE_TRACE_LITERAL([HAVE_QUAD_T])
+m4trace:configure.ac:930: -1- m4_pattern_allow([^HAVE_QUAD_T$])
+m4trace:configure.ac:930: -1- AC_DEFINE_TRACE_LITERAL([quad_t])
+m4trace:configure.ac:930: -1- m4_pattern_allow([^quad_t$])
+m4trace:configure.ac:931: -1- AC_DEFINE_TRACE_LITERAL([intmax_t])
+m4trace:configure.ac:931: -1- m4_pattern_allow([^intmax_t$])
+m4trace:configure.ac:932: -1- AC_DEFINE_TRACE_LITERAL([uintmax_t])
+m4trace:configure.ac:932: -1- m4_pattern_allow([^uintmax_t$])
+m4trace:configure.ac:934: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SOCKLEN_T])
+m4trace:configure.ac:934: -1- m4_pattern_allow([^HAVE_SOCKLEN_T$])
+m4trace:configure.ac:934: -1- AC_DEFINE_TRACE_LITERAL([socklen_t])
+m4trace:configure.ac:934: -1- m4_pattern_allow([^socklen_t$])
+m4trace:configure.ac:936: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:507: BASH_TYPE_RLIMIT is expanded from...
-configure.ac:930: the top level])
-m4trace:configure.ac:930: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
+configure.ac:936: the top level])
+m4trace:configure.ac:936: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2591: _AC_COMPILE_IFELSE is expanded from...
@@ -2276,50 +2281,50 @@ You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:507: BASH_TYPE_RLIMIT is expanded from...
-configure.ac:930: the top level])
-m4trace:configure.ac:930: -1- AC_DEFINE_TRACE_LITERAL([RLIMTYPE])
-m4trace:configure.ac:930: -1- m4_pattern_allow([^RLIMTYPE$])
-m4trace:configure.ac:930: -1- AC_DEFINE_TRACE_LITERAL([RLIMTYPE])
-m4trace:configure.ac:930: -1- m4_pattern_allow([^RLIMTYPE$])
-m4trace:configure.ac:932: -1- AC_DEFINE_TRACE_LITERAL([SIZEOF_INTMAX_T])
-m4trace:configure.ac:932: -1- m4_pattern_allow([^SIZEOF_INTMAX_T$])
-m4trace:configure.ac:932: -1- AH_OUTPUT([SIZEOF_INTMAX_T], [/* The size of `intmax_t\', as computed by sizeof. */
+configure.ac:936: the top level])
+m4trace:configure.ac:936: -1- AC_DEFINE_TRACE_LITERAL([RLIMTYPE])
+m4trace:configure.ac:936: -1- m4_pattern_allow([^RLIMTYPE$])
+m4trace:configure.ac:936: -1- AC_DEFINE_TRACE_LITERAL([RLIMTYPE])
+m4trace:configure.ac:936: -1- m4_pattern_allow([^RLIMTYPE$])
+m4trace:configure.ac:938: -1- AC_DEFINE_TRACE_LITERAL([SIZEOF_INTMAX_T])
+m4trace:configure.ac:938: -1- m4_pattern_allow([^SIZEOF_INTMAX_T$])
+m4trace:configure.ac:938: -1- AH_OUTPUT([SIZEOF_INTMAX_T], [/* The size of `intmax_t\', as computed by sizeof. */
 @%:@undef SIZEOF_INTMAX_T])
-m4trace:configure.ac:935: -2- AC_DEFINE_TRACE_LITERAL([TERMIOS_LDISC])
-m4trace:configure.ac:935: -2- m4_pattern_allow([^TERMIOS_LDISC$])
-m4trace:configure.ac:936: -2- AC_DEFINE_TRACE_LITERAL([TERMIO_LDISC])
-m4trace:configure.ac:936: -2- m4_pattern_allow([^TERMIO_LDISC$])
-m4trace:configure.ac:937: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
+m4trace:configure.ac:941: -2- AC_DEFINE_TRACE_LITERAL([TERMIOS_LDISC])
+m4trace:configure.ac:941: -2- m4_pattern_allow([^TERMIOS_LDISC$])
+m4trace:configure.ac:942: -2- AC_DEFINE_TRACE_LITERAL([TERMIO_LDISC])
+m4trace:configure.ac:942: -2- m4_pattern_allow([^TERMIO_LDISC$])
+m4trace:configure.ac:943: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:1042: BASH_STRUCT_DIRENT_D_INO is expanded from...
-configure.ac:937: the top level])
-m4trace:configure.ac:937: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_DIRENT_D_INO])
-m4trace:configure.ac:937: -1- m4_pattern_allow([^HAVE_STRUCT_DIRENT_D_INO$])
-m4trace:configure.ac:938: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
+configure.ac:943: the top level])
+m4trace:configure.ac:943: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_DIRENT_D_INO])
+m4trace:configure.ac:943: -1- m4_pattern_allow([^HAVE_STRUCT_DIRENT_D_INO$])
+m4trace:configure.ac:944: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:1075: BASH_STRUCT_DIRENT_D_FILENO is expanded from...
-configure.ac:938: the top level])
-m4trace:configure.ac:938: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_DIRENT_D_FILENO])
-m4trace:configure.ac:938: -1- m4_pattern_allow([^HAVE_STRUCT_DIRENT_D_FILENO$])
-m4trace:configure.ac:939: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
+configure.ac:944: the top level])
+m4trace:configure.ac:944: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_DIRENT_D_FILENO])
+m4trace:configure.ac:944: -1- m4_pattern_allow([^HAVE_STRUCT_DIRENT_D_FILENO$])
+m4trace:configure.ac:945: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:1108: BASH_STRUCT_DIRENT_D_NAMLEN is expanded from...
-configure.ac:939: the top level])
-m4trace:configure.ac:939: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_DIRENT_D_NAMLEN])
-m4trace:configure.ac:939: -1- m4_pattern_allow([^HAVE_STRUCT_DIRENT_D_NAMLEN$])
-m4trace:configure.ac:940: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
+configure.ac:945: the top level])
+m4trace:configure.ac:945: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_DIRENT_D_NAMLEN])
+m4trace:configure.ac:945: -1- m4_pattern_allow([^HAVE_STRUCT_DIRENT_D_NAMLEN$])
+m4trace:configure.ac:946: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:1173: BASH_STRUCT_WINSIZE is expanded from...
-configure.ac:940: the top level])
-m4trace:configure.ac:940: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
+configure.ac:946: the top level])
+m4trace:configure.ac:946: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2591: _AC_COMPILE_IFELSE is expanded from...
@@ -2328,303 +2333,303 @@ You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:1173: BASH_STRUCT_WINSIZE is expanded from...
-configure.ac:940: the top level])
-m4trace:configure.ac:940: -1- AC_DEFINE_TRACE_LITERAL([STRUCT_WINSIZE_IN_SYS_IOCTL])
-m4trace:configure.ac:940: -1- m4_pattern_allow([^STRUCT_WINSIZE_IN_SYS_IOCTL$])
-m4trace:configure.ac:940: -1- AC_DEFINE_TRACE_LITERAL([STRUCT_WINSIZE_IN_TERMIOS])
-m4trace:configure.ac:940: -1- m4_pattern_allow([^STRUCT_WINSIZE_IN_TERMIOS$])
-m4trace:configure.ac:941: -1- AC_DEFINE_TRACE_LITERAL([HAVE_TIMEVAL])
-m4trace:configure.ac:941: -1- m4_pattern_allow([^HAVE_TIMEVAL$])
-m4trace:configure.ac:942: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_STAT_ST_BLOCKS])
-m4trace:configure.ac:942: -1- m4_pattern_allow([^HAVE_STRUCT_STAT_ST_BLOCKS$])
-m4trace:configure.ac:942: -1- AH_OUTPUT([HAVE_STRUCT_STAT_ST_BLOCKS], [/* Define to 1 if `st_blocks\' is a member of `struct stat\'. */
+configure.ac:946: the top level])
+m4trace:configure.ac:946: -1- AC_DEFINE_TRACE_LITERAL([STRUCT_WINSIZE_IN_SYS_IOCTL])
+m4trace:configure.ac:946: -1- m4_pattern_allow([^STRUCT_WINSIZE_IN_SYS_IOCTL$])
+m4trace:configure.ac:946: -1- AC_DEFINE_TRACE_LITERAL([STRUCT_WINSIZE_IN_TERMIOS])
+m4trace:configure.ac:946: -1- m4_pattern_allow([^STRUCT_WINSIZE_IN_TERMIOS$])
+m4trace:configure.ac:947: -1- AC_DEFINE_TRACE_LITERAL([HAVE_TIMEVAL])
+m4trace:configure.ac:947: -1- m4_pattern_allow([^HAVE_TIMEVAL$])
+m4trace:configure.ac:948: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_STAT_ST_BLOCKS])
+m4trace:configure.ac:948: -1- m4_pattern_allow([^HAVE_STRUCT_STAT_ST_BLOCKS$])
+m4trace:configure.ac:948: -1- AH_OUTPUT([HAVE_STRUCT_STAT_ST_BLOCKS], [/* Define to 1 if `st_blocks\' is a member of `struct stat\'. */
 @%:@undef HAVE_STRUCT_STAT_ST_BLOCKS])
-m4trace:configure.ac:943: -1- AC_DEFINE_TRACE_LITERAL([TM_IN_SYS_TIME])
-m4trace:configure.ac:943: -1- m4_pattern_allow([^TM_IN_SYS_TIME$])
-m4trace:configure.ac:943: -1- AH_OUTPUT([TM_IN_SYS_TIME], [/* Define to 1 if your <sys/time.h> declares `struct tm\'. */
+m4trace:configure.ac:949: -1- AC_DEFINE_TRACE_LITERAL([TM_IN_SYS_TIME])
+m4trace:configure.ac:949: -1- m4_pattern_allow([^TM_IN_SYS_TIME$])
+m4trace:configure.ac:949: -1- AH_OUTPUT([TM_IN_SYS_TIME], [/* Define to 1 if your <sys/time.h> declares `struct tm\'. */
 @%:@undef TM_IN_SYS_TIME])
-m4trace:configure.ac:944: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_TM_TM_ZONE])
-m4trace:configure.ac:944: -1- m4_pattern_allow([^HAVE_STRUCT_TM_TM_ZONE$])
-m4trace:configure.ac:944: -1- AH_OUTPUT([HAVE_STRUCT_TM_TM_ZONE], [/* Define to 1 if `tm_zone\' is a member of `struct tm\'. */
+m4trace:configure.ac:950: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_TM_TM_ZONE])
+m4trace:configure.ac:950: -1- m4_pattern_allow([^HAVE_STRUCT_TM_TM_ZONE$])
+m4trace:configure.ac:950: -1- AH_OUTPUT([HAVE_STRUCT_TM_TM_ZONE], [/* Define to 1 if `tm_zone\' is a member of `struct tm\'. */
 @%:@undef HAVE_STRUCT_TM_TM_ZONE])
-m4trace:configure.ac:944: -1- AC_DEFINE_TRACE_LITERAL([HAVE_TM_ZONE])
-m4trace:configure.ac:944: -1- m4_pattern_allow([^HAVE_TM_ZONE$])
-m4trace:configure.ac:944: -1- AH_OUTPUT([HAVE_TM_ZONE], [/* Define to 1 if your `struct tm\' has `tm_zone\'. Deprecated, use
+m4trace:configure.ac:950: -1- AC_DEFINE_TRACE_LITERAL([HAVE_TM_ZONE])
+m4trace:configure.ac:950: -1- m4_pattern_allow([^HAVE_TM_ZONE$])
+m4trace:configure.ac:950: -1- AH_OUTPUT([HAVE_TM_ZONE], [/* Define to 1 if your `struct tm\' has `tm_zone\'. Deprecated, use
    `HAVE_STRUCT_TM_TM_ZONE\' instead. */
 @%:@undef HAVE_TM_ZONE])
-m4trace:configure.ac:944: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_TZNAME])
-m4trace:configure.ac:944: -1- m4_pattern_allow([^HAVE_DECL_TZNAME$])
-m4trace:configure.ac:944: -1- AH_OUTPUT([HAVE_DECL_TZNAME], [/* Define to 1 if you have the declaration of `tzname\', and to 0 if you don\'t.
+m4trace:configure.ac:950: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_TZNAME])
+m4trace:configure.ac:950: -1- m4_pattern_allow([^HAVE_DECL_TZNAME$])
+m4trace:configure.ac:950: -1- AH_OUTPUT([HAVE_DECL_TZNAME], [/* Define to 1 if you have the declaration of `tzname\', and to 0 if you don\'t.
    */
 @%:@undef HAVE_DECL_TZNAME])
-m4trace:configure.ac:944: -1- AC_DEFINE_TRACE_LITERAL([HAVE_TZNAME])
-m4trace:configure.ac:944: -1- m4_pattern_allow([^HAVE_TZNAME$])
-m4trace:configure.ac:944: -1- AH_OUTPUT([HAVE_TZNAME], [/* Define to 1 if you don\'t have `tm_zone\' but do have the external array
+m4trace:configure.ac:950: -1- AC_DEFINE_TRACE_LITERAL([HAVE_TZNAME])
+m4trace:configure.ac:950: -1- m4_pattern_allow([^HAVE_TZNAME$])
+m4trace:configure.ac:950: -1- AH_OUTPUT([HAVE_TZNAME], [/* Define to 1 if you don\'t have `tm_zone\' but do have the external array
    `tzname\'. */
 @%:@undef HAVE_TZNAME])
-m4trace:configure.ac:945: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_TIMEZONE])
-m4trace:configure.ac:945: -1- m4_pattern_allow([^HAVE_STRUCT_TIMEZONE$])
-m4trace:configure.ac:947: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
+m4trace:configure.ac:951: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_TIMEZONE])
+m4trace:configure.ac:951: -1- m4_pattern_allow([^HAVE_STRUCT_TIMEZONE$])
+m4trace:configure.ac:953: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:4149: BASH_STRUCT_WEXITSTATUS_OFFSET is expanded from...
-configure.ac:947: the top level])
-m4trace:configure.ac:947: -1- AC_DEFINE_TRACE_LITERAL([WEXITSTATUS_OFFSET])
-m4trace:configure.ac:947: -1- m4_pattern_allow([^WEXITSTATUS_OFFSET$])
-m4trace:configure.ac:947: -1- AH_OUTPUT([WEXITSTATUS_OFFSET], [/* Offset of exit status in wait status word */
+configure.ac:953: the top level])
+m4trace:configure.ac:953: -1- AC_DEFINE_TRACE_LITERAL([WEXITSTATUS_OFFSET])
+m4trace:configure.ac:953: -1- m4_pattern_allow([^WEXITSTATUS_OFFSET$])
+m4trace:configure.ac:953: -1- AH_OUTPUT([WEXITSTATUS_OFFSET], [/* Offset of exit status in wait status word */
 @%:@undef WEXITSTATUS_OFFSET])
-m4trace:configure.ac:949: -1- AH_OUTPUT([HAVE_SYS_TIME_H], [/* Define to 1 if you have the <sys/time.h> header file. */
+m4trace:configure.ac:955: -1- AH_OUTPUT([HAVE_SYS_TIME_H], [/* Define to 1 if you have the <sys/time.h> header file. */
 @%:@undef HAVE_SYS_TIME_H])
-m4trace:configure.ac:949: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_TIMESPEC])
-m4trace:configure.ac:949: -1- m4_pattern_allow([^HAVE_STRUCT_TIMESPEC$])
-m4trace:configure.ac:949: -1- AC_DEFINE_TRACE_LITERAL([TIME_H_DEFINES_STRUCT_TIMESPEC])
-m4trace:configure.ac:949: -1- m4_pattern_allow([^TIME_H_DEFINES_STRUCT_TIMESPEC$])
-m4trace:configure.ac:949: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_TIMESPEC])
-m4trace:configure.ac:949: -1- m4_pattern_allow([^HAVE_STRUCT_TIMESPEC$])
-m4trace:configure.ac:949: -1- AC_DEFINE_TRACE_LITERAL([SYS_TIME_H_DEFINES_STRUCT_TIMESPEC])
-m4trace:configure.ac:949: -1- m4_pattern_allow([^SYS_TIME_H_DEFINES_STRUCT_TIMESPEC$])
-m4trace:configure.ac:949: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_TIMESPEC])
-m4trace:configure.ac:949: -1- m4_pattern_allow([^HAVE_STRUCT_TIMESPEC$])
-m4trace:configure.ac:949: -1- AC_DEFINE_TRACE_LITERAL([PTHREAD_H_DEFINES_STRUCT_TIMESPEC])
-m4trace:configure.ac:949: -1- m4_pattern_allow([^PTHREAD_H_DEFINES_STRUCT_TIMESPEC$])
-m4trace:configure.ac:949: -1- AC_SUBST([TIME_H_DEFINES_STRUCT_TIMESPEC])
-m4trace:configure.ac:949: -1- AC_SUBST_TRACE([TIME_H_DEFINES_STRUCT_TIMESPEC])
-m4trace:configure.ac:949: -1- m4_pattern_allow([^TIME_H_DEFINES_STRUCT_TIMESPEC$])
-m4trace:configure.ac:949: -1- AC_SUBST([SYS_TIME_H_DEFINES_STRUCT_TIMESPEC])
-m4trace:configure.ac:949: -1- AC_SUBST_TRACE([SYS_TIME_H_DEFINES_STRUCT_TIMESPEC])
-m4trace:configure.ac:949: -1- m4_pattern_allow([^SYS_TIME_H_DEFINES_STRUCT_TIMESPEC$])
-m4trace:configure.ac:949: -1- AC_SUBST([PTHREAD_H_DEFINES_STRUCT_TIMESPEC])
-m4trace:configure.ac:949: -1- AC_SUBST_TRACE([PTHREAD_H_DEFINES_STRUCT_TIMESPEC])
-m4trace:configure.ac:949: -1- m4_pattern_allow([^PTHREAD_H_DEFINES_STRUCT_TIMESPEC$])
-m4trace:configure.ac:950: -1- AH_OUTPUT([HAVE_SYS_TIME_H], [/* Define to 1 if you have the <sys/time.h> header file. */
+m4trace:configure.ac:955: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_TIMESPEC])
+m4trace:configure.ac:955: -1- m4_pattern_allow([^HAVE_STRUCT_TIMESPEC$])
+m4trace:configure.ac:955: -1- AC_DEFINE_TRACE_LITERAL([TIME_H_DEFINES_STRUCT_TIMESPEC])
+m4trace:configure.ac:955: -1- m4_pattern_allow([^TIME_H_DEFINES_STRUCT_TIMESPEC$])
+m4trace:configure.ac:955: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_TIMESPEC])
+m4trace:configure.ac:955: -1- m4_pattern_allow([^HAVE_STRUCT_TIMESPEC$])
+m4trace:configure.ac:955: -1- AC_DEFINE_TRACE_LITERAL([SYS_TIME_H_DEFINES_STRUCT_TIMESPEC])
+m4trace:configure.ac:955: -1- m4_pattern_allow([^SYS_TIME_H_DEFINES_STRUCT_TIMESPEC$])
+m4trace:configure.ac:955: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_TIMESPEC])
+m4trace:configure.ac:955: -1- m4_pattern_allow([^HAVE_STRUCT_TIMESPEC$])
+m4trace:configure.ac:955: -1- AC_DEFINE_TRACE_LITERAL([PTHREAD_H_DEFINES_STRUCT_TIMESPEC])
+m4trace:configure.ac:955: -1- m4_pattern_allow([^PTHREAD_H_DEFINES_STRUCT_TIMESPEC$])
+m4trace:configure.ac:955: -1- AC_SUBST([TIME_H_DEFINES_STRUCT_TIMESPEC])
+m4trace:configure.ac:955: -1- AC_SUBST_TRACE([TIME_H_DEFINES_STRUCT_TIMESPEC])
+m4trace:configure.ac:955: -1- m4_pattern_allow([^TIME_H_DEFINES_STRUCT_TIMESPEC$])
+m4trace:configure.ac:955: -1- AC_SUBST([SYS_TIME_H_DEFINES_STRUCT_TIMESPEC])
+m4trace:configure.ac:955: -1- AC_SUBST_TRACE([SYS_TIME_H_DEFINES_STRUCT_TIMESPEC])
+m4trace:configure.ac:955: -1- m4_pattern_allow([^SYS_TIME_H_DEFINES_STRUCT_TIMESPEC$])
+m4trace:configure.ac:955: -1- AC_SUBST([PTHREAD_H_DEFINES_STRUCT_TIMESPEC])
+m4trace:configure.ac:955: -1- AC_SUBST_TRACE([PTHREAD_H_DEFINES_STRUCT_TIMESPEC])
+m4trace:configure.ac:955: -1- m4_pattern_allow([^PTHREAD_H_DEFINES_STRUCT_TIMESPEC$])
+m4trace:configure.ac:956: -1- AH_OUTPUT([HAVE_SYS_TIME_H], [/* Define to 1 if you have the <sys/time.h> header file. */
 @%:@undef HAVE_SYS_TIME_H])
-m4trace:configure.ac:950: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC])
-m4trace:configure.ac:950: -1- m4_pattern_allow([^HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC$])
-m4trace:configure.ac:950: -1- AH_OUTPUT([HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC], [/* Define to 1 if `st_atim.tv_nsec\' is a member of `struct stat\'. */
+m4trace:configure.ac:956: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC])
+m4trace:configure.ac:956: -1- m4_pattern_allow([^HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC$])
+m4trace:configure.ac:956: -1- AH_OUTPUT([HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC], [/* Define to 1 if `st_atim.tv_nsec\' is a member of `struct stat\'. */
 @%:@undef HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC])
-m4trace:configure.ac:950: -1- AC_DEFINE_TRACE_LITERAL([TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC])
-m4trace:configure.ac:950: -1- m4_pattern_allow([^TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC$])
-m4trace:configure.ac:950: -1- AH_OUTPUT([TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC], [/* Define to 1 if the type of the st_atim member of a struct stat is struct
+m4trace:configure.ac:956: -1- AC_DEFINE_TRACE_LITERAL([TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC])
+m4trace:configure.ac:956: -1- m4_pattern_allow([^TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC$])
+m4trace:configure.ac:956: -1- AH_OUTPUT([TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC], [/* Define to 1 if the type of the st_atim member of a struct stat is struct
    timespec. */
 @%:@undef TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC])
-m4trace:configure.ac:950: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC])
-m4trace:configure.ac:950: -1- m4_pattern_allow([^HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC$])
-m4trace:configure.ac:950: -1- AH_OUTPUT([HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC], [/* Define to 1 if `st_atimespec.tv_nsec\' is a member of `struct stat\'. */
+m4trace:configure.ac:956: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC])
+m4trace:configure.ac:956: -1- m4_pattern_allow([^HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC$])
+m4trace:configure.ac:956: -1- AH_OUTPUT([HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC], [/* Define to 1 if `st_atimespec.tv_nsec\' is a member of `struct stat\'. */
 @%:@undef HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC])
-m4trace:configure.ac:950: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_STAT_ST_ATIMENSEC])
-m4trace:configure.ac:950: -1- m4_pattern_allow([^HAVE_STRUCT_STAT_ST_ATIMENSEC$])
-m4trace:configure.ac:950: -1- AH_OUTPUT([HAVE_STRUCT_STAT_ST_ATIMENSEC], [/* Define to 1 if `st_atimensec\' is a member of `struct stat\'. */
+m4trace:configure.ac:956: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_STAT_ST_ATIMENSEC])
+m4trace:configure.ac:956: -1- m4_pattern_allow([^HAVE_STRUCT_STAT_ST_ATIMENSEC$])
+m4trace:configure.ac:956: -1- AH_OUTPUT([HAVE_STRUCT_STAT_ST_ATIMENSEC], [/* Define to 1 if `st_atimensec\' is a member of `struct stat\'. */
 @%:@undef HAVE_STRUCT_STAT_ST_ATIMENSEC])
-m4trace:configure.ac:950: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC])
-m4trace:configure.ac:950: -1- m4_pattern_allow([^HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC$])
-m4trace:configure.ac:950: -1- AH_OUTPUT([HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC], [/* Define to 1 if `st_atim.st__tim.tv_nsec\' is a member of `struct stat\'. */
+m4trace:configure.ac:956: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC])
+m4trace:configure.ac:956: -1- m4_pattern_allow([^HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC$])
+m4trace:configure.ac:956: -1- AH_OUTPUT([HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC], [/* Define to 1 if `st_atim.st__tim.tv_nsec\' is a member of `struct stat\'. */
 @%:@undef HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC])
-m4trace:configure.ac:953: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+m4trace:configure.ac:959: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:299: BASH_FUNC_STRSIGNAL is expanded from...
-configure.ac:953: the top level])
-m4trace:configure.ac:953: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRSIGNAL])
-m4trace:configure.ac:953: -1- m4_pattern_allow([^HAVE_STRSIGNAL$])
-m4trace:configure.ac:954: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
+configure.ac:959: the top level])
+m4trace:configure.ac:959: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRSIGNAL])
+m4trace:configure.ac:959: -1- m4_pattern_allow([^HAVE_STRSIGNAL$])
+m4trace:configure.ac:960: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:313: BASH_FUNC_OPENDIR_CHECK is expanded from...
-configure.ac:954: the top level])
-m4trace:configure.ac:954: -1- AC_DEFINE_TRACE_LITERAL([OPENDIR_NOT_ROBUST])
-m4trace:configure.ac:954: -1- m4_pattern_allow([^OPENDIR_NOT_ROBUST$])
-m4trace:configure.ac:955: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
+configure.ac:960: the top level])
+m4trace:configure.ac:960: -1- AC_DEFINE_TRACE_LITERAL([OPENDIR_NOT_ROBUST])
+m4trace:configure.ac:960: -1- m4_pattern_allow([^OPENDIR_NOT_ROBUST$])
+m4trace:configure.ac:961: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:683: BASH_FUNC_ULIMIT_MAXFDS is expanded from...
-configure.ac:955: the top level])
-m4trace:configure.ac:955: -1- AC_DEFINE_TRACE_LITERAL([ULIMIT_MAXFDS])
-m4trace:configure.ac:955: -1- m4_pattern_allow([^ULIMIT_MAXFDS$])
-m4trace:configure.ac:956: -1- AH_OUTPUT([HAVE_FPURGE], [/* Define to 1 if you have the `fpurge\' function. */
+configure.ac:961: the top level])
+m4trace:configure.ac:961: -1- AC_DEFINE_TRACE_LITERAL([ULIMIT_MAXFDS])
+m4trace:configure.ac:961: -1- m4_pattern_allow([^ULIMIT_MAXFDS$])
+m4trace:configure.ac:962: -1- AH_OUTPUT([HAVE_FPURGE], [/* Define to 1 if you have the `fpurge\' function. */
 @%:@undef HAVE_FPURGE])
-m4trace:configure.ac:956: -1- AH_OUTPUT([HAVE___FPURGE], [/* Define to 1 if you have the `__fpurge\' function. */
+m4trace:configure.ac:962: -1- AH_OUTPUT([HAVE___FPURGE], [/* Define to 1 if you have the `__fpurge\' function. */
 @%:@undef HAVE___FPURGE])
-m4trace:configure.ac:956: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_FPURGE])
-m4trace:configure.ac:956: -1- m4_pattern_allow([^HAVE_DECL_FPURGE$])
-m4trace:configure.ac:956: -1- AH_OUTPUT([HAVE_DECL_FPURGE], [/* Define to 1 if you have the declaration of `fpurge\', and to 0 if you don\'t.
+m4trace:configure.ac:962: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_FPURGE])
+m4trace:configure.ac:962: -1- m4_pattern_allow([^HAVE_DECL_FPURGE$])
+m4trace:configure.ac:962: -1- AH_OUTPUT([HAVE_DECL_FPURGE], [/* Define to 1 if you have the declaration of `fpurge\', and to 0 if you don\'t.
    */
 @%:@undef HAVE_DECL_FPURGE])
-m4trace:configure.ac:957: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
+m4trace:configure.ac:963: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:579: BASH_FUNC_GETENV is expanded from...
-configure.ac:957: the top level])
-m4trace:configure.ac:957: -1- AC_DEFINE_TRACE_LITERAL([CAN_REDEFINE_GETENV])
-m4trace:configure.ac:957: -1- m4_pattern_allow([^CAN_REDEFINE_GETENV$])
-m4trace:configure.ac:959: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
+configure.ac:963: the top level])
+m4trace:configure.ac:963: -1- AC_DEFINE_TRACE_LITERAL([CAN_REDEFINE_GETENV])
+m4trace:configure.ac:963: -1- m4_pattern_allow([^CAN_REDEFINE_GETENV$])
+m4trace:configure.ac:965: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:702: BASH_FUNC_GETCWD is expanded from...
-configure.ac:959: the top level])
-m4trace:configure.ac:959: -1- AC_DEFINE_TRACE_LITERAL([GETCWD_BROKEN])
-m4trace:configure.ac:959: -1- m4_pattern_allow([^GETCWD_BROKEN$])
-m4trace:configure.ac:959: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS getcwd.$ac_objext"])
-m4trace:configure.ac:959: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
-m4trace:configure.ac:959: -1- m4_pattern_allow([^LIB@&t@OBJS$])
-m4trace:configure.ac:959: -1- AC_LIBSOURCE([getcwd.c])
-m4trace:configure.ac:961: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
+configure.ac:965: the top level])
+m4trace:configure.ac:965: -1- AC_DEFINE_TRACE_LITERAL([GETCWD_BROKEN])
+m4trace:configure.ac:965: -1- m4_pattern_allow([^GETCWD_BROKEN$])
+m4trace:configure.ac:965: -1- AC_SUBST([LIB@&t@OBJS], ["$LIB@&t@OBJS getcwd.$ac_objext"])
+m4trace:configure.ac:965: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:965: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:965: -1- AC_LIBSOURCE([getcwd.c])
+m4trace:configure.ac:967: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:778: BASH_FUNC_POSIX_SETJMP is expanded from...
-configure.ac:961: the top level])
-m4trace:configure.ac:961: -1- AC_DEFINE_TRACE_LITERAL([HAVE_POSIX_SIGSETJMP])
-m4trace:configure.ac:961: -1- m4_pattern_allow([^HAVE_POSIX_SIGSETJMP$])
-m4trace:configure.ac:962: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
+configure.ac:967: the top level])
+m4trace:configure.ac:967: -1- AC_DEFINE_TRACE_LITERAL([HAVE_POSIX_SIGSETJMP])
+m4trace:configure.ac:967: -1- m4_pattern_allow([^HAVE_POSIX_SIGSETJMP$])
+m4trace:configure.ac:968: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:829: BASH_FUNC_STRCOLL is expanded from...
-configure.ac:962: the top level])
-m4trace:configure.ac:962: -1- AC_DEFINE_TRACE_LITERAL([STRCOLL_BROKEN])
-m4trace:configure.ac:962: -1- m4_pattern_allow([^STRCOLL_BROKEN$])
-m4trace:configure.ac:963: -1- AH_OUTPUT([HAVE_SNPRINTF], [/* Define to 1 if you have the `snprintf\' function. */
+configure.ac:968: the top level])
+m4trace:configure.ac:968: -1- AC_DEFINE_TRACE_LITERAL([STRCOLL_BROKEN])
+m4trace:configure.ac:968: -1- m4_pattern_allow([^STRCOLL_BROKEN$])
+m4trace:configure.ac:969: -1- AH_OUTPUT([HAVE_SNPRINTF], [/* Define to 1 if you have the `snprintf\' function. */
 @%:@undef HAVE_SNPRINTF])
-m4trace:configure.ac:963: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
+m4trace:configure.ac:969: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
 aclocal.m4:4065: BASH_FUNC_SNPRINTF is expanded from...
-configure.ac:963: the top level])
-m4trace:configure.ac:963: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SNPRINTF])
-m4trace:configure.ac:963: -1- m4_pattern_allow([^HAVE_SNPRINTF$])
-m4trace:configure.ac:963: -1- AH_OUTPUT([HAVE_SNPRINTF], [/* Define if you have a standard-conformant snprintf function. */
+configure.ac:969: the top level])
+m4trace:configure.ac:969: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SNPRINTF])
+m4trace:configure.ac:969: -1- m4_pattern_allow([^HAVE_SNPRINTF$])
+m4trace:configure.ac:969: -1- AH_OUTPUT([HAVE_SNPRINTF], [/* Define if you have a standard-conformant snprintf function. */
 @%:@undef HAVE_SNPRINTF])
-m4trace:configure.ac:964: -1- AH_OUTPUT([HAVE_VSNPRINTF], [/* Define to 1 if you have the `vsnprintf\' function. */
+m4trace:configure.ac:970: -1- AH_OUTPUT([HAVE_VSNPRINTF], [/* Define to 1 if you have the `vsnprintf\' function. */
 @%:@undef HAVE_VSNPRINTF])
-m4trace:configure.ac:964: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
+m4trace:configure.ac:970: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
 aclocal.m4:4093: BASH_FUNC_VSNPRINTF is expanded from...
-configure.ac:964: the top level])
-m4trace:configure.ac:964: -1- AC_DEFINE_TRACE_LITERAL([HAVE_VSNPRINTF])
-m4trace:configure.ac:964: -1- m4_pattern_allow([^HAVE_VSNPRINTF$])
-m4trace:configure.ac:964: -1- AH_OUTPUT([HAVE_VSNPRINTF], [/* Define if you have a standard-conformant vsnprintf function. */
+configure.ac:970: the top level])
+m4trace:configure.ac:970: -1- AC_DEFINE_TRACE_LITERAL([HAVE_VSNPRINTF])
+m4trace:configure.ac:970: -1- m4_pattern_allow([^HAVE_VSNPRINTF$])
+m4trace:configure.ac:970: -1- AH_OUTPUT([HAVE_VSNPRINTF], [/* Define if you have a standard-conformant vsnprintf function. */
 @%:@undef HAVE_VSNPRINTF])
-m4trace:configure.ac:970: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+m4trace:configure.ac:976: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
 aclocal.m4:624: BASH_FUNC_STD_PUTENV is expanded from...
-configure.ac:970: the top level])
-m4trace:configure.ac:970: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STD_PUTENV])
-m4trace:configure.ac:970: -1- m4_pattern_allow([^HAVE_STD_PUTENV$])
-m4trace:configure.ac:972: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STD_PUTENV])
-m4trace:configure.ac:972: -1- m4_pattern_allow([^HAVE_STD_PUTENV$])
-m4trace:configure.ac:975: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
+configure.ac:976: the top level])
+m4trace:configure.ac:976: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STD_PUTENV])
+m4trace:configure.ac:976: -1- m4_pattern_allow([^HAVE_STD_PUTENV$])
+m4trace:configure.ac:978: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STD_PUTENV])
+m4trace:configure.ac:978: -1- m4_pattern_allow([^HAVE_STD_PUTENV$])
+m4trace:configure.ac:981: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2688: AC_TRY_LINK is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 ../../lib/autoconf/general.m4:2053: AC_CACHE_CHECK is expanded from...
 aclocal.m4:654: BASH_FUNC_STD_UNSETENV is expanded from...
-configure.ac:975: the top level])
-m4trace:configure.ac:975: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STD_UNSETENV])
-m4trace:configure.ac:975: -1- m4_pattern_allow([^HAVE_STD_UNSETENV$])
-m4trace:configure.ac:977: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STD_UNSETENV])
-m4trace:configure.ac:977: -1- m4_pattern_allow([^HAVE_STD_UNSETENV$])
-m4trace:configure.ac:980: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
+configure.ac:981: the top level])
+m4trace:configure.ac:981: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STD_UNSETENV])
+m4trace:configure.ac:981: -1- m4_pattern_allow([^HAVE_STD_UNSETENV$])
+m4trace:configure.ac:983: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STD_UNSETENV])
+m4trace:configure.ac:983: -1- m4_pattern_allow([^HAVE_STD_UNSETENV$])
+m4trace:configure.ac:986: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:878: BASH_FUNC_PRINTF_A_FORMAT is expanded from...
-configure.ac:980: the top level])
-m4trace:configure.ac:980: -1- AC_DEFINE_TRACE_LITERAL([HAVE_PRINTF_A_FORMAT])
-m4trace:configure.ac:980: -1- m4_pattern_allow([^HAVE_PRINTF_A_FORMAT$])
-m4trace:configure.ac:983: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
+configure.ac:986: the top level])
+m4trace:configure.ac:986: -1- AC_DEFINE_TRACE_LITERAL([HAVE_PRINTF_A_FORMAT])
+m4trace:configure.ac:986: -1- m4_pattern_allow([^HAVE_PRINTF_A_FORMAT$])
+m4trace:configure.ac:989: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:1297: BASH_SYS_REINSTALL_SIGHANDLERS is expanded from...
-configure.ac:983: the top level])
-m4trace:configure.ac:983: -1- AC_DEFINE_TRACE_LITERAL([MUST_REINSTALL_SIGHANDLERS])
-m4trace:configure.ac:983: -1- m4_pattern_allow([^MUST_REINSTALL_SIGHANDLERS$])
-m4trace:configure.ac:984: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
+configure.ac:989: the top level])
+m4trace:configure.ac:989: -1- AC_DEFINE_TRACE_LITERAL([MUST_REINSTALL_SIGHANDLERS])
+m4trace:configure.ac:989: -1- m4_pattern_allow([^MUST_REINSTALL_SIGHANDLERS$])
+m4trace:configure.ac:990: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:1356: BASH_SYS_JOB_CONTROL_MISSING is expanded from...
-configure.ac:984: the top level])
-m4trace:configure.ac:984: -1- AC_DEFINE_TRACE_LITERAL([JOB_CONTROL_MISSING])
-m4trace:configure.ac:984: -1- m4_pattern_allow([^JOB_CONTROL_MISSING$])
-m4trace:configure.ac:985: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
+configure.ac:990: the top level])
+m4trace:configure.ac:990: -1- AC_DEFINE_TRACE_LITERAL([JOB_CONTROL_MISSING])
+m4trace:configure.ac:990: -1- m4_pattern_allow([^JOB_CONTROL_MISSING$])
+m4trace:configure.ac:991: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:1415: BASH_SYS_NAMED_PIPES is expanded from...
-configure.ac:985: the top level])
-m4trace:configure.ac:985: -1- AC_DEFINE_TRACE_LITERAL([NAMED_PIPES_MISSING])
-m4trace:configure.ac:985: -1- m4_pattern_allow([^NAMED_PIPES_MISSING$])
-m4trace:configure.ac:988: -1- AC_DEFINE_TRACE_LITERAL([GWINSZ_IN_SYS_IOCTL])
-m4trace:configure.ac:988: -1- m4_pattern_allow([^GWINSZ_IN_SYS_IOCTL$])
-m4trace:configure.ac:988: -1- AH_OUTPUT([GWINSZ_IN_SYS_IOCTL], [/* Define to 1 if `TIOCGWINSZ\' requires <sys/ioctl.h>. */
+configure.ac:991: the top level])
+m4trace:configure.ac:991: -1- AC_DEFINE_TRACE_LITERAL([NAMED_PIPES_MISSING])
+m4trace:configure.ac:991: -1- m4_pattern_allow([^NAMED_PIPES_MISSING$])
+m4trace:configure.ac:994: -1- AC_DEFINE_TRACE_LITERAL([GWINSZ_IN_SYS_IOCTL])
+m4trace:configure.ac:994: -1- m4_pattern_allow([^GWINSZ_IN_SYS_IOCTL$])
+m4trace:configure.ac:994: -1- AH_OUTPUT([GWINSZ_IN_SYS_IOCTL], [/* Define to 1 if `TIOCGWINSZ\' requires <sys/ioctl.h>. */
 @%:@undef GWINSZ_IN_SYS_IOCTL])
-m4trace:configure.ac:989: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
+m4trace:configure.ac:995: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:1496: BASH_HAVE_TIOCSTAT is expanded from...
-configure.ac:989: the top level])
-m4trace:configure.ac:989: -1- AC_DEFINE_TRACE_LITERAL([TIOCSTAT_IN_SYS_IOCTL])
-m4trace:configure.ac:989: -1- m4_pattern_allow([^TIOCSTAT_IN_SYS_IOCTL$])
-m4trace:configure.ac:990: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
+configure.ac:995: the top level])
+m4trace:configure.ac:995: -1- AC_DEFINE_TRACE_LITERAL([TIOCSTAT_IN_SYS_IOCTL])
+m4trace:configure.ac:995: -1- m4_pattern_allow([^TIOCSTAT_IN_SYS_IOCTL$])
+m4trace:configure.ac:996: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:1508: BASH_HAVE_FIONREAD is expanded from...
-configure.ac:990: the top level])
-m4trace:configure.ac:990: -1- AC_DEFINE_TRACE_LITERAL([FIONREAD_IN_SYS_IOCTL])
-m4trace:configure.ac:990: -1- m4_pattern_allow([^FIONREAD_IN_SYS_IOCTL$])
-m4trace:configure.ac:992: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
+configure.ac:996: the top level])
+m4trace:configure.ac:996: -1- AC_DEFINE_TRACE_LITERAL([FIONREAD_IN_SYS_IOCTL])
+m4trace:configure.ac:996: -1- m4_pattern_allow([^FIONREAD_IN_SYS_IOCTL$])
+m4trace:configure.ac:998: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:1964: BASH_CHECK_WCONTINUED is expanded from...
-configure.ac:992: the top level])
-m4trace:configure.ac:992: -1- AC_DEFINE_TRACE_LITERAL([WCONTINUED_BROKEN])
-m4trace:configure.ac:992: -1- m4_pattern_allow([^WCONTINUED_BROKEN$])
-m4trace:configure.ac:995: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
+configure.ac:998: the top level])
+m4trace:configure.ac:998: -1- AC_DEFINE_TRACE_LITERAL([WCONTINUED_BROKEN])
+m4trace:configure.ac:998: -1- m4_pattern_allow([^WCONTINUED_BROKEN$])
+m4trace:configure.ac:1001: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:1526: BASH_CHECK_SPEED_T is expanded from...
-configure.ac:995: the top level])
-m4trace:configure.ac:995: -1- AC_DEFINE_TRACE_LITERAL([SPEED_T_IN_SYS_TYPES])
-m4trace:configure.ac:995: -1- m4_pattern_allow([^SPEED_T_IN_SYS_TYPES$])
-m4trace:configure.ac:996: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GETPW_DECLS])
-m4trace:configure.ac:996: -1- m4_pattern_allow([^HAVE_GETPW_DECLS$])
-m4trace:configure.ac:997: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
+configure.ac:1001: the top level])
+m4trace:configure.ac:1001: -1- AC_DEFINE_TRACE_LITERAL([SPEED_T_IN_SYS_TYPES])
+m4trace:configure.ac:1001: -1- m4_pattern_allow([^SPEED_T_IN_SYS_TYPES$])
+m4trace:configure.ac:1002: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GETPW_DECLS])
+m4trace:configure.ac:1002: -1- m4_pattern_allow([^HAVE_GETPW_DECLS$])
+m4trace:configure.ac:1003: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2765: AC_TRY_RUN is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:1653: BASH_CHECK_RTSIGS is expanded from...
-configure.ac:997: the top level])
-m4trace:configure.ac:997: -1- AC_DEFINE_TRACE_LITERAL([UNUSABLE_RT_SIGNALS])
-m4trace:configure.ac:997: -1- m4_pattern_allow([^UNUSABLE_RT_SIGNALS$])
-m4trace:configure.ac:998: -1- AC_SUBST([SIGLIST_O])
-m4trace:configure.ac:998: -1- AC_SUBST_TRACE([SIGLIST_O])
-m4trace:configure.ac:998: -1- m4_pattern_allow([^SIGLIST_O$])
-m4trace:configure.ac:1002: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
+configure.ac:1003: the top level])
+m4trace:configure.ac:1003: -1- AC_DEFINE_TRACE_LITERAL([UNUSABLE_RT_SIGNALS])
+m4trace:configure.ac:1003: -1- m4_pattern_allow([^UNUSABLE_RT_SIGNALS$])
+m4trace:configure.ac:1004: -1- AC_SUBST([SIGLIST_O])
+m4trace:configure.ac:1004: -1- AC_SUBST_TRACE([SIGLIST_O])
+m4trace:configure.ac:1004: -1- m4_pattern_allow([^SIGLIST_O$])
+m4trace:configure.ac:1008: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:1605: BASH_CHECK_KERNEL_RLIMIT is expanded from...
-configure.ac:1002: the top level])
-m4trace:configure.ac:1002: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
+configure.ac:1008: the top level])
+m4trace:configure.ac:1008: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete.
 You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE is expanded from...
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2591: _AC_COMPILE_IFELSE is expanded from...
@@ -2633,140 +2638,140 @@ You should run autoupdate.], [../../lib/autoconf/general.m4:2615: AC_TRY_COMPILE
 ../../lib/m4sugar/m4sh.m4:606: AS_IF is expanded from...
 ../../lib/autoconf/general.m4:2032: AC_CACHE_VAL is expanded from...
 aclocal.m4:1605: BASH_CHECK_KERNEL_RLIMIT is expanded from...
-configure.ac:1002: the top level])
-m4trace:configure.ac:1002: -1- AC_DEFINE_TRACE_LITERAL([RLIMIT_NEEDS_KERNEL])
-m4trace:configure.ac:1002: -1- m4_pattern_allow([^RLIMIT_NEEDS_KERNEL$])
-m4trace:configure.ac:1012: -1- AC_SUBST([TERMCAP_LIB])
-m4trace:configure.ac:1012: -1- AC_SUBST_TRACE([TERMCAP_LIB])
-m4trace:configure.ac:1012: -1- m4_pattern_allow([^TERMCAP_LIB$])
-m4trace:configure.ac:1013: -1- AC_SUBST([TERMCAP_DEP])
-m4trace:configure.ac:1013: -1- AC_SUBST_TRACE([TERMCAP_DEP])
-m4trace:configure.ac:1013: -1- m4_pattern_allow([^TERMCAP_DEP$])
-m4trace:configure.ac:1015: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DEV_FD])
-m4trace:configure.ac:1015: -1- m4_pattern_allow([^HAVE_DEV_FD$])
-m4trace:configure.ac:1015: -1- AC_DEFINE_TRACE_LITERAL([DEV_FD_PREFIX])
-m4trace:configure.ac:1015: -1- m4_pattern_allow([^DEV_FD_PREFIX$])
-m4trace:configure.ac:1015: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DEV_FD])
-m4trace:configure.ac:1015: -1- m4_pattern_allow([^HAVE_DEV_FD$])
-m4trace:configure.ac:1015: -1- AC_DEFINE_TRACE_LITERAL([DEV_FD_PREFIX])
-m4trace:configure.ac:1015: -1- m4_pattern_allow([^DEV_FD_PREFIX$])
-m4trace:configure.ac:1016: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DEV_STDIN])
-m4trace:configure.ac:1016: -1- m4_pattern_allow([^HAVE_DEV_STDIN$])
-m4trace:configure.ac:1017: -1- AC_DEFINE_TRACE_LITERAL([DEFAULT_MAIL_DIRECTORY])
-m4trace:configure.ac:1017: -1- m4_pattern_allow([^DEFAULT_MAIL_DIRECTORY$])
-m4trace:configure.ac:1024: -1- AC_DEFINE_TRACE_LITERAL([JOB_CONTROL])
-m4trace:configure.ac:1024: -1- m4_pattern_allow([^JOB_CONTROL$])
-m4trace:configure.ac:1030: -1- AC_SUBST([JOBS_O])
-m4trace:configure.ac:1030: -1- AC_SUBST_TRACE([JOBS_O])
-m4trace:configure.ac:1030: -1- m4_pattern_allow([^JOBS_O$])
-m4trace:configure.ac:1043: -1- AC_DEFINE_TRACE_LITERAL([SVR4_2])
-m4trace:configure.ac:1043: -1- m4_pattern_allow([^SVR4_2$])
-m4trace:configure.ac:1044: -1- AC_DEFINE_TRACE_LITERAL([SVR4])
-m4trace:configure.ac:1044: -1- m4_pattern_allow([^SVR4$])
-m4trace:configure.ac:1045: -1- AC_DEFINE_TRACE_LITERAL([SVR4])
-m4trace:configure.ac:1045: -1- m4_pattern_allow([^SVR4$])
-m4trace:configure.ac:1046: -1- AC_DEFINE_TRACE_LITERAL([SVR5])
-m4trace:configure.ac:1046: -1- m4_pattern_allow([^SVR5$])
-m4trace:configure.ac:1065: -1- AC_DEFINE_TRACE_LITERAL([PGRP_PIPE])
-m4trace:configure.ac:1065: -1- m4_pattern_allow([^PGRP_PIPE$])
-m4trace:configure.ac:1112: -1- AC_SUBST([SHOBJ_CC])
-m4trace:configure.ac:1112: -1- AC_SUBST_TRACE([SHOBJ_CC])
-m4trace:configure.ac:1112: -1- m4_pattern_allow([^SHOBJ_CC$])
-m4trace:configure.ac:1113: -1- AC_SUBST([SHOBJ_CFLAGS])
-m4trace:configure.ac:1113: -1- AC_SUBST_TRACE([SHOBJ_CFLAGS])
-m4trace:configure.ac:1113: -1- m4_pattern_allow([^SHOBJ_CFLAGS$])
-m4trace:configure.ac:1114: -1- AC_SUBST([SHOBJ_LD])
-m4trace:configure.ac:1114: -1- AC_SUBST_TRACE([SHOBJ_LD])
-m4trace:configure.ac:1114: -1- m4_pattern_allow([^SHOBJ_LD$])
-m4trace:configure.ac:1115: -1- AC_SUBST([SHOBJ_LDFLAGS])
-m4trace:configure.ac:1115: -1- AC_SUBST_TRACE([SHOBJ_LDFLAGS])
-m4trace:configure.ac:1115: -1- m4_pattern_allow([^SHOBJ_LDFLAGS$])
-m4trace:configure.ac:1116: -1- AC_SUBST([SHOBJ_XLDFLAGS])
-m4trace:configure.ac:1116: -1- AC_SUBST_TRACE([SHOBJ_XLDFLAGS])
-m4trace:configure.ac:1116: -1- m4_pattern_allow([^SHOBJ_XLDFLAGS$])
-m4trace:configure.ac:1117: -1- AC_SUBST([SHOBJ_LIBS])
-m4trace:configure.ac:1117: -1- AC_SUBST_TRACE([SHOBJ_LIBS])
-m4trace:configure.ac:1117: -1- m4_pattern_allow([^SHOBJ_LIBS$])
-m4trace:configure.ac:1118: -1- AC_SUBST([SHOBJ_STATUS])
-m4trace:configure.ac:1118: -1- AC_SUBST_TRACE([SHOBJ_STATUS])
-m4trace:configure.ac:1118: -1- m4_pattern_allow([^SHOBJ_STATUS$])
-m4trace:configure.ac:1150: -1- AC_SUBST([PROFILE_FLAGS])
-m4trace:configure.ac:1150: -1- AC_SUBST_TRACE([PROFILE_FLAGS])
-m4trace:configure.ac:1150: -1- m4_pattern_allow([^PROFILE_FLAGS$])
-m4trace:configure.ac:1152: -1- AC_SUBST([incdir])
-m4trace:configure.ac:1152: -1- AC_SUBST_TRACE([incdir])
-m4trace:configure.ac:1152: -1- m4_pattern_allow([^incdir$])
-m4trace:configure.ac:1153: -1- AC_SUBST([BUILD_DIR])
-m4trace:configure.ac:1153: -1- AC_SUBST_TRACE([BUILD_DIR])
-m4trace:configure.ac:1153: -1- m4_pattern_allow([^BUILD_DIR$])
-m4trace:configure.ac:1156: -1- AC_SUBST([datarootdir])
-m4trace:configure.ac:1156: -1- AC_SUBST_TRACE([datarootdir])
-m4trace:configure.ac:1156: -1- m4_pattern_allow([^datarootdir$])
-m4trace:configure.ac:1157: -1- AC_SUBST([localedir])
-m4trace:configure.ac:1157: -1- AC_SUBST_TRACE([localedir])
-m4trace:configure.ac:1157: -1- m4_pattern_allow([^localedir$])
-m4trace:configure.ac:1159: -1- AC_SUBST([YACC])
-m4trace:configure.ac:1159: -1- AC_SUBST_TRACE([YACC])
-m4trace:configure.ac:1159: -1- m4_pattern_allow([^YACC$])
-m4trace:configure.ac:1160: -1- AC_SUBST([AR])
-m4trace:configure.ac:1160: -1- AC_SUBST_TRACE([AR])
-m4trace:configure.ac:1160: -1- m4_pattern_allow([^AR$])
-m4trace:configure.ac:1161: -1- AC_SUBST([ARFLAGS])
-m4trace:configure.ac:1161: -1- AC_SUBST_TRACE([ARFLAGS])
-m4trace:configure.ac:1161: -1- m4_pattern_allow([^ARFLAGS$])
-m4trace:configure.ac:1163: -1- AC_SUBST([BASHVERS])
-m4trace:configure.ac:1163: -1- AC_SUBST_TRACE([BASHVERS])
-m4trace:configure.ac:1163: -1- m4_pattern_allow([^BASHVERS$])
-m4trace:configure.ac:1164: -1- AC_SUBST([RELSTATUS])
-m4trace:configure.ac:1164: -1- AC_SUBST_TRACE([RELSTATUS])
-m4trace:configure.ac:1164: -1- m4_pattern_allow([^RELSTATUS$])
-m4trace:configure.ac:1165: -1- AC_SUBST([DEBUG])
-m4trace:configure.ac:1165: -1- AC_SUBST_TRACE([DEBUG])
-m4trace:configure.ac:1165: -1- m4_pattern_allow([^DEBUG$])
-m4trace:configure.ac:1166: -1- AC_SUBST([MALLOC_DEBUG])
-m4trace:configure.ac:1166: -1- AC_SUBST_TRACE([MALLOC_DEBUG])
-m4trace:configure.ac:1166: -1- m4_pattern_allow([^MALLOC_DEBUG$])
-m4trace:configure.ac:1168: -1- AC_SUBST([host_cpu])
-m4trace:configure.ac:1168: -1- AC_SUBST_TRACE([host_cpu])
-m4trace:configure.ac:1168: -1- m4_pattern_allow([^host_cpu$])
-m4trace:configure.ac:1169: -1- AC_SUBST([host_vendor])
-m4trace:configure.ac:1169: -1- AC_SUBST_TRACE([host_vendor])
-m4trace:configure.ac:1169: -1- m4_pattern_allow([^host_vendor$])
-m4trace:configure.ac:1170: -1- AC_SUBST([host_os])
-m4trace:configure.ac:1170: -1- AC_SUBST_TRACE([host_os])
-m4trace:configure.ac:1170: -1- m4_pattern_allow([^host_os$])
-m4trace:configure.ac:1172: -1- AC_SUBST([LOCAL_LIBS])
-m4trace:configure.ac:1172: -1- AC_SUBST_TRACE([LOCAL_LIBS])
-m4trace:configure.ac:1172: -1- m4_pattern_allow([^LOCAL_LIBS$])
-m4trace:configure.ac:1173: -1- AC_SUBST([LOCAL_CFLAGS])
-m4trace:configure.ac:1173: -1- AC_SUBST_TRACE([LOCAL_CFLAGS])
-m4trace:configure.ac:1173: -1- m4_pattern_allow([^LOCAL_CFLAGS$])
-m4trace:configure.ac:1174: -1- AC_SUBST([LOCAL_LDFLAGS])
-m4trace:configure.ac:1174: -1- AC_SUBST_TRACE([LOCAL_LDFLAGS])
-m4trace:configure.ac:1174: -1- m4_pattern_allow([^LOCAL_LDFLAGS$])
-m4trace:configure.ac:1175: -1- AC_SUBST([LOCAL_DEFS])
-m4trace:configure.ac:1175: -1- AC_SUBST_TRACE([LOCAL_DEFS])
-m4trace:configure.ac:1175: -1- m4_pattern_allow([^LOCAL_DEFS$])
-m4trace:configure.ac:1180: -1- AC_CONFIG_FILES([Makefile builtins/Makefile lib/readline/Makefile lib/glob/Makefile \
+configure.ac:1008: the top level])
+m4trace:configure.ac:1008: -1- AC_DEFINE_TRACE_LITERAL([RLIMIT_NEEDS_KERNEL])
+m4trace:configure.ac:1008: -1- m4_pattern_allow([^RLIMIT_NEEDS_KERNEL$])
+m4trace:configure.ac:1018: -1- AC_SUBST([TERMCAP_LIB])
+m4trace:configure.ac:1018: -1- AC_SUBST_TRACE([TERMCAP_LIB])
+m4trace:configure.ac:1018: -1- m4_pattern_allow([^TERMCAP_LIB$])
+m4trace:configure.ac:1019: -1- AC_SUBST([TERMCAP_DEP])
+m4trace:configure.ac:1019: -1- AC_SUBST_TRACE([TERMCAP_DEP])
+m4trace:configure.ac:1019: -1- m4_pattern_allow([^TERMCAP_DEP$])
+m4trace:configure.ac:1021: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DEV_FD])
+m4trace:configure.ac:1021: -1- m4_pattern_allow([^HAVE_DEV_FD$])
+m4trace:configure.ac:1021: -1- AC_DEFINE_TRACE_LITERAL([DEV_FD_PREFIX])
+m4trace:configure.ac:1021: -1- m4_pattern_allow([^DEV_FD_PREFIX$])
+m4trace:configure.ac:1021: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DEV_FD])
+m4trace:configure.ac:1021: -1- m4_pattern_allow([^HAVE_DEV_FD$])
+m4trace:configure.ac:1021: -1- AC_DEFINE_TRACE_LITERAL([DEV_FD_PREFIX])
+m4trace:configure.ac:1021: -1- m4_pattern_allow([^DEV_FD_PREFIX$])
+m4trace:configure.ac:1022: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DEV_STDIN])
+m4trace:configure.ac:1022: -1- m4_pattern_allow([^HAVE_DEV_STDIN$])
+m4trace:configure.ac:1023: -1- AC_DEFINE_TRACE_LITERAL([DEFAULT_MAIL_DIRECTORY])
+m4trace:configure.ac:1023: -1- m4_pattern_allow([^DEFAULT_MAIL_DIRECTORY$])
+m4trace:configure.ac:1030: -1- AC_DEFINE_TRACE_LITERAL([JOB_CONTROL])
+m4trace:configure.ac:1030: -1- m4_pattern_allow([^JOB_CONTROL$])
+m4trace:configure.ac:1036: -1- AC_SUBST([JOBS_O])
+m4trace:configure.ac:1036: -1- AC_SUBST_TRACE([JOBS_O])
+m4trace:configure.ac:1036: -1- m4_pattern_allow([^JOBS_O$])
+m4trace:configure.ac:1049: -1- AC_DEFINE_TRACE_LITERAL([SVR4_2])
+m4trace:configure.ac:1049: -1- m4_pattern_allow([^SVR4_2$])
+m4trace:configure.ac:1050: -1- AC_DEFINE_TRACE_LITERAL([SVR4])
+m4trace:configure.ac:1050: -1- m4_pattern_allow([^SVR4$])
+m4trace:configure.ac:1051: -1- AC_DEFINE_TRACE_LITERAL([SVR4])
+m4trace:configure.ac:1051: -1- m4_pattern_allow([^SVR4$])
+m4trace:configure.ac:1052: -1- AC_DEFINE_TRACE_LITERAL([SVR5])
+m4trace:configure.ac:1052: -1- m4_pattern_allow([^SVR5$])
+m4trace:configure.ac:1071: -1- AC_DEFINE_TRACE_LITERAL([PGRP_PIPE])
+m4trace:configure.ac:1071: -1- m4_pattern_allow([^PGRP_PIPE$])
+m4trace:configure.ac:1118: -1- AC_SUBST([SHOBJ_CC])
+m4trace:configure.ac:1118: -1- AC_SUBST_TRACE([SHOBJ_CC])
+m4trace:configure.ac:1118: -1- m4_pattern_allow([^SHOBJ_CC$])
+m4trace:configure.ac:1119: -1- AC_SUBST([SHOBJ_CFLAGS])
+m4trace:configure.ac:1119: -1- AC_SUBST_TRACE([SHOBJ_CFLAGS])
+m4trace:configure.ac:1119: -1- m4_pattern_allow([^SHOBJ_CFLAGS$])
+m4trace:configure.ac:1120: -1- AC_SUBST([SHOBJ_LD])
+m4trace:configure.ac:1120: -1- AC_SUBST_TRACE([SHOBJ_LD])
+m4trace:configure.ac:1120: -1- m4_pattern_allow([^SHOBJ_LD$])
+m4trace:configure.ac:1121: -1- AC_SUBST([SHOBJ_LDFLAGS])
+m4trace:configure.ac:1121: -1- AC_SUBST_TRACE([SHOBJ_LDFLAGS])
+m4trace:configure.ac:1121: -1- m4_pattern_allow([^SHOBJ_LDFLAGS$])
+m4trace:configure.ac:1122: -1- AC_SUBST([SHOBJ_XLDFLAGS])
+m4trace:configure.ac:1122: -1- AC_SUBST_TRACE([SHOBJ_XLDFLAGS])
+m4trace:configure.ac:1122: -1- m4_pattern_allow([^SHOBJ_XLDFLAGS$])
+m4trace:configure.ac:1123: -1- AC_SUBST([SHOBJ_LIBS])
+m4trace:configure.ac:1123: -1- AC_SUBST_TRACE([SHOBJ_LIBS])
+m4trace:configure.ac:1123: -1- m4_pattern_allow([^SHOBJ_LIBS$])
+m4trace:configure.ac:1124: -1- AC_SUBST([SHOBJ_STATUS])
+m4trace:configure.ac:1124: -1- AC_SUBST_TRACE([SHOBJ_STATUS])
+m4trace:configure.ac:1124: -1- m4_pattern_allow([^SHOBJ_STATUS$])
+m4trace:configure.ac:1156: -1- AC_SUBST([PROFILE_FLAGS])
+m4trace:configure.ac:1156: -1- AC_SUBST_TRACE([PROFILE_FLAGS])
+m4trace:configure.ac:1156: -1- m4_pattern_allow([^PROFILE_FLAGS$])
+m4trace:configure.ac:1158: -1- AC_SUBST([incdir])
+m4trace:configure.ac:1158: -1- AC_SUBST_TRACE([incdir])
+m4trace:configure.ac:1158: -1- m4_pattern_allow([^incdir$])
+m4trace:configure.ac:1159: -1- AC_SUBST([BUILD_DIR])
+m4trace:configure.ac:1159: -1- AC_SUBST_TRACE([BUILD_DIR])
+m4trace:configure.ac:1159: -1- m4_pattern_allow([^BUILD_DIR$])
+m4trace:configure.ac:1162: -1- AC_SUBST([datarootdir])
+m4trace:configure.ac:1162: -1- AC_SUBST_TRACE([datarootdir])
+m4trace:configure.ac:1162: -1- m4_pattern_allow([^datarootdir$])
+m4trace:configure.ac:1163: -1- AC_SUBST([localedir])
+m4trace:configure.ac:1163: -1- AC_SUBST_TRACE([localedir])
+m4trace:configure.ac:1163: -1- m4_pattern_allow([^localedir$])
+m4trace:configure.ac:1165: -1- AC_SUBST([YACC])
+m4trace:configure.ac:1165: -1- AC_SUBST_TRACE([YACC])
+m4trace:configure.ac:1165: -1- m4_pattern_allow([^YACC$])
+m4trace:configure.ac:1166: -1- AC_SUBST([AR])
+m4trace:configure.ac:1166: -1- AC_SUBST_TRACE([AR])
+m4trace:configure.ac:1166: -1- m4_pattern_allow([^AR$])
+m4trace:configure.ac:1167: -1- AC_SUBST([ARFLAGS])
+m4trace:configure.ac:1167: -1- AC_SUBST_TRACE([ARFLAGS])
+m4trace:configure.ac:1167: -1- m4_pattern_allow([^ARFLAGS$])
+m4trace:configure.ac:1169: -1- AC_SUBST([BASHVERS])
+m4trace:configure.ac:1169: -1- AC_SUBST_TRACE([BASHVERS])
+m4trace:configure.ac:1169: -1- m4_pattern_allow([^BASHVERS$])
+m4trace:configure.ac:1170: -1- AC_SUBST([RELSTATUS])
+m4trace:configure.ac:1170: -1- AC_SUBST_TRACE([RELSTATUS])
+m4trace:configure.ac:1170: -1- m4_pattern_allow([^RELSTATUS$])
+m4trace:configure.ac:1171: -1- AC_SUBST([DEBUG])
+m4trace:configure.ac:1171: -1- AC_SUBST_TRACE([DEBUG])
+m4trace:configure.ac:1171: -1- m4_pattern_allow([^DEBUG$])
+m4trace:configure.ac:1172: -1- AC_SUBST([MALLOC_DEBUG])
+m4trace:configure.ac:1172: -1- AC_SUBST_TRACE([MALLOC_DEBUG])
+m4trace:configure.ac:1172: -1- m4_pattern_allow([^MALLOC_DEBUG$])
+m4trace:configure.ac:1174: -1- AC_SUBST([host_cpu])
+m4trace:configure.ac:1174: -1- AC_SUBST_TRACE([host_cpu])
+m4trace:configure.ac:1174: -1- m4_pattern_allow([^host_cpu$])
+m4trace:configure.ac:1175: -1- AC_SUBST([host_vendor])
+m4trace:configure.ac:1175: -1- AC_SUBST_TRACE([host_vendor])
+m4trace:configure.ac:1175: -1- m4_pattern_allow([^host_vendor$])
+m4trace:configure.ac:1176: -1- AC_SUBST([host_os])
+m4trace:configure.ac:1176: -1- AC_SUBST_TRACE([host_os])
+m4trace:configure.ac:1176: -1- m4_pattern_allow([^host_os$])
+m4trace:configure.ac:1178: -1- AC_SUBST([LOCAL_LIBS])
+m4trace:configure.ac:1178: -1- AC_SUBST_TRACE([LOCAL_LIBS])
+m4trace:configure.ac:1178: -1- m4_pattern_allow([^LOCAL_LIBS$])
+m4trace:configure.ac:1179: -1- AC_SUBST([LOCAL_CFLAGS])
+m4trace:configure.ac:1179: -1- AC_SUBST_TRACE([LOCAL_CFLAGS])
+m4trace:configure.ac:1179: -1- m4_pattern_allow([^LOCAL_CFLAGS$])
+m4trace:configure.ac:1180: -1- AC_SUBST([LOCAL_LDFLAGS])
+m4trace:configure.ac:1180: -1- AC_SUBST_TRACE([LOCAL_LDFLAGS])
+m4trace:configure.ac:1180: -1- m4_pattern_allow([^LOCAL_LDFLAGS$])
+m4trace:configure.ac:1181: -1- AC_SUBST([LOCAL_DEFS])
+m4trace:configure.ac:1181: -1- AC_SUBST_TRACE([LOCAL_DEFS])
+m4trace:configure.ac:1181: -1- m4_pattern_allow([^LOCAL_DEFS$])
+m4trace:configure.ac:1186: -1- AC_CONFIG_FILES([Makefile builtins/Makefile lib/readline/Makefile lib/glob/Makefile \
          lib/intl/Makefile \
          lib/malloc/Makefile lib/sh/Makefile lib/termcap/Makefile \
          lib/tilde/Makefile doc/Makefile support/Makefile po/Makefile.in \
          examples/loadables/Makefile examples/loadables/perl/Makefile])
-m4trace:configure.ac:1180: -1- _m4_warn([obsolete], [AC_OUTPUT should be used without arguments.
+m4trace:configure.ac:1186: -1- _m4_warn([obsolete], [AC_OUTPUT should be used without arguments.
 You should run autoupdate.], [])
-m4trace:configure.ac:1180: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs])
-m4trace:configure.ac:1180: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
-m4trace:configure.ac:1180: -1- m4_pattern_allow([^LIB@&t@OBJS$])
-m4trace:configure.ac:1180: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs])
-m4trace:configure.ac:1180: -1- AC_SUBST_TRACE([LTLIBOBJS])
-m4trace:configure.ac:1180: -1- m4_pattern_allow([^LTLIBOBJS$])
-m4trace:configure.ac:1180: -1- AC_SUBST_TRACE([top_builddir])
-m4trace:configure.ac:1180: -1- AC_SUBST_TRACE([top_build_prefix])
-m4trace:configure.ac:1180: -1- AC_SUBST_TRACE([srcdir])
-m4trace:configure.ac:1180: -1- AC_SUBST_TRACE([abs_srcdir])
-m4trace:configure.ac:1180: -1- AC_SUBST_TRACE([top_srcdir])
-m4trace:configure.ac:1180: -1- AC_SUBST_TRACE([abs_top_srcdir])
-m4trace:configure.ac:1180: -1- AC_SUBST_TRACE([builddir])
-m4trace:configure.ac:1180: -1- AC_SUBST_TRACE([abs_builddir])
-m4trace:configure.ac:1180: -1- AC_SUBST_TRACE([abs_top_builddir])
-m4trace:configure.ac:1180: -1- AC_SUBST_TRACE([INSTALL])
+m4trace:configure.ac:1186: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs])
+m4trace:configure.ac:1186: -1- AC_SUBST_TRACE([LIB@&t@OBJS])
+m4trace:configure.ac:1186: -1- m4_pattern_allow([^LIB@&t@OBJS$])
+m4trace:configure.ac:1186: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs])
+m4trace:configure.ac:1186: -1- AC_SUBST_TRACE([LTLIBOBJS])
+m4trace:configure.ac:1186: -1- m4_pattern_allow([^LTLIBOBJS$])
+m4trace:configure.ac:1186: -1- AC_SUBST_TRACE([top_builddir])
+m4trace:configure.ac:1186: -1- AC_SUBST_TRACE([top_build_prefix])
+m4trace:configure.ac:1186: -1- AC_SUBST_TRACE([srcdir])
+m4trace:configure.ac:1186: -1- AC_SUBST_TRACE([abs_srcdir])
+m4trace:configure.ac:1186: -1- AC_SUBST_TRACE([top_srcdir])
+m4trace:configure.ac:1186: -1- AC_SUBST_TRACE([abs_top_srcdir])
+m4trace:configure.ac:1186: -1- AC_SUBST_TRACE([builddir])
+m4trace:configure.ac:1186: -1- AC_SUBST_TRACE([abs_builddir])
+m4trace:configure.ac:1186: -1- AC_SUBST_TRACE([abs_top_builddir])
+m4trace:configure.ac:1186: -1- AC_SUBST_TRACE([INSTALL])
index 67a6e5148768f2fe3226e86f24a61ea8196674fb..8933a3bb1a0a8097cfffb0d11448eb1a5b2adbe0 100644 (file)
@@ -255,8 +255,13 @@ int force_fignore = 1;
 int dircomplete_spelling = 0;
 
 /* Expand directory names during word/filename completion. */
+#if DIRCOMPLETE_EXPAND_DEFAULT
+int dircomplete_expand = 1;
+int dircomplete_expand_relpath = 1;
+#else
 int dircomplete_expand = 0;
 int dircomplete_expand_relpath = 0;
+#endif
 
 /* When non-zero, perform `normal' shell quoting on completed filenames
    even when the completed name contains a directory name with a shell
index b9f7f9c4136354c3061e1bd5499250e32abebd49..6a42e16637e42e4398847f983c7a7f196cea0be1 100644 (file)
    memory contents on malloc() and free(). */
 #undef MEMSCRAMBLE
 
-/* Define AFS if you are using Transarc's AFS. */
-#undef AFS
-
 /* Define for case-modifying variable attributes; variables modified on
    assignment */
 #undef CASEMOD_ATTRS
 /* Define for case-modifying word expansions */
 #undef CASEMOD_EXPANSIONS
 
+/* Define to make the `direxpand' shopt option enabled by default. */
+#undef DIRCOMPLETE_EXPAND_DEFAULT
+
+/* Define AFS if you are using Transarc's AFS. */
+#undef AFS
+
 #undef ENABLE_NLS
 
 /* End of configuration settings controllable by autoconf. */
index 101be4e1c51b16cbcca73d06c5281a23ee39d094..a40e9aa208b78612ac2eb6bd8f87cf98bba55ae0 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,5 +1,5 @@
 #! /bin/sh
-# From configure.ac for Bash 4.2, version 4.050.
+# From configure.ac for Bash 4.2, version 4.052.
 # Guess values for system-dependent variables and create Makefiles.
 # Generated by GNU Autoconf 2.68 for bash 4.2-maint.
 #
@@ -783,6 +783,7 @@ enable_cond_command
 enable_cond_regexp
 enable_coprocesses
 enable_debugger
+enable_direxpand_default
 enable_directory_stack
 enable_disabled_builtins
 enable_dparen_arithmetic
@@ -1466,6 +1467,8 @@ Optional Features:
   --enable-coprocesses    enable coprocess support and the coproc reserved
                           word
   --enable-debugger       enable support for bash debugger
+  --enable-direxpand-default
+                          enable the direxpand shell option by default
   --enable-directory-stack
                           enable builtins pushd/popd/dirs
   --enable-disabled-builtins
@@ -2837,6 +2840,7 @@ sparc-linux*)     opt_bash_malloc=no ;;   # sparc running linux; requires ELF
 *-beos*)       opt_bash_malloc=no ;;   # they say it's suitable
 *-cygwin*)     opt_bash_malloc=no ;;   # Cygnus's CYGWIN environment
 *-opennt*|*-interix*)  opt_bash_malloc=no ;;   # Interix, now owned by Microsoft
+*-nsk*)                opt_bash_malloc=no ;;   # HP NonStop
 esac
 
 # memory scrambling on free()
@@ -2967,6 +2971,7 @@ opt_single_longdoc_strings=yes
 opt_casemod_attrs=yes
 opt_casemod_expansions=yes
 opt_extglob_default=no
+opt_dircomplete_expand_default=no
 
 opt_static_link=no
 opt_profiling=no
@@ -3049,6 +3054,11 @@ if test "${enable_debugger+set}" = set; then :
   enableval=$enable_debugger; opt_debugger=$enableval
 fi
 
+# Check whether --enable-direxpand-default was given.
+if test "${enable_direxpand_default+set}" = set; then :
+  enableval=$enable_direxpand_default; opt_dircomplete_expand_default=$enableval
+fi
+
 # Check whether --enable-directory-stack was given.
 if test "${enable_directory_stack+set}" = set; then :
   enableval=$enable_directory_stack; opt_dirstack=$enableval
@@ -3284,6 +3294,10 @@ fi
 if test $opt_casemod_expansions = yes; then
 $as_echo "#define CASEMOD_EXPANSIONS 1" >>confdefs.h
 
+fi
+if test $opt_dircomplete_expand_default = yes; then
+$as_echo "#define DIRCOMPLETE_EXPAND_DEFAULT 1" >>confdefs.h
+
 fi
 
 if test $opt_memscramble = yes; then
index 7b60cb0a48dc552c5cfc2fa09fec110c2fed7404..f3d54f935bf26bf63b12aeb99dcba42289fa55a6 100644 (file)
@@ -21,7 +21,7 @@ dnl Process this file with autoconf to produce a configure script.
 #   You should have received a copy of the GNU General Public License
 #   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-AC_REVISION([for Bash 4.2, version 4.050])dnl
+AC_REVISION([for Bash 4.2, version 4.052])dnl
 
 define(bashvers, 4.2)
 define(relstatus, maint)
@@ -89,6 +89,7 @@ sparc-linux*) opt_bash_malloc=no ;;   # sparc running linux; requires ELF
 *-beos*)       opt_bash_malloc=no ;;   # they say it's suitable
 *-cygwin*)     opt_bash_malloc=no ;;   # Cygnus's CYGWIN environment
 *-opennt*|*-interix*)  opt_bash_malloc=no ;;   # Interix, now owned by Microsoft
+*-nsk*)                opt_bash_malloc=no ;;   # HP NonStop
 esac
 
 # memory scrambling on free()
@@ -188,6 +189,7 @@ opt_single_longdoc_strings=yes
 opt_casemod_attrs=yes
 opt_casemod_expansions=yes
 opt_extglob_default=no
+opt_dircomplete_expand_default=no
 
 dnl options that affect how bash is compiled and linked
 opt_static_link=no
@@ -222,6 +224,7 @@ AC_ARG_ENABLE(cond-command, AC_HELP_STRING([--enable-cond-command], [enable the
 AC_ARG_ENABLE(cond-regexp, AC_HELP_STRING([--enable-cond-regexp], [enable extended regular expression matching in conditional commands]), opt_cond_regexp=$enableval)
 AC_ARG_ENABLE(coprocesses, AC_HELP_STRING([--enable-coprocesses], [enable coprocess support and the coproc reserved word]), opt_coproc=$enableval)
 AC_ARG_ENABLE(debugger, AC_HELP_STRING([--enable-debugger], [enable support for bash debugger]), opt_debugger=$enableval)
+AC_ARG_ENABLE(direxpand-default, AC_HELP_STRING([--enable-direxpand-default], [enable the direxpand shell option by default]), opt_dircomplete_expand_default=$enableval)
 AC_ARG_ENABLE(directory-stack, AC_HELP_STRING([--enable-directory-stack], [enable builtins pushd/popd/dirs]), opt_dirstack=$enableval)
 AC_ARG_ENABLE(disabled-builtins, AC_HELP_STRING([--enable-disabled-builtins], [allow disabled builtins to still be invoked]), opt_disabled_builtins=$enableval)
 AC_ARG_ENABLE(dparen-arithmetic, AC_HELP_STRING([--enable-dparen-arithmetic], [include ((...)) command]), opt_dparen_arith=$enableval)
@@ -341,6 +344,9 @@ fi
 if test $opt_casemod_expansions = yes; then
 AC_DEFINE(CASEMOD_EXPANSIONS)
 fi
+if test $opt_dircomplete_expand_default = yes; then
+AC_DEFINE(DIRCOMPLETE_EXPAND_DEFAULT)
+fi
 
 if test $opt_memscramble = yes; then
 AC_DEFINE(MEMSCRAMBLE)
index fa21eb1238baae7d6cdc5c43112595bf47ce793c..315f4bdced09e439a380471bef133d96d272d6c9 100644 (file)
@@ -7955,6 +7955,11 @@ Include support for coprocesses and the @code{coproc} reserved word
 @item --enable-debugger
 Include support for the bash debugger (distributed separately).
 
+@item --enable-direxpand-default
+Cause the @code{direxpand} shell option (@pxref{The Shopt Builtin})
+to be enabled by default when the shell starts.
+It is normally disabled by default.
+
 @item --enable-directory-stack
 Include support for a @code{csh}-like directory stack and the
 @code{pushd}, @code{popd}, and @code{dirs} builtins
index 4b72d5d782bd5edb8ea1e0965d4ebb76ee945f90..0b8c3d0c36b0055f92da76ac4e2f106732aefc52 100644 (file)
@@ -2,15 +2,9 @@
 Copyright (C) 1988-2012 Free Software Foundation, Inc.
 @end ignore
 
-@set LASTCHANGE Tue Aug 28 17:19:20 EDT 2012
+@set LASTCHANGE Thu Sep 13 17:12:28 EDT 2012
 
 @set EDITION 4.2
 @set VERSION 4.2
-@set UPDATED 28 August 2012
-@set UPDATED-MONTH August 2012
-
-
-
-
-
-
+@set UPDATED 13 September 2012
+@set UPDATED-MONTH September 2012
index acc5318e564384f6c5ab62691252d405c1f65b1a..55f7f51c51421fa6f68a06547b65b4bfcbaf3cab 100644 (file)
@@ -698,7 +698,7 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
   if (variable_context != 0)
     {
       ofifo = num_fifos ();
-      ofifo_list = copy_fifo_list (&osize);
+      ofifo_list = copy_fifo_list ((int *)&osize);
       saved_fifo = 1;
     }
   else
@@ -1017,7 +1017,7 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
     {
       nfifo = num_fifos ();
       if (nfifo > ofifo)
-       close_new_fifos (ofifo_list, osize);
+       close_new_fifos ((char *)ofifo_list, osize);
       free (ofifo_list);
     }
 #endif
diff --git a/execute_cmd.c~ b/execute_cmd.c~
new file mode 100644 (file)
index 0000000..acc5318
--- /dev/null
@@ -0,0 +1,5363 @@
+/* execute_cmd.c -- Execute a COMMAND structure. */
+
+/* Copyright (C) 1987-2012 Free Software Foundation, Inc.
+
+   This file is part of GNU Bash, the Bourne Again SHell.
+
+   Bash is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   Bash is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with Bash.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "config.h"
+
+#if !defined (__GNUC__) && !defined (HAVE_ALLOCA_H) && defined (_AIX)
+  #pragma alloca
+#endif /* _AIX && RISC6000 && !__GNUC__ */
+
+#include <stdio.h>
+#include "chartypes.h"
+#include "bashtypes.h"
+#if !defined (_MINIX) && defined (HAVE_SYS_FILE_H)
+#  include <sys/file.h>
+#endif
+#include "filecntl.h"
+#include "posixstat.h"
+#include <signal.h>
+#if defined (HAVE_SYS_PARAM_H)
+#  include <sys/param.h>
+#endif
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif
+
+#include "posixtime.h"
+
+#if defined (HAVE_SYS_RESOURCE_H) && !defined (RLIMTYPE)
+#  include <sys/resource.h>
+#endif
+
+#if defined (HAVE_SYS_TIMES_H) && defined (HAVE_TIMES)
+#  include <sys/times.h>
+#endif
+
+#include <errno.h>
+
+#if !defined (errno)
+extern int errno;
+#endif
+
+#define NEED_FPURGE_DECL
+
+#include "bashansi.h"
+#include "bashintl.h"
+
+#include "memalloc.h"
+#include "shell.h"
+#include <y.tab.h>     /* use <...> so we pick it up from the build directory */
+#include "flags.h"
+#include "builtins.h"
+#include "hashlib.h"
+#include "jobs.h"
+#include "execute_cmd.h"
+#include "findcmd.h"
+#include "redir.h"
+#include "trap.h"
+#include "pathexp.h"
+#include "hashcmd.h"
+
+#if defined (COND_COMMAND)
+#  include "test.h"
+#endif
+
+#include "builtins/common.h"
+#include "builtins/builtext.h" /* list of builtins */
+
+#include <glob/strmatch.h>
+#include <tilde/tilde.h>
+
+#if defined (BUFFERED_INPUT)
+#  include "input.h"
+#endif
+
+#if defined (ALIAS)
+#  include "alias.h"
+#endif
+
+#if defined (HISTORY)
+#  include "bashhist.h"
+#endif
+
+extern int dollar_dollar_pid;
+extern int posixly_correct;
+extern int expand_aliases;
+extern int autocd;
+extern int breaking, continuing, loop_level;
+extern int parse_and_execute_level, running_trap, sourcelevel;
+extern int command_string_index, line_number;
+extern int dot_found_in_search;
+extern int already_making_children;
+extern int tempenv_assign_error;
+extern char *the_printed_command, *shell_name;
+extern pid_t last_command_subst_pid;
+extern sh_builtin_func_t *last_shell_builtin, *this_shell_builtin;
+extern char **subshell_argv, **subshell_envp;
+extern int subshell_argc;
+extern time_t shell_start_time;
+#if 0
+extern char *glob_argv_flags;
+#endif
+
+extern int job_control;        /* XXX */
+
+extern int close __P((int));
+
+/* Static functions defined and used in this file. */
+static void close_pipes __P((int, int));
+static void do_piping __P((int, int));
+static void bind_lastarg __P((char *));
+static int shell_control_structure __P((enum command_type));
+static void cleanup_redirects __P((REDIRECT *));
+
+#if defined (JOB_CONTROL)
+static int restore_signal_mask __P((sigset_t *));
+#endif
+
+static void async_redirect_stdin __P((void));
+
+static int builtin_status __P((int));
+
+static int execute_for_command __P((FOR_COM *));
+#if defined (SELECT_COMMAND)
+static int displen __P((const char *));
+static int print_index_and_element __P((int, int, WORD_LIST *));
+static void indent __P((int, int));
+static void print_select_list __P((WORD_LIST *, int, int, int));
+static char *select_query __P((WORD_LIST *, int, char *, int));
+static int execute_select_command __P((SELECT_COM *));
+#endif
+#if defined (DPAREN_ARITHMETIC)
+static int execute_arith_command __P((ARITH_COM *));
+#endif
+#if defined (COND_COMMAND)
+static int execute_cond_node __P((COND_COM *));
+static int execute_cond_command __P((COND_COM *));
+#endif
+#if defined (COMMAND_TIMING)
+static int mkfmt __P((char *, int, int, time_t, int));
+static void print_formatted_time __P((FILE *, char *,
+                                     time_t, int, time_t, int,
+                                     time_t, int, int));
+static int time_command __P((COMMAND *, int, int, int, struct fd_bitmap *));
+#endif
+#if defined (ARITH_FOR_COMMAND)
+static intmax_t eval_arith_for_expr __P((WORD_LIST *, int *));
+static int execute_arith_for_command __P((ARITH_FOR_COM *));
+#endif
+static int execute_case_command __P((CASE_COM *));
+static int execute_while_command __P((WHILE_COM *));
+static int execute_until_command __P((WHILE_COM *));
+static int execute_while_or_until __P((WHILE_COM *, int));
+static int execute_if_command __P((IF_COM *));
+static int execute_null_command __P((REDIRECT *, int, int, int));
+static void fix_assignment_words __P((WORD_LIST *));
+static int execute_simple_command __P((SIMPLE_COM *, int, int, int, struct fd_bitmap *));
+static int execute_builtin __P((sh_builtin_func_t *, WORD_LIST *, int, int));
+static int execute_function __P((SHELL_VAR *, WORD_LIST *, int, struct fd_bitmap *, int, int));
+static int execute_builtin_or_function __P((WORD_LIST *, sh_builtin_func_t *,
+                                           SHELL_VAR *,
+                                           REDIRECT *, struct fd_bitmap *, int));
+static void execute_subshell_builtin_or_function __P((WORD_LIST *, REDIRECT *,
+                                                     sh_builtin_func_t *,
+                                                     SHELL_VAR *,
+                                                     int, int, int,
+                                                     struct fd_bitmap *,
+                                                     int));
+static int execute_disk_command __P((WORD_LIST *, REDIRECT *, char *,
+                                     int, int, int, struct fd_bitmap *, int));
+
+static char *getinterp __P((char *, int, int *));
+static void initialize_subshell __P((void));
+static int execute_in_subshell __P((COMMAND *, int, int, int, struct fd_bitmap *));
+#if defined (COPROCESS_SUPPORT)
+static int execute_coproc __P((COMMAND *, int, int, struct fd_bitmap *));
+#endif
+
+static int execute_pipeline __P((COMMAND *, int, int, int, struct fd_bitmap *));
+
+static int execute_connection __P((COMMAND *, int, int, int, struct fd_bitmap *));
+
+static int execute_intern_function __P((WORD_DESC *, FUNCTION_DEF *));
+
+/* Set to 1 if fd 0 was the subject of redirection to a subshell.  Global
+   so that reader_loop can set it to zero before executing a command. */
+int stdin_redir;
+
+/* The name of the command that is currently being executed.
+   `test' needs this, for example. */
+char *this_command_name;
+
+/* The printed representation of the currently-executing command (same as
+   the_printed_command), except when a trap is being executed.  Useful for
+   a debugger to know where exactly the program is currently executing. */
+char *the_printed_command_except_trap;
+
+/* For catching RETURN in a function. */
+int return_catch_flag;
+int return_catch_value;
+procenv_t return_catch;
+
+/* The value returned by the last synchronous command. */
+int last_command_exit_value;
+
+/* Whether or not the last command (corresponding to last_command_exit_value)
+   was terminated by a signal, and, if so, which one. */
+int last_command_exit_signal;
+
+/* The list of redirections to perform which will undo the redirections
+   that I made in the shell. */
+REDIRECT *redirection_undo_list = (REDIRECT *)NULL;
+
+/* The list of redirections to perform which will undo the internal
+   redirections performed by the `exec' builtin.  These are redirections
+   that must be undone even when exec discards redirection_undo_list. */
+REDIRECT *exec_redirection_undo_list = (REDIRECT *)NULL;
+
+/* When greater than zero, value is the `level' of builtins we are
+   currently executing (e.g. `eval echo a' would have it set to 2). */
+int executing_builtin = 0;
+
+/* Non-zero if we are executing a command list (a;b;c, etc.) */
+int executing_list = 0;
+
+/* Non-zero if failing commands in a command substitution should not exit the
+   shell even if -e is set.  Used to pass the CMD_IGNORE_RETURN flag down to
+   commands run in command substitutions by parse_and_execute. */
+int comsub_ignore_return = 0;
+
+/* Non-zero if we have just forked and are currently running in a subshell
+   environment. */
+int subshell_environment;
+
+/* Count of nested subshells, like SHLVL.  Available via $BASH_SUBSHELL */
+int subshell_level = 0;
+
+/* Currently-executing shell function. */
+SHELL_VAR *this_shell_function;
+
+/* If non-zero, matches in case and [[ ... ]] are case-insensitive */
+int match_ignore_case = 0;
+
+int executing_command_builtin = 0;
+
+struct stat SB;                /* used for debugging */
+
+static int special_builtin_failed;
+
+static COMMAND *currently_executing_command;
+
+/* The line number that the currently executing function starts on. */
+static int function_line_number;
+
+/* XXX - set to 1 if we're running the DEBUG trap and we want to show the line
+   number containing the function name.  Used by executing_line_number to
+   report the correct line number.  Kind of a hack. */
+static int showing_function_line;
+
+/* $LINENO ($BASH_LINENO) for use by an ERR trap.  Global so parse_and_execute
+   can save and restore it. */
+int line_number_for_err_trap;
+
+/* A sort of function nesting level counter */
+int funcnest = 0;
+int funcnest_max = 0;          /* XXX - bash-4.2 */
+
+int lastpipe_opt = 0;
+
+struct fd_bitmap *current_fds_to_close = (struct fd_bitmap *)NULL;
+
+#define FD_BITMAP_DEFAULT_SIZE 32
+
+/* Functions to allocate and deallocate the structures used to pass
+   information from the shell to its children about file descriptors
+   to close. */
+struct fd_bitmap *
+new_fd_bitmap (size)
+     int size;
+{
+  struct fd_bitmap *ret;
+
+  ret = (struct fd_bitmap *)xmalloc (sizeof (struct fd_bitmap));
+
+  ret->size = size;
+
+  if (size)
+    {
+      ret->bitmap = (char *)xmalloc (size);
+      memset (ret->bitmap, '\0', size);
+    }
+  else
+    ret->bitmap = (char *)NULL;
+  return (ret);
+}
+
+void
+dispose_fd_bitmap (fdbp)
+     struct fd_bitmap *fdbp;
+{
+  FREE (fdbp->bitmap);
+  free (fdbp);
+}
+
+void
+close_fd_bitmap (fdbp)
+     struct fd_bitmap *fdbp;
+{
+  register int i;
+
+  if (fdbp)
+    {
+      for (i = 0; i < fdbp->size; i++)
+       if (fdbp->bitmap[i])
+         {
+           close (i);
+           fdbp->bitmap[i] = 0;
+         }
+    }
+}
+
+/* Return the line number of the currently executing command. */
+int
+executing_line_number ()
+{
+  if (executing && showing_function_line == 0 &&
+      (variable_context == 0 || interactive_shell == 0) &&
+      currently_executing_command)
+    {
+#if defined (COND_COMMAND)
+      if (currently_executing_command->type == cm_cond)
+       return currently_executing_command->value.Cond->line;
+#endif
+#if defined (DPAREN_ARITHMETIC)
+      else if (currently_executing_command->type == cm_arith)
+       return currently_executing_command->value.Arith->line;
+#endif
+#if defined (ARITH_FOR_COMMAND)
+      else if (currently_executing_command->type == cm_arith_for)
+       return currently_executing_command->value.ArithFor->line;
+#endif
+
+       return line_number;
+    }
+  else
+    return line_number;
+}
+
+/* Execute the command passed in COMMAND.  COMMAND is exactly what
+   read_command () places into GLOBAL_COMMAND.  See "command.h" for the
+   details of the command structure.
+
+   EXECUTION_SUCCESS or EXECUTION_FAILURE are the only possible
+   return values.  Executing a command with nothing in it returns
+   EXECUTION_SUCCESS. */
+int
+execute_command (command)
+     COMMAND *command;
+{
+  struct fd_bitmap *bitmap;
+  int result;
+
+  current_fds_to_close = (struct fd_bitmap *)NULL;
+  bitmap = new_fd_bitmap (FD_BITMAP_DEFAULT_SIZE);
+  begin_unwind_frame ("execute-command");
+  add_unwind_protect (dispose_fd_bitmap, (char *)bitmap);
+
+  /* Just do the command, but not asynchronously. */
+  result = execute_command_internal (command, 0, NO_PIPE, NO_PIPE, bitmap);
+
+  dispose_fd_bitmap (bitmap);
+  discard_unwind_frame ("execute-command");
+
+#if defined (PROCESS_SUBSTITUTION)
+  /* don't unlink fifos if we're in a shell function; wait until the function
+     returns. */
+  if (variable_context == 0)
+    unlink_fifo_list ();
+#endif /* PROCESS_SUBSTITUTION */
+
+  QUIT;
+  return (result);
+}
+
+/* Return 1 if TYPE is a shell control structure type. */
+static int
+shell_control_structure (type)
+     enum command_type type;
+{
+  switch (type)
+    {
+#if defined (ARITH_FOR_COMMAND)
+    case cm_arith_for:
+#endif
+#if defined (SELECT_COMMAND)
+    case cm_select:
+#endif
+#if defined (DPAREN_ARITHMETIC)
+    case cm_arith:
+#endif
+#if defined (COND_COMMAND)
+    case cm_cond:
+#endif
+    case cm_case:
+    case cm_while:
+    case cm_until:
+    case cm_if:
+    case cm_for:
+    case cm_group:
+    case cm_function_def:
+      return (1);
+
+    default:
+      return (0);
+    }
+}
+
+/* A function to use to unwind_protect the redirection undo list
+   for loops. */
+static void
+cleanup_redirects (list)
+     REDIRECT *list;
+{
+  do_redirections (list, RX_ACTIVE);
+  dispose_redirects (list);
+}
+
+#if 0
+/* Function to unwind_protect the redirections for functions and builtins. */
+static void
+cleanup_func_redirects (list)
+     REDIRECT *list;
+{
+  do_redirections (list, RX_ACTIVE);
+}
+#endif
+
+void
+dispose_exec_redirects ()
+{
+  if (exec_redirection_undo_list)
+    {
+      dispose_redirects (exec_redirection_undo_list);
+      exec_redirection_undo_list = (REDIRECT *)NULL;
+    }
+}
+
+#if defined (JOB_CONTROL)
+/* A function to restore the signal mask to its proper value when the shell
+   is interrupted or errors occur while creating a pipeline. */
+static int
+restore_signal_mask (set)
+     sigset_t *set;
+{
+  return (sigprocmask (SIG_SETMASK, set, (sigset_t *)NULL));
+}
+#endif /* JOB_CONTROL */
+
+#ifdef DEBUG
+/* A debugging function that can be called from gdb, for instance. */
+void
+open_files ()
+{
+  register int i;
+  int f, fd_table_size;
+
+  fd_table_size = getdtablesize ();
+
+  fprintf (stderr, "pid %ld open files:", (long)getpid ());
+  for (i = 3; i < fd_table_size; i++)
+    {
+      if ((f = fcntl (i, F_GETFD, 0)) != -1)
+       fprintf (stderr, " %d (%s)", i, f ? "close" : "open");
+    }
+  fprintf (stderr, "\n");
+}
+#endif
+
+static void
+async_redirect_stdin ()
+{
+  int fd;
+
+  fd = open ("/dev/null", O_RDONLY);
+  if (fd > 0)
+    {
+      dup2 (fd, 0);
+      close (fd);
+    }
+  else if (fd < 0)
+    internal_error (_("cannot redirect standard input from /dev/null: %s"), strerror (errno));
+}
+
+#define DESCRIBE_PID(pid) do { if (interactive) describe_pid (pid); } while (0)
+
+/* Execute the command passed in COMMAND, perhaps doing it asynchrounously.
+   COMMAND is exactly what read_command () places into GLOBAL_COMMAND.
+   ASYNCHROUNOUS, if non-zero, says to do this command in the background.
+   PIPE_IN and PIPE_OUT are file descriptors saying where input comes
+   from and where it goes.  They can have the value of NO_PIPE, which means
+   I/O is stdin/stdout.
+   FDS_TO_CLOSE is a list of file descriptors to close once the child has
+   been forked.  This list often contains the unusable sides of pipes, etc.
+
+   EXECUTION_SUCCESS or EXECUTION_FAILURE are the only possible
+   return values.  Executing a command with nothing in it returns
+   EXECUTION_SUCCESS. */
+int
+execute_command_internal (command, asynchronous, pipe_in, pipe_out,
+                         fds_to_close)
+     COMMAND *command;
+     int asynchronous;
+     int pipe_in, pipe_out;
+     struct fd_bitmap *fds_to_close;
+{
+  int exec_result, user_subshell, invert, ignore_return, was_error_trap;
+  REDIRECT *my_undo_list, *exec_undo_list;
+  volatile int last_pid;
+  volatile int save_line_number;
+#if defined (PROCESS_SUBSTITUTION)
+  volatile int ofifo, nfifo, osize, saved_fifo;
+  volatile char *ofifo_list;
+#endif
+
+  if (breaking || continuing)
+    return (last_command_exit_value);
+  if (command == 0 || read_but_dont_execute)
+    return (EXECUTION_SUCCESS);
+
+  QUIT;
+  run_pending_traps ();
+
+#if 0
+  if (running_trap == 0)
+#endif
+    currently_executing_command = command;
+
+  invert = (command->flags & CMD_INVERT_RETURN) != 0;
+
+  /* If we're inverting the return value and `set -e' has been executed,
+     we don't want a failing command to inadvertently cause the shell
+     to exit. */
+  if (exit_immediately_on_error && invert)     /* XXX */
+    command->flags |= CMD_IGNORE_RETURN;       /* XXX */
+
+  exec_result = EXECUTION_SUCCESS;
+
+  /* If a command was being explicitly run in a subshell, or if it is
+     a shell control-structure, and it has a pipe, then we do the command
+     in a subshell. */
+  if (command->type == cm_subshell && (command->flags & CMD_NO_FORK))
+    return (execute_in_subshell (command, asynchronous, pipe_in, pipe_out, fds_to_close));
+
+#if defined (COPROCESS_SUPPORT)
+  if (command->type == cm_coproc)
+    return (execute_coproc (command, pipe_in, pipe_out, fds_to_close));
+#endif
+
+  user_subshell = command->type == cm_subshell || ((command->flags & CMD_WANT_SUBSHELL) != 0);
+
+  if (command->type == cm_subshell ||
+      (command->flags & (CMD_WANT_SUBSHELL|CMD_FORCE_SUBSHELL)) ||
+      (shell_control_structure (command->type) &&
+       (pipe_out != NO_PIPE || pipe_in != NO_PIPE || asynchronous)))
+    {
+      pid_t paren_pid;
+      int s;
+
+      /* Fork a subshell, turn off the subshell bit, turn off job
+        control and call execute_command () on the command again. */
+      line_number_for_err_trap = line_number;
+      paren_pid = make_child (savestring (make_command_string (command)),
+                             asynchronous);
+
+      if (user_subshell && signal_is_trapped (ERROR_TRAP) && 
+         signal_in_progress (DEBUG_TRAP) == 0 && running_trap == 0)
+       {
+         FREE (the_printed_command_except_trap);
+         the_printed_command_except_trap = savestring (the_printed_command);
+       }
+
+      if (paren_pid == 0)
+        {
+         /* We want to run the exit trap for forced {} subshells, and we
+            want to note this before execute_in_subshell modifies the
+            COMMAND struct.  Need to keep in mind that execute_in_subshell
+            runs the exit trap for () subshells itself. */
+         s = user_subshell == 0 && command->type == cm_group && pipe_in == NO_PIPE && pipe_out == NO_PIPE && asynchronous;
+
+         last_command_exit_value = execute_in_subshell (command, asynchronous, pipe_in, pipe_out, fds_to_close);
+         if (s)
+           subshell_exit (last_command_exit_value);
+         else
+           exit (last_command_exit_value);
+         /* NOTREACHED */
+        }
+      else
+       {
+         close_pipes (pipe_in, pipe_out);
+
+#if defined (PROCESS_SUBSTITUTION) && defined (HAVE_DEV_FD)
+         if (variable_context == 0)    /* wait until shell function completes */
+           unlink_fifo_list ();
+#endif
+         /* If we are part of a pipeline, and not the end of the pipeline,
+            then we should simply return and let the last command in the
+            pipe be waited for.  If we are not in a pipeline, or are the
+            last command in the pipeline, then we wait for the subshell
+            and return its exit status as usual. */
+         if (pipe_out != NO_PIPE)
+           return (EXECUTION_SUCCESS);
+
+         stop_pipeline (asynchronous, (COMMAND *)NULL);
+
+         if (asynchronous == 0)
+           {
+             was_error_trap = signal_is_trapped (ERROR_TRAP) && signal_is_ignored (ERROR_TRAP) == 0;
+             invert = (command->flags & CMD_INVERT_RETURN) != 0;
+             ignore_return = (command->flags & CMD_IGNORE_RETURN) != 0;
+
+             exec_result = wait_for (paren_pid);
+
+             /* If we have to, invert the return value. */
+             if (invert)
+               exec_result = ((exec_result == EXECUTION_SUCCESS)
+                               ? EXECUTION_FAILURE
+                               : EXECUTION_SUCCESS);
+
+             last_command_exit_value = exec_result;
+             if (user_subshell && was_error_trap && ignore_return == 0 && invert == 0 && exec_result != EXECUTION_SUCCESS)
+               {
+                 save_line_number = line_number;
+                 line_number = line_number_for_err_trap;
+                 run_error_trap ();
+                 line_number = save_line_number;
+               }
+
+             if (user_subshell && ignore_return == 0 && invert == 0 && exit_immediately_on_error && exec_result != EXECUTION_SUCCESS)
+               {
+                 run_pending_traps ();
+                 jump_to_top_level (ERREXIT);
+               }
+
+             return (last_command_exit_value);
+           }
+         else
+           {
+             DESCRIBE_PID (paren_pid);
+
+             run_pending_traps ();
+
+             return (EXECUTION_SUCCESS);
+           }
+       }
+    }
+
+#if defined (COMMAND_TIMING)
+  if (command->flags & CMD_TIME_PIPELINE)
+    {
+      if (asynchronous)
+       {
+         command->flags |= CMD_FORCE_SUBSHELL;
+         exec_result = execute_command_internal (command, 1, pipe_in, pipe_out, fds_to_close);
+       }
+      else
+       {
+         exec_result = time_command (command, asynchronous, pipe_in, pipe_out, fds_to_close);
+#if 0
+         if (running_trap == 0)
+#endif
+           currently_executing_command = (COMMAND *)NULL;
+       }
+      return (exec_result);
+    }
+#endif /* COMMAND_TIMING */
+
+  if (shell_control_structure (command->type) && command->redirects)
+    stdin_redir = stdin_redirects (command->redirects);
+
+#if defined (PROCESS_SUBSTITUTION)
+  if (variable_context != 0)
+    {
+      ofifo = num_fifos ();
+      ofifo_list = copy_fifo_list (&osize);
+      saved_fifo = 1;
+    }
+  else
+    saved_fifo = 0;
+#endif
+
+  /* Handle WHILE FOR CASE etc. with redirections.  (Also '&' input
+     redirection.)  */
+  if (do_redirections (command->redirects, RX_ACTIVE|RX_UNDOABLE) != 0)
+    {
+      cleanup_redirects (redirection_undo_list);
+      redirection_undo_list = (REDIRECT *)NULL;
+      dispose_exec_redirects ();
+#if defined (PROCESS_SUBSTITUTION)
+      if (saved_fifo)
+       free (ofifo_list);
+#endif
+      return (last_command_exit_value = EXECUTION_FAILURE);
+    }
+
+  if (redirection_undo_list)
+    {
+      /* XXX - why copy here? */
+      my_undo_list = (REDIRECT *)copy_redirects (redirection_undo_list);
+      dispose_redirects (redirection_undo_list);
+      redirection_undo_list = (REDIRECT *)NULL;
+    }
+  else
+    my_undo_list = (REDIRECT *)NULL;
+
+  if (exec_redirection_undo_list)
+    {
+      /* XXX - why copy here? */
+      exec_undo_list = (REDIRECT *)copy_redirects (exec_redirection_undo_list);
+      dispose_redirects (exec_redirection_undo_list);
+      exec_redirection_undo_list = (REDIRECT *)NULL;
+    }
+  else
+    exec_undo_list = (REDIRECT *)NULL;
+
+  if (my_undo_list || exec_undo_list)
+    begin_unwind_frame ("loop_redirections");
+
+  if (my_undo_list)
+    add_unwind_protect ((Function *)cleanup_redirects, my_undo_list);
+
+  if (exec_undo_list)
+    add_unwind_protect ((Function *)dispose_redirects, exec_undo_list);
+
+  ignore_return = (command->flags & CMD_IGNORE_RETURN) != 0;
+
+  QUIT;
+
+  switch (command->type)
+    {
+    case cm_simple:
+      {
+       save_line_number = line_number;
+       /* We can't rely on variables retaining their values across a
+          call to execute_simple_command if a longjmp occurs as the
+          result of a `return' builtin.  This is true for sure with gcc. */
+#if defined (RECYCLES_PIDS)
+       last_made_pid = NO_PID;
+#endif
+       last_pid = last_made_pid;
+       was_error_trap = signal_is_trapped (ERROR_TRAP) && signal_is_ignored (ERROR_TRAP) == 0;
+
+       if (ignore_return && command->value.Simple)
+         command->value.Simple->flags |= CMD_IGNORE_RETURN;
+       if (command->flags & CMD_STDIN_REDIR)
+         command->value.Simple->flags |= CMD_STDIN_REDIR;
+
+       line_number_for_err_trap = line_number = command->value.Simple->line;
+       exec_result =
+         execute_simple_command (command->value.Simple, pipe_in, pipe_out,
+                                 asynchronous, fds_to_close);
+       line_number = save_line_number;
+
+       /* The temporary environment should be used for only the simple
+          command immediately following its definition. */
+       dispose_used_env_vars ();
+
+#if (defined (ultrix) && defined (mips)) || defined (C_ALLOCA)
+       /* Reclaim memory allocated with alloca () on machines which
+          may be using the alloca emulation code. */
+       (void) alloca (0);
+#endif /* (ultrix && mips) || C_ALLOCA */
+
+       /* If we forked to do the command, then we must wait_for ()
+          the child. */
+
+       /* XXX - this is something to watch out for if there are problems
+          when the shell is compiled without job control.  Don't worry about
+          whether or not last_made_pid == last_pid; already_making_children
+          tells us whether or not there are unwaited-for children to wait
+          for and reap. */
+       if (already_making_children && pipe_out == NO_PIPE)
+         {
+           stop_pipeline (asynchronous, (COMMAND *)NULL);
+
+           if (asynchronous)
+             {
+               DESCRIBE_PID (last_made_pid);
+             }
+           else
+#if !defined (JOB_CONTROL)
+             /* Do not wait for asynchronous processes started from
+                startup files. */
+           if (last_made_pid != last_asynchronous_pid)
+#endif
+           /* When executing a shell function that executes other
+              commands, this causes the last simple command in
+              the function to be waited for twice.  This also causes
+              subshells forked to execute builtin commands (e.g., in
+              pipelines) to be waited for twice. */
+             exec_result = wait_for (last_made_pid);
+         }
+      }
+
+      /* 2009/02/13 -- pipeline failure is processed elsewhere.  This handles
+        only the failure of a simple command. */
+      if (was_error_trap && ignore_return == 0 && invert == 0 && pipe_in == NO_PIPE && pipe_out == NO_PIPE && exec_result != EXECUTION_SUCCESS)
+       {
+         last_command_exit_value = exec_result;
+         line_number = line_number_for_err_trap;
+         run_error_trap ();
+         line_number = save_line_number;
+       }
+
+      if (ignore_return == 0 && invert == 0 &&
+         ((posixly_correct && interactive == 0 && special_builtin_failed) ||
+          (exit_immediately_on_error && pipe_in == NO_PIPE && pipe_out == NO_PIPE && exec_result != EXECUTION_SUCCESS)))
+       {
+         last_command_exit_value = exec_result;
+         run_pending_traps ();
+         jump_to_top_level (ERREXIT);
+       }
+
+      break;
+
+    case cm_for:
+      if (ignore_return)
+       command->value.For->flags |= CMD_IGNORE_RETURN;
+      exec_result = execute_for_command (command->value.For);
+      break;
+
+#if defined (ARITH_FOR_COMMAND)
+    case cm_arith_for:
+      if (ignore_return)
+       command->value.ArithFor->flags |= CMD_IGNORE_RETURN;
+      exec_result = execute_arith_for_command (command->value.ArithFor);
+      break;
+#endif
+
+#if defined (SELECT_COMMAND)
+    case cm_select:
+      if (ignore_return)
+       command->value.Select->flags |= CMD_IGNORE_RETURN;
+      exec_result = execute_select_command (command->value.Select);
+      break;
+#endif
+
+    case cm_case:
+      if (ignore_return)
+       command->value.Case->flags |= CMD_IGNORE_RETURN;
+      exec_result = execute_case_command (command->value.Case);
+      break;
+
+    case cm_while:
+      if (ignore_return)
+       command->value.While->flags |= CMD_IGNORE_RETURN;
+      exec_result = execute_while_command (command->value.While);
+      break;
+
+    case cm_until:
+      if (ignore_return)
+       command->value.While->flags |= CMD_IGNORE_RETURN;
+      exec_result = execute_until_command (command->value.While);
+      break;
+
+    case cm_if:
+      if (ignore_return)
+       command->value.If->flags |= CMD_IGNORE_RETURN;
+      exec_result = execute_if_command (command->value.If);
+      break;
+
+    case cm_group:
+
+      /* This code can be executed from either of two paths: an explicit
+        '{}' command, or via a function call.  If we are executed via a
+        function call, we have already taken care of the function being
+        executed in the background (down there in execute_simple_command ()),
+        and this command should *not* be marked as asynchronous.  If we
+        are executing a regular '{}' group command, and asynchronous == 1,
+        we must want to execute the whole command in the background, so we
+        need a subshell, and we want the stuff executed in that subshell
+        (this group command) to be executed in the foreground of that
+        subshell (i.e. there will not be *another* subshell forked).
+
+        What we do is to force a subshell if asynchronous, and then call
+        execute_command_internal again with asynchronous still set to 1,
+        but with the original group command, so the printed command will
+        look right.
+
+        The code above that handles forking off subshells will note that
+        both subshell and async are on, and turn off async in the child
+        after forking the subshell (but leave async set in the parent, so
+        the normal call to describe_pid is made).  This turning off
+        async is *crucial*; if it is not done, this will fall into an
+        infinite loop of executions through this spot in subshell after
+        subshell until the process limit is exhausted. */
+
+      if (asynchronous)
+       {
+         command->flags |= CMD_FORCE_SUBSHELL;
+         exec_result =
+           execute_command_internal (command, 1, pipe_in, pipe_out,
+                                     fds_to_close);
+       }
+      else
+       {
+         if (ignore_return && command->value.Group->command)
+           command->value.Group->command->flags |= CMD_IGNORE_RETURN;
+         exec_result =
+           execute_command_internal (command->value.Group->command,
+                                     asynchronous, pipe_in, pipe_out,
+                                     fds_to_close);
+       }
+      break;
+
+    case cm_connection:
+      exec_result = execute_connection (command, asynchronous,
+                                       pipe_in, pipe_out, fds_to_close);
+      break;
+
+#if defined (DPAREN_ARITHMETIC)
+    case cm_arith:
+      was_error_trap = signal_is_trapped (ERROR_TRAP) && signal_is_ignored (ERROR_TRAP) == 0;
+      if (ignore_return)
+       command->value.Arith->flags |= CMD_IGNORE_RETURN;
+      line_number_for_err_trap = save_line_number = line_number;
+      exec_result = execute_arith_command (command->value.Arith);
+      line_number = save_line_number;
+
+      if (was_error_trap && ignore_return == 0 && invert == 0 && exec_result != EXECUTION_SUCCESS)
+       {
+         last_command_exit_value = exec_result;
+         save_line_number = line_number;
+         line_number = line_number_for_err_trap;
+         run_error_trap ();
+         line_number = save_line_number;
+       }
+
+      if (ignore_return == 0 && invert == 0 && exit_immediately_on_error && exec_result != EXECUTION_SUCCESS)
+       {
+         last_command_exit_value = exec_result;
+         run_pending_traps ();
+         jump_to_top_level (ERREXIT);
+       }
+
+      break;
+#endif
+
+#if defined (COND_COMMAND)
+    case cm_cond:
+      was_error_trap = signal_is_trapped (ERROR_TRAP) && signal_is_ignored (ERROR_TRAP) == 0;
+      if (ignore_return)
+       command->value.Cond->flags |= CMD_IGNORE_RETURN;
+
+      line_number_for_err_trap = save_line_number = line_number;
+      exec_result = execute_cond_command (command->value.Cond);
+      line_number = save_line_number;
+
+      if (was_error_trap && ignore_return == 0 && invert == 0 && exec_result != EXECUTION_SUCCESS)
+       {
+         last_command_exit_value = exec_result;
+         save_line_number = line_number;
+         line_number = line_number_for_err_trap;
+         run_error_trap ();
+         line_number = save_line_number;
+       }
+
+      if (ignore_return == 0 && invert == 0 && exit_immediately_on_error && exec_result != EXECUTION_SUCCESS)
+       {
+         last_command_exit_value = exec_result;
+         run_pending_traps ();
+         jump_to_top_level (ERREXIT);
+       }
+
+      break;
+#endif
+    
+    case cm_function_def:
+      exec_result = execute_intern_function (command->value.Function_def->name,
+                                            command->value.Function_def);
+      break;
+
+    default:
+      command_error ("execute_command", CMDERR_BADTYPE, command->type, 0);
+    }
+
+  if (my_undo_list)
+    {
+      do_redirections (my_undo_list, RX_ACTIVE);
+      dispose_redirects (my_undo_list);
+    }
+
+  if (exec_undo_list)
+    dispose_redirects (exec_undo_list);
+
+  if (my_undo_list || exec_undo_list)
+    discard_unwind_frame ("loop_redirections");
+
+#if defined (PROCESS_SUBSTITUTION)
+  if (saved_fifo)
+    {
+      nfifo = num_fifos ();
+      if (nfifo > ofifo)
+       close_new_fifos (ofifo_list, osize);
+      free (ofifo_list);
+    }
+#endif
+
+  /* Invert the return value if we have to */
+  if (invert)
+    exec_result = (exec_result == EXECUTION_SUCCESS)
+                   ? EXECUTION_FAILURE
+                   : EXECUTION_SUCCESS;
+
+#if defined (DPAREN_ARITHMETIC) || defined (COND_COMMAND)
+  /* This is where we set PIPESTATUS from the exit status of the appropriate
+     compound commands (the ones that look enough like simple commands to
+     cause confusion).  We might be able to optimize by not doing this if
+     subshell_environment != 0. */
+  switch (command->type)
+    {
+#  if defined (DPAREN_ARITHMETIC)
+    case cm_arith:
+#  endif
+#  if defined (COND_COMMAND)
+    case cm_cond:
+#  endif
+      set_pipestatus_from_exit (exec_result);
+      break;
+    }
+#endif
+
+  last_command_exit_value = exec_result;
+  run_pending_traps ();
+#if 0
+  if (running_trap == 0)
+#endif
+    currently_executing_command = (COMMAND *)NULL;
+
+  return (last_command_exit_value);
+}
+
+#if defined (COMMAND_TIMING)
+
+#if defined (HAVE_GETRUSAGE) && defined (HAVE_GETTIMEOFDAY)
+extern struct timeval *difftimeval __P((struct timeval *, struct timeval *, struct timeval *));
+extern struct timeval *addtimeval __P((struct timeval *, struct timeval *, struct timeval *));
+extern int timeval_to_cpu __P((struct timeval *, struct timeval *, struct timeval *));
+#endif
+
+#define POSIX_TIMEFORMAT "real %2R\nuser %2U\nsys %2S"
+#define BASH_TIMEFORMAT  "\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS"
+
+static const int precs[] = { 0, 100, 10, 1 };
+
+/* Expand one `%'-prefixed escape sequence from a time format string. */
+static int
+mkfmt (buf, prec, lng, sec, sec_fraction)
+     char *buf;
+     int prec, lng;
+     time_t sec;
+     int sec_fraction;
+{
+  time_t min;
+  char abuf[INT_STRLEN_BOUND(time_t) + 1];
+  int ind, aind;
+
+  ind = 0;
+  abuf[sizeof(abuf) - 1] = '\0';
+
+  /* If LNG is non-zero, we want to decompose SEC into minutes and seconds. */
+  if (lng)
+    {
+      min = sec / 60;
+      sec %= 60;
+      aind = sizeof(abuf) - 2;
+      do
+       abuf[aind--] = (min % 10) + '0';
+      while (min /= 10);
+      aind++;
+      while (abuf[aind])
+       buf[ind++] = abuf[aind++];
+      buf[ind++] = 'm';
+    }
+
+  /* Now add the seconds. */
+  aind = sizeof (abuf) - 2;
+  do
+    abuf[aind--] = (sec % 10) + '0';
+  while (sec /= 10);
+  aind++;
+  while (abuf[aind])
+    buf[ind++] = abuf[aind++];
+
+  /* We want to add a decimal point and PREC places after it if PREC is
+     nonzero.  PREC is not greater than 3.  SEC_FRACTION is between 0
+     and 999. */
+  if (prec != 0)
+    {
+      buf[ind++] = '.';
+      for (aind = 1; aind <= prec; aind++)
+       {
+         buf[ind++] = (sec_fraction / precs[aind]) + '0';
+         sec_fraction %= precs[aind];
+       }
+    }
+
+  if (lng)
+    buf[ind++] = 's';
+  buf[ind] = '\0';
+
+  return (ind);
+}
+
+/* Interpret the format string FORMAT, interpolating the following escape
+   sequences:
+               %[prec][l][RUS]
+
+   where the optional `prec' is a precision, meaning the number of
+   characters after the decimal point, the optional `l' means to format
+   using minutes and seconds (MMmNN[.FF]s), like the `times' builtin',
+   and the last character is one of
+   
+               R       number of seconds of `real' time
+               U       number of seconds of `user' time
+               S       number of seconds of `system' time
+
+   An occurrence of `%%' in the format string is translated to a `%'.  The
+   result is printed to FP, a pointer to a FILE.  The other variables are
+   the seconds and thousandths of a second of real, user, and system time,
+   resectively. */
+static void
+print_formatted_time (fp, format, rs, rsf, us, usf, ss, ssf, cpu)
+     FILE *fp;
+     char *format;
+     time_t rs;
+     int rsf;
+     time_t us;
+     int usf;
+     time_t ss;
+     int ssf, cpu;
+{
+  int prec, lng, len;
+  char *str, *s, ts[INT_STRLEN_BOUND (time_t) + sizeof ("mSS.FFFF")];
+  time_t sum;
+  int sum_frac;
+  int sindex, ssize;
+
+  len = strlen (format);
+  ssize = (len + 64) - (len % 64);
+  str = (char *)xmalloc (ssize);
+  sindex = 0;
+
+  for (s = format; *s; s++)
+    {
+      if (*s != '%' || s[1] == '\0')
+       {
+         RESIZE_MALLOCED_BUFFER (str, sindex, 1, ssize, 64);
+         str[sindex++] = *s;
+       }
+      else if (s[1] == '%')
+       {
+         s++;
+         RESIZE_MALLOCED_BUFFER (str, sindex, 1, ssize, 64);
+         str[sindex++] = *s;
+       }
+      else if (s[1] == 'P')
+       {
+         s++;
+#if 0
+         /* clamp CPU usage at 100% */
+         if (cpu > 10000)
+           cpu = 10000;
+#endif
+         sum = cpu / 100;
+         sum_frac = (cpu % 100) * 10;
+         len = mkfmt (ts, 2, 0, sum, sum_frac);
+         RESIZE_MALLOCED_BUFFER (str, sindex, len, ssize, 64);
+         strcpy (str + sindex, ts);
+         sindex += len;
+       }
+      else
+       {
+         prec = 3;     /* default is three places past the decimal point. */
+         lng = 0;      /* default is to not use minutes or append `s' */
+         s++;
+         if (DIGIT (*s))               /* `precision' */
+           {
+             prec = *s++ - '0';
+             if (prec > 3) prec = 3;
+           }
+         if (*s == 'l')                /* `length extender' */
+           {
+             lng = 1;
+             s++;
+           }
+         if (*s == 'R' || *s == 'E')
+           len = mkfmt (ts, prec, lng, rs, rsf);
+         else if (*s == 'U')
+           len = mkfmt (ts, prec, lng, us, usf);
+         else if (*s == 'S')
+           len = mkfmt (ts, prec, lng, ss, ssf);
+         else
+           {
+             internal_error (_("TIMEFORMAT: `%c': invalid format character"), *s);
+             free (str);
+             return;
+           }
+         RESIZE_MALLOCED_BUFFER (str, sindex, len, ssize, 64);
+         strcpy (str + sindex, ts);
+         sindex += len;
+       }
+    }
+
+  str[sindex] = '\0';
+  fprintf (fp, "%s\n", str);
+  fflush (fp);
+
+  free (str);
+}
+
+static int
+time_command (command, asynchronous, pipe_in, pipe_out, fds_to_close)
+     COMMAND *command;
+     int asynchronous, pipe_in, pipe_out;
+     struct fd_bitmap *fds_to_close;
+{
+  int rv, posix_time, old_flags, nullcmd;
+  time_t rs, us, ss;
+  int rsf, usf, ssf;
+  int cpu;
+  char *time_format;
+
+#if defined (HAVE_GETRUSAGE) && defined (HAVE_GETTIMEOFDAY)
+  struct timeval real, user, sys;
+  struct timeval before, after;
+#  if defined (HAVE_STRUCT_TIMEZONE)
+  struct timezone dtz;                         /* posix doesn't define this */
+#  endif
+  struct rusage selfb, selfa, kidsb, kidsa;    /* a = after, b = before */
+#else
+#  if defined (HAVE_TIMES)
+  clock_t tbefore, tafter, real, user, sys;
+  struct tms before, after;
+#  endif
+#endif
+
+#if defined (HAVE_GETRUSAGE) && defined (HAVE_GETTIMEOFDAY)
+#  if defined (HAVE_STRUCT_TIMEZONE)
+  gettimeofday (&before, &dtz);
+#  else
+  gettimeofday (&before, (void *)NULL);
+#  endif /* !HAVE_STRUCT_TIMEZONE */
+  getrusage (RUSAGE_SELF, &selfb);
+  getrusage (RUSAGE_CHILDREN, &kidsb);
+#else
+#  if defined (HAVE_TIMES)
+  tbefore = times (&before);
+#  endif
+#endif
+
+  posix_time = command && (command->flags & CMD_TIME_POSIX);
+
+  nullcmd = (command == 0) || (command->type == cm_simple && command->value.Simple->words == 0 && command->value.Simple->redirects == 0);
+  if (posixly_correct && nullcmd)
+    {
+#if defined (HAVE_GETRUSAGE)
+      selfb.ru_utime.tv_sec = kidsb.ru_utime.tv_sec = selfb.ru_stime.tv_sec = kidsb.ru_stime.tv_sec = 0;
+      selfb.ru_utime.tv_usec = kidsb.ru_utime.tv_usec = selfb.ru_stime.tv_usec = kidsb.ru_stime.tv_usec = 0;
+      before.tv_sec = shell_start_time;
+      before.tv_usec = 0;
+#else
+      before.tms_utime = before.tms_stime = before.tms_cutime = before.tms_cstime = 0;
+      tbefore = shell_start_time;
+#endif
+    }
+
+  old_flags = command->flags;
+  command->flags &= ~(CMD_TIME_PIPELINE|CMD_TIME_POSIX);
+  rv = execute_command_internal (command, asynchronous, pipe_in, pipe_out, fds_to_close);
+  command->flags = old_flags;
+
+  rs = us = ss = 0;
+  rsf = usf = ssf = cpu = 0;
+
+#if defined (HAVE_GETRUSAGE) && defined (HAVE_GETTIMEOFDAY)
+#  if defined (HAVE_STRUCT_TIMEZONE)
+  gettimeofday (&after, &dtz);
+#  else
+  gettimeofday (&after, (void *)NULL);
+#  endif /* !HAVE_STRUCT_TIMEZONE */
+  getrusage (RUSAGE_SELF, &selfa);
+  getrusage (RUSAGE_CHILDREN, &kidsa);
+
+  difftimeval (&real, &before, &after);
+  timeval_to_secs (&real, &rs, &rsf);
+
+  addtimeval (&user, difftimeval(&after, &selfb.ru_utime, &selfa.ru_utime),
+                    difftimeval(&before, &kidsb.ru_utime, &kidsa.ru_utime));
+  timeval_to_secs (&user, &us, &usf);
+
+  addtimeval (&sys, difftimeval(&after, &selfb.ru_stime, &selfa.ru_stime),
+                   difftimeval(&before, &kidsb.ru_stime, &kidsa.ru_stime));
+  timeval_to_secs (&sys, &ss, &ssf);
+
+  cpu = timeval_to_cpu (&real, &user, &sys);
+#else
+#  if defined (HAVE_TIMES)
+  tafter = times (&after);
+
+  real = tafter - tbefore;
+  clock_t_to_secs (real, &rs, &rsf);
+
+  user = (after.tms_utime - before.tms_utime) + (after.tms_cutime - before.tms_cutime);
+  clock_t_to_secs (user, &us, &usf);
+
+  sys = (after.tms_stime - before.tms_stime) + (after.tms_cstime - before.tms_cstime);
+  clock_t_to_secs (sys, &ss, &ssf);
+
+  cpu = (real == 0) ? 0 : ((user + sys) * 10000) / real;
+
+#  else
+  rs = us = ss = 0;
+  rsf = usf = ssf = cpu = 0;
+#  endif
+#endif
+
+  if (posix_time)
+    time_format = POSIX_TIMEFORMAT;
+  else if ((time_format = get_string_value ("TIMEFORMAT")) == 0)
+    {
+      if (posixly_correct && nullcmd)
+       time_format = "user\t%2lU\nsys\t%2lS";
+      else
+       time_format = BASH_TIMEFORMAT;
+    }
+  if (time_format && *time_format)
+    print_formatted_time (stderr, time_format, rs, rsf, us, usf, ss, ssf, cpu);
+
+  return rv;
+}
+#endif /* COMMAND_TIMING */
+
+/* Execute a command that's supposed to be in a subshell.  This must be
+   called after make_child and we must be running in the child process.
+   The caller will return or exit() immediately with the value this returns. */
+static int
+execute_in_subshell (command, asynchronous, pipe_in, pipe_out, fds_to_close)
+     COMMAND *command;
+     int asynchronous;
+     int pipe_in, pipe_out;
+     struct fd_bitmap *fds_to_close;
+{
+  int user_subshell, return_code, function_value, should_redir_stdin, invert;
+  int ois, user_coproc;
+  int result;
+  volatile COMMAND *tcom;
+
+  USE_VAR(user_subshell);
+  USE_VAR(user_coproc);
+  USE_VAR(invert);
+  USE_VAR(tcom);
+  USE_VAR(asynchronous);
+
+  subshell_level++;
+  should_redir_stdin = (asynchronous && (command->flags & CMD_STDIN_REDIR) &&
+                         pipe_in == NO_PIPE &&
+                         stdin_redirects (command->redirects) == 0);
+
+  invert = (command->flags & CMD_INVERT_RETURN) != 0;
+  user_subshell = command->type == cm_subshell || ((command->flags & CMD_WANT_SUBSHELL) != 0);
+  user_coproc = command->type == cm_coproc;
+
+  command->flags &= ~(CMD_FORCE_SUBSHELL | CMD_WANT_SUBSHELL | CMD_INVERT_RETURN);
+
+  /* If a command is asynchronous in a subshell (like ( foo ) & or
+     the special case of an asynchronous GROUP command where the
+     the subshell bit is turned on down in case cm_group: below),
+     turn off `asynchronous', so that two subshells aren't spawned.
+     XXX - asynchronous used to be set to 0 in this block, but that
+     means that setup_async_signals was never run.  Now it's set to
+     0 after subshell_environment is set appropriately and setup_async_signals
+     is run.
+
+     This seems semantically correct to me.  For example,
+     ( foo ) & seems to say ``do the command `foo' in a subshell
+     environment, but don't wait for that subshell to finish'',
+     and "{ foo ; bar ; } &" seems to me to be like functions or
+     builtins in the background, which executed in a subshell
+     environment.  I just don't see the need to fork two subshells. */
+
+  /* Don't fork again, we are already in a subshell.  A `doubly
+     async' shell is not interactive, however. */
+  if (asynchronous)
+    {
+#if defined (JOB_CONTROL)
+      /* If a construct like ( exec xxx yyy ) & is given while job
+        control is active, we want to prevent exec from putting the
+        subshell back into the original process group, carefully
+        undoing all the work we just did in make_child. */
+      original_pgrp = -1;
+#endif /* JOB_CONTROL */
+      ois = interactive_shell;
+      interactive_shell = 0;
+      /* This test is to prevent alias expansion by interactive shells that
+        run `(command) &' but to allow scripts that have enabled alias
+        expansion with `shopt -s expand_alias' to continue to expand
+        aliases. */
+      if (ois != interactive_shell)
+       expand_aliases = 0;
+    }
+
+  /* Subshells are neither login nor interactive. */
+  login_shell = interactive = 0;
+
+  if (user_subshell)
+    subshell_environment = SUBSHELL_PAREN;
+  else
+    {
+      subshell_environment = 0;                        /* XXX */
+      if (asynchronous)
+       subshell_environment |= SUBSHELL_ASYNC;
+      if (pipe_in != NO_PIPE || pipe_out != NO_PIPE)
+       subshell_environment |= SUBSHELL_PIPE;
+      if (user_coproc)
+       subshell_environment |= SUBSHELL_COPROC;
+    }
+
+  reset_terminating_signals ();                /* in sig.c */
+  /* Cancel traps, in trap.c. */
+  /* Reset the signal handlers in the child, but don't free the
+     trap strings.  Set a flag noting that we have to free the
+     trap strings if we run trap to change a signal disposition. */
+  reset_signal_handlers ();
+  subshell_environment |= SUBSHELL_RESETTRAP;
+
+  /* Make sure restore_original_signals doesn't undo the work done by
+     make_child to ensure that asynchronous children are immune to SIGINT
+     and SIGQUIT.  Turn off asynchronous to make sure more subshells are
+     not spawned. */
+  if (asynchronous)
+    {
+      setup_async_signals ();
+      asynchronous = 0;
+    }
+
+#if defined (JOB_CONTROL)
+  set_sigchld_handler ();
+#endif /* JOB_CONTROL */
+
+  set_sigint_handler ();
+
+#if defined (JOB_CONTROL)
+  /* Delete all traces that there were any jobs running.  This is
+     only for subshells. */
+  without_job_control ();
+#endif /* JOB_CONTROL */
+
+  if (fds_to_close)
+    close_fd_bitmap (fds_to_close);
+
+  do_piping (pipe_in, pipe_out);
+
+#if defined (COPROCESS_SUPPORT)
+  coproc_closeall ();
+#endif
+
+  /* If this is a user subshell, set a flag if stdin was redirected.
+     This is used later to decide whether to redirect fd 0 to
+     /dev/null for async commands in the subshell.  This adds more
+     sh compatibility, but I'm not sure it's the right thing to do. */
+  if (user_subshell)
+    {
+      stdin_redir = stdin_redirects (command->redirects);
+      restore_default_signal (0);
+    }
+
+  /* If this is an asynchronous command (command &), we want to
+     redirect the standard input from /dev/null in the absence of
+     any specific redirection involving stdin. */
+  if (should_redir_stdin && stdin_redir == 0)
+    async_redirect_stdin ();
+
+  /* Do redirections, then dispose of them before recursive call. */
+  if (command->redirects)
+    {
+      if (do_redirections (command->redirects, RX_ACTIVE) != 0)
+       exit (invert ? EXECUTION_SUCCESS : EXECUTION_FAILURE);
+
+      dispose_redirects (command->redirects);
+      command->redirects = (REDIRECT *)NULL;
+    }
+
+  if (command->type == cm_subshell)
+    tcom = command->value.Subshell->command;
+  else if (user_coproc)
+    tcom = command->value.Coproc->command;
+  else
+    tcom = command;
+
+  if (command->flags & CMD_TIME_PIPELINE)
+    tcom->flags |= CMD_TIME_PIPELINE;
+  if (command->flags & CMD_TIME_POSIX)
+    tcom->flags |= CMD_TIME_POSIX;
+  
+  /* Make sure the subshell inherits any CMD_IGNORE_RETURN flag. */
+  if ((command->flags & CMD_IGNORE_RETURN) && tcom != command)
+    tcom->flags |= CMD_IGNORE_RETURN;
+
+  /* If this is a simple command, tell execute_disk_command that it
+     might be able to get away without forking and simply exec.
+     This means things like ( sleep 10 ) will only cause one fork.
+     If we're timing the command or inverting its return value, however,
+     we cannot do this optimization. */
+  if ((user_subshell || user_coproc) && (tcom->type == cm_simple || tcom->type == cm_subshell) &&
+      ((tcom->flags & CMD_TIME_PIPELINE) == 0) &&
+      ((tcom->flags & CMD_INVERT_RETURN) == 0))
+    {
+      tcom->flags |= CMD_NO_FORK;
+      if (tcom->type == cm_simple)
+       tcom->value.Simple->flags |= CMD_NO_FORK;
+    }
+
+  invert = (tcom->flags & CMD_INVERT_RETURN) != 0;
+  tcom->flags &= ~CMD_INVERT_RETURN;
+
+  result = setjmp (top_level);
+
+  /* If we're inside a function while executing this subshell, we
+     need to handle a possible `return'. */
+  function_value = 0;
+  if (return_catch_flag)
+    function_value = setjmp (return_catch);
+
+  /* If we're going to exit the shell, we don't want to invert the return
+     status. */
+  if (result == EXITPROG)
+    invert = 0, return_code = last_command_exit_value;
+  else if (result)
+    return_code = EXECUTION_FAILURE;
+  else if (function_value)
+    return_code = return_catch_value;
+  else
+    return_code = execute_command_internal ((COMMAND *)tcom, asynchronous, NO_PIPE, NO_PIPE, fds_to_close);
+
+  /* If we are asked to, invert the return value. */
+  if (invert)
+    return_code = (return_code == EXECUTION_SUCCESS) ? EXECUTION_FAILURE
+                                                    : EXECUTION_SUCCESS;
+
+  /* If we were explicitly placed in a subshell with (), we need
+     to do the `shell cleanup' things, such as running traps[0]. */
+  if (user_subshell && signal_is_trapped (0))
+    {
+      last_command_exit_value = return_code;
+      return_code = run_exit_trap ();
+    }
+
+  subshell_level--;
+  return (return_code);
+  /* NOTREACHED */
+}
+
+#if defined (COPROCESS_SUPPORT)
+#define COPROC_MAX     16
+
+typedef struct cpelement
+  {
+    struct cpelement *next;
+    struct coproc *coproc;
+  }
+cpelement_t;
+    
+typedef struct cplist
+  {
+    struct cpelement *head;
+    struct cpelement *tail;
+    int ncoproc;
+  }
+cplist_t;
+
+static struct cpelement *cpe_alloc __P((struct coproc *));
+static void cpe_dispose __P((struct cpelement *));
+static struct cpelement *cpl_add __P((struct coproc *));
+static struct cpelement *cpl_delete __P((pid_t));
+static void cpl_reap __P((void));
+static void cpl_flush __P((void));
+static void cpl_closeall __P((void));
+static struct cpelement *cpl_search __P((pid_t));
+static struct cpelement *cpl_searchbyname __P((const char *));
+static void cpl_prune __P((void));
+
+static void coproc_free __P((struct coproc *));
+
+/* Will go away when there is fully-implemented support for multiple coprocs. */
+Coproc sh_coproc = { 0, NO_PID, -1, -1, 0, 0, 0, 0 };
+
+cplist_t coproc_list = {0, 0, 0};
+
+/* Functions to manage the list of coprocs */
+
+static struct cpelement *
+cpe_alloc (cp)
+     Coproc *cp;
+{
+  struct cpelement *cpe;
+
+  cpe = (struct cpelement *)xmalloc (sizeof (struct cpelement));
+  cpe->coproc = cp;
+  cpe->next = (struct cpelement *)0;
+  return cpe;
+}
+
+static void
+cpe_dispose (cpe)
+      struct cpelement *cpe;
+{
+  free (cpe);
+}
+
+static struct cpelement *
+cpl_add (cp)
+     Coproc *cp;
+{
+  struct cpelement *cpe;
+
+  cpe = cpe_alloc (cp);
+
+  if (coproc_list.head == 0)
+    {
+      coproc_list.head = coproc_list.tail = cpe;
+      coproc_list.ncoproc = 0;                 /* just to make sure */
+    }
+  else
+    {
+      coproc_list.tail->next = cpe;
+      coproc_list.tail = cpe;
+    }
+  coproc_list.ncoproc++;
+
+  return cpe;
+}
+
+static struct cpelement *
+cpl_delete (pid)
+     pid_t pid;
+{
+  struct cpelement *prev, *p;
+
+  for (prev = p = coproc_list.head; p; prev = p, p = p->next)
+    if (p->coproc->c_pid == pid)
+      {
+        prev->next = p->next;  /* remove from list */
+        break;
+      }
+
+  if (p == 0)
+    return 0;          /* not found */
+
+#if defined (DEBUG)
+  itrace("cpl_delete: deleting %d", pid);
+#endif
+
+  /* Housekeeping in the border cases. */
+  if (p == coproc_list.head)
+    coproc_list.head = coproc_list.head->next;
+  else if (p == coproc_list.tail)
+    coproc_list.tail = prev;
+
+  coproc_list.ncoproc--;
+  if (coproc_list.ncoproc == 0)
+    coproc_list.head = coproc_list.tail = 0;
+  else if (coproc_list.ncoproc == 1)
+    coproc_list.tail = coproc_list.head;               /* just to make sure */
+
+  return (p);
+}
+
+static void
+cpl_reap ()
+{
+  struct cpelement *p, *next, *nh, *nt;
+
+  /* Build a new list by removing dead coprocs and fix up the coproc_list
+     pointers when done. */
+  nh = nt = next = (struct cpelement *)0;
+  for (p = coproc_list.head; p; p = next)
+    {
+      next = p->next;
+      if (p->coproc->c_flags & COPROC_DEAD)
+       {
+         coproc_list.ncoproc--;        /* keep running count, fix up pointers later */
+
+#if defined (DEBUG)
+         itrace("cpl_reap: deleting %d", p->coproc->c_pid);
+#endif
+
+         coproc_dispose (p->coproc);
+         cpe_dispose (p);
+       }
+      else if (nh == 0)
+       nh = nt = p;
+      else
+       {
+         nt->next = p;
+         nt = nt->next;
+       }
+    }
+
+  if (coproc_list.ncoproc == 0)
+    coproc_list.head = coproc_list.tail = 0;
+  else
+    {
+      if (nt)
+        nt->next = 0;
+      coproc_list.head = nh;
+      coproc_list.tail = nt;
+      if (coproc_list.ncoproc == 1)
+       coproc_list.tail = coproc_list.head;            /* just to make sure */  
+    }
+}
+
+/* Clear out the list of saved statuses */
+static void
+cpl_flush ()
+{
+  struct cpelement *cpe, *p;
+
+  for (cpe = coproc_list.head; cpe; )
+    {
+      p = cpe;
+      cpe = cpe->next;
+
+      coproc_dispose (p->coproc);
+      cpe_dispose (p);
+    }
+
+  coproc_list.head = coproc_list.tail = 0;
+  coproc_list.ncoproc = 0;
+}
+
+static void
+cpl_closeall ()
+{
+  struct cpelement *cpe;
+
+  for (cpe = coproc_list.head; cpe; cpe = cpe->next)
+    coproc_close (cpe->coproc);
+}
+
+static void
+cpl_fdchk (fd)
+     int fd;
+{
+  struct cpelement *cpe;
+
+  for (cpe = coproc_list.head; cpe; cpe = cpe->next)
+    coproc_checkfd (cpe->coproc, fd);
+}
+
+/* Search for PID in the list of coprocs; return the cpelement struct if
+   found.  If not found, return NULL. */
+static struct cpelement *
+cpl_search (pid)
+     pid_t pid;
+{
+  struct cpelement *cpe;
+
+  for (cpe = coproc_list.head ; cpe; cpe = cpe->next)
+    if (cpe->coproc->c_pid == pid)
+      return cpe;
+  return (struct cpelement *)NULL;
+}
+
+/* Search for the coproc named NAME in the list of coprocs; return the
+   cpelement struct if found.  If not found, return NULL. */
+static struct cpelement *
+cpl_searchbyname (name)
+     const char *name;
+{
+  struct cpelement *cp;
+
+  for (cp = coproc_list.head ; cp; cp = cp->next)
+    if (STREQ (cp->coproc->c_name, name))
+      return cp;
+  return (struct cpelement *)NULL;
+}
+
+#if 0
+static void
+cpl_prune ()
+{
+  struct cpelement *cp;
+
+  while (coproc_list.head && coproc_list.ncoproc > COPROC_MAX)
+    {
+      cp = coproc_list.head;
+      coproc_list.head = coproc_list.head->next;
+      coproc_dispose (cp->coproc);
+      cpe_dispose (cp);
+      coproc_list.ncoproc--;
+    }
+}
+#endif
+
+/* These currently use a single global "shell coproc" but are written in a
+   way to not preclude additional coprocs later (using the list management
+   package above). */
+
+struct coproc *
+getcoprocbypid (pid)
+     pid_t pid;
+{
+#if MULTIPLE_COPROCS
+  struct cpelement *p;
+
+  p = cpl_search (pid);
+  return (p ? p->coproc : 0);
+#else
+  return (pid == sh_coproc.c_pid ? &sh_coproc : 0);
+#endif
+}
+
+struct coproc *
+getcoprocbyname (name)
+     const char *name;
+{
+#if MULTIPLE_COPROCS
+  struct cpelement *p;
+
+  p = cpl_searchbyname (name);
+  return (p ? p->coproc : 0);
+#else
+  return ((sh_coproc.c_name && STREQ (sh_coproc.c_name, name)) ? &sh_coproc : 0);
+#endif
+}
+
+void
+coproc_init (cp)
+     struct coproc *cp;
+{
+  cp->c_name = 0;
+  cp->c_pid = NO_PID;
+  cp->c_rfd = cp->c_wfd = -1;
+  cp->c_rsave = cp->c_wsave = -1;
+  cp->c_flags = cp->c_status = 0;  
+}
+
+struct coproc *
+coproc_alloc (name, pid)
+     char *name;
+     pid_t pid;
+{
+  struct coproc *cp;
+
+#if MULTIPLE_COPROCS
+  cp = (struct coproc *)xmalloc (sizeof (struct coproc));
+#else
+  cp = &sh_coproc;
+#endif
+  coproc_init (cp);
+
+  cp->c_name = savestring (name);
+  cp->c_pid = pid;
+
+#if MULTIPLE_COPROCS
+  cpl_add (cp);
+#endif
+
+  return (cp);
+}
+
+static void
+coproc_free (cp)
+     struct coproc *cp;
+{
+  free (cp);
+}
+
+void
+coproc_dispose (cp)
+     struct coproc *cp;
+{
+  if (cp == 0)
+    return;
+
+  coproc_unsetvars (cp);
+  FREE (cp->c_name);
+  coproc_close (cp);
+#if MULTIPLE_COPROCS
+  coproc_free (cp);
+#else
+  coproc_init (cp);
+#endif
+}
+
+/* Placeholder for now.  Will require changes for multiple coprocs */
+void
+coproc_flush ()
+{
+#if MULTIPLE_COPROCS
+  cpl_flush ();
+#else
+  coproc_dispose (&sh_coproc);
+#endif
+}
+
+void
+coproc_close (cp)
+     struct coproc *cp;
+{
+  if (cp->c_rfd >= 0)
+    {
+      close (cp->c_rfd);
+      cp->c_rfd = -1;
+    }
+  if (cp->c_wfd >= 0)
+    {
+      close (cp->c_wfd);
+      cp->c_wfd = -1;
+    }
+  cp->c_rsave = cp->c_wsave = -1;
+}
+
+void
+coproc_closeall ()
+{
+#if MULTIPLE_COPROCS
+  cpl_closeall ();
+#else
+  coproc_close (&sh_coproc);   /* XXX - will require changes for multiple coprocs */
+#endif
+}
+
+void
+coproc_reap ()
+{
+#if MULTIPLE_COPROCS
+  cpl_reap ();
+#else
+  struct coproc *cp;
+
+  cp = &sh_coproc;             /* XXX - will require changes for multiple coprocs */
+  if (cp && (cp->c_flags & COPROC_DEAD))
+    coproc_dispose (cp);
+#endif
+}
+
+void
+coproc_rclose (cp, fd)
+     struct coproc *cp;
+     int fd;
+{
+  if (cp->c_rfd >= 0 && cp->c_rfd == fd)
+    {
+      close (cp->c_rfd);
+      cp->c_rfd = -1;
+    }
+}
+
+void
+coproc_wclose (cp, fd)
+     struct coproc *cp;
+     int fd;
+{
+  if (cp->c_wfd >= 0 && cp->c_wfd == fd)
+    {
+      close (cp->c_wfd);
+      cp->c_wfd = -1;
+    }
+}
+
+void
+coproc_checkfd (cp, fd)
+     struct coproc *cp;
+     int fd;
+{
+  int update;
+
+  update = 0;
+  if (cp->c_rfd >= 0 && cp->c_rfd == fd)
+    update = cp->c_rfd = -1;
+  if (cp->c_wfd >= 0 && cp->c_wfd == fd)
+    update = cp->c_wfd = -1;
+  if (update)
+    coproc_setvars (cp);
+}
+
+void
+coproc_fdchk (fd)
+     int fd;
+{
+#if MULTIPLE_COPROCS
+  cpl_fdchk (fd);
+#else
+  coproc_checkfd (&sh_coproc, fd);
+#endif
+}
+
+void
+coproc_fdclose (cp, fd)
+     struct coproc *cp;
+     int fd;
+{
+  coproc_rclose (cp, fd);
+  coproc_wclose (cp, fd);
+  coproc_setvars (cp);
+}
+
+void
+coproc_fdsave (cp)
+     struct coproc *cp;
+{
+  cp->c_rsave = cp->c_rfd;
+  cp->c_wsave = cp->c_wfd;
+}
+
+void
+coproc_fdrestore (cp)
+     struct coproc *cp;
+{
+  cp->c_rfd = cp->c_rsave;
+  cp->c_wfd = cp->c_wsave;
+}
+
+void
+coproc_pidchk (pid, status)
+     pid_t pid;
+{
+  struct coproc *cp;
+
+#if MULTIPLE_COPROCS
+  struct cpelement *cpe;
+
+  cpe = cpl_delete (pid);
+  cp = cpe ? cpe->coproc : 0;
+#else
+  cp = getcoprocbypid (pid);
+#endif
+  if (cp)
+    {
+#if 0
+      itrace("coproc_pidchk: pid %d has died", pid);
+#endif
+      cp->c_status = status;
+      cp->c_flags |= COPROC_DEAD;
+      cp->c_flags &= ~COPROC_RUNNING;
+#if MULTIPLE_COPROCS
+      coproc_dispose (cp);
+#else
+      coproc_unsetvars (cp);
+#endif
+    }
+}
+
+void
+coproc_setvars (cp)
+     struct coproc *cp;
+{
+  SHELL_VAR *v;
+  char *namevar, *t;
+  int l;
+#if defined (ARRAY_VARS)
+  arrayind_t ind;
+#endif
+
+  if (cp->c_name == 0)
+    return;
+
+  l = strlen (cp->c_name);
+  namevar = xmalloc (l + 16);
+
+#if defined (ARRAY_VARS)
+  v = find_variable (cp->c_name);
+  if (v == 0)
+    v = make_new_array_variable (cp->c_name);
+  if (array_p (v) == 0)
+    v = convert_var_to_array (v);
+
+  t = itos (cp->c_rfd);
+  ind = 0;
+  v = bind_array_variable (cp->c_name, ind, t, 0);
+  free (t);
+
+  t = itos (cp->c_wfd);
+  ind = 1;
+  bind_array_variable (cp->c_name, ind, t, 0);
+  free (t);
+#else
+  sprintf (namevar, "%s_READ", cp->c_name);
+  t = itos (cp->c_rfd);
+  bind_variable (namevar, t, 0);
+  free (t);
+  sprintf (namevar, "%s_WRITE", cp->c_name);
+  t = itos (cp->c_wfd);
+  bind_variable (namevar, t, 0);
+  free (t);
+#endif
+
+  sprintf (namevar, "%s_PID", cp->c_name);
+  t = itos (cp->c_pid);
+  bind_variable (namevar, t, 0);
+  free (t);
+
+  free (namevar);
+}
+
+void
+coproc_unsetvars (cp)
+     struct coproc *cp;
+{
+  int l;
+  char *namevar;
+
+  if (cp->c_name == 0)
+    return;
+
+  l = strlen (cp->c_name);
+  namevar = xmalloc (l + 16);
+
+  sprintf (namevar, "%s_PID", cp->c_name);
+  unbind_variable (namevar);  
+
+#if defined (ARRAY_VARS)
+  unbind_variable (cp->c_name);
+#else
+  sprintf (namevar, "%s_READ", cp->c_name);
+  unbind_variable (namevar);
+  sprintf (namevar, "%s_WRITE", cp->c_name);
+  unbind_variable (namevar);
+#endif  
+
+  free (namevar);
+}
+
+static int
+execute_coproc (command, pipe_in, pipe_out, fds_to_close)
+     COMMAND *command;
+     int pipe_in, pipe_out;
+     struct fd_bitmap *fds_to_close;
+{
+  int rpipe[2], wpipe[2], estat;
+  pid_t coproc_pid;
+  Coproc *cp;
+  char *tcmd;
+
+  /* XXX -- can be removed after changes to handle multiple coprocs */
+#if !MULTIPLE_COPROCS
+  if (sh_coproc.c_pid != NO_PID)
+    internal_warning ("execute_coproc: coproc [%d:%s] still exists", sh_coproc.c_pid, sh_coproc.c_name);
+  coproc_init (&sh_coproc);
+#endif
+
+  command_string_index = 0;
+  tcmd = make_command_string (command);
+
+  sh_openpipe ((int *)&rpipe); /* 0 = parent read, 1 = child write */
+  sh_openpipe ((int *)&wpipe); /* 0 = child read, 1 = parent write */
+
+  coproc_pid = make_child (savestring (tcmd), 1);
+  if (coproc_pid == 0)
+    {
+      close (rpipe[0]);
+      close (wpipe[1]);
+
+      estat = execute_in_subshell (command, 1, wpipe[0], rpipe[1], fds_to_close);
+
+      fflush (stdout);
+      fflush (stderr);
+
+      exit (estat);
+    }
+
+  close (rpipe[1]);
+  close (wpipe[0]);
+
+  cp = coproc_alloc (command->value.Coproc->name, coproc_pid);
+  cp->c_rfd = rpipe[0];
+  cp->c_wfd = wpipe[1];
+
+  SET_CLOSE_ON_EXEC (cp->c_rfd);
+  SET_CLOSE_ON_EXEC (cp->c_wfd);
+
+  coproc_setvars (cp);
+
+#if 0
+  itrace ("execute_coproc: [%d] %s", coproc_pid, the_printed_command);
+#endif
+
+  close_pipes (pipe_in, pipe_out);
+#if defined (PROCESS_SUBSTITUTION) && defined (HAVE_DEV_FD)
+  unlink_fifo_list ();
+#endif
+  stop_pipeline (1, (COMMAND *)NULL);
+  DESCRIBE_PID (coproc_pid);
+  run_pending_traps ();
+
+  return (EXECUTION_SUCCESS);
+}
+#endif
+
+static void
+restore_stdin (s)
+     int s;
+{
+  dup2 (s, 0);
+  close (s);
+}
+
+/* Catch-all cleanup function for lastpipe code for unwind-protects */
+static void
+lastpipe_cleanup (s)
+     int s;
+{
+  unfreeze_jobs_list ();
+}
+
+static int
+execute_pipeline (command, asynchronous, pipe_in, pipe_out, fds_to_close)
+     COMMAND *command;
+     int asynchronous, pipe_in, pipe_out;
+     struct fd_bitmap *fds_to_close;
+{
+  int prev, fildes[2], new_bitmap_size, dummyfd, ignore_return, exec_result;
+  int lstdin, lastpipe_flag, lastpipe_jid;
+  COMMAND *cmd;
+  struct fd_bitmap *fd_bitmap;
+  pid_t lastpid;
+
+#if defined (JOB_CONTROL)
+  sigset_t set, oset;
+  BLOCK_CHILD (set, oset);
+#endif /* JOB_CONTROL */
+
+  ignore_return = (command->flags & CMD_IGNORE_RETURN) != 0;
+
+  prev = pipe_in;
+  cmd = command;
+
+  while (cmd && cmd->type == cm_connection &&
+        cmd->value.Connection && cmd->value.Connection->connector == '|')
+    {
+      /* Make a pipeline between the two commands. */
+      if (pipe (fildes) < 0)
+       {
+         sys_error (_("pipe error"));
+#if defined (JOB_CONTROL)
+         terminate_current_pipeline ();
+         kill_current_pipeline ();
+         UNBLOCK_CHILD (oset);
+#endif /* JOB_CONTROL */
+         last_command_exit_value = EXECUTION_FAILURE;
+         /* The unwind-protects installed below will take care
+            of closing all of the open file descriptors. */
+         throw_to_top_level ();
+         return (EXECUTION_FAILURE);   /* XXX */
+       }
+
+      /* Here is a problem: with the new file close-on-exec
+        code, the read end of the pipe (fildes[0]) stays open
+        in the first process, so that process will never get a
+        SIGPIPE.  There is no way to signal the first process
+        that it should close fildes[0] after forking, so it
+        remains open.  No SIGPIPE is ever sent because there
+        is still a file descriptor open for reading connected
+        to the pipe.  We take care of that here.  This passes
+        around a bitmap of file descriptors that must be
+        closed after making a child process in execute_simple_command. */
+
+      /* We need fd_bitmap to be at least as big as fildes[0].
+        If fildes[0] is less than fds_to_close->size, then
+        use fds_to_close->size. */
+      new_bitmap_size = (fildes[0] < fds_to_close->size)
+                               ? fds_to_close->size
+                               : fildes[0] + 8;
+
+      fd_bitmap = new_fd_bitmap (new_bitmap_size);
+
+      /* Now copy the old information into the new bitmap. */
+      xbcopy ((char *)fds_to_close->bitmap, (char *)fd_bitmap->bitmap, fds_to_close->size);
+
+      /* And mark the pipe file descriptors to be closed. */
+      fd_bitmap->bitmap[fildes[0]] = 1;
+
+      /* In case there are pipe or out-of-processes errors, we
+        want all these file descriptors to be closed when
+        unwind-protects are run, and the storage used for the
+        bitmaps freed up. */
+      begin_unwind_frame ("pipe-file-descriptors");
+      add_unwind_protect (dispose_fd_bitmap, fd_bitmap);
+      add_unwind_protect (close_fd_bitmap, fd_bitmap);
+      if (prev >= 0)
+       add_unwind_protect (close, prev);
+      dummyfd = fildes[1];
+      add_unwind_protect (close, dummyfd);
+
+#if defined (JOB_CONTROL)
+      add_unwind_protect (restore_signal_mask, &oset);
+#endif /* JOB_CONTROL */
+
+      if (ignore_return && cmd->value.Connection->first)
+       cmd->value.Connection->first->flags |= CMD_IGNORE_RETURN;
+      execute_command_internal (cmd->value.Connection->first, asynchronous,
+                               prev, fildes[1], fd_bitmap);
+
+      if (prev >= 0)
+       close (prev);
+
+      prev = fildes[0];
+      close (fildes[1]);
+
+      dispose_fd_bitmap (fd_bitmap);
+      discard_unwind_frame ("pipe-file-descriptors");
+
+      cmd = cmd->value.Connection->second;
+    }
+
+  lastpid = last_made_pid;
+
+  /* Now execute the rightmost command in the pipeline.  */
+  if (ignore_return && cmd)
+    cmd->flags |= CMD_IGNORE_RETURN;
+
+  lastpipe_flag = 0;
+
+  begin_unwind_frame ("lastpipe-exec");
+  lstdin = -1;
+  /* If the `lastpipe' option is set with shopt, and job control is not
+     enabled, execute the last element of non-async pipelines in the
+     current shell environment. */
+  if (lastpipe_opt && job_control == 0 && asynchronous == 0 && pipe_out == NO_PIPE && prev > 0)
+    {
+      lstdin = move_to_high_fd (0, 1, -1);
+      if (lstdin > 0)
+       {
+         do_piping (prev, pipe_out);
+         prev = NO_PIPE;
+         add_unwind_protect (restore_stdin, lstdin);
+         lastpipe_flag = 1;
+         freeze_jobs_list ();
+         lastpipe_jid = stop_pipeline (0, (COMMAND *)NULL);    /* XXX */
+         add_unwind_protect (lastpipe_cleanup, lastpipe_jid);
+       }
+      if (cmd)
+       cmd->flags |= CMD_LASTPIPE;
+    }    
+  if (prev >= 0)
+    add_unwind_protect (close, prev);
+
+  exec_result = execute_command_internal (cmd, asynchronous, prev, pipe_out, fds_to_close);
+
+  if (lstdin > 0)
+    restore_stdin (lstdin);
+
+  if (prev >= 0)
+    close (prev);
+
+#if defined (JOB_CONTROL)
+  UNBLOCK_CHILD (oset);
+#endif
+
+  QUIT;
+
+  if (lastpipe_flag)
+    {
+#if defined (JOB_CONTROL)
+      append_process (savestring (the_printed_command), dollar_dollar_pid, exec_result, lastpipe_jid);
+#endif
+      lstdin = wait_for (lastpid);
+#if defined (JOB_CONTROL)
+      exec_result = job_exit_status (lastpipe_jid);
+#endif
+      unfreeze_jobs_list ();
+    }
+
+  discard_unwind_frame ("lastpipe-exec");
+
+  return (exec_result);
+}
+
+static int
+execute_connection (command, asynchronous, pipe_in, pipe_out, fds_to_close)
+     COMMAND *command;
+     int asynchronous, pipe_in, pipe_out;
+     struct fd_bitmap *fds_to_close;
+{
+  COMMAND *tc, *second;
+  int ignore_return, exec_result, was_error_trap, invert;
+  volatile int save_line_number;
+
+  ignore_return = (command->flags & CMD_IGNORE_RETURN) != 0;
+
+  switch (command->value.Connection->connector)
+    {
+    /* Do the first command asynchronously. */
+    case '&':
+      tc = command->value.Connection->first;
+      if (tc == 0)
+       return (EXECUTION_SUCCESS);
+
+      if (ignore_return)
+       tc->flags |= CMD_IGNORE_RETURN;
+      tc->flags |= CMD_AMPERSAND;
+
+      /* If this shell was compiled without job control support,
+        if we are currently in a subshell via `( xxx )', or if job
+        control is not active then the standard input for an
+        asynchronous command is forced to /dev/null. */
+#if defined (JOB_CONTROL)
+      if ((subshell_environment || !job_control) && !stdin_redir)
+#else
+      if (!stdin_redir)
+#endif /* JOB_CONTROL */
+       tc->flags |= CMD_STDIN_REDIR;
+
+      exec_result = execute_command_internal (tc, 1, pipe_in, pipe_out, fds_to_close);
+      QUIT;
+
+      if (tc->flags & CMD_STDIN_REDIR)
+       tc->flags &= ~CMD_STDIN_REDIR;
+
+      second = command->value.Connection->second;
+      if (second)
+       {
+         if (ignore_return)
+           second->flags |= CMD_IGNORE_RETURN;
+
+         exec_result = execute_command_internal (second, asynchronous, pipe_in, pipe_out, fds_to_close);
+       }
+
+      break;
+
+    /* Just call execute command on both sides. */
+    case ';':
+      if (ignore_return)
+       {
+         if (command->value.Connection->first)
+           command->value.Connection->first->flags |= CMD_IGNORE_RETURN;
+         if (command->value.Connection->second)
+           command->value.Connection->second->flags |= CMD_IGNORE_RETURN;
+       }
+      executing_list++;
+      QUIT;
+      execute_command (command->value.Connection->first);
+      QUIT;
+      exec_result = execute_command_internal (command->value.Connection->second,
+                                     asynchronous, pipe_in, pipe_out,
+                                     fds_to_close);
+      executing_list--;
+      break;
+
+    case '|':
+      was_error_trap = signal_is_trapped (ERROR_TRAP) && signal_is_ignored (ERROR_TRAP) == 0;
+      invert = (command->flags & CMD_INVERT_RETURN) != 0;
+      ignore_return = (command->flags & CMD_IGNORE_RETURN) != 0;
+
+      line_number_for_err_trap = line_number;
+      exec_result = execute_pipeline (command, asynchronous, pipe_in, pipe_out, fds_to_close);
+
+      if (was_error_trap && ignore_return == 0 && invert == 0 && exec_result != EXECUTION_SUCCESS)
+       {
+         last_command_exit_value = exec_result;
+         save_line_number = line_number;
+         line_number = line_number_for_err_trap;
+         run_error_trap ();
+         line_number = save_line_number;
+       }
+
+      if (ignore_return == 0 && invert == 0 && exit_immediately_on_error && exec_result != EXECUTION_SUCCESS)
+       {
+         last_command_exit_value = exec_result;
+         run_pending_traps ();
+         jump_to_top_level (ERREXIT);
+       }
+
+      break;
+
+    case AND_AND:
+    case OR_OR:
+      if (asynchronous)
+       {
+         /* If we have something like `a && b &' or `a || b &', run the
+            && or || stuff in a subshell.  Force a subshell and just call
+            execute_command_internal again.  Leave asynchronous on
+            so that we get a report from the parent shell about the
+            background job. */
+         command->flags |= CMD_FORCE_SUBSHELL;
+         exec_result = execute_command_internal (command, 1, pipe_in, pipe_out, fds_to_close);
+         break;
+       }
+
+      /* Execute the first command.  If the result of that is successful
+        and the connector is AND_AND, or the result is not successful
+        and the connector is OR_OR, then execute the second command,
+        otherwise return. */
+
+      executing_list++;
+      if (command->value.Connection->first)
+       command->value.Connection->first->flags |= CMD_IGNORE_RETURN;
+
+      exec_result = execute_command (command->value.Connection->first);
+      QUIT;
+      if (((command->value.Connection->connector == AND_AND) &&
+          (exec_result == EXECUTION_SUCCESS)) ||
+         ((command->value.Connection->connector == OR_OR) &&
+          (exec_result != EXECUTION_SUCCESS)))
+       {
+         if (ignore_return && command->value.Connection->second)
+           command->value.Connection->second->flags |= CMD_IGNORE_RETURN;
+
+         exec_result = execute_command (command->value.Connection->second);
+       }
+      executing_list--;
+      break;
+
+    default:
+      command_error ("execute_connection", CMDERR_BADCONN, command->value.Connection->connector, 0);
+      jump_to_top_level (DISCARD);
+      exec_result = EXECUTION_FAILURE;
+    }
+
+  return exec_result;
+}
+
+#define REAP() \
+  do \
+    { \
+      if (!interactive_shell) \
+       reap_dead_jobs (); \
+    } \
+  while (0)
+
+/* Execute a FOR command.  The syntax is: FOR word_desc IN word_list;
+   DO command; DONE */
+static int
+execute_for_command (for_command)
+     FOR_COM *for_command;
+{
+  register WORD_LIST *releaser, *list;
+  SHELL_VAR *v;
+  char *identifier;
+  int retval, save_line_number;
+#if 0
+  SHELL_VAR *old_value = (SHELL_VAR *)NULL; /* Remember the old value of x. */
+#endif
+
+  save_line_number = line_number;
+  if (check_identifier (for_command->name, 1) == 0)
+    {
+      if (posixly_correct && interactive_shell == 0)
+       {
+         last_command_exit_value = EX_BADUSAGE;
+         jump_to_top_level (ERREXIT);
+       }
+      return (EXECUTION_FAILURE);
+    }
+
+  loop_level++;
+  identifier = for_command->name->word;
+
+  list = releaser = expand_words_no_vars (for_command->map_list);
+
+  begin_unwind_frame ("for");
+  add_unwind_protect (dispose_words, releaser);
+
+#if 0
+  if (lexical_scoping)
+    {
+      old_value = copy_variable (find_variable (identifier));
+      if (old_value)
+       add_unwind_protect (dispose_variable, old_value);
+    }
+#endif
+
+  if (for_command->flags & CMD_IGNORE_RETURN)
+    for_command->action->flags |= CMD_IGNORE_RETURN;
+
+  for (retval = EXECUTION_SUCCESS; list; list = list->next)
+    {
+      QUIT;
+
+      line_number = for_command->line;
+
+      /* Remember what this command looks like, for debugger. */
+      command_string_index = 0;
+      print_for_command_head (for_command);
+
+      if (echo_command_at_execute)
+       xtrace_print_for_command_head (for_command);
+
+      /* Save this command unless it's a trap command and we're not running
+        a debug trap. */
+      if (signal_in_progress (DEBUG_TRAP) == 0 && running_trap == 0)
+       {
+         FREE (the_printed_command_except_trap);
+         the_printed_command_except_trap = savestring (the_printed_command);
+       }
+
+      retval = run_debug_trap ();
+#if defined (DEBUGGER)
+      /* In debugging mode, if the DEBUG trap returns a non-zero status, we
+        skip the command. */
+      if (debugging_mode && retval != EXECUTION_SUCCESS)
+        continue;
+#endif
+
+      this_command_name = (char *)NULL;
+      /* XXX - special ksh93 for command index variable handling */
+      v = find_variable_last_nameref (identifier);
+      if (v && nameref_p (v))
+        {
+          v = bind_variable_value (v, list->word->word, 0);
+        }
+      else
+        v = bind_variable (identifier, list->word->word, 0);
+      if (readonly_p (v) || noassign_p (v))
+       {
+         line_number = save_line_number;
+         if (readonly_p (v) && interactive_shell == 0 && posixly_correct)
+           {
+             last_command_exit_value = EXECUTION_FAILURE;
+             jump_to_top_level (FORCE_EOF);
+           }
+         else
+           {
+             dispose_words (releaser);
+             discard_unwind_frame ("for");
+             loop_level--;
+             return (EXECUTION_FAILURE);
+           }
+       }
+      retval = execute_command (for_command->action);
+      REAP ();
+      QUIT;
+
+      if (breaking)
+       {
+         breaking--;
+         break;
+       }
+
+      if (continuing)
+       {
+         continuing--;
+         if (continuing)
+           break;
+       }
+    }
+
+  loop_level--;
+  line_number = save_line_number;
+
+#if 0
+  if (lexical_scoping)
+    {
+      if (!old_value)
+        unbind_variable (identifier);
+      else
+       {
+         SHELL_VAR *new_value;
+
+         new_value = bind_variable (identifier, value_cell(old_value), 0);
+         new_value->attributes = old_value->attributes;
+         dispose_variable (old_value);
+       }
+    }
+#endif
+
+  dispose_words (releaser);
+  discard_unwind_frame ("for");
+  return (retval);
+}
+
+#if defined (ARITH_FOR_COMMAND)
+/* Execute an arithmetic for command.  The syntax is
+
+       for (( init ; step ; test ))
+       do
+               body
+       done
+
+   The execution should be exactly equivalent to
+
+       eval \(\( init \)\)
+       while eval \(\( test \)\) ; do
+               body;
+               eval \(\( step \)\)
+       done
+*/
+static intmax_t
+eval_arith_for_expr (l, okp)
+     WORD_LIST *l;
+     int *okp;
+{
+  WORD_LIST *new;
+  intmax_t expresult;
+  int r;
+
+  new = expand_words_no_vars (l);
+  if (new)
+    {
+      if (echo_command_at_execute)
+       xtrace_print_arith_cmd (new);
+      this_command_name = "((";                /* )) for expression error messages */
+
+      command_string_index = 0;
+      print_arith_command (new);
+      if (signal_in_progress (DEBUG_TRAP) == 0)
+       {
+         FREE (the_printed_command_except_trap);
+         the_printed_command_except_trap = savestring (the_printed_command);
+       }
+
+      r = run_debug_trap ();
+      /* In debugging mode, if the DEBUG trap returns a non-zero status, we
+        skip the command. */
+#if defined (DEBUGGER)
+      if (debugging_mode == 0 || r == EXECUTION_SUCCESS)
+       expresult = evalexp (new->word->word, okp);
+      else
+       {
+         expresult = 0;
+         if (okp)
+           *okp = 1;
+       }
+#else
+      expresult = evalexp (new->word->word, okp);
+#endif
+      dispose_words (new);
+    }
+  else
+    {
+      expresult = 0;
+      if (okp)
+       *okp = 1;
+    }
+  return (expresult);
+}
+
+static int
+execute_arith_for_command (arith_for_command)
+     ARITH_FOR_COM *arith_for_command;
+{
+  intmax_t expresult;
+  int expok, body_status, arith_lineno, save_lineno;
+
+  body_status = EXECUTION_SUCCESS;
+  loop_level++;
+  save_lineno = line_number;
+
+  if (arith_for_command->flags & CMD_IGNORE_RETURN)
+    arith_for_command->action->flags |= CMD_IGNORE_RETURN;
+
+  this_command_name = "((";    /* )) for expression error messages */
+
+  /* save the starting line number of the command so we can reset
+     line_number before executing each expression -- for $LINENO
+     and the DEBUG trap. */
+  line_number = arith_lineno = arith_for_command->line;
+  if (variable_context && interactive_shell)
+    line_number -= function_line_number;
+
+  /* Evaluate the initialization expression. */
+  expresult = eval_arith_for_expr (arith_for_command->init, &expok);
+  if (expok == 0)
+    {
+      line_number = save_lineno;
+      return (EXECUTION_FAILURE);
+    }
+
+  while (1)
+    {
+      /* Evaluate the test expression. */
+      line_number = arith_lineno;
+      expresult = eval_arith_for_expr (arith_for_command->test, &expok);
+      line_number = save_lineno;
+
+      if (expok == 0)
+       {
+         body_status = EXECUTION_FAILURE;
+         break;
+       }
+      REAP ();
+      if (expresult == 0)
+       break;
+
+      /* Execute the body of the arithmetic for command. */
+      QUIT;
+      body_status = execute_command (arith_for_command->action);
+      QUIT;
+
+      /* Handle any `break' or `continue' commands executed by the body. */
+      if (breaking)
+       {
+         breaking--;
+         break;
+       }
+
+      if (continuing)
+       {
+         continuing--;
+         if (continuing)
+           break;
+       }
+
+      /* Evaluate the step expression. */
+      line_number = arith_lineno;
+      expresult = eval_arith_for_expr (arith_for_command->step, &expok);
+      line_number = save_lineno;
+
+      if (expok == 0)
+       {
+         body_status = EXECUTION_FAILURE;
+         break;
+       }
+    }
+
+  loop_level--;
+  line_number = save_lineno;
+
+  return (body_status);
+}
+#endif
+
+#if defined (SELECT_COMMAND)
+static int LINES, COLS, tabsize;
+
+#define RP_SPACE ") "
+#define RP_SPACE_LEN 2
+
+/* XXX - does not handle numbers > 1000000 at all. */
+#define NUMBER_LEN(s) \
+((s < 10) ? 1 \
+         : ((s < 100) ? 2 \
+                     : ((s < 1000) ? 3 \
+                                  : ((s < 10000) ? 4 \
+                                                : ((s < 100000) ? 5 \
+                                                               : 6)))))
+
+static int
+displen (s)
+     const char *s;
+{
+#if defined (HANDLE_MULTIBYTE)
+  wchar_t *wcstr;
+  size_t wclen, slen;
+
+  wcstr = 0;
+  slen = mbstowcs (wcstr, s, 0);
+  if (slen == -1)
+    slen = 0;
+  wcstr = (wchar_t *)xmalloc (sizeof (wchar_t) * (slen + 1));
+  mbstowcs (wcstr, s, slen + 1);
+  wclen = wcswidth (wcstr, slen);
+  free (wcstr);
+  return ((int)wclen);
+#else
+  return (STRLEN (s));
+#endif
+}
+
+static int
+print_index_and_element (len, ind, list)
+      int len, ind;
+      WORD_LIST *list;
+{
+  register WORD_LIST *l;
+  register int i;
+
+  if (list == 0)
+    return (0);
+  for (i = ind, l = list; l && --i; l = l->next)
+    ;
+  if (l == 0)          /* don't think this can happen */
+    return (0);
+  fprintf (stderr, "%*d%s%s", len, ind, RP_SPACE, l->word->word);
+  return (displen (l->word->word));
+}
+
+static void
+indent (from, to)
+     int from, to;
+{
+  while (from < to)
+    {
+      if ((to / tabsize) > (from / tabsize))
+       {
+         putc ('\t', stderr);
+         from += tabsize - from % tabsize;
+       }
+      else
+       {
+         putc (' ', stderr);
+         from++;
+       }
+    }
+}
+
+static void
+print_select_list (list, list_len, max_elem_len, indices_len)
+     WORD_LIST *list;
+     int list_len, max_elem_len, indices_len;
+{
+  int ind, row, elem_len, pos, cols, rows;
+  int first_column_indices_len, other_indices_len;
+
+  if (list == 0)
+    {
+      putc ('\n', stderr);
+      return;
+    }
+
+  cols = max_elem_len ? COLS / max_elem_len : 1;
+  if (cols == 0)
+    cols = 1;
+  rows = list_len ? list_len / cols + (list_len % cols != 0) : 1;
+  cols = list_len ? list_len / rows + (list_len % rows != 0) : 1;
+
+  if (rows == 1)
+    {
+      rows = cols;
+      cols = 1;
+    }
+
+  first_column_indices_len = NUMBER_LEN (rows);
+  other_indices_len = indices_len;
+
+  for (row = 0; row < rows; row++)
+    {
+      ind = row;
+      pos = 0;
+      while (1)
+       {
+         indices_len = (pos == 0) ? first_column_indices_len : other_indices_len;
+         elem_len = print_index_and_element (indices_len, ind + 1, list);
+         elem_len += indices_len + RP_SPACE_LEN;
+         ind += rows;
+         if (ind >= list_len)
+           break;
+         indent (pos + elem_len, pos + max_elem_len);
+         pos += max_elem_len;
+       }
+      putc ('\n', stderr);
+    }
+}
+
+/* Print the elements of LIST, one per line, preceded by an index from 1 to
+   LIST_LEN.  Then display PROMPT and wait for the user to enter a number.
+   If the number is between 1 and LIST_LEN, return that selection.  If EOF
+   is read, return a null string.  If a blank line is entered, or an invalid
+   number is entered, the loop is executed again. */
+static char *
+select_query (list, list_len, prompt, print_menu)
+     WORD_LIST *list;
+     int list_len;
+     char *prompt;
+     int print_menu;
+{
+  int max_elem_len, indices_len, len;
+  intmax_t reply;
+  WORD_LIST *l;
+  char *repl_string, *t;
+
+#if 0
+  t = get_string_value ("LINES");
+  LINES = (t && *t) ? atoi (t) : 24;
+#endif
+  t = get_string_value ("COLUMNS");
+  COLS =  (t && *t) ? atoi (t) : 80;
+
+#if 0
+  t = get_string_value ("TABSIZE");
+  tabsize = (t && *t) ? atoi (t) : 8;
+  if (tabsize <= 0)
+    tabsize = 8;
+#else
+  tabsize = 8;
+#endif
+
+  max_elem_len = 0;
+  for (l = list; l; l = l->next)
+    {
+      len = displen (l->word->word);
+      if (len > max_elem_len)
+       max_elem_len = len;
+    }
+  indices_len = NUMBER_LEN (list_len);
+  max_elem_len += indices_len + RP_SPACE_LEN + 2;
+
+  while (1)
+    {
+      if (print_menu)
+       print_select_list (list, list_len, max_elem_len, indices_len);
+      fprintf (stderr, "%s", prompt);
+      fflush (stderr);
+      QUIT;
+
+      if (read_builtin ((WORD_LIST *)NULL) != EXECUTION_SUCCESS)
+       {
+         putchar ('\n');
+         return ((char *)NULL);
+       }
+      repl_string = get_string_value ("REPLY");
+      if (*repl_string == 0)
+       {
+         print_menu = 1;
+         continue;
+       }
+      if (legal_number (repl_string, &reply) == 0)
+       return "";
+      if (reply < 1 || reply > list_len)
+       return "";
+
+      for (l = list; l && --reply; l = l->next)
+       ;
+      return (l->word->word);          /* XXX - can't be null? */
+    }
+}
+
+/* Execute a SELECT command.  The syntax is:
+   SELECT word IN list DO command_list DONE
+   Only `break' or `return' in command_list will terminate
+   the command. */
+static int
+execute_select_command (select_command)
+     SELECT_COM *select_command;
+{
+  WORD_LIST *releaser, *list;
+  SHELL_VAR *v;
+  char *identifier, *ps3_prompt, *selection;
+  int retval, list_len, show_menu, save_line_number;
+
+  if (check_identifier (select_command->name, 1) == 0)
+    return (EXECUTION_FAILURE);
+
+  save_line_number = line_number;
+  line_number = select_command->line;
+
+  command_string_index = 0;
+  print_select_command_head (select_command);
+
+  if (echo_command_at_execute)
+    xtrace_print_select_command_head (select_command);
+
+#if 0
+  if (signal_in_progress (DEBUG_TRAP) == 0 && (this_command_name == 0 || (STREQ (this_command_name, "trap") == 0)))
+#else
+  if (signal_in_progress (DEBUG_TRAP) == 0 && running_trap == 0)
+#endif
+    {
+      FREE (the_printed_command_except_trap);
+      the_printed_command_except_trap = savestring (the_printed_command);
+    }
+
+  retval = run_debug_trap ();
+#if defined (DEBUGGER)
+  /* In debugging mode, if the DEBUG trap returns a non-zero status, we
+     skip the command. */
+  if (debugging_mode && retval != EXECUTION_SUCCESS)
+    return (EXECUTION_SUCCESS);
+#endif
+
+  loop_level++;
+  identifier = select_command->name->word;
+
+  /* command and arithmetic substitution, parameter and variable expansion,
+     word splitting, pathname expansion, and quote removal. */
+  list = releaser = expand_words_no_vars (select_command->map_list);
+  list_len = list_length (list);
+  if (list == 0 || list_len == 0)
+    {
+      if (list)
+       dispose_words (list);
+      line_number = save_line_number;
+      return (EXECUTION_SUCCESS);
+    }
+
+  begin_unwind_frame ("select");
+  add_unwind_protect (dispose_words, releaser);
+
+  if (select_command->flags & CMD_IGNORE_RETURN)
+    select_command->action->flags |= CMD_IGNORE_RETURN;
+
+  retval = EXECUTION_SUCCESS;
+  show_menu = 1;
+
+  while (1)
+    {
+      line_number = select_command->line;
+      ps3_prompt = get_string_value ("PS3");
+      if (ps3_prompt == 0)
+       ps3_prompt = "#? ";
+
+      QUIT;
+      selection = select_query (list, list_len, ps3_prompt, show_menu);
+      QUIT;
+      if (selection == 0)
+       {
+         /* select_query returns EXECUTION_FAILURE if the read builtin
+            fails, so we want to return failure in this case. */
+         retval = EXECUTION_FAILURE;
+         break;
+       }
+
+      v = bind_variable (identifier, selection, 0);
+      if (readonly_p (v) || noassign_p (v))
+       {
+         if (readonly_p (v) && interactive_shell == 0 && posixly_correct)
+           {
+             last_command_exit_value = EXECUTION_FAILURE;
+             jump_to_top_level (FORCE_EOF);
+           }
+         else
+           {
+             dispose_words (releaser);
+             discard_unwind_frame ("select");
+             loop_level--;
+             line_number = save_line_number;
+             return (EXECUTION_FAILURE);
+           }
+       }
+
+      retval = execute_command (select_command->action);
+
+      REAP ();
+      QUIT;
+
+      if (breaking)
+       {
+         breaking--;
+         break;
+       }
+
+      if (continuing)
+       {
+         continuing--;
+         if (continuing)
+           break;
+       }
+
+#if defined (KSH_COMPATIBLE_SELECT)
+      show_menu = 0;
+      selection = get_string_value ("REPLY");
+      if (selection && *selection == '\0')
+        show_menu = 1;
+#endif
+    }
+
+  loop_level--;
+  line_number = save_line_number;
+
+  dispose_words (releaser);
+  discard_unwind_frame ("select");
+  return (retval);
+}
+#endif /* SELECT_COMMAND */
+
+/* Execute a CASE command.  The syntax is: CASE word_desc IN pattern_list ESAC.
+   The pattern_list is a linked list of pattern clauses; each clause contains
+   some patterns to compare word_desc against, and an associated command to
+   execute. */
+static int
+execute_case_command (case_command)
+     CASE_COM *case_command;
+{
+  register WORD_LIST *list;
+  WORD_LIST *wlist, *es;
+  PATTERN_LIST *clauses;
+  char *word, *pattern;
+  int retval, match, ignore_return, save_line_number;
+
+  save_line_number = line_number;
+  line_number = case_command->line;
+
+  command_string_index = 0;
+  print_case_command_head (case_command);
+
+  if (echo_command_at_execute)
+    xtrace_print_case_command_head (case_command);
+
+#if 0
+  if (signal_in_progress (DEBUG_TRAP) == 0 && (this_command_name == 0 || (STREQ (this_command_name, "trap") == 0)))
+#else
+  if (signal_in_progress (DEBUG_TRAP) == 0 && running_trap == 0)
+#endif
+    {
+      FREE (the_printed_command_except_trap);
+      the_printed_command_except_trap = savestring (the_printed_command);
+    }
+
+  retval = run_debug_trap();
+#if defined (DEBUGGER)
+  /* In debugging mode, if the DEBUG trap returns a non-zero status, we
+     skip the command. */
+  if (debugging_mode && retval != EXECUTION_SUCCESS)
+    {
+      line_number = save_line_number;
+      return (EXECUTION_SUCCESS);
+    }
+#endif
+
+  wlist = expand_word_unsplit (case_command->word, 0);
+  word = wlist ? string_list (wlist) : savestring ("");
+  dispose_words (wlist);
+
+  retval = EXECUTION_SUCCESS;
+  ignore_return = case_command->flags & CMD_IGNORE_RETURN;
+
+  begin_unwind_frame ("case");
+  add_unwind_protect ((Function *)xfree, word);
+
+#define EXIT_CASE()  goto exit_case_command
+
+  for (clauses = case_command->clauses; clauses; clauses = clauses->next)
+    {
+      QUIT;
+      for (list = clauses->patterns; list; list = list->next)
+       {
+         es = expand_word_leave_quoted (list->word, 0);
+
+         if (es && es->word && es->word->word && *(es->word->word))
+           pattern = quote_string_for_globbing (es->word->word, QGLOB_CVTNULL);
+         else
+           {
+             pattern = (char *)xmalloc (1);
+             pattern[0] = '\0';
+           }
+
+         /* Since the pattern does not undergo quote removal (as per
+            Posix.2, section 3.9.4.3), the strmatch () call must be able
+            to recognize backslashes as escape characters. */
+         match = strmatch (pattern, word, FNMATCH_EXTFLAG|FNMATCH_IGNCASE) != FNM_NOMATCH;
+         free (pattern);
+
+         dispose_words (es);
+
+         if (match)
+           {
+             do
+               {
+                 if (clauses->action && ignore_return)
+                   clauses->action->flags |= CMD_IGNORE_RETURN;
+                 retval = execute_command (clauses->action);
+               }
+             while ((clauses->flags & CASEPAT_FALLTHROUGH) && (clauses = clauses->next));
+             if (clauses == 0 || (clauses->flags & CASEPAT_TESTNEXT) == 0)
+               EXIT_CASE ();
+             else
+               break;
+           }
+
+         QUIT;
+       }
+    }
+
+exit_case_command:
+  free (word);
+  discard_unwind_frame ("case");
+  line_number = save_line_number;
+  return (retval);
+}
+
+#define CMD_WHILE 0
+#define CMD_UNTIL 1
+
+/* The WHILE command.  Syntax: WHILE test DO action; DONE.
+   Repeatedly execute action while executing test produces
+   EXECUTION_SUCCESS. */
+static int
+execute_while_command (while_command)
+     WHILE_COM *while_command;
+{
+  return (execute_while_or_until (while_command, CMD_WHILE));
+}
+
+/* UNTIL is just like WHILE except that the test result is negated. */
+static int
+execute_until_command (while_command)
+     WHILE_COM *while_command;
+{
+  return (execute_while_or_until (while_command, CMD_UNTIL));
+}
+
+/* The body for both while and until.  The only difference between the
+   two is that the test value is treated differently.  TYPE is
+   CMD_WHILE or CMD_UNTIL.  The return value for both commands should
+   be EXECUTION_SUCCESS if no commands in the body are executed, and
+   the status of the last command executed in the body otherwise. */
+static int
+execute_while_or_until (while_command, type)
+     WHILE_COM *while_command;
+     int type;
+{
+  int return_value, body_status;
+
+  body_status = EXECUTION_SUCCESS;
+  loop_level++;
+
+  while_command->test->flags |= CMD_IGNORE_RETURN;
+  if (while_command->flags & CMD_IGNORE_RETURN)
+    while_command->action->flags |= CMD_IGNORE_RETURN;
+
+  while (1)
+    {
+      return_value = execute_command (while_command->test);
+      REAP ();
+
+      /* Need to handle `break' in the test when we would break out of the
+         loop.  The job control code will set `breaking' to loop_level
+         when a job in a loop is stopped with SIGTSTP.  If the stopped job
+         is in the loop test, `breaking' will not be reset unless we do
+         this, and the shell will cease to execute commands. */
+      if (type == CMD_WHILE && return_value != EXECUTION_SUCCESS)
+       {
+         if (breaking)
+           breaking--;
+         break;
+       }
+      if (type == CMD_UNTIL && return_value == EXECUTION_SUCCESS)
+       {
+         if (breaking)
+           breaking--;
+         break;
+       }
+
+      QUIT;
+      body_status = execute_command (while_command->action);
+      QUIT;
+
+      if (breaking)
+       {
+         breaking--;
+         break;
+       }
+
+      if (continuing)
+       {
+         continuing--;
+         if (continuing)
+           break;
+       }
+    }
+  loop_level--;
+
+  return (body_status);
+}
+
+/* IF test THEN command [ELSE command].
+   IF also allows ELIF in the place of ELSE IF, but
+   the parser makes *that* stupidity transparent. */
+static int
+execute_if_command (if_command)
+     IF_COM *if_command;
+{
+  int return_value, save_line_number;
+
+  save_line_number = line_number;
+  if_command->test->flags |= CMD_IGNORE_RETURN;
+  return_value = execute_command (if_command->test);
+  line_number = save_line_number;
+
+  if (return_value == EXECUTION_SUCCESS)
+    {
+      QUIT;
+
+      if (if_command->true_case && (if_command->flags & CMD_IGNORE_RETURN))
+       if_command->true_case->flags |= CMD_IGNORE_RETURN;
+
+      return (execute_command (if_command->true_case));
+    }
+  else
+    {
+      QUIT;
+
+      if (if_command->false_case && (if_command->flags & CMD_IGNORE_RETURN))
+       if_command->false_case->flags |= CMD_IGNORE_RETURN;
+
+      return (execute_command (if_command->false_case));
+    }
+}
+
+#if defined (DPAREN_ARITHMETIC)
+static int
+execute_arith_command (arith_command)
+     ARITH_COM *arith_command;
+{
+  int expok, save_line_number, retval;
+  intmax_t expresult;
+  WORD_LIST *new;
+  char *exp;
+
+  expresult = 0;
+
+  save_line_number = line_number;
+  this_command_name = "((";    /* )) */
+  line_number = arith_command->line;
+  /* If we're in a function, update the line number information. */
+  if (variable_context && interactive_shell)
+    line_number -= function_line_number;
+
+  command_string_index = 0;
+  print_arith_command (arith_command->exp);
+
+  if (signal_in_progress (DEBUG_TRAP) == 0)
+    {
+      FREE (the_printed_command_except_trap);
+      the_printed_command_except_trap = savestring (the_printed_command);
+    }
+
+  /* Run the debug trap before each arithmetic command, but do it after we
+     update the line number information and before we expand the various
+     words in the expression. */
+  retval = run_debug_trap ();
+#if defined (DEBUGGER)
+  /* In debugging mode, if the DEBUG trap returns a non-zero status, we
+     skip the command. */
+  if (debugging_mode && retval != EXECUTION_SUCCESS)
+    {
+      line_number = save_line_number;
+      return (EXECUTION_SUCCESS);
+    }
+#endif
+
+  new = expand_words_no_vars (arith_command->exp);
+
+  /* If we're tracing, make a new word list with `((' at the front and `))'
+     at the back and print it. */
+  if (echo_command_at_execute)
+    xtrace_print_arith_cmd (new);
+
+  if (new)
+    {
+      exp = new->next ? string_list (new) : new->word->word;
+      expresult = evalexp (exp, &expok);
+      line_number = save_line_number;
+      if (exp != new->word->word)
+       free (exp);
+      dispose_words (new);
+    }
+  else
+    {
+      expresult = 0;
+      expok = 1;
+    }
+
+  if (expok == 0)
+    return (EXECUTION_FAILURE);
+
+  return (expresult == 0 ? EXECUTION_FAILURE : EXECUTION_SUCCESS);
+}
+#endif /* DPAREN_ARITHMETIC */
+
+#if defined (COND_COMMAND)
+
+static char * const nullstr = "";
+
+/* XXX - can COND ever be NULL when this is called? */
+static int
+execute_cond_node (cond)
+     COND_COM *cond;
+{
+  int result, invert, patmatch, rmatch, mflags, ignore;
+  char *arg1, *arg2;
+
+  invert = (cond->flags & CMD_INVERT_RETURN);
+  ignore = (cond->flags & CMD_IGNORE_RETURN);
+  if (ignore)
+    {
+      if (cond->left)
+       cond->left->flags |= CMD_IGNORE_RETURN;
+      if (cond->right)
+       cond->right->flags |= CMD_IGNORE_RETURN;
+    }
+      
+  if (cond->type == COND_EXPR)
+    result = execute_cond_node (cond->left);
+  else if (cond->type == COND_OR)
+    {
+      result = execute_cond_node (cond->left);
+      if (result != EXECUTION_SUCCESS)
+       result = execute_cond_node (cond->right);
+    }
+  else if (cond->type == COND_AND)
+    {
+      result = execute_cond_node (cond->left);
+      if (result == EXECUTION_SUCCESS)
+       result = execute_cond_node (cond->right);
+    }
+  else if (cond->type == COND_UNARY)
+    {
+      if (ignore)
+       comsub_ignore_return++;
+      arg1 = cond_expand_word (cond->left->op, 0);
+      if (ignore)
+       comsub_ignore_return--;
+      if (arg1 == 0)
+       arg1 = nullstr;
+      if (echo_command_at_execute)
+       xtrace_print_cond_term (cond->type, invert, cond->op, arg1, (char *)NULL);
+      result = unary_test (cond->op->word, arg1) ? EXECUTION_SUCCESS : EXECUTION_FAILURE;
+      if (arg1 != nullstr)
+       free (arg1);
+    }
+  else if (cond->type == COND_BINARY)
+    {
+      rmatch = 0;
+      patmatch = (((cond->op->word[1] == '=') && (cond->op->word[2] == '\0') &&
+                  (cond->op->word[0] == '!' || cond->op->word[0] == '=')) ||
+                 (cond->op->word[0] == '=' && cond->op->word[1] == '\0'));
+#if defined (COND_REGEXP)
+      rmatch = (cond->op->word[0] == '=' && cond->op->word[1] == '~' &&
+               cond->op->word[2] == '\0');
+#endif
+
+      if (ignore)
+       comsub_ignore_return++;
+      arg1 = cond_expand_word (cond->left->op, 0);
+      if (ignore)
+       comsub_ignore_return--;
+      if (arg1 == 0)
+       arg1 = nullstr;
+      if (ignore)
+       comsub_ignore_return++;
+      arg2 = cond_expand_word (cond->right->op,
+                              (rmatch && shell_compatibility_level > 31) ? 2 : (patmatch ? 1 : 0));
+      if (ignore)
+       comsub_ignore_return--;
+      if (arg2 == 0)
+       arg2 = nullstr;
+
+      if (echo_command_at_execute)
+       xtrace_print_cond_term (cond->type, invert, cond->op, arg1, arg2);
+
+#if defined (COND_REGEXP)
+      if (rmatch)
+       {
+         mflags = SHMAT_PWARN;
+#if defined (ARRAY_VARS)
+         mflags |= SHMAT_SUBEXP;
+#endif
+
+         result = sh_regmatch (arg1, arg2, mflags);
+       }
+      else
+#endif /* COND_REGEXP */
+       {
+         int oe;
+         oe = extended_glob;
+         extended_glob = 1;
+         result = binary_test (cond->op->word, arg1, arg2, TEST_PATMATCH|TEST_ARITHEXP|TEST_LOCALE)
+                                 ? EXECUTION_SUCCESS
+                                 : EXECUTION_FAILURE;
+         extended_glob = oe;
+       }
+      if (arg1 != nullstr)
+       free (arg1);
+      if (arg2 != nullstr)
+       free (arg2);
+    }
+  else
+    {
+      command_error ("execute_cond_node", CMDERR_BADTYPE, cond->type, 0);
+      jump_to_top_level (DISCARD);
+      result = EXECUTION_FAILURE;
+    }
+
+  if (invert)
+    result = (result == EXECUTION_SUCCESS) ? EXECUTION_FAILURE : EXECUTION_SUCCESS;
+
+  return result;
+}
+
+static int
+execute_cond_command (cond_command)
+     COND_COM *cond_command;
+{
+  int retval, save_line_number;
+
+  retval = EXECUTION_SUCCESS;
+  save_line_number = line_number;
+
+  this_command_name = "[[";
+  line_number = cond_command->line;
+  /* If we're in a function, update the line number information. */
+  if (variable_context && interactive_shell)
+    line_number -= function_line_number;
+  command_string_index = 0;
+  print_cond_command (cond_command);
+
+  if (signal_in_progress (DEBUG_TRAP) == 0)
+    {
+      FREE (the_printed_command_except_trap);
+      the_printed_command_except_trap = savestring (the_printed_command);
+    }
+
+  /* Run the debug trap before each conditional command, but do it after we
+     update the line number information. */
+  retval = run_debug_trap ();
+#if defined (DEBUGGER)
+  /* In debugging mode, if the DEBUG trap returns a non-zero status, we
+     skip the command. */
+  if (debugging_mode && retval != EXECUTION_SUCCESS)
+    {
+      line_number = save_line_number;
+      return (EXECUTION_SUCCESS);
+    }
+#endif
+
+#if 0
+  debug_print_cond_command (cond_command);
+#endif
+
+  last_command_exit_value = retval = execute_cond_node (cond_command);
+  line_number = save_line_number;
+  return (retval);
+}
+#endif /* COND_COMMAND */
+
+static void
+bind_lastarg (arg)
+     char *arg;
+{
+  SHELL_VAR *var;
+
+  if (arg == 0)
+    arg = "";
+  var = bind_variable ("_", arg, 0);
+  VUNSETATTR (var, att_exported);
+}
+
+/* Execute a null command.  Fork a subshell if the command uses pipes or is
+   to be run asynchronously.  This handles all the side effects that are
+   supposed to take place. */
+static int
+execute_null_command (redirects, pipe_in, pipe_out, async)
+     REDIRECT *redirects;
+     int pipe_in, pipe_out, async;
+{
+  int r;
+  int forcefork;
+  REDIRECT *rd;
+
+  for (forcefork = 0, rd = redirects; rd; rd = rd->next)
+    forcefork += rd->rflags & REDIR_VARASSIGN;
+
+  if (forcefork || pipe_in != NO_PIPE || pipe_out != NO_PIPE || async)
+    {
+      /* We have a null command, but we really want a subshell to take
+        care of it.  Just fork, do piping and redirections, and exit. */
+      if (make_child ((char *)NULL, async) == 0)
+       {
+         /* Cancel traps, in trap.c. */
+         restore_original_signals ();          /* XXX */
+
+         do_piping (pipe_in, pipe_out);
+
+#if defined (COPROCESS_SUPPORT)
+         coproc_closeall ();
+#endif
+
+         subshell_environment = 0;
+         if (async)
+           subshell_environment |= SUBSHELL_ASYNC;
+         if (pipe_in != NO_PIPE || pipe_out != NO_PIPE)
+           subshell_environment |= SUBSHELL_PIPE;
+
+         if (do_redirections (redirects, RX_ACTIVE) == 0)
+           exit (EXECUTION_SUCCESS);
+         else
+           exit (EXECUTION_FAILURE);
+       }
+      else
+       {
+         close_pipes (pipe_in, pipe_out);
+#if defined (PROCESS_SUBSTITUTION) && defined (HAVE_DEV_FD)
+         unlink_fifo_list ();
+#endif
+         return (EXECUTION_SUCCESS);
+       }
+    }
+  else
+    {
+      /* Even if there aren't any command names, pretend to do the
+        redirections that are specified.  The user expects the side
+        effects to take place.  If the redirections fail, then return
+        failure.  Otherwise, if a command substitution took place while
+        expanding the command or a redirection, return the value of that
+        substitution.  Otherwise, return EXECUTION_SUCCESS. */
+
+      r = do_redirections (redirects, RX_ACTIVE|RX_UNDOABLE);
+      cleanup_redirects (redirection_undo_list);
+      redirection_undo_list = (REDIRECT *)NULL;
+
+      if (r != 0)
+       return (EXECUTION_FAILURE);
+      else if (last_command_subst_pid != NO_PID)
+       return (last_command_exit_value);
+      else
+       return (EXECUTION_SUCCESS);
+    }
+}
+
+/* This is a hack to suppress word splitting for assignment statements
+   given as arguments to builtins with the ASSIGNMENT_BUILTIN flag set. */
+static void
+fix_assignment_words (words)
+     WORD_LIST *words;
+{
+  WORD_LIST *w, *wcmd;
+  struct builtin *b;
+  int assoc, global;
+
+  if (words == 0)
+    return;
+
+  b = 0;
+  assoc = global = 0;
+
+  wcmd = words;
+  for (w = words; w; w = w->next)
+    if (w->word->flags & W_ASSIGNMENT)
+      {
+       if (b == 0)
+         {
+           /* Posix (post-2008) says that `command' doesn't change whether
+              or not the builtin it shadows is a `declaration command', even
+              though it removes other special builtin properties.  In Posix
+              mode, we skip over one or more instances of `command' and
+              deal with the next word as the assignment builtin. */
+           while (posixly_correct && wcmd && wcmd->word && wcmd->word->word && STREQ (wcmd->word->word, "command"))
+             wcmd = wcmd->next;
+           b = builtin_address_internal (wcmd->word->word, 0);
+           if (b == 0 || (b->flags & ASSIGNMENT_BUILTIN) == 0)
+             return;
+           else if (b && (b->flags & ASSIGNMENT_BUILTIN))
+             wcmd->word->flags |= W_ASSNBLTIN;
+         }
+       w->word->flags |= (W_NOSPLIT|W_NOGLOB|W_TILDEEXP|W_ASSIGNARG);
+#if defined (ARRAY_VARS)
+       if (assoc)
+         w->word->flags |= W_ASSIGNASSOC;
+       if (global)
+         w->word->flags |= W_ASSNGLOBAL;
+#endif
+      }
+#if defined (ARRAY_VARS)
+    /* Note that we saw an associative array option to a builtin that takes
+       assignment statements.  This is a bit of a kludge. */
+    else if (w->word->word[0] == '-' && (strchr (w->word->word+1, 'A') || strchr (w->word->word+1, 'g')))
+#else
+    else if (w->word->word[0] == '-' && strchr (w->word->word+1, 'g'))
+#endif
+      {
+       if (b == 0)
+         {
+           while (posixly_correct && wcmd && wcmd->word && wcmd->word->word && STREQ (wcmd->word->word, "command"))
+             wcmd = wcmd->next;
+           b = builtin_address_internal (wcmd->word->word, 0);
+           if (b == 0 || (b->flags & ASSIGNMENT_BUILTIN) == 0)
+             return;
+           else if (b && (b->flags & ASSIGNMENT_BUILTIN))
+             wcmd->word->flags |= W_ASSNBLTIN;
+         }
+       if ((wcmd->word->flags & W_ASSNBLTIN) && strchr (w->word->word+1, 'A'))
+         assoc = 1;
+       if ((wcmd->word->flags & W_ASSNBLTIN) && strchr (w->word->word+1, 'g'))
+         global = 1;
+      }
+}
+
+/* Return 1 if the file found by searching $PATH for PATHNAME, defaulting
+   to PATHNAME, is a directory.  Used by the autocd code below. */
+static int
+is_dirname (pathname)
+     char *pathname;
+{
+  char *temp;
+  int ret;
+
+  temp = search_for_command (pathname, 0);
+  ret = (temp ? file_isdir (temp) : file_isdir (pathname));
+  free (temp);
+  return ret;
+}
+
+/* The meaty part of all the executions.  We have to start hacking the
+   real execution of commands here.  Fork a process, set things up,
+   execute the command. */
+static int
+execute_simple_command (simple_command, pipe_in, pipe_out, async, fds_to_close)
+     SIMPLE_COM *simple_command;
+     int pipe_in, pipe_out, async;
+     struct fd_bitmap *fds_to_close;
+{
+  WORD_LIST *words, *lastword;
+  char *command_line, *lastarg, *temp;
+  int first_word_quoted, result, builtin_is_special, already_forked, dofork;
+  pid_t old_last_async_pid;
+  sh_builtin_func_t *builtin;
+  SHELL_VAR *func;
+  volatile int old_builtin, old_command_builtin;
+
+  result = EXECUTION_SUCCESS;
+  special_builtin_failed = builtin_is_special = 0;
+  command_line = (char *)0;
+
+  QUIT;
+
+  /* If we're in a function, update the line number information. */
+  if (variable_context && interactive_shell && sourcelevel == 0)
+    line_number -= function_line_number;
+
+  /* Remember what this command line looks like at invocation. */
+  command_string_index = 0;
+  print_simple_command (simple_command);
+
+#if 0
+  if (signal_in_progress (DEBUG_TRAP) == 0 && (this_command_name == 0 || (STREQ (this_command_name, "trap") == 0)))
+#else
+  if (signal_in_progress (DEBUG_TRAP) == 0 && running_trap == 0)
+#endif
+    {
+      FREE (the_printed_command_except_trap);
+      the_printed_command_except_trap = the_printed_command ? savestring (the_printed_command) : (char *)0;
+    }
+
+  /* Run the debug trap before each simple command, but do it after we
+     update the line number information. */
+  result = run_debug_trap ();
+#if defined (DEBUGGER)
+  /* In debugging mode, if the DEBUG trap returns a non-zero status, we
+     skip the command. */
+  if (debugging_mode && result != EXECUTION_SUCCESS)
+    return (EXECUTION_SUCCESS);
+#endif
+
+  first_word_quoted =
+    simple_command->words ? (simple_command->words->word->flags & W_QUOTED) : 0;
+
+  last_command_subst_pid = NO_PID;
+  old_last_async_pid = last_asynchronous_pid;
+
+  already_forked = dofork = 0;
+
+  /* If we're in a pipeline or run in the background, set DOFORK so we
+     make the child early, before word expansion.  This keeps assignment
+     statements from affecting the parent shell's environment when they
+     should not. */
+  dofork = pipe_in != NO_PIPE || pipe_out != NO_PIPE || async;
+
+  /* Something like `%2 &' should restart job 2 in the background, not cause
+     the shell to fork here. */
+  if (dofork && pipe_in == NO_PIPE && pipe_out == NO_PIPE &&
+       simple_command->words && simple_command->words->word &&
+       simple_command->words->word->word &&
+       (simple_command->words->word->word[0] == '%'))
+    dofork = 0;
+
+  if (dofork)
+    {
+      /* Do this now, because execute_disk_command will do it anyway in the
+        vast majority of cases. */
+      maybe_make_export_env ();
+
+      /* Don't let a DEBUG trap overwrite the command string to be saved with
+        the process/job associated with this child. */
+      if (make_child (savestring (the_printed_command_except_trap), async) == 0)
+       {
+         already_forked = 1;
+         simple_command->flags |= CMD_NO_FORK;
+
+         subshell_environment = SUBSHELL_FORK;
+         if (pipe_in != NO_PIPE || pipe_out != NO_PIPE)
+           subshell_environment |= SUBSHELL_PIPE;
+         if (async)
+           subshell_environment |= SUBSHELL_ASYNC;
+
+         /* We need to do this before piping to handle some really
+            pathological cases where one of the pipe file descriptors
+            is < 2. */
+         if (fds_to_close)
+           close_fd_bitmap (fds_to_close);
+
+         do_piping (pipe_in, pipe_out);
+         pipe_in = pipe_out = NO_PIPE;
+#if defined (COPROCESS_SUPPORT)
+         coproc_closeall ();
+#endif
+
+         last_asynchronous_pid = old_last_async_pid;
+       }
+      else
+       {
+         /* Don't let simple commands that aren't the last command in a
+            pipeline change $? for the rest of the pipeline (or at all). */
+         if (pipe_out != NO_PIPE)
+           result = last_command_exit_value;
+         close_pipes (pipe_in, pipe_out);
+#if defined (PROCESS_SUBSTITUTION) && defined (HAVE_DEV_FD)
+         unlink_fifo_list ();
+#endif
+         command_line = (char *)NULL;      /* don't free this. */
+         bind_lastarg ((char *)NULL);
+         return (result);
+       }
+    }
+
+  /* If we are re-running this as the result of executing the `command'
+     builtin, do not expand the command words a second time. */
+  if ((simple_command->flags & CMD_INHIBIT_EXPANSION) == 0)
+    {
+      current_fds_to_close = fds_to_close;
+      fix_assignment_words (simple_command->words);
+      /* Pass the ignore return flag down to command substitutions */
+      if (simple_command->flags & CMD_IGNORE_RETURN)   /* XXX */
+       comsub_ignore_return++;
+      words = expand_words (simple_command->words);
+      if (simple_command->flags & CMD_IGNORE_RETURN)
+       comsub_ignore_return--;
+      current_fds_to_close = (struct fd_bitmap *)NULL;
+    }
+  else
+    words = copy_word_list (simple_command->words);
+
+  /* It is possible for WORDS not to have anything left in it.
+     Perhaps all the words consisted of `$foo', and there was
+     no variable `$foo'. */
+  if (words == 0)
+    {
+      this_command_name = 0;
+      result = execute_null_command (simple_command->redirects,
+                                    pipe_in, pipe_out,
+                                    already_forked ? 0 : async);
+      if (already_forked)
+       exit (result);
+      else
+       {
+         bind_lastarg ((char *)NULL);
+         set_pipestatus_from_exit (result);
+         return (result);
+       }
+    }
+
+  lastarg = (char *)NULL;
+
+  begin_unwind_frame ("simple-command");
+
+  if (echo_command_at_execute)
+    xtrace_print_word_list (words, 1);
+
+  builtin = (sh_builtin_func_t *)NULL;
+  func = (SHELL_VAR *)NULL;
+  if ((simple_command->flags & CMD_NO_FUNCTIONS) == 0)
+    {
+      /* Posix.2 says special builtins are found before functions.  We
+        don't set builtin_is_special anywhere other than here, because
+        this path is followed only when the `command' builtin is *not*
+        being used, and we don't want to exit the shell if a special
+        builtin executed with `command builtin' fails.  `command' is not
+        a special builtin. */
+      if (posixly_correct)
+       {
+         builtin = find_special_builtin (words->word->word);
+         if (builtin)
+           builtin_is_special = 1;
+       }
+      if (builtin == 0)
+       func = find_function (words->word->word);
+    }
+
+  /* In POSIX mode, assignment errors in the temporary environment cause a
+     non-interactive shell to exit. */
+  if (builtin_is_special && interactive_shell == 0 && tempenv_assign_error)
+    {
+      last_command_exit_value = EXECUTION_FAILURE;
+      jump_to_top_level (ERREXIT);
+    }
+
+  add_unwind_protect (dispose_words, words);
+  QUIT;
+
+  /* Bind the last word in this command to "$_" after execution. */
+  for (lastword = words; lastword->next; lastword = lastword->next)
+    ;
+  lastarg = lastword->word->word;
+
+#if defined (JOB_CONTROL)
+  /* Is this command a job control related thing? */
+  if (words->word->word[0] == '%' && already_forked == 0)
+    {
+      this_command_name = async ? "bg" : "fg";
+      last_shell_builtin = this_shell_builtin;
+      this_shell_builtin = builtin_address (this_command_name);
+      result = (*this_shell_builtin) (words);
+      goto return_result;
+    }
+
+  /* One other possiblilty.  The user may want to resume an existing job.
+     If they do, find out whether this word is a candidate for a running
+     job. */
+  if (job_control && already_forked == 0 && async == 0 &&
+       !first_word_quoted &&
+       !words->next &&
+       words->word->word[0] &&
+       !simple_command->redirects &&
+       pipe_in == NO_PIPE &&
+       pipe_out == NO_PIPE &&
+       (temp = get_string_value ("auto_resume")))
+    {
+      int job, jflags, started_status;
+
+      jflags = JM_STOPPED|JM_FIRSTMATCH;
+      if (STREQ (temp, "exact"))
+       jflags |= JM_EXACT;
+      else if (STREQ (temp, "substring"))
+       jflags |= JM_SUBSTRING;
+      else
+       jflags |= JM_PREFIX;
+      job = get_job_by_name (words->word->word, jflags);
+      if (job != NO_JOB)
+       {
+         run_unwind_frame ("simple-command");
+         this_command_name = "fg";
+         last_shell_builtin = this_shell_builtin;
+         this_shell_builtin = builtin_address ("fg");
+
+         started_status = start_job (job, 1);
+         return ((started_status < 0) ? EXECUTION_FAILURE : started_status);
+       }
+    }
+#endif /* JOB_CONTROL */
+
+run_builtin:
+  /* Remember the name of this command globally. */
+  this_command_name = words->word->word;
+
+  QUIT;
+
+  /* This command could be a shell builtin or a user-defined function.
+     We have already found special builtins by this time, so we do not
+     set builtin_is_special.  If this is a function or builtin, and we
+     have pipes, then fork a subshell in here.  Otherwise, just execute
+     the command directly. */
+  if (func == 0 && builtin == 0)
+    builtin = find_shell_builtin (this_command_name);
+
+  last_shell_builtin = this_shell_builtin;
+  this_shell_builtin = builtin;
+
+  if (builtin || func)
+    {
+      if (builtin)
+        {
+         old_builtin = executing_builtin;
+         old_command_builtin = executing_command_builtin;
+         unwind_protect_int (executing_builtin);       /* modified in execute_builtin */
+         unwind_protect_int (executing_command_builtin);       /* ditto */
+        }
+      if (already_forked)
+       {
+         /* reset_terminating_signals (); */   /* XXX */
+         /* Reset the signal handlers in the child, but don't free the
+            trap strings.  Set a flag noting that we have to free the
+            trap strings if we run trap to change a signal disposition. */
+         reset_signal_handlers ();
+         subshell_environment |= SUBSHELL_RESETTRAP;
+
+         if (async)
+           {
+             if ((simple_command->flags & CMD_STDIN_REDIR) &&
+                   pipe_in == NO_PIPE &&
+                   (stdin_redirects (simple_command->redirects) == 0))
+               async_redirect_stdin ();
+             setup_async_signals ();
+           }
+
+         subshell_level++;
+         execute_subshell_builtin_or_function
+           (words, simple_command->redirects, builtin, func,
+            pipe_in, pipe_out, async, fds_to_close,
+            simple_command->flags);
+         subshell_level--;
+       }
+      else
+       {
+         result = execute_builtin_or_function
+           (words, builtin, func, simple_command->redirects, fds_to_close,
+            simple_command->flags);
+         if (builtin)
+           {
+             if (result > EX_SHERRBASE)
+               {
+                 result = builtin_status (result);
+                 if (builtin_is_special)
+                   special_builtin_failed = 1;
+               }
+             /* In POSIX mode, if there are assignment statements preceding
+                a special builtin, they persist after the builtin
+                completes. */
+             if (posixly_correct && builtin_is_special && temporary_env)
+               merge_temporary_env ();
+           }
+         else          /* function */
+           {
+             if (result == EX_USAGE)
+               result = EX_BADUSAGE;
+             else if (result > EX_SHERRBASE)
+               result = EXECUTION_FAILURE;
+           }
+
+         set_pipestatus_from_exit (result);
+
+         goto return_result;
+       }
+    }
+
+  if (autocd && interactive && words->word && is_dirname (words->word->word))
+    {
+      words = make_word_list (make_word ("cd"), words);
+      xtrace_print_word_list (words, 0);
+      goto run_builtin;
+    }
+
+  if (command_line == 0)
+    command_line = savestring (the_printed_command_except_trap ? the_printed_command_except_trap : "");
+
+#if defined (PROCESS_SUBSTITUTION)
+  if ((subshell_environment & SUBSHELL_COMSUB) && (simple_command->flags & CMD_NO_FORK) && fifos_pending() > 0)
+    simple_command->flags &= ~CMD_NO_FORK;
+#endif
+
+  result = execute_disk_command (words, simple_command->redirects, command_line,
+                       pipe_in, pipe_out, async, fds_to_close,
+                       simple_command->flags);
+
+ return_result:
+  bind_lastarg (lastarg);
+  FREE (command_line);
+  dispose_words (words);
+  if (builtin)
+    {
+      executing_builtin = old_builtin;
+      executing_command_builtin = old_command_builtin;
+    }
+  discard_unwind_frame ("simple-command");
+  this_command_name = (char *)NULL;    /* points to freed memory now */
+  return (result);
+}
+
+/* Translate the special builtin exit statuses.  We don't really need a
+   function for this; it's a placeholder for future work. */
+static int
+builtin_status (result)
+     int result;
+{
+  int r;
+
+  switch (result)
+    {
+    case EX_USAGE:
+      r = EX_BADUSAGE;
+      break;
+    case EX_REDIRFAIL:
+    case EX_BADSYNTAX:
+    case EX_BADASSIGN:
+    case EX_EXPFAIL:
+      r = EXECUTION_FAILURE;
+      break;
+    default:
+      r = EXECUTION_SUCCESS;
+      break;
+    }
+  return (r);
+}
+
+static int
+execute_builtin (builtin, words, flags, subshell)
+     sh_builtin_func_t *builtin;
+     WORD_LIST *words;
+     int flags, subshell;
+{
+  int old_e_flag, result, eval_unwind;
+  int isbltinenv;
+  char *error_trap;
+
+  error_trap = 0;
+  old_e_flag = exit_immediately_on_error;
+  /* The eval builtin calls parse_and_execute, which does not know about
+     the setting of flags, and always calls the execution functions with
+     flags that will exit the shell on an error if -e is set.  If the
+     eval builtin is being called, and we're supposed to ignore the exit
+     value of the command, we turn the -e flag off ourselves and disable
+     the ERR trap, then restore them when the command completes.  This is
+     also a problem (as below) for the command and source/. builtins. */
+  if (subshell == 0 && (flags & CMD_IGNORE_RETURN) &&
+       (builtin == eval_builtin || builtin == command_builtin || builtin == source_builtin))
+    {
+      begin_unwind_frame ("eval_builtin");
+      unwind_protect_int (exit_immediately_on_error);
+      error_trap = TRAP_STRING (ERROR_TRAP);
+      if (error_trap)
+       {
+         error_trap = savestring (error_trap);
+         add_unwind_protect (xfree, error_trap);
+         add_unwind_protect (set_error_trap, error_trap);
+         restore_default_signal (ERROR_TRAP);
+       }
+      exit_immediately_on_error = 0;
+      eval_unwind = 1;
+    }
+  else
+    eval_unwind = 0;
+
+  /* The temporary environment for a builtin is supposed to apply to
+     all commands executed by that builtin.  Currently, this is a
+     problem only with the `unset', `source' and `eval' builtins. */
+
+  isbltinenv = (builtin == source_builtin || builtin == eval_builtin || builtin == unset_builtin);
+
+  if (isbltinenv)
+    {
+      if (subshell == 0)
+       begin_unwind_frame ("builtin_env");
+
+      if (temporary_env)
+       {
+         push_scope (VC_BLTNENV, temporary_env);
+         if (subshell == 0)
+           add_unwind_protect (pop_scope, (flags & CMD_COMMAND_BUILTIN) ? 0 : "1");
+          temporary_env = (HASH_TABLE *)NULL;    
+       }
+    }
+
+  /* `return' does a longjmp() back to a saved environment in execute_function.
+     If a variable assignment list preceded the command, and the shell is
+     running in POSIX mode, we need to merge that into the shell_variables
+     table, since `return' is a POSIX special builtin. */
+  if (posixly_correct && subshell == 0 && builtin == return_builtin && temporary_env)
+    {
+      begin_unwind_frame ("return_temp_env");
+      add_unwind_protect (merge_temporary_env, (char *)NULL);
+    }
+
+  executing_builtin++;
+  executing_command_builtin |= builtin == command_builtin;
+  result = ((*builtin) (words->next));
+
+  /* This shouldn't happen, but in case `return' comes back instead of
+     longjmp'ing, we need to unwind. */
+  if (posixly_correct && subshell == 0 && builtin == return_builtin && temporary_env)
+    discard_unwind_frame ("return_temp_env");
+
+  if (subshell == 0 && isbltinenv)
+    run_unwind_frame ("builtin_env");
+
+  if (eval_unwind)
+    {
+      exit_immediately_on_error += old_e_flag;
+      if (error_trap)
+       {
+         set_error_trap (error_trap);
+         xfree (error_trap);
+       }
+      discard_unwind_frame ("eval_builtin");
+    }
+
+  return (result);
+}
+
+static int
+execute_function (var, words, flags, fds_to_close, async, subshell)
+     SHELL_VAR *var;
+     WORD_LIST *words;
+     int flags;
+     struct fd_bitmap *fds_to_close;
+     int async, subshell;
+{
+  int return_val, result;
+  COMMAND *tc, *fc, *save_current;
+  char *debug_trap, *error_trap, *return_trap;
+#if defined (ARRAY_VARS)
+  SHELL_VAR *funcname_v, *nfv, *bash_source_v, *bash_lineno_v;
+  ARRAY *funcname_a;
+  volatile ARRAY *bash_source_a;
+  volatile ARRAY *bash_lineno_a;
+#endif
+  FUNCTION_DEF *shell_fn;
+  char *sfile, *t;
+
+  USE_VAR(fc);
+
+  if (funcnest_max > 0 && funcnest >= funcnest_max)
+    {
+      internal_error (_("%s: maximum function nesting level exceeded (%d)"), var->name, funcnest);
+      funcnest = 0;    /* XXX - should we reset it somewhere else? */
+      jump_to_top_level (DISCARD);
+    }
+
+#if defined (ARRAY_VARS)
+  GET_ARRAY_FROM_VAR ("FUNCNAME", funcname_v, funcname_a);
+  GET_ARRAY_FROM_VAR ("BASH_SOURCE", bash_source_v, bash_source_a);
+  GET_ARRAY_FROM_VAR ("BASH_LINENO", bash_lineno_v, bash_lineno_a);
+#endif
+
+  tc = (COMMAND *)copy_command (function_cell (var));
+  if (tc && (flags & CMD_IGNORE_RETURN))
+    tc->flags |= CMD_IGNORE_RETURN;
+
+  if (subshell == 0)
+    {
+      begin_unwind_frame ("function_calling");
+      push_context (var->name, subshell, temporary_env);
+      add_unwind_protect (pop_context, (char *)NULL);
+      unwind_protect_int (line_number);
+      unwind_protect_int (return_catch_flag);
+      unwind_protect_jmp_buf (return_catch);
+      add_unwind_protect (dispose_command, (char *)tc);
+      unwind_protect_pointer (this_shell_function);
+      unwind_protect_int (loop_level);
+      unwind_protect_int (funcnest);
+    }
+  else
+    push_context (var->name, subshell, temporary_env); /* don't unwind-protect for subshells */
+
+  temporary_env = (HASH_TABLE *)NULL;
+
+  this_shell_function = var;
+  make_funcname_visible (1);
+
+  debug_trap = TRAP_STRING(DEBUG_TRAP);
+  error_trap = TRAP_STRING(ERROR_TRAP);
+  return_trap = TRAP_STRING(RETURN_TRAP);
+  
+  /* The order of the unwind protects for debug_trap, error_trap and
+     return_trap is important here!  unwind-protect commands are run
+     in reverse order of registration.  If this causes problems, take
+     out the xfree unwind-protect calls and live with the small memory leak. */
+
+  /* function_trace_mode != 0 means that all functions inherit the DEBUG trap.
+     if the function has the trace attribute set, it inherits the DEBUG trap */
+  if (debug_trap && ((trace_p (var) == 0) && function_trace_mode == 0))
+    {
+      if (subshell == 0)
+       {
+         debug_trap = savestring (debug_trap);
+         add_unwind_protect (xfree, debug_trap);
+         add_unwind_protect (set_debug_trap, debug_trap);
+       }
+      restore_default_signal (DEBUG_TRAP);
+    }
+
+  /* error_trace_mode != 0 means that functions inherit the ERR trap. */
+  if (error_trap && error_trace_mode == 0)
+    {
+      if (subshell == 0)
+       {
+         error_trap = savestring (error_trap);
+         add_unwind_protect (xfree, error_trap);
+         add_unwind_protect (set_error_trap, error_trap);
+       }
+      restore_default_signal (ERROR_TRAP);
+    }
+
+  /* Shell functions inherit the RETURN trap if function tracing is on
+     globally or on individually for this function. */
+#if 0
+  if (return_trap && ((trace_p (var) == 0) && function_trace_mode == 0))
+#else
+  if (return_trap && (signal_in_progress (DEBUG_TRAP) || ((trace_p (var) == 0) && function_trace_mode == 0)))
+#endif
+    {
+      if (subshell == 0)
+       {
+         return_trap = savestring (return_trap);
+         add_unwind_protect (xfree, return_trap);
+         add_unwind_protect (set_return_trap, return_trap);
+       }
+      restore_default_signal (RETURN_TRAP);
+    }
+  
+  funcnest++;
+#if defined (ARRAY_VARS)
+  /* This is quite similar to the code in shell.c and elsewhere. */
+  shell_fn = find_function_def (this_shell_function->name);
+  sfile = shell_fn ? shell_fn->source_file : "";
+  array_push ((ARRAY *)funcname_a, this_shell_function->name);
+
+  array_push ((ARRAY *)bash_source_a, sfile);
+  t = itos (executing_line_number ());
+  array_push ((ARRAY *)bash_lineno_a, t);
+  free (t);
+#endif
+
+  /* The temporary environment for a function is supposed to apply to
+     all commands executed within the function body. */
+
+  remember_args (words->next, 1);
+
+  /* Update BASH_ARGV and BASH_ARGC */
+  if (debugging_mode)
+    push_args (words->next);
+
+  /* Number of the line on which the function body starts. */
+  line_number = function_line_number = tc->line;
+
+#if defined (JOB_CONTROL)
+  if (subshell)
+    stop_pipeline (async, (COMMAND *)NULL);
+#endif
+
+  fc = tc;
+
+  return_catch_flag++;
+  return_val = setjmp (return_catch);
+
+  if (return_val)
+    {
+      result = return_catch_value;
+      /* Run the RETURN trap in the function's context. */
+      save_current = currently_executing_command;
+      run_return_trap ();
+      currently_executing_command = save_current;
+    }
+  else
+    {
+      /* Run the debug trap here so we can trap at the start of a function's
+        execution rather than the execution of the body's first command. */
+      showing_function_line = 1;
+      save_current = currently_executing_command;
+      result = run_debug_trap ();
+#if defined (DEBUGGER)
+      /* In debugging mode, if the DEBUG trap returns a non-zero status, we
+        skip the command. */
+      if (debugging_mode == 0 || result == EXECUTION_SUCCESS)
+       {
+         showing_function_line = 0;
+         currently_executing_command = save_current;
+         result = execute_command_internal (fc, 0, NO_PIPE, NO_PIPE, fds_to_close);
+
+         /* Run the RETURN trap in the function's context */
+         save_current = currently_executing_command;
+         run_return_trap ();
+         currently_executing_command = save_current;
+       }
+#else
+      result = execute_command_internal (fc, 0, NO_PIPE, NO_PIPE, fds_to_close);
+
+      save_current = currently_executing_command;
+      run_return_trap ();
+      currently_executing_command = save_current;
+#endif
+      showing_function_line = 0;
+    }
+
+  /* Restore BASH_ARGC and BASH_ARGV */
+  if (debugging_mode)
+    pop_args ();
+
+  if (subshell == 0)
+    run_unwind_frame ("function_calling");
+
+#if defined (ARRAY_VARS)
+  /* These two variables cannot be unset, and cannot be affected by the
+     function. */
+  array_pop ((ARRAY *)bash_source_a);
+  array_pop ((ARRAY *)bash_lineno_a);
+
+  /* FUNCNAME can be unset, and so can potentially be changed by the
+     function. */
+  GET_ARRAY_FROM_VAR ("FUNCNAME", nfv, funcname_a);
+  if (nfv == funcname_v)
+    array_pop (funcname_a);
+#endif
+  
+  if (variable_context == 0 || this_shell_function == 0)
+    {
+      make_funcname_visible (0);
+#if defined (PROCESS_SUBSTITUTION)
+      unlink_fifo_list ();
+#endif
+    }
+  
+  return (result);
+}
+
+/* A convenience routine for use by other parts of the shell to execute
+   a particular shell function. */
+int
+execute_shell_function (var, words)
+     SHELL_VAR *var;
+     WORD_LIST *words;
+{
+  int ret;
+  struct fd_bitmap *bitmap;
+
+  bitmap = new_fd_bitmap (FD_BITMAP_DEFAULT_SIZE);
+  begin_unwind_frame ("execute-shell-function");
+  add_unwind_protect (dispose_fd_bitmap, (char *)bitmap);
+      
+  ret = execute_function (var, words, 0, bitmap, 0, 0);
+
+  dispose_fd_bitmap (bitmap);
+  discard_unwind_frame ("execute-shell-function");
+
+  return ret;
+}
+
+/* Execute a shell builtin or function in a subshell environment.  This
+   routine does not return; it only calls exit().  If BUILTIN is non-null,
+   it points to a function to call to execute a shell builtin; otherwise
+   VAR points at the body of a function to execute.  WORDS is the arguments
+   to the command, REDIRECTS specifies redirections to perform before the
+   command is executed. */
+static void
+execute_subshell_builtin_or_function (words, redirects, builtin, var,
+                                     pipe_in, pipe_out, async, fds_to_close,
+                                     flags)
+     WORD_LIST *words;
+     REDIRECT *redirects;
+     sh_builtin_func_t *builtin;
+     SHELL_VAR *var;
+     int pipe_in, pipe_out, async;
+     struct fd_bitmap *fds_to_close;
+     int flags;
+{
+  int result, r, funcvalue;
+#if defined (JOB_CONTROL)
+  int jobs_hack;
+
+  jobs_hack = (builtin == jobs_builtin) &&
+               ((subshell_environment & SUBSHELL_ASYNC) == 0 || pipe_out != NO_PIPE);
+#endif
+
+  /* A subshell is neither a login shell nor interactive. */
+  login_shell = interactive = 0;
+
+  if (async)
+    subshell_environment |= SUBSHELL_ASYNC;
+  if (pipe_in != NO_PIPE || pipe_out != NO_PIPE)
+    subshell_environment |= SUBSHELL_PIPE;
+
+  maybe_make_export_env ();    /* XXX - is this needed? */
+
+#if defined (JOB_CONTROL)
+  /* Eradicate all traces of job control after we fork the subshell, so
+     all jobs begun by this subshell are in the same process group as
+     the shell itself. */
+
+  /* Allow the output of `jobs' to be piped. */
+  if (jobs_hack)
+    kill_current_pipeline ();
+  else
+    without_job_control ();
+
+  set_sigchld_handler ();
+#endif /* JOB_CONTROL */
+
+  set_sigint_handler ();
+
+  if (fds_to_close)
+    close_fd_bitmap (fds_to_close);
+
+  do_piping (pipe_in, pipe_out);
+
+  if (do_redirections (redirects, RX_ACTIVE) != 0)
+    exit (EXECUTION_FAILURE);
+
+  if (builtin)
+    {
+      /* Give builtins a place to jump back to on failure,
+        so we don't go back up to main(). */
+      result = setjmp (top_level);
+
+      /* Give the return builtin a place to jump to when executed in a subshell
+         or pipeline */
+      funcvalue = 0;
+      if (return_catch_flag && builtin == return_builtin)
+        funcvalue = setjmp (return_catch);
+
+      if (result == EXITPROG)
+       exit (last_command_exit_value);
+      else if (result)
+       exit (EXECUTION_FAILURE);
+      else if (funcvalue)
+       exit (return_catch_value);
+      else
+       {
+         r = execute_builtin (builtin, words, flags, 1);
+         fflush (stdout);
+         if (r == EX_USAGE)
+           r = EX_BADUSAGE;
+         exit (r);
+       }
+    }
+  else
+    {
+      r = execute_function (var, words, flags, fds_to_close, async, 1);
+      fflush (stdout);
+      exit (r);
+    }
+}
+
+/* Execute a builtin or function in the current shell context.  If BUILTIN
+   is non-null, it is the builtin command to execute, otherwise VAR points
+   to the body of a function.  WORDS are the command's arguments, REDIRECTS
+   are the redirections to perform.  FDS_TO_CLOSE is the usual bitmap of
+   file descriptors to close.
+
+   If BUILTIN is exec_builtin, the redirections specified in REDIRECTS are
+   not undone before this function returns. */
+static int
+execute_builtin_or_function (words, builtin, var, redirects,
+                            fds_to_close, flags)
+     WORD_LIST *words;
+     sh_builtin_func_t *builtin;
+     SHELL_VAR *var;
+     REDIRECT *redirects;
+     struct fd_bitmap *fds_to_close;
+     int flags;
+{
+  int result;
+  REDIRECT *saved_undo_list;
+#if defined (PROCESS_SUBSTITUTION)
+  int ofifo, nfifo, osize;
+  char *ofifo_list;
+#endif
+
+
+#if defined (PROCESS_SUBSTITUTION)  
+  ofifo = num_fifos ();
+  ofifo_list = copy_fifo_list (&osize);
+#endif
+
+  if (do_redirections (redirects, RX_ACTIVE|RX_UNDOABLE) != 0)
+    {
+      cleanup_redirects (redirection_undo_list);
+      redirection_undo_list = (REDIRECT *)NULL;
+      dispose_exec_redirects ();
+#if defined (PROCESS_SUBSTITUTION)
+      free (ofifo_list);
+#endif
+      return (EX_REDIRFAIL);   /* was EXECUTION_FAILURE */
+    }
+
+  saved_undo_list = redirection_undo_list;
+
+  /* Calling the "exec" builtin changes redirections forever. */
+  if (builtin == exec_builtin)
+    {
+      dispose_redirects (saved_undo_list);
+      saved_undo_list = exec_redirection_undo_list;
+      exec_redirection_undo_list = (REDIRECT *)NULL;
+    }
+  else
+    dispose_exec_redirects ();
+
+  if (saved_undo_list)
+    {
+      begin_unwind_frame ("saved redirects");
+      add_unwind_protect (cleanup_redirects, (char *)saved_undo_list);
+    }
+
+  redirection_undo_list = (REDIRECT *)NULL;
+
+  if (builtin)
+    result = execute_builtin (builtin, words, flags, 0);
+  else
+    result = execute_function (var, words, flags, fds_to_close, 0, 0);
+
+  /* We do this before undoing the effects of any redirections. */
+  fflush (stdout);
+  fpurge (stdout);
+  if (ferror (stdout))
+    clearerr (stdout);  
+
+  /* If we are executing the `command' builtin, but this_shell_builtin is
+     set to `exec_builtin', we know that we have something like
+     `command exec [redirection]', since otherwise `exec' would have
+     overwritten the shell and we wouldn't get here.  In this case, we
+     want to behave as if the `command' builtin had not been specified
+     and preserve the redirections. */
+  if (builtin == command_builtin && this_shell_builtin == exec_builtin)
+    {
+      int discard;
+
+      discard = 0;
+      if (saved_undo_list)
+       {
+         dispose_redirects (saved_undo_list);
+         discard = 1;
+       }
+      redirection_undo_list = exec_redirection_undo_list;
+      saved_undo_list = exec_redirection_undo_list = (REDIRECT *)NULL;      
+      if (discard)
+       discard_unwind_frame ("saved redirects");
+    }
+
+  if (saved_undo_list)
+    {
+      redirection_undo_list = saved_undo_list;
+      discard_unwind_frame ("saved redirects");
+    }
+
+  if (redirection_undo_list)
+    {
+      cleanup_redirects (redirection_undo_list);
+      redirection_undo_list = (REDIRECT *)NULL;
+    }
+
+#if defined (PROCESS_SUBSTITUTION)
+  /* Close any FIFOs created by this builtin or function. */
+  nfifo = num_fifos ();
+  if (nfifo > ofifo)
+    close_new_fifos (ofifo_list, osize);
+  free (ofifo_list);
+#endif
+
+  return (result);
+}
+
+void
+setup_async_signals ()
+{
+#if defined (__BEOS__)
+  set_signal_handler (SIGHUP, SIG_IGN);        /* they want csh-like behavior */
+#endif
+
+#if defined (JOB_CONTROL)
+  if (job_control == 0)
+#endif
+    {
+      set_signal_handler (SIGINT, SIG_IGN);
+      set_signal_ignored (SIGINT);
+      set_signal_handler (SIGQUIT, SIG_IGN);
+      set_signal_ignored (SIGQUIT);
+    }
+}
+
+/* Execute a simple command that is hopefully defined in a disk file
+   somewhere.
+
+   1) fork ()
+   2) connect pipes
+   3) look up the command
+   4) do redirections
+   5) execve ()
+   6) If the execve failed, see if the file has executable mode set.
+   If so, and it isn't a directory, then execute its contents as
+   a shell script.
+
+   Note that the filename hashing stuff has to take place up here,
+   in the parent.  This is probably why the Bourne style shells
+   don't handle it, since that would require them to go through
+   this gnarly hair, for no good reason.
+
+   NOTE: callers expect this to fork or exit(). */
+
+/* Name of a shell function to call when a command name is not found. */
+#ifndef NOTFOUND_HOOK
+#  define NOTFOUND_HOOK "command_not_found_handle"
+#endif
+
+static int
+execute_disk_command (words, redirects, command_line, pipe_in, pipe_out,
+                     async, fds_to_close, cmdflags)
+     WORD_LIST *words;
+     REDIRECT *redirects;
+     char *command_line;
+     int pipe_in, pipe_out, async;
+     struct fd_bitmap *fds_to_close;
+     int cmdflags;
+{
+  char *pathname, *command, **args;
+  int nofork, result;
+  pid_t pid;
+  SHELL_VAR *hookf;
+  WORD_LIST *wl;
+
+  nofork = (cmdflags & CMD_NO_FORK);  /* Don't fork, just exec, if no pipes */
+  pathname = words->word->word;
+
+  result = EXECUTION_SUCCESS;
+#if defined (RESTRICTED_SHELL)
+  command = (char *)NULL;
+  if (restricted && mbschr (pathname, '/'))
+    {
+      internal_error (_("%s: restricted: cannot specify `/' in command names"),
+                   pathname);
+      result = last_command_exit_value = EXECUTION_FAILURE;
+
+      /* If we're not going to fork below, we must already be in a child
+         process or a context in which it's safe to call exit(2).  */
+      if (nofork && pipe_in == NO_PIPE && pipe_out == NO_PIPE)
+       exit (last_command_exit_value);
+      else
+       goto parent_return;
+    }
+#endif /* RESTRICTED_SHELL */
+
+  command = search_for_command (pathname, 1);
+
+  if (command)
+    {
+      maybe_make_export_env ();
+      put_command_name_into_env (command);
+    }
+
+  /* We have to make the child before we check for the non-existence
+     of COMMAND, since we want the error messages to be redirected. */
+  /* If we can get away without forking and there are no pipes to deal with,
+     don't bother to fork, just directly exec the command. */
+  if (nofork && pipe_in == NO_PIPE && pipe_out == NO_PIPE)
+    pid = 0;
+  else
+    pid = make_child (savestring (command_line), async);
+
+  if (pid == 0)
+    {
+      int old_interactive;
+
+#if 0
+      /* This has been disabled for the time being. */
+#if !defined (ARG_MAX) || ARG_MAX >= 10240
+      if (posixly_correct == 0)
+       put_gnu_argv_flags_into_env ((long)getpid (), glob_argv_flags);
+#endif
+#endif
+
+      reset_terminating_signals ();    /* XXX */
+      /* Cancel traps, in trap.c. */
+      restore_original_signals ();
+
+      /* restore_original_signals may have undone the work done
+        by make_child to ensure that SIGINT and SIGQUIT are ignored
+        in asynchronous children. */
+      if (async)
+       {
+         if ((cmdflags & CMD_STDIN_REDIR) &&
+               pipe_in == NO_PIPE &&
+               (stdin_redirects (redirects) == 0))
+           async_redirect_stdin ();
+         setup_async_signals ();
+       }
+
+      /* This functionality is now provided by close-on-exec of the
+        file descriptors manipulated by redirection and piping.
+        Some file descriptors still need to be closed in all children
+        because of the way bash does pipes; fds_to_close is a
+        bitmap of all such file descriptors. */
+      if (fds_to_close)
+       close_fd_bitmap (fds_to_close);
+
+      do_piping (pipe_in, pipe_out);
+
+      old_interactive = interactive;
+      if (async)
+       interactive = 0;
+
+      subshell_environment = SUBSHELL_FORK;
+
+      if (redirects && (do_redirections (redirects, RX_ACTIVE) != 0))
+       {
+#if defined (PROCESS_SUBSTITUTION)
+         /* Try to remove named pipes that may have been created as the
+            result of redirections. */
+         unlink_fifo_list ();
+#endif /* PROCESS_SUBSTITUTION */
+         exit (EXECUTION_FAILURE);
+       }
+
+      if (async)
+       interactive = old_interactive;
+
+      if (command == 0)
+       {
+         hookf = find_function (NOTFOUND_HOOK);
+         if (hookf == 0)
+           {
+             /* Make sure filenames are displayed using printable characters */
+             if (ansic_shouldquote (pathname))
+               pathname = ansic_quote (pathname, 0, NULL);
+             internal_error (_("%s: command not found"), pathname);
+             exit (EX_NOTFOUND);       /* Posix.2 says the exit status is 127 */
+           }
+
+         wl = make_word_list (make_word (NOTFOUND_HOOK), words);
+         exit (execute_shell_function (hookf, wl));
+       }
+
+      /* Execve expects the command name to be in args[0].  So we
+        leave it there, in the same format that the user used to
+        type it in. */
+      args = strvec_from_word_list (words, 0, 0, (int *)NULL);
+      exit (shell_execve (command, args, export_env));
+    }
+  else
+    {
+parent_return:
+      QUIT;
+
+      /* Make sure that the pipes are closed in the parent. */
+      close_pipes (pipe_in, pipe_out);
+#if defined (PROCESS_SUBSTITUTION) && defined (HAVE_DEV_FD)
+      if (variable_context == 0)
+        unlink_fifo_list ();
+#endif
+      FREE (command);
+      return (result);
+    }
+}
+
+/* CPP defines to decide whether a particular index into the #! line
+   corresponds to a valid interpreter name or argument character, or
+   whitespace.  The MSDOS define is to allow \r to be treated the same
+   as \n. */
+
+#if !defined (MSDOS)
+#  define STRINGCHAR(ind) \
+    (ind < sample_len && !whitespace (sample[ind]) && sample[ind] != '\n')
+#  define WHITECHAR(ind) \
+    (ind < sample_len && whitespace (sample[ind]))
+#else  /* MSDOS */
+#  define STRINGCHAR(ind) \
+    (ind < sample_len && !whitespace (sample[ind]) && sample[ind] != '\n' && sample[ind] != '\r')
+#  define WHITECHAR(ind) \
+    (ind < sample_len && whitespace (sample[ind]))
+#endif /* MSDOS */
+
+static char *
+getinterp (sample, sample_len, endp)
+     char *sample;
+     int sample_len, *endp;
+{
+  register int i;
+  char *execname;
+  int start;
+
+  /* Find the name of the interpreter to exec. */
+  for (i = 2; i < sample_len && whitespace (sample[i]); i++)
+    ;
+
+  for (start = i; STRINGCHAR(i); i++)
+    ;
+
+  execname = substring (sample, start, i);
+
+  if (endp)
+    *endp = i;
+  return execname;
+}
+
+#if !defined (HAVE_HASH_BANG_EXEC)
+/* If the operating system on which we're running does not handle
+   the #! executable format, then help out.  SAMPLE is the text read
+   from the file, SAMPLE_LEN characters.  COMMAND is the name of
+   the script; it and ARGS, the arguments given by the user, will
+   become arguments to the specified interpreter.  ENV is the environment
+   to pass to the interpreter.
+
+   The word immediately following the #! is the interpreter to execute.
+   A single argument to the interpreter is allowed. */
+
+static int
+execute_shell_script (sample, sample_len, command, args, env)
+     char *sample;
+     int sample_len;
+     char *command;
+     char **args, **env;
+{
+  char *execname, *firstarg;
+  int i, start, size_increment, larry;
+
+  /* Find the name of the interpreter to exec. */
+  execname = getinterp (sample, sample_len, &i);
+  size_increment = 1;
+
+  /* Now the argument, if any. */
+  for (firstarg = (char *)NULL, start = i; WHITECHAR(i); i++)
+    ;
+
+  /* If there is more text on the line, then it is an argument for the
+     interpreter. */
+
+  if (STRINGCHAR(i))  
+    {
+      for (start = i; STRINGCHAR(i); i++)
+       ;
+      firstarg = substring ((char *)sample, start, i);
+      size_increment = 2;
+    }
+
+  larry = strvec_len (args) + size_increment;
+  args = strvec_resize (args, larry + 1);
+
+  for (i = larry - 1; i; i--)
+    args[i] = args[i - size_increment];
+
+  args[0] = execname;
+  if (firstarg)
+    {
+      args[1] = firstarg;
+      args[2] = command;
+    }
+  else
+    args[1] = command;
+
+  args[larry] = (char *)NULL;
+
+  return (shell_execve (execname, args, env));
+}
+#undef STRINGCHAR
+#undef WHITECHAR
+
+#endif /* !HAVE_HASH_BANG_EXEC */
+
+static void
+initialize_subshell ()
+{
+#if defined (ALIAS)
+  /* Forget about any aliases that we knew of.  We are in a subshell. */
+  delete_all_aliases ();
+#endif /* ALIAS */
+
+#if defined (HISTORY)
+  /* Forget about the history lines we have read.  This is a non-interactive
+     subshell. */
+  history_lines_this_session = 0;
+#endif
+
+#if defined (JOB_CONTROL)
+  /* Forget about the way job control was working. We are in a subshell. */
+  without_job_control ();
+  set_sigchld_handler ();
+  init_job_stats ();
+#endif /* JOB_CONTROL */
+
+  /* Reset the values of the shell flags and options. */
+  reset_shell_flags ();
+  reset_shell_options ();
+  reset_shopt_options ();
+
+  /* Zero out builtin_env, since this could be a shell script run from a
+     sourced file with a temporary environment supplied to the `source/.'
+     builtin.  Such variables are not supposed to be exported (empirical
+     testing with sh and ksh).  Just throw it away; don't worry about a
+     memory leak. */
+  if (vc_isbltnenv (shell_variables))
+    shell_variables = shell_variables->down;
+
+  clear_unwind_protect_list (0);
+  /* XXX -- are there other things we should be resetting here? */
+  parse_and_execute_level = 0;         /* nothing left to restore it */
+
+  /* We're no longer inside a shell function. */
+  variable_context = return_catch_flag = funcnest = 0;
+
+  executing_list = 0;          /* XXX */
+
+  /* If we're not interactive, close the file descriptor from which we're
+     reading the current shell script. */
+  if (interactive_shell == 0)
+    unset_bash_input (0);
+}
+
+#if defined (HAVE_SETOSTYPE) && defined (_POSIX_SOURCE)
+#  define SETOSTYPE(x) __setostype(x)
+#else
+#  define SETOSTYPE(x)
+#endif
+
+#define READ_SAMPLE_BUF(file, buf, len) \
+  do \
+    { \
+      fd = open(file, O_RDONLY); \
+      if (fd >= 0) \
+       { \
+         len = read (fd, buf, 80); \
+         close (fd); \
+       } \
+      else \
+       len = -1; \
+    } \
+  while (0)
+      
+/* Call execve (), handling interpreting shell scripts, and handling
+   exec failures. */
+int
+shell_execve (command, args, env)
+     char *command;
+     char **args, **env;
+{
+  int larray, i, fd;
+  char sample[80];
+  int sample_len;
+
+  SETOSTYPE (0);               /* Some systems use for USG/POSIX semantics */
+  execve (command, args, env);
+  i = errno;                   /* error from execve() */
+  CHECK_TERMSIG;
+  SETOSTYPE (1);
+
+  /* If we get to this point, then start checking out the file.
+     Maybe it is something we can hack ourselves. */
+  if (i != ENOEXEC)
+    {
+      if (file_isdir (command))
+#if defined (EISDIR)
+       internal_error (_("%s: %s"), command, strerror (EISDIR));
+#else
+       internal_error (_("%s: is a directory"), command);
+#endif
+      else if (executable_file (command) == 0)
+       {
+         errno = i;
+         file_error (command);
+       }
+      /* errors not involving the path argument to execve. */
+      else if (i == E2BIG || i == ENOMEM)
+       {
+         errno = i;
+         file_error (command);
+       }
+      else
+       {
+         /* The file has the execute bits set, but the kernel refuses to
+            run it for some reason.  See why. */
+#if defined (HAVE_HASH_BANG_EXEC)
+         READ_SAMPLE_BUF (command, sample, sample_len);
+         sample[sample_len - 1] = '\0';
+         if (sample_len > 2 && sample[0] == '#' && sample[1] == '!')
+           {
+             char *interp;
+             int ilen;
+
+             interp = getinterp (sample, sample_len, (int *)NULL);
+             ilen = strlen (interp);
+             errno = i;
+             if (interp[ilen - 1] == '\r')
+               {
+                 interp = xrealloc (interp, ilen + 2);
+                 interp[ilen - 1] = '^';
+                 interp[ilen] = 'M';
+                 interp[ilen + 1] = '\0';
+               }
+             sys_error (_("%s: %s: bad interpreter"), command, interp ? interp : "");
+             FREE (interp);
+             return (EX_NOEXEC);
+           }
+#endif
+         errno = i;
+         file_error (command);
+       }
+      return ((i == ENOENT) ? EX_NOTFOUND : EX_NOEXEC);        /* XXX Posix.2 says that exit status is 126 */
+    }
+
+  /* This file is executable.
+     If it begins with #!, then help out people with losing operating
+     systems.  Otherwise, check to see if it is a binary file by seeing
+     if the contents of the first line (or up to 80 characters) are in the
+     ASCII set.  If it's a text file, execute the contents as shell commands,
+     otherwise return 126 (EX_BINARY_FILE). */
+  READ_SAMPLE_BUF (command, sample, sample_len);
+
+  if (sample_len == 0)
+    return (EXECUTION_SUCCESS);
+
+  /* Is this supposed to be an executable script?
+     If so, the format of the line is "#! interpreter [argument]".
+     A single argument is allowed.  The BSD kernel restricts
+     the length of the entire line to 32 characters (32 bytes
+     being the size of the BSD exec header), but we allow 80
+     characters. */
+  if (sample_len > 0)
+    {
+#if !defined (HAVE_HASH_BANG_EXEC)
+      if (sample_len > 2 && sample[0] == '#' && sample[1] == '!')
+       return (execute_shell_script (sample, sample_len, command, args, env));
+      else
+#endif
+      if (check_binary_file (sample, sample_len))
+       {
+         internal_error (_("%s: cannot execute binary file: %s"), command, strerror (i));
+         return (EX_BINARY_FILE);
+       }
+    }
+
+  /* We have committed to attempting to execute the contents of this file
+     as shell commands. */
+
+  initialize_subshell ();
+
+  set_sigint_handler ();
+
+  /* Insert the name of this shell into the argument list. */
+  larray = strvec_len (args) + 1;
+  args = strvec_resize (args, larray + 1);
+
+  for (i = larray - 1; i; i--)
+    args[i] = args[i - 1];
+
+  args[0] = shell_name;
+  args[1] = command;
+  args[larray] = (char *)NULL;
+
+  if (args[0][0] == '-')
+    args[0]++;
+
+#if defined (RESTRICTED_SHELL)
+  if (restricted)
+    change_flag ('r', FLAG_OFF);
+#endif
+
+  if (subshell_argv)
+    {
+      /* Can't free subshell_argv[0]; that is shell_name. */
+      for (i = 1; i < subshell_argc; i++)
+       free (subshell_argv[i]);
+      free (subshell_argv);
+    }
+
+  dispose_command (currently_executing_command);       /* XXX */
+  currently_executing_command = (COMMAND *)NULL;
+
+  subshell_argc = larray;
+  subshell_argv = args;
+  subshell_envp = env;
+
+  unbind_args ();      /* remove the positional parameters */
+
+  longjmp (subshell_top_level, 1);
+  /*NOTREACHED*/
+}
+
+static int
+execute_intern_function (name, funcdef)
+     WORD_DESC *name;
+     FUNCTION_DEF *funcdef;
+{
+  SHELL_VAR *var;
+
+  if (check_identifier (name, posixly_correct) == 0)
+    {
+      if (posixly_correct && interactive_shell == 0)
+       {
+         last_command_exit_value = EX_BADUSAGE;
+         jump_to_top_level (ERREXIT);
+       }
+      return (EXECUTION_FAILURE);
+    }
+
+  /* Posix interpretation 383 */
+  if (posixly_correct && find_special_builtin (name->word))
+    {
+      internal_error (_("`%s': is a special builtin"), name->word);
+      last_command_exit_value = EX_BADUSAGE;
+      jump_to_top_level (ERREXIT);
+    }
+
+  var = find_function (name->word);
+  if (var && (readonly_p (var) || noassign_p (var)))
+    {
+      if (readonly_p (var))
+       internal_error (_("%s: readonly function"), var->name);
+      return (EXECUTION_FAILURE);
+    }
+
+#if defined (DEBUGGER)
+  bind_function_def (name->word, funcdef);
+#endif
+
+  bind_function (name->word, funcdef->command);
+  return (EXECUTION_SUCCESS);
+}
+
+#if defined (INCLUDE_UNUSED)
+#if defined (PROCESS_SUBSTITUTION)
+void
+close_all_files ()
+{
+  register int i, fd_table_size;
+
+  fd_table_size = getdtablesize ();
+  if (fd_table_size > 256)     /* clamp to a reasonable value */
+    fd_table_size = 256;
+
+  for (i = 3; i < fd_table_size; i++)
+    close (i);
+}
+#endif /* PROCESS_SUBSTITUTION */
+#endif
+
+static void
+close_pipes (in, out)
+     int in, out;
+{
+  if (in >= 0)
+    close (in);
+  if (out >= 0)
+    close (out);
+}
+
+static void
+dup_error (oldd, newd)
+     int oldd, newd;
+{
+  sys_error (_("cannot duplicate fd %d to fd %d"), oldd, newd);
+}
+
+/* Redirect input and output to be from and to the specified pipes.
+   NO_PIPE and REDIRECT_BOTH are handled correctly. */
+static void
+do_piping (pipe_in, pipe_out)
+     int pipe_in, pipe_out;
+{
+  if (pipe_in != NO_PIPE)
+    {
+      if (dup2 (pipe_in, 0) < 0)
+       dup_error (pipe_in, 0);
+      if (pipe_in > 0)
+       close (pipe_in);
+#ifdef __CYGWIN__
+      /* Let stdio know the fd may have changed from text to binary mode. */
+      freopen (NULL, "r", stdin);
+#endif /* __CYGWIN__ */
+    }
+  if (pipe_out != NO_PIPE)
+    {
+      if (pipe_out != REDIRECT_BOTH)
+       {
+         if (dup2 (pipe_out, 1) < 0)
+           dup_error (pipe_out, 1);
+         if (pipe_out == 0 || pipe_out > 1)
+           close (pipe_out);
+       }
+      else
+       {
+         if (dup2 (1, 2) < 0)
+           dup_error (1, 2);
+       }
+#ifdef __CYGWIN__
+      /* Let stdio know the fd may have changed from text to binary mode, and
+        make sure to preserve stdout line buffering. */
+      freopen (NULL, "w", stdout);
+      sh_setlinebuf (stdout);
+#endif /* __CYGWIN__ */
+    }
+}
index 6e1e0a1ee38457e610e682fd8c000c1a5171f44c..ff5adb31ccc2a56478f589efbbce58aaddd7fc0b 100644 (file)
@@ -291,7 +291,7 @@ BRACKMATCH (p, test, flags)
 {
   register CHAR cstart, cend, c;
   register int not;    /* Nonzero if the sense of the character class is inverted.  */
-  int brcnt, forcecoll;;
+  int brcnt, forcecoll;
   INT pc;
   CHAR *savep;
 
diff --git a/lib/glob/sm_loop.c~ b/lib/glob/sm_loop.c~
new file mode 100644 (file)
index 0000000..6e1e0a1
--- /dev/null
@@ -0,0 +1,773 @@
+/* Copyright (C) 1991-2011 Free Software Foundation, Inc.
+
+   This file is part of GNU Bash, the Bourne Again SHell.
+   
+   Bash is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   Bash is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with Bash.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+int FCT __P((CHAR *, CHAR *, int));
+
+static int GMATCH __P((CHAR *, CHAR *, CHAR *, CHAR *, int));
+static CHAR *PARSE_COLLSYM __P((CHAR *, INT *));
+static CHAR *BRACKMATCH __P((CHAR *, U_CHAR, int));
+static int EXTMATCH __P((INT, CHAR *, CHAR *, CHAR *, CHAR *, int));
+
+/*static*/ CHAR *PATSCAN __P((CHAR *, CHAR *, INT));
+
+int
+FCT (pattern, string, flags)
+     CHAR *pattern;
+     CHAR *string;
+     int flags;
+{
+  CHAR *se, *pe;
+
+  if (string == 0 || pattern == 0)
+    return FNM_NOMATCH;
+
+  se = string + STRLEN ((XCHAR *)string);
+  pe = pattern + STRLEN ((XCHAR *)pattern);
+
+  return (GMATCH (string, se, pattern, pe, flags));
+}
+
+/* Match STRING against the filename pattern PATTERN, returning zero if
+   it matches, FNM_NOMATCH if not.  */
+static int
+GMATCH (string, se, pattern, pe, flags)
+     CHAR *string, *se;
+     CHAR *pattern, *pe;
+     int flags;
+{
+  CHAR *p, *n;         /* pattern, string */
+  INT c;               /* current pattern character - XXX U_CHAR? */
+  INT sc;              /* current string character - XXX U_CHAR? */
+
+  p = pattern;
+  n = string;
+
+  if (string == 0 || pattern == 0)
+    return FNM_NOMATCH;
+
+#if DEBUG_MATCHING
+fprintf(stderr, "gmatch: string = %s; se = %s\n", string, se);
+fprintf(stderr, "gmatch: pattern = %s; pe = %s\n", pattern, pe);
+#endif
+
+  while (p < pe)
+    {
+      c = *p++;
+      c = FOLD (c);
+
+      sc = n < se ? *n : '\0';
+
+#ifdef EXTENDED_GLOB
+      /* EXTMATCH () will handle recursively calling GMATCH, so we can
+        just return what EXTMATCH() returns. */
+      if ((flags & FNM_EXTMATCH) && *p == L('(') &&
+         (c == L('+') || c == L('*') || c == L('?') || c == L('@') || c == L('!'))) /* ) */
+       {
+         int lflags;
+         /* If we're not matching the start of the string, we're not
+            concerned about the special cases for matching `.' */
+         lflags = (n == string) ? flags : (flags & ~FNM_PERIOD);
+         return (EXTMATCH (c, n, se, p, pe, lflags));
+       }
+#endif /* EXTENDED_GLOB */
+
+      switch (c)
+       {
+       case L('?'):            /* Match single character */
+         if (sc == '\0')
+           return FNM_NOMATCH;
+         else if ((flags & FNM_PATHNAME) && sc == L('/'))
+           /* If we are matching a pathname, `?' can never match a `/'. */
+           return FNM_NOMATCH;
+         else if ((flags & FNM_PERIOD) && sc == L('.') &&
+                  (n == string || ((flags & FNM_PATHNAME) && n[-1] == L('/'))))
+           /* `?' cannot match a `.' if it is the first character of the
+              string or if it is the first character following a slash and
+              we are matching a pathname. */
+           return FNM_NOMATCH;
+         break;
+
+       case L('\\'):           /* backslash escape removes special meaning */
+         if (p == pe)
+           return FNM_NOMATCH;
+
+         if ((flags & FNM_NOESCAPE) == 0)
+           {
+             c = *p++;
+             /* A trailing `\' cannot match. */
+             if (p > pe)
+               return FNM_NOMATCH;
+             c = FOLD (c);
+           }
+         if (FOLD (sc) != (U_CHAR)c)
+           return FNM_NOMATCH;
+         break;
+
+       case '*':               /* Match zero or more characters */
+         if (p == pe)
+           return 0;
+         
+         if ((flags & FNM_PERIOD) && sc == L('.') &&
+             (n == string || ((flags & FNM_PATHNAME) && n[-1] == L('/'))))
+           /* `*' cannot match a `.' if it is the first character of the
+              string or if it is the first character following a slash and
+              we are matching a pathname. */
+           return FNM_NOMATCH;
+
+         /* Collapse multiple consecutive `*' and `?', but make sure that
+            one character of the string is consumed for each `?'. */
+         for (c = *p++; (c == L('?') || c == L('*')); c = *p++)
+           {
+             if ((flags & FNM_PATHNAME) && sc == L('/'))
+               /* A slash does not match a wildcard under FNM_PATHNAME. */
+               return FNM_NOMATCH;
+#ifdef EXTENDED_GLOB
+             else if ((flags & FNM_EXTMATCH) && c == L('?') && *p == L('(')) /* ) */
+               {
+                 CHAR *newn;
+                 for (newn = n; newn < se; ++newn)
+                   {
+                     if (EXTMATCH (c, newn, se, p, pe, flags) == 0)
+                       return (0);
+                   }
+                 /* We didn't match.  If we have a `?(...)', that's failure. */
+                 return FNM_NOMATCH;
+               }
+#endif
+             else if (c == L('?'))
+               {
+                 if (sc == L('\0'))
+                   return FNM_NOMATCH;
+                 /* One character of the string is consumed in matching
+                    this ? wildcard, so *??? won't match if there are
+                    fewer than three characters. */
+                 n++;
+                 sc = n < se ? *n : '\0';
+               }
+
+#ifdef EXTENDED_GLOB
+             /* Handle ******(patlist) */
+             if ((flags & FNM_EXTMATCH) && c == L('*') && *p == L('('))  /*)*/
+               {
+                 CHAR *newn;
+                 /* We need to check whether or not the extended glob
+                    pattern matches the remainder of the string.
+                    If it does, we match the entire pattern. */
+                 for (newn = n; newn < se; ++newn)
+                   {
+                     if (EXTMATCH (c, newn, se, p, pe, flags) == 0)
+                       return (0);
+                   }
+                 /* We didn't match the extended glob pattern, but
+                    that's OK, since we can match 0 or more occurrences.
+                    We need to skip the glob pattern and see if we
+                    match the rest of the string. */
+                 newn = PATSCAN (p + 1, pe, 0);
+                 /* If NEWN is 0, we have an ill-formed pattern. */
+                 p = newn ? newn : pe;
+               }
+#endif
+             if (p == pe)
+               break;
+           }
+
+         /* If we've hit the end of the pattern and the last character of
+            the pattern was handled by the loop above, we've succeeded.
+            Otherwise, we need to match that last character. */
+         if (p == pe && (c == L('?') || c == L('*')))
+           return (0);
+
+         /* General case, use recursion. */
+         {
+           U_CHAR c1;
+
+           c1 = ((flags & FNM_NOESCAPE) == 0 && c == L('\\')) ? *p : c;
+           c1 = FOLD (c1);
+           for (--p; n < se; ++n)
+             {
+               /* Only call strmatch if the first character indicates a
+                  possible match.  We can check the first character if
+                  we're not doing an extended glob match. */
+               if ((flags & FNM_EXTMATCH) == 0 && c != L('[') && FOLD (*n) != c1) /*]*/
+                 continue;
+
+               /* If we're doing an extended glob match and the pattern is not
+                  one of the extended glob patterns, we can check the first
+                  character. */
+               if ((flags & FNM_EXTMATCH) && p[1] != L('(') && /*)*/
+                   STRCHR (L("?*+@!"), *p) == 0 && c != L('[') && FOLD (*n) != c1) /*]*/
+                 continue;
+
+               /* Otherwise, we just recurse. */
+               if (GMATCH (n, se, p, pe, flags & ~FNM_PERIOD) == 0)
+                 return (0);
+             }
+           return FNM_NOMATCH;
+         }
+
+       case L('['):
+         {
+           if (sc == L('\0') || n == se)
+             return FNM_NOMATCH;
+
+           /* A character class cannot match a `.' if it is the first
+              character of the string or if it is the first character
+              following a slash and we are matching a pathname. */
+           if ((flags & FNM_PERIOD) && sc == L('.') &&
+               (n == string || ((flags & FNM_PATHNAME) && n[-1] == L('/'))))
+             return (FNM_NOMATCH);
+
+           p = BRACKMATCH (p, sc, flags);
+           if (p == 0)
+             return FNM_NOMATCH;
+         }
+         break;
+
+       default:
+         if ((U_CHAR)c != FOLD (sc))
+           return (FNM_NOMATCH);
+       }
+
+      ++n;
+    }
+
+  if (n == se)
+    return (0);
+
+  if ((flags & FNM_LEADING_DIR) && *n == L('/'))
+    /* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz".  */
+    return 0;
+         
+  return (FNM_NOMATCH);
+}
+
+/* Parse a bracket expression collating symbol ([.sym.]) starting at P, find
+   the value of the symbol, and move P past the collating symbol expression.
+   The value is returned in *VP, if VP is not null. */
+static CHAR *
+PARSE_COLLSYM (p, vp)
+     CHAR *p;
+     INT *vp;
+{
+  register int pc;
+  INT val;
+
+  p++;                         /* move past the `.' */
+         
+  for (pc = 0; p[pc]; pc++)
+    if (p[pc] == L('.') && p[pc+1] == L(']'))
+      break;
+   val = COLLSYM (p, pc);
+   if (vp)
+     *vp = val;
+   return (p + pc + 2);
+}
+
+/* Use prototype definition here because of type promotion. */
+static CHAR *
+#if defined (PROTOTYPES)
+BRACKMATCH (CHAR *p, U_CHAR test, int flags)
+#else
+BRACKMATCH (p, test, flags)
+     CHAR *p;
+     U_CHAR test;
+     int flags;
+#endif
+{
+  register CHAR cstart, cend, c;
+  register int not;    /* Nonzero if the sense of the character class is inverted.  */
+  int brcnt, forcecoll;;
+  INT pc;
+  CHAR *savep;
+
+  test = FOLD (test);
+
+  savep = p;
+
+  /* POSIX.2 3.13.1 says that an exclamation mark (`!') shall replace the
+     circumflex (`^') in its role in a `nonmatching list'.  A bracket
+     expression starting with an unquoted circumflex character produces
+     unspecified results.  This implementation treats the two identically. */
+  if (not = (*p == L('!') || *p == L('^')))
+    ++p;
+
+  c = *p++;
+  for (;;)
+    {
+      /* Initialize cstart and cend in case `-' is the last
+        character of the pattern. */
+      cstart = cend = c;
+      forcecoll = 0;
+
+      /* POSIX.2 equivalence class:  [=c=].  See POSIX.2 2.8.3.2.  Find
+        the end of the equivalence class, move the pattern pointer past
+        it, and check for equivalence.  XXX - this handles only
+        single-character equivalence classes, which is wrong, or at
+        least incomplete. */
+      if (c == L('[') && *p == L('=') && p[2] == L('=') && p[3] == L(']'))
+       {
+         pc = FOLD (p[1]);
+         p += 4;
+         if (COLLEQUIV (test, pc))
+           {
+/*[*/        /* Move past the closing `]', since the first thing we do at
+                the `matched:' label is back p up one. */
+             p++;
+             goto matched;
+           }
+         else
+           {
+             c = *p++;
+             if (c == L('\0'))
+               return ((test == L('[')) ? savep : (CHAR *)0); /*]*/
+             c = FOLD (c);
+             continue;
+           }
+       }
+
+      /* POSIX.2 character class expression.  See POSIX.2 2.8.3.2. */
+      if (c == L('[') && *p == L(':'))
+       {
+         CHAR *close, *ccname;
+
+         pc = 0;       /* make sure invalid char classes don't match. */
+         /* Find end of character class name */
+         for (close = p + 1; *close != '\0'; close++)
+           if (*close == L(':') && *(close+1) == L(']'))
+             break;
+
+         if (*close != L('\0'))
+           {
+             ccname = (CHAR *)malloc ((close - p) * sizeof (CHAR));
+             if (ccname == 0)
+               pc = 0;
+             else
+               {
+                 bcopy (p + 1, ccname, (close - p - 1) * sizeof (CHAR));
+                 *(ccname + (close - p - 1)) = L('\0');
+                 pc = IS_CCLASS (test, (XCHAR *)ccname);
+               }
+             if (pc == -1)
+               pc = 0;
+             else
+               p = close + 2;
+
+             free (ccname);
+           }
+           
+         if (pc)
+           {
+/*[*/        /* Move past the closing `]', since the first thing we do at
+                the `matched:' label is back p up one. */
+             p++;
+             goto matched;
+           }
+         else
+           {
+             /* continue the loop here, since this expression can't be
+                the first part of a range expression. */
+             c = *p++;
+             if (c == L('\0'))
+               return ((test == L('[')) ? savep : (CHAR *)0);
+             else if (c == L(']'))
+               break;
+             c = FOLD (c);
+             continue;
+           }
+       }
+      /* POSIX.2 collating symbols.  See POSIX.2 2.8.3.2.  Find the end of
+        the symbol name, make sure it is terminated by `.]', translate
+        the name to a character using the external table, and do the
+        comparison. */
+      if (c == L('[') && *p == L('.'))
+       {
+         p = PARSE_COLLSYM (p, &pc);
+         /* An invalid collating symbol cannot be the first point of a
+            range.  If it is, we set cstart to one greater than `test',
+            so any comparisons later will fail. */
+         cstart = (pc == INVALID) ? test + 1 : pc;
+         forcecoll = 1;
+       }
+
+      if (!(flags & FNM_NOESCAPE) && c == L('\\'))
+       {
+         if (*p == '\0')
+           return (CHAR *)0;
+         cstart = cend = *p++;
+       }
+
+      cstart = cend = FOLD (cstart);
+
+      /* POSIX.2 2.8.3.1.2 says: `An expression containing a `[' that
+        is not preceded by a backslash and is not part of a bracket
+        expression produces undefined results.'  This implementation
+        treats the `[' as just a character to be matched if there is
+        not a closing `]'. */
+      if (c == L('\0'))
+       return ((test == L('[')) ? savep : (CHAR *)0);
+
+      c = *p++;
+      c = FOLD (c);
+
+      if ((flags & FNM_PATHNAME) && c == L('/'))
+       /* [/] can never match when matching a pathname.  */
+       return (CHAR *)0;
+
+      /* This introduces a range, unless the `-' is the last
+        character of the class.  Find the end of the range
+        and move past it. */
+      if (c == L('-') && *p != L(']'))
+       {
+         cend = *p++;
+         if (!(flags & FNM_NOESCAPE) && cend == L('\\'))
+           cend = *p++;
+         if (cend == L('\0'))
+           return (CHAR *)0;
+         if (cend == L('[') && *p == L('.'))
+           {
+             p = PARSE_COLLSYM (p, &pc);
+             /* An invalid collating symbol cannot be the second part of a
+                range expression.  If we get one, we set cend to one fewer
+                than the test character to make sure the range test fails. */
+             cend = (pc == INVALID) ? test - 1 : pc;
+             forcecoll = 1;
+           }
+         cend = FOLD (cend);
+
+         c = *p++;
+
+         /* POSIX.2 2.8.3.2:  ``The ending range point shall collate
+            equal to or higher than the starting range point; otherwise
+            the expression shall be treated as invalid.''  Note that this
+            applies to only the range expression; the rest of the bracket
+            expression is still checked for matches. */
+         if (RANGECMP (cstart, cend, forcecoll) > 0)
+           {
+             if (c == L(']'))
+               break;
+             c = FOLD (c);
+             continue;
+           }
+       }
+
+      if (RANGECMP (test, cstart, forcecoll) >= 0 && RANGECMP (test, cend, forcecoll) <= 0)
+       goto matched;
+
+      if (c == L(']'))
+       break;
+    }
+  /* No match. */
+  return (!not ? (CHAR *)0 : p);
+
+matched:
+  /* Skip the rest of the [...] that already matched.  */
+  c = *--p;
+  brcnt = 1;
+  while (brcnt > 0)
+    {
+      /* A `[' without a matching `]' is just another character to match. */
+      if (c == L('\0'))
+       return ((test == L('[')) ? savep : (CHAR *)0);
+
+      c = *p++;
+      if (c == L('[') && (*p == L('=') || *p == L(':') || *p == L('.')))
+       brcnt++;
+      else if (c == L(']'))
+       brcnt--;
+      else if (!(flags & FNM_NOESCAPE) && c == L('\\'))
+       {
+         if (*p == '\0')
+           return (CHAR *)0;
+         /* XXX 1003.2d11 is unclear if this is right. */
+         ++p;
+       }
+    }
+  return (not ? (CHAR *)0 : p);
+}
+
+#if defined (EXTENDED_GLOB)
+/* ksh-like extended pattern matching:
+
+       [?*+@!](pat-list)
+
+   where pat-list is a list of one or patterns separated by `|'.  Operation
+   is as follows:
+
+       ?(patlist)      match zero or one of the given patterns
+       *(patlist)      match zero or more of the given patterns
+       +(patlist)      match one or more of the given patterns
+       @(patlist)      match exactly one of the given patterns
+       !(patlist)      match anything except one of the given patterns
+*/
+
+/* Scan a pattern starting at STRING and ending at END, keeping track of
+   embedded () and [].  If DELIM is 0, we scan until a matching `)'
+   because we're scanning a `patlist'.  Otherwise, we scan until we see
+   DELIM.  In all cases, we never scan past END.  The return value is the
+   first character after the matching DELIM. */
+/*static*/ CHAR *
+PATSCAN (string, end, delim)
+     CHAR *string, *end;
+     INT delim;
+{
+  int pnest, bnest, skip;
+  INT cchar;
+  CHAR *s, c, *bfirst;
+
+  pnest = bnest = skip = 0;
+  cchar = 0;
+  bfirst = NULL;
+
+  for (s = string; c = *s; s++)
+    {
+      if (s >= end)
+       return (s);
+      if (skip)
+       {
+         skip = 0;
+         continue;
+       }
+      switch (c)
+       {
+       case L('\\'):
+         skip = 1;
+         break;
+
+       case L('\0'):
+         return ((CHAR *)NULL);
+
+       /* `[' is not special inside a bracket expression, but it may
+          introduce one of the special POSIX bracket expressions
+          ([.SYM.], [=c=], [: ... :]) that needs special handling. */
+       case L('['):
+         if (bnest == 0)
+           {
+             bfirst = s + 1;
+             if (*bfirst == L('!') || *bfirst == L('^'))
+               bfirst++;
+             bnest++;
+           }
+         else if (s[1] == L(':') || s[1] == L('.') || s[1] == L('='))
+           cchar = s[1];
+         break;
+
+       /* `]' is not special if it's the first char (after a leading `!'
+          or `^') in a bracket expression or if it's part of one of the
+          special POSIX bracket expressions ([.SYM.], [=c=], [: ... :]) */
+       case L(']'):
+         if (bnest)
+           {
+             if (cchar && s[-1] == cchar)
+               cchar = 0;
+             else if (s != bfirst)
+               {
+                 bnest--;
+                 bfirst = 0;
+               }
+           }
+         break;
+
+       case L('('):
+         if (bnest == 0)
+           pnest++;
+         break;
+
+       case L(')'):
+         if (bnest == 0 && pnest-- <= 0)
+           return ++s;
+         break;
+
+       case L('|'):
+         if (bnest == 0 && pnest == 0 && delim == L('|'))
+           return ++s;
+         break;
+       }
+    }
+
+  return (NULL);
+}
+
+/* Return 0 if dequoted pattern matches S in the current locale. */
+static int
+STRCOMPARE (p, pe, s, se)
+     CHAR *p, *pe, *s, *se;
+{
+  int ret;
+  CHAR c1, c2;
+
+  c1 = *pe;
+  c2 = *se;
+
+  *pe = *se = '\0';
+#if HAVE_MULTIBYTE || defined (HAVE_STRCOLL)
+  ret = STRCOLL ((XCHAR *)p, (XCHAR *)s);
+#else
+  ret = STRCMP ((XCHAR *)p, (XCHAR *)s);
+#endif
+
+  *pe = c1;
+  *se = c2;
+
+  return (ret == 0 ? ret : FNM_NOMATCH);
+}
+
+/* Match a ksh extended pattern specifier.  Return FNM_NOMATCH on failure or
+   0 on success.  This is handed the entire rest of the pattern and string
+   the first time an extended pattern specifier is encountered, so it calls
+   gmatch recursively. */
+static int
+EXTMATCH (xc, s, se, p, pe, flags)
+     INT xc;           /* select which operation */
+     CHAR *s, *se;
+     CHAR *p, *pe;
+     int flags;
+{
+  CHAR *prest;                 /* pointer to rest of pattern */
+  CHAR *psub;                  /* pointer to sub-pattern */
+  CHAR *pnext;                 /* pointer to next sub-pattern */
+  CHAR *srest;                 /* pointer to rest of string */
+  int m1, m2, xflags;          /* xflags = flags passed to recursive matches */
+
+#if DEBUG_MATCHING
+fprintf(stderr, "extmatch: xc = %c\n", xc);
+fprintf(stderr, "extmatch: s = %s; se = %s\n", s, se);
+fprintf(stderr, "extmatch: p = %s; pe = %s\n", p, pe);
+fprintf(stderr, "extmatch: flags = %d\n", flags);
+#endif
+
+  prest = PATSCAN (p + (*p == L('(')), pe, 0); /* ) */
+  if (prest == 0)
+    /* If PREST is 0, we failed to scan a valid pattern.  In this
+       case, we just want to compare the two as strings. */
+    return (STRCOMPARE (p - 1, pe, s, se));
+
+  switch (xc)
+    {
+    case L('+'):               /* match one or more occurrences */
+    case L('*'):               /* match zero or more occurrences */
+      /* If we can get away with no matches, don't even bother.  Just
+        call GMATCH on the rest of the pattern and return success if
+        it succeeds. */
+      if (xc == L('*') && (GMATCH (s, se, prest, pe, flags) == 0))
+       return 0;
+
+      /* OK, we have to do this the hard way.  First, we make sure one of
+        the subpatterns matches, then we try to match the rest of the
+        string. */
+      for (psub = p + 1; ; psub = pnext)
+       {
+         pnext = PATSCAN (psub, pe, L('|'));
+         for (srest = s; srest <= se; srest++)
+           {
+             /* Match this substring (S -> SREST) against this
+                subpattern (psub -> pnext - 1) */
+             m1 = GMATCH (s, srest, psub, pnext - 1, flags) == 0;
+             /* OK, we matched a subpattern, so make sure the rest of the
+                string matches the rest of the pattern.  Also handle
+                multiple matches of the pattern. */
+             if (m1)
+               {
+                 /* if srest > s, we are not at start of string */
+                 xflags = (srest > s) ? (flags & ~FNM_PERIOD) : flags;
+                 m2 = (GMATCH (srest, se, prest, pe, xflags) == 0) ||
+                       (s != srest && GMATCH (srest, se, p - 1, pe, xflags) == 0);
+               }
+             if (m1 && m2)
+               return (0);
+           }
+         if (pnext == prest)
+           break;
+       }
+      return (FNM_NOMATCH);
+
+    case L('?'):               /* match zero or one of the patterns */
+    case L('@'):               /* match one (or more) of the patterns */
+      /* If we can get away with no matches, don't even bother.  Just
+        call gmatch on the rest of the pattern and return success if
+        it succeeds. */
+      if (xc == L('?') && (GMATCH (s, se, prest, pe, flags) == 0))
+       return 0;
+
+      /* OK, we have to do this the hard way.  First, we see if one of
+        the subpatterns matches, then, if it does, we try to match the
+        rest of the string. */
+      for (psub = p + 1; ; psub = pnext)
+       {
+         pnext = PATSCAN (psub, pe, L('|'));
+         srest = (prest == pe) ? se : s;
+         for ( ; srest <= se; srest++)
+           {
+             /* if srest > s, we are not at start of string */
+             xflags = (srest > s) ? (flags & ~FNM_PERIOD) : flags;
+             if (GMATCH (s, srest, psub, pnext - 1, flags) == 0 &&
+                 GMATCH (srest, se, prest, pe, xflags) == 0)
+               return (0);
+           }
+         if (pnext == prest)
+           break;
+       }
+      return (FNM_NOMATCH);
+
+    case '!':          /* match anything *except* one of the patterns */
+      for (srest = s; srest <= se; srest++)
+       {
+         m1 = 0;
+         for (psub = p + 1; ; psub = pnext)
+           {
+             pnext = PATSCAN (psub, pe, L('|'));
+             /* If one of the patterns matches, just bail immediately. */
+             if (m1 = (GMATCH (s, srest, psub, pnext - 1, flags) == 0))
+               break;
+             if (pnext == prest)
+               break;
+           }
+         /* if srest > s, we are not at start of string */
+         xflags = (srest > s) ? (flags & ~FNM_PERIOD) : flags;
+         if (m1 == 0 && GMATCH (srest, se, prest, pe, xflags) == 0)
+           return (0);
+       }
+      return (FNM_NOMATCH);
+    }
+
+  return (FNM_NOMATCH);
+}
+#endif /* EXTENDED_GLOB */
+
+#undef IS_CCLASS
+#undef FOLD
+#undef CHAR
+#undef U_CHAR
+#undef XCHAR
+#undef INT
+#undef INVALID
+#undef FCT
+#undef GMATCH
+#undef COLLSYM
+#undef PARSE_COLLSYM
+#undef PATSCAN
+#undef STRCOMPARE
+#undef EXTMATCH
+#undef BRACKMATCH
+#undef STRCHR
+#undef STRCOLL
+#undef STRLEN
+#undef STRCMP
+#undef COLLEQUIV
+#undef RANGECMP
+#undef L
index cd217e422ed7f4bafe392b2de90dabfa4f113976..fc926e539bf39e5b3a5c70a6dbe7c56e810b5d93 100644 (file)
 
 #include <stdio.h> // size_t
 
+#if defined(__TANDEM) && defined(HAVE_STDBOOL_H) && (__STDC_VERSION__ < 199901L)
+typedef int _Bool;
+#endif
+
 #if defined (HAVE_STDBOOL_H)
 #  include <stdbool.h> // bool
 #else
diff --git a/lib/readline/colors.h~ b/lib/readline/colors.h~
new file mode 100644 (file)
index 0000000..cd217e4
--- /dev/null
@@ -0,0 +1,118 @@
+/* `dir', `vdir' and `ls' directory listing programs for GNU.
+
+   Modified by Chet Ramey for Readline.
+
+   Copyright (C) 1985, 1988, 1990-1991, 1995-2010, 2012 Free Software Foundation,
+   Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Richard Stallman and David MacKenzie.  */
+
+/* Color support by Peter Anvin <Peter.Anvin@linux.org> and Dennis
+   Flaherty <dennisf@denix.elk.miles.com> based on original patches by
+   Greg Lee <lee@uhunix.uhcc.hawaii.edu>.  */
+
+#ifndef _COLORS_H_
+#define _COLORS_H_
+
+#include <stdio.h> // size_t
+
+#if defined (HAVE_STDBOOL_H)
+#  include <stdbool.h> // bool
+#else
+typedef int _rl_bool_t;
+
+#ifdef bool
+#  undef bool
+#endif
+#define bool _rl_bool_t
+
+#ifndef true
+#  define true 1
+#  define false 0
+#endif
+
+#endif /* !HAVE_STDBOOL_H */
+
+/* Null is a valid character in a color indicator (think about Epson
+   printers, for example) so we have to use a length/buffer string
+   type. */
+struct bin_str
+  {
+    size_t len;
+    const char *string;
+  };
+
+/* file type indicators (dir, sock, fifo, ...)
+   Default value is initialized in parse-colors.c.
+   It is then modified from the values of $LS_COLORS. */
+extern struct bin_str _rl_color_indicator[];
+
+/* The LS_COLORS variable is in a termcap-like format. */
+typedef struct _color_ext_type
+  {
+    struct bin_str ext;                /* The extension we're looking for */
+    struct bin_str seq;                /* The sequence to output when we do */
+    struct _color_ext_type *next;      /* Next in list */
+  } COLOR_EXT_TYPE;
+
+/* file extensions indicators (.txt, .log, .jpg, ...)
+   Values are taken from $LS_COLORS in rl_parse_colors(). */
+extern COLOR_EXT_TYPE *_rl_color_ext_list;
+
+#define FILETYPE_INDICATORS                            \
+  {                                                    \
+    C_ORPHAN, C_FIFO, C_CHR, C_DIR, C_BLK, C_FILE,     \
+    C_LINK, C_SOCK, C_FILE, C_DIR                      \
+  }
+
+/* Whether we used any colors in the output so far.  If so, we will
+   need to restore the default color later.  If not, we will need to
+   call prep_non_filename_text before using color for the first time. */
+
+enum indicator_no
+  {
+    C_LEFT, C_RIGHT, C_END, C_RESET, C_NORM, C_FILE, C_DIR, C_LINK,
+    C_FIFO, C_SOCK,
+    C_BLK, C_CHR, C_MISSING, C_ORPHAN, C_EXEC, C_DOOR, C_SETUID, C_SETGID,
+    C_STICKY, C_OTHER_WRITABLE, C_STICKY_OTHER_WRITABLE, C_CAP, C_MULTIHARDLINK,
+    C_CLR_TO_EOL
+  };
+
+
+#if !S_IXUGO
+# define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH)
+#endif
+
+enum filetype
+  {
+    unknown,
+    fifo,
+    chardev,
+    directory,
+    blockdev,
+    normal,
+    symbolic_link,
+    sock,
+    whiteout,
+    arg_directory
+  };
+
+extern void _rl_put_indicator (const struct bin_str *ind);
+extern void _rl_set_normal_color (void);
+extern bool _rl_print_color_indicator (char *f);
+extern void _rl_prep_non_filename_text (void);
+
+#endif /* !_COLORS_H_ */
index 1c30bf43318463cfc13c1ef47e49dc57f533452f..c79ba9cdfadceafa091b3cc490b1567356ff84d5 100644 (file)
@@ -222,7 +222,7 @@ sh_backslash_quote (string, table, flags)
 
   result = (char *)xmalloc (2 * strlen (string) + 1);
 
-  backslash_table = table ? table : bstab;
+  backslash_table = table ? table : (char *)bstab;
   for (r = result, s = string; s && (c = *s); s++)
     {
       if (backslash_table[c] == 1)
diff --git a/lib/sh/shquote.c~ b/lib/sh/shquote.c~
new file mode 100644 (file)
index 0000000..1c30bf4
--- /dev/null
@@ -0,0 +1,304 @@
+/* shquote - functions to quote and dequote strings */
+
+/* Copyright (C) 1999 Free Software Foundation, Inc.
+
+   This file is part of GNU Bash, the Bourne Again SHell.
+
+   Bash is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   Bash is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with Bash.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <config.h>
+
+#if defined (HAVE_UNISTD_H)
+#  ifdef _MINIX
+#    include <sys/types.h>
+#  endif
+#  include <unistd.h>
+#endif
+
+#include <stdio.h>
+
+#include "syntax.h"
+#include <xmalloc.h>
+
+/* Default set of characters that should be backslash-quoted in strings */
+static const char bstab[256] =
+  {
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 1, 1, 0, 0, 0, 0, 0,    /* TAB, NL */
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+
+    1, 1, 1, 0, 1, 0, 1, 1,    /* SPACE, !, DQUOTE, DOL, AMP, SQUOTE */
+    1, 1, 1, 0, 1, 0, 0, 0,    /* LPAR, RPAR, STAR, COMMA */
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 1, 0, 1, 1,    /* SEMI, LESSTHAN, GREATERTHAN, QUEST */
+
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 1, 1, 1, 0,    /* LBRACK, BS, RBRACK, CARAT */
+
+    1, 0, 0, 0, 0, 0, 0, 0,    /* BACKQ */
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 1, 1, 0, 0,    /* LBRACE, BAR, RBRACE */
+
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+  };
+
+/* **************************************************************** */
+/*                                                                 */
+/*      Functions for quoting strings to be re-read as input       */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Return a new string which is the single-quoted version of STRING.
+   Used by alias and trap, among others. */
+char *
+sh_single_quote (string)
+     const char *string;
+{
+  register int c;
+  char *result, *r;
+  const char *s;
+
+  result = (char *)xmalloc (3 + (4 * strlen (string)));
+  r = result;
+  *r++ = '\'';
+
+  for (s = string; s && (c = *s); s++)
+    {
+      *r++ = c;
+
+      if (c == '\'')
+       {
+         *r++ = '\\';  /* insert escaped single quote */
+         *r++ = '\'';
+         *r++ = '\'';  /* start new quoted string */
+       }
+    }
+
+  *r++ = '\'';
+  *r = '\0';
+
+  return (result);
+}
+
+/* Quote STRING using double quotes.  Return a new string. */
+char *
+sh_double_quote (string)
+     const char *string;
+{
+  register unsigned char c;
+  char *result, *r;
+  const char *s;
+
+  result = (char *)xmalloc (3 + (2 * strlen (string)));
+  r = result;
+  *r++ = '"';
+
+  for (s = string; s && (c = *s); s++)
+    {
+      /* Backslash-newline disappears within double quotes, so don't add one. */
+      if ((sh_syntaxtab[c] & CBSDQUOTE) && c != '\n')
+       *r++ = '\\';
+      else if (c == CTLESC || c == CTLNUL)
+       *r++ = CTLESC;          /* could be '\\'? */
+
+      *r++ = c;
+    }
+
+  *r++ = '"';
+  *r = '\0';
+
+  return (result);
+}
+
+/* Turn S into a simple double-quoted string.  If FLAGS is non-zero, quote
+   double quote characters in S with backslashes. */
+char *
+sh_mkdoublequoted (s, slen, flags)
+     const char *s;
+     int slen, flags;
+{
+  char *r, *ret;
+  int rlen;
+
+  rlen = (flags == 0) ? slen + 3 : (2 * slen) + 1;
+  ret = r = (char *)xmalloc (rlen);
+  
+  *r++ = '"';
+  while (*s)
+    {
+      if (flags && *s == '"')
+       *r++ = '\\';
+      *r++ = *s++;
+    }
+  *r++ = '"';
+  *r = '\0';
+
+  return ret;
+}
+
+/* Remove backslashes that are quoting characters that are special between
+   double quotes.  Return a new string.  XXX - should this handle CTLESC
+   and CTLNUL? */
+char *
+sh_un_double_quote (string)
+     char *string;
+{
+  register int c, pass_next;
+  char *result, *r, *s;
+
+  r = result = (char *)xmalloc (strlen (string) + 1);
+
+  for (pass_next = 0, s = string; s && (c = *s); s++)
+    {
+      if (pass_next)
+       {
+         *r++ = c;
+         pass_next = 0;
+         continue;
+       }
+      if (c == '\\' && (sh_syntaxtab[(unsigned char) s[1]] & CBSDQUOTE))
+       {
+         pass_next = 1;
+         continue;
+       }
+      *r++ = c;
+    }
+
+  *r = '\0';
+  return result;
+}
+
+/* Quote special characters in STRING using backslashes.  Return a new
+   string.  NOTE:  if the string is to be further expanded, we need a
+   way to protect the CTLESC and CTLNUL characters.  As I write this,
+   the current callers will never cause the string to be expanded without
+   going through the shell parser, which will protect the internal
+   quoting characters.  TABLE, if set, points to a map of the ascii code
+   set with char needing to be backslash-quoted if table[char]==1.  FLAGS,
+   if 1, causes tildes to be quoted as well. */
+   
+char *
+sh_backslash_quote (string, table, flags)
+     char *string;
+     char *table;
+     int flags;
+{
+  int c;
+  char *result, *r, *s, *backslash_table;
+
+  result = (char *)xmalloc (2 * strlen (string) + 1);
+
+  backslash_table = table ? table : bstab;
+  for (r = result, s = string; s && (c = *s); s++)
+    {
+      if (backslash_table[c] == 1)
+       *r++ = '\\';
+      else if (c == '#' && s == string)                        /* comment char */
+       *r++ = '\\';
+      else if ((flags&1) && c == '~' && (s == string || s[-1] == ':' || s[-1] == '='))
+        /* Tildes are special at the start of a word or after a `:' or `='
+          (technically unquoted, but it doesn't make a difference in practice) */
+       *r++ = '\\';
+      *r++ = c;
+    }
+
+  *r = '\0';
+  return (result);
+}
+
+#if defined (PROMPT_STRING_DECODE)
+/* Quote characters that get special treatment when in double quotes in STRING
+   using backslashes.  Return a new string. */
+char *
+sh_backslash_quote_for_double_quotes (string)
+     char *string;
+{
+  unsigned char c;
+  char *result, *r, *s;
+
+  result = (char *)xmalloc (2 * strlen (string) + 1);
+
+  for (r = result, s = string; s && (c = *s); s++)
+    {
+      if (sh_syntaxtab[c] & CBSDQUOTE)
+       *r++ = '\\';
+      /* I should probably add flags for these to sh_syntaxtab[] */
+      else if (c == CTLESC || c == CTLNUL)
+       *r++ = CTLESC;          /* could be '\\'? */
+
+      *r++ = c;
+    }
+
+  *r = '\0';
+  return (result);
+}
+#endif /* PROMPT_STRING_DECODE */
+
+int
+sh_contains_shell_metas (string)
+     char *string;
+{
+  char *s;
+
+  for (s = string; s && *s; s++)
+    {
+      switch (*s)
+       {
+       case ' ': case '\t': case '\n':         /* IFS white space */
+       case '\'': case '"': case '\\':         /* quoting chars */
+       case '|': case '&': case ';':           /* shell metacharacters */
+       case '(': case ')': case '<': case '>':
+       case '!': case '{': case '}':           /* reserved words */
+       case '*': case '[': case '?': case ']': /* globbing chars */
+       case '^':
+       case '$': case '`':                     /* expansion chars */
+         return (1);
+       case '~':                               /* tilde expansion */
+         if (s == string || s[-1] == '=' || s[-1] == ':')
+           return (1);
+         break;
+       case '#':
+         if (s == string)                      /* comment char */
+           return (1);
+         /* FALLTHROUGH */
+       default:
+         break;
+       }
+    }
+
+  return (0);
+}
diff --git a/parse.y b/parse.y
index c0da6301fe078b2863c4da52c0f76f674c151286..2ffb5e0a412187359a49ddec7f5d927d158be48a 100644 (file)
--- a/parse.y
+++ b/parse.y
@@ -3675,6 +3675,17 @@ eof_error:
            }
          else if MBTEST((tflags & LEX_CKCOMMENT) && ch == '#' && (lex_rwlen == 0 || ((tflags & LEX_INWORD) && lex_wlen == 0)))
            ;   /* don't modify LEX_RESWDOK if we're starting a comment */
+         /* Allow `do' followed by space, tab, or newline to preserve the
+            RESWDOK flag, but reset the reserved word length counter so we
+            can read another one. */
+         else if MBTEST(((tflags & LEX_INCASE) == 0) &&
+                         (isblank(ch) || ch == '\n') &&
+                         lex_rwlen == 2 &&
+                         STREQN (ret + retind - 2, "do", 2))
+{
+/*itrace("parse_comsub:%d: lex_incase == 1 found `%c', found \"do\"", line_number, ch);*/
+           lex_rwlen = 0;
+}
          else if MBTEST((tflags & LEX_INCASE) && ch != '\n')
            /* If we can read a reserved word and we're in case, we're at the
               point where we can read a new pattern list or an esac.  We
@@ -3690,6 +3701,15 @@ eof_error:
            tflags &= ~LEX_RESWDOK;
 /*itrace("parse_comsub:%d: found `%c', lex_reswordok -> 0", line_number, ch);*/
 }
+#if 0
+         /* If we find a space or tab but have read something and it's not
+            `do', turn off the reserved-word-ok flag */
+         else if MBTEST(isblank (ch) && lex_rwlen > 0)
+{
+           tflags &= ~LEX_RESWDOK;
+/*itrace("parse_comsub:%d: found `%c', lex_reswordok -> 0", line_number, ch);*/
+}
+#endif
        }
 
       /* Might be the start of a here-doc delimiter */
index 1f3326055e42ba25e3517959649eb92c54b07fe5..4d0dcb074f12b387e6c02e052a3f761cf10dc7ae 100644 (file)
--- a/po/vi.po
+++ b/po/vi.po
 # This file is distributed under the same license as the bash package.
 # Clytie Siddall <clytie@riverland.net.au>, 2008, 2009, 2010.
 # Trần Ngọc Quân <vnwildman@gmail.com>, 2012.
+# Nguyễn Thái Ngọc Duy <pclouds@gmail.com>, 2012.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: bash-4.2\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-03-05 22:17-0500\n"
-"PO-Revision-Date: 2012-03-04 14:59+0700\n"
+"POT-Creation-Date: 2011-01-28 22:09-0500\n"
+"PO-Revision-Date: 2012-09-11 07:29+0700\n"
 "Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n"
-"Language-Team: Vietnamese <vi-VN@googlegroups.com>\n"
+"Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n"
 "Language: vi\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 "X-Generator: LocFactoryEditor 1.8\n"
-"X-Poedit-Language: Vietnamese\n"
-"X-Poedit-Country: VIET NAM\n"
-"X-Poedit-SourceCharset: utf-8\n"
+"X-Poedit-SourceCharset: UTF-8\n"
 
-#: arrayfunc.c:51
+#: arrayfunc.c:50
 msgid "bad array subscript"
-msgstr "sai mảng in thấp"
+msgstr "chỉ mục mảng sai"
 
-#: arrayfunc.c:330 builtins/declare.def:487
+#: arrayfunc.c:313 builtins/declare.def:487
 #, c-format
 msgid "%s: cannot convert indexed to associative array"
 msgstr "%s: không thể chuyển đổi mảng kiểu chỉ số sang mảng kết hợp"
 
-#: arrayfunc.c:513
+#: arrayfunc.c:480
 #, c-format
 msgid "%s: invalid associative array key"
-msgstr "%s: khoá mảng kết hợp không hợp lệ"
+msgstr "%s: khoá mảng liên kết không hợp lệ"
 
-#: arrayfunc.c:515
+#: arrayfunc.c:482
 #, c-format
 msgid "%s: cannot assign to non-numeric index"
 msgstr "%s: không thể gán cho chỉ số không thuộc kiểu số"
 
-#: arrayfunc.c:557
+#: arrayfunc.c:518
 #, c-format
 msgid "%s: %s: must use subscript when assigning associative array"
 msgstr "%s: %s: phải sử dụng chữ thấp khi gán mảng kết hợp"
 
-#: bashhist.c:388
+#: bashhist.c:387
 #, c-format
 msgid "%s: cannot create: %s"
-msgstr "%s: không thể tạo %s"
+msgstr "%s: không thể tạo: %s"
 
-#: bashline.c:3868
+#: bashline.c:3498
 msgid "bash_execute_unix_command: cannot find keymap for command"
 msgstr "bash_execute_unix_command: không tìm thấy ánh xạ cho câu lệnh"
 
-#: bashline.c:3955
+#: bashline.c:3584
 #, c-format
 msgid "%s: first non-whitespace character is not `\"'"
-msgstr ""
-"%s: ký tự khác khoảng trắng đầu tiên không phải là dấu sổ chéo ngược `\"'"
+msgstr "%s: ký tự khác khoảng trắng đầu tiên không phải là `\"'"
 
-#: bashline.c:3984
+#: bashline.c:3613
 #, c-format
 msgid "no closing `%c' in %s"
-msgstr "thiếu đấu đóng `%c' trong %s"
+msgstr "thiếu dấu đóng `%c' trong %s"
 
-#: bashline.c:4018
+#: bashline.c:3647
 #, c-format
 msgid "%s: missing colon separator"
-msgstr "%s: thiếu dấu hai chấm định giới"
+msgstr "%s: thiếu dấu hai chấm phân cách"
 
 #: builtins/alias.def:132
 #, c-format
 msgid "`%s': invalid alias name"
-msgstr "`%s': sai tên bí danh"
+msgstr "`%s': tên bí danh không hợp lệ"
 
-#: builtins/bind.def:123 builtins/bind.def:126
+#: builtins/bind.def:120 builtins/bind.def:123
 msgid "line editing not enabled"
 msgstr "chưa bật sửa đổi dòng"
 
-#: builtins/bind.def:212
+#: builtins/bind.def:206
 #, c-format
 msgid "`%s': invalid keymap name"
 msgstr "`%s': tên ánh xạ phím không hợp lệ"
 
-#: builtins/bind.def:251
+#: builtins/bind.def:245
 #, c-format
 msgid "%s: cannot read: %s"
-msgstr "%s: không thể đọc %s"
+msgstr "%s: không thể đọc: %s"
 
-#: builtins/bind.def:266
+#: builtins/bind.def:260
 #, c-format
 msgid "`%s': cannot unbind"
 msgstr "`%s': không thể tháo"
 
-#: builtins/bind.def:304 builtins/bind.def:334
+#: builtins/bind.def:295 builtins/bind.def:325
 #, c-format
 msgid "`%s': unknown function name"
 msgstr "`%s': tên hàm không rõ"
 
-#: builtins/bind.def:312
+#: builtins/bind.def:303
 #, c-format
 msgid "%s is not bound to any keys.\n"
 msgstr "%s không được tổ hợp với phím.\n"
 
-#: builtins/bind.def:316
+#: builtins/bind.def:307
 #, c-format
 msgid "%s can be invoked via "
 msgstr "%s có thể được gọi thông qua "
@@ -126,51 +124,51 @@ msgid ""
 msgstr ""
 "Trả lại ngữ cảnh của lời gọi thường trình con hiện thời.\n"
 "\n"
-"    Không có BIỂUTHỨC thì trả lại "
+"    Nếu không có BTHỨC thì trả lại "
 
-#: builtins/cd.def:239
+#: builtins/cd.def:235
 msgid "HOME not set"
 msgstr "Chưa đặt biến môi trường HOME"
 
-#: builtins/cd.def:247 builtins/common.c:166 test.c:832
-msgid "too many arguments"
-msgstr "quá nhiều đối số"
-
-#: builtins/cd.def:258
+#: builtins/cd.def:247
 msgid "OLDPWD not set"
 msgstr "Chưa đặt biến môi trường OLDPWD"
 
 #: builtins/common.c:101
 #, c-format
 msgid "line %d: "
-msgstr "dòng %d:"
+msgstr "dòng %d: "
 
-#: builtins/common.c:139 error.c:265
+#: builtins/common.c:139 error.c:261
 #, c-format
 msgid "warning: "
-msgstr "cảnh báo :"
+msgstr "cảnh báo"
 
 #: builtins/common.c:153
 #, c-format
 msgid "%s: usage: "
-msgstr "%s: sử dụng:"
+msgstr "%s: sử dụng: "
 
-#: builtins/common.c:191 shell.c:504 shell.c:786
+#: builtins/common.c:166 test.c:832
+msgid "too many arguments"
+msgstr "quá nhiều đối số"
+
+#: builtins/common.c:191 shell.c:500 shell.c:782
 #, c-format
 msgid "%s: option requires an argument"
-msgstr "%s: tùy chọn cần thiết một đối số"
+msgstr "%s: tùy chọn cần một đối số"
 
 #: builtins/common.c:198
 #, c-format
 msgid "%s: numeric argument required"
-msgstr "%s: cần thiết đối số thuộc số"
+msgstr "%s: cần đối số dạng số"
 
 #: builtins/common.c:205
 #, c-format
 msgid "%s: not found"
 msgstr "%s: không tìm thấy"
 
-#: builtins/common.c:214 shell.c:799
+#: builtins/common.c:214 shell.c:795
 #, c-format
 msgid "%s: invalid option"
 msgstr "%s: tùy chọn không hợp lệ"
@@ -180,10 +178,10 @@ msgstr "%s: tùy chọn không hợp lệ"
 msgid "%s: invalid option name"
 msgstr "%s: tên tùy chọn không hợp lệ"
 
-#: builtins/common.c:228 general.c:234 general.c:239
+#: builtins/common.c:228 general.c:231 general.c:236
 #, c-format
 msgid "`%s': not a valid identifier"
-msgstr "`%s': không phải Ä\91á»\93 nhận diá»\87n hợp lệ"
+msgstr "`%s': không phải Ä\91á»\8bnh danh hợp lệ"
 
 #: builtins/common.c:238
 msgid "invalid octal number"
@@ -193,21 +191,21 @@ msgstr "số bát phân không hợp lệ"
 msgid "invalid hex number"
 msgstr "số thập lục không hợp lệ"
 
-#: builtins/common.c:242 expr.c:1431
+#: builtins/common.c:242 expr.c:1362
 msgid "invalid number"
 msgstr "số không hợp lệ"
 
 #: builtins/common.c:250
 #, c-format
 msgid "%s: invalid signal specification"
-msgstr "%s: sai xác định tín hiệu"
+msgstr "%s: sai đặc tả tín hiệu"
 
 #: builtins/common.c:257
 #, c-format
 msgid "`%s': not a pid or valid job spec"
-msgstr "`%s': không phải một pid hoặc công việc"
+msgstr "`%s': không phải một pid hoặc đặc tả công việc hợp lệ"
 
-#: builtins/common.c:264 error.c:458
+#: builtins/common.c:264 error.c:454
 #, c-format
 msgid "%s: readonly variable"
 msgstr "%s: biến chỉ đọc"
@@ -252,7 +250,7 @@ msgstr "bị hạn chế"
 #: builtins/common.c:312
 #, c-format
 msgid "%s: not a shell builtin"
-msgstr "%s: không phải dựng sẵn trình bao"
+msgstr "%s: không phải shell"
 
 #: builtins/common.c:321
 #, c-format
@@ -262,55 +260,55 @@ msgstr "lỗi ghi: %s"
 #: builtins/common.c:329
 #, c-format
 msgid "error setting terminal attributes: %s"
-msgstr "gặp lỗi khi đặt các thuộc tính về thiết bị cuối: %s"
+msgstr "lỗi đặt các thuộc tính thiết bị cuối: %s"
 
 #: builtins/common.c:331
 #, c-format
 msgid "error getting terminal attributes: %s"
-msgstr "gặp lỗi khi lấy các thuộc tính về thiết bị cuối: %s"
+msgstr "lỗi lấy các thuộc tính thiết bị cuối: %s"
 
 #: builtins/common.c:563
 #, c-format
 msgid "%s: error retrieving current directory: %s: %s\n"
-msgstr "%s: gặp lỗi khi lấy thư mục hiện thời: %s: %s\n"
+msgstr "%s: lỗi lấy thư mục hiện thời: %s: %s\n"
 
 #: builtins/common.c:629 builtins/common.c:631
 #, c-format
 msgid "%s: ambiguous job spec"
 msgstr "%s: đặc tả công việc mơ hồ"
 
-#: builtins/complete.def:277
+#: builtins/complete.def:276
 #, c-format
 msgid "%s: invalid action name"
-msgstr "%s: tên hành vi không hợp lệ"
+msgstr "%s: tên hành động không hợp lệ"
 
-#: builtins/complete.def:450 builtins/complete.def:645
-#: builtins/complete.def:855
+#: builtins/complete.def:449 builtins/complete.def:644
+#: builtins/complete.def:853
 #, c-format
 msgid "%s: no completion specification"
-msgstr "%s: không có đặc tả điền nốt"
+msgstr "%s: không có đặc tả hoàn thành"
 
-#: builtins/complete.def:697
+#: builtins/complete.def:696
 msgid "warning: -F option may not work as you expect"
-msgstr "cảnh báo: tùy chọn « -F » có lẽ không hoạt động như mong đợi"
+msgstr "cảnh báo: tùy chọn \"-F\" có thể không hoạt động như mong đợi"
 
-#: builtins/complete.def:699
+#: builtins/complete.def:698
 msgid "warning: -C option may not work as you expect"
-msgstr "cảnh báo: tùy chọn « -C » có lẽ không hoạt động như mong đợi"
+msgstr "cảnh báo: tùy chọn \"-C\" có thể không hoạt động như mong đợi"
 
-#: builtins/complete.def:828
+#: builtins/complete.def:826
 msgid "not currently executing completion function"
-msgstr "hiện thời không thực thi chức năng điền nốt"
+msgstr "hiện thời không thực thi chức năng hoàn thành"
 
 #: builtins/declare.def:124
 msgid "can only be used in a function"
-msgstr "chỉ có thể được dùng trong một hàm"
+msgstr "chỉ có thể dùng trong một hàm"
 
 #: builtins/declare.def:366
 msgid "cannot use `-f' to make functions"
-msgstr "không thể dùng « -f » để tạo hàm"
+msgstr "không thể dùng \"-f\" để tạo hàm"
 
-#: builtins/declare.def:378 execute_cmd.c:5253
+#: builtins/declare.def:378 execute_cmd.c:5105
 #, c-format
 msgid "%s: readonly function"
 msgstr "%s: hàm chỉ đọc"
@@ -318,16 +316,16 @@ msgstr "%s: hàm chỉ đọc"
 #: builtins/declare.def:474
 #, c-format
 msgid "%s: cannot destroy array variables in this way"
-msgstr "%s: không thể phá hủy biến mảng bằng cách này"
+msgstr "%s: không thể hủy biến mảng bằng cách này"
 
-#: builtins/declare.def:481 builtins/read.def:702
+#: builtins/declare.def:481
 #, c-format
 msgid "%s: cannot convert associative to indexed array"
-msgstr "%s: không thể chuyển đổi mảng kết hợp sang mảng theo số mũ"
+msgstr "%s: không thể chuyển đổi mảng kết hợp sang mảng chỉ số"
 
 #: builtins/enable.def:137 builtins/enable.def:145
 msgid "dynamic loading not available"
-msgstr "không có sẵn chức năng nạp động"
+msgstr "không có chức năng nạp động"
 
 #: builtins/enable.def:312
 #, c-format
@@ -342,15 +340,15 @@ msgstr "không tìm thấy %s trong đối tượng dùng chung %s: %s"
 #: builtins/enable.def:459
 #, c-format
 msgid "%s: not dynamically loaded"
-msgstr "%s không phải được nạp động"
+msgstr "%s không được nạp động"
 
 #: builtins/enable.def:474
 #, c-format
 msgid "%s: cannot delete: %s"
 msgstr "%s: không thể xoá: %s"
 
-#: builtins/evalfile.c:135 builtins/hash.def:171 execute_cmd.c:5100
-#: shell.c:1461
+#: builtins/evalfile.c:135 builtins/hash.def:171 execute_cmd.c:4961
+#: shell.c:1457
 #, c-format
 msgid "%s: is a directory"
 msgstr "%s: là thư mục"
@@ -358,14 +356,15 @@ msgstr "%s: là thư mục"
 #: builtins/evalfile.c:140
 #, c-format
 msgid "%s: not a regular file"
-msgstr "%s: không phải là tập tin chuẩn"
+msgstr "%s: không phải là tập tin thường"
 
 #: builtins/evalfile.c:148
 #, c-format
 msgid "%s: file is too large"
 msgstr "%s: tập tin quá lớn"
 
-#: builtins/evalfile.c:182 builtins/evalfile.c:200 shell.c:1471
+#: builtins/evalfile.c:182 builtins/evalfile.c:200 execute_cmd.c:5032
+#: shell.c:1467
 #, c-format
 msgid "%s: cannot execute binary file"
 msgstr "%s: không thể thực hiện tập tin nhị phân"
@@ -382,17 +381,17 @@ msgstr "đăng xuất\n"
 
 #: builtins/exit.def:88
 msgid "not login shell: use `exit'"
-msgstr "không phải trình bao đăng nhập: hãy dùng lệnh « exit » (thoát)"
+msgstr "không phải shell đăng nhập: hãy dùng lệnh \"exit\""
 
 #: builtins/exit.def:120
 #, c-format
 msgid "There are stopped jobs.\n"
-msgstr "Vẫn có công việc bị dừng.\n"
+msgstr "Có công việc bị dừng.\n"
 
 #: builtins/exit.def:122
 #, c-format
 msgid "There are running jobs.\n"
-msgstr "Vẫn có công việc đang chạy.\n"
+msgstr "Có công việc đang chạy.\n"
 
 #: builtins/fc.def:262
 msgid "no command found"
@@ -405,11 +404,11 @@ msgstr "đặc tả lịch sử"
 #: builtins/fc.def:380
 #, c-format
 msgid "%s: cannot open temp file: %s"
-msgstr "%s: không thể mở tập tin tạm thời: %s"
+msgstr "%s: không thể mở tập tin tạm: %s"
 
 #: builtins/fg_bg.def:149 builtins/jobs.def:282
 msgid "current"
-msgstr "hiện thời"
+msgstr "hiện ti"
 
 #: builtins/fg_bg.def:158
 #, c-format
@@ -424,42 +423,37 @@ msgstr "%s: tùy chọn không được phép -- %c\n"
 #: builtins/getopt.c:111
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
-msgstr "%s: tùy chọn cần thiết đối số -- %c\n"
+msgstr "%s: tùy chọn cần đối số -- %c\n"
 
 #: builtins/hash.def:92
 msgid "hashing disabled"
-msgstr "chức năng tạo ký hiệu lộn xộn bị tắt"
+msgstr "tắt băm"
 
 #: builtins/hash.def:138
 #, c-format
 msgid "%s: hash table empty\n"
-msgstr "%s: bảng ký hiệu lộn xộn còn rỗng\n"
+msgstr "%s: bảng băm rỗng\n"
 
 #: builtins/hash.def:245
 #, c-format
 msgid "hits\tcommand\n"
-msgstr "gọi nhớ\tlệnh\n"
+msgstr "trúng\tlệnh\n"
 
 #: builtins/help.def:130
 #, c-format
 msgid "Shell commands matching keyword `"
 msgid_plural "Shell commands matching keywords `"
-msgstr[0] "Câu lệnh trình bao tương ứng với từ khoá `"
+msgstr[0] "Câu lệnh shell tương ứng với từ khoá `"
 
 #: builtins/help.def:168
 #, c-format
-msgid ""
-"no help topics match `%s'.  Try `help help' or `man -k %s' or `info %s'."
-msgstr ""
-"không có chủ đề trợ giúp tương ứng với `%s'. Hãy thử câu lệnh:\n"
-" • help help\n"
-" • man -k %s\n"
-" • info %s"
+msgid "no help topics match `%s'.  Try `help help' or `man -k %s' or `info %s'."
+msgstr "không có trợ giúp cho `%s'. Thử `help help', `man -k %s' hoặc `info %s'"
 
 #: builtins/help.def:185
 #, c-format
 msgid "%s: cannot open: %s"
-msgstr "%s: không thể mở : %s"
+msgstr "%s: không thể mở: %s"
 
 #: builtins/help.def:337
 #, c-format
@@ -472,27 +466,26 @@ msgid ""
 "A star (*) next to a name means that the command is disabled.\n"
 "\n"
 msgstr ""
-"Những câu lệnh trình bao này được xác định nội bộ. Hãy gõ :\n"
-" • help\t\tđể xem danh sách này.\n"
-" • info bash\tđể tìm thêm thông tin chung về trình bao.\n"
-" • man -k\t} • info\t\t} để tìm thêm thông tin về lệnh không có trong danh "
-"sách này.\n"
+"Những câu lệnh này được định nghĩa nội bộ. Gõ `help' để xem danh sách này.\n"
+"Gõ `help TÊN' để biết chi tiết về hàm `TÊN'.\n"
+"Dùng `info bash' để tìm thông tin chung về shell nói chung.\n"
+"Dùng `man -k' hoặc `info' để tìm thông tin về lệnh ngoài danh sách này.\n"
 "\n"
-"Dấu sao « * » bên cạnh tên thì ngụ ý nó bị tắt.\n"
+"Dấu sao (*) bên cạnh tên nghĩa là lệnh bị tắt.\n"
 "\n"
 
 #: builtins/history.def:154
 msgid "cannot use more than one of -anrw"
-msgstr "chỉ có thể dùng một của những tùy chọn « -a », « -n », « -r », « -w »"
+msgstr "chỉ có thể dùng một của những tùy chọn -anrw"
 
 #: builtins/history.def:186
 msgid "history position"
 msgstr "vị trí lịch sử"
 
-#: builtins/history.def:366
+#: builtins/history.def:365
 #, c-format
 msgid "%s: history expansion failed"
-msgstr "%s: lỗi mở rộng lịch sử"
+msgstr "%s: lỗi bung lịch sử"
 
 #: builtins/inlib.def:71
 #, c-format
@@ -501,32 +494,32 @@ msgstr "%s: inlib bị lỗi"
 
 #: builtins/jobs.def:109
 msgid "no other options allowed with `-x'"
-msgstr "không cho phép dùng tùy chọn thêm với « -x »"
+msgstr "không cho phép dùng tùy chọn thêm với \"-x\""
 
 #: builtins/kill.def:198
 #, c-format
 msgid "%s: arguments must be process or job IDs"
-msgstr "%s: đối số phải là mã số của tiến trình (PID) hoặc công việc"
+msgstr "%s: đối số phải là ID tiến trình hoặc công việc"
 
 #: builtins/kill.def:261
 msgid "Unknown error"
 msgstr "Lỗi không rõ"
 
-#: builtins/let.def:95 builtins/let.def:120 expr.c:577 expr.c:592
+#: builtins/let.def:95 builtins/let.def:120 expr.c:552 expr.c:567
 msgid "expression expected"
-msgstr "đợi biểu thức"
+msgstr "cần biểu thức"
 
 #: builtins/mapfile.def:172
 #, c-format
 msgid "%s: not an indexed array"
-msgstr "%s: không phải biến phụ lục"
+msgstr "%s: không phải là mảng chỉ số"
 
-#: builtins/mapfile.def:256 builtins/read.def:299
+#: builtins/mapfile.def:256 builtins/read.def:279
 #, c-format
 msgid "%s: invalid file descriptor specification"
-msgstr "%s: sai xác định bộ mô tả tập tin"
+msgstr "%s: đặc tả bộ mô tả tập tin không hợp lệ"
 
-#: builtins/mapfile.def:264 builtins/read.def:306
+#: builtins/mapfile.def:264 builtins/read.def:286
 #, c-format
 msgid "%d: invalid file descriptor: %s"
 msgstr "%d: bộ mô tả tập tin không hợp lệ: %s"
@@ -548,37 +541,37 @@ msgstr "%s: lượng gọi ngược không hợp lệ"
 
 #: builtins/mapfile.def:333
 msgid "empty array variable name"
-msgstr "%s: tên biến mảng vẫn trống"
+msgstr "tên biến mảng vẫn trống"
 
 #: builtins/mapfile.def:354
 msgid "array variable support required"
-msgstr "cần thiết hỗ trợ biến mảng"
+msgstr "cần hỗ trợ biến mảng"
 
-#: builtins/printf.def:397
+#: builtins/printf.def:394
 #, c-format
 msgid "`%s': missing format character"
 msgstr "`%s': thiếu ký tự định dạng"
 
-#: builtins/printf.def:451
+#: builtins/printf.def:448
 #, c-format
 msgid "`%c': invalid time format specification"
-msgstr "`%c': đặc tả định dạng cho thời gian không đúng"
+msgstr "`%c': đặc tả định dạng thời gian không đúng"
 
-#: builtins/printf.def:647
+#: builtins/printf.def:635
 #, c-format
 msgid "`%c': invalid format character"
-msgstr "« %c »: ký tự định dạng không hợp lệ"
+msgstr "\"%c\": ký tự định dạng không hợp lệ"
 
-#: builtins/printf.def:673
+#: builtins/printf.def:662
 #, c-format
 msgid "warning: %s: %s"
-msgstr "cảnh báo : %s: %s"
+msgstr "cảnh báo: %s: %s"
 
-#: builtins/printf.def:854
+#: builtins/printf.def:840
 msgid "missing hex digit for \\x"
 msgstr "thiếu chữ số thập phân cho \\x"
 
-#: builtins/printf.def:869
+#: builtins/printf.def:855
 #, c-format
 msgid "missing unicode digit for \\%c"
 msgstr "thiếu chữ số unicode cho \\%c"
@@ -593,11 +586,11 @@ msgstr "<không có thư mục hiện thời>"
 
 #: builtins/pushd.def:506
 msgid "directory stack empty"
-msgstr "đống thư mục vẫn trống"
+msgstr "chồng thư mục trống"
 
 #: builtins/pushd.def:508
 msgid "directory stack index"
-msgstr "chỉ mục đống thư mục"
+msgstr "chỉ mục chồng thư mục"
 
 #: builtins/pushd.def:683
 msgid ""
@@ -614,34 +607,28 @@ msgid ""
 "    \twith its position in the stack\n"
 "    \n"
 "    Arguments:\n"
-"      +N\tDisplays the Nth entry counting from the left of the list shown "
-"by\n"
+"      +N\tDisplays the Nth entry counting from the left of the list shown by\n"
 "    \tdirs when invoked without options, starting with zero.\n"
 "    \n"
-"      -N\tDisplays the Nth entry counting from the right of the list shown "
-"by\n"
+"      -N\tDisplays the Nth entry counting from the right of the list shown by\n"
 "\tdirs when invoked without options, starting with zero."
 msgstr ""
-"Hiển thị danh sách các thư mục được nhớ hiện thời.\n"
-"\tLệnh « pushd » thêm thư mục vào danh sách này;\n"
-"« popd » nâng thư mục lên danh sách.\n"
-"\n"
-"\tTùy chọn:\n"
-"\t\t-c\tgột đống thư mục bằng cách xoá mọi phần tử\n"
-"\t\t-l\tđừng in ra phiên bản thư mục có dấu ngã nằm trước\n"
-"\t\t\tmà tương ứng với thư mục chính của người dùng\n"
-"\t\t-p\tin ra đống thư mục mỗi dòng một mục\n"
-"\t\t-v\tin ra đống thư mục mỗi dòng một mục\n"
-"\t\t\tcó vị trí đống nằm trước\n"
-"\n"
-"\tĐối số :\n"
-"\t\t+N\thiển thị mục thứ N đếm từ bên trái danh sách\n"
-"\t\t\thiển thị theo thư mục khi không đưa ra tùy chọn,\n"
-"\t\t\tbắt đầu từ số không.\n"
-"\n"
-"\t\t-N\thiển thị mục thứ N đếm từ bên phải danh sách\n"
-"\t\t\thiển thị theo thư mục khi không đưa ra tùy chọn,\n"
-"\t\t\tbắt đầu từ số không."
+"Hiển thị danh sách các thư mục được nhớ hiện thời. Lệnh `pushd' thêm\n"
+"    thư mục vào danh sách này. `popd' lấy thư mục khỏi danh sách.\n"
+"\n"
+"    Tùy chọn:\n"
+"      -c\txoá mọi phần tử trong chồng thư mục\n"
+"      -l\tkhông in phiên bản thư mục có dấu ngã nằm trước\n"
+"        \tmà tương ứng với thư mục chính của người dùng\n"
+"      -p\tin chồng thư mục mỗi dòng một mục\n"
+"      -v\tin chồng thư mục mỗi dòng một mục kèm vị trí trong chồng\n"
+"\n"
+"    Đối số:\n"
+"      +N\thiển thị mục thứ N đếm từ bên trái khi gọi không tuỳ chọn,\n"
+"                bắt đầu từ số không.\n"
+"\n"
+"      -N\thiển thị mục thứ N đếm từ bên phải khi gọi không tuỳ chọn,\n"
+"                bắt đầu từ số không."
 
 #: builtins/pushd.def:705
 msgid ""
@@ -667,27 +654,25 @@ msgid ""
 "    \n"
 "    The `dirs' builtin displays the directory stack."
 msgstr ""
-"Thêm một thư mục vào đầu của đống thư mục, hoặc xoay đống,\n"
-"\tlàm cho thư mục mới đầu đống là thư mục làm việc hiện thời.\n"
-"\tKhông có đối số thì trao đổi hai thư mục đầu.\n"
+"Thêm thư mục vào trên chồng thư mục, hoặc xoay chồng, làm cho thư mục\n"
+"    hiện thời nằm ở trên đầu. Đổi vị trí hai thư mục trên cùng nếu\n"
+"    không có đối số.\n"
 "\n"
-"\tTùy chọn:\n"
-"\t\t-n\tthu hồi chức năng chuyển đổi thư mục bình thường\n"
-"\tkhi thêm thư mục vào đống, thì chỉ thao tác đống chính nó.\n"
+"    Tùy chọn:\n"
+"      -n\tngăn thay đổi thư mục bình thường khi thêm, chỉ thao tác\n"
+"        \ttrên chồng thư mục.\n"
 "\n"
-"\tĐối số :\n"
-"\t\t+N\txoay đống để mà thư mục thứ N\n"
-"\t\t\t(đếm từ bên trái danh sách hiển thị theo thư mục,\n"
-"\t\t\tbắt đầu từ số không) nằm ở đầu.\n"
+"    Đối số:\n"
+"      +N\txoay chồng để thư mục thứ N (đếm từ bên trái `dirs', bắt\n"
+"        \tđầu từ số không) nằm ở đầu.\n"
 "\n"
-"\t\t-N\txoay đống để mà thư mục thứ N\n"
-"\t\t\t(đếm từ bên phải danh sách hiển thị theo thư mục,\n"
-"\t\t\tbắt đầu từ số không) nằm ở đầu.\n"
+"      -N\txoay chồng để thư mục thứ N (đếm từ bên phải `dirs', bắt\n"
+"        \tđầu từ số không) nằm ở đầu.\n"
 "\n"
-"\t\tdir\tthêm DIR vào đầu đống thư mục,\n"
-"\t\tthì làm cho nó thư mục làm việc hiện thời.\n"
+"      THƯ-MỤC\tthêm THƯ-MỤC vào đầu chồng thư mục và dùng làm thư mục\n"
+"        \tlàm việc hiện thời.\n"
 "\n"
-"\tDựng sẵn « dirs » hiển thị đống thư mục."
+"    Lệnh `dirs' hiển thị chồng thư mục."
 
 #: builtins/pushd.def:730
 msgid ""
@@ -709,57 +694,53 @@ msgid ""
 "    \n"
 "    The `dirs' builtin displays the directory stack."
 msgstr ""
-"Gỡ bỏ thư mục khỏi đống thư mục.\n"
-"Không đưa ra đối số thì gỡ bỏ thư mục đầu khỏi đống,\n"
-"\tvà chuyển đổi sang thư mục đầu mới.\n"
+"Gỡ bỏ thư mục khỏi chồng thư mục. Không đưa ra đối số thì bỏ thư mục\n"
+"    đầu khỏi chồng và chuyển đổi sang thư mục đầu mới.\n"
 "\n"
-"\tTùy chọn:\n"
-"\t\t-n\tthu hồi chức năng chuyển đổi thư mục bình thường\n"
-"\t\tkhi gỡ bỏ thư mục khỏi đống, thì chỉ thao tác đống chính nó.\n"
+"    Tùy chọn:\n"
+"      -n\tngăn thay đổi thư mục bình thường khi thêm, chỉ thao tác\n"
+"\t\ttrên chồng thư mục.\n"
 "\n"
-"\tĐối số :\n"
-"\t\t+N\tgỡ bỏ mục thứ N đếm từ bên trái danh sách\n"
-"\t\t\thiển thị bằng « dirs », bắt đầu từ số không.\n"
-"\tVí dụ : « popd +0 » sẽ gỡ bỏ thư mục đầu tiên,\n"
-"\t\t« popd +1 » gỡ bỏ thư mục thứ hai, v.v.\n"
+"    Đối số:\n"
+"      +N\txoay chồng để thư mục thứ N (đếm từ bên trái `dirs', bắt\n"
+"        \tđầu từ số không) nằm ở đầu. Ví dụ `popd +0' bỏ thư mục\n"
+"                đầu tiên, `popd +1' bỏ thư mục thứ hai.\n"
 "\n"
-"\t\t-N\tgỡ bỏ mục thứ N đếm từ bên phải danh sách\n"
-"\t\t\thiển thị bằng « dirs », bắt đầu từ số không.\n"
-"\tVí dụ : « popd -0 » sẽ gỡ bỏ thư mục cuối cùng,\n"
-"\t\t« popd -1 » gỡ bỏ thư mục giáp cuối, v.v.\n"
+"      -N\txoay chồng để thư mục thứ N (đếm từ bên phải `dirs', bắt\n"
+"        \tđầu từ số không) nằm ở đầu. Ví dụ `popd -0' bỏ thư mục\n"
+"                cuối cùng, `popd -1' bỏ thư mục kế cuối.\n"
 "\n"
-"\tDựng sẵn « dirs » sẽ hiển thị đống thư mục."
+"    Lệnh `dirs' hiển thị chồng thư mục."
 
-#: builtins/read.def:272
+#: builtins/read.def:252
 #, c-format
 msgid "%s: invalid timeout specification"
 msgstr "%s: sai xác định quá hạn"
 
-#: builtins/read.def:644
+#: builtins/read.def:588
 #, c-format
 msgid "read error: %d: %s"
 msgstr "lỗi đọc: %d: %s"
 
-#: builtins/return.def:75
+#: builtins/return.def:73
 msgid "can only `return' from a function or sourced script"
-msgstr ""
-"chỉ có thể « return » (trở về) từ một hàm hoặc văn lệnh được gọi từ nguồn"
+msgstr "chỉ có thể \"return\" từ một hàm hoặc văn lệnh được 'source'"
 
 #: builtins/set.def:771
 msgid "cannot simultaneously unset a function and a variable"
 msgstr "không thể hủy đặt đồng thời một hàm VÀ một biến"
 
-#: builtins/set.def:812
+#: builtins/set.def:808
 #, c-format
 msgid "%s: cannot unset"
 msgstr "%s: không thể hủy đặt"
 
-#: builtins/set.def:829
+#: builtins/set.def:815
 #, c-format
 msgid "%s: cannot unset: readonly %s"
 msgstr "%s: không thể hủy đặt: %s chỉ đọc"
 
-#: builtins/set.def:841
+#: builtins/set.def:826
 #, c-format
 msgid "%s: not an array variable"
 msgstr "%s: không phải biến mảng"
@@ -771,20 +752,20 @@ msgstr "%s: không phải hàm"
 
 #: builtins/shift.def:71 builtins/shift.def:77
 msgid "shift count"
-msgstr "đếm dời"
+msgstr "số lượng dời"
 
-#: builtins/shopt.def:277
+#: builtins/shopt.def:264
 msgid "cannot set and unset shell options simultaneously"
-msgstr "không thể đồng thời đặt và hủy đặt các tùy chọn trình bao"
+msgstr "không thể đồng thời đặt và hủy đặt các tùy chọn shell"
 
-#: builtins/shopt.def:342
+#: builtins/shopt.def:329
 #, c-format
 msgid "%s: invalid shell option name"
-msgstr "%s: tên tùy chọn trình bao không hợp lệ"
+msgstr "%s: tên tùy chọn shell không hợp lệ"
 
 #: builtins/source.def:130
 msgid "filename argument required"
-msgstr "cần thiết đối số tên tập tin"
+msgstr "cần đối số tên tập tin"
 
 #: builtins/source.def:155
 #, c-format
@@ -797,17 +778,17 @@ msgstr "không thể ngưng"
 
 #: builtins/suspend.def:111
 msgid "cannot suspend a login shell"
-msgstr "không thể ngưng trình bao đăng nhập"
+msgstr "không thể ngưng shell đăng nhập"
 
 #: builtins/type.def:234
 #, c-format
 msgid "%s is aliased to `%s'\n"
-msgstr "%s có bí danh tới `%s'\n"
+msgstr "%s là bí danh của `%s'\n"
 
 #: builtins/type.def:255
 #, c-format
 msgid "%s is a shell keyword\n"
-msgstr "%s là từ khoá trình bao\n"
+msgstr "%s là từ khoá shell\n"
 
 #: builtins/type.def:274
 #, c-format
@@ -817,9 +798,9 @@ msgstr "%s là hàm\n"
 #: builtins/type.def:296
 #, c-format
 msgid "%s is a shell builtin\n"
-msgstr "%s là dựng sẵn trình bao\n"
+msgstr "%s là lệnh dựng sẵn shell\n"
 
-#: builtins/type.def:317 builtins/type.def:393
+#: builtins/type.def:317 builtins/type.def:391
 #, c-format
 msgid "%s is %s\n"
 msgstr "%s là %s\n"
@@ -827,28 +808,28 @@ msgstr "%s là %s\n"
 #: builtins/type.def:337
 #, c-format
 msgid "%s is hashed (%s)\n"
-msgstr "%s có ký hiệu lộn xộn (%s)\n"
+msgstr "%s được băm (%s)\n"
 
-#: builtins/ulimit.def:379
+#: builtins/ulimit.def:376
 #, c-format
 msgid "%s: invalid limit argument"
 msgstr "%s: đối số giới hạn không hợp lệ"
 
-#: builtins/ulimit.def:405
+#: builtins/ulimit.def:402
 #, c-format
 msgid "`%c': bad command"
-msgstr "« %c »: câu lệnh sai"
+msgstr "\"%c\": câu lệnh sai"
 
-#: builtins/ulimit.def:434
+#: builtins/ulimit.def:431
 #, c-format
 msgid "%s: cannot get limit: %s"
 msgstr "%s: không thể lấy giới hạn: %s"
 
-#: builtins/ulimit.def:460
+#: builtins/ulimit.def:457
 msgid "limit"
 msgstr "giới hạn"
 
-#: builtins/ulimit.def:472 builtins/ulimit.def:772
+#: builtins/ulimit.def:469 builtins/ulimit.def:769
 #, c-format
 msgid "%s: cannot modify limit: %s"
 msgstr "%s: không thể sửa đổi giới hạn: %s"
@@ -860,169 +841,154 @@ msgstr "số bát phân"
 #: builtins/umask.def:231
 #, c-format
 msgid "`%c': invalid symbolic mode operator"
-msgstr "« %c »: toán từ chế độ tượng trưng không hợp lệ"
+msgstr "\"%c\": toán tử chế độ tượng trưng không hợp lệ"
 
 #: builtins/umask.def:286
 #, c-format
 msgid "`%c': invalid symbolic mode character"
-msgstr "« %c »: ký tự chế độ tượng trưng không hợp lệ"
+msgstr "\"%c\": ký tự chế độ tượng trưng không hợp lệ"
 
-#: error.c:90 error.c:325 error.c:327 error.c:329
+#: error.c:90 error.c:321 error.c:323 error.c:325
 msgid " line "
-msgstr "dòng"
+msgstr " dòng "
 
 #: error.c:165
 #, c-format
 msgid "last command: %s\n"
-msgstr "câu lệnh cuối cùng: %s\n"
+msgstr "lệnh cuối: %s\n"
 
 #: error.c:173
 #, c-format
 msgid "Aborting..."
 msgstr "Hủy bỏ..."
 
-#: error.c:410
+#: error.c:406
 msgid "unknown command error"
 msgstr "lỗi lệnh không rõ"
 
-#: error.c:411
+#: error.c:407
 msgid "bad command type"
 msgstr "kiểu lệnh sai"
 
-#: error.c:412
+#: error.c:408
 msgid "bad connector"
 msgstr "bộ kết nối sai"
 
-#: error.c:413
+#: error.c:409
 msgid "bad jump"
-msgstr "sai nhảy"
+msgstr "nhảy sai"
 
-#: error.c:451
+#: error.c:447
 #, c-format
 msgid "%s: unbound variable"
-msgstr "%s: biến chưa tổ hợp"
+msgstr "%s: biến chưa liên kết"
 
 #: eval.c:181
 #, c-format
 msgid "\atimed out waiting for input: auto-logout\n"
-msgstr "\tquá hạn trong khi đợi dữ liệu nhập nên tự động đăng xuất\n"
+msgstr "\aquá hạn trong khi đợi dữ liệu nhập: tự động đăng xuất\n"
 
 #: execute_cmd.c:504
 #, c-format
 msgid "cannot redirect standard input from /dev/null: %s"
-msgstr "không thể chuyển hướng đầu vào tiêu chuẩn từ « /dev/null »: %s"
+msgstr "không thể chuyển hướng đầu vào chuẩn từ /dev/null: %s"
 
-#: execute_cmd.c:1199
+#: execute_cmd.c:1168
 #, c-format
 msgid "TIMEFORMAT: `%c': invalid format character"
-msgstr "ĐỊNH DẠNG THỜI GIAN: « %c »: ký tự định dạng không hợp lệ"
+msgstr "ĐỊNH DẠNG THỜI GIAN: \"%c\": ký tự định dạng không hợp lệ"
 
-#: execute_cmd.c:2240
+#: execute_cmd.c:2121
 msgid "pipe error"
 msgstr "lỗi ống dẫn"
 
-#: execute_cmd.c:4284
-#, c-format
-msgid "%s: maximum function nesting level exceeded (%d)"
-msgstr ""
-
-#: execute_cmd.c:4777
+#: execute_cmd.c:4640
 #, c-format
 msgid "%s: restricted: cannot specify `/' in command names"
-msgstr "%s: bị hạn chế: không thể ghi rõ dấu sổ chéo « / » trong tên câu lệnh"
+msgstr "%s: bị hạn chế: không thể dùng `/' trong tên lệnh"
 
-#: execute_cmd.c:4872
+#: execute_cmd.c:4735
 #, c-format
 msgid "%s: command not found"
 msgstr "%s: không tìm thấy lệnh"
 
-#: execute_cmd.c:5098
+#: execute_cmd.c:4959
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: execute_cmd.c:5135
+#: execute_cmd.c:4995
 #, c-format
 msgid "%s: %s: bad interpreter"
 msgstr "%s: %s: bộ thông dịch sai"
 
-#: execute_cmd.c:5172
-#, fuzzy, c-format
-msgid "%s: cannot execute binary file: %s"
-msgstr "%s: không thể thực hiện tập tin nhị phân"
-
-#: execute_cmd.c:5244
-#, fuzzy, c-format
-msgid "`%s': is a special builtin"
-msgstr "%s là dựng sẵn trình bao\n"
-
-#: execute_cmd.c:5296
+#: execute_cmd.c:5144
 #, c-format
 msgid "cannot duplicate fd %d to fd %d"
-msgstr "không thể nhân đôi fd %d tới fd %d"
+msgstr "không thể nhân đôi fd %d thành fd %d"
 
-#: expr.c:258
+#: expr.c:256
 msgid "expression recursion level exceeded"
-msgstr "vượt quá giới hạn mức độ đệ quy của biểu thức"
+msgstr "vượt quá ngưỡng đệ quy của biểu thức"
 
-#: expr.c:282
+#: expr.c:280
 msgid "recursion stack underflow"
 msgstr "trán ngược đống đệ quy"
 
-#: expr.c:430
+#: expr.c:422
 msgid "syntax error in expression"
 msgstr "lỗi cú pháp trong biểu thức"
 
-#: expr.c:474
+#: expr.c:463
 msgid "attempted assignment to non-variable"
 msgstr "thử gán cho đồ không phải biến"
 
-#: expr.c:493 expr.c:838
+#: expr.c:486 expr.c:491 expr.c:807
 msgid "division by 0"
 msgstr "chia cho không"
 
-#: expr.c:540
+#: expr.c:517
 msgid "bug: bad expassign token"
-msgstr "lỗi (bug): hiệu bài ấn định biểu thức sai"
+msgstr "lỗi: token expassign sai"
 
-#: expr.c:589
+#: expr.c:564
 msgid "`:' expected for conditional expression"
-msgstr "đợi dấu hai chấm « : » cho biểu thức điều kiện"
+msgstr "cần `:' cho biểu thức điều kiện"
 
-#: expr.c:895
+#: expr.c:832
 msgid "exponent less than 0"
 msgstr "số mũ nhỏ hơn 0"
 
-#: expr.c:948
+#: expr.c:887
 msgid "identifier expected after pre-increment or pre-decrement"
-msgstr "đợi đồ nhận diện đằng sau tăng/giảm dần sẵn"
+msgstr "cần định danh sau tăng/giảm dần trước"
 
-#: expr.c:973
+#: expr.c:910
 msgid "missing `)'"
-msgstr "thiếu dấu ngoặc đóng « ) »"
+msgstr "thiếu `)'"
 
-#: expr.c:1024 expr.c:1351
+#: expr.c:959 expr.c:1282
 msgid "syntax error: operand expected"
-msgstr "lỗi cú pháp: đợi toán hạng"
+msgstr "lỗi cú pháp: cần toán hạng"
 
-#: expr.c:1353
+#: expr.c:1284
 msgid "syntax error: invalid arithmetic operator"
 msgstr "lỗi cú pháp: toán tử số học không hợp lệ"
 
-#: expr.c:1377
+#: expr.c:1308
 #, c-format
 msgid "%s%s%s: %s (error token is \"%s\")"
 msgstr "%s%s%s: %s (hiệu bài lỗi là \"%s\")"
 
-#: expr.c:1435
+#: expr.c:1366
 msgid "invalid arithmetic base"
 msgstr "cơ số (số học) không hợp lệ"
 
-#: expr.c:1455
+#: expr.c:1386
 msgid "value too great for base"
 msgstr "cơ số có giá trị quá lớn"
 
-#: expr.c:1504
+#: expr.c:1435
 #, c-format
 msgid "%s: expression error\n"
 msgstr "%s: lỗi biểu thức\n"
@@ -1031,172 +997,172 @@ msgstr "%s: lỗi biểu thức\n"
 msgid "getcwd: cannot access parent directories"
 msgstr "getcwd: không thể truy cập thư mục cấp trên"
 
-#: input.c:99 subst.c:5094
+#: input.c:94 subst.c:5082
 #, c-format
 msgid "cannot reset nodelay mode for fd %d"
-msgstr "không thể đặt lại chế độ nodelay (không hoãn) cho fd %d"
+msgstr "không thể đặt lại chế độ nodelay cho fd %d"
 
-#: input.c:265
+#: input.c:260
 #, c-format
 msgid "cannot allocate new file descriptor for bash input from fd %d"
-msgstr "không thể cấp phát bộ mô tả tập tin mớ cho dữ liệu nhập bash từ fd %d"
+msgstr "không thể cấp phát bộ mô tả tập tin mới cho dữ liệu nhập bash từ fd %d"
 
-#: input.c:273
+#: input.c:268
 #, c-format
 msgid "save_bash_input: buffer already exists for new fd %d"
 msgstr "save_bash_input: đã có bộ đệm cho fd mới %d"
 
 # Nghĩa chữ ?
-#: jobs.c:470
+#: jobs.c:468
 msgid "start_pipeline: pgrp pipe"
 msgstr "start_pipeline: pgrp pipe"
 
-#: jobs.c:891
+#: jobs.c:889
 #, c-format
 msgid "forked pid %d appears in running job %d"
-msgstr "tiến trình con đã tạo (PID %d) xuất hiện trong công việc đang chạy %d"
+msgstr "pid được tánh nhánh %d có vẻ đang chạy trong công việc %d"
 
-#: jobs.c:1009
+#: jobs.c:1007
 #, c-format
 msgid "deleting stopped job %d with process group %ld"
 msgstr "đang xoá công việc bị dừng chạy %d với nhóm tiến trình %ld"
 
-#: jobs.c:1114
+#: jobs.c:1112
 #, c-format
 msgid "add_process: process %5ld (%s) in the_pipeline"
 msgstr "add_process: tiến trình %5ld (%s) trong the_pipeline"
 
-#: jobs.c:1117
+#: jobs.c:1115
 #, c-format
 msgid "add_process: pid %5ld (%s) marked as still alive"
 msgstr "add_process: pid %5ld (%s) được đánh dấu vẫn hoạt động"
 
-#: jobs.c:1432
+#: jobs.c:1430
 #, c-format
 msgid "describe_pid: %ld: no such pid"
-msgstr "describe_pid: %ld: không có PID (mã số tiến trình) như vậy"
+msgstr "describe_pid: %ld: không có pid như vậy"
 
-#: jobs.c:1447
+#: jobs.c:1445
 #, c-format
 msgid "Signal %d"
 msgstr "Tín hiệu %d"
 
-#: jobs.c:1461 jobs.c:1486
+#: jobs.c:1459 jobs.c:1484
 msgid "Done"
 msgstr "Hoàn tất"
 
-#: jobs.c:1466 siglist.c:123
+#: jobs.c:1464 siglist.c:123
 msgid "Stopped"
 msgstr "Bị dừng"
 
-#: jobs.c:1470
+#: jobs.c:1468
 #, c-format
 msgid "Stopped(%s)"
 msgstr "Bị dừng(%s)"
 
-#: jobs.c:1474
+#: jobs.c:1472
 msgid "Running"
 msgstr "Đang chạy"
 
-#: jobs.c:1488
+#: jobs.c:1486
 #, c-format
 msgid "Done(%d)"
 msgstr "Hoàn tất(%d)"
 
-#: jobs.c:1490
+#: jobs.c:1488
 #, c-format
 msgid "Exit %d"
 msgstr "Thoát %d"
 
-#: jobs.c:1493
+#: jobs.c:1491
 msgid "Unknown status"
 msgstr "Không rõ trạng thái"
 
-#: jobs.c:1580
+#: jobs.c:1578
 #, c-format
 msgid "(core dumped) "
-msgstr "(lõi bị đổ)"
+msgstr "(xuất ra core)"
 
-#: jobs.c:1599
+#: jobs.c:1597
 #, c-format
 msgid "  (wd: %s)"
 msgstr "  (wd: %s)"
 
-#: jobs.c:1807
+#: jobs.c:1805
 #, c-format
 msgid "child setpgid (%ld to %ld)"
 msgstr "setpgid tiến trình con (%ld thành %ld)"
 
-#: jobs.c:2135 nojobs.c:585
+#: jobs.c:2133 nojobs.c:585
 #, c-format
 msgid "wait: pid %ld is not a child of this shell"
-msgstr "wait: pid %ld không phải là tiến trình con của trình bao này"
+msgstr "wait: pid %ld không phải là tiến trình con của shell này"
 
-#: jobs.c:2372
+#: jobs.c:2360
 #, c-format
 msgid "wait_for: No record of process %ld"
 msgstr "wait_for: Không có mục ghi về tiến trình %ld"
 
-#: jobs.c:2653
+#: jobs.c:2637
 #, c-format
 msgid "wait_for_job: job %d is stopped"
 msgstr "wait_for_job: công việc %d bị dừng chạy"
 
-#: jobs.c:2875
+#: jobs.c:2859
 #, c-format
 msgid "%s: job has terminated"
 msgstr "%s: công việc bị chấm dứt"
 
-#: jobs.c:2884
+#: jobs.c:2868
 #, c-format
 msgid "%s: job %d already in background"
-msgstr "%s: công việc %d đã chạy trong nền"
+msgstr "%s: công việc %d đã đang chạy nền"
 
-#: jobs.c:3105
+#: jobs.c:3089
 msgid "waitchld: turning on WNOHANG to avoid indefinite block"
 msgstr "waitchld: đang bật WNOHANG để tránh bị chặn vô hạn"
 
-#: jobs.c:3571
+#: jobs.c:3538
 #, c-format
 msgid "%s: line %d: "
-msgstr "%s: dòng %d:"
+msgstr "%s: dòng %d: "
 
-#: jobs.c:3585 nojobs.c:818
+#: jobs.c:3552 nojobs.c:814
 #, c-format
 msgid " (core dumped)"
-msgstr " (lõi bị đổ)"
+msgstr " (xuất ra core)"
 
-#: jobs.c:3597 jobs.c:3610
+#: jobs.c:3564 jobs.c:3577
 #, c-format
 msgid "(wd now: %s)\n"
 msgstr "(wd bây giờ: %s)\n"
 
-#: jobs.c:3642
+#: jobs.c:3609
 msgid "initialize_job_control: getpgrp failed"
 msgstr "initialize_job_control: getpgrp bị lỗi"
 
-#: jobs.c:3703
+#: jobs.c:3669
 msgid "initialize_job_control: line discipline"
 msgstr "initialize_job_control: kỷ luật dòng"
 
 # Nghĩa chữ : dừng dịch
-#: jobs.c:3713
+#: jobs.c:3679
 msgid "initialize_job_control: setpgid"
 msgstr "initialize_job_control: setpgid"
 
-#: jobs.c:3734 jobs.c:3743
+#: jobs.c:3707
 #, c-format
 msgid "cannot set terminal process group (%d)"
 msgstr "không thể đặt nhóm tiến trình cuối cùng (%d)"
 
-#: jobs.c:3748
+#: jobs.c:3712
 msgid "no job control in this shell"
-msgstr "không có điều khiển công việc trong trình bao này"
+msgstr "không có điều khiển công việc trong shell này"
 
 #: lib/malloc/malloc.c:296
 #, c-format
 msgid "malloc: failed assertion: %s\n"
-msgstr "malloc (cấp phát bộ nhớ): lỗi khẳng định: %s\n"
+msgstr "malloc: failed assertion: %s\n"
 
 #: lib/malloc/malloc.c:312
 #, c-format
@@ -1204,8 +1170,8 @@ msgid ""
 "\r\n"
 "malloc: %s:%d: assertion botched\r\n"
 msgstr ""
-"\r\n"
-"malloc (cấp phát bộ nhớ): %s:%d: khẳng định bị hỏng\r\n"
+"\\r\n"
+"malloc: %s:%d: assertion botched\\r\n"
 
 #: lib/malloc/malloc.c:313
 msgid "unknown"
@@ -1213,9 +1179,7 @@ msgstr "không rõ"
 
 #: lib/malloc/malloc.c:797
 msgid "malloc: block on free list clobbered"
-msgstr ""
-"malloc (cấp phát bộ nhớ): khối bộ nhớ dành riêng trên danh sách các khối còn "
-"rảnh bị ghi vào"
+msgstr "malloc (cấp phát bộ nhớ): khối bộ nhớ dành riêng trên danh sách các khối còn rảnh bị ghi vào"
 
 #: lib/malloc/malloc.c:874
 msgid "free: called with already freed block argument"
@@ -1253,14 +1217,14 @@ msgstr "register_alloc: bảng cấp phát đầy với FIND_ALLOC?\n"
 #: lib/malloc/table.c:184
 #, c-format
 msgid "register_alloc: %p already in table as allocated?\n"
-msgstr "register_alloc: %p đã có trong bảng như được cấp phát ?\n"
+msgstr "register_alloc: %p đã có trong bảng như được cấp phát?\n"
 
 #: lib/malloc/table.c:220
 #, c-format
 msgid "register_free: %p already in table as free?\n"
-msgstr "register_free: %p đã có trong bảng như còn rảnh ?\n"
+msgstr "register_free: %p đã có trong bảng như còn trống?\n"
 
-#: lib/sh/fmtulong.c:102
+#: lib/sh/fmtulong.c:101
 msgid "invalid base"
 msgstr "cơ số không hợp lệ"
 
@@ -1283,22 +1247,22 @@ msgstr "%s: đặc tả đường dẫn mạng sai"
 msgid "network operations not supported"
 msgstr "không hỗ trợ thao tác mạng"
 
-#: locale.c:204
+#: locale.c:192
 #, c-format
 msgid "setlocale: LC_ALL: cannot change locale (%s)"
 msgstr "setlocale: LC_ALL: không thể chuyển đổi miền địa phương (%s)"
 
-#: locale.c:206
+#: locale.c:194
 #, c-format
 msgid "setlocale: LC_ALL: cannot change locale (%s): %s"
 msgstr "setlocale: LC_ALL: không thể chuyển đổi miền địa phương (%s): %s"
 
-#: locale.c:263
+#: locale.c:247
 #, c-format
 msgid "setlocale: %s: cannot change locale (%s)"
 msgstr "setlocale: %s: không thể chuyển đổi miền địa phương (%s)"
 
-#: locale.c:265
+#: locale.c:249
 #, c-format
 msgid "setlocale: %s: cannot change locale (%s): %s"
 msgstr "setlocale: %s: không thể chuyển đổi miền địa phương (%s): %s"
@@ -1314,134 +1278,133 @@ msgstr "Bạn có thư mới trong $_"
 #: mailcheck.c:474
 #, c-format
 msgid "The mail in %s has been read\n"
-msgstr "Thư tín trong %s đã được đọc\n"
+msgstr "Đã đọc thư trong %s\n"
 
 #: make_cmd.c:323
 msgid "syntax error: arithmetic expression required"
-msgstr "lỗi cú pháp: cần thiết biểu thức số học"
+msgstr "lỗi cú pháp: cần biểu thức số học"
 
 #: make_cmd.c:325
 msgid "syntax error: `;' unexpected"
-msgstr "lỗi cú pháp: dấu chấm phẩy « ; » bất thường"
+msgstr "lỗi cú pháp: dấu chấm phẩy `;' không mong đợi"
 
 #: make_cmd.c:326
 #, c-format
 msgid "syntax error: `((%s))'"
 msgstr "lỗi cú pháp: `((%s))'"
 
-#: make_cmd.c:578
+#: make_cmd.c:575
 #, c-format
 msgid "make_here_document: bad instruction type %d"
 msgstr "make_here_document: kiểu chỉ dẫn sai %d"
 
-#: make_cmd.c:662
+#: make_cmd.c:659
 #, c-format
 msgid "here-document at line %d delimited by end-of-file (wanted `%s')"
-msgstr "tài liệu này ở dòng %d định giới bằng kết thúc tập tin (mong đợi `%s')"
+msgstr "tài liệu này ở dòng %d định giới bằng kết thúc tập tin (muốn `%s')"
 
-#: make_cmd.c:759
+#: make_cmd.c:756
 #, c-format
 msgid "make_redirection: redirection instruction `%d' out of range"
-msgstr "make_redirection: chỉ dẫn chuyển hướng « %d » ở ngoại phạm vi"
+msgstr "make_redirection: chỉ dẫn chuyển hướng \"%d\" ở ngoại phạm vi"
 
-#: parse.y:3173 parse.y:3448
+#: parse.y:3173 parse.y:3444
 #, c-format
 msgid "unexpected EOF while looking for matching `%c'"
-msgstr "gặp kết thúc tập tin bất thường trong khi tìm « %c » tương ứng"
+msgstr "gặp kết thúc tập tin bất thường trong khi tìm \"%c\" tương ứng"
 
-#: parse.y:4038
+#: parse.y:4025
 msgid "unexpected EOF while looking for `]]'"
-msgstr "gặp kết thúc tập tin bất thường trong khi tìm « ]] »"
+msgstr "gặp kết thúc tập tin bất thường trong khi tìm \"]]\""
 
-#: parse.y:4043
+#: parse.y:4030
 #, c-format
 msgid "syntax error in conditional expression: unexpected token `%s'"
 msgstr "gặp lỗi cú pháp trong biểu thức điều kiện: hiệu bài bất thường `%s'"
 
-#: parse.y:4047
+#: parse.y:4034
 msgid "syntax error in conditional expression"
 msgstr "gặp lỗi cú pháp trong biểu thức điều kiện"
 
-#: parse.y:4125
+#: parse.y:4112
 #, c-format
 msgid "unexpected token `%s', expected `)'"
-msgstr "gặp hiệu bài bất thường `%s', còn mong đợi dấu ngoặc đóng « ) »"
+msgstr "gặp hiệu bài bất thường `%s', đang cần `)'"
 
-#: parse.y:4129
+#: parse.y:4116
 msgid "expected `)'"
-msgstr "đợi dấu đóng ngoặc « ) »"
+msgstr "cần `)'"
 
-#: parse.y:4157
+#: parse.y:4144
 #, c-format
 msgid "unexpected argument `%s' to conditional unary operator"
-msgstr "đối số bất thường `%s' tới toán tử nguyên phân điều kiện"
+msgstr "đối số bất thường `%s' cho toán tử nguyên phân điều kiện"
 
-#: parse.y:4161
+#: parse.y:4148
 msgid "unexpected argument to conditional unary operator"
-msgstr "đối số bất thường tới toán tử nguyên phân điều kiện"
+msgstr "đối số bất thường cho toán tử nguyên phân điều kiện"
 
-#: parse.y:4207
+#: parse.y:4194
 #, c-format
 msgid "unexpected token `%s', conditional binary operator expected"
-msgstr "hiệu bài bất thường `%s' còn đợi toán tử nhị phân điều kiện"
+msgstr "hiệu bài bất thường `%s', cần toán tử hai ngôi điều kiện"
 
-#: parse.y:4211
+#: parse.y:4198
 msgid "conditional binary operator expected"
-msgstr "đợi toán tử nhị phân điều kiện"
+msgstr "cần toán tử hai ngôi điều kiện"
 
-#: parse.y:4233
+#: parse.y:4220
 #, c-format
 msgid "unexpected argument `%s' to conditional binary operator"
-msgstr "đối số bất thường `%s' tới toán tử nhị phân điều kiện"
+msgstr "đối số bất thường `%s' cho toán tử nhị phân điều kiện"
 
-#: parse.y:4237
+#: parse.y:4224
 msgid "unexpected argument to conditional binary operator"
-msgstr "đối số bất thường tới toán tử nhị phân điều kiện"
+msgstr "đối số bất thường cho toán tử nhị phân điều kiện"
 
-#: parse.y:4248
+#: parse.y:4235
 #, c-format
 msgid "unexpected token `%c' in conditional command"
-msgstr "gặp hiệu bài bất thường « %c » trong câu lệnh điều kiện"
+msgstr "gặp hiệu bài bất thường \"%c\" trong câu lệnh điều kiện"
 
-#: parse.y:4251
+#: parse.y:4238
 #, c-format
 msgid "unexpected token `%s' in conditional command"
 msgstr "gặp hiệu bài bất thường `%s' trong câu lệnh điều kiện"
 
-#: parse.y:4255
+#: parse.y:4242
 #, c-format
 msgid "unexpected token %d in conditional command"
-msgstr "gặp hiệu bài bất thường « %d » trong câu lệnh điều kiện"
+msgstr "gặp hiệu bài bất thường \"%d\" trong câu lệnh điều kiện"
 
-#: parse.y:5590
+#: parse.y:5566
 #, c-format
 msgid "syntax error near unexpected token `%s'"
 msgstr "gặp lỗi cú pháp ở gần hiệu bài bất thường `%s'"
 
-#: parse.y:5608
+#: parse.y:5584
 #, c-format
 msgid "syntax error near `%s'"
-msgstr "gặp lỗi cú pháp gần `%s'"
+msgstr "lỗi cú pháp gần `%s'"
 
-#: parse.y:5618
+#: parse.y:5594
 msgid "syntax error: unexpected end of file"
 msgstr "lỗi cú pháp: kết thúc tập tin bất thường"
 
-#: parse.y:5618
+#: parse.y:5594
 msgid "syntax error"
 msgstr "lỗi cú pháp"
 
-#: parse.y:5680
+#: parse.y:5656
 #, c-format
 msgid "Use \"%s\" to leave the shell.\n"
-msgstr "Dùng `%s' để rời trình bao.\n"
+msgstr "Dùng `%s' để rời shell.\n"
 
-#: parse.y:5842
+#: parse.y:5818
 msgid "unexpected EOF while looking for matching `)'"
-msgstr ""
-"gặp kết thúc tập tin bất thường trong khi tìm dấu ngoặc đóng « ) » tương ứng"
+msgstr "gặp kết thúc tập tin bất thường trong khi tìm `)' tương ứng"
 
-#: pcomplete.c:1079
+#: pcomplete.c:1030
 #, c-format
 msgid "completion: function `%s' not found"
 msgstr "completion: không tìm thấy hàm `%s'"
@@ -1451,30 +1414,30 @@ msgstr "completion: không tìm thấy hàm `%s'"
 msgid "progcomp_insert: %s: NULL COMPSPEC"
 msgstr "progcomp_insert: %s: NULL COMPSPEC"
 
-#: print_cmd.c:300
+#: print_cmd.c:296
 #, c-format
 msgid "print_command: bad connector `%d'"
-msgstr "print_command: bộ kết nối sai « %d »"
+msgstr "print_command: bộ kết nối sai \"%d\""
 
-#: print_cmd.c:373
+#: print_cmd.c:368
 #, c-format
 msgid "xtrace_set: %d: invalid file descriptor"
 msgstr "xtrace_set: %d: sai đặt bộ mô tả tập tin"
 
-#: print_cmd.c:378
+#: print_cmd.c:373
 msgid "xtrace_set: NULL file pointer"
-msgstr "xtrace_set: con trỏ tập tin NULL (vô giá trị)"
+msgstr "xtrace_set: con trỏ tập tin NULL"
 
 # Nghĩa chữ ?
-#: print_cmd.c:382
+#: print_cmd.c:377
 #, c-format
 msgid "xtrace fd (%d) != fileno xtrace fp (%d)"
 msgstr "xtrace fd (%d) != fileno xtrace fp (%d)"
 
-#: print_cmd.c:1503
+#: print_cmd.c:1478
 #, c-format
 msgid "cprintf: `%c': invalid format character"
-msgstr "cprintf: « %c »: ký tự định dạng không hợp lệ"
+msgstr "cprintf: \"%c\": ký tự định dạng không hợp lệ"
 
 #: redir.c:122
 msgid "file descriptor out of range"
@@ -1483,7 +1446,7 @@ msgstr "bộ mô tả tập tin ở ngoại phạm vi"
 #: redir.c:178
 #, c-format
 msgid "%s: ambiguous redirect"
-msgstr "%s: lời chuyển hướng mơ hồ"
+msgstr "%s: chuyển hướng mơ hồ"
 
 #: redir.c:182
 #, c-format
@@ -1503,85 +1466,80 @@ msgstr "không thể tạo tập tin tạm thời cho tài liệu này: %s"
 #: redir.c:196
 #, c-format
 msgid "%s: cannot assign fd to variable"
-msgstr "%s: không thể gán cho biến bộ bô tả tập tin"
+msgstr "%s: không thể gán fd vào biến"
 
 #: redir.c:548
 msgid "/dev/(tcp|udp)/host/port not supported without networking"
-msgstr ""
-"/dev/(tcp|udp)/host/port không được hỗ trợ khi không có chức năng chạy mạng"
+msgstr "/dev/(tcp|udp)/host/port không được hỗ trợ nếu không có mạng"
 
-#: redir.c:818 redir.c:930 redir.c:993 redir.c:1142
+#: redir.c:818 redir.c:930 redir.c:993 redir.c:1136
 msgid "redirection error: cannot duplicate fd"
-msgstr "gặp lỗi chuyển hướng nên không thể nhân đôi fd"
+msgstr "lỗi chuyển hướng: không thể nhân đôi fd"
 
-#: shell.c:337
+#: shell.c:333
 msgid "could not find /tmp, please create!"
-msgstr "không tìm thấy « /tmp », hãy tạo."
+msgstr "không tìm thấy /tmp, hãy tạo mới!."
 
-#: shell.c:341
+#: shell.c:337
 msgid "/tmp must be a valid directory name"
-msgstr "« /tmp » phải là tên thư mục hợp lệ"
+msgstr "\"/tmp\" phải là tên thư mục hợp lệ"
 
-#: shell.c:888
+#: shell.c:884
 #, c-format
 msgid "%c%c: invalid option"
 msgstr "%c%c: tùy chọn không hợp lệ"
 
-#: shell.c:1662
+#: shell.c:1652
 msgid "I have no name!"
-msgstr "Không có tên."
+msgstr "Không có tên!"
 
-#: shell.c:1807
+#: shell.c:1795
 #, c-format
 msgid "GNU bash, version %s-(%s)\n"
-msgstr "bash của GNU, phiên bản %s-(%s)\n"
+msgstr "GNU bash, phiên bản %s-(%s)\n"
 
-#: shell.c:1808
+#: shell.c:1796
 #, c-format
 msgid ""
 "Usage:\t%s [GNU long option] [option] ...\n"
 "\t%s [GNU long option] [option] script-file ...\n"
 msgstr ""
 "Sử dụng:\t%s [tùy chọn GNU dài] [tùy chọn] ...\n"
-"\t%s [tùy chọn GNU dài] [tùy chọn] tập-tin-văn-lệnh ...\n"
+"\t%s [tùy chọn dài] [tùy chọn] tập-tin-văn-lệnh ...\n"
 
-#: shell.c:1810
+#: shell.c:1798
 msgid "GNU long options:\n"
-msgstr "Tùy chọn GNU dài:\n"
+msgstr "Tùy chọn dài:\n"
 
-#: shell.c:1814
+#: shell.c:1802
 msgid "Shell options:\n"
-msgstr "Tùy chọn trình bao :\n"
+msgstr "Tùy chọn:\n"
 
-#: shell.c:1815
+#: shell.c:1803
 msgid "\t-irsD or -c command or -O shopt_option\t\t(invocation only)\n"
-msgstr "\t-irsD hoặc -c lệnh or -O shopt_option\t\t(chỉ cuộc gọi)\n"
+msgstr "\t-irsD hoặc -c lệnh or -O shopt_option\t\t(chỉ gọi)\n"
 
-#: shell.c:1830
+#: shell.c:1818
 #, c-format
 msgid "\t-%s or -o option\n"
 msgstr "\t-%s hoặc -o tùy chọn\n"
 
-#: shell.c:1836
+#: shell.c:1824
 #, c-format
 msgid "Type `%s -c \"help set\"' for more information about shell options.\n"
-msgstr ""
-"Gõ câu lệnh trợ giúp « %s -c \"help set\" » để xem thêm thông tin về các tùy "
-"chọn trình bao.\n"
+msgstr "Gõ `%s -c \"help set\"' để xem thông tin về các tùy chọn shell.\n"
 
-#: shell.c:1837
+#: shell.c:1825
 #, c-format
 msgid "Type `%s -c help' for more information about shell builtin commands.\n"
-msgstr ""
-"Gõ câu lệnh trợ giúp « %s -c help » để xem thêm thông tin về các câu lệnh "
-"trình bao dựng sẵn.\n"
+msgstr "Gõ `%s -c help' để xem thông tin về các lệnh shell dựng sẵn.\n"
 
-#: shell.c:1838
+#: shell.c:1826
 #, c-format
 msgid "Use the `bashbug' command to report bugs.\n"
-msgstr "Dùng lệnh « bashbug » để thông báo lỗi.\n"
+msgstr "Dùng lệnh `bashbug' để thông báo lỗi.\n"
 
-#: sig.c:647
+#: sig.c:638
 #, c-format
 msgid "sigprocmask: %d: invalid operation"
 msgstr "sigprocmask: %d: thao tác không hợp lệ"
@@ -1592,11 +1550,11 @@ msgstr "Tín hiệu giả"
 
 #: siglist.c:51
 msgid "Hangup"
-msgstr "Treo máy"
+msgstr "Treo"
 
 #: siglist.c:55
 msgid "Interrupt"
-msgstr "Gián đoạn"
+msgstr "Ngắt"
 
 #: siglist.c:59
 msgid "Quit"
@@ -1620,7 +1578,7 @@ msgstr "Câu lệnh EMT"
 
 #: siglist.c:83
 msgid "Floating point exception"
-msgstr "Ngoại lệ chấm động"
+msgstr "Lỗi dấu chấm động"
 
 #: siglist.c:87
 msgid "Killed"
@@ -1628,19 +1586,19 @@ msgstr "Bị giết"
 
 #: siglist.c:91
 msgid "Bus error"
-msgstr "lỗi mạch nối"
+msgstr "Lỗi mạch nối"
 
 #: siglist.c:95
 msgid "Segmentation fault"
-msgstr "Lỗi chia ra từng đoạn"
+msgstr "Lỗi phân đoạn"
 
 #: siglist.c:99
 msgid "Bad system call"
-msgstr "Sai gọi hệ thống"
+msgstr "Lỗi lệnh gọi hệ thống"
 
 #: siglist.c:103
 msgid "Broken pipe"
-msgstr "Ống dẫn bị hỏng"
+msgstr "Ống dẫn "
 
 #: siglist.c:107
 msgid "Alarm clock"
@@ -1652,7 +1610,7 @@ msgstr "Bị chấm dứt"
 
 #: siglist.c:115
 msgid "Urgent IO condition"
-msgstr "Điều kiện VR gấp"
+msgstr "Điều kiện IO gấp"
 
 #: siglist.c:119
 msgid "Stopped (signal)"
@@ -1676,7 +1634,7 @@ msgstr "Bị dừng (tty xuất)"
 
 #: siglist.c:147
 msgid "I/O ready"
-msgstr "V/R sẵn sàng"
+msgstr "I/O sẵn sàng"
 
 #: siglist.c:151
 msgid "CPU limit"
@@ -1748,231 +1706,215 @@ msgstr "yêu cầu thông tin"
 
 #: siglist.c:223
 msgid "Unknown Signal #"
-msgstr "Không rõ tín hiệu #"
+msgstr "Tín hiệu lạ #"
 
 #: siglist.c:225
 #, c-format
 msgid "Unknown Signal #%d"
-msgstr "Không rõ tín hiệu #%d"
+msgstr "Tín hiệu lạ #%d"
 
-#: subst.c:1335 subst.c:1506
+#: subst.c:1333 subst.c:1502
 #, c-format
 msgid "bad substitution: no closing `%s' in %s"
-msgstr "sai thay thế: không có `%s' đóng trong %s"
+msgstr "thay thế sai: không có đóng `%s' trong %s"
 
-#: subst.c:2801
+#: subst.c:2795
 #, c-format
 msgid "%s: cannot assign list to array member"
 msgstr "%s: không thể gán danh sách cho bộ phận của mảng"
 
-#: subst.c:4991 subst.c:5007
+#: subst.c:4979 subst.c:4995
 msgid "cannot make pipe for process substitution"
 msgstr "không thể tạo ống dẫn để thay thế tiến trình"
 
-#: subst.c:5039
+#: subst.c:5027
 msgid "cannot make child for process substitution"
 msgstr "không thể tạo tiến trình con để thay thế tiến trình"
 
-#: subst.c:5084
+#: subst.c:5072
 #, c-format
 msgid "cannot open named pipe %s for reading"
 msgstr "không thể mở ống dẫn đặt tên %s để đọc"
 
-#: subst.c:5086
+#: subst.c:5074
 #, c-format
 msgid "cannot open named pipe %s for writing"
-msgstr "không thể mở ống dẫn đặt tên %s để ghi"
+msgstr "không thể mở ống dẫn  tên %s để ghi"
 
-#: subst.c:5104
+#: subst.c:5092
 #, c-format
 msgid "cannot duplicate named pipe %s as fd %d"
 msgstr "không thể nhân đôi ống dẫn đặt tên %s thành fd %d"
 
-#: subst.c:5296
+#: subst.c:5284
 msgid "cannot make pipe for command substitution"
 msgstr "không thể tạo ống dẫn để thay thế lệnh"
 
-#: subst.c:5334
+#: subst.c:5322
 msgid "cannot make child for command substitution"
 msgstr "không thể tạo tiến trình con để thay thế lệnh"
 
-#: subst.c:5351
+#: subst.c:5339
 msgid "command_substitute: cannot duplicate pipe as fd 1"
 msgstr "command_substitute: không thể nhân đôi ống dẫn thành fd 1"
 
-#: subst.c:5875
+#: subst.c:5859
 #, c-format
 msgid "%s: parameter null or not set"
-msgstr "%s: tham số vô giá trị hoặc chưa được đặt"
+msgstr "%s: tham số null hoặc chưa được đặt"
 
-#: subst.c:6141 subst.c:6156
+#: subst.c:6125 subst.c:6140
 #, c-format
 msgid "%s: substring expression < 0"
-msgstr "%s: biểu thức chuỗi phụ < 0"
+msgstr "%s: biểu thức chuỗi con < 0"
 
-#: subst.c:7284
+#: subst.c:7271
 #, c-format
 msgid "%s: bad substitution"
-msgstr "%s: sai thay thế"
+msgstr "%s: thay thế sai"
 
-#: subst.c:7361
+#: subst.c:7347
 #, c-format
 msgid "$%s: cannot assign in this way"
 msgstr "$%s: không thể gán bằng cách này"
 
-#: subst.c:7697
-msgid ""
-"future versions of the shell will force evaluation as an arithmetic "
-"substitution"
-msgstr ""
-"phiên bản trình bao mới sẽ ép buộc ước lượng dưới dạng một hàm thay thế số "
-"học"
+#: subst.c:7684
+msgid "future versions of the shell will force evaluation as an arithmetic substitution"
+msgstr "phiên bản shell mới sẽ ép buộc ước lượng dưới dạng một hàm thay thế số học"
 
-#: subst.c:8165
+#: subst.c:8149
 #, c-format
 msgid "bad substitution: no closing \"`\" in %s"
-msgstr "sai thay thế: không có « ` » đóng trong %s"
+msgstr "sai thay thế: không có \"`\" đóng trong %s"
 
-#: subst.c:9056
+#: subst.c:9036
 #, c-format
 msgid "no match: %s"
 msgstr "không khớp: %s"
 
 #: test.c:146
 msgid "argument expected"
-msgstr "mong đợi đối số"
+msgstr "cần đối số"
 
 #: test.c:155
 #, c-format
 msgid "%s: integer expression expected"
-msgstr "%s: đợi biểu thức số nguyên"
+msgstr "%s: cần biểu thức số nguyên"
 
 #: test.c:263
 msgid "`)' expected"
-msgstr "đợi dấu ngoặc đóng « ) »"
+msgstr "cần `)'"
 
 #: test.c:265
 #, c-format
 msgid "`)' expected, found %s"
-msgstr "đợi dấu ngoặc đóng « ) », còn tìm %s"
+msgstr "cần `)', nhận được %s"
 
 #: test.c:280 test.c:698 test.c:701
 #, c-format
 msgid "%s: unary operator expected"
-msgstr "%s: đợi toán tử nguyên phân"
+msgstr "%s: cần toán tử một ngôi"
 
 #: test.c:449 test.c:741
 #, c-format
 msgid "%s: binary operator expected"
-msgstr "%s: đợi toán tử nhị phân"
+msgstr "%s: cần toán tử hai ngôi"
 
 #: test.c:816
 msgid "missing `]'"
-msgstr "thiếu dấu ngoặc vụ đóng « ] »"
+msgstr "thiếu `]'"
 
-#: trap.c:209
+#: trap.c:207
 msgid "invalid signal number"
 msgstr "số thứ tự tín hiệu không hợp lệ"
 
-#: trap.c:329
+#: trap.c:337
 #, c-format
 msgid "run_pending_traps: bad value in trap_list[%d]: %p"
 msgstr "run_pending_traps: giá trị sai trong danh sách trap_list[%d]: %p"
 
-#: trap.c:333
+#: trap.c:341
 #, c-format
-msgid ""
-"run_pending_traps: signal handler is SIG_DFL, resending %d (%s) to myself"
-msgstr ""
-"run_pending_traps: bộ xử lý tín hiệu là SIG_DFL, đang gửi lại %d (%s) cho "
-"mình"
+msgid "run_pending_traps: signal handler is SIG_DFL, resending %d (%s) to myself"
+msgstr "run_pending_traps: bộ xử lý tín hiệu là SIG_DFL, đang gửi lại %d (%s) cho chính mình"
 
-#: trap.c:379
+#: trap.c:393
 #, c-format
 msgid "trap_handler: bad signal %d"
 msgstr "trap_handler: tín hiệu sai %d"
 
-#: variables.c:366
+#: variables.c:363
 #, c-format
 msgid "error importing function definition for `%s'"
 msgstr "gặp lỗi khi nhập lời xác định hàm cho `%s'"
 
-#: variables.c:764
+#: variables.c:755
 #, c-format
 msgid "shell level (%d) too high, resetting to 1"
-msgstr "cấp trình bao (%d) quá cao nên đặt lại thành 1"
+msgstr "cấp shell (%d) quá cao nên đặt lại thành 1"
 
-#: variables.c:1941
+#: variables.c:1932
 msgid "make_local_variable: no function context at current scope"
 msgstr "make_local_variable: không có ngữ cảnh hàm ở phạm vi hiện thời"
 
-#: variables.c:3192
+#: variables.c:3182
 msgid "all_local_variables: no function context at current scope"
 msgstr "all_local_variables: không có ngữ cảnh hàm ở phạm vi hiện thời"
 
-#: variables.c:3437
+#: variables.c:3427
 #, c-format
 msgid "%s has null exportstr"
-msgstr "%s có chuỗi xuất (exportstr) vô giá trị"
+msgstr "%s có exportstr null"
 
-#: variables.c:3442 variables.c:3451
+#: variables.c:3432 variables.c:3441
 #, c-format
 msgid "invalid character %d in exportstr for %s"
-msgstr "sai ký tự %d trong chuỗi exportstr cho %s"
+msgstr "sai ký tự %d trong exportstr cho %s"
 
-#: variables.c:3457
+#: variables.c:3447
 #, c-format
 msgid "no `=' in exportstr for %s"
-msgstr "không có dấu bằng « = » trong chuỗi exportstr cho %s"
+msgstr "không có `=' trong exportstr cho %s"
 
-#: variables.c:3917
+#: variables.c:3891
 msgid "pop_var_context: head of shell_variables not a function context"
-msgstr ""
-"pop_var_context: đầu của shell_variables (các biến trình bao) không phải là "
-"ngữ cảnh hàm"
+msgstr "pop_var_context: đầu của shell_variables (các biến shell) không phải là ngữ cảnh hàm"
 
-#: variables.c:3930
+#: variables.c:3904
 msgid "pop_var_context: no global_variables context"
-msgstr ""
-"pop_var_context: không có ngữ cảnh global_variables (các biến toàn cục)"
+msgstr "pop_var_context: không có ngữ cảnh global_variables (các biến toàn cục)"
 
-#: variables.c:4004
+#: variables.c:3978
 msgid "pop_scope: head of shell_variables not a temporary environment scope"
-msgstr ""
-"pop_scope: đầu của shell_variables (các biến trình bao) không phải là phạm "
-"vi môi trường tạm thời"
+msgstr "pop_scope: đầu của shell_variables (các biến shell) không phải là phạm vi môi trường tạm thời"
 
-#: variables.c:4821
+#: variables.c:4786
 #, c-format
 msgid "%s: %s: cannot open as FILE"
-msgstr "%s: %s: không thể mở dưới dạng TẬP_TIN"
+msgstr "%s: %s: không thể mở dưới dạng TẬP-TIN"
 
-#: variables.c:4826
+#: variables.c:4791
 #, c-format
 msgid "%s: %s: invalid value for trace file descriptor"
 msgstr "%s: %s: sai đặt giá trị cho bộ mô tả tập tin vết"
 
 #: version.c:46
 msgid "Copyright (C) 2011 Free Software Foundation, Inc."
-msgstr "Tác quyền © năm 2011 của Tổ chức Quỹ  Phần mềm Tự do, Inc."
+msgstr "Tác quyền (C) năm 2011 của Tổ chức Quỹ Phần mềm Tự do, Inc."
 
 #: version.c:47
-msgid ""
-"License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
-"html>\n"
-msgstr ""
-"Giấy phép GPLv3+: Giấy Phép Công Cộng GNU phiên bản 3 hay sau <http://gnu."
-"org/licenses/gpl.html>\n"
+msgid "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\n"
+msgstr "Giấy phép GPLv3+: GNU GPL phiên bản 3 hoặc mới hơn <http://gnu.org/licenses/gpl.html>\n"
 
 #: version.c:86 version2.c:83
 #, c-format
 msgid "GNU bash, version %s (%s)\n"
-msgstr "bash của GNU, phiên bản %s (%s)\n"
+msgstr "GNU bash, phiên bản %s (%s)\n"
 
 #: version.c:91 version2.c:88
 #, c-format
 msgid "This is free software; you are free to change and redistribute it.\n"
-msgstr "Đây là phần mềm tự do thì bạn có quyền sửa đổi và phát hành lại nó.\n"
+msgstr "Đây là phần mềm tự do; bạn có quyền sửa đổi và phát hành lại nó.\n"
 
 #: version.c:92 version2.c:89
 #, c-format
@@ -1982,16 +1924,12 @@ msgstr "KHÔNG BẢO ĐẢM GÌ CẢ, với điều kiện được pháp luật
 #: version2.c:86
 #, c-format
 msgid "Copyright (C) 2009 Free Software Foundation, Inc.\n"
-msgstr "Tác quyền © năm 2009 của Tổ chức Phần mềm Tự do.\n"
+msgstr "Tác quyền (C) năm 2009 của Tổ chức Phần mềm Tự do.\n"
 
 #: version2.c:87
 #, c-format
-msgid ""
-"License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl."
-"html>\n"
-msgstr ""
-"Giấy phép GPLv2+: Giấy Phép Công Cộng GNU phiên bản 2 hay sau <http://gnu."
-"org/licenses/gpl.html>\n"
+msgid "License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl.html>\n"
+msgstr "Giấy phép GPLv2+: GNU GPL phiên bản 2 hoặc mới hơn <http://gnu.org/licenses/gpl.html>\n"
 
 #: xmalloc.c:91
 #, c-format
@@ -2015,21 +1953,15 @@ msgstr "%s: %s:%d: không thể cấp phát %lu byte"
 
 #: builtins.c:43
 msgid "alias [-p] [name[=value] ... ]"
-msgstr "alias [-p] [tên[=giá-trị] ... ]"
+msgstr "alias [-p] [TÊN[=GIÁ-TRỊ] ... ]"
 
 #: builtins.c:47
 msgid "unalias [-a] name [name ...]"
-msgstr "unalias [-a] tên [tên ...]"
+msgstr "unalias [-a] TÊN [TÊN ...]"
 
 #: builtins.c:51
-#, fuzzy
-msgid ""
-"bind [-lpsvPSVX] [-m keymap] [-f filename] [-q name] [-u name] [-r keyseq] [-"
-"x keyseq:shell-command] [keyseq:readline-function or readline-command]"
-msgstr ""
-"bind [-lpvsPVS] [-m sơ_đồ_phím] [-f tên_tập_tin] [-q tên] [-u tên] [-r "
-"dãy_phím] [-x dãy_phím:lệnh_trình_bao] [dãy_phím:chức_năng-readline hay lệnh-"
-"readline]"
+msgid "bind [-lpvsPVS] [-m keymap] [-f filename] [-q name] [-u name] [-r keyseq] [-x keyseq:shell-command] [keyseq:readline-function or readline-command]"
+msgstr "bind [-lpvsPVS] [-m SƠ-ĐỒ-PHÍM] [-f TẬP-TIN] [-q TÊN] [-u TÊN] [-r DÃY-PHÍM] [-x DÃY-PHÍM:LỆNH] [DÃY-PHÍM:HÀM-READLINE hay LỆNH-READLINE]"
 
 #: builtins.c:54
 msgid "break [n]"
@@ -2037,19 +1969,19 @@ msgstr "break [n]"
 
 #: builtins.c:56
 msgid "continue [n]"
-msgstr "tiếp tục [n]"
+msgstr "continue [n]"
 
 #: builtins.c:58
 msgid "builtin [shell-builtin [arg ...]]"
-msgstr "builtin [shell-builtin [arg ...]]"
+msgstr "builtin [SHELL-BUILTIN [ĐỐI-SỐ ...]]"
 
 #: builtins.c:61
 msgid "caller [expr]"
-msgstr "caller [b_thức]"
+msgstr "caller [BTHỨC]"
 
 #: builtins.c:64
 msgid "cd [-L|[-P [-e]]] [dir]"
-msgstr "cd [-L|-P] [thư mục]"
+msgstr "cd [-L|[-P [-e]]] [THƯ-MỤC]"
 
 #: builtins.c:66
 msgid "pwd [-LP]"
@@ -2061,51 +1993,51 @@ msgstr ":"
 
 #: builtins.c:70
 msgid "true"
-msgstr "đúng"
+msgstr "true"
 
 #: builtins.c:72
 msgid "false"
-msgstr "sai"
+msgstr "false"
 
 #: builtins.c:74
 msgid "command [-pVv] command [arg ...]"
-msgstr "command [-pVv] command [arg ...]"
+msgstr "command [-pVv] LỆNH [ĐỐI-SỐ ...]"
 
 #: builtins.c:76
 msgid "declare [-aAfFgilrtux] [-p] [name[=value] ...]"
-msgstr "declare [-aAfFgilrtux] [-p] [tên[=giá-trị] ...]"
+msgstr "declare [-aAfFgilrtux] [-p] [TÊN[=GIÁ-TRỊ] ...]"
 
 #: builtins.c:78
 msgid "typeset [-aAfFgilrtux] [-p] name[=value] ..."
-msgstr "typeset [-aAfFgilrtux] [-p] tên[=giá-trị] ..."
+msgstr "typeset [-aAfFgilrtux] [-p] TÊN[=GIÁ-TRỊ] ..."
 
 #: builtins.c:80
 msgid "local [option] name[=value] ..."
-msgstr "local [tùy_chọn] tên[=giá_trị] ..."
+msgstr "local [tùy_chọn] TÊN[=GIÁ-TRỊ] ..."
 
 #: builtins.c:83
 msgid "echo [-neE] [arg ...]"
-msgstr "echo [-neE] [Ä\91á»\91i_sá»\91 ...]"
+msgstr "echo [-neE] [Ä\90á»\90I-Sá»\90 ...]"
 
 #: builtins.c:87
 msgid "echo [-n] [arg ...]"
-msgstr "echo [-n] [Ä\91á»\91i_sá»\91 ...]"
+msgstr "echo [-n] [Ä\90á»\90I-Sá»\90 ...]"
 
 #: builtins.c:90
 msgid "enable [-a] [-dnps] [-f filename] [name ...]"
-msgstr "enable [-a] [-dnps] [-f tên_tập_tin] [tên ...]"
+msgstr "enable [-a] [-dnps] [-f TẬP-TIN] [TÊN ...]"
 
 #: builtins.c:92
 msgid "eval [arg ...]"
-msgstr "eval [Ä\91á»\91i_sá»\91 ...]"
+msgstr "eval [Ä\90á»\90I-Sá»\90 ...]"
 
 #: builtins.c:94
 msgid "getopts optstring name [arg]"
-msgstr "getopts chuỗi_tùy_chọn tên [đối_số]"
+msgstr "getopts CHUỖI-TÙY-CHỌN TÊN [ĐỐI-SỐ]"
 
 #: builtins.c:96
 msgid "exec [-cl] [-a name] [command [arguments ...]] [redirection ...]"
-msgstr "exec [-cl] [-a tên] [lệnh [đối_số ...]] [chuyển_hướng ...]"
+msgstr "exec [-cl] [-a TÊN] [LỆNH [ĐỐI-SỐ ...]] [CHUYỂN-HƯỚNG ...]"
 
 #: builtins.c:98
 msgid "exit [n]"
@@ -2113,74 +2045,51 @@ msgstr "exit [n]"
 
 #: builtins.c:100
 msgid "logout [n]"
-msgstr "đăng xuất [n]"
+msgstr "logout [n]"
 
 #: builtins.c:103
 msgid "fc [-e ename] [-lnr] [first] [last] or fc -s [pat=rep] [command]"
-msgstr ""
-"fc [-e tên-e] [-lnr] [đầu] [cuối]\n"
-"\thay\n"
-"fc -s [mẫu=lập_lại] [lệnh]"
+msgstr "fc [-e ENAME] [-lnr] [ĐẦU] [CUỐI] hoặc fc -s [MẪU=LẬP_LẠI] [LỆNH]"
 
 #: builtins.c:107
 msgid "fg [job_spec]"
-msgstr "fg [Ä\91ặc_tả_công_viá»\87c]"
+msgstr "fg [Ä\90TCV]"
 
 #: builtins.c:111
 msgid "bg [job_spec ...]"
-msgstr "bg [Ä\91ặc_tả_công_viá»\87c ...]"
+msgstr "bg [Ä\90TCV ...]"
 
 #: builtins.c:114
 msgid "hash [-lr] [-p pathname] [-dt] [name ...]"
-msgstr "hash [-lr] [-p Ä\91ưá»\9dng_dẫn] [-dt] [tên ...]"
+msgstr "hash [-lr] [-p Ä\90Ưá»\9cNG-DẪN] [-dt] [TÃ\8aN ...]"
 
 #: builtins.c:117
 msgid "help [-dms] [pattern ...]"
-msgstr "help [-dms] [mẫu ...]"
+msgstr "help [-dms] [MẪU ...]"
 
 #: builtins.c:121
-msgid ""
-"history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg "
-"[arg...]"
-msgstr ""
-"history [-c] [-d hiệu] [n]\n"
-"\thay\n"
-"history -anrw [tên_tập_tin]\n"
-"\thay\n"
-"history -ps đối_số [đối_số...]"
+msgid "history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg [arg...]"
+msgstr "history [-c] [-d OFFSET] [n] hay history -anrw [TẬP-TIN] hay history -ps ĐỐI-SỐ [ĐỐI-SỐ...]"
 
 #: builtins.c:125
 msgid "jobs [-lnprs] [jobspec ...] or jobs -x command [args]"
-msgstr ""
-"jobs [-lnprs] [đặc_tả_công_việc ...]\n"
-"\thoặc\n"
-"jobs -x lệnh [các_đối_số]"
+msgstr "jobs [-lnprs] [ĐTCV ...] hoặc jobs -x LỆNH [ĐỐI-SỐ]"
 
 #: builtins.c:129
 msgid "disown [-h] [-ar] [jobspec ...]"
-msgstr "disown [-h] [-ar] [Ä\91ặc_tả_công_viá»\87c ...]"
+msgstr "disown [-h] [-ar] [Ä\90TCV ...]"
 
 #: builtins.c:132
-msgid ""
-"kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l "
-"[sigspec]"
-msgstr ""
-"kill [-s đặc_tả_tín_hiệu | -n số_tín_hiệu | -đặc_tả_tín_hiệu] pid | "
-"đặc_tả_công_việc ...\n"
-"\thay\n"
-"kill -l [đặc_tả_tín_hiệu]"
+msgid "kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]"
+msgstr "kill [-s ĐTTH | -n số_tín_hiệu | -ĐTTH] pid | ĐTCV ... hoặc kill -l [ĐTTH]"
 
 #: builtins.c:134
 msgid "let arg [arg ...]"
-msgstr "let Ä\91á»\91i_sá»\91 [Ä\91á»\91i_sá»\91 ...]"
+msgstr "let Ä\90á»\90I-Sá»\90 [Ä\90á»\90I-Sá»\90 ...]"
 
 #: builtins.c:136
-msgid ""
-"read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p "
-"prompt] [-t timeout] [-u fd] [name ...]"
-msgstr ""
-"read [-ers] [-a mảng] [-d giới_hạn] [-i văn_bản] [-n số_ký_tự] [-N số_ký_tự] "
-"[-p nhắc] [-t thời_hạn] [-u fd] [tên ...]"
+msgid "read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]"
+msgstr "read [-ers] [-a MẢNG] [-d GIỚI-HẠN] [-i VĂN-BẢN] [-n SỐ-KÝ-TỰ] [-N SỐ-KÝ-TỰ] [-p NHẮC] [-t THỜI-HẠN] [-u fd] [TÊN ...]"
 
 # nghĩa chữ
 #: builtins.c:138
@@ -2189,22 +2098,19 @@ msgstr "return [n]"
 
 #: builtins.c:140
 msgid "set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]"
-msgstr "set [-abefhkmnptuvxBCHP] [-o tên-tùy-chọn] [--] [đối-số ...]"
+msgstr "set [-abefhkmnptuvxBCHP] [-o TÊN-TÙY-CHỌN] [--] [ĐỐI-SỐ ...]"
 
 #: builtins.c:142
 msgid "unset [-f] [-v] [name ...]"
-msgstr "unset [-f] [-v] [tên ...]"
+msgstr "unset [-f] [-v] [TÊN ...]"
 
 #: builtins.c:144
 msgid "export [-fn] [name[=value] ...] or export -p"
-msgstr ""
-"export [-fn] [tên[=giá_trị] ...]\n"
-"\thay\n"
-"export -p"
+msgstr "export [-fn] [TÊN[=GIÁ-TRỊ] ...] hoặc export -p"
 
 #: builtins.c:146
 msgid "readonly [-aAf] [name[=value] ...] or readonly -p"
-msgstr "readonly [-aAf] [tên[=giá_trị] ...] hay readonly -p"
+msgstr "readonly [-aAf] [TÊN[=GIÁ-TRỊ] ...] hay readonly -p"
 
 #: builtins.c:148
 msgid "shift [n]"
@@ -2212,120 +2118,111 @@ msgstr "shift [n]"
 
 #: builtins.c:150
 msgid "source filename [arguments]"
-msgstr "nguồn tên_tập_tin [đối_số ...]"
+msgstr "source TẬP-TIN [ĐỐI-SỐ ...]"
 
 #: builtins.c:152
 msgid ". filename [arguments]"
-msgstr ". tên_tập_tin [đối_số ...]"
+msgstr ". TẬP-TIN [ĐỐI-SỐ ...]"
 
 #: builtins.c:155
 msgid "suspend [-f]"
-msgstr "ngưng [-f]"
+msgstr "suspend [-f]"
 
 #: builtins.c:158
 msgid "test [expr]"
-msgstr "test [b_thức]"
+msgstr "test [BTHỨC]"
 
 #: builtins.c:160
 msgid "[ arg... ]"
-msgstr "[ Ä\91á»\91i_sá»\91 ... ]"
+msgstr "[ Ä\90á»\90I-Sá»\90 ... ]"
 
 #: builtins.c:162
 msgid "times"
-msgstr "lần"
+msgstr "times"
 
 #: builtins.c:164
 msgid "trap [-lp] [[arg] signal_spec ...]"
-msgstr "trap [-lp] [[Ä\91á»\91i_sá»\91] Ä\91ặc_tả_tín_hiá»\87u ...]"
+msgstr "trap [-lp] [[Ä\90á»\90I-Sá»\90] Ä\90TTH ...]"
 
 #: builtins.c:166
 msgid "type [-afptP] name [name ...]"
-msgstr "type [-afptP] tên [tên ...]"
+msgstr "type [-afptP] TÊN [TÊN ...]"
 
 #: builtins.c:169
-#, fuzzy
-msgid "ulimit [-SHabcdefilmnpqrstuvxT] [limit]"
-msgstr "ulimit [-SHacdefilmnpqrstuvx] [giới_hạn]"
+msgid "ulimit [-SHacdefilmnpqrstuvx] [limit]"
+msgstr "ulimit [-SHacdefilmnpqrstuvx] [GIỚI-HẠN]"
 
 #: builtins.c:172
 msgid "umask [-p] [-S] [mode]"
-msgstr "umask [-p] [-S] [chế_độ]"
+msgstr "umask [-p] [-S] [CHẾ-ĐỘ]"
 
 #: builtins.c:175
-#, fuzzy
-msgid "wait [id ...]"
-msgstr "đợi [id]"
+msgid "wait [id]"
+msgstr "wait [id]"
 
 #: builtins.c:179
 msgid "wait [pid]"
-msgstr "đợi [pid]"
+msgstr "wait [pid]"
 
 #: builtins.c:182
 msgid "for NAME [in WORDS ... ] ; do COMMANDS; done"
-msgstr "for TÊN [in CÁC-TỪ ... ;] do các_CÂU_LỆNH; done"
+msgstr "for TÊN [in TỪ TỪ... ;] do LỆNH; done"
 
 #: builtins.c:184
 msgid "for (( exp1; exp2; exp3 )); do COMMANDS; done"
-msgstr "for (( exp1; exp2; exp3 )); do các_CÂU_LỆNH; done"
+msgstr "for (( BTHỨC1; BTHỨC2; BTHỨC3 )); do LỆNH; done"
 
 #: builtins.c:186
 msgid "select NAME [in WORDS ... ;] do COMMANDS; done"
-msgstr "select TÊN [in CÁC-TỪ ... ;] do các_CÂU_LỆNH; done"
+msgstr "select TÊN [in TỪ TỪ ... ;] do LỆNH; done"
 
 #: builtins.c:188
 msgid "time [-p] pipeline"
-msgstr "thời hạn [-p] ống dẫn"
+msgstr "time [-p] ỐNG-DẪN"
 
 #: builtins.c:190
 msgid "case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac"
-msgstr "case TỪ in [MẪU [| MẪU]...) các_CÂU_LỆNH ;;]... esac"
+msgstr "case TỪ in [MẪU [| MẪU]...) LỆNH ;;]... esac"
 
 #: builtins.c:192
-msgid ""
-"if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else "
-"COMMANDS; ] fi"
-msgstr ""
-"if các_CÂU_LỆNH; then các_CÂU_LỆNH; [ elif các_CÂU_LỆNH; then "
-"các_CÂU_LỆNH; ]... [ else các_CÂU_LỆNH; ] fi"
+msgid "if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi"
+msgstr "if LỆNH; then LỆNH; [ elif LỆNH; then LỆNH; ]... [ else LỆNH; ] fi"
 
 #: builtins.c:194
 msgid "while COMMANDS; do COMMANDS; done"
-msgstr "while các_CÂU_LỆNH; do các_CÂU_LỆNH; done"
+msgstr "while LỆNH; do LỆNH; done"
 
 #: builtins.c:196
 msgid "until COMMANDS; do COMMANDS; done"
-msgstr "until các_CÂU_LỆNH; do các_CÂU_LỆNH; done"
+msgstr "until LỆNH; do LỆNH; done"
 
 #: builtins.c:198
 msgid "coproc [NAME] command [redirections]"
-msgstr "coproc [TÊN] command [định vị lại]"
+msgstr "coproc [TÊN] LỆNH [CHUYỂN-HƯỚNG]"
 
 #: builtins.c:200
 msgid "function name { COMMANDS ; } or name () { COMMANDS ; }"
-msgstr ""
-"chức_năng tên { các_CÂU_LỆNH ; }\n"
-"\thay\n"
-"tên () { các_CÂU_LỆNH ; }"
+msgstr "function TÊN { LỆNH ; } or TÊN () { LỆNH ; }"
 
 #: builtins.c:202
 msgid "{ COMMANDS ; }"
-msgstr "{ các_CÂU_LỆNH ; }"
+msgstr "{ LỆNH ; }"
 
 #: builtins.c:204
 msgid "job_spec [&]"
-msgstr "Ä\91ặc_tả_công_viá»\87c [&]"
+msgstr "Ä\90TCV [&]"
 
 #: builtins.c:206
 msgid "(( expression ))"
-msgstr "(( biểu_thức ))"
+msgstr "(( BTHỨC ))"
 
 #: builtins.c:208
 msgid "[[ expression ]]"
-msgstr "[[ biểu_thức ]]"
+msgstr "[[ BTHỨC ]]"
 
 #: builtins.c:210
 msgid "variables - Names and meanings of some shell variables"
-msgstr "biến — tên và nghĩa của một số biến trình bao"
+msgstr "biến — tên và nghĩa của một số biến shell"
 
 #: builtins.c:213
 msgid "pushd [-n] [+N | -N | dir]"
@@ -2341,49 +2238,31 @@ msgstr "dirs [-clpv] [+N] [-N]"
 
 #: builtins.c:224
 msgid "shopt [-pqsu] [-o] [optname ...]"
-msgstr "shopt [-pqsu] [-o] [tùy_chọn ...]"
+msgstr "shopt [-pqsu] [-o] [TÙY-CHỌN ...]"
 
 #: builtins.c:226
 msgid "printf [-v var] format [arguments]"
-msgstr "printf [-v biến] định_dạng [đối_số]"
+msgstr "printf [-v BIẾN] ĐỊNH-DẠNG [ĐỐI-SỐ]"
 
 #: builtins.c:229
-msgid ""
-"complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat] [-"
-"W wordlist]  [-F function] [-C command] [-X filterpat] [-P prefix] [-S "
-"suffix] [name ...]"
-msgstr ""
-"complete [-abcdefgjksuv] [-pr] [-DE] [-o tùy_chọn] [-A hành_động] [-G "
-"mẫu_glob] [-W danh_sách_từ]  [-F hàm] [-C lệnh] [-X mẫu_lọc] [-P tiền_tố] [-"
-"S hậu_tố] [tên ...]"
+msgid "complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat] [-W wordlist]  [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...]"
+msgstr "complete [-abcdefgjksuv] [-pr] [-DE] [-o TÙY-CHỌN] [-A HÀNH-ĐỘNG] [-G MẪU-GLOB] [-W DANH-SÁCH-TỪ]  [-F HÀM] [-C LỆNH] [-X MẪU-LỌC] [-P TIỀN-TỐ] [-S HẬU-TỐ] [TÊN ...]"
 
 #: builtins.c:233
-msgid ""
-"compgen [-abcdefgjksuv] [-o option]  [-A action] [-G globpat] [-W wordlist]  "
-"[-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [word]"
-msgstr ""
-"compgen [-abcdefgjksuv] [-o tùy_chọn]  [-A hành_động] [-G mẫu_glob] [-W "
-"danh_sách_từ]  [-F hàm] [-C lệnh] [-X mẫu_lọc] [-P tiền_tố] [-S hậu_tố] [từ]"
+msgid "compgen [-abcdefgjksuv] [-o option]  [-A action] [-G globpat] [-W wordlist]  [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [word]"
+msgstr "compgen [-abcdefgjksuv] [-o TÙY-CHỌN]  [-A HÀNH-ĐỘNG] [-G MẪU-GLOB] [-W DANH-SÁCH-TỪ]  [-F HÀM] [-C LỆNH] [-X MẪU-LỌC] [-P TIỀN-TỐ] [-S HẬU-TỐ] [TỪ]"
 
 #: builtins.c:237
 msgid "compopt [-o|+o option] [-DE] [name ...]"
-msgstr "compopt [-o|+o tùy_chọn] [-DE] [tên ...]"
+msgstr "compopt [-o|+o TÙY-CHỌN] [-DE] [TÊN ...]"
 
 #: builtins.c:240
-msgid ""
-"mapfile [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c "
-"quantum] [array]"
-msgstr ""
-"mapfile [-n đếm] [-O gốc] [-s đếm] [-t] [-u fd] [-C gọi_ngược] [-c lượng] "
-"[mảng]"
+msgid "mapfile [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]"
+msgstr "mapfile [-n ĐẾM] [-O GỐC] [-s SỐ-LƯỢNG] [-t] [-u fd] [-C GỌI-NGƯỢC] [-c LƯỢNG] [MẢNG]"
 
 #: builtins.c:242
-msgid ""
-"readarray [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c "
-"quantum] [array]"
-msgstr ""
-"readarray [-n đếm] [-O gốc] [-s đếm] [-t] [-u fd] [-C gọi_ngược] [-c lượng] "
-"[mảng]"
+msgid "readarray [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]"
+msgstr "readarray [-n ĐẾM] [-O GỐC] [-s SỐ-LƯỢNG] [-t] [-u FD] [-C GỌI-NGƯỢC] [-c LƯỢNG] [MẢNG]"
 
 #: builtins.c:254
 msgid ""
@@ -2400,26 +2279,25 @@ msgid ""
 "      -p\tPrint all defined aliases in a reusable format\n"
 "    \n"
 "    Exit Status:\n"
-"    alias returns true unless a NAME is supplied for which no alias has "
-"been\n"
+"    alias returns true unless a NAME is supplied for which no alias has been\n"
 "    defined."
 msgstr ""
-"Xác định hoặc hiển thị bí danh.\n"
+"Định nghĩa hoặc hiển thị bí danh.\n"
 "\n"
-"\tKhông đưa ra đối số thì « alias » in ra danh sách các bí danh\n"
-"\ttheo định dạng có thể dùng lại được « bí_danh TÊN=GIÁ_TRỊ »\n"
-"\ttrên đầu ra tiêu chuẩn.\n"
+"    Không đưa ra đối số thì \"alias\" in danh sách các bí danh theo mấu\n"
+"    \"alias TÊN=GIÁ-TRỊ\" trên đầu ra chuẩn.\n"
 "\n"
-"\tCó đối số thì một bí danh được xác định cho mỗi TÊN có giá trị đưa ra.\n"
-"\tMột dấu cách theo sau trong GIÁ_TRỊ thì gây ra từ kế tiếp được kiểm tra\n"
-"\tcó bí danh được thay thế khi bí danh được mở rộng.\n"
+"    Có đối số thì một bí danh được định nghĩa cho mỗi TÊN theo giá trị\n"
+"    đưa ra. Khoảng trắng ở đâu trong GIÁ-TRỊ làm kiểm tra thay thế bí\n"
+"    danh cho từ kế tiếp, khi phân giải bí danh.\n"
 "\n"
-"\tTùy chọn:\n"
-"\t\t-p\tin ra tất cả các bí danh đã xác định theo một định dạng\n"
-"\t\t\tcó thể dùng lại được\n"
+"    Tùy chọn:\n"
+"      -p\tin tất cả các bí danh được định nghĩa theo định dạng\n"
+"        \tcó thể dùng lại được\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tbí danh trả lại Đúng nếu không đưa ra TÊN chưa có bí danh được xác định."
+"   Trạng thái thoát:\n"
+"   alias trả lại thành công trừ khi TÊN được cung cấp không phải là\n"
+"   một bí danh được định nghĩa"
 
 #: builtins.c:276
 msgid ""
@@ -2430,15 +2308,14 @@ msgid ""
 "    \n"
 "    Return success unless a NAME is not an existing alias."
 msgstr ""
-"Gỡ bỏ mỗi TÊN khỏi danh sách các bí danh đã xác định.\n"
+"Gỡ bỏ TÊN khỏi danh sách các bí danh.\n"
 "\n"
-"\tTùy chọn:\n"
-"\t\t-a\tgỡ bỏ tất cả các lời xác định bí danh.\n"
+"    Tùy chọn:\n"
+"      -a\tbỏ tất cả các bí danh.\n"
 "\n"
-"Trả lại thành công nếu không có TÊN là một bí danh không tồn tại."
+"    Trả lại thành công trừ khi TÊN không phải là một bí danh."
 
 #: builtins.c:289
-#, fuzzy
 msgid ""
 "Set Readline key bindings and variables.\n"
 "    \n"
@@ -2450,70 +2327,57 @@ msgid ""
 "    Options:\n"
 "      -m  keymap         Use KEYMAP as the keymap for the duration of this\n"
 "                         command.  Acceptable keymap names are emacs,\n"
-"                         emacs-standard, emacs-meta, emacs-ctlx, vi, vi-"
-"move,\n"
+"                         emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move,\n"
 "                         vi-command, and vi-insert.\n"
 "      -l                 List names of functions.\n"
 "      -P                 List function names and bindings.\n"
 "      -p                 List functions and bindings in a form that can be\n"
 "                         reused as input.\n"
-"      -S                 List key sequences that invoke macros and their "
-"values\n"
-"      -s                 List key sequences that invoke macros and their "
-"values\n"
+"      -S                 List key sequences that invoke macros and their values\n"
+"      -s                 List key sequences that invoke macros and their values\n"
 "                         in a form that can be reused as input.\n"
 "      -V                 List variable names and values\n"
 "      -v                 List variable names and values in a form that can\n"
 "                         be reused as input.\n"
 "      -q  function-name  Query about which keys invoke the named function.\n"
-"      -u  function-name  Unbind all keys which are bound to the named "
-"function.\n"
+"      -u  function-name  Unbind all keys which are bound to the named function.\n"
 "      -r  keyseq         Remove the binding for KEYSEQ.\n"
 "      -f  filename       Read key bindings from FILENAME.\n"
 "      -x  keyseq:shell-command\tCause SHELL-COMMAND to be executed when\n"
 "    \t\t\t\tKEYSEQ is entered.\n"
-"      -X\t\t     List key sequences bound with -x and associated commands\n"
-"                         in a form that can be reused as input.\n"
 "    \n"
 "    Exit Status:\n"
 "    bind returns 0 unless an unrecognized option is given or an error occurs."
 msgstr ""
-"Đặt các tổ hợp phím và biến kiểu Readline.\n"
-"\n"
-"\tTổ hợp một dãy phím với một chức năng hay vĩ lệnh kiểu Readline,\n"
-"\t\thoặc đặt một biến Readline.\n"
-"\tCú pháp đối số khác tùy chọn cũng tương đương với cú pháp\n"
-"\t\ttrong « ~/.inputrc », nhưng phải được gửi dưới dạng\n"
-"\t\tmột đối số riêng lẻ.\n"
-"\t\tVí dụ : bind '\"\\C-x\\C-r\": re-read-init-file'.\n"
-"\n"
-"\tTùy chọn:\n"
-"\t\t-m sơ_đồ_phím\tdùng sơ đồ phím này làm sơ đồ phím\n"
-"\t\t\ttrong khoảng thời gian chạy câu lệnh này.\n"
-"\t\tTên sơ đồ phím hợp lệ:\n"
-"\t\t\temacs, emacs-standard, emacs-meta,\n"
-"\t\t\temacs-ctlx, vi, vi-move, vi-command,\n"
-"\t\t\tvi-insert\n"
-"\t\t-l\tliệt kê các tên chức năng\n"
-"\t\t-P\tliệt kê các tên và tổ hợp của chức năng\n"
-"\t\t-p\tliệt kê các chức năng và tổ hợp theo một định dạng\n"
-"\t\t\tcó thể dùng lại được làm dữ liệu nhập vào\n"
-"\t\t-S\tliệt kê các dãy phím mà gọi vĩ lệnh và giá trị tương ứng\n"
-"\t\t-S\tliệt kê các dãy phím mà gọi vĩ lệnh và giá trị tương ứng\n"
-"\t\t\ttheo một định dạng có thể dùng lại được\n"
-"\t\t\tlàm dữ liệu nhập vào\n"
-"\t\t-q tên_chức_năng\thỏi những phím nào gọi chức năng này\n"
-"\t\t-u tên_chức_năng\ttháo tổ hợp tất cả các phím tổ hợp\n"
-"\t\t\tvới chức năng này\n"
-"\t\t-r dãy_phím\tgỡ bỏ tổ hợp đối với dãy phím này\n"
-"\t\t-f tên_tập_tin\tđọc các tổ hợp phím từ tập tin này\n"
-"\t\t-x dãy_phím:lệnh_trình_bao\tchạy câu lệnh trình bào này\n"
-"\t\t\tkhi dãy phím này được nhập vào\n"
-"\n"
-"\tTrạng thái thoát:\n"
-"\tbind trả lại 0 nếu không đưa ra tùy chọn không nhận ra hay gặp lỗi."
-
-#: builtins.c:328
+"Đặt các tổ hợp phím và biến Readline.\n"
+"\n"
+"    Gắn tổ hợp phím với một chức năng hay vĩ lệnh Readline, hoặc\n"
+"    đặt biến Readline. Cú pháp đối số không tùy chọn giống như trong\n"
+"    ~/.inputrc, nhưng phải được gửi dưới dạng đối số đơn. Ví\n"
+"    dụ: bind '\"\\C-x\\C-r\": re-read-init-file'.\n"
+"\n"
+"    Tùy chọn:\n"
+"      -m SƠ-ĐỒ-PHÍM     dùng sơ_đồ_phím làm sơ đồ phím khi lệnh này\n"
+"                        chạy. Giá trị hợp lệ là emacs, emacs-standard,\n"
+"                        emacs-meta, emacs-ctlx, vi, vi-move, vi-command\n"
+"                        và vi-insert.\n"
+"      -l                liệt kê tên chức năng\n"
+"      -P                liệt kê tên chức năng và tổ hợp phím\n"
+"      -p                liệt kê tên chức năng và tổ hợp phím theo dạng dùng\n"
+"                        lại làm đầu vào được\n"
+"      -S                liệt kê chuỗi phím để gọi vĩ lệnh và giá trị tương ứng\n"
+"      -s                liệt kê chuỗi phím để gọi vĩ lệnh và giá trị tương ứng\n"
+"                        theo định dạng có thể dùng lại làm đầu vào được\n"
+"      -q TÊN\t\thỏi phím nào gọi chức năng này\n"
+"      -u TÊN\t\tgỡ bỏ tất cả phím tắt gắn với chức năng này\n"
+"      -r DÃY-PHÍM       gỡ bỏ tổ hợp phím này\n"
+"      -f TẬP-TIN\tđọc tổ hợp phím từ tập tin này\n"
+"      -x DÃY-PHÍM:LỆNH  chạy LỆNH khi nhập DÃY-PHÍM\n"
+"\n"
+"    Trạng thái thoát:\n"
+"    bind trả lại 0 trừ khi đưa ra tùy chọn không nhận ra hay gặp lỗi."
+
+#: builtins.c:326
 msgid ""
 "Exit for, while, or until loops.\n"
 "    \n"
@@ -2523,15 +2387,15 @@ msgid ""
 "    Exit Status:\n"
 "    The exit status is 0 unless N is not greater than or equal to 1."
 msgstr ""
-"Thoát khỏi vòng lặp kiểu trong, trong khi hay đến khi.\n"
+"Thoát khỏi vòng lặp for, while hoặc until.\n"
 "\n"
-"\tThoát khỏi một vòng lặp kiểu TRONG, TRONG KHI hay ĐẾN KHI.\n"
-"\tCó ghi rõ N thì ngắt N vòng lặp bao bọc.\n"
+"    Thoát khỏi vòng lặp for, while hoặc until. Nếu xác định N thì\n"
+"    thoát N vòng lặp.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrạng thái thoát là 0 nếu N không nhỏ hơn hay bằng 1."
+"    Trạng thái thoát:\n"
+"    Trạng thái thoát là 0 trừ khi N nhỏ hơn 1."
 
-#: builtins.c:340
+#: builtins.c:338
 msgid ""
 "Resume for, while, or until loops.\n"
 "    \n"
@@ -2541,42 +2405,37 @@ msgid ""
 "    Exit Status:\n"
 "    The exit status is 0 unless N is not greater than or equal to 1."
 msgstr ""
-"Tiếp tục lại chạy vòng lặp kiểu trong, trong khi hay đến khi.\n"
+"Tiếp tục lại chạy vòng lặp for, while hoặc until.\n"
 "\n"
-"\tTiếp tục lại lần lặp lại kế tiếp của vòng lặp bao bọc\n"
-"\t\tkiểu TRONG, TRONG KHI hay ĐẾN KHI.\n"
-"\tĐưa ra N thì tiếp tục chạy vòng lặp bao bọc thứ N.\n"
+"    Tiếp tục lại chạy vòng lặp for, while hoặc until. Nếu xác định N\n"
+"    thì tiếp tục vòng lặp thứ N.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrạng thái thoát là 0 nếu N không nhỏ hơn hay bằng 1."
+"    Trạng thái thoát:\n"
+"    Trạng thái thoát là 0 trừ khi N nhỏ hơn 1."
 
-#: builtins.c:352
+#: builtins.c:350
 msgid ""
 "Execute shell builtins.\n"
 "    \n"
 "    Execute SHELL-BUILTIN with arguments ARGs without performing command\n"
 "    lookup.  This is useful when you wish to reimplement a shell builtin\n"
-"    as a shell function, but need to execute the builtin within the "
-"function.\n"
+"    as a shell function, but need to execute the builtin within the function.\n"
 "    \n"
 "    Exit Status:\n"
 "    Returns the exit status of SHELL-BUILTIN, or false if SHELL-BUILTIN is\n"
 "    not a shell builtin.."
 msgstr ""
-"Chạy dựng sẵn trình bao.\n"
+"Chạy lệnh dựng sẵn shell.\n"
 "\n"
-"\tChạy SHELL-BUILTIN (dựng sẵn trình bao) với các ĐỐI_SỐ\n"
-"\tmà không thực thi chức năng dò tìm câu lệnh.\n"
-"\tCó ích khi bạn muốn thực thi lại một dựng sẵn trình bao\n"
-"\tdưới dạng một chức năng trình bao, nhưng cũng\n"
-"\tcần thực thi dựng sẵn bên trong chức năng.\n"
+"    Chạy SHELL-BUILTIN với ĐỐI-SỐ mà không thực hiện tìm lệnh. Hữu ích\n"
+"    khi bạn muốn cài đặt lại lệnh shell dựng sẵn dạng hàm shell, nhưng\n"
+"    cần chạy lệnh dựng sẵn trong hàm đó.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại trạng thái thoát của SHELL-BUILTIN,\n"
-"\thoặc sai nếu SHELL-BUILTIN không phải là một\n"
-"\tdựng sẵn trình bao."
+"    Trạng thái thoát:\n"
+"    Trả lại trạng thái thoát của SHELL-BUILTIN, hoặc sai nếu\n"
+"    SHELL-BUILTIN không phải là một lệnh dựng sẵn shell."
 
-#: builtins.c:367
+#: builtins.c:365
 msgid ""
 "Return the context of the current subroutine call.\n"
 "    \n"
@@ -2591,92 +2450,74 @@ msgid ""
 "    Returns 0 unless the shell is not executing a shell function or EXPR\n"
 "    is invalid."
 msgstr ""
-"Trả về ngữ cảnh của cuộc gọi hàm phụ hiện thời.\n"
+"Trả về ngữ cảnh của lệnh gọi hàm hiện thời.\n"
 "\n"
-"\tKhông có B_THỨC thì trả lại « $line $filename ».\n"
-"\tCó B_THỨC thì trả lại « $line $subroutine $filename »;\n"
-"\tthông tin thêm này có thể được dùng để cung cấp vết đống.\n"
+"    Không có BTHỨC thì trả lại \"$line $filename\".  Có BTHỨC thì trả\n"
+"    lại \"$line $subroutine $filename\"; thông tin bổ sung này có thể\n"
+"    được dùng để cung cấp stack trace.\n"
 "\n"
-"\tGiá trị của B_THỨC thì ngụ ý bao nhiêu khung gọi cần lùi lại\n"
-"đằng trước khung hiện tại; khung đầu là khung 0.\n"
+"    Giá trị của BTHỨC thì ngụ ý bao nhiêu lần gọi cần lùi lại đằng\n"
+"    trước lệnh gọi hiện tại; khung gọi đầu là khung 0.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại 0 nếu trình bao đang chạy chức năng trình bao,\n"
-"\t\tB_THỨC cũng hợp lệ."
+"    Trạng thái thoát:\n"
+"    Trả lại 0 trừ khi shell đang chạy hàm shell, BTHỨC cũng hợp lệ."
 
-#: builtins.c:385
-#, fuzzy
+#: builtins.c:383
 msgid ""
 "Change the shell working directory.\n"
 "    \n"
-"    Change the current directory to DIR.  The default DIR is the value of "
-"the\n"
+"    Change the current directory to DIR.  The default DIR is the value of the\n"
 "    HOME shell variable.\n"
 "    \n"
-"    The variable CDPATH defines the search path for the directory "
-"containing\n"
-"    DIR.  Alternative directory names in CDPATH are separated by a colon "
-"(:).\n"
-"    A null directory name is the same as the current directory.  If DIR "
-"begins\n"
+"    The variable CDPATH defines the search path for the directory containing\n"
+"    DIR.  Alternative directory names in CDPATH are separated by a colon (:).\n"
+"    A null directory name is the same as the current directory.  If DIR begins\n"
 "    with a slash (/), then CDPATH is not used.\n"
 "    \n"
-"    If the directory is not found, and the shell option `cdable_vars' is "
-"set,\n"
-"    the word is assumed to be  a variable name.  If that variable has a "
-"value,\n"
+"    If the directory is not found, and the shell option `cdable_vars' is set,\n"
+"    the word is assumed to be  a variable name.  If that variable has a value,\n"
 "    its value is used for DIR.\n"
 "    \n"
 "    Options:\n"
-"        -L\tforce symbolic links to be followed: resolve symbolic links in\n"
-"    \tDIR after processing instances of `..'\n"
+"        -L\tforce symbolic links to be followed\n"
 "        -P\tuse the physical directory structure without following symbolic\n"
-"    \tlinks: resolve symbolic links in DIR before processing instances\n"
-"    \tof `..'\n"
+"    \tlinks\n"
 "        -e\tif the -P option is supplied, and the current working directory\n"
 "    \tcannot be determined successfully, exit with a non-zero status\n"
 "    \n"
 "    The default is to follow symbolic links, as if `-L' were specified.\n"
-"    `..' is processed by removing the immediately previous pathname "
-"component\n"
-"    back to a slash or the beginning of DIR.\n"
 "    \n"
 "    Exit Status:\n"
-"    Returns 0 if the directory is changed, and if $PWD is set successfully "
-"when\n"
+"    Returns 0 if the directory is changed, and if $PWD is set successfully when\n"
 "    -P is used; non-zero otherwise."
 msgstr ""
-"Chuyển đổi thư mục làm việc của shell.\n"
+"Đổi thư mục làm việc của shell.\n"
 "    \n"
-"    Chuyển đổi thư mục hiện thời sang THƯMỤC.Thư mục mặc định là giá trị "
-"của\n"
-"     biến HOME.\n"
+"    Chuyển đổi thư mục hiện thời sang THƯ-MỤC. Thư mục mặc định là giá\n"
+"    trị của biến HOME.\n"
 "    \n"
-"    Biến CDPATH thì xác định đường dẫn tìm kiếm cho thư mục chứa.\n"
-"    THƯMỤC. Các tên thư mục xen kẽ trong CDPATH cũng định giới bằng dấu hai "
-"chấm (:).\n"
-"    Một tên thư mục trống tương đương với thư mục hiện tại. Nếu THƯMỤC bắt "
-"đầu\n"
-"    với dấu chéo (/) thì không dùng CDPATH.\n"
+"    Biến CDPATH xác định đường dẫn tìm kiếm cho thư mục chứa\n"
+"    THƯ-MỤC. Tên thư mục trong CDPATH được phân cách bằng dấu hai chấm\n"
+"    (:).  Tên thư mục trống tương đương với thư mục hiện tại. Nếu\n"
+"    THƯ-MỤC bắt đầu với dấu chéo (/) thì không dùng CDPATH.\n"
 "    \n"
 "    Nếu không tìm thấy thư mục, và biến `cdable_vars' được đặt,\n"
 "    thì lệnh sẽ giả định là một tên biến. Nếu biến đó có giá trị,\n"
-"    thì giá trị này được dùng cho THƯMỤC.\n"
+"    thì giá trị này được dùng cho THƯ-MỤC.\n"
 "    \n"
 "    Tùy chọn:\n"
-"        -L\tép buộc cho phép liên kết tượng trưng\n"
+"        -L\tbuộc theo liên kết tượng trưng\n"
 "        -P\tdùng cấu trúc thư mục vật lý mà không theo liên kết tượng trưng\n"
-"    \n"
-"        -e\tnếu tùy chọn -P được áp dụng, và thư mục làm việc hiện hành\n"
-"    \tkhông thể được phân giải được, thoát ra với trạng thái khác không\n"
-"    Mặc định là cho phép liên kết tượng trưng, như là tùy chọn `-L' đưa ra.\n"
+"        -e\tnếu có tùy chọn -P và không thể xác định thư mục làm việc\n"
+"          \thiện hành, thoát với trạng thái khác không\n"
+"\n"
+"    Mặc định là theo liên kết tượng trưng, như có tùy chọn `-L'.\n"
 "    \n"
 "    Trạng thái thoát:\n"
-"    Trả về 0 nếu thư mục được chuyển đổi, và nếu $PWD được đặt thành công "
-"khi\n"
-"    -P được sử dụng; không thì khác số không."
+"    Trả về 0 nếu thay đổi thư mục, và nếu $PWD được đặt thành công khi\n"
+"    -P được sử dụng; không thì khác không."
 
-#: builtins.c:420
+#: builtins.c:414
 msgid ""
 "Print the name of the current working directory.\n"
 "    \n"
@@ -2691,20 +2532,19 @@ msgid ""
 "    Returns 0 unless an invalid option is given or the current directory\n"
 "    cannot be read."
 msgstr ""
-"In ra tên của thư mục hoạt động hiện thời.\n"
+"In tên thư mục hiện thời.\n"
 "\n"
-"\tTùy chọn:\n"
-"\t\t-L\tin ra giá trị của $PWD nếu nó đặt tên\n"
-"\t\t\tcủa thư mục hoạt động hiện thời\n"
-"\t\t-P\tin ra thư mục vật lý, không có liên kết mềm\n"
+"    Tùy chọn:\n"
+"      -L\tin $PWD nếu nó chứa tên của thư mục hiện thời\n"
+"      -P\tin thư mục vật lý, không liên kết biểu tượng\n"
 "\n"
-"\t\tMặc định là « pwd » hoạt động như là « -L » được ghi rõ.\n"
+"    Mặc định \"pwd\" chạy như có \"-L\".\n"
 "\n"
-"\t\tTrạng thái thoát:\n"
-"\t\tTrả lại 0 nếu không đưa ra tùy chọn sai\n"
-"\t\tvà nếu đọc được thư mục hiện thời."
+"    Trạng thái thoát:\n"
+"    Trả lại 0 trừ khi đưa ra tùy chọn sai hoặc đọc được thư mục hiện\n"
+"    thời."
 
-#: builtins.c:437
+#: builtins.c:431
 msgid ""
 "Null command.\n"
 "    \n"
@@ -2715,24 +2555,24 @@ msgid ""
 msgstr ""
 "Câu lệnh vô giá trị.\n"
 "\n"
-"\tKhông có hiệu ứng: câu lệnh không làm gì.\n"
+"    Không có hiệu ứng: câu lệnh không làm gì.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tLúc nào cũng thành công."
+"    Trạng thái thoát:\n"
+"    Lúc nào cũng thành công."
 
-#: builtins.c:448
+#: builtins.c:442
 msgid ""
 "Return a successful result.\n"
 "    \n"
 "    Exit Status:\n"
 "    Always succeeds."
 msgstr ""
-"Trả lại một kết quả thành công.\n"
+"Trả lại kết quả thành công.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tLúc nào cũng thành công."
+"    Trạng thái thoát:\n"
+"    Lúc nào cũng thành công."
 
-#: builtins.c:457
+#: builtins.c:451
 msgid ""
 "Return an unsuccessful result.\n"
 "    \n"
@@ -2741,16 +2581,15 @@ msgid ""
 msgstr ""
 "Trả về kết quả không thành công.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tLúc nào cũng không thành công."
+"    Trạng thái thoát:\n"
+"    Lúc nào cũng không thành công."
 
-#: builtins.c:466
+#: builtins.c:460
 msgid ""
 "Execute a simple command or display information about commands.\n"
 "    \n"
 "    Runs COMMAND with ARGS suppressing  shell function lookup, or display\n"
-"    information about the specified COMMANDs.  Can be used to invoke "
-"commands\n"
+"    information about the specified COMMANDs.  Can be used to invoke commands\n"
 "    on disk when a function with the same name exists.\n"
 "    \n"
 "    Options:\n"
@@ -2762,23 +2601,23 @@ msgid ""
 "    Exit Status:\n"
 "    Returns exit status of COMMAND, or failure if COMMAND is not found."
 msgstr ""
-"Thực thi một câu lệnh đơn giản, hoặc hiển thị thông tin về các câu lệnh.\n"
+"Thực thi một lệnh đơn giản, hoặc hiển thị thông tin về lệnh.\n"
 "\n"
-"Chạy LỆNH với các ĐỐI_SỐ thu hồi chức năng dò tìm chức năng trình bao,\n"
-"hoạc hiển thị thông tin về các câu LỆNH được ghi rõ.\n"
-"Có thể được dùng để gọi câu lệnh trên đĩa khi đã có một chức năng cùng tên.\n"
+"    Chạy LỆNH với các ĐỐI-SỐ mà không thực hiện tra cứu hàm shell,\n"
+"    hoặc hiển thị thông tin về LỆNH. Có thể được dùng để gọi lệnh trên\n"
+"    đĩa khi đã có hàm cùng tên.\n"
 "\n"
-"Tùy chọn:\n"
-"\t-p\tdùng một giá trị mặc định cho ĐƯỜNG_DẪN\n"
-"\t\tmà chắc chắn sẽ tìm mọi tiện ích tiêu chuẩn\n"
-"\t-v\tin ra mô tả về câu LỆNH mà tương tự với dựng sẵn « type » (kiểu)\n"
-"\t-V\tin ra mô tả chi tiết hơn về mỗi câu LỆNH\n"
+"    Tùy chọn:\n"
+"      -p\tdùng giá trị mặc định cho ĐƯỜNG_DẪN\n"
+"        \tmà chắc chắn sẽ tìm mọi tiện ích chuẩn\n"
+"      -v\tin mô tả về LỆNH mà tương tự như lệnh dựng sẵn \"type\"\n"
+"      -V\tin mô tả chi tiết hơn của mỗi LỆNH\n"
 "\n"
-"Trạng thái thoát:\n"
-"Trả lại trạng thái thoát của câu LỆNH, hoặc bị lỗi nếu không tìm thấy câu "
-"LỆNH."
+"    Trạng thái thoát:\n"
+"    Trả lại trạng thái thoát của LỆNH, hoặc thất bại nếu không tìm\n"
+"    thấy LỆNH."
 
-#: builtins.c:485
+#: builtins.c:479
 msgid ""
 "Set variable values and attributes.\n"
 "    \n"
@@ -2808,58 +2647,57 @@ msgid ""
 "    Variables with the integer attribute have arithmetic evaluation (see\n"
 "    the `let' command) performed when the variable is assigned a value.\n"
 "    \n"
-"    When used in a function, `declare' makes NAMEs local, as with the "
-"`local'\n"
+"    When used in a function, `declare' makes NAMEs local, as with the `local'\n"
 "    command.  The `-g' option suppresses this behavior.\n"
 "    \n"
 "    Exit Status:\n"
 "    Returns success unless an invalid option is supplied or an error occurs."
 msgstr ""
-"Đặt các giá trị và thuộc tính của biến.\n"
+"Đặt giá trị và thuộc tính biến.\n"
 "\n"
-"\tKhai báo biến và gán cho nó một số thuộc tính. Nếu không đưa ra TÊN \n"
-"\tthì hiển thị các thuộc tính và giá trị của mọi giá trị.\n"
+"    Khai báo biến và gán cho thuộc tính cho nó. Nếu không đưa TÊN thì\n"
+"    hiển thị thuộc tính và giá trị của mọi biến.\n"
 "\n"
-"\tTùy chọn:\n"
-"\t\t-f\thạn chế hành động, hoặc hiển thị tên hàm và định nghĩa\n"
-"\t\t-F\thạn chế về trình bày để chỉ hiển thị tên mà thôi\n"
-"\t\t\t(và số thứ tự dòng và tập tin nguồn khi gỡ lỗi)\n"
-"\t\t-g\ttạo biến toàn cục khi sử dụng trong hàm của shell; nếu không\n"
-"\t\t\tthì bị bỏ qua\n"
-"\t\t-p\thiển thị các thuộc tính và giá trị của mỗi TÊN\n"
-"\n"
-"\tTùy chọn dùng để đặt thuộc tính:\n"
-"\t\t-a\ttạo TÊN là mảng chỉ số (nếu được hỗ trợ)\n"
-"\t\t-A\ttạo TÊN là mảng kết hợp (nếu được hỗ trợ)\n"
-"\t\t-i\ttạo TÊN có thuộc tính `integer' (số nguyên)\n"
-"\t\t-l\tchuyển đổi TÊN sang chữ thường khi được gán\n"
-"\t\t-r\tđặt TÊN là chỉ đọc\n"
-"\t\t-t\tđặt TÊN có thuộc tính `trace' (theo vết)\n"
-"\t\t-u\tchuyển đổi TÊN sang chữ HOA khi được gán\n"
-"\t\t-x\tđặt TÊN xuất\n"
-"\n"
-"\tDùng `+' thay cho `-' thì tắt thuộc tính đưa ra.\n"
-"\n"
-"\tBiến có thuộc tính số nguyên thì định giá theo số học\n"
-"\t\t(xem câu lệnh `let') khi biến có giá trị được gán.\n"
-"\n"
-"\tKhi dùng trong hàm, `declare' (tuyên bố) đặt TÊN là cục bộ,\n"
-"\t\tnhư khi dùng câu lệnh `local' (cục bộ). Tùy chọn -g sẽ làm mất hiệu lực\n"
+"    Tùy chọn:\n"
+"      -f\thạn chế hành động hoặc hiển thị chỉ tên hàm và định nghĩa\n"
+"      -F\thạn chế hiển thị chỉ tên hàm mà thôi\n"
+"        \t(và số thứ tự dòng và tập tin nguồn khi gỡ lỗi)\n"
+"      -g\ttạo biến toàn cục khi sử dụng trong hàm shell; nếu không\n"
+"        \tthì bị bỏ qua\n"
+"      -p\thiển thị thuộc tính và giá trị của mỗi TÊN\n"
+"\n"
+"    Tùy chọn dùng để đặt thuộc tính:\n"
+"      -a\ttạo mảng chỉ số tên TÊN (nếu hỗ trợ)\n"
+"      -A\ttạo mảng kết hợp tên TÊN (nếu hỗ trợ)\n"
+"      -i\tđặt thuộc tính `integer' (số nguyên) cho TÊN\n"
+"      -l\tchuyển đổi TÊN sang chữ thường khi gán\n"
+"      -r\tđặt TÊN là chỉ đọc\n"
+"      -t\tđặt thuộc tính `trace' cho TÊN\n"
+"      -u\tchuyển đổi TÊN sang chữ hoa khi gán\n"
+"      -x\txuất khẩu TÊN\n"
+"\n"
+"    Dùng `+' thay cho `-' để tắt thuộc tính đưa ra.\n"
+"\n"
+"    Biến có thuộc tính số nguyên thì định giá theo số học (xem lệnh\n"
+"    `let') khi biến được gán.\n"
+"\n"
+"    Khi dùng trong hàm, `declare' đặt TÊN là cục bộ, như khi dùng lệnh\n"
+"    `local' (cục bộ). Tùy chọn -g ngăn hành vi này.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công trừ phi đưa ra tùy chọn sai hoặc gặp lỗi."
+"    Trạng thái thoát:\n"
+"    Trả lại thành công trừ khi đưa ra tùy chọn sai hoặc gặp lỗi."
 
-#: builtins.c:523
+#: builtins.c:517
 msgid ""
 "Set variable values and attributes.\n"
 "    \n"
 "    Obsolete.  See `help declare'."
 msgstr ""
-"Đặt các giá trị và thuộc tính của biến.\n"
+"Đặt giá trị và thuộc tính của biến.\n"
 "\n"
-"\tQuá cũ. Xem « help declare »."
+"    Lỗi thời. Xem \"help declare\"."
 
-#: builtins.c:531
+#: builtins.c:525
 msgid ""
 "Define local variables.\n"
 "    \n"
@@ -2873,27 +2711,23 @@ msgid ""
 "    Returns success unless an invalid option is supplied, an error occurs,\n"
 "    or the shell is not executing a function."
 msgstr ""
-"Xác định các biến cục bộ.\n"
+"Định nghĩa biến cục bộ.\n"
 "\n"
-"\tTạo một biến cục bộ tên TÊN, và gán cho nó GIÁ_TRỊ.\n"
-"\tTÙY_CHỌN có thể là bất cứ tùy chọn nào được « declare » chấp nhận.\n"
+"    Tạo biến cục bộ tên TÊN và gán GIÁ-TRỊ cho nó. TÙY_CHỌN có thể là\n"
+"    bất cứ tùy chọn nào \"declare\" chấp nhận.\n"
 "\n"
-"\tBiến cục bộ chỉ dùng được bên trong chức năng;\n"
-"\t\tchỉ chức năng trong đó nó được xác định\n"
-"\t\t(và các chức năng con) có khả năng phát hiện nó.\n"
+"    Biến cục bộ chỉ dùng được bên trong hàm, chỉ truy cập được từ hàm\n"
+"    mà biến được định nghĩa và các hàm con.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công nếu không đưa ra tùy chọn sai hay gặp lỗi,\n"
-"\tvà nếu trình bao đang chạy chức năng."
+"    Trạng thái thoát:\n"
+"    Trả lại thành công trừ khi đưa ra tùy chọn sai hay gặp lỗi,\n"
+"    hoặc nếu shell không chạy hàm."
 
-#: builtins.c:548
-#, fuzzy
+#: builtins.c:542
 msgid ""
 "Write arguments to the standard output.\n"
 "    \n"
-"    Display the ARGs, separated by a single space character and followed by "
-"a\n"
-"    newline, on the standard output.\n"
+"    Display the ARGs on the standard output followed by a newline.\n"
 "    \n"
 "    Options:\n"
 "      -n\tdo not append a newline\n"
@@ -2905,7 +2739,6 @@ msgid ""
 "      \\b\tbackspace\n"
 "      \\c\tsuppress further output\n"
 "      \\e\tescape character\n"
-"      \\E\tescape character\n"
 "      \\f\tform feed\n"
 "      \\n\tnew line\n"
 "      \\r\tcarriage return\n"
@@ -2920,34 +2753,30 @@ msgid ""
 "    Exit Status:\n"
 "    Returns success unless a write error occurs."
 msgstr ""
-"Ghi các đối số vào đầu ra tiêu chuẩn.\n"
-"\n"
-"\tHiển thị các ĐỐI_SỐ trên đầu ra tiêu chuẩn,\n"
-"\t\tvới một ký tự dòng mới theo sau.\n"
-"\n"
-"\tTùy chọn:\n"
-"\t\t-n\tđừng phụ thêm ký tự dòng mới\n"
-"\t\t-e\tbật đọc ký tự thoát kiểu gạch chéo ngược mà theo sau\n"
-"\t\t-E\tthu hồi dứt khoát đọc ký tự thoát kiểu gạch chéo ngược\n"
-"\n"
-"\t« echo » đọc những ký tự thoát này kiểu gạch chéo ngược:\n"
-"\t\t\\a\tchuông báo\n"
-"\t\t\\b\txoá lùi\n"
-"\t\t\\c\tthu hồi kết xuất thêm nữa\n"
-"\t\t\\e\tký tự thoát\n"
-"\t\t\\f\tnạp giấy\n"
-"\t\t\\n\tdòng mới\n"
-"\t\t\\r\txuống dòng\n"
-"\t\t\\0nnn\tký tự có mã ASCII NNN (1-3 chữ số bát phân)\n"
-"\t\t\\xHH\tký tự 8-bit có giá trị HH (1-2 chữ số thập lục)\n"
-"\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công nếu không gặp lỗi ghi.\t\t\\t\tkhoảng tab theo chiều "
-"ngang\n"
-"\t\t\\v\tkhoảng tab theo chiều dọc\n"
-"\t\t\\\\\tgạch chéo ngược"
-
-#: builtins.c:584
+"Ghi đối số vào đầu ra chuẩn.\n"
+"\n"
+"    Hiển thị ĐỐI-SỐ trên đầu ra chuẩn, kèm ký tự xuống hàng ở cuối.\n"
+"\n"
+"    Tùy chọn:\n"
+"      -n\tđừng thêm ký tự xuống hàng\n"
+"      -e\tbật diễn dịch ký tự thoát theo sau ký tự '\\'\n"
+"      -E\tchặn diễn dịch ký tự thoát\n"
+"\n"
+"    \"echo\" hiểu những ký tự thoát sau:\n"
+"      \\a\tchuông báo\n"
+"      \\b\txoá lùi\n"
+"      \\c\tchặn kết xuất tiếp\n"
+"      \\e\tký tự thoát\n"
+"      \\f\tnạp giấy\n"
+"      \\n\tdòng mới\n"
+"      \\r\txuống dòng\n"
+"      \\0nnn\tký tự có mã ASCII NNN (1-3 chữ số bát phân)\n"
+"      \\xHH\tký tự 8-bit có giá trị HH (1-2 chữ số thập lục phân)\n"
+"\n"
+"    Trạng thái thoát:\n"
+"    Trả lại thành công nếu không gặp lỗi ghi."
+
+#: builtins.c:576
 msgid ""
 "Write arguments to the standard output.\n"
 "    \n"
@@ -2959,17 +2788,17 @@ msgid ""
 "    Exit Status:\n"
 "    Returns success unless a write error occurs."
 msgstr ""
-"Ghi các đối số vào đầu ra tiêu chuẩn\n"
+"Ghi đối số vào đầu ra chuẩn.\n"
 "\n"
-"\tHiển thị các ĐỐI_SỐ trên đầu ra tiêu chuẩn với một dòng mới theo sau.\n"
+"    Hiển thị ĐỐI-SỐ trên đầu ra chuẩn, kèm ký tự xuống hàng ở cuối.\n"
 "\n"
-"\tTùy chọn:\n"
-"\t\t-n\tđừng phụ thêm một dòng mới\n"
+"    Tùy chọn:\n"
+"      -n\tđừng thêm ký tự xuống hàng\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công nếu không gặp lỗi ghi."
+"    Trạng thái thoát:\n"
+"    Trả lại thành công nếu không gặp lỗi ghi."
 
-#: builtins.c:599
+#: builtins.c:591
 msgid ""
 "Enable and disable shell builtins.\n"
 "    \n"
@@ -2995,54 +2824,49 @@ msgid ""
 "    Exit Status:\n"
 "    Returns success unless NAME is not a shell builtin or an error occurs."
 msgstr ""
-"Bật/tắt dựng sẵn trình bao.\n"
-"\b\tBật và tắt các dựng sẵn trình bao.\b\tChức năng tắt thì cho phép bạn "
-"thực thi một câu lệnh đĩa\n"
-"\tmà cùng tên với một dựng sẵn trình bao,\n"
-"\tkhông cần dùng tên đường dẫn đầy đủ.\n"
+"Bật và tắt lệnh shell dựng sẵn.\n"
 "\n"
-"\tTùy chọn:\n"
-"\t\t-a\tin ra một danh sách các dựng sẳn, cũng hiển thị trạng thái bật/tắt\n"
-"\t\t-b\ttắt mỗi TÊN hoặc hiển thị danh sách các dựng sẵn bị tắt\n"
-"\t\t-p\tin ra danh sách các dựng sẵn theo một định dạng có thể dùng lại "
-"được\n"
-"\t\t-s\tin ra chỉ tên mỗi dựng sẵn Posix « đặc biệt »\n"
+"    Bật và tắt các lệnh shell dựng sẵn. Chức năng tắt cho phép bạn\n"
+"    chạy một lệnh trên đĩa cùng tên với một lệnh shell dựng sẵn mà\n"
+"    không cần dùng tên đường dẫn đầy đủ.\n"
 "\n"
-"\tTùy chọn điều khiển chức năng nạp động:\n"
-"\t\t-f\tnạp dựng sẵn TÊN từ điều khiển dùng chung TÊN_TẬP_TIN\n"
-"\t\t-d\tgỡ bỏ một dựng sẵn được nạp dùng « -f »\n"
+"    Tùy chọn:\n"
+"      -a    in danh sách các lệnh dựng sẵn kèm trạng thái bật/tắt\n"
+"      -n    tắt TÊN hoặc hiển thị danh sách lệnh bị tắt\n"
+"      -p    in danh sách lệnh dựng sẵn theo định dạng dùng lại được\n"
+"      -s    chỉ in tên các lệnh dựng sẵn Posix `đặc biệt'\n"
 "\n"
-"\tKhông có tùy chọn thì mỗi TÊN được bật lại.\n"
+"    Tùy chọn điều khiển chức năng nạp động:\n"
+"      -f    nạp lệnh dựng sẵn TÊN từ tập tin TẬP-TIN\n"
+"      -d    bỏ một dựng sẵn được nạp bằng `-f'\n"
 "\n"
-"\tĐể sử dụng « test » (hàm thử) nằm trên đường dẫn mặc định $PATH\n"
-"\tthay cho phiên bản của dựng sẵn trình bao,\n"
-"\thãy gõ chuỗi « enable -n test ».\n"
+"    Không có tùy chọn thì coi như bật TÊN.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công nếu TÊN là một dựng sẵn trình bao, và không gặp lỗi."
+"    Để sử dụng lệnh `test' trên đĩa (nếu tìm thấy trong $PATH) thay\n"
+"    cho phiên bản shell dựng sẵn, gõ `enable -n test'.\n"
+"\n"
+"    Trạng thái thoát:\n"
+"    Trả lại thành công trừ khi TÊN không phải lệnh dựng sẵn hoặc gặp lỗi."
 
-#: builtins.c:627
+#: builtins.c:619
 msgid ""
 "Execute arguments as a shell command.\n"
 "    \n"
-"    Combine ARGs into a single string, use the result as input to the "
-"shell,\n"
+"    Combine ARGs into a single string, use the result as input to the shell,\n"
 "    and execute the resulting commands.\n"
 "    \n"
 "    Exit Status:\n"
 "    Returns exit status of command or success if command is null."
 msgstr ""
-"Thực thi các đối số dưới dạng một câu lệnh trình bao.\n"
+"Dùng các đối số để chạy lệnh shell.\n"
 "\n"
-"\tPhối hợp các ĐỐI_SỐ thành một chuỗi riêng lẻ,\n"
-"\tdùng kết quả làm dữ liệu nhập vào trình bao,\n"
-"\tvà thực thi các câu lệnh kết quả.\n"
+"    Gộp các ĐỐI-SỐ thành một chuỗi đơn, dùng kết quả làm đầu vào cho\n"
+"    shell và chạy lệnh đó.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại trạng thái thoát của câu lệnh,\n"
-"\thay thành công nếu câu lệnh vô giá trị."
+"    Trạng thái thoát:\n"
+"    Trả lại trạng thái thoát của câu lệnh hay thành công nếu lệnh rỗng."
 
-#: builtins.c:639
+#: builtins.c:631
 msgid ""
 "Parse option arguments.\n"
 "    \n"
@@ -3082,59 +2906,48 @@ msgid ""
 "    Returns success if an option is found; fails if the end of options is\n"
 "    encountered or an error occurs."
 msgstr ""
-"Phân tích cú pháp của đối số tùy chọn.\n"
-"\n"
-"\tGetopts được thủ tục trình bao dùng để phân tích cú pháp\n"
-"\t\tcủa tham số thuộc ví trị dưới dạng tùy chọn.\n"
-"\n"
-"\tOPTSTRING chứa những chữ tùy chọn cần nhận ra;\n"
-"\tmột chữ có dấu hai chấm theo sau thì tùy chọn mong đợi một đối số,\n"
-"\tmà nên định giới bằng khoảng trắng.\n"
-"\n"
-"\tMỗi lần được gọi, getopts sẽ đặt tùy chọn kế tiếp\n"
-"\t\tvào biến trình bao $name\n"
-"\t\t(cũng khởi tạo tên đó nếu nó chưa tồn tại)\n"
-"\t\tvà đặt chỉ mục của đối số kế tiếp cần xử lý\n"
-"\t\tvào biến trình bao OPTIND.\n"
-"\tOPTIND được sơ khởi thành 1 mỗi lần trình bao\n"
-"\thay một văn lệnh trình bao được gọi.\n"
-"\tKhi một tùy chọn đòi hỏi một đối số,\n"
-"\tgetopts đặt đối số đó vào biến trình bao OPTARG.\n"
-"\n"
-"\tgetopts thông báo lỗi bằng một của hai cách.\n"
-"\tNếu ký tự đầu tiên của chuỗi OPTSTRING là dấu hai chấm,\n"
-"\tgetopts dùng chức năng thông báo lỗi một cách im.\n"
-"\tBằng chế độ này, không in ra thông điệp lỗi nào.\n"
-"\tNếu gặp tùy chọn sai thì getopts đặt vào OPTARG\n"
-"\tký tự tùy chọn được tìm. Không tìm thấy đối số cần thiết\n"
-"\tthì getopts đặt một dấu hai chấm vào TÊN\n"
-"\tvà đặt OPTARG thành ký tự tùy chọn được tìm.\n"
-"\tNếu getopts không phải ở chế độ im, và gặp tùy chọn sai,\n"
-"\tthì getopts đặt một dấu hỏi « ? » vào TÊN và bỏ đặt OPTARG.\n"
-"\tKhông tìm thấy tùy chọn cần thiết thì « ? » được đặt vào TÊN,\n"
-"\tOPTARG bị bỏ đặt, và in ra một thông điệp chẩn đoán.\n"
-"\n"
-"\tNếu biến trình bao OPTERR có giá trị 0,\n"
-"\tthì getopts tắt chức năng in ra thông điệp,\n"
-"\tthậm chí nếu ký tự đầu tiên của chuỗi OPTSTRING\n"
-"\tkhông phải là dấu hai chấm. OPTERR có giá trị 1 theo mặc định.\n"
-"\n"
-"Getopts bình thường phân tích cách tham số thuộc vị trí ($0 - $9),\n"
-"\tnhưng nếu đưa ra đối số bổ sung,\n"
-"\t(các) đối số này được phân tích để thay thế.\n"
-"\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công nếu tìm thấy một tùy chọn;\n"
-"\tkhông thành công nếu gặp kết thúc các tùy chọn,\n"
-"\thoặc nếu gặp lỗi."
-
-#: builtins.c:681
+"Phân tích đối số tùy chọn.\n"
+"\n"
+"    Getopts được shell dùng để phân tích tham số thành tuỳ chọn.\n"
+"\n"
+"    CHUỖI-TUỲ-CHỌN chứa những chữ tùy chọn cần nhận ra; một chữ có dấu hai\n"
+"    chấm theo sau thì tùy chọn cần đối số, cách tuỳ chọn bằng khoảng\n"
+"    trắng.\n"
+"\n"
+"    Mỗi lần gọi, getopts sẽ đặt tùy chọn kế tiếp vào biến shell $TÊN,\n"
+"    tạo biến mới nếu tên đó chưa tồn tại, và đặt chỉ mục của đối số kế\n"
+"    tiếp cần xử lý vào biến shell OPTIND. OPTIND được khởi động bằng 1\n"
+"    mỗi lần shell hay một văn lệnh shell được gọi. Khi tùy chọn cần\n"
+"    đối số, getopts đặt đối số đó vào biến shell OPTARG.\n"
+"\n"
+"    getopts thông báo lỗi bằng một trong hai cách. Nếu ký tự đầu tiên\n"
+"    của CHUỖI-TUỲ-CHỌN là dấu hai chấm, getopts thông báo lỗi im\n"
+"    lặng. Chế độ này không in ra thông báo nào. Nếu gặp tùy chọn sai\n"
+"    thì getopts lưu mã ký tự tuỳ chọn trong biến OPTARG. Không tìm\n"
+"    thấy đối số cần thiết thì getopts lưu dấu hai chấm trong biến $TÊN\n"
+"    và đặt lưu mã ký tự tuỳ chọn trong OPTARG. Nếu getopts không trong\n"
+"    chế độ im lặng và gặp tùy chọn sai, getopts lưu dấu hỏi `?'  vào\n"
+"    biến $TÊN và xoá OPTARG. Không tìm thấy tùy chọn cần thiết thì `?'\n"
+"    được lưu vào $TÊN, OPTARG bị xlá, và in ra một thông điệp chẩn\n"
+"    đoán.\n"
+"\n"
+"    Nếu biến shell OPTERR có giá trị 0, getopts sẽ không in thông báo\n"
+"    kể cả khi ký tự đầu tiên của CHUỖI-TUỲ-CHỌN không phải dấu hai\n"
+"    chấm. OPTERR có giá trị mặc định là 1.\n"
+"\n"
+"    Getopts bình thường phân tích tham số vị trí ($0 - $9). Tuy nhiên,\n"
+"    các đối số bổ sung cũng được phân tích.\n"
+"\n"
+"    Trạng thái thoát:\n"
+"    Trả lại thành công nếu tìm thấy một tùy chọn; không thành công nếu\n"
+"    gặp kết thúc các tùy chọn, hoặc nếu gặp lỗi."
+
+#: builtins.c:673
 msgid ""
 "Replace the shell with the given command.\n"
 "    \n"
 "    Execute COMMAND, replacing this shell with the specified program.\n"
-"    ARGUMENTS become the arguments to COMMAND.  If COMMAND is not "
-"specified,\n"
+"    ARGUMENTS become the arguments to COMMAND.  If COMMAND is not specified,\n"
 "    any redirections take effect in the current shell.\n"
 "    \n"
 "    Options:\n"
@@ -3142,72 +2955,64 @@ msgid ""
 "      -c\t\texecute COMMAND with an empty environment\n"
 "      -l\t\tplace a dash in the zeroth argument to COMMAND\n"
 "    \n"
-"    If the command cannot be executed, a non-interactive shell exits, "
-"unless\n"
+"    If the command cannot be executed, a non-interactive shell exits, unless\n"
 "    the shell option `execfail' is set.\n"
 "    \n"
 "    Exit Status:\n"
-"    Returns success unless COMMAND is not found or a redirection error "
-"occurs."
+"    Returns success unless COMMAND is not found or a redirection error occurs."
 msgstr ""
-"Thay thế trình bao bằng câu lệnh đưa ra.\n"
+"Thay thế shell bằng câu lệnh đưa ra.\n"
 "\n"
-"\tThực thi câu LỆNH, cũng thay thế trình bao này bằng chương trình được ghi "
-"rõ.\n"
-"\tCác ĐỐI_SỐ trở thành các đối số đối với câu LỆNH.\n"
-"\tKhông đưa ra câu LỆNH thì bất cứ việc chuyển hướng nào\n"
-"\tsẽ xảy ra trong trình bao đang chạy.\n"
+"    Thực thi LỆNH, thay thế shell này bằng chương trình được chạy.\n"
+"    ĐỐI-SỐ là đối số của LỆNH. Không xác định LỆNH thì bất cứ chuyển\n"
+"    hướng nào sẽ xảy ra trong shell đang chạy.\n"
 "\n"
-"\tTùy chọn:\n"
-"\t\t-a tên\tgửi TÊN cho câu LỆNH dưới dạng đối số thứ không\n"
-"\t\t-c\tthực thi câu LỆNH với một môi trường trống\n"
-"\t\t-l\tđặt một dấu gạch vào đối số thứ không đối với câu LỆNH\n"
+"    Tùy chọn:\n"
+"      -a TÊN\ttruyền TÊN cho LỆNH dạng đối số thứ không\n"
+"      -c\tthực thi LỆNH với một môi trường rỗng\n"
+"      -l\tđặt một dấu gạch vào đối số thứ không của LỆNH\n"
 "\n"
-"\tNếu câu LỆNH không thể thực thi được, một trình bao không tương tác\n"
-"\tsẽ thoát ra, nếu không đặt tùy chọn trình bao « execfail ».\n"
+"    Nếu LỆNH không thể thực thi, shell không tương tác sẽ thoát, trừ\n"
+"    khi đặt tùy chọn shell `execfail'.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công nếu tìm được câu LỆNH và không gặp lỗi chuyển hướng."
+"    Trạng thái thoát:\n"
+"    Trả lại thành công trừ khi không tìm được LỆNH hoặc gặp lỗi chuyển hướng."
 
-#: builtins.c:702
+#: builtins.c:694
 msgid ""
 "Exit the shell.\n"
 "    \n"
 "    Exits the shell with a status of N.  If N is omitted, the exit status\n"
 "    is that of the last command executed."
 msgstr ""
-"Thoát khỏi trình bao.\n"
+"Thoát shell.\n"
 "\n"
-"\tThoát khỏi trình bao với trạng thái N.\n"
-"\tKhông đưa ra N thì trạng thái thoát\n"
-"\tlà trạng thái của câu lệnh cuối cùng được chạy."
+"    Thoát khỏi shell với trạng thái N. Không xác định N thì trạng thái\n"
+"    thoát là trạng thái của lệnh cuối cùng được chạy."
 
-#: builtins.c:711
+#: builtins.c:703
 msgid ""
 "Exit a login shell.\n"
 "    \n"
-"    Exits a login shell with exit status N.  Returns an error if not "
-"executed\n"
+"    Exits a login shell with exit status N.  Returns an error if not executed\n"
 "    in a login shell."
 msgstr ""
-"Thoát khỏi một trình bao đăng nhập.\n"
+"Thoát shell đăng nhập.\n"
 "\n"
-"\tThoát khỏi một trình bao đăng nhập, với trạng thái thoát N.\n"
-"\tTrả lại lỗi nếu không được thực thi trong trình bao đăng nhập."
+"   Thoát khỏi shell đăng nhập với trạng thái N. Trả về lỗi nếu không\n"
+"   phải shell đăng nhập."
 
-#: builtins.c:721
+#: builtins.c:713
 msgid ""
 "Display or execute commands from the history list.\n"
 "    \n"
-"    fc is used to list or edit and re-execute commands from the history "
-"list.\n"
+"    fc is used to list or edit and re-execute commands from the history list.\n"
 "    FIRST and LAST can be numbers specifying the range, or FIRST can be a\n"
 "    string, which means the most recent command beginning with that\n"
 "    string.\n"
 "    \n"
 "    Options:\n"
-"      -e ENAME\tselect which editor to use.  Default is FCEDIT, then "
-"EDITOR,\n"
+"      -e ENAME\tselect which editor to use.  Default is FCEDIT, then EDITOR,\n"
 "    \t\tthen vi\n"
 "      -l \tlist lines instead of editing\n"
 "      -n\tomit line numbers when listing\n"
@@ -3221,36 +3026,32 @@ msgid ""
 "    the last command.\n"
 "    \n"
 "    Exit Status:\n"
-"    Returns success or status of executed command; non-zero if an error "
-"occurs."
+"    Returns success or status of executed command; non-zero if an error occurs."
 msgstr ""
-"Hiển thị hoặc thực thi các câu lệnh từ danh sách lược sử.\n"
-"\n"
-"\tfc được dùng để liệt kê hoặc chỉnh sửa và thực thi lại\n"
-"\tcâu lệnh từ danh sách lược sử.\n"
-"\tĐẦU và CUỐI có thể là số mà xác định phạm vi,\n"
-"hoặc ĐẦU có thể là một chuỗi đại diện câu lệnh\n"
-"\tvừa chạy nhất mà bắt đầu với chuỗi đó.\n"
-"\tTùy chọn:\n"
-"\t\t-e ENAME\tchọn trình soạn thảo nào cần dùng;\n"
-"\t\t\tmặc định là FCEDIT, sau đó EDITOR, sau đó vi\n"
-"\t\t-l\tliệt kê các dòng thay vào chỉnh sửa\n"
-"\t\t-n\tliệt kê mà không in ra số thứ tự dòng\n"
-"\t\t-r\tđảo ngược thứ tự các dòng (mới nhất trước)\n"
-"\n"
-"\tTùy theo định dạng « fc -s [mẫu=lần_lập_lại ...] [lệnh] »,\n"
-"\tcâu LỆNH được chạy lại sau khi thay thế CŨ bằng MỚI.\n"
-"\n"
-"\tCũng có thể sử dụng bí danh có ích « r='fc -s' »,\n"
-"\tvì thế việc gõ « r cc » sẽ chạy câu lệnh cuối cùng\n"
-"\tmà bắt đầu với « cc », và việc gõ « r »\n"
-"\tsẽ đơn giản chạy lại câu lệnh cuối cùng.\n"
-"\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công hay trạng thái của câu lệnh được thực thi;\n"
-"\t\tgặp lỗi thì khác số không."
-
-#: builtins.c:751
+"Hiển thị hoặc thực thi lệnh từ lược sử.\n"
+"\n"
+"    fc được dùng để liệt kê, chỉnh sửa và thực thi lại lệnh từ danh\n"
+"    sách lược sử. ĐẦU và CUỐI có thể là số xác định phạm vi, hoặc ĐẦU\n"
+"    có thể là chuỗi chứa phần đầu lệnh chạy gần đây nhất.\n"
+"\n"
+"    Tùy chọn:\n"
+"      -e ENAME\tchọn trình soạn thảo nào cần dùng.\n"
+"        \tMặc định là FCEDIT, rồi EDITOR, rồi vi\n"
+"      -l\tliệt kê thay vì chỉnh sửa\n"
+"      -n\tliệt kê không in số thứ tự dòng\n"
+"      -r\tđảo ngược thứ tự các dòng (mới nhất trước)\n"
+"\n"
+"    Định dạng `fc -s [mẫu=lần_lập_lại ...] [lệnh]' được dùng để chạy\n"
+"    lại lệnh sau khi thay thế CŨ=MỚI.\n"
+"\n"
+"    Một bí danh hữu ích là r='fc -s' để có thể gõ `r cc' để chạy lệnh\n"
+"    cuối cùng bắt đầu bằng `cc' và gõ `r' để chạy lại lệnh cuối.\n"
+"\n"
+"    Trạng thái thoát:\n"
+"    Trả lại thành công hay trạng thái của câu lệnh được thực thi; gặp\n"
+"    lỗi thì khác số không."
+
+#: builtins.c:743
 msgid ""
 "Move job to the foreground.\n"
 "    \n"
@@ -3261,48 +3062,43 @@ msgid ""
 "    Exit Status:\n"
 "    Status of command placed in foreground, or failure if an error occurs."
 msgstr ""
-"Nâng công việc lên trước.\n"
+"Nâng công việc nền lên trước.\n"
 "\n"
-"\tNâng lên trước công việc được ĐẶC_TẢ_CÔNG_VIỆC đại diện,\n"
-"\tthì làm cho nó là công việc hiện thời.\n"
-"\tKhông đưa ra ĐẶC_TẢ_CÔNG_VIỆC\n"
-"\tthì dùng công việc hiện thời tùy theo trình bao.\n"
+"    Nâng lên trước công việc được xác định bởi đặc tả công việc ĐTCV\n"
+"    làm công việc hiện thời. Không có ĐTCV thì dùng công việc hiện\n"
+"    thời của shell.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrạng thái của câu lệnh được nâng lên trước;\n"
-"\tgặp lỗi thì không thành công."
+"    Trạng thái thoát:\n"
+"    Trạng thái của câu lệnh được nâng lên trước; hoặc thất bại nếu xảy\n"
+"    ra lỗi."
 
-#: builtins.c:766
+#: builtins.c:758
 msgid ""
 "Move jobs to the background.\n"
 "    \n"
-"    Place the jobs identified by each JOB_SPEC in the background, as if "
-"they\n"
-"    had been started with `&'.  If JOB_SPEC is not present, the shell's "
-"notion\n"
+"    Place the jobs identified by each JOB_SPEC in the background, as if they\n"
+"    had been started with `&'.  If JOB_SPEC is not present, the shell's notion\n"
 "    of the current job is used.\n"
 "    \n"
 "    Exit Status:\n"
 "    Returns success unless job control is not enabled or an error occurs."
 msgstr ""
-"Gửi công việc ra sau.\n"
+"Chuyển công việc xuống chạy nền.\n"
 "\n"
-"\tGửi ra sau các công việc được mỗi ĐẶC_TẢ_CÔNG_VIỆC đại diện,\n"
-"\tnhư là công việc được bắt đầu với « & ».\n"
-"\tKhông đưa ra ĐẶC_TẢ_CÔNG_VIỆC\n"
-"\tthì dùng công việc hiện thời tùy theo trình bao.\n"
+"    Chuyển công việc xác định theo đặc tả công việc ĐTCV sang chạy\n"
+"    nền, như thể lệnh được chạy với `&'. Nếu không có ĐTCV, dùng công\n"
+"    việc hiện thời của shell.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công nếu chức năng điều khiển công việc được bật\n"
-"\tvà không gặp lỗi."
+"    Trạng thái thoát:\n"
+"    Trả lại thành công nếu chức năng điều khiển công việc được bật và\n"
+"    không gặp lỗi."
 
-#: builtins.c:780
+#: builtins.c:772
 msgid ""
 "Remember or display program locations.\n"
 "    \n"
 "    Determine and remember the full pathname of each command NAME.  If\n"
-"    no arguments are given, information about remembered commands is "
-"displayed.\n"
+"    no arguments are given, information about remembered commands is displayed.\n"
 "    \n"
 "    Options:\n"
 "      -d\t\tforget the remembered location of each NAME\n"
@@ -3319,28 +3115,29 @@ msgid ""
 "    Exit Status:\n"
 "    Returns success unless NAME is not found or an invalid option is given."
 msgstr ""
-"Nhớ hoặc hiển thị vị trí của chương trình.\n"
+"Nhớ hoặc hiển thị vị trí chương trình.\n"
 "\n"
-"\tXác định và ghi nhớ tên đường dẫn đầy đủ của mỗi TÊN câu lệnh.\n"
-"\tNếu không đưa ra đối số, hiển thị thông tin về các câu lệnh được ghi nhớ.\n"
+"    Xác định và ghi nhớ tên đường dẫn đầy đủ của mỗi TÊN câu lệnh.\n"
+"    Nếu không đưa ra đối số, hiển thị thông tin về các câu lệnh được\n"
+"    ghi nhớ.\n"
 "\n"
-"\tTùy chọn:\n"
-"\t\t-d\tquên vị trí được ghi nhớ của mỗi TÊN\n"
-"\t\t-l\thiển thị theo một định dạng có thể được dùng lại\n"
-"\t\t\tdưới dạng dữ liệu nhập vào\n"
-"\t\t-p tên_đường_dẫn\tdùng TÊN_ĐƯỜNG_DẪN là tên đường dẫn đầy đủ của TÊN\n"
-"\t\t-r\tquên mọi vị trí được ghi nhớ\n"
-"\t\t-t\tin ra vị trí được ghi nhớ của mỗi TÊN,\n"
-"\t\t\tcó nhiều TÊN thì cũng in ra TÊN tương ứng ở trước vị trí\n"
-"\n"
-"\tĐối số:\n"
-"\t\tTÊN\tmỗi TÊN được tìm theo đường dẫn mặc định $PATH,\n"
-"\t\tvà được thêm vào danh sách các câu lệnh được ghi nhớ.\n"
+"    Tùy chọn:\n"
+"      -d\t\tquên vị trí đã nhớ của TÊN\n"
+"      -l\t\thiển thị theo định dạng dùng lại làm đầu\n"
+"        \t\tvào được\n"
+"      -p TÊN_ĐƯỜNG_DẪN\tdùng TÊN_ĐƯỜNG_DẪN là tên đường dẫn đầy đủ của TÊN\n"
+"      -r\t\tquên mọi vị trí đã nhớ\n"
+"      -t\t\tin vị trí đã nhớ của TÊN, in tên trước vị\n"
+"                        trí nếu TÊN tương ứng với nhiều vị trí\n"
+"\n"
+"    Đối số:\n"
+"      TÊN\t\tmỗi TÊN được tìm trong $PATH và được thêm vào\n"
+"        \t\tdanh sách các câu lệnh được ghi nhớ.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công nếu tìm được TÊN và không đưa ra tùy chọn sai."
+"    Trạng thái thoát:\n"
+"    Trả lại thành công nếu tìm được TÊN và không đưa ra tùy chọn sai."
 
-#: builtins.c:805
+#: builtins.c:797
 msgid ""
 "Display information about builtin commands.\n"
 "    \n"
@@ -3358,30 +3155,27 @@ msgid ""
 "      PATTERN\tPattern specifiying a help topic\n"
 "    \n"
 "    Exit Status:\n"
-"    Returns success unless PATTERN is not found or an invalid option is "
-"given."
+"    Returns success unless PATTERN is not found or an invalid option is given."
 msgstr ""
-"Hiển thị thông tin về các câu lệnh dựng sẵn.\n"
+"Hiển thị thông tin về lệnh dựng sẵn.\n"
 "\n"
-"\tHiển thị bản tóm tắt ngắn về các câu lệnh dựng sẵn.\n"
-"\tNếu cũng ghi rõ MẪU thì in ra trợ giúp chi tiết\n"
-"\tvề tất cả các câu lệnh tương ứng với mẫu đó ;\n"
-"\tkhông thì in ra danh sách các chủ đề trợ giúp.\n"
+"    Hiển thị bản tóm tắt ngắn về các câu lệnh dựng sẵn.  Nếu cũng ghi\n"
+"    rõ MẪU thì in ra trợ giúp chi tiết về tất cả các câu lệnh tương\n"
+"    ứng với mẫu đó ; không thì in ra danh sách các chủ đề trợ giúp.\n"
 "\n"
-"\rTùy chọn:\n"
-"\t\t-d\txuất mô tả ngắn về mỗi chủ đề\n"
-"\t\t-m\thiển thị cách sử dụng theo định dạng\n"
-"\t\t\tkiểu trang hướng dẫn (man)\n"
-"\t\t-s\txuất chỉ một bản tóm tắt ngắn về cách sử dụng\n"
-"\t\t\tcho mỗi chủ đề tương ứng với MẪU\n"
+"    Tùy chọn:\n"
+"      -d\txuất mô tả ngắn về mỗi chủ đề\n"
+"      -m\thiệnn cách dùng theo định dạng trang hướng dẫn (man)\n"
+"      -s\txuất chỉ một bản tóm tắt cách dìng cho mỗi\n"
+"        \tchủ đề tương ứng với MẪU\n"
 "\n"
-"\tĐối số :\n"
-"\t\tMẪU\tmẫu ghi rõ một chủ đề trợ giúp\n"
+"    Đối số:\n"
+"      MẪU\tmẫu các định một chủ đề trợ giúp\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công nếu tìm được MẪU và không đưa ra tùy chọn sai."
+"    Trạng thái thoát:\n"
+"    Trả lại thành công nếu tìm được MẪU và không đưa ra tùy chọn sai."
 
-#: builtins.c:829
+#: builtins.c:821
 msgid ""
 "Display or manipulate the history list.\n"
 "    \n"
@@ -3408,47 +3202,44 @@ msgid ""
 "    \n"
 "    If the $HISTTIMEFORMAT variable is set and not null, its value is used\n"
 "    as a format string for strftime(3) to print the time stamp associated\n"
-"    with each displayed history entry.  No time stamps are printed "
-"otherwise.\n"
+"    with each displayed history entry.  No time stamps are printed otherwise.\n"
 "    \n"
 "    Exit Status:\n"
 "    Returns success unless an invalid option is given or an error occurs."
 msgstr ""
-"Hiển thị hoặc thao tác danh sách lượd sử.\n"
+"Hiển thị hoặc thao tác danh sách lược sử.\n"
 "\n"
-"\tHiển thị danh sách lược sử với các số thứ tự dòng,\n"
-"\tcũng đặt dấu sao « * » vào trước mỗi mục nhập bị sửa đổi.\n"
-"\tĐối số N thì liệt kê chỉ N mục nhập cuối cùng.\n"
+"    Hiển thị danh sách lược sử kèm số dòng, `*' ở đầu dòng cho các mục\n"
+"    nhập bị sửa đổi. Đối số N thì liệt kê chỉ N mục nhập cuối cùng.\n"
 "\n"
-"\tTùy chọn:\n"
-"\t\t-c\txoá sạch danh sách lược sử bằng cách xoá mọi mục nhập\n"
-"\t\t-d hiệu\txoá mục nhập lược sử ở hiệu này\n"
+"    Tùy chọn:\n"
+"      -c\txoá sạch danh sách lược sử bằng cách xoá mọi mục nhập\n"
+"      -d offset\txoá mục nhập lược sử ở offset này\n"
 "\n"
-"\t\t-a\tphụ thêm vào tập tin lư ợc sử các dòng lược sử từ phiên chạy này\n"
-"\t\t-n\tđọc mọi dòng lược sử chưa đọc từ tập tin lược sử\n"
-"\t\t-r\tđọc tư lược sử và phụ thêm nội dung vào lược sử\n"
-"\t\t-w\tghi lược sử hiện thời vào tập tin lược sử\n"
-"\t\t\tcũng phụ thêm vào danh sách lược sử\n"
+"      -a\tnối đuôi lược sử từ phiên làm việc này vào tập tin\n"
+"        \tlược sử.\n"
+"      -n\tđọc mọi dòng lược sử chưa đọc từ tập tin lược sử\n"
+"      -r\tđọc tập tin lược sử và nối thêm vào danh sách lược sử\n"
+"      -w\tghi lược sử hiện thời vào tập tin lược sử,\n"
+"        \tvào nối đuôi vào danh sách lược sử\n"
 "\n"
-"\t\t-p\tmở rộng lược sử với mỗi ĐỐI_SỐ, và hiển thị kết quả\n"
-"\t\t\tmà không ghi nhớ nó vào danh sách lược sử\n"
-"\t\t-s\tphụ thêm các ĐỐI_SỐ vào danh sách lược sử\n"
-"\t\t\tdưới dạng một mục nhập riêng lẻ\n"
+"      -p\tbung lược sử với mỗi ĐỐI-SỐ và hiển thị kết quả\n"
+"        \tmà không lưu vào danh sách lược sử\n"
+"      -s\tnối đuôi ĐỐI-SỐ vào danh sách lược sử làm một mục đơn\n"
 "\n"
-"\tĐưa ra TÊN_TẬP_TIN thì nó được dùng làm tập tin lược sử.\n"
-"\tNếu không, và nếu $HISTFILE có giá trị, thì nó được dùng;\n"
-"\tnếu $HISTFILE không có giá trị thì dùng « ~/.bash_history ».\n"
+"    Nếu có TẬP-TIN thì nó được dùng làm tập tin lược sử. Ngược\n"
+"    lại, nếu $HISTFILE có giá trị thì dùng; nếu $HISTFILE không có giá\n"
+"    trị thì dùng `~/.bash_history'.\n"
 "\n"
-"\tNếu biến $HISTTIMEFORMAT đã được đặt và có giá trị,\n"
-"\tthì giá trị đó được dùng làm chuỗi định dạng\n"
-"\tcho strftime(3) in ra nhãn thời gian tương ứng\n"
-"\tvới mỗi mục nhập lược sử được hiển thị.\n"
-"\tKhông thì không in ra nhãn thời gian.\n"
+"    Nếu biến $HISTTIMEFORMAT đã được đặt và khác rỗng, giá trị đó được\n"
+"    dùng làm chuỗi định dạng cho strftime(3) để in nhãn thời gian\n"
+"    tương ứng với mỗi mục nhập lược sử được hiển thị. Ngược lại không\n"
+"    in nhãn thời gian.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công nếu không gặp tùy chọn sai hay gặp lỗi."
+"    Trạng thái thoát:\n"
+"    Trả lại thành công nếu không gặp tùy chọn sai hay gặp lỗi."
 
-#: builtins.c:865
+#: builtins.c:857
 msgid ""
 "Display status of jobs.\n"
 "    \n"
@@ -3473,26 +3264,25 @@ msgid ""
 msgstr ""
 "Hiển thị trạng thái của công việc.\n"
 "\n"
-"\tLiệt kê các công việc đang chạy.\n"
-"\tĐẶC_TẢ_CÔNG_VIỆC hạn chế kết xuất thành công việc đó.\n"
-"\tKhông đưa ra tùy chọn thì hiển thị trạng thái\n"
-"\tcủa mọi công việc đang chạy.\n"
+"    Liệt kê các công việc đang chạy. Đặc tả công việc ĐTCV hạn chế chỉ\n"
+"    hiện công việc đó thôi. Không có tùy chọn thì hiển thị trạng thái\n"
+"    của mọi công việc đang chạy.\n"
 "\n"
-"\tTùy chọn:\n"
-"\t\t-l\tliệt kê các mã số tiến trình, thêm vào thông tin bình thường\n"
-"\t\t-n\tliệt kê chỉ những tiến trình đã thay đổi trạng thái\n"
-"\t\t\tkể từ lần thông báo cuối cùng\n"
-"\t\t-s\thạn chế kết xuất thành những công việc bị dừng chạy\n"
+"    Tùy chọn:\n"
+"      -l\tliệt kê mã số tiến trình ngoài thông tin bình thường\n"
+"      -n\tliệt kê chỉ những tiến trình đã thay đổi trạng thái\n"
+"        \tkể từ lần thông báo cuối cùng\n"
+"      -s\tchỉ hiện những công việc đang dừng chạy\n"
 "\n"
-"\tĐưa ra « -x » thì câu LỆNH được chạy sau khi tất cả các đặc tả công việc\n"
-"\tmà xuất hiện trong các ĐỐI_SỐ đã được thay thế bằng mã số tiến trình\n"
-"\tcủa trình dẫn đầu nhóm tiến trình của công việc đó.\n"
+"    Nếu có `-x' thì chạy LỆNH sau khi thay thế tất cả đặc tả công việc\n"
+"    trên đối số bằng mã tiến trình của trình dẫn đầu nhóm tiến trình\n"
+"    của công việc đó.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công nếu không gặp tùy chọn sai hay gặp lỗi.\n"
-"\tĐưa ra « -x » thì trả lại trạng thái thoát của câu LỆNH."
+"    Trạng thái thoát:\n"
+"    Trả lại thành công nếu không gặp tùy chọn sai hay gặp lỗi.\n"
+"    Đưa ra `-x' thì trả lại trạng thái thoát của LỆNH."
 
-#: builtins.c:892
+#: builtins.c:884
 msgid ""
 "Remove jobs from current shell.\n"
 "    \n"
@@ -3508,23 +3298,22 @@ msgid ""
 "    Exit Status:\n"
 "    Returns success unless an invalid option or JOBSPEC is given."
 msgstr ""
-"Gỡ bỏ công việc khỏi trình bao đang chạy.\n"
+"Bỏ công việc khỏi shell đang chạy.\n"
 "\n"
-"\tGỡ bỏ mỗi đối số JOBSPEC (đặc tả công việc) khỏi bảng các công việc đang "
-"chạy.\n"
-"\tKhông có JOBSPEC thì trình bao dùng thông tin riêng về công việc đang đang "
-"chạy.\n"
+"    Gỡ bỏ công việc xác định bởi đặc tả công việc ĐTCV. Không có đối\n"
+"    số thì dùng công việc hiện thời của shell.\n"
 "\n"
-"\tTùy chọn:\n"
-"\t\t-a\tgỡ bỏ mọi công việc nếu không đưa ra JOBSPEC\n"
-"\t\t-h\tđánh dấu mỗi JOBSPEC để không gửi tín hiệu ngưng kết nối SIGHUP\n"
-"\t\t\tcho công việc nếu trình bao nhận được SIGHUP\n"
-"\t\t-r\tgỡ bỏ chỉ những công việc đang chạy\n"
+"    Tùy chọn:\n"
+"      -a\tbỏ mọi công việc nếu không có ĐTCV\n"
+"      -h\tđánh dấu ĐTCV để không gửi tín hiệu SIGHUP\n"
+"        \tcho công việc khi shell nhận được SIGHUP\n"
+"      -r\tchỉ bỏ những công việc đang chạy\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công nếu không đưa ra tùy chọn sai hay JOBSPEC sai."
+"    Trạng thái thoát:\n"
+"    Trả lại thành công nếu không đưa ra tùy chọn sai hay\n"
+"    ĐTCV sai."
 
-#: builtins.c:911
+#: builtins.c:903
 msgid ""
 "Send a signal to a job.\n"
 "    \n"
@@ -3545,36 +3334,33 @@ msgid ""
 "    Exit Status:\n"
 "    Returns success unless an invalid option is given or an error occurs."
 msgstr ""
-"Gửi một tín hiệu cho một công việc.\n"
-"\n"
-"\tGửi cho những tiến trình được mã số hay đặc tả công việc đại diện\n"
-"\ttín hiệu được SIGSPEC hay SIGNUM được đặt tên.\n"
-"\tKhông đưa ra SIGSPEC, cũng không đưa ra SIGNUM,\n"
-"\tthì giả sử SIGTERM.\n"
-"\n"
-"\tTùy chọn:\n"
-"\t\t-s TTH\tTTH là một tên tín hiệu\n"
-"\t\t-n STH\tSTH là một số thứ tự tín hiệu\n"
-"\t\t-l\tliệt kê các tên tín hiệu ;\n"
-"\t\t\tnếu có đối số theo sau « -l », thì giả sử mỗi đối số\n"
-"\t\t\tlà số thứ tự tin hiệu cho đó nên liệt kê tên\n"
-"\n"
-"\tKill là một dựng sẵn trình bao vì hai lý do :\n"
-"\tnó cho phép dùng mã số công việc thay cho mã số tiến trình,\n"
-"\tvà cho phép giết tiến trình nếu tới giới hạn số các tiến trình\n"
-"\tđược phép tạo.\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công nếu không đưa ra tùy chọn sai hay gặp lỗi."
-
-#: builtins.c:934
+"Gửi tín hiệu cho công việc.\n"
+"\n"
+"    Gửi tín hiệu xác định bởi SIGSPEC hoặc SIGNUM cho những tiến trình\n"
+"    xác định bởi PID hoặc JOBSPEC. Nếu không xác định cả SIGSPEC và\n"
+"    SIGNUM thì ngầm định SIGTERM.\n"
+"\n"
+"    Tùy chọn:\n"
+"      -s TTH\tTTH là tên tín hiệu\n"
+"      -n STH\tSTH là mã số tín hiệu\n"
+"      -l\tliệt kê tên tín hiệu; đối số sau `-l' nếu có được coi\n"
+"        \tlà mã số tín hiệu cần hiện tên\n"
+"\n"
+"    Kill là lệnh shell dựng sẵn vì hai lý do: nó cho phép dùng mã số\n"
+"    công việc thay cho mã số tiến trình và cho phép giết tiến trình\n"
+"    đạt giới hạn số các tiến trình được phép tạo.\n"
+"\n"
+"    Trạng thái thoát:\n"
+"    Trả lại thành công nếu không đưa ra tùy chọn sai hay gặp lỗi."
+
+#: builtins.c:926
 msgid ""
 "Evaluate arithmetic expressions.\n"
 "    \n"
 "    Evaluate each ARG as an arithmetic expression.  Evaluation is done in\n"
 "    fixed-width integers with no check for overflow, though division by 0\n"
 "    is trapped and flagged as an error.  The following list of operators is\n"
-"    grouped into levels of equal-precedence operators.  The levels are "
-"listed\n"
+"    grouped into levels of equal-precedence operators.  The levels are listed\n"
 "    in order of decreasing precedence.\n"
 "    \n"
 "    \tid++, id--\tvariable post-increment, post-decrement\n"
@@ -3612,64 +3398,56 @@ msgid ""
 msgstr ""
 "Định giá biểu thức số học.\n"
 "\n"
-"\tĐịnh giá mỗi ĐỐI_SỐ như là một biểu thức số học. Việc định giá xảy ra\n"
-"\ttheo số nguyên có độ rộng cố định mà không kiểm tra có tràn chưa dù "
-"trường\n"
-"\tchia cho không được bắt và đặt cờ là một lỗi. Theo đây có danh sách các "
-"toán tử\n"
-"\t được nhóm lại theo cấp các toán tử cùng quyền đi trước.\n"
-"\tDanh sách các cấp có thứ tự quyền đi trước giảm.\n"
-"\n"
-"\tid++, id--\tbiến đổi sau khi tăng/giảm dần\n"
-"\t++id, --id\tbiến đổi trước khi tăng/giảm dần\n"
-"\t-, +\ttrừ, cộng nguyên phân\n"
-"\t!, ~\tlôgic và phủ định trên bit\n"
-"\t**\tmũ hoá\n"
-"\t*, /, %\tphép nhân, phép chia, số dư\n"
-"\t+, -\tphép cộng, phép trừ\n"
-"\t<<, >>\tphép dịch bit bên trái/phải\n"
-"\t<=, >=, <, >\tso sánh\n"
-"\t==, !=\t bất đẳng thức, đẳng thức\n"
-"\t&\tAND (và) trên bit\n"
-"\t^\tXOR (hoặc loại từ) trên bit\n"
-"\t||\tOR (hoặc) trên bit\n"
-"\tb_thức ? b_thức : b_thức\ttoán từ điều kiện\n"
-"\t=, *=, /=, %=,\n"
-"+=, -=, <<=, >>=,\n"
-"&=, ^=, |=\tgán\n"
-"\n"
-"\tCho phép biến trình bao dưới dạng toán hạng. Tên của biến\n"
-"\tđược thay thế bằng giá trị của nó (bị ép buộc thành một số nguyên rộng cố "
-"định)\n"
-"\tbên trong một biểu thức. Biến không cần có thuộc tính số nguyên\n"
-"\tđược bật để được dùng làm biểu thức.\n"
-"\n"
-"\tCác toán tử được định giá theo thứ tự quyền đi trước. Các biểu thức con "
-"nằm trong\n"
-"\tdấu ngoặc được định giá trước tiên, và có quyền cao hơn các quy tắc đi "
-"trước\n"
-"\tbên trên.\n"
-"\n"
-"\tTrạng thái thoát:\n"
-"\tNếu ĐỐI_SỐ cuối cùng được định giá thành 0 thì trả về 1;\n"
-"\tkhông thì trả về 0."
-
-#: builtins.c:979
-#, fuzzy
+"    Định giá mỗi ĐỐI-SỐ dạng biểu thức số học. Định giá theo số nguyên\n"
+"    có giới hạn, không kiểm tra tràn số, mặc dù có bẫy chia cho không\n"
+"    và bật cờ lỗi. Danh sách toán tử bên dưới được nhóm theo nhóm độ\n"
+"    ưu tiên ngang hàng. Danh sách theo độ ưu tiên giảm dần.\n"
+"\n"
+"    \tid++, id--\tbiến tăng/giảm hậu tố\n"
+"    \t++id, --id\tbiến tăng/giảm tiền tố\n"
+"    \t-, +\t\ttrừ, cộng (dấu)\n"
+"    \t!, ~\t\tphủ định luận lý và trên bit\n"
+"    \t**\t\tsố mũ\n"
+"    \t*, /, %\t\tnhân, chia, số dư\n"
+"    \t+, -\t\tcộng, trừ\n"
+"    \t<<, >>\t\tdịch bit trái/phải\n"
+"    \t<=, >=, <, >\tso sánh\n"
+"    \t==, !=\t\tbằng, không bằng\n"
+"    \t&\t\tphép AND trên bit\n"
+"    \t^\t\tphép XOR trên bit\n"
+"    \t|\t\tphép OR trên bit\n"
+"    \t&&\t\tphép AND luận lý\n"
+"    \t||\t\tphép OR luận lý\n"
+"    \tBTHỨC ? BTHỨC : BTHỨC\n"
+"    \t\t\ttoán từ điều kiện\n"
+"    \t=, *=, /=, %=,\n"
+"    \t+=, -=, <<=, >>=,\n"
+"    \t&=, ^=, |=\tphép gán\n"
+"\n"
+"    Biến shell có thể dùng làm toán hạng. Tên biến được thay thế bằng\n"
+"    giá trị biến (chuyển thành số nguyên) trong biểu thức. Biến không\n"
+"    cần có thuộc tính số nguyên để dùng làm biểu thức.\n"
+"\n"
+"    Các toán tử được định giá theo thứ tự ưu tiên. Các biểu thức con\n"
+"    nằm trong dấu ngoặc được định giá trước tiên, và có quyền cao hơn\n"
+"    các quy tắc đi trước bên trên.\n"
+"\n"
+"    Trạng thái thoát:\n"
+"    Nếu ĐỐI-SỐ cuối cùng được định giá thành 0 thì trả về 1; không thì\n"
+"    trả về 0."
+
+#: builtins.c:971
 msgid ""
 "Read a line from the standard input and split it into fields.\n"
 "    \n"
 "    Reads a single line from the standard input, or from file descriptor FD\n"
-"    if the -u option is supplied.  The line is split into fields as with "
-"word\n"
+"    if the -u option is supplied.  The line is split into fields as with word\n"
 "    splitting, and the first word is assigned to the first NAME, the second\n"
 "    word to the second NAME, and so on, with any leftover words assigned to\n"
-"    the last NAME.  Only the characters found in $IFS are recognized as "
-"word\n"
+"    the last NAME.  Only the characters found in $IFS are recognized as word\n"
 "    delimiters.\n"
 "    \n"
-"    If no NAMEs are supplied, the line read is stored in the REPLY "
-"variable.\n"
+"    If no NAMEs are supplied, the line read is stored in the REPLY variable.\n"
 "    \n"
 "    Options:\n"
 "      -a array\tassign the words read to sequential indices of the array\n"
@@ -3681,74 +3459,64 @@ msgid ""
 "      -n nchars\treturn after reading NCHARS characters rather than waiting\n"
 "    \t\tfor a newline, but honor a delimiter if fewer than NCHARS\n"
 "    \t\tcharacters are read before the delimiter\n"
-"      -N nchars\treturn only after reading exactly NCHARS characters, "
-"unless\n"
+"      -N nchars\treturn only after reading exactly NCHARS characters, unless\n"
 "    \t\tEOF is encountered or read times out, ignoring any delimiter\n"
 "      -p prompt\toutput the string PROMPT without a trailing newline before\n"
 "    \t\tattempting to read\n"
 "      -r\t\tdo not allow backslashes to escape any characters\n"
 "      -s\t\tdo not echo input coming from a terminal\n"
-"      -t timeout\ttime out and return failure if a complete line of input "
-"is\n"
+"      -t timeout\ttime out and return failure if a complete line of input is\n"
 "    \t\tnot read withint TIMEOUT seconds.  The value of the TMOUT\n"
 "    \t\tvariable is the default timeout.  TIMEOUT may be a\n"
-"    \t\tfractional number.  If TIMEOUT is 0, read returns immediately,\n"
-"    \t\twithout trying to read any data, returning success only if\n"
-"    \t\tinput is available on the specified file descriptor.  The\n"
+"    \t\tfractional number.  If TIMEOUT is 0, read returns success only\n"
+"    \t\tif input is available on the specified file descriptor.  The\n"
 "    \t\texit status is greater than 128 if the timeout is exceeded\n"
 "      -u fd\t\tread from file descriptor FD instead of the standard input\n"
 "    \n"
 "    Exit Status:\n"
-"    The return code is zero, unless end-of-file is encountered, read times "
-"out\n"
-"    (in which case it's greater than 128), a variable assignment error "
-"occurs,\n"
+"    The return code is zero, unless end-of-file is encountered, read times out,\n"
 "    or an invalid file descriptor is supplied as the argument to -u."
 msgstr ""
-"Đọc một dòng từ đầu vào tiêu chuẩn, sau đó chia nó ra nhiều trường.\n"
-"\n"
-"\tĐọc một dòng riêng lẻ từ đầu vào tiêu chuẩn,\n"
-"\thoặc từ bộ mô tả tập tin FD nếu đưa ra tùy chọn « -u ».\n"
-"\tDòng được chia ra nhiều trường giống như khi chia từ ra,\n"
-"\tvà từ đầu tiên được gán cho TÊN đầu tiên,\n"
-"\ttừ thứ hai cho TÊN thứ hai, v.v.,\n"
-"\tvà từ còn lại nào được gán cho TÊN cuối cùng.\n"
-"\tChỉ những ký tự được tìm trong $IFS được nhận ra là ký tự định giới từ.\n"
-"\n"
-"\tKhông đưa ra TÊN thì dòng được đọc sẽ được ghi nhớ vào biến REPLY (đáp "
-"ứng).\n"
-"\n"
-"\tTùy chọn:\n"
-"\t\t-a mảng\tgán các từ được đọc cho những số mũ tuần tự\n"
-"\t\t\tcủa biến mảng MẢNG, bắt đầu từ số không.\n"
-"\t\t-d định_giới\ttiếp tục đến khi đọc ký tự đầu tiên của DELIM,\n"
-"\t\t\thơn là ký tự dòng mới\n"
-"\t\t-e\tdùng Readline để lấy dòng trong một trình bao tương tác\n"
-"\t\t-i chuỗi\tdùng chuỗi này như là văn bản đầu tiên cho Readline\n"
-"\t\t-n số_ky_tự\ttrả lại sau khi đọc số các ký tự này,\n"
-"\t\t\thơn là đợi một ký tự dòng mới\n"
-"\t\t-N số_ký_tự\ttrả lại chỉ sau khi đọc chính xác số các ký tự này,\n"
-"\t\tnếu không gặp kết thúc tập tin (EOF) hay quá hạn đọc, cũng bỏ qua dấu "
-"tách nào\n"
-"\t\t-p nhắc\txuất chuỗi NHẮC mà không có ký tự dòng mới theo sau,\n"
-"\t\t\ttrước khi thử đọc\n"
-"\t\t-r\tđừng cho phép gạch chéo ngược thoát ký tự\n"
-"\t\t-s\tđừng báo lai dữ liệu nhập vào đến từ thiết bị cuối\n"
-"\t\t-t thời_hạn\tquá thời và trả lại không thành công\n"
-"\t\t\tnếu chưa đọc một dòng dữ liệu nhập hoàn toàn trong số giấy này.\n"
-"\t\t\tGiá trị của biến TMOUT là thời hạn mặc định.\n"
-"\t\t\tThời hạn này có thể là một số thuộc phân số.\n"
-"\t\t\tNếu THỜI_HẠN là 0 thì việc đọc trả lại thành công chỉ nếu\n"
-"\t\t\tdữ liệu nhập sẵn sàng trên bộ mô tả tập tin đưa ra.\n"
-"\t\t\tTrạng thái thoát lớn hơn 128 nếu vượt quá thời hạn này.\n"
-"\t\t-u fd\tđọc từ bộ mô tả tập tin FD thay cho đầu vào tiêu chuẩn\n"
-"\n"
-"\tTrạng thái thoát:\n"
-"\tMã trả lại là số không, nếu không gặp kết thúc tập tin,\n"
-"\thay quá hạn đọc, hay đưa ra bộ mô tả tập tin sai\n"
-"\tlàm đối số tới « -u »."
-
-#: builtins.c:1024
+"Đọc một dòng từ đầu nhập chuẩn và tách ra nhiều trường.\n"
+"\n"
+"    Đọc một dòng từ đầu nhập chuẩn, hoặc từ bộ mô tả tập tin FD nếu\n"
+"    dùng tùy chọn `-u'. Dòng được chia ra nhiều trường, trường đầu\n"
+"    tiên được gán cho biến TÊN đầu tiên, từ thứ hai cho TÊN thứ hai,\n"
+"    v.v., và từ còn lại nào được gán cho TÊN cuối cùng. Chỉ những ký\n"
+"    tự trong $IFS được coi là ký tự phân cách.\n"
+"\n"
+"    Không có TÊN thì dòng được đọc sẽ lưu vào biến REPLY.\n"
+"\n"
+"    Tùy chọn:\n"
+"      -a MẢNG\tlưu các trường vào biến mảng chỉ mục MẢNG theo thứ tự,\n"
+"        \tbắt đầu từ không.\n"
+"      -d DELIM\ttiếp tục đến khi đọc ký tự đầu tiên của DELIM thay\n"
+"        \tvì ký tự xuống dòng\n"
+"      -e\tdùng Readline để lấy dòng trong shell tương tác\n"
+"      -i CHUỖI\tdùng CHUỖI làm văn bản đầu tiên cho Readline\n"
+"      -n N\ttrở về sau khi đọc số lượng ký tự này thay vì đọc hết dòng\n"
+"      -N N\ttrở về chỉ sau khi đọc chính xác số lượng ký tự này,\n"
+"        \tnếu không gặp kết thúc tập tin (EOF) hay quá hạn đọc,\n"
+"        \tcũng bỏ qua dấu tách nào\n"
+"      -p NHẮC\txuất chuỗi NHẮC mà không có ký tự dòng mới theo sau,\n"
+"        \ttrước khi đọc\n"
+"      -r\tkhông cho phép gạch chéo ngược để thoát ký tự\n"
+"      -s\tkhông hiện lại dữ liệu nhập đến từ thiết bị cuối\n"
+"      -t THỜI_HẠN\n"
+"        \tquá thời và trả lại không thành công nếu chưa đọc một\n"
+"        \tdòng dữ liệu nhập hoàn toàn trong số giây này. Giá trị\n"
+"        \tcủa biến TMOUT là thời hạn mặc định.  Thời hạn này có\n"
+"        \tthể là một phân số. Nếu THỜI_HẠN là 0 thì việc đọc trả\n"
+"        \tlại thành công chỉ nếu dữ liệu nhập sẵn sàng trên bộ\n"
+"        \tmô tả tập tin đưa ra. Trạng thái thoát lớn hơn 128\n"
+"        \tnếu vượt quá thời hạn này.\n"
+"      -u FD\tđọc từ bộ mô tả tập tin FD thay cho đầu nhập chuẩn\n"
+"\n"
+"    Trạng thái thoát:\n"
+"    Mã trả lại là số không, nếu không gặp kết thúc tập tin, hay quá\n"
+"    hạn đọc, hay đưa ra bộ mô tả tập tin sai làm đối số tới `-u'."
+
+#: builtins.c:1014
 msgid ""
 "Return from a shell function.\n"
 "    \n"
@@ -3759,19 +3527,17 @@ msgid ""
 "    Exit Status:\n"
 "    Returns N, or failure if the shell is not executing a function or script."
 msgstr ""
-"Trả lại từ má»\99t chức nÄ\83ng trình bao.\n"
+"Trá»\9f vá»\81 từ hàm shell.\n"
 "\n"
-"\tGây ra một chức năng hay văn lệnh từ nguồn sẽ thoát\n"
-"\tvới giá trị trả lại được N ghi rõ.\n"
-"\tKhông đưa ra N thì trạng thái trả lại thuộc về câu lệnh cuối cùng\n"
-"\t\tđược chạy bên trong chức năng hay văn lệnh.\n"
+"    Thoát hàm shell hoặc văn lệnh được 'source' với mã trả về xác định\n"
+"    bởi N. Nếu không có N, trạng thái thoát là của lệnh thực hiện cuối\n"
+"    cùng trong hàm/văn lệnh.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại N, hoặc bị lỗi nếu trình bao không đang chạy\n"
-"\t\tmột chức năng hay văn lệnh."
+"    Trạng thái thoát:\n"
+"    Trả lại N, hoặc bị lỗi nếu shell không đang chạy một hàm hay văn\n"
+"    lệnh."
 
-#: builtins.c:1037
-#, fuzzy
+#: builtins.c:1027
 msgid ""
 "Set or unset values of shell options and positional parameters.\n"
 "    \n"
@@ -3814,8 +3580,7 @@ msgid ""
 "              physical     same as -P\n"
 "              pipefail     the return value of a pipeline is the status of\n"
 "                           the last command to exit with a non-zero status,\n"
-"                           or zero if no command exited with a non-zero "
-"status\n"
+"                           or zero if no command exited with a non-zero status\n"
 "              posix        change the behavior of bash where the default\n"
 "                           operation differs from the Posix standard to\n"
 "                           match the standard\n"
@@ -3837,7 +3602,7 @@ msgid ""
 "      -E  If set, the ERR trap is inherited by shell functions.\n"
 "      -H  Enable ! style history substitution.  This flag is on\n"
 "          by default when the shell is interactive.\n"
-"      -P  If set, do not resolve symbolic links when executing commands\n"
+"      -P  If set, do not follow symbolic links when executing commands\n"
 "          such as cd which change the current directory.\n"
 "      -T  If set, the DEBUG trap is inherited by shell functions.\n"
 "      --  Assign any remaining arguments to the positional parameters.\n"
@@ -3855,91 +3620,91 @@ msgid ""
 "    Exit Status:\n"
 "    Returns success unless an invalid option is given."
 msgstr ""
-"Đặt hay bỏ đặt giá trị của tùy chọn trình bao và tham số thuộc vị trí.\n"
-"\n"
-"\tSửa đổi giá trị của thuộc tính trình bao và tham số thuộc vị trí,\n"
-"\thoặc hiển thị tên và giá trị của biến trình bao.\n"
-"\n"
-"\tTùy chọn:\n"
-"\t\t-a\tđánh dấu các biến được tạo hay sửa đổi để xuất ra\n"
-"\t\t-b\tthông báo ngay về công việc bị chấm dứt\n"
-"\t\t-e\tthoát ngay nếu câu lệnh thoát với trạng thái khác số không\n"
-"\t\t-f\ttắt chức năng tạo tên tập tin (glob)\n"
-"\t\t-h\tnhớ vị trí của mỗi câu lệnh khi nó được dò tìm\n"
-"\t\t-k\tmọi đối số gán được đặt vào môi trường cho một câu lệnh,\n"
-"\t\t\tkhông phải chỉ những đối số nằm trước tên câu lệnh\n"
-"\t\t-m\tbật chức năng điều khiển công việc\n"
-"\t\t-n\tĐọc câu lệnh mà không thực thi\n"
-"\t\t-o tên_tùy_chọn\tđặt biến tương ứng với tùy chọn này:\n"
-"\t\t\tallexport\tgiống với  -a\n"
-"\t\t\tbraceexpand\tgiống với -B\n"
-"\t\t\temacs\tdùng một giao diện chỉnh sửa dòng kiểu emacs\n"
-"\t\t\terrexit\tbằng -e\n"
-"\t\t\terrtrace\tbằng -E\n"
-"\t\t\tfunctrace\tbằng -T\n"
-"\t\t\thashall\tbằng -h\n"
-"\t\t\t• histexpand\tbằng -H\n"
-"\t\t\thistory\tbật lịch sử câu lệnh\n"
-"\t\t\tignoreeof\ttrình bao sẽ không thoát khi đọc ký tự kết thúc tập tin "
-"EOF\n"
-"\t\t\tinteractive-comments\tcho phép ghi chú trong câu lệnh tương tác\n"
-"\t\t\tkeyword\tbằng -k\n"
-"\t\t\tmonitor\tbằng -m\n"
-"\t\t\tnoclobber\tbằng -C\n"
-"\t\t\tnoexec\tbằng -n\n"
-"\t\t\tnoglob\tbằng -f\n"
-"\t\t\tnolog\thiện thời được chấp nhận nhưng bị bỏ qua\n"
-"\t\t\tnotify\tbằng -b\n"
-"\t\t\tnounset\tbằng -u\n"
-"\t\t\tonecmd\tbằng -t\n"
-"\t\t\tphysical\tbằng -P\n"
-"\t\t\tpipefail\tgiá trị trả lại của một ống dẫn\n"
-"\t\t\t\tlà trạng thái của câu lệnh cuối cùng\n"
-"\t\t\t\tthoát với trạng thái khác số không,\n"
-"\t\t\t\thay số không nếu không có câu lệnh\n"
-"\t\t\t\tthoát với trạng thái khác số không\n"
-"\t\t\tposix\tthay đổi ứng xử của bash\n"
-"\t\t\t\tmà thao tác mặc định khác với tiêu chuẩn Posix,\n"
-"\t\t\t\tđể khớp với tiêu chuẩn\n"
-"\t\t\t• privileged\tbằng -p\n"
-"\t\t\t• verbose\tbằng -v\n"
-"\t\t\t• vi\tdùng một giao diện chỉnh sửa kiểu vi\n"
-"\t\t\t• xtrace\tbằng -x\n"
-"\t\t-p\tbật khi nào mã số thật và mã số có kết quả\n"
-"\t\t\tkhông tương ứng với nhau.\n"
-"\t\t\tTắt tính năng xử lý tập tin $ENV\n"
-"\t\t\tvà nhập các hàm vào trình bao.\n"
-"\t\t\tViệc tắt tùy chọn này thì gây ra uid và gid có kết quả\n"
-"\t\t\tđược đặt thành uid và gid thật.\n"
-"\t\t-t\tthoát sau khi đọc và thực thi một câu lệnh\n"
-"\t\t-u\txử lý biến chưa đặt là lỗi khi thay thế\n"
-"\t\t-v\tin ra mỗi dòng nhập vào trình bao khi nó được đọc\n"
-"\t\t-x\tin ra mỗi câu lệnh và đối số tương ứng khi nó được thực thi\n"
-"\\t-B\ttrình bao sẽ mở rộng các dấu ngoặc móc\n"
-"\t\t-C\tNếu đặt thì không cho phép ghi đè lên tập tin bình thường\n"
-"\t\t\tđã tồn tại bằng cách chuyển hướng kết xuất\n"
-"\t\t-E\tNếu đặt thì bẫy ERR được chức năng trình bao kế thừa\n"
-"\t\t-H\t Bật! bật chức năng thay thế kiểu. Cờ này được bật\n"
-"\t\t\ttheo mặc định khi trình bao tương tác\n"
-"\t\t-P\tđặt thì không theo liên kết tượng trưng\n"
-"\t\t\tkhi thực thi câu lệnh như cd mà chuyển đổi thư mục hiện tại\n"
-"\t\t-T\tNếu đặt thì bẫy DEBUG (gỡ lỗi) được các hàm của trình bao kế thừa\n"
-"\t\t--\tGán bất cứ đối số còn lại nào cho những tham số thuộc vị trí.\n"
-"\t\t\tNếu không còn thừa lại đối số nào, tham số vị trí\n"
-"\t\t\tìm kiếm được đặt.\n"
-"\t\t-\tGán bất cứ đối số còn lại nào cho những tham số thuộc vị trí.\n"
-"\t\t\tHai tùy chọn -x và -v đều bị tắt.\n"
-"\n"
-"\tViệc dùng + hơn là - thì gây ra các cờ này bị tắt.\n"
-"\tCác cờ cũng có thể được dùng khi gọi trình bao. Giá trị\n"
-"\tcác cờ hiện hành có thể tìm thấy trong biến $-. Các đối số còn lại\n"
-"\tlà tham số thuộc vị trí, và được gán (theo thứ tự) cho $1, $2, .. $n.\n"
-"\tKhông đưa ra đối số thì in ra mọi biến trình bao.\n"
-"\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công trừ phi gặp tùy chọn sai."
-
-#: builtins.c:1122
+"Đặt hay huỷ giá trị của tùy chọn shell và tham số thuộc vị trí.\n"
+"\n"
+"    Sửa đổi giá trị của thuộc tính shell và tham số thuộc vị trí,\n"
+"    hoặc hiển thị tên và giá trị của biến shell.\n"
+"\n"
+"    Tùy chọn:\n"
+"        -a      đánh dấu các biến được tạo hay sửa đổi để xuất khẩu\n"
+"        -b      thông báo ngay về công việc bị chấm dứt\n"
+"        -e      thoát ngay nếu câu lệnh thoát với trạng thái khác số không\n"
+"        -f      tắt chức năng tạo tên tập tin (glob)\n"
+"        -h      nhớ vị trí của mỗi câu lệnh khi nó được dò tìm\n"
+"        -k      mọi đối số gán được đặt vào môi trường cho một câu lệnh,\n"
+"                không phải chỉ những đối số nằm trước tên câu lệnh\n"
+"        -m      bật chức năng điều khiển công việc\n"
+"        -n      đọc câu lệnh mà không thực thi\n"
+"        -o TÊN_TÙY_CHỌN\n"
+"                đặt biến tương ứng với TÊN_TÙY_CHỌN:\n"
+"                    allexport       giống -a\n"
+"                    braceexpand     giống -B\n"
+"                    emacs           dùng giao diện soạn thảo kiểu emacs\n"
+"                    errexit         giống -e\n"
+"                    errtrace        giống -E\n"
+"                    functrace       giống -T\n"
+"                    hashall         giống -h\n"
+"                    histexpand      giống -H\n"
+"                    history         bật lịch sử câu lệnh\n"
+"                    ignoreeof       shell không thoát khi đọc EOF\n"
+"                    interactive-comments\n"
+"                                    cho phép ghi chú trong lệnh tương tác\n"
+"                    keyword         giống -k\n"
+"                    monitor         giống -m\n"
+"                    noclobber       giống -C\n"
+"                    noexec          giống -n\n"
+"                    noglob          giống -f\n"
+"                    nolog           hiện thời chấp nhận nhưng bỏ qua\n"
+"                    notify          giống -b\n"
+"                    nounset         giống -u\n"
+"                    onecmd          giống -t\n"
+"                    physical        giống -P\n"
+"                    pipefail        giá trị trả lại của ống dẫn là\n"
+"                                    trạng thái của câu lệnh cuối cùng\n"
+"                                    có trạng thái khác không, hoặc số\n"
+"                                    không nếu không có câu lệnh thoát\n"
+"                                    với trạng thái khác không\n"
+"                    posix           thay đổi những thao tác khác với\n"
+"                                    Posix thành tuân theo Posix\n"
+"                    privileged      giống -p\n"
+"                    verbose         giống -v\n"
+"                    vi              dùng giao diện soạn thảo kiểu vi\n"
+"                    xrace           giống -x\n"
+"        -p      bật khi nào mã số thật và mã số có kết quả\n"
+"                không tương ứng với nhau.\n"
+"                Tắt tính năng xử lý tập tin $ENV\n"
+"                và nhập các hàm vào shell.\n"
+"                Việc tắt tùy chọn này thì gây ra uid và gid có kết quả\n"
+"                được đặt thành uid và gid thật.\n"
+"        -t      thoát sau khi đọc và thực thi một câu lệnh\n"
+"        -u      xử lý biến chưa đặt là lỗi khi thay thế\n"
+"        -v      in ra mỗi dòng nhập vào shell khi nó được đọc\n"
+"        -x      in ra mỗi câu lệnh và đối số tương ứng khi nó được thực thi\n"
+"        -B      shell sẽ mở rộng các dấu ngoặc móc\n"
+"        -C      Nếu đặt thì không cho phép ghi đè lên tập tin bình thường\n"
+"                đã tồn tại bằng cách chuyển hướng kết xuất\n"
+"        -E      Nếu đặt thì bẫy ERR được chức năng shell kế thừa\n"
+"        -H       Bật! bật chức năng thay thế kiểu. Cờ này được bật\n"
+"                theo mặc định khi shell tương tác\n"
+"        -P      đặt thì không theo liên kết tượng trưng\n"
+"                khi thực thi câu lệnh như cd mà chuyển đổi thư mục hiện tại\n"
+"        -T      Nếu đặt thì bẫy DEBUG (gỡ lỗi) được các hàm của shell kế thừa\n"
+"        --      Gán bất cứ đối số còn lại nào cho những tham số thuộc vị trí.\n"
+"                Nếu không còn thừa lại đối số nào, tham số vị trí\n"
+"                ìm kiếm được đặt.\n"
+"        -       Gán bất cứ đối số còn lại nào cho những tham số thuộc vị trí.\n"
+"                Hai tùy chọn -x và -v đều bị tắt.\n"
+"\n"
+"    Việc dùng + thay - làm tắt cờ. Các cờ cũng có thể được dùng khi\n"
+"    gọi shell. Giá trị các cờ hiện hành có thể tìm thấy trong biến\n"
+"    $-. Các đối số còn lại là tham số thuộc vị trí, và được gán (theo\n"
+"    thứ tự) cho $1, $2, .. $n.  Không đưa ra đối số thì in ra mọi biến\n"
+"    shell.\n"
+"\n"
+"    Trạng thái thoát:\n"
+"    Trả lại thành công trừ phi gặp tùy chọn sai."
+
+#: builtins.c:1112
 msgid ""
 "Unset values and attributes of shell variables and functions.\n"
 "    \n"
@@ -3949,8 +3714,7 @@ msgid ""
 "      -f\ttreat each NAME as a shell function\n"
 "      -v\ttreat each NAME as a shell variable\n"
 "    \n"
-"    Without options, unset first tries to unset a variable, and if that "
-"fails,\n"
+"    Without options, unset first tries to unset a variable, and if that fails,\n"
 "    tries to unset a function.\n"
 "    \n"
 "    Some variables cannot be unset; also see `readonly'.\n"
@@ -3958,27 +3722,26 @@ msgid ""
 "    Exit Status:\n"
 "    Returns success unless an invalid option is given or a NAME is read-only."
 msgstr ""
-"Bỏ đặt giá trị và thuộc tính của biến và chức năng của trình bao.\n"
+"Xoá giá trị và thuộc tính biến và hàm shell.\n"
 "\n"
-"\tĐối với mỗi TÊN, gỡ bỏ biến hay chức năng mà tương ứng.\n"
+"    Đối với mỗi TÊN, gỡ bỏ biến hay hàm tương ứng.\n"
 "\n"
-"\tTùy chọn:\n"
-"\t\t-f\tđọc mỗi TÊN dượi dạng một chức năng trình bao\n"
-"\t\t-v\tđọc mỗi TÊN dượi dạng một biến trình bao\n"
+"    Tùy chọn:\n"
+"      -f\tđọc TÊN dạng hàm shell\n"
+"      -v\tđọc TÊN dạng biến shell\n"
 "\n"
-"\tKhông có tùy chọn thì chức năng bỏ đặt sẽ thử bỏ đặt một biến,\n"
-"\tvà nếu không thành công, sau đó thử bỏ đặt một chức năng.\n"
+"    Không có tùy chọn thì sẽ thử xoá biến, và nếu không thành công,\n"
+"    sau đó thử xoá hàm.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công nếu không đưa ra tùy chọn sai, và TÊN không chỉ đọc."
+"    Trạng thái thoát:\n"
+"    Trả lại thành công nếu không đưa ra tùy chọn sai, và TÊN không chỉ đọc."
 
-#: builtins.c:1142
+#: builtins.c:1132
 msgid ""
 "Set export attribute for shell variables.\n"
 "    \n"
 "    Marks each NAME for automatic export to the environment of subsequently\n"
-"    executed commands.  If VALUE is supplied, assign VALUE before "
-"exporting.\n"
+"    executed commands.  If VALUE is supplied, assign VALUE before exporting.\n"
 "    \n"
 "    Options:\n"
 "      -f\trefer to shell functions\n"
@@ -3990,23 +3753,22 @@ msgid ""
 "    Exit Status:\n"
 "    Returns success unless an invalid option is given or NAME is invalid."
 msgstr ""
-"Đặt thuộc tính xuất khẩu cho biến trình bao.\n"
+"Đặt thuộc tính xuất khẩu cho biến shell.\n"
 "\n"
-"\tĐánh dấu mỗi TÊN để tự động xuất vào môi trường của câu lệnh được chạy về "
-"sau.\n"
-"\tĐưa ra GIÁ_TRỊ thì gán GIÁ_TRỊ trước khi xuất ra.\n"
+"    Đánh dấu TÊN để tự động xuất vào môi trường của các lệnh được chạy\n"
+"    sau đó. Có GIÁ-TRỊ thì gán GIÁ-TRỊ trước khi xuất ra.\n"
 "\n"
-"\tTùy chọn:\n"
-"\t\t-f\ttham chiếu đến chức năng trình bao\n"
-"\t\t-n\tgỡ bỏ thuộc tính xuất khẩu khỏi mỗi TÊN\n"
-"\t\t-p\thiển thị danh sách các biến và chức năng đều được xuất ra\n"
+"    Tùy chọn:\n"
+"      -f\ttham chiếu đến hàm shell\n"
+"      -n\tgỡ bỏ thuộc tính xuất khẩu khỏi TÊN\n"
+"      -p\thiển thị danh sách các biến và hàm được xuất khẩu\n"
 "\n"
-"\tĐối số « -- » thì tắt chức năng xử lý tùy chọn sau nữa.\n"
+"    Đối số `--' ngưng phân tích tuỳ chọn cho các tham số còn lại.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công nếu không đưa ra tùy chọn sai hay TÊN sai,"
+"    Trạng thái thoát:\n"
+"    Trả lại thành công nếu không đưa ra tùy chọn sai hay TÊN sai,"
 
-#: builtins.c:1161
+#: builtins.c:1151
 msgid ""
 "Mark shell variables as unchangeable.\n"
 "    \n"
@@ -4025,24 +3787,24 @@ msgid ""
 "    Exit Status:\n"
 "    Returns success unless an invalid option is given or NAME is invalid."
 msgstr ""
-"Đánh dấu biến trình bao không thể thay đổi được.\n"
+"Đánh dấu biến shell không thể thay đổi.\n"
 "\n"
-"\tĐánh dấu mỗi TÊN là chỉ đọc; những giá trị của TÊN như vậy\n"
-"\tthì không thay đổi được bất chấp việc gán theo sau.\n"
-"\tĐưa ra GIÁ_TRỊ thì gán GIÁ_TRỊ trước khi đánh dấu là chỉ đọc.\n"
+"    Đánh dấu TÊN là chỉ đọc; giá trị những biến này không được thay\n"
+"    đổi trong các phép gán sau. Nếu có GIÁ-TRỊ thì gán GIÁ-TRỊ trước\n"
+"    khi đánh dấu là chỉ đọc.\n"
 "\n"
-"\tTùy chọn:\n"
-"\t\t-a\ttham chiếu đến biến kiểu mảng theo số mũ\n"
-"\t\t-A\ttham chiếu đến biến kiểu mảng kết hợp\n"
-"\t\t-f\ttham chiếu đến chức năng trình bao\n"
-"\t\t-p\thiển thị danh sách các biến và chức năng vẫn chỉ đọc\n"
+"    Tùy chọn:\n"
+"      -a\ttham chiếu đến biến kiểu mảng chỉ số\n"
+"      -A\ttham chiếu đến biến kiểu mảng kết hợp\n"
+"      -f\ttham chiếu đến hàm shell\n"
+"      -p\thiển thị danh sách biến và hàm chỉ đọc\n"
 "\n"
-"\tĐối số « -- » thì tắt chức năng xử lý tùy chọn sau nữa.\n"
+"    Đối số `--' ngưng phân tích tuỳ chọn cho các tham số còn lại.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công nếu không đưa ra tùy chọn sai hay TÊN sai."
+"    Trạng thái thoát:\n"
+"    Trả lại thành công nếu không đưa ra tùy chọn sai hay TÊN sai."
 
-#: builtins.c:1182
+#: builtins.c:1172
 msgid ""
 "Shift positional parameters.\n"
 "    \n"
@@ -4054,13 +3816,13 @@ msgid ""
 msgstr ""
 "Dời tham số thuộc vị trí.\n"
 "\n"
-"\tThay đổi tên của tham số thuộc vị trí $N+1,$N+2 ... đến $1,$2 ...\n"
-"\tKhông đưa ra N thì giả sử nó là 1.\n"
+"    Thay đổi tên của tham số vị trí $N+1,$N+2 ... thành $1,$2 ...\n"
+"    N là 1 nếu không xác định.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công nếu N không âm hay lớn hơn $#."
+"    Trạng thái thoát:\n"
+"    Trả lại thành công trừ khi N âm hay lớn hơn $#."
 
-#: builtins.c:1194 builtins.c:1209
+#: builtins.c:1184 builtins.c:1199
 msgid ""
 "Execute commands from a file in the current shell.\n"
 "    \n"
@@ -4073,21 +3835,17 @@ msgid ""
 "    Returns the status of the last command executed in FILENAME; fails if\n"
 "    FILENAME cannot be read."
 msgstr ""
-"Thực thi các câu lệnh từ một tập tin trong trình bao đang chạy.\n"
+"Thực thi lệnh từ tập tin trong shell hiện tại.\n"
 "\n"
-"\tĐọc và thực thi các câu lệnh từ TÊN_TẬP_TIN\n"
-"\ttrong trình bao đang chạy.\n"
-"\tNhững mục nhập trong $PATH được dùng\n"
-"\tđể tìm thư mục chứa tên tập tin này.\n"
-"\tĐưa ra đối số thì mỗi đối số trở thành tham số thuộc vị trí\n"
-"\tkhi TÊN_TẬP_TIN được thực thi.\n"
+"    Đọc và thực thi lệnh từ TẬP-TIN trong shell đang chạy. $PATH được\n"
+"    dùng để tìm thư mục chứa tập tin này. Nếu có đối số thì mỗi đối số\n"
+"    trở thành tham số vị trí khi TẬP-TIN được thực thi.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại trạng thái của câu lệnh cuối cùng được thực thi trong "
-"TÊN_TẬP_TIN;\n"
-"\tkhông thành công nếu không thể đọc TÊN_TẬP_TIN."
+"    Trạng thái thoát:\n"
+"    Trả lại trạng thái của câu lệnh cuối cùng được thực thi trong\n"
+"    TẬP-TIN; không thành công nếu không thể đọc TẬP-TIN."
 
-#: builtins.c:1225
+#: builtins.c:1215
 msgid ""
 "Suspend shell execution.\n"
 "    \n"
@@ -4100,19 +3858,19 @@ msgid ""
 "    Exit Status:\n"
 "    Returns success unless job control is not enabled or an error occurs."
 msgstr ""
-"Ngưng chạy trình bao.\n"
+"Ngưng chạy shell.\n"
 "\n"
-"\tNgưng chạy trình bao này đến khi nó nhận tín hiệu tiếp tục (SIGCONT).\n"
-"\tNếu không ép buộc thì không thể ngưng chạy trình bao kiểu đăng nhập.\n"
+"    Ngưng chạy shell này đến khi nhận tín hiệu SIGCONT. Nếu không ép\n"
+"    buộc thì không thể ngưng chạy shell đăng nhập.\n"
 "\n"
-"\tTùy chọn:\n"
-"\t\t-f\tép buộc việc ngưng, thậm chí nếu trình bao có kiểu đăng nhập\n"
+"    Tùy chọn:\n"
+"    \t-f\tbuộc ngưng, thậm chí với shell đăng nhập\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công nếu chức năng điều khiển công việc đã được bật, và "
-"không gặp lỗi."
+"    Trạng thái thoát:\n"
+"    Trả lại thành công trừ khi chức năng điều khiển công việc không\n"
+"    được bật hoặc gặp lỗi."
 
-#: builtins.c:1241
+#: builtins.c:1231
 msgid ""
 "Evaluate conditional expression.\n"
 "    \n"
@@ -4146,8 +3904,7 @@ msgid ""
 "      -x FILE        True if the file is executable by you.\n"
 "      -O FILE        True if the file is effectively owned by you.\n"
 "      -G FILE        True if the file is effectively owned by your group.\n"
-"      -N FILE        True if the file has been modified since it was last "
-"read.\n"
+"      -N FILE        True if the file has been modified since it was last read.\n"
 "    \n"
 "      FILE1 -nt FILE2  True if file1 is newer than file2 (according to\n"
 "                       modification date).\n"
@@ -4168,8 +3925,7 @@ msgid ""
 "      STRING1 != STRING2\n"
 "                     True if the strings are not equal.\n"
 "      STRING1 < STRING2\n"
-"                     True if STRING1 sorts before STRING2 "
-"lexicographically.\n"
+"                     True if STRING1 sorts before STRING2 lexicographically.\n"
 "      STRING1 > STRING2\n"
 "                     True if STRING1 sorts after STRING2 lexicographically.\n"
 "    \n"
@@ -4194,89 +3950,82 @@ msgid ""
 msgstr ""
 "Định giá biểu thức điều kiện.\n"
 "\n"
-"    Thoát với trạng thái 0 (đúng) hoặc 1 (sai), phụ thuộc vào việc định giá "
-"B_THỨC.\n"
-"    Biểu thức kiểu nguyên phân hoặc nhị phân cũng được.\n"
-"    Biểu thức nguyên phân thường dùng để kiểm tra trạng thái của tập tin.\n"
-"    Cũng có đối số chuỗi, và toán tử so sánh thuộc số.\n"
+"    Thoát với trạng thái 0 (đúng) hoặc 1 (sai), tuỳ kết quả định giá\n"
+"    BTHỨC. Biểu thức có thể kiểu một ngôi hoặc hai ngôi. Biểu thức\n"
+"    một ngôi thường dùng để kiểm tra trạng thái tập tin. Ngoài ra còn\n"
+"    có toán tử chuỗi và so sánh số.\n"
 "    \n"
-"    Cách ứng xử của test còn phụ thuộc vào số đối số. Đọc\n"
-"    sổ tay hướng dẫn của bash để có được mô tả đầy đủ.\n"
+"    Hành vi của test phụ thuộc vào số đối số. Đọc sổ tay hướng dẫn của\n"
+"    bash để có mô tả đầy đủ.\n"
 "    \n"
 "    Toán tử tập tin:\n"
 "    \n"
-"        -a TẬP_TIN        Đúng nếu tập tin có phải tồn tại.\n"
-"        -b TẬP_TIN        Đúng nếu tập tin là khối đặc biệt .\n"
-"        -c TẬP_TIN        Đúng nếu tập tin là đặc biệt về ký tự.\n"
-"        -d TẬP_TIN        Đúng nếu tập tin là một thư mục.\n"
-"        -e TẬP_TIN        Đúng nếu tập tin có phải tồn tại.\n"
-"        -f TẬP_TIN        Đúng nếu tập tin có phải tồn tại và là tệp tin "
-"thường\n"
-"        -g TẬP_TIN        Đúng nếu tập tin là set-group-id (đặt mã số "
-"nhóm).\n"
-"        -h TẬP_TIN        Đúng nếu tập tin là một liên kết tượng trưng.\n"
-"        -L TẬP_TIN        Đúng nếu tập tin là một liên kết tượng trưng.\n"
-"        -k TẬP_TIN        Đúng nếu tập tin có bit `dính' được đặt.\n"
-"        -p TẬP_TIN        Đúng nếu tập tin là một ống dẫn đặt tên.\n"
-"        -r TẬP_TIN        Đúng nếu tập tin cho bạn đọc được.\n"
-"        -s TẬP_TIN        Đúng nếu tập tin có phải tồn tại và không phải "
-"rỗng.\n"
-"        -S TẬP_TIN        Đúng nếu tập tin là một ổ cắm.\n"
-"        -t FD          Đúng nếu FD (bộ mô tả tập tin) được mở trên thiết bị "
-"cuối.\n"
-"        -u TẬP_TIN        Đúng nếu tập tin is set-user-id.\n"
-"        -w TẬP_TIN        Đúng nếu tập tin cho bạn ghi vào được.\n"
-"        -x TẬP_TIN        Đúng nếu tập tin cho bạn thực thi được.\n"
-"        -O TẬP_TIN        Đúng nếu tập tin được bạn sở hữu một cách hiệu "
-"quả.\n"
-"        -G TẬP_TIN        Đúng nếu tập tin được nhóm của bạn sở hữu\n"
-"\t\t\t\t\tmột cách hiệu quả.\n"
-"        -N TẬP_TIN        Đúng nếu tập tin đã bị sửa đổi kể từ lần đọc cuối "
-"cùng.\n"
-"    \n"
-"      TẬP_TIN1 -nt TẬP_TIN2  Đúng nếu tập tin 1 mới hơn tập tin 2\n"
-"\t\t(dựa theo ngày sửa đổi)\n"
-"    \n"
-"      TẬP_TIN1 -ot TẬP_TIN2  Đúng nếu tập tin 1 cũ hơn tập tin 2.\n"
-"    \n"
-"      TẬP_TIN1 -ef TẬP_TIN2  Đúng nếu tập tin 1 là một liên kết cứng tới tập "
-"tin 2.\n"
+"      -a TẬP-TIN       Đúng nếu tập tin tồn tại.\n"
+"      -b TẬP-TIN       Đúng nếu tập tin là đặc biệt khối.\n"
+"      -c TẬP-TIN       Đúng nếu tập tin là đặc biệt ký tự.\n"
+"      -d TẬP-TIN       Đúng nếu tập tin là thư mục.\n"
+"      -e TẬP-TIN       Đúng nếu tập tin tồn tại.\n"
+"      -f TẬP-TIN       Đúng nếu tập tin tồn tại và là tập tin thường\n"
+"      -g TẬP-TIN       Đúng nếu tập tin là set-group-id.\n"
+"      -h TẬP-TIN       Đúng nếu tập tin là liên kết tượng trưng.\n"
+"      -L TẬP-TIN       Đúng nếu tập tin là liên kết tượng trưng.\n"
+"      -k TẬP-TIN       Đúng nếu tập tin có bit `sticky'.\n"
+"      -p TẬP-TIN       Đúng nếu tập tin là ống dẫn có tên.\n"
+"      -r TẬP-TIN       Đúng nếu tập tin đọc được (bởi bạn).\n"
+"      -s TẬP-TIN       Đúng nếu tập tin tồn tại và khác rỗng.\n"
+"      -S TẬP-TIN       Đúng nếu tập tin là socket.\n"
+"      -t FD            Đúng nếu FD được mở trên thiết bị cuối.\n"
+"      -u TẬP-TIN       Đúng nếu tập tin là set-user-id.\n"
+"      -w TẬP-TIN       Đúng nếu tập tin ghi được (bởi bạn).\n"
+"      -x TẬP-TIN       Đúng nếu tập tin chạy được (bởi bạn).\n"
+"      -O TẬP-TIN       Đúng nếu tập tin thực tế được bạn sở hữu.\n"
+"      -G TẬP-TIN       Đúng nếu tập tin thực tế được nhóm của bạn sở hữu.\n"
+"      -N TẬP-TIN       Đúng nếu tập tin đã bị sửa đổi từ lần đọc cuối.\n"
+"    \n"
+"      TẬP-TIN1 -nt TẬP-TIN2\n"
+"                       Đúng nếu tập tin 1 mới hơn tập tin 2 (dựa theo\n"
+"                       ngày sửa đổi)\n"
+"    \n"
+"      TẬP-TIN1 -ot TẬP-TIN2\n"
+"                       Đúng nếu tập tin 1 cũ hơn tập tin 2.\n"
+"    \n"
+"      TẬP-TIN1 -ef TẬP-TIN2\n"
+"                       Đúng nếu tập tin 1 là liên kết cứng tới tập tin 2.\n"
 "    \n"
 "    Toán tử chuỗi:\n"
 "    \n"
-"        -z CHUỖI      Đúng nếu chuỗi rỗng.\n"
+"      -z CHUỖI         Đúng nếu chuỗi rỗng.\n"
 "    \n"
-"        -n CHUỖI\n"
-"        CHUỖI         Đúng nếu chuỗi không rỗng.\n"
+"      -n CHUỖI\n"
+"      CHUỖI            Đúng nếu chuỗi khác rỗng.\n"
 "    \n"
-"        CHUỖI1 = CHUỖI2\t\tĐúng nếu hai chuỗi trùng nhau.\n"
-"        CHUỖI1 != CHUỖI2\tĐúng nếu hai chuỗi khác nhau.\n"
-"        CHUỖI1 < CHUỖI2\t\tĐúng nếu CHUỖI1 sắp xếp đằng trước CHUỖI2\n"
-"\t\t\t\t\t\ttheo thứ tự từ điển.\n"
-"        CHUỖI1 > CHUỖI2\t\tĐúng nếu CHUỖI1 sắp xếp đằng sau CHUỖI2\n"
-"\t\t\t\t\t\ttheo thứ tự từ điển.\n"
+"      CHUỖI1 = CHUỖI2  Đúng nếu hai chuỗi trùng nhau.\n"
+"      CHUỖI1 != CHUỖI2 Đúng nếu hai chuỗi khác nhau.\n"
+"      CHUỖI1 < CHUỖI2  Đúng nếu CHUỖI1 xếp trước CHUỖI2 theo thứ tự từ điển.\n"
+"      CHUỖI1 > CHUỖI2  Đúng nếu CHUỖI1 xếp sau CHUỖI2 theo thứ tự từ điển.\n"
 "    \n"
 "    Toán tử khác:\n"
 "    \n"
-"        -o TÙY_CHỌN      Đúng nếu tùy chọn trình bao này đã được bật.\n"
-"        -v BIẾN\t Đúng nếu BIẾN được đặt\n"
-"        ! B_THỨC         Đúng nếu biểu thức này không đúng.\n"
-"        B_THỨC1 -a B_THỨC2 \t\tĐúng nếu cả hai biểu thức này là đúng.\n"
-"        B_THỨC1 -o B_THỨC2 \t\tĐúng nếu một của hai biểu thức này là đúng.\n"
-"    \n"
-"        đối_số1 OP đối_số2   \t\tPhép thử số học. OP là một của:\n"
-"\t\t-eq\t\tbằng\n"
-"\t\t-ne\t\tkhông bằng\n"
-"             \t-lt\t\tnhỏ hơn\n"
-"\t\t-le\t\tnhỏ hơn hoặc bằng\n"
-"\t\t-gt\t\tlớn hơn\n"
-"\t\t-ge\t\tlớn hơn hoặc bằng\n"
-"\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công nếu B_THỨC định giá là Đúng;\n"
-"\tkhông thành công nếu B_THỨC định giá thành Sai hay đối số được chỉ ra sai."
-
-#: builtins.c:1321
+"      -o TÙY_CHỌN      Đúng nếu tùy chọn shell này được bật.\n"
+"      -v BIẾN          Đúng nếu BIẾN được đặt\n"
+"      ! BTHỨC         Đúng nếu biểu thức này không đúng.\n"
+"      BTHỨC1 -a BTHỨC2\n"
+"                       Đúng nếu cả hai biểu thức là đúng.\n"
+"      BTHỨC1 -o BTHỨC2\n"
+"                       Đúng nếu một của hai biểu thức đúng.\n"
+"    \n"
+"      ĐỐI-SỐ1 OP ĐỐI-SỐ2\n"
+"                       Phép thử số học. OP là một trong -eq, -ne,\n"
+"                       -lt, -le, -gt, or -ge.\n"
+"    \n"
+"    Phép toán số học hai ngôi trả về đúng nếu ĐỐI-SỐ1 bằng, khác, nhỏ\n"
+"    hơn, nhỏ hơn hoặc bằng, lớn hơn, lớn hơn hoặc bằng ĐỐI-SỐ2.\n"
+"\n"
+"    Trạng thái thoát:\n"
+"    Trả lại thành công nếu BTHỨC định giá là Đúng; không thành công\n"
+"    nếu BTHỨC định giá thành Sai hay đối số được chỉ ra sai."
+
+#: builtins.c:1311
 msgid ""
 "Evaluate conditional expression.\n"
 "    \n"
@@ -4285,16 +4034,14 @@ msgid ""
 msgstr ""
 "Định giá biểu thức điều kiện.\n"
 "\n"
-"\tĐây là một từ đồng nghĩa với dựng sẵn « test »,\n"
-"\tnhưng đối số cuối cùng phải là một « ] » nghĩa chữ,\n"
-"\tđổ tương ứng với « [ » mở."
+"    Lệnh này đồng nghĩa với lệnh dựng sẵn \"test\", nhưng đối số cuối\n"
+"    cùng phải là ký tự `]' để khớp với `[' ở đầu."
 
-#: builtins.c:1330
+#: builtins.c:1320
 msgid ""
 "Display process times.\n"
 "    \n"
-"    Prints the accumulated user and system times for the shell and all of "
-"its\n"
+"    Prints the accumulated user and system times for the shell and all of its\n"
 "    child processes.\n"
 "    \n"
 "    Exit Status:\n"
@@ -4302,18 +4049,17 @@ msgid ""
 msgstr ""
 "Hiển thị thời lượng chạy tiến trình.\n"
 "\n"
-"\tIn ra thời lượng chạy trình bao (và các tiến trình con)\n"
-"\t\tđối với hệ thống và mỗi người dùng.\n"
+"    In thời lượng chạy ở mức người dùng và hệ thống của shell và các\n"
+"    tiến trình con.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tLúc nào cũng thành công."
+"    Trạng thái thoát:\n"
+"    Lúc nào cũng thành công."
 
-#: builtins.c:1342
+#: builtins.c:1332
 msgid ""
 "Trap signals and other events.\n"
 "    \n"
-"    Defines and activates handlers to be run when the shell receives "
-"signals\n"
+"    Defines and activates handlers to be run when the shell receives signals\n"
 "    or other conditions.\n"
 "    \n"
 "    ARG is a command to be read and executed when the shell receives the\n"
@@ -4322,80 +4068,62 @@ msgid ""
 "    value.  If ARG is the null string each SIGNAL_SPEC is ignored by the\n"
 "    shell and by the commands it invokes.\n"
 "    \n"
-"    If a SIGNAL_SPEC is EXIT (0) ARG is executed on exit from the shell.  "
-"If\n"
-"    a SIGNAL_SPEC is DEBUG, ARG is executed before every simple command.  "
-"If\n"
-"    a SIGNAL_SPEC is RETURN, ARG is executed each time a shell function or "
-"a\n"
-"    script run by the . or source builtins finishes executing.  A "
-"SIGNAL_SPEC\n"
-"    of ERR means to execute ARG each time a command's failure would cause "
-"the\n"
+"    If a SIGNAL_SPEC is EXIT (0) ARG is executed on exit from the shell.  If\n"
+"    a SIGNAL_SPEC is DEBUG, ARG is executed before every simple command.  If\n"
+"    a SIGNAL_SPEC is RETURN, ARG is executed each time a shell function or a\n"
+"    script run by the . or source builtins finishes executing.  A SIGNAL_SPEC\n"
+"    of ERR means to execute ARG each time a command's failure would cause the\n"
 "    shell to exit when the -e option is enabled.\n"
 "    \n"
-"    If no arguments are supplied, trap prints the list of commands "
-"associated\n"
+"    If no arguments are supplied, trap prints the list of commands associated\n"
 "    with each signal.\n"
 "    \n"
 "    Options:\n"
 "      -l\tprint a list of signal names and their corresponding numbers\n"
 "      -p\tdisplay the trap commands associated with each SIGNAL_SPEC\n"
 "    \n"
-"    Each SIGNAL_SPEC is either a signal name in <signal.h> or a signal "
-"number.\n"
+"    Each SIGNAL_SPEC is either a signal name in <signal.h> or a signal number.\n"
 "    Signal names are case insensitive and the SIG prefix is optional.  A\n"
 "    signal may be sent to the shell with \"kill -signal $$\".\n"
 "    \n"
 "    Exit Status:\n"
-"    Returns success unless a SIGSPEC is invalid or an invalid option is "
-"given."
+"    Returns success unless a SIGSPEC is invalid or an invalid option is given."
 msgstr ""
-"Bắt các tín hiệu và sự kiện khác.\n"
-"\n"
-"\tĐịnh nghĩa và kích hoạt các bộ xử lý cần chạy khi trình bao\n"
-"\tnhận được tín hiệu hay điều kiện khác.\n"
-"\n"
-"\tĐỐI_SỐ là một câu lệnh cần đọc và thực thi khi trình bao\n"
-"\tnhận được (các) tín hiệu ĐẶC_TẢ_TÍN_HIỆU. Nếu không đưa ra ĐỐI_SỐ\n"
-"\t(và cung cấp chỉ một ĐẶC_TẢ_TÍN_HIỆU riêng lẻ),\n"
-"\thoặc đưa ra `-', mỗi tín hiệu được ghi rõ thì được đặt lại về giá trị "
-"gốc.\n"
-"\tNếu ĐỐI_SỐ là chuỗi vô giá trị thì mỗi ĐẶC_TẢ_TÍN_HIỆU bị bỏ qua\n"
-"\tbởi trình bao và những câu lệnh nó gọi.\n"
-"\n"
-"\tNếu đưa ra một ĐẶC_TẢ_TÍN_HIỆU là EXIT (0), thì ĐỐI_SỐ được thực thi khi "
-"thoát khỏi trình bao.\n"
-"\tNếu đưa ra một ĐẶC_TẢ_TÍN_HIỆU là DEBUG, ĐỐI_SỐ được thực thi đằng trước "
-"mỗi câu lệnh đơn giản.\n"
-"   Nếu đưa ra một ĐẶC_TẢ_TÍN_HIỆU là RETURN, ĐỐI_SỐ được thực thi mỗi khi "
-"hàm của shell hay một\n"
-"    script được chạy . hoặc nguồn builtins kết thúc việc thi hành.  "
-"ĐẶC_TẢ_TÍN_HIỆU\n"
-"    của ERR nghĩa là thực thi ĐỐI_SỐ mỗi khi lệnh gặp lỗi để\n"
-"    thoát ra khi tùy chọn -e được bật.\n"
-"    \n"
-"    \n"
-"    Nếu không có đối số nào được áp dụng, bẫy sẽ in ra danh sách của các "
-"lệnh có liên đới\n"
-"    đến từ tín hiệu.\n"
-"    \n"
-"\tTùy chọn:\n"
-"\t\t-l\tin ra danh sách các tên tín hiệu và số thứ tự tương ứng\n"
-"\t\t-p\thiển thị các câu lệnh bắt tương ứng với mỗi ĐẶC_TẢ_TÍN_HIỆU\n"
-"\n"
-"\tMỗi ĐẶC_TẢ_TÍN_HIỆU là hoặc một tên tín hiệu trong <signal.h>,\n"
-"\thoặc một số thứ tự tín hiệu.\n"
-"\tTên tín hiệu không phân biệt chữ hoa/thường,\n"
-"\tvà không bắt buộc phải dùng tiền tố « SIG ».\n"
-"\tCó thể gửi cho trình bao một tín hiệu,\n"
-"\tdùng « kill -signal $$ ».\n"
-"\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công trừ phi đưa ra ĐẶC_TẢ_TÍN_HIỆU sai\n"
-"\thay tùy chọn sai."
-
-#: builtins.c:1378
+"Bẫy tín hiệu và sự kiện khác.\n"
+"\n"
+"    Định nghĩa và kích hoạt các bộ xử lý khi shell nhận được tín hiệu\n"
+"    hay các điều kiện khác.\n"
+"\n"
+"    ĐỐI-SỐ là một lệnh cần đọc và thực thi khi shell nhận được tín\n"
+"    hiệu theo đặc tả tín hiệu ĐTTH. Nếu không có ĐỐI-SỐ (và chỉ cung\n"
+"    cấp một ĐTTH), hoặc cung cấp `-', mỗi tín hiệu được xác định thì\n"
+"    được đặt lại về giá trị gốc. Nếu ĐỐI-SỐ là chuỗi rỗng thì mỗi ĐTTH\n"
+"    bị shell và những lệnh bên trong bỏ qua.\n"
+"\n"
+"    Nếu ĐTTH là EXIT (0) thì ĐỐI-SỐ được thực thi khi thoát\n"
+"    khỏi shell. Nếu là DEBUG, ĐỐI-SỐ được thực thi trước mỗi lệnh đơn\n"
+"    giản. Nếu là RETURN, ĐỐI-SỐ được thực thi mỗi khi hàm shell hay\n"
+"    một văn lệnh, được chạy bởi lệnh `.' hoặc 'source', kết thúc thực\n"
+"    thi. ĐTTH ERR nghĩa là thực thi ĐỐI-SỐ mỗi khi lệnh gặp\n"
+"    lỗi dẫn đến thoát shell khi bật tùy chọn -e.\n"
+"    \n"
+"    Nếu không có đối số, `trap' sẽ in danh sách của các lệnh gắn với\n"
+"    các tín hiệu.\n"
+"    \n"
+"    Tùy chọn:\n"
+"      -l\tin danh sách tên tín hiệu và mã số tương ứng\n"
+"      -p\thiển thị lệnh bắt tương ứng với mỗi ĐTTH\n"
+"\n"
+"    Mỗi ĐTTH hoặc là tên tín hiệu trong <signal.h>, hoặc mã\n"
+"    số tín hiệu. Tên tín hiệu không phân biệt chữ hoa/thường, và không\n"
+"    bắt buộc phải dùng tiền tố SIG. Có thể gửi tín hiệu cho shell bằng\n"
+"    \"kill -signal $$\".\n"
+"\n"
+"    Trạng thái thoát:\n"
+"    Trả lại thành công trừ phi đưa ra ĐTTH sai hay tùy chọn\n"
+"    sai."
+
+#: builtins.c:1368
 msgid ""
 "Display information about command type.\n"
 "    \n"
@@ -4421,46 +4149,40 @@ msgid ""
 "      NAME\tCommand name to be interpreted.\n"
 "    \n"
 "    Exit Status:\n"
-"    Returns success if all of the NAMEs are found; fails if any are not "
-"found."
+"    Returns success if all of the NAMEs are found; fails if any are not found."
 msgstr ""
-"Hiển thị thông tin về kiểu câu lệnh.\n"
-"\n"
-"\tĐối với mỗi TÊN, ngụ ý nó sẽ được giải thích như thế nào\n"
-"\t\tnếu nó được dùng dưới dạng một tên câu lệnh.\n"
-"\n"
-"\tTùy chọn:\n"
-"\t\t-a\thiển thị mọi vị trí chứa tập tin thực thi được có TÊN;\n"
-"\t\t\tkhông đặt tùy chọn « -p » thì cũng bao gồm\n"
-"\t\t\tcác bí danh, dựng sẵn và chức năng.\n"
-"\t\t-f\tthu hồi tính năng dò tìm chức năng trình bao\n"
-"\t\t-P\tép buộc tìm kiếm ĐƯỜNG_DẪN đối với mỗi TÊN,\n"
-"\t\t\tthậm chí nếu nó là bí danh, dựng sẵn hay chức năng,\n"
-"\t\t\tvà trả lại tên của tập tin trên đĩa mà sẽ được thực thi\n"
-"\t\t-p\ttrả lại hoặc tên của tập tin trên đĩa mà sẽ được thực thi,\n"
-"\t\t\thoặc không trả lại gì nếu câu lệnh « type -t TÊN »\n"
-"\t\t\tsẽ không trả lại « file » (tập tin).\n"
-"\t\t-t\txuất một từ riêng lẻ mà một của:\n"
-"\t\t\t• alias\tbí danh\n"
-"\t\t\t• keyword\ttừ dành riêng của trình bao\n"
-"\t\t\t• function\tchức năng của trình bao\n"
-"\t\t\t• builtin\tdựng sẵn của trình bao\n"
-"\t\t\t• file\ttập tin trên đĩa\n"
-"\t\t\t• \t\t(không gì) không tìm thấy\n"
-"\n"
-"\tĐối số :\n"
-"\tTÊN\ttên câu lệnh cần giải thích.\n"
-"\n"
-"\tTráng thái thoát:\n"
-"\tTrả lại thành công nếu tìm thấy tất cả các TÊN; không thì bị lỗi."
-
-#: builtins.c:1409
-#, fuzzy
+"Hiển thị thông tin loại câu lệnh.\n"
+"\n"
+"    Đối với mỗi TÊN, chỉ ra cách thông dịch lệnh khi được thực thi\n"
+"    theo tên lệnh.\n"
+"\n"
+"    Tùy chọn:\n"
+"      -a\thiển thị mọi vị trí chứa tập tin thực thi được có TÊN;\n"
+"        \tkhông đặt tùy chọn `-p' thì bao gồm các bí danh, lệnh\n"
+"        \tdựng sẵn và hàm.\n"
+"      -f\tngăn tra cứu hàm shell\n"
+"      -P\tbuộc tìm kiếm PATH đối với mỗi TÊN, thậm chí nếu nó là\n"
+"        \tbí danh, lệnh dựng sẵn hay hàm, và trả lại tên của tập\n"
+"        \ttin trên đĩa mà sẽ được thực thi\n"
+"      -p\ttrả về hoặc tên của tập tin trên đĩa mà sẽ được thực\n"
+"    \t\tthi, hoặc gì cả `type -t TÊN' sẽ không trả về `file'\n"
+"    \t\t(tập tin).\n"
+"        -t\txuất một trong những từ đơn `alias', `keyword', `function',\n"
+"        \t`builtin', `file' hoặc `', nếu TÊN tương ứng là bí danh,\n"
+"        \ttừ khoá shell, hàm shell, lệnh shell dựng sẵn, tập tin\n"
+"        \ttrên đĩa, hoặc không tìm thấy.\n"
+"\n"
+"    Đối số:\n"
+"      TÊN\ttên câu lệnh cần giải thích.\n"
+"\n"
+"    Trạng thái thoát:\n"
+"    Trả lại thành công nếu tìm thấy tất cả các TÊN; không thì bị lỗi."
+
+#: builtins.c:1399
 msgid ""
 "Modify shell resource limits.\n"
 "    \n"
-"    Provides control over the resources available to the shell and "
-"processes\n"
+"    Provides control over the resources available to the shell and processes\n"
 "    it creates, on systems that allow such control.\n"
 "    \n"
 "    Options:\n"
@@ -4484,9 +4206,6 @@ msgid ""
 "      -u\tthe maximum number of user processes\n"
 "      -v\tthe size of virtual memory\n"
 "      -x\tthe maximum number of file locks\n"
-"      -T    the maximum number of threads\n"
-"    \n"
-"    Not all options are available on all platforms.\n"
 "    \n"
 "    If LIMIT is given, it is the new value of the specified resource; the\n"
 "    special LIMIT values `soft', `hard', and `unlimited' stand for the\n"
@@ -4501,52 +4220,46 @@ msgid ""
 "    Exit Status:\n"
 "    Returns success unless an invalid option is supplied or an error occurs."
 msgstr ""
-"Sửa đổi các giới hạn tài nguyên trình bao.\n"
-"\n"
-"\tCung cấp điều khiển với các tài nguyên sẵn sàng\n"
-"\tcho trình bao và các tiến trình được nó tạo,\n"
-"\ttrên hệ thống cho phép điều khiển như vậy.\n"
-"\n"
-"\tTùy chọn:\n"
-"\t\t-S\tdùng giới hạn tài nguyên « soft » (mềm)\n"
-"\t\t-H\tdùng giới hạn tài nguyên « hard » (cứng)\n"
-"\t\t-a\tthông báo mọi giới hạn hiện thời\n"
-"\t\t-b\tkích cỡ của vùng đệm ổ cắm\n"
-"\t\t-c\tkích cỡ tối đa của tập tin lõi được tạo\n"
-"\t\t-d\tkích cỡ tối đa của từng đoạn dữ liệu của một tiến trình\n"
-"\t\t-e\tmức ưu tiên cao nhất khi định thời (« nice »)\n"
-"\t\t-f\tkích cỡ tối đa của của tập tin được ghi bởi trình bao\n"
-"\t\t\tvà các tiến trình con của nó\n"
-"\t\t-i\tsố tối đa các tín hiệu bị hoãn\n"
-"\t\t-l\tkích cỡ tối đa mà một tiến trình có thể khoá vào bộ nhớ\n"
-"\t\t-m\tkích cỡ tối đa của tập hợp nội trú\n"
-"\t\t-n\tsố tối đa các bộ mô tả tập tin còn mở\n"
-"\t\t-p\tkích cỡ của vùng đệm ống dẫn\n"
-"\t\t-q\tsố tối đa các byte trong hàng đợi thông điệp POSIX\n"
-"\t\t-r\tmức ưu tiên cao nhất khi định thời thật\n"
-"\t\t-s\tkích cỡ tối đa của đống\n"
-"\t\t-t\tthời gian CPU lâu nhất, theo giây\n"
-"\t\t-u\tsố tối đa các tiến trình của người dùng\n"
-"\t\t-v\tkích cỡ của bộ nhớ ảo\n"
-"\t\tsố tối đa các khoá tập tin\n"
-"\n"
-"\tNếu đưa ra GIỚI_HẠN thì nó là giá trị mới của tài nguyên được ghi rõ ;\n"
-"\tcũng có ba giá trị GIỚI_HẠN đặc biệt:\n"
-"\t\t• soft\tgiới hạn mềm hiện thời\n"
-"\t\t• hard\tgiới hạn cứng hiện thời\n"
-"\t\t• unlimited\tvô hạn\n"
-"\tKhông thì in ra giá trị hiện thời của tài nguyên được ghi rõ.\n"
-"\tKhông đưa ra tùy chọn thì giả sử « -f ».\n"
-"\n"
-"\tGiá trị được ghi rõ theo bước 1024-byte, trừ :\n"
-"\t\t• -t\ttheo giây\n"
-"\t\t• -p\ttheo bước 512-byte\n"
-"\t\t• -u\tsố các tiến trình không theo tỷ lệ\n"
-"\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công nếu không đưa ra tùy chọn sai hay gặp lỗi."
-
-#: builtins.c:1457
+"Sửa đổi giới hạn tài nguyên shell.\n"
+"\n"
+"    Điều khiển tài nguyên của shell và các tiến trình nó tạo ra, trên\n"
+"    hệ thống hỗ trợ điểu khiển tài nguyên như vậy.\n"
+"\n"
+"    Tùy chọn:\n"
+"      -S\tdùng giới hạn tài nguyên `soft' (mềm)\n"
+"      -H\tdùng giới hạn tài nguyên `hard' (cứng)\n"
+"      -a\tthông báo mọi giới hạn hiện thời\n"
+"      -b\tkích cỡ của vùng đệm socket\n"
+"      -c\tkích cỡ tối đa của tập tin core được tạo\n"
+"      -d\tkích cỡ tối đa của từng đoạn dữ liệu của một tiến trình\n"
+"      -e\tmức ưu tiên lập lịch cao nhất (`nice')\n"
+"      -f\tkích cỡ tập tin tối đa được ghi bởi shell và tiến trình con\n"
+"      -i\tsố tín hiệu bị hoãn tối đa\n"
+"      -l\tkích cỡ tối đa mà tiến trình có thể khoá vào bộ nhớ\n"
+"      -m\tkích cỡ tập nội trú (RSS) tối đa\n"
+"      -n\tsố bộ mô tả tập tin tối đa được mở\n"
+"      -p\tkích thước vùng đệm ống dẫn\n"
+"      -q\tsố byte tối đa trong hàng đợi thông điệp POSIX\n"
+"      -r\tmức ưu lập lịch thời gian thực cao nhất\n"
+"      -s\tkích thước ngăn xếp tối đa\n"
+"      -t\tlượng thời gian cpu tối đa theo giây\n"
+"      -u\tsố tiến trình người dùng tối đa\n"
+"      -v\tkích cỡ của bộ nhớ ảo\n"
+"      -x\tsố khoá tập tin tối đa\n"
+"\n"
+"    Nếu có GIỚI_HẠN thì nó là giá trị mới của tài nguyên được ghi. Ba\n"
+"    giá trị GIỚI_HẠN đặc biệt `soft', `hard' và `unlimited' tương ứng\n"
+"    là giới hạn mềm hiện tại, giới hạn cứng hiện tại và không giới\n"
+"    hạn. Không có thì in giá trị hiện thời của tài nguyên được ghi.\n"
+"    Ngầm định `-f' nếu không xác định tuỳ chọn.\n"
+"\n"
+"    Giá trị tính theo khối 1024 byte, trừ -t tính theo giây, -p theo\n"
+"    khối 512 byte và -u theo số tiến trình.\n"
+"\n"
+"    Trạng thái thoát:\n"
+"    Trả lại thành công nếu không đưa ra tùy chọn sai hay gặp lỗi."
+
+#: builtins.c:1444
 msgid ""
 "Display or set file mode mask.\n"
 "    \n"
@@ -4565,53 +4278,47 @@ msgid ""
 msgstr ""
 "Hiển thị hoặc đặt mặt nạ chế độ tập tin.\n"
 "\n"
-"\tĐặt mặt nạ (bộ lọc) tạo tập tin của người dùng thành CHẾ_ĐỘ.\n"
-"\t\tKhông đưa ra CHẾ_ĐỘ thì in ra giá trị hiện thời của mặt nạ.\n"
+"    Đặt mặt nạ tạo tập tin của người dùng thành CHẾ_ĐỘ. Không tham số\n"
+"    thì in chế độ hiện thời.\n"
 "\n"
-"\tNếu CHẾ_ĐỘ bắt đầu với một chữ số, nó được đọc là một số bát phân;\n"
-"\t\tkhông thì nó là một chuỗi chế độ tượng trưng\n"
-"\t\tgiống như chuỗi được chmod(1) chấp nhận.\n"
+"    Nếu CHẾ_ĐỘ bắt đầu bằng chữ số thì hiểu là số bát phân; không thì\n"
+"    nó là chuỗi chế độ tượng trưng được chmod(1) chấp nhận.\n"
 "\n"
-"\tTùy chọn:\n"
-"\t\t-p\tkhông đưa ra CHẾ_ĐỘ thì xuất theo một định dạng\n"
-"\t\t\tcó thể được dùng lại làm dữ liệu nhập vào\n"
-"\t\t-S\tlàm cho kết xuất cũng tượng trưng,\n"
-"\t\t\tkhông thì xuất một số bát phân\n"
+"    Tùy chọn:\n"
+"      -p\tkhông có CHẾ_ĐỘ thì xuất theo định dạng dùng lại\n"
+"        \tlàm dữ liệu nhập được\n"
+"      -S\tin kết xuất tượng trưng thay vì bát phân\n"
 "\n"
-"\tTráng thái thoát:\n"
-"\tTrả lại thành công nếu không có CHẾ_ĐỘ sai hay tùy chọn sai."
+"    Trạng thái thoát:\n"
+"    Trả lại thành công nếu không có CHẾ_ĐỘ sai hay tùy chọn sai."
 
-#: builtins.c:1477
-#, fuzzy
+#: builtins.c:1464
 msgid ""
 "Wait for job completion and return exit status.\n"
 "    \n"
-"    Waits for each process identified by an ID, which may be a process ID or "
-"a\n"
+"    Waits for the process identified by ID, which may be a process ID or a\n"
 "    job specification, and reports its termination status.  If ID is not\n"
 "    given, waits for all currently active child processes, and the return\n"
-"    status is zero.  If ID is a a job specification, waits for all "
-"processes\n"
-"    in that job's pipeline.\n"
+"    status is zero.  If ID is a a job specification, waits for all processes\n"
+"    in the job's pipeline.\n"
 "    \n"
 "    Exit Status:\n"
-"    Returns the status of the last ID; fails if ID is invalid or an invalid\n"
-"    option is given."
+"    Returns the status of ID; fails if ID is invalid or an invalid option is\n"
+"    given."
 msgstr ""
-"Đợi công việc chạy xong, sau đó trả lại trạng thái thoát.\n"
+"Chờ công việc chạy xong và trả về trạng thái thoát.\n"
 "\n"
-"\tĐợi tiến trình được ID nhận diện, mà có thể là một mã số tiến trình\n"
-"\t\thay một đặc tả công việc, sau đó trả lại trạng thái chấm dứt của nó.\n"
-"\t\tKhông đưa ra ID thì đợi tất cả các tiến trình con đang chạy,\n"
-"\t\tvà trạng thái trả lại là số không.\n"
-"\t\tNếu ID là một đặc tả công việc thì đợi tất cả các tiến trình\n"
-"\t\tvẫn nằm trong ống dẫn của công việc đó.\n"
+"    Đợi tiến trình xác định bởi ID, có thể là mã số tiến trình hay đặc\n"
+"    tả công việc, sau đó trả về trạng thái kết thúc của nó. Không có\n"
+"    ID thì đợi tất cả các tiến trình con đang chạy và trạng thái trả\n"
+"    về là không. Nếu ID là đặc tả công việc thì đợi tất cả các tiến\n"
+"    trình vẫn nằm trong ống dẫn của công việc đó.\n"
 "\n"
-"\tTráng thái thoát:\n"
-"\tTrả lại trạng thái của ID; không thành công nếu ID sai\n"
-"\t\thoặc đưa ra tùy chọn sai."
+"    Trạng thái thoát:\n"
+"    Trả lại trạng thái của ID; không thành công nếu ID sai hoặc đưa\n"
+"    ra tùy chọn sai."
 
-#: builtins.c:1495
+#: builtins.c:1482
 msgid ""
 "Wait for process completion and return exit status.\n"
 "    \n"
@@ -4620,25 +4327,20 @@ msgid ""
 "    and the return code is zero.  PID must be a process ID.\n"
 "    \n"
 "    Exit Status:\n"
-"    Returns the status of ID; fails if ID is invalid or an invalid option "
-"is\n"
+"    Returns the status of ID; fails if ID is invalid or an invalid option is\n"
 "    given."
 msgstr ""
-"Đợi tiến trình chạy xong, sau đó thông báo trạng thái thoát của nó.\n"
+"Đợi tiến trình chạy xong và trả về trạng thái thoát.\n"
 "\n"
-"\tĐợi tiến trình đã ghi rõ,\n"
-"\tsau đó thông báo trạng thái chấm dứt của nó.\n"
-"\tNếu không đưa ra PID (mã số tiến trình)\n"
-"\tthì đợi tất cả các tiến trình con đang chạy,\n"
-"\tvà mã trả lại là số không.\n"
-"\tPID phải là một mã số tiến trình.\n"
+"    Đợi tiến trình xác định chạy xong và trả về trạng thái kết thúc\n"
+"    của nó. Nếu không có PID thì đợi tất cả các tiến trình con đang\n"
+"    chạy, và mã về mã không. PID phải là mã số tiến trình.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại trạng thái của ID (mã số);\n"
-"\tkhông thành công nếu ID sai,\n"
-"\thoặc nếu đưa ra tùy chọn sai."
+"    Trạng thái thoát:\n"
+"    Trả lại trạng thái của ID; không thành công nếu ID sai, hoặc nếu\n"
+"    đưa ra tùy chọn sai."
 
-#: builtins.c:1510
+#: builtins.c:1497
 msgid ""
 "Execute commands for each member in a list.\n"
 "    \n"
@@ -4650,19 +4352,16 @@ msgid ""
 "    Exit Status:\n"
 "    Returns the status of the last command executed."
 msgstr ""
-"Thực thi câu lệnh cho mỗi bộ phận trong một danh sách.\n"
+"Thực thi lệnh cho mỗi phần tử của danh sách.\n"
 "\n"
-"\tVòng lặp « for » (cho) thì thực thi câu lệnh\n"
-"\tcho mỗi bộ phận trong một danh sách các mục.\n"
-"\tKhông đưa ra « in CÁC_TỪ ... » thì giả sử « in \"$@\" ».\n"
-"\tĐối với mỗi phần tử trong CÁC_TỪ,\n"
-"\tTÊN được đặt thành phần tử đó,\n"
-"\tvà các câu LỆNH được thực thi.\n"
+"    Vòng lặp `for' thực thi lệnh cho mỗi phần tử của danh sách. Không\n"
+"    ghi `in TỪ ...' thì ngầm định `in \"$@\"'. Đối với mỗi phần tử trong\n"
+"    danh sách, đặt giá trị phần tử đó cho biến TÊN rồi thực thi LỆNH.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại trạng thái của câu lệnh cuối cùng được chạy."
+"    Trạng thái thoát:\n"
+"    Trả lại trạng thái của câu lệnh cuối cùng được chạy."
 
-#: builtins.c:1524
+#: builtins.c:1511
 msgid ""
 "Arithmetic for loop.\n"
 "    \n"
@@ -4680,18 +4379,19 @@ msgid ""
 msgstr ""
 "Số học cho vòng lặp.\n"
 "\n"
-"\tTương đương với:\n"
-"    \t(( EXP1 ))\n"
-"    \twhile (( EXP2 )); do\n"
-"    \t\tCOMMANDS\n"
-"    \t\t(( EXP3 ))\n"
+"    Tương đương với:\n"
+"    \t(( BTHỨC1 ))\n"
+"    \twhile (( BTHỨC2 )); do\n"
+"    \t\tLỆNH\n"
+"    \t\t(( BTHỨC3 ))\n"
 "    \tdone\n"
-"EXP1, EXP2, EXP3 là biểu thức số học.\n"
-"Bỏ sót biểu thức nào thì ứng xử như nó tính là 1.\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại trạng thái của câu lệnh cuối cùng được chạy."
+"    BTHỨC1, BTHỨC2 và BTHỨC3 là biểu thức số học. Ngầm định 1 cho bất\n"
+"    kì biểu thức bỏ trống nào.\n"
+"\n"
+"    Trạng thái thoát:\n"
+"    Trả lại trạng thái của câu lệnh cuối cùng được chạy."
 
-#: builtins.c:1542
+#: builtins.c:1529
 msgid ""
 "Select words from a list and execute commands.\n"
 "    \n"
@@ -4710,27 +4410,22 @@ msgid ""
 "    Exit Status:\n"
 "    Returns the status of the last command executed."
 msgstr ""
-"Chọn từ trong một danh sách, và thực thi câu lệnh.\n"
-"\n"
-"WORDS được mở rộng, mà tạo một danh sách các từ.\n"
-"Tập hợp các từ đã mở rộng được in trên đầu lỗi tiêu chuẩn.\n"
-"\tmỗi từ có con số đi trước.\n"
-"Không có « in WORDS » thì giả sử « in \"$@\" ».\n"
-"Dấu nhắc PS3 thì được hiển thị, và một dòng được đọc\n"
-"\ttừ đầu vào tiêu chuẩn.\n"
-"Nếu dòng này là số tương ứng với một của những từ được hiển thị,\n"
-"\tTÊN sẽ được đặt thành từ đó.\n"
-"Dòng rỗng thì hiển thị lại WORDS và dấu nhắc.\n"
-"Đọc kết thúc tập tin thì chạy xong câu lệnh đó.\n"
-"Bất cứ giá trị khác nào được đọc sẽ gây ra TÊN được đặt thành vô giá trị.\n"
-"Dòng được đọc sẽ được lưu lại vào biến REPLY (trả lời).\n"
-"Các CÂU_LỆNH được thực hiện sau khi chọn mỗi đồ,\n"
-"\tđến khi một lệnh gián đoạn được thực hiện.\n"
-"\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại trạng thái của câu lệnh cuối cùng được chạy."
-
-#: builtins.c:1563
+"Chọn từ từ danh sách và thực thi lệnh.\n"
+"\n"
+"    TỪ được bung, phát sinh danh sách từ. Tập hợp các từ kết quả được\n"
+"    in ra đầu ra lỗi chuẩn với một con số ở phía trước. Ngầm định `in\n"
+"    \"$@\"' nếu không có `in TỪ'. Dấu nhắc PS3 được hiển thị và một dòng\n"
+"    được đọc từ đầu nhập chuẩn. Nếu dòng bao gồm số tương ứng với từ\n"
+"    hiển thị thì đặt từ đó vào biến TÊN. Nếu dòng rỗng thì hiển thị\n"
+"    lại TỪ và dấu nhắc. Nếu gặp EOF thì kết thúc. Đặt TÊN là rỗng với\n"
+"    các giá trị khác. Dòng đọc được lưu vào biến REPLY. LỆNH được thực\n"
+"    thi sau mỗi lần chọn đến khi gặp lệnh `break'.\n"
+"\n"
+"\n"
+"    Trạng thái thoát:\n"
+"    Trả lại trạng thái của câu lệnh cuối cùng được chạy."
+
+#: builtins.c:1550
 msgid ""
 "Report time consumed by pipeline's execution.\n"
 "    \n"
@@ -4745,23 +4440,21 @@ msgid ""
 "    Exit Status:\n"
 "    The return status is the return status of PIPELINE."
 msgstr ""
-"Thông báo thời gian được chiếm khi ống dẫn thực thi.\n"
+"Thông báo thời gian sử dụng để thực thi ống dẫn.\n"
 "\n"
-"\tThực thi PIPELINE (ống dẫn) và in ra bản tóm tắt thời gian thật,\n"
-"\tthời gian CPU của người dùng, và thời gian CPU của hệ thống\n"
-"\t00 chiếm khi thực thi ống dẫn, khi ống dẫn chấm dứt.\n"
+"    Thực thi ỐNG-DẪN và in tóm tắt thời gian thật, thời gian CPU người\n"
+"    dùng, và thời gian CPU hệ thống được dùng để thực thi ống dẫn đến\n"
+"    khi chấm dứt.\n"
 "\n"
-"\tTùy chọn:\n"
-"\t\t-p\tin ra bản tóm tắt đếm thời gian\n"
-"\t\t\ttheo định dạng POSIX có thể mang theo\n"
+"    Tùy chọn:\n"
+"      -p\tin bản tóm tắt thời gian theo định dạng POSIX\n"
 "\n"
-"\tGiá trị của biến TIMEFORMAT (định dạng thời gian)\n"
-"\tđược dùng làm định dạng kết xuất.\n"
+"    Giá trị biến TIMEFORMAT được dùng làm định dạng kết xuất.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrạng thái trả lai là trạng thái trả lại của PIPELINE."
+"    Trạng thái thoát:\n"
+"    Trạng thái trả lai là trạng thái trả về của ỐNG-DẪN."
 
-#: builtins.c:1580
+#: builtins.c:1567
 msgid ""
 "Execute commands based on pattern matching.\n"
 "    \n"
@@ -4771,53 +4464,44 @@ msgid ""
 "    Exit Status:\n"
 "    Returns the status of the last command executed."
 msgstr ""
-"Thức thi câu lá»\87nh dá»±a vào khá»\9bp mẫu.\n"
+"Thá»±c thi lá»\87nh chá»\8dn theo mẫu.\n"
 "\n"
-"\tThực thi các câu LỆNH một cách chọn lọc,\n"
-"\tdựa vào TỪ tương ứng với MẪU.\n"
-"\tNhiều mẫu định giới bằng « | ».\n"
+"    Thực thi LỆNH một cách chọn dựa vào TỪ tương ứng với MẪU. Nhiều\n"
+"    mẫu cách nhau bằng `|'.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại trạng thái của câu lệnh cuối cùng được chạy."
+"    Trạng thái thoát:\n"
+"    Trả lại trạng thái của câu lệnh cuối cùng được chạy."
 
-#: builtins.c:1592
+#: builtins.c:1579
 msgid ""
 "Execute commands based on conditional.\n"
 "    \n"
-"    The `if COMMANDS' list is executed.  If its exit status is zero, then "
-"the\n"
-"    `then COMMANDS' list is executed.  Otherwise, each `elif COMMANDS' list "
-"is\n"
+"    The `if COMMANDS' list is executed.  If its exit status is zero, then the\n"
+"    `then COMMANDS' list is executed.  Otherwise, each `elif COMMANDS' list is\n"
 "    executed in turn, and if its exit status is zero, the corresponding\n"
-"    `then COMMANDS' list is executed and the if command completes.  "
-"Otherwise,\n"
-"    the `else COMMANDS' list is executed, if present.  The exit status of "
-"the\n"
-"    entire construct is the exit status of the last command executed, or "
-"zero\n"
+"    `then COMMANDS' list is executed and the if command completes.  Otherwise,\n"
+"    the `else COMMANDS' list is executed, if present.  The exit status of the\n"
+"    entire construct is the exit status of the last command executed, or zero\n"
 "    if no condition tested true.\n"
 "    \n"
 "    Exit Status:\n"
 "    Returns the status of the last command executed."
 msgstr ""
-"Thực thi câu lệnh dựa vào điều kiện.\n"
-"\n"
-"\tDanh sách « if LỆNH » được thực thi.\n"
-"\tNếu trạng thái thoát của nó là số không,\n"
-"\tthì danh sách « then LỆNH » được thực thi.\n"
-"\tKhông thì mỗi danh sách « elif LỆNH » được thực thi lần lượt,\n"
-"\tvà nếu trạng thái thoát của nó là số không,\n"
-"\tthì danh sách « then LỆNH » tương ứng được thực thi\n"
-"\tvà câu lệnh « nếu » (if) sẽ chạy xong.\n"
-"\tKhông thì danh sách « else LỆNH » được thực thi, nếu có.\n"
-"\tTrạng thái thoát của toàn bộ tạo dựng\n"
-"\tlà trạng thái của câu lệnh cuối cùng được chạy,\n"
-"\thoặc số không nếu không có điều kiện có kết quả là Đúng.\n"
-"\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại trạng thái của câu lệnh cuối cùng được chạy."
-
-#: builtins.c:1609
+"Thực thi câu lệnh có điều kiện.\n"
+"\n"
+"    Danh sách `if LỆNH' được thực thi. Nếu trạng thái thoát là không,\n"
+"    thì thực thi danh sách `then LỆNH'. Không thì thực thi lần lượt\n"
+"    mỗi danh sách `elif LỆNH', và nếu trạng thái thoát là không, thì\n"
+"    thực thi danh sách `then LỆNH' tương ứng và hoàn tất lệnh\n"
+"    `if'. Không thì thực thi danh sách `else LỆNH' nếu có. Trạng thái\n"
+"    thoát của toàn bộ lệnh `if' là trạng thái của lệnh cuối cùng được\n"
+"    chạy, hoặc không nếu không có điều kiện nào trả về kết quả là\n"
+"    đúng.\n"
+"\n"
+"    Trạng thái thoát:\n"
+"    Trả lại trạng thái của câu lệnh cuối cùng được chạy."
+
+#: builtins.c:1596
 msgid ""
 "Execute commands as long as a test succeeds.\n"
 "    \n"
@@ -4827,16 +4511,15 @@ msgid ""
 "    Exit Status:\n"
 "    Returns the status of the last command executed."
 msgstr ""
-"Thực thi câu lệnh miễn là một phép thử thành công.\n"
+"Thực thi lệnh chừng nào phép thử còn thành công.\n"
 "\n"
-"\tMở rộng và thực thi các câu LỆNH miễn là câu lệnh cuối cùng\n"
-"\ttrong những câu LỆNH « while » (trong khi)\n"
-"\tcó trạng thái thoát là số không.\n"
+"    Bung và thực thi LỆNH chừng nào lệnh cuối cùng trong `while' LỆNH\n"
+"    có trạng thái thoát là không.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại trạng thái của câu lệnh cuối cùng được chạy."
+"    Trạng thái thoát:\n"
+"    Trả lại trạng thái của câu lệnh cuối cùng được chạy."
 
-#: builtins.c:1621
+#: builtins.c:1608
 msgid ""
 "Execute commands as long as a test does not succeed.\n"
 "    \n"
@@ -4846,16 +4529,15 @@ msgid ""
 "    Exit Status:\n"
 "    Returns the status of the last command executed."
 msgstr ""
-"Thực thi câu lệnh miễn là một phép thử không thành công.\n"
+"Thực thi lệnh chừng nào phép thử vẫn không thành công.\n"
 "\n"
-"\tMở rộng và thực thi các câu LỆNH miễn là câu lệnh cuối cùng\n"
-"\ttrong các câu LỆNH « until » (đến khi) có trạng thái thoát\n"
-"\tkhác số không.\n"
+"    Bung và thực thi LỆNH chừng nào lệnh cuối cùng trong `until' LỆNH\n"
+"    có trạng thái thoát là khác không.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại trạng thái của câu lệnh cuối cùng được chạy."
+"    Trạng thái thoát:\n"
+"    Trả lại trạng thái của câu lệnh cuối cùng được chạy."
 
-#: builtins.c:1633
+#: builtins.c:1620
 msgid ""
 "Create a coprocess named NAME.\n"
 "    \n"
@@ -4867,42 +4549,38 @@ msgid ""
 "    Exit Status:\n"
 "    Returns the exit status of COMMAND."
 msgstr ""
-"Tạo một tiến trình đồng chạy có tên TÊN.\n"
+"Tạo tiến trình phụ tên TÊN.\n"
 "\n"
-"\tThực hiện câu LỆNH một cách không đồng bộ, có đầu và tiêu chuẩn\n"
-"\tvà đầu ra tiêu chuẩn của câu lệnh này được kết nối thông qua một ống dẫn\n"
-"\ttới các bộ mô tả tập tin được gán cho chỉ số 0 và 1 của một biến mảng TÊN\n"
-"\ttrong trình bao đang chạy.\n"
-"\tTên mặc định là « COPROC ».\n"
+"    Thực hiện LỆNH không đồng bộ có đầu vào/ra chuẩn nối đến ống dẫn\n"
+"    của bộ mô tả tập tin chỉ số 0 và 1 trong biến mảng TÊN trong shell\n"
+"    được thực thi. TÊN mặc định là \"COPROC\".\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại trạng thái thoát của câu LỆNH."
+"    Trạng thái thoát:\n"
+"    Trả lại trạng thái thoát của câu LỆNH."
 
-#: builtins.c:1647
+#: builtins.c:1634
 msgid ""
 "Define shell function.\n"
 "    \n"
 "    Create a shell function named NAME.  When invoked as a simple command,\n"
-"    NAME runs COMMANDs in the calling shell's context.  When NAME is "
-"invoked,\n"
+"    NAME runs COMMANDs in the calling shell's context.  When NAME is invoked,\n"
 "    the arguments are passed to the function as $1...$n, and the function's\n"
 "    name is in $FUNCNAME.\n"
 "    \n"
 "    Exit Status:\n"
 "    Returns success unless NAME is readonly."
 msgstr ""
-"Xác định chức năng trình bao.\n"
+"Định nghĩa hàm shell.\n"
 "\n"
-"\tTạo một chức năng trình bao có TÊN.\n"
-"\tKhi được gọi dưới dạng một câu lệnh đơn giản,\n"
-"\tTÊN chạy các câu LỆNH theo ngữ cảnh của trình bao đang gọi.\n"
-"\tKhi TÊN được gọi, các đối số được gửi cho chức năng dưới dạng $1...$n,\n"
-"\tvà tên chức năng nằm trong $FUNCNAME.\n"
+"    Tạo hàm shell tên TÊN. Khi được gọi dưới dạng một câu lệnh đơn\n"
+"    giản, TÊN chạy LỆNH trong ngữ cảnh của shell gọi. Khi TÊN được\n"
+"    gọi, các đối số được gửi cho hàm dạng $1...$n, và tên hàm nằm\n"
+"    trong $FUNCNAME.\n"
 "\n"
-"\tTráng thái thoát:\n"
-"\tTrả lại thành công nếu TÊN không phải chỉ đọc."
+"    Trạng thái thoát:\n"
+"    Trả lại thành công nếu TÊN không phải chỉ đọc."
 
-#: builtins.c:1661
+#: builtins.c:1648
 msgid ""
 "Group commands as a unit.\n"
 "    \n"
@@ -4912,16 +4590,15 @@ msgid ""
 "    Exit Status:\n"
 "    Returns the status of the last command executed."
 msgstr ""
-"Nhóm lại các câu lá»\87nh làm cùng một đơn vị.\n"
+"Nhóm lá»\87nh làm một đơn vị.\n"
 "\n"
-"\tChạy một tập hợp các câu lệnh trong cùng một nhóm.\n"
-"\tĐây là một phương pháp chuyển hướng\n"
-"\tmột tập hợp câu lệnh hoàn toàn.\n"
+"    Chạy tập hợp các lệnh trong cùng một nhóm. Đây là một cách để\n"
+"    chuyển hướng toàn bộ một nhóm lệnh.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại trạng thái của câu lệnh cuối cùng được chạy."
+"    Trạng thái thoát:\n"
+"    Trả lại trạng thái của câu lệnh cuối cùng được chạy."
 
-#: builtins.c:1673
+#: builtins.c:1660
 msgid ""
 "Resume job in foreground.\n"
 "    \n"
@@ -4936,17 +4613,15 @@ msgid ""
 msgstr ""
 "Tiếp tục lại công việc ở trước.\n"
 "\n"
-"\tTương đương với đối số ĐẶC_TẢ_CÔNG_VIỆC với câu lệnh « fg ».\n"
-"\tTiếp tục lai một công việc bị dừng chạy hay chạy về nền.\n"
-"\tĐẶC_TẢ_CÔNG_VIỆC có thể ghi rõ hoặc một tên công việc,\n"
-"\thoặc một số thứ tự công việc.\n"
-"\tĐặt một « & » theo sau ĐẶC_TẢ_CÔNG_VIỆC sẽ đặt công việc về nền,\n"
-"\tnhư là đặc tả công việc đã được cung cấp dưới dạng một đối số với « bg ».\n"
+"    Tương đương với đối số đặc tả công việc ĐTCV trong lệnh `fg'.\n"
+"    Tiếp tục lại công việc bị dừng chạy hay chạy nền. ĐTCV có thể xác\n"
+"    định tên công việc hoặc mã số công việc. Đặt `&' sau ĐTCV sẽ chạy\n"
+"    công việc ở nền, như là đối số đặc tả công việc trong `bg'.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại trạng thái của công việc đã tiếp tục lại."
+"    Trạng thái thoát:\n"
+"    Trả lại trạng thái của công việc đã tiếp tục lại."
 
-#: builtins.c:1688
+#: builtins.c:1675
 msgid ""
 "Evaluate arithmetic expression.\n"
 "    \n"
@@ -4956,24 +4631,21 @@ msgid ""
 "    Exit Status:\n"
 "    Returns 1 if EXPRESSION evaluates to 0; returns 0 otherwise."
 msgstr ""
-"Định giá biểut thức số học.\n"
+"Định giá biểu thức số học.\n"
 "\n"
-"\tBIỂU_THỨC được tính tùy theo các quy tắc về định giá số học.\n"
-"\tTương đương với « let BIỂU_THỨC ».\n"
+"    BTHỨC được tính tùy theo các quy tắc về định giá số học.\n"
+"    Tương đương với `let BTHỨC'.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại 1 nếu BIỂU_THỨC tính là 0; không thì trả lại 0."
+"    Trạng thái thoát:\n"
+"    Trả lại 1 nếu BTHỨC tính là 0; không thì trả lại 0."
 
-#: builtins.c:1700
+#: builtins.c:1687
 msgid ""
 "Execute conditional command.\n"
 "    \n"
-"    Returns a status of 0 or 1 depending on the evaluation of the "
-"conditional\n"
-"    expression EXPRESSION.  Expressions are composed of the same primaries "
-"used\n"
-"    by the `test' builtin, and may be combined using the following "
-"operators:\n"
+"    Returns a status of 0 or 1 depending on the evaluation of the conditional\n"
+"    expression EXPRESSION.  Expressions are composed of the same primaries used\n"
+"    by the `test' builtin, and may be combined using the following operators:\n"
 "    \n"
 "      ( EXPRESSION )\tReturns the value of EXPRESSION\n"
 "      ! EXPRESSION\t\tTrue if EXPRESSION is false; else false\n"
@@ -4991,30 +4663,28 @@ msgid ""
 "    Exit Status:\n"
 "    0 or 1 depending on value of EXPRESSION."
 msgstr ""
-"Thực thi câu lệnh điều kiện.\n"
-"\n"
-"Trả về trạng thái 0 hoặc 1, phụ thuộc vào phép tính\n"
-"\tbiểu thức điều kiện BIỂU_THỨC.\n"
-"Biểu thức chứa cùng những nguyên sơ được dùng bởi dựng sẵn « test »,\n"
-"\tvà có thể được tổ hợp dùng các toán tử theo đây:\n"
-"    \n"
-"    \t( BIỂU_THỨC )\tTrả về giá trị của BIỂU_THỨC\n"
-"    \t! BIỂU_THỨC\tĐúng nếu BIỂU_THỨC là không đúng; không thì sai\n"
-"    \tB_THỨC1 && B_THỨC2\n"
-"\tĐúng nếu cả hai B_THỨC1 và B_THỨC2 đều là đúng; không thì sai\n"
-"    \tB_THỨC1 || B_THỨC2\n"
-"\tĐúng nếu một của B_THỨC1 và B_THỨC2 là đúng; không thì sai\n"
-"    \n"
-"Khi dùng toán từ « == » và « != », chuỗi bên phải toán tử được dùng làm "
-"mẫu,\n"
-"\tvà thực hiện chức năng khớp mẫu.\n"
-"Toán tử « && » và « || » không tính B_THỨC2 nếu B_THỨC1 là đủ\n"
-"\tđể tính giá trị của biểu thức.\n"
-"\n"
-"\tTrạng thái thoát:\n"
-"\t0 hay 1 phụ thuộc vào giá trị của BIỂU_THỨC."
-
-#: builtins.c:1726
+"Thực thi câu lệnh có điều kiện.\n"
+"\n"
+"    Trả về trạng thái 0 hoặc 1 tuỳ vào phép tính biểu thức điều kiện\n"
+"    BTHỨC. Biểu thức bao gồm các thành phần dùng trong lệnh dựng sẵn\n"
+"    `test', và có thể được tổ hợp bằng các toán tử sau:\n"
+"    \n"
+"      ( BTHỨC )\t\tTrả về giá trị của BTHỨC\n"
+"      ! BTHỨC\t\tĐúng nếu BTHỨC là không đúng. Ngược lại sai\n"
+"      BTHỨC1 && BTHỨC2\tĐúng nếu cả hai biểu thức đều đúng. Ngược lại sai.\n"
+"      BTHỨC1 || BTHỨC2\tĐúng nếu một trong hai biểu thức đúng. Ngược lại sai.\n"
+"    \n"
+"    Khi dùng toán từ `==' và `!=', chuỗi bên phải toán tử được dùng\n"
+"    làm mẫu, và thực hiện khớp mẫu. Khi dùng toán tử `=~', chuỗi bên\n"
+"    phải toán tử được dùng làm biểu thức chính quy.\n"
+"\n"
+"    Toán tử `&&' và `||' không tính BTHỨC2 nếu BTHỨC1 đủ để xác định\n"
+"    giá trị toàn biểu thức.\n"
+"\n"
+"    Trạng thái thoát:\n"
+"    0 hay 1 phụ thuộc vào giá trị của BTHỨC."
+
+#: builtins.c:1713
 msgid ""
 "Common shell variable names and usage.\n"
 "    \n"
@@ -5067,60 +4737,58 @@ msgid ""
 "    HISTIGNORE\tA colon-separated list of patterns used to decide which\n"
 "    \t\tcommands should be saved on the history list.\n"
 msgstr ""
-"Tên và sử dụng của mỗi biến trình bao thường dùng.\n"
-"\n"
-"BASH_VERSION\tThông tin phiên bản về phần mềm Bash này.\n"
-"    CDPATH\tDanh sách các thư mục định giới bằng dấu hai chấm,\n"
-"\tqua đó cần tìm kiếm thư mục được đưa ra dạng đối số với « cd ».\n"
-"    GLOBIGNORE\tDanh sách các mẫu định giới bằng dấu hai chấm,\n"
-"\tmà diễn tả các tên tập tin cần bỏ qua khi mở rộng tên đường dẫn.\n"
-"    HISTFILE\tTên của tập tin chứa lịch sử câu lệnh của bạn.\n"
-"    HISTFILESIZE\tSố tối đa các dòng có thể được tập tin này chứa.\n"
-"    HISTSIZE\tSố tối đa các dòng lịch sử mà trình bao đang chạy có thể truy "
-"cập.\n"
-"    HOME\tTên đường dẫn đầy đủ đến thư mục đăng nhập của bạn.\n"
-"    HOSTNAME\tTên của máy chủ hiện thời của bạn.\n"
-"    HOSTTYPE\tKiểu CPU dưới đó phiên bản Bash này đang chạy.\n"
-"    IGNOREEOF\tĐiều khiển ứng xử của trình bao khi nhận\n"
-"\tký tự kết thúc tập tin (EOF) là dữ liệu nhập độc nhất.\n"
-"\tĐặt thì giá trị của nó là số ký tự EOF có thể gặp liên tục\n"
-"\ttrên một dòng rỗng trước khi trình bao sẽ thoát (mặc định là 10).\n"
-"\tKhông đặt thì EOF sẽ cũng kết thúc nhập vào.\n"
-"    MACHTYPE\tMột chuỗi diễn tả hệ thống hiện thời trên đó Bash đang chạy.\n"
-"    MAILCHECK\tKhoảng thời gian, theo giây, giữa hai lần Bash kiểm tra\n"
-"\tcó thư mới chưa.\n"
-"    MAILPATH\tDanh sách các tên tập tin định giới bằng dấu hai chấm\n"
-"\ttrong đó Bash kiểm tra có thư mới chưa.\n"
-"    OSTYPE\tPhiên bản UNIX trên đó Bash này đang chạy.\n"
-"    PATH\tDanh sách các thư mục định giới bằng dấu hai chấm,\n"
-"\tqua đó cần tìm kiếm câu lệnh.\n"
-"    PROMPT_COMMAND\tMột câu lệnh cần thực hiện trước khi in ra\n"
-"\tmỗi chuỗi nhắc chính.\n"
-"    PS1\t\tChuỗi nhắc chính.\n"
-"    PS2\t\tChuỗi nhắc phụ.\n"
+"Tên và cách dùng các biến shell thường dùng.\n"
+"\n"
+"    BASH_VERSION\n"
+"        \tThông tin phiên bản của Bash đang chạy.\n"
+"    CDPATH\tDanh sách thư mục cách nhau bằng dấu hai chấm để tìm\n"
+"        \tđối số thư mục trong lệnh `cd'.\n"
+"    GLOBIGNORE\tDanh sách mẫu cách nhau bằng dấu hai chấm diễn tả\n"
+"        \ttên tập tin bị bỏ qua không bung đường dẫn.\n"
+"    HISTFILE\tTên tập tin chứa lịch sử câu lệnh của bạn.\n"
+"    HISTFILESIZE\n"
+"        \tSố dòng tối đa tập tin này có thể chứa.\n"
+"    HISTSIZE\tSố dòng tối đa mà shell đang chạy có thể truy cập.\n"
+"    HOME\tTên đường dẫn đầy đủ của thư mục đăng nhập của bạn.\n"
+"    HOSTNAME\tTên của máy hiện thời của bạn.\n"
+"    HOSTTYPE\tLoại CPU phiên bản Bash này đang chạy.\n"
+"    IGNOREEOF\tĐiều khiển hành vi shell khi nhận EOF là dữ liệu nhập\n"
+"        \tduy nhất. Đặt thì giá trị của nó là EOF có thể gặp\n"
+"        \tliên tục trên một dòng rỗng trước khi shell kết thúc\n"
+"        \t(mặc định là 10). Không đặt thì EOF nghĩa là kết thúc\n"
+"        \tnhập.\n"
+"    MACHTYPE\tChuỗi mô tả hệ thống Bash đang chạy.\n"
+"    MAILCHECK\tSố giây giữa hai lần Bash kiểm tra có thư mới không.\n"
+"    MAILPATH\tDanh sách tên tập tin cách nhau bằng dấu hai chấm\n"
+"        \tđể Bash kiểm tra có thư mới không.\n"
+"    OSTYPE\tPhiên bản UNIX Bash đang chạy.\n"
+"    PATH\tDanh sách thư mục cách nhau bằng dấu hai chấm để tìm lệnh.\n"
+"    PROMPT_COMMAND\n"
+"        \tLệnh cần thực hiện trước khi in dấu nhắc chính.\n"
+"    PS1\t\tChuỗi dấu nhắc chính.\n"
+"    PS2\t\tChuỗi dấu nhắc phụ.\n"
 "    PWD\t\tTên đường dẫn đầy đủ của thư mục hiện tại.\n"
-"    SHELLOPTS\tDanh sách các tùy chọn trình bao đã hiệu lực\n"
-"\tđịnh giới bằng dấu hai chấm.\n"
-"    TERM\tTên của kiểu thiết bị cuối hiện thời.\n"
-"    TIMEFORMAT\tĐịnh dạng kết xuất cho thống kê đếm thời gian\n"
-"\tđược hiển thị bởi từ dành riêng « time ».\n"
-"    auto_resume\tCó giá trị thì trước tiên tìm một từ lệnh xuất hiện một "
-"mình\n"
-"\ttrên một dòng, trong danh sách các công việc bị dừng chạy.\n"
-"\tTìm được thì đặt công việc đó vào trước.\n"
-"\tGiá trị « exact » (chính xác) có nghĩa là từ lệnh phải tương ứng\n"
-"\tchính xác với một câu lệnh trong danh sách các công việc bị dừng chạy.\n"
-"\tGiá trị « substring » (chuỗi phụ) có nghĩa là từ lệnh phải tương ứng\n"
-"\tvới một chuỗi phụ của công việc đó.\n"
-"    histchars\tCác ký tự điều khiển mở rộng và thay thế nhanh lịch sử.\n"
-"\tKý tự đầu tiên thường là ký tự thay thế lịch sử, thường là « ! ».\n"
-"\tKý tự thứ hai là ký tự thay thế nhanh, thường là « ^ ».\n"
-"\tKý tự thứ ba là ký tự ghi chú về lịch sử, thường là « # ».\n"
-"    HISTIGNORE\tDanh sách các mẫu định giới bằng dấu hai chấm,\n"
-"\tđược ùng để quyết định những câu lệnh nào nên được lưu\n"
-"\tvào danh sách lịch sử.\n"
-
-#: builtins.c:1783
+"    SHELLOPTS\tDanh sách tùy chọn shell được bật cách nhau bằng\n"
+"        \tdấu hai chấm.\n"
+"    TERM\tTên kiểu thiết bị cuối hiện thời.\n"
+"    TIMEFORMAT\tĐịnh dạng kết xuất cho thống kê thời gian của lệnh `time'.\n"
+"    auto_resume\tGiá trị khác rỗng thì trước tiên tìm một từ lệnh xuất\n"
+"        \thiện một mình trên một dòng, trong danh sách các công\n"
+"        \tviệc bị dừng chạy. Tìm ra thì đặt công việc đó vào nền\n"
+"        \ttrước. Giá trị `exact' có nghĩa là từ lệnh phải tương\n"
+"        \tứng chính xác với một câu lệnh trong danh sách các\n"
+"        \tcông việc bị dừng chạy. Giá trị `substring' có nghĩa\n"
+"        \tlà từ lệnh phải tương ứng với một chuỗi phụ của công\n"
+"        \tviệc đó.\n"
+"    histchars\tCác ký tự điều khiển bung và thay thế lịch sử. Ký tự\n"
+"        \tđầu tiên thường là ký tự thay thế lịch sử, thường là\n"
+"        \t`!'. Ký tự thứ hai là ký tự thay thế nhanh, thường là\n"
+"        \t`^'. Ký tự thứ ba là ký tự ghi chú về lịch sử, thường\n"
+"        \tlà `#'.\n"
+"    HISTIGNORE\tDanh sách mẫu cách bằng dấu hai chấm dùng để quyết định\n"
+"        \tnhững câu lệnh nào nên được lưu vào danh sách lịch sử.\n"
+
+#: builtins.c:1770
 msgid ""
 "Add directories to stack.\n"
 "    \n"
@@ -5150,31 +4818,31 @@ msgid ""
 "    Returns success unless an invalid argument is supplied or the directory\n"
 "    change fails."
 msgstr ""
-"Thêm thư mục vào đống.\n"
+"Thêm thư mục vào chồng.\n"
 "\n"
-"Thêm một thư mục vào đầu của đống thư mục, hoặc xoay đống,\n"
-"\tlàm cho thư mục mới đầu đống là thư mục làm việc hiện thời.\n"
-"Không có đối số thì trao đổi hai thư mục đầu.\n"
+"    Thêm thư mục vào đầu của chồng thư mục, hoặc xoay chồng, làm cho\n"
+"    thư mục mới đầu chồng là thư mục làm việc hiện thời. Không có đối\n"
+"    số thì trao đổi hai thư mục đầu.\n"
 "\n"
-"+N\tXoay đống để thư mục thứ N (đếm từ bên trái danh sách\n"
-"\tđược hiển thị bằng « dirs », bắt đầu từ số không) dời lên đầu.\n"
+"      -n\tNgăn  chuyển đổi bình thường khi thêm thư mục\n"
+"        \tvào chồng, để thao tác chỉ chồng.\n"
 "\n"
-"-N\tXoay đống để thư mục thứ N (đếm từ bên phải danh sách\n"
-"\tđược hiển thị bằng « dirs », bắt đầu từ số không) dời lên đầu.\n"
+"      +N\tXoay chồng để thư mục thứ N (đếm từ trái danh sách\n"
+"        \t`dirs', bắt đầu từ số không) dời lên đầu.\n"
 "\n"
-"-n\tThu hồi chức năng chuyển đổi bình thường khi thêm thư mục\n"
-"\tvào đống, để thao tác chỉ đống.\n"
+"      -N\tXoay chồng để thư mục thứ N (đếm từ phải danh sách\n"
+"        \t`dirs', bắt đầu từ số không) dời lên đầu.\n"
 "\n"
-"dir\tThêm T_MỤC vào đầu đống thư mục, làm cho nó là thư mục\n"
-"\tlàm việc hiện thời mới.\n"
+"      dir\tThêm THMỤC vào đầu chồng thư mục, cho nó làm thư mục\n"
+"        \tlàm việc hiện thời mới.\n"
 "\n"
-"Dựng sẵn « dirs » thì hiển thị đống thư mục.\n"
+"    Lệnh dựng sẵn `dirs' hiển thị chồng thư mục.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công nếu không đưa ra đối số sai,\n"
-"\tcũng không sai chuyển đổi thư mục."
+"    Trạng thái thoát:\n"
+"    Trả lại thành công nếu không đưa ra đối số sai, cũng không sai\n"
+"    chuyển đổi thư mục."
 
-#: builtins.c:1817
+#: builtins.c:1804
 msgid ""
 "Remove directories from stack.\n"
 "    \n"
@@ -5200,34 +4868,29 @@ msgid ""
 "    Returns success unless an invalid argument is supplied or the directory\n"
 "    change fails."
 msgstr ""
-"Gỡ bỏ thư mục khỏi đống.\n"
+"Gỡ bỏ thư mục khỏi chồng.\n"
 "\n"
-"Gỡ bỏ thư mục khỏi đống thư mục.\n"
-"Không có đối số thì gỡ bỏ thư mục đầu khỏi đống,\n"
-"\tvà cd (chuyển đổi thư mục) sang thư mục đầu mới.\n"
+"    Gỡ bỏ thư mục khỏi chồng thư mục. Không có đối số thì gỡ bỏ thư\n"
+"    mục đầu khỏi chồng và `cd' sang thư mục đầu mới.\n"
 "\n"
-"+N\tGỡ bỏ thư mục thứ N (đếm từ bên trái danh sách\n"
-"\tđược hiển thị bằng « dirs », bắt đầu từ số không).\n"
-"\tVí dụ :\n"
-"\t\tpopd +0\t\tgỡ bỏ thư mục cuối cùng\n"
-"\t\tpopd +1\t\tgỡ bỏ thư mục thứ hai.\n"
+"      -n\tNgăn chuyển đổi bình thường khi gỡ bỏ thư mục\n"
+"        \tkhỏi chồng, để thao tác chỉ chồng.\n"
 "\n"
-"-N\tGỡ bỏ thư mục thứ N (đếm từ bên phải danh sách\n"
-"\tđược hiển thị bằng « dirs », bắt đầu từ số không).\n"
-"\tVí dụ :\n"
-"\t\tpopd -0\t\tgỡ bỏ thư mục cuối cùng\n"
-"\t\tpopd -1\t\tgỡ bỏ thư mục giáp cuối.\n"
+"      +N\tGỡ bỏ thư mục thứ N (đếm từ trái danh sách\n"
+"        \t`dirs', bắt đầu từ số không). Ví dụ: `popd +0' bỏ\n"
+"        \tthư mục cuối cùng, `popd +1' bỏ thư mục thứ hai.\n"
 "\n"
-"-n\tThu hồi chức năng chuyển đổi bình thường khi gỡ bỏ thư mục\n"
-"\tkhỏi đống, để thao tác chỉ đống.\n"
+"      -N\tGỡ bỏ thư mục thứ N (đếm từ phải danh sách\n"
+"        \t`dirs', bắt đầu từ số không). Ví dụ: `popd -0' bỏ\n"
+"        \tthư mục cuối cùng, `popd -1'  bỏ thư mục giáp cuối.\n"
 "\n"
-"Dựng sẵn « dirs » thì hiển thị đống thư mục.\n"
+"    Lệnh dựng sẵn `dirs' hiển thị đống thư mục.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công nếu không đưa ra đối số sai,\n"
-"\tcũng không sai chuyển đổi thư mục."
+"    Trạng thái thoát:\n"
+"    Trả lại thành công nếu không đưa ra đối số sai, cũng không sai\n"
+"    chuyển đổi thư mục."
 
-#: builtins.c:1847
+#: builtins.c:1834
 msgid ""
 "Display directory stack.\n"
 "    \n"
@@ -5244,52 +4907,46 @@ msgid ""
 "    \twith its position in the stack\n"
 "    \n"
 "    Arguments:\n"
-"      +N\tDisplays the Nth entry counting from the left of the list shown "
-"by\n"
+"      +N\tDisplays the Nth entry counting from the left of the list shown by\n"
 "    \tdirs when invoked without options, starting with zero.\n"
 "    \n"
-"      -N\tDisplays the Nth entry counting from the right of the list shown "
-"by\n"
+"      -N\tDisplays the Nth entry counting from the right of the list shown by\n"
 "    \tdirs when invoked without options, starting with zero.\n"
 "    \n"
 "    Exit Status:\n"
 "    Returns success unless an invalid option is supplied or an error occurs."
 msgstr ""
-"Hiển thị đống thư mục.\n"
-"\n"
-"\tHiển thị danh sách các thư mục được nhớ hiện thời.\n"
-"\tCâu lệnh « pushd » sẽ thêm thư mục vào danh sách;\n"
-"\tcâu lệnh « popd » cũng nâng thư mục lên danh sách.\n"
-"\n"
-"\tTùy chọn:\n"
-"\t\t-c\tgột đống thư mục bằng cách xoá mọi phần tử\n"
-"\t\t₫l\tđừng in a phiên bản thư mục có dấu ngã\n"
-"\t\t\t(tương đối so với thư mục chính của người dùng)\n"
-"\t\t-p\tin ra đống thư mục, mỗi dòng một mục\n"
-"\t\t-v\tin ra đống thư mục, mỗi dòng một mục,\n"
-"\t\t\tvới tiền tố là vị trí trong đống\n"
-"\n"
-"\tĐối số :\n"
-"\t\t+N\thiển thị mục thứ N bắt đầu từ bên trái danh sách\n"
-"\t\t\tđược hiển thị bằng « dirs »\n"
-"\t\t\tkhi được gọi mà không đưa ra tùy chọn,\n"
-"\t\t\tbắt đầu từ số không.\n"
-"\n"
-"\t\t-N\thiển thị mục thứ N bắt đầu từ bên phải danh sách\n"
-"\t\t\tđược hiển thị bằng « dirs »\n"
-"\t\t\tkhi được gọi mà không đưa ra tùy chọn,\n"
-"\t\t\tbắt đầu từ số không.\n"
-"\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công nếu không đưa ra tùy chọn sai hay gặp lỗi."
-
-#: builtins.c:1876
+"Hiển thị chồng thư mục.\n"
+"\n"
+"    Hiển thị danh sách các thư mục được nhớ hiện thời. Lệnh `pushd'\n"
+"    thêm thư mục vào danh sách; lệnh `popd' lấy thư mục khỏi danh\n"
+"    sách.\n"
+"\n"
+"    Tùy chọn:\n"
+"      -c\txoá mọi phần tử trong chồng thư mục\n"
+"      -l\tđừng in phiên bản thư mục có dấu ngã\n"
+"        \t(tương đối so với thư mục chính của người dùng)\n"
+"      -p\tin chồng thư mục, mỗi dòng một mục\n"
+"      -v\tin chồng thư mục, mỗi dòng một mục kèm vị trí trong chồng\n"
+"\n"
+"    Đối số:\n"
+"      +N\thiển thị mục thứ N bắt đầu từ bên trái danh sách\n"
+"                được hiển thị bằng `dirs' khi được gọi mà không đưa ra\n"
+"                tùy chọn, bắt đầu từ số không.\n"
+"\n"
+"      -N\thiển thị mục thứ N bắt đầu từ bên phải danh sách\n"
+"                được hiển thị bằng `dirs' khi được gọi mà không đưa ra\n"
+"                tùy chọn, bắt đầu từ số không.\n"
+"\n"
+"    Trạng thái thoát:\n"
+"    Trả về thành công nếu không đưa ra tùy chọn sai hay gặp lỗi."
+
+#: builtins.c:1863
 msgid ""
 "Set and unset shell options.\n"
 "    \n"
 "    Change the setting of each shell option OPTNAME.  Without any option\n"
-"    arguments, list all shell options with an indication of whether or not "
-"each\n"
+"    arguments, list all shell options with an indication of whether or not each\n"
 "    is set.\n"
 "    \n"
 "    Options:\n"
@@ -5303,25 +4960,24 @@ msgid ""
 "    Returns success if OPTNAME is enabled; fails if an invalid option is\n"
 "    given or OPTNAME is disabled."
 msgstr ""
-"Đặt và bỏ đặt các tùy chọn trình bao.\n"
+"Đặt và bỏ các tùy chọn shell.\n"
 "\n"
-"\tThay đổi thiết lập của mỗi tùy chọn trình bao có TÊN_TÙY_CHỌN.\n"
-"\tKhông có đối số tùy chọn thì liệt kê tất cả các tùy chọn trình bao,\n"
-"\tcũng ngụ ý mỗi tùy chọn được đặt hay không.\n"
+"    Thay đổi thiết lập của mỗi tùy chọn shell TÊN_TÙY_CHỌN.  Không có\n"
+"    đối số tùy chọn thì liệt kê tất cả các tùy chọn shell kèm chỉ dẫn\n"
+"    tùy chọn được đặt hay không.\n"
 "\n"
-"\tTùy chọn:\n"
-"\t\t-o\thạn chế TÊN_TÙY_CHỌN thành những tên được xác định\n"
-"\t\tđể sử dụng với « set -o »\n"
-"\t\t-p\tin ra mỗi tùy chọn trình bao, cũng ngụ ý trạng thái của nó\n"
-"\t\t-q\tthu hồi kết xuất\n"
-"\t\t-u\ttắt (bỏ đặt) mỗi TÊN_TÙY_CHỌN\n"
+"    Tùy chọn:\n"
+"      -o\thạn chế TÊN_TÙY_CHỌN những tên được đĩnh nghĩa\n"
+"        \tđể sử dụng với `set -o'\n"
+"      -p\tin mỗi tùy chọn shell kèm trạng thái\n"
+"      -q\tngăn kết xuất\n"
+"      -u\ttắt TÊN_TÙY_CHỌN\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công nếu TÊN_TÙY_CHỌN được bật;\n"
-"\tkhông thành công nếu đưa ra tùy chọn sai hay TÊN_TÙY_CHỌN bị tắt."
+"    Trạng thái thoát:\n"
+"    Trả lại thành công nếu TÊN_TÙY_CHỌN được bật; không thành công nếu\n"
+"   đưa ra tùy chọn sai hay TÊN_TÙY_CHỌN bị tắt."
 
-#: builtins.c:1897
-#, fuzzy
+#: builtins.c:1884
 msgid ""
 "Formats and prints ARGUMENTS under control of the FORMAT.\n"
 "    \n"
@@ -5329,63 +4985,52 @@ msgid ""
 "      -v var\tassign the output to shell variable VAR rather than\n"
 "    \t\tdisplay it on the standard output\n"
 "    \n"
-"    FORMAT is a character string which contains three types of objects: "
-"plain\n"
-"    characters, which are simply copied to standard output; character "
-"escape\n"
+"    FORMAT is a character string which contains three types of objects: plain\n"
+"    characters, which are simply copied to standard output; character escape\n"
 "    sequences, which are converted and copied to the standard output; and\n"
-"    format specifications, each of which causes printing of the next "
-"successive\n"
+"    format specifications, each of which causes printing of the next successive\n"
 "    argument.\n"
 "    \n"
-"    In addition to the standard format specifications described in printf"
-"(1),\n"
-"    printf interprets:\n"
+"    In addition to the standard format specifications described in printf(1)\n"
+"    and printf(3), printf interprets:\n"
 "    \n"
 "      %b\texpand backslash escape sequences in the corresponding argument\n"
 "      %q\tquote the argument in a way that can be reused as shell input\n"
-"      %(fmt)T output the date-time string resulting from using FMT as a "
-"format\n"
+"      %(fmt)T output the date-time string resulting from using FMT as a format\n"
 "            string for strftime(3)\n"
 "    \n"
 "    Exit Status:\n"
-"    Returns success unless an invalid option is given or a write or "
-"assignment\n"
+"    Returns success unless an invalid option is given or a write or assignment\n"
 "    error occurs."
 msgstr ""
-"Định dạng và in ra các ĐỐI_SỐ tùy theo ĐỊNH_DẠNG được diều khiển.\n"
+"Định dạng và in ĐỐI-SỐ tùy theo điều khiển của ĐỊNH_DẠNG.\n"
 "\n"
-"\tTùy chọn:\n"
-"\t\t-v BIẾN\tgán kết xuất cho biến shell này\n"
-"\t\t\thơn là hiển thị nó trên đầu ra tiêu chuẩn\n"
+"    Tùy chọn:\n"
+"      -v BIẾN\tgán kết xuất cho biến shell này thay vì\n"
+"        \thiển thị nó trên đầu ra chuẩn\n"
 "\n"
-"\tĐỊNH_DẠNG là một chuỗi ký tự mà chứa ba kiểu đối tượng:\n"
-"\t\tký tự bình thường, được sao chép sang đầu ra tiêu chuẩn;\n"
-"\t\tdãy ký tự thoát, dùng để chuyển đổi sau đó sao chép sang đầu ra tiêu "
-"chuẩn; và\n"
-"\t\tđặc tả định dạng, mỗi đặc tả gây ra in đối số kế tiếp.\n"
+"    ĐỊNH_DẠNG là chuỗi ký tự mà chứa ba kiểu đối tượng: ký tự bình\n"
+"    thường, được sao chép sang đầu ra chuẩn; dãy ký tự thoát, dùng để\n"
+"    chuyển đổi sau đó sao chép sang đầu ra chuẩn; và đặc tả định dạng,\n"
+"    mỗi đặc tả tác động lên đối số kế tiếp.\n"
 "\n"
-"\tThêm vào đặc tả định dạng tiêu chuẩn được diễn tả\n"
-"\ttrong printf(1) và printf(3), printf được diễn giả như sau:\n"
+"    Ngoài đặc tả định dạng chuẩn được trong printf(1) và printf(3),\n"
+"    printf được hiểu những đặc tả sau:\n"
 "\n"
-"\t\t%b\tmở rộng dãy thoát kiểu gạch chéo ngược trong đối số tương ứng\n"
-"\t\t%q\ttrích dẫn đối số bằng một cách có thể dùng lại được làm dữ liệu nhập "
-"vào trình bao\n"
-"      %(fmt)T xuất ra chuỗi ngày tháng là kết quả khi sử dụng FMT là định "
-"dạng\n"
-"            cho strftime(3)\n"
+"      %b\tbung dãy thoát gạch chéo ngược trong đối số tương ứng\n"
+"      %q\ttrích dẫn đối số theo cách dùng lại làm dữ liệu đầu vào shell\n"
+"      %(fmt)T\txuất chuỗi ngày tháng theo định dạng FMT từ strftime(3)\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công trừ phi đưa ra tùy chọn sai hay gặp lỗi khi ghi hay gán."
+"    Trạng thái thoát:\n"
+"    Trả lại thành công trừ phi đưa ra tùy chọn sai hay gặp lỗi khi ghi\n"
+"    hay gán."
 
-#: builtins.c:1926
+#: builtins.c:1913
 msgid ""
 "Specify how arguments are to be completed by Readline.\n"
 "    \n"
-"    For each NAME, specify how arguments are to be completed.  If no "
-"options\n"
-"    are supplied, existing completion specifications are printed in a way "
-"that\n"
+"    For each NAME, specify how arguments are to be completed.  If no options\n"
+"    are supplied, existing completion specifications are printed in a way that\n"
 "    allows them to be reused as input.\n"
 "    \n"
 "    Options:\n"
@@ -5404,60 +5049,54 @@ msgid ""
 "    Exit Status:\n"
 "    Returns success unless an invalid option is supplied or an error occurs."
 msgstr ""
-"Ghi rõ Readline sẽ điền nốt các đối số như thế nào.\n"
+"Xác định cách hoàn thành đối số bằng Readline.\n"
 "\n"
-"\tĐối với mỗi TÊN, ghi rõ các đối số sẽ được điền nốt như thế nào.\n"
-"\tKhông đưa ra tùy chọn thì in ra các đặc tả điền nốt\n"
-"\tbằng một cách cho phép dùng lại đặc tả làm dữ liệu nhập vào.\n"
+"    Đối với mỗi TÊN, ghi rõ các đối số sẽ được điền nốt như thế nào.\n"
+"    Không đưa ra tùy chọn thì in ra các đặc tả điền nốt bằng một cách\n"
+"    cho phép dùng lại đặc tả làm dữ liệu nhập vào.\n"
 "\n"
-"\tTùy chọn:\n"
-"\t\t-p\tin ra các đặc tả điền nốt đã tồn tại theo một định dạng\n"
-"\t\t\tcó thể dùng lại được\n"
-"\t\t-r\tgỡ bỏ một đặc tả điền nốt cho mỗi TÊN,\n"
-"\t\t\thoặc nếu không đưa ra TÊN thì gỡ bỏ tất cả các đặc tả điền nốt\n"
+"    Tùy chọn:\n"
+"      -p\tin đặc tả điền nốt đã tồn tại theo định dạng dùng lại được\n"
+"      -r\tgỡ bỏ đặc tả điền nốt cho mỗi TÊN,\n"
+"        \thoặc nếu có TÊN thì gỡ bỏ tất cả các đặc tả điền nốt\n"
 "      -D\táp dụng các sự hoàn thành và hành động làm mặc định\n"
 "\t\tcho câu lệnh mà không xác định sự hoàn thành riêng\n"
-"      -E\táp dụng các sự hoàn thành và hành động cho câu lệnh « trống »\n"
+"      -E\táp dụng các sự hoàn thành và hành động cho câu lệnh `trống'\n"
 "\t\t(empty) -- thử hoàn thành trên dòng trắng\n"
 "\n"
-"\tKhi chức năng điền nốt được thử, những hành động được làm\n"
-"\t\ttheo thứ tự của những tùy chọn chữ hoa bên trên.\n"
+"    Khi chức năng điền nốt được thử, những hành động được làm theo thứ\n"
+"    tự của những tùy chọn chữ hoa bên trên.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công nếu không đưa ra tùy chọn sai hay gặp lỗi."
+"    Trạng thái thoát:\n"
+"    Trả lại thành công nếu không đưa ra tùy chọn sai hay gặp lỗi."
 
-#: builtins.c:1954
+#: builtins.c:1941
 msgid ""
 "Display possible completions depending on the options.\n"
 "    \n"
 "    Intended to be used from within a shell function generating possible\n"
-"    completions.  If the optional WORD argument is supplied, matches "
-"against\n"
+"    completions.  If the optional WORD argument is supplied, matches against\n"
 "    WORD are generated.\n"
 "    \n"
 "    Exit Status:\n"
 "    Returns success unless an invalid option is supplied or an error occurs."
 msgstr ""
-"Hiển thị các việc điền nốt có thể làm, phụ thuộc vào những tùy chọn.\n"
+"Hiển thị hoàn thành có thể tuỳ  vào tùy chọn.\n"
 "\n"
-"\tDự định dùng từ bên trong một chức năng trình bao\n"
-"\tmà tạo các việc điền nốt có thể làm.\n"
-"\tNếu đưa ra đối số TỪ vẫn tùy chọn,\n"
-"\tthì tạo các kết quả tương ứng với TỪ.\n"
+"    Dự định dùng từ bên trong một chức năng shell mà tạo các việc\n"
+"    điền nốt có thể làm. Nếu đưa ra đối số TỪ vẫn tùy chọn, thì tạo\n"
+"    các kết quả tương ứng với TỪ.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công nếu không đưa ra tùy chọn sai hay gặp lỗi."
+"    Trạng thái thoát:\n"
+"    Trả lại thành công nếu không đưa ra tùy chọn sai hay gặp lỗi."
 
-#: builtins.c:1969
+#: builtins.c:1956
 msgid ""
 "Modify or display completion options.\n"
 "    \n"
-"    Modify the completion options for each NAME, or, if no NAMEs are "
-"supplied,\n"
-"    the completion currently being executed.  If no OPTIONs are given, "
-"print\n"
-"    the completion options for each NAME or the current completion "
-"specification.\n"
+"    Modify the completion options for each NAME, or, if no NAMEs are supplied,\n"
+"    the completion currently being executed.  If no OPTIONs are given, print\n"
+"    the completion options for each NAME or the current completion specification.\n"
 "    \n"
 "    Options:\n"
 "    \t-o option\tSet completion option OPTION for each NAME\n"
@@ -5480,53 +5119,46 @@ msgid ""
 msgstr ""
 "Sửa đổi hoặc hiển thị các tùy chọn điền nốt.\n"
 "\n"
-"\tSửa đổi các tùy chọn điền nốt đối với mỗi TÊN, hoặc nếu không đưa ra TÊN \n"
-"\tthì chức năng điền nốt hiện tại sẽ được thi hành, nếu không TÙY_CHỌN được "
-"chỉ ra, in ra\n"
-"\tcác tùy chọn điền nốt cho mỗi TÊN hay các đặc tính kỹ thuật hiện có\n"
+"    Sửa đổi các tùy chọn điền nốt đối với mỗi TÊN, hoặc nếu không đưa\n"
+"    ra TÊN thì chức năng điền nốt hiện tại sẽ được thi hành, nếu không\n"
+"    TÙY_CHỌN được chỉ ra, in ra các tùy chọn điền nốt cho mỗi TÊN hay\n"
+"    các đặc tính kỹ thuật hiện có\n"
 "\n"
-"\tTùy chọn\"\n"
-"\t\t-o tùy_chọn\tđặt TÙY_CHỌN điền nốt này đối với mỗi TÊN\n"
-"   \t-D\t\tSửa đổi các TÙY_CHỌN về sự điền nốt câu lệnh `mặc "
-"định' (default)\n"
-"    \t-E\t\tSửa đổi các TÙY_CHỌN  về sự điền nốt câu lệnh `trống' (empty)\n"
+"    Tùy chọn:\n"
+"      -o tùy_chọn\tđặt TÙY_CHỌN điền nốt này đối với mỗi TÊN\n"
+"      -D\t\tSửa TÙY_CHỌN về điền nốt lệnh `default '\n"
+"      -E\t\tSửa TÙY_CHỌN về điền nốt lệnh `empty'\n"
 "\n"
-"\tDùng `+o' thay cho `-o' thì tắt tùy chọn đưa ra.\n"
+"    Dùng `+o' thay cho `-o' thì tắt tùy chọn đưa ra.\n"
 "\n"
-"\tĐối số :\n"
+"    Đối số:\n"
 "\n"
-"\tMỗi TÊN tham chiếu đến một câu lệnh cho đó một đặc tả điền nốt\n"
-"\tphải được xác định trước dùng dựng sẵn « complete ». Nếu không đưa ra TÊN\n"
-"\tđể áp dụng,  thì « compopt » phải được gọi bởi một hàm đang tạo\n"
-"\t việc điền nốt, và các tùy chọn về hàm tạo việc điền nốt đang chạy\n"
-"\tcũng được sửa đổi.\n"
+"    Mỗi TÊN tham chiếu đến một câu lệnh cho đó một đặc tả điền nốt\n"
+"    phải được xác định trước dùng dựng sẵn `complete'. Nếu không đưa\n"
+"    ra TÊN để áp dụng, thì `compopt' phải được gọi bởi một hàm đang\n"
+"    tạo việc điền nốt, và các tùy chọn về hàm tạo việc điền nốt đang\n"
+"    chạy cũng được sửa đổi.\n"
 "\n"
-"\tTrạng thái thoát:\n"
-"\tTrả lại thành công trừ phi đưa ra tùy chọn sai, hoặc TÊN\n"
-"\tcó một đặc tả điền nốt được xác định."
+"    Trạng thái thoát:\n"
+"    Trả lại thành công trừ phi đưa ra tùy chọn sai, hoặc TÊN có một\n"
+"    đặc tả điền nốt được xác định."
 
-#: builtins.c:1999
+#: builtins.c:1986
 msgid ""
 "Read lines from the standard input into an indexed array variable.\n"
 "    \n"
-"    Read lines from the standard input into the indexed array variable "
-"ARRAY, or\n"
-"    from file descriptor FD if the -u option is supplied.  The variable "
-"MAPFILE\n"
+"    Read lines from the standard input into the indexed array variable ARRAY, or\n"
+"    from file descriptor FD if the -u option is supplied.  The variable MAPFILE\n"
 "    is the default ARRAY.\n"
 "    \n"
 "    Options:\n"
-"      -n count\tCopy at most COUNT lines.  If COUNT is 0, all lines are "
-"copied.\n"
-"      -O origin\tBegin assigning to ARRAY at index ORIGIN.  The default "
-"index is 0.\n"
+"      -n count\tCopy at most COUNT lines.  If COUNT is 0, all lines are copied.\n"
+"      -O origin\tBegin assigning to ARRAY at index ORIGIN.  The default index is 0.\n"
 "      -s count \tDiscard the first COUNT lines read.\n"
 "      -t\t\tRemove a trailing newline from each line read.\n"
-"      -u fd\t\tRead lines from file descriptor FD instead of the standard "
-"input.\n"
+"      -u fd\t\tRead lines from file descriptor FD instead of the standard input.\n"
 "      -C callback\tEvaluate CALLBACK each time QUANTUM lines are read.\n"
-"      -c quantum\tSpecify the number of lines read between each call to "
-"CALLBACK.\n"
+"      -c quantum\tSpecify the number of lines read between each call to CALLBACK.\n"
 "    \n"
 "    Arguments:\n"
 "      ARRAY\t\tArray variable name to use for file data.\n"
@@ -5536,47 +5168,43 @@ msgid ""
 "    element to be assigned and the line to be assigned to that element\n"
 "    as additional arguments.\n"
 "    \n"
-"    If not supplied with an explicit origin, mapfile will clear ARRAY "
-"before\n"
+"    If not supplied with an explicit origin, mapfile will clear ARRAY before\n"
 "    assigning to it.\n"
 "    \n"
 "    Exit Status:\n"
-"    Returns success unless an invalid option is given or ARRAY is readonly "
-"or\n"
+"    Returns success unless an invalid option is given or ARRAY is readonly or\n"
 "    not an indexed array."
 msgstr ""
 "Đọc các dòng từ đầu vào tiêu chuẩn vào một biến mảng chỉ số.\n"
 "\n"
-"\tĐọc các dòng từ đầu vào tiêu chuẩn vào biến mảng MẢNG,\n"
-"\thoặc từ bộ mô tả tập tin FD nếu đưa ra tùy chọn -u.\n"
-"\tBiến MAPFILE là MẢNG mặc định.\n"
+"    Đọc các dòng từ đầu vào tiêu chuẩn vào biến mảng MẢNG, hoặc từ bộ\n"
+"    mô tả tập tin FD nếu đưa ra tùy chọn -u. Biến MAPFILE là MẢNG mặc\n"
+"    định.\n"
 "\n"
-"\tTùy chọn:\n"
-"\t\t-n SỐ\tsao chép nhiều nhất SỐ dòng. Nếu SỐ là 0 thì sao chép mọi dòng.\n"
-"\t\t-O GỐC\tbắt đầu gán cho MẢNG ở chỉ mục GỐC. Chỉ mục mặc định là 0.\n"
-"\t\t-s SỐ\tbỏ qua SỐ dòng đầu tiên được đọc.\n"
-"\t\t-t\tgỡ bỏ một ký tự dòng mới theo sau khỏi mỗi dòng được đọc.\n"
-"\t\t-u FD\tđọc các dòng từ bộ mô tả tập tin FD thay vào từ đầu vào tiêu "
-"chuẩn.\n"
-"\t\t-C GỌI_NGƯỢC\tđịnh giá GỌI_NGƯỢC mỗi lần đọc LƯỢNG dòng.\n"
-"\t\t-c LƯỢNG\tghi rõ số các dòng được đọc giữa hai lần gọi GỌI_NGƯỢC.\n"
+"    Tùy chọn:\n"
+"      -n SỐ\tsao chép nhiều nhất SỐ dòng. Nếu SỐ là 0 thì sao chép mọi dòng.\n"
+"      -O GỐC\tbắt đầu gán cho MẢNG ở chỉ mục GỐC. Chỉ mục mặc định là 0.\n"
+"      -s SỐ\tbỏ qua SỐ dòng đầu tiên được đọc.\n"
+"      -t\tgỡ bỏ một ký tự dòng mới theo sau khỏi mỗi dòng được đọc.\n"
+"      -u FD\tđọc các dòng từ bộ mô tả tập tin FD thay vào từ đầu vào tiêu chuẩn.\n"
+"      -C GỌI_NGƯỢC\tđịnh giá GỌI_NGƯỢC mỗi lần đọc LƯỢNG dòng.\n"
+"      -c LƯỢNG\tghi rõ số các dòng được đọc giữa hai lần gọi GỌI_NGƯỢC.\n"
 "\n"
-"\tĐối số :\n"
-"\tMẢNG\ttên biến mảng cần dùng cho dữ liệu tập tin.\n"
+"    Đối số:\n"
+"      MẢNG\ttên biến mảng cần dùng cho dữ liệu tập tin.\n"
 "\n"
-"\tNếu đưa ra -C mà không có -c thì lượng mặc định là 5000.\n"
-"\tKhi ước lượng lời GỌI_NGƯỢC thì nó nhận chỉ số của phần tử mảng\n"
-"\tkế tiếp được gán dưới dạng một đối số bổ sung.\n"
+"    Nếu đưa ra -C mà không có -c thì lượng mặc định là 5000. Khi ước\n"
+"    lượng lời GỌI_NGƯỢC thì nó nhận chỉ số của phần tử mảng kế tiếp\n"
+"    được gán dưới dạng một đối số bổ sung.\n"
 "\n"
-"\tKhông đưa ra một GỐC dứt khoát thì mapfile (tập tin sơ đồ)\n"
-"\t\tsẽ xoá sạch MẢNG trước khi gán cho nó.\n"
+"    Không đưa ra một GỐC dứt khoát thì mapfile (tập tin sơ đồ) sẽ xoá\n"
+"    sạch MẢNG trước khi gán cho nó.\n"
 "\n"
-"\tTráng thái thoát:\n"
-"\tTrả lại thành công trừ phi đưa ra tùy chọn sai và MẢNG không phải chỉ đọc "
-"hay\n"
-"không là một mảng chỉ số."
+"    Trạng thái thoát:\n"
+"    Trả lại thành công trừ phi đưa ra tùy chọn sai và MẢNG không phải\n"
+"    chỉ đọc hay không là một mảng chỉ số."
 
-#: builtins.c:2033
+#: builtins.c:2020
 msgid ""
 "Read lines from a file into an array variable.\n"
 "    \n"
@@ -5584,7 +5212,7 @@ msgid ""
 msgstr ""
 "Đọc các dòng từ một tập tin vào một biến mảng.\n"
 "\n"
-"\tĐồng nghĩa với « mapfile »."
+"    Đồng nghĩa với `mapfile'."
 
 #~ msgid ""
 #~ ".  With EXPR, returns\n"
@@ -5597,8 +5225,7 @@ msgstr ""
 #~ "; this extra information can be used to\n"
 #~ "    provide a stack trace.\n"
 #~ "    \n"
-#~ "    The value of EXPR indicates how many call frames to go back before "
-#~ "the\n"
+#~ "    The value of EXPR indicates how many call frames to go back before the\n"
 #~ "    current one; the top frame is frame 0."
 #~ msgstr ""
 #~ "; thông tin thêm này có thể được sử dụng\n"
diff --git a/shell.c b/shell.c
index eebcc394fece2426894bbdf3840fd95aa28cefa6..93b6b9b13114558bd4b98d59c7d261a56489815e 100644 (file)
--- a/shell.c
+++ b/shell.c
@@ -252,7 +252,9 @@ static const struct {
   { "noprofile", Int, &no_profile, (char **)0x0 },
   { "norc", Int, &no_rc, (char **)0x0 },
   { "posix", Int, &posixly_correct, (char **)0x0 },
+#if defined (WORDEXP_OPTION)
   { "protected", Int, &protected_mode, (char **)0x0 },
+#endif
   { "rcfile", Charp, (int *)0x0, &bashrc_file },
 #if defined (RESTRICTED_SHELL)
   { "restricted", Int, &restricted, (char **)0x0 },
diff --git a/subst.c b/subst.c
index e09d24b3a5495b1968335cbb8553d78d3340e710..4c033a873776e3196a8bb897add2eee15a60c355 100644 (file)
--- a/subst.c
+++ b/subst.c
@@ -7875,7 +7875,7 @@ comsub:
          temp = nameref_cell (var);
          if (temp && *temp && valid_array_reference (temp))
            {
-             tdesc = parameter_brace_expand_word (temp, SPECIAL_VAR (temp, 0), quoted, pflags, (int *)NULL);
+             tdesc = parameter_brace_expand_word (temp, SPECIAL_VAR (temp, 0), quoted, pflags, (arrayind_t *)NULL);
              if (tdesc == &expand_wdesc_error || tdesc == &expand_wdesc_fatal)
                return (tdesc);
              ret = tdesc;
diff --git a/subst.c~ b/subst.c~
new file mode 100644 (file)
index 0000000..e09d24b
--- /dev/null
+++ b/subst.c~
@@ -0,0 +1,9515 @@
+/* subst.c -- The part of the shell that does parameter, command, arithmetic,
+   and globbing substitutions. */
+
+/* ``Have a little faith, there's magic in the night.  You ain't a
+     beauty, but, hey, you're alright.'' */
+
+/* Copyright (C) 1987-2012 Free Software Foundation, Inc.
+
+   This file is part of GNU Bash, the Bourne Again SHell.
+
+   Bash is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   Bash is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with Bash.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "config.h"
+
+#include "bashtypes.h"
+#include <stdio.h>
+#include "chartypes.h"
+#if defined (HAVE_PWD_H)
+#  include <pwd.h>
+#endif
+#include <signal.h>
+#include <errno.h>
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif
+
+#include "bashansi.h"
+#include "posixstat.h"
+#include "bashintl.h"
+
+#include "shell.h"
+#include "parser.h"
+#include "flags.h"
+#include "jobs.h"
+#include "execute_cmd.h"
+#include "filecntl.h"
+#include "trap.h"
+#include "pathexp.h"
+#include "mailcheck.h"
+
+#include "shmbutil.h"
+#include "typemax.h"
+
+#include "builtins/getopt.h"
+#include "builtins/common.h"
+
+#include "builtins/builtext.h"
+
+#include <tilde/tilde.h>
+#include <glob/strmatch.h>
+
+#if !defined (errno)
+extern int errno;
+#endif /* !errno */
+
+/* The size that strings change by. */
+#define DEFAULT_INITIAL_ARRAY_SIZE 112
+#define DEFAULT_ARRAY_SIZE 128
+
+/* Variable types. */
+#define VT_VARIABLE    0
+#define VT_POSPARMS    1
+#define VT_ARRAYVAR    2
+#define VT_ARRAYMEMBER 3
+#define VT_ASSOCVAR    4
+
+#define VT_STARSUB     128     /* $* or ${array[*]} -- used to split */
+
+/* Flags for quoted_strchr */
+#define ST_BACKSL      0x01
+#define ST_CTLESC      0x02
+#define ST_SQUOTE      0x04    /* unused yet */
+#define ST_DQUOTE      0x08    /* unused yet */
+
+/* Flags for the `pflags' argument to param_expand() */
+#define PF_NOCOMSUB    0x01    /* Do not perform command substitution */
+#define PF_IGNUNBOUND  0x02    /* ignore unbound vars even if -u set */
+#define PF_NOSPLIT2    0x04    /* same as W_NOSPLIT2 */
+#define PF_ASSIGNRHS   0x08    /* same as W_ASSIGNRHS */
+
+/* These defs make it easier to use the editor. */
+#define LBRACE         '{'
+#define RBRACE         '}'
+#define LPAREN         '('
+#define RPAREN         ')'
+
+#if defined (HANDLE_MULTIBYTE)
+#define WLPAREN                L'('
+#define WRPAREN                L')'
+#endif
+
+/* Evaluates to 1 if C is one of the shell's special parameters whose length
+   can be taken, but is also one of the special expansion characters. */
+#define VALID_SPECIAL_LENGTH_PARAM(c) \
+  ((c) == '-' || (c) == '?' || (c) == '#')
+
+/* Evaluates to 1 if C is one of the shell's special parameters for which an
+   indirect variable reference may be made. */
+#define VALID_INDIR_PARAM(c) \
+  ((posixly_correct == 0 && (c) == '#') || (posixly_correct == 0 && (c) == '?') || (c) == '@' || (c) == '*')
+
+/* Evaluates to 1 if C is one of the OP characters that follows the parameter
+   in ${parameter[:]OPword}. */
+#define VALID_PARAM_EXPAND_CHAR(c) (sh_syntaxtab[(unsigned char)c] & CSUBSTOP)
+
+/* Evaluates to 1 if this is one of the shell's special variables. */
+#define SPECIAL_VAR(name, wi) \
+ ((DIGIT (*name) && all_digits (name)) || \
+      (name[1] == '\0' && (sh_syntaxtab[(unsigned char)*name] & CSPECVAR)) || \
+      (wi && name[2] == '\0' && VALID_INDIR_PARAM (name[1])))
+
+/* An expansion function that takes a string and a quoted flag and returns
+   a WORD_LIST *.  Used as the type of the third argument to
+   expand_string_if_necessary(). */
+typedef WORD_LIST *EXPFUNC __P((char *, int));
+
+/* Process ID of the last command executed within command substitution. */
+pid_t last_command_subst_pid = NO_PID;
+pid_t current_command_subst_pid = NO_PID;
+
+/* Variables used to keep track of the characters in IFS. */
+SHELL_VAR *ifs_var;
+char *ifs_value;
+unsigned char ifs_cmap[UCHAR_MAX + 1];
+
+#if defined (HANDLE_MULTIBYTE)
+unsigned char ifs_firstc[MB_LEN_MAX];
+size_t ifs_firstc_len;
+#else
+unsigned char ifs_firstc;
+#endif
+
+/* Sentinel to tell when we are performing variable assignments preceding a
+   command name and putting them into the environment.  Used to make sure
+   we use the temporary environment when looking up variable values. */
+int assigning_in_environment;
+
+/* Used to hold a list of variable assignments preceding a command.  Global
+   so the SIGCHLD handler in jobs.c can unwind-protect it when it runs a
+   SIGCHLD trap and so it can be saved and restored by the trap handlers. */
+WORD_LIST *subst_assign_varlist = (WORD_LIST *)NULL;
+
+/* Extern functions and variables from different files. */
+extern int last_command_exit_value, last_command_exit_signal;
+extern int subshell_environment, line_number;
+extern int subshell_level, parse_and_execute_level, sourcelevel;
+extern int eof_encountered;
+extern int return_catch_flag, return_catch_value;
+extern pid_t dollar_dollar_pid;
+extern int posixly_correct;
+extern char *this_command_name;
+extern struct fd_bitmap *current_fds_to_close;
+extern int wordexp_only;
+extern int expanding_redir;
+extern int tempenv_assign_error;
+
+#if !defined (HAVE_WCSDUP) && defined (HANDLE_MULTIBYTE)
+extern wchar_t *wcsdup __P((const wchar_t *));
+#endif
+
+/* Non-zero means to allow unmatched globbed filenames to expand to
+   a null file. */
+int allow_null_glob_expansion;
+
+/* Non-zero means to throw an error when globbing fails to match anything. */
+int fail_glob_expansion;
+
+#if 0
+/* Variables to keep track of which words in an expanded word list (the
+   output of expand_word_list_internal) are the result of globbing
+   expansions.  GLOB_ARGV_FLAGS is used by execute_cmd.c.
+   (CURRENTLY UNUSED). */
+char *glob_argv_flags;
+static int glob_argv_flags_size;
+#endif
+
+static WORD_LIST expand_word_error, expand_word_fatal;
+static WORD_DESC expand_wdesc_error, expand_wdesc_fatal;
+static char expand_param_error, expand_param_fatal;
+static char extract_string_error, extract_string_fatal;
+
+/* Tell the expansion functions to not longjmp back to top_level on fatal
+   errors.  Enabled when doing completion and prompt string expansion. */
+static int no_longjmp_on_fatal_error = 0;
+
+/* Set by expand_word_unsplit; used to inhibit splitting and re-joining
+   $* on $IFS, primarily when doing assignment statements. */
+static int expand_no_split_dollar_star = 0;
+
+/* A WORD_LIST of words to be expanded by expand_word_list_internal,
+   without any leading variable assignments. */
+static WORD_LIST *garglist = (WORD_LIST *)NULL;
+
+static char *quoted_substring __P((char *, int, int));
+static int quoted_strlen __P((char *));
+static char *quoted_strchr __P((char *, int, int));
+
+static char *expand_string_if_necessary __P((char *, int, EXPFUNC *));
+static inline char *expand_string_to_string_internal __P((char *, int, EXPFUNC *));
+static WORD_LIST *call_expand_word_internal __P((WORD_DESC *, int, int, int *, int *));
+static WORD_LIST *expand_string_internal __P((char *, int));
+static WORD_LIST *expand_string_leave_quoted __P((char *, int));
+static WORD_LIST *expand_string_for_rhs __P((char *, int, int *, int *));
+
+static WORD_LIST *list_quote_escapes __P((WORD_LIST *));
+static char *make_quoted_char __P((int));
+static WORD_LIST *quote_list __P((WORD_LIST *));
+
+static int unquoted_substring __P((char *, char *));
+static int unquoted_member __P((int, char *));
+
+#if defined (ARRAY_VARS)
+static SHELL_VAR *do_compound_assignment __P((char *, char *, int));
+#endif
+static int do_assignment_internal __P((const WORD_DESC *, int));
+
+static char *string_extract_verbatim __P((char *, size_t, int *, char *, int));
+static char *string_extract __P((char *, int *, char *, int));
+static char *string_extract_double_quoted __P((char *, int *, int));
+static inline char *string_extract_single_quoted __P((char *, int *));
+static inline int skip_single_quoted __P((const char *, size_t, int));
+static int skip_double_quoted __P((char *, size_t, int));
+static char *extract_delimited_string __P((char *, int *, char *, char *, char *, int));
+static char *extract_dollar_brace_string __P((char *, int *, int, int));
+static int skip_matched_pair __P((const char *, int, int, int, int));
+
+static char *pos_params __P((char *, int, int, int));
+
+static unsigned char *mb_getcharlens __P((char *, int));
+
+static char *remove_upattern __P((char *, char *, int));
+#if defined (HANDLE_MULTIBYTE) 
+static wchar_t *remove_wpattern __P((wchar_t *, size_t, wchar_t *, int));
+#endif
+static char *remove_pattern __P((char *, char *, int));
+
+static int match_upattern __P((char *, char *, int, char **, char **));
+#if defined (HANDLE_MULTIBYTE)
+static int match_wpattern __P((wchar_t *, char **, size_t, wchar_t *, int, char **, char **));
+#endif
+static int match_pattern __P((char *, char *, int, char **, char **));
+static int getpatspec __P((int, char *));
+static char *getpattern __P((char *, int, int));
+static char *variable_remove_pattern __P((char *, char *, int, int));
+static char *list_remove_pattern __P((WORD_LIST *, char *, int, int, int));
+static char *parameter_list_remove_pattern __P((int, char *, int, int));
+#ifdef ARRAY_VARS
+static char *array_remove_pattern __P((SHELL_VAR *, char *, int, char *, int));
+#endif
+static char *parameter_brace_remove_pattern __P((char *, char *, int, char *, int, int, int));
+
+static char *process_substitute __P((char *, int));
+
+static char *read_comsub __P((int, int, int *));
+
+#ifdef ARRAY_VARS
+static arrayind_t array_length_reference __P((char *));
+#endif
+
+static int valid_brace_expansion_word __P((char *, int));
+static int chk_atstar __P((char *, int, int *, int *));
+static int chk_arithsub __P((const char *, int));
+
+static WORD_DESC *parameter_brace_expand_word __P((char *, int, int, int, arrayind_t *));
+static WORD_DESC *parameter_brace_expand_indir __P((char *, int, int, int *, int *));
+static WORD_DESC *parameter_brace_expand_rhs __P((char *, char *, int, int, int *, int *));
+static void parameter_brace_expand_error __P((char *, char *));
+
+static int valid_length_expression __P((char *));
+static intmax_t parameter_brace_expand_length __P((char *));
+
+static char *skiparith __P((char *, int));
+static int verify_substring_values __P((SHELL_VAR *, char *, char *, int, intmax_t *, intmax_t *));
+static int get_var_and_type __P((char *, char *, arrayind_t, int, int, SHELL_VAR **, char **));
+static char *mb_substring __P((char *, int, int));
+static char *parameter_brace_substring __P((char *, char *, int, char *, int, int));
+
+static int shouldexp_replacement __P((char *));
+
+static char *pos_params_pat_subst __P((char *, char *, char *, int));
+
+static char *parameter_brace_patsub __P((char *, char *, int, char *, int, int));
+
+static char *pos_params_casemod __P((char *, char *, int, int));
+static char *parameter_brace_casemod __P((char *, char *, int, int, char *, int, int));
+
+static WORD_DESC *parameter_brace_expand __P((char *, int *, int, int, int *, int *));
+static WORD_DESC *param_expand __P((char *, int *, int, int *, int *, int *, int *, int));
+
+static WORD_LIST *expand_word_internal __P((WORD_DESC *, int, int, int *, int *));
+
+static WORD_LIST *word_list_split __P((WORD_LIST *));
+
+static void exp_jump_to_top_level __P((int));
+
+static WORD_LIST *separate_out_assignments __P((WORD_LIST *));
+static WORD_LIST *glob_expand_word_list __P((WORD_LIST *, int));
+#ifdef BRACE_EXPANSION
+static WORD_LIST *brace_expand_word_list __P((WORD_LIST *, int));
+#endif
+#if defined (ARRAY_VARS)
+static int make_internal_declare __P((char *, char *));
+#endif
+static WORD_LIST *shell_expand_word_list __P((WORD_LIST *, int));
+static WORD_LIST *expand_word_list_internal __P((WORD_LIST *, int));
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Utility Functions                           */
+/*                                                                 */
+/* **************************************************************** */
+
+#if defined (DEBUG)
+void
+dump_word_flags (flags)
+     int flags;
+{
+  int f;
+
+  f = flags;
+  fprintf (stderr, "%d -> ", f);
+  if (f & W_ASSIGNASSOC)
+    {
+      f &= ~W_ASSIGNASSOC;
+      fprintf (stderr, "W_ASSIGNASSOC%s", f ? "|" : "");
+    }
+  if (f & W_HASCTLESC)
+    {
+      f &= ~W_HASCTLESC;
+      fprintf (stderr, "W_HASCTLESC%s", f ? "|" : "");
+    }
+  if (f & W_NOPROCSUB)
+    {
+      f &= ~W_NOPROCSUB;
+      fprintf (stderr, "W_NOPROCSUB%s", f ? "|" : "");
+    }
+  if (f & W_DQUOTE)
+    {
+      f &= ~W_DQUOTE;
+      fprintf (stderr, "W_DQUOTE%s", f ? "|" : "");
+    }
+  if (f & W_HASQUOTEDNULL)
+    {
+      f &= ~W_HASQUOTEDNULL;
+      fprintf (stderr, "W_HASQUOTEDNULL%s", f ? "|" : "");
+    }
+  if (f & W_ASSIGNARG)
+    {
+      f &= ~W_ASSIGNARG;
+      fprintf (stderr, "W_ASSIGNARG%s", f ? "|" : "");
+    }
+  if (f & W_ASSNBLTIN)
+    {
+      f &= ~W_ASSNBLTIN;
+      fprintf (stderr, "W_ASSNBLTIN%s", f ? "|" : "");
+    }
+  if (f & W_ASSNGLOBAL)
+    {
+      f &= ~W_ASSNGLOBAL;
+      fprintf (stderr, "W_ASSNGLOBAL%s", f ? "|" : "");
+    }
+  if (f & W_COMPASSIGN)
+    {
+      f &= ~W_COMPASSIGN;
+      fprintf (stderr, "W_COMPASSIGN%s", f ? "|" : "");
+    }
+  if (f & W_NOEXPAND)
+    {
+      f &= ~W_NOEXPAND;
+      fprintf (stderr, "W_NOEXPAND%s", f ? "|" : "");
+    }
+  if (f & W_ITILDE)
+    {
+      f &= ~W_ITILDE;
+      fprintf (stderr, "W_ITILDE%s", f ? "|" : "");
+    }
+  if (f & W_NOTILDE)
+    {
+      f &= ~W_NOTILDE;
+      fprintf (stderr, "W_NOTILDE%s", f ? "|" : "");
+    }
+  if (f & W_ASSIGNRHS)
+    {
+      f &= ~W_ASSIGNRHS;
+      fprintf (stderr, "W_ASSIGNRHS%s", f ? "|" : "");
+    }
+  if (f & W_NOCOMSUB)
+    {
+      f &= ~W_NOCOMSUB;
+      fprintf (stderr, "W_NOCOMSUB%s", f ? "|" : "");
+    }
+  if (f & W_DOLLARSTAR)
+    {
+      f &= ~W_DOLLARSTAR;
+      fprintf (stderr, "W_DOLLARSTAR%s", f ? "|" : "");
+    }
+  if (f & W_DOLLARAT)
+    {
+      f &= ~W_DOLLARAT;
+      fprintf (stderr, "W_DOLLARAT%s", f ? "|" : "");
+    }
+  if (f & W_TILDEEXP)
+    {
+      f &= ~W_TILDEEXP;
+      fprintf (stderr, "W_TILDEEXP%s", f ? "|" : "");
+    }
+  if (f & W_NOSPLIT2)
+    {
+      f &= ~W_NOSPLIT2;
+      fprintf (stderr, "W_NOSPLIT2%s", f ? "|" : "");
+    }
+  if (f & W_NOSPLIT)
+    {
+      f &= ~W_NOSPLIT;
+      fprintf (stderr, "W_NOSPLIT%s", f ? "|" : "");
+    }
+  if (f & W_NOBRACE)
+    {
+      f &= ~W_NOBRACE;
+      fprintf (stderr, "W_NOBRACE%s", f ? "|" : "");
+    }
+  if (f & W_NOGLOB)
+    {
+      f &= ~W_NOGLOB;
+      fprintf (stderr, "W_NOGLOB%s", f ? "|" : "");
+    }
+  if (f & W_GLOBEXP)
+    {
+      f &= ~W_GLOBEXP;
+      fprintf (stderr, "W_GLOBEXP%s", f ? "|" : "");
+    }
+  if (f & W_ASSIGNMENT)
+    {
+      f &= ~W_ASSIGNMENT;
+      fprintf (stderr, "W_ASSIGNMENT%s", f ? "|" : "");
+    }
+  if (f & W_QUOTED)
+    {
+      f &= ~W_QUOTED;
+      fprintf (stderr, "W_QUOTED%s", f ? "|" : "");
+    }
+  if (f & W_HASDOLLAR)
+    {
+      f &= ~W_HASDOLLAR;
+      fprintf (stderr, "W_HASDOLLAR%s", f ? "|" : "");
+    }
+  fprintf (stderr, "\n");
+  fflush (stderr);
+}
+#endif
+
+#ifdef INCLUDE_UNUSED
+static char *
+quoted_substring (string, start, end)
+     char *string;
+     int start, end;
+{
+  register int len, l;
+  register char *result, *s, *r;
+
+  len = end - start;
+
+  /* Move to string[start], skipping quoted characters. */
+  for (s = string, l = 0; *s && l < start; )
+    {
+      if (*s == CTLESC)
+       {
+         s++;
+         continue;
+       }
+      l++;
+      if (*s == 0)
+       break;
+    }
+
+  r = result = (char *)xmalloc (2*len + 1);      /* save room for quotes */
+
+  /* Copy LEN characters, including quote characters. */
+  s = string + l;
+  for (l = 0; l < len; s++)
+    {
+      if (*s == CTLESC)
+       *r++ = *s++;
+      *r++ = *s;
+      l++;
+      if (*s == 0)
+       break;
+    }
+  *r = '\0';
+  return result;
+}
+#endif
+
+#ifdef INCLUDE_UNUSED
+/* Return the length of S, skipping over quoted characters */
+static int
+quoted_strlen (s)
+     char *s;
+{
+  register char *p;
+  int i;
+
+  i = 0;
+  for (p = s; *p; p++)
+    {
+      if (*p == CTLESC)
+       {
+         p++;
+         if (*p == 0)
+           return (i + 1);
+       }
+      i++;
+    }
+
+  return i;
+}
+#endif
+
+/* Find the first occurrence of character C in string S, obeying shell
+   quoting rules.  If (FLAGS & ST_BACKSL) is non-zero, backslash-escaped
+   characters are skipped.  If (FLAGS & ST_CTLESC) is non-zero, characters
+   escaped with CTLESC are skipped. */
+static char *
+quoted_strchr (s, c, flags)
+     char *s;
+     int c, flags;
+{
+  register char *p;
+
+  for (p = s; *p; p++)
+    {
+      if (((flags & ST_BACKSL) && *p == '\\')
+           || ((flags & ST_CTLESC) && *p == CTLESC))
+       {
+         p++;
+         if (*p == '\0')
+           return ((char *)NULL);
+         continue;
+       }
+      else if (*p == c)
+       return p;
+    }
+  return ((char *)NULL);
+}
+
+/* Return 1 if CHARACTER appears in an unquoted portion of
+   STRING.  Return 0 otherwise.  CHARACTER must be a single-byte character. */
+static int
+unquoted_member (character, string)
+     int character;
+     char *string;
+{
+  size_t slen;
+  int sindex, c;
+  DECLARE_MBSTATE;
+
+  slen = strlen (string);
+  sindex = 0;
+  while (c = string[sindex])
+    {
+      if (c == character)
+       return (1);
+
+      switch (c)
+       {
+       default:
+         ADVANCE_CHAR (string, slen, sindex);
+         break;
+
+       case '\\':
+         sindex++;
+         if (string[sindex])
+           ADVANCE_CHAR (string, slen, sindex);
+         break;
+
+       case '\'':
+         sindex = skip_single_quoted (string, slen, ++sindex);
+         break;
+
+       case '"':
+         sindex = skip_double_quoted (string, slen, ++sindex);
+         break;
+       }
+    }
+  return (0);
+}
+
+/* Return 1 if SUBSTR appears in an unquoted portion of STRING. */
+static int
+unquoted_substring (substr, string)
+     char *substr, *string;
+{
+  size_t slen;
+  int sindex, c, sublen;
+  DECLARE_MBSTATE;
+
+  if (substr == 0 || *substr == '\0')
+    return (0);
+
+  slen = strlen (string);
+  sublen = strlen (substr);
+  for (sindex = 0; c = string[sindex]; )
+    {
+      if (STREQN (string + sindex, substr, sublen))
+       return (1);
+
+      switch (c)
+       {
+       case '\\':
+         sindex++;
+         if (string[sindex])
+           ADVANCE_CHAR (string, slen, sindex);
+         break;
+
+       case '\'':
+         sindex = skip_single_quoted (string, slen, ++sindex);
+         break;
+
+       case '"':
+         sindex = skip_double_quoted (string, slen, ++sindex);
+         break;
+
+       default:
+         ADVANCE_CHAR (string, slen, sindex);
+         break;
+       }
+    }
+  return (0);
+}
+
+/* Most of the substitutions must be done in parallel.  In order
+   to avoid using tons of unclear goto's, I have some functions
+   for manipulating malloc'ed strings.  They all take INDX, a
+   pointer to an integer which is the offset into the string
+   where manipulation is taking place.  They also take SIZE, a
+   pointer to an integer which is the current length of the
+   character array for this string. */
+
+/* Append SOURCE to TARGET at INDEX.  SIZE is the current amount
+   of space allocated to TARGET.  SOURCE can be NULL, in which
+   case nothing happens.  Gets rid of SOURCE by freeing it.
+   Returns TARGET in case the location has changed. */
+INLINE char *
+sub_append_string (source, target, indx, size)
+     char *source, *target;
+     int *indx, *size;
+{
+  if (source)
+    {
+      int srclen, n;
+
+      srclen = STRLEN (source);
+      if (srclen >= (int)(*size - *indx))
+       {
+         n = srclen + *indx;
+         n = (n + DEFAULT_ARRAY_SIZE) - (n % DEFAULT_ARRAY_SIZE);
+         target = (char *)xrealloc (target, (*size = n));
+       }
+
+      FASTCOPY (source, target + *indx, srclen);
+      *indx += srclen;
+      target[*indx] = '\0';
+
+      free (source);
+    }
+  return (target);
+}
+
+#if 0
+/* UNUSED */
+/* Append the textual representation of NUMBER to TARGET.
+   INDX and SIZE are as in SUB_APPEND_STRING. */
+char *
+sub_append_number (number, target, indx, size)
+     intmax_t number;
+     int *indx, *size;
+     char *target;
+{
+  char *temp;
+
+  temp = itos (number);
+  return (sub_append_string (temp, target, indx, size));
+}
+#endif
+
+/* Extract a substring from STRING, starting at SINDEX and ending with
+   one of the characters in CHARLIST.  Don't make the ending character
+   part of the string.  Leave SINDEX pointing at the ending character.
+   Understand about backslashes in the string.  If (flags & SX_VARNAME)
+   is non-zero, and array variables have been compiled into the shell,
+   everything between a `[' and a corresponding `]' is skipped over.
+   If (flags & SX_NOALLOC) is non-zero, don't return the substring, just
+   update SINDEX.  If (flags & SX_REQMATCH) is non-zero, the string must
+   contain a closing character from CHARLIST. */
+static char *
+string_extract (string, sindex, charlist, flags)
+     char *string;
+     int *sindex;
+     char *charlist;
+     int flags;
+{
+  register int c, i;
+  int found;
+  size_t slen;
+  char *temp;
+  DECLARE_MBSTATE;
+
+  slen = (MB_CUR_MAX > 1) ? strlen (string + *sindex) + *sindex : 0;
+  i = *sindex;
+  found = 0;
+  while (c = string[i])
+    {
+      if (c == '\\')
+       {
+         if (string[i + 1])
+           i++;
+         else
+           break;
+       }
+#if defined (ARRAY_VARS)
+      else if ((flags & SX_VARNAME) && c == '[')
+       {
+         int ni;
+         /* If this is an array subscript, skip over it and continue. */
+         ni = skipsubscript (string, i, 0);
+         if (string[ni] == ']')
+           i = ni;
+       }
+#endif
+      else if (MEMBER (c, charlist))
+       {
+         found = 1;
+         break;
+       }
+
+      ADVANCE_CHAR (string, slen, i);
+    }
+
+  /* If we had to have a matching delimiter and didn't find one, return an
+     error and let the caller deal with it. */
+  if ((flags & SX_REQMATCH) && found == 0)
+    {
+      *sindex = i;
+      return (&extract_string_error);
+    }
+  
+  temp = (flags & SX_NOALLOC) ? (char *)NULL : substring (string, *sindex, i);
+  *sindex = i;
+  
+  return (temp);
+}
+
+/* Extract the contents of STRING as if it is enclosed in double quotes.
+   SINDEX, when passed in, is the offset of the character immediately
+   following the opening double quote; on exit, SINDEX is left pointing after
+   the closing double quote.  If STRIPDQ is non-zero, unquoted double
+   quotes are stripped and the string is terminated by a null byte.
+   Backslashes between the embedded double quotes are processed.  If STRIPDQ
+   is zero, an unquoted `"' terminates the string. */
+static char *
+string_extract_double_quoted (string, sindex, stripdq)
+     char *string;
+     int *sindex, stripdq;
+{
+  size_t slen;
+  char *send;
+  int j, i, t;
+  unsigned char c;
+  char *temp, *ret;            /* The new string we return. */
+  int pass_next, backquote, si;        /* State variables for the machine. */
+  int dquote;
+  DECLARE_MBSTATE;
+
+  slen = strlen (string + *sindex) + *sindex;
+  send = string + slen;
+
+  pass_next = backquote = dquote = 0;
+  temp = (char *)xmalloc (1 + slen - *sindex);
+
+  j = 0;
+  i = *sindex;
+  while (c = string[i])
+    {
+      /* Process a character that was quoted by a backslash. */
+      if (pass_next)
+       {
+         /* XXX - take another look at this in light of Interp 221 */
+         /* Posix.2 sez:
+
+            ``The backslash shall retain its special meaning as an escape
+            character only when followed by one of the characters:
+               $       `       "       \       <newline>''.
+
+            If STRIPDQ is zero, we handle the double quotes here and let
+            expand_word_internal handle the rest.  If STRIPDQ is non-zero,
+            we have already been through one round of backslash stripping,
+            and want to strip these backslashes only if DQUOTE is non-zero,
+            indicating that we are inside an embedded double-quoted string. */
+
+            /* If we are in an embedded quoted string, then don't strip
+               backslashes before characters for which the backslash
+               retains its special meaning, but remove backslashes in
+               front of other characters.  If we are not in an
+               embedded quoted string, don't strip backslashes at all.
+               This mess is necessary because the string was already
+               surrounded by double quotes (and sh has some really weird
+               quoting rules).
+               The returned string will be run through expansion as if
+               it were double-quoted. */
+         if ((stripdq == 0 && c != '"') ||
+             (stripdq && ((dquote && (sh_syntaxtab[c] & CBSDQUOTE)) || dquote == 0)))
+           temp[j++] = '\\';
+         pass_next = 0;
+
+add_one_character:
+         COPY_CHAR_I (temp, j, string, send, i);
+         continue;
+       }
+
+      /* A backslash protects the next character.  The code just above
+        handles preserving the backslash in front of any character but
+        a double quote. */
+      if (c == '\\')
+       {
+         pass_next++;
+         i++;
+         continue;
+       }
+
+      /* Inside backquotes, ``the portion of the quoted string from the
+        initial backquote and the characters up to the next backquote
+        that is not preceded by a backslash, having escape characters
+        removed, defines that command''. */
+      if (backquote)
+       {
+         if (c == '`')
+           backquote = 0;
+         temp[j++] = c;
+         i++;
+         continue;
+       }
+
+      if (c == '`')
+       {
+         temp[j++] = c;
+         backquote++;
+         i++;
+         continue;
+       }
+
+      /* Pass everything between `$(' and the matching `)' or a quoted
+        ${ ... } pair through according to the Posix.2 specification. */
+      if (c == '$' && ((string[i + 1] == LPAREN) || (string[i + 1] == LBRACE)))
+       {
+         int free_ret = 1;
+
+         si = i + 2;
+         if (string[i + 1] == LPAREN)
+           ret = extract_command_subst (string, &si, 0);
+         else
+           ret = extract_dollar_brace_string (string, &si, Q_DOUBLE_QUOTES, 0);
+
+         temp[j++] = '$';
+         temp[j++] = string[i + 1];
+
+         /* Just paranoia; ret will not be 0 unless no_longjmp_on_fatal_error
+            is set. */
+         if (ret == 0 && no_longjmp_on_fatal_error)
+           {
+             free_ret = 0;
+             ret = string + i + 2;
+           }
+
+         for (t = 0; ret[t]; t++, j++)
+           temp[j] = ret[t];
+         temp[j] = string[si];
+
+         if (string[si])
+           {
+             j++;
+             i = si + 1;
+           }
+         else
+           i = si;
+
+         if (free_ret)
+           free (ret);
+         continue;
+       }
+
+      /* Add any character but a double quote to the quoted string we're
+        accumulating. */
+      if (c != '"')
+       goto add_one_character;
+
+      /* c == '"' */
+      if (stripdq)
+       {
+         dquote ^= 1;
+         i++;
+         continue;
+       }
+
+      break;
+    }
+  temp[j] = '\0';
+
+  /* Point to after the closing quote. */
+  if (c)
+    i++;
+  *sindex = i;
+
+  return (temp);
+}
+
+/* This should really be another option to string_extract_double_quoted. */
+static int
+skip_double_quoted (string, slen, sind)
+     char *string;
+     size_t slen;
+     int sind;
+{
+  int c, i;
+  char *ret;
+  int pass_next, backquote, si;
+  DECLARE_MBSTATE;
+
+  pass_next = backquote = 0;
+  i = sind;
+  while (c = string[i])
+    {
+      if (pass_next)
+       {
+         pass_next = 0;
+         ADVANCE_CHAR (string, slen, i);
+         continue;
+       }
+      else if (c == '\\')
+       {
+         pass_next++;
+         i++;
+         continue;
+       }
+      else if (backquote)
+       {
+         if (c == '`')
+           backquote = 0;
+         ADVANCE_CHAR (string, slen, i);
+         continue;
+       }
+      else if (c == '`')
+       {
+         backquote++;
+         i++;
+         continue;
+       }
+      else if (c == '$' && ((string[i + 1] == LPAREN) || (string[i + 1] == LBRACE)))
+       {
+         si = i + 2;
+         if (string[i + 1] == LPAREN)
+           ret = extract_command_subst (string, &si, SX_NOALLOC);
+         else
+           ret = extract_dollar_brace_string (string, &si, Q_DOUBLE_QUOTES, SX_NOALLOC);
+
+         i = si + 1;
+         continue;
+       }
+      else if (c != '"')
+       {
+         ADVANCE_CHAR (string, slen, i);
+         continue;
+       }
+      else
+       break;
+    }
+
+  if (c)
+    i++;
+
+  return (i);
+}
+
+/* Extract the contents of STRING as if it is enclosed in single quotes.
+   SINDEX, when passed in, is the offset of the character immediately
+   following the opening single quote; on exit, SINDEX is left pointing after
+   the closing single quote. */
+static inline char *
+string_extract_single_quoted (string, sindex)
+     char *string;
+     int *sindex;
+{
+  register int i;
+  size_t slen;
+  char *t;
+  DECLARE_MBSTATE;
+
+  /* Don't need slen for ADVANCE_CHAR unless multibyte chars possible. */
+  slen = (MB_CUR_MAX > 1) ? strlen (string + *sindex) + *sindex : 0;
+  i = *sindex;
+  while (string[i] && string[i] != '\'')
+    ADVANCE_CHAR (string, slen, i);
+
+  t = substring (string, *sindex, i);
+
+  if (string[i])
+    i++;
+  *sindex = i;
+
+  return (t);
+}
+
+static inline int
+skip_single_quoted (string, slen, sind)
+     const char *string;
+     size_t slen;
+     int sind;
+{
+  register int c;
+  DECLARE_MBSTATE;
+
+  c = sind;
+  while (string[c] && string[c] != '\'')
+    ADVANCE_CHAR (string, slen, c);
+
+  if (string[c])
+    c++;
+  return c;
+}
+
+/* Just like string_extract, but doesn't hack backslashes or any of
+   that other stuff.  Obeys CTLESC quoting.  Used to do splitting on $IFS. */
+static char *
+string_extract_verbatim (string, slen, sindex, charlist, flags)
+     char *string;
+     size_t slen;
+     int *sindex;
+     char *charlist;
+     int flags;
+{
+  register int i;
+#if defined (HANDLE_MULTIBYTE)
+  size_t clen;
+  wchar_t *wcharlist;
+#endif
+  int c;
+  char *temp;
+  DECLARE_MBSTATE;
+
+  if (charlist[0] == '\'' && charlist[1] == '\0')
+    {
+      temp = string_extract_single_quoted (string, sindex);
+      --*sindex;       /* leave *sindex at separator character */
+      return temp;
+    }
+
+  i = *sindex;
+#if 0
+  /* See how the MBLEN and ADVANCE_CHAR macros work to understand why we need
+     this only if MB_CUR_MAX > 1. */
+  slen = (MB_CUR_MAX > 1) ? strlen (string + *sindex) + *sindex : 1;
+#endif
+#if defined (HANDLE_MULTIBYTE)
+  clen = strlen (charlist);
+  wcharlist = 0;
+#endif
+  while (c = string[i])
+    {
+#if defined (HANDLE_MULTIBYTE)
+      size_t mblength;
+#endif
+      if ((flags & SX_NOCTLESC) == 0 && c == CTLESC)
+       {
+         i += 2;
+         continue;
+       }
+      /* Even if flags contains SX_NOCTLESC, we let CTLESC quoting CTLNUL
+        through, to protect the CTLNULs from later calls to
+        remove_quoted_nulls. */
+      else if ((flags & SX_NOESCCTLNUL) == 0 && c == CTLESC && string[i+1] == CTLNUL)
+       {
+         i += 2;
+         continue;
+       }
+
+#if defined (HANDLE_MULTIBYTE)
+      mblength = MBLEN (string + i, slen - i);
+      if (mblength > 1)
+       {
+         wchar_t wc;
+         mblength = mbtowc (&wc, string + i, slen - i);
+         if (MB_INVALIDCH (mblength))
+           {
+             if (MEMBER (c, charlist))
+               break;
+           }
+         else
+           {
+             if (wcharlist == 0)
+               {
+                 size_t len;
+                 len = mbstowcs (wcharlist, charlist, 0);
+                 if (len == -1)
+                   len = 0;
+                 wcharlist = (wchar_t *)xmalloc (sizeof (wchar_t) * (len + 1));
+                 mbstowcs (wcharlist, charlist, len + 1);
+               }
+
+             if (wcschr (wcharlist, wc))
+               break;
+           }
+       }
+      else             
+#endif
+      if (MEMBER (c, charlist))
+       break;
+
+      ADVANCE_CHAR (string, slen, i);
+    }
+
+#if defined (HANDLE_MULTIBYTE)
+  FREE (wcharlist);
+#endif
+
+  temp = substring (string, *sindex, i);
+  *sindex = i;
+
+  return (temp);
+}
+
+/* Extract the $( construct in STRING, and return a new string.
+   Start extracting at (SINDEX) as if we had just seen "$(".
+   Make (SINDEX) get the position of the matching ")". )
+   XFLAGS is additional flags to pass to other extraction functions. */
+char *
+extract_command_subst (string, sindex, xflags)
+     char *string;
+     int *sindex;
+     int xflags;
+{
+  if (string[*sindex] == LPAREN)
+    return (extract_delimited_string (string, sindex, "$(", "(", ")", xflags|SX_COMMAND)); /*)*/
+  else
+    {
+      xflags |= (no_longjmp_on_fatal_error ? SX_NOLONGJMP : 0);
+      return (xparse_dolparen (string, string+*sindex, sindex, xflags));
+    }
+}
+
+/* Extract the $[ construct in STRING, and return a new string. (])
+   Start extracting at (SINDEX) as if we had just seen "$[".
+   Make (SINDEX) get the position of the matching "]". */
+char *
+extract_arithmetic_subst (string, sindex)
+     char *string;
+     int *sindex;
+{
+  return (extract_delimited_string (string, sindex, "$[", "[", "]", 0)); /*]*/
+}
+
+#if defined (PROCESS_SUBSTITUTION)
+/* Extract the <( or >( construct in STRING, and return a new string.
+   Start extracting at (SINDEX) as if we had just seen "<(".
+   Make (SINDEX) get the position of the matching ")". */ /*))*/
+char *
+extract_process_subst (string, starter, sindex)
+     char *string;
+     char *starter;
+     int *sindex;
+{
+  return (extract_delimited_string (string, sindex, starter, "(", ")", SX_COMMAND));
+}
+#endif /* PROCESS_SUBSTITUTION */
+
+#if defined (ARRAY_VARS)
+/* This can be fooled by unquoted right parens in the passed string. If
+   each caller verifies that the last character in STRING is a right paren,
+   we don't even need to call extract_delimited_string. */
+char *
+extract_array_assignment_list (string, sindex)
+     char *string;
+     int *sindex;
+{
+  int slen;
+  char *ret;
+
+  slen = strlen (string);      /* ( */
+  if (string[slen - 1] == ')')
+   {
+      ret = substring (string, *sindex, slen - 1);
+      *sindex = slen - 1;
+      return ret;
+    }
+  return 0;  
+}
+#endif
+
+/* Extract and create a new string from the contents of STRING, a
+   character string delimited with OPENER and CLOSER.  SINDEX is
+   the address of an int describing the current offset in STRING;
+   it should point to just after the first OPENER found.  On exit,
+   SINDEX gets the position of the last character of the matching CLOSER.
+   If OPENER is more than a single character, ALT_OPENER, if non-null,
+   contains a character string that can also match CLOSER and thus
+   needs to be skipped. */
+static char *
+extract_delimited_string (string, sindex, opener, alt_opener, closer, flags)
+     char *string;
+     int *sindex;
+     char *opener, *alt_opener, *closer;
+     int flags;
+{
+  int i, c, si;
+  size_t slen;
+  char *t, *result;
+  int pass_character, nesting_level, in_comment;
+  int len_closer, len_opener, len_alt_opener;
+  DECLARE_MBSTATE;
+
+  slen = strlen (string + *sindex) + *sindex;
+  len_opener = STRLEN (opener);
+  len_alt_opener = STRLEN (alt_opener);
+  len_closer = STRLEN (closer);
+
+  pass_character = in_comment = 0;
+
+  nesting_level = 1;
+  i = *sindex;
+
+  while (nesting_level)
+    {
+      c = string[i];
+
+      if (c == 0)
+       break;
+
+      if (in_comment)
+       {
+         if (c == '\n')
+           in_comment = 0;
+         ADVANCE_CHAR (string, slen, i);
+         continue;
+       }
+
+      if (pass_character)      /* previous char was backslash */
+       {
+         pass_character = 0;
+         ADVANCE_CHAR (string, slen, i);
+         continue;
+       }
+
+      /* Not exactly right yet; should handle shell metacharacters and
+        multibyte characters, too.  See COMMENT_BEGIN define in parse.y */
+      if ((flags & SX_COMMAND) && c == '#' && (i == 0 || string[i - 1] == '\n' || shellblank (string[i - 1])))
+       {
+          in_comment = 1;
+          ADVANCE_CHAR (string, slen, i);
+          continue;
+       }
+        
+      if (c == CTLESC || c == '\\')
+       {
+         pass_character++;
+         i++;
+         continue;
+       }
+
+      /* Process a nested command substitution, but only if we're parsing an
+        arithmetic substitution. */
+      if ((flags & SX_COMMAND) && string[i] == '$' && string[i+1] == LPAREN)
+        {
+          si = i + 2;
+          t = extract_command_subst (string, &si, flags|SX_NOALLOC);
+          i = si + 1;
+          continue;
+        }
+
+      /* Process a nested OPENER. */
+      if (STREQN (string + i, opener, len_opener))
+       {
+         si = i + len_opener;
+         t = extract_delimited_string (string, &si, opener, alt_opener, closer, flags|SX_NOALLOC);
+         i = si + 1;
+         continue;
+       }
+
+      /* Process a nested ALT_OPENER */
+      if (len_alt_opener && STREQN (string + i, alt_opener, len_alt_opener))
+       {
+         si = i + len_alt_opener;
+         t = extract_delimited_string (string, &si, alt_opener, alt_opener, closer, flags|SX_NOALLOC);
+         i = si + 1;
+         continue;
+       }
+
+      /* If the current substring terminates the delimited string, decrement
+        the nesting level. */
+      if (STREQN (string + i, closer, len_closer))
+       {
+         i += len_closer - 1;  /* move to last byte of the closer */
+         nesting_level--;
+         if (nesting_level == 0)
+           break;
+       }
+
+      /* Pass old-style command substitution through verbatim. */
+      if (c == '`')
+       {
+         si = i + 1;
+         t = string_extract (string, &si, "`", flags|SX_NOALLOC);
+         i = si + 1;
+         continue;
+       }
+
+      /* Pass single-quoted and double-quoted strings through verbatim. */
+      if (c == '\'' || c == '"')
+       {
+         si = i + 1;
+         i = (c == '\'') ? skip_single_quoted (string, slen, si)
+                         : skip_double_quoted (string, slen, si);
+         continue;
+       }
+
+      /* move past this character, which was not special. */
+      ADVANCE_CHAR (string, slen, i);
+    }
+
+  if (c == 0 && nesting_level)
+    {
+      if (no_longjmp_on_fatal_error == 0)
+       {
+         last_command_exit_value = EXECUTION_FAILURE;
+         report_error (_("bad substitution: no closing `%s' in %s"), closer, string);
+         exp_jump_to_top_level (DISCARD);
+       }
+      else
+       {
+         *sindex = i;
+         return (char *)NULL;
+       }
+    }
+
+  si = i - *sindex - len_closer + 1;
+  if (flags & SX_NOALLOC)
+    result = (char *)NULL;
+  else    
+    {
+      result = (char *)xmalloc (1 + si);
+      strncpy (result, string + *sindex, si);
+      result[si] = '\0';
+    }
+  *sindex = i;
+
+  return (result);
+}
+
+/* Extract a parameter expansion expression within ${ and } from STRING.
+   Obey the Posix.2 rules for finding the ending `}': count braces while
+   skipping over enclosed quoted strings and command substitutions.
+   SINDEX is the address of an int describing the current offset in STRING;
+   it should point to just after the first `{' found.  On exit, SINDEX
+   gets the position of the matching `}'.  QUOTED is non-zero if this
+   occurs inside double quotes. */
+/* XXX -- this is very similar to extract_delimited_string -- XXX */
+static char *
+extract_dollar_brace_string (string, sindex, quoted, flags)
+     char *string;
+     int *sindex, quoted, flags;
+{
+  register int i, c;
+  size_t slen;
+  int pass_character, nesting_level, si, dolbrace_state;
+  char *result, *t;
+  DECLARE_MBSTATE;
+
+  pass_character = 0;
+  nesting_level = 1;
+  slen = strlen (string + *sindex) + *sindex;
+
+  /* The handling of dolbrace_state needs to agree with the code in parse.y:
+     parse_matched_pair().  The different initial value is to handle the
+     case where this function is called to parse the word in
+     ${param op word} (SX_WORD). */
+  dolbrace_state = (flags & SX_WORD) ? DOLBRACE_WORD : DOLBRACE_PARAM;
+  if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && (flags & SX_POSIXEXP))
+    dolbrace_state = DOLBRACE_QUOTE;
+
+  i = *sindex;
+  while (c = string[i])
+    {
+      if (pass_character)
+       {
+         pass_character = 0;
+         ADVANCE_CHAR (string, slen, i);
+         continue;
+       }
+
+      /* CTLESCs and backslashes quote the next character. */
+      if (c == CTLESC || c == '\\')
+       {
+         pass_character++;
+         i++;
+         continue;
+       }
+
+      if (string[i] == '$' && string[i+1] == LBRACE)
+       {
+         nesting_level++;
+         i += 2;
+         continue;
+       }
+
+      if (c == RBRACE)
+       {
+         nesting_level--;
+         if (nesting_level == 0)
+           break;
+         i++;
+         continue;
+       }
+
+      /* Pass the contents of old-style command substitutions through
+        verbatim. */
+      if (c == '`')
+       {
+         si = i + 1;
+         t = string_extract (string, &si, "`", flags|SX_NOALLOC);
+         i = si + 1;
+         continue;
+       }
+
+      /* Pass the contents of new-style command substitutions and
+        arithmetic substitutions through verbatim. */
+      if (string[i] == '$' && string[i+1] == LPAREN)
+       {
+         si = i + 2;
+         t = extract_command_subst (string, &si, flags|SX_NOALLOC);
+         i = si + 1;
+         continue;
+       }
+
+#if 0
+      /* Pass the contents of single-quoted and double-quoted strings
+        through verbatim. */
+      if (c == '\'' || c == '"')
+       {
+         si = i + 1;
+         i = (c == '\'') ? skip_single_quoted (string, slen, si)
+                         : skip_double_quoted (string, slen, si);
+         /* skip_XXX_quoted leaves index one past close quote */
+         continue;
+       }
+#else  /* XXX - bash-4.2 */
+      /* Pass the contents of double-quoted strings through verbatim. */
+      if (c == '"')
+       {
+         si = i + 1;
+         i = skip_double_quoted (string, slen, si);
+         /* skip_XXX_quoted leaves index one past close quote */
+         continue;
+       }
+
+      if (c == '\'')
+       {
+/*itrace("extract_dollar_brace_string: c == single quote flags = %d quoted = %d dolbrace_state = %d", flags, quoted, dolbrace_state);*/
+         if (posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)))
+           ADVANCE_CHAR (string, slen, i);
+         else
+           {
+             si = i + 1;
+             i = skip_single_quoted (string, slen, si);
+           }
+
+          continue;
+       }
+#endif
+
+      /* move past this character, which was not special. */
+      ADVANCE_CHAR (string, slen, i);
+
+      /* This logic must agree with parse.y:parse_matched_pair, since they
+        share the same defines. */
+      if (dolbrace_state == DOLBRACE_PARAM && c == '%' && (i - *sindex) > 1)
+       dolbrace_state = DOLBRACE_QUOTE;
+      else if (dolbrace_state == DOLBRACE_PARAM && c == '#' && (i - *sindex) > 1)
+        dolbrace_state = DOLBRACE_QUOTE;
+      else if (dolbrace_state == DOLBRACE_PARAM && c == '/' && (i - *sindex) > 1)
+        dolbrace_state = DOLBRACE_QUOTE;
+      else if (dolbrace_state == DOLBRACE_PARAM && c == '^' && (i - *sindex) > 1)
+        dolbrace_state = DOLBRACE_QUOTE;
+      else if (dolbrace_state == DOLBRACE_PARAM && c == ',' && (i - *sindex) > 1)
+        dolbrace_state = DOLBRACE_QUOTE;
+      else if (dolbrace_state == DOLBRACE_PARAM && strchr ("#%^,~:-=?+/", c) != 0)
+       dolbrace_state = DOLBRACE_OP;
+      else if (dolbrace_state == DOLBRACE_OP && strchr ("#%^,~:-=?+/", c) == 0)
+       dolbrace_state = DOLBRACE_WORD;
+    }
+
+  if (c == 0 && nesting_level)
+    {
+      if (no_longjmp_on_fatal_error == 0)
+       {                       /* { */
+         last_command_exit_value = EXECUTION_FAILURE;
+         report_error (_("bad substitution: no closing `%s' in %s"), "}", string);
+         exp_jump_to_top_level (DISCARD);
+       }
+      else
+       {
+         *sindex = i;
+         return ((char *)NULL);
+       }
+    }
+
+  result = (flags & SX_NOALLOC) ? (char *)NULL : substring (string, *sindex, i);
+  *sindex = i;
+
+  return (result);
+}
+
+/* Remove backslashes which are quoting backquotes from STRING.  Modifies
+   STRING, and returns a pointer to it. */
+char *
+de_backslash (string)
+     char *string;
+{
+  register size_t slen;
+  register int i, j, prev_i;
+  DECLARE_MBSTATE;
+
+  slen = strlen (string);
+  i = j = 0;
+
+  /* Loop copying string[i] to string[j], i >= j. */
+  while (i < slen)
+    {
+      if (string[i] == '\\' && (string[i + 1] == '`' || string[i + 1] == '\\' ||
+                             string[i + 1] == '$'))
+       i++;
+      prev_i = i;
+      ADVANCE_CHAR (string, slen, i);
+      if (j < prev_i)
+       do string[j++] = string[prev_i++]; while (prev_i < i);
+      else
+       j = i;
+    }
+  string[j] = '\0';
+
+  return (string);
+}
+
+#if 0
+/*UNUSED*/
+/* Replace instances of \! in a string with !. */
+void
+unquote_bang (string)
+     char *string;
+{
+  register int i, j;
+  register char *temp;
+
+  temp = (char *)xmalloc (1 + strlen (string));
+
+  for (i = 0, j = 0; (temp[j] = string[i]); i++, j++)
+    {
+      if (string[i] == '\\' && string[i + 1] == '!')
+       {
+         temp[j] = '!';
+         i++;
+       }
+    }
+  strcpy (string, temp);
+  free (temp);
+}
+#endif
+
+#define CQ_RETURN(x) do { no_longjmp_on_fatal_error = 0; return (x); } while (0)
+
+/* This function assumes s[i] == open; returns with s[ret] == close; used to
+   parse array subscripts.  FLAGS & 1 means to not attempt to skip over
+   matched pairs of quotes or backquotes, or skip word expansions; it is
+   intended to be used after expansion has been performed and during final
+   assignment parsing (see arrayfunc.c:assign_compound_array_list()). */
+static int
+skip_matched_pair (string, start, open, close, flags)
+     const char *string;
+     int start, open, close, flags;
+{
+  int i, pass_next, backq, si, c, count;
+  size_t slen;
+  char *temp, *ss;
+  DECLARE_MBSTATE;
+
+  slen = strlen (string + start) + start;
+  no_longjmp_on_fatal_error = 1;
+
+  i = start + 1;               /* skip over leading bracket */
+  count = 1;
+  pass_next = backq = 0;
+  ss = (char *)string;
+  while (c = string[i])
+    {
+      if (pass_next)
+       {
+         pass_next = 0;
+         if (c == 0)
+           CQ_RETURN(i);
+         ADVANCE_CHAR (string, slen, i);
+         continue;
+       }
+      else if (c == '\\')
+       {
+         pass_next = 1;
+         i++;
+         continue;
+       }
+      else if (backq)
+       {
+         if (c == '`')
+           backq = 0;
+         ADVANCE_CHAR (string, slen, i);
+         continue;
+       }
+      else if ((flags & 1) == 0 && c == '`')
+       {
+         backq = 1;
+         i++;
+         continue;
+       }
+      else if ((flags & 1) == 0 && c == open)
+       {
+         count++;
+         i++;
+         continue;
+       }
+      else if (c == close)
+       {
+         count--;
+         if (count == 0)
+           break;
+         i++;
+         continue;
+       }
+      else if ((flags & 1) == 0 && (c == '\'' || c == '"'))
+       {
+         i = (c == '\'') ? skip_single_quoted (ss, slen, ++i)
+                         : skip_double_quoted (ss, slen, ++i);
+         /* no increment, the skip functions increment past the closing quote. */
+       }
+      else if ((flags&1) == 0 && c == '$' && (string[i+1] == LPAREN || string[i+1] == LBRACE))
+       {
+         si = i + 2;
+         if (string[si] == '\0')
+           CQ_RETURN(si);
+
+         if (string[i+1] == LPAREN)
+           temp = extract_delimited_string (ss, &si, "$(", "(", ")", SX_NOALLOC|SX_COMMAND); /* ) */
+         else
+           temp = extract_dollar_brace_string (ss, &si, 0, SX_NOALLOC);
+         i = si;
+         if (string[i] == '\0')        /* don't increment i past EOS in loop */
+           break;
+         i++;
+         continue;
+       }
+      else
+       ADVANCE_CHAR (string, slen, i);
+    }
+
+  CQ_RETURN(i);
+}
+
+#if defined (ARRAY_VARS)
+int
+skipsubscript (string, start, flags)
+     const char *string;
+     int start, flags;
+{
+  return (skip_matched_pair (string, start, '[', ']', flags));
+}
+#endif
+
+/* Skip characters in STRING until we find a character in DELIMS, and return
+   the index of that character.  START is the index into string at which we
+   begin.  This is similar in spirit to strpbrk, but it returns an index into
+   STRING and takes a starting index.  This little piece of code knows quite
+   a lot of shell syntax.  It's very similar to skip_double_quoted and other
+   functions of that ilk. */
+int
+skip_to_delim (string, start, delims, flags)
+     char *string;
+     int start;
+     char *delims;
+     int flags;
+{
+  int i, pass_next, backq, si, c, invert, skipquote, skipcmd;
+  size_t slen;
+  char *temp, open[3];
+  DECLARE_MBSTATE;
+
+  slen = strlen (string + start) + start;
+  if (flags & SD_NOJMP)
+    no_longjmp_on_fatal_error = 1;
+  invert = (flags & SD_INVERT);
+  skipcmd = (flags & SD_NOSKIPCMD) == 0;
+
+  i = start;
+  pass_next = backq = 0;
+  while (c = string[i])
+    {
+      /* If this is non-zero, we should not let quote characters be delimiters
+        and the current character is a single or double quote.  We should not
+        test whether or not it's a delimiter until after we skip single- or
+        double-quoted strings. */
+      skipquote = ((flags & SD_NOQUOTEDELIM) && (c == '\'' || c =='"'));
+      if (pass_next)
+       {
+         pass_next = 0;
+         if (c == 0)
+           CQ_RETURN(i);
+         ADVANCE_CHAR (string, slen, i);
+         continue;
+       }
+      else if (c == '\\')
+       {
+         pass_next = 1;
+         i++;
+         continue;
+       }
+      else if (backq)
+       {
+         if (c == '`')
+           backq = 0;
+         ADVANCE_CHAR (string, slen, i);
+         continue;
+       }
+      else if (c == '`')
+       {
+         backq = 1;
+         i++;
+         continue;
+       }
+      else if (skipquote == 0 && invert == 0 && member (c, delims))
+       break;
+      else if (c == '\'' || c == '"')
+       {
+         i = (c == '\'') ? skip_single_quoted (string, slen, ++i)
+                         : skip_double_quoted (string, slen, ++i);
+         /* no increment, the skip functions increment past the closing quote. */
+       }
+      else if (c == '$' && ((skipcmd && string[i+1] == LPAREN) || string[i+1] == LBRACE))
+       {
+         si = i + 2;
+         if (string[si] == '\0')
+           CQ_RETURN(si);
+
+         if (string[i+1] == LPAREN)
+           temp = extract_delimited_string (string, &si, "$(", "(", ")", SX_NOALLOC|SX_COMMAND); /* ) */
+         else
+           temp = extract_dollar_brace_string (string, &si, 0, SX_NOALLOC);
+         i = si;
+         if (string[i] == '\0')        /* don't increment i past EOS in loop */
+           break;
+         i++;
+         continue;
+       }
+#if defined (PROCESS_SUBSTITUTION)
+      else if (skipcmd && (c == '<' || c == '>') && string[i+1] == LPAREN)
+       {
+         si = i + 2;
+         if (string[si] == '\0')
+           CQ_RETURN(si);
+         temp = extract_process_subst (string, (c == '<') ? "<(" : ">(", &si);
+         free (temp);          /* no SX_ALLOC here */
+         i = si;
+         if (string[i] == '\0')
+           break;
+         i++;
+         continue;
+       }
+#endif /* PROCESS_SUBSTITUTION */
+#if defined (EXTENDED_GLOB)
+      else if ((flags & SD_EXTGLOB) && extended_glob && string[i+1] == LPAREN && member (c, "?*+!@"))
+       {
+         si = i + 2;
+         if (string[si] == '\0')
+           CQ_RETURN(si);
+
+         open[0] = c;
+         open[1] = LPAREN;
+         open[2] = '\0';
+         temp = extract_delimited_string (string, &si, open, "(", ")", SX_NOALLOC); /* ) */
+
+         i = si;
+         if (string[i] == '\0')        /* don't increment i past EOS in loop */
+           break;
+         i++;
+         continue;
+       }
+#endif
+      else if ((skipquote || invert) && (member (c, delims) == 0))
+       break;
+      else
+       ADVANCE_CHAR (string, slen, i);
+    }
+
+  CQ_RETURN(i);
+}
+
+#if defined (READLINE)
+/* Return 1 if the portion of STRING ending at EINDEX is quoted (there is
+   an unclosed quoted string), or if the character at EINDEX is quoted
+   by a backslash. NO_LONGJMP_ON_FATAL_ERROR is used to flag that the various
+   single and double-quoted string parsing functions should not return an
+   error if there are unclosed quotes or braces.  The characters that this
+   recognizes need to be the same as the contents of
+   rl_completer_quote_characters. */
+
+int
+char_is_quoted (string, eindex)
+     char *string;
+     int eindex;
+{
+  int i, pass_next, c;
+  size_t slen;
+  DECLARE_MBSTATE;
+
+  slen = strlen (string);
+  no_longjmp_on_fatal_error = 1;
+  i = pass_next = 0;
+  while (i <= eindex)
+    {
+      c = string[i];
+
+      if (pass_next)
+       {
+         pass_next = 0;
+         if (i >= eindex)      /* XXX was if (i >= eindex - 1) */
+           CQ_RETURN(1);
+         ADVANCE_CHAR (string, slen, i);
+         continue;
+       }
+      else if (c == '\\')
+       {
+         pass_next = 1;
+         i++;
+         continue;
+       }
+      else if (c == '\'' || c == '"')
+       {
+         i = (c == '\'') ? skip_single_quoted (string, slen, ++i)
+                         : skip_double_quoted (string, slen, ++i);
+         if (i > eindex)
+           CQ_RETURN(1);
+         /* no increment, the skip_xxx functions go one past end */
+       }
+      else
+       ADVANCE_CHAR (string, slen, i);
+    }
+
+  CQ_RETURN(0);
+}
+
+int
+unclosed_pair (string, eindex, openstr)
+     char *string;
+     int eindex;
+     char *openstr;
+{
+  int i, pass_next, openc, olen;
+  size_t slen;
+  DECLARE_MBSTATE;
+
+  slen = strlen (string);
+  olen = strlen (openstr);
+  i = pass_next = openc = 0;
+  while (i <= eindex)
+    {
+      if (pass_next)
+       {
+         pass_next = 0;
+         if (i >= eindex)      /* XXX was if (i >= eindex - 1) */
+           return 0;
+         ADVANCE_CHAR (string, slen, i);
+         continue;
+       }
+      else if (string[i] == '\\')
+       {
+         pass_next = 1;
+         i++;
+         continue;
+       }
+      else if (STREQN (string + i, openstr, olen))
+       {
+         openc = 1 - openc;
+         i += olen;
+       }
+      else if (string[i] == '\'' || string[i] == '"')
+       {
+         i = (string[i] == '\'') ? skip_single_quoted (string, slen, i)
+                                 : skip_double_quoted (string, slen, i);
+         if (i > eindex)
+           return 0;
+       }
+      else
+       ADVANCE_CHAR (string, slen, i);
+    }
+  return (openc);
+}
+
+/* Split STRING (length SLEN) at DELIMS, and return a WORD_LIST with the
+   individual words.  If DELIMS is NULL, the current value of $IFS is used
+   to split the string, and the function follows the shell field splitting
+   rules.  SENTINEL is an index to look for.  NWP, if non-NULL,
+   gets the number of words in the returned list.  CWP, if non-NULL, gets
+   the index of the word containing SENTINEL.  Non-whitespace chars in
+   DELIMS delimit separate fields. */
+WORD_LIST *
+split_at_delims (string, slen, delims, sentinel, flags, nwp, cwp)
+     char *string;
+     int slen;
+     char *delims;
+     int sentinel, flags;
+     int *nwp, *cwp;
+{
+  int ts, te, i, nw, cw, ifs_split, dflags;
+  char *token, *d, *d2;
+  WORD_LIST *ret, *tl;
+
+  if (string == 0 || *string == '\0')
+    {
+      if (nwp)
+       *nwp = 0;
+      if (cwp)
+       *cwp = 0;       
+      return ((WORD_LIST *)NULL);
+    }
+
+  d = (delims == 0) ? ifs_value : delims;
+  ifs_split = delims == 0;
+
+  /* Make d2 the non-whitespace characters in delims */
+  d2 = 0;
+  if (delims)
+    {
+      size_t slength;
+#if defined (HANDLE_MULTIBYTE)
+      size_t mblength = 1;
+#endif
+      DECLARE_MBSTATE;
+
+      slength = strlen (delims);
+      d2 = (char *)xmalloc (slength + 1);
+      i = ts = 0;
+      while (delims[i])
+       {
+#if defined (HANDLE_MULTIBYTE)
+         mbstate_t state_bak;
+         state_bak = state;
+         mblength = MBRLEN (delims + i, slength, &state);
+         if (MB_INVALIDCH (mblength))
+           state = state_bak;
+         else if (mblength > 1)
+           {
+             memcpy (d2 + ts, delims + i, mblength);
+             ts += mblength;
+             i += mblength;
+             slength -= mblength;
+             continue;
+           }
+#endif
+         if (whitespace (delims[i]) == 0)
+           d2[ts++] = delims[i];
+
+         i++;
+         slength--;
+       }
+      d2[ts] = '\0';
+    }
+
+  ret = (WORD_LIST *)NULL;
+
+  /* Remove sequences of whitespace characters at the start of the string, as
+     long as those characters are delimiters. */
+  for (i = 0; member (string[i], d) && spctabnl (string[i]); i++)
+    ;
+  if (string[i] == '\0')
+    return (ret);
+
+  ts = i;
+  nw = 0;
+  cw = -1;
+  dflags = flags|SD_NOJMP;
+  while (1)
+    {
+      te = skip_to_delim (string, ts, d, dflags);
+
+      /* If we have a non-whitespace delimiter character, use it to make a
+        separate field.  This is just about what $IFS splitting does and
+        is closer to the behavior of the shell parser. */
+      if (ts == te && d2 && member (string[ts], d2))
+       {
+         te = ts + 1;
+         /* If we're using IFS splitting, the non-whitespace delimiter char
+            and any additional IFS whitespace delimits a field. */
+         if (ifs_split)
+           while (member (string[te], d) && spctabnl (string[te]))
+             te++;
+         else
+           while (member (string[te], d2))
+             te++;
+       }
+
+      token = substring (string, ts, te);
+
+      ret = add_string_to_list (token, ret);
+      free (token);
+      nw++;
+
+      if (sentinel >= ts && sentinel <= te)
+       cw = nw;
+
+      /* If the cursor is at whitespace just before word start, set the
+        sentinel word to the current word. */
+      if (cwp && cw == -1 && sentinel == ts-1)
+       cw = nw;
+
+      /* If the cursor is at whitespace between two words, make a new, empty
+        word, add it before (well, after, since the list is in reverse order)
+        the word we just added, and set the current word to that one. */
+      if (cwp && cw == -1 && sentinel < ts)
+       {
+         tl = make_word_list (make_word (""), ret->next);
+         ret->next = tl;
+         cw = nw;
+         nw++;
+       }
+
+      if (string[te] == 0)
+       break;
+
+      i = te;
+      while (member (string[i], d) && (ifs_split || spctabnl(string[i])))
+       i++;
+
+      if (string[i])
+       ts = i;
+      else
+       break;
+    }
+
+  /* Special case for SENTINEL at the end of STRING.  If we haven't found
+     the word containing SENTINEL yet, and the index we're looking for is at
+     the end of STRING (or past the end of the previously-found token,
+     possible if the end of the line is composed solely of IFS whitespace)
+     add an additional null argument and set the current word pointer to that. */
+  if (cwp && cw == -1 && (sentinel >= slen || sentinel >= te))
+    {
+      if (whitespace (string[sentinel - 1]))
+       {
+         token = "";
+         ret = add_string_to_list (token, ret);
+         nw++;
+       }
+      cw = nw;
+    }
+
+  if (nwp)
+    *nwp = nw;
+  if (cwp)
+    *cwp = cw;
+
+  FREE (d2);
+
+  return (REVERSE_LIST (ret, WORD_LIST *));
+}
+#endif /* READLINE */
+
+#if 0
+/* UNUSED */
+/* Extract the name of the variable to bind to from the assignment string. */
+char *
+assignment_name (string)
+     char *string;
+{
+  int offset;
+  char *temp;
+
+  offset = assignment (string, 0);
+  if (offset == 0)
+    return (char *)NULL;
+  temp = substring (string, 0, offset);
+  return (temp);
+}
+#endif
+
+/* **************************************************************** */
+/*                                                                 */
+/*     Functions to convert strings to WORD_LISTs and vice versa    */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Return a single string of all the words in LIST.  SEP is the separator
+   to put between individual elements of LIST in the output string. */
+char *
+string_list_internal (list, sep)
+     WORD_LIST *list;
+     char *sep;
+{
+  register WORD_LIST *t;
+  char *result, *r;
+  int word_len, sep_len, result_size;
+
+  if (list == 0)
+    return ((char *)NULL);
+
+  /* Short-circuit quickly if we don't need to separate anything. */
+  if (list->next == 0)
+    return (savestring (list->word->word));
+
+  /* This is nearly always called with either sep[0] == 0 or sep[1] == 0. */
+  sep_len = STRLEN (sep);
+  result_size = 0;
+
+  for (t = list; t; t = t->next)
+    {
+      if (t != list)
+       result_size += sep_len;
+      result_size += strlen (t->word->word);
+    }
+
+  r = result = (char *)xmalloc (result_size + 1);
+
+  for (t = list; t; t = t->next)
+    {
+      if (t != list && sep_len)
+       {
+         if (sep_len > 1)
+           {
+             FASTCOPY (sep, r, sep_len);
+             r += sep_len;
+           }
+         else
+           *r++ = sep[0];
+       }
+
+      word_len = strlen (t->word->word);
+      FASTCOPY (t->word->word, r, word_len);
+      r += word_len;
+    }
+
+  *r = '\0';
+  return (result);
+}
+
+/* Return a single string of all the words present in LIST, separating
+   each word with a space. */
+char *
+string_list (list)
+     WORD_LIST *list;
+{
+  return (string_list_internal (list, " "));
+}
+
+/* An external interface that can be used by the rest of the shell to
+   obtain a string containing the first character in $IFS.  Handles all
+   the multibyte complications.  If LENP is non-null, it is set to the
+   length of the returned string. */
+char *
+ifs_firstchar (lenp)
+     int *lenp;
+{
+  char *ret;
+  int len;
+
+  ret = xmalloc (MB_LEN_MAX + 1);
+#if defined (HANDLE_MULTIBYTE)
+  if (ifs_firstc_len == 1)
+    {
+      ret[0] = ifs_firstc[0];
+      ret[1] = '\0';
+      len = ret[0] ? 1 : 0;
+    }
+  else
+    {
+      memcpy (ret, ifs_firstc, ifs_firstc_len);
+      ret[len = ifs_firstc_len] = '\0';
+    }
+#else
+  ret[0] = ifs_firstc;
+  ret[1] = '\0';
+  len = ret[0] ? 0 : 1;
+#endif
+
+  if (lenp)
+    *lenp = len;
+
+  return ret;
+}
+
+/* Return a single string of all the words present in LIST, obeying the
+   quoting rules for "$*", to wit: (P1003.2, draft 11, 3.5.2) "If the
+   expansion [of $*] appears within a double quoted string, it expands
+   to a single field with the value of each parameter separated by the
+   first character of the IFS variable, or by a <space> if IFS is unset." */
+char *
+string_list_dollar_star (list)
+     WORD_LIST *list;
+{
+  char *ret;
+#if defined (HANDLE_MULTIBYTE)
+#  if defined (__GNUC__)
+  char sep[MB_CUR_MAX + 1];
+#  else
+  char *sep = 0;
+#  endif
+#else
+  char sep[2];
+#endif
+
+#if defined (HANDLE_MULTIBYTE)
+#  if !defined (__GNUC__)
+  sep = (char *)xmalloc (MB_CUR_MAX + 1);
+#  endif /* !__GNUC__ */
+  if (ifs_firstc_len == 1)
+    {
+      sep[0] = ifs_firstc[0];
+      sep[1] = '\0';
+    }
+  else
+    {
+      memcpy (sep, ifs_firstc, ifs_firstc_len);
+      sep[ifs_firstc_len] = '\0';
+    }
+#else
+  sep[0] = ifs_firstc;
+  sep[1] = '\0';
+#endif
+
+  ret = string_list_internal (list, sep);
+#if defined (HANDLE_MULTIBYTE) && !defined (__GNUC__)
+  free (sep);
+#endif
+  return ret;
+}
+
+/* Turn $@ into a string.  If (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
+   is non-zero, the $@ appears within double quotes, and we should quote
+   the list before converting it into a string.  If IFS is unset, and the
+   word is not quoted, we just need to quote CTLESC and CTLNUL characters
+   in the words in the list, because the default value of $IFS is
+   <space><tab><newline>, IFS characters in the words in the list should
+   also be split.  If IFS is null, and the word is not quoted, we need
+   to quote the words in the list to preserve the positional parameters
+   exactly. */
+char *
+string_list_dollar_at (list, quoted)
+     WORD_LIST *list;
+     int quoted;
+{
+  char *ifs, *ret;
+#if defined (HANDLE_MULTIBYTE)
+#  if defined (__GNUC__)
+  char sep[MB_CUR_MAX + 1];
+#  else
+  char *sep = 0;
+#  endif /* !__GNUC__ */
+#else
+  char sep[2];
+#endif
+  WORD_LIST *tlist;
+
+  /* XXX this could just be ifs = ifs_value; */
+  ifs = ifs_var ? value_cell (ifs_var) : (char *)0;
+
+#if defined (HANDLE_MULTIBYTE)
+#  if !defined (__GNUC__)
+  sep = (char *)xmalloc (MB_CUR_MAX + 1);
+#  endif /* !__GNUC__ */
+  if (ifs && *ifs)
+    {
+      if (ifs_firstc_len == 1)
+       {
+         sep[0] = ifs_firstc[0];
+         sep[1] = '\0';
+       }
+      else
+       {
+         memcpy (sep, ifs_firstc, ifs_firstc_len);
+         sep[ifs_firstc_len] = '\0';
+       }
+    }
+  else
+    {
+      sep[0] = ' ';
+      sep[1] = '\0';
+    }
+#else
+  sep[0] = (ifs == 0 || *ifs == 0) ? ' ' : *ifs;
+  sep[1] = '\0';
+#endif
+
+  /* XXX -- why call quote_list if ifs == 0?  we can get away without doing
+     it now that quote_escapes quotes spaces */
+  tlist = (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES|Q_PATQUOTE))
+               ? quote_list (list)
+               : list_quote_escapes (list);
+
+  ret = string_list_internal (tlist, sep);
+#if defined (HANDLE_MULTIBYTE) && !defined (__GNUC__)
+  free (sep);
+#endif
+  return ret;
+}
+
+/* Turn the positional paramters into a string, understanding quoting and
+   the various subtleties of using the first character of $IFS as the
+   separator.  Calls string_list_dollar_at, string_list_dollar_star, and
+   string_list as appropriate. */
+char *
+string_list_pos_params (pchar, list, quoted)
+     int pchar;
+     WORD_LIST *list;
+     int quoted;
+{
+  char *ret;
+  WORD_LIST *tlist;
+
+  if (pchar == '*' && (quoted & Q_DOUBLE_QUOTES))
+    {
+      tlist = quote_list (list);
+      word_list_remove_quoted_nulls (tlist);
+      ret = string_list_dollar_star (tlist);
+    }
+  else if (pchar == '*' && (quoted & Q_HERE_DOCUMENT))
+    {
+      tlist = quote_list (list);
+      word_list_remove_quoted_nulls (tlist);
+      ret = string_list (tlist);
+    }
+  else if (pchar == '*')
+    {
+      /* Even when unquoted, string_list_dollar_star does the right thing
+        making sure that the first character of $IFS is used as the
+        separator. */
+      ret = string_list_dollar_star (list);
+    }
+  else if (pchar == '@' && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)))
+    /* We use string_list_dollar_at, but only if the string is quoted, since
+       that quotes the escapes if it's not, which we don't want.  We could
+       use string_list (the old code did), but that doesn't do the right
+       thing if the first character of $IFS is not a space.  We use
+       string_list_dollar_star if the string is unquoted so we make sure that
+       the elements of $@ are separated by the first character of $IFS for
+       later splitting. */
+    ret = string_list_dollar_at (list, quoted);
+  else if (pchar == '@')
+    ret = string_list_dollar_star (list);
+  else
+    ret = string_list ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) ? quote_list (list) : list);
+
+  return ret;
+}
+
+/* Return the list of words present in STRING.  Separate the string into
+   words at any of the characters found in SEPARATORS.  If QUOTED is
+   non-zero then word in the list will have its quoted flag set, otherwise
+   the quoted flag is left as make_word () deemed fit.
+
+   This obeys the P1003.2 word splitting semantics.  If `separators' is
+   exactly <space><tab><newline>, then the splitting algorithm is that of
+   the Bourne shell, which treats any sequence of characters from `separators'
+   as a delimiter.  If IFS is unset, which results in `separators' being set
+   to "", no splitting occurs.  If separators has some other value, the
+   following rules are applied (`IFS white space' means zero or more
+   occurrences of <space>, <tab>, or <newline>, as long as those characters
+   are in `separators'):
+
+       1) IFS white space is ignored at the start and the end of the
+          string.
+       2) Each occurrence of a character in `separators' that is not
+          IFS white space, along with any adjacent occurrences of
+          IFS white space delimits a field.
+       3) Any nonzero-length sequence of IFS white space delimits a field.
+   */
+
+/* BEWARE!  list_string strips null arguments.  Don't call it twice and
+   expect to have "" preserved! */
+
+/* This performs word splitting and quoted null character removal on
+   STRING. */
+#define issep(c) \
+       (((separators)[0]) ? ((separators)[1] ? isifs(c) \
+                                             : (c) == (separators)[0]) \
+                          : 0)
+
+WORD_LIST *
+list_string (string, separators, quoted)
+     register char *string, *separators;
+     int quoted;
+{
+  WORD_LIST *result;
+  WORD_DESC *t;
+  char *current_word, *s;
+  int sindex, sh_style_split, whitesep, xflags;
+  size_t slen;
+
+  if (!string || !*string)
+    return ((WORD_LIST *)NULL);
+
+  sh_style_split = separators && separators[0] == ' ' &&
+                                separators[1] == '\t' &&
+                                separators[2] == '\n' &&
+                                separators[3] == '\0';
+  for (xflags = 0, s = ifs_value; s && *s; s++)
+    {
+      if (*s == CTLESC) xflags |= SX_NOCTLESC;
+      else if (*s == CTLNUL) xflags |= SX_NOESCCTLNUL;
+    }
+
+  slen = 0;
+  /* Remove sequences of whitespace at the beginning of STRING, as
+     long as those characters appear in IFS.  Do not do this if
+     STRING is quoted or if there are no separator characters. */
+  if (!quoted || !separators || !*separators)
+    {
+      for (s = string; *s && spctabnl (*s) && issep (*s); s++);
+
+      if (!*s)
+       return ((WORD_LIST *)NULL);
+
+      string = s;
+    }
+
+  /* OK, now STRING points to a word that does not begin with white space.
+     The splitting algorithm is:
+       extract a word, stopping at a separator
+       skip sequences of spc, tab, or nl as long as they are separators
+     This obeys the field splitting rules in Posix.2. */
+  slen = (MB_CUR_MAX > 1) ? strlen (string) : 1;
+  for (result = (WORD_LIST *)NULL, sindex = 0; string[sindex]; )
+    {
+      /* Don't need string length in ADVANCE_CHAR or string_extract_verbatim
+        unless multibyte chars are possible. */
+      current_word = string_extract_verbatim (string, slen, &sindex, separators, xflags);
+      if (current_word == 0)
+       break;
+
+      /* If we have a quoted empty string, add a quoted null argument.  We
+        want to preserve the quoted null character iff this is a quoted
+        empty string; otherwise the quoted null characters are removed
+        below. */
+      if (QUOTED_NULL (current_word))
+       {
+         t = alloc_word_desc ();
+         t->word = make_quoted_char ('\0');
+         t->flags |= W_QUOTED|W_HASQUOTEDNULL;
+         result = make_word_list (t, result);
+       }
+      else if (current_word[0] != '\0')
+       {
+         /* If we have something, then add it regardless.  However,
+            perform quoted null character removal on the current word. */
+         remove_quoted_nulls (current_word);
+         result = add_string_to_list (current_word, result);
+         result->word->flags &= ~W_HASQUOTEDNULL;      /* just to be sure */
+         if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))
+           result->word->flags |= W_QUOTED;
+       }
+
+      /* If we're not doing sequences of separators in the traditional
+        Bourne shell style, then add a quoted null argument. */
+      else if (!sh_style_split && !spctabnl (string[sindex]))
+       {
+         t = alloc_word_desc ();
+         t->word = make_quoted_char ('\0');
+         t->flags |= W_QUOTED|W_HASQUOTEDNULL;
+         result = make_word_list (t, result);
+       }
+
+      free (current_word);
+
+      /* Note whether or not the separator is IFS whitespace, used later. */
+      whitesep = string[sindex] && spctabnl (string[sindex]);
+
+      /* Move past the current separator character. */
+      if (string[sindex])
+       {
+         DECLARE_MBSTATE;
+         ADVANCE_CHAR (string, slen, sindex);
+       }
+
+      /* Now skip sequences of space, tab, or newline characters if they are
+        in the list of separators. */
+      while (string[sindex] && spctabnl (string[sindex]) && issep (string[sindex]))
+       sindex++;
+
+      /* If the first separator was IFS whitespace and the current character
+        is a non-whitespace IFS character, it should be part of the current
+        field delimiter, not a separate delimiter that would result in an
+        empty field.  Look at POSIX.2, 3.6.5, (3)(b). */
+      if (string[sindex] && whitesep && issep (string[sindex]) && !spctabnl (string[sindex]))
+       {
+         sindex++;
+         /* An IFS character that is not IFS white space, along with any
+            adjacent IFS white space, shall delimit a field. (SUSv3) */
+         while (string[sindex] && spctabnl (string[sindex]) && isifs (string[sindex]))
+           sindex++;
+       }
+    }
+  return (REVERSE_LIST (result, WORD_LIST *));
+}
+
+/* Parse a single word from STRING, using SEPARATORS to separate fields.
+   ENDPTR is set to the first character after the word.  This is used by
+   the `read' builtin.  This is never called with SEPARATORS != $IFS;
+   it should be simplified.
+
+   XXX - this function is very similar to list_string; they should be
+        combined - XXX */
+char *
+get_word_from_string (stringp, separators, endptr)
+     char **stringp, *separators, **endptr;
+{
+  register char *s;
+  char *current_word;
+  int sindex, sh_style_split, whitesep, xflags;
+  size_t slen;
+
+  if (!stringp || !*stringp || !**stringp)
+    return ((char *)NULL);
+
+  sh_style_split = separators && separators[0] == ' ' &&
+                                separators[1] == '\t' &&
+                                separators[2] == '\n' &&
+                                separators[3] == '\0';
+  for (xflags = 0, s = ifs_value; s && *s; s++)
+    {
+      if (*s == CTLESC) xflags |= SX_NOCTLESC;
+      if (*s == CTLNUL) xflags |= SX_NOESCCTLNUL;
+    }
+
+  s = *stringp;
+  slen = 0;
+
+  /* Remove sequences of whitespace at the beginning of STRING, as
+     long as those characters appear in IFS. */
+  if (sh_style_split || !separators || !*separators)
+    {
+      for (; *s && spctabnl (*s) && isifs (*s); s++);
+
+      /* If the string is nothing but whitespace, update it and return. */
+      if (!*s)
+       {
+         *stringp = s;
+         if (endptr)
+           *endptr = s;
+         return ((char *)NULL);
+       }
+    }
+
+  /* OK, S points to a word that does not begin with white space.
+     Now extract a word, stopping at a separator, save a pointer to
+     the first character after the word, then skip sequences of spc,
+     tab, or nl as long as they are separators.
+
+     This obeys the field splitting rules in Posix.2. */
+  sindex = 0;
+  /* Don't need string length in ADVANCE_CHAR or string_extract_verbatim
+     unless multibyte chars are possible. */
+  slen = (MB_CUR_MAX > 1) ? strlen (s) : 1;
+  current_word = string_extract_verbatim (s, slen, &sindex, separators, xflags);
+
+  /* Set ENDPTR to the first character after the end of the word. */
+  if (endptr)
+    *endptr = s + sindex;
+
+  /* Note whether or not the separator is IFS whitespace, used later. */
+  whitesep = s[sindex] && spctabnl (s[sindex]);
+
+  /* Move past the current separator character. */
+  if (s[sindex])
+    {
+      DECLARE_MBSTATE;
+      ADVANCE_CHAR (s, slen, sindex);
+    }
+
+  /* Now skip sequences of space, tab, or newline characters if they are
+     in the list of separators. */
+  while (s[sindex] && spctabnl (s[sindex]) && isifs (s[sindex]))
+    sindex++;
+
+  /* If the first separator was IFS whitespace and the current character is
+     a non-whitespace IFS character, it should be part of the current field
+     delimiter, not a separate delimiter that would result in an empty field.
+     Look at POSIX.2, 3.6.5, (3)(b). */
+  if (s[sindex] && whitesep && isifs (s[sindex]) && !spctabnl (s[sindex]))
+    {
+      sindex++;
+      /* An IFS character that is not IFS white space, along with any adjacent
+        IFS white space, shall delimit a field. */
+      while (s[sindex] && spctabnl (s[sindex]) && isifs (s[sindex]))
+       sindex++;
+    }
+
+  /* Update STRING to point to the next field. */
+  *stringp = s + sindex;
+  return (current_word);
+}
+
+/* Remove IFS white space at the end of STRING.  Start at the end
+   of the string and walk backwards until the beginning of the string
+   or we find a character that's not IFS white space and not CTLESC.
+   Only let CTLESC escape a white space character if SAW_ESCAPE is
+   non-zero.  */
+char *
+strip_trailing_ifs_whitespace (string, separators, saw_escape)
+     char *string, *separators;
+     int saw_escape;
+{
+  char *s;
+
+  s = string + STRLEN (string) - 1;
+  while (s > string && ((spctabnl (*s) && isifs (*s)) ||
+                       (saw_escape && *s == CTLESC && spctabnl (s[1]))))
+    s--;
+  *++s = '\0';
+  return string;
+}
+
+#if 0
+/* UNUSED */
+/* Split STRING into words at whitespace.  Obeys shell-style quoting with
+   backslashes, single and double quotes. */
+WORD_LIST *
+list_string_with_quotes (string)
+     char *string;
+{
+  WORD_LIST *list;
+  char *token, *s;
+  size_t s_len;
+  int c, i, tokstart, len;
+
+  for (s = string; s && *s && spctabnl (*s); s++)
+    ;
+  if (s == 0 || *s == 0)
+    return ((WORD_LIST *)NULL);
+
+  s_len = strlen (s);
+  tokstart = i = 0;
+  list = (WORD_LIST *)NULL;
+  while (1)
+    {
+      c = s[i];
+      if (c == '\\')
+       {
+         i++;
+         if (s[i])
+           i++;
+       }
+      else if (c == '\'')
+       i = skip_single_quoted (s, s_len, ++i);
+      else if (c == '"')
+       i = skip_double_quoted (s, s_len, ++i);
+      else if (c == 0 || spctabnl (c))
+       {
+         /* We have found the end of a token.  Make a word out of it and
+            add it to the word list. */
+         token = substring (s, tokstart, i);
+         list = add_string_to_list (token, list);
+         free (token);
+         while (spctabnl (s[i]))
+           i++;
+         if (s[i])
+           tokstart = i;
+         else
+           break;
+       }
+      else
+       i++;    /* normal character */
+    }
+  return (REVERSE_LIST (list, WORD_LIST *));
+}
+#endif
+
+/********************************************************/
+/*                                                     */
+/*     Functions to perform assignment statements      */
+/*                                                     */
+/********************************************************/
+
+#if defined (ARRAY_VARS)
+static SHELL_VAR *
+do_compound_assignment (name, value, flags)
+     char *name, *value;
+     int flags;
+{
+  SHELL_VAR *v;
+  int mklocal, mkassoc;
+  WORD_LIST *list;
+
+  mklocal = flags & ASS_MKLOCAL;
+  mkassoc = flags & ASS_MKASSOC;
+
+  if (mklocal && variable_context)
+    {
+      v = find_variable (name);
+      list = expand_compound_array_assignment (v, value, flags);
+      if (mkassoc)
+       v = make_local_assoc_variable (name);
+      else if (v == 0 || (array_p (v) == 0 && assoc_p (v) == 0) || v->context != variable_context)
+        v = make_local_array_variable (name, 0);
+      assign_compound_array_list (v, list, flags);
+    }
+  else
+    v = assign_array_from_string (name, value, flags);
+
+  return (v);
+}
+#endif
+
+/* Given STRING, an assignment string, get the value of the right side
+   of the `=', and bind it to the left side.  If EXPAND is true, then
+   perform parameter expansion, command substitution, and arithmetic
+   expansion on the right-hand side.  Perform tilde expansion in any
+   case.  Do not perform word splitting on the result of expansion. */
+static int
+do_assignment_internal (word, expand)
+     const WORD_DESC *word;
+     int expand;
+{
+  int offset, appendop, assign_list, aflags, retval;
+  char *name, *value, *temp;
+  SHELL_VAR *entry;
+#if defined (ARRAY_VARS)
+  char *t;
+  int ni;
+#endif
+  const char *string;
+
+  if (word == 0 || word->word == 0)
+    return 0;
+
+  appendop = assign_list = aflags = 0;
+  string = word->word;
+  offset = assignment (string, 0);
+  name = savestring (string);
+  value = (char *)NULL;
+
+  if (name[offset] == '=')
+    {
+      if (name[offset - 1] == '+')
+       {
+         appendop = 1;
+         name[offset - 1] = '\0';
+       }
+
+      name[offset] = 0;                /* might need this set later */
+      temp = name + offset + 1;
+
+#if defined (ARRAY_VARS)
+      if (expand && (word->flags & W_COMPASSIGN))
+       {
+         assign_list = ni = 1;
+         value = extract_array_assignment_list (temp, &ni);
+       }
+      else
+#endif
+      if (expand && temp[0])
+       value = expand_string_if_necessary (temp, 0, expand_string_assignment);
+      else
+       value = savestring (temp);
+    }
+
+  if (value == 0)
+    {
+      value = (char *)xmalloc (1);
+      value[0] = '\0';
+    }
+
+  if (echo_command_at_execute)
+    {
+      if (appendop)
+       name[offset - 1] = '+';
+      xtrace_print_assignment (name, value, assign_list, 1);
+      if (appendop)
+       name[offset - 1] = '\0';
+    }
+
+#define ASSIGN_RETURN(r)       do { FREE (value); free (name); return (r); } while (0)
+
+  if (appendop)
+    aflags |= ASS_APPEND;
+
+#if defined (ARRAY_VARS)
+  if (t = mbschr (name, '['))  /*]*/
+    {
+      if (assign_list)
+       {
+         report_error (_("%s: cannot assign list to array member"), name);
+         ASSIGN_RETURN (0);
+       }
+      entry = assign_array_element (name, value, aflags);
+      if (entry == 0)
+       ASSIGN_RETURN (0);
+    }
+  else if (assign_list)
+    {
+      if ((word->flags & W_ASSIGNARG) && (word->flags & W_ASSNGLOBAL) == 0)
+       aflags |= ASS_MKLOCAL;
+      if (word->flags & W_ASSIGNASSOC)
+       aflags |= ASS_MKASSOC;
+      entry = do_compound_assignment (name, value, aflags);
+    }
+  else
+#endif /* ARRAY_VARS */
+  entry = bind_variable (name, value, aflags);
+
+  stupidly_hack_special_variables (name);
+
+  /* Return 1 if the assignment seems to have been performed correctly. */
+  if (entry == 0 || readonly_p (entry))
+    retval = 0;                /* assignment failure */
+  else if (noassign_p (entry))
+    {
+      last_command_exit_value = EXECUTION_FAILURE;
+      retval = 1;      /* error status, but not assignment failure */
+    }
+  else
+    retval = 1;
+
+  if (entry && retval != 0 && noassign_p (entry) == 0)
+    VUNSETATTR (entry, att_invisible);
+
+  ASSIGN_RETURN (retval);
+}
+
+/* Perform the assignment statement in STRING, and expand the
+   right side by doing tilde, command and parameter expansion. */
+int
+do_assignment (string)
+     char *string;
+{
+  WORD_DESC td;
+
+  td.flags = W_ASSIGNMENT;
+  td.word = string;
+
+  return do_assignment_internal (&td, 1);
+}
+
+int
+do_word_assignment (word, flags)
+     WORD_DESC *word;
+     int flags;
+{
+  return do_assignment_internal (word, 1);
+}
+
+/* Given STRING, an assignment string, get the value of the right side
+   of the `=', and bind it to the left side.  Do not perform any word
+   expansions on the right hand side. */
+int
+do_assignment_no_expand (string)
+     char *string;
+{
+  WORD_DESC td;
+
+  td.flags = W_ASSIGNMENT;
+  td.word = string;
+
+  return (do_assignment_internal (&td, 0));
+}
+
+/***************************************************
+ *                                                *
+ *  Functions to manage the positional parameters  *
+ *                                                *
+ ***************************************************/
+
+/* Return the word list that corresponds to `$*'. */
+WORD_LIST *
+list_rest_of_args ()
+{
+  register WORD_LIST *list, *args;
+  int i;
+
+  /* Break out of the loop as soon as one of the dollar variables is null. */
+  for (i = 1, list = (WORD_LIST *)NULL; i < 10 && dollar_vars[i]; i++)
+    list = make_word_list (make_bare_word (dollar_vars[i]), list);
+
+  for (args = rest_of_args; args; args = args->next)
+    list = make_word_list (make_bare_word (args->word->word), list);
+
+  return (REVERSE_LIST (list, WORD_LIST *));
+}
+
+int
+number_of_args ()
+{
+  register WORD_LIST *list;
+  int n;
+
+  for (n = 0; n < 9 && dollar_vars[n+1]; n++)
+    ;
+  for (list = rest_of_args; list; list = list->next)
+    n++;
+  return n;
+}
+
+/* Return the value of a positional parameter.  This handles values > 10. */
+char *
+get_dollar_var_value (ind)
+     intmax_t ind;
+{
+  char *temp;
+  WORD_LIST *p;
+
+  if (ind < 10)
+    temp = dollar_vars[ind] ? savestring (dollar_vars[ind]) : (char *)NULL;
+  else /* We want something like ${11} */
+    {
+      ind -= 10;
+      for (p = rest_of_args; p && ind--; p = p->next)
+       ;
+      temp = p ? savestring (p->word->word) : (char *)NULL;
+    }
+  return (temp);
+}
+
+/* Make a single large string out of the dollar digit variables,
+   and the rest_of_args.  If DOLLAR_STAR is 1, then obey the special
+   case of "$*" with respect to IFS. */
+char *
+string_rest_of_args (dollar_star)
+     int dollar_star;
+{
+  register WORD_LIST *list;
+  char *string;
+
+  list = list_rest_of_args ();
+  string = dollar_star ? string_list_dollar_star (list) : string_list (list);
+  dispose_words (list);
+  return (string);
+}
+
+/* Return a string containing the positional parameters from START to
+   END, inclusive.  If STRING[0] == '*', we obey the rules for $*,
+   which only makes a difference if QUOTED is non-zero.  If QUOTED includes
+   Q_HERE_DOCUMENT or Q_DOUBLE_QUOTES, this returns a quoted list, otherwise
+   no quoting chars are added. */
+static char *
+pos_params (string, start, end, quoted)
+     char *string;
+     int start, end, quoted;
+{
+  WORD_LIST *save, *params, *h, *t;
+  char *ret;
+  int i;
+
+  /* see if we can short-circuit.  if start == end, we want 0 parameters. */
+  if (start == end)
+    return ((char *)NULL);
+
+  save = params = list_rest_of_args ();
+  if (save == 0)
+    return ((char *)NULL);
+
+  if (start == 0)              /* handle ${@:0[:x]} specially */
+    {
+      t = make_word_list (make_word (dollar_vars[0]), params);
+      save = params = t;
+    }
+
+  for (i = start ? 1 : 0; params && i < start; i++)
+    params = params->next;
+  if (params == 0)
+    return ((char *)NULL);
+  for (h = t = params; params && i < end; i++)
+    {
+      t = params;
+      params = params->next;
+    }
+
+  t->next = (WORD_LIST *)NULL;
+
+  ret = string_list_pos_params (string[0], h, quoted);
+
+  if (t != params)
+    t->next = params;
+
+  dispose_words (save);
+  return (ret);
+}
+
+/******************************************************************/
+/*                                                               */
+/*     Functions to expand strings to strings or WORD_LISTs      */
+/*                                                               */
+/******************************************************************/
+
+#if defined (PROCESS_SUBSTITUTION)
+#define EXP_CHAR(s) (s == '$' || s == '`' || s == '<' || s == '>' || s == CTLESC || s == '~')
+#else
+#define EXP_CHAR(s) (s == '$' || s == '`' || s == CTLESC || s == '~')
+#endif
+
+/* If there are any characters in STRING that require full expansion,
+   then call FUNC to expand STRING; otherwise just perform quote
+   removal if necessary.  This returns a new string. */
+static char *
+expand_string_if_necessary (string, quoted, func)
+     char *string;
+     int quoted;
+     EXPFUNC *func;
+{
+  WORD_LIST *list;
+  size_t slen;
+  int i, saw_quote;
+  char *ret;
+  DECLARE_MBSTATE;
+
+  /* Don't need string length for ADVANCE_CHAR unless multibyte chars possible. */
+  slen = (MB_CUR_MAX > 1) ? strlen (string) : 0;
+  i = saw_quote = 0;
+  while (string[i])
+    {
+      if (EXP_CHAR (string[i]))
+       break;
+      else if (string[i] == '\'' || string[i] == '\\' || string[i] == '"')
+       saw_quote = 1;
+      ADVANCE_CHAR (string, slen, i);
+    }
+
+  if (string[i])
+    {
+      list = (*func) (string, quoted);
+      if (list)
+       {
+         ret = string_list (list);
+         dispose_words (list);
+       }
+      else
+       ret = (char *)NULL;
+    }
+  else if (saw_quote && ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) == 0))
+    ret = string_quote_removal (string, quoted);
+  else
+    ret = savestring (string);
+
+  return ret;
+}
+
+static inline char *
+expand_string_to_string_internal (string, quoted, func)
+     char *string;
+     int quoted;
+     EXPFUNC *func;
+{
+  WORD_LIST *list;
+  char *ret;
+
+  if (string == 0 || *string == '\0')
+    return ((char *)NULL);
+
+  list = (*func) (string, quoted);
+  if (list)
+    {
+      ret = string_list (list);
+      dispose_words (list);
+    }
+  else
+    ret = (char *)NULL;
+
+  return (ret);
+}
+
+char *
+expand_string_to_string (string, quoted)
+     char *string;
+     int quoted;
+{
+  return (expand_string_to_string_internal (string, quoted, expand_string));
+}
+
+char *
+expand_string_unsplit_to_string (string, quoted)
+     char *string;
+     int quoted;
+{
+  return (expand_string_to_string_internal (string, quoted, expand_string_unsplit));
+}
+
+char *
+expand_assignment_string_to_string (string, quoted)
+     char *string;
+     int quoted;
+{
+  return (expand_string_to_string_internal (string, quoted, expand_string_assignment));
+}
+
+char *
+expand_arith_string (string, quoted)
+     char *string;
+     int quoted;
+{
+  return (expand_string_if_necessary (string, quoted, expand_string));
+}
+
+#if defined (COND_COMMAND)
+/* Just remove backslashes in STRING.  Returns a new string. */
+char *
+remove_backslashes (string)
+     char *string;
+{
+  char *r, *ret, *s;
+
+  r = ret = (char *)xmalloc (strlen (string) + 1);
+  for (s = string; s && *s; )
+    {
+      if (*s == '\\')
+       s++;
+      if (*s == 0)
+       break;
+      *r++ = *s++;
+    }
+  *r = '\0';
+  return ret;
+}
+
+/* This needs better error handling. */
+/* Expand W for use as an argument to a unary or binary operator in a
+   [[...]] expression.  If SPECIAL is 1, this is the rhs argument
+   to the != or == operator, and should be treated as a pattern.  In
+   this case, we quote the string specially for the globbing code.  If
+   SPECIAL is 2, this is an rhs argument for the =~ operator, and should
+   be quoted appropriately for regcomp/regexec.  The caller is responsible
+   for removing the backslashes if the unquoted word is needed later. */   
+char *
+cond_expand_word (w, special)
+     WORD_DESC *w;
+     int special;
+{
+  char *r, *p;
+  WORD_LIST *l;
+  int qflags;
+
+  if (w->word == 0 || w->word[0] == '\0')
+    return ((char *)NULL);
+
+  w->flags |= W_NOSPLIT2;
+  l = call_expand_word_internal (w, 0, 0, (int *)0, (int *)0);
+  if (l)
+    {
+      if (special == 0)
+       {
+         dequote_list (l);
+         r = string_list (l);
+       }
+      else
+       {
+         qflags = QGLOB_CVTNULL;
+         if (special == 2)
+           qflags |= QGLOB_REGEXP;
+         p = string_list (l);
+         r = quote_string_for_globbing (p, qflags);
+         free (p);
+       }
+      dispose_words (l);
+    }
+  else
+    r = (char *)NULL;
+
+  return r;
+}
+#endif
+
+/* Call expand_word_internal to expand W and handle error returns.
+   A convenience function for functions that don't want to handle
+   any errors or free any memory before aborting. */
+static WORD_LIST *
+call_expand_word_internal (w, q, i, c, e)
+     WORD_DESC *w;
+     int q, i, *c, *e;
+{
+  WORD_LIST *result;
+
+  result = expand_word_internal (w, q, i, c, e);
+  if (result == &expand_word_error || result == &expand_word_fatal)
+    {
+      /* By convention, each time this error is returned, w->word has
+        already been freed (it sometimes may not be in the fatal case,
+        but that doesn't result in a memory leak because we're going
+        to exit in most cases). */
+      w->word = (char *)NULL;
+      last_command_exit_value = EXECUTION_FAILURE;
+      exp_jump_to_top_level ((result == &expand_word_error) ? DISCARD : FORCE_EOF);
+      /* NOTREACHED */
+    }
+  else
+    return (result);
+}
+
+/* Perform parameter expansion, command substitution, and arithmetic
+   expansion on STRING, as if it were a word.  Leave the result quoted.
+   Since this does not perform word splitting, it leaves quoted nulls
+   in the result.  */
+static WORD_LIST *
+expand_string_internal (string, quoted)
+     char *string;
+     int quoted;
+{
+  WORD_DESC td;
+  WORD_LIST *tresult;
+
+  if (string == 0 || *string == 0)
+    return ((WORD_LIST *)NULL);
+
+  td.flags = 0;
+  td.word = savestring (string);
+
+  tresult = call_expand_word_internal (&td, quoted, 0, (int *)NULL, (int *)NULL);
+
+  FREE (td.word);
+  return (tresult);
+}
+
+/* Expand STRING by performing parameter expansion, command substitution,
+   and arithmetic expansion.  Dequote the resulting WORD_LIST before
+   returning it, but do not perform word splitting.  The call to
+   remove_quoted_nulls () is in here because word splitting normally
+   takes care of quote removal. */
+WORD_LIST *
+expand_string_unsplit (string, quoted)
+     char *string;
+     int quoted;
+{
+  WORD_LIST *value;
+
+  if (string == 0 || *string == '\0')
+    return ((WORD_LIST *)NULL);
+
+  expand_no_split_dollar_star = 1;
+  value = expand_string_internal (string, quoted);
+  expand_no_split_dollar_star = 0;
+
+  if (value)
+    {
+      if (value->word)
+       {
+         remove_quoted_nulls (value->word->word);
+         value->word->flags &= ~W_HASQUOTEDNULL;
+       }
+      dequote_list (value);
+    }
+  return (value);
+}
+
+/* Expand the rhs of an assignment statement */
+WORD_LIST *
+expand_string_assignment (string, quoted)
+     char *string;
+     int quoted;
+{
+  WORD_DESC td;
+  WORD_LIST *value;
+
+  if (string == 0 || *string == '\0')
+    return ((WORD_LIST *)NULL);
+
+  expand_no_split_dollar_star = 1;
+
+  td.flags = W_ASSIGNRHS;
+  td.word = savestring (string);
+  value = call_expand_word_internal (&td, quoted, 0, (int *)NULL, (int *)NULL);
+  FREE (td.word);
+
+  expand_no_split_dollar_star = 0;
+
+  if (value)
+    {
+      if (value->word)
+       {
+         remove_quoted_nulls (value->word->word);
+         value->word->flags &= ~W_HASQUOTEDNULL;
+       }
+      dequote_list (value);
+    }
+  return (value);
+}
+
+
+/* Expand one of the PS? prompt strings. This is a sort of combination of
+   expand_string_unsplit and expand_string_internal, but returns the
+   passed string when an error occurs.  Might want to trap other calls
+   to jump_to_top_level here so we don't endlessly loop. */
+WORD_LIST *
+expand_prompt_string (string, quoted, wflags)
+     char *string;
+     int quoted;
+     int wflags;
+{
+  WORD_LIST *value;
+  WORD_DESC td;
+
+  if (string == 0 || *string == 0)
+    return ((WORD_LIST *)NULL);
+
+  td.flags = wflags;
+  td.word = savestring (string);
+
+  no_longjmp_on_fatal_error = 1;
+  value = expand_word_internal (&td, quoted, 0, (int *)NULL, (int *)NULL);
+  no_longjmp_on_fatal_error = 0;
+
+  if (value == &expand_word_error || value == &expand_word_fatal)
+    {
+      value = make_word_list (make_bare_word (string), (WORD_LIST *)NULL);
+      return value;
+    }
+  FREE (td.word);
+  if (value)
+    {
+      if (value->word)
+       {
+         remove_quoted_nulls (value->word->word);
+         value->word->flags &= ~W_HASQUOTEDNULL;
+       }
+      dequote_list (value);
+    }
+  return (value);
+}
+
+/* Expand STRING just as if you were expanding a word, but do not dequote
+   the resultant WORD_LIST.  This is called only from within this file,
+   and is used to correctly preserve quoted characters when expanding
+   things like ${1+"$@"}.  This does parameter expansion, command
+   substitution, arithmetic expansion, and word splitting. */
+static WORD_LIST *
+expand_string_leave_quoted (string, quoted)
+     char *string;
+     int quoted;
+{
+  WORD_LIST *tlist;
+  WORD_LIST *tresult;
+
+  if (string == 0 || *string == '\0')
+    return ((WORD_LIST *)NULL);
+
+  tlist = expand_string_internal (string, quoted);
+
+  if (tlist)
+    {
+      tresult = word_list_split (tlist);
+      dispose_words (tlist);
+      return (tresult);
+    }
+  return ((WORD_LIST *)NULL);
+}
+
+/* This does not perform word splitting or dequote the WORD_LIST
+   it returns. */
+static WORD_LIST *
+expand_string_for_rhs (string, quoted, dollar_at_p, has_dollar_at)
+     char *string;
+     int quoted, *dollar_at_p, *has_dollar_at;
+{
+  WORD_DESC td;
+  WORD_LIST *tresult;
+
+  if (string == 0 || *string == '\0')
+    return (WORD_LIST *)NULL;
+
+  td.flags = W_NOSPLIT2;               /* no splitting, remove "" and '' */
+  td.word = string;
+  tresult = call_expand_word_internal (&td, quoted, 1, dollar_at_p, has_dollar_at);
+  return (tresult);
+}
+
+/* Expand STRING just as if you were expanding a word.  This also returns
+   a list of words.  Note that filename globbing is *NOT* done for word
+   or string expansion, just when the shell is expanding a command.  This
+   does parameter expansion, command substitution, arithmetic expansion,
+   and word splitting.  Dequote the resultant WORD_LIST before returning. */
+WORD_LIST *
+expand_string (string, quoted)
+     char *string;
+     int quoted;
+{
+  WORD_LIST *result;
+
+  if (string == 0 || *string == '\0')
+    return ((WORD_LIST *)NULL);
+
+  result = expand_string_leave_quoted (string, quoted);
+  return (result ? dequote_list (result) : result);
+}
+
+/***************************************************
+ *                                                *
+ *     Functions to handle quoting chars          *
+ *                                                *
+ ***************************************************/
+
+/* Conventions:
+
+     A string with s[0] == CTLNUL && s[1] == 0 is a quoted null string.
+     The parser passes CTLNUL as CTLESC CTLNUL. */
+
+/* Quote escape characters in string s, but no other characters.  This is
+   used to protect CTLESC and CTLNUL in variable values from the rest of
+   the word expansion process after the variable is expanded (word splitting
+   and filename generation).  If IFS is null, we quote spaces as well, just
+   in case we split on spaces later (in the case of unquoted $@, we will
+   eventually attempt to split the entire word on spaces).  Corresponding
+   code exists in dequote_escapes.  Even if we don't end up splitting on
+   spaces, quoting spaces is not a problem.  This should never be called on
+   a string that is quoted with single or double quotes or part of a here
+   document (effectively double-quoted). */
+char *
+quote_escapes (string)
+     char *string;
+{
+  register char *s, *t;
+  size_t slen;
+  char *result, *send;
+  int quote_spaces, skip_ctlesc, skip_ctlnul;
+  DECLARE_MBSTATE; 
+
+  slen = strlen (string);
+  send = string + slen;
+
+  quote_spaces = (ifs_value && *ifs_value == 0);
+
+  for (skip_ctlesc = skip_ctlnul = 0, s = ifs_value; s && *s; s++)
+    skip_ctlesc |= *s == CTLESC, skip_ctlnul |= *s == CTLNUL;
+
+  t = result = (char *)xmalloc ((slen * 2) + 1);
+  s = string;
+
+  while (*s)
+    {
+      if ((skip_ctlesc == 0 && *s == CTLESC) || (skip_ctlnul == 0 && *s == CTLNUL) || (quote_spaces && *s == ' '))
+       *t++ = CTLESC;
+      COPY_CHAR_P (t, s, send);
+    }
+  *t = '\0';
+  return (result);
+}
+
+static WORD_LIST *
+list_quote_escapes (list)
+     WORD_LIST *list;
+{
+  register WORD_LIST *w;
+  char *t;
+
+  for (w = list; w; w = w->next)
+    {
+      t = w->word->word;
+      w->word->word = quote_escapes (t);
+      free (t);
+    }
+  return list;
+}
+
+/* Inverse of quote_escapes; remove CTLESC protecting CTLESC or CTLNUL.
+
+   The parser passes us CTLESC as CTLESC CTLESC and CTLNUL as CTLESC CTLNUL.
+   This is necessary to make unquoted CTLESC and CTLNUL characters in the
+   data stream pass through properly.
+
+   We need to remove doubled CTLESC characters inside quoted strings before
+   quoting the entire string, so we do not double the number of CTLESC
+   characters.
+
+   Also used by parts of the pattern substitution code. */
+char *
+dequote_escapes (string)
+     char *string;
+{
+  register char *s, *t, *s1;
+  size_t slen;
+  char *result, *send;
+  int quote_spaces;
+  DECLARE_MBSTATE;
+
+  if (string == 0)
+    return string;
+
+  slen = strlen (string);
+  send = string + slen;
+
+  t = result = (char *)xmalloc (slen + 1);
+
+  if (strchr (string, CTLESC) == 0)
+    return (strcpy (result, string));
+
+  quote_spaces = (ifs_value && *ifs_value == 0);
+
+  s = string;
+  while (*s)
+    {
+      if (*s == CTLESC && (s[1] == CTLESC || s[1] == CTLNUL || (quote_spaces && s[1] == ' ')))
+       {
+         s++;
+         if (*s == '\0')
+           break;
+       }
+      COPY_CHAR_P (t, s, send);
+    }
+  *t = '\0';
+  return result;
+}
+
+/* Return a new string with the quoted representation of character C.
+   This turns "" into QUOTED_NULL, so the W_HASQUOTEDNULL flag needs to be
+   set in any resultant WORD_DESC where this value is the word. */
+static char *
+make_quoted_char (c)
+     int c;
+{
+  char *temp;
+
+  temp = (char *)xmalloc (3);
+  if (c == 0)
+    {
+      temp[0] = CTLNUL;
+      temp[1] = '\0';
+    }
+  else
+    {
+      temp[0] = CTLESC;
+      temp[1] = c;
+      temp[2] = '\0';
+    }
+  return (temp);
+}
+
+/* Quote STRING, returning a new string.  This turns "" into QUOTED_NULL, so
+   the W_HASQUOTEDNULL flag needs to be set in any resultant WORD_DESC where
+   this value is the word. */
+char *
+quote_string (string)
+     char *string;
+{
+  register char *t;
+  size_t slen;
+  char *result, *send;
+
+  if (*string == 0)
+    {
+      result = (char *)xmalloc (2);
+      result[0] = CTLNUL;
+      result[1] = '\0';
+    }
+  else
+    {
+      DECLARE_MBSTATE;
+
+      slen = strlen (string);
+      send = string + slen;
+
+      result = (char *)xmalloc ((slen * 2) + 1);
+
+      for (t = result; string < send; )
+       {
+         *t++ = CTLESC;
+         COPY_CHAR_P (t, string, send);
+       }
+      *t = '\0';
+    }
+  return (result);
+}
+
+/* De-quote quoted characters in STRING. */
+char *
+dequote_string (string)
+     char *string;
+{
+  register char *s, *t;
+  size_t slen;
+  char *result, *send;
+  DECLARE_MBSTATE;
+
+  slen = strlen (string);
+
+  t = result = (char *)xmalloc (slen + 1);
+
+  if (QUOTED_NULL (string))
+    {
+      result[0] = '\0';
+      return (result);
+    }
+
+  /* If no character in the string can be quoted, don't bother examining
+     each character.  Just return a copy of the string passed to us. */
+  if (strchr (string, CTLESC) == NULL)
+    return (strcpy (result, string));
+
+  send = string + slen;
+  s = string;
+  while (*s)
+    {
+      if (*s == CTLESC)
+       {
+         s++;
+         if (*s == '\0')
+           break;
+       }
+      COPY_CHAR_P (t, s, send);
+    }
+
+  *t = '\0';
+  return (result);
+}
+
+/* Quote the entire WORD_LIST list. */
+static WORD_LIST *
+quote_list (list)
+     WORD_LIST *list;
+{
+  register WORD_LIST *w;
+  char *t;
+
+  for (w = list; w; w = w->next)
+    {
+      t = w->word->word;
+      w->word->word = quote_string (t);
+      if (*t == 0)
+       w->word->flags |= W_HASQUOTEDNULL;      /* XXX - turn on W_HASQUOTEDNULL here? */
+      w->word->flags |= W_QUOTED;
+      free (t);
+    }
+  return list;
+}
+
+/* De-quote quoted characters in each word in LIST. */
+WORD_LIST *
+dequote_list (list)
+     WORD_LIST *list;
+{
+  register char *s;
+  register WORD_LIST *tlist;
+
+  for (tlist = list; tlist; tlist = tlist->next)
+    {
+      s = dequote_string (tlist->word->word);
+      if (QUOTED_NULL (tlist->word->word))
+       tlist->word->flags &= ~W_HASQUOTEDNULL;
+      free (tlist->word->word);
+      tlist->word->word = s;
+    }
+  return list;
+}
+
+/* Remove CTLESC protecting a CTLESC or CTLNUL in place.  Return the passed
+   string. */
+char *
+remove_quoted_escapes (string)
+     char *string;
+{
+  char *t;
+
+  if (string)
+    {
+      t = dequote_escapes (string);
+      strcpy (string, t);
+      free (t);
+    }
+
+  return (string);
+}
+
+/* Perform quoted null character removal on STRING.  We don't allow any
+   quoted null characters in the middle or at the ends of strings because
+   of how expand_word_internal works.  remove_quoted_nulls () turns
+   STRING into an empty string iff it only consists of a quoted null,
+   and removes all unquoted CTLNUL characters. */
+char *
+remove_quoted_nulls (string)
+     char *string;
+{
+  register size_t slen;
+  register int i, j, prev_i;
+  DECLARE_MBSTATE;
+
+  if (strchr (string, CTLNUL) == 0)            /* XXX */
+    return string;                             /* XXX */
+
+  slen = strlen (string);
+  i = j = 0;
+
+  while (i < slen)
+    {
+      if (string[i] == CTLESC)
+       {
+         /* Old code had j++, but we cannot assume that i == j at this
+            point -- what if a CTLNUL has already been removed from the
+            string?  We don't want to drop the CTLESC or recopy characters
+            that we've already copied down. */
+         i++; string[j++] = CTLESC;
+         if (i == slen)
+           break;
+       }
+      else if (string[i] == CTLNUL)
+       {
+         i++;
+         continue;
+       }
+
+      prev_i = i;
+      ADVANCE_CHAR (string, slen, i);
+      if (j < prev_i)
+       {
+         do string[j++] = string[prev_i++]; while (prev_i < i);
+       }
+      else
+       j = i;
+    }
+  string[j] = '\0';
+
+  return (string);
+}
+
+/* Perform quoted null character removal on each element of LIST.
+   This modifies LIST. */
+void
+word_list_remove_quoted_nulls (list)
+     WORD_LIST *list;
+{
+  register WORD_LIST *t;
+
+  for (t = list; t; t = t->next)
+    {
+      remove_quoted_nulls (t->word->word);
+      t->word->flags &= ~W_HASQUOTEDNULL;
+    }
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*        Functions for Matching and Removing Patterns             */
+/*                                                                 */
+/* **************************************************************** */
+
+#if defined (HANDLE_MULTIBYTE)
+#if 0 /* Currently unused */
+static unsigned char *
+mb_getcharlens (string, len)
+     char *string;
+     int len;
+{
+  int i, offset, last;
+  unsigned char *ret;
+  char *p;
+  DECLARE_MBSTATE;
+
+  i = offset = 0;
+  last = 0;
+  ret = (unsigned char *)xmalloc (len);
+  memset (ret, 0, len);
+  while (string[last])
+    {
+      ADVANCE_CHAR (string, len, offset);
+      ret[last] = offset - last;
+      last = offset;
+    }
+  return ret;
+}
+#endif
+#endif
+
+/* Remove the portion of PARAM matched by PATTERN according to OP, where OP
+   can have one of 4 values:
+       RP_LONG_LEFT    remove longest matching portion at start of PARAM
+       RP_SHORT_LEFT   remove shortest matching portion at start of PARAM
+       RP_LONG_RIGHT   remove longest matching portion at end of PARAM
+       RP_SHORT_RIGHT  remove shortest matching portion at end of PARAM
+*/
+
+#define RP_LONG_LEFT   1
+#define RP_SHORT_LEFT  2
+#define RP_LONG_RIGHT  3
+#define RP_SHORT_RIGHT 4
+
+/* Returns its first argument if nothing matched; new memory otherwise */
+static char *
+remove_upattern (param, pattern, op)
+     char *param, *pattern;
+     int op;
+{
+  register int len;
+  register char *end;
+  register char *p, *ret, c;
+
+  len = STRLEN (param);
+  end = param + len;
+
+  switch (op)
+    {
+      case RP_LONG_LEFT:       /* remove longest match at start */
+       for (p = end; p >= param; p--)
+         {
+           c = *p; *p = '\0';
+           if (strmatch (pattern, param, FNMATCH_EXTFLAG) != FNM_NOMATCH)
+             {
+               *p = c;
+               return (savestring (p));
+             }
+           *p = c;
+
+         }
+       break;
+
+      case RP_SHORT_LEFT:      /* remove shortest match at start */
+       for (p = param; p <= end; p++)
+         {
+           c = *p; *p = '\0';
+           if (strmatch (pattern, param, FNMATCH_EXTFLAG) != FNM_NOMATCH)
+             {
+               *p = c;
+               return (savestring (p));
+             }
+           *p = c;
+         }
+       break;
+
+      case RP_LONG_RIGHT:      /* remove longest match at end */
+       for (p = param; p <= end; p++)
+         {
+           if (strmatch (pattern, p, FNMATCH_EXTFLAG) != FNM_NOMATCH)
+             {
+               c = *p; *p = '\0';
+               ret = savestring (param);
+               *p = c;
+               return (ret);
+             }
+         }
+       break;
+
+      case RP_SHORT_RIGHT:     /* remove shortest match at end */
+       for (p = end; p >= param; p--)
+         {
+           if (strmatch (pattern, p, FNMATCH_EXTFLAG) != FNM_NOMATCH)
+             {
+               c = *p; *p = '\0';
+               ret = savestring (param);
+               *p = c;
+               return (ret);
+             }
+         }
+       break;
+    }
+
+  return (param);      /* no match, return original string */
+}
+
+#if defined (HANDLE_MULTIBYTE)
+/* Returns its first argument if nothing matched; new memory otherwise */
+static wchar_t *
+remove_wpattern (wparam, wstrlen, wpattern, op)
+     wchar_t *wparam;
+     size_t wstrlen;
+     wchar_t *wpattern;
+     int op;
+{
+  wchar_t wc, *ret;
+  int n;
+
+  switch (op)
+    {
+      case RP_LONG_LEFT:       /* remove longest match at start */
+        for (n = wstrlen; n >= 0; n--)
+         {
+           wc = wparam[n]; wparam[n] = L'\0';
+           if (wcsmatch (wpattern, wparam, FNMATCH_EXTFLAG) != FNM_NOMATCH)
+             {
+               wparam[n] = wc;
+               return (wcsdup (wparam + n));
+             }
+           wparam[n] = wc;
+         }
+       break;
+
+      case RP_SHORT_LEFT:      /* remove shortest match at start */
+       for (n = 0; n <= wstrlen; n++)
+         {
+           wc = wparam[n]; wparam[n] = L'\0';
+           if (wcsmatch (wpattern, wparam, FNMATCH_EXTFLAG) != FNM_NOMATCH)
+             {
+               wparam[n] = wc;
+               return (wcsdup (wparam + n));
+             }
+           wparam[n] = wc;
+         }
+       break;
+
+      case RP_LONG_RIGHT:      /* remove longest match at end */
+        for (n = 0; n <= wstrlen; n++)
+         {
+           if (wcsmatch (wpattern, wparam + n, FNMATCH_EXTFLAG) != FNM_NOMATCH)
+             {
+               wc = wparam[n]; wparam[n] = L'\0';
+               ret = wcsdup (wparam);
+               wparam[n] = wc;
+               return (ret);
+             }
+         }
+       break;
+
+      case RP_SHORT_RIGHT:     /* remove shortest match at end */
+       for (n = wstrlen; n >= 0; n--)
+         {
+           if (wcsmatch (wpattern, wparam + n, FNMATCH_EXTFLAG) != FNM_NOMATCH)
+             {
+               wc = wparam[n]; wparam[n] = L'\0';
+               ret = wcsdup (wparam);
+               wparam[n] = wc;
+               return (ret);
+             }
+         }
+       break;
+    }
+
+  return (wparam);     /* no match, return original string */
+}
+#endif /* HANDLE_MULTIBYTE */
+
+static char *
+remove_pattern (param, pattern, op)
+     char *param, *pattern;
+     int op;
+{
+  char *xret;
+
+  if (param == NULL)
+    return (param);
+  if (*param == '\0' || pattern == NULL || *pattern == '\0')   /* minor optimization */
+    return (savestring (param));
+
+#if defined (HANDLE_MULTIBYTE)
+  if (MB_CUR_MAX > 1)
+    {
+      wchar_t *ret, *oret;
+      size_t n;
+      wchar_t *wparam, *wpattern;
+      mbstate_t ps;
+
+      n = xdupmbstowcs (&wpattern, NULL, pattern);
+      if (n == (size_t)-1)
+       {
+         xret = remove_upattern (param, pattern, op);
+         return ((xret == param) ? savestring (param) : xret);
+       }
+      n = xdupmbstowcs (&wparam, NULL, param);
+      if (n == (size_t)-1)
+       {
+         free (wpattern);
+         xret = remove_upattern (param, pattern, op);
+         return ((xret == param) ? savestring (param) : xret);
+       }
+      oret = ret = remove_wpattern (wparam, n, wpattern, op);
+      /* Don't bother to convert wparam back to multibyte string if nothing
+        matched; just return copy of original string */
+      if (ret == wparam)
+        {
+          free (wparam);
+          free (wpattern);
+          return (savestring (param));
+        }
+
+      free (wparam);
+      free (wpattern);
+
+      n = strlen (param);
+      xret = (char *)xmalloc (n + 1);
+      memset (&ps, '\0', sizeof (mbstate_t));
+      n = wcsrtombs (xret, (const wchar_t **)&ret, n, &ps);
+      xret[n] = '\0';          /* just to make sure */
+      free (oret);
+      return xret;      
+    }
+  else
+#endif
+    {
+      xret = remove_upattern (param, pattern, op);
+      return ((xret == param) ? savestring (param) : xret);
+    }
+}
+
+/* Match PAT anywhere in STRING and return the match boundaries.
+   This returns 1 in case of a successful match, 0 otherwise.  SP
+   and EP are pointers into the string where the match begins and
+   ends, respectively.  MTYPE controls what kind of match is attempted.
+   MATCH_BEG and MATCH_END anchor the match at the beginning and end
+   of the string, respectively.  The longest match is returned. */
+static int
+match_upattern (string, pat, mtype, sp, ep)
+     char *string, *pat;
+     int mtype;
+     char **sp, **ep;
+{
+  int c, len, mlen;
+  register char *p, *p1, *npat;
+  char *end;
+  int n1;
+
+  /* If the pattern doesn't match anywhere in the string, go ahead and
+     short-circuit right away.  A minor optimization, saves a bunch of
+     unnecessary calls to strmatch (up to N calls for a string of N
+     characters) if the match is unsuccessful.  To preserve the semantics
+     of the substring matches below, we make sure that the pattern has
+     `*' as first and last character, making a new pattern if necessary. */
+  /* XXX - check this later if I ever implement `**' with special meaning,
+     since this will potentially result in `**' at the beginning or end */
+  len = STRLEN (pat);
+  if (pat[0] != '*' || (pat[0] == '*' && pat[1] == LPAREN && extended_glob) || pat[len - 1] != '*')
+    {
+      p = npat = (char *)xmalloc (len + 3);
+      p1 = pat;
+      if (*p1 != '*' || (*p1 == '*' && p1[1] == LPAREN && extended_glob))
+       *p++ = '*';
+      while (*p1)
+       *p++ = *p1++;
+      if (p1[-1] != '*' || p[-2] == '\\')
+       *p++ = '*';
+      *p = '\0';
+    }
+  else
+    npat = pat;
+  c = strmatch (npat, string, FNMATCH_EXTFLAG);
+  if (npat != pat)
+    free (npat);
+  if (c == FNM_NOMATCH)
+    return (0);
+
+  len = STRLEN (string);
+  end = string + len;
+
+  mlen = umatchlen (pat, len);
+
+  switch (mtype)
+    {
+    case MATCH_ANY:
+      for (p = string; p <= end; p++)
+       {
+         if (match_pattern_char (pat, p))
+           {
+#if 0
+             for (p1 = end; p1 >= p; p1--)
+#else
+             p1 = (mlen == -1) ? end : p + mlen;
+             /* p1 - p = length of portion of string to be considered
+                p = current position in string
+                mlen = number of characters consumed by match (-1 for entire string)
+                end = end of string
+                we want to break immediately if the potential match len
+                is greater than the number of characters remaining in the
+                string
+             */
+             if (p1 > end)
+               break;
+             for ( ; p1 >= p; p1--)
+#endif
+               {
+                 c = *p1; *p1 = '\0';
+                 if (strmatch (pat, p, FNMATCH_EXTFLAG) == 0)
+                   {
+                     *p1 = c;
+                     *sp = p;
+                     *ep = p1;
+                     return 1;
+                   }
+                 *p1 = c;
+#if 1
+                 /* If MLEN != -1, we have a fixed length pattern. */
+                 if (mlen != -1)
+                   break;
+#endif
+               }
+           }
+       }
+
+      return (0);
+
+    case MATCH_BEG:
+      if (match_pattern_char (pat, string) == 0)
+       return (0);
+
+#if 0
+      for (p = end; p >= string; p--)
+#else
+      for (p = (mlen == -1) ? end : string + mlen; p >= string; p--)
+#endif
+       {
+         c = *p; *p = '\0';
+         if (strmatch (pat, string, FNMATCH_EXTFLAG) == 0)
+           {
+             *p = c;
+             *sp = string;
+             *ep = p;
+             return 1;
+           }
+         *p = c;
+#if 1
+         /* If MLEN != -1, we have a fixed length pattern. */
+         if (mlen != -1)
+           break;
+#endif
+       }
+
+      return (0);
+
+    case MATCH_END:
+#if 0
+      for (p = string; p <= end; p++)
+#else
+      for (p = end - ((mlen == -1) ? len : mlen); p <= end; p++)
+#endif
+       {
+         if (strmatch (pat, p, FNMATCH_EXTFLAG) == 0)
+           {
+             *sp = p;
+             *ep = end;
+             return 1;
+           }
+#if 1
+         /* If MLEN != -1, we have a fixed length pattern. */
+         if (mlen != -1)
+           break;
+#endif
+       }
+
+      return (0);
+    }
+
+  return (0);
+}
+
+#if defined (HANDLE_MULTIBYTE)
+/* Match WPAT anywhere in WSTRING and return the match boundaries.
+   This returns 1 in case of a successful match, 0 otherwise.  Wide
+   character version. */
+static int
+match_wpattern (wstring, indices, wstrlen, wpat, mtype, sp, ep)
+     wchar_t *wstring;
+     char **indices;
+     size_t wstrlen;
+     wchar_t *wpat;
+     int mtype;
+     char **sp, **ep;
+{
+  wchar_t wc, *wp, *nwpat, *wp1;
+  size_t len;
+  int mlen;
+  int n, n1, n2, simple;
+
+  simple = (wpat[0] != L'\\' && wpat[0] != L'*' && wpat[0] != L'?' && wpat[0] != L'[');
+#if defined (EXTENDED_GLOB)
+  if (extended_glob)
+    simple &= (wpat[1] != L'(' || (wpat[0] != L'*' && wpat[0] != L'?' && wpat[0] != L'+' && wpat[0] != L'!' && wpat[0] != L'@')); /*)*/
+#endif
+
+  /* If the pattern doesn't match anywhere in the string, go ahead and
+     short-circuit right away.  A minor optimization, saves a bunch of
+     unnecessary calls to strmatch (up to N calls for a string of N
+     characters) if the match is unsuccessful.  To preserve the semantics
+     of the substring matches below, we make sure that the pattern has
+     `*' as first and last character, making a new pattern if necessary. */
+  len = wcslen (wpat);
+  if (wpat[0] != L'*' || (wpat[0] == L'*' && wpat[1] == WLPAREN && extended_glob) || wpat[len - 1] != L'*')
+    {
+      wp = nwpat = (wchar_t *)xmalloc ((len + 3) * sizeof (wchar_t));
+      wp1 = wpat;
+      if (*wp1 != L'*' || (*wp1 == '*' && wp1[1] == WLPAREN && extended_glob))
+       *wp++ = L'*';
+      while (*wp1 != L'\0')
+       *wp++ = *wp1++;
+      if (wp1[-1] != L'*' || wp1[-2] == L'\\')
+        *wp++ = L'*';
+      *wp = '\0';
+    }
+  else
+    nwpat = wpat;
+  len = wcsmatch (nwpat, wstring, FNMATCH_EXTFLAG);
+  if (nwpat != wpat)
+    free (nwpat);
+  if (len == FNM_NOMATCH)
+    return (0);
+
+  mlen = wmatchlen (wpat, wstrlen);
+
+/* itrace("wmatchlen (%ls) -> %d", wpat, mlen); */
+  switch (mtype)
+    {
+    case MATCH_ANY:
+      for (n = 0; n <= wstrlen; n++)
+       {
+#if 1
+         n2 = simple ? (*wpat == wstring[n]) : match_pattern_wchar (wpat, wstring + n);
+#else
+         n2 = match_pattern_wchar (wpat, wstring + n);
+#endif
+         if (n2)
+           {
+#if 0
+             for (n1 = wstrlen; n1 >= n; n1--)
+#else
+             n1 = (mlen == -1) ? wstrlen : n + mlen;
+             if (n1 > wstrlen)
+               break;
+
+             for ( ; n1 >= n; n1--)
+#endif
+               {
+                 wc = wstring[n1]; wstring[n1] = L'\0';
+                 if (wcsmatch (wpat, wstring + n, FNMATCH_EXTFLAG) == 0)
+                   {
+                     wstring[n1] = wc;
+                     *sp = indices[n];
+                     *ep = indices[n1];
+                     return 1;
+                   }
+                 wstring[n1] = wc;
+#if 1
+                 /* If MLEN != -1, we have a fixed length pattern. */
+                 if (mlen != -1)
+                   break;
+#endif
+               }
+           }
+       }
+
+      return (0);
+
+    case MATCH_BEG:
+      if (match_pattern_wchar (wpat, wstring) == 0)
+       return (0);
+
+#if 0
+      for (n = wstrlen; n >= 0; n--)
+#else
+      for (n = (mlen == -1) ? wstrlen : mlen; n >= 0; n--)
+#endif
+       {
+         wc = wstring[n]; wstring[n] = L'\0';
+         if (wcsmatch (wpat, wstring, FNMATCH_EXTFLAG) == 0)
+           {
+             wstring[n] = wc;
+             *sp = indices[0];
+             *ep = indices[n];
+             return 1;
+           }
+         wstring[n] = wc;
+#if 1
+         /* If MLEN != -1, we have a fixed length pattern. */
+         if (mlen != -1)
+           break;
+#endif
+       }
+
+      return (0);
+
+    case MATCH_END:
+#if 0
+      for (n = 0; n <= wstrlen; n++)
+#else
+      for (n = wstrlen - ((mlen == -1) ? wstrlen : mlen); n <= wstrlen; n++)
+#endif
+       {
+         if (wcsmatch (wpat, wstring + n, FNMATCH_EXTFLAG) == 0)
+           {
+             *sp = indices[n];
+             *ep = indices[wstrlen];
+             return 1;
+           }
+#if 1
+         /* If MLEN != -1, we have a fixed length pattern. */
+         if (mlen != -1)
+           break;
+#endif
+       }
+
+      return (0);
+    }
+
+  return (0);
+}
+#endif /* HANDLE_MULTIBYTE */
+
+static int
+match_pattern (string, pat, mtype, sp, ep)
+     char *string, *pat;
+     int mtype;
+     char **sp, **ep;
+{
+#if defined (HANDLE_MULTIBYTE)
+  int ret;
+  size_t n;
+  wchar_t *wstring, *wpat;
+  char **indices;
+  size_t slen, plen, mslen, mplen;
+#endif
+
+  if (string == 0 || *string == 0 || pat == 0 || *pat == 0)
+    return (0);
+
+#if defined (HANDLE_MULTIBYTE)
+  if (MB_CUR_MAX > 1)
+    {
+#if 0
+      slen = STRLEN (string);
+      mslen = MBSLEN (string);
+      plen = STRLEN (pat);
+      mplen = MBSLEN (pat);
+      if (slen == mslen && plen == mplen)
+#else
+      if (mbsmbchar (string) == 0 && mbsmbchar (pat) == 0)
+#endif
+        return (match_upattern (string, pat, mtype, sp, ep));
+
+      n = xdupmbstowcs (&wpat, NULL, pat);
+      if (n == (size_t)-1)
+       return (match_upattern (string, pat, mtype, sp, ep));
+      n = xdupmbstowcs (&wstring, &indices, string);
+      if (n == (size_t)-1)
+       {
+         free (wpat);
+         return (match_upattern (string, pat, mtype, sp, ep));
+       }
+      ret = match_wpattern (wstring, indices, n, wpat, mtype, sp, ep);
+
+      free (wpat);
+      free (wstring);
+      free (indices);
+
+      return (ret);
+    }
+  else
+#endif
+    return (match_upattern (string, pat, mtype, sp, ep));
+}
+
+static int
+getpatspec (c, value)
+     int c;
+     char *value;
+{
+  if (c == '#')
+    return ((*value == '#') ? RP_LONG_LEFT : RP_SHORT_LEFT);
+  else /* c == '%' */
+    return ((*value == '%') ? RP_LONG_RIGHT : RP_SHORT_RIGHT);
+}
+
+/* Posix.2 says that the WORD should be run through tilde expansion,
+   parameter expansion, command substitution and arithmetic expansion.
+   This leaves the result quoted, so quote_string_for_globbing () has
+   to be called to fix it up for strmatch ().  If QUOTED is non-zero,
+   it means that the entire expression was enclosed in double quotes.
+   This means that quoting characters in the pattern do not make any
+   special pattern characters quoted.  For example, the `*' in the
+   following retains its special meaning: "${foo#'*'}". */
+static char *
+getpattern (value, quoted, expandpat)
+     char *value;
+     int quoted, expandpat;
+{
+  char *pat, *tword;
+  WORD_LIST *l;
+#if 0
+  int i;
+#endif
+  /* There is a problem here:  how to handle single or double quotes in the
+     pattern string when the whole expression is between double quotes?
+     POSIX.2 says that enclosing double quotes do not cause the pattern to
+     be quoted, but does that leave us a problem with @ and array[@] and their
+     expansions inside a pattern? */
+#if 0
+  if (expandpat && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && *tword)
+    {
+      i = 0;
+      pat = string_extract_double_quoted (tword, &i, 1);
+      free (tword);
+      tword = pat;
+    }
+#endif
+
+  /* expand_string_for_rhs () leaves WORD quoted and does not perform
+     word splitting. */
+  l = *value ? expand_string_for_rhs (value,
+                                     (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) ? Q_PATQUOTE : quoted,
+                                     (int *)NULL, (int *)NULL)
+            : (WORD_LIST *)0;
+  pat = string_list (l);
+  dispose_words (l);
+  if (pat)
+    {
+      tword = quote_string_for_globbing (pat, QGLOB_CVTNULL);
+      free (pat);
+      pat = tword;
+    }
+  return (pat);
+}
+
+#if 0
+/* Handle removing a pattern from a string as a result of ${name%[%]value}
+   or ${name#[#]value}. */
+static char *
+variable_remove_pattern (value, pattern, patspec, quoted)
+     char *value, *pattern;
+     int patspec, quoted;
+{
+  char *tword;
+
+  tword = remove_pattern (value, pattern, patspec);
+
+  return (tword);
+}
+#endif
+
+static char *
+list_remove_pattern (list, pattern, patspec, itype, quoted)
+     WORD_LIST *list;
+     char *pattern;
+     int patspec, itype, quoted;
+{
+  WORD_LIST *new, *l;
+  WORD_DESC *w;
+  char *tword;
+
+  for (new = (WORD_LIST *)NULL, l = list; l; l = l->next)
+    {
+      tword = remove_pattern (l->word->word, pattern, patspec);
+      w = alloc_word_desc ();
+      w->word = tword ? tword : savestring ("");
+      new = make_word_list (w, new);
+    }
+
+  l = REVERSE_LIST (new, WORD_LIST *);
+  tword = string_list_pos_params (itype, l, quoted);
+  dispose_words (l);
+
+  return (tword);
+}
+
+static char *
+parameter_list_remove_pattern (itype, pattern, patspec, quoted)
+     int itype;
+     char *pattern;
+     int patspec, quoted;
+{
+  char *ret;
+  WORD_LIST *list;
+
+  list = list_rest_of_args ();
+  if (list == 0)
+    return ((char *)NULL);
+  ret = list_remove_pattern (list, pattern, patspec, itype, quoted);
+  dispose_words (list);
+  return (ret);
+}
+
+#if defined (ARRAY_VARS)
+static char *
+array_remove_pattern (var, pattern, patspec, varname, quoted)
+     SHELL_VAR *var;
+     char *pattern;
+     int patspec;
+     char *varname;    /* so we can figure out how it's indexed */
+     int quoted;
+{
+  ARRAY *a;
+  HASH_TABLE *h;
+  int itype;
+  char *ret;
+  WORD_LIST *list;
+  SHELL_VAR *v;
+
+  /* compute itype from varname here */
+  v = array_variable_part (varname, &ret, 0);
+  itype = ret[0];
+
+  a = (v && array_p (v)) ? array_cell (v) : 0;
+  h = (v && assoc_p (v)) ? assoc_cell (v) : 0;
+  
+  list = a ? array_to_word_list (a) : (h ? assoc_to_word_list (h) : 0);
+  if (list == 0)
+   return ((char *)NULL);
+  ret = list_remove_pattern (list, pattern, patspec, itype, quoted);
+  dispose_words (list);
+
+  return ret;
+}
+#endif /* ARRAY_VARS */
+
+static char *
+parameter_brace_remove_pattern (varname, value, ind, patstr, rtype, quoted, flags)
+     char *varname, *value;
+     int ind;
+     char *patstr;
+     int rtype, quoted, flags;
+{
+  int vtype, patspec, starsub;
+  char *temp1, *val, *pattern;
+  SHELL_VAR *v;
+
+  if (value == 0)
+    return ((char *)NULL);
+
+  this_command_name = varname;
+
+  vtype = get_var_and_type (varname, value, ind, quoted, flags, &v, &val);
+  if (vtype == -1)
+    return ((char *)NULL);
+
+  starsub = vtype & VT_STARSUB;
+  vtype &= ~VT_STARSUB;
+
+  patspec = getpatspec (rtype, patstr);
+  if (patspec == RP_LONG_LEFT || patspec == RP_LONG_RIGHT)
+    patstr++;
+
+  /* Need to pass getpattern newly-allocated memory in case of expansion --
+     the expansion code will free the passed string on an error. */
+  temp1 = savestring (patstr);
+  pattern = getpattern (temp1, quoted, 1);
+  free (temp1);
+
+  temp1 = (char *)NULL;                /* shut up gcc */
+  switch (vtype)
+    {
+    case VT_VARIABLE:
+    case VT_ARRAYMEMBER:
+      temp1 = remove_pattern (val, pattern, patspec);
+      if (vtype == VT_VARIABLE)
+       FREE (val);
+      if (temp1)
+       {
+         val = (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
+                       ? quote_string (temp1)
+                       : quote_escapes (temp1);
+         free (temp1);
+         temp1 = val;
+       }
+      break;
+#if defined (ARRAY_VARS)
+    case VT_ARRAYVAR:
+      temp1 = array_remove_pattern (v, pattern, patspec, varname, quoted);
+      if (temp1 && ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) == 0))
+       {
+         val = quote_escapes (temp1);
+         free (temp1);
+         temp1 = val;
+       }
+      break;
+#endif
+    case VT_POSPARMS:
+      temp1 = parameter_list_remove_pattern (varname[0], pattern, patspec, quoted);
+      if (temp1 && ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) == 0))
+       {
+         val = quote_escapes (temp1);
+         free (temp1);
+         temp1 = val;
+       }
+      break;
+    }
+
+  FREE (pattern);
+  return temp1;
+}    
+
+/*******************************************
+ *                                        *
+ *     Functions to expand WORD_DESCs     *
+ *                                        *
+ *******************************************/
+
+/* Expand WORD, performing word splitting on the result.  This does
+   parameter expansion, command substitution, arithmetic expansion,
+   word splitting, and quote removal. */
+
+WORD_LIST *
+expand_word (word, quoted)
+     WORD_DESC *word;
+     int quoted;
+{
+  WORD_LIST *result, *tresult;
+
+  tresult = call_expand_word_internal (word, quoted, 0, (int *)NULL, (int *)NULL);
+  result = word_list_split (tresult);
+  dispose_words (tresult);
+  return (result ? dequote_list (result) : result);
+}
+
+/* Expand WORD, but do not perform word splitting on the result.  This
+   does parameter expansion, command substitution, arithmetic expansion,
+   and quote removal. */
+WORD_LIST *
+expand_word_unsplit (word, quoted)
+     WORD_DESC *word;
+     int quoted;
+{
+  WORD_LIST *result;
+
+  expand_no_split_dollar_star = 1;
+#if defined (HANDLE_MULTIBYTE)
+  if (ifs_firstc[0] == 0)
+#else
+  if (ifs_firstc == 0)
+#endif
+    word->flags |= W_NOSPLIT;
+  word->flags |= W_NOSPLIT2;
+  result = call_expand_word_internal (word, quoted, 0, (int *)NULL, (int *)NULL);
+  expand_no_split_dollar_star = 0;
+
+  return (result ? dequote_list (result) : result);
+}
+
+/* Perform shell expansions on WORD, but do not perform word splitting or
+   quote removal on the result.  Virtually identical to expand_word_unsplit;
+   could be combined if implementations don't diverge. */
+WORD_LIST *
+expand_word_leave_quoted (word, quoted)
+     WORD_DESC *word;
+     int quoted;
+{
+  WORD_LIST *result;
+
+  expand_no_split_dollar_star = 1;
+#if defined (HANDLE_MULTIBYTE)
+  if (ifs_firstc[0] == 0)
+#else
+  if (ifs_firstc == 0)
+#endif
+    word->flags |= W_NOSPLIT;
+  word->flags |= W_NOSPLIT2;
+  result = call_expand_word_internal (word, quoted, 0, (int *)NULL, (int *)NULL);
+  expand_no_split_dollar_star = 0;
+
+  return result;
+}
+
+#if defined (PROCESS_SUBSTITUTION)
+
+/*****************************************************************/
+/*                                                              */
+/*                 Hacking Process Substitution                 */
+/*                                                              */
+/*****************************************************************/
+
+#if !defined (HAVE_DEV_FD)
+/* Named pipes must be removed explicitly with `unlink'.  This keeps a list
+   of FIFOs the shell has open.  unlink_fifo_list will walk the list and
+   unlink all of them. add_fifo_list adds the name of an open FIFO to the
+   list.  NFIFO is a count of the number of FIFOs in the list. */
+#define FIFO_INCR 20
+
+struct temp_fifo {
+  char *file;
+  pid_t proc;
+};
+
+static struct temp_fifo *fifo_list = (struct temp_fifo *)NULL;
+static int nfifo;
+static int fifo_list_size;
+
+char *
+copy_fifo_list (sizep)
+     int *sizep;
+{
+  if (sizep)
+    *sizep = 0;
+  return (char *)NULL;
+}
+
+static void
+add_fifo_list (pathname)
+     char *pathname;
+{
+  if (nfifo >= fifo_list_size - 1)
+    {
+      fifo_list_size += FIFO_INCR;
+      fifo_list = (struct temp_fifo *)xrealloc (fifo_list,
+                               fifo_list_size * sizeof (struct temp_fifo));
+    }
+
+  fifo_list[nfifo].file = savestring (pathname);
+  nfifo++;
+}
+
+void
+unlink_fifo (i)
+     int i;
+{
+  if ((fifo_list[i].proc == -1) || (kill(fifo_list[i].proc, 0) == -1))
+    {
+      unlink (fifo_list[i].file);
+      free (fifo_list[i].file);
+      fifo_list[i].file = (char *)NULL;
+      fifo_list[i].proc = -1;
+    }
+}
+
+void
+unlink_fifo_list ()
+{
+  int saved, i, j;
+
+  if (nfifo == 0)
+    return;
+
+  for (i = saved = 0; i < nfifo; i++)
+    {
+      if ((fifo_list[i].proc == -1) || (kill(fifo_list[i].proc, 0) == -1))
+       {
+         unlink (fifo_list[i].file);
+         free (fifo_list[i].file);
+         fifo_list[i].file = (char *)NULL;
+         fifo_list[i].proc = -1;
+       }
+      else
+       saved++;
+    }
+
+  /* If we didn't remove some of the FIFOs, compact the list. */
+  if (saved)
+    {
+      for (i = j = 0; i < nfifo; i++)
+       if (fifo_list[i].file)
+         {
+           fifo_list[j].file = fifo_list[i].file;
+           fifo_list[j].proc = fifo_list[i].proc;
+           j++;
+         }
+      nfifo = j;
+    }
+  else
+    nfifo = 0;
+}
+
+/* Take LIST, which is a bitmap denoting active FIFOs in fifo_list
+   from some point in the past, and close all open FIFOs in fifo_list
+   that are not marked as active in LIST.  If LIST is NULL, close
+   everything in fifo_list. LSIZE is the number of elements in LIST, in
+   case it's larger than fifo_list_size (size of fifo_list). */
+void
+close_new_fifos (list, lsize)
+     char *list;
+     int lsize;
+{
+  int i;
+
+  if (list == 0)
+    {
+      unlink_fifo_list ();
+      return;
+    }
+
+  for (i = 0; i < lsize; i++)
+    if (list[i] == 0 && i < fifo_list_size && fifo_list[i].proc != -1)
+      unlink_fifo (i);
+
+  for (i = lsize; i < fifo_list_size; i++)
+    unlink_fifo (i);  
+}
+
+int
+fifos_pending ()
+{
+  return nfifo;
+}
+
+int
+num_fifos ()
+{
+  return nfifo;
+}
+
+static char *
+make_named_pipe ()
+{
+  char *tname;
+
+  tname = sh_mktmpname ("sh-np", MT_USERANDOM|MT_USETMPDIR);
+  if (mkfifo (tname, 0600) < 0)
+    {
+      free (tname);
+      return ((char *)NULL);
+    }
+
+  add_fifo_list (tname);
+  return (tname);
+}
+
+#else /* HAVE_DEV_FD */
+
+/* DEV_FD_LIST is a bitmap of file descriptors attached to pipes the shell
+   has open to children.  NFDS is a count of the number of bits currently
+   set in DEV_FD_LIST.  TOTFDS is a count of the highest possible number
+   of open files. */
+static char *dev_fd_list = (char *)NULL;
+static int nfds;
+static int totfds;     /* The highest possible number of open files. */
+
+char *
+copy_fifo_list (sizep)
+     int *sizep;
+{
+  char *ret;
+
+  if (nfds == 0 || totfds == 0)
+    {
+      if (sizep)
+       *sizep = 0;
+      return (char *)NULL;
+    }
+
+  if (sizep)
+    *sizep = totfds;
+  ret = (char *)xmalloc (totfds);
+  return (memcpy (ret, dev_fd_list, totfds));
+}
+
+static void
+add_fifo_list (fd)
+     int fd;
+{
+  if (dev_fd_list == 0 || fd >= totfds)
+    {
+      int ofds;
+
+      ofds = totfds;
+      totfds = getdtablesize ();
+      if (totfds < 0 || totfds > 256)
+       totfds = 256;
+      if (fd >= totfds)
+       totfds = fd + 2;
+
+      dev_fd_list = (char *)xrealloc (dev_fd_list, totfds);
+      memset (dev_fd_list + ofds, '\0', totfds - ofds);
+    }
+
+  dev_fd_list[fd] = 1;
+  nfds++;
+}
+
+int
+fifos_pending ()
+{
+  return 0;    /* used for cleanup; not needed with /dev/fd */
+}
+
+int
+num_fifos ()
+{
+  return nfds;
+}
+
+void
+unlink_fifo (fd)
+     int fd;
+{
+  if (dev_fd_list[fd])
+    {
+      close (fd);
+      dev_fd_list[fd] = 0;
+      nfds--;
+    }
+}
+
+void
+unlink_fifo_list ()
+{
+  register int i;
+
+  if (nfds == 0)
+    return;
+
+  for (i = 0; nfds && i < totfds; i++)
+    unlink_fifo (i);
+
+  nfds = 0;
+}
+
+/* Take LIST, which is a snapshot copy of dev_fd_list from some point in
+   the past, and close all open fds in dev_fd_list that are not marked
+   as open in LIST.  If LIST is NULL, close everything in dev_fd_list.
+   LSIZE is the number of elements in LIST, in case it's larger than
+   totfds (size of dev_fd_list). */
+void
+close_new_fifos (list, lsize)
+     char *list;
+     int lsize;
+{
+  int i;
+
+  if (list == 0)
+    {
+      unlink_fifo_list ();
+      return;
+    }
+
+  for (i = 0; i < lsize; i++)
+    if (list[i] == 0 && i < totfds && dev_fd_list[i])
+      unlink_fifo (i);
+
+  for (i = lsize; i < totfds; i++)
+    unlink_fifo (i);  
+}
+
+#if defined (NOTDEF)
+print_dev_fd_list ()
+{
+  register int i;
+
+  fprintf (stderr, "pid %ld: dev_fd_list:", (long)getpid ());
+  fflush (stderr);
+
+  for (i = 0; i < totfds; i++)
+    {
+      if (dev_fd_list[i])
+       fprintf (stderr, " %d", i);
+    }
+  fprintf (stderr, "\n");
+}
+#endif /* NOTDEF */
+
+static char *
+make_dev_fd_filename (fd)
+     int fd;
+{
+  char *ret, intbuf[INT_STRLEN_BOUND (int) + 1], *p;
+
+  ret = (char *)xmalloc (sizeof (DEV_FD_PREFIX) + 8);
+
+  strcpy (ret, DEV_FD_PREFIX);
+  p = inttostr (fd, intbuf, sizeof (intbuf));
+  strcpy (ret + sizeof (DEV_FD_PREFIX) - 1, p);
+
+  add_fifo_list (fd);
+  return (ret);
+}
+
+#endif /* HAVE_DEV_FD */
+
+/* Return a filename that will open a connection to the process defined by
+   executing STRING.  HAVE_DEV_FD, if defined, means open a pipe and return
+   a filename in /dev/fd corresponding to a descriptor that is one of the
+   ends of the pipe.  If not defined, we use named pipes on systems that have
+   them.  Systems without /dev/fd and named pipes are out of luck.
+
+   OPEN_FOR_READ_IN_CHILD, if 1, means open the named pipe for reading or
+   use the read end of the pipe and dup that file descriptor to fd 0 in
+   the child.  If OPEN_FOR_READ_IN_CHILD is 0, we open the named pipe for
+   writing or use the write end of the pipe in the child, and dup that
+   file descriptor to fd 1 in the child.  The parent does the opposite. */
+
+static char *
+process_substitute (string, open_for_read_in_child)
+     char *string;
+     int open_for_read_in_child;
+{
+  char *pathname;
+  int fd, result;
+  pid_t old_pid, pid;
+#if defined (HAVE_DEV_FD)
+  int parent_pipe_fd, child_pipe_fd;
+  int fildes[2];
+#endif /* HAVE_DEV_FD */
+#if defined (JOB_CONTROL)
+  pid_t old_pipeline_pgrp;
+#endif
+
+  if (!string || !*string || wordexp_only)
+    return ((char *)NULL);
+
+#if !defined (HAVE_DEV_FD)
+  pathname = make_named_pipe ();
+#else /* HAVE_DEV_FD */
+  if (pipe (fildes) < 0)
+    {
+      sys_error (_("cannot make pipe for process substitution"));
+      return ((char *)NULL);
+    }
+  /* If OPEN_FOR_READ_IN_CHILD == 1, we want to use the write end of
+     the pipe in the parent, otherwise the read end. */
+  parent_pipe_fd = fildes[open_for_read_in_child];
+  child_pipe_fd = fildes[1 - open_for_read_in_child];
+  /* Move the parent end of the pipe to some high file descriptor, to
+     avoid clashes with FDs used by the script. */
+  parent_pipe_fd = move_to_high_fd (parent_pipe_fd, 1, 64);
+
+  pathname = make_dev_fd_filename (parent_pipe_fd);
+#endif /* HAVE_DEV_FD */
+
+  if (pathname == 0)
+    {
+      sys_error (_("cannot make pipe for process substitution"));
+      return ((char *)NULL);
+    }
+
+  old_pid = last_made_pid;
+
+#if defined (JOB_CONTROL)
+  old_pipeline_pgrp = pipeline_pgrp;
+  pipeline_pgrp = shell_pgrp;
+  save_pipeline (1);
+#endif /* JOB_CONTROL */
+
+  pid = make_child ((char *)NULL, 1);
+  if (pid == 0)
+    {
+      reset_terminating_signals ();    /* XXX */
+      free_pushed_string_input ();
+      /* Cancel traps, in trap.c. */
+      restore_original_signals ();     /* XXX - what about special builtins? bash-4.2 */
+      setup_async_signals ();
+      subshell_environment |= SUBSHELL_COMSUB|SUBSHELL_PROCSUB;
+    }
+
+#if defined (JOB_CONTROL)
+  set_sigchld_handler ();
+  stop_making_children ();
+  /* XXX - should we only do this in the parent? (as in command subst) */
+  pipeline_pgrp = old_pipeline_pgrp;
+#endif /* JOB_CONTROL */
+
+  if (pid < 0)
+    {
+      sys_error (_("cannot make child for process substitution"));
+      free (pathname);
+#if defined (HAVE_DEV_FD)
+      close (parent_pipe_fd);
+      close (child_pipe_fd);
+#endif /* HAVE_DEV_FD */
+      return ((char *)NULL);
+    }
+
+  if (pid > 0)
+    {
+#if defined (JOB_CONTROL)
+      restore_pipeline (1);
+#endif
+
+#if !defined (HAVE_DEV_FD)
+      fifo_list[nfifo-1].proc = pid;
+#endif
+
+      last_made_pid = old_pid;
+
+#if defined (JOB_CONTROL) && defined (PGRP_PIPE)
+      close_pgrp_pipe ();
+#endif /* JOB_CONTROL && PGRP_PIPE */
+
+#if defined (HAVE_DEV_FD)
+      close (child_pipe_fd);
+#endif /* HAVE_DEV_FD */
+
+      return (pathname);
+    }
+
+  set_sigint_handler ();
+
+#if defined (JOB_CONTROL)
+  set_job_control (0);
+#endif /* JOB_CONTROL */
+
+#if !defined (HAVE_DEV_FD)
+  /* Open the named pipe in the child. */
+  fd = open (pathname, open_for_read_in_child ? O_RDONLY|O_NONBLOCK : O_WRONLY);
+  if (fd < 0)
+    {
+      /* Two separate strings for ease of translation. */
+      if (open_for_read_in_child)
+       sys_error (_("cannot open named pipe %s for reading"), pathname);
+      else
+       sys_error (_("cannot open named pipe %s for writing"), pathname);
+
+      exit (127);
+    }
+  if (open_for_read_in_child)
+    {
+      if (sh_unset_nodelay_mode (fd) < 0)
+       {
+         sys_error (_("cannot reset nodelay mode for fd %d"), fd);
+         exit (127);
+       }
+    }
+#else /* HAVE_DEV_FD */
+  fd = child_pipe_fd;
+#endif /* HAVE_DEV_FD */
+
+  if (dup2 (fd, open_for_read_in_child ? 0 : 1) < 0)
+    {
+      sys_error (_("cannot duplicate named pipe %s as fd %d"), pathname,
+       open_for_read_in_child ? 0 : 1);
+      exit (127);
+    }
+
+  if (fd != (open_for_read_in_child ? 0 : 1))
+    close (fd);
+
+  /* Need to close any files that this process has open to pipes inherited
+     from its parent. */
+  if (current_fds_to_close)
+    {
+      close_fd_bitmap (current_fds_to_close);
+      current_fds_to_close = (struct fd_bitmap *)NULL;
+    }
+
+#if defined (HAVE_DEV_FD)
+  /* Make sure we close the parent's end of the pipe and clear the slot
+     in the fd list so it is not closed later, if reallocated by, for
+     instance, pipe(2). */
+  close (parent_pipe_fd);
+  dev_fd_list[parent_pipe_fd] = 0;
+#endif /* HAVE_DEV_FD */
+
+  result = parse_and_execute (string, "process substitution", (SEVAL_NONINT|SEVAL_NOHIST));
+
+#if !defined (HAVE_DEV_FD)
+  /* Make sure we close the named pipe in the child before we exit. */
+  close (open_for_read_in_child ? 0 : 1);
+#endif /* !HAVE_DEV_FD */
+
+  exit (result);
+  /*NOTREACHED*/
+}
+#endif /* PROCESS_SUBSTITUTION */
+
+/***********************************/
+/*                                */
+/*     Command Substitution       */
+/*                                */
+/***********************************/
+
+static char *
+read_comsub (fd, quoted, rflag)
+     int fd, quoted;
+     int *rflag;
+{
+  char *istring, buf[128], *bufp, *s;
+  int istring_index, istring_size, c, tflag, skip_ctlesc, skip_ctlnul;
+  ssize_t bufn;
+
+  istring = (char *)NULL;
+  istring_index = istring_size = bufn = tflag = 0;
+
+  for (skip_ctlesc = skip_ctlnul = 0, s = ifs_value; s && *s; s++)
+    skip_ctlesc |= *s == CTLESC, skip_ctlnul |= *s == CTLNUL;
+
+  /* Read the output of the command through the pipe.  This may need to be
+     changed to understand multibyte characters in the future. */
+  while (1)
+    {
+      if (fd < 0)
+       break;
+      if (--bufn <= 0)
+       {
+         bufn = zread (fd, buf, sizeof (buf));
+         if (bufn <= 0) 
+           break;
+         bufp = buf;
+       }
+      c = *bufp++;
+
+      if (c == 0)
+       {
+#if 0
+         internal_warning ("read_comsub: ignored null byte in input");
+#endif
+         continue;
+       }
+
+      /* Add the character to ISTRING, possibly after resizing it. */
+      RESIZE_MALLOCED_BUFFER (istring, istring_index, 2, istring_size, DEFAULT_ARRAY_SIZE);
+
+      /* This is essentially quote_string inline */
+      if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) /* || c == CTLESC || c == CTLNUL */)
+       istring[istring_index++] = CTLESC;
+      /* Escape CTLESC and CTLNUL in the output to protect those characters
+        from the rest of the word expansions (word splitting and globbing.)
+        This is essentially quote_escapes inline. */
+      else if (skip_ctlesc == 0 && c == CTLESC)
+       {
+         tflag |= W_HASCTLESC;
+         istring[istring_index++] = CTLESC;
+       }
+      else if ((skip_ctlnul == 0 && c == CTLNUL) || (c == ' ' && (ifs_value && *ifs_value == 0)))
+       istring[istring_index++] = CTLESC;
+
+      istring[istring_index++] = c;
+
+#if 0
+#if defined (__CYGWIN__)
+      if (c == '\n' && istring_index > 1 && istring[istring_index - 2] == '\r')
+       {
+         istring_index--;
+         istring[istring_index - 1] = '\n';
+       }
+#endif
+#endif
+    }
+
+  if (istring)
+    istring[istring_index] = '\0';
+
+  /* If we read no output, just return now and save ourselves some
+     trouble. */
+  if (istring_index == 0)
+    {
+      FREE (istring);
+      if (rflag)
+       *rflag = tflag;
+      return (char *)NULL;
+    }
+
+  /* Strip trailing newlines from the output of the command. */
+  if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
+    {
+      while (istring_index > 0)
+       {
+         if (istring[istring_index - 1] == '\n')
+           {
+             --istring_index;
+
+             /* If the newline was quoted, remove the quoting char. */
+             if (istring[istring_index - 1] == CTLESC)
+               --istring_index;
+           }
+         else
+           break;
+       }
+      istring[istring_index] = '\0';
+    }
+  else
+    strip_trailing (istring, istring_index - 1, 1);
+
+  if (rflag)
+    *rflag = tflag;
+  return istring;
+}
+
+/* Perform command substitution on STRING.  This returns a WORD_DESC * with the
+   contained string possibly quoted. */
+WORD_DESC *
+command_substitute (string, quoted)
+     char *string;
+     int quoted;
+{
+  pid_t pid, old_pid, old_pipeline_pgrp, old_async_pid;
+  char *istring;
+  int result, fildes[2], function_value, pflags, rc, tflag;
+  WORD_DESC *ret;
+
+  istring = (char *)NULL;
+
+  /* Don't fork () if there is no need to.  In the case of no command to
+     run, just return NULL. */
+  if (!string || !*string || (string[0] == '\n' && !string[1]))
+    return ((WORD_DESC *)NULL);
+
+  if (wordexp_only && read_but_dont_execute)
+    {
+      last_command_exit_value = EX_WEXPCOMSUB;
+      jump_to_top_level (EXITPROG);
+    }
+
+  /* We're making the assumption here that the command substitution will
+     eventually run a command from the file system.  Since we'll run
+     maybe_make_export_env in this subshell before executing that command,
+     the parent shell and any other shells it starts will have to remake
+     the environment.  If we make it before we fork, other shells won't
+     have to.  Don't bother if we have any temporary variable assignments,
+     though, because the export environment will be remade after this
+     command completes anyway, but do it if all the words to be expanded
+     are variable assignments. */
+  if (subst_assign_varlist == 0 || garglist == 0)
+    maybe_make_export_env ();  /* XXX */
+
+  /* Flags to pass to parse_and_execute() */
+  pflags = (interactive && sourcelevel == 0) ? SEVAL_RESETLINE : 0;
+
+  /* Pipe the output of executing STRING into the current shell. */
+  if (pipe (fildes) < 0)
+    {
+      sys_error (_("cannot make pipe for command substitution"));
+      goto error_exit;
+    }
+
+  old_pid = last_made_pid;
+#if defined (JOB_CONTROL)
+  old_pipeline_pgrp = pipeline_pgrp;
+  /* Don't reset the pipeline pgrp if we're already a subshell in a pipeline. */
+  if ((subshell_environment & SUBSHELL_PIPE) == 0)
+    pipeline_pgrp = shell_pgrp;
+  cleanup_the_pipeline ();
+#endif /* JOB_CONTROL */
+
+  old_async_pid = last_asynchronous_pid;
+  pid = make_child ((char *)NULL, subshell_environment&SUBSHELL_ASYNC);
+  last_asynchronous_pid = old_async_pid;
+
+  if (pid == 0)
+    {
+      /* Reset the signal handlers in the child, but don't free the
+        trap strings.  Set a flag noting that we have to free the
+        trap strings if we run trap to change a signal disposition. */
+      reset_signal_handlers ();
+      subshell_environment |= SUBSHELL_RESETTRAP;
+    }
+
+#if defined (JOB_CONTROL)
+  /* XXX DO THIS ONLY IN PARENT ? XXX */
+  set_sigchld_handler ();
+  stop_making_children ();
+  if (pid != 0)
+    pipeline_pgrp = old_pipeline_pgrp;
+#else
+  stop_making_children ();
+#endif /* JOB_CONTROL */
+
+  if (pid < 0)
+    {
+      sys_error (_("cannot make child for command substitution"));
+    error_exit:
+
+      last_made_pid = old_pid;
+
+      FREE (istring);
+      close (fildes[0]);
+      close (fildes[1]);
+      return ((WORD_DESC *)NULL);
+    }
+
+  if (pid == 0)
+    {
+      set_sigint_handler ();   /* XXX */
+
+      free_pushed_string_input ();
+
+      if (dup2 (fildes[1], 1) < 0)
+       {
+         sys_error (_("command_substitute: cannot duplicate pipe as fd 1"));
+         exit (EXECUTION_FAILURE);
+       }
+
+      /* If standard output is closed in the parent shell
+        (such as after `exec >&-'), file descriptor 1 will be
+        the lowest available file descriptor, and end up in
+        fildes[0].  This can happen for stdin and stderr as well,
+        but stdout is more important -- it will cause no output
+        to be generated from this command. */
+      if ((fildes[1] != fileno (stdin)) &&
+         (fildes[1] != fileno (stdout)) &&
+         (fildes[1] != fileno (stderr)))
+       close (fildes[1]);
+
+      if ((fildes[0] != fileno (stdin)) &&
+         (fildes[0] != fileno (stdout)) &&
+         (fildes[0] != fileno (stderr)))
+       close (fildes[0]);
+
+#ifdef __CYGWIN__
+      /* Let stdio know the fd may have changed from text to binary mode, and
+        make sure to preserve stdout line buffering. */
+      freopen (NULL, "w", stdout);
+      sh_setlinebuf (stdout);
+#endif /* __CYGWIN__ */
+
+      /* The currently executing shell is not interactive. */
+      interactive = 0;
+
+      /* This is a subshell environment. */
+      subshell_environment |= SUBSHELL_COMSUB;
+
+      /* When not in POSIX mode, command substitution does not inherit
+        the -e flag. */
+      if (posixly_correct == 0)
+       exit_immediately_on_error = 0;
+
+      remove_quoted_escapes (string);
+
+      startup_state = 2;       /* see if we can avoid a fork */
+      /* Give command substitution a place to jump back to on failure,
+        so we don't go back up to main (). */
+      result = setjmp (top_level);
+
+      /* If we're running a command substitution inside a shell function,
+        trap `return' so we don't return from the function in the subshell
+        and go off to never-never land. */
+      if (result == 0 && return_catch_flag)
+       function_value = setjmp (return_catch);
+      else
+       function_value = 0;
+
+      if (result == ERREXIT)
+       rc = last_command_exit_value;
+      else if (result == EXITPROG)
+       rc = last_command_exit_value;
+      else if (result)
+       rc = EXECUTION_FAILURE;
+      else if (function_value)
+       rc = return_catch_value;
+      else
+       {
+         subshell_level++;
+         rc = parse_and_execute (string, "command substitution", pflags|SEVAL_NOHIST);
+         subshell_level--;
+       }
+
+      last_command_exit_value = rc;
+      rc = run_exit_trap ();
+#if defined (PROCESS_SUBSTITUTION)
+      unlink_fifo_list ();
+#endif
+      exit (rc);
+    }
+  else
+    {
+#if defined (JOB_CONTROL) && defined (PGRP_PIPE)
+      close_pgrp_pipe ();
+#endif /* JOB_CONTROL && PGRP_PIPE */
+
+      close (fildes[1]);
+
+      tflag = 0;
+      istring = read_comsub (fildes[0], quoted, &tflag);
+
+      close (fildes[0]);
+
+      current_command_subst_pid = pid;
+      last_command_exit_value = wait_for (pid);
+      last_command_subst_pid = pid;
+      last_made_pid = old_pid;
+
+#if defined (JOB_CONTROL)
+      /* If last_command_exit_value > 128, then the substituted command
+        was terminated by a signal.  If that signal was SIGINT, then send
+        SIGINT to ourselves.  This will break out of loops, for instance. */
+      if (last_command_exit_value == (128 + SIGINT) && last_command_exit_signal == SIGINT)
+       kill (getpid (), SIGINT);
+
+      /* wait_for gives the terminal back to shell_pgrp.  If some other
+        process group should have it, give it away to that group here.
+        pipeline_pgrp is non-zero only while we are constructing a
+        pipline, so what we are concerned about is whether or not that
+        pipeline was started in the background.  A pipeline started in
+        the background should never get the tty back here. */
+      if (interactive && pipeline_pgrp != (pid_t)0 && (subshell_environment & SUBSHELL_ASYNC) == 0)
+       give_terminal_to (pipeline_pgrp, 0);
+#endif /* JOB_CONTROL */
+
+      ret = alloc_word_desc ();
+      ret->word = istring;
+      ret->flags = tflag;
+
+      return ret;
+    }
+}
+
+/********************************************************
+ *                                                     *
+ *     Utility functions for parameter expansion       *
+ *                                                     *
+ ********************************************************/
+
+#if defined (ARRAY_VARS)
+
+static arrayind_t
+array_length_reference (s)
+     char *s;
+{
+  int len;
+  arrayind_t ind;
+  char *akey;
+  char *t, c;
+  ARRAY *array;
+  HASH_TABLE *h;
+  SHELL_VAR *var;
+
+  var = array_variable_part (s, &t, &len);
+
+  /* If unbound variables should generate an error, report one and return
+     failure. */
+  if ((var == 0 || (assoc_p (var) == 0 && array_p (var) == 0)) && unbound_vars_is_error)
+    {
+      c = *--t;
+      *t = '\0';
+      last_command_exit_value = EXECUTION_FAILURE;
+      err_unboundvar (s);
+      *t = c;
+      return (-1);
+    }
+  else if (var == 0)
+    return 0;
+
+  /* We support a couple of expansions for variables that are not arrays.
+     We'll return the length of the value for v[0], and 1 for v[@] or
+     v[*].  Return 0 for everything else. */
+
+  array = array_p (var) ? array_cell (var) : (ARRAY *)NULL;
+  h = assoc_p (var) ? assoc_cell (var) : (HASH_TABLE *)NULL;
+
+  if (ALL_ELEMENT_SUB (t[0]) && t[1] == ']')
+    {
+      if (assoc_p (var))
+       return (h ? assoc_num_elements (h) : 0);
+      else if (array_p (var))
+       return (array ? array_num_elements (array) : 0);
+      else
+       return (var_isset (var) ? 1 : 0);
+    }
+
+  if (assoc_p (var))
+    {
+      t[len - 1] = '\0';
+      akey = expand_assignment_string_to_string (t, 0);        /* [ */
+      t[len - 1] = ']';
+      if (akey == 0 || *akey == 0)
+       {
+         err_badarraysub (t);
+         FREE (akey);
+         return (-1);
+       }
+      t = assoc_reference (assoc_cell (var), akey);
+      free (akey);
+    }
+  else
+    {
+      ind = array_expand_index (var, t, len);
+      /* negative subscripts to indexed arrays count back from end */
+      if (var && array_p (var) && ind < 0)
+       ind = array_max_index (array_cell (var)) + 1 + ind;
+      if (ind < 0)
+       {
+         err_badarraysub (t);
+         return (-1);
+       }
+      if (array_p (var))
+       t = array_reference (array, ind);
+      else
+       t = (ind == 0) ? value_cell (var) : (char *)NULL;
+    }
+
+  len = MB_STRLEN (t);
+  return (len);
+}
+#endif /* ARRAY_VARS */
+
+static int
+valid_brace_expansion_word (name, var_is_special)
+     char *name;
+     int var_is_special;
+{
+  if (DIGIT (*name) && all_digits (name))
+    return 1;
+  else if (var_is_special)
+    return 1;
+#if defined (ARRAY_VARS)
+  else if (valid_array_reference (name))
+    return 1;
+#endif /* ARRAY_VARS */
+  else if (legal_identifier (name))
+    return 1;
+  else
+    return 0;
+}
+
+static int
+chk_atstar (name, quoted, quoted_dollar_atp, contains_dollar_at)
+     char *name;
+     int quoted;
+     int *quoted_dollar_atp, *contains_dollar_at;
+{
+  char *temp1;
+
+  if (name == 0)
+    {
+      if (quoted_dollar_atp)
+       *quoted_dollar_atp = 0;
+      if (contains_dollar_at)
+       *contains_dollar_at = 0;
+      return 0;
+    }
+
+  /* check for $@ and $* */
+  if (name[0] == '@' && name[1] == 0)
+    {
+      if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && quoted_dollar_atp)
+       *quoted_dollar_atp = 1;
+      if (contains_dollar_at)
+       *contains_dollar_at = 1;
+      return 1;
+    }
+  else if (name[0] == '*' && name[1] == '\0' && quoted == 0)
+    {
+      if (contains_dollar_at)
+       *contains_dollar_at = 1;
+      return 1;
+    }
+
+  /* Now check for ${array[@]} and ${array[*]} */
+#if defined (ARRAY_VARS)
+  else if (valid_array_reference (name))
+    {
+      temp1 = mbschr (name, '[');
+      if (temp1 && temp1[1] == '@' && temp1[2] == ']')
+       {
+         if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && quoted_dollar_atp)
+           *quoted_dollar_atp = 1;
+         if (contains_dollar_at)
+           *contains_dollar_at = 1;
+         return 1;
+       }       /* [ */
+      /* ${array[*]}, when unquoted, should be treated like ${array[@]},
+        which should result in separate words even when IFS is unset. */
+      if (temp1 && temp1[1] == '*' && temp1[2] == ']' && quoted == 0)
+       {
+         if (contains_dollar_at)
+           *contains_dollar_at = 1;
+         return 1;
+       }
+    }
+#endif
+  return 0;
+}
+
+/* Parameter expand NAME, and return a new string which is the expansion,
+   or NULL if there was no expansion.
+   VAR_IS_SPECIAL is non-zero if NAME is one of the special variables in
+   the shell, e.g., "@", "$", "*", etc.  QUOTED, if non-zero, means that
+   NAME was found inside of a double-quoted expression. */
+static WORD_DESC *
+parameter_brace_expand_word (name, var_is_special, quoted, pflags, indp)
+     char *name;
+     int var_is_special, quoted, pflags;
+     arrayind_t *indp;
+{
+  WORD_DESC *ret;
+  char *temp, *tt;
+  intmax_t arg_index;
+  SHELL_VAR *var;
+  int atype, rflags;
+  arrayind_t ind;
+
+  ret = 0;
+  temp = 0;
+  rflags = 0;
+
+  if (indp)
+    *indp = INTMAX_MIN;
+
+  /* Handle multiple digit arguments, as in ${11}. */  
+  if (legal_number (name, &arg_index))
+    {
+      tt = get_dollar_var_value (arg_index);
+      if (tt)
+       temp = (*tt && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)))
+                 ? quote_string (tt)
+                 : quote_escapes (tt);
+      else
+        temp = (char *)NULL;
+      FREE (tt);
+    }
+  else if (var_is_special)      /* ${@} */
+    {
+      int sindex;
+      tt = (char *)xmalloc (2 + strlen (name));
+      tt[sindex = 0] = '$';
+      strcpy (tt + 1, name);
+
+      ret = param_expand (tt, &sindex, quoted, (int *)NULL, (int *)NULL,
+                         (int *)NULL, (int *)NULL, pflags);
+      free (tt);
+    }
+#if defined (ARRAY_VARS)
+  else if (valid_array_reference (name))
+    {
+expand_arrayref:
+      /* XXX - does this leak if name[@] or name[*]? */
+      temp = array_value (name, quoted, 0, &atype, &ind);
+      if (atype == 0 && temp)
+       {
+         temp = (*temp && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)))
+                   ? quote_string (temp)
+                   : quote_escapes (temp);
+         rflags |= W_ARRAYIND;
+         if (indp)
+           *indp = ind;
+       }                 
+      else if (atype == 1 && temp && QUOTED_NULL (temp) && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)))
+       rflags |= W_HASQUOTEDNULL;
+    }
+#endif
+  else if (var = find_variable (name))
+    {
+      if (var_isset (var) && invisible_p (var) == 0)
+       {
+#if defined (ARRAY_VARS)
+         if (assoc_p (var))
+           temp = assoc_reference (assoc_cell (var), "0");
+         else if (array_p (var))
+           temp = array_reference (array_cell (var), 0);
+         else
+           temp = value_cell (var);
+#else
+         temp = value_cell (var);
+#endif
+
+         if (temp)
+           temp = (*temp && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)))
+                     ? quote_string (temp)
+                     : quote_escapes (temp);
+       }
+      else
+       temp = (char *)NULL;
+    }
+#if defined (ARRAY_VARS)
+  /* Handle expanding nameref whose value is x[n] */
+  else if (var = find_variable_last_nameref (name))
+    {
+      temp = nameref_cell (var);
+      if (temp && *temp && valid_array_reference (temp))
+       {
+         name = temp;
+         goto expand_arrayref;
+       }
+      temp = (char *)NULL;
+    }
+#endif
+  else
+    temp = (char *)NULL;
+
+  if (ret == 0)
+    {
+      ret = alloc_word_desc ();
+      ret->word = temp;
+      ret->flags |= rflags;
+    }
+  return ret;
+}
+
+/* Expand an indirect reference to a variable: ${!NAME} expands to the
+   value of the variable whose name is the value of NAME. */
+static WORD_DESC *
+parameter_brace_expand_indir (name, var_is_special, quoted, quoted_dollar_atp, contains_dollar_at)
+     char *name;
+     int var_is_special, quoted;
+     int *quoted_dollar_atp, *contains_dollar_at;
+{
+  char *temp, *t;
+  WORD_DESC *w;
+  SHELL_VAR *v;
+
+  /* See if it's a nameref first, behave in ksh93-compatible fashion.
+     There is at least one incompatibility: given ${!foo[0]} where foo=bar,
+     bash performs an indirect lookup on foo[0] and expands the result;
+     ksh93 expands bar[0].  We could do that here -- there are enough usable
+     primitives to do that -- but do not at this point. */
+  if (var_is_special == 0 && (v = find_variable_last_nameref (name)))
+    {
+      if (nameref_p (v) && (t = nameref_cell (v)) && *t)
+       {
+         w = alloc_word_desc ();
+         w->word = savestring (t);
+         w->flags = 0;
+         return w;
+       }
+    }
+
+  w = parameter_brace_expand_word (name, var_is_special, quoted, PF_IGNUNBOUND, 0);
+  t = w->word;
+  /* Have to dequote here if necessary */
+  if (t)
+    {
+      temp = (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))
+               ? dequote_string (t)
+               : dequote_escapes (t);
+      free (t);
+      t = temp;
+    }
+  dispose_word_desc (w);
+
+  chk_atstar (t, quoted, quoted_dollar_atp, contains_dollar_at);
+  if (t == 0)
+    return (WORD_DESC *)NULL;
+
+  w = parameter_brace_expand_word (t, SPECIAL_VAR(t, 0), quoted, 0, 0);
+  free (t);
+
+  return w;
+}
+
+/* Expand the right side of a parameter expansion of the form ${NAMEcVALUE},
+   depending on the value of C, the separating character.  C can be one of
+   "-", "+", or "=".  QUOTED is true if the entire brace expression occurs
+   between double quotes. */
+static WORD_DESC *
+parameter_brace_expand_rhs (name, value, c, quoted, qdollaratp, hasdollarat)
+     char *name, *value;
+     int c, quoted, *qdollaratp, *hasdollarat;
+{
+  WORD_DESC *w;
+  WORD_LIST *l;
+  char *t, *t1, *temp;
+  int hasdol;
+
+  /* If the entire expression is between double quotes, we want to treat
+     the value as a double-quoted string, with the exception that we strip
+     embedded unescaped double quotes (for sh backwards compatibility). */
+  if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && *value)
+    {
+      hasdol = 0;
+      temp = string_extract_double_quoted (value, &hasdol, 1);
+    }
+  else
+    temp = value;
+
+  w = alloc_word_desc ();
+  hasdol = 0;
+  /* XXX was 0 not quoted */
+  l = *temp ? expand_string_for_rhs (temp, quoted, &hasdol, (int *)NULL)
+           : (WORD_LIST *)0;
+  if (hasdollarat)
+    *hasdollarat = hasdol || (l && l->next);
+  if (temp != value)
+    free (temp);
+  if (l)
+    {
+      /* The expansion of TEMP returned something.  We need to treat things
+         slightly differently if HASDOL is non-zero.  If we have "$@", the
+         individual words have already been quoted.  We need to turn them
+         into a string with the words separated by the first character of
+         $IFS without any additional quoting, so string_list_dollar_at won't
+         do the right thing.  We use string_list_dollar_star instead. */
+      temp = (hasdol || l->next) ? string_list_dollar_star (l) : string_list (l);
+
+      /* If l->next is not null, we know that TEMP contained "$@", since that
+        is the only expansion that creates more than one word. */
+      if (qdollaratp && ((hasdol && quoted) || l->next))
+       *qdollaratp = 1;
+      /* If we have a quoted null result (QUOTED_NULL(temp)) and the word is
+        a quoted null (l->next == 0 && QUOTED_NULL(l->word->word)), the
+        flags indicate it (l->word->flags & W_HASQUOTEDNULL), and the
+        expansion is quoted (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
+        (which is more paranoia than anything else), we need to return the
+        quoted null string and set the flags to indicate it. */
+      if (l->next == 0 && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && QUOTED_NULL (temp) && QUOTED_NULL (l->word->word) && (l->word->flags & W_HASQUOTEDNULL))
+       {
+         w->flags |= W_HASQUOTEDNULL;
+       }
+      dispose_words (l);
+    }
+  else if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && hasdol)
+    {
+      /* The brace expansion occurred between double quotes and there was
+        a $@ in TEMP.  It does not matter if the $@ is quoted, as long as
+        it does not expand to anything.  In this case, we want to return
+        a quoted empty string. */
+      temp = make_quoted_char ('\0');
+      w->flags |= W_HASQUOTEDNULL;
+    }
+  else
+    temp = (char *)NULL;
+
+  if (c == '-' || c == '+')
+    {
+      w->word = temp;
+      return w;
+    }
+
+  /* c == '=' */
+  t = temp ? savestring (temp) : savestring ("");
+  t1 = dequote_string (t);
+  free (t);
+#if defined (ARRAY_VARS)
+  if (valid_array_reference (name))
+    assign_array_element (name, t1, 0);
+  else
+#endif /* ARRAY_VARS */
+  bind_variable (name, t1, 0);
+
+  /* From Posix group discussion Feb-March 2010.  Issue 7 0000221 */
+  free (temp);
+
+  w->word = t1;
+  return w;
+}
+
+/* Deal with the right hand side of a ${name:?value} expansion in the case
+   that NAME is null or not set.  If VALUE is non-null it is expanded and
+   used as the error message to print, otherwise a standard message is
+   printed. */
+static void
+parameter_brace_expand_error (name, value)
+     char *name, *value;
+{
+  WORD_LIST *l;
+  char *temp;
+
+  last_command_exit_value = EXECUTION_FAILURE; /* ensure it's non-zero */
+  if (value && *value)
+    {
+      l = expand_string (value, 0);
+      temp =  string_list (l);
+      report_error ("%s: %s", name, temp ? temp : ""); /* XXX was value not "" */
+      FREE (temp);
+      dispose_words (l);
+    }
+  else
+    report_error (_("%s: parameter null or not set"), name);
+
+  /* Free the data we have allocated during this expansion, since we
+     are about to longjmp out. */
+  free (name);
+  FREE (value);
+}
+
+/* Return 1 if NAME is something for which parameter_brace_expand_length is
+   OK to do. */
+static int
+valid_length_expression (name)
+     char *name;
+{
+  return (name[1] == '\0' ||                                   /* ${#} */
+         ((sh_syntaxtab[(unsigned char) name[1]] & CSPECVAR) && name[2] == '\0') ||  /* special param */
+         (DIGIT (name[1]) && all_digits (name + 1)) || /* ${#11} */
+#if defined (ARRAY_VARS)
+         valid_array_reference (name + 1) ||                   /* ${#a[7]} */
+#endif
+         legal_identifier (name + 1));                         /* ${#PS1} */
+}
+
+/* Handle the parameter brace expansion that requires us to return the
+   length of a parameter. */
+static intmax_t
+parameter_brace_expand_length (name)
+     char *name;
+{
+  char *t, *newname;
+  intmax_t number, arg_index;
+  WORD_LIST *list;
+#if defined (ARRAY_VARS)
+  SHELL_VAR *var;
+#endif
+
+  if (name[1] == '\0')                 /* ${#} */
+    number = number_of_args ();
+  else if ((name[1] == '@' || name[1] == '*') && name[2] == '\0')      /* ${#@}, ${#*} */
+    number = number_of_args ();
+  else if ((sh_syntaxtab[(unsigned char) name[1]] & CSPECVAR) && name[2] == '\0')
+    {
+      /* Take the lengths of some of the shell's special parameters. */
+      switch (name[1])
+       {
+       case '-':
+         t = which_set_flags ();
+         break;
+       case '?':
+         t = itos (last_command_exit_value);
+         break;
+       case '$':
+         t = itos (dollar_dollar_pid);
+         break;
+       case '!':
+         if (last_asynchronous_pid == NO_PID)
+           t = (char *)NULL;   /* XXX - error if set -u set? */
+         else
+           t = itos (last_asynchronous_pid);
+         break;
+       case '#':
+         t = itos (number_of_args ());
+         break;
+       }
+      number = STRLEN (t);
+      FREE (t);
+    }
+#if defined (ARRAY_VARS)
+  else if (valid_array_reference (name + 1))
+    number = array_length_reference (name + 1);
+#endif /* ARRAY_VARS */
+  else
+    {
+      number = 0;
+
+      if (legal_number (name + 1, &arg_index))         /* ${#1} */
+       {
+         t = get_dollar_var_value (arg_index);
+         if (t == 0 && unbound_vars_is_error)
+           return INTMAX_MIN;
+         number = MB_STRLEN (t);
+         FREE (t);
+       }
+#if defined (ARRAY_VARS)
+      else if ((var = find_variable (name + 1)) && (invisible_p (var) == 0) && (array_p (var) || assoc_p (var)))
+       {
+         if (assoc_p (var))
+           t = assoc_reference (assoc_cell (var), "0");
+         else
+           t = array_reference (array_cell (var), 0);
+         if (t == 0 && unbound_vars_is_error)
+           return INTMAX_MIN;
+         number = MB_STRLEN (t);
+       }
+#endif
+      else                             /* ${#PS1} */
+       {
+         newname = savestring (name);
+         newname[0] = '$';
+         list = expand_string (newname, Q_DOUBLE_QUOTES);
+         t = list ? string_list (list) : (char *)NULL;
+         free (newname);
+         if (list)
+           dispose_words (list);
+
+         number = t ? MB_STRLEN (t) : 0;
+         FREE (t);
+       }
+    }
+
+  return (number);
+}
+
+/* Skip characters in SUBSTR until DELIM.  SUBSTR is an arithmetic expression,
+   so we do some ad-hoc parsing of an arithmetic expression to find
+   the first DELIM, instead of using strchr(3).  Two rules:
+       1.  If the substring contains a `(', read until closing `)'.
+       2.  If the substring contains a `?', read past one `:' for each `?'.
+*/
+
+static char *
+skiparith (substr, delim)
+     char *substr;
+     int delim;
+{
+  size_t sublen;
+  int skipcol, pcount, i;
+  DECLARE_MBSTATE;
+
+  sublen = strlen (substr);
+  i = skipcol = pcount = 0;
+  while (substr[i])
+    {
+      /* Balance parens */
+      if (substr[i] == LPAREN)
+       {
+         pcount++;
+         i++;
+         continue;
+       }
+      if (substr[i] == RPAREN && pcount)
+       {
+         pcount--;
+         i++;
+         continue;
+       }
+      if (pcount)
+       {
+         ADVANCE_CHAR (substr, sublen, i);
+         continue;
+       }
+
+      /* Skip one `:' for each `?' */
+      if (substr[i] == ':' && skipcol)
+       {
+         skipcol--;
+         i++;
+         continue;
+       }
+      if (substr[i] == delim)
+       break;
+      if (substr[i] == '?')
+       {
+         skipcol++;
+         i++;
+         continue;
+       }
+      ADVANCE_CHAR (substr, sublen, i);
+    }
+
+  return (substr + i);
+}
+
+/* Verify and limit the start and end of the desired substring.  If
+   VTYPE == 0, a regular shell variable is being used; if it is 1,
+   then the positional parameters are being used; if it is 2, then
+   VALUE is really a pointer to an array variable that should be used.
+   Return value is 1 if both values were OK, 0 if there was a problem
+   with an invalid expression, or -1 if the values were out of range. */
+static int
+verify_substring_values (v, value, substr, vtype, e1p, e2p)
+     SHELL_VAR *v;
+     char *value, *substr;
+     int vtype;
+     intmax_t *e1p, *e2p;
+{
+  char *t, *temp1, *temp2;
+  arrayind_t len;
+  int expok;
+#if defined (ARRAY_VARS)
+ ARRAY *a;
+ HASH_TABLE *h;
+#endif
+
+  /* duplicate behavior of strchr(3) */
+  t = skiparith (substr, ':');
+  if (*t && *t == ':')
+    *t = '\0';
+  else
+    t = (char *)0;
+
+  temp1 = expand_arith_string (substr, Q_DOUBLE_QUOTES);
+  *e1p = evalexp (temp1, &expok);
+  free (temp1);
+  if (expok == 0)
+    return (0);
+
+  len = -1;    /* paranoia */
+  switch (vtype)
+    {
+    case VT_VARIABLE:
+    case VT_ARRAYMEMBER:
+      len = MB_STRLEN (value);
+      break;
+    case VT_POSPARMS:
+      len = number_of_args () + 1;
+      if (*e1p == 0)
+       len++;          /* add one arg if counting from $0 */
+      break;
+#if defined (ARRAY_VARS)
+    case VT_ARRAYVAR:
+      /* For arrays, the first value deals with array indices.  Negative
+        offsets count from one past the array's maximum index.  Associative
+        arrays treat the number of elements as the maximum index. */
+      if (assoc_p (v))
+       {
+         h = assoc_cell (v);
+         len = assoc_num_elements (h) + (*e1p < 0);
+       }
+      else
+       {
+         a = (ARRAY *)value;
+         len = array_max_index (a) + (*e1p < 0);       /* arrays index from 0 to n - 1 */
+       }
+      break;
+#endif
+    }
+
+  if (len == -1)       /* paranoia */
+    return -1;
+
+  if (*e1p < 0)                /* negative offsets count from end */
+    *e1p += len;
+
+  if (*e1p > len || *e1p < 0)
+    return (-1);
+
+#if defined (ARRAY_VARS)
+  /* For arrays, the second offset deals with the number of elements. */
+  if (vtype == VT_ARRAYVAR)
+    len = assoc_p (v) ? assoc_num_elements (h) : array_num_elements (a);
+#endif
+
+  if (t)
+    {
+      t++;
+      temp2 = savestring (t);
+      temp1 = expand_arith_string (temp2, Q_DOUBLE_QUOTES);
+      free (temp2);
+      t[-1] = ':';
+      *e2p = evalexp (temp1, &expok);
+      free (temp1);
+      if (expok == 0)
+       return (0);
+#if 1
+      if ((vtype == VT_ARRAYVAR || vtype == VT_POSPARMS) && *e2p < 0)
+#else
+      /* bash-4.3: allow positional parameter length < 0 to count backwards
+        from end of positional parameters */
+      if (vtype == VT_ARRAYVAR && *e2p < 0)
+#endif
+       {
+         internal_error (_("%s: substring expression < 0"), t);
+         return (0);
+       }
+#if defined (ARRAY_VARS)
+      /* In order to deal with sparse arrays, push the intelligence about how
+        to deal with the number of elements desired down to the array-
+        specific functions.  */
+      if (vtype != VT_ARRAYVAR)
+#endif
+       {
+         if (*e2p < 0)
+           {
+             *e2p += len;
+             if (*e2p < 0 || *e2p < *e1p)
+               {
+                 internal_error (_("%s: substring expression < 0"), t);
+                 return (0);
+               }
+           }
+         else
+           *e2p += *e1p;               /* want E2 chars starting at E1 */
+         if (*e2p > len)
+           *e2p = len;
+       }
+    }
+  else
+    *e2p = len;
+
+  return (1);
+}
+
+/* Return the type of variable specified by VARNAME (simple variable,
+   positional param, or array variable).  Also return the value specified
+   by VARNAME (value of a variable or a reference to an array element).
+   QUOTED is the standard description of quoting state, using Q_* defines.
+   FLAGS is currently a set of flags to pass to array_value.  If IND is
+   non-null and not INTMAX_MIN, and FLAGS includes AV_USEIND, IND is
+   passed to array_value so the array index is not computed again.
+   If this returns VT_VARIABLE, the caller assumes that CTLESC and CTLNUL
+   characters in the value are quoted with CTLESC and takes appropriate
+   steps.  For convenience, *VALP is set to the dequoted VALUE. */
+static int
+get_var_and_type (varname, value, ind, quoted, flags, varp, valp)
+     char *varname, *value;
+     arrayind_t ind;
+     int quoted, flags;
+     SHELL_VAR **varp;
+     char **valp;
+{
+  int vtype;
+  char *temp;
+#if defined (ARRAY_VARS)
+  SHELL_VAR *v;
+#endif
+  arrayind_t lind;
+
+  /* This sets vtype to VT_VARIABLE or VT_POSPARMS */
+  vtype = (varname[0] == '@' || varname[0] == '*') && varname[1] == '\0';
+  if (vtype == VT_POSPARMS && varname[0] == '*')
+    vtype |= VT_STARSUB;
+  *varp = (SHELL_VAR *)NULL;
+
+#if defined (ARRAY_VARS)
+  if (valid_array_reference (varname))
+    {
+      v = array_variable_part (varname, &temp, (int *)0);
+      /* If we want to signal array_value to use an already-computed index,
+        set LIND to that index */
+      lind = (ind != INTMAX_MIN && (flags & AV_USEIND)) ? ind : 0;
+      if (v && (array_p (v) || assoc_p (v)))
+       { /* [ */
+         if (ALL_ELEMENT_SUB (temp[0]) && temp[1] == ']')
+           {
+             /* Callers have to differentiate betwen indexed and associative */
+             vtype = VT_ARRAYVAR;
+             if (temp[0] == '*')
+               vtype |= VT_STARSUB;
+             *valp = array_p (v) ? (char *)array_cell (v) : (char *)assoc_cell (v);
+           }
+         else
+           {
+             vtype = VT_ARRAYMEMBER;
+             *valp = array_value (varname, Q_DOUBLE_QUOTES, flags, (int *)NULL, &lind);
+           }
+         *varp = v;
+       }
+      else if (v && (ALL_ELEMENT_SUB (temp[0]) && temp[1] == ']'))
+       {
+         vtype = VT_VARIABLE;
+         *varp = v;
+         if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))
+           *valp = dequote_string (value);
+         else
+           *valp = dequote_escapes (value);
+       }
+      else
+       {
+         vtype = VT_ARRAYMEMBER;
+         *varp = v;
+         *valp = array_value (varname, Q_DOUBLE_QUOTES, flags, (int *)NULL, &lind);
+       }
+    }
+  else if ((v = find_variable (varname)) && (invisible_p (v) == 0) && (assoc_p (v) || array_p (v)))
+    {
+      vtype = VT_ARRAYMEMBER;
+      *varp = v;
+      *valp = assoc_p (v) ? assoc_reference (assoc_cell (v), "0") : array_reference (array_cell (v), 0);
+    }
+  else
+#endif
+    {
+      if (value && vtype == VT_VARIABLE)
+       {
+         if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))
+           *valp = dequote_string (value);
+         else
+           *valp = dequote_escapes (value);
+       }
+      else
+       *valp = value;
+    }
+
+  return vtype;
+}
+
+/******************************************************/
+/*                                                   */
+/* Functions to extract substrings of variable values */
+/*                                                   */
+/******************************************************/
+
+#if defined (HANDLE_MULTIBYTE)
+/* Character-oriented rather than strictly byte-oriented substrings.  S and
+   E, rather being strict indices into STRING, indicate character (possibly
+   multibyte character) positions that require calculation.
+   Used by the ${param:offset[:length]} expansion. */
+static char *
+mb_substring (string, s, e)
+     char *string;
+     int s, e;
+{
+  char *tt;
+  int start, stop, i, slen;
+  DECLARE_MBSTATE;
+
+  start = 0;
+  /* Don't need string length in ADVANCE_CHAR unless multibyte chars possible. */
+  slen = (MB_CUR_MAX > 1) ? STRLEN (string) : 0;
+
+  i = s;
+  while (string[start] && i--)
+    ADVANCE_CHAR (string, slen, start);
+  stop = start;
+  i = e - s;
+  while (string[stop] && i--)
+    ADVANCE_CHAR (string, slen, stop);
+  tt = substring (string, start, stop);
+  return tt;
+}
+#endif
+  
+/* Process a variable substring expansion: ${name:e1[:e2]}.  If VARNAME
+   is `@', use the positional parameters; otherwise, use the value of
+   VARNAME.  If VARNAME is an array variable, use the array elements. */
+
+static char *
+parameter_brace_substring (varname, value, ind, substr, quoted, flags)
+     char *varname, *value;
+     int ind;
+     char *substr;
+     int quoted, flags;
+{
+  intmax_t e1, e2;
+  int vtype, r, starsub;
+  char *temp, *val, *tt, *oname;
+  SHELL_VAR *v;
+
+  if (value == 0)
+    return ((char *)NULL);
+
+  oname = this_command_name;
+  this_command_name = varname;
+
+  vtype = get_var_and_type (varname, value, ind, quoted, flags, &v, &val);
+  if (vtype == -1)
+    {
+      this_command_name = oname;
+      return ((char *)NULL);
+    }
+
+  starsub = vtype & VT_STARSUB;
+  vtype &= ~VT_STARSUB;
+
+  r = verify_substring_values (v, val, substr, vtype, &e1, &e2);
+  this_command_name = oname;
+  if (r <= 0)
+    {
+      if (vtype == VT_VARIABLE)
+       FREE (val);
+      return ((r == 0) ? &expand_param_error : (char *)NULL);
+    }
+
+  switch (vtype)
+    {
+    case VT_VARIABLE:
+    case VT_ARRAYMEMBER:
+#if defined (HANDLE_MULTIBYTE)
+      if (MB_CUR_MAX > 1)
+       tt = mb_substring (val, e1, e2);
+      else
+#endif
+      tt = substring (val, e1, e2);
+
+      if (vtype == VT_VARIABLE)
+       FREE (val);
+      if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))
+       temp = quote_string (tt);
+      else
+       temp = tt ? quote_escapes (tt) : (char *)NULL;
+      FREE (tt);
+      break;
+    case VT_POSPARMS:
+      tt = pos_params (varname, e1, e2, quoted);
+      if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) == 0)
+       {
+         temp = tt ? quote_escapes (tt) : (char *)NULL;
+         FREE (tt);
+       }
+      else
+       temp = tt;
+      break;
+#if defined (ARRAY_VARS)
+    case VT_ARRAYVAR:
+      if (assoc_p (v))
+       /* we convert to list and take first e2 elements starting at e1th
+          element -- officially undefined for now */   
+       temp = assoc_subrange (assoc_cell (v), e1, e2, starsub, quoted);
+      else
+      /* We want E2 to be the number of elements desired (arrays can be sparse,
+        so verify_substring_values just returns the numbers specified and we
+        rely on array_subrange to understand how to deal with them). */
+       temp = array_subrange (array_cell (v), e1, e2, starsub, quoted);
+      /* array_subrange now calls array_quote_escapes as appropriate, so the
+        caller no longer needs to. */
+      break;
+#endif
+    default:
+      temp = (char *)NULL;
+    }
+
+  return temp;
+}
+
+/****************************************************************/
+/*                                                             */
+/* Functions to perform pattern substitution on variable values */
+/*                                                             */
+/****************************************************************/
+
+static int
+shouldexp_replacement (s)
+     char *s;
+{
+  register char *p;
+
+  for (p = s; p && *p; p++)
+    {
+      if (*p == '\\')
+       p++;
+      else if (*p == '&')
+       return 1;
+    }
+  return 0;
+}
+
+char *
+pat_subst (string, pat, rep, mflags)
+     char *string, *pat, *rep;
+     int mflags;
+{
+  char *ret, *s, *e, *str, *rstr, *mstr;
+  int rsize, rptr, l, replen, mtype, rxpand, rslen, mlen;
+
+  if (string  == 0)
+    return (savestring (""));
+
+  mtype = mflags & MATCH_TYPEMASK;
+
+#if 0  /* bash-4.2 ? */
+  rxpand = (rep && *rep) ? shouldexp_replacement (rep) : 0;
+#else
+  rxpand = 0;
+#endif
+
+  /* Special cases:
+   *   1.  A null pattern with mtype == MATCH_BEG means to prefix STRING
+   *       with REP and return the result.
+   *   2.  A null pattern with mtype == MATCH_END means to append REP to
+   *       STRING and return the result.
+   * These don't understand or process `&' in the replacement string.
+   */
+  if ((pat == 0 || *pat == 0) && (mtype == MATCH_BEG || mtype == MATCH_END))
+    {
+      replen = STRLEN (rep);
+      l = STRLEN (string);
+      ret = (char *)xmalloc (replen + l + 2);
+      if (replen == 0)
+       strcpy (ret, string);
+      else if (mtype == MATCH_BEG)
+       {
+         strcpy (ret, rep);
+         strcpy (ret + replen, string);
+       }
+      else
+       {
+         strcpy (ret, string);
+         strcpy (ret + l, rep);
+       }
+      return (ret);
+    }
+
+  ret = (char *)xmalloc (rsize = 64);
+  ret[0] = '\0';
+
+  for (replen = STRLEN (rep), rptr = 0, str = string;;)
+    {
+      if (match_pattern (str, pat, mtype, &s, &e) == 0)
+       break;
+      l = s - str;
+
+      if (rxpand)
+        {
+          int x;
+          mlen = e - s;
+          mstr = xmalloc (mlen + 1);
+         for (x = 0; x < mlen; x++)
+           mstr[x] = s[x];
+          mstr[mlen] = '\0';
+          rstr = strcreplace (rep, '&', mstr, 0);
+          rslen = strlen (rstr);
+        }
+      else
+        {
+          rstr = rep;
+          rslen = replen;
+        }
+        
+      RESIZE_MALLOCED_BUFFER (ret, rptr, (l + rslen), rsize, 64);
+
+      /* OK, now copy the leading unmatched portion of the string (from
+        str to s) to ret starting at rptr (the current offset).  Then copy
+        the replacement string at ret + rptr + (s - str).  Increment
+        rptr (if necessary) and str and go on. */
+      if (l)
+       {
+         strncpy (ret + rptr, str, l);
+         rptr += l;
+       }
+      if (replen)
+       {
+         strncpy (ret + rptr, rstr, rslen);
+         rptr += rslen;
+       }
+      str = e;         /* e == end of match */
+
+      if (rstr != rep)
+       free (rstr);
+
+      if (((mflags & MATCH_GLOBREP) == 0) || mtype != MATCH_ANY)
+       break;
+
+      if (s == e)
+       {
+         /* On a zero-length match, make sure we copy one character, since
+            we increment one character to avoid infinite recursion. */
+         RESIZE_MALLOCED_BUFFER (ret, rptr, 1, rsize, 64);
+         ret[rptr++] = *str++;
+         e++;          /* avoid infinite recursion on zero-length match */
+       }
+    }
+
+  /* Now copy the unmatched portion of the input string */
+  if (str && *str)
+    {
+      RESIZE_MALLOCED_BUFFER (ret, rptr, STRLEN(str) + 1, rsize, 64);
+      strcpy (ret + rptr, str);
+    }
+  else
+    ret[rptr] = '\0';
+
+  return ret;
+}
+
+/* Do pattern match and replacement on the positional parameters. */
+static char *
+pos_params_pat_subst (string, pat, rep, mflags)
+     char *string, *pat, *rep;
+     int mflags;
+{
+  WORD_LIST *save, *params;
+  WORD_DESC *w;
+  char *ret;
+  int pchar, qflags;
+
+  save = params = list_rest_of_args ();
+  if (save == 0)
+    return ((char *)NULL);
+
+  for ( ; params; params = params->next)
+    {
+      ret = pat_subst (params->word->word, pat, rep, mflags);
+      w = alloc_word_desc ();
+      w->word = ret ? ret : savestring ("");
+      dispose_word (params->word);
+      params->word = w;
+    }
+
+  pchar = (mflags & MATCH_STARSUB) == MATCH_STARSUB ? '*' : '@';
+  qflags = (mflags & MATCH_QUOTED) == MATCH_QUOTED ? Q_DOUBLE_QUOTES : 0;
+
+#if 0
+  if ((mflags & (MATCH_QUOTED|MATCH_STARSUB)) == (MATCH_QUOTED|MATCH_STARSUB))
+    ret = string_list_dollar_star (quote_list (save));
+  else if ((mflags & MATCH_STARSUB) == MATCH_STARSUB)
+    ret = string_list_dollar_star (save);
+  else if ((mflags & MATCH_QUOTED) == MATCH_QUOTED)
+    ret = string_list_dollar_at (save, qflags);
+  else
+    ret = string_list_dollar_star (save);
+#else
+  ret = string_list_pos_params (pchar, save, qflags);
+#endif
+
+  dispose_words (save);
+
+  return (ret);
+}
+
+/* Perform pattern substitution on VALUE, which is the expansion of
+   VARNAME.  PATSUB is an expression supplying the pattern to match
+   and the string to substitute.  QUOTED is a flags word containing
+   the type of quoting currently in effect. */
+static char *
+parameter_brace_patsub (varname, value, ind, patsub, quoted, flags)
+     char *varname, *value;
+     int ind;
+     char *patsub;
+     int quoted, flags;
+{
+  int vtype, mflags, starsub, delim;
+  char *val, *temp, *pat, *rep, *p, *lpatsub, *tt;
+  SHELL_VAR *v;
+
+  if (value == 0)
+    return ((char *)NULL);
+
+  this_command_name = varname;
+
+  vtype = get_var_and_type (varname, value, ind, quoted, flags, &v, &val);
+  if (vtype == -1)
+    return ((char *)NULL);
+
+  starsub = vtype & VT_STARSUB;
+  vtype &= ~VT_STARSUB;
+
+  mflags = 0;
+  /* PATSUB is never NULL when this is called. */
+  if (*patsub == '/')
+    {
+      mflags |= MATCH_GLOBREP;
+      patsub++;
+    }
+
+  /* Malloc this because expand_string_if_necessary or one of the expansion
+     functions in its call chain may free it on a substitution error. */
+  lpatsub = savestring (patsub);
+
+  if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
+    mflags |= MATCH_QUOTED;
+
+  if (starsub)
+    mflags |= MATCH_STARSUB;
+
+  /* If the pattern starts with a `/', make sure we skip over it when looking
+     for the replacement delimiter. */
+  delim = skip_to_delim (lpatsub, ((*patsub == '/') ? 1 : 0), "/", 0);
+  if (lpatsub[delim] == '/')
+    {
+      lpatsub[delim] = 0;
+      rep = lpatsub + delim + 1;
+    }
+  else
+    rep = (char *)NULL;
+
+  if (rep && *rep == '\0')
+    rep = (char *)NULL;
+
+  /* Perform the same expansions on the pattern as performed by the
+     pattern removal expansions. */
+  pat = getpattern (lpatsub, quoted, 1);
+
+  if (rep)
+    /* We want to perform quote removal on the expanded replacement even if
+       the entire expansion is double-quoted because the parser and string
+       extraction functions treated quotes in the replacement string as
+       special. */
+    rep = expand_string_if_necessary (rep, quoted & ~(Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT), expand_string_unsplit);
+
+  /* ksh93 doesn't allow the match specifier to be a part of the expanded
+     pattern.  This is an extension.  Make sure we don't anchor the pattern
+     at the beginning or end of the string if we're doing global replacement,
+     though. */
+  p = pat;
+  if (mflags & MATCH_GLOBREP)
+    mflags |= MATCH_ANY;
+  else if (pat && pat[0] == '#')
+    {
+      mflags |= MATCH_BEG;
+      p++;
+    }
+  else if (pat && pat[0] == '%')
+    {
+      mflags |= MATCH_END;
+      p++;
+    }
+  else
+    mflags |= MATCH_ANY;
+
+  /* OK, we now want to substitute REP for PAT in VAL.  If
+     flags & MATCH_GLOBREP is non-zero, the substitution is done
+     everywhere, otherwise only the first occurrence of PAT is
+     replaced.  The pattern matching code doesn't understand
+     CTLESC quoting CTLESC and CTLNUL so we use the dequoted variable
+     values passed in (VT_VARIABLE) so the pattern substitution
+     code works right.  We need to requote special chars after
+     we're done for VT_VARIABLE and VT_ARRAYMEMBER, and for the
+     other cases if QUOTED == 0, since the posparams and arrays
+     indexed by * or @ do special things when QUOTED != 0. */
+
+  switch (vtype)
+    {
+    case VT_VARIABLE:
+    case VT_ARRAYMEMBER:
+      temp = pat_subst (val, p, rep, mflags);
+      if (vtype == VT_VARIABLE)
+       FREE (val);
+      if (temp)
+       {
+         tt = (mflags & MATCH_QUOTED) ? quote_string (temp) : quote_escapes (temp);
+         free (temp);
+         temp = tt;
+       }
+      break;
+    case VT_POSPARMS:
+      temp = pos_params_pat_subst (val, p, rep, mflags);
+      if (temp && (mflags & MATCH_QUOTED) == 0)
+       {
+         tt = quote_escapes (temp);
+         free (temp);
+         temp = tt;
+       }
+      break;
+#if defined (ARRAY_VARS)
+    case VT_ARRAYVAR:
+      temp = assoc_p (v) ? assoc_patsub (assoc_cell (v), p, rep, mflags)
+                        : array_patsub (array_cell (v), p, rep, mflags);
+      /* Don't call quote_escapes anymore; array_patsub calls
+        array_quote_escapes as appropriate before adding the
+        space separators; ditto for assoc_patsub. */
+      break;
+#endif
+    }
+
+  FREE (pat);
+  FREE (rep);
+  free (lpatsub);
+
+  return temp;
+}
+
+/****************************************************************/
+/*                                                             */
+/*   Functions to perform case modification on variable values  */
+/*                                                             */
+/****************************************************************/
+
+/* Do case modification on the positional parameters. */
+
+static char *
+pos_params_modcase (string, pat, modop, mflags)
+     char *string, *pat;
+     int modop;
+     int mflags;
+{
+  WORD_LIST *save, *params;
+  WORD_DESC *w;
+  char *ret;
+  int pchar, qflags;
+
+  save = params = list_rest_of_args ();
+  if (save == 0)
+    return ((char *)NULL);
+
+  for ( ; params; params = params->next)
+    {
+      ret = sh_modcase (params->word->word, pat, modop);
+      w = alloc_word_desc ();
+      w->word = ret ? ret : savestring ("");
+      dispose_word (params->word);
+      params->word = w;
+    }
+
+  pchar = (mflags & MATCH_STARSUB) == MATCH_STARSUB ? '*' : '@';
+  qflags = (mflags & MATCH_QUOTED) == MATCH_QUOTED ? Q_DOUBLE_QUOTES : 0;
+
+  ret = string_list_pos_params (pchar, save, qflags);
+  dispose_words (save);
+
+  return (ret);
+}
+
+/* Perform case modification on VALUE, which is the expansion of
+   VARNAME.  MODSPEC is an expression supplying the type of modification
+   to perform.  QUOTED is a flags word containing the type of quoting
+   currently in effect. */
+static char *
+parameter_brace_casemod (varname, value, ind, modspec, patspec, quoted, flags)
+     char *varname, *value;
+     int ind, modspec;
+     char *patspec;
+     int quoted, flags;
+{
+  int vtype, starsub, modop, mflags, x;
+  char *val, *temp, *pat, *p, *lpat, *tt;
+  SHELL_VAR *v;
+
+  if (value == 0)
+    return ((char *)NULL);
+
+  this_command_name = varname;
+
+  vtype = get_var_and_type (varname, value, ind, quoted, flags, &v, &val);
+  if (vtype == -1)
+    return ((char *)NULL);
+
+  starsub = vtype & VT_STARSUB;
+  vtype &= ~VT_STARSUB;
+
+  modop = 0;
+  mflags = 0;
+  if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
+    mflags |= MATCH_QUOTED;
+  if (starsub)
+    mflags |= MATCH_STARSUB;
+  
+  p = patspec;
+  if (modspec == '^')
+    {
+      x = p && p[0] == modspec;
+      modop = x ? CASE_UPPER : CASE_UPFIRST;
+      p += x;
+    }
+  else if (modspec == ',')
+    {
+      x = p && p[0] == modspec;
+      modop = x ? CASE_LOWER : CASE_LOWFIRST;
+      p += x;
+    }
+  else if (modspec == '~')
+    {
+      x = p && p[0] == modspec;
+      modop = x ? CASE_TOGGLEALL : CASE_TOGGLE;
+      p += x;
+    }
+    
+  lpat = p ? savestring (p) : 0;
+  /* Perform the same expansions on the pattern as performed by the
+     pattern removal expansions.  FOR LATER */
+  pat = lpat ? getpattern (lpat, quoted, 1) : 0;
+
+  /* OK, now we do the case modification. */
+  switch (vtype)
+    {
+    case VT_VARIABLE:
+    case VT_ARRAYMEMBER:
+      temp = sh_modcase (val, pat, modop);
+      if (vtype == VT_VARIABLE)
+       FREE (val);
+      if (temp)
+       {
+         tt = (mflags & MATCH_QUOTED) ? quote_string (temp) : quote_escapes (temp);
+         free (temp);
+         temp = tt;
+       }
+      break;
+
+    case VT_POSPARMS:
+      temp = pos_params_modcase (val, pat, modop, mflags);
+      if (temp && (mflags & MATCH_QUOTED)  == 0)
+       {
+         tt = quote_escapes (temp);
+         free (temp);
+         temp = tt;
+       }
+      break;
+
+#if defined (ARRAY_VARS)
+    case VT_ARRAYVAR:
+      temp = assoc_p (v) ? assoc_modcase (assoc_cell (v), pat, modop, mflags)
+                        : array_modcase (array_cell (v), pat, modop, mflags);
+      /* Don't call quote_escapes; array_modcase calls array_quote_escapes
+        as appropriate before adding the space separators; ditto for
+        assoc_modcase. */
+      break;
+#endif
+    }
+
+  FREE (pat);
+  free (lpat);
+
+  return temp;
+}
+
+/* Check for unbalanced parens in S, which is the contents of $(( ... )).  If
+   any occur, this must be a nested command substitution, so return 0.
+   Otherwise, return 1.  A valid arithmetic expression must always have a
+   ( before a matching ), so any cases where there are more right parens
+   means that this must not be an arithmetic expression, though the parser
+   will not accept it without a balanced total number of parens. */
+static int
+chk_arithsub (s, len)
+     const char *s;
+     int len;
+{
+  int i, count;
+  DECLARE_MBSTATE;
+
+  i = count = 0;
+  while (i < len)
+    {
+      if (s[i] == LPAREN)
+       count++;
+      else if (s[i] == RPAREN)
+       {
+         count--;
+         if (count < 0)
+           return 0;
+       }
+
+      switch (s[i])
+       {
+       default:
+         ADVANCE_CHAR (s, len, i);
+         break;
+
+       case '\\':
+         i++;
+         if (s[i])
+           ADVANCE_CHAR (s, len, i);
+         break;
+
+       case '\'':
+         i = skip_single_quoted (s, len, ++i);
+         break;
+
+       case '"':
+         i = skip_double_quoted ((char *)s, len, ++i);
+         break;
+       }
+    }
+
+  return (count == 0);
+}
+
+/****************************************************************/
+/*                                                             */
+/*     Functions to perform parameter expansion on a string    */
+/*                                                             */
+/****************************************************************/
+
+/* ${[#][!]name[[:][^[^]][,[,]]#[#]%[%]-=?+[word][:e1[:e2]]]} */
+static WORD_DESC *
+parameter_brace_expand (string, indexp, quoted, pflags, quoted_dollar_atp, contains_dollar_at)
+     char *string;
+     int *indexp, quoted, *quoted_dollar_atp, *contains_dollar_at, pflags;
+{
+  int check_nullness, var_is_set, var_is_null, var_is_special;
+  int want_substring, want_indir, want_patsub, want_casemod;
+  char *name, *value, *temp, *temp1;
+  WORD_DESC *tdesc, *ret;
+  int t_index, sindex, c, tflag, modspec;
+  intmax_t number;
+  arrayind_t ind;
+
+  temp = temp1 = value = (char *)NULL;
+  var_is_set = var_is_null = var_is_special = check_nullness = 0;
+  want_substring = want_indir = want_patsub = want_casemod = 0;
+
+  sindex = *indexp;
+  t_index = ++sindex;
+  /* ${#var} doesn't have any of the other parameter expansions on it. */
+  if (string[t_index] == '#' && legal_variable_starter (string[t_index+1]))            /* {{ */
+    name = string_extract (string, &t_index, "}", SX_VARNAME);
+  else
+#if defined (CASEMOD_EXPANSIONS)
+    /* To enable case-toggling expansions using the `~' operator character
+       change the 1 to 0. */
+#  if defined (CASEMOD_CAPCASE)
+    name = string_extract (string, &t_index, "#%^,~:-=?+/}", SX_VARNAME);
+#  else
+    name = string_extract (string, &t_index, "#%^,:-=?+/}", SX_VARNAME);
+#  endif /* CASEMOD_CAPCASE */
+#else
+    name = string_extract (string, &t_index, "#%:-=?+/}", SX_VARNAME);
+#endif /* CASEMOD_EXPANSIONS */
+
+  ret = 0;
+  tflag = 0;
+
+  ind = INTMAX_MIN;
+
+  /* If the name really consists of a special variable, then make sure
+     that we have the entire name.  We don't allow indirect references
+     to special variables except `#', `?', `@' and `*'. */
+  if ((sindex == t_index && VALID_SPECIAL_LENGTH_PARAM (string[t_index])) ||
+      (sindex == t_index - 1 && string[sindex] == '!' && VALID_INDIR_PARAM (string[t_index])))
+    {
+      t_index++;
+      temp1 = string_extract (string, &t_index, "#%:-=?+/}", 0);
+      name = (char *)xrealloc (name, 3 + (strlen (temp1)));
+      *name = string[sindex];
+      if (string[sindex] == '!')
+       {
+         /* indirect reference of $#, $?, $@, or $* */
+         name[1] = string[sindex + 1];
+         strcpy (name + 2, temp1);
+       }
+      else     
+       strcpy (name + 1, temp1);
+      free (temp1);
+    }
+  sindex = t_index;
+
+  /* Find out what character ended the variable name.  Then
+     do the appropriate thing. */
+  if (c = string[sindex])
+    sindex++;
+
+  /* If c is followed by one of the valid parameter expansion
+     characters, move past it as normal.  If not, assume that
+     a substring specification is being given, and do not move
+     past it. */
+  if (c == ':' && VALID_PARAM_EXPAND_CHAR (string[sindex]))
+    {
+      check_nullness++;
+      if (c = string[sindex])
+       sindex++;
+    }
+  else if (c == ':' && string[sindex] != RBRACE)
+    want_substring = 1;
+  else if (c == '/' /* && string[sindex] != RBRACE */) /* XXX */
+    want_patsub = 1;
+#if defined (CASEMOD_EXPANSIONS)
+  else if (c == '^' || c == ',' || c == '~')
+    {
+      modspec = c;
+      want_casemod = 1;
+    }
+#endif
+
+  /* Catch the valid and invalid brace expressions that made it through the
+     tests above. */
+  /* ${#-} is a valid expansion and means to take the length of $-.
+     Similarly for ${#?} and ${##}... */
+  if (name[0] == '#' && name[1] == '\0' && check_nullness == 0 &&
+       VALID_SPECIAL_LENGTH_PARAM (c) && string[sindex] == RBRACE)
+    {
+      name = (char *)xrealloc (name, 3);
+      name[1] = c;
+      name[2] = '\0';
+      c = string[sindex++];
+    }
+
+  /* ...but ${#%}, ${#:}, ${#=}, ${#+}, and ${#/} are errors. */
+  if (name[0] == '#' && name[1] == '\0' && check_nullness == 0 &&
+       member (c, "%:=+/") && string[sindex] == RBRACE)
+    {
+      temp = (char *)NULL;
+      goto bad_substitution;
+    }
+
+  /* Indirect expansion begins with a `!'.  A valid indirect expansion is
+     either a variable name, one of the positional parameters or a special
+     variable that expands to one of the positional parameters. */
+  want_indir = *name == '!' &&
+    (legal_variable_starter ((unsigned char)name[1]) || DIGIT (name[1])
+                                       || VALID_INDIR_PARAM (name[1]));
+
+  /* Determine the value of this variable. */
+
+  /* Check for special variables, directly referenced. */
+  if (SPECIAL_VAR (name, want_indir))
+    var_is_special++;
+
+  /* Check for special expansion things, like the length of a parameter */
+  if (*name == '#' && name[1])
+    {
+      /* If we are not pointing at the character just after the
+        closing brace, then we haven't gotten all of the name.
+        Since it begins with a special character, this is a bad
+        substitution.  Also check NAME for validity before trying
+        to go on. */
+      if (string[sindex - 1] != RBRACE || (valid_length_expression (name) == 0))
+       {
+         temp = (char *)NULL;
+         goto bad_substitution;
+       }
+
+      number = parameter_brace_expand_length (name);
+      if (number == INTMAX_MIN && unbound_vars_is_error)
+       {
+         last_command_exit_value = EXECUTION_FAILURE;
+         err_unboundvar (name+1);
+         free (name);
+         return (interactive_shell ? &expand_wdesc_error : &expand_wdesc_fatal);
+       }
+      free (name);
+
+      *indexp = sindex;
+      if (number < 0)
+        return (&expand_wdesc_error);
+      else
+       {
+         ret = alloc_word_desc ();
+         ret->word = itos (number);
+         return ret;
+       }
+    }
+
+  /* ${@} is identical to $@. */
+  if (name[0] == '@' && name[1] == '\0')
+    {
+      if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && quoted_dollar_atp)
+       *quoted_dollar_atp = 1;
+
+      if (contains_dollar_at)
+       *contains_dollar_at = 1;
+
+      tflag |= W_DOLLARAT;
+    }
+
+  /* Process ${!PREFIX*} expansion. */
+  if (want_indir && string[sindex - 1] == RBRACE &&
+      (string[sindex - 2] == '*' || string[sindex - 2] == '@') &&
+      legal_variable_starter ((unsigned char) name[1]))
+    {
+      char **x;
+      WORD_LIST *xlist;
+
+      temp1 = savestring (name + 1);
+      number = strlen (temp1);
+      temp1[number - 1] = '\0';
+      x = all_variables_matching_prefix (temp1);
+      xlist = strvec_to_word_list (x, 0, 0);
+      if (string[sindex - 2] == '*')
+       temp = string_list_dollar_star (xlist);
+      else
+       {
+         temp = string_list_dollar_at (xlist, quoted);
+         if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && quoted_dollar_atp)
+           *quoted_dollar_atp = 1;
+         if (contains_dollar_at)
+           *contains_dollar_at = 1;
+
+         tflag |= W_DOLLARAT;
+       }
+      free (x);
+      dispose_words (xlist);
+      free (temp1);
+      *indexp = sindex;
+
+      free (name);
+
+      ret = alloc_word_desc ();
+      ret->word = temp;
+      ret->flags = tflag;      /* XXX */
+      return ret;
+    }
+
+#if defined (ARRAY_VARS)      
+  /* Process ${!ARRAY[@]} and ${!ARRAY[*]} expansion. */ /* [ */
+  if (want_indir && string[sindex - 1] == RBRACE &&
+      string[sindex - 2] == ']' && valid_array_reference (name+1))
+    {
+      char *x, *x1;
+
+      temp1 = savestring (name + 1);
+      x = array_variable_name (temp1, &x1, (int *)0);  /* [ */
+      FREE (x);
+      if (ALL_ELEMENT_SUB (x1[0]) && x1[1] == ']')
+       {
+         temp = array_keys (temp1, quoted);    /* handles assoc vars too */
+         if (x1[0] == '@')
+           {
+             if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && quoted_dollar_atp)
+               *quoted_dollar_atp = 1;
+             if (contains_dollar_at)
+               *contains_dollar_at = 1;
+
+             tflag |= W_DOLLARAT;
+           }       
+
+         free (temp1);
+         *indexp = sindex;
+
+         ret = alloc_word_desc ();
+         ret->word = temp;
+         ret->flags = tflag;   /* XXX */
+         return ret;
+       }
+
+      free (temp1);
+    }
+#endif /* ARRAY_VARS */
+      
+  /* Make sure that NAME is valid before trying to go on. */
+  if (valid_brace_expansion_word (want_indir ? name + 1 : name,
+                                       var_is_special) == 0)
+    {
+      temp = (char *)NULL;
+      goto bad_substitution;
+    }
+
+  if (want_indir)
+    tdesc = parameter_brace_expand_indir (name + 1, var_is_special, quoted, quoted_dollar_atp, contains_dollar_at);
+  else
+    tdesc = parameter_brace_expand_word (name, var_is_special, quoted, PF_IGNUNBOUND|(pflags&PF_NOSPLIT2), &ind);
+
+  if (tdesc)
+    {
+      temp = tdesc->word;
+      tflag = tdesc->flags;
+      dispose_word_desc (tdesc);
+    }
+  else
+    temp = (char  *)0;
+
+#if defined (ARRAY_VARS)
+  if (valid_array_reference (name))
+    chk_atstar (name, quoted, quoted_dollar_atp, contains_dollar_at);
+#endif
+
+  var_is_set = temp != (char *)0;
+  var_is_null = check_nullness && (var_is_set == 0 || *temp == 0);
+
+  /* Get the rest of the stuff inside the braces. */
+  if (c && c != RBRACE)
+    {
+      /* Extract the contents of the ${ ... } expansion
+        according to the Posix.2 rules. */
+      value = extract_dollar_brace_string (string, &sindex, quoted, (c == '%' || c == '#' || c =='/' || c == '^' || c == ',' || c ==':') ? SX_POSIXEXP|SX_WORD : SX_WORD);
+      if (string[sindex] == RBRACE)
+       sindex++;
+      else
+       goto bad_substitution;
+    }
+  else
+    value = (char *)NULL;
+
+  *indexp = sindex;
+
+  /* All the cases where an expansion can possibly generate an unbound
+     variable error. */
+  if (want_substring || want_patsub || want_casemod || c == '#' || c == '%' || c == RBRACE)
+    {
+      if (var_is_set == 0 && unbound_vars_is_error && ((name[0] != '@' && name[0] != '*') || name[1]))
+       {
+         last_command_exit_value = EXECUTION_FAILURE;
+         err_unboundvar (name);
+         FREE (value);
+         FREE (temp);
+         free (name);
+         return (interactive_shell ? &expand_wdesc_error : &expand_wdesc_fatal);
+       }
+    }
+    
+  /* If this is a substring spec, process it and add the result. */
+  if (want_substring)
+    {
+      temp1 = parameter_brace_substring (name, temp, ind, value, quoted, (tflag & W_ARRAYIND) ? AV_USEIND : 0);
+      FREE (name);
+      FREE (value);
+      FREE (temp);
+
+      if (temp1 == &expand_param_error)
+       return (&expand_wdesc_error);
+      else if (temp1 == &expand_param_fatal)
+       return (&expand_wdesc_fatal);
+
+      ret = alloc_word_desc ();
+      ret->word = temp1;
+      if (temp1 && QUOTED_NULL (temp1) && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)))
+       ret->flags |= W_QUOTED|W_HASQUOTEDNULL;
+      return ret;
+    }
+  else if (want_patsub)
+    {
+      temp1 = parameter_brace_patsub (name, temp, ind, value, quoted, (tflag & W_ARRAYIND) ? AV_USEIND : 0);
+      FREE (name);
+      FREE (value);
+      FREE (temp);
+
+      if (temp1 == &expand_param_error)
+       return (&expand_wdesc_error);
+      else if (temp1 == &expand_param_fatal)
+       return (&expand_wdesc_fatal);
+
+      ret = alloc_word_desc ();
+      ret->word = temp1;
+      if (temp1 && QUOTED_NULL (temp1) && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)))
+       ret->flags |= W_QUOTED|W_HASQUOTEDNULL;
+      return ret;
+    }
+#if defined (CASEMOD_EXPANSIONS)
+  else if (want_casemod)
+    {
+      temp1 = parameter_brace_casemod (name, temp, ind, modspec, value, quoted, (tflag & W_ARRAYIND) ? AV_USEIND : 0);
+      FREE (name);
+      FREE (value);
+      FREE (temp);
+
+      if (temp1 == &expand_param_error)
+       return (&expand_wdesc_error);
+      else if (temp1 == &expand_param_fatal)
+       return (&expand_wdesc_fatal);
+
+      ret = alloc_word_desc ();
+      ret->word = temp1;
+      if (temp1 && QUOTED_NULL (temp1) && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)))
+       ret->flags |= W_QUOTED|W_HASQUOTEDNULL;
+      return ret;
+    }
+#endif
+
+  /* Do the right thing based on which character ended the variable name. */
+  switch (c)
+    {
+    default:
+    case '\0':
+    bad_substitution:
+      last_command_exit_value = EXECUTION_FAILURE;
+      report_error (_("%s: bad substitution"), string ? string : "??");
+      FREE (value);
+      FREE (temp);
+      free (name);
+      return &expand_wdesc_error;
+
+    case RBRACE:
+      break;
+
+    case '#':  /* ${param#[#]pattern} */
+    case '%':  /* ${param%[%]pattern} */
+      if (value == 0 || *value == '\0' || temp == 0 || *temp == '\0')
+       {
+         FREE (value);
+         break;
+       }
+      temp1 = parameter_brace_remove_pattern (name, temp, ind, value, c, quoted, (tflag & W_ARRAYIND) ? AV_USEIND : 0);
+      free (temp);
+      free (value);
+      free (name);
+
+      ret = alloc_word_desc ();
+      ret->word = temp1;
+      if (temp1 && QUOTED_NULL (temp1) && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)))
+       ret->flags |= W_QUOTED|W_HASQUOTEDNULL;
+      return ret;
+
+    case '-':
+    case '=':
+    case '?':
+    case '+':
+      if (var_is_set && var_is_null == 0)
+       {
+         /* If the operator is `+', we don't want the value of the named
+            variable for anything, just the value of the right hand side. */
+         if (c == '+')
+           {
+             /* XXX -- if we're double-quoted and the named variable is "$@",
+                       we want to turn off any special handling of "$@" --
+                       we're not using it, so whatever is on the rhs applies. */
+             if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && quoted_dollar_atp)
+               *quoted_dollar_atp = 0;
+             if (contains_dollar_at)
+               *contains_dollar_at = 0;
+
+             FREE (temp);
+             if (value)
+               {
+                 /* From Posix discussion on austin-group list.  Issue 221
+                    requires that backslashes escaping `}' inside
+                    double-quoted ${...} be removed. */
+                 if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
+                   quoted |= Q_DOLBRACE;
+                 ret = parameter_brace_expand_rhs (name, value, c,
+                                                   quoted,
+                                                   quoted_dollar_atp,
+                                                   contains_dollar_at);
+                 /* XXX - fix up later, esp. noting presence of
+                          W_HASQUOTEDNULL in ret->flags */
+                 free (value);
+               }
+             else
+               temp = (char *)NULL;
+           }
+         else
+           {
+             FREE (value);
+           }
+         /* Otherwise do nothing; just use the value in TEMP. */
+       }
+      else     /* VAR not set or VAR is NULL. */
+       {
+         FREE (temp);
+         temp = (char *)NULL;
+         if (c == '=' && var_is_special)
+           {
+             last_command_exit_value = EXECUTION_FAILURE;
+             report_error (_("$%s: cannot assign in this way"), name);
+             free (name);
+             free (value);
+             return &expand_wdesc_error;
+           }
+         else if (c == '?')
+           {
+             parameter_brace_expand_error (name, value);
+             return (interactive_shell ? &expand_wdesc_error : &expand_wdesc_fatal);
+           }
+         else if (c != '+')
+           {
+             /* XXX -- if we're double-quoted and the named variable is "$@",
+                       we want to turn off any special handling of "$@" --
+                       we're not using it, so whatever is on the rhs applies. */
+             if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && quoted_dollar_atp)
+               *quoted_dollar_atp = 0;
+             if (contains_dollar_at)
+               *contains_dollar_at = 0;
+
+             /* From Posix discussion on austin-group list.  Issue 221 requires
+                that backslashes escaping `}' inside double-quoted ${...} be
+                removed. */
+             if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
+               quoted |= Q_DOLBRACE;
+             ret = parameter_brace_expand_rhs (name, value, c, quoted,
+                                               quoted_dollar_atp,
+                                               contains_dollar_at);
+             /* XXX - fix up later, esp. noting presence of
+                      W_HASQUOTEDNULL in tdesc->flags */
+           }
+         free (value);
+       }
+
+      break;
+    }
+  free (name);
+
+  if (ret == 0)
+    {
+      ret = alloc_word_desc ();
+      ret->flags = tflag;
+      ret->word = temp;
+    }
+  return (ret);
+}
+
+/* Expand a single ${xxx} expansion.  The braces are optional.  When
+   the braces are used, parameter_brace_expand() does the work,
+   possibly calling param_expand recursively. */
+static WORD_DESC *
+param_expand (string, sindex, quoted, expanded_something,
+             contains_dollar_at, quoted_dollar_at_p, had_quoted_null_p,
+             pflags)
+     char *string;
+     int *sindex, quoted, *expanded_something, *contains_dollar_at;
+     int *quoted_dollar_at_p, *had_quoted_null_p, pflags;
+{
+  char *temp, *temp1, uerror[3];
+  int zindex, t_index, expok;
+  unsigned char c;
+  intmax_t number;
+  SHELL_VAR *var;
+  WORD_LIST *list;
+  WORD_DESC *tdesc, *ret;
+  int tflag;
+
+  zindex = *sindex;
+  c = string[++zindex];
+
+  temp = (char *)NULL;
+  ret = tdesc = (WORD_DESC *)NULL;
+  tflag = 0;
+
+  /* Do simple cases first. Switch on what follows '$'. */
+  switch (c)
+    {
+    /* $0 .. $9? */
+    case '0':
+    case '1':
+    case '2':
+    case '3':
+    case '4':
+    case '5':
+    case '6':
+    case '7':
+    case '8':
+    case '9':
+      temp1 = dollar_vars[TODIGIT (c)];
+      if (unbound_vars_is_error && temp1 == (char *)NULL)
+       {
+         uerror[0] = '$';
+         uerror[1] = c;
+         uerror[2] = '\0';
+         last_command_exit_value = EXECUTION_FAILURE;
+         err_unboundvar (uerror);
+         return (interactive_shell ? &expand_wdesc_error : &expand_wdesc_fatal);
+       }
+      if (temp1)
+       temp = (*temp1 && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)))
+                 ? quote_string (temp1)
+                 : quote_escapes (temp1);
+      else
+       temp = (char *)NULL;
+
+      break;
+
+    /* $$ -- pid of the invoking shell. */
+    case '$':
+      temp = itos (dollar_dollar_pid);
+      break;
+
+    /* $# -- number of positional parameters. */
+    case '#':
+      temp = itos (number_of_args ());
+      break;
+
+    /* $? -- return value of the last synchronous command. */
+    case '?':
+      temp = itos (last_command_exit_value);
+      break;
+
+    /* $- -- flags supplied to the shell on invocation or by `set'. */
+    case '-':
+      temp = which_set_flags ();
+      break;
+
+      /* $! -- Pid of the last asynchronous command. */
+    case '!':
+      /* If no asynchronous pids have been created, expand to nothing.
+        If `set -u' has been executed, and no async processes have
+        been created, this is an expansion error. */
+      if (last_asynchronous_pid == NO_PID)
+       {
+         if (expanded_something)
+           *expanded_something = 0;
+         temp = (char *)NULL;
+         if (unbound_vars_is_error)
+           {
+             uerror[0] = '$';
+             uerror[1] = c;
+             uerror[2] = '\0';
+             last_command_exit_value = EXECUTION_FAILURE;
+             err_unboundvar (uerror);
+             return (interactive_shell ? &expand_wdesc_error : &expand_wdesc_fatal);
+           }
+       }
+      else
+       temp = itos (last_asynchronous_pid);
+      break;
+
+    /* The only difference between this and $@ is when the arg is quoted. */
+    case '*':          /* `$*' */
+      list = list_rest_of_args ();
+
+#if 0
+      /* According to austin-group posix proposal by Geoff Clare in
+        <20090505091501.GA10097@squonk.masqnet> of 5 May 2009:
+
+       "The shell shall write a message to standard error and
+        immediately exit when it tries to expand an unset parameter
+        other than the '@' and '*' special parameters."
+      */
+
+      if (list == 0 && unbound_vars_is_error && (pflags & PF_IGNUNBOUND) == 0)
+       {
+         uerror[0] = '$';
+         uerror[1] = '*';
+         uerror[2] = '\0';
+         last_command_exit_value = EXECUTION_FAILURE;
+         err_unboundvar (uerror);
+         return (interactive_shell ? &expand_wdesc_error : &expand_wdesc_fatal);
+       }
+#endif
+
+      /* If there are no command-line arguments, this should just
+        disappear if there are other characters in the expansion,
+        even if it's quoted. */
+      if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && list == 0)
+       temp = (char *)NULL;
+      else if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES|Q_PATQUOTE))
+       {
+         /* If we have "$*" we want to make a string of the positional
+            parameters, separated by the first character of $IFS, and
+            quote the whole string, including the separators.  If IFS
+            is unset, the parameters are separated by ' '; if $IFS is
+            null, the parameters are concatenated. */
+         temp = (quoted & (Q_DOUBLE_QUOTES|Q_PATQUOTE)) ? string_list_dollar_star (list) : string_list (list);
+         if (temp)
+           {
+             temp1 = quote_string (temp);
+             if (*temp == 0)
+               tflag |= W_HASQUOTEDNULL;
+             free (temp);
+             temp = temp1;
+           }
+       }
+      else
+       {
+         /* We check whether or not we're eventually going to split $* here,
+            for example when IFS is empty and we are processing the rhs of
+            an assignment statement.  In that case, we don't separate the
+            arguments at all.  Otherwise, if the $* is not quoted it is
+            identical to $@ */
+#if 1
+#  if defined (HANDLE_MULTIBYTE)
+         if (expand_no_split_dollar_star && ifs_firstc[0] == 0)
+#  else
+         if (expand_no_split_dollar_star && ifs_firstc == 0)
+#  endif
+           temp = string_list_dollar_star (list);
+         else
+           temp = string_list_dollar_at (list, quoted);
+#else
+         temp = string_list_dollar_at (list, quoted);
+#endif
+         if (expand_no_split_dollar_star == 0 && contains_dollar_at)
+           *contains_dollar_at = 1;
+       }
+
+      dispose_words (list);
+      break;
+
+    /* When we have "$@" what we want is "$1" "$2" "$3" ... This
+       means that we have to turn quoting off after we split into
+       the individually quoted arguments so that the final split
+       on the first character of $IFS is still done.  */
+    case '@':          /* `$@' */
+      list = list_rest_of_args ();
+
+#if 0
+      /* According to austin-group posix proposal by Geoff Clare in
+        <20090505091501.GA10097@squonk.masqnet> of 5 May 2009:
+
+       "The shell shall write a message to standard error and
+        immediately exit when it tries to expand an unset parameter
+        other than the '@' and '*' special parameters."
+      */
+
+      if (list == 0 && unbound_vars_is_error && (pflags & PF_IGNUNBOUND) == 0)
+       {
+         uerror[0] = '$';
+         uerror[1] = '@';
+         uerror[2] = '\0';
+         last_command_exit_value = EXECUTION_FAILURE;
+         err_unboundvar (uerror);
+         return (interactive_shell ? &expand_wdesc_error : &expand_wdesc_fatal);
+       }
+#endif
+
+      /* We want to flag the fact that we saw this.  We can't turn
+        off quoting entirely, because other characters in the
+        string might need it (consider "\"$@\""), but we need some
+        way to signal that the final split on the first character
+        of $IFS should be done, even though QUOTED is 1. */
+      /* XXX - should this test include Q_PATQUOTE? */
+      if (quoted_dollar_at_p && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)))
+       *quoted_dollar_at_p = 1;
+      if (contains_dollar_at)
+       *contains_dollar_at = 1;
+
+      /* We want to separate the positional parameters with the first
+        character of $IFS in case $IFS is something other than a space.
+        We also want to make sure that splitting is done no matter what --
+        according to POSIX.2, this expands to a list of the positional
+        parameters no matter what IFS is set to. */
+      temp = string_list_dollar_at (list, (pflags & PF_ASSIGNRHS) ? (quoted|Q_DOUBLE_QUOTES) : quoted);
+
+      tflag |= W_DOLLARAT;
+      dispose_words (list);
+      break;
+
+    case LBRACE:
+      tdesc = parameter_brace_expand (string, &zindex, quoted, pflags,
+                                     quoted_dollar_at_p,
+                                     contains_dollar_at);
+
+      if (tdesc == &expand_wdesc_error || tdesc == &expand_wdesc_fatal)
+       return (tdesc);
+      temp = tdesc ? tdesc->word : (char *)0;
+
+      /* XXX */
+      /* Quoted nulls should be removed if there is anything else
+        in the string. */
+      /* Note that we saw the quoted null so we can add one back at
+        the end of this function if there are no other characters
+        in the string, discard TEMP, and go on.  The exception to
+        this is when we have "${@}" and $1 is '', since $@ needs
+        special handling. */
+      if (tdesc && tdesc->word && (tdesc->flags & W_HASQUOTEDNULL) && QUOTED_NULL (temp))
+       {
+         if (had_quoted_null_p)
+           *had_quoted_null_p = 1;
+         if (*quoted_dollar_at_p == 0)
+           {
+             free (temp);
+             tdesc->word = temp = (char *)NULL;
+           }
+           
+       }
+
+      ret = tdesc;
+      goto return0;
+
+    /* Do command or arithmetic substitution. */
+    case LPAREN:
+      /* We have to extract the contents of this paren substitution. */
+      t_index = zindex + 1;
+      temp = extract_command_subst (string, &t_index, 0);
+      zindex = t_index;
+
+      /* For Posix.2-style `$(( ))' arithmetic substitution,
+        extract the expression and pass it to the evaluator. */
+      if (temp && *temp == LPAREN)
+       {
+         char *temp2;
+         temp1 = temp + 1;
+         temp2 = savestring (temp1);
+         t_index = strlen (temp2) - 1;
+
+         if (temp2[t_index] != RPAREN)
+           {
+             free (temp2);
+             goto comsub;
+           }
+
+         /* Cut off ending `)' */
+         temp2[t_index] = '\0';
+
+         if (chk_arithsub (temp2, t_index) == 0)
+           {
+             free (temp2);
+#if 0
+             internal_warning (_("future versions of the shell will force evaluation as an arithmetic substitution"));
+#endif
+             goto comsub;
+           }
+
+         /* Expand variables found inside the expression. */
+         temp1 = expand_arith_string (temp2, Q_DOUBLE_QUOTES);
+         free (temp2);
+
+arithsub:
+         /* No error messages. */
+         this_command_name = (char *)NULL;
+         number = evalexp (temp1, &expok);
+         free (temp);
+         free (temp1);
+         if (expok == 0)
+           {
+             if (interactive_shell == 0 && posixly_correct)
+               {
+                 last_command_exit_value = EXECUTION_FAILURE;
+                 return (&expand_wdesc_fatal);
+               }
+             else
+               return (&expand_wdesc_error);
+           }
+         temp = itos (number);
+         break;
+       }
+
+comsub:
+      if (pflags & PF_NOCOMSUB)
+       /* we need zindex+1 because string[zindex] == RPAREN */
+       temp1 = substring (string, *sindex, zindex+1);
+      else
+       {
+         tdesc = command_substitute (temp, quoted);
+         temp1 = tdesc ? tdesc->word : (char *)NULL;
+         if (tdesc)
+           dispose_word_desc (tdesc);
+       }
+      FREE (temp);
+      temp = temp1;
+      break;
+
+    /* Do POSIX.2d9-style arithmetic substitution.  This will probably go
+       away in a future bash release. */
+    case '[':
+      /* Extract the contents of this arithmetic substitution. */
+      t_index = zindex + 1;
+      temp = extract_arithmetic_subst (string, &t_index);
+      zindex = t_index;
+      if (temp == 0)
+       {
+         temp = savestring (string);
+         if (expanded_something)
+           *expanded_something = 0;
+         goto return0;
+       }         
+
+       /* Do initial variable expansion. */
+      temp1 = expand_arith_string (temp, Q_DOUBLE_QUOTES);
+
+      goto arithsub;
+
+    default:
+      /* Find the variable in VARIABLE_LIST. */
+      temp = (char *)NULL;
+
+      for (t_index = zindex; (c = string[zindex]) && legal_variable_char (c); zindex++)
+       ;
+      temp1 = (zindex > t_index) ? substring (string, t_index, zindex) : (char *)NULL;
+
+      /* If this isn't a variable name, then just output the `$'. */
+      if (temp1 == 0 || *temp1 == '\0')
+       {
+         FREE (temp1);
+         temp = (char *)xmalloc (2);
+         temp[0] = '$';
+         temp[1] = '\0';
+         if (expanded_something)
+           *expanded_something = 0;
+         goto return0;
+       }
+
+      /* If the variable exists, return its value cell. */
+      var = find_variable (temp1);
+
+      if (var && invisible_p (var) == 0 && var_isset (var))
+       {
+#if defined (ARRAY_VARS)
+         if (assoc_p (var) || array_p (var))
+           {
+             temp = array_p (var) ? array_reference (array_cell (var), 0)
+                                  : assoc_reference (assoc_cell (var), "0");
+             if (temp)
+               temp = (*temp && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)))
+                         ? quote_string (temp)
+                         : quote_escapes (temp);
+             else if (unbound_vars_is_error)
+               goto unbound_variable;
+           }
+         else
+#endif
+           {
+             temp = value_cell (var);
+
+             temp = (*temp && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)))
+                       ? quote_string (temp)
+                       : quote_escapes (temp);
+           }
+
+         free (temp1);
+
+         goto return0;
+       }
+#if defined (ARRAY_VARS)
+      else if (var = find_variable_last_nameref (temp1))
+       {
+         temp = nameref_cell (var);
+         if (temp && *temp && valid_array_reference (temp))
+           {
+             tdesc = parameter_brace_expand_word (temp, SPECIAL_VAR (temp, 0), quoted, pflags, (int *)NULL);
+             if (tdesc == &expand_wdesc_error || tdesc == &expand_wdesc_fatal)
+               return (tdesc);
+             ret = tdesc;
+             goto return0;
+           }
+         else
+           temp = (char *)NULL;
+       }
+#endif
+
+      temp = (char *)NULL;
+
+unbound_variable:
+      if (unbound_vars_is_error)
+       {
+         last_command_exit_value = EXECUTION_FAILURE;
+         err_unboundvar (temp1);
+       }
+      else
+       {
+         free (temp1);
+         goto return0;
+       }
+
+      free (temp1);
+      last_command_exit_value = EXECUTION_FAILURE;
+      return ((unbound_vars_is_error && interactive_shell == 0)
+               ? &expand_wdesc_fatal
+               : &expand_wdesc_error);
+    }
+
+  if (string[zindex])
+    zindex++;
+
+return0:
+  *sindex = zindex;
+
+  if (ret == 0)
+    {
+      ret = alloc_word_desc ();
+      ret->flags = tflag;      /* XXX */
+      ret->word = temp;
+    }
+  return ret;
+}
+
+/* Make a word list which is the result of parameter and variable
+   expansion, command substitution, arithmetic substitution, and
+   quote removal of WORD.  Return a pointer to a WORD_LIST which is
+   the result of the expansion.  If WORD contains a null word, the
+   word list returned is also null.
+
+   QUOTED contains flag values defined in shell.h.
+
+   ISEXP is used to tell expand_word_internal that the word should be
+   treated as the result of an expansion.  This has implications for
+   how IFS characters in the word are treated.
+
+   CONTAINS_DOLLAR_AT and EXPANDED_SOMETHING are return values; when non-null
+   they point to an integer value which receives information about expansion.
+   CONTAINS_DOLLAR_AT gets non-zero if WORD contained "$@", else zero.
+   EXPANDED_SOMETHING get non-zero if WORD contained any parameter expansions,
+   else zero.
+
+   This only does word splitting in the case of $@ expansion.  In that
+   case, we split on ' '. */
+
+/* Values for the local variable quoted_state. */
+#define UNQUOTED        0
+#define PARTIALLY_QUOTED 1
+#define WHOLLY_QUOTED    2
+
+static WORD_LIST *
+expand_word_internal (word, quoted, isexp, contains_dollar_at, expanded_something)
+     WORD_DESC *word;
+     int quoted, isexp;
+     int *contains_dollar_at;
+     int *expanded_something;
+{
+  WORD_LIST *list;
+  WORD_DESC *tword;
+
+  /* The intermediate string that we build while expanding. */
+  char *istring;
+
+  /* The current size of the above object. */
+  int istring_size;
+
+  /* Index into ISTRING. */
+  int istring_index;
+
+  /* Temporary string storage. */
+  char *temp, *temp1;
+
+  /* The text of WORD. */
+  register char *string;
+
+  /* The size of STRING. */
+  size_t string_size;
+
+  /* The index into STRING. */
+  int sindex;
+
+  /* This gets 1 if we see a $@ while quoted. */
+  int quoted_dollar_at;
+
+  /* One of UNQUOTED, PARTIALLY_QUOTED, or WHOLLY_QUOTED, depending on
+     whether WORD contains no quoting characters, a partially quoted
+     string (e.g., "xx"ab), or is fully quoted (e.g., "xxab"). */
+  int quoted_state;
+
+  /* State flags */
+  int had_quoted_null;
+  int has_dollar_at, temp_has_dollar_at;
+  int tflag;
+  int pflags;                  /* flags passed to param_expand */
+
+  int assignoff;               /* If assignment, offset of `=' */
+
+  register unsigned char c;    /* Current character. */
+  int t_index;                 /* For calls to string_extract_xxx. */
+
+  char twochars[2];
+
+  DECLARE_MBSTATE;
+
+  istring = (char *)xmalloc (istring_size = DEFAULT_INITIAL_ARRAY_SIZE);
+  istring[istring_index = 0] = '\0';
+  quoted_dollar_at = had_quoted_null = has_dollar_at = 0;
+  quoted_state = UNQUOTED;
+
+  string = word->word;
+  if (string == 0)
+    goto finished_with_string;
+  /* Don't need the string length for the SADD... and COPY_ macros unless
+     multibyte characters are possible. */
+  string_size = (MB_CUR_MAX > 1) ? strlen (string) : 1;
+
+  if (contains_dollar_at)
+    *contains_dollar_at = 0;
+
+  assignoff = -1;
+
+  /* Begin the expansion. */
+
+  for (sindex = 0; ;)
+    {
+      c = string[sindex];
+
+      /* Case on toplevel character. */
+      switch (c)
+       {
+       case '\0':
+         goto finished_with_string;
+
+       case CTLESC:
+         sindex++;
+#if HANDLE_MULTIBYTE
+         if (MB_CUR_MAX > 1 && string[sindex])
+           {
+             SADD_MBQCHAR_BODY(temp, string, sindex, string_size);
+           }
+         else
+#endif
+           {
+             temp = (char *)xmalloc (3);
+             temp[0] = CTLESC;
+             temp[1] = c = string[sindex];
+             temp[2] = '\0';
+           }
+
+dollar_add_string:
+         if (string[sindex])
+           sindex++;
+
+add_string:
+         if (temp)
+           {
+             istring = sub_append_string (temp, istring, &istring_index, &istring_size);
+             temp = (char *)0;
+           }
+
+         break;
+
+#if defined (PROCESS_SUBSTITUTION)
+         /* Process substitution. */
+       case '<':
+       case '>':
+         {
+           if (string[++sindex] != LPAREN || (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || (word->flags & (W_DQUOTE|W_NOPROCSUB)) || posixly_correct)
+             {
+               sindex--;       /* add_character: label increments sindex */
+               goto add_character;
+             }
+           else
+             t_index = sindex + 1; /* skip past both '<' and LPAREN */
+
+           temp1 = extract_process_subst (string, (c == '<') ? "<(" : ">(", &t_index); /*))*/
+           sindex = t_index;
+
+           /* If the process substitution specification is `<()', we want to
+              open the pipe for writing in the child and produce output; if
+              it is `>()', we want to open the pipe for reading in the child
+              and consume input. */
+           temp = temp1 ? process_substitute (temp1, (c == '>')) : (char *)0;
+
+           FREE (temp1);
+
+           goto dollar_add_string;
+         }
+#endif /* PROCESS_SUBSTITUTION */
+
+       case '=':
+         /* Posix.2 section 3.6.1 says that tildes following `=' in words
+            which are not assignment statements are not expanded.  If the
+            shell isn't in posix mode, though, we perform tilde expansion
+            on `likely candidate' unquoted assignment statements (flags
+            include W_ASSIGNMENT but not W_QUOTED).  A likely candidate
+            contains an unquoted :~ or =~.  Something to think about: we
+            now have a flag that says  to perform tilde expansion on arguments
+            to `assignment builtins' like declare and export that look like
+            assignment statements.  We now do tilde expansion on such words
+            even in POSIX mode. */     
+         if (word->flags & (W_ASSIGNRHS|W_NOTILDE))
+           {
+             if (isexp == 0 && (word->flags & (W_NOSPLIT|W_NOSPLIT2)) == 0 && isifs (c))
+               goto add_ifs_character;
+             else
+               goto add_character;
+           }
+         /* If we're not in posix mode or forcing assignment-statement tilde
+            expansion, note where the `=' appears in the word and prepare to
+            do tilde expansion following the first `='. */
+         if ((word->flags & W_ASSIGNMENT) &&
+             (posixly_correct == 0 || (word->flags & W_TILDEEXP)) &&
+             assignoff == -1 && sindex > 0)
+           assignoff = sindex;
+         if (sindex == assignoff && string[sindex+1] == '~')   /* XXX */
+           word->flags |= W_ITILDE;
+#if 0
+         else if ((word->flags & W_ASSIGNMENT) &&
+                  (posixly_correct == 0 || (word->flags & W_TILDEEXP)) &&
+                  string[sindex+1] == '~')
+           word->flags |= W_ITILDE;
+#endif
+         if (isexp == 0 && (word->flags & (W_NOSPLIT|W_NOSPLIT2)) == 0 && isifs (c))
+           goto add_ifs_character;
+         else
+           goto add_character;
+
+       case ':':
+         if (word->flags & W_NOTILDE)
+           {
+             if (isexp == 0 && (word->flags & (W_NOSPLIT|W_NOSPLIT2)) == 0 && isifs (c))
+               goto add_ifs_character;
+             else
+               goto add_character;
+           }
+
+         if ((word->flags & (W_ASSIGNMENT|W_ASSIGNRHS|W_TILDEEXP)) &&
+             string[sindex+1] == '~')
+           word->flags |= W_ITILDE;
+
+         if (isexp == 0 && (word->flags & (W_NOSPLIT|W_NOSPLIT2)) == 0 && isifs (c))
+           goto add_ifs_character;
+         else
+           goto add_character;
+
+       case '~':
+         /* If the word isn't supposed to be tilde expanded, or we're not
+            at the start of a word or after an unquoted : or = in an
+            assignment statement, we don't do tilde expansion. */
+         if ((word->flags & (W_NOTILDE|W_DQUOTE)) ||
+             (sindex > 0 && ((word->flags & W_ITILDE) == 0)) ||
+             (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)))
+           {
+             word->flags &= ~W_ITILDE;
+             if (isexp == 0 && (word->flags & (W_NOSPLIT|W_NOSPLIT2)) == 0 && isifs (c) && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) == 0)
+               goto add_ifs_character;
+             else
+               goto add_character;
+           }
+
+         if (word->flags & W_ASSIGNRHS)
+           tflag = 2;
+         else if (word->flags & (W_ASSIGNMENT|W_TILDEEXP))
+           tflag = 1;
+         else
+           tflag = 0;
+
+         temp = bash_tilde_find_word (string + sindex, tflag, &t_index);
+           
+         word->flags &= ~W_ITILDE;
+
+         if (temp && *temp && t_index > 0)
+           {
+             temp1 = bash_tilde_expand (temp, tflag);
+             if  (temp1 && *temp1 == '~' && STREQ (temp, temp1))
+               {
+                 FREE (temp);
+                 FREE (temp1);
+                 goto add_character;           /* tilde expansion failed */
+               }
+             free (temp);
+             temp = temp1;
+             sindex += t_index;
+             goto add_quoted_string;           /* XXX was add_string */
+           }
+         else
+           {
+             FREE (temp);
+             goto add_character;
+           }
+       
+       case '$':
+         if (expanded_something)
+           *expanded_something = 1;
+
+         temp_has_dollar_at = 0;
+         pflags = (word->flags & W_NOCOMSUB) ? PF_NOCOMSUB : 0;
+         if (word->flags & W_NOSPLIT2)
+           pflags |= PF_NOSPLIT2;
+         if (word->flags & W_ASSIGNRHS)
+           pflags |= PF_ASSIGNRHS;
+         tword = param_expand (string, &sindex, quoted, expanded_something,
+                              &temp_has_dollar_at, &quoted_dollar_at,
+                              &had_quoted_null, pflags);
+         has_dollar_at += temp_has_dollar_at;
+
+         if (tword == &expand_wdesc_error || tword == &expand_wdesc_fatal)
+           {
+             free (string);
+             free (istring);
+             return ((tword == &expand_wdesc_error) ? &expand_word_error
+                                                    : &expand_word_fatal);
+           }
+         if (contains_dollar_at && has_dollar_at)
+           *contains_dollar_at = 1;
+
+         if (tword && (tword->flags & W_HASQUOTEDNULL))
+           had_quoted_null = 1;
+
+         temp = tword ? tword->word : (char *)NULL;
+         dispose_word_desc (tword);
+
+         /* Kill quoted nulls; we will add them back at the end of
+            expand_word_internal if nothing else in the string */
+         if (had_quoted_null && temp && QUOTED_NULL (temp))
+           {
+             FREE (temp);
+             temp = (char *)NULL;
+           }
+
+         goto add_string;
+         break;
+
+       case '`':               /* Backquoted command substitution. */
+         {
+           t_index = sindex++;
+
+           temp = string_extract (string, &sindex, "`", SX_REQMATCH);
+           /* The test of sindex against t_index is to allow bare instances of
+              ` to pass through, for backwards compatibility. */
+           if (temp == &extract_string_error || temp == &extract_string_fatal)
+             {
+               if (sindex - 1 == t_index)
+                 {
+                   sindex = t_index;
+                   goto add_character;
+                 }
+               last_command_exit_value = EXECUTION_FAILURE;
+               report_error (_("bad substitution: no closing \"`\" in %s") , string+t_index);
+               free (string);
+               free (istring);
+               return ((temp == &extract_string_error) ? &expand_word_error
+                                                       : &expand_word_fatal);
+             }
+               
+           if (expanded_something)
+             *expanded_something = 1;
+
+           if (word->flags & W_NOCOMSUB)
+             /* sindex + 1 because string[sindex] == '`' */
+             temp1 = substring (string, t_index, sindex + 1);
+           else
+             {
+               de_backslash (temp);
+               tword = command_substitute (temp, quoted);
+               temp1 = tword ? tword->word : (char *)NULL;
+               if (tword)
+                 dispose_word_desc (tword);
+             }
+           FREE (temp);
+           temp = temp1;
+           goto dollar_add_string;
+         }
+
+       case '\\':
+         if (string[sindex + 1] == '\n')
+           {
+             sindex += 2;
+             continue;
+           }
+
+         c = string[++sindex];
+
+         if (quoted & Q_HERE_DOCUMENT)
+           tflag = CBSHDOC;
+         else if (quoted & Q_DOUBLE_QUOTES)
+           tflag = CBSDQUOTE;
+         else
+           tflag = 0;
+
+         /* From Posix discussion on austin-group list:  Backslash escaping
+            a } in ${...} is removed.  Issue 0000221 */
+         if ((quoted & Q_DOLBRACE) && c == RBRACE)
+           {
+             SCOPY_CHAR_I (twochars, CTLESC, c, string, sindex, string_size);
+           }
+         else if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && ((sh_syntaxtab[c] & tflag) == 0))
+           {
+             SCOPY_CHAR_I (twochars, '\\', c, string, sindex, string_size);
+           }
+         else if (c == 0)
+           {
+             c = CTLNUL;
+             sindex--;         /* add_character: label increments sindex */
+             goto add_character;
+           }
+         else
+           {
+             SCOPY_CHAR_I (twochars, CTLESC, c, string, sindex, string_size);
+           }
+
+         sindex++;
+add_twochars:
+         /* BEFORE jumping here, we need to increment sindex if appropriate */
+         RESIZE_MALLOCED_BUFFER (istring, istring_index, 2, istring_size,
+                                 DEFAULT_ARRAY_SIZE);
+         istring[istring_index++] = twochars[0];
+         istring[istring_index++] = twochars[1];
+         istring[istring_index] = '\0';
+
+         break;
+
+       case '"':
+#if 0
+         if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) || (word->flags & W_DQUOTE))
+#else
+         if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)))
+#endif
+           goto add_character;
+
+         t_index = ++sindex;
+         temp = string_extract_double_quoted (string, &sindex, 0);
+
+         /* If the quotes surrounded the entire string, then the
+            whole word was quoted. */
+         quoted_state = (t_index == 1 && string[sindex] == '\0')
+                           ? WHOLLY_QUOTED
+                           : PARTIALLY_QUOTED;
+
+         if (temp && *temp)
+           {
+             tword = alloc_word_desc ();
+             tword->word = temp;
+
+             temp = (char *)NULL;
+
+             temp_has_dollar_at = 0;   /* XXX */
+             /* Need to get W_HASQUOTEDNULL flag through this function. */
+             list = expand_word_internal (tword, Q_DOUBLE_QUOTES, 0, &temp_has_dollar_at, (int *)NULL);
+             has_dollar_at += temp_has_dollar_at;
+
+             if (list == &expand_word_error || list == &expand_word_fatal)
+               {
+                 free (istring);
+                 free (string);
+                 /* expand_word_internal has already freed temp_word->word
+                    for us because of the way it prints error messages. */
+                 tword->word = (char *)NULL;
+                 dispose_word (tword);
+                 return list;
+               }
+
+             dispose_word (tword);
+
+             /* "$@" (a double-quoted dollar-at) expands into nothing,
+                not even a NULL word, when there are no positional
+                parameters. */
+             if (list == 0 && has_dollar_at)
+               {
+                 quoted_dollar_at++;
+                 break;
+               }
+
+             /* If we get "$@", we know we have expanded something, so we
+                need to remember it for the final split on $IFS.  This is
+                a special case; it's the only case where a quoted string
+                can expand into more than one word.  It's going to come back
+                from the above call to expand_word_internal as a list with
+                a single word, in which all characters are quoted and
+                separated by blanks.  What we want to do is to turn it back
+                into a list for the next piece of code. */
+             if (list)
+               dequote_list (list);
+
+             if (list && list->word && (list->word->flags & W_HASQUOTEDNULL))
+               had_quoted_null = 1;            /* XXX */
+
+             if (has_dollar_at)
+               {
+                 quoted_dollar_at++;
+                 if (contains_dollar_at)
+                   *contains_dollar_at = 1;
+                 if (expanded_something)
+                   *expanded_something = 1;
+               }
+           }
+         else
+           {
+             /* What we have is "".  This is a minor optimization. */
+             FREE (temp);
+             list = (WORD_LIST *)NULL;
+           }
+
+         /* The code above *might* return a list (consider the case of "$@",
+            where it returns "$1", "$2", etc.).  We can't throw away the
+            rest of the list, and we have to make sure each word gets added
+            as quoted.  We test on tresult->next:  if it is non-NULL, we
+            quote the whole list, save it to a string with string_list, and
+            add that string. We don't need to quote the results of this
+            (and it would be wrong, since that would quote the separators
+            as well), so we go directly to add_string. */
+         if (list)
+           {
+             if (list->next)
+               {
+#if 0
+                 if (quoted_dollar_at && (word->flags & W_NOSPLIT2))
+                   temp = string_list_internal (quote_list (list), " ");
+                 else
+#endif
+                 /* Testing quoted_dollar_at makes sure that "$@" is
+                    split correctly when $IFS does not contain a space. */
+                 temp = quoted_dollar_at
+                               ? string_list_dollar_at (list, Q_DOUBLE_QUOTES)
+                               : string_list (quote_list (list));
+                 dispose_words (list);
+                 goto add_string;
+               }
+             else
+               {
+                 temp = savestring (list->word->word);
+                 tflag = list->word->flags;
+                 dispose_words (list);
+
+                 /* If the string is not a quoted null string, we want
+                    to remove any embedded unquoted CTLNUL characters.
+                    We do not want to turn quoted null strings back into
+                    the empty string, though.  We do this because we
+                    want to remove any quoted nulls from expansions that
+                    contain other characters.  For example, if we have
+                    x"$*"y or "x$*y" and there are no positional parameters,
+                    the $* should expand into nothing. */
+                 /* We use the W_HASQUOTEDNULL flag to differentiate the
+                    cases:  a quoted null character as above and when
+                    CTLNUL is contained in the (non-null) expansion
+                    of some variable.  We use the had_quoted_null flag to
+                    pass the value through this function to its caller. */
+                 if ((tflag & W_HASQUOTEDNULL) && QUOTED_NULL (temp) == 0)
+                   remove_quoted_nulls (temp); /* XXX */
+               }
+           }
+         else
+           temp = (char *)NULL;
+
+         /* We do not want to add quoted nulls to strings that are only
+            partially quoted; we can throw them away.  The exception to
+            this is when we are going to be performing word splitting,
+            since we have to preserve a null argument if the next character
+            will cause word splitting. */
+         if (temp == 0 && quoted_state == PARTIALLY_QUOTED && (word->flags & (W_NOSPLIT|W_NOSPLIT2)))
+           continue;
+
+       add_quoted_string:
+
+         if (temp)
+           {
+             temp1 = temp;
+             temp = quote_string (temp);
+             free (temp1);
+             goto add_string;
+           }
+         else
+           {
+             /* Add NULL arg. */
+             c = CTLNUL;
+             sindex--;         /* add_character: label increments sindex */
+             goto add_character;
+           }
+
+         /* break; */
+
+       case '\'':
+#if 0
+         if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) || (word->flags & W_DQUOTE))
+#else
+         if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)))
+#endif
+           goto add_character;
+
+         t_index = ++sindex;
+         temp = string_extract_single_quoted (string, &sindex);
+
+         /* If the entire STRING was surrounded by single quotes,
+            then the string is wholly quoted. */
+         quoted_state = (t_index == 1 && string[sindex] == '\0')
+                           ? WHOLLY_QUOTED
+                           : PARTIALLY_QUOTED;
+
+         /* If all we had was '', it is a null expansion. */
+         if (*temp == '\0')
+           {
+             free (temp);
+             temp = (char *)NULL;
+           }
+         else
+           remove_quoted_escapes (temp);       /* ??? */
+
+         /* We do not want to add quoted nulls to strings that are only
+            partially quoted; such nulls are discarded. */
+         if (temp == 0 && (quoted_state == PARTIALLY_QUOTED))
+           continue;
+
+         /* If we have a quoted null expansion, add a quoted NULL to istring. */
+         if (temp == 0)
+           {
+             c = CTLNUL;
+             sindex--;         /* add_character: label increments sindex */
+             goto add_character;
+           }
+         else
+           goto add_quoted_string;
+
+         /* break; */
+
+       default:
+         /* This is the fix for " $@ " */
+       add_ifs_character:
+         if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || (isexp == 0 && isifs (c)))
+           {
+             if (string[sindex])       /* from old goto dollar_add_string */
+               sindex++;
+             if (c == 0)
+               {
+                 c = CTLNUL;
+                 goto add_character;
+               }
+             else
+               {
+#if HANDLE_MULTIBYTE
+                 if (MB_CUR_MAX > 1)
+                   sindex--;
+
+                 if (MB_CUR_MAX > 1)
+                   {
+                     SADD_MBQCHAR_BODY(temp, string, sindex, string_size);
+                   }
+                 else
+#endif
+                   {
+                     twochars[0] = CTLESC;
+                     twochars[1] = c;
+                     goto add_twochars;
+                   }
+               }
+           }
+
+         SADD_MBCHAR (temp, string, sindex, string_size);
+
+       add_character:
+         RESIZE_MALLOCED_BUFFER (istring, istring_index, 1, istring_size,
+                                 DEFAULT_ARRAY_SIZE);
+         istring[istring_index++] = c;
+         istring[istring_index] = '\0';
+
+         /* Next character. */
+         sindex++;
+       }
+    }
+
+finished_with_string:
+  /* OK, we're ready to return.  If we have a quoted string, and
+     quoted_dollar_at is not set, we do no splitting at all; otherwise
+     we split on ' '.  The routines that call this will handle what to
+     do if nothing has been expanded. */
+
+  /* Partially and wholly quoted strings which expand to the empty
+     string are retained as an empty arguments.  Unquoted strings
+     which expand to the empty string are discarded.  The single
+     exception is the case of expanding "$@" when there are no
+     positional parameters.  In that case, we discard the expansion. */
+
+  /* Because of how the code that handles "" and '' in partially
+     quoted strings works, we need to make ISTRING into a QUOTED_NULL
+     if we saw quoting characters, but the expansion was empty.
+     "" and '' are tossed away before we get to this point when
+     processing partially quoted strings.  This makes "" and $xxx""
+     equivalent when xxx is unset.  We also look to see whether we
+     saw a quoted null from a ${} expansion and add one back if we
+     need to. */
+
+  /* If we expand to nothing and there were no single or double quotes
+     in the word, we throw it away.  Otherwise, we return a NULL word.
+     The single exception is for $@ surrounded by double quotes when
+     there are no positional parameters.  In that case, we also throw
+     the word away. */
+
+  if (*istring == '\0')
+    {
+      if (quoted_dollar_at == 0 && (had_quoted_null || quoted_state == PARTIALLY_QUOTED))
+       {
+         istring[0] = CTLNUL;
+         istring[1] = '\0';
+         tword = make_bare_word (istring);
+         tword->flags |= W_HASQUOTEDNULL;              /* XXX */
+         list = make_word_list (tword, (WORD_LIST *)NULL);
+         if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
+           tword->flags |= W_QUOTED;
+       }
+      /* According to sh, ksh, and Posix.2, if a word expands into nothing
+        and a double-quoted "$@" appears anywhere in it, then the entire
+        word is removed. */
+      else  if (quoted_state == UNQUOTED || quoted_dollar_at)
+       list = (WORD_LIST *)NULL;
+#if 0
+      else
+       {
+         tword = make_bare_word (istring);
+         if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
+           tword->flags |= W_QUOTED;
+         list = make_word_list (tword, (WORD_LIST *)NULL);
+       }
+#else
+      else
+       list = (WORD_LIST *)NULL;
+#endif
+    }
+  else if (word->flags & W_NOSPLIT)
+    {
+      tword = make_bare_word (istring);
+      if (word->flags & W_ASSIGNMENT)
+       tword->flags |= W_ASSIGNMENT;   /* XXX */
+      if (word->flags & W_COMPASSIGN)
+       tword->flags |= W_COMPASSIGN;   /* XXX */
+      if (word->flags & W_NOGLOB)
+       tword->flags |= W_NOGLOB;       /* XXX */
+      if (word->flags & W_NOBRACE)
+       tword->flags |= W_NOBRACE;      /* XXX */
+      if (word->flags & W_NOEXPAND)
+       tword->flags |= W_NOEXPAND;     /* XXX */
+      if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
+       tword->flags |= W_QUOTED;
+      if (had_quoted_null && QUOTED_NULL (istring))
+       tword->flags |= W_HASQUOTEDNULL;
+      list = make_word_list (tword, (WORD_LIST *)NULL);
+    }
+  else
+    {
+      char *ifs_chars;
+
+      ifs_chars = (quoted_dollar_at || has_dollar_at) ? ifs_value : (char *)NULL;
+
+      /* If we have $@, we need to split the results no matter what.  If
+        IFS is unset or NULL, string_list_dollar_at has separated the
+        positional parameters with a space, so we split on space (we have
+        set ifs_chars to " \t\n" above if ifs is unset).  If IFS is set,
+        string_list_dollar_at has separated the positional parameters
+        with the first character of $IFS, so we split on $IFS. */
+      if (has_dollar_at && ifs_chars)
+       list = list_string (istring, *ifs_chars ? ifs_chars : " ", 1);
+      else
+       {
+         tword = make_bare_word (istring);
+         if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) || (quoted_state == WHOLLY_QUOTED))
+           tword->flags |= W_QUOTED;
+         if (word->flags & W_ASSIGNMENT)
+           tword->flags |= W_ASSIGNMENT;
+         if (word->flags & W_COMPASSIGN)
+           tword->flags |= W_COMPASSIGN;
+         if (word->flags & W_NOGLOB)
+           tword->flags |= W_NOGLOB;
+         if (word->flags & W_NOBRACE)
+           tword->flags |= W_NOBRACE;
+         if (word->flags & W_NOEXPAND)
+           tword->flags |= W_NOEXPAND;
+         if (had_quoted_null && QUOTED_NULL (istring))
+           tword->flags |= W_HASQUOTEDNULL;    /* XXX */
+         list = make_word_list (tword, (WORD_LIST *)NULL);
+       }
+    }
+
+  free (istring);
+  return (list);
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*                Functions for Quote Removal                      */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Perform quote removal on STRING.  If QUOTED > 0, assume we are obeying the
+   backslash quoting rules for within double quotes or a here document. */
+char *
+string_quote_removal (string, quoted)
+     char *string;
+     int quoted;
+{
+  size_t slen;
+  char *r, *result_string, *temp, *send;
+  int sindex, tindex, dquote;
+  unsigned char c;
+  DECLARE_MBSTATE;
+
+  /* The result can be no longer than the original string. */
+  slen = strlen (string);
+  send = string + slen;
+
+  r = result_string = (char *)xmalloc (slen + 1);
+
+  for (dquote = sindex = 0; c = string[sindex];)
+    {
+      switch (c)
+       {
+       case '\\':
+         c = string[++sindex];
+         if (c == 0)
+           {
+             *r++ = '\\';
+             break;
+           }
+         if (((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || dquote) && (sh_syntaxtab[c] & CBSDQUOTE) == 0)
+           *r++ = '\\';
+         /* FALLTHROUGH */
+
+       default:
+         SCOPY_CHAR_M (r, string, send, sindex);
+         break;
+
+       case '\'':
+         if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || dquote)
+           {
+             *r++ = c;
+             sindex++;
+             break;
+           }
+         tindex = sindex + 1;
+         temp = string_extract_single_quoted (string, &tindex);
+         if (temp)
+           {
+             strcpy (r, temp);
+             r += strlen (r);
+             free (temp);
+           }
+         sindex = tindex;
+         break;
+
+       case '"':
+         dquote = 1 - dquote;
+         sindex++;
+         break;
+       }
+    }
+    *r = '\0';
+    return (result_string);
+}
+
+#if 0
+/* UNUSED */
+/* Perform quote removal on word WORD.  This allocates and returns a new
+   WORD_DESC *. */
+WORD_DESC *
+word_quote_removal (word, quoted)
+     WORD_DESC *word;
+     int quoted;
+{
+  WORD_DESC *w;
+  char *t;
+
+  t = string_quote_removal (word->word, quoted);
+  w = alloc_word_desc ();
+  w->word = t ? t : savestring ("");
+  return (w);
+}
+
+/* Perform quote removal on all words in LIST.  If QUOTED is non-zero,
+   the members of the list are treated as if they are surrounded by
+   double quotes.  Return a new list, or NULL if LIST is NULL. */
+WORD_LIST *
+word_list_quote_removal (list, quoted)
+     WORD_LIST *list;
+     int quoted;
+{
+  WORD_LIST *result, *t, *tresult, *e;
+
+  for (t = list, result = (WORD_LIST *)NULL; t; t = t->next)
+    {
+      tresult = make_word_list (word_quote_removal (t->word, quoted), (WORD_LIST *)NULL);
+#if 0
+      result = (WORD_LIST *) list_append (result, tresult);
+#else
+      if (result == 0)
+       result = e = tresult;
+      else
+       {
+         e->next = tresult;
+         while (e->next)
+           e = e->next;
+       }
+#endif
+    }
+  return (result);
+}
+#endif
+
+/*******************************************
+ *                                        *
+ *    Functions to perform word splitting  *
+ *                                        *
+ *******************************************/
+
+void
+setifs (v)
+     SHELL_VAR *v;
+{
+  char *t;
+  unsigned char uc;
+
+  ifs_var = v;
+  ifs_value = (v && value_cell (v)) ? value_cell (v) : " \t\n";
+
+  /* Should really merge ifs_cmap with sh_syntaxtab.  XXX - doesn't yet
+     handle multibyte chars in IFS */
+  memset (ifs_cmap, '\0', sizeof (ifs_cmap));
+  for (t = ifs_value ; t && *t; t++)
+    {
+      uc = *t;
+      ifs_cmap[uc] = 1;
+    }
+
+#if defined (HANDLE_MULTIBYTE)
+  if (ifs_value == 0)
+    {
+      ifs_firstc[0] = '\0';
+      ifs_firstc_len = 1;
+    }
+  else
+    {
+      size_t ifs_len;
+      ifs_len = strnlen (ifs_value, MB_CUR_MAX);
+      ifs_firstc_len = MBLEN (ifs_value, ifs_len);
+      if (ifs_firstc_len == 1 || ifs_firstc_len == 0 || MB_INVALIDCH (ifs_firstc_len))
+       {
+         ifs_firstc[0] = ifs_value[0];
+         ifs_firstc[1] = '\0';
+         ifs_firstc_len = 1;
+       }
+      else
+       memcpy (ifs_firstc, ifs_value, ifs_firstc_len);
+    }
+#else
+  ifs_firstc = ifs_value ? *ifs_value : 0;
+#endif
+}
+
+char *
+getifs ()
+{
+  return ifs_value;
+}
+
+/* This splits a single word into a WORD LIST on $IFS, but only if the word
+   is not quoted.  list_string () performs quote removal for us, even if we
+   don't do any splitting. */
+WORD_LIST *
+word_split (w, ifs_chars)
+     WORD_DESC *w;
+     char *ifs_chars;
+{
+  WORD_LIST *result;
+
+  if (w)
+    {
+      char *xifs;
+
+      xifs = ((w->flags & W_QUOTED) || ifs_chars == 0) ? "" : ifs_chars;
+      result = list_string (w->word, xifs, w->flags & W_QUOTED);
+    }
+  else
+    result = (WORD_LIST *)NULL;
+
+  return (result);
+}
+
+/* Perform word splitting on LIST and return the RESULT.  It is possible
+   to return (WORD_LIST *)NULL. */
+static WORD_LIST *
+word_list_split (list)
+     WORD_LIST *list;
+{
+  WORD_LIST *result, *t, *tresult, *e;
+
+  for (t = list, result = (WORD_LIST *)NULL; t; t = t->next)
+    {
+      tresult = word_split (t->word, ifs_value);
+      if (result == 0)
+        result = e = tresult;
+      else
+       {
+         e->next = tresult;
+         while (e->next)
+           e = e->next;
+       }
+    }
+  return (result);
+}
+
+/**************************************************
+ *                                               *
+ *    Functions to expand an entire WORD_LIST    *
+ *                                               *
+ **************************************************/
+
+/* Do any word-expansion-specific cleanup and jump to top_level */
+static void
+exp_jump_to_top_level (v)
+     int v;
+{
+  set_pipestatus_from_exit (last_command_exit_value);
+
+  /* Cleanup code goes here. */
+  expand_no_split_dollar_star = 0;     /* XXX */
+  expanding_redir = 0;
+  assigning_in_environment = 0;
+
+  if (parse_and_execute_level == 0)
+    top_level_cleanup ();                      /* from sig.c */
+
+  jump_to_top_level (v);
+}
+
+/* Put NLIST (which is a WORD_LIST * of only one element) at the front of
+   ELIST, and set ELIST to the new list. */
+#define PREPEND_LIST(nlist, elist) \
+       do { nlist->next = elist; elist = nlist; } while (0)
+
+/* Separate out any initial variable assignments from TLIST.  If set -k has
+   been executed, remove all assignment statements from TLIST.  Initial
+   variable assignments and other environment assignments are placed
+   on SUBST_ASSIGN_VARLIST. */
+static WORD_LIST *
+separate_out_assignments (tlist)
+     WORD_LIST *tlist;
+{
+  register WORD_LIST *vp, *lp;
+
+  if (tlist == 0)
+    return ((WORD_LIST *)NULL);
+
+  if (subst_assign_varlist)
+    dispose_words (subst_assign_varlist);      /* Clean up after previous error */
+
+  subst_assign_varlist = (WORD_LIST *)NULL;
+  vp = lp = tlist;
+
+  /* Separate out variable assignments at the start of the command.
+     Loop invariant: vp->next == lp
+     Loop postcondition:
+       lp = list of words left after assignment statements skipped
+       tlist = original list of words
+  */
+  while (lp && (lp->word->flags & W_ASSIGNMENT))
+    {
+      vp = lp;
+      lp = lp->next;
+    }
+
+  /* If lp != tlist, we have some initial assignment statements.
+     We make SUBST_ASSIGN_VARLIST point to the list of assignment
+     words and TLIST point to the remaining words.  */
+  if (lp != tlist)
+    {
+      subst_assign_varlist = tlist;
+      /* ASSERT(vp->next == lp); */
+      vp->next = (WORD_LIST *)NULL;    /* terminate variable list */
+      tlist = lp;                      /* remainder of word list */
+    }
+
+  /* vp == end of variable list */
+  /* tlist == remainder of original word list without variable assignments */
+  if (!tlist)
+    /* All the words in tlist were assignment statements */
+    return ((WORD_LIST *)NULL);
+
+  /* ASSERT(tlist != NULL); */
+  /* ASSERT((tlist->word->flags & W_ASSIGNMENT) == 0); */
+
+  /* If the -k option is in effect, we need to go through the remaining
+     words, separate out the assignment words, and place them on
+     SUBST_ASSIGN_VARLIST. */
+  if (place_keywords_in_env)
+    {
+      WORD_LIST *tp;   /* tp == running pointer into tlist */
+
+      tp = tlist;
+      lp = tlist->next;
+
+      /* Loop Invariant: tp->next == lp */
+      /* Loop postcondition: tlist == word list without assignment statements */
+      while (lp)
+       {
+         if (lp->word->flags & W_ASSIGNMENT)
+           {
+             /* Found an assignment statement, add this word to end of
+                subst_assign_varlist (vp). */
+             if (!subst_assign_varlist)
+               subst_assign_varlist = vp = lp;
+             else
+               {
+                 vp->next = lp;
+                 vp = lp;
+               }
+
+             /* Remove the word pointed to by LP from TLIST. */
+             tp->next = lp->next;
+             /* ASSERT(vp == lp); */
+             lp->next = (WORD_LIST *)NULL;
+             lp = tp->next;
+           }
+         else
+           {
+             tp = lp;
+             lp = lp->next;
+           }
+       }
+    }
+  return (tlist);
+}
+
+#define WEXP_VARASSIGN 0x001
+#define WEXP_BRACEEXP  0x002
+#define WEXP_TILDEEXP  0x004
+#define WEXP_PARAMEXP  0x008
+#define WEXP_PATHEXP   0x010
+
+/* All of the expansions, including variable assignments at the start of
+   the list. */
+#define WEXP_ALL       (WEXP_VARASSIGN|WEXP_BRACEEXP|WEXP_TILDEEXP|WEXP_PARAMEXP|WEXP_PATHEXP)
+
+/* All of the expansions except variable assignments at the start of
+   the list. */
+#define WEXP_NOVARS    (WEXP_BRACEEXP|WEXP_TILDEEXP|WEXP_PARAMEXP|WEXP_PATHEXP)
+
+/* All of the `shell expansions': brace expansion, tilde expansion, parameter
+   expansion, command substitution, arithmetic expansion, word splitting, and
+   quote removal. */
+#define WEXP_SHELLEXP  (WEXP_BRACEEXP|WEXP_TILDEEXP|WEXP_PARAMEXP)
+
+/* Take the list of words in LIST and do the various substitutions.  Return
+   a new list of words which is the expanded list, and without things like
+   variable assignments. */
+
+WORD_LIST *
+expand_words (list)
+     WORD_LIST *list;
+{
+  return (expand_word_list_internal (list, WEXP_ALL));
+}
+
+/* Same as expand_words (), but doesn't hack variable or environment
+   variables. */
+WORD_LIST *
+expand_words_no_vars (list)
+     WORD_LIST *list;
+{
+  return (expand_word_list_internal (list, WEXP_NOVARS));
+}
+
+WORD_LIST *
+expand_words_shellexp (list)
+     WORD_LIST *list;
+{
+  return (expand_word_list_internal (list, WEXP_SHELLEXP));
+}
+
+static WORD_LIST *
+glob_expand_word_list (tlist, eflags)
+     WORD_LIST *tlist;
+     int eflags;
+{
+  char **glob_array, *temp_string;
+  register int glob_index;
+  WORD_LIST *glob_list, *output_list, *disposables, *next;
+  WORD_DESC *tword;
+
+  output_list = disposables = (WORD_LIST *)NULL;
+  glob_array = (char **)NULL;
+  while (tlist)
+    {
+      /* For each word, either globbing is attempted or the word is
+        added to orig_list.  If globbing succeeds, the results are
+        added to orig_list and the word (tlist) is added to the list
+        of disposable words.  If globbing fails and failed glob
+        expansions are left unchanged (the shell default), the
+        original word is added to orig_list.  If globbing fails and
+        failed glob expansions are removed, the original word is
+        added to the list of disposable words.  orig_list ends up
+        in reverse order and requires a call to REVERSE_LIST to
+        be set right.  After all words are examined, the disposable
+        words are freed. */
+      next = tlist->next;
+
+      /* If the word isn't an assignment and contains an unquoted
+        pattern matching character, then glob it. */
+      if ((tlist->word->flags & W_NOGLOB) == 0 &&
+         unquoted_glob_pattern_p (tlist->word->word))
+       {
+         glob_array = shell_glob_filename (tlist->word->word);
+
+         /* Handle error cases.
+            I don't think we should report errors like "No such file
+            or directory".  However, I would like to report errors
+            like "Read failed". */
+
+         if (glob_array == 0 || GLOB_FAILED (glob_array))
+           {
+             glob_array = (char **)xmalloc (sizeof (char *));
+             glob_array[0] = (char *)NULL;
+           }
+
+         /* Dequote the current word in case we have to use it. */
+         if (glob_array[0] == NULL)
+           {
+             temp_string = dequote_string (tlist->word->word);
+             free (tlist->word->word);
+             tlist->word->word = temp_string;
+           }
+
+         /* Make the array into a word list. */
+         glob_list = (WORD_LIST *)NULL;
+         for (glob_index = 0; glob_array[glob_index]; glob_index++)
+           {
+             tword = make_bare_word (glob_array[glob_index]);
+             tword->flags |= W_GLOBEXP;        /* XXX */
+             glob_list = make_word_list (tword, glob_list);
+           }
+
+         if (glob_list)
+           {
+             output_list = (WORD_LIST *)list_append (glob_list, output_list);
+             PREPEND_LIST (tlist, disposables);
+           }
+         else if (fail_glob_expansion != 0)
+           {
+             last_command_exit_value = EXECUTION_FAILURE;
+             report_error (_("no match: %s"), tlist->word->word);
+             exp_jump_to_top_level (DISCARD);
+           }
+         else if (allow_null_glob_expansion == 0)
+           {
+             /* Failed glob expressions are left unchanged. */
+             PREPEND_LIST (tlist, output_list);
+           }
+         else
+           {
+             /* Failed glob expressions are removed. */
+             PREPEND_LIST (tlist, disposables);
+           }
+       }
+      else
+       {
+         /* Dequote the string. */
+         temp_string = dequote_string (tlist->word->word);
+         free (tlist->word->word);
+         tlist->word->word = temp_string;
+         PREPEND_LIST (tlist, output_list);
+       }
+
+      strvec_dispose (glob_array);
+      glob_array = (char **)NULL;
+
+      tlist = next;
+    }
+
+  if (disposables)
+    dispose_words (disposables);
+
+  if (output_list)
+    output_list = REVERSE_LIST (output_list, WORD_LIST *);
+
+  return (output_list);
+}
+
+#if defined (BRACE_EXPANSION)
+static WORD_LIST *
+brace_expand_word_list (tlist, eflags)
+     WORD_LIST *tlist;
+     int eflags;
+{
+  register char **expansions;
+  char *temp_string;
+  WORD_LIST *disposables, *output_list, *next;
+  WORD_DESC *w;
+  int eindex;
+
+  for (disposables = output_list = (WORD_LIST *)NULL; tlist; tlist = next)
+    {
+      next = tlist->next;
+
+      if (tlist->word->flags & W_NOBRACE)
+        {
+itrace("brace_expand_word_list: %s: W_NOBRACE", tlist->word->word);
+         PREPEND_LIST (tlist, output_list);
+         continue;
+        }
+
+      if ((tlist->word->flags & (W_COMPASSIGN|W_ASSIGNARG)) == (W_COMPASSIGN|W_ASSIGNARG))
+        {
+/*itrace("brace_expand_word_list: %s: W_COMPASSIGN|W_ASSIGNARG", tlist->word->word);*/
+         PREPEND_LIST (tlist, output_list);
+         continue;
+        }
+
+      /* Only do brace expansion if the word has a brace character.  If
+        not, just add the word list element to BRACES and continue.  In
+        the common case, at least when running shell scripts, this will
+        degenerate to a bunch of calls to `mbschr', and then what is
+        basically a reversal of TLIST into BRACES, which is corrected
+        by a call to REVERSE_LIST () on BRACES when the end of TLIST
+        is reached. */
+      if (mbschr (tlist->word->word, LBRACE))
+       {
+         expansions = brace_expand (tlist->word->word);
+
+         for (eindex = 0; temp_string = expansions[eindex]; eindex++)
+           {
+             w = alloc_word_desc ();
+             w->word = temp_string;
+
+             /* If brace expansion didn't change the word, preserve
+                the flags.  We may want to preserve the flags
+                unconditionally someday -- XXX */
+             if (STREQ (temp_string, tlist->word->word))
+               w->flags = tlist->word->flags;
+             else
+               w = make_word_flags (w, temp_string);
+
+             output_list = make_word_list (w, output_list);
+           }
+         free (expansions);
+
+         /* Add TLIST to the list of words to be freed after brace
+            expansion has been performed. */
+         PREPEND_LIST (tlist, disposables);
+       }
+      else
+       PREPEND_LIST (tlist, output_list);
+    }
+
+  if (disposables)
+    dispose_words (disposables);
+
+  if (output_list)
+    output_list = REVERSE_LIST (output_list, WORD_LIST *);
+
+  return (output_list);
+}
+#endif
+
+#if defined (ARRAY_VARS)
+/* Take WORD, a compound associative array assignment, and internally run
+   'declare -A w', where W is the variable name portion of WORD. */
+static int
+make_internal_declare (word, option)
+     char *word;
+     char *option;
+{
+  int t;
+  WORD_LIST *wl;
+  WORD_DESC *w;
+
+  w = make_word (word);
+
+  t = assignment (w->word, 0);
+  w->word[t] = '\0';
+
+  wl = make_word_list (w, (WORD_LIST *)NULL);
+  wl = make_word_list (make_word (option), wl);
+
+  return (declare_builtin (wl));  
+}  
+#endif
+
+static WORD_LIST *
+shell_expand_word_list (tlist, eflags)
+     WORD_LIST *tlist;
+     int eflags;
+{
+  WORD_LIST *expanded, *orig_list, *new_list, *next, *temp_list;
+  int expanded_something, has_dollar_at;
+  char *temp_string;
+
+  /* We do tilde expansion all the time.  This is what 1003.2 says. */
+  new_list = (WORD_LIST *)NULL;
+  for (orig_list = tlist; tlist; tlist = next)
+    {
+      temp_string = tlist->word->word;
+
+      next = tlist->next;
+
+#if defined (ARRAY_VARS)
+      /* If this is a compound array assignment to a builtin that accepts
+         such assignments (e.g., `declare'), take the assignment and perform
+         it separately, handling the semantics of declarations inside shell
+         functions.  This avoids the double-evaluation of such arguments,
+         because `declare' does some evaluation of compound assignments on
+         its own. */
+      if ((tlist->word->flags & (W_COMPASSIGN|W_ASSIGNARG)) == (W_COMPASSIGN|W_ASSIGNARG))
+       {
+         int t;
+
+         if (tlist->word->flags & W_ASSIGNASSOC)
+           make_internal_declare (tlist->word->word, "-A");
+
+         t = do_word_assignment (tlist->word, 0);
+         if (t == 0)
+           {
+             last_command_exit_value = EXECUTION_FAILURE;
+             exp_jump_to_top_level (DISCARD);
+           }
+
+         /* Now transform the word as ksh93 appears to do and go on */
+         t = assignment (tlist->word->word, 0);
+         tlist->word->word[t] = '\0';
+         tlist->word->flags &= ~(W_ASSIGNMENT|W_NOSPLIT|W_COMPASSIGN|W_ASSIGNARG|W_ASSIGNASSOC);
+       }
+#endif
+
+      expanded_something = 0;
+      expanded = expand_word_internal
+       (tlist->word, 0, 0, &has_dollar_at, &expanded_something);
+
+      if (expanded == &expand_word_error || expanded == &expand_word_fatal)
+       {
+         /* By convention, each time this error is returned,
+            tlist->word->word has already been freed. */
+         tlist->word->word = (char *)NULL;
+
+         /* Dispose our copy of the original list. */
+         dispose_words (orig_list);
+         /* Dispose the new list we're building. */
+         dispose_words (new_list);
+
+         last_command_exit_value = EXECUTION_FAILURE;
+         if (expanded == &expand_word_error)
+           exp_jump_to_top_level (DISCARD);
+         else
+           exp_jump_to_top_level (FORCE_EOF);
+       }
+
+      /* Don't split words marked W_NOSPLIT. */
+      if (expanded_something && (tlist->word->flags & W_NOSPLIT) == 0)
+       {
+         temp_list = word_list_split (expanded);
+         dispose_words (expanded);
+       }
+      else
+       {
+         /* If no parameter expansion, command substitution, process
+            substitution, or arithmetic substitution took place, then
+            do not do word splitting.  We still have to remove quoted
+            null characters from the result. */
+         word_list_remove_quoted_nulls (expanded);
+         temp_list = expanded;
+       }
+
+      expanded = REVERSE_LIST (temp_list, WORD_LIST *);
+      new_list = (WORD_LIST *)list_append (expanded, new_list);
+    }
+
+  if (orig_list)  
+    dispose_words (orig_list);
+
+  if (new_list)
+    new_list = REVERSE_LIST (new_list, WORD_LIST *);
+
+  return (new_list);
+}
+
+/* The workhorse for expand_words () and expand_words_no_vars ().
+   First arg is LIST, a WORD_LIST of words.
+   Second arg EFLAGS is a flags word controlling which expansions are
+   performed.
+
+   This does all of the substitutions: brace expansion, tilde expansion,
+   parameter expansion, command substitution, arithmetic expansion,
+   process substitution, word splitting, and pathname expansion, according
+   to the bits set in EFLAGS.  Words with the W_QUOTED or W_NOSPLIT bits
+   set, or for which no expansion is done, do not undergo word splitting.
+   Words with the W_NOGLOB bit set do not undergo pathname expansion; words
+   with W_NOBRACE set do not undergo brace expansion (see
+   brace_expand_word_list above). */
+static WORD_LIST *
+expand_word_list_internal (list, eflags)
+     WORD_LIST *list;
+     int eflags;
+{
+  WORD_LIST *new_list, *temp_list;
+  int tint;
+
+  if (list == 0)
+    return ((WORD_LIST *)NULL);
+
+  garglist = new_list = copy_word_list (list);
+  if (eflags & WEXP_VARASSIGN)
+    {
+      garglist = new_list = separate_out_assignments (new_list);
+      if (new_list == 0)
+       {
+         if (subst_assign_varlist)
+           {
+             /* All the words were variable assignments, so they are placed
+                into the shell's environment. */
+             for (temp_list = subst_assign_varlist; temp_list; temp_list = temp_list->next)
+               {
+                 this_command_name = (char *)NULL;     /* no arithmetic errors */
+                 tint = do_word_assignment (temp_list->word, 0);
+                 /* Variable assignment errors in non-interactive shells
+                    running in Posix.2 mode cause the shell to exit. */
+                 if (tint == 0)
+                   {
+                     last_command_exit_value = EXECUTION_FAILURE;
+                     if (interactive_shell == 0 && posixly_correct)
+                       exp_jump_to_top_level (FORCE_EOF);
+                     else
+                       exp_jump_to_top_level (DISCARD);
+                   }
+               }
+             dispose_words (subst_assign_varlist);
+             subst_assign_varlist = (WORD_LIST *)NULL;
+           }
+         return ((WORD_LIST *)NULL);
+       }
+    }
+
+  /* Begin expanding the words that remain.  The expansions take place on
+     things that aren't really variable assignments. */
+
+#if defined (BRACE_EXPANSION)
+  /* Do brace expansion on this word if there are any brace characters
+     in the string. */
+  if ((eflags & WEXP_BRACEEXP) && brace_expansion && new_list)
+    new_list = brace_expand_word_list (new_list, eflags);
+#endif /* BRACE_EXPANSION */
+
+  /* Perform the `normal' shell expansions: tilde expansion, parameter and
+     variable substitution, command substitution, arithmetic expansion,
+     and word splitting. */
+  new_list = shell_expand_word_list (new_list, eflags);
+
+  /* Okay, we're almost done.  Now let's just do some filename
+     globbing. */
+  if (new_list)
+    {
+      if ((eflags & WEXP_PATHEXP) && disallow_filename_globbing == 0)
+       /* Glob expand the word list unless globbing has been disabled. */
+       new_list = glob_expand_word_list (new_list, eflags);
+      else
+       /* Dequote the words, because we're not performing globbing. */
+       new_list = dequote_list (new_list);
+    }
+
+  if ((eflags & WEXP_VARASSIGN) && subst_assign_varlist)
+    {
+      sh_wassign_func_t *assign_func;
+      int is_special_builtin, is_builtin_or_func;
+
+      /* If the remainder of the words expand to nothing, Posix.2 requires
+        that the variable and environment assignments affect the shell's
+        environment. */
+      assign_func = new_list ? assign_in_env : do_word_assignment;
+      tempenv_assign_error = 0;
+
+      is_builtin_or_func = (new_list && new_list->word && (find_shell_builtin (new_list->word->word) || find_function (new_list->word->word)));
+      /* Posix says that special builtins exit if a variable assignment error
+        occurs in an assignment preceding it. */
+      is_special_builtin = (posixly_correct && new_list && new_list->word && find_special_builtin (new_list->word->word));
+      
+      for (temp_list = subst_assign_varlist; temp_list; temp_list = temp_list->next)
+       {
+         this_command_name = (char *)NULL;
+         assigning_in_environment = (assign_func == assign_in_env);
+         tint = (*assign_func) (temp_list->word, is_builtin_or_func);
+         assigning_in_environment = 0;
+         /* Variable assignment errors in non-interactive shells running
+            in Posix.2 mode cause the shell to exit. */
+         if (tint == 0)
+           {
+             if (assign_func == do_word_assignment)
+               {
+                 last_command_exit_value = EXECUTION_FAILURE;
+                 if (interactive_shell == 0 && posixly_correct && is_special_builtin)
+                   exp_jump_to_top_level (FORCE_EOF);
+                 else
+                   exp_jump_to_top_level (DISCARD);
+               }
+             else
+               tempenv_assign_error++;
+           }
+       }
+
+      dispose_words (subst_assign_varlist);
+      subst_assign_varlist = (WORD_LIST *)NULL;
+    }
+
+#if 0
+  tint = list_length (new_list) + 1;
+  RESIZE_MALLOCED_BUFFER (glob_argv_flags, 0, tint, glob_argv_flags_size, 16);
+  for (tint = 0, temp_list = new_list; temp_list; temp_list = temp_list->next)
+    glob_argv_flags[tint++] = (temp_list->word->flags & W_GLOBEXP) ? '1' : '0';
+  glob_argv_flags[tint] = '\0';
+#endif
+
+  return (new_list);
+}