diff options
author | Chet Ramey <chet@caleb.ins.cwru.edu> | 2012-10-10 09:36:15 -0400 |
---|---|---|
committer | Chet Ramey <chet@caleb.ins.cwru.edu> | 2012-10-10 09:36:15 -0400 |
commit | f14388d3aa62c502e8a30ce061793ec831365191 (patch) | |
tree | 8ca25a328791ad27ab8d4b168a8e4a36bb85a37e | |
parent | c84e520283af3b2be42c4ea9fa69b590d5d1f830 (diff) | |
download | bash-f14388d3aa62c502e8a30ce061793ec831365191.tar.gz |
commit bash-20120914 snapshot
-rw-r--r-- | CWRU/CWRU.chlog | 40 | ||||
-rw-r--r-- | CWRU/CWRU.chlog~ | 46 | ||||
-rw-r--r-- | autom4te.cache/output.3 | 16 | ||||
-rw-r--r-- | autom4te.cache/traces.3 | 3287 | ||||
-rw-r--r-- | bashline.c | 5 | ||||
-rw-r--r-- | config.h.in | 9 | ||||
-rwxr-xr-x | configure | 16 | ||||
-rw-r--r-- | configure.ac | 8 | ||||
-rw-r--r-- | doc/bashref.texi | 5 | ||||
-rw-r--r-- | doc/version.texi | 12 | ||||
-rw-r--r-- | execute_cmd.c | 4 | ||||
-rw-r--r-- | execute_cmd.c~ | 5363 | ||||
-rw-r--r-- | lib/glob/sm_loop.c | 2 | ||||
-rw-r--r-- | lib/glob/sm_loop.c~ | 773 | ||||
-rw-r--r-- | lib/readline/colors.h | 4 | ||||
-rw-r--r-- | lib/readline/colors.h~ | 118 | ||||
-rw-r--r-- | lib/sh/shquote.c | 2 | ||||
-rw-r--r-- | lib/sh/shquote.c~ | 304 | ||||
-rw-r--r-- | parse.y | 20 | ||||
-rw-r--r-- | po/vi.po | 4021 | ||||
-rw-r--r-- | shell.c | 2 | ||||
-rw-r--r-- | subst.c | 2 | ||||
-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]) @@ -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. */ @@ -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); +} @@ -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 */ @@ -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" @@ -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 }, @@ -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, "ed_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); +} |