about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--CHANGES14
-rw-r--r--lynx.hlp381
-rw-r--r--src/GridText.c238
-rw-r--r--src/LYDownload.c100
-rw-r--r--src/LYForms.c4
-rw-r--r--src/LYGetFile.c149
-rw-r--r--src/LYJump.c57
-rw-r--r--src/LYLocal.c241
-rw-r--r--src/LYMainLoop.c245
-rw-r--r--src/LYOptions.c6
-rw-r--r--src/LYPrint.c268
-rw-r--r--src/LYSearch.c72
-rw-r--r--src/LYSearch.h3
-rw-r--r--src/LYStrings.c164
-rw-r--r--src/LYUtils.c82
-rw-r--r--src/LYUtils.h4
16 files changed, 1022 insertions, 1006 deletions
diff --git a/CHANGES b/CHANGES
index 58f4fa83..c90519f3 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,12 +1,20 @@
--- $LynxId: CHANGES,v 1.571 2012/02/07 21:21:05 tom Exp $
+-- $LynxId: CHANGES,v 1.573 2012/02/09 01:34:11 tom Exp $
 ===============================================================================
 Changes since Lynx 2.8 release
 ===============================================================================
 
-2012-02-07 (2.8.8dev.10)
+2012-02-08 (2.8.8dev.10)
+* replaced most LYgetStr calls with LYgetBString, except for LYMail.c and
+  LYNews.c since those do use LYgetStr's limits as it was designed.  Other
+  calls generally did not need those limits -TD
+* modify finish_ExtEditForm to eliminate wrapping when an edited line is longer
+  than MAX_LINE.  The user is still offered the choice of wrapping to the
+  displayed size of a TEXTAREA, but if declined, the TEXTAREA's content will
+  not be wrapped -TD
 * modify LYgetstr, making it call revised function LYgetBString which handles
   bstring's, and allows editing fields which can grow without fixed buffer
-  limits -TD
+  limits.  In particular, forms all use the same calls, which means that
+  their result is no longer limited by MAX_LINE -TD
 * extend ^X-e editing of textarea's to include single-line fields -TD
 * modify comparison for splitting lines to allow for long preformatted lines,
   e.g., using  's to not wrap when the line-wrap mode is disabled -TD
diff --git a/lynx.hlp b/lynx.hlp
index df87b396..98d3af5a 100644
--- a/lynx.hlp
+++ b/lynx.hlp
@@ -68,13 +68,13 @@
        third  pass of options-processing, so any option which sets a value, as
        well as runtime configuration values are reflected in the help-message.
 
-       -      If the argument is only `-', then Lynx expects  to  receive  the
-              arguments  from  the  standard  input.  This is to allow for the
-              potentially very long command line that can be  associated  with
-              the  -get_data or -post_data arguments (see below).  It can also
-              be used to avoid having sensitive information  in  the  invoking
-              command  line (which would be visible to other processes on most
-              systems), especially when the -auth or -pauth options are used.
+       -      If  the  argument  is only `-', then Lynx expects to receive the
+              arguments from the standard input.  This is  to  allow  for  the
+              potentially  very  long command line that can be associated with
+              the -get_data or -post_data arguments (see below).  It can  also
+              be  used  to  avoid having sensitive information in the invoking
+              command line (which would be visible to other processes on  most
+              systems),  especially when the -auth or -pauth options are used.
 
        -accept_all_cookies
               accept all cookies.
@@ -200,7 +200,10 @@
 
        -curses_pads
               toggles   the   use  of  curses  "pad"  feature  which  supports
-              left/right scrolling of the display.
+              left/right scrolling of the display.  The  feature  is  normally
+              available  for curses configurations, but inactive.  To activate
+              it, use  the  "|"  character  or  the  LINEWRAP_TOGGLE  command.
+              Toggling this option makes the feature altogether unavailable.
 
        -debug_partial
               separate incremental display stages with MessageSecs delay
@@ -217,22 +220,22 @@
               inhibit wrapping of text in <pre> when -dump'ing and -crawl'ing,
               mark wrapped lines in interactive session.
 
-       -dump  dumps  the  formatted  output  of  the default document or those
-              specified on  the  command  line  to  standard  output.   Unlike
+       -dump  dumps the formatted output of  the  default  document  or  those
+              specified  on  the  command  line  to  standard  output.  Unlike
               interactive mode, all documents are processed.  This can be used
               in the following way:
 
               lynx -dump http://www.subir.com/lynx.html
 
        -editor=EDITOR
-              enable external editing, using the specified  EDITOR.  (vi,  ed,
+              enable  external  editing,  using the specified EDITOR. (vi, ed,
               emacs, etc.)
 
        -emacskeys
               enable emacs-like key movement.
 
        -enable_scrollback
-              toggles  compatibility  with  communication programs' scrollback
+              toggles compatibility with  communication  programs'  scrollback
               keys (may be incompatible with some curses packages).
 
        -error_file=FILE
@@ -245,11 +248,11 @@
 
        -find_leaks
               toggle memory leak-checking.  Normally this is not compiled-into
-              your  executable,  but  when  it  is,  it  can be disabled for a
+              your executable, but when it  is,  it  can  be  disabled  for  a
               session.
 
        -force_empty_hrefless_a
-              force HREF-less `A' elements to be empty (close them as soon  as
+              force  HREF-less `A' elements to be empty (close them as soon as
               they are seen).
 
        -force_html
@@ -266,7 +269,7 @@
        -ftp   disable ftp access.
 
        -get_data
-              properly  formatted  data  for  a  get form are read in from the
+              properly formatted data for a get form  are  read  in  from  the
               standard input and passed to the form.  Input is terminated by a
               line that starts with `---'.
 
@@ -278,14 +281,14 @@
               control the display of hidden links.
 
               merge
-                 hidden  links  show  up as bracketed numbers and are numbered
+                 hidden links show up as bracketed numbers  and  are  numbered
                  together with other links in the sequence of their occurrence
                  in the document.
 
               listonly
-                 hidden  links  are  shown  only on L)ist screens and listings
-                 generated by -dump  or  from  the  P)rint  menu,  but  appear
-                 separately  at  the  end of those lists.  This is the default
+                 hidden links are shown only on  L)ist  screens  and  listings
+                 generated  by  -dump  or  from  the  P)rint  menu, but appear
+                 separately at the end of those lists.  This  is  the  default
                  behavior.
 
               ignore
@@ -303,7 +306,7 @@
        -index=URL
               set the default index file to the specified URL.
 
-       -ismap toggles inclusion of  ISMAP  links  when  client-side  MAPs  are
+       -ismap toggles  inclusion  of  ISMAP  links  when  client-side MAPs are
               present.
 
        -justify
@@ -319,17 +322,17 @@
               disable URLs that point to remote hosts.
 
        -locexec
-              enable  local  program  execution from local files only (if Lynx
+              enable local program execution from local files  only  (if  Lynx
               was compiled with local execution enabled).
 
        -lss=FILENAME
-              specify  filename  containing  color-style   information.    The
+              specify   filename   containing  color-style  information.   The
               default is lynx.lss.  If you give an empty filename, lynx uses a
-              built-in monochrome scheme which  imitates  the  non-color-style
+              built-in  monochrome  scheme  which imitates the non-color-style
               configuration.
 
        -mime_header
-              prints  the  MIME  header  of  a fetched document along with its
+              prints the MIME header of a  fetched  document  along  with  its
               source.
 
        -minimal
@@ -351,11 +354,11 @@
               disable directory browsing.
 
        -nocc  disable Cc: prompts for self copies of mailings.  Note that this
-              does  not disable any CCs which are incorporated within a mailto
+              does not disable any CCs which are incorporated within a  mailto
               URL or form ACTION.
 
        -nocolor
-              force color mode off, overriding terminal capabilities  and  any
+              force  color  mode off, overriding terminal capabilities and any
               -color flags, COLORTERM variable, and saved .lynxrc settings.
 
        -noexec
@@ -376,13 +379,13 @@
               disable -more- string in statusline messages.
 
        -nonrestarting_sigwinch
-              This  flag  is  not  available  on all systems, Lynx needs to be
-              compiled with HAVE_SIGACTION defined.  If available,  this  flag
-              may  cause Lynx to react more immediately to window changes when
+              This flag is not available on all  systems,  Lynx  needs  to  be
+              compiled  with  HAVE_SIGACTION defined.  If available, this flag
+              may cause Lynx to react more immediately to window changes  when
               run within an xterm.
 
        -nonumbers
-              disable   link-    and    field-numbering.     This    overrides
+              disable    link-    and    field-numbering.     This   overrides
               -number_fields and -number_links.
 
        -nopause
@@ -392,7 +395,7 @@
               disable most print functions.
 
        -noredir
-              prevents  automatic redirection and prints a message with a link
+              prevents automatic redirection and prints a message with a  link
               to the new URL.
 
        -noreferer
@@ -430,20 +433,20 @@
               toggles passive ftp connections.
 
        -pauth=ID:PASSWD
-              set  authorization  ID and password for a protected proxy server
-              at startup.  Be sure to protect any script files which use  this
+              set authorization ID and password for a protected  proxy  server
+              at  startup.  Be sure to protect any script files which use this
               switch.
 
-       -popup toggles  handling  of  single-choice  SELECT  options  via popup
+       -popup toggles handling  of  single-choice  SELECT  options  via  popup
               windows or as lists of radio buttons.
 
        -post_data
-              properly formatted data for a post form are  read  in  from  the
+              properly  formatted  data  for  a post form are read in from the
               standard input and passed to the form.  Input is terminated by a
               line that starts with `---'.
 
        -preparsed
-              show HTML  source  preparsed  and  reformatted  when  used  with
+              show  HTML  source  preparsed  and  reformatted  when  used with
               -source or in source view.
 
        -prettysrc
@@ -454,7 +457,7 @@
        -pseudo_inlines
               toggles pseudo-ALTs for inline images with no ALT string.
 
-       -raw   toggles  default  setting of 8-bit character translations or CJK
+       -raw   toggles default setting of 8-bit character translations  or  CJK
               mode for the startup character set.
 
        -realm restricts access to URLs in the starting realm.
@@ -463,12 +466,12 @@
               Sets the read-timeout, where N is given in seconds.
 
        -reload
-              flushes the cache on a proxy server  (only  the  first  document
+              flushes  the  cache  on  a proxy server (only the first document
               affected).
 
        -restrictions=[option][,option][,option]...
               allows a list of services to be disabled selectively. Dashes and
-              underscores in option names can  be  intermixed.  The  following
+              underscores  in  option  names  can be intermixed. The following
               list is printed if no options are specified.
 
               all
@@ -481,18 +484,18 @@
                  disallow execution links via the bookmark file.
 
               change_exec_perms
-                 disallow  changing the eXecute permission on files (but still
-                 allow it for  directories)  when  local  file  management  is
+                 disallow changing the eXecute permission on files (but  still
+                 allow  it  for  directories)  when  local  file management is
                  enabled.
 
               default
-                 same  as  command  line  option -anonymous.  Disables default
-                 services for anonymous users.  Set to all restricted,  except
-                 for:  inside_telnet, outside_telnet, inside_ftp, outside_ftp,
-                 inside_rlogin,  outside_rlogin,  inside_news,   outside_news,
+                 same as command line  option  -anonymous.   Disables  default
+                 services  for anonymous users.  Set to all restricted, except
+                 for: inside_telnet, outside_telnet, inside_ftp,  outside_ftp,
+                 inside_rlogin,   outside_rlogin,  inside_news,  outside_news,
                  telnet_port, jump, mail, print, exec, and goto.  The settings
-                 for these,  as  well  as  additional  goto  restrictions  for
-                 specific  URL schemes that are also applied, are derived from
+                 for  these,  as  well  as  additional  goto  restrictions for
+                 specific URL schemes that are also applied, are derived  from
                  definitions within userdefs.h.
 
               dired_support
@@ -505,7 +508,7 @@
                  disallow access to, or creation of, hidden (dot) files.
 
               download
-                 disallow some downloaders in  the  download  menu  (does  not
+                 disallow  some  downloaders  in  the  download menu (does not
                  imply disk_save restriction).
 
               editor
@@ -518,12 +521,12 @@
                  disallow the user from changing the local execution option.
 
               externals
-                 disallow  some  "EXTERNAL" configuration lines if support for
+                 disallow some "EXTERNAL" configuration lines if  support  for
                  passing  URLs  to  external  applications  (with  the  EXTERN
                  command) is compiled in.
 
               file_url
-                 disallow  using  G)oto,  served  links or bookmarks for file:
+                 disallow using G)oto, served links  or  bookmarks  for  file:
                  URLs.
 
               goto
@@ -534,15 +537,15 @@
                  required for selectivity).
 
               inside_news
-                 disallow  USENET  news  posting for people coming from inside
+                 disallow USENET news posting for people  coming  from  inside
                  your domain (utmp required for selectivity).
 
               inside_rlogin
-                 disallow rlogins for people coming from  inside  your  domain
+                 disallow  rlogins  for  people coming from inside your domain
                  (utmp required for selectivity).
 
               inside_telnet
-                 disallow  telnets  for  people coming from inside your domain
+                 disallow telnets for people coming from  inside  your  domain
                  (utmp required for selectivity).
 
               jump
@@ -561,22 +564,22 @@
                  disallow saving options in .lynxrc.
 
               outside_ftp
-                 disallow ftps for people  coming  from  outside  your  domain
+                 disallow  ftps  for  people  coming  from outside your domain
                  (utmp required for selectivity).
 
               outside_news
-                 disallow  USENET  news  reading and posting for people coming
-                 from outside your domain  (utmp  required  for  selectivity).
-                 This  restriction  applies to "news", "nntp", "newspost", and
-                 "newsreply"  URLs,  but  not  to  "snews",  "snewspost",   or
+                 disallow USENET news reading and posting  for  people  coming
+                 from  outside  your  domain  (utmp required for selectivity).
+                 This restriction applies to "news", "nntp",  "newspost",  and
+                 "newsreply"   URLs,  but  not  to  "snews",  "snewspost",  or
                  "snewsreply" in case they are supported.
 
               outside_rlogin
-                 disallow  rlogins  for people coming from outside your domain
+                 disallow rlogins for people coming from outside  your  domain
                  (utmp required for selectivity).
 
               outside_telnet
-                 disallow telnets for people coming from outside  your  domain
+                 disallow  telnets  for people coming from outside your domain
                  (utmp required for selectivity).
 
               print
@@ -595,8 +598,8 @@
                  disallow modifications of the User-Agent header.
 
        -resubmit_posts
-              toggles  forced  resubmissions  (no-cache)  of forms with method
-              POST when the  documents  they  returned  are  sought  with  the
+              toggles forced resubmissions (no-cache)  of  forms  with  method
+              POST  when  the  documents  they  returned  are  sought with the
               PREV_DOC command or from the History List.
 
        -rlogin
@@ -622,7 +625,7 @@
               saves session to specified file.
 
        -short_url
-              show very long URLs in the status line with "..."  to  represent
+              show  very  long URLs in the status line with "..." to represent
               the portion which cannot be displayed.  The beginning and end of
               the URL are displayed, rather than suppressing the end.
 
@@ -631,31 +634,31 @@
               and exit.
 
        -show_cursor
-              If  enabled  the  cursor  will  not  be hidden in the right hand
-              corner but will instead  be  positioned  at  the  start  of  the
+              If enabled the cursor will not  be  hidden  in  the  right  hand
+              corner  but  will  instead  be  positioned  at  the start of the
               currently selected link.  Show cursor is the default for systems
-              without FANCY_CURSES capabilities.   The  default  configuration
-              can  be  changed  in  userdefs.h  or lynx.cfg.  The command line
+              without  FANCY_CURSES  capabilities.   The default configuration
+              can be changed in userdefs.h  or  lynx.cfg.   The  command  line
               switch toggles the default.
 
        -show_rate
-              If enabled the transfer  rate  is  shown  in  bytes/second.   If
-              disabled,  no  transfer  rate  is  shown.   Use  lynx.cfg or the
+              If  enabled  the  transfer  rate  is  shown in bytes/second.  If
+              disabled, no transfer  rate  is  shown.   Use  lynx.cfg  or  the
               options menu to select KB/second and/or ETA.
 
        -soft_dquotes
-              toggles emulation of the  old  Netscape  and  Mosaic  bug  which
+              toggles  emulation  of  the  old  Netscape  and Mosaic bug which
               treated `>' as a co-terminator for double-quotes and tags.
 
        -source
-              works  the  same  as  dump  but  outputs  HTML source instead of
+              works the same as  dump  but  outputs  HTML  source  instead  of
               formatted text.  For example
 
               lynx -source . >foo.html
 
-              generates  HTML  source  listing  the  files  in   the   current
-              directory.   Each  file  is  marked  by  an HREF relative to the
-              parent directory.  Add a  trailing  slash  to  make  the  HREF's
+              generates   HTML   source  listing  the  files  in  the  current
+              directory.  Each file is marked  by  an  HREF  relative  to  the
+              parent  directory.   Add  a  trailing  slash  to make the HREF's
               relative to the current directory:
 
               lynx -source ./ >foo.html
@@ -667,9 +670,9 @@
               allow non-http startfile and homepage with -validate.
 
        -stderr
-              When  dumping  a  document using -dump or -source, Lynx normally
-              does not display alert (error) messages  that  you  see  on  the
-              screen  in the status line.  Use the -stderr option to tell Lynx
+              When dumping a document using -dump or  -source,  Lynx  normally
+              does  not  display  alert  (error)  messages that you see on the
+              screen in the status line.  Use the -stderr option to tell  Lynx
               to write these messages to the standard error.
 
        -stdin read the startfile from standard input (UNIX only).
@@ -687,25 +690,25 @@
               disable recognition of telnet commands.
 
        -term=TERM
-              tell Lynx what terminal type to assume it is talking to.   (This
-              may  be  useful  for  remote  execution, when, for example, Lynx
-              connects to a remote TCP/IP port that starts a script  that,  in
+              tell  Lynx what terminal type to assume it is talking to.  (This
+              may be useful for remote  execution,  when,  for  example,  Lynx
+              connects  to  a remote TCP/IP port that starts a script that, in
               turn, starts another Lynx process.)
 
        -timeout=N
-              For  win32,  sets  the network read-timeout, where N is given in
+              For win32, sets the network read-timeout, where N  is  given  in
               seconds.
 
-       -tlog  toggles between using a Lynx Trace  Log  and  stderr  for  trace
+       -tlog  toggles  between  using  a  Lynx  Trace Log and stderr for trace
               output from the session.
 
        -tna   turns on "Textfields Need Activation" mode.
 
-       -trace turns  on  Lynx trace mode.  Destination of trace output depends
+       -trace turns on Lynx trace mode.  Destination of trace  output  depends
               on -tlog.
 
        -trace_mask=value
-              turn on optional traces, which may result in  very  large  trace
+              turn  on  optional  traces, which may result in very large trace
               files.  Logically OR the values to combine options:
 
               1  SGML character parsing states
@@ -714,7 +717,7 @@
 
               4  TRST (table layout)
 
-              8  configuration  (lynx.cfg,  .lynxrc, .lynx-keymaps, mime.types
+              8  configuration (lynx.cfg, .lynxrc,  .lynx-keymaps,  mime.types
                  and mailcap contents)
 
               16 binary string copy/append, used in form data construction.
@@ -730,9 +733,9 @@
                  timing
 
        -traversal
-              traverse all http links derived from startfile.  When used  with
-              -crawl,  each link that begins with the same string as startfile
-              is output to a file, intended for indexing.  See  CRAWL.announce
+              traverse  all http links derived from startfile.  When used with
+              -crawl, each link that begins with the same string as  startfile
+              is  output to a file, intended for indexing.  See CRAWL.announce
               for more information.
 
        -trim_input_fields
@@ -745,29 +748,29 @@
               toggles use of _underline_ format in dumps.
 
        -unique_urls
-              check  for duplicate link numbers in each page and corresponding
+              check for duplicate link numbers in each page and  corresponding
               lists, and reuse the original link number.
 
        -use_mouse
-              turn on mouse support, if available.  Clicking  the  left  mouse
-              button  on a link traverses it.  Clicking the right mouse button
-              pops back.  Click on the top line to scroll up.   Click  on  the
-              bottom  line to scroll down.  The first few positions in the top
-              and bottom line may invoke additional functions.  Lynx  must  be
-              compiled  with  ncurses  or  slang  to support this feature.  If
-              ncurses is used, clicking the middle  mouse  button  pops  up  a
-              simple  menu.  Mouse clicks may only work reliably while Lynx is
+              turn  on  mouse  support, if available.  Clicking the left mouse
+              button on a link traverses it.  Clicking the right mouse  button
+              pops  back.   Click  on the top line to scroll up.  Click on the
+              bottom line to scroll down.  The first few positions in the  top
+              and  bottom  line may invoke additional functions.  Lynx must be
+              compiled with ncurses or slang  to  support  this  feature.   If
+              ncurses  is  used,  clicking  the  middle mouse button pops up a
+              simple menu.  Mouse clicks may only work reliably while Lynx  is
               idle waiting for input.
 
        -useragent=Name
               set alternate Lynx User-Agent header.
 
        -validate
-              accept only  http  URLs  (for  validation).   Complete  security
+              accept  only  http  URLs  (for  validation).   Complete security
               restrictions also are implemented.
 
        -verbose
-              toggle  [LINK],  [IMAGE] and [INLINE] comments with filenames of
+              toggle [LINK], [IMAGE] and [INLINE] comments with  filenames  of
               these images.
 
        -version
@@ -777,13 +780,13 @@
               enable vi-like key movement.
 
        -wdebug
-              enable Waterloo tcp/ip packet debug (print to  watt  debugfile).
-              This  applies  only  to  DOS  versions  compiled  with WATTCP or
+              enable  Waterloo  tcp/ip packet debug (print to watt debugfile).
+              This applies only  to  DOS  versions  compiled  with  WATTCP  or
               WATT-32.
 
        -width=NUMBER
-              number of columns for formatting of dumps, default is 80.   This
-              is  limited  by  the  number of columns that Lynx could display,
+              number  of columns for formatting of dumps, default is 80.  This
+              is limited by the number of columns  that  Lynx  could  display,
               typically 1024 (the MAX_LINE symbol).
 
        -with_backspaces
@@ -838,146 +841,146 @@
                            more information.
 
        LYNX_HELPFILE       If set, this variable overrides the compiled-in URL
-                           and configuration file URL for the Lynx help file.
+                           and configuration file URL for the Lynx help  file.
 
-       LYNX_LOCALEDIR      If set, this  variable  overrides  the  compiled-in
-                           location  of  the  locale  directory which contains
+       LYNX_LOCALEDIR      If  set,  this  variable  overrides the compiled-in
+                           location of the  locale  directory  which  contains
                            native language (NLS) message text.
 
-       LYNX_LSS            This variable, if set, specifies  the  location  of
-                           the   default  Lynx  character  style  sheet  file.
-                           [Currently only meaningful if Lynx was built  using
+       LYNX_LSS            This  variable,  if  set, specifies the location of
+                           the  default  Lynx  character  style  sheet   file.
+                           [Currently  only meaningful if Lynx was built using
                            experimental color style support.]
 
-       LYNX_SAVE_SPACE     This  variable,  if  set, will override the default
+       LYNX_SAVE_SPACE     This variable, if set, will  override  the  default
                            path prefix for files saved to disk that is defined
-                           in  the  lynx.cfg  SAVE_SPACE:  statement.  See the
+                           in the lynx.cfg  SAVE_SPACE:  statement.   See  the
                            lynx.cfg file for more information.
 
-       LYNX_TEMP_SPACE     This variable, if set, will  override  the  default
-                           path  prefix  for  temporary files that was defined
-                           during installation, as well as any value that  may
+       LYNX_TEMP_SPACE     This  variable,  if  set, will override the default
+                           path prefix for temporary files  that  was  defined
+                           during  installation, as well as any value that may
                            be assigned to the TMPDIR variable.
 
        MAIL                This variable specifies the default inbox Lynx will
-                           check for new mail, if such checking is enabled  in
+                           check  for new mail, if such checking is enabled in
                            the lynx.cfg file.
 
-       NEWS_ORGANIZATION   This  variable, if set, provides the string used in
-                           the Organization: header of USENET  news  postings.
-                           It  will  override  the setting of the ORGANIZATION
-                           environment variable, if it is also  set  (and,  on
+       NEWS_ORGANIZATION   This variable, if set, provides the string used  in
+                           the  Organization:  header of USENET news postings.
+                           It will override the setting  of  the  ORGANIZATION
+                           environment  variable,  if  it is also set (and, on
                            UNIX, the contents of an /etc/organization file, if
                            present).
 
-       NNTPSERVER          If set, this variable specifies  the  default  NNTP
-                           server  that  will  be used for USENET news reading
+       NNTPSERVER          If  set,  this  variable specifies the default NNTP
+                           server that will be used for  USENET  news  reading
                            and posting with Lynx, via news: URL's.
 
-       ORGANIZATION        This variable, if set, provides the string used  in
-                           the  Organization:  header of USENET news postings.
-                           On UNIX,  it  will  override  the  contents  of  an
+       ORGANIZATION        This  variable, if set, provides the string used in
+                           the Organization: header of USENET  news  postings.
+                           On  UNIX,  it  will  override  the  contents  of an
                            /etc/organization file, if present.
 
        PROTOCOL_proxy      Lynx supports the use of proxy servers that can act
                            as firewall gateways and caching servers.  They are
-                           preferable   to  the  older  gateway  servers  (see
-                           WWW_access_GATEWAY, below).  Each protocol used  by
-                           Lynx,  (http,  ftp,  gopher,  etc),  can  be mapped
-                           separately by setting environment variables of  the
-                           form    PROTOCOL_proxy    (literally:   http_proxy,
+                           preferable  to  the  older  gateway  servers   (see
+                           WWW_access_GATEWAY,  below).  Each protocol used by
+                           Lynx, (http,  ftp,  gopher,  etc),  can  be  mapped
+                           separately  by setting environment variables of the
+                           form   PROTOCOL_proxy    (literally:    http_proxy,
                            ftp_proxy,       gopher_proxy,       etc),       to
-                           "http://some.server.dom:port/".    See  Lynx  Users
+                           "http://some.server.dom:port/".   See  Lynx   Users
                            Guide for additional details and examples.
 
-       SSL_CERT_DIR        Set   to   the   directory    containing    trusted
+       SSL_CERT_DIR        Set    to    the   directory   containing   trusted
                            certificates.
 
-       SSL_CERT_FILE       Set  to the full path and filename for your file of
+       SSL_CERT_FILE       Set to the full path and filename for your file  of
                            trusted certificates.
 
-       WWW_access_GATEWAY  Lynx still supports use of  gateway  servers,  with
-                           the   servers  specified  via  "WWW_access_GATEWAY"
-                           variables (where "access" is lower case and can  be
-                           "http",  "ftp",  "gopher"  or "wais"), however most
-                           gateway servers have been discontinued.  Note  that
+       WWW_access_GATEWAY  Lynx  still  supports  use of gateway servers, with
+                           the  servers  specified  via   "WWW_access_GATEWAY"
+                           variables  (where "access" is lower case and can be
+                           "http", "ftp", "gopher" or  "wais"),  however  most
+                           gateway  servers have been discontinued.  Note that
                            you do not include a terminal `/' for gateways, but
