				 7/27/2004
				 ---------

[bash-3.0 released]

				   7/28
				   ----
array.c
	- in array_insert(), make sure the value to be added is non-NULL before
	  calling savestring() on it

builtins/reserved.def
	- fix description of `CDPATH'

lib/readline/display.c
	- when expanding a prompt that spans multiple lines with embedded
	  newlines, set prompt_physical_chars from the portion after the
	  final newline, not the preceding portion.  Bug reported by
	  "Ralf S. Engelschall" <rse@engelschall.com>

make_cmd.c
	- explicitly declare `lineno' in function prologue for make_case_command

builtins/evalfile.c
	- include `trap.h' for declaration for run_return_trap

bashline.c
	- fix a `return' without a value in enable_hostname_completion

general.c
	- include test.h for extern declaration for test_eaccess

externs.h
	- add declaration for zcatfd

tests/{history,histexp}.tests
	- unset HISTFILESIZE to avoid problems if a value of 0 is inherited
	  from the environment

				   7/30
				   ----
bashline.c
	- small changes to glob_expand_word to perform tilde expansion before
	  attempting globbing

builtins/Makefile.in
	- fix the install-help target to not cd into the `helpfiles'
	  subdirectory, so a value of $INSTALL_DATA containing a relative
	  pathname (e.g., .././support/install.sh) remains valid

				   7/31
				   ----
subst.c
	- new function, mbstrlen(s), returns length of a multibyte character
	  string

include/shmbutil.h
	- new macro, MB_STRLEN(s), calls mbstrlen or STRLEN as appropriate

builtins/trap.def
	- small change so that a first argument that's a valid signal number
	  (digits only -- no symbolic names) will be treated as a signal and
	  reverted back to the original handling disposition.  Fixes debian
	  complaints

subst.c
	- call MB_STRLEN instead of STRLEN where appropriate in
	  parameter_brace_expand_length to handle multibyte characters properly
	- call MB_STRLEN instead of strlen in verify_substring_values so that
	  negative substrings of strings with multibyte chars work properly

				    8/1
				    ---
jobs.c
	- describe_pid needs to write to stderr, not stdout (POSIX)
	- start_job, since it's only used by builtins (fg/bg), needs to write
	  its output to stdout, not stderr (POSIX)

sig.c
	- add an `orig_flags' member to struct terminating_signal so the
	  original signal handling flags (SA_RESTART, etc.) can be preserved
	  on POSIX systems
	- make sure to preserve the signal flags state in
	  initialize_terminating_signals and reset them for child processes
	  in reset_terminating_signals

builtins/fc.def
	- fixed an off-by-one error that caused `fc -l' to list one too many
	  history entries
	- in posix mode, `fc' should not list any indication as to whether or
	  not history lines have been modified (POSIX)
	- when in posix mode, the default editor for `fc' should be `ed' (POSIX)

doc/bashref.texi
	- updated the description of `trap' behavior when given a first
	  argument that is a valid signal number
	- noted that `fc -l' won't indicate whether a history entry has been
	  modified if the shell is in posix mode

builtins/command.def
	- fixed bug: `command -v' is supposed to be silent if a command is not
	  found

builtins/hash.def
	- `hash' should print its `hash table empty' message to stderr

lib/readline/misc.c
	- back out 7/7 change to _rl_maybe_save_line; it breaks emacs-mode ^P

general.c
	- changed base_pathname so that it will return reasonable results for
	  non-absolute pathnames -- this is what is intended by all of its
	  callers

arrayfunc.c
	- fix array_variable_part to return NULL if it finds an invisible
	  variable in the hash table.  Fixes seg fault caused by referring to
	  unset local variable using array notation

{locale,variables}.c
	- support LC_TIME as a special locale variable so HISTTIMEFORMAT tracks
	  the current locale

				    8/2
				    ---
variables.c
	- fixed small memory leak in makunbound() when a local array variable
	  is unset.  Fix from William Park

lib/readline/display.c
	- fixed a problem when computing the number of invisible characters on
	  the first line of a prompt whose length exceeds the screen width
	  (should only happen when invisible characters occur after the
	  line wrap).  Bug reported by agriffis@gentoo.org

builtins/command.def
	- `command -V' passes a new flag, CDESC_ABSPATH, which means to convert
	  to an absolute path

builtins/type.def
	- in posix mode, `type' and `command -v/-V' should not report
	  non-executable files, even if the execution code will attempt to
	  run them.  Other posix shells do this

doc/bashref.texi
	- add note to POSIX Mode section describing behavior of type and command
	  when finding a non-executable file

execute_cmd.c
	- force extended_glob to 1 before calling binary_test in
	  execute_cond_node so that the right extended pattern matching gets
	  performed

				    8/3
				    ---
braces.c
	- make sure lhs[0] and rhs[0] are cast to `unsigned char' so chars
	  with values > 128 are handled correctly

builtins/printf.def
	- change bexpand() and printstr() to handle strings with a leading
	  '\0' whose length is non-zero, since that's valid input for the
	  `%b' format specifier

subst.c
	- fix a couple of instances of find_variable that didn't check the
	  result for an invisible variable

variables.c
	- BASH_ARGC, BASH_ARGV, BASH_SOURCE, BASH_LINENO no longer created as
	  invisible vars

pcomplete.c
	- make sure COMP_WORDS is not invisible when bind_comp_words returns
	- ditto for COMPREPLY in gen_shell_function_matches

				    8/4
				    ---
braces.c
	- fix problem where ${ was ignored but did not increment the open
	  brace count.  Bug reported by Tim Waugh <twaugh@redhat.com>

variables.c
	- if make_local_variable finds a variable in the correct context in
	  the right variable scope, make sure it's not invisible before
	  returning it

				    8/5
				    ---
builtins/trap.def
	- fixed usage message to show `action' as not optional, though it
	  actually is when not in posix mode (for a single argument)

				    8/7
				    ---
configure.in
	- kfreebsd-gnu has had its sbrk() problems fixed, and no longer needs
	  to be configured --without-gnu-malloc

lib/readline/vi_mode.c
	- in rl_vi_search, free any saved history line before starting the
	  search, so failure leaves you at that line, not the last line in
	  the history (assuming the current line is not the last history line).
	  Fix from llattanzi@apple.com to replace fix of 7/7

				    8/9
				    ---
support/Makefile.in
	- renamed `mostly-clean' target to `mostlyclean'

				   8/11
				   ----
lib/readline/vi_mode.c
	- make same change for EOL in multibyte character case of
	  rl_vi_change_char

				   8/12
				   ----
subst.c
	- in verify_substring_values, fix off-by-one error checking bounds of
	  `offset', esp. in array values (e.g., getting the highest element
	  of an array)

				   8/16
				   ----
aclocal.m4
	- change BASH_CHECK_DEV_FD to make sure that file descriptors > 2 are
	  accessible via /dev/fd, unlike FreeBSD 5.x

lib/sh/strftime.c
	- make sure `zone' is initialized with gettimeofday before it is used
	- work around HPUX lack of `altzone' and differing definitions of
	  `timezone'

lib/malloc/malloc.c
	- internal_memalign and memalign now take a `size_t' as their first
	  argument, which seems to be the prevailing standard

lib/malloc/{malloc.c,shmalloc.h}
	- change sh_memalign to take a `size_t' as its first argument

builtins/echo.def
	- if posixly_correct and xpg_echo are both set, don't try to interpret
	  any arguments at all, as POSIX/XOPEN requires (fix inspired by Paul
	  Eggert)

doc/bashref.texi
	- amend description of bash posix mode to include new echo behavior

builtins/fg_bg.def
	- allow bg to take multiple job arguments, as posix seems to specify,
	  placing them all in the background, returning the status of the last
	  one as the status of `bg'

lib/readline/vi_mode
	- fix _rl_vi_change_mbchar_case (multibyte-char version of `~'
	  command) to have the right behavior at EOL -- handle case where vi
	  mode backs up at the end of the line

				   8/18
				   ----
array.c
	- check for an empty array in array_rshift before shifting elements
	  and adjusting max_index
	- check for null array in array_subrange

jobs.c
	- fix raw_job_exit_status to not ignore exit status of the last
	  process in the pipeline when `set -o pipefail' is enabled

				   8/19
				   ----
lib/readline/mbutil.c
	- make sure _rl_find_next_mbchar_internal has a valid multibyte
	  character before it checks whether or not it's a zero-width
	  wide character and adjusts point accordingly

                                  8/24
                                   ----
bashline.c
        - new function, bash_directory_expansion, duplicates the expansions
          performed on the directory name by rl_filename_completion_function
        - call bash_directory_expansion in command_word_completion_function
          if we decide we're doing tilde expansion (and any other
          canonicalization) on the directory name being completed

                                   8/25
                                   ----
configure.in
        - use new-style AC_CHECK_HEADER to check for sys/ptem.h (which requires
          sys/stream.h).  The correct checks are in the code, but autoconf
          complains if sys/stream.h is not included, rather than simply
          checking for the header's presence

				   8/26
				   ----
builtins/hash.def
	- fix a bug that prevented `hash -d' from working right (as soon as
	  hash removed a command from the table, the bug caused it to be added
	  right back)

				   8/27
				   ----
doc/{bash.1,bashref.texi}
	- explicitly note that conditional primaries that operate on files
	  operate on the targets of symbolic links rather than the links
	  themselves

				   8/30
				   ----
lib/readline/display.c
	- fix multibyte calculation of `physchars' in prompt expansion, to
	  handle double-width multibyte characters correctly
	- changes to rl_redisplay to handle prompts longer than the screenwidth
	  that might contain double-width multibyte characters.  Fixes from
	  Tomohiro Kubota

				    9/6
				    ---
subst.c
	- change word_list_split to avoid really bad behavior caused by calling
	  list_append for each split word -- as the list gets long, you have
	  to traverse it every time.  Keep a pointer to the end of the list and
	  and just tack onto it

				    9/8
				    ---
lib/readline/complete.c
	- change fnprint to calculate the displayed width of a filename in
	  the same way as fnwidth

subst.c
	- in verify_substring_values, when expanding ${array[@]:offset}, make
	  sure negative offsets count from one greater than the array's
	  maximum index so things like ${x[@}: -1} work to give the last element
	  (requires fixing array tests)

builtins/common.c
	- new error function, sh_wrerror(),  for builtins to call when a write
	  error occurs

builtins/common.h
	- extern declaration for sh_wrerror()

builtins/cd.def
	- change builtin_error call to use sh_wrerror()

builtins/echo.def
	- report write errors with sh_wrerror() instead of just returning
	  failure

builtins/printf.def
	- change printstr to return failure (-1) or success (0) indication
	  rather than void
	- report write errors when printstr() fails, return failure
	- if any of the PF/printf calls fail, report write error and return
	  failure

execute_cmd.c
	- change execute_in_subshell so the subshell command inherits the
	  command timing flags from the enclosing COMMAND *

				   9/11
				   ----
[prayers for the victims of 9/11/2001]

lib/sh/strnlen.c
	- new file, implementation of GNU libc extension function strnlen

lib/sh/Makefile.in, {config.h,configure,Makefile}.in, MANIFEST
	- changes for strnlen

configure.in
	- version changed to 3.1-devel

doc/bash.1, lib/readline/doc/rluser.texi
	- added description of `-o plusdirs' to complete/compgen (thanks,
	  Arnold)

parse.y
	- new parser_state flag, PST_ASSIGNOK, if set indicates we're parsing
	  arguments to a builtin that accepts assignment statement arguments
	- turn on PST_ASSIGNOK in read_token_word when appropriate
	- turn off PST_ASSIGNOK in read_token when appropriate
	- don't attempt to parse a compound assignment specially unless we're
	  in a position where an assignment statement is acceptable, or
	  PST_ASSIGNOK is set

				   9/13
				   ----
variables.c
	- make BASH_ARGC, BASH_ARGV, BASH_LINENO, and BASH_SOURCE
	  non-unsettable, since the shell uses those values internally

expr.c
	- make exponentiation right-associative, as is apparently correct

				   9/16
				   ----
arrayfunc.c
	- make sure convert_var_to_array marks the environment as needing
	  recreation if the converted variable was exported

				   9/17
				   ----
braces.c
	- mark ${ as introducing an additional level of braces only if it's
	  not in a quoted string -- quoted strings are handled before brace
	  matching is done

parse.y
	- fixed an obscure problem in history_delimiting_chars where the `in'
	  in a case statement could have a semicolon added after it, if the
	  `case word' was on a previous line

support/config.guess
	- support for newest versions of tandem non-stop kernel

lib/readline/display.c
	- in compute_lcd_of_matches, explicitly cast `text' to `char *' before
	  passing it to rl_filename_dequoting_function

lib/readline/terminal.c
	- bind the key sequence sent by the keypad `delete' key to delete-char
	  (same as ^D in emacs mode)

builtins/ulimit.def
	- in print_all_limits, don't print anything if get_limit returns
	  -1/EINVAL, indicating that the kernel doesn't support that particular
	  limit
	- add -i (max number of pending signals), -q (max size of posix msg
	  queues), -x (max number of file locks) for systems (Linux) that
	  support them

doc/{bash.1,bashref.texi}
	- fix description of correspondence between FUNCNAME, BASH_LINENO,
	  and BASH_SOURCE indices in description of BASH_LINENO

				   9/18
				   ----
lib/sh/shquote.c
	- don't quote CTLESC and CTLNUL with CTLESC in sh_backslash_quote, as
	  long as the resultant string never gets sent to the word expansion
	  functions without going through the shell parser

externs.h
	- add extern declarations for strnlen and strpbkrk from lib/sh

subst.[ch]
	- changes to handle case where IFS consists of multibyte characters.
	  Changed: string_extract_verbatim, split_at_delims,
	  string_list_dollar_star, string_list_dollar_at, list_string,
	  get_word_from_string, setifs

				   9/19
				   ----
mailcheck.c
	- change file_mod_date_changed to reset the cached mail file data if
	  the file size drops to zero

lib/readline/complete.c
	- change append_to_match so that a non-zero value for
	  rl_completion_suppress_append will cause no `/' to be appended to a
	  directory name

bashline.c
	- experimental change to suppress appending a slash for a completed
	  filename that is found in PATH as well as a directory in the current
	  directory under certain circumstances:  a single instance found in
	  $PATH when `.' is not in $PATH, and multiple instances found in the
	  $PATH, even when `.' is in the $PATH

				   9/24
				   ----
command.h
	- new word flag: W_ASSIGNRHS, means word is rhs of assignment statement
	- new word flag: W_NOTILDE, means word is not to be tilde expanded
	- new word flag (internal): W_ITILDE, means the next character is a
	  tilde that should be expanded

general.c
	- new set of tilde suffixes for use when parsing the RHS of an
	  assignment statement and =~ should not be subject to tilde expansion
	- if ASSIGN_P argument to bash_tilde_expand is 2, use tilde prefixes
	  for parsing RHS of assignment statement

general.[ch]
	- new function bash_tilde_find_word, drop-in replacement for
	  tilde_find_word

subst.c
	- call bash_tilde_expand with secord argument of 2 when expanding rhs
	  of an assignment statement, so tildes after second and subsequent
	  `=' in an assignment are not expanded
	- new function, expand_string_assignment, to expand the rhs of an
	  assignment statement
	- add `~' to EXP_CHAR, the characters that will cause the word
	  expansion functions to be called
	- move tilde expansion into expand_word_internal instead of many
	  different calls to bash_tilde_expand scattered across different
	  functions.  NOTE:  This means that double quotes surrounding a
	  {paramOPword} expansion will cause tilde expansion to NOT be
	  performed on `word'.  I think this is right, what POSIX specifies,
	  and consistent with the behavior of other characters in the rhs

execute_cmd.c
	- take out calls to bash_tilde_expand before calling word expansion
	  functions

				   9/26
				   ----
execute_cmd.c
	- make sure to call UNBLOCK_CHILD before returning on a pipe creation
	  failure in execute_pipeline

				   9/27
				   ----
variables.c
	- change get_bash_command to deal with the_printed_command_except_trap
	  being NULL

execute_cmd.c
	- fix execute_simple_command to deal with the_printed_command being
	  NULL when assigning to the_printed_command_except_trap -- fixes
	  seg fault in savestring()

parse.y
	- change the parser so that the closing `)' in a compound variable
	  assignment delimits a token -- ksh93 does it this way

doc/{bash.1,bashref.texi}
	- change description of tilde expansion to note that expansion is
	  attempted only after the first =~ in an assignment statement

builtins/declare.def
	- when assigning to an array variable with declare -a x=(...), make
	  sure the last character in the rhs  of the variable assignment is
	  `)', not just that it appears somewhere

				   9/28
				   ----
command.h
	- add a `W_NOEXPAND' flag to inhibit all expansion except quote removal
	- add a `W_COMPASSIGN' flag to denote a word is a compound assignment
	  statement

parse.y
	- set W_COMPASSIGN on words that appear to be compound assignments

subst.c
	- pass W_NOXPAND and W_COMPASSIGN through end of expand_word_internal

subst.[ch]
	- new function, expand_assignment_string_to_string, calls
	  expand_string_assignment and then string_list on the result

variables.c
	- assign_in_env now calls expand_assignment_string_to_string

				   9/30
				   ----
builtins/common.c
	- change get_job_spec so the null job `%' once again means the current
	  job

				   10/1
				   ----
subst.c
	- do_assignment_internal now takes a WORD_DESC * as its first
	  argument, and uses its `word' member as the assignment string
	- change expand_word_list_internal to call do_word_assignment instead
	  of do_assignment, passing it `word' instead of, e.g., `word->word'
	- change extract_array_assignment_list to just return the passed
	  string minus a trailing `)' if the last character is a right
	  paren
	- change do_assignment_internal to call extract_array_assignment_list

subst.[ch]
	- change do_assignment and do_assignment_no_expand to take a `char *'
	  instead of `const char *' first argument; change extern prototypes
	- new function, do_word_assignment, takes a WORD_DESC * and calls
	  do_assignment_internal on it; add extern declaration with prototype

general.h
	- new typedef, sh_wassign_func_t, like sh_assign_func_t but takes a
	  WORD_DESC * as its first argument

variables.[ch]
	- assign_in_env now takes a WORD_DESC * as its first argument

				   10/2
				   ----
command.h
	- new word flag, W_ASSNBLTIN, denotes that the word is a builtin
	  command (in a command position) that takes assignment statements
	  as arguments, like `declare'
	- new word flags, W_ASSIGNARG, denotes that word is an assignment
	  statement given as argument to assignment builtin

execute_cmd.c
	- set W_ASSNBLTIN flag in fix_assignment_words if necessary (if there
	  are any arguments that are assignment statements)
	- set W_ASSIGNARG flag in fix_assignment_words if necessary

subst.c
	- new function, do_compound_assignment, encapsulates the necessary
	  code to perform a compound array assignment (including creation of
	  local variables); called from do_assignment_internal
	- to fix the double-expansion problem with compound array assignments
	  that are arguments to builtins like `declare', changed
	  shell_expand_word_list to treat those arguments like assignment
	  statements (with proper creation of local variables inside shell
	  functions) and pass the attribute-setting portion of the statement
	  onto the builtin.  This is what ksh93 appears to do, from inspection
	  of the `ksh93 -x' output

execute_cmd.c
	- fix execute_simple_command:  in case of pipeline or async command,
	  when forking early, set `subshell_environment' so that it can contain
	  both SUBSHELL_PIPE and SUBSHELL_ASYNC -- the two should not be
	  mutually exclusive.  Fixes bug reported by pierre.humblet@ieee.org
	- remove references to last_pid, old_command_subst_pid; use NO_PID as
	  a sentinel value to decide whether or not a child process has been
	  created and needs to be waited for.  Submitted by
	  pierre.humblet@ieee.org to fix recycling-pid problem on cygwin

doc/{bash.1,bashref.texi}
	- fixed documentation of `@(pattern)' extended globbing operator --
	  it succeeds if the string matches one of the patterns, not exactly
	  one.  This is what ksh93 does, too

lib/readline/complete.c
	- fixed rl_menu_complete so that a negative argument cycles backwards
	  through the list

				   10/3
				   ----
subst.c
	- use W_COMPASSIGN flag in do_assignment_internal instead of deciding
	  lexically which assignments are compound array assignments

				   10/6
				   ----
support/shobj-conf
	- additions for System V.5 from Boyd Gerber <gerberb@zenez.com>

subst.c
	- in command_substitute, if subshell_environment includes
	  SUBSHELL_ASYNC, call make_child with the `async_p' argument set to
	  non-zero.  This keeps command substitutions for async commands or
	  pipelines from trying to give the terminal back to the shell's
	  pgrp.  make sure to save and restore last_asynchronous_pid.  Fix
	  suggested by <pierre.humblet@ieee.org>

				   10/7
				   ----
config.h.in
	- add a placeholder definition for WCONTINUED_BROKEN

				   10/9
				   ----
aclocal.m4
	- add BASH_CHECK_WCONTINUED, checks for glibc bug where WCONTINUED is
	  defined but rejected as invalid by waitpid(2)

configure.in
	- add call to BASH_CHECK_WCONTINUED, defines WCONTINUED_BROKEN

redir.c
	- experimental change to add_undo_redirect to save manipulations to
	  file descriptors >= SHELL_FD_BASE (10) on the list of redirections
	  to be undone even if `exec' causes the list to be discarded

doc/{bash.1,bashref.texi}
	- note that redirections using file descriptors > 9 should be used
	  carefully, because they might conflict with file descriptors the
	  shell uses internally

				   10/11
				   -----
parse.y
	- fix pipeline_command production to handle case where `pipeline'
	  as `argument' of `!' or `time' is null (e.g., a syntax error not
	  handled by the grammar)

				   10/13
				   -----
lib/readline/readline.c
	- new internal variable, _rl_bind_stty_chars; if non-zero, bind the
	  terminal special characters to readline equivalents at startup
	- change readline_default_bindings() and reset_default_bindings() to
	  understand _rl_bind_stty_chars

lib/readline/rlprivate.h
	- new extern declaration for _rl_bind_stty_chars

lib/readline/rltty.c
	- change rl_prep_terminal to add support for _rl_bind_stty_chars

				   10/15
				   -----
lib/readline/bind.c
	- new bindable variable, `bind-tty-special-chars', bound to value of
	  _rl_bind_stty_chars

doc/bash.1,lib/readline/doc/{readline.3,rluser.texi}
	- documented new readline variable `bind-tty-special-chars'

builtins/pushd.def
	- make the first check for option `--' skip the rest of option
	  checking

				   10/16
				   -----
lib/readline/shell.c
	- change sh_set_lines_and_columns to prefer setenv, which has
	  predictable memory allocation behavior, to putenv, which does not

				   10/19
				   -----
variables.c
	- change push_exported_var so that a tempenv variable has to have the
	  export attribute set (which they all do -- something to look at) and
	  the `propagate' attribute set to be propagated down to the next
	  scope

execute_cmd.c
	- change execute_builtin so that if CMD_COMMAND_BUILTIN is set in the
	  passed flags argument, call pop_scope with a value that says the
	  builtin is not special, since `command' means that preceding variable
	  assignments don't persist in the environment.  Fixes problem with
	  variable assignments preceding command preceding special builtin
	  keeping those variable assignments around (when in posix mode)

				   10/20
				   -----
lib/sh/shquote.c
	- new function, sh_mkdoublequoted, brackets a given string with
	  double quotes and returns a new string.  Flags argument, if non-
	  zero, means to quote embedded double quotes with backslashes

externs.h
	- new extern declaration for sh_mkdoublequoted

parse.y
	- use sh_mkdoublequoted after calling localeexpand()

lib/sh/strtrans.c
	- change ansicstr to understand that  (flags & 4) != 0 means to remove
	  backslash from unrecognized escape sequences

general.c
	- fix logic problem in assignment() that caused non-variable-starter
	  characters to be allowed, resulting in things like `1=xxx' creating
	  a variable `1' in the hash table

				   10/21
				   -----
bashline.c
	- don't call programmable_completions with an assignment statement
	  argument

				   10/22
				   -----
lib/readline/rltty.c
	- in prepare_terminal_settings, turn echoing on (readline_echoing_p)
	  if get_tty_settings fails because the input is not a terminal

				   10/24
				   -----
lib/readline/util.c
	- include rlmbutil.h for multibyte definitions
	- new function, _rl_walphabetic, wide char version of rl_alphabetic

lib/readline/mbutil.c
	- new function, _rl_char_value(buf, ind), returns value of (possibly
	  multibyte) character at buf[ind]

lib/readline/rlmbutil.h
	- extern defines for _rl_walphabetic and _rl_char_value for when
	  multibyte chars are not being used
	- new wrapper definitions for _rl_find_next_mbchar (MB_NEXTCHAR) and
	  _rl_find_prev_mbchar (MB_PREVCHAR) that try to avoid unneeded
	  function calls

lib/readline/text.c
	- fix rl_foward_word to work with multibyte characters (or in a
	  multibyte locale) using above utility functions
	- fix rl_backward_word to work with multibyte characters (or in a
	  multibyte locale) using above utility functions

				   10/26
				   -----
parse.y
	- fix parse_matched_pair so that it doesn't swallow \<newline> when
	  parsing a $'...' construct (call shell_getc with different arg)

				   10/28
				   -----
lib/glob/glob.c
	- after some (compiled-in) threshold, glob_vector will stop using
	  alloca to allocate `struct globval's and will switch to using
	  malloc, with appropriate cleanup before returning

subst.c
	- don't expand tildes after `=' in expand_word_internal, even if the
	  W_TILDEEXP flag is set, unless it's the first tilde in a word
	  marked W_ASSIGNMENT

				   10/31
				   -----
lib/readline/text.c
	- make sure rl_point doesn't go below 0 in rl_delete_horizontal_space
	  (from SUSE, but not sent in)

shell.c
	- make sure shell_is_restricted skips over a single leading `-' in
	  the shell name (from SUSE, but not sent in)

lib/readline/display.c
	- disable `fast redisplay' at the end of the line if in a locale that
	  supports multibyte characters (from SUSE, but not sent in)

lib/readline/histexpand.c
	- fix a problem with finding the delimiter of a `?' substring when
	  compiled for multibyte characters (from SUSE, but not sent in)

				   11/1
				   ----
lib/readline/display.c
	- correct some assignments to _rl_last_c_pos:  when in a multibyte
	  locale, it's used as an absolute cursor position; when not using
	  multibyte characters, it's a buffer offset.  I should have caught
	  this when the multibyte character support was donated

				   11/5
				   ----
general.c
	- change `assignment()' to accept `+=' assignment operator

arrayfunc.[ch]
	- bind_array_variable and assign_array_element both take a new `flags'
	  argument
	- assign_array_var_from_string, assign_array_from_string, and
	  assign_array_var_from_word_list now all take a new `flags' argument
	- change assign_array_var_from_word_list to understand how to append
	  to an array variable
	- change assign_array_var_from_string to understand how to append
	  to an array variable.  It does not unset the previous value if
	  appending, allowing both old values to be changed and new ones to
	  be added

subst.h
	- new flag #defines to use for evaluating assignment statements

{subst,variables}.c, builtins/{declare,read}.def
	- change callers of assign_array_element and bind_array_variable
	- change do_compound_assignment to understand assignment flags
	- change do_assignment_internal to set assignment flags and pass them
	  to underlying functions

pcomplete.c,builtins/{declare,read}.def
	- fix callers of assign_array_var_from_string, assign_array_var_from_word_list

variables.[ch]
	- make_variable_value now takes a new `flags' argument
	- make_variable_value now understands how to append to a particular
	  variable, using the old value
	- bind_variable_value now takes a new `flags' argument
	- change make_variable_value to understand ASS_APPEND flag
	- bind_variable now takes a new `flags' argument
	- bind_variable_internal now takes a new `flags' argument

arrayfunc.c
	- change callers of make_variable_value to add flags arg

builtins/declare.def
	- change callers of bind_variable_value to add flags arg

{execute_cmd,mailcheck,pcomplete,shell,subst,variables}.c,parse.y
builtins/{cd,command,declare,getopts,read,set,setattr}.def
	- change callers of bind_variable to add flags arg

variables.c
	- change callers of bind_variable_internal
	- change bind_variable_internal to pass assignment flags on to
	  make_variable_value
	- change assign_in_env to treat `var+=value' like `var=value'

arrayfunc.c
	- break code that actually constructs the new value and assigns it
	  to a particular array index out into a new functions:
	  bind_array_var_internal.  This fakes out make_variable_value by
	  passing a dummy SHELL_VAR * so it can do proper appending and other
	  += processing
	- changes to assign_array_var_from_string to accept and process as if
	  they were `standalone' assignment statements array assignment words
	  of the form [ind]+=val

				   11/7
				   ----
builtins/declare.def
	- added support for `declare [flags] var+=value'.  `Flags' are applied
	  before the assignment is performed, which has implications for things
	  like `-i' -- if -i is supplied, arithmetic evaluation and increment
	  will be performed

builtins/setattr.def
	- add support for `+=' assignment for rest of `assignment builtins':
	  export, readonly

				   11/12
				   -----
lib/readline/display.c
	- make sure prompt_physical_chars and prompt_invis_chars_first_line
	  are reset to 0 if the prompt string passed to rl_expand_prompt is
	  NULL or empty

				   11/14
				   -----
{configure,config.h}.in
	- check for `raise', define HAVE_RAISE if available

lib/intl/dcigettext.c
	- make sure `raise' is defined if HAVE_RAISE is not before
	  eval-plurah.h is included

lib/malloc/trace.c
	- put extern declaration for imalloc_fopen inside the MALLOC_TRACE
	  #ifdef

				   11/16
				   -----
lib/intl/Makefile.in
	- make sure SHELL is defined to cpp

lib/intl/dcigettext.c
	- make sure we use getcwd() even if HAVE_GETCWD is not defined after
	  including config.h; if SHELL is defined, #define HAVE_GETCWD

				   11/18
				   -----
trap.[ch]
	- new function, int signal_in_progress(int sig), returns TRUE if the
	  trap handler for signal SIG is currently executing

				   11/19
				   -----
