GNU nano 2.0.3 - 2007.01.29
- General:
	- Miscellaneous comment fixes. (DLR)
	- More int -> bool conversions. (DLR)
	- Don't install the nanorc manpages or generate their HTML
	  versions if nano is built without nanorc support.  Changes to
	  configure.ac, doc/man/Makefile.am, and doc/man/fr/Makefile.am.
	  (DLR)
	- Simplify the commands that generate HTML documentation in
	  order to remove unnecessary usage of cat.  Changes to
	  doc/man/Makefile.am, doc/man/fr/Makefile.am, and
	  doc/texinfo/Makefile.am. (DLR)
- files.c:
  do_writeout()
	- When setting retval to the return value of
	  write_(marked_)?file(), use the "?" operator instead of an
	  if/else clause. (DLR)
  is_dir()
	- Don't assign dirptr's value using buf until we've asserted
	  that buf isn't NULL. (DLR)
	- Remove unneeded assert. (DLR)
- proto.h:
	- Add missing is_dir() prototype. (DLR)
- search.c:
  regexp_init()
	- Don't assign rc's value via regcomp() until we've asserted
	  that regexp_compiled is FALSE. (DLR)
- text.c:
  do_alt_speller()
	- Rename variable altspell_error to alt_spell_error, for
	  consistency. (DLR)
  do_spell()
	- Rename variable i to status, for clarity. (DLR)
- winio.c:
  do_credits()
	- Update the last copyright notice to include 2007. (DLR)
- Makefile.am:
	- Add README.CVS to EXTRA_DIST, so that nano's CVS checkout
	  instructions aren't only available in its CVS snapshots. (DLR)
- README:
	- Add more miscellaneous cosmetic fixes. (DLR)
- README.CVS:
	- Update for the 2.0 branch of nano. (DLR)
- NEWS:
	- Formatting fix. (DLR)
- m4/glib-2.0.m4:
	- Import the latest version of this file from glib 2.10.3. (DLR)
- doc/faq.html:
	- Update section 4.1 to describe how to open files with names
	  beginning with '+' at specified columns as well as lines.
	  (DLR)
- doc/man/fr/Makefile.am:
	- Set mandir before setting man_MANS, to more closely match
	  doc/man/Makefile.am. (DLR)
- doc/syntax/python.nanorc:
	- Improve string highlighting regexes. (Mike Frysinger)

GNU nano 2.0.2 - 2006.12.20
- General:
	- Miscellaneous comment fixes. (DLR)
- browser.c:
  do_browser()
	- Properly handle directories that contain nulls. (DLR)
- files.c:
  do_insertfile()
	- Properly handle filenames and executable commands that contain
	  nulls. (DLR)
  write_file()
	- Properly handle filenames that contain nulls. (DLR)
  do_writeout()
	- Fix a segfault when we can't get the full path of either the
	  filename we want to save under or the original filename. (DLR,
	  found by Mike Frysinger)
- nano.h:
	- Rename NANO_ALT_REPLACE_KEY to NANO_REPLACE_ALTKEY, for
	  consistency. (DLR)
	- Rename NANO_ALT_.* and NANO_.*ALTKEY to NANO_META_.* and
	  NANO_.*METAKEY, for consistency. (DLR)
- search.c:
  update_history()
	- Fix minor memory leak. (DLR)
- text.c:
  do_spell()
	- When setting i to the return value of write_(marked_)?file(),
	  use the "?" operator instead of an if/else clause. (DLR)
  do_verbatim_input()
	- Fix minor memory leak. (DLR)
- winio.c:
  parse_kbinput()
	- Add missing break. (DLR)
	- Fix minor memory leak. (Itay Perl)
  parse_verbatim_kbinput()
	- Fix minor memory leak. (DLR)
  edit_draw()
	- Fix potential warnings when assigning -1 to paintlen by using
	  if/else clauses instead of "?" operators. (DLR)
- configure.ac:
	- Reword several option descriptions, for clarity. (DLR)
- doc/faq.html:
	- Add miscellaneous wording and capitalization fixes. (DLR)
- BUGS:
	- Add miscellaneous cosmetic fixes. (DLR)
- README:
	- Update for the 2.0 branch of nano. (DLR)

GNU nano 2.0.1 - 2006.11.20
- General:
	- Miscellaneous comment fixes. (DLR)
	- Fix copyright notices to not abbreviate the year list using a
	  range.  Changes to do_credits() and all source files. (DLR)
- files.c:
  get_full_path()
	- Remove unneeded assert. (DLR)
	- Fix problem where only paths would be returned when both paths
	  and filenames should have been. (DLR)
  do_writeout()
	- For consistency, when saving a file with no name, don't allow
	  overwriting an existing file when in restricted mode. (DLR)
	- Fix problem where a file could sometimes be overwritten
	  without a warning prompt. (DLR)
- winio.c:
  do_replace_highlight()
	- Include the code to display zero-length matches even when
	  regex.h isn't found, as it can also be used to display
	  zero-length Unicode characters. (DLR)
- doc/rnano.1, doc/fr/rnano.1:
	- Add missing "(C)" to the copyright notice in the comments.
	  (DLR)
- doc/nano.texi:
	- Remove unneeded "." from the copyright notice in the comments.
	  (DLR)
- NEWS:
	- Add missing entries for nano 1.0.2 and 1.0.3, since 1.1.0
	  includes their changes. (DLR)

GNU nano 2.0.0 - 2006.11.06
- General:
	- Miscellaneous comment fixes. (DLR)
	- Add syntax for POV-Ray files.  New file doc/syntax/pov.nanorc;
	  changes to doc/nanorc.sample.in and doc/syntax/Makefile.am.
	  (Donnie Berkholz, minor tweaks by DLR)
- AUTHORS:
	- Update for the 2.0 branch of nano. (DLR)
- nano.spec.in:
	- Update links for the 2.0 branch of nano. (DLR)
	- Update for newer RPM-based distributions. (DLR, adapted from
	  the nano 1.3.12-1.1.spec file in Fedora Rawhide)
	- Delete the changelog section, as it hasn't been kept up to
	  date, and all its changes are documented here in any case.
	  (DLR)
- doc/faq.html:
	- Update links for the 2.0 branch of nano. (DLR)
- doc/nano.1, doc/nanorc.5, doc/rnano.1:
	- Add minor wording fixes. (DLR)
- doc/man/fr/nano.1, doc/man/fr/nanorc.5, doc/man/fr/rnano.1:
	- Updated manpage translations by Jean-Philippe Guérard.
- doc/nano.texi:
	- Add minor wording and punctuation fixes. (DLR)

GNU nano 1.9.99pre3 - 2006.10.25
- chars.c:
  nstrncasecmp()
	- When returning, use the "?" operator instead of an if/else
	  clause. (DLR)
- cut.c:
  do_cut_text()
	- When uncutting text in the process of copying it, always set
	  placewewant, as do_uncut_text() does, so that the current line
	  is always updated properly. (DLR)
- files.c:
  input_tab()
	- Since the field precision operator used in the sprintf() uses
	  ints and not size_t's, replace it with two strncpy()s, which
	  use size_t's, and a null termination. (DLR)
- help.c:
  parse_help_input()
	- Add 'E' and 'e' as aliases for Exit, for consistency with the
	  file browser. (DLR)
- m4/ac_define_dir.m4:
	- Import the latest version of this file from
	  http://autoconf-archive.cryp.to/ac_define_dir.m4. (DLR)
- doc/faq.html:
	- Update the question in section 4.13 to match the version of it
	  in the answer section. (DLR)
- doc/syntax/c.nanorc:
	- Simplify "undef", "ifn?def", "elif", and "else" in the
	  preprocessor regexes. (DLR)

GNU nano 1.9.99pre2 - 2006.10.02
- General:
	- Miscellaneous comment fixes. (DLR)
	- Make sure that the statusbar cursor position is always
	  properly reset when we get out of all statusbar prompts.
	  Changes to do_insertfile(), do_writeout(),
	  handle_sigwinch(), main(), and do_prompt_abort(). (DLR)
- prompt.c:
  do_statusbar_input()
	- If we get a verbatim input sequence ending with Ctrl-J, remove
	  the Ctrl-J from the buffer before interpreting it as Enter, so
	  that it doesn't erroneously fall through to the edit window
	  and get interpreted as Justify. (DLR)
- winio.c:
  get_input()
	- Simplify to avoid an unnecessary key_buffer_len check. (DLR)
- doc/syntax/c.nanorc:
	- Add "size_t" and "ssize_t" to the types regexes. (DLR,
	  suggested by Mike Frysinger)
	- Simplify "signed" and "unsigned" in the types regexes. (DLR)

GNU nano 1.9.99pre1 - 2006.08.29
- General:
	- Miscellaneous comment fixes. (DLR)
	- Fix option descriptions.  At least one of the two parts of
	  +LINE,COLUMN must be specified at all times; COLUMN is not the
	  only optional value.  Also, fix wording problems in
	  -O/--morespace and -W/--wordbounds.  Changes to usage(),
	  UPGRADE, nano.1, nanorc.5, rnano.1, nano.texi, and
	  nanorc.sample.in. (DLR)
	- Fix mouse support so that it truly ignores everything except
	  releases and clicks of button 1.  Changes to
	  enable_mouse_support() and get_mouseinput(). (DLR)
	- In certain places, call wnoutrefresh(bottomwin) after calling
	  blank_statusbar(), in order to ensure that the statusbar is
	  actually blanked.  Changes to do_help(), do_continue(),
	  handle_sigwinch(), and update_statusbar_line(). (DLR)
	- If the mark isn't on, allow Meta-} and Meta-{ to indent and
	  unindent only the current line, just as it would if the mark
	  covered only the current line, instead of displaying a
	  statusbar message and quitting.  Changes to shortcut_init(),
	  do_indent_marked() (renamed do_indent()),
	  do_indent_marked_void() (renamed do_indent_void()),
	  do_unindent_marked_void() (renamed do_unindent()), and
	  UPGRADE. (DLR, suggested by John M. Gabriele)
	- Consolidate do_scroll_(up|down)() into do_(up|down)(), as
	  they have a lot of duplicate code.  New functions do_up_void()
	  and do_down_void(); changes to shortcut_init(), do_up(),
	  do_scroll_up(), do_down(), do_scroll_down(), do_left(), and
	  do_right(). (DLR)
	- Make Jordi's email address, and the description of what the
	  manual pages were written for, consistent in the
	  documentation.  Changes to AUTHORS, nano.1, nanorc.5, and
	  rnano.1. (DLR, based on suggestions by Jordi)
	- Don't include sys/ioctl.h in nano.c when NANO_TINY is defined,
	  as ioctl() is never used then. (DLR)
	- Improve the display of bools in debugging statements.  Changes
	  to parse_kbinput(), get_escape_seq_kbinput(),
	  parse_escape_seq_kbinput(), get_shortcut(), and get_toggle().
	  (DLR)
	- Rename the values of the scroll_dir enum to UP_DIR and
	  DOWN_DIR, since UP is defined as a termcap value in Tru64's
	  and NetBSD 3.0's curses.h, which breaks compilation on those
	  systems.  Changes to do_page_up(), do_page_down(), do_up(),
	  do_down(), nano.h, and edit_scroll(). (DLR; found by Daniel
	  Richard G. and Adam Wysocki, respectively)
	- Rename the DISABLE_ROOTWRAP #define to DISABLE_ROOTWRAPPING.
	  (DLR)
	- When using slang 2.x, call SLutf8_enable() with an argument of
	  1 instead of TRUE, as that's the proper way to enable its
	  UTF-8 support.  Changes to main() and configure.ac. (DLR)
	- Fix punctuation relating to "i.e." in various comments and
	  documentation. (Benno Schulenberg and DLR)
	- Make bad_mbchar a static const char* const in chars.c, as its
	  value doesn't change. (DLR)
	- Add various clarifications to translated strings.  Changes to
	  do_insertfile_void(), shortcut_init(), toggle_init(),
	  help_init(), print_view_warning(), usage(), and do_mark().
	  (Benno Schulenberg, minor tweaks by DLR)
	- Properly preserve the cursor position when going from the
	  "Read File" or "Save File As" prompt to the file browser to
	  the "Go To Directory" prompt, and then canceling back to the
	  "Read File" or "Save File As" prompt.  Changes to
	  get_prompt_string() and do_prompt(). (DLR)
	- Rename the parameter old_pww to pww_save in
	  need_statusbar_horizontal_update(), need_horizontal_update(),
	  need_vertical_update(), and edit_redraw(); and rename the
	  variable old_pww to pww_save in do_search() and do_research();
	  for consistency. (DLR)
- browser.c:
  do_browser()
	- Refactor the mouse support, modeling it after do_mouse() for
	  consistency. (DLR)
	- Remove unneeded call to blank_edit(). (DLR)
	- After entering "..", select the directory we were in before
	  instead of the first filename in the list, as Pico does. (DLR)
	- Simplify screen update handling and exiting. (DLR)
	- Fix potential segfault when going to a directory that doesn't
	  begin with '/'. (DLR)
  do_browse_from()
	- During the operating directory check, if path isn't NULL,
	  don't bother freeing it before mallocstrcpy()ing operating_dir
	  into it, as the latter operation will free it. (DLR)
	- Don't bother freeing path if it's NULL. (DLR)
  browser_init()
	- Fix off-by-one error when calculating longest that kept the
	  rightmost column of the screen from being used. (DLR)
	- Calculate width here instead of in browser_refresh(), as it's
	  more consistent. (DLR)
	- If filelist is initialized, free it here instead of in several
	  places in do_browser(). (DLR)
  browser_refresh()
	- Simplify. (DLR)
	- Fix problems where translated versions of "(dir)" could be
	  truncated, and where file sizes could be too long. (DLR)
	- For the ".." entry, display "(parent dir)" instead of "(dir)",
	  as Pico does. (DLR)
	- If a filename is too long, truncate it and display an ellipsis
	  before it, as titlebar() does. (DLR)
	- Add translator comments explaining the maximum intended
	  lengths of "(dir)" and "(parent dir)". (DLR)
	- Fix problem where width wouldn't be properly initialized if
	  the file list took up one line or less. (DLR)
	- Don't display overly long filenames with ellipses if the
	  number of columns is extremely small. (DLR)
  browser_select_filename()
	- New function, used to select a specific filename in the list.
	  (DLR)
  findnextfile()
	- Simplify the uses of tail(). (DLR)
  striponedir()
	- Since all the strings passed to this are dynamically
	  allocated, use null_at() to strip the directory from the
	  string.  Also, return the stripped path instead of modifying
	  path. (DLR)
- chars.c:
  mbstrncasecmp(), mbstrcasestr(), mbrevstrcasestr()
	- Don't allocate space for multibyte characters until we've
	  asserted that the parameters we're using aren't NULL. (DLR)
- files.c:
  do_insertfile()
	- If we execute a command in a new buffer, move back to the
	  beginning of the first line of the buffer afterwards, for
	  consistency. (DLR)
	- If we don't insert a file into a new buffer, properly update
	  the x-coordinate to account for the number of characters
	  inserted on the current line. (DLR)
  get_full_path()
	- Don't return NULL when the current directory doesn't exist, as
	  we can still recover from that. (DLR, found by Mike Frysinger)
	- Add various cleanups. (DLR)
- global.c:
  sc_init_one(), shortcut_init()
	- Don't include blank_after when DISABLE_HELP is defined, as
	  it's never used then. (DLR)
  shortcut_init()
	- Remove the ^X shortcut for CutTillEnd at the search prompt, as
	  official Pico doesn't include it, and it can be confused with
	  Exit. (DLR, suggested by Benno Schulenberg)
	- Make the help shortcut for the "Go to Directory" prompt call
	  do_browser_help() instead of do_help_void(), as this prompt is
	  only accessible inside the file browser. (DLR, found by Benno
	  Schulenberg)
  toggle_init()
	- Don't include desc or blank_after when DISABLE_HELP is
	  defined, as neither are ever used then. (DLR)
	- Make sure that a blank line is not displayed after the Meta-Q
	  toggle when mouse support is disabled and we're in restricted
	  mode, and that it is displayed all other times. (DLR)
  toggle_init_one()
	- Don't include desc or blank_after when DISABLE_HELP is
	  defined, as neither are ever used then. (DLR)
- help.c:
  do_help()
	- Simplify screen update handling and exiting. (DLR)
	- Don't allow moving down a page when the last line of the help
	  text is onscreen. (DLR)
  help_init()
	- Adjust the first two chunks of the main help text so that
	  they're no more than 509 characters again. (DLR)
- move.c:
  do_scroll_up(), do_scroll_down()
	- Fix problems where, after scrolling, the previous and current
	  lines would not be updated properly if the current line was
	  not the first or last line of the edit window. (DLR, found by
	  Mike Frysinger)
- nano.c:
  handle_sigwinch()
	- Just in case we're in the statusbar prompt, reset the
	  statusbar cursor position when resizing the window. (DLR)
- nano.h:
	- Remove the manual disabling of color support if regex.h isn't
	  found, as configure.ac now handles that. (DLR)
- rcfile.c:
  parse_rcfile()
	- Add missing ENABLE_COLOR #ifdef around the second check for a
	  syntax with no color commands, to fix compilation with rcfile
	  support and without color support. (Daniel Richard G.)
- search.c:
  replace_regexp()
	- Remove unnecessary casting of c to int. (DLR)
- text.c:
  execute_command()
	- Remove the marking of the file as modified, as do_insertfile()
	  now handles that. (DLR)
- utils.c:
  digits()
	- Tweak to remove the assumption that n is always positive,
	  although it always is in this particular case. (DLR)
- winio.c:
  parse_kbinput()
	- Properly handle combined meta and escape sequences, so that
	  e.g. Meta-/ will work properly when the / is on the numeric
	  keypad and NumLock is off.  Also, properly handle combined
	  control character and escape sequences, so that e.g. Esc Esc /
	  will work properly when the / is on the numeric keypad and
	  NumLock is off. (DLR)
	- Translate extended keypad keys to their ASCII equivalents even
	  when we hit Escape once or twice before typing them, for
	  consistency. (DLR)
	- If they're defined, translate KEY_SUP into NANO_PREVLINE_KEY
	  and KEY_SDOWN into NANO_NEXTLINE_KEY, since they are sometimes
	  generated by Shift-Up and Shift-Down. (DLR)
  parse_escape_seq_kbinput()
	- Handle unknown and unignored escape sequences once here
	  instead of twice in parse_kbinput(). (DLR)
	- Don't ignore escape sequences anymore.  Instead, return the
	  corresponding key so that parse_kbinput() can translate it.
	  (DLR)
  display_string()
	- Properly handle buf[start_index]'s being a null terminator.
	  (DLR)
  edit_draw()
	- Simplify the setting of paintlen. (DLR)
  titlebar()
	- Don't display overly long filenames with ellipses if the
	  number of columns is extremely small. (DLR)
	- Don't display any blank space for the state if we're in the
	  file browser, as Pico doesn't. (DLR)
- configure.ac:
	- If regex.h isn't found, display an error message if we try to
	  enable color support. (DLR)
	- Fix the spacing of the error message displayed when slcurses.h
	  isn't found. (DLR)
	- If we use the --disable-wrapping option, ignore the
	  --disable-wrapping-as-root option. (DLR)
	- Add minor cosmetic tweaks. (DLR)
- doc/Makefile.am:
	- Don't include nanorc.sample in EXTRA_DIST, as it's only useful
	  when we're building from source, as opposed to building a
	  distribution. (DLR)
	- Tweak to remove usage of the += operator again. (DLR)
- doc/man/Makefile.am:
	- Tweak to remove usage of the += operator again. (DLR)
- doc/man/fr/nano.1, doc/man/fr/nanorc.5, doc/man/fr/rnano.1:
	- Updated manpage translations by Jean-Philippe Guérard.
- doc/faq.html:
	- Update section 5.3 again to not state "the latest development
	  version" before 1.3.12, as it's no longer accurate. (DLR)
	- Add some minor spacing fixes. (DLR)
- doc/nano.texi:
	- Add missing description of the -O/--morespace command line
	  option. (DLR)
- doc/syntax/c.nanorc:
	- Since .i and .ii are preprocessed C and C++ output, colorize
	  them here. (Mike Frysinger)
	- Remove redundancy from the file extension regexes. (DLR)
- doc/syntax/ruby.nanorc:
	- Add missing blank line after the first comment, for
	  consistency. (DLR)
	- Improve highlighting of constants. (John M. Gabriele, minor
	  tweaks by DLR)

GNU nano 1.3.12 - 2006.06.26
- General:
	- Miscellaneous comment fixes. (DLR)
	- Implement filename searches in the file browser.  New
	  functions filesearch_init(), findnextfile(),
	  findnextfile_wrap_reset(), filesearch_abort(),
	  do_filesearch(), do_fileresearch(), do_first_file(),
	  do_last_file(), do_help_void(), and do_browser_help(); changes
	  to do_browser(), parse_browser_input(), shortcut_init(),
	  do_help(), and help_init(). (DLR)
	- Open all files in binary mode for consistency and robustness.
	  Changes to load_history() and do_rcfile(). (DLR)
	- Change translator-specific comments in global.c and prompt.c
	  so that they show up in nano.pot, and make them all
	  consistent. (Benno Schulenberg and DLR)
	- Reduce USE_UTF8 to a static bool in chars.c, allow nano.c to
	  set it via a function, and allow winio.c to read its value
	  when needed.  New functions utf8_init() and using_utf8();
	  changes to is_alnum_mbchar(), is_blank_mbchar(),
	  is_cntrl_mbchar(), is_punct_mbchar(), control_mbrep(),
	  mbrep(), mbwidth(), mb_cur_max(), make_mbchar(),
	  parse_mbchar(), mbstrncasecmp(), mbstrcasestr(),
	  mbrevstrcasestr(), mbstrnlen(), mbstrchr(), mbstrpbrk(),
	  mbrevstrpbrk(), has_blank_mbchars(), is_valid_mbstring(),
	  main(), display_string(), and do_credits(). (DLR)
	- Add the ability to use bold text instead of reverse video
	  text, via the -D/--boldtext command line option and the
	  "boldtext" rcfile option.  Changes to browser_refresh(),
	  do_help(), usage(), main(), update_statusbar_prompt(),
	  do_yesno_prompt(), titlebar(), statusbar(), onekey(),
	  edit_draw(), do_replace_highlight(), nano.1, nanorc.5,
	  nano.texi, and nanorc.sample. (DLR, suggested by Benno
	  Schulenberg)
	- Add the ability to use self-contained color syntaxes from
	  separate files, accessible in the nanorc via the "include"
	  command.  New function parse_include(); changes to
	  parse_rcfile(), do_nanorc(), nanorc.5, and nanorc.sample.
	  (Victor Ananievsky, Brand Huntsman and DLR)
	- Change references to the "help menu" to the "help text
	  display" refer to display, for clarity.  Changes to
	  shortcut_init(), configure.ac, and faq.html. (DLR, suggested
	  by Benno Schulenberg)
	- Adjust the shortcut list display and related mouse support to
	  not waste the last few characters of bottomwin when the screen
	  width isn't a clean multiple of the column width.  Changes to
	  do_mouseinput() and bottombars(). (Benno Schulenberg, minor
	  tweaks by DLR)
	- Add several blank entries to the main shortcut list and the
	  global toggle list, in order to make the help text easier to
	  read.  Changes to sc_init_one(), toggle_init(),
	  toggle_init_one(), shortcut_init(), get_toggle(), and
	  help_init(). (DLR, suggested by Benno Schulenberg)
	- Reduce NO_RCFILE to a static bool in nano.c, since it's only
	  used there.  Changes to finish() and main(). (DLR)
	- Readd the Cancel -> Exit aliases for the file browser and help
	  browser.  New function parse_help_input(); changes to
	  parse_browser_input() and do_help(). (DLR, suggested by Benno
	  Schulenberg)
	- Add the ability to copy text into the cutbuffer without
	  cutting it, via Meta-^ (Meta-6).  Note that this is disabled
	  when NANO_TINY is defined.  New functions do_cut_text_void()
	  and do_copy_text(); changes to do_cut_text(), shortcut_init(),
	  and do_input(). (DLR, suggested by Ken Tyler)
	- Add the ability to indent and unindent all marked lines of
	  text, via Meta-} (Meta-]) and Meta-{ (Meta-[).  New functions
	  do_indent_marked(), do_indent_marked_void(), and
	  do_unindent_marked_void(); changes to shortcut_init(). (Chris
	  and DLR)
	- Change the shortcut to find the matching bracket to Ctrl-].
	  Changes to shortcut_init() and do_statusbar_input(). (DLR)
	- Drop the Meta-] and Meta-[ aliases for Meta-} and Meta-{, and
	  change the shortcut to find the matching bracket from Ctrl-]
	  back to Meta-], since Ctrl-] is used as the telnet escape key.
	  Changes to shortcut_init() and do_statusbar_input(). (DLR,
	  found by Chris)
	- Add the ability to move to the first and last line of the help
	  text and the first and last file in the file browser via
	  Meta-\ (Meta-|) and Meta-/ (Meta-?).  Changes to do_browser(),
	  shortcut_init(), and do_help(). (DLR)
	- Allow unjustifying if we resize the window immediately after
	  justifying, as Pico does, and make input handling across
	  resizes more consistent.  Changes to handle_sigwinch(),
	  main(), get_kbinput(), parse_kbinput(), get_byte_kbinput(),
	  and get_unicode_kbinput(); removal of reset_kbinput(). (DLR)
	- Handle statusbar blanking in two places instead of many, so
	  that it always works consistently.  Changes to do_browser(),
	  do_cut_text(), do_uncut_text(), do_first_line(),
	  do_last_line(), do_page_up(), do_page_down(), do_para_begin(),
	  do_para_end(), do_para_end(), do_next_word(), do_prev_word(),
	  do_home(), do_end(), do_up(), do_scroll_up(), do_down(),
	  do_scroll_down(), do_left(), do_right(), do_indent_marked(),
	  do_verbatim_input(), and get_kbinput(). (Benno Schulenberg,
	  minor tweaks by DLR)
	- Handle prepending of wrapped text in one place instead of
	  many, so that it always works consistently.  Changes to
	  do_uncut_text(), do_insertfile(), do_page_up(),
	  do_page_down(), do_up(), do_scroll_up(), do_down(),
	  do_scroll_down(), do_input(), do_search(), do_research(), and
	  do_delete(). (DLR)
	- Ignore unhandled meta key sequences, function keys, and escape
	  sequences, indicate it on the statusbar, and beep when we get
	  an unhandled shortcut or toggle, as Pico does.  To get this to
	  work properly, add a shortcut for moving to the next
	  search/replace string.  New function is_ascii_cntrl_char();
	  changes to shortcut_init(), do_input(), do_statusbar_input(),
	  get_prompt_string(), and parse_kbinput(). (DLR, suggested by
	  Nick Warne and Benno Schulenberg)
	- Explain the mouse support in more detail, and sync the text of
	  its description across all documentation.  Changes to nano.1,
	  nanorc.5, nanorc.sample, and nano.texi. (Benno Schulenberg and
	  DLR)
	- If we're using verbatim input to enter a Unicode sequence,
	  indicate it on the statusbar, and add a translator comment
	  explaining the message.  Also, refactor get_unicode_kbinput()
	  to remove redundant code.  New function add_unicode_digit();
	  changes to get_unicode_kbinput() and parse_verbatim_kbinput().
	  (Benno Schulenberg, minor tweaks by DLR)
	- Allow normal typing of high-bit control characters, as Pico
	  does.  Changes to do_output() and do_statusbar_output(). (DLR)
	- Move color regexes into separate files, make nanorc.sample
	  reference them, and make them install properly.  In the
	  process, rename nanorc.sample to nanorc.sample.in, put
	  @PKGDATADIR@ at the beginning of all nanorc file paths, add
	  needed AC_DEFINE_DIR macro from the Autoconf Macro Archive at
	  http://autoconf-archive.cryp.to/ac_define_dir.m4, and make
	  configure.ac do the substitution, so that the proper paths
	  will always be used in nanorc.sample.  New files
	  m4/ac_define_dir.m4, doc/syntax/Makefile.am,
	  doc/syntax/asm.nanorc, doc/syntax/c.nanorc,
	  doc/syntax/groff.nanorc, doc/syntax/html.nanorc,
	  doc/syntax/java.nanorc, doc/syntax/man.nanorc,
	  doc/syntax/mutt.nanorc, doc/syntax/nanorc.nanorc,
	  doc/syntax/patch.nanorc, doc/syntax/perl.nanorc,
	  doc/syntax/python.nanorc, doc/syntax/ruby.nanorc,
	  doc/syntax/sh.nanorc, and doc/syntax/tex.nanorc; changes to
	  configure.ac, nano.spec.in, doc/Makefile.am, and
	  m4/Makefile.am; removal of doc/nanorc.sample. (DLR)
	- Replace usage of the bool curses_ended with the isendwin()
	  function, and remove curses_ended.  Changes to do_suspend().
	  (DLR)
	- Remove the workaround for glibc 2.2.3's broken regexec(), and
	  replace it with a FAQ entry explaining the problem, since it
	  could break anything using extended regular expressions, and
	  glibc 2.2.3 is old.  Changes to configure.ac, faq.html,
	  nano.h, proto.h, and UPGRADE; removal of safe_regexec(). (DLR)
	- Minor wording fixes to various messages.  Changes to
	  load_history(), shortcut_init(), toggle_init(), usage(),
	  do_suspend(), do_input(), rcfile_error(), parse_argument(),
	  parse_rcfile(), nano.1, nano.texi, and nanorc.sample.in.
	  (Benno Schulenberg, minor tweaks by DLR and Nick Warne)
	- Make suspension clear the screen and put the cursor on the
	  last line before displaying anything, as Pico does.  New
	  functions disable_mouse_support() and enable_mouse_support();
	  changes to do_mouse(), do_suspend(), do_continue(), and
	  terminal_init(). (DLR)
- browser.c:
  do_browser()
	- Reference NANO_GOTODIR_(ALT|F)?KEY instead of
	  NANO_GOTOLINE_(ALT|F)?KEY for the "Go to Directory" shortcut.
	  (DLR)
  parse_browser_input()
	- Remove redundant key checks. (DLR)
  browser_refresh()
	- Rename variable editline to line, for consistency. (DLR)
	- Change variable i from an int to a size_t in order to match
	  selected, which it's compared against. (DLR)
- color.c:
  color_update()
	- Fix incorrect setting of defcolor, which prevented the
	  reserved "default" syntax from being handled correctly. (DLR)
- cut.c:
  cut_to_eof()
	- New function, containing the main functionality of
	  do_cut_till_end(). (DLR)
  do_cut_text()
	- Add parameter cut_till_end, to indicate when we're cutting
	  from the current cursor position to the end of the file, and
	  call cut_to_eof() when it's TRUE. (DLR)
  do_cut_till_end()
	- Convert to a wrapper for do_cut_text(). (DLR)
- files.c:
  open_file()
	- Remove redundant wording in the error message when we try to
	  open a device file. (DLR)
  do_insertfile()
	- Use actual gettext calls instead of no-ops, for consistency.
	  (DLR)
  safe_tempfile()
	- Don't ignore $TMPDIR if it's set but blank, for consistency.
	  (DLR)
  write_file()
	- Don't free backupname before displaying it in a statusbar error
	  message. (DLR, found by Bill Marcum)
	- If we can't save the backup file for some reason, at least
	  save the original file, if possible, since that's better than
	  saving nothing. (DLR, problem found by Bill Marcum, solution
	  suggested by Jordi)
	- Clarify the error messages when creating a temporary file or
	  writing one for prepending fails. (DLR)
	- Simplify the routine for closing the file just before we
	  indicate success on the statusbar. (DLR)
  do_writeout()
	- Fix problem where the modifiers at the "Write File" prompt
	  were marked for translation via gettext no-ops but never
	  actually translated. (Benno Schulenberg)
  free_chararray()
	- Assert that array isn't NULL, for consistency with the other
	  free_.*() functions. (DLR)
- global.c:
  shortcut_init()
	- Change the cursor position display help text to use "display"
	  instead of "show", for consistency. (DLR)
	- In the main shortcut list, move the "Refresh" shortcut down to
	  after the "Enter" shortcut, for consistency. (DLR)
	- Add the ability to move to the first and last line of the
	  current file from the main list via Meta-\ (Meta-|) and Meta-/
	  (Meta-?).  Also, make sure all the equivalent shortcuts in the
	  search, replace, and "Go To Line" lists accept both the meta
	  keys and the equivalent function keys. (DLR)
	- Reorganize the main shortcut list to make it easier for new
	  users.  It now lists the twelve Pico-compatible default
	  operations, followed by search and replace shortcuts, followed
	  by cut and paste shortcuts, followed by marking shortcuts,
	  followed by back and forth movement shortcuts, followed by
	  start and end movement shortcuts, followed by buffer-switching
	  shortcuts, followed by insertion and deletion shortcuts,
	  followed by special movement shortcuts, followed by advanced
	  word and paragraph shortcuts, followed by display shortcuts.
	  (DLR and Benno Schulenberg, suggested by Benno Schulenberg)
	- Tweak the descriptions of some shortcut keys to make them more
	  uniform. (Benno Schulenberg, minor tweaks by DLR)
	- Shorten the "Where is Next" shortcut name to fit on the screen
	  after adding Meta-\ (Meta-|) and Meta-/ (Meta-?). (DLR)
	- Lengthen the "UnCut Txt" shortcut name to "UnCut Text", as
	  there's enough room to display it unabbreviated. (DLR)
	- Clarify the descriptions of the "Search" and "Replace"
	  shortcuts, and add spaces to the "Exit" shortcut's description
	  in multibuffer mode. (Benno Schulenberg)
	- Remove the "Go To Line" shortcut in the replace shortcut list,
	  for compatibility with Pico. (DLR)
  toggle_init()
	- In the global toggle list, move the "Constant cursor position
	  display" toggle up to after the "Use more space for editing"
	  toggle, for consistency. (DLR)
	- Reorganize the global toggle list to make it easier for new
	  users.  It now lists toggles that affect the way things are
	  displayed, followed by toggles that affect editing, followed
	  by toggles that have to do with peripheral things. (DLR,
	  suggested by Benno Schulenberg)
- help.c:
  do_help()
	- Call get_shortcut() after getting input, so that we only have
	  to check for a main shortcut key instead of both it and all of
	  its equivalents. (DLR)
	- Clean up the handling of NANO_REFRESH_KEY. (DLR)
	- Remove redundant key checks. (DLR)
  help_init()
	- If we have at least two entries' worth of blank space, use it
	  to display more of "^Space" and "M-Space". (DLR, suggested by
	  Benno Schulenberg)
	- Add various wording fixes. (DLR and Benno Schulenberg)
	- If one of the help strings ends in newlines followed by a
	  space, move the space to the next help string to make it
	  easier for translators to see. (Benno Schulenberg)
	- Make sure we have enough memory in all cases when displaying
	  the shortcut and toggle lists. (DLR)
	- Wrap the shortcut list help text, and display it even when we
	  have fewer than 24 columns, for consistency with the toggle
	  help text. (DLR, suggested by Benno Schulenberg)
  parse_help_input()
	- Add Space and '-' as aliases for PageDown and PageUp, for
	  consistency with the file browser. (DLR, suggested by Benno
	  Schulenberg)
	- Remove redundant key checks. (DLR)
  help_line_len()
	- Properly handle the case where we can't break the line of help
	  text. (DLR)
	- Wrap the line of help text at (COLS - 1) instead of
	  (COLS - 8), for consistency. (DLR, suggested by Benno
	  Schulenberg)
- nano.c:
  print1opt_full()
	- Rename to print_opt_full(), for consistency. (DLR)
  usage()
	- Fix inaccuracies in the usage example. (DLR)
	- Put command line arguments in <>'s instead of []'s, as the
	  latter imply that the arguments are optional when they aren't.
	  (DLR, found by Benno Schulenberg)
  renumber()
	- Remove invalid assert. (DLR, found by Filipe Moreira)
  do_input()
	- Remove redundant check for allow_funcs' being TRUE when we get
	  KEY_MOUSE. (DLR)
	- Don't blow away the cutbuffer when we get a shortcut and the
	  function associated with it is do_cut_till_end(). (DLR)
	- Simplify the routine to preserve the cutbuffer when we call a
	  cutting or copying function associated with a shortcut. (DLR)
- nano.h:
	- Reorder the toggle #defines to match their corresponding order
	  in toggle_init(). (DLR)
	- Move the #include for sys/param.h here from nano.c, and add an
	  #ifdef around it. (DLR)
- prompt.c:
  get_prompt_string()
	- Include the handling of the help key even when help is
	  disabled, so that we aren't erroneously kicked out of the
	  statusbar prompt under any circumstances. (DLR, found by Benno
	  Schulenberg)
  do_statusbar_input()
	- Remove redundant check for allow_funcs' being TRUE when we get
	  KEY_MOUSE. (DLR)
	- Improve the handling of NANO_REFRESH_KEY. (DLR)
  total_statusbar_refresh()
	- New function, called when we get NANO_REFRESH_KEY in
	  do_statusbar_input(). (DLR)
  do_yesno_prompt()
	- Handle the keys in a switch statement instead of a long if
	  block, for simplicity. (DLR)
- rcfile.c:
  parse_argument()
	- Rename variable ptr_bak to ptr_save, for consistency. (DLR)
	- Add double quotes around invalid string arguments in error
	  messages, for consistency. (DLR)
	- Add single quotes around the invalid string argument in the
	  error message about unterminated strings, to avoid confusion.
	  (Benno Schulenberg)
  parse_syntax()
	- Don't generate an error if we find a duplicate syntax name,
	  since we might be trying to override a syntax in the global
	  nanorc with one in our local nanorc.  Instead, free any
	  duplicate syntaxes we find, so that we always use the last
	  syntax with a given name. (DLR)
  color_to_short()
	- Add quotes around invalid string arguments in error messages,
	  for consistency. (DLR)
  parse_colors()
	- Check for a color command's not following a syntax line before
	  anything else. (DLR)
	- Add quotes around invalid string arguments in error messages,
	  for consistency. (DLR)
  parse_rcfile()
	- Properly generate an error if we've read in a syntax without
	  any associated color commands. (DLR)
	- Change variable i from an int to a size_t, for consistency.
	  (DLR)
	- Properly handle rcfiles that don't end in newlines. (DLR)
	- Add quotes around invalid string arguments in error messages,
	  for consistency. (DLR)
  do_rcfile()
	- Check for the rcfile's being a directory or device file and
	  reject it if it is, for consistency with file handling
	  elsewhere. (DLR)
	- Remove SYSCONFDIR #ifdef, as SYSCONFDIR should always be set.
	  (DLR)
	- Change all rcfile error messages to refer to commands instead
	  of directives, for consistency with nanorc.5. (DLR)
- text.c:
  break_line()
	- Fix problem where tab widths in columns would always be
	  calculated as tabsize. (DLR, found by Alexey Toptygin)
	- Handle newlines consistently when searching for the last blank
	  in the first group of blanks in the range of (goal - 1). (DLR,
	  found by Benno Schulenberg)
  do_justify()
	- Remove redundant key checks. (DLR)
  do_spell()
	- Clarify the error message when creating a temporary file
	  fails. (DLR)
	- Set currshortcut to main_list before calling total_refresh()
	  near the end of the function, so that we don't display the
	  wrong shortcut list. (DLR)
  do_verbatim_input()
	- Add a translator comment explaining the "Verbatim Input"
	  statusbar message. (Benno Schulenberg)
	- Unconditionally blank the statusbar as soon as we're finished
	  getting input. (DLR, suggested by Benno Schulenberg)
- utils.c:
  digits()
	- Return the proper number of digits when n is exactly 10. (DLR)
	- Simplify to use a for loop instead of a while loop. (DLR)
  ngetdelim()
	- Set errno to EINVAL if stream is not a valid file stream.
	  This matches the manual page. (DLR)
  nperror()
	- Simplify. (DLR)
  check_linenumbers()
	- Removed, as it's no longer used, and since there's no way to
	  tell if its return value will be in int or ssize_t range.
	  (DLR)
- winio.c:
  parse_kbinput()
	- If we get NANO_CONTROL_8, properly handle it in all cases.
	  (DLR)
  parse_escape_seq_kbinput()
	- New function used to interpret escape sequences, formerly part
	  of parse_kbinput(). (DLR)
  get_byte_kbinput()
	- Fix typo preventing Esc Esc 3 through Esc Esc 6 from being
	  interpreted as control key sequences. (DLR)
	- Tweak to more closely match get_unicode_kbinput(). (DLR)
  get_control_kbinput()
	- Add Ctrl-/ as an alias for Ctrl-_. (DLR, found by Benno
	  Schulenberg)
	- Simplify the if blocks wherever possible. (DLR)
  parse_verbatim_kbinput()
	- Don't include the ability to enter a Unicode sequence via
	  verbatim input mode if ENABLE_UTF8 isn't defined or we're not
	  in a UTF-8 locale. (DLR)
  check_statusblank()
	- Avoid redundant updates when statusblank is 0. (DLR)
  display_string()
	- Properly display double-column characters if they're past the
	  first virtual page and their first column is covered by the
	  "$" displayed at the beginning of the line. (DLR)
  statusbar()
	- Blank the statusbar after 26 keystrokes instead of 25, for
	  compatibility with Pico. (DLR)
  edit_draw()
	- Properly ignore zero-length regexes in multi-line regexes as
	  well as single-line ones.  This avoids a segfault when trying
	  to color e.g. "start="$" end="$"". (DLR, found by Trevor
	  Caira)
	- Don't display any statusbar message when we get a zero-length
	  regex, as we can get one under legitimate circumstances. (DLR,
	  found by Mike Frysinger)
  update_line()
	- Remove unneeded assert. (DLR)
  edit_redraw()
	- Fix problem where not all lines would be updated properly if
	  we'd scrolled off the screen and the mark was on. (DLR)
  do_credits()
	- Update the last copyright notice to include 2006. (DLR)
- configure.ac:
	- Remove old warnings about color support. (DLR)
	- Remove conditional header checks for fcntl.h and termios.h, as
	  nano won't build without them, and add conditional header
	  check for sys/param.h, as some systems need only limits.h.
	  (DLR)
- doc/faq.html:
	- Add a new section 4.4, and move all section 4 entries after it
	  down one number, to explain how to deal with problems typing
	  Meta-[. (DLR)
	- Add a new section 4.5, and move all section 4 entries after it
	  down one number, to explain a problem that can occur when
	  holding down keys to generate Meta sequences. (Benno
	  Schulenberg, minor tweaks by DLR)
	- Add a few capitalization and wording fixes. (DLR)
	- Remove section 4.4, and move all section 4 entries after it up
	  one number, since it no longer applies.  Meta-] and Meta-[ are
	  no longer used to indent and unindent marked text, since they
	  require that the bracket matching key change to Ctrl-], which
	  is used as the telnet escape key. (DLR, found by Chris)
	- Make the link to the nano CVS page a bit more readable. (DLR)
	- Update section 3.8 to mention the new "Unicode Input" prompt,
	  and how Unicode input only works when Unicode support is
	  enabled. (DLR)
	- Add minor punctuation, wording, and typo fixes. (DLR)
	- Update section 5.3, due to the display fix for two-column
	  Unicode characters. (DLR)
- doc/nano.1:
	- Update the copyright years to include 2006. (DLR)
	- Explicitly mention that all regexes should be extended regular
	  expressions. (DLR, suggested by John M. Gabriele)
	- Miscellaneous minor fixes. (DLR)
	- Add various wording fixes. (Benno Schulenberg and DLR)
	- Put command line arguments in <>'s instead of []'s, as the
	  latter imply that the arguments are optional when they aren't.
	  (Benno Schulenberg)
- doc/nanorc.5:
	- Update the copyright years to include 2006. (DLR)
	- Explicitly mention that all regexes should be extended regular
	  expressions. (DLR, suggested by John M. Gabriele)
	- Miscellaneous minor fixes. (DLR)
	- Add various wording fixes. (Benno Schulenberg and DLR)
	- Mention that the nanorc file should not be in DOS or Mac
	  format. (DLR)
- doc/rnano.1:
	- Update the copyright years to include 2006. (DLR)
	- Explicitly mention that all regexes should be extended regular
	  expressions. (DLR, suggested by John M. Gabriele)
	- Miscellaneous minor fixes. (DLR)
	- Add various wording fixes. (Benno Schulenberg and DLR)
	- Add description of the +LINE[,COLUMN] option. (DLR)
- doc/nano.texi:
	- Update the copyright years to include 2006. (DLR)
	- Explicitly mention that all regexes should be extended regular
	  expressions. (DLR, suggested by John M. Gabriele)
	- Miscellaneous minor fixes. (DLR)
	- Add various wording fixes. (Benno Schulenberg and DLR)
	- Change license to GPL, in order to match the rest of the
	  documentation, and because the current license is incompatible
	  with everything else in any case. (DLR)
	- Mention that backup files and spell checking are disabled in
	  restricted mode, as rnano.1 does. (DLR)
	- Add minor updates to put some text back in sync with nano's
	  help text, and with nano's current feature set. (DLR)
	- Add a "Nanorc Files" section to explain the nanorc file format
	  in detail, using text from nanorc.5. (DLR)
	- Put command line arguments in <>'s instead of []'s, as the
	  latter imply that the arguments are optional when they aren't.
	  (Benno Schulenberg)
	- Add missing description of -H/--historylog, and move
	  -x/--nohelp down so that all the command line options are in
	  alphabetical order. (Benno Schulenberg)
	- Change all occurrences of "file name" to "filename". (Benno
	  Schulenberg)
- doc/man/Makefile.am:
	- Simplify the setting of SUBDIRS. (DLR)
- doc/man/fr/nano.1, doc/man/fr/nanorc.5, doc/man/fr/rnano.1:
	- Updated manpage translations by Jean-Philippe Guérard.
- doc/nanorc.sample:
	- Miscellaneous minor fixes. (DLR and Benno Schulenberg)
	- Tweak the "c-file" regex for characters to accept '"' again,
	  as it's apparently valid, and simplify it. (DLR)
	- Simplify the "shellscript" regex for command line options.
	  (DLR)
	- Replace instances of \" with ", since quotes inside string
	  parameters don't need to be escaped with backslashes. (DLR)
	- Mention in the comments that more than one start/end regex can
	  be included per line.  Also, change the comment for the
	  "whitespace" option so that the hexadecimal character values
	  are six digits long, and state which character values work
	  with which encodings. (DLR)
	- Add sample regexes for Python. (singular on the Gentoo forums,
	  http://forums.gentoo.org/viewtopic.php?t=86562; minor tweaks
	  by DLR, suggested by John M. Gabriele)
	- Explicitly mention that all regexes should be extended regular
	  expressions. (DLR, suggested by John M. Gabriele)
	- Simplify the "nanorc" regex for commands. (DLR)
	- Mention that the nanorc file should not be in DOS or Mac
	  format. (DLR)
	- Add various wording fixes. (Benno Schulenberg and DLR)
	- Replace instances of "\w" with its equivalent "[0-9A-Z_a-z]",
	  and instances of "\W" with its equivalent "[^0-9A-Z_a-z]", for
	  greater readability. (DLR)
	- Remove unneeded foreground color for the Java source regex
	  used to highlight trailing whitespace, since we now support
	  background colors without foreground colors. (DLR)
	- Further simplify the "groff" regexes. (DLR)
	- Tweak the "shellscript" regexes to properly color all special
	  variables, such as $? and $@. (Benno Schulenberg)
	- Tweak the "nanorc" regexes to color keywords bright green
	  instead of cyan, and comments bright blue instead of blue.
	  (John M. Gabriele)
	- Simplify the extensions associated with the "nanorc" regexes.
	  (DLR)
	- Add regexes for Ruby. (John M. Gabriele, minor tweaks by DLR)
- doc/nanorc.sample.in:
	- Add comments describing the relationships between syntax file
	  names and the names used as their short descriptions. (John M.
	  Gabriele)
- doc/java.nanorc:
	- Simplify a comment. (DLR)
- doc/man.nanorc:
	- Change the name of the "manpage" regexes to "man", for
	  consistency. (John M. Gabriele)
- doc/nanorc.nanorc:
	- Tweak the "nanorc" regexes to color comments starting with a
	  double ## cyan instead of bright blue. (John M. Gabriele)
- doc/ruby.nanorc:
	- Add regex for "here" docs. (John M. Gabriele)
- doc/sh.nanorc:
	- Tweak the regex for special variables, moving "-" to the end,
	  to avoid excessive coloring or an "Invalid range end" error.
	  (Benno Schulenberg)
	- Tweak the "sh" regexes to color comments cyan instead of
	  yellow. (John M. Gabriele)
- src/Makefile.am:
	- If we're uninstalling, remove the "rnano" symlink. (DLR, found
	  by Benno Schulenberg)
	- Remove "-Iintl" from INCLUDES, as we don't use an intl
	  directory inside the source directory anymore. (DLR)
- README, README.CVS:
	- Add various cosmetic and wording improvements. (John M.
	  Gabriele, minor tweaks by DLR)
- TODO:
	- Update for nano 2.0, since we're now in a feature freeze.
	  (DLR)
- UPGRADE:
	- Miscellaneous minor fixes. (DLR)
	- Update for nano 2.0, since we're now in a feature freeze.
	  (DLR)

GNU nano 1.3.11 - 2006.03.30
- General:
	- Miscellaneous comment fixes. (DLR)
	- Remove unnecessary #ifdef around termios.h #include in nano.c.
	  (DLR)
	- Sort the default strings for brackets and punct, and the "or"
	  atom in the default regex string for quotestr, according to
	  ASCII.  Changes to main(), nano.1, nanorc.5, and
	  nanorc.sample. (DLR)
	- Rework the bracket searching code to handle multibyte bracket
	  characters, and allow specifying matching bracket characters
	  other than the default via the "matchbrackets" rcfile option.
	  New functions mbstrpbrk() and mbrevstrpbrk(); changes to
	  find_statusbar_bracket_match(), do_statusbar_find_bracket(),
	  find_bracket_match(), do_find_bracket(), main(),
	  parse_rcfile(), nanorc.5, and nanorc.sample. (DLR)
	- Rework input parsing in the file browser to be more flexible.
	  New function parse_browser_input(); changes to do_browser().
	  (DLR)
	- Allow tab completion of directories at the "Go To Directory"
	  prompt.  Also, move the browser drawing routines to a separate
	  function, and make sure it's used when refreshing or doing tab
	  completion at the prompt in the file browser.  New function
	  browser_refresh(); changes to do_browser(), browser_init(),
	  do_insertfile(), do_writeout(), cwd_tab_completion(),
	  input_tab(), do_statusbar_input(), get_prompt_string(),
	  do_prompt(), search_init(), do_replace(), do_gotolinecolumn(),
	  and do_int_spell_fix(). (DLR)
- browser.c:
  do_browser()
	- Properly set currshortcut back to the file browser shortcut
	  list after a "Go To Directory" prompt, and properly restore
	  the file list display after returning from the help browser at
	  the "Go To Directory" prompt. (DLR)
	- Rename variable j to i, for consistency. (DLR)
	- Make fileline, old_selected, and the static selected size_t's,
	  since the first and second can hold the value of the third,
	  and the first can be that large. (DLR)
- chars.c:
  mbstrchr()
	- Make parameter c const. (DLR)
- files.c:
  do_writeout()
	- Remove unneeded setting of currshortcut. (DLR)
  is_dir()
	- Rename parameter ret to retval, for consistency. (DLR)
- global.c:
  shortcut_init()
	- Remove erroneous handling of the "Get Help" shortcut in the
	  file browser shortcut list. (DLR)
- nano.h:
	- Remove now-unneeded VERMSG #define. (DLR)
- prompt.c:
  get_prompt_string()
	- Redraw the prompt and set finished to FALSE when NANO_HELP_KEY
	  is pressed, so that we don't leave the prompt, enter the help
	  browser, and restart the prompt after leaving it.  This will
	  properly preserve the cursor position after doing the last of
	  these. (DLR)
- utils.c:
  ngetdelim()
	- Do sanity checks manually again instead of in an assert, and
	  set errno to EINVAL as well as return -1 if they fail.  This
	  matches the manual page. (DLR)
- winio.c:
  get_key_buffer()
	- If we fail to get a character MAX_BUF_SIZE times in a row,
	  hang up regardless of the value of errno.  This fixes a
	  problem where nano doesn't terminate properly under xterm if
	  the user su's to root, runs nano, and then closes the terminal
	  window.  errno isn't set properly to EIO then. (DLR, found by
	  John <acocaracha@gmail.com>)
  parse_kbinput()
	- Interpret Shift-Begin, Shift-Delete, Shift-End, Shift-Home,
	  Shift-Insert, and Shift-Suspend as Begin, Delete, End, Home,
	  Insert, and Suspend, respectively, regardless of whether
	  --rebindkeypad is used. (DLR, found by David Benbennick)
  titlebar()
	- Use PACKAGE_STRING, as defined by autoconf, instead of VERMSG.
	  (DLR)
  edit_redraw()
	- If either current or old_current is offscreen, we're not on
	  the first page, and/or we're not on the same page as before,
	  update old_current before scrolling the edit window.  This
	  fixes a potential display problem when a search moves the
	  cursor offscreen and onto a different page. (DLR, found by
	  Mike Frysinger)
  display_string()
	- Fix minor memory leak. (DLR)
	- Fix memory corruption problems caused by not allocating enough
	  space for converted when a line ends in a tab(s) and we're not
	  in UTF-8 mode. (DLR, found by Duncan Geoffry Doyle, Nick
	  Warne, and Mike Frysinger)
- doc/faq.html:
	- Update the Free Translation Project's address, change the
	  character set to UTF-8, and remove broken links to contributed
	  RedHat nano packages. (DLR)
- doc/nano.1:
	- Better display the default values for quotestr. (DLR)
- doc/nanorc.5:
	- Give the default values for the brackets and punct options,
	  and better display the default values for quotestr. (DLR)
	- Mention that quotes inside string parameters don't need to be
	  escaped with backslashes. (John M. Gabriele, minor tweaks by
	  DLR)
- doc/rnano.1:
	- Remove unneeded comments. (DLR)
- doc/nanorc.sample:
	- Remove unneeded comment. (DLR)
	- Mention that quotes inside string parameters don't need to be
	  escaped with backslashes. (John M. Gabriele, minor tweaks by
	  DLR)
- THANKS:
	- Add new Swedish translator.

GNU nano 1.3.10 - 2005.12.23
- General:
	- Miscellaneous comment fixes. (DLR)
	- More int -> bool conversions. (DLR)
	- Add the ability to scroll up or down single lines without
	  scrolling the cursor, via Meta-- and Meta-+.  Note that this
	  is disabled when NANO_SMALL is defined.  New functions
	  do_scroll_up() and do_scroll_down(); changes to
	  shortcut_init(). (DLR, suggested by Mike Frysinger)
	- Properly handle mouse clicks on the statusbar prompt text.
	  New functions statusbar_xplustabs() and
	  get_statusbar_page_start(); changes to do_statusbar_mouse(),
	  nanoget_repaint(), nanogetstr(), and statusq(). (DLR)
	- Since the statusbar prompt code needs at least 4 columns in
	  order to work properly, make that the minimum number of
	  columns that nano requires in order to run, and remove
	  assertions and code that make use of a smaller number of
	  columns.  Changes to window_init(), nanoget_repaint(),
	  titlebar(), statusbar(), and get_page_start(). (DLR)
	- Move get_page_start(), xplustabs(), actual_x(), strnlenpt(),
	  strlenpt(), check_linenumbers(), dump_buffer(), and
	  dump_buffer_reverse() from winio.c to utils.c, as they're
	  really utility functions. (DLR)
	- Add missing stdio.h #include to text.c and winio.c, and remove
	  unneeded sys/wait.h #include from files.c. (DLR)
	- Move functions specific to the statusbar prompt to their own
	  source file, adjust related variables accordingly, and rename
	  variable resetstatuspos reset_statusbar_x.  New file prompt.c;
	  changes to do_statusbar_input(), do_statusbar_mouse(),
	  do_statusbar_output(), do_statusbar_home(),
	  do_statusbar_end(), do_statusbar_right(), do_statusbar_left(),
	  do_statusbar_backspace(), do_statusbar_delete(),
	  do_statusbar_cut_text(), do_statusbar_next_word(),
	  do_statusbar_prev_word(), do_statusbar_verbatim_input(),
	  statusbar_xplustabs(), get_statusbar_page_start(),
	  nanoget_repaint(), nanogetstr(), statusq(), statusq_abort(),
	  and do_yesno() (all moved to prompt.c). (DLR)
	- Move functions specific to the help browser to their own
	  source file, and adjust related variables accordingly.  New
	  file help.c; changes to help_init(), help_line_len(), and
	  do_help() (all moved to help.c). (DLR)
	- Tweak a few functions to remove the assumption that the file
	  always ends in a magicline.  Changes to cut_line(),
	  do_cut_till_end(), open_buffer(), read_file(), write_file(),
	  do_last_line(), do_para_end(), do_wrap(), backup_lines(),
	  find_paragraph(), do_justify(), do_alt_speller(), and
	  do_wordlinechar_count(). (DLR)
	- Tweak a few functions to rely on fileage and filebot instead
	  of NULL for their checks to detect the top or bottom of the
	  file.  Changes to cut_line(), cut_to_eol(), do_page_up(),
	  do_page_down(), do_para_end(), do_next_word(), do_prev_word(),
	  do_up(), do_down(), do_scroll_down(), do_right(), do_mouse(),
	  do_gotolinecolumn(), do_delete(), begpar(), find_paragraph(),
	  do_wrap(), remove_magicline(), and edit_scroll(). (DLR)
	- Add new -L/--nonewlines command line option, and new
	  "nonewlines" rcfile option, to control whether nano adds
	  magiclines to the ends of files.  Changes to read_file(),
	  write_marked_file(), move_to_filestruct(),
	  copy_from_filestruct(), usage(), do_output(), main(),
	  do_replace_loop(), do_delete(), do_int_spell_fix(),
	  do_alt_speller(), nano.1, nanorc.5, nano.texi, and
	  nanorc.sample. (DLR, suggested by Jaime
	  <re2823@Safe-mail.net>)
	- Move functions specific to the file browser to their own
	  source file, and adjust related variables accordingly.  New
	  file browser.c; changes to striponedir(), browser_init(),
	  do_browser(), and do_browse_from() (all moved to browser.c).
	  (DLR)
	- Add the statusbar prompt's equivalent of placewewant,
	  statusbar_pww, to prompt.c, and convert its functions to use
	  it.  New functions reset_statusbar_cursor() and
	  need_statusbar_horizontal_update(); changes to
	  do_statusbar_mouse(), do_statusbar_output(),
	  do_statusbar_home(), do_statusbar_end(), do_statusbar_right(),
	  do_statusbar_left(), do_statusbar_delete(),
	  do_statusbar_cut_text(), do_statusbar_next_word(),
	  do_statusbar_prev_word(), do_statusbar_verbatim_input(),
	  nanoget_repaint() (renamed update_statusbar_line()),
	  nanogetstr() (renamed get_prompt_string()), statusq() (renamed
	  do_prompt()), statusq_abort() (renamed do_prompt_abort()), and
	  do_yesno() (renamed do_yesno_prompt()). (DLR)
	- Initialize the static pid_t pid in text.c to -1. (DLR)
	- Fix copyright years on source files.  All functions in
	  browser.c were originally added in 2001; the oldest function
	  in color.c is do_colorinit() (now color_init()), which was
	  originally added in 2001; the oldest function in chars.c is
	  revstrstr(), which was originally added in 2001; the oldest
	  function in help.c is do_help(), which was originally added in
	  2000; the oldest function in prompt.c is statusq() (now
	  do_prompt()), which was originally added before 0.6.6, which
	  was apparently in 1999; all functions in rcfile.c were
	  originally added in 2001; one of the oldest functions in
	  search.c is do_search(), which was originally added in 0.2.7,
	  which was apparently in 1999; and one of the oldest functions
	  in text.c is do_wrap(), which was originally added in 0.3.1,
	  which was apparently in 1999. (DLR)
	- For functions originally adapted from other sources, add
	  notices from the original files, as we do with the tab
	  completion functions adapted from busybox, updating the Free
	  Software Foundation's address as needed.  Also, invoke LGPL
	  clause 3 to convert the LGPLed ngetdelim() and ngetline()
	  functions to use the GPL instead.  This is done so that we
	  don't have to include a copy of the LGPL, and because the
	  changes made to integrate these functions with nano make them
	  dependent on nano's GPLed functions and hence useless
	  elsewhere. (DLR)
	- Don't install the localized versions of the manpages if
	  nano is built with --disable-nls.  Changes to Makefile.am and
	  doc/man/Makefile.am. (Mike Frysinger)
	- Rename the NANO_SMALL #define to NANO_TINY. (DLR)
	- Overhaul the bracket searching code so that it no longer
	  requires regex support to work.  New functions revstrpbrk()
	  and find_bracket_match(); changes to shortcut_init() and
	  do_find_bracket(). (DLR)
	- Add the ability to do bracket searches at the statusbar
	  prompt.  New functions find_statusbar_bracket_match() and
	  do_statusbar_find_bracket(); changes to do_statusbar_input().
	  (DLR)
	- Beep whenever we can't read a file or directory and have to
	  indicate it on the statusbar, as Pico does.  Changes to
	  do_browser(), open_file(), and write_file(). (DLR)
	- Adjust copyright notices in all source files to account for
	  Chris' reassigning the 2005-2006 copyright on nano to me.
	  Changes to do_credits(). (DLR)
	- Readd RETSIGTYPE return types for signal handlers, since any
	  problems with its being defined as the wrong type aren't
	  nano's fault.  Changes to handle_hupterm(), do_suspend(),
	  do_continue(), handle_sigwinch(), and cancel_command(). (DLR)
	- Since proto.h includes nano.h, and nano.h includes config.h
	  first, include proto.h first and remove redundant includes of
	  config.h in all non-header source files. (DLR)
	- Refer to the Enter key instead of the Return key for
	  consistency.  Changes to load_history() and rcfile_error().
	  (DLR)
- browser.c:
  do_browser()
	- When setting the width of each file, use the "?" operator
	  instead of an if/else clause. (DLR)
- chars.c:
  mbwidth()
	- If wcwidth() returns -1 for the character passed in, treat the
	  character as having the width of Unicode U+FFFD (Replacement
	  Character) instead of having a width of zero, since display
	  problems can crop up with the latter approach. (DLR)
  mbstrchr()
	- Detect the case where the character isn't found in the string
	  more accurately. (DLR)
- cut.c:
  cut_line()
	- Since placewewant will always be zero after the line is cut,
	  set it to zero directly instead of assigning it the value of
	  xplustabs(). (DLR)
- files.c:
  read_file()
	- Remove apparently unneeded logic to handle a case where
	  current is NULL, since it shouldn't be NULL there. (DLR)
  get_next_filename()
	- Store the value of digits(ULONG_MAX) in a static, since it
	  doesn't change and hence doesn't need to be recalculated.
	  (DLR)
- global.c:
  shortcut_init()
	- Change the description of the Meta-] shortcut to "Find
	  matching bracket", as it's clearer. (DLR)
- nano.c:
  version()
	- If DISABLE_WRAPPING is defined, the code in DISABLE_ROOTWRAP
	  #ifdefs isn't included, so don't display
	  "--disable-wrapping-as-root" in that case. (DLR)
  do_cont()
	- Rename to do_continue(), and rename parameter s to signal, for
	  consistency. (DLR)
  do_verbatim_input()
	- Move to text.c, since it's an advanced text-based operation.
	  (DLR)
- nano.h:
	- Readd MIN_EDITOR_COLS #define, set to 4. (DLR)
- proto.h:
	- Remove now-unused externs for currslen, shortcut_list,
	  fileinfo, syntaxfile_regexp, and synfilematches. (DLR)
- prompt.c:
  do_statusbar_input()
	- Fix misplaced break when handling NANO_VERBATIM_KEY. (DLR)
  reset_statusbar_cursor()
	- Fix cursor placement problem by modeling the code more closely
	  after reset_cursor(). (DLR)
  get_prompt_string()
	- Adjust #ifdefs to leave out disabled keys entirely instead of
	  keeping enough code to just ignore them. (DLR)
- rcfile.c:
  do_rcfile()
	- Remove unneeded assert. (DLR)
- search.c:
  search_abort()
	- Rename to search_replace_abort(). (DLR)
  findnextstr()
	- Remove parameter can_display_wrap, as it's always set to TRUE
	  now, and rename parameter wholeword to whole_word, for
	  consistency. (DLR)
	- Only include the whole_word parameter when DISABLE_SPELLER
	  isn't defined, as it's only used then. (DLR)
  replace_abort()
	- Replace with search_replace_abort(), since it does the same
	  things that this function does. (DLR)
  do_replace_loop()
	- Change order of parameters to more closely match those of
	  findnextstr(), and rename parameter wholewords to whole_word,
	  for consistency. (DLR)
	- Only include the whole_word parameter when DISABLE_SPELLER
	  isn't defined, as it's only used then. (DLR)
- text.c:
  execute_command()
	- Instead of hardcoding /bin/sh as the shell to use when
	  executing a command, use $SHELL, and only fall back to /bin/sh
	  if $SHELL isn't set. (DLR)
  do_wrap()
	- Rename variable wrapping to prepending, to avoid confusion,
	  and rename the static bool same_line_wrap to prepend_wrap to
	  match. (DLR)
	- Properly add a new magicline when needed if, in the process of
	  wrapping, we prepend text to the last line of the file. (DLR)
  break_line()
	- Only include the newline parameter if DISABLE_HELP isn't
	  defined, as it's only used then. (DLR)
	- In the surrounding #ifdef, replace the combination of
	  !DISABLE_JUSTIFY and !DISABLE_WRAPPING with
	  !DISABLE_WRAPJUSTIFY, for consistency. (DLR)
  begpar()
	- Return FALSE if foo is NULL, as inpar() does. (DLR)
  backup_lines()
	- Return void instead of a pointer to the copy of the first
	  line, since current will point to the same location after the
	  text is copied and so can be used instead of the old return
	  value. (DLR)
	- Remove unused quote_len parameter. (DLR)
  do_justify()
	- Don't save current_y and restore it if the user unjustifies,
	  as the reset_cursor() called by edit_refresh() after restoring
	  edittop and current will ensure that current_y is restored to
	  its original value. (DLR)
	- Renumber after justifying each individual paragraph, since
	  find_paragraph() needs the line numbers to be right as well as
	  edit_refresh().  This fixes a potential segfault when doing
	  full justify with auto-indent turned on. (DLR)
  do_alt_speller()
	- Move the code that replaces the text of the current file with
	  the text of the spell-checked file into its own function,
	  replace_buffer(). (DLR)
- utils.c:
  parse_line_column()
	- Simplify parsing of the column number. (DLR)
  ngetdelim()
	- Do sanity checks in an assert instead of checking them
	  manually and returning -1 if they fail. (DLR)
  is_whole_word()
	- Only include when DISABLE_SPELLER isn't defined, as it's only
	  used then. (DLR)
  get_page_start()
	- Fix test so that we scroll through the line in 8-character
	  chunks when COLS is greater than 8, not when COLS is greater
	  than 9. (DLR)
  remove_magicline()
	- Add assert. (DLR)
- winio.c:
  nanoget_repaint()
	- Rename parameter inputbuf to buf, for consistency. (DLR)
  reset_cursor()
	- Rename variable x to xpt, to avoid confusion. (DLR)
  update_line()
	- Remove now-unneeded logic that set the index parameter to zero
	  if the fileptr parameter didn't point to current. (DLR)
  edit_add()
	- Rename to edit_draw(), and rename parameter yval to line.
	  (DLR)
  do_cursorpos()
	- Remove unneeded assert. (DLR)
  do_yesno()
	- Make mouse clicks on the Yes/No/All shortcuts work properly
	  when the MORE_SPACE flag is set. (DLR)
- configure.ac:
	- Clarify description of --disable-speller. (DLR)
	- Disable wrapping entirely when --enable-tiny is used, as it
	  matches the FAQ, it makes nano even smaller, and it eliminates
	  the need for --disable-wrapping-as-root in that case (in which
	  it's impossible to turn wrapping back on without nanorc
	  support). (DLR)
- README.CVS:
	- Mention that the minimum required version of texinfo is 4.0,
	  since that's the first version that supports generating HTML.
	  (DLR)
	- Mention that the minimum required version of groff is 1.12,
	  since that's the first version that supports generating HTML.
	  (DLR)
	- Update the given cvs commands so that they work again. (DLR)
- doc/faq.html:
	- Add a new section 5.3 to explain the status of nano's Unicode
	  support. (Mike Frysinger, minor tweaks by DLR)
	- Clarify section 5.3 to better explain how to enable Unicode
	  support, and remove the mention of quirks, since they turned
	  out to not be a nano problem. (Mike Frysinger and DLR)
- doc/nano.1:
	- Make one non-bold instance of "nano" bold, for consistency.
	  (DLR)
- doc/man/fr/nano.1, doc/man/fr/nanorc.5:
	- Updated manpage translations by Jean-Philippe Guérard.
- doc/rnano.1:
	- Add rnano.1 manpage from Thijs Kinkhorst. (Jordi)  DLR: Merge
	  a few minor updates from nano.1.
- doc/nano.texi:
	- Fix inconsistent wording and punctuation. (DLR)
	- Add missing configure options. (Mike Frysinger, minor tweaks
	  by DLR)
	- Sort the configure options more consistently, and add missing
	  --disable-utf8 option. (DLR)
	- Move --disable-wrapping above --enable-tiny, as the latter now
	  turns it on. (DLR)
- doc/nanorc.sample:
	- Tweak the "c-file" regex for characters to properly accept
	  '\"' and reject '"' and '''. (DLR)
- doc/texinfo/Makefile.am:
	- Automatically generate an HTML version of the info page,
	  nano.html. (DLR)
- src/Makefile.am:
	- Add browser.c, help.c, and prompt.c to nano_SOURCES. (DLR)

GNU nano 1.3.9 - 2005.10.23
- General:
	- Miscellaneous comment fixes. (DLR)
	- More int -> bool conversions. (DLR)
	- Fix a few last instances of the current line number's being
	  saved as an int instead of a ssize_t.  Changes to
	  renumber_all(), renumber(), do_alt_speller(), and
	  backup_lines(). (DLR)
	- Reorder some functions for consistency. (DLR)
	- Rename variable open_files openfile, for consistency. (DLR)
	- Remove renumber()'s dependency on the main filestruct.
	  Changes to renumber(); removal of renumber_all(). (DLR)
	- Restructure things so that every file has its own
	  openfilestruct, and so that the values in it are used directly
	  instead of being periodically synced up with the globals.
	  Accordingly, remove the globals.  Changes to pretty much
	  every function.  Rename add_open_file() make_new_buffer(),
	  rename load_buffer() open_buffer(), rename load_open_file()
	  display_buffer(), rename open_prevnext_file()
	  switch_to_prevnext_buffer(), rename open_prevfile_void()
	  switch_to_prev_buffer(), rename open_nextfile_void()
	  switch_to_next_buffer(), rename write_marked()
	  write_marked_file(), remove load_file(), rename cancel_fork()
	  cancel_command(), rename open_pipe() execute_command(), remove
	  execute_command(), rename resize_variables(), rename
	  global_init() window_size_init(), rename get_buffer()
	  get_key_buffer(), and rename get_buffer_len()
	  get_key_buffer_len(). (DLR)
	- Replace all mvwaddstr(hblank) calls with a new function that
	  does the same thing without the need for hblank.  New function
	  blank_line(); changes to do_browser(), blank_titlebar(),
	  blank_topbar(), blank_edit(), blank_statusbar(),
	  blank_bottombars(), update_line(), and edit_refresh(). (DLR)
	- Make the static pid variable used by execute_command() and
	  cancel_command() a pid_t instead of an int, for consistency.
	  (DLR)
	- Consistently make the flags global and any variables used to
	  hold it longs. (DLR)
	- Make edit_scroll() sophisticated enough to keep track of
	  current and current_x, update the lines before and after the
	  scrolled region, and properly scroll more than editwinrows
	  lines; and change the movement functions that use
	  edit_scroll() to (a) set current and current_x before calling
	  it, and (b) no longer call edit_redraw() afterward, as it's
	  now unnecessary.  These changes eliminate redundant screen
	  updates when the mark is on, since the mark display depends on
	  current and current_x.  Also change edit_redraw() to use
	  edit_scroll() instead of edit_refresh() when one of its two
	  reference lines is offscreen.  Changes to edit_scroll(),
	  do_page_up(), do_page_down(), do_up(), and do_down(). (DLR)
	- Consistently make the fg and bg colortype struct entries and
	  any variables used to hold them shorts.  Changes to
	  do_colorinit() (renamed color_init()), color_to_int() (renamed
	  color_to_short()), and parse_colors(). (DLR)
	- Change color handling to save only the extension and color
	  regex strings constantly,  and to actually compile them on an
	  as-needed basis.  Also, make a color syntax specified on the
	  command line override the syntax associated with the current
	  file extension, add a "default" syntax that takes no
	  extensions for those files that don't match any other
	  syntax's extensions, and add a "none" syntax that's the same
	  as having no syntax at all.  Changes to update_color(),
	  thanks_for_all_the_fish(), nregcomp(), parse_syntax(), and
	  parse_colors(). (Brand Huntsman and DLR)
	- Various other color fixes.  Handle unspecified foreground
	  colors properly, treat syntax names case sensitively, flag
	  duplicate syntax names as errors, don't automatically
	  reinitialize the displayed colors every time we update the
	  current buffer's colors (since the buffer may not be displayed
	  immediately), don't bother doing complete refreshes of the
	  screen when color support is enabled if there's no regex
	  associated with the current file, and rename variable
	  exttype->val to exttype->ext, for consistency.  Changes to
	  do_colorinit() (renamed color_init()), update_color() (renamed
	  color_update()), write_file(), do_input(), do_output(), and
	  parse_syntax(). (DLR)
	- Simplify get_totals() to only get the total number of
	  characters, and eliminate dependence on its old ability to get
	  the total number of lines by renumber()ing when necessary and
	  using the number of the last line of a filestruct.  Changes to
	  read_file(), move_to_filestruct(), copy_from_filestruct(),
	  do_justify(), get_totals() (renamed get_totsize()), and
	  do_cursorpos(). (DLR)
	- Change the NANO_WIDE #define to ENABLE_UTF8, as the latter is
	  clearer. (DLR)
	- Minor history code fixes: Make sure that the current position
	  in the history list is properly set to the bottom if we cancel
	  out of the prompt, and that magichistory is properly updated
	  when we change it and then move up.  New function
	  history_reset(); changes to nanogetstr(). (DLR)
	- Various character-handling cleanups.  If we get an invalid
	  multibyte sequence, treat it as Unicode FFFD (Replacement
	  Character), unless we're searching for a match to it.  Also,
	  remove unneeded variables and checks when parsing multibyte
	  sequences.  Changes to is_alnum_mbchar(), is_blank_mbchar(),
	  is_cntrl_mbchar(), is_punct_mbchar(), control_mbrep(),
	  mbwidth(), make_mbchar(), parse_mbchar(), mbstrncasecmp(),
	  mbstrcasestr(), mbrevstrcasestr(), mbstrchr(), and
	  display_string(). (DLR)
	- Move advanced text operations (command execution in a buffer,
	  wrapping, spell checking, justifying, and word counting) to
	  their own source file, and adjust related variables
	  accordingly.  New file text.c; changes to cancel_command(),
	  execute_command(), do_backspace(), do_delete(), do_tab(),
	  do_enter(), do_mark(), wrap_reset(), do_wrap(),
	  do_int_spell_fix(), do_int_speller(), do_alt_speller(),
	  do_spell(), break_line(), indent_length(), justify_format(),
	  quote_length(), quotes_match(), indents_match(), begpar(),
	  inpar(), backup_lines(), find_paragraph(), do_justify(),
	  do_justify_void(), do_full_justify(), and do_word_count() (all
	  moved to text.c). (DLR)
	- Since the total number of lines in a file is the same as the
	  number of its last line when all its lines are numbered
	  properly, use that in place of openfile->totlines, and
	  eliminate references to openfile->totlines.  Changes to
	  initialize_buffer_text(), read_file(), move_to_filestruct(),
	  copy_from_filestruct(), do_delete(), do_enter(), do_wrap(),
	  do_justify(), do_alt_speller(), do_wordlinechar_count(),
	  new_magicline(), remove_magicline(), and do_cursorpos(). (DLR)
	- Various fill-related cleanups.  Move check_die_too_small() and
	  window_size_init()'s code into window_init(), as they really
	  belong there, remove associated separate calls to them, make
	  sure window_init() is always called at the same time when
	  redrawing the screen, and turn the keypad on in topwin in case
	  we ever read input from it.  Changes to window_init(), main(),
	  and do_alt_speller(); removal of check_die_too_small() and
	  window_size_init(). (DLR)
	- Remove still more redundant screen updates.  Change all
	  wrefresh() calls to wnoutrefresh() calls, except for those in
	  total_update() and do_credits(); call doupdate() just before
	  using blocking input, since nano spends the most time using
	  it, for blocking input; and only do constant cursor position
	  display if we're just about to use blocking input.  Changes to
	  input_tab(), do_browser(), do_output(), main(),
	  get_key_buffer(), check_statusblank(), nanogetstr(),
	  titlebar(), statusbar(), bottombars(), edit_refresh(),
	  do_yesno(), and do_help(). (DLR)
	- Treat the Unicode characters D800-DFFF, FDD0-FDEF, and
	  xxFFFE-xxFFFF,  as invalid, since the C library's multibyte
	  functions don't seem to.  New function is_valid_unicode();
	  changes to mbrep() and make_mbchar(). (DLR)
	- Store Unicode values in longs instead of ints, and cover the
	  entire range of Unicode.  Changes to make_mbchar(),
	  is_valid_unicode(), parse_kbinput(), get_unicode_kbinput(),
	  parse_verbatim_kbinput(), and faq.html. (DLR)
	- Readd the option to turn the keypad off by default from nano
	  1.2.x, but rename the long option from --keypad to
	  --rebindkeypad, clarify its description on the command line,
	  and add an updated FAQ entry about its use.  Changes to
	  window_init(), usage(), main(), get_verbatim_kbinput(),
	  nanorc.sample, nano.1, nanorc.5, nano.texi, and faq.html.
	  (DLR)
	- Add new -W/--wordbounds command line option, and new
	  "wordbounds" rcfile option, to control whether
	  the word movement functions treat punctuation characters as
	  part of a word.  Changes to do_next_word_void(),
	  do_prev_word_void(), usage(), main(), nano.1, nanorc.5,
	  nano.texi, and nanorc.sample. (DLR, suggested by Mike
	  Frysinger)
	- Update email address.  Changes to faq.html and AUTHORS. (DLR)
	- Remove do_(left|right)()'s ability to optionally not update
	  the current line, as this was only used in do_backspace(), and
	  it didn't always update the screen properly.  Changes to
	  shortcut_init(), do_left(), do_right(), and do_backspace();
	  removal of do_left_void() and do_right_void(). (DLR; problem
	  found by Mike Frysinger)
- color.c:
	- Remove unneeded fcntl.h include. (DLR)
- chars.c:
  control_rep(), control_mbrep()
	- Assert that the multibyte character passed in is a control
	  character if it's valid. (DLR)
	- If crep is an invalid multibyte sequence, copy Unicode 0xFFFD
	  (Replacement Character) into it using strncpy() instead of
	  assigning the former to it.  This avoids segfaults when freeing
	  crep later, since it's supposed to be dynamically allocated.
	  (DLR)
  mbrep()
	- New function, the equivalent of control_mbrep() for non-control
	  characters. (DLR)
  parse_mbchar()
	- Remove now-unneeded bad_chr parameter. (DLR)
  mbstrchr()
	- Don't count matches between valid and invalid multibyte
	  sequences anymore, for consistency. (DLR)
- files.c:
  open_file()
	- Assert that filename isn't NULL, and don't do anything special
	  if it's blank, as the the former case shouldn't occur, and the
	  latter case is now handled elsewhere. (DLR)
  write_file(), write_marked_file(), do_writeout()
	- Make append an append_type enum instead of an int. (DLR)
  input_tab()
	- Make columns an int instead of a size_t, since it's limited by
	  COLS. (DLR)
- global.c:
  shortcut_init()
	- Simplify wording of nano_gotoline_msg. (Jordi and Ken Tyler)
	- Clarify wording of nano_wordcount_msg, as it will only go
	  through the marked portions of the file if the mark is on.
	  (DLR)
- move.c:
  do_first_line(), do_last_line()
	- Simplify by only using edit_redraw(), and also make them call
	  check_statusblank(). (DLR)
  do_page_up(), do_page_down()
	- If there's less than a page of text onscreen, just call
	  do_(first|last)_line(). (DLR)
  do_para_begin(), do_para_begin_void(), do_para_end(),
  do_para_end_void(), do_next_word(), do_next_word_void(),
  do_prev_word(), do_prev_word_void()
	- Move here from nano.c, as they're movement functions, and also
	  make them call check_statusblank().
- nano.c:
  move_to_filestruct()
	- Fix problem where edittop wouldn't be reset properly if it was
	  inside the text moved to another filestruct. (DLR)
  copy_from_filestruct()
	- Miscellaneous cleanups. (DLR)
  usage()
	- Properly mention the support for "[+LINE,COLUMN]" on the
	  command line when HAVE_GETOPT_LONG isn't defined. (DLR)
	- Remove unneeded translation of "--quickblank". (DLR)
  do_verbatim_input()
	- If constant cursor position display is on, make sure the
	  cursor position is displayed properly when we finish. (DLR)
  do_next_word()
	- Rework to be more like do_prev_word(), to avoid a potential
	  problem if we start at the end of a line. (DLR)
  do_mouse()
	- Avoid redundant screen updates by using edit_redraw() instead
	  of edit_refresh(), and remove now-erroneous code that disables
	  setting the mark while in view mode. (DLR)
  do_output()
	- When adding a character, just add its length in bytes to
	  current_x instead of calling do_right(), and set placewewant
	  afterward. (DLR)
  do_alt_speller()
	- If we can't invoke the spell checker, use sprintf() instead of
	  snprintf() to write the error string we return, as the one
	  formatted value is a simple string, and so altspell_error will
	  always be long enough to hold it.  Also remove unnecessary
	  initialization of altspell_error, refactor so that msglen is
	  no longer needed, and make the error message more similar to
	  what the internal spell checker returns under the same
	  circumstances. (DLR)
	- Block any pending SIGWINCHes while the alternate spell checker
	  is running, so that it can handle them, and unblock them once
	  it's finished and we've loaded the spell-checked file back in.
	  (DLR)
	- Use doupdate() to reenter curses mode instead of refresh().
	  (DLR)
  do_spell()
	- When displaying an error message from do_(int|alt)_speller(),
	  don't display the error message corresponding to errno if
	  errno is zero. (David Benbennick)
  do_justify()
	- If constant cursor position display is on, make sure the
	  cursor position is displayed properly when we finish. (DLR)
  handle_sigwinch()
	- Use doupdate() to reenter curses mode instead of refresh().
	  (DLR)
  allow_pending_sigwinch()
	- Simplify by using the "?" operator instead of an if clause.
	  (DLR)
  main()
	- When opening files with "+LINE,COLUMN" arguments on the
	  command line, don't update the screen when moving to their
	  specified lines and columns. (DLR)
	- Rename variable fill_flag_used to fill_used, for consistency.
	  (DLR)
- nano.h:
	- Since we only use vsnprintf() now, remove the #ifdef block for
	  HAVE_SNPRINTF. (DLR)
	- Remove TOP from the topmidnone enum, and rename the latter
	  centernone. (DLR)
	- Move stdlib.h, dirent.h, regex.h, and assert.h includes here,
	  as every source file needs them. (DLR)
	- Rename the updown enum scroll_dir and the centernone enum
	  update_type for clarity, and add an append_type enum. (DLR)
	- If we don't have regex.h and hence regex support, disable
	  color support, as it depends on the use of regexes. (DLR)
- rcfile.c:
  nregcomp()
	- Return TRUE when the compilation succeeds and FALSE otherwise,
	  instead of the other way around. (DLR)
- search.c:
  search_init()
	- Don't blank out last_replace anymore when we get a new string,
	  as it'll be blanked out in do_replace().  Also, consolidate
	  the cases for blank and new search strings, as they now differ
	  only in which string they pass to regexp_init(). (DLR)
  is_whole_word()
	- Move to utils.c, as it's really a utility function in the same
	  vein as regexp_bol_or_eol(). (DLR)
  replace_abort()
	- Remove unnecessary update of placewewant. (DLR)
  do_replace()
	- Blank out last_replace properly again just before displaying
	  the "Replace" prompt. (DLR, found by Mike Frysinger)
	- Remove unnecessary renumber(). (DLR)
  do_gotolinecolumn()
	- Add parameter allow_update to control whether the screen is
	  updated after moving.  If it's TRUE, call edit_refresh() after
	  edit_update(). (DLR)
  do_gotopos()
	- Only include this function when DISABLE_SPELLER isn't defined,
	  as the alternate spell checking code is now the only place
	  where it's used. (DLR)
  do_find_bracket()
	- Add comments and minor cleanups. (DLR)
  find_history()
	- Make parameters const where possible. (DLR)
  update_history()
	- Don't renumber the history list starting after the entry we
	  found if the entry we found is at the bottom of the list.
	  (DLR, found by Simon Strandman)
  get_history_completion()
	- Make parameters const where possible. (DLR)
- text.c:
  do_tab()
	- Make sure that we insert the correct number of spaces if the
	  TABS_TO_SPACES flag is set and placewewant is greater than the
	  current column position of the cursor. (DLR)
  do_enter()
	- Don't update the edit window until we set placewewant. (DLR)
  break_line()
	- Fix a problem where a line could be broken in the middle of a
	  multibyte character. (DLR)
  do_word_count()
	- Rename to do_wordlinechar_count(), and expand to also count
	  the number of lines and characters in the file or selection,
	  as wc does. (DLR)
- winio.c:
  get_key_buffer()
	- Only save all open buffers and hang up when a blocking
	  wgetch() returns ERR and errno is set to EIO (input/output
	  error).  If errno is set to something else, recover properly.
	  This fixes problems with nano's erroneously hanging up while
	  e.g. resizing or unsuspending in a chroot. (DLR, found by Mike
	  Frysinger)
  get_escape_seq_kbinput()
	- Fix typo preventing the VT100/VT220/VT320/xterm/rxvt escape
	  sequence for ',' on the numeric keypad with NumLock off from
	  being interpreted properly. (DLR)
  get_word_kbinput()
	- Multiply the entered digits by hexadecimal numbers instead of
	  decimal numbers for clarity, rename to get_unicode_kbinput(),
	  and rename variables word and word_digits to uni and
	  uni_digits. (DLR)
  parse_verbatim_kbinput()
	- Rename variables word_mb and word_mb_len to uni_mb and
	  uni_mb_len. (DLR)
  display_string()
	- Instead of using parse_mbchar()'s bad_chr parameter, use
	  mbrep() to get the representation of a bad character. (DLR)
	- If column is less than start_col and the character's a tab,
	  which can be possible if there are enough tabs and the
	  terminal size is sufficiently large, don't try to display it
	  using control_mbrep(). (DLR, found by Duncan Geoffry Doyle)
	- Really avoid a memory corruption problem by allocating enough
	  space for COLS characters. (DLR)
  edit_redraw(), edit_refresh()
	- Clean up and simplify. (DLR)
  edit_update()
	- Since we no longer use TOP, remove references to it.  Also,
	  don't call edit_refresh() anymore; it will call us. (DLR)
  do_statusbar_next_word()
	- Rework to be more like do_statusbar_prev_word(), to avoid a
	  potential problem if we start at the end of a line. (DLR)
  do_statusbar_input()
	- Call do_statusbar_mouse() instead of do_mouse(). (DLR)
  do_statusbar_output()
	- When adding a character, just add its length in bytes to
	  statusbar_x instead of calling do_statusbar_right(). (DLR)
  titlebar()
	- Rework to display only one space after the version number, so
	  that there's more room for other things, and to not display
	  the status when we're in the file browser, since Pico doesn't.
	  (DLR)
  do_credits()
	- Various cleanups.  Turn on the MORE_SPACE and NO_HELP flags
	  before showing the credits, so that they use as much of the
	  screen as possible, and set the flags back to their original
	  values afterward.  Also, call wscrl(1) instead of scroll(),
	  only call scrollok() just before and after we scroll, and
	  tweak where screen updates occur so that messages are properly
	  displayed when they first scroll onto the bottom line of the
	  screen. (DLR)
	- Add Mike Frysinger to credits. (DLR)
- configure.ac:
	- Since we only use vsnprintf() now, remove the tests for
	  snprintf(). (DLR)
	- Change the description of "sufficient wide character support"
	  to "sufficient UTF-8 support", as the latter is clearer. (DLR)
	- Update the description of the ENABLE_COLOR option to mention
	  the need for regex.h. (DLR)
- doc/faq.html:
	- Update section 4.10 to mention that pasting from the X
	  clipboard via the middle mouse button also works when the
	  Shift key is used. (DLR)
- doc/nanorc.sample:
	- Add regexes for Bourne shell scripts. (Mike Frysinger, minor
	  tweaks by DLR)
	- Explain how the "none" and "default" syntaxes work. (DLR)
	- Tweaks and additions to the "c-file" regexes: handle #defined
	  constants more accurately and use a brighter color for them,
	  support C99 standard integer types, support more GCC builtins,
	  and color code flow control statements differently. (Mike
	  Frysinger)  DLR: Slightly simplify the integer types regex.
	- Tweak one "TeX" regex to use the "icolor" directive. (DLR)
- doc/man/nanorc.5:
	- Explain how the "none" and "default" syntaxes work. (DLR)
- doc/man/fr/nano.1, doc/man/fr/nanorc.5:
	- Updated translation by Jean-Philippe Guérard.
- src/Makefile.am:
	- Add text.c to nano_SOURCES. (DLR)
- AUTHORS:
	- Add Mike Frysinger. (DLR)
- README.CVS:
	- Since we only use vsnprintf() now, remove the mention of
	  snprintf(). (DLR)
- THANKS:
	- Add Bulgarian and Dutch translators.

GNU nano 1.3.8 - 2005.06.30
- General:
	- Miscellaneous comment fixes. (DLR)
	- Various #include fixes.  Since proto.h includes nano.h, only
	  include the former in source files.  Also add an #include
	  guard to proto.h, and make the config.h #include in nano.h
	  match the config.h #includes everywhere else. (DLR)
	- Change all hardcoded instances of 128 bytes to MAX_BUF_SIZE,
	  and #define MAX_BUF_SIZE as 128 in nano.h. (DLR)
	- Display the key to go to the previous strings in the
	  search/replace history as "^P" instead of "Up".  This makes
	  mouse clicks work properly on it.  Changes to shortcut_init(),
	  help_init(), nanogetstr(), and do_statusbar_input(). (DLR)
	- Update the Free Software Foundation's mailing address in
	  various comments. (DLR)
	- Add the ability to open a file on a specified column as well
	  as a specified line, by allowing an argument of the form
	  +LINE,COLUMN.  New function parse_line_column(); changes to
	  shortcut_init(), main(), do_gotoline() (renamed
	  do_gotolinecolumn()), do_gotoline_void() (renamed
	  do_gotolinecolumn_void()), nano.1, and nano.texi. (DLR,
	  suggested by PFTank)
	- Overhaul the history code to work more consistently, and clean
	  up various parts of it.  New function history_has_changed();
	  changes to load_history(), writehist(),
	  thanks_for_all_the_fish(), history_init(), find_node()
	  (renamed find_history()), update_history(),
	  get_history_older(), get_history_newer(),
	  get_history_completion(), do_search(), do_replace(),
	  nanogetstr(), and statusq(); removal of remove_node() and
	  insert_node(). (DLR)
	- Remove all instances of charcpy() and replace them with
	  strncpy(), since there's no way to be sure that a charcpy()ed
	  string will always be properly null-terminated, and strcpy()'s
	  null termination is the only difference between it and
	  charcpy(). (DLR)
	- When using a backup directory, make sure all the filenames
	  written are unique by using get_next_filename() when
	  necessary.  Changes to get_next_filename(), write_file(),
	  die(), usage(), nano.1, nanorc.5, nanorc.sample, and
	  nano.texi. (DLR, suggested by James Collings)
	- Rework the file-writing routines so that they can work
	  properly with already-opened files, such as the
	  mkstemp()-created files used by the spell-checking code.
	  Changes to safe_tempnam() (renamed safe_tempfile()),
	  write_file(), write_marked(), die(), do_spell(), and
	  do_exit(). (DLR)
	- Remove the -R/--regexp command line option and enable the
	  toggle at the search prompt in tiny mode, as it already
	  allows the prepend and append toggles at the search prompt.
	  For consistency, rename TOGGLE_REGEXP_KEY to NANO_REGEXP_KEY,
	  and move it out of the toggles block to where NANO_PREPEND_KEY
	  and NANO_APPEND_KEY are.  Also, change the short command line
	  option for --restricted from -Z to -R.  Changes to
	  shortcut_init(), usage(), main(), search_init(), nano.1,
	  nano.texi, etc. (DLR)
	- Various cleanups and improvements in chars.c.  Remove some
	  unnecessary w?ctype wrappers and variables; change the wctype
	  wrappers to take wint_t instead of wchar_t to match the
	  functions they wrap; rename some functions for consistency;
	  add functions to detect blank characters in a string, for use
	  in rcfile option parsing; and don't count matches between
	  valid and invalid multibyte sequences anymore, as it causes
	  problems when doing a replace.  New functions
	  is_valid_mbstring(), has_blank_chars(), and
	  has_blank_mbchars(); changes to is_alnum_mbchar(),
	  is_blank_char() (renamed nisblank()), is_blank_mbchar(),
	  is_blank_wchar() (renamed niswblank()), is_cntrl_wchar(),
	  control_rep(), control_mbrep(), make_mbstring() (renamed
	  make_valid_mbstring()), mbstrncasecmp(), mbstrcasestr(),
	  mbrevstrcasestr(), etc.; removal of is_alnum_char() and
	  is_alnum_wchar(). (DLR)
	- Implement word count via Meta-D at the main window.  Note that
	  this is disabled when NANO_SMALL is defined.  Also, convert
	  all word detection functions to use the same wrapper function
	  for ease of maintenance, and make them return more
	  information.  New functions is_punct_mbchar(),
	  is_word_mbchar(), do_next_word_void(), do_prev_word_void(),
	  and do_word_count(); changes to shortcut_init(),
	  do_next_word(), do_prev_word(), is_whole_word(),
	  do_statusbar_next_word(), and do_statusbar_prev_word(). (DLR)
	- Fix #ifdefs so that nano compiles with NANO_SMALL defined and
	  DISABLE_TABCOMP undefined.  Changes to revstrstr() and
	  free_charptrarray() (renamed free_chararray()). (DLR)
	- Change the wctype wrappers to take wchar_t's again, as they
	  still work the same way with them.  This also fixes
	  compilation on Mac OS X 10.4.1, which doesn't seem to define a
	  wint_t type. (DLR, found by Emily Jackson)
	- Add the ability to convert typed tabs to spaces using
	  the -E/--tabstospaces command line options, the "tabstospaces"
	  rcfile option, and the toggle Meta-Q (since QBasic did this by
	  default :)).  Note that this doesn't affect tabs entered using
	  verbatim input, and that it's disabled when NANO_SMALL is
	  defined.  Also, change the short command line option for
	  --backupdir from -E to -C.  Changes to toggle_init(), usage(),
	  do_tab(), main(), nanorc.sample, nano.1, nanorc.5, and
	  nano.texi. (DLR, suggested by many people)
	- Change the CONSTUPDATE, REVERSE_SEARCH, and SMOOTHSCROLL flags
	  to the CONST_UPDATE, BACKWARDS_SEARCH, and SMOOTH_SCROLL
	  flags, respectively. (DLR)
	- Change the SMOOTHSCROLL flag to the SMOOTH_SCROLL flag. (DLR)
	- Change the NO_UTF8 flag to the USE_UTF8 flag, and reverse its
	  meaning. (DLR)
	- Add rcfile options "casesensitive" and "backwards", to do
	  case sensitive and backwards searches by default.  Changes to
	  nanorc.sample and nanorc.5. (DLR)
	- Since the DISABLE_CURPOS flag is only used in winio.c, reduce
	  it to a static bool there.  Changes to statusbar() and
	  disable_cursorpos(). (DLR)
	- Add -U/--quickblank option and a "quickblank" rcfile option to
	  blank the statusbar after 1 keystroke instead of 25.  Note
	  that this obviously has no effect when constant cursor
	  position display is turned on, and that this is disabled when
	  NANO_SMALL is defined.  Changes to usage(), main(),
	  statusbar(), nanorc.sample, nano.1, and nanorc.5. (DLR,
	  suggested by CHAO Wei-Lun)
	- Add support for case insensitive expression matching when
	  using color syntax highlighting, via the "icolor" directive,
	  and add it to those regexes that can use it.  Changes to
	  parse_colors(), parse_rcfile(), nanorc.sample, and nanorc.5.
	  (Brand Huntsman, minor tweaks by DLR)
	- Add various type changes to avoid problems on systems where
	  int and ssize_t are different sizes.  Make filestruct->lineno
	  a ssize_t (so that we can avoid negative line numbers at the
	  "Go To Line" prompt), current_y a ssize_t (in order to hold
	  the maximum difference between two filestruct->lineno's),
	  totlines a size_t, and change related variables to match.
	  (DLR, initial problem with parse_line_column() found by Mike
	  Frysinger)
	- Rework the credits handling to display Florian König's name
	  properly whether we're in a UTF-8 locale or not, and without
	  requiring a massive function that we only use once.  Changes
	  to do_credits(); removal of make_valid_mbstring(). (DLR)
- chars.c:
  make_mbstring()
	- Change erroneous ENABLE_EXTRA #ifdef to NANO_EXTRA to fix a
	  compilation problem when --enable-nanorc isn't used and
	  --enable-extra is. (DLR)
- color.c:
  update_color()
	- Use mbstrcasecmp() instead of strcasecmp(), so that UTF-8
	  color syntax names are properly detected. (DLR)
- cut.c:
  cut_line()
	- Set placewewant properly after cutting a line, to avoid a
	  problem where the screen won't be updated if (a) we're not on
	  the first page when we cut the line, and (b) immediately after
	  we cut the line, we hit End to move to the end of the line
	  after it. (DLR)
- files.c:
  read_line()
	- Rename variable prev to prevnode to avoid confusion. (DLR)
	- Rename variable len to buf_len, for consistency. (DLR)
  load_open_file()
	- Remove an unneeded clearok(FALSE). (DLR)
  get_next_filename()
	- Use an unsigned long instead of an int for the number
	  prepended to the filename. (DLR)
  do_insertfile()
	- Set i to 0 when we get a filename via the file browser, so
	  that it's read in properly when we exit the file browser.
	  (DLR)
  open_prevnext_file()
	- Move up a misplaced assert. (DLR)
	- Rename variable next to next_file, to avoid confusion. (DLR)
  write_file()
	- Since lineswritten is a size_t, print its value as an unsigned
	  long instead of an unsigned int. (DLR)
	- Declare the size_t i only in the loop where it's used. (DLR)
  diralphasort()
	- Use mbstrcasecmp() instead of strcasecmp(), so that UTF-8
	  filenames are sorted properly. (DLR)
  cwd_tab_completion(), browser_init()
	- Rename variable next to nextdir to avoid confusion. (DLR)
  input_tab()
	- Since list is a bool, set it to FALSE instead of 0. (DLR)
	- Add multibyte/wide character support, so that we don't end up
	  with a string that contains only part of a multibyte
	  character during tab completion. (DLR)
	- Rename variable buflen to buf_len, for consistency. (DLR)
  do_browser()
	- Don't treat NANO_CANCEL_KEY as NANO_EXIT_KEY anymore, for
	  consistency. (DLR)
	- When displaying "(dir)" in the available screen space, make
	  sure that the string it's stored in is always null-terminated.
	  (DLR)
	- Rename variable selectedbackup to old_selected, for
	  consistency. (DLR)
	- Make mouse clicks in the browser window work properly when the
	  MORE_SPACE flag is set. (DLR)
	- Make foo_len a size_t instead of an int. (DLR)
  save_history()
	- Properly save history when we're in view mode. (DLR)
- global.c:
  shortcut_init()
	- Move the "Refresh" and "Exit" shortcuts to the beginning of
	  the help browser shortcut list, for consistency. (DLR)
	- Remove unnecessary "Refresh" placeholder in the file browser
	  shortcut list. (DLR)
	- Allow the mark to be used in view mode, as Pico does. (DLR)
	- Clarify the description of ^X when --enable-multibuffer is
	  used. (DLR)
	- Change the description of the Meta-B toggle at the search
	  prompt from "Direction" to "Backwards", for consistency. (DLR)
  toggle_init()
	- Clarify the descriptions of M-C and M-L. (DLR)
	- Reorder the toggles to put more toggles with similar functions
	  together. (DLR)
  thanks_for_all_the_fish()
	- Remove free_toggles() and move its code here verbatim, as it's
	  only called here anyway. (David Benbennick)
	- Fix the code to free all open file buffers to work properly
	  with the previous overhaul of the multibuffer code instead of
	  going into an infinite loop. (David Benbennick)
	- Add additional checks for variables' not being NULL before we
	  try to free them, to avoid assertion failures. (DLR)
- nano.c:
  die()
	- Rename variable ret to retval for consistency. (DLR)
	- Tweak the message displayed when a backup file can't be
	  written, so as to not duplicate a translated string. (DLR)
	- If the current filestruct's been partitioned, unpartition it
	  before saving the associated file. (DLR)
  resize_variables()
	- Use charset() instead of memset() to initialize hblank. (DLR)
  copy_filestruct()
	- Rename variable prev to copy to avoid confusion. (DLR)
  print1opt_full()
	- If desc should be empty, allow it to be NULL instead of
	  "", since the latter is not necessarily translated as "".
	  (DLR, found by Jordi)
  usage()
	- Add missing N_() around one message, so that it isn't
	  erroneously translated twice. (DLR)
	- Remove inaccurate default listed for -Q/--quotestr. (DLR)
  version()
	- Add --enable-utf8 to the displayed compilation options, put
	  the options in alphabetical order, and handle --enable-tiny
	  the same way as all the other options. (DLR)
  do_tab()
	- Remove unneeded variable kbinput. (DLR)
  do_int_spell_fix()
	- Display highlighted misspelled words using display_string(),
	  as do_replace_loop() does. (DLR)
  do_alt_speller()
	- Replace a set_modified() with SET(MODIFIED) to avoid an
	  unnecessary update, and remove an unneeded clearok(FALSE).
	  (DLR)
	- Move the spell checking error handling block down and refactor
	  it so that we go back into curses mode, reinitialize the
	  terminal, turn the cursor back on, and turn the mark back on
	  if necessary before returning the error message. (DLR)
  do_spell()
	- If the spell-checker printed any error messages onscreen, call
	  total_refresh() to make sure they're cleared off. (DLR, found
	  by CHAO Wei-Lun)
  find_paragraph()
	- Reset placewewant as well as current_x to 0, in order to avoid
	  a potential screen update problem. (DLR)
  do_justify()
	- Save placewewant, and restore it if we unjustify, in order to
	  avoid a potential screen update problem. (DLR)
  do_output()
	- Properly allow wrapping when we insert a tab, for consistency.
	  (DLR)
	- Don't set current_len until after it's been asserted that both
	  current and current->data aren't NULL. (DLR)
  do_toggle()
	- Properly treat color syntax highlighting as enabled by
	  default, and only treat wrapping as enabled by default when
	  DISABLE_WRAPPING isn't defined. (DLR)
  disable_extended_input()
	- Disable extended output processing as well as extended input
	  processing, and rename to disable_extended_io(). (DLR)
  disable_flow_control(), enable_flow_control()
	- Only turn off flow control on output, as it might be needed
	  for input on slow terminals. (DLR)
- nano.h:
	- Add macro charset(), a wrapper that calls memset(). (DLR)
	- Readd #defines for the isblank() and iswblank() equivalents.
	  (DLR)
	- In the colortype struct, make bright a bool instead of an int,
	  for consistency. (DLR)
- proto.h:
	- Add missing NANO_SMALL and HAVE_REGEX_H #ifdefs around the
	  do_find_bracket() prototype. (DLR)
- rcfile.c:
  color_to_int()
	- Since colorname's being NULL is handled elsewhere now, assert
	  that it isn't NULL at the beginning of the function. (DLR)
  parse_colors()
	- Properly parse a background color without a foreground color.
	  (DLR)
	- Properly generate an error if we get a color directive without
	  a regex string. (DLR)
  parse_rcfile()
	- Properly generate an error if we get an invalid multibyte
	  string for an option, instead of working around it. (DLR)
	- Use has_blank_mbchars() to check for blank characters in the
	  "punct" and "brackets" options, and clarify the error message
	  displayed when we find blank characters. (DLR)
- search.c:
  do_gotoline()
	- Properly show an error message if we try to go to line 0,
	  since the first line in the file is 1. (DLR)
	- Start the search for a line from fileage instead of current
	  (again). (DLR)
  replace_regexp()
	- Rename variables create_flag and new_size to create and
	  new_line_size, for consistency. (DLR)
	- Make new_line_size, search_match_count, and i size_t's, for
	  consistency. (DLR)
  replace_line()
	- Make new_line_size and search_match_count size_t's, for
	  consistency. (DLR)
  do_replace_loop()
	- When moving to the next match, update the screen using
	  edit_refresh() instead of edit_redraw(), as the latter won't
	  work properly when we've replaced one or more instances of a
	  string in copy and haven't yet updated current->data to match
	  copy. (DLR)
  do_find_bracket()
	- Miscellaneous cleanups: rename variables for consistency, and
	  save the search direction and regexp setting in two bools
	  instead of one flags variable. (DLR)
- utils.c:
  num_of_digits()
	- Use a size_t instead of an int, and rename to digits(). (DLR)
  align()
	- Rename variable strp to str for consistency. (DLR)
- winio.c:
  do_statusbar_output()
	- Don't set answer_len until after it's been asserted that
	  answer isn't NULL. (DLR)
  display_string()
	- Avoid a memory corruption problem by allocating enough space
	  for len plus a trailing multibyte character and/or tab. (DLR)
	- Don't check for multicolumn characters if the NO_UTF8 flag
	  isn't set. (DLR)
	- Free buf_mb when we're done using it. (DLR)
  nanogetstr()
	- Rename variable def to curranswer to avoid confusion. (DLR)
	- Only declare and use the tabbed variable if DISABLE_TABCOMP
	  isn't defined. (DLR)
	- Refactor to replace unnecessary variable answer_len with
	  curranswer_len, and hence avoid an assertion failure involving
	  the former. (DLR)
  statusq()
	- Rename variable which_history to history_list, for
	  consistency. (DLR)
	- Rename variables def and ret to curranswer and retval to avoid
	  confusion. (DLR)
	- Call wnoutrefresh(bottomwin) after getting an answer and
	  blanking out the statusbar, to make sure that the blanking is
	  done.  This fixes a problem where the statusbar is not
	  properly blanked after using the "Go To Line" prompt with the
	  NO_HELP flag set. (DLR)
  titlebar()
	- Use actual_x() to calculate the number of characters VERMSG
	  takes up, in case it's UTF-8. (DLR)
  do_cursorpos()
	- Properly display the value of totsize as unsigned. (DLR)
	- If constant is TRUE, only display the cursor position when
	  disable_cursorpos is FALSE.  Don't refuse to display it when
	  the cursor position hasn't changed, as that doesn't always
	  keep it properly updated. (DLR, found by Mike Frysinger)
  do_help()
	- Don't treat NANO_CANCEL_KEY as NANO_EXIT_KEY anymore, for
	  consistency. (DLR)
  statusbar()
	- Set statusblank to 25 instead of 26, to match current Pico.
	  (DLR)
  edit_redraw()
	- Make do_refresh a bool instead of an int. (DLR)
  do_yesno()
	- Allow refreshing the screen via Ctrl-L, as Pico does. (DLR)
	- Add a missing assert, and use actual_x() to calculate the
	  number of characters buf takes up, in case it's UTF-8. (DLR)
	- Get input from bottomwin instead of edit, so that the cursor
	  isn't erroneously put in the edit window while we wait for an
	  answer. (DLR)
	- Call wnoutrefresh(edit) to make sure that the edit window is
	  refreshed before we get input, as statusq() does. (DLR)
  total_redraw()
	- Simplify to just call wrefresh() on curscr, which updates the
	  entire screen in one function call without moving the cursor
	  from the window it's currently in. (DLR)
	- When using slang, use SLsmg_touch_screen() and SLsmg_refresh()
	  to update the screen, as slang doesn't define curscr. (DLR)
  do_replace_highlight()
	- Use waddch() instead of waddstr() to display a space when we
	  have a zero-length regex. (DLR)
	- Rename variable highlight_flag to highlight, for consistency.
	  (DLR)
  do_credits()
	- Save the keystroke that breaks us out of the credits (if any)
	  and put it back so that it isn't lost.  This is especially
	  needed if the keystroke is part of a multibyte character.
	  (DLR)
- nano.1:
	- Clarify and consolidate the descriptions of --fill and
	  --tabsize. (DLR)
- nanorc.5:
	- Update the description of how the "color" regex works. (DLR)
	- Clarify descriptions of the characters that aren't allowed
	  in the "punct" or "brackets" options. (DLR)
	- Use .B instead of \fB ... \fP where possible, as nano.1 does.
	  (DLR)
	- Clarify and consolidate the descriptions of "fill" and
	  "tabsize". (DLR)
- nano.texi:
	- Update the "Feature Toggles" section to match current nano.
	  (DLR)
	- Clarify and consolidate the descriptions of --fill and
	  --tabsize. (DLR)
- configure.ac:
	- Minor tweaks to some of the test blocks to avoid XSI:isms.
	  (DLR, adapted from a Debian patch for GNU ed by David
	  Weinehall)
	- Don't refer to the built-in file browser as crappy anymore.
	  (DLR)
	- Check for iswpunct() and mbstowcs(). (DLR)
	- Change the behavior of --enable-extra to only define
	  NANO_EXTRA, instead of defining both it and
	  ENABLE_MULTIBUFFER. (DLR)
	- Check for get_wch() instead of wget_wch() to determine if
	  there's a wide curses library, as it's a more generic
	  function. (DLR)
	- Check for possibly unavailable functions in alphabetical
	  order. (DLR)
- doc/faq.html:
	- Update section 1.1 to mention the current maintainer. (DLR)
	- Minor capitalization and wording fixes. (DLR)
	- Update description of --enable-extra, and add missing line
	  breaks. (DLR)
- doc/nanorc.sample:
	- In the "nanorc" regexes, tweak the "color" regex to properly
	  color a line that specifies a background color without a
	  foreground color, and update the associated comments. (DLR)
	- Clarify descriptions of the characters that aren't allowed
	  in the "punct" or "brackets" options. (DLR)
	- Update comment referring to --enable-extra. (DLR)
	- Add "cxx" and "hxx" to the list of extensions that the
	  "c-file" regexes apply to, and add "warning" and "error" to
	  them as well. (Mike Frysinger)
	- Add regexes for assembler files. (Mike Frysinger)
	- In the preprocessor directives regex string in the "c-file"
	  regexes, cover more whitespace characters than just " " by
	  using "[[:space:]]" instead. (Mike Frysinger)  DLR: Extend
	  this to other regex strings whenever possible.
	- Move some overly long split-up regex strings that cover
	  similar areas onto the same line. (DLR)
	- Add GCC builtins to the "c-file" regexes. (Mike Frysinger)
	- Simplify the file extension regex for groff. (DLR)
	- Clarify and consolidate the descriptions of "fill" and
	  "tabsize". (DLR)
- Makefile.am, m4/Makefile.am:
	- Make sure that the files in EXTRA_DIST are in alphabetical
	  order, and that the lines are wrapped at 72 characters. (DLR)
- doc/man/fr/Makefile.am:
	- Set mandir to @mandir@/fr, so French manpages get installed
	  where they belong. (Jordi)
- THANKS:
	- Add new translators to the credits.

GNU nano 1.3.7 - 2005.04.10
- General:
	- Miscellaneous comment fixes. (DLR)
	- After (re)initializing the terminal, make sure the cursor is
	  always turned on.  Changes to do_alt_speller(),
	  handle_sigwinch(), and main(). (DLR)
	- Make sure that all references to cut-to-end are left out when
	  NANO_SMALL is defined.  Changes to cut_to_eol(),
	  do_cut_text(), and do_statusbar_cut_text(). (DLR)
- chars.c:
  make_mbchar()
	- Remove unneeded assert. (DLR)
  move_mbleft()
	- Fix assert to reference the proper variable, so that nano
	  builds with DEBUG defined again. (Mike Frysinger, found by
	  Dmitri Vassilenko)
- files.c:
  do_insertfile()
	- Fix problem where going into the help browser at the "Insert
	  File" prompt would always result in the current answer's being
	  used as the filename afterward. (DLR)
  get_full_path()
	- Rework handling of the results of getcwd() in order to avoid
	  segfaults if they fail, and to remove uses of the nonportable
	  GNU extension where passing a size of 0 will get a string as
	  long as we need. (DLR)
  do_browser()
	- Rename variable lineno to fileline to avoid confusion. (DLR)
  do_browse_from()
	- Rework handling of the results of getcwd() in order to avoid
	  segfaults if they fail, and to remove uses of the nonportable
	  GNU extension where passing a size of 0 will get a string as
	  long as we need. (DLR)
- nano.c:
  help_init()
	- When calculating allocsize, take multibyte characters into
	  account, and keep the column number limits consistent. (DLR)
	- Break htx up into three chunks, in case the string is too long
	  for the compiler to handle (e.g. an ISO C89 compiler that can
	  only handle up to 509 characters). (DLR)
	- Minor wording fixes. (DLR)
  print1opt()
	- Don't include longflag if HAVE_GETOPT_LONG isn't defined.
	  Rename this function to print1opt_full(), leave out the
	  longflag parameter if HAVE_GETOPT_LONG isn't defined, and make
	  print1opt() a macro for print1opt_full() that does that
	  without the need for a lot of extra #ifdefs. (David
	  Benbennick)  DLR: Rename print1opt_f() to print1opt_full().
	- Rework the special case of options that are ignored for Pico
	  compatibility so that they display more neatly when
	  HAVE_GETOPT_LONG isn't defined. (DLR)
  usage()
	- Fix erroneous #ifdef that resulted in the -d/--rebinddelete
	  option's not being printed when NANO_SMALL was defined. (DLR)
  find_paragraph()
	- Fix problem where a search for the next paragraph would skip
	  over certain cases of one-line paragraphs. (DLR)
  do_justify()
	- Instead of breaking a line at a space and readding the space
	  afterwards, just break the line after the space, as it's more
	  efficient. (DLR)
  main()
	- Change 0 to NULL in the option struct where needed. (David
	  Benbennick)
- nano.h:
	- Define PATH_MAX as 4096 if it isn't defined, as passing a size
	  of 0 to get a string as long as we need is a nonportable GNU
	  extension, and hence it won't work on non-GNU systems that
	  don't define PATH_MAX. (DLR)
- rcfile.c:
  parse_rcfile()
	- Fix debugging message to display the long value of a flag
	  properly. (DLR)
- utils.c:
  regexec_safe()
	- Rename to safe_regexec() for consistency. (DLR)
- winio.c:
  nanogetstr()
	- Fix misplaced break. (DLR)
  statusq()
	- Make sure that the vsnprintf(foo) call and foo's subsequent
	  null termination both take the proper number of bytes when
	  using multibyte characters, so that multibyte prompt strings
	  aren't prematurely cut off. (DLR)
  titlebar()
	- Make sure that the (mv)?waddnstr() calls take the proper
	  number of bytes when using multibyte characters, so that
	  multibyte strings aren't prematurely cut off. (DLR, found by
	  Jordi)
	- Allow the "View" state to be displayed when a filename is
	  passed in, in case we're in multibuffer mode and inside the
	  file browser. (DLR)
  help_line_len()
	- Make the text display more flexible, and closer to what nano
	  1.2.x does. (DLR)
- configure.ac:
	- Allow more flexible handling of UTF-8 support by allowing
	  the --enable-utf8 and --disable-utf8 options. (Mike
	  Frysinger)  DLR: Extend these options to work with slang as
	  well as curses, consolidate the warning and error messages
	  dealing with UTF-8 support as much as possible, and add a few
	  minor consistency fixes.
	- Mention explicitly that the check for the broken regexec() is
	  needed for glibc 2.2.3. (DLR)
- nanorc.sample:
	- Fix the description for the whitespace option to mention that
	  only single-column characters are allowed. (DLR)
	- Add C++ regexes. (Neil Brown, merged into c-file regexes by
	  DLR)
	- Break up overly long perl and nanorc regexes into separate
	  regexes of no more than 256 bytes, as POSIX-compliant regexp
	  implementations can reject regexes of over 256 bytes. (DLR)
- nano.1, nano.texi:
	- Mention the -? alias for -h/--help, and add various
	  consistency fixes. (DLR)
- nanorc.5:
	- Fix the description for the whitespace option to mention that
	  only single-column characters are allowed. (DLR)

GNU nano 1.3.6 - 2005.03.20
- General:
	- More int -> bool conversions. (DLR and David Benbennick)
	- Overhaul the cutting and uncutting routines to use the
	  partitioning code, as it greatly simplifies how they work.
	  New functions move_to_filestruct(), copy_from_filestruct(),
	  cut_line(), cut_marked(), and cut_to_eol(); changes to
	  add_to_cutbuffer(), do_cut_text(), do_uncut_text(), etc.;
	  removal of functions get_cutbottom(), add_to_cutbuffer(), and
	  cut_marked_segment(). (DLR)
	- Overhaul the justify-related routines to back up and restore
	  unjustified text to use the partitioning code, as it greatly
	  simplifies how they work, and to store such text in its own
	  buffer rather than the cutbuffer.  Changes to backup_lines(),
	  do_justify(), etc. (DLR)
	- Overhaul the multibuffer routines to increase efficiency, most
	  importantly making them use a doubly linked list for the open
	  files so that switching between them is no longer O(N), and
	  only including free_openfilestruct() when --enable-debug is
	  used.  Also use some of the same efficiency tweaks when
	  dealing with filestruct nodes.  New function
	  open_prevnext_file(); changes to make_new_opennode(),
	  splice_opennode(), unlink_opennode(), delete_opennode(),
	  free_openfilestruct(), add_open_file(), load_open_file(),
	  close_open_file(), shortcut_init(), die(), make_new_node(),
	  copy_node(), splice_node(), delete_node(), and
	  free_filestruct(); removal of open_prevfile() and
	  open_nextfile(). (David Benbennick, minor tweaks and additions
	  by DLR)
	- Change references to "open files" to "open file buffers", for
	  consistency. (DLR)
	- Add flag to disable UTF-8 sequence interpretation, so that
	  people using single-byte encodings such as KOI8-R can type
	  properly again. (DLR, found by Arthur Ivanov)
	- Massively overhaul the input and output routines to support
	  buffered input and output, the first steps toward
	  wide/multibyte character input and output, and verbatim input
	  of double-byte Unicode characters instead of single-byte ASCII
	  characters.  New functions is_byte(), get_buffer(),
	  get_buffer_len(), buffer_to_keys(), unget_input(),
	  get_input(), parse_kbinput(), and parse_verbatim_kbinput();
	  new macro charcpy(); changes to do_char() (renamed to
	  do_output()), get_edit_input() (renamed to do_input() and
	  moved to nano.c), get_edit_mouse() (renamed do_mouse() and
	  moved to nano.c), do_verbatim_input(), do_tab(), main(), and
	  get_ascii_kbinput() (renamed to get_byte_kbinput()).  The wide
	  version of ncurses is required in order for wide/multibyte
	  input and output to work properly. (DLR; buffered input/output
	  based on ideas from mutt 1.4.2.1; input of Unicode characters
	  in hexadecimal suggested by Michael Piefel)
	- More steps toward wide character/multibyte character support.
	  New functions control_rep(), parse_char(), move_left(), and
	  move_right(); changes to do_left(), do_right(), do_delete(),
	  breakable(), break_line(), do_output(), get_buffer(),
	  unget_input(), actual_x(), strnlenpt(), display_string(),
	  titlebar(), statusbar(), onekey(), edit_add(),
	  do_replace_highlight(), and do_credits(). (David Benbennick
	  and DLR)
	- Overhaul the high-level input routines for the statusbar to
	  make them read the shortcut lists for functions instead of
	  manually running them, to make nanogetstr() less complex, and
	  to increase flexibility.  Note that currshortcut is now used
	  regardless of #ifdefs, and that cutting text at the statusbar
	  now respects the CUT_TO_END flag.  Changes to shortcut_init()
	  and nanogetstr(); new functions do_statusbar_input(),
	  do_statusbar_mouse(), do_statusbar_home(), do_statusbar_end(),
	  do_statusbar_right(), do_statusbar_left(),
	  do_statusbar_backspace(), do_statusbar_delete(),
	  do_statusbar_cut_text(), and do_statusbar_output(). (DLR)
	- Even more steps toward wide character/multibyte character
	  support.  Movement and cursor display at the statusbar prompt
	  should now (mostly) work properly with a string containing
	  multibyte characters, and text display of such strings should
	  now (mostly) work properly as well.  Changes to search_init(),
	  nanoget_repaint(), do_statusbar_right(), do_statusbar_left(),
	  do_statusbar_backspace(), and do_statusbar_delete(). (David
	  Benbennick and DLR)
	- Implement cutting from the current position to the end of the
	  file, using Ctrl-X from the search prompt and Meta-T from the
	  edit window.  New function do_cut_till_end().  Note that this
	  is disabled when NANO_SMALL is defined. (DLR, based on ideas
	  from a patch for Pico by Eduardo Chappa, suggested by Ryan
	  Dlugosz and Paul Adams)
	- Implement verbatim input for the statusbar prompt.  Changes to
	  do_statusbar_input() and do_statusbar_output(); new functions
	  keys_to_buffer(), unparse_kbinput(), and
	  do_statusbar_verbatim_input(). (DLR)
	- Yet more steps toward full wide character/multibyte character
	  support.  Overhaul the functions that already have support for
	  them to work with multibyte strings as much as possible, add
	  support to a few more functions as well, and move multibyte
	  character-specific functions to their own source file.  New
	  file chars.c; new functions is_alnum_char(),
	  is_alnum_mbchar(), is_alnum_wchar(), is_blank_mbchar(),
	  is_blank_wchar(), is_cntrl_mbchar(), is_cntrl_wchar(),
	  control_mbrep(), control_wrep(), mbwidth(), mb_cur_max(),
	  make_mbchar(), mbstrlen(), mbstrnlen(), mbstrcasecmp(),
	  mbstrncasecmp(), mbstrcasestr(), and mbrevstrcasestr();
	  changes to help_init(), do_wrap(), break_line(), is_byte()
	  (moved to chars.c), is_blank_char() (moved to chars.c),
	  is_cntrl_char() (moved to chars.c), nstricmp() (renamed
	  nstrcasecmp() and moved to chars.c), nstrnicmp() (renamed
	  nstrncasecmp() and moved to chars.c), nstristr() (renamed
	  nstrcasestr() and moved to chars.c), revstrstr() (moved to
	  chars.c), revstristr() (renamed revstrcasestr() and moved to
	  chars.c), nstrnlen() (moved to chars.c), parse_char() (renamed
	  parse_mbchar() and moved to chars.c), move_left() (renamed
	  move_mbleft() and moved to chars.c), move_right() (renamed
	  move_mbright() and moved to chars.c), do_home(),
	  do_verbatim_input(), do_delete(), do_tab(), do_enter(),
	  indent_length(), do_next_word(), do_prev_word(), do_wrap(),
	  do_input(), do_output(), is_whole_word(), strstrwrapper(),
	  get_buffer(), unget_input(), unget_kbinput(), get_input(),
	  parse_kbinput(), unparse_kbinput(), parse_verbatim_kbinput(),
	  do_statusbar_input(), do_statusbar_home(),
	  do_statusbar_verbatim_kbinput(), do_statusbar_output(),
	  do_help(), help_line_len(), and display_string(); removal of
	  buffer_to_keys() and keys_to_buffer(). (DLR)
	- Add -O/--morespace command line option, plus a corresponding
	  Meta-O toggle and a "morespace" rcfile option.  When these are
	  used, the normally-unused blank line below the titlebar will
	  be treated as part of the edit window.  New functions
	  no_more_space() and blank_topbar(); changes to global_init(),
	  window_init(), handle_sigwinch(), do_toggle(), do_mouse(),
	  get_mouseinput(), etc. (DLR; suggested by Mike Frysinger,
	  Rocco, and Robert Schultz)
	- Add support for moving to the next or previous word at the
	  statusbar prompt.  New functions do_statusbar_next_word() and
	  do_statusbar_prev_word(); changes to do_statusbar_input().
	  (DLR)
	- Make resizing more flexible.  We now can work with as few as
	  one row, and with no limit on the number of columns (except of
	  course the curses-imposed limit that it be greater than zero).
	  New function resize_variables(); changes to die_too_small()
	  (renamed check_die_too_small()), global_init(), window_init(),
	  and handle_sigwinch(). (David Benbennick)
	- Use void instead of RETSIGTYPE, as signal handlers are
	  supposed to return void anyway.  Also, the value of RETSIGTYPE
	  is sometimes misdetected as int, leading to compilation
	  warnings or errors.  Changes to cancel_fork(),
	  handle_hupterm(), do_suspend(), and do_cont(). (David
	  Benbennick)
	- Change flags to an unsigned long, and totsize to a size_t.
	  (DLR)
	- Store the number of multibyte characters instead of the number
	  of single-byte characters in totsize, and use get_totals() to
	  get the value of totsize in a few more places.  Changes to
	  read_line(), read_file(), do_delete(), do_input(),
	  get_totals(), and do_cursorpos(). (DLR)
	- Overhaul the tab completion code, the file browser code, and
	  related functions to increase efficiency and support multibyte
	  characters.  New function is_dir(); changes to
	  get_full_path(), check_writable_directory(), safe_tempnam(),
	  diralphasort(), username_tab_completion(),
	  cwd_tab_completion(), input_tab(), tail(), striponedir(),
	  browser_init(), do_browser(), and do_browse_from(); removal of
	  append_slash_if_dir(), readable_dir(), and
	  check_wildcard_match(). (David Benbennick)  DLR: Move the
	  routine to get the current user's home directory into the new
	  function get_homedir(), and use it where necessary.  Also add
	  a few miscellaneous tweaks.
	- Overhaul the rcfile parsing code to make it simpler and more
	  accurate, remove now-redundant checks from the color code,
	  change the COLOR_SYNTAX toggle to the NO_COLOR_SYNTAX toggle,
	  and improve various debugging messages.  Changes to
	  set_colorpairs(), do_colorinit(), parse_next_word(),
	  parse_argument(), colortoint(), parse_next_regex(),
	  parse_syntax(), parse_colors(), parse_rcfile(), do_rcfile(),
	  etc. (David Benbennick)  DLR: Rename colortoint() to
	  color_to_int(), and add a few miscellaneous tweaks.
	- Overhaul the paragraph-searching code to make it use the
	  paragraph-searching utility functions when possible instead of
	  duplicating code.  Also overhaul the justify code to make it
	  leave the right number of spaces at the ends of the lines of a
	  paragraph, to make it support multibyte characters, and to
	  make it simpler.  Also, don't remove a space after a duplicate
	  character in punct anymore, as it doesn't really make us more
	  compatible with Pico.  New functions mbstrchr(),
	  do_para_begin_void(), and do_para_end_void(); changes to
	  justify_format(), do_para_begin(), inpar(), do_para_end(),
	  break_line(), do_para_search() (renamed find_paragraph()), and
	  do_justify(); removal of breakable(). (DLR)
	- Still more steps toward full wide/multibyte character support.
	  Make sure all rcfile arguments are valid multibyte strings,
	  make whitespace display mode work with multibyte characters,
	  and add a few related documentation updates.  New function
	  make_mbstring(); changes to make_mbchar(), make_mbstring(),
	  main(), parse_rcfile(), display_string(), and do_help(). (DLR)
- cut.c:
  do_cut_text()
	- If keep_cutbuffer is FALSE, only blow away the text in the
	  cutbuffer if the cutbuffer isn't empty. (DLR)
  do_uncut_text()
	- No longer duplicate Pico's adding an extra magicline to the
	  file if uncutting leaves the cursor on the current one.  This
	  behavior appears to be a bug, as inserting a file in the same
	  manner doesn't add an extra magicline. (DLR)
- files.c:
  get_full_path()
	- Remove unneeded NANO_SMALL #ifdef, so that it's included
	  whenever its prototype is, and so it can compile when
	  DISABLE_OPERATINGDIR isn't defined and NANO_SMALL is. (DLR)
  do_browser()
	- Refresh the screen when Ctrl-L is pressed in the file browser,
	  as Pico does. (DLR)
- global.c:
  shortcut_init()
	- Fix misplaced #endif keeping the "Full Justify" shortcut in
	  the search shortcut list from being included when NANO_SMALL
	  is defined but DISABLE_JUSTIFY isn't. (DLR)
	- Use NULL instead of 0 when a shortcut has no associated
	  function. (DLR)
  thanks_for_all_the_fish()
	- Free the justify buffer if it isn't empty. (DLR)
- nano.c:
  help_init()
	- Clarify the text describing double-escape character input.
	  Since ASCII is technically only seven bits wide, characters
	  128-255 aren't ASCII. (DLR, suggested by Michael Piefel)
  do_toggle()
	- When we get the whitespace display toggle, update the titlebar
	  as well as the edit window, in case the filename displayed on
	  the titlebar contains spaces or tabs. (DLR)
  handle_sigwinch()
	- If the justify buffer isn't empty, blow it away and don't
	  display "UnJustify" in the shortcut list anymore. (DLR)
  usage()
	- Typo fix. (DLR)
  do_wrap()
	- Make wrap_loc and word_back ssize_t's, to match fill. (DLR)
  break_line()
	- Fix compilation problem caused by its returning int when it
	  should return ssize_t according to its prototype. (Jeremy
	  Huddleston)
  indent_length()
	- Make the #ifdef around it match that of its prototype to avoid
	  compilation problems when compiling with --enable-tiny and
	  without DISABLE_JUSTIFY's being defined. (DLR)
  do_justify()
	- For consistency, preserve placewewant if we didn't unjustify
	  instead of setting it to 0. (DLR)
	- When justifying the entire file, properly break out of the
	  loop if we've found at least one paragraph, there are no more
	  paragraphs after the current one, and the paragraph search
	  left us on the magicline.  This avoids a segfault. (DLR)
  do_input()
	- Add finished parameter, used to indicate when we run or try to
	  run a function associated with a shortcut. (DLR)
  main()
	- Try to automatically detect whether UTF-8 support is needed by
	  setting the NO_UTF8 flag if setlocale() returns a string that
	  doesn't contain "UTF8" or "UTF-8", case insensitively.  When
	  using slang 2.x, enable UTF-8 support with SLutf8_enable().
	  (DLR, string checks beyond case-sensitive "UTF-8" adapted from
	  Debian's UTF-8 patch for slang)
- nano.h:
	- Remove now-unneeded #defines for functions that now have
	  multibyte equivalents. (DLR)
	- Remove now-unneeded MIN_EDITOR_COLS. (David Benbennick)
- utils.c:
  regexec_safe()
	- Remove redundant regexec #define, and move the regexec #undef
	  to nano.h. (DLR)
  is_blank_char()
	- Rewrite to use ctype functions instead of checking directly
	  for spaces and tabs. (DLR)
  revstrstr(), revstristr()
	- Add asserts. (DLR)
- winio.c:
  get_buffer()
	- If we get ERR when using blocking input, it means that the
	  input source that we were using is gone.  In this case, call
	  handle_hupterm(), so that nano dies gracefully instead of
	  going into an infinite loop. (DLR, found by Jim Uhl)
  titlebar()
	- Rename some variables for consistency, make space an int
	  instead of a size_t, properly handle the case where the prefix
	  length plus the path length is greater than the amount of
	  space available, and fix a typo in an assert. (DLR)
  unget_kbinput()
	- Remove the wide character handling, as it didn't work properly
	  with respect to function keys. (DLR)
  get_kbinput(), get_translated_kbinput(), get_ascii_kbinput(),
  get_untranslated_kbinput()
	- Make the ascii_digits variables ints instead of size_t's,
	  since they will only hold very small values. (DLR)
  get_kbinput()
	- Remove the wide character handling, as it didn't work properly
	  with respect to adding multiple wide characters at once, and
	  ungetting them just caused other problems elsewhere. (DLR)
  get_translated_kbinput()
	- Remove the wide character handling, as it didn't work properly
	  with respect to adding multiple wide characters at once, and
	  ungetting them just caused other problems elsewhere. (DLR)
	- Use if statements instead of switch/case statements to handle
	  ASCII character sequence mode, as they take up less room.
  get_ascii_kbinput()
	- Use if statements instead of switch/case statements to handle
	  ASCII character sequence mode, as they take up less room.
  get_verbatim_kbinput()
	- Don't pass v_kbinput in as a parameter, since we're
	  dynamically allocating it and then returning it. (DLR)
	- Remove v_first parameter, and go back to the old behavior of
	  putting back the first character of the escape sequence, as it
	  worked just as well and was less complicated. (DLR)
  get_mouseinput()
	- Return TRUE instead of FALSE only when we have a control key,
	  a primary meta key sequence, or both. (DLR)
  get_shortcut()
	- Add a debug message. (DLR)
	- Take kbinput as a reference instead of a value, so that it's
	  translated when the key is translated to its equivalent
	  control key or meta key shortcut. (DLR)
	- Return s instead of NULL only when we have a control key, a
	  primary meta key sequence, or both. (DLR)
  get_toggle()
	- Add a debug message. (DLR)
  bottombars()
	- Initialize foo, in case a keystroke meets none of the handled
	  cases. (DLR)
  total_refresh()
	- Refresh bottomwin using the value of currshortcut, and change
	  the code around do_refresh() calls to accommodate this. (DLR)
	- Split out the code that updates the screen before refreshing
	  it into the new function total_redraw().
  do_help()
	- Refresh the screen when Ctrl-L is pressed in the help browser,
	  as Pico does. (DLR)
- configure.ac:
	- Remove specific references to control key shortcuts. (DLR)
	- Check for the wide versions of ncurses or slang, without which
	  multibyte strings don't seem to be displayed properly, and
	  associated multibyte/wide character functions. (DLR)
	- Check for wchar.h, for those systems that need it for the
	  wcwidth() prototype. (DLR)
	- Remove checks for all include files that we include
	  unconditionally. (DLR)
	- Remove references to termio.h here and elsewhere, since it's
	  obsolete and it defines a struct termio that we don't use
	  anywhere. (DLR)
	- Typo fixes. (DLR)
	- Add checks for isascii(), iswalnum(), iswblank() or
	  iswspace(), mblen(), and wctype.h. (DLR)
- README:
	- Updated for the 1.3 branch. (DLR)
- README.CVS:
	- Updated to mention the need for a wide character-supporting
	  version of curses or slang if UTF-8 support is desired. (DLR)
- doc/faq.html:
	- Remove now-inaccurate note about verbatim input's not working
	  at prompts, and update its description to mention that it
	  handles hexadecimal values now. (DLR)
	- Add question about opening files with names beginning with
	  '+'s, and add a few more miscellaneous cosmetic fixes.
- nanorc.sample:
	- Add return to the "c-file" regexes. (DLR)
	- Clarify the text describing good values for whitespace
	  display.  Since ASCII is technically only seven bits wide,
	  characters 128-255 aren't ASCII. (DLR, suggested by Michael
	  Piefel)
	- Add the "morespace" option. (DLR)
	- Add support for characters to the "c-file" regexes. (DLR)
	- Add the hexadecimal equivalents of the decimal values
	  suggested for whitespace display, now that it can handle
	  multibyte characters. (DLR)
	- Add "manpage" regex. (Mike Frysinger, minor tweaks by DLR)
- nano.1. nanorc.5, nano.texi:
	- Add the "morespace" option, and sync with the descriptions in
	  nanorc.sample in a few places. (DLR)
	- Miscellaneous wording tweaks. (DLR)
- src/Makefile.am:
	- Add chars.c to nano_SOURCES. (DLR)
	- If we're installing and the "rnano" symlink already exists,
	  remove it so that we can create it again without an error.
	  (DLR)
- AUTHORS:
	- Updated to mention UTF-8 support.

GNU nano 1.3.5 - 2004.11.22
- General:
	- Convert more ints that hold only TRUE and FALSE values to
	  bools. (DLR)
	- Consolidate the code for finding and running a shortcut in a
	  shortcut list, the code for finding and toggling a toggle in a
	  toggle list, and the code for doing both of those and
	  interpreting mouse clicks in the edit window.  Also move the
	  code for do_mouse() to get_edit_mouse() and tweak it to
	  properly handle cases where a shortcut isn't clicked.  New
	  functions get_shortcut(), get_toggle(), get_edit_input(), and
	  get_edit_mouse(); changes to do_browser(), do_justify(),
	  do_help(), and main(). (DLR)
	- Simplify a few more translated messages. (DLR)
	- Translation updates (see po/ChangeLog for details).
	- Remove reference to @includedir@ in src/Makefile.am, as it's
	  unneeded and can break cross-compilation. (DLR, found by Mike
	  Frysinger)
	- Overhaul the file opening, reading, and loading operations to
	  increase efficiency, avoid problems on invalid filenames
	  specified on the command line, and eliminate corner cases that
	  erroneously leave edittop or current NULL when they shouldn't
	  be.  Also split out the code to execute a command into a
	  separate function, eliminate a workaround for one of the
	  aforementioned corner cases, handle files with a mix of DOS
	  and Mac format lines, and remove the code to turn on the
	  NO_CONVERT flag when opening a binary file, as it's not always
	  reliable and will cause problems with UTF-8 text files.  New
	  functions open_file(), execute_command(), and mallocstrassn();
	  changes to read_line(), load_file(), read_file(), open_file(),
	  get_next_filename(), do_insertfile(), do_insertfile_void(),
	  do_alt_speller(), and edit_refresh(). (David Benbennick)  DLR:
	  Add a few minor fixes to make sure that current is set
	  properly in all cases, indicate on the statusbar when the file
	  has a mix of DOS and Mac format lines, move the test for DOS
	  line endings from read_line() to read_file() to avoid
	  inaccurate statusbar messages and to reduce fileformat to a
	  local variable in read_file(), eliminate another workaround in
	  edit_update(), rename open_the_file() to open_file() since the
	  latter has been removed, and rename load_a_file() to
	  load_buffer().
	- Add alternative shortcuts to the main and search shortcut
	  lists for moving to the beginning and end of a paragraph and
	  justifying the entire file: Meta-( (Meta-9), Meta-) (Meta-0),
	  and Meta-J, respectively.  Do this because Pico's practice of
	  putting these shortcuts only in the search shortcut list is
	  rather odd. (DLR)
	- Turn off extended input processing (the IEXTEN termios flag)
	  as nano 1.2.x does.  New function disable_extended_input();
	  changes to terminal_init(). (DLR)
	- Remove redundant include of limits.h from nano.c.  nano.c
	  includes nano.h and nano.h includes limits.h. (DLR)
	- Add a func_key flag to the low-level input functions and the
	  currently existing high-level input functions, to indicate
	  extended keypad values.  This is needed for UTF-8 support.
	  Changes to unget_kbinput(), get_kbinput(),
	  get_translated_kbinput(), get_shortcut(), get_edit_input(),
	  etc. (DLR)
	- Add a multibuffer mode toggle to the "Execute Command" prompt,
	  for consistency with the "Read File" prompt.  Changes to
	  do_insertfile() and shortcut_init(). (DLR)
	- Add an ^X toggle to the "Execute Command" prompt to go back to
	  the "Insert File" prompt, and add a ^T toggle to the "Go To
	  Line" prompt to go back to the "Where Is" prompt.  Changes to
	  do_insertfile(), shortcut_init(), do_gotoline(), etc.
	- Make sure a few uninitialized static variables are initialized
	  to sane values. (DLR)
	- After reading in a file and detecting the format it's in, set
	  the file format flags (DOS_FILE and MAC_FILE) to match, and
	  preserve them across multiple file buffers.  Changes to
	  read_file(), add_open_file(), and load_open_file(). (DLR,
	  suggested by Bill Soudan)
	- Remove the -D/--dos and -M/--mac command line options, as they
	  aren't much use with the new file format autodetection.  Also
	  remove the global versions of the toggles, so that they can
	  only be used at the "Write File" prompt as similar options
	  can.  Finally, change the Mac format toggle to Meta-M, since
	  that no longer conflicts with the global -m/--mouse toggle.
	  (DLR)
	- Add support for reading in UTF-8 sequences to the low-level
	  input routines.  Changes to get_kbinput() and
	  get_translated_kbinput(). (DLR)
	- Reduce search_last_line to a static variable in search.c, and
	  allow it to be set to FALSE via a function.  New function
	  findnextstr_wrap_reset(); changes to do_int_spell_fix(),
	  findnextstr(), do_search(), do_research(), do_replace_loop(),
	  do_replace(), and do_find_bracket(). (DLR, problem with making
	  search_last_line local to findnextstr() found by Rocco)
	- When saving or changing file positions, be sure not to ignore
	  placewewant.  Changes to do_int_spell_fix(), findnextstr(),
	  do_replace_loop(), and do_replace(). (DLR)
	- Convert current_x and mark_beginx to size_t's, and convert
	  some functions that use them as a parameter to use size_t as
	  well.  Also change some related assertions to handle them.
	  (David Benbennick and DLR)
	- Add code to partition a filestruct between a set of arbitrary
	  coordinates.  Given the coordinates of the beginning and end
	  of the mark, this allows proper and easier handling of saving
	  marked selections, replacing text only in marked selections
	  (suggested by Joseph Birthisel), and spell-checking marked
	  selections using either the internal or alternate spell
	  checker.  Do all these using a global partition structure.
	  New functions partition_filestruct(),
	  unpartition_filestruct(), remove_magicline(), and
	  get_totals(); changes to write_marked(), do_int_spell_fix(),
	  do_alt_speller(), handle_sigwinch(), and do_replace_loop().
	  (DLR)
	- Remove most redundant includes of sys/stat.h.  It's included
	  in nano.h, so it doesn't need to be included in files that
	  include nano.h. (DLR)
	- Remove the DOS_FILE and MAC_FILE flags, as they're only used
	  in files.c, and replace them with a static file_format enum.
	  Change the openfilestruct structure accordingly in order to
	  handle this. (DLR)
	- Convert some ints with predefined boundaries to enums. (DLR)
	- Include config.h only if HAVE_CONFIG_H. (Jordi)
- cut.c:
  cut_marked_segment()
	- Respect concatenate_cut, as we need to use it if we do a
	  marked cut and immediately follow it with a cut-to-end (which
	  uses this function). (DLR)
  do_cut_text()
	- Set concatenate_cut to TRUE unconditionally when doing a
	  marked cut.  This fixes an incompatibility with Pico where an
	  extra line is uncut if we do a marked cut that includes the
	  magicline and immediately follow it with an unmarked cut.
	  (DLR)
  do_uncut_text()
	- Maintain current_y's value when uncutting blocks so that
	  smooth scrolling works correctly. (DLR)
- files.c:
  read_file()
	- Rename variable fileformat to format, to avoid confusion with
	  the file_format enum type. (DLR)
  load_buffer()
	- Don't change the file format when we insert another file into
	  the current one. (DLR)
  do_insertfile()
	- Simplify by reusing variables whereever possible, and add a
	  parameter execute to indicate whether or not to be in "Execute
	  Command" mode. (DLR)
	- Rework so that goto is no longer needed, using do_writeout()
	  as a model. (DLR)
	- If file browsing succeeds, call statusq_abort() so that the
	  cursor position at the statusbar is reset. (DLR)
	- Add missing #ifdefs around the wrap_reset() call so that nano
	  compiles with wrapping disabled again. (DLR)
	- If we're not inserting a file into a new buffer, partition the
	  current buffer so that it's effectively a new buffer just
	  before inserting the file, and only restore placewewant
	  afterwards.  This is the same behavior we would get if we
	  opened the file, added all of it to the cutbuffer, closed the
	  file, and uncut at the current cursor position. (DLR)
	- Maintain current_y's value when inserting so that smooth
	  scrolling works correctly. (DLR)
  do_writeout()
	- Restructure if blocks for greater efficiency, using
	  do_insertfile() as a model. (DLR)
	- Simplify where possible, and use an int retval to hold the
	  return value instead of i. (DLR)
	- If file browsing succeeds, call statusq_abort() so that the
	  cursor position at the statusbar is reset. (DLR)
	- Remove unneeded calls to display_main_list(). (DLR)
  do_writeout_void()
	- Call display_main_list(), for consistency with
	  do_insertfile_void(). (DLR)
  write_file()
	- If we've tried to write to an unwritable file and we're not
	  prepending, tempname is NULL when it's passed to unlink().
	  This can cause problems if unlink() can't handle NULL, so
	  don't call it in that case. (David Benbennick)
  write_marked()
	- Remove check for MARK_ISSET's not being set. (DLR)
  open_prevfile(), open_nextfile()
	- Translate the "New Buffer" string when displaying "Switched
	  to" messages on the statusbar. (DLR)
  input_tab()
	- Fix snprintf() call so that we don't segfault when trying to
	  complete a filename containing %'s. (Ulf Härnhammar)
- global.c:
  shortcut_init()
	- Remove redundant NANO_SMALL #ifdef. (DLR)
	- Change an erroneous _() around the "New Buffer" string to
	  N_(). (DLR)
	- Add new key aliases: F15 for "Mark Text" (DLR) and F16 for
	  "Where Is Next". (Chris)
	- Leave "Mark Text" and "Where Is Next" out entirely when
	  NANO_SMALL is defined.  Since they aren't in the visible main
	  list, there's no point in having them in but disabled. (DLR)
	- In the search prompt shortcut list, move "Full Justify" to
	  after "History", so that the latter is visible onscreen
	  again. (DLR)
- nano.c:
  die_save_file()
	- Clarify the error message when there are too many backup files
	  and the current one can't be written. (DLR)
  help_init()
	- Rework to be a bit more flexible.  Only add tabs for shortcut
	  key entries if those entries exist, and if there's only one
	  entry left but there's room for more than one, add enough tabs
	  to put that entry at the end.  Also, make sure a function key
	  is displayed in the middle if it's the first entry.  These
	  changes allow e.g. the miscellaneous meta key sequence to be
	  displayed in a shortcut that has a control key, a primary meta
	  key sequence, and a miscellaneous meta key sequence, but no
	  function key. (DLR)
	- Update the help text to mention replacing and spell checking
	  only selected text, and also add a few cosmetic fixes to it.
	  (DLR)
	- Update the help text to mention how to get a blank buffer at
	  the "Execute Command" prompt. (DLR)
  do_prev_word()
	- Tweak to avoid an infinite loop, since current_x is now a
	  size_t and hence is unsigned. (DLR)
  do_int_spell_fix()
	- Move the REVERSE_SEARCH flag toggling into the NANO_SMALL
	  #ifdef, since the tiny version of nano doesn't support reverse
	  searching.  Move the CASE_SENSITIVE flag toggling out in order
	  to allow the internal spell checker to work properly when
	  NANO_SMALL is defined and DISABLE_SPELLER isn't.  Also, turn
	  the USE_REGEXP flag off during spell checking in order to
	  avoid a potential segfault. (DLR)
	- Fix a problem where if the cursor is in the middle of a file,
	  the spell checker will sometimes only correct the misspelled
	  word instances that appear before the cursor position and then
	  stop. (Rocco)
	- Use do_replace_loop()'s canceled parameter in order to ensure
	  that the spell checking stops if we canceled at the replace
	  prompt. (DLR)
  do_alt_speller()
	- Call terminal_init() unconditionally after running the
	  alternate spell checker, so that the terminal state is
	  properly restored in all cases. (DLR)
  justify_format()
	- For more compatibility with Pico, remove extra space after a
	  character in punct if that character is the same as the one
	  before it.  For example, with the default values of punct and
	  brackets, only one space will be left after "...". (DLR)
  do_para_begin(), do_para_end()
	- Maintain current_y's value when moving up or down lines so
	  that smooth scrolling works correctly. (DLR)
  breakable(), break_line()
	- Make goal a ssize_t instead of an int, since fill is now a
	  ssize_t, and the position at which a line is broken can be
	  greater than COLS. (DLR)
  main()
	- Tweak the command line parsing routine so that multiple +LINE
	  flags are properly interpreted in multibuffer mode. (DLR)
- nano.h:
	- Add WIDTH_OF_TAB #define, containing the default width of a
	  tab. (DLR)
	- Move the PATH_MAX #define here from files.c.
	- Remove unused COPYFILEBLOCKSIZE #define. (DLR)
- proto.h:
	- Add missing NANO_SMALL #ifdef around the cut_marked_segment()
	  prototype. (DLR)
- rcfile.c:
  parse_rcfile()
	- Add missing brackets around an if statement block so that
	  parsing the numeric argument after "tabsize" works properly
	  again. (DLR, found by Mike Frysinger)
	- Since flag values are longs, use "%ld" instead of "%d" in the
	  debugging messages indicating when a flag is set or unset.
	  (DLR)
- search.c:
  regexp_init()
	- If NANO_SMALL is defined, don't bother checking the
	  CASE_SENSITIVE flag or using its value when compiling a list
	  of matching regular expressions. (DLR)
  search_init()
	- Add parameter use_answer.  When it's TRUE, only set
	  backupstring to answer.  This is needed to preserve the text
	  of the statusbar when switching to the search prompt from
	  the "Go To Line" prompt.  Also, set backupstring before doing
	  anything else, add one minor efficiency tweak, and preserve
	  the text of the statusbar no matter what when switching from
	  the search prompt to the "Go To Line" prompt, since the
	  toggling works both ways now and non-numeric text shouldn't be
	  lost when going only one of those ways. (DLR)
	- When we're replacing and the mark is on, display a prompt
	  indicating that we're replacing text only in the selection
	  instead of the usual prompt. (DLR)
  findnextstr()
	- Take the no_sameline parameter after can_display_wrap and
	  wholewords, not after all other parameters. (DLR)
	- Maintain current_y's value when moving up or down lines so
	  that smooth scrolling works correctly. (DLR)
	- Fix handling of the wholewords flag so that it works with
	  regular expressions and in conjunction with the no_sameline
	  flag, and add new parameter needle_len (used to return the
	  length of the match). (DLR)
  do_replace_loop()
	- Miscellaneous cleanups: treat real_current as current and
	  real_current_x as current_x, only turn the mark off and call
	  edit_refresh() if the mark was originally on, and make
	  length_change a ssize_t. (DLR)
	- Return ssize_t instead of int. (DLR)
	- Add new parameter canceled, set to TRUE if we canceled at the
	  prompt and FALSE otherwise. (DLR)
- utils.c:
  regexp_bol_or_eol()
	- Don't assume any longer that string will be found if
	  REG_NOTBOL and REG_NOTEOL are not set. (DLR)
  mallocstrncpy()
	- New function, used as a malloc()ing equivalent of strncpy().
	  (DLR)
  mallocstrcpy()
	- Refactor to be a wrapper for mallocstrncpy(). (DLR)
  mark_order()
	- Add new parameter right_side_up.  Set it to TRUE If the mark
	  begins with (mark_beginbuf, mark_beginx) and ends with
	  (current, current_x), or FALSE otherwise. (DLR)
- winio.c:
  unget_kbinput()
	- New function used as a wrapper for ungetch(). (DLR)
  get_kbinput()
	- When reading an escape sequence, set get_verbatim_kbinput()'s
	  new first parameter to the first character of the sequence
	  instead of putting that character back and reading the entire
	  sequence afterwards. (DLR)
  get_escape_seq_kbinput()
	- Make the escape_seq parameter a const int*, since it's never
	  modified. (DLR)
	- Support the escape sequences for F15 and F16. (DLR)
  get_verbatim_kbinput()
	- Add new parameter first.  If first isn't ERR, make it the
	  first character in the returned sequence instead of reading
	  the first character in via blocking input. (DLR)
  get_mouseinput()
	- Consolidate two if statements to increase efficiency. (DLR)
	- Check kbinput against metaval instead of (erroneously) ctrlval
	  when putting back a meta sequence. (DLR)
	- If there are more than MAIN_VISIBLE shortcuts available, only
	  register clicks on the first MAIN_VISIBLE shortcuts, since
	  bottombars() only shows that many shortcuts. (DLR)
  check_statblank()
	- Rename to check_statusblank(), and rename its associated
	  global int statusblank too. (DLR)
  nanogetstr()
	- Refresh the screen when Ctrl-L is pressed at the statusbar
	  prompt, as Pico does. (DLR)
	- Always return the key pressed by the user. (DLR)
  statusq()
	- Rework slightly to reset the cursor position when the user
	  hits Enter as well as Cancel.  This means that resetstatuspos
	  no longer needs to be global. (DLR)
  statusq_abort()
	- New function to set resetstatuspos to FALSE when we don't
	  properly exit the statusbar prompt, e.g. when we get a file
	  from the file browser). (DLR)
  bottombars()
	- For efficiency, no longer dynamically allocate space for each
	  visible shortcut, as they're all of a constant short length.
	  (David Benbennick)
  reset_cursor()
	- If this is called before any files have been opened, as it can
	  be by statusbar(), put the cursor at the top left corner of
	  the edit window before getting out. (DLR)
  edit_refresh()
	- Call edit_update() with NONE instead of CENTER when smooth
	  scrolling is on, for consistency with the movement routines.
	  (DLR)
  edit_update()
	- Simplify so as not to require the fileptr parameter anymore,
	  since it's set to current in all calls. (DLR)
	- Add comments better explaining what the update actually does,
	  and avoid an infinite loop when location is NONE and current_y
	  is greater than (editwinrows - 1). (DLR)
  do_yesno()
	- Don't bother assigning the value of get_mouseinput() to
	  anything.  Since allow_shortcuts is FALSE, its return value
	  will always be FALSE. (DLR)
- configure.ac:
	- When calling AC_TRY_RUN() to test for a broken regexec()
	  function, set the fourth parameter to default to "no" (since
	  it apparently only occurs on glibc 2.2.3-based systems) so
	  that cross-compiling will work. (DLR, found by Mike Frysinger)
	- Simplify the curses library tests by only checking for
	  initscr(), which ncurses, curses, and pdcurses should all
	  have, and not tgetent(), which is a termcap-specific function.
	  (DLR)
	- Check only for glib 2.x, as it's much more common than
	  glib 1.2.x now, and it has a better v?snprintf()
	  implementation. (DLR, suggested by Jordi)
- nanorc.sample:
	- Remove specific references to control key shortcuts other than
	  XON and XOFF. (DLR)
	- Add continue and goto to the "c-file" regexes. (DLR)
	- Change the included speller value to "aspell -x -c".  The -x
	  option makes aspell not create backup files, and this is
	  consistent with the internal spell checker's behavior. (DLR)
- doc/man/fr/nano.1, doc/man/fr/nanorc.1:
	- Updated manpage translations by Jean-Philippe Guérard.
- README.CVS:
	- Mention the requirement for glib 2.x on systems lacking
	  v?snprintf(), and add minor formatting changes.
	- Mention the requirement for groff in order to create html
	  versions of the manpages. (DLR)
	- Update the given cvs commands so that they work again, and
	  mention the need for ssh to do cvs checkouts. (DLR)
	- List sh as an example of a Bourne shell. (DLR)
- faq.html:
	- Fixed inaccuracy: Pico compatibility mode was made the default
	  in nano 1.1.99pre1, not 1.2.2. (DLR)
	- Added question about how to type F13-F16 on terminals lacking
	  keys past F12 (suggested by Chris), question about how to
	  select text for the clipboard in X terminals with nano's mouse
	  support turned on (answer found by Joseph Birthisel), and
	  miscellaneous fixes and link updates. (DLR)
- nano.1:
	- Eliminate references to the now removed -D/--dos and -M/--mac
	  command line options. (DLR)
- nano.texi:
	- Eliminate references to the now removed -D/--dos and -M/--mac
	  command line options, and their corresponding toggles. (DLR)
- m4/Makefile.am:
	- Add glib-2.0.m4 to EXTRA_DIST, so that nano builds from CVS
	  with automake 1.7.x again.  For some reason, automake 1.9.x
	  didn't have a problem with its (erroneously) being left out.
	  (DLR, problem found by Chris)
- m4/glib-2.0.m4:
	- New file imported from glib 2.4.7.  This is needed to detect
	  glib 2.x on systems that may not have it installed. (DLR,
	  suggested by Jordi)
- src/Makefile.am:
	- Don't use DEFS to define things.  Use INCLUDES instead.
	  (Jordi)

GNU nano 1.3.4 - 2004.08.17
- General:
	- More minor comment cleanups. (DLR)
	- Convert more ints and functions using 0 and 1 to bools using
	  TRUE and FALSE. (David Benbennick and DLR)
	- Change more instances of ints that have large enough upper
	  bounds and which can never be negative to size_t's, and
	  convert nano to handle them properly. (DLR)
	- Convert the shortcut list functions and most related functions
	  to return void instead of int, as the return values of all
	  those functions are essentially unused.  Changes to
	  sc_init_one(), shortcut_init(), etc. (David Benbennick and
	  DLR)
	- Make flags and all variables meant to store the value of flags
	  longs for consistency. (David Benbennick)
	- Rename the TEMP_OPT flags to TEMP_FILE, as it's more
	  descriptive. (DLR)
	- Remove unused global variable search_offscreen. (David
	  Benbennick)
	- Add new N_() macro to mark strings that aren't translated
	  immediately, and convert nano to use it in cases where the
	  translated string is stored in a const char*.  Changes
	  to sc_init_one(), print1opt(), help_init(), rcfile_error(),
	  do_credits(), etc. (David Benbennick)  DLR: Do this for
	  toggle_init_one() too.
	- Minor tweaks and clarifications to some option descriptions.
	  (DLR)
	- Overhaul the shortcut list and toggle list initialization
	  code for efficiency.  Changes to shortcut_init() and
	  toggle_init(). (David Benbennick)  DLR: Move "Cancel" to just
	  after "Get Help" in the file browser list, for consistency
	  with all the other lists, have the replace list accept all the
	  same function keys as the search list, and clarify a few
	  shortcut descriptions.
	- Convert nano to use the new parse_num() function to read in
	  numeric values at the command line and in the rcfile, and
	  duplicate the messages used in the rcfile in the command line
	  for consistency. (David Benbennick)  DLR: Tweak parse_num() to
	  parse ssize_t values instead of ints and to return a bool
	  indicating whether parsing succeeded.  Convert tabsize,
	  wrap_at, and fill to ssize_t in order to work with
	  parse_num() properly and also to increase their capacity
	  while keeping the ability to hold negative numbers in case of
	  errors.  Also exit instead of calling usage() in the event of
	  an invalid fill value, for consistency with how an invalid
	  tabsize value is handled.  Finally, handle invalid tabsize
	  entries in the rcfile the same way as on the command line,
	  and reset tabsize and wrap_at to their default values if
	  invalid rcfile entries are specified for them.
	- Remove several unnecessary reset_cursor() calls. (David
	  Benbennick)
	- Include <sys/types.h> in proto.h. (David Benbennick)  DLR:
	  Remove some redundant inclusions of <sys/types.h> elsewhere.
	- Move the main terminal initialization functions, aside from
	  initscr(), into a new terminal_init() function, and convert
	  nano to use it. (DLR)
	- Convert placewewant to a size_t, and convert some functions
	  that use it as a parameter to use size_t as well. (David
	  Benbennick and DLR)
	- Overhaul the paragraph searching code and some of the justify
	  code to clarify it and fix a bug where searches from the
	  previous paragraph would move up too far.  Also make
	  quotestr-related variables global so that they only have to be
	  compiled once, and remove the no-longer-needed IFREG() macro.
	  New functions begpar() and inpar(); changes to quote_length(),
	  quotes_match(), do_para_search(), do_para_begin(),
	  do_para_end(), and do_justify(). (David Benbennick)
	- Readded the errors flag and moved the ending prompt from
	  rcfile_error() to parse_rcfile() so that we only get prompted
	  once for all errors instead of separately for each error.
	  (DLR)  David Benbennick: Make sure that no rcfile error
	  messages end in newlines, and show the ending prompt if we
	  can't read the .nano_history file while starting nano.
	- Don't treat the return value of strn?(case)?cmp() as boolean.
	  (DLR and David Benbennick)
	- Automatically install a symlink "rnano" pointing to nano.
	  Changes to src/Makefile.am. (DLR)
	- Move the static int pid to the beginning of nano.c with all
	  the other static variables. (DLR)
	- Consolidate some if blocks to remove some redundant code.
	  (David Benbennick)
	- Fix warnings when compiling with ENABLE_NLS undefined and with
	  the fwritable-strings option. (David Benbennick)
	- Add various #ifdefs to fix warnings and compilation problems
	  when compiling with every option manually turned on, including
	  NANO_SMALL. (David Benbennick)
	- Simplify some of the rcfile and statusbar error messages, and
	  make some of them more consistent. (David Benbennick and DLR)
	- Change some functions to take const char*'s instead of char*'s
	  where possible. (David Benbennick)
	- Tweak some #ifdefs around indent_length() and references to
	  fill_flag_used to avoid warnings when compiling with
	  --disable-wrapping, --disable-justify, or a combination of the
	  two. (DLR)
	- Overhaul the routines used to read the rcfiles and history
	  files for efficiency, make them work properly on lines over
	  1023 characters long and on lines containing nulls, and make
	  them properly handle the case where the user's home directory
	  changes in the middle of a session.  New functions
	  histfilename() and writehist(); changes to
	  thanks_for_all_the_fish(), load_history(), save_history(), and
	  do_rcfile(). (David Benbennick)
- files.c:
  get_next_filename()
	- Tweak for efficiency, and add the ".save" suffix to the file
	  here. (David Benbennick)
  close_open_file()
	- Tweak to no longer rely on the return values of
	  open_(prev|next)file(). (DLR)
  write_file()
	- For consistency with nano 1.2.x and with other editors, make
	  the mode of newly created files 666 instead of 600 before
	  it's modified by the umask. (DLR, found by Toni Suokas)
  do_writeout()
	- If we're in restricted mode and the current filename isn't
	  blank, we can't change it, so disable tab completion in that
	  case. (DLR)
	- Fix spacing problem in the "Save Under Different Name"
	  prompt. (DLR)
- global.c:
  shortcut_init()
	- Fix erroneous #ifdef so that nano compiles with
	  --disable-justify again. (DLR, found by Mike Frysinger)
	- Change the Cancel shortcut in the file browser to an Exit
	  shortcut, to be more compatible with the current version of
	  Pico. (DLR)
  thanks_for_all_the_fish()
	- Delete topwin, edit, and bottomwin. (David Benbennick)
- nano.c:
  die()
	- Don't add the ".save" suffix to a saved file here anymore,
	  since get_next_filename() does that now. (David Benbennick)
  die_save_file()
	- Tweak for efficiency. (David Benbennick)
  help_init()
	- Fix the display of the translated key descriptions "Up" and
	  "Space" under all circumstances, and make the help browser
	  work properly when there are fewer than 24 columns available.
	  (David Benbennick)
  usage()
	- Don't translate the option strings for -Z/--restricted.
	  (David Benbennick)
  do_enter()
	- Don't treat it as a special case when the user presses Enter
	  on the last line of the screen and smooth scrolling is on, for
	  consistency. (DLR)
  do_alt_speller()
	- When reloading the newly spell-checked temporary file, call
	  terminal_init() to make sure that all the original terminal
	  settings are restored, as a curses-based alternative spell
	  checker (e.g. aspell) can change them. (DLR)
  quote_length()
	- Fix problem where quoted justify wouldn't work if HAVE_REGEX_H
	  wasn't set. (David Benbennick)
  do_justify()
	- Add allow_respacing flag, used to indicate when we've moved to
	  the next line after justifying the current line, and only run
	  the respacing routine when it's true.  This keeps the
	  respacing routine from erroneously being run more than once on
	  the same line. (DLR)
	- Check for first_par_line's not being NULL and only run the
	  renumbering and cutbuffer-splicing routines depending on that
	  if that's the case.  This fixes a segfault occurring when
	  trying to do full justification on a file with no paragraphs
	  (in which case there are no normal lines to renumber and no
	  backed-up lines to be stored in the cutbuffer or spliced back
	  in during unjustify). (DLR)
  do_exit()
	- Tweak for efficiency. (David Benbennick)
  main()
	- Move the reset_cursor() call to the beginning of the main
	  input loop, and remove the apparently unnecessary wrefresh()
	  call. (David Benbennick)
	- Call setlocale() outside the ENABLE_NLS #ifdef, since UTF-8
	  support won't work properly if the locale isn't set, whether
	  NLS is enabled or not. (Junichi Uekawa)
	- Add titlebar() calls before all open_file() calls and remove
	  the titlebar() call after them, so that the titlebar is
	  displayed properly for all file(s) loaded.  Also call
	  display_main_list() after adding the first file to open_files,
	  so that "Close" is properly displayed then instead of "Exit".
	  (DLR)
- nano.h:
	- Reassign the key for full justification to Ctrl-U, for
	  compatibility with the current version of Pico. (DLR)
	- Remove justbegend enum, as it's no longer needed. (DLR)
- proto.h:
	- Change the variables in the prototypes for do_justify(),
	  get_verbatim_kbinput(), and get_mouseinput() to match the ones
	  used in the actual functions. (DLR)
	- Remove unused declaration of temp_opt. (David Benbennick)
	- Add missing copy_file() prototype. (David Benbennick)
	- Move the load_history() and save_history() prototypes up to
	  match their corresponding location in files.c. (DLR)
- rcfile.c:
  rcfile_msg()
	- Removed and replaced with calls to rcfile_error(). (David
	  Benbennick)
	- Removed the reference to "starting nano" in the statusbar
	  message, as it may be called when we exit if the history file
	  can't be saved. (DLR)
  parse_rcfile()
	- Have whitespace display default to off instead of on. (Mike
	  Frysinger)
  nregcomp()
	- Rename the variable flags to eflags so as not to conflict with
	  the global flags. (DLR)
- search.c:
  do_replace_loop()
	- Make sure old_pww is updated to the current value of
	  placewewant when a new match is found, so that edit_redraw()
	  will redraw the screen properly when only placewewant changes.
	  (DLR, found by Mike Frysinger)
  do_replace()
	- Instead of using edit_update() to redraw the screen with
	  edittop at the top, set edittop beforehand and call
	  edit_refresh(). (DLR)
  do_gotoline()
	- Use parse_num() to interpret a line entered by the user, and
	  start the search for a line from current instead of fileage.
	  (DLR)
  do_gotopos(), find_node(), free_history()
	- Tweak for efficiency. (David Benbennick)
  free_history()
	- Only include when DEBUG is defined. (David Benbennick)
- utils.c:
  parse_num()
	- New function to parse numeric values, so that we don't have to
	  duplicate code that calls strtol() all over the place. (David
	  Benbennick)  DLR: Renamed from parse_int() to parse_num() and
	  converted to use ssize_t instead of int.
  nstrnicmp()
	- Remove code checking for n's being less than 0 that will never
	  be run, since n is a size_t and is hence unsigned. (David
	  Benbennick)
  ngetdelim(), ngetline()
	- New functions equivalent to getdelim() and getline(), which
	  are both GNU extensions. (DLR, adapted from GNU mailutils
	  0.5 with minor changes to better integrate with nano and
	  increase efficiency)
- winio.c:
  get_kbinput()
	- Since the only valid values for escapes are 0, 1, and 2,
	  convert it to an int. (DLR)
  get_control_kbinput()
	- Fix erroneous debugging statement so that nano compiles with
	  --enable-debug again. (Jon Oberheide)
  nanogetstr()
	- Tweak the code to update the edit window just before getting
	  statusbar input for efficiency, and update bottomwin just
	  before then too. (David Benbennick)
	- Don't delete the statusbar line on UnCut, since the current
	  version of Pico doesn't. (DLR)
  do_cursorpos()
	- Add assert to check whether totsize is correct. (David
	  Benbennick)
  line_len()
	- Rename to help_line_len() so as not to conflict with the
	  line_len variable used elsewhere, and move inside the
	  DISABLE_HELP #ifdef surrounding do_help() since it's only
	  called in do_help(). (DLR)
  do_help()
	- Have help_line_len() properly return an int again, since its
	  value can't be larger than COLS. (DLR)
	- Allow the user to exit the help browser via Ctrl-C as well as
	  Ctrl-X, for consistency with the file browser. (DLR)
- configure.ac:
	- Add AC_PROG_LN_S, so that we can portably create symlinks.
	  (DLR)
	- Check for getdelim() and getline(), which are both GNU
	  extensions. (DLR)
- nanorc.sample:
	- Add sample regexes for patch files. (Mike Frysinger)
	- Various improvements to the "c-file" regexes.  Add double,
	  typedef, extern, union, unsigned, inline, and long to the
	  green list. (Mike Frysinger)  DLR: Also add signed, short, and
	  enum to the green list.
- nano.spec.in:
	- Tweak to include all files in %{_bindir} instead of just nano,
	  so that the "rnano" symlink will be properly packaged. (DLR)

GNU nano 1.3.3 - 2004.06.28
- General:
	- Minor comment cleanups. (DLR)
	- Convert more ints used as boolean values to use TRUE and
	  FALSE. (David Benbennick)
	- Make sure the special control keys are handled the same way
	  after the window is resized or we come out of suspend mode.
	  Changes to do_cont() and handle_sigwinch(). (DLR)
	- Change some instances of ints that can never be negative to
	  size_t's. (DLR)
	- Add better explanations for and in the "Terminal breakage"
	  comments, and handle missing key #ifdefs inside the functions
	  that use those keys. (DLR)
	- Add restricted mode, accessible via the -Z/--restricted
	  command line option or by invoking nano with any name
	  beginning with 'r' (e.g. "rnano").  In restricted mode, nano
	  will not read or write to any file not specified on the
	  command line, read any nanorc files, allow suspending, or
	  allow a file to be appended to, prepended to, or saved under a
	  different name if it already has one. (IO ERROR)  DLR: Also
	  disable backup files and spell checking (since the latter can
	  leave a pre-spell-checked version of the file in a temporary
	  directory), use tail() to get the program name so that the
	  check for its beginning with 'r' will work when a path is
	  specified, disable toggles that are only useful with options
	  that are disabled in restricted mode, call nano_disabled_msg()
	  when trying to read or spell check a file instead of leaving
	  the shortcuts out of the main list, and instead of acting as
	  though TEMP_OPT is enabled when exiting with a modified file
	  (which caused problems if the filename was blank), only allow
	  a filename to be modified at the writeout prompt if it's blank
	  beforehand.  Changes to do_writeout(), toggle_init(),
	  shortcut_init(), die_save_file(), and nanogetstr().
	- Call nano_disabled_msg() directly from the shortcut list
	  instead of inside the disabled functions. (David Benbennick)
	- Clarifications to comments explaining exactly what control
	  characters and escape sequences are supported. (DLR)
	- Disable "Where Is Next" in tiny mode. (DLR)
	- Added the ability to justify the entire file at once, which
	  Pico has via ^W^J.  Changes to backup_lines() and
	  do_justify(); new functions do_justify_void() and
	  do_full_justify(). (DLR)
	- Modify the justification algorithm to work the same way as in
	  the current version of Pico, i.e. add a space at the end of
	  each line of the justified paragraph except for the last one,
	  and if there was a space at the end of the last one, remove
	  it.  Changes to justify_format() and do_justify().  Note that
	  we can no longer reliably detect the first modified line in a
	  paragraph, since a line unmodified by justify_format() may get
	  a space tacked onto the end of it or removed from the end of
	  it later.  The entire original paragraph is now always backed
	  up, and justify_format() no longer has a non-modifying mode,
	  so it's now only called in backup_lines(). (DLR)
	- Wrap the long jump code in NANO_SMALL #ifdefs, since we only
	  use it if we're resizing the window, which is disabled when
	  NANO_SMALL is defined. (DLR)
	- Add smart home key option, accessible via -A/--smarthome on
	  the command line, "set smarthome" in the rcfile, and the
	  Meta-H toggle in the edit window.  Smart home works as
	  follows: When Home is pressed anywhere but at the very
	  beginning of non-whitespace characters on a line, the cursor
	  will jump to that beginning (either forwards or backwards).
	  If the cursor is already at that position, it will jump to the
	  true beginning of the line.  This option is disabled in tiny
	  mode.  Changes to do_home(), nanogetstr(), etc. (DLR;
	  suggested by Stephan T. Lavavej)
	- Minor tweaks to the punctuation in some statusbar messages.
	  (DLR)
	- Overhaul the low-level input routines into main routines that
	  actually get the input and state machines that interpret the
	  input.  This allows better handling of the input (e.g. ignored
	  keys are now always ignored instead of just being ignored when
	  there are no escapes prefixing them) and will make it easier
	  to port to interfaces that don't have blocking input.  New
	  functions reset_kbinput(), get_translated_kbinput(),
	  get_control_kbinput(), and get_untranslated_kbinput(); changes
	  to do_verbatim_input(), handle_sigwinch(), get_kbinput(),
	  get_ascii_kbinput(), get_escape_seq_kbinput(), and
	  get_verbatim_kbinput(); removal of get_ignored_kbinput() and
	  get_accepted_kbinput(). (DLR)
	- Overhaul all the movement functions in order to avoid
	  redundant screen redraws (and regexec()s when color support is
	  available) whenever possible during ordinary cursor movement
	  when the text doesn't change.  Do the same for moving in
	  do_char(), do_delete(), do_next_word(), do_prev_word(),
	  do_search(), do_research(), and do_replace_loop.  Changes to
	  do_first_line(), do_last_line(), do_home(), do_end(),
	  do_page_up(), do_page_down(), do_up(), do_down(), do_left(),
	  do_right(), do_delete(), do_backspace(), do_search(),
	  do_research(), do_replace_loop(), do_find_bracket(), and
	  edit_refresh().  New functions do_left_void(),
	  do_right_void(), need_horizontal_update(),
	  need_vertical_update(), edit_scroll(), and edit_redraw().  All
	  of these functions but the first two require the previous
	  versions of current and/or placewewant as parameters, so that
	  they can redraw properly when the location has changed.  Also
	  rename the int refresh in do_delete() and do_backspace() to
	  do_refresh so as not to conflict with refresh(). (DLR)
	- Add some comments better explaining what is disabled in
	  restricted mode and why. (DLR)
	- Since KEEP_CUTBUFFER is only used in cut.c, make it a static
	  variable in cut.c instead of a flag, and unset it in other
	  files via the new function cutbuffer_reset(). (DLR)
	- Add the ability to change the characters used to display the
	  beginning characters of tabs and spaces via the rcfile entry
	  "whitespace".  This is disabled if nanorc support is disabled
	  or if we're in tiny mode.  Displaying the new characters is
	  toggled on and off by Meta-P; the default is on. (Mike
	  Frysinger; minor changes and adaptations by DLR)
	- Add the ability to change the closing punctuation and closing
	  brackets used to control justification, via the rcfile
	  entries "punct" and "brackets". (DLR)
	- Translation updates (see po/ChangeLog for details).
	- Make the former flag same_line_wrap use TRUE and FALSE
	  instead of 1 and 0. (DLR)
- files.c:
  add_open_file()
	- Rearrange the NANO_SMALL #ifdef so that the code to set the
	  MODIFIED flag in open_files->flags is included only once.
	  (DLR)
  write_marked()
	- Call write_file() with nonamechange set to TRUE so that we
	  don't erroneously change the current filename when writing a
	  selection, and don't take a nonamechange parameter anymore
	  since we don't use it. (DLR)
  do_writeout()
	- Refactor so that no recursion is needed if we try to exit with
	  a modified file that has no name when TEMP_OPT is set. (DLR)
	- Add spaces to the ends of the "Overwrite" and "Different Name"
	  prompts, for consistency. (DLR)
  do_browser()
	- Call check_statblank() instead of blanking the statusbar
	  unconditionally, for consistency. (David Benbennick)
- global.c:
  shortcut_init()
	- Don't assign any handler functions to the help browser keys,
	  as the help browser handles them all internally. (David
	  Benbennick)
- move.c:
  do_first_line(), do_last_line()
	- Move these functions here from winio.c. (DLR)
- nano.c:
  finish()
	- Call blank_statusbar() and blank_bottombars() to blank out
	  the statusbar and shortcut list in bottomwin. (DLR)
	- Since all of the calls to finish() use 0 for the value of
	  sigage, and the return value of finish() is never used, make
	  it accept and return void. (David Benbennick)
  die_save_file()
	- Call write_file() with nonamechange set to TRUE since we don't
	  need to change the current filename if we're writing emergency
	  backup files. (DLR)
  do_early_abort()
	- Removed, as it's no longer called anywhere. (David Benbennick)
  usage()
	- Add missing "[dir]" and two missing _()'s around the strings
	  describing the -E [dir]/--backupdir=[dir]" option. (CHAO
	  Wei-Lun)
  open_pipe()
	- Call enable_signals() at the beginning and disable_signals()
	  at the end, so that we get a SIGINT when Ctrl-C is pressed
	  during wait() and can then call cancel_fork() properly. (DLR)
  do_delete(), do_enter()
	- Tweak for efficiency. (David Benbennick)
  do_prev_word()
	- Switch the last test (current != NULL or not) around to match
	  the order of the same test in do_next_word() (current ==
	  NULL).  The results are the same either way. (DLR)
  do_wrap()
	- Tweak for efficiency. (David Benbennick)
  do_spell()
	- Tweak for efficiency. (David Benbennick)
	- Change the statusbar entries used in cases of failure so that
	  they all display the actual error that occurred. (David
	  Benbennick and DLR)
  do_int_speller(), do_alt_speller()
	- Make these functions return const char*'s instead of char*'s.
	  (David Benbennick)
  justify_format()
	- Remove redundant assignment. (DLR)
  do_para_search()
	- Remove unneeded edit_update() calls. (David Benbennick)
	- Convert to use an enum to specify the search type: JUSTIFY,
	  BEGIN, or END. (DLR)
	- Refactor to properly do searches for beginnings of paragraphs
	  in the same way as searches for endings of paragraphs, without
	  needing the old (and somewhat inaccurate) recursive approach.
	  (DLR)
  do_justify()
	- Remove unneeded edit_update() calls, and add a few minor
	  efficiency tweaks. (David Benbennick)
	- Simplify an if statement. (DLR)
  do_exit()
	- Refactor so that no recursion is needed if we try to exit with
	  a modified file that has no name when TEMP_OPT is set. (DLR)
  print_numlock_warning()
	- Removed, as it's no longer needed and was never called
	  anywhere after the input overhaul. (DLR)
  signal_init()
	- Don't use termios and _POSIX_VDISABLE to disable keys anymore,
	  as there's no real equivalent of it when the latter isn't
	  defined. (DLR)
  handle_sigwinch()
	- Call resetty() to get the original terminal settings back.
	  (DLR)
	- Rework so that nano properly redraws the screen on systems
	  that don't have resizeterm() and/or wresize().  In curses, we
	  now leave and immediately reenter curses mode via endwin() and
	  refresh(), and then reinitialize all windows via
	  window_init().  In slang, the above routine will only work if
	  the resize made the window smaller, so we now leave and
	  immediately reenter screen management mode via
	  SLsmg_reset_smg() and SLsmg_init_smg(), and then reinitialize
	  all windows via window_init().  (DLR, adapted from code in
	  Minimum Profit 3.3.0 and mutt 1.4.2.1, respectively)
  do_toggle()
	- Call blank_statusbar() and blank_bottombars() to blank out
	  the statusbar and shortcut list in bottomwin. (DLR)
  do_verbatim_input()
	- If PRESERVE is set, disable flow control characters before
	  getting input and reenable them after getting input. (DLR)
  disable_signals(), enable_signals(), disable_flow_control(),
  enable_flow_control()
	- New functions that allow more fine-grained control of the
	  terminal: disabling and enabling signals without having to use
	  _POSIX_VDISABLE and disabling and enabling flow control
	  characters. (DLR)
  main()
	- Don't open the first file in quiet mode, since if we do, an
	  error message won't be shown if it's unreadable. (DLR; found
	  by Jaap Eldering)
	- If we've specified multiple files on the command line and
	  multibuffer support is compiled in, turn multibuffer mode on
	  when reading those files and turn it off afterward if it was
	  off before.  This allows us to open multiple files without
	  having to turn multibuffer mode on at the command line or in
	  the nanorc first, both of which are unintuitive.  Multibuffer
	  mode should only affect how the "Read File" command behaves
	  anyway. (DLR)
	- Remove the disabling of implementation-defined input
	  processing, as cbreak mode appears to turn it off anyway.
	  (DLR)
	- After noecho(), call disable_signals() and
	  disable_flow_control(), the latter only if PRESERVE is not
	  set. (DLR)
	- Move the savetty() call down from just after initscr() to just
	  after the terminal is properly set up, so that we can restore
	  it easily after a resize. (DLR)
	- Add missing cast to char when calling do_char(). (DLR)
	- Don't initialize the backup directory if we're in restricted
	  mode, since backups are disabled then. (DLR)
	- Check $SPELL for an alternative spell checker if we didn't get
	  one from the command line and/or rcfile, as Pico does.  Don't
	  do this if we're in restricted mode, since spell checking is
	  disabled then. (DLR)
	- Add some cleanups for greater readability, and remove a few
	  bits of redundant code. (DLR and David Benbennick)
- nano.h:
	- Since REGEXP_COMPILED is only used in search.c, convert it
	  from a flag to a static int there. (DLR)
	- Add justbegend enum, used in do_para_search(). (DLR)
	- Add updown enum, used in edit_scroll(). (DLR)
- proto.h:
	- Remove unused xpt() and add_marked_sameline() prototypes.
	  (DLR)
	- Add missing #ifdefs around the nstristr() and get_mouseinput()
	  prototypes. (DLR)
- rcfile.c:
	- Move "rebinddelete" up in the list of options so that the list
	  is in alphabetical order. (DLR)
	- Cosmetic reorganization of the order in which some options are
	  interpreted. (DLR)
	- Explicitly check for rcopts[i].name's being "tabsize" to avoid
	  a spurious error under some circumstances about tabsize's
	  being 0 when there's no tabsize entry in the rcfile. (DLR)
- search.c:
  regexp_init()
	- Overhaul for efficiency.  Also check if regcomp() failed, and
	  if so, display "Bad regex" message on the statusbar, so that
	  we don't have to display it separately after every call to
	  this function. (David Benbennick)
  search_init()
	- Only check whether USE_REGEXP is set, and hence whether or not
	  to display "[Regexp]" on the search prompt, if HAVE_REGEX_H is
	  defined. (DLR)
  not_found_msg()
	- Convert to properly handle strings generated by
	  display_string() that have been used in the search prompt
	  since 1.3.0. (David Benbennick)
	- Use display_string() directly to display the text that we
	  didn't find instead of relying on statusbar() to do it
	  indirectly, since the latter won't display its text with the
	  user-specified whitespace characters and the former will.
	  (DLR)
- utils.c:
  is_blank_char()
	- New function used as an isblank() equivalent, since isblank()
	  is a GNU extension. (DLR)
  nstricmp(), nstrnicmp()
	- Add extra blank lines for greater readability, and remove
	  unneeded test for n's being less than zero (since it's already
	  been tested for being greater than zero or equal to zero at
	  that point) from nstrnicmp(). (DLR)
  stristr()
	- Rename to nstristr() to avoid a potential conflict with an
	  existing stristr() function, and move up to just after
	  nstrnicmp(). (DLR)  David Benbennick: Tweak for efficiency.
	- Include and use only when strcasestr() is unavailable, since
	  strcasestr() is a GNU extension. (DLR)
  nstrnlen()
	- New function used as a strnlen() equivalent, since strnlen()
	  is a GNU extension. (DLR)
- winio.c:
  get_verbatim_kbinput()
	- Refactor the output in the DEBUG #ifdef.  It didn't work
	  properly ever since this function was changed to use an int*
	  instead of a char*. (DLR)
	- When reading characters from input, properly reallocate
	  verbatim_kbinput via (int*)nrealloc() instead of an uncast
	  realloc(). (DLR)
  get_accepted_kbinput()
	- Add proper support for the keypad values and escape sequences
	  generated by the NumLock glitch and by certain keys on the
	  numeric keypad. (DLR)
	- Add an extra break and move an #endif down to fix a potential
	  problem when NANO_SMALL is defined or KEY_RESIZE isn't, and
	  when PDCURSES isn't defined. (DLR)
  get_escape_seq_kbinput()
	- Add proper support for the keypad values and escape sequences
	  generated by the NumLock glitch. (DLR)
	- Add ignore_seq parameter.  If a sequence is recognized but
	  ignored, we will now return ERR and set ignore_seq to TRUE, and
	  if a sequence is unrecognized, we will now return ERR and set
	  ignore_seq to FALSE.  Also, here and elsewhere, don't bother
	  assigning ERR to retval when that's its initial value. (DLR)
	- Fix problem where the escape sequence for F3 on the FreeBSD
	  console would not be interpreted properly. (DLR)
  get_mouseinput()
	- Don't ungetch() anything if there's no control key and no meta
	  key defined in the shortcut we clicked. (DLR)
  bottombars()
	- Don't display any more than MAIN_VISIBLE shortcuts.  Adding
	  justification of the entire file above made the search
	  shortcut list longer than this and hence made the shortcuts in
	  it so short as to be almost incomprehensible. (DLR)
	- Tweak for efficiency and to better handle shorter screen
	  widths. (David Benbennick)
	- Restructure the if block used for the sentinel key values,
	  dynamically allocate keystr based on the number of columns
	  available, and make sure we can display shortcuts even when
	  the number of available columns is too short for any complete
	  one. (DLR)
  onekey()
	- Don't bother padding the displayed shortcuts with spaces.
	  (David Benbennick)
	- Convert len to a size_t. (DLR)
  edit_add()
	- Minor cosmetic reformatting.  Also remove unused int
	  searched_later_lines. (DLR)
  blank_bottomwin()
	- Removed, as it does the same thing as blank_bottombars().
	  (David Benbennick)
  blank_titlebar()
	- New function used to blank the titlebar in topwin. (DLR)
  blank_statusbar_refresh()
	- Removed, as it's now unnecessary. (David Benbennick)
  titlebar()
	- Overhaul to use display_string() to display the filename, and
	  to better handle shorter screen widths.  Also remove
	  now-unneeded wrefresh(topwin) calls. (David Benbennick)
	  DLR: Tweak to reserve enough space for "Modified", plus
	  padding, in all cases, to make sure that the version message
	  takes up no more more than 1/3 of the available width, minus
	  padding, and to include a reset_cursor() call so that the
	  cursor is always in the right place.
  bottombars()
	- Call blank_bottombars() instead of blank_bottomwin(). (David
	  Benbennick)
  check_statblank()
	- Overhaul for efficiency, (David Benbennick)  DLR: Add
	  reset_cursor() call to ensure that the cursor is always in the
	  right place.
  update_cursor()
	- Removed, as it's no longer called anywhere. (David Benbennick)
  edit_refresh()
	- Remove apparently unneeded leaveok() calls. (David Benbennick)
  edit_refresh_clearok(), center_cursor()
	- Removed, as they are now unnecessary. (David Benbennick)
  statusq()
	- Don't allow "Full Justify" when in view mode. (DLR)
  statusbar()
	- Call reset_cursor() just before refreshing the edit window, so
	  that slang and other non-ncurses versions of curses will
	  properly place the cursor back in the edit window instead of
	  leaving it at the end of the statusbar. (DLR)
  do_help()
	- Overhaul for efficiency, and allow scrolling through the help
	  via the arrow keys as well as the paging keys. (David
	  Benbennick)  DLR: Revert the use of the return value of
	  curs_set() to restore the previous state of the cursor, as
	  some curses implementations (including slang) get it wrong,
	  and explicitly turn the cursor off where needed instead.
  do_credits()
	- Use napms() instead of nanosleep(), as it does the same thing
	  (aside from taking an argument in milliseconds instead of
	  microseconds) and curses includes it. (DLR)
	- Overhaul for efficiency, and make sure the xlcredits
	  translations are done after initialization in order to avoid
	  an error when compiling with -pedantic. (David Benbennick)
  do_yesno()
	- Add a comment to encourage translators to use both native and
	  English shortcuts, if possible. (Jordi)
- configure.ac:
	- Add tests for isblank(), strcasestr(), and strnlen(), and
	  define _GNU_SOURCE so that the tests work properly.  Increase
	  the minimum required autoconf version to 2.54. (DLR)
	- Reformat the test programs so that they aren't packed into
	  fewer lines than usual, so as to make them easier to read, and
	  remove unnecessary inclusion of stdio.h in the slang test
	  programs. (DLR)
	- Remove the checks for resizeterm() and wresize(), as they're
	  no longer needed. (DLR)
- config.rpath:
	- Replace usage of egrep with grep -E, avoiding a XSI:ism (David
	  Weinehall)
- faq.html:
	- Removed question about the NumLock glitch, as it's no longer
	  needed. (DLR)
- nano.1:
	- Document restricted mode. (IO ERROR)  DLR: Add minor
	  modifications to account for the above changes.
	- Document the smart home key option. (DLR)
	- Document the use of the SPELL environment variable. (DLR)
- nanorc.5:
	- Document the smart home key option. (DLR)
	- Document the whitespace option. (DLR, adapted from
	  documentation by Mike Frysinger)
	- Document the punct and brackets options. (DLR)
- nano.texi:
	- Fix toggle inaccuracies: Meta-L now toggles line wrapping, and
	  Meta-< and Meta-> aren't toggles. (DLR)
	- Document restricted mode. (IO ERROR)  DLR: Add minor
	  modifications to account for the above changes.
	- Fix version number inaccuracies: Search/replace history and
	  sorting/uniqueness filtering for the internal spell checker
	  were added in nano 1.1.99pre1. (DLR)
	- Document the smart home key option. (DLR)
	- Document the use of the SPELL environment variable. (DLR)
- nanorc.sample:
	- Add missing mouse entry, and update the nanorc sample regexes
	  to account for the backupdir and mouse options. (DLR)
	- Add smarthome description. (DLR)
	- Document the whitespace option. (DLR, adapted from
	  documentation by Mike Frysinger)
- README.CVS:
	- Increase the minimum required autoconf version to 2.54, and
	  change the recommended automake version 1.7 to the minimum
	  required automake version.  Note that autoconf 2.54 will
	  technically also work with automake 1.6c, but that is a CVS
	  version as opposed to a stable release version, and automake
	  1.7 requires at least autoconf 2.54 in any case. (DLR)
- TODO:
	- Added entry for justifying the entire file at once, since Pico
	  can do it, and with "[DONE]" since it's already been
	  implemented. (DLR)

GNU nano 1.3.2 - 2004.03.31
- General:
	- Change instances in the code that refresh the entire edit
	  window when color support is enabled (in order to properly
	  handle multi-line color regexes) to only do so when
	  it's necessary, i.e. when COLOR_SYNTAX is set. (DLR)
	- Minor cosmetic tweaks to the code involving direction keys.
	  NANO_UP_KEY and NANO_DOWN_KEY are now NANO_PREVLINE_KEY and
	  NANO_NEXTLINE_KEY, and the help messages for them have been
	  changed accordingly.  Also remove extraneous references to
	  NANO_DOWN_KEY in the search history shortcut entries. (DLR)
	- Add NANO_UNJUSTIFY_FKEY (the same as NANO_UNCUT_FKEY) to the
	  shortcut list, and tweak the unjustify routine to use it.
	  Also add NANO_FIRSTLINE_FKEY and NANO_LASTLINE_FKEY, and tweak
	  the statusbar input routines to handle them and NANO_HELP_FKEY
	  properly. (DLR)
	- Block SIGWINCH after setting up its handler, and only unblock
	  and handle it when we're in a stable state, i.e. when we're
	  waiting for input from the user.  New function
	  allow_pending_sigwinch(); changes to signal_init(),
	  get_kbinput(), and get_verbatim_kbinput(). (DLR)
	- Decouple the paragraph searching code and the justifying code.
	  Removed function do_para_operation(); new function
	  do_para_search(); changes to do_justify(). (DLR)
	- Add -E/--backupdir option.  When used with -B/--backup, backup
	  files will be saved in the specified directory with their
	  canonical pathnames encoded in their names (all '/'s replaced
	  with '!'s).  Changes to write_file(). (Martin Ehmsen)  DLR:
	  Add function init_backup_dir() to handle relative paths
	  correctly, use get_full_path() to get the canonical pathname,
	  and use tail() to get the filename if get_full_path() fails.
	- Port to the Tandem NonStop Kernel (nsr-tandem-nsk). (Tom
	  Bates; minor tweaks by DLR)
	- Change some instances of boolean 0 and 1 to TRUE and FALSE.
	  (David Benbennick)
	- Fix memory corruption problem occurring when answer is used as
	  the value of def; if the realloc() of answer leads to its
	  pointing to a different memory block, there will be a segfault
	  when the value of def is copied into it via strcpy().
	  (bort@alltel.net, Christian Weisgerber, David Benbennick, and
	  DLR)
	- Remove the last editbot references, to avoid any potential
	  segfaults related to them.  Also remove fix_editbot(), as it's
	  no longer needed. (David Benbennick)
	- Rename several variables to make their use clearer and to
	  avoid conflicts. (DLR)
	- Set the input mode before turning the keypad on. (DLR)
- cut.c:
  add_to_cutbuffer()
	- Add parameter allow_concat to determine whether we're allowed
	  to concatenate strings in the cutbuffer. (DLR)
- files.c:
  do_insertfile()
	- Wrap one reference to NANO_EXTCMD_KEY in a NANO_SMALL #ifdef.
	  (DLR)
	- Save the already-typed answer when switching from "Insert
	  File" to "Execute Command" mode via Ctrl-X, just in case we
	  started typing a command before switching. (DLR)
  add_open_files()
	- Make the saving of marked status in open_files->file_flags
	  work properly again; a tweak to the ISSET() macro in 1.3.0
	  to make it only return 0 or 1 broke it. (DLR)
  write_marked()
	- New function used to write the current marked selection to a
	  file, split out from do_writeout(). (DLR)
  do_writeout()
	- Tweak for efficiency. (David Benbennick)  DLR: Modify to have
	  the current answer preserved between toggles again.
  filestat()
	- Removed, as it is only called in one place and is
	  redundant. (DLR)
  do_browser()
	- Replace the filestat() call with an equivalent stat() call.
	  (DLR)
- global.c:
  shortcut_init()
	- Only allow verbatim input when we're not in view mode. (DLR)
	- Set the associated function for unjustify to 0 instead of
	  do_uncut_text(), since it's currently unused. (DLR)
- nano.c:
  usage()
	- Clarify the description for -T/--tabsize a bit. (DLR)
  do_verbatim_input()
	- Remove the now-unneeded code to disable XON, XOFF, and
	  suspend, since we now go into raw mode in
	  get_verbatim_kbinput() and bypass them. (DLR)
  do_next_word()
	- Simplify and remove references to editbot so as to avoid a
	  segfault. (David Benbennick)
  do_prev_word()
	- Simplify and remove references to edittop. (David Benbennick)
  do_int_speller(), do_alt_speller(), do_spell()
	- Modify to write only the current selection from a file to the
	  temporary file used for spell checking when the mark is on,
	  and add a few miscellaneous cosmetic cleanups. (DLR)
  do_int_spell_fix()
	- Store the value of current_x in a size_t instead of an int,
	  and add a few minor efficiency tweaks. (David Benbennick)
	- Remove comment explaining why findnextstr() is called with
	  bracket_mode set to TRUE even though we aren't doing a bracket
	  search, since after the above efficiency tweaks, it's now more
	  accurately called can_display_wrap. (DLR)
  indent_length()
	- Remove unneeded #ifdef. (David Benbennick)
  do_justify()
	- Remove references to the now-unneeded JUSTIFY_MODE flag. (DLR)
  signal_init()
	- Trap SIGQUIT in addition to turning it off via termios in
	  main().  This is consistent with SIGINT, which we trap here
	  and turn off via termios in main(), as well as with the
	  associated comment. (DLR)
  handle_sigwinch()
	- Set keypad() to TRUE and switch to cbreak mode just before
	  calling siglongjmp(), in case we resized during verbatim
	  input. (DLR)
  main()
	- Move the call to raw() on systems that don't define
	  _POSIX_VDISABLE outside the main input/output loop, as it
	  doesn't need to be called every time through the loop.  Call it
	  instead of cbreak() on such systems, as it overrides cbreak()
	  anyway. (DLR)
	- Add more descriptive comments explaining the termios and
	  curses setup routines, and turn the keypad on before setting
	  the input mode. (DLR)
	- Remove stray HAVE_GETOPT_LONG #ifdefs. (DLR)
	- Don't call keypad() before initializing the windows it needs
	  via window_init(). (DLR)
- nano.h:
	- Move the NANO_H include guard up before the first #include.
	  (DLR)
	- Remove the now-unneeded JUSTIFY_MODE flag. (DLR)
- search.c:
  regexp_cleanup()
	- Only do anything if REGEXP_COMPILED is set. (David Benbennick)
  search_abort()
	- Only test if the mark is set when NANO_SMALL isn't defined.
	  (David Benbennick)
  search_init()
	- Add some more comments and comment tweaks, don't indicate that
	  the search has been canceled when we enter a blank string in
	  replace mode, only call regexp_init() when USE_REGEXP is set,
	  and return -1 instead of -3 since a canceled search and a
	  canceled replace should be mostly equivalent. (David
	  Benbennick)  DLR: Tweak to use the old behavior if we try to
	  search for invalid regexes.
  findnextstr()
	- Refactor to use a loop invariant, and tweak for greater
	  efficiency and simplicity.  Also modify so that all searches
	  start one character after (or before, if we're doing a
	  backwards search) the current one, as opposed to all searches
	  except for regex searches for "^" and the like, for
	  consistency with other searches. (David Benbennick)
  do_search()
	- Handle search_init()'s no longer returning -3 above. (David
	  Benbennick)
	- Port the code from do_replace_loop() to skip the current line
	  if we're searching for a regex with "^" and/or "$" in it and
	  end up on the same line to this function.  This fixes a
	  problem where doing a forward search for "^" on a file with
	  more than one line would erroneously stop at the magicline and
	  indicate that that was the only occurrence. (DLR)
  do_research()
	- Port David Benbennick's efficiency tweaks and the
	  aforementioned code ported from do_replace_loop() to this
	  function. (DLR)
  replace_regexp()
	- Completely refactor for increased efficiency. (David
	  Benbennick)
  replace_line()
	- Use a char* parameter for the replacement string instead of
	  last_search, and add minor efficiency tweaks. (David
	  Benbennick)
  do_replace_loop()
	- Fix segfault when doing a regex replace of a string that
	  matches inside a line (e.g. replace the "b" in "abc" with
	  anything). (David Benbennick)
	- If the mark is on at the beginning of the function, turn it
	  off and turn it back on just before returning.  Also overhaul
	  to rely on the return value of findnextstr() instead of a loop
	  invariant, to not need to take an int* parameter, and store
	  the beginning x-coordinate in a size_t instead of an int.
	  (David Benbennick)
  do_replace()
	- Handle search_init()'s no longer returning -3 above, and add
	  efficiency tweaks. (David Benbennick)  DLR: Tweak to follow
	  the old behavior of adding non-blank strings entered at the
	  "Replace: " prompt to the search history. (DLR)
  do_gotoline()
	- Simplify the edit_update() call depending on the value of
	  save_pos. (David Benbennick)
  do_bracket()
	- Add efficiency tweaks. (David Benbennick)  DLR: Remove
	  reliance on the hardcoded bracket string length; instead, only
	  require that the bracket string length be even.
- utils.c:
  regexec_safe()
	- Wrap in HAVE_REGEX_H #ifdefs. (DLR)
  regexp_bol_or_eol()
	- New function used to check if a regex contains "^" and/or "$",
	  assuming that the regex would be found if the REG_NOT(BOL|EOL)
	  flags aren't used in the regexec() call; it replaces the
	  direct regexec()s used before. (DLR)
  strstrwrapper()
	- Refactor for increased efficiency, and eliminate the need for
	  the line_pos parameter. (David Benbennick)
  mallocstrcpy()
	- Tweak so that when src is "", "" is allocated and returned
	  instead of NULL. (David Benbennick)
- winio.c:
  get_verbatim_kbinput()
	- Set keypad() to FALSE and switch to raw mode while reading
	  input, and set it back to TRUE and go back into cbreak mode
	  mode afterwards.  (Note that if _POSIX_VDISABLE isn't defined,
	  we don't need to change to or from raw mode since we're
	  already in it exclusively.)  This ensures that we don't end up
	  reading in extended keypad values that are outside the ASCII
	  range or having to deal with interrupt-generating key values.
	  Also, with keypad() set to TRUE, xterm generates KEY_BACKSPACE
	  when the user hits Ctrl-H, which, when cut down to ASCII
	  range, ends up being Ctrl-G, which can be confusing. (DLR)
	- For consistency with get_kbinput(), use an int* to store and
	  return the input instead of a char*, and tweak the functions
	  that call it to handle this. (DLR)
  get_accepted_kbinput()
	- Don't use "kbinput = wgetch(win)" as a switch value. (DLR)
  get_escape_seq_kbinput()
	- Add support for the escape sequences for F1-F14 whenever
	  possible (i.e. whenever a conflict doesn't occur), some
	  additional comments, and a few cosmetic cleanups. (DLR)
	- Use switch statements instead of strncmp() to read in the long
	  xterm sequences for Ctrl-[arrow key] and Shift-[arrow key].
	  (DLR)
  get_escape_seq_abcd()
	- A resurrected version of the old abcd() function, readded in
	  order to simplify get_escape_seq_kbinput(). (DLR)
  get_mouseinput()
	- Interpret shortcut key values slightly more stringently when
	  ungetch()ing them. (DLR)
  strlenpt()
	- Properly cast the second parameter of the strnlenpt() call to
	  size_t. (DLR)
  get_page_start()
	- For consistency, tweak so that scrolling always occurs when we
	  try to move onto the "$" at the end of the line, as opposed to
	  (a) when we move onto the "$" at the end of the line on the
	  first page and (b) when we move onto the character just before
	  the "$" on subsequent pages. (DLR)
  reset_cursor()
	- Tweak for efficiency. (David Benbennick)
  edit_refresh()
	- Tweak for efficiency. (David Benbennick)
  statusq()
	- Rename "tabs" to "allowtabs". (David Benbennick)
  do_credits()
	- Use nanosleep() instead of usleep().  The latter is only
	  standard under BSD, whereas the former is POSIX compliant.
	  Accordingly, only include time.h if we use this function, i.e.
	  if NANO_EXTRA is defined. (DLR)
	- Add explanatory comment. (DLR)
- configure.ac:
	- Change instances of "int main ()" to "int main(void)". (DLR)
- faq.html:
	- Fixed inaccuracy: multibuffer mode was first in nano 1.1.0,
	  not 1.1.12. (DLR)
- nano.1, nanorc.5, nano.texi
	- Clarify the description for -T/--tabsize a bit. (DLR)
	- Add -E/--backupdir description. (Martin Ehmsen; minor cosmetic
	  fixes by DLR)
- nanorc.sample:
	- Add backupdir description. (Martin Ehmsen; minor cosmetic
	  fixes by DLR)
- README:
	- Reformat to 72 characters per line, fix wording in one spot,
	  and fix spacing and capitalization in several spots. (DLR)
- NEWS:
	- Capitalization fix. (DLR)
- TODO:
	- Clarify the paragraph searching item, and add item for
	  filename searches in the file browser. (DLR)

GNU nano 1.3.1 - 2004.01.09
- General:
	- Minor overhaul and abstraction of the lowest level of mouse
	  input, mostly adapted from the code in do_mouse() that handles
	  clicking on the shortcut list.  New function do_mouseinput();
	  changes to do_mouse(). (DLR)  David Benbennick: Add a few
	  efficiency/extensibility tweaks.
	- Modify the shortcut structure so that instead of having two
	  miscellaneous key values (misc1 and misc2), there is one key
	  value reserved for function keys (func_key) and one
	  miscellaneous key value (misc), and tweak the
	  shortcut-handling code to deal with this.  These changes allow
	  NANO_OPEN(PREV|NEXT)_ALTKEY to work properly when added to the
	  shortcut entries for NANO_OPEN(PREV|NEXT)_KEY.  Also remove
	  the values in the shortcut list and elsewhere that were made
	  redundant by the low-level input overhaul, use toupper()
	  instead of subtracting 32 from values for greater code
	  readability, and eliminate use of adding 32 to values when
	  testing for toggles, as get_kbinput_accepted() converts toggle
	  values to lowercase before returning them. (DLR)
	- Remove the workarounds for missing KEY_UP and KEY_DOWN, as
	  they appear to be holdovers of the old way of denoting the
	  search history shortcuts; if they aren't defined, KEY_LEFT and
	  KEY_RIGHT probably shouldn't work either, and all four appear
	  to be standard keys in termcap/terminfo in any case.  Add new
	  special sentinel key values NANO_NO_KEY (for no shortcut key)
	  and NANO_HISTORY_KEY (for search history keys, both Up and
	  Down), modify the shortcut list to use them, and modify the
	  shortcut display routines to handle them.  Also modify the
	  shortcut list code to not treat non-control character values
	  of val as Meta-sequences, and fix dependencies on that
	  behavior.  Also rename several variables: "alt" -> "meta",
	  "altval" -> "metaval". (DLR)
	- Hook up the verbatim input functions so that verbatim input
	  can be used in the edit window.  New function
	  do_verbatim_input(); changes to do_char(). (DLR)  Additional
	  minor tweaks to do_char() by David Benbennick.
	- Clarify the description of the --rebinddelete option. (DLR)
	- Miscellaneous comment tweaks, and copyright year updates in
	  the comments and in do_credits(). (DLR)
- cut.c:
	- Overhaul to increase efficiency and add various cleanups.
	  Changes to add_to_cutbuffer(), cut_marked_segment(), and
	  do_uncut_text(). (David Benbennick)
- files.c:
  check_operating_dir()
	- Add an assert to ensure that full_operatingdir isn't NULL,
	  a fix for reporting nonexistent (incomplete) directory names
	  as being outside the operating directory when tab completion
	  is being used, and cosmetic cleanups. (David Benbennick)
  copy_file()
	- New function used to create a copy of a file, split out from
	  do_writeout(). (David Benbennick)
  write_file()
	- Completely overhauled to properly ignore appending/prepending
	  to symlinks when NOFOLLOW_SYMLINKS is defined, to properly
	  support writing a selection to a file under the changed
	  cutting code, to have more concise error messages, to add
	  various cleanups, and so on. (David Benbennick)
  do_writeout()
	- Prompt the user if we're trying to save an existing file (and
	  not just a selection of it) under a different name. (DLR;
	  suggested by Jean-Philippe Guérard)
	- Overhaul the code used to write a selection of a file to
	  temporarily set fileage and filebot to the top and bottom of
	  the selection and then call write_file(), instead of following
	  the old hackish behavior with cut_marked_segment() (which
	  won't work after the cutting code changes anyway). (David
	  Benbennick)  DLR: Tweak to not add an extra blank line to the
	  end of the written selection if the cursor is at the beginning
	  of the last line of the selection.
  open_prevfile(), open_nextfile()
	- For consistency with the rest of the multibuffer code, change
	  "No more open files" to "No more open file buffers". (DLR)
  do_browser()
	- Allow '?' to open the help browser, and readd the ability of
	  'G'/'g' to open the "Go to Directory" prompt (which was
	  erroneously removed before), for compatibility with Pico.
	  (DLR)
- global.c:
  shortcut_init()
	- Allow WHEREIS_NEXT_KEY to be used in view mode. (DLR)
- nano.c:
  do_int_spell_fix()
	- Add comment explaining why findnextstr() is called with
	  bracket_mode set to TRUE even though we aren't doing a bracket
	  search. (DLR)
  do_para_operation()
	- Convert to use the new low-level input functions. (DLR)
  main()
	- Remove unused variable option_index. (DLR)
	- Fix omission of NANO_NO_KEY in the shortcut list scanning
	  code. (DLR)
	- Remove now-unnecessary initialization of kbinput. (DLR)
- nano.h:
	- Comment additions and cosmetic tweaks. (DLR)
- search.c:
  findnextstr(), do_replace_loop()
	- Fix potential infinite loops and other misbehavior when doing
	  beginning-of-line or end-of-line regex replacements ("^", "$",
	  and "^$").  Add a no_sameline parameter to findnextstr(), and
	  set it in the calls in do_replace_loop() when such regexes are
	  found, so that such regexes are only found once per line.
	  Also change length_change from a long to an int; size_t is
	  unsuitable due to its being unsigned. (DLR; found by Mike
	  Frysinger and DLR)  David Benbennick: Add a few minor cleanups
	  to do_replace_loop().
- winio.c:
  get_kbinput(), get_accepted_kbinput()
	- Don't pass in the value of the REBIND_DELETE flag anymore.
	  Instead, handle it directly inside the functions. (DLR)
  get_accepted_kbinput()
	- Translate Ctrl-8 into NANO_DELETE_KEY (or NANO_BACKSPACE_KEY
	  if REBIND_DELETE is set), since it apparently is generated
	  sometimes even when keypad() is TRUE. (DLR)
	- Translate KEY_SLEFT into NANO_BACK_KEY and KEY_SRIGHT into
	  NANO_FORWARD_KEY, since they are sometimes generated by
	  Shift-Left and Shift-Right. (DLR)
  get_ascii_kbinput()
	- Tweak to make it slightly more readable. (DLR)
  get_verbatim_kbinput()
	- Modify to take an extra parameter indicating if we should
	  interpret ASCII codes or not. (DLR)
  get_escape_seq_kbinput()
	- Expand to deal with more broken terminals that don't generate
	  keypad values.  Support the escape sequences for Insert,
	  Delete, Home, End, PageUp, and PageDown, [arrow key],
	  Ctrl-[arrow key], and Shift-[arrow key] when needed in the
	  Linux console, the FreeBSD console, the Hurd console, xterm,
	  rxvt, and Eterm.  Also, use get_verbatim_kbinput(), with ASCII
	  interpretation disabled, to read in the sequences. (DLR)
  get_skip_tilde_kbinput()
	- Removed, as it is unneeded due to the expansion of
	  get_escape_seq_kbinput(). (DLR)
  get_mouseinput()
	- Modify to take an extra parameter indicating if we should
	  ungetch() the key equivalents of shortcuts we click on or not.
	  (DLR)
  nanogetstr()
	- Properly interpret the Meta key value in misc if we hit it at
	  the statusbar prompt. (DLR)
  do_yesno()
	- Add a few efficiency/extensibility tweaks. (David Benbennick)
	- Convert to use the new low-level input functions, and remove
	  two last hardcoded widths left after the above tweaks. (DLR)
  do_replace_highlight()
	- Display a highlighted space if the word length is zero, so
	  that we can see zero-length regexes we're replacing. (DLR;
	  suggested by Mike Frysinger)
- configure.ac:
	- Check for glib 2.x and then 1.2.x if we need glib. (DLR)
- faq.html:
	- Add question explaining how verbatim input works, as well as a
	  few minor fixes. (DLR)
- nano.1, nanorc.5:
	- Add nano version numbers (minus any "-cvs" suffixes). (DLR)
- nano.spec.in:
	- Update for the 1.3 branch of nano. (DLR)
- NEWS:
	- Reformat so all lines are limited to 72 columns, add a few
	  typo fixes, and make a few minor cosmetic cleanups. (DLR)
- THANKS:
	- Add Danilo Segan, for the Serbian translation.

GNU nano 1.3.0 - 2003.10.22
- General:
	- Complete overhaul and abstraction of the lowest level of
	  keyboard input, mostly rewritten but incorporating a few bits
	  from the old functions and adding support for Pico's Esc Esc
	  [three-digit decimal ASCII code] input method.  New functions
	  get_kbinput(), get_verbatim_kbinput(), get_ignored_kbinput(),
	  get_accepted_kbinput(), get_ascii_kbinput(),
	  get_escape_seq_kbinput(), and get_skip_tilde_kbinput().  These
	  should work properly on FreeBSD (due to code and input
	  provided by Lee Nelson and Wouter van Hemel, respectively).
	  (DLR)
	- The -K/--keypad command line/rcfile option has been removed,
	  and keypad() is now always TRUE.  keypad_on() in winio.c and
	  the check for _use_keypad in configure.ac have both been
	  removed. (DLR)
	- The -d/--rebinddelete command line/rcfile option, equivalent
	  to Pico's -d, has been added.  It is intended to work around
	  the problem with Backspace/Delete confusion on some terminals,
	  notably FreeBSD; if your Backspace key acts like Delete, this
	  option will fix that. (DLR)
	- Remove unneeded breaks at the ends of default: clauses. (DLR)
	- Add the ability to repeat the last search without prompting
	  via Meta-W, and move the line wrapping toggle to Meta-L.  New
	  function do_research(). (Wouter van Hemel)
	- Added the ability to move to the beginning or end of the
	  paragraph, which Pico has via ^W^W (previous paragraph)
	  and ^W^O (next paragraph).  Changes to do_justify(); new
	  functions do_para_operation(), do_para_begin(), and
	  do_para_end().  Note that the last three functions are
	  disabled if justification is disabled. (DLR)
	- Make sure the "historylog" option isn't included at all if
	  NANO_SMALL is defined. (DLR)
	- Source reorganization: move code to src/, docs to doc/.
	  (Jordi)
	- Translation updates (see po/ChangeLog for details).
	- Since SAMELINEWRAP is only used in nano.c, make it a static
	  variable in nano.c instead of a flag, and surround all
	  wrap_reset() calls with DISABLE_WRAPPING #ifdefs. (DLR)
	- Change enum "topmidbotnone" to "topmidnone", as there's no
	  BOTTOM option anymore. (DLR)
	- Split out the string-displaying routine from update_line()
	  into a separate function; convert the edit window, statusbar
	  display, and statusbar prompt to use it, so that they can all
	  properly display control characters and tabs; free and NULL
	  the backup search string in one place in the search code
	  instead of several; and do some other minor refactoring of
	  related display functions to simplify them.  New functions
	  mark_order() and display_string(); new macro charmove();
	  changes to actual_x(), strnlenpt(), blank_bottombars(),
	  blank_edit(), get_page_start(), edit_add(), update_line(),
	  statusbar(), and do_replace_highlight(). (David Benbennick)
	  DLR: Add minor cosmetic tweaks, add missing NANO_SMALL #ifdef
	  around the text for a backwards search in the refactored code,
	  and enclose dump_buffer() and dump_buffer_reverse() in one
	  ENABLE_DEBUG #ifdef instead of two.
	- Convert memmove() function calls to charmove() macro calls, as
	  the former all work on char*'s. (DLR)
	- Miscellaneous #define cleanups: only include the prototype for
	  and definition of wrap_at if wrapping and/or justification are
	  enabled, remove duplicate wrap_at prototype, and define
	  DISABLE_MOUSE if NCURSES_MOUSE_VERSION isn't defined in nano.h
	  instead of all over the code. (DLR)
	- Autogenerate the html versions of the manpages in the
	  Makefile.am's in doc/man/, make sure that they're properly
	  installed via "make dist", and make sure that "make distcheck"
	  works too.  Also be sure to set EXTRA_DIST properly. (Jordi,
	  DLR and Jeff Bailey)
- files.c:
  read_file()
	- After we've read in a file and possibly converted it from
	  DOS/Mac format, set fileformat back to 0 to prevent erroneous
	  conversion messages when we read other files in. (DLR)
  do_browser()
	- Some of the Pico compatibility options in the file browser
	  that don't work properly for current Pico have been removed.
	  Backspace, 'g', 'l', 'q', and 'u' are invalid.  'd' deletes
	  the highlighted file, and 'r' renames the highlighted file;
	  neither of these are implemented. (DLR)
- global.c:
  toggle_init()
	- Change the message for the line wrapping toggle from "Auto
	  wrap" to "Auto line wrap", to more clearly associate it with
	  Meta-L. (DLR)
  shortcut_init()
	- Change multibuffer-enabled references to
	  opening/closing/toggling the previous/next loaded file to
	  toggling/switching to/closing the previous/next file buffer,
	  for consistency with other references. (DLR)
- nano.c:
  window_init()
	- Set keypad() to TRUE regardless of whether PDCurses is being
	  used, as Meta-X apparently turns it off even under ncurses.
	  (DLR)
  do_backspace()
	- Vastly simplify, and remove dependency on page_up(). (David
	  Benbennick)
  help_init()
	- Document the support for Esc Esc [character]'s being
	  interpreted as Ctrl-[character], and the support for Pico's
	  Esc Esc [three-digit decimal ASCII code] input method. (DLR)
  do_mark()
	- Toggle MARK_ISSET at the beginning of the function instead of
	  setting it in one place and unsetting it in another place.
	  (David Benbennick)
  do_suspend()
	- Use handle_hupterm() to handle SIGHUP and SIGTERM so we can
	  properly deal with them while nano is suspended. (DLR; problem
	  found by David Benbennick)
  abcd()
	- Removed, as it's unneeded due to the low-level input overhaul.
	  (DLR)
- nano.h:
	- Define KEY_RESIZE and KEY_SUSPEND as -1 when slang is used, as
	  slang has no equivalent of either.  When nano is compiled with
	  slang support, resizing the window doesn't generate
	  KEY_RESIZE, and pressing Ctrl-Z to suspend nano at the Linux
	  console with keypad(TRUE) generates Ctrl-Z instead of
	  KEY_SUSPEND, both unlike ncurses. (DLR)
	- Define KEY_RESIZE as -1 if it isn't defined, as it isn't in
	  the curses library included with SunOS 5.7-5.9.  Also define
	  KEY_SUSPEND as -1 if it isn't defined, in case it isn't in
	  more than just Slang. (DLR)
	- Define all potentially missing keys as different negative
	  values (ERR is -1, so use -2, -3, etc.) so as to avoid having
	  duplicate case values when keys are missing. (DLR)
- move.c:
	- Remove unneeded inclusion of stdio.h, make various cleanups,
	  and preserve the cursor's coordinates when paging up and down.
	  (David Benbennick)  DLR: Readd the ability to behave the old
	  way while paging, make it so the new behavior is only used in
	  smooth-scrolling mode, and modify page_down() to always go
	  down a full page (even when there's less than one page of text
	  left) for consistency.
  page_up()
	- Removed due to rewrite of movement functions. (David
	  Benbennick)
- proto.h:
	- Surround the do_prev_word() and do_next_word() prototypes with
	  NANO_SMALL #ifdefs, since the actual functions aren't included
	  in tiny mode. (DLR)
- rcfile.c:
  parse_colors()
	- Generate an error if we try to use a bright background color
	  in a nanorc file. (DLR; found by Brand Huntsman)
	- Make sure all rcfile error messages are capitalized, for
	  consistency. (DLR)
- winio.c:
  get_verbatim_kbinput()
	- Fix a silly memory corruption bug that would occur when trying
	  to read a sequence of more than one key verbatim. (DLR)
  get_accepted_kbinput()
	  Handle Ctrl-{ to Ctrl-~ correctly, and drop support for
	  converting Esc ` to Esc Space, since making Meta-[key]
	  correspond to Ctrl-[key] in all cases is inconsistent due to
	  the different natures of Control and Meta key sequences. (DLR)
  do_first_line()
	- Call edit_update() with TOP instead of CENTER; both do the
	  same thing, but it works faster with TOP. (DLR)
  nanogetstr()
	- Don't let the user type in ASCII 127 at the statusbar prompt.
	  (DLR)
  titlebar()
	- Fix problem with the available space for a filename on the
	  titlebar's being short by one. (DLR)
  edit_add()
	- Fix problems with the marking highlight's being drawn
	  improperly in some cases. (DLR)
  edit_update()
	- Tweak for efficiency and remove the fix_editbot() call. (David
	  Benbennick)
  do_credits()
	- Update the copyright years to "1999-2003", to match those
	  given in the rest of the code. (DLR)
- configure.ac:
	- Change instances of "GNU Nano" to "GNU nano" for consistency.
	  (DLR)
- nano.1, nanorc.5, nano.texi:
	- Change all instances of $SYSCONFDIR to SYSCONFDIR, since
	  SYSCONFDIR is set at compile time and can't be overridden by
	  setting SYSCONFDIR in the environment. (David Benbennick)
	- Remove -K/--keypad, and document -d/--rebinddelete. (DLR)
	- Document the support for Esc Esc [character]'s being
	  interpreted as Ctrl-[character], and the support for Pico's
	  Esc Esc [three-digit decimal ASCII code] input method, if
	  applicable. (DLR)
	- French translation by Jean-Philippe Guérard.
- nano.1.html, nanorc.5.html:
	- Regenerated. (DLR)
- nanorc.sample:
	- Remove duplicate "historylog" entry, remove "keypad" entry,
	  and add "rebinddelete" entry. (DLR)
	- Update and add comments to the regexes for nanorc files.
	  (Brand Huntsman)
	- Fix an attempt at a bright background color in the sample Java
	  source regexes. (DLR)
	- Since tabs are shown as groups of spaces, they are interpreted
	  as such when parsed by color regexes.  Accordingly, simplify
	  regexes that handle both spaces and tabs to just handle
	  spaces, as the results are the same. (DLR)
- AUTHORS:
	- Updated to show 1.2/1.3 maintainers.

GNU nano 1.2.2 - 2003.08.11
- General:
	- Translation updates (see po/ChangeLog for details).
	- Change uncast nrealloc()s assigned to char pointers/arrays to
	  charealloc()s, and cast all other nrealloc()s and all
	  nmalloc()s. (David Benbennick and DLR)
	- Remove gettext marks from all debug messages. Good for developers,
	  better for translators. (Jordi)
	- Add translator comments on strings that should be short, like in
	  status bar strings, etc. (Jordi)
- utils.c:
  align()
	- Tweak to avoid a potential problem when strp is non-NULL but
	  *strp is NULL. (David Benbennick)
  nstricmp(), nstrnicmp()
	- Add these functions, equivalent to strcasecmp() and
	  strncasecmp(), and convert nano to use them when strcasecmp()
	  and/or strncasecmp() are unavailable. (DLR)
- winio.c:
  do_help()
	- Get rid of keypad_on() call for bottomwin, which should not be
	  needed. (DLR)
  nanogetstr()
	- Fix problem with search history where a temporary string
	  added at the bottom of the history (but which was not in the
	  history) would not be preserved after scrolling down to the
	  blank bottom entry and then scrolling back up. (DLR)
	- Fix problem where pressing down,up,down does not blank the
	  search prompt but keeps the previous search. (DLR)
	- Handle Alt-[-F and H (DLR, fixed home and end not working with
	  -K in statusbar).
- configure.ac:
	- Change the program used to detect a broken regexec() function
	  so that it works properly, using information found at
	  http://sources.redhat.com/ml/libc-hacker/2001-06/msg00015.html.
	  (DLR)
- nanorc.sample:
	- Revised comment explaining the non-escaping of quotes to cover
	  non-escaping of all shell-interpreted characters. (DLR)
	- Fixes to the descriptions and examples in the comments, and
	  changes to some default values. (David Benbennick and DLR)
	- Add regexes for Perl syntax. (Richard Smith, tweaked for
	  greater efficiency by David Benbennick)
	- Add regexes for Java source syntax. (David Benbennick)
	  Regex for C++-style comments (colored the same way as C-style
	  comments) added by DLR.
- THANKS:
	- Added Laurentiu Buzdugan, for Romanian.
	- Added Geir Helland, for Norwegian Bokmål.
- TODO:
	- Move the items for nano 1.2 to the "Old Requests" section,
	  and mark color syntax highlighting as done. (David Benbennick)
- faq.html:
	- Added question about nano's not showing color when it's
	  compiled with color support. (DLR; suggested by Jordi)
- nano.1, nanorc.5:
	- Formatting improvements by Jean-Philippe Guérard.
	- Minor fixes by DLR.
- nano.1.html, nanorc.5.html:
	- Regenerated from nano.1 and nanorc.5. (DLR)

GNU nano 1.2.1 - 2003.04.19
- General:
	- Translation updates (see po/ChangeLog for details).
	- Work around broken regexec() on some systems that segfaults
	  when passed an empty string.  This is known to be in glibc
	  2.2.3.  New function regexec_safe(). (David Benbennick)
	- Fix various bugs with search string history logging: don't
	  print a broken error message and freeze if ~/.nano_history is
	  unreadable, actually show an error message in save_history()
	  if ~/.nano_history is unwritable, and prevent ~/.nano_history
	  from being completely overwritten by save_history() if it's
	  unreadable but writable. (David Benbennick)
	- Only unset KEEP_CUTBUFFER in main() when we do something other
	  than cut text in the main input loop, instead of unsetting it
	  all over the place (which, as written, didn't handle cases
	  like a cut followed by M-Space properly).  Also, instead of
	  checking for keyhandled's not being set inside the for loops,
	  do it in if blocks surrounding the for loops to increase
	  efficiency. (David Benbennick)  DLR: Also unset KEEP_CUTBUFFER
	  if we hit a shortcut key other than the one for cutting text.
	- Make it so a marked cut immediately followed by an unmarked
	  cut tacks the latter's text onto the end of the former's text
	  instead of putting it on a new line, as Pico does. (DLR)
	- Convert instances of "(char *)nrealloc()" to the macro
	  charealloc(), which does the same thing. (DLR)
	- Change justify_mode from a boolean int to a flag. (DLR)
- cut.c:
  do_cut_text()
	- Tweak where KEEP_CUTBUFFER is set so that a marked cut
	  immediately followed by an unmarked cut preserves the
	  cutbuffer between the two. (David Benbennick)  DLR: Also
	  properly set KEEP_CUTBUFFER in tiny mode.
  do_uncut_text()
	- If we're about to uncut on the magicline, always make a new
	  magicline in advance, as Pico does. (DLR)
- global.c:
  shortcut_init()
	- Simplify the #ifdef used to enable file insertion in view mode
	  if multibuffer support has been compiled in. (DLR)
- nano.c:
  justify_format()
	- If we shave spaces off the end of the line, make sure totsize
	  is properly updated. (DLR; much simplified by David
	  Benbennick)
- nano.h:
	- Simplify #ifdefs relating to HAVE_STRCASECMP and
	  HAVE_STRNCASECMP. (David Benbennick)
- search.c:
  goto_abort()
	- Removed, with all instances replaced with display_main_list(),
	  since with the removal of all the scattered calls to
	  SET(KEEP_CUTBUFFER), that function was all that was left of
	  it. (DLR)
  do_find_bracket()
	- If a matching bracket wasn't found, call update_line() after
	  setting current and current_x back to their original values,
	  in case current_x's original value is greater than the width
	  of the screen. (DLR)
- winio.c:
  nanogetstr()
	- Remove a few unnecessary breaks occurring immediately after
	  gotos, and properly interpret the up and down arrow keys when
	  ALT_KEYPAD is set. (DLR)
- configure.ac:
	- Enable autodetection of broken regexec(). (DLR) Re-added
	  regex.h check to ensure compile under Debian w/autoconf 1.6.
- README:
	- Update obsolete 1.1.x information.
- TODO:
	- Fix typo. (David Benbennick)
- faq.html:
	- Update RPM links for nano 1.2.x. (DLR)

GNU nano 1.2.0 - 2003.02.19
- General:
	- Translation updates (see po/ChangeLog for details).
- files.c:
  read_file()
	- If the file we're loading has already been detected as a DOS
	  or Mac formatted file, don't turn on NOCONVERT if we find
	  binary chars in it.  This is because if it's detected as
	  DOS/Mac format, at least one line has already been converted,
	  so setting NOCONVERT (which is supposed to signal that none
	  of the file should be converted) makes no sense. (DLR)
- nano.c:
  justify_format()
	- Fix ugly behavior when wrapping spaces at the end of long
	  words. (David Benbennick)
- nanorc.5:
	- Fix formatting error and update copyright year. (Jordi)
	- Several enhancements. (David Benbennick)

GNU nano 1.1.99pre3 - 2003.02.13
- General:
	- Translation updates (see po/ChangeLog for details).
	- Fix globals and externs such that nano will compile with
	  DISABLE_SPELLER. (David Benbennick)
	- Fix unreasonable fill values by wrapping at length 0 instead
	  of erroring out, and don't start up if the window size is too
	  small but fill is set reasonably.  Changes to
	  nano.c:global_init(), window_init(), and handle_sigwinch().
	  New macro MIN_EDITOR_COLS replaces MIN_FILL_LENGTH.
	  (David Benbennick)
	- Change ngettext macro to P_(), to avoid a clash with the
	  reserved C __ identifier. (Jordi)
	- Memory leak fixes for files.c:do_insertfile(),do_browser(),
	  nano.c:do_spell(), and search.c:do_replace() (David
	  Benbennick).
	- Remove do_preserve_msg, as using -p still gives Pico-style
	  string behavior, so an annoying message every invocation is
	  probably unneeded (all cheer).
	- Change resetpos function to be global (now called
	  resetstatuspos.  Fixes annoying but small odd problem with
	  cursor placement when inserting a file.  This needs to be done
	  better in 1.3 (originally by David Lawrence Ramsey).  Added
	  this issue to TODO.
- files.c:
  cwd_tab_completion()
	- Memory leak fix. (David Benbennick)
  input_tab()
	- Fix assumption that matches is null terminated. (David
	  Benbennick)
  load_history()
	- Fix segfault on loading huge strings from history file.
	  (David Benbennick)
  load_history(), save_history()
	- Changed to look at $HOME before getpwuid(geteuid()), see
	  details in comment for rcfile.c:do_rcfile().
  real_dir_from_tilde()
	- Change check for the running user's home dir to use
	  getpwuid(geteuid()) rather than a getpwent() loop
	  (suggested by Jordi).
- nano.c:
  breakable()
	- Fix incorrect return value on short lines. (David Benbennick)
  do_help()
	- Fix line lengths not being computed properly, causes display
	  glitches most noticeable with < 20 rows.  New function
	  nano.c:line_len(). (David Benbennick)
  do_justify()
	- Add regfree() to quote regex. (David Benbennick)
	- Only copy previous indent if AUTOINDENT is set. (David
	  Benbennick)
  do_suspend()
	- Fix untranslated message. (David Benbennick)
  do_wrap()
	- Fix isspace() call to operate on int.
  help_init()
	- Fix crashing in do_help when COLS < 23. (David Benbennick)
  main()
	- Fix nano not compiling with ENABLE_RCFILE and DISABLE_TABCOMP.
	  (David Benbennick)
	- Silence annoying compiler messages about clobbering and
	  uninitialized variables by moving variable inits to the top
	  of main() and re-initializing them after the sigsetjmp().
- rcfile.c:
  colortoint()
	- Don't bomb after invalid color and print bad color name.
	  (David Benbennick)
  colortoint, parse_colors()
	- Don't add strings with invalid fg colors at all.
  do_rcfile()
	- Revert (somewhat) previous behavior of looking at
	  $HOME, and only run getpw* if it is NULL.  Most *nix programs
	  seem to only care about $HOME, and at the user-level
	  getpw* may not be reliable (and it's slower).
- search.c:
  do_gotoline()
	- Only goto_abort() if we *didn't* abort the command, making
	  the function seem horribly misnamed. ;-) (David Benbennick)
- winio.c:
  browser_init(), striponedir(), do_browse_from()
	- Various memory leak fixes. (David Benbennick)
  do_yesno(), do_help()
	- Add defined(NCURSES_MOUSE_VERSION) to macro so systems that
	  don't understand MEVENT will compile.
  nanogetstr()
	- Remove unnecessary reset of x since it is now handled
	  elsewhere. (David Lawrence Ramsey)
  statusq()
	- Always blank the statusbar on exit. (David Benbennick)
- nano.1, nano.1.html:
	- Add initialization file comments, change some options from
	  bracketed to underlined to emphasize that they are not
	  optional.
	- Add SEE ALSO section. (Jordi)
	- Moved nano.1 color and syntax sections to nanorc, pointed
	  nano.1 to nanorc.5 for initialization file.  Changed
	  nanorc.5 variables to be italics to match nano.1.  Added
	  nanorc.5.html to CVS tree.
- nanorc.5:
	- Add nanorc manpage, with descriptions of all available commands.
	  (Jordi)
- nanorc.sample:
	- Make nanorc entry less tolerant of invalid colors.
- nano.spec.in:
	- Change default flags to --enable-all.
- THANKS:
	- Add Kalle Kivimaa and Kalle Olavi Niemitalo, for Finnish. (Jordi)
- UPGRADE:
	- Add upgrading information document for 1.0 users. (Jordi)

GNU nano 1.1.99pre2 - 2003.02.03
- General:
	- Changed some translatable debug messages to use %s
	  instead of the function name, and removed gettext from
	  two strings that had no actual words in them that
	  should be translated.	 Suggested originally by
	  Christian Rose.
	- Fix subexpression replacement to work consistently.
	  Affects search.c:replace_regexp() and
	  utils.c:strstrwrapper(). (David Benbennick)
	- Fix cursor position being saved when escaping out
	  of nanogetstr with keys like ^Y and ^V.  New arg
	  resetpos to nanogetstr(), added static int
	  resetpos in statusq() (bug found by DLR).
	- Fix constant curpos updates from obliterating other
	  system messages, and fix statusbar message length.
	  Affects files.c:load_open_file(), nano.c:main(),
	  search.c:findnextstr(), winio.c:statusbar() and
	  do_cursorpos(). (David Benbennick)
	- Fix nano crashing when searching/replacing an invalid
	  regex (try "^*").  Changed regexp_init() to return
	  1 or 0 based on regcomp()'s return value and search_init
	  to exit with an error message (sorry Jordi!).  Added
	  another check when using last_search instead of answer.
	- Move regcomp into rcfile.c rather than each display refresh
	  of winio.c.  New function rcfile.c:nregcomp().
	  This fixes much of nano's resource hogging behavior
	  in syntax highlighting. (David Benbennick).
	- Fix justify failing for certain lines, new function
	  nano.c:breakable(). (David Benbennick)
	- Fix screen getting trashed on signals nano can catch
	  (TERM and HUP).  New global variable curses_ended,
	  changes to winio.c:statusbar() and nano.c:die().
	  (David Benbennick)
- cut.c:
  do_cut_text()
	- Fix incorrect cursor location when cutting long lines.
	  (David Benbennick)
- files.c:
	- Set a default PATH_MAX for getcwd() etc calls. (David
	  Benbennick)
  do_browse_from()
	- Fix path checking to fix bad paths, escaping
	  the operating directory, new function readable_dir(). (David
	  Benbennick)
  do_browser()
	- Fix incorrect path check for check_operating_dir().
	  (David Benbennick)
	- Fix goto directory operating dir check and tilde expansion.
	  (David Benbennick)
	- Even more checks and operating dir fixes. (David Benbennick)
  do_insertfile()
	- Add some more checks and fix recursion when toggling
	  multibuffer. (David Benbennick)
  open_file()
	- Fix FD leak with file load error. (David Benbennick)
  add_open_file()
	- Revert the fix for the supposed minor logic error from before;
	  it was keeping some updates from happening when they should,
	  which was leading to segfaults with both multibuffer and view
	  mode on. (DLR; found by David Benbennick)
  save_history()
	- Fix nrealloc return value being ignored. (David Benbennick)
	- Fix off-by-one bug causing write to unallocated memory.
	  (David Benbennick)
- global.c:
  thanks_for_all_the_fish()
	- Fix compiling with DEBUG and multibuffer. (David Benbennick)
- nano.c:
  do_char()
	- Remove unneeded check_statblank(). (David Benbennick)
  do_int_spell_fix(), do_int_speller()
	- Fix crashes with mark position, current_x position,
	  and edit_update args. (David Benbennick)
  do_justify()
	- Unset KEEP_CUTBUFFER so nano won't crash with subsequent
	  ^K cuts and justifies. (David Benbennick)
  do_mouse()
	- Fix the mouse code to work with lines longer than COLS and
	  with the proper positioning, including special characters.
	  (David Benbennick)
  do_preserve_msg():
	- Unsplit error message into a single fprintf call. (Jordi)
  main()
	- Call load_file with arg 0 for insert, as we aren't really
	  doing an insert, allows new_file() to run if we open a
	  non-file at startup.
  usage()
	- Remove gettext markings from -p/--preserve. (Jordi)
	- Revamp -H option message to fit in 80 column terminal.
  window_init()
	- Fix leaking *WINDOWs (no pun intended). (David Benbennick)
- search.c:
  do_search(), do_replace_loop()
	- Fix edit_update call to use CENTER instead of current_x
	  (related to David Benbennick's fixes for spelling).
  do_replace_loop()
	- Fix various bugs having to do with replace string length
	  and positioning. (David Benbennick)
  edit_refresh()
	- Fix cursor being above as well as below the current screen.
	  (David Benbennick)
- winio.c:
  bottombars()
	- Change strcpy of gettext() "Up" string to strncpy of max
	  width 8, to stop stupid strcpy crash.
  do_yesno()
	- Fix mouse interaction bugs with yes/no prompt. (David Benbennick)
- nanorc.sample:
	- Change comment to say magenta instead of purple.

GNU nano 1.1.99pre1 - 2003.01.17
- General:
	- New date format for NEWS and ChangeLog.
	- Completely removed PICO_MODE, as with the search/replace
	  history patch we should have the extended functionality we can
	  without being incompatible with Pico.  Removed all code for
	  different search/replace string editing and alternate shortcut
	  list.  I'm sure I won't even have to ask for feedback on this
	  one :-)
	- Add in Pico's -p flag, (-p, --preserve).  To preserve the XON
	  and XOFF keys (^Q and ^S).  Add warning if we invoke -p and
	  add checks for using --preserve (to skip warning) and --pico
	  (to force showing it).   New flag PRESERVE, function
	  do_preserve_msg(), changes to main(), signal_init().
	- Search history and replace history up/down cursor arrows,
	  w/history tab completion, not available w/NANO_SMALL.  Changes
	  to statusq(), others (Ken Tyler).  Added shortcut to
	  search/replace shortcuts so people will know it's there,
	  forced KEY_UP and KEY_DOWN defs in nano.h (Chris, in case
	  blame needs to be placed later).  Minor fixes by DLR: allow ^P
	  and ^N as alternatives to the up and down arrows, make sure
	  the "Up" shortcut is displayed properly in the help menu,
	  remove a few bits of unneeded and/or warning-generating code,
	  and fix some missing statusq() prompts with --enable-tiny.
	- Added search/replace history log.  Flag -H, --historylog.
	  Flags HISTORY_CHANGED and HISTORYLOG (only room for one more
	  flag!), added entries in nanorc.sample, new functions
	  log_history and save_history. (Ken Tyler)
	- Translation updates (see po/ChangeLog for details).
	- Forward-ported Chris' --disable-wrapping-as-root option from
	  1.0.9.  Per Jordi's suggestions, have it override
	  $SYSCONFDIR/nanorc but not ~/.nanorc. (DLR)
	- Change all references to /etc/nanorc in the documentation to
	  $SYSCONFDIR/nanorc. (DLR)
	- Minor cosmetic tweaks to the ngettext() macro, and fix to
	  properly detect systems lacking ngettext() and correctly
	  compile on them; the previous fix didn't work. (DLR)
	- Fix problems with some code sections' not being #ifdef'ed out
	  when they should be, or being #ifdef'ed out improperly. (David
	  Benbennick and DLR)
	- Change FOLLOW_SYMLINKS to NOFOLLOW_SYMLINKS, and rework the
	  associated logic accordingly, throughout the code. (David
	  Benbennick)
	- Rework #ifdefs to not include mouse_init() at all if
	  DISABLE_MOUSE is defined or NCURSES_MOUSE_VERSION isn't. (DLR)
	- For consistency, change many references of (!x) to (x == NULL)
	  and (x) to (x != NULL). (DLR)
	- Define KEY_IC properly (and KEY_DC more portably) when slang
	  support is enabled, and remove the hack to work around the
	  former's not being defined. (David Benbennick and DLR)
	- Miscellaneous tweaks to update_color() calls, to make sure
	  they're called at the right times and that refreshes are done
	  afterwards only when needed. (David Benbennick)
	- Renamed [have_]past_editbuff [have_]search_offscreen. (DLR)
	- Add the "preserve" option to the nanorc file, to match
	  nanorc.sample. (DLR)
	- Fixed awful scrolling in do_int_speller.  Problem was
	  findnextstr() calling edit_update(), though screen updating
	  is not its business.  Added checks in do_search() and
	  do_replace_loop() to do the checks.  It really should not be
	  done here, as some function in winio.c should handle this,
	  but I can't seem to find a good place to put this check.
	- Updated all copyright notices to say 2003 rather than 2002, as
	  nearly all the source files have been worked on this year.
	  (DLR)
- configure.ac:
	- Added tr and eu to ALL_LINGUAS. (Jordi)
	- Fix now inaccurate description of --enable-tiny's effects; it
	  no longer disables NLS support. (DLR)
	- Fix typo. (David Benbennick)
	- Check for strcasecmp() and strncasecmp(), since they are
	  apparently only standard under BSD. (DLR)
	- Small cleanups. Add copyright header, add autopoint support and
	  define bug report address and full package name in AC_INIT. Move
	  ALL_LINGUAS to po/LINGUAS, recommended place for gettext 0.11.
	- Added --enable-all option to compile in all the extra stuff
	  we'd normally need extra flags for.
- color.c:
  update_color():
	- Remove an unneeded edit_refresh() call after do_colorinit().
	  (David Benbennick)
- cut.c:
  do_cut_text()
	- Fix a memory corruption problem caused by accessing edittop
	  after it was freed but before it was reset to a sane value
	  from current. (David Benbennick)
  do_uncut_text()
	- If uncutting more than one line of unmarked text at editbot,
	  don't center the screen, since Pico doesn't. (DLR)
	- If uncutting previously unmarked text, uncut to end if we're
	  not at the beginning of the line, and set placewewant to 0 if
	  we are.  This matches Pico's behavior. (DLR)
- files.c:
  load_file()
	- Remove unneeded wmove() call. (David Benbennick)
  read_line()
	- Miscellaneous cleanups. (David Benbennick)
  open_file()
	- If we're in multibuffer mode and there's an error opening the
	  file in read-only mode, display the error message on the
	  statusbar regardless of the value of quiet. (DLR)
  read_file()
	- Miscellaneous cleanups. (David Benbennick)
	- Fix len's being off by one when reading in Mac-format files,
	  exposed by one of David Benbennick's cleanups. (DLR)
	- If NO_CONVERT isn't set when we first enter, and it gets set
	  while reading in the file, unset it again afterwards. (DLR)
  do_insertfile()
	- If we're in multibuffer mode and there's an error opening the
	  file that we're trying to insert, close the new buffer that we
	  made to hold it and reload the buffer we had open before.
	  (DLR)
  add_open_file()
	- Fix minor logic error when determining when to resave fileage
	  and filebot. (DLR)
  load_open_file()
	- If switching between files when CONSTUPDATE is set, only force
	  a cursor position display update if DISABLE_CURPOS isn't set.
	  This will ensure that the "Switching to [file]" messages are
	  shown. (DLR)
  write_file()
	- Change lineswritten from a long to an int, to match
	  filestruct->lineno. (DLR; mismatch found by David Benbennick)
  real_dir_from_tilde()
	- Since this is needed for proper interpretation of paths
	  containing tildes and not just for tab completion, include and
	  use it regardless of whether tab completion is disabled.
	  (David Benbennick and DLR)
  input_tab()
	- Variable name change: matchBuf -> matchbuf. (DLR)
  diralphasort()
	- Remove the HAVE_STRCASECMP #ifdef block; see the changes to
	  configure.ac and nano.h for why. (DLR)
- global.c:
  thanks_for_all_the_fish()
	- Miscellaneous cleanups. (David Benbennick)
- move.c:
  do_page_down()
	- If there's a page or less of text, do an edit_update() if the
	  mark is on; otherwise, the highlight won't be displayed. (DLR)
- nano.c:
	- Added free_history() list calls clean up, added init of list
	  headers, and modified statusq() calls. (Ken Tyler)
  do_prev_word()
	- Make the assert match that in do_next_word(). (DLR)
  do_enter()
	- If smooth scrolling is on, and Enter is pressed on the
	  magicline, don't center the screen. (DLR)
  do_justify()
	- Fix memory corruption problem triggered when edittop and
	  current->next pointed to the same value and current->next was
	  destroyed during justification. (DLR)
	- Center the screen when justification moves the cursor entirely
	  off the bottom of the screen, instead of when it moves the
	  cursor near the bottom of the screen, to more closely match
	  Pico's behavior. (DLR)
  version()
	- Remove obsolete reference to --enable-undo. (David Benbennick)
	- Move up check for --disable-nls as it's independent of
	  --enable-tiny now. (DLR)
  do_int_speller()
	- Make internal spell program use sort -f and uniq to create a
	  less redundant word list.  [The only reason this is going in
	  during feature freeze is because the int speller is useless as
	  is and should either be improved or removed.  I chose
	  improved].
	- Change all child error checks to use one goto (gasp!) called
	  close_pipes_and_exit, so we don't leak FDs.
	- Fix FD leaks which occur outside of errors. (David Benbennick)
  do_int_speller(), do_alt_speller()
	- Programs now return char *, NULL for successful completion,
	  otherwise the error string to display.  This allows us to give
	  more useful feedback to the user when spell checking fails.
  ABCD()
	- Renamed abcd(). (DLR)
  main()
	- Remove an unneeded do_colorinit() call, do major cleanups, and
	  allow loading of multiple files on the command line when
	  multibuffers are used. (David Benbennick)
- nano.h:
	- Make sure NO_RCFILE and COLOR_SYNTAX aren't set to the same
	  value. (DLR; discovered by Ken Tyler)
	- If strcasecmp() and/or strncasecmp() aren't available, use
	  strcmp() and/or strncmp() instead. (DLR)
- proto.h:
	- Fix the #ifdef block for DISABLE_TABCOMP's being undefined
	  so that functions only used with tab completion are properly
	  #ifdef'ed out. (DLR)
- search.c:
  do_gotoline()
	- Don't call blank_statusbar_refresh() so if there's an error
	  returned in multibuffer mode, we can actually see it.
  do_search()
	- Remove erroneously introduced near-duplicate call to
	  update_history(). (DLR)
  print_replaced()
	- Remove and replace with an equivalent ngettext() call. (DLR)
  do_replace_loop()
	- Fix bug where if text on the magicline was replaced (which can
	  be done via a regexp replace of "^$" with something other than
	  ""), a new magicline wouldn't be created. (DLR)
	- Remove check for answer being a blank string, presumed to be
	  a PICO_MODE holdover, but it stops us from doing a blank
	  spelling replacement.
  do_replace()
	- For greater Pico compatibility, when an attempt to replace a
	  string results in 0 replacements due to the string's not being
	  found, display "[string] not found" instead of "Replaced 0
	  occurrences". (DLR)
- utils.c:
  is_cntrl_char()
	- Rework to fix a problem with displaying certain high-bit
	  characters. (David Benbennick; reported by Andrzej Marecki)
  align()
	- Don't just assert that the string passed in isn't NULL; check
	  that it isn't and only do the alignment when it isn't. (David
	  Benbennick)
  nmalloc(), nrealloc()
	- If the size passed to nmalloc() or nrealloc() is zero, don't
	  die with an erroneous out-of-memory error.  Also, change
	  their dying messages to "nano is out of memory!". (David
	  Benbennick)
  charalloc()
	- Removed and redefined as a macro that calls nmalloc(). (David
	  Benbennick)
- winio.c:
  nanogetstr()
	- Tweak to make the cursor stay in the same place if we hit a
	  prompt-changing toggle while it's in the middle of the string.
	  Reset it to -1 (so next time we come here, it'll be set to the
	  end of the string) if we leave the prompt via Enter or Cancel.
	  Also fix minor problem with search history where the current
	  search item could be at the bottom of the history twice in a
	  row under certain conditions. (DLR)
	- Remove parens in NANO_CONTROL_I check so nano won't complain if
	  just NANO_SMALL is defined. (David Benbennick)
  edit_refresh()
	- Miscellaneous cleanups that fix a bug where the screen
	  isn't updated after uncutting chunks of upwardly marked cut
	  text that are over a page in length. (David Benbennick)
  do_credits()
	- Add David Benbennick to credits. (DLR)
- nanorc.sample:
	- Added comment to explain the non-escaping of quotes in
	  color regexes, based on info provided by David Benbennick.
	  (DLR)
	- Added some examples for groff and the nanorc courtesy of
	  Robert D. Goulding.
	- Added double hash marks to comment lines, so people who
	  uncomment the beginning of every line won't get syntax errors.
- faq.html:
	- Miscellaneous fixes and updates for typos, broken links, and
	  slashes at the end of directories.  It is now fully compliant
	  with HTML 4.01 Transitional. (DLR and David Benbennick)
	- Added docs about the new unified search string interface and
	  search histories, and added --enable-all into configure docs.
- nano.texi:
	- Typo fixes and updates. (David Benbennick)
	- Updates for the most recent and not so recent changes.
- nano.1, nano.1.html
	- Updated for the --preserve and --historylog options.
- TODO
	- Added some wishlist stuff.
- THANKS:
	- Added Doruk Fisek and Peio Ziarsolo. (Jordi)

GNU nano 1.1.12 - 2002.10.24
- General:
	- Translation updates (see po/ChangeLog for details).
	- Remove malloc.h, as it's unneeded and just causes annoyances on
	  *BSD systems.  Added stdlib.h to global.c.
	- Added Meta-Y toggle to disable/enable color syntax highlighting
	  completely.  This may eventually be per-buffer, but that's too
	  complicated for a feature freeze.
	- Disable VSTOP keystroke.  Stops people accidentally locking up
	  nano (suggested by David Benbennick).
	- Pluralize messages with ngettext() where needed. (David
	  Benbennick)  Tweaked to compile on systems lacking ngettext()
	  by DLR (problem found by Ken Tyler).
	- Update nano.1 and nano.1.html to show that nano now does an
	  emergency save on receiving SIGHUP or SIGTERM. (DLR)
	- Don't include "nowrap" in the long options if
	  DISABLE_WRAPPING is defined. (DLR)
- files.c:
  read_file()
	- Minor efficiency fixes, some of which fit in with the change
	  to ngettext() usage mentioned above. (David Benbennick)
  do_browser()
	- Make sure the value of path is mallocstrcpy()ed into retval
	  and not just assigned to it, to avoid memory corruption
	  problems. (DLR)
- nano.c:
  version()
	- If ENABLE_NLS isn't defined, display "--disable-nls"
	  (suggested by Ken Tyler). (DLR)
  justify_format()
	- Make sure the double space maintained after sentence-ending
	  punctuation is done when that punctuation is immediately
	  followed by a bracket-type character, so justifying e.g.
	  sentences in parentheses works properly. (David Benbennick)
  handle_hup()
	- Renamed handle_hupterm() to show that it now handles SIGTERM
	  as well as SIGHUP. (DLR)
  signal_init()
	- Do an emergency save on receiving either SIGHUP or SIGTERM,
	  not just SIGHUP. (David Benbennick)
  main()
	- Fix a problem where control key commands were printed
	  literally instead of interpreted after a failed search of a
	  one-line file. (David Benbennick)
- proto.h:
  handle_hup()
	- Renamed handle_hupterm(); see above for why. (DLR)
- winio.c:
  edit_add()
	- Fix a potential infinite loop occurring with certain
	  zero-length regexes. (David Benbennick)

GNU nano 1.1.11 - 2002.10.01
- General:
	- Translation updates (see po/ChangeLog for details).
	- Upgraded to gettext 0.11.5. (Jordi)
	- Updated nano.1, nano.1.html, and nano.texi to fix an
	  inaccuracy in the description of -Q/--quotestr. (DLR)
	- Set REG_EXTENDED in all regcomp() calls. (DLR)
	- Minor cosmetic code cleanups. (DLR)
	- Changed do_insertfile to (a) report multibuffer status at the
	  prompt and allowing it to be toggled, taking into account the
	  need to keep the translatable strings, and (b) added a
	  variable inspath to keep track of what the string was before
	  toggling.  I'm sure there's bugs, have at it.
	- Make sure all functions have prototypes in proto.h, and swap
	  some functions around to put similar functions closer
	  together (for this, rename clear_bottombars() to
	  blank_bottombars()). (DLR; suggested by David Benbennick)
	- More changes of char *'s to const char *'s when possible.
	  (David Benbennick)
	- Fix various minor memory leaks in files.c. (David Benbennick)
	- Fix minor problems with the operating directory code: set the
	  operating directory properly if it's specified only in a
	  nanorc file, and handle an operating directory of "/"
	  properly.  New function init_operating_dir() to handle
	  setting it both on the command line and in the nanorc file.
	  (David Benbennick)
	- Major rewrite of color and screen update routines to fix
	  minor bugs and increase efficiency.  New function
	  set_colorpairs() for the former. (David Benbennick)
- configure.ac:
	- Added pt_BR to ALL_LINGUAS. (Jordi)
	- Changed --enable-color warning to be slightly less severe.
	- Put the configure options in more or less alphabetical order,
	  and remove --enable-undo, since it doesn't do anything. (DLR)
- files.c:
  open_file()
	- String change: "File "x" is a directory" -> ""x" is a
	  directory". (Jordi)
  do_insertfile()
	- Disallow multibuffer toggling at the "Insert File" prompt if
	  we're in both view and multibuffer mode, so as to keep proper
	  integration between the two, and make sure the toggle
	  actually works all the time otherwise.  Also, make sure
	  TOGGLE_LOAD_KEY isn't referenced when NANO_SMALL and
	  ENABLE_MULTIBUFFER are both defined. (DLR)
  open_prevfile_void(), open_nextfile_void()
	- Return the return values of open_prevfile() and
	  open_nextfile(), respectively, instead of (incorrectly)
	  calling them and returning 0. (DLR)
  real_dir_from_tilde()
	- Rework to use getpwent() exclusively and end reliance on
	  $HOME.  Adapted from equivalent code in do_rcfile(). (DLR)
  input_tab()
	- Most likely fixed the check marked with FIXME, so that tab
	  completion works properly when we're trying to tab-complete a
	  username and the string already contains data. (DLR)
- global.c:
  shortcut_init()
	- Disable the new multibuffer toggle at the file insertion
	  prompt when NANO_SMALL and ENABLE_MULTIBUFFER are both
	  defined. (DLR)
  thanks_for_all_the_fish()
	- Make sure the reference to help_text is #ifdefed out when
	  --disable-help is used. (DLR)
- move.c:
  page_up()
	- Fix bug where current is moved up two lines when the up arrow
	  is pressed on the top line of the edit window; this causes a
	  segfault if the top line in the edit window is the second
	  line of the file, as the line current ends up on doesn't
	  exist. (Jeff DeFouw)
  do_down()
	- Fix bug where, if the last line in the edit window is the
	  line before the magicline, and smooth scrolling is turned
	  off, pressing the down arrow on that last line centers the
	  cursor without updating the edit window. (Jeff DeFouw)
- nano.c:
  version()
	- Put the listed configure options in more or less alphabetical
	  order. (DLR)
  open_pipe()
	- If we're in view mode here (in which case we're also in
	  multibuffer mode), don't set the modification flag. (DLR)
  do_next_word(), do_prev_word()
	- If we're on the last/first line of the file, don't center the
	  screen; Pico doesn't in the former case. (DLR)
  do_backspace()
	- Rework to call edit_refresh() regardless of the value of
	  current_x if ENABLE_COLOR is defined, so that multiple-line
	  color regexes are properly updated onscreen as they are in
	  do_delete(). (DLR)
  do_delete()
	- Rework to only call edit_refresh() unconditionally if
	  ENABLE_COLOR is defined; if it isn't, and we're not deleting
	  the end of the line, only call update_line(). (DLR)
  do_wrap()
	- Make sure wrapping is done properly when the number of
	  characters on the line is exactly one over the limit. (David
	  Benbennick)
	- Restore the previous wrapping point behavior (pre 1.1.10)
	  (David Benbennick).  Minor fix by DLR to prevent spaces from
	  being added to the ends of lines ending in spaces or lines
	  ending in tabs (the latter case found by David Benbennick).
  do_alt_speller()
	- Readd DLR's fix to preserve marking when using the alternate
	  spell checker; it was accidentally dropped. (David Benbennick)
  do_justify()
	- Fix cosmetic problems caused when justifying on the
	  magicline, and a minor problem where the cursor would
	  sometimes be moved to the wrong line after justification.
	  (David Benbennick)
  main()
	- When searching through the main shortcut list looking for a
	  shortcut key, stop searching after finding one; this avoids a
	  rare segfault. (DLR)
- nano.h:
	- Change search toggles for case sensitive searching and regexp
	  searching to M-C and M-R, respectively. (DLR; suggested by
	  Chris)
	- Add support for HP-UX's curses, which doesn't seem to support
	  KEY_HOME and KEY_END.
- nanorc.sample:
	- Fix the c-file regex for all caps words to be extended regex
	  format ({} instead of \{\}) (found by DLR).
	- Add a better string matching sequence that includes escaped
	  quotes (thanks to Carl E. Lindberg, who doesn't even know he
	  helped ;-).  Some unneeded \'s in that sequence removed, and
	  a new sequence to handle multi-line quotes added, by David
	  Benbennick.
	- Add some examples for HTML and TeX files. (David Benbennick)
- rcfile.c:
  parse_colors()
	- Stop infinite loop when syntax doesn't begin with " char.
- utils.c:
  charalloc()
	- Switch from using calloc() to using malloc(). (David
	  Benbennick)
- faq.html:
	- Typo fix. (DLR)
- AUTHORS:
	- Add David Benbennick. (Jordi and Chris)
- TODO:
	- Add entry in the 1.4 section for Pico's paragraph searching
	  ability (at the search prompt, ^W goes to the paragraph's
	  beginning, and ^O goes to the paragraph's end). (DLR)

GNU nano 1.1.10 - 2002.07.25
- General:
	- Translation updates (see po/ChangeLog for details).
	- Upgraded to gettext 0.11.2. (Jordi)
	  Removed intl/ entirely, and a few more tweaks by gettextize.
	- i18nized a few strings used in DEBUG mode. (DLR)
	- Some chars being assigned 0 are now assigned '\0'. (DLR)
	- Put header file #includes in a more consistent order. (DLR)
	- Remove some unneeded blank lines and spaces, and make some
	  spacing more consistent. (DLR)
	- When possible, use iscntrl() to determine whether a character
	  is a control character or not. (DLR)
	- Miscellaneous typo fixes. (DLR)
	- Many fixes to the help browser and shortcut lists: efficiency
	  updates, consistency fixes, help text fixes and improvements,
	  and spacing improvements. (David Benbennick)
	- Make some functions use const variables when possible, and
	  also make them static when necessary. (David Benbennick,
	  necessary redefined by Chris ;-)
	- Add Carl Drinkwater's backup file option (-B or --backup on the
	  command line, M-B in nano's global shortcuts). If the original
	  file is unchanged from when it was loaded, it is backed up to
	  filename~; if the original file has been changed or deleted
	  since it was originally loaded, it isn't backed up.  The backup
	  file retains the permissions, owner/group, and
	  access/modification times of the original file.  This option is
	  disabled when --enable-tiny is used.  It will not back up
	  temporary files.  Minor fixes to it by David Benbennick and
	  DLR.  Changes to open_file(), add_open_file(),
	  load_open_file(), write_file(), and do_writeout().
	- Add \n's to the ends of "filename is %s" debugging strings.
	  (Carl Drinkwater)
	- Add the long option --quotestr as an alternative for -Q, and
	  --regexp as an alternative for -R; they were listed in nano's
	  usage information, but weren't actually in nano.  Also, display
	  "-?" as an alternative for "-h" in nano's usage information,
	  put the command line options in a more consistent (i.e. mostly
	  alphabetical) order in nano, put the long options in a more
	  consistent order in rcfile.c and nanorc.sample, don't include
	  rcfile options if their equivalent command line options are
	  disabled, and remove obsolete relative option from
	  nanorc.sample. (DLR)
	- Change "File Name to Append/Prepend" to "File Name to
	  Append/Prepend to".  The original prompt could confusingly
	  imply that we are appending/prepending another file to the
	  current file, when we are actually appending/prepending the
	  current file to another file. (DLR)
	- Put nano.1, nano.1.html, and nano.texi up to date, and fix a
	  few inconsistencies in them. (DLR)
	- Typo fixes for the ChangeLog. (David Benbennick and DLR)
	- Complete rewrite of justification code to fix some bugs and
	  improve its functionality. (David Benbennick)
	- If a variable isn't going to be used in tiny mode, #define it
	  out when possible. (David Benbennick)
	- Major reworking of the cutting/screen-updating code in cut.c,
	  some functions in utils.c, the cursor placement code in
	  winio.c, and many, many other areas to increase efficiency.
	  (David Benbennick)
	- Rework handling of prompts when there's a list of partial
	  filename matches on the screen: remove kludgy case-by-case
	  handling (which didn't even handle every case), and have
	  statusq() handle it directly for all cases. (David Benbennick
	  and DLR)
	- Fix some warnings and errors that show up when using gcc's
	  -pedantic option. (DLR)
	- Add a comment to nanorc.sample warning that an out-of-range
	  negative value for fill can make nano die complaining that
	  the screen is too small (which may not be immediately
	  obvious). (DLR)
	- There were some opendir() calls in files.c without
	  corresponding closedir() calls; add them. (DLR)
	- Move align() and null_at() from nano.c to utils.c, and move
	  the openfilestruct handling functions from nano.c to files.c.
	  (DLR)
	- In color.c, start the "#ifdef ENABLE_COLOR" block after
	  including all the header files, as rcfile.c does; this fixes
	  a warning about ANSI C'S inability to handle blank files.
	  (DLR)
	- Add new function is_cntrl_char() as a wrapper for iscntrl();
	  this is needed to treat ASCII 0x80-0x9f as control characters
	  consistently.  (Without this, they will only be treated as
	  such when gettext is used; when it isn't used, they will be
	  printed as-is and be interpreted as commands by xterm, which
	  will corrupt the display.) (DLR)
	- Add command line option -I/--ignorercfiles to ignore
	  $SYSCONFDIR/nanorc and ~/.nanorc. (Carl Drinkwater).   Fix to
	  parsing getopt args. (DLR)
	- Fix minor bugs with importing certain text files in Mac
	  format. (DLR)
- files.c:
  append_slash_if_dir(), input_tab()
	- Changed variable names: lastWasTab -> lastwastab, matchBuf ->
	  matchbuf. (DLR)
  check_operating_dir()
	- Memory leak fix. (David Benbennick)
  check_writable_directory()
	- Optimizations. (David Benbennick)
  cwd_tab_completion()
	- Changed a variable name: dirName -> dirname. (DLR)
  do_browser()
	- Optimizations and mouse selection fixes. (David Benbennick)
  do_writeout()
	- Fix problem with formatstr's being defined as NULL when
	  --enable-tiny is used.  Since formatstr isn't ever used in tiny
	  mode, don't bother even creating the variable. (David
	  Benbennick and DLR)
  do_insertfile()
	- Memory leak fix (accidentally dropped 1st time).
	  (David Benbennick)
  get_full_path()
	- Memory leak fix.  Also, make it properly interpret ~/ notation
	  so, among other things, the option "--operatingdir ~" works.
	  (David Benbennick)
	- More optimizations. (David Benbennick)
  new_file()
	- Make sure current_x is zero; this fixes a problem where the
	  current cursor position wasn't reset when reading in a file in
	  multibuffer mode. (David Benbennick)
	- Use make_new_node rather than setting up fileage by hand.
	  (David Benbennick)
  read_file(), read_line()
	- Rework to properly handle nulls in the input file, fix
	  detection of binary files to properly mark a file as binary if
	  the only binary characters it contains are ASCII 127's, and
	  after reading the last line of a file that doesn't end in a
	  newline, increment totsize.  Remove previous kludge to set
	  totsize properly. (DLR)
  write_file()
	- Rework to properly handle nulls in the input file.  When
	  appending/prepending, don't change the current file's name to
	  the name of the file it's being appended/prepended to.  When
	  writing a marked selection to a file, save and restore totsize
	  so it isn't decreased by the size of the selection afterward.
	  (DLR)
	- Optimizations. (David Benbennick)
- global.c:
  free_toggles()
	- Only include if we're not using tiny mode. (David Benbennick)
  toggle_init()
	- Remove global entries for search toggles, as they aren't really
	  global. (DLR)
	- Don't reinitialize the toggles if they've already been
	  initialized; it's unnecessary and even causes a segfault in
	  do_toggle() if Pico emulation mode is the toggle in question.
	  Don't free the toggles here, either; it's unnecessary after the
	  above change. (David Benbennick)
	- If wrapping is disabled, don't include the toggle for it.
	  (DLR)
  shortcut_init()
	- Rework IFHELP macro. (David Benbennick)
- move.c
  page_down(), page_up()
	- Put sanity checks for current_x back in, to avoid rare
	  segfaults (oops). Now, however, they are only called when
	  placewewant is zero instead of being called unconditionally;
	  see changes to winio.c:actual_x_from_start() below. (DLR)
- nanorc.sample:
	- Put in much less crappy example regex rules for c-file.
- nano.c:
  clear_filename()
	- Remove this function, as it has unneeded functionality, is
	  short enough to be inlined, and is only called in two spots
	  anyway. (DLR)
  die()
	- Rework slightly to remove redundant printing of last message
	  and print all messages after resetting the terminal. (DLR)
  do_backspace()
	- Make sure placewewant is set properly, and that the mark is
	  moved backwards. (David Benbennick)
  do_char()
	- Fix a problem where, if ENABLE_COLOR wasn't used, typing
	  characters on a marked line before the beginning of the mark
	  would make the highlight short by one. (David Benbennick)
  do_cont()
	- Handle the case where the window was resized while we were
	  stopped. (David Benbennick)
  do_delete()
	- Make sure placewewant is set properly, to match Pico's
	  behavior. (DLR)
  do_int_spell(), do_alt_spell()
	- Rework to save the marked selection before doing spell checking
	  and restore it afterward. (DLR)
  do_next_word(), do_prev_word()
	- Fix a problem where highlighting isn't done properly after
	  calling either of these, and another problem where the cursor
	  would move back too far in certain cases with do_prev_word().
	  (David Benbennick)
  do_toggle()
	- Since the search mode toggles aren't global anymore, we don't
	  need to explicitly block them here anymore (which will end up
	  blocking the global backup mode toggle, which is the same as
	  the backwards search toggle). (DLR)
  do_wrap()
	- fill fixes and 'two short word wrap' bug. (David Benbennick)
  global_init()
	- Call die_too_small() when fill is 0. (DLR)
  handle_sigwinch()
	- Make sure we adjust fill when the window is resized. (David
	  Benbennick)
	- Call die_too_small() when fill is 0. (DLR)
  help_init()
	- Since the return value of snprintf() isn't well defined, use
	  sprintf() instead. (David Benbennick)
  main()
	- Rework to blank out filename manually before doing anything
	  with it, instead of calling clear_filename() in two places.
	  Make startline an int instead of a long, since it's supposed to
	  hold a line number. (DLR)
	- Properly handle multiple -r settings on the command line. (Carl
	  Drinkwater)
	- Fix a bug that prevented file insertion via the Insert key
	  from working at all when --enable-multibuffer wasn't used
	  (oops). (DLR)
	- Adapt David Benbennick's fix to get fill to accept negative
	  numbers properly in parse_rcfile() (see below) to the
	  handlers for the -r and -T options as well, so that -r/-T 0
	  can be treated separately from -r/-T string. (DLR)
	- Fix so that Esc-Esc-Space is properly treated as Ctrl-Space.
	  (DLR)
  usage()
	- List the options that are ignored for the purpose of Pico
	  compatibility, and make some minor consistency fixes. (DLR)
- nano.h:
	- Fix some space/tab formatting for flags. (DLR)
- proto.h:
	- Remove external declaration of the global int fill, since
	  it's now static. (DLR)
- rcfile.c:
  parse_rcfile()
	- Add David Benbennick's fix that allows fill to accept
	  negative numbers properly.  Specifically, use strtol() there
	  instead of atoi() so that errors can be detected.  Also
	  adapted for tabsize by DLR.
  parse_next_regex(), colortoint()
	- Only include if ENABLE_COLOR is defined. (DLR)
- search.c:
  search_init()
	- Since the search mode toggles aren't global anymore, rework the
	  part of this function referencing them so that they still work.
	  (DLR)
	- Remove unneeded toggles variable. (David Benbennick)
	- Fix a problem where the first character of buf was overwritten
	  if the last search string was one third the number of columns
	  plus one. (David Benbennick)
  findnextstr()
	- Update the current line at current_x if we don't find a match.
	  Also, pass current_x_find to strstrwrapper() so we know whether
	  we're at the beginning of a string or not (see changes to
	  strstrwrapper() below), and reset it between lines. (DLR)
  do_gotoline():
	- Make sure placewewant is zero after we go to a line. (David
	  Benbennick)
  do_gotopos()
	- Simplify the sanity check to only put x within the range of the
	  current line; don't call actual_x() anymore. (DLR)
- utils.c:
	- Add sunder() and unsunder().  These functions convert nulls
	  other than the terminating null in strings to newlines and
	  back; they're used to handle null characters in files properly.
	  (DLR)
  lowercase()
	- Remove, since it isn't actually used anywhere. (David
	  Benbennick)
  strstrwrapper()
	- Set REG_NOTBOL when we're not at the beginning of a
	  string, to avoid false positives when searching for regular
	  expressions prefixed with ^. Make it take a new parameter,
	  line_pos, to determine where we are in the string. (DLR)
  check_wildcard_match()
	- Changed variable names: retryPat -> retrypat, retryText ->
	  retrytext. (DLR)
- winio.c:
  actual_x_from_start()
	- Overhaul to make cursor placement more like that of Pico: add
	  sanity check for i, and then place i as close to the value of
	  xplus column as possible.  This change is most noticeable when
	  moving down through binary files. (DLR)
  do_credits()
	- Fix for the i18ned credits so it will compile with -pedantic
	  (DLR & Chris).
  do_help()
	- Add support for the handled keyboard escape sequences in the
	  help menu, as they are needed with some terminals (e.g. xterm
	  with TERM=ansi). (DLR)
  edit_refresh()
	- Turn on leaveok() so the cursor doesn't bounce around the
	  screen while we're updating it (most noticeable when using
	  color syntax over a very slow connection).
  do_replace_highlight()
	- When using regexps, make sure the highlight is the length of
	  the search result and not the regexp string. (DLR)
  nanogetstr()
	- After the user presses Enter at the prompt, refresh the edit
	  window in case there's a list of possible filename matches
	  (left over from attempted tab completion) on it. (DLR)
  statusbar()
	- Limit statusbar display to the number of columns less four, and
	  don't allow it to go over its original row. (David Benbennick)
  titlebar()
	- Tweak text spacing and printing so that the titlebar text looks
	  better on smaller terminals. (Carl Drinkwater)
  update_line()
	- When marking control characters, make sure the mark moves
	  forward by two characters instead of one.  Rework control
	  character display routine to display newlines within the line
	  (which should never occur under normal circumstances; they will
	  only be there if the line had nulls in it and was unsunder()ed
	  beforehand) as ^@'s. (DLR)
	- Fix to properly treat ASCII 128-159 as control characters.
	  (DLR)
- configure.ac:
	- Added ms to ALL_LINGUAS. (Jordi)
	- Merged acconfig.h in. (Jordi)
	- Fixed so that --enable-debug defines DEBUG and undefines
	  NDEBUG. (Carl Drinkwater)
- THANKS:
	- Completed a bit. (Jordi)
	- Fixed David Benbennick's email address. (David Benbennick)
	- Typo fix. (DLR)

GNU nano 1.1.9 - 2002.05.12
- General:
	- Typos n misspellings all over the place. (David Benbennick)
	- Allow --tiny and --multibuffer to cooperate (who the heck
	  would want this is beyond me but... ;-)  Changes to
	  configure.ac, global.c, .... (David Benbennick)
	- Change to openfilestruct for multibuffer mode by DLR.
	  New functions nano.c:make_new_opennode(), free_openfilestruct(),
	  delete_opennode(), unlink_opennode(), splice_opennode(),
	  new struct openfilestruct in nano.h.
	- Preliminary prepend code.  This may be a bad idea, but I've
	  been wanting it for awhile now and we'll see how bad it messes
	  everything up.  Changes to files.c:do_writeout(), write_file().
	  Fixes for O_CREAT & append compatibility by David Benbennick.
	- Change from read() and write() to file streams by Jay Carlson.
	  Allows OS to implement read and write ahead rather than making
	  us do it.  Hopefully merged properly.
	- More cleanups with DISABLE flags, better free_shortcutage and
	  free_toggle, and get rid of unnecessary variable decls with
	  NANO_SMALL in shortcut_init() by David Benbennick.
	- Added "syntax" command to .nanorc file, to allow multiple
	  syntaxes.  New function color.c:update_color(), calls in various
	  files.c places, syntaxtype struct, global variables syntaxes,
	  syntaxfile_regexp and synfilematches.  Global flag -Y ,--syntax
	  to specify the type on the command line, if there's no good
	  filename regex to use.  Global variable syntaxstr.
	- Changed many strcmp()s and strcpy()s to their equivalent
	  '\0' counterparts. (David Lawrence Ramsey)
	- Many changes to allow marked cutting to work with multiple
	  file buffers: changes to openfilestruct type in nano.h and
	  files.c. (David Lawrence Ramsey)
	- Changed NANO_SMALL to ENABLE_NLS for gettext disabling.
	  (David Benbennick)
	- Move next_key and pev_key definitions out of main() and into
	  global.c where they belong. (David Benbennick)
- color.c:
  update_color()
	- Add regfree call here to avoid memory leaks.
- configure.ac:
	- Define NDEBUG to silence asserts. (David Benbennick)
- files.c:
  get_next_filename()
	- Optimizations. (David Benbennick)
- global.c:
  shortcut_init()
	- Add missing free_shortcutage()s. (David Benbennick)
  thanks_for_all_the_fish()
	- Only defined when using DEBUG, makes sense. (David Benbennick)
- nano.c:
  die_save_file()
	- Add missing free. (David Benbennick)
  do_justify()
	- Optimizations. (David Benbennick)
  do_wrap()
	- Complete rewrite. (David Benbennick)
  help_init()
	- A little less readable, a lot shorter. :-) (David Benbennick)
	- Fix Meta-A not getting capitalized, and convert the ASCII
	  #s to their character equivalent.
  main()
	- Changed charalloc(), strcpy()s to mallocstrcpy()s.
- nano.h:
	- NANO_ALT_COMMAND and NANO_ALT_PERIOD were reversed (lol).
	  (David Benbennick)
- nano.spec.in:
	- Don't put Chris' name as the Packager in the distribution
	  by default. (I'm an idiot.)
	- Fixed Source line. (David Lawrence Ramsey)
- nano.1:
	- Changed references to Debian GNU/Linux to Debian GNU. (Jordi)
- nano.1.html:
	- Updated for -Y option. (David Lawrence Ramsey)
- rcfile.c:
	- Made some rc file errors less fatal.
	- Added in my patch for getpwent instead of relying on $HOME.
	  (David Lawrence Ramsey)
- winio.c:
  edit_add()
	- Changed some syntax highlight computations for the sake of COLS.
	- Add in the necessary regfree() calls to stop nano from leaking
	  memory like a sieve when using color syntax highlighting :-)
  bottombars(), onekey()
	- Cleanups. (David Benbennick)
- po/gl.po:
	- Galician translation updates. (Jacobo Tarrio)
- po/de.po:
	- German translation updates. (Michael Piefel)
- po/fr.po:
	- French translation updates. (Jean-Philippe Guérard)
- po/ca.po, po/es.po:
	- Catalan and Spanish translation updates. (Jordi)
- po/sv.po:
	- Swedish translation updates. (Christian Rose)
- po/nl.po:
	- Dutch translation updates. (Guus Sliepen)
- po/it.po:
	- Italian translation updates. (Marco Colombo)
- po/ru.po, po/uk.po:
	- Russian and Ukrainian translation updates. (Sergey A. Ribalchenko)
- po/id.po:
	- Indonesian translation updates. (Tedi Heriyanto)
- po/sv.po:
	- Swedish translation updates. (Christian Rose)

GNU nano 1.1.8 - 2002.03.30
- General
	- Type misalignments and mem leaks in renumber_all, do_justify
	  and do_spell. (Rocco & Steven Kneizys)
	- New "External Command" code, originally by Dwayne Rightler,
	  various fixes and changes by Chris, Rocco and David Benbennick.
	  New function nano.c:open_pipe() and signal handler cancel_fork(),
	  changes to do_insertfile(), new list extcmd_list, cmd is
	  ^X after ^R.
	- Added separate regex variable (color_regex and colormatches)
	  so that color syntax and regex search/replace can coexist.
	- Added new nano.spec file from Brett <brett@bad-sports.com>,
	  added because maintaining the spec file is getting to be a large
	  hassle ;)
- files.c:
  check_writable_directory()
	- Stat full_path, not path. (Steven Kneizys)
  open_pipe()
	- I18nize the pipe error. (DLR)
  do_insertfile()
	- Handle cancel from ExtCmd properly. (David Benbennick)
  read_file()
	- Abort if we read a file of 0 lines (num_lines == 0).  Fixes bug #70.
	- Reverse tests to stop segfault on editing a new file of 0 lines.
	  (David Benbennick)
	- Change input var to one char instead of array. (David Benbennick)
	- Move NO_CONVERT check up so chars get read in properly. (DLR)
- nano.c:
  do_justify()
	- More fixes for indented justify. (David Benbennick)
  do_int_speller()
	- Fix zombie processes and spelling buffer issues. (Rocco Corsi)
  help_init()
	- Capitalize Meta altkeys.
	- Various fixes and string changes.
  main()
	- Put NANO_SMALL defines around toggle pointer (noticed by Jordi).
  usage()
	- Rewritten to encompass systems with and without GETOPT_LONG.
	  New function print1opt does most of the dirty work, stops
	  duplication of effort and eases translator's jobs.  Also
	  breaks all the current translations ;-)
- proto.h:
	- Missing externs. (Rocco)
- rcfile.c:
  do_rcfile()
	- Reset lineno between system and local .nanorc file.
	- Fix errno->strerror(errno) mismatch.
  parse_rcfile()
	- Don't use i for both for loop and atoi(), fixes lots of
	  potential crashes, 1st reported by Jean-Philippe Guérard.
  rcfile_error()
	- Don't print out the file name if we haven't opened the file
	 yet (lineno == 0).
- search.c:
  search_init()
	- Fix a missing free. (Rocco)
  do_gotoline()
	- Set placewewant if we actually move to a different line.
- utils.c:
  stristr()
	- Defined regardless of NANO_SMALL (noticed by Jordi).
  nperror()
	- New wrapper for perror. (David Benbennick)
- winio.c:
  do_credits()
	- Add Thomas Dickey.
  do_cursorpos()
	- Make col numbering start from 1 (suggested by Andrew Ho).
  update_line(), xpt()
	- Add check for 127. (DLR)
- po/sv.po:
	- Swedish translation updates. (Christian Rose)
- po/de.po:
	- German translation updates. (Michael Piefel)
- po/id.po:
	- Indonesian translation updates. (Tedi Heriyanto)
- po/it.po:
	- Serious typo.
- po/ca.po, po/es.po:
	- Catalan and Spanish translation updates. (Jordi)
	- Typo. (DLR)
- po/fr.po:
	- French translation updates (Jean-Philippe Guérard).
- po/gl.po:
	- Galician translation updates. (Jacobo Tarrio)
- po/uk.po, po/ru.po:
	- Russian and Ukrainian translation updates. (Sergey A. Ribalchenko)
- po/pl.po:
	- Polish translation updates. (Wojciech Kotwica)
- po/fr.po:
	- French translation updates. (Jean-Philippe Guérard)
- po/it.po:
	- Italian translation updates. (Marco Colombo)
- po/da.po:
	- Danish translation updates. (Keld Simonsen)

GNU nano 1.1.7 - 2002.03.05
- General
	- malloc->calloc, etc cleanups. (DLR)
	- New option, noconvert (-N, --noconvert) to completely stop
	  the translation of files from DOS or Mac format. (DLR)
	- New functions check_writable_directory() and safe_tempnam()
	  to get around the tempnam warning. More improvements. (DLR)
	  Still needs testing.
	- Added DOS and Mac format options to write file routine.
	  Changes to shortcut_init() and do_writeout().
	- Removed stupid static definitions of toggles and shortcut
	  lists.  Many changes to shortcut_init(), toggle_init(),
	  statusq(), nanogetstr(), main(), and many other places.
	- Multibuffer mode now allows multiple empty filenames.
	  Changes to add_open_files(), removed open_file_dup_search(),
	  open_file_dup_fix(), etc. (DLR)
	- New code to handle multiple .save files.  Changes to
	  die_save_file(), new function files.c:get_next_filename()
	  and utils.c:num_of_digits(). (Dwayne Rightler, DLR & Chris)
	- Many malloc() cleanups and files.c tweaks by Steven Kneizys,
	  new functions utils.c:free_shortcutage() (got to love that
	  name!) & free_toggles(), and big cleanup program
	  thanks_for_all_the_fish() (originally
	  thanks_for_the_memories()).  Mods to shortcut_init() by Chris.
	- Preliminary quoting support for justify.  New arg -Q,
	  --quotestr, changes to do_justify(), global variable
	  quotestr().
- Makefile.am:
	- Add SYSCONFDIR to DEFS, so we can have a $SYSCONFDIR/nanorc.
	- Change localedir line to 1.0's version.
	- Moved m4/ stuff to its own m4/Makefile.am.
- m4/aclocal_inc.m4:
	- New macro AM_ACLOCAL_INCLUDE, tells configure.ac where to look
	  for macros. (Gergely Nagy)
- configure.in:
	- Renamed to configure.ac.
- configure.ac:
	- Moved to autoconf 2.52. (Jeff Bailey)
	- Added call to AM_ACLOCAL_INCLUDE.
- files.c:
  read_byte()
	- Added check for control characters (indicative of a binary
	  file), set NO_CONVERT if found (fixes by DLR).
 do_insertfile()
	- Added support for -o in prompt. (Steven Kneizys)
- global.c:
	- Move openprev and opennext functions to shortcuts, they really
	  aren't toggles. (DLR)
- rcfile.c:
  parse_next_regex()
	- Allow " symbol to be in regex without leading \ by checking
	  for *ptr+1 is not the end of the regex.
  do_rcfile()
	- Parse rcfile in $SYSCONFDIR as well. (Dwayne Rightler)
- nano.1:
	- Added Noconvert option to man page. (DLR)
- nano.c:
  justify_format(), do_justify()
	- Various fixes for starting blank spaces, spaces after
	  punctuation, & segfault with quoting strings. (David Benbennick)
  do_justify()
	- Don't continue to justify string if it's indented more
	  (quoting wise) than the beginning of the justification.
  help_init()
	- Added message re: having multiple blank buffers. (DLR)
  main()
	- Add 407 as equiv of 26, this seems to be sent when using
	  ^Z in linux console with keypad() enabled.
- rcfile.c:
	- Get rid of unneeded relativechars from rcopts. (DLR)
- search.c
  do_replace(), findnextstr()
	- Fixes for various search issues. (Ken Tyler)
- winio.c:
  do_cursorpos()
	- Rewritten to show col place as well as character place, without
	  needing an entirely separate flag.
  bottombars(), onekey()
	- Make bottom list dynamic with screen size (Guus Sliepen & Chris).
	- More cleanups w/width of shortcut.
- utils.c:
  strcasestr(),revstrcasestr()
	- Renamed to stristr and revstristr since strcasestr has not
	  been confirmed to be detected properly on various Linux
	  systems.
  strstrwrapper()
	- NANO_SMALL test was backwards. (Ken Tyler)
- winio.c:
  strlenpt()
	- Changed main function to strnlenpt() for new justify changes,
	  original function now just a stub.
- nanorc.sample
	- Mention unset in the sample nanorc.
- po/ca.po, po/es.po:
	- Catalan and Spanish translation updates. (Jordi)
- po/sv.po:
	- Swedish translation updates. (Christian Rose)
- po/fr.po:
	- French translation updates. (Jean-Philippe Guérard)
- po/nn.po:
	- Norwegian nynorsk translation updates. (Kjetil Torgrim Homme)
- po/de.po:
	- German translation updates. (Michael Piefel)
- po/it.po:
	- Italian translation updates. (Marco Colombo)
- po/cs.po:
	- Partial Czech translation updates. (Vaclav Haisman)
- po/hu.po:
	- Hungarian translation updates, or to be precise, rewrite.
	  (Gergely Nagy)
- po/uk.po, po/ru.po:
	- Russian and Ukrainian translation updates. (Sergey A. Ribalchenko)
- po/da.po:
	- Danish translation updates. (Keld Simonsen)
- po/nb.po:
	- Norwegian bokmål translation updates. (Stig E Sandoe)
- po/nl.po:
	- Dutch translation updates. (Guus Sliepen)
- po/pl.po:
	- Polish translation updates. (Wojciech Kotwica)

nano-1.1.6 - 2002.01.25
- General
	- Add Meta-A as alternate keystroke for ^^ for people with
	  non-US keyboards.
	- Add Alt-G (NANO_ALT_GOTO_KEY) as alternate for goto dir in
	  browser.
	- Better partial word checking code. New function
	  search.c:is_whole_word(), changes to findnextstr(),
	  and nano.c:do_int_spell_fix(). (Rocco Corsi)
	- Added multiple-line regex support.  Format in .nanorc is
	  start="regex" end="regex".  Cleaned up nanorc:parse_colors(),
	  added parse_next_regex(), changes to edit_add in winio.c(),
	  changes to colortype, cleaning up some old cruft.
	- Upgrade to gettext 0.10.40, probably broke everything again :)
	- Upgraded to and then downgraded from automake 1.5, as there
	  are severe security implications.
- color.c:
  do_colorinit()
	- Moved some comments and braces around so color can work
	  w/slang. (DLR)
- global.c:
  shortcut_init()
	- Replace hard coded ALT_G and ALT_H values in the replace
	  and goto shortcuts with their macro counterparts NANO_ALT_*_KEY.
- nano.c:
  usage()
	- Remove extra \n in --keypad description. (Jordi)
  main()
	- Check that alt value is an alpha char before comparing to
	  val - 32, fixes Alt-R calling doprev instead of replace.
  do_char()
	- Run edit_refresh() if ENABLE_COLOR is defined so adding
	  multi-liners will update (e.g. /* in C).
  do_int_spell_fix()
	- Temporarily unset REVERSE_SEARCH if it's set. (Rocco Corsi)
  do_suspend()
	- Call tcsetattr() to restore the old terminal settings, so
	  tcsh can use ^C after suspend for example.  Fixes bug #68.
  do_wrap()
	- Move "right" increment to part where new line is created,
	  should change (fix?) some wrapping problems with autoindent.
  version()
	- Show --enable-multibuffer independently of --enable-extra being
	  compiled in. (Jordi)
- nano.h:
	- Changed color struct slightly, because of previous issue with
	  applying color painting in order, the "str" portion was
	  useless.  Renamed "val" in colortype to "start", added "end"
	  for multi-line color strings.
- rcfile.c:
  General
	- Took silly variables being passed everywhere like lineno and
	  filename and made them static variables.
	- Re-indented.
	- Added stdarg.h to includes.
  rcfile_error()
	- Now automatically prepends the "error in line blah at foo"
	  message to error messages.
  parse_colors()
	- Added section for computing "end" section.
  parse_next_word()
	- Added support for "\ ", in word parsing.
- search.c:
  do_search()
	- Check position of cursor and return value of findnextstr and
	  tell user if search string only occurs once (Rocco & Chris).
  findnextstr()
	- Fix off by one in check for wrap around. (Rocco Corsi)
- winio.c:
  edit_refresh()
	- Rename lines to nlines to fix AIX breakage (reported by
	  Dennis Cranston, re-reported by arh14@cornell.edu).
  edit_add()
	- Refuse to honor regex matches of 0 characters when applying
	  color highlighting, and say so on the statusbar.  Otherwise
	  we go into an infinite loop, the error message should clue
	  users into the fact that their regex is doing something bad.
- THANKS:
	- Oops, correct Eivind's entry. His translation was Norwegian nynorsk,
	  not bokmål as we claimed. (Jordi)
- .cvsignore
	- Added config.guess config.sub install-sh missing & mkinstalldirs
- po/ca.po, po/es.po:
	- Catalan and Spanish translation updates. (Jordi)
- po/sv.po:
	- Swedish translation update. (Christian Rose)
- po/de.po:
	- German translation update. (Michael Piefel)
- po/fr.po:
	- French translation update. (Jean-Philippe Guérard)
- po/ru.po, po/uk.po:
	- Russian and Ukrainian translation updates. (Sergey A. Ribalchenko)
- po/no.po:
	- Moved to po/nn.po, which is the correct name for Norwegian nynorsk.
- po/nn.po:
	- Norwegian nynorsk translation updates. (Kjetil Torgrim Homme)
- po/nb.po:
	- New Norwegian bokmål translation. (Stig E Sandoe <stig@ii.uib.no>)
- po/da.po:
	- Danish translation update. (Keld Simonsen)

nano-1.1.5 - 2002.01.05
- General
	- Better integration of View mode (-v) and multibuffer.
	  Fixes to new_file(), do_insertfile_void(), shortcut_init().
	  (David Lawrence Ramsey)
	- The keypad handling has changed (again).  We now use
	  the keypad() function by default.  New flag -K, --keypad
	  allows the old behavior for those using the keypad arrow keys
	  and rxvt-based terminals.
	- Updated copyright notices to 2002. (Jordi)
- nano.c:
  die()
	- Only save files that were modified. (David Lawrence Ramsey)
  do_cont()
	- Run signal_init() after doupdate() so ^Y won't suddenly
	  start suspending after returning from ^Z suspend in Hurd.
  signal_init()
	- Unconditionally disable VDSUSP if it exists, stops ^Y
	  suspending nano on the Hurd.
  help_init()
	- Typo fixes in help strings. (Jordi)
	- New variable helplen needed cause currslen is not always
	  the length we want (bug found by David Lawrence Ramsey).
	- Typo in file switch string (found by David Lawrence Ramsey).
  main()
	- Handle Alt prev/next file keys (,.), as well as normal ones (<>).
	- Handle OS-specific insert keys by jump to do_insertkey (David
	  Lawrence Ramsey).
- files.c:
  read_file()
	- Make conversion message less confusing (suggested by Jordi).
- rcfile.c:
  parse_next_word()
	- Get rid of ptr == \n check to abort, screws up option
	  parsing (bug found by David Lawrence Ramsey)
- winio.c:
  update_line()
	- set realdata check to >= 1 && <= 31, lack of > 0 check screwed
	  high ascii characters.
  titlebar()
	- gettextized a pair of strings.
  bottombars()
	- Get rid of that annoying reversed line when color is on! :)
  edit_add()
	- Little fixes to let color highlights not bleed onto the next line.
  statusq()
	- Initialize "list".
- m4/gettext.m4:
	- Back down to 1.1.3 version.
- faq.html:
	- Various link updates and other fixes. (Aaron S. Hawley)
	- Typo fixes. (David Lawrence Ramsey)
- AUTHORS
	- Add DLR.
- po/sv.po:
	- Swedish translation update. (Christian Rose)
- po/ru.po, po/uk.po:
	- Russian and Ukrainian translations updates. (Sergey A. Ribalchenko)
- po/ca.po, po/es.po:
	- Catalan and Spanish translations updates. (Jordi)
- po/pl.po:
	- New Polish, partial translation, by Cezary Sliwa <sliwa@cft.edu.pl>.
	- Wojciech Kotwica <wkotwica@post.pl> completed it and is the new
	  official maintainer.
- po/fr.po:
	- French translation update. (Michel Robitaille)
- po/gl.po:
	- Galician translation update. (Jacobo Tarrío)
- po/it.po:
	- Italian translation update. (Marco Colombo)
- po/de.po:
	- German translation update. (Michael Piefel)
- po/fr.po:
	- French translation update. (Jean-Philippe Guérard)

nano-1.1.4 - 2001.12.11
- General
	- Preliminary syntax highlighting support.  New functions
	  colortoint() and parse_color() in rcfile.c, new code in
	  edit_add() in winio.c to actually do the highlighting.  It's
	  not even close to pretty yet :P
	- Many int/long alignments. (David Lawrence Ramsey)
- files.c:
	- Fixes for tab completion and screen refresh (David Lawrence
	  Ramsey).
  add_open_file()
	- Get rid of unsetting MARK_ISSET because otherwise writing
	  marked text will automatically unset the marker with
	  multibuffer enabled.
- global.c:
	- Define currshortcut and currslen when either DISABLE_MOUSE
	  or DISABLE_HELP or DISABLE_BROWSER is not defined (Silvan
	  Minghetti).
- nano.c:
  main()
	- Add Esc-[-[IGL] keys for FreeBSD Console (PgUp,PgDn,Insert).
	- Added better Hurd support for function keys (Alt-V,U,9,@,F).
  signal_init()
	- do SIG_IGN for the SIGTSTP sigaction regardless of whether
	  we have _POSIX_VDISABLE or not (more Hurd fixes)
  help_init()
	- Typo fixes and additions to the new help texts.
  do_curpos()
	- Now takes arg for constant updating to always show the cursor
	  position. (David Lawrence Ramsey)
  do_wrap()
	- Many fixes. (David Lawrence Ramsey)
  do_spell()
	- Dont prompt for replace if we don't change the word in
	  question. (Rocco Corsi)
- po/de.po:
	- German translation updates. (Karl Eichwalder)
- po/ru.po:
	- Russian translation updates. (Sergey A. Ribalchenko)
- po/sv.po:
	- Swedish translation updates. (Christian Rose)
- po/da.po:
	- Danish translation updates. (Keld Simonsen)
- po/es.po:
	- Spanish translation updates. (Jordi)
- po/fr.po:
	- French translation updates. (Michel Robitaille)
- m4/gettext.m4:
	- diff against mutt 1.2.5's gettext.m4.

nano-1.1.3 - 2001.10.26
- General
	- Finally wrote function-specific help mode.  Changes to
	  nano.c:help_init() and winio.c:do_help().  Changed
	  currshortcut and currslen #ifdefs to depend on both
	  DISABLE_HELP and DISABLE_MOUSE being defined to not
	  include.  Changed all the shortcuts and lengths.
	- Fixed null_at to ACTUALLY DO SOMETHING with its arg.  Again,
	  this was causing nasty errors if the call to nrealloc moved
	  where the data was located.
	- Changed header comments to say "version 2" instead of "version
	  1" as the COPYING file is actually version 2 of the GPL (bug
	  noticed by Jordi Mallach).
- cut.c:
  do_cut_text()
	- Check to see whether marked text is contained within edit
	  window and if so only do an edit_refresh (variable dontupdate
	  replaces cuttingpartialline).
  do_uncut_text()
	- Similar display fixes. (David Lawrence Ramsey)
- faq.html
	- Removed nano-editor.org FTP site address [deprecated] and added
	  the GNU one.
- files.c:
	- Added status messages for converted DOS and Mac files.
	  People should know that their file wasn't normally formatted.
  load_file()
	- Status message when trying to load an already loaded file with multiple
	  buffers. (David Lawrence Ramsey)
  read_file()
	- Get rid of useless linetemp variable and name num_lines int.
	  (David Lawrence Ramsey)
- nano.c:
	- New function do_prev_word, similar to do_next_word.  Hard coded as
	  Alt-space, as next word is hard coded as control-space. Fixed
	  goofy logic setting x pos to value of last line when hitting the
	  beginning of first line, prog should simply abort.  Added
	  the #ifdefs around the code in main().
- nano.h:
	- Additional #define, SMALL_TOO to determine how long
	  MAIN_LIST_LEN is.  We need this because of the find matching
	  bracket code.
  main()
	- Moved #ifndef NANO_SMALL down past the case 0: line so
	  control-space doesn't insert a \0 (ack!)
- rcfile.c:
	- Fix incorrect number of rc options. (David Lawrence Ramsey)
- po/sv.po:
	- Updated Swedish translation. (Christian Rose)
- po/da.po:
	- Updated Danish translation. (Keld Simonsen)
- po/es.po:
	- Style updates to Spanish translation. (Santiago Vila)
- po/ru.po, po/uk.po:
	- Updated Russian and Ukrainian translation. (Sergey A. Ribalchenko)

nano-1.1.2 - 2001.10.03
- General
	- Added BUGS #63 & 64.  Fixes in search_init() and nanogetstr(),
	  new flag CLEAR_BACKUPSTRING because there's no easy way to
	  clear the backupstring without making it global (messy), so we
	  use a flag instead (just as messy?)
	- --enable-tiny now leaves out the Auto Indent code, do you really
	  need that on a bootdisk? =-)
	- New flag -o, --operatingdir, similar to Pico's -o mode.  New
	  function check_operating_dir(), changes to load_file (arg),
	  open_file_dup_search (arg), new function do_gotopos for -F.
	  (David Lawrence Ramsey)
	- Code to read/write dos formatted files.  Massive amounts of
	  new code in read_line and write_file.  New cmdline flag
	  (-D --dos) to automatically write the file in DOS format,
	  regardless of the original format.
	- Mac file writing supported too.  Flag -M, --mac.  Toggle
	  Meta-O (MacOS? OS-X? =-)
	- New smooth scroll code by Ken Tyler.  New flag -S, --smooth,
	  changes to page_up() and page_down().  Many fixes to paging by
	  David Lawrence Ramsey.
	- Bracket (brace, parens, etc) matching code by Ken Tyler.
	  New functions do_find_bracket(), changes to findnextstr(),
	  command is Meta-] (hope you don't mind since I already sold off
	  Meta-O to the MacOS file code Ken...) Fixes to bracket_msg
	  by DLR.
	- Call do_gotopos from do_alt_spell() to keep position
	  consistent when invoking alt speller. (DLR)
	- Readded DISABLE_CURPOS because in certain instances (like
	  all the "Search Wrapped" lines) the cursor position will
	  be different yet we don't want the cursor position displayed.
	- Take control-space out of -tiny build, unneeded.
- cut.c:
  cut_marked_segment()
	- Add magic line when cutting a selection including filebot.
	  Fixes bug #66. (discovered by DLR, fixed by DLR & Chris)
  do_cut_text()
	- Don't recenter the line when cutting one line.  Fixes bug #65. (DLR)
- faq.html:
	- Notes about the Free Translation Project.
	- Debian additions.
- files.c:
  do_writeout()
	- Expanded strings to not use %s and ?: to determine
	  write/append string to be nice to translators.
  new_file()
	- Initialize totsize. (DLR)
- nano.c:
  main()
	- Added var constcheck as a CRC-like check of whether cursor
	  pos has changed and if so update the pos with -c.
	- Many tweaks and changes from numerics to char equivs.
	  (David Lawrence Ramsey)
	- Fix the KEY_IC being undefined when using slang.
  do_mouse()
	- Send 27 when the menu item clicked is an alt key seq... The
	  lines aren't lined up since the menu width changed though,
	  this breakage depends on whether the new widths will be kept
	  or not (FEEDBACK!!)
	- Change k based on currslen to allow the new widths in
	  bottombars().
  do_wrap()
	- Fixes for Pico incompatibility in cases 2b and 2c.
	  (David Lawrence Ramsey)
  global_init()
	- New arg save_cutbuffer, allows cutbuffer to not be lost when
	  using multibuffer.
- nano.1:
	- Added new features, fixed some typos. (Jordi)
- nano.texi:
	- Corrected the Mouse Toggle section, noticed by Daniel Bonniot.
	- Added many command line options, toggles and other additions.
	  (Jordi)
- rcfile.c:
	- NUM_RCOPTS fix. (DLR)
	- Add tabsize support to rc file. (Nathan Heagy)
	- Fix incorrect argument in fill and tabsize error message.
	  (Nathan Heagy)
- search.c:
	- Changed search prompt to "Search" followed by a list of
	  bracketed, free-standing modifiers that do not imply a grammar,
	  and the (to replace) string separately.  Hopefully this resolves
	  the i18n problems that this provoked.
  findnextstr()
	- Various fixes that need testing. (Ken Tyler)
- winio.c:
	- Add David Lawrence Ramsey to credits.
  bottombars()
	- Spread out the menu items, feedback definitely needed on this.
  nanogetstr()
	- More key fixes. (David Lawrence Ramsey)
	- Don't be clever and wasteful, just repaint every iteration.
- po/nl.po:
	- New Dutch translation, by Guus Sliepen <guus@nl.linux.org>.
- po/ca.po, po/es.po:
	- Updated Catalan and Spanish translation. (Jordi)
- po/gl.po:
	- Updated Galician translation. (Jacobo Tarrío)
- po/da.po:
	- New Danish translation, by Keld Simonsen <keld@dkuug.dk>.
- po/sv.po:
	- Updated Swedish translation. (Christian Rose)
- po/it.po:
	- Updated Italian translation. (Marco Colombo)
- po/fi.po:
	- Updated Finnish translation. (Pauli Virtanen)

nano-1.1.1 - 2001.07.28
- General
	- Reverted included gettext from 0.10.38 to 0.10.35 in intl/ dir.
	- Added m4/ directory to allow rebuilding using only the internal
	  version of gettext.m4. (Albert Chin)
- nano.c:
  main()
	- Change the multibuffer getopt option to 'F'. (David Lawrence
	  Ramsey)
  do_mark()
	- Temporarily disable cursorpos when enabled to be able to see
	  the mark (un)set message. (Ken Tyler)
- nanorc.sample
	- Typo fixes and updates. (David Lawrence Ramsey)
- files.c:
  new_file()
	- Do add_open_files if there aren't any open yet (David Lawrence
	  Ramsey).
  close_open_file()
	- Try to open the next file first, then the previous one.
	  (David Lawrence Ramsey)
- global.c:
  shortcut_init()
	- Rewrote the whereis and replace lists to put CANCEL at the end
	  of the list, and not include the toggle functions when using
	  NANO_SMALL.
- nano.h:
	- Fix type in INSERTFILE_LIST_LEN.
	- Rewrote all the macro definitions to be a little less messy,
	  for the #ifdefs anyway.
- rcfile.c:
	- Update for the multibuffer option (oops). (David Lawrence Ramsey)
- search.c:
	- Added #ifdef NANO_SMALLs around the REVERSE_SEARCH code.
  search_init()
	- add #ifdef NANO_SMALL around toggles code.
- winio.c:
  bottombars()
	- Fixed an off by one that wasn't letting lines with odd #
	  shortcuts work in certain cases.

nano-1.1.0 - 2001.07.15
- General
	- New global variables currshortcut and currslen to support using
	  the mouse with the shortcuts.  Also supports clicking on files
	  in browser.  Added #ifdef DISABLE_MOUSE around this code also.
	- Changed mouse disabling code from depending on --enable-tiny
	  to its own flag, --disable-mouse.  The --tiny option defines
	  this automatically, but now just mouse support can be disabled
	  if desired.
	- File Browser supports the "Goto Directory"
	- Added rcfile.c source file.  Only includes much of anything when
	  --enable-nanorc is used.  Tons of new funcs, most notably
	  do_rcfile() called from nano.c:main().  Added much needed
	  function ncalloc(), will have to go through source code later
	  and change the appropriate calls which used nmalloc for lack of
	  an appropriate calloc function *** FIXME ***
	- After "Alternate" spell checker is called, cursor is repositioned on
	  the same line as before ^T was pressed.
	- Moved config.h up in all .c files #include list. (Albert Chin)
	- Added config.guess and config.sub to distribution because,
	  apparently, newer autoconf/automakes can't live without them.
	- Various spelling updates by David Lawrence Ramsey.
	- Changed all string allocations to charalloc(), new function
	  designed to take nmalloc argument but call calloc based on
	  (char *) size.
	- New macro DISABLE_WRAPJUSTIFY to easily check for both wrapping
	  and justify being disabled.  This allows us to compile out the
	  -r flag if neither are set, and will also allow us to comment
	  out -W when it is written.
	- Allow fill to take a negative value to signify a "from right side"
	  value.  This allows the value to vary with the screen size yet
	  still be correct.  New static value wrap_at to minimize code
	  impact.  Updated man page and info file.
	- Allow file appending.  New shortcut list nano_insertfile_list (since
	  insert and write routines can't share shortcut lists anymore),
	  new args to do_writeout and write_file called append, and of source
	  code changes to those functions.
	- Allow backwards searching.  Drastic rewrite of the search prompt
	  string by Chris.  All other code by Ken Tyler.  New globals
	  nano_reverse_msg, new functions revstrstr and revstrcasestr,
	  many changes to search functions.  Not too big a code size
	  increase!
	- Moved extension functions (Case Sensitive, Regexp, and Backwards
	  Search, Append key in write file function) to Meta keys, as
	  people are complaining loudly about nano not being control-key
	  compatible with Pico, which is a Bad Thing (TM).  Changes to
	  shortcut_init, toggle_init, new toggles for backwards and regexp
	  (and you can now toggle all search options including regexp at
	  the Search: prompt!)  Changes to nanogetstr to enable Meta
	  keys to be grabbed, changes to onekey to print M-style shortcuts.
	- New macro TOGGLE which just toggles, no more silly checking
	  ISSET and then using SET or UNSET when we want a simple toggle
	  for a flag.
	- Added multiple buffer capability (God help us).  New configure
	  option --enable-multibuffer (-F), changes to do_insertfile(),
	  do_insertfile_void(), toggle_init(), do_gotoline(), edit_update(),
	  and write_file(), new functions add_open_file(),
	  open_file_change_name(), load_open_file(), open_file_dup_search(),
	  open_file_dup_fix(), open_prevfile(), open_nextfile(),
	  close_open_file(), get_full_path(), die_save_file(), etc.
	  (David Lawrence Ramsey)
	- Using --enable-extra automatically defines --enable-multibuffer
	  changes to version() and configure.in.
	- Moved to gettext 0.10.38 at the last second, sure to break
	  something, but at least I can run make distcheck!
- Makefile.am:
	- Include ABOUT-NLS and the new THANKS files to the distributed list.
- THANKS:
	- Initial, incomplete list of people to thank.
	- Added some more people.
- configure.in:
	- New option, --enable-nanorc, which allows people to have a .nanorc
	  initialization file and set options normally used on the command
	  line, and color later on.
	- Added --enable-color option to allow color and syntax highlighting
	  (stub as of now).
- cut.c:
  add_to_cutbuffer()
	- Remove useless statements. (Rocco)
  cut_marked_segment()
	- Add bizarre copy of bot node, else *BSD goes ballistic.  Fixes
	  bug #60.
	- Added 'destructive' argument.  Allows the selected text to be
	  added to the cutbuffer without changing the contents of the
	  file.  This allows writing selection to separate files.
  do_cut_text()
	- If the line is empty when using -k and wasn't already added,
	  create a dummy line and add it to the cutbuffer.  Fixes bug #61.
	- Reset marked_cut if we blow away the cutbuffer.
	- Moved the case of current == mark_beginbuf into cut_marked
	  segment, so do_writeout could call it when writing selection to
	  file.
  do_uncut_text()
	- Reset cutbuffer even if we're uncutting marked or cut to end text!
- faq.html:
	- Brought the FAQ up to date, many little changes. (Jordi)
	- Added sections 3.7 and 3.8 for the multibuffer and nanorc support.
- files.c:
  do_browser()
	- Minor fixes to the processing of SELECT function. (Rocco)
	- Added the "Goto Directory" code. (Rocco)
	- Don't shift the size of the file is it's less than 1K. Fixed
	  files less than 1K being displayed as 0B. (Rocco)
	- More Picoish keystrokes for the browser, ^P, ^N, etc, for up,
	  down, etc, and add the consistent ^C to exit. (Jim Knoble)
  do_writeout()
	- New code to allow writing selected text to a separate file.
	  When this is done, the current state is preserved.
  write_file()
	- New arg, nonamechange, means whether or not to update the
	  current filename after writing the file out.
	- Increment lineswritten when the very last line isn't null.
	  Fixes off by one count when writing selection to file.
- global.c:
	- Updated some of the lists for the "Goto Directory" code. (Rocco)
- move.c:
  page_up()
	- Rewritten with a loop to make screen updates work when
	  mark is set.  Fixes bug #59.
  do_home(), do_end()
	- Don't keep cutbuffer.
- nano.1:
	- Added the missing -r flag. (Jordi)
- nano.c:
  do_alt_speller()
	- Reposition cursor on same line as before ^T was called. (Rocco)
  ABCD(), main()
	- Add Alt-whatever-[a-d] support as well as Alt-whatever-[A-D].
  main()
	- Code to silently process "-g" and "-j". (Rocco)
	- Added Alt-[-7,8 support for home/end keys. (Jeff Teunissen)
  signal_init()
	- Reorder sigaction calls, use sigfillset() to stop SIGTSTP and
	  SIGCONT from being interrupted, allows suspending nano
	  to work more reliably, esp. with mutt, etc.
  do_suspend()
	- Don't try to play with the handler inside the handler.  Just
	  raise a SIGSTOP.  We also now write the "use "fg"" message to
	  stdout instead of stderr.
	- Added _POSIX_VDISABLE macro to fully ignore suspend keystroke.
	  Eliminates the possibility that nano can be suspended when
	  it's not supposed to be.  Many many many thanks to Jordi and
	  Tom Lear for helping out finding and fixing this bug!
  do_cont()
	- Now just does a refresh call instead of playing with the SIGTSTP
	  handler.
- nano.h:
	- Updated the BROWSER_LIST_LEN for the "Goto Directory" code. (Rocco)
- proto.h:
	- New shortcut list added: gotodir_list. (Rocco)
- search.c:
  do_gotoline()
	- Optimizations, remove "$" goes-to-last-line, less messages. (Rocco)
  do_replace()
	- If we manage to make it in somehow with VIEW_MODE on, abort
	  nicely.  Fixes bug #59.
- utils.c
  strcasestr()
	- Replaced by mutt's mutt_stristr function, because the thought
	  of dynamically allocating memory and copying each line in a file
	  to do a search or replace was causing me to lose sleep.
- winio.c:
  actual_x()
	- Remove inline from function decl. (Albert Chin)
- po/POTFILES.in:
	- Added utils.c to the list.
- po/es.po, po/ca.po:
	- Updated. (Jordi)
- po/gl.po:
	- Galician translation by Jacobo Tarrío.
- po/uk.po, po/ru.po:
	- New Ukrainian and Russian translations by Sergey A. Ribalchenko
	  <fisher@obu.ck.ua>, thanks!
- po/id.po:
	- Updated Indonesian translation by Tedi Heriyanto.
- po/it.po
	- Updated Italian translation by Marco Colombo.
- po/no.po:
	- New Norwegian translation by Eivind Kjørstad <ekj@vestdata.no>.
- po/sv.po:
	- New Swedish translation by Christian Rose <menthos@menthos.com>.

nano 1.0.1 - 2001.04.06
- General:
	- added configure option --disable-wrapping.  Does what it says,
	  no wrapping or checks are done.  Separate from --enable-tiny,
	  some may want a bare-bones Pico clone that does wrap text.
	  Affects configure, nano.c:do_char() and check_wrap() obviously,
	  version(), and do_char().
- aclocal.m4:
	- Minor patch for intl check (really this time). (Albert Chin)
- faq.html:
	- Fixed typo in section 6.1 (discovered by Bob Farmer).
- files.c:
	- fix two typos in comments, one in ChangeLog. (Matthias Andree)
  diralphasort()
	- Stop abort on symlinks. (Matthias Andree)
	- use strcasecmp to sort directory if available, pilot does that
	  as well. (Matthias Andree)
  filestat(), do_browse()
	- Changed lstat calls to stat, which fixes the browser not
	  following links to directories.  We only use lstat() when
	  printing the details of the file, and if it is a link, then
	  check via lstat() for link to a directory.  If it is
	  a directory, display (dir), else use the normal "--".
  do_browser()
	- Fix broken size suffix off-by-one errors. (Matthias Andree)
  cwd_tab_completion(), do_browse_from()
	- Use PATH_MAX instead of 0 arg to getcwd. (Matthias Andree)
	- Changed above to use PATH_MAX only when defined on the
	  system, as the HURD e.g. does not support it.
- intl/Makefile.in:
  distclean
	- added intl/libintl.h to the rm -f rule, should fix the unresolved
	  gettext symbols problem. (Jordi)

nano-1.0.0 - 2001.03.22
- General
	- Added void to functions declared as () args, nano.c:do_mark()
	  and search.c:regexp_cleanup(). (Christian Weisgerber).
	- Changed internal variables called "new" to "newnode" to avoid
	  the "new" C++ reserved word, even though there is likely no way
	  nano will EVER be compilable with a C++ compiler. (suggested by
	  Rocco Corsi).
- ca.po, es.po:
	- Final tweaks for Nano 1.0.
- cs.po:
	- Czech translation from Vaclav Haisman.
- nano.info:
	- Added dir entry. (Albert Chin)
- winio.c:
  statusq()
	- Added NANO_BACK_KEY and NANO_FORWARD_KEY cases for left and right.

1.0-test prerelease - 2001.03.17
- nano.c:
  do_wrap()
	- Added case for autoindenting text causing new line. (Adam)
	- Added SAMELINE case to above.  Added checks to cases 1b and
	  2b for placement of cursor.
- move.c:
  page_down()
	- Check for totlines < editwinrows in check for superfluous
	  edit update.  Fixes bug #57.
- search.c:
  print_replaced()
	- s/occurence/occurrence typos. (Jordi)
  search_init()
	- If using Pico mode and regex and same answer is entered, use
	  last_search string instead of answer.  Fixes bug #56.
- nano.texi:
	- Meta-Z correction and grammar in --enable-tiny desc. (Neil Parks)

nano-0.9.99pre3 - 2001.02.19
- General
  GNU compliance issues:
	- Reworked shortcut list, put "Get Help" into default list,
	  removed "Goto Line", aligned "Read File" with "Write Out" and
	  "Replace" with "Where is" for consistency.
	- Added texinfo manual nano.texi.  Added texi options to
	  Makefile.am.
- configure.in:
	- Autoconf compatibility fixes. (Pavel Roskin)
	- Added separate check for resizeterm().
	- ALL_LINGUAS: added hu and ca.
- cut.c:
  do_cut_text()
	- Marked text cut fixes.  Fixes bug #54. (Rocco)
- nano.c:
  do_delete()
	- Added check for current->next == fileptr, as we have a magic
	  line code again, fixes silliness at the end of the last line
	  before the magic line (reported by J.A. Neitzel).
  do_justify()
	- If the keystroke after the justify is not the unjustify key,
	  blank the statusbar (bug reported by Neil Parks).
  main()
	- Added ENABLE_NLS check around gettext stuff.
- winio.c:
  do_yesno()
	- Added localized yes, no and all strings to function and rewrote
	  handler for the new format.
- de.po:
	- Translation updates by Florian König.
- fi.po:
	- Translation updates by Pauli Virtanen.
- hu.po:
	- Hungarian translation by Horvath Szabolcs.
- id.po:
	- Translation updates by Tedi Heriyanto.
- es.po:
	- Translation updates and grammatical/typo fixes. (Jordi)
- ca.po:
	- Catalan translation by Jordi Mallach :)
	- Miquel Vidal <miquel@sindominio.net> went over it and corrected
	  many typos and completed bits that remained untranslated by error.

nano-0.9.99pre2 - 2001.01.31
General
	- Removed center_x and center_y globals.  center_y was
	  completely unused and center_x was only used a few places,
	  easily replaced with COLS / 2 (oops, not current_x & y (Rob)).
	- Deleted free_node, duplicate of delete_node, and changed all
	  free_node calls to delete_node.
	- Fix for resizing the window in modes other than normal edit mode
	  Changes to handle_sigwinch(), main().  Fixes bug #52. (Rocco)
- files.c:
  write_file()
	- Don't free() realname on error, if it needs to be free()d later
	  it will be (fixes crash on successful write after failed write,
	  discovered by David Sobon).
  username_tab_completion()
	- Optimization and removal of useless vars. (Rocco)
	- Rewritten using getpwent (suggested by Rocco).
	- Removed redundant conditional. (Rocco)
  real_dir_from_tilde()
	- Rewritten using getpwent (suggested by Adam, much optimized by
	  Rocco).
- global.c:
	- Don't define toggles global or toggle_init_one if using --tiny.
- nano.c:
  do_justify()
	- Added restoration of totsize after unjustify command.
  usage()
	- Add arg to -T help. (Rocco)
  global_init(), handle_sigwinch()
	- Messy loops replaced with memset calls. (Rocco)
  do_alt_speller()
	- Added code to parse multi-word alt_speller strings.
	- Fix initialization before fork().  (Rocco)
- proto.h:
	- Fix do_credits() proto (oops!)
- winio.c:
  nanogetstr()
	- Sanity check for x overrunning the string buffer len.

nano 0.9.99pre1 - 2001.01.17
General
	- Changed #ifdefs to check for both DISABLE_TABCOMP and
	  NANO_SMALL, makes tiny option leave out tab completion, which
	  should be left out in that circumstance.  Saves at least 5k.
	- Previous change to #ifdefs DISABLE_TABCOMP and NANO_SMALL rolled
	  back. (Rocco)
	- Various #ifdef & #ifndef cleanups. (Rocco)
	- Added message for when keypad goes awry.  Added code in main and
	  function print_numlock_warning() to notify user, and added an
	  appropriate section in the faq to refer to this brokenness.
	- Added macros in nano.h for magic values that might be unclear in
	  nano.c:global_init(). (Rocco)
- configure.in:
	- Fix for _use_keypad check breaking slang support (Christian
	  Weisgerber).
	- Changed to automatically define the 5 DISABLE variables when
	  NANO_SMALL (enable-tiny) is requested at configure.
- faq.html:
	- Added some info on making the binary smaller with the configure
	  script.
	- Added section on keypad bugginess.
- files.c:
  real_dir_from_tilde()
	- Oops, fix case where buf ="~", silly crash (bug discovered by
	  Neil Parks).
  do_browser()
	- Added space and - keys to do page up and down.
  cwd_tab_completion(), input_tab()
	- Changed bare malloc/calloc calls to nmalloc (found by Rocco).
	- Added memset() to matchBuf to ensure sanity. (Rocco, Adam)
- nano.c:
  ABCD()
	- New function, figures out what kbinput to return given
	  input common to several switch statements, allows us to
	  support the default Konsole key settings.
  main()
	- Alternate speller option no longer valid if DISABLE_SPELLER is
	  active. (Rocco)
	- Removed direct calls to usage() (#else) for -k (cut) or
	  -s (speller) options when these have been disabled. (Rocco)
	- Initialized kbinput to get around stupid compiler warning.
  nano_small_msg()
	- This function has been removed.  All references now call
	  nano_disabled_msg. (Rocco)
  version()
	- When NANO_SMALL (enable-tiny) is defined, the 5 main DISABLE
	  variables (SPELLER, HELP, JUSTIFY, BROWSER, TABCOMP) are not
	  reported as enabled when Nano is called with -V (--version)
	  command line option. (Rocco)
  usage()
	- Alternate speller option no longer valid if DISABLE_SPELLER is
	  active. (Rocco)
  window_init(), handle_sigwinch()
	- Added check for not having enough LINES to do anything useful,
	  if so die with an error. (Rocco)
  die_too_small()
	- Function to print the window too small error message, avoids
	  repeated string defs and globals.
  do_justify()
	- Small fix for totsize calculation. (Rob)

- fi.po:
	- Update by Pauli Virtanen.

nano 0.9.25 - 2001.01.07
General -
	- New file browser code.  New functions in files.c:do_browser(),
	  helper functions browser_init(), tail(), striponedir(),
	  filestat().  New shortcut list browser_list.  Some new
	  strings to translate.  Added function do_browse_from().
	- Keypad code has been changed slightly.  Now checks for
	  _use_keypad flag in window to see whether or not to turn
	  the keypad() back off when finished (taken from aumix).  Moved
	  to winio.c where it should probably be anyway.  New configure
	  check for _use_keypad in window struct.  This will have to do
	  for now.
	- Moved keypad() calls for PDCurses from main() to window_init()
	  so the keypad continues to work after a Meta-X, for example.
	  Fixes bug #51.
- faq.html:
	- Fix typos and small mistakes. (Jordi)
- files.c:
  username_tab_completion()
	- Added the (char *) sizeof when allocating memory for the filename
	  array. (Rocco)
  cwd_tab_completion()
	- removed skipping . and .. when tabulating matches.
	- Added the (char *) sizeof when allocating memory for the filename
	  array. (Rocco)
  do_writeout()
	- Now takes an argument so the string typed in can be retained
	  when calling the browser.
  do_browser()
	- Don't decrement longest by the length of path.  Fixes crashes
	  on entering various dirs. (Rocco)
	- Don't ungetch() the exit key, unneeded, fixes inserting a file
	  causes exit code.
- move.c:
  page_down()
	- Don't do an edit_update when there is only one page of text
	  (fileage == edittop && filebot == editbot).  Fixes bug #50.
- nano.c:
  main()
	- Reorder the getopt options to be more or less alphabetical
	  (suggested by Sven Guckes).
- winio.c:
  do_cursorpos()
	- Optimizations and cleanups by Rocco Corsi.
  do_credits()
	- Spell Erik Andersen's name right.
  titlebar()
	- Now takes an arg, needed for browser function.
  do_help()
	- Changed way of temporarily bringing up shortcuts at the
	  bottom in the help screen (actually works).
- utils.c:
  mallocstrcpy()
	- Takes char pointers now instead of void (makes debugging a
	  helluva lot easier)
	- Duh, don't do anything if src == dest!
- es.po:
	- Updates for file browser. (Jordi)

nano 0.9.24 - 2000.12.18
General
	- Added --disable-help option, affects acconfig.h, configure(.in),
	  winio.c:do_help, nano.c:help_init,help_text_init,version.
	- Changed filename to no longer use PATH_MAX, so it can work on the
	  HURD.  Changes in files.c:write_file(), new function
	  nano.c:clear_filename(), many changed in main(), a few other
	  places.  Please test this!
	- Added -b, -e, and -f flags, which we ignore as nano provides
	  their functionality already.
- cut.c:
  do_uncut_text()
	- Fix renumbering bug when uncutting marked text at filebot.
	- Fix screen not being displayed when we are uncutting marked
	  text at editbot (bug discovered by Ken Tyler).
	- Fix magic line not getting created when (you guessed it)
	  uncutting marked text at filebot. (Ryan Krebs)
- files.c:
  read_file()
	- If we encounter an error and insert is not set, run new_file()
	  (bug discovered by Ben Roberts).
  write_file()
	- Change open call flags, basically copy joe's way of doing it so
	  a more recent version will actually be included in (un)stable.
	- Remove useless fstat call.
  open_file()
	- Added check for S_ISBLK and S_ISCHR, don't open device files!
- nano.c:
  renumber()
	- Don't stupidly assign the value of prev->lineno if prev == NULL!
  main()
	- Added code to check for Alt-Alt (27-27) keystrokes and set the
	  next keystroke as a control sequence.  New variable
	  modify_control_key.  Removed #ifdef _POSIX_VDISABLE check
	  around Control-S,Q,Z handlers because we need it now for
	  the Alt-Alt-x code.
	- Added --view option to getopt_long() call (bug discovered by
	  Rocco Corsi).
  help_init()
	- Fix off by one error that was making ^G help in normal mode and
	  ^_ in Pico mode not be displayed in the help (bug discovered by
	  Rocco Corsi).
  do_toggle()
	- Added fix_editbot() call to fix improper redisplay of edit
	  window when using nohelp toggle (bug discovered by Rocco Corsi).
- nano.1, nano.1.html:
	- Updated man page for -b, -e, -f and expanded explanation for -p.
- winio.c
  do_help()
	- Force keypad on so F-keys and PageUp/Down will work properly.
	  Added check for NANO_EXIT_FKEY to loop.
- utils.c:
  new_magicline()
	- Increment totsize!!  We decrement it when we've read a file,
	  everywhere else it should automatically be incremented

nano 0.9.23 - 2000.12.08
General
	- Changed --disable-spell to --disable speller.  The term is
	  "speller" for -s, so it should be --disable-speller.
- files.c:
  write_file()
	- Added tmp check to TMP_OPT section (how appropriate).
	- Added new consistency checking code from securityfocus
	  article by Oliver Friedrichs, and use O_EXCL if tmp == 1.
	- We now run check on result of lstat(), not stat(), to be
	  safer.  New variable anyexists, we use still use realexists
	  later in the program.
	- OOPS, line up link/unlink/rename check if conditional with
	  top if conditional.  Option -l has been broken for 9 versions,
	  no one noticed?!
	- Added saving perms at end of link so we can apply them to the
	  new file if --nofollow is used.
- winio.c:
  edit_add()
	- Off by one display error (fix by Rocco Corsi).
  do_replace_highlight()
	- New code to handle being past COLS. (Rocco Corsi)
	- Moved from search.c, as it's definitely a winio function now =)
  update_line()
	- More '$' display fixes. (Rocco Corsi)

nano 0.9.22 - 2000.12.02
- General
	- Username tab completion code, and cleaned up existing tabcomp
	  code. New functions real_dir_from_tide(), append_slash_if_dir(),
	  username_tab_completion is more than a stub now =-).
	- Ignore key sequence 543 & 545, right control and alt keys in
	  windows. Affects main() and winio.c:nanogetstr().
	- Took out help from spell_list and changed SPELL_LIST_LEN to 1.
	  Is using a spell checker THAT difficult? =-)
	- New function nano_disabled_msg(), to alert that certain
	  functions have been disabled, similar to nano_tiny feature.
- New configure options:
	- Added configure argument --disable-tabcomp.  Affects
	  bottom of files.c and write_file, utils.c:check_wildcard_match()
	  and winio.c:nanogetstr().
	- New options --enable-extra.  New code in nano.c:version() to
	  print out various options from ./configure, function do_credits().
	- Added --disable-spell option for those who want to just disable
	  the spell check feature.  Affects the spelling functions
	  do_spell, do_int_speller and do_alt_speller.
	- Added --disable-justify to get rid of the justify function.
	  Affects do_justify() (not surprisingly).
- files.c:
  write_file()
	- Unsetting modified on temp files bug fixed. (Rocco Corsi)
	- Okay, if tmp == 1 and the file exists, we abort.
  do_insertfile()
	- Added call to real_name_from tilde, oops.  Added check for
	  DISABLE_TABCOMP.
  read_file()
	- Added check for fileptr == NULL.
- global.c:
  shortcut_init()
	- Now takes an argument as to whether to display the unjustify
	  shortcut or the normal uncut text one.  Needed to accommodate
	  the kludgey unjustify code.
- nano.1, nano.1.html:
	- Updated date on pages because of -p changes.
	- Added "NOTES" section, where I explain what nano.save & friends
	  are.
	- Added a copyright notice for the manpage, under the GPL.
	- Other minor changes.
- nano.c:
  do_justify()
	- Wrote unjustify code.  Borrows cutbuffer and stores the unjustified
	  text there, then grabs the next keystroke and, if the unjustify
	  key, gets rid of the justified text and calls do_uncut_text.
	  Added macro NANO_UNJUSTIFY_KEY.
  do_int_spell*
	- Various fixes. (Rocco Corsi)
	- Changed abort of program to aborting based on value of "edit a
	  replacement" question, and not caring about the replace loop
	  return value.  That way the user can get out of the replace loop
	  and continue spell checking (very important to me anyway).
  version()
	- Took out huge check for the various --disabled macros,
	  eventually there will be too many to reasonably check for.
  nano_small_msg(), nano_disabled_msg()
	- Added checks for disabled functions to see whether or not to
	  declare them.
  do_next_word()
	- Update the previous line as well as the current one in case we
	  have moved beyond COLS or back from COLS, patch submitted
	  by Ryan Krebs.
  die()
	- Now creates .save file using variable-length strings.  Also
	  calls write_file with tmp == 1, which happens to do exactly what
	  we want (abort on save file exists and use mode 0600).
  handle_sighup()
	- Now calls die instead of writing on its own and exiting normally.
- search.c:
  do_replace_highlight()
	- New function, displays the currently selected word as highlighted
	  in the spell check.  Called from do_replace_loop. (Rocco Corsi)
	- Added calls to curs_set(0) and (1) to disable the cursor when
	  highlighting, looks much better.
- es.po:
	- Traditional Spanish strings updates.

nano 0.9.21 - 2000.11.23
- AUTHORS
	- Added Rocco Corsi.
- nano.c:
  main()
	- Changed check for argc == 1 to argv[optind] == NULL to decide
	  whether or not to display "New File" in the statusbar.
- search.c:
  findnextstr()
	- Fix current_x increment bug by using another variable. (Rocco Corsi)
  search_init()
	- Silly typo in our "one simple call" of statusq.  Stopped
	  previous search string from being displayed.
  do_replace()
	- Copy back the previous value of last_replace into answer if
	  using PICO_MODE and answer == ""
- winio.c:
  do_up()
	- Deleted first update_line() call, screws up display when marker is
	  set.
- nano.1, nano.1.html
	- Updated man page for new -p definition.

nano 0.9.20 - 2000.11.18
- General
	- Ran source through indent -kr again.  Make everything pretty.
	- Changed behavior of "search" and "replace" prompts to make all
	  previous values editable.  This change was made so that you can
	  replace with the null string without needing a special key for it.
	  changed code in search_init(), do_replace(), nanogetstr (see
	  below).
	- Added some missing gettext calls here and there. (Jordi)
	- Revamped nanogetstr() and calls to it to use variable length
	  strings.
	  MANY changes in nanogetstr(), many chances in search.c, new
	  function mallocstrcpy which is sure to be a programmatic
	  nightmare, changed last_search, last_replace, answer to
	  pointers.  New function not_found_msg in search.c for displaying
	  truncated strings in statusbar when the string is not found
	  (-pedantic fixes by Rocco Corsi). We disable this feature when
	  using PICO_MODE (-p).
	- New spelling code by Rocco Corsi.  New functions
	  do_int_speller, do_alt_speller, changes to do_spell in nano.c,
	  New functions search_init_globals and do_replace_loop, changes
	  to search_init(), do_replace, findnextstr, moved last_search and
	  last_replace back to nano.c (*shrug*).
	- New tab completion code.  Used check_wildcard_match, input_tab,
	  cwd_tab_completion, username_tab_completion from busybox,
	  hacked them a lot, changes to nanogetstr().  nanogetstr() and
	  statusq() now take an arg for whether or not to allow tab
	  completion.
	- Fixed value being input in statusbar during a search or replace
	  and CASE_SENSITIVE or the other search is called and the
	  string being typed in is blown away.  Reported by Ken Tyler.
	- Changed PICO_MSGS flag to PICO_MODE, changed help strings
	  accordingly.
- files.c:
  do_writeout()
	- Change strcpy to answer to mallocstrcpy.
- global.c
	- New global replace_list_2, for 2nd half of the replace dialog
	  ("Replace with:"), has fewer options than first half because
	  they were inappropriate.
  toggle_init()
	- Added #ifdef around toggle_regex_msg to get rid of compiler
	  warning.

- nano.c:
  keypad_on()
	- New function, toggles turning the keypad on and off in edit and
	  bottomwin().  Added call to this in finish().  Fixes bug #45.
- search.c
  findnextstr()
	- New arg for begin_x variable, basically a rewrite that
	  makes a little more sense and isn't quite as messy. (Rocco Corsi)
	- Update the line we're checking if not the whole screen, because
	  it's quite possible the search team could exist somewhere way
	  to the right on the same line, for example.
  replace_abort()
	- Add reset of placewewant, stops cursor from jumping when moving
	  cursor after a replace.
  do_replace()
	- Added code for Gotoline key after entering the search term.
	  Fixes bug #46.
	- Removed redundant code involving processing replacement string.
	  Converted if statements to switch statements.
	- Optimizations by Rocco Corsi.
	- Removed code for deleted shortcuts from in replace_list_2.
  do_search()
	- Converted if statements to one switch statement.
- winio.c
  nanogetstr()
	- Added check for 343 in while loop to get rid of getting "locked"
	  into statusbar" bug in odd $TERMs like iris-ansi.
	- Changed check to return -2 on "enter" from answer == ""
	  to answer == def.
	- Fixed fallthrough code because there was no break.  Make much
	  more sense now.
	- Added check for ASCII 54[124] when using PDCurses, ignore them
	  if noticed.
  nanoget_repaint()
	- New function, removes about 30 lines of duplicate code in
	  nanogetstr().
	- Black magic code to make $ appear in prompt if we're past
	  COLS.
  blank_edit()
	- Removed wrefresh() call, much less choppy now.  If there's a need
	  for a wrefresh after a specific call, let me know.
- es.po:
	- Updated translation for 0.9.20. (Jordi)

nano 0.9.19 - 2000.10.02
- General
	- Added PDCurses support under cygwin, which allows building
	  a nice stand-alone nano.exe for those poor Windows users.
	  Extra check in configure.in for initscr() in -lcurses (as
	  PDcurses has no tgetent), some #ifdef PDCURSES statements
	  in main().
	- Changed web site and email to new nano-editor.org domain.
- nano.c
	- Added (int) casts to remove compile warnings with -Wall.
  main()
	- Added check for _POSIX_VDISABLE around term variable definition.
- search.c
	- Added initializations for last_search and last_replace.
	  (Rocco Corsi)

nano 0.9.18 - 2000.09.18
- General
	- Changed _POSIX_VERSION checks in regex code to HAVE_REGEX_H,
	  added check for regex.h in configure.in.
- configure.in:
	- Added default case for cross-compiling to get rid of annoying
	  AC_TRY_RUN warning.
- cut.c:
  do_cut_text()
	- Don't immediately abort if we're on filebot and the marker is
	  set.  Fixes bug #42.
- files.c:
  open_file()
	- Fix for bug #44. (Rocco Corsi)
- global.c:
  shortcut_init()
	- Added in FKEYs that for some reason were left out.  *boggle*
- nano.c:
  main()
	- Added check for _POSIX_VDISABLE and use raw mode if not
	  available, allows nano to work with cygwin.
	- Added gettext calls to enable/disable strings. (Jordi)
	- Revamped a great deal of the F-key and keypad key handling,
	  because we no longer use keypad() (see below).
	- Removed keypad() call because nano was not working with the
	  keypad on many terminals, which is very bad.
	- Made insert key call do_insertfile().
  do_toggle()
	- Rewrote function to allow NOHELP toggle to work on systems
	  without a working resizewin().  New function window_init().
  mouse_init()
	- Add keypad only if mouse support is on, otherwise mouse doesn't
	  work.  I guess you have to choose between having the mouse and
	  having a working keypad for the time being (thank god for Meta-M).
- winio.c:
  total_refresh()
	- Added titlebar() call.
  onekey()
	- Off-by-one error fix fix. ;-) (Rocco Corsi)

- search.c:
  findnextstr()
	- Reset starting at current for search instead of begin.
- es.po:
	- Translated new strings and minor updates. (Jordi)
- de.po
	- Revised translations by <floki@bigfoot.com>.

nano-0.9.17 - 2000.09.04
- General
	- New shortcuts to toggle certain options that are normally only
	  flags via Alt/Meta.  See Alt-C,E,I,K,M,P,X,Z.  New struct called
	  toggles in nano.h, toggle_init(), toggle_init_one() in global.c
	  called from shortcut_init(), and do_toggle in nano.c.  Also
	  moved the signal code into a separate function in nano.c called
	  signal_init().  Moved "struct sigaction act"into a static in
	  nano.c.
	- Changed from Alt-key symbol (@) which is completely nonstandard
	  to the *nix "Meta" symbol (M-).  Changed help_init to show
	  the M-key usage and the help text to explain keys which generate
	  Meta.  Moved the toggle Meta keystrokes to the first column
	  instead of the third as they are the primary keystrokes for the
	  functions.  Thanks Mini editor team :->
	- Changed last_search and last_replace vars to statically
	  allocated (hence nulled) and moved to search.c. (Matt Kraai)
- global.c:
  toggle_init()
	- Changed "No auto wrap" and "No help mode" to "Auto wrap" and
	  "Help mode". See the change to do_toggle() below.
- nano.c:
  do_mouse()
	- Patch for handling lines w/tabs and mouse better. (Ben Roberts)
  do_wrap()
	- Made wrapping code less ambitious.
  do_toggle()
	- Added checks for no help and no wrap mode, and print opposite
	  enable/disable message.
  do_suspend(), do_cont():
	- New functions, handle suspend signal in a Pico-like manner and
	  work with Meta-Z.
- winio.c:
  total_refresh()
	- Added edit_refresh() call to actually update the screen if messy.
  edit_refresh_clearok()
	- New function, does a total update for edit refresh, needed to fix
	  lack of reversed text on searching with MARK_ISSET.
  onekey()
	- Off-by-one error fix. (Rocco Corsi)

  update_line()
	- Added check for binary data >= 1 and <= 26, and use ^+letter
	  to display it.   Should fix editing text files with binary
	  data in them.  Placing of the cursor seems to be a bit screwed
	  though...
- search.c:
  search_abort()
	- Now calls edit_refresh_clearok when MARK_ISSET to handle screen
	  ugliness bug (reported by Ken Tyler).
  findnextstr():
	- Added reset for placewewant. (Ben Roberts)
	- Fixed check for string that only occurs on the same line failing
	  (bug discovered by Ken Tyler).

nano-0.9.16 - 2000.08.09
- cut.c:
  do_cut_text()
	- Fixed getting locked into cutbuffer on cutting first line of file.
	- Added check_statblank().
	- Check for fileptr == filebot, if so return, we shouldn't bother
	  cutting the magic line.
  do_uncut_text()
	- Added check_statblank().
- nano.c:
  main()
	- Changed tabsize long arg to actually accept an argument *sigh*.
- po/Makefile.in.in:
	- Patch to handle $DESTDIR (orig by Dan Harnett contributed by
	  Christian Weisgerber)
- configure.in:
	- New (and severally revised =) slang test code (Albert Chin-A-Young)

nano-0.9.15 - 2000.08.03
- Changed edit_update call to take arguments TOP, CENTER or BOTTOM.
  Affects many many functions.  Removed functions edit_update_top and
  edit_update_bot.
- Added global variable tabsize, we no longer screw with the curses
  library in order to implement -T (suggested by Christian Weisgerber).
- configure.in:
	- Finally fixed check for slang to report "no" if not called
	  with --with-slang or --without-slang
- nano.c:
  splice_node()
	- New function, abstracts linking in nodes.  Fixes bug #36.
  null_at()
	- New function, nulls a string at a given index and realigns it.
  delete_buffer()
	- Removed, same as free_filestruct().
  do_backspace()
	- Now calls page_up_center instead of page_up (as it should?)
  do_enter()
	- Fixed typo (?) in check for inptr->next.  Caused lots of
	  grief for editing lines at filebot.
  main()
	- Removed now useless usertabsize variable. (Christian Weisgerber)
- search.c:
  replace_abort()
	- redundant, now just calls search abort until it does something
	  different.
- winio.c:
  edit_refresh()
	- Added check for current line "running" off the screen.
	  Hopefully this will not cause any recursive lockups.
	  (Who am I kidding, of course it will!)
	- Added check to stop infinite loop calling edit_update.
  edit_update()
	- Rewritten, hopefully this will remove a lot of the
	  scrolling the cursor back and forth needlessly.
- move.c:
  page_down()
	- do an edit_update() at last case.  Made function more like
	  Pico's version, only move down to two lines before editbot.
  page_up()
	- Made function more like Pico's version, only move down to two
	  lines after edittop.

nano-0.9.14 - 2000.07.27
- nano.h:
	- Set CUT_TO_END to a different bit than TEMP_OPT.  Fixes bug #32.
- cut.c:
  do_cut_text()
	- Added check for MARK_ISSET when using CUT_TO_END.  Fixes bug #31.
	- Simplified check for freeing cutbuffer.  Added checks for doing
	  multiple cuts with -k, now sets marked_cut to 2 for later
	  processing by do_uncut_text().
  do_uncut_text()
	- Added handler for uncutting with -k cuts.
- files.c:
  write_file()
	- Removed (redundant) check for writing out files with -t.
  do_writeout()
	- Changed check for filename to filename[0].  Added some code,
	  overall fixes bug #30 =-)
- nano.c:
  do_justify() & do_wrap():
	- totsize-related fixes. (Rob)
- de.po
	- Revised translations by floki@bigfoot.com

nano-0.9.13 - 2000.07.23
- Implemented Pico's -k mode.  New flag CUT_TO_END, option (-k, --cut),
  affects do_cut_text in cut.c.  Not available with SMALL_NANO because it
  depends on the marker code which is not available with that setting.
- Changed static temp_opt to flag TEMP_OPT.  Fixed bug #29 (using
  -t with an unwritable file causes users to get locked into editor).
- move.c
  page_down()
	- Don't edit_refresh() if the bottom of the file is in the edit
	  buffer. (Adam)
- nano.c:
  main():
	- TABSIZE now set before first call to edit_refresh. (Bill Soudan)
	- Different ^C kill code (patch by Christian Weisgerber).
  die():
	- More intelligent emergency-save filename selection. (Rob)
  do_spell():
	- Changed exit semantics a bit so that aspell wouldn't get
	  all screwy (bug discovered by Joshua Jensen).
- files.c:
  read_file():
	- Added init of buf variable, hopefully this will stop the
	  "bleeding" of text seen with mutt and using i18n.
  write_file():
	- Added code to check to see if using -l and the file is not
	  in fact a link.  This should fix the behavior where a file
	  that does not have write permission but could be removed and
	  rewritten is saved without error.  Please test this feature
	  and give feedback.
- search.c:
  search_init():
	- Added " (to replace)" statement to end of search string if
	  we are doing a replace.  Manually converted all the translations
	  from '%s' to '%s%s' to ensure they still work with the new code.
	  Also put in the translation for " (replace)" in the .po's.  Hope
	  I didn't step on your toes doing this Jordi. (Chris)
  do_search(), do_replace():
	- Removed call to search_abort()/replace_abort() before call to
	  the opposite function.
	- Fixed bug #28.
  findnextstr()
	- do not center string found if it is currently visible. (Adam)
- fr.po:
	- French update by Clement Laforet <clem_laf@wanadoo.fr>.
- es.po:
	- Updated strings to 0.9.13. (Jordi)

nano-0.9.12 - 2000.07.07
- all:
	- New regexp search feature by Bill Soudan.  New flags USE_REGEXP
	  and REGEXP_COMPILED, new functions regexp_init, regexp_cleanup
	  replace_line, replace_regexp in search.c, changes to
	  search_init() and do_replace() and strstrwrapper().
	- Added _POSIX_VERSION check to regexp code.  Better than nothing
	  for non-POSIX systems...
	- Made search functions & keys more like Pico.  Added goto line from
	  search and replace function, changed wording to "No Replace" instead
	  of "To Search", "To Replace" to simply "Replace", and changed to
	  Pico's keystroke by default, ^R. Affects search_init(),
	  do_search() in search.c, globals in nano.h and
	  shortcut_init() in global.c.
	- changed 'sprintf' calls to safer 'snprintf'. (Rob)
- cut.c
	- further totsize update corrections
- files.c:
	- changed do_insertfile to call fix_editbot (Rob)
	- Magic Line code in read_file (Rob)
- nano.c:
	- Removed dual alt_speller variables, oops! (Rocco Corsi)
	- Removed unnecessary do_oldspell function. (Rocco Corsi)
	- Added SMALL_NANO #ifdef around actual spell function.
	- Moved page_up() to move.c where is belongs.
	- Corrected FIXME in do_enter with explanation. (Rob)
	- Fixed FIXME in do_justify, resulted in creation of
	  fix_editbot [also fixed in do_enter] (winio.c). (Rob)
  help_init():
	- Moved newline out of if statement. (Rocco Corsi)
  do_char():
	- Magic Line related code in do_char. (Rob)
  do_backspace(), do_delete():
	- Added magic line code here too.

- de.po:
	- Revised translations by floki@bigfoot.com.
- fi.po:
	- Finnish translation by pauli.virtanen@saunalahti.fi.
- utils.c:
	- Added new_magicline()
- winio.c:
	- Added stdlib.h to includes, found by OpenBSD gcc.
	- lots of new commenting around display functions
  do_yesno(), nanogetstr():
	- Removed now unnecessary raw/cbreak combos.
	- Removed gettext calls from "Y(es)", "N(o)", "A(ll)" and "^C", till
	  we decide if those keybindings should be translated. (Jordi)
  clear_bottomwin():
	- Removed wrefresh(edit) call.
  edit_update_top():
	- Fixed a bug that caused nano to not update when
	  current->next == NULL (e.g. paging down to the very bottom of
	  ABOUT NLS wouldn't work).
  fix_editbot:
	- Added (should rebuild editbot from a valid edittop). (Rob)
  edit_add:
	- removal of redundant call to mvwaddnstr.

nano-0.9.11 - 2000.06.20
- New flag "-T" or "--tabsize" to specify how to display tab widths.
  Affects main() in nano.c, strlenpt(), xpt() and actual_x() (et al) in
  winio.c, and nano.h.  Many hardcoded "8"s have been changed to the
  TABSIZE int.  Added changes to nano.1 and nano.1.html.
- id.po:
	- Indonesian translation by Tedi Heriyanto.
- es.po:
	- Updated translation. (Jordi Mallach)
- winio.c
	- Rewrite of display functions to correct the display problems
	  we had been seeing. Affects: add_marked_sameline, edit_add,
	  and many others. (Rob Siemborski)
	- totsize fixes. (Rob Siemborski)
  total_refresh():
	- Cut display_main_list call, as this function is only supposed to
	  refresh what's already on the screen, not go through the process
	  of adding the text again.
- cut.c:
	- totsize fixes. (Rob Siemborski)
- nano.c:
	- experimental do_wrap and check_wrap. (Adam Rogoyski)
	- Removed editwineob, as it was redundant for (editwinrows - 1).
	  Changed all calls to editwinrows - 1 in nano.c and move.c.
	- Removed all functions that were split into other files.
	  Affects LOTS of funcs.
  do_enter():
	- Added reset of placewewant to end.
  do_insertfile():
	- Fix display problem when using Ctrl-R to load a file
	  into the buffer. (Rob Siemborski)
  handle_sigwinch():
	- Added titlebar(), edit_refresh() and display_main_list() calls
	  because a resize wasn't picking up on possible different width
	  correctly.
- utils.c:
	- Moved nmalloc() and nrealloc() here.
- move.c:
	- New file, contains movement functions (like do_home(), do_up(),
	  do_down(), page_up(), etc...).
- files.c:
	- Contains functions for files (read_file, insert_file,
	  do_writeout(), etc).
- search.c:
	- Contains all our searching and related functions, (do_search(),
	  findnextstr(), do_replace(), do_gotoline()).

nano-0.9.10 - 2000.06.04
- es.po:
	- Translation updates. (Jordi)
- AUTHORS, nano.1.html, TODO, README:
	- Documentation and email address updates. (Jordi)
- nano.c:
  main():
	- Moved Adam's termio code down to after getopt() and before initscr()
	  to stop people losing their SIGINT character when using args that
	  exit nano before it runs (--version, --help, etc).

nano-0.9.9 - 2000.05.31
- Makefile.am:
	- Added proper lines for defining LOCALEDIR.
- configure.in:
	- Spelling fixes. (Jordi Mallach)
	- Removed CFLAGS changes for gcc, reduces portability according to
	  some, and it certainly doesn't seem to decrease exe size.
- es.po:
	- Spanish translation updates. (Jordi Mallach)
- POTFILES.in:
	- Added global.c file, was screwing up translations (i.e. they
	  weren't getting done).
- cut.c:
  add_to_cutbuffer():
	- Added totsize increment.
	- Cut fixes and optimizations. (Rob Siemborski)
  do_uncut_text():
	- Added totsize increment in several places.
- nano.c:
  headers:
	- Removed LOCALEDIR define.
  do_justify():
	- Added edit_refresh() call (bug discovered by Adam).
  page_down_center():
	- Added call to edit_update(current) for last case.  Removed
	  increment of current_y since it's now just wasteful.
  do_enter():
	- Added totsize increment.
  renumber(), renumber_all():
	- Removed totsize-- and totsize init in renumber_all.
  do_mouse():
	- Added edit_refresh() call to show highlight updates.  Removed
	  unnecessary wrefresh(edit).
  main():
	- Moved up locale calls so that translated --help messages would
	  actually get translated.
  do_backspace(), do_delete():
	- Added decrement of totsize.
  init_help_msg():
	- New function, initializes help text if NANO_SMALL isn't set (fixes
	  broken i18n).
  read_file():
	- malloc call changed to nmalloc. (Rob Siemborski)
- winio.c:
  total_refresh():
	- Completely rewrote function, not quite so brain-damaged now.

nano-0.9.8 - 2000.05.18
- nano.c:
  main():
	- Added awesome code that disables the CINTR and CQUIT
	  character (Adam Rogoyski).  Removed raw()/noraw() calls so that
	  nano gets input in 'normal' mode, which is the Right Way(tm) to
	  do it. ^S, ^Z and ^Q now work properly as a result, as well as
	  ^C.  New variable term, global variable oldterm to save previous
	  term settings, and changes to finish() and die().
	- Added extra #ifdefs in getopt code, so that above code and
	  flag init is run even if GETOPT_LONG is not #defined.
	- Added memset line before sigactions. (Adam Rogoyski)
  do_suspend():
	  Removed function, see above for why.
- winio.c:
  update_line(), center_cursor():
	- Removed wrefresh(edit) from bottom of functions.  wrefresh
	  should now only be called once, at the bottom of the main()
	  loop.
- global.c:
   shortcut_init():
	- Removed suspend sc_init call and suspend message because suspend
	  is no longer needed in the shortcut list to work properly.

nano-0.9.7 - 2000.05.14
- nano.c:
  do_home(), do_end():
	- Added calls to update_line for the current line, fixes
	  lack of update (bug discovered by Alberto García).
  main():
	- Added SET(FOLLOW_SYMLINKS) before getopt call, fixes not
	  following symlinks even when -l isn't set, and "no changes"
	  error when nano is called from crontab -e. (Adam Rogoyski)
- cut.c:
  do_cut_text():
	- Added edit_update_top to cut when mark is set, fixes lack of
	  display update (bug discovered by Ken Tyler).

nano-0.9.6 - 2000.05.08
- New Italian translation (it.po), by Daniele Medri.
- nano.c:
  page_up(), page_down():
	- Added reset of placewewant to 0, as it should be.
  do_up(), do_down():
	- Added call to update_line() for line we move from and line we
	  move to, in order to keep the highlighting correct.
  do_wrap():
	- Added var chop, new code to wrap lines more like Pico, mostly.
	  THIS STILL DEFINITELY NEEDS TO BE REWRITTEN!
- winio.c:
  do_help():
	- Added edit_refresh() before exit.
  update_cursor():
	- Removed cursor updating which really wasn't needed anyway.
  edit_update():
	- Removed yucky code that didn't work, this function now just
	  computes edittop and editbot and calls edit_refresh() to do the
	  rest, which removes a lot of duplicate code...

nano-0.9.5 - 2000.05.01
- Removed bytes from file struct because it was computationally wasteful.
- cut.c:
  do_uncut_text():
	- Added call to edit_refresh().
- nano.c:
  do_backspace():
	- Added reset of editbot when deleting the last line of the file
	  (bug discovered by Adam).
  do_char():
	- Removed call to reset_cursor().
  do_delete():
	- Added similar check as to do_backspace().
  do_enter():
	- Added call to edit_refresh().
  do_left(), right():
	- Added call to update_line(), still redundant but better...
  do_up(), do_down():
	- Added refresh calls both for current line and line to which
	  we are moving.
  main():
	- Removed inefficient call to edit_refresh() after every keystroke.
	  It is now up each function to leave the screen in a good state.
- winio.c:
  do_cursorpos()
	- Rewritten to not use bytes from filestruct by an incremental sum.
  update_line(), reset_cursor():
	- Optimized calls to xplustabs() through a single variable.
	- update_line() now takes a new arg, an index into the string
	  for where to update the line from.  Needed for new update
	  code.
- configure.in:
	- Better checks for slang, allows argument to --with-slang.
	  (Albert Chin-A-Young)
	- Removed -Iintl from CFLAGS in gcc check.
- Makefile.am:
	- Addition of -Iintl for gettext (Albert Chin-A-Young)

nano-0.9.4 - 2000.04.25
 - Fixed calls to no_help and changed them to the more consistent
   ISSET(NO_HELP).  Fixed return val of no_help to be what it should (2,
   not 1.  Code to temporarily disable NO_HELP when in the
   help system. (Adam Rogoyski)
- cut.c:
  do_marked_cut(), do_cut(), do_uncut():
	- Commented out unnecessary bits when NANO_SMALL is being used.
- winio.c:
  xpt(), strlenpt(), actual_x():
	- Added check for value of data[i] & 0x80, if so do not make
	  character 2 chars wide (orig. by Chris, 0x80 check by Adam).
  edit_refresh():
	- New check for temp == NULL (bad thing), if so go back to the
	  previous line.  New filestruct var hold points to prev line.
	  Fixes segfault when paging down to the end of a file.
- nano.c:
  write_file():
	- Added check for if file exists and is not equal to the current
	  filename, prompt for overwrite. (Adam Rogoyski)
  do_down():
	- Removed check for current->next == NULL, now checks return value
	  of do_down before setting current_x = 0 (discovered by Adam).
  do_justify():
	- Fixed segfault when reaching the last line (tried to assign
	  current->next->data when current->next == NULL) (discovered
	  by Adam).
- utils.c:
	- Removed extra macro defs that are now in nano.h.
- nano.h:
	- Changed macro SET() to use |= instead of ^=.  Fixes bug in
	  cut code when cutting more than one line, and cutbuffer gets
	  blown away when it shouldn't.

nano-0.9.3 - 2000.04.29
- cut.c:
  do_marked_cut():
	- Fixed off by one error in cut code for marked text.
  do_cut_text():
	- Removed check for being on the last line, part of
	  magic line code.
  add_to_cutbuffer():
	- Moved tmp->prev = inptr line to part where cutbuffer != NULL.
	- Added inptr->prev = NULL for case where cutbuffer == NULL.
- nano.c:
  do_backspace(), do_char():
	- Removed "magic line" code.  It was basically causing more bugs
	  than it was helping for the sake of compatibility.  This fixes
	  at least one known segfault condition.
  do_enter():
	- Added setting editbot to new node if the new node is the last
	  node in the file.
  write_file():
	- Changed writing file behavior.  Now, if last line of the file
	  has any data on it, we write a newline on it, else we don't.
- winio.c:
  add_marked_sameline():
	- New code that checks for whether the begin and end of the marker
	  are on different lines.  Missing previously.
  edit_add():
	- added some more checks for text length.  Cleaned up some
	  mvwaddnstrs that could be written more simply as waddnstrs.
  edit_refresh():
	- Removed check for temp == filebot, it is now treated like any other
	  line.  Fixes a bug where selected text on the last line shows
	  normally.
  xpt():
	- Removed an extra computation for tabs variable that was incorrect.
  xplustabs():
	- Since xpt now actually works, this func is now just a wrapper for
	  xpt(current, current_x)
- nano.1, nano.1.html:
	- Added -l option to man pages.
- configure.in:
	- New option --enable-tiny, #defines NANO_SMALL in config.h.
	  Disables call to gettext in functions and other i18n stuff in
	  nano.c, the detailed help mode, the resize functions, and the
	  justify code which no one ever uses.
	- New option --with-slang.  Enables slang libraries instead of
	  ncurses, requires slcurses.h for wrapper functions. (Based
	  on patches for 0.8.7 by Glenn McGrath).

nano-0.9.2 - 2000.04.15
- This release just fixes the serious segfault problem if nano is
  invoked any way other than using the absolute path.  The bug was
  in the new code for checking whether nano is invoked as 'pico'.

nano-0.9.1 - 2000.04.14
- Added Pico compatibility for ^T when in search or switch to switch
  to the opposite function.  Added one to REPLACE_LIST_LEN and
  WHEREIS_LIST_LEN in nano.h, new args to sc_init_one in global.c and
  new strings that will have to be gettext()ed.  New argument 'replacing'
  to search_init().  Handlers in do_replace and do_search().
- New write code, now follows symbolic links instead of replacing them
  with the new file.  New option (-l, --nofollow) to enable the old
  (incorrect, but secure) behavior. (Adam Rogoyski)
- nano.c:
  do_wrap():
	- Fixed another bug relating to wrapping, and which would cause
	  a segfault *sigh*.
  do_replace():
	- Incremented current_x by the length of the replacement
	  text inside the main replace loop.  Fixes bug #15.
  add_marked_sameline():
	- New function, handles marked text when start & end of marker is
	  on one line, also supports most marked text when cursor > COLS.
  main():
	- Code to check if nano is invoked as 'pico', and if so
	  automatically set pico_msgs. (Robert Jones)

nano-0.9.0 - 2000.04.07
- nano.1, nano.1.html:
	- Updated man page with my email address and homepage.
- winio.c:
  reset_cursor(), update_line():
	- Changed update algorithm for x value to (COLS - 7) multiple when x
	  value > (COLS - 2).
- edit_refresh():
	- Removed inner loop code, now calls update_line() for each line
	  in question, MUCH nicer.
- xplustabs(), xpt():
	- Removed redundant increment of tabs when column no % 8 == 0.
	- Added check for data[i] < 32, most of such bits are 2 chars wide.
- update_line():
	- Fixed a stupid call to strlenpt with col when we should have
	  been using actual_col.  Ugh.

nano-0.8.9 - 2000.03.22
- nano.c:
  empty_line(), no_spaces(), justify_format(), do_justify():
		Actually added these (screwup applying patch).
  do_justify():	Added call to set_modified().

nano-0.8.8 - 2000.03.12
- Preliminary internationalization support.  Many many functions modified
  to use gettext (via _() macro).  es.po file included. (Jordi Mallach)
  New dirs po/ and intl/, changes to configure.in and Automake.am to
  support i18n.
- nano.c:
  includes:	Added sys/param.h and limits.h. (Adam Rogoyski).
  statics:	Changed some things that were not necessarily static
		(Adam Rogoyski).
  nrealloc():	New function, similar to nmalloc().  Changed calls from
		realloc() to nrealloc. (Adam Rogoyski)
  empty_line(), no_spaces(), justify_format(), do_justify():
		New functions for justify function. (Adam Rogoyski)
- winio.c:
  blank_edit():	Added wrefresh call to edit so that screen updates (like
		on ^L) actually work.
  xplustabs(), xpt(), strlenpt(): Fixed off-by-one buglets. (Adam Rogoyski)

nano-0.8.7 - 2000.03.01
- main.c:
  do_wrap():	Better fix for segfaults, and fix for lines being wrapped
		to a single character on one line when no good place to
		break the line exists, and for wrapping lines longer than
		COLS.
- nano.1.html:
		Html version of man page, now included in dist.  For
		the benefit of nano packages in Linux distributions.

nano-0.8.6 - 2000.02.24
- global.c:
  shortcut_init():
		Added shortcuts for goto_line and do_replace when using
		pico_msgs.  Oops.
- nano.c:
  statics:	Changed fill back to 0 from 71 by default. (Adam Rogoyski)
  do_wrap():	Added check for backing up past tabs, which we shouldn't do.
		Removed check for backing up past spaces first.
  main():	Added for loop to check for alt keys instead of hard list.
  do_enter():	Fix for bug #14, added call to reset_cursor and messed
		up do_char quite a bit.
  version():	Added time and date stamp for compile on version message.
		Added mail and web page info.
- README:	Updated mailing list info.

nano-0.8.5 - 2000.02.18
- nano.c:
  main():	Finally fixed tilde being input on page up/down keys in
		certain terminal types.  Fix was input 26->91->5[34] check
		for 126, if so make the kbinput PAGE UP/DOWN, else unget
		the keystroke and continue.  Added #include <ioctl.h> for
		ioctl call.
  handle_hup():
		Handler for hangup signal.  Belated include of patch from
		Tim Sherwood.
- winio.c:
  edit_refresh():
		Temporary fix for selecting text when temp == current.
		edit_refresh() is now unmanageably complex, and must be
		revamped.
  check_statblank():
		Added check for constupdate, makes things less choppy
		(Adam Rogoyski)

nano-0.8.4 - 2000.02.11
- Moved global variables that were only (or mostly) used in one file into
  its proper file as a static.  Affects cut.c, nano.c, global.c. (Andy Kahn)
- global.c:
  shortcut_init():
		Removed redundant NANO_CONTROL_H from backspace shortcut,
		added char 127 which should have been there.
- nano.c:
  main():	Fix for loops looping until MAIN_LEN, added -1 to stop
		segfaults. (Adam Rogoyski)
- Makefile.am:	Added all source filenames. (Adam Rogoyski)
- nano.1:	Fixed mail addressed and added mailing list address.
- README:	Updated my email address and the nano web page.

nano-0.8.3 - 2000.02.08
- New Pico mode (-p, --pico), toggles (more) compatibility with the
  Pico messages displayed in the shortcut list.  Note that there are still
  small differences in this mode.
- nano.h:	New shortcut struct format, for the benefit of i18n and
		our help menu.  Removed shortcut message macros, they are
		now all in shortcut_init in global.c.
- nano.c:
  do_wrap():	Removed resetting of current_x when we are in fact
		wrapping to the next line, fixes a bug in -i mode.
  do_enter():
		Rewrote the autoindent mode code to be a lot less pretty,
		but a lot more magical.
  main():
		Removed case for ignoring char 126 (~).  That's kind of
		important, we'll have to fix handling that sequence when
		paging up/down on a terminal some other way... Revamped
		main switch loop in much snazzier fashion based on the
		shortcut list.
- winio.c:
		New function display_main_list.  Affects all functions
		that used to call bottombars() with main_list.  Added
		because we now only call bottombars with the macro
		MAIN_VISIBLE instead of MAIN_LIST_LEN, because of the
		changes to the main_list shortcut list (see global.c below).
		New function do_help, our preliminary dynamic help system.
- Many many funcs:
		Changed from int to void to allow one uniform type to call
		from the shortcut struct.  Also a few functions that do
		not simple have void argument have new functions called
		funcname_void(void) to be called from the shortcut list.
		do_cut_text and do_uncut_text were changed to void
		arguments because they were never called with a filestruct
		other than *current anyway.
- global.c:
		Shortcut list main_list was expanded to cover all
		shortcuts that could be caught in the main loop.
		Consequently there is a new macro MAIN_VISIBLE which tells
		how many items in the main list to actually show.

nano-0.8.2 - 2000.02.02
- Added initial mouse (-m, --mouse) support.  New global variable
  use_mouse. (Adam Rogoyski)

- nano.c:	Set initial value of fill to COLS - 8 rather than just 72
		regardless. (Adam Rogoyski).
  do_delete():
		Deleted call to do_backspace() when on the end of a line,
		because it won't update the line properly.
  do_backspace():
		Removed unnecessary pointer manipulation that was being
		handled by unlink_node().
  open_file():
		Added check for trying to open a directory (currently we
		segfault on this).  Bug pointed out by Chad Ziccardi.

nano-0.8.1 - 2000.01.28
- Implemented Pico's -r (fill) mode, command line flag -r or --fill.  New
  global variable fill, affects check_wrap(), do_wrap(), main(), usage(),
  global.c and proto.h.
- nano.c:
write_file():		Added (incredibly) necessary check for EPERM when
			link() fails.  This allows us to actually save
			files via rename() on filesystems that don't
			support hard links (AIEEEEEE).
do_goto():
			Fixed a stupid mistake where we were calling
			bottombars() with replace_list instead of goto_list.
- nano.h:
			New char *help in shortcut structure for help
			feature. Added NANO_*_MSG and NANO_*_HELP #defines
			for help function and i18n.
- global.c:
			New functions shortcut_init (called in nano.c) and
			sc_init_one() to initialize the shortcuts without
			using {}s (for i18n).

nano-0.8.0 - 2000.01.25
- View flag (-v, --view) implemented.  Global variable view_mode, affects
  main loop of nano.c and new_file(). (Chris)
- nano.c:
			split checks for TERMIOS_H and TERMIO_H up so we
			can (theoretically) include them both, which is good.
handle_sigwinch():
			Added check for ncurses.h. (Andy Kahn)
do_spell():
			We now only try ispell because we don't as of yet
			handle the 'spell' program the right way, now that
			I finally know what the right way is =-).  Added
			call to edit_update(fileage) to stop segfaults.
global_init():
			Added initialization of edit* filestruct pointers
			to stop segfaults on spell check.
usage():
			Check for getopt_long, and if no leave out the GNU
			options everyone seems to love so much. (Andy Kahn)
main():
			Added checks for getopt_long. (Andy Kahn)
			We ignore character 126 because it gets put into
			the buffer when we page up/down on a vt terminal.
write_file():
			Fixes for umask (Adam Rogoyski).  Renamed tmpfile
			variable to tmp.  Documented the tmp option
			better in the function comments.  Fixed my
			stupidly commented out check for tmp on setting
			umask which I really like =>
- nano.h:
			Made desc variable in shortcut struct a pointer
			instead of a fixed-length string.
- utils.c:
			Fixed check for config.h before nano.h.
- configure.in:
			New checks for getopt_long, getopt.h, removed
			CFLAGS and LDFLAGS changes.  Gonna have to run
			strip manually now =-) (Andy Kahn)
			Added check for HAVE_WRESIZE, new file acconfig.h.
			(Chris)

nano-0.7.9 - 2000.01.24
- New autoindent feature.  Command flag 'i' or '--autoindent'.  New
  function do_char() to clean up character output, global
  variable autoindent in global.c. (Graham Mainwaring)
- New flag 't' or '--tempfile', like Pico's -t mode, automatically saves
  files on exit without prompting.  Affects do_writeout().  Also
  do_writeout() now takes a parameter for if exiting.
  Global variable temp_opt in global.c. (Graham Mainwaring)
- Preliminary spell program support.  Added command flag '-s' or
  '--speller' for alternative speller command.  Added function do_spell()
  and exit_spell() to nano.c.  New global variable alt_speller.
- nano.c:
  main():	We now ignore input of decimal 410 because these get entered
		when we resize the screen.  Sorted options in getopt()
		switch statement.
  usage():	Sorted options and changed tabs to make room for -s option.
  write_file():	Now takes a second parameter 'tmpfile', uses mask 0600 and
		doesn't print the number of lines written on the statusbar.
  global_init():
		Added more initializations to globals to support do_spell().

nano-0.7.8 - 2000.01.23
- Stubbed justify function.  Affects main() in nano.c and nano.h defines.
- Added Fkey equivalents for Pico compatibility.  Affects nano.h defines
  and main() in nano.c
- Removed redundant reset_cursor() calls from the blank() routines.
- nano.c:
  main():	Fixed typo in main while loop for NANO_ALT_REPLACE_KEY.
		Removed check for isprint() characters in main while loop
		for people with odd character sets *shrug*.  Added some X
		window F-key combos.
  read_line():	New function, consolidates of most of the special
		sections of the file reading code. (Rob Siemborski)
  do_replace(): Many scattered fixes. (Rob Siemborski)
  write_file():	Added check for empty filename.
- winio.c:
  nanogetstr():	Fixes for deleting at places other than the end of the
		buffer, cut support. (Adam Rogoyski)
  blank_edit():	New function, blanks edit buffer.  Added call to it in
		total_refresh().
- configure:	Checks for glib if snprintf or vsnprintf aren't available
		(Andy Kahn). Changed warning message when no termcap lib
		is found.

nano-0.7.7 - 2000.01.19
- Option '-v' for version moved to '-V', because -v is Pico's "read only"
  mode (affects getopt() in main() and usage() function in nano.c
- New flag -c, always show cursor position.  Affects main() in nano.c and
  statusbar() in winio.c
- Option '-x' doesn't show help window at the bottom of the editor.
  New variable no_help in nano.h and proto.h, affects main(), usage(),
  and global_init() in nano.c, blank_bottombars(), clear_bottomwin(),
  bottombars(), and do_yesno()  in winio.c  (I had to apply this patch by
  hand =P) (Adam Rogoyski)
- nano.c:
  handle_sigwinch():	New function (Adam Rogoyski), handles resizing.
  page_up(), page_down():
	- New functions.  We now set the cursor at the top right corner,
	  not at the center line, and page up and down a full screen
	  rather than a half screen. Original functions renamed to
	  page_up_center() and page_down_center().
  main():
	- Added check for keystroke key sequence 407 or NANO_CONTROL_Z
	  in main while loop because suspend mode was broken.  This should
	  fix it, at least for now.
	- Added long option support (By popular harassment ;-) - Added
	  #include for getopt.h, changed getopt() to getopt_long().
	  Options added so far: --version (-V), --nowrap (-w), --suspend
	  (-z), --help (-h), --nohelp (-x).
	- Rewrote signal statements. (Adam Rogoyski)

nano 0.7.6 - 2000.01.15
- New ChangeLog format
- nano.c:
  main():	Bound CONTROL_H to backspace (oops).
		Added more Alt-[-key combinations, for page up & down.
  read_bytes():	New function. (Adam Rogoyski)
  read_file():	Optimizations - malloc()s *buf a little at a time rather
		than one huge buffer, and replaced the strcat at the end
		with an index variable.  Added call to read_bytes().
  do_next_word(): New function, binding is Ctrl-Space (0). (Chris)

- winio.c:
  bottombars():	Fixed non-expanding shortcut keys at bottom of screen.
		(formula is extra space needed = COLS / 6 - 13).
  actual_x() & strlenpt():
		Added bug#9 fix - when tabs % 8 == 0, we should only
		increment tabs by 1.
  titlebar():	Fixed overrun in titlebar on very long filenames.

0.7.5	Pico 'last line' feature added (Rob Siemborski & me).  Eliminated
	writing a newline at EOF. do_cursorpos and do_replace are now not
	directly bound to signals but picked up as their control sequences
	in raw mode. Bug fix in do_backspace. Fixed bug #9 (woohoo!)
0.7.4	Optimized (obfuscated?) edit_refresh. Malloc() calls checked for
	available memory, align bug fixed. (Big Gaute)

--- As of version 0.7.4 TIP is renamed to nano.

0.7.3	Fixed a double blank_statusbar() when jumping to first and last
	lines.  Took out unnecessary updates in load_file. Bug fix in
	do_left. Missing updates to totlines, fixed bug #7 (last line not
	having a newline at the end doesn't get read, bugfix in do_replace
	with replace all, more/better comments. (Robert Siemborski)
0.7.2	Our first patch accepted into the source! configure fixes
	and optimizations (Erik Anderson).  Added missing stdarg.h to winio.c.
	Bug fix in update_line for editing long lines. Fixed arguments
	being put into the filename when none is specified. Preliminary
	+line command argument function.
0.7.1	configure tweak for better FreeBSD support. Removed refresh() from
	edit_refresh to stop cursor "jumping" during screen updates.  This
	will probably cause a bug or two. Replace is now Alt-R (@R) and
	Goto line is Alt-G (@G), but they have control key aliases of ^\ and
	^_ respectively.  Made Control-F,B,N,P work like they do in Pico.
	Control-G will become the Help key, but for now is stubbed out.
0.7.0	Fixed missing stdlib.h from cut.c. Fixed a few message bugs in
	findnextstr. Bound Control-D to Delete. Refixed segfault on zero
	length file. Added Esc-[-A,B,C,D cursor key sequences.
0.6.9	Preliminary cursor position function. Split up tip.c more, made
	new files cut.c and winio.c. Fixed a bug in cut_marked_segment
	that was leaving out a character.
0.6.8	By request, optchr in main() is now an int.  Removed unneeded
	globals. Bound functions for next/prev page, and wrote functions
	do_home and do_end.
0.6.7	Bugfix in do_uncut_text for totlines. Broke up open_file and
	created read_file.  Implemented Insert File. Fixes in tipgetstr
	for erroneous keystrokes. Added leave_cursor arg to do_yesno().
0.6.6	Fixes in do_search(), do_replace(), do_writeout, and do_exit() for
	aborted searches and more Pico-compatible messages. statusq() now
	returns -2 on a blank entry instead of -1. Bug fix in actual_x().
0.6.5	More BSD compatibility.  Fixed two bugs in do_uncut_text
	regarding buffers with filebot in them.  Fixins in do_backspace
	and do_enter. Removed unused variables. Removed strip_newline.
0.6.4	Took out the awful newlines from each string buffers.  This will
	certainly cause more bugs. Fixes in do_exit(). Better empty file
	handling (I hope).
0.6.3	Implemented ^E.  Removed now unneeded wrapline from filestruct.
	do_enter() rewritten.
0.6.2	Better default file permissions. Complete rewrite of do_wrap().
	Better handling of editing with cursor near COLS - 1.
0.6.1	Starting to implement wrapping toggle. Fix for unhandled control
	codes being entered into the buffer. Bug fix in actual_x; more
	> COLS - 1 functionality, especially on lines with TABs.  Fixed being
	locked into cutbuffer when cutting more than one marked screen of
	text.
0.6.0	We have TABs!!!  To do this, placewewant is now set to the actual
	width on the screen we want to be, not an index of current->data.
	New functions xplustabs and actual_x convert the actual place
	the cursor should be on the screen to and from the place in the
	string.
0.5.5	Changed do_right to test do_down before setting current_x to 0,
	eliminating the "looping" on the last line when holding the right
	arrow.  Preliminary support for longer than COLS - 1 lines.
	Wrote do_delete.
0.5.4	Fixed a bug in total_update that wasn't repainting the screen
	properly.  tipgetstr is much more messy but text is now more
	editable ;)  Fixed crash on entering a new file, hopefully.  Awful
	stub for tab handling, only in do_right() to save me some sanity.
0.5.3	Added check for malloc.h.  Implementing uncut from marker slowly.
	Fixed a few bugs in do_uncut when not uncutting from marked text.
	I would not trust your data with the mark code right now, but then
	we're not at version 1.0 yet so don't trust anything ;)
0.5.2	Added reset_cursor() before end of update_line so cursor doesn't
	jump after each keystroke entered. Select text stubbed. Fixed
	a bug in total_refresh().  Setting a mark will highlight properly,
	but does not actually affect what gets put in the cutbuffer (yet).
0.5.1	Writing a file out causes modified to be set back to 0.  Good.
	Set_modified function written.  Cut and uncut text now set
	modified when called.
0.5.0	Half way there!  Implemented write out, save function seems
	stable.  Changed statusbar blank routing to not refresh, a separate
	program calls it and then refreshes.  Made the program not clear
	the screen on exit, just the bottom two lines (like Pico).
0.4.2	Implemented replace all in replace function.  Crude exit function
	(asks yes or no if modified but does not write to file).
0.4.1	Implementing search & replace.  Fixed crash on deleting at top of
	edit buffer.  Implemented "timeout" of statusbar messages.
	Implemented ^A and ^E (beginning and end of line).
0.4.0	Split code into global.c and proto.h to allow for better multiple
	file handling.  Added #defines for the majority of the shortcut
	keys in tip.h for easy modification.
0.3.1	Write edit_refresh which doesn't move the screen around, just
	updates what's there already.  do_wrap() and do_enter() added.
0.3.0	Preliminary cutbuffer (cut and uncut) support.
0.2.7   Check for Modification added.  do_search() works.
0.2.5	Rewrite of file data struct.
0.2	Read in data to buffer, bound keystrokes to stub functions,
	initial cursor movement on screen.  Initial autoconf support.
0.1	Initial program setup w/ncurses