-                           do  for   proxies   specified   by   PROTOCOL_proxy
-                           environment  variables.   See  Lynx Users Guide for
+                           do   for   proxies   specified   by  PROTOCOL_proxy
+                           environment variables.  See Lynx  Users  Guide  for
                            details.
 
-       WWW_HOME            This variable, if set, will  override  the  default
-                           startup   URL   specified   in   any  of  the  Lynx
+       WWW_HOME            This  variable,  if  set, will override the default
+                           startup  URL  specified  in   any   of   the   Lynx
                            configuration files.
 
        Environment Variables Set or Modified By Lynx:
 
-       LYNX_PRINT_DATE     This variable is set by the Lynx p(rint)  function,
-                           to   the   Date:  string  seen  in  the  document's
-                           "Information about" page (= cmd), if  any.   It  is
-                           created  for use by an external program, as defined
-                           in a lynx.cfg PRINTER:  definition  statement.   If
-                           the  field  does  not  exist  for the document, the
-                           variable is set to a null string under UNIX, or "No
-                           Date" under VMS.
-
-       LYNX_PRINT_LASTMOD  This  variable is set by the Lynx p(rint) function,
-                           to the Last Mod:  string  seen  in  the  document's
+       LYNX_PRINT_DATE     This  variable is set by the Lynx p(rint) function,
+                           to  the  Date:  string  seen  in   the   document's
                            "Information  about"  page  (= cmd), if any.  It is
                            created for use by an external program, as  defined
                            in  a  lynx.cfg  PRINTER: definition statement.  If
                            the field does not  exist  for  the  document,  the
                            variable is set to a null string under UNIX, or "No
-                           LastMod" under VMS.
+                           Date" under VMS.
 
-       LYNX_PRINT_TITLE    This variable is set by the Lynx p(rint)  function,
-                           to  the  Linkname:  string  seen  in the document's
+       LYNX_PRINT_LASTMOD  This variable is set by the Lynx p(rint)  function,
+                           to  the  Last  Mod:  string  seen in the document's
                            "Information about" page (= cmd), if  any.   It  is
                            created  for use by an external program, as defined
                            in a lynx.cfg PRINTER:  definition  statement.   If
                            the  field  does  not  exist  for the document, the
                            variable is set to a null string under UNIX, or "No
-                           Title" under VMS.
+                           LastMod" under VMS.
 
-       LYNX_PRINT_URL      This  variable is set by the Lynx p(rint) function,
-                           to  the  URL:  string  seen   in   the   document's
+       LYNX_PRINT_TITLE    This  variable is set by the Lynx p(rint) function,
+                           to the Linkname:  string  seen  in  the  document's
                            "Information  about"  page  (= cmd), if any.  It is
                            created for use by an external program, as  defined
                            in  a  lynx.cfg  PRINTER: definition statement.  If
                            the field does not  exist  for  the  document,  the
                            variable is set to a null string under UNIX, or "No
+                           Title" under VMS.
+
+       LYNX_PRINT_URL      This variable is set by the Lynx p(rint)  function,
+                           to   the   URL:   string  seen  in  the  document's
+                           "Information about" page (= cmd), if  any.   It  is
+                           created  for use by an external program, as defined
+                           in a lynx.cfg PRINTER:  definition  statement.   If
+                           the  field  does  not  exist  for the document, the
+                           variable is set to a null string under UNIX, or "No
                            URL" under VMS.
 
        LYNX_TRACE          If set, causes Lynx to write a trace file as if the
                            -trace option were supplied.
 
        LYNX_TRACE_FILE     If set, overrides the compiled-in name of the trace
-                           file, which is either  Lynx.trace  or  LY-TRACE.LOG
-                           (the  latter  on the DOS platform).  The trace file
+                           file,  which  is  either Lynx.trace or LY-TRACE.LOG
+                           (the latter on the DOS platform).  The  trace  file
                            is in either case relative to the home directory.
 
-       LYNX_VERSION        This variable is always set by  Lynx,  and  may  be
-                           used  by an external program to determine if it was
-                           invoked by Lynx.  See  also  the  comments  in  the
-                           distribution's  sample  mailcap  file, for notes on
+       LYNX_VERSION        This  variable  is  always  set by Lynx, and may be
+                           used by an external program to determine if it  was
+                           invoked  by  Lynx.   See  also  the comments in the
+                           distribution's sample mailcap file,  for  notes  on
                            usage in such a file.
 
-       TERM                Normally,  this  variable  is  used  by   Lynx   to
-                           determine  the  terminal  type being used to invoke
+       TERM                Normally,   this   variable  is  used  by  Lynx  to
+                           determine the terminal type being  used  to  invoke
                            Lynx.  If, however, it is unset at startup time (or
-                           has  the value "unknown"), or if the -term command-
-                           line option is used (see  OPTIONS  section  above),
-                           Lynx  will  set  or  modify  its  value to the user
-                           specified terminal type  (for  the  Lynx  execution
-                           environment).   Note:  If set/modified by Lynx, the
-                           values of  the  LINES  and/or  COLUMNS  environment
+                           has the value "unknown"), or if the -term  command-
+                           line  option  is  used (see OPTIONS section above),
+                           Lynx will set or  modify  its  value  to  the  user
+                           specified  terminal  type  (for  the Lynx execution
+                           environment).  Note: If set/modified by  Lynx,  the
+                           values  of  the  LINES  and/or  COLUMNS environment
                            variables may also be changed.
 
 2 Simulated Cgi Support
        If built with the cgi-links option enabled, Lynx allows access to a cgi
        script directly without the need for an http daemon.
 
-       When executing such  "lynxcgi  scripts"  (if  enabled),  the  following
+       When  executing  such  "lynxcgi  scripts"  (if  enabled), the following
        variables may be set for simulating a CGI environment:
 
        CONTENT_LENGTH
@@ -1006,50 +1009,50 @@
 
        SERVER_SOFTWARE
 
-       Other  environment  variables  are  not inherited by the script, unless
-       they  are  provided  via  a  LYNXCGI_ENVIRONMENT   statement   in   the
-       configuration  file.   See  the  lynx.cfg file, and the (draft) CGI 1.1
+       Other environment variables are not inherited  by  the  script,  unless
+       they   are   provided   via  a  LYNXCGI_ENVIRONMENT  statement  in  the
+       configuration file.  See the lynx.cfg file, and  the  (draft)  CGI  1.1
        Specification <http://Web.Golux.Com/coar/cgi/draft-coar-cgi-v11-00.txt>
        for the definition and usage of these variables.
 
-       The  CGI  Specification,  and other associated documentation, should be
+       The CGI Specification, and other associated  documentation,  should  be
        consulted for general information on CGI script programming.
 
 2 Native Language Support
-       If configured and installed with Native  Language  Support,  Lynx  will
+       If  configured  and  installed  with Native Language Support, Lynx will
        display status and other messages in your local language.  See the file
-       ABOUT_NLS in the source distribution, or at your local  GNU  site,  for
+       ABOUT_NLS  in  the  source distribution, or at your local GNU site, for
        more information about internationalization.
 
-       The  following  environment  variables  may  be  used  to alter default
+       The following environment  variables  may  be  used  to  alter  default
        settings:
 
-       LANG                This variable, if set, will  override  the  default
+       LANG                This  variable,  if  set, will override the default
                            message language.  It is an ISO 639 two-letter code
-                           identifying the language.  Language codes  are  NOT
+                           identifying  the  language.  Language codes are NOT
                            the same as the country codes given in ISO 3166.
 
-       LANGUAGE            This  variable,  if  set, will override the default
+       LANGUAGE            This variable, if set, will  override  the  default
                            message language.  This is a GNU extension that has
-                           higher  priority  for  setting  the message catalog
+                           higher priority for  setting  the  message  catalog
                            than LANG or LC_ALL.
 
        LC_ALL              and
 
-       LC_MESSAGES         These variables, if  set,  specify  the  notion  of
+       LC_MESSAGES         These  variables,  if  set,  specify  the notion of
                            native language formatting style.  They are POSIXly
                            correct.
 
        LINGUAS             This  variable,  if  set  prior  to  configuration,
-                           limits  the installed languages to specific values.
-                           It is a space-separated list of  two-letter  codes.
+                           limits the installed languages to specific  values.
+                           It  is  a space-separated list of two-letter codes.
                            Currently, it is hard-coded to a wish list.
 
-       NLSPATH             This  variable,  if set, is used as the path prefix
+       NLSPATH             This variable, if set, is used as the  path  prefix
                            for message catalogs.
 
 2 Notes
-       This is the Lynx v2.8.7 Release; development is in progress for 2.8.8.
+       This  is the Lynx v2.8.7 Release; development is in progress for 2.8.8.
 
        If you wish to contribute to the further development of Lynx, subscribe
        to  our mailing list.  Send email to <lynx-dev-request@nongnu.org> with
diff --git a/src/GridText.c b/src/GridText.c
index 3277add1..0e18511a 100644
--- a/src/GridText.c
+++ b/src/GridText.c
@@ -1,5 +1,5 @@
 /*
- * $LynxId: GridText.c,v 1.226 2012/02/07 21:11:50 tom Exp $
+ * $LynxId: GridText.c,v 1.229 2012/02/09 01:55:40 tom Exp $
  *
  *		Character grid hypertext object
  *		===============================
@@ -7653,8 +7653,8 @@ void HTAddSearchQuery(char *query)
 
 int do_www_search(DocInfo *doc)
 {
-    char searchstring[256];
-    char temp[256];
+    bstring *searchstring = NULL;
+    bstring *temp = NULL;
     char *cp;
     char *tmpaddress = NULL;
     int ch;
@@ -7662,6 +7662,7 @@ int do_www_search(DocInfo *doc)
     int QueryTotal;
     int QueryNum;
     BOOLEAN PreviousSearch = FALSE;
+    int code;
 
     /*
      * Load the default query buffer
@@ -7672,28 +7673,28 @@ int do_www_search(DocInfo *doc)
 	 * Use its query as the default.
 	 */
 	PreviousSearch = TRUE;
-	LYStrNCpy(searchstring, ++cp, sizeof(searchstring) - 1);
-	for (cp = searchstring; *cp; cp++)
+	BStrCopy0(searchstring, ++cp);
+	for (cp = searchstring->str; *cp; cp++)
 	    if (*cp == '+')
 		*cp = ' ';
-	HTUnEscape(searchstring);
-	strcpy(temp, searchstring);
+	HTUnEscape(searchstring->str);
+	BStrCopy(temp, searchstring);
 	/*
 	 * Make sure it's treated as the most recent query.  -FM
 	 */
-	HTAddSearchQuery(searchstring);
+	HTAddSearchQuery(searchstring->str);
     } else {
 	/*
 	 * New search; no default.
 	 */
-	searchstring[0] = '\0';
-	temp[0] = '\0';
+	BStrCopy0(searchstring, "");
+	BStrCopy0(temp, "");
     }
 
     /*
      * Prompt for a query string.
      */
