diff options
-rw-r--r-- | CHANGES | 14 | ||||
-rw-r--r-- | lynx.hlp | 381 | ||||
-rw-r--r-- | src/GridText.c | 238 | ||||
-rw-r--r-- | src/LYDownload.c | 100 | ||||
-rw-r--r-- | src/LYForms.c | 4 | ||||
-rw-r--r-- | src/LYGetFile.c | 149 | ||||
-rw-r--r-- | src/LYJump.c | 57 | ||||
-rw-r--r-- | src/LYLocal.c | 241 | ||||
-rw-r--r-- | src/LYMainLoop.c | 245 | ||||
-rw-r--r-- | src/LYOptions.c | 6 | ||||
-rw-r--r-- | src/LYPrint.c | 268 | ||||
-rw-r--r-- | src/LYSearch.c | 72 | ||||
-rw-r--r-- | src/LYSearch.h | 3 | ||||
-rw-r--r-- | src/LYStrings.c | 164 | ||||
-rw-r--r-- | src/LYUtils.c | 82 | ||||
-rw-r--r-- | src/LYUtils.h | 4 |
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); |