source: patches/bash-4.3-branch_update-5.patch@ 3f72431

systemd
Last change on this file since 3f72431 was 75a0579, checked in by William Harrington <kb0iic@…>, 10 years ago

Add bash-4.3-branch_update-5.patch for patch level 30. Thanks to zippo for the nudge.

  • Property mode set to 100644
File size: 126.1 KB
  • arrayfunc.c

    Submitted By: William Harrington (kb0iic at cross-lfs dot org)
    Date: 10-10-2014
    Initial Package Version: 4.3
    Origin: Upstream
    Upstream Status: Applied
    Description: Contains all upstream patches up to 4.3-030
    
    diff -Naur bash-4.3.orig/arrayfunc.c bash-4.3/arrayfunc.c
    old new  
    179179    array_insert (array_cell (entry), ind, newval);
    180180  FREE (newval);
    181181
     182  VUNSETATTR (entry, att_invisible);    /* no longer invisible */
    182183  return (entry);
    183184}
    184185
     
    597598      if (assoc_p (var))
    598599        {
    599600          val = expand_assignment_string_to_string (val, 0);
     601          if (val == 0)
     602            {
     603              val = (char *)xmalloc (1);
     604              val[0] = '\0';    /* like do_assignment_internal */
     605            }
    600606          free_val = 1;
    601607        }
    602608
  • bashline.c

    diff -Naur bash-4.3.orig/bashline.c bash-4.3/bashline.c
    old new  
    41674167  int qc;
    41684168
    41694169  qc = rl_dispatching ? rl_completion_quote_character : 0; 
    4170   dfn = bash_dequote_filename ((char *)text, qc);
     4170  /* If rl_completion_found_quote != 0, rl_completion_matches will call the
     4171     filename dequoting function, causing the directory name to be dequoted
     4172     twice. */
     4173  if (rl_dispatching && rl_completion_found_quote == 0)
     4174    dfn = bash_dequote_filename ((char *)text, qc);
     4175  else
     4176    dfn = (char *)text;
    41714177  m1 = rl_completion_matches (dfn, rl_filename_completion_function);
    4172   free (dfn);
     4178  if (dfn != text)
     4179    free (dfn);
    41734180
    41744181  if (m1 == 0 || m1[0] == 0)
    41754182    return m1;
  • builtins/common.h

    diff -Naur bash-4.3.orig/builtins/common.h bash-4.3/builtins/common.h
    old new  
    3333#define SEVAL_RESETLINE 0x010
    3434#define SEVAL_PARSEONLY 0x020
    3535#define SEVAL_NOLONGJMP 0x040
     36#define SEVAL_FUNCDEF   0x080           /* only allow function definitions */
     37#define SEVAL_ONECMD    0x100           /* only allow a single command */
    3638
    3739/* Flags for describe_command, shared between type.def and command.def */
    3840#define CDESC_ALL               0x001   /* type -a */
  • builtins/evalstring.c

    diff -Naur bash-4.3.orig/builtins/evalstring.c bash-4.3/builtins/evalstring.c
    old new  
    308308            {
    309309              struct fd_bitmap *bitmap;
    310310
     311              if (flags & SEVAL_FUNCDEF)
     312                {
     313                  char *x;
     314
     315                  /* If the command parses to something other than a straight
     316                     function definition, or if we have not consumed the entire
     317                     string, or if the parser has transformed the function
     318                     name (as parsing will if it begins or ends with shell
     319                     whitespace, for example), reject the attempt */
     320                  if (command->type != cm_function_def ||
     321                      ((x = parser_remaining_input ()) && *x) ||
     322                      (STREQ (from_file, command->value.Function_def->name->word) == 0))
     323                    {
     324                      internal_warning (_("%s: ignoring function definition attempt"), from_file);
     325                      should_jump_to_top_level = 0;
     326                      last_result = last_command_exit_value = EX_BADUSAGE;
     327                      reset_parser ();
     328                      break;
     329                    }
     330                }
     331
    311332              bitmap = new_fd_bitmap (FD_BITMAP_SIZE);
    312333              begin_unwind_frame ("pe_dispose");
    313334              add_unwind_protect (dispose_fd_bitmap, bitmap);
     
    368389              dispose_command (command);
    369390              dispose_fd_bitmap (bitmap);
    370391              discard_unwind_frame ("pe_dispose");
     392
     393              if (flags & SEVAL_ONECMD)
     394                {
     395                  reset_parser ();
     396                  break;
     397                }
    371398            }
    372399        }
    373400      else
  • builtins/read.def

    diff -Naur bash-4.3.orig/builtins/read.def bash-4.3/builtins/read.def
    old new  
    442442      add_unwind_protect (reset_alarm, (char *)NULL);
    443443#if defined (READLINE)
    444444      if (edit)
    445         add_unwind_protect (reset_attempted_completion_function, (char *)NULL);
     445        {
     446          add_unwind_protect (reset_attempted_completion_function, (char *)NULL);
     447          add_unwind_protect (bashline_reset_event_hook, (char *)NULL);
     448        }
    446449#endif
    447450      falarm (tmsec, tmusec);
    448451    }
     
    10211024
    10221025  old_attempted_completion_function = rl_attempted_completion_function;
    10231026  rl_attempted_completion_function = (rl_completion_func_t *)NULL;
     1027  bashline_set_event_hook ();
    10241028  if (itext)
    10251029    {
    10261030      old_startup_hook = rl_startup_hook;
     
    10321036
    10331037  rl_attempted_completion_function = old_attempted_completion_function;
    10341038  old_attempted_completion_function = (rl_completion_func_t *)NULL;
     1039  bashline_reset_event_hook ();
    10351040
    10361041  if (ret == 0)
    10371042    return ret;
  • copy_cmd.c

    diff -Naur bash-4.3.orig/copy_cmd.c bash-4.3/copy_cmd.c
    old new  
    126126    {
    127127    case r_reading_until:
    128128    case r_deblank_reading_until:
    129       new_redirect->here_doc_eof = savestring (redirect->here_doc_eof);
     129      new_redirect->here_doc_eof = redirect->here_doc_eof ? savestring (redirect->here_doc_eof) : 0;
    130130      /*FALLTHROUGH*/
    131131    case r_reading_string:
    132132    case r_appending_to:
  • execute_cmd.c

    diff -Naur bash-4.3.orig/execute_cmd.c bash-4.3/execute_cmd.c
    old new  
    24092409#endif
    24102410      lstdin = wait_for (lastpid);
    24112411#if defined (JOB_CONTROL)
    2412       exec_result = job_exit_status (lastpipe_jid);
     2412      /* If wait_for removes the job from the jobs table, use result of last
     2413         command as pipeline's exit status as usual.  The jobs list can get
     2414         frozen and unfrozen at inconvenient times if there are multiple pipelines
     2415         running simultaneously. */
     2416      if (INVALID_JOB (lastpipe_jid) == 0)
     2417        exec_result = job_exit_status (lastpipe_jid);
     2418      else if (pipefail_opt)
     2419        exec_result = exec_result | lstdin;     /* XXX */
     2420      /* otherwise we use exec_result */
     2421       
    24132422#endif
    24142423      unfreeze_jobs_list ();
    24152424    }
  • externs.h

    diff -Naur bash-4.3.orig/externs.h bash-4.3/externs.h
    old new  
    324324extern char *sh_backslash_quote __P((char *, const char *, int));
    325325extern char *sh_backslash_quote_for_double_quotes __P((char *));
    326326extern int sh_contains_shell_metas __P((char *));
     327extern int sh_contains_quotes __P((char *));
    327328
    328329/* declarations for functions defined in lib/sh/spell.c */
    329330extern int spname __P((char *, char *));
  • bash-4.3

    diff -Naur bash-4.3.orig/jobs.c bash-4.3/jobs.c
    old new  
    35973597  unwind_protect_int (jobs_list_frozen);
    35983598  unwind_protect_pointer (the_pipeline);
    35993599  unwind_protect_pointer (subst_assign_varlist);
     3600  unwind_protect_pointer (this_shell_builtin);
    36003601
    36013602  /* We have to add the commands this way because they will be run
    36023603     in reverse order of adding.  We don't want maybe_set_sigchld_trap ()
     
    43744375void
    43754376end_job_control ()
    43764377{
    4377   if (interactive_shell)                /* XXX - should it be interactive? */
     4378  if (interactive_shell || job_control)         /* XXX - should it be just job_control? */
    43784379    {
    43794380      terminate_stopped_jobs ();
    43804381
  • lib/glob/glob.c

    diff -Naur bash-4.3.orig/lib/glob/glob.c bash-4.3/lib/glob/glob.c
    old new  
    123123extern char *glob_patscan __P((char *, char *, int));
    124124extern wchar_t *glob_patscan_wc __P((wchar_t *, wchar_t *, int));
    125125
     126extern char *glob_dirscan __P((char *, int));
     127
    126128/* Compile `glob_loop.c' for single-byte characters. */
    127129#define CHAR    unsigned char
    128130#define INT     int
     
    179181     char *pat, *dname;
    180182     int flags;
    181183{
    182   char *pp, *pe, *t;
    183   int n, r;
     184  char *pp, *pe, *t, *se;
     185  int n, r, negate;
    184186
     187  negate = *pat == '!';
    185188  pp = pat + 2;
    186   pe = pp + strlen (pp) - 1;    /*(*/
    187   if (*pe != ')')
     189  se = pp + strlen (pp) - 1;            /* end of string */
     190  pe = glob_patscan (pp, se, 0);        /* end of extglob pattern (( */
     191  /* we should check for invalid extglob pattern here */
     192  if (pe == 0)
    188193    return 0;
    189   if ((t = strchr (pp, '|')) == 0)      /* easy case first */
     194
     195  /* if pe != se we have more of the pattern at the end of the extglob
     196     pattern. Check the easy case first ( */
     197  if (pe == se && *pe == ')' && (t = strchr (pp, '|')) == 0)
    190198    {
    191199      *pe = '\0';
     200#if defined (HANDLE_MULTIBYTE)
     201      r = mbskipname (pp, dname, flags);
     202#else
    192203      r = skipname (pp, dname, flags);  /*(*/
     204#endif
    193205      *pe = ')';
    194206      return r;
    195207    }
     208
     209  /* check every subpattern */
    196210  while (t = glob_patscan (pp, pe, '|'))
    197211    {
    198212      n = t[-1];
    199213      t[-1] = '\0';
     214#if defined (HANDLE_MULTIBYTE)
     215      r = mbskipname (pp, dname, flags);
     216#else
    200217      r = skipname (pp, dname, flags);
     218#endif
    201219      t[-1] = n;
    202220      if (r == 0)       /* if any pattern says not skip, we don't skip */
    203221        return r;
    204222      pp = t;
    205223    }   /*(*/
    206224
    207   if (pp == pe)         /* glob_patscan might find end of pattern */
     225  /* glob_patscan might find end of pattern */
     226  if (pp == se)
    208227    return r;
    209228
    210   *pe = '\0';
    211 #  if defined (HANDLE_MULTIBYTE)
    212   r = mbskipname (pp, dname, flags);    /*(*/
    213 #  else
    214   r = skipname (pp, dname, flags);      /*(*/
    215 #  endif
    216   *pe = ')';
    217   return r;
     229  /* but if it doesn't then we didn't match a leading dot */
     230  return 0;
    218231}
    219232#endif
    220233
     
    277290     int flags;
    278291{
    279292#if EXTENDED_GLOB
    280   wchar_t *pp, *pe, *t, n;
    281   int r;
     293  wchar_t *pp, *pe, *t, n, *se;
     294  int r, negate;
    282295
     296  negate = *pat == L'!';
    283297  pp = pat + 2;
    284   pe = pp + wcslen (pp) - 1;    /*(*/
    285   if (*pe != L')')
    286     return 0;
    287   if ((t = wcschr (pp, L'|')) == 0)
     298  se = pp + wcslen (pp) - 1;    /*(*/
     299  pe = glob_patscan_wc (pp, se, 0);
     300
     301  if (pe == se && *pe == ')' && (t = wcschr (pp, L'|')) == 0)
    288302    {
    289303      *pe = L'\0';
    290304      r = wchkname (pp, dname); /*(*/
    291305      *pe = L')';
    292306      return r;
    293307    }
     308
     309  /* check every subpattern */
    294310  while (t = glob_patscan_wc (pp, pe, '|'))
    295311    {
    296312      n = t[-1];
     
    305321  if (pp == pe)         /* glob_patscan_wc might find end of pattern */
    306322    return r;
    307323
    308   *pe = L'\0';
    309   r = wchkname (pp, dname);     /*(*/
    310   *pe = L')';
    311   return r;
     324  /* but if it doesn't then we didn't match a leading dot */
     325  return 0;
    312326#else
    313327  return (wchkname (pat, dname));
    314328#endif
     
    10061020{
    10071021  char **result;
    10081022  unsigned int result_size;
    1009   char *directory_name, *filename, *dname;
     1023  char *directory_name, *filename, *dname, *fn;
    10101024  unsigned int directory_len;
    10111025  int free_dirname;                     /* flag */
    10121026  int dflags;
     
    10221036
    10231037  /* Find the filename.  */
    10241038  filename = strrchr (pathname, '/');
     1039#if defined (EXTENDED_GLOB)
     1040  if (filename && extended_glob)
     1041    {
     1042      fn = glob_dirscan (pathname, '/');
     1043#if DEBUG_MATCHING
     1044      if (fn != filename)
     1045        fprintf (stderr, "glob_filename: glob_dirscan: fn (%s) != filename (%s)\n", fn ? fn : "(null)", filename);
     1046#endif
     1047      filename = fn;
     1048    }
     1049#endif
     1050
    10251051  if (filename == NULL)
    10261052    {
    10271053      filename = pathname;
  • lib/glob/gmisc.c

    diff -Naur bash-4.3.orig/lib/glob/gmisc.c bash-4.3/lib/glob/gmisc.c
    old new  
    4242#define WLPAREN         L'('
    4343#define WRPAREN         L')'
    4444
     45extern char *glob_patscan __P((char *, char *, int));
     46
    4547/* Return 1 of the first character of WSTRING could match the first
    4648   character of pattern WPAT.  Wide character version. */
    4749int
     
    210212    case '+':
    211213    case '!':
    212214    case '@':
     215    case '?':
    213216      return (pat[1] == LPAREN);
    214217    default:
    215218      return 0;
     
    374377
    375378  return matlen;
    376379}
     380
     381/* Skip characters in PAT and return the final occurrence of DIRSEP.  This
     382   is only called when extended_glob is set, so we have to skip over extglob
     383   patterns x(...) */
     384char *
     385glob_dirscan (pat, dirsep)
     386     char *pat;
     387     int dirsep;
     388{
     389  char *p, *d, *pe, *se;
     390
     391  d = pe = se = 0;
     392  for (p = pat; p && *p; p++)
     393    {
     394      if (extglob_pattern_p (p))
     395        {
     396          if (se == 0)
     397            se = p + strlen (p) - 1;
     398          pe = glob_patscan (p + 2, se, 0);
     399          if (pe == 0)
     400            continue;
     401          else if (*pe == 0)
     402            break;
     403          p = pe - 1;   /* will do increment above */
     404          continue;
     405        }
     406      if (*p ==  dirsep)
     407        d = p;
     408    }
     409  return d;
     410}
  • lib/readline/display.c

    diff -Naur bash-4.3.orig/lib/readline/display.c bash-4.3/lib/readline/display.c
    old new  
    16371637  /* If we are changing the number of invisible characters in a line, and
    16381638     the spot of first difference is before the end of the invisible chars,
    16391639     lendiff needs to be adjusted. */
    1640   if (current_line == 0 && !_rl_horizontal_scroll_mode &&
     1640  if (current_line == 0 && /* !_rl_horizontal_scroll_mode && */
    16411641      current_invis_chars != visible_wrap_offset)
    16421642    {
    16431643      if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
     
    18251825              else
    18261826                _rl_last_c_pos += bytes_to_insert;
    18271827
     1828              /* XXX - we only want to do this if we are at the end of the line
     1829                 so we move there with _rl_move_cursor_relative */
    18281830              if (_rl_horizontal_scroll_mode && ((oe-old) > (ne-new)))
    1829                 goto clear_rest_of_line;
     1831                {
     1832                  _rl_move_cursor_relative (ne-new, new);
     1833                  goto clear_rest_of_line;
     1834                }
    18301835            }
    18311836        }
    18321837      /* Otherwise, print over the existing material. */
     
    26772682{
    26782683  if (_rl_echoing_p)
    26792684    {
    2680       _rl_move_vert (_rl_vis_botlin);
     2685      if (_rl_vis_botlin > 0)   /* minor optimization plus bug fix */
     2686        _rl_move_vert (_rl_vis_botlin);
    26812687      _rl_vis_botlin = 0;
    26822688      fflush (rl_outstream);
    26832689      rl_restart_output (1, 0);
  • lib/readline/input.c

    diff -Naur bash-4.3.orig/lib/readline/input.c bash-4.3/lib/readline/input.c
    old new  
    534534        return (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF);
    535535      else if (_rl_caught_signal == SIGHUP || _rl_caught_signal == SIGTERM)
    536536        return (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF);
     537      /* keyboard-generated signals of interest */
    537538      else if (_rl_caught_signal == SIGINT || _rl_caught_signal == SIGQUIT)
    538539        RL_CHECK_SIGNALS ();
     540      /* non-keyboard-generated signals of interest */
     541      else if (_rl_caught_signal == SIGALRM
     542#if defined (SIGVTALRM)
     543                || _rl_caught_signal == SIGVTALRM
     544#endif
     545              )
     546        RL_CHECK_SIGNALS ();
    539547
    540548      if (rl_signal_event_hook)
    541549        (*rl_signal_event_hook) ();
  • lib/readline/misc.c

    diff -Naur bash-4.3.orig/lib/readline/misc.c bash-4.3/lib/readline/misc.c
    old new  
    461461            saved_undo_list = 0;
    462462          /* Set up rl_line_buffer and other variables from history entry */
    463463          rl_replace_from_history (entry, 0);   /* entry->line is now current */
     464          entry->data = 0;                      /* entry->data is now current undo list */
    464465          /* Undo all changes to this history entry */
    465466          while (rl_undo_list)
    466467            rl_do_undo ();
     
    468469             the timestamp. */
    469470          FREE (entry->line);
    470471          entry->line = savestring (rl_line_buffer);
    471           entry->data = 0;
    472472        }
    473473      entry = previous_history ();
    474474    }
  • lib/readline/readline.c

    diff -Naur bash-4.3.orig/lib/readline/readline.c bash-4.3/lib/readline/readline.c
    old new  
    744744    r = _rl_subseq_result (r, cxt->oldmap, cxt->okey, (cxt->flags & KSEQ_SUBSEQ));
    745745
    746746  RL_CHECK_SIGNALS ();
    747   if (r == 0)                   /* success! */
     747  /* We only treat values < 0 specially to simulate recursion. */
     748  if (r >= 0 || (r == -1 && (cxt->flags & KSEQ_SUBSEQ) == 0))   /* success! or failure! */
    748749    {
    749750      _rl_keyseq_chain_dispose ();
    750751      RL_UNSETSTATE (RL_STATE_MULTIKEY);
     
    964965#if defined (VI_MODE)
    965966  if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap &&
    966967      key != ANYOTHERKEY &&
    967       rl_key_sequence_length == 1 &&    /* XXX */
     968      _rl_dispatching_keymap == vi_movement_keymap &&
    968969      _rl_vi_textmod_command (key))
    969970    _rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign);
    970971#endif
  • lib/readline/readline.c.orig

    diff -Naur bash-4.3.orig/lib/readline/readline.c.orig bash-4.3/lib/readline/readline.c.orig
    old new  
     1/* readline.c -- a general facility for reading lines of input
     2   with emacs style editing and completion. */
     3
     4/* Copyright (C) 1987-2013 Free Software Foundation, Inc.
     5
     6   This file is part of the GNU Readline Library (Readline), a library
     7   for reading lines of text with interactive input and history editing.     
     8
     9   Readline is free software: you can redistribute it and/or modify
     10   it under the terms of the GNU General Public License as published by
     11   the Free Software Foundation, either version 3 of the License, or
     12   (at your option) any later version.
     13
     14   Readline is distributed in the hope that it will be useful,
     15   but WITHOUT ANY WARRANTY; without even the implied warranty of
     16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     17   GNU General Public License for more details.
     18
     19   You should have received a copy of the GNU General Public License
     20   along with Readline.  If not, see <http://www.gnu.org/licenses/>.
     21*/
     22
     23#define READLINE_LIBRARY
     24
     25#if defined (HAVE_CONFIG_H)
     26#  include <config.h>
     27#endif
     28
     29#include <sys/types.h>
     30#include "posixstat.h"
     31#include <fcntl.h>
     32#if defined (HAVE_SYS_FILE_H)
     33#  include <sys/file.h>
     34#endif /* HAVE_SYS_FILE_H */
     35
     36#if defined (HAVE_UNISTD_H)
     37#  include <unistd.h>
     38#endif /* HAVE_UNISTD_H */
     39
     40#if defined (HAVE_STDLIB_H)
     41#  include <stdlib.h>
     42#else
     43#  include "ansi_stdlib.h"
     44#endif /* HAVE_STDLIB_H */
     45
     46#if defined (HAVE_LOCALE_H)
     47#  include <locale.h>
     48#endif
     49
     50#include <stdio.h>
     51#include "posixjmp.h"
     52#include <errno.h>
     53
     54#if !defined (errno)
     55extern int errno;
     56#endif /* !errno */
     57
     58/* System-specific feature definitions and include files. */
     59#include "rldefs.h"
     60#include "rlmbutil.h"
     61
     62#if defined (__EMX__)
     63#  define INCL_DOSPROCESS
     64#  include <os2.h>
     65#endif /* __EMX__ */
     66
     67/* Some standard library routines. */
     68#include "readline.h"
     69#include "history.h"
     70
     71#include "rlprivate.h"
     72#include "rlshell.h"
     73#include "xmalloc.h"
     74
     75#ifndef RL_LIBRARY_VERSION
     76#  define RL_LIBRARY_VERSION "5.1"
     77#endif
     78
     79#ifndef RL_READLINE_VERSION
     80#  define RL_READLINE_VERSION   0x0501
     81#endif
     82
     83extern void _rl_free_history_entry PARAMS((HIST_ENTRY *));
     84
     85#if defined (COLOR_SUPPORT)
     86extern void _rl_parse_colors PARAMS((void));            /* XXX */
     87#endif
     88
     89
     90/* Forward declarations used in this file. */
     91static char *readline_internal PARAMS((void));
     92static void readline_initialize_everything PARAMS((void));
     93
     94static void bind_arrow_keys_internal PARAMS((Keymap));
     95static void bind_arrow_keys PARAMS((void));
     96
     97static void readline_default_bindings PARAMS((void));
     98static void reset_default_bindings PARAMS((void));
     99
     100static int _rl_subseq_result PARAMS((int, Keymap, int, int));
     101static int _rl_subseq_getchar PARAMS((int));
     102
     103/* **************************************************************** */
     104/*                                                                  */
     105/*                      Line editing input utility                  */
     106/*                                                                  */
     107/* **************************************************************** */
     108
     109const char *rl_library_version = RL_LIBRARY_VERSION;
     110
     111int rl_readline_version = RL_READLINE_VERSION;
     112
     113/* True if this is `real' readline as opposed to some stub substitute. */
     114int rl_gnu_readline_p = 1;
     115
     116/* A pointer to the keymap that is currently in use.
     117   By default, it is the standard emacs keymap. */
     118Keymap _rl_keymap = emacs_standard_keymap;
     119
     120/* The current style of editing. */
     121int rl_editing_mode = emacs_mode;
     122
     123/* The current insert mode:  input (the default) or overwrite */
     124int rl_insert_mode = RL_IM_DEFAULT;
     125
     126/* Non-zero if we called this function from _rl_dispatch().  It's present
     127   so functions can find out whether they were called from a key binding
     128   or directly from an application. */
     129int rl_dispatching;
     130
     131/* Non-zero if the previous command was a kill command. */
     132int _rl_last_command_was_kill = 0;
     133
     134/* The current value of the numeric argument specified by the user. */
     135int rl_numeric_arg = 1;
     136
     137/* Non-zero if an argument was typed. */
     138int rl_explicit_arg = 0;
     139
     140/* Temporary value used while generating the argument. */
     141int rl_arg_sign = 1;
     142
     143/* Non-zero means we have been called at least once before. */
     144static int rl_initialized;
     145
     146#if 0
     147/* If non-zero, this program is running in an EMACS buffer. */
     148static int running_in_emacs;
     149#endif
     150
     151/* Flags word encapsulating the current readline state. */
     152int rl_readline_state = RL_STATE_NONE;
     153
     154/* The current offset in the current input line. */
     155int rl_point;
     156
     157/* Mark in the current input line. */
     158int rl_mark;
     159
     160/* Length of the current input line. */
     161int rl_end;
     162
     163/* Make this non-zero to return the current input_line. */
     164int rl_done;
     165
     166/* The last function executed by readline. */
     167rl_command_func_t *rl_last_func = (rl_command_func_t *)NULL;
     168
     169/* Top level environment for readline_internal (). */
     170procenv_t _rl_top_level;
     171
     172/* The streams we interact with. */
     173FILE *_rl_in_stream, *_rl_out_stream;
     174
     175/* The names of the streams that we do input and output to. */
     176FILE *rl_instream = (FILE *)NULL;
     177FILE *rl_outstream = (FILE *)NULL;
     178
     179/* Non-zero means echo characters as they are read.  Defaults to no echo;
     180   set to 1 if there is a controlling terminal, we can get its attributes,
     181   and the attributes include `echo'.  Look at rltty.c:prepare_terminal_settings
     182   for the code that sets it. */
     183int _rl_echoing_p = 0;
     184
     185/* Current prompt. */
     186char *rl_prompt = (char *)NULL;
     187int rl_visible_prompt_length = 0;
     188
     189/* Set to non-zero by calling application if it has already printed rl_prompt
     190   and does not want readline to do it the first time. */
     191int rl_already_prompted = 0;
     192
     193/* The number of characters read in order to type this complete command. */
     194int rl_key_sequence_length = 0;
     195
     196/* If non-zero, then this is the address of a function to call just
     197   before readline_internal_setup () prints the first prompt. */
     198rl_hook_func_t *rl_startup_hook = (rl_hook_func_t *)NULL;
     199
     200/* If non-zero, this is the address of a function to call just before
     201   readline_internal_setup () returns and readline_internal starts
     202   reading input characters. */
     203rl_hook_func_t *rl_pre_input_hook = (rl_hook_func_t *)NULL;
     204
     205/* What we use internally.  You should always refer to RL_LINE_BUFFER. */
     206static char *the_line;
     207
     208/* The character that can generate an EOF.  Really read from
     209   the terminal driver... just defaulted here. */
     210int _rl_eof_char = CTRL ('D');
     211
     212/* Non-zero makes this the next keystroke to read. */
     213int rl_pending_input = 0;
     214
     215/* Pointer to a useful terminal name. */
     216const char *rl_terminal_name = (const char *)NULL;
     217
     218/* Non-zero means to always use horizontal scrolling in line display. */
     219int _rl_horizontal_scroll_mode = 0;
     220
     221/* Non-zero means to display an asterisk at the starts of history lines
     222   which have been modified. */
     223int _rl_mark_modified_lines = 0; 
     224
     225/* The style of `bell' notification preferred.  This can be set to NO_BELL,
     226   AUDIBLE_BELL, or VISIBLE_BELL. */
     227int _rl_bell_preference = AUDIBLE_BELL;
     228     
     229/* String inserted into the line by rl_insert_comment (). */
     230char *_rl_comment_begin;
     231
     232/* Keymap holding the function currently being executed. */
     233Keymap rl_executing_keymap;
     234
     235/* Keymap we're currently using to dispatch. */
     236Keymap _rl_dispatching_keymap;
     237
     238/* Non-zero means to erase entire line, including prompt, on empty input lines. */
     239int rl_erase_empty_line = 0;
     240
     241/* Non-zero means to read only this many characters rather than up to a
     242   character bound to accept-line. */
     243int rl_num_chars_to_read;
     244
     245/* Line buffer and maintenance. */
     246char *rl_line_buffer = (char *)NULL;
     247int rl_line_buffer_len = 0;
     248
     249/* Key sequence `contexts' */
     250_rl_keyseq_cxt *_rl_kscxt = 0;
     251
     252int rl_executing_key;
     253char *rl_executing_keyseq = 0;
     254int _rl_executing_keyseq_size = 0;
     255
     256/* Timeout (specified in milliseconds) when reading characters making up an
     257   ambiguous multiple-key sequence */
     258int _rl_keyseq_timeout = 500;
     259
     260#define RESIZE_KEYSEQ_BUFFER() \
     261  do \
     262    { \
     263      if (rl_key_sequence_length + 2 >= _rl_executing_keyseq_size) \
     264        { \
     265          _rl_executing_keyseq_size += 16; \
     266          rl_executing_keyseq = xrealloc (rl_executing_keyseq, _rl_executing_keyseq_size); \
     267        } \
     268    } \
     269  while (0);
     270       
     271/* Forward declarations used by the display, termcap, and history code. */
     272
     273/* **************************************************************** */
     274/*                                                                  */
     275/*                      `Forward' declarations                      */
     276/*                                                                  */
     277/* **************************************************************** */
     278
     279/* Non-zero means do not parse any lines other than comments and
     280   parser directives. */
     281unsigned char _rl_parsing_conditionalized_out = 0;
     282
     283/* Non-zero means to convert characters with the meta bit set to
     284   escape-prefixed characters so we can indirect through
     285   emacs_meta_keymap or vi_escape_keymap. */
     286int _rl_convert_meta_chars_to_ascii = 1;
     287
     288/* Non-zero means to output characters with the meta bit set directly
     289   rather than as a meta-prefixed escape sequence. */
     290int _rl_output_meta_chars = 0;
     291
     292/* Non-zero means to look at the termios special characters and bind
     293   them to equivalent readline functions at startup. */
     294int _rl_bind_stty_chars = 1;
     295
     296/* Non-zero means to go through the history list at every newline (or
     297   whenever rl_done is set and readline returns) and revert each line to
     298   its initial state. */
     299int _rl_revert_all_at_newline = 0;
     300
     301/* Non-zero means to honor the termios ECHOCTL bit and echo control
     302   characters corresponding to keyboard-generated signals. */
     303int _rl_echo_control_chars = 1;
     304
     305/* Non-zero means to prefix the displayed prompt with a character indicating
     306   the editing mode: @ for emacs, : for vi-command, + for vi-insert. */
     307int _rl_show_mode_in_prompt = 0;
     308
     309/* **************************************************************** */
     310/*                                                                  */
     311/*                      Top Level Functions                         */
     312/*                                                                  */
     313/* **************************************************************** */
     314
     315/* Non-zero means treat 0200 bit in terminal input as Meta bit. */
     316int _rl_meta_flag = 0;  /* Forward declaration */
     317
     318/* Set up the prompt and expand it.  Called from readline() and
     319   rl_callback_handler_install (). */
     320int
     321rl_set_prompt (prompt)
     322     const char *prompt;
     323{
     324  FREE (rl_prompt);
     325  rl_prompt = prompt ? savestring (prompt) : (char *)NULL;
     326  rl_display_prompt = rl_prompt ? rl_prompt : "";
     327
     328  rl_visible_prompt_length = rl_expand_prompt (rl_prompt);
     329  return 0;
     330}
     331 
     332/* Read a line of input.  Prompt with PROMPT.  An empty PROMPT means
     333   none.  A return value of NULL means that EOF was encountered. */
     334char *
     335readline (prompt)
     336     const char *prompt;
     337{
     338  char *value;
     339#if 0
     340  int in_callback;
     341#endif
     342
     343  /* If we are at EOF return a NULL string. */
     344  if (rl_pending_input == EOF)
     345    {
     346      rl_clear_pending_input ();
     347      return ((char *)NULL);
     348    }
     349
     350#if 0
     351  /* If readline() is called after installing a callback handler, temporarily
     352     turn off the callback state to avoid ensuing messiness.  Patch supplied
     353     by the gdb folks.  XXX -- disabled.  This can be fooled and readline
     354     left in a strange state by a poorly-timed longjmp. */
     355  if (in_callback = RL_ISSTATE (RL_STATE_CALLBACK))
     356    RL_UNSETSTATE (RL_STATE_CALLBACK);
     357#endif
     358
     359  rl_set_prompt (prompt);
     360
     361  rl_initialize ();
     362  if (rl_prep_term_function)
     363    (*rl_prep_term_function) (_rl_meta_flag);
     364
     365#if defined (HANDLE_SIGNALS)
     366  rl_set_signals ();
     367#endif
     368
     369  value = readline_internal ();
     370  if (rl_deprep_term_function)
     371    (*rl_deprep_term_function) ();
     372
     373#if defined (HANDLE_SIGNALS)
     374  rl_clear_signals ();
     375#endif
     376
     377#if 0
     378  if (in_callback)
     379    RL_SETSTATE (RL_STATE_CALLBACK);
     380#endif
     381
     382#if HAVE_DECL_AUDIT_TTY && defined (ENABLE_TTY_AUDIT_SUPPORT)
     383  if (value)
     384    _rl_audit_tty (value);
     385#endif
     386
     387  return (value);
     388}
     389
     390#if defined (READLINE_CALLBACKS)
     391#  define STATIC_CALLBACK
     392#else
     393#  define STATIC_CALLBACK static
     394#endif
     395
     396STATIC_CALLBACK void
     397readline_internal_setup ()
     398{
     399  char *nprompt;
     400
     401  _rl_in_stream = rl_instream;
     402  _rl_out_stream = rl_outstream;
     403
     404  /* Enable the meta key only for the duration of readline(), if this
     405     terminal has one and the terminal has been initialized */
     406  if (_rl_enable_meta & RL_ISSTATE (RL_STATE_TERMPREPPED))
     407    _rl_enable_meta_key ();
     408
     409  if (rl_startup_hook)
     410    (*rl_startup_hook) ();
     411
     412#if defined (VI_MODE)
     413  if (rl_editing_mode == vi_mode)
     414    rl_vi_insertion_mode (1, 'i');      /* don't want to reset last */
     415#endif /* VI_MODE */
     416
     417  /* If we're not echoing, we still want to at least print a prompt, because
     418     rl_redisplay will not do it for us.  If the calling application has a
     419     custom redisplay function, though, let that function handle it. */
     420  if (_rl_echoing_p == 0 && rl_redisplay_function == rl_redisplay)
     421    {
     422      if (rl_prompt && rl_already_prompted == 0)
     423        {
     424          nprompt = _rl_strip_prompt (rl_prompt);
     425          fprintf (_rl_out_stream, "%s", nprompt);
     426          fflush (_rl_out_stream);
     427          xfree (nprompt);
     428        }
     429    }
     430  else
     431    {
     432      if (rl_prompt && rl_already_prompted)
     433        rl_on_new_line_with_prompt ();
     434      else
     435        rl_on_new_line ();
     436      (*rl_redisplay_function) ();
     437    }
     438
     439  if (rl_pre_input_hook)
     440    (*rl_pre_input_hook) ();
     441
     442  RL_CHECK_SIGNALS ();
     443}
     444
     445STATIC_CALLBACK char *
     446readline_internal_teardown (eof)
     447     int eof;
     448{
     449  char *temp;
     450  HIST_ENTRY *entry;
     451
     452  RL_CHECK_SIGNALS ();
     453
     454  /* Restore the original of this history line, iff the line that we
     455     are editing was originally in the history, AND the line has changed. */
     456  entry = current_history ();
     457
     458  if (entry && rl_undo_list)
     459    {
     460      temp = savestring (the_line);
     461      rl_revert_line (1, 0);
     462      entry = replace_history_entry (where_history (), the_line, (histdata_t)NULL);
     463      _rl_free_history_entry (entry);
     464
     465      strcpy (the_line, temp);
     466      xfree (temp);
     467    }
     468
     469  if (_rl_revert_all_at_newline)
     470    _rl_revert_all_lines ();
     471
     472  /* At any rate, it is highly likely that this line has an undo list.  Get
     473     rid of it now. */
     474  if (rl_undo_list)
     475    rl_free_undo_list ();
     476
     477  /* Disable the meta key, if this terminal has one and we were told to use it.
     478     The check whether or not we sent the enable string is in
     479     _rl_disable_meta_key(); the flag is set in _rl_enable_meta_key */
     480  _rl_disable_meta_key ();
     481
     482  /* Restore normal cursor, if available. */
     483  _rl_set_insert_mode (RL_IM_INSERT, 0);
     484
     485  return (eof ? (char *)NULL : savestring (the_line));
     486}
     487
     488void
     489_rl_internal_char_cleanup ()
     490{
     491#if defined (VI_MODE)
     492  /* In vi mode, when you exit insert mode, the cursor moves back
     493     over the previous character.  We explicitly check for that here. */
     494  if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap)
     495    rl_vi_check ();
     496#endif /* VI_MODE */
     497
     498  if (rl_num_chars_to_read && rl_end >= rl_num_chars_to_read)
     499    {
     500      (*rl_redisplay_function) ();
     501      _rl_want_redisplay = 0;
     502      rl_newline (1, '\n');
     503    }
     504
     505  if (rl_done == 0)
     506    {
     507      (*rl_redisplay_function) ();
     508      _rl_want_redisplay = 0;
     509    }
     510
     511  /* If the application writer has told us to erase the entire line if
     512     the only character typed was something bound to rl_newline, do so. */
     513  if (rl_erase_empty_line && rl_done && rl_last_func == rl_newline &&
     514      rl_point == 0 && rl_end == 0)
     515    _rl_erase_entire_line ();
     516}
     517
     518STATIC_CALLBACK int
     519#if defined (READLINE_CALLBACKS)
     520readline_internal_char ()
     521#else
     522readline_internal_charloop ()
     523#endif
     524{
     525  static int lastc, eof_found;
     526  int c, code, lk;
     527
     528  lastc = -1;
     529  eof_found = 0;
     530
     531#if !defined (READLINE_CALLBACKS)
     532  while (rl_done == 0)
     533    {
     534#endif
     535      lk = _rl_last_command_was_kill;
     536
     537#if defined (HAVE_POSIX_SIGSETJMP)
     538      code = sigsetjmp (_rl_top_level, 0);
     539#else
     540      code = setjmp (_rl_top_level);
     541#endif
     542
     543      if (code)
     544        {
     545          (*rl_redisplay_function) ();
     546          _rl_want_redisplay = 0;
     547          /* If we get here, we're not being called from something dispatched
     548             from _rl_callback_read_char(), which sets up its own value of
     549             _rl_top_level (saving and restoring the old, of course), so
     550             we can just return here. */
     551          if (RL_ISSTATE (RL_STATE_CALLBACK))
     552            return (0);
     553        }
     554
     555      if (rl_pending_input == 0)
     556        {
     557          /* Then initialize the argument and number of keys read. */
     558          _rl_reset_argument ();
     559          rl_key_sequence_length = 0;
     560          rl_executing_keyseq[0] = 0;
     561        }
     562
     563      RL_SETSTATE(RL_STATE_READCMD);
     564      c = rl_read_key ();
     565      RL_UNSETSTATE(RL_STATE_READCMD);
     566
     567      /* look at input.c:rl_getc() for the circumstances under which this will
     568         be returned; punt immediately on read error without converting it to
     569         a newline; assume that rl_read_key has already called the signal
     570         handler. */
     571      if (c == READERR)
     572        {
     573#if defined (READLINE_CALLBACKS)
     574          RL_SETSTATE(RL_STATE_DONE);
     575          return (rl_done = 1);
     576#else
     577          eof_found = 1;
     578          break;
     579#endif
     580        }
     581
     582      /* EOF typed to a non-blank line is a <NL>.  If we want to change this,
     583         to force any existing line to be ignored when read(2) reads EOF,
     584         for example, this is the place to change. */
     585      if (c == EOF && rl_end)
     586        c = NEWLINE;
     587
     588      /* The character _rl_eof_char typed to blank line, and not as the
     589         previous character is interpreted as EOF. */
     590      if (((c == _rl_eof_char && lastc != c) || c == EOF) && !rl_end)
     591        {
     592#if defined (READLINE_CALLBACKS)
     593          RL_SETSTATE(RL_STATE_DONE);
     594          return (rl_done = 1);
     595#else
     596          eof_found = 1;
     597          break;
     598#endif
     599        }
     600
     601      lastc = c;
     602      _rl_dispatch ((unsigned char)c, _rl_keymap);
     603      RL_CHECK_SIGNALS ();
     604
     605      /* If there was no change in _rl_last_command_was_kill, then no kill
     606         has taken place.  Note that if input is pending we are reading
     607         a prefix command, so nothing has changed yet. */
     608      if (rl_pending_input == 0 && lk == _rl_last_command_was_kill)
     609        _rl_last_command_was_kill = 0;
     610
     611      _rl_internal_char_cleanup ();
     612
     613#if defined (READLINE_CALLBACKS)
     614      return 0;
     615#else
     616    }
     617
     618  return (eof_found);
     619#endif
     620}
     621
     622#if defined (READLINE_CALLBACKS)
     623static int
     624readline_internal_charloop ()
     625{
     626  int eof = 1;
     627
     628  while (rl_done == 0)
     629    eof = readline_internal_char ();
     630  return (eof);
     631}
     632#endif /* READLINE_CALLBACKS */
     633
     634/* Read a line of input from the global rl_instream, doing output on
     635   the global rl_outstream.
     636   If rl_prompt is non-null, then that is our prompt. */
     637static char *
     638readline_internal ()
     639{
     640  int eof;
     641
     642  readline_internal_setup ();
     643  eof = readline_internal_charloop ();
     644  return (readline_internal_teardown (eof));
     645}
     646
     647void
     648_rl_init_line_state ()
     649{
     650  rl_point = rl_end = rl_mark = 0;
     651  the_line = rl_line_buffer;
     652  the_line[0] = 0;
     653}
     654
     655void
     656_rl_set_the_line ()
     657{
     658  the_line = rl_line_buffer;
     659}
     660
     661#if defined (READLINE_CALLBACKS)
     662_rl_keyseq_cxt *
     663_rl_keyseq_cxt_alloc ()
     664{
     665  _rl_keyseq_cxt *cxt;
     666
     667  cxt = (_rl_keyseq_cxt *)xmalloc (sizeof (_rl_keyseq_cxt));
     668
     669  cxt->flags = cxt->subseq_arg = cxt->subseq_retval = 0;
     670
     671  cxt->okey = 0;
     672  cxt->ocxt = _rl_kscxt;
     673  cxt->childval = 42;           /* sentinel value */
     674
     675  return cxt;
     676}
     677
     678void
     679_rl_keyseq_cxt_dispose (cxt)
     680    _rl_keyseq_cxt *cxt;
     681{
     682  xfree (cxt);
     683}
     684
     685void
     686_rl_keyseq_chain_dispose ()
     687{
     688  _rl_keyseq_cxt *cxt;
     689
     690  while (_rl_kscxt)
     691    {
     692      cxt = _rl_kscxt;
     693      _rl_kscxt = _rl_kscxt->ocxt;
     694      _rl_keyseq_cxt_dispose (cxt);
     695    }
     696}
     697#endif
     698
     699static int
     700_rl_subseq_getchar (key)
     701     int key;
     702{
     703  int k;
     704
     705  if (key == ESC)
     706    RL_SETSTATE(RL_STATE_METANEXT);
     707  RL_SETSTATE(RL_STATE_MOREINPUT);
     708  k = rl_read_key ();
     709  RL_UNSETSTATE(RL_STATE_MOREINPUT);
     710  if (key == ESC)
     711    RL_UNSETSTATE(RL_STATE_METANEXT);
     712
     713  return k;
     714}
     715
     716#if defined (READLINE_CALLBACKS)
     717int
     718_rl_dispatch_callback (cxt)
     719     _rl_keyseq_cxt *cxt;
     720{
     721  int nkey, r;
     722
     723  /* For now */
     724  /* The first time this context is used, we want to read input and dispatch
     725     on it.  When traversing the chain of contexts back `up', we want to use
     726     the value from the next context down.  We're simulating recursion using
     727     a chain of contexts. */
     728  if ((cxt->flags & KSEQ_DISPATCHED) == 0)
     729    {
     730      nkey = _rl_subseq_getchar (cxt->okey);
     731      if (nkey < 0)
     732        {
     733          _rl_abort_internal ();
     734          return -1;
     735        }
     736      r = _rl_dispatch_subseq (nkey, cxt->dmap, cxt->subseq_arg);
     737      cxt->flags |= KSEQ_DISPATCHED;
     738    }
     739  else
     740    r = cxt->childval;
     741
     742  /* For now */
     743  if (r != -3)  /* don't do this if we indicate there will be other matches */
     744    r = _rl_subseq_result (r, cxt->oldmap, cxt->okey, (cxt->flags & KSEQ_SUBSEQ));
     745
     746  RL_CHECK_SIGNALS ();
     747  /* We only treat values < 0 specially to simulate recursion. */
     748  if (r >= 0 || (r == -1 && (cxt->flags & KSEQ_SUBSEQ) == 0))   /* success! or failure! */
     749    {
     750      _rl_keyseq_chain_dispose ();
     751      RL_UNSETSTATE (RL_STATE_MULTIKEY);
     752      return r;
     753    }
     754
     755  if (r != -3)                  /* magic value that says we added to the chain */
     756    _rl_kscxt = cxt->ocxt;
     757  if (_rl_kscxt)
     758    _rl_kscxt->childval = r;
     759  if (r != -3)
     760    _rl_keyseq_cxt_dispose (cxt);
     761
     762  return r;
     763}
     764#endif /* READLINE_CALLBACKS */
     765 
     766/* Do the command associated with KEY in MAP.
     767   If the associated command is really a keymap, then read
     768   another key, and dispatch into that map. */
     769int
     770_rl_dispatch (key, map)
     771     register int key;
     772     Keymap map;
     773{
     774  _rl_dispatching_keymap = map;
     775  return _rl_dispatch_subseq (key, map, 0);
     776}
     777
     778int
     779_rl_dispatch_subseq (key, map, got_subseq)
     780     register int key;
     781     Keymap map;
     782     int got_subseq;
     783{
     784  int r, newkey;
     785  char *macro;
     786  rl_command_func_t *func;
     787#if defined (READLINE_CALLBACKS)
     788  _rl_keyseq_cxt *cxt;
     789#endif
     790
     791  if (META_CHAR (key) && _rl_convert_meta_chars_to_ascii)
     792    {
     793      if (map[ESC].type == ISKMAP)
     794        {
     795          if (RL_ISSTATE (RL_STATE_MACRODEF))
     796            _rl_add_macro_char (ESC);
     797          RESIZE_KEYSEQ_BUFFER ();
     798          rl_executing_keyseq[rl_key_sequence_length++] = ESC;
     799          map = FUNCTION_TO_KEYMAP (map, ESC);
     800          key = UNMETA (key);
     801          return (_rl_dispatch (key, map));
     802        }
     803      else
     804        rl_ding ();
     805      return 0;
     806    }
     807
     808  if (RL_ISSTATE (RL_STATE_MACRODEF))
     809    _rl_add_macro_char (key);
     810
     811  r = 0;
     812  switch (map[key].type)
     813    {
     814    case ISFUNC:
     815      func = map[key].function;
     816      if (func)
     817        {
     818          /* Special case rl_do_lowercase_version (). */
     819          if (func == rl_do_lowercase_version)
     820            /* Should we do anything special if key == ANYOTHERKEY? */
     821            return (_rl_dispatch (_rl_to_lower (key), map));
     822
     823          rl_executing_keymap = map;
     824          rl_executing_key = key;
     825
     826          RESIZE_KEYSEQ_BUFFER();
     827          rl_executing_keyseq[rl_key_sequence_length++] = key;
     828          rl_executing_keyseq[rl_key_sequence_length] = '\0';
     829
     830          rl_dispatching = 1;
     831          RL_SETSTATE(RL_STATE_DISPATCHING);
     832          r = (*func) (rl_numeric_arg * rl_arg_sign, key);
     833          RL_UNSETSTATE(RL_STATE_DISPATCHING);
     834          rl_dispatching = 0;
     835
     836          /* If we have input pending, then the last command was a prefix
     837             command.  Don't change the state of rl_last_func.  Otherwise,
     838             remember the last command executed in this variable. */
     839          if (rl_pending_input == 0 && map[key].function != rl_digit_argument)
     840            rl_last_func = map[key].function;
     841
     842          RL_CHECK_SIGNALS ();
     843        }
     844      else if (map[ANYOTHERKEY].function)
     845        {
     846          /* OK, there's no function bound in this map, but there is a
     847             shadow function that was overridden when the current keymap
     848             was created.  Return -2 to note  that. */
     849          if (RL_ISSTATE (RL_STATE_MACROINPUT))
     850            _rl_prev_macro_key ();
     851          else
     852            _rl_unget_char  (key);
     853          return -2;
     854        }
     855      else if (got_subseq)
     856        {
     857          /* Return -1 to note that we're in a subsequence, but  we don't
     858             have a matching key, nor was one overridden.  This means
     859             we need to back up the recursion chain and find the last
     860             subsequence that is bound to a function. */
     861          if (RL_ISSTATE (RL_STATE_MACROINPUT))
     862            _rl_prev_macro_key ();
     863          else
     864            _rl_unget_char (key);
     865          return -1;
     866        }
     867      else
     868        {
     869#if defined (READLINE_CALLBACKS)
     870          RL_UNSETSTATE (RL_STATE_MULTIKEY);
     871          _rl_keyseq_chain_dispose ();
     872#endif
     873          _rl_abort_internal ();
     874          return -1;
     875        }
     876      break;
     877
     878    case ISKMAP:
     879      if (map[key].function != 0)
     880        {
     881#if defined (VI_MODE)
     882          /* The only way this test will be true is if a subsequence has been
     883             bound starting with ESC, generally the arrow keys.  What we do is
     884             check whether there's input in the queue, which there generally
     885             will be if an arrow key has been pressed, and, if there's not,
     886             just dispatch to (what we assume is) rl_vi_movement_mode right
     887             away.  This is essentially an input test with a zero timeout (by
     888             default) or a timeout determined by the value of `keyseq-timeout' */
     889          /* _rl_keyseq_timeout specified in milliseconds; _rl_input_queued
     890             takes microseconds, so multiply by 1000 */
     891          if (rl_editing_mode == vi_mode && key == ESC && map == vi_insertion_keymap
     892              && _rl_input_queued ((_rl_keyseq_timeout > 0) ? _rl_keyseq_timeout*1000 : 0) == 0)
     893            return (_rl_dispatch (ANYOTHERKEY, FUNCTION_TO_KEYMAP (map, key)));
     894#endif
     895
     896          RESIZE_KEYSEQ_BUFFER ();
     897          rl_executing_keyseq[rl_key_sequence_length++] = key;
     898          _rl_dispatching_keymap = FUNCTION_TO_KEYMAP (map, key);
     899
     900          /* Allocate new context here.  Use linked contexts (linked through
     901             cxt->ocxt) to simulate recursion */
     902#if defined (READLINE_CALLBACKS)
     903          if (RL_ISSTATE (RL_STATE_CALLBACK))
     904            {
     905              /* Return 0 only the first time, to indicate success to
     906                 _rl_callback_read_char.  The rest of the time, we're called
     907                 from _rl_dispatch_callback, so we return -3 to indicate
     908                 special handling is necessary. */
     909              r = RL_ISSTATE (RL_STATE_MULTIKEY) ? -3 : 0;
     910              cxt = _rl_keyseq_cxt_alloc ();
     911
     912              if (got_subseq)
     913                cxt->flags |= KSEQ_SUBSEQ;
     914              cxt->okey = key;
     915              cxt->oldmap = map;
     916              cxt->dmap = _rl_dispatching_keymap;
     917              cxt->subseq_arg = got_subseq || cxt->dmap[ANYOTHERKEY].function;
     918
     919              RL_SETSTATE (RL_STATE_MULTIKEY);
     920              _rl_kscxt = cxt;
     921
     922              return r;         /* don't indicate immediate success */
     923            }
     924#endif
     925
     926          /* Tentative inter-character timeout for potential multi-key
     927             sequences?  If no input within timeout, abort sequence and
     928             act as if we got non-matching input. */
     929          /* _rl_keyseq_timeout specified in milliseconds; _rl_input_queued
     930             takes microseconds, so multiply by 1000 */
     931          if (_rl_keyseq_timeout > 0 &&
     932                (RL_ISSTATE (RL_STATE_INPUTPENDING|RL_STATE_MACROINPUT) == 0) &&
     933                _rl_pushed_input_available () == 0 &&
     934                _rl_dispatching_keymap[ANYOTHERKEY].function &&
     935                _rl_input_queued (_rl_keyseq_timeout*1000) == 0)
     936            return (_rl_subseq_result (-2, map, key, got_subseq));
     937
     938          newkey = _rl_subseq_getchar (key);
     939          if (newkey < 0)
     940            {
     941              _rl_abort_internal ();
     942              return -1;
     943            }
     944
     945          r = _rl_dispatch_subseq (newkey, _rl_dispatching_keymap, got_subseq || map[ANYOTHERKEY].function);
     946          return _rl_subseq_result (r, map, key, got_subseq);
     947        }
     948      else
     949        {
     950          _rl_abort_internal ();
     951          return -1;
     952        }
     953      break;
     954
     955    case ISMACR:
     956      if (map[key].function != 0)
     957        {
     958          rl_executing_keyseq[rl_key_sequence_length] = '\0';
     959          macro = savestring ((char *)map[key].function);
     960          _rl_with_macro_input (macro);
     961          return 0;
     962        }
     963      break;
     964    }
     965#if defined (VI_MODE)
     966  if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap &&
     967      key != ANYOTHERKEY &&
     968      rl_key_sequence_length == 1 &&    /* XXX */
     969      _rl_vi_textmod_command (key))
     970    _rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign);
     971#endif
     972
     973  return (r);
     974}
     975
     976static int
     977_rl_subseq_result (r, map, key, got_subseq)
     978     int r;
     979     Keymap map;
     980     int key, got_subseq;
     981{
     982  Keymap m;
     983  int type, nt;
     984  rl_command_func_t *func, *nf;
     985
     986  if (r == -2)
     987    /* We didn't match anything, and the keymap we're indexed into
     988       shadowed a function previously bound to that prefix.  Call
     989       the function.  The recursive call to _rl_dispatch_subseq has
     990       already taken care of pushing any necessary input back onto
     991       the input queue with _rl_unget_char. */
     992    {
     993      m = _rl_dispatching_keymap;
     994      type = m[ANYOTHERKEY].type;
     995      func = m[ANYOTHERKEY].function;
     996      if (type == ISFUNC && func == rl_do_lowercase_version)
     997        r = _rl_dispatch (_rl_to_lower (key), map);
     998      else if (type == ISFUNC && func == rl_insert)
     999        {
     1000          /* If the function that was shadowed was self-insert, we
     1001             somehow need a keymap with map[key].func == self-insert.
     1002             Let's use this one. */
     1003          nt = m[key].type;
     1004          nf = m[key].function;
     1005
     1006          m[key].type = type;
     1007          m[key].function = func;
     1008          r = _rl_dispatch (key, m);
     1009          m[key].type = nt;
     1010          m[key].function = nf;
     1011        }
     1012      else
     1013        r = _rl_dispatch (ANYOTHERKEY, m);
     1014    }
     1015  else if (r && map[ANYOTHERKEY].function)
     1016    {
     1017      /* We didn't match (r is probably -1), so return something to
     1018         tell the caller that it should try ANYOTHERKEY for an
     1019         overridden function. */
     1020      if (RL_ISSTATE (RL_STATE_MACROINPUT))
     1021        _rl_prev_macro_key ();
     1022      else
     1023        _rl_unget_char (key);
     1024      _rl_dispatching_keymap = map;
     1025      return -2;
     1026    }
     1027  else if (r && got_subseq)
     1028    {
     1029      /* OK, back up the chain. */
     1030      if (RL_ISSTATE (RL_STATE_MACROINPUT))
     1031        _rl_prev_macro_key ();
     1032      else
     1033        _rl_unget_char (key);
     1034      _rl_dispatching_keymap = map;
     1035      return -1;
     1036    }
     1037
     1038  return r;
     1039}
     1040
     1041/* **************************************************************** */
     1042/*                                                                  */
     1043/*                      Initializations                             */
     1044/*                                                                  */
     1045/* **************************************************************** */
     1046
     1047/* Initialize readline (and terminal if not already). */
     1048int
     1049rl_initialize ()
     1050{
     1051  /* If we have never been called before, initialize the
     1052     terminal and data structures. */
     1053  if (!rl_initialized)
     1054    {
     1055      RL_SETSTATE(RL_STATE_INITIALIZING);
     1056      readline_initialize_everything ();
     1057      RL_UNSETSTATE(RL_STATE_INITIALIZING);
     1058      rl_initialized++;
     1059      RL_SETSTATE(RL_STATE_INITIALIZED);
     1060    }
     1061
     1062  /* Initialize the current line information. */
     1063  _rl_init_line_state ();
     1064
     1065  /* We aren't done yet.  We haven't even gotten started yet! */
     1066  rl_done = 0;
     1067  RL_UNSETSTATE(RL_STATE_DONE);
     1068
     1069  /* Tell the history routines what is going on. */
     1070  _rl_start_using_history ();
     1071
     1072  /* Make the display buffer match the state of the line. */
     1073  rl_reset_line_state ();
     1074
     1075  /* No such function typed yet. */
     1076  rl_last_func = (rl_command_func_t *)NULL;
     1077
     1078  /* Parsing of key-bindings begins in an enabled state. */
     1079  _rl_parsing_conditionalized_out = 0;
     1080
     1081#if defined (VI_MODE)
     1082  if (rl_editing_mode == vi_mode)
     1083    _rl_vi_initialize_line ();
     1084#endif
     1085
     1086  /* Each line starts in insert mode (the default). */
     1087  _rl_set_insert_mode (RL_IM_DEFAULT, 1);
     1088
     1089  return 0;
     1090}
     1091
     1092#if 0
     1093#if defined (__EMX__)
     1094static void
     1095_emx_build_environ ()
     1096{
     1097  TIB *tibp;
     1098  PIB *pibp;
     1099  char *t, **tp;
     1100  int c;
     1101
     1102  DosGetInfoBlocks (&tibp, &pibp);
     1103  t = pibp->pib_pchenv;
     1104  for (c = 1; *t; c++)
     1105    t += strlen (t) + 1;
     1106  tp = environ = (char **)xmalloc ((c + 1) * sizeof (char *));
     1107  t = pibp->pib_pchenv;
     1108  while (*t)
     1109    {
     1110      *tp++ = t;
     1111      t += strlen (t) + 1;
     1112    }
     1113  *tp = 0;
     1114}
     1115#endif /* __EMX__ */
     1116#endif
     1117
     1118/* Initialize the entire state of the world. */
     1119static void
     1120readline_initialize_everything ()
     1121{
     1122#if 0
     1123#if defined (__EMX__)
     1124  if (environ == 0)
     1125    _emx_build_environ ();
     1126#endif
     1127#endif
     1128
     1129#if 0
     1130  /* Find out if we are running in Emacs -- UNUSED. */
     1131  running_in_emacs = sh_get_env_value ("EMACS") != (char *)0;
     1132#endif
     1133
     1134  /* Set up input and output if they are not already set up. */
     1135  if (!rl_instream)
     1136    rl_instream = stdin;
     1137
     1138  if (!rl_outstream)
     1139    rl_outstream = stdout;
     1140
     1141  /* Bind _rl_in_stream and _rl_out_stream immediately.  These values
     1142     may change, but they may also be used before readline_internal ()
     1143     is called. */
     1144  _rl_in_stream = rl_instream;
     1145  _rl_out_stream = rl_outstream;
     1146
     1147  /* Allocate data structures. */
     1148  if (rl_line_buffer == 0)
     1149    rl_line_buffer = (char *)xmalloc (rl_line_buffer_len = DEFAULT_BUFFER_SIZE);
     1150
     1151  /* Initialize the terminal interface. */
     1152  if (rl_terminal_name == 0)
     1153    rl_terminal_name = sh_get_env_value ("TERM");
     1154  _rl_init_terminal_io (rl_terminal_name);
     1155
     1156  /* Bind tty characters to readline functions. */
     1157  readline_default_bindings ();
     1158
     1159  /* Initialize the function names. */
     1160  rl_initialize_funmap ();
     1161
     1162  /* Decide whether we should automatically go into eight-bit mode. */
     1163  _rl_init_eightbit ();
     1164     
     1165  /* Read in the init file. */
     1166  rl_read_init_file ((char *)NULL);
     1167
     1168  /* XXX */
     1169  if (_rl_horizontal_scroll_mode && _rl_term_autowrap)
     1170    {
     1171      _rl_screenwidth--;
     1172      _rl_screenchars -= _rl_screenheight;
     1173    }
     1174
     1175  /* Override the effect of any `set keymap' assignments in the
     1176     inputrc file. */
     1177  rl_set_keymap_from_edit_mode ();
     1178
     1179  /* Try to bind a common arrow key prefix, if not already bound. */
     1180  bind_arrow_keys ();
     1181
     1182  /* If the completion parser's default word break characters haven't
     1183     been set yet, then do so now. */
     1184  if (rl_completer_word_break_characters == (char *)NULL)
     1185    rl_completer_word_break_characters = (char *)rl_basic_word_break_characters;
     1186
     1187#if defined (COLOR_SUPPORT)
     1188  if (_rl_colored_stats)
     1189    _rl_parse_colors ();
     1190#endif
     1191
     1192  rl_executing_keyseq = malloc (_rl_executing_keyseq_size = 16);
     1193  if (rl_executing_keyseq)
     1194    rl_executing_keyseq[0] = '\0';
     1195}
     1196
     1197/* If this system allows us to look at the values of the regular
     1198   input editing characters, then bind them to their readline
     1199   equivalents, iff the characters are not bound to keymaps. */
     1200static void
     1201readline_default_bindings ()
     1202{
     1203  if (_rl_bind_stty_chars)
     1204    rl_tty_set_default_bindings (_rl_keymap);
     1205}
     1206
     1207/* Reset the default bindings for the terminal special characters we're
     1208   interested in back to rl_insert and read the new ones. */
     1209static void
     1210reset_default_bindings ()
     1211{
     1212  if (_rl_bind_stty_chars)
     1213    {
     1214      rl_tty_unset_default_bindings (_rl_keymap);
     1215      rl_tty_set_default_bindings (_rl_keymap);
     1216    }
     1217}
     1218
     1219/* Bind some common arrow key sequences in MAP. */
     1220static void
     1221bind_arrow_keys_internal (map)
     1222     Keymap map;
     1223{
     1224  Keymap xkeymap;
     1225
     1226  xkeymap = _rl_keymap;
     1227  _rl_keymap = map;
     1228
     1229#if defined (__MSDOS__)
     1230  rl_bind_keyseq_if_unbound ("\033[0A", rl_get_previous_history);
     1231  rl_bind_keyseq_if_unbound ("\033[0B", rl_backward_char);
     1232  rl_bind_keyseq_if_unbound ("\033[0C", rl_forward_char);
     1233  rl_bind_keyseq_if_unbound ("\033[0D", rl_get_next_history);
     1234#endif
     1235
     1236  rl_bind_keyseq_if_unbound ("\033[A", rl_get_previous_history);
     1237  rl_bind_keyseq_if_unbound ("\033[B", rl_get_next_history);
     1238  rl_bind_keyseq_if_unbound ("\033[C", rl_forward_char);
     1239  rl_bind_keyseq_if_unbound ("\033[D", rl_backward_char);
     1240  rl_bind_keyseq_if_unbound ("\033[H", rl_beg_of_line);
     1241  rl_bind_keyseq_if_unbound ("\033[F", rl_end_of_line);
     1242
     1243  rl_bind_keyseq_if_unbound ("\033OA", rl_get_previous_history);
     1244  rl_bind_keyseq_if_unbound ("\033OB", rl_get_next_history);
     1245  rl_bind_keyseq_if_unbound ("\033OC", rl_forward_char);
     1246  rl_bind_keyseq_if_unbound ("\033OD", rl_backward_char);
     1247  rl_bind_keyseq_if_unbound ("\033OH", rl_beg_of_line);
     1248  rl_bind_keyseq_if_unbound ("\033OF", rl_end_of_line);
     1249
     1250#if defined (__MINGW32__)
     1251  rl_bind_keyseq_if_unbound ("\340H", rl_get_previous_history);
     1252  rl_bind_keyseq_if_unbound ("\340P", rl_get_next_history);
     1253  rl_bind_keyseq_if_unbound ("\340M", rl_forward_char);
     1254  rl_bind_keyseq_if_unbound ("\340K", rl_backward_char);
     1255  rl_bind_keyseq_if_unbound ("\340G", rl_beg_of_line);
     1256  rl_bind_keyseq_if_unbound ("\340O", rl_end_of_line);
     1257  rl_bind_keyseq_if_unbound ("\340S", rl_delete);
     1258  rl_bind_keyseq_if_unbound ("\340R", rl_overwrite_mode);
     1259
     1260  /* These may or may not work because of the embedded NUL. */
     1261  rl_bind_keyseq_if_unbound ("\\000H", rl_get_previous_history);
     1262  rl_bind_keyseq_if_unbound ("\\000P", rl_get_next_history);
     1263  rl_bind_keyseq_if_unbound ("\\000M", rl_forward_char);
     1264  rl_bind_keyseq_if_unbound ("\\000K", rl_backward_char);
     1265  rl_bind_keyseq_if_unbound ("\\000G", rl_beg_of_line);
     1266  rl_bind_keyseq_if_unbound ("\\000O", rl_end_of_line);
     1267  rl_bind_keyseq_if_unbound ("\\000S", rl_delete);
     1268  rl_bind_keyseq_if_unbound ("\\000R", rl_overwrite_mode);
     1269#endif
     1270
     1271  _rl_keymap = xkeymap;
     1272}
     1273
     1274/* Try and bind the common arrow key prefixes after giving termcap and
     1275   the inputrc file a chance to bind them and create `real' keymaps
     1276   for the arrow key prefix. */
     1277static void
     1278bind_arrow_keys ()
     1279{
     1280  bind_arrow_keys_internal (emacs_standard_keymap);
     1281
     1282#if defined (VI_MODE)
     1283  bind_arrow_keys_internal (vi_movement_keymap);
     1284  /* Unbind vi_movement_keymap[ESC] to allow users to repeatedly hit ESC
     1285     in vi command mode while still allowing the arrow keys to work. */
     1286  if (vi_movement_keymap[ESC].type == ISKMAP)
     1287    rl_bind_keyseq_in_map ("\033", (rl_command_func_t *)NULL, vi_movement_keymap);
     1288  bind_arrow_keys_internal (vi_insertion_keymap);
     1289#endif
     1290}
     1291
     1292/* **************************************************************** */
     1293/*                                                                  */
     1294/*              Saving and Restoring Readline's state               */
     1295/*                                                                  */
     1296/* **************************************************************** */
     1297
     1298int
     1299rl_save_state (sp)
     1300     struct readline_state *sp;
     1301{
     1302  if (sp == 0)
     1303    return -1;
     1304
     1305  sp->point = rl_point;
     1306  sp->end = rl_end;
     1307  sp->mark = rl_mark;
     1308  sp->buffer = rl_line_buffer;
     1309  sp->buflen = rl_line_buffer_len;
     1310  sp->ul = rl_undo_list;
     1311  sp->prompt = rl_prompt;
     1312
     1313  sp->rlstate = rl_readline_state;
     1314  sp->done = rl_done;
     1315  sp->kmap = _rl_keymap;
     1316
     1317  sp->lastfunc = rl_last_func;
     1318  sp->insmode = rl_insert_mode;
     1319  sp->edmode = rl_editing_mode;
     1320  sp->kseqlen = rl_key_sequence_length;
     1321  sp->inf = rl_instream;
     1322  sp->outf = rl_outstream;
     1323  sp->pendingin = rl_pending_input;
     1324  sp->macro = rl_executing_macro;
     1325
     1326  sp->catchsigs = rl_catch_signals;
     1327  sp->catchsigwinch = rl_catch_sigwinch;
     1328
     1329  return (0);
     1330}
     1331
     1332int
     1333rl_restore_state (sp)
     1334     struct readline_state *sp;
     1335{
     1336  if (sp == 0)
     1337    return -1;
     1338
     1339  rl_point = sp->point;
     1340  rl_end = sp->end;
     1341  rl_mark = sp->mark;
     1342  the_line = rl_line_buffer = sp->buffer;
     1343  rl_line_buffer_len = sp->buflen;
     1344  rl_undo_list = sp->ul;
     1345  rl_prompt = sp->prompt;
     1346
     1347  rl_readline_state = sp->rlstate;
     1348  rl_done = sp->done;
     1349  _rl_keymap = sp->kmap;
     1350
     1351  rl_last_func = sp->lastfunc;
     1352  rl_insert_mode = sp->insmode;
     1353  rl_editing_mode = sp->edmode;
     1354  rl_key_sequence_length = sp->kseqlen;
     1355  rl_instream = sp->inf;
     1356  rl_outstream = sp->outf;
     1357  rl_pending_input = sp->pendingin;
     1358  rl_executing_macro = sp->macro;
     1359
     1360  rl_catch_signals = sp->catchsigs;
     1361  rl_catch_sigwinch = sp->catchsigwinch;
     1362
     1363  return (0);
     1364}
  • lib/sh/shquote.c

    diff -Naur bash-4.3.orig/lib/sh/shquote.c bash-4.3/lib/sh/shquote.c
    old new  
    311311
    312312  return (0);
    313313}
     314
     315int
     316sh_contains_quotes (string)
     317     char *string;
     318{
     319  char *s;
     320
     321  for (s = string; s && *s; s++)
     322    {
     323      if (*s == '\'' || *s == '"' || *s == '\\')
     324        return 1;
     325    }
     326  return 0;
     327}
  • make_cmd.c

    diff -Naur bash-4.3.orig/make_cmd.c bash-4.3/make_cmd.c
    old new  
    692692  /* First do the common cases. */
    693693  temp->redirector = source;
    694694  temp->redirectee = dest_and_filename;
     695  temp->here_doc_eof = 0;
    695696  temp->instruction = instruction;
    696697  temp->flags = 0;
    697698  temp->rflags = flags;
  • parse.y

    diff -Naur bash-4.3.orig/parse.y bash-4.3/parse.y
    old new  
    168168
    169169static int reserved_word_acceptable __P((int));
    170170static int yylex __P((void));
     171
     172static void push_heredoc __P((REDIRECT *));
     173static char *mk_alexpansion __P((char *));
    171174static int alias_expand_token __P((char *));
    172175static int time_command_acceptable __P((void));
    173176static int special_case_tokens __P((char *));
     
    265268
    266269/* Variables to manage the task of reading here documents, because we need to
    267270   defer the reading until after a complete command has been collected. */
    268 static REDIRECT *redir_stack[10];
     271#define HEREDOC_MAX 16
     272
     273static REDIRECT *redir_stack[HEREDOC_MAX];
    269274int need_here_doc;
    270275
    271276/* Where shell input comes from.  History expansion is performed on each
     
    307312   or `for WORD' begins.  This is a nested command maximum, since the array
    308313   index is decremented after a case, select, or for command is parsed. */
    309314#define MAX_CASE_NEST   128
    310 static int word_lineno[MAX_CASE_NEST];
     315static int word_lineno[MAX_CASE_NEST+1];
    311316static int word_top = -1;
    312317
    313318/* If non-zero, it is the token that we want read_token to return
     
    520525                          source.dest = 0;
    521526                          redir.filename = $2;
    522527                          $$ = make_redirection (source, r_reading_until, redir, 0);
    523                           redir_stack[need_here_doc++] = $$;
     528                          push_heredoc ($$);
    524529                        }
    525530        |       NUMBER LESS_LESS WORD
    526531                        {
    527532                          source.dest = $1;
    528533                          redir.filename = $3;
    529534                          $$ = make_redirection (source, r_reading_until, redir, 0);
    530                           redir_stack[need_here_doc++] = $$;
     535                          push_heredoc ($$);
    531536                        }
    532537        |       REDIR_WORD LESS_LESS WORD
    533538                        {
    534539                          source.filename = $1;
    535540                          redir.filename = $3;
    536541                          $$ = make_redirection (source, r_reading_until, redir, REDIR_VARASSIGN);
    537                           redir_stack[need_here_doc++] = $$;
     542                          push_heredoc ($$);
    538543                        }
    539544        |       LESS_LESS_MINUS WORD
    540545                        {
    541546                          source.dest = 0;
    542547                          redir.filename = $2;
    543548                          $$ = make_redirection (source, r_deblank_reading_until, redir, 0);
    544                           redir_stack[need_here_doc++] = $$;
     549                          push_heredoc ($$);
    545550                        }
    546551        |       NUMBER LESS_LESS_MINUS WORD
    547552                        {
    548553                          source.dest = $1;
    549554                          redir.filename = $3;
    550555                          $$ = make_redirection (source, r_deblank_reading_until, redir, 0);
    551                           redir_stack[need_here_doc++] = $$;
     556                          push_heredoc ($$);
    552557                        }
    553558        |       REDIR_WORD  LESS_LESS_MINUS WORD
    554559                        {
    555560                          source.filename = $1;
    556561                          redir.filename = $3;
    557562                          $$ = make_redirection (source, r_deblank_reading_until, redir, REDIR_VARASSIGN);
    558                           redir_stack[need_here_doc++] = $$;
     563                          push_heredoc ($$);
    559564                        }
    560565        |       LESS_LESS_LESS WORD
    561566                        {
     
    24242429         not already end in an EOF character.  */
    24252430      if (shell_input_line_terminator != EOF)
    24262431        {
    2427           if (shell_input_line_size < SIZE_MAX && shell_input_line_len > shell_input_line_size - 3)
     2432          if (shell_input_line_size < SIZE_MAX-3 && (shell_input_line_len+3 > shell_input_line_size))
    24282433            shell_input_line = (char *)xrealloc (shell_input_line,
    24292434                                        1 + (shell_input_line_size += 2));
    24302435
     
    25332538    eol_ungetc_lookahead = c;
    25342539}
    25352540
     2541char *
     2542parser_remaining_input ()
     2543{
     2544  if (shell_input_line == 0)
     2545    return 0;
     2546  if (shell_input_line_index < 0 || shell_input_line_index >= shell_input_line_len)
     2547    return '\0';        /* XXX */
     2548  return (shell_input_line + shell_input_line_index);
     2549}
     2550
    25362551#ifdef INCLUDE_UNUSED
    25372552/* Back the input pointer up by one, effectively `ungetting' a character. */
    25382553static void
     
    26362651   which allow ESAC to be the next one read. */
    26372652static int esacs_needed_count;
    26382653
     2654static void
     2655push_heredoc (r)
     2656     REDIRECT *r;
     2657{
     2658  if (need_here_doc >= HEREDOC_MAX)
     2659    {
     2660      last_command_exit_value = EX_BADUSAGE;
     2661      need_here_doc = 0;
     2662      report_syntax_error (_("maximum here-document count exceeded"));
     2663      reset_parser ();
     2664      exit_shell (last_command_exit_value);
     2665    }
     2666  redir_stack[need_here_doc++] = r;
     2667}
     2668
    26392669void
    26402670gather_here_documents ()
    26412671{
    26422672  int r;
    26432673
    26442674  r = 0;
    2645   while (need_here_doc)
     2675  while (need_here_doc > 0)
    26462676    {
    26472677      parser_state |= PST_HEREDOC;
    26482678      make_here_document (redir_stack[r++], line_number);
     
    29532983  FREE (word_desc_to_read);
    29542984  word_desc_to_read = (WORD_DESC *)NULL;
    29552985
     2986  eol_ungetc_lookahead = 0;
     2987
    29562988  current_token = '\n';         /* XXX */
    29572989  last_read_token = '\n';
    29582990  token_to_read = '\n';
     
    33983430         within a double-quoted ${...} construct "an even number of
    33993431         unescaped double-quotes or single-quotes, if any, shall occur." */
    34003432      /* This was changed in Austin Group Interp 221 */
    3401       if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'')
     3433      if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && dolbrace_state != DOLBRACE_QUOTE2 && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'')
    34023434        continue;
    34033435
    34043436      /* Could also check open == '`' if we want to parse grouping constructs
     
    40054037  reset_parser ();
    40064038  /* reset_parser clears shell_input_line and associated variables */
    40074039  restore_input_line_state (&ls);
    4008   if (interactive)
    4009     token_to_read = 0;
     4040
     4041  token_to_read = 0;
    40104042
    40114043  /* Need to find how many characters parse_and_execute consumed, update
    40124044     *indp, if flags != 0, copy the portion of the string parsed into RET
     
    60756107
    60766108  ps->expand_aliases = expand_aliases;
    60776109  ps->echo_input_at_read = echo_input_at_read;
     6110  ps->need_here_doc = need_here_doc;
    60786111
    60796112  ps->token = token;
    60806113  ps->token_buffer_size = token_buffer_size;
     
    61236156
    61246157  expand_aliases = ps->expand_aliases;
    61256158  echo_input_at_read = ps->echo_input_at_read;
     6159  need_here_doc = ps->need_here_doc;
    61266160
    61276161  FREE (token);
    61286162  token = ps->token;
  • patchlevel.h

    diff -Naur bash-4.3.orig/patchlevel.h bash-4.3/patchlevel.h
    old new  
    2525   regexp `^#define[    ]*PATCHLEVEL', since that's what support/mkversion.sh
    2626   looks for to find the patch level (for the sccs version string). */
    2727
    28 #define PATCHLEVEL 0
     28#define PATCHLEVEL 30
    2929
    3030#endif /* _PATCHLEVEL_H_ */
  • pcomplete.c

    diff -Naur bash-4.3.orig/pcomplete.c bash-4.3/pcomplete.c
    old new  
    183183
    184184COMPSPEC *pcomp_curcs;
    185185const char *pcomp_curcmd;
     186const char *pcomp_curtxt;
    186187
    187188#ifdef DEBUG
    188189/* Debugging code */
     
    753754             quoted strings. */
    754755          dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character);
    755756        }
     757      /* Intended to solve a mismatched assumption by bash-completion.  If
     758         the text to be completed is empty, but bash-completion turns it into
     759         a quoted string ('') assuming that this code will dequote it before
     760         calling readline, do the dequoting. */
     761      else if (iscompgen && iscompleting &&
     762               pcomp_curtxt && *pcomp_curtxt == 0 &&
     763               text && (*text == '\'' || *text == '"') && text[1] == text[0] && text[2] == 0 &&
     764               rl_filename_dequoting_function)
     765        dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character);
     766      /* Another mismatched assumption by bash-completion.  If compgen is being
     767         run as part of bash-completion, and the argument to compgen is not
     768         the same as the word originally passed to the programmable completion
     769         code, dequote the argument if it has quote characters.  It's an
     770         attempt to detect when bash-completion is quoting its filename
     771         argument before calling compgen. */
     772      /* We could check whether gen_shell_function_matches is in the call
     773         stack by checking whether the gen-shell-function-matches tag is in
     774         the unwind-protect stack, but there's no function to do that yet.
     775         We could simply check whether we're executing in a function by
     776         checking variable_context, and may end up doing that. */
     777      else if (iscompgen && iscompleting && rl_filename_dequoting_function &&
     778               pcomp_curtxt && text &&
     779               STREQ (pcomp_curtxt, text) == 0 &&
     780               variable_context &&
     781               sh_contains_quotes (text))       /* guess */
     782        dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character);
    756783      else
    757784        dfn = savestring (text);
    758785    }
     
    15221549     COMPSPEC **lastcs;
    15231550{
    15241551  COMPSPEC *cs, *oldcs;
    1525   const char *oldcmd;
     1552  const char *oldcmd, *oldtxt;
    15261553  STRINGLIST *ret;
    15271554
    15281555  cs = progcomp_search (ocmd);
     
    15451572
    15461573  oldcs = pcomp_curcs;
    15471574  oldcmd = pcomp_curcmd;
     1575  oldtxt = pcomp_curtxt;
    15481576
    15491577  pcomp_curcs = cs;
    15501578  pcomp_curcmd = cmd;
     1579  pcomp_curtxt = word;
    15511580
    15521581  ret = gen_compspec_completions (cs, cmd, word, start, end, foundp);
    15531582
    15541583  pcomp_curcs = oldcs;
    15551584  pcomp_curcmd = oldcmd;
     1585  pcomp_curtxt = oldtxt;
    15561586
    15571587  /* We need to conditionally handle setting *retryp here */
    15581588  if (retryp)
  • shell.h

    diff -Naur bash-4.3.orig/shell.h bash-4.3/shell.h
    old new  
    168168  /* flags state affecting the parser */
    169169  int expand_aliases;
    170170  int echo_input_at_read;
    171  
     171  int need_here_doc;
     172
    172173} sh_parser_state_t;
    173174
    174175typedef struct _sh_input_line_state_t {
     
    179180} sh_input_line_state_t;
    180181
    181182/* Let's try declaring these here. */
     183extern char *parser_remaining_input __P((void));
     184
    182185extern sh_parser_state_t *save_parser_state __P((sh_parser_state_t *));
    183186extern void restore_parser_state __P((sh_parser_state_t *));
    184187
  • subst.c

    diff -Naur bash-4.3.orig/subst.c bash-4.3/subst.c
    old new  
    11921192   Start extracting at (SINDEX) as if we had just seen "<(".
    11931193   Make (SINDEX) get the position of the matching ")". */ /*))*/
    11941194char *
    1195 extract_process_subst (string, starter, sindex)
     1195extract_process_subst (string, starter, sindex, xflags)
    11961196     char *string;
    11971197     char *starter;
    11981198     int *sindex;
     1199     int xflags;
    11991200{
     1201#if 0
    12001202  return (extract_delimited_string (string, sindex, starter, "(", ")", SX_COMMAND));
     1203#else
     1204  xflags |= (no_longjmp_on_fatal_error ? SX_NOLONGJMP : 0);
     1205  return (xparse_dolparen (string, string+*sindex, sindex, xflags));
     1206#endif
    12011207}
    12021208#endif /* PROCESS_SUBSTITUTION */
    12031209
     
    17851791          si = i + 2;
    17861792          if (string[si] == '\0')
    17871793            CQ_RETURN(si);
    1788           temp = extract_process_subst (string, (c == '<') ? "<(" : ">(", &si);
     1794          temp = extract_process_subst (string, (c == '<') ? "<(" : ">(", &si, 0);
    17891795          free (temp);          /* no SX_ALLOC here */
    17901796          i = si;
    17911797          if (string[i] == '\0')
     
    32483254  if (w->word == 0 || w->word[0] == '\0')
    32493255    return ((char *)NULL);
    32503256
     3257  expand_no_split_dollar_star = 1;
    32513258  w->flags |= W_NOSPLIT2;
    32523259  l = call_expand_word_internal (w, 0, 0, (int *)0, (int *)0);
     3260  expand_no_split_dollar_star = 0;
    32533261  if (l)
    32543262    {
    32553263      if (special == 0)                 /* LHS */
     
    73667374    }
    73677375
    73687376  if (want_indir)
    7369     tdesc = parameter_brace_expand_indir (name + 1, var_is_special, quoted, quoted_dollar_atp, contains_dollar_at);
     7377    {
     7378      tdesc = parameter_brace_expand_indir (name + 1, var_is_special, quoted, quoted_dollar_atp, contains_dollar_at);
     7379      /* Turn off the W_ARRAYIND flag because there is no way for this function
     7380         to return the index we're supposed to be using. */
     7381      if (tdesc && tdesc->flags)
     7382        tdesc->flags &= ~W_ARRAYIND;
     7383    }
    73707384  else
    73717385    tdesc = parameter_brace_expand_word (name, var_is_special, quoted, PF_IGNUNBOUND|(pflags&(PF_NOSPLIT2|PF_ASSIGNRHS)), &ind);
    73727386
     
    78477861         We also want to make sure that splitting is done no matter what --
    78487862         according to POSIX.2, this expands to a list of the positional
    78497863         parameters no matter what IFS is set to. */
     7864      /* XXX - what to do when in a context where word splitting is not
     7865         performed? Even when IFS is not the default, posix seems to imply
     7866         that we behave like unquoted $* ?  Maybe we should use PF_NOSPLIT2
     7867         here. */
    78507868      temp = string_list_dollar_at (list, (pflags & PF_ASSIGNRHS) ? (quoted|Q_DOUBLE_QUOTES) : quoted);
    78517869
    78527870      tflag |= W_DOLLARAT;
     
    80298047
    80308048          goto return0;
    80318049        }
    8032       else if (var = find_variable_last_nameref (temp1))
     8050      else if (var && (invisible_p (var) || var_isset (var) == 0))
     8051        temp = (char *)NULL;
     8052      else if ((var = find_variable_last_nameref (temp1)) && var_isset (var) && invisible_p (var) == 0)
    80338053        {
    80348054          temp = nameref_cell (var);
    80358055#if defined (ARRAY_VARS)
     
    82438263            else
    82448264              t_index = sindex + 1; /* skip past both '<' and LPAREN */
    82458265
    8246             temp1 = extract_process_subst (string, (c == '<') ? "<(" : ">(", &t_index); /*))*/
     8266            temp1 = extract_process_subst (string, (c == '<') ? "<(" : ">(", &t_index, 0); /*))*/
    82478267            sindex = t_index;
    82488268
    82498269            /* If the process substitution specification is `<()', we want to
     
    88168836  else
    88178837    {
    88188838      char *ifs_chars;
     8839      char *tstring;
    88198840
    88208841      ifs_chars = (quoted_dollar_at || has_dollar_at) ? ifs_value : (char *)NULL;
    88218842
     
    88308851         regardless of what else has happened to IFS since the expansion. */
    88318852      if (split_on_spaces)
    88328853        list = list_string (istring, " ", 1);   /* XXX quoted == 1? */
     8854      /* If we have $@ (has_dollar_at != 0) and we are in a context where we
     8855         don't want to split the result (W_NOSPLIT2), and we are not quoted,
     8856         we have already separated the arguments with the first character of
     8857         $IFS.  In this case, we want to return a list with a single word
     8858         with the separator possibly replaced with a space (it's what other
     8859         shells seem to do).
     8860         quoted_dollar_at is internal to this function and is set if we are
     8861         passed an argument that is unquoted (quoted == 0) but we encounter a
     8862         double-quoted $@ while expanding it. */
     8863      else if (has_dollar_at && quoted_dollar_at == 0 && ifs_chars && quoted == 0 && (word->flags & W_NOSPLIT2))
     8864        {
     8865          /* Only split and rejoin if we have to */
     8866          if (*ifs_chars && *ifs_chars != ' ')
     8867            {
     8868              list = list_string (istring, *ifs_chars ? ifs_chars : " ", 1);
     8869              tstring = string_list (list);
     8870            }
     8871          else
     8872            tstring = istring;
     8873          tword = make_bare_word (tstring);
     8874          if (tstring != istring)
     8875            free (tstring);
     8876          goto set_word_flags;
     8877        }
    88338878      else if (has_dollar_at && ifs_chars)
    88348879        list = list_string (istring, *ifs_chars ? ifs_chars : " ", 1);
    88358880      else
    88368881        {
    88378882          tword = make_bare_word (istring);
     8883set_word_flags:
    88388884          if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) || (quoted_state == WHOLLY_QUOTED))
    88398885            tword->flags |= W_QUOTED;
    88408886          if (word->flags & W_ASSIGNMENT)
  • subst.h

    diff -Naur bash-4.3.orig/subst.h bash-4.3/subst.h
    old new  
    8282/* Extract the <( or >( construct in STRING, and return a new string.
    8383   Start extracting at (SINDEX) as if we had just seen "<(".
    8484   Make (SINDEX) get the position just after the matching ")". */
    85 extern char *extract_process_subst __P((char *, char *, int *));
     85extern char *extract_process_subst __P((char *, char *, int *, int));
    8686#endif /* PROCESS_SUBSTITUTION */
    8787
    8888/* Extract the name of the variable to bind to from the assignment string. */
  • bash-4.3

    diff -Naur bash-4.3.orig/test.c bash-4.3/test.c
    old new  
    646646      return (v && invisible_p (v) == 0 && var_isset (v) ? TRUE : FALSE);
    647647
    648648    case 'R':
    649       v = find_variable (arg);
    650       return (v && invisible_p (v) == 0 && var_isset (v) && nameref_p (v) ? TRUE : FALSE);
     649      v = find_variable_noref (arg);
     650      return ((v && invisible_p (v) == 0 && var_isset (v) && nameref_p (v)) ? TRUE : FALSE);
    651651    }
    652652
    653653  /* We can't actually get here, but this shuts up gcc. */
     
    723723    case 'o': case 'p': case 'r': case 's': case 't':
    724724    case 'u': case 'v': case 'w': case 'x': case 'z':
    725725    case 'G': case 'L': case 'O': case 'S': case 'N':
     726    case 'R':
    726727      return (1);
    727728    }
    728729
  • bash-4.3

    diff -Naur bash-4.3.orig/trap.c bash-4.3/trap.c
    old new  
    920920      subst_assign_varlist = 0;
    921921
    922922#if defined (JOB_CONTROL)
    923       save_pipeline (1);        /* XXX only provides one save level */
     923      if (sig != DEBUG_TRAP)    /* run_debug_trap does this */
     924        save_pipeline (1);      /* XXX only provides one save level */
    924925#endif
    925926
    926927      /* If we're in a function, make sure return longjmps come here, too. */
     
    940941      trap_exit_value = last_command_exit_value;
    941942
    942943#if defined (JOB_CONTROL)
    943       restore_pipeline (1);
     944      if (sig != DEBUG_TRAP)    /* run_debug_trap does this */
     945        restore_pipeline (1);
    944946#endif
    945947
    946948      subst_assign_varlist = save_subst_varlist;
  • variables.c

    diff -Naur bash-4.3.orig/variables.c bash-4.3/variables.c
    old new  
    8383
    8484#define ifsname(s)      ((s)[0] == 'I' && (s)[1] == 'F' && (s)[2] == 'S' && (s)[3] == '\0')
    8585
     86#define BASHFUNC_PREFIX         "BASH_FUNC_"
     87#define BASHFUNC_PREFLEN        10      /* == strlen(BASHFUNC_PREFIX */
     88#define BASHFUNC_SUFFIX         "%%"
     89#define BASHFUNC_SUFFLEN        2       /* == strlen(BASHFUNC_SUFFIX) */
     90
    8691extern char **environ;
    8792
    8893/* Variables used here and defined in other files. */
     
    279284static void propagate_temp_var __P((PTR_T));
    280285static void dispose_temporary_env __P((sh_free_func_t *));     
    281286
    282 static inline char *mk_env_string __P((const char *, const char *));
     287static inline char *mk_env_string __P((const char *, const char *, int));
    283288static char **make_env_array_from_var_list __P((SHELL_VAR **));
    284289static char **make_var_export_array __P((VAR_CONTEXT *));
    285290static char **make_func_export_array __P((void));
     
    349354
    350355      /* If exported function, define it now.  Don't import functions from
    351356         the environment in privileged mode. */
    352       if (privmode == 0 && read_but_dont_execute == 0 && STREQN ("() {", string, 4))
     357      if (privmode == 0 && read_but_dont_execute == 0 &&
     358          STREQN (BASHFUNC_PREFIX, name, BASHFUNC_PREFLEN) &&
     359          STREQ (BASHFUNC_SUFFIX, name + char_index - BASHFUNC_SUFFLEN) &&
     360          STREQN ("() {", string, 4))
    353361        {
    354           string_length = strlen (string);
    355           temp_string = (char *)xmalloc (3 + string_length + char_index);
     362          size_t namelen;
     363          char *tname;          /* desired imported function name */
    356364
    357           strcpy (temp_string, name);
    358           temp_string[char_index] = ' ';
    359           strcpy (temp_string + char_index + 1, string);
     365          namelen = char_index - BASHFUNC_PREFLEN - BASHFUNC_SUFFLEN;
    360366
    361           if (posixly_correct == 0 || legal_identifier (name))
    362             parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST);
     367          tname = name + BASHFUNC_PREFLEN;      /* start of func name */
     368          tname[namelen] = '\0';                /* now tname == func name */
     369
     370          string_length = strlen (string);
     371          temp_string = (char *)xmalloc (namelen + string_length + 2);
    363372
    364           /* Ancient backwards compatibility.  Old versions of bash exported
    365              functions like name()=() {...} */
    366           if (name[char_index - 1] == ')' && name[char_index - 2] == '(')
    367             name[char_index - 2] = '\0';
     373          memcpy (temp_string, tname, namelen);
     374          temp_string[namelen] = ' ';
     375          memcpy (temp_string + namelen + 1, string, string_length + 1);
     376
     377          /* Don't import function names that are invalid identifiers from the
     378             environment, though we still allow them to be defined as shell
     379             variables. */
     380          if (absolute_program (tname) == 0 && (posixly_correct == 0 || legal_identifier (tname)))
     381            parse_and_execute (temp_string, tname, SEVAL_NONINT|SEVAL_NOHIST|SEVAL_FUNCDEF|SEVAL_ONECMD);
    368382
    369           if (temp_var = find_function (name))
     383          if (temp_var = find_function (tname))
    370384            {
    371385              VSETATTR (temp_var, (att_exported|att_imported));
    372386              array_needs_making = 1;
     
    379393                  array_needs_making = 1;
    380394                }
    381395              last_command_exit_value = 1;
    382               report_error (_("error importing function definition for `%s'"), name);
     396              report_error (_("error importing function definition for `%s'"), tname);
    383397            }
    384398
    385           /* ( */
    386           if (name[char_index - 1] == ')' && name[char_index - 2] == '\0')
    387             name[char_index - 2] = '(';         /* ) */
     399          /* Restore original suffix */
     400          tname[namelen] = BASHFUNC_SUFFIX[0];
    388401        }
    389402#if defined (ARRAY_VARS)
    390403#  if ARRAY_EXPORT
     
    21972210  /* local foo; local foo;  is a no-op. */
    21982211  old_var = find_variable (name);
    21992212  if (old_var && local_p (old_var) && old_var->context == variable_context)
    2200     {
    2201       VUNSETATTR (old_var, att_invisible);      /* XXX */
    2202       return (old_var);
    2203     }
     2213    return (old_var);
    22042214
    22052215  was_tmpvar = old_var && tempvar_p (old_var);
    22062216  /* If we're making a local variable in a shell function, the temporary env
     
    29632973  var->context = variable_context;      /* XXX */
    29642974
    29652975  INVALIDATE_EXPORTSTR (var);
    2966   var->exportstr = mk_env_string (name, value);
     2976  var->exportstr = mk_env_string (name, value, 0);
    29672977
    29682978  array_needs_making = 1;
    29692979
     
    38613871/* **************************************************************** */
    38623872
    38633873static inline char *
    3864 mk_env_string (name, value)
     3874mk_env_string (name, value, isfunc)
    38653875     const char *name, *value;
     3876     int isfunc;
    38663877{
    3867   int name_len, value_len;
    3868   char  *p;
     3878  size_t name_len, value_len;
     3879  char  *p, *q;
    38693880
    38703881  name_len = strlen (name);
    38713882  value_len = STRLEN (value);
    3872   p = (char *)xmalloc (2 + name_len + value_len);
    3873   strcpy (p, name);
    3874   p[name_len] = '=';
     3883
     3884  /* If we are exporting a shell function, construct the encoded function
     3885     name. */
     3886  if (isfunc && value)
     3887    {
     3888      p = (char *)xmalloc (BASHFUNC_PREFLEN + name_len + BASHFUNC_SUFFLEN + value_len + 2);
     3889      q = p;
     3890      memcpy (q, BASHFUNC_PREFIX, BASHFUNC_PREFLEN);
     3891      q += BASHFUNC_PREFLEN;
     3892      memcpy (q, name, name_len);
     3893      q += name_len;
     3894      memcpy (q, BASHFUNC_SUFFIX, BASHFUNC_SUFFLEN);
     3895      q += BASHFUNC_SUFFLEN;
     3896    }
     3897  else
     3898    {
     3899      p = (char *)xmalloc (2 + name_len + value_len);
     3900      memcpy (p, name, name_len);
     3901      q = p + name_len;
     3902    }
     3903
     3904  q[0] = '=';
    38753905  if (value && *value)
    3876     strcpy (p + name_len + 1, value);
     3906    memcpy (q + 1, value, value_len + 1);
    38773907  else
    3878     p[name_len + 1] = '\0';
     3908    q[1] = '\0';
     3909
    38793910  return (p);
    38803911}
    38813912
     
    39613992          /* Gee, I'd like to get away with not using savestring() if we're
    39623993             using the cached exportstr... */
    39633994          list[list_index] = USE_EXPORTSTR ? savestring (value)
    3964                                            : mk_env_string (var->name, value);
     3995                                           : mk_env_string (var->name, value, function_p (var));
    39653996
    39663997          if (USE_EXPORTSTR == 0)
    39673998            SAVE_EXPORTSTR (var, list[list_index]);
  • y.tab.c

    diff -Naur bash-4.3.orig/y.tab.c bash-4.3/y.tab.c
    old new  
    168168
    169169
    170170/* Copy the first part of user declarations.  */
    171 #line 21 "/usr/homes/chet/src/bash/src/parse.y"
     171#line 21 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    172172
    173173#include "config.h"
    174174
     
    319319
    320320static int reserved_word_acceptable __P((int));
    321321static int yylex __P((void));
     322
     323static void push_heredoc __P((REDIRECT *));
     324static char *mk_alexpansion __P((char *));
    322325static int alias_expand_token __P((char *));
    323326static int time_command_acceptable __P((void));
    324327static int special_case_tokens __P((char *));
     
    416419
    417420/* Variables to manage the task of reading here documents, because we need to
    418421   defer the reading until after a complete command has been collected. */
    419 static REDIRECT *redir_stack[10];
     422#define HEREDOC_MAX 16
     423
     424static REDIRECT *redir_stack[HEREDOC_MAX];
    420425int need_here_doc;
    421426
    422427/* Where shell input comes from.  History expansion is performed on each
     
    458463   or `for WORD' begins.  This is a nested command maximum, since the array
    459464   index is decremented after a case, select, or for command is parsed. */
    460465#define MAX_CASE_NEST   128
    461 static int word_lineno[MAX_CASE_NEST];
     466static int word_lineno[MAX_CASE_NEST+1];
    462467static int word_top = -1;
    463468
    464469/* If non-zero, it is the token that we want read_token to return
     
    492497
    493498#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
    494499typedef union YYSTYPE
    495 #line 324 "/usr/homes/chet/src/bash/src/parse.y"
     500#line 329 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    496501{
    497502  WORD_DESC *word;              /* the word that we read. */
    498503  int number;                   /* the number that we read. */
     
    503508  PATTERN_LIST *pattern;
    504509}
    505510/* Line 193 of yacc.c.  */
    506 #line 507 "y.tab.c"
     511#line 512 "y.tab.c"
    507512        YYSTYPE;
    508513# define yystype YYSTYPE /* obsolescent; will be withdrawn */
    509514# define YYSTYPE_IS_DECLARED 1
     
    516521
    517522
    518523/* Line 216 of yacc.c.  */
    519 #line 520 "y.tab.c"
     524#line 525 "y.tab.c"
    520525
    521526#ifdef short
    522527# undef short
     
    886891/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
    887892static const yytype_uint16 yyrline[] =
    888893{
    889        0,   377,   377,   388,   397,   412,   422,   424,   428,   434,
    890      440,   446,   452,   458,   464,   470,   476,   482,   488,   494,
    891      500,   506,   512,   518,   525,   532,   539,   546,   553,   560,
    892      566,   572,   578,   584,   590,   596,   602,   608,   614,   620,
    893      626,   632,   638,   644,   650,   656,   662,   668,   674,   680,
    894      686,   692,   700,   702,   704,   708,   712,   723,   725,   729,
    895      731,   733,   749,   751,   755,   757,   759,   761,   763,   765,
    896      767,   769,   771,   773,   775,   779,   784,   789,   794,   799,
    897      804,   809,   814,   821,   826,   831,   836,   843,   848,   853,
    898      858,   863,   868,   875,   880,   885,   892,   895,   898,   902,
    899      904,   935,   942,   947,   964,   969,   986,   993,   995,   997,
    900     1002,  1006,  1010,  1014,  1016,  1018,  1022,  1023,  1027,  1029,
    901     1031,  1033,  1037,  1039,  1041,  1043,  1045,  1047,  1051,  1053,
    902     1062,  1070,  1071,  1077,  1078,  1085,  1089,  1091,  1093,  1100,
    903     1102,  1104,  1108,  1109,  1112,  1114,  1116,  1120,  1121,  1130,
    904     1143,  1159,  1174,  1176,  1178,  1185,  1188,  1192,  1194,  1200,
    905     1206,  1223,  1243,  1245,  1268,  1272,  1274,  1276
     894       0,   382,   382,   393,   402,   417,   427,   429,   433,   439,
     895     445,   451,   457,   463,   469,   475,   481,   487,   493,   499,
     896     505,   511,   517,   523,   530,   537,   544,   551,   558,   565,
     897     571,   577,   583,   589,   595,   601,   607,   613,   619,   625,
     898     631,   637,   643,   649,   655,   661,   667,   673,   679,   685,
     899     691,   697,   705,   707,   709,   713,   717,   728,   730,   734,
     900     736,   738,   754,   756,   760,   762,   764,   766,   768,   770,
     901     772,   774,   776,   778,   780,   784,   789,   794,   799,   804,
     902     809,   814,   819,   826,   831,   836,   841,   848,   853,   858,
     903     863,   868,   873,   880,   885,   890,   897,   900,   903,   907,
     904     909,   940,   947,   952,   969,   974,   991,   998,  1000,  1002,
     905    1007,  1011,  1015,  1019,  1021,  1023,  1027,  1028,  1032,  1034,
     906    1036,  1038,  1042,  1044,  1046,  1048,  1050,  1052,  1056,  1058,
     907    1067,  1075,  1076,  1082,  1083,  1090,  1094,  1096,  1098,  1105,
     908    1107,  1109,  1113,  1114,  1117,  1119,  1121,  1125,  1126,  1135,
     909    1148,  1164,  1179,  1181,  1183,  1190,  1193,  1197,  1199,  1205,
     910    1211,  1228,  1248,  1250,  1273,  1277,  1279,  1281
    906911};
    907912#endif
    908913
     
    20932098  switch (yyn)
    20942099    {
    20952100        case 2:
    2096 #line 378 "/usr/homes/chet/src/bash/src/parse.y"
     2101#line 383 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    20972102    {
    20982103                          /* Case of regular command.  Discard the error
    20992104                             safety net,and return the command just parsed. */
     
    21072112    break;
    21082113
    21092114  case 3:
    2110 #line 389 "/usr/homes/chet/src/bash/src/parse.y"
     2115#line 394 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    21112116    {
    21122117                          /* Case of regular command, but not a very
    21132118                             interesting one.  Return a NULL command. */
     
    21192124    break;
    21202125
    21212126  case 4:
    2122 #line 398 "/usr/homes/chet/src/bash/src/parse.y"
     2127#line 403 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    21232128    {
    21242129                          /* Error during parsing.  Return NULL command. */
    21252130                          global_command = (COMMAND *)NULL;
     
    21372142    break;
    21382143
    21392144  case 5:
    2140 #line 413 "/usr/homes/chet/src/bash/src/parse.y"
     2145#line 418 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    21412146    {
    21422147                          /* Case of EOF seen by itself.  Do ignoreeof or
    21432148                             not. */
     
    21482153    break;
    21492154
    21502155  case 6:
    2151 #line 423 "/usr/homes/chet/src/bash/src/parse.y"
     2156#line 428 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    21522157    { (yyval.word_list) = make_word_list ((yyvsp[(1) - (1)].word), (WORD_LIST *)NULL); }
    21532158    break;
    21542159
    21552160  case 7:
    2156 #line 425 "/usr/homes/chet/src/bash/src/parse.y"
     2161#line 430 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    21572162    { (yyval.word_list) = make_word_list ((yyvsp[(2) - (2)].word), (yyvsp[(1) - (2)].word_list)); }
    21582163    break;
    21592164
    21602165  case 8:
    2161 #line 429 "/usr/homes/chet/src/bash/src/parse.y"
     2166#line 434 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    21622167    {
    21632168                          source.dest = 1;
    21642169                          redir.filename = (yyvsp[(2) - (2)].word);
     
    21672172    break;
    21682173
    21692174  case 9:
    2170 #line 435 "/usr/homes/chet/src/bash/src/parse.y"
     2175#line 440 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    21712176    {
    21722177                          source.dest = 0;
    21732178                          redir.filename = (yyvsp[(2) - (2)].word);
     
    21762181    break;
    21772182
    21782183  case 10:
    2179 #line 441 "/usr/homes/chet/src/bash/src/parse.y"
     2184#line 446 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    21802185    {
    21812186                          source.dest = (yyvsp[(1) - (3)].number);
    21822187                          redir.filename = (yyvsp[(3) - (3)].word);
     
    21852190    break;
    21862191
    21872192  case 11:
    2188 #line 447 "/usr/homes/chet/src/bash/src/parse.y"
     2193#line 452 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    21892194    {
    21902195                          source.dest = (yyvsp[(1) - (3)].number);
    21912196                          redir.filename = (yyvsp[(3) - (3)].word);
     
    21942199    break;
    21952200
    21962201  case 12:
    2197 #line 453 "/usr/homes/chet/src/bash/src/parse.y"
     2202#line 458 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    21982203    {
    21992204                          source.filename = (yyvsp[(1) - (3)].word);
    22002205                          redir.filename = (yyvsp[(3) - (3)].word);
     
    22032208    break;
    22042209
    22052210  case 13:
    2206 #line 459 "/usr/homes/chet/src/bash/src/parse.y"
     2211#line 464 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    22072212    {
    22082213                          source.filename = (yyvsp[(1) - (3)].word);
    22092214                          redir.filename = (yyvsp[(3) - (3)].word);
     
    22122217    break;
    22132218
    22142219  case 14:
    2215 #line 465 "/usr/homes/chet/src/bash/src/parse.y"
     2220#line 470 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    22162221    {
    22172222                          source.dest = 1;
    22182223                          redir.filename = (yyvsp[(2) - (2)].word);
     
    22212226    break;
    22222227
    22232228  case 15:
    2224 #line 471 "/usr/homes/chet/src/bash/src/parse.y"
     2229#line 476 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    22252230    {
    22262231                          source.dest = (yyvsp[(1) - (3)].number);
    22272232                          redir.filename = (yyvsp[(3) - (3)].word);
     
    22302235    break;
    22312236
    22322237  case 16:
    2233 #line 477 "/usr/homes/chet/src/bash/src/parse.y"
     2238#line 482 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    22342239    {
    22352240                          source.filename = (yyvsp[(1) - (3)].word);
    22362241                          redir.filename = (yyvsp[(3) - (3)].word);
     
    22392244    break;
    22402245
    22412246  case 17:
    2242 #line 483 "/usr/homes/chet/src/bash/src/parse.y"
     2247#line 488 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    22432248    {
    22442249                          source.dest = 1;
    22452250                          redir.filename = (yyvsp[(2) - (2)].word);
     
    22482253    break;
    22492254
    22502255  case 18:
    2251 #line 489 "/usr/homes/chet/src/bash/src/parse.y"
     2256#line 494 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    22522257    {
    22532258                          source.dest = (yyvsp[(1) - (3)].number);
    22542259                          redir.filename = (yyvsp[(3) - (3)].word);
     
    22572262    break;
    22582263
    22592264  case 19:
    2260 #line 495 "/usr/homes/chet/src/bash/src/parse.y"
     2265#line 500 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    22612266    {
    22622267                          source.filename = (yyvsp[(1) - (3)].word);
    22632268                          redir.filename = (yyvsp[(3) - (3)].word);
     
    22662271    break;
    22672272
    22682273  case 20:
    2269 #line 501 "/usr/homes/chet/src/bash/src/parse.y"
     2274#line 506 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    22702275    {
    22712276                          source.dest = 0;
    22722277                          redir.filename = (yyvsp[(2) - (2)].word);
     
    22752280    break;
    22762281
    22772282  case 21:
    2278 #line 507 "/usr/homes/chet/src/bash/src/parse.y"
     2283#line 512 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    22792284    {
    22802285                          source.dest = (yyvsp[(1) - (3)].number);
    22812286                          redir.filename = (yyvsp[(3) - (3)].word);
     
    22842289    break;
    22852290
    22862291  case 22:
    2287 #line 513 "/usr/homes/chet/src/bash/src/parse.y"
     2292#line 518 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    22882293    {
    22892294                          source.filename = (yyvsp[(1) - (3)].word);
    22902295                          redir.filename = (yyvsp[(3) - (3)].word);
     
    22932298    break;
    22942299
    22952300  case 23:
    2296 #line 519 "/usr/homes/chet/src/bash/src/parse.y"
     2301#line 524 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    22972302    {
    22982303                          source.dest = 0;
    22992304                          redir.filename = (yyvsp[(2) - (2)].word);
    23002305                          (yyval.redirect) = make_redirection (source, r_reading_until, redir, 0);
    2301                           redir_stack[need_here_doc++] = (yyval.redirect);
     2306                          push_heredoc ((yyval.redirect));
    23022307                        }
    23032308    break;
    23042309
    23052310  case 24:
    2306 #line 526 "/usr/homes/chet/src/bash/src/parse.y"
     2311#line 531 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    23072312    {
    23082313                          source.dest = (yyvsp[(1) - (3)].number);
    23092314                          redir.filename = (yyvsp[(3) - (3)].word);
    23102315                          (yyval.redirect) = make_redirection (source, r_reading_until, redir, 0);
    2311                           redir_stack[need_here_doc++] = (yyval.redirect);
     2316                          push_heredoc ((yyval.redirect));
    23122317                        }
    23132318    break;
    23142319
    23152320  case 25:
    2316 #line 533 "/usr/homes/chet/src/bash/src/parse.y"
     2321#line 538 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    23172322    {
    23182323                          source.filename = (yyvsp[(1) - (3)].word);
    23192324                          redir.filename = (yyvsp[(3) - (3)].word);
    23202325                          (yyval.redirect) = make_redirection (source, r_reading_until, redir, REDIR_VARASSIGN);
    2321                           redir_stack[need_here_doc++] = (yyval.redirect);
     2326                          push_heredoc ((yyval.redirect));
    23222327                        }
    23232328    break;
    23242329
    23252330  case 26:
    2326 #line 540 "/usr/homes/chet/src/bash/src/parse.y"
     2331#line 545 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    23272332    {
    23282333                          source.dest = 0;
    23292334                          redir.filename = (yyvsp[(2) - (2)].word);
    23302335                          (yyval.redirect) = make_redirection (source, r_deblank_reading_until, redir, 0);
    2331                           redir_stack[need_here_doc++] = (yyval.redirect);
     2336                          push_heredoc ((yyval.redirect));
    23322337                        }
    23332338    break;
    23342339
    23352340  case 27:
    2336 #line 547 "/usr/homes/chet/src/bash/src/parse.y"
     2341#line 552 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    23372342    {
    23382343                          source.dest = (yyvsp[(1) - (3)].number);
    23392344                          redir.filename = (yyvsp[(3) - (3)].word);
    23402345                          (yyval.redirect) = make_redirection (source, r_deblank_reading_until, redir, 0);
    2341                           redir_stack[need_here_doc++] = (yyval.redirect);
     2346                          push_heredoc ((yyval.redirect));
    23422347                        }
    23432348    break;
    23442349
    23452350  case 28:
    2346 #line 554 "/usr/homes/chet/src/bash/src/parse.y"
     2351#line 559 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    23472352    {
    23482353                          source.filename = (yyvsp[(1) - (3)].word);
    23492354                          redir.filename = (yyvsp[(3) - (3)].word);
    23502355                          (yyval.redirect) = make_redirection (source, r_deblank_reading_until, redir, REDIR_VARASSIGN);
    2351                           redir_stack[need_here_doc++] = (yyval.redirect);
     2356                          push_heredoc ((yyval.redirect));
    23522357                        }
    23532358    break;
    23542359
    23552360  case 29:
    2356 #line 561 "/usr/homes/chet/src/bash/src/parse.y"
     2361#line 566 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    23572362    {
    23582363                          source.dest = 0;
    23592364                          redir.filename = (yyvsp[(2) - (2)].word);
     
    23622367    break;
    23632368
    23642369  case 30:
    2365 #line 567 "/usr/homes/chet/src/bash/src/parse.y"
     2370#line 572 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    23662371    {
    23672372                          source.dest = (yyvsp[(1) - (3)].number);
    23682373                          redir.filename = (yyvsp[(3) - (3)].word);
     
    23712376    break;
    23722377
    23732378  case 31:
    2374 #line 573 "/usr/homes/chet/src/bash/src/parse.y"
     2379#line 578 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    23752380    {
    23762381                          source.filename = (yyvsp[(1) - (3)].word);
    23772382                          redir.filename = (yyvsp[(3) - (3)].word);
     
    23802385    break;
    23812386
    23822387  case 32:
    2383 #line 579 "/usr/homes/chet/src/bash/src/parse.y"
     2388#line 584 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    23842389    {
    23852390                          source.dest = 0;
    23862391                          redir.dest = (yyvsp[(2) - (2)].number);
     
    23892394    break;
    23902395
    23912396  case 33:
    2392 #line 585 "/usr/homes/chet/src/bash/src/parse.y"
     2397#line 590 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    23932398    {
    23942399                          source.dest = (yyvsp[(1) - (3)].number);
    23952400                          redir.dest = (yyvsp[(3) - (3)].number);
     
    23982403    break;
    23992404
    24002405  case 34:
    2401 #line 591 "/usr/homes/chet/src/bash/src/parse.y"
     2406#line 596 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    24022407    {
    24032408                          source.filename = (yyvsp[(1) - (3)].word);
    24042409                          redir.dest = (yyvsp[(3) - (3)].number);
     
    24072412    break;
    24082413
    24092414  case 35:
    2410 #line 597 "/usr/homes/chet/src/bash/src/parse.y"
     2415#line 602 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    24112416    {
    24122417                          source.dest = 1;
    24132418                          redir.dest = (yyvsp[(2) - (2)].number);
     
    24162421    break;
    24172422
    24182423  case 36:
    2419 #line 603 "/usr/homes/chet/src/bash/src/parse.y"
     2424#line 608 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    24202425    {
    24212426                          source.dest = (yyvsp[(1) - (3)].number);
    24222427                          redir.dest = (yyvsp[(3) - (3)].number);
     
    24252430    break;
    24262431
    24272432  case 37:
    2428 #line 609 "/usr/homes/chet/src/bash/src/parse.y"
     2433#line 614 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    24292434    {
    24302435                          source.filename = (yyvsp[(1) - (3)].word);
    24312436                          redir.dest = (yyvsp[(3) - (3)].number);
     
    24342439    break;
    24352440
    24362441  case 38:
    2437 #line 615 "/usr/homes/chet/src/bash/src/parse.y"
     2442#line 620 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    24382443    {
    24392444                          source.dest = 0;
    24402445                          redir.filename = (yyvsp[(2) - (2)].word);
     
    24432448    break;
    24442449
    24452450  case 39:
    2446 #line 621 "/usr/homes/chet/src/bash/src/parse.y"
     2451#line 626 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    24472452    {
    24482453                          source.dest = (yyvsp[(1) - (3)].number);
    24492454                          redir.filename = (yyvsp[(3) - (3)].word);
     
    24522457    break;
    24532458
    24542459  case 40:
    2455 #line 627 "/usr/homes/chet/src/bash/src/parse.y"
     2460#line 632 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    24562461    {
    24572462                          source.filename = (yyvsp[(1) - (3)].word);
    24582463                          redir.filename = (yyvsp[(3) - (3)].word);
     
    24612466    break;
    24622467
    24632468  case 41:
    2464 #line 633 "/usr/homes/chet/src/bash/src/parse.y"
     2469#line 638 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    24652470    {
    24662471                          source.dest = 1;
    24672472                          redir.filename = (yyvsp[(2) - (2)].word);
     
    24702475    break;
    24712476
    24722477  case 42:
    2473 #line 639 "/usr/homes/chet/src/bash/src/parse.y"
     2478#line 644 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    24742479    {
    24752480                          source.dest = (yyvsp[(1) - (3)].number);
    24762481                          redir.filename = (yyvsp[(3) - (3)].word);
     
    24792484    break;
    24802485
    24812486  case 43:
    2482 #line 645 "/usr/homes/chet/src/bash/src/parse.y"
     2487#line 650 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    24832488    {
    24842489                          source.filename = (yyvsp[(1) - (3)].word);
    24852490                          redir.filename = (yyvsp[(3) - (3)].word);
     
    24882493    break;
    24892494
    24902495  case 44:
    2491 #line 651 "/usr/homes/chet/src/bash/src/parse.y"
     2496#line 656 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    24922497    {
    24932498                          source.dest = 1;
    24942499                          redir.dest = 0;
     
    24972502    break;
    24982503
    24992504  case 45:
    2500 #line 657 "/usr/homes/chet/src/bash/src/parse.y"
     2505#line 662 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    25012506    {
    25022507                          source.dest = (yyvsp[(1) - (3)].number);
    25032508                          redir.dest = 0;
     
    25062511    break;
    25072512
    25082513  case 46:
    2509 #line 663 "/usr/homes/chet/src/bash/src/parse.y"
     2514#line 668 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    25102515    {
    25112516                          source.filename = (yyvsp[(1) - (3)].word);
    25122517                          redir.dest = 0;
     
    25152520    break;
    25162521
    25172522  case 47:
    2518 #line 669 "/usr/homes/chet/src/bash/src/parse.y"
     2523#line 674 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    25192524    {
    25202525                          source.dest = 0;
    25212526                          redir.dest = 0;
     
    25242529    break;
    25252530
    25262531  case 48:
    2527 #line 675 "/usr/homes/chet/src/bash/src/parse.y"
     2532#line 680 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    25282533    {
    25292534                          source.dest = (yyvsp[(1) - (3)].number);
    25302535                          redir.dest = 0;
     
    25332538    break;
    25342539
    25352540  case 49:
    2536 #line 681 "/usr/homes/chet/src/bash/src/parse.y"
     2541#line 686 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    25372542    {
    25382543                          source.filename = (yyvsp[(1) - (3)].word);
    25392544                          redir.dest = 0;
     
    25422547    break;
    25432548
    25442549  case 50:
    2545 #line 687 "/usr/homes/chet/src/bash/src/parse.y"
     2550#line 692 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    25462551    {
    25472552                          source.dest = 1;
    25482553                          redir.filename = (yyvsp[(2) - (2)].word);
     
    25512556    break;
    25522557
    25532558  case 51:
    2554 #line 693 "/usr/homes/chet/src/bash/src/parse.y"
     2559#line 698 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    25552560    {
    25562561                          source.dest = 1;
    25572562                          redir.filename = (yyvsp[(2) - (2)].word);
     
    25602565    break;
    25612566
    25622567  case 52:
    2563 #line 701 "/usr/homes/chet/src/bash/src/parse.y"
     2568#line 706 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    25642569    { (yyval.element).word = (yyvsp[(1) - (1)].word); (yyval.element).redirect = 0; }
    25652570    break;
    25662571
    25672572  case 53:
    2568 #line 703 "/usr/homes/chet/src/bash/src/parse.y"
     2573#line 708 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    25692574    { (yyval.element).word = (yyvsp[(1) - (1)].word); (yyval.element).redirect = 0; }
    25702575    break;
    25712576
    25722577  case 54:
    2573 #line 705 "/usr/homes/chet/src/bash/src/parse.y"
     2578#line 710 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    25742579    { (yyval.element).redirect = (yyvsp[(1) - (1)].redirect); (yyval.element).word = 0; }
    25752580    break;
    25762581
    25772582  case 55:
    2578 #line 709 "/usr/homes/chet/src/bash/src/parse.y"
     2583#line 714 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    25792584    {
    25802585                          (yyval.redirect) = (yyvsp[(1) - (1)].redirect);
    25812586                        }
    25822587    break;
    25832588
    25842589  case 56:
    2585 #line 713 "/usr/homes/chet/src/bash/src/parse.y"
     2590#line 718 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    25862591    {
    25872592                          register REDIRECT *t;
    25882593
     
    25942599    break;
    25952600
    25962601  case 57:
    2597 #line 724 "/usr/homes/chet/src/bash/src/parse.y"
     2602#line 729 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    25982603    { (yyval.command) = make_simple_command ((yyvsp[(1) - (1)].element), (COMMAND *)NULL); }
    25992604    break;
    26002605
    26012606  case 58:
    2602 #line 726 "/usr/homes/chet/src/bash/src/parse.y"
     2607#line 731 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    26032608    { (yyval.command) = make_simple_command ((yyvsp[(2) - (2)].element), (yyvsp[(1) - (2)].command)); }
    26042609    break;
    26052610
    26062611  case 59:
    2607 #line 730 "/usr/homes/chet/src/bash/src/parse.y"
     2612#line 735 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    26082613    { (yyval.command) = clean_simple_command ((yyvsp[(1) - (1)].command)); }
    26092614    break;
    26102615
    26112616  case 60:
    2612 #line 732 "/usr/homes/chet/src/bash/src/parse.y"
     2617#line 737 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    26132618    { (yyval.command) = (yyvsp[(1) - (1)].command); }
    26142619    break;
    26152620
    26162621  case 61:
    2617 #line 734 "/usr/homes/chet/src/bash/src/parse.y"
     2622#line 739 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    26182623    {
    26192624                          COMMAND *tc;
    26202625
     
    26332638    break;
    26342639
    26352640  case 62:
    2636 #line 750 "/usr/homes/chet/src/bash/src/parse.y"
     2641#line 755 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    26372642    { (yyval.command) = (yyvsp[(1) - (1)].command); }
    26382643    break;
    26392644
    26402645  case 63:
    2641 #line 752 "/usr/homes/chet/src/bash/src/parse.y"
     2646#line 757 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    26422647    { (yyval.command) = (yyvsp[(1) - (1)].command); }
    26432648    break;
    26442649
    26452650  case 64:
    2646 #line 756 "/usr/homes/chet/src/bash/src/parse.y"
     2651#line 761 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    26472652    { (yyval.command) = (yyvsp[(1) - (1)].command); }
    26482653    break;
    26492654
    26502655  case 65:
    2651 #line 758 "/usr/homes/chet/src/bash/src/parse.y"
     2656#line 763 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    26522657    { (yyval.command) = (yyvsp[(1) - (1)].command); }
    26532658    break;
    26542659
    26552660  case 66:
    2656 #line 760 "/usr/homes/chet/src/bash/src/parse.y"
     2661#line 765 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    26572662    { (yyval.command) = make_while_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command)); }
    26582663    break;
    26592664
    26602665  case 67:
    2661 #line 762 "/usr/homes/chet/src/bash/src/parse.y"
     2666#line 767 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    26622667    { (yyval.command) = make_until_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command)); }
    26632668    break;
    26642669
    26652670  case 68:
    2666 #line 764 "/usr/homes/chet/src/bash/src/parse.y"
     2671#line 769 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    26672672    { (yyval.command) = (yyvsp[(1) - (1)].command); }
    26682673    break;
    26692674
    26702675  case 69:
    2671 #line 766 "/usr/homes/chet/src/bash/src/parse.y"
     2676#line 771 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    26722677    { (yyval.command) = (yyvsp[(1) - (1)].command); }
    26732678    break;
    26742679
    26752680  case 70:
    2676 #line 768 "/usr/homes/chet/src/bash/src/parse.y"
     2681#line 773 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    26772682    { (yyval.command) = (yyvsp[(1) - (1)].command); }
    26782683    break;
    26792684
    26802685  case 71:
    2681 #line 770 "/usr/homes/chet/src/bash/src/parse.y"
     2686#line 775 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    26822687    { (yyval.command) = (yyvsp[(1) - (1)].command); }
    26832688    break;
    26842689
    26852690  case 72:
    2686 #line 772 "/usr/homes/chet/src/bash/src/parse.y"
     2691#line 777 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    26872692    { (yyval.command) = (yyvsp[(1) - (1)].command); }
    26882693    break;
    26892694
    26902695  case 73:
    2691 #line 774 "/usr/homes/chet/src/bash/src/parse.y"
     2696#line 779 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    26922697    { (yyval.command) = (yyvsp[(1) - (1)].command); }
    26932698    break;
    26942699
    26952700  case 74:
    2696 #line 776 "/usr/homes/chet/src/bash/src/parse.y"
     2701#line 781 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    26972702    { (yyval.command) = (yyvsp[(1) - (1)].command); }
    26982703    break;
    26992704
    27002705  case 75:
    2701 #line 780 "/usr/homes/chet/src/bash/src/parse.y"
     2706#line 785 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    27022707    {
    27032708                          (yyval.command) = make_for_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]);
    27042709                          if (word_top > 0) word_top--;
     
    27062711    break;
    27072712
    27082713  case 76:
    2709 #line 785 "/usr/homes/chet/src/bash/src/parse.y"
     2714#line 790 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    27102715    {
    27112716                          (yyval.command) = make_for_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]);
    27122717                          if (word_top > 0) word_top--;
     
    27142719    break;
    27152720
    27162721  case 77:
    2717 #line 790 "/usr/homes/chet/src/bash/src/parse.y"
     2722#line 795 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    27182723    {
    27192724                          (yyval.command) = make_for_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]);
    27202725                          if (word_top > 0) word_top--;
     
    27222727    break;
    27232728
    27242729  case 78:
    2725 #line 795 "/usr/homes/chet/src/bash/src/parse.y"
     2730#line 800 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    27262731    {
    27272732                          (yyval.command) = make_for_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]);
    27282733                          if (word_top > 0) word_top--;
     
    27302735    break;
    27312736
    27322737  case 79:
    2733 #line 800 "/usr/homes/chet/src/bash/src/parse.y"
     2738#line 805 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    27342739    {
    27352740                          (yyval.command) = make_for_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]);
    27362741                          if (word_top > 0) word_top--;
     
    27382743    break;
    27392744
    27402745  case 80:
    2741 #line 805 "/usr/homes/chet/src/bash/src/parse.y"
     2746#line 810 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    27422747    {
    27432748                          (yyval.command) = make_for_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]);
    27442749                          if (word_top > 0) word_top--;
     
    27462751    break;
    27472752
    27482753  case 81:
    2749 #line 810 "/usr/homes/chet/src/bash/src/parse.y"
     2754#line 815 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    27502755    {
    27512756                          (yyval.command) = make_for_command ((yyvsp[(2) - (9)].word), (WORD_LIST *)NULL, (yyvsp[(8) - (9)].command), word_lineno[word_top]);
    27522757                          if (word_top > 0) word_top--;
     
    27542759    break;
    27552760
    27562761  case 82:
    2757 #line 815 "/usr/homes/chet/src/bash/src/parse.y"
     2762#line 820 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    27582763    {
    27592764                          (yyval.command) = make_for_command ((yyvsp[(2) - (9)].word), (WORD_LIST *)NULL, (yyvsp[(8) - (9)].command), word_lineno[word_top]);
    27602765                          if (word_top > 0) word_top--;
     
    27622767    break;
    27632768
    27642769  case 83:
    2765 #line 822 "/usr/homes/chet/src/bash/src/parse.y"
     2770#line 827 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    27662771    {
    27672772                                  (yyval.command) = make_arith_for_command ((yyvsp[(2) - (7)].word_list), (yyvsp[(6) - (7)].command), arith_for_lineno);
    27682773                                  if (word_top > 0) word_top--;
     
    27702775    break;
    27712776
    27722777  case 84:
    2773 #line 827 "/usr/homes/chet/src/bash/src/parse.y"
     2778#line 832 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    27742779    {
    27752780                                  (yyval.command) = make_arith_for_command ((yyvsp[(2) - (7)].word_list), (yyvsp[(6) - (7)].command), arith_for_lineno);
    27762781                                  if (word_top > 0) word_top--;
     
    27782783    break;
    27792784
    27802785  case 85:
    2781 #line 832 "/usr/homes/chet/src/bash/src/parse.y"
     2786#line 837 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    27822787    {
    27832788                                  (yyval.command) = make_arith_for_command ((yyvsp[(2) - (5)].word_list), (yyvsp[(4) - (5)].command), arith_for_lineno);
    27842789                                  if (word_top > 0) word_top--;
     
    27862791    break;
    27872792
    27882793  case 86:
    2789 #line 837 "/usr/homes/chet/src/bash/src/parse.y"
     2794#line 842 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    27902795    {
    27912796                                  (yyval.command) = make_arith_for_command ((yyvsp[(2) - (5)].word_list), (yyvsp[(4) - (5)].command), arith_for_lineno);
    27922797                                  if (word_top > 0) word_top--;
     
    27942799    break;
    27952800
    27962801  case 87:
    2797 #line 844 "/usr/homes/chet/src/bash/src/parse.y"
     2802#line 849 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    27982803    {
    27992804                          (yyval.command) = make_select_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]);
    28002805                          if (word_top > 0) word_top--;
     
    28022807    break;
    28032808
    28042809  case 88:
    2805 #line 849 "/usr/homes/chet/src/bash/src/parse.y"
     2810#line 854 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    28062811    {
    28072812                          (yyval.command) = make_select_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]);
    28082813                          if (word_top > 0) word_top--;
     
    28102815    break;
    28112816
    28122817  case 89:
    2813 #line 854 "/usr/homes/chet/src/bash/src/parse.y"
     2818#line 859 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    28142819    {
    28152820                          (yyval.command) = make_select_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]);
    28162821                          if (word_top > 0) word_top--;
     
    28182823    break;
    28192824
    28202825  case 90:
    2821 #line 859 "/usr/homes/chet/src/bash/src/parse.y"
     2826#line 864 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    28222827    {
    28232828                          (yyval.command) = make_select_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]);
    28242829                          if (word_top > 0) word_top--;
     
    28262831    break;
    28272832
    28282833  case 91:
    2829 #line 864 "/usr/homes/chet/src/bash/src/parse.y"
     2834#line 869 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    28302835    {
    28312836                          (yyval.command) = make_select_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]);
    28322837                          if (word_top > 0) word_top--;
     
    28342839    break;
    28352840
    28362841  case 92:
    2837 #line 869 "/usr/homes/chet/src/bash/src/parse.y"
     2842#line 874 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    28382843    {
    28392844                          (yyval.command) = make_select_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]);
    28402845                          if (word_top > 0) word_top--;
     
    28422847    break;
    28432848
    28442849  case 93:
    2845 #line 876 "/usr/homes/chet/src/bash/src/parse.y"
     2850#line 881 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    28462851    {
    28472852                          (yyval.command) = make_case_command ((yyvsp[(2) - (6)].word), (PATTERN_LIST *)NULL, word_lineno[word_top]);
    28482853                          if (word_top > 0) word_top--;
     
    28502855    break;
    28512856
    28522857  case 94:
    2853 #line 881 "/usr/homes/chet/src/bash/src/parse.y"
     2858#line 886 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    28542859    {
    28552860                          (yyval.command) = make_case_command ((yyvsp[(2) - (7)].word), (yyvsp[(5) - (7)].pattern), word_lineno[word_top]);
    28562861                          if (word_top > 0) word_top--;
     
    28582863    break;
    28592864
    28602865  case 95:
    2861 #line 886 "/usr/homes/chet/src/bash/src/parse.y"
     2866#line 891 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    28622867    {
    28632868                          (yyval.command) = make_case_command ((yyvsp[(2) - (6)].word), (yyvsp[(5) - (6)].pattern), word_lineno[word_top]);
    28642869                          if (word_top > 0) word_top--;
     
    28662871    break;
    28672872
    28682873  case 96:
    2869 #line 893 "/usr/homes/chet/src/bash/src/parse.y"
     2874#line 898 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    28702875    { (yyval.command) = make_function_def ((yyvsp[(1) - (5)].word), (yyvsp[(5) - (5)].command), function_dstart, function_bstart); }
    28712876    break;
    28722877
    28732878  case 97:
    2874 #line 896 "/usr/homes/chet/src/bash/src/parse.y"
     2879#line 901 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    28752880    { (yyval.command) = make_function_def ((yyvsp[(2) - (6)].word), (yyvsp[(6) - (6)].command), function_dstart, function_bstart); }
    28762881    break;
    28772882
    28782883  case 98:
    2879 #line 899 "/usr/homes/chet/src/bash/src/parse.y"
     2884#line 904 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    28802885    { (yyval.command) = make_function_def ((yyvsp[(2) - (4)].word), (yyvsp[(4) - (4)].command), function_dstart, function_bstart); }
    28812886    break;
    28822887
    28832888  case 99:
    2884 #line 903 "/usr/homes/chet/src/bash/src/parse.y"
     2889#line 908 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    28852890    { (yyval.command) = (yyvsp[(1) - (1)].command); }
    28862891    break;
    28872892
    28882893  case 100:
    2889 #line 905 "/usr/homes/chet/src/bash/src/parse.y"
     2894#line 910 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    28902895    {
    28912896                          COMMAND *tc;
    28922897
     
    29182923    break;
    29192924
    29202925  case 101:
    2921 #line 936 "/usr/homes/chet/src/bash/src/parse.y"
     2926#line 941 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    29222927    {
    29232928                          (yyval.command) = make_subshell_command ((yyvsp[(2) - (3)].command));
    29242929                          (yyval.command)->flags |= CMD_WANT_SUBSHELL;
     
    29262931    break;
    29272932
    29282933  case 102:
    2929 #line 943 "/usr/homes/chet/src/bash/src/parse.y"
     2934#line 948 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    29302935    {
    29312936                          (yyval.command) = make_coproc_command ("COPROC", (yyvsp[(2) - (2)].command));
    29322937                          (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
     
    29342939    break;
    29352940
    29362941  case 103:
    2937 #line 948 "/usr/homes/chet/src/bash/src/parse.y"
     2942#line 953 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    29382943    {
    29392944                          COMMAND *tc;
    29402945
     
    29542959    break;
    29552960
    29562961  case 104:
    2957 #line 965 "/usr/homes/chet/src/bash/src/parse.y"
     2962#line 970 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    29582963    {
    29592964                          (yyval.command) = make_coproc_command ((yyvsp[(2) - (3)].word)->word, (yyvsp[(3) - (3)].command));
    29602965                          (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
     
    29622967    break;
    29632968
    29642969  case 105:
    2965 #line 970 "/usr/homes/chet/src/bash/src/parse.y"
     2970#line 975 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    29662971    {
    29672972                          COMMAND *tc;
    29682973
     
    29822987    break;
    29832988
    29842989  case 106:
    2985 #line 987 "/usr/homes/chet/src/bash/src/parse.y"
     2990#line 992 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    29862991    {
    29872992                          (yyval.command) = make_coproc_command ("COPROC", clean_simple_command ((yyvsp[(2) - (2)].command)));
    29882993                          (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
     
    29902995    break;
    29912996
    29922997  case 107:
    2993 #line 994 "/usr/homes/chet/src/bash/src/parse.y"
     2998#line 999 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    29942999    { (yyval.command) = make_if_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command), (COMMAND *)NULL); }
    29953000    break;
    29963001
    29973002  case 108:
    2998 #line 996 "/usr/homes/chet/src/bash/src/parse.y"
     3003#line 1001 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    29993004    { (yyval.command) = make_if_command ((yyvsp[(2) - (7)].command), (yyvsp[(4) - (7)].command), (yyvsp[(6) - (7)].command)); }
    30003005    break;
    30013006
    30023007  case 109:
    3003 #line 998 "/usr/homes/chet/src/bash/src/parse.y"
     3008#line 1003 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    30043009    { (yyval.command) = make_if_command ((yyvsp[(2) - (6)].command), (yyvsp[(4) - (6)].command), (yyvsp[(5) - (6)].command)); }
    30053010    break;
    30063011
    30073012  case 110:
    3008 #line 1003 "/usr/homes/chet/src/bash/src/parse.y"
     3013#line 1008 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    30093014    { (yyval.command) = make_group_command ((yyvsp[(2) - (3)].command)); }
    30103015    break;
    30113016
    30123017  case 111:
    3013 #line 1007 "/usr/homes/chet/src/bash/src/parse.y"
     3018#line 1012 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    30143019    { (yyval.command) = make_arith_command ((yyvsp[(1) - (1)].word_list)); }
    30153020    break;
    30163021
    30173022  case 112:
    3018 #line 1011 "/usr/homes/chet/src/bash/src/parse.y"
     3023#line 1016 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    30193024    { (yyval.command) = (yyvsp[(2) - (3)].command); }
    30203025    break;
    30213026
    30223027  case 113:
    3023 #line 1015 "/usr/homes/chet/src/bash/src/parse.y"
     3028#line 1020 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    30243029    { (yyval.command) = make_if_command ((yyvsp[(2) - (4)].command), (yyvsp[(4) - (4)].command), (COMMAND *)NULL); }
    30253030    break;
    30263031
    30273032  case 114:
    3028 #line 1017 "/usr/homes/chet/src/bash/src/parse.y"
     3033#line 1022 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    30293034    { (yyval.command) = make_if_command ((yyvsp[(2) - (6)].command), (yyvsp[(4) - (6)].command), (yyvsp[(6) - (6)].command)); }
    30303035    break;
    30313036
    30323037  case 115:
    3033 #line 1019 "/usr/homes/chet/src/bash/src/parse.y"
     3038#line 1024 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    30343039    { (yyval.command) = make_if_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command), (yyvsp[(5) - (5)].command)); }
    30353040    break;
    30363041
    30373042  case 117:
    3038 #line 1024 "/usr/homes/chet/src/bash/src/parse.y"
     3043#line 1029 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    30393044    { (yyvsp[(2) - (2)].pattern)->next = (yyvsp[(1) - (2)].pattern); (yyval.pattern) = (yyvsp[(2) - (2)].pattern); }
    30403045    break;
    30413046
    30423047  case 118:
    3043 #line 1028 "/usr/homes/chet/src/bash/src/parse.y"
     3048#line 1033 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    30443049    { (yyval.pattern) = make_pattern_list ((yyvsp[(2) - (4)].word_list), (yyvsp[(4) - (4)].command)); }
    30453050    break;
    30463051
    30473052  case 119:
    3048 #line 1030 "/usr/homes/chet/src/bash/src/parse.y"
     3053#line 1035 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    30493054    { (yyval.pattern) = make_pattern_list ((yyvsp[(2) - (4)].word_list), (COMMAND *)NULL); }
    30503055    break;
    30513056
    30523057  case 120:
    3053 #line 1032 "/usr/homes/chet/src/bash/src/parse.y"
     3058#line 1037 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    30543059    { (yyval.pattern) = make_pattern_list ((yyvsp[(3) - (5)].word_list), (yyvsp[(5) - (5)].command)); }
    30553060    break;
    30563061
    30573062  case 121:
    3058 #line 1034 "/usr/homes/chet/src/bash/src/parse.y"
     3063#line 1039 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    30593064    { (yyval.pattern) = make_pattern_list ((yyvsp[(3) - (5)].word_list), (COMMAND *)NULL); }
    30603065    break;
    30613066
    30623067  case 122:
    3063 #line 1038 "/usr/homes/chet/src/bash/src/parse.y"
     3068#line 1043 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    30643069    { (yyval.pattern) = (yyvsp[(1) - (2)].pattern); }
    30653070    break;
    30663071
    30673072  case 123:
    3068 #line 1040 "/usr/homes/chet/src/bash/src/parse.y"
     3073#line 1045 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    30693074    { (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); }
    30703075    break;
    30713076
    30723077  case 124:
    3073 #line 1042 "/usr/homes/chet/src/bash/src/parse.y"
     3078#line 1047 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    30743079    { (yyvsp[(1) - (2)].pattern)->flags |= CASEPAT_FALLTHROUGH; (yyval.pattern) = (yyvsp[(1) - (2)].pattern); }
    30753080    break;
    30763081
    30773082  case 125:
    3078 #line 1044 "/usr/homes/chet/src/bash/src/parse.y"
     3083#line 1049 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    30793084    { (yyvsp[(2) - (3)].pattern)->flags |= CASEPAT_FALLTHROUGH; (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); }
    30803085    break;
    30813086
    30823087  case 126:
    3083 #line 1046 "/usr/homes/chet/src/bash/src/parse.y"
     3088#line 1051 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    30843089    { (yyvsp[(1) - (2)].pattern)->flags |= CASEPAT_TESTNEXT; (yyval.pattern) = (yyvsp[(1) - (2)].pattern); }
    30853090    break;
    30863091
    30873092  case 127:
    3088 #line 1048 "/usr/homes/chet/src/bash/src/parse.y"
     3093#line 1053 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    30893094    { (yyvsp[(2) - (3)].pattern)->flags |= CASEPAT_TESTNEXT; (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); }
    30903095    break;
    30913096
    30923097  case 128:
    3093 #line 1052 "/usr/homes/chet/src/bash/src/parse.y"
     3098#line 1057 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    30943099    { (yyval.word_list) = make_word_list ((yyvsp[(1) - (1)].word), (WORD_LIST *)NULL); }
    30953100    break;
    30963101
    30973102  case 129:
    3098 #line 1054 "/usr/homes/chet/src/bash/src/parse.y"
     3103#line 1059 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    30993104    { (yyval.word_list) = make_word_list ((yyvsp[(3) - (3)].word), (yyvsp[(1) - (3)].word_list)); }
    31003105    break;
    31013106
    31023107  case 130:
    3103 #line 1063 "/usr/homes/chet/src/bash/src/parse.y"
     3108#line 1068 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    31043109    {
    31053110                          (yyval.command) = (yyvsp[(2) - (2)].command);
    31063111                          if (need_here_doc)
     
    31093114    break;
    31103115
    31113116  case 132:
    3112 #line 1072 "/usr/homes/chet/src/bash/src/parse.y"
     3117#line 1077 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    31133118    {
    31143119                          (yyval.command) = (yyvsp[(2) - (2)].command);
    31153120                        }
    31163121    break;
    31173122
    31183123  case 134:
    3119 #line 1079 "/usr/homes/chet/src/bash/src/parse.y"
     3124#line 1084 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    31203125    {
    31213126                          if ((yyvsp[(1) - (3)].command)->type == cm_connection)
    31223127                            (yyval.command) = connect_async_list ((yyvsp[(1) - (3)].command), (COMMAND *)NULL, '&');
     
    31263131    break;
    31273132
    31283133  case 136:
    3129 #line 1090 "/usr/homes/chet/src/bash/src/parse.y"
     3134#line 1095 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    31303135    { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), AND_AND); }
    31313136    break;
    31323137
    31333138  case 137:
    3134 #line 1092 "/usr/homes/chet/src/bash/src/parse.y"
     3139#line 1097 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    31353140    { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), OR_OR); }
    31363141    break;
    31373142
    31383143  case 138:
    3139 #line 1094 "/usr/homes/chet/src/bash/src/parse.y"
     3144#line 1099 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    31403145    {
    31413146                          if ((yyvsp[(1) - (4)].command)->type == cm_connection)
    31423147                            (yyval.command) = connect_async_list ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), '&');
     
    31463151    break;
    31473152
    31483153  case 139:
    3149 #line 1101 "/usr/homes/chet/src/bash/src/parse.y"
     3154#line 1106 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    31503155    { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), ';'); }
    31513156    break;
    31523157
    31533158  case 140:
    3154 #line 1103 "/usr/homes/chet/src/bash/src/parse.y"
     3159#line 1108 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    31553160    { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), ';'); }
    31563161    break;
    31573162
    31583163  case 141:
    3159 #line 1105 "/usr/homes/chet/src/bash/src/parse.y"
     3164#line 1110 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    31603165    { (yyval.command) = (yyvsp[(1) - (1)].command); }
    31613166    break;
    31623167
    31633168  case 144:
    3164 #line 1113 "/usr/homes/chet/src/bash/src/parse.y"
     3169#line 1118 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    31653170    { (yyval.number) = '\n'; }
    31663171    break;
    31673172
    31683173  case 145:
    3169 #line 1115 "/usr/homes/chet/src/bash/src/parse.y"
     3174#line 1120 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    31703175    { (yyval.number) = ';'; }
    31713176    break;
    31723177
    31733178  case 146:
    3174 #line 1117 "/usr/homes/chet/src/bash/src/parse.y"
     3179#line 1122 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    31753180    { (yyval.number) = yacc_EOF; }
    31763181    break;
    31773182
    31783183  case 149:
    3179 #line 1131 "/usr/homes/chet/src/bash/src/parse.y"
     3184#line 1136 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    31803185    {
    31813186                          (yyval.command) = (yyvsp[(1) - (1)].command);
    31823187                          if (need_here_doc)
     
    31923197    break;
    31933198
    31943199  case 150:
    3195 #line 1144 "/usr/homes/chet/src/bash/src/parse.y"
     3200#line 1149 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    31963201    {
    31973202                          if ((yyvsp[(1) - (2)].command)->type == cm_connection)
    31983203                            (yyval.command) = connect_async_list ((yyvsp[(1) - (2)].command), (COMMAND *)NULL, '&');
     
    32113216    break;
    32123217
    32133218  case 151:
    3214 #line 1160 "/usr/homes/chet/src/bash/src/parse.y"
     3219#line 1165 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    32153220    {
    32163221                          (yyval.command) = (yyvsp[(1) - (2)].command);
    32173222                          if (need_here_doc)
     
    32273232    break;
    32283233
    32293234  case 152:
    3230 #line 1175 "/usr/homes/chet/src/bash/src/parse.y"
     3235#line 1180 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    32313236    { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), AND_AND); }
    32323237    break;
    32333238
    32343239  case 153:
    3235 #line 1177 "/usr/homes/chet/src/bash/src/parse.y"
     3240#line 1182 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    32363241    { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), OR_OR); }
    32373242    break;
    32383243
    32393244  case 154:
    3240 #line 1179 "/usr/homes/chet/src/bash/src/parse.y"
     3245#line 1184 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    32413246    {
    32423247                          if ((yyvsp[(1) - (3)].command)->type == cm_connection)
    32433248                            (yyval.command) = connect_async_list ((yyvsp[(1) - (3)].command), (yyvsp[(3) - (3)].command), '&');
     
    32473252    break;
    32483253
    32493254  case 155:
    3250 #line 1186 "/usr/homes/chet/src/bash/src/parse.y"
     3255#line 1191 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    32513256    { (yyval.command) = command_connect ((yyvsp[(1) - (3)].command), (yyvsp[(3) - (3)].command), ';'); }
    32523257    break;
    32533258
    32543259  case 156:
    3255 #line 1189 "/usr/homes/chet/src/bash/src/parse.y"
     3260#line 1194 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    32563261    { (yyval.command) = (yyvsp[(1) - (1)].command); }
    32573262    break;
    32583263
    32593264  case 157:
    3260 #line 1193 "/usr/homes/chet/src/bash/src/parse.y"
     3265#line 1198 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    32613266    { (yyval.command) = (yyvsp[(1) - (1)].command); }
    32623267    break;
    32633268
    32643269  case 158:
    3265 #line 1195 "/usr/homes/chet/src/bash/src/parse.y"
     3270#line 1200 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    32663271    {
    32673272                          if ((yyvsp[(2) - (2)].command))
    32683273                            (yyvsp[(2) - (2)].command)->flags ^= CMD_INVERT_RETURN;     /* toggle */
     
    32713276    break;
    32723277
    32733278  case 159:
    3274 #line 1201 "/usr/homes/chet/src/bash/src/parse.y"
     3279#line 1206 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    32753280    {
    32763281                          if ((yyvsp[(2) - (2)].command))
    32773282                            (yyvsp[(2) - (2)].command)->flags |= (yyvsp[(1) - (2)].number);
     
    32803285    break;
    32813286
    32823287  case 160:
    3283 #line 1207 "/usr/homes/chet/src/bash/src/parse.y"
     3288#line 1212 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    32843289    {
    32853290                          ELEMENT x;
    32863291
     
    33003305    break;
    33013306
    33023307  case 161:
    3303 #line 1224 "/usr/homes/chet/src/bash/src/parse.y"
     3308#line 1229 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    33043309    {
    33053310                          ELEMENT x;
    33063311
     
    33213326    break;
    33223327
    33233328  case 162:
    3324 #line 1244 "/usr/homes/chet/src/bash/src/parse.y"
     3329#line 1249 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    33253330    { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), '|'); }
    33263331    break;
    33273332
    33283333  case 163:
    3329 #line 1246 "/usr/homes/chet/src/bash/src/parse.y"
     3334#line 1251 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    33303335    {
    33313336                          /* Make cmd1 |& cmd2 equivalent to cmd1 2>&1 | cmd2 */
    33323337                          COMMAND *tc;
     
    33523357    break;
    33533358
    33543359  case 164:
    3355 #line 1269 "/usr/homes/chet/src/bash/src/parse.y"
     3360#line 1274 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    33563361    { (yyval.command) = (yyvsp[(1) - (1)].command); }
    33573362    break;
    33583363
    33593364  case 165:
    3360 #line 1273 "/usr/homes/chet/src/bash/src/parse.y"
     3365#line 1278 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    33613366    { (yyval.number) = CMD_TIME_PIPELINE; }
    33623367    break;
    33633368
    33643369  case 166:
    3365 #line 1275 "/usr/homes/chet/src/bash/src/parse.y"
     3370#line 1280 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    33663371    { (yyval.number) = CMD_TIME_PIPELINE|CMD_TIME_POSIX; }
    33673372    break;
    33683373
    33693374  case 167:
    3370 #line 1277 "/usr/homes/chet/src/bash/src/parse.y"
     3375#line 1282 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    33713376    { (yyval.number) = CMD_TIME_PIPELINE|CMD_TIME_POSIX; }
    33723377    break;
    33733378
    33743379
    33753380/* Line 1267 of yacc.c.  */
    3376 #line 3377 "y.tab.c"
     3381#line 3382 "y.tab.c"
    33773382      default: break;
    33783383    }
    33793384  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
     
    35873592}
    35883593
    35893594
    3590 #line 1279 "/usr/homes/chet/src/bash/src/parse.y"
     3595#line 1284 "/usr/src/local/bash/bash-4.3-patched/parse.y"
    35913596
    35923597
    35933598/* Initial size to allocate for tokens, and the
     
    47364741         not already end in an EOF character.  */
    47374742      if (shell_input_line_terminator != EOF)
    47384743        {
    4739           if (shell_input_line_size < SIZE_MAX && shell_input_line_len > shell_input_line_size - 3)
     4744          if (shell_input_line_size < SIZE_MAX-3 && (shell_input_line_len+3 > shell_input_line_size))
    47404745            shell_input_line = (char *)xrealloc (shell_input_line,
    47414746                                        1 + (shell_input_line_size += 2));
    47424747
     
    48454850    eol_ungetc_lookahead = c;
    48464851}
    48474852
     4853char *
     4854parser_remaining_input ()
     4855{
     4856  if (shell_input_line == 0)
     4857    return 0;
     4858  if (shell_input_line_index < 0 || shell_input_line_index >= shell_input_line_len)
     4859    return '\0';        /* XXX */
     4860  return (shell_input_line + shell_input_line_index);
     4861}
     4862
    48484863#ifdef INCLUDE_UNUSED
    48494864/* Back the input pointer up by one, effectively `ungetting' a character. */
    48504865static void
     
    49484963   which allow ESAC to be the next one read. */
    49494964static int esacs_needed_count;
    49504965
     4966static void
     4967push_heredoc (r)
     4968     REDIRECT *r;
     4969{
     4970  if (need_here_doc >= HEREDOC_MAX)
     4971    {
     4972      last_command_exit_value = EX_BADUSAGE;
     4973      need_here_doc = 0;
     4974      report_syntax_error (_("maximum here-document count exceeded"));
     4975      reset_parser ();
     4976      exit_shell (last_command_exit_value);
     4977    }
     4978  redir_stack[need_here_doc++] = r;
     4979}
     4980
    49514981void
    49524982gather_here_documents ()
    49534983{
    49544984  int r;
    49554985
    49564986  r = 0;
    4957   while (need_here_doc)
     4987  while (need_here_doc > 0)
    49584988    {
    49594989      parser_state |= PST_HEREDOC;
    49604990      make_here_document (redir_stack[r++], line_number);
     
    52655295  FREE (word_desc_to_read);
    52665296  word_desc_to_read = (WORD_DESC *)NULL;
    52675297
     5298  eol_ungetc_lookahead = 0;
     5299
    52685300  current_token = '\n';         /* XXX */
    52695301  last_read_token = '\n';
    52705302  token_to_read = '\n';
     
    57105742         within a double-quoted ${...} construct "an even number of
    57115743         unescaped double-quotes or single-quotes, if any, shall occur." */
    57125744      /* This was changed in Austin Group Interp 221 */
    5713       if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'')
     5745      if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && dolbrace_state != DOLBRACE_QUOTE2 && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'')
    57145746        continue;
    57155747
    57165748      /* Could also check open == '`' if we want to parse grouping constructs
     
    63176349  reset_parser ();
    63186350  /* reset_parser clears shell_input_line and associated variables */
    63196351  restore_input_line_state (&ls);
    6320   if (interactive)
    6321     token_to_read = 0;
     6352
     6353  token_to_read = 0;
    63226354
    63236355  /* Need to find how many characters parse_and_execute consumed, update
    63246356     *indp, if flags != 0, copy the portion of the string parsed into RET
     
    83878419
    83888420  ps->expand_aliases = expand_aliases;
    83898421  ps->echo_input_at_read = echo_input_at_read;
     8422  ps->need_here_doc = need_here_doc;
    83908423
    83918424  ps->token = token;
    83928425  ps->token_buffer_size = token_buffer_size;
     
    84358468
    84368469  expand_aliases = ps->expand_aliases;
    84378470  echo_input_at_read = ps->echo_input_at_read;
     8471  need_here_doc = ps->need_here_doc;
    84388472
    84398473  FREE (token);
    84408474  token = ps->token;
Note: See TracBrowser for help on using the repository browser.