-    if (searchstring[0] == '\0') {
+    if (isBEmpty(searchstring)) {
 	if (HTMainAnchor->isIndexPrompt)
 	    _statusline(HTMainAnchor->isIndexPrompt);
 	else
@@ -7704,10 +7705,13 @@ int do_www_search(DocInfo *doc)
     recall = (((PreviousSearch && QueryTotal >= 2) ||
 	       (!PreviousSearch && QueryTotal >= 1)) ? RECALL_URL : NORECALL);
     QueryNum = QueryTotal;
+
   get_query:
-    if ((ch = LYGetStr(searchstring, VISIBLE,
-		       sizeof(searchstring), recall)) < 0 ||
-	*searchstring == '\0' || ch == UPARROW || ch == DNARROW) {
+    if ((ch = LYgetBString(&searchstring, VISIBLE, 0, recall)) < 0 ||
+	isBEmpty(searchstring) ||
+	ch == UPARROW ||
+	ch == DNARROW) {
+
 	if (recall && ch == UPARROW) {
 	    if (PreviousSearch) {
 		/*
@@ -7728,11 +7732,12 @@ int do_www_search(DocInfo *doc)
 		QueryNum = 0;
 	    if ((cp = (char *) HTList_objectAt(search_queries,
 					       QueryNum)) != NULL) {
-		LYStrNCpy(searchstring, cp, sizeof(searchstring) - 1);
-		if (*temp && !strcmp(temp, searchstring)) {
+		BStrCopy0(searchstring, cp);
+		if (!isBEmpty(temp) &&
+		    !strcmp(temp->str, searchstring->str)) {
 		    _statusline(EDIT_CURRENT_QUERY);
-		} else if ((*temp && QueryTotal == 2) ||
-			   (!(*temp) && QueryTotal == 1)) {
+		} else if ((!isBEmpty(temp) && QueryTotal == 2) ||
+			   (isBEmpty(temp) && QueryTotal == 1)) {
 		    _statusline(EDIT_THE_PREV_QUERY);
 		} else {
 		    _statusline(EDIT_A_PREV_QUERY);
@@ -7759,11 +7764,12 @@ int do_www_search(DocInfo *doc)
 		QueryNum = QueryTotal - 1;
 	    if ((cp = (char *) HTList_objectAt(search_queries,
 					       QueryNum)) != NULL) {
-		LYStrNCpy(searchstring, cp, sizeof(searchstring) - 1);
-		if (*temp && !strcmp(temp, searchstring)) {
+		BStrCopy0(searchstring, cp);
+		if (!isBEmpty(temp) &&
+		    !strcmp(temp->str, searchstring->str)) {
 		    _statusline(EDIT_CURRENT_QUERY);
-		} else if ((*temp && QueryTotal == 2) ||
-			   (!(*temp) && QueryTotal == 1)) {
+		} else if ((!isBEmpty(temp) && QueryTotal == 2) ||
+			   (isBEmpty(temp) && QueryTotal == 1)) {
 		    _statusline(EDIT_THE_PREV_QUERY);
 		} else {
 		    _statusline(EDIT_A_PREV_QUERY);
@@ -7776,82 +7782,80 @@ int do_www_search(DocInfo *doc)
 	 * Search cancelled.
 	 */
 	HTInfoMsg(CANCELLED);
-	return (NULLFILE);
-    }
-
-    /*
-     * Strip leaders and trailers.  -FM
-     */
-    LYTrimLeading(searchstring);
-    if (!(*searchstring)) {
-	HTInfoMsg(CANCELLED);
-	return (NULLFILE);
-    }
-    LYTrimTrailing(searchstring);
+	code = NULLFILE;
+    } else {
 
-    /*
-     * Don't resubmit the same query unintentionally.
-     */
-    if (!LYforce_no_cache && 0 == strcmp(temp, searchstring)) {
-	HTUserMsg(USE_C_R_TO_RESUB_CUR_QUERY);
-	return (NULLFILE);
-    }
+	LYTrimLeading(searchstring->str);
+	LYTrimTrailing(searchstring->str);
+	if (isBEmpty(searchstring)) {
+	    HTInfoMsg(CANCELLED);
+	    code = NULLFILE;
+	} else if (!LYforce_no_cache &&
+		   !strcmp(temp->str, searchstring->str)) {
+	    /*
+	     * Don't resubmit the same query unintentionally.
+	     */
+	    HTUserMsg(USE_C_R_TO_RESUB_CUR_QUERY);
+	    code = NULLFILE;
+	} else {
 
-    /*
-     * Add searchstring to the query list,
-     * or make it the most current.  -FM
-     */
-    HTAddSearchQuery(searchstring);
+	    /*
+	     * Add searchstring to the query list,
+	     * or make it the most current.  -FM
+	     */
+	    HTAddSearchQuery(searchstring->str);
 
-    /*
-     * Show the URL with the new query.
-     */
-    if ((cp = strchr(doc->address, '?')) != NULL)
-	*cp = '\0';
-    StrAllocCopy(tmpaddress, doc->address);
-    StrAllocCat(tmpaddress, "?");
-    StrAllocCat(tmpaddress, searchstring);
-    user_message(WWW_WAIT_MESSAGE, tmpaddress);
+	    /*
+	     * Show the URL with the new query.
+	     */
+	    if ((cp = strchr(doc->address, '?')) != NULL)
+		*cp = '\0';
+	    StrAllocCopy(tmpaddress, doc->address);
+	    StrAllocCat(tmpaddress, "?");
+	    StrAllocCat(tmpaddress, searchstring->str);
+	    user_message(WWW_WAIT_MESSAGE, tmpaddress);
 #ifdef SYSLOG_REQUESTED_URLS
-    LYSyslog(tmpaddress);
+	    LYSyslog(tmpaddress);
 #endif
-    FREE(tmpaddress);
-    if (cp)
-	*cp = '?';
+	    FREE(tmpaddress);
+	    if (cp)
+		*cp = '?';
 
-    /*
-     * OK, now we do the search.
-     */
-    if (HTSearch(searchstring, HTMainAnchor)) {
-	/*
-	 * Memory leak fixed.
-	 * 05-28-94 Lynx 2-3-1 Garrett Arch Blythe
-	 */
-	auto char *cp_freeme = NULL;
+	    /*
+	     * OK, now we do the search.
+	     */
+	    if (HTSearch(searchstring->str, HTMainAnchor)) {
+		auto char *cp_freeme = NULL;
 
-	if (traversal)
-	    cp_freeme = stub_HTAnchor_address((HTAnchor *) HTMainAnchor);
-	else
-	    cp_freeme = HTAnchor_address((HTAnchor *) HTMainAnchor);
-	StrAllocCopy(doc->address, cp_freeme);
-	FREE(cp_freeme);
+		if (traversal)
+		    cp_freeme = stub_HTAnchor_address((HTAnchor *) HTMainAnchor);
+		else
+		    cp_freeme = HTAnchor_address((HTAnchor *) HTMainAnchor);
+		StrAllocCopy(doc->address, cp_freeme);
+		FREE(cp_freeme);
 
-	CTRACE((tfp, "\ndo_www_search: newfile: %s\n", doc->address));
+		CTRACE((tfp, "\ndo_www_search: newfile: %s\n", doc->address));
 
-	/*
-	 * Yah, the search succeeded.
-	 */
-	return (NORMAL);
-    }
+		/*
+		 * Yah, the search succeeded.
+		 */
+		code = NORMAL;
+	    } else {
 
-    /*
-     * Either the search failed (Yuk), or we got redirection.
-     * If it's redirection, use_this_url_instead is set, and
-     * mainloop() will deal with it such that security features
-     * and restrictions are checked before acting on the URL, or
-     * rejecting it.  -FM
-     */
-    return (NOT_FOUND);
+		/*
+		 * Either the search failed (Yuk), or we got redirection.
+		 * If it's redirection, use_this_url_instead is set, and
+		 * mainloop() will deal with it such that security features
+		 * and restrictions are checked before acting on the URL, or
+		 * rejecting it.  -FM
+		 */
+		code = NOT_FOUND;
+	    }
+	}
+    }
+    BStrFree(searchstring);
+    BStrFree(temp);
+    return code;
 }
 
 static void write_offset(FILE *fp, HTLine *line)
@@ -12998,9 +13002,11 @@ static int finish_ExtEditForm(LinkInfo * form_link, TextAnchor *start_anchor,
     int match_tag = 0;
     int newlines = 0;
     int len, len0;
+    int display_size;
     int wanted_fieldlen_wrap = -1;	/* not yet asked; 0 means don't. */
     char *skip_at = NULL;
     int skip_num = 0, i;
+    size_t line_used = MAX_LINE;
 
     CTRACE((tfp, "GridText: entered HText_EditTextArea()\n"));
 
@@ -13013,14 +13019,15 @@ static int finish_ExtEditForm(LinkInfo * form_link, TextAnchor *start_anchor,
      * struct.  Add new lines to the TEXTAREA if needed.  (Always leave
      * the user with a blank line at the end of the TEXTAREA.)
      */
-    if ((line = typeMallocn(char, MAX_LINE)) == 0)
+    if ((line = typeMallocn(char, line_used)) == 0)
 	  outofmem(__FILE__, "HText_EditTextArea");
 
     assert(line != NULL);
 
     anchor_ptr = start_anchor;
-    if (anchor_ptr->input_field->size <= 4 ||
-	anchor_ptr->input_field->size >= MAX_LINE)
+    display_size = anchor_ptr->input_field->size;
+    if (display_size <= 4 ||
+	display_size >= MAX_LINE)
 	wanted_fieldlen_wrap = 0;
 
     len = 0;
@@ -13047,22 +13054,28 @@ static int finish_ExtEditForm(LinkInfo * form_link, TextAnchor *start_anchor,
 	else
 	    len = (int) strlen(lp);
 
-	if (wanted_fieldlen_wrap < 0 && !wrapalert &&
-	    len0 + len >= start_anchor->input_field->size &&
+	if (wanted_fieldlen_wrap < 0 &&
+	    !wrapalert &&
+	    len0 + len >= display_size &&
 	    (cp = strchr(lp, ' ')) != NULL &&
-	    (cp - lp) < start_anchor->input_field->size - 1) {
+	    (cp - lp) < display_size - 1) {
+
 	    LYFixCursesOn("ask for confirmation:");
 	    LYerase();		/* don't show previous state */
 	    if (HTConfirmDefault(gettext("Wrap lines to fit displayed area?"),
 				 NO)) {
-		wanted_fieldlen_wrap = start_anchor->input_field->size - 1;
+		wanted_fieldlen_wrap = display_size - 1;
 	    } else {
 		wanted_fieldlen_wrap = 0;
 	    }
 	}
-	if (wanted_fieldlen_wrap > 0 && len0 + len > wanted_fieldlen_wrap) {
+
+	if (wanted_fieldlen_wrap > 0 &&
+	    len0 + len > wanted_fieldlen_wrap) {
+
 	    for (i = wanted_fieldlen_wrap - len0;
 		 i + len0 >= wanted_fieldlen_wrap / 4; i--) {
+
 		if (isspace(UCH(lp[i]))) {
 		    len = i + 1;
 		    cp = lp + i;
@@ -13093,7 +13106,10 @@ static int finish_ExtEditForm(LinkInfo * form_link, TextAnchor *start_anchor,
 		}
 	    }
 	}
-	if (wanted_fieldlen_wrap > 0 && len0 + len > wanted_fieldlen_wrap) {
+
+	if (wanted_fieldlen_wrap > 0 &&
+	    (len0 + len) > wanted_fieldlen_wrap) {
+
 	    i = len - 1;
 	    while (len0 + i + 1 > wanted_fieldlen_wrap &&
 		   isspace(UCH(lp[i])))
@@ -13102,23 +13118,17 @@ static int finish_ExtEditForm(LinkInfo * form_link, TextAnchor *start_anchor,
 		len = wanted_fieldlen_wrap - len0;
 	}
 
-	if (len0 + len >= MAX_LINE) {
-	    if (!wrapalert) {
-		LYFixCursesOn("show alert:");
-		HTAlert(gettext("Very long lines have been wrapped!"));
-		wrapalert = TRUE;
-	    }
-	    /*
-	     * First try to find a space character for wrapping - kw
-	     */
-	    for (i = MAX_LINE - len0 - 1; i > 0; i--) {
-		if (isspace(UCH(lp[i]))) {
-		    len = i;
-		    break;
-		}
-	    }
-	    if (len0 + len >= MAX_LINE)
-		len = MAX_LINE - len0 - 1;
+	/*
+	 * Check if the new text will fit in the buffer.  HTML does not define
+	 * a "maxlength" attribute for TEXTAREA; its data can grow as needed.
+	 * Lynx will not adjust the display to reflect larger amounts of text;
+	 * it relies on the rows/cols attributes as well as the initial content
+	 * of the text area for the layout.
+	 */
+	if ((size_t) (len0 + len) >= line_used) {
+	    line_used = (size_t) (3 * (len0 + len)) / 2;
+	    if ((line = typeRealloc(char, line, line_used)) == 0)
+		  outofmem(__FILE__, "HText_EditTextArea");
 	}
 
 	strncat(line, lp, (size_t) len);
diff --git a/src/LYDownload.c b/src/LYDownload.c
index 7822cdea..241818c3 100644
--- a/src/LYDownload.c
+++ b/src/LYDownload.c
@@ -1,4 +1,4 @@
-/* $LynxId: LYDownload.c,v 1.62 2010/09/25 11:19:25 tom Exp $ */
+/* $LynxId: LYDownload.c,v 1.64 2012/02/08 22:23:59 tom Exp $ */
 #include <HTUtils.h>
 #include <HTParse.h>
 #include <HTList.h>
@@ -31,8 +31,8 @@ void LYDownload(char *line)
     int method_number;
     int count;
     char *the_command = 0;
-    char buffer[LY_MAXPATH];
-    char command[LY_MAXPATH];
+    bstring *buffer = NULL;
+    bstring *command = NULL;
     char *cp;
     lynx_list_item_type *download_command = 0;
     int ch;
@@ -133,14 +133,18 @@ void LYDownload(char *line)
 	 */
 	_statusline(FILENAME_PROMPT);
       retry:
-	if (sug_file)
-	    LYStrNCpy(buffer, sug_file, ((sizeof(buffer) / 2) - 1));
-	else
-	    *buffer = '\0';
+	if (sug_file) {
+	    BStrCopy0(buffer, sug_file);
+	} else {
+	    BStrCopy0(buffer, "");
+	}
+
       check_recall:
-	if ((ch = LYGetStr(buffer,
-			   VISIBLE, (sizeof(buffer) / 2), recall)) < 0 ||
-	    *buffer == '\0' || ch == UPARROW || ch == DNARROW) {
+	if ((ch = LYgetBString(&buffer, VISIBLE, 0, recall)) < 0 ||
+	    isBEmpty(buffer) ||
+	    ch == UPARROW ||
+	    ch == DNARROW) {
+
 	    if (recall && ch == UPARROW) {
 		if (FirstRecall) {
 		    FirstRecall = FALSE;
@@ -165,7 +169,7 @@ void LYDownload(char *line)
 		    goto retry;
 		} else if ((cp = (char *) HTList_objectAt(sug_filenames,
 							  FnameNum)) != NULL) {
-		    LYStrNCpy(buffer, cp, sizeof(buffer) - 1);
+		    BStrCopy0(buffer, cp);
 		    if (FnameTotal == 1) {
 			_statusline(EDIT_THE_PREV_FILENAME);
 		    } else {
@@ -197,7 +201,7 @@ void LYDownload(char *line)
 		    goto retry;
 		} else if ((cp = (char *) HTList_objectAt(sug_filenames,
 							  FnameNum)) != NULL) {
-		    LYStrNCpy(buffer, cp, sizeof(buffer) - 1);
+		    BStrCopy0(buffer, cp);
 		    if (FnameTotal == 1) {
 			_statusline(EDIT_THE_PREV_FILENAME);
 		    } else {
@@ -213,11 +217,11 @@ void LYDownload(char *line)
 	    goto cancelled;
 	}
 
-	strcpy(command, buffer);
+	BStrCopy(command, buffer);
 	if (!LYValidateFilename(buffer, command))
 	    goto cancelled;
 #ifdef HAVE_POPEN
-	else if (LYIsPipeCommand(buffer)) {
+	else if (LYIsPipeCommand(buffer->str)) {
 	    /* I don't know how to download to a pipe */
 	    HTAlert(CANNOT_WRITE_TO_FILE);
 	    _statusline(NEW_FILENAME_PROMPT);
@@ -230,7 +234,7 @@ void LYDownload(char *line)
 	/*
 	 * See if it already exists.
 	 */
-	switch (LYValidateOutput(buffer)) {
+	switch (LYValidateOutput(buffer->str)) {
 	case 'Y':
 	    break;
 	case 'N':
@@ -239,16 +243,15 @@ void LYDownload(char *line)
 	    FnameNum = FnameTotal;
 	    goto retry;
 	default:
-	    FREE(Line);
-	    return;
+	    goto cleanup;
 	}
 
 	/*
 	 * See if we can write to it.
 	 */
-	CTRACE((tfp, "LYDownload: filename is %s\n", buffer));
+	CTRACE((tfp, "LYDownload: filename is %s\n", buffer->str));
 
-	if (!LYCanWriteFile(buffer)) {
+	if (!LYCanWriteFile(buffer->str)) {
 	    FirstRecall = TRUE;
 	    FnameNum = FnameTotal;
 	    goto retry;
@@ -260,13 +263,13 @@ void LYDownload(char *line)
 	/*
 	 * Try rename() first.  - FM
 	 */
-	CTRACE((tfp, "command: rename(%s, %s)\n", file, buffer));
-	if (rename(file, buffer)) {
+	CTRACE((tfp, "command: rename(%s, %s)\n", file, buffer->str));
+	if (rename(file, buffer->str)) {
 	    /*
 	     * Failed.  Use spawned COPY_COMMAND.  - FM
 	     */
 	    CTRACE((tfp, "         FAILED!\n"));
-	    LYCopyFile(file, buffer);
+	    LYCopyFile(file, buffer->str);
 	} else {
 	    /*
 	     * We don't have the temporary file (it was renamed to a permanent
@@ -274,18 +277,18 @@ void LYDownload(char *line)
 	     */
 	    LYDidRename = TRUE;
 	}
-	chmod(buffer, HIDE_CHMOD);
+	chmod(buffer->str, HIDE_CHMOD);
 #else /* Unix: */
 
-	LYCopyFile(file, buffer);
-	LYRelaxFilePermissions(buffer);
+	LYCopyFile(file, buffer->str);
+	LYRelaxFilePermissions(buffer->str);
 #endif /* VMS */
 
     } else {
 	/*
 	 * Use configured download commands.
 	 */
-	buffer[0] = '\0';
+	BStrCopy0(buffer, "");
 	for (count = 0, download_command = downloaders;
 	     count < method_number;
 	     count++, download_command = download_command->next) ;	/* null body */
@@ -299,16 +302,20 @@ void LYDownload(char *line)
 	     */
 	    if (HTCountCommandArgs(download_command->command) >= 2) {
 		_statusline(FILENAME_PROMPT);
+
 	      again:
 		if (sug_file) {
-		    StrNCpy(buffer, sug_file, (sizeof(buffer) / 2) - 1);
+		    BStrCopy0(buffer, sug_file);
 		} else {
-		    *buffer = '\0';
+		    BStrCopy0(buffer, "");
 		}
+
 	      check_again:
-		if ((ch = LYGetStr(buffer, VISIBLE,
-				   sizeof(buffer), recall)) < 0 ||
-		    *buffer == '\0' || ch == UPARROW || ch == DNARROW) {
+		if ((ch = LYgetBString(&buffer, VISIBLE, 0, recall)) < 0 ||
+		    isBEmpty(buffer) ||
+		    ch == UPARROW ||
+		    ch == DNARROW) {
+
 		    if (recall && ch == UPARROW) {
 			if (FirstRecall) {
 			    FirstRecall = FALSE;
@@ -334,7 +341,7 @@ void LYDownload(char *line)
 			} else if ((cp = (char *) HTList_objectAt(sug_filenames,
 								  FnameNum))
 				   != NULL) {
-			    LYStrNCpy(buffer, cp, sizeof(buffer) - 1);
+			    BStrCopy0(buffer, cp);
 			    if (FnameTotal == 1) {
 				_statusline(EDIT_THE_PREV_FILENAME);
 			    } else {
@@ -367,7 +374,7 @@ void LYDownload(char *line)
 			} else if ((cp = (char *) HTList_objectAt(sug_filenames,
 								  FnameNum))
 				   != NULL) {
-			    LYStrNCpy(buffer, cp, sizeof(buffer) - 1);
+			    BStrCopy0(buffer, cp);
 			    if (FnameTotal == 1) {
 				_statusline(EDIT_THE_PREV_FILENAME);
 			    } else {
@@ -384,7 +391,7 @@ void LYDownload(char *line)
 		}
 
 		if (no_dotfiles || !show_dotfiles) {
-		    if (*LYPathLeaf(buffer) == '.') {
+		    if (*LYPathLeaf(buffer->str) == '.') {
 			HTAlert(FILENAME_CANNOT_BE_DOT);
 			_statusline(NEW_FILENAME_PROMPT);
 			goto again;
@@ -394,7 +401,7 @@ void LYDownload(char *line)
 		 * Cancel if the user entered "/dev/null" on Unix, or an "nl:"
 		 * path on VMS.  - FM
 		 */
-		if (LYIsNullDevice(buffer)) {
+		if (LYIsNullDevice(buffer->str)) {
 		    goto cancelled;
 		}
 		SecondS = TRUE;
@@ -410,7 +417,7 @@ void LYDownload(char *line)
 	    count = 1;
 	    HTAddParam(&the_command, download_command->command, count, file);
 	    if (HTCountCommandArgs(download_command->command) > 1)
-		HTAddParam(&the_command, download_command->command, ++count, buffer);
+		HTAddParam(&the_command, download_command->command, ++count, buffer->str);
 	    HTEndParam(&the_command, download_command->command, count);
 
 	} else {
@@ -428,30 +435,31 @@ void LYDownload(char *line)
 
     if (SecondS == TRUE) {
 #ifdef VMS
-	if (0 == strncasecomp(buffer, "sys$disk:", 9)) {
-	    if (0 == StrNCmp((buffer + 9), "[]", 2)) {
-		HTAddSugFilename(buffer + 11);
+	if (0 == strncasecomp(buffer->str, "sys$disk:", 9)) {
+	    if (0 == StrNCmp((buffer->str + 9), "[]", 2)) {
+		HTAddSugFilename(buffer->str + 11);
 	    } else {
-		HTAddSugFilename(buffer + 9);
+		HTAddSugFilename(buffer->str + 9);
 	    }
 	} else {
-	    HTAddSugFilename(buffer);
+	    HTAddSugFilename(buffer->str);
 	}
 #else
-	HTAddSugFilename(buffer);
+	HTAddSugFilename(buffer->str);
 #endif /* VMS */
     }
-    FREE(Line);
-    return;
+    goto cleanup;
 
   failed:
     HTAlert(CANNOT_DOWNLOAD_FILE);
-    FREE(Line);
-    return;
+    goto cleanup;
 
   cancelled:
     HTInfoMsg(CANCELLING);
+
+  cleanup:
     FREE(Line);
+    BStrFree(buffer);
     return;
 }
 
diff --git a/src/LYForms.c b/src/LYForms.c
index bb8ad24d..aec9f2c9 100644
--- a/src/LYForms.c
+++ b/src/LYForms.c
@@ -1,4 +1,4 @@
-/* $LynxId: LYForms.c,v 1.95 2012/02/07 17:33:29 tom Exp $ */
+/* $LynxId: LYForms.c,v 1.96 2012/02/09 01:01:53 tom Exp $ */
 #include <HTUtils.h>
 #include <HTCJK.h>
 #include <HTTP.h>
@@ -250,7 +250,7 @@ int change_form_link_ex(int cur,
 	    LYSetHilite(cur, form->value);
 #ifdef TEXT_SUBMIT_CONFIRM_WANTED
 	    if (!immediate_submit && (c == '\r' || c == '\n') &&
-		!HTConfirmDefault(NO_SUBMIT_BUTTON_QUERY), YES) {
+		!HTConfirmDefault(NO_SUBMIT_BUTTON_QUERY, YES)) {
 		/* User was prompted and declined; if canceled with ^G
 		 * let mainloop stay on this field, otherwise move on to
 		 * the next field or link. - kw
diff --git a/src/LYGetFile.c b/src/LYGetFile.c
index 6138fbee..2c6ebe1a 100644
--- a/src/LYGetFile.c
+++ b/src/LYGetFile.c
@@ -1,4 +1,4 @@
-/* $LynxId: LYGetFile.c,v 1.85 2010/12/07 20:59:41 tom Exp $ */
+/* $LynxId: LYGetFile.c,v 1.87 2012/02/08 21:01:03 tom Exp $ */
 #include <HTUtils.h>
 #include <HTTP.h>
 #include <HTAnchor.h>		/* Anchor class */
@@ -547,12 +547,13 @@ int getfile(DocInfo *doc, int *target)
 		}
 		cp = strchr(doc->address, ':') + 1;
 		reply_by_mail(cp,
-			      ((HTMainAnchor && !LYUserSpecifiedURL) ?
-			       (char *) HTMainAnchor->address :
-			       (char *) doc->address),
+			      ((HTMainAnchor && !LYUserSpecifiedURL)
+			       ? (char *) HTMainAnchor->address
+			       : (char *) doc->address),
 			      title,
-			      (HTMainAnchor && !LYUserSpecifiedURL) ?
-			      HTMainAnchor->message_id : NULL);
+			      (HTMainAnchor && !LYUserSpecifiedURL)
+			      ? HTMainAnchor->message_id
+			      : NULL);
 		FREE(tmptitle);
 	    }
 	    return (NULLFILE);
@@ -1123,25 +1124,30 @@ int follow_link_number(int c,
 		       DocInfo *doc,
 		       int *num)
 {
-    char temp[120];
-    char *p = temp;
+    bstring *temp = NULL;
+    char *p;
     int rel = 0;
     int new_top, new_link;
     BOOL want_go;
     int curline = *num;		/* passed in from mainloop() */
+    int code;
 
     CTRACE((tfp, "follow_link_number(%d,%d,...)\n", c, cur));
-    temp[0] = (char) c;
-    temp[1] = '\0';
+    BStrCopy0(temp, "?");
+    temp->str[0] = (char) c;
     *num = -1;
     _statusline(FOLLOW_LINK_NUMBER);
+
     /*
      * Get the number, possibly with a letter suffix, from the user.
      */
-    if (LYGetStr(temp, VISIBLE, sizeof(temp), NORECALL) < 0 || *temp == 0) {
+    if (LYgetBString(&temp, VISIBLE, sizeof(temp), NORECALL) < 0 ||
+	isBEmpty(temp)) {
 	HTInfoMsg(CANCELLED);
 	return (DO_NOTHING);
     }
+
+    p = temp->str;
     *num = atoi(p);
     while (isdigit(UCH(*p)))
 	++p;
@@ -1161,7 +1167,7 @@ int follow_link_number(int c,
     }
     /* don't currently check for errors typing suffix */
 
-    CTRACE((tfp, "  temp=%s, *num=%d, rel='%c'\n", temp, *num, rel));
+    CTRACE((tfp, "  temp=%s, *num=%d, rel='%c'\n", temp->str, *num, rel));
     /*
      * Check if we had a 'p' or 'P' following the number as a flag for
      * displaying the page with that number.  - FM
@@ -1169,15 +1175,15 @@ int follow_link_number(int c,
     if ((c == 'p' || c == 'P') && display_lines == 0) {
 	CTRACE((tfp, " curline=%d, LYlines=%d, display too small!\n",
 		curline, LYlines));
-	return (PRINT_ERROR);
+	code = PRINT_ERROR;
     } else if (c == 'p' || c == 'P') {
 	int nlines = HText_getNumOfLines();
-	int npages = ((nlines + 1) > display_lines) ?
-	(((nlines + 1) + (display_lines - 1)) / (display_lines))
-	: 1;
-	int curpage = ((curline + 1) > display_lines) ?
-	(((curline + 1) + (display_lines - 1)) / (display_lines))
-	: 1;
+	int npages = (((nlines + 1) > display_lines)
+		      ? (((nlines + 1) + (display_lines - 1)) / (display_lines))
+		      : 1);
+	int curpage = (((curline + 1) > display_lines)
+		       ? (((curline + 1) + (display_lines - 1)) / (display_lines))
+		       : 1);
 
 	CTRACE((tfp, " nlines=%d, npages=%d, curline=%d, curpage=%d\n",
 		nlines, npages, curline, curpage));
@@ -1187,63 +1193,68 @@ int follow_link_number(int c,
 	    *num = curpage + *num;
 	else if (rel == '-')
 	    *num = curpage - *num;
-	doc->line = (npages <= 1) ?
-	    1 :
-	    ((*num <= npages) ? (((*num - 1) * display_lines) + 1)
-	     : (((npages - 1) * display_lines) + 1));
-	return (DO_GOTOPAGE_STUFF);
-    }
-
-    /*
-     * Check if we want to make the link corresponding to the number the
-     * current link, rather than ACTIVATE-ing it.
-     */
-    want_go = (BOOL) (c == 'g' || c == 'G');
+	doc->line = ((npages <= 1)
+		     ? 1
+		     : ((*num <= npages)
+			? (((*num - 1) * display_lines) + 1)
+			: (((npages - 1) * display_lines) + 1)));
+	code = DO_GOTOPAGE_STUFF;
+    } else {
 
-    /* If rel, add or subtract num from current link, or
-     * nearest previous/subsequent link if current link is not on screen.
-     */
-    if (rel)
-	*num = HTGetRelLinkNum(*num, rel, cur);
-    /*
-     * If we have a valid number, act on it.
-     */
-    if (*num > 0) {
-	int info;
-	char *text = NULL;
+	/*
+	 * Check if we want to make the link corresponding to the number the
+	 * current link, rather than ACTIVATE-ing it.
+	 */
+	want_go = (BOOL) (c == 'g' || c == 'G');
 
+	/* If rel, add or subtract num from current link, or
+	 * nearest previous/subsequent link if current link is not on screen.
+	 */
+	if (rel)
+	    *num = HTGetRelLinkNum(*num, rel, cur);
 	/*
-	 * Get the lname, and hightext, directly from www structures and add it
-	 * to the cur link so that we can pass it transparently on to
-	 * getfile(), and load new_top and new_link if we instead want to make
-	 * the link number current.  These things are done so that a link can
-	 * be selected anywhere in the current document, whether it is
-	 * displayed on the screen or not!
+	 * If we have a valid number, act on it.
 	 */
-	info = HTGetLinkInfo(*num,
-			     want_go,
-			     &new_top,
-			     &new_link,
-			     &text,
-			     &links[cur].lname);
-	if (text != NULL)
-	    LYSetHilite(cur, text);
-	if (info == WWW_INTERN_LINK_TYPE) {
-	    links[cur].type = WWW_INTERN_LINK_TYPE;
-	    return (DO_LINK_STUFF);
-	} else if (info == LINK_LINE_FOUND) {
-	    doc->line = new_top + 1;
-	    doc->link = new_link;
-	    return (DO_GOTOLINK_STUFF);
-	} else if (info) {
-	    links[cur].type = WWW_LINK_TYPE;
-	    return (DO_LINK_STUFF);
+	if (*num > 0) {
+	    int info;
+	    char *text = NULL;
+
+	    /*
+	     * Get the lname, and hightext, directly from www structures and
+	     * add it to the cur link so that we can pass it transparently on
+	     * to getfile(), and load new_top and new_link if we instead want
+	     * to make the link number current.  These things are done so that
+	     * a link can be selected anywhere in the current document, whether
+	     * it is displayed on the screen or not!
+	     */
+	    info = HTGetLinkInfo(*num,
+				 want_go,
+				 &new_top,
+				 &new_link,
+				 &text,
+				 &links[cur].lname);
+	    if (text != NULL)
+		LYSetHilite(cur, text);
+
+	    if (info == WWW_INTERN_LINK_TYPE) {
+		links[cur].type = WWW_INTERN_LINK_TYPE;
+		code = DO_LINK_STUFF;
+	    } else if (info == LINK_LINE_FOUND) {
+		doc->line = new_top + 1;
+		doc->link = new_link;
+		code = DO_GOTOLINK_STUFF;
+	    } else if (info) {
+		links[cur].type = WWW_LINK_TYPE;
+		code = DO_LINK_STUFF;
+	    } else {
+		code = PRINT_ERROR;
+	    }
 	} else {
-	    return (PRINT_ERROR);
+	    code = PRINT_ERROR;
 	}
-    } else {
-	return (PRINT_ERROR);
     }
+    BStrFree(temp);
+    return code;
 }
 
 #if defined(EXEC_LINKS) || defined(LYNXCGI_LINKS)
diff --git a/src/LYJump.c b/src/LYJump.c
index 07789dd4..8c20145c 100644
--- a/src/LYJump.c
+++ b/src/LYJump.c
@@ -1,5 +1,5 @@
 /*
- * $LynxId: LYJump.c,v 1.40 2012/01/17 00:43:43 tom Exp $
+ * $LynxId: LYJump.c,v 1.42 2012/02/09 01:56:47 tom Exp $
  */
 #include <HTUtils.h>
 #include <HTAlert.h>
@@ -181,9 +181,10 @@ BOOL LYJumpInit(char *config)
 
 char *LYJump(int key)
 {
+    static bstring *buf = NULL;
+
     JumpDatum seeking;
     JumpDatum *found;
-    static char buf[124];
     char *bp, *cp;
     struct JumpTable *jtp;
     int ch;
@@ -210,16 +211,19 @@ char *LYJump(int key)
     if (jtp->nel == 0)
 	return NULL;
 
-    if (!jump_buffer || isEmpty(jtp->shortcut))
-	*buf = '\0';
-    else if (non_empty(jtp->shortcut)) {
-	if (strlen(jtp->shortcut) > sizeof(buf) - 5)
-	    jtp->shortcut[sizeof(buf) - 5] = '\0';
-	strcpy(buf, jtp->shortcut);
+    if (!jump_buffer || isEmpty(jtp->shortcut)) {
+	BStrCopy0(buf, "");
+    } else if (non_empty(jtp->shortcut)) {
+	size_t len = (size_t) BStrLen(buf);
+
+	if (strlen(jtp->shortcut) > len) {
+	    jtp->shortcut[len] = '\0';
+	    BStrCopy0(buf, jtp->shortcut);
+	}
     }
 
     ShortcutTotal = (jtp->history ? HTList_count(jtp->history) : 0);
-    if (jump_buffer && *buf) {
+    if (jump_buffer && !isBEmpty(buf)) {
 	recall = ((ShortcutTotal > 1) ? RECALL_URL : NORECALL);
 	ShortcutNum = 0;
 	FirstShortcutRecall = FALSE;
@@ -230,7 +234,7 @@ char *LYJump(int key)
     }
 
     statusline(jtp->msg);
-    if ((ch = LYGetStr(buf, VISIBLE, (sizeof(buf) - 4), recall)) < 0) {
+    if ((ch = LYgetBString(&buf, VISIBLE, 0, recall)) < 0) {
 	/*
 	 * User cancelled the Jump via ^G. - FM
 	 */
@@ -239,8 +243,8 @@ char *LYJump(int key)
     }
 
   check_recall:
-    bp = buf;
-    if (TOUPPER(key) == 'G' && StrNCmp(buf, "o ", 2) == 0)
+    bp = buf->str;
+    if (TOUPPER(key) == 'G' && StrNCmp(buf->str, "o ", 2) == 0)
 	bp++;
     bp = LYSkipBlanks(bp);
     if (*bp == '\0' &&
@@ -248,8 +252,8 @@ char *LYJump(int key)
 	/*
 	 * User cancelled the Jump via a zero-length string. - FM
 	 */
-	*buf = '\0';
-	StrAllocCopy(jtp->shortcut, buf);
+	BStrCopy0(buf, "");
+	StrAllocCopy(jtp->shortcut, buf->str);
 	HTInfoMsg(CANCELLED);
 	return NULL;
     }
@@ -259,13 +263,15 @@ char *LYJump(int key)
 
 	LYJumpFileURL = FALSE;
 	if (no_goto) {
-	    *buf = '\0';
-	    StrAllocCopy(jtp->shortcut, buf);
+	    BStrCopy0(buf, "");
+	    StrAllocCopy(jtp->shortcut, buf->str);
 	    HTUserMsg(RANDOM_URL_DISALLOWED);
 	    return NULL;
 	}
-	sprintf(buf, "Go %.*s", (int) sizeof(buf) - 4, bp);
-	return (bp = buf);
+	HTSprintf0(&temp, "Go %s", bp);
+	BStrCopy0(buf, temp);
+	FREE(temp);
+	return (bp = buf->str);
     }
 #endif /* PERMIT_GOTO_FROM_JUMP */
 
@@ -289,9 +295,9 @@ char *LYJump(int key)
 	    ShortcutNum = 0;
 	if ((cp = (char *) HTList_objectAt(jtp->history,
 					   ShortcutNum)) != NULL) {
-	    LYStrNCpy(buf, cp, sizeof(buf) - 1);
+	    BStrCopy0(buf, cp);
 	    if (jump_buffer && jtp->shortcut &&
-		!strcmp(buf, jtp->shortcut)) {
+		!strcmp(buf->str, jtp->shortcut)) {
 		_statusline(EDIT_CURRENT_SHORTCUT);
 	    } else if ((jump_buffer && ShortcutTotal == 2) ||
 		       (!jump_buffer && ShortcutTotal == 1)) {
@@ -299,8 +305,7 @@ char *LYJump(int key)
 	    } else {
 		_statusline(EDIT_A_PREV_SHORTCUT);
 	    }
-	    if ((ch = LYGetStr(buf, VISIBLE,
-			       sizeof(buf), recall)) < 0) {
+	    if ((ch = LYgetBString(&buf, VISIBLE, 0, recall)) < 0) {
 		/*
 		 * User cancelled the jump via ^G.
 		 */
@@ -329,9 +334,9 @@ char *LYJump(int key)
 	    ShortcutNum = ShortcutTotal - 1;
 	if ((cp = (char *) HTList_objectAt(jtp->history,
 					   ShortcutNum)) != NULL) {
-	    LYStrNCpy(buf, cp, sizeof(buf) - 1);
+	    BStrCopy0(buf, cp);
 	    if (jump_buffer && jtp->shortcut &&
-		!strcmp(buf, jtp->shortcut)) {
+		!strcmp(buf->str, jtp->shortcut)) {
 		_statusline(EDIT_CURRENT_SHORTCUT);
 	    } else if ((jump_buffer && ShortcutTotal == 2) ||
 		       (!jump_buffer && ShortcutTotal == 1)) {
@@ -339,7 +344,7 @@ char *LYJump(int key)
 	    } else {
 		_statusline(EDIT_A_PREV_SHORTCUT);
 	    }
-	    if ((ch = LYGetStr(buf, VISIBLE, sizeof(buf), recall)) < 0) {
+	    if ((ch = LYgetBString(&buf, VISIBLE, 0, recall)) < 0) {
 		/*
 		 * User cancelled the jump via ^G.
 		 */
@@ -354,7 +359,7 @@ char *LYJump(int key)
     found = (JumpDatum *) bsearch((char *) &seeking, (char *) jtp->table,
 				  (size_t) jtp->nel, sizeof(JumpDatum), LYCompare);
     if (!found) {
-	user_message("Unknown target '%s'", buf);
+	user_message("Unknown target '%s'", buf->str);
 	LYSleepAlert();
     }
 
diff --git a/src/LYLocal.c b/src/LYLocal.c
index 07c502cb..f4b23208 100644
--- a/src/LYLocal.c
+++ b/src/LYLocal.c
@@ -1,5 +1,5 @@
 /*
- * $LynxId: LYLocal.c,v 1.115 2011/10/07 00:41:24 tom Exp $
+ * $LynxId: LYLocal.c,v 1.117 2012/02/08 20:32:47 tom Exp $
  *
  *  Routines to manipulate the local filesystem.
  *  Written by: Rick Mallett, Carleton University
@@ -79,9 +79,8 @@
 #endif /* FNAMES_8_3 */
 #endif /* OK_INSTALL */
 
-static char *get_filename(const char *prompt,
-			  char *buf,
-			  size_t bufsize);
+static int get_filename(const char *prompt,
+			bstring *buf);
 
 #ifdef OK_PERMIT
 static int permit_location(char *destpath,
@@ -791,7 +790,7 @@ static char *parse_directory(char *path)
 static int modify_tagged(char *testpath)
 {
     char *cp;
-    char given_target[MAX_LINE];
+    bstring *given_target = NULL;
     char *dst_path = NULL;
     char *src_path = NULL;
     char *old_path = NULL;
@@ -807,39 +806,35 @@ static int modify_tagged(char *testpath)
 
     _statusline(gettext("Enter new location for tagged items: "));
 
-    given_target[0] = '\0';
-    LYGetStr(given_target, VISIBLE, sizeof(given_target), NORECALL);
-    if (strlen(given_target)) {
+    BStrCopy0(given_target, "");
+    LYgetBString(&given_target, VISIBLE, 0, NORECALL);
+    if (!isBEmpty(given_target)) {
 	/*
 	 * Replace ~/ references to the home directory.
 	 */
-	if (LYIsTilde(given_target[0]) && LYIsPathSep(given_target[1])) {
+	if (LYIsTilde(given_target->str[0]) && LYIsPathSep(given_target->str[1])) {
 	    char *cp1 = NULL;
 
 	    StrAllocCopy(cp1, Home_Dir());
-	    StrAllocCat(cp1, (given_target + 1));
-	    if (strlen(cp1) > (sizeof(given_target) - 1)) {
-		HTAlert(gettext("Path too long"));
-		FREE(cp1);
-		return 0;
-	    }
-	    LYStrNCpy(given_target, cp1, sizeof(given_target) - 1);
+	    StrAllocCat(cp1, (given_target->str + 1));
+	    BStrCopy0(given_target, cp1);
 	    FREE(cp1);
 	}
 
 	/*
 	 * If path is relative, prefix it with current location.
 	 */
-	if (!LYIsPathSep(given_target[0])) {
+	if (!LYIsPathSep(given_target->str[0])) {
 	    dst_path = HTLocalName(testpath);
 	    LYAddPathSep(&dst_path);
-	    StrAllocCat(dst_path, given_target);
+	    StrAllocCat(dst_path, given_target->str);
 	} else {
-	    dst_path = HTLocalName(given_target);
+	    dst_path = HTLocalName(given_target->str);
 	}
 
 	if (!ok_stat(dst_path, &dst_info)) {
 	    FREE(dst_path);
+	    BStrFree(given_target);
 	    return 0;
 	}
 
@@ -855,6 +850,7 @@ static int modify_tagged(char *testpath)
 		    || same_location(&src_info, &dst_info)
 		    || !dir_has_same_owner(&dst_info, &src_info)) {
 		    FREE(src_path);
+		    BStrFree(given_target);
 		    return 0;
 		}
 	    }
@@ -880,6 +876,7 @@ static int modify_tagged(char *testpath)
 	FREE(src_path);
 	FREE(dst_path);
     }
+    BStrFree(given_target);
     return count;
 }
 
@@ -889,7 +886,7 @@ static int modify_tagged(char *testpath)
 static int modify_name(char *testpath)
 {
     const char *cp;
-    char tmpbuf[DIRED_MAXBUF];
+    bstring *tmpbuf = NULL;
     char *newpath = NULL;
     struct stat dir_info;
     int code = 0;
@@ -900,6 +897,7 @@ static int modify_name(char *testpath)
     testpath = strip_trailing_slash(testpath);
 
     if (ok_stat(testpath, &dir_info)) {
+
 	/*
 	 * Change the name of the file or directory.
 	 */
@@ -910,32 +908,35 @@ static int modify_name(char *testpath)
 	} else {
 	    return ok_file_or_dir(&dir_info);
 	}
-	LYStrNCpy(tmpbuf, LYPathLeaf(testpath), sizeof(tmpbuf) - 1);
-	if (get_filename(cp, tmpbuf, sizeof(tmpbuf)) == NULL)
-	    return 0;
 
-	/*
-	 * Do not allow the user to also change the location at this time.
-	 */
-	if (LYLastPathSep(tmpbuf) != 0) {
-	    HTAlert(gettext("Illegal character (path-separator) found! Request ignored."));
-	} else if (strlen(tmpbuf)) {
-	    if ((cp = LYLastPathSep(testpath)) != NULL)
-		HTSprintf0(&newpath, "%.*s%s",
-			   (int) (cp - testpath + 1), testpath, tmpbuf);
-	    else
-		StrAllocCopy(newpath, tmpbuf);
+	BStrCopy0(tmpbuf, LYPathLeaf(testpath));
+	if (get_filename(cp, tmpbuf)) {
 
 	    /*
-	     * Make sure the destination does not already exist.
+	     * Do not allow the user to also change the location at this time.
 	     */
-	    if (not_already_exists(newpath)) {
-		code = move_file(testpath, newpath);
-	    }
-	    FREE(newpath);
+	    if (LYLastPathSep(tmpbuf->str) != 0) {
+		HTAlert(gettext("Illegal character (path-separator) found! Request ignored."));
+	    } else if (strlen(tmpbuf->str)) {
+		if ((cp = LYLastPathSep(testpath)) != NULL) {
+		    HTSprintf0(&newpath, "%.*s%s",
+			       (int) (cp - testpath + 1),
+			       testpath, tmpbuf->str);
+		} else {
+		    StrAllocCopy(newpath, tmpbuf->str);
+		}
 
+		/*
+		 * Make sure the destination does not already exist.
+		 */
+		if (not_already_exists(newpath)) {
+		    code = move_file(testpath, newpath);
+		}
+		FREE(newpath);
+	    }
 	}
     }
+    BStrFree(tmpbuf);
     return code;
 }
 
@@ -946,7 +947,7 @@ static int modify_location(char *testpath)
 {
     const char *cp;
     char *sp;
-    char tmpbuf[MAX_LINE];
+    bstring *tmpbuf = NULL;
     char *newpath = NULL;
     char *savepath = NULL;
     struct stat old_info;
@@ -971,49 +972,52 @@ static int modify_location(char *testpath)
     } else {
 	return ok_file_or_dir(&dir_info);
     }
-    LYStrNCpy(tmpbuf, testpath, sizeof(tmpbuf) - 1);
-    *LYPathLeaf(tmpbuf) = '\0';
-    if (get_filename(cp, tmpbuf, sizeof(tmpbuf)) == NULL)
-	return 0;
-    if (strlen(tmpbuf)) {
-	StrAllocCopy(savepath, testpath);
-	StrAllocCopy(newpath, testpath);
 
-	/*
-	 * Allow ~/ references to the home directory.
-	 */
-	if (LYIsTilde(tmpbuf[0])
-	    && (tmpbuf[1] == '\0' || LYIsPathSep(tmpbuf[1]))) {
-	    StrAllocCopy(newpath, Home_Dir());
-	    StrAllocCat(newpath, (tmpbuf + 1));
-	    LYStrNCpy(tmpbuf, newpath, sizeof(tmpbuf) - 1);
-	}
-	if (LYisAbsPath(tmpbuf)) {
-	    StrAllocCopy(newpath, tmpbuf);
-	} else if ((sp = LYLastPathSep(newpath)) != NULL) {
-	    *++sp = '\0';
-	    StrAllocCat(newpath, tmpbuf);
-	} else {
-	    HTAlert(gettext("Unexpected failure - unable to find trailing path separator"));
+    BStrCopy0(tmpbuf, testpath);
+    *LYPathLeaf(tmpbuf->str) = '\0';
+    if (get_filename(cp, tmpbuf)) {
+	if (strlen(tmpbuf->str)) {
+	    StrAllocCopy(savepath, testpath);
+	    StrAllocCopy(newpath, testpath);
+
+	    /*
+	     * Allow ~/ references to the home directory.
+	     */
+	    if (LYIsTilde(tmpbuf->str[0])
+		&& (tmpbuf->str[1] == '\0' || LYIsPathSep(tmpbuf->str[1]))) {
+		StrAllocCopy(newpath, Home_Dir());
+		StrAllocCat(newpath, (tmpbuf->str + 1));
+		BStrCopy0(tmpbuf, newpath);
+	    }
+	    if (LYisAbsPath(tmpbuf->str)) {
+		StrAllocCopy(newpath, tmpbuf->str);
+	    } else if ((sp = LYLastPathSep(newpath)) != NULL) {
+		*++sp = '\0';
+		StrAllocCat(newpath, tmpbuf->str);
+	    } else {
+		HTAlert(gettext("Unexpected failure - unable to find trailing path separator"));
+		FREE(newpath);
+		FREE(savepath);
+		BStrFree(tmpbuf);
+		return 0;
+	    }
+
+	    /*
+	     * Make sure the source and target have the same owner (uid).
+	     */
+	    old_info = dir_info;
+	    if (!ok_stat(newpath, &dir_info)) {
+		code = 0;
+	    } else if (same_location(&old_info, &dir_info)) {
+		code = 0;
+	    } else if (dir_has_same_owner(&dir_info, &old_info)) {
+		code = move_file(savepath, newpath);
+	    }
 	    FREE(newpath);
 	    FREE(savepath);
-	    return 0;
-	}
-
-	/*
-	 * Make sure the source and target have the same owner (uid).
-	 */
-	old_info = dir_info;
-	if (!ok_stat(newpath, &dir_info)) {
-	    code = 0;
-	} else if (same_location(&old_info, &dir_info)) {
-	    code = 0;
-	} else if (dir_has_same_owner(&dir_info, &old_info)) {
-	    code = move_file(savepath, newpath);
 	}
-	FREE(newpath);
-	FREE(savepath);
     }
+    BStrFree(tmpbuf);
     return code;
 }
 
@@ -1024,8 +1028,9 @@ int local_modify(DocInfo *doc, char **newpath)
 {
     int ans;
     char *cp;
-    char testpath[DIRED_MAXBUF];	/* a bit ridiculous */
+    bstring *testpath = NULL;
     int count;
+    int code = 0;
 
     if (!HTList_isEmpty(tagged)) {
 	cp = HTpartURL_toFile(doc->address);
@@ -1064,20 +1069,20 @@ int local_modify(DocInfo *doc, char **newpath)
 	    FREE(cp);
 	    return 0;
 	}
-	LYStrNCpy(testpath, cp, sizeof(testpath) - 1);
+	BStrCopy0(testpath, cp);
 	FREE(cp);
 
 	if (ans == 'N') {
-	    return modify_name(testpath);
+	    code = modify_name(testpath->str);
 	} else if (ans == 'L') {
-	    if (modify_location(testpath)) {
+	    if (modify_location(testpath->str)) {
 		if (doc->link == (nlinks - 1))
 		    --doc->link;
-		return 1;
+		code = 1;
 	    }
 #ifdef OK_PERMIT
 	} else if (ans == 'P') {
-	    return (permit_location(NULL, testpath, newpath));
+	    code = permit_location(NULL, testpath->str, newpath);
 #endif /* OK_PERMIT */
 	} else {
 	    /*
@@ -1086,7 +1091,8 @@ int local_modify(DocInfo *doc, char **newpath)
 	    HTAlert(gettext("This feature not yet implemented!"));
 	}
     }
-    return 0;
+    BStrFree(testpath);
+    return code;
 }
 
 #define BadChars() ((!no_dotfiles && show_dotfiles) \
@@ -1099,23 +1105,23 @@ int local_modify(DocInfo *doc, char **newpath)
 static int create_file(char *current_location)
 {
     int code = FALSE;
-    char tmpbuf[DIRED_MAXBUF];
+    bstring *tmpbuf = NULL;
     char *testpath = NULL;
 
-    tmpbuf[0] = '\0';
-    if (get_filename(gettext("Enter name of file to create: "),
-		     tmpbuf, sizeof(tmpbuf)) != NULL) {
+    BStrCopy0(tmpbuf, "");
+    if (get_filename(gettext("Enter name of file to create: "), tmpbuf)) {
 
-	if (strstr(tmpbuf, "//") != NULL) {
+	if (strstr(tmpbuf->str, "//") != NULL) {
 	    HTAlert(gettext("Illegal redirection \"//\" found! Request ignored."));
-	} else if (strlen(tmpbuf) && strchr(BadChars(), tmpbuf[0]) == NULL) {
+	} else if (strlen(tmpbuf->str) &&
+		   strchr(BadChars(), tmpbuf->str[0]) == NULL) {
 	    StrAllocCopy(testpath, current_location);
 	    LYAddPathSep(&testpath);
 
 	    /*
 	     * Append the target filename to the current location.
 	     */
-	    StrAllocCat(testpath, tmpbuf);
+	    StrAllocCat(testpath, tmpbuf->str);
 
 	    /*
 	     * Make sure the target does not already exist
@@ -1126,6 +1132,7 @@ static int create_file(char *current_location)
 	    FREE(testpath);
 	}
     }
+    BStrFree(tmpbuf);
     return code;
 }
 
@@ -1135,20 +1142,20 @@ static int create_file(char *current_location)
 static int create_directory(char *current_location)
 {
     int code = FALSE;
-    char tmpbuf[DIRED_MAXBUF];
+    bstring *tmpbuf = NULL;
     char *testpath = NULL;
 
-    tmpbuf[0] = '\0';
-    if (get_filename(gettext("Enter name for new directory: "),
-		     tmpbuf, sizeof(tmpbuf)) != NULL) {
+    BStrCopy0(tmpbuf, "");
+    if (get_filename(gettext("Enter name for new directory: "), tmpbuf)) {
 
-	if (strstr(tmpbuf, "//") != NULL) {
+	if (strstr(tmpbuf->str, "//") != NULL) {
 	    HTAlert(gettext("Illegal redirection \"//\" found! Request ignored."));
-	} else if (strlen(tmpbuf) && strchr(BadChars(), tmpbuf[0]) == NULL) {
+	} else if (strlen(tmpbuf->str) &&
+		   strchr(BadChars(), tmpbuf->str[0]) == NULL) {
 	    StrAllocCopy(testpath, current_location);
 	    LYAddPathSep(&testpath);
 
-	    StrAllocCat(testpath, tmpbuf);
+	    StrAllocCat(testpath, tmpbuf->str);
 
 	    /*
 	     * Make sure the target does not already exist.
@@ -1159,6 +1166,7 @@ static int create_directory(char *current_location)
 	    FREE(testpath);
 	}
     }
+    BStrFree(tmpbuf);
     return code;
 }
 
@@ -1300,7 +1308,7 @@ int local_remove(DocInfo *doc)
 
 #ifdef OK_PERMIT
 
-static char LYValidPermitFile[LY_MAXPATH] = "\0";
+static bstring *LYValidPermitFile = NULL;
 
 static long permit_bits(char *string_mode)
 {
@@ -1376,9 +1384,7 @@ static int permit_location(char *destpath,
 	LYRegisterUIPage(*newpath, UIP_PERMIT_OPTIONS);
 
 	group_name = HTAA_GidToName((int) dir_info.st_gid);
-	LYStrNCpy(LYValidPermitFile,
-		  srcpath,
-		  (sizeof(LYValidPermitFile) - 1));
+	BStrCopy0(LYValidPermitFile, srcpath);
 
 	fprintf(fp0, "<Html><Head>\n<Title>%s</Title>\n</Head>\n<Body>\n",
 		PERMIT_OPTIONS_TITLE);
@@ -1462,7 +1468,7 @@ static int permit_location(char *destpath,
 	 * Make sure we have a valid set-permission file comparison string
 	 * loaded via a previous call with srcpath != NULL.  - KW
 	 */
-	if (LYValidPermitFile[0] == '\0') {
+	if (isBEmpty(LYValidPermitFile)) {
 	    if (LYCursesON)
 		HTAlert(INVALID_PERMIT_URL);
 	    else
@@ -1497,7 +1503,7 @@ static int permit_location(char *destpath,
 	 * Make sure that the file string is the one from the last displayed
 	 * File Permissions menu.  - KW
 	 */
-	if (strcmp(destpath, LYValidPermitFile)) {
+	if (strcmp(destpath, LYValidPermitFile->str)) {
 	    if (LYCursesON)
 		HTAlert(INVALID_PERMIT_URL);
 	    else
@@ -2195,34 +2201,31 @@ int dired_options(DocInfo *doc, char **newfile)
 }
 
 /*
- * Check DIRED filename.
+ * Check DIRED filename, return true on success
  */
-static char *get_filename(const char *prompt,
-			  char *buf,
-			  size_t bufsize)
+static int get_filename(const char *prompt,
+			bstring *buf)
 {
     char *cp;
 
     _statusline(prompt);
 
-    LYGetStr(buf, VISIBLE, bufsize, NORECALL);
-    if (strstr(buf, "../") != NULL) {
+    LYgetBString(&buf, VISIBLE, 0, NORECALL);
+    if (strstr(buf->str, "../") != NULL) {
 	HTAlert(gettext("Illegal filename; request ignored."));
-	return NULL;
-    }
-
-    if (no_dotfiles || !show_dotfiles) {
-	cp = LYLastPathSep(buf);	/* find last slash */
+	return FALSE;
+    } else if (no_dotfiles || !show_dotfiles) {
+	cp = LYLastPathSep(buf->str);	/* find last slash */
 	if (cp)
 	    cp += 1;
 	else
-	    cp = buf;
+	    cp = buf->str;
 	if (*cp == '.') {
 	    HTAlert(gettext("Illegal filename; request ignored."));
-	    return NULL;
+	    return FALSE;
 	}
     }
-    return buf;
+    return !isBEmpty(buf);
 }
 
 #ifdef OK_INSTALL
diff --git a/src/LYMainLoop.c b/src/LYMainLoop.c
index 72160e92..e64c8830 100644
--- a/src/LYMainLoop.c
+++ b/src/LYMainLoop.c
@@ -1,5 +1,5 @@
 /*
- * $LynxId: LYMainLoop.c,v 1.183 2012/02/07 00:36:19 tom Exp $
+ * $LynxId: LYMainLoop.c,v 1.187 2012/02/09 01:55:58 tom Exp $
  */
 #include <HTUtils.h>
 #include <HTAccess.h>
@@ -182,7 +182,7 @@ HTList *Goto_URLs = NULL;	/* List of Goto URLs */
 char *LYRequestTitle = NULL;	/* newdoc.title in calls to getfile() */
 char *LYRequestReferer = NULL;	/* Referer, may be set in getfile() */
 
-static char prev_target[MAX_LINE];
+static bstring *prev_target = NULL;
 
 #ifdef DISP_PARTIAL
 BOOLEAN display_partial = FALSE;	/* could be enabled in HText_new() */
@@ -504,7 +504,7 @@ BOOL LYMainLoop_pageDisplay(int line_num)
 	    }
 	}
 
-    HText_pageDisplay(LYGetNewline(), prev_target);
+    HText_pageDisplay(LYGetNewline(), prev_target->str);
     return YES;
 }
 #endif /* DISP_PARTIAL */
@@ -517,7 +517,7 @@ static BOOL set_curdoc_link(int nextlink)
 	&& nextlink >= 0
 	&& nextlink < nlinks) {
 	if (curdoc.link >= 0 && curdoc.link < nlinks) {
-	    LYhighlight(FALSE, curdoc.link, prev_target);
+	    LYhighlight(FALSE, curdoc.link, prev_target->str);
 	    result = TRUE;
 	}
 	curdoc.link = nextlink;
@@ -552,7 +552,7 @@ static void goto_line(int nextline)
 static void set_curdoc_link_by_mouse(int nextlink)
 {
     if (set_curdoc_link(nextlink)) {
-	LYhighlight(TRUE, nextlink, prev_target);
+	LYhighlight(TRUE, nextlink, prev_target->str);
 	LYmsec_delay(20);
     }
 }
@@ -591,7 +591,7 @@ static int do_change_link(void)
 			else HTuncache_current_document()
 #endif /* DIRED_SUPPORT */
 
-static void do_check_goto_URL(char *user_input_buffer,
+static void do_check_goto_URL(bstring *user_input_buffer,
 			      char **old_user_input,
 			      BOOLEAN *force_load)
 {
@@ -646,28 +646,29 @@ static void do_check_goto_URL(char *user_input_buffer,
     BOOLEAN found = FALSE;
 
     /* allow going to anchors */
-    if (*user_input_buffer == '#') {
-	if (user_input_buffer[1] &&
-	    HTFindPoundSelector(user_input_buffer + 1)) {
+    if (user_input_buffer->str[0] == '#') {
+	if (user_input_buffer->str[1] &&
+	    HTFindPoundSelector(user_input_buffer->str + 1)) {
 	    /* HTFindPoundSelector will initialize www_search_result,
 	       so we do nothing else. */
-	    HTAddGotoURL(user_input_buffer);
+	    HTAddGotoURL(user_input_buffer->str);
 	    trimPoundSelector(curdoc.address);
-	    StrAllocCat(curdoc.address, user_input_buffer);
+	    StrAllocCat(curdoc.address, user_input_buffer->str);
 	}
     } else {
 	/*
 	 * If it's not a URL then make it one.
 	 */
-	StrAllocCopy(*old_user_input, user_input_buffer);
+	StrAllocCopy(*old_user_input, user_input_buffer->str);
 	LYEnsureAbsoluteURL(old_user_input, "", TRUE);
-	sprintf(user_input_buffer, "%.*s",
-		(int) (MAX_LINE - 1), *old_user_input);
+	BStrCopy0(user_input_buffer, *old_user_input);
 	FREE(*old_user_input);
 
 	for (n = 0; n < TABLESIZE(table); n++) {
 	    if (*(table[n].flag)
-		&& !StrNCmp(user_input_buffer, table[n].name, strlen(table[n].name))) {
+		&& !StrNCmp(user_input_buffer->str,
+			    table[n].name,
+			    strlen(table[n].name))) {
 		found = TRUE;
 		HTUserMsg2(GOTO_XXXX_DISALLOWED, table[n].name);
 		break;
@@ -676,12 +677,12 @@ static void do_check_goto_URL(char *user_input_buffer,
 	if (found) {
 	    ;
 	} else if (LYValidate &&
-		   !isHTTP_URL(user_input_buffer) &&
-		   !isHTTPS_URL(user_input_buffer)) {
+		   !isHTTP_URL(user_input_buffer->str) &&
+		   !isHTTPS_URL(user_input_buffer->str)) {
 	    HTUserMsg(GOTO_NON_HTTP_DISALLOWED);
 
 	} else {
-	    set_address(&newdoc, user_input_buffer);
+	    set_address(&newdoc, user_input_buffer->str);
 	    newdoc.isHEAD = FALSE;
 	    /*
 	     * Might be an anchor in the same doc from a POST form.  If so,
@@ -712,7 +713,7 @@ static void do_check_goto_URL(char *user_input_buffer,
 
 /* returns FALSE if user cancelled input or URL was invalid, TRUE otherwise */
 static BOOL do_check_recall(int ch,
-			    char *user_input_buffer,
+			    bstring *user_input_buffer,
 			    char **old_user_input,
 			    int URLTotal,
 			    int *URLNum,
@@ -727,20 +728,20 @@ static BOOL do_check_recall(int ch,
 
     for (;;) {
 #ifdef WIN_EX			/* 1998/10/11 (Sun) 10:41:05 */
-	int len = strlen(user_input_buffer);
+	int len = strlen(user_input_buffer->str);
 
 	if (len >= 3) {
 	    if (len < MAX_LINE - 1
-		&& LYIsHtmlSep(user_input_buffer[len - 3])
-		&& LYIsDosDrive(user_input_buffer + len - 2))
-		LYAddPathSep0(user_input_buffer);
+		&& LYIsHtmlSep(user_input_buffer->str[len - 3])
+		&& LYIsDosDrive(user_input_buffer->str + len - 2))
+		LYAddPathSep0(user_input_buffer->str);
 
-	} else if (len == 2 && user_input_buffer[1] == ':') {
-	    if (LYIsDosDrive(user_input_buffer)) {
-		LYAddPathSep0(user_input_buffer);
+	} else if (len == 2 && user_input_buffer->str[1] == ':') {
+	    if (LYIsDosDrive(user_input_buffer->str)) {
+		LYAddPathSep0(user_input_buffer->str);
 	    } else {
-		HTUserMsg2(WWW_ILLEGAL_URL_MESSAGE, user_input_buffer);
-		LYStrNCpy(user_input_buffer, *old_user_input, MAX_LINE - 1);
+		HTUserMsg2(WWW_ILLEGAL_URL_MESSAGE, user_input_buffer->str);
+		BStrCopy0(user_input_buffer, *old_user_input);
 		FREE(*old_user_input);
 		ret = FALSE;
 		break;
@@ -750,10 +751,10 @@ static BOOL do_check_recall(int ch,
 	/*
 	 * Get rid of leading spaces (and any other spaces).
 	 */
-	LYTrimAllStartfile(user_input_buffer);
-	if (*user_input_buffer == '\0' &&
+	LYTrimAllStartfile(user_input_buffer->str);
+	if (isBEmpty(user_input_buffer) &&
 	    !(recall && (ch == UPARROW || ch == DNARROW))) {
-	    LYStrNCpy(user_input_buffer, *old_user_input, MAX_LINE - 1);
+	    BStrCopy0(user_input_buffer, *old_user_input);
 	    FREE(*old_user_input);
 	    HTInfoMsg(CANCELLED);
 	    ret = FALSE;
@@ -779,10 +780,10 @@ static BOOL do_check_recall(int ch,
 		*URLNum = 0;
 	    if ((cp = (char *) HTList_objectAt(Goto_URLs,
 					       *URLNum)) != NULL) {
-		LYStrNCpy(user_input_buffer, cp, MAX_LINE - 1);
+		BStrCopy0(user_input_buffer, cp);
 		if (goto_buffer
 		    && **old_user_input
-		    && !strcmp(*old_user_input, user_input_buffer)) {
+		    && !strcmp(*old_user_input, user_input_buffer->str)) {
 		    _statusline(EDIT_CURRENT_GOTO);
 		} else if ((goto_buffer && URLTotal == 2) ||
 			   (!goto_buffer && URLTotal == 1)) {
@@ -790,14 +791,13 @@ static BOOL do_check_recall(int ch,
 		} else {
 		    _statusline(EDIT_A_PREV_GOTO);
 		}
-		if ((ch = LYGetStr(user_input_buffer, VISIBLE,
-				   (size_t) MAX_LINE,
-				   recall)) < 0) {
+		if ((ch = LYgetBString(&user_input_buffer,
+				       VISIBLE, 0, recall)) < 0) {
 		    /*
 		     * User cancelled the Goto via ^G.  Restore
 		     * user_input_buffer and break.  - FM
 		     */
-		    LYStrNCpy(user_input_buffer, *old_user_input, MAX_LINE - 1);
+		    BStrCopy0(user_input_buffer, *old_user_input);
 		    FREE(*old_user_input);
 		    HTInfoMsg(CANCELLED);
 		    ret = FALSE;
@@ -824,9 +824,9 @@ static BOOL do_check_recall(int ch,
 		 */
 		*URLNum = URLTotal - 1;
 	    if ((cp = (char *) HTList_objectAt(Goto_URLs, *URLNum)) != NULL) {
-		LYStrNCpy(user_input_buffer, cp, MAX_LINE - 1);
+		BStrCopy0(user_input_buffer, cp);
 		if (goto_buffer && **old_user_input &&
-		    !strcmp(*old_user_input, user_input_buffer)) {
+		    !strcmp(*old_user_input, user_input_buffer->str)) {
 		    _statusline(EDIT_CURRENT_GOTO);
 		} else if ((goto_buffer && URLTotal == 2) ||
 			   (!goto_buffer && URLTotal == 1)) {
@@ -834,14 +834,13 @@ static BOOL do_check_recall(int ch,
 		} else {
 		    _statusline(EDIT_A_PREV_GOTO);
 		}
-		if ((ch = LYGetStr(user_input_buffer, VISIBLE,
-				   (size_t) MAX_LINE,
-				   recall)) < 0) {
+		if ((ch = LYgetBString(&user_input_buffer,
+				       VISIBLE, 0, recall)) < 0) {
 		    /*
 		     * User cancelled the Goto via ^G.  Restore
 		     * user_input_buffer and break.  - FM
 		     */
-		    LYStrNCpy(user_input_buffer, *old_user_input, MAX_LINE - 1);
+		    BStrCopy0(user_input_buffer, *old_user_input);
 		    FREE(*old_user_input);
 		    HTInfoMsg(CANCELLED);
 		    ret = FALSE;
@@ -1703,16 +1702,16 @@ static void handle_LYK_CLEAR_AUTH(int *old_c,
     }
 }
 
-static int handle_LYK_COMMAND(char *user_input_buffer)
+static int handle_LYK_COMMAND(bstring *user_input_buffer)
 {
     LYKeymapCode ch;
     Kcmd *mp;
     char *src, *tmp;
 
-    *user_input_buffer = 0;
+    BStrCopy0(user_input_buffer, "");
     _statusline(": ");
-    if (LYGetStr(user_input_buffer, VISIBLE, (size_t) MAX_LINE, RECALL_CMD) >= 0) {
-	src = LYSkipBlanks(user_input_buffer);
+    if (LYgetBString(&user_input_buffer, VISIBLE, 0, RECALL_CMD) >= 0) {
+	src = LYSkipBlanks(user_input_buffer->str);
 	tmp = LYSkipNonBlanks(src);
 	*tmp = 0;
 	ch = ((mp = LYStringToKcmd(src)) != 0) ? mp->code : LYK_UNKNOWN;
@@ -2365,7 +2364,7 @@ static int handle_LYK_DWIMEDIT(int *cmd,
 }
 
 static int handle_LYK_ECGOTO(int *ch,
-			     char *user_input_buffer,
+			     bstring *user_input_buffer,
 			     char **old_user_input,
 			     int *old_c,
 			     int real_c)
@@ -2399,10 +2398,8 @@ static int handle_LYK_ECGOTO(int *ch,
      * Save the current user_input_buffer string, and load the current
      * document's address.
      */
-    StrAllocCopy(*old_user_input, user_input_buffer);
-    LYStrNCpy(user_input_buffer,
-	      curdoc.address,
-	      (MAX_LINE - 1));
+    StrAllocCopy(*old_user_input, user_input_buffer->str);
+    BStrCopy0(user_input_buffer, curdoc.address);
 
     /*
      * Warn the user if the current document has POST data associated with it. 
@@ -2415,12 +2412,12 @@ static int handle_LYK_ECGOTO(int *ch,
      * Offer the current document's URL for editing.  - FM
      */
     _statusline(EDIT_CURDOC_URL);
-    if (((*ch = LYGetStr(user_input_buffer, VISIBLE,
-			 MAX_LINE, RECALL_URL)) >= 0) &&
-	user_input_buffer[0] != '\0' &&
-	strcmp(user_input_buffer, curdoc.address)) {
-	LYTrimAllStartfile(user_input_buffer);
-	if (user_input_buffer[0] != '\0') {
+    if (((*ch = LYgetBString(&user_input_buffer, VISIBLE,
+			     0, RECALL_URL)) >= 0) &&
+	!isBEmpty(user_input_buffer) &&
+	strcmp(user_input_buffer->str, curdoc.address)) {
+	LYTrimAllStartfile(user_input_buffer->str);
+	if (!isBEmpty(user_input_buffer)) {
 	    return 2;
 	}
     }
@@ -2428,7 +2425,7 @@ static int handle_LYK_ECGOTO(int *ch,
      * User cancelled via ^G, a full deletion, or not modifying the URL.  - FM
      */
     HTInfoMsg(CANCELLED);
-    LYStrNCpy(user_input_buffer, *old_user_input, MAX_LINE - 1);
+    BStrCopy0(user_input_buffer, *old_user_input);
     FREE(*old_user_input);
     return 0;
 }
@@ -2590,7 +2587,7 @@ static void handle_LYK_EDIT_TEXTAREA(BOOLEAN *refresh_screen,
 }
 
 static int handle_LYK_ELGOTO(int *ch,
-			     char *user_input_buffer,
+			     bstring *user_input_buffer,
 			     char **old_user_input,
 			     int *old_c,
 			     int real_c)
@@ -2651,26 +2648,24 @@ static int handle_LYK_ELGOTO(int *ch,
      * Save the current user_input_buffer string, and load the current link's
      * address.  - FM
      */
-    StrAllocCopy(*old_user_input, user_input_buffer);
-    LYStrNCpy(user_input_buffer,
+    StrAllocCopy(*old_user_input, user_input_buffer->str);
+    BStrCopy0(user_input_buffer,
 	      ((links[curdoc.link].type == WWW_FORM_LINK_TYPE)
-	       ?
-	       links[curdoc.link].l_form->submit_action : links[curdoc.link].lname),
-	      (MAX_LINE - 1));
-
+	       ? links[curdoc.link].l_form->submit_action
+	       : links[curdoc.link].lname));
     /*
      * Offer the current link's URL for editing.  - FM
      */
     _statusline(EDIT_CURLINK_URL);
-    if (((*ch = LYGetStr(user_input_buffer, VISIBLE,
-			 MAX_LINE, RECALL_URL)) >= 0) &&
-	user_input_buffer[0] != '\0' &&
-	strcmp(user_input_buffer,
+    if (((*ch = LYgetBString(&user_input_buffer, VISIBLE,
+			     0, RECALL_URL)) >= 0) &&
+	!isBEmpty(user_input_buffer) &&
+	strcmp(user_input_buffer->str,
 	       ((links[curdoc.link].type == WWW_FORM_LINK_TYPE)
 		? links[curdoc.link].l_form->submit_action
 		: links[curdoc.link].lname))) {
-	LYTrimAllStartfile(user_input_buffer);
-	if (user_input_buffer[0] != '\0') {
+	LYTrimAllStartfile(user_input_buffer->str);
+	if (!isBEmpty(user_input_buffer)) {
 	    return 2;
 	}
     }
@@ -2678,7 +2673,7 @@ static int handle_LYK_ELGOTO(int *ch,
      * User cancelled via ^G, a full deletion, or not modifying the URL.  - FM
      */
     HTInfoMsg(CANCELLED);
-    LYStrNCpy(user_input_buffer, *old_user_input, MAX_LINE - 1);
+    BStrCopy0(user_input_buffer, *old_user_input);
     FREE(*old_user_input);
     return 0;
 }
@@ -2879,7 +2874,7 @@ static void handle_LYK_FIRST_LINK(void)
 }
 
 static BOOLEAN handle_LYK_GOTO(int *ch,
-			       char *user_input_buffer,
+			       bstring *user_input_buffer,
 			       char **old_user_input,
 			       RecallType * recall,
 			       int *URLTotal,
@@ -2897,12 +2892,12 @@ static BOOLEAN handle_LYK_GOTO(int *ch,
 	return FALSE;
     }
 
-    StrAllocCopy(*old_user_input, user_input_buffer);
+    StrAllocCopy(*old_user_input, user_input_buffer->str);
     if (!goto_buffer)
-	*user_input_buffer = '\0';
+	BStrCopy0(user_input_buffer, "");
 
     *URLTotal = (Goto_URLs ? HTList_count(Goto_URLs) : 0);
-    if (goto_buffer && *user_input_buffer) {
+    if (goto_buffer && !isBEmpty(user_input_buffer)) {
 	*recall = ((*URLTotal > 1) ? RECALL_URL : NORECALL);
 	*URLNum = 0;
 	*FirstURLRecall = FALSE;
@@ -2916,13 +2911,12 @@ static BOOLEAN handle_LYK_GOTO(int *ch,
      * Ask the user.
      */
     _statusline(URL_TO_OPEN);
-    if ((*ch = LYGetStr(user_input_buffer, VISIBLE,
-			MAX_LINE, *recall)) < 0) {
+    if ((*ch = LYgetBString(&user_input_buffer, VISIBLE, 0, *recall)) < 0) {
 	/*
 	 * User cancelled the Goto via ^G.  Restore user_input_buffer and
 	 * break.  - FM
 	 */
-	LYStrNCpy(user_input_buffer, *old_user_input, MAX_LINE - 1);
+	BStrCopy0(user_input_buffer, *old_user_input);
 	FREE(*old_user_input);
 	HTInfoMsg(CANCELLED);
 	return FALSE;
@@ -3460,27 +3454,27 @@ static BOOLEAN check_JUMP_param(char **url_template)
     char *result = *url_template;
     char *encoded = NULL;
     int code = TRUE;
+    bstring *input = NULL;
 
     CTRACE((tfp, "check_JUMP_param: %s\n", result));
 
     while ((subs = strstr(result, "%s")) != 0) {
 	char prompt[MAX_LINE];
-	char input[MAX_LINE];
 	RecallType recall = NORECALL;
 
 	CTRACE((tfp, "Prompt for query param%d: %s\n", param, result));
 
 	sprintf(prompt, "Query param%d: ", param++);
 	statusline(prompt);
-	*input = '\0';
-	if (LYGetStr(input, VISIBLE, sizeof(input), recall) < 0) {
+	BStrCopy0(input, "");
+	if (LYgetBString(&input, VISIBLE, 0, recall) < 0) {
 	    /*
 	     * cancelled via ^G
 	     */
 	    HTInfoMsg(CANCELLED);
 	    code = FALSE;
 	    break;
-	} else if ((encoded = urlencode(input)) != '\0') {
+	} else if ((encoded = urlencode(input->str)) != '\0') {
 	    int subs_at = (int) (subs - result);
 	    int fill_in = (int) strlen(encoded) - 2;
 	    size_t have = strlen(result);
@@ -3494,7 +3488,7 @@ static BOOLEAN check_JUMP_param(char **url_template)
 		break;
 	    }
 
-	    CTRACE((tfp, "  reply: %s\n", input));
+	    CTRACE((tfp, "  reply: %s\n", input->str));
 	    CTRACE((tfp, "  coded: %s\n", encoded));
 
 	    result = update;
@@ -3512,6 +3506,7 @@ static BOOLEAN check_JUMP_param(char **url_template)
 	    break;
 	}
     }
+    BStrFree(input);
     FREE(encoded);
     *url_template = result;
     return TRUE;
@@ -3525,7 +3520,7 @@ static void fill_JUMP_Params(char **addressp)
 }
 
 static BOOLEAN handle_LYK_JUMP(int c,
-			       char *user_input_buffer,
+			       bstring *user_input_buffer,
 			       char **old_user_input GCC_UNUSED,
 			       RecallType * recall GCC_UNUSED,
 			       BOOLEAN *FirstURLRecall GCC_UNUSED,
@@ -3551,7 +3546,7 @@ static BOOLEAN handle_LYK_JUMP(int c,
 #ifdef PERMIT_GOTO_FROM_JUMP
 	    if (!strncasecomp(ret, "Go ", 3)) {
 		LYJumpFileURL = FALSE;
-		StrAllocCopy(*old_user_input, user_input_buffer);
+		StrAllocCopy(*old_user_input, user_input_buffer->str);
 		*URLTotal = (Goto_URLs ? HTList_count(Goto_URLs) : 0);
 		*recall = ((*URLTotal >= 1) ? RECALL_URL : NORECALL);
 		*URLNum = *URLTotal;
@@ -3566,14 +3561,14 @@ static BOOLEAN handle_LYK_JUMP(int c,
 		    return FALSE;
 		}
 		ret = HTParse((ret + 3), startfile, PARSE_ALL);
-		LYStrNCpy(user_input_buffer, ret, MAX_LINE - 1);
+		BStrCopy0(user_input_buffer, ret);
 		FREE(ret);
 		return TRUE;
 	    }
 #endif /* PERMIT_GOTO_FROM_JUMP */
 	    ret = HTParse(ret, startfile, PARSE_ALL);
 	    if (!LYTrimStartfile(ret)) {
-		LYRemoveBlanks(user_input_buffer);
+		LYRemoveBlanks(user_input_buffer->str);
 	    }
 	    if (!check_JUMP_param(&ret))
 		return FALSE;
@@ -3700,7 +3695,7 @@ static void handle_LYK_MAIN_MENU(int *old_c,
 	    newdoc.isHEAD = FALSE;
 	    newdoc.safe = FALSE;
 	    newdoc.internal_link = FALSE;
-	    LYhighlight(FALSE, curdoc.link, prev_target);
+	    LYhighlight(FALSE, curdoc.link, prev_target->str);
 #ifdef DIRED_SUPPORT
 	    if (lynx_edit_mode) {
 		DIRED_UNCACHE_2;
@@ -3960,7 +3955,7 @@ static void handle_LYK_NEXT_LINK(int c,
 				 int real_c)
 {
     if (curdoc.link < nlinks - 1) {	/* next link */
-	LYhighlight(FALSE, curdoc.link, prev_target);
+	LYhighlight(FALSE, curdoc.link, prev_target->str);
 #ifdef FASTTAB
 	/*
 	 * Move to different textarea if TAB in textarea.
@@ -4912,14 +4907,14 @@ static BOOLEAN handle_LYK_VLINKS(int *cmd,
 void handle_LYK_WHEREIS(int cmd,
 			BOOLEAN *refresh_screen)
 {
-    BOOLEAN have_target_onscreen = (BOOLEAN) (*prev_target != '\0' &&
+    BOOLEAN have_target_onscreen = (BOOLEAN) (!isBEmpty(prev_target) &&
 					      HText_pageHasPrevTarget());
     BOOL found;
     int oldcur = curdoc.link;	/* temporarily remember */
     char *remember_old_target = NULL;
 
     if (have_target_onscreen)
-	StrAllocCopy(remember_old_target, prev_target);
+	StrAllocCopy(remember_old_target, prev_target->str);
     else
 	StrAllocCopy(remember_old_target, "");
 
@@ -4928,9 +4923,9 @@ void handle_LYK_WHEREIS(int cmd,
 	 * Reset prev_target to force prompting for a new search string and to
 	 * turn off highlighting if no search string is entered by the user.
 	 */
-	*prev_target = '\0';
+	BStrCopy0(prev_target, "");
     }
-    found = textsearch(&curdoc, prev_target, (int) sizeof(prev_target) - 1,
+    found = textsearch(&curdoc, prev_target,
 		       (cmd == LYK_WHEREIS)
 		       ? 0
 		       : ((cmd == LYK_NEXT)
@@ -4957,9 +4952,9 @@ void handle_LYK_WHEREIS(int cmd,
 	       curdoc.link >= 0 && nlinks > 0 &&
 	       links[curdoc.link].ly >= (display_lines / 3)) {
 	*refresh_screen = TRUE;
-    } else if ((LYcase_sensitive && 0 != strcmp(prev_target,
+    } else if ((LYcase_sensitive && 0 != strcmp(prev_target->str,
 						remember_old_target)) ||
-	       (!LYcase_sensitive && 0 != strcasecomp8(prev_target,
+	       (!LYcase_sensitive && 0 != strcasecomp8(prev_target->str,
 						       remember_old_target))) {
 	*refresh_screen = TRUE;
     }
@@ -4971,7 +4966,6 @@ void handle_LYK_WHEREIS(int cmd,
  */
 static void handle_LYK_digit(int c,
 			     BOOLEAN *force_load,
-			     char *user_input_buffer,
 			     int *old_c,
 			     int real_c,
 			     BOOLEAN *try_internal GCC_UNUSED)
@@ -5026,7 +5020,7 @@ static void handle_LYK_digit(int c,
 			    newdoc.internal_link = curdoc.internal_link;
 			    HTInfoMsg(CANCELLED);
 			    if (nlinks > 0)
-				HText_pageDisplay(curdoc.line, prev_target);
+				HText_pageDisplay(curdoc.line, prev_target->str);
 			    break;
 			} else if (LYresubmit_posts) {
 			    /* If LYresubmit_posts is set, and the
@@ -5096,11 +5090,8 @@ static void handle_LYK_digit(int c,
 		     * the statusline entry, so issue a statusline message for
 		     * the typo-prone users (like me 8-).  - FM
 		     */
-		    StrAllocCopy(temp, user_input_buffer);
-		    sprintf(user_input_buffer,
-			    LINK_ALREADY_CURRENT, number);
-		    HTUserMsg(user_input_buffer);
-		    LYStrNCpy(user_input_buffer, temp, MAX_LINE - 1);
+		    HTSprintf0(&temp, LINK_ALREADY_CURRENT, number);
+		    HTUserMsg(temp);
 		    FREE(temp);
 		} else {
 		    /*
@@ -5129,11 +5120,8 @@ static void handle_LYK_digit(int c,
 	    } else if (!more_text) {
 		HTInfoMsg(ALREADY_AT_END);
 	    } else {
-		StrAllocCopy(temp, user_input_buffer);
-		sprintf(user_input_buffer,
-			ALREADY_AT_PAGE, number);
-		HTUserMsg(user_input_buffer);
-		LYStrNCpy(user_input_buffer, temp, MAX_LINE - 1);
+		HTSprintf0(&temp, ALREADY_AT_PAGE, number);
+		HTUserMsg(temp);
 		FREE(temp);
 	    }
 	}
@@ -5152,7 +5140,7 @@ static void handle_LYK_digit(int c,
 /* original implementation by VH */
 void handle_LYK_CHDIR(void)
 {
-    static char buf[LY_MAXPATH];
+    static bstring *buf = NULL;
     char *p = NULL;
 
     if (no_chdir) {
@@ -5161,18 +5149,16 @@ void handle_LYK_CHDIR(void)
     }
 
     _statusline(gettext("cd to:"));
-    /* some people may prefer automatic clearing of the previous user input,
-       here, to do this, just uncomment next line - VH */
-    /* buf[0]='\0'; */
-    if (LYGetStr(buf, VISIBLE, sizeof(buf) - 1, NORECALL) < 0 || !*buf) {
+    if (LYgetBString(&buf, VISIBLE, 0, NORECALL) < 0 || isBEmpty(buf)) {
 	HTInfoMsg(CANCELLED);
 	return;
     }
 
-    if (LYIsTilde(*buf) && (LYIsPathSep(buf[1]) || buf[1] == '\0')) {
-	HTSprintf0(&p, "%s%s", Home_Dir(), buf + 1);
+    if (LYIsTilde(buf->str[0]) &&
+	(LYIsPathSep(buf->str[1]) || buf->str[1] == '\0')) {
+	HTSprintf0(&p, "%s%s", Home_Dir(), buf->str + 1);
     } else {
-	StrAllocCopy(p, buf);
+	StrAllocCopy(p, buf->str);
     }
 
     CTRACE((tfp, "changing directory to '%s'\n", p));
@@ -5334,7 +5320,7 @@ static BOOLEAN handle_LYK_LINEWRAP_TOGGLE(int *cmd,
 	    code = reparse_or_reload(cmd);
 	}
     }
-    return code;
+    return (BOOLEAN) code;
 }
 #endif
 
@@ -5379,7 +5365,7 @@ int mainloop(void)
     int cmd = LYK_DO_NOTHING, real_cmd = LYK_DO_NOTHING;
     int getresult;
     int arrowup = FALSE, show_help = FALSE;
-    char user_input_buffer[MAX_LINE];
+    bstring *user_input_buffer = NULL;
     const char *cshelpfile = NULL;
     BOOLEAN first_file = TRUE;
     BOOLEAN popped_doc = FALSE;
@@ -5449,9 +5435,8 @@ int mainloop(void)
 #ifndef USE_SESSIONS
     nhist = 0;
 #endif
-    user_input_buffer[(sizeof(user_input_buffer) - 1)] = '\0';
-    *prev_target = '\0';
-    *user_input_buffer = '\0';
+    BStrCopy0(user_input_buffer, "");
+    BStrCopy0(prev_target, "");
 #ifdef LY_FIND_LEAKS
     atexit(free_mainloop_variables);
 #endif
@@ -5667,7 +5652,7 @@ int mainloop(void)
 	     * so they will be available in partial mode
 	     * (was previously implemented in case NORMAL).
 	     */
-	    *prev_target = '\0';	/* Reset for new coming document */
+	    BStrCopy0(prev_target, "");		/* Reset for new coming document */
 	    LYSetNewline(newdoc.line);	/* set for LYGetNewline() */
 
 #ifdef USE_PRETTYSRC
@@ -6428,7 +6413,7 @@ int mainloop(void)
 
 	    refresh_screen = FALSE;
 
-	    HText_pageDisplay(LYGetNewline(), prev_target);
+	    HText_pageDisplay(LYGetNewline(), prev_target->str);
 
 #ifdef DIRED_SUPPORT
 	    if (lynx_edit_mode && nlinks > 0 && !HTList_isEmpty(tagged))
@@ -6512,7 +6497,7 @@ int mainloop(void)
 #else
 	    LYclear();
 #endif /* FANCY_CURSES || USE_SLANG */
-	    HText_pageDisplay(LYGetNewline(), prev_target);
+	    HText_pageDisplay(LYGetNewline(), prev_target->str);
 
 #ifdef DIRED_SUPPORT
 	    if (lynx_edit_mode && nlinks > 0 && !HTList_isEmpty(tagged))
@@ -6648,10 +6633,10 @@ int mainloop(void)
 	     * Highlight current link, unless it is an active text input field.
 	     */
 	    if (!curlink_is_editable) {
-		LYhighlight(TRUE, curdoc.link, prev_target);
+		LYhighlight(TRUE, curdoc.link, prev_target->str);
 #ifndef INACTIVE_INPUT_STYLE_VH
 	    } else if (!textinput_activated) {
-		LYhighlight(TRUE, curdoc.link, prev_target);
+		LYhighlight(TRUE, curdoc.link, prev_target->str);
 #endif
 	    }
 	}
@@ -7008,8 +6993,7 @@ int mainloop(void)
 	case LYK_7:		/* FALLTHRU */
 	case LYK_8:		/* FALLTHRU */
 	case LYK_9:
-	    handle_LYK_digit(c, &force_load, user_input_buffer,
-			     &old_c, real_c, &try_internal);
+	    handle_LYK_digit(c, &force_load, &old_c, real_c, &try_internal);
 	    break;
 
 	case LYK_SOURCE:	/* toggle view source mode */
@@ -7167,7 +7151,8 @@ int mainloop(void)
 		}
 		*t = '\0';
 		get_clip_release();
-		do_check_goto_URL(buf, &temp, &force_load);
+		BStrCopy0(user_input_buffer, buf);
+		do_check_goto_URL(user_input_buffer, &temp, &force_load);
 		free(buf);
 	    }
 	    break;
diff --git a/src/LYOptions.c b/src/LYOptions.c
index 9d2bfb5f..694ef7c4 100644
--- a/src/LYOptions.c
+++ b/src/LYOptions.c
@@ -1,4 +1,4 @@
-/* $LynxId: LYOptions.c,v 1.147 2012/02/08 01:02:48 tom Exp $ */
+/* $LynxId: LYOptions.c,v 1.148 2012/02/09 01:56:18 tom Exp $ */
 #include <HTUtils.h>
 #include <HTFTP.h>
 #include <HTTP.h>		/* 'reloading' flag */
@@ -811,7 +811,7 @@ void LYoptions(void)
 		    ch == -1 || isBEmpty(my_data)) {
 		    LYaddstr(non_empty(bookmark_page) ?
 			     bookmark_page : "NONE");
-		} else if (!LYPathOffHomeOK(my_data->str, my_data->len)) {
+		} else if (!LYPathOffHomeOK(my_data->str, (size_t) my_data->len)) {
 		    LYaddstr(non_empty(bookmark_page) ?
 			     bookmark_page : "NONE");
 		    LYclrtoeol();
@@ -2015,7 +2015,7 @@ void edit_bookmarks(void)
 			FREE(MBM_A_subbookmark[a]);
 		} else {
 		    BStrAlloc(my_data, my_data->len + LY_MAXPATH);
-		    if (!LYPathOffHomeOK(my_data->str, my_data->len)) {
+		    if (!LYPathOffHomeOK(my_data->str, (size_t) my_data->len)) {
 			LYMBM_statusline(USE_PATH_OFF_HOME);
 			LYSleepAlert();
 		    } else {
diff --git a/src/LYPrint.c b/src/LYPrint.c
index 1d972403..a9af8135 100644
--- a/src/LYPrint.c
+++ b/src/LYPrint.c
@@ -1,5 +1,5 @@
 /*
- * $LynxId: LYPrint.c,v 1.90 2010/09/25 11:20:29 tom Exp $
+ * $LynxId: LYPrint.c,v 1.93 2012/02/08 23:40:43 tom Exp $
  */
 #include <HTUtils.h>
 #include <HTAccess.h>
@@ -132,27 +132,26 @@ static char *suggested_filename(DocInfo *newdoc)
     return sug_filename;
 }
 
-static void SetupFilename(char *filename,
+static void SetupFilename(bstring **filename,
 			  const char *sug_filename)
 {
     HTFormat format;
     HTAtom *encoding;
     char *cp;
 
-    LYStrNCpy(filename, sug_filename, LY_MAXPATH - 1);	/* add suggestion info */
-    /* make the sug_filename conform to system specs */
-    change_sug_filename(filename);
+    BStrCopy0(*filename, sug_filename);		/* add suggestion info */
+    BStrAlloc(*filename, LY_MAXPATH);	/* FIXME */
+    change_sug_filename((*filename)->str);
     if (!(HTisDocumentSource())
-	&& (cp = strrchr(filename, '.')) != NULL
-	&& (cp - filename) < (LY_MAXPATH - (int) (sizeof(TEXT_SUFFIX) + 1))) {
-	format = HTFileFormat(filename, &encoding, NULL);
+	&& (cp = strrchr((*filename)->str, '.')) != NULL) {
+	format = HTFileFormat((*filename)->str, &encoding, NULL);
 	CTRACE((tfp, "... format %s\n", format->name));
 	if (!strcasecomp(format->name, "text/html") ||
 	    !IsUnityEnc(encoding)) {
-	    strcpy(cp, TEXT_SUFFIX);
+	    BStrCat0(*filename, TEXT_SUFFIX);
 	}
     }
-    CTRACE((tfp, "... result %s\n", filename));
+    CTRACE((tfp, "... result %s\n", (*filename)->str));
 }
 
 #define FN_INIT 0
@@ -163,7 +162,7 @@ static void SetupFilename(char *filename,
 #define PRINT_FLAG   0
 #define GENERIC_FLAG 1
 
-static int RecallFilename(char *filename,
+static int RecallFilename(bstring **filename,
 			  BOOLEAN *first,
 			  int *now,
 			  int *total,
@@ -182,7 +181,7 @@ static int RecallFilename(char *filename,
     }
     recall = ((*total >= 1) ? RECALL_URL : NORECALL);
 
-    if ((ch = LYGetStr(filename, VISIBLE, LY_MAXPATH, recall)) < 0 ||
+    if ((ch = LYgetBString(filename, VISIBLE, 0, recall)) < 0 ||
 	*filename == '\0' || ch == UPARROW || ch == DNARROW) {
 	if (recall && ch == UPARROW) {
 	    if (*first) {
@@ -208,7 +207,7 @@ static int RecallFilename(char *filename,
 		return FN_INIT;
 	    } else if ((cp = (char *) HTList_objectAt(sug_filenames,
 						      *now)) != NULL) {
-		LYStrNCpy(filename, cp, LY_MAXPATH - 1);
+		BStrCopy0(*filename, cp);
 		if (*total == 1) {
 		    _statusline(EDIT_THE_PREV_FILENAME);
 		} else {
@@ -239,7 +238,7 @@ static int RecallFilename(char *filename,
 		return FN_INIT;
 	    } else if ((cp = (char *) HTList_objectAt(sug_filenames,
 						      *now)) != NULL) {
-		LYStrNCpy(filename, cp, LY_MAXPATH - 1);
+		BStrCopy0(*filename, cp);
 		if (*total == 1) {
 		    _statusline(EDIT_THE_PREV_FILENAME);
 		} else {
@@ -298,23 +297,26 @@ static void send_file_to_file(DocInfo *newdoc,
     BOOLEAN use_cte;
     const char *disp_charset;
     FILE *outfile_fp;
-    char buffer[LY_MAXPATH];
-    char filename[LY_MAXPATH];
+    bstring *buffer = NULL;
+    bstring *filename = NULL;
     int FnameNum = -1;
     int FnameTotal;
     int c = 0;
 
     _statusline(FILENAME_PROMPT);
+
   retry:
-    SetupFilename(filename, sug_filename);
-    if (lynx_save_space
-	&& (strlen(lynx_save_space) + strlen(filename)) < sizeof(filename)) {
-	strcpy(buffer, lynx_save_space);
-	strcat(buffer, filename);
-	strcpy(filename, buffer);
+    SetupFilename(&filename, sug_filename);
+    if (lynx_save_space) {
+	BStrCopy0(buffer, lynx_save_space);
+	BStrCat(buffer, filename);
+	BStrCopy(filename, buffer);
+    } else {
+	BStrCopy0(buffer, "");
     }
+
   check_recall:
-    switch (RecallFilename(filename, &FirstRecall, &FnameNum,
+    switch (RecallFilename(&filename, &FirstRecall, &FnameNum,
 			   &FnameTotal, PRINT_FLAG)) {
     case FN_INIT:
 	goto retry;
@@ -333,7 +335,7 @@ static void send_file_to_file(DocInfo *newdoc,
     /*
      * See if it already exists.
      */
-    switch (LYValidateOutput(buffer)) {
+    switch (LYValidateOutput(buffer->str)) {
     case 'Y':
 	break;
     case 'N':
@@ -348,16 +350,16 @@ static void send_file_to_file(DocInfo *newdoc,
     /*
      * See if we can write to it.
      */
-    CTRACE((tfp, "LYPrint: filename is %s, action is `%c'\n", buffer, c));
+    CTRACE((tfp, "LYPrint: filename is %s, action is `%c'\n", buffer->str, c));
 
 #ifdef HAVE_POPEN
-    if (*buffer == '|') {
+    if (buffer->str[0] == '|') {
 	if (no_shell) {
 	    HTUserMsg(SPAWNING_DISABLED);
 	    FirstRecall = TRUE;
 	    FnameNum = FnameTotal;
 	    goto retry;
-	} else if ((outfile_fp = popen(buffer + 1, "w")) == NULL) {
+	} else if ((outfile_fp = popen(buffer->str + 1, "w")) == NULL) {
 	    CTRACE((tfp, "LYPrint: errno is %d\n", errno));
 	    HTAlert(CANNOT_WRITE_TO_FILE);
 	    _statusline(NEW_FILENAME_PROMPT);
@@ -368,8 +370,8 @@ static void send_file_to_file(DocInfo *newdoc,
     } else
 #endif
 	if ((outfile_fp = (TOUPPER(c) == 'A'
-			   ? LYAppendToTxtFile(buffer)
-			   : LYNewTxtFile(buffer))) == NULL) {
+			   ? LYAppendToTxtFile(buffer->str)
+			   : LYNewTxtFile(buffer->str))) == NULL) {
 	CTRACE((tfp, "LYPrint: errno is %d\n", errno));
 	HTAlert(CANNOT_WRITE_TO_FILE);
 	_statusline(NEW_FILENAME_PROMPT);
@@ -437,27 +439,29 @@ static void send_file_to_file(DocInfo *newdoc,
 	printlist(outfile_fp, FALSE);
 
 #ifdef HAVE_POPEN
-    if (LYIsPipeCommand(buffer))
+    if (LYIsPipeCommand(buffer->str))
 	pclose(outfile_fp);
     else
 #endif
 	LYCloseOutput(outfile_fp);
 
 #ifdef VMS
-    if (0 == strncasecomp(buffer, "sys$disk:", 9)) {
-	if (0 == StrNCmp((buffer + 9), "[]", 2)) {
-	    HTAddSugFilename(buffer + 11);
+    if (0 == strncasecomp(buffer->str, "sys$disk:", 9)) {
+	if (0 == StrNCmp((buffer->str + 9), "[]", 2)) {
+	    HTAddSugFilename(buffer->str + 11);
 	} else {
-	    HTAddSugFilename(buffer + 9);
+	    HTAddSugFilename(buffer->str + 9);
 	}
     } else {
-	HTAddSugFilename(buffer);
+	HTAddSugFilename(buffer->str);
     }
 #else
-    HTAddSugFilename(buffer);
+    HTAddSugFilename(buffer->str);
 #endif /* VMS */
 
   done:
+    BStrFree(buffer);
+    BStrFree(filename);
     return;
 }
 
@@ -484,7 +488,7 @@ static void send_file_to_mail(DocInfo *newdoc,
     FILE *outfile_fp;
     char *buffer = NULL;
     char *subject = NULL;
-    char user_response[LINESIZE];
+    bstring *user_response = NULL;
 
     if (!LYSystemMail())
 	return;
@@ -500,12 +504,9 @@ static void send_file_to_mail(DocInfo *newdoc,
     }
 
     _statusline(MAIL_ADDRESS_PROMPT);
-    LYStrNCpy(user_response, personal_mail_address, sizeof(user_response) - 1);
-    if (LYGetStr(user_response,
-		 VISIBLE,
-		 sizeof(user_response),
-		 RECALL_MAIL) < 0 ||
-	*user_response == '\0') {
+    BStrCopy0(user_response, personal_mail_address);
+    if (LYgetBString(&user_response, VISIBLE, 0, RECALL_MAIL) < 0 ||
+	isBEmpty(user_response)) {
 	CancelPrint(MAIL_REQUEST_CANCELLED);
     }
 
@@ -548,12 +549,14 @@ static void send_file_to_mail(DocInfo *newdoc,
 	StrAllocCat(subject, newdoc->address);
     }
 #if USE_VMS_MAILER
-    if (strchr(user_response, '@') && !strchr(user_response, ':') &&
-	!strchr(user_response, '%') && !strchr(user_response, '"')) {
+    if (strchr(user_response->str, '@') &&
+	!strchr(user_response->str, ':') &&
+	!strchr(user_response->str, '%') &&
+	!strchr(user_response->str, '"')) {
 	char *temp = 0;
 
-	HTSprintf0(&temp, mail_adrs, user_response);
-	LYStrNCpy(user_response, temp, sizeof(user_response) - 1);
+	HTSprintf0(&temp, mail_adrs, user_response->str);
+	BStrCopy0(user_response, temp);
 	FREE(temp);
     }
 
@@ -643,7 +646,7 @@ static void send_file_to_mail(DocInfo *newdoc,
 		   system_mail_flags,
 		   hdrfile,
 		   my_temp,
-		   user_response);
+		   user_response->str);
     } else {
 	/*
 	 * For "generic" VMS MAIL, include the subject in the command.  - FM
@@ -655,7 +658,7 @@ static void send_file_to_mail(DocInfo *newdoc,
 		   system_mail_flags,
 		   subject,
 		   my_temp,
-		   user_response);
+		   user_response->str);
     }
 
     stop_curses();
@@ -754,7 +757,7 @@ static void send_file_to_mail(DocInfo *newdoc,
     /*
      * Add the To, Subject, and X-URL headers.  - FM
      */
-    fprintf(outfile_fp, "To: %s\nSubject: %s\n", user_response, subject);
+    fprintf(outfile_fp, "To: %s\nSubject: %s\n", user_response->str, subject);
     fprintf(outfile_fp, "X-URL: %s\n\n", newdoc->address);
 
     if (LYPrependBaseToSource && HTisDocumentSource()) {
@@ -776,7 +779,7 @@ static void send_file_to_mail(DocInfo *newdoc,
     pclose(outfile_fp);
 #else
     LYCloseOutput(outfile_fp);
-    LYSendMailFile(user_response,
+    LYSendMailFile(user_response->str,
 		   my_temp,
 		   subject,
 		   "",
@@ -786,6 +789,7 @@ static void send_file_to_mail(DocInfo *newdoc,
 #endif /* USE_VMS_MAILER */
 
   done:			/* send_file_to_mail() */
+    BStrFree(user_response);
     FREE(buffer);
     FREE(subject);
     return;
@@ -799,7 +803,7 @@ static void send_file_to_printer(DocInfo *newdoc,
     BOOLEAN FirstRecall = TRUE;
     FILE *outfile_fp;
     char *the_command = 0;
-    char my_file[LY_MAXPATH];
+    bstring *my_file = NULL;
     char my_temp[LY_MAXPATH];
     int FnameTotal, FnameNum = -1;
     lynx_list_item_type *cur_printer;
@@ -851,12 +855,13 @@ static void send_file_to_printer(DocInfo *newdoc,
      * Check for two '%s' and ask for the second filename argument if there
      * is.
      */
+    BStrCopy0(my_file, "");
     if (HTCountCommandArgs(cur_printer->command) >= 2) {
 	_statusline(FILENAME_PROMPT);
       again:
-	SetupFilename(my_file, sug_filename);
+	SetupFilename(&my_file, sug_filename);
       check_again:
-	switch (RecallFilename(my_file, &FirstRecall, &FnameNum,
+	switch (RecallFilename(&my_file, &FirstRecall, &FnameNum,
 			       &FnameTotal, PRINT_FLAG)) {
 	case FN_INIT:
 	    goto again;
@@ -869,7 +874,7 @@ static void send_file_to_printer(DocInfo *newdoc,
 	}
 
 	if (no_dotfiles || !show_dotfiles) {
-	    if (*LYPathLeaf(my_file) == '.') {
+	    if (*LYPathLeaf(my_file->str) == '.') {
 		HTAlert(FILENAME_CANNOT_BE_DOT);
 		_statusline(NEW_FILENAME_PROMPT);
 		FirstRecall = TRUE;
@@ -881,26 +886,22 @@ static void send_file_to_printer(DocInfo *newdoc,
 	 * Cancel if the user entered "/dev/null" on Unix, or an "nl:" path
 	 * on VMS.  - FM
 	 */
-	if (LYIsNullDevice(my_file)) {
+	if (LYIsNullDevice(my_file->str)) {
 	    CancelPrint(PRINT_REQUEST_CANCELLED);
 	}
-	HTAddSugFilename(my_file);
+	HTAddSugFilename(my_file->str);
     }
 #ifdef SH_EX			/* 1999/01/04 (Mon) 09:37:03 */
-    else {
-	my_file[0] = '\0';
-    }
-
     HTAddParam(&the_command, cur_printer->command, 1, my_temp);
-    if (my_file[0]) {
-	HTAddParam(&the_command, cur_printer->command, 2, my_file);
+    if (!isBEmpty(my_file)) {
+	HTAddParam(&the_command, cur_printer->command, 2, my_file->str);
 	HTEndParam(&the_command, cur_printer->command, 3);
     } else {
 	HTEndParam(&the_command, cur_printer->command, 2);
     }
 #else
     HTAddParam(&the_command, cur_printer->command, 1, my_temp);
-    HTAddParam(&the_command, cur_printer->command, 2, my_file);
+    HTAddParam(&the_command, cur_printer->command, 2, my_file->str);
     HTEndParam(&the_command, cur_printer->command, 2);
 #endif
 
@@ -951,6 +952,7 @@ static void send_file_to_printer(DocInfo *newdoc,
     start_curses();
 
   done:			/* send_file_to_printer() */
+    BStrFree(my_file);
     return;
 }
 
@@ -959,7 +961,7 @@ static void send_file_to_screen(DocInfo *newdoc,
 				int Lpansi)
 {
     FILE *outfile_fp;
-    char prompt[80];
+    bstring *prompt = NULL;
 
     if (Lpansi) {
 	_statusline(CHECK_PRINTER);
@@ -967,63 +969,64 @@ static void send_file_to_screen(DocInfo *newdoc,
 	_statusline(PRESS_RETURN_TO_BEGIN);
     }
 
-    *prompt = '\0';
-    if (LYGetStr(prompt, VISIBLE, sizeof(prompt), NORECALL) < 0) {
+    BStrCopy0(prompt, "");
+    if (LYgetBString(&prompt, VISIBLE, 0, NORECALL) < 0) {
 	CancelPrint(PRINT_REQUEST_CANCELLED);
-    }
-
-    outfile_fp = stdout;
+    } else {
+	outfile_fp = stdout;
 
-    stop_curses();
-    SetOutputMode(O_TEXT);
+	stop_curses();
+	SetOutputMode(O_TEXT);
 
 #ifndef VMS
-    signal(SIGINT, SIG_IGN);
+	signal(SIGINT, SIG_IGN);
 #endif /* !VMS */
 
-    if (LYPrependBaseToSource && HTisDocumentSource()) {
-	/*
-	 * Added the document's base as a BASE tag to the top of the file.  May
-	 * create technically invalid HTML, but will help get any partial or
-	 * relative URLs resolved properly if no BASE tag is present to replace
-	 * it.  - FM
-	 */
-	fprintf(outfile_fp,
-		"<!-- X-URL: %s -->\n<BASE HREF=\"%s\">\n\n",
-		newdoc->address, content_base);
-    }
-    if (Lpansi)
-	printf("\033[5i");
-    print_wwwfile_to_fd(outfile_fp, FALSE, FALSE);	/* SCREEN */
-    if (keypad_mode)
-	printlist(outfile_fp, FALSE);
+	if (LYPrependBaseToSource && HTisDocumentSource()) {
+	    /*
+	     * Added the document's base as a BASE tag to the top of the file.  May
+	     * create technically invalid HTML, but will help get any partial or
+	     * relative URLs resolved properly if no BASE tag is present to replace
+	     * it.  - FM
+	     */
+	    fprintf(outfile_fp,
+		    "<!-- X-URL: %s -->\n<BASE HREF=\"%s\">\n\n",
+		    newdoc->address, content_base);
+	}
+	if (Lpansi)
+	    printf("\033[5i");
+	print_wwwfile_to_fd(outfile_fp, FALSE, FALSE);	/* SCREEN */
+	if (keypad_mode)
+	    printlist(outfile_fp, FALSE);
 
 #ifdef VMS
-    if (HadVMSInterrupt) {
-	HadVMSInterrupt = FALSE;
-	start_curses();
-	CancelPrint(PRINT_REQUEST_CANCELLED);
-    }
+	if (HadVMSInterrupt) {
+	    HadVMSInterrupt = FALSE;
+	    start_curses();
+	    CancelPrint(PRINT_REQUEST_CANCELLED);
+	}
 #endif /* VMS */
-    if (Lpansi) {
-	printf("\n\014");	/* Form feed */
-	printf("\033[4i");
-	fflush(stdout);		/* refresh to screen */
-    } else {
-	fprintf(stdout, "\n\n%s", PRESS_RETURN_TO_FINISH);
-	fflush(stdout);		/* refresh to screen */
-	(void) LYgetch();	/* grab some user input to pause */
+	if (Lpansi) {
+	    printf("\n\014");	/* Form feed */
+	    printf("\033[4i");
+	    fflush(stdout);	/* refresh to screen */
+	} else {
+	    fprintf(stdout, "\n\n%s", PRESS_RETURN_TO_FINISH);
+	    fflush(stdout);	/* refresh to screen */
+	    (void) LYgetch();	/* grab some user input to pause */
 #ifdef VMS
-	HadVMSInterrupt = FALSE;
+	    HadVMSInterrupt = FALSE;
 #endif /* VMS */
-    }
+	}
 #ifdef SH_EX
-    fprintf(stdout, "\n");
+	fprintf(stdout, "\n");
 #endif
-    SetOutputMode(O_BINARY);
-    start_curses();
+	SetOutputMode(O_BINARY);
+	start_curses();
+    }
 
   done:			/* send_file_to_screen() */
+    BStrFree(prompt);
     return;
 }
 
@@ -1353,9 +1356,9 @@ char *GetFileName(void)
 {
     struct stat stat_info;
 
-    char fbuf[LY_MAXPATH];
-    char tbuf[LY_MAXPATH];
-    char *fn;
+    bstring *fbuf = NULL;
+    bstring *tbuf = NULL;
+    char *result = NULL;
 
     BOOLEAN FirstRecall = TRUE;
     int FnameNum = -1;
@@ -1367,21 +1370,21 @@ char *GetFileName(void)
     /*
      * No initial filename.
      */
-    SetupFilename(fbuf, "");
+    SetupFilename(&fbuf, "");
 
   check_recall:
     /*
      * Go get a filename (it would be nice to do TAB == filename-completion as
      * the name is entered, but we'll save doing that for another time.
      */
-    switch (RecallFilename(fbuf, &FirstRecall, &FnameNum,
+    switch (RecallFilename(&fbuf, &FirstRecall, &FnameNum,
 			   &FnameTotal, GENERIC_FLAG)) {
     case FN_INIT:
 	goto retry;
     case FN_READ:
 	goto check_recall;
     case FN_QUIT:
-	goto quit;
+	goto cleanup;
     default:
 	break;
     }
@@ -1391,29 +1394,30 @@ char *GetFileName(void)
      * subsequent call, etc.
      */
 #ifdef VMS
-    if (0 == strncasecomp(fbuf, "sys$disk:", 9)) {
-	if (0 == StrNCmp((fbuf + 9), "[]", 2)) {
-	    HTAddSugFilename(fbuf + 11);
+    if (0 == strncasecomp(fbuf->str, "sys$disk:", 9)) {
+	if (0 == StrNCmp((fbuf->str + 9), "[]", 2)) {
+	    HTAddSugFilename(fbuf->str + 11);
 	} else {
-	    HTAddSugFilename(fbuf + 9);
+	    HTAddSugFilename(fbuf->str + 9);
 	}
     } else {
-	HTAddSugFilename(fbuf);
+	HTAddSugFilename(fbuf->str);
     }
 #else
-    HTAddSugFilename(fbuf);
+    HTAddSugFilename(fbuf->str);
 #endif /* VMS */
 
     /*
      * Expand tilde's, make filename absolute, etc.
      */
+    BStrCopy0(tbuf, "");
     if (!LYValidateFilename(tbuf, fbuf))
-	goto quit;
+	goto cleanup;
 
     /*
      * Check for file existence; readability.
      */
-    if ((stat(tbuf, &stat_info) < 0) ||
+    if ((stat(tbuf->str, &stat_info) < 0) ||
 	(!(S_ISREG(stat_info.st_mode)
 #ifdef S_IFLNK
 	   || S_ISLNK(stat_info.st_mode)
@@ -1426,7 +1430,7 @@ char *GetFileName(void)
 	goto retry;
     }
 
-    if (!LYCanReadFile(tbuf)) {
+    if (!LYCanReadFile(tbuf->str)) {
 	HTInfoMsg(FILE_NOT_READABLE);
 	_statusline(FILE_NOT_READABLE_RE);
 	FirstRecall = TRUE;
@@ -1438,21 +1442,11 @@ char *GetFileName(void)
      * We have a valid filename, and readable file.  Return it to the caller.
      *
      * The returned pointer should be free()'d by the caller.
-     *
-     * [For some silly reason, if we use StrAllocCopy() here, we get an
-     * "invalid pointer" reported in the Lynx.leaks file (if compiled with
-     * --enable-find-leaks turned on.  Dumb.]
      */
-    if ((fn = typecallocn(char, strlen(tbuf) + 1)) == NULL)
-	  outofmem(__FILE__, "GetFileName");
-
-    assert(fn != NULL);
-
-    return (strcpy(fn, tbuf));
+    StrAllocCopy(result, tbuf->str);
 
-  quit:
-    /*
-     * The user cancelled the input (^G, or CR on empty input field).
-     */
-    return (NULL);
+  cleanup:
+    BStrFree(fbuf);
+    BStrFree(tbuf);
+    return (result);
 }
diff --git a/src/LYSearch.c b/src/LYSearch.c
index b9755733..82c83dda 100644
--- a/src/LYSearch.c
+++ b/src/LYSearch.c
@@ -1,5 +1,5 @@
 /*
- * $LynxId: LYSearch.c,v 1.27 2011/10/07 00:40:58 tom Exp $
+ * $LynxId: LYSearch.c,v 1.29 2012/02/08 15:02:45 tom Exp $
  */
 #include <HTUtils.h>
 #include <HTAlert.h>
@@ -152,13 +152,13 @@ static int check_prev_target_in_links(int *cur,
  * This is the primary USER search engine and is case sensitive or case
  * insensitive depending on the 'LYcase_sensitive' global variable
  */
-BOOL textsearch(DocInfo *cur_doc, char *prev_target,
-		int target_size,
+BOOL textsearch(DocInfo *cur_doc,
+		bstring *prev_target,
 		int direction)
 {
     int offset;
     int oldcur = cur_doc->link;
-    static char prev_target_buffer[512];	/* Search string buffer */
+    static bstring *my_prev_target = NULL;
     static BOOL first = TRUE;
     char *cp;
     int ch = 0;
@@ -171,7 +171,7 @@ BOOL textsearch(DocInfo *cur_doc, char *prev_target,
      * Initialize the search string buffer.  - FM
      */
     if (first) {
-	*prev_target_buffer = '\0';
+	BStrCopy0(my_prev_target, "");
 	first = FALSE;
     }
 
@@ -184,9 +184,9 @@ BOOL textsearch(DocInfo *cur_doc, char *prev_target,
 	 * LYK_NEXT or LYK_PREV was pressed, so copy the buffer into
 	 * prev_target.
 	 */
-	LYStrNCpy(prev_target, prev_target_buffer, target_size);
+	BStrCopy(prev_target, my_prev_target);
 
-    if (strlen(prev_target) == 0) {
+    if (strlen(prev_target->str) == 0) {
 	/*
 	 * This is a new WHEREIS search ('/'), or LYK_NEXT was pressed but
 	 * there was no previous search, so we need to get a search string from
@@ -194,20 +194,20 @@ BOOL textsearch(DocInfo *cur_doc, char *prev_target,
 	 */
 	_statusline(ENTER_WHEREIS_QUERY);
 
-	ch = LYGetStr(prev_target, VISIBLE, (unsigned) target_size, recall);
+	ch = LYgetBString(&prev_target, VISIBLE, 0, recall);
 	if (ch < 0) {
 	    /*
 	     * User cancelled the search via ^G.  Restore prev_target and
 	     * return.  - FM
 	     */
-	    LYStrNCpy(prev_target, prev_target_buffer, target_size);
+	    BStrCopy(prev_target, my_prev_target);
 	    HTInfoMsg(CANCELLED);
 	    return (FALSE);
 	}
     }
 
   check_recall:
-    if (strlen(prev_target) == 0 &&
+    if (strlen(prev_target->str) == 0 &&
 	!(recall && (ch == UPARROW || ch == DNARROW))) {
 	/*
 	 * No entry.  Simply return, retaining the current buffer.  Because
@@ -225,11 +225,11 @@ BOOL textsearch(DocInfo *cur_doc, char *prev_target,
 	     * Use the current string or last query in the list.  - FM
 	     */
 	    FirstRecall = FALSE;
-	    if (*prev_target_buffer) {
+	    if (!isBEmpty(my_prev_target)) {
 		for (QueryNum = (QueryTotal - 1); QueryNum > 0; QueryNum--) {
 		    if ((cp = (char *) HTList_objectAt(search_queries,
 						       QueryNum)) != NULL &&
-			!strcmp(prev_target_buffer, cp)) {
+			!strcmp(my_prev_target->str, cp)) {
 			break;
 		    }
 		}
@@ -249,23 +249,23 @@ BOOL textsearch(DocInfo *cur_doc, char *prev_target,
 	    QueryNum = 0;
 	if ((cp = (char *) HTList_objectAt(search_queries,
 					   QueryNum)) != NULL) {
-	    LYStrNCpy(prev_target, cp, target_size);
-	    if (*prev_target_buffer &&
-		!strcmp(prev_target_buffer, prev_target)) {
+	    BStrCopy0(prev_target, cp);
+	    if (!isBEmpty(my_prev_target) &&
+		!strcmp(my_prev_target->str, prev_target->str)) {
 		_statusline(EDIT_CURRENT_QUERY);
-	    } else if ((*prev_target_buffer && QueryTotal == 2) ||
-		       (!(*prev_target_buffer) && QueryTotal == 1)) {
+	    } else if ((!isBEmpty(my_prev_target) && QueryTotal == 2) ||
+		       (isBEmpty(my_prev_target) && QueryTotal == 1)) {
 		_statusline(EDIT_THE_PREV_QUERY);
 	    } else {
 		_statusline(EDIT_A_PREV_QUERY);
 	    }
-	    ch = LYGetStr(prev_target, VISIBLE, (unsigned) target_size, recall);
+	    ch = LYgetBString(&prev_target, VISIBLE, 0, recall);
 	    if (ch < 0) {
 		/*
 		 * User canceled the search via ^G.  Restore prev_target and
 		 * return.  - FM
 		 */
-		LYStrNCpy(prev_target, prev_target_buffer, target_size);
+		BStrCopy(prev_target, my_prev_target);
 		HTInfoMsg(CANCELLED);
 		return (FALSE);
 	    }
@@ -277,11 +277,11 @@ BOOL textsearch(DocInfo *cur_doc, char *prev_target,
 	     * Use the current string or first query in the list.  - FM
 	     */
 	    FirstRecall = FALSE;
-	    if (*prev_target_buffer) {
+	    if (!isBEmpty(my_prev_target)) {
 		for (QueryNum = 0; QueryNum < (QueryTotal - 1); QueryNum++) {
 		    if ((cp = (char *) HTList_objectAt(search_queries,
 						       QueryNum)) != NULL &&
-			!strcmp(prev_target_buffer, cp)) {
+			!strcmp(my_prev_target->str, cp)) {
 			break;
 		    }
 		}
@@ -301,23 +301,23 @@ BOOL textsearch(DocInfo *cur_doc, char *prev_target,
 	    QueryNum = QueryTotal - 1;
 	if ((cp = (char *) HTList_objectAt(search_queries,
 					   QueryNum)) != NULL) {
-	    LYStrNCpy(prev_target, cp, target_size);
-	    if (*prev_target_buffer &&
-		!strcmp(prev_target_buffer, prev_target)) {
+	    BStrCopy0(prev_target, cp);
+	    if (!isBEmpty(my_prev_target) &&
+		!strcmp(my_prev_target->str, prev_target->str)) {
 		_statusline(EDIT_CURRENT_QUERY);
-	    } else if ((*prev_target_buffer && QueryTotal == 2) ||
-		       (!(*prev_target_buffer) && QueryTotal == 1)) {
+	    } else if ((!isBEmpty(my_prev_target) && QueryTotal == 2) ||
+		       (isBEmpty(my_prev_target) && QueryTotal == 1)) {
 		_statusline(EDIT_THE_PREV_QUERY);
 	    } else {
 		_statusline(EDIT_A_PREV_QUERY);
 	    }
-	    ch = LYGetStr(prev_target, VISIBLE, (unsigned) target_size, recall);
+	    ch = LYgetBString(&prev_target, VISIBLE, 0, recall);
 	    if (ch < 0) {
 		/*
 		 * User cancelled the search via ^G.  Restore prev_target and
 		 * return.  - FM
 		 */
-		LYStrNCpy(prev_target, prev_target_buffer, target_size);
+		BStrCopy(prev_target, my_prev_target);
 		HTInfoMsg(CANCELLED);
 		return (FALSE);
 	    }
@@ -327,16 +327,16 @@ BOOL textsearch(DocInfo *cur_doc, char *prev_target,
     /*
      * Replace the search string buffer with the new target.  - FM
      */
-    LYStrNCpy(prev_target_buffer, prev_target, sizeof(prev_target_buffer) - 1);
-    HTAddSearchQuery(prev_target_buffer);
+    BStrCopy(my_prev_target, prev_target);
+    HTAddSearchQuery(my_prev_target->str);
 
     if (direction < 0) {
 	offset = 0;
-	if (check_prev_target_in_links(&cur_doc->link, prev_target)) {
+	if (check_prev_target_in_links(&cur_doc->link, prev_target->str)) {
 	    /*
 	     * Found in link, changed cur, we're done.
 	     */
-	    LYhighlight(FALSE, oldcur, prev_target);
+	    LYhighlight(FALSE, oldcur, prev_target->str);
 	    return (TRUE);
 	}
     } else {
@@ -345,11 +345,11 @@ BOOL textsearch(DocInfo *cur_doc, char *prev_target,
 	 * Search the links on the currently displayed page for the string,
 	 * starting after the current link.  - FM
 	 */
-	if (check_next_target_in_links(&cur_doc->link, prev_target)) {
+	if (check_next_target_in_links(&cur_doc->link, prev_target->str)) {
 	    /*
 	     * Found in link, changed cur, we're done.
 	     */
-	    LYhighlight(FALSE, oldcur, prev_target);
+	    LYhighlight(FALSE, oldcur, prev_target->str);
 	    return (TRUE);
 	}
 
@@ -367,9 +367,9 @@ BOOL textsearch(DocInfo *cur_doc, char *prev_target,
      * Resume search, this time for all text.  Set www_search_result if string
      * found, and position the hit near top of screen.
      */
-    www_user_search((cur_doc->line + offset), cur_doc, prev_target, direction);
+    www_user_search((cur_doc->line + offset), cur_doc, prev_target->str, direction);
     if (cur_doc->link != oldcur) {
-	LYhighlight(FALSE, oldcur, prev_target);
+	LYhighlight(FALSE, oldcur, prev_target->str);
 	return (TRUE);
     }
     return (BOOL) (www_search_result > 0);
diff --git a/src/LYSearch.h b/src/LYSearch.h
index f9763301..798809a5 100644
--- a/src/LYSearch.h
+++ b/src/LYSearch.h
@@ -9,8 +9,7 @@
 extern "C" {
 #endif
     extern BOOL textsearch(DocInfo *cur_doc,
-			   char *prev_target,
-			   int target_size,
+			   bstring *prev_target,
 			   int direction);
 
 #define IN_FILE 1
diff --git a/src/LYStrings.c b/src/LYStrings.c
index 88c20443..2d25c424 100644
--- a/src/LYStrings.c
+++ b/src/LYStrings.c
@@ -1,4 +1,4 @@
-/* $LynxId: LYStrings.c,v 1.198 2012/02/08 01:22:55 tom Exp $ */
+/* $LynxId: LYStrings.c,v 1.200 2012/02/08 15:51:01 tom Exp $ */
 #include <HTUtils.h>
 #include <HTCJK.h>
 #include <UCAux.h>
@@ -3580,60 +3580,62 @@ int get_popup_number(const char *msg,
 		     int *c,
 		     int *rel)
 {
-    char temp[120];
-    char *p = temp;
-    int num;
+    bstring *temp = NULL;
+    int result = 0;
 
     /*
      * Load the c argument into the prompt buffer.
      */
-    temp[0] = (char) *c;
-    temp[1] = '\0';
+    BStrCopy0(temp, "?");
+    temp->str[0] = (char) *c;
+
     _statusline(msg);
 
     /*
      * Get the number, possibly with a suffix, from the user.
      */
-    if (LYGetStr(temp, VISIBLE, sizeof(temp), NORECALL) < 0 || *temp == 0) {
+    if (LYgetBString(&temp, VISIBLE, 0, NORECALL) < 0 || isBEmpty(temp)) {
 	HTInfoMsg(CANCELLED);
 	*c = '\0';
 	*rel = '\0';
-	return (0);
-    }
+    } else {
+	char *p = temp->str;
 
-    *rel = '\0';
-    num = atoi(p);
-    while (isdigit(UCH(*p)))
-	++p;
-    switch (*p) {
-    case '+':
-    case '-':
-	/* 123+ or 123- */
-	*rel = *p++;
-	*c = *p;
-	break;
-    default:
-	*c = *p++;
-	*rel = *p;
-	break;
-    case 0:
-	break;
-    }
+	*rel = '\0';
+	result = atoi(p);
+	while (isdigit(UCH(*p)))
+	    ++p;
+	switch (*p) {
+	case '+':
+	case '-':
+	    /* 123+ or 123- */
+	    *rel = *p++;
+	    *c = *p;
+	    break;
+	default:
+	    *c = *p++;
+	    *rel = *p;
+	    break;
+	case 0:
+	    break;
+	}
 
-    /*
-     * If we had a 'g' or 'p' suffix, load it into c.  Otherwise, zero c.  Then
-     * return the number.
-     */
-    if (*p == 'g' || *p == 'G') {
-	*c = 'g';
-    } else if (*p == 'p' || *p == 'P') {
-	*c = 'p';
-    } else {
-	*c = '\0';
+	/*
+	 * If we had a 'g' or 'p' suffix, load it into c.  Otherwise, zero c.  Then
+	 * return the number.
+	 */
+	if (*p == 'g' || *p == 'G') {
+	    *c = 'g';
+	} else if (*p == 'p' || *p == 'P') {
+	    *c = 'p';
+	} else {
+	    *c = '\0';
+	}
+	if (*rel != '+' && *rel != '-')
+	    *rel = 0;
     }
-    if (*rel != '+' && *rel != '-')
-	*rel = 0;
-    return num;
+    BStrFree(temp);
+    return result;
 }
 
 #ifdef USE_COLOR_STYLE
@@ -4149,8 +4151,8 @@ int LYhandlePopupList(int cur_choice,
     char Cnum[64];
     int Lnum;
     int npages;
-    static char prev_target[MAX_LINE];	/* Search string buffer */
-    static char prev_target_buffer[MAX_LINE];	/* Next search buffer */
+    static bstring *prev_target = NULL;		/* Search string buffer */
+    static bstring *next_target = NULL;		/* Next search buffer */
     static BOOL first = TRUE;
     char *cp;
     int ch = 0;
@@ -4177,10 +4179,10 @@ int LYhandlePopupList(int cur_choice,
      * Initialize the search string buffer. - FM
      */
     if (first) {
-	*prev_target_buffer = '\0';
+	BStrCopy0(next_target, "");
 	first = FALSE;
     }
-    *prev_target = '\0';
+    BStrCopy0(prev_target, "");
     QueryTotal = (search_queries ? HTList_count(search_queries) : 0);
     recall = ((QueryTotal >= 1) ? RECALL_URL : NORECALL);
     QueryNum = QueryTotal;
@@ -4789,7 +4791,7 @@ int LYhandlePopupList(int cur_choice,
 	    break;
 
 	case LYK_NEXT:
-	    if (recall && *prev_target_buffer == '\0') {
+	    if (recall && isBEmpty(next_target)) {
 		/*
 		 * We got a 'n'ext command with no prior query specified within
 		 * the popup window.  See if one was entered when the popup was
@@ -4803,21 +4805,17 @@ int LYhandlePopupList(int cur_choice,
 		 */
 		if ((cp = (char *) HTList_objectAt(search_queries,
 						   0)) != NULL) {
-		    LYStrNCpy(prev_target_buffer,
-			      cp,
-			      sizeof(prev_target_buffer) - 1);
+		    BStrCopy0(next_target, cp);
 		    QueryNum = 0;
 		    FirstRecall = FALSE;
 		}
 	    }
-	    strcpy(prev_target, prev_target_buffer);
+	    BStrCopy(prev_target, next_target);
 	    /* FALLTHRU */
 	case LYK_WHEREIS:
-	    if (*prev_target == '\0') {
+	    if (isBEmpty(prev_target)) {
 		_statusline(ENTER_WHEREIS_QUERY);
-		if ((ch = LYGetStr(prev_target, VISIBLE,
-				   sizeof(prev_target_buffer),
-				   recall)) < 0) {
+		if ((ch = LYgetBString(&prev_target, VISIBLE, 0, recall)) < 0) {
 		    /*
 		     * User cancelled the search via ^G.  - FM
 		     */
@@ -4827,7 +4825,7 @@ int LYhandlePopupList(int cur_choice,
 	    }
 
 	  check_recall:
-	    if (*prev_target == '\0' &&
+	    if (isBEmpty(prev_target) &&
 		!(recall && (ch == UPARROW || ch == DNARROW))) {
 		/*
 		 * No entry.  Simply break.  - FM
@@ -4842,13 +4840,13 @@ int LYhandlePopupList(int cur_choice,
 		     * Use the current string or last query in the list.  - FM
 		     */
 		    FirstRecall = FALSE;
-		    if (*prev_target_buffer) {
+		    if (!isBEmpty(next_target)) {
 			for (QueryNum = (QueryTotal - 1);
 			     QueryNum > 0; QueryNum--) {
 			    if ((cp = (char *) HTList_objectAt(search_queries,
 							       QueryNum))
 				!= NULL &&
-				!strcmp(prev_target_buffer, cp)) {
+				!strcmp(next_target->str, cp)) {
 				break;
 			    }
 			}
@@ -4869,19 +4867,18 @@ int LYhandlePopupList(int cur_choice,
 		}
 		if ((cp = (char *) HTList_objectAt(search_queries,
 						   QueryNum)) != NULL) {
-		    LYStrNCpy(prev_target, cp, sizeof(prev_target) - 1);
-		    if (*prev_target_buffer &&
-			!strcmp(prev_target_buffer, prev_target)) {
+		    BStrCopy0(prev_target, cp);
+		    if (!isBEmpty(next_target) &&
+			!strcmp(next_target->str, prev_target->str)) {
 			_statusline(EDIT_CURRENT_QUERY);
-		    } else if ((*prev_target_buffer && QueryTotal == 2) ||
-			       (!(*prev_target_buffer) &&
-				QueryTotal == 1)) {
+		    } else if ((!isBEmpty(next_target) && QueryTotal == 2) ||
+			       (isBEmpty(next_target) && QueryTotal == 1)) {
 			_statusline(EDIT_THE_PREV_QUERY);
 		    } else {
 			_statusline(EDIT_A_PREV_QUERY);
 		    }
-		    if ((ch = LYGetStr(prev_target, VISIBLE,
-				       sizeof(prev_target_buffer), recall)) < 0) {
+		    if ((ch = LYgetBString(&prev_target,
+					   VISIBLE, 0, recall)) < 0) {
 			/*
 			 * User cancelled the search via ^G.  - FM
 			 */
@@ -4896,13 +4893,13 @@ int LYhandlePopupList(int cur_choice,
 		     * Use the current string or first query in the list.  - FM
 		     */
 		    FirstRecall = FALSE;
-		    if (*prev_target_buffer) {
+		    if (!isBEmpty(next_target)) {
 			for (QueryNum = 0;
 			     QueryNum < (QueryTotal - 1); QueryNum++) {
 			    if ((cp = (char *) HTList_objectAt(search_queries,
 							       QueryNum))
 				!= NULL &&
-				!strcmp(prev_target_buffer, cp)) {
+				!strcmp(next_target->str, cp)) {
 				break;
 			    }
 			}
@@ -4923,21 +4920,18 @@ int LYhandlePopupList(int cur_choice,
 		}
 		if ((cp = (char *) HTList_objectAt(search_queries,
 						   QueryNum)) != NULL) {
-		    LYStrNCpy(prev_target, cp, sizeof(prev_target) - 1);
-		    if (*prev_target_buffer &&
-			!strcmp(prev_target_buffer, prev_target)) {
+		    BStrCopy0(prev_target, cp);
+		    if (isBEmpty(next_target) &&
+			!strcmp(next_target->str, prev_target->str)) {
 			_statusline(EDIT_CURRENT_QUERY);
-		    } else if ((*prev_target_buffer &&
-				QueryTotal == 2) ||
-			       (!(*prev_target_buffer) &&
-				QueryTotal == 1)) {
+		    } else if ((!isBEmpty(next_target) && QueryTotal == 2) ||
+			       (isBEmpty(next_target) && QueryTotal == 1)) {
 			_statusline(EDIT_THE_PREV_QUERY);
 		    } else {
 			_statusline(EDIT_A_PREV_QUERY);
 		    }
-		    if ((ch = LYGetStr(prev_target, VISIBLE,
-				       sizeof(prev_target_buffer),
-				       recall)) < 0) {
+		    if ((ch = LYgetBString(&prev_target,
+					   VISIBLE, 0, recall)) < 0) {
 			/*
 			 * User cancelled the search via ^G. - FM
 			 */
@@ -4950,8 +4944,8 @@ int LYhandlePopupList(int cur_choice,
 	    /*
 	     * Replace the search string buffer with the new target.  - FM
 	     */
-	    strcpy(prev_target_buffer, prev_target);
-	    HTAddSearchQuery(prev_target_buffer);
+	    BStrCopy(next_target, prev_target);
+	    HTAddSearchQuery(next_target->str);
 
 	    /*
 	     * Start search at the next choice.  - FM
@@ -4959,10 +4953,10 @@ int LYhandlePopupList(int cur_choice,
 	    for (j = 1; Cptr[i + j] != NULL; j++) {
 		FormatChoiceNum(buffer, max_choices, (i + j), Cptr[i + j]);
 		if (LYcase_sensitive) {
-		    if (strstr(buffer, prev_target_buffer) != NULL)
+		    if (strstr(buffer, next_target->str) != NULL)
 			break;
 		} else {
-		    if (LYstrstr(buffer, prev_target_buffer) != NULL)
+		    if (LYstrstr(buffer, next_target->str) != NULL)
 			break;
 		}
 	    }
@@ -4987,7 +4981,7 @@ int LYhandlePopupList(int cur_choice,
 	     * If we started at the beginning, it can't be present.  - FM
 	     */
 	    if (cur_choice == 0) {
-		HTUserMsg2(STRING_NOT_FOUND, prev_target_buffer);
+		HTUserMsg2(STRING_NOT_FOUND, next_target->str);
 		goto restore_popup_statusline;
 	    }
 
@@ -4997,10 +4991,10 @@ int LYhandlePopupList(int cur_choice,
 	    for (j = 0; j < cur_choice; j++) {
 		FormatChoiceNum(buffer, max_choices, (j + 1), Cptr[j]);
 		if (LYcase_sensitive) {
-		    if (strstr(buffer, prev_target_buffer) != NULL)
+		    if (strstr(buffer, next_target->str) != NULL)
 			break;
 		} else {
-		    if (LYstrstr(buffer, prev_target_buffer) != NULL)
+		    if (LYstrstr(buffer, next_target->str) != NULL)
 			break;
 		}
 	    }
@@ -5025,7 +5019,7 @@ int LYhandlePopupList(int cur_choice,
 	    /*
 	     * Didn't find it in the preceding choices either.  - FM
 	     */
-	    HTUserMsg2(STRING_NOT_FOUND, prev_target_buffer);
+	    HTUserMsg2(STRING_NOT_FOUND, next_target->str);
 
 	  restore_popup_statusline:
 	    /*
@@ -5033,7 +5027,7 @@ int LYhandlePopupList(int cur_choice,
 	     * FM
 	     */
 	    _statusline(popup_status_msg);
-	    *prev_target = '\0';
+	    BStrCopy0(prev_target, "");
 	    QueryTotal = (search_queries ? HTList_count(search_queries)
 			  : 0);
 	    recall = ((QueryTotal >= 1) ? RECALL_URL : NORECALL);
diff --git a/src/LYUtils.c b/src/LYUtils.c
index 38eb897e..201e3d7d 100644
--- a/src/LYUtils.c
+++ b/src/LYUtils.c
@@ -1,5 +1,5 @@
 /*
- * $LynxId: LYUtils.c,v 1.214 2011/10/07 00:40:40 tom Exp $
+ * $LynxId: LYUtils.c,v 1.215 2012/02/08 22:31:58 tom Exp $
  */
 #include <HTUtils.h>
 #include <HTTCP.h>
@@ -6630,11 +6630,9 @@ const char *wwwName(const char *pathname)
  * Given a user-specified filename, e.g., for download or print, validate and
  * expand it.  Expand home-directory expressions in the given string.  Only
  * allow pipes if the user can spawn shell commands.
- *
- * Both strings are fixed buffer sizes, LY_MAXPATH.
  */
-BOOLEAN LYValidateFilename(char *result,
-			   char *given)
+BOOLEAN LYValidateFilename(bstring *result,
+			   bstring *given)
 {
     BOOLEAN code = TRUE;
     char *cp = NULL;
@@ -6644,52 +6642,56 @@ BOOLEAN LYValidateFilename(char *result,
      * Cancel if the user entered "/dev/null" on Unix, or an "nl:" path on VMS. 
      * - FM
      */
-    if (LYIsNullDevice(given)) {
+    if (LYIsNullDevice(given->str)) {
 	/* just ignore it */
 	code = FALSE;
 #ifdef HAVE_POPEN
-    } else if (LYIsPipeCommand(given)) {
+    } else if (LYIsPipeCommand(given->str)) {
 	if (no_shell) {
 	    HTUserMsg(SPAWNING_DISABLED);
 	    code = FALSE;
 	} else {
-	    LYStrNCpy(result, given, LY_MAXPATH);
+	    BStrCopy(result, given);
 	}
 #endif
     } else {
-	if ((cp = FindLeadingTilde(given, TRUE)) != 0
-	    && (cp2 = wwwName(Home_Dir())) != 0
-	    && strlen(cp2) + strlen(given) < LY_MAXPATH) {
+	if ((cp = FindLeadingTilde(given->str, TRUE)) != 0
+	    && (cp2 = wwwName(Home_Dir())) != 0) {
 	    if (LYIsTilde(cp[0]) && LYIsPathSep(cp[1])) {
-		*(cp++) = '\0';
-		strcpy(result, given);
-		LYTrimPathSep(result);
-		strcat(result, cp2);
-		strcat(result, cp);
-		strcpy(given, result);
+		char *cp1 = NULL;
+
+		*cp++ = '\0';
+		StrAllocCopy(cp1, cp);
+
+		BStrCopy(result, given);
+		LYTrimPathSep(result->str);
+		BStrCat0(result, cp2);
+		BStrCat0(result, cp1);
+		BStrCopy(given, result);
+
+		FREE(cp1);
 	    }
 	}
 #ifdef VMS
-	if (strchr(given, '/') != NULL) {
-	    strcpy(result, HTVMS_name("", given));
-	    strcpy(given, result);
-	}
-	if (given[0] != '/'
-	    && strchr(given, ':') == NULL
-	    && strlen(given) < LY_MAXPATH - 13) {
-	    strcpy(result, "sys$disk:");
-	    if (strchr(given, ']') == NULL)
-		strcat(result, "[]");
-	    strcat(result, given);
+	if (strchr(given->str, '/') != NULL) {
+	    BStrCopy0(result, HTVMS_name("", given->str));
+	    BStrCopy(given, result);
+	}
+	if (given->str[0] != '/'
+	    && strchr(given->str, ':') == NULL) {
+	    BStrCopy0(result, "sys$disk:");
+	    if (strchr(given->str, ']') == NULL)
+		BStrCat0(result, "[]");
+	    BStrCat(result, given);
 	} else {
-	    strcpy(result, given);
+	    BStrCopy(result, given);
 	}
 #else
 
 #ifndef __EMX__
-	if (!LYisAbsPath(given)) {
+	if (!LYisAbsPath(given->str)) {
 #if defined(__DJGPP__) || defined(_WINDOWS)
-	    if (strchr(result, ':') != NULL)
+	    if (strchr(result->str, ':') != NULL)
 		cp = NULL;
 	    else
 #endif /*  __DJGPP__ || _WINDOWS */
@@ -6706,22 +6708,16 @@ BOOLEAN LYValidateFilename(char *result,
 #endif /* __EMX__ */
 	    cp = NULL;
 
-	*result = 0;
 	if (cp) {
 	    LYTrimPathSep(cp);
-	    if (strlen(cp) >= LY_MAXPATH - 2) {
-		code = FALSE;
-	    } else {
-		sprintf(result, "%s/", cp);
-	    }
+	    BStrCopy0(result, cp);
+	    BStrCat0(result, "/");
+	} else {
+	    BStrCopy0(result, "");
 	}
 	if (code) {
-	    cp = HTSYS_name(given);
-	    if (strlen(result) + strlen(cp) >= LY_MAXPATH - 1) {
-		code = FALSE;
-	    } else {
-		strcat(result, cp);
-	    }
+	    cp = HTSYS_name(given->str);
+	    BStrCat0(result, cp);
 	}
 #endif /* VMS */
     }
diff --git a/src/LYUtils.h b/src/LYUtils.h
index 343410a6..397a76c9 100644
--- a/src/LYUtils.h
+++ b/src/LYUtils.h
@@ -1,4 +1,4 @@
-/* $LynxId: LYUtils.h,v 1.89 2011/10/07 00:36:40 tom Exp $ */
+/* $LynxId: LYUtils.h,v 1.90 2012/02/08 22:12:09 tom Exp $ */
 #ifndef LYUTILS_H
 #define LYUTILS_H
 
@@ -117,7 +117,7 @@ extern "C" {
 				      char *prefix_list, char *suffix_list);
     extern BOOLEAN LYFixCursesOnForAccess(const char *addr, const char *physical);
     extern BOOLEAN LYPathOffHomeOK(char *fbuffer, size_t fbuffer_size);
-    extern BOOLEAN LYValidateFilename(char *result, char *given);
+    extern BOOLEAN LYValidateFilename(bstring *result, bstring *given);
     extern BOOLEAN LYisAbsPath(const char *path);
     extern BOOLEAN LYisLocalAlias(const char *filename);
     extern BOOLEAN LYisLocalFile(const char *filename);