summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChet Ramey <chet@caleb.ins.cwru.edu>2012-10-10 09:36:15 -0400
committerChet Ramey <chet@caleb.ins.cwru.edu>2012-10-10 09:36:15 -0400
commitf14388d3aa62c502e8a30ce061793ec831365191 (patch)
tree8ca25a328791ad27ab8d4b168a8e4a36bb85a37e
parentc84e520283af3b2be42c4ea9fa69b590d5d1f830 (diff)
downloadbash-f14388d3aa62c502e8a30ce061793ec831365191.tar.gz
commit bash-20120914 snapshot
-rw-r--r--CWRU/CWRU.chlog40
-rw-r--r--CWRU/CWRU.chlog~46
-rw-r--r--autom4te.cache/output.316
-rw-r--r--autom4te.cache/traces.33287
-rw-r--r--bashline.c5
-rw-r--r--config.h.in9
-rwxr-xr-xconfigure16
-rw-r--r--configure.ac8
-rw-r--r--doc/bashref.texi5
-rw-r--r--doc/version.texi12
-rw-r--r--execute_cmd.c4
-rw-r--r--execute_cmd.c~5363
-rw-r--r--lib/glob/sm_loop.c2
-rw-r--r--lib/glob/sm_loop.c~773
-rw-r--r--lib/readline/colors.h4
-rw-r--r--lib/readline/colors.h~118
-rw-r--r--lib/sh/shquote.c2
-rw-r--r--lib/sh/shquote.c~304
-rw-r--r--parse.y20
-rw-r--r--po/vi.po4021
-rw-r--r--shell.c2
-rw-r--r--subst.c2
-rw-r--r--subst.c~9515
23 files changed, 19712 insertions, 3862 deletions
diff --git a/CWRU/CWRU.chlog b/CWRU/CWRU.chlog
index 278c047f..59f95de9 100644
--- a/CWRU/CWRU.chlog
+++ b/CWRU/CWRU.chlog
@@ -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>
diff --git a/CWRU/CWRU.chlog~ b/CWRU/CWRU.chlog~
index 50222820..32ab9149 100644
--- a/CWRU/CWRU.chlog~
+++ b/CWRU/CWRU.chlog~
@@ -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>
diff --git a/autom4te.cache/output.3 b/autom4te.cache/output.3
index 96bc37b3..8974b319 100644
--- a/autom4te.cache/output.3
+++ b/autom4te.cache/output.3
@@ -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
@@ -3285,6 +3295,10 @@ 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
$as_echo "@%:@define MEMSCRAMBLE 1" >>confdefs.h
diff --git a/autom4te.cache/traces.3 b/autom4te.cache/traces.3
index b09e4820..8994efa0 100644
--- a/autom4te.cache/traces.3
+++ b/autom4te.cache/traces.3
@@ -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])
diff --git a/bashline.c b/bashline.c
index 67a6e514..8933a3bb 100644
--- a/bashline.c
+++ b/bashline.c
@@ -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
diff --git a/config.h.in b/config.h.in
index b9f7f9c4..6a42e166 100644
--- a/config.h.in
+++ b/config.h.in
@@ -160,9 +160,6 @@
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
@@ -170,6 +167,12 @@
/* 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. */
diff --git a/configure b/configure
index 101be4e1..a40e9aa2 100755
--- 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
@@ -3285,6 +3295,10 @@ 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
$as_echo "#define MEMSCRAMBLE 1" >>confdefs.h
diff --git a/configure.ac b/configure.ac
index 7b60cb0a..f3d54f93 100644
--- a/configure.ac
+++ b/configure.ac
@@ -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)
diff --git a/doc/bashref.texi b/doc/bashref.texi
index fa21eb12..315f4bdc 100644
--- a/doc/bashref.texi
+++ b/doc/bashref.texi
@@ -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
diff --git a/doc/version.texi b/doc/version.texi
index 4b72d5d7..0b8c3d0c 100644
--- a/doc/version.texi
+++ b/doc/version.texi
@@ -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
diff --git a/execute_cmd.c b/execute_cmd.c
index acc5318e..55f7f51c 100644
--- a/execute_cmd.c
+++ b/execute_cmd.c
@@ -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
index 00000000..acc5318e
--- /dev/null
+++ b/execute_cmd.c~
@@ -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__ */
+ }
+}
diff --git a/lib/glob/sm_loop.c b/lib/glob/sm_loop.c
index 6e1e0a1e..ff5adb31 100644
--- a/lib/glob/sm_loop.c
+++ b/lib/glob/sm_loop.c
@@ -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
index 00000000..6e1e0a1e
--- /dev/null
+++ b/lib/glob/sm_loop.c~
@@ -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
diff --git a/lib/readline/colors.h b/lib/readline/colors.h
index cd217e42..fc926e53 100644
--- a/lib/readline/colors.h
+++ b/lib/readline/colors.h
@@ -29,6 +29,10 @@
#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
index 00000000..cd217e42
--- /dev/null
+++ b/lib/readline/colors.h~
@@ -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_ */
diff --git a/lib/sh/shquote.c b/lib/sh/shquote.c
index 1c30bf43..c79ba9cd 100644
--- a/lib/sh/shquote.c
+++ b/lib/sh/shquote.c
@@ -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
index 00000000..1c30bf43
--- /dev/null
+++ b/lib/sh/shquote.c~
@@ -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 c0da6301..2ffb5e0a 100644
--- 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 */
diff --git a/po/vi.po b/po/vi.po
index 1f332605..4d0dcb07 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -3,109 +3,107 @@
# 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 đồ nhận diện hợp lệ"
+msgstr "`%s': không phải định 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 tại"
#: 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 hư"
#: 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 có 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] [đối_số ...]"
+msgstr "echo [-neE] [ĐỐI-SỐ ...]"
#: builtins.c:87
msgid "echo [-n] [arg ...]"
-msgstr "echo [-n] [đối_số ...]"
+msgstr "echo [-n] [ĐỐI-SỐ ...]"
#: 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 [đối_số ...]"
+msgstr "eval [ĐỐI-SỐ ...]"
#: 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 [đặc_tả_công_việc]"
+msgstr "fg [ĐTCV]"
#: builtins.c:111
msgid "bg [job_spec ...]"
-msgstr "bg [đặc_tả_công_việc ...]"
+msgstr "bg [ĐTCV ...]"
#: builtins.c:114
msgid "hash [-lr] [-p pathname] [-dt] [name ...]"
-msgstr "hash [-lr] [-p đường_dẫn] [-dt] [tên ...]"
+msgstr "hash [-lr] [-p ĐƯỜNG-DẪN] [-dt] [TÊN ...]"
#: 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] [đặc_tả_công_việc ...]"
+msgstr "disown [-h] [-ar] [ĐTCV ...]"
#: 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 đối_số [đối_số ...]"
+msgstr "let ĐỐI-SỐ [ĐỐI-SỐ ...]"
#: 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 "[ đối_số ... ]"
+msgstr "[ ĐỐI-SỐ ... ]"
#: builtins.c:162
msgid "times"
-msgstr "lần"
+msgstr "times"
#: builtins.c:164
msgid "trap [-lp] [[arg] signal_spec ...]"
-msgstr "trap [-lp] [[đối_số] đặc_tả_tín_hiệu ...]"
+msgstr "trap [-lp] [[ĐỐI-SỐ] ĐTTH ...]"
#: 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 "đặc_tả_công_việc [&]"
+msgstr "ĐTCV [&]"
#: 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ột chức năng trình bao.\n"
+"Trở về 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ệnh dựa vào khớp mẫu.\n"
+"Thực thi lệnh chọn 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ệnh làm cùng một đơn vị.\n"
+"Nhóm lệnh 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 eebcc394..93b6b9b1 100644
--- 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 e09d24b3..4c033a87 100644
--- 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
index 00000000..e09d24b3
--- /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);
+}