redir.c
	- slightly change do_redirection_internal to set the close-on-exec
	  flag for file descriptors > 2 used to save file descriptors < 2
	  using explicit redirections (e.g., `exec 3>&1').  This keeps file
	  descriptors pointing to pipes from being left open but doesn't
	  change the shell's file descriptor semantics

				   11/20
				   -----
doc/{bash.1,bashref.texi}
	- correct some minor typos, forwarded from doko@debian.org

				   11/22
				   -----
doc/bash.1,lib/readline/doc/{readline.3,rluser.texi}
	- documented detail that yank-last-arg and yank-nth-arg use the history
	  arg expansion code (and, as a result, are subject to restrictions
	  of the history-comment character)

				   11/23
				   -----
execute_cmd.c
	- changes so that BASH_COMMAND preserves its value into a DEBUG trap:
	  for commands, arithmetic for command expressions, select commands,
	  case commands, (( commands, [[ commands, simple commands

				   11/24
				   -----
doc/{bash.1,bashref.texi}
	- changed description of `set' builtin slightly so that it is clear
	  that only variables are displayed in posix mode and that read-only
	  variables can't be reset by simply sourcing the output of `set'

lib/sh/strftime.c
	- don't try to redefine `inline' if it's already defined

				   11/26
				   -----
execute_cmd.c
	- fix execute_function to check funcname_a after function execution,
	  since FUNCNAME can be changed or unset within a function

				   11/27
				   -----
builtins/evalfile.c
	- make same changes as 11/26, this time to _evalfile

execute_cmd.c
	- change execute_function to run the return trap after a function
	  completes execution even if the shell is compiled without DEBUGGER
	  defined

trap.c
	- change reset_or_restore_signal_handlers so that the RETURN trap is
	  not inherited by command substitution when DEBUGGER is not defined

				   11/30
				   -----
lib/readline/misc.c
	- fix memory leaks in _rl_free_history_entry and rl_maybe_replace_line
	  caused by not freeing `timestamp' member of history entry
	- make sure timestamp is initialized to NULL in rl_maybe_save_line

				   12/1
				   ----
execute_cmd.c
	- fix execute_function so a function calling `return' will run the
	  RETURN trap, if one's defined

doc/{bash.1,bashref.texi}
	- fix description of RETURN trap in various places to indicate that it's
	  only inherited by shell functions if function tracing is on globally
	  or has been enabled for that function
	- fix documentation to indicate that the DEBUG and RETURN traps are
	  inherited under the same conditions

execute_cmd.c
	- a function does not inherit the RETURN trap if a DEBUG trap is
	  currently running

				   12/2
				   ----
lib/glob/xmbsrtowcs.c
	- change xmbsrtowcs to handle the one case where malloc can fail
	  (though it should not matter) -- don't try to free a null pointer

				   12/9
				   ----
subst.c
	- fix get_var_and_type to handle var[@], where `var' is a scalar
	  variable, identically to var -- all calling expansions can now
	  handle var[@] like var.  Bug reported by agriffis@gentoo.org

				   12/10
				   -----
lib/readline/bind.c
	- make new-style "\M-x" keybindings obey `convert-meta' settings
	  (bug reported by twaugh@redhat.com)

				   12/14
				   -----
builtins/set.def
	- added description of `-' option to help text

builtins/shopt.def
	- fix bug that caused `gnu_errfmt' to not be compiled in unless
	  READLINE is defined

				   12/16
				   -----
subst.c
	- fixed a typo in string_extract_verbatim in first call to MBLEN
	  (used `slen - 1' instead of `slen - i')

				   12/17
				   -----
subst.c
	- avoid some calls to strlen if the value is only being used for
	  ADVANCE_CHAR and MB_CUR_MAX == 1 (since ADVANCE_CHAR doesn't need
	  it unless multibyte characters are possible)
	- change string_extract_verbatim so it takes the length of the string
	  as a parameter, so we don't have to recompute the length of the same
	  string over and over again when doing word splitting (that kills if
	  it's a long string)

				   12/18
				   -----
subst.c
	- in string_list_dollar_star, make sure to null-terminate the
	  separator if the character is longer than one byte

				   12/22
				   -----
doc/{bash.1,bashref.texi}
	- changed text in quoting section explaining that double quotes do
	  not prevent history expansion from taking place, and that backslashes
	  escaping ! are not removed

				   12/28
				   -----
shell.c
	- set gnu_error_format to 1 if running under emacs.  This should allow
	  the emacs `next-error' stuff to work, at least for interactive shells

parse.y
	- change yy_stream_get to set interrupt_immediately before calling
	  getc_with_restart when the shell is interactive.  This avoids the
	  synchronization problem caused by the call to QUIT in read_a_line,
	  which results in the first character after a SIGINT/^C to be
	  dropped

				   12/30
				   -----
builtins/mkbuiltins.c
	- changes to write long documentation to arrays as a single string by
	  default, rather than an array of strings -- enabled by default
	- new option, -S, to restore old behavior of writing multiple strings
	  for long documentation
	- changes to avoid filenames written when the separate-filenames option
	  (-H) has been supplied being run through gettext

configure.in
	- new cofiguration option, --enable-single-help-strings (on by default),
	  causes help text to be stored as a single string (or smaller set than
	  one string per line)

builtins/Makefile.in
	- pass `-S' to mkbuiltins if single-help-strings is turned off

doc/bashref.texi
	- documented new `single-help-strings' configure option

				 1/3/2005
				 --------
jobs.c
	- make wait_for return a non-zero status if the job or processed
	  waited for is suspended.  Returns 128 + stop signal.  This fixes
	  the problem with `echo one && sleep 5 && echo two' displaying
	  `two' after the sleep is suspended

				    1/5
				    ---
print_cmd.c
	- change indirection_level_string so the code duplicates the first
	  character of $PS4 to indicate the indirection level, rather than
	  the first byte

				    1/8
				    ---
variables.c
	- new special variable hook function for COMP_WORDBREAKS; sets
	  rl_completer_word_break_characters back to NULL when the variable
	  is unset
	- change bind_variable_value to understand dynamic variables with
	  assign_function set, and handle them correctly.  If the variable is
	  being appended to, use make_variable_value to create the new
	  value
	- change bind_variable_internal to understand dynamic variables with
	  assign_function set, and handle them the same way
	- RANDOM and LINENO now get the integer attribute, so appending works
	  as expected
	- ditto for HISTCMD, MAILCHECK, OPTIND

lib/readline/display.c
	- change _rl_make_prompt_for_search to set prompt_physical_chars
	  appropriately
	- rl_save_prompt and rl_restore_prompt save and restore
	  prompt_prefix_length
	- change redraw_prompt to use rl_save_prompt and rl_restore_prompt
	- change rl_restore_prompt to set the `save' variables back to
	  NULL/0 so code can check whether or not the prompt has been saved
	- change rl_message and rl_clear_message to save and restore the
	  prompt if the caller has not already done it (using a simple
	  semaphore-like variable)
	- change rl_message to call expand_prompt, so that local_prompt and
	  local_prompt prefix are set before calling the redisplay functions,
	  in case the prompt is longer than a screenwidth (fixes bug
	  reported to debian by epl@unimelb.edu.au)

lib/readline/doc/rltech.texi
	- make sure to note that rl_save_prompt should be called before
	  rl_message, and rl_restore_prompt before rl_clear_message

pcomplete.c
	- make sure to save and restore the parser state around the call to
	  execute_shell_function in gen_shell_function_matches.  Fixes bug
	  reported by a050106.1.keeLae3x@captaincrumb.com (cute)

lib/readline/readline.c
	- fix _rl_dispatch_subseq in the case where we're recursing back up
	  the chain (r == -2) and we encounter a key shadowed by a keymap,
	  but originally bound to self-insert.  Calling rl_dispatch with
	  ANYOTHERKEY as the first argument will call rl_insert, but with
	  ANYOTHERKEY (256) as the char to insert.  Use the shadow keymap
	  and set things up to dispatch to rl_insert with the shadowed key
	  as the argument.  Fixes the bug reported by Thomas Glanzmann
	  (sithglan@stud.uni-erlangen.de)

				   1/13
				   ----
command.h
	- new word flag: W_HASQUOTEDNULL

make_cmd.c
	- new function to allocate a WORD_DESC * without doing anything with a
	  containing string:  alloc_word_desc

make_cmd.h
	- extern declaration for alloc_word_desc

dispose_cmd.c
	- new function to just free a WORD_DESC * without freeing the contained
	  string:  dispose_word_desc

dispose_cmd.h
	- extern declaration for dispose_word_desc

subst.c
	- change some places to use alloc_word_desc
	- make same changes to word_list_quote_removal as were made to
	  word_list_split
	- set W_HASQUOTEDNULL when a word is created with w->word[0] ==
	  CTLNUL and w->word[1] == '\0'

subst.c
	- parameter_brace_expand_word now returns a WORD_DESC * -- changed
	  callers to understand
	- parameter_brace_expand_indir now returns a WORD_DESC * -- changed
	  callers to understand
	- parameter_brace_expand_rhs now returns a WORD_DESC * -- changed
	  callers to understand
	- remove W_HASQUOTEDNULL from a word's flags when remove_quoted_nulls
	  is called on the word's enclosed string

				   1/15
				   ----
subst.c
	- param_expand now returns a WORD_DESC * -- changed callers to
	  understand
	- parameter_brace_expand now returns a WORD_DESC * -- changed
	  callers to understand
	- in expand_word_internal, only call remove_quoted_nulls after a word
	  is returned with W_HASQUOTEDNULL
	- changes to pass W_HASQUOTEDNULL flag out of expand_word_internal;
	  changed callers to call remove_quoted_nulls only if return value has
	  W_HASQUOTEDNULL set.  This is a mostly-complete fix for the
	  long-standing CTLNUL confusion between a quoted null expansion and
	  the expansion of a variable with a literal '\177' in its value
	- change string_list_dollar_at to compute the separator character the
	  same way as string_list_dollar_star:  using the already-computed
	  values generated in setifs()
	- when expanding unquoted $*, if $IFS is empty, check whether or not
	  we're eventually going to split the results (e.g., on the rhs of an
	  assignment statement) and concatenate the positional parameters as
	  if the expansion were within double quotes if we're not going to
	  split

tests/iquote.tests
	- test cases based on old bug reports about the quoted-null vs. 0177
	  problem the recent code fixes

				   1/16
				   ----
dispose_cmd.c
	- set w->word to 0 before putting a WORD_DESC * back in the cache in
	  dispose_word_desc; changed callers to delete those assignments

variables.c
	- change assign_random and get_random_value so that the random number
	  generator only gets re-seeded once in a subshell environment, and
	  assigning a value to RANDOM counts as seeding the generator.  This
	  makes the sequences a little more predictable

				   1/20
				   ----
lib/readline/history.c
	- fix replace_history_entry, remove_history to return NULL if
	  passed index is < 0

				   1/22
				   ----
lib/sh/netconn.c
	- fix isnetconn() to understand that getpeername can return ENOTCONN
	  to indicate that an fd is not a socket

configure.in
	- set BUILD_DIR to contain backslashes to escape any spaces in the
	  directory name -- this is what make will accept in targets and
	  prerequisites, so it's better than trying to use double quotes
	- set SIZE to the appropriate value if some cross-compiling tool
	  chain is being used; `size' by default (can be overridden by
	  SIZE environment variable)

Makefile.in
	- use $(SIZE) instead of size; set SIZE from configure

				   1/31
				   ----
arrayfunc.c
	- in array_value_internal, return NULL right away if the variable's
	  value is NULL, instead of passing a null string to add_string_to_list

				    2/1
				    ---
jobs.h
	- new struct to hold stats and counters for child processes and jobs
	- change some uses of global and static variables to use members of
	  new struct (struct jobstats)

				    2/2
				    ---

jobs.[ch]
	- change PRUNNING to PALIVE
	- new define INVALID_JOB
	- new macro get_job_by_jid(ind), currently expands to jobs[ind]
	- new define J_JOBSTATE, operates on a JOB * like JOBSTATE operates on
	  a job index
	- new function, reset_job_indices, called from delete_job if
	  js.j_lastj or js.j_firstj are removed
	- change various functions to keep counters and stats in struct jobstats

pcomplete.c, builtins/common.c, builtins/{exit,fg_bg,jobs,kill,wait}.def
	- change global variables (e.g., job_slots) to struct members
	  (e.g., js.j_jobslots)
	- use INVALID_JOB define where appropriate
	- use get_job_by_jid and J_JOBSTATE where appropriate

trap.c
	- change reset_or_restore_signal_handler to not free the exit trap
	  string if the function pointer is reset_signal, which is used when
	  the trap strings shouldn't be freed, like in command substitution

				    2/4
				    ---
jobs.c
	- new function, realloc_jobs_list, copies jobs array to newly-allocated
	  memory shrinking (or growing) size to have next multiple of JOB_SLOTS
	  greater than js.j_njobs
	- change compact_jobs_list to just call reap_dead_jobs and then
	  realloc_jobs_list, simplifying it considerably
	- discard_pipeline now returns `int':  the number of processes freed
	- slightly changed the logic deciding whether or not to call
	  compact_jobs_list:  now non-interactive shells will compact the
	  list if it reaches MAX_JOBS_IN_ARRAY in size

parse.y
	- move test for backslash-newline after pop_string in shell_getc so
	  that things like

		((echo 5) \
		 (echo 6))

	  work right

				    2/8
				    ---
jobs.h
	- new structs for holding status of exited background processes, as
	  POSIX specifies
	- new job flag: J_ASYNC

jobs.c
	- new functions to manipulate struct holding status of exited
	  background processes
	- new members in struct jobstats to hold pointer to last created job
	  and last created asynchronous job
	- initialize js.c_childmax in initialize_job_control
	- if the `async' arg to stop_pipeline is non-null, set the J_ASYNC
	  flag in the job struct
	- set js.j_last_made_job and js.j_last_asynchronous_job in
	  stop_pipeline
	- new function: find_last_proc, returns the PROCESS * to the last proc
	  in a job's pipeline
	- changed find_last_pid to call find_last_proc
	- change delete_job to call bgp_add on the last proc of the job being
	  deleted
	- change delete_all_jobs and wait_for_background_pids to call bgp_clear

				    2/9
				    ---
jobs.c
	- change wait_for_single_pid to look for pid in bgpids.list (using
	  bgp_search()) if find_pipeline returns NULL

				   2/10
				   ----
support/shobj-conf
	- change the solaris-gcc stanza so that it auto-selects the appropriate
	  options for ld depending on which `ld' gcc says it's going to run

				   2/11
				   ----
jobs.h
	- add support for PS_RECYCLED as a process state, add PRECYCLED macro
	  to test it.  Change PALIVE and PRUNNING macros to not count processes
	  in PS_RECYCLED state

execute_cmd.c
	- restore use of last_pid as sentinel value; use NO_PID as sentinel
	  only if RECYCLES_PIDS is defined

jobs.c
	- change find_job to return a pointer to the PROCESS the desired pid
	  belongs to, analogous to find_pipeline returning pointer to JOB
	- change find_job callers to add extra argument
	- change running_only arguments to find_pipeline and find_job to
	  alive_only, since we don't want recycled pids returned here and it
	  better describes the result
	- new function find_process, calls find_pipeline and searches the
	  returned pipeline for the PROCESS * describing the desired pid
	- in make_child, if fork() returns the same pid as the value of
	  last_asynchronous_pid when RECYCLES_PIDS is defined, avoid pid
	  aliasing by resetting last_asynchronous_pid to 1
	- use PRUNNING instead of child->running, since we, for the most
	  part, don't want to consider recycled pids (e.g., in make_child())
	- call find_process instead of find_pipeline in waitchld()
	- use PEXITED(p) instead of testing p->running == PS_DONE
	- in make_child, call bgp_delete to remove a just-created pid from the
	  last of saved pid statuses
	- in add_process, check whether or not pid being added is already in
	  the_pipeline or the jobs list (using find_process) and mark it as
	  recycled if so
	- This set of fixes mostly came from Pierre Humblet
	  <pierre.humblet@ieee.org> to fix pid aliasing and reuse problems on
	  cygwin

variables.c
	- set $_ from the environment if we get it there, set to $0 by
	  default if not in env

doc/{bashref.texi,bash.1}
	- a couple of clarifying changes to the description of $_ based on
	  comments from Glenn Morris <gmorris+mail@ast.cam.ac.uk>

				   2/15
				   ----
shell.c
	- use strstr instead of strmatch when checking whether $EMACS contains
	  `term' -- simpler and faster

				   2/18
				   ----
builtins/cd.def
	- implement posix requirement that `pwd -P' set $PWD to a directory
	  name containing no symlinks
	- add new function, setpwd(), just sets (and changes exported value)
	  of PWD

doc/bashref.texi
	- add note to posix mode section about pwd -P setting $PWD

doc{bash.1,bashref.texi}
	- added note that BASH_ARGC and BASH_ARGV are only set in extended
	  debug mode
	- expand description of extdebug option to include everything changed
	  by extended debug mode

				   2/19
				   ----
pathexp.h
	- new flag macro, FNMATCH_IGNCASE, evaluates to FNM_CASEFOLD if the
	  match_ignore_case variable is non-zero

execute_cmd.c
	- new variable, match_ignore_case
	- change call to strmatch() in execute_case_command so it includes
	  FNMATCH_IGNCASE

test.c
	- change call to strmatch() in patcomp() so that pattern matching
	  calls for [[ ... ]] obey the match_ignore_case variable

lib/sh/shmatch.c
	- if match_ignore_case is set, enable REG_ICASE in the regexp match
	  flags

builtins/shopt.def
	- new settable option, `nocasematch', controls the match_ignore_case
	  variable.  Currently alters pattern matching for case and [[ ... ]]
	  commands (==, !=, and =~ operators)

doc/{bashref.texi,bash.1}
	- updated descriptions of [[ and case to include reference to
	  nocasematch option

				   2/22
				   ----
builtins/mkbuiltins.c
	- add `times' to the list of posix special builtins

				   2/23
				   ----
builtins/cd.def
	- posix mode no longer turns on effect of -P option on $PWD if a
	  directory is chosen from CDPATH

doc/bashref.texi
	- clarified that in posix mode, reserved words are not alias expanded
	  only in a reserved word context
	- removed item about cd, $CDPATH, and -P from posix mode section

				   2/24
				   ----
builtins/reserved.def
	- minor cleanups to the description of `if'

				    3/2
				    ---
subst.c
	- change list_string and get_word_from_string to explicitly treat an
	  IFS character that is not space, tab, or newline *and any adjacent
	  IFS white space* as a single delimiter, as SUSv3/XPG6 says

builtins/read.def
	- check whether or not the number of fields is exactly the same as
	  the number of variables instead of just assigning the rest of the
	  line (minus any trailing IFS white space) to the last variable.
	  This parses a field and checks whether or not it consumes all of
	  the input (including any trailing field delimiters), falling back
	  to the previous behavior if it does not.  This is what POSIX.2
	  specifies, I believe (and the consensus of the austin-group list).
	  This requires a few tests in read.tests to be changed: backslashes
	  escaping IFS whitespace characters at the end of input cause the
	  whitespace characters to be preserved in the value assigned to the
	  variable, and the trailing non-whitespace field delimiter issue

				    3/7
				    ---
configure.in
	- add -D_POSIX_SOURCE to the LOCAL_CFLAGS for Interix

				    3/8
				    ---
bashline.c
	- make bash_directory_expansion a void function, since it doesn't have
	  any return value

				    3/9
				    ---
builtins/read.def
	- when testing for a pipe, use `fd' instead of hard-coding 0, since we
	  can read from other file descriptors now

lib/sh/zread.c
	- in zsyncfd, only set lind and lused to 0 if the lseek succeeds.
	  If the lseek fails, we might steal input from other programs, but
	  a failed lseek won't cause us to erroneously discard input

				   3/11
				   ----
builtins/evalstring.c
	- don't allow parse_and_execute to short-circuit and call exec() if
	  the command's return value is being inverted

				   3/15
				   ----
builtins/printf.def
	- new macro PC to call putchar and increment number of chars printed -
	  fixes bug in computation of value for %n format char
	- `tw' is now a global var so printstr can modify it using PC()
	- convert PF macro to use asprintf into a local buffer
	  Preparation for printf -v var
	- add code to add the text printed to a `variable buffer' if -v option
	  supplied.  The buffer grows as needed
	- printf now takes a `-v var' option to put the output into the variable
	  VAR rather than sending it to stdout.  It does not:
		print partial output on error (e.g., format string error)
		handle NULs in the variable value, as usual

				   3/16
				   ----
parse.y
	- fix bug in prompt string decoding that caused a core dump when PS1
	  contained \W and PWD was unset (null pointer deref)

builtins/printf.def
	- changed -v var behavior so it stores partial output into the named
	  variable upon an error

				   3/24
				   ----
lib/readline/bind.c
	- bool_to_int now takes a `const char *' argument

support/{printenv,recho,zecho}.c
	- include config.h
	- include "bashansi.h" for appropriate extern function declarations

configure.in
	- on MacOS X 10.4, compensate for loader not allowing static library
	  to override existing system dynamic library when compiling -dynamic
	  (affects readline and history libraries); so use absolute pathname
	  instead of -lreadline as library name

lib/glob/{glob,sm_loop,smatch}.c
	- make sure to cast arguments to (char *)  or (unsigned char *) as
	  appropriate to avoid gcc4 warnings

lib/glob/smatch.c
	- collsym (single-byte version) now takes a (CHAR *) first argument to
	  match callers; cast argument to strncmp appropriately

lib/sh/snprintf.c
	- fix ldfallback and dfallback to handle width and precision specs in
	  the format passed to sprintf()
	- fix STAR_ARGS macro to deal with negative field widths and precisions

				   3/25
				   ----
builtins/printf.def
	- since a negative precision in a "x.x[fFgGeE]" format specifier should
	  be allowed but treated as if the precision were missing, let it
	  through

lib/sh/snprintf.c
	- fix * code to deal with a negative precision by treating it as if
	  the `.' and any digit string in the precision had not been specified
	- fix format parsing code to deal with a negative inline precision,
	  e.g., "%4.-4f" by treating it as if the `'. and any digit string in
	  the precision had not been specified
	- a `+' in a format specifier should only act as a flag if it comes
	  before a `.' (otherwise it is ignored)

lib/readline/vi_mode.c
	- new function, rl_vi_rubout, to rl_rubout as rl_vi_delete is to
	  rl_delete; saves deleted text for possible reinsertion as with any
	  vi-mode `text modification' command (fixes problem with `X' reported
	  by beat.wieland@gmx.ch)

lib/readline/vi_keymap.c
	- bind `X' in vi command mode to rl_vi_rubout

lib/readline/funmap.c
	- add a bindable `vi-rubout' command, runs rl_vi_rubout

lib/readline/text.c
	- rewrote internals of _rl_rubout_char to make structure cleaner

lib/readline/{complete,text}.c
	- changed code to remove #ifdef HANDLE_MULTIBYTE where possible

				   3/28
				   ----
lib/readline/examples/rl.c
	- include <sys/stat.h> instead of posixstat.h if READLINE_LIBRARY not
	  defined

subst.c
	- fix mbstrlen to treat invalid multibyte sequences as sequences of
	  single-byte characters

				    4/8
				    ---
configure.in
	- default SIZE to `:' if cross-compiling and an appropriate size for
	  the target is not found

				   4/11
				   ----
subst.c
	- change match_upattern and match_wpattern to check whether or not the
	  supplied pattern matches anywhere in the supplied string, prefixing
	  and appending the pattern with `*' if necessary.  If it doesn't we
	  can short-circuit immediately rather than waste time doing up to
	  N-1 unsuccessful calls to strmatch/wcsmatch (which kills for long
	  strings, even if the pattern is short)

				   4/12
				   ----
configure.in
	- make sure the special case for MacOS X 10.4 only kicks in if the
	  `--with-installed-readline' option isn't supplied

lib/readline/{callback,readline,signals}.c
	- make sure rl_prep_term_function and rl_deprep_term_function aren't
	  dereferenced if NULL (as the documentation says)

builtins/mkbuiltins.c
	- don't bother with the special HAVE_BCOPY code; just use straight
	  assignments

builtins/ulimit.def
	- use _POSIX_PIPE_BUF in pipesize() if it's defined and PIPE_BUF is
	  not

				   4/13
				   ----
execute_cmd.c
	- add cm_function_def to the list of control structures for which
	  child processes are forked when pipes come in or out

				   4/14
				   ----
builtins/read.def
	- make sure the ^As added for internal quoting are not counted as
	  characters read when -n is supplied

				   4/20
				   ----
redir.c
	- fix redir_open so that the repeat open on failure that AFS support
	  adds restores the correct value of errno for any error message

				   4/26
				   ----

Makefile.in
	- make sure mksignames and mksyntax are invoked with the $(EXEEXT)
	  extension

				   4/28
				   ----
lib/readline/readline.h
	- new state variable: RL_STATE_CALLBACK, means readline is using the
	  callback interface

lib/readline/callback.c
	- set RL_STATE_CALLBACK in rl_callback_handler_install, unset in
	  rl_callback_handler_remove

				   4/29
				   ----
config-top.h
	- DONT_REPORT_SIGPIPE is now on by default, since it apparently
	  interferes with scripts

configure.in
	- arrange things so PGRP_PIPE is defined on Linux-2.4+ and version 3
	  kernels (ones that apparently schedule children to run before their
	  parent)

				   4/30
				   ----
builtins/caller.def
	- add call to no_options, so it can handle `--' option

doc/{bash.1,bashref.texi}
	- note explicitly that test, :, true, and false don't understand --
	  as meaning the end of options

				    5/7
				    ---
support/shobj-conf
	- darwin 8 needs the same LDFLAGS setting as darwin 7

parse.y
	- in save_parser_state, make sure we cast the return value from
	  xmalloc() to the right type
	- remove casts to (char *) in calls to yyerror()

lib/readline/signals.c
	- make SIGQUIT and SIGALRM code conditional on their definition
	- use raise() to send a signal if we don't have kill()

lib/readline/display.c
	- some MS-DOS and MINGW changes from the cygwin and mingw folks

config.h.in
	- add HAVE_PWD_H for <pwd.h>
	- add HAVE_FCNTL, HAVE_KILL for respective system calls
	- add HAVE_GETPW{ENT,NAM,UID} for passwd functions

configure.in
	- add check for <pwd.h>
	- add checks for fcntl, kill system calls
	- add checks for getpw{ent,nam,uid} C library functions
	- pass a flag indicating we're cross compiling through to
	  CFLAGS_FOR_BUILD in Makefile.in

lib/readline/complete.c
	- guard inclusion of <pwd.h> with HAVE_PWD_H
	- don't provide a missing declaration for getpwent if we don't have it
	- guard calls to {get,end}pwent with HAVE_GETPWENT

lib/readline/shell.c
	- guard inclusion of <pwd.h> with HAVE_PWD_H
	- guard inclusion of <fcntl.h> with HAVE_FCNTL_H
	- don't provide a missing declaration for getpwuid if we don't have it
	- guard calls to getpwuid with HAVE_GETPWUID
	- don't bother with body of sh_unset_nodelay_mode if we don't have
	  fcntl

lib/tilde/tilde.c
	- guard inclusion of <pwd.h> with HAVE_PWD_H
	- guard calls to getpw{nam,uid} with HAVE_GETPW{NAM,UID}
	- guard calls to {get,end}pwent with HAVE_GETPWENT

Makefile.in,builtins/Makefile.in
	- @CROSS_COMPILE@ is substituted into CFLAGS_FOR_BUILD (equal to
	  -DCROSS_COMPILING if bash is being cross-compiled)

				    5/9
				    ---
aclocal.m4
	- print version as `0.0' in RL_LIB_READLINE_VERSION if the
	  `rl_gnu_readline_p' variable isn't 1 (accept no imitations)

				   5/11
				   ----
lib/readline/rlprivate.h
	- definition of a readline `search context', to be use for incremental
	  search initially and other types of search later.  Original from
	  Bob Rossi as part of work on incremental searching problems when
	  using callback interface

lib/readline/isearch.c
	- functions to allocate and free search contexts
	- function to take a search context and a character just read and
	  `dispatch' on it:  change search parameters, add to search string,
	  search further, etc.
	- isearch is now completely context-driven:  a search context is
	  allocated and passed to the rest of the functions

				   5/12
				   ----
lib/readline/isearch.c
	- an additional `isearch cleanup' function that can be called from
	  the callback interface functions when the search is to be terminated
	- an additional `isearch callback' function that can be called from
	  rl_callback_read_char when input is available
	- short-circuit from rl_search_history after initialization if
	  the callback interface is being used

lib/readline/callback.c
	- in rl_callback_read_char(), if RL_STATE_ISEARCH is set, call
	  _rl_isearch_callback to read the character and dispatch on it.
	  If RL_STATE_ISEARCH is unset when that call returns, and there is
	  input pending, call rl_callback_read_char() again so we don't
	  have to wait for new input to pick it up

support/shobj-conf,configure.in
	- add support for dragonfly bsd, the same as freebsd

				 5/13-5/15
				 ---------
lib/readline/callback.c
	- support for readline functions to `register' a function that will
	  be called when more input is available, with a generic data
	  structure to encapsulate the arguments and parameters.  Primarily
	  intended for functions that read a single additional character,
	  like quoted-insert
	- support for callback code reading numeric arguments in a loop,
	  using readline state and an auxiliary variable
	- support for callback code performing non-incremental searches using
	  the same search context struct as the isearch code

lib/readline/{callback,display}.c
	- if a callback function sets `_rl_redisplay_wanted', the redisplay
	  function will be called as soon as it returns

lib/readline/input.c
	- changes to _rl_read_mbchar to handle reading the null multibyte
	  character and translating it into '\0'

lib/readline/misc.c
	- break rl_digit_loop() into component functions that can be called
	  individually from the callback code more easily
	- share some of the functions with rl_digit_loop1() in vi_mode.c

lib/readline/readline.h
	- change the version #defines to reflect readline 5.1

lib/readline/search.c
	- break code into smaller functions that can be composed to work with
	  the callback code more easily

lib/readline/text.c
	- in rl_quoted_insert(), don't mess around with the tty signals if
	  running in `callback mode'

lib/readline/vi_mode.c
	- changed set-mark, goto-mark, change-char, and char-search to work
	  when called by callback functions

				   5/17
				   ----

lib/readline/rlprivate.h
	- new struct declaration for a `reading key sequence' context

lib/readline/readline.c
	- new variable, _rl_dispatching_keymap, keeps track of which keymap
	  we are currently searching
	- functions to allocate and deallocate contexts for reading multi-char
	  key sequences

				   5/18
				   ----
lib/readline/rlprivate.h
	- new struct defining a context for multiple-key key sequences (the
	  base case is escape-prefixed commands)

lib/readline/readline.c
	- change structure of _rl_dispatch_subseq to allow for callback code
	  to use it - rudimentary support for supporting the existing
	  recursion using a stack of contexts, each with a reference to the
	  previous
	- fix so that ^G works when in callback mode

lib/readline/callback.c
	- call the appropriate multiple-key sequence callback if the state is
	  set

				   5/19
				   ----
lib/readline/readline.c
	- broke code from _readline_internal_char after call to rl_dispatch
	  out into separate function:  _rl_internal_char_cleanup, callable by
	  other parts of the code
	- change _rl_internal_char_cleanup to unset _rl_want_redisplay after
	  it calls (*rl_redisplay_func)

lib/readline/callback.c
	- call _rl_internal_char_cleanup from rl_callback_read_char when
	  appropriate

				   5/24
				   ----
lib/readline/callback.c
	- use _rl_dispatch_callback and a chain of _rl_keyseq_contexts to
	  simulate the recursion used to decode multicharacter key sequences
	  (even things like ESC- as meta-prefix)
	- call setjmp in rl_callback_read_char to give things like rl_abort
	  a place to jump, since the saved location in readline() will not
	  be valid
	- keep calling _rl_dispatch_callback from rl_callback_read_char while
	  we are still decoding a multi-key key sequence
	- keep calling readline_internal_char from rl_callback_read_char while
	  we are reading characters from a macro

lib/readline/macro.c
	- use a slightly different strategy upon encountering the end of a macro
	  when using the callback interface:  when the last character of a
	  macro is read, and we are reading a command, pop the macro off the	
	  stack immediately so the loop in rl_callback_read_char terminates
	  when it should

lib/readline/readline.c
	- if longjmp() is called and we end up at the saved location while
	  using the callback interface, just return -- don't go back into a
	  blocking read
	- new function to dispose a chain of rl_keyseq_cxts
	- only read new input in _rl_dispatch_callback if the KSEQ_DISPATCHED
	  flag is not set in the current keyseq context -- if it is, we are
	  traversing the chain back up and should use what we already saved
	- use -3 as a magic value from _rl_dispatch_subseq to indicate that
	  we're allocating a new context and moving downward in the chain
	  (a special return value for the benefit of _rl_dispatch_callback)

lib/readline/rlprivate.h
	- new extern declaration for _rl_keyseq_chain_dispose

				    6/1
				    ---
builtins/read.def
	- fixed a bug that occurred when reading a set number of chars and
	  the nth char is a backslash (read one too many).  Bug reported by
	  Chris Morgan <chmorgan@gmail.com>

execute_cmd.c
	- fix execute_builtin so the `unset' builtin also operates on the
	  temporary environment in POSIX mode (as well as source and eval),
	  so that unsetting variables in the temporary environment doesn't
	  leave them set when unset completes.  Report by Eric Blake
	  <ebb9@byu.net>

array.c
	- fix from William Park for array_rshift when shifting right on an
	  empty array -- corrects calculation of array->max_index

builtins/exec.def
	- if an exec fails and the execfail option is set, don't call
	  restart_job_control unless the shell is interactive or job_control
	  is set

jobs.c
	- add a run-time check for WCONTINUED being defined in header files
	  but rejected with EINVAL by waitpid().  Fix from Maciej Rozycki
	  <macro@linux-mips.org>

				   6/20
				   ----
bashhist.c
	- make sure calls to sv_histchars are protected by #ifdef BANG_HISTORY
	- ditto for calls to history_expand_line_internal

				   6/23
				   ----
doc/bashref.texi
	- remove extra blank lines in @menu constructs

variables.c
	- assign export_env to environ (extern char **) every time it changes
	  (mostly in add_to_export_env define), so maybe getenv will work on
	  systems that don't allow it to be replaced

				   6/29
				   ----
bashline.c
	- in bash_directory_completion_hook, be careful about not turning `/'
	  into `//' and `//' into `///' for benefit of those systems that treat
	  `//' as some sort of `network root'.  Fix from Eric Blake
	  <ebb9@byu.net>

lib/readline/complete.c
	- in to_print, do the right thing after stripping the trailing slash
	  from full_pathname: // doesn't turn into /, and /// doesn't become
	  //.  Fix from Eric Blake <ebb9@byu.net>

				   6/30
				   ----
lib/malloc/trace.c
	- include <unistd.h> if it's available for a definition of size_t

jobs.c
	- in wait_for, if a child process is marked as running but waitpid()
	  returns -1/ECHILD (e.g., when the bash process is being traced by
	  strace), make sure to increment c_reaped when marking the child as
	  dead
	- in without_job_control, make sure to close the pgrp pipe after
	  calling start_pipeline

				    7/1
				    ---
Makefile.in
	- only remove pathnames.h when the other files created by running
	  configure are removed (e.g., Makefile).  Fix from William Park

lib/sh/shquote.c
	- since backslash-newline disappears when within double quotes, don't
	  add a backslash in front of a newline in sh_double_quote.  Problem
	  reported by William Park

jobs.c
	- in notify_of_job_status, don't print status messages about
	  terminated background processes unless job control is active

bashhist.c
	- new variable, hist_last_line_pushed, set to 0 in really_add_history
	  (used by `history -s' code)

bashhist.h
	- new extern declaration for history -s

builtins/history.def
	- don't remove last history entry in push_history if it was added by
	  a call to push_history -- use hist_last_line_pushed as a sentinel
	  and set it after adding history entry.  This allows multiple
	  calls to history -s to work right:  adding all lines to the history
	  rather than deleting all but the last.  Bug reported by Matthias
	  Schniedermeyer <ms@citd.de>
	- pay attention to hist_last_line_pushed in expand_and_print_history()
	  so we don't delete an entry pushed by history -s

				    7/4
				    ---
print_cmd.c
	- fix print_arith_for_command to not print so many blanks between
	  expressions in ((...))

command.h
	- new word flag: W_DQUOTE.  Means word should be treated as if double
	  quoted

make_cmd.c
	- add W_DQUOTE to word flags in make_arith_for_expr

parse.y
	- add W_DQUOTE to word flags for (( ... )) arithmetic commands

subst.c
	- don't perform tilde expansion on a word with W_DQUOTE flag set
	- don't perform process substitution on a word with W_DQUOTE flag set

arrayfunc.c
	- expand an array index within [...] the same way as an arithmetic
	  expansion between (( ... ))

lib/readline/input.c
	- use getch() instead of read() on mingw

lib/readline/readline.c
	- add a few key bindings for the arrow keys on mingw

lib/readline/rldefs.h
	- if on mingw, define NO_TTY_DRIVER

lib/readline/rltty.c
	- compile in the stub functions for _rl_{disable,restore}_tty_signals
	  if on mingw
	- compile in stub function for rl_restart_output on mingw
	- make sure enough functions and macros are defined to compile if
	  NO_TTY_DRIVER is defined (lightly tested - builds on MacOS X, at
	  least)

				    7/7
				    ---
command.h
	- add a `flags' member to the PATTERN_LIST structure

make_cmd.c
	- intialize the `flags' member of a PATTERN_LIST when it's created

builtins/psize.c
	- protect extern declaration of errno with usual #ifdef errno

configure.in, variables.c
	- changes for QNX 6.x

				    7/9
				    ---
parse.y
	- fix parse_matched_pair to handle single and double quoted strings
	  inside old-style command substitution (``) since they can each
	  quote the ` and embedded $-expansions.  Report by Eric Blake
	  <ebb9@byu.net>

{configure,Makefile}.in
	- TILDE_LIB is now substituted into Makefile by configure

configure.in
	- if configuring --with-installed-readline on cygwin, set TILDE_LIB
	  to the empty string to avoid multiply-defined symbols.  Cygwin
	  doesn't allow undefined symbols in dynamic libraries.  Report by
	  Eric Blake <ebb9@byu.net>

				   7/11
				   ----
input.c
	- in duplicate_buffered_stream, don't call free_buffered_stream if the
	  two buffered streams share the same b_buffer object (e.g., if they
	  had already been duplicated with a previous call).  Fixes Debian bug
	  reported by eero17@bigfoot.com

				   7/12
				   ----
shell.c
	- make set_shell_name more resistant to a NULL argument
	- in bind_args, use < instead of != when counting the arguments and
	  making the arg list
	- in main(), make sure arg_index is not initialized to a value greater
	  than argc

				   7/14
				   ----
lib/readline/display.c
	- in expand_prompt, don't set the location of the last invisible
	  char if the sequence is zero length  (\[\])

				   7/15
				   ----
doc/{bash.1,bashref.texi}
	- document that the shell uses $TMPDIR when creating temporary files

				   7/20
				   ----
[bash-3.1-alpha1 frozen]

				   7/29
				   ----
builtins/evalstring.c
	- make sure that parse_and_execute saves and restores the value of
	  loop_level, so loops in sourced scripts and eval'd strings don't
	  mess up the shell's parser state

bashline.c
	- change command_subst_completion_function to suppress appending
	  any character to a unique completion, instead of a space, unless
	  the last word in the quoted command substitution completes to a
	  directory name.  In that case we append the expected slash

				    8/1
				    ---
builtins/printf.def
	- make sure variables are initialized if their values are tested later

[bash-3.1-alpha1 updated and re-frozen]

				    8/2
				    ---
variables.c
	- make sure to call stifle_history with an `int' instead of an intmax_t.
	  Sometimes it makes a difference

				    8/3
				    ---
[bash-3.1-alpha1 released]

support/mksignames.c
	- add `SIGSTKFLT' (RHE3)
	- add `SIGXRES' (Solaris 9)

				    8/4
				    ---
builtins/ulimit.def
	- fix typo to make `x' the right option for locks
	- add new options to short help synopsis

variables.c
	- use get_variable_value instead of direct reference to value_cell
	  in make_variable_value when appending to the current value, so
	  references to array variables without subscripts will be equivalent
	  to element 0

lib/readline/text.c
	- rewrote rl_change_case to correctly change the case of multibyte
	  characters where appropriate

				    8/5
				    ---
configure.in
	- remove call to obsolete macro AC_ACVERSION
	- remove special calls to AC_CYGWIN and AC_MINGW32; AC_CANONICAL_HOST
	  takes care of those cases

general.h
	- include `chartypes.h' for definition of ISALPHA
	- fix definitions of ABSPATH and RELPATH for cygwin
	- fix definition of ISDIRSEP for cygwin to allow backslash as a
	  directory name separator

				    8/9
				    ---
builtins/setattr.def
	- when setting a variable from the temporary environment in
	  set_var_attribute  (e.g., `LC_ALL=C export LC_ALL'), make sure to
	  call stupidly_hack_special_variables after binding the variable in
	  the current context

builtins/printf.def
	- make sure to call stupidly_hack_special_variables if using `printf -v'
	  to put formatted output in a shell variable

				   8/11
				   ----
support/shobj-conf
	- new variable: SHLIB_LIBPREF, prefix for shared library name (defaults
	  to `lib'
	- new variable: SHLIB_DLLVERSION, used on Cygwin to set the library
	  version number
	- new variable: SHLIB_DOT, separator character between library name and
	  suffix and version information (defaults to `.')
	- new stanza for cygwin to generate windows-compatible dll

				   8/14
				   ----
variables.c
	- new special variable function for Cygwin, so the export environment
	  is remade when HOME is changed.  The environment is the only way to
	  get information from the shell to cygwin dlls, for instanace, when
	  bash is compiled to use an already-installed libreadline

variables.h
	- new extern declaration for sv_home

				   8/15
				   ----
lib/readline/display.c
	- call init_line_structures from rl_redisplay if vis_lbreaks == 0
	  to avoid consequences of a poorly-timed SIGWINCH

				   8/16
				   ----
subst.c
	- fix logic for performing tilde expansion when in posix mode (don't
	  rely on W_TILDEEXP flag always being set, because it won't be when
	  expanding the RHS of assignment statement).  Use W_TILDEEXP only
	  when deciding to expand a word marked as W_ASSIGNMENT that doesn't
	  precede a command name

				   8/17
				   ----
execute_cmd.c
	- in execute_function, when subshell == 1, don't short-cut by using
	  the command contained in the group command -- if you do, any
	  redirections attached to the group command (function) don't get
	  executed

general.h
	- new #define, FS_READABLE, indicates file is readable by current
	  user

findcmd.c
	- rewrote file_status to use S_xxx POSIX file mode bits and to add
	  support for FS_READABLE (affects ./source and searching $PATH for
	  scripts whose names are supplied as arguments on the command line)
	- change find_path_file to look for readable files -- source requires
	  it
	- change find_in_path_element to do the right thing when FS_READABLE
	  is supplied as a flag

doc/bashref.texi
	- remove note about posix non-compliance in `.': we now require and
	  look for readable files when searching $PATH

				   8/20
				   ----
subst.c
	- fix setifs to handle case where passed variable is non-zero but
	  v->value == 0 (as in an unset local variable); treat IFS as unset
	  in this case

jobs.c
	- in kill_pid, if asked to killpg a process or pgrp whose pgrp is
	  recorded as the same as the shell's, just call killpg and let the
	  chips fall where they may -- there may be other processes in that
	  pgrp that are not children of the shell, so killing each process
	  in the pipeline will not do a complete job, and killpg'ing each
	  such process will send too many signals in the majority of cases

builtins/cd.def
	- in posix mode, pwd needs to check that the value it prints and `.'
	  are the same file

builtins/read.def
	- if reading input from stdin in a non-interactive shell and calling
	  `read', call sync_buffered_stream to seek backward in the input
	  stream if necessary (XXX - should we do this for all shell builtins?)

				   8/23
				   ----
builtins/cd.def
	- in posix mode, if canonicalization of the absolute pathname fails
	  because the path length exceeds PATH_MAX, but the length of the passed
	  (non-absolute) pathname does not, attempt the chdir, just as when
	  not in posix mode

builtins/type.def
	- don't have describe_command call sh_makepath if the full path found
	  is already an absolute pathname (sh_makepath will stick $PWD onto the
	  front of it)

				   8/24
				   ----

jobs.c
	- in posix mode, don't have start_job print out and indication of
	  whether the job started by `bg' is the current or previous job
	- change start_job to return success if a job to be resumed in the
	  background is already running.  This means that bg won't fail when
	  asked to bg a background job, as SUSv3/XPG6 requires
	- new function, init_job_stats, to zero out the global jobstats struct

{jobs,nojobs}.c
	- change kill_pid to handle pids < -1 by killing process groups

jobs.h
	- extern declaration for init_job_stats

lib/readline/history.c
	- check whether or not the history list is null in remove_history

builtins/history.def
	- delete_last_history is no longer static so fc builtin can use it

builtins/fc.def
	- use free_history_entry in fc_replhist instead of freeing struct
	  members individually
	- call delete_last_history from fc_replhist instead of using inline
	  code
	- if editing (-l not specified), make sure the fc command that caused
	  the editing is removed from the history list, as POSIX specifies

builtins/kill.def
	- just call kill_pid with any pid argument and let it handle pids < -1
	  This is the only way to let kill_pid know whether a negative pid or
	  a job spec was supplied as an argument to kill

builtins/fg_bg.def
	- force fg_bg to return EXECUTION_SUCCESS explicitly if called by bg
	  and start_job returns successfully
	- bg now returns success only if all the specified jobs were resumed
	  successfully

execute_cmd.c
	- call init_job_stats from initialize_subshell to zero out the global
	  job stats structure

				   8/25
				   ----
bashline.c
	- change vi_edit_and_execute_command to just call vi when in posix
	  mode, instead of checking $FCEDIT and $EDITOR

lib/readline/search.c
	- if in vi_mode, call rl_free_undo_list in make_history_line_current
	  to dispose of undo list accumulated while reading the search string
	  (if this isn't done, since vi mode leaves the current history
	  position at the entry which matched the search, the call to
	  rl_revert_line in rl_internal_teardown will mangle the matched
	  history entry using a bogus rl_undo_list)
	- call rl_free_undo_list after reading a non-incremental search string
	  into rl_line_buffer -- that undo list should be discarded

lib/readline/rlprivate.h
	- add UNDO_LIST * member to search context struct

lib/readline/isearch.c
	- initialize UNDO_LIST *save_undo_list member of search context struct

				   8/27
				   ----
lib/readline/bind.c
	- change rl_parse_and_bind to strip whitespace from the end of a
	  variable value assignment before calling rl_variable_bind

doc/bash.1,lib/readline/doc/{rluser.texi,readline.3}
	- clarified the language concerning parsing values for boolean
	  variables in assignment statements

				   8/28
				   ----
lib/sh/pathphys.c
	- fix small memory leak in sh_realpath reported by Eric Blake

				   8/31
				   ----
doc/bashref.texi
	- add additional notes to posix mode section

				    9/3
				    ---
parse.y
	- if $'...' occurs within a ${...} parameter expansion within
	  double quotes, don't single-quote the expanded result -- the double
	  quotes will cause it to be expanded incorrectly

				    9/4
				    ---
builtins/fc.def
	- if STRICT_POSIX is defined, the posix mode default for the editor to
	  use is $FCEDIT, then ed

shell.c
	- if STRICT_POSIX is defined, initialize `posixly_correct' to 1

config.h.in
	- add #undef STRICT_POSIX

				    9/5
				    ---
configure.in
	- add new option argument, --enable-strict-posix-default, configures
	  bash to be posix-conformant (including defaulting echo to posix
	  conformance) by default

builtins/echo.def
	- if STRICT_POSIX is defined, default echo to xpg-style

doc/bashref.texi
	- describe the --enable-strict-posix-default option to configure

				   9/10
				   ----
builtins/mkbuiltins.c
	- change to not generate N_(""), because the translated empty string is
	  special to GNU gettext

				   9/13
				   ----
lib/readline/complete.c
	- a negative value for rl_completion_query_items means to not ask

lib/readline/doc/{{rltech,rluser}.texi,readline.3}
	- documented new semantics for rl_completion_query_items/
	  completion-query-items

				   9/14
				   ----
bashline.c
	- bind M-TAB in emacs mode to dynamic-complete-history even if the
	  current binding is `tab-insert' (which is what it is by default),
	  not just if it's unbound

				   9/15
				   ----
eval.c
	- call QUIT before calling dispose_command on current_command after
	  the  `exec_done' label.  If we dispose current_command first, the
	  longjmp might restore the value of current_command after we've
	  disposed it, and the subsequent call to dispose_command from the
	  DISCARD case will free memory twice

				   9/16
				   ----
lib/sh/strto[iu]max.c
	- make sure the function being declared is not a cpp define before
	  defining it -- should fix problems on HP-UX

				   9/19
				   ----
Makefile.in
	- make sure the binaries for the tests are at the front of $PATH

				   9/22
				   ----
parse.y
	- new flag for parse_matched_pair: P_COMMAND, indicating that the
	  text being parsed is a command (`...`, $(...))
	- change calls to parse_matched_pair to include P_COMMAND where
	  appropriate
	- if P_COMMAND flag is set and the text is unquoted, check for comments
	  and don't try to parse embedded quoted strings if in a comment (still
	  not exactly right yet)

				   9/24
				   ----
builtins/history.def
	- if running history -n, don't count these new lines as history lines
	  for the current session if the `histappend' shell option is set.
	  If we're just appending to the history file, the issue that caused
	  history_lines_this_session to be recalculated doesn't apply -- the
	  history file won't be missing any entries

lib/readline/isearch.c
	- fix C-w handler for isearch string reader to handle multibyte chars

lib/readline/rlmbutil.h
	- new defines for _rl_to_wupper and _rl_to_wlower

lib/readline/text.c
	- use _rl_to_wupper and _rl_to_wlower as appropriate

				   9/26
				   ----
execute_cmd.c
	- in shell_execve, if the exec fails due to E2BIG or ENOMEM, just print
	  the appropriate error message instead of checking out any interpreter
	  specified with #!

				   9/30
				   ----
bashhist.c
	- make $HISTCMD available anytime remember_on_history is non-zero,	
	  which indicates that we're saving commands to the history, and
	  let it evaluate to 1 if we're not

				   10/4
				   ----
lib/sh/snprintf.c
	- in floating(), make sure d != 0 before calling chkinfnan -- gcc on the
	  version of Solaris 9 I have translates 0 to -inf on the call

[bash-3.1-beta1 frozen]

				   10/6
				   ----
jobs.c
	- set the_pipeline to NULL right away in cleanup_the_pipeline, and
	  dispose a copy of the pointer so we don't mess with the_pipeline
	  while we're in the process of destroying it
	- block and unblock SIGCHLD around manipulating the_pipeline in
	  cleanup_the_pipeline	

				   10/7
				   ----
[bash-3.1-beta1 released]

lib/readline/isearch.c
	- when switching directions, make sure we turn off the SF_REVERSE
	  flag in the search context's flags word if we're going from reverse
	  to forward i-search

lib/readline/bind.c
	- new function, rl_variable_value, returns a string representing a
	  bindable readline variable's value
	- new auxiliary function, _rl_get_string_variable_value, encapsulates
	  everything needed to get a bindable string variable's value
	- rewrote rl_variable_dumper to use _rl_get_string_variable_value

lib/readline/readline.h
	- new extern declaration for rl_variable_value

lib/readline/doc/rltech.texi
	- documented rl_variable_value

bashline.c
	- in command_word_completion_function, if readline sets
	  rl_completion_found_quote, but doesn't set rl_completion_quote_character,
	  we have an embedded quoted string or backslash-escaped character in
	  the passed text.  We need to dequote that before calling
	  filename_completion_function.  So far, this is in place only for
	  absolute program names (those containing a `/')
	- in command_word_completion_function, use rl_variable_value to decide
	  whether or not we should ignore case, and use strncasecmp instead of
	  strncmp where appropriate

				   10/11
				   -----
builtins/fc.def
	- fixed a typo when using POSIX_FC_EDIT_COMMAND

redir.h
	- new flag values for redirections: RX_INTERNAL and RX_USER (currently
	  unused)

redir.c
	- add_undo_redirect and add_undo_close_redirect now set RX_INTERNAL
	  flag when making new redirects
	- in do_redirection_internal, only set file descriptors > 2 to CLEXEC
	  if they're marked as RX_INTERNAL

				   10/12
				   -----
jobs.c
	- in wait_for_single_pid, if in posix mode, remove the waited-for pid
	  from the list of background pids, forgetting it entirely.  POSIX
	  conformance tests test for this.

lib/readline/{readline.h,vi_mode.c}
	- new state flag, RL_STATE_VICMDONCE, set after entering vi command
	  mode the first time; reset on each call to readline()

				   10/13
				   -----
lib/readline/undo.c
	- in rl_revert_line, make sure that revert-line in vi mode leaves
	  rl_point set to 0 no matter the state of the line buffer

lib/readline/vi_mode.c
	- when entering vi_command mode for the first time, free any existing
	  undo list so the previous insertions won't be undone by the `U'
	  command.  This is how POSIX.2 says `U' should work (and the test
	  suite tests for it)

lib/readline/bind.c
	- change rl_parse_and_bind so only `set' commands involving boolean
	  readline variables have trailing whitespace stripped from the value
	  string

				   10/16
				   -----
lib/glob/sm_loop.c
	- fix patscan() to correctly scan backslash-escaped characters

				   10/18
				   -----
lib/sh/{winsize.c,Makefile.in},{jobs,nojobs}.c,Makefile.in,externs.h
	- moved get_new_window_size from jobs.c/nojobs.c to new file,
	  lib/sh/winsize.c, made function global

{jobs,nojobs,sig}.c,{jobs,sig}.h
	- moved SIGWINCH handling code to sig.c rather than duplicate it in
	  jobs.c and nojobs.c
	- call set_sigwinch_handler from sig.c code rather than job control
	  signal initialization

sig.[ch]
	- new variable, sigwinch_received, acts like interrupt_state for
	  SIGWINCH, set by sigwinch_sighandler.  sigwinch_sighandler no longer
	  calls get_new_window_size

parse.y
	- add call to get_new_window_size if sigwinch_received at top of
	  shell_getc

				   10/19
				   -----
lib/malloc/malloc.c
	- to avoid orphaning memory on free if the right bucket is busy, use a
	  new function xplit(mem, bucket) to split the block into two or more
	  smaller ones and add those to the right bucket (appropriately marking
	  it as busy)
	- audit bsplit(), bcoalesce(), and xsplit() for proper use of busy[],
	  since they're dealing with two separate buckets

				   10/22
				   -----
subst.c
	- new flag for string_extract: EX_REQMATCH, means to return an error
	  if a matching/closing character is not found before EOS
	- new static flag variables: extract_string_error and extract_string_fatal
	- change expand_word_internal to check for new error returns from
	  string_extract and return errors if appropriate

				   10/23
				   -----
builtins/cd.def
	- make sure we free TDIR in change_to_directory after calling
	  set_working_directory (which allocates new memory) and other places
	  we short-circuit and return

				   10/24
				   -----
subst.c
	- modified fix from 10/22 to allow bare ` to pass through (for
	  some backwards compatibility and more correctness)

				   10/27
				   -----
conftypes.h
	- make MacOS X use the RHAPSODY code that gets HOSTTYPE, et al.
	  at build rather than configure time, to support universal binaries
	  (fix from llattanzi@apple.com)

				   10/30
				   -----
builtins/evalstring.c
	- make sure we don't turn on CMD_NO_FORK in parse_and_execute if
	  we're running a trap command on signal receipt or exit

execute_cmd.c
	- in shell_execve, improve the error message a little bit if the
	  interpreter name in a #! exec header ends with a ^M (as in a DOS-
	  format file)

				   11/1
				   ----
lib/readline/vi_mode.c
	- fix vi-mode `r' command to leave the cursor in the right place

[bash-3.1-rc1 frozen]

				   11/5
				   ----
execute_cmd.c
	- make sure a DEBUG trap doesn't overwrite a command string passed to
	  make_child in execute_simple_command

bashline.c
	- rearrange some code in bash_quote_filename so filenames with leading
	  tildes containing spaces aren't tilde-expanded before being
	  returned to the caller

				   11/6
				   ----
lib/readline/display.c
	- when deciding where to move the cursor in rl_redisplay and needing
	  to move the cursor back after moving it vertically and compensate
	  for invisible characters in the prompt string, make sure that
	  _rl_last_c_pos is treated as an absolute cursor position in a
	  multibyte locale and the wrap offset (number of invisible characters)
	  is added explicitly when deciding how many characters to backspace

				   11/10
				   -----
lib/readline/terminal.c
	- _rl_set_screen_size now interprets a lines or columns argument < 0
	  as an indication not to change the current value

				   11/11
				   -----

lib/readline/terminal.c
	- new function, rl_reset_screen_size, calls _rl_get_screen_size to
	  reset readline's idea of the terminal size
	- don't call _rl_get_screen_size in _rl_init_terminal_io if both	
	  _rl_screenheight and _rl_screenwidth are > 0
	- don't initialize _rl_screenheight and _rl_screenwidth to 0 in
	  _rl_init_terminal_io; let caller take care of it
	- set _rl_screenheight and _rl_screenwidth to 0 before calling
	  _rl_init_terminal_io

lib/readline/readline.h
	- new extern declaration for rl_reset_screen_size

lib/readline/doc/rltech.texi
	- documented rl_reset_screen_size

variables.c
	- if readline is being used, compile in a special var function for
	  assignments to LINES and COLUMNS that calls rl_set_screen_size or
	  rl_reset_screen_size as appropriate.  Only do this in posix mode
	  and only when STRICT_POSIX is defined at compile time
	- new semaphore variable, winsize_assignment, set while doing an
	  assignment to LINES or COLUMNS
	- new variable, winsize_assigned, says LINES or COLUMNS was assigned
	  to or found in the environment
	- if in the middle of an assignment to LINES or COLUMNS, make
	  sh_set_lines_and_columns a no-op

lib/sh/winsize.c
	- get_new_window_size now takes two int * arguments, to return the
	  screen dimensions

externs.h
	- change extern declaration for get_new_window_size

{jobs,nojobs}.c, parse.y
	- change callers of get_new_window_size

				   11/12
				   -----
lib/readline/terminal.c
	- new variable, rl_prefer_env_winsize, gives LINES and COLUMNS
	  precedence over values from the kernel when computing window size

lib/readline/readline.h
	- extern declaration for rl_prefer_env_winsize

lib/readline/doc/rltech.texi
	- document rl_prefer_env_winsize

				   11/13
				   -----
lib/readline/rltty.c
	- change rl_prep_terminal to make sure we set and reset the tty
	  special characters in the vi insertion keymap if in vi mode.  This
	  matters if we get accept-line for the previous line while in vi
	  command mode

				   11/14
				   -----
builtins/pushd.def
	- make sure any call to cd_builtin includes a leading `--' from the
	  argument list (or constructs one)

				   11/16
				   -----
pcomplete.c
	- fix small memory leak in gen_wordlist_matches

[bash-3.1-rc2 frozen]

				   11/21
				   -----
[bash-3.1-rc2 released]

				   11/23
				   -----
lib/readline/display.c
	- changes to rl_redisplay to compensate for update_line updating
	  _rl_last_c_pos without taking invisible characters in the line into
	  account.  Important in multibyte locales where _rl_last_c_pos is an
	  absolute cursor position
	- changes to _rl_move_cursor_relative to account for _rl_last_c_pos
	  being an absolute cursor position in a multibyte character locale
	- rewrote _rl_move_cursor_relative to make it a little simpler

				   11/29
				   -----
lib/readline/display.c
	- changes to rl_redisplay and update_line for update_line to communicate
	  upward that it took the number of invisible characters on the current
	  line into account when modifying _rl_last_c_pos
	- in update_line, adjust _rl_last_c_pos by wrap_offset before calling
	  _rl_move_cursor_relative, so we pass correct information about the
	  true cursor position

				   12/1
				   ----
configure.in
	- changed release status to `release'

[bash-3.1 frozen]

				   12/8
				   ----
[bash-3.1 released]

				   12/9
				   ----
doc/{bash.1,version.texi},lib/readline/doc/version.texi
	- remove `beta1' from man page footer and texinfo documents

variables.c
	- make sure winsize_assignment is protected by #ifdef READLINE, so
	  minimal shell will compile

builtins/read.def
	- make sure error cases free memory and run any unwind-protects to
	  avoid memory leaks

				   12/10
				   -----
execute_cmd.c
	- change execute_command_internal to set $PIPESTATUS for ((...)) and
	  [[ ... ]] commands

doc/{bash.1,bashref.texi,version.texi}
	- add documentation for ulimit -[iqx] and bump revision date

				   12/12
				   -----
parse.y
	- make sure parse_compound_assignment saves and restores the
	  PST_ASSIGNOK parser state flag around its calls to read_token.
	  Fixes bug reported by Mike Frysinger

				   12/13
				   -----
parse.y
	- change parse_compound_assignment to save and restore the value of
	  last_read_token.  Not sure why it was set unconditionally in the
	  first place after parsing the complete compound assignment

				   12/14
				   -----
lib/readline/text.c
	- don't use return value of rl_kill_text (which always succeeds and
	  returns the number of characters killed) in rl_delete as an indication
	  of success or failure
	- ditto for return value of rl_delete_text

lib/readline/readline.c
	- don't return the value of the called readline function as the return
	  value from _rl_dispatch_subseq; -1 means something different to the
	  callers (return 0 all the time to indicate that a readline function
	  was found and dispatched).  Fix from Andreas Schwab for <DEL><DEL>
	  bug in callback interface first reported by Mike Frysinger

execute_cmd.c
	- fixed a typo in execute_case_command

				   12/15
				   -----
aclocal.m4
	- add check for wctype() to BASH_CHECK_MULTIBYTE, define HAVE_WCTYPE

config.h.in
	- add HAVE_WCTYPE #define

config-bot.h
	- add HAVE_WCTYPE to the set of checks for HANDLE_MULTIBYTE.  This
	  should catch the deficient NetBSD multibyte support

				   12/16
				   -----
parse.y
	- use CTLESC instead of literal '\001' when decode_prompt_string
	  prefixes RL_PROMPT_START_IGNORE and RL_PROMPT_END_IGNORE

				   12/20
				   -----
lib/readline/display.c
	- don't treat RL_PROMPT_START_IGNORE specially inside a sequence of
	  ignored characters
	- keep track of the start of the current sequence of ignored
	  characters; make sure that an empty sequence of such characters
	  really is an empty sequence, not one that happens to end with '\001'
	  (RL_PROMPT_START_IGNORE)

				   12/21
				   -----
subst.c
	- change expand_word_internal to process rest of `tilde-word' as a
	  regular part of the word if tilde expansion leaves the tilde-word
	  unchanged.  This means that ~$USER expands to ~chet, which seems
	  more intuitive, and is effectively what bash-3.0 did

				   12/23
				   -----
subst.c
	- when making a local array variable in do_compound_assignment, make
	  sure that we don't use a variable of the same name from a previous
	  context

doc/bash.1
	- documented expansions for word and patterns in case statement

builtins/ulimit.def,doc/{bashref.texi,bash.1}
	- added new -e and -r (nice and rtprio) options to ulimit; documented
	  them

				   12/26
				   -----
variables.c
	- use `hmax' instead of `num' in sv_histsize to avoid integer overflow
	  problems with intmax_t

builtins/read.def
	- add unwind-protect to restore rl_attempted_completion_function in
	  case of a timeout

{bashline,variables}.c
	- move initialization of HISTSIZE from initialization path to
	  load_history, so it can be overridden by a value assigned in a
	  startup file

lib/readline/misc.c
	- add a missing `return r' so that rl_digit_loop returns a meaningful
	  value

lib/readline/{bind,callback,display,isearch,rltty,search,text,vi_mode}.c
	- minor cleanups to satisfy compiler warnings, mostly removing unused
	  variables

				   12/27
				   -----
support/Makefile.in
	- add LIBS_FOR_BUILD support; defaults to ${LIBS}

Makefile.in
	- add LIBS_FOR_BUILD with no default value; use when linking programs
	  using CC_FOR_BUILD (e.g., bashversion)

				   12/28
				   -----
lib/readline/bind.c
	- fix rl_translate_keyseq bad translation of \M-\C-x sequences

execute_cmd.c
	- in execute_arith_command, if the expression expands to more than one
	  word, make sure we join the words into a single string and pass the
	  entire thing to evalexp()

expr.c
	- new functions: _is_arithop(c), returns true if C is a valid single-
	  character arithmetic operator; _is_multiop(c), returns true if C is
	  a token corresponding to a valid multi-character arithmetic operator
	- if we encounter a character that isn't a valid arithmetic
	  operator, throw an error.  Try to be intelligent about what type of
	  error message to print

subst.c
	- new function, expand_arith_string, calls expand_string_if_necessary;
	  used where an arithmetic expression needs to be expanded

subst.h
	- new extern declaration for expand_arith_string

arrayfunc.c
	- in array_expand_index, call expand_arith_string to expand the
	  subscript in a fashion consistent with other arithmetic expressions

subst.c
	- fix parameter_brace_patsub so that we don't try to anchor the pattern
	  at the beginning or end of the string if we're doing global
	  replacement -- that combination doesn't doesn't make sense, and
	  the changed behavior is compatible with ksh93

doc/{bash.1,bashref.texi}
	- changed description of pattern substitution to match the new
	  semantics

tests/new-exp.tests
	- change tests to remove all ${pat//#rep} and ${pat//%rep}
	  expansions, since they don't mean the same thing anymore

				   12/29
				   -----
support/signames.c
	- new file, initialize_signames() function from old mksignames.c.  This
	  file builds the signal_names array

support/mksignames.c
	- strip out initialize_signames(), move to signames.c.  This file only
	  writes signames.h
	- set up to only write a stub signames.h if CROSS_COMPILING is defined,
	  with extern declaration for initialize_signames
	- if not cross compiling, #define initialize_signames to nothing

Makefile.in
	- mksignames is now linked from mksignames.o and buildsignames.o
	- add rules to build signames.o, assuming we're building it as part
	  of the shell (cross-compiling)

trap.c
	- call initialize_signames from initialize_traps

configure.in
	- set SIGNAMES_O to nothing (normal) or signames.o (cross-compiling),
	  substitute into Makefile
	- don't set SIGNAMES_H if cross-compiling any more

				   12/30
				   -----
command.h
	- new word flag: W_NOPROCSUB, inhibits process substitution on a word

subst.c
	- change expand_word_internal to suppress process substitution if the
	  word has the W_NOPROCSUB flag

shell.c
	- --wordexp turns on W_NOPROCSUB in addition to W_NOCOMSUB

subst.c
	- change string_list_dollar_at and string_list_dollar_star so that
	  MB_CUR_MAX is used to size an array only when using gcc, since gcc
	  can handle non-constant array sizes using a mechanism like alloca.
	  Other compilers, e.g. Sun's compiler, do not implement that
	  extension

				   12/31
				   -----
builtins/mkbuiltins.c
	- when cross-compiling, don't include <config.h>, since it's for the
	  target rather than the host system.  Instead, choose a reasonable
	  set of default #defines based on a minimal POSIX system

jobs.c
	- change find_process to handle a NULL return value from find_pipeline
	- return immediately from delete_job if jobs[index] is already NULL or
	  if it has a null pipeline associated with it
	- in delete_job, if find_last_proc returns NULL, don't try to call
	  bgp_delete

				 1/7/2006
				 --------
doc/bash.1
	- patch from Tim Waugh to replace some literal single quotes with
	  \(aq, the groff special character for it

jobs.c
	- in realloc_jobs_list, make sure to zero out slots after j_lastj
	  in the new list

				    1/9
				    ---
support/mksignames.c
	- make sure to include <signal.h> to get right value of NSIG from
	  (usually) <sys/signal.h>

				   1/10
				   ----
parse.y
	- when calling parse_matched_pair on a $(...) command substitution,
	  don't pass the P_DQUOTE flag so that single quotes don't get
	  stripped from $'...' inside the command substitution.  Bug report
	  and fix from Mike Stroyan <mike.stroyan@hp.com>

jobs.c
	- start maintaining true count of living children in js.c_living
	- call reset_current in realloc_jobs_list, since old values for current
	  and previous job are most likely incorrect
	- don't allocate a new list in realloc_jobs_list if the old size and
	  new size are the same; just compact the existing list
	- make sure realloc_jobs_list updates value of js.j_njobs
	- add some more itrace messages about non-null jobs after j_lastj in
	  jobs array

				   1/11
				   ----
bashjmp.h
	- new value for second argument to longjmp: SIGEXIT.  Reserved for
	  future use

				   1/12
				   ----
jobs.c
	- add logic to make_child to figure out when pids wrap around
	- turn second argument to delete_job into flags word, added flag to
	  prevent adding proc to bgpids list

				   1/13
				   ----
lib/readline/vi_mode.c
	- move code that moves forward a character out of rl_vi_append_mode
	  into a separate function, _rl_vi_append_forward
	- change _rl_vi_append_mode to save `a' as the last command, so it
	  can be redone properly
	- new function _rl_vi_backup, moves point back a character taking
	  multibyte locales into account
	- change rl_vi_redo to handle redoing an `a' command specially --
	  it should be redone like `i' but after moving forward a character
	- change rl_vi_redo to use _rl_vi_backup to move point backward
	  after redoing `i' or `a'

jobs.c
	- new function, delete_old_job (pid), checks whether or not PID is in
	  a job in the jobs list.  If so, and the job is dead, it just removes
	  the job from the list.  If so, and the job is not dead, it zeros
	  the pid in the appropriate PROCESS so pid aliasing doesn't occur
	- make_child calls delete_old_job to potentially remove an already-used
	  instance of the pid just forked from the jobs list if pids have
	  wrapped around.  Finally fixes the bug reported by Tim Waugh
	  <twaugh@redhat.com>

trap.c
	- new define, GETORIGSIG(sig), gets the original handling for SIG and
	  sets SIG_HARD_IGNORE if that handler is SIG_IGN
	- call GETORIGSIG from initialize_traps, get_original_signal, and
	  set_signal

jobs.c
	- in wait_for, if the original SIGINT handler is SIG_IGN, don't set
	  the handler to wait_sigint_handler.  This keeps scripts started in
	  the background (and ignoring SIGINT) from dying due to SIGINT while
	  they're waiting for a child to exit.  Bug reported by Ingemar
	  Nilsson <init@kth.se>

lib/readline/vi_mode.c
	- don't save text to buffer unless undo pointer points to a record of
	  type UNDO_INSERT; zero it out instead.  This fixes bug reported by
	  Craig Turner <craig@synect.com> with redoing `ctd[ESC]' (empty
	  insert after change to)

shell.c
	- change set_shell_name so invocations like "-/bin/bash" are marked as
	  login shells

doc/bash.1
	- add note about destroying functions with `unset -f' to the section
	  on shell functions

lib/readline/terminal.c
	- if readline hasn't been initialized (_rl_term_autowrap == -1, the
	  value it's now initialized with), call _rl_init_terminal_io from
	  _rl_set_screen_size before deciding whether or not to decrement
	  _rl_screenwidth.  Fixes bug from Mike Frysinger <vapier@gentoo.org>

				   1/14
				   ----
lib/readline/input.c
	- allow rl_set_keyboard_input_timeout to set the timeout to 0, for
	  applications that want to use select() like a poll without any
	  waiting

lib/readline/doc/rltech.texi
	- documented valid values for timeout in rl_set_keyboard_input_timeout

jobs.c
	- in stop_pipeline, don't have the parent shell call give_terminal_to
	  if subshell_environment contains SUBSHELL_ASYNC (no background
	  process should ever give the terminal to anything other than
	  shell_pgrp)
	- in make_child, don't give the terminal away if subshell_environment
	  contains SUBSHELL_ASYNC

				   1/15
				   ----
subst.c
	- in parameter_brace_expand, if extracting ${#varname}, only allow
	  `}' to end the expansion, since none of the other expansions are
	  valid.  Fixes Debian bug reported by Jan Nordhorlz <jckn@gmx.net>

				   1/17
				   ----
parse.y
	- in parse_matched_pair, protect all character tests with the MBTEST
	  macro
	- in parse_dparen, take out extra make_word after call to alloc_word_desc
	  (mem leak)

				   1/18
				   ----
parse.y
	- in parse_matched_pair, add P_ALLOWESC to flags passed to recursive
	  parse_matched_pair call when encountering a single or double quote
	  inside a ``-style command substitution

execute_cmd.c
	- add call to QUIT at beginning of execute_command_internal; better
	  responsiveness to SIGINT

				   1/21
				   ----
lib/readline/bind.c
	- change rl_invoking_keyseqs_in_map to honor the setting of
	  convert-meta when listing key bindings, since if convert-meta is off,
	  using '\M-' as the prefix for bindings in, for instance,
	  emacs-escape-keymap, is wrong.  This affects `bind -p' output
	- change rl_untranslate_keyseq to add '\e' instead of '\C-[' for
	  ESC

execute_cmd.c
	- add call to QUIT at end of execute_command

				   1/23
				   ----
lib/readline/display.c
	- changed two places in update_line where a check of whether the cursor
	  is before the last invisible character in the prompt string to
	  differentiate between the multibyte character case (where
	  _rl_last_c_pos is a physical cursor position) and the single-byte
	  case (where it is a buffer index).  This prevents many unnecessary
	  \r-redraw the line sequences.  Reported by Dan Jacobson.

				   1/24
				   ----
quit.h
	- wrap QUIT macro in do...while(0) like other compound statement
	  macros
	- CHECK_TERMSIG define (placeholder for now); future use will be to
	  handle any received signals that should  cause the shell to
	  terminate (e.g., SIGHUP)

{input,jobs,nojobs}.c
	- add calls to CHECK_TERMSIG where appropriate (reading input and
	  waiting for children)
	- include quit.h if necessary

				   1/25
				   ----
parse.y
	- undo change that makes `)' in a compound assignment delimit a token.
	  It messes up arithmetic expressions in assignments to `let', among
	  other things

sig.h,{jobs,nojobs,sig,trap}.c,builtins/trap.def
	- rename termination_unwind_protect to termsig_sighandler

sig.c
	- split termsig_sighandler into two functions: termsig_sighandler, which
	  runs as a signal handler and sets a flag noting that a terminating
	  signal was received, and termsig_handler, which runs when it is `safe'
	  to handle the signal and exit
	- new terminate_immediately variable, similar to interrupt_immediately
	- termsig_sighandler calls termsig_handler immediately if
	  terminate_immediately is non-zero

quit.h
	- change CHECK_TERMSIG macro to check terminating_signal and call
	  termsig_handler if it's non-zero
	- add same check of terminating_signal and call to termsig_handler to
	  QUIT macro

{jobs,nojobs}.c
	- change call to termsig_sighandler to call termsig_handler directly,
	  as was intended

parse.y,builtins/read.def
	- set terminate_immediately to non-zero value when reading interactive
	  input, as is done with interrupt_immediately

				   1/26
				   ----
doc/{bash.1,bashref.texi}
	- reworded the POSIX standard references to remove mention of POSIX.2
	  or 1003.2 -- it's all the 1003.1 standard now.  Recommended by
	  Arnold Robbins

				   1/27
				   ----
lib/readline/complete.c
	- move call to filename dequoting function into
	  rl_filename_completion_function; call only if directory completion
	  hook isn't set.  This means that directory-completion-hook now needs
	  to dequote the directory name.  We don't want to dequote the directory
	  name before calling the directory-completion-hook.  Bug reported by
	  Andrew Parker <andrewparker@bigfoot.com>

bashline.c
	- add necessary directory name dequoting to bash_directory_expansion
	  and bash_directory_completion_hook

lib/readline/doc/rltech.texi
	- add note to description of rl_directory_completion_hook that it
	  needs to dequote the directory name even if no other expansions are
	  performed

				   1/28
				   ----
braces.c
	- make sure that we skip over braces that don't start a valid matched
	  brace expansion construct in brace_expand -- there might be a valid
	  brace expansion after the unmatched `{' later in the string
	- brace_gobbler now checks that when looking for a `}' to end a brace
	  expansion word, there is an unquoted `,' or `..' that's not inside
	  another pair of braces.  Fixes the a{b{c,d}e}f problem reported by
	  Tim Waugh

builtins/declare.def
	- when not in posix mode, and operating on shell functions, typeset
	  and declare do not require their variable operands to be valid
	  shell identifiers.  The other `attribute' builtins work this way.
	  Fixes inconsistency reported by Mike Frysinger <vapier@gentoo.org>

{configure,config.h}.in
	- add test for setregid, define HAVE_SETREGID and HAVE_DECL_SETREGID
	  as appropriate
	- add test for eaccess, define HAVE_EACCESS if found

lib/sh/eaccess.c
	- new file, with sh_stat and sh_eaccess functions, moved from test.c
	- renamed old sh_eaccess as sh_stataccess, since it uses the stat(2)
	  information to determine file accessibility
	- new function, sh_euidaccess, to call when uid != euid or gid != egid;
	  temporarily swaps uid/euid and gid/egid around call to access
	- rewrote sh_eaccess to call eaccess, access, sh_euidaccess or
	  sh_stataccess as appropriate.  access(2) will take into account
	  things like ACLs, read-only file systems, file flags, and so on.

lib/sh/Makefile.in,Makefile.in
	- add necessary entries for eaccess.[co]

test.c
	- change calls to test_stat to call sh_stat

{test,general}.c
	- change calls to test_eaccess to call sh_eaccess

externs.h
	- new extern declaration for sh_eaccess

test.[ch]
	- remove test_stat and test_eaccess

				   1/29
				   ----
braces.c
	- make change from 1/28 dependant on CSH_BRACE_COMPAT not being
	  defined (since old bash behavior is what csh does, defining
	  CSH_BRACE_COMPAT will produce old bash behavior)

				   1/30
				   ----
bashline.c
	- last argument of bash_default_completion is now a flags word:
	  DEFCOMP_CMDPOS (in command position) is only current value
	- attempt_shell_completion now computes flags before calling
	  bash_default_completion
	- if no_empty_command_completion is set, bash does not attempt command
	  word completion even if not at the beginning of the line, as long
	  as the word to be completed is empty and start == end (catches
	  beginning of line and all whitespace preceding point)

				    2/4
				    ---
lib/readline/display.c
	- change _rl_make_prompt_for_search to use rl_prompt and append the
	  search character to it, so the call to expand_prompt in rl_message
	  will process the non-printing characters correctly.  Bug reported
	  by Mike Stroyan <mike.stroyan@hp.com>

				    2/5
				    ---
lib/readline/display.c
	- fix off-by-one error when comparing against PROMPT_ENDING_INDEX,
	  which caused a prompt with invisible characters to be redrawn one
	  extra time in a multibyte locale.  Change from <= to < fixes
	  multibyte locale, but I added 1 to single-byte definition of
	  PROMPT_ENDING_INDEX (worth checking) to compensate.  Bug reported
	  by Egmont Koblinger <egmont@uhulinux.hu>

				    2/8
				    ---
lib/readline/terminal.c
	- call _emx_get_screensize with wr, wc like ioctl code for consistency
	- new function, _win_get_screensize, gets screen dimensions using
	  standard Windows API for mingw32 (code from Denis Pilat)
	- call _win_get_screensize from _rl_get_screen_size on mingw32

lib/readline/rlconf.h
	- define SYS_INPUTRC (/etc/inputrc) as system-wide default inputrc
	  filename

support/shobj-conf
	- changes to make loadable builtins work on MacOS X 10.[34]

builtins/pushd.def
	- changes to make it work as a loadable builtin compiled with gcc4

				    2/9
				    ---
lib/readline/bind.c
	- add SYS_INPUTRC as last-ditch default (if DEFAULT_INPUTRC does not
	  exist or can't be read) in rl_read_init_file

lib/readline/doc/rluser.texi
	- add description of /etc/inputrc as ultimate default startup file

				   2/10
				   ----
lib/readline/bind.c
	- fix problem with rl_function_of_keyseq that returns a non-keymap
	  bound to a portion of the passed key sequence without processing
	  the entire thing.  We can bind maps with existing non-map
	  functions using the ANYOTHERKEY binding code.

variables.c
	- shells running in posix mode do not set $HOME, as POSIX apparently
	  requires

				   2/15
				   ----
braces.c
	- mkseq() now takes the increment as an argument; changed callers

				   2/16
				   ----
builtins/hash.def
	- print `hash table empty' message to stdout instead of stderr

				   2/17
				   ----
lib/readline/readline.c
	- when resetting rl_prompt in rl_set_prompt, make sure rl_display_prompt
	  is set when the function returns

				   2/18
				   ----
lib/readline/display.c
	- further fixes to _rl_make_prompt_for_search from Eric Blake to deal
	  with multiple calls to expand_prompt

				   2/21
				   ----
builtins/hash.def
	- don't print `hash table empty' message in posix mode

				   2/27
				   ----
lib/glob/sm_loop.c
	- change extmatch() to turn off FNM_PERIOD in flags passed to recursive
	  calls to gmatch() when calling it with a substring after the start
	  of the string it receives.  Changed `+', `*', `?, `@', and `!' cases
	  to do the right thing.  Fixes bug reported by Benoit Vila
	  <bvila@free.fr>

braces.c
	- add QUIT; statements to mkseq to make large sequence generation
	  interruptible

				   2/28
				   ----
lib/glob/glob.c
	- initialize nalloca in glob_vector

				    3/1
				    ---
lib/glob/glob.c
	- in glob_vector, when freeing up the linked list after some error,
	  make sure to set `tmplink' to 0 if `firstlink' is set to 0, else we
	  get multiple-free errors

				    3/5
				    ---
trap.c
	- inheritance of the DEBUG, RETURN, and ERR traps is now dependent
	  only on the `functrace' and `errtrace' shell options, as the
	  documentation says, rather than on whether or not the shell is in
	  debugging mode.  Reported by Philip Susi <psusi@cfl.rr.com>

parse.y
	- in parse_matched_pair, don't recursively parse ${...} or other
	  ${...} constructs inside ``
	- in parse_matched_pair, remove special code that recursively parses
	  quoted strings inside `` constructs.  For Bourne shell compatibility

				    3/6
				    ---
builtins/pushd.def
	- let get_directory_stack take take an `int flags' argument and convert
	  $HOME to ~ if flags&1 is non-zero

builtins/common.h
	- change extern declaration for get_directory_stack

variables.c
	- call get_directory_stack with an arg of 0 to inhibit converting
	  $HOME to  ~ in the result.  Fixes cd ${DIRSTACK[1]} problem
	  reported by Len Lattanzi <llattanzi@apple.com> (cd fails because
	  the tildes won't be expanded after variable expansion)

jobs.c
	- changed hangup_all_jobs slightly so stopped jobs marked J_NOHUP
	  won't get a SIGCONT

general.c
	- changed check_binary_file() to check for a NUL byte instead of a
	  non-printable character.  Might at some point want to check
	  entire (possibly multibyte) characters instead of just bytes.  Hint
	  from ksh via David Korn

				    3/7
				    ---
builtins/reserved.def
	- changed runs of spaces to tabs in variables help text to make
	  indentation better when displayed

builtins/mkbuiltins.c
	- changes to avoid the annoying extra space that keeps gettext from
	  being passed an empty string

				    3/9
				    ---
lib/glob/glob.c
	- make sure globbing is interrupted if the shell receives a terminating
	  signal

				   3/14
				   ----
lib/readline/search.c
	- call rl_message with format argument of "%" in _rl_nsearch_init
	  to avoid `%' characters in the prompt string from being interpreted
	  as format specifiers to vsnprintf/vsprintf

				   3/19
				   ----
parse.y, eval.c, input.h
	- change execute_prompt_command to execute_variable_command; takes the
	  variable name as a new second argument

				   3/25
				   ----
bashline.c
	- command_word_completion_function keeps track of when it's searching
	  $PATH and doesn't return directory names as matches in that case.
	  Problem reported by Pascal Terjan <pterjan@mandriva.com>
	- command_word_completion_function returns what it's passed as a
	  possible match if it's the name of a directory in the current
	  directory (only non-absolute pathnames are so tested).

				   3/27
				   ----
subst.c
	- expand_arith_string takes a new argument: quoted.  Either 0 (outside
	  subst.c) or Q_DOUBLE_QUOTES (substitution functions); changed callers

subst.h
	- changed extern declaration for expand_arith_string

arrayfunc.c
	- changed call to expand_arith_string in array_expand_index

				   3/31
				   ----
lib/readline/histfile.c
	- change read_history_range to allow windows-like \r\n line endings

execute_cmd.c
	- add new variable, line_number_for_err_trap, currently set but not
	  used

				    4/2
				    ---
lib/sh/strtrans.c
	- add code to echo -e and echo with xpg_echo enabled to require
	  a leading 0 to specify octal constants

				    4/3
				    ---
subst.c
	- slight change to wcsdup() replacement: use memcpy instead of wcscpy

parse.y
	- before turning on W_COMPASSIGN, make sure the final character in the
	  token is a `(' (avoids problems with things like a=(4*3)/2)

				    4/4
				    ---
lib/sh/snprintf.c
	- in number() and lnumber(), turn off PF_ZEROPAD if explicit precision
	  supplied in format
	- change number() and lnumber() to correctly implement zero-padding
	  specified by a non-zero `.precision' part of the format

subst.c
	- new flag for extract_delimited_string: EX_COMMAND.  For $(...), so
	  we can do things like skip over delimiters in comments.  Added to
	  appropriate callers
	- changes to extract_delimited_string to skip over shell comments when
	  extracting a command for $(...) (EX_COMMAND is contained in the
	  flags argument)

				    4/5
				    ---
subst.c
	- first argument to skip_single_quoted is now a const char *
	- new function, chk_arithsub, checks for valid arithmetic expressions
	  by balancing parentheses.  Fix based on a patch from Len Lattanzi

				    4/6
				    ---
{configure,config.h}.in
	- add separate test for isnan in libc, instead of piggybacking on
	  isinf-in-libc test

lib/sh/snprintf.c
	- separate the isnan replacement function so it's guarded by its own
	  HAVE_ISNAN_IN_LIBC define

lib/sh/wcsdup.c
	- new file, contains replacement wcsdup library function from subst.c
	  with change back to using wcscpy

Makefile.in,lib/sh/Makefile.in
	- make sure wcsdup.c is compiled and linked in

subst.c
	- wcsdup now found in libsh; removed static definition

				   4/10
				   ----
lib/readline/callback.c
	- loop over body of rl_callback_read_char as long as there is additional
	  input rather than just calling readline_internal_char, which does
	  not handle multi-character key sequences or escape-prefixed chars

lib/readline/macro.c
	- make sure we turn off RL_STATE_MACROINPUT when the macro stack is
	  empty if we are reading additional input with RL_STATE_MOREINPUT

support/shobj-conf
	- Mac OS X no longer likes the `-bundle' option to gcc when creating a
	  dynamic shared library

				   4/11
				   ----
lib/tilde/tilde.c
	- don't try to dereference user_entry if HAVE_GETPWENT isn't defined

lib/readline/input.c
	- make sure chars_avail is not used without being assigned a value in
	  rl_gather_tyi
	- use _kbhit() to check for available input on Windows consoles, in
	  rl_gather_tyi and _rl_input_available

				   4/21
				   ----
lib/readline/display.c
	- calculate (in expand_prompt) and keep track of length of local_prompt
	  in local_prompt_len; use where appropriate
	- when using o_pos to check whether or not we need to adjust
	  _rl_last_c_pos after calling update_line, assume that it's correct
	  (a buffer index in non-multibyte locales and a cursor position in
	  multibyte locales) and adjust with wrap_offset as appropriate
	- in update_line, set cpos_adjusted to 1 after calling
	  _rl_move_cursor_relative to move to the end of the displayed prompt
	  string
	- in _rl_move_cursor_relative, check that the multibyte display
	  position is after the last invisible character in the prompt string
	  before offsetting it by the number of invisible characters in the
	  prompt (woff)

				   4/26
				   ----
lib/readline/doc/{rluser.texi,readline.3}
	- make sure to note that key bindings don't allow any whitespace
	  between the key name or sequence to be bound and the colon

				   4/28
				   ----
lib/readline/display.c
	- in update_line, make sure we compare _rl_last_c_pos as strictly less
	  than PROMPT_ENDING_INDEX, since it's 0-based, to avoid multiple
	  prompt redraws

				    5/4
				    ---
parse.y
	- in decode_prompt_string, only prefix the expansion of \[ or \]
	  with CTLESC if the corresponding readline escape character is
	  CTLESC (coincidentally the same as \[) or CTLNUL.  Bug report sent
	  by Mike Frysinger <vapier@gentoo.org> prompted the discovery

aclocal.m4
	- slight change to test for /dev/fd to compensate for a linux
	  failing; suggested by Mike Frysinger <vapier@gentoo.org>

				    5/9
				    ---
arrayfunc.c
	- broke assign_array_var_from_string into two functions:
	  expand_compound_array_assignment and assign_compound_array_list;
	  assign_array_var_from_string just calls those functions now

arrayfunc.h
	- new extern declarations for expand_compound_array_assignment and
	  assign_compound_array_list

subst.c
	- in do_compound_assignment, call expand_compound_array_assignment
	  before creating the local variable so a previous inherited
	  value can be used when expanding the rhs of the compound assignment
	  statement

				   5/11
				   ----
doc/{bash.1,bashref.texi}
	- clarifed `trap' description to make it clear that trapped signals
	  that are not set to SIG_IGN are reset when a subshell is created

				   5/18
				   ----
locale.c
	- change reset_locale_vars to call setlocale (LC_ALL, "") if LANG
	  is unset or NULL
	- if LANG is unset or NULL, reset the export environment before
	  calling setlocale in reset_locale_vars, and trust that it will
	  change the environment setlocale() inspects

				   5/21
				   ----
lib/readline/history.c
	- new function, HIST_ENTRY *alloc_history_entry (char *string, char *ts);
	  creates a new history entry with text STRING and timestamp TS (both
	  of which may be NULL)
	- new function, HIST_ENTRY *copy_history_entry (HIST_ENTRY *hist),
	  which copies the line and timestamp entries to new memory but just
	  copies the data member, since that's an opaque pointer
	- new function, void replace_history_data (int which, histdata_t *old, histdata_t *new)
	  which replaces the `data' member of specified history entries with
	  NEW, as long as it is OLD.  WHICH says which history entries to
  	  modify
	- add calls to replace_history_data in rl_free_undo_list and
	  rl_do_undo

lib/readline/undo.c
	- new function, alloc_undo_entry (enum undo_code what, int start, int end, char *text)
	  takes care of allocating and populating a struct for an individual
	  undo list entry
	- new function: _rl_copy_undo_entry(UNDO_LIST *entry)
	- new function: _rl_copy_undo_list(UNDO_LIST *head)

lib/readline/rlprivate.h
	- new extern declarations for _rl_copy_undo_{entry,list}

execute_cmd.c
	- change execute_cond_node so that quoting the rhs of the =~
	  operator forces string matching, like the == and != operators

				   5/23
				   ----
redir.c
	- add_undo_redirect now takes as an additional argument the type of
	  redirection we're trying to undo
	- don't add a "preservation" redirection for fds > SHELL_FD_BASE if
	  the redirection is closing the fd

				   5/24
				   ----
subst.c
	- make sure that parameter_brace_substring leaves this_command_name
	  set to either NULL or its previous value after setting it so that
	  arithmetic evaluation errors while expanding substring values
	  contain meaningful information

				    6/9
				    ---
execute_cmd.c
	- make sure that SUBSHELL_ASYNC and SUBSHELL_PIPE are set as flag bits
	  in subshell_environment, rather than setting only a single value
	- change execute_subshell_builtin_or_function to give the `return'
	  builtin a place to longjmp to when executed in a subshell or pipeline
	  (mostly as the last command in a pipeline).  Bug reported by
	  Oleg Verych <olecom@gmail.com>
	- in execute_simple_command, make sure to call execute_disk_command
	  with the_printed_command_except_trap to keep DEBUG trap command
	  strings from overwriting the command strings associated with jobs
	  and printed in job control messages.  Bug reported by Daniel Kahn
	  Gillmor <dkg-debian.org@fifthhorseman.net>

[bash-3.2-alpha frozen]

				   6/22
				   ----
syntax.h
	- add new CBLANK (for [:blank:] class) flag value for syntax table and
	  shellblank(c) character test macro

mksyntax.c
	- add support for setting CBLANK flag in the syntax table depending on
	  whether or not isblank(x) returns true for character x

locale.c
	- change locale_setblanks to set or unset CBLANK flag for each
	  character when locale changes

parse.y
	- change call to whitespace(c) in lexical analyzer (read_token()) to
	  call shellblank(c) instead, so locale-specific blank characters are
	  treated as white space.  Fixes bug reported by Serge van deb Boom
	  <svdb+bug-bash@stack.nl>

print_cmd.c
	- when printing redirections, add a space between <, >, and <> and the
	  following word, to avoid conflicts with process substitution.  Bug
	  reported by Ittay Dror <ittyad@qlusters.com>

				   6/26
				   ----
configure.in
	- set CROSS_COMPILE to the empty string by default, so we don't inherit
	  a random value from the environment.   Bug reported by
	  Lee Revell <rlrevell@joe-job.com>

				   6/29
				   ----
lib/glob/xmbsrtowcs.c
	- make sure destp is non-null before assigning a 0 to *destp in
	  xdupmbstowcs.  Fix from Louiwa Salem <loulwas@us.ibm.com>

execute_cmd.c
	- fix execute_in_subshell to make sure asynchronous isn't set to 0
	  before subshell_environment is set appropriately and
	  setup_async_signals is run.  Based on report by Louiwa Salem
	  <loulwas@us.ibm.com>

lib/readline/bind.c
	- in rl_generic_bind(), make sure that the keys array is freed before
	  an error return.  Fix from Louiwa Salem <loulwas@us.ibm.com>

				    7/1
				    ---
builtins/read.def
	- make sure all editing code is protected with #ifdef READLINE, esp.
	  unwind-protect that restores the default completion function

lib/readline/display.c
	- make sure to set local_prompt_len in rl_message() [in bash-3.2-alpha]

				    7/5
				    ---
builtins/printf.def
	- add more of echo's write error handling to printf.  Suggested by
	  martin.wilck@fujitsu-siemens.com

				    7/7
				    ---
lib/readline/display.c
	- save and restore local_prompt_len in rl_{save,restore}_prompt
	  [in bash-3.2-alpha]

				    7/8
				    ---
[bash-3.2-alpha released]

				    7/9
				    ---
lib/readline/display.c
	- make sure that _rl_move_cursor_relative sets cpos_adjusted when it
	  offsets `dpos' by wrap_offset in a multi-byte locale.  Bug reported
	  by Andreas Schwab and Egmont Koblinger

subst.c
	- make sure that the call to mbstowcs in string_extract_verbatim is
	  passed a string with enough space for the closing NUL.  Reported
	  by Andreas Schwab

				   7/18
				   ----
lib/readline/{display,terminal}.c
	- remove #ifdefs for HACK_TERMCAP_MOTION so we can use
	  _rl_term_forward_char in the redisplay code unconditionally

lib/readline/rlprivate.h
	- new extern declaration for _rl_term_forward_char

lib/readline/display.c
	- in _rl_move_cursor_relative, use `dpos' instead of `new' when
	  deciding whether or not a CR is faster than moving the cursor from
	  its current position
	- in _rl_move_cursor_relative, we can use _rl_term_forward_char to
	  move the cursor forward in a multibyte locale, if it's available.
	  Since that function doesn't have a handle on where the cursor is in
	  the display buffer, it has to output a cr and print all the data.
	  Fixes rest of problem reported by Egmont Koblinger
	- change variable denoting the position of the cursor in the line buffer
	  from c_pos (variable local to rl_redisplay) to cpos_buffer_position
	  (variable local to file) for future use by other functions

				   7/25
				   ----
lib/malloc/{stats,table}.h
	- include <string.h> for prototypes for memset, strlen

lib/termcap/{termcap,tparam}.c
	- include <string.h> and provide macro replacement for bcopy if
	  necessary

				   7/27
				   ----
lib/readline/histexpand.c
	- add support for `<<<' here-string redirection operator to
	  history_tokenize_word.  Bug reported by agriffis@gentoo.org

externs.h	
	- don't add prototype for strerror() if HAVE_STRERROR defined

				   7/29
				   ----
subst.c
	- in list_string, use `string' instead of `s' -- s is not initialized

				    8/9
				    ---
subst.c
	- fix parameter_brace_expand to set W_HASQUOTEDNULL in the WORD_DESC it
	  returns if the result of parameter_brace_substring is a quoted null
	  ("\177").  Fixes bug reported by Igor Peshansky <pechtcha@cs.nyu.edu>

				   8/16
				   ----
lib/readline/readline.h
	- new #define, READERR, intended to be used to denote read/input errors

lib/readline/input.c
	- in rl_getc, if read() returns an error other than EINTR (after the
	  EWOULDBLOCK/EAGAIN cases are handled), return READERR rather than
	  converting return value to EOF if readline is reading a top-level
	  command (RL_STATE_READCMD)

lib/readline/readline.c
	- if rl_read_key returns READERR to readline_internal_char[loop],
	  abort as if it had read EOF on an empty line, without any conversion
	  to newline, which would cause a partial line to be executed.  This
	  fixes the bug reported by Mathieu Bonnet <mathieu.bonnet@nalkym.org>

aclocal.m4
	- when testing for validity of /dev/fd/3, use /dev/null instead of
	  standard input, since the standard input fails with linux and `su'.
	  Bug reported by Greg Shafer <gschafer@zip.com.au>

				   8/17
				   ----
Makefile.in
	- switch the TAGS and tags targets so TAGS is the output of `etags' and
	  tags is the output of `ctags'.  Suggested by Masatake YAMATO

				   8/25
				   ----
execute_cmd.c
	- change code to match documentation: set BASH_COMMAND (which takes its
	  value from the_printed_command_except_trap) only when not running a
	  trap.  Rocky says the debugger is ok with this, and this is what his
	  original diffs did

				   8/29
				   ----
variables.c
	- change set_if_not to create shell_variables if it is NULL, since
	  -o invocation options can cause variables to be set before the
	  environment is scanned

[bash-3.2-beta frozen]

				    9/5
				    ---
[bash-3.2-beta released]

				    9/8
				    ---
variables.c
	- change dispose_used_env_vars to call maybe_make_export_env
	  immediately if we're disposing a temporary environment, since
	  `environ' points to the export environment and getenv() will use
	  that on systems that don't allow getenv() to be replaced.  This
	  could cause the temporary environment to affect the shell.  Bug
	  reported by Vasco Pedro <vp@di.uevora.pt>

builtins/echo.def,doc/{bash.1,bashref.texi}
	- clarify that `echo -e' and echo when the `xpg_echo' shell option is
	  enabled require the \0 to precede any octal constant to be expanded.
	  Reported by Vasco Pedro <vp@di.uevora.pt>

				   9/12
				   ----
builtins/printf.def
	- make sure `%q' format specifier outputs '' for empty string arguments
	  Bug reported by Egmont Koblinger <egmont@uhulinux.hu>

make_cmd.c
	- change make_here_document to echo lines in here-doc if set -v has
	  been executed.  Reported by Eduardo Ochs <eduardoochs@gmail.com>

aclocal.m4
	- change BASH_CHECK_MULTIBYTE:
		o replace check for wctomb with check for wcrtomb
		o add checks for wcscoll, iswctype, iswupper, iswlower,
		  towupper, towlower
		o add call to AC_FUNC_MBRTOWC to check for mbrtowc and mbstate_t
		  define HAVE_MBSTATE_T manually
		o add checks for wchar_t, wctype_t, wint_t

config.h.in
	- add defines for wcscoll, iswctype, iswupper, iswlower, towupper,
	  towlower functions
	- replace define for wctomb with one for wcrtomb
	- add defines for wchar_t, wint_t, wctype_t types

config-bot.h, lib/readline/rlmbutil.h
	- add check for HAVE_LOCALE_H before defining HANDLE_MULTIBYTE
	- add checks for: ISWCTYPE, ISWLOWER, ISWUPPER, TOWLOWER, TOWUPPER
	- add checks for: WCTYPE_T, WCHAR_T, WCTYPE_T

				   9/13
				   ----
lib/readline/display.c
	- when displaying prompts longer than the screenwidth in rl_redisplay,
	  and looking for the index of the last character whose buffer index
	  is <= the screen width to set up the inv_lbreaks array, make sure to
	  catch the case where the index == the screen width (an off-by-one
	  error occurs otherwise with prompts one character longer than the
	  screen width).  Bug reported by Alexey Toptygin <alexeyt@freeshell.org>

configure.in
	- change DEBUGGER_START_FILE to start with ${ac_default_prefix}/share,
	  like bashdb installs itself.  Reported by Nick Brown
	  <nickbroon@blueyonder.co.uk>

				   9/14
				   ----
lib/readline/display.c
	- make multibyte code that computes the buffer indices of line breaks
	  for a multi-line prompt dependent on MB_CUR_MAX, so we don't take
	  the function call hit unless we're in a locale that can have
	  multibyte characters

				   9/19
				   ----
subst.c
	- make dequote_list extern so other parts of the shell can use it

subst.h
	- extern declaration for dequote_list

builtins/read.def
	- call dequote_list before assigning words read to array variable if
	  we saw an escape character.  Old code left spurious CTLESCs in the
	  string after processing backslashes.  Bug reported by Daniel Dawson
	  <ddawson@icehouse.net>

				   9/21
				   ----
[bash-3.2 frozen]

				   10/9
				   ----
support/shobj-coonf
	- change -fpic to -fPIC for FreeBSD systems (needed for SPARC at least)

				   10/11
				   -----
[bash-3.2 released]

				   10/12
				   -----
parse.y
	- change parse_matched_pair to make sure `` command substitution does
	  not check for shell comments while parsing.  Bug reported against
	  bash-3.2 by Greg Schaefer <gschafer@zip.com.au>

				   10/14
				   -----
parse.y
	- add new parser_state flag: PST_REGEXP; means we are parsing a
	  regular expression following the =~ conditional operator
	- cond_node sets PST_REGEXP after reading the `=~' operator	
	- change read_token to call read_token_word immediately if the
	  PST_REGEXP bit is set in parser_state
	- change read_token_word to skip over `(' and `|' if PST_REGEXP is
	  set, since those characters are legitimate regexp chars (but still
	  parse matched pairs of parens)

				   10/16
				   -----
builtins/ulimit.def
	- add -e and -r to $SHORT_DOC usage string

po/ru.po
	- fix encoding; Russian text in the file is actually encoded in KOI8-R

				   10/23
				   -----
shell.c
	- make sure that the call to move_to_high_fd in open_shell_script
	  passes 1 for the  `check_new' parameter so open high file descriptors
	  don't get closed and reused.  Bug reported by Mike Stroyan
	  <mike.stroyan@hp.com>

doc/bashref.texi
	- fixes for typos and misspellings sent in by Brian Gough

				   10/24
				   -----
support/shobj-conf
	- make netbsd shared library creation like openbsd's until I hear
	  differently (called using `gcc -shared')

				   10/26
				   -----
subst.c
	- fix bug in parameter_brace_patsub so if the first character of the
	  expanded pattern is a `/', it is not taken as a global replacement
	  specifier.  Bug reported on forums.nekochan.net 

				   10/27
				   -----
builtins/printf.def
	- if we need an extern declaration for asprintf, make sure we include
	  stdarg.h or varargs.h, whichever is appropriate
	- if we do not have asprintf, add an extern declaration using
	  stdarg format.  This fixes the bugs with %G on IRIX reported by
	  Matthew Woehlke <mwoehlke@tibco.com> and Stuart Shelton
	  <srcshelton@gmail.com>


lib/sh/snprintf.c
	- add note to not call log_10 with 0 argument -- we don't want to do
	  what real log10 does (-infinity/raise divide-by-zero exception)
	- make sure numtoa (used by dtoa) takes the precision into account
	  when computing the fractional part with an argument of `0.0'
	- make sure `g' and `G' formats don't print radix char if there are
	  no characters to be printed after it (change to floating())
	- change callers of log_10 (exponent, 'g' and 'G' cases in
	  vsnprintf_internal) to not call it with 0 for argument.  This fixes
	  the hang reported on IRIX by Matthew Woehlke <mwoehlke@tibco.com>
	  and Stuart Shelton <mwoehlke@tibco.com>

				   10/28
				   -----
builtins/{caller,pushd}.def
	- changed longdoc strings in loadable builtin section to be single
	  strings, as put in the build directory builtins.c file, to aid
	  translators

				   11/1
				   ----
execute_cmd.c
	- reset subshell_environment to 0 after make_child() call in
	  execute_null_command.  Fix provided by Roy Marples
	  <uberlord@gentoo.org>

				   11/7
				   ----
lib/tilde/tilde.c
lib/readline/{util,undo,callback,input,isearch,kill}.c
	- make sure that memory allocated with xmalloc is freed with xfree

				   11/9
				   ----
lib/readline/display.c
	- make sure that _rl_redisplay_after_sigwinch clears the last displayed
	  line instead of the current line (instead of assuming that the
	  cursor is on the last line).  Fixes bug reported by Egmont
	  Koblinger <egmont@uhulinux.hu>

				   11/10
				   -----
lib/readline/display.c
	- make sure that _rl_col_width is never called with MB_CUR_MAX == 1,
	  since it doesn't count invisible characters and they are not
	  compensated for.  Added a warning in _rl_col_width if called when
	  MB_CUR_MAX == 1.  Bug reported and solution suggested by Eric
	  Blake <ebb9@byu.net>

				   11/11
				   -----
lib/readline/display.c
	- make sure _rl_wrapped_line is initialized to inv_lbsize int chars.
	  inv_lbsize and vis_lbsize are the same at that point, but it makes
	  the intent clearer.  Fix from jan.kratochvil@redhat.com.
	- in rl_redisplay, make sure we call memset on _rl_wrapped_line with
	  its full initialized size: inv_lbsize*sizeof(int).  Fix from
	  jan.kratochvil@redhat.com.
	- wrap the invisible and visible line variables and _rl_wrapped_line
	  into line_state structures, which can be swapped more efficiently.
	  Have to watch the wrapped_line field, since there's now one for
	  each struct.  Changes from jan.kratochvil@redhat.com.

lib/readline/complete.c
	- in stat_char, check for `//server' on cygwin and return `/', since
	  it will always behave as a directory.  Fix from Eric Blake

lib/readline/histfile.c
	- Cygwin's mmap() works in recent versions, so don't #undef HAVE_MMAP.
	  Recommendation from Eric Blake

lib/readline/rlwinsize.h
	- make sure tcflow() is defined on SCO Unix.  Fix from William Bader

aclocal.m4
	- add check for localeconv to AM_INTL_SUBDIR macro

config.h.in
	- add HAVE_LOCALECONV

lib/sh/snprintf.c
	- add check for HAVE_LOCALECONV for GETLOCALEDATA macro

general.[ch]
	- first argument to legal_number is now `const char *'

				   11/14
				   -----
lib/readline/{readline,rlprivate}.h
	- move rl_display_prompt declaration from rlprivate.h to readline.h

lib/readline/util.h
	- new function: rl_free(void *mem), for use by users of readline dlls
	  on Windows

lib/readline/readline.h
	- new extern declaration for rl_free

lib/readline/doc/rltech.texi
	- document rl_free and rl_display_prompt for use by application writers

				   11/15
				   -----
aclocal.m4
	- change tests for /dev/fd and /dev/stdin to use constructs of the form
	  (exec test ... ) instead of test ... to avoid bash's /dev/fd and
	  /dev/stdin emulation

				   11/16
				   -----
jobs.c
	- in delete_job, reset_current was being called before the job slot
	  was cleared -- moved after job_slots[job] was set to NULL.  Fixes
	  bug reported by Dan Jacobson <jidanni@jidanni.org>

				   11/19
				   -----
findcmd.c
	- when the checkhash option is set, fix the check for the hashed
	  pathname being an existing executable file.  Old code required a
	  hash table deletion and re-addition.  Bug reported by Linda
	  Walsh <bash@tlinx.org>

				   11/21
				   -----
subst.c
	- in pos_params, handle case of `start' == 0 by making the list of
	  positional parameters begin with $0
	- in parameter_brace_substring, increment `len' if start == 0, sicne
	  we will be adding $0 to the beginning of the list when we process it

doc/{bash.1,bashref.texi}
	- document new behavior of `0' offset when using substring expansion
	  with the positional parameters

support/shobj-conf
	- changes to shared object creation for loadable builtins on Mac OS X
	  10.4 to use libtool instead of ld by specifying -dynamiclib
	  argument and changing options to be appropriate for libtool.  This
	  winds up creating a dynamic shared library instead of an executable

				   11/24
				   -----
{jobs,nojobs}.c
	 - don't set last_asynchronous_pid to the child's pid in the child
	   for asynchronous jobs (for compatibility -- all other posix shells
	   seem to do it this way).  This means that (echo $! )& echo $! should
	   display two different pids.  Fix from discussion on the
	   austin-group-l list

builtins/mkbuiltins.c
	- change builtins.c file generation so short doc strings are marked for
	  gettext and available for subsequent translation.  Suggestion by
	  Benno Schulenberg <bensberg@justemail.net>

builtins/{bind,cd,hash,inlib,printf,pushd,test,times,ulimit}.def
lib/malloc/malloc.c
{shell,subst}.c
	- fix a few strings that were not marked as translatable.  Fix from
	  Benno Schulenberg <bensberg@justemail.net>

lib/readline/misc.c
	- new function, _rl_revert_all_lines(void).  Goes through history,
	  reverting all entries to their initial state by undoing any undo
	  lists.

lib/readline/rlprivate.h
	- extern declaration for _rl_revert_all_lines

rldefs.h
	- add #undef HAVE_STRCOLL if STRCOLL_BROKEN is defined, prep to move
	  from config.h.in.  Problem reported by Valerly Ushakov
	  <uwe@ptc.spbu.ru>

				   11/25
				   -----
lib/readline/readline.c
	- call _rl_revert_all_lines from readline_internal_teardown if the
	  variable _rl_revert_all_at_newline is non-zero
	- declare _rl_revert_all_lines initially 0

				   11/27
				   -----
doc/{bash.1,bashref.texi}
	- make sure to be explicit that `typeset +r' cannot remove the readonly
	  attribute from a variable

				   11/28
				   -----
lib/sh/zmapfd.c
	- new file, implements zmapfd(), which takes a file and returns its
	  contents in a string

externs.h
	- extern declaration for zmapfd

				   11/29
				   -----
builtins/evalfile.c
	- in _evalfile, use zmapfd to read the contents of the file into a
	  string, rather than using the size reported by stat and reading that
	  many characters, if the file is not a regular file (for things like
	  named pipes, stat reports the size as 0)

				   12/3
				   ----
lib/sh/snprintf.c
	- make sure number() sets the FL_UNSIGNED flag for %x and %X, so
	  fmtulong treats them as unsigned numbers.  Fixes bug reported by
	  James Botte <James.M.Botte@lowes.com>

				   12/13
				   -----
lib/readline/util.c
	- new function, _rl_ttymsg, for internal warning messages -- does
	  redisplay after printing message
	- new function, _rl_errmsg, for internal warning/error messages --
	  does not do redisplay after printing message

lib/readline/rlprivate.h
	- new extern declaration for _rl_ttymsg, _rl_errmsg

lib/readline/{bind,callback,complete,display,rltty}.c
	- use _rl_ttymsg/_rl_errmsg instead of direct writes to stderr

lib/sh/tmpfile.c
	- in get_tmpdir(), make sure that $TMPDIR names a writable directory;
	  otherwise skip it.  This catches names longer than PATH_MAX, but in
	  case it doesn't test that the length does not exceed PATH_MAX.  Fixes
	  heap overrun bug reported by Eric Blake <ebb9@byu.net>

				   12/16
				   -----
builtin/{set,declare,shopt,trap,wait,bind,complete,enable,fc,history,read,setattr}.def
doc/{bash.1,bashref.texi}
	- improvements and clarifications to the help text associated with
	  several builtins, in some cases bringing them into line with the
	  man page text.  From Benno Schulenberg <bensberg@justemail.net>

doc/{bash.1,bashref.texi}
	- add `E' and `T' to the synopsis of the set builtin.
	  From Benno Schulenberg <bensberg@justemail.net>

builtins/{break,exit,fg_bg,hash,jobs,type,ulimit}.def
builtins/{common,evalfile}.c
{error,expr,jobs,mksyntax,nojobs,shell,subst,version,siglist}.c
	- add gettextizing marks to untranslated strings
	  From Benno Schulenberg <bensberg@justemail.net>

				   12/19
				   -----
builtins/common.c
	- change display_signal_list (used by `trap -l' and `kill -l') to use
	  five columns instead of 4 to display signal names

builtins/help.def
	- use the true terminal width instead of assuming 80 when displaying
	  help topics, leaving two characters of whitespace between horizontal
	  descriptions instead of 1
	- change to print in columns with entries sorted down rather than across
	  (that is, like `ls' rather than `ls -x').  Change inspired by Benno 
	  Schulenberg <bensberg@justemail.net>

jobs.h
	- give values to the JOB_STATE enumerations so they can be used as
	  bitmasks, too

				   12/22
				   -----
doc/{bash.1,bashref.texi}
	- change description of `set' to make it clearer that you can use
	  `+' to turn off options
	- clarify in the description of word splitting that sequences of
	  IFS whitespace at the beginning or end of the string are ignored

				   12/26
				   -----
doc/bashref.texi
	- move `shopt' builtin to its own section; change internal references
	  from `Bash Builtins' to the new shopt builtin
	- new section for builtins that modify shell behavior in `Shell
	  Builtin Commands'; move set and shopt to new section.  Changes
	  inspired by Benno Schulenberg <bensberg@justemail.net>

{redir,subst}.c
	- add MT_USETMPDIR flag to calls to sh_mktmpfd and sh_mktmpname.  Bug
	  reported by Eric Blake <ebb9@byu.net>

{configure,Makefile}.in
	- changes so that the pathname for DEBUGGER_START_FILE is substituted
	  into pathnames.h at make time (allowing more flexibility in setting
	  `prefix' or `datadir') instead of at configure time.  Suggested by
	  Nick Brown <nickbroon@blueyonder.co.uk>

shell.c
	- declaration for  have_devfd; initialized from HAVE_DEV_FD
	- declaration for check_jobs_at_exit; initialized to 0
	- declaration for autocd; initialized to 0

variables.c
	- new dynamic variable, BASHPID, always set from return value from
	  getpid() (changes even when $$ doesn't change).  Idea from Bruce
	  Korb <bruce.corb@3pardata.com>

builtins/exit.def
	- if check_jobs_at_exit is non-zero, list jobs if there are any stopped
	  or running background jobs; don't exit shell if any running jobs

execute_cmd.c
	- in execute_simple_command, if the first word of a simple command is
	  a directory name (after looking for builtins, so `.' isn't caught)
	  that isn't found in $PATH, and `autocd' is non-zero, prefix a "cd"
	  to the command words

builtins/shopt.def
	- new `checkjobs' option, changes value of check_jobs_at_exit
	- new `autocd' option, changes value of autocd

pcomplete.c
	- add COMP_TYPE, set to rl_completion_type, to list of variables set
	  by bind_compfunc_variables and unset by unbind_compfunc_variables

doc/{bash.1,bashref.texi}
	- document BASHPID
	- document new shopt `checkjobs' option
	- document new shopt `autocd' option
	- document COMP_TYPE completion variable

				   12/29
				   -----
aclocal.m4
	- in BASH_SYS_SIGLIST, check HAVE_DECL_SYS_SIGLIST instead of the
	  obsolete and no-longer-supported SYS_SIGLIST_DECLARED

				   12/30
				   -----
lib/readline/vi_mode.c
	- add ` (backquote) to the list of vi motion characters
	- in rl_vi_delete_to, rl_vi_change_to, and rl_vi_yank_to, don't delete
	  character under the cursor if the motion command moves the cursor
	  backward, so add F and T to the commands that don't cause the
	  mark to be adjusted
	- add ` to the characters that don't cause the mark to be adjusted
	  when used as a motion command, since it's defined to behave that way
	- when a motion character that may adjust the mark moves point
	  backward, don't adjust the mark so the character under the cursor
	  isn't deleted

lib/readline/complete.c
	- add variable rl_sort_completion_matches; allows application to
	  inhibit match list sorting
	- add variable rl_completion_invoking_key; allows applications to
	  discover the key that invoked rl_complete or rl_menu_complete

lib/readline/readline.h
	- extern declarations for rl_completion_invoking_key and
	  rl_sort_completion_matches

lib/readline/doc/rltech.texi
	- documented rl_completion_invoking_key and rl_sort_completion_matches

pcomplete.c
	- export variable COMP_KEY to completion functions; initialized from
	  rl_completion_invoking_key; unset along with rest of completion
	  variables

doc/{bash.1,bashref.texi},lib/readline/doc/rluser.texi
	- document COMP_KEY

[many files]
	- changes to make variables and function parameters `const' for better
	  text sharing.  Changes originally from Andreas Mohr
	  <andi@rhlx01.fht-esslingen.de>

				 1/4/2007
				 --------
lib/intl/Makefile.in
	- use cmp before copying libgnuintl.h to libintl.h -- maybe save a few
	  rebuilds

lib/builtins/Makefile
	- fixes to build LIBINTL_H if necessary, dependency on this for
	  mkbuiltins.o prevented `make -j 6' from working correctly

				    1/8
				    ---
subst.c
	- new function, fifos_pending(), returns the count of FIFOs in
	  fifo_list (process substitution)

subst.h
	- extern declaration for fifos_pending()

execute_cmd.c
	- in execute_simple_command, if CMD_NO_FORK is set before we call
	  execute_disk_command, make sure there are no FIFOs in the expanded
	  words (from process substitution) and turn off CMD_NO_FORK if there
	  are, so they can get unlinked when the command finishes

				   1/10
				   ----
subst.c
	- read_comsub now takes a flags parameter and returns appropriate W_*
	  flags in it
	- command_substitute now returns a WORD_DESC *, with the string it used
	  to return as the `word' and `flags' filled in appropriately

subst.h
	- changed extern declaration for command_substitute

{pcomplete,subst}.c
	- changed callers of command_substitute appropriately

subst.c
	- string_extract_verbatim now takes an additional int flags argument;
	  changed callers

				   1/11
				   ----
support/texi2html
	- fix problem that caused index links to not be generated if the first
	  index node had a name different than the node name

doc/bashref.texi
	- encapsulated all indexes into a single `Indexes' appendix; works
	  around bug fixed in texi2html

				   1/12
				   ----
subst.c
	- add call to sv_histtimefmt in initialize_variables so HISTTIMEFORMAT
	  from the environment is honored.  Fix from Ark Submedes (heh)
	  <archimerged@gmail.com>

lib/readline/histfile.c
	- make sure that the first character following the history comment
	  character at the beginning of a line is a digit before interpreting
	  it as a timestamp for the previous line

doc/{bash.1,bashref.texi},lib/readline/doc/hsuser.texi
	- added detail to make it clear exactly how history timestamps are
	  saved to and read from the history file

subst.c
	- change quote_escapes to add CTLESC before spaces if IFS is null,
	  just in case we have to split on literal spaces later on (e.g., in
	  case of unquoted $@).  Corresponding changes to dequote_escapes.
	  Fixes a couple of problems reported by Brett Stahlman
	  <brettstahlman@comcast.net>

				   1/14
				   ----
subst.c
	- make same change to read_comsub to add CTLESC before ' ' if $IFS is
	  null, since we will split on literal spaces later

				   1/15
				   ----
array.c
	- new function, array_quote_escapes (ARRAY *a), calls quote_escapes
	  on each element of the array in the same way array_quote calls
	  quote_string
	- call array_quote_escapes if match is not quoted in array_patsub
	- array_slice is now used, so remove the #ifdef INCLUDE_UNUSED define
	- change structure of array_subrange to call array_slice to create a
	  new array with the desired subset of elements, then call array_quote
	  or array_quote_escapes as necessary, like array_patsub.  Convert to
	  a string by calling array_to_string on the sliced-out array

array.h
	- new extern declaration for array_quote_escapes

subst.c
	- since array_patsub now calls quote_escapes as necessary, callers
	  don't need to call it after array_patsub returns.  Fixes first bug
	  reported by Brett Stahlman <brettstahlman@comcast.net>
	- since array_subrange now calls quote_escapes as necessary, callers
	  don't need to call it after array_patsub returns.  Same fix as
	  for array_patsub

				   1/31
				   ----
configure.in
	- add -DSOLARIS to LOCAL_CFLAGS for solaris x

config-bot.h
	- don't #undef HAVE_GETCWD if GETCWD_BROKEN and SOLARIS are both
	  defined.  Solaris's loopback mount implementation breaks some of the
	  file system assumptions the replacement getcwd uses.

builtins/common.c
	- if GETCWD_BROKEN is defined, call getcwd with PATH_MAX for the size
	  argument, so it will allocate a buffer for the current working dir
	  with that size, instead of one that's `big enough'

config.h.in
	- add #undef PRI_MACROS_BROKEN for AIX 4.3.3

pathexp.h
	- new flag value for quote_string_for_globbing: QGLOB_REGEXP (quoting
	  an ERE for matching as a string)

pathexp.c
	 - change quote_string_for_globbing to understand QGLOB_REGEXP

execute_cmd.c
	- change execute_cond_node to pass 2 (regexp match), 1 (shell pattern
	  match), or 0 (no matching) to cond_expand_word

subst.c
	- change cond_expand_word to translate SPECIAL==2 into passing
	  QGLOB_REGEXP to quote_string_for_globbing

locale.c
	- by default, if all else fails, set shell's idea of locale to ""
	  instead of its idea of `default_locale' -- the library functions
	  behave better with that value

				    2/2
				    ---
builtins/printf.def
	- if PRI_MACROS_BROKEN is defined, #undef PRIdMAX (AIX 4.3.3 broken)

				    2/3
				    ---
Makefile.in,{builtins,doc}/Makefile.in,lib/*/Makefile.in
	- add assignment for datarootdir as per GNU coding standards

Makefile.in,builtins/Makefile.in,lib/intl/Makefile.in,po/Makefile.in.in
	- use @localedir@ instead of $(datadir)/locale in assignment

				   2/13
				   ----
jobs.c
	- fix compact_jobs_list to not return js.j_lastj, since that is in use
	  and should not be overwritten.  Fix from Len Lattanzi
	  <llattanzi@apple.com>

				   2/16
				   ----
lib/readline/text.c
	- change rl_forward_char to allow moving to the end of the line when
	  using the arrow keys in vi insertion mode, rather than having the
	  behavior identical between vi command and insertion modes.  Change
	  suggested by Hugh Sasse <hgs@dmu.ac.uk>

				   2/19
				   ----
CWRU/audit-patch
	- patch from Steve Grubb of RedHat <sgrubb@redhat.com> to make bash
	  audit root's behavior by logging commands using his audit
	  framework.  Enabled if the shell's name is `aubash'.

				    3/8
				    ---
jobs.c
	- use WSTATUS (p->status) instead of bare p->status.  Fix from
	  Jim Brown <jim.brown@rsmas.miami.edu>

				    3/9
				    ---
lib/readline/{complete,input,isearch,misc,readline,text,vi_mode}.c
	- make sure cases where rl_read_key returns -1 (usually due to EIO
	  because the controlling tty has gone away) are handled correctly.
	  Prompted by report from Thomas Loeber <ifp@loeber1.de>

				   3/10
				   ----
sig.c
	- new function, top_level_cleanup, callable from contexts where some
	  cleanup needs to be performed before a non-fatal call to
	  jump_to_top_level

sig.h
	- new extern declaration for top_level_cleanup

builtins/common.c
	- add calls to top_level_cleanup before calls to jump_to_top_level
	  in a builtin command context (no_args(), get_numeric_arg()).  Fixes
	  bug reported by Ian Watson

lib/readline/display.c
	- in _rl_move_cursor_relative, use `new' when comparing against
	  the last invisible character in the prompt, since they both denote
	  buffer indices when in a multibyte locale, whereas `dpos' is a
	  display position

				   3/13
				   ----
lib/readline/complete.c
	- set rl_completion_append_character to the default (' ') in
	  set_completion_defaults().  Fixes bug reported by David Emerson
	  <demerson3x@angelbase.com>

				   3/23
				   ----
builtins/evalfile.c
	- make sure read() returns a value >= 0 before using it as an index
	  into string[]
	- use a variable of type `ssize_t' for return value from read()
	- only try to read the entire contents of a regular file in one shot
	  if the file size is less than SSIZE_MAX.  These fix problems
	  reported by hooanon05@yahoo.co.jp.

include/typemax.h
	- define SSIZE_MAX as 32767 if it's not defined

lib/readline/display.c
	- in rl_redisplay() and update_line(), if redrawing the prompt because
	  it contains invisible characters, make sure we redraw the character
	  indicating a modified history line and take it into account when
	  computing _rl_last_c_pos
	- in update_line, if deleting characters and redrawing the new text,
	  make sure we adjust _rl_last_c_pos by wrap_offset in a multibyte
	  locale if the text we're drawing starts before or at the last
	  invisible character in the prompt string.  Fixes bug reported on
	  bug-readline by J Pelkey <pelkeyj@gmail.com>

parse.y
	- when adding at CTLESC character to the current token, do not
	  escape it with CTLESC if pass_next_character indicates that the
	  CTLESC was escaped by a backslash.  Fixes bug reported by
	  Paul Bagshaw <paul.bagshaw@orange-ftgroup.com>.

				   3/25
				   ----
lib/readline/text.c
	- in rl_forward_char, short-circuit the loop if in emacs mode and
	  rl_point == rl_end.  Fixes problem with multibyte locales
	  reported by Len Lattanzi <llattanzi@apple.com>

				   3/29
				   ----
command.h
	- new flag for subshell_environment: SUBSHELL_PROCSUB, for process
	  substitution

subst.c
	- add SUBSHELL_PROCSUB to subshell_environment in process_substitute

				   3/30
				   ----
doc/Makefile.in
	- fix installation of bash.info to understand that it is in the build
	  directory, not the source directory

mailcheck.c
	- new function, init_mail_dates, calls remember_mail_dates only if
	  there are no mailboxes in `mailfiles'
	- new function, init_mail_file, initializes a FILEINFO, using the
	  last time mail was checked as the mtime and atime (or the time the
	  shell was started if last_time_mail_checked is uninitialized)
	- call init_mail_file instead of update_mail_file in add_mail_file,
	  called from remember_mail_dates (which is supposed to initialize
	  the list of mail files)
	- new convenience functions, alloc_mail_file and dispose_mail_file to
	  allocate and free FILEINFO structs

mailcheck.h
	- extern declaration for init_mail_dates

shell.c
	- call init_mail_dates instead of remember_mail_dates

				    4/4
				    ---
builtins/read.def
	- changes to print $PS2 when a line is continued with a backslash in
	  an interactive shell.  This is as POSIX requires

				    4/5
				    ---
subst.c
	- make sure quote_escapes is only ever called when the word to be
	  escaped is not marked as double-quoted -- cleaner, and allows us
	  to make certain assumptions

				    4/6
				    ---
subst.c
	- change all EX_* defines to begin with SX_
	- new flag, SX_NOCTLESC, obeyed by string_extract_verbatim, tells it
	  to not obey CTLESC quoting
	- change quote_escapes to not quote CTLESC with CTLESC if one of the
	  chars in $IFS is CTLESC, since the return value from quote_string
	  will be passed to word splitting and filename generation
	- change read_comsub to do the same thing for unquoted command
	  substitutions
	- change list_string to pass SX_NOCTLESC if CTLESC is one of the
	  chars in $IFS, so it will split on CTLESC instead of using it as a
	  quote character

				    4/7
				    ---
subst.c
	- slight change to string_extract_verbatim to allow CTLESC to quote
	  CTLNUL even if SX_NOCTLESC is set in the flags passed, to protect
	  the CTLNULs from future calls to remove_quoted_nulls.  Only
	  matters when $IFS contains CTLESC
	- changes to cope with $IFS containing CTLNUL in the same way as the
	  CTLESC changes

builtins/read.def
	- changes to cope with $IFS containing CTLNUL in the same way as the
	  CTLESC changes

				   4/16
				   ----
lib/sh/strftime.c
	- a couple of fixes to the `%z' code

eval.c
	- add an fflush after printing the auto-logout message

				   4/24
				   ----
subst.c
	- add call to top_level_cleanup in exp_jump_to_top_level to get things
	  like unwind-protects and the loop levels cleaned up

{arrayfunc,expr,variables}.c
	- add calls to top_level_cleanup before jump_to_top_level() 

				   4/27
				   ----
builtins/complete.def
	- make sure the `command' argument to the -C option is printed with
	  single quotes, since multi-word commands will require them.  Bug
	  reported by martin@snowplow.org

execute_cmd.c
	- change execute_builtin_or_function and execute_subshell_builtin_or_function
	  to call fflush(stdout) after the builtin or function returns, to
	  make sure that all output  is flushed before the call returns.  It
	  matters on cygwin.  Fix suggested by Eric Blake <ebb9@byu.net>

redir.c
	- in do_redirection_internal, if the file descriptor being acted upon
	  is the same one used by the stdout stream, call fflush(stdout) to
	  make sure all output is flushed before changing the underlying fd
	  out from underneath stdio.  Fix suggested by Eric Blake <ebb9@byu.net>


				   4/30
				   ----

builtins/common.c
	- new function, sh_chkwrite(int), fflushes stdout and checks for error;
	  printing an error message and returning a new exit status if there's
	  an error on stdout.  Takes exit status as argument; returns new exit
	  status (EXECUTION_FAILURE if write error)

builtins/common.h
	- new extern declaration for sh_chkwrite

builtins/{alias,cd,complete,echo,fc,history,pushd,shopt,times,trap,type,ulimit,umask}.def
	- change to use sh_chkwrite to report write errors

builtins/fc.def
	- if an error occurs while writing commands from the history to a file
	  to be executed, report a write error and return failure without
	  attempting to execute any commands

				    5/1
				    ---
builtins/{bind,declare,set,setattr}.def
	- change to use sh_chkwrite to report write errors

				    5/2
				    ---
lib/readline/input.c
	- fix off-by-one errors in _rl_get_char (pop_index) and rl_stuff_char
	  (push_index) that caused the 511th character in the buffer to be
	  discarded.  Fixes bug reported by Tom Bjorkholm <tom.bjorkholm@ericsson.com>

				    5/8
				    ---
subst.c
	- fix parameter_brace_remove_pattern to pass getpattern() newly-allocated
	  memory.  If word expansions (particularly brace expansions) are
	  required, the expansion code will free the string passed to
	  expand_word_internal, and we don't want to free unallocated memory
	  (patstr++) or have duplicate frees (patstr).  Fixes bug reported on
	  Red Hat bugzilla

				    5/9
				    ---
lib/readline/signals.c
	- fix bug in rl_set_signals that caught SIGINT twice and didn't catch
	  SIGTERM.  Bug reported by Ed Kwan <ed.kwan@onstor.com>

				   5/18
				   ----
jobs.c
	- change compact_jobs_list to return 1 if js.j_lastj == 0 and there is
	  a job in jobs[0]; compact_jobs_list should never return an index
	  already occupied
	- change reset_job_indices to avoid infinite looping when js.j_firstj
	  == 0 or js.j_firstj == js.j_jobslots upon function entry.  Fixes
	  bug reported by osicka@post.cz

				   5/20
				   ----

execute_cmd.c
	- new variable, executing_builtin, keeps track of number of "levels"
	  of builtins being executed; incremented by execute_builtin; saved
	  and restored by execute_simple_command

subst.c
	- new variable, assigning_in_environment, set and unset around calls
	  to assign_in_env by the expansion code

variables.c
	- use executing_builtin and assigning_in_environment to decide whether
	  or not to look into temporary_env when calling find_variable_internal.
	  Fixes problem reported by Kevin Quinn <kevquinn@gentoo.org>

				   5/22
				   ----
redir.c
	- change add_undo_redirect to differentiate between file descriptors
	  greater than SHELL_FD_BASE (currently 10) used internally to save
	  others and then being the targets of user redirection and fds that
	  are just the target of user redirections.  The former need to have
	  an `exec undo' redirect added to undo it in case exec throws away
	  redirections; the latter does not.  We use the close-on-exec flag
	  for this:  if it's set, we assume that the file descriptor is being
	  used internally to save another.  Fixes problem reported by Ian
	  Jackson <ian@davenant.greenend.org.uk>

shell.c
	- new function, init_interactive_script(), does interactive initialization
	  for a script run with `bash -i script' -- does everything the same
	  as init_interactive except set `interactive == 1', which causes the
	  shell to read from the standard input, after calling
	  init_noninteractive
	- call init_interactive_script if a script is run as `bash -i script'.
	  Fixes problem reported by Joseph Michaud <jmichaud@sgi.com>

				   5/24
				   ----
builtins/printf.def
	- change vbadd to only call FASTCOPY if the passed buffer length is
	  > 1
	- if the `-v' option is supplied and `vbuf' is already non-null from a
	  previous `printf -v var' call, set vbuf[0]=0 explicitly instead of
	  relying on vbadd to do it -- vbadd may not be called.
	- fix PRETURN macro to set vbuf[0] == 0 if vbuf is not freed.  These
	  should fix problem reported by Elmar Stellnberger <estellnb@yahoo.de>

lib/readline/display.c
	 - fix update_line to deal with the case where col_lendiff > 0 (meaning
	   the new string takes up more screen real estate than the old) but
	   lendiff < 0 (meaning that it takes fewer bytes to do so).  This can
	   happen when a multibyte prompt string is replaced with a longer one
	   containing only single-byte characters (e.g., when doing a reverse
	   i-search).  Fixes gentoo bug reported by Peter Volkov
	   <torre_cremata@mail.ru>

builtins/read.def
	- make sure we only print $PS2 if the standard input is a terminal
	- new function, read_mbchar, to read a multibyte character so we
	  can make sure we read entire multibyte chars when `read -n' is
	  used, rather than bytes.  Only called when -n is supplied.
	  Fixes problem reported by Stanislav Brabec <sbrabec@suse.cz>

				   5/25
				   ----
externs.h
	- new #defines for third argument to named_function_string:
	  FUNC_MULTILINE (don't suppress newlines) and FUNC_EXTERNAL (convert
	  to external display form)

subst.h
	- new extern declaration for remove_quoted_escapes

subst.c
	- remove_quoted_escapes is now global

print_cmd.c
	- in named_function_string, if FUNC_EXTERNAL is in the flags argument,
	  call remove_quoted_escapes to convert from internal to external form.
	  Fixes bug reported by Bo Andresen <bo.andresen@zlin.dk>

variables.c,builtins/{declare,setattr,type}.def
	- use FUNC_MULTILINE in calls to named_function_string as appropriate
	- add FUNC_EXTERNAL to calls to named_function_string as appropriate

				   5/27
				   ----
{make_cmd,variables}.c
	- changes to enable the shell to compile when debugger support is
	  configured out (function_def hash table and access functions).  Fixes
	  bug reported by Horst Wente <horst.wente@acm.org>

builtins/help.def
	- fix bug in `help' two-column printing to avoid referencing
	  shell_builtins[num_shell_builtins]

error.c
	- in get_name_for_error, use dollar_vars[0] if the name returned from
	  looking in $BASH_SOURCE[0] is the empty string as well as if it's
	  null

				   5/31
				   ----
arrayfunc.c
	- change array_value_internal to set *RTYPE to 1 if the reference is
	  array[*] and 2 if the reference is array[@]

subst.c
	- in parameter_brace_expand_word, set the flags returned by the word
	  desc to include W_HASQUOTEDNULL if array_value returns QUOTED_NULL
	  for an array reference like x[*] and the word is quoted.  Fixes bug
	  reported by Christophe Martin <schplurtz@free.fr>

				    6/1
				    ---
jobs.c
	- several changes to preserve errno if tcgetpgrp/tcgetattr/tcsetattr
	  fail, for subsequent error messages
	- change initialize_job_control to turn off job control if the terminal
	  pgrp == -1 or is not equal to shell_pgrp (with an error message)
	- in initialize_job_control, if the shell has been forced interactive
	  with -i, make sure stderr is hooked to a tty before using it as
	  the controlling terminal.  If it's not, try to open /dev/tty and
	  assign it to shell_tty.  Fixes problems reported by Derek Fawcus
	  <dfawcus@cisco.com>

				   6/13
				   ----
support/shobj-conf
	- changes to support shared object and shared library creation on AIX
	  5.x and later versions.  From Niklas Edmundsson <nikke@acc.umu.se>

				   6/17
				   ----
builtins/mkbuiltins.c
	- new array of builtins, posix_builtins, containing builtins listed
	  as special to the command search order by POSIX
	- add POSIX_BUILTIN to the builtin flags if the builtin name is one
	  that's special to the posix command search order

builtins.h
	- new define, POSIX_BUILTIN, means that a builtin is special to the
	  posix command search order

				   6/22
				   ----
lib/readline/display.c
	- new macro, WRAP_OFFSET, intended to replace W_OFFSET.  Takes prompt
	  strings longer than one physical line with invisible characters on
	  the second line into account when calculating the number of
	  invisible characters on the current screen line
	- use WRAP_OFFSET where appropriate (update_line, _rl_move_cursor_relative)
	- change update_line to deal with adjusting _rl_last_c_pos in a
	  multibyte environment when the prompt has invisible chars on the
	  second line and redisplay has output the invisible characters
	- change _rl_move_cursor_relative to adjust _rl_last_c_pos in a
	  multibyte environment when the prompt has invisible chars on the
	  second line and the redisplay draws the invisible character.  Fixes
	  redisplay bug reported by Andreas Schwab <schwab@suse.de>


				   7/11
				   ----

lib/readline/rltty.c
	- enable flush-output code for systems other than AIX 4.1.  Problem
	  reported by Jan Kratochvil <jan.kratochvil@redhat.com>

				   7/12
				   ----
lib/readline/display.c
	- set prompt_invis_chars_first_line from the portion of the prompt
	  following the final newline, instead of from the prefix.  Fixes
	  bug reported on the Ubuntu bug list by dAniel hAhler
	  <ubuntu@thequod.de>

				   7/13
				   ----
variables.c
	- use native __QNX__ and __QNXNTO__ cpp defines instead of qnx and
	  qnx6, respectively.  Patch from Sean Boudreau <seanb@qnx.com>

lib/sh/getcwd.c
	- #undef HAVE_LSTAT on qnx, so it uses stat instead.  Patch from
	  Sean Boudreau <seanb@qnx.com>

				   7/21
				   ----
builtins/common.c
	- change sh_invalidnum to be a little smarter about octal and hex
	  numbers and change the message appropriately.  Bug originally
	  reported on coreutils list by Jürgen Niinre <Jyrgen.Niinre@emt.ee>

				   7/26
				   ----
test.c
	- make sure the string passed to test_unop has only a single character
	  following the `-'.  Fixes bug reported by Michael A. Smith
	  <michael@smith-li.com>

parse.y
	- better input validation: make sure a word looks like a conditional
	  unary operator (-X) before calling test_unop

				   7/28
				   ----
trap.c
	- in trap_handler, if it's called directly from the signal handler
	  (e.g., SIGINT sighandler, set by set_sigint_handler), but the
	  trap disposition has been reset to the default between the
	  assignment and receipt of the signal, check that the signal is
	  trapped and issue a warning if the shell was compiled with
	  debugging enabled.  Fixes bug reported by Fergus Henderson
	  <fergus@google.com>

				    8/1
				    ---
lib/readline/{util,histexpand}.c
	- fixes for small memory leaks from Michael Snyder <msnyder@sonic.net>

				   8/18
				   ----
Makefile.in
	- add dependency on builtins/builtext.h to nojobs.o list.  Fixes
	  `make -j 5' issue reported by Chris MacGregor <chris@bouncingdog.com>

examples/loadables/Makefile.in
	- add @LDFLAGS@ to SHOBJ_LDFLAGS assignment -- experimental.  Suggested
	  by Mike Frysinger <vapier@gentoo.org>

examples/loadables/{basename,cut,dirname,finfo,head,ln,logname,mkdir,pathchk,print,printenv,push,realpath,rmdir,sleep,tee,truefalse,tty,uname,unlink,whoami}.c
	- fix up some includes.  Fix from Mike Frysinger <vapier@gentoo.org>

				   8/21
				   ----
histexpand.c
	- fix another memory leak in history_find_word.  Bug report originally
	  from Michael Snyder <msnyder@sonic.net>; test case suggested by Jim
	  Blandy <jimb@codesourcery.com>

				   8/26
				   ----
subst.c
	- change to do_assignment_internal to make an assignment to a variable
	  with the `noassign' internal attribute not a variable assignment
	  error.
	- fix do_assignment_internal so assignment to a `noassign' variable
	  does not cause it to suddenly become visible if it's currently
	  invisible

				    9/3
				    ---
stringlib.c
	- change strsub to check whether or not temp is non-null before
	  trying to null-terminate it.  Also make sure temp is allocated
	  even if the pattern and replacement strings are empty, and set
	  to a copy of string (like ${foo//})
	  Bug report from Timo Lindfors <timo.lindfors@iki.fi>

				   9/10
				   ----
{config.h,Makefile,configure}.in,aclocal.m4
	- new tests for fpurge and __fpurge

lib/sh/fpurge.c, externs.h
	- new file, fpurge(3) implementation with external decl in externs.h

builtins/common.c
	- add call to fpurge(stdout) to sh_chkwrite

{redir,execute_cmd}.c
	- add call to fpurge(stdout) after fflush(stdout) before changing
	  stdout file descriptor and after a builtin or function executes

				   9/12
				   ----
expr.c
	- make sure noeval is set to 0 when a longjmp occurs, since it will
	  not be reset otherwise, and it can be set to 1 while processing
	  a {pre,post}-increment or {pre,post}-decrement token
	- set noeval to 0 at the beginning of evalexp, since it's never
	  called recursively

				   9/14
				   ----
config-top.h
	- new builder-modifiable define:  DONT_REPORT_BROKEN_PIPE_WRITE_ERRORS
	  Turning it on will cause errors from EPIPE to not be reported by
	  the normal shell write error message mechanism

builtins/common.c
	- if DONT_REPORT_BROKEN_PIPE_WRITE_ERRORS is defined, don't print an
	  error message from sh_wrerror if errno == EPIPE.  Suggestion from
	  Petr Sumbera <petr.sumbera@sun.com>

				   9/19
				   ----
{jobs,nojobs}.c,jobs.h
	- add code to retry fork() after EAGAIN, with a progressively longer
	  sleep between attempts, up to FORKSLEEP_MAX (16) seconds.  Suggested
	  by Martin Koeppe <mkoeppe@gmx.de>

				   9/21
				   ----
version.c
	- change copyright year to 2007

				   9/25
				   ----
pathexp.c
	- change quote_string_for_globbing to add a backslash in front of a
	  backslash appearing in the pathname string, since the globbing
	  code will interpret backslashes as quoting characters internally.
	  Bug reported by <herbert@gondor.apana.org.au> on the debian list
	  (443685)

				   10/8
				   ----
lib/readline/display.c
	- in update_line, make sure _rl_last_c_pos is > 0 before setting
	  cpos_adjusted (or we actually moved the cursor to column 0 in
	  _rl_move_cursor_relative).  Fixes redisplay bug with prompt with
	  only invisible characters reported by dAniel hAhler
	  <ubuntu@thequod.de>

				   10/10
				   -----
lib/readline/display.c
	- in rl_redisplay, when calculating the new physical cursor position
	  in a multibyte locale (`tx'), do not call rl_backspace if tx ends
	  up < 0.  Rest of fix for bug reported by dAniel hAhler
	  <ubuntu@thequod.de>

				   10/12
				   -----
lib/sh/getcwd.c
	- fix memory overwrite problem that's possible if buf is NULL and
	  passed size is greater than the pathname length.  Reported by
	  Ian Campbell <ian.campbell@xensource.com>

builtins/ulimit.def
	- change the multiplier for the -c and -f options (`blocks') to 512,
	  the traditional value (and the one POSIX specifies).  Bug reported
	  by Pete Graner <pgraner@redhat.com>

braces.c
	- pass process substitution through unchanged the same as command
	  substitution.  Prompted by suggestion from Stephane Chazelas
	  <stephane_chazelas@yahoo.fr>

lib/readline/input.c
	- in rl_unget_char, fix off-by-one error when resetting pop_index if
	  it's < 0.  Bug reported by Uwe Doering <gemini@geminix.org>

builtins/type.def
	- change exit status of `type' to not successful if any of the
	  requested commands are not found.  Reported by Stephane Chazleas
	  <stephane_chazelas@yahoo.fr>

pcomplete.c
	- change command_line_to_word_list to use rl_completer_word_break_characters
	  instead of the shell metacharacters to split words, so programmable
	  completion does the same thing readline does internally.  Reported
	  by Vasily Tarasov <vtaras@sw.ru>

				   10/16
				   -----
bashline.c
	- When completing a command name beginning with a tilde and containing
	  escaped specical characters, dequote the filename before prefixing
	  it to the matches, so the escapes are not quoted again.  Reported
	  by neil@s-z.org

				   10/17
				   -----
expr.c
	- in readtok(), don't reset lasttp if we've consumed the whitespace
	  at the end of the expression string.  Fixes error message problem
	  reported by <anmaster@tele2.se>

				   11/1
				   ----
builtins/printf.def
	- change asciicode() to return intmax_t; add multibyte character
	  support instead of assuming ASCII (depending on behavior of system
	  multibyte support functions).  Fixes bug reported by Rich
	  Felker <dalias@aerifal.cx>

				   11/5
				   ----
execute_cmd.c
	- if redirections attached to a compound command fail, make sure to
	  set last_command_exit_value when returning EXECUTION_FAILURE.
	  Fixes bug reported separately by Andreas Schwab <schwab@suse.de>
	  and Paul Eggert <eggert@cs.ucla.edu>

				   11/9
				   ----
builtins/read.def
	- make sure the return value from get_word_from_string is freed if
	  non-null.  Fixes memory leak bug reported by Lars Ellenberg
	  <lars.ellenberg@linbit.com>

				   11/10
				   -----
variables.c
	- use getpid() as value of seeded_subshell to avoid problems with
	  random number generator not getting re-seeded correctly when
	  subshells are created.  Fix from Tomas Janousek <tjanouse@redhat.com>

lib/readline/display.c
	- in update_line(), when outputting characters at the end of the line,
	  e.g., when displaying the prompt string, adjust _rl_last_c_pos by
	  wrap_offset if the text we're drawing begins before the last
	  invisible character in the line.  Similar to fix from 5/24.  Fixes
	  bug reported by Miroslav Lichvar <mlichvar@redhat.com>

				   11/14
				   -----
subst.c
	- fix $[ expansion case to deal with extract_arithmetic_subst
	  returning NULL (if the `]' is missing) and return the construct
	  unchanged in that case.  Fixes tab completion bug reported by
	  Heikki Hokkanen <hoxu@users.sf.net> (debian bug 451263)

lib/readline/mbutil.c
	- fix _rl_find_next_mbchar_internal to deal with invalid multibyte
	  character sequences when finding non-zero-length chars.  Fixes
	  bug reported by Morita Sho <morita-pub-en-debian@inz.sakura.ne.jp>

				   11/15
				   -----
variables.c
	- add new function `seedrand' to seed the bash random number
	  generator from more random data.  Suggestion from Steve Grubb
	  <sgrubb@redhat.com>
	- replace the rng in brand() with a slightly better one from FreeBSD
	  (filtered through Mac OS X 10.5).  Replacement suggested by
	  Steve Grubb <sgrubb@redhat.com>

				   11/21
				   -----
configure.in
	- darwin 9 also requires linking against libreadline.a and
	  libhistory.a because of Apple's questionable decision to ship a
	  libreadline "replacement" that doesn't provide all functions

doc/{bash.1,bashref.texi}
	- slight change to the text describing the effect of set -e when
	  in a || or && list

				   12/5
				   ----
jobs.c
	- fix raw_job_exit_status to correct mixing of int/WAIT values (need
	  to return a WAIT)
	- arrange so that children run as part of command substitutions also
	  set the SIGINT handler to wait_sigint_handler, since they effectively
	  don't do job control
	- in wait_for, if a child run as part of a command substitution exits
	  due to SIGINT, resend the SIGINT to the waiting shell with kill(2).
	  This makes sure the exit status propagates 

doc/{bash.1,bashref.texi}
	- tighten up the language describing when bash tries to see if its
	  stdin is a socket, so it can run the startup files.  Suggested by
	  Vincent Lefevre <vincent@vinc17.org>

eval.c
	- in the DISCARD case of a longjmp to top_level, make sure
	  last_command_exit_value is set to EXECUTION_FAILURE if it's 0,
	  but leave existing non-zero values alone

subst.c
	- in command_substitute, don't reset pipeline_pgrp in the child
	  process -- this means that second and subsequent children spawned by
	  this comsub shell get put into the wrong process group, not the
	  shell's.  Fix for bug reported by Ingo Molnar <mingo@elte.hu>

				   12/6
				   ----
support/shobj-conf
	- make sure the cases for darwin8.x (Mac OS X 10.4.x) are extended to
	  darwin9.x (Mac OS X 10.5.x).  Fixes problem originally reported
	  against readline-5.2 by schneecrash@gmail.com

				   12/8
				   ----
subst.c
	- make sure to add the results of (successful) tilde expansion as a
	  quoted string, to inhibit pathname expansion and word splitting.
	  From recent Austin Group interpretation.

include/shtty.h, lib/sh/shtty.c
	- add ttfd_onechar, ttfd_noecho, ttfd_eightbit, ttfd_nocanon, and
	  ttfd_cbreak to set tty attributes associated with a particular
	  file descriptor (which is presumed to point to a terminal).  Support
	  for fix for bug reported by b_bashbug@thebellsplace.com

lib/readline/display.c
	- make sure we only use rl_invis_chars_first_line when the number of
	  physical characters exceeds the screen width, since that's the
	  only time expand_prompt sets it to a valid value

				   12/12
				   -----
builtins/set.def
	- change set_minus_o_option to return EX_USAGE if an invalid option
	  name is supplied.  All callers can handle it.
	- change set_builtin to return what set_minus_o_option returns if it's
	  not EXECUTION_SUCCESS.  This allows EX_USAGE errors to abort a
	  shell running in posix mode

				   12/14
				   -----
builtins/read.def
	- generalize the calls to the tty attribute functions to maintain a
	  local copy of the terminal attributes and use the fd supplied as
	  the argument to the -u option (default 0).  Fix for bug reported
	  by b_bashbug@thebellsplace.com

doc/bashref.texi, lib/readline/doc/{history,rlman,rluser,rluserman}.texi
	- Slight changes to conform to the latest FSF documentation standards.
	  Patch from Karl Berry <karl@freefriends.org>

				   12/20
				   -----
execute_cmd.c
	- after calling clear_unwind_protect_list, make sure we reset
	  parse_and_execute_level to 0, since there's nothing left to
	  restore it if top_level_cleanup tests it.  Fixes bug reported
	  by Len Lattanzi <llattanzi@apple.com>

				   12/31
				   -----
lib/sh/getcwd.c
	- new function, _path_checkino, checks whether the inode corresponding
	  to the path constructed from the first two arguments is the same as
	  the inode number passed as the third argument
	- if BROKEN_DIRENT_D_INO is defined, meaning the d_ino/d_fileno
	  member of struct dirent doesn't contain valid values, use
	  _path_checkino instead of directly comparing against d_fileno.
	  Fixes Interix problem reported by Michael Haubenwallner
	  <haubi@gentoo.org>

				 1/7/2008
				 --------
array.c
	- fix array_subrange to separate elements in returned string with
	  first char of $IFS if QUOTED is non-zero, since this indicates
	  the caller used ${array[@]:foo}.  Fixes bug reported by Lea
	  Wiemann <lewiemann@gmail.com>

				    1/8
				    ---
subst.c
	- new function returning a string containing the first character of
	  $IFS: char *ifs_firstchar(int *)

subst.h
	- extern declaration for ifs_firstchar()

array.c
	- call ifs_firstchar() to get first character of $IFS when needed
	  (array_subrange() and array_patsub())

				   1/11
				   ----
lib/readline/display.c
	- use sentinel variable set at end of init_line_structures to decide
	  whether to call it from rl_redisplay, since early SIGWINCH on
	  Mac OS X that hits during this function can cause _rl_wrapped_line
	  to be referenced before initialization.  Fix for bug reported by
	  Len Lattanzi <llattanzi@apple.com>

subst.[ch]
	- skip_to_delim is now compiled into the shell all the time, not just
	  when readline is linked in

subst.c
	- use skip_to_delim to find the `/' denoting the end of a pattern
	  in pattern substitution, since it knows more shell syntax than
	  quoted_strchr and understands multibyte characters.  Fixes bug
	  reported by Dmitry V Golovashkin <Dmitry.Golovashkin@sas.com>

				   1/15
				   ----
subst.c
	- add `flags' argument to skip_to_delim telling it whether or not to
	  set no_longjmp_on_fatal_error; set this flag when calling from the
	  readline completion code

subst.h	
	- update extern declaration for skip_to_delim

				   1/17
				   ----
subst.c
	- expand_prompt_string takes a third argument: the initial flags for
	  the WORD

subst.h
	- change extern declaration for expand_prompt_string to add third arg

bashline.c
	- pass W_NOCOMSUB as third argment to expand_prompt_string when
	  calling from bash_directory_completion_hook, since we don't want
	  to do command substitution from the completion code

parse.y
	- change call to expand_prompt_string

				   1/18
				   ----
doc/Makefile.in
	- added an `install_builtins' rule to install the builtins.1 man page,
	  preprocessing it with sed to force `.so man1/bash.1', which some
	  versions of man require.  Suggestion from Peter Breitenlohner
	  <peb@mppmu.mpg.de>
	- new target `install_everything' that will install normal documentation
	  and builtins man page
	- changed uninstall target to remove bash_builtins page from man
	  directory

lib/readline/vi_mode.c
	- new function, rl_vi_insert_mode, which calls rl_vi_start_inserting
	  to make sure the value of `last command to repeat' is set correctly.
	  Fix from Thomas Janousek <tjanouse@redhat.com>
	- add support for redoing inserts made with the `I' command.  Fix
	  from Thomas Janousek <tjanouse@redhat.com>
	- add support for redoing inserts made with the `A' command

lib/readline/readline.h
	- new extern declaration for rl_vi_insert_mode

lib/readline/{misc,readline,vi_mode,vi_keymap}.c
	- change calls to rl_vi_insertion_mode to rl_vi_insert_mode

				   1/19
				   ----
builtins/read.def
	- change timeout behavior when not reading from a tty device to save
	  any partial input in the variable list, but still return failure.
	  This also causes variables specified as arguments to read to be
	  set to null when there is no input available.  Fix inspired by
	  Brian Craft <bcboy@thecraftstudio.com>

				   1/21
				   ----
builtins/fc.def
	- change computation of last_hist to use remember_on_history instead
	  of a hard-coded `1'.  This keeps fc -l -1 in PROMPT_COMMAND from
	  looking too far back

				   1/25
				   ----
lib/readline/complete.c
	- fix fnwidth to use string[pos] instead of *string when testing the
	  current character for a control character or rubout

				    2/2
				    ---
general.c
	- change posix_initialize to turn off source/. searching $PWD when
	  the file sourced is not found in $PATH.  Fixes bug reported by
	  Paolo Bonzini <bonzini@gnu.org> and Eric Blake <ebb9@byu.net>

				    2/9
				    ---
builtins/*.def
	- changes to text and formatting suggested by Jan Schampera
	  <jan.schampera@web.de>

				   2/16
				   ----
bashline.c
	- change command_word_completion_function to use the word completion
	  found by readline, which matters only when ignoring case is on
	  and the completion found in the file system differs in case from
	  the text the user typed (this is what readline does for normal
	  filename completion).  Fixes issue reported by Jian Wang
	  <jwang@a10networks.com.cn>.

				   2/18
				   ----
builtins/source.def
	- if the filename passed as an argument contains a `/', don't search
	  $PATH.  Not sure why it wasn't like this before

				   2/21
				   ----
lib/readline/terminal.c
	- change rl_crlf so that the MINT system on ATARI systems adds a
	  carriage return before the \n

				   2/22
				   ----
doc/{bash.1,bashref.texi}
	- added text to the EXIT STATUS section noting that exit statuses
	  fall between 0 and 255, inclusive

support/mkversion.sh
	- output a #define for DEFAULT_COMPAT_LEVEL (${major}${minor}; e.g. 32)
	  to version.h

version.c
	- int variable, shell_compatibility_level, set to DEFAULT_COMPAT_LEVEL
	  by default

builtins/shopt.def
	- new shopt variable, compat31, sets shell_compatibility_level to 31
	  (or back to default if unset)

execute_cmd.c
	- in execute_cond_node, restore bash-3.1 behavior of quoted rhs of
	  regexp matches if shell_compatibility_level == 31

				   2/28
				   ----
lib/readline/rltty.c
	- set readline_echoing_p = 1 if tcgetattr fails and sets errno to
	  EINVAL, as Linux does when the fd is a pipe.  Reported by Mike
	  Frysinger <vapier@gentoo.org>

				    3/6
				    ---
{MANIFEST,Makefile.in},lib/sh/{casemod,uconvert,ufuncs}.c
	- new library sources from bash-4.0-devel tree

lib/sh/spell.c
	- moved cdspell() here from builtins/cd.def, renamed dirspell()

externs.h
	- new declarations for extern functions from new library files
	- new extern declaration for lib/sh/spell.c:dirspell()

builtins/cd.def
	- call extern library function dirspell(); remove static cdspell()

builtins/read.def
	- when read times out, make sure input_string is null-terminated before
	  assigning any partial input read to the named variables

				   3/10
				   ----
lib/glob/xmbsrtowcs.c
	- cut the number of memory allocations in xdupmbstowcs by not keeping
	  track of the indices if the caller hasn't asked for it

				   3/17
				   ----
builtins/fc.def
	- make sure the adjustment to i in fc_gethnum uses the same formula
	  fc_builtin uses to calculate last_hist
	- make sure that every time fc_gethnum is called, the fc command last
	  in the history list has not yet been deleted, since fc_gethnum
	  assumes that it has not.  Fix from John Haxby <john.haxby@oracle.com>

lib/readline/complete.c
	- new private library function, _rl_reset_completion_state(), used to
	  reset any completion state internal to the library when a signal
	  is received
	- call _rl_reset_completion_state() before returning from
	  rl_complete_internal

lib/readline/rlprivate.h
	- new extern declaration for _rl_reset_completion_state

lib/readline/signals.c
	- call _rl_reset_completion_state from rl_signal_handler on SIGINT.
	  This fixes one of the problems identified by Mika Fischer
	  <mf+ubuntu@zoopnet.de>

pcomplete.c
	- programmable_completions now saves pointer to the compspec it's
	  working with in new global variable CURCS
	- new function, pcomp_set_readline_variables, that sets or unsets
	  readline variables based on a passed flags value (COPT_FILENAMES,
	  etc.)
	- new function, pcomp_set_compspec_options, to set or unset bits in
	  the options word of a passed compspec (default CURCS)
	- only call bash_dequote_filename (via rl_filename_dequoting_function)
	  from pcomp_filename_completion_function if the readline state
	  word indicates word completion is in progress

pcomplete.h
	- new extern declaration for curcs
	- new extern declaration for pcomp_set_readline_variables
	- new extern declaration for pcomp_set_compspec_options

bashline.c
	- fix bash_dequote_filename to implement shell quoting conventions:
		1. Inhibit backslash stripping within single quotes
		2. Inhibit backslash stripping within double quotes only if
		   the following character is one of the special ones
	- call pcomp_set_readline_variables from attempt_shell_completion
	  instead of doing the equivalent inline

				   3/18
				   ----
bracecomp.c
	- make sure we sort array of matches in byte order (using strcmp). so
	  the brace calculations work correctly even when the locale orders
	  characters like aAbBcC...zZ.  Fixes bug reported by Torsten Nahm
	  <torstennahm@torstennahm.de>

				   3/20
				   ----
lib/readline/{rltty,signals}.c
	- move block_sigint and release_sigint from rltty.c to signals.c; add
	  _rl_ prefix to make them public to the library; change callers.
	  From Jan Kratochvil <jan.kratochvil@redhat.com>

lib/readline/rlprivate.h
	- new extern declarations for _rl_block_sigint and _rl_release_sigint

lib/readline/display.c
	- add calls to _rl_block_sigint and _rl_release_sigint to rl_redisplay,
	  since it maniupluates global data structures.  Fix from Jan
	  Kratochvil <jan.kratochvil@redhat.com>

builtins/printf.def
	- change calls to asprintf and manually adding to vbuf to use calls
	  to vsnprintf against vbuf directly -- if the number of characters
	  to be written overflows the buffer, realloc the buffer and use
	  vsnprintf again.  This should reduce the memory used by printf.
	  Idea from Yuya Katayama <yuya999@gmail.com>

lib/readline/doc/rltech.texi
	- documented rest of readline's state flags, including RL_STATE_CALLBACK
	- documented rl_save_state and rl_restore_state

				   3/27
				   ----
lib/readline/{rlprivate.h,{display,readline,rltty,terminal,text}.c}
	- rename readline_echoing_p to _rl_echoing_p for namespace consistency

lib/readline/{rlprivate.h,{callback,readline,util}.c}
	- rename readline_top_level to _rl_top_level for namespace consistency

builtins/ulimit.def
	- new -b (socket buffer size) and -T (number of threads) options

array.c
	- fix bug in calculation of the array element assignment string length:
	  use length of `is' instead of `indstr'.  Reported as ubuntu bug
	  #202885 by John McCabe-Dansted

builtins/setattr.def
	- new function, show_all_var_attributes, displays attributes and
	  values for all shell variables (or shell functions) in a reusable
	  format

builtins/common.h
	- new extern declaration for show_all_var_attributes

builtins/declare.def
	- change `declare -p' to print out all variable attributes and values,
	  and `declare -fp' to print out all function attributes and
	  definitions.  Inspired by request from John Love-Jensen
	  <eljay@adobe.com>

doc/{bash.1,bashref.texi}
	- document new -b and -T options to ulimit
	- tighten up language describing AND and OR lists
	- add description of new behavior of `declare -p'

				   3/28
				   ----
pcomplete.c
	- rename curcs -> pcomp_curcs
	- new global completion variable, pcomp_curcmd, the current command
	  name being completed

builtins/complete.def
	- new builtin, compopt, allows completion options for command names
	  supplied as arguments or the current completion being executed to
	  be modified.  Suggested by Mika Fischer <mf+ubuntu@zoopnet.de>

				   3/30
				   ----
doc/{bash.1,bashref.texi},lib/readline/doc/rluser.texi
	- document new compopt builtin

				    4/5
				    ---
support/shobj-conf
	- change solaris10 stanza to use -fPIC to fix 64-bit sparc_v9/solaris10
	  compilations.  Fix from Fabian Groffen <grobian@gentoo.org>

builtins/read.def
	- added `-i text' option, inserts `text' into line if using readline.
	  Suggested by many, used some ideas from Kevin Pulo <kevin@pulo.com.au>

doc/{bash.1,bashref.texi}
	- document new `-i text' option to read builtin

				    4/7
				    ---
lib/readline/bind.c
	- new settable variable, `history-size', sets the max number of
	  entries in the history list

doc/bash.1,lib/readline/doc/{rluser.texi,readline.3}
	- document new `history-size' settable readline variable

				    4/8
				    ---
builtins/complete.def
	- change build_actions calling sequence to take a struct with `other'
	  (non-action) flag arguments (-p, -r)
	- add support for `-E' option to build_actions and complete builtin --
	  modifies or displays (internal) `_EmptycmD_' completion spec

bashline.c
	- change attempt_shell_completion to try programmable completion on an
	  `empty' command line and return the results

doc/bash.1,lib/readline/doc/rluser.texi
	- documented new `-E' option to `complete'

				    4/9
				    ---
bashhist.c
	- new variable, `enable_history_list', used to reflect setting of
	  `-o history' option
	- change bash_history_{enable,disable,reinit} to set enable_history_list
	  as well as remember_on_history

builtins/set.def
	- use `enable_history_list' instead of `remember_on_history' to keep
	  value of `-o history' option

builtins/evalstring.c
	- instead of unwind-protecting remember_on_history, use a function to
	  restore it to the value of `enable_history_list' after
	  parse_and_execute runs the commands in the string.  This allows
	  history to be turned off in a startup file, for instance.  Problem
	  reported by Dan Jacobson <jidanni@jidanni.org>

				   4/11
				   ----
bashline.c
	- limited support for completing command words with globbing characters
	  (only a single match completed on TAB, absolute or relative
	  pathnames supported, no $PATH searching, some support for displaying
	  possible matches, can be used with menu completion).
	  Suggested by Harald Koenig <h.koenig@science-computing.de>

print_cmd.c
	- change redirection printing to output r_err_and_out as `&>file',
	  since the man page says that's the preferred form

				   4/12
				   ----
builtins/*.def
	- change long doc so the first line is a short description
	- add `Exit Status:' section to each longdoc describing exit values

builtins/help.def
	- new `-d' option to print short description of each utility
	- new `-m' option to print description of each builtin in a
	  pseudo-manpage format (inspired by ksh93)

doc/{bash.1,bashref.texi}
	- document new `-d' and `-m' options to `help'

builtins/mapfile.def
	- new builtin, `mapfile', imported from bash-4.0-devel branch

tests/{mapfile.{data,right,tests},run-mapfile}
	- tests for `mapfile' builtin

doc/{bash.1,bashref.texi}
	- added description of `mapfile' builtin

MANIFEST,Makefile.in,builtins/Makefile.in
	- added entries for mapfile source files

arrayfunc.[ch]
	- new function, bind_array_element, to support mapfile builtin

				   4/20
				   ----
expr.c
	- fix operator precendence in expcond():  term after the `:' is
	  a conditional-expression, not a logical-OR-expression (using C
	  terminology).  Bug reported by <archimerged@gmail.com>

				   4/22
				   ----
bashintl.h
	- new P_ define for using ngettext to decide on plural forms
	  (currently unused)

				   4/25
				   ----
execute_cmd.c
	- in execute_disk_command, if the command is not found, search for
	  a shell function named `command_not_found_handle' and call it
	  with the words in the command as arguments.  Inspired by Debian
	  feature.

doc/{bash.1,bashref.texi}
	- document new command_not_found_handle behavior in COMMAND EXECUTION
	  section

configure.in
	- change default version to bash-4.0-devel

				   4/28
				   ----
variables.c
	- change push_func_var and push_exported_var to call
	  stupidly_hack_special_variables if the temporary variable is going
	  to be disposed.  This undoes any internal changes caused by a local
	  variable assignment in the environment or in a shell function.  Bug
	  reported by Morita Sho <morita-pub-en-debian@inz.sakura.ne.jp> in
	  http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=478096

				    5/3
				    ---
builtins/fc.def
	- fixed a problem caused by change of 1/21 to use remember_on_history,
	  since it's turned off by parse_and_execute(), but can cause the
	  last command in history to be deleted and leave last_hist pointing
	  beyond the end of the history list.  edit_and_execute_command can
	  do this.

bashline.c
	- new define, RL_BOOLEAN_VAR_VALUE, to take a readline boolean variable
	  and get its value as 0 or 1 (consider making readline global)
	- put tty back into canonical mode before calling parse_and_execute in
	  edit_and_execute_command and then back into raw mode after it
	  returns.  Fixes problem identified by <koersen@gmail.com>.

				    5/4
				    ---
lib/glob/glob.c
	- code to support `globstar' option: GX_GLOBSTAR and two internal
	  flags.  Changes to skipname, glob_vector, mbskipname, glob_filename.
	  New function finddirs().

lib/glob/glob.h
	- new defines to support globstar code

builtins/shopt.def
	- new shell option, `globstar', enables special handling of `**' in
	  glob patterns -- matches all directories recursively

pathexp.h
	- extern declaration for glob_star

pathexp.c
	- break inline code out of quote_globbing_chars into a separate
	  function to decide whether a character is a globbing char:
	  glob_char_p
	- change shell_glob_filename to call glob_filename with the
	  GX_GLOBSTAR flag if glob_star is set

doc/{bash.1,bashref.texi}
	- document new `globstar' shell option

arrayfunc.c
	- new function, broken out of quote_array_assignment_chars:
	  quote_assign; extended from old code to make sure that globbing
	  chars and chars in $IFS are quoted when displaying assignment
	  statements, especially in compound array assignments

				    5/5
				    ---
bashline.c
	- new variable, dircomplete_spelling, controls spelling correction
	  of directory names when doing filename completion
	- change bash_directory_completion_hook to incorporate spelling
	  correction if initial canonicalization of directory name fails

builtins/shopt.def
	- new shell option, `dirspell', enables and disables spelling
	  correction of directory names during word completion

builtins/read.def
	- support for fractional timeout values (ival.uval); uses uconvert
	  and falarm/setitimer

config.h.in
	- new `HAVE_SETITIMER' define

configure.in
	- look for setitimer(2), define HAVE_SETITIMER if found

doc/{bash.1,bashref.texi}
	- document new `dirspell' shopt option
	- document new fractional values to `read -t timeout'

				    5/6
				    ---
assoc.[ch]
	- new files, basic support for associative array implementation

general.h
	- new extern declarations for sh_openpipe, sh_closepipe, trim_pathname

general.c
	 - new functions: sh_openpipe to create a pipe and move the file
	   descriptors to a high range; sh_closepipe, to close pipe fds and
	   clean up, and trim_pathname, to replace portions of a pathname
	   with `...' (for prompting)

jobs.c
	- don't set last_asynchronous_pid in child shell (messes up $!, among
	  other things)

parse.y,parser.h
	- moved definitions of parser flags to parser.h

array.c
	- imported array_modcase (case-changing operations on arrays) from
	  4.0-devel branch

array.h
	- new extern declaration for array_modcase

lib/readline/complete.c
	- new variable, rl_menu_completion_entry_function, generator for
	  rl_menu_complete
	- new menu completion `browsing' implementation, with several
	  improvements over the old code.  Inspired by Sami

lib/readline/readline.h
	- extern declaration for rl_menu_completion_entry_function

				    5/8
				    ---
lib/readline/complete.c
	- add support for a third argument to fnprint and print_filename,
	  which supports replacing a specified portion of the pathnames
	  printed when displaying possible completions with a `...' (or
	  `___', if the prefix would be confused with a portion of the
	  filename)
	- new variable, _rl_completion_prefix_display_length, sets the
 	  number of characters in a common prefix to be replaced with an
	  ellipsis when displaying possible completions
	- add support to _rl_display_match_list to find the length of the
	  common prefix of all items being displayed, and passing that
	  value to print_filename for possible replacement with an ellipsis
	  if that length is longer than _rl_completion_prefix_display_length

lib/readline/bind.c
	- add support for retrieving value of history-size variable to
	  _rl_get_string_variable_value
	- new bindable variable, completion-prefix-display-length.  When
	  displaying possible completions, matches with a common prefix
	  longer than this value have the common prefix replaced with an
	  ellipsis
	- support for retrieving value of completion-prefix-display-length
	  variable to _rl_get_string_variable_value
	- new bindable variable, revert-all-at-newline:  if enabled, causes
	  all changes in history lines to be undone before readline returns
	  after processing a newline

doc/bash.1,lib/readline/doc/{readline.3,rluser.texi}
	- document new `completion-prefix-display-length' variable
	- document new `revert-all-at-newline' variable

execute_cmd.c
	- change execute_builtin to not inherit the `-e' flag into commands
	  executed by the `command' or `source/.' builtins if we are supposed
	  to be ignoring the return value.  This is like `eval'.  Fixes bug
	  reported by Hiroshi Fujishima <hirobo@tonteki.org>

				   5/10
				   ----
variables.c
	- when reading the initial environment, don't create variables with
	  names that are not valid shell identifiers.  Fixes bug reported by
	  Stephane Chazleas <stephane_chazelas@yahoo.fr>

				   5/13
				   ----
subst.c
	- fix string_quote_removal to gracefully handle the case where a
	  backslash is the final character in the string (leaves the backslash
	  in place).  Fixes bug reported by Ian Robertson
	  <iroberts@u.washington.edu>

				   5/16
				   ----
support/checkbashisms
	- Perl script that purports to check for bash-specific features in a
	  shell script.  Lifted from Debian via ubuntu

				   5/20
				   ----
lib/readline/display.c
	- in update_line, when deciding whether or not to adjust _rl_last_c_pos
	  in a multibyte environment after printing the last line of a multiline
	  prompt with invisible characters on the first and last lines, use
	  the number of inivisible chars on the first line in the calculation
	  deciding whether or not we're past the last invisible character and
	  need to adjust the cursor position.  Old code used the number of
	  invisible chars on the last prompt line.  Fixes bug reported by
	  stuff@slinkp.com.
	- in update_line, when fixing _rl_last_c_pos after drawing the first
	  line of the prompt, use the number of invisible chars on the first
	  line as the offset, instead of the total number of invisible chars
	- use prompt_multibyte_characters, the number of multibyte chars in
	  the prompt string, to short-circuit some relatively expensive
	  multibyte text processing in rl_redisplay

				   5/21
				   ----
variables.c
	- new function, reinit_special_variables(), a hook for special
	  vars that need their hook functions called when they're unset as
	  a result of the shell reinitializing itself to run a script

shell.c
	- shell_reinitialize now calls reinit_special_variables
	- shell_reinitialize now calls bashline_reset

variables.h
	- new extern declaration for reinit_special_variables

bashline.c
	- new function, bashline_reset(), called when the shell reinitializes
	  in shell_reinitialize.  Right now, just resets
	  bash_readline_initialized to 0.

bashline.h
	- new extern declaration for bashline_reset()

				   5/23
				   ----
bashhist.c
	- new function, bash_clear_history, clears the history and resets any
	  associated internal bash state

bashhist.h
	- extern declaration for bash_clear_history

builtins/history.def
	- call bash_clear_history instead of clear_history for `history -c'.
	  Fixes part of problem reported by Scott McDermott
	  <scott.m.mcdermott@gmail.com>
	- decrement history_lines_this_session in delete_histent, called for
	  `history -d'

builtins/history.def,bashhist.[ch]
	- move delete_histent() to bashhist.c; rename to bash_delete_histent
	- move delete_last_history() to bashhist.c; rename to
	  bash_delete_last_history()

				   5/25
				   ----
braces.c
	- add another parameter to mkseq(), the number of digits to put into
	  each member of a numeric sequence (width), changes to determine
	  any zero-padding go into expand_seqterm
	- changes to expand_seqterm to allow user-specified increments

bashline.[ch],shell.c,sig.c
	- switched names of bashline_reinitialize and bashline_reset to better
	  reflect their functions
	- when searching $PATH for directories to use for command completion,
	  make sure to free `current_path' before going out of scope
	- new bindable function `dabbrev-expand', which is more or less
	  menu completion using dynamic history completion as the generator
	- changes to bash_execute_unix_command to set variables for the
	  executed command like programmable completion: READLINE_LINE
	  (rl_line_buffer) and READLINE_POINT (rl_point)
	- change to bash_execute_unix_command to allow the executed command
	  to change the readline line buffer by modifying the value of
	  READLINE_LINE and to change rl_point by modifying the value of
	  READLINE_POINT

common.h
	- new SEVAL_ defines for later parse_string changes from 4.0-devel
	  branch

command.h
	- new defines for new &>> r_append_err_and_out redirection

builtins/evalstring.c
	- new function, parse_string, parses a command from a passed string
	  and returns the number of characters consumed.  For satisfying
	  Posix rules when parsing command substitutions, from bash-4.0-devel
	  branch
	- split out common prolog code from parse_string and
	  parse_and_execute into a separate function called from both

parse.y
	- small changes to add symbols needed for parse_string
	- parser change to add `|&' as synonym for `2>&1 |'; translation is
	  performed at parse time so |& never shows up in output of
	  print_command, for instance.  Picked up from zsh, merged in from
	  bash-4.0-devel branch

parse.y,{redir,copy_cmd,dispose_cmd,make_cmd,print_cmd}.c
	- implement new &>> r_append_err_and_out (like >>foo 2>&1); merged
	  in from bash-4.0-devel branch

doc/{bash.1,bashref.texi},lib/readline/doc/rluser.texi
	- document new optional increment in brace expansion
	- document new zero-padded fixed-width integer brace expansion
	- document new `dabbrev-expand' bindable readline command
	- document new effects of `bind -x' setting and reading the values of
	  READLINE_LINE and READLINE_POINT
	- document new |& synonym for `2>&1 |' pipeline operator

				   5/26
				   ----
parse.y	- recognize new ;& and ;;& case action list terminator tokens and
	  implement them in the grammar, setting CASEPAT_FALLTHROUGH and
	  CASEPAT_TESTNEXT flags as appropriate

print_cmd.c
	- print new ;& and ;;& case clause action list terminators as
	  appropriate

execute_cmd.c
	- implement new case clause action list terminators:
		;& - fall through to actions associated with next pattern list
		;;& - fall through to tests in next pattern list

doc/{bash.1,bashref.texi}
	- document new ;& and ;;& case clause action list terminators

				   5/28
				   ----
jobs.c
	- change waitchld so it treats SIGCHLD like SIGINT if `wait' is being
	  executed, and allows wait to jump out before running any trap set
	  on SIGCHLD.  Fixes debian bug #483016 reported by Miroslav Rudisin
	  <miero@atrey.karlin.mff.cuni.cz>
	- run_sigchld_trap is no longer static, so the trap code in trap.c
	  can call it
	- change run_sigchld_trap to call set_impossible_sigchld_trap instead
	  of just using a call to restore_default_signal

jobs.h
	- new extern declaration for run_sigchld_trap

trap.c
	- fix run_pending_traps to run a SIGCHLD trap if the trap handler isn't
	  set to IMPOSSIBLE_TRAP_HANDLER
	- in trap_handler, don't reset the SIGCHLD trap handler to trap_handler
	  if MUST_REINSTALL_SIGHANDLERS is defined
	- new function, set_impossible_sigchld_handler, sets the trap string
	  associated with SIGCHLD to IMPOSSIBLE_TRAP_HANDLER; used as a sentinel
	  by run_sigchld_trap and maybe_set_sigchld_handler
	- change maybe_set_sigchld_handler to set the SIGCHLD trap string only
	  if the current value is IMPOSSIBLE_TRAP_HANDLER.  This ensures that
	  any traps on SIGCHLD set in a SIGCHLD handler will persist.  Fixes
	  debian bug #483016 reported by Miroslav Rudisin
	  <miero@atrey.karlin.mff.cuni.cz>

trap.h
	- new extern declaration for set_impossible_sigchld_trap

				   5/31
				   ----
parse.y
	- new function: parse_comsub(), parses $(...) by parsing command
	  between parens and making sure the next token is `)'.  From
	  the bash-4.0-devel branch
	- new function: xparse_dolparen, helper function for parsing
	  command substitutions in $(...).  Called from subst.c to extract
	  a command substitution during word expansion.  From bash-4.0-devel
	  branch
	- new function: rewind_input_stream().  Rewinds bash_input.location.string
	  back to where it was before the shell parsed a $() command
	  substitution.  From bash-4.0-devel branch
	- changes to parse_matched_pair to combine most of the flag variables
	  (was_dollar, in_comment, and so on) into a local flags word

				    6/2
				    ---
parse.y
	- call trim_pathname, which retains only the last $PROMPT_DIRTRIM
	  directories and replaces the intervening characters with `...',
	  when expanding \w and \W

doc/{bash.1,bashref.texi}
	- document the effect of setting PROMPT_DIRTRIM

				    6/3
				    ---
builtins/ulimit.def
	- make the multiplier (block size) for -c and -f 512 bytes only if in
	  Posix mode and 1024 bytes otherwise (as in previous versions).  Uses
	  POSIXBLK and BLOCK_SIZE defines to parameterize size based on value
	  of posixly_correct

doc/bashref.texi
	- document this addition to posix mode

builtins/common.c
	- change get_numeric_arg to have a calling sequence and return value
	  more closely mimicking general.c:legal_number(), with the addition
	  of a flags word
	- add extra value for `fatal' argument to get_numeric_arg to force it
	  to return failure to the caller rather than longjmping

builtins/common.h
	- change prototype declaration for get_numeric_arg

builtins/{break,shift}.def
	- change calls to get_numeric_arg to deal with new semantics and calling
	  sequence

builtins/history.def
	- display_history now returns an int
	- change calling sequence for get_numeric_arg in display_history
	- display_history now returns failure to the caller if get_numeric_arg
	  detects an invalid number, rather than jumping back to the top level
	- use value returned by display_history as return status of history
	  builtin, filtered through sh_chkwrite
	- history no longer aborts compound commands on invalid arguments.
	  fixes problem reported by Chu Li <chul@cn.fujitsu.com>

{braces,subst}.c
      - extract_command_subst now takes a third flags argument; passed flags
	are ORd into flags passed to other functions; changed callers

subst.h
	- move SX_* defines here from subst.c so parse.y:xparse_dolparen can
	  see them and behave appropriately
	- extract_command_subst now takes a third flags argument; change
	  prototype

subst.c
	- change extract_command_subst to call xparse_dolparen when extracting
	  a $() construct
	- change calls to extract_delimited_string to extract_command_subst
	  as appropriate
	- if command_substitute returns a NULL word desc, don't call
	  dispose_word_desc on it

parse.y
	- change xparse_dolparen to use the SX_* flags now in subst.h

				   6/16
				   ----
subst.c
	- in quote_list, set W_HASQUOTEDNULL flag in the word if quote_string
	  turns "" into CTLNUL
	- in dequote_list, turn off W_HASQUOTEDNULL flag in the word if
	  dequote_string turns CTLNUL into ""
	- new function, string_list_pos_params, encapsulates everything
	  needed to turn the positional parameters or an array indexed with
	  '@' or '*' into a string, including taking care of quoting and
	  using the first char of $IFS, when used in another expansion like
	  pattern removal or pattern substitution
	- change list_remove_pattern, pos_params, pos_params_pat_subst to
	  call string_list_pos_params.  Fixes problems reported by
	  Stephane Chazelas <stephane_chazelas@yahoo.fr>

				   6/22
				   ----
variables.h
	- include assoc.h for associative arrays
	- defines for case-modifying expansions and associative array variables
	- sh_var_assign_func_t functions now take an extra char * parameter

				   6/25
				   ----
variables.c
	- change declarations and definitions of sh_var_assign_func_t functions
	  to add the extra char * parameter: null_assign, null_array_assign,
	  assign_seconds, assign_random, assign_lineno, assign_subshell,
	  assign_dirstack
	- change calls to var->assign_func to add extra char * argument
	- broke part of body of dispose_variable out into a new function,
	  dispose_variable_value, which knows how to free all kinds of shell
	  variable data
	- changes to deal with variables with the internal `nofree' attribute

arrayfunc.c
	- change calls to var->assign_func to add extra char * argument
	- bind_array_var_internal now takes an extra `char *key' argument
	- additions for associative array implementation; from bash-4.0-devel
	  tree

arrayfunc.[ch],subst.c
	- expand_compound_array_assignment now takes the variable as the first
	  argument (SHELL_VAR *); changed function definition and callers

builtins/set.def
	- changes to handle associative arrays in `unset'

{execute_cmd,command}.h
	- definitions for coproc implementation; from bash-4.0-devel tree

variables.c
	- new functions for associative arrays: make_new_assoc_variable,
	  make_local_assoc_variable

				   6/26
				   ----
variables.c
	- more infrastructure for associative arrays; from bash-4.0-devel tree
	- infrastructure for handling assignments to variables with
	  case-modifying attributes; from bash-4.0-devel tree

config.h.in
	- add #defines controlling case-modifying variable attributes and word
	  expansions

configure.in
	- add enable options for case-modifying variable attributes and word
	  expansions (--enable-casemod-attributes and --enable-casemod-expansions,
	  respectively); from bash-4.0-devel tree

execute_cmd.c
	- add code to fix_assignment_words to handle assignment statements to
	  "assignment builtins" that seem to be associative arrays.  Imperfect

subst.c
	- array_remove_pattern now takes a SHELL_VAR * as its first argument
	  instead of an ARRAY *; from the bash-4.0-devel tree
	- changes to array_length_reference for associative arrays; from the
	  bash-4.0-devel tree
	- changes to get_var_and_type for associative arrays; from the
	  bash-4.0-devel tree
	- changes to parameter_brace_substring for associative arrays; from the
	  bash-4.0-devel tree
	- changes to param_expand for associative arrays; from the
	  bash-4.0-devel tree

builtins/declare.def
	- changes for associative arrays: new `-A' option, changes to make
	  local and global associative array variables; from the bash-4.0-devel
	  tree

				   6/27
				   ----
execute_cmd.c
	- in execute_command_internal, when short-circuiting execution
	  because `breaking' or `continuing' is non-zero, preserve the exit
	  status by returning `last_command_exit_value' instead of an
	  unconditional EXECUTION_SUCCESS.  Fixes bug reported by Roman
	  Rakus <rrakus@redhat.com>

				   6/28
				   ----
variables.c
	- fix get_var_and_type to appropriately handle references like
	  ${varname[0]}, where `varname' is a scalar variable

make_cmd.[ch],parse.y
	- make_here_document now takes a second argument: the current line
	  number; changed caller (gather_here_documents)

builtins/setattr.def
	- added support for associative arrays and the `-A' variable attribute
	  option; from the bash-4.0-devel tree

subst.c
	- change code that transforms `declare -A xxx=(yyy)' to perform the
	  internal `declare -A xxx' before doing the variable assignment,
	  because associative arrays have to be declared before being assigned
	  to as such; uses new function make_internal_declare

				   6/30
				   ----
subst.[ch]
	- dequote_escapes is now external; add declaration in subst.h
	- remove_quoted_nulls is now external; add declaration in subst.h

array.[ch]
	- new functions for completeness:  array_dequote, array_dequote_escapes,
	  array_remove_quoted_nulls
	- array_subrange now calls array_remove_quoted_nulls for "${array[*]}".
	  Fixes bug reported by Vitor De Araujo <ux386@yahoo.com.br>
	- array_patsub now calls array_remove_quoted_nulls for "${array[*]}"
	- array_modcase now calls array_remove_quoted_nulls for "${array[*]}"
	- array_patsub now handles the mflags&MATCH_QUOTED case appropriately
	  (that implies "${array[@]}")

subst.c
	- new functions for case-modifying word expansion suppport:
	  pos_params_casemod, parameter_brace_casemod; from bash-4.0-devel branch

assoc.c
	- new functions for completeness: assoc_remove_quoted_nulls
	- assoc_patsub now calls assoc_remove_quoted_nulls for "${assoc[*]}"
	- assoc_modcase now calls assoc_remove_quoted_nulls for "${array[*]}"
	- assoc_patsub now handles the mflags&MATCH_QUOTED case appropriately
	  (that implies "${assoc[@]}")

				    7/1
				    ---
assoc.[ch]
	- new function, assoc_subrange: takes a hash table, converts it to a
	  word list, and performs the subrange and indexing on that list
	- new functions for completeness: assoc_dequote, assoc_dequote_escapes

subst.c
	- verify_substring_values now takes the variable SHELL_VAR * as its
	  new first argument; changed callers
	- change verify_substring_values to handle associative arrays using the
	  number of elements as the upper bound
	- brought in code to do case-modifying word expansions from
	  bash-4.0-devel branch, conditional on CASEMOD_EXPANSIONS

input.c
	- if the read(2) in getc_with_restart returns -1/EAGAIN, turn off
	  non-blocking mode on the file descriptor and try again.  Fixes
	  problem reported by Glynn Clements <glynn@clements.plus.com>

				    7/2
				    ---
doc/{bash.1,bashref.texi}
	- documented new case-modifying word expansions

make_cmd.c
	- change make_here_document to display a warning message including the
	  start line of a here document if it ends up delimited by EOF.
	  Addresses issue raised by Richard Neill <rn214@hermes.cam.ac.uk>

subst.c
	- in do_assignment_internal, make sure the `invisible' attribute is
	  unset before returning success

				    7/3
				    ---
config-top.h
	- add `CASEMOD_CAPCASE' define to include or exclude the ~[~] word
	  expansion and the `capcase' variable attribute (declare -c)

builtins/declare.def
	- add support for manipulating the case-modifying attributes (new
	  declare -clu); from bash-4.0-devel branch

builtins/setattr.def
	- add support for reporting case-modifying attributes (-clu attributes);
	  from bash-4.0-devel branch

doc/{bash.1,bashref.texi}
	- specify that the read builtin timing out results in a return value
	  greater than 128
	- document new `-l' and `-u' options to declare/typeset/local.  Leave
	  `-c' undocumented for now

				    7/4
				    ---
make_cmd.[ch]
	- make_coproc_command: construct a coproc; from bash-4.0-devel tree

dispose_cmd.c
	- dispose coproc command; from bash-4.0-devel tree

copy_cmd.c
	- copy a coproc command; from bash-4.0-devel tree

print_cmd.c
	- print a coproc command; from bash-4.0-devel tree

shell.c
	- dispoe the current coproc on shell exit; from bash-4.0-devel tree

redir.c
	- when closing redirects as part of user redirections, check whether
	  or not active coprocess fds are being closed and close the coproc
	  if so; from bash-4.0-devel tree

config.h.in
	- add define for COPROCESS_SUPPORT to include coprocesses

configure.in
	- add support for configuring coprocesses into and out of the build

jobs.c
	- in waitchld, check whether or not a coproc processs has exited;
	  from the bash-4.0-devel tree

				    7/5
				    ---
doc/bashref.texi
	- document new --enable-coprocesses option that includes coprocess
	  support

execute_cmd.c
	- add functions for coprocess support, including execute_coproc and
	  code to call it when command->type == cm_coproc; from
	  bash-4.0-devel tree

lib/sh/fdprintf.c
	- new library function fdprintf(int fd, const char *format, ...);
	  printf to a file descriptor

{configure,config.h}.in
	- support for detecting fdprintf and compiling in replacement

Makefile.in,lib/sh/Makefile.in
	- add rules to include fdprintf.o

doc/{bash.1,bashref.texi}
	- documented coprocesses and `coproc' reserved word

				    7/7
				    ---
subst.c
	- fix array_length_reference to use MB_STRLEN instead of STRLEN, so
	  multibyte characters in array values are computed correctly.  Fixes
	  bug reported by Wang Xin <wxinee@gmail.com>

				   7/10
				   ----
jobs.c
	- new function, maybe_give_terminal_to (old, new, flags), sets the
	  terminal pgrp to NEW if and only if it's currently set to OLD
	- call maybe_give_terminal_to when the parent sets the terminal pgrp
	  to the pipeline pgrp in stop_pipeline, so we don't give the
	  terminal to the new job's pgrp unless it's currently owned by the
	  shell.  Fixes race condition described by Joe Peterson
	  <joe@skyrush.com>, where parent bash may change tty pgrp after a
	  grandchild (interactive bash child of su) has changed it to
	  something else.  The call to maybe_give_terminal_to makes explicit
	  a previously-implicit assumption

aclocal.m4
	- remove dependency on writable /tmp by creating directories in
	  build directory

shell.c
	- make changes to how bash sets no_line_editing and running_under_emacs
	  to deal with various emacs terminal emulators; use better check
	  for `eterm', since bash sends $PWD to eterm with control sequences
	  that confuse other programs.  Problem reported by Micah Cowan
	  <micah@cowan.name>


				   7/12
				   ----
print_cmd.c
	- break code that prints here-documents into two functions:
	  print_heredoc_header, which prints the operator and delimiter, and
	  print_heredoc_body, which prints the body text and closing delimiter
	- change print_redirection to call print_heredoc_{header,body}
	- sentinel variable, printing_connection, used when printing a command
	  of type `connection' (|, &&, ||, etc.)
	- change print_redirection_list to save any here documents it finds
	  while printing a connection and save them in `deferred_heredocs'
	- new function, print_deferred_heredocs, called from print_redirection
	  in the cm_connection case, calls print_heredoc_header for all the
	  here documents, then prints the operator (|, &&, ||, etc.), then
	  the here-document body.  This preserves syntactic correctness; the
	  old code printed the control operator after the body of the here
	  document.  Fixes bug reported by <buport@figpost.com>

				   7/16
				   ----
locale.c
	- in set_locale_var, print a warning message if setlocale() fails any
	  time it's called -- required some code restructuring

				   7/19
				   ----
support/shobj-conf
	- support for mingw32, contributed by Carlo Bramix
	  <carlo.bramix@libero.it>

				   7/23
				   ----
execute_cmd.c
	- added support (currently unused) to manage a list of coprocs

				   7/25
				   ----
bashline.c
	- add extern declarations for literal_history and force_append_history

builtins/shopt.def
	- include "bashhist.h" instead of having extern declarations for the
	  appropriate history variables

parser.h
	- new parser_state value: PST_HEREDOC, set when reading body of here-
	  document in parse.y:read_secondary_line

parse.y
	- set PST_HEREDOC bit in parser_state when reading a secondary line
	  for the body of a here-document
	- change read_secondary_line to save lines in the body of a here-
	  document in the shell history list if remember_on_history is
	  set.  Fixes bug reported by Gene Golub <gene_golub@hotmail.com>

				    8/4
				    ---
configure.in
	- changed to 4.0-alpha

lib/readline/readline.h
	- changed constants to reflect readline-6.0 version

				   8/11
				   ----
lib/readline/signals.c
	- make sure we don't use SIGWINCH without checking whether or not it's
	  defined.  Fix from Pedro Alves <pedro@codesourcery.com>

				   8/12
				   ----

COPYING
	- updated to GPLv3; edits in every file with a copyright or license
	  declaration to update to gpl3

version.c
	- update extended version info to latest gnu standard

				   8/17
				   ----
subst.c
	- change exp_jump_to_top_level to only call top_level_cleanup if
	  parse_and_execute_level is 0.  If it's not, the longjmp to
	  parse_and_execute will run the unwind-protect stack.  Fixes bug
	  most recently reported by Roman Rakus <rrakus@redhat.com>

				   8/18
				   ----
support/config.{guess,sub}
	- updated to newer versions from autoconf-2.62 distribution

				   8/20
				   ----
subst.c
	- fixed parameter_brace_substring to differentiate between indexed and
	  associative arrays when computing second offset, instead of
	  assuming indexed array

				   8/21
				   ----
support/xcase.c
	- simple program to convert input from lower to uppercase and vice
	  versa.  Now used by coproc test suite, since `tr -u' is not
	  portable.

				   8/22
				   ----
doc/bash.1
	- fixed description of the bindable edit-and-execute commands to note
	  they check $VISUAL first, instead of $FCEDIT.  Fixed bug reported
	  by

[bash-4.0-alpha frozen]

				   8/28
				   ----
[bash-4.0-alpha released]

				    9/1
				    ---
builtins/evalstring.c
	- fixed typo in parse_string (ostring used uninitialized).  Bug
	  reported by Andreas Schwab <schwab@suse.de>

subst.c
	- fix return value of parameter_brace_expand to set the
	  W_HASQUOTEDNULL flag in the returned WORD_DESC * if the return value
	  from parameter_brace_remove_pattern is a quoted null string.  Fixes
	  bug reported by Andreas Schwab <schwab@suse.de>
	- set the W_HASQUOTEDNULL flag in the return value from
	  parameter_brace_expand if the return value from parameter_brace_patsub
	  is a quoted null string

				    9/6
				    ---
builtins/read.def
	- change read -t 0 to return success if there is input available to be
	  read -- allows scripts to poll for input.  Uses input_avail libsh
	  function

				    9/9
				    ---
externs.h
	- fix extern fpurge declaration -- use HAVE_DECL_FPURGE instead of
	  NEED_FPURGE_DECL, since the former is set by `configure'

jobs.h
	- add extern declaration for close_pgrp_pipe
	- add a new job state JNONE (-1) to the enum

jobs.c
	- include execute_cmd.h for extern declarations for coproc functions

subst.c
	- include builtins/builtext.h for extern declarations for functions
	  implementing builtins (e.g., declare_builtin)

arrayfunc.c
	- include "pathexp.h" for extern declaration for glob_char_p

braces.c
	- add extern declaration for `asprintf'

lib/readline/rlprivate.h
	- add extern declarations for _rl_trace, _rl_tropen

lib/sh/zgetline.c
	- add extern declarations for zread, zreadc

lib/sh/mktime.c
	- include "bashansi.h" for string function declarations

builtins/common.h
	- add extern declaration for parse_string

trap.c
	- include jobs.h for extern declaration for run_sigchld_trap

general.c
	- fix call to strtoimax in legal_number; if ep == string when function
	  returns, the number was not converted, even if errno is not set.
	  Fix from Paul Jarc <prj@case.edu>

				   9/11
				   ----
[prayers for the victims of 9/11/2001]

builtins/return.def
	- call no_options, as Posix requires.  This also has the effect of
	  disallowing negative return values unless they're prefixed by `--'

				   9/13
				   ----
builtins/bind.def
	- add an error message when bind is used without line editing active,
	  instead of just returning an error status

variables.c
	- make sure make_local_variable never creates visible variables with
	  a value, whether or not a variable with the same name existed in a
	  previous context.  This is consistent with ksh93.  Fix from
	  <neil@s-z.org>

				   9/16
				   ----
execute_cmd.c
	- add call to CHECK_TERMSIG in shell_execve after the call to execve
	  returns.  Recommended by Roman Rakus <rrakus@redhat.com>
	- add QUIT check in execute_connection after executing first command
	  in a `&' connection

				   9/22
				   ----
execute_cmd.c
	- new semaphore variable, executing_list, incremented every time a
	  list (command1;command2 or command1 || command2 or command1 &&
	  command2) is executed; used as sentinel for rest of shell

sig.c,builtins/evalstring.c
	- set executing_list to 0 when throwing execution back to top level;
	  make sure to unwind-protect it in appropriate places

jobs.c
	- if a pipeline is killed by SIGINT while executing a list (when
	  executing_list is non-zero), make sure the shell acts as if an
	  interrupt occurred.  The behavior is dependent on the shell
	  compatibility level being > 32 (bash-4.0 and above)

				   9/23
				   ----
redir.c
	- don't bother reporting an error with a file descriptor, even if
	  the errno is EBADF, if the redirection error (e.g., NOCLOBBER)
	  can't have anything to do with the fd.  Fixes bug reported by
	  "David A. Harding" <dave@dtrt.org>, debian bug #499633.

				   9/24
  				   ----
builtins/declare.def
	- make `declare [option] var' (and the `typeset' equivalent) create
	  invisible variables, instead of assigning the null string to a
	  visible variable.  Fixes bug reported by Bernd Eggink <monoped@sudrala.de>

				   9/25
				   ----
builtins/common.[ch]
	- new function, builtin_warning(), like builtin_error but for warning
	  messages

builtins/bind.def
	- experimental: print a warning, but go on, if line editing not active
	  when bind is invoked.  Suggested by Rocky Bernstein
	  <rocky.bernstein@gmail.com>

				   10/3
				   ----
test.c
	- use same_file instead of directly comparing st_dev and st_ino when
	  comparing files in filecomp().  From mingw32 patches submitted
	  by Hector Chu <hkcc2@cantab.net>

				   10/4
				   ----

redir.c
	- in redirection_error(), use `error' instead of errno when comparing
	  against EBADF.  From mingw32 patches submitted by Hector Chu
	  <hkcc2@cantab.net>

shell.c
	- in unset_bash_input(), reset bash_input.type to st_none after
	  closing the default buffered fd.  From mingw32 patches submitted
	  by Hector Chu <hkcc2@cantab.net>

builtins/cd.def
	- ignore CDPATH when in privileged mode.  Suggested by Paul Jarc
	  <prj@po.cwru.edu>

variables.c
	- change sv_globignore to only act if privileged mode is not enabled.
	  Suggested by Paul Jarc <prj@po.cwru.edu>

doc/bash.1,bashref.texi
	- document new treatment of CDPATH and GLOBIGNORE when privileged
	  mode is enabled

builtins/read.def
	- change prompt printing to occur after terminal is set to no-echo
	  mode.  Based on suggestion from Stephane Chazelas
	  <stephane_chazelas@yahoo.fr>

lib/readline/signals.c
	- new variables to keep track of special characters corresponding to
	  SIGINT, SIGQUIT, and SIGTSTP
	- new variable to keep track of whether tty is echoing control
	  characters corresponding to SIGINT, SIGQUIT, and SIGTSTP
	- new function, _rl_echo_signal_char(int sig) to display the tty
	  special char generating SIGINT, SIGQUIT, or SIGTSTP.  Based on
	  idea and code from Joe Peterson <joe@skyrush.com>
	- call rl_echo_signal_char in rl_signal_handler: if the terminal
	  settings indicate it, readline will echo characters that generate
	  keyboard signals

lib/readline/rltty.c
	- set _rl_intr_char, _rl_quit_char, and _rl_susp_char to special
	  characters that generate signals from keyboard
	- set _rl_echoctl if ECHOCTL tty flag is set

lib/readline/rlprivate.h
	- extern declarations for _rl_intr_char, _rl_quit_char, and
	  _rl_susp_char
	- extern declaration for _rl_echoctl

lib/readline/readline.h
	- extern declaration for rl_echo_signal_char()

lib/readline/doc/rltech.texi
	- document rl_echo_signal_handler(): available for applications
	  that install their own signal handlers

				   10/5
				   ----
execute_cmd.c
	- fix errexit logic to not cause the shell to exit when a command in
	  a pipeline fails.  Fixes bug reported by Marcin Owsiany
	  <marcin@owsiany.pl>

				   10/14
				   -----
builtins/evalstring.c
	- don't short-circuit execution in parse_and_execute if we want to
	  run an exit trap.  Fixes bug reported by Steffen Kiess
	  <s-kiess@web.de>

				   10/18
				   -----
parse.y
	- fix error production to only call YYACCEPT if the shell is currently
	  interactive and not in parse_and_execute (so parser errors in
	  things like eval will correctly set $?).  Fixes bug reported by
	  marco-oweber@gmx.de

execute_cmd.c
	- make sure variable name errors in execute_for_command and non-
	  identifier function names in execute_intern_function set the
	  return status to EX_BADUSAGE (2), not EX_USAGE (258)

parser.h
	- new parser state, PST_REPARSE

parse.y
	- turn PST_REPARSE on in parse_string_to_word_list
	- in parse_matched_pair, if parsing a single-quoted string and
	  PST_REPARSE is set, don't requote CTLESC or CTLNUL.  Fixes bug with
	  compound array assignment using $'\x7f' reported by Antonio Macchi
	  <antonio_macchi@alice.it>

				   10/23
				   -----
configure.in
	- define LOCAL_LDFLAGS as `-z interpose' on Solaris 8, 9, and 10 to
	  allow the bash malloc to interpose the libc malloc when called by
	  library functions pre-bound to the libc malloc.  Suggested by
	  Serge Dussud <Serge.Dussud@Sun.COM>

				   10/26
				   -----
doc/bash.1
	- add single-sentence descriptions to rest of parameter expansions.
	  Suggested by Ken Irving <fnkci@uaf.edu>

				   10/27
				   -----
subst.c
	- rearrange code in skip_to_delims to allow quote characters and other
	  shell expansion characters to be delimiters
	- add new flags value for inverting search: skip to the next character
	  NOT in the set of delimiters passed as an argument

subst.h
	- define for new SD_INVERT flag value for skip_to_delims

				   10/28
				   -----
bashline.c
	- new bindable functions: shell-forward-word and shell-backward-word.
	  Like forward-word and backward-word, but understand shell quoting
	  and use shell metacharacters and whitespace as delimiters.
	  Suggested by Andre Majorel <amajorel@teaser.fr>
	- new bindable functions: shell-kill-word and shell-backward-kill-word.
	  Like kill-word and backward-kill-word, but understand shell quoting
	  and  use shell metacharacters and whitespace as delimiters.
	  Suggested by Andre Majorel <amajorel@teaser.fr>

doc/bash.1,lib/readline/doc/rluser.texi
	- documented shell-forward-word and shell-backward-word
	- documented shell-kill-word and shell-backward-kill-word

				   11/1
				   ----
redir.c
 	- add extra argument to add_undo_redirect: fdbase.  FD used to save
	  a file descriptor must be > fdbase if fdbase >= SHELL_FD_BASE.  A
	  value of -1 for fdbase means to just use SHELL_FD_BASE.  Fixes bug
	  with 0<&10 reported by Clark Jian Wang <dearvoid@gmail.com>

				   11/5
				   ----
unwind_prot.c
	- new function: have_unwind_protects(); returns 1 if unwind_protect_list
	  is not empty

unwind_prot.h
	- extern declaration for have_unwind_protects

builtins/evalstring.c
	- in parse_and_execute_cleanup, make sure that we don't call
	  run_unwind_frame and expect it to decrement parse_and_execute_level
	  if there's no unwind_protect_list, since there's a while loop in
	  throw_to_top_level that calls parse_and_execute_cleanup as long as
	  parse_and_execute_level is non-zero

				   11/9
				   ----
variables.c
	- fix the assign function for COMP_WORDBREAKS to allocate new memory
	  to store as the variable's value, to avoid freeing memory twice
	  if the variable is unset after rl_completer_word_break_characters
	  is freed and reallocated.  Fix from Mike Stroyan <mike@stroyan.net

				   11/11
				   -----
bashline.c
	- new function to reset the value of rl_completer_word_break_characters
	  while honoring setting of `hostcomplete': reset_completer_word_break_chars.

bashline.h
	- new extern declaration for reset_completer_word_break_chars.

variables.c
	- call reset_completer_word_break_chars in sv_comp_wordbreaks when the
	  variable is unset

[bash-4.0-beta frozen]

				   11/16
				   -----
subst.c
	- call set_pipestatus_from_exit in exp_jump_to_top_level so that
	  failed expansions that set $? will set $PIPESTATUS.  Fixes bug
	  reported by Eric Blake <ebb9@byu.net>

				   11/20
				   -----
general.c
	- new 'file_exists(fn)' primitive; just calls stat(2)

general.h
	- new extern declaration for file_exists

bashline.c
	- add `~' to rl_filename_quote_characters so make_quoted_replacement
	  will call bash_quote_filename for words containing `~'.  Then
	  bash_quote_filename can make choices based on that
	- change quote_word_break_chars to backslash-quote the tilde in a
	  filename with a leading tilde that exists in the current directory,
	  since we want to inhibit tilde expansion in this case

execute_cmd.c
	- call file_isdir from shell_execve instead of stat(2) directly

bashhist.c
	- use file_exists and file_isdir primitives instead of calling stat

				   11/21
				   -----
redir.c
	- When undoing saving of non-standard file descriptors (>=3) using
	  file descriptors >= SHELL_FD_BASE, we set the saving fd to be
	  close-on-exec and use a flag (RX_SAVCLEXEC) to decide how to set
	  close-on-exec when the fd is restored.  Set flag in add_undo_redirect,
	  check in do_redirection_internal.  Fixes problem reported by Andreas
	  Schwab <schwab@suse.de>

				   11/26
				   -----
subst.c
	- fix param_expand to have expansions of $@ and $* exit the shell if
	  there are no positional parameters and `set -u' is enabled.  Fixes
	  bug reported by Dan Jacobson <jidanni@jidanni.org>

				   11/27
				   -----
lib/readline/display.c
	- fix update_line to not call space_to_eol if current cursor position
	  (_rl_last_c_pos) indicates that we're already at end of line.
	  Partial fix for bug reported by Mike Frysinger <vapier@gentoo.org>
	- in update_line, don't call insert_some_chars if that will start
	  before the last invisible character in the prompt string and not
	  draw the entire prompt string.  More of the partial fix for bug
	  reported by Mike Frysinger <vapier@gentoo.org>
	- fix update_line to adjust _rl_last_c_pos by wrap_offset when adding
	  characters beginning before the last invisible character in the
	  prompt.  New code is same as previously existed in a different code
	  path.  Rest of fix for bug from Mike Frysinger <vapier@gentoo.org>
	- fix assignment of newline breaks (inv_lbreaks) to correctly account
	  for prompts longer than two screen lines containing invisible
	  characters.  The assumption is that part of the invisible characters
	  are on the first line (prompt_invis_chars_first_line) and the
	  remainder are on the last (wrap_offset - prompt_invis_chars_first_line).
	  Fix is in rl_redisplay.  part of fix for bug reported by
	  "Wesley J. Landaker" <wjl@icecavern.net> in
	  http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=265182
	  [TENTATIVE]
	- fix _rl_move_cursor_relative to correctly offset `dpos' by `woff'
	  when there are invisible characters on lines after the second by
	  using (_rl_screenwidth*_rl_last_v_pos) when seeing whether or not
	  we just wrote some invisible characters.  Rest of fix for bug
	  reported in http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=265182
	  [TENTATIVE]

				   12/11
				   -----
sig.c
	- reset the execution context before running the exit trap in
	  termsig_handler

general.c
	- set and unset terminate_immediately like interrupt_immediately in
	  bash_tilde_expand

builtins/read.def
	- change terminate_immediately to a counter instead of a flag, as
	  interrupt_immediately is used

lib/readline/display.c
	- slight change to fix from 11/27 to deal with prompts longer than a
	  screen line where the invisible characters all appear after the
	  line wrap.  Fixes bug reported by Andreas Schwab <schwab@suse.de>

builtins/{echo,printf}.def
	- increment terminate_immediately at entry; decrement before returning.
	  Fix for bug reported by Ralf.Wildenhues@gmx.de

				   12/16
				   -----
subst.c
	- fix off-by-one error in /dev/fd version of add_fifo_list; make
	  sure we add to totfds when it is == fd, not just when fd > totfds.
	  Fixes bug reported by marciso@gmail.com

[bash-4.0-beta2 frozen]

				   12/29
				   -----
doc/{bash.1,bashref.texi}
	- document more clearly that when not in Posix mode, command
	  substitution does not inherit the -e option.  From bug report from
	  Freddy Vulto <fvulto@gmail.com>

{execute_cmd,sig,builtins/evalstring}.c
	- sentinel variable to keep track of whether or not we're supposed to
	  ignore the failure status of a command executed in a command
	  substitution even if the `-e' option is set: comsub_ignore_return
	- increment and decrement comsub_ignore_return in execute_simple_command
	  before calling expand_words
	- in parse_and_execute, if comsub_ignore_return is non-zero and the
	  SUBSHELL_COMSUB bit is set in subshell_environment, enable the
	  CMD_IGNORE_RETURN flag in every command executed from the passed
	  string.  Fixes problem reported by Freddy Vulto <fvulto@gmail.com>
	- make sure to reset comsub_ignore_return every time we throw to the
	  top level, like executing_list flag

				 1/2/2009
				 --------
parse.y
	- fix to rewind_input_stream to handle case of $(...) command
	  substitution followed by a quoted literal newline.  Report and fix
	  from Andreas Schwab <schwab@suse.de>

				    1/7
				    ---

subst.c
	- fix match_wpattern and match_upattern to prefix a `*' to the
	  pattern even if it starts with a `*(' (if extglob is enabled)
	  before checking whether or not it can match anywhere in the
	  string.  Fixes bug reported by os@sernet.de.

[bash-4.0-rc1 frozen]

				    1/9
				    ---
locale.c
	- since setlocale() doesn't set errno to anything meaningful,
	  don't include the strerror() result in the error message if
	  it fails
	- make sure the error messages printed when setlocale fails are
	  localizable

				   1/11
				   ----
lib/readline/histexpand.c
	- make sure that every time history_no_expand_chars is tested, we
	  also call the history_inhibit_expansion_function if it's set.
	  Fixes bug reported by Yang Zhang <yanghatespam@gmail.com>

				   1/12
				   ----
trap.c
	- make sure to call parse_and_execute with the SEVAL_RESETLINE bit
	  set in the flags so it will reset the line number when running
	  the trap commands.  Partial fix for bug reported by
	  peter360@fastmail.us

				   1/14
				   ----
builtins/reserved.def
	- document `coproc' so it can be used with `help' builtin.  Pointed
	  out by Pierre Gaston <pgas@freeshell.org>

lib/sh/casemod.c
	- added two new flags: CASE_UPFIRST and CASE_LOWFIRST to casemod
	  the first character of the passed string and pass the rest
	  through unchanged.  Fixes bug reported by Jan Schampera
	  <jan.schampera@web.de>

externs.h
	- new defines for CASE_UPFIRST and CASE_LOWFIRST

subst.c
	- use CASE_UPFIRST for ^ and CASE_LOWFIRST for , casemod operators

builtins/mapfile.def
	- call zreset() before calling first zgetline(), to clean out any
	  remaining data in local buffer used by zreadc.  Fixes bug
	  reported by Pierre Gaston <pierre.gaston@gmail.com>

				   1/15
				   ----
lib/sh/zread.c
	- renamed zreadintr to zreadretry -- not perfect, but better
	- new functions: zreadintr, which just calls read so it can be
	  interruptible, and zreadcintr, which is like zreadc but uses
	  zreadintr to fill the buffer

lib/sh/zgetline.c
	- in zgetline, when zread/zreadc return <= 0, make sure line is
	  non-null before assigning to line[nr]

builtins/mapfile.def
	- return an error right away if the supplied array variable name
	  refers to a readonly or noassign array
	- set interrupt_immediately so calls to zgetline can be
	  interrupted.  Fixes bug reported by Pierre Gaston
	  <pierre.gaston@gmail.com>
	- if interactive, pass the SEVAL_INTERACT and SEVAL_NOHIST flags
	  to parse_and_execute when calling callbacks.  Fixes bug reported
	  by Pierre Gaston <pierre.gaston@gmail.com>
	- add `readarray' as a synonym for mapfile

doc/{bash.1,bashref.texi}
	- document behavior of mapfile builtin adding index of array element
	  to be assigned as additional argument to callback string.  Reported
	  by Pierre Gaston <pierre.gaston@gmail.com>
	- document readarray as synonym for mapfile

builtins/common.c
	- new error function, sh_ttyerror(set), prints an error message having
	  to do with setting or getting terminal attributes

builtins/read.def
	- print error message if read fails to set terminal attributes

				   1/16
				   ----
execute_cmd.c
	- new function, coproc_reap, calls coproc_dispose if sh_coproc is
	  marked as COPROC_DEAD
	- new function, cpl_reap, disposes coprocs marked as COPROC_DEAD
	  from coproc list
	- change coproc_pidchk to just mark the coproc as dead instead of
	  calling coproc_dispose, so we don't call unsafe functions from
	  a signal handler.  Fixes bug reported by Andreas Schwab
	  <schwab@suse.de>

execute_cmd.h
	- new extern declaration for coproc_reap

command.h
	- new flags for c_flags member of a struct coproc

{jobs,nojobs}.c
	- add call to coproc_reap in cleanup_dead_jobs, which will do the
	  right queueing or blocking of SIGCHLD

trap.c
	- modify change from 1/12 to not reset the line number when running
	  the DEBUG and RETURN traps

				   1/18
				   ----
lib/sh/casemod.c
	- change default operations to work on entire passed string instead
	  of breaking into words at non-alpha-numerics.  Use new
	  CASE_USEWORDS flag to enable by-word behavior.  Fixes bug reported
	  by Jan Schampera <jan.schampera@web.de>

builtins/printf.def
	- in vbprintf, bracket each call to vsnprintf (which uses the args
	  passed to vbprintf) with SH_VA_START and va_end, so we can
	  reninitialize the argument list for each call.  This is actually
	  what the C standard requires.  Fixes bug that caused printf -b
	  to `ignore' first % format specifier if it came first in the
	  string.  Reported by David Leverton <levertond@googlemail.com>

builtins/mapfile.def
	- start the line count at 1, since it doesn't get incremented before
	  (or after) reading the first line, so things like
	  `mapfile -n 5 -c 1 -C 'echo foo' array < file' work right and call
	  the callback after the first line is read.  Fixes bug reported by
	  Pierre Gaston <pierre.gaston@gmail.com>

				   1/22
				   ----
lib/readline/complete.c
	- set _rl_interrupt_immediately non-zero before reading from the file
	  system or calling an application-defined completion function

lib/readline/signals.c
	- renamed rl_signal_handler to _rl_handle_signal; new version of
	  rl_signal_handler that just calls _rl_handle_signal (for now)
	- new function _rl_signal_handler that calls _rl_handle_signal without
	  any checking

lib/readline/rlprivate.h
	- new extern declaration for _rl_signal_handler
	- new define, RL_CHECK_SIGNALS, checks whether or not _rl_caught_signal
	  is set and calls _rl_signal_handler if so

lib/readline/{bind,input,readline}.c
	- add RL_CHECK_SIGNALS in appropriate places

lib/readline/signals.c
	- change rl_signal_handler to set a flag and return rather than
	  run through the entire signal handling process.  If
	  _rl_interrupt_immediately is set, call the signal handling code
	  right away instead of setting the flag.  Initial fix for crash
	  bug reported by Roman Rakus <rrakus@redhat.com>

aclocal.m4
	- new macro, BASH_TYPE_SIG_ATOMIC_T, tests for sig_atomic_t in
	  <signal.h>, defines as int if not defined

configure.in
	- call BASH_TYPE_SIG_ATOMIC_T
	- call AC_C_VOLATILE

config.h.in
	- empty define for sig_atomic_t
	- empty define for volatile

				   1/27
				   ----
subst.c
	- audit calls to add_character and change to add_ifs_character (which
	  quotes characters in $IFS).  Affects primarily `:', `=', and `~'.
	  Fixes bug reported by Jan Schampera <jan.schampera@web.de>; fix
	  suggested by Stephane Chazelas <stephane_chazelas@yahoo.fr>

				    2/1
				    ---
configure.in
	- call AC_C_RESTRICT

config.h.in
	- add empty defintion for `restrict'

pcomplete.c
	- use unwind_protects around call to execute_shell_function in
	  gen_shell_function_matches to prevent data corruption if
	  throw_to_top_level is called.  Bug report and fix from
	  werner@suse.de.

execute_cmd.c
	- don't clamp CPU usage at 100% in print_formatted_time.  Bug reported
	  by Linda Walsh <bash@tlinx.org>

				    2/5
				    ---
locale.c
	- in set_locale_var, set errno to 0 before calling setlocale(), and
	  print strerror (errno) if setlocale fails and errno ends up non-zero

				    2/6
				    ---
configure.in
	- backed out of solaris change from 10/23/2008 (adding `-z interpose'
	  to LDFLAGS) due to solaris updates to fix a linker problem.
	  Updatted by Serge Dussud <Serge.Dussud@Sun.COM>

				   2/12
				   ----
execute_cmd.c
	- change execute_connection so failure of a pipeline will cause the
	  shell to exit if -e is on.  From discussion on austin-group
	  mailing list
	- change execute_command_internal so failure of a user-specified
	  subshell will cause the shell to exit if -e is on.  From discussion
	  on austin-group mailing list

				   2/13
				   ----
doc/{bash.1,bashref.texi}
	- clarified description of set -e option to accurately reflect current
	  implementation

				   2/19
				   ----
print_cmd.c
	- fix print_deferred_heredocs to not print a space if the separator
	  string is null
	- change print_deferred_heredocs to set `was_heredoc' after printing
	  something
	- change connection printing code to only print the `;' separator
	  if we haven't just printed a here-document
	- change connection printing code to print any deferred here
	  documents after the rhs of the connection.  Fixes bug reported by
	  Bo Andresen <bo.andresen@zlin.dk>

[bash-4.0 frozen]

				   2/20
				   ----

[bash-4.0 released]

				   2/22
				   ----

parse.y
	- fix parse_comsub to not test a character for being a possible shell
	  metacharacter if LEX_PASSNEXT flag is set.  Fixes bug reported by
	  Mike Frysinger <vapier@gentoo.org>

pcomplete.c
	- add call to save_parser_state (accidentally dropped from patch) to
	  gen_shell_function_matches.  Fixes bug with bash_completion and
	  file/directory completion reported by phil@Arcturus.universe

Makefile.in
	- fix assignment to LDFLAGS_FOR_BUILD to match those in subdir
	  Makefiles.  Fixes bug reported by Mike Frysinger <vapier@gentoo.org>

builtins/mapfile.def
	- make sure the callback quantum (-c option argument) is > 0.  Fixes
	  bug reported by Stephane Chazleas <stephane_chazelas@yahoo.fr>

				   2/23
				   ----
parse.y
	- fix save_token_state and restore_token_state to save and restore
	  current_token.  Fixes bug reported by Bernd Eggink
	  <monoped@sudrala.de>

builtins/exit.def
	- check jobs[i] before checking whether or not it's running when
	  the checkjobs option is set and we're looking for running jobs
	  at exit.  Fixes bug reported by Mike Frysinger <vapier@gentoo.org>

				   2/24
				   ----
siglist.c
	- include bashintl.h for definition of _.  Fixes bug reported by
	  Greg Wooledge <wooledg@eeg.ccf.org>

				   2/25
				   ----
subst.c
	- new function, skip_matched_pair.  Similar to skip_to_delim and
	  the extract_XXX family
	- move skipsubscript here from arrayfunc.c; re-implement in terms of
	  skip_matched_pair.  Fixes bugs reported by <anmaster@tele2.se>

arrayfunc.c
	- remove skipsubscript; moved to subst.c

parse.y
	- change reset_parser to set current_token to '\n'.  Rest of fix for
	  bug reported by Bernd Eggink <monoped@sudrala.de>; earlier fix on
	  2/23

				   2/26
				   ----
builtins/declare.def
	- when given something like array[x]=y (which sets making_array_special
	  to 1), don't convert an associative array to an indexed array (line
	  493).  Part of fix for bug reported by Pierre Gaston
	  <pierre.gaston@gmail.com>
	- if offset == 0, indicating that we do not have a valid assignment,
	  make sure any `name' containing a `[' is a valid array reference
	  before trying to go on.  Not doing this leads to creating crazy
	  variables like `name[foo[bar]=bax'.  Rest of fix for bug reported
	  by Pierre Gaston <pierre.gaston@gmail.com>

assoc.c
	- change assoc_to_assign to single-quote the array keys if `quoted' is
	  non-zero.  Makes things easier to read with weird characters in the
	  key

parse.y
	- fix parse_comsub to not set LEX_HEREDELIM when it sees "<<<".  Fixes
	  bug reported by Mike Frysinger <vapier@gentoo.org>

				   2/27
				   ----
parse.y
	- fix report_syntax_error to set last_command_exit_value to
	  EX_BADUSAGE (2) instead of EX_USAGE (258), since there's nothing
	  that will translate that to something < 128 before reading the
	  next command.  Partial fix for bug reported by Mike Frysinger
	  <vapier@gentoo.org>

sig.c
	- fix sigint_sighandler to set last_command_exit_value to sig+128
	  before calling throw_to_top_level.  Rest of fix for bug reported
	  by Mike Frysinger <vapier@gentoo.org>

jobs.c
	- if fork() fails, set last_command_exit_value to 126 before calling
	  throw_to_top_level

execute_cmd.c
	- defer calling unlink_fifo_list in parent branch of
	  execute_disk_command if we're executing in a shell function
	- change execute_function to call unlink_fifo_list before returning
	  if it's the top-level function

				    3/2
				    ---
builtins/read.def
	- if read times out, make sure we remove the top element from the
	  unwind-protect stack (the free of input_string) and run the rest,
	  to reset the tty and readline and alarm states.  Then we jump to
	  assigning the variables to any partial input.  Fixes bug reported
	  by Christopher F. A. Johnson <cfajohnson@gmail.com>

				    3/3
				    ---
parse.y
	- break comment checking code into a common COMMENT_BEGIN define so
	  we can use it in multiple places in parse_comsub
	- in parse_comsub, don't alter the LEX_RESWDOK flag if we read a
	  `#' and we're checking comments, even though `#' isn't a `shell break'
	  character.  Fixes bug reported by Mike Frysinger  <vapier@gentoo.org>

braces.c
	- in expand_seqterm, decrease the total length of the rhs by the length
	  of any (optional) increment, so we don't end up with unwanted zero
	  padding because the rhs length is wrong.  Fixes bug reported by
	  Carl Albing <albing@comcast.net>

				    3/4
				    ---
doc/{bash.1,bashref.texi}
	- changes to clean up some of the language describing the effects of
	  terminal process groups on the ability to read from and write to
	  the terminal

				    3/5
				    ---
support/shobj-conf
	- add host_vendor to string tested in switch to handle things like
	  gentoo/freebsd
	- beginning with version 7, FreeBSD no longer has /usr/bin/objformat
	  or a.out binaries and libraries.  It's always ELF.  Fix from
	  Timothy Redaelli <drizzt@gentoo.org>

parse.y
	- in parse_comsub, allow comments if we are ready to read a
	  reserved word (tflags & LEX_RESWDOK), haven't read anything from
	  one yet (lex_rwlen == 0) and the current character is a '#'

				    3/6
				    ---
parse.y
	- new lex flag for parse_comsub: LEX_INWORD.  Turn it off when
	  we see a shell break character; turn it on or keep it on when
	  not a break character.  Keep track of word length (reset to 0
	  when we turn on LEX_INWORD when it was off).
	- don't use COMMENT_BEGIN in parse_comsub any more; test
	  whether or not LEX_INWORD is set and lex_wlen == 0 in addition
	  to tests for LEX_RESWDOK and lex_rwlen.  Comments are valid
	  when at the start of a word
	- move LEX_PASSNEXT code to the top of parse_comsub, so the rest
	  of the function doesn't have to check for the flag at different
	  places

				    3/7
				    ---
parse.y
	- in parse_comsub, when looking for a reserved word (LEX_RESWDOK
	  non-zero), and in a case statement, we can see either an esac
	  or a pattern list.  We handle an esac separately.  We should
	  turn off LEX_RESWDOK if we see anything but a newline, since
	  we'll be reading a pattern list.  Other part of fix for bug
	  reported by Mike Frysinger <vapier@gentoo.org> (rest of fix
	  on 3/3)

				   3/10
				   ----
{.,lib/readline}/doc/fdl.texi
	- updated to FDL version 1.3

				   3/11
				   ----
parse.y
	- when using the |& construct with a simple command preceding it, add
	  the implicit redirection to the simple command's redirection list,
	  since the redirections associated with the command struct are never
	  executed.  Fixes bug reported by Matt Zyzik <Matt@ice.filescope.com>

				   3/14
				   ----
execute_cmd.c
	- in execute_case_command, if ;& is used with no following pattern
	  list, make sure we don't reference a NULL pointer.  Bug report and
	  fix from Clark Jian Wang <dearvoid@gmail.com>

parse.y
	- make parser_state global, so other files can use it
	- command_word_acceptable now returns non-zero if PST_REDIRLIST bit
	  set in parser_state, so we accept assignment statements and
	  perform alias expansion.  Fix for bug reported by Vincent
	  Lefevre <vincent@vinc17.org> (2/24/2009)

parser.h
	- add PST_REDIRLIST flag, notes that parser is currently parsing a
	  redirection list preceding a simple command

make_cmd.c
	- make_simple_command now turns on PST_REDIRLIST in parser_state when
	  creating a new simple command
	- make_simple_command turns off PST_REDIRLIST in parser_state if it
	  adds a non-redirection to the command it's building
	- clean_simple_command turns off PST_REDIRLIST to make sure it's off

subst.c
	- new flag for param_expand: PF_IGNUNBOUND, means to not exit if the
	  variable is unbound even if `set -u' is enabled
	- change param_expand to not call err_unboundvar if the `pflags'
	  argument has the PF_IGNUNBOUND bit set
	- parameter_brace_expand_word now takes an extra `pflags' argument to
	  pass down to param_expand; changed callers
	- changed call to parameter_brace_expand_word in parameter_brace_expand
	  to add PF_IGNUNBOUND flag so ${@:-foo} doesn't cause the shell to
	  exit (but ${@} does) when there are no positional parameters.  Fixes	
	  Debian bug 519165 from Dan Jacobson <jidanni@jidanni.org>

parse.y
	- add code to parse_comsub to allow here-documents within command
	  substitutions to be delimited by the closing right paren, with the
	  usual warning about here documents delimited by EOF on execution.
	  Fixes regression from bash-3.2 noted in Red Hat bugzilla 485664 by
	  Ralf Corsepius

				   3/15
				   ----
subst.c
	- string_list_dollar_at now checks for Q_PATQUOTE, which getpattern()
	  uses to denote Q_DOUBLE_QUOTES (?).  Fixes a=abcd echo "${a#$*}"
	  when IFS= and args are `a b' as noted by Stephane Chazleas
	  <stephane_chazelas@yahoo.fr>
	- param_expand now checks for Q_PATQUOTE and treats it identically
	  to Q_DOUBLE_QUOTES when expanding $*
	- expand_word_unsplit now sets W_NOSPLIT in the flags of the word it
	  passes to expand_word_internal if $IFS is NULL
	- expand_word_leave_quoted now sets expand_no_split_dollar_star and
	  the W_NOSPLIT bit in the word flags before calling
	  expand_word_internal if $IFS is NULL, just like expand_word_unsplit.
	  It is now virtually identical to expand_word_unsplit.  Rest of fix for
	  problems reported by Stephane Chazleas <stephane_chazelas@yahoo.fr>

				   3/20
				   ----
trap.c
	- in _run_trap_internal, don't pass SEVAL_RESETLINE as flag to
	  parse_and_execute if running the ERR trap (further modification
	  of change from 1/12)

execute_cmd.c
	- in execute_simple_command, set line_number to line_number_for_err_trap
	  before calling run_error_trap.  Part of fix for bug reported by
	  Brian J. Murrell <brian@interlinx.bc.ca>
	- change other places calling run_error_trap() to set and use
	  line_number_for_err_trap

				   3/21
				   ----
builtins/fc.def
	- Even though command substitution through parse_and_execute turns 
	  off remember_on_history, command substitution in a shell when
	  set -o history has been enabled (interactive or not) should use it
	  in the last_hist calculation as if it were on.  Same calculation
	  in fc_gethnum and fc_builtin.  Fixes bug reported by
	  Ian Kelling <smallnow@gmail.com> 

sig.c
	- change termsig_sighandler to terminate immediately if it gets called
	  twice with the same signal before termsig_handler gets called.  This
	  fixes the `looping on SIGSEGV' phenomenon reported by Linux users.

parse.y
	- in read_secondary_line, don't try to add NULL lines to the history
	  list.  Report and patch from Lubomir Rintel <lkundrak@v3.sk>

				   3/22
				   ----
sig.c
	- Augment change from 3/21 with explicit check for signals we *don't*
	  want this to happen for.  Patch from Lubomir Rintel <lkundrak@v3.sk>

				   3/28
				   ----
array.c
	- in array_reference, return NULL immediately if the desired index
	  is larger than the maximum
	- add cache of last array referenced and last array element referenced;
	  use in array_reference to optimize case of sequential access;
	  invalidated where necessary in other functions
	- array_rshift needs to set max_index to 0 if the array was empty
	  before shifting in the new element 0
	- array_shift needs to use element_index(a->head->prev) to set the
	  max_index, not a simple decrement, to deal with sparse arrays

				    4/1
				    ---
bashline.c
	- in bash_dequote_filename, return right away after copying the
	  backslash if the last character in the string to be expanded
	  is a backslash.  The old code copied an extra NUL and overwrote
	  the bounds checking.  Fixes bug reported by Shawn Starr
	  https://bugzilla.redhat.com/show_bug.cgi?id=488649

				    4/3
				    ---
subst.c
	- in pat_subst.c, make sure to copy one character from the input
	  string in the case of a null pattern match, since we substitute
	  on the null match and then increment past the current character.
	  Not doing this means that each character of the original string
	  is replaced because of the null matches.  Fixes debian bug
	  reported bhy Louis-David Mitterrand <ldm@apartia.fr>
	  http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=522160

lib/sh/winsize.c
	- incorporate contents of readline/rlwinsize.h to get all the various
	  system dependencies right when trying to find TIOCGWINSZ.  Fixes
	  bug reported by Dan Price <dp@eng.sun.com>

				    4/6
				    ---
doc/{bash.1,bashref.texi}
	- fix description of conditional `>' and `<' to remove statement that
	  the comparison pays attention to the current locale -- it has
	  always used strcmp

lib/glob/glob.c
	- fixed a bug in glob_filename that caused glob_dir_to_array to be
	  called to prepend a (globbed) directory name onto the results from
	  glob_vector, which, if we were globbing `**', glob_vector has
	  already done.  Effect is to have the directory name(s) on there
	  twice.  Fixes "dir*/**" bug reported by Matt Zyzik
	  <Matt@ice.filescope.com>

				    4/8
				    ---
doc/{bash.1,bashref.texi}
	- fix short syntax summary of for command to reflect full bash
	  syntax (which is a superset of Posix syntax).  Fixes bug reported
	  by Reuben Thomas <rrt@sc3d.org>

				   4/10
				   ----
{expr,subst}.c
	- make sure last_command_exit_value is set to EXECUTION_FAILURE
	  before calling err_unboundvar, in case set -e is enabled and
	  the shell exits from there.  Fixes bug reported by Freddy
	  Vulto <fvulto@gmail.com> and Piotr Zielinski
	  <piotr.zielinski@gmail.com>

				   4/11
				   ----
jobs.c
	- in restore_pipeline, don't call discard_pipeline with a NULL
	  argument

trap.c
	- in run_debug_trap, make sure to save and restore the pipeline,
	  pipeline_pgrp, and state of the pipeline around running the debug
	  trap, then remove any job created by running the debug trap from
	  the jobs table when it completes.  Fixes for two bugs reported
	  by lex@upc.ua

				   4/12
				   ----
lib/readline/signals.c
	- new functions to block and release SIGWINCH like the SIGINT blocking
	  and releasing functions

lib/readline/rlprivate.h
	- new extern declarations for _rl_block_sigwinch and _rl_release_sigwinch

lib/readline/display.c
	- block SIGWINCH during redisplay like SIGINT.  Should fix bug reported
	  by Nicolai Lissner <nlissne@linux01.org>

				   4/13
				   ----
lib/readline/readline.h
	- new readline state variable: RL_STATE_REDISPLAYING

lib/readline/display.c
	- in rl_redisplay, don't block SIGWINCH during redisplay; just set
	  the REDISPLAYING state

lib/readline/terminal.c
	- in rl_resize_terminal, don't call rl_redisplay_after_sigwinch() if
	  we're already in the middle of redisplay (RL_STATE_REDISPLAYING).
	  Fix for bug reported by Nicolai Lissner <nlissne@linux01.org>

				   4/15
				   ----
parse.y
	- fix parse_comsub to add check for \n when seeing whether the current
	  character can change to a state where a reserved word is legal,
	  since it is not a shell meta character.  Fixes bug reported by
	  Bernd Eggink <monoped@sudrala.de>.

				   4/17
				   ----
jobs.c
	- new functions to save and restore the pgrp_pipe (since there's only
	  one): save_pgrp_pipe and restore_pgrp_pipe

trap.c
	- run_debug_trap now saves and restores the pgrp_pipe before and
	  after calling the debug trap
	- run_debug_trap now makes sure the terminal is owned by the pipeline
	  pgrp after the debug trap runs.  Rest of fix for bug reported by
	  Oleksly Melnyk <o.melnyk@upc.ua> (lex@upc.ca)

				   4/19
				   ----
include/posixselect.h
	- new include file, encapsulates select(2) includes and defines for
	  bash and readline.  Inspired by patch from Mike Frysinger
	  <vapier@gentoo.org>

lib/sh/input_avail.c
	 - include "posixselect.h"

lib/readline/{input,parens}.c
	- include "posixselect.h" instead of using inline includes
	- use new USEC_TO_TIMEVAL define to make sure that values for timeouts
	  greater than one second are handled properly

lib/sh/fpurge.c
	- updated implementation, taken from gnulib

				   4/21
				   ----
lib/glob/glob.c
	- in finddirs, don't try to free a return value of glob_error_return
	  from glob_vector.  Bug and fix from werner@suse.de

lib/readline/signals.c
	- in rl_echo_signal_char, check that SIGQUIT and SIGTSTP are defined
	  before trying to use them.  Bug report and fix from Volker Grabsch
	  <vog@notjusthosting.com>

				   4/24
				   ----
aclocal.m4
	- add conditional inclusion of <stdint.h> to BASH_CHECK_TYPE

bashtypes.h,lib/sh/strto[iu]max.c
	- include <stdint.h> if present for any existing declaration of
	  intmax_t and uintmax_t.  Fixes Interix problem reported by
	  Markus Duft <mduft@gentoo.org>

lib/sh/strindex.c,externs.h,builtins/common.h
	- renamed strindex to strcasestr to agree with other implementations
	  (e.g., BSD, MacOS X, gnulib); changed callers

lib/sh/{strindex.c,Makefile.in},Makefile.in
	- renamed strindex.c to strcasestr.c

configure.in
	- add strcasestr to call to AC_REPLACE_FUNCS, take advantage of
	  existing libc implementations

config.h.in
	- add define for HAVE_STRCASESTR

lib/sh/mbscmp.c
	- fix mbscmp to return correct values when the strings do not contain
	  valid multibyte characters.  Ideas from gnulib

xstrchr.c
	- only compare current character against C if mblength == 1

{shell,variables}.c
	- changed some xstrchr calls back to strchr when the arguments cannot
	  contain multibyte characters

lib/sh/{xstrchr.c,Makefile.in},Makefile.in
	- renamed xstrchr to mbschr; renamed file to mbschr.c

aclocal.m4
	- change BASH_CHECK_MULTIBYTE to use AC_REPLACE_FUNCS(mbschr)

externs.h
	- extern declarations for mbscmp and mbschr, conditional on the usual
	  HAVE_MBSCMP and HAVE_MBSCHR defines

general.h,{alias,arrayfunc,bashline,general,execute_cmd,subst}.c
	- changed calls to xstrchr to mbschr

doc/bash.1
	- use `pathname expansion' consistently, not `filename expansion' or
	  `filename generation'

doc/bashref.texi
	- use the phrase `filename expansion' consistently (since this is
	  what the Gnu people prefer) instead of `pathname expansion' or
	  `filename generation'

aclocal.m4,config.h.in
	- check for mbscasecmp in BASH_CHECK_MULTIBYTE, define HAVE_MBSCASECMP
	  if found

lib/sh/{mbscasecmp.c,Makefile.in}
	- new file, case-insensitive multibyte string comparison

externs.h
	- extern declaration for mbscasecmp

				   4/25
				   ----
lib/readline/display.c
	- in _rl_move_cursor_relative, don't adjust dpos by woff if it's
	  already less than woff (don't want it less than 0)
	- in _rl_move_cursor_relative, short-circuit right away if the cursor
	  is at columns 0 and `new' is 0 (doesn't matter if it's a multibyte
	  locale or not, or whether there are invisible chars in the prompt)
	- in _rl_move_cursor_relative, go ahead and adjust dpos if
	  prompt_physical_chars >= _rl_screenwidth (previous check was just > )
	  Fixes bug reported by Andreas Schwab <schwab@linux-m68k.org>

				   4/28
				   ----
lib/glob/glob.c
	- in glob_vector, don't add an empty pathname ("") if we're adding the
	  currect directory to the dirlist and GX_NULLDIR is set -- we can just
	  ignore it, since the passed directory name (".") was created by
	  the caller.  Fixes bug reported by Matt Zyzik <matt.zyzik@nyu.edu>

				    5/5
				    ---
subst.c
	- make expansion of $@ and $* when set -u is in effect and there are
	  no positional parameters be a non-fatal error.  This is the
	  consensus of the austin group, though it is not historical practice.
	  Message from Geoff Clare <20090505091501.GA10097@squonk.masqnet> of
	  5 May 2009 and http://austingroupbugs.net/view.php?id=155


				   5/20
				   ----
lib/glob/glob.c
	- tentative fix to glob_filename to compensate for glob_vector putting
	  null pathname at front of result vector when dflags&GX_NULLDIR.
	  Current fix manually removes empty string element from front of
	  result vector; a better fix would be to use a flag so glob_vector
	  doesn't add it at all.  Augments patch from 4/28, which appears to
	  have broken some things.  Fixes bug reported by Matt Zyzik
	  <matt.zyzik@nyu.edu>

				   5/22
				   ----

lib/glob/glob.c
	- better fix for glob_filename; supersedes patch of 5/20.  Now the
	  code does not set GX_ADDCURDIR if directory_len == 0 and the
	  function has not been called recursively ((flags & GX_ALLDIRS) == 0).
	  Better fix for bug reported by Matt Zyzik <matt.zyzik@nyu.edu>

Makefile.in
	- fix build race condition that occurs in some makes caused by
	  libreadline.a and libhistory.a containing some of the same files
	  (e.g., xmalloc.o) and conflicting when trying to build both at
	  the same time.  Reported by Mike Frysinger <vapier@gentoo.org>

				   5/25
				   ----
lib/readline/vi_mode.c
	- fix _rl_vi_initialize_line so that the loop counter is not
	  unsigned (it doesn't matter, but it eliminates a compiler warning).
	  Bug reported by Dave Caroline <dave.thearchivist@gmail.com>

				   5/26
				   ----
doc/{bash.1,bashref.texi}
	- add text to the description of array variables making it clear
	  that an array variable is not considered set until a subscript
	  has been assigned a value

				   5/29
				   ----
lib/readline/text.c
	- fix rl_change_case to handle case where mbrtowc doesn't find a
	  valid multibyte character

lib/readline/vi_mode.c
	- fix _rl_vi_change_mbchar_case to handle case where mbrtowc doesn't
	  find a valid multibyte character

lib/sh/casemod.c
	- fix sh_modcase to handle case where mbrtowc doesn't find a valid
	  multibyte character

lib/readline/mbutil.c
	- fix _rl_find_next_mbchar_internal to not call mbrtowc at the end of
	  the string, since implementations return different values -- just
	  break the loop immediately

lib/readline/display.c
	- fix rl_redisplay to make same sort of cursor position adjustments
	  based on multibyte locale and _rl_last_c_pos when performing
	  horizontal scrolling rather than line wrapping.  Probably still
	  more to do.  Fixes bug reported by jim@jim.sh

				    6/5
				    ---
doc/{bash.1,bashref.texi}
	- added some more explanation of the inheritance of the ERR trap at
	  the suggestion of Thomas Pospisek <tpo@sourcepole.ch>

findcmd.c
	- use eaccess(2) if available in file_status to take other file
	  access mechanisms such as ACLs into account.  Patch supplied
	  by werner@suse.de

				   6/12
				   ----
xmalloc.c
	- also calculate lowest brk() value the first time xmalloc/xrealloc
	  (and their sh_ counterparts) are called
	- error messages consolidated into a single function (allocerr/
	  sh_allocerr) to avoid string duplication

				   6/16
				   ----
variables.c
	- changes to allow variables.c to be compiled if ALIAS is not defined.
	  Bug and fix from John Gatewood Ham <uraphalinuxserver@gmail.com>

lib/sh/getcwd.c
	- fix so systems defining BROKEN_DIRENT_D_INO have the necessary
	  defines.  Fix from Jay Krell <jay.krell@cornell.edu>

configure.in
	- add -D_ALL_SOURCE to interix CFLAGS for struct timezone definition.
	  Bug and fix from John Gatewood Ham <uraphalinuxserver@gmail.com>

				   6/29
				   ----
variables.c
	- change initialize_shell_variables to add environment variables with
	  invalid names to the variables hash table, but marking them as
	  invisible and imported
	- new function, export_environment_candidate.  Used when creating the
	  export environment for commands to include variables with invalid
	  names inherited from the initial environment.  Apparently this
	  behavior is widespread
	- change make_var_export_array to use export_environment_candidate
	  rather than visible_and_exported to test variables for inclusion
	  in the export environment

				    7/1
				    ---
builtins/read.def
	- fix a memory leak where the number of fields is not the same as
	  the number of variables passed to `read'.  Bug report from
	  werner@suse.de

builtins/command.def
	- move section of code that sets PATH from -p option before the
	  verbose-handling section, so command -v and command -V honor
	  the PATH set by command -p.  Bug report and fix from
	  ohki@gssm.otsuka.tsukuba.ac.jp

				    7/9
				    ---
subst.c
	- change brace_expand_word_list to defer brace expansion on compound
	  array assignments that are arguments to builtins like `declare',
	  deferring the expansion until the assignment statement is processed.
	  Fixes inconsistency reported by agriffis@n01se.net

				   7/16
				   ----
bashline.c
	- fix bash_execute_unix_command to set rl_point correctly based on
	  READLINE_POINT.  The old method of using save_point will not
	  work because maybe_make_readline_line will change rl_point.  Bug
	  reported by Henning Bekel <h.bekel@googlemail.com>

trap.c
	- fix _run_trap_internal and run_pending_traps to save and restore
	  value of subst_assign_varlist so the dispose_words on it doesn't
	  leave dangling pointers after the trap handler runs.  Fixes bug
	  reported by Marc Herbert <marc.herbert@gmail.com>

				   7/22
				   ----
subst.c
	- fix off-by-one error in pos_params when computing positional
	  parameters beginning with index 0.  Bug and fix from Isaac Good
	  <isaacgood@gmail.com>

				   7/24
				   ----
lib/readline/display.c
	- add code to _rl_move_cursor_relative and _rl_col_width to short-
	  circuit a few special cases: prompt string and prompt string plus
	  line contents, both starting from 0.  Saves a bunch of calls to
	  multibyte character functions using already-computed information.
	  As a side effect, fixes bug reported by Lasse Karkkainen
	  <tronic+8qug@trn.iki.fi>

subst.c
	- fixed a problem in split_at_delims that could leave *cwp set to -1
	  if the line ends in IFS whitespace and SENTINEL is one of those
	  whitespace characters.  Fixes problem with setting COMP_CWORD for
	  programmable completion reported by Ville Skytta <ville.skytta@iki.fi>

bashline.c
	- change bash_execute_unix_command to clear the current line (if the
	  terminal supplies the "ce" attribute) instead of moving to a new
	  line.  Inspired by report from Henning Bekel <h.bekel@googlemail.com>

builtins/printf.def
	- changes to allow printf -v var to assign to array indices, the way
	  the read builtin can.  Suggested by Christopher F. A. Johnson
	  <cfajohnson@gmail.com>

lib/readline/complete.c
	- fix rl_old_menu_complete and rl_menu_complete to appropriately set
	  and unset RL_STATE_COMPLETING while generating the list of matches.
	  Fixes debian bug #538013 reported by Jerome Reybert
	  <jreybert@gmail.com>

				   7/25
				   ----
execute_cmd.c
	- change execute_builtin to temporarily turn off and restore the ERR
	  trap for the eval/source/command builtins in the same way as we
	  temporarily disable and restore the setting of the -e option.
	  Fixes bug reported by Henning Garus <henning.garus@googlemail.com>

				   7/27
				   ----
shell.c
	- add fflush(stdout) and fflush(stderr) to exit_shell before closing
	  any file descriptors at exit time (e.g., coproc pipes)

				   7/30
				   ----
lib/readline/complete.c
	- new function rl_backward_menu_complete, just passes negative count
	  argument to rl_menu_complete
	- change rl_menu_complete to act appropriately if rl_last_command is
	  rl_backward_menu_complete, so we can cycle forward and backward
	  through the list of completions

lib/readline/doc/{readline.3,rluser.texi},doc/bash.1
	- document new "menu-complete-backward" bindable readline function.
	  Suggested by Jason Spiro <jasonspiro04@gmail.com>

lib/readline/vi_keymap.c
	- add binding of C-n to menu-complete and C-p to menu-complete-backward
	  in vi-insert keymap, as suggested by Jason Spiro
	  <jasonspiro04@gmail.com>

pcomplete.c
	- fixed a bug in programmable_completions: the options it returned from
	  the compspec it found were set before generating the completions,
	  which meant that any changes made by "compopt" were overridden and
	  only in effect for the duration of the executing shell function
	  rather than the entire completion.  Fixes bug reported by Ville
	  Skytta <ville.skytta@iki.fi>

				   7/31
				   ----
lib/readline/keymaps.c
	- fixed memory leak in rl_discard_keymap by freeing storage associated
	  with hierarchical keymaps
	- new convenience function, rl_free_keymap, that calls rl_discard_keymap
	  and frees the keymap passed as an argument

lib/readline/util.c
	- new bindable keymap function, _rl_null_function, to be used internally

lib/readline/rlprivate.h
	- extern declaration for _rl_null_function

lib/readline/bind.c
	- fix rl_generic_bind in the case where we are trying to override a
	  keymap with a null function (e.g., when trying to unbind it).  We
	  can't use a NULL function pointer in ANYOTHERKEY since that's
	  indistinguishable from the keymap not having been overridden at all.
	  We use  _rl_null_function instead, which simply does nothing.  We
	  could add an rl_ding to it later.  Fixes problem with hitting ESC
	  repeatedly while in vi command mode reported by James Rowell
	  <jrjimmy801-misc1@yahoo.com>

builtins/bind.def
	- call rl_bind_keyseq instead of rl_set_key for -r option

lib/readline/readline.c
	- Set vi_movement_keymap[ESC] to _rl_null_function after binding the
	  arrow keys in bind_arrow_keys() to allow vi-mode users to hit ESC
	  multiple times in vi command mode while still allowing the arrow
	  keys to work

				    8/2
				    ---
bashline.c
	- fix clear_hostname_list by setting hostname_list_initialized to 0
	  after freeing all list members.  Fixes bug reported by Freddy
	  Vulto <fvulto@gmail.com>

lib/readline/display.c
	- in update_line, if we copy data from one line to another because we
	  are wrapping a multibyte character from, say, the first line to the
	  second, we need to update OMAX and the line indices to account for
	  the moved data.  Bug report and fix from Martin Hamrle
	  <martin.hamrle@gmail.com>

				    8/3
				    ---
pcomplete.h
	- defines for EMPTYCMD ("_EmptycmD_") and DEFAULTCMD ("_DefaultCmD_")

builtins/complete.def
	- change compopt_builtin to make -E work on the "empty" command
	  completion
	- fix print_compitem and print_compopts to replace EMPTYCMD with -E
	- added -D (default) option to complete/compgen/compopt.  No supporting
	  code yet

doc/bash.1,lib/readline/doc/rluser.texi
	- document new -D, -E options to compopt
	- document new -D option to complete/compgen

shell.h
	- new define, EX_WEXPCOMSUB, value of 125
	- new define, EX_RETRYFAIL, value of 124 (for programmable completion)

subst.c
	- use EX_WEXPCOMSUB instead of literal 125 as exit status when a shell
	  invoked to run wordexp(3) with the -n option supplied attempts a
	  command substitution

pcomplete.c
	- new define, PCOMP_RETRYFAIL, used to indicate a "failure, retry with
	  next completion" status to the programmable completion code

				    8/4
				    ---
pcomplete.c
	- changed gen_shell_function_matches to take an extra parameter
	  indicating whether the specified shell function was not found or
	  returned the special "fail/retry" status, and, if it was either,
	  to not bother returning any matches list
	- changed gen_compspec_completions to take an extra parameter to pass
	  through the "found" status from gen_shell_function_completions
	- new function gen_progcomp_completions to take care of searching for
	  and evaluating a compspec for a particular word, saving its status,
	  and returning to its caller (programmable_completions) whether or
	  not to retry completion.  This function also checks whether a
	  retry changed the compspec associated with a command and short-
	  circuits the retry if it has not
	- changed programmable_completions to try default completion (if set)
	  if a specific completion was not found for a command
	- changed programmable_completions to implement "fail/retry" semantics
	  for a shell function that returns 124 and changes the compspec
	  associated with the command.  All based on proposal and changes from
	  Behdad Esfahbod (Red Hat bugzilla 475229)

doc/bash.1,lib/readline/doc/rluser.texi
	- documented new dynamic programmable completion functionality

				    8/5
				    ---
stringlib.c
	- first argument to substring() is now `const char *'

externs.h
	- changed extern declaration for substring()

subst.c
	- skipsubscript now takes a third FLAGS argument, passes to
	  skip_matched_pair
	- skip_matched_pair now interprets flags&1 to mean not to parse
	  matched pairs of quotes, backquotes, or shell word expansion
	  constructs

{subst,general,expr}.c
	- changed skipsubscript() callers

assoc.c
	- changed assoc_to_assign to double-quote the key if it contains any
	  shell metacharacters

arrayfunc.c
	- use skipsubscript in quote_assign rather than quote any glob
	  characters in the subscript of an array assignment
	- in assign_compound_array_list, call skipsubscript with a flags
	  argument of 1 if assigning an associative array to avoid trying
	  to re-parse quoted strings

redir.c
	- set expanding_redir before expanding body of here documents and
	  here strings to avoid looking for variables in temporary env

				    8/7
				    ---
lib/readline/readline.c
	- in _rl_dispatch_callback, return value of -3 means that we have
	  added to a key sequence, but there are previous matches in the
	  sequence.  Don't call _rl_subseq_result if we get a -3 from a
	  previous context in the chain; just go back up the chain.  Report
	  and fix from <freehaha@gmail.com>

bashline.c
	- fixes to history_completion_generator and bash_dabbrev_expand to
	  make dabbrev-expand inhibit suppressing of appending space char
	  to matches.  Have to do it with the generator too because
	  rl_menu_complete turns off suppressing the appended space in
	  set_completion_defaults().  Suggestion from Dan Nicolaescu
	  <dann@ics.uci.edu>
	- suppress completion match sorting in bash_dabbrev_expand by
	  setting rl_sort_completion_matches = 0.  Suggestion from Dan
	  Nicolaescu <dann@ics.uci.edu>
	- don't qsort history match list in build_history_completion_array
	  if dabbrev_expand_active == 1
	- start the loop in build_history_completion_array that gathers words
	  from history for possible completions from the end of the list
	  rather than the beginning.  It doesn't matter where you start if
	  the results are sorted, and dabbrev-expand is supposed to offer
	  the most recent completions first

				   8/12
				   ----
execute_cmd.c
	- change to execute_command_internal to make [[ ... ]] conditional
	  command subject to settings of `set -e' and the ERR trap

				   8/14
				   ----
execute_cmd.c
	- change to execute_command_internal to make (( ... )) arithmetic
	  command subject to settings of `set -e' and the ERR trap

lib/readline/text.c
	- new bindable function, rl_skip_csi_sequence, reads the characters
	  that make up a control sequence as defined by ECMA-48.  Sequences
	  are introduced by the Control Sequence Indicator (CSI) and
	  contain a defined set of characters.  Insert, End, Page Up and so
	  on are CSI sequences.  Report and code from Andy Koppe
	  <andy.koppe@gmail.com>

lib/readline/readline.h
	- extern declaration for rl_skip_csi_sequence

lib/readline/funmap.c
	- new bindable command "skip-csi-sequence", runs rl_skip_csi_sequence

doc/bash.1,lib/readline/doc/{readline.3,rluser.texi}
	- documented new bindable command "skip-csi-sequence", unbound by
	  default

builtins/evalfile.c
	- fix _evalfile to remove embedded null bytes from the file read
	  into the string.  Report and proposed fix from Roman Rakus
	  <rrakus@redhat.com>

{configure,config.h}.in
	- check for syslog(3), define HAVE_SYSLOG
	- check for syslog.h, define HAVE_SYSLOG_H

config-top.h
	- new define SYSLOG_HISTORY, disabled by default

config-bot.h
	- if HAVE_SYSLOG or HAVE_SYSLOG_H are not defined, undef SYSLOG_HISTORY

bashhist.c
	- if SYSLOG_HISTORY is defined, call bash_syslog_history with the
	  line added to the history in bash_add_history.
	- new function, bash_syslog_history(line), sends line to syslog at
	  user.info.  The line is truncated to send no more than 600
	  (SYSLOG_MAXLEN) bytes to syslog. Feature requested by many, and
	  required by some national laws

sig.c
	- in termsig_handler, resend SIGHUP to children if subshell_environment
	  indicates we're a shell performing command or process substitution

jobs.c
	- add CHECK_TERMSIG calls to wait_for in addition to the ones in
	  waitchld()

builtins/shopt.def
	- new functions set_bashopts, parse_bashopts, and initialize_bashopts
	  to manage new environment variable $BASHOPTS, like $SHELLOPTS but
	  for shopt options
	- change toggle_shopts to call set_bashopts after setting options, so
	  $BASHOPTS reflects new values

shell.c
	- call initialize_bashopts after calling initialize_shell_options at
	  shell startup

configure.in
	- new configure `enable' option --enable-exended-glob-default, to
	  set the initial default value of the `extglob' shell option

config.h
	- new define, EXTGLOB_DEFAULT, controlled by the `extended-glob-default'
	  configure option

pathexp.c
	 - initialize extended_glob variable to EXTGLOB_DEFAULT

doc/{bash.1,bashref.texi}
	- document new $BASHOPTS variable and its behavior

doc/bashref.texi
	- document new --enable-extended-glob-default configure option

				   8/16
				   ----
print_cmd.c
	- new variables: xtrace_fd and xtrace_fp, the file descriptor and
	  FILE * to which we send `set -x' tracing output.  If fd == -1
	  then fp == STDERR, the default mode
	- new function xtrace_init, sets xtrace_fd == -1 and xtrace_fp = stderr
	- new function xtrace_set (fd, fp), sets xtrace_fd and xtrace_fp
	  to the arguments
	- new function xtrace_reset, handles closing old xtrace fd/fp and
	  moving them back to -1/stderr
	- new function xtrace_fdchck, calls xtrace_reset if the fd passed as
	  an argument is xtrace_fd
	- change xtrace functions to fprintf to xtrace_fp instead of stderr

shell.c
	- call xtrace_init() very early in main()

variables.c
	- new special variable, BASH_XTRACEFD, holds file descriptor used for
	  set -x trace output.  Inspired by suggestion from Bruce Korb
	  <bruce.korb@gmail.com>

doc/{bash.1,bashref.texi}
	- added description of new BASH_XTRACEFD variable

redir.c
	- add calls to xtrace_fdchk to the redirections that close file
	  descriptors, so we notice if we close BASH_XTRACEFD and compensate
	  accordingly (same places that call coproc_fdchk())

				   8/18
				   ----
lib/readline/text.c
	- change to _rl_replace_text to add error checks: start must be <=
	  end, and we don't call rl_insert_text if passed the empty string

config.h.in
	- add define for HAVE_ICONV, already found by intl autoconf macros
	- add define for HAVE_LOCALE_CHARSET

aclocal.m4
	- add check for locale_charset() to BASH_CHECK_MULTIBYTE

lib/sh/fnxform.c
	- new file with two public function: fnx_tofs and fnx_fromfs.
	  Primarily intended for use on MacOS X, they use iconv to convert
	  between whatever the current locale encoding is and "UTF-8-MAC",
	  a special encoding on OS X in which all characters are
	  decomposed unicode, as the HFS+ filesystem stores them.  These
	  functions return a pointer to a local buffer, allocated once and
	  resized as necessary, to avoid too many allocations; callers
	  should not free the return value, since it may be the string
	  passed

Makefile.in
	- make sure LIBICONV is set by autoconf (@LIBICONV@) and added to
	  list of link libraries

externs.h
	- new extern declarations for fnx_fromfs and fnx_tofs

lib/glob/glob.c
	- convert the filename read using readdir() in glob_vector() using
	  fnx_fromfs and use that value in the call to strmatch.  This
	  ensures that we're using the precomposed Unicode value of the
	  filename rather than the native decomposed form.  Original bug
	  report from Len Lattanzi <llatanzi@apple.com>; fix inspired by
	  Guillaume Outters <guillaume.outters@free.fr>

				   8/19
				   ----
lib/readline/complete.c
	- new completion hook: rl_filename_rewrite_hook, can rewrite or modify
	  filenames read from the filesystem before they are compared to the
	  word to be completed

lib/readline/readline.h
	- extern declaration for rl_filename_rewrite_hook

lib/readline/doc/rltech.texi
	- document rl_filename_rewrite_hook

bashline.c
	- new function, bash_filename_rewrite_hook, assigned to
	  rl_filename_rewrite_hook.  Calls fnx_fromfs to convert from
	  filesystem format to "input" format.  This makes completing
	  filenames with accented characters work on Mac OS X

				   8/20
				   ----
lib/readline/bind.c
	- new bindable variable "skip-completed-text", bound to
	  _rl_skip_completed_text.  If enabled, it means to note when
	  completing before the end of a word and skipping over characters
	  after rl_point that match in both the completion to be inserted
	  and the word being completed.  It means that completing
	  `Makefile' with the cursor after the `e' results in `Makefile'
	  instead of `Makefilefile'.  Inspired by an idea from Jared
	  Yanovich <phierunner@comcast.net> from back in 2004

lib/readline/rlprivate.h
	- extern declaration for _rl_skip_completed_text

lib/readline/complete.c
	- implement semantics of _rl_skip_completed_text in insert_match:
	  skip characters in `replacement' that match chars in rl_line_buffer
	  from the start of the word to be completed

				   8/21
				   ----
error.c
	- change parser_error to set last_command_exit_value to 2 before
	  calling exit_shell (if set -e is enabled), so any exit or ERR
	  trap gets the right value of $?.  Suggestion from Stefano
	  Lattarini <stefano.lattarini@gmail.com>

braces.c
	- fix expand_seqterm so that a non-zero-prefixed term that's longer
	  than a zero-prefixed term determines the length of each term
	  in the brace-expanded sequence.  This means that things like
	  {01..100} will have three digits in all the elements of the
	  expanded list.  Fixes bug reported by Jeff Haemer
	  <jeffrey.haemer@gmail.com>

				   8/24
				   ----
{arrayfunc,variables}.c
	- when inserting a value into an associative array using syntax like
	  T=v where T is an already-declared associative array using key "0",
	  make sure the key is in newly-allocated memory so it can be freed
	  when the variable is unset.  Fixes bug reported as redhat 518644
	  by Jon Fairbairn

				   8/26
				   ----
lib/readline/funmap.c
	- add "old-menu-complete" binding for rl_old_menu_complete

lib/readline/readline.h
	- add extern declaration for rl_old_menu_complete

subst.c
	- fix memory leak when processing ${!prefix@}.  Need to dispose all
	  words in the word list created from all matching variable.  Fixes
	  bug reported by muszi@muszi.kite.hu.

				   8/29
				   ----
execute_cmd.c
	- add fflush(stdout) and fflush(stderr) to child coproc code before
	  calling exit after execute_in_subshell

				   8/31
				   ----
lib/readline/{{bind,readline}.c,rlprivate.h}
	- new bindable variable, "echo-control-characters", enabled by default.
	  This controls whether or not readline honors the tty ECHOCTL bit
	  and displays characters corresponding to keyboard-generated signals.
	  Controlled by _rl_echo_control_chars variable, declared in readline.c

lib/readline/signals.c
	- if _rl_echo_control_chars == 0, don't go through _rl_echo_signal_char


lib/readline/doc/{readline.3,rluser.texi}
	- document "echo-control-characters" bindable variable

				    9/1
				    ---
lib/readline/histexpand.c
	- hist_string_extract_single_quoted now takes an additional argument:
	  a flags word.  The only defined value (flags & 1) allows backslash
	  to quote the single quote.  This is to inhibit history expansion
	  inside $'...' containing an escaped single quote.
	- change history_expand to call hist_string_extract_single_quoted
	  with flags == 1 if it sees $'.  Fixes bug reported by Sean
	  Donner <sean.donner@gmail.com>

				    9/2
				    ---
builtins/printf.def
	- add a call to sh_wrerror if ferror() succeeds in the PRETURN macro,
	  to print an error message in the case that the final fflush fails
	  (for instance, because it attempts to write data that didn't have a
	  trailing newline).  Fixes bug reported by Stefano Lattarini
	  <stefano.lattarini@gmail.com>

				    9/7
				    ---
arrayfunc.c
	- some fixes to assign_compound_array_list to avoid null pointer
	  dereferences pointed out by clang/scan-build

lib/glob/glob.c
	- fixes to udequote_pathname and wdequote_pathname to avoid possible
	  null pointer dereferences pointed out by clang/scan-build

lib/readline/undo.c
	- fix to _rl_copy_undo_list (function unused) to avoid deref of
	  uninitialized pointer pointed out by clang/scan-build

general.c
	- fix string_to_rlimtype so it works if passed a null pointer (though
	  it never is)

builtins/mapfile.def
	- fix to mapfile() to avoid possible null pointer dereference pointed	
	  out by clang/scan-build

variables.c
	- fix to valid_exportstr to avoid possible null pointer dereferences
	  pointed out by clang/scan-build

bashline.c
	- fix to bash_execute_unix_command to avoid possible null pointer
	  dereference if READLINE_LINE or READLINE_POINT is not bound

				   9/11
				   ----
[Prayers for the victimes of 9/11/2001]

command.h
	- add `rflags' member to struct redirect to hold private flags and
	  state information
	- change redirector to a REDIRECTEE instead of int to prepare for
	  possible future changes

{copy_cmd,dispose_cmd,make_cmd,print_cmd,redir}.c
	- changes resulting from type change of `redirector' member of struct
	  redirect: change x->redirector to x->redirector.dest and add code
	  where appropriate to deal with x->redirector.filename

make_cmd.h
	- change extern declaration for make_redirection

make_cmd.c
	- first argument of make_redirection is now a `REDIRECTEE' to prepare
	  for possible future changes.  First arg is now assigned directly to
	  redirector member instead of assigning int to redirector.dest

{make_cmd,redir}.c,parse.y
	- changes resulting from type change of first argument to
	  make_redirection from int to REDIRECTEE.  In general, changes are
	  using REDIRECTEE sd and assigning old argument to sd.dest, then
	  passing sd to make_redirection

make_cmd.[ch],parse.y
	- add fourth argument to make_redirection: flags.  Sets initial value
	  of `rflags' member of struct redirect
	- changed all callers of make_redirection to add fourth argument of 0

				   9/15
				   ----
parse.y
	- change read_token_word to return REDIR_WORD for tokens of the form
	  {var} where `var' is a valid shell identifier and the character
	  following the } is a `<' or `>'
	- add REDIR_WORD versions of all input and output file redirections
	  and here documents

print_cmd.c
	- change input and output file redirection direction and here
	  document cases of print_redirection to print a varname
	  specification of the form {var} when appropriate.  Still need
	  to fix rest of cases

redir.c
	- implement REDIR_VARASSIGN semantics for file input and output
	  redirections and here documents

				   9/16
				   ----
parse.y
	- added REDIR_WORD versions of remaining redirection constructs except
	  for err_and_out ones

redir.c
	- handle REDIR_VARASSIGN semantics for rest of redirection constructs 
	- accommodate REDIR_VARASSIGN when translating redirections
	- new function, redir_varvalue, does variable lookup for {v} when
	  redirection needs the value (e.g., r_close_this)

print_cmd.c
	- fix rest of cases to print {varname} when REDIR_VARASSIGN is set in
	  redirect->rflags

doc/{bash.1,bashref.texi}
	- document new {varname} REDIR_VARASSIGN form of redirections

tests/vredir.{right,tests},vredir[1-5].sub
	- tests for new {varname} REDIR_VARASSIGN form of redirections

				   9/18
				   ----
subst.c
	- new flags argument to split_at_delims: these flags are ORd with
	  SD_NOJMP and passed to skip_to_delim
	- change skip_to_delim to honor new SD_NOQUOTEDELIM flag by not
	  checking whether or not single and double quotes are delimiters
	  if it's set in passed flags until after skipping quoted strings.

subst.h
	- change extern declaration for split_at_delims
	- new define for SD_NOQUOTEDELIM flag

pcomplete.c
	- pass SD_NOQUOTEDELIM in flags argument to split_at_delims so single
	  and double quotes, even though they're in
	  rl_completer_word_break_characters, don't act as word delimiters
	  for programmable completion.  Fixes bug reported by Freddy
	  Vulto <fvulto@gmail.com>

lib/glob/glob.c
	- in glob_filename, after recursively scanning a directory specified
	  with `**', turn off GX_ALLDIRS|GX_ADDCURDIR before calling
	  glob_vector on the rest of the pathname, since it may not apply to
	  the rest of the pattern.  Turned back on if the filename makes it
	  appropriate.  Fixes bug reported by Anders Kaseorg <andersk@mit.edu>

redir.c
	- change execute_null_command to fork a child to execute if any of
	  the commands redirections have the REDIR_VARASSIGN flag set, since
	  those commands are not supposed to have side effects

test.c
	- < and > binary operators will obey the locale by using strcoll if
	  the TEST_LOCALE flag is passed to binary_test

test.h
	- new define for TEST_LOCALE

execute_cmd.c
	- execute_cond_node sets TEST_LOCALE so [[ str1 < str2 ]] (and >)
	  obey the locale.  Fixes bug/incompatibility reported by Greg
	  Wooledge <wooledg@eeg.ccf.org>

doc/{bash.1,bashref.texi}
	- documented [[ command new locale-sensitive treatment of < and >

				   9/24
				   ----
configure.in
	- add "darwin10" cases like darwin8 and darwin9 to handle linking with
	  included readline and history libraries

				   9/26
				   ----
lib/readline/display.c
	- modify change of 7/24 to use prompt_physical_chars instead of
	  prompt_visible_length to account for visible multibyte characters in
	  the line (usually in the prompt).  Fixes debian bug #547264
	  reported by Pietro Battiston <toobaz@email.it>
	- add flags argument to _rl_col_width; changed callers.  flags > 0
	  means that it's ok to use the already-computed prompt information;
	  flags == 0 means that we're expanding the prompt and we should not
	  short-circuit

parse.y
	- in decode_prompt_string, when expanding \w and \W on Mac OS X,
	  use fnx_fromfs to convert from "filesystem" form to "input" form.
	  This makes $PWD with multibyte characters work in the prompt
	  string on Mac OS X

lib/sh/fnxform.c
	- in fnx_fromfs and fnx_tofs, use templen instead of outlen as last
	  argument in calls to iconv, since outlen is used to keep track of
	  the size of the buffer, and iconv potentially modifies its
	  `outbytesleft' argument

				   9/29
				   ----
subst.c
	- make skip_to_delim understand how to skip over process substitution
	  constructs the way it skips $(...) command substitution

				   9/30
				   ----
lib/readline/terminal.c
	- don't set the `terminal has meta key' flag if the `MT' capability is
	  available; that means something completely different

				   10/1
				   ----
builtins/help.def
	- make sure width is at least 7, since we pass `width/2 - 3' to strncpy
	  as the length argument.  Terminal widths <= 6 are converted to 80.
	  Fixes bug reported by Chris Hall <c@pobox.co.uk>

configure.in
	- changed version to 4.1-alpha

subst.h
	- new flag for skip_to_delim: SD_NOSKIPCMD, which means to not skip
	  over embedded command and process substitutions, but rather to look
	  for delimiters within them

subst.c
	- implement semantics of SD_NOSKIPCMD in skip_to_delim

bashline.c
	- call skip_to_delim with SD_NOSKIPCMD from find_cmd_start, so
	  programmable completion can use the completion defined for `b' for
	  command lines like "a $(b c".  Fixes inconsistency/bug reported by
	  Freddy Vulto <fvulto@gmail.com>

parser.h
	- replace unused PST_CMDTOKEN parser state value with PST_EXTPAT,
	  means currently parsing an extended glob pattern (extglob)

parse.y
	- fix cond_node() so that extended_glob is set before parsing the
	  rhs of the `==' or `!=' operators.  For ksh93 compatibility.
	- reset extended_glob to global value (saved in parse_cond_command())
	  in reset_parser()

				   10/5
				   ----
jobs.c
	- change waitchld() to only interrupt the wait builtin when the shell
	  receives SIGCHLD in Posix mode.  It's a posix requirement, but
	  makes easy things hard to do, like run a SIGCHLD trap for every
	  exiting child.  Change prompted by question from Alex Efros
	  <powerman@powerman.name>

doc/bashref.texi
	- document new posix mode behavior about SIGCHLD arriving while the
	  wait builtin is executing when a trap on SIGCHLD has been set

				   10/6
				   ----
lib/readline/histexpand.c
	- fix hist_expand to keep from stopping history expansion after the
	  first multibyte character (a `break' instead of a `continue').
	  Fixes debian bug (#549933) reported by Nikolaus Schulz
	  <microschulz@web.de>

				   10/8
				   ----
builtins/read.def
	- implement new `-N nchars' option: read exactly NCHARS characters,
	  ignoring any delimiter, and don't split the result on $IFS.
	  Feature requested by Richard Stallman <rms@gnu.org>

doc/{bash.1,bashref.texi}
	- document new `read -N' option

				   10/9
				   ----
lib/readline/bind.c
	- new bindable variable, "enable-meta-key", controls whether or not
	  readline enables any meta modifier key the terminal claims to
	  support.  Suggested by Werner Fink <werner@suse.de>

lib/readline/doc/{readline.3,rluser.texi},doc/bash.1
	- document new readline "enable-meta-key" bindable variable

				   10/10
				   -----
trap.c
	- new function, free_trap_string(), does what it says and turns off
	  SIG_TRAPPED flag without changing signal disposition

[bash-4.1-alpha frozen]

				   10/16
				   -----
builtins/mapfile.def
	- return an error if the variable passed is not an indexed array.
	  Fixes bug reported by Nick Hobson <nick.hobson@yahoo.com>
	- change help text to make it clear that an indexed array is required

doc/{bash.1,bashref.texi}
	- changed description of mapfile to note that the array variable
	  argument must be an indexed array, and mapfile will return an
	  error if it is not

subst.c
	- change expand_string_unsplit and expand_string_leave_quoted to
	  add the (previously unused) W_NOSPLIT2 flag to the created word
	- change expand_word_internal to understand W_NOSPLIT2 to mean that
	  we're not going to split on $IFS, so we should not quote any
	  characters in IFS that we add to the result string.  Fixes bug
	  reported by Enrique Perez-Terron <enrio@online.no>
	- change cond_expand_word similarly.  Fixes rest of bug reported by
	  Enrique Perez-Terron <enrio@online.no>

parse.y
	- save and restore value of last_command_subst_pid around call to
	  expand_prompt_string in decode_prompt_string.  Fixes bug that causes
	  $? to be set wrong when using a construct like false || A=3 when
	  set -x is enabled and $PS4 contains a command substitution.  Reported
	  by Jeff Haemer <jeffrey.haemer@gmail.com>

				   10/17
				   -----
execute_cmd.c
	- in execute_in_subshell, make sure we set setjmp(return_catch) before
	  running the command, in case the command or its word expansion
	  calls jump_to_top_level.  Fixes bug reported by Nils Bernhard
	  <nils.bernhard@yahoo.de>

subst.c
	- new PF_NOSPLIT2 flag for param_expand
	- parameter_brace_expand takes a new `pflags' argument, before the
	  `output' parameters; passes to param_expand as necessary
	- change parameter_brace_expand to call parameter_brace_expand_word
	  with the PF_NOSPLIT2 flag if the pflags argument to
	  parameter_brace_expand has it set

parse.y
	- change report_syntax_error to set last_command_exit_value to
	  EX_BADSYNTAX if parse_and_execute_level is > 0, indicating a
	  syntax error while we're executing a dot script, eval string,
	  trap command, etc.

builtins/evalstring.c
	- in parse_and_execute, if parse_command() returns non-zero,
	  indicating a parse error, print a warning message if the conditions
	  would require  a posix-mode shell to abort (parse error in a `.'
	  script or eval string)

				   10/19
				   -----
builtins/evalfile.c
	- even if the `check binary' flag is not passed to _evalfile, return an
	  error after reading 128 null characters if called by `source', on
	  the assumption that it's probably a binary file.  [This will be in
	  bash-4.1-beta]

				   10/24
				   -----
[bash-4.1-alpha released]

bashline.c
	- don't call command_substitution_completion_function if we're
	  completing a substring delimited by a single quote.  Fixes bug
	  reported by bash-bugs@atu.cjb.net

lib/readline/complete.c
	- make sure _rl_skip_completed_text defaults to 0, as the
	  documentation states (incorrect in bash-4.1-alpha)
	- in insert_match, skip over a close quote in the replacement text if
	  the character at point when completion is invoked is a single
	  quote.  Fixes complaint from bash-bugs@atu.cjb.net

				   10/26
				   -----
shell.c
	- in main, make sure "$EMACS" is non-null before calling strstr on its
	  value.  Fixes Red Hat bug 530911 submitted by Mitchell Berger

builtins/mapfile.def
	- don't save callback commands in shell history.  Suggested by
	  Jan Schampera <jan.schampera@web.de>

mailcheck.c
	- in file_mod_date_changed, make sure the modification time is later
	  than the saved modification date, not just that it's not equal.
	  Fix from Evgeniy Dushistov <dushistov@mail.ru>
	- in file_access_date_changed, make sure the access time is later
	  than the saved access time, not just that it's not equal

				   10/27
				   -----
builtins/shopt.def
	- added new `compat40' compatibility variable, with associated changes
	  to shell_compatibility_level(), since the default compatibility level
	  is now 41

test.c
	- make the < and > operators to [[ use strcoll() only if the shell
	  compatibility level is greater than 40 (it is 41 by default in
	  bash-4.1)

				   10/28
				   -----
support/shobj-conf
	- decrease the default version of FreeBSD that creates shared libraries
	  to 4.x.  Advice from Peter Jeremy <peterjeremy@acm.org>

				   11/2
				   ----
parse.y
	- change parse_comsub to free `heredelim' and set it to 0 whenever the
	  comsub scanner finds the end of a here document.  Really need to
	  implement a stack of here doc delimiters like in the parser (can we
	  use redir_stack here, too?)
	- fix parse_comsub to not attempt to read another here doc delimiter
	  after seeing a shell break character (that is not newline) if we
	  already have one.  Fixes Debian bash bug #553485, submitted by
	  Samuel Hym <samuel.hym@gmail.com>

				   11/3
				   ----
variables.c
	- fix bind_variable_internal to call a variable's dynamic 'set function'
	  with the right arguments depending on whether its an associative
	  array, an indexed array, or a scalar.  Fixes Ubuntu bug #471504
	  https://bugs.launchpad.net/ubuntu/+source/bash/+bug/471504 reported
	  by AJ Slater <aj.slater@gmail.com>

[bash-4.1-beta frozen]

				   11/11
				   -----
builtins/printf.def
	- in getintmax(), in the case of a conversion error, return the partial
	  value accumulated so far, which is suppose to be what
	  strtoimax/strtoll/strtol returns

				   11/17
				   -----
[bash-4.1-beta released]

				   11/18
				   -----
builtins/{common.h,shopt.def},shell.c
	- changed shopt variable "set functions" to take the option name as
	  the first argument; changed function prototypes and callers

builtins/shopt.def
	- change set_compatibility_level() to turn off other compatNN options
	  when one is set -- enforce mutual exclusivity.  Fixes problem noted
	  by Jan Schampera <jan.schampera@web.de>

				   11/19
				   -----
lib/readline/rltty.c
	- make sure prepare_terminal_settings() tests for the presence of
	  ECHOCTL before using it.  Fixes bug reported by Joachim Schmitz
	  <schmitz@hp.com>

config-top.h
	- new WORDEXP_OPTION define (off by default)

shell.c
	- don't include the --wordexp option or the supporting function
	  (run_wordexp) if WORDEXP_OPTION is not defined.  Suggested by
	  Aharon Robbins <arnold@skeeve.com>

execute_cmd.c
	- in execute_cond_node, turn on comsub_ignore_return if the flags
	  indicate we're ignoring the return value before calling
	  cond_expand_word.  Fixes bug reported by Anirban Sinha
	  <asinha@zeugmasystems.com>

				   11/20
				   -----
lib/sh/snprintf.c,builtins/printf.def
	- change check for HAVE_ASPRINTF and HAVE_SNPRINTF to check if value
	  is 1 or 0 rather than whether they are defined or not.  This allows
	  a value of 0 to enable function replacement

configure.in,aclocal.m4
	- new autoconf macro, BASH_FUNC_SNPRINTF, checks for snprintf present
	  and working as C99 specifies with a zero length argument.  Idea
	  from Greg Wooledge <wooledg@eeg.ccf.org>
	- new macro BASH_FUNC_VSNPRINTF, does same thing for vsnprintf

				   11/25
				   -----
subst.c
	- in command_substitute, only tell parse_and_execute to reset the line
	  number in an interactive shell if sourcelevel == 0 -- we'll use the
	  line numbers from the sourced file

execute_cmd.c
	- in execute_simple_command, only subtract function_line_number from
	  line_number if sourcelevel == 0.  If sourcing, we'll use the line
	  numbers from the sourced file.  Fixes bug reported by Hugo
	  Mildenberger <Hugo.Mildenberger@namir.de>

builtins/declare.def
	- in declare_internal, call bind_assoc_variable instead of
	  bind_array_variable in the case of declare -A foo=bar.  Fixes bug
	  reported by Bernd Eggink <monoped@sudrala.de>.

				   11/27
				   -----
lib/readline/util.c
	- change declaration for _rl_walphabetic to use prototype, assuming
	  that any system with multibyte characters has a compiler that can
	  handle prototypes.  Fix for AIX compilation problem reported by
	  Nick Hillman <nick_hillman@neverbox.com>

				   11/28
				   -----
execute_cmd.c
	- make funcnest file-scope static and unwind-protect its value in
	  execute_function, so it can be used as a real measure of function
	  call nesting

general.c
	- fix off-by-one error in trim_pathname that caused it to short-circuit	
	  when PROMPT_DIRTRIM == number of directories - 1.  Fixes bug
	  reported by Dennis Williamson <dennistwilliamson@gmail.com>

				   11/29
				   -----
jobs.c
	- when fork() returns -1/EAGAIN, call waitchld(-1, 0) so the shell can
	  reap any dead jobs before trying fork again.  Currently disabled
	  until bash-4.2 development starts

lib/readline/complete.c
	- when incrementing _rl_interrupt_immediately, make sure it's greater
	  than 0 before decrementing it.  In practice, not a problem, but
	  the right way to do it.  Suggested by Jan Kratochvil
	  <jan.kratochvil@redhat.com>

lib/readline/signals.c
	- make sure rl_signal_handler doesn't set rl_caught_signal if
	  _rl_interrupt_immediately is set, so RL_CHECK_SIGNALS doesn't
	  cause it to be processed twice.  Suggested by Jan Kratochvil
	  <jan.kratochvil@redhat.com>
	- if the callback interface is being used, use the code path that
	  immediately handles signals.  This restores the readline-5.2
	  behavior.  Fixes GDB readline bug reported by Jan Kratochvil
	  <jan.kratochvil@redhat.com>

				   12/18
				   -----
[bash-4.1-rc1 released]

				   12/22
				   -----
config-top.h
	- don't have SYSLOG_HISTORY enabled by default

lib/sh/Makefile.in
	- add explicit dependency on pathnames.h for parallel make support

externs.h
	- add extern declaration for xtrace_fdchk

lib/sh/snprintf.c
	- add local prototype declarations for isinf, isnan if we are providing
	  local definitions

lib/sh/fnxform.c
	- add extern declaration for get_locale_var if HAVE_LOCALE_CHARSET not
	  defined

execute_cmd.c
	- define NEED_FPURGE_DECL so we pick up any extern declaration for
	  fpurge (e.g., if the system doesn't provide it)

builtins/shopt.def
	- correct prototype and declaration for set_shellopts_after_change so
	  it's the correct type for shopt_set_func_t
	- add new function shopt_enable_hostname_completion that is the correct
	  type for shopt_set_func_t; just calls enable_hostname_completion and
	  returns its result

				   12/26
				   -----
doc/{bash.1,bashref.texi}
	- add \E and \" escape sequences to ANSI-C quoting description.
	  Suggested by Aharon Robbins <arnold@skeeve.com>

				   12/29
				   -----
doc/bash.1
	- make sure shell and environment variable names are always in
	  `small caps' bold.  Suggested by Aharon Robbins <arnold@skeeve.com>

				   12/30
				   -----
{execute_cmd.c,parse.y,Makefile}
	- changes for building minimal configuration from Matthias Klose
	  <doko@debian.org>

[bash-4.1 frozen]
