--- /dev/null
+ 4/9/2001
+ --------
+[bash-2.05 released]
+
+ 4/10
+ ----
+redir.c
+ - check return value of fclose() in write_here_document() for error
+ returns; don't just rely on fwrite() failing
+
+support/bashbug.sh
+ - set TMPDIR to /tmp if it's null or unset
+ - use $TMPDIR in the TEMP tempfile name template
+ - fixed the call to `mktemp', if it exists, to make it more portable
+
+jobs.c
+ - if WCONTINUED is not defined, define it to 0 and add a define for
+ WIFCONTINUED(wstatus) which expands to 0
+ - add WCONTINUED to the flags passed to waitpid(2) in waitchld()
+ - don't increment children_exited if waitpid's status is WIFCONTINUED,
+ since we don't want to call a SIGCHLD trap handler in this case
+ - in waitchld(), we set child->running to 1 if WIFCONTINUED(status)
+ is non-zero
+ - make sure pretty_print_job doesn't check for the core dump bit if
+ the process has been continued; it's only valid if the job is dead
+ - in set_job_status_and_cleanup, set the job to JRUNNING if job_state
+ is non-zero and the job was previously marked as JSTOPPED
+
+configure.in
+ - add -DBROKEN_DIRENT_D_INO to interix LOCAL_CFLAGS
+
+lib/glob/glob.c
+ - if BROKEN_DIRENT_D_INO is defined, define REAL_DIR_ENTRY to 1
+
+jobs.c
+ - in kill_pid, we only need to block and unblock SIGCHLD if the
+ `group' argument is non-zero, since otherwise we just call `kill'
+ on the pid argument
+
+version.c
+ - update copyright date to 2001
+
+bashline.c
+ - prog_complete_return needs to take a `const char *' as its first
+ argument
+ - history_completion_generator needs to take a `const char *' as
+ its first argument, and `text' needs to be a `const char *'
+
+ 4/11
+ ----
+redir.c
+ - fixed a weird typo in redir_special_open, case RF_DEVFD, added
+ call to all_digits before call to legal_number
+ - fixed do_redirection_internal to call legal_number instead of atol(3)
+ when translating r_duplicating_{in,out}put_word, so it handles
+ overflow better
+ - produce an error message in redirection_error for out-of-range
+ file descriptors
+ - change allocation strategy in redirection_error so we don't have to
+ malloc scratch memory if redirection_expand() fails
+
+jobs.h
+ - added defines for `running' member of a struct process
+
+general.c
+ - fix legal_number to return 0 when strtol(3) reports overflow or
+ underflow
+
+parse.y
+ - changed read_token_word to call legal_number instead of atoi(3)
+
+input.c
+ - return -1/EBADF from close_buffered_fd if fd is < 0
+
+command.h
+ - fixed bogus comment about IS_DESCRIPTOR in description of the
+ REDIRECTEE struct
+
+print_cmd.c
+ - change cprintf's 'd' modifier code to display negative numbers as
+ an out-of-range value. We can do this only because the only use
+ of %d is to output file descriptor numbers in redirections
+
+support/mksignames.c
+ - need to include config.h to get a possible value for
+ UNUSABLE_RT_SIGNALS
+
+ 4/16
+ ----
+lib/readline/doc/rluser.texinfo
+ - corrected a small error in one description of M-DEL
+
+ 4/17
+ ----
+stringlib.c
+ - need to initialize `ind' before calls to RESIZE_MALLOCED_BUFFER
+ in strcreplace()
+
+support/bashversion.c
+ - new file, prints bash version information
+
+Makefile.in
+ - rules for building bashversion and linking it to version.o
+
+ 4/24
+ ----
+conftypes.h
+ - new file with HOSTTYPE, OSTYPE, MACHTYPE, etc. defines from
+ variables.h
+
+variables.h, version.c
+ - include conftypes.h
+
+patchlevel.h
+ - new file, contains define for PATCHLEVEL. Doing away with the old
+ scheme of having the information in configure.in
+
+version.c
+ - include patchlevel.h
+
+Makefile.in
+ - run bashversion -p to find patch level rather than have configure
+ substitute in a value
+ - pass -S ${top_srcdir} to support/mkversion.sh
+
+support/mkversion.sh
+ - don't put PATCHLEVEL define into version.h, but accept and ignore
+ a -p option
+ - take a new -S srcdir option
+ - find the patch level by parsing it out of patchlevel.h
+
+configure.in
+ - hard-code BASHVERS assignment instead of reading it from a file
+ - remove BASHPATCH; don't substitute it
+
+_distribution,_patchlevel
+ - removed
+
+ 4/26
+ ----
+shell.c
+ - call init_noninteractive() in open_shell_script if forced_interactive
+ is non-zero (the shell was started with -i) and fd_is_tty is 0
+ (the script file is a real file, not something like /dev/stdin),
+ since it wasn't done earlier
+
+builtins/printf.def
+ - change for POSIX.2 compliance when conversion errors are encountered
+ when processing %d, %u, and floating point conversion operators
+ (print a warning message, return the value accumulated at the time
+ of the error -- which is always 0 -- and exit with a non-zero status)
+
+command.h
+ - added CMD_COMMAND_BUILTIN for use by the `command' builtin and the
+ code in execute_cmd.c
+
+builtins/command.def
+ - add CMD_COMMAND_BUILTIN to the created command's flags
+
+ 5/1
+ ---
+configure.in
+ - add call to AC_C_CONST to test `const' compiler behavior
+ - add call to AC_C_INLINE to test `inline' compiler behavior
+ - add call to AC_C_STRINGIZE to test cpp #x stringizing operator
+
+config.h.in
+ - add `#undef const' for configure to substitute
+ - add `#undef inline' for configure to substitute
+ - add `#undef HAVE_STRINGIZE' for configure to substitute
+
+include/stdc.h
+ - remove code that defines or undefines `const' and `inline'
+ - change the __STRING macro to be defined depending on the value
+ of HAVE_STRINGIZE
+
+lib/malloc/malloc.c
+ - change the __STRING macro to be defined depending on the value
+ of HAVE_STRINGIZE
+
+lib/readline/{readline,rlprivate}.h
+ - moved rl_get_termcap to readline.h, making it a public function
+
+lib/readline/readline.h
+ - new #define, RL_READLINE_VERSION, hex-encoded library version
+ number, currently set to 0x0402
+ - new public int variable, rl_readline_version
+
+lib/readline/readline.c
+ - #define RL_READLINE_VERSION if it is not already defined (which it
+ should be in readline.h)
+ - initialize rl_readline_version to RL_READLINE_VERSION
+
+lib/readline/doc/rltech.texinfo
+ - documented rl_get_termcap
+ - documented rl_readline_version
+
+jobs.c
+ - job_exit_status should return an int, not a WAIT (undetected
+ before because on most POSIX-like systems a WAIT is really an int)
+
+builtins/evalfile.c
+ - added FEVAL_REGFILE (file must be a regular file) to accepted
+ _evalfile flags
+ - fc_execute_file() adds FEVAL_REGFILE to _evalfile flags. This
+ means that startup files and files read with `.' no longer need
+ to be regular files
+
+ 5/2
+ ---
+
+lib/termcap/Makefile.in
+ - fix target for installed termcap library (normally unused)
+
+lib/tilde/Makefile.in
+ - fix install target to install in $(libdir) (normally unused)
+
+Makefile.in
+ - don't make $(man3dir) since there's nothing installed there
+
+Makefile.in,doc/Makefile.in
+ - change `man1ext' to `.1', `man3ext' to `.3'
+ - change appropriate install targets to use new values of man[13]ext
+ - use `test ...' instead of `[...]'
+ - add support for DESTDIR root installation prefix, for package
+ building (installdirs, install, install-strip, uninstall targets)
+
+builtins/common.c
+ - new function int get_exitstat(WORD_LIST *list) returns an eight-bit
+ exit status value for use in return, exit, logout builtins
+
+builtins/common.h
+ - extern declaration for get_exitstat()
+
+builtins/{exit,return}.def
+ - call get_exitstat where appropriate
+
+builtins/printf.def
+ - add support for "'" flag character as posix 1003.2-200x d6 says
+ - fix core dump when user-supplied field width or precision is 0
+ - fix to printstr() to handle zero-length precision with `%b' format
+ specifier (printf '%.0b-%.0s\n' foo bar)
+ - fix to printstr() to treat a negative field width as a positive
+ field width with left-justification
+ - fix to mklong to avoid static buffers, which can always be overrun
+ by someone sufficiently motivated
+
+bashline.c
+ - change var in add_host_name to type `size_t' for passing to xrealloc
+
+ 5/3
+ ---
+execute_cmd.c
+ - change restore_signal_mask to accept a sigset_t *, since a sigset_t
+ may not fit into a pointer, change call
+
+unwind_prot.c
+ - use a union UWP in restore_variable when restoring a variable whose
+ size is the same as sizeof(int), the reverse of the method used to
+ store it in unwind_protect_int
+
+builtins/printf.def
+ - use a #define LENMODS containing the length modifiers instead of
+ testing against each possible modifier character, save any mod
+ character found
+ - add support for ISO C99 length specifiers `j', `t', and `z'
+ - if `L' modifier is supplied with a floating point conversion char,
+ pass a `long double' to printf if HAVE_LONG_DOUBLE is defined
+
+configure.in,config.h.in
+ - call AC_C_LONG_DOUBLE to check for `long double'; define
+ HAVE_LONG_DOUBLE if supported
+
+bashline.c
+ - fix an inadvertantly-unclosed comment in attempt_shell_completion
+ - make set_saved_history return a value
+ - make dynamic_complete_history return a useful value
+
+{make_cmd,execute_cmd,shell,subst,trap,variables,input,unwind_prot,test,
+pcomplete}.c
+ - removed some declared-but-unused variables
+
+builtins/{cd,enable,fc,set,setattr,type,umask,printf,complete}.def
+ - removed some declared-but-unused variables
+
+lib/sh/{zread,netopen}.c
+ - removed some declared-but-unused variables
+
+execute_cmd.c
+ - in execute_arith_command, use a long variable to hold the result
+ of evalexp(), since that's what it returns
+
+builtins/evalstring.c
+ - make cat_file return -1 on a read or write error
+
+lib/sh/stringlib.c
+ - make merge_stringlists() return the right value
+
+ 5/7
+ ---
+pcomplete.c
+ - remove typo that caused empty declaration (;;)
+
+parse.y
+ - fix yyerror() to accept a single string argument; fix callers
+
+trap.c
+ - cast pointer to long instead of int when printing message with
+ internal_warning() in run_pending_traps()
+
+subst.c
+ - fix process_substitute to handle stdin being closed
+
+test.c
+ - change `while' to `if' in and() and or(), since the loop isn't
+ actually performed -- there's an unconditional `return' in the
+ loop body
+ - check for integer overflow of arguments to `-t'
+
+lib/sh/netopen.c
+ - change _getserv() to reject negative port/service numbers
+
+expr.c
+ - fix strlong() to not convert the base specification from long to
+ int before checking for overflow, since truncation on machines
+ where sizeof(int) != sizeof(long) may mask errors
+
+builtins/{jobs,kill,wait}.def
+ - use legal_number instead of atoi when converting strings to pid_t;
+ check for numeric overflow
+
+input.c
+ - fix for cygwin in b_fill_buffer -- off-by-one error when checking
+ buffer for \r\n termination
+
+general.h
+ - new #define INT_STRLEN_BOUND(t), computes max length of string
+ representing integer value of type T, possibly including a sign
+ character
+ - include <limits.h> if it's present
+
+{execute_cmd,findcmd,test}.c
+ - don't include <limits.h>, since general.h does it now
+
+{execute_cmd,lib/sh/itos,pcomplete,print_cmd,subst,variables}.c
+ - use INT_STRLEN_BOUND instead of static array sizes when converting
+ various strings to integer values
+
+shell.h
+ - struct fd_bitmap now uses an `int' size, since it's bounded by
+ the number of file descriptors, which must fit into an `int'
+
+execute_cmd.c
+ - FD_BITMAP_DEFAULT_SIZE is now 32, not 32L
+ - new_fd_bitmap takes an `int' size parameter, not a `long'
+
+execute_cmd.h
+ - change prototype for new_fd_bitmap()
+
+test.c
+ - fix test_stat to check for overflow when parsing the integer file
+ descriptor number; return ENOENT instead of EBADF for files that
+ are not open
+
+hashlib.c
+ - don't discard the upper 32 bits of the random value, if present
+
+lib/readline/shell.c
+ - use the same INT_STRLEN_BOUND mechanism to decide how much space to
+ allocated in sh_set_lines_and_columns
+
+ 5/8
+ ---
+aclocal.m4
+ - add check for libtinfo (termcap-specific portion of ncurses-5.2) to
+ BASH_CHECK_LIB_TERMCAP
+ - new macro, RL_LIB_READLINE_VERSION, checks version of installed
+ readline library and (optionally) writes version #defines to
+ config.h. Bash doesn't use the version defines
+
+configure.in
+ - call RL_LIB_READLINE_VERSION instead of support/rlvers.sh
+
+execute_cmd.c
+ - fix execute_shell_script and the WHITECHAR and STRINGCHAR macros
+ to check array bounds before indexing into the sample string
+
+unwind_prot.[ch]
+ - import new versions submitted by Paul Eggert <eggert@twinsun.com>
+ with a couple of changes for backwards compatibility, so the rest
+ of the source doesn't need to be changed yet
+
+jobs.c
+ - use unwind_protect_var on last_made_pid in run_sigchld_trap
+
+builtins/bind.def
+ - use unwind_protect_var on rl_outstream
+
+general.c
+ - rework print_rlimtype to use INT_STRLEN_BOUND and handle the
+ most negative number correctly
+
+expr.c
+ - `tokval' should have been a `long', since all arithmetic is done
+ as longs
+
+builtins/history.def
+ - consolidate tests for valid history position in one block to
+ avoid duplicate code and strings
+
+builtins/ulimit.def
+ - fix check for overflow when setting limit to work when int is 32
+ bits and RLIMTYPE is 64
+
+lib/sh/tmpfile.c
+ - don't truncate the result of time(3) to int; just use time_t,
+ since it's being assigned to an `unsigned long'
+
+mailcheck.c
+ - use legal_number instead of atoi in time_to_check_mail() to catch
+ more numeric errors; consolidate error checking in one block
+ - last_time_mail_checked should be a time_t
+
+ 5/9
+ ---
+builtins/set.def
+ - recognize `set [-+]o nolog' if HISTORY is defined
+
+bashline.c
+ - new variable `dont_save_function_defs', set by `set -o nolog';
+ currently ignored
+
+command.h
+ - the `dest' member of a REDIRECTEE is now an `int'
+
+parse.y,redir.c
+ - changed uses of `redir.test' (where redir is a REDIRECTEE) since
+ it's now an int
+
+lib/readline/rlstdc.h
+ - don't mess around with `const', rely on configure to supply a
+ proper definition if the compiler doesn't support it
+
+lib/tilde/tilde.h
+ - include <config.h> if HAVE_CONFIG_H is defined
+ - don't mess around with `const', rely on configure
+
+builtins/shopt.def
+ - new read-only `shopt' option, login_shell, non-zero if shell is a
+ login shell (as decided by shell.c)
+ - new function set_login_shell(), sets shopt private value of
+ login_shell
+
+builtins/common.h
+ - new extern declaration for set_login_shell
+
+shell.c
+ - call set_login_shell after setting value of login_shell (in
+ main() and set_shell_name())
+
+parse.y
+ - added new `\A' prompt string escape sequence: time in 24-hour
+ HH:MM format
+
+configure.in, config.h.in
+ - check for <grp.h>, define HAVE_GRP_H if found
+
+builtins/complete.def
+ - add new `-A group/-g' option to complete group names
+
+pcomplete.h
+ - new define for CA_GROUP, used with group name completion
+
+pcomplete.c
+ - add code to support CA_GROUP group name completion
+
+bashline.c
+ - new function, bash_groupname_completion_function(), supports
+ programmable completion of group names
+
+bashline.h
+ - extern declaration for bash_groupname_completion_function
+
+lib/readline/bind.c
+ - new inputrc variable, `match-hidden-files', controls completion
+ matching files beginning with a `.' (on Unix)
+
+lib/readline/complete.c
+ - new variable, _rl_match_hidden_files, mirrors `match-hidden-files'
+ inputrc variable
+
+lib/readline/rlprivate.h
+ - extern declaration for _rl_match_hidden_files
+
+builtins/hash.def
+ - new `-t' option to list hash values for each filename argument
+
+builtins/read.def
+ - alarm(3) takes an `unsigned int' argument, not int
+ - check for arithmetic overflow with -t and -n options
+
+input.c
+ - check for read error before doing \r\n translation on cygwin in
+ b_fill_buffer
+ - reset bp->b_used to 0 instead of leaving it at -1 on read error
+ in b_fill_buffer
+
+builtins/shopt.def
+ - new functions, shopt_setopt(name, mode) and
+ shopt_listopt(name, mode) to give the rest of the shell an easy
+ interface
+
+builtins/common.h
+ - extern declarations for shopt_setopt and shopt_listopt
+
+shell.c
+ - new invocation options -O and +O, to list or set/unset shopt
+ options like +o/-o sets and unsets `set -o' options
+
+doc/{bash.1,bashref.texi}
+ - document `set -o nolog'
+ - document `login_shell' shopt option
+ - document new `\A' prompt string escape sequence
+ - document new `-t' option to `hash'
+ - document new `[+-]O' invocation option
+
+doc/bashref.texi
+ - add text to `Invoking Bash' section defining a login shell; text
+ taken from man page
+
+doc/bash.1, lib/readline/doc/rluser.texinfo
+ - documented new complete/compgen `-A group/-g' option
+
+lib/readline/doc/{rluser.texinfo,readline.3}, doc/bash.1
+ - documented new `match-hidden-files' inputrc variable
+
+ 5/10
+ ----
+configure.in
+ - fix AC_CHECK_PROG(ar, ...)
+ - add AC_CHECK_TYPE for ssize_t
+
+config.h.in
+ - new #undef for ssize_t
+
+lib/sh/zread.c
+ - int -> ssize_t fixes to mirror modern declarations of read and write
+ - the `off' variable in zsyncfd should be an off_t since it computes
+ a file offset
+ - the local buffer `lbuf' is now char, since it's not nice to pass
+ unsigned char * to read(2), and the values from it are assigned to
+ a char anyway
+ - lind and lused are now size_t, since they index into a buffer
+ - set lused to 0 on read error
+
+lib/sh/zwrite.c
+ - change second argument to type `char *', since ISO C says you have
+ to pass a `char *' to `write'
+
+externs.h
+ - fix extern declarations of zread, zread1, zreadc, and zwrite
+ - prototype extern declaration of qsort_string_compare
+ - add extern declaration for history_delimiting_chars() from parse.y
+
+input.h
+ - b_used and b_inputp members ofr struct BSTREAM are now size_t
+
+builtins/evalstring.c
+ - the number of chars read with zread in cat_file should be assigned
+ to a variable of type ssize_t
+
+input.c
+ - the number of chars read with zread in b_fill_buffer should be
+ assigned to a variable of type ssize_t
+ - `localbuf' is now type char[], since POSIX says you shouldn't pass
+ unsigned char * to read(2)
+ - in getc_with_restart(), use a variable of type unsigned char to
+ get a value from the local buffer and return it
+ - in ungetc_with_restart, explicitly return the character arg passed
+ to avoid relying on localbuf being unsigned char
+
+subst.c
+ - the number of chars read with zread in read_comsub should be
+ assigned to a variable of type ssize_t
+
+mksyntax.c
+ - instead of casting to unsigned char * in addcstr, use a variable
+ of type unsigned char and let the compiler do the work
+
+parse.y
+ - instead of casting to unsigned char * in yy_readline_get, use a
+ variable of type unsigned char and let the compiler do the work
+ - ditto for yy_string_get and shell_getc (cast to unsigned char)
+
+subst.c
+ - instead of casting to unsigned char when assigning to ifscmap in
+ expand_word_internal, use a variable of type unsigned char and
+ let the compiler do the work
+
+lib/sh/strtrans.c
+ - instead of casting to unsigned char in ansic_quote, use a variable
+ of type unsigned char and let the compiler do the work
+
+builtins/evalstring.c
+ - remove extern declarations for zwrite and run_trap_cleanup; they're
+ in externs.h
+ - prototype cat_file forward declaration
+
+Makefile.in
+ - remove -I$(includedir) from INCLUDES and SUBDIR_INCLUDES
+
+aclocal.m4
+ - change RL_LIB_READLINE_VERSION to set RL_PREFIX, RL_LIBDIR,
+ and RL_INCLUDEDIR to what it used to test the installed readline
+ library version for use by the caller
+ - change RL_LIB_READLINE_VERSION to not compute ac_cv_rl_prefix if
+ the caller has already assigned it a value
+ - rename _rl_prefix -> ac_cv_rl_prefix, _rl_libdir -> ac_cv_rl_libdir,
+ _rl_includedir -> ac_cv_rl_includedir
+
+configure.in
+ - change testing of whether to use the value of
+ $opt_with_installed_readline to be != no, to allow the user to
+ specify a prefix where the installed readline library may be found
+ - if --with-installed-readline=PREFIX is supplied, set ac_cv_rl_prefix
+ to PREFIX before calling RL_LIB_READLINE_VERSION
+ - if --with-installed-readline[=PREFIX] is supplied, don't set
+ RL_LIBDIR and RL_INCLUDEDIR; let RL_LIB_READLINE_VERSION take care
+ of it, set RL_INCLUDE=-I${RL_INCLUDEDIR}
+ - if --with-installed-readline[=PREFIX] is supplied, and we're
+ linking with the history library, assign $RL_LIBDIR to HIST_LIBDIR
+ so we use the same version of the installed readline and history
+ libraries
+
+Makefile.in, builtins/Makefile.in
+ - have configure substitute RL_INCLUDEDIR, set RL_INCLUDEDIR variable
+
+doc/bashref.texi
+ - updated description of --with-installed-readline configure option
+
+general.c
+ - moved QSFUNC typedef here from builtins/common.c
+
+{alias,bashline,variables,lib/sh/stringvec}.c
+ - cast fourth argument to qsort to (QSFUNC *)
+
+alias.c
+ - prototype forward declaration of qsort_alias_compare
+
+bashhist.c
+ - include <glob/glob.h> for extern declaration of glob_pattern_p
+ - remove extern declaration of history_delimiting_chars; it's now
+ in externs.h
+ - prototype forward declarations of histignore_item_func,
+ maybe_add_history, and bash_add_history
+
+bracecomp.c
+ - remove extern declaration for sh_backslash_quote; it's in externs.h
+
+braces.c
+ - remove extern declaration for extract_command_subst; it's in subst.h
+ - prototype forward declarations for expand_amble, array_concat, and
+ brace_gobbler
+
+error.c
+ - prototype extern declaration of give_terminal_to, fix bad call
+
+{execute_cmd,expr,findcmd,jobs,mailcheck,nojobs,pcomplete,print_cmd,redir,
+shell}.c
+ - prototype all static forward function declarations
+
+pcomplete.c
+ - changed some function parameters to `const char *' to avoid discarding
+ const qualifier
+
+make_cmd.c
+ - make_bare_word, make_word_flags, and make_word now take a
+ `const char *' string argument
+
+make_cmd.h
+ - changed extern declarations for make_bare_word and make_word
+
+print_cmd.c
+ - cprintf now takes a `const char *' as its first argument, like
+ xprintf and printf
+ - the conditional define for xprintf should have been HAVE_VPRINTF,
+ not HAVE_VFPRINTF
+
+shell.c
+ - in isnetconn(), the return value of sizeof() is size_t
+
+aclocal.m4
+ - add inclusion of stddef.h if STDC_HEADERS is defined to 1 in
+ BASH_CHECK_TYPE
+
+configure.in
+ - add a call to BASH_CHECK_TYPE for socklen_t (type of third argument
+ to getpeername(2))
+
+ 5/11
+ ----
+lib/readline/bind.c
+ - make `useq' a char array to pass to rl_macro_bind in
+ rl_parse_and_bind
+
+lib/readline/{{bind,isearch}.c,rlprivate.h}
+ - _rl_isearch_terminators is now a char *, not unsigned char *
+
+{subst,variables,lib/sh/tmpfile}.c
+ - dollar_dollar_pid is now a `pid_t' instead of `int'
+
+variables.c
+ - sbrand() now takes an `unsigned long' to set the seed value
+ - changed last_random_value to type int, since it's always between
+ 0 and 32767
+ - use strtoul to convert the value in assign_random instead of atoi
+ - take out casts in any arguments to sbrand()
+ - take out cast to int in call to inttostr in set_ppid()
+
+subst.c
+ - don't cast last_asynchronous_pid when passing to itos()
+
+{sig,subst}.c
+ - prototype all static forward function declarations
+
+ 5/14
+ ----
+{test,trap,variables}.c
+ - prototype all static forward function declarations
+
+variables.c
+ - free_variable_hash_data() now takes a PTR_T, a `generic pointer'
+
+builtins/{alias,bind,break,cd,complete,declare,enable,exit,fc,fg_bg,help,
+history,jobs,pushd,read,set,trap,umask,
+ - prototype all static forward function declarations
+
+builtins/read.def
+ - reset_eol_delim now takes a `char *' arg, since that's what the
+ unwind_protect functions pass it, and it ignores its arguments
+ anyway
+
+lib/readline/{histsearch,input,kill,rltty,search,vi_mode}.c
+ - prototype all static forward function declarations
+
+lib/tilde/tilde.c
+ - prototype all static forward function declarations
+ - tilde_find_prefix, tilde_find_suffix, isolate_tilde_prefix, and
+ glue_prefix_and_suffix now take `const char *' arguments where
+ appropriate
+
+configure.in,config.h.in
+ - check for vsnprintf, define HAVE_VSNPRINTF if found
+
+lib/readline/display.c
+ - use vsnprintf() in rl_message if it's available; if we don't, at
+ least set the last character in msg_buf to 0 to avoid overrun --
+ we really can't do anything about overflow at this point. if it's
+ available, this fixes buffer overflow problems in rl_message
+
+ 5/15
+ ----
+lib/readline/histexpand.c
+ - in get_history_word_specifier, allow any character to terminate
+ a `:first-' modifier, not just `:' and null. This is what csh
+ appears to do. This allows things like `!:0- xyzzy' to replace the
+ last argument with xyzzy
+
+ 5/18
+ ----
+configure.in, config.h.in
+ - check for <stdint.h>, define HAVE_STDINT_H if found
+ - check for intmax_t in <stdint.h>, define intmax_t as long if not
+ found
+
+ 5/21
+ ----
+builtins/kill.def
+ - change to use strerror() for error message when kill(2) fails
+
+aclocal.m4
+ - new macro, BASH_C_LONG_LONG, check for `long long'
+
+configure.in, config.h.in
+ - call BASH_C_LONG_LONG, define HAVE_LONG_LONG if found
+
+lib/sh/snprintf.c
+ - new file, with implementations of snprintf, vsnprintf, asprintf,
+ and vasprintf, derived from inetutils version
+
+Makefile.in, lib/sh/Makefile.in
+ - add snprintf.c/snprintf.o
+
+configure.in, config.h.in
+ - add checks for snprintf, asprintf, vasprintf, with appropriate
+ cpp defines
+
+lib/readline/{rldefs,xmalloc}.h, lib/readline/xmalloc.c
+ - xmalloc and xrealloc now take `size_t' arguments, like their bash
+ counterparts
+
+externs.h,lib/sh/itos.c
+ - inttostr and itos now take `long' arguments
+ - inttostr takes a `size_t' argument for the buffer size
+
+{expr,lib/malloc/malloc,variables,general}.c
+ - fixed calls to itos() by removing casts, etc.
+
+subst.[ch]
+ - get_dollar_var_value now takes a long, not an int
+ - sub_append_number now takes a long, not an int
+
+subst.c
+ - in parameter_brace_expand_word, use a long and legal_number to
+ translate ${N}, to avoid overflow
+ - in parameter_brace_expand_length, use a long and legal_number to
+ translate ${#N}, to avoid overflow
+ - in do_array_element_assignment, array_expand_index,
+ array_value_internal, use arrayind_t instead of int
+ - let verify_substring_values take long * arguments for the return
+ value of evalexp()
+ - pass long * arguments to verify_substring_values in
+ parameter_brace_substring
+ - parameter_brace_expand_length now returns `long'
+ - parameter_brace_expand now uses a long variable for the return
+ value of parameter_brace_expand_length
+ - param_expand now uses a long variable for the return value from
+ evalexp
+ - array_length reference now returns an `arrayind_t', since it can
+ return the num_elements member of an array, which is of type
+ arrayind_t
+
+subst.h
+ - array_expand_index now returns an `arrayind_t'
+
+array.[ch]
+ - array_subrange now takes arrayind_t arguments, not `int'
+ - dup_array_subrange now uses arrayind_t local variable to do
+ array indexing
+ - use long to print array indices in print_element
+
+variables.c
+ - null_array_assign, assign_dirstack, bind_array_variable
+ now take arrayind_t arguments as array indices
+ - assign_array_var_from_word_list, assign_array_var_from_string,
+ unbind_array_element now use arrayind_t local variables for
+ array indexing
+
+variables.h
+ - change extern declaration of bind_array_variable
+
+builtins/common.[ch]
+ - get_numeric_arg now returns a `long', since it usually returns
+ the value of legal_number()
+
+builtins/{shift,break}.def
+ - use long variables for the return value of get_numeric_arg
+
+builtins/history.def
+ - convert string argument to int only if it's in range
+
+builtins/pushd.def
+ - set_dirstack_element and get_dirstack_element now take `long'
+ index arguments
+ - get_dirstack_index now takes a `long' index argument, since it's
+ passed the converted value from legal_number
+
+lib/sh/timeval.c
+ - in print_timeval, don't assume that the number of minutes fits into
+ an int, since it's just seconds/60.
+
+lib/sh/clock.c
+ - ditto for print_clock_t
+
+ 5/22
+ ----
+shell.c
+ - since the -O option settings may possibly be overridden by the
+ normal shell initialization or posix initialization, save the
+ invocation options on an alist (with add_shopt_to_alist) and
+ process them after basic initialization (with run_shopt_alist)
+
+ 5/23
+ ----
+trap.h
+ - new define, BASH_NSIG, all system signals plus special bash traps
+
+trap.c, builtins/trap.def
+ - use BASH_NSIG for array bounds and loops where appropriate
+
+trap.c
+ - change decode_signal to disallow numeric signal numbers above
+ NSIG -- this means you can only reference special traps like
+ DEBUG by name
+ - new SPECIAL_TRAP(s) macro to test whether s is one of the special
+ bash traps (currently DEBUG and EXIT)
+ - change reset_or_restore_signal_handlers so command substitution
+ doesn't inherit the debug trap (like ksh93), and child processes
+ don't have to rely on initialize_traps being run to get rid of
+ any debug trap
+
+support/mksignames.c
+ - add extra "ERR" signal name, value NSIG+1, allocate space for it
+ and write it out in signal_names[]
+
+trap.h
+ - new define: ERROR_TRAP == NSIG+1, change BASH_NSIG to NSIG+2
+ - extern declarations for set_error_trap, run_error_trap
+ - new define: TRAP_STRING(s), expands to trap_list[s] if signal S
+ is trapped and not ignored, NULL otherwise
+
+trap.c
+ - add ERROR_TRAP to SPECIAL_TRAPS define
+ - initialize ERROR_TRAP stuff in initialize_traps
+ - new function: set_error_trap(command), sets the ERR trap string
+ - new function: run_error_trap(command), runs the ERR trap string
+ - set trap string for ERROR_TRAP to NULL in free_trap_strings
+ - change reset_or_restore_signal_handlers so child processes don't
+ inherit the ERR trap
+ - add case to call run_error_trap in maybe_call_trap_handler
+
+execute_cmd.c
+ - in execute_command_internal, keep track of ERR trap and call it if
+ necessary
+ - use TRAP_STRING to get the value of debug and error traps
+ - in execute_function, arrange things so the ERR trap is not inherited
+ by shell functions, and is saved and restored like the DEBUG trap
+
+doc/{bash.1,bashref.texi}
+ - documented new ERR trap
+
+tests/{trap.{tests,right},trap2.sub,trap2a.sub}
+ - added ERR trap tests
+
+subst.c
+ - on machines without /dev/fd, change the named pipe fifo list to a
+ list of structs containing pathname and proc information
+ - change unlink_fifo_list to kill the proc in the fifo list with
+ signal 0 and not remove the fifo if the proc is still alive. This
+ should fix the problem on those backward systems without /dev/fd
+ where fifos were removed when a job using process substitution was
+ suspended
+
+ 5/24
+ ----
+examples/loadables/getconf.h
+ - new file, with basic defines needed to make getconf work minimally
+ on POSIX systems without the necessary definitions
+
+examples/loadables/getconf.c
+ - replacement functions for confstr, sysconf, pathconf for systems
+ that lack them, providing a minimal posix interface
+ - heavily augmented getconf, now supports all POSIX.1-200x,
+ POSIX.2-200x, Solaris 7, AIX 4.2 getconf variables
+
+ 5/29
+ ----
+builtins/setattr.def
+ - make `readonly', `export', and `declare' print `invisible' variables
+ as just a command and variable name, without a value, when listing
+ all variables (as POSIX.2-200x d6 requires)
+
+ 5/30
+ ----
+
+configure.in
+ - upgraded to autoconf-2.50 on main development machine, so require
+ autoconf-2.50 in preparation for using some if its new features
+ - call AC_C_PROTOTYPES
+ - remove call to AC_EXEEXT, which now does the wrong thing
+ - changed AC_INIT to new flavor
+ - added call to AC_CONFIG_SRCDIR
+ - AC_CONFIG_HEADER -> AC_CONFIG_HEADERS
+ - AC_RETSIGTYPE -> AC_TYPE_SIGNAL
+
+configure.in, aclocal.m4, config.h.in
+ - removed call to BASH_LARGE_FILE_SUPPORT, use AC_SYS_LARGEFILE
+ standard support, with new macros _FILE_OFFSET_BITS and
+ _LARGE_FILES
+ - removed definition of BASH_LARGE_FILE_SUPPORT
+
+doc/bashref.texi
+ - document new `--enable-largefile' configure option
+
+lib/readline/readline.c
+ - change rl_set_prompt to call rl_expand_prompt unconditionally, so
+ local_prompt and local_prompt_prefix get set correctly
+
+ 6/6
+ ---
+lib/readline/complete.c
+ - don't append `/' or ` ' to a match when completing a symlink that
+ resolves to a directory, unless the match doesn't add anything
+ to the word. This means that a tab will complete the word up to
+ the full name, but not add anything, and a subsequent tab will add
+ a slash. Change to append_to_match; callers changed
+
+hashlib.c
+ - new function, hash_table_nentries (table), returns the number of
+ items in TABLE
+
+hashlib.h
+ - extern declaration for hash_table_nentries
+
+configure.in
+ - configure without bash malloc on openbsd; they claim it needs
+ eight-bit alignment (which the bash malloc provides, but...)
+
+ 7/2
+ ---
+stringlib.c
+ - only call RESIZE_MALLOCED_BUFFER from strsub() if the replacement
+ string length is > 0, avoid possible hangs if replacement is null
+
+subst.c
+ - don't include input.h; no longer needed
+
+configure.in
+ - remove calls to AC_SYS_RESTARTABLE_SYSCALLS and
+ BASH_SYS_RESTARTABLE_SYSCALLS; the results are no longer used
+
+config.h.in
+ - remove define for HAVE_RESTARTABLE_SYSCALLS
+
+aclocal.m4
+ - removed definition of BASH_SYS_RESTARTABLE_SYSCALLS; no longer used
+
+execute_cmd.c
+ - changed select command so `return' no longer terminates the select
+ command, so it can be used to return from an enclosing function.
+ This is as ksh (88 and 93) does it
+
+lib/readline/vi_mode.c
+ - fix trivial typo in declaration of vi_motion; `t' appears twice;
+ the second instance should be `T'
+
+ 7/3
+ ---
+configure.in
+ - don't add -static to LDFLAGS on Solaris 2.x. This means that the
+ auxiliary programs will be built as dynamic executables, but that
+ should do no harm
+
+ 7/5
+ ---
+lib/glob/fnmatch.c
+ - fix the code that processes **(pattern) to short-circuit if the
+ pattern is ill-formed or lacks a trailing `)' -- this fixes the
+ segfault on **(/*)
+
+Makefile.in, builtins/Makefile.in
+ - split CCFLAGS into CCFLAGS_FOR_BUILD and CFLAGS, to aid in
+ cross-compilation
+ - build programs that use $(CC_FOR_BUILD) using $(CCFLAGS_FOR_BUILD)
+
+configure.in, config.h.in
+ - check for getaddrinfo(3), define HAVE_GETADDRINFO if found
+
+lib/sh/netopen.c
+ - implemented a version of _netopen (_netopen6) that uses
+ getaddrinfo(3) if available, use if HAVE_GETADDRINFO is defined.
+ old _netopen is _netopen4; _netopen now calls either _netopen6
+ or _netopen4 as appropriate
+
+ 7/9
+ ---
+builtins/exit.def
+ - don't source ~/.bash_logout if subshell_environment is non-zero
+
+execute_command.c
+ - in execute_until_or_while, handle the case where `breaking' is
+ set in the loop test (e.g., by the job control code when a job
+ is stopped with SIGTSTP), but the return value from the test is
+ something that would cause the loop to break. Need to decrement
+ `breaking' in this case
+
+ 7/10
+ ----
+execute_cmd.c
+ - in execute_in_subshell, make sure a command of type cm_subshell
+ inherits its `enclosing' command's CMD_IGNORE_RETURN flag
+
+variables.c
+ - in maybe_make_export_env, don't allow restricted shells to put
+ exported functions in the export environment
+
+ 7/11
+ ----
+lib/glob/strmatch.h
+ - renamed old fnmatch.h
+ - changed guard #ifdef to _STRMATCH_H
+ - include system <fnmatch.h> if HAVE_LIBC_FNM_EXTMATCH is defined
+
+lib/glob/strmatch.c
+ - renamed old fnmatch.c
+ - include "strmatch.h"
+ - if HAVE_LIBC_FNM_EXTMATCH is defined, define a dummy version of
+ strmatch() that just calls fnmatch(3)
+
+lib/glob/glob.c
+ - include "strmatch.h"
+ - fnmatch -> strmatch
+
+Makefile.in, lib/glob/Makefile.in
+ - fnmatch -> strmatch
+
+{bashhist,execute_cmd,pathexp,pcomplete,shell,stringlib,subst,test}.c,
+pathexp.h,builtins/help.def
+ - include <glob/strmatch.h>
+ - fnmatch -> strmatch
+
+execute_cmd.c
+ - broke the code that parses the interpreter name from a #! line
+ out from execute_shell_script to a new function, getinterp()
+ - call getinterp from execute_shell_script
+ - use return value from getinterp in error message about bad
+ #! interpreter in shell_execve
+
+ 7/12
+ ----
+lib/readline/isearch.c
+ - the last isearch string is now remembered in a new static variable,
+ last_isearch_string
+ - if ^R^R is typed, readline now searches for the remembered isearch
+ string, if one exists
+
+ 7/24
+ ----
+pcomplete.h
+ - extern declaration for completions_to_stringlist()
+
+ 7/25
+ ----
+builtins/complete.def
+ - make compgen handle -o default option
+ - make compgen return success only if sl->list_len is non-zero,
+ indicating that there are items on the list
+
+ 7/31
+ ----
+execute_cmd.c
+ - in execute_connection, force stdin to /dev/null for asynchronous
+ commands if job control is not active, not just if the shell is
+ running a shell script (since you can run `set -m' in a script)
+
+lib/readline/rltty.c
+ - make sure _rl_tty_restore_signals resets `tty_sigs_disabled' on
+ successful restoration of the terminal modes
+ - make sure _rl_tty_disable_signals turns off IXON so that ^S and
+ ^Q can be read by rl_quoted_insert
+
+ 8/1
+ ---
+aclocal.m4
+ - new check for FNM_EXTMATCH being defined in <fnmatch.h>, as Ullrich
+ Drepper intends to do for new versions of GNU libc
+
+config.h.in
+ - new definition for HAVE_LIBC_FNM_EXTMATCH
+
+configure.in
+ - check for fnmatch, but don't define anything in config.h
+ - call BASH_FUNC_FNMATCH_EXTMATCH to check for FNM_EXTMATCH
+
+ 8/2
+ ---
+alias.h
+ - remove bogus extern declaration for xmalloc()
+ - include "stdc.h"
+ - add prototype declarations for all extern function declarations
+
+xmalloc.c,lib/readline/xmalloc.c
+ - fix xmalloc to return a PTR_T
+ - fix xrealloc to return a PTR_T and take a PTR_T as first argument
+
+include/ansi_stdlib.h
+ - extern declarations for malloc and realloc have them return PTR_T
+
+xmalloc.h
+ - new file, with extern declarations for functions in xmalloc.c
+
+general.h
+ - removed extern declarations for functions in xmalloc.c
+ - include xmalloc.h
+
+Makefile.in,builtins/Makefile.in
+ - update dependencies to include xmalloc.h
+
+parse.y,{alias,array,bashline,bracecomp,execute_cmd,findcmd,flags,general,
+hashcmd,locale,mailcheck,make_cmd,pathexp,pcomplete,print_cmd,stringlib,
+subst,unwind_prot,variables}.c
+builtins/{common,evalfile}.c
+builtins/{cd,command,enable,exec,printf,read,set}.def
+lib/sh/{makepath,netopen,pathphys,setlinebuf,shquote,snprintf,stringlist,
+strtrans,tmpfile}.c
+lib/readline/{util,terminal,shell,readline,macro,kill,isearch,input,
+histfile,histexpand,display,complete,bind}.c
+ - make sure all calls to xmalloc are cast to the right return value
+
+siglist.c
+ - include xmalloc.h
+
+parse.y,{alias,bashline,bracecomp,expr,make_cmd,nojobs,print_cmd,subst}.c
+builtins/{fc,printf,read}.def
+lib/sh/snprintf.c, lib/tilde/tilde.c
+lib/readline/{bind,display,histexpand,isearch,macro,util,vi_mode}.c
+ - make sure all calls to xrealloc are cast to the right return value
+
+lib/sh/{netopen,setlinebuf,shquote,snprintf}.c, lib/tilde/tilde.c
+ - include xmalloc.h, remove extern declaration of xmalloc
+
+lib/readline/xmalloc.h
+ - xmalloc and xrealloc should return PTR_T
+
+lib/readline/rldefs.h
+ - don't include an extern declaration for xmalloc
+
+ 8/7
+ ---
+support/shobj-conf
+ - fixed up commented-out stanzas for HP's unbundled C compiler on
+ HP/UX
+
+support/bashbug.sh
+ - force the subject to be changed from the default
+
+lib/readline/doc/{rluser.texinfo,readline.3}, doc/bash.1
+ - document that transpose-words swaps the last two words on the line
+ if point is at the end of the line
+
+ 8/9
+ ---
+stringlib.c
+ - fix possible infinite recursion problem with null pattern in
+ strsub()
+
+hashlib.c
+ - new function copy_hash_table to copy a hash table using a caller-
+ supplied function to copy item data (defaults to savestring())
+
+hashlib.h
+ - new extern declaration for copy_hash_table
+
+builtins/declare.def
+ - changes so that declare [-a] var=value assigns `value' to element 0
+ of array variable `var' like ksh93
+ - change so that declare [-a] var[N]=value assigns `value' to element
+ N of array variable `var' like ksh93
+
+ 8/13
+ ----
+arrayfunc.c
+ - new file, for miscellaneous array functions
+
+arrayfunc.h
+ - new file, extern declarations for functions in arrayfunc.c
+
+variables.c
+ - move convert_var_to_array, bind_array_variable,
+ assign_array_from_string, assign_array_var_from_word_list,
+ assign_array_var_from_string, quote_array_assignment_chars,
+ skipsubscript, unbind_array_element, print_array_assignment
+ to arrayfunc.c
+
+shell.h
+ - include arrayfunc.h after variables.h
+
+variables.h
+ - remove above extern function declarations moved to arrayfunc.h
+ - add extern declaration for var_lookup
+
+Makefile.in
+ - add arrayfunc.c, arrayfunc.h in appropriate places
+ - add arrayfunc.h to dependencies
+
+subst.c
+ - move valid_array_reference, array_expand_index, array_variable_part,
+ array_value_internal, array_value (now global), get_array_value,
+ do_array_element_assignment to arrayfunc.c
+
+subst.h
+ - extern declarations for functions above moved to arrayfunc.h
+
+arrayfunc.h
+ - extern declarations for above functions from subst.c
+
+subst.[ch]
+ - string_list_dollar_star and string_list_dollar_at are now global
+ functions
+ - quote_escapes is now a global function
+
+subst.c
+ - maybe_expand_string -> expand_string_if_necessary
+ - expand_string_to_string -> expand_string_to_string_internal
+ - new functions: expand_string_to_string and
+ expand_string_unsplit_to_string, which call
+ expand_string_to_string_internal with expand_string and
+ expand_string_unsplit as the FUNC arguments, respectively
+
+arrayfunc.c
+ - change array_expand_index to call expand_string_to_string instead
+ of maybe_expand_string
+
+ 8/14
+ ----
+shell.c
+ - in execute_env_file, call expand_string_unsplit_to_string
+
+mailcheck.c
+ - in check_mail, call expand_string_to_string
+
+variables.c
+ - in assign_in_env, call expand_string_unsplit_to_string
+
+arrayfunc.c
+ - new function, array_variable_name, splits an array reference into
+ a name (which is returned as a new string) and subscript
+ - change array_variable_part to just call array_variable_name and
+ look up the string returned with find_variable
+ - new function, find_or_make_array_variable (name, flags) which will
+ look up an array variable and convert a string variable to an
+ array if necessary. The FLAGS argument, if non-zero, says to
+ check the readonly and noassign attributes and fail if either is set
+
+builtins/read.def
+ - make `read -a aname' honor any readonly status of `aname'
+ - read -a now calls find_or_make_array_variable with FLAGS value 1
+
+arrayfunc.[ch], subst.c, builtins/{declare,read}.def
+ - do_array_element_assignment -> assign_array_element
+
+ 8/20
+ ----
+parse.y
+ - changed `for' command grammar to allow missing word list after `IN'
+ token, like latest POSIX drafts require
+
+lib/sh/tmpfile.c
+ - in sh_mktmpname(), check for filenum == 0 and init to non-zero number
+ in this case. it can happen on arithmetic overflow
+
+support/mkversion.sh
+ - added `[0-9].[0-9][0-9][a-z]' as an acceptable value for a
+ distribution to allow for intermediate versions, like 2.05a
+
+support/config.guess
+ - removed the addition of the output of `/usr/bin/objformat' when
+ creating the canonical name on FreeBSD machines, so the canonical
+ name is once again `freebsd4.2' instead of `freebsdelf4.2'
+
+ 8/22
+ ----
+lib/readline/{rlstdc,history,keymaps,readline,rldefs,rlprivate,rlshell,
+rltypedefs,xmalloc}.h
+lib/readline/{bind,compat,complete,display,funmap,histexpand,histsearch,
+input,isearch,kill,nls,parens,readline,rltty,search,shell,signals,vi_mode
+ - changed __P to PARAMS
+
+lib/tilde/tilde.[ch]
+ - changed __P to PARAMS
+
+{Makefile,configure}.in
+ - changed the version number to 2.05a
+ - changed the release status to `alpha1'
+
+ 8/23
+ ----
+support/shobj-conf
+ - support for building shared libraries on Darwin/MacOS X
+
+siglist.h
+ - extern declaration for strsignal() to compensate for lack of
+ a definition in some system include files
+
+jobs.c
+ - remove casts from strsignal() calls
+
+[bash-2.05a-alpha1 frozen]
+
+ 8/27
+ ----
+[bash-2.05a-alpha1 released]
+
+ 8/27
+ ----
+execute_cmd.c
+ - fix eval_arith_for_expr to handle the case where the expanded
+ word list is NULL, returning 0 in this case
+
+print_cmd.c
+ - in print_function_def, make sure that func_redirects is assigned
+ a value before being used
+
+ 8/28
+ ----
+alias.c
+ - include <ctype.h> for definition of isalpha()
+
+bashhist.h
+ - add prototypes for extern function declarations
+
+flags.c
+ - include bashhist.h for extern function declarations
+
+mksyntax.c
+ - include <unistd.h> if HAVE_UNISTD_H is defined in config.h
+
+parse.y
+ - include test.h for extern function declarations
+
+externs.h
+ - change extern declaration for setlinebuf to sh_setlinebuf
+
+stringlib.c
+ - include <glob/glob.h> for extern function declarations
+
+variables.h
+ - add function prototypes for all of the sv_* functions
+
+builtins/common.h
+ - add extern declarations for set_shellopts() and parse_shellopts()
+ from builtins/set.def
+
+variables.c
+ - include "hashcmd.h" for extern declaration for flush_hashed_filenames
+ - include "pathexp.h" for extern declaration for setup_glob_ignore
+
+lib/malloc/malloc.c
+ - cast to `long' instead of `int' in memalign for 64-bit machines
+
+{pcomplete,trap}.c
+ - changed printf escape sequences used to print pointers to %p
+
+lib/readline/undo.c
+ - include "xmalloc.h" for extern function declaration
+
+input.h
+ - add function prototypes to extern declarations for getc_with_restart
+ and ungetc_with_restart
+
+variables.[ch]
+ - changed type of `function' member of `struct name_and_function' to
+ `sv_func_t', which is defined and prototyped in variables.h
+ - map_over now takes an `sh_var_map_func_t *'
+
+shell.h
+ - start of a set of function pointer typedefs like those in
+ lib/readline/rltypedefs.h
+
+hashlib.[ch]
+ - second paramter to flush_hash_table is now an `sh_free_func_t *'
+
+trap.c
+ - parameter to reset_or_restore_signal_handlers is now an
+ `sh_resetsig_func_t *'
+
+pcomplete.h, pcomplib.c
+ - function pointer argument to print_all_compspecs is now an
+ `sh_csprint_func_t *'
+ - function pointer `list_getter' element of an `ITEMLIST' is now
+ prototyped with __P((...)) instead of using `Function *'
+
+jobs.[ch]
+ - `j_cleanup' member of a JOB is now an `sh_vptrfunc_t *'
+
+alias.c
+ - map_over_aliases now takes an `sh_alias_map_func_t *'
+ - free_alias_data now takes a `PTR_T'
+
+pathexp.c
+ - function pointer argument to ignore_globbed_names is now an
+ `sh_ignore_func_t *'
+
+bashline.c
+ - function pointer argument to _ignore_completion_names is now an
+ `sh_ignore_func_t *'
+
+pathexp.h,{bashhist,bashline.c
+ - `item_func' member of a `struct ignorevar' is now an
+ `sh_iv_item_func_t *'
+
+builtins/evalfile.c
+ - `errfunc' is now an `sh_vmsg_func_t *'
+
+jobs.c
+ - map_over_job now takes an `sh_job_map_func_t *' as its first argument
+
+array.[ch]
+ - function pointer argument to array_walk is now an
+ `sh_ae_map_func_t *'
+
+general.c
+ - tilde_expansion_preexpansion_hook has type `tilde_hook_func_t *',
+ and so the assignment in tilde_initialize doesn't need a cast
+
+list.c
+ - map_over_words now takes an `sh_icpfunc_t *' as its second argument
+
+input.h
+ - the `getter' and `ungetter' function pointer members of a
+ BASH_INPUT are now of types `sh_cget_func_t *' and
+ `sh_cunget_func_t *' respectively
+ - init_yy_io now takes an `sh_cget_func_t *' as its first argument and
+ an `sh_cunget_func_t *' as its second
+
+parse.y
+ - init_yy_io now takes an `sh_cget_func_t *' as its first argument and
+ an `sh_cunget_func_t *' as its second
+ - initialize_bash_input casts bash_input.getter and bash_input.ungetter
+ appropriately
+
+builtins/mkbuiltins.c
+ - make the extern function definitions written to builtext.h have
+ prototypes with __P((...))
+ - include "stdc.h"
+ - change Function to mk_handler_func_t
+ - fixed comment_handler to take the right number of args
+ - prototyped all the handler functions with __P((...))
+
+builtins.h
+ - the `function' member of a struct builtin is now of type
+ `sh_builtin_func_t *'
+
+builtins/common.[ch]
+ - last_shell_builtin, this_shell_builtin are now of type
+ `sh_builtin_func_t *'
+ - find_shell_builtin, builtin_address, find_special_builtin now return
+ `sh_builtin_func_t *'
+
+builtins/exit.def, {execute_cmd,jobs,nojobs,variables}.c, parse.y
+ - changed all declarations of last_shell_builtin and this_shell_builtin
+
+execute_cmd.c
+ - execute_builtin, execute_builtin_or_function,
+ execute_subshell_builtin_or_function now take an
+ `sh_builtin_func_t *' instead of a `Function *' for argument
+ - changed appropriate variables from `Function *' to
+ `sh_builtin_func_t *'
+
+builtins/{bind,builtin,enable,read,setattr}.def
+ - replaced uses of `Function *' in variable declarations with
+ appropriate types (sh_builtin_func_t * or rl_command_func_t *)
+
+builtins/set.def
+ - set_func and get_func members of binary_o_options are now of types
+ `setopt_set_func_t *' and `setopt_get_func_t *', which are
+ prototyped
+
+builtins/shopt.def
+ - set_func member of shopt_vars is now of type `shopt_set_func_t *'
+
+bashline.c
+ - enable_hostname_completion now returns `int' (the old value of
+ perform_hostname_completion)
+
+[The only use of Function and VFunction now is for unwind-protects]
+
+ 9/4
+ ---
+lib/sh/getcwd.c
+ - use const define from config.h rather than `CONST'
+ - use PTR_T define from xmalloc.h rather than `PTR'
+ - include xmalloc.h for PTR_T
+ - remove PATH_MAX define, rely on value from maxpath.h
+
+{general,mailcheck}.c, lib/sh/{pathcanon,pathphys}.c
+ - don't include maxpath.h directly; it's already included by shell.h
+
+lib/sh/mailstat.c
+ - new `mailstat()' implementation, to stat a mailbox file for
+ mail checking. handles maildir-style mail directories with one
+ file per message and creates a dummy stat struct from them
+
+lib/sh/Makefile.in
+ - add mailstat.c and mailstat.o in the appropriate places
+
+lib/malloc/malloc.c
+ - augmented implementation with wrapper functions that pass in file
+ and line number information from cpp. currently unused, but a
+ placeholder for future debugging and use tracking
+
+lib/malloc/shmalloc.h
+ - new file, extern declarations for allocation wrapper functions for
+ use by the shell (and others, I guess)
+
+xmalloc.[ch]
+ - wrapper functions for xmalloc, xfree, xrealloc (sh_ prefixed) that
+ pass cpp line number information through to the malloc functions,
+ if USING_BASH_MALLOC is defined
+
+ 9/5
+ ---
+lib/malloc/gmalloc.c
+ - removed; no longer part of distribution
+
+lib/malloc/Makefile.in
+ - removed references to gmalloc.[co]
+
+configure.in, doc/bashref.texi
+ - removed references to `--with-glibc-malloc' configure option
+
+{configure,Makefile}.in
+ - changed the way bash malloc is configured into the Makefile, making
+ it more like how readline is configured. If the bash malloc is
+ not configured in, nothing in lib/malloc will be built
+
+ 9/6
+ ---
+lib/malloc/imalloc.h
+ - new file, some internal malloc definitions
+
+lib/malloc/mstats.h
+ - new file, definitions for malloc statistics structs and functions
+
+lib/malloc/trace.c
+ - new file, malloc tracing functions (currently just print messages
+ to stderr), code is #ifdef MALLOC_TRACE
+
+lib/malloc/stats.c
+ - new file, moved malloc stats code from malloc.c to here
+
+lib/malloc/malloc.c
+ - moved some definitions to imalloc.h
+ - moved stats code to stats.c
+ - malloc tracing calls added to internal_{malloc,realloc,free}, all
+ #ifdef MALLOC_TRACE
+
+lib/malloc/Makefile.in, Makefile.in
+ - added {imalloc,mstats}.h, {trace,stats}.c
+
+parse.y
+ - changed decode_prompt_string to save and restore $?
+ (last_command_exit_value) around calls to expand_prompt_string(),
+ so command substitutions in PS1, etc. don't change $?
+
+{array,subst}.c
+ - a couple more arrayind_t fixes from Paul Eggert
+
+configure.in
+ - remove redundant check for wait3(2)
+
+redir.h
+ - fixed a typo (stdin_redirs -> stdin_redirects)
+
+ 9/10
+ ----
+execute_cmd.c
+ - remove check for \n and \r from WHITESPACE macro, since those
+ chars are not whitespace as returned by the whitespace(c) macro
+ - getinterp now takes a `char *' as first arg, not unsigned char *
+ - execute_shell_script now takes a `char *' as first arg, not
+ unsigned char *
+ - fix typo in forward declaration for `initialize_subshell'
+
+general.[ch]
+ - check_binary_file now takes a (char *) argument, not unsigned char *
+ - pass unsigned char to isspace and isprint because of ISO C fuckup
+ - bash_tilde_expand now takes a `const char *' as its argument
+
+builtins/evalfile.c, shell.c
+ - buffer passed to check_binary_file is char, not unsigned char
+
+parse.y
+ - fix extern declaration for yyerror()
+ - yyerror now takes a `const char *' as first arg
+
+{error,jobs}.c
+ - fixes to printf-style functions to handle pids wider than an int
+
+lib/readline/{isearch,vi_mode}.c
+ - fix call to rl_message in rl_display_search (remove extra arg)
+
+variables.c
+ - fix missing argument to builtin_error in make_local_variable
+
+builtins/getopts.def
+ - since getopts takes no options, change while loop calling
+ internal_getopts to a simple `if' check
+
+builtins/printf.def
+ - since printf takes no options, change while loop calling
+ internal_getopts to a simple `if' check
+
+lib/readline/bind.c
+ - remove _SET_BELL macro, expand code inline
+
+lib/readline/input.c
+ - change _rl_input_available to use either select or FIONREAD,
+ but not both
+
+lib/readline/readline.c
+ - fix rl_digit_loop to remove unreachable code at end of loop
+
+{bashhist,bashline,expr,jobs,redir,shell}.c, builtins/fc.def, lib/sh/snprintf.c
+ - bracket unused functions with #ifdef INCLUDE_UNUSED/#endif
+ - remove some unused variables
+
+execute_cmd.c
+ - remove #ifdef'd code that allowed `return' to terminate a select
+ statement
+
+expr.c
+ - remove some extraneous tests from strlong()
+
+array.h
+ - arrayind_t is now a long, since shell arithmetic is performed as
+ longs
+ - remove second declaration of new_array_element
+
+builtins/printf.def
+ - in mklong, xrealloc cannot return NULL, so don't check for it
+ - remove some #if 0 code
+ - fix core dump triggered by a format specification with more than
+ one `*'
+ - remove `foundmod', since its value mirrors `modchar != 0'
+ - include "common.h" for builtin_{error,usage} declarations
+
+Makefile.in,builtins/Makefile.in
+ - updated some dependencies due to new include files
+
+pcomplete.c
+ - include "execute_cmd.h" for declaration of execute_shell_function
+
+arrayfunc.c
+ - include <stdio.h> for printf
+ - include "builtins/common.h" for builtin_error declaration
+
+builtins/evalstring.c
+ - include "../trap.h" for run_trap_cleanup declaration
+
+builtins/help.def
+ - include "common.h" instead of locally declaring builtin_error
+ and builtin_usage
+
+error.h
+ - add extern declaration for itrace()
+ - add prototype to extern declaration of get_name_for_error
+ - file_error now takes a `const char *' as first argument
+
+externs.h
+ - added prototype for sh_setlinebuf declaration, bracketed with
+ NEED_SH_SETLINEBUF_DECL so we don't need stdio.h everywhere
+ - add extern declaration for parse.y:return_EOF()
+
+shell.c
+ - add NEED_SH_SETLINEBUF_DECL before including shell.h
+
+lib/readline/callback.c
+ - include <stdlib.h> or "ansi_stdlib.h" for abort declaration
+
+quit.h
+ - remove declaration of throw_to_top_level
+
+subst.c
+ - remove unused extern declaration for getopts_reset
+
+lib/sh/netopen.c
+ - include <shell.h> for legal_number, etc.
+ - add prototype for inet_aton extern declaration
+
+lib/sh/clock.c
+ - include <stdc.h> for __P declaration
+ - add extern declaration for get_clk_tck
+
+support/mkversion.sh
+ - changed so that extern function declarations for functions in
+ version.c (moved from externs.h) are in the generated version.h
+
+shell.h
+ - include version.h
+
+version.c
+ - various `char *' version variables are now `const char *'
+
+general.h
+ - add prototype for same_file, bracketed with _POSIXSTAT_H
+ #ifdef, since that's what include/posixstat.h defines
+
+builtins/common.[ch]
+ - _evalfile, maybe_execute_file, source_file, and fc_execute_file
+ now take a `const char *' as their first argument
+
+eval.c
+ - removed extern declaration of yyparse; it's in externs.h
+
+parse.y
+ - added prototypes to static forward function declarations
+ - changed local `all_digits' variable in read_token_word () to
+ all_digit_token to avoid clash with all_digits() function in
+ general.c
+
+{bashhist,copy_cmd,make_cmd,hashlib,mailcheck}.c
+ - added prototypes for static function declarations
+
+shell.h
+ - add extern declarations for interactive, interactive_shell,
+ changed c files with extern declarations
+
+pcomplete.c
+ - changed it_init_aliases to avoid shadowing global variable
+ `aliases'
+
+bashline.c,pathexp.c,general.h
+ - sh_ignore_func_t is now a pointer to a function taking a
+ `const char *'; users changed
+
+configure.in
+ - test for <strings.h>
+
+config.h.in
+ - add #undef HAVE_STRINGS_H
+
+bashansi.h
+ - change like recommended in autoconf manual
+
+ 9/11
+ ----
+[a date which will live in infamy. prayers for the victims.]
+
+execute_cmd.c
+ - don't use an absolute index into abuf in mkfmt, use
+ sizeof(abuf) to compute last index
+
+builtins/common.c
+ - fix read_octal to do a better job of detecting overflow while
+ iterating through the string
+
+builtins/umask.def
+ - change octal-print mode to print 4 digits, like other shells
+ - cast umask to unsigned long to avoid problems on systems where
+ it's wider than an int (POSIX doesn't guarantee that mode_t is
+ no wider than an int, but real-world systems use int)
+
+builtins/printf.def
+ - mklong can never return NULL (it uses xrealloc), so the mainline
+ doesn't need to check for NULL returns
+ - new function, getldouble (long double *), to get long doubles
+ - mklong now takes a `char *' as its second argument, the modifier(s)
+ to use
+ - changed use of `modchar' to handle more than a single modifier
+ character
+ - changed to handle `long double' and `L' formats better, rather
+ than discarding long double information
+ - since printf now follows the POSIX.2 rules for conversion errors,
+ we can dispense with the status returns from the get* functions
+ - make the get* functions as similar in structure as possible,
+ removing type casts, etc.
+
+lib/sh/timeval.c,execute_cmd.c
+ - change some instances of `long' to `time_t', for systems where
+ a time_t is bigger than a long
+
+jobs.c
+ - include "posixtime.h" instead of <sys/time.h>
+
+config.h.in
+ - add defines for HAVE_DECL_CONFSTR, HAVE_DECL_STRTOLD,
+ HAVE_DECL_SBRK, HAVE_DECL_PRINTF
+ - remove defines for SBRK_DECLARED and PRINTF_DECLARED
+ - add _GNU_SOURCE define
+
+configure.in
+ - add AC_CHECK_DECLS for strtold, confstr, sbrk, printf
+ - remove call to BASH_FUNC_SBRK_DECLARED
+ - remove call to BASH_FUNC_PRINTF
+
+xmalloc.c, lib/malloc/malloc.c
+ - change check of SBRK_DECLARED to HAVE_SBRK_DECL
+
+print_cmd.c
+ - change PRINTF_DECLARED to HAVE_DECL_PRINTF
+
+builtins/evalstring.c, builtins/common.h
+ - parse_and_execute now takes a `const char *' as its second argument
+
+input.h,parse.y
+ - with_input_from_* functions now take a `const char *' as their
+ second argument
+ - init_yy_io now takes a `const char *' as its fourth argument
+
+parse.y,externs.h
+ - parse_string_to_word_list now takes a `const char *' as its second
+ argument
+
+tests/builtins.right
+ - change output to account for extra digit in umask output
+
+pcomplib.c
+ - free_progcomp now takes a PTR_T argument
+
+builtins/bashgetopt.h
+ - include <stdc.h>
+ - add prototypes to extern declarations
+
+builtins/shopt.def
+ - add prototypes to static function declarations
+
+builtins/{fc,umask,wait}.def, builtins/{bashgetopt,common}.c
+ - include <ctype.h> for isdigit macro (referenced by `digit(x)')
+
+lib/readline/complete.c
+ - added more static function declarations with prototypes
+
+ 9/12
+ ----
+lib/sh/tmpfile.c
+ - use `^' instead of `*' in sh_mktmpname to make filenames a bit
+ more random
+
+include/stdc.h,lib/readline/rldstdc.h
+ - add __attribute__ definition
+
+builtins/common.h
+ - add printf __attribute__ to declaration of builtin_error
+
+error.h
+ - add printf __attribute__ to declaration of programming_error,
+ report_error, parser_error, fatal_error, sys_error, internal_error,
+ internal_warning
+
+lib/readline/readline.h
+ - add printf __attribute__ to declaration of rl_message
+
+pcomplete.c
+ - add printf __attribute__ to declaration of debug_printf
+
+print_cmd.c
+ - add printf __attribute__ to declarations of cprintf, xprintf
+
+include/chartypes.h
+ - new file, includes <ctype.h> and defines macros that check for
+ safe (ascii) arguments before calling the regular ctype macros
+
+{alias,bashline,execute_cmd,expr,findcmd,general,locale,mksyntax,stringlib,subst,variables}.c
+parse.y
+builtins/{bashgetopt,common}.c
+builtins/{fc,printf,umask,wait}.def
+lib/glob/strmatch.c
+lib/sh/{oslib,pathcanon,pathphys,snprintf,strcasecmp,strindex,stringvec,strtod,strtol,strtrans}.c
+examples/loadables/{head,sleep}.c
+ - include "chartypes.h" or <chartypes.h> instead of <ctype.h>
+
+Makefile.in,{builtins,lib/{glob,sh}}/Makefile.in
+ - update dependencies to include chartypes.h
+
+lib/sh/inet_aton.c
+ - use `unsigned char' instead of `char' to pass to ctype.h functions
+
+lib/sh/netopen.c
+ - check for '0' <= host[0] <= '9' in _getaddr instead of using
+ isdigit
+
+subst.c,lib/sh/shquote.c
+ - change array subscripts into sh_syntaxtab from `char' to
+ `unsigned char'
+
+{alias,bashline,execute_cmd,expr,general,subst}.c, parse.y
+builtins/{fc,printf,umask,wait}.def builtins/{bashgetopt,common}.c
+lib/sh/{pathcanon,pathphys,snprintf,strcasecmp,strindex,strtod,strtol,strtrans}.c
+examples/loadables/{head,sleep}.c
+ - change to use some of the new macros in chartypes.h
+ - remove old local macro definitions now provided by chartypes.h
+
+general.h
+ - remove definition of isletter, ISOCTAL, digit, digit_value
+ - change legal_variable_starter and legal_variable_char to use
+ chartypes.h macros
+ - change ABSPATH to use chartypes.h macros
+
+lib/readline/util.c
+ - change to use Paul Eggert's FUNCTION_FOR_MACRO define to define
+ function replacements for macros in chardefs.h
+
+lib/readline/chardefs.h
+ - added some of the same macros as in chartypes.h
+ - change _rl_lowercase_p, _rl_uppercase_p, _rl_digit_p,
+ _rl_to_upper, _rl_to_lower to use new IS* macros
+ - added _rl_isident macro from vi_mode.c:isident
+
+lib/readline/{bind,complete,nls}.c
+ - change to use some of the new macros from chardefs.h
+
+lib/readline/vi_mode.c
+ - isident -> _rl_isident
+ - remove local defines of macros in chardefs.h
+
+lib/sh/strtol.c
+ - updated to new version, modified from glibc 2.2.4 and sh-utils-2.0.
+ This one can do strtoll and strtoull, if necessary
+
+ 9/13
+ ----
+builtins/ulimit.def
+ - changed get_limit so it retrieves both hard and soft limits
+ instead of one or the other
+ - changed callers of get_limit
+ - changed getmaxvm to take soft limit, hard limit as arguments
+ - changed getmaxuprc to just take a single argument, the value
+ - changed calls to printone() to pass soft limit or hard limit
+ depending on `mode' instead of using old current_limit variable
+ - moved check for out-of-range limits in ulimit_internal into the
+ block that converts a string argument to a value of type rlim_t
+ - changed RESOURCE_LIMITS struct to break the description into a
+ description string and separate scale factor string
+ - changed print_all_limits to print a single error message if
+ get_limit fails, including limits[i].description now that the
+ scale factor has been removed from the description string
+ - removed DESCFMT define, since it's now used only in printone()
+ - changed printone to print the option character associated with a
+ particular limit if we're printing multiple limits
+ - changed calls to builtin_error to print the description associated
+ with a limit if setting or getting the limit fails
+ - added support for new POSIX 1003.1-200x rlim_t values:
+ RLIM_SAVED_CUR and RLIM_SAVED_MAX, which expand to the current
+ soft and hard limits, whatever they are
+ - changed printone to print `hard' or `soft' if the current limit is
+ RLIM_SAVED_MAX or RLIM_SAVED_CUR, respectively
+ - changed ulimit_internal to handle new `hard' and `soft' arguments
+ - changed help text do describe the special limit arguments `hard',
+ `soft', and `unlimited'
+
+doc/{bash.1,bashref.texi}
+ - documented new `hard' and `soft' limit arguments to `ulimit'
+
+hashlib.[ch]
+ - find_hash_item now takes a `const char *' is its first argument
+ - hash_string now takes a `const char *' is its first argument
+ - remove_hash_item now takes a `const char *' as its first argument
+
+pcomplib.c
+ - removed cast from first argument to find_hash_item in find_compspec
+
+general.[ch]
+ - absolute_program now takes a `const char *' as its argument
+ - absolute_pathname now takes a `const char *' as its argument
+
+lib/glob/glob.[ch]
+ - glob_pattern_p now takes a `const char *' as its argument
+
+bashline.c
+ - removed cast from first argument to absolute_program in
+ command_word_completion_function
+ - removed cast from first argument to glob_pattern_p in
+ attempt_shell_completion
+
+findcmd.[ch]
+ - find_absolute_program, find_user_command, find_path_file,
+ search_for_command, user_command_matches now take a
+ `const char *' as their first argument
+ - file_status, executable_file, is_directory, executable_or_directory
+ now take a `const char *' as their argument
+ - _find_user_command_internal, find_user_command_internal,
+ find_user_command_in_path
+
+lib/sh/makepath.c, externs.h
+ - changed sh_makepath so it takes `const char *' for its first
+ two arguments
+
+hashcmd.[ch]
+ - find_hashed_filename now takes a `const char *' as its first arg
+ - remove_hashed_filename now takes a `const char *' as its first arg
+
+variables.[ch]
+ - new_shell_variable, var_lookup, shell_var_from_env_string,
+ find_name_in_env_array, bind_function, makunbound,
+ bind_name_in_env_array, bind_tempenv_variable, bind_variable
+ now take a `const char *' as their first arg
+ - find_function, make_new_variable, find_tempenv_variable,
+ find_variable_internal, find_variable, set_func_read_only,
+ set_func_auto_export, all_variables_matching_prefix, assign_in_env,
+ assignment, kill_local_variable, make_local_variable, unbind_variable
+ now take a `const char *' as their arg
+ - mk_env_string now takes `const char *' arguments
+
+arrayfunc.[ch]
+ - skipsubscript now takes a `const char *' as its argument
+
+ 9/17
+ ----
+lib/readline/complete.c
+ - attempt to preserve case of what the user typed in
+ compute_lcd_of_matches if we're ignoring case in completion
+
+builtins/{let,pushd}.def,{execute_cmd,expr}.c
+ - change some 0L constants to 0 and let the compiler sort it out
+
+ 9/18
+ ----
+lib/malloc/alloca.c
+ - alloca now takes a `size_t' argument
+
+include/memalloc.h
+ - if we're providing an extern function declaration for alloca,
+ use `void *' and prototype if __STDC__ is defined
+ - if HAVE_ALLOCA_H is defined, but C_ALLOCA is defined, don't
+ define HAVE_ALLOCA
+
+ 9/19
+ ----
+subst.c
+ - do_assignment_internal, do_assignment, and do_assignment_no_expand
+ now take a `const char *' as their first argument
+
+general.h
+ - a `sh_assign_func_t' is now a function taking a `const char *' and
+ returning int
+
+hashcmd.c
+ - free_filename_data now takes a `PTR_T' argument to agree with the
+ typedef for `sh_free_func_t'
+
+lib/sh/snprintf.c
+ - use TYPE_MAXIMUM define like strtol.c instead of huge constants
+
+ 9/20
+ ----
+lib/sh/snprintf.c
+ - don't bother to compile the bulk of the body unless HAVE_SNPRINTF
+ or HAVE_ASPRINTF is not defined
+
+ 9/24
+ ----
+flags.c
+ - ignore `set -n' if the shell was started interactively
+
+lib/readline/readline.c
+ - initialize readline_echoing_p to 0; let the terminal-specific code
+ in rltty.c set it appropriately
+
+lib/malloc/malloc.c
+ - changed internal_memalign() slightly to avoid compiler warnings about
+ negating an unsigned variable (-alignment -> (~alignment + 1))
+
+ 9/27
+ ----
+lib/readline/readline.c
+ - changed rl_newline to set _rl_history_saved_point appropriately
+ for the {previous,next}_history code
+
+lib/readline/rlprivate.h
+ - extern declaration for _rl_history_preserve_point
+
+lib/readline/bind.c
+ - new bindable variable, `history-preserve-point', sets value of
+ _rl_history_preserve_point
+
+ 10/1
+ ----
+lib/malloc/table.c
+ - new file, with a map of allocated (and freed) memory for debugging
+ multiple frees, etc. Indexed by hash on values returned by
+ malloc(); holds size, file and line number info for last alloc or
+ free and a couple of statistics pointers
+
+lib/malloc/malloc.c
+ - a few cleanups; added calls for registering allocations and frees
+ if MALLOC_REGISTER is defined
+ - replaced MALLOC_RETURN with explicit MALLOC_NOTRACE define
+ - reordered fields in `struct...minfo' in `union mhead' to restore
+ eight-byte alignment
+ - added explicit checks for underflow in free and realloc since
+ checking mh_magic2 is not sufficient to detect everything (it's
+ no longer the last field in the struct, and thus not the bytes
+ immediately preceding what's returned to the user)
+ - new function, xbotch, for printing file and line number info for
+ the failed assertion before calling botch() (programming_error())
+
+configure.in
+ - replaced call to BASH_C_LONG_LONG with call to
+ AC_CHECK_TYPES([long long])
+ - moved the C compiler tests before the tests for various
+ system types, so we can know whether we have `long long'
+ before testing for 64-bit types
+ - if we have `long long', check for sizeof(long long) and save value
+
+aclocal.m4
+ - changed BASH_TYPE_BITS64_T to check `long long' before `long', but
+ after `double'
+
+ 10/2
+ ----
+lib/malloc/malloc.c
+ - made malloc and realloc both agree on the rounding for a request of
+ size N (round up to nearest multiple of 8 after adjusting for
+ malloc overhead); uses new ALLOCATED_BYTES macro
+ - realloc and free now use new IN_BUCKET macro for underflow checks
+
+execute_cmd.c
+ - fixed time_command() to use `time_t' instead of `long' to hold
+ time stamps
+
+lib/sh/clock.c
+ - clock_t_to_secs now takes a `time_t *' second argument
+ - fixed print_clock_t to call clock_t_to_secs with right arguments
+
+lib/sh/timeval.c
+ - fixed print_timeval to make `minutes' a `long' and make its
+ structure identical to print_clock_t
+
+redir.c
+ - changed redirection_error to check for EBADF and use the file
+ descriptor being redirected from in the error message if it
+ is >= 0
+
+Makefile.in
+ - changed release status to `beta1'
+
+lib/glob/collsyms.h
+ - added a few ASCII symbols to the posix_collsyms array
+
+ 10/3
+ ----
+aclocal.m4
+ - fixed typo in BASH_TYPE_BITS64_T
+
+configure.in
+ - added check for unsigned chars with AC_C_CHAR_UNSIGNED
+
+config.h.in
+ - added PROTOTYPES and __CHAR_UNSIGNED__ #defines
+
+general.h
+ - if CHAR_MAX is not define by <limits.h>, provide a definition
+
+builtins/printf.def
+ - change tescape() to mask \0 and \x escape sequences with 0xFF
+ - change tescape() to process at most two hex digits after a `\x'
+
+lib/sh/strtrans.c
+ - change strtrans() to mask \0 and \x escape sequences with 0xFF
+ - change strtrans() to process at most two hex digits after a `\x'.
+ This affects `echo -e' and $'...' processing
+
+lib/readline/bind.c
+ - changed rl_translate_keyseq() to process at most two hex digits
+ after a `\x'
+
+lib/readline/doc/{rluser.texinfo,readline.3}, doc/bash.1
+ - changed documentation for key binding escape sequences to specify
+ that at most two hex digits after \x are translated
+ - changed documentation for key binding to specify that the result
+ of \nnn or \xhh escapes is an eight-bit value, not just ASCII
+
+doc/{bash.1,bashref.texi}
+ - changed documentation of $'...' to specify that at most two hex
+ digits after \x are translated
+ - changed `echo' documentation to specify that at most two hex
+ digits after \x are translated
+ - changed documentation for `echo' and $'...' to specify that the
+ result of \nnn or \xhh escapes is an eight-bit value, not just ASCII
+
+ 10/4
+ ----
+lib/malloc/malloc.c
+ - changed interface for xbotch to pass memory address and error code
+ as two additional arguments
+ - call mregister_describe_mem from xbotch to get the last allocation
+ or free before the botch
+
+configure.in
+ - call AC_CHECK_DECLS([strsignal])
+
+config.h.in
+ - add HAVE_DECL_STRSIGNAL
+
+siglist.h
+ - make declaration of strsignal() dependent on !HAVE_DECL_STRSIGNAL
+
+ 10/5
+ ----
+support/texi2html
+ - upgraded to version 1.64
+
+ 10/9
+ ----
+aclocal.m4
+ - added check for `long long' to BASH_TYPE_PTRDIFF_T
+
+configure.in
+ - replaced call to BASH_HAVE_TIOCGWINSZ with AC_HEADER_TIOCGWINSZ
+
+aclocal.m4
+ - replaced body of BASH_STRUCT_TERMIOS_LDISC with call to
+ AC_CHECK_MEMBER(struct termios.c_line, ...)
+ - replaced body of BASH_STRUCT_TERMIO_LDISC with call to
+ AC_CHECK_MEMBER(struct termios.c_line, ...)
+
+[bash-2.05a-beta1 frozen]
+
+ 10/10
+ -----
+lib/sh/snprintf.c
+ - fixed exponent() to not smash the trailing zeros in the fraction
+ when using %g or %G with an `alternate form'
+ - fixed exponent() to handle the optional precision with %g and %G
+ correctly (number of significant digits before the exponent)
+
+ 10/11
+ -----
+expr.c
+ - fixed strlong() to correct the values of `@' and `_' when
+ translating base-64 constants (64#@ == 62 and 64#_ == 64), for
+ compatibility with ksh
+
+lib/sh/itos.c
+ - added a slightly more flexible fmtlong() function that takes a
+ base argument and flags (for future use)
+ - rewrote itos and inttostr in terms of fmtlong
+
+lib/sh/fmtulong.c
+ - new file, converts unsigned long to string. hooks for `unsigned
+ long long' in the future. unused as yet
+
+ 10/15
+ -----
+lib/readline/rltty.c
+ - change the SET_SPECIAL macro to avoid possible (but highly
+ unlikely) negative array subscripts
+
+error.h
+ - add __attribute__ to extern declaration of itrace (even though the
+ function isn't defined in released versions of bash)
+
+bashansi.h
+ - include <strings.h> if HAVE_STRINGS_H is defined, to get any extra
+ function declarations provided therein
+
+copy_cmd.c
+ - fix typo in forward declaration for copy_arith_for_command
+
+lib/malloc/stats.c
+ - make the accumulators in _print_malloc_stats be `unsigned long'
+ instead of `int'
+
+externs.h, sig.h
+ - add `__noreturn__' gcc attribute to exit_shell and jump_to_top_level
+ declarations
+
+lib/sh/mailstat.c, support/bashversion.c
+ - include <bashansi.h> for some string function declarations
+
+lib/malloc/shmalloc.h
+ - added extern declarations of functions that do malloc debugging
+
+lib/readline/{isearch,readline,vi_mode}.c
+ - make sure we index into _rl_keymap with a non-negative index
+
+parse.y
+ - make sure we index into sh_syntaxtab with a non-negative index
+
+lib/readline/vi_mode.c
+ - bound the vi_mark_chars array with the number of characters between
+ 'a' and 'z' rather than using a fixed amount
+ - don't use _rl_lowercase_p when deciding whether the char read by
+ rl_vi_set_mark is a valid mark; just use 'a' <= char <= 'z'
+
+lib/readline/chardefs.h
+ - conditionally include memory.h and strings.h as in general.h
+ - replace ISASCII with IN_CTYPE_DOMAIN like other GNU software
+ - add defines for ISPRINT(c), ISLOWER(c) and ISUPPER(c)
+ - fix defines for _rl_lowercase_p, _rl_uppercase_p, _rl_digit_p,
+ _rl_pure_alphabetic, ALPHABETIC, _rl_to_upper, _rl_to_lower,
+ and _rl_isident to work on systems with signed chars
+
+include/chartypes.h
+ - replace ISASCII with IN_CTYPE_DOMAIN like other GNU software
+
+lib/sh/{strcasecmp,strtod,strtol}.c
+ - don't pass possibly-negative characters to tolower() or toupper()
+
+lib/glob/strmatch.c
+ - don't bother testing for isupper in FOLD; rely on TOLOWER macro
+ from <chartypes.h> to do it
+ - don't use local definitions of isblank, et al.; rely on macros
+ from <chartypes.h>
+
+lib/readline/{display,readline}.c, mksyntax.c
+ - use new ISPRINT macro instead of isprint()
+
+builtins/{kill.def,mkbuiltins.c},{error,execute_cmd,jobs,nojobs,subst}.c
+ - don't assume that a pid_t fits into an int for printing and other
+ uses
+
+variables.[ch]
+ - the unused put_gnu_argv_flags_into_env now takes a `long' pid
+ argument
+
+configure.in, config.h.in
+ - call AC_STRUCT_ST_BLOCKS, define HAVE_STRUCT_STAT_ST_BLOCKS if found
+ - check for strtoull(), define HAVE_STRTOULL if found
+ - check for uintmax_t, define to `unsigned long' if not found
+
+lib/sh/mailstat.c
+ - don't use st_blocks member of struct stat unless
+ HAVE_STRUCT_STAT_ST_BLOCKS is defined; otherwise use the st_nlink
+ field to return the total number of messages in a maildir-style
+ mail directory
+
+general.h,{alias,expr,general,subst,variables}.c
+builtins/{printf,read}.def
+lib/readline/{bind,complete,nls}.c
+lib/sh/{pathcanon,pathphys,shquote,snprintf,strindex,strtod,strtol,strtrans}.c
+ - cast args to ctype macros to unsigned char for systems with signed
+ chars; other fixes for signed chars
+
+lib/sh/{fmtullong,strtoull.c}
+ - new files, more support for `long long'
+
+Makefile.in, lib/sh/Makefile.in
+ - make fmtullong.o and strtoull.o part of libsh
+
+lib/sh/itos.c
+ - remove local copy of fmtlong; use fmtulong instead
+ - new functions: uitos, uinttostr work on `unsigned long'
+
+lib/sh/snprintf.c
+ - fixes to make `unsigned long long' work (%llu)
+ - fixes to make unsigned formats not print the sign when given
+ an unsigned long that is greater than LONG_MAX
+
+externs.h
+ - extern declarations for fmtulong, fmtulloing, strtoull
+ - extern declarations for uitos, uinttostr
+
+ 10/16
+ -----
+configure.in
+ - move header checks before function checks
+ - move c compiler tests before header checks
+ - check for <inttypes.h> with BASH_HEADER_INTTYPES
+ - change type checks for intmax_t, uintmax_t to not attempt to
+ include <stdint.h>
+ - check for strtoimax, strtoumax, strtoll, strtol, strtoull, strtoul
+ with BASH_CHECK_DECL (for declarations in header files) and
+ AC_REPLACE_FUNCS (for availability and LIBOBJS substitution)
+ - remove check for have_long_long around sizeof check for long long
+ (since autoconf will give it a size of 0 if the type isn't found)
+
+config.h.in
+ - add a define for HAVE_INTTYPES_H
+ - add a define for HAVE_UNSIGNED_LONG_LONG
+ - add defines for HAVE_STRTOIMAX, HAVE_STRTOUMAX, HAVE_STRTOLL
+
+aclocal.m4
+ - new func, BASH_HEADER_INTTYPES, which just calls AC_CHECK_HEADERS
+ on <inttypes.h>; separate so it can be AC_REQUIREd
+ - AC_REQUIRE([BASH_HEADER_INTTYPES]) in BASH_CHECK_TYPE
+ - include <inttypes.h> in BASH_CHECK_TYPE if HAVE_INTTYPES_H is
+ defined
+ - change AC_DEFINE to AC_DEFINE_UNQUOTED in BASH_CHECK_TYPE
+ - new `long long' checking macros: BASH_TYPE_LONG_LONG and
+ BASH_TYPE_UNSIGNED_LONG_LONG
+ - new BASH_CHECK_DECL
+
+lib/sh/{strto[iu]max,strtoll}.c, lib/sh/Makefile.in, Makefile.in
+ - new files
+
+externs.h
+ - extern declarations for strtoll, strtoimax, strtoumax
+
+lib/malloc/alloca.c
+ - include <bashtypes.h> for size_t
+
+builtins/printf.def
+ - new functions: getllong, getullong, getintmax, getuintmax; return
+ long long, unsigned long long, intmax_t, uintmax_t respectively
+ - builtin printf now handles `ll' and `j' length modifiers directly
+
+lib/sh/Makefile.in
+ - use LIBOBJS to decide whether or not the strto* functions are
+ needed
+
+ 10/17
+ -----
+configure.in
+ - call AC_REPLACE_FUNCS(rename)
+ - move getcwd, strpbrk, strcasecmp, strerror, strtod
+ from AC_CHECK_FUNCS to AC_REPLACE_FUNCS
+ - only call BASH_FUNC_GETCWD if $ac_func_getcwd == "yes"
+ - call BASH_CHECK_SYS_SIGLIST
+ - if we don't have vprintf but have _doprnt, call AC_LIBOBJ(vprint)
+
+lib/sh/Makefile.in
+ - remove rename, getcwd, inet_aton, strpbrk, strcasecmp, strerror,
+ strtod, vprint from OBJECTS; picked up from LIBOBJS
+
+aclocal.m4
+ - change BASH_FUNC_GETCWD to call AC_LIBOBJ(getcwd) if the libc
+ getcwd(3) calls popen(3)
+ - change BASH_FUNC_INET_ATON to call AC_LIBOBJ(inet_aton) if it's
+ not found in libc or as a #define even with the special includes
+ - BASH_KERNEL_RLIMIT_CHECK -> BASH_CHECK_KERNEL_RLIMIT
+ - BASH_DEFAULT_MAILDIR -> BASH_SYS_DEFAULT_MAILDIR
+ - BASH_JOB_CONTROL_MISSING -> BASH_SYS_JOB_CONTROL_MISSING
+ - BASH_REINSTALL_SIGHANDLERS -> BASH_SYS_REINSTALL_SIGHANDLERS
+ - BASH_SIGNAL_CHECK -> BASH_SYS_SIGNAL_VINTAGE
+ - BASH_DUP2_CLOEXEC_CHECK -> BASH_FUNC_DUP2_CLOEXEC_CHECK
+ - BASH_PGRP_SYNC -> BASH_SYS_PGRP_SYNC
+ - BASH_RLIMIT_TYPE -> BASH_TYPE_RLIMIT
+ - BASH_FUNC_PRINTF -> BASH_DECL_PRINTF
+ - BASH_FUNC_SBRK_DECLARED -> BASH_DECL_SBRK
+ - BASH_MISC_SPEED_T -> BASH_CHECK_SPEED_T
+ - BASH_CHECK_SOCKLIB -> BASH_CHECK_LIB_SOCKET
+ - new macro, BASH_CHECK_SYS_SIGLIST, encapsulates all the checks for
+ sys_siglist, _sys_siglist, and strsignal(), sets SIGLIST_O to
+ siglist.o if appropriate
+
+Makefile.in
+ - use SIGLIST_O variable to decide whether or not we need siglist.o
+
+{execute_cmd,subst}.c
+ - change a couple of instances of ISDIGIT to DIGIT, where we really,
+ really only want ascii digits
+
+ansi_stdlib.h
+ - don't need a declaration for atol()
+
+ 10/18
+ -----
+
+aclocal.m4
+ - new macro, BASH_FUNC_PRINTF_A_FORMAT, checks for printf support
+ for %a, %A conversion specifiers, defines HAVE_PRINTF_A_FORMAT
+ if successful
+
+configure.in
+ - call AC_CHECK_FUNCS for isascii
+ - call BASH_FUNC_PRINTF_A_FORMAT
+
+config.h.in
+ - add a define for HAVE_ISASCII
+ - add a define for HAVE_PRINTF_A_FORMAT
+
+lib/sh/snprintf.c
+ - for long double output, fall back to sprintf using ldfallback()
+ function for floating point formats
+ - support %a, %A using dfallback() or ldfallback() if
+ HAVE_PRINTF_A_FORMAT is defined
+ - fix bug in vasprintf that returned wrong value in its first
+ argument if the buffer holding the result string got reallocated
+ - fixed PUT_CHAR macro to increment the counter even if we've
+ exceeded the buffer size, for the return value from
+ vsnprintf/snprintf
+ - fix vsnprintf_internal to not use counter < length as a loop
+ condition, but always process the entire format string (for
+ the return value from vsnprintf/snprintf)
+
+builtins/printf.def
+ - support %a, %A if HAVE_PRINTF_A_FORMAT is defined
+
+include/typemax.h
+ - new file, with the TYPE_MAXIMUM stuff that's duplicated in several
+ files in lib/sh
+
+lib/sh/{fmtulong,strtol,snprintf}.c
+ - include <typemax.h> instead of having the definitions in each file
+
+lib/sh/Makefile.in
+ - updated dependencies for typemax.h
+
+ 10/22
+ -----
+configure.in
+ - call AC_CHECK_FUNCS on ctype.h functions/macros that bash redefines
+ in chartypes.h
+
+config.h.in
+ - defines for HAVE_IS{ASCII,BLANK,GRAPH,PRINT,SPACE,XDIGIT}
+
+include/chartypes.h, lib/glob/strmatch.c, lib/readline/chardefs.h
+ - don't redefine some is* ctype macros/functions if HAVE_ISXXX is
+ defined (meaning that an appropriate function, but not a macro,
+ exists)
+
+lib/sh/strtrans.c
+ - new function, ansic_shouldquote, returns 1 if argument string
+ contains non-printing chars that should be quoted with $'...'
+
+externs.h
+ - new declaration for ansic_shouldquote()
+
+variables.c
+ - change print_var_value to ansi C quote the string if we're not in
+ posix mode and the variable's value contains non-printing chars,
+ to use the regular shell single quoting if the value contains
+ shell meta-characters, and to just output the string otherwise
+
+lib/sh/shquote.c
+ - add `break' to `case '~':' to avoid fallthrough and extra test
+
+doc/bashref.texi
+ - note that in POSIX mode, `set' displays variable values that
+ include nonprinting characters without quoting, unless they
+ contain shell metacharacters
+
+builtins/printf.def, lib/sh/snprintf.c
+ - handle `F' conversion specifier as equivalent to 'f'
+
+parse.y, {nojobs,variables}.c
+ - a couple of cleanups for when building a minimal configuration
+
+nojobs.c
+ - new function: stop_making_children(), just sets
+ already_making_children to 0 (like stop_pipeline)
+
+subst.c
+ - call stop_making_children from subst.c:command_substitute if
+ JOB_CONTROL is not defined. This fixes the bug where the wrong
+ process is waited for (and its status returned) when using
+ command substitution in a null command in a shell function
+
+builtins/printf.def
+ - new variable `tw' used to keep track of the total number of
+ characters written by a single call to `printf' -- to be
+ used for the `%n' conversion, which will be added later. It
+ gets reset each time we reuse the format string, which is what
+ ksh93 seems to do
+
+ 10/23
+ -----
+variables.c
+ - new function, bind_var_to_int (char *var, long val)
+
+variables.h
+ - extern declaration for bind_var_to_int
+
+lib/sh/netopen.c
+ - use gai_strerror() for error messages when getaddrinfo() fails
+ - use PF_INET if DEBUG is defined, since IPv6 doesn't work for me
+
+Makefile.in
+ - pass DEBUG=${DEBUG} down to makes in some subdirectories
+
+{builtins,lib/{glob,sh}}/Makefile.in
+ - append ${DEBUG} to LOCAL_CFLAGS value, passed by top-level Makefile
+
+builtins/printf.def
+ - added support for %n format conversion char (number of chars printed
+ so far from current format string)
+
+ 10/24
+ -----
+variables.c
+ - if posixly_correct is set, the default value of $MAILCHECK is 600
+ - use legal_number instead of atoi in adjust_shell_level
+ - treat non-numeric assignments to SECONDS as 0 in assign_seconds
+ - new function, init_funcname_var; sets FUNCNAME as a dynamic variable
+ if it's not set in the initial environment
+ - new function, init_groups_var; sets GROUPS as a dynamic array
+ variable if it's not set in the initial environment
+ - new function, init_dirstack_var; sets DIRSTACK as a dynamic array
+ variable if it's not set in the initial environment
+ - new function, init_seconds_var; sets SECONDS as a dynamic
+ variable using any valid integer value in the initial environment
+ as the initial value, as if an assignment had been performed
+ - call init_funcname_var, init_groups_var, init_dirstack_var,
+ init_seconds_var from initialize_dynamic_variables
+ - non-numeric values assigned to LINENO are treated as 0
+ - change initialize_shell_variables to not auto-export PATH or TERM
+ - change set_home_var to not auto-export HOME
+ - change set_shell_var to not auto-export SHELL
+ - broke the code that sets HOSTNAME, HOSTTYPE, MACHTYPE, OSTYPE
+ out into a separate function, set_machine_vars; none of those
+ variables are auto-exported
+ - bash no longer un-exports SSH_CLIENT or SSH2_CLIENT
+
+shell.c
+ - changed isnetconn() to check SSH_CLIENT and SSH2_CLIENT only if
+ SSH_SOURCE_BASHRC is defined in config-top.h
+
+config-top.h
+ - added a commented-out definition for SSH_SOURCE_BASHRC
+
+ 10/25
+ -----
+
+Makefile.in
+ - changed RELSTATUS to `rc1' (release candidate 1)
+
+ 10/29
+ -----
+locale.c
+ - fixed an `=' vs. `==' typo in set_locale_var when parsing
+ LC_NUMERIC
+
+doc/{bash.1,bashref.texi}
+ - document what bash does with $POSIXLY_CORRECT
+
+doc/builtins.1
+ - some updates
+
+builtins/psize.sh
+ - some mktemp(1) changes
+
+lib/readline/readline.c
+ - change rl_backward to check for rl_point < 0 and reset to 0 if so
+
+lib/readline/util.c
+ - don't compile in _rl_strpbrk if HAVE_STRPBRK is defined
+
+lib/readline/rlprivate.h
+ - remove extern declaration of _rl_strpbrk
+
+lib/readline/rldefs.h
+ - #define _rl_strpbrk as strpbrk if HAVE_STRPBRK is define, otherwise
+ add extern declaration of _rl_strpbrk from rlprivate.h
+
+{mailcheck,shell,variables}.c
+ - make sure to include posixtime.h to get any prototype for time(3)
+ in scope
+
+{array,eval,execute_cmd,mksyntax,subst}.c, parse.y
+builtins/common.c
+lib/sh/pathcanon.c
+ - a few changes as the result of `gcc -Wall' patches from solar
+ designer
+
+builtins/read.def, parse.y
+ - change some calls to free() to xfree()
+
+builtins/set.def
+ - make sure unset_builtin() resets unset_array to 0 each time through
+ the loop, because it's set (and used) depending on the current
+ argument
+
+shell.h
+ - new define, USE_VAR, to force the compiler to not put a particular
+ variable in a register -- helpful if registers are not restored
+ by setjmp/longjmp
+
+builtins/{evalfile.c,{read,wait}.def}, {eval,execute_cmd,shell,test}.c
+ - use USE_VAR for some variables
+
+subst.c
+ - fixed a case in expand_word_internal where a NULL pointer could
+ have been passed to free() (though free() should ignore it)
+ - fixed a case at the end of expand_word_internal where LIST could
+ have been used uninitialized (it makes gcc happy, though it
+ doesn't happen in practice)
+
+test.c
+ - give test_syntax_error(), beyond(), and integer_expected_error()
+ the `__noreturn__' attribute for gcc
+
+unwind_prot.c
+ - in clear_unwind_protect_list(), convert `flags' to `long' (via
+ assignment to a `long' variable) before casting to `char *', in
+ case pointers and longs are 64 bits and ints are 32 (makes no
+ difference on 32-bit machines)
+
+ 10/30
+ -----
+print_cmd.c
+ - fixed cprintf to avoid gcc warning about assigning const pointer
+ to non-const (discarding type qualifier)
+
+{make_cmd,pcomplete,test}.c,parse.y
+ - some minor changes to shut up gcc warnings
+
+lib/sh/tmpfile.c
+ - fixed sh_mktmpfp to avoid file descriptor leaks in the case that
+ sh_mktmpfd succeeds but fdopen fails for some reason
+ - change sh_mktmpfd to use the same scheme for computing `filenum'
+ as sh_mktmpname
+ - change get_sys_tmpdir to prefer P_tmpdir if P_tmpdir is defined
+ - changed sh_mktmpname and sh_mktmpfd to avoid trying to assign to
+ `nameroot' if `nameroot == 0' (duh)
+ - add code to sh_mktmpfd to use mkstemp(3) if USE_MKSTEMP is defined
+ - add code to sh_mktmpname to use mktemp(3) if USE_MKTEMP is defined
+
+support/{fixlinks,mkclone}
+ - use mktemp if it's available for the symlink test
+ - use $TMPDIR instead of hardcoding /tmp; default to /tmp
+ - use a better filename for the symlink test instead of `z'
+
+support/bashbug.sh
+ - more changes inspired by a patch from solar designer
+
+lib/malloc/Makefile.in
+ - new target `alloca', which builds libmalloc.a with alloca.o only
+ (for systems without alloca that are configured --without-bash-malloc)
+
+configure.in
+ - if we don't have a working alloca and are not configured to build
+ the bash malloc library, make a malloc library containing only
+ alloca.o
+
+aclocal.m4
+ - slight change to RL_LIB_READLINE_VERSION to deal with minor version
+ numbers with a letter appended (like 4.2a)
+
+ 10/31
+ -----
+doc/{bash.1,bashref.texi}
+ - slight change to note that only interactive shells resend a SIGHUP
+ to all jobs before exiting
+
+externs.h
+ - declare strto[ui]max only if NEED_STRTOIMAX_DECL is defined. This
+ keeps picky compilers from choking because intmax_t is not defined
+ (MacOS X 10.1)
+
+builtins/printf.def
+ - #define NEED_STRTOIMAX_DECL before including shell.h
+
+ 11/1
+ ----
+general.c
+ - check in bash_tilde_expand() for an unquoted tilde-prefix; don't
+ bother passing the string to tilde_expand unless the prefix is
+ unquoted
+
+shell.c
+ - fix a problem with $LINENO when executing commands supplied with
+ the -c invocation option when ONESHOT is defined
+
+[bash-2.05a-rc1 frozen]
+
+builtins/printf.def
+ - fix the %n conversion to require that the variable name supplied
+ be a valid shell identifier
+
+variables.c
+ - improve random number generator slightly by using the upper 16
+ bits of the running random number instead of the lower 16, which
+ are incrementally more random
+
+ 11/2
+ ----
+configure.in
+ - if RL_INCLUDEDIR ends up being /usr/include, don't put
+ -I$(RL_INCLUDEDIR) into CFLAGS
+
+ 11/5
+ ----
+doc/{bash.1,bashref.texi}
+ - correct description of POSIXLY_CORRECT to note that the shell enters
+ posix mode *before* the startup files are read if POSIXLY_CORRECT
+ is in the initial environment
+
+variables.c
+ - fix function prologues for init_dirstack_var and init_groups_var
+ to agree with caller (no arguments)
+
+jobs.c
+ - fix forward function declarations for pipe_read and pipe_close
+
+subst.c
+ - removed `inline' attribute from skip_double_quoted because it can
+ potentially be called recursively
+
+bashline.c
+ - quick fix to bashline.c:attempt_shell_completion programmable
+ completion code to just punt if the end of the command word found
+ by find_cmd_end is <= the start found by find_cmd_start (the bug
+ is probably in find_cmd_start -- fix later)
+
+pcomplete.c
+ - fix gen_matches_from_itemlist to return if the stringlist is null
+ after any cleaning or initialization, before trying to use it
+ - fix GEN_COMPS to only bother to try to append the STRINGLIST
+ returned by gen_matches_from_itemlist to `glist' if it's non-NULL
+
+lib/sh/stringlist.c
+ - make copy_stringlist return NULL if the STRINGLIST * passed as an
+ argument is NULL
+ - make append_stringlist call copy_stringlist only if M2 is non-NULL;
+ otherwise just return NULL if m1 is NULL
+ - make word_list_to_stringlist return 0 immediately if the passed
+ LIST argument is NULL
+ - make realloc_stringlist call alloc_stringlist if the passed
+ STRINGLIST argument (`sl') is 0, just like realloc calls malloc
+
+subst.c
+ - in skip_to_delim(), if we have an unclosed ${, and it's at the end
+ of the string (string[i] == '{', string[i+1] == '{' and
+ string[i+2] == 0, return si (i + 2) immediately without bothering
+ to call extract_dollar_brace_string or extract_delimited_string
+ - in skip_to_delim(), if string[i] is 0 after a call to
+ extract_dollar_brace_string or extract_delimited_string (meaning we
+ have an unclosed ${ or other expansion, return i immediately without
+ doing a `continue' (which will increment i past the end of string)
+ - in split_at_delims, don't increment te by 1 if it's pointing to a
+ delimiter. this has the effect of skipping the first delimiter
+ char in a possibly multi-character delimiter, and ignoring
+ single-char delimiters like `>'
+
+configure.in
+ - use AC_CHECK_MEMBERS([struct stat.st_blocks]) instead of a call to
+ AC_STRUCT_ST_BLOCKS to avoid configure changing LIBOBJS if the test
+ fails
+
+general.c
+ - introduce two new variables: bash_tilde_{prefixes,suffixes}, set
+ to the additional prefixes and suffixes bash wants to pass to the
+ tilde expansion code (reserved for post-bash-2.05a fix)
+
+aclocal.m4
+ - add missing `test' in BASH_CHECK_SYS_SIGLIST
+
+ 11/7
+ ----
+lib/readline/vi_mode.c
+ - fix rl_vi_goto_mark to explicitly check that the desired mark is
+ between 'a' and 'z', since some locales have lowercase letters
+ outside that range, which could cause a negative subscript
+
+include/chartypes.h
+ - remove superfluous `#undef ISASCII'
+
+lib/sh/strto[iu]max.c
+ - changes from Paul Eggert to work around buggy compilers and catch
+ configuration errors at compile time
+
+aclocal.m4
+ - new macro, BASH_C_LONG_DOUBLE, identical to AC_C_LONG_DOUBLE but
+ with a fix for Irix 5.3 (not called, since I'm not sure it's the
+ right thing to do -- the C standard allows double and long double
+ to be the same size)
+
+lib/sh/snprintf.c
+ - only try to write the trailing NUL in vsnprintf_internal if
+ data->length is >= 0, since if it's not, we probably don't have
+ a buffer
+
+Makefile.in
+ - changed RELSTATUS to `release'
+
+ 11/8
+ ----
+lib/sh/strtol.c
+ - make sure chars passed to toupper are cast to unsigned
+
+unwind_prot.c
+ - change clear_unwind_protect_list to not require a cast from `int'
+ to `char *'
+
+lib/readline/chardefs.h
+ - make _rl_digit_p succeed only for ascii digits, since that's what
+ most callers assume
+
+ 11/13
+ -----
+doc/bashref.texi
+ - added `ERR' trap and [-+]O invocation option to section listing
+ differences from the Bourne shell
+
+ 11/15
+ -----
+[bash-2.05a released]
+
+ 11/19
+ -----
+include/stdc.h
+ - new define, INLINE, defined as `inline' for gcc and empty otherwise
+
+subst.c
+ - make skip_double_quoted, sub_append_string have INLINE attribute
+
+trap.c
+ - use BASH_NSIG as upper limit for signal names in signal_name()
+
+lib/readline/bind.c
+ - use RL_COMMENT_BEGIN_DEFAULT in output for rl-comment-begin value
+
+error.c
+ - fix sys_error to save value of errno around calls to fprintf
+
+doc/Makefile.in
+ - added rules to create PDF files from postscript and dvi input
+
+MANIFEST.doc
+ - added {article,bash,bashref,rose94}.pdf
+
+doc/bash.1
+ - rearranged some `.PD 0' and `.TP' directives so man2html will
+ handle them better (shouldn't affect groff output)
+
+support/man2html.c
+ - small fix to handle quoted string arguments to directives like
+ `.BR' without mangling the output
+
+ 11/20
+ -----
+{arrayfunc,variables}.c
+ - changed calling sequence for dynamic array variable `assign'
+ functions to (SHELL_VAR *self, char *value, arrayind_t ind)
+ - changed calling sequence for dynamic variable assign functions
+ to the same as array variable assign_func. Now this can be
+ prototyped
+
+variables.h
+ - the assign_func member of a `struct variable' is now of type
+ `sh_var_assign_func_t', which is prototyped
+ - the dynamic_value member of a `struct variable' is now of type
+ `sh_var_value_func_t', which is prototyped
+
+variables.c
+ - changed to use `sh_var_assign_func_t' and `sh_var_value_func_t'
+
+builtins/cd.def
+ - when in posix mode, if the new directory name formed by PWD and
+ the argument passed by the user cannot be canonicalized, and the
+ -P option has not been supplied, return failure immediately
+ - if canonicalization failed, but the fallback to the directory
+ name specified by the user succeeds, reset the current working
+ directory
+
+lib/readline/{input.c,rlprivate.h}
+ - renamed rl_unget_char to _rl_unget_char; made library global
+
+lib/readline/{{bind,readline}.c,{keymaps,rlprivate}.h}
+ - support for `key subsequences'; allows a key sequence and a function
+ mapped to a subsequence of that key sequence. Primarily to allow
+ arrow keys to be bound in readline vi insert mode, while preserving
+ the ESC function to switch to command mode.
+
+lib/readline/{input.c,rlprivate.h}
+ - new function, _rl_input_queued(T), does a check with select or
+ FIONREAD with a timeout of `T' (which is generally 0)
+
+lib/readline/readline.c
+ - change _rl_dispatch_subseq to test for input in the queue if we
+ get ESC while in vi insertion mode if the keymap entry type for
+ ESC is ISKMAP. If _rl_input_queued returns non-zero, we assume
+ that an arrow key sequence has been pressed and go ahead with the
+ subsequence. If it returns zero, we assume that the user pressed
+ ESC to switch into command mode, and dispatch to that right away.
+ This avoids forcing the user to press another key before switching
+ into command mode
+
+ 11/21
+ -----
+lib/readline/readline.c
+ - bind common arrow key sequences in vi insertion keymap
+
+lib/readline/terminal.c
+ - bind termcap definition's arrow keys in vi insertion keymap
+
+lib/readline/bind.c
+ - check for rl_vi_movement_mode in _rl_bind_if_unbound, so
+ binding the arrow keys can work
+
+lib/readline/readline.c
+ - since _rl_bind_if_unbound does the check of what's currently
+ bound to the key sequence, the check in bind_arrow_keys_internal
+ was redundant
+ - bind_arrow_keys_internal now takes a Keymap argument and handles
+ saving and restoring _rl_keymap; changed bind_arrow_keys
+ accordingly
+
+builtins/fc.def
+ - fix from Paul Eggert to substitute the nearest history number in
+ range if an out-of-range value is supplied. POSIX requires this
+
+lib/sh/pathcanon.c
+ - fix from Corrina Vinschen for the special `cygdrive' prefix on
+ Cygwin
+
+bashhist.c
+ - split the history adding code into more pieces:
+ check_history_control (char *line) checks LINE against the value
+ of HISTCONTROL, returning 1 if LINE should be saved and 0 if not
+
+ check_add_history (char *line) calls check_history_control and
+ history_should_ignore (line) and saves the line with
+ bash_add_history if the checks indicate that it should be saved
+
+ maybe_add_history just calls check_add_history to set the value
+ of first_line_saved
+
+bashhist.h
+ - extern declaration for check_add_history()
+
+shell.c
+ - don't call load_history() from the interactive shell startup
+ code if history_lines_this_session is > 0, indicating that we've
+ already saved some lines in the history and that we probably
+ don't want to overwrite them
+
+builtins/history.def
+ - call check_add_history from push_history, so `history -s xx'
+ works even when in a compound command whose first line has not
+ been saved. (Caveat: in a compound command when the first
+ line has been saved, the line supplied to history -s will become
+ part of the compound command's history entry. Of course, the
+ delete_history call could remove the compound command from the
+ history entirely)
+
+bashline.c
+ - use sh_makepath instead of xmalloc/sprintf in
+ command_word_completion_function
+
+lib/readline/complete.c
+ - get_y_or_n now takes an int FOR_PAGER argument; caller changed
+ If FOR_PAGER is non-zero, get_y_or_n returns appropriate values
+ for a more-like pager: `newline' or `return' return 2; `q' or
+ `Q' return 0
+ - there is now a mini internal more-like pager for displaying a
+ list of completions that exceeds the screen height (new function
+ _rl_internal_pager, called from rl_display_match_list)
+
+ 11/24
+ -----
+command.h
+ - new flag, W_TILDEEXP, says to do tilde expansion on an
+ assignment word
+
+execute_cmd.c
+ - fix_assignment_words now sets W_TILDEEXP for assignment word
+ arguments to `assignment builtins'
+
+general.c
+ - bash_tilde_expand now takes a second argument indicating whether
+ or not it's being invoked in an `assignment context'
+
+general.h
+ - change extern declaration for bash_tilde_expand
+
+{bashline,execute_cmd,findcmd,general,variables}.c
+builtins/evalfile.c
+lib/sh/makepath.c
+ - fix callers of bash_tilde_expand appropriately
+
+subst.c
+ - fix callers of bash_tilde_expansion appropriately
+ - add (currently commented-out) code that would tilde expand assignment
+ statement arguments to assignment builtins (W_TILDEEXP flag set)
+ even when the shell is in posix mode
+
+bashline.c
+ - fix attempt_shell_completion to turn off
+ rl_filename_completion_desired when doing command name completion,
+ so no slash gets appended to the name if there happens to be a
+ directory with the same name in the current directory
+
+ 11/26
+ -----
+lib/readline/rltech.texinfo
+ - a couple of additions to the rl_stuff_char description
+
+parse.y
+ - turn off echo_input_at_read in parse_string_to_word_list, so `set -v'
+ doesn't give extra lines of output when doing compound array
+ assignment
+
+subst.c
+ - fix split_at_delims to handle skipping over a `\n' if it's a
+ delimiter (use spctabnl(c) instead of whitespace(c))
+
+ 11/27
+ -----
+support/config.{guess,sub}
+ - updated (with bash changes) to latest version from gnu.org
+
+sig.h
+ - add prototype for set_signal_handler declaration
+
+builtins/setattr.def
+ - add prototype to extern declaration of declare_builtin
+
+builtins/times.def
+ - add no_options call, since times takes no options
+
+lib/sh/spell.c
+ - add prototypes to forward declarations for midist and spdist
+
+lib/sh/strtrans.c
+ - add explicit int return type to ansic_shouldquote declaration
+
+lib/readline/rldefs.h, lib/readline/{macro,readline,util,undo}.c
+ - move define for SWAP to rldefs.h, removed from various C files
+
+lib/readline/vi_mode.c
+ - removed define for exchange(), changed to use SWAP instead
+
+lib/readline/bind.c
+ - added some static forward function declarations
+ - find_boolean_var, find_string_var now take a `const char *' argument
+
+lib/readline/signals.c
+ - added static forward declaration for rl_maybe_set_sighandler
+
+lib/readline/readline.c
+ - add some common key bindings for the HOME and END keys in
+ bind_arrow_keys_internal
+
+lib/readline/terminal.c
+ - fetch the `@7' termcap string; it's sent by the END key
+ - attempt to bind the terminal's END key to rl_end_of_line in
+ bind_termcap_arrow_keys; I don't know why I was using `kH'
+ instead of `@7'
+
+doc/builtins.1
+ - remove `case', `for', `if', `until', `while' from NAME section;
+ those are not shell builtins
+
+ 11/28
+ -----
+stringlib.c
+ - new function, find_token_in_alist, takes a token value and an
+ ALIST argument, and returns the string correspoinding to the
+ token if found in the alist
+
+externs.h
+ - new extern declaration for find_token_in_alist()
+
+subst.c
+ - string_list_internal is no longer static
+
+subst.h
+ - new extern declaration for string_list_internal()
+
+parse.y
+ - new alist array of other tokens returned by read_token which are
+ not reserved words in word_token_alist[]
+ - reworked error reporting: new functions print_offending_line,
+ which prints the line containing the syntax error,
+ error_token_from_token, which takes the current token and tries to
+ figure out its textual representation, and error_token_from_text,
+ which does the old job of finding the bad token by analyzing the
+ text of shell_input_line at the current index
+ - report_syntax_error now tries to figure out the token that caused
+ the syntax error by first looking at current_token and falling
+ back to the old method of textual analysis if that fails
+ - report_syntax_error doesn't say the token resulting from the textual
+ analysis of the input line is an `unexpected token'; it just
+ says there is a `syntax error near xxx'
+ - changed conditional command error reporting to use the value
+ returned by error_token_from_token if it's not null instead of
+ just using the token value in the message, since current_token
+ ends up being set to -1, and the text of the message from
+ report_syntax_error might not be exactly right
+ - change parse_string_to_word_list to set current_token to the
+ offending token returned by read_token before calling yyerror()
+ to make the error reporting do the right thing
+
+aclocal.m4
+ - fixed typo in BASH_CHECK_LIB_TERMCAP
+
+configure.in
+ - add check for isinf(3); define HAVE_ISINF_IN_LIBC if found
+
+config.h.in
+ - add define for HAVE_ISINF_IN_LIBC
+
+lib/sh/snprintf.c
+ - check for Inf and NaN, using isinf and isnan if they're found in
+ libc
+ - use the current locale for thousands separator and decimal point
+ - recognize "'" flag; not implemented yet
+ - fix for snprintf/vsnprintf with length of 0 and string argument of
+ 0 with non-zero length
+
+builtins/read.def
+ - TMOUT is now the default timeout for `read' (and select) if set,
+ like ksh93 when reading from the terminal
+ - edit_line (called by read -e) now just does readline's filename
+ completion by setting rl_attempted_completion_function to NULL,
+ since e.g., doing command completion for the first word on the
+ line wasn't really useful
+
+execute_cmd.c
+ - changed select_command to return failure status if select_query
+ returns NULL, indicating that read_builtin returned
+ EXECUTION_FAILURE
+
+doc/{bash.1,bashref.texi}
+ - documented new TMOUT behavior
+ - slight change to the description of the test `-ef' option
+
+doc/bashref.texi
+ - added item to posix mode section describing failure behavior of
+ cd when invoked in logical mode and the pathname formed by
+ combining $PWD and the directory argument does not refer to an
+ existing directory
+
+ 11/29
+ -----
+execute_cmd.c
+ - fix execute_function to call dispose_function_env after
+ merge_function_env if the shell is in posix mode (fixes debian
+ bash bug #117673)
+
+lib/readline/readline.c
+ - rl_forward -> rl_forward_char; rl_forward function for compatibility
+ - rl_backward -> rl_backward_char; rl_forward function for
+ compatibility
+ - new functions, rl_forward_byte, rl_backward_byte, for future use
+
+lib/readline/readline.h
+ - extern declarations for rl_forward_char, rl_backward_char,
+ rl_forward_byte, rl_backward_byte
+
+lib/readline/{emacs_keymap,funmap,vi_keymap,vi_mode
+ - rl_forward -> rl_forward_char
+ - rl_backward -> rl_backward_char
+
+lib/readline/funmap.c
+ - new bindable names, `backward-byte' and `forward-byte'
+
+aclocal.m4
+ - new function, BASH_CHECK_MULTIBYTE, encapsulates checks for
+ multibyte code
+
+config.h.in
+ - add necessary defines for multibyte include files and functions
+
+configure.in
+ - add call to BASH_CHECK_MULTIBYTE
+
+config-bot.h
+ - add code to define HANDLE_MULTIBYTE if prerequisites are met
+
+lib/sh/xstrchr.c
+ - new file, xstrchr() is strchr(3) that handles multibyte characters
+
+bashhist.c
+ - first_line_saved -> current_command_first_line_saved; variable is
+ now global
+
+bashhist.h
+ - extern declaration for current_command_first_line_saved
+
+ 11/30
+ -----
+bashhist.c
+ - break the code that actually calls add_history out of
+ bash_add_history into a new function, really_add_history;
+ bash_add_history now calls really_add_history
+ - check_add_history takes a second `force' argument telling it
+ whether to call bash_add_history (force == 0) or really_add_history
+ (force != 0)
+
+builtins/history.def
+ - in push_history, call delete_last_history if the current command
+ has more than one line, the first line was saved, and
+ command-oriented history is active. This takes care of deleting
+ the right history element if `history -s' is used within a
+ compound or multiline command
+ - in push_history, call check_add_history with second argument of 1
+ to skip check of current_command_line_count and add the arguments
+ to history -s as a single separate history entry
+
+ 12/3
+ ----
+lib/readline/complete.c
+ - append a slash to completed names which are symlinks to directories
+ if the new variable _rl_complete_mark_symlink_dirs is non-zero
+
+lib/readline/rlprivate.h
+ - extern declaration for _rl_complete_mark_symlink_dirs
+
+lib/readline/bind.c
+ - new bindable variable, `mark-symlinked-directories', mirrors the
+ value of _rl_complete_mark_symlink_dirs
+
+doc/bash.1, lib/readline/doc/{readline.3,rluser.texinfo}
+ - documented new `mark-symlinked-directories' variable
+
+ 12/4
+ ----
+variables.[ch]
+ - set_pipestatus_array now takes a second argument with the number
+ of processes in the array
+ - changed set_pipestatus_array to just modify the value in place if
+ the existing array has one element and the new array has one
+ element, and to modify existing values in place if new array has
+ more elements than existing array
+
+variables.c, jobs.c
+ - changed set_pipestatus_array callers
+
+jobs.c
+ - moved call to setjstatus() from set_job_status_and_cleanup to
+ wait_for, since set_job_status_and_cleanup is part of the SIGCHLD
+ signal handler call path, and race conditions accessing the
+ PIPESTATUS array will result for things like
+
+ while true; do date; done | cat > /dev/null
+
+ 12/5
+ ----
+xmalloc.h
+ - don't redefine xmalloc, xrealloc, and xfree if DISABLE_MALLOC_WRAPPERS
+ is #defined
+
+config.h.in
+ - #undef for DISABLE_MALLOC_WRAPPERS
+
+configure.in
+ - define DISABLE_MALLOC_WRAPPERS if the --with-purify option is
+ supplied
+
+lib/malloc/trace.c
+ - new function, malloc_trace_bin(N), traces allocations and frees
+ to bucket N (uses the same type of bitmap as `busy')
+
+lib/malloc/table.c
+ - fix wraparound search problem in find_entry when searching for a
+ free entry when the table is full
+
+ 12/6
+ ----
+lib/malloc/table.c
+ - keep an `overflow bucket' around to use when the table is full,
+ so find_entry always returns a valid pointer when FIND_ALLOC
+ is set
+ - new static variable to keep a count of the number of MT_ALLOC
+ entries in the mem_table
+
+lib/sh/{oslib,clktck}.c
+ - if HAVE_LIMITS_H is defined, include <limits.h>
+
+lib/sh/oslib.c
+ - new function, getmaxgroups() returns max number of simultaneous
+ groups
+ - new function, getmaxchild(), returns max number of simultaneous
+ user processes
+
+general.c
+ - removed forest of #defines for getmaxgroups()
+
+externs.h
+ - new extern declaration for getmaxgroups()
+ - new extern declaration for getmaxchild()
+ - new extern declaration for isnetconn()
+
+lib/sh/netconn.c,shell.c
+ - new file, isnetconn() from shell.c moved here
+
+Makefile.in, lib/sh/Makefile.in
+ - necessary changes for netconn.c
+
+builtins/ulimit.def
+ - changed getmaxuprc() to just call getmaxchild() and massage the
+ return value appropriately
+
+{jobs,nojobs}.c
+ - use the value returned by getmaxchild() in
+ mark_dead_jobs_as_notified instead of static CHILD_MAX
+
+jobs.c
+ - new function, compact_jobs_list, removes some number of jobs from
+ the jobs table and reallocates the table, copying the jobs that
+ are left from the old table to the new. Compaction happens from
+ the beginning of the list and removes dead jobs, and we make sure
+ to keep the last CHILD_MAX jobs as POSIX.2 requires
+ - call compact_jobs_list from stop_pipeline if we're in a subshell,
+ there are no free jobs in the jobs table, and the jobs table is
+ at or above some maximum limit
+
+execute_cmd.c
+ - change eval_arith_for_expr to set this_command_name to `((' before
+ calling evalexp, since it might be changed by evaluating the
+ loop body between evalexp calls
+
+trap.c
+ - change reset_signal to turn off the SIG_TRAPPED flag for the
+ given signal, so shell builtins and functions running in command
+ substitutions don't run the signal handlers (traps are not supposed
+ to be inherited by command substitutions)
+
+parse.y
+ - changed parse_string_to_word_list to turn off alias expansion
+ while parsing the array assignment
+
+ 12/9
+ ----
+alias.c
+ - fix add_alias so that redefining an alias's value also resets the
+ EXPANDNEXT flag
+
+ 12/10
+ -----
+parse.y
+ - new function, token_is_assignment, called to check whether the text
+ before `=' makes up a valid assignment token before trying to parse
+ a compound assignment statement
+ - new function, parse_compound_assignment, to parse a compound
+ assignment statement instead of using parse_matched_pair; handles
+ comments and error reporting in the parser instead of waiting until
+ expansion time
+ - changed parse_compound_assignment and parse_string_to_word_list to
+ allow reserved words in compound array assignments
+
+lib/readline/doc/rltech.texinfo
+ - changed the documentation for rl_callback_read_char and
+ rl_callback_handler_remove to say what happens to the terminal
+ settings and what needs to be done to reset them
+
+ 12/11
+ -----
+bashline.c
+ - add emacs_edit_and_execute_command, bound to C-xC-e, like vi-mode
+ `v' command
+ - add bindable command name `edit-and-execute-command', bound to
+ run emacs_edit_and_execute_command()
+
+lib/glob/strmatch.c
+ - add support for ksh93-like [:word:] character class (isalnum + `_')
+
+doc/{bash.1,bashref.texi}
+ - add note to section describing lists to clarify that a sequence of
+ one or more newlines may be used to delimit a command, equivalent
+ to a semicolon
+ - document new [:word:] pattern matching character class
+
+doc/bash.1, lib/readline/doc/rluser.texinfo
+ - document `edit-and-execute-command' and its default emacs-mode
+ binding
+
+include/chartypes.h
+ - add defines for TOCTRL and UNCTRL if they're not already defined
+
+lib/readline/chardefs.h
+ - #undef UNCTRL if it's defined to avoid cpp redefinition warnings
+
+lib/sh/strtrans.c
+ - add \cX (Control-X) escape for $'...' to ansicstr()
+ - change ansic_quote() to allocate at least four chars for each char
+ in the string argument, to account for \0xx octal values
+ - change ansic_quote() to no longer call sprintf for non-printable
+ characters; just translate the string to octal directly
+
+print_cmd.c
+ - change xtrace_print_word_list to call ansic_quote() if
+ ansic_shouldquote() indicates that there are nonprinting characters
+ in a word
+
+builtins/type.def
+ - changed deprecated long option parsing to just replace the word
+ in the list with the equivalent short option (-type -> -t) instead
+ of removing words from the list
+ - changed describe_command to take a single flags argument instead
+ of two int args; changed caller
+ - type now has two new options: -f suppresses function lookup (like
+ command), and -P forces a PATH search for the name(s)
+
+builtins/common.h
+ - flags for describe_command are here
+ - changed extern declaration of describe_command
+
+builtins/command.def
+ - changed call to describe_command to use flags from common.h, and
+ the right number of arguments
+
+doc/{bash.1,bashref.texi}
+ - documented new -f and -P options to `type'
+
+ 12/12
+ -----
+lib/readline/rldefs.h
+ - fixed prototype for _rl_strnicmp
+
+execute_cmd.c
+ - select_query now takes a new argument, an int flag saying whether
+ or not to print the menu the first time through the loop. An
+ empty line in response to the prompt will always cause the menu
+ to be reprinted
+ - changed execute_select_command to cause select_query to reprint
+ the menu only if REPLY is set to NULL, if KSH_COMPATIBLE_SELECT
+ is defined
+
+config-top.h
+ - define KSH_COMPATIBLE_SELECT, with a comment about its meaning
+
+lib/readline/readline.c
+ - change rl_insert_comment to toggle if given an explicit numeric
+ argument: if the first characters on the line don't specify a
+ comment, insert one; if they do, delete the comment text
+
+doc/bash.1, lib/readline/doc/{readline.3,rluser.texinfo}
+ - documented new behavior of insert-comment with a numeric argument
+
+ 12/13
+ -----
+lib/malloc/watch.c
+ - new file, implements watchpoint functions
+
+lib/malloc/watch.h
+ - new file, define some `events' for watchpoints and extern function
+ and variable declarations for watchpoint code
+
+lib/malloc/imalloc.h
+ - #define MALLOC_WATCH if MALLOC_DEBUG is defined
+ - add __P define as in include/stdc.h if not already defined
+
+lib/malloc/malloc.c
+ - remove __P define, now in imalloc.h
+ - include watch.h if MALLOC_WATCH is defined
+ - added calls to _malloc_ckwatch in internal_malloc, internal_free,
+ and internal_realloc
+
+include/stdc.h
+ - augment __P define to allow prototypes if PROTOTYPES is defined
+
+lib/readline/rlstdc.h
+ - augment PARAMS define to allow prototypes if PROTOTYPES is defined
+
+lib/malloc/Makefile.in, Makefile.in
+ necessary changes to include watch.c in libmalloc
+
+lib/readline/readline.c
+ - fix rl_delete_text to make sure that the starting position is >= 0
+ - _rl_init_line_state (called by readline via readline_initialize)
+ now sets rl_mark to 0
+ - rl_get_{next,previous}_history set rl_mark to 0 if rl_point is at
+ the end of the line and rl_end otherwise in emacs mode
+
+lib/readline/kill.c
+ - rl_yank_nth_arg_internal and rl_paste_clipboard now set the mark
+ at point before calling rl_insert_text, like rl_yank
+ - rl_kill_full_line now resets rl_mark to 0
+ - rl_kill_line and rl_backward_kill_line now set rl_mark to the
+ point after the kill in emacs mode
+ - rl_kill_word and rl_backward_kill_word now set rl_mark to the
+ point after the kill in emacs mode
+ - rl_unix_word_rubout and rl_unix_line_discard now set rl_mark to
+ the point after the kill in emacs mode
+
+lib/readline/search.c
+ - noninc_search saves and restores the mark, since it can be changed
+ while reading the search string
+ - noninc_dosearch sets the mark at the end of the line, making the
+ region bound the `inserted' text since rl_point is set to 0
+ - rl_history_search_internal sets the mark at the end of the line,
+ for the same reason
+
+lib/readline/isearch.c
+ - rl_search_history now saves and restores the mark
+ - if no matching lines are found at all when doing an isearch, leave
+ point where it was instead of moving it to the end of the line
+
+ 12/17
+ -----
+lib/readline/rlmbutil.h
+ - new file, place for multi-byte character defines and extern
+ declarations
+
+lib/readline/{bind.c,readline.c,rlprivate.h}
+ - new bindable variable, `byte-oriented', tracks value of
+ rl_byte_oriented variable
+
+lib/readline/mbutil.c
+ - new file, with multibyte char utility functions
+
+lib/readline/{complete,display,readline,util,vi_mode}.c
+ - new code for multibyte characters, derived from IBM patch
+
+ 12/18
+ -----
+lib/sh/tmpfile.c
+ - include posixtime.h for time() extern declaration
+
+support/bashversion.c
+ - include <unistd.h> if it's available
+
+lib/readline/{histexpand,input,isearch,search}.c
+ - new code for multibyte characters, derived from IBM patch
+
+lib/readline/readline.h
+ - include rltypedefs.h
+
+ 12/19
+ -----
+lib/readline/complete.c
+ - slight change to mark-directories code to avoid adding a slash if
+ point is at the end of the line (rl_line_buffer[rl_point] == '\0')
+ and the previous character was a slash
+ - change printable_part to not return empty pathnames, which could
+ happen when completing filenames and a filename with a trailing
+ slash was passed as the argument. If the portion following the
+ trailing slash is NULL, ignore it and look for a previous slash.
+ If there's no previous slash, just return the filename argument
+ - new variable, rl_completion_mark_symlink_dirs, mirrors the value
+ of (user-settable with a variable) _rl_complete_mark_symlink_dirs
+ but may be modified by application-specific completion functions
+ when appropriate (set in rl_complete_internal and rl_menu_complete)
+
+lib/readline/readline.h
+ - extern declaration for rl_completion_mark_symlink_dirs
+
+pcomplete.c
+ - if one of the actions is CA_DIRECTORY, set
+ rl_completion_mark_symlink_dirs to indicate that we want the
+ trailing slash (might have to relax this)
+
+lib/readline/doc/rltech.texinfo
+ - documented rl_completion_mark_symlink_dirs variable
+
+lib/readline/doc/rluser.texinfo, doc/bash.1
+ - documented the fact that `complete -d' and `complete -o dirnames'
+ force readline to append a slash to symlinks to directories
+
+builtins/enable.def
+ - changed enable_shell_builtin to disallow enabling disabled
+ builtins in a restricted shell
+
+doc/{bash.1,bashref.texi}
+ - documented new enable behavior in restricted shells
+
+doc/Makefile.in
+ - new rule to make an `RBASH' file documenting the restrictions
+ imposed by a restricted shell
+
+expr.c
+ - broke the code that evaluates variables and returns results out
+ of readtok() into a new function: expr_streval()
+ - expr_streval() now performs the standard unset variable error
+ behavior if `set -u' has been executed and it's asked to look
+ up an unset variable
+ - broke the code that frees up the expression context stack into
+ a new function: expr_unwind()
+
+variables.c
+ - fixed bind_int_variable so it handles array element assignment,
+ so expressions like `b[7]++' and `b[0] = 42' work right
+ - new function, get_variable_value, returns the string value of
+ the SHELL_VAR * passed as an argument
+ - get_string_value now calls get_variable_value with a non-null
+ result from find_variable
+
+ 12/20
+ -----
+lib/readline/rlmbutil.h, mbutil.c
+ - combined _rl_find_next_mbchar and _rl_find_next_nonzero_mbchar into
+ a single function
+ - combined _rl_find_prev_mbchar and _rl_find_prev_nonzero_mbchar into
+ a single function
+
+lib/readline/{display,readline,vi_mode}.c
+ - changed callers of _rl_find_next_mbchar and
+ _rl_find_next_nonzero_mbchar
+
+lib/readline/{complete,display,histexpand,readline,vi_mode}.c
+ - changed callers of _rl_find_prev_mbchar and
+ _rl_find_prev_nonzero_mbchar
+
+ 12/20
+ -----
+lib/sh/mktime.c
+ - new file, from glibc/gawk, compiled in if system doesn't have a
+ working mktime(3)
+
+lib/sh/strftime.c
+ - new file, from gawk, compiled in if system doesn't have a
+ working strftime(3)
+
+lib/sh/Makefile.in, Makefile.in
+ - changes for mktime.c, strftime.c
+
+configure.in
+ - call AC_FUNC_MKTIME, AC_STRUCT_TM, AC_STRUCT_TIMEZONE
+ - call AC_REPLACE_FUNC(strftime)
+
+config.h.in
+ - add defines for TM_IN_SYS_TIME, HAVE_TZSET, HAVE_TM_ZONE,
+ HAVE_STRUCT_TM_TM_ZONE, HAVE_STRFTIME
+
+externs.h
+ - provide an extern declaration for strftime if HAVE_STRFTIME is
+ not defined and NEED_STRFTIME_DECL is
+
+lib/tilde/tilde.h
+ - header files should not include <config.h>
+
+parse.y
+ - replace code in decode_prompt_string that chops up value returned
+ by ctime(3) with calls to strftime -- as a result, the expansion
+ of \@ has changed slightly (since it depends on the locale)
+ - added new \D{format} prompt string escape; `format' is passed to
+ strftime(3). Empty format is the same as `%X' (locale-specific
+ representation of the current time)
+ - combined cases for '\\', '\a', '\e', and '\r' in same case branch
+ in decode_prompt_string
+
+doc/{bash.1,bashref.texi}
+ - documented new \D{format} prompt string expansion
+
+builtins/printf.def
+ - use ISO C PRIdMAX instead of INTMAX_CONV
+ - pass length of format modifiers to mklong instead of computing it
+ with strlen()
+
+lib/sh/{fmtulong,fmtullong}.c
+ - changes from Paul Eggert to make more general
+
+arrayfunc.c
+ - when converting a variable to an array, make sure to unset the
+ dynamic_value and assign_func members of the struct variable,
+ since they're not valid anymore
+
+ 12/27
+ -----
+configure.in
+ - use AC_HELP_STRING in AC_ARG_WITH and AC_ARG_ENABLE
+ - remove AC_ARG_ENABLE for largefile, since AC_SYS_LARGEFILE adds
+ one
+
+ 1/2/2002
+ --------
+{alias,bashline,execute_cmd,general,shell,subst,variables,arrayfunc}.c,general.h
+ - changed some calls to strchr to calls to xstrchr for multibyte
+ characters
+
+include/shmbutil.h
+ - add extern declaration for xstrchr to avoid including externs.h
+ where it's not appropriate
+
+{braces,make_cmd,pathexp,subst,arrayfunc}.c, lib/sh/xstrchr.c
+ - include shmbutil.h
+
+{stringlib,subst}.c, {externs,subst}.h
+ - moved substring() from subst.c to stringlib.c, moved declaration
+ from subst.h to externs.h
+
+lib/sh/xmbsrtowcs.c
+ - new file, replacement function for mbsrtowcs
+
+lib/sh/Makefile.in
+ - add entries for xmbsrtowcs.c
+
+Makefile.in
+ - add dependencies on shmbutil.h to appropriate object files
+
+lib/glob/strmatch.c
+ - break character-class testing out into separate function:
+ is_cclass, in prep for multibyte changes
+
+{braces,make_cmd}.c
+ - changes for multibyte characters
+
+builtins/printf.def
+ - changes from Paul Eggert to just use intmax_t everywhere an
+ int/long/quad is needed and print with "%ld" if the number
+ fits in a long and %PRIdMAX otherwise
+ - remove getlong, getulong, getllong, getullong, since they're
+ no longer needed
+ - use a new type `floatmax_t' to print floating point numbers, the
+ widest-available floating point type (like `intmax_t'); new
+ function `getfloatmax' that calls strtold or strtod as appropriate
+ - remove getdouble, getldouble, since they're no longer needed
+
+lib/sh/fmtumax.c
+ - new file, string-to-[u]intmax_t conversion, just includes
+ fmtulong.c with the right defines
+
+Makefile.in, lib/sh/Makefile.in
+ - additions for fmtumax.c
+
+bashtypes.h
+ - include <inttypes.h> if it's available
+
+expr.c
+ - arithmetic is now in intmax_t instead of long
+
+externs.h
+ - extern declaration for fmtumax
+ - change extern declarations for evalexp, itos, inttostr,
+ uitos, uinttostr since they now return or use intmax_t instead
+ of long
+
+{execute_cmd,general,mailcheck,subst,variables}.c, parse.y
+{array,general,subst,test,variables}.h
+lib/sh/{itos,netopen}.c
+builtins/{bashgetopt,common}.c, builtins/common.h
+builtins/{break,fc,history,jobs,let,printf,pushd,read,shift,wait}.def
+ - changes for intmax_t shell arithmetic conversion
+
+doc/{bashref.texi,bash.1}
+ - documented long->intmax_t shell arithmetic conversion
+
+sig.c
+ - in initialize_terminating_signals, if we've already trapped a
+ terminating signal, don't reset the signal handler for it
+
+ 1/3
+ ---
+{arrayfunc,pathexp}.c, parse.y
+ - changes for multibyte chars
+
+parse.y, lib/sh/strtrans.c
+ - moved ansiexpand from parse.y to lib/sh/strtrans.c
+
+parse.y, locale.c
+ - moved mk_msgstr and localeexpand from parse.y to locale.c
+
+parse.y
+ - new function, yy_input_name, returns name of input file from
+ bash_input.name
+ - broke the code that parses ((...)) constructs out of read_token
+ into a new function, parse_dparen()
+
+externs.h
+ - new extern declaration for ansiexpand(), mk_msgstr(), and
+ localeexpand()
+
+input.h
+ - new extern declaration for yy_input_name()
+
+{error,locale}.c
+ - use yy_input_name for error and other messages
+
+execute_cmd.c
+ - change shell_execve to make sure that the file is executable
+ before looking at the interpreter to find out why the execve()
+ failed (avoids misleading error message)
+
+lib/glob/glob.c
+ - move code that matches leading `.' and skips those filenames into
+ a separate function: skipname(), so there can be unibyte and
+ multibyte versions of that function
+
+ 1/7
+ ---
+subst.c
+ - more changes for multibyte characters
+
+print_cmd.c
+ - change semicolon() so it doesn't output a `;' immediately after a
+ newline, since that results in a null command, which is a syntax
+ error
+
+variables.c
+ - fix indirection_level_string to turn off set -x while evaluating
+ PS4
+
+ 1/8
+ ---
+builtins/set.def
+ - make -o options into one struct, instead of separate structs for
+ option names corresponding to flags and non-flag option names.
+ This has the side effect of sorting the option names in output
+
+lib/glob/glob.c
+ - new function, mbskipname(), multibyte char version of skipname()
+ - removed all #ifndef SHELL code, this will never be used outside
+ the shell
+
+include/posixdir.h
+ - move REAL_DIR_ENTRY define here from lib/glob/glob.c
+
+lib/glob/glob_loop.c
+ - new file, included in glob.c for unibyte and multibyte versions of
+ glob_pattern_p
+ - added some forward static function declarations with prototypes
+ - more changes for multibyte character handling
+
+lib/glob/Makefile.in
+ - make glob.c depend on glob_loop.c
+ - changes for xmbsrtowcs.[co]
+
+lib/glob/xmbsrtowcs.c
+ - moved here from lib/sh, since the matching functions use it, and
+ libglob.a is linked after libsh.a
+
+ 1/9
+ ---
+lib/glob/smatch.c
+ - new file, with strmatch (now xstrmatch) and associated functions,
+ with changes for multibyte chars
+
+lib/glob/sm_loop.c
+ - new file, included by smatch.c, with `generic' versions of matching
+ functions that are compiled twice: once each for single-byte and
+ multibyte characters
+
+lib/glob/strmatch.c
+ - strip out everything except strmatch(), which either calls fnmatch
+ (if HAVE_LIBC_FNM_EXTMATCH is defined) or xstrmatch
+
+lib/glob/collsyms.c
+ - changes for multibyte chars
+
+lib/glob/Makefile.in, Makefile.in
+ - changes for new source files
+
+ 1/10
+ ----
+lib/readline/complete.c
+ - new function, rl_completion_mode (rl_command_func_t *func), returns
+ the appropriate value to pass to rl_complete_internal depending on
+ FUNC and the value of `show-all-if-ambiguous'. This allows
+ application completion functions to present the same interface as
+ rl_complete
+
+lib/readline/readline.h
+ - new extern declaration for rl_completion_mode()
+
+lib/readline/doc/rltech.texinfo
+ - documented rl_completion_mode
+
+lib/readline/readline.[ch]
+ - bumped the version number to 4.3, changing the relevant cpp defines
+
+configure.in
+ - require that an installed readline version be at least readline-4.3
+
+bashline.c
+ - converted bash-specific completion functions to use
+ rl_completion_mode instead of passing TAB unconditionally
+
+builtins/bashgetopt.c
+ - the `#' option specifier now means a required numeric argument,
+ not an optional one
+
+builtins/type.def
+ - when converting [-]-{path,type,all} to -[pta], don't bother
+ freeing and reallocating the option string; just change opt[1]
+ and null opt[2]
+
+lib/sh/snprintf.c
+ - support %ls/%S and %lc/%C for wide strings and characters,
+ respectively, if HANDLE_MULTIBYTE is defined
+
+mailcheck.c
+ - don't print a message about new mail if the file has not grown,
+ even if the access time is less than the modification time
+
+ 1/14
+ ----
+lib/readline/readline.c
+ - new function, rl_replace_line, to replace the readline line buffer
+ with the text supplied as an argument
+ - new function, rl_replace_from_history, replaces readline line
+ buffer with text from history entry passed as argument (undocumented,
+ not in readline.h because it requires a definition of
+ HIST_ENTRY for the prototype)
+
+lib/readline/readlne.h
+ - new extern declaration for rl_replace_line
+
+lib/readline/doc/rltech.texinfo
+ - documented rl_replace_line
+
+lib/readline/{isearch,readline,search}.c
+ - use rl_replace_line and rl_replace_from_history where appropriate
+
+lib/readline/readline.c
+ - broke the code that sets point after moving through the history
+ (_rl_history_preserve_point and _rl_history_saved_point) out
+ into a separate function, _rl_history_set_point()
+
+lib/readline/{complete.c,rlprivate.h}
+ - find_completion_word -> _rl_find_completion_word
+ - free_match_list -> _rl_free_match_list
+
+lib/readline/complete.c
+ - postprocess_matches and _rl_free_match_list now return immediately
+ if passed a null match list
+
+variables.c
+ - new function, find_local_variable, finds a local variable by name
+ at the current variable context
+ - in find_variable_internal, call find_local_variable before searching
+ any of the temporary environments if variable_context > 0 (meaning
+ we're in a shell function). This lets a local variable
+ override a variable whose value was passed in the `function
+ environment'
+
+ 1/15
+ ----
+variables.h, execute_cmd.c
+ - declare variables describing the temporary environments in
+ variables.h instead of in C files
+
+findcmd.c, builtins/setattr.def
+ - instead of calling find_tempenv_variable, use find_variable_internal
+ and check whether the returned SHELL_VAR * has the tempvar
+ attribute
+
+variables.c
+ - tentative change to lookup order in find_variable_internal so that
+ function local variables are found before variables in
+ function_env when executing a shell function
+ - change make_local_variable to handle making a local variable when
+ a variable with the same name already appears in one of the
+ temporary environments
+ - broke the body of make_var_array out into a new function:
+ static char **make_env_array_from_var_list (SHELL_VAR **vars)
+ - new function, make_var_array_internal, takes a hash table to look
+ in and a pointer to a mapping function and returns a char **
+ environment-style list
+ - make_var_array now just calls make_var_array_internal
+ - new mapping function, local_and_exported, returns all local variables
+ in the current variable context with the export attribute set
+ - new function, make_local_export_array, returns an environment-style
+ char ** array of exported local variables in current context
+ - change environment creation order in maybe_make_export_env to
+ add variables to the environment in opposite order that
+ find_variable_internal uses. This means that local variables in
+ shell functions override variables with the same name in the
+ function_env
+ - change make_local_variable to set the initial value of the
+ variable it creates to NULL to make the `is set' and `is null'
+ tests that the expansion code does work right
+ - change make_local_variable to inherit the value of a variable with
+ the same name from the temporary enviroment
+
+ 1/16
+ ----
+Makefile.in
+ - link bashversion with buildversion.o instead of version.o, for
+ cross-compiling. version.o is for the target system;
+ buildversion.o is for the build system
+
+error.c
+ - add line numbers to internal_error() messages if the shell is
+ not interactive and running a shell script or a -c command
+ - report_error now prints non-zero line numbers for non-interactive
+ shells
+
+test.c
+ - test_syntax_error now calls builtin_error() instead of printing
+ its own messages
+
+builtins/common.c
+ - builtin_error now prints line numbers if a non-interactive shell
+ is running a shell script or a -c command
+
+print_cmd.c
+ - in cprintf, remove free_argp, since it's not used
+
+builtins/history.def
+ - make `history -n' increment the number of history lines in this
+ session by the number of lines read from the history file
+
+arrayfunc.c
+ - fix array_value_internal to expand the subscript even if the
+ variable is unset, so side effects produced by the arithmetic
+ evaluation will take place
+
+lib/readline/doc/{rluser,rltech}.texinfo
+ - some fixes for printing in @smallbook format from Brian
+ Youmans
+
+ 1/17
+ ----
+jobs.h
+ - new PRUNNING, PSTOPPED, PDEADPROC defines for PROCESSes, analogous
+ to RUNNING, STOPPED, and DEADJOB defines for jobs
+
+jobs.c
+ - use PS_RUNNING, PS_DONE, PS_STOPPED values for `running' field
+ of a PROCESS
+ - find_pipeline and find_job now take an additional flags argument
+ that, if non-zero, means to find only running processes; changed
+ all callers
+ - changed calls to find_pipeline and find_job made from waitchld
+ to find only running processes
+ - find_pipeline takes a third argument: an int *. If it looks in
+ the jobs list to find the pid, and the arg is non-null, it passes
+ the job index back to the caller. Used to avoid calls to
+ find_pipeline immediately followed by find_job with the same PID
+
+nojobs.c
+ - a couple of changes to make sure that set_pid_status is never
+ called with a pid argument of 0 or -1
+
+trap.c
+ - change trap_handler to longjmp to wait_intr_buf (set by wait_builtin)
+ if a signal is received for which a trap has been set during
+ execution of the wait builtin (need to include builtins.h and
+ builtins/builtext.h and declare some extern variables for the
+ right things to check)
+ - new variable to keep track of which signal caused the longjmp to
+ wait_intr_buf, set by trap_handler (wait_signal_received)
+
+builtins/wait.def
+ - set the return value of wait when a longjmp(wait_intr_buf, 1) is
+ done to 128 + wait_signal_received
+
+{jobs,nojobs}.c
+ - set wait_signal_received to SIGINT in wait_sigint_handler before
+ the longjmp(wait_intr_buf, 1)
+
+ 1/18
+ ----
+bashline.c
+ - turn off rl_filename_completion_desired when completing a command
+ name with a single match only if the first char of that match is
+ not a `/'
+ - if there are multiple identical matches for a command name in
+ attempt_shell_completion, turn off rl_filename_completion_desired
+ if the first char is not a `/' to avoid readline appending a
+ slash if there's a directory with the same name in the current
+ directory
+
+ 1/22
+ ----
+lib/readline/complete.c
+ - new variable, _rl_page_completions, to control whether we want to
+ run the internal pager when listing completions (defaults to 1)
+
+lib/readline/rlprivate.h
+ - extern declaration for _rl_page_completions
+
+lib/readline/bind.c
+ - new bindable variable, `page-completions', controls value of
+ _rl_page_completions
+
+lib/readline/doc/{rluser.texinfo,readline.3}, doc/bash.1
+ - documented `page-completions' variable
+
+Makefile.in
+ - use $(INSTALL_SCRIPT) instead of $(INSTALL_PROGRAM) to install
+ `bashbug'
+
+aclocal.m4
+ - fix small quoting problem in RL_LIB_READLINE_VERSION macro
+
+lib/readline/terminal.c
+ - fetch and save terminal's `vs' and `ve' cursor control attributes
+ - fetch and save terminal's `kI' attribute (string sent by Insert)
+ - new function, _rl_set_cursor, sets cursor to normal (insert mode)
+ or very visible (overwrite mode)
+
+lib/readline/readline.c
+ - new global variable, rl_insert_mode
+ - new function to toggle overwrite mode, rl_overwrite_mode
+ - each new line starts in insert mode
+ - switching to vi mode or emacs mode resets to insert mode
+ - reset cursor to normal before returning line
+ - _rl_replace_text now returns the number of characters inserted,
+ the return value from rl_insert_text
+ - new function, _rl_insert_or_replace_text (const char *string, int insert),
+ either inserts STRING or replaces the number of chars in STRING
+ with STRING starting at rl_point, depending on value of INSERT
+ - renamed rl_insert to _rl_insert_char, rl_insert just calls
+ _rl_insert_char with the same arguments when in insert mode
+ - new function, _rl_overwrite_char, handles self-insert in overwrite
+ mode. Does multibyte chars by reading an entire multibyte character
+ before entering overwrite loop
+ - new function, _rl_overwrite_rubout, handles RUBOUT when in
+ overwrite mode, called from rl_rubout
+ - new function, _rl_rubout_char, old body of rl_rubout; rl_rubout
+ calls this when not in overwrite mode
+
+lib/readline/readline.h
+ - extern declarations for rl_insert_mode and rl_overwrite_mode()
+
+lib/readline/rldefs.h
+ - define constants for values of rl_insert_mode
+
+lib/readline/rlprivate.h
+ - extern declarations for _rl_set_cursor and _rl_set_insert_mode
+ - change type of _rl_replace_text to return int
+ - extern declarations for _rl_insert_char, _rl_rubout_char
+
+lib/readline/funmap.c
+ - new bindable name `overwrite-mode', bound to rl_overwrite_mode
+
+lib/readline/rlconf.h
+ - define CURSOR_MODE if you want the cursor to show insert or
+ overwrite mode (only available if both `vs' and `ve' capabilities
+ are present)
+
+lib/readline/{complete,parens,readline,search,vi_mode}.c
+ - change calls to rl_insert to _rl_insert_char
+
+lib/readline/{readline,search}.c
+ - change calls to rl_rubout to _rl_rubout_char to avoid overwrite
+ mode problems
+
+lib/readline/vi_mode.c
+ - fix rl_vi_overstrike to just call _rl_overwrite_char, which
+ handles multibyte chars
+
+lib/readline/doc/{rluser.texinfo,readline.3}, doc/bash.1
+ - document new `overwrite-mode' command
+
+ 1/23
+ ----
+lib/readline/readline.c
+ - return 0 immediately from rl_insert_text if the string to insert
+ is NULL or ""
+
+bashline.c
+ - if a numeric argument is given to one of the bash-specific glob
+ pattern completion functions (including TAB), append a `*' to
+ the word before generating matches
+ - in attempt_shell_completion, when doing glob completion, only
+ set the match list to NULL if rl_completion_type == TAB and
+ there is more than one completion. This permits listing completions
+ with double tabs and displaying ambiguous completions
+ - new function, bash_glob_complete_word, appends a `*' to the word
+ to be completed and then globs it. It uses a new filename
+ quoting function (bash_glob_quote_filename) to avoid quoting
+ globbing characters in the filename if there are no matches or
+ multiple matches
+
+lib/readline/complete.c
+ - set completion_changed_buffer to 0 in rl_complete_internal if
+ no matches were produced by the completion generator function
+ - new variable, rl_completion_suppress_append, suppresses appending
+ of rl_completion_append_character. Settable by application
+ completion functions, always 0 when application completion
+ functions are called (set to 0 by rl_complete_internal and
+ rl_menu_complete)
+ - broke the code that assigns default values to readline completion
+ variables out of rl_complete_internal and rl_menu_complete into
+ a new function, set_completion_defaults (int what_to_do)
+
+lib/readline/readline.h
+ - extern declaration for rl_completion_suppress_append
+
+lib/readline/doc/rluser.texinfo, doc/bash.1
+ - documented behavior of glob-expand-word and glob-list-expansions
+ when supplied a numeric argument
+ - documented glob-complete-word
+
+lib/readline/doc/rltech.texinfo
+ - documented rl_completion_suppress_append
+
+ 1/24
+ ----
+lib/readline/text.c
+ - new file, text and character handling functions from readline.c
+
+lib/readline/misc.c
+ - new file, miscellanous bindable functions and their supporting
+ code from readline.c
+
+Makefile.in, lib/readline/Makefile.in
+ - changes for text.c, misc.c
+
+lib/readline/bind.c
+ - change ISKMAP case of rl_invoking_keyseqs_in_map to output
+ ESC as "\M-" instead of "\e" -- it's closer to the documentation
+ - change _rl_get_keyname to output ESC as \e instead of \C-[
+ (it's easier to understand)
+
+pcomplete.h
+ - new flag, COPT_NOSPACE
+
+builtins/complete.def
+ - new `-o nospace' option for complete and compgen (though it doesn't
+ really do anything for compgen, since that doesn't hand anything
+ off to readline)
+
+bashline.c
+ - if a programmable completion specifies COPT_NOSPACE, set
+ rl_completion_suppress_append = 1
+
+lib/readline/doc/rluser.texinfo
+ - documented new `-o nospace' option to complete and compgen
+
+doc/{bash.1,bashref.texi}
+ - documented $'\cX' escape sequence (forgot to before)
+
+ 1/28
+ ----
+variables.c
+ - make_new_variable now takes the HASH_TABLE * as its second
+ argument; changed callers
+ - new function, bind_variable_in_table, takes the HASH_TABLE * as
+ its third paramter; bind_variable calls bind_variable_in_table
+ with shell_variables as third argument
+
+variables.h
+ - new struct var_context, variable context (per-scope -- global,
+ function local, etc.)
+
+variables.[ch],builtins/common.[ch]
+ - moved functions that push and pop a variable context from
+ builtins/common.c to variables.c; move extern function
+ declarations to variables.h
+ - new function, all_local_variables
+ - variable_in_context is now static, used only by all_local_variables
+
+variables.[ch],execute_cmd.c
+ - push_context now takes the function name as an argument for
+ future use
+ - push_context takes an indication of whether or not the function is
+ executing in a subshell and saves the positional parameters only
+ if not in a subshell
+ - new functions for managing a stack of variable contexts and
+ scopes: new_var_context, dispose_var_context, push_var_context,
+ pop_var_context, push_scope, pop_scope
+
+builtins/declare.def
+ - call all_local_variables instead of map_over (...) in declare_internal
+ - don't call make_local_variable if we're looking at functions
+ ((flags_on & att_function) != 0), since it's wasted
+ - make sure VAR is set to NULL if check for variable_context fails
+ and we didn't just create or fetch a local variable in
+ declare_internal
+ - in non-function branch of declare_internal, only call find_variable
+ if VAR is NULL -- if it's not null, we just created or fetched a
+ local variable and don't need to do it again
+
+ 1/29
+ ----
+variables.[ch]
+ - the temporary environments (temporary_env, builtin_env, function_env)
+ are now HASH_TABLEs instead of argv-style arrays of strings (this
+ is an intermediate step on the way to the new lcc-inspired symbol
+ table scope structure)
+ - new internal attribute for variables: att_propagate. This means
+ to propagate the value out of the temporary environment up the
+ (for now implicit) chain of variable scopes when the containing
+ temporary environment is deleted
+
+variables.c
+ - assign_in_env now adds to the HASH_TABLE temporary_env instead
+ of making environment-style strings in an array of strings
+ - changed the way the temporary environments are merged into the
+ shell variable table to account for the new HASH_TABLE temp
+ environments
+ - changed the way the export environment is created due to the new
+ structure of the temporary environments
+ - new function, bind_variable_internal (name, value, table), binds
+ NAME to have VALUE in TABLE without searching the temporary
+ environments
+ - removed: shell_var_from_env_string, bind_name_in_env_array
+ - variable_in_context now checks the att_local attribute and makes
+ sure the variable is not invisible
+ - local_and_exported now makes sure the variable is not invisible
+
+execute_cmd.c
+ - we no longer need to copy the temporary environment to function_env
+ or builtin_env, we can simply use variable assignments
+
+{findcmd,subst,variables}.c, builtins/{declare,setattr}.def
+ - since variables from the temporary environments are no longer turned
+ into SHELL_VARs on the fly, don't dispose the SHELL_VAR returned
+ by find_variable or find_variable_internal
+ - need to savestring() the value returned by find_variable if it has
+ the tempvar attribute before calling bind_variable on it, because
+ bind_variable will search and bind into the temporary environments
+ and will free the old value before binding the new. For temporary
+ environments, these two pointers will be the same, and
+ bind_tempenv_variable will end up using freed memory
+
+builtins/{declare,setattr}.def
+ - set the att_propagate attribute when exporting or making readonly
+ variables from the temp environment (i.e., `var=value declare -x var'
+ or `var=value export var' sets the propagate attribute on the entry
+ for `var' in the temporary environment HASH_TABLE)
+
+lib/readline/isearch.c
+ - ^W when reading isearch string yanks the current word out of the
+ current line into the search string, skipping the portion already
+ matched
+ - ^Y when reading isearch string yanks the rest of the current line
+ into the search string, skipping the portion already matched
+
+ 1/30
+ ----
+{print_cmd,variables}.c
+ - moved indirection_level_string() from variables.c to print_cmd.c
+
+{externs,variables}.h
+ - moved extern declaration of indirection_level_string to externs.h
+
+{general,variables}.c
+ - moved assignment() from variables.c to general.c
+
+{general,variables}.h
+ - moved extern declaration of assignment() to general.h
+
+{externs,input}.h
+ - moved extern declaration of decode_prompt_string to externs.h
+
+print_cmd.c
+ - include flags.h, don't include stdc.h
+
+variables.c
+ - moved some functions around to group functions better
+ - changed new_shell_variable to explicitly initialize each member
+ of the created struct variable instead of calling bzero()
+ - make_new_variable now just calls new_shell_variable instead
+ of duplicating what it does
+ - removed some code in bind_function that duplicated what
+ new_variable does on the newly-created SHELL_VAR
+ - since there are no local function variables (functions are always
+ made at the global scope), kill_all_local_variables() doesn't
+ need to consider functions
+
+ 1/31
+ ----
+variables.c
+ - sort the array of special variables
+ - short-circuit the search in stupidly_hack_special_variables if
+ the passed name can't be found in the rest of the array
+ (that is, if name[0] < special_vars[i].name[0])
+
+lib/readline/history.c
+ - unstifle_history() was returning values exactly opposite of
+ the documentation
+
+lib/readline/doc/{hsuser.texinfo,history.3}
+ - clarified the unstifle_history() documentation a little
+
+ 2/4
+ ---
+variables.c
+ - in bind_variable, don't call bind_tempenv_variable after a
+ find_tempenv_variable succeeds -- just change the value inline.
+ There's no reason to look it up twice
+ - change makunbound to only call stupidly_hack_special_variables
+ if we're not unsetting a function
+
+variables.[ch]
+ - new function, unbind_function, like makunbound but doesn't mess
+ with previous contexts or calling stupidly_hack_special_variables
+
+builtins/set.def
+ - change unset_builtin to call either unbind_func or unbind_variable
+
+builtins/getopts.def
+ - call unbind_variable(name) instead of makunbound(name, shell_variables)
+
+ 2/5
+ ---
+lib/glob/sm_loop.c
+ - use malloc instead of xmalloc in BRACKMATCH and handle failures
+
+error.c
+ - add extern declaration of executing_line_number with prototype,
+ since execute_cmd.h can't be included without including other
+ files
+
+lib/readline/parens.c
+ - include <unistd.h>
+
+lib/malloc/stats.c
+ - include <unistd.h>
+ - add extern declaration of malloc_free_blocks() with prototype
+
+pathexp.c
+ - added some forward declarations with prototypes for static functions
+
+lib/readline/rlprivate.h
+ - removed declarations of rl_untranslate_keyseq, rl_discard_argument,
+ rl_stop_output, rl_alphabetic since they appear in readline.h
+
+ 2/6
+ ---
+{arrayfunc,execute_cmd,pcomplete,shell}.c
+ - change calls to makunbound(name, shell_variables) to
+ unbind_variable (name)
+
+ 2/7
+ ---
+builtins/getopt.c
+ - don't defer incrementing of OPTIND when an invalid option is
+ encountered until the next call to sh_getopt() -- what if OPTIND
+ is reset before that next call? This means that OPTIND is always
+ incremented to the next option to be handled when an option is
+ returned, whether it's valid or not. This is what POSIX-2002
+ says to do.
+
+syntax.h
+ - new #define, CSUBSTOP
+
+mksyntax.c
+ - add "-=?+" with value CSUBSTOP to the syntax table. These are the
+ valid expansion operators OP in ${param[:]OPword}
+
+subst.c
+ - use table lookup for CSUBSTOP in VALID_PARAM_EXPAND_CHAR
+ - new flags for the string extraction functions: EX_NOALLOC. This
+ indicates that the functions are being used only to skip over
+ strings and the result won't be used, so the substring shouldn't
+ be allocated, copied, and freed
+ - new flag for string_extract: EX_VARNAME. This serves the same
+ purpose as the old `varname' parameter. parameter_brace_expand()
+ changed appropriately
+ - extract_delimited_string and extract_dollar_brace_string now take
+ an additional `flags' argument, which may include EX_NOALLOC
+ - changed callers of extract_delimited_string and
+ extract_dollar_brace_string appropriately
+ - string_extract now understands EX_NOALLOC; callers changed
+ - some smaller code cleanups
+ - converted char_is_quoted(), unclosed_pair(), and skip_to_delim()
+ to understand multibyte characters
+
+ 2/11
+ ----
+variables.[ch]
+ - moved to a symbol organization inspired by lcc. The basic structure
+ is no longer a HASH_TABLE, but a VAR_CONTEXT, which includes a hash
+ table as one of its members. VAR_CONTEXTs are linked together to do
+ variable scoping. One nice thing about this is that the entire
+ symbol table doesn't need to be searched at function scope exit to
+ remove local variables. Fixes problems with only one instance of
+ builtin_env and function_env, even though it really is a stack
+ - shell_variables is now a VAR_CONTEXT *, with a global_variables
+ variable that points to the bottom of the stack for fast access
+ - function-scope local variables (assignments specified on the command
+ line before a function call) and function-local variables (declared
+ with the `local' builtin) have been unified in the same variable
+ context, replacing function_env
+ - assignment statements preceding the `.' and `eval' builtins are now
+ a separate variable scope VAR_CONTEXT, replacing builtin_env
+ - temporary_env (a HASH_TABLE) is now the only separate environment
+ - changes to export environment creation, variable binding, variable
+ lookup, local variable propagation all changed to work with the
+ new symbol table/scope structure
+ - a SHELL_VAR no longer has a `prev_context' member; it's not needed
+
+execute_cmd.c
+ - changes to push_context calls to include any temporary variables in
+ temporary_env; pop_context takes care of propagating any temporary
+ variables if necessary
+ - calls to push_scope if `eval' or `.' is called with a list of
+ preceding variable assignments, and pop_scope called at end of
+ builtin's execution. pop_scope takes care of merging temporary
+ variables into the shell environment when appropriate
+
+builtins/{setattr,declare}.def
+ - changes to account for variable assignments preceding `local',
+ `export', `readonly', `declare', etc. to work with the new
+ variable scoping implementation
+
+shell.c
+ - since shell_variables is now a VAR_CONTEXT, call
+ delete_all_contexts() when the shell is reinitializing instead of
+ delete_all_variables()
+
+builtins/common.c
+ - new function, get_job_by_name(), used by execute_simple_command()
+ for the `auto_resume' stuff and get_job_spec()
+
+builtins/common.h
+ - new set of #defined constants for flags argument to
+ get_job_by_name()
+
+ 2/12
+ ----
+command.h
+ - new redirection operator: r_reading_string for `here strings'
+
+parse.y
+ - new token, LESS_LESS_LESS, for new redirection `here string'
+ operator: [N]<<< word
+ - recognize LESS_LESS_LESS and create the appropriate redirection
+
+{dispose_cmd,copy_cmd,make_cmd,print_cmd}.c
+ - recognize r_reading_string and do the right thing (dispose_redirects,
+ copy_redirect, print_redirection, and make_redirection, respectively)
+
+redir.c
+ - here_document_to_fd now takes the redirection operator as its
+ second argument
+ - new function, write_here_string, expands a here string and writes it
+ to the here document file descriptor
+ - here_document_to_fd calls write_here_string for r_reading_string
+ operator
+ - handle r_reading_string in do_redirection_internal() and
+ stdin_redirection()
+
+ 2/18
+ ----
+doc/{bash.1,bashref.texi}
+ - documented here strings
+
+{configure,Makefile}.in
+ - bumped version number up to bash-2.05b and the release status
+ to alpha1
+
+expr.c
+ - make expr_streval understand that variables with the `invisible'
+ attribute are really unset, and accessing such a variable when
+ `set -u' is set should be an error
+
+variables.h
+ - new accessor macros: var_isset(var) and var_isnull(var), test
+ whether var->value is NULL
+
+{eval,subst,variables}.c, builtins/{declare,setattr}.def
+ - be more consistent about using value_cell(var) instead of
+ directly referencing var->value
+ - use var_isset and var_isnull where appropriate
+
+builtins/help.def
+ - augmented a couple of help strings with pointers to `info' and
+ `man -k'
+
+ 2/14
+ ----
+variables.h
+ - new macros to use when setting variable values directly instead of
+ through bind_variable and its siblings
+
+{arrayfunc,variables}.c
+ - use var_setarray and other lvalue macros instead of assigning to
+ var->value directly
+
+builtins/setattr.def
+ - change show_var_attributes to show function definitions separately
+ from function attributes. This allows the output of `declare -f'
+ (with other flags), `export -f', and `readonly -f' to be reused as
+ shell input, instead of the old
+
+ declare -f[flags] func()
+ {
+ foo
+ }
+
+ which has syntax errors. When in posix mode, `export -fp' and
+ `readonly -fp' still don't print function definitions
+
+ 2/16
+ ----
+parse.y
+ - comment out calls to discard_parser_constructs; no need to call
+ empty functions
+
+ 2/18
+ ----
+lib/sh/memset.c
+ - replacement function for memset(3)
+
+lib/sh/Makefile.in, Makefile.in
+ - additions for memset.c
+
+configure.in,config.h.in
+ - check for memset, define HAVE_MEMSET if found, add memset.o to
+ LIBOBJS if not
+
+lib/malloc/malloc.c
+ - removed zmemset(), replaced with calls to memset(3)
+
+{subst,execute_cmd,lib/sh/netopen}.c
+ - replaced calls to bzero with calls to memset
+
+subst.c
+ - word_split() now takes a second argument: the value of $IFS, so
+ it doesn't have to look up IFS every time
+ - word_list_split() now calls getifs() and passes the result to
+ each call to word_split() as its second arg
+ - do a quick scan for CTLNUL in remove_quoted_nulls before allocating
+ new string, copying old string to it, copying over original string
+ and freeing new string
+
+eval.c
+ - don't bother calling dispose_used_env_vars if temporary_env is NULL
+
+execute_cmd.c
+ - fix fix_assignment_words to only look up the builtin corresponding
+ to the first word if one of the words in the list is marked as
+ W_ASSIGNMENT
+
+hashlib.c
+ - renamed hash_string to hash_bucket, which better reflects what it
+ does
+ - extracted the portion of hash_bucket that computes the hash out
+ into a new hash_string()
+ - made new body of hash_bucket into a macro HASH_BUCKET; function
+ just calls the macro
+ - calls to hash_bucket in this file now call HASH_BUCKET macro
+ - in add_hash_item, just add a new item at the front of the appropriate
+ bucket list instead of at the end
+
+hashcmd.h
+ - reduced FILENAME_HASH_BUCKETS to 53 from 107
+
+ 2/19
+ ----
+hashlib.[ch]
+ - find_hash_item, remove_hash_item, add_hash_item all take a new
+ third `flags' argument
+ - add_hash_item doesn't call find_hash_item if HASH_NOSRCH passed in
+ flags arg
+ - find_hash_item will create a new hash table entry if HASH_CREATE is
+ passed in flags arg
+ - new function, hash_walk, takes a pointer to a function and a table
+ and calls the function for each item in the table. If the function
+ returns < 0, the walk is terminated
+ - fixed flush_hash_table to set table->nentries to 0 after freeing
+ all entries
+ - BUCKET_CONTENTS now has a new `khash' member, what key hashes to;
+ set by HASH_BUCKET macro (which calls hash_string), assigned in
+ find_hash_item (HASH_CREATE) and add_hash_item
+ - find_hash_item and remove_hash_item check `khash' against the
+ hash of the string argument before calling strcmp
+
+{alias,hashlib,hashcmd,pcomplib,variables}.c
+ - changed all calls to {find,remove,add}_hash_item
+
+builtins/hash.def
+ - return immediately from print_hashed_commands if there are no
+ entries in the hash table (this eliminates need for `any_printed'
+ variable)
+ - change print_hashed_commands to use hash_walk
+
+alias.c
+ - short-circuit all_aliases and map_over_aliases if
+ HASH_ENTRIES(aliases) == 0
+ - simplify map_over_aliases by just allocating enough room in the
+ returned list for all entries in the aliases hash table, instead
+ of doing the check and xrealloc
+ - add_alias now calls add_hash_item with HASH_NOSRCH argument
+
+pcomplete.h
+ - sh_csprint_func_t is no more; use hash_wfunc instead
+
+pcomplib.c
+ - short-circuit print_all_compspecs if HASH_ENTRIES(prog_completes)
+ is 0
+ - print_all_compspecs now takes a `hash_wfunc *' argument
+ - print_all_compspecs now just calls hash_walk
+
+builtins/complete.def
+ - new function, print_compitem, takes a BUCKET_CONTENTS *, extracts
+ the right info, and calls print_one_completion
+
+variables.c
+ - short-circuit map_over_funcs if HASH_ENTRIES(shell_functions) == 0
+ - short-circuit flatten if the passed table has no entries
+ - bind_variable_internal takes a new fourth argument: `hflags',
+ to pass to hash table functions
+ - make_new_variable now passes HASH_NOSRCH flag to add_hash_item
+ - set_if_not now calls bind_variable_internal and passes
+ HASH_NOSRCH as flags argument
+ - bind_function now calls add_hash_item with HASH_NOSRCH argument
+ - fixed make_local_variable: old_var == 0 && was_tmpvar can never
+ be true
+ - if we didn't find an old variable in make_local_variable, call
+ bind_variable_internal with HASH_NOSRCH argument
+ - fix push_temp_var to reset variable context to 0 if binding into
+ global_variables->table
+
+parse.y
+ - fix to parse_compound_assignment to avoid core dumps on empty
+ compound array assignments
+
+subst.c
+ - getifs() is now global so read_builtin can call it
+
+subst.h
+ - extern declaration for getifs()
+
+ 2/20
+ ----
+hashlib.c
+ - changed hash_string to use a better hash function
+ - changed HASH_BUCKET to use masking rather than modulus to hash a
+ string to a bucket -- HASH TABLES MUST NOW BE SIZED BY POWERS
+ OF TWO
+
+hashlib.h
+ - DEFAULT_HASH_BUCKETS is now 64
+
+hashcmd.h
+ - FILENAME_HASH_BUCKETS is now 64
+
+pcomplib.c
+ - COMPLETE_HASH_BUCKETS is now 32
+
+variables.c
+ - TEMPENV_HASH_BUCKETS is now 4
+
+alias.c
+ - new define, ALIAS_HASH_BUCKETS, set to 16, used to size alias table
+
+hashlib.c
+ - removed initialize_hash_table; folded code into make_hash_table
+ - fixed copy_bucket_array to copy the `khash' member of an item
+ - renamed functions to be more systematic and easier for me:
+ make_hash_table -> hash_create
+ hash_table_nentries -> hash_size
+ copy_hash_table -> hash_copy
+ find_hash_item -> hash_search
+ remove_hash_item -> hash_remove
+ add_hash_item -> hash_insert
+ flush_hash_table -> hash_flush
+ dispose_hash_table -> hash_dispose
+ print_table_stats -> hash_pstats
+ get_hash_bucket -> hash_items
+ - changed hash_search to short-circuit if table->nentries == 0 and
+ HASH_CREATE has not been passed in the flags argument
+
+{alias,variables,hashcmd,pcomplib}.c
+ - renamed calls to all renamed functions from hashlib.c
+
+builtins/kill.def
+ - don't drop a leading `-' in a pid argument
+ - call kill_pid with an explicit third argument of 1 if the pid
+ argument to kill is < -1, rather than rely on the behavior of
+ kill(2)
+
+ 2/21
+ ----
+subst.c
+ - quoted_strchr is no longer declared `inline'
+ - skip_double_quoted is no longer declared `inline'
+ - string_extract_double_quoted is no longer declared `inline'
+
+lib/readline/input.c
+ - rl_gather_tyi is now an `int' valued function; returns the number
+ of characters read (0 or 1) or -1 on error
+ - if rl_gather_tyi() returns -1 to rl_read_key(), set rl_done to 1
+ and return a newline; something is wrong with the input fd
+
+ 2/25
+ ----
+variables.[ch]
+ - IFS is now a special variable
+ - new special var function, sv_ifs(), called when IFS is set or unset
+ - call setifs() when IFS is first set in initialize_shell_variables
+ - call setifs() from make_local_variable and assign_in_env if
+ appropriate
+ - if assign_in_env() is called with a var assignment like `VAR=',
+ make the value in the new SHELL_VAR created be "" like
+ do_assignment_internal does, since certain parts of the shell use
+ a NULL value as evidence that the variable is unset (though
+ attributes may have been assigned)
+ - if push_temp_var pushes something up to the global_variables table,
+ make sure that the context is set to 0
+ - new function dispose_temporary_env, called by both
+ dispose_used_env_vars and merge_temporary_env with different `free
+ func' function pointers; calls sv_ifs after disposing the temporary
+ environment
+ - push_exported_var now calls bind_variable_internal instead of
+ bind_variable
+ - pop_scope and pop_context now call sv_ifs
+
+subst.[ch]
+ - new global variables used to keep track of IFS state, to avoid
+ having to call find_variable("IFS") all the time:
+
+ ifs_var the SHELL_VAR for IFS
+ ifs_value ifs_var ? value_cell (ifs_var) : " \t\n"
+ ifs_cmap bitmap of characters in ifs_value
+ ifs_firstc first character in ifs_value
+
+ - new function setifs(), sets the aforementioned ifs variables each
+ time IFS is set or unset, and at nested scope exit
+ - instead of calling getifs() from inside subst.c, use ifs_value
+ - getifs() now just returns ifs_value
+ - use ifs_firstc in string_list_dollar_star()
+ - only call member() in issep() if separators is more than one char
+ - don't cache a bitmap every time expand_word_internal() is called;
+ use ifs_cmap instead
+ - new macro, isifs(c), checks whether C is in ifs_cmap
+
+builtins/read.def
+ - use issep() and isifs() macros instead of looking at $IFS directly
+
+syntax.h
+ - make sure macros that access sh_syntaxtab cast the argument to
+ `unsigned char' before array access
+ - new macros: issyntype(c, type) and notsyntype(c, type), check
+ sh_syntaxtab[c] for a particular flag value `type'
+
+ 2/26
+ ----
+hashlib.h
+ - the `data' member of a `BUCKET_CONTENTS' is now a PTR_T
+
+{hashlib,alias,variables,hashcmd,pcomplib}.c
+ - removed some casts when assigning to and using `data' member of a
+ `BUCKET_CONTENTS'
+
+subst.c
+ - in split_at_delims, call make_word_list instead of allocating and
+ initializing a WORD_LIST * directly
+
+make_cmd.[ch]
+ - add_string_to_list is now just a macro that calls make_word_list
+ - make_simple_command now calls make_word_list instead of allocating
+ a WORD_LIST * directly
+
+ 2/27
+ ----
+copy_cmd.c
+ - copy_word now calls make_bare_word to allocate the copy
+ - copy_word_list now calls make_word_list to allocate the copy
+
+shell.h
+ - include `ocache.h' for simple object caching
+ - call cmd_init() to initialize the WORD_DESC and WORD_LIST object
+ caches
+
+{make,dispose}_cmd.c
+ - allocate WORD_DESC * and WORD_LIST * vars from their respective
+ ocaches, and return them to the cache when disposing
+
+jobs.c
+ - renamed old `waiting_for_job' variable to `queue_sigchld', which
+ better reflects its intent: sigchld_handler does not call waitchld
+ if `queue_sigchld' is non-zero, it simply increments the count of
+ waiting children
+ - cleanup_dead_jobs now just sets and clears queue_sigchld instead of
+ blocking and unblocking SIGCHLD; it calls waitchld at the end if
+ `sigchld' is non-zero, but that's not really necessary
+ - in setjstatus, only call xrealloc if `statsize' is less than the
+ number of processes passed -- no reason to do it if they're the
+ same
+
+ 2/28
+ ----
+sig.[ch]
+ - reinitialize_signals is no more; initialize_signals takes an
+ argument saying whether or not we are reinitializing
+
+builtins/exec.def
+ - reinitialize_signals() -> initialize_signals(1)
+
+test.c
+ - fix filecomp() to work right when one file has a non-positive
+ timestamp and the other file does not exist
+
+doc/{bash.1,bashref.texi}
+ - document what happens for test's -nt and -ot operators when one
+ file operand exists and the other does not
+
+jobs.c
+ - if we haven't messed with SIGTTOU, just manipulate queue_sigchld
+ in notify_of_job_status instead of calling sigprocmask()
+ - list_one_job now calls pretty_print_job directly instead of going
+ through print_job
+ - pretty_print_job now must be called with SIGCHLD blocked or held
+ instead of blocking SIGCHLD itself
+ - changed start_job so that it doesn't call UNBLOCK_CHILD and then
+ immediately call BLOCK_CHILD again (explicitly or via last_pid()),
+ call find_last_pid instead of last_pid and then UNBLOCK_CHILD
+ - changed wait_for_job the same way
+ - find_last_pid now takes a second argument: block; uses BLOCK_CHILD
+ if `block' is 1, not otherwise. Changed existing calls:
+ find_last_pid(j) -> find_last_pid(j, 0)
+ last_pid(j) -> find_last_pid(j, 1)
+ `last_pid()' is now gone
+ - rewrote wait_for_background_pids(); it was a little strange
+
+copy_cmd.c
+ - copy_if_command: don't copy null false_case commands
+ - copy_simple_command: don't copy a null redirection list
+
+subst.c
+ - in get_word_from_string and list_string, just check for " \t\n"
+ directly rather than calling strcmp
+ - in get_word_from_string and strip_trailing_ifs_whitespace, use
+ isifs() instead of issep(), since they're never called with
+ separators != $IFS
+ - change issep() to call isifs if separators is longer than one
+ character, since it's never called with anything but "", " ",
+ or $IFS
+
+ 3/1
+ ---
+sig.h
+ - enclose the BLOCK_SIGNAL macro in a do {...} while (0) loop, at it
+ should have been all along
+
+lib/readline/doc/rltech.texinfo
+ - document that readline defaults to stdin/stdout if rl_instream/
+ rl_outstream are NULL
+
+lib/readline/terminal.c
+ - if an application is using a custom redisplay function,
+ rl_resize_terminal just calls rl_forced_update_display to tell
+ (*rl_redisplay_func) to update the display, otherwise call
+ _rl_redisplay_after_sigwinch
+
+lib/readline/readline.c
+ - change readline_internal_setup() so the change to vi insertion mode
+ happens even if readline_echoing_p is 0
+ - don't print the prompt to rl_outstream in readline_internal_setup
+ if we're not echoing and the caller has defined a custom redisplay
+ function -- let the redisplay function deal with it
+
+configure.in
+ - new option: --enable-mem-scramble, controls memory scrambling on
+ free() (on by default; only affects use of bash malloc)
+
+config.h.in
+ - new option MEMSCRAMBLE, controlled by --enable-mem-scramble
+
+ 3/5
+ ---
+parse.y
+ - added ksh-like behavior of [...] to read_token_word: if a `[' is
+ seen in an assignment context and the previous characters in the
+ token form a valid identifier, parse the [...] with
+ parse_matched_pair to allow spaces (and newlines) in the subscript
+
+bashline.c
+ - new function bash_servicename_completion_function, for completing
+ service names from /etc/services
+
+bashline.h
+ - new extern declaration for bash_servicename_completion_function
+
+builtins/complete.def
+ - allow new `-s/-A service' option to complete and compgen builtins
+
+pcomplete.h
+ - new CA_SERVICE define, new ITEMLIST variable it_services
+
+pcomplete.c
+ - add callback to bash_servicename_completion_function to generate
+ list of matching service names for completion
+
+doc/bash.1,lib/readline/doc/rluser.texinfo
+ - documented new `-s/-A service' option to complete and compgen
+
+ 3/6
+ ---
+builtins/read.def
+ - change hard-coded `0' to new variable `fd' (initially 0) in
+ preparation for adding `-u fd' option
+
+bashline.c
+ - bash_directory_completion_hook calls expand_prompt_string instead
+ of expand_string (it does the right thing). This keeps expansion
+ errors from causing a longjmp, which shouldn't happen because of
+ completion
+ - command_subst_completion_function was augmented very slightly to
+ do filename completion on a non-command-word in a command
+ substitution
+ - command_subst_completion_function now skips over the lcd that
+ rl_completion_matches puts in matches[0] if there is more than
+ one possible completion
+
+ 3/7
+ ---
+builtins/read.def
+ - only add the unwind_protect to free `rlbuf' if `edit' is non-zero,
+ since we won't be using readline otherwise
+
+lib/sh/zread.c
+ - renamed zread1 -> zreadintr
+
+redir.c
+ - small change to redirection_error() to make a slightly better
+ guess about the invalid file descriptor if the redirection op is
+ r_duplicating_input or r_duplicating_output
+
+include/stdc.h
+ - new macro, SH_VA_START, to encapsulate the difference between
+ stdarg va_start and varargs va_start
+
+{error,pcomplete,print_cmd}.c,builtins/common.c,lib/sh/snprintf.c
+ - use SH_VA_START
+
+ 3/8
+ ---
+builtins/read.def
+ - support for the ksh-like `-u fd' option
+
+general.c
+ - new function sh_validfd(fd), returns 1 if fd is a valid open file
+ descriptor
+
+general.h
+ - extern decl for sh_validfd
+
+bashline.c
+ - don't call posix_readline_initialize() from initialize_readline();
+ sv_strict_posix() should already have taken care of it
+
+ 3/11
+ ----
+{error,pcomplete,print_cmd}.c, builtins/common.c
+ - removed non-varargs versions of functions
+
+builtins/printf.def
+ - if the string argument to %q has non-printing characters, call
+ ansic_quote to quote it rather than sh_backslash_quote
+
+variables.h
+ - new attribute: att_trace (and corresponding trace_p() macro).
+ Functions with this attribute will inherit the DEBUG trap.
+ Currently ignored for variables
+
+builtins/declare.def
+ - new `-t' option to declare/typeset toggle the `att_trace' attribute
+
+builtins/setattr.def
+ - check for att_trace and output `-t' flag in show_var_attributes
+
+execute_cmd.c
+ - if a function is being traced (it has the `-t' attribute set),
+ don't turn off the DEBUG trap when it executes
+
+doc/{bash.1,bashref.texi}
+ - document the new `-t' option to declare/typeset
+
+ 3/12
+ ----
+execute_cmd.c
+ - don't execute the debug trap in the `cm_simple:' case of
+ execute_command_internal; run it in execute_simple_command so we
+ get the line number information right when executing in a shell
+ function
+ - run a DEBUG trap before executing ((...)) arithmetic commands,
+ like ksh93
+ - run a DEBUG trap before executing [[...]] conditional commands,
+ like ksh93
+
+eval.c
+ - add a static forward declaration for alrm_catcher()
+
+general.c
+ - add static forward declarations for bash_special_tilde_expansions,
+ unquoted_tilde_word, initialize_group_array
+
+variables.h
+ - add extern declarations for sh_get_env_value, map_over_funcs,
+ local_exported_variables
+
+variables.c
+ - add static forward declarations for dispose_temporary_env,
+ make_func_export_array
+
+bashhist.c
+ - add static forward declaration for check_history_control
+
+configure.in
+ - add a call to AC_CHECK_DECLS for strcpy
+
+config.h.in
+ - add placeholder for HAVE_DECL_STRCPY define, set by configure
+
+general.h
+ - don't declare strcpy if HAVE_DECL_STRCPY is defined with a non-zero
+ value
+
+sig.h
+ - add prototype to typedef of SigHandler
+
+lib/readline/histlib.h
+ - removed extern declaration of strcpy()
+ - include string.h/strings.h directly in histlib.h instead of source
+ files
+
+lib/readline/{histexpand,histfile,history,histsearch}.c
+ - don't include string.h/strings.h now that histlib.h includes it
+
+lib/tilde/tilde.c
+ - removed extern declaration of strcpy(), rely on string.h/strings.h
+
+command.h
+ - four new redirection types: r_move_input, r_move_output,
+ r_move_input_word, r_move_output_word, for
+ [N]<&word- and [N]>&word- from ksh93
+
+print_cmd.c
+ - changes to print r_move_input[_word] and r_move_output[_word]
+
+copy_cmd.c
+ - changes to copy r_move_input[_word] and r_move_output[_word]
+
+dispose_cmd.c
+ - changes to dispose r_move_input_word and r_move_output_word
+
+make_cmd.c
+ - changes to make r_move_input[_word] and r_move_output[_word] from
+ r_duplicating_{input,output}_word, which is how the new redirs
+ are passed by the parser
+
+redir.c
+ - changes to make r_move_input[_word] and r_move_output[_word] do
+ the right thing when executed
+
+builtins/read.def
+ - print an error message and return failure immediately if zread/zreadc
+ return < 0
+
+doc/{bash.1,bashref.texi}
+ - documented new [n]<&word- and [n]>&word- redirections
+
+ 3/13
+ ----
+lib/readline/isearch.c
+ - enabled code to allow chars bound to rl_rubout to delete characters
+ from the incremental search string
+
+shell.c
+ - add `-l' invocation option to parse_shell_options; equivalent to
+ `--login'
+ - fixed set_login_shell to check first char of base pathname of argv0
+ for `-', like other shells
+ - move the check for make_login_shell after the call to
+ parse_shell_options because the `-l' option might set it
+
+doc/{bash.1,bashref.texi}
+ - documented new `-l' invocation option
+
+array.c
+ - new function, array_shift, shifts an array left by a specified
+ number of elements
+ - array_walk is now compiled in by default
+ - array_to_assignment_string now takes a second argument: int quoted.
+ If non-zero, the result is single-quoted before being returned
+ - quoted_array_assignment_string has been removed
+
+array.[ch]
+ - renamed most of the array functions so that all have an array_
+ prefix and are more systematically named
+ - array_slice now preserves the indicies from the original array
+ - change array_to_assign to use a static buffer for expanding the
+ array indices, instead of malloc/free
+
+{arrayfunc,subst,variables}.c, builtins/read.def
+ - changed calls to various array functions to use new names
+
+lib/sh/stringvec.c, externs.h
+ - renamed all of the functions to have a strvec_ prefix and to have
+ a more sensible name scheme
+ - strvec_search's arguments are now supplied in reverse order, so
+ the char **array is first, like the other functions
+ - new function, strvec_resize, xrealloc for strvecs
+
+{alias,array,bracecomp,braces,bashline,execute_cmd,findcmd,general,pathexp,
+pcomplete,variables}.c
+lib/sh/stringlist.c
+builtins/{bind,complete,exec,getopts,pushd,set}.def
+ - change calls to all functions from lib/sh/stringvec.c
+ - use strvec_resize where appropriate
+
+externs.h
+ - only declare dup2() if HAVE_DUP2 is undefined or DUP2_BROKEN is
+ defined
+
+lib/readline/{macro,readline,util}.c, lib/readline/rlprivate.h
+ - _rl_defining_kbd_macro is gone, use RL_ISSTATE(RL_STATE_MACRODEF)
+
+lib/readline/readline.h
+ - new struct readline_state, encapsulates most of readline's internal
+ state in case you need reentrancy or nested calls to readline()
+ - extern declarations for rl_save_state, rl_restore_state
+
+lib/readline/readline.c
+ - add (undocumented) int rl_save_state (struct readline_state *),
+ int rl_restore_state (struct readline_state *)
+
+ 3/14
+ ----
+array.[ch]
+ - new function, array_rshift, shifts an array right by a specified
+ number of elements, optionally inserting a new element 0
+
+examples/bashdb/bashdb
+ - new single-file version of bash debugger, originally modified from
+ version in bash-2.04 by Gary Vaughan (the old debugger still
+ appears in examples/obashdb). This version has a more gdb-like
+ command set
+
+examples/bashdb/bashdb.el
+ - new emacs bashdb debugger mode from Masatake YAMATO <jet@gyve.org>
+
+execute_cmd.c
+ - don't make $LINENO relative to function start unless the shell is
+ currently interactive -- this is what ksh93 does and what I
+ believe to be the intent of POSIX.2 (this required changing some
+ of the test checks because the output has changed)
+ - run the debug trap for each command in an arithmetic for expression,
+ like ksh93 does
+
+lib/readline/vi_mode.c
+ - redid rl_vi_subst (binding func for `s' and `S') in terms of
+ rl_vi_change_to: `S' == `cc' and `s' == `c '. This makes undo
+ work right
+
+ 3/18
+ ----
+hashlib.c
+ - fixed hash_walk to return if the item function returns < 0, instead
+ of breaking out of the current hash chain
+
+array.c
+ - fixed array_walk to return if the item function returns < 0, like
+ hash_walk
+
+lib/sh/stringlist.c, externs.h
+ - new function: strlist_walk, takes a stringlist and a pointer to an
+ item func. Like other _walk funcs, if item func returns < 0 the
+ walk is cancelled
+ - new function: strlist_flush, frees items in the contained list
+ with strvec_flush
+ - renamed functions to have a strlist_ prefix and be more systematic
+
+pcomplib.c,pcomplete.h
+ - removed redundant `progcomp_initialized' variable
+ - renamed functions to have `progcomp_' or `compspec_' prefixes
+ like the hash library
+
+{bashline,pcomplete}.c,builtins/complete.def
+ - fixed calls to stringlist functions to use new names
+ - fixed calls to functions in pcomplib.c to use new names
+
+pcomplete.c
+ - made the debugging code #ifdef DEBUG -- it should be mature enough
+
+builtins/hash.def,parse.y
+ - use REVERSE_LIST(x, t) instead of (t)reverse_list(x)
+
+list.c,{externs,general}.h
+ - renamed the list functions to have a list_ prefix, changed callers
+
+externs.h,{execute_cmd,stringlib,subst}.c,builtins/common.c,lib/sh/stringvec.c
+ - word_list_to_argv -> strvec_from_word_list
+ - argv_to_word_list -> strvec_to_word_list
+ - moved functions to lib/sh/stringvec.c
+
+lib/sh/stringvec.c
+ - changed name of second argument to strvec_from_word_list from `copy'
+ to `alloc' so the use of `copy' between strvec_from_word_list and
+ strvec_to_word_list isn't as confusing
+ - changed name and sense of second argument to
+ strvec_to_word_list from `copy' to `alloc' for the same reason --
+ now both functions agree on semantics of second argument
+
+lib/sh/stringlist.c
+ - ditto for strlist_from_word_list and strlist_to_word_list
+
+subst.c
+ - changed callers of strvec_to_word_list
+
+ 3/19
+ ----
+builtins/hash.def
+ - added `-l' option to list table or individual targets in reusable
+ format
+ - added `-d' option to remove one or more names from the table of
+ hashed commands (provides `unhash' or `unalias -t' functionality)
+
+doc/{bash.1,bashref.texi}
+ - documented new `-l' and `-d' options to `hash'
+
+hashcmd.[ch]
+ - renamed functions to have a `phash_' prefix and follow new naming
+ convention
+ - phash_remove now returns an int: 1 if command not in hash table,
+ 0 if filename removed OK
+
+{findcmd,variables}.c, builtins/{hash,type}.def
+ - changed callers to use new names from hashcmd.c
+
+builtins/common.[ch]
+ - new function, sh_notfound(s), prints standard `not found' message
+ - new function, sh_invalidid(s), prints standard `invalid identifier'
+ message
+ - new function, sh_restricted(s), prints standard `restricted' message
+ for restricted shells
+ - new function, sh_invalidnum(s), prints standard `invalid number'
+ message
+ - renamed bad_option to sh_invalidopt, changed to print
+ `invalid option' instead of `unknown option'
+ - new function, sh_invalidoptname, prints standard `invalid option
+ name' for long options
+ - new function, sh_badjob (s), prints standard `no such job' message
+ - new function, sh_invalidsig (s), prints standard `invalid signal
+ specification' message
+ - new function, sh_nojobs (s), prints standard `no job control' message
+ - new function, sh_needarg (s), prints standard `option requires an
+ argument' message
+ - new function, sh_neednumarg (s), prints standard `numeric
+ argument required' message
+ - new function, sh_badpid(s), prints standard `not a pid...' message
+ - new function, sh_erange (s, desc) prints standard `out of range'
+ message, optionally using `desc' to say what the argument is
+
+builtins/{alias,command,declare,exec,hash,type}.def
+ - call sh_notfound() instead of calling builtin_error directly
+
+builtins/{declare,getopts,read,set,setattr}.def
+ - call sh_invalidid() instead of calling builtin_error directly
+
+builtins/{cd,command,enable,exec,hash,source}.def
+ - call sh_restricted() instead of calling builtin_error directly
+
+builtins/{printf,read,ulimit}.def, builtins/common.c
+ - call sh_invalidnum instead of calling builtin_error directly
+
+builtins/{complete,declare,pushd,set}.def, builtins/bashgetopt.c
+ - call sh_invalidopt instead of bad_option or builtin_error directly
+
+builtins/{complete,set,shopt}.def
+ - call sh_invalidoptname instead of builtin_error directly
+
+builtins/{fg_bg,jobs,kill,wait}.def
+ - call sh_badjob instead of calling builtin_error directly
+
+builtins/common.c, builtins/{kill,signal}.def
+ - call sh_invalidsig instead of calling builtin_error directly
+
+builtins/{fg_bg,suspend,wait}.def
+ - call sh_nojobs instead of calling builtin_error directly
+
+builtins/{common,bashgetopt}.c, builtins/{hash,kill}.def
+ - call sh_neednumarg and sh_needarg where required
+
+builtins/{kill,wait}.def
+ - call sh_badpid where required
+
+builtins/{break,fc,history,pushd,shift,ulimit,umask}.def
+ - call sh_erange where appropriate
+
+builtins/printf.def
+ - new static function, printf_erange, prints standard out-of-range
+ warning message
+
+builtins/set.def
+ - changed so that calls to sh_invalidopt always include the leading
+ `+' or `-'
+
+builtins/shopt.def
+ - changed SHOPT_ERROR macro to shopt_error function
+
+builtins/bind.def
+ - regularized error messages to `bind: object: error string' like
+ other error messages
+
+builtins.h
+ - the `short_doc' member of a `struct builtin' is now of type
+ `const char *'
+ - the strings in `long_doc' array of a struct builtin are now const
+
+builtins/mkbuiltins.c
+ - changes for new `const' members of struct builtin
+
+ 3/20
+ ----
+lib/readline/histfile.c
+ - use pointers instead of indexing into buffer when reading the
+ contents of the history file in read_history_range and
+ history_truncate_file
+
+ 3/21
+ ----
+lib/readline/histfile.c
+ - new file, with code to mmap the history file for reading and
+ writing (depends on HAVE_MMAP, currently nothing checks for that)
+
+ 3/25
+ ----
+error.[ch]
+ - new function, err_badarraysub(s), calls report_error with standard
+ `bad array subscript' message
+ - new function, err_unboundvar(s), calls report_error with standard
+ `unbound variable' message
+ - new function, err_readonly(s), calls report_error with standard
+ `readonly variable' message
+
+{arrayfunc,subst}.c
+ - call err_badarraysub where appropriate
+
+{expr,subst}.c
+ - call err_unboundvar where appropriate
+
+{arrayfunc,variables}.c
+ - call err_readonly where appropriate
+
+shell.c
+ - changed text of bad option error messages to be the same as that
+ printed for builtin errors
+
+builtins/common.c
+ - changed sh_invalidopt to print the invalid option before the rest
+ of the error message (required some tests to be modified)
+ - new function, sh_readonly, calls builtin_error with standard
+ `readonly variable' message
+
+variables.c,builtins/declare.def
+ - call sh_readonly where appropriate
+
+lib/sh/stringvec.c
+ - added strvec_remove (sv, s), removes S from SV and shuffles rest of
+ elements down 1
+
+lib/sh/stringlist.c
+ - added strlist_remove(sl, s), just calls strvec_remove on the
+ component list
+
+externs.h
+ - new extern declarations for strvec_remove and strlist_remove
+ - fixed extern declaration for strvec_search; the arguments were
+ reversed (unimportant, it's not compiled into the shell)
+
+subst.c
+ - change param_expand to call quote_escapes on values retrieved when
+ expanding the positional parameters
+ - change parameter_brace_expand_word to quote escapes on values
+ retrieved when expanding the positional parameters
+ - fix parameter_brace_substring to quote escape characters on unquoted
+ substrings extracted from variable values (needed to separate case
+ VT_VARIABLE from VT_ARRAYMEMBER for this, since, because
+ get_var_and_type calls array_value for VT_ARRAYMEMBER, we need to
+ skip over quoted characters in an already-appropriately-quoted
+ string to find the substring we want)
+ - fix parameter_brace_substring to quote escape characters in the
+ value returned by pos_params when expanding subsets of the
+ positional parameters and not within double quotes (in which case
+ pos_params() quotes the string for us)
+ - fix parameter_brace_substring to quote escape characters in the
+ value returned by array_subrange when expanding subsets of an
+ array and not within double quotes (in which case
+ array_subrange() quotes the string for us)
+ - new function, quoted_strlen(s), does strlen(s) while skipping over
+ characters quoted with CTLESC (#ifdef INCLUDE_UNUSED, since it's
+ not used yet)
+ - changed pos_params() so it always returns a list whose members are
+ quoted strings if (quoted&(Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) != 0
+
+arrayfunc.c
+ - fix array_value to consistently call quote_escapes, even when a
+ non-array variable is being subscripted with element 0, in which
+ case we return the variable value
+
+lib/sh/strtrans.c
+ - make the for_echo parameter to ansicstr a `flags' parameter that
+ has its old `for echo' meaning if flags&1 is non-zero (which is
+ consistent with the old code)
+ - Added code to the `flags' parameter to ansicstr so that if flags&2
+ is non-zero, CTLESC and CTLNUL are escaped with CTLESC in the
+ expanded string
+ - change ansiexpand() to call ansicstr with a `flags' parameter of 2
+
+ 3/26
+ ----
+lib/readline/histfile.c
+ - when reading and writing the history file, use malloc instead of
+ xmalloc and handle failures gracefully, so the application doesn't
+ abort if the history file or history list is too big
+
+ 3/27
+ ----
+arrayfunc.c
+ - changed array_value_internal to take an additional `int *'
+ parameter, in which is returned the type of array indexing
+ performed (array[@] vs. array or array[index])
+ - changed array_value and get_array_value to take a corresponding
+ extra parameter and pass it to array_value_internal
+ - changed array_value_internal to no longer return newly-allocated
+ memory or quote CTLESC and CTLNUL in the returned string if
+ `simple' array indexing (subscript not `@' or `*') is being
+ performed. This makes it more like a variable lookup
+
+arrayfunc.h
+ - changed prototypes for array_value and get_array_value
+
+expr.c
+ - added new parameter to call to get_array_value in expr_streval
+ - don't need to free memory returned by get_array_value any more
+
+subst.c
+ - quote_escapes now works with multibyte characters
+ - dequote_string now works with multibyte characters
+ - dequote_escapes is now needed, so it's compiled in, and it
+ now works with multibyte characters
+ - remove_quoted_escapes now just calls dequote_escapes and copies the
+ result over the argument string
+ - remove_quoted_nulls now returns its char * argument, parallels
+ remove_quoted_escapes
+ - parameter_brace_expand_word now passes the new argument to
+ array_value and quotes CTLESC and CTLNUL in the result if it's a
+ `simple' array expansion by calling quote_escapes
+ - get_var_and_type now returns VT_ARRAYMEMBER for references like
+ ${array} where `array' is an array variable (just like ${array[0]}).
+ Documented (in comment) that a VT_VARIABLE return value means that
+ quote_escapes has been called at some point
+ - changed callers of get_var_and_type to no longer free value if
+ VT_ARRAYMEMBER is returned as type
+ - changed parameter_brace_substring and parameter_brace_patsub to
+ call dequote_escapes on the value from get_var_and_type if the
+ type is VT_VARIABLE, since the substring and pattern substitution
+ code doesn't understand CTLESC quoting
+ - parameter_brace_substring no longer needs to call quoted_substring
+ for the VT_ARRAYMEMBER case
+ - changed parameter_brace_patsub to call quote_escapes on the result
+ of pat_subst for the VT_VARIABLE and VT_ARRAYMEMBER cases, and to
+ quote the returned string in the VT_ARRAYVAR and VT_POSPARAMS cases
+ if the `MATCH_QUOTED' flag isn't set (if it is, the pattern
+ substitution functions perform any necessary quoting)
+ - quoted_substring is no longer used; it's now #ifdef INCLUDE_UNUSED
+
+lib/malloc/mstats.h
+ - new member in _malstats: u_bits32_t bytesreq, the total number of
+ bytes requested by the caller via calls to malloc() and realloc()
+
+lib/malloc/stats.c
+ - print bytesreq member in _print_malloc_stats
+ - don't print statistics for buckets for which nmal == 0 (no mallocs)
+
+lib/malloc/malloc.c
+ - modified internal_malloc, internal_realloc to keep running total of
+ number of bytes requested by calling application
+
+shell.c
+ - sh_exit is now compiled in; exit_shell calls sh_exit
+
+error.c
+ - changed fatal_error, report_error, parser_error to call sh_exit
+
+ 3/28
+ ----
+subst.[ch]
+ - changed Q_NOQUOTE to Q_PATQUOTE; it makes the intent more clear
+
+subst.c
+ - moved code from parameter_brace_expand into a new function that
+ dispatches for pattern substitution: parameter_brace_remove_pattern
+ - changed structure of parameter_brace_remove_pattern to be like
+ parameter_brace_patsub and its ilk: call get_var_and_type to
+ isolate the variable name, move the pattern isolation code out of
+ the various *_remove_pattern functions into
+ parameter_brace_remove_pattern and pass the results to the various
+ functions, use a switch on the return value from get_var_and_type
+ to decide which function to call, regularized the arguments to the
+ separate pattern removal functions
+ - parameter_brace_remove_pattern now properly quotes escape chars in
+ the returned value
+ - changed get_var_and_type to call dequote_escapes on the `value'
+ parameter for case VT_VARIABLE and return the result in *valp,
+ so the calling functions don't have to do it themselves; changed
+ callers appropriately
+ - fixed getpattern() where it broke posix compliance: if you enclose
+ a pattern removal spec in double quotes, the outer double quotes
+ have no effect on the pattern (POSIX.1-200x 2.6.2). This uncovered
+ a bug in the test suite (!)
+
+pathexp.c
+ - fixed a problem with quote_string_for_globbing where it would change
+ consecutive CTLESC chars all to \ instead of changing every other
+ quoted char
+
+ 3/31
+ ----
+lib/malloc/{malloc,stats}.c
+ - moved declaration of _mstats to malloc.c so stats.o doesn't get
+ linked into the shell if the stats functions aren't called
+
+ 4/2
+ ---
+lib/glob/smatch.c
+ - introduce `XCHAR' define, which is the type of arguments passed to
+ strcoll/strcmp/strlen and their wide-character equivalents, added
+ appropriate casts
+ - static arrays in single-byte version of rangecmp() are `char', not
+ `unsigned char', so compilers don't complain about calls to strcoll
+
+lib/glob/sm_loop.c
+ - casts for `XCHAR' and `XCHAR *' arguments to libc functions
+ - use prototype declaration for BRACKMATCH if `PROTOTYPES' is defined
+ to avoid problems with type promotion (unsigned char -> int)
+
+lib/glob/collsyms.h
+ - `name' member of struct _COLLSYM is now of type `XCHAR *', since
+ some compilers don't like `unsigned char *' initializers from
+ constant strings
+
+[bash-2.05b-alpha1 released]
+
+ 4/3
+ ---
+builtins/{evalstring.c,common.h}
+ - new flag for parse_and_execute, SEVAL_NOFREE, means to not free
+ the argument string when finished
+
+lib/readline/text.c
+ - fixed a trivial typo in _rl_insert_char when reading multibyte
+ char sequences
+ - replace calls to ding() with rl_ding()
+
+include/chartypes.h
+ - remove SIGN_EXTEND_CHAR and TOASCII macros; they're unused
+
+make_cmd.c
+ - include dispose_cmd.h for extern function declarations
+
+lib/glob/glob.c
+ - include `shmbutil.h' and `xmalloc.h' for extern function declarations
+
+lib/glob/smatch.c
+ - include `xmalloc.h' for extern function declarations
+
+shell.c
+ - fix maybe_make_restricted to use its argument instead of global
+ `shell_name'
+
+version.c
+ - update copyright message to include this year
+
+lib/readline/display.c
+ - fixes from Jiro SEKIBA <jir@yamato.ibm.com> to fix autowrapping
+ when using multibyte characters
+
+lib/glob/sm_loop.c
+ - fixed a problem in BRACKMATCH where not enough memory was allocated
+ to hold a multibyte character when parsing POSIX.2 char class names
+
+support/config.{guess,sub}
+ - updated via patch from Paul Eggert with latest GNU additions
+
+variables.c
+ - var_lookup should use its `vcontext' argument instead of
+ unconditionally using `shell_variables'
+
+ 4/4
+ ---
+builtins/bind.def,doc/{bash.1,bashref.texi}
+ - changed the usage summary and help text to make it clear that any
+ readline command that may appear in ~/.inputrc may be supplied as
+ one of the non-option arguments to `bind'
+
+builtins/mkbuiltins.c
+ - added support for `-H' option, which means to write long documentation
+ for each builtin to a separate file in the `helpfiles' directory
+
+builtins/Makefile.in
+ - new target `helpdoc', just creates long doc files in helpfiles
+ directory
+
+lib/sh/zcatfd.c
+ - new file, with zcatfd(int fd, int ofd, char *fn); dumps data from
+ FD to OFD
+
+Makefile.in,lib/sh/Makefile.in
+ - added zcatfd.c, zcatfd.o member of libsh.a
+
+builtins/evalstring.c
+ - changed cat_file to call zcatfd(fd, 1, fn)
+
+builtins/{shopt,colon}.def
+ - removed the $DOCNAME directive for `shopt', `true', and `false';
+ just use the names
+ - changed $DOCNAME for `:' to just be `colon' instead of
+ `colon_builtin'
+
+builtins/reserved.def
+ - added help entries for ((, [[, `for (('
+
+builtins/let.def
+ - add id++, id--, ++id, --id, ** to help text
+
+ 4/8
+ ---
+builtins/bashgetopt.[ch]
+ - changed to allow options beginning with `+', enabled by a leading
+ `+' in the option string
+ - new variable, list_opttype, set to `-' or `+'
+
+builtins/{common.c,{builtin,eval,exit,fg_bg,let,printf,pushd,return,source,wait}.def
+ - changes to allow a `--' option for every builtin that accepts
+ operands but not options, as per posix.1-2001
+
+builtins/{declare,setattr}.def
+ - use internal_getopt for parsing options, now that it supports `+'
+
+builtins/set.def
+ - use internal_getopt for initial option parse, now that it supports
+ a leading `+'
+
+
+{configure,Makefile}.in, builtins/{Makefile.in,help.def,mkbuiltins.c}
+ - support for a new configure option, ``--enable-separate-helpfiles'',
+ moves the `long' help text to separate help files, installed by
+ default into ${datadir}/bash, one file per builtin. Off by
+ default -- it saves 47K, but it's only 47K, and it's in the text
+ segment
+
+flags.c
+ - build internal_getopt() option string argument from flags array at
+ runtime in shell.c
+
+shell.c
+ - new variable to control writing malloc stats at exit:
+ malloc_trace_at_exit, 0 by default
+
+lib/malloc/malloc.c
+ - heavily updated:
+ o partial page allocated on first call to malloc to make
+ subsequent sbrks page-aligned no longer wasted
+ o begin and end range guards are now the same value: the chunk
+ requested
+ o coalescing code was changed to attempt to coalesce first two
+ adjacent blocks on the free list; enabled by default
+ o blocks of size 32 are now candidates for larger block
+ splitting, since 32 is the most popular size
+ o blocks of size 32 are now candidates for smaller block
+ coalescing
+ o the IN_BUCKET check was changed to just make sure that the
+ size isn't too big for the bucket, since the `busy block'
+ checking code may increase the bucket by one or more,
+ meaning that the old check would fail and cause a panic when
+ a chunk allocated in such a way was freed
+ o bin sizes are now precomputed and looked up in an array
+ rather than being computed at runtime
+ o moved the _mstats declaration here to avoid the stats code
+ being linked in even when no stats functions were called
+ (only matters if MALLOC_DEBUG is defined)
+ o malloc now keeps track of the address of the top of the heap
+ and will return large chunks to the system with calls to
+ sbrk with a negative argument when freeing the top chunk.
+ Two thresholds: LESSCORE_FRC means to unconditionally return
+ memory to the system; LESSCORE_MIN means to return memory if
+ there's at least one block already on the free list
+
+lib/malloc/mstats.h
+ - stats struct now keeps track of number of block coalesces by bin,
+ and the number of times memory was returned to the system by bin
+
+lib/malloc/stats.c
+ - trace_malloc_stats now takes a second argument: the name of the file
+ to write to. The first `%p' in the template file name is replaced
+ by the pid
+
+ 4/9
+ ---
+lib/malloc/imalloc.h
+ - added some macros derived from dlmalloc and glibc malloc to inline
+ memcpy and memset if the requested size is <= 32 bytes
+
+lib/malloc/malloc.c
+ - use MALLOC_MEMSET instead of memset in internal_{malloc,free}
+
+include/ocache.h
+ - use OC_MEMSET (variant of MALLOC_MEMSET) in ocache_free
+
+configure.in, config.h.in
+ - check for getservent(), define HAVE_GETSERVENT if found
+
+bashline.c
+ - punt immediately from bash_servicename_completion_function if
+ HAVE_GETSERVENT is not defined (cygwin seems to not define it)
+ - include "input.h" for extern save_token_state() and
+ restore_token_state() declarations
+ - change bash_execute_unix_command to call parse_and_execute with
+ SEVAL_NOHIST flag so the command doesn't get saved on the history
+ list
+ - change bash_execute_unix_command to save and restore the current
+ command line count and the token state (last_read_token, etc.).
+ Everything else is saved by either parse_and_execute directly or
+ the call it makes to push_stream(). The shell_input_line stuff
+ doesn't need to be saved and restored; it's not computed until
+ readline() returns
+
+ 4/10
+ ----
+lib/glob/glob.[ch]
+ - glob_filename and glob_vector now take an additional `flags' arg
+ - define GX_MARKDIRS as possible flag value for glob_filename and
+ glob_vector
+
+lib/sh/snprintf.c
+ - fixed some bugs with handling of `g' and `G' formats
+ - make sure numtoa returns the fractional part correctly when passed 0
+ - implemented thousands grouping for `'' flag character
+
+lib/sh/rename.c
+ - a few changes to make it more bulletproof
+
+ 4/11
+ ----
+lib/glob/glob.c
+ - added the couple of dozen lines of code to glob_dir_to_array to
+ finish implementing GX_MARKDIRS
+
+builtins/set.def
+ - changed unset builtin so that it no longer considers unsetting an
+ unset variable or function to be an error
+
+lib/readline/display.c
+ - fix to rl_redisplay for a problem which caused display to be messed
+ up when the last line of a multi-line prompt (possibly containing
+ invisible characters) was longer than the screen width
+
+ 4/15
+ ----
+aclocal.m4
+ - use AC_DEFINE_UNQUOTED in BASH_SYS_DEFAULT_MAIL_DIR instead of
+ enumerating all of the possible values and using AC_DEFINE
+
+ 4/16
+ ----
+Makefile.in, {builtins,support}/Makefile.in
+ - new variables, CFLAGS_FOR_BUILD and CPPFLAGS_FOR_BUILD, substituted
+ by `configure'
+ - changed CCFLAGS_FOR_BUILD to BASE_CCFLAGS, removing $(CPPFLAGS);
+ CCFLAGS and CCFLAGS_FOR_BUILD now include $(BASE_CCFLAGS) with
+ (possibly) different values for CPPFLAGS and CFLAGS
+ - GCC_LINT_CFLAGS now includes $(BASE_CCFLAGS) and $(CPPFLAGS)
+ instead of CCFLAGS_FOR_BUILD
+ - new variable, LDFLAGS_FOR_BUILD, right now equivalent to LDFLAGS
+ - remove $(CPPFLAGS) from recipes for buildversion, mksignames, and
+ mksyntax
+
+configure.in
+ - compute and substitute CFLAGS_FOR_BUILD, CPPFLAGS_FOR_BUILD, and
+ LDFLAGS_FOR_BUILD
+ - changed qnx to use LOCAL_LDFLAGS and LOCAL_LIBS instead of putting
+ everything in LOCAL_LDFLAGS
+
+builtins/Makefile.in
+ - remove $(PROFILE_FLAGS) from recipe for building `mkbuiltins'
+ - use LDFLAGS_FOR_BUILD instead of LDFLAGS in recipe for building
+ `mkbuiltins'
+
+Makefile.in
+ - use $(CC_FOR_BUILD) and $(CCFLAGS_FOR_BUILD) to build auxiliary
+ test programs (printenv, recho, zecho)
+
+support/Makefile.in
+ - use CC_FOR_BUILD and CCFLAGS_FOR_BUILD in recipe for building
+ `man2html'
+
+lib/tilde/Makefile.in
+ - substitute PROFILE_FLAGS, use PROFILE_FLAGS in $(CCFLAGS)
+
+ 4/25
+ ----
+Makefile.in, configure.in
+ - moved RELSTATUS to configure.in; configure substitutes it into
+ the generated Makefile
+
+lib/sh/snprintf.c
+ - fix wchars() to deal with systems where MB_CUR_MAX is not a
+ constant expression
+
+ 5/2
+ ---
+lib/sh/shquote.c
+ - add `,' to list of chars that are backslash-quoted. It doesn't
+ hurt normal usage and prevents filenames with commas from being
+ inappropriately split by brace expansion after using
+ complete-into-braces
+
+ 5/6
+ ---
+lib/sh/xstrchr.c
+ - we only need the check of MB_CUR_MAX and the slow code for a
+ few encodings, and even then only for a subset of the charset
+
+arrayfunc.c
+ - some speedups for skipsubscript and multibyte chars from Bruno Haible
+
+locale.c
+ - changed set_lang to call setlocale(LC_ALL, ...) if LC_ALL doesn't
+ already have a value, but doesn't change any shell variables
+
+include/shmbutil.h
+ - major speedups from Bruno Haible, mostly concerned with reducing
+ the number of strlen(3) calls
+
+subst.c
+ - change callers of macros in shmbutil.h to add extra argument as
+ necessary
+ - skip_single_quoted and skip_double_quoted take another argument:
+ the length of the string; mostly useful when using multibyte chars
+ - many speedups from precomputing string lengths at function start
+ - fixed a small bug in de_backslash in the midst of rewriting for
+ better efficiency
+
+{braces,make_cmd,pathexp}.c
+ - change callers of macros in shmbutil.h to add extra argument as
+ necessary
+
+pathexp.c
+ - fix a one-too-far problem with multibyte chars in
+ unquoted_glob_pattern_p
+
+braces.c
+ - brace_gobbler takes a new argument, the length of the passed string
+ - expand_amble takes a new argument, the length of the passed string
+
+ 5/7
+ ---
+subst.c
+ - modified remove_quoted_nulls to eliminate the memory allocation and
+ do the copy in place using the same strategy as de_backslash
+
+lib/readline/{rldefs.h,complete.c}
+ - new define RL_QF_OTHER_QUOTE, so _rl_find_completion_word can note
+ that it found a quoting character other than \'" that appears in
+ rl_completer_quote_characters
+
+ 5/9
+ ---
+jobs.c
+ - save and restore old value of jobs_list_frozen when calling trap
+ handlers from set_job_status_and_cleanup to avoid seg faults when
+ running recursive trap handlers
+
+ 5/10
+ ----
+builtins/common.h
+ - new #defines to use for value of changed_dollar_vars (provides
+ information about the caller who wants to blow away the old dollar
+ variables)
+
+builtins/common.c
+ - changed set_dollar_vars_changed to set changed_dollar_vars to one
+ of the ARGS_* values depending on the caller and environment
+
+builtins/source.def
+ - source restores the positional parameters unless the `set' builtin
+ was called to specify a new set while not executing a shell function
+
+ 5/13
+ ----
+POSIX
+ - new file, was in CWRU/POSIX.NOTES
+
+doc/{Makefile.in,Makefile}
+ - changed `posix' rule to modify ../POSIX
+
+doc/mkposix
+ - write to `POSIX' by default
+
+lib/sh/strtrans.c
+ - when ansicstr is parsing a format string for `echo -e' (or the
+ equivalent xpg_echo option is enabled), obey the POSIX-2001/SUSv3
+ standard and accept 0-3 octal digits after a leading `0'
+
+doc/{bash.1,bashref.texi}
+ - updated `echo' description to note that up to three octal digits
+ are now accepted following `\0'
+
+ 5/16
+ ----
+doc/Makefile.in
+ - remove the generated documentation on `make distclean' if the
+ build directory and source directory are not the same
+
+Makefile.in
+ - descend into `support' subdirectory on a `make clean' and
+ `make distclean'
+ - remove parser-built, y.tab[ch] on a `make distclean' if the build
+ directory and source directory are not the same
+
+support/Makefile.in
+ - support various `clean' targets and remove man2html.o and man2html
+
+{configure,Makefile}.in
+ - move values for DEBUG and MALLOC_DEBUG into configure.in; on by
+ default for development versions; off by default for releases
+ (off for profiling, too)
+
+ 5/21
+ ----
+parse.y
+ - modified the grammar to allow a simple_list followed by yacc_EOF
+ to terminate a command. This fixes problems with things like
+ a backslash-newline at the end of an `eval'd string
+ - change handle_eof_input_unit() to reset the token state before
+ calling prompt_again(), in case the prompt to be evaluated contains
+ a command substitution
+
+ 5/23
+ ----
+lib/readline/vi_mode.c
+ - fix `r' command (rl_vi_change_char) when HANDLE_MULTIBYTE is defined
+ but MB_CUR_MAX == 1
+
+ 5/24
+ ----
+lib/malloc/watch.c
+ - don't try to print `file' argument to _watch_warn if it's null
+
+lib/malloc/malloc.c
+ - changed guard checking code in internal_{malloc,free,realloc} to
+ access memory as (char *) and copy into a union instead of
+ casting and dereferencing a pointer to u_bits32_t, since that
+ results in unaligned accesses which will cause Sparcs to upchuck
+
+ 5/30
+ ----
+[bash-2.05b-beta1 released]
+
+lib/readline/text.c
+ - fixed a problem with rl_transpose_chars on systems supporting
+ multibyte characters with a locale that doesn't have any multibyte
+ chars
+
+ 6/4
+ ---
+expr.c
+ - fix a/=0 and a%=0 to throw evaluation errors rather than core dumps
+
+lib/readline/display.c
+ - fix core dump when line wrapping a multibyte character (line
+ accidentally dropped from the original patch)
+
+lib/readline/mbutil.c
+ - fix reversed return value from _rl_is_mbchar_matched; fixes problem
+ with backward-char-search
+
+ 6/10
+ ----
+lib/sh/getenv.c
+ - fix getenv to not free value returned by find_tempenv_variable
+ - add setenv, putenv, unsetenv for completeness
+
+ 6/12
+ ----
+shell.c
+ - change init_noninteractive to init expand_aliases to the value of
+ posixly_correct
+ - don't initialize expand_aliases to posixly_correct anywhere else.
+ This allows the -O expand_aliases invocation option to work correctly
+
+general.c
+ - fix move_to_high_fd to not try the dup2 unless the fd loop results
+ in an fd > 3; just return the passed file descriptor otherwise
+ - use HIGH_FD_MAX, defined in general.h, instead of hard-coded 256
+ as highest file descriptor to try
+
+subst.c
+ - in process_substitute, call move_to_high_fd with `maxfd' parameter
+ of -1 instead of 64, so move_to_high_fd will use its maximum
+
+ 6/21
+ ----
+lib/malloc/malloc.c
+ - don't bother calling MALLOC_MEMSET if the requested size is 0
+
+builtins/setattr.def
+ - note in short doc that export and readonly can take assignment
+ statements as arguments
+
+error.c
+ - new function, error_prolog(), to capture common error message
+ prefix code (except for parser errors)
+
+ 6/25
+ ----
+aclocal.m4
+ - add tests for standard-conforming declarations for putenv and
+ unsetenv in system header files
+
+{configure,config.h}.in
+ - call BASH_FUNC_STD_PUTENV and BASH_FUNC_STD_UNSETENV, define
+ HAVE_STD_GETENV and HAVE_STD_UNSETENV, respectively, if they
+ succeed
+
+lib/sh/getenv.c
+ - change putenv and unsetenv to take differing prototypes in
+ stdlib.h into account
+
+ 6/27
+ ----
+[bash-2.05b-beta2 released]
+
+ 6/28
+ ----
+builtins/common.c
+ - fix get_job_spec so that %N works when N is the size of the jobs
+ list (%8 means job 8, but the 7th member of the jobs array, so
+ it's OK if N == job_slots because the function returns N-1)
+
+ 7/1
+ ---
+shell.c
+ - turn off line editing if $EMACS is set to `t'
+
+ 7/10
+ ----
+builtins/set.def
+ - remove mention of `-i' from long help doc, since it has no effect
+
+ 7/17
+ ----
+[bash-2.05b released]
+
+ 7/18
+ ----
+
+lib/malloc/malloc.c
+ - make sure that the `free_return' label has a non-empty statement
+ to branch to
+
+ 7/19
+ ----
+locale.c
+ - only call setlocale() from set_lang() if HAVE_SETLOCALE is defined;
+ otherwise just return 0
+
+lib/readline/mbutil.c
+ - only try to memset `ps' in _rl_get_char_len if it's non-NULL. Ditto
+ for _rl_adjust_point
+
+ 7/23
+ ----
+execute_cmd.c
+ - fix for executing_line_number() when compiling without conditional
+ commands, dparen arithmetic or the arithmetic for command
+
+
+ 7/24
+ ----
+support/Makefile.in
+ - fix maintainer-clean, distclean, mostlyclean targets
+
+builtins/common.c
+ - fix bug in sh_nojobs where it doesn't pass the right number of args
+ to builtin_error
+
+bashline.c
+ - when using command completion and trying to avoid appending a slash
+ if there's a directory with the same name in the current directory,
+ use absolute_pathname() instead of just checking whether the first
+ char of the match is a slash to catch things like ./ and ../
+
+examples/complete/bashcc-1.0.1.tar.gz
+ - a package of completions for Clear Case, from Richard S. Smith
+ (http://www.rssnet.org/bashcc.html)
+
+input.c
+ - fix check_bash_input to call sync_buffered_stream if the passed fd
+ is 0 and the shell is currently reading input from fd 0 -- all it
+ should cost is maybe an additional read system call, and it fixes
+ the bug where an input redirection to a builtin inside a script
+ which is being read from stdin causes the already-read-and-buffered
+ part of the script to be thrown away, e.g.:
+
+ bash < x1
+
+ where x1 is
+
+ hostname
+ read Input < t.in
+ echo $Input
+ echo xxx
+
+execute_cmd.c
+ - in initialize_subshell(), call unset_bash_input (0) to not mess with
+ fd 0 if that's where bash thinks it's reading input from. Fixes
+ bug reported by jg@cs.tu-berlin.de on 17 July 2002. Should be a way
+ to check whether or not the current fd 0 at the time of the call has
+ not been redirected, like in the bug report. Also might eventually
+ want to throw in a sync_buffered_stream if bash is reading input
+ from fd 0 in a non-interactive shell into a buffered stream, so the
+ stream is sync'd -- might be necessary for some uses
+
+ 7/25
+ ----
+lib/readline/signals.c
+ - make sure rl_catch_sigwinch is declared even if SIGWINCH is not
+ defined, so the readline state saving and restoring functions in
+ readline.c are always the same size even if SIGWINCH is not defined,
+ and undefined references don't occur when SIGWINCH is not defined
+
+ 7/30
+ ----
+bashline.c
+ - augment patch from 7/24 to not disable rl_filename_completion_desired
+ if the first char of the match is `~'
+
+lib/readline/bind.c
+ - when creating `shadow' keymaps `bound' to ANYOTHERKEY, don't bind
+ a key whose type is ISFUNC but whose function is the `fake'
+ rl_do_lowercase_version (fixes debian bash bug #154123)
+
+lib/readline/readline.c
+ - don't call _rl_vi_set_last from _rl_dispatch_subseq if
+ key == ANYOTHERKEY (when truncated to `sizeof(char)', it will be 0,
+ which strchr will find in `vi_textmod')
+
+ 7/31
+ ----
+lib/readline/input.c
+ - fix rl_gather_tyi to only slurp up one line of available input, even
+ if more than one line is available (fixes debian bash bug #144585)
+
+ 8/3
+ ---
+bashline.c
+ - better fix for command completion problem -- test for directory
+ explicitly with test_for_directory before turning off
+ rl_filename_completion_desired, since that's the case we're trying
+ to protect against
+
+ 8/5
+ ---
+include/shmbutil.h
+ - fix ADVANCE_CHAR macro to advance the string pointer if mbrlen
+ returns 0, indicating that the null wide character (wide string
+ terminator) was found (debian bash bug #155436)
+
+lib/readline/mbutil.c
+ - fix _rl_adjust_point to increment the string pointer if mbrlen
+ returns 0
+
+support/shobj-conf
+ - fix for the `-install_name' value in SHLIB_XLDFLAGS assignment for
+ Darwin from the fink folks
+
+ 8/6
+ ---
+builtins/exit.def
+ - broke code that runs ~/.bash_logout out into a separate function:
+ bash_logout()
+
+builtins/common.h
+ - extern declaration for bash_logout()
+
+eval.c
+ - call bash_logout() from alrm_catcher(), so timed-out login shells
+ run ~/.bash_logout before processing the exit trap
+
+lib/sh/strtrans.c
+ - implemented $'\x{hexdigits}' expansion from ksh93
+
+configure.in
+ - define RECYCLES_PIDS in LOCAL_CFLAGS for cygwin; don't bother to
+ link with -luser32
+
+examples/loadables/strftime.c
+ - new loadable builtin, interface to strftime(3)
+
+ 8/7
+ ---
+parse.y
+ - parse_arith_cmd now takes a second argument, a flag saying whether
+ or not to add double quotes to a parsed arithmetic command; changed
+ callers
+ - changed parse_dparen so it tells parse_arith_cmd to not add the
+ double quotes and therefore doesn't need to remove them
+ - change parse_dparen to add W_NOGLOB|W_NOSPLIT|W_QUOTED flags to word
+ created when parsing (( ... )) arithmetic command, since the double
+ quotes are no longer added
+
+make_cmd.c
+ - in make_arith_for_expr, set the flags on the created word to
+ W_NOGLOB|W_NOSPLIT|W_QUOTED
+
+execute_cmd.c
+ - change execute_arith_command to expand the expression with
+ expand_words_no_vars, like the arithmetic for command code does
+ - fix execute_arith_command to handle the case where the expanded
+ expression results in a NULL word without crashing
+
+tests/{arith-for,cprint}.tests
+ - change expected output to account for no longer adding quotes to
+ ((...)) commands
+
+ 8/8
+ ---
+print_cmd.c
+ - take out the space after printing the `((' and before printing the
+ `))' in print_arith_command, print_arith_for_command, and
+ xtrace_print_arith_cmd
+
+tests/{arith-for,cprint}.tests
+ - change expected output to account for no longer adding leading and
+ trailing spaces when printing ((...)) and arithmetic for commands
+
+ 8/17
+ ----
+subst.c
+ - fix issep() define to handle case where separators[0] == '\0', in
+ which case it always returns false
+
+lib/readline/histexpand.c
+ - fix off-by-one error in history_expand_internal when using the `g'
+ modifier that causes it to skip every other match when matching a
+ single character (reported by gjyun90@resl.auto.inha.ac.kr)
+
+doc/{bash.1,bashref.texi}
+ - make sure that the name=word form of argument to declare/typeset,
+ export, and readonly is documented in the description
+
+ 8/30
+ ----
+lib/readline/histexpand.c
+ - make history_expand_internal understand double quotes, because
+ single quotes are not special inside double quotes, according to
+ our shell-like quoting conventions. We don't want unmatched
+ single quotes inside double-quoted strings inhibiting history
+ expansion
+ - make `a' modifier equivalent to `g' modifier for compatibility with
+ the BSD csh
+ - add a `G' modifier that performs a given substitution once per word
+ (tokenized as the shell would do it) like the BSD csh `g' modifier
+
+ 8/31
+ ----
+braces.c
+ - when compiling for the shell, treat ${...} like \{...} instead of
+ trying to peek backward when we see a `{'. This makes it easier
+ to handle things like \${, which should be brace expanded because
+ the $ is quoted
+
+ 9/7
+ ---
+aclocal.m4
+ - redirect stdin from /dev/null in BASH_CHECK_DEV_FD before testing
+ the readability of /dev/fd/0, so we're dealing with a known quantity
+
+ 9/11
+ ----
+[prayers for the victims of 9/11/01]
+
+shell.c
+ - fix maybe_make_restricted to handle a restricted login shell with a
+ base pathname of `-rbash' and skip over any leading `-'
+
+ 9/13
+ ----
+builtins/evalstring.c
+ - in parse_and_execute, make sure we don't try to run unwind-protects
+ back to `pe_dispose' after a longjmp back to top_level if the
+ pe_dispose frame hasn't been initialized
+
+lib/readline/display.c
+ - fix problem with prompt overwriting previous output when the output
+ doesn't contain a newline in a multi-byte locale. This also should
+ fix the problem of bash slowing down drastically on long lines when
+ using a multi-byte locale, because it no longer tries to rewrite the
+ entire line each time. Patch from Jiro SEKIBA <jir@yamato.ibm.com>
+
+parse.y
+ - move the typedef for alias_t that is compiled in if ALIAS is not
+ defined up before the prototype for push_string, since that takes
+ an alias_t * parameter
+
+lib/readline/terminal.c
+ - bind the termcap description's left and right arrow keys to
+ rl_backward_char and rl_forward_char, respectively, instead of
+ rl_forward and rl_backward (which are just there for backwards
+ compatibility)
+
+aclocal.m4
+ - when testing readability of /dev/stdin, redirect stdin from /dev/null
+ to make sure it's a readable file
+
+ 9/17
+ ----
+config-bot.h
+ - don't test __STDC__ when deciding whether or not to use stdarg.h;
+ just use it if it's present
+
+tests/read2.sub
+ - redirect from /dev/tty when using `read -t'
+
+ 9/20
+ ----
+builtins/history.def
+ - when reading `new' entries from the history file with `history -n',
+ fix increment of history_lines_this_session by taking any change
+ in history_base into account
+
+lib/sh/pathphys.c
+ - changes to sh_physpath to deal with pathnames that end up being
+ longer than PATH_MAX without dumping core
+
+lib/readline/doc/{history.3,hsuser.texinfo},doc/ bash.1
+ - documented new `a' and `G' history modifiers
+
+ 9/25
+ ----
+lib/readline/misc.c
+ - when traversing the history list with arrow keys in vi insertion
+ mode, put the cursor at the end of the line (like in emacs mode)
+
+mksyntax.c
+ - don't try to use \a and \v unless __STDC__ is defined; use the
+ ascii integer equivalents otherwise
+ - include "config.h" in the generated syntax.c file for a possible
+ definition of `const'
+
+doc/{bash.1,bashref.texi}
+ - document the meaning of a null directory in $PATH
+
+ 9/26
+ ----
+parse.y
+ - fix set_line_mbstate to handle case where mbrlen() returns 0,
+ indicating the null wide character
+ - fix set_line_mbstate so we don't directly compare a char variable
+ to EOF, since char can (and is) unsigned on some machines
+
+bashline.c
+ - change bash_execute_unix_command to save a little bit more state:
+ last_shell_builtin, this_shell_builtin, last_command_exit_value
+
+ 9/27
+ ----
+execute_cmd.c
+ - tentative change to execute_simple_command to avoid freeing freed
+ memory in the case where bash forks early but still ends up calling
+ execute_disk_command, without passing newly-allocated memory to
+ make_child. This may fix the core dumps with the linux-from-scratch
+ folks
+
+ 9/28
+ ----
+Makefile.in,{builtins,lib/sh}/Makefile.in
+ - fix up dependencies, mostly on ${BUILD_DIR}/version.h, so that
+ parallel makes work with GNU and BSD makes
+
+shell.h
+ - new struct to save partial parsing state when doing things like
+ bash_execute_unix_command and other operations that execute
+ commands while a line is being entered and parsed
+
+parse.y
+ - new functions, save_parser_state() and restore_parser_state(), to
+ save and restore partial parsing state
+
+bashline.c
+ - change bash_execute_unix_command to call {save,restore}_parser_state
+
+builtins/jobs.def
+ - change execute_list_with_replacements to eliminate a run_unwind_frame
+ in favor of calling the cleanup explicitly and discarding the frame
+
+execute_cmd.c
+ - change execute_for_command to avoid a run_unwind_frame in the case
+ where the loop variable is readonly or otherwise not assignable
+ - change execute_select_command and execute_simple_command to use
+ discard_unwind_frame by running the cleanup code explicitly, instead
+ of using run_unwind_frame
+ - make sure execute_select_command decreases loop_level even on error
+
+ 9/30
+ ----
+doc/{bash.1,bashref.texi}
+ - fixed description of `unset' now that unsetting a previously-unset
+ variable is no longer an error
+
+ 10/3
+ ----
+{configure,config.h}.in
+ - augment check for strtold with additional check to detect the
+ horribly broken hp/ux 11.x implementation that returns `long_double';
+ defines STRTOLD_BROKEN if so
+
+builtins/printf.def
+ - define floatmax_t as `double' if STRTOLD_BROKEN is defined
+
+ 10/5
+ ----
+lib/readline/keymaps.c
+ - don't automatically bind uppercase keys to rl_do_lowercase_version
+ in rl_make_bare_keymap
+
+lib/readline/readline.c
+ - explicitly check for ANYOTHERKEY binding to rl_do_lowercase_version
+ and dispatch to lowercase of key when a prefix is not matched
+
+ 10/12
+ -----
+bashline.c
+ - set COMP_WORDBREAKS in enable_hostname_completion to the value
+ of rl_completer_word_break_characters
+
+variables.c
+ - new special variable COMP_WORDBREAKS, controls the value of
+ rl_completer_word_break_characters
+
+variables.h
+ - new extern declaration for sv_comp_wordbreaks()
+
+subst.c
+ - change split_at_delims to behave more like shell word splitting if
+ the passed value for the delimiters is NULL, indicating that the
+ function is to use $IFS to split
+
+{execute_cmd,jobs,test,findcmd,input,make_cmd,redir,shell}.c
+builtins/mkbuiltins.c,builtins/{fc,history,source,umask}.def
+lib/sh/netconn.c
+lib/termcap/termcap.c
+lib/readline/histfile.c
+ - make sure all inclusions of <sys/file.h> are protected by
+ HAVE_SYS_FILE_H
+
+bashline.c
+ - don't turn off rl_filename_completion_desired in
+ attempt_shell_completion if the partial pathname contains a slash.
+ This still doesn't solve the problem of partial pathname completion
+ starting with a directory in the current directory without a
+ leading `./'. There's no way to tell the difference between that
+ and a file found in $PATH (which may contain `.') at the point that
+ attempt_shell_completion acts
+
+ 10/18
+ -----
+locale.c
+ - don't set lc_all to the default locale when LC_ALL is being unset
+ - new function, reset_locale_vars(), called to recompute the correct
+ locale variable values when LC_ALL is unset
+ - changed set_lang to not set LC_ALL, which it never should have been
+ doing in the first place, and to maintain a local variable `lang'
+ corresponding to $LANG
+ - change get_locale_var to use the precedence posix.2 specifies:
+ LC_ALL overrides individual variables; LANG, if set, is the default
+ - change set_locale_var to call get_locale_var to get the appropriate
+ value for the variable being set or unset
+ - call get_locale_var instead of using passed value in set_locale_var
+ to get the defaulting and precedence right
+
+lib/readline/nls.c
+ - new function, _rl_get_locale_var(), which does the same thing as
+ locale.c:get_locale_var(), with the right precedence and defaulting,
+ using sh_get_env_value to get the right bash variable values
+ - if HAVE_SETLOCALE is defined, _rl_init_eightbit first calls
+ _rl_get_locale_var to get the right value for LC_CTYPE, and uses
+ that in the call to setlocale. If _rl_get_locale_var returns NULL,
+ call setlocale() to get the current international environment, and,
+ finally, if that returns null, call setlocale with a second argument
+ of "" to force the implementation's `native' environment
+
+pcomplete.c
+ - change gen_wordlist_completions to dequote the text before comparing
+ it against the expanded word list
+ - changed gen_matches_from_itemlist to do the same thing
+
+bashline.c
+ - new global function, bash_dequote_word, calls bash_dequote_filename
+ on the text passed. Used by the programmable completion code
+
+lib/readline/histfile.c
+ - make sure that whenever read_history_range returns a non-zero value
+ that it sets errno to some useful value
+
+ 10/19
+ -----
+variables.c
+ - COMP_WORDBREAKS is now a dynamic variable, mirroring value of
+ rl_completer_word_break_characters. Makes sure that the variable
+ always points to dynamic memory if it's not null or the readline
+ default
+
+bashline.c
+ - change enable_hostname_completion to manage a dynamic value of
+ rl_completer_word_break_characters, since assignments to
+ COMP_WORDBREAKS can change its value unpredictably
+
+lib/readline/{complete.c,readline.h}
+ - rl_completer_word_break_characters no longer has `const' attribute
+
+bashline.c
+ - clean up necessary places due to rl_completer_word_break_characters
+ no longer being `const'
+
+doc/{bash.1,bashref.texi}
+ - document new COMP_WORDBREAKS variable
+
+ 10/21
+ -----
+print_cmd.c
+ - fix indirection_level_string to handle the case where the decoded
+ $PS4 is null without seg faulting
+
+ 10/22
+ -----
+builtins/shift.def
+ - make sure that there is actually an argument when reporting a shift
+ count that exceeds the number of positional paramters and
+ shift_verbose is enabled
+
+lib/readline/rltty.c
+ - change SET_SPECIAL to call a new function, set_special_char, since
+ it contains a block. It's called infrequently, so the performance
+ impact of making it a function should be negligible, and it helps
+ debugging
+
+ 10/29
+ -----
+bashline.c
+ - make sure the editor in VI_EDIT_COMMAND and EMACS_EDIT_COMMAND is
+ quoted; it might contain spaces (e.g., `emacs -nw')
+
+aclocal.m4
+ - cache ac_cv_rl_version in RL_LIB_READLINE_VERSION macro
+
+configure.in
+ - change logic that sets RL_INCLUDEDIR so that it doesn't try to set
+ a bogus include path if the argument to --with-installed-readline
+ is `yes' -- helps with cross-compiling
+
+lib/readline/histexpand.c
+ - fix history_tokenize_word so that it handles <( and >( better
+
+ 10/30
+ -----
+redir.c
+ - fix write_here_string so it handles the case where `herestr' expands
+ to NULL without seg faulting
+
+ 10/31
+ -----
+mailcheck.c
+ - reverse logic flip from bash-2.05 that handled systems that don't
+ change the atime when the mailbox is accessed; make sure the file
+ is bigger before we report new mail. This is the case in the vast
+ majority of cases. Reported by jim@jtan.com
+
+ 11/5
+ ----
+parse.y
+ - change action for `for x; { list; }' and corresponding `select'
+ production to use \"$@\" instead of just $@, as it is with all the
+ other actions
+
+ 11/9
+ ----
+parse.y
+ - new flag for parse_matched_pair: P_DQUOTE, indicating that the
+ pair of characters being matched is between double quotes
+ - parse_matched_pair now passes P_DQUOTE down to recursive calls:
+ if the open char to be matched is a `"' or the passed-in flags
+ include P_DQUOTE, set the local `rflags' variable to P_DQUOTE and
+ pass `rflags' down to recursive calls
+ - if `rflags' includes P_DQUOTE, don't try to ansiexpand $'...' or
+ locale expand $"..."; consistent with other quoting constructs
+
+ 11/11
+ -----
+doc/{bash.1,bashref.texi}
+ - explicitly note that variables referenced in arithmetic expressions
+ without using `$' evaluate to 0 if they are null or unset
+ - note that a null variable value evaluates to 0 when used in an
+ arithmetic context, like when a variable with the `-i' attribute is
+ assigned a null value
+ - document the ${!prefix@} expansion as equivalent to ${!prefix*}
+
+ 11/12
+ -----
+doc/{bash.1,bashref.texi}
+ - note that the value of an arithmetic expression is as in C
+ - change the wording to note that `arithmetic evaluation' (not
+ arithmetic expansion, which has a different meaning) is performed
+ on the value assigned to a variable whose integer attribute is set
+
+ 11/13
+ -----
+execute_cmd.c
+ - fix execute_disk_command so it calls exit() after printing the error
+ message in a restricted shell context if the shell has already forked
+ (nofork != 0 && there are no pipes)
+
+ 11/19
+ -----
+builtins/type.def
+ - don't report on aliases unless expand_aliases is set and the parser
+ is performing alias expansion; changed tests/type.tests and
+ tests/type.right accordingly
+
+ 11/25
+ -----
+general.c
+ - fix for full pathnames including drive letters on cygwin from
+ Corinna (convert to posix-style paths, which the rest of the
+ code handles much better)
+
+lib/readline/text.c
+ - fixes to overwrite mode from jimmy@is-vn.bg:
+ o in _rl_overwrite_char, do the overwrite mode self-insert
+ as one group, even when overwriting more than 1 char
+ o in _rl_overwrite_char, do the insert before the delete so
+ that an undo positions the cursor on the character restored,
+ not to the right of it
+ o in _rl_overwrite_rubout, don't do rl_insert_char(' ') unless
+ rl_point < rl_end. Since overwrite-mode self-insert acts as
+ in insert-mode when at eol, make rubout behave like
+ insert-mode rubout
+
+ 11/30
+ -----
+lib/readline/misc.c
+ - call rl_replace_line with `1' as second parameter if we're going to
+ immediately overwrite the undo list
+
+lib/readline/search.c
+ - in make_history_line_current, use _rl_replace_text to make the line
+ replacement an undoable operation. Affects all non-incremental
+ search functions.
+
+parse.y
+ - make behavior introduced on 11/9 dependent on extended_quote
+ variable, controllable by extquote shopt option. Default setting is
+ on for backwards compatibility
+
+builtins/shopt.def
+ - new `extquote' option to control extended_quote variable
+
+ 12/3
+ ----
+jobs.c
+ - change message printed when attempting to put a background job in
+ the background with `bg' to include the job id and make the
+ statement declarative
+
+ 12/10
+ -----
+bashhist.h
+ - define explicit flag values for history_control
+
+variables.c
+ - change sv_history_control to use new flag values
+ - change sv_history_control to parse $HISTCONTROL as a colon-separated
+ list of values for the history_control variable
+
+bashhist.c
+ - change check_history_control to use new flag values and restructure
+ to remove case statement
+ - new function hc_erasedups(line); removes all entries matching LINE
+ from the history list
+ - call hc_erasedups() from check_add_history after we've determined
+ that we're saving the line
+
+doc/{bash.1,bashref.texi}
+ - documented new options available for $HISTCONTROL and that it can
+ be a colon-separated list of history control options
+
+ 12/11
+ -----
+subst.c
+ - fix pat_subst() to not increment `e' (pointer to the end of the
+ matched portion of the string) until after we're sure we're going
+ around the loop again; fixes problem with empty replacements for
+ a pattern that doesn't match (bug reported by Don Coleman
+ <don@coleman.org>)
+
+ 12/17
+ -----
+lib/readline/display.c
+ - fixes to multibyte redisplay from jir@yamato.ibm.com (Jiro SEKIBA):
+ o speed up calculation of first difference between old and new
+ lines in the common case
+ o don't try to see if we're in the middle of a multbyte char
+ in update_line (we'll see how this one works out)
+
+ 12/18
+ -----
+doc/bashref.texi
+ - make it clear that the `command-list' function definition may be
+ terminated by an ampersand before the closing brace
+
+ 12/28
+ -----
+redir.c
+ - set `expanding_redir' flag when expanding words in a redirection
+
+subst.c
+ - new function, exp_jump_to_top_level(), to do any word expansion
+ cleanup before a call to jump_to_top_level from within that file;
+ sets expanding_redir back to 0 before jump_to_top_level
+
+variables.c
+ - in find_variable(), don't call find_variable_internal with a second
+ parameter of 1 if expanding_redir is non-zero
+ - in find_variable_internal(), don't search the temporary env if
+ subshell_environment includes SUBSHELL_FORK (indicating a simple
+ command) and expanding_redir is non-zero
+
+parse.y
+ - increment line_number when we read a \<newline> pair
+
+array.c
+ - added array_unshift_element and array_shift_element (which just call
+ array_shift and array_rshift, respectively), for bash debugger
+ support
+
+ 1/4/2003
+ --------
+doc/{bash.1,bashref.texi}
+ - note in the section describing the execution environment passed to
+ children that subshells inherit shell functions marked for export
+ - note in the section describing shell functions the possibility
+ that exported functions may result in two entries in the environment
+ with the same name
+
+parse.y
+ - when pushing an alias expansion onto the pushed_string list, append
+ a space to the expanded definition to make the parser's lookahead
+ work without using the `mustpop' hack in shell_getc
+
+ 1/8
+ ---
+shell.c
+ - change calls to exit() with EX_USAGE as a parameter to use
+ EX_BADUSAGE instead, since EX_USAGE is defined as 258 and is
+ technically out of range
+
+ 1/14
+ ----
+aclocal.m4
+ - check for the termcap functions in libc first: if we don't have
+ to link in another library, let's not do it
+ - change the test for mbstate_t to use AC_TRY_COMPILE instead of
+ AC_TRY_RUN
+
+doc/{bash.1,bashref.texi}
+ - document that bash turns line editing off if environment variable
+ EMACS is set to `t' when it starts up
+
+doc/bash.1
+ - minor change to give the ftp url for the latest version of bash in
+ the bug reports section
+
+lib/readline/histexpand.c
+ - in get_history_event, cast a couple of `const char *' variables to
+ `char *' in function call parameter lists to avoid compiler warnings
+
+ 1/21
+ ----
+builtins/cd.def
+ - change `cd -' so it prints the current working directory after a
+ successful chdir even when the shell is not interactive
+
+ 1/31
+ ----
+lib/readline/doc/rltech.texinfo
+ - clarified exactly what is meant by the term `application-specific
+ completion function', made its use consistent, and documented
+ what variables are changed before such a function is called
+
+lib/readline/input.c
+ - new function, _rl_pushed_input_available(), returns non-zero if
+ there are characters in the input queue managed by rl_get_char
+ and _rl_unget_char
+
+lib/readline/rlprivate.h
+ - new extern declaration for _rl_pushed_input_available
+
+lib/readline/callback.c
+ - change rl_callback_read_char to check _rl_pushed_input_available
+ and loop if there's something there, so characters don't languish
+ until more keyboard input is read
+
+execute_cmd.c
+ - new variable, last_command_exit_signal, non-zero if
+ last_command_exit_value result from wait_for was result of a signal
+
+nojobs.c
+ - keep track of whether or not a given pid was killed by a signal with
+ a new flag in the pid_list array
+ - new function int find_termsig_by_pid(pid_t pid) to get the
+ terminating signal, if any, for a particular pid
+ - new function int get_termsig(WAIT status) returns the terminating
+ signal corresponding to status
+ - set last_command_exit_signal in wait_for and the various wait_for_xx
+ functions
+
+jobs.c
+ - new functions, process_exit_signal and job_exit_signal, return the
+ signal that killed a given process or job, if a signal caused its
+ death
+ - set last_command_exit_signal in wait_for by calling job_exit_signal
+ or process_exit_signal appropriately
+
+subst.c
+ - don't resend SIGINT to ourselves unless last_command_exit_signal is
+ SIGINT and last_command_exit_value == 128 + SIGINT. This fixes the
+ $(exit 130) bug reported by Paul Jarc
+
+expr.c
+ - new function, expr_bind_variable, calls bind_int_variable and
+ then stupidly_hack_special_variables. This fixes the
+ `let OPTIND=1' bug
+
+bashline.c
+ - change history_and_alias_expand_line and shell_expand_line to call
+ history_expand_line_internal so calls to pre_process_line are
+ localized
+ - change history_expand_line_internal and cleanup_expansion_error to
+ temporarily turn off hist_verify before calling pre_process_line
+ to avoid the effects described by teirllm@dms.auburn.edu
+
+parse.y
+ - don't unconditionally turn off PST_ALEXPNEXT in push_string. This
+ fixes the multiple alias expansion bug reported by Paul Jarc.
+
+lib/readline/vi_mode.c
+ - change rl_vi_subst to push `l' instead of ` ' -- it should be
+ equivalent, but this has been reported to fix a problem in multibyte
+ locales
+
+lib/readline/readline.h
+ - new state flag value RL_STATE_TTYCSAVED, indicates that save_tty_chars
+ has been called. Since it's only used and visible internally, it's
+ undocumented
+
+lib/readline/rltty.h
+ - changed all of the members of _rl_tty_chars struct to `unsigned char'
+
+lib/readline/rltty.c
+ - set the RL_STATE_TTYCSAVED after save_tty_chars is called
+ - new function, rl_tty_unset_default_bindings(), resets bindings for
+ everything rl_tty_set_default_bindings() messes with back to
+ rl_insert, so rl_tty_set_default_bindings can be called again with
+ possible changes
+ - new function that does the bulk of the work for
+ rltty_set_default_bindings: _rl_bind_tty_special_chars()
+ - change prepare_terminal_settings so that it can track changes to the
+ terminal special chars made by stty(1): unset the bindings with
+ rl_tty_unset_default_bindings before calling save_tty_chars, and
+ _rl_tty_set_default_bindings after, with the new values from
+ get_tty_settings(). This implements a long-standing request, most
+ recently made by Tim Waugh of Red Hat.
+
+lib/readline/readline.h
+ - extern declaration for rl_tty_unset_default_bindings()
+
+lib/readline/readline.c
+ - new function, reset_default_bindings, calls
+ rl_tty_unset_default_bindings() to reset the terminal special chars
+ back to rl_insert and then read the new ones
+
+lib/readline/doc/rltech.texinfo
+ - documented rl_tty_unset_default_bindings()
+
+ 2/1
+ ---
+[prayers and condolences to the families of the space shuttle crew members]
+
+aclocal.m4
+ - add checks for mbrtowc and mbrlen in BASH_CHECK_MULTIBYTE
+ - new check, BASH_FUNC_CTYPE_NONASCII, checks whether or not the ctype
+ functions handle non-ascii characters correctly
+
+config.h.in
+ - add HAVE_MBRTOWC and HAVE_MBRLEN
+ - add NO_MULTIBYTE_SUPPORT for new configure argument
+ - add CTYPE_NON_ASCII
+
+config-bot.h, lib/readline/rlmbutil.h
+ - make sure that mbrtowc, mbrlen, and wcwidth are all present before
+ turning on HANDLE_MULTIBYTE
+ - turn off multibyte chars if NO_MULTIBYTE_SUPPORT is defined
+
+configure.in
+ - new argument --enable-multibyte (enabled by default), allows
+ multibyte support to be turned off even on systems that support it
+
+lib/readline/chardefs.h
+ - define NON_NEGATIVE as 1 if CTYPE_NON_ASCII is defined
+
+ 2/3
+ ---
+config.h.in
+ - add HAVE_WCTOMB
+
+aclocal.m4
+ - check for wctomb in BASH_CHECK_MULTIBYTE
+
+ 2/4
+ ---
+lib/readline/vi_mode.c
+ - in _rl_vi_change_mbchar_case, make sure the result from wctomb()
+ is NULL-terminated before trying to insert it with rl_insert_text()
+
+ 2/5
+ ---
+lib/readline/display.c
+ - fix to update_line to avoid problems on systems with multibyte
+ characters when moving between history lines when the new line
+ has more glyphs but fewer bytes (twaugh@redhat.com)
+
+lib/readline/vi_mode.c
+ - use wcrtomb() instead of wctomb() in _rl_vi_change_mbchar_case
+
+pcomplete.c
+ - fix init_itemlist_from_varlist to handle the case where the
+ `varlist' is NULL
+
+doc/{bash.1,bashref.texi}
+ - clarified when a simple command may fail without the shell exiting
+ when -e is set
+
+ 2/13
+ ----
+parse.y
+ - when bash is started with --nolineediting, ignore \[ and \] when
+ decoding the prompt string
+
+subst.c
+ - fix remove_quoted_nulls so that a string with a CTLESC appearing
+ after a CTLNUL (which was removed) does not leave characters in
+ the string inappropriately
+
+ 2/14
+ ----
+builtins/common.h
+ - new flag value for parse_and_execute(): SEVAL_RESETLINE, which
+ allows the caller to specify whether or not the internal idea
+ of the line number should be reset to 1
+
+builtins/evalstring.c
+ - parse_and_execute() now tells push_string to reset the line
+ number only if the SEVAL_RESETLINE flag is set by the caller
+
+ 2/15
+ ----
+builtins/evalfile.c
+ - pass SEVAL_RESETLINE from _evalfile() to parse_and_execute()
+
+subst.c
+ - if the shell is currently interactive, pass SEVAL_RESETLINE to
+ parse_and_execute() when doing command substitution
+
+jobs.c
+ - add SEVAL_RESETLINE to parse_and_execute while running SIGCHLD trap
+
+command.h
+ - add `line' members to case_com, for_com, select_com
+ - rearranged order of members in some of the command structs, so
+ `flags' and `line' are first
+ - added a `source_file' member to the function_def struct; keeps
+ track of where the function was defined
+
+doc/Makefile.in
+ - add some new suffix rules: .dvi.ps
+
+doc/{bash.1,bashref.texi}
+ - added text to the description of the `trap' builtin tightening up
+ the language describing when the ERR trap will be run
+
+error.c
+ - if $BASH_SOURCE (internally-maintained) exists, use BASH_SOURCE[0]
+ in get_name_for_error if the shell is not interactive
+
+array.h
+ - new convenience defines: array_push and array_pop
+
+variables.c
+ - change get_funcname to return this_shell_function->name only if
+ arrays have not been compiled into the shell
+ - change init_funcname_var to initialize FUNCNAME as an array variable
+ if we have arrays
+ - new function: get_self(SHELL_VAR *self), a degenerate `dynamic_value'
+ function for dynamic variables
+ - new function: init_dynamic_array_var(), a generic dynamic array
+ variable initializer to handle the common case
+ - use init_dynamic_array_var() instead of explicit init_dirstack_var()
+ - use init_dynamic_array_var() instead of explicit init_groups_var()
+ - new dynamic array variables: BASH_ARGC, BASH_ARGV, BASH_SOURCE,
+ BASH_LINENO, initialized with init_dynamic_array_var
+
+shell.c
+ - initialize BASH_LINENO, BASH_SOURCE, FUNCNAME in open_shell_script
+
+{execute_cmd,trap}.c
+ - take out trap_line_number, since parse_and_execute doesn't reset the
+ line number any more when running the trap commands
+
+make_cmd.c
+ - augment make_function_def to get source file name and call
+ bind_function_def to save the entire FUNCTION_DEF
+
+variables.c
+ - new hash table: shell_function_defs, keeps table of shell function
+ definitions including source file and line number info corresponding
+ to shell_functions table
+ - new functions: find_function_def and bind_function_def to manage
+ the shell_function_defs hash table
+ - new function: unbind_function_def to remove a function definition
+ from the shell_function_defs table (right now uncalled)
+
+variables.h
+ - extern declaration for bind_function_def, find_function_def
+ - new extern declaration for unbind_function_def
+
+execute_cmd.c
+ - in function prologue and epilogue, push and pop FUNCNAME,
+ BASH_SOURCE, and BASH_LINENO information
+
+dispose_cmd.c
+ - broke the code that disposes a FUNCTION_DEF out into two new
+ functions: dispose_function_def and dispose_function_def_contents
+
+dispose_cmd.h
+ - new extern declarations for dispose_function_def_contents and
+ dispose_function_def
+
+copy_cmd.c
+ - move body of copy_function_def (other than allocating a new
+ FUNCTION_DEF) to copy_function_def_contents
+ - make sure to copy the new source_file member of a function_def in
+ copy_function_def_contents
+ - copy_function_def is no longer static, copy_function_def_contents
+ is not either
+
+command.h
+ - new extern declaration for copy_function_def_contents and
+ copy_function_def
+
+parse.y
+ - keep a stack of line numbers where case, select, and for commands
+ start, with a maximum nesting level of 128; increment when reading
+ word after `for', `select' or `case' in read_token_word; decrement
+ in grammar actions after parsing a complete for, arith_for, select,
+ or case command
+ - create for, case, arith_for, and select commands with an extra
+ line number (word_lineno[word_top]) argument
+
+make_cmd.c
+ - make_for_or_select, make_for_command, make_case_command, and
+ make_select_command all take an extra `line_number' argument
+
+make_cmd.h
+ - corresponding changes to extern declarations for those functions
+
+ 2/16
+ ----
+{execute_cmd,shell,variables}.c
+ - follow each call to remember_args with a call to push_args or
+ pop_args to manage the BASH_ARGV and BASH_ARGC arrays. Only set
+ when the shell is started to run shell script or runs a shell
+ function. Doesn't handle `set' or `shift' yet, nor `source'.
+
+execute_cmd.c
+ - keep track of the level of subshells with a new variable, manipulated
+ in execute_in_subshell
+ - set currently_executing_command in execute_command_internal(),
+ even if we're running a trap
+ - better line number management when executing simple commands,
+ conditional commands, for commands in execute_command_internal()
+ and the various functions that implement the commands
+ (execute_cond_command, execute_for_command, execute_etc.)
+
+variables.c
+ - new dynamic variable BASH_SUBSHELL, with new get_subshell and
+ assign_subshell functions to manipulate it
+ - new functions push_args (WORD_LIST *list) and pop_args (void) to
+ manage the BASH_ARGC and BASH_ARGV dynamic array variables
+
+variables.h
+ - new extern declarations for push_args and pop_args
+
+builtins/evalfile.c
+ - in _evalfile, do appropriate things to the FUNCNAME, BASH_ARGV,
+ BASH_ARGC, BASH_SOURCE, and BASH_LINENO variables
+
+support/mksignames.c
+ - add another fake signal for `trap'; make NSIG+2 == `RETURN'
+
+trap.c
+ - _run_trap_internal now returns an int: the exit value of the command
+ run as the result of the trap
+ - run_debug_trap now returns an int: the exit value of the command
+ run as the result of the trap
+ - RETURN is a new special trap
+ - new function: set_return_trap(char *command) interface for the rest
+ of the shell, like set_{debug,error}_trap
+ - new function: run_return_trap()
+ - command substitution and other child processes don't inherit the
+ return trap
+
+trap.h
+ - new extern declaration for set_return_trap() and run_return_trap
+ - new defines for RETURN_TRAP; increment BASH_NSIG
+ - change extern declaration for run_debug_trap() since it now returns
+ an int
+
+shell.c
+ - new invocation long option: --debugger, turns on debugging and
+ sets internal `debugging_mode' variable
+
+execute_cmd.c
+ - new code to save return trap when executing a shell function, so
+ shell functions don't inherit it
+ - run debug trap before binding the variable and running the action
+ list in a `for' command
+ - run debug trap before binding the selection variable and running
+ the query in a `select' command
+ - run debug trap before running matcher in a `case' command
+
+builtins/set.def
+ - new `set -o functrace' (set -T), causes DEBUG trap to be inherited
+ by shell functions
+ - new `set -o errtrace' (set -E), causes ERR trap to be inherited
+ by shell functions
+
+flags.c
+ - new flags -E and -T, control error_trace_mode and
+ function_trace_mode respectively
+
+flags.h
+ - new extern declarations for error_trace_mode and function_trace_mode
+
+ 2/17
+ ----
+doc/bashref.texi
+ - changed the `dircategory' as per Karl Berry's suggestion
+
+doc/texinfo.tex
+ - update to version of 2003/02/04 from texinfo.org
+
+support/texi2dvi
+ - update to version 1.14 from texinfo-4.5 distribution
+
+ 2/20
+ ----
+support/config.{guess,sub}
+ - update to versions of 2002/11/30
+
+lib/readline/doc/manvers.texinfo
+ - renamed to version.texi to match other GNU software
+ - UPDATE-MONTH variable is now `UPDATED-MONTH'
+
+lib/readline/doc/{hist,rlman,rluserman}.texinfo
+ - include version.texi
+
+doc/version.texi
+ - new file, with standard stuff matching other GNU distributions
+
+{doc,lib/readline/doc}/Makefile.in
+ - include right stuff for `version.texi'
+
+lib/readline/doc/{rluserman,rlman,hist}.texinfo
+ - use @copying and @insertcopying and @ifnottex instead of @ifinfo
+ - add FDL as an appendix entitled `Copying This Manual'
+
+lib/readline/doc/{rltech,rluser,hstech,hsuser}.texi
+ - changed the suffix from `texinfo' to `texi'
+
+lib/readline/doc/{rlman,rluserman}.texinfo, doc/bashref.texi
+ - include rltech.texi,rluser.texi,hstech.texi, and hsuser.texi
+
+lib/readline/doc/Makefile.in,doc/Makefile.in
+ - made appropriate changes for {{rl,hs}tech,{rl,hs}user}.texi
+
+lib/readline/doc/{rlman,rluserman}.texinfo
+ - changed the suffix from `texinfo' to `texi'
+
+lib/readline/doc/hist.texinfo
+ - renamed to history.texi
+
+ 2/25
+ ----
+pathnames.h.in
+ - moved pathnames.h here so value of DEBUGGER_START_FILE can be
+ substituted by configure
+
+aclocal.m4
+ - added AM_PATH_LISPDIR for debugger
+
+configure.in
+ - added some variables: `bashvers', `relstatus' to use info in more
+ than one place
+ - call AM_PATH_LISPDIR
+ - new option: --enable-debugger, sets DEBUGGER cpp option
+ - new option with AC_ARG_VAR: DEBUGGER_START_FILE
+ - make `pathnames.h' a file generated by configure
+
+Makefile.in
+ - add rule to create pathnames.h
+
+builtins/declare.def
+ - added extra line number and source file name to `declare -F' output
+ if `--debugger' is used at startup
+
+builtins/evalfile.c
+ - call run_return_trap from source_file before returning the result
+ from _evalfile()
+
+execute_cmd.c
+ - call run_return_trap in execute_function before restoring the old
+ context
+
+builtins/source.def
+ - arrange to save and restore DEBUG traps when sourcing files if
+ function_trace_mode (set -o functrace) is not set
+
+print_cmd.c
+ - broke print_for_command, print_select_command, print_case_command
+ into two functions each: one to print the `header' and one for
+ the body
+ - print_cond_command is no longer static
+ - print_arith_command now takes a WORD_LIST *, since it doesn't
+ actually do anything with the ARITH_COM it's passed except print
+ the enclosed WORD_LIST
+ - print_arith_command is no longer static
+
+externs.h
+ - extern declarations for print_{for,select,case}_command_head,
+ print_cond_command, print_arith_command
+
+{.,builtins,lib/sh}/Makefile.in
+ - corrected dependencies on pathnames.h, since it's now created in
+ the build directory
+
+ 3/5
+ ---
+lib/glob/glob.c
+ - handle alloca() failing (it's supposed to return NULL)
+ - use malloc() (with its attendent bookkeeping) instead of alloca()
+ in glob_filename()
+
+subst.c
+ - check whether shell_glob_filename returns NULL in
+ glob_expand_word_list
+ - change parameter_brace_expand_rhs to handle cases like
+ ${a[2]:=value} by properly creating the array element instead of a
+ variable named `a[2]' (reported by <opengeometry@yahoo.ca>)
+
+variables.c
+ - change bind_int_variable to use valid_array_reference instead
+ of looking for `['
+
+lib/readline/vi_mode.c
+ - check for `a' in _rl_vi_done_inserting so the text inserted by an
+ `a' command can be reinserted with a `.'
+
+lib/readline/readline.c
+ - when entering vi insertion mode in readline_internal_setup(), make
+ sure that _rl_vi_last_key_before_insert is set to `i' so that undo
+ groups and redo work better (reported by <opengeometry@yahoo.ca>)
+
+lib/glob/sm_loop.c
+ - handle ?(...) in a pattern immediately following a `*', instead of
+ ignoring the `(' and treating the `?' as a single-char match, as
+ long as FNM_EXTFLAG is set (reported by <anderson110@poptop.llnl.gov>)
+
+aclocal.m4
+ - new test for presence of struct timezone, BASH_STRUCT_TIMEZONE
+
+config.h.in
+ - add HAVE_STRUCT_TIMEZONE
+
+configure.in
+ - call BASH_STRUCT_TIMEZONE
+
+execute_cmd.c
+ - don't try to use `struct timezone' in calls to gettimeofday unless
+ HAVE_STRUCT_TIMEZONE is defined; use (void *)NULL otherwise
+
+ 3/20
+ ----
+execute_cmd.c
+ - new variable, the_printed_command_except_trap, saves the command
+ being executed before a trap is executed, for the debugger
+
+trap.c
+ - if in debugging mode, let command substitutions and other child
+ processes inherit the DEBUG and ERR traps if the `functrace'
+ (which is really a bad name, given this semantic) or `errtrace'
+ options, respectively, have been set
+
+shell.c
+ - local_pending_command renamed to command_execution_string; no longer
+ static
+
+variables.c
+ - new dynamic variable, BASH_COMMAND, set to the command string
+ currently executing, or the one that caused a trap to execute
+ (mapped to the_printed_command_except_trap)
+ - new variable, BASH_EXECUTION_STRING, set to the argument to the
+ -c invocation option, if the shell was started that way
+
+ 3/22
+ ----
+execute_cmd.c
+ - changed execute_for_command, eval_arith_for_expr,
+ execute_select_command, execute_arith_command, execute_cond_command,
+ execute_simple_command to implement new DEBUG trap semantics
+ for the debugger: if the DEBUG trap commands return a non-zero
+ status and debugging_mode is non-zero, we skip the command to be
+ executed
+
+trap.c
+ - change run_debug_trap for the debugger: if we're in the debugger
+ and the DEBUG trap returns 2 while we're in a function or sourced
+ script, we force a `return'
+
+shell.c
+ - new function, start_debugger(), that sources the debugger start file
+ and turns the debugger on
+
+builtins/shopt.def
+ - new settable option, `extdebug', turns on debugging_mode, as if
+ --debugger had been supplied at invocation (but does not source
+ debugger startup file)
+
+trap.c
+ - make sure that run_exit_trap arranges for `returns' to come back
+ there, too, so a `return' executed by an `exit' invoked within a
+ shell function behaves correctly
+
+support/shobj-conf
+ - change darwin/MacOS X stanza based on advice from mac os x developers
+
+lib/sh/mailstat.c
+ - set the atime member of the synthesized stat struct to 0 if `cur/'
+ is empty, rather than leaving it undefined
+
+ 3/24
+ ----
+builtins/caller.def
+ - new builtin to provide a call stack for the debugger
+
+builtins/evalfile.c
+ - added a second `flags' argument to source_file()
+ - new flag value for flags argument to _evalfile(): FEVAL_NOPUSHARGS.
+ If included in flags arg, it means to not manipulate the BASH_ARGV
+ and BASH_ARGC arrays
+
+builtins/common.h
+ - change prototype for source_file()
+
+builtins/source.def
+ - add flag value to call to source_file(): set to 1 if we replaced
+ the positional parameters
+ - add call to push_args if additional arguments supplied to the
+ source builtin
+ - add call to pop_args in maybe_pop_dollar_vars
+
+execute_cmd.c
+ - run the debug trap in execute_function so the debugger can stop
+ before the first command in a function body is executed
+ - modify subshell_level before executing a builtin or function in a
+ subshell
+ - print `for', `select', `case' command heads when set -x is enabled
+
+print_cmd.c
+ - `xtrace_print_word_list' now takes an additional flags argument,
+ which, if non-zero, says to print indirection_level_string()
+ - new functions to print for, select, and case command heads when
+ set -x is enabled
+ - add spaces after `((' and before `))' in xtrace_print_arith_command
+
+externs.h
+ - changed extern declaration for xtrace_print_word_list
+ - new declarations for xtrace_print_{for,case,select}_command_head()
+
+subst.c
+ - modify subshell_level when executing a command substitution
+
+ 3/25
+ ----
+execute_cmd.c
+ - use `line_number' in executing_line_number instead of looking into
+ the current command if it's a simple command; rearrange code to
+ make this simpler to compile in and out
+ - need to save and restore value of currently_executing_command around
+ calls to debug trap and return trap in execute_function
+
+make_cmd.c
+ - make sure make_arith_for_command() disposes the WORD_LIST * it is
+ passed, since nothing else does and it's not used directly
+
+ 3/28
+ ----
+Makefile.in
+ - fixed dependencies for `error.o' on shell.h and version.h -- makes
+ parallel makes (gmake -j 4) work correctly
+
+doc/{bash.1,bashref.texi}
+ - documented all new features added to support the debugger
+
+ 4/1
+ ---
+lib/sh/shquote.c
+ - make sure CTLESC and CTLNUL characters are escaped with CTLESC
+ by sh_double_quote, sh_backslash_quote and
+ sh_backslash_quote_for_double_quotes
+ Fixes vulnerability reported by svdb@stack.nl
+
+shell.h
+ - new `pipestatus' member of sh_parser_state_t, to save and restore
+ $PIPESTATUS
+
+parse.y
+ - changes to save_parser_state and restore_parser_state to save and
+ restore $PIPESTATUS
+
+builtins/read.def
+ - add a call to word_list_remove_quoted_nulls before assigning the
+ word list read from standard input to an array variable. Fixes
+ bug reported by holzhey@ppprs1.phy.tu-dresden.de
+
+ 4/3
+ ---
+execute_cmd.c
+ - in execute_null_command, if redirections are supplied, make sure
+ things like 3</etc/passwd are undone immediately, since they're
+ being done in the current shell
+ - functions now inherit the RETURN trap only if function tracing is
+ on for that function or globally
+
+lib/readline/misc.c
+ - in rl_replace_from_history, don't force rl_replace_line to clear
+ the undo_list, since it might point directly at an undo list
+ from a history entry (to which we have no handle)
+
+ 4/4
+ ---
+trap.c
+ - initialize RETURN_TRAP stuff appropriately in initialize_traps()
+ - let command substitutions inherit the RETURN trap if we're in
+ the debugger and function tracing has been enabled
+
+redir.c
+ - do_redirections and do_redirection_internal now take a single
+ flags argument instead of multiple boolean flags
+
+redir.h
+ - new #defines for flags argument to do_redirection{s,_internal}
+
+execute_cmd.c
+ - change all calls to do_redirection to use new flag values
+
+parse.y
+ - new function, free_pushed_string_input(), an external interface to
+ clear the pushed_string list (alias expansion)
+ - new define SHOULD_PROMPT to say when it's OK to call prompt_again
+ (if the shell is currently interactive and is reading input from
+ the terminal or readline)
+ - make sure shell_getc and read_secondary_line only call prompt_again
+ if SHOULD_PROMPT evaluates to true
+ - prompt_again shouldn't do anything if the shell is currently in the
+ middle of expanding a multiline alias, since we won't be printing a
+ prompt anyway
+
+externs.h
+ - new extern declaration for free_pushed_string_input()
+
+execute_cmd.c
+ - command_substitute and process_substitute now call
+ free_pushed_string_input because they shouldn't deal with any
+ partial alias expansion the parent shell may have started
+
+ 4/5
+ ---
+braces.c
+ - added {x..y} brace expansion, shorthand for {x,x+1,x+2,...,y}:
+ x, y can be integers or single characters; the sequence can be
+ ascending or descending; increment is always 1. Beware that
+ something like {a..A} can lead to non-letters.
+
+ 4/7
+ ---
+subst.c
+ - change extract_delimited_string and extract_dollar_brace_string to
+ return NULL on an expansion error when no_longjmp_on_fatal_error
+ is set, so the calling functions don't assume that the expansion
+ was successful (primarily the prompt expansion and completion code)
+
+doc/{bash.1,bashref.texi}
+ - documented new sequence generation feature of brace expansion
+
+ 4/8
+ ---
+lib/sh/strstr.c
+ - replacement for strstr(3), in case the C library doesn't provide it
+
+configure.in
+ - check for strstr, add to LIBOBJS if not found
+
+array.c
+ - array_walk now takes a third void * argument; it's passed to `func'
+ as its second argument
+
+array.h
+ - change sh_ae_map_func_t prototype to add void * second argument
+
+ 4/10
+ ----
+array.c
+ - new function: array_keys_to_word_list, returns a list of indices for
+ a given array
+
+array.h
+ - new extern declaration for array_keys_to_word_list
+
+arrayfunc.c
+3 - new function: char *array_keys(), returns a string with keys for a
+ given array, with the appropriate quoting
+
+arrayfunc.h
+ - new extern declaration for array_keys
+
+subst.c
+ - code to implement ksh93-like ${!array[@]} expansion (array[*] works,
+ too), which expands to all the keys (indices) of ARRAY
+
+doc/{bash.1,bashref.texi}
+ - documented new ${!array[@]} expansion
+
+ 4/19
+ ----
+builtins/setattr.def
+ - remove any mention of the `-n' option from readonly builtin's short
+ and long documentation
+
+pcomplib.c
+ - fix progcomp_insert to increase the refcount on the `cs' argument
+ before calling hash_insert -- fixes the problem of multiple calls
+ to progcomp_insert with the same compspec
+
+doc/bash.1
+ - add mention of characters that inhibit history expansion when found
+ immediately following an unquoted `!'
+
+bashline.c
+ - convert the code conditionally compiled in by the NO_FORCE_FIGNORE
+ #define to something runtime-tunable with the `force_fignore'
+ variable (opposite sense). force_fignore is 1 by default
+
+builtins/shopt.def
+ - new tunable `shopt' option: `force_fignore', controls force_fignore
+ variable and behavior of FIGNORE handling
+
+lib/readline/complete.c
+ - new variable, _rl_complete_show_unmodified, causes completer to list
+ possible completions if more than one completion and partial
+ completion cannot be done
+ - new value for what_to_do argument to rl_complete_internal, `@',
+ indicating that we want the show-unmodified behavior
+ - change rl_completion_type to return `@' when appropriate
+
+lib/readline/bind.c
+ - new bindable variable, show-all-if-unmodified, which controls value
+ of _rl_complete_show_unmodified
+
+lib/readline/rlprivate.h
+ - extern declaration for _rl_complete_show_unmodified
+
+lib/readline/doc/rluser.texi
+ - documented show-all-if-unmodified
+
+lib/readline/doc/rltech.texi
+ - documented new `@' value for second argument to rl_complete_internal
+ - documented new return value from rl_completion_type
+
+ 4/22
+ ----
+lib/readline/signals.c
+ - in rl_set_signal, set sa_flags to SA_RESTART for SIGWINCH, if we
+ have POSIX signals -- this is what most applications expect, and
+ they're not prepared to deal with EINTR
+
+ 4/25
+ ----
+bashline.c
+ - take out attempts to suppress readline filename completion when
+ attempting command completion and there is a directory with the
+ same name in the current directory. #if 0'd for now; maybe make
+ it conditional later
+
+error.c
+ - new variable, gnu_error_format, causes non-interactive errors with
+ line numbers to be printed in the `gnu style' (filename:lineno:)
+ instead of the `shell style' (filename: line lineno:) by
+ error_prolog and parser_error
+
+version.h,support/mkversion
+ - don't put extern function declarations into created version.h any
+ more
+
+version.c,externs.h
+ - add extern declarations for show_shell_version() and
+ shell_version_string(), since they're no longer in version.h
+ (this backs out change from 9/10/2001)
+
+shell.h
+ - don't include version.h
+
+Makefile.in
+ - remove unneeded dependencies on version.h -- only version.o
+ needs it now
+
+builtins/shopt.def
+ - new option `gnu_errfmt', changes error messages with line numbers
+ to use the `standard' gnu format
+
+pcomplete.h
+ - new COPT_BASHDEFAULT and COPT_PLUSDIRS defines
+
+bashline.c
+ - if the COPT_BASHDEFAULT flag is set, try the rest of the bash
+ default completions if a compspec with that flag set generates
+ no matches
+ - broke bash completions out into separate function:
+ bash_default_completion(const char *text, int start, int end,
+ int qc, int in_command_position); change attempt_shell_completion
+ to call it
+
+bashline.h
+ - new extern declaration for bash_default_completion
+
+builtins/complete.def
+ - added code to compgen to call bash_default_completion if a compspec
+ with the COPT_BASHDEFAULT flag set generates no matches from the
+ programmable completion options
+
+doc/{bash.1,bashref.texi}
+ - document new `gnu_errfmt' shopt option
+
+doc/bash.1,lib/readline/doc/rluser.texi
+ - document new `-o bashdefault' option to complete and compgen
+
+ 4/26
+ ----
+pcomplete.c
+ - if a compspec has the COPT_PLUSDIRS flag set, generate any
+ directory name completions and add them to the set of possible
+ completions as the last thing in gen_compspec_completions
+
+builtins/complete.def
+ - add new `-o plusdirs' option to complete and compgen; means to
+ do directory name completion in addition to other actions
+ specified by the compspec, and do it last
+
+ 5/12
+ ----
+copy_cmd.c
+ - fix copy_{for,select,case}_command to copy the line member
+
+ 5/13
+ ----
+lib/readline/rlmbutil.h,include/shmbutil.h
+ - new #define MB_INVALIDCH, evaluates to true if return value from
+ mbrtowc or mbrlen denotes an invalid multibyte character
+ - new #define MB_NULLWCH, evaluates to true if return value from
+ mbrtowc or mbrlen denotes a null multibyte character
+
+lib/readline/complete.c
+ - new function, fnwidth(), returns printed length of a filename,
+ correctly handling multibyte characters
+ - new function, fnprint(), displays a filename on rl_outstream
+ correctly handling multibyte characters
+ - use fnwidth() instead of simple strlen() for length calculations
+ in display_matches
+
+lib/readline/{display,mbutil}.c
+ - use MB_INVALIDCH and MB_NULLWCH as appropriate
+
+ 5/21
+ ----
+configure.in
+ - turn off the builtin malloc on GNU/FreeBSD systems (GNU userland,
+ FreeBSD kernel)
+
+ 5/24
+ ----
+pcomplete.c
+ - in programmable_completions, copy the compspec before using it to
+ generate the possible completions, allowing the completion for the
+ command to be changed by the compspec itself without causing a
+ core dump because the shell frees freed memory (reported by
+ marcus.harnish@gmx.net)
+
+parse.y
+ - in shell_getc, don't call notify_and_cleanup in an interactive shell
+ unless the shell is currently reading from the terminal and would
+ print a prompt. This fixes programmable completions printing job
+ notifications (reported by r.d.green@lancaster.ac.uk)
+ - use SHOULD_PROMPT macro consistently
+
+shell.c
+ - use get_string_value instead of getenv when looking up $TERM and
+ $EMACS to see whether the shell is running under emacs
+ - check for `TERM=dumb' as well as `EMACS=t' to decide whether or
+ not to turn off command-line editing in emacs shell windows
+ (reported by jik@kamens.brookline.ma.us)
+
+ 5/28
+ ----
+expr.c
+ - save and restore the `evalbuf' context, since evalexp can be
+ called recursively (e.g. a[b[c]])
+
+ 5/29
+ ----
+builtins/common.c
+ - in display_signal_list, when displaying for `kill -l' in posix mode,
+ display signal names without the `SIG' prefix
+
+doc/bashref.texi
+ - documented changed to posix mode behavior of kill -l
+
+builtins/kill.def
+ - changed the error message printed when argument is not a pid or
+ job id
+
+doc/{bash.1,bashref.texi}
+ - fixed a slight inconsistency in the different sections describing
+ the `promptvars' option
+
+doc/Makefile.in
+ - new rule to create `bash.info' from `bashref.info' by running sed
+ to change the internal references. This makes the installed
+ bash.info work right
+ - make the install target install bash.info after it's been modified
+ from bashref.info
+
+ 5/30
+ ----
+builtins/cd.def
+ - after testing with ferror(), call clearerr if ferror() evaluates
+ to true
+
+execute_cmd.c
+ - call clearerr(stdout) after executing a builtin or function,
+ before restoring any redirections
+
+bashhist.c
+ - initialize history_comment_char in bash_history_initialize
+
+builtins/alias.def
+ - if posix mode is enabled, and the `-p' option is not supplied, don't
+ list aliases with a preceding `alias ', as POSIX.2 specifies
+
+doc/bashref.texi
+ - note new posix mode behavior of displaying alias names and values
+ - note new posix mode behavior of trap builtin not checking first
+ argument to be a possible signal specification
+ - note new posix mode behavior of `kill' not accepting signal names
+ with a leading `SIG'
+
+include/stdc.h,lib/readline/rlstdc.h
+ - don't check the __STRICT_ANSI__ define when deciding whether or not
+ to #undef __attribute__
+
+trap.[ch]
+ - decode_signal and signal_object_p take an additional flags arg to
+ satisfy POSIX.2 signal name translation requirements
+ - change decode_signal to honor the new DSIG_NOCASE (match case-
+ insensitively) and DSIG_SIGPREFIX (allow signal specifications
+ with the `SIG' prefix) flags
+
+builtins/{common.c,{trap,kill}.def}
+ - change calls to decode_signal to add the new argument with
+ appropriate values. For kill, POSIX.2 says case-insensitive without
+ the `SIG' prefix. For trap, POSIX.2 says applications may decode
+ case-insensitively and with the SIG prefix
+
+builtins/trap.def
+ - when in posix mode, don't check for the first argument being a
+ possible signal spec and revert the signal handling to the
+ original disposition
+
+ 6/1
+ ---
+shell.h
+ - new MATCH_STARSUB define, to tell the callers of the various pattern
+ substitution and removal functions that call string_list to treat
+ "$*" and "${array[*]}" appropriately
+subst.c
+ - if get_var_and_type encounters an array variable subscripted by `*'
+ or `$*', return VT_STARSUB or'd into the variable type value
+ - callers of get_var_and_type check for VT_STARSUB in the returned type
+ this will fix problems with ${*...} not being separated with the
+ first character of $IFS when double-quoted
+ - in parameter_brace_patsub, set MATCH_STARSUB if VT_STARSUB is set by
+ get_var_and_type
+ - change pos_params_pat_subst to call string_list_dollar_star if
+ the match flags include MATCH_STARSUB
+ - change parameter_brace_substring to call array_subrange with an
+ additional argument indicating the character indexing the array
+
+array.c
+ - change array_patsub to join the modified array elements with the
+ first character of $IFS if MATCH_STARSUB is set in the match flags
+ passed in
+ - array_subrange now takes an additional argument indicating the
+ index type -- used to separate with first char of $IFS if the
+ index char is `*' and the expression is double-quoted
+
+array.h
+ - change prototype declaration of array_subrange to add additional arg
+
+ 6/2
+ ---
+doc/FAQ
+ - merged in some updates about POSIX from Andrew Josey
+
+ 6/3
+ ---
+bashjmp.h
+ - new value for jump_to_top_level: ERREXIT
+
+{eval,shell,subst,trap}.c,builtins/evalstring.c
+ - ERREXIT is (for now) equivalent to EXITPROG as a value from
+ jump_to_top_level
+
+ 6/9
+ ---
+doc/bash.1,lib/readline/doc/readline.3
+ - documented new `show-all-if-unmodified' readline variable
+
+ 6/14
+ ----
+lib/readline/history.c
+ - new function, histdata_t free_history_entry (HIST_ENTRY *h),
+ frees H and its line, returning the application-specific data
+ - use free_history_entry where appropriate
+
+lib/readline/history.h
+ - extern declaration for free_history_entry()
+
+lib/readline/doc/{history.3,hstech.texi}
+ - document free_history_entry
+
+ 6/16
+ ----
+lib/readline/readline.[ch]
+ - changed varions defines for readline/history library versions to 5.0
+
+subst.c
+ - pass information about whether or not an indirectly-expanded variable
+ contains ${array[@]}, ${array[*]}, $@, or $*
+ - new function, chk_atstar, performs checks for ${array[@]},
+ ${array[*]}, $@, or $* for the parameter_brace_expand* functions and
+ sets flags (passed as args) to the results
+ - call chk_atstar from parameter_brace_expand_indir and
+ parameter_brace_expand
+
+ 6/28
+ ----
+doc/{bash.1,bashref.texi}
+ - clarified that (...) commands are executed in a subshell environment
+
+ 6/30
+ ----
+lib/readline/bind.c
+ - fix a problem with parsing nested if statements in inputrc files
+ (fix from dimakar@yahoo.com)
+
+ 7/3
+ ---
+{jobs,nojobs}.c
+ - fix places that use the return value from strsignal() to check
+ for NULL return values using a new function, j_strsignal()
+
+builtins/kill.def
+ - removed JOB_CONTROL restriction; kill is now available as a builtin
+ when the shell is built without job control
+
+ 7/10
+ ----
+jobs.c
+ - some systems have WIFCONTINUED but not WCONTINUED; separate the
+ #defines
+
+ 7/14
+ ----
+lib/readline/history.h
+ - new `timestamp' member of a HIST_ENTRY
+ - extern declarations for add_history_time and history_get_time
+
+lib/readline/doc/{history.3,hstech.texi}
+ - document add_history_time and history_get_time
+
+lib/readline/history.c
+ - implementations of history_get_time and add_history_time
+ - change add_history to initialize the timestamp information
+ - change free_history_entry to free the timestamp
+ - change replace_history_entry to duplicate the timestamp
+ - change history_total_bytes to add the memory taken by the time
+ stamps
+
+bashhist.c,builtins/history.def
+ - use free_history_entry where appropriate
+
+lib/readline/histfile.c
+ - changes to read_history_range to deal with new history file format
+ including timestamps
+ - changes to history_do_write to write out the timestamp information
+ - changes to history_truncate_file to understand the timestamp
+ information
+
+ 7/22
+ ----
+doc/{bash.1,bashref.texi}
+ - fixed function declaration documentation to specify that any compound
+ command may be used as the function body, not just a group command
+
+ 7/23
+ ----
+lib/readline/histfile.c
+ - don't allocate space for null timestamps in history_do_write, and
+ don't write out null timestamp entries
+
+parse.y
+ - fix CHECK_FOR_RESERVED_WORD to call time_command_acceptable() and
+ return TIME if the token is "time" and `time' is legal in that
+ context
+
+ 7/29
+ ----
+lib/sh/fmtulong.c
+ - include <inttypes.h> for possible definitions of intmax_t, uintmax_t
+ (reported by ro@techfak.uni-bielefeld.de)
+
+ 7/30
+ ----
+parse.y
+ - remove checking for `time' reserved word from special_case_tokens();
+ use regular mechanism in CHECK_FOR_RESERVED_WORD. This allows `time'
+ to be aliased. (Reported by Glenn Morris
+ <gmorris+gmane@ast.cam.ac.uk>)
+
+ 7/31
+ ----
+lib/readline/history.h
+ - extern declaration for history_write_timestamps
+
+lib/readline/histfile.c
+ - don't write timestamps to the history file in history_do_write
+ unless history_write_timestamps is set to non-zero by the application
+ (set to 0 by default)
+
+lib/readline/doc/{hstech.texi,history.3}
+ - document history_write_timestamps
+
+variables.[ch]
+ - new special variable function, HISTTIMEFORMAT; special function
+ sets history_write_timestamps to 1 if HISTTIMEFORMAT is set
+
+ 8/4
+ ---
+builtins/history.def
+ - added support for printing time stamps based on the value of the
+ HISTTIMEFORMAT variable when displaying history entries
+
+doc/{bash.1,bashref.texi}
+ - added description of new HISTTIMEFORMAT variable
+
+ 8/5
+ ---
+config-top.h
+ - remove /usr/ucb from any default paths
+
+mailcheck.c
+ - make_default_mailpath now returns NULL if DEFAULT_MAIL_DIRECTORY
+ is not defined
+ - remember_mail_dates now returns if make_default_mailpath returns
+ NULL
+
+config-bot.h
+ - reorganized the sections; provide an explicit placeholder for
+ builders to #undef any feature defines they don't want that
+ configure creates for them, like the default mail path
+
+ 8/9
+ ---
+config.h.in
+ - add HAVE_REGEX_H, HAVE_REGCOMP, HAVE_REGEXEC for detection of POSIX.2
+ regular expression functions
+ - add COND_REGEXP define to enable and disable the =~ operator for
+ matching extended regular expressions in [[...]] commands
+
+configure.in
+ - new option, --enable-cond-regexp, enables =~ and code to perform
+ regular expression matching in [[...]]
+
+config-bot.h
+ - undef COND_REGEXP if the OS doesn't provide posix regexp support
+
+doc/bashref.texi
+ - documnent new --enable-cond-regexp option to configure
+
+ 8/18
+ ----
+support/shobj-conf
+ - support for shared objects on FreeBSD-gnu (from Robert Millan)
+
+ 8/25
+ ----
+lib/sh/shmatch.c
+ - new file, shell interface to posix extended regular expression
+ matching
+
+externs.h
+ - new extern declarations for functions in shmatch.c
+
+execute_cmd.c
+ - incorporate code into execute_cond_node that does extended regular
+ expression matching for the =~ operator
+
+parse.y
+ - add `=~' to the list of binary operators accepted by the conditional
+ command parser
+
+doc/{bash.1,bashref.texi}
+ - documented =~ conditional binary operator and the BASH_REMATCH
+ variable
+
+ 8/27
+ ----
+lib/readline/display.c
+ - take multibyte characters into account when looking for quoted
+ substrings on which to do completion (fix from jir@yamato.ibm.com)
+
+lib/readline/util.c
+ - fix typo in _rl_strpbrk
+
+lib/readline/rldefs.h
+ - use function version of _rl_strpbrk in multibyte locales, because
+ it understands to skip over special characters in multibyte
+ character sequences
+
+ 8/28
+ ----
+jobs.c
+ - in wait_for, check for window size changes if a job that exits due
+ to a signal or is stopped was in the foreground, not just if it's
+ the current job
+
+ 9/10
+ ----
+support/config.{guess,sub}
+ - add support to recognize FreeBSD running on the amd64
+
+subst.c
+ - if the new `fail_glob_expansion' variable is non-zero, globbing that
+ fails to match anything causes an expansion error
+
+builtins/shopt.def
+ - new `failglob' expansion: if enabled, failed globs cause an error
+
+test/shopt.right
+ - take `failglob' into account
+
+doc/{bash.1,bashref.texi}
+ - documented new `failglob' option and its effects
+
+ 9/12
+ ----
+findcmd.c
+ - fix file_status to treat the mode bits and uid right -- in particular,
+ don't assume the `other' bits always apply. Bug reported by
+ <moseley@hank.org>; fix inspired by <carlo@alinoe.com>
+
+command.h
+ - new word flag: W_NOCOMSUB, meaning to not perform command
+ substitution on a word
+
+subst.c
+ - new flag for param_expand: PF_NOCOMSUB. If non-zero, $(...)
+ command substitutions are not expanded, but returned unchanged
+ - change expand_word_internal to pass through `` command substitutions
+ unchanged if (word->flags & W_NOCOMSUB) != 0
+ - change expand_word_internal to pass PF_NOCOMSUB to param_expand
+ if (word->flags & W_NOCOMSUB) != 0
+
+builtins/shopt.def
+ - rename set_interactive_comments to set_shellopts_after_change, which
+ more accurately reflects its purpose
+
+syntax.h
+ - add a define for isblank() in case the system doesn't provide one
+
+jobs.c
+ - change raw_job_exit_status to understand `pipefail', using the new
+ `pipefail_opt' variable
+
+flags.[ch]
+ - declare pipefail_opt
+ - reset pipefail_opt to 0 in reset_shell_flags
+
+builtins/set.def
+ - add `set -o pipefail' and document it in help output
+
+doc/{bash.1,bashref.texi}
+ - document `set -o pipefail' and the effect of the pipefail option
+
+mksyntax.c,syntax.h
+ - sh_syntaxtab is no longer `const'
+ - new generated variable, sh_syntabsiz, set to number of entries in
+ sh_syntaxtab, written to generated syntax.c
+
+locale.c
+ - new function, locale_setblanks(), sets each member of the current
+ locale's <blank> class to have the CSHBRK flag in sh_syntaxtab
+
+ 9/17
+ ----
+arrayfunc.c
+ - change convert_var_to_array to not set array[0] to a NULL value
+ (if the scalar variable had no value; e.g., after being created
+ with `local arrayvar')
+
+lib/readline/display.c
+ - save and restore the value of prompt_invis_chars_first_line in
+ rl_{save,restore}_prompt, and reinitialize it to 0 before printing
+ something in the message area
+
+lib/readline/bind.c
+ - new functions: rl_bind_keyseq_if_unbound_in_map(ks, func, kmap);
+ binds key sequence KS to function FUNC in keymap KMAP, and
+ rl_bind_keyseq_if_unbound (ks, func); binds key sequence KS to
+ function FUNC in the current keymap
+
+lib/readline/readline.h
+ - extern function declarations for rl_bind_keyseq_if_unbound_in_map and
+ rl_bind_keyseq_if_unbound
+
+lib/readline/{readline,terminal}.c
+ - _rl_bind_if_unbound -> rl_bind_keyseq_if_unbound
+
+lib/readline/{bind.c,rlprivate.h}
+ - remove _rl_bind_if_unbound
+
+ 9/18
+ ----
+lib/readline/doc/rltech.texi
+ - document rl_bind_keyseq_if_unbound and
+ rl_bind_keyseq_if_unbound_in_map
+
+ 9/19
+ ----
+lib/readline/bind.c
+ - new functions rl_bind_key_if_unbound_in_map and
+ rl_bind_key_if_unbound; analogous to (and implemented in terms of)
+ keyseq functions
+ - rl_bind_keyseq_in_map: a new function, equivalent to rl_set_key
+ (which remains for backwards compatibility); changed callers to
+ use it
+ - new function, rl_bind_keyseq, equivalent to rl_bind_keyseq_in_map
+ with a third argument of _rl_keymap
+
+lib/readline/readline.h
+ - extern declarations for rl_bind_key_if_unbound_in_map and
+ rl_bind_key_if_unbound
+ - extern declarations for rl_bind_keyseq_in_map and rl_bind_keyseq
+
+lib/readline/doc/rltech.texi
+ - document rl_bind_keyseq and rl_bind_keyseq_in_map
+
+configure.in
+ - require at least readline-5.0
+
+config-bot.h
+ - define SYS_SIGLIST_DECLARED if it's not defined, but
+ HAVE_DECL_SYS_SIGLIST is, to deal with differences between
+ autoconf versions
+
+bashline.c
+ - use rl_bind_key_if_unbound_in_map when binding bash keybindings in
+ initialize_readline(), so inputrc files can override them
+
+ 9/22
+ ----
+lib/readline/histsearch.c
+ - do better bounds checking for history_offset and history_length in
+ history_search_internal
+
+builtins/history.def
+ - in delete_last_history(), make sure we don't leave the history
+ offset longer than the history length after calling delete_histent
+
+ 9/23
+ ----
+jobs.c
+ - small change to notify_of_job_status so job status messages get
+ printed even if the shell was started to run `-c command'. The
+ old behavior was intentional, but I cannot remember why, so we'll
+ try it the other way for a while (debian bash bug #211693)
+
+ 9/24
+ ----
+jobs.c
+ - slightly modify change from 9/23 so that jobs started to run
+ command substitutions don't print job status messages
+
+ 9/25
+ ----
+lib/readline/search.c
+ - when reading a non-incremental search string from the terminal,
+ use a separate undo list rather than chaining it to the undo list
+ from the rest of the line, since the whole undo list will get
+ freed when the search string is complete
+
+lib/readline/readline.h
+ - changed the defines guarding the stdarg prototype for rl_message to
+ match what's actually used in display.c, where it's defined
+
+ 9/26
+ ----
+[bash-3.0-alpha released]
+
+ 9/29
+ ----
+lib/sh/shmatch.c
+ - fix to build correctly when arrays are not compiled into the shell
+
+subst.c
+ - fix command substitution to run any exit trap defined in the
+ command substitution before returning; the exit trap is not inherited
+ from the calling shell
+
+lib/readline/shell.c
+ - change sh_set_lines_and_columns to free the memory allocated and
+ passed to setenv(), since setenv is specified by POSIX to allocate
+ new memory and copy its arguments
+
+jobs.c
+ - change logic in make_child so that every child process attempts to
+ set the terminal's process group to the pipeline's process group
+ when PGRP_PIPE is defined, just like when it's undefined. This is
+ reported to fix some tricky synchronization problems on Red Hat
+ Enterprise Linux 3. Fix from Ernie Petrides <petrides@redhat.com>.
+
+ 9/30
+ ----
+builtins/printf.def
+ - tescape no longer needs a `trans_squote' argument, since it's the
+ same as the `sawc' argument. The `sawc' argument now means to do
+ the %b argument processing if non-null
+ - fix processing of octal constants for %b arguments (\0 followed by
+ up to three octal digits) and other escape sequences (\ followed by
+ up to three octal digits)
+ - hex constants `\xHHH' are now allowed to contain any positive
+ number of digits; previously they were restricted to two [removed]
+ - allow two new escape sequences: \" and \?, for compatibility with
+ ksh93 and ANSI C
+
+doc/{bash.1,bashref.texi}
+ - documented processing that printf performs for arguments to %b
+ escape sequences
+
+lib/sh/strtrans.c
+ - add \" and \? to escape sequences recognized by `echo -e'
+
+ 10/1
+ ----
+version.c
+ - use snprintf instead of sprintf if configure tells us we have it
+
+ 10/3
+ ----
+subst.c
+ - in list_remove_pattern, take into account the fact that one of the
+ list elements may be NULL, and don't free the result of
+ remove_pattern() without checking
+ - in remove_pattern, return savestring(param) if *param == '\0',
+ since callers expect to free() non-null return values
+
+ 10/4
+ ----
+subst.c
+ - change verify_substring_values to make it clearer that the first
+ offset deals with array indices and the second deals with numbers
+ of elements, when doing array subranges with ${a[@]:e1:e2}
+
+array.c
+ - change array_subrange to make it explicit that the second offset
+ argument is a count of the desired number of elements, not an
+ ending index. This deals with sparse arrays correctly.
+
+ 10/6
+ ----
+variables.c
+ - fix memory leak in assign_in_env
+
+ 10/8
+ ----
+subst.c
+ - in parameter_brace_expand, check that the last characters are `]}'
+ before checking for ${!array[@]}
+
+execute_cmd.c,builtins/source.def
+ - push and pop the args (BASH_ARGV and BASH_ARGC) when executing a
+ shell function or sourcing a script only when in debugging mode
+
+ 10/11
+ -----
+arrayfunc.c
+ - make sure array_variable_name returns values for the SUBP and LENP
+ arguments if they're non-null, since callers expect to use them
+ even if the array subscript is bad
+
+error.c
+ - call exit_shell instead of sh_exit from parser_error and
+ report_error so the right things happen (running exit trap, doing
+ the right interactive cleanup, etc.)
+
+lib/readline/complete.c
+ - new variable, rl_completion_quote_character, set to any quote char
+ readline thinks it finds before any application completion
+ function is called
+ - new variable, rl_completion_suppress_quote, settable by an
+ application-specific completion function. If set to non-zero, the
+ completion code does not append a closing quote in append_to_match
+
+lib/readline/readline.h
+ - extern declarations for rl_completion_quote_character and
+ rl_completion_suppress_quote
+
+bashline.c
+ - set rl_completion_suppress_quote in command_subst_completion_function
+ because that would be inserted before any closing "`" or ")", which
+ is somewhat disconcerting
+
+lib/readline/doc/rltech.texi
+ - documented rl_completion_suppress_quote and
+ rl_completion_quote_character
+
+ 10/13
+ -----
+bashhist.c
+ - use sv_histchars instead of setting history_comment_char directly in
+ bash_initialize_history so assignments to $histchars made in
+ ~/.bashrc are honored
+
+ 10/21
+ -----
+trap.c
+ - make sure run_exit_trap sets `running_trap' appropriately
+ - new variable, trap_saved_exit_value, set to last_command_exit_value
+ before running any trap commands; available to the rest of the
+ shell; use trap_saved_exit_value to replace some function-local
+ variables
+
+builtins/exit.def
+ - if the shell is running the exit trap, and no argument is given
+ to `exit', use trap_saved_exit_value as the exit status instead
+ of the last command exit value (which could be the previous command
+ run in the exit trap), as required by POSIX.2
+
+ 10/25
+ -----
+doc/{bash.1,bashref.texi}
+ - add `alias' to the list of documented `assignment statement' builtins
+
+ 11/1
+ ----
+doc/bash.1
+ - remove the `.' from the sample $PATH value
+
+parse.y
+ - make sure parse_compound_assignment prompts with $PS2 if it reads
+ a newline while parsing the compound assignment statement. Bug
+ reported by Stephane Chazelas
+ - parse_string_to_word_list now takes a new second argument: `int flags'
+ - new parser state flag: PST_COMPASSIGN; indicates that the shell is
+ parsing a compound assignment statement
+ - parse_string_to_word_list turns on PST_COMPASSIGN if `flags' arg
+ has low bit set
+ - turn PST_COMPASSIGN on and off in parse_compound_assignment
+
+externs.h
+ - change prototype declaration for parse_string_to_word_list
+
+arrayfunc.c
+ - change call to parse_string_to_word_list to add new flags arg
+
+general.c
+ - assignment() takes a new `flags' second argument
+ - if `flags' is non-zero, accept `[' as a legal assignment statement
+ starter character (for parsing compound array assignments)
+
+general.h
+ - add new argument to prototype declaration for assignment()
+
+parse.y,{subst,variables}.c, builtins/{setattr,declare}.def
+ - change calls to assignment() (parse.y calls with flags == 1 when
+ parser_state inlcudes PST_COMPASSIGN)
+
+arrayfunc.c
+ - in assign_array_var_from_string(), don't treat an expanded word
+ of the form [ind]=value specially unless the W_ASSIGNMENT flag is
+ set. This means that words that are the result of expansions but
+ happen to have the same format as compound assignment statement
+ words will not be treated as such. For instance
+
+ v='[12]=foobar'
+ a=( $v )
+
+ will result in a[0]='[12]=foobar' instead of a[12]=foobar. This
+ is closer to how `regular' assignment statements are treated and
+ compatible with ksh93. Bug reported by Stephane Chazelas
+
+shell.c
+ - new --protected argument, disables command substitution when used
+ with --wordexp (like --wordexp, it remains undocumented)
+ - change run_wordexp to turn on the W_NOCOMSUB flag in each word
+ to be expanded if protected_mode is set
+
+ 11/7
+ ----
+doc/{bash.1,bashref.texi}
+ - clarified the language concerning inherited signal dispositions and
+ when traps are run
+
+support/shobj-conf
+ - slight changes to the darwin (Mac OS X) stanza for MacOS X 10.3
+ (for the readline shared library builds, which shares this script)
+
+lib/readline/histexpand.c
+ - change to make `^' behave as equivalent to word one, as csh does,
+ and as the documentation states
+
+lib/readline/display.c
+ - in update_line, make sure to use col_lendiff in all calculations
+ where the cursor position is concerned (like when calculating
+ the value of _rl_last_c_pos). Fixes bug reported by Andreas
+ Schwab
+
+ 11/12
+ -----
+trap.c
+ - make _run_trap_internal catch `return' builtin longjmps and clean
+ up before longjmping on to where the return was intended to go
+ (fixes bug with not turning off SIG_INPROGRESS flag when `return'
+ executed in trap command)
+
+ 11/18
+ -----
+builtins/cd.def
+ - in posix mode, set errno to ENOTDIR if canonicalization fails,
+ unless the canonicalization functions leave it set to ENOENT
+
+ 11/25
+ -----
+make_cmd.c
+ - in make_simple_command, don't blindly dereference element.redirect
+
+parse.y
+ - the list_terminator production now has an `int' value so it can be
+ used in other grammar productions
+ - add a rule that makes `time' on a line by itself time a null
+ command (this is iffy)
+
+ 11/28
+ -----
+subst.c
+ - change the pattern substitution code (${var//pat/rep}) to use the
+ same pattern expansion function (getpattern()) as the pattern
+ removal expansions. This has the effect of no longer performing
+ quote removal on the pattern before trying to match it. This
+ fixes an incompatibility with ksh93 reported on comp.unix.shell
+
+nojobs.c
+ - add replacement function for siginterrupt on the off chance that a
+ system has posix signals but lacks siginterrrupt
+
+lib/readline/display.c
+ - fix from Tim Waugh at Red Hat to speed up inserting characters into
+ long lines in a UTF-8 environment by optimizing the calculation of
+ the first difference between old and new lines by checking to see
+ whether the old line is a subset of the new
+
+ 11/29
+ -----
+lib/malloc/stats.c
+ - break code that opens file (and interprets %p) into separate function
+ _imalloc_fopen(char *s, char *fn, char *def, char *defbuf, size_t defsiz)
+ for use by rest of library
+ - default stats file is now `stats.PID'
+
+lib/malloc/trace.c
+ - new function, malloc_set_tracefn (char *s, char *fn), sets tracing
+ to the file named by FN (with %p interpolated as the pid), using
+ some default if FN is NULL
+
+lib/malloc/shmalloc.h
+ - new extern declaration for malloc_set_tracefn
+
+ 12/4
+ ----
+execute_cmd.c
+ - combined several common strings from do_piping() into one
+ dup_error() function
+
+builtins/common.[ch]
+ - new function, `sh_notbuiltin(s)' prints error message about s not
+ being a shell builtin
+
+builtins/{builtin,enable}.def
+ - call sh_notbuiltin instead of using literal string
+
+{arrayfunc,expr,error}.c
+ - use one string variable for `bad array subscript' error message; use
+ in calls to various error reporting functions
+
+Makefile.in
+ - add variables for localedir and the PACKAGE_* variables, auto-set
+ by configure
+
+configure.in
+ - un-cache values for gettext, textdomain, and bindtextdomain if they're
+ not in libc but in libintl so the right variables get set
+
+bashintl.h
+ - add necessary defines for marking strings to be translated using
+ gettext
+
+locale.c
+ - set textdomain and directory in set_default_locale
+ - don't call textdomain with the value of $TEXTDOMAIN, since we don't
+ want to override the default domain ("bash")
+ - don't call bindtextdomain unless default_domain already has a value
+ - when translating $"..." strings, use dgettext with the script's
+ default domain (value of $TEXTDOMAIN)
+
+ 12/9
+ ----
+builtins/mkbuiltins.c
+ - include "bashintl.h" in the generated "builtins.c"
+
+support/{config.rpath,mkinstalldirs}
+ - new files to support gettext i18n
+
+ABOUT-NLS
+ - new readme file for gettext internationalization
+
+po/{Makefile.in.in,Rules-quot,boldquot.sed,en@boldquot.header,en@quot.header,insert-header.sin,quot.sed,remove-potcdate.sin}
+po/{POTFILES.in,bash.pot}
+ - new files for gettext
+
+lib/intl
+ - new directory, with libintl stuff from gettext
+
+aclocal.m4
+ - add m4 files from gettext distribution needed by libintl
+
+configure.in
+ - create po/Makefile.in and lib/intl/Makefile in AC_OUTPUT
+ - add call to AM_GNU_GETTEXT to initialize gettext stuff
+
+Makefile.in
+ - use mkinstalldirs instead of mkdirs in the `installdirs' target
+ - changes for intl/ and po/ subdirectories in build and install
+ - changes to have libintl linked in, as determined by configure
+ - changes to have libintl built, just in case it's used (though I'd
+ rather not)
+
+ 12/10
+ -----
+config.h.in
+ - additional #defines required by the libintl library
+ - add ENABLE_NLS define for AM_GNU_GETTEXT
+ - take out defines for HAVE_{BINDTEXTDOMAIN,GETTEXT,TEXTDOMAIN}
+
+configure.in
+ - removed old tests for libintl and gettext/textdomain/bindtextdomain
+
+locale.c
+ - remove HAVE_GETTEXT code; we have gettext unconditionally now
+
+bashintl.h
+ - change to include "gettext.h" and remove the conditional code based
+ on whether or not gettext is present
+
+ 12/16
+ -----
+lib/readline/vi_mode.c
+ - fix problem with rl_vi_eWord that caused it to skip over the last
+ character of a word if invoked while point was on the next-to-last
+ character
+
+ 12/18
+ -----
+{arrayfunc,bashhist,bashline,error,eval,execute_cmd,expr,general,input,jobs}.c
+{mailcheck,make_cmd,nojobs,pcomplete,pcomplib,print_cmd,redir,shell,sig}.c
+{subst,test,trap,variables,version,xmalloc}.c
+parse.y
+builtins/{common,evalfile,getopt}.c
+builtins/{bind,break,caller,cd,complete,declare,enable,exec,exit,fc,fg_bg}.def
+builtins/{hash,help,history,jobs,kill,printf,pushd,read,return,set,setattr}.def
+builtins/{shift,shopt,source,suspend,type,ulimit,umask}.def
+lib/sh/{fmtulong,netopen}.c
+ - include "bashintl.h" for gettext defines
+
+Makefile.in
+ - add `-DBUILDTOOL' to CFLAGS for buildversion.o
+
+bashintl.h
+ - if `BUILDTOOL' is defined, define ENABLE_NLS to 0 so we don't have
+ to compile and link in the gettext stuff
+
+Makefile.in,lib/sh/Makefile.in,builtins/Makefile.in
+ - update dependencies on bashintl.h and include/gettext.h
+
+ 12/19
+ -----
+{arrayfunc,bashhist,bashline,error,eval,execute_cmd,expr,general,input,jobs}.c
+{mailcheck,make_cmd,nojobs,pcomplete,pcomplib,print_cmd,redir,shell,sig}.c
+{subst,test,trap,variables,version,xmalloc}.c
+builtins/{common,evalfile,getopt}.c
+builtins/{bind,break,caller,cd,complete,declare,enable,exec,exit,fc,fg_bg}.def
+builtins/{hash,help,history,jobs,kill,let,printf,pushd,read,return,set}.def
+builtins/{setattr,shift,shopt,source,suspend,type,ulimit,umask}.def
+lib/sh/{fmtulong,netopen}.c
+lib/malloc/{malloc,stats,table,watch}.c
+ - mark up strings in source files for gettext processing
+
+lib/malloc/imalloc.h
+ - include "bashintl.h" if SHELL is defined, otherwise make _(x) an
+ identity define
+
+lib/malloc/Makefile.in
+ - add dependencies on ${topdir}/bashintl.h and ${BASHINCDIR}/gettext.h
+
+ 12/21
+ -----
+bashline.c
+ - make sure we index into rl_line_buffer with indexes > 0 in
+ attempt_shell_completion
+
+ 12/31
+ -----
+Makefile.in
+ - descend into `po' and run make recursively for the various clean
+ targets
+
+ 1/4
+ ---
+include/shmbutil.h
+ - two new macros: BACKUP_CHAR(str, strsize, i), which backs up one
+ multibyte character in STR starting at index I, and
+ BACKUP_CHAR_P(str, strsize, p), which backs up one multibyte
+ character in STR starting at P, which is a char *
+
+ 1/6
+ ---
+pcomplete.c
+ - in pcomp_filename_completion_function, use the quote character
+ readline found (and assigned to rl_complete_quote_character) when
+ dequoting the filename by a completion call from readline (when
+ rl_dispatching != 0)
+
+bashline.c
+ - ditto for bash_directory_completion_matches
+
+ 1/7
+ ---
+lib/readline/complete.c
+ - new variable, rl_completion_found_quote, set to non-zero value if
+ readline finds what it thinks is quoting in the word to be completed
+
+lib/readline/readline.h
+ - extern declaration for rl_completion_found_quote
+
+ 1/8
+ ---
+lib/readline/doc/rltech.texi
+ - documented rl_completion_found_quote
+
+lib/readline/complete.c
+ - in compute_lcd_of_matches, if it looks like what the user typed was
+ dequoted before generating filename matches, dequote the user's
+ text again before figuring out the case-insensitive lcd
+
+ 1/9
+ ---
+lib/readline/display.c
+ - fix from Edward Catmur <ed@catmur.co.uk> to logic that handles
+ invisible characters in prompt string. Original code was wrong
+ about local_prompt_prefix; it gave incorrect results when prompt
+ contained invisible characters after a line break
+
+ 1/10
+ ----
+subst.c
+ - new function, mb_substring(), does character (possibly multibyte)
+ oriented rather than strictly byte-oriented substring extraction.
+ The passed indices, rather than strictly indexing into the string,
+ indicate character positions that need to be calculated. From
+ Tim Waugh <twaugh@redhat.com>
+ - change parameter_brace_substring to use mb_substring if necessary
+
+included/shmbutil.h
+ - new define SADD_MBQCHAR_BODY, common code for adding a quoted
+ (preceded by CTLESC) multibyte character to an accumulating string
+ in the subst.c expansion code
+
+subst.c
+ - use SADD_MBQCHAR_BODY in expand_word_internal
+ - new static function, mb_getcharlens, allocates and returns an array
+ of character lengths for (possibly multibyte) characters in the
+ argument string
+ - change pattern matching operations to use while loops instead of
+ for loops to handle multibyte characters better (no more simple
+ increment or decrement)
+ - change pattern matching operations to use multibyte character
+ operations instead of simple increments and decrements. Don't
+ use BACKUP_CHAR_P -- use the mblen array instead, because that
+ avoids the N**2 behavior of having to count from the beginning
+ of the string each time you want to back up one character. Changes
+ to remove_pattern and match_pattern
+
+ 1/12
+ ----
+lib/readline/display.c
+ - make expand_prompt count multbyte characters in the prompt string
+ by using _rl_find_next_mbchar (and copying possibly more than one
+ byte) instead of a simple increment and single byte copy
+
+ 1/13
+ ----
+lib/readline/display.c
+ - expand_prompt takes a new reference argument -- it returns
+ the actual count of (possibly multibyte) characters displayed
+ on the screen
+ - don't short-circuit in expand_prompt unless we're not going to
+ be using any multibyte characters
+ - change calls to expand_prompt to pass an argument for the
+ number of physical characters the prompt occupies
+ (prompt_physical_chars)
+ - initialize `lpos' (the physical cursor position) from
+ prompt_physical_chars in rl_redisplay
+
+lib/readline/mbutil.c
+ - in _rl_find_prev_mbchar_internal, if mbrtowc returns -1 or -2, and
+ we assume that the character is a single-byte char, make sure we
+ update `prev' so it doesn't get lost. Fixes problems encountered
+ when a non-ascii char is the last char on the line and we're moving
+ back past it with ^B, and other display problems caused by the same
+ situation
+
+ 1/15
+ ----
+lib/readline/doc/rltech.texi
+ - document RL_PROMPT_START_IGNORE and RL_PROMPT_END_IGNORE in the
+ description of rl_expand_prompt()
+
+ 1/20
+ ----
+bashline.c
+ - in initialize_readline, make sure M-C-j and M-C-m are still bound to
+ vi-editing-mode before unbinding them -- they may have been rebound
+ in an inputrc
+
+variables.c
+ - in unbind_variable, unset attributes other than `local' and exported
+ (if the variable came from a temporary environment) when unsetting a
+ local variable inside a function
+
+ 1/21
+ ----
+configure.in
+ - add libintl build directory to the list of include directories if
+ it's being built (using INTL_BUILDDIR)
+
+Makefile.in,{builtins,lib/{sh,malloc}}/Makefile.in
+ - substitute LIBBUILD as ${BUILD_DIR}/${LIBSUBDIR}
+ - define INTL_BUILDDIR as ${LIBBUILD}/intl
+
+{builtins,lib/sh}/Makefile.in
+ - make sure INTL_INC is added to the list of include directories
+ - make sure INTL_LIBSRC is defined with the correct value
+
+{configure,Makefile,{builtins,lib/sh}/Makefile}.in
+ - substitute LIBINTL_H as ${INTL_BUILDDIR}/libintl.h
+
+Makefile.in,builtins/Makefile.iin
+ - all files depending on bashintl.h also depend on ${LIBINTL_H}
+ (which may be empty)
+
+Makefile.in
+ - make a rule telling how to build lib/intl/libintl.h if necessary
+
+ 1/24
+ ----
+builtins/read.def
+ - make sure that the array name supplied as an argument to -a is a
+ valid identifier
+
+parse.y
+ - make the \W expansion abbreviate $HOME with a ~ (seems to be more
+ useful)
+
+doc/{bash.1,bashref.texi}
+ - document new behavior of \W
+
+subst.c
+ - make sure parameter_brace_expand_rhs uses the first character of
+ $IFS when making the string to return from the expanded word
+ (which, in the case of "$@" or $@, contains multiple words that
+ need to be separated)
+
+ 1/25
+ ----
+builtins/common.c
+ - change get_job_spec to make `%' by itself or an empty argument
+ return NO_JOB
+
+jobs.h
+ - new possible value for a job spec return value: BAD_JOBSPEC
+ (for syntactically invalid specs, like the empty string)
+
+shell.c
+ - in open_shell_script, check to see whether or not we can find and
+ open the filename argument before setting dollar_vars[0] or
+ manipulating BASH_SOURCE, so the error messages come out better
+
+subst.c
+ - in string_list_internal, short-circuit right away to savestring()
+ if the list only has a single element
+
+ 1/28
+ ----
+lib/readline/rltypedefs.h
+ - new set of typedefs for functions returning char * with various
+ arguments (standard set)
+
+lib/readline/complete.c
+ - new function pointer, rl_completion_word_break_hook, called by
+ _rl_find_completion_word, used to set word break characters at
+ completion time, allowing them to be position-based
+
+lib/readline/doc/rltech.texi
+ - documented rl_completion_word_break_hook
+
+lib/readline/kill.c
+ - added new rl_unix_filename_rubout, which deletes one filename
+ component in a Unix pathname backward (delimiters are whitespace
+ and `/')
+
+lib/readline/readline.h
+ - extern declaration for rl_unix_filename_rubout
+
+lib/readline/funmap.c
+ - new bindable readline command `unix-filename-rubout'
+
+lib/readline/doc/{readline.3,rluser.texi},doc/bash.1
+ - documented `unix-filename-rubout'
+
+ 1/29
+ ----
+lib/readline/histexpand.c
+ - change history_tokenize_internal to handle non-whitespace delimiter
+ characters by creating separate fields (like the shell does when
+ splitting on $IFS)
+
+ 1/30
+ ----
+lib/glob/xmbsrtowcs.c
+ - new function, xdupmbstowcs, for convenience: calls xmbsrtowcs
+ while allocating memory for the new wide character string
+ - some small efficiency improvments to xmbsrtowcs
+
+include/shmbutil.h
+ - extern declaration for xdupmbstowcs
+
+lib/glob/strmatch.h
+ - include config.h for definition of HANDLE_MULTIBYTE
+ - remove the HAVE_LIBC_FNM_EXTMATCH tests
+ - new extern declaration for wcsmatch(whchar_t *, wchar_t *, int)
+
+configure.in
+ - remove call to BASH_FUNC_FNMATCH_EXTMATCH; it's no longer used
+
+lib/glob/smatch.c
+ - simplify xstrmatch() by using xdupmbstowcs() instead of inline code
+
+lib/glob/glob.c
+ - modify mbskipname() to avoid the use of alloca
+ - simplify mbskipname() by using xdupmbstowcs() instead of inline code
+ - simplify glob_pattern_p() by using xdupmbstowcs() instead of
+ inline code
+ - fix memory leak in wdequote_pathname
+ - simplify wdequote_pathname() by using xdupmbstowcs() instead of
+ inline code
+
+lib/glob/strmatch.c
+ - new function, wcsmatch(), `exported' wide-character equivalent of
+ strmatch()
+
+subst.c
+ - old match_pattern is now match_upattern
+ - match_pattern now either calls match_upattern or converts
+ mbstrings to wide chars and calls match_wpattern
+ - match_upattern reverted to old non-multibyte code
+ - new function: match_pattern_wchar, wide character version of
+ match_pattern_char
+
+ 2/1
+ ---
+subst.c
+ - old remove_pattern is now remove_upattern
+ - remove_upattern reverted to old non-multibyte code (pre-Waugh patch)
+ - new multibyte version of remove_pattern: remove_wpattern
+ - remove_pattern now calls either remove_upattern or converts a
+ multibyte string to a wide character string and calls
+ remove_wpattern
+ - new function, wcsdup, wide-character version of strdup(3)
+
+ 2/4
+ ---
+print_cmd.c
+ - temporarily translate a >&filename redirection from
+ r_duplicating_output_word to r_err_and_out (as the expansion code
+ in redir.c does) so it prints without a leading `1' (file
+ descriptor)
+
+ 2/5
+ ---
+aclocal.m4
+ - add a check for wcsdup to BASH_CHECK_MULTIBYTE
+
+config.h.in
+ - add HAVE_WCSDUP define
+
+ 2/9
+ ---
+builtins/shift.def
+ - fix a call to sh_erange that possibly dereferences a NULL pointer
+
+ 2/12
+ ----
+general.c
+ - start at a general set of file property checking functions:
+ file_isdir(), file_iswdir() (is writable directory)
+
+general.h
+ - extern declarations for new functions
+
+lib/sh/tmpfile.c
+ - use file_iswdir() to make sure the temporary directory used for
+ here documents and other temp files is writable in get_sys_tmpdir()
+
+ 2/17
+ ----
+bashline.c
+ - fix conditional binding of emacs-mode M-~ -- there is a default
+ binding for it (rl_tilde_expand), so a straight call to
+ rl_bind_key_if_unbound_in_map doesn't do the right thing
+
+ 2/27
+ ----
+[bash-3.0-beta1 released]
+
+ 2/29
+ ----
+subst.c
+ - fixed expansion so referencing $a, when a is an array variable
+ without an element assigned to index 0, exits the shell when
+ `-u' is enabled
+
+expr.c
+ - make the exponentiation operator (**) associative, so things like
+ 2**3**4 work right (change `if' to `while')
+
+ 3/3
+ ---
+lib/sh/strftime.c
+ - SCO Unix 3.2, like Solaris, requires that the system's `timezone'
+ variable be declared as long
+
+lib/readline/{bind,histfile,input,parens}.c
+ - changes for Tandem (including `floss.h' (?))
+
+ 3/4
+ ---
+subst.c
+ - change param_expand to quote the entire expanded string instead
+ of just the escape characters if the expansion appears between
+ double quotes or in a here-document (for simple variable expansions
+ or expansions of positional parameters)
+
+ 3/8
+ ---
+subst.c
+ - analogous changes to parameter_brace_expand_word to fix the same
+ quoting problem as on 3/4; fix callers to understand that the
+ value returned might be quoted now and should be dequoted if
+ necessary
+ - add a `quoted' argument to get_var_and_type, change callers
+ - change today's fix and fix from 3/4 to not call quote_string if the
+ value is "" (because quote_string turns that into CTLNUL\0)
+
+ 3/9
+ ---
+builtins/cd.def
+ - resetpwd() now takes a `caller' argument so it can be used by pwd
+ as well as cd
+ - change pwd_builtin to call resetpwd() if sh_physpath() fails to
+ return a valid pathname
+
+ 3/14
+ ----
+expr.c
+ - reworked exp0 and readtok() to make post-increment and post-decrement
+ into real tokens, which may be separated from their accompanying
+ variables by whitesapce
+ - made analogous changes to readtok() to make pre-increment and
+ pre-decrement work when separated from their accompanying identifier
+ by whitespace
+
+ 3/18
+ ----
+lib/readline/misc.c
+ - in rl_maybe_unsave_line, don't force rl_replace_line to clear
+ the undo_list, since it might point directly at an undo list
+ from a history entry (to which we have no handle)
+
+ 3/19
+ ----
+lib/readline/display.c
+ - rl_save_prompt and rl_restore_prompt now save and restore the value
+ of prompt_physical_chars
+ - set prompt_physical_chars in rl_redisplay when expand_prompt has
+ not been called (e.g., when rl_display_prompt is set and is not
+ equal to rl_prompt, like when searching)
+
+lib/readline/histexpand.c
+ - don't call add_history in history_expand if the `:p' modifier is
+ supplied; leave that to the calling application. This means that
+ `history -p', for example, will not add anything to the history
+ list (as documented), nor will history expansions invoked by
+ emacs-mode M-C-e line editing
+
+config-bot.h
+ - check whether HAVE_DECL_SYS_SIGLIST is defined to 1 rather than just
+ defined, to work around newer versions of autoconf defining it to 0
+
+config.h.in
+ - change default status of HAVE_MALLOC to #undef instead of #define
+
+bashhist.c
+ - extern declarations for rl_done and rl_dispatching
+ - don't call re_edit from pre_process_line unless rl_dispatcing is zero,
+ so we don't call it from something like shell-expand-line
+ - change pre_process_line to add an expanded history specification
+ that returned `print only' to the history list, since history_expand
+ no longer does it (and, when using readline, do it only when
+ rl_dispatching is zero)
+
+ 3/22
+ ----
+config.h.in,aclocal.m4
+ - change bash-specific functions that look in struct dirent to define
+ HAVE_STRUCT_DIRENT_xxx, like AC_CHECK_MEMBERS does (though the
+ functions are otherwise the same)
+ - new function, BASH_STRUCT_DIRENT_D_NAMLEN, define
+ HAVE_STRUCT_DIRENT_D_NAMLEN if struct dirent has a `d_namlen' member
+
+configure.in
+ - call BASH_STRUCT_DIRENT_D_NAMLEN
+
+include/posixdir.h
+ - use new and renamed HAVE_STRUCT_DIRENT_D_xxx defines
+
+ 4/7
+ ---
+builtins/cd.def
+ - ensure that we print out a non-null pathname after getting a
+ directory from CDPATH and canonicalizing it (e.g., if the result
+ exceeds PATH_MAX in length and the_current_working_directory is
+ set to NULL)
+
+ 4/12
+ ----
+print_cmd.c
+ - new function to print out assignment statements when `set -x' has
+ been enabled: xtrace_print_assignment
+
+externs.h
+ - extern declaration for xtrace_print_assignment
+
+ 4/13
+ ----
+{subst,variables}.c
+ - call xtrace_print_assignment instead of using inline code
+
+jobs.c
+ - if turning on job control when it was previously off, set
+ pipeline_pgrp to 0 in set_job_control so make_child puts
+ subsequent children in their own process group
+
+ 4/14
+ ----
+general.c
+ - new function, legal_alias_name, called to decide whether an
+ argument to add_alias is a valid alias name -- essentially any
+ character except one which must be quoted to the shell parser
+ and `/'
+
+general.h
+ - new extern declaration for legal_alias_name
+
+builtins/alias.def
+ - `unalias' now returns failure status if no NAME arguments are
+ supplied and -a is not given
+ - call legal_alias_name to make sure alias name is valid before
+ calling add_alias from alias_builtin
+
+ 4/19
+ ----
+include/shmbutil.h
+ - include <config.h> for definition of HANDLE_MULTIBYTE rather than
+ duplicating logic
+
+ 4/20
+ ----
+
+doc/{bash.1,bashref.texi}
+ - make sure $0 is consistently referred to as a `special parameter'
+ - document which characters are now not allowed in alias names
+
+ 4/23
+ ----
+
+builtins/{jobs,kill,wait}.def
+ - removed requirement that job control be enabled to use job control
+ notation, as SUSv3 implies
+
+subst.c
+ - based on a message from David Korn, change param_expand to not call
+ string_list_dollar_star if the only quoting is Q_HERE_DOCUMENT --
+ quoted here documents are like double quoting, but not exactly
+ - analogous changes to list_remove_pattern and pos_params
+
+ 4/24
+ ----
+lib/readline/doc/rluser.texi
+ - fix error in description of emacs-mode C-xC-e command (uses $VISUAL
+ instead of $FCEDIT)
+
+ 4/28
+ ----
+support/bashbug.sh
+ - integrate a patch from Stefan Nordhausen
+ <nordhaus@informatik.hu-berlin.de> that reduces race conditions
+ by using a temporary directory inside $TMPDIR and creating the
+ temp files in that
+
+ 4/30
+ ----
+builtins/common.c
+ - use pathconf(".", _PC_PATH_MAX) where available to size the argument
+ to getcwd() rather than using a straight PATH_MAX
+
+builtins/cd.def
+ - if get_working_directory fails and returns null (causing resetpwd
+ to return NULL), use set_working_directory to set $PWD to the
+ absolute pathname for which chdir just succeeded
+
+ 5/1
+ ---
+lib/readline/vi_mode.c
+ - in rl_vi_change_to, call _rl_vi_set_last with rl_numeric_arg instead
+ of `last', since they're equal at call time and rl_vi_domove can
+ change rl_numeric_arg (which vi apparently updates). Fixes redo bug
+ of `c2....' reported by Marion Berryman <mwberryman@copper.net>
+
+ 5/4
+ ---
+parse.y
+ - fix decode_prompt_string to properly deal with strftime() returning 0
+
+ 5/6
+ ---
+variables.c
+ - in make_local_array_variable, return an already-existing local array
+ variable immediately rather than creating a new array (causing a
+ memory leak)
+
+ 5/8
+ ---
+lib/readline/vi_mode.c
+ - change rl_vi_domove to set rl_explicit_arg before calling
+ rl_digit_loop1 so that multi-digit numeric arguments work right
+ - _rl_vi_last_command is no longer static
+
+lib/readline/rlprivate.h
+ - new extern declaration for _rl_vi_last_command
+
+lib/readline/text.c
+ - change rl_newline to only call _rl_vi_reset_last if the last command
+ (_rl_vi_last_command) is not a text modification command. This lets
+ the last-command and last-argument work across command lines
+
+ 5/13
+ ----
+builtins/common.c
+ - use getcwd(0,0) rather than providing a fixed pathname with a fixed
+ length (PATH_MAX) so getcwd() will allocate sufficient memory
+
+aclocal.m4
+ - change BASH_FUNC_GETCWD to check whether or not getcwd(0,0) will
+ allocate memory for the returned value -- nobody implements that
+ and getcwd-via-popen, so it should capture the old test as well
+
+ 5/27
+ ----
+
+builtins/trap.def
+ - the historical behavior of assuming that a signal's handling should
+ be set to its original disposition is only in effect if a single
+ argument is given, otherwise the first argument is assumed to be a
+ command to execute
+ - when in posix mode, if trap gets a single argument, display an
+ error message and return EX_USAGE
+ - change the help message and usage string to better explain trap's
+ behavior
+
+doc/{bash.1,bashref.texi}
+ - describe the new default behavior when the first argument is a
+ signal spec
+ - note that signal names are case insensitive and the SIG prefix is
+ optional in arguments to `trap'
+ - note that signal name arguments to `kill' are case-insensitive
+
+lib/readline/display.c
+ - make sure rl_on_new_line_with_prompt sets rl_display_prompt to
+ rl_prompt (just to make sure it's set)
+ - have rl_on_new_line_with_prompt use local_prompt if it's set
+
+ 6/2
+ ---
+subst.c
+ - in string_extract_double_quoted, cope with extract_delimited_string
+ returning NULL, as it can when attempting completion on an unclosed
+ command substitution
+
+ 6/24
+ ----
+lib/readline/complete.c
+ - change print_filename to add a `/' to listed directory names if
+ `mark-directories' has been enabled
+
+builtins/umask.def
+ - make sure that the mask passed to parse_symbolic_mode has all but
+ the operative low eight bits masked off, to avoid complementing
+ all 0s to -1, which is the error return code. This makes things
+ like `a=rwx' and `ugo=rwx' work and turn off the umask
+
+ 6/26
+ ----
+builtins/getopts.def
+ - when `getopts' reaches the end of options, unset OPTARG before
+ returning EOF. In response to a bug report from Apple
+
+configure.in
+ - when cross-compiling, don't set CPPFLAGS_FOR_BUILD and
+ LDFLAGS_FOR_BUILD from CPPFLAGS and LDFLAGS, respectively, since
+ those are for the target instead of the build platform (report
+ from robert@schwebel.de)
+
+shell.c
+ - a shell whose standard error (but not standard output) is directed
+ to a terminal should be interactive, according to POSIX/SUS. This
+ means that sh > sh.out will start an interactive shell. Bug report
+ from llattanzi@apple.com
+
+doc/{bash.1,bashref.texi}
+ - change mention of standard output to standard error in definition
+ of interactive shell
+
+lib/readline/vi_mode.c
+ - new convenience function, rl_vi_start_inserting, calls
+ _rl_vi_set_last to save the last textmod command state and then calls
+ rl_vi_insertion_mode to enter insert mode
+ - change functions to use rl_vi_start_inserting
+
+lib/readline/readline.h
+ - extern declaration for rl_vi_start_inserting
+
+bashline.c
+ - new function for vi-mode completion, bash_vi_complete. Does
+ filename expansion as POSIX specifies, unlike the default readline
+ bindings (which don't know about globbing). Bound to `\', `*',
+ and `=' in vi command keymap. Internals very similar to
+ rl_vi_complete; just calls bash glob expansion functions
+
+lib/readline/vi_mode.c
+ - change rl_vi_change_char so that an entire change is a single
+ undoable event, rather than each individual change in a [count]r
+ command
+ - fix rl_vi_change_char so that replacing characters up to EOL works
+ rather than generating rl_ding
+ - fix rl_vi_change_case so that replacing characters up to EOL works
+ rather than generating rl_ding
+
+ 6/28
+ ----
+builtins/echo.def
+ - call clearerr(stdout) before writing anything and testing its
+ failure or success
+
+ 6/29
+ ----
+bashline.c
+ - only set rl_explicit_arg in bash_glob_complete_word if readline is
+ in emacs mode; let bash_vi_complete take care of setting it in vi
+ mode
+ - fix bash_vi_complete to only set rl_explicit_arg unless the posix
+ conditions are met: no globbing characters in the vi `bigword'
+ being completed
+
+ 6/30
+ ----
+[bash-3.0-rc1 released]
+
+ 7/1
+ ---
+lib/readline/complete.c
+ - make sure `extension_char' is initialized before deciding whether
+ or not the append a `/' to a possible completion when visible-stats
+ is not enabled
+
+ 7/2
+ ---
+subst.c
+ - fix a boundary overrun in string_extract_double_quoted that could
+ occur when the word completion code attempts to expand an incomplete
+ construct (like a quoted unclosed command substitution)
+
+ 7/4
+ ---
+subst.c
+ - set tempenv_assign_error to non-zero if an assignment to the
+ temporary environment fails for some reason (e.g., attempted
+ assignment to a readonly variable)
+
+execute_cmd.c
+ - fix execute_simple_command to force a non-interactive shell in
+ POSIX mode to exit if an assignment to the temporary environment
+ preceding a special builtin fails (bug report from
+ llattanzi@apple.com)
+
+ 7/5
+ ---
+bashline.c
+ - in bash_directory_completion_hook, don't perform word expansions
+ if the filename appears to have been completed from the file
+ system rather than typed in by the user. Bug reported by Tim
+ Waugh <twaugh@redhat.com>
+
+ 7/7
+ ---
+lib/readline/misc.c
+ - if _rl_maybe_save_line is being asked to save a line other than
+ what's already saved, free up the current saved line and save the
+ current contents of rl_line_buffer. Bug reported by
+ llattanzi@apple.com
+
+ 7/12
+ ----
+lib/readline/input.c
+ - do better EOF detection in rl_gather_tyi -- if a read returns 0 when
+ the fd is in non-blocking mode, stuff an EOF into the input stream
+ (reported by mattias@virtutech.se)
+
+ 7/13
+ ----
+lib/readline/vi_mode.c
+ - make sure rl_vi_put honors `count' arguments and yanks things
+ multiple times if requested
+
+ 7/16
+ ----
+builtins/umask.def
+ - make sure that the `who' part of the umask symbolic mode argument
+ defaults to `a' if it's missing
+
+flags.c
+ - make sure that maybe_make_restricted only gets called after the
+ shell is initialized, so `bash -r' doesn't result in inappropriate
+ error messages
+
+[bash-3.0 frozen]
+
+ 7/27
+ ----
+doc/Makefile.in
+ - small fixes
+
+[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
+ ---
+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_completion_hook
+ and bash_directory_expansion
+
+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
+
+{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]
--- /dev/null
+% texinfo.tex -- TeX macros to handle Texinfo files.
+%
+% Load plain if necessary, i.e., if running under initex.
+\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
+%
+\def\texinfoversion{2003-02-03.16}
+%
+% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
+% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+%
+% This texinfo.tex file is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License as
+% published by the Free Software Foundation; either version 2, or (at
+% your option) any later version.
+%
+% This texinfo.tex file is distributed in the hope that it will be
+% useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+% General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this texinfo.tex file; see the file COPYING. If not, write
+% to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+% Boston, MA 02111-1307, USA.
+%
+% In other words, you are welcome to use, share and improve this program.
+% You are forbidden to forbid anyone else to use, share and improve
+% what you give them. Help stamp out software-hoarding!
+%
+% Please try the latest version of texinfo.tex before submitting bug
+% reports; you can get the latest version from:
+% ftp://ftp.gnu.org/gnu/texinfo/texinfo.tex
+% (and all GNU mirrors, see http://www.gnu.org/order/ftp.html)
+% ftp://tug.org/tex/texinfo.tex
+% (and all CTAN mirrors, see http://www.ctan.org),
+% and /home/gd/gnu/doc/texinfo.tex on the GNU machines.
+%
+% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
+%
+% The texinfo.tex in any given Texinfo distribution could well be out
+% of date, so if that's what you're using, please check.
+%
+% Send bug reports to bug-texinfo@gnu.org. Please include including a
+% complete document in each bug report with which we can reproduce the
+% problem. Patches are, of course, greatly appreciated.
+%
+% To process a Texinfo manual with TeX, it's most reliable to use the
+% texi2dvi shell script that comes with the distribution. For a simple
+% manual foo.texi, however, you can get away with this:
+% tex foo.texi
+% texindex foo.??
+% tex foo.texi
+% tex foo.texi
+% dvips foo.dvi -o # or whatever; this makes foo.ps.
+% The extra TeX runs get the cross-reference information correct.
+% Sometimes one run after texindex suffices, and sometimes you need more
+% than two; texi2dvi does it as many times as necessary.
+%
+% It is possible to adapt texinfo.tex for other languages, to some
+% extent. You can get the existing language-specific files from the
+% full Texinfo distribution.
+
+\message{Loading texinfo [version \texinfoversion]:}
+
+% If in a .fmt file, print the version number
+% and turn on active characters that we couldn't do earlier because
+% they might have appeared in the input file name.
+\everyjob{\message{[Texinfo version \texinfoversion]}%
+ \catcode`+=\active \catcode`\_=\active}
+
+\message{Basics,}
+\chardef\other=12
+
+% We never want plain's outer \+ definition in Texinfo.
+% For @tex, we can use \tabalign.
+\let\+ = \relax
+
+% Save some parts of plain tex whose names we will redefine.
+\let\ptexb=\b
+\let\ptexbullet=\bullet
+\let\ptexc=\c
+\let\ptexcomma=\,
+\let\ptexdot=\.
+\let\ptexdots=\dots
+\let\ptexend=\end
+\let\ptexequiv=\equiv
+\let\ptexexclam=\!
+\let\ptexgtr=>
+\let\ptexhat=^
+\let\ptexi=\i
+\let\ptexlbrace=\{
+\let\ptexless=<
+\let\ptexplus=+
+\let\ptexrbrace=\}
+\let\ptexstar=\*
+\let\ptext=\t
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+% Set up fixed words for English if not already set.
+\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi
+\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi
+\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi
+\ifx\putwordin\undefined \gdef\putwordin{in}\fi
+\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
+\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
+\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi
+\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
+\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi
+\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi
+\ifx\putwordof\undefined \gdef\putwordof{of}\fi
+\ifx\putwordon\undefined \gdef\putwordon{on}\fi
+\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi
+\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi
+\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi
+\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi
+\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi
+\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi
+\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi
+%
+\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
+\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
+\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
+\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
+\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
+\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
+\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
+\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
+\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
+\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
+\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
+\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
+%
+\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi
+\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi
+\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi
+\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi
+\ifx\putwordDeftypevar\undefined\gdef\putwordDeftypevar{Variable}\fi
+\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi
+\ifx\putwordDeftypefun\undefined\gdef\putwordDeftypefun{Function}\fi
+
+% In some macros, we cannot use the `\? notation---the left quote is
+% in some cases the escape char.
+\chardef\colonChar = `\:
+\chardef\commaChar = `\,
+\chardef\dotChar = `\.
+\chardef\equalChar = `\=
+\chardef\exclamChar= `\!
+\chardef\questChar = `\?
+\chardef\semiChar = `\;
+\chardef\spaceChar = `\ %
+\chardef\underChar = `\_
+
+% Ignore a token.
+%
+\def\gobble#1{}
+
+% True if #1 is the empty string, i.e., called like `\ifempty{}'.
+%
+\def\ifempty#1{\ifemptyx #1\emptymarkA\emptymarkB}%
+\def\ifemptyx#1#2\emptymarkB{\ifx #1\emptymarkA}%
+
+% Hyphenation fixes.
+\hyphenation{ap-pen-dix}
+\hyphenation{mini-buf-fer mini-buf-fers}
+\hyphenation{eshell}
+\hyphenation{white-space}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen\bindingoffset
+\newdimen\normaloffset
+\newdimen\pagewidth \newdimen\pageheight
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal. We don't just call \tracingall here,
+% since that produces some useless output on the terminal. We also make
+% some effort to order the tracing commands to reduce output in the log
+% file; cf. trace.sty in LaTeX.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{%
+ \tracingstats2
+ \tracingpages1
+ \tracinglostchars2 % 2 gives us more in etex
+ \tracingparagraphs1
+ \tracingoutput1
+ \tracingmacros2
+ \tracingrestores1
+ \showboxbreadth\maxdimen \showboxdepth\maxdimen
+ \ifx\eTeXversion\undefined\else % etex gives us more logging
+ \tracingscantokens1
+ \tracingifs1
+ \tracinggroups1
+ \tracingnesting2
+ \tracingassigns1
+ \fi
+ \tracingcommands3 % 3 gives us more in etex
+ \errorcontextlines\maxdimen
+}%
+
+% add check for \lastpenalty to plain's definitions. If the last thing
+% we did was a \nobreak, we don't want to insert more space.
+%
+\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
+ \removelastskip\penalty-50\smallskip\fi\fi}
+\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
+ \removelastskip\penalty-100\medskip\fi\fi}
+\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
+ \removelastskip\penalty-200\bigskip\fi\fi}
+
+% For @cropmarks command.
+% Do @cropmarks to get crop marks.
+%
+\newif\ifcropmarks
+\let\cropmarks = \cropmarkstrue
+%
+% Dimensions to add cropmarks at corners.
+% Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
+\newdimen\cornerlong \cornerlong=1pc
+\newdimen\cornerthick \cornerthick=.3pt
+\newdimen\topandbottommargin \topandbottommargin=.75in
+
+% Main output routine.
+\chardef\PAGE = 255
+\output = {\onepageout{\pagecontents\PAGE}}
+
+\newbox\headlinebox
+\newbox\footlinebox
+
+% \onepageout takes a vbox as an argument. Note that \pagecontents
+% does insertions, but you have to call it yourself.
+\def\onepageout#1{%
+ \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
+ %
+ \ifodd\pageno \advance\hoffset by \bindingoffset
+ \else \advance\hoffset by -\bindingoffset\fi
+ %
+ % Do this outside of the \shipout so @code etc. will be expanded in
+ % the headline as they should be, not taken literally (outputting ''code).
+ \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
+ \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
+ %
+ {%
+ % Have to do this stuff outside the \shipout because we want it to
+ % take effect in \write's, yet the group defined by the \vbox ends
+ % before the \shipout runs.
+ %
+ \escapechar = `\\ % use backslash in output files.
+ \indexdummies % don't expand commands in the output.
+ \normalturnoffactive % \ in index entries must not stay \, e.g., if
+ % the page break happens to be in the middle of an example.
+ \shipout\vbox{%
+ % Do this early so pdf references go to the beginning of the page.
+ \ifpdfmakepagedest \pdfmkdest{\the\pageno} \fi
+ %
+ \ifcropmarks \vbox to \outervsize\bgroup
+ \hsize = \outerhsize
+ \vskip-\topandbottommargin
+ \vtop to0pt{%
+ \line{\ewtop\hfil\ewtop}%
+ \nointerlineskip
+ \line{%
+ \vbox{\moveleft\cornerthick\nstop}%
+ \hfill
+ \vbox{\moveright\cornerthick\nstop}%
+ }%
+ \vss}%
+ \vskip\topandbottommargin
+ \line\bgroup
+ \hfil % center the page within the outer (page) hsize.
+ \ifodd\pageno\hskip\bindingoffset\fi
+ \vbox\bgroup
+ \fi
+ %
+ \unvbox\headlinebox
+ \pagebody{#1}%
+ \ifdim\ht\footlinebox > 0pt
+ % Only leave this space if the footline is nonempty.
+ % (We lessened \vsize for it in \oddfootingxxx.)
+ % The \baselineskip=24pt in plain's \makefootline has no effect.
+ \vskip 2\baselineskip
+ \unvbox\footlinebox
+ \fi
+ %
+ \ifcropmarks
+ \egroup % end of \vbox\bgroup
+ \hfil\egroup % end of (centering) \line\bgroup
+ \vskip\topandbottommargin plus1fill minus1fill
+ \boxmaxdepth = \cornerthick
+ \vbox to0pt{\vss
+ \line{%
+ \vbox{\moveleft\cornerthick\nsbot}%
+ \hfill
+ \vbox{\moveright\cornerthick\nsbot}%
+ }%
+ \nointerlineskip
+ \line{\ewbot\hfil\ewbot}%
+ }%
+ \egroup % \vbox from first cropmarks clause
+ \fi
+ }% end of \shipout\vbox
+ }% end of group with \normalturnoffactive
+ \advancepageno
+ \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
+
+\newinsert\margin \dimen\margin=\maxdimen
+
+\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+% marginal hacks, juha@viisa.uucp (Juha Takala)
+\ifvoid\margin\else % marginal info is present
+ \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
+\dimen@=\dp#1 \unvbox#1
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+% Here are the rules for the cropmarks. Note that they are
+% offset so that the space between them is truly \outerhsize or \outervsize
+% (P. A. MacKay, 12 November, 1986)
+%
+\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
+\def\nstop{\vbox
+ {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
+\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
+\def\nsbot{\vbox
+ {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
+
+% Parse an argument, then pass it to #1. The argument is the rest of
+% the input line (except we remove a trailing comment). #1 should be a
+% macro which expects an ordinary undelimited TeX argument.
+%
+\def\parsearg#1{%
+ \let\next = #1%
+ \begingroup
+ \obeylines
+ \futurelet\temp\parseargx
+}
+
+% If the next token is an obeyed space (from an @example environment or
+% the like), remove it and recurse. Otherwise, we're done.
+\def\parseargx{%
+ % \obeyedspace is defined far below, after the definition of \sepspaces.
+ \ifx\obeyedspace\temp
+ \expandafter\parseargdiscardspace
+ \else
+ \expandafter\parseargline
+ \fi
+}
+
+% Remove a single space (as the delimiter token to the macro call).
+{\obeyspaces %
+ \gdef\parseargdiscardspace {\futurelet\temp\parseargx}}
+
+{\obeylines %
+ \gdef\parseargline#1^^M{%
+ \endgroup % End of the group started in \parsearg.
+ %
+ % First remove any @c comment, then any @comment.
+ % Result of each macro is put in \toks0.
+ \argremovec #1\c\relax %
+ \expandafter\argremovecomment \the\toks0 \comment\relax %
+ %
+ % Call the caller's macro, saved as \next in \parsearg.
+ \expandafter\next\expandafter{\the\toks0}%
+ }%
+}
+
+% Since all \c{,omment} does is throw away the argument, we can let TeX
+% do that for us. The \relax here is matched by the \relax in the call
+% in \parseargline; it could be more or less anything, its purpose is
+% just to delimit the argument to the \c.
+\def\argremovec#1\c#2\relax{\toks0 = {#1}}
+\def\argremovecomment#1\comment#2\relax{\toks0 = {#1}}
+
+% \argremovec{,omment} might leave us with trailing spaces, though; e.g.,
+% @end itemize @c foo
+% will have two active spaces as part of the argument with the
+% `itemize'. Here we remove all active spaces from #1, and assign the
+% result to \toks0.
+%
+% This loses if there are any *other* active characters besides spaces
+% in the argument -- _ ^ +, for example -- since they get expanded.
+% Fortunately, Texinfo does not define any such commands. (If it ever
+% does, the catcode of the characters in questionwill have to be changed
+% here.) But this means we cannot call \removeactivespaces as part of
+% \argremovec{,omment}, since @c uses \parsearg, and thus the argument
+% that \parsearg gets might well have any character at all in it.
+%
+\def\removeactivespaces#1{%
+ \begingroup
+ \ignoreactivespaces
+ \edef\temp{#1}%
+ \global\toks0 = \expandafter{\temp}%
+ \endgroup
+}
+
+% Change the active space to expand to nothing.
+%
+\begingroup
+ \obeyspaces
+ \gdef\ignoreactivespaces{\obeyspaces\let =\empty}
+\endgroup
+
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+%% These are used to keep @begin/@end levels from running away
+%% Call \inENV within environments (after a \begingroup)
+\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}
+\def\ENVcheck{%
+\ifENV\errmessage{Still within an environment; press RETURN to continue}
+\endgroup\fi} % This is not perfect, but it should reduce lossage
+
+% @begin foo is the same as @foo, for now.
+\newhelp\EMsimple{Press RETURN to continue.}
+
+\outer\def\begin{\parsearg\beginxxx}
+
+\def\beginxxx #1{%
+\expandafter\ifx\csname #1\endcsname\relax
+{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else
+\csname #1\endcsname\fi}
+
+% @end foo executes the definition of \Efoo.
+%
+\def\end{\parsearg\endxxx}
+\def\endxxx #1{%
+ \removeactivespaces{#1}%
+ \edef\endthing{\the\toks0}%
+ %
+ \expandafter\ifx\csname E\endthing\endcsname\relax
+ \expandafter\ifx\csname \endthing\endcsname\relax
+ % There's no \foo, i.e., no ``environment'' foo.
+ \errhelp = \EMsimple
+ \errmessage{Undefined command `@end \endthing'}%
+ \else
+ \unmatchedenderror\endthing
+ \fi
+ \else
+ % Everything's ok; the right environment has been started.
+ \csname E\endthing\endcsname
+ \fi
+}
+
+% There is an environment #1, but it hasn't been started. Give an error.
+%
+\def\unmatchedenderror#1{%
+ \errhelp = \EMsimple
+ \errmessage{This `@end #1' doesn't have a matching `@#1'}%
+}
+
+% Define the control sequence \E#1 to give an unmatched @end error.
+%
+\def\defineunmatchedend#1{%
+ \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}%
+}
+
+
+%% Simple single-character @ commands
+
+% @@ prints an @
+% Kludge this until the fonts are right (grr).
+\def\@{{\tt\char64}}
+
+% This is turned off because it was never documented
+% and you can use @w{...} around a quote to suppress ligatures.
+%% Define @` and @' to be the same as ` and '
+%% but suppressing ligatures.
+%\def\`{{`}}
+%\def\'{{'}}
+
+% Used to generate quoted braces.
+\def\mylbrace {{\tt\char123}}
+\def\myrbrace {{\tt\char125}}
+\let\{=\mylbrace
+\let\}=\myrbrace
+\begingroup
+ % Definitions to produce \{ and \} commands for indices,
+ % and @{ and @} for the aux file.
+ \catcode`\{ = \other \catcode`\} = \other
+ \catcode`\[ = 1 \catcode`\] = 2
+ \catcode`\! = 0 \catcode`\\ = \other
+ !gdef!lbracecmd[\{]%
+ !gdef!rbracecmd[\}]%
+ !gdef!lbraceatcmd[@{]%
+ !gdef!rbraceatcmd[@}]%
+!endgroup
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
+\let\, = \c
+\let\dotaccent = \.
+\def\ringaccent#1{{\accent23 #1}}
+\let\tieaccent = \t
+\let\ubaraccent = \b
+\let\udotaccent = \d
+
+% Other special characters: @questiondown @exclamdown
+% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
+\def\questiondown{?`}
+\def\exclamdown{!`}
+
+% Dotless i and dotless j, used for accents.
+\def\imacro{i}
+\def\jmacro{j}
+\def\dotless#1{%
+ \def\temp{#1}%
+ \ifx\temp\imacro \ptexi
+ \else\ifx\temp\jmacro \j
+ \else \errmessage{@dotless can be used only with i or j}%
+ \fi\fi
+}
+
+% Be sure we're in horizontal mode when doing a tie, since we make space
+% equivalent to this in @example-like environments. Otherwise, a space
+% at the beginning of a line will start with \penalty -- and
+% since \penalty is valid in vertical mode, we'd end up putting the
+% penalty on the vertical list instead of in the new paragraph.
+{\catcode`@ = 11
+ % Avoid using \@M directly, because that causes trouble
+ % if the definition is written into an index file.
+ \global\let\tiepenalty = \@M
+ \gdef\tie{\leavevmode\penalty\tiepenalty\ }
+}
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\hfil\break\hbox{}\ignorespaces}
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=3000 }
+
+% @! is an end-of-sentence bang.
+\def\!{!\spacefactor=3000 }
+
+% @? is an end-of-sentence query.
+\def\?{?\spacefactor=3000 }
+
+% @w prevents a word break. Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox. We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line. According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0). If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+%
+% Another complication is that the group might be very large. This can
+% cause the glue on the previous page to be unduly stretched, because it
+% does not have much material. In this case, it's better to add an
+% explicit \vfill so that the extra space is at the bottom. The
+% threshold for doing this is if the group is more than \vfilllimit
+% percent of a page (\vfilllimit can be changed inside of @tex).
+%
+\newbox\groupbox
+\def\vfilllimit{0.7}
+%
+\def\group{\begingroup
+ \ifnum\catcode13=\active \else
+ \errhelp = \groupinvalidhelp
+ \errmessage{@group invalid in context where filling is enabled}%
+ \fi
+ %
+ % The \vtop we start below produces a box with normal height and large
+ % depth; thus, TeX puts \baselineskip glue before it, and (when the
+ % next line of text is done) \lineskip glue after it. (See p.82 of
+ % the TeXbook.) Thus, space below is not quite equal to space
+ % above. But it's pretty close.
+ \def\Egroup{%
+ \egroup % End the \vtop.
+ % \dimen0 is the vertical size of the group's box.
+ \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox
+ % \dimen2 is how much space is left on the page (more or less).
+ \dimen2 = \pageheight \advance\dimen2 by -\pagetotal
+ % if the group doesn't fit on the current page, and it's a big big
+ % group, force a page break.
+ \ifdim \dimen0 > \dimen2
+ \ifdim \pagetotal < \vfilllimit\pageheight
+ \page
+ \fi
+ \fi
+ \copy\groupbox
+ \endgroup % End the \group.
+ }%
+ %
+ \setbox\groupbox = \vtop\bgroup
+ % We have to put a strut on the last line in case the @group is in
+ % the midst of an example, rather than completely enclosing it.
+ % Otherwise, the interline space between the last line of the group
+ % and the first line afterwards is too small. But we can't put the
+ % strut in \Egroup, since there it would be on a line by itself.
+ % Hence this just inserts a strut at the beginning of each line.
+ \everypar = {\strut}%
+ %
+ % Since we have a strut on every line, we don't need any of TeX's
+ % normal interline spacing.
+ \offinterlineskip
+ %
+ % OK, but now we have to do something about blank
+ % lines in the input in @example-like environments, which normally
+ % just turn into \lisppar, which will insert no space now that we've
+ % turned off the interline space. Simplest is to make them be an
+ % empty paragraph.
+ \ifx\par\lisppar
+ \edef\par{\leavevmode \par}%
+ %
+ % Reset ^^M's definition to new definition of \par.
+ \obeylines
+ \fi
+ %
+ % Do @comment since we are called inside an environment such as
+ % @example, where each end-of-line in the input causes an
+ % end-of-line in the output. We don't want the end-of-line after
+ % the `@group' to put extra space in the output. Since @group
+ % should appear on a line by itself (according to the Texinfo
+ % manual), we don't worry about eating any user text.
+ \comment
+}
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing `@group can only ...'.
+%
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil \mil=0.001in
+
+\def\need{\parsearg\needx}
+
+% Old definition--didn't work.
+%\def\needx #1{\par %
+%% This method tries to make TeX break the page naturally
+%% if the depth of the box does not fit.
+%{\baselineskip=0pt%
+%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
+%\prevdepth=-1000pt
+%}}
+
+\def\needx#1{%
+ % Ensure vertical mode, so we don't make a big box in the middle of a
+ % paragraph.
+ \par
+ %
+ % If the @need value is less than one line space, it's useless.
+ \dimen0 = #1\mil
+ \dimen2 = \ht\strutbox
+ \advance\dimen2 by \dp\strutbox
+ \ifdim\dimen0 > \dimen2
+ %
+ % Do a \strut just to make the height of this box be normal, so the
+ % normal leading is inserted relative to the preceding line.
+ % And a page break here is fine.
+ \vtop to #1\mil{\strut\vfil}%
+ %
+ % TeX does not even consider page breaks if a penalty added to the
+ % main vertical list is 10000 or more. But in order to see if the
+ % empty box we just added fits on the page, we must make it consider
+ % page breaks. On the other hand, we don't want to actually break the
+ % page after the empty box. So we use a penalty of 9999.
+ %
+ % There is an extremely small chance that TeX will actually break the
+ % page at this \penalty, if there are no other feasible breakpoints in
+ % sight. (If the user is using lots of big @group commands, which
+ % almost-but-not-quite fill up a page, TeX will have a hard time doing
+ % good page breaking, for example.) However, I could not construct an
+ % example where a page broke at this \penalty; if it happens in a real
+ % document, then we can reconsider our strategy.
+ \penalty9999
+ %
+ % Back up by the size of the box, whether we did a page break or not.
+ \kern -#1\mil
+ %
+ % Do not allow a page break right after this kern.
+ \nobreak
+ \fi
+}
+
+% @br forces paragraph break
+
+\let\br = \par
+
+% @dots{} output an ellipsis using the current font.
+% We do .5em per period so that it has the same spacing in a typewriter
+% font as three actual period characters.
+%
+\def\dots{%
+ \leavevmode
+ \hbox to 1.5em{%
+ \hskip 0pt plus 0.25fil minus 0.25fil
+ .\hss.\hss.%
+ \hskip 0pt plus 0.5fil minus 0.5fil
+ }%
+}
+
+% @enddots{} is an end-of-sentence ellipsis.
+%
+\def\enddots{%
+ \leavevmode
+ \hbox to 2em{%
+ \hskip 0pt plus 0.25fil minus 0.25fil
+ .\hss.\hss.\hss.%
+ \hskip 0pt plus 0.5fil minus 0.5fil
+ }%
+ \spacefactor=3000
+}
+
+
+% @page forces the start of a new page
+%
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\def\exdent{\parsearg\exdentyyy}
+\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}}
+
+% This defn is used inside nofill environments such as @example.
+\def\nofillexdent{\parsearg\nofillexdentyyy}
+\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount
+\leftline{\hskip\leftskip{\rm#1}}}}
+
+% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
+% paragraph. For more general purposes, use the \margin insertion
+% class. WHICH is `l' or `r'.
+%
+\newskip\inmarginspacing \inmarginspacing=1cm
+\def\strutdepth{\dp\strutbox}
+%
+\def\doinmargin#1#2{\strut\vadjust{%
+ \nobreak
+ \kern-\strutdepth
+ \vtop to \strutdepth{%
+ \baselineskip=\strutdepth
+ \vss
+ % if you have multiple lines of stuff to put here, you'll need to
+ % make the vbox yourself of the appropriate size.
+ \ifx#1l%
+ \llap{\ignorespaces #2\hskip\inmarginspacing}%
+ \else
+ \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
+ \fi
+ \null
+ }%
+}}
+\def\inleftmargin{\doinmargin l}
+\def\inrightmargin{\doinmargin r}
+%
+% @inmargin{TEXT [, RIGHT-TEXT]}
+% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
+% else use TEXT for both).
+%
+\def\inmargin#1{\parseinmargin #1,,\finish}
+\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0 > 0pt
+ \def\lefttext{#1}% have both texts
+ \def\righttext{#2}%
+ \else
+ \def\lefttext{#1}% have only one text
+ \def\righttext{#1}%
+ \fi
+ %
+ \ifodd\pageno
+ \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
+ \else
+ \def\temp{\inleftmargin\lefttext}%
+ \fi
+ \temp
+}
+
+% @include file insert text of that file as input.
+% Allow normal characters that we make active in the argument (a file name).
+\def\include{\begingroup
+ \catcode`\\=\other
+ \catcode`~=\other
+ \catcode`^=\other
+ \catcode`_=\other
+ \catcode`|=\other
+ \catcode`<=\other
+ \catcode`>=\other
+ \catcode`+=\other
+ \parsearg\includezzz}
+% Restore active chars for included file.
+\def\includezzz#1{\endgroup\begingroup
+ % Read the included file in a group so nested @include's work.
+ \def\thisfile{#1}%
+ \let\value=\expandablevalue
+ \input\thisfile
+\endgroup}
+
+\def\thisfile{}
+
+% @center line
+% outputs that line, centered.
+%
+\def\center{\parsearg\docenter}
+\def\docenter#1{{%
+ \ifhmode \hfil\break \fi
+ \advance\hsize by -\leftskip
+ \advance\hsize by -\rightskip
+ \line{\hfil \ignorespaces#1\unskip \hfil}%
+ \ifhmode \break \fi
+}}
+
+% @sp n outputs n lines of vertical space
+
+\def\sp{\parsearg\spxxx}
+\def\spxxx #1{\vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore is another way to write a comment
+
+\def\comment{\begingroup \catcode`\^^M=\other%
+\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
+\commentxxx}
+{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
+
+\let\c=\comment
+
+% @paragraphindent NCHARS
+% We'll use ems for NCHARS, close enough.
+% We cannot implement @paragraphindent asis, though.
+%
+\def\asisword{asis} % no translation, these are keywords
+\def\noneword{none}
+%
+\def\paragraphindent{\parsearg\doparagraphindent}
+\def\doparagraphindent#1{%
+ \def\temp{#1}%
+ \ifx\temp\asisword
+ \else
+ \ifx\temp\noneword
+ \defaultparindent = 0pt
+ \else
+ \defaultparindent = #1em
+ \fi
+ \fi
+ \parindent = \defaultparindent
+}
+
+% @exampleindent NCHARS
+% We'll use ems for NCHARS like @paragraphindent.
+% It seems @exampleindent asis isn't necessary, but
+% I preserve it to make it similar to @paragraphindent.
+\def\exampleindent{\parsearg\doexampleindent}
+\def\doexampleindent#1{%
+ \def\temp{#1}%
+ \ifx\temp\asisword
+ \else
+ \ifx\temp\noneword
+ \lispnarrowing = 0pt
+ \else
+ \lispnarrowing = #1em
+ \fi
+ \fi
+}
+
+% @asis just yields its argument. Used with @table, for example.
+%
+\def\asis#1{#1}
+
+% @math outputs its argument in math mode.
+% We don't use $'s directly in the definition of \math because we need
+% to set catcodes according to plain TeX first, to allow for subscripts,
+% superscripts, special math chars, etc.
+%
+\let\implicitmath = $%$ font-lock fix
+%
+% One complication: _ usually means subscripts, but it could also mean
+% an actual _ character, as in @math{@var{some_variable} + 1}. So make
+% _ within @math be active (mathcode "8000), and distinguish by seeing
+% if the current family is \slfam, which is what @var uses.
+%
+{\catcode\underChar = \active
+\gdef\mathunderscore{%
+ \catcode\underChar=\active
+ \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
+}}
+%
+% Another complication: we want \\ (and @\) to output a \ character.
+% FYI, plain.tex uses \\ as a temporary control sequence (why?), but
+% this is not advertised and we don't care. Texinfo does not
+% otherwise define @\.
+%
+% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
+\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
+%
+\def\math{%
+ \tex
+ \mathcode`\_="8000 \mathunderscore
+ \let\\ = \mathbackslash
+ \mathactive
+ \implicitmath\finishmath}
+\def\finishmath#1{#1\implicitmath\Etex}
+
+% Some active characters (such as <) are spaced differently in math.
+% We have to reset their definitions in case the @math was an
+% argument to a command which set the catcodes (such as @item or @section).
+%
+{
+ \catcode`^ = \active
+ \catcode`< = \active
+ \catcode`> = \active
+ \catcode`+ = \active
+ \gdef\mathactive{%
+ \let^ = \ptexhat
+ \let< = \ptexless
+ \let> = \ptexgtr
+ \let+ = \ptexplus
+ }
+}
+
+% @bullet and @minus need the same treatment as @math, just above.
+\def\bullet{\implicitmath\ptexbullet\implicitmath}
+\def\minus{\implicitmath-\implicitmath}
+
+% @refill is a no-op.
+\let\refill=\relax
+
+% If working on a large document in chapters, it is convenient to
+% be able to disable indexing, cross-referencing, and contents, for test runs.
+% This is done with @novalidate (before @setfilename).
+%
+\newif\iflinks \linkstrue % by default we want the aux files.
+\let\novalidate = \linksfalse
+
+% @setfilename is done at the beginning of every texinfo file.
+% So open here the files we need to have open while reading the input.
+% This makes it possible to make a .fmt file for texinfo.
+\def\setfilename{%
+ \iflinks
+ \readauxfile
+ \fi % \openindices needs to do some work in any case.
+ \openindices
+ \fixbackslash % Turn off hack to swallow `\input texinfo'.
+ \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
+ %
+ % If texinfo.cnf is present on the system, read it.
+ % Useful for site-wide @afourpaper, etc.
+ % Just to be on the safe side, close the input stream before the \input.
+ \openin 1 texinfo.cnf
+ \ifeof1 \let\temp=\relax \else \def\temp{\input texinfo.cnf }\fi
+ \closein1
+ \temp
+ %
+ \comment % Ignore the actual filename.
+}
+
+% Called from \setfilename.
+%
+\def\openindices{%
+ \newindex{cp}%
+ \newcodeindex{fn}%
+ \newcodeindex{vr}%
+ \newcodeindex{tp}%
+ \newcodeindex{ky}%
+ \newcodeindex{pg}%
+}
+
+% @bye.
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+
+\message{pdf,}
+% adobe `portable' document format
+\newcount\tempnum
+\newcount\lnkcount
+\newtoks\filename
+\newcount\filenamelength
+\newcount\pgn
+\newtoks\toksA
+\newtoks\toksB
+\newtoks\toksC
+\newtoks\toksD
+\newbox\boxA
+\newcount\countA
+\newif\ifpdf
+\newif\ifpdfmakepagedest
+
+\ifx\pdfoutput\undefined
+ \pdffalse
+ \let\pdfmkdest = \gobble
+ \let\pdfurl = \gobble
+ \let\endlink = \relax
+ \let\linkcolor = \relax
+ \let\pdfmakeoutlines = \relax
+\else
+ \pdftrue
+ \pdfoutput = 1
+ \input pdfcolor
+ \def\dopdfimage#1#2#3{%
+ \def\imagewidth{#2}%
+ \def\imageheight{#3}%
+ % without \immediate, pdftex seg faults when the same image is
+ % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.)
+ \ifnum\pdftexversion < 14
+ \immediate\pdfimage
+ \else
+ \immediate\pdfximage
+ \fi
+ \ifx\empty\imagewidth\else width \imagewidth \fi
+ \ifx\empty\imageheight\else height \imageheight \fi
+ \ifnum\pdftexversion<13
+ #1.pdf%
+ \else
+ {#1.pdf}%
+ \fi
+ \ifnum\pdftexversion < 14 \else
+ \pdfrefximage \pdflastximage
+ \fi}
+ \def\pdfmkdest#1{{\normalturnoffactive \pdfdest name{#1} xyz}}
+ \def\pdfmkpgn#1{#1}
+ \let\linkcolor = \Blue % was Cyan, but that seems light?
+ \def\endlink{\Black\pdfendlink}
+ % Adding outlines to PDF; macros for calculating structure of outlines
+ % come from Petr Olsak
+ \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
+ \else \csname#1\endcsname \fi}
+ \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
+ \advance\tempnum by1
+ \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
+ \def\pdfmakeoutlines{{%
+ \openin 1 \jobname.toc
+ \ifeof 1\else\begingroup
+ \closein 1
+ % Thanh's hack / proper braces in bookmarks
+ \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
+ \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
+ %
+ \def\chapentry ##1##2##3{}
+ \def\secentry ##1##2##3##4{\advancenumber{chap##2}}
+ \def\subsecentry ##1##2##3##4##5{\advancenumber{sec##2.##3}}
+ \def\subsubsecentry ##1##2##3##4##5##6{\advancenumber{subsec##2.##3.##4}}
+ \let\appendixentry = \chapentry
+ \let\unnumbchapentry = \chapentry
+ \let\unnumbsecentry = \secentry
+ \let\unnumbsubsecentry = \subsecentry
+ \let\unnumbsubsubsecentry = \subsubsecentry
+ \input \jobname.toc
+ \def\chapentry ##1##2##3{%
+ \pdfoutline goto name{\pdfmkpgn{##3}}count-\expnumber{chap##2}{##1}}
+ \def\secentry ##1##2##3##4{%
+ \pdfoutline goto name{\pdfmkpgn{##4}}count-\expnumber{sec##2.##3}{##1}}
+ \def\subsecentry ##1##2##3##4##5{%
+ \pdfoutline goto name{\pdfmkpgn{##5}}count-\expnumber{subsec##2.##3.##4}{##1}}
+ \def\subsubsecentry ##1##2##3##4##5##6{%
+ \pdfoutline goto name{\pdfmkpgn{##6}}{##1}}
+ \let\appendixentry = \chapentry
+ \let\unnumbchapentry = \chapentry
+ \let\unnumbsecentry = \secentry
+ \let\unnumbsubsecentry = \subsecentry
+ \let\unnumbsubsubsecentry = \subsubsecentry
+ %
+ % Make special characters normal for writing to the pdf file.
+ %
+ \indexnofonts
+ \let\tt=\relax
+ \turnoffactive
+ \input \jobname.toc
+ \endgroup\fi
+ }}
+ \def\makelinks #1,{%
+ \def\params{#1}\def\E{END}%
+ \ifx\params\E
+ \let\nextmakelinks=\relax
+ \else
+ \let\nextmakelinks=\makelinks
+ \ifnum\lnkcount>0,\fi
+ \picknum{#1}%
+ \startlink attr{/Border [0 0 0]}
+ goto name{\pdfmkpgn{\the\pgn}}%
+ \linkcolor #1%
+ \advance\lnkcount by 1%
+ \endlink
+ \fi
+ \nextmakelinks
+ }
+ \def\picknum#1{\expandafter\pn#1}
+ \def\pn#1{%
+ \def\p{#1}%
+ \ifx\p\lbrace
+ \let\nextpn=\ppn
+ \else
+ \let\nextpn=\ppnn
+ \def\first{#1}
+ \fi
+ \nextpn
+ }
+ \def\ppn#1{\pgn=#1\gobble}
+ \def\ppnn{\pgn=\first}
+ \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,}
+ \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+ \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+ \ifx\PP\D\let\nextsp\relax
+ \else\let\nextsp\skipspaces
+ \ifx\p\space\else\addtokens{\filename}{\PP}%
+ \advance\filenamelength by 1
+ \fi
+ \fi
+ \nextsp}
+ \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
+ \ifnum\pdftexversion < 14
+ \let \startlink \pdfannotlink
+ \else
+ \let \startlink \pdfstartlink
+ \fi
+ \def\pdfurl#1{%
+ \begingroup
+ \normalturnoffactive\def\@{@}%
+ \let\value=\expandablevalue
+ \leavevmode\Red
+ \startlink attr{/Border [0 0 0]}%
+ user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
+ % #1
+ \endgroup}
+ \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+ \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+ \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+ \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+ \def\maketoks{%
+ \expandafter\poptoks\the\toksA|ENDTOKS|
+ \ifx\first0\adn0
+ \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+ \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+ \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
+ \else
+ \ifnum0=\countA\else\makelink\fi
+ \ifx\first.\let\next=\done\else
+ \let\next=\maketoks
+ \addtokens{\toksB}{\the\toksD}
+ \ifx\first,\addtokens{\toksB}{\space}\fi
+ \fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \next}
+ \def\makelink{\addtokens{\toksB}%
+ {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+ \def\pdflink#1{%
+ \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
+ \linkcolor #1\endlink}
+ \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+\fi % \ifx\pdfoutput
+
+
+\message{fonts,}
+% Font-change commands.
+
+% Texinfo sort of supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf analogous to plain's \rm, etc.
+\newfam\sffam
+\def\sf{\fam=\sffam \tensf}
+\let\li = \sf % Sometimes we call it \li, not \sf.
+
+% We don't need math for this one.
+\def\ttsl{\tenttsl}
+
+% Default leading.
+\newdimen\textleading \textleading = 13.2pt
+
+% Set the baselineskip to #1, and the lineskip and strut size
+% correspondingly. There is no deep meaning behind these magic numbers
+% used as factors; they just match (closely enough) what Knuth defined.
+%
+\def\lineskipfactor{.08333}
+\def\strutheightpercent{.70833}
+\def\strutdepthpercent {.29167}
+%
+\def\setleading#1{%
+ \normalbaselineskip = #1\relax
+ \normallineskip = \lineskipfactor\normalbaselineskip
+ \normalbaselines
+ \setbox\strutbox =\hbox{%
+ \vrule width0pt height\strutheightpercent\baselineskip
+ depth \strutdepthpercent \baselineskip
+ }%
+}
+
+% Set the font macro #1 to the font named #2, adding on the
+% specified font prefix (normally `cm').
+% #3 is the font's design size, #4 is a scale factor
+\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4}
+
+% Use cm as the default font prefix.
+% To specify the font prefix, you must define \fontprefix
+% before you read in texinfo.tex.
+\ifx\fontprefix\undefined
+\def\fontprefix{cm}
+\fi
+% Support font families that don't use the same naming scheme as CM.
+\def\rmshape{r}
+\def\rmbshape{bx} %where the normal face is bold
+\def\bfshape{b}
+\def\bxshape{bx}
+\def\ttshape{tt}
+\def\ttbshape{tt}
+\def\ttslshape{sltt}
+\def\itshape{ti}
+\def\itbshape{bxti}
+\def\slshape{sl}
+\def\slbshape{bxsl}
+\def\sfshape{ss}
+\def\sfbshape{ss}
+\def\scshape{csc}
+\def\scbshape{csc}
+
+\newcount\mainmagstep
+\ifx\bigger\relax
+ % not really supported.
+ \mainmagstep=\magstep1
+ \setfont\textrm\rmshape{12}{1000}
+ \setfont\texttt\ttshape{12}{1000}
+\else
+ \mainmagstep=\magstephalf
+ \setfont\textrm\rmshape{10}{\mainmagstep}
+ \setfont\texttt\ttshape{10}{\mainmagstep}
+\fi
+% Instead of cmb10, you may want to use cmbx10.
+% cmbx10 is a prettier font on its own, but cmb10
+% looks better when embedded in a line with cmr10
+% (in Bob's opinion).
+\setfont\textbf\bfshape{10}{\mainmagstep}
+\setfont\textit\itshape{10}{\mainmagstep}
+\setfont\textsl\slshape{10}{\mainmagstep}
+\setfont\textsf\sfshape{10}{\mainmagstep}
+\setfont\textsc\scshape{10}{\mainmagstep}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+
+% A few fonts for @defun, etc.
+\setfont\defbf\bxshape{10}{\magstep1} %was 1314
+\setfont\deftt\ttshape{10}{\magstep1}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\setfont\smallrm\rmshape{9}{1000}
+\setfont\smalltt\ttshape{9}{1000}
+\setfont\smallbf\bfshape{10}{900}
+\setfont\smallit\itshape{9}{1000}
+\setfont\smallsl\slshape{9}{1000}
+\setfont\smallsf\sfshape{9}{1000}
+\setfont\smallsc\scshape{10}{900}
+\setfont\smallttsl\ttslshape{10}{900}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+
+% Fonts for small examples (8pt).
+\setfont\smallerrm\rmshape{8}{1000}
+\setfont\smallertt\ttshape{8}{1000}
+\setfont\smallerbf\bfshape{10}{800}
+\setfont\smallerit\itshape{8}{1000}
+\setfont\smallersl\slshape{8}{1000}
+\setfont\smallersf\sfshape{8}{1000}
+\setfont\smallersc\scshape{10}{800}
+\setfont\smallerttsl\ttslshape{10}{800}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+
+% Fonts for title page:
+\setfont\titlerm\rmbshape{12}{\magstep3}
+\setfont\titleit\itbshape{10}{\magstep4}
+\setfont\titlesl\slbshape{10}{\magstep4}
+\setfont\titlett\ttbshape{12}{\magstep3}
+\setfont\titlettsl\ttslshape{10}{\magstep4}
+\setfont\titlesf\sfbshape{17}{\magstep1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\authorrm{\secrm}
+\def\authortt{\sectt}
+
+% Chapter (and unnumbered) fonts (17.28pt).
+\setfont\chaprm\rmbshape{12}{\magstep2}
+\setfont\chapit\itbshape{10}{\magstep3}
+\setfont\chapsl\slbshape{10}{\magstep3}
+\setfont\chaptt\ttbshape{12}{\magstep2}
+\setfont\chapttsl\ttslshape{10}{\magstep3}
+\setfont\chapsf\sfbshape{17}{1000}
+\let\chapbf=\chaprm
+\setfont\chapsc\scbshape{10}{\magstep3}
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+
+% Section fonts (14.4pt).
+\setfont\secrm\rmbshape{12}{\magstep1}
+\setfont\secit\itbshape{10}{\magstep2}
+\setfont\secsl\slbshape{10}{\magstep2}
+\setfont\sectt\ttbshape{12}{\magstep1}
+\setfont\secttsl\ttslshape{10}{\magstep2}
+\setfont\secsf\sfbshape{12}{\magstep1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep2}
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+
+% Subsection fonts (13.15pt).
+\setfont\ssecrm\rmbshape{12}{\magstephalf}
+\setfont\ssecit\itbshape{10}{1315}
+\setfont\ssecsl\slbshape{10}{1315}
+\setfont\ssectt\ttbshape{12}{\magstephalf}
+\setfont\ssecttsl\ttslshape{10}{1315}
+\setfont\ssecsf\sfbshape{12}{\magstephalf}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{\magstep1}
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled 1315
+% The smallcaps and symbol fonts should actually be scaled \magstep1.5,
+% but that is not a standard magnification.
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families. Since
+% texinfo doesn't allow for producing subscripts and superscripts except
+% in the main text, we don't bother to reset \scriptfont and
+% \scriptscriptfont (which would also require loading a lot more fonts).
+%
+\def\resetmathfonts{%
+ \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
+ \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
+ \textfont\ttfam=\tentt \textfont\sffam=\tensf
+}
+
+% The font-changing commands redefine the meanings of \tenSTYLE, instead
+% of just \STYLE. We do this so that font changes will continue to work
+% in math mode, where it is the current \fam that is relevant in most
+% cases, not the current font. Plain TeX does \def\bf{\fam=\bffam
+% \tenbf}, for example. By redefining \tenbf, we obviate the need to
+% redefine \bf itself.
+\def\textfonts{%
+ \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
+ \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
+ \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl
+ \resetmathfonts \setleading{\textleading}}
+\def\titlefonts{%
+ \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
+ \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
+ \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
+ \let\tenttsl=\titlettsl
+ \resetmathfonts \setleading{25pt}}
+\def\titlefont#1{{\titlefonts\rm #1}}
+\def\chapfonts{%
+ \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
+ \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
+ \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl
+ \resetmathfonts \setleading{19pt}}
+\def\secfonts{%
+ \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
+ \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
+ \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl
+ \resetmathfonts \setleading{16pt}}
+\def\subsecfonts{%
+ \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
+ \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
+ \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl
+ \resetmathfonts \setleading{15pt}}
+\let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf?
+\def\smallfonts{%
+ \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
+ \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
+ \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
+ \let\tenttsl=\smallttsl
+ \resetmathfonts \setleading{10.5pt}}
+\def\smallerfonts{%
+ \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
+ \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
+ \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
+ \let\tenttsl=\smallerttsl
+ \resetmathfonts \setleading{9.5pt}}
+
+% Set the fonts to use with the @small... environments.
+\let\smallexamplefonts = \smallfonts
+
+% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample
+% can fit this many characters:
+% 8.5x11=86 smallbook=72 a4=90 a5=69
+% If we use \smallerfonts (8pt), then we can fit this many characters:
+% 8.5x11=90+ smallbook=80 a4=90+ a5=77
+% For me, subjectively, the few extra characters that fit aren't worth
+% the additional smallness of 8pt. So I'm making the default 9pt.
+%
+% By the way, for comparison, here's what fits with @example (10pt):
+% 8.5x11=71 smallbook=60 a4=75 a5=58
+%
+% I wish we used A4 paper on this side of the Atlantic.
+%
+% --karl, 24jan03.
+
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\textfonts
+
+% Define these so they can be easily changed for other fonts.
+\def\angleleft{$\langle$}
+\def\angleright{$\rangle$}
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Fonts for short table of contents.
+\setfont\shortcontrm\rmshape{12}{1000}
+\setfont\shortcontbf\bxshape{12}{1000}
+\setfont\shortcontsl\slshape{12}{1000}
+\setfont\shortconttt\ttshape{12}{1000}
+
+%% Add scribe-like font environments, plus @l for inline lisp (usually sans
+%% serif) and @ii for TeX italic
+
+% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
+% unless the following character is such as not to need one.
+\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi}
+\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
+\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
+
+\let\i=\smartitalic
+\let\var=\smartslanted
+\let\dfn=\smartslanted
+\let\emph=\smartitalic
+\let\cite=\smartslanted
+
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+% We can't just use \exhyphenpenalty, because that only has effect at
+% the end of a paragraph. Restore normal hyphenation at the end of the
+% group within which \nohyphenation is presumably called.
+%
+\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation}
+\def\restorehyphenation{\hyphenchar\font = `- }
+
+% Set sfcode to normal for the chars that usually have another value.
+% Can't use plain's \frenchspacing because it uses the `\x notation, and
+% sometimes \x has an active definition that messes things up.
+%
+\catcode`@=11
+ \def\frenchspacing{%
+ \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
+ \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
+ }
+\catcode`@=\other
+
+\def\t#1{%
+ {\tt \rawbackslash \frenchspacing #1}%
+ \null
+}
+\let\ttfont=\t
+\def\samp#1{`\tclose{#1}'\null}
+\setfont\keyrm\rmshape{8}{1000}
+\font\keysy=cmsy9
+\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
+ \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
+ \vbox{\hrule\kern-0.4pt
+ \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
+ \kern-0.4pt\hrule}%
+ \kern-.06em\raise0.4pt\hbox{\angleright}}}}
+% The old definition, with no lozenge:
+%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
+\def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
+% @file, @option are the same as @samp.
+\let\file=\samp
+\let\option=\samp
+
+% @code is a modification of @t,
+% which makes spaces the same size as normal in the surrounding text.
+\def\tclose#1{%
+ {%
+ % Change normal interword space to be same as for the current font.
+ \spaceskip = \fontdimen2\font
+ %
+ % Switch to typewriter.
+ \tt
+ %
+ % But `\ ' produces the large typewriter interword space.
+ \def\ {{\spaceskip = 0pt{} }}%
+ %
+ % Turn off hyphenation.
+ \nohyphenation
+ %
+ \rawbackslash
+ \frenchspacing
+ #1%
+ }%
+ \null
+}
+
+% We *must* turn on hyphenation at `-' and `_' in \code.
+% Otherwise, it is too hard to avoid overfull hboxes
+% in the Emacs manual, the Library manual, etc.
+
+% Unfortunately, TeX uses one parameter (\hyphenchar) to control
+% both hyphenation at - and hyphenation within words.
+% We must therefore turn them both off (\tclose does that)
+% and arrange explicitly to hyphenate at a dash.
+% -- rms.
+{
+ \catcode`\-=\active
+ \catcode`\_=\active
+ %
+ \global\def\code{\begingroup
+ \catcode`\-=\active \let-\codedash
+ \catcode`\_=\active \let_\codeunder
+ \codex
+ }
+ %
+ % If we end up with any active - characters when handling the index,
+ % just treat them as a normal -.
+ \global\def\indexbreaks{\catcode`\-=\active \let-\realdash}
+}
+
+\def\realdash{-}
+\def\codedash{-\discretionary{}{}{}}
+\def\codeunder{%
+ % this is all so @math{@code{var_name}+1} can work. In math mode, _
+ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
+ % will therefore expand the active definition of _, which is us
+ % (inside @code that is), therefore an endless loop.
+ \ifusingtt{\ifmmode
+ \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
+ \else\normalunderscore \fi
+ \discretionary{}{}{}}%
+ {\_}%
+}
+\def\codex #1{\tclose{#1}\endgroup}
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+
+% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
+% `example' (@kbd uses ttsl only inside of @example and friends),
+% or `code' (@kbd uses normal tty font always).
+\def\kbdinputstyle{\parsearg\kbdinputstylexxx}
+\def\kbdinputstylexxx#1{%
+ \def\arg{#1}%
+ \ifx\arg\worddistinct
+ \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
+ \else\ifx\arg\wordexample
+ \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
+ \else\ifx\arg\wordcode
+ \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @kbdinputstyle `\arg'}%
+ \fi\fi\fi
+}
+\def\worddistinct{distinct}
+\def\wordexample{example}
+\def\wordcode{code}
+
+% Default is `distinct.'
+\kbdinputstyle distinct
+
+\def\xkey{\key}
+\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
+\ifx\one\xkey\ifx\threex\three \key{#2}%
+\else{\tclose{\kbdfont\look}}\fi
+\else{\tclose{\kbdfont\look}}\fi}
+
+% For @url, @env, @command quotes seem unnecessary, so use \code.
+\let\url=\code
+\let\env=\code
+\let\command=\code
+
+% @uref (abbreviation for `urlref') takes an optional (comma-separated)
+% second argument specifying the text to display and an optional third
+% arg as text to display instead of (rather than in addition to) the url
+% itself. First (mandatory) arg is the url. Perhaps eventually put in
+% a hypertex \special here.
+%
+\def\uref#1{\douref #1,,,\finish}
+\def\douref#1,#2,#3,#4\finish{\begingroup
+ \unsepspaces
+ \pdfurl{#1}%
+ \setbox0 = \hbox{\ignorespaces #3}%
+ \ifdim\wd0 > 0pt
+ \unhbox0 % third arg given, show only that
+ \else
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0 > 0pt
+ \ifpdf
+ \unhbox0 % PDF: 2nd arg given, show only it
+ \else
+ \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
+ \fi
+ \else
+ \code{#1}% only url given, so show it
+ \fi
+ \fi
+ \endlink
+\endgroup}
+
+% rms does not like angle brackets --karl, 17may97.
+% So now @email is just like @uref, unless we are pdf.
+%
+%\def\email#1{\angleleft{\tt #1}\angleright}
+\ifpdf
+ \def\email#1{\doemail#1,,\finish}
+ \def\doemail#1,#2,#3\finish{\begingroup
+ \unsepspaces
+ \pdfurl{mailto:#1}%
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
+ \endlink
+ \endgroup}
+\else
+ \let\email=\uref
+\fi
+
+% Check if we are currently using a typewriter font. Since all the
+% Computer Modern typewriter fonts have zero interword stretch (and
+% shrink), and it is reasonable to expect all typewriter fonts to have
+% this property, we can check that font parameter.
+%
+\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
+
+% Typeset a dimension, e.g., `in' or `pt'. The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
+
+% @l was never documented to mean ``switch to the Lisp font'',
+% and it is not used as such in any manual I can find. We need it for
+% Polish suppressed-l. --karl, 22sep96.
+%\def\l#1{{\li #1}\null}
+
+% Explicit font changes: @r, @sc, undocumented @ii.
+\def\r#1{{\rm #1}} % roman font
+\def\sc#1{{\smallcaps#1}} % smallcaps font
+\def\ii#1{{\it #1}} % italic font
+
+% @acronym downcases the argument and prints in smallcaps.
+\def\acronym#1{{\smallcaps \lowercase{#1}}}
+
+% @pounds{} is a sterling sign.
+\def\pounds{{\it\$}}
+
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page. Must do @settitle before @titlepage.
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+% Do an implicit @contents or @shortcontents after @end titlepage if the
+% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
+%
+\newif\ifsetcontentsaftertitlepage
+ \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
+\newif\ifsetshortcontentsaftertitlepage
+ \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
+
+\def\shorttitlepage{\parsearg\shorttitlepagezzz}
+\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+ \endgroup\page\hbox{}\page}
+
+\def\titlepage{\begingroup \parindent=0pt \textfonts
+ \let\subtitlerm=\tenrm
+ \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}%
+ %
+ \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
+ \let\tt=\authortt}%
+ %
+ % Leave some space at the very top of the page.
+ \vglue\titlepagetopglue
+ %
+ % Now you can print the title using @title.
+ \def\title{\parsearg\titlezzz}%
+ \def\titlezzz##1{\leftline{\titlefonts\rm ##1}
+ % print a rule at the page bottom also.
+ \finishedtitlepagefalse
+ \vskip4pt \hrule height 4pt width \hsize \vskip4pt}%
+ % No rule at page bottom unless we print one at the top with @title.
+ \finishedtitlepagetrue
+ %
+ % Now you can put text using @subtitle.
+ \def\subtitle{\parsearg\subtitlezzz}%
+ \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}%
+ %
+ % @author should come last, but may come many times.
+ \def\author{\parsearg\authorzzz}%
+ \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi
+ {\authorfont \leftline{##1}}}%
+ %
+ % Most title ``pages'' are actually two pages long, with space
+ % at the top of the second. We don't want the ragged left on the second.
+ \let\oldpage = \page
+ \def\page{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ \oldpage
+ \let\page = \oldpage
+ \hbox{}}%
+% \def\page{\oldpage \hbox{}}
+}
+
+\def\Etitlepage{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ % It is important to do the page break before ending the group,
+ % because the headline and footline are only empty inside the group.
+ % If we use the new definition of \page, we always get a blank page
+ % after the title page, which we certainly don't want.
+ \oldpage
+ \endgroup
+ %
+ % Need this before the \...aftertitlepage checks so that if they are
+ % in effect the toc pages will come out with page numbers.
+ \HEADINGSon
+ %
+ % If they want short, they certainly want long too.
+ \ifsetshortcontentsaftertitlepage
+ \shortcontents
+ \contents
+ \global\let\shortcontents = \relax
+ \global\let\contents = \relax
+ \fi
+ %
+ \ifsetcontentsaftertitlepage
+ \contents
+ \global\let\contents = \relax
+ \global\let\shortcontents = \relax
+ \fi
+}
+
+\def\finishtitlepage{%
+ \vskip4pt \hrule height 2pt width \hsize
+ \vskip\titlepagebottomglue
+ \finishedtitlepagetrue
+}
+
+%%% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks\evenheadline % headline on even pages
+\newtoks\oddheadline % headline on odd pages
+\newtoks\evenfootline % footline on even pages
+\newtoks\oddfootline % footline on odd pages
+
+% Now make Tex use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+ \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+ \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what @headings on does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\everyheading{\parsearg\everyheadingxxx}
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\everyfooting{\parsearg\everyfootingxxx}
+
+{\catcode`\@=0 %
+
+\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish}
+\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish}
+\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\everyheadingxxx#1{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
+
+\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish}
+\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish}
+\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{%
+ \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
+ %
+ % Leave some space for the footline. Hopefully ok to assume
+ % @evenfooting will not be used by itself.
+ \global\advance\pageheight by -\baselineskip
+ \global\advance\vsize by -\baselineskip
+}
+
+\gdef\everyfootingxxx#1{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+%
+}% unbind the catcode of @.
+
+% @headings double turns headings on for double-sided printing.
+% @headings single turns headings on for single-sided printing.
+% @headings off turns them off.
+% @headings on same as @headings double, retained for compatibility.
+% @headings after turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off at the start of a document,
+% and turned `on' after @end titlepage.
+
+\def\headings #1 {\csname HEADINGS#1\endcsname}
+
+\def\HEADINGSoff{
+\global\evenheadline={\hfil} \global\evenfootline={\hfil}
+\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
+\HEADINGSoff
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+\let\contentsalignmacro = \chappager
+
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+
+% Subroutines used in generating headings
+% This produces Day Month Year style of output.
+% Only define if not already defined, in case a txi-??.tex file has set
+% up a different format (e.g., txi-cs.tex does this).
+\ifx\today\undefined
+\def\today{%
+ \number\day\space
+ \ifcase\month
+ \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+ \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+ \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+ \fi
+ \space\number\year}
+\fi
+
+% @settitle line... specifies the title of the document, for headings.
+% It generates no output of its own.
+\def\thistitle{\putwordNoTitle}
+\def\settitle{\parsearg\settitlezzz}
+\def\settitlezzz #1{\gdef\thistitle{#1}}
+
+
+\message{tables,}
+% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @vtable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\newif\ifitemxneedsnegativevskip
+
+\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\itemxpar \parsearg\itemzzz}
+
+\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz}
+\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz}
+
+\def\internalBkitem{\smallbreak \parsearg\kitemzzz}
+\def\internalBkitemx{\itemxpar \parsearg\kitemzzz}
+
+\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}%
+ \itemzzz {#1}}
+
+\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}%
+ \itemzzz {#1}}
+
+\def\itemzzz #1{\begingroup %
+ \advance\hsize by -\rightskip
+ \advance\hsize by -\tableindent
+ \setbox0=\hbox{\itemfont{#1}}%
+ \itemindex{#1}%
+ \nobreak % This prevents a break before @itemx.
+ %
+ % If the item text does not fit in the space we have, put it on a line
+ % by itself, and do not allow a page break either before or after that
+ % line. We do not start a paragraph here because then if the next
+ % command is, e.g., @kindex, the whatsit would get put into the
+ % horizontal list on a line by itself, resulting in extra blank space.
+ \ifdim \wd0>\itemmax
+ %
+ % Make this a paragraph so we get the \parskip glue and wrapping,
+ % but leave it ragged-right.
+ \begingroup
+ \advance\leftskip by-\tableindent
+ \advance\hsize by\tableindent
+ \advance\rightskip by0pt plus1fil
+ \leavevmode\unhbox0\par
+ \endgroup
+ %
+ % We're going to be starting a paragraph, but we don't want the
+ % \parskip glue -- logically it's part of the @item we just started.
+ \nobreak \vskip-\parskip
+ %
+ % Stop a page break at the \parskip glue coming up. (Unfortunately
+ % we can't prevent a possible page break at the following
+ % \baselineskip glue.) However, if what follows is an environment
+ % such as @example, there will be no \parskip glue; then
+ % the negative vskip we just would cause the example and the item to
+ % crash together. So we use this bizarre value of 10001 as a signal
+ % to \aboveenvbreak to insert \parskip glue after all.
+ % (Possibly there are other commands that could be followed by
+ % @example which need the same treatment, but not section titles; or
+ % maybe section titles are the only special case and they should be
+ % penalty 10001...)
+ \penalty 10001
+ \endgroup
+ \itemxneedsnegativevskipfalse
+ \else
+ % The item text fits into the space. Start a paragraph, so that the
+ % following text (if any) will end up on the same line.
+ \noindent
+ % Do this with kerns and \unhbox so that if there is a footnote in
+ % the item text, it can migrate to the main vertical list and
+ % eventually be printed.
+ \nobreak\kern-\tableindent
+ \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
+ \unhbox0
+ \nobreak\kern\dimen0
+ \endgroup
+ \itemxneedsnegativevskiptrue
+ \fi
+}
+
+\def\item{\errmessage{@item while not in a table}}
+\def\itemx{\errmessage{@itemx while not in a table}}
+\def\kitem{\errmessage{@kitem while not in a table}}
+\def\kitemx{\errmessage{@kitemx while not in a table}}
+\def\xitem{\errmessage{@xitem while not in a table}}
+\def\xitemx{\errmessage{@xitemx while not in a table}}
+
+% Contains a kludge to get @end[description] to work.
+\def\description{\tablez{\dontindex}{1}{}{}{}{}}
+
+% @table, @ftable, @vtable.
+\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}
+{\obeylines\obeyspaces%
+\gdef\tablex #1^^M{%
+\tabley\dontindex#1 \endtabley}}
+
+\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex}
+{\obeylines\obeyspaces%
+\gdef\ftablex #1^^M{%
+\tabley\fnitemindex#1 \endtabley
+\def\Eftable{\endgraf\afterenvbreak\endgroup}%
+\let\Etable=\relax}}
+
+\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex}
+{\obeylines\obeyspaces%
+\gdef\vtablex #1^^M{%
+\tabley\vritemindex#1 \endtabley
+\def\Evtable{\endgraf\afterenvbreak\endgroup}%
+\let\Etable=\relax}}
+
+\def\dontindex #1{}
+\def\fnitemindex #1{\doind {fn}{\code{#1}}}%
+\def\vritemindex #1{\doind {vr}{\code{#1}}}%
+
+{\obeyspaces %
+\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup%
+\tablez{#1}{#2}{#3}{#4}{#5}{#6}}}
+
+\def\tablez #1#2#3#4#5#6{%
+\aboveenvbreak %
+\begingroup %
+\def\Edescription{\Etable}% Necessary kludge.
+\let\itemindex=#1%
+\ifnum 0#3>0 \advance \leftskip by #3\mil \fi %
+\ifnum 0#4>0 \tableindent=#4\mil \fi %
+\ifnum 0#5>0 \advance \rightskip by #5\mil \fi %
+\def\itemfont{#2}%
+\itemmax=\tableindent %
+\advance \itemmax by -\itemmargin %
+\advance \leftskip by \tableindent %
+\exdentamount=\tableindent
+\parindent = 0pt
+\parskip = \smallskipamount
+\ifdim \parskip=0pt \parskip=2pt \fi%
+\def\Etable{\endgraf\afterenvbreak\endgroup}%
+\let\item = \internalBitem %
+\let\itemx = \internalBitemx %
+\let\kitem = \internalBkitem %
+\let\kitemx = \internalBkitemx %
+\let\xitem = \internalBxitem %
+\let\xitemx = \internalBxitemx %
+}
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\def\itemize{\parsearg\itemizezzz}
+
+\def\itemizezzz #1{%
+ \begingroup % ended by the @end itemize
+ \itemizey {#1}{\Eitemize}
+}
+
+\def\itemizey #1#2{%
+\aboveenvbreak %
+\itemmax=\itemindent %
+\advance \itemmax by -\itemmargin %
+\advance \leftskip by \itemindent %
+\exdentamount=\itemindent
+\parindent = 0pt %
+\parskip = \smallskipamount %
+\ifdim \parskip=0pt \parskip=2pt \fi%
+\def#2{\endgraf\afterenvbreak\endgroup}%
+\def\itemcontents{#1}%
+\let\item=\itemizeitem}
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list. No
+% argument is the same as `1'.
+%
+\def\enumerate{\parsearg\enumeratezzz}
+\def\enumeratezzz #1{\enumeratey #1 \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+ \begingroup % ended by the @end enumerate
+ %
+ % If we were given no argument, pretend we were given `1'.
+ \def\thearg{#1}%
+ \ifx\thearg\empty \def\thearg{1}\fi
+ %
+ % Detect if the argument is a single token. If so, it might be a
+ % letter. Otherwise, the only valid thing it can be is a number.
+ % (We will always have one token, because of the test we just made.
+ % This is a good thing, since \splitoff doesn't work given nothing at
+ % all -- the first parameter is undelimited.)
+ \expandafter\splitoff\thearg\endmark
+ \ifx\rest\empty
+ % Only one token in the argument. It could still be anything.
+ % A ``lowercase letter'' is one whose \lccode is nonzero.
+ % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+ % not equal to itself.
+ % Otherwise, we assume it's a number.
+ %
+ % We need the \relax at the end of the \ifnum lines to stop TeX from
+ % continuing to look for a <number>.
+ %
+ \ifnum\lccode\expandafter`\thearg=0\relax
+ \numericenumerate % a number (we hope)
+ \else
+ % It's a letter.
+ \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+ \lowercaseenumerate % lowercase letter
+ \else
+ \uppercaseenumerate % uppercase letter
+ \fi
+ \fi
+ \else
+ % Multiple tokens in the argument. We hope it's a number.
+ \numericenumerate
+ \fi
+}
+
+% An @enumerate whose labels are integers. The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+ \itemno = \thearg
+ \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more lowercase letters in @enumerate; get a bigger
+ alphabet}%
+ \fi
+ \char\lccode\itemno
+ }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more uppercase letters in @enumerate; get a bigger
+ alphabet}
+ \fi
+ \char\uccode\itemno
+ }%
+}
+
+% Call itemizey, adding a period to the first argument and supplying the
+% common last two arguments. Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+ \advance\itemno by -1
+ \itemizey{#1.}\Eenumerate\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+% Definition of @item while inside @itemize.
+
+\def\itemizeitem{%
+\advance\itemno by 1
+{\let\par=\endgraf \smallbreak}%
+\ifhmode \errmessage{In hmode at itemizeitem}\fi
+{\parskip=0in \hskip 0pt
+\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}%
+\vadjust{\penalty 1200}}%
+\flushcr}
+
+% @multitable macros
+% Amy Hendrickson, 8/18/94, 3/6/96
+%
+% @multitable ... @end multitable will make as many columns as desired.
+% Contents of each column will wrap at width given in preamble. Width
+% can be specified either with sample text given in a template line,
+% or in percent of \hsize, the current width of text on page.
+
+% Table can continue over pages but will only break between lines.
+
+% To make preamble:
+%
+% Either define widths of columns in terms of percent of \hsize:
+% @multitable @columnfractions .25 .3 .45
+% @item ...
+%
+% Numbers following @columnfractions are the percent of the total
+% current hsize to be used for each column. You may use as many
+% columns as desired.
+
+
+% Or use a template:
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item ...
+% using the widest term desired in each column.
+%
+% For those who want to use more than one line's worth of words in
+% the preamble, break the line within one argument and it
+% will parse correctly, i.e.,
+%
+% @multitable {Column 1 template} {Column 2 template} {Column 3
+% template}
+% Not:
+% @multitable {Column 1 template} {Column 2 template}
+% {Column 3 template}
+
+% Each new table line starts with @item, each subsequent new column
+% starts with @tab. Empty columns may be produced by supplying @tab's
+% with nothing between them for as many times as empty columns are needed,
+% ie, @tab@tab@tab will produce two empty columns.
+
+% @item, @tab, @multitable or @end multitable do not need to be on their
+% own lines, but it will not hurt if they are.
+
+% Sample multitable:
+
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item first col stuff @tab second col stuff @tab third col
+% @item
+% first col stuff
+% @tab
+% second col stuff
+% @tab
+% third col
+% @item first col stuff @tab second col stuff
+% @tab Many paragraphs of text may be used in any column.
+%
+% They will wrap at the width determined by the template.
+% @item@tab@tab This will be in third column.
+% @end multitable
+
+% Default dimensions may be reset by user.
+% @multitableparskip is vertical space between paragraphs in table.
+% @multitableparindent is paragraph indent in table.
+% @multitablecolmargin is horizontal space to be left between columns.
+% @multitablelinespace is space to leave between table items, baseline
+% to baseline.
+% 0pt means it depends on current normal line spacing.
+%
+\newskip\multitableparskip
+\newskip\multitableparindent
+\newdimen\multitablecolspace
+\newskip\multitablelinespace
+\multitableparskip=0pt
+\multitableparindent=6pt
+\multitablecolspace=12pt
+\multitablelinespace=0pt
+
+% Macros used to set up halign preamble:
+%
+\let\endsetuptable\relax
+\def\xendsetuptable{\endsetuptable}
+\let\columnfractions\relax
+\def\xcolumnfractions{\columnfractions}
+\newif\ifsetpercent
+
+% #1 is the part of the @columnfraction before the decimal point, which
+% is presumably either 0 or the empty string (but we don't check, we
+% just throw it away). #2 is the decimal part, which we use as the
+% percent of \hsize for this column.
+\def\pickupwholefraction#1.#2 {%
+ \global\advance\colcount by 1
+ \expandafter\xdef\csname col\the\colcount\endcsname{.#2\hsize}%
+ \setuptable
+}
+
+\newcount\colcount
+\def\setuptable#1{%
+ \def\firstarg{#1}%
+ \ifx\firstarg\xendsetuptable
+ \let\go = \relax
+ \else
+ \ifx\firstarg\xcolumnfractions
+ \global\setpercenttrue
+ \else
+ \ifsetpercent
+ \let\go\pickupwholefraction
+ \else
+ \global\advance\colcount by 1
+ \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
+ % separator; typically that is always in the input, anyway.
+ \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+ \fi
+ \fi
+ \ifx\go\pickupwholefraction
+ % Put the argument back for the \pickupwholefraction call, so
+ % we'll always have a period there to be parsed.
+ \def\go{\pickupwholefraction#1}%
+ \else
+ \let\go = \setuptable
+ \fi%
+ \fi
+ \go
+}
+
+% @multitable ... @end multitable definitions:
+%
+\def\multitable{\parsearg\dotable}
+\def\dotable#1{\bgroup
+ \vskip\parskip
+ \let\item=\crcrwithfootnotes
+ % A \tab used to include \hskip1sp. But then the space in a template
+ % line is not enough. That is bad. So let's go back to just & until
+ % we encounter the problem it was intended to solve again. --karl,
+ % nathan@acm.org, 20apr99.
+ \let\tab=&%
+ \let\startfootins=\startsavedfootnote
+ \tolerance=9500
+ \hbadness=9500
+ \setmultitablespacing
+ \parskip=\multitableparskip
+ \parindent=\multitableparindent
+ \overfullrule=0pt
+ \global\colcount=0
+ \def\Emultitable{%
+ \global\setpercentfalse
+ \crcrwithfootnotes\crcr
+ \egroup\egroup
+ }%
+ %
+ % To parse everything between @multitable and @item:
+ \setuptable#1 \endsetuptable
+ %
+ % \everycr will reset column counter, \colcount, at the end of
+ % each line. Every column entry will cause \colcount to advance by one.
+ % The table preamble
+ % looks at the current \colcount to find the correct column width.
+ \everycr{\noalign{%
+ %
+ % \filbreak%% keeps underfull box messages off when table breaks over pages.
+ % Maybe so, but it also creates really weird page breaks when the table
+ % breaks over pages. Wouldn't \vfil be better? Wait until the problem
+ % manifests itself, so it can be fixed for real --karl.
+ \global\colcount=0\relax}}%
+ %
+ % This preamble sets up a generic column definition, which will
+ % be used as many times as user calls for columns.
+ % \vtop will set a single line and will also let text wrap and
+ % continue for many paragraphs if desired.
+ \halign\bgroup&\global\advance\colcount by 1\relax
+ \multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname
+ %
+ % In order to keep entries from bumping into each other
+ % we will add a \leftskip of \multitablecolspace to all columns after
+ % the first one.
+ %
+ % If a template has been used, we will add \multitablecolspace
+ % to the width of each template entry.
+ %
+ % If the user has set preamble in terms of percent of \hsize we will
+ % use that dimension as the width of the column, and the \leftskip
+ % will keep entries from bumping into each other. Table will start at
+ % left margin and final column will justify at right margin.
+ %
+ % Make sure we don't inherit \rightskip from the outer environment.
+ \rightskip=0pt
+ \ifnum\colcount=1
+ % The first column will be indented with the surrounding text.
+ \advance\hsize by\leftskip
+ \else
+ \ifsetpercent \else
+ % If user has not set preamble in terms of percent of \hsize
+ % we will advance \hsize by \multitablecolspace.
+ \advance\hsize by \multitablecolspace
+ \fi
+ % In either case we will make \leftskip=\multitablecolspace:
+ \leftskip=\multitablecolspace
+ \fi
+ % Ignoring space at the beginning and end avoids an occasional spurious
+ % blank line, when TeX decides to break the line at the space before the
+ % box from the multistrut, so the strut ends up on a line by itself.
+ % For example:
+ % @multitable @columnfractions .11 .89
+ % @item @code{#}
+ % @tab Legal holiday which is valid in major parts of the whole country.
+ % Is automatically provided with highlighting sequences respectively marking
+ % characters.
+ \noindent\ignorespaces##\unskip\multistrut}\cr
+}
+
+\def\setmultitablespacing{% test to see if user has set \multitablelinespace.
+% If so, do nothing. If not, give it an appropriate dimension based on
+% current baselineskip.
+\ifdim\multitablelinespace=0pt
+\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
+\global\advance\multitablelinespace by-\ht0
+%% strut to put in table in case some entry doesn't have descenders,
+%% to keep lines equally spaced
+\let\multistrut = \strut
+\else
+%% FIXME: what is \box0 supposed to be?
+\gdef\multistrut{\vrule height\multitablelinespace depth\dp0
+width0pt\relax} \fi
+%% Test to see if parskip is larger than space between lines of
+%% table. If not, do nothing.
+%% If so, set to same dimension as multitablelinespace.
+\ifdim\multitableparskip>\multitablelinespace
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+ %% than skip between lines in the table.
+\fi%
+\ifdim\multitableparskip=0pt
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+ %% than skip between lines in the table.
+\fi}
+
+% In case a @footnote appears inside an alignment, save the footnote
+% text to a box and make the \insert when a row of the table is
+% finished. Otherwise, the insertion is lost, it never migrates to the
+% main vertical list. --kasal, 22jan03.
+%
+\newbox\savedfootnotes
+%
+% \dotable \let's \startfootins to this, so that \dofootnote will call
+% it instead of starting the insertion right away.
+\def\startsavedfootnote{%
+ \global\setbox\savedfootnotes = \vbox\bgroup
+ \unvbox\savedfootnotes
+}
+\def\crcrwithfootnotes{%
+ \crcr
+ \ifvoid\savedfootnotes \else
+ \noalign{\insert\footins{\box\savedfootnotes}}%
+ \fi
+}
+
+\message{conditionals,}
+% Prevent errors for section commands.
+% Used in @ignore and in failing conditionals.
+\def\ignoresections{%
+ \let\chapter=\relax
+ \let\unnumbered=\relax
+ \let\top=\relax
+ \let\unnumberedsec=\relax
+ \let\unnumberedsection=\relax
+ \let\unnumberedsubsec=\relax
+ \let\unnumberedsubsection=\relax
+ \let\unnumberedsubsubsec=\relax
+ \let\unnumberedsubsubsection=\relax
+ \let\section=\relax
+ \let\subsec=\relax
+ \let\subsubsec=\relax
+ \let\subsection=\relax
+ \let\subsubsection=\relax
+ \let\appendix=\relax
+ \let\appendixsec=\relax
+ \let\appendixsection=\relax
+ \let\appendixsubsec=\relax
+ \let\appendixsubsection=\relax
+ \let\appendixsubsubsec=\relax
+ \let\appendixsubsubsection=\relax
+ \let\contents=\relax
+ \let\smallbook=\relax
+ \let\titlepage=\relax
+}
+
+% Used in nested conditionals, where we have to parse the Texinfo source
+% and so want to turn off most commands, in case they are used
+% incorrectly.
+%
+% We use \empty instead of \relax for the @def... commands, so that \end
+% doesn't throw an error. For instance:
+% @ignore
+% @deffn ...
+% @end deffn
+% @end ignore
+%
+% The @end deffn is going to get expanded, because we're trying to allow
+% nested conditionals. But we don't want to expand the actual @deffn,
+% since it might be syntactically correct and intended to be ignored.
+% Since \end checks for \relax, using \empty does not cause an error.
+%
+\def\ignoremorecommands{%
+ \let\defcodeindex = \relax
+ \let\defcv = \empty
+ \let\defcvx = \empty
+ \let\Edefcv = \empty
+ \let\deffn = \empty
+ \let\deffnx = \empty
+ \let\Edeffn = \empty
+ \let\defindex = \relax
+ \let\defivar = \empty
+ \let\defivarx = \empty
+ \let\Edefivar = \empty
+ \let\defmac = \empty
+ \let\defmacx = \empty
+ \let\Edefmac = \empty
+ \let\defmethod = \empty
+ \let\defmethodx = \empty
+ \let\Edefmethod = \empty
+ \let\defop = \empty
+ \let\defopx = \empty
+ \let\Edefop = \empty
+ \let\defopt = \empty
+ \let\defoptx = \empty
+ \let\Edefopt = \empty
+ \let\defspec = \empty
+ \let\defspecx = \empty
+ \let\Edefspec = \empty
+ \let\deftp = \empty
+ \let\deftpx = \empty
+ \let\Edeftp = \empty
+ \let\deftypefn = \empty
+ \let\deftypefnx = \empty
+ \let\Edeftypefn = \empty
+ \let\deftypefun = \empty
+ \let\deftypefunx = \empty
+ \let\Edeftypefun = \empty
+ \let\deftypeivar = \empty
+ \let\deftypeivarx = \empty
+ \let\Edeftypeivar = \empty
+ \let\deftypemethod = \empty
+ \let\deftypemethodx = \empty
+ \let\Edeftypemethod = \empty
+ \let\deftypeop = \empty
+ \let\deftypeopx = \empty
+ \let\Edeftypeop = \empty
+ \let\deftypevar = \empty
+ \let\deftypevarx = \empty
+ \let\Edeftypevar = \empty
+ \let\deftypevr = \empty
+ \let\deftypevrx = \empty
+ \let\Edeftypevr = \empty
+ \let\defun = \empty
+ \let\defunx = \empty
+ \let\Edefun = \empty
+ \let\defvar = \empty
+ \let\defvarx = \empty
+ \let\Edefvar = \empty
+ \let\defvr = \empty
+ \let\defvrx = \empty
+ \let\Edefvr = \empty
+ \let\clear = \relax
+ \let\down = \relax
+ \let\evenfooting = \relax
+ \let\evenheading = \relax
+ \let\everyfooting = \relax
+ \let\everyheading = \relax
+ \let\headings = \relax
+ \let\include = \relax
+ \let\item = \relax
+ \let\lowersections = \relax
+ \let\oddfooting = \relax
+ \let\oddheading = \relax
+ \let\printindex = \relax
+ \let\pxref = \relax
+ \let\raisesections = \relax
+ \let\ref = \relax
+ \let\set = \relax
+ \let\setchapternewpage = \relax
+ \let\setchapterstyle = \relax
+ \let\settitle = \relax
+ \let\up = \relax
+ \let\verbatiminclude = \relax
+ \let\xref = \relax
+}
+
+% Ignore @ignore, @ifhtml, @ifinfo, and the like.
+%
+\def\direntry{\doignore{direntry}}
+\def\documentdescriptionword{documentdescription}
+\def\documentdescription{\doignore{documentdescription}}
+\def\html{\doignore{html}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\ifinfo{\doignore{ifinfo}}
+\def\ifnottex{\doignore{ifnottex}}
+\def\ifplaintext{\doignore{ifplaintext}}
+\def\ifxml{\doignore{ifxml}}
+\def\ignore{\doignore{ignore}}
+\def\menu{\doignore{menu}}
+\def\xml{\doignore{xml}}
+
+% @dircategory CATEGORY -- specify a category of the dir file
+% which this file should belong to. Ignore this in TeX.
+\let\dircategory = \comment
+
+% Ignore text until a line `@end #1'.
+%
+\def\doignore#1{\begingroup
+ % Don't complain about control sequences we have declared \outer.
+ \ignoresections
+ %
+ % Define a command to swallow text until we reach `@end #1'.
+ % This @ is a catcode 12 token (that is the normal catcode of @ in
+ % this texinfo.tex file). We change the catcode of @ below to match.
+ \long\def\doignoretext##1@end #1{\enddoignore}%
+ %
+ % Make sure that spaces turn into tokens that match what \doignoretext wants.
+ \catcode\spaceChar = 10
+ %
+ % Ignore braces, too, so mismatched braces don't cause trouble.
+ \catcode`\{ = 9
+ \catcode`\} = 9
+ %
+ % We must not have @c interpreted as a control sequence.
+ \catcode`\@ = 12
+ %
+ \def\ignoreword{#1}%
+ \ifx\ignoreword\documentdescriptionword
+ % The c kludge breaks documentdescription, since
+ % `documentdescription' contains a `c'. Means not everything will
+ % be ignored inside @documentdescription, but oh well...
+ \else
+ % Make the letter c a comment character so that the rest of the line
+ % will be ignored. This way, the document can have (for example)
+ % @c @end ifinfo
+ % and the @end ifinfo will be properly ignored.
+ % (We've just changed @ to catcode 12.)
+ \catcode`\c = 14
+ \fi
+ %
+ % And now expand the command defined above.
+ \doignoretext
+}
+
+% What we do to finish off ignored text.
+%
+\def\enddoignore{\endgroup\ignorespaces}%
+
+\newif\ifwarnedobs\warnedobsfalse
+\def\obstexwarn{%
+ \ifwarnedobs\relax\else
+ % We need to warn folks that they may have trouble with TeX 3.0.
+ % This uses \immediate\write16 rather than \message to get newlines.
+ \immediate\write16{}
+ \immediate\write16{WARNING: for users of Unix TeX 3.0!}
+ \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).}
+ \immediate\write16{If you are running another version of TeX, relax.}
+ \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.}
+ \immediate\write16{ Then upgrade your TeX installation if you can.}
+ \immediate\write16{ (See ftp://ftp.gnu.org/non-gnu/TeX.README.)}
+ \immediate\write16{If you are stuck with version 3.0, run the}
+ \immediate\write16{ script ``tex3patch'' from the Texinfo distribution}
+ \immediate\write16{ to use a workaround.}
+ \immediate\write16{}
+ \global\warnedobstrue
+ \fi
+}
+
+% **In TeX 3.0, setting text in \nullfont hangs tex. For a
+% workaround (which requires the file ``dummy.tfm'' to be installed),
+% uncomment the following line:
+%%%%%\font\nullfont=dummy\let\obstexwarn=\relax
+
+% Ignore text, except that we keep track of conditional commands for
+% purposes of nesting, up to an `@end #1' command.
+%
+\def\nestedignore#1{%
+ \obstexwarn
+ % We must actually expand the ignored text to look for the @end
+ % command, so that nested ignore constructs work. Thus, we put the
+ % text into a \vbox and then do nothing with the result. To minimize
+ % the chance of memory overflow, we follow the approach outlined on
+ % page 401 of the TeXbook.
+ %
+ \setbox0 = \vbox\bgroup
+ % Don't complain about control sequences we have declared \outer.
+ \ignoresections
+ %
+ % Define `@end #1' to end the box, which will in turn undefine the
+ % @end command again.
+ \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}%
+ %
+ % We are going to be parsing Texinfo commands. Most cause no
+ % trouble when they are used incorrectly, but some commands do
+ % complicated argument parsing or otherwise get confused, so we
+ % undefine them.
+ %
+ % We can't do anything about stray @-signs, unfortunately;
+ % they'll produce `undefined control sequence' errors.
+ \ignoremorecommands
+ %
+ % Set the current font to be \nullfont, a TeX primitive, and define
+ % all the font commands to also use \nullfont. We don't use
+ % dummy.tfm, as suggested in the TeXbook, because some sites
+ % might not have that installed. Therefore, math mode will still
+ % produce output, but that should be an extremely small amount of
+ % stuff compared to the main input.
+ %
+ \nullfont
+ \let\tenrm=\nullfont \let\tenit=\nullfont \let\tensl=\nullfont
+ \let\tenbf=\nullfont \let\tentt=\nullfont \let\smallcaps=\nullfont
+ \let\tensf=\nullfont
+ % Similarly for index fonts.
+ \let\smallrm=\nullfont \let\smallit=\nullfont \let\smallsl=\nullfont
+ \let\smallbf=\nullfont \let\smalltt=\nullfont \let\smallsc=\nullfont
+ \let\smallsf=\nullfont
+ % Similarly for smallexample fonts.
+ \let\smallerrm=\nullfont \let\smallerit=\nullfont \let\smallersl=\nullfont
+ \let\smallerbf=\nullfont \let\smallertt=\nullfont \let\smallersc=\nullfont
+ \let\smallersf=\nullfont
+ %
+ % Don't complain when characters are missing from the fonts.
+ \tracinglostchars = 0
+ %
+ % Don't bother to do space factor calculations.
+ \frenchspacing
+ %
+ % Don't report underfull hboxes.
+ \hbadness = 10000
+ %
+ % Do minimal line-breaking.
+ \pretolerance = 10000
+ %
+ % Do not execute instructions in @tex.
+ \def\tex{\doignore{tex}}%
+ % Do not execute macro definitions.
+ % `c' is a comment character, so the word `macro' will get cut off.
+ \def\macro{\doignore{ma}}%
+}
+
+% @set VAR sets the variable VAR to an empty value.
+% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
+%
+% Since we want to separate VAR from REST-OF-LINE (which might be
+% empty), we can't just use \parsearg; we have to insert a space of our
+% own to delimit the rest of the line, and then take it out again if we
+% didn't need it. Make sure the catcode of space is correct to avoid
+% losing inside @example, for instance.
+%
+\def\set{\begingroup\catcode` =10
+ \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR.
+ \parsearg\setxxx}
+\def\setxxx#1{\setyyy#1 \endsetyyy}
+\def\setyyy#1 #2\endsetyyy{%
+ \def\temp{#2}%
+ \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty
+ \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted.
+ \fi
+ \endgroup
+}
+% Can't use \xdef to pre-expand #2 and save some time, since \temp or
+% \next or other control sequences that we've defined might get us into
+% an infinite loop. Consider `@set foo @cite{bar}'.
+\def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}}
+
+% @clear VAR clears (i.e., unsets) the variable VAR.
+%
+\def\clear{\parsearg\clearxxx}
+\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax}
+
+% @value{foo} gets the text saved in variable foo.
+{
+ \catcode`\_ = \active
+ %
+ % We might end up with active _ or - characters in the argument if
+ % we're called from @code, as @code{@value{foo-bar_}}. So \let any
+ % such active characters to their normal equivalents.
+ \gdef\value{\begingroup
+ \catcode`\-=\other \catcode`\_=\other
+ \indexbreaks \let_\normalunderscore
+ \valuexxx}
+}
+\def\valuexxx#1{\expandablevalue{#1}\endgroup}
+
+% We have this subroutine so that we can handle at least some @value's
+% properly in indexes (we \let\value to this in \indexdummies). Ones
+% whose names contain - or _ still won't work, but we can't do anything
+% about that. The command has to be fully expandable (if the variable
+% is set), since the result winds up in the index file. This means that
+% if the variable's value contains other Texinfo commands, it's almost
+% certain it will fail (although perhaps we could fix that with
+% sufficient work to do a one-level expansion on the result, instead of
+% complete).
+%
+\def\expandablevalue#1{%
+ \expandafter\ifx\csname SET#1\endcsname\relax
+ {[No value for ``#1'']}%
+ \message{Variable `#1', used in @value, is not set.}%
+ \else
+ \csname SET#1\endcsname
+ \fi
+}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+%
+\def\ifset{\parsearg\doifset}
+\def\doifset#1{%
+ \expandafter\ifx\csname SET#1\endcsname\relax
+ \let\next=\ifsetfail
+ \else
+ \let\next=\ifsetsucceed
+ \fi
+ \next
+}
+\def\ifsetsucceed{\conditionalsucceed{ifset}}
+\def\ifsetfail{\nestedignore{ifset}}
+\defineunmatchedend{ifset}
+
+% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
+% defined with @set, or has been undefined with @clear.
+%
+\def\ifclear{\parsearg\doifclear}
+\def\doifclear#1{%
+ \expandafter\ifx\csname SET#1\endcsname\relax
+ \let\next=\ifclearsucceed
+ \else
+ \let\next=\ifclearfail
+ \fi
+ \next
+}
+\def\ifclearsucceed{\conditionalsucceed{ifclear}}
+\def\ifclearfail{\nestedignore{ifclear}}
+\defineunmatchedend{ifclear}
+
+% @iftex, @ifnothtml, @ifnotinfo, @ifnotplaintext always succeed; we
+% read the text following, through the first @end iftex (etc.). Make
+% `@end iftex' (etc.) valid only after an @iftex.
+%
+\def\iftex{\conditionalsucceed{iftex}}
+\def\ifnothtml{\conditionalsucceed{ifnothtml}}
+\def\ifnotinfo{\conditionalsucceed{ifnotinfo}}
+\def\ifnotplaintext{\conditionalsucceed{ifnotplaintext}}
+\defineunmatchedend{iftex}
+\defineunmatchedend{ifnothtml}
+\defineunmatchedend{ifnotinfo}
+\defineunmatchedend{ifnotplaintext}
+
+% True conditional. Since \set globally defines its variables, we can
+% just start and end a group (to keep the @end definition undefined at
+% the outer level).
+%
+\def\conditionalsucceed#1{\begingroup
+ \expandafter\def\csname E#1\endcsname{\endgroup}%
+}
+
+% @defininfoenclose.
+\let\definfoenclose=\comment
+
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within \newindex.
+{\catcode`\@=11
+\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}}
+
+% \newindex {foo} defines an index named foo.
+% It automatically defines \fooindex such that
+% \fooindex ...rest of line... puts an entry in the index foo.
+% It also defines \fooindfile to be the number of the output channel for
+% the file that accumulates this index. The file's extension is foo.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+%
+\def\newindex#1{%
+ \iflinks
+ \expandafter\newwrite \csname#1indfile\endcsname
+ \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+ \fi
+ \expandafter\xdef\csname#1index\endcsname{% % Define @#1index
+ \noexpand\doindex{#1}}
+}
+
+% @defindex foo == \newindex{foo}
+%
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+%
+\def\defcodeindex{\parsearg\newcodeindex}
+%
+\def\newcodeindex#1{%
+ \iflinks
+ \expandafter\newwrite \csname#1indfile\endcsname
+ \openout \csname#1indfile\endcsname \jobname.#1
+ \fi
+ \expandafter\xdef\csname#1index\endcsname{%
+ \noexpand\docodeindex{#1}}%
+}
+
+
+% @synindex foo bar makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+%
+% @syncodeindex foo bar similar, but put all entries made for index foo
+% inside @code.
+%
+\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
+\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
+
+% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
+% #3 the target index (bar).
+\def\dosynindex#1#2#3{%
+ % Only do \closeout if we haven't already done it, else we'll end up
+ % closing the target index.
+ \expandafter \ifx\csname donesynindex#2\endcsname \undefined
+ % The \closeout helps reduce unnecessary open files; the limit on the
+ % Acorn RISC OS is a mere 16 files.
+ \expandafter\closeout\csname#2indfile\endcsname
+ \expandafter\let\csname\donesynindex#2\endcsname = 1
+ \fi
+ % redefine \fooindfile:
+ \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
+ \expandafter\let\csname#2indfile\endcsname=\temp
+ % redefine \fooindex:
+ \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
+}
+
+% Define \doindex, the driver for all \fooindex macros.
+% Argument #1 is generated by the calling \fooindex macro,
+% and it is "foo", the name of the index.
+
+% \doindex just uses \parsearg; it calls \doind for the actual work.
+% This is because \doind is more useful to call from other macros.
+
+% There is also \dosubind {index}{topic}{subtopic}
+% which makes an entry in a two-level index such as the operation index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
+\def\singleindexer #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
+\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
+
+% Take care of Texinfo commands that can appear in an index entry.
+% Since there are some commands we want to expand, and others we don't,
+% we have to laboriously prevent expansion for those that we don't.
+%
+\def\indexdummies{%
+ \def\@{@}% change to @@ when we switch to @ as escape char in index files.
+ \def\ {\realbackslash\space }%
+ % Need these in case \tex is in effect and \{ is a \delimiter again.
+ % But can't use \lbracecmd and \rbracecmd because texindex assumes
+ % braces and backslashes are used only as delimiters.
+ \let\{ = \mylbrace
+ \let\} = \myrbrace
+ %
+ % \definedummyword defines \#1 as \realbackslash #1\space, thus
+ % effectively preventing its expansion. This is used only for control
+ % words, not control letters, because the \space would be incorrect
+ % for control characters, but is needed to separate the control word
+ % from whatever follows.
+ %
+ % For control letters, we have \definedummyletter, which omits the
+ % space.
+ %
+ % These can be used both for control words that take an argument and
+ % those that do not. If it is followed by {arg} in the input, then
+ % that will dutifully get written to the index (or wherever).
+ %
+ \def\definedummyword##1{%
+ \expandafter\def\csname ##1\endcsname{\realbackslash ##1\space}%
+ }%
+ \def\definedummyletter##1{%
+ \expandafter\def\csname ##1\endcsname{\realbackslash ##1}%
+ }%
+ %
+ % Do the redefinitions.
+ \commondummies
+}
+
+% For the aux file, @ is the escape character. So we want to redefine
+% everything using @ instead of \realbackslash. When everything uses
+% @, this will be simpler.
+%
+\def\atdummies{%
+ \def\@{@@}%
+ \def\ {@ }%
+ \let\{ = \lbraceatcmd
+ \let\} = \rbraceatcmd
+ %
+ % (See comments in \indexdummies.)
+ \def\definedummyword##1{%
+ \expandafter\def\csname ##1\endcsname{@##1\space}%
+ }%
+ \def\definedummyletter##1{%
+ \expandafter\def\csname ##1\endcsname{@##1}%
+ }%
+ %
+ % Do the redefinitions.
+ \commondummies
+}
+
+% Called from \indexdummies and \atdummies. \definedummyword and
+% \definedummyletter must be defined first.
+%
+\def\commondummies{%
+ %
+ \normalturnoffactive
+ %
+ % Control letters and accents.
+ \definedummyletter{_}%
+ \definedummyletter{,}%
+ \definedummyletter{"}%
+ \definedummyletter{`}%
+ \definedummyletter{'}%
+ \definedummyletter{^}%
+ \definedummyletter{~}%
+ \definedummyletter{=}%
+ \definedummyword{u}%
+ \definedummyword{v}%
+ \definedummyword{H}%
+ \definedummyword{dotaccent}%
+ \definedummyword{ringaccent}%
+ \definedummyword{tieaccent}%
+ \definedummyword{ubaraccent}%
+ \definedummyword{udotaccent}%
+ \definedummyword{dotless}%
+ %
+ % Other non-English letters.
+ \definedummyword{AA}%
+ \definedummyword{AE}%
+ \definedummyword{L}%
+ \definedummyword{OE}%
+ \definedummyword{O}%
+ \definedummyword{aa}%
+ \definedummyword{ae}%
+ \definedummyword{l}%
+ \definedummyword{oe}%
+ \definedummyword{o}%
+ \definedummyword{ss}%
+ %
+ % Although these internal commands shouldn't show up, sometimes they do.
+ \definedummyword{bf}%
+ \definedummyword{gtr}%
+ \definedummyword{hat}%
+ \definedummyword{less}%
+ \definedummyword{sf}%
+ \definedummyword{sl}%
+ \definedummyword{tclose}%
+ \definedummyword{tt}%
+ %
+ % Texinfo font commands.
+ \definedummyword{b}%
+ \definedummyword{i}%
+ \definedummyword{r}%
+ \definedummyword{sc}%
+ \definedummyword{t}%
+ %
+ \definedummyword{TeX}%
+ \definedummyword{acronym}%
+ \definedummyword{cite}%
+ \definedummyword{code}%
+ \definedummyword{command}%
+ \definedummyword{dfn}%
+ \definedummyword{dots}%
+ \definedummyword{emph}%
+ \definedummyword{env}%
+ \definedummyword{file}%
+ \definedummyword{kbd}%
+ \definedummyword{key}%
+ \definedummyword{math}%
+ \definedummyword{option}%
+ \definedummyword{samp}%
+ \definedummyword{strong}%
+ \definedummyword{uref}%
+ \definedummyword{url}%
+ \definedummyword{var}%
+ \definedummyword{w}%
+ %
+ % Assorted special characters.
+ \definedummyword{bullet}%
+ \definedummyword{copyright}%
+ \definedummyword{dots}%
+ \definedummyword{enddots}%
+ \definedummyword{equiv}%
+ \definedummyword{error}%
+ \definedummyword{expansion}%
+ \definedummyword{minus}%
+ \definedummyword{pounds}%
+ \definedummyword{point}%
+ \definedummyword{print}%
+ \definedummyword{result}%
+ %
+ % Handle some cases of @value -- where the variable name does not
+ % contain - or _, and the value does not contain any
+ % (non-fully-expandable) commands.
+ \let\value = \expandablevalue
+ %
+ % Normal spaces, not active ones.
+ \unsepspaces
+ %
+ % No macro expansion.
+ \turnoffmacros
+}
+
+% If an index command is used in an @example environment, any spaces
+% therein should become regular spaces in the raw index file, not the
+% expansion of \tie (\leavevmode \penalty \@M \ ).
+{\obeyspaces
+ \gdef\unsepspaces{\obeyspaces\let =\space}}
+
+
+% \indexnofonts is used when outputting the strings to sort the index
+% by, and when constructing control sequence names. It eliminates all
+% control sequences and just writes whatever the best ASCII sort string
+% would be for a given command (usually its argument).
+%
+\def\indexdummytex{TeX}
+\def\indexdummydots{...}
+%
+\def\indexnofonts{%
+ \def\ { }%
+ \def\@{@}%
+ % how to handle braces?
+ \def\_{\normalunderscore}%
+ %
+ \let\,=\asis
+ \let\"=\asis
+ \let\`=\asis
+ \let\'=\asis
+ \let\^=\asis
+ \let\~=\asis
+ \let\==\asis
+ \let\u=\asis
+ \let\v=\asis
+ \let\H=\asis
+ \let\dotaccent=\asis
+ \let\ringaccent=\asis
+ \let\tieaccent=\asis
+ \let\ubaraccent=\asis
+ \let\udotaccent=\asis
+ \let\dotless=\asis
+ %
+ % Other non-English letters.
+ \def\AA{AA}%
+ \def\AE{AE}%
+ \def\L{L}%
+ \def\OE{OE}%
+ \def\O{O}%
+ \def\aa{aa}%
+ \def\ae{ae}%
+ \def\l{l}%
+ \def\oe{oe}%
+ \def\o{o}%
+ \def\ss{ss}%
+ \def\exclamdown{!}%
+ \def\questiondown{?}%
+ %
+ % Don't no-op \tt, since it isn't a user-level command
+ % and is used in the definitions of the active chars like <, >, |, etc.
+ % Likewise with the other plain tex font commands.
+ %\let\tt=\asis
+ %
+ % Texinfo font commands.
+ \let\b=\asis
+ \let\i=\asis
+ \let\r=\asis
+ \let\sc=\asis
+ \let\t=\asis
+ %
+ \let\TeX=\indexdummytex
+ \let\acronym=\asis
+ \let\cite=\asis
+ \let\code=\asis
+ \let\command=\asis
+ \let\dfn=\asis
+ \let\dots=\indexdummydots
+ \let\emph=\asis
+ \let\env=\asis
+ \let\file=\asis
+ \let\kbd=\asis
+ \let\key=\asis
+ \let\math=\asis
+ \let\option=\asis
+ \let\samp=\asis
+ \let\strong=\asis
+ \let\uref=\asis
+ \let\url=\asis
+ \let\var=\asis
+ \let\w=\asis
+}
+
+\let\indexbackslash=0 %overridden during \printindex.
+\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
+
+% For \ifx comparisons.
+\def\emptymacro{\empty}
+
+% Most index entries go through here, but \dosubind is the general case.
+%
+\def\doind#1#2{\dosubind{#1}{#2}\empty}
+
+% Workhorse for all \fooindexes.
+% #1 is name of index, #2 is stuff to put there, #3 is subentry --
+% \empty if called from \doind, as we usually are. The main exception
+% is with defuns, which call us directly.
+%
+\def\dosubind#1#2#3{%
+ % Put the index entry in the margin if desired.
+ \ifx\SETmarginindex\relax\else
+ \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%
+ \fi
+ {%
+ \count255=\lastpenalty
+ {%
+ \indexdummies % Must do this here, since \bf, etc expand at this stage
+ \escapechar=`\\
+ {%
+ \let\folio = 0% We will expand all macros now EXCEPT \folio.
+ \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
+ % so it will be output as is; and it will print as backslash.
+ %
+ % The main index entry text.
+ \toks0 = {#2}%
+ %
+ % If third arg is present, precede it with space in sort key.
+ \def\thirdarg{#3}%
+ \ifx\thirdarg\emptymacro \else
+ % If the third (subentry) arg is present, add it to the index
+ % line to write.
+ \toks0 = \expandafter{\the\toks0 \space #3}%
+ \fi
+ %
+ % Process the index entry with all font commands turned off, to
+ % get the string to sort by.
+ {\indexnofonts
+ \edef\temp{\the\toks0}% need full expansion
+ \xdef\indexsorttmp{\temp}%
+ }%
+ %
+ % Set up the complete index entry, with both the sort key and
+ % the original text, including any font commands. We write
+ % three arguments to \entry to the .?? file (four in the
+ % subentry case), texindex reduces to two when writing the .??s
+ % sorted result.
+ \edef\temp{%
+ \write\csname#1indfile\endcsname{%
+ \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}%
+ }%
+ %
+ % If a skip is the last thing on the list now, preserve it
+ % by backing up by \lastskip, doing the \write, then inserting
+ % the skip again. Otherwise, the whatsit generated by the
+ % \write will make \lastskip zero. The result is that sequences
+ % like this:
+ % @end defun
+ % @tindex whatever
+ % @defun ...
+ % will have extra space inserted, because the \medbreak in the
+ % start of the @defun won't see the skip inserted by the @end of
+ % the previous defun.
+ %
+ % But don't do any of this if we're not in vertical mode. We
+ % don't want to do a \vskip and prematurely end a paragraph.
+ %
+ % Avoid page breaks due to these extra skips, too.
+ %
+ \iflinks
+ \ifvmode
+ \skip0 = \lastskip
+ \ifdim\lastskip = 0pt \else \nobreak\vskip-\skip0 \fi
+ \fi
+ %
+ \temp % do the write
+ %
+ \ifvmode \ifdim\skip0 = 0pt \else \nobreak\vskip\skip0 \fi \fi
+ \fi
+ }%
+ }%
+ \penalty\count255
+ }%
+}
+
+% The index entry written in the file actually looks like
+% \entry {sortstring}{page}{topic}
+% or
+% \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+% \initial {c}
+% before the first topic whose initial is c
+% \entry {topic}{pagelist}
+% for a topic that is used without subtopics
+% \primary {topic}
+% for the beginning of a topic that is used with subtopics
+% \secondary {subtopic}{pagelist}
+% for each subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+\def\cindexsub {\begingroup\obeylines\cindexsub}
+{\obeylines %
+\gdef\cindexsub "#1" #2^^M{\endgroup %
+\dosubind{cp}{#2}{#1}}}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% @printindex causes a particular index (the ??s file) to get printed.
+% It does not print any chapter heading (usually an @unnumbered).
+%
+\def\printindex{\parsearg\doprintindex}
+\def\doprintindex#1{\begingroup
+ \dobreak \chapheadingskip{10000}%
+ %
+ \smallfonts \rm
+ \tolerance = 9500
+ \indexbreaks
+ %
+ % See if the index file exists and is nonempty.
+ % Change catcode of @ here so that if the index file contains
+ % \initial {@}
+ % as its first line, TeX doesn't complain about mismatched braces
+ % (because it thinks @} is a control sequence).
+ \catcode`\@ = 11
+ \openin 1 \jobname.#1s
+ \ifeof 1
+ % \enddoublecolumns gets confused if there is no text in the index,
+ % and it loses the chapter title and the aux file entries for the
+ % index. The easiest way to prevent this problem is to make sure
+ % there is some text.
+ \putwordIndexNonexistent
+ \else
+ %
+ % If the index file exists but is empty, then \openin leaves \ifeof
+ % false. We have to make TeX try to read something from the file, so
+ % it can discover if there is anything in it.
+ \read 1 to \temp
+ \ifeof 1
+ \putwordIndexIsEmpty
+ \else
+ % Index files are almost Texinfo source, but we use \ as the escape
+ % character. It would be better to use @, but that's too big a change
+ % to make right now.
+ \def\indexbackslash{\rawbackslashxx}%
+ \catcode`\\ = 0
+ \escapechar = `\\
+ \begindoublecolumns
+ \input \jobname.#1s
+ \enddoublecolumns
+ \fi
+ \fi
+ \closein 1
+\endgroup}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+\def\initial#1{{%
+ % Some minor font changes for the special characters.
+ \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+ %
+ % Remove any glue we may have, we'll be inserting our own.
+ \removelastskip
+ %
+ % We like breaks before the index initials, so insert a bonus.
+ \penalty -300
+ %
+ % Typeset the initial. Making this add up to a whole number of
+ % baselineskips increases the chance of the dots lining up from column
+ % to column. It still won't often be perfect, because of the stretch
+ % we need before each entry, but it's better.
+ %
+ % No shrink because it confuses \balancecolumns.
+ \vskip 1.67\baselineskip plus .5\baselineskip
+ \leftline{\secbf #1}%
+ \vskip .33\baselineskip plus .1\baselineskip
+ %
+ % Do our best not to break after the initial.
+ \nobreak
+}}
+
+% This typesets a paragraph consisting of #1, dot leaders, and then #2
+% flush to the right margin. It is used for index and table of contents
+% entries. The paragraph is indented by \leftskip.
+%
+\def\entry#1#2{\begingroup
+ %
+ % Start a new paragraph if necessary, so our assignments below can't
+ % affect previous text.
+ \par
+ %
+ % Do not fill out the last line with white space.
+ \parfillskip = 0in
+ %
+ % No extra space above this paragraph.
+ \parskip = 0in
+ %
+ % Do not prefer a separate line ending with a hyphen to fewer lines.
+ \finalhyphendemerits = 0
+ %
+ % \hangindent is only relevant when the entry text and page number
+ % don't both fit on one line. In that case, bob suggests starting the
+ % dots pretty far over on the line. Unfortunately, a large
+ % indentation looks wrong when the entry text itself is broken across
+ % lines. So we use a small indentation and put up with long leaders.
+ %
+ % \hangafter is reset to 1 (which is the value we want) at the start
+ % of each paragraph, so we need not do anything with that.
+ \hangindent = 2em
+ %
+ % When the entry text needs to be broken, just fill out the first line
+ % with blank space.
+ \rightskip = 0pt plus1fil
+ %
+ % A bit of stretch before each entry for the benefit of balancing columns.
+ \vskip 0pt plus1pt
+ %
+ % Start a ``paragraph'' for the index entry so the line breaking
+ % parameters we've set above will have an effect.
+ \noindent
+ %
+ % Insert the text of the index entry. TeX will do line-breaking on it.
+ #1%
+ % The following is kludged to not output a line of dots in the index if
+ % there are no page numbers. The next person who breaks this will be
+ % cursed by a Unix daemon.
+ \def\tempa{{\rm }}%
+ \def\tempb{#2}%
+ \edef\tempc{\tempa}%
+ \edef\tempd{\tempb}%
+ \ifx\tempc\tempd\ \else%
+ %
+ % If we must, put the page number on a line of its own, and fill out
+ % this line with blank space. (The \hfil is overwhelmed with the
+ % fill leaders glue in \indexdotfill if the page number does fit.)
+ \hfil\penalty50
+ \null\nobreak\indexdotfill % Have leaders before the page number.
+ %
+ % The `\ ' here is removed by the implicit \unskip that TeX does as
+ % part of (the primitive) \par. Without it, a spurious underfull
+ % \hbox ensues.
+ \ifpdf
+ \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+ \else
+ \ #2% The page number ends the paragraph.
+ \fi
+ \fi%
+ \par
+\endgroup}
+
+% Like \dotfill except takes at least 1 em.
+\def\indexdotfill{\cleaders
+ \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill}
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+\def\secondary#1#2{{%
+ \parfillskip=0in
+ \parskip=0in
+ \hangindent=1in
+ \hangafter=1
+ \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
+ \ifpdf
+ \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+ \else
+ #2
+ \fi
+ \par
+}}
+
+% Define two-column mode, which we use to typeset indexes.
+% Adapted from the TeXbook, page 416, which is to say,
+% the manmac.tex format used to print the TeXbook itself.
+\catcode`\@=11
+
+\newbox\partialpage
+\newdimen\doublecolumnhsize
+
+\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
+ % Grab any single-column material above us.
+ \output = {%
+ %
+ % Here is a possibility not foreseen in manmac: if we accumulate a
+ % whole lot of material, we might end up calling this \output
+ % routine twice in a row (see the doublecol-lose test, which is
+ % essentially a couple of indexes with @setchapternewpage off). In
+ % that case we just ship out what is in \partialpage with the normal
+ % output routine. Generally, \partialpage will be empty when this
+ % runs and this will be a no-op. See the indexspread.tex test case.
+ \ifvoid\partialpage \else
+ \onepageout{\pagecontents\partialpage}%
+ \fi
+ %
+ \global\setbox\partialpage = \vbox{%
+ % Unvbox the main output page.
+ \unvbox\PAGE
+ \kern-\topskip \kern\baselineskip
+ }%
+ }%
+ \eject % run that output routine to set \partialpage
+ %
+ % Use the double-column output routine for subsequent pages.
+ \output = {\doublecolumnout}%
+ %
+ % Change the page size parameters. We could do this once outside this
+ % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
+ % format, but then we repeat the same computation. Repeating a couple
+ % of assignments once per index is clearly meaningless for the
+ % execution time, so we may as well do it in one place.
+ %
+ % First we halve the line length, less a little for the gutter between
+ % the columns. We compute the gutter based on the line length, so it
+ % changes automatically with the paper format. The magic constant
+ % below is chosen so that the gutter has the same value (well, +-<1pt)
+ % as it did when we hard-coded it.
+ %
+ % We put the result in a separate register, \doublecolumhsize, so we
+ % can restore it in \pagesofar, after \hsize itself has (potentially)
+ % been clobbered.
+ %
+ \doublecolumnhsize = \hsize
+ \advance\doublecolumnhsize by -.04154\hsize
+ \divide\doublecolumnhsize by 2
+ \hsize = \doublecolumnhsize
+ %
+ % Double the \vsize as well. (We don't need a separate register here,
+ % since nobody clobbers \vsize.)
+ \vsize = 2\vsize
+}
+
+% The double-column output routine for all double-column pages except
+% the last.
+%
+\def\doublecolumnout{%
+ \splittopskip=\topskip \splitmaxdepth=\maxdepth
+ % Get the available space for the double columns -- the normal
+ % (undoubled) page height minus any material left over from the
+ % previous page.
+ \dimen@ = \vsize
+ \divide\dimen@ by 2
+ \advance\dimen@ by -\ht\partialpage
+ %
+ % box0 will be the left-hand column, box2 the right.
+ \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+ \onepageout\pagesofar
+ \unvbox255
+ \penalty\outputpenalty
+}
+%
+% Re-output the contents of the output page -- any previous material,
+% followed by the two boxes we just split, in box0 and box2.
+\def\pagesofar{%
+ \unvbox\partialpage
+ %
+ \hsize = \doublecolumnhsize
+ \wd0=\hsize \wd2=\hsize
+ \hbox to\pagewidth{\box0\hfil\box2}%
+}
+%
+% All done with double columns.
+\def\enddoublecolumns{%
+ \output = {%
+ % Split the last of the double-column material. Leave it on the
+ % current page, no automatic page break.
+ \balancecolumns
+ %
+ % If we end up splitting too much material for the current page,
+ % though, there will be another page break right after this \output
+ % invocation ends. Having called \balancecolumns once, we do not
+ % want to call it again. Therefore, reset \output to its normal
+ % definition right away. (We hope \balancecolumns will never be
+ % called on to balance too much material, but if it is, this makes
+ % the output somewhat more palatable.)
+ \global\output = {\onepageout{\pagecontents\PAGE}}%
+ }%
+ \eject
+ \endgroup % started in \begindoublecolumns
+ %
+ % \pagegoal was set to the doubled \vsize above, since we restarted
+ % the current page. We're now back to normal single-column
+ % typesetting, so reset \pagegoal to the normal \vsize (after the
+ % \endgroup where \vsize got restored).
+ \pagegoal = \vsize
+}
+%
+% Called at the end of the double column material.
+\def\balancecolumns{%
+ \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
+ \dimen@ = \ht0
+ \advance\dimen@ by \topskip
+ \advance\dimen@ by-\baselineskip
+ \divide\dimen@ by 2 % target to split to
+ %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
+ \splittopskip = \topskip
+ % Loop until we get a decent breakpoint.
+ {%
+ \vbadness = 10000
+ \loop
+ \global\setbox3 = \copy0
+ \global\setbox1 = \vsplit3 to \dimen@
+ \ifdim\ht3>\dimen@
+ \global\advance\dimen@ by 1pt
+ \repeat
+ }%
+ %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
+ \setbox0=\vbox to\dimen@{\unvbox1}%
+ \setbox2=\vbox to\dimen@{\unvbox3}%
+ %
+ \pagesofar
+}
+\catcode`\@ = \other
+
+
+\message{sectioning,}
+% Chapters, sections, etc.
+
+\newcount\chapno
+\newcount\secno \secno=0
+\newcount\subsecno \subsecno=0
+\newcount\subsubsecno \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount\appendixno \appendixno = `\@
+% \def\appendixletter{\char\the\appendixno}
+% We do the following for the sake of pdftex, which needs the actual
+% letter in the expansion, not just typeset.
+\def\appendixletter{%
+ \ifnum\appendixno=`A A%
+ \else\ifnum\appendixno=`B B%
+ \else\ifnum\appendixno=`C C%
+ \else\ifnum\appendixno=`D D%
+ \else\ifnum\appendixno=`E E%
+ \else\ifnum\appendixno=`F F%
+ \else\ifnum\appendixno=`G G%
+ \else\ifnum\appendixno=`H H%
+ \else\ifnum\appendixno=`I I%
+ \else\ifnum\appendixno=`J J%
+ \else\ifnum\appendixno=`K K%
+ \else\ifnum\appendixno=`L L%
+ \else\ifnum\appendixno=`M M%
+ \else\ifnum\appendixno=`N N%
+ \else\ifnum\appendixno=`O O%
+ \else\ifnum\appendixno=`P P%
+ \else\ifnum\appendixno=`Q Q%
+ \else\ifnum\appendixno=`R R%
+ \else\ifnum\appendixno=`S S%
+ \else\ifnum\appendixno=`T T%
+ \else\ifnum\appendixno=`U U%
+ \else\ifnum\appendixno=`V V%
+ \else\ifnum\appendixno=`W W%
+ \else\ifnum\appendixno=`X X%
+ \else\ifnum\appendixno=`Y Y%
+ \else\ifnum\appendixno=`Z Z%
+ % The \the is necessary, despite appearances, because \appendixletter is
+ % expanded while writing the .toc file. \char\appendixno is not
+ % expandable, thus it is written literally, thus all appendixes come out
+ % with the same letter (or @) in the toc without it.
+ \else\char\the\appendixno
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+% Each @chapter defines this as the name of the chapter.
+% page headings and footings can use it. @section does likewise.
+\def\thischapter{}
+\def\thissection{}
+
+\newcount\absseclevel % used to calculate proper heading level
+\newcount\secbase\secbase=0 % @raise/lowersections modify this count
+
+% @raisesections: treat @section as chapter, @subsection as section, etc.
+\def\raisesections{\global\advance\secbase by -1}
+\let\up=\raisesections % original BFox name
+
+% @lowersections: treat @chapter as section, @section as subsection, etc.
+\def\lowersections{\global\advance\secbase by 1}
+\let\down=\lowersections % original BFox name
+
+% Choose a numbered-heading macro
+% #1 is heading level if unmodified by @raisesections or @lowersections
+% #2 is text for heading
+\def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+\ifcase\absseclevel
+ \chapterzzz{#2}
+\or
+ \seczzz{#2}
+\or
+ \numberedsubseczzz{#2}
+\or
+ \numberedsubsubseczzz{#2}
+\else
+ \ifnum \absseclevel<0
+ \chapterzzz{#2}
+ \else
+ \numberedsubsubseczzz{#2}
+ \fi
+\fi
+}
+
+% like \numhead, but chooses appendix heading levels
+\def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+\ifcase\absseclevel
+ \appendixzzz{#2}
+\or
+ \appendixsectionzzz{#2}
+\or
+ \appendixsubseczzz{#2}
+\or
+ \appendixsubsubseczzz{#2}
+\else
+ \ifnum \absseclevel<0
+ \appendixzzz{#2}
+ \else
+ \appendixsubsubseczzz{#2}
+ \fi
+\fi
+}
+
+% like \numhead, but chooses numberless heading levels
+\def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+\ifcase\absseclevel
+ \unnumberedzzz{#2}
+\or
+ \unnumberedseczzz{#2}
+\or
+ \unnumberedsubseczzz{#2}
+\or
+ \unnumberedsubsubseczzz{#2}
+\else
+ \ifnum \absseclevel<0
+ \unnumberedzzz{#2}
+ \else
+ \unnumberedsubsubseczzz{#2}
+ \fi
+\fi
+}
+
+% @chapter, @appendix, @unnumbered.
+\def\thischaptername{No Chapter Title}
+\outer\def\chapter{\parsearg\chapteryyy}
+\def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz #1{%
+ \secno=0 \subsecno=0 \subsubsecno=0
+ \global\advance \chapno by 1 \message{\putwordChapter\space \the\chapno}%
+ \chapmacro {#1}{\the\chapno}%
+ \gdef\thissection{#1}%
+ \gdef\thischaptername{#1}%
+ % We don't substitute the actual chapter name into \thischapter
+ % because we don't want its macros evaluated now.
+ \xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}%
+ \writetocentry{chap}{#1}{{\the\chapno}}
+ \donoderef
+ \global\let\section = \numberedsec
+ \global\let\subsection = \numberedsubsec
+ \global\let\subsubsection = \numberedsubsubsec
+}
+
+% we use \chapno to avoid indenting back
+\def\appendixbox#1{%
+ \setbox0 = \hbox{\putwordAppendix{} \the\chapno}%
+ \hbox to \wd0{#1\hss}}
+
+\outer\def\appendix{\parsearg\appendixyyy}
+\def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz
+\def\appendixzzz #1{%
+ \secno=0 \subsecno=0 \subsubsecno=0
+ \global\advance \appendixno by 1
+ \message{\putwordAppendix\space \appendixletter}%
+ \chapmacro {#1}{\appendixbox{\putwordAppendix{} \appendixletter}}%
+ \gdef\thissection{#1}%
+ \gdef\thischaptername{#1}%
+ \xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}%
+ \writetocentry{appendix}{#1}{{\appendixletter}}
+ \appendixnoderef
+ \global\let\section = \appendixsec
+ \global\let\subsection = \appendixsubsec
+ \global\let\subsubsection = \appendixsubsubsec
+}
+
+% @centerchap is like @unnumbered, but the heading is centered.
+\outer\def\centerchap{\parsearg\centerchapyyy}
+\def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}}
+
+% @top is like @unnumbered.
+\outer\def\top{\parsearg\unnumberedyyy}
+
+\outer\def\unnumbered{\parsearg\unnumberedyyy}
+\def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
+\def\unnumberedzzz #1{%
+ \secno=0 \subsecno=0 \subsubsecno=0
+ %
+ % This used to be simply \message{#1}, but TeX fully expands the
+ % argument to \message. Therefore, if #1 contained @-commands, TeX
+ % expanded them. For example, in `@unnumbered The @cite{Book}', TeX
+ % expanded @cite (which turns out to cause errors because \cite is meant
+ % to be executed, not expanded).
+ %
+ % Anyway, we don't want the fully-expanded definition of @cite to appear
+ % as a result of the \message, we just want `@cite' itself. We use
+ % \the<toks register> to achieve this: TeX expands \the<toks> only once,
+ % simply yielding the contents of <toks register>. (We also do this for
+ % the toc entries.)
+ \toks0 = {#1}\message{(\the\toks0)}%
+ %
+ \unnumbchapmacro {#1}%
+ \gdef\thischapter{#1}\gdef\thissection{#1}%
+ \writetocentry{unnumbchap}{#1}{{\the\chapno}}
+ \unnumbnoderef
+ \global\let\section = \unnumberedsec
+ \global\let\subsection = \unnumberedsubsec
+ \global\let\subsubsection = \unnumberedsubsubsec
+}
+
+% Sections.
+\outer\def\numberedsec{\parsearg\secyyy}
+\def\secyyy #1{\numhead1{#1}} % normally calls seczzz
+\def\seczzz #1{%
+ \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+ \gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}%
+ \writetocentry{sec}{#1}{{\the\chapno}{\the\secno}}
+ \donoderef
+ \nobreak
+}
+
+\outer\def\appendixsection{\parsearg\appendixsecyyy}
+\outer\def\appendixsec{\parsearg\appendixsecyyy}
+\def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz
+\def\appendixsectionzzz #1{%
+ \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+ \gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}%
+ \writetocentry{sec}{#1}{{\appendixletter}{\the\secno}}
+ \appendixnoderef
+ \nobreak
+}
+
+\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy}
+\def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz
+\def\unnumberedseczzz #1{%
+ \plainsecheading {#1}\gdef\thissection{#1}%
+ \writetocentry{unnumbsec}{#1}{{\the\chapno}{\the\secno}}
+ \unnumbnoderef
+ \nobreak
+}
+
+% Subsections.
+\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy}
+\def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz
+\def\numberedsubseczzz #1{%
+ \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+ \subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}%
+ \writetocentry{subsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}}
+ \donoderef
+ \nobreak
+}
+
+\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy}
+\def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz
+\def\appendixsubseczzz #1{%
+ \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+ \subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}%
+ \writetocentry{subsec}{#1}{{\appendixletter}{\the\secno}{\the\subsecno}}
+ \appendixnoderef
+ \nobreak
+}
+
+\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy}
+\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
+\def\unnumberedsubseczzz #1{%
+ \plainsubsecheading {#1}\gdef\thissection{#1}%
+ \writetocentry{unnumbsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}}
+ \unnumbnoderef
+ \nobreak
+}
+
+% Subsubsections.
+\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy}
+\def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz
+\def\numberedsubsubseczzz #1{%
+ \gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+ \subsubsecheading {#1}
+ {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
+ \writetocentry{subsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}}
+ \donoderef
+ \nobreak
+}
+
+\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy}
+\def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz
+\def\appendixsubsubseczzz #1{%
+ \gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+ \subsubsecheading {#1}
+ {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
+ \writetocentry{subsubsec}{#1}{{\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}}
+ \appendixnoderef
+ \nobreak
+}
+
+\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy}
+\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
+\def\unnumberedsubsubseczzz #1{%
+ \plainsubsubsecheading {#1}\gdef\thissection{#1}%
+ \writetocentry{unnumbsubsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}}
+ \unnumbnoderef
+ \nobreak
+}
+
+% These are variants which are not "outer", so they can appear in @ifinfo.
+% Actually, they should now be obsolete; ordinary section commands should work.
+\def\infotop{\parsearg\unnumberedzzz}
+\def\infounnumbered{\parsearg\unnumberedzzz}
+\def\infounnumberedsec{\parsearg\unnumberedseczzz}
+\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz}
+\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
+
+\def\infoappendix{\parsearg\appendixzzz}
+\def\infoappendixsec{\parsearg\appendixseczzz}
+\def\infoappendixsubsec{\parsearg\appendixsubseczzz}
+\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz}
+
+\def\infochapter{\parsearg\chapterzzz}
+\def\infosection{\parsearg\sectionzzz}
+\def\infosubsection{\parsearg\subsectionzzz}
+\def\infosubsubsection{\parsearg\subsubsectionzzz}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\global\let\section = \numberedsec
+\global\let\subsection = \numberedsubsec
+\global\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+% NOTE on use of \vbox for chapter headings, section headings, and such:
+% 1) We use \vbox rather than the earlier \line to permit
+% overlong headings to fold.
+% 2) \hyphenpenalty is set to 10000 because hyphenation in a
+% heading is obnoxious; this forbids it.
+% 3) Likewise, headings look best if no \parindent is used, and
+% if justification is not attempted. Hence \raggedright.
+
+
+\def\majorheading{\parsearg\majorheadingzzz}
+\def\majorheadingzzz #1{%
+ {\advance\chapheadingskip by 10pt \chapbreak }%
+ {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\penalty 200}
+
+\def\chapheading{\parsearg\chapheadingzzz}
+\def\chapheadingzzz #1{\chapbreak %
+ {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\penalty 200}
+
+% @heading, @subheading, @subsubheading.
+\def\heading{\parsearg\plainsecheading}
+\def\subheading{\parsearg\plainsubsecheading}
+\def\subsubheading{\parsearg\plainsubsubsecheading}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+%%% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+
+%%% Define plain chapter starts, and page on/off switching for it
+% Parameter controlling skip before chapter headings (if needed)
+
+\newskip\chapheadingskip
+
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+\def\chappager{\par\vfill\supereject}
+\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
+
+\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{
+\global\let\contentsalignmacro = \chapoddpage
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+\def\CHAPFplain{
+\global\let\chapmacro=\chfplain
+\global\let\unnumbchapmacro=\unnchfplain
+\global\let\centerchapmacro=\centerchfplain}
+
+% Plain chapter opening.
+% #1 is the text, #2 the chapter number or empty if unnumbered.
+\def\chfplain#1#2{%
+ \pchapsepmacro
+ {%
+ \chapfonts \rm
+ \def\chapnum{#2}%
+ \setbox0 = \hbox{#2\ifx\chapnum\empty\else\enspace\fi}%
+ \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+ \hangindent = \wd0 \centerparametersmaybe
+ \unhbox0 #1\par}%
+ }%
+ \nobreak\bigskip % no page break after a chapter title
+ \nobreak
+}
+
+% Plain opening for unnumbered.
+\def\unnchfplain#1{\chfplain{#1}{}}
+
+% @centerchap -- centered and unnumbered.
+\let\centerparametersmaybe = \relax
+\def\centerchfplain#1{{%
+ \def\centerparametersmaybe{%
+ \advance\rightskip by 3\rightskip
+ \leftskip = \rightskip
+ \parfillskip = 0pt
+ }%
+ \chfplain{#1}{}%
+}}
+
+\CHAPFplain % The default
+
+\def\unnchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\nobreak
+}
+
+\def\chfopen #1#2{\chapoddpage {\chapfonts
+\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
+\par\penalty 5000 %
+}
+
+\def\centerchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt
+ \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
+}
+
+\def\CHAPFopen{
+\global\let\chapmacro=\chfopen
+\global\let\unnumbchapmacro=\unnchfopen
+\global\let\centerchapmacro=\centerchfopen}
+
+
+% Section titles.
+\newskip\secheadingskip
+\def\secheadingbreak{\dobreak \secheadingskip {-1000}}
+\def\secheading#1#2#3{\sectionheading{sec}{#2.#3}{#1}}
+\def\plainsecheading#1{\sectionheading{sec}{}{#1}}
+
+% Subsection titles.
+\newskip \subsecheadingskip
+\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}}
+\def\subsecheading#1#2#3#4{\sectionheading{subsec}{#2.#3.#4}{#1}}
+\def\plainsubsecheading#1{\sectionheading{subsec}{}{#1}}
+
+% Subsubsection titles.
+\let\subsubsecheadingskip = \subsecheadingskip
+\let\subsubsecheadingbreak = \subsecheadingbreak
+\def\subsubsecheading#1#2#3#4#5{\sectionheading{subsubsec}{#2.#3.#4.#5}{#1}}
+\def\plainsubsubsecheading#1{\sectionheading{subsubsec}{}{#1}}
+
+
+% Print any size section title.
+%
+% #1 is the section type (sec/subsec/subsubsec), #2 is the section
+% number (maybe empty), #3 the text.
+\def\sectionheading#1#2#3{%
+ {%
+ \expandafter\advance\csname #1headingskip\endcsname by \parskip
+ \csname #1headingbreak\endcsname
+ }%
+ {%
+ % Switch to the right set of fonts.
+ \csname #1fonts\endcsname \rm
+ %
+ % Only insert the separating space if we have a section number.
+ \def\secnum{#2}%
+ \setbox0 = \hbox{#2\ifx\secnum\empty\else\enspace\fi}%
+ %
+ \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+ \hangindent = \wd0 % zero if no section number
+ \unhbox0 #3}%
+ }%
+ % Add extra space after the heading -- either a line space or a
+ % paragraph space, whichever is more. (Some people like to set
+ % \parskip to large values for some reason.) Don't allow stretch, though.
+ \nobreak
+ \ifdim\parskip>\normalbaselineskip
+ \kern\parskip
+ \else
+ \kern\normalbaselineskip
+ \fi
+ \nobreak
+}
+
+
+\message{toc,}
+% Table of contents.
+\newwrite\tocfile
+
+% Write an entry to the toc file, opening it if necessary.
+% Called from @chapter, etc. We supply {\folio} at the end of the
+% argument, which will end up as the last argument to the \...entry macro.
+%
+% Usage: \writetocentry{chap}{The Name of The Game}{{\the\chapno}}
+% We open the .toc file for writing here instead of at @setfilename (or
+% any other fixed time) so that @contents can be anywhere in the document.
+%
+\newif\iftocfileopened
+\def\writetocentry#1#2#3{%
+ \iftocfileopened\else
+ \immediate\openout\tocfile = \jobname.toc
+ \global\tocfileopenedtrue
+ \fi
+ %
+ \iflinks
+ \toks0 = {#2}%
+ \edef\temp{\write\tocfile{\realbackslash #1entry{\the\toks0}#3{\folio}}}%
+ \temp
+ \fi
+ %
+ % Tell \shipout to create a page destination if we're doing pdf, which
+ % will be the target of the links in the table of contents. We can't
+ % just do it on every page because the title pages are numbered 1 and
+ % 2 (the page numbers aren't printed), and so are the first two pages
+ % of the document. Thus, we'd have two destinations named `1', and
+ % two named `2'.
+ \ifpdf \pdfmakepagedesttrue \fi
+}
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\newcount\savepageno
+\newcount\lastnegativepageno \lastnegativepageno = -1
+
+% Finish up the main text and prepare to read what we've written
+% to \tocfile.
+%
+\def\startcontents#1{%
+ % If @setchapternewpage on, and @headings double, the contents should
+ % start on an odd page, unlike chapters. Thus, we maintain
+ % \contentsalignmacro in parallel with \pagealignmacro.
+ % From: Torbjorn Granlund <tege@matematik.su.se>
+ \contentsalignmacro
+ \immediate\closeout\tocfile
+ %
+ % Don't need to put `Contents' or `Short Contents' in the headline.
+ % It is abundantly clear what they are.
+ \unnumbchapmacro{#1}\def\thischapter{}%
+ \savepageno = \pageno
+ \begingroup % Set up to handle contents files properly.
+ \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11
+ % We can't do this, because then an actual ^ in a section
+ % title fails, e.g., @chapter ^ -- exponentiation. --karl, 9jul97.
+ %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
+ \raggedbottom % Worry more about breakpoints than the bottom.
+ \advance\hsize by -\contentsrightmargin % Don't use the full line length.
+ %
+ % Roman numerals for page numbers.
+ \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
+}
+
+
+% Normal (long) toc.
+\def\contents{%
+ \startcontents{\putwordTOC}%
+ \openin 1 \jobname.toc
+ \ifeof 1 \else
+ \closein 1
+ \input \jobname.toc
+ \fi
+ \vfill \eject
+ \contentsalignmacro % in case @setchapternewpage odd is in effect
+ \pdfmakeoutlines
+ \endgroup
+ \lastnegativepageno = \pageno
+ \global\pageno = \savepageno
+}
+
+% And just the chapters.
+\def\summarycontents{%
+ \startcontents{\putwordShortTOC}%
+ %
+ \let\chapentry = \shortchapentry
+ \let\appendixentry = \shortappendixentry
+ \let\unnumbchapentry = \shortunnumberedentry
+ % We want a true roman here for the page numbers.
+ \secfonts
+ \let\rm=\shortcontrm \let\bf=\shortcontbf
+ \let\sl=\shortcontsl \let\tt=\shortconttt
+ \rm
+ \hyphenpenalty = 10000
+ \advance\baselineskip by 1pt % Open it up a little.
+ \def\secentry ##1##2##3##4{}
+ \def\subsecentry ##1##2##3##4##5{}
+ \def\subsubsecentry ##1##2##3##4##5##6{}
+ \let\unnumbsecentry = \secentry
+ \let\unnumbsubsecentry = \subsecentry
+ \let\unnumbsubsubsecentry = \subsubsecentry
+ \openin 1 \jobname.toc
+ \ifeof 1 \else
+ \closein 1
+ \input \jobname.toc
+ \fi
+ \vfill \eject
+ \contentsalignmacro % in case @setchapternewpage odd is in effect
+ \endgroup
+ \lastnegativepageno = \pageno
+ \global\pageno = \savepageno
+}
+\let\shortcontents = \summarycontents
+
+\ifpdf
+ \pdfcatalog{/PageMode /UseOutlines}%
+\fi
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Chapters, in the main contents.
+\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}}
+%
+% Chapters, in the short toc.
+% See comments in \dochapentry re vbox and related settings.
+\def\shortchapentry#1#2#3{%
+ \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#3\egroup}%
+}
+
+% Appendices, in the main contents.
+\def\appendixentry#1#2#3{%
+ \dochapentry{\appendixbox{\putwordAppendix{} #2}\labelspace#1}{#3}}
+%
+% Appendices, in the short toc.
+\let\shortappendixentry = \shortchapentry
+
+% Typeset the label for a chapter or appendix for the short contents.
+% The arg is, e.g., `Appendix A' for an appendix, or `3' for a chapter.
+% We could simplify the code here by writing out an \appendixentry
+% command in the toc file for appendices, instead of using \chapentry
+% for both, but it doesn't seem worth it.
+%
+\newdimen\shortappendixwidth
+%
+\def\shortchaplabel#1{%
+ % This space should be enough, since a single number is .5em, and the
+ % widest letter (M) is 1em, at least in the Computer Modern fonts.
+ % But use \hss just in case.
+ % (This space doesn't include the extra space that gets added after
+ % the label; that gets put in by \shortchapentry above.)
+ \dimen0 = 1em
+ \hbox to \dimen0{#1\hss}%
+}
+
+% Unnumbered chapters.
+\def\unnumbchapentry#1#2#3{\dochapentry{#1}{#3}}
+\def\shortunnumberedentry#1#2#3{\tocentry{#1}{\doshortpageno\bgroup#3\egroup}}
+
+% Sections.
+\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}}
+\def\unnumbsecentry#1#2#3#4{\dosecentry{#1}{#4}}
+
+% Subsections.
+\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}}
+\def\unnumbsubsecentry#1#2#3#4#5{\dosubsecentry{#1}{#5}}
+
+% And subsubsections.
+\def\subsubsecentry#1#2#3#4#5#6{%
+ \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}}
+\def\unnumbsubsubsecentry#1#2#3#4#5#6{\dosubsubsecentry{#1}{#6}}
+
+% This parameter controls the indentation of the various levels.
+\newdimen\tocindent \tocindent = 3pc
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we want it to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+ \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
+ \begingroup
+ \chapentryfonts
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+ \endgroup
+ \nobreak\vskip .25\baselineskip plus.1\baselineskip
+}
+
+\def\dosecentry#1#2{\begingroup
+ \secentryfonts \leftskip=\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsecentry#1#2{\begingroup
+ \subsecentryfonts \leftskip=2\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsubsecentry#1#2{\begingroup
+ \subsubsecentryfonts \leftskip=3\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+% Final typesetting of a toc entry; we use the same \entry macro as for
+% the index entries, but we want to suppress hyphenation here. (We
+% can't do that in the \entry macro, since index entries might consist
+% of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.)
+\def\tocentry#1#2{\begingroup
+ \vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks
+ % Do not use \turnoffactive in these arguments. Since the toc is
+ % typeset in cmr, characters such as _ would come out wrong; we
+ % have to do the usual translation tricks.
+ \entry{#1}{#2}%
+\endgroup}
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\let\subsecentryfonts = \textfonts
+\let\subsubsecentryfonts = \textfonts
+
+
+\message{environments,}
+% @foo ... @end foo.
+
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+%
+% Since these characters are used in examples, it should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+%
+\def\point{$\star$}
+\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% The @error{} command.
+% Adapted from the TeXbook's \boxit.
+%
+\newbox\errorbox
+%
+{\tentt \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
+%
+\global\setbox\errorbox=\hbox to \dimen0{\hfil
+ \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+ \advance\hsize by -2\dimen2 % Rules.
+ \vbox{
+ \hrule height\dimen2
+ \hbox{\vrule width\dimen2 \kern3pt % Space to left of text.
+ \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+ \kern3pt\vrule width\dimen2}% Space to right.
+ \hrule height\dimen2}
+ \hfil}
+%
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @tex ... @end tex escapes into raw Tex temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain tex @ character.
+
+\def\tex{\begingroup
+ \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+ \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+ \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
+ \catcode `\%=14
+ \catcode `\+=\other
+ \catcode `\"=\other
+ \catcode `\==\other
+ \catcode `\|=\other
+ \catcode `\<=\other
+ \catcode `\>=\other
+ \escapechar=`\\
+ %
+ \let\b=\ptexb
+ \let\bullet=\ptexbullet
+ \let\c=\ptexc
+ \let\,=\ptexcomma
+ \let\.=\ptexdot
+ \let\dots=\ptexdots
+ \let\equiv=\ptexequiv
+ \let\!=\ptexexclam
+ \let\i=\ptexi
+ \let\{=\ptexlbrace
+ \let\+=\tabalign
+ \let\}=\ptexrbrace
+ \let\*=\ptexstar
+ \let\t=\ptext
+ %
+ \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+ \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
+ \def\@{@}%
+\let\Etex=\endgroup}
+
+% Define @lisp ... @end lisp.
+% @lisp does a \begingroup so it can rebind things,
+% including the definition of @end lisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^^M gets inside @lisp, @example, and other
+% such environments. \null is better than a space, since it doesn't
+% have any width.
+\def\lisppar{\null\endgraf}
+
+% Make each space character in the input produce a normal interword
+% space in the output. Don't allow a line break at this space, as this
+% is used only in environments like @example, where each line of input
+% should produce a line of output anyway.
+%
+{\obeyspaces %
+\gdef\sepspaces{\obeyspaces\let =\tie}}
+
+% Define \obeyedspace to be our active space, whatever it is. This is
+% for use in \parsearg.
+{\sepspaces%
+\global\let\obeyedspace= }
+
+% This space is always present above and below environments.
+\newskip\envskipamount \envskipamount = 0pt
+
+% Make spacing and below environment symmetrical. We use \parskip here
+% to help in doing that, since in @example-like environments \parskip
+% is reset to zero; thus the \afterenvbreak inserts no space -- but the
+% start of the next paragraph will insert \parskip.
+%
+\def\aboveenvbreak{{%
+ % =10000 instead of <10000 because of a special case in \itemzzz, q.v.
+ \ifnum \lastpenalty=10000 \else
+ \advance\envskipamount by \parskip
+ \endgraf
+ \ifdim\lastskip<\envskipamount
+ \removelastskip
+ % it's not a good place to break if the last penalty was \nobreak
+ % or better ...
+ \ifnum\lastpenalty>10000 \else \penalty-50 \fi
+ \vskip\envskipamount
+ \fi
+ \fi
+}}
+
+\let\afterenvbreak = \aboveenvbreak
+
+% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins.
+\let\nonarrowing=\relax
+
+% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
+% environment contents.
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+ \ctl\leaders\hrule height\circthick\hfil\ctr
+ \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+ \cbl\leaders\hrule height\circthick\hfil\cbr
+ \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\def\cartouche{%
+\par % can't be in the midst of a paragraph.
+\begingroup
+ \lskip=\leftskip \rskip=\rightskip
+ \leftskip=0pt\rightskip=0pt %we want these *outside*.
+ \cartinner=\hsize \advance\cartinner by-\lskip
+ \advance\cartinner by-\rskip
+ \cartouter=\hsize
+ \advance\cartouter by 18.4pt % allow for 3pt kerns on either
+% side, and for 6pt waste from
+% each corner char, and rule thickness
+ \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+ % Flag to tell @lisp, etc., not to narrow margin.
+ \let\nonarrowing=\comment
+ \vbox\bgroup
+ \baselineskip=0pt\parskip=0pt\lineskip=0pt
+ \carttop
+ \hbox\bgroup
+ \hskip\lskip
+ \vrule\kern3pt
+ \vbox\bgroup
+ \hsize=\cartinner
+ \kern3pt
+ \begingroup
+ \baselineskip=\normbskip
+ \lineskip=\normlskip
+ \parskip=\normpskip
+ \vskip -\parskip
+\def\Ecartouche{%
+ \endgroup
+ \kern3pt
+ \egroup
+ \kern3pt\vrule
+ \hskip\rskip
+ \egroup
+ \cartbot
+ \egroup
+\endgroup
+}}
+
+
+% This macro is called at the beginning of all the @example variants,
+% inside a group.
+\def\nonfillstart{%
+ \aboveenvbreak
+ \inENV % This group ends at the end of the body
+ \hfuzz = 12pt % Don't be fussy
+ \sepspaces % Make spaces be word-separators rather than space tokens.
+ \let\par = \lisppar % don't ignore blank lines
+ \obeylines % each line of input is a line of output
+ \parskip = 0pt
+ \parindent = 0pt
+ \emergencystretch = 0pt % don't try to avoid overfull boxes
+ % @cartouche defines \nonarrowing to inhibit narrowing
+ % at next level down.
+ \ifx\nonarrowing\relax
+ \advance \leftskip by \lispnarrowing
+ \exdentamount=\lispnarrowing
+ \let\exdent=\nofillexdent
+ \let\nonarrowing=\relax
+ \fi
+}
+
+% Define the \E... control sequence only if we are inside the particular
+% environment, so the error checking in \end will work.
+%
+% To end an @example-like environment, we first end the paragraph (via
+% \afterenvbreak's vertical glue), and then the group. That way we keep
+% the zero \parskip that the environments set -- \parskip glue will be
+% inserted at the beginning of the next paragraph in the document, after
+% the environment.
+%
+\def\nonfillfinish{\afterenvbreak\endgroup}
+
+% @lisp: indented, narrowed, typewriter font.
+\def\lisp{\begingroup
+ \nonfillstart
+ \let\Elisp = \nonfillfinish
+ \tt
+ \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
+ \gobble % eat return
+}
+
+% @example: Same as @lisp.
+\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp}
+
+% @smallexample and @smalllisp: use smaller fonts.
+% Originally contributed by Pavel@xerox.
+\def\smalllisp{\begingroup
+ \def\Esmalllisp{\nonfillfinish\endgroup}%
+ \def\Esmallexample{\nonfillfinish\endgroup}%
+ \smallexamplefonts
+ \lisp
+}
+\let\smallexample = \smalllisp
+
+
+% @display: same as @lisp except keep current font.
+%
+\def\display{\begingroup
+ \nonfillstart
+ \let\Edisplay = \nonfillfinish
+ \gobble
+}
+%
+% @smalldisplay: @display plus smaller fonts.
+%
+\def\smalldisplay{\begingroup
+ \def\Esmalldisplay{\nonfillfinish\endgroup}%
+ \smallexamplefonts \rm
+ \display
+}
+
+% @format: same as @display except don't narrow margins.
+%
+\def\format{\begingroup
+ \let\nonarrowing = t
+ \nonfillstart
+ \let\Eformat = \nonfillfinish
+ \gobble
+}
+%
+% @smallformat: @format plus smaller fonts.
+%
+\def\smallformat{\begingroup
+ \def\Esmallformat{\nonfillfinish\endgroup}%
+ \smallexamplefonts \rm
+ \format
+}
+
+% @flushleft (same as @format).
+%
+\def\flushleft{\begingroup \def\Eflushleft{\nonfillfinish\endgroup}\format}
+
+% @flushright.
+%
+\def\flushright{\begingroup
+ \let\nonarrowing = t
+ \nonfillstart
+ \let\Eflushright = \nonfillfinish
+ \advance\leftskip by 0pt plus 1fill
+ \gobble
+}
+
+
+% @quotation does normal linebreaking (hence we can't use \nonfillstart)
+% and narrows the margins.
+%
+\def\quotation{%
+ \begingroup\inENV %This group ends at the end of the @quotation body
+ {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
+ \parindent=0pt
+ % We have retained a nonzero parskip for the environment, since we're
+ % doing normal filling. So to avoid extra space below the environment...
+ \def\Equotation{\parskip = 0pt \nonfillfinish}%
+ %
+ % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
+ \ifx\nonarrowing\relax
+ \advance\leftskip by \lispnarrowing
+ \advance\rightskip by \lispnarrowing
+ \exdentamount = \lispnarrowing
+ \let\nonarrowing = \relax
+ \fi
+}
+
+
+% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
+% If we want to allow any <char> as delimiter,
+% we need the curly braces so that makeinfo sees the @verb command, eg:
+% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org
+%
+% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook.
+%
+% [Knuth] p.344; only we need to do the other characters Texinfo sets
+% active too. Otherwise, they get lost as the first character on a
+% verbatim line.
+\def\dospecials{%
+ \do\ \do\\\do\{\do\}\do\$\do\&%
+ \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
+ \do\<\do\>\do\|\do\@\do+\do\"%
+}
+%
+% [Knuth] p. 380
+\def\uncatcodespecials{%
+ \def\do##1{\catcode`##1=12}\dospecials}
+%
+% [Knuth] pp. 380,381,391
+% Disable Spanish ligatures ?` and !` of \tt font
+\begingroup
+ \catcode`\`=\active\gdef`{\relax\lq}
+\endgroup
+%
+% Setup for the @verb command.
+%
+% Eight spaces for a tab
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
+\endgroup
+%
+\def\setupverb{%
+ \tt % easiest (and conventionally used) font for verbatim
+ \def\par{\leavevmode\endgraf}%
+ \catcode`\`=\active
+ \tabeightspaces
+ % Respect line breaks,
+ % print special symbols as themselves, and
+ % make each space count
+ % must do in this order:
+ \obeylines \uncatcodespecials \sepspaces
+}
+
+% Setup for the @verbatim environment
+%
+% Real tab expansion
+\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
+%
+\def\starttabbox{\setbox0=\hbox\bgroup}
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabexpand{%
+ \catcode`\^^I=\active
+ \def^^I{\leavevmode\egroup
+ \dimen0=\wd0 % the width so far, or since the previous tab
+ \divide\dimen0 by\tabw
+ \multiply\dimen0 by\tabw % compute previous multiple of \tabw
+ \advance\dimen0 by\tabw % advance to next multiple of \tabw
+ \wd0=\dimen0 \box0 \starttabbox
+ }%
+ }
+\endgroup
+\def\setupverbatim{%
+ % Easiest (and conventionally used) font for verbatim
+ \tt
+ \def\par{\leavevmode\egroup\box0\endgraf}%
+ \catcode`\`=\active
+ \tabexpand
+ % Respect line breaks,
+ % print special symbols as themselves, and
+ % make each space count
+ % must do in this order:
+ \obeylines \uncatcodespecials \sepspaces
+ \everypar{\starttabbox}%
+}
+
+% Do the @verb magic: verbatim text is quoted by unique
+% delimiter characters. Before first delimiter expect a
+% right brace, after last delimiter expect closing brace:
+%
+% \def\doverb'{'<char>#1<char>'}'{#1}
+%
+% [Knuth] p. 382; only eat outer {}
+\begingroup
+ \catcode`[=1\catcode`]=2\catcode`\{=12\catcode`\}=12
+ \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
+\endgroup
+%
+\def\verb{\begingroup\setupverb\doverb}
+%
+%
+% Do the @verbatim magic: define the macro \doverbatim so that
+% the (first) argument ends when '@end verbatim' is reached, ie:
+%
+% \def\doverbatim#1@end verbatim{#1}
+%
+% For Texinfo it's a lot easier than for LaTeX,
+% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
+% we need not redefine '\', '{' and '}'.
+%
+% Inspired by LaTeX's verbatim command set [latex.ltx]
+%% Include LaTeX hack for completeness -- never know
+%% \begingroup
+%% \catcode`|=0 \catcode`[=1
+%% \catcode`]=2\catcode`\{=12\catcode`\}=12\catcode`\ =\active
+%% \catcode`\\=12|gdef|doverbatim#1@end verbatim[
+%% #1|endgroup|def|Everbatim[]|end[verbatim]]
+%% |endgroup
+%
+\begingroup
+ \catcode`\ =\active
+ \obeylines %
+ % ignore everything up to the first ^^M, that's the newline at the end
+ % of the @verbatim input line itself. Otherwise we get an extra blank
+ % line in the output.
+ \gdef\doverbatim#1^^M#2@end verbatim{#2\end{verbatim}}%
+\endgroup
+%
+\def\verbatim{%
+ \def\Everbatim{\nonfillfinish\endgroup}%
+ \begingroup
+ \nonfillstart
+ \advance\leftskip by -\defbodyindent
+ \begingroup\setupverbatim\doverbatim
+}
+
+% @verbatiminclude FILE - insert text of file in verbatim environment.
+%
+% Allow normal characters that we make active in the argument (a file name).
+\def\verbatiminclude{%
+ \begingroup
+ \catcode`\\=\other
+ \catcode`~=\other
+ \catcode`^=\other
+ \catcode`_=\other
+ \catcode`|=\other
+ \catcode`<=\other
+ \catcode`>=\other
+ \catcode`+=\other
+ \parsearg\doverbatiminclude
+}
+\def\setupverbatiminclude{%
+ \begingroup
+ \nonfillstart
+ \advance\leftskip by -\defbodyindent
+ \begingroup\setupverbatim
+}
+%
+\def\doverbatiminclude#1{%
+ % Restore active chars for included file.
+ \endgroup
+ \begingroup
+ \let\value=\expandablevalue
+ \def\thisfile{#1}%
+ \expandafter\expandafter\setupverbatiminclude\input\thisfile
+ \endgroup
+ \nonfillfinish
+ \endgroup
+}
+
+% @copying ... @end copying.
+% Save the text away for @insertcopying later. Many commands won't be
+% allowed in this context, but that's ok.
+%
+% We save the uninterpreted tokens, rather than creating a box.
+% Saving the text in a box would be much easier, but then all the
+% typesetting commands (@smallbook, font changes, etc.) have to be done
+% beforehand -- and a) we want @copying to be done first in the source
+% file; b) letting users define the frontmatter in as flexible order as
+% possible is very desirable.
+%
+\def\copying{\begingroup
+ % Define a command to swallow text until we reach `@end copying'.
+ % \ is the escape char in this texinfo.tex file, so it is the
+ % delimiter for the command; @ will be the escape char when we read
+ % it, but that doesn't matter.
+ \long\def\docopying##1\end copying{\gdef\copyingtext{##1}\enddocopying}%
+ %
+ % We must preserve ^^M's in the input file; see \insertcopying below.
+ \catcode`\^^M = \active
+ \docopying
+}
+
+% What we do to finish off the copying text.
+%
+\def\enddocopying{\endgroup\ignorespaces}
+
+% @insertcopying. Here we must play games with ^^M's. On the one hand,
+% we need them to delimit commands such as `@end quotation', so they
+% must be active. On the other hand, we certainly don't want every
+% end-of-line to be a \par, as would happen with the normal active
+% definition of ^^M. On the third hand, two ^^M's in a row should still
+% generate a \par.
+%
+% Our approach is to make ^^M insert a space and a penalty1 normally;
+% then it can also check if \lastpenalty=1. If it does, then manually
+% do \par.
+%
+% This messes up the normal definitions of @c[omment], so we redefine
+% it. Similarly for @ignore. (These commands are used in the gcc
+% manual for man page generation.)
+%
+% Seems pretty fragile, most line-oriented commands will presumably
+% fail, but for the limited use of getting the copying text (which
+% should be quite simple) inserted, we can hope it's ok.
+%
+{\catcode`\^^M=\active %
+\gdef\insertcopying{\begingroup %
+ \parindent = 0pt % looks wrong on title page
+ \def^^M{%
+ \ifnum \lastpenalty=1 %
+ \par %
+ \else %
+ \space \penalty 1 %
+ \fi %
+ }%
+ %
+ % Fix @c[omment] for catcode 13 ^^M's.
+ \def\c##1^^M{\ignorespaces}%
+ \let\comment = \c %
+ %
+ % Don't bother jumping through all the hoops that \doignore does, it
+ % would be very hard since the catcodes are already set.
+ \long\def\ignore##1\end ignore{\ignorespaces}%
+ %
+ \copyingtext %
+\endgroup}%
+}
+
+\message{defuns,}
+% @defun etc.
+
+% Allow user to change definition object font (\df) internally
+\def\setdeffont#1 {\csname DEF#1\endcsname}
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+
+\newcount\parencount
+
+% We want ()&[] to print specially on the defun line.
+%
+\def\activeparens{%
+ \catcode`\(=\active \catcode`\)=\active
+ \catcode`\&=\active
+ \catcode`\[=\active \catcode`\]=\active
+}
+
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
+
+{\activeparens % Now, smart parens don't turn on until &foo (see \amprm)
+
+% Be sure that we always have a definition for `(', etc. For example,
+% if the fn name has parens in it, \boldbrax will not be in effect yet,
+% so TeX would otherwise complain about undefined control sequence.
+\global\let(=\lparen \global\let)=\rparen
+\global\let[=\lbrack \global\let]=\rbrack
+
+\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 }
+\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+% This is used to turn on special parens
+% but make & act ordinary (given that it's active).
+\gdef\boldbraxnoamp{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb\let&=\ampnr}
+
+% Definitions of (, ) and & used in args for functions.
+% This is the definition of ( outside of all parentheses.
+\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested
+ \global\advance\parencount by 1
+}
+%
+% This is the definition of ( when already inside a level of parens.
+\gdef\opnested{\char`\(\global\advance\parencount by 1 }
+%
+\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0.
+ % also in that case restore the outer-level definition of (.
+ \ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi
+ \global\advance \parencount by -1 }
+% If we encounter &foo, then turn on ()-hacking afterwards
+\gdef\amprm#1 {{\rm\}\let(=\oprm \let)=\clrm\ }
+%
+\gdef\normalparens{\boldbrax\let&=\ampnr}
+} % End of definition inside \activeparens
+%% These parens (in \boldbrax) actually are a little bolder than the
+%% contained text. This is especially needed for [ and ]
+\def\opnr{{\sf\char`\(}\global\advance\parencount by 1 }
+\def\clnr{{\sf\char`\)}\global\advance\parencount by -1 }
+\let\ampnr = \&
+\def\lbrb{{\bf\char`\[}}
+\def\rbrb{{\bf\char`\]}}
+
+% Active &'s sneak into the index arguments, so make sure it's defined.
+{
+ \catcode`& = \active
+ \global\let& = \ampnr
+}
+
+% \defname, which formats the name of the @def (not the args).
+% #1 is the function name.
+% #2 is the type of definition, such as "Function".
+%
+\def\defname#1#2{%
+ % How we'll output the type name. Putting it in brackets helps
+ % distinguish it from the body text that may end up on the next line
+ % just below it.
+ \ifempty{#2}%
+ \def\defnametype{}%
+ \else
+ \def\defnametype{[\rm #2]}%
+ \fi
+ %
+ % Get the values of \leftskip and \rightskip as they were outside the @def...
+ \dimen2=\leftskip
+ \advance\dimen2 by -\defbodyindent
+ %
+ % Figure out values for the paragraph shape.
+ \setbox0=\hbox{\hskip \deflastargmargin{\defnametype}}%
+ \dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line
+ \dimen1=\hsize \advance \dimen1 by -\defargsindent % size for continuations
+ \parshape 2 0in \dimen0 \defargsindent \dimen1
+ %
+ % Output arg 2 ("Function" or some such) but stuck inside a box of
+ % width 0 so it does not interfere with linebreaking.
+ \noindent
+ %
+ {% Adjust \hsize to exclude the ambient margins,
+ % so that \rightline will obey them.
+ \advance \hsize by -\dimen2
+ \dimen3 = 0pt % was -1.25pc
+ \rlap{\rightline{\defnametype\kern\dimen3}}%
+ }%
+ %
+ % Allow all lines to be underfull without complaint:
+ \tolerance=10000 \hbadness=10000
+ \advance\leftskip by -\defbodyindent
+ \exdentamount=\defbodyindent
+ {\df #1}\enskip % output function name
+ % \defunargs will be called next to output the arguments, if any.
+}
+
+% Common pieces to start any @def...
+% #1 is the \E... control sequence to end the definition (which we define).
+% #2 is the \...x control sequence (which our caller defines).
+% #3 is the control sequence to process the header, such as \defunheader.
+%
+\def\parsebodycommon#1#2#3{%
+ \begingroup\inENV
+ % If there are two @def commands in a row, we'll have a \nobreak,
+ % which is there to keep the function description together with its
+ % header. But if there's nothing but headers, we want to allow a
+ % break after all. Check for penalty 10002 (inserted by
+ % \defargscommonending) instead of 10000, since the sectioning
+ % commands insert a \penalty10000, and we don't want to allow a break
+ % between a section heading and a defun.
+ \ifnum\lastpenalty=10002 \penalty0 \fi
+ \medbreak
+ %
+ % Define the \E... end token that this defining construct specifies
+ % so that it will exit this group.
+ \def#1{\endgraf\endgroup\medbreak}%
+ %
+ \parindent=0in
+ \advance\leftskip by \defbodyindent
+ \exdentamount=\defbodyindent
+}
+
+% Common part of the \...x definitions.
+%
+\def\defxbodycommon{%
+ % As with \parsebodycommon above, allow line break if we have multiple
+ % x headers in a row. It's not a great place, though.
+ \ifnum\lastpenalty=10000 \penalty1000 \fi
+ %
+ \begingroup\obeylines
+}
+
+% Process body of @defun, @deffn, @defmac, etc.
+%
+\def\defparsebody#1#2#3{%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2{\defxbodycommon \activeparens \spacesplit#3}%
+ \catcode\equalChar=\active
+ \begingroup\obeylines\activeparens
+ \spacesplit#3%
+}
+
+% #1, #2, #3 are the common arguments (see \parsebodycommon above).
+% #4, delimited by the space, is the class name.
+%
+\def\defmethparsebody#1#2#3#4 {%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2##1 {\defxbodycommon \activeparens \spacesplit{#3{##1}}}%
+ \begingroup\obeylines\activeparens
+ % The \empty here prevents misinterpretation of a construct such as
+ % @deffn {whatever} {Enharmonic comma}
+ % See comments at \deftpparsebody, although in our case we don't have
+ % to remove the \empty afterwards, since it is empty.
+ \spacesplit{#3{#4}}\empty
+}
+
+% Used for @deftypemethod and @deftypeivar.
+% #1, #2, #3 are the common arguments (see \defparsebody).
+% #4, delimited by a space, is the class name.
+% #5 is the method's return type.
+%
+\def\deftypemethparsebody#1#2#3#4 #5 {%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2##1 ##2 {\defxbodycommon \activeparens \spacesplit{#3{##1}{##2}}}%
+ \begingroup\obeylines\activeparens
+ \spacesplit{#3{#4}{#5}}%
+}
+
+% Used for @deftypeop. The change from \deftypemethparsebody is an
+% extra argument at the beginning which is the `category', instead of it
+% being the hardwired string `Method' or `Instance Variable'. We have
+% to account for this both in the \...x definition and in parsing the
+% input at hand. Thus also need a control sequence (passed as #5) for
+% the \E... definition to assign the category name to.
+%
+\def\deftypeopparsebody#1#2#3#4#5 #6 {%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2##1 ##2 ##3 {\def#4{##1}%
+ \defxbodycommon \activeparens \spacesplit{#3{##2}{##3}}}%
+ \begingroup\obeylines\activeparens
+ \spacesplit{#3{#5}{#6}}%
+}
+
+% For @defop.
+\def\defopparsebody #1#2#3#4#5 {%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2##1 ##2 {\def#4{##1}%
+ \defxbodycommon \activeparens \spacesplit{#3{##2}}}%
+ \begingroup\obeylines\activeparens
+ \spacesplit{#3{#5}}%
+}
+
+% These parsing functions are similar to the preceding ones
+% except that they do not make parens into active characters.
+% These are used for "variables" since they have no arguments.
+%
+\def\defvarparsebody #1#2#3{%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2{\defxbodycommon \spacesplit#3}%
+ \catcode\equalChar=\active
+ \begingroup\obeylines
+ \spacesplit#3%
+}
+
+% @defopvar.
+\def\defopvarparsebody #1#2#3#4#5 {%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2##1 ##2 {\def#4{##1}%
+ \defxbodycommon \spacesplit{#3{##2}}}%
+ \begingroup\obeylines
+ \spacesplit{#3{#5}}%
+}
+
+\def\defvrparsebody#1#2#3#4 {%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2##1 {\defxbodycommon \spacesplit{#3{##1}}}%
+ \begingroup\obeylines
+ \spacesplit{#3{#4}}%
+}
+
+% This loses on `@deftp {Data Type} {struct termios}' -- it thinks the
+% type is just `struct', because we lose the braces in `{struct
+% termios}' when \spacesplit reads its undelimited argument. Sigh.
+% \let\deftpparsebody=\defvrparsebody
+%
+% So, to get around this, we put \empty in with the type name. That
+% way, TeX won't find exactly `{...}' as an undelimited argument, and
+% won't strip off the braces.
+%
+\def\deftpparsebody #1#2#3#4 {%
+ \parsebodycommon{#1}{#2}{#3}%
+ \def#2##1 {\defxbodycommon \spacesplit{#3{##1}}}%
+ \begingroup\obeylines
+ \spacesplit{\parsetpheaderline{#3{#4}}}\empty
+}
+
+% Fine, but then we have to eventually remove the \empty *and* the
+% braces (if any). That's what this does.
+%
+\def\removeemptybraces\empty#1\relax{#1}
+
+% After \spacesplit has done its work, this is called -- #1 is the final
+% thing to call, #2 the type name (which starts with \empty), and #3
+% (which might be empty) the arguments.
+%
+\def\parsetpheaderline#1#2#3{%
+ #1{\removeemptybraces#2\relax}{#3}%
+}%
+
+% Split up #2 (the rest of the input line) at the first space token.
+% call #1 with two arguments:
+% the first is all of #2 before the space token,
+% the second is all of #2 after that space token.
+% If #2 contains no space token, all of it is passed as the first arg
+% and the second is passed as empty.
+%
+{\obeylines %
+ \gdef\spacesplit#1#2^^M{\endgroup\spacesplitx{#1}#2 \relax\spacesplitx}%
+ \long\gdef\spacesplitx#1#2 #3#4\spacesplitx{%
+ \ifx\relax #3%
+ #1{#2}{}%
+ \else %
+ #1{#2}{#3#4}%
+ \fi}%
+}
+
+% Define @defun.
+
+% This is called to end the arguments processing for all the @def... commands.
+%
+\def\defargscommonending{%
+ \interlinepenalty = 10000
+ \advance\rightskip by 0pt plus 1fil
+ \endgraf
+ \nobreak\vskip -\parskip
+ \penalty 10002 % signal to \parsebodycommon.
+}
+
+% This expands the args and terminates the paragraph they comprise.
+%
+\def\defunargs#1{\functionparens \sl
+% Expand, preventing hyphenation at `-' chars.
+% Note that groups don't affect changes in \hyphenchar.
+% Set the font temporarily and use \font in case \setfont made \tensl a macro.
+{\tensl\hyphenchar\font=0}%
+#1%
+{\tensl\hyphenchar\font=45}%
+\ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi%
+ \defargscommonending
+}
+
+\def\deftypefunargs #1{%
+% Expand, preventing hyphenation at `-' chars.
+% Note that groups don't affect changes in \hyphenchar.
+% Use \boldbraxnoamp, not \functionparens, so that & is not special.
+\boldbraxnoamp
+\tclose{#1}% avoid \code because of side effects on active chars
+ \defargscommonending
+}
+
+% Do complete processing of one @defun or @defunx line already parsed.
+
+% @deffn Command forward-char nchars
+
+\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader}
+
+\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}%
+\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @defun == @deffn Function
+
+\def\defun{\defparsebody\Edefun\defunx\defunheader}
+
+\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{\putwordDeffunc}%
+\defunargs {#2}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @deftypefun int foobar (int @var{foo}, float @var{bar})
+
+\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader}
+
+% #1 is the data type. #2 is the name and args.
+\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax}
+% #1 is the data type, #2 the name, #3 the args.
+\def\deftypefunheaderx #1#2 #3\relax{%
+\doind {fn}{\code{#2}}% Make entry in function index
+\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypefun}%
+\deftypefunargs {#3}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar})
+
+\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader}
+
+% \defheaderxcond#1\relax$.$
+% puts #1 in @code, followed by a space, but does nothing if #1 is null.
+\def\defheaderxcond#1#2$.${\ifx#1\relax\else\code{#1#2} \fi}
+
+% #1 is the classification. #2 is the data type. #3 is the name and args.
+\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax}
+% #1 is the classification, #2 the data type, #3 the name, #4 the args.
+\def\deftypefnheaderx #1#2#3 #4\relax{%
+\doind {fn}{\code{#3}}% Make entry in function index
+\begingroup
+\normalparens % notably, turn off `&' magic, which prevents
+% at least some C++ text from working
+\defname {\defheaderxcond#2\relax$.$#3}{#1}%
+\deftypefunargs {#4}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @defmac == @deffn Macro
+
+\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader}
+
+\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{\putwordDefmac}%
+\defunargs {#2}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @defspec == @deffn Special Form
+
+\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader}
+
+\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{\putwordDefspec}%
+\defunargs {#2}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @defop CATEGORY CLASS OPERATION ARG...
+%
+\def\defop #1 {\def\defoptype{#1}%
+\defopparsebody\Edefop\defopx\defopheader\defoptype}
+%
+\def\defopheader#1#2#3{%
+ \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% function index entry
+ \begingroup
+ \defname{#2}{\defoptype\ \putwordon\ #1}%
+ \defunargs{#3}%
+ \endgroup
+}
+
+% @deftypeop CATEGORY CLASS TYPE OPERATION ARG...
+%
+\def\deftypeop #1 {\def\deftypeopcategory{#1}%
+ \deftypeopparsebody\Edeftypeop\deftypeopx\deftypeopheader
+ \deftypeopcategory}
+%
+% #1 is the class name, #2 the data type, #3 the operation name, #4 the args.
+\def\deftypeopheader#1#2#3#4{%
+ \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
+ \begingroup
+ \defname{\defheaderxcond#2\relax$.$#3}
+ {\deftypeopcategory\ \putwordon\ \code{#1}}%
+ \deftypefunargs{#4}%
+ \endgroup
+}
+
+% @deftypemethod CLASS TYPE METHOD ARG...
+%
+\def\deftypemethod{%
+ \deftypemethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader}
+%
+% #1 is the class name, #2 the data type, #3 the method name, #4 the args.
+\def\deftypemethodheader#1#2#3#4{%
+ \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
+ \begingroup
+ \defname{\defheaderxcond#2\relax$.$#3}{\putwordMethodon\ \code{#1}}%
+ \deftypefunargs{#4}%
+ \endgroup
+}
+
+% @deftypeivar CLASS TYPE VARNAME
+%
+\def\deftypeivar{%
+ \deftypemethparsebody\Edeftypeivar\deftypeivarx\deftypeivarheader}
+%
+% #1 is the class name, #2 the data type, #3 the variable name.
+\def\deftypeivarheader#1#2#3{%
+ \dosubind{vr}{\code{#3}}{\putwordof\ \code{#1}}% entry in variable index
+ \begingroup
+ \defname{\defheaderxcond#2\relax$.$#3}
+ {\putwordInstanceVariableof\ \code{#1}}%
+ \defvarargs{#3}%
+ \endgroup
+}
+
+% @defmethod == @defop Method
+%
+\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}
+%
+% #1 is the class name, #2 the method name, #3 the args.
+\def\defmethodheader#1#2#3{%
+ \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% entry in function index
+ \begingroup
+ \defname{#2}{\putwordMethodon\ \code{#1}}%
+ \defunargs{#3}%
+ \endgroup
+}
+
+% @defcv {Class Option} foo-class foo-flag
+
+\def\defcv #1 {\def\defcvtype{#1}%
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}
+
+\def\defcvarheader #1#2#3{%
+ \dosubind{vr}{\code{#2}}{\putwordof\ \code{#1}}% variable index entry
+ \begingroup
+ \defname{#2}{\defcvtype\ \putwordof\ #1}%
+ \defvarargs{#3}%
+ \endgroup
+}
+
+% @defivar CLASS VARNAME == @defcv {Instance Variable} CLASS VARNAME
+%
+\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader}
+%
+\def\defivarheader#1#2#3{%
+ \dosubind{vr}{\code{#2}}{\putwordof\ \code{#1}}% entry in var index
+ \begingroup
+ \defname{#2}{\putwordInstanceVariableof\ #1}%
+ \defvarargs{#3}%
+ \endgroup
+}
+
+% @defvar
+% First, define the processing that is wanted for arguments of @defvar.
+% This is actually simple: just print them in roman.
+% This must expand the args and terminate the paragraph they make up
+\def\defvarargs #1{\normalparens #1%
+ \defargscommonending
+}
+
+% @defvr Counter foo-count
+
+\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader}
+
+\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}%
+\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup}
+
+% @defvar == @defvr Variable
+
+\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader}
+
+\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+\begingroup\defname {#1}{\putwordDefvar}%
+\defvarargs {#2}\endgroup %
+}
+
+% @defopt == @defvr {User Option}
+
+\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader}
+
+\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+\begingroup\defname {#1}{\putwordDefopt}%
+\defvarargs {#2}\endgroup %
+}
+
+% @deftypevar int foobar
+
+\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader}
+
+% #1 is the data type. #2 is the name, perhaps followed by text that
+% is actually part of the data type, which should not be put into the index.
+\def\deftypevarheader #1#2{%
+\dovarind#2 \relax% Make entry in variables index
+\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypevar}%
+ \defargscommonending
+\endgroup}
+\def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}}
+
+% @deftypevr {Global Flag} int enable
+
+\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader}
+
+\def\deftypevrheader #1#2#3{\dovarind#3 \relax%
+\begingroup\defname {\defheaderxcond#2\relax$.$#3}{#1}
+ \defargscommonending
+\endgroup}
+
+% Now define @deftp
+% Args are printed in bold, a slight difference from @defvar.
+
+\def\deftpargs #1{\bf \defvarargs{#1}}
+
+% @deftp Class window height width ...
+
+\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader}
+
+\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}%
+\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup}
+
+% These definitions are used if you use @defunx (etc.)
+% anywhere other than immediately after a @defun or @defunx.
+%
+\def\defcvx#1 {\errmessage{@defcvx in invalid context}}
+\def\deffnx#1 {\errmessage{@deffnx in invalid context}}
+\def\defivarx#1 {\errmessage{@defivarx in invalid context}}
+\def\defmacx#1 {\errmessage{@defmacx in invalid context}}
+\def\defmethodx#1 {\errmessage{@defmethodx in invalid context}}
+\def\defoptx #1 {\errmessage{@defoptx in invalid context}}
+\def\defopx#1 {\errmessage{@defopx in invalid context}}
+\def\defspecx#1 {\errmessage{@defspecx in invalid context}}
+\def\deftpx#1 {\errmessage{@deftpx in invalid context}}
+\def\deftypefnx#1 {\errmessage{@deftypefnx in invalid context}}
+\def\deftypefunx#1 {\errmessage{@deftypefunx in invalid context}}
+\def\deftypeivarx#1 {\errmessage{@deftypeivarx in invalid context}}
+\def\deftypemethodx#1 {\errmessage{@deftypemethodx in invalid context}}
+\def\deftypeopx#1 {\errmessage{@deftypeopx in invalid context}}
+\def\deftypevarx#1 {\errmessage{@deftypevarx in invalid context}}
+\def\deftypevrx#1 {\errmessage{@deftypevrx in invalid context}}
+\def\defunx#1 {\errmessage{@defunx in invalid context}}
+\def\defvarx#1 {\errmessage{@defvarx in invalid context}}
+\def\defvrx#1 {\errmessage{@defvrx in invalid context}}
+
+
+\message{macros,}
+% @macro.
+
+% To do this right we need a feature of e-TeX, \scantokens,
+% which we arrange to emulate with a temporary file in ordinary TeX.
+\ifx\eTeXversion\undefined
+ \newwrite\macscribble
+ \def\scanmacro#1{%
+ \begingroup \newlinechar`\^^M
+ % Undo catcode changes of \startcontents and \doprintindex
+ \catcode`\@=0 \catcode`\\=\other \escapechar=`\@
+ % Append \endinput to make sure that TeX does not see the ending newline.
+ \toks0={#1\endinput}%
+ \immediate\openout\macscribble=\jobname.tmp
+ \immediate\write\macscribble{\the\toks0}%
+ \immediate\closeout\macscribble
+ \let\xeatspaces\eatspaces
+ \input \jobname.tmp
+ \endgroup
+}
+\else
+\def\scanmacro#1{%
+\begingroup \newlinechar`\^^M
+% Undo catcode changes of \startcontents and \doprintindex
+\catcode`\@=0 \catcode`\\=\other \escapechar=`\@
+\let\xeatspaces\eatspaces\scantokens{#1\endinput}\endgroup}
+\fi
+
+\newcount\paramno % Count of parameters
+\newtoks\macname % Macro name
+\newif\ifrecursive % Is it recursive?
+\def\macrolist{} % List of all defined macros in the form
+ % \do\macro1\do\macro2...
+
+% Utility routines.
+% Thisdoes \let #1 = #2, except with \csnames.
+\def\cslet#1#2{%
+\expandafter\expandafter
+\expandafter\let
+\expandafter\expandafter
+\csname#1\endcsname
+\csname#2\endcsname}
+
+% Trim leading and trailing spaces off a string.
+% Concepts from aro-bend problem 15 (see CTAN).
+{\catcode`\@=11
+\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
+\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
+\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
+\def\unbrace#1{#1}
+\unbrace{\gdef\trim@@@ #1 } #2@{#1}
+}
+
+% Trim a single trailing ^^M off a string.
+{\catcode`\^^M=\other \catcode`\Q=3%
+\gdef\eatcr #1{\eatcra #1Q^^MQ}%
+\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
+\gdef\eatcrb#1Q#2Q{#1}%
+}
+
+% Macro bodies are absorbed as an argument in a context where
+% all characters are catcode 10, 11 or 12, except \ which is active
+% (as in normal texinfo). It is necessary to change the definition of \.
+
+% It's necessary to have hard CRs when the macro is executed. This is
+% done by making ^^M (\endlinechar) catcode 12 when reading the macro
+% body, and then making it the \newlinechar in \scanmacro.
+
+\def\macrobodyctxt{%
+ \catcode`\~=\other
+ \catcode`\^=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\+=\other
+ \catcode`\{=\other
+ \catcode`\}=\other
+ \catcode`\@=\other
+ \catcode`\^^M=\other
+ \usembodybackslash}
+
+\def\macroargctxt{%
+ \catcode`\~=\other
+ \catcode`\^=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\+=\other
+ \catcode`\@=\other
+ \catcode`\\=\other}
+
+% \mbodybackslash is the definition of \ in @macro bodies.
+% It maps \foo\ => \csname macarg.foo\endcsname => #N
+% where N is the macro parameter number.
+% We define \csname macarg.\endcsname to be \realbackslash, so
+% \\ in macro replacement text gets you a backslash.
+
+{\catcode`@=0 @catcode`@\=@active
+ @gdef@usembodybackslash{@let\=@mbodybackslash}
+ @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
+}
+\expandafter\def\csname macarg.\endcsname{\realbackslash}
+
+\def\macro{\recursivefalse\parsearg\macroxxx}
+\def\rmacro{\recursivetrue\parsearg\macroxxx}
+
+\def\macroxxx#1{%
+ \getargs{#1}% now \macname is the macname and \argl the arglist
+ \ifx\argl\empty % no arguments
+ \paramno=0%
+ \else
+ \expandafter\parsemargdef \argl;%
+ \fi
+ \if1\csname ismacro.\the\macname\endcsname
+ \message{Warning: redefining \the\macname}%
+ \else
+ \expandafter\ifx\csname \the\macname\endcsname \relax
+ \else \errmessage{Macro name \the\macname\space already defined}\fi
+ \global\cslet{macsave.\the\macname}{\the\macname}%
+ \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
+ % Add the macroname to \macrolist
+ \toks0 = \expandafter{\macrolist\do}%
+ \xdef\macrolist{\the\toks0
+ \expandafter\noexpand\csname\the\macname\endcsname}%
+ \fi
+ \begingroup \macrobodyctxt
+ \ifrecursive \expandafter\parsermacbody
+ \else \expandafter\parsemacbody
+ \fi}
+
+\def\unmacro{\parsearg\dounmacro}
+\def\dounmacro#1{%
+ \if1\csname ismacro.#1\endcsname
+ \global\cslet{#1}{macsave.#1}%
+ \global\expandafter\let \csname ismacro.#1\endcsname=0%
+ % Remove the macro name from \macrolist:
+ \begingroup
+ \expandafter\let\csname#1\endcsname \relax
+ \let\do\unmacrodo
+ \xdef\macrolist{\macrolist}%
+ \endgroup
+ \else
+ \errmessage{Macro #1 not defined}%
+ \fi
+}
+
+% Called by \do from \dounmacro on each macro. The idea is to omit any
+% macro definitions that have been changed to \relax.
+%
+\def\unmacrodo#1{%
+ \ifx#1\relax
+ % remove this
+ \else
+ \noexpand\do \noexpand #1%
+ \fi
+}
+
+% This makes use of the obscure feature that if the last token of a
+% <parameter list> is #, then the preceding argument is delimited by
+% an opening brace, and that opening brace is not consumed.
+\def\getargs#1{\getargsxxx#1{}}
+\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
+\def\getmacname #1 #2\relax{\macname={#1}}
+\def\getmacargs#1{\def\argl{#1}}
+
+% Parse the optional {params} list. Set up \paramno and \paramlist
+% so \defmacro knows what to do. Define \macarg.blah for each blah
+% in the params list, to be ##N where N is the position in that list.
+% That gets used by \mbodybackslash (above).
+
+% We need to get `macro parameter char #' into several definitions.
+% The technique used is stolen from LaTeX: let \hash be something
+% unexpandable, insert that wherever you need a #, and then redefine
+% it to # just before using the token list produced.
+%
+% The same technique is used to protect \eatspaces till just before
+% the macro is used.
+
+\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
+ \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
+\def\parsemargdefxxx#1,{%
+ \if#1;\let\next=\relax
+ \else \let\next=\parsemargdefxxx
+ \advance\paramno by 1%
+ \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
+ {\xeatspaces{\hash\the\paramno}}%
+ \edef\paramlist{\paramlist\hash\the\paramno,}%
+ \fi\next}
+
+% These two commands read recursive and nonrecursive macro bodies.
+% (They're different since rec and nonrec macros end differently.)
+
+\long\def\parsemacbody#1@end macro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+\long\def\parsermacbody#1@end rmacro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+
+% This defines the macro itself. There are six cases: recursive and
+% nonrecursive macros of zero, one, and many arguments.
+% Much magic with \expandafter here.
+% \xdef is used so that macro definitions will survive the file
+% they're defined in; @include reads the file inside a group.
+\def\defmacro{%
+ \let\hash=##% convert placeholders to macro parameter chars
+ \ifrecursive
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\scanmacro{\temp}}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+ \egroup\noexpand\scanmacro{\temp}}%
+ \else % many
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\csname\the\macname xx\endcsname}%
+ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname xxx\endcsname
+ \paramlist{\egroup\noexpand\scanmacro{\temp}}%
+ \fi
+ \else
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+ \egroup
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \else % many
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \expandafter\noexpand\csname\the\macname xx\endcsname}%
+ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname xxx\endcsname
+ \paramlist{%
+ \egroup
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \fi
+ \fi}
+
+\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
+
+% \braceorline decides whether the next nonwhitespace character is a
+% {. If so it reads up to the closing }, if not, it reads the whole
+% line. Whatever was read is then fed to the next control sequence
+% as an argument (by \parsebrace or \parsearg)
+\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorlinexxx{%
+ \ifx\nchar\bgroup\else
+ \expandafter\parsearg
+ \fi \next}
+
+% We mant to disable all macros during \shipout so that they are not
+% expanded by \write.
+\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}%
+ \edef\next{\macrolist}\expandafter\endgroup\next}
+
+
+% @alias.
+% We need some trickery to remove the optional spaces around the equal
+% sign. Just make them active and then expand them all to nothing.
+\def\alias{\begingroup\obeyspaces\parsearg\aliasxxx}
+\def\aliasxxx #1{\aliasyyy#1\relax}
+\def\aliasyyy #1=#2\relax{\ignoreactivespaces
+\edef\next{\global\let\expandafter\noexpand\csname#1\endcsname=%
+ \expandafter\noexpand\csname#2\endcsname}%
+\expandafter\endgroup\next}
+
+
+\message{cross references,}
+% @xref etc.
+
+\newwrite\auxfile
+
+\newif\ifhavexrefs % True if xref values are known.
+\newif\ifwarnedxrefs % True if we warned once that they aren't known.
+
+% @inforef is relatively simple.
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+ node \samp{\ignorespaces#1{}}}
+
+% @node's job is to define \lastnode.
+\def\node{\ENVcheck\parsearg\nodezzz}
+\def\nodezzz#1{\nodexxx [#1,]}
+\def\nodexxx[#1,#2]{\gdef\lastnode{#1}}
+\let\nwnode=\node
+\let\lastnode=\relax
+
+% The sectioning commands (@chapter, etc.) call these.
+\def\donoderef{%
+ \ifx\lastnode\relax\else
+ \expandafter\expandafter\expandafter\setref{\lastnode}%
+ {Ysectionnumberandtype}%
+ \global\let\lastnode=\relax
+ \fi
+}
+\def\unnumbnoderef{%
+ \ifx\lastnode\relax\else
+ \expandafter\expandafter\expandafter\setref{\lastnode}{Ynothing}%
+ \global\let\lastnode=\relax
+ \fi
+}
+\def\appendixnoderef{%
+ \ifx\lastnode\relax\else
+ \expandafter\expandafter\expandafter\setref{\lastnode}%
+ {Yappendixletterandtype}%
+ \global\let\lastnode=\relax
+ \fi
+}
+
+
+% @anchor{NAME} -- define xref target at arbitrary point.
+%
+\newcount\savesfregister
+\gdef\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
+\gdef\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
+\gdef\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
+
+% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
+% anchor), namely NAME-title (the corresponding @chapter/etc. name),
+% NAME-pg (the page number), and NAME-snt (section number and type).
+% Called from \foonoderef.
+%
+% We have to set \indexdummies so commands such as @code in a section
+% title aren't expanded. It would be nicer not to expand the titles in
+% the first place, but there's so many layers that that is hard to do.
+%
+% Likewise, use \turnoffactive so that punctuation chars such as underscore
+% and backslash work in node names.
+%
+\def\setref#1#2{{%
+ \atdummies
+ \pdfmkdest{#1}%
+ %
+ \turnoffactive
+ \dosetq{#1-title}{Ytitle}%
+ \dosetq{#1-pg}{Ypagenumber}%
+ \dosetq{#1-snt}{#2}%
+}}
+
+% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is
+% the node name, #2 the name of the Info cross-reference, #3 the printed
+% node name, #4 the name of the Info file, #5 the name of the printed
+% manual. All but the node name can be omitted.
+%
+\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
+\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
+\def\ref#1{\xrefX[#1,,,,,,,]}
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
+ \unsepspaces
+ \def\printedmanual{\ignorespaces #5}%
+ \def\printednodename{\ignorespaces #3}%
+ \setbox1=\hbox{\printedmanual}%
+ \setbox0=\hbox{\printednodename}%
+ \ifdim \wd0 = 0pt
+ % No printed node name was explicitly given.
+ \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
+ % Use the node name inside the square brackets.
+ \def\printednodename{\ignorespaces #1}%
+ \else
+ % Use the actual chapter/section title appear inside
+ % the square brackets. Use the real section title if we have it.
+ \ifdim \wd1 > 0pt
+ % It is in another manual, so we don't have it.
+ \def\printednodename{\ignorespaces #1}%
+ \else
+ \ifhavexrefs
+ % We know the real title if we have the xref values.
+ \def\printednodename{\refx{#1-title}{}}%
+ \else
+ % Otherwise just copy the Info node name.
+ \def\printednodename{\ignorespaces #1}%
+ \fi%
+ \fi
+ \fi
+ \fi
+ %
+ % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
+ % insert empty discretionaries after hyphens, which means that it will
+ % not find a line break at a hyphen in a node names. Since some manuals
+ % are best written with fairly long node names, containing hyphens, this
+ % is a loss. Therefore, we give the text of the node name again, so it
+ % is as if TeX is seeing it for the first time.
+ \ifpdf
+ \leavevmode
+ \getfilename{#4}%
+ {\turnoffactive \otherbackslash
+ \ifnum\filenamelength>0
+ \startlink attr{/Border [0 0 0]}%
+ goto file{\the\filename.pdf} name{#1}%
+ \else
+ \startlink attr{/Border [0 0 0]}%
+ goto name{#1}%
+ \fi
+ }%
+ \linkcolor
+ \fi
+ %
+ \ifdim \wd1 > 0pt
+ \putwordsection{} ``\printednodename'' \putwordin{} \cite{\printedmanual}%
+ \else
+ % _ (for example) has to be the character _ for the purposes of the
+ % control sequence corresponding to the node, but it has to expand
+ % into the usual \leavevmode...\vrule stuff for purposes of
+ % printing. So we \turnoffactive for the \refx-snt, back on for the
+ % printing, back off for the \refx-pg.
+ {\turnoffactive \otherbackslash
+ % Only output a following space if the -snt ref is nonempty; for
+ % @unnumbered and @anchor, it won't be.
+ \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
+ \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+ }%
+ % [mynode],
+ [\printednodename],\space
+ % page 3
+ \turnoffactive \otherbackslash \putwordpage\tie\refx{#1-pg}{}%
+ \fi
+ \endlink
+\endgroup}
+
+% \dosetq is called from \setref to do the actual \write (\iflinks).
+%
+\def\dosetq#1#2{%
+ {\let\folio=0%
+ \edef\next{\write\auxfile{\internalsetq{#1}{#2}}}%
+ \iflinks \next \fi
+ }%
+}
+
+% \internalsetq{foo}{page} expands into
+% CHARACTERS @xrdef{foo}{...expansion of \page...}
+\def\internalsetq#1#2{@xrdef{#1}{\csname #2\endcsname}}
+
+% Things to be expanded by \internalsetq.
+%
+\def\Ypagenumber{\folio}
+\def\Ytitle{\thissection}
+\def\Ynothing{}
+\def\Ysectionnumberandtype{%
+ \ifnum\secno=0
+ \putwordChapter@tie \the\chapno
+ \else \ifnum\subsecno=0
+ \putwordSection@tie \the\chapno.\the\secno
+ \else \ifnum\subsubsecno=0
+ \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
+ \else
+ \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
+ \fi\fi\fi
+}
+
+\def\Yappendixletterandtype{%
+ \ifnum\secno=0
+ \putwordAppendix@tie @char\the\appendixno{}%
+ \else \ifnum\subsecno=0
+ \putwordSection@tie @char\the\appendixno.\the\secno
+ \else \ifnum\subsubsecno=0
+ \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
+ \else
+ \putwordSection@tie
+ @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
+ \fi\fi\fi
+}
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+ \let\linenumber = \empty % Pre-3.0.
+\else
+ \def\linenumber{\the\inputlineno:\space}
+\fi
+
+% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
+% If its value is nonempty, SUFFIX is output afterward.
+%
+\def\refx#1#2{%
+ {%
+ \indexnofonts
+ \otherbackslash
+ \expandafter\global\expandafter\let\expandafter\thisrefX
+ \csname X#1\endcsname
+ }%
+ \ifx\thisrefX\relax
+ % If not defined, say something at least.
+ \angleleft un\-de\-fined\angleright
+ \iflinks
+ \ifhavexrefs
+ \message{\linenumber Undefined cross reference `#1'.}%
+ \else
+ \ifwarnedxrefs\else
+ \global\warnedxrefstrue
+ \message{Cross reference values unknown; you must run TeX again.}%
+ \fi
+ \fi
+ \fi
+ \else
+ % It's defined, so just use it.
+ \thisrefX
+ \fi
+ #2% Output the suffix in any case.
+}
+
+% This is the macro invoked by entries in the aux file.
+%
+\def\xrdef#1{\expandafter\gdef\csname X#1\endcsname}
+
+% Read the last existing aux file, if any. No error if none exists.
+\def\readauxfile{\begingroup
+ \catcode`\^^@=\other
+ \catcode`\^^A=\other
+ \catcode`\^^B=\other
+ \catcode`\^^C=\other
+ \catcode`\^^D=\other
+ \catcode`\^^E=\other
+ \catcode`\^^F=\other
+ \catcode`\^^G=\other
+ \catcode`\^^H=\other
+ \catcode`\^^K=\other
+ \catcode`\^^L=\other
+ \catcode`\^^N=\other
+ \catcode`\^^P=\other
+ \catcode`\^^Q=\other
+ \catcode`\^^R=\other
+ \catcode`\^^S=\other
+ \catcode`\^^T=\other
+ \catcode`\^^U=\other
+ \catcode`\^^V=\other
+ \catcode`\^^W=\other
+ \catcode`\^^X=\other
+ \catcode`\^^Z=\other
+ \catcode`\^^[=\other
+ \catcode`\^^\=\other
+ \catcode`\^^]=\other
+ \catcode`\^^^=\other
+ \catcode`\^^_=\other
+ % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
+ % in xref tags, i.e., node names. But since ^^e4 notation isn't
+ % supported in the main text, it doesn't seem desirable. Furthermore,
+ % that is not enough: for node names that actually contain a ^
+ % character, we would end up writing a line like this: 'xrdef {'hat
+ % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
+ % argument, and \hat is not an expandable control sequence. It could
+ % all be worked out, but why? Either we support ^^ or we don't.
+ %
+ % The other change necessary for this was to define \auxhat:
+ % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
+ % and then to call \auxhat in \setq.
+ %
+ \catcode`\^=\other
+ %
+ % Special characters. Should be turned off anyway, but...
+ \catcode`\~=\other
+ \catcode`\[=\other
+ \catcode`\]=\other
+ \catcode`\"=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\$=\other
+ \catcode`\#=\other
+ \catcode`\&=\other
+ \catcode`\%=\other
+ \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
+ %
+ % Make the characters 128-255 be printing characters
+ {%
+ \count 1=128
+ \def\loop{%
+ \catcode\count 1=\other
+ \advance\count 1 by 1
+ \ifnum \count 1<256 \loop \fi
+ }%
+ }%
+ %
+ % Turn off \ as an escape so we do not lose on
+ % entries which were dumped with control sequences in their names.
+ % For example, @xrdef{$\leq $-fun}{page ...} made by @defun ^^
+ % Reference to such entries still does not work the way one would wish,
+ % but at least they do not bomb out when the aux file is read in.
+ \catcode`\\=\other
+ %
+ % @ is our escape character in .aux files.
+ \catcode`\{=1
+ \catcode`\}=2
+ \catcode`\@=0
+ %
+ \openin 1 \jobname.aux
+ \ifeof 1 \else
+ \closein 1
+ \input \jobname.aux
+ \global\havexrefstrue
+ \global\warnedobstrue
+ \fi
+ % Open the new aux file. TeX will close it automatically at exit.
+ \openout\auxfile=\jobname.aux
+\endgroup}
+
+
+% Footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed. (Generally, numeric constants should always be followed by a
+% space to prevent strange expansion errors.)
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for info output only.
+\let\footnotestyle=\comment
+
+\let\ptexfootnote=\footnote
+
+{\catcode `\@=11
+%
+% Auto-number footnotes. Otherwise like plain.
+\gdef\footnote{%
+ \global\advance\footnoteno by \@ne
+ \edef\thisfootno{$^{\the\footnoteno}$}%
+ %
+ % In case the footnote comes at the end of a sentence, preserve the
+ % extra spacing after we do the footnote number.
+ \let\@sf\empty
+ \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
+ %
+ % Remove inadvertent blank space before typesetting the footnote number.
+ \unskip
+ \thisfootno\@sf
+ \dofootnote
+}%
+
+% Don't bother with the trickery in plain.tex to not require the
+% footnote text as a parameter. Our footnotes don't need to be so general.
+%
+% Oh yes, they do; otherwise, @ifset and anything else that uses
+% \parseargline fail inside footnotes because the tokens are fixed when
+% the footnote is read. --karl, 16nov96.
+%
+% The start of the footnote looks usually like this:
+\gdef\startfootins{\insert\footins\bgroup}
+%
+% ... but this macro is redefined inside @multitable.
+%
+\gdef\dofootnote{%
+ \startfootins
+ % We want to typeset this text as a normal paragraph, even if the
+ % footnote reference occurs in (for example) a display environment.
+ % So reset some parameters.
+ \hsize=\pagewidth
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\ht\strutbox % top baseline for broken footnotes
+ \splitmaxdepth\dp\strutbox
+ \floatingpenalty\@MM
+ \leftskip\z@skip
+ \rightskip\z@skip
+ \spaceskip\z@skip
+ \xspaceskip\z@skip
+ \parindent\defaultparindent
+ %
+ \smallfonts \rm
+ %
+ % Because we use hanging indentation in footnotes, a @noindent appears
+ % to exdent this text, so make it be a no-op. makeinfo does not use
+ % hanging indentation so @noindent can still be needed within footnote
+ % text after an @example or the like (not that this is good style).
+ \let\noindent = \relax
+ %
+ % Hang the footnote text off the number. Use \everypar in case the
+ % footnote extends for more than one paragraph.
+ \everypar = {\hang}%
+ \textindent{\thisfootno}%
+ %
+ % Don't crash into the line above the footnote text. Since this
+ % expands into a box, it must come within the paragraph, lest it
+ % provide a place where TeX can split the footnote.
+ \footstrut
+ \futurelet\next\fo@t
+}
+}%end \catcode `\@=11
+
+% @| inserts a changebar to the left of the current line. It should
+% surround any changed text. This approach does *not* work if the
+% change spans more than two lines of output. To handle that, we would
+% have adopt a much more difficult approach (putting marks into the main
+% vertical list for the beginning and end of each change).
+%
+\def\|{%
+ % \vadjust can only be used in horizontal mode.
+ \leavevmode
+ %
+ % Append this vertical mode material after the current line in the output.
+ \vadjust{%
+ % We want to insert a rule with the height and depth of the current
+ % leading; that is exactly what \strutbox is supposed to record.
+ \vskip-\baselineskip
+ %
+ % \vadjust-items are inserted at the left edge of the type. So
+ % the \llap here moves out into the left-hand margin.
+ \llap{%
+ %
+ % For a thicker or thinner bar, change the `1pt'.
+ \vrule height\baselineskip width1pt
+ %
+ % This is the space between the bar and the text.
+ \hskip 12pt
+ }%
+ }%
+}
+
+% For a final copy, take out the rectangles
+% that mark overfull boxes (in case you have decided
+% that the text looks ok even though it passes the margin).
+%
+\def\finalout{\overfullrule=0pt}
+
+% @image. We use the macros from epsf.tex to support this.
+% If epsf.tex is not installed and @image is used, we complain.
+%
+% Check for and read epsf.tex up front. If we read it only at @image
+% time, we might be inside a group, and then its definitions would get
+% undone and the next image would fail.
+\openin 1 = epsf.tex
+\ifeof 1 \else
+ \closein 1
+ % Do not bother showing banner with epsf.tex v2.7k (available in
+ % doc/epsf.tex and on ctan).
+ \def\epsfannounce{\toks0 = }%
+ \input epsf.tex
+\fi
+%
+% We will only complain once about lack of epsf.tex.
+\newif\ifwarnednoepsf
+\newhelp\noepsfhelp{epsf.tex must be installed for images to
+ work. It is also included in the Texinfo distribution, or you can get
+ it from ftp://tug.org/tex/epsf.tex.}
+%
+\def\image#1{%
+ \ifx\epsfbox\undefined
+ \ifwarnednoepsf \else
+ \errhelp = \noepsfhelp
+ \errmessage{epsf.tex not found, images will be ignored}%
+ \global\warnednoepsftrue
+ \fi
+ \else
+ \imagexxx #1,,,,,\finish
+ \fi
+}
+%
+% Arguments to @image:
+% #1 is (mandatory) image filename; we tack on .eps extension.
+% #2 is (optional) width, #3 is (optional) height.
+% #4 is (ignored optional) html alt text.
+% #5 is (ignored optional) extension.
+% #6 is just the usual extra ignored arg for parsing this stuff.
+\newif\ifimagevmode
+\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
+ \catcode`\^^M = 5 % in case we're inside an example
+ \normalturnoffactive % allow _ et al. in names
+ % If the image is by itself, center it.
+ \ifvmode
+ \imagevmodetrue
+ \nobreak\bigskip
+ % Usually we'll have text after the image which will insert
+ % \parskip glue, so insert it here too to equalize the space
+ % above and below.
+ \nobreak\vskip\parskip
+ \nobreak
+ \line\bgroup\hss
+ \fi
+ %
+ % Output the image.
+ \ifpdf
+ \dopdfimage{#1}{#2}{#3}%
+ \else
+ % \epsfbox itself resets \epsf?size at each figure.
+ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
+ \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
+ \epsfbox{#1.eps}%
+ \fi
+ %
+ \ifimagevmode \hss \egroup \bigbreak \fi % space after the image
+\endgroup}
+
+
+\message{localization,}
+% and i18n.
+
+% @documentlanguage is usually given very early, just after
+% @setfilename. If done too late, it may not override everything
+% properly. Single argument is the language abbreviation.
+% It would be nice if we could set up a hyphenation file here.
+%
+\def\documentlanguage{\parsearg\dodocumentlanguage}
+\def\dodocumentlanguage#1{%
+ \tex % read txi-??.tex file in plain TeX.
+ % Read the file if it exists.
+ \openin 1 txi-#1.tex
+ \ifeof1
+ \errhelp = \nolanghelp
+ \errmessage{Cannot read language file txi-#1.tex}%
+ \let\temp = \relax
+ \else
+ \def\temp{\input txi-#1.tex }%
+ \fi
+ \temp
+ \endgroup
+}
+\newhelp\nolanghelp{The given language definition file cannot be found or
+is empty. Maybe you need to install it? In the current directory
+should work if nowhere else does.}
+
+
+% @documentencoding should change something in TeX eventually, most
+% likely, but for now just recognize it.
+\let\documentencoding = \comment
+
+
+% Page size parameters.
+%
+\newdimen\defaultparindent \defaultparindent = 15pt
+
+\chapheadingskip = 15pt plus 4pt minus 2pt
+\secheadingskip = 12pt plus 3pt minus 2pt
+\subsecheadingskip = 9pt plus 2pt minus 2pt
+
+% Prevent underfull vbox error messages.
+\vbadness = 10000
+
+% Don't be so finicky about underfull hboxes, either.
+\hbadness = 2000
+
+% Following George Bush, just get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything. We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize. We call this whenever the paper size is set.
+%
+\def\setemergencystretch{%
+ \ifx\emergencystretch\thisisundefined
+ % Allow us to assign to \emergencystretch anyway.
+ \def\emergencystretch{\dimen0}%
+ \else
+ \emergencystretch = .15\hsize
+ \fi
+}
+
+% Parameters in order: 1) textheight; 2) textwidth; 3) voffset;
+% 4) hoffset; 5) binding offset; 6) topskip; 7) physical page height; 8)
+% physical page width.
+%
+% We also call \setleading{\textleading}, so the caller should define
+% \textleading. The caller should also set \parskip.
+%
+\def\internalpagesizes#1#2#3#4#5#6#7#8{%
+ \voffset = #3\relax
+ \topskip = #6\relax
+ \splittopskip = \topskip
+ %
+ \vsize = #1\relax
+ \advance\vsize by \topskip
+ \outervsize = \vsize
+ \advance\outervsize by 2\topandbottommargin
+ \pageheight = \vsize
+ %
+ \hsize = #2\relax
+ \outerhsize = \hsize
+ \advance\outerhsize by 0.5in
+ \pagewidth = \hsize
+ %
+ \normaloffset = #4\relax
+ \bindingoffset = #5\relax
+ %
+ \ifpdf
+ \pdfpageheight #7\relax
+ \pdfpagewidth #8\relax
+ \fi
+ %
+ \setleading{\textleading}
+ %
+ \parindent = \defaultparindent
+ \setemergencystretch
+}
+
+% @letterpaper (the default).
+\def\letterpaper{{\globaldefs = 1
+ \parskip = 3pt plus 2pt minus 1pt
+ \textleading = 13.2pt
+ %
+ % If page is nothing but text, make it come out even.
+ \internalpagesizes{46\baselineskip}{6in}%
+ {\voffset}{.25in}%
+ {\bindingoffset}{36pt}%
+ {11in}{8.5in}%
+}}
+
+% Use @smallbook to reset parameters for 7x9.5 (or so) format.
+\def\smallbook{{\globaldefs = 1
+ \parskip = 2pt plus 1pt
+ \textleading = 12pt
+ %
+ \internalpagesizes{7.5in}{5in}%
+ {\voffset}{.25in}%
+ {\bindingoffset}{16pt}%
+ {9.25in}{7in}%
+ %
+ \lispnarrowing = 0.3in
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = .5cm
+}}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{{\globaldefs = 1
+ \parskip = 3pt plus 2pt minus 1pt
+ \textleading = 13.2pt
+ %
+ % Double-side printing via postscript on Laserjet 4050
+ % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
+ % To change the settings for a different printer or situation, adjust
+ % \normaloffset until the front-side and back-side texts align. Then
+ % do the same for \bindingoffset. You can set these for testing in
+ % your texinfo source file like this:
+ % @tex
+ % \global\normaloffset = -6mm
+ % \global\bindingoffset = 10mm
+ % @end tex
+ \internalpagesizes{51\baselineskip}{160mm}
+ {\voffset}{\hoffset}%
+ {\bindingoffset}{44pt}%
+ {297mm}{210mm}%
+ %
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = 5mm
+}}
+
+% Use @afivepaper to print on European A5 paper.
+% From romildo@urano.iceb.ufop.br, 2 July 2000.
+% He also recommends making @example and @lisp be small.
+\def\afivepaper{{\globaldefs = 1
+ \parskip = 2pt plus 1pt minus 0.1pt
+ \textleading = 12.5pt
+ %
+ \internalpagesizes{160mm}{120mm}%
+ {\voffset}{\hoffset}%
+ {\bindingoffset}{8pt}%
+ {210mm}{148mm}%
+ %
+ \lispnarrowing = 0.2in
+ \tolerance = 800
+ \hfuzz = 1.2pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = 2mm
+ \tableindent = 12mm
+}}
+
+% A specific text layout, 24x15cm overall, intended for A4 paper.
+\def\afourlatex{{\globaldefs = 1
+ \afourpaper
+ \internalpagesizes{237mm}{150mm}%
+ {\voffset}{4.6mm}%
+ {\bindingoffset}{7mm}%
+ {297mm}{210mm}%
+ %
+ % Must explicitly reset to 0 because we call \afourpaper.
+ \globaldefs = 0
+}}
+
+% Use @afourwide to print on A4 paper in landscape format.
+\def\afourwide{{\globaldefs = 1
+ \afourpaper
+ \internalpagesizes{241mm}{165mm}%
+ {\voffset}{-2.95mm}%
+ {\bindingoffset}{7mm}%
+ {297mm}{210mm}%
+ \globaldefs = 0
+}}
+
+% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
+% Perhaps we should allow setting the margins, \topskip, \parskip,
+% and/or leading, also. Or perhaps we should compute them somehow.
+%
+\def\pagesizes{\parsearg\pagesizesxxx}
+\def\pagesizesxxx#1{\pagesizesyyy #1,,\finish}
+\def\pagesizesyyy#1,#2,#3\finish{{%
+ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
+ \globaldefs = 1
+ %
+ \parskip = 3pt plus 2pt minus 1pt
+ \setleading{\textleading}%
+ %
+ \dimen0 = #1
+ \advance\dimen0 by \voffset
+ %
+ \dimen2 = \hsize
+ \advance\dimen2 by \normaloffset
+ %
+ \internalpagesizes{#1}{\hsize}%
+ {\voffset}{\normaloffset}%
+ {\bindingoffset}{44pt}%
+ {\dimen0}{\dimen2}%
+}}
+
+% Set default to letter.
+%
+\letterpaper
+
+
+\message{and turning on texinfo input format.}
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other
+\catcode`\~=\other
+\catcode`\^=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode`\+=\other
+\catcode`\$=\other
+\def\normaldoublequote{"}
+\def\normaltilde{~}
+\def\normalcaret{^}
+\def\normalunderscore{_}
+\def\normalverticalbar{|}
+\def\normalless{<}
+\def\normalgreater{>}
+\def\normalplus{+}
+\def\normaldollar{$}%$ font-lock fix
+
+% This macro is used to make a character print one way in ttfont
+% where it can probably just be output, and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise. Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
+
+% Same as above, but check for italic font. Actually this also catches
+% non-italic slanted fonts since it is impossible to distinguish them from
+% italic fonts. But since this is only used by $ and it uses \sl anyway
+% this is not a problem.
+\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
+
+% Turn off all special characters except @
+% (and those which the user can use as if they were ordinary).
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+
+\catcode`\"=\active
+\def\activedoublequote{{\tt\char34}}
+\let"=\activedoublequote
+\catcode`\~=\active
+\def~{{\tt\char126}}
+\chardef\hat=`\^
+\catcode`\^=\active
+\def^{{\tt \hat}}
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+% Subroutine for the previous macro.
+\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
+
+\catcode`\|=\active
+\def|{{\tt\char124}}
+\chardef \less=`\<
+\catcode`\<=\active
+\def<{{\tt \less}}
+\chardef \gtr=`\>
+\catcode`\>=\active
+\def>{{\tt \gtr}}
+\catcode`\+=\active
+\def+{{\tt \char 43}}
+\catcode`\$=\active
+\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
+
+% Set up an active definition for =, but don't enable it most of the time.
+{\catcode`\==\active
+\global\def={{\tt \char 61}}}
+
+\catcode`+=\active
+\catcode`\_=\active
+
+% If a .fmt file is being used, characters that might appear in a file
+% name cannot be active until we have parsed the command line.
+% So turn them off again, and have \everyjob (or @setfilename) turn them on.
+% \otherifyactive is called near the end of this file.
+\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
+
+\catcode`\@=0
+
+% \rawbackslashxx outputs one backslash character in current font,
+% as in \char`\\.
+\global\chardef\rawbackslashxx=`\\
+
+% \rawbackslash defines an active \ to do \rawbackslashxx.
+% \otherbackslash defines an active \ to be a literal `\' character with
+% catcode other.
+{\catcode`\\=\active
+ @gdef@rawbackslash{@let\=@rawbackslashxx}
+ @gdef@otherbackslash{@let\=@realbackslash}
+}
+
+% \realbackslash is an actual character `\' with catcode other.
+{\catcode`\\=\other @gdef@realbackslash{\}}
+
+% \normalbackslash outputs one backslash in fixed width font.
+\def\normalbackslash{{\tt\rawbackslashxx}}
+
+\catcode`\\=\active
+
+% Used sometimes to turn off (effectively) the active characters
+% even after parsing them.
+@def@turnoffactive{%
+ @let"=@normaldoublequote
+ @let\=@realbackslash
+ @let~=@normaltilde
+ @let^=@normalcaret
+ @let_=@normalunderscore
+ @let|=@normalverticalbar
+ @let<=@normalless
+ @let>=@normalgreater
+ @let+=@normalplus
+ @let$=@normaldollar %$ font-lock fix
+}
+
+% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
+% the literal character `\'. (Thus, \ is not expandable when this is in
+% effect.)
+%
+@def@normalturnoffactive{@turnoffactive @let\=@normalbackslash}
+
+% Make _ and + \other characters, temporarily.
+% This is canceled by @fixbackslash.
+@otherifyactive
+
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+%
+@gdef@eatinput input texinfo{@fixbackslash}
+@global@let\ = @eatinput
+
+% On the other hand, perhaps the file did not have a `\input texinfo'. Then
+% the first `\{ in the file would cause an error. This macro tries to fix
+% that, assuming it is called before the first `\' could plausibly occur.
+% Also back turn on active characters that might appear in the input
+% file name, in case not using a pre-dumped format.
+%
+@gdef@fixbackslash{%
+ @ifx\@eatinput @let\ = @normalbackslash @fi
+ @catcode`+=@active
+ @catcode`@_=@active
+}
+
+% Say @foo, not \foo, in error messages.
+@escapechar = `@@
+
+% These look ok in all fonts, so just make them not special.
+@catcode`@& = @other
+@catcode`@# = @other
+@catcode`@% = @other
+
+@c Set initial fonts.
+@textfonts
+@rm
+
+
+@c Local variables:
+@c eval: (add-hook 'write-file-hooks 'time-stamp)
+@c page-delimiter: "^\\\\message"
+@c time-stamp-start: "def\\\\texinfoversion{"
+@c time-stamp-format: "%:y-%02m-%02d.%02H"
+@c time-stamp-end: "}"
+@c End: