* [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m.
@ 2016-11-03 22:08 Kei Kebreau
0 siblings, 0 replies; 12+ messages in thread
From: Kei Kebreau @ 2016-11-03 22:08 UTC (permalink / raw
To: guix-devel
[-- Attachment #1.1: Type: text/plain, Size: 227 bytes --]
While SourceForge's w3m is apparently unmaintained, Debian's fork is
not. This update takes that into account. It also makes us invulnerable
to some unfriendly bugs. See http://www.openwall.com/lists/oss-security/2016/11/03/3.
[-- Attachment #1.2: 0001-gnu-w3m-Switch-to-Debian-s-actively-maintained-fork-.patch --]
[-- Type: text/plain, Size: 825933 bytes --]
From b837111e3ddf406a3b9235538f63af678e3ac741 Mon Sep 17 00:00:00 2001
From: Kei Kebreau <kei@openmailbox.org>
Date: Thu, 3 Nov 2016 17:58:48 -0400
Subject: [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m.
Fixes some security issues seen here:
<http://www.openwall.com/lists/oss-security/2016/11/03/3>
* gnu/packages/patches/w3m-upstream-20120522.patch: New file.
* gnu/packages/patches/w3m-debian-updates.patch: New file.
* gnu/packages/w3m.scm (w3m): Switch to Debian's actively maintained
fork of w3m.
[source]: Use Debian's tarball and patches. Remove obsolete patches.
[arguments]: Remove unnecessary modification of %standard-phases.
* gnu/local.mk (dist_patch_DATA): Register new patches. Remove obsolete
patches.
---
gnu/local.mk | 6 +-
gnu/packages/patches/w3m-debian-updates.patch | 28498 +++++++++++++++++++
.../patches/w3m-disable-sslv2-and-sslv3.patch | 24 -
.../patches/w3m-disable-weak-ciphers.patch | 24 -
.../patches/w3m-force-ssl_verify_server-on.patch | 24 -
gnu/packages/patches/w3m-libgc.patch | 28 -
gnu/packages/patches/w3m-upstream-20120522.patch | 157 +
gnu/packages/w3m.scm | 37 +-
8 files changed, 28668 insertions(+), 130 deletions(-)
create mode 100644 gnu/packages/patches/w3m-debian-updates.patch
delete mode 100644 gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch
delete mode 100644 gnu/packages/patches/w3m-disable-weak-ciphers.patch
delete mode 100644 gnu/packages/patches/w3m-force-ssl_verify_server-on.patch
delete mode 100644 gnu/packages/patches/w3m-libgc.patch
create mode 100644 gnu/packages/patches/w3m-upstream-20120522.patch
diff --git a/gnu/local.mk b/gnu/local.mk
index a23d536..eb4778f 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -891,10 +891,8 @@ dist_patch_DATA = \
%D%/packages/patches/vte-CVE-2012-2738-pt1.patch \
%D%/packages/patches/vte-CVE-2012-2738-pt2.patch \
%D%/packages/patches/vtk-mesa-10.patch \
- %D%/packages/patches/w3m-libgc.patch \
- %D%/packages/patches/w3m-force-ssl_verify_server-on.patch \
- %D%/packages/patches/w3m-disable-sslv2-and-sslv3.patch \
- %D%/packages/patches/w3m-disable-weak-ciphers.patch \
+ %D%/packages/patches/w3m-upstream-20120522.patch \
+ %D%/packages/patches/w3m-debian-updates.patch \
%D%/packages/patches/weechat-python.patch \
%D%/packages/patches/weex-vacopy.patch \
%D%/packages/patches/wicd-bitrate-none-fix.patch \
diff --git a/gnu/packages/patches/w3m-debian-updates.patch b/gnu/packages/patches/w3m-debian-updates.patch
new file mode 100644
index 0000000..3bef2fa
--- /dev/null
+++ b/gnu/packages/patches/w3m-debian-updates.patch
@@ -0,0 +1,28498 @@
+Description: Git master branch of Debian's w3m
+Origin: https://anonscm.debian.org/cgit/collab-maint/w3m.git
+
+diff --git a/Bonus/goodict.cgi b/Bonus/goodict.cgi
+index 8f443c1..5fb6581 100755
+--- a/Bonus/goodict.cgi
++++ b/Bonus/goodict.cgi
+@@ -1,14 +1,20 @@
+ #!/usr/bin/perl
+
+ # ~/.w3m/urimethodmap
+-# e: file:/cgi-bin/goodict.cgi?%s
+-# w: file:/cgi-bin/goodict.cgi?%s
+-# j: file:/cgi-bin/goodict.cgi?%s
++# e: file:/cgi-bin/goodict.cgi?%s Englich-Japanese
++# w: file:/cgi-bin/goodict.cgi?%s Japanese-English
++# j: file:/cgi-bin/goodict.cgi?%s Japanese
++# a: file:/cgi-bin/goodict.cgi?%s All
++#
++# e:0:word start with word
++# e:1:word perfect match
++# e:2:word end with word
++# e:3:word search body text
++# e:6:word search title
++# e:word perfect match
+
+-use NKF;
+-#$mode = 0; # substring
+-$mode = 1; # perfect match
+-#$mode = 3; # search body text
++use Encode;
++use Encode::Guess qw/euc-jp utf8/;
+ $url = "http://dictionary.goo.ne.jp";
+ $_ = $ENV{"QUERY_STRING"};
+ if (/^e:/) {
+@@ -17,14 +23,22 @@ if (/^e:/) {
+ $kind = 'je';
+ } elsif (/^j:/) {
+ $kind = 'jn';
++} elsif (/^a:/) {
++ $kind = 'all'
++}
++s@^[ewja]:@@ && s@^//@@ && s@/$@@;
++if (/^([01236]):/) {
++ $mode=$1;
++ s/^[01236]://;
++}else{
++ $mode="1";
+ }
+-s@^[ewjs]:@@ && s@^//@@ && s@/$@@;
+ if ($_) {
+ s/\+/ /g;
+ s/%([\da-f][\da-f])/pack('C', hex($1))/egi;
+- $_ = nkf("-e", $_);
++ $_ = encode("utf8", decode("Guess", $_));
+ s/[\000-\040\+:#?&%<>"\177-\377]/sprintf('%%%02X', unpack('C', $&))/eg;
+- $url .= "/search.php?MT=$_&kind=$kind&mode=$mode";
++ $url .= "/srch/$kind/$_/m$mode"."u/";
+ } else {
+ $input = "w3m-control: GOTO_LINK";
+ }
+diff --git a/ChangeLog b/ChangeLog
+index 88358ef..f9cc112 100644
+--- a/ChangeLog
++++ b/ChangeLog
+@@ -1,3 +1,1198 @@
++2016-10-31 Tatsuya Kinoshita <tats@debian.org>
++
++ * table.c, table.h, textlist.h:
++ Revert "Treat table height as int instead of short".
++ This reverts commit 0c9aebb26a16ad3acc69b2e87ffd216d43879cb6.
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=842623
++
++2016-10-30 Tatsuya Kinoshita <tats@debian.org>
++
++ * NEWS: Update NEWS.
++
++ * fm.h: Set use_dictcommand to 1 by default.
++
++ * scripts/Makefile.in: Add w3mdict.cgi to LIB_TARGETS.
++
++ * config.h.dist: Typo fix for USE_DICT.
++
++2016-10-30 Boruch Baum <boruch-baum@gmx.com>
++
++ * scripts/w3mdict.cgi: Add w3mdict.cgi to use a dictd dictionary query.
++ Bug-Debian: https://github.com/tats/w3m/issues/30
++
++2016-10-09 Tatsuya Kinoshita <tats@debian.org>
++
++ * form.c:
++ Fix incorrect dereference in formUpdateBuffer when MENU_SELECT.
++ cf. https://github.com/tats/w3m/commit/ec9eb22e008a69ea9dc21fdca4b9b836679965ee
++
++2016-10-08 Tatsuya Kinoshita <tats@debian.org>
++
++ * table.c, table.h, textlist.h:
++ Treat table height as int instead of short.
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=838952
++
++ * form.c: Prevent global-buffer-overflow write in formUpdateBuffer.
++ Bug-Debian: https://github.com/tats/w3m/issues/29
++
++ * form.c: Fix null pointer dereference in formUpdateBuffer.
++ Bug-Debian: https://github.com/tats/w3m/issues/28
++
++2016-08-30 Kuang-che Wu <kcwu@google.com>
++
++ * Str.c: Fix potential heap buffer corruption due to Strgrow.
++ Origin: https://github.com/tats/w3m/pull/27
++
++2016-08-29 Tatsuya Kinoshita <tats@debian.org>
++
++ * anchor.c:
++ Prevent segfault due to buffer overflows in addMultirowsForm.
++ Bug-Debian: https://github.com/tats/w3m/issues/21
++ Bug-Debian: https://github.com/tats/w3m/issues/26
++
++ * form.c: Prevent segfault for formUpdateBuffer.
++ Bug-Debian: https://github.com/tats/w3m/issues/13#issuecomment-242981906
++
++2016-08-24 Tatsuya Kinoshita <tats@debian.org>
++
++ * table.c: Prevent segfault with malformed table_alt.
++ Bug-Debian: https://github.com/tats/w3m/issues/24
++
++ * form.c: Prevent segfault for formUpdateBuffer.
++ Bug-Debian: https://github.com/tats/w3m/issues/22
++
++ * table.c: Truncate max_width for renderTable.
++ Bug-Debian: https://github.com/tats/w3m/issues/25
++
++2016-08-20 Tatsuya Kinoshita <tats@debian.org>
++
++ * file.c, parsetagx.c: Fix uninitialised values for <i> and <dd>.
++ Bug-Debian: https://github.com/tats/w3m/issues/16
++
++ * file.c, parsetagx.c:
++ Revert "Fix uninitialised values for <i> and <dd>".
++ This reverts commit 0fba2f1a6eb6861206ad120a02af2643938082cd.
++ cf. https://github.com/tats/w3m/commit/0fba2f1a6eb6861206ad120a02af2643938082cd#commitcomment-18703355
++
++2016-08-19 Tatsuya Kinoshita <tats@debian.org>
++
++ * file.c, parsetagx.c: Fix uninitialised values for <i> and <dd>.
++ Bug-Debian: https://github.com/tats/w3m/issues/16
++
++2016-08-18 Kuang-che Wu <kcwu@google.com>
++
++ * table.c: Fix table rowspan and colspan.
++ Origin: https://github.com/tats/w3m/pull/19
++ Bug-Debian: https://github.com/tats/w3m/issues/8
++
++2016-08-18 Tatsuya Kinoshita <tats@debian.org>
++
++ * file.c: Prevent segfault with malformed input_alt.
++ Bug-Debian: https://github.com/tats/w3m/issues/18
++
++ * file.c: Prevent segfault with incorrect button type.
++ Bug-Debian: https://github.com/tats/w3m/issues/17
++
++2016-08-17 Tatsuya Kinoshita <tats@debian.org>
++
++ * file.c: Prevent segfault with incorrect form_int fid.
++ Bug-Debian: https://github.com/tats/w3m/issues/15
++
++ * libwc/iso2022.c: Prevent segfault when iso2022 parsing.
++ Bug-Debian: https://github.com/tats/w3m/issues/14
++
++ * form.c: Prevent segfault for formUpdateBuffer.
++ Bug-Debian: https://github.com/tats/w3m/issues/13
++
++ * file.c, form.c:
++ Prevent negative array index for selectnumber and textareanumber.
++ Bug-Debian: https://github.com/tats/w3m/issues/12
++
++2016-08-16 Tatsuya Kinoshita <tats@debian.org>
++
++ * file.c: Truncate large values of table attributes.
++ Bug-Debian: https://github.com/tats/w3m/issues/11
++
++2016-08-15 Tatsuya Kinoshita <tats@debian.org>
++
++ * form.c: Prevent segfault for formUpdateBuffer.
++ Bug-Debian: https://github.com/tats/w3m/issues/9
++ Bug-Debian: https://github.com/tats/w3m/issues/10
++
++2016-08-09 Tatsuya Kinoshita <tats@debian.org>
++
++ * file.c: Prevent segfault with malformed input type.
++ Bug-Debian: https://github.com/tats/w3m/issues/7
++
++2016-08-08 Tatsuya Kinoshita <tats@debian.org>
++
++ * Makefile.in, configure, configure.ac, scripts/w3mman/Makefile.in:
++ Install German manpages.
++
++2016-08-08 Markus Hiereth <post@hiereth.de>
++
++ * doc-de/MANUAL.html, doc/MANUAL.html:
++ Update MANUAL.html in English and German.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=772341#90
++
++ * doc-de/FAQ.html, doc/FAQ.html: Update FAQ.html in English and German.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=772341#85
++
++ * scripts/w3mman/w3mman.1.in, scripts/w3mman/w3mman.de.1.in:
++ Update manpage for w3mman in English and German.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=772341#80
++
++ * doc-de/w3m.1, doc/w3m.1:
++ Update manpage for w3m in English and German.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=772341#75
++
++2016-07-18 Tatsuya Kinoshita <tats@debian.org>
++
++ * NEWS: Update NEWS.
++
++ * fm.h: Set default_url to 1 by default.
++
++2016-06-20 Tatsuya Kinoshita <tats@debian.org>
++
++ * doc-de/README.func, scripts/w3mhelp-funcdesc.de.pl.in:
++ Trim trailing spaces.
++
++2016-06-20 Markus Hiereth <post@hiereth.de>
++
++ * doc-de/README.func, scripts/w3mhelp-funcdesc.de.pl.in:
++ Update German help messages.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=765682#47
++
++2016-06-19 Tatsuya Kinoshita <tats@debian.org>
++
++ * doc-de/README.func, scripts/w3mhelp-funcdesc.de.pl.in:
++ Convert German help messages to UTF-8.
++
++ * main.c: Update description of SOURCE and VIEW.
++
++2016-06-19 Markus Hiereth <post@hiereth.de>
++
++ * doc-de/README.func, doc/README.func:
++ Update description of SOURCE and VIEW.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=765682#37
++
++2016-06-19 Tatsuya Kinoshita <tats@debian.org>
++
++ * NEWS: Update NEWS.
++
++ * doc-de/README.func: Update German messages.
++
++ * doc/README.func, main.c, menu.c: Update English messages.
++
++ * doc-jp/README.func, scripts/w3mhelp-funcdesc.ja.pl.in:
++ Update Japanese help messages.
++
++2016-06-19 Markus Hiereth <post@hiereth.de>
++
++ * doc-de/README.func, scripts/w3mhelp-funcdesc.de.pl.in:
++ Update German help messages.
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=765682
++
++ * doc/README.func, scripts/w3mhelp-funcdesc.en.pl.in:
++ * scripts/w3mhelp.cgi.in: Update English help messages.
++
++2016-05-11 Tatsuya Kinoshita <tats@debian.org>
++
++ * config.guess, config.sub:
++ Update config.* with autotools-dev 20160430.1.
++
++2016-04-14 Tatsuya Kinoshita <tats@debian.org>
++
++ * doc-de/README.func, doc-jp/README.func, doc/README.func:
++ * w3m-doc/sample/keymap.cgi: Cleanup obsolete INIT_MAILCAP.
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=820902
++
++ * NEWS: Update NEWS.
++
++2016-04-08 Tatsuya Kinoshita <tats@debian.org>
++
++ * libwc/johab.c: Fix segfault on bogus text for wc_N_to_johab1.
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=820373
++
++2016-04-07 Tatsuya Kinoshita <tats@debian.org>
++
++ * libwc/map/big5_ucs.map, libwc/map/cns11643_ucs.map:
++ * libwc/map/gb12345_ucs.map, libwc/map/gb2312_ucs.map:
++ * libwc/map/gbk_ucs.map, libwc/map/hkscs_ucs.map:
++ * libwc/map/jisx0208x0212x0213_ucs.map, libwc/map/ksx1001_ucs.map:
++ * libwc/map/sjis_ext_ucs.map, libwc/map/uhc_ucs.map, libwc/ucs.c:
++ * libwc/ucs.map: Fix segfault on bogus text for wc_any_to_ucs.
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=820162
++
++2016-04-03 Tatsuya Kinoshita <tats@debian.org>
++
++ * doc/FAQ.html, doc/MANUAL.html: Update English documents.
++
++2016-04-03 Markus Hiereth <markus.hiereth@freenet.de>
++
++ * doc/FAQ.html, doc/MANUAL.html: Update English documents.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=772341#25
++
++2016-04-02 Tatsuya Kinoshita <tats@debian.org>
++
++ * configure, configure.ac, doc-de/README.func, scripts/Makefile.in:
++ * scripts/w3mhelp-funcdesc.de.pl.in, scripts/w3mhelp.cgi.in:
++ Support German translated help messages (translation is in progress).
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=765682
++
++ * doc-jp/w3m.1, doc/w3m.1: Update manpage footers to w3m 0.5.3.
++
++ * doc-jp/MANUAL.html, doc-jp/w3m.1, w3m-doc/outline.html.in:
++ * w3mhelp-lynx_ja.html.in, w3mhelp-w3m_ja.html.in:
++ Update Japanese documents for extbrowser4..9.
++
++2016-04-02 Justin B Rye <justin.byam.rye@gmail.com>
++
++ * doc/FAQ.html, doc/MANUAL.html, doc/README.func, doc/menu.submenu:
++ * main.c, menu.c, scripts/w3mhelp-funcdesc.ja.pl.in:
++ * scripts/w3mhelp.cgi.in, w3mhelp-lynx_en.html.in:
++ * w3mhelp-w3m_en.html.in: English fixes.
++ cf. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=772341#15
++ Origin: https://lists.debian.org/debian-l10n-english/2014/12/msg00002.html
++ Origin: https://lists.debian.org/debian-l10n-english/2014/12/msg00030.html
++ Origin: https://lists.debian.org/debian-l10n-english/2015/02/msg00011.html
++
++2016-03-30 Leo Famulari <leo@famulari.name>
++
++ * url.c: Disable RC4.
++ Origin: http://git.savannah.gnu.org/cgit/guix.git/commit/?id=62339e2d493bf87a3aabe12e45458581e9705d83
++
++2016-03-29 Tatsuya Kinoshita <tats@debian.org>
++
++ * url.c: Fix variable is reassigned a value before the old one has
++ been used.
++
++ * regex.c: Fix printf format specifier mismatch when REGEX_DEBUG.
++
++ * w3mimg/fb/fb.c: Fix invalid braces when not Linux or FreeBSD.
++
++ * local.c: Fix uninitialized variable when not HAVE_PUTENV.
++
++ * w3mimgdisplay.c: Fix realloc mistake for DrawImage.
++
++ * file.c: Fix mistake of unescape spaces for _doFileCopy.
++ cf. [w3m-dev-en 00751], [w3m-dev-en 00752] on 2002-06-09
++
++ * url.c: Fix style of array index is used before limits check.
++ Bug: https://sourceforge.net/p/w3m/feature-requests/25/
++
++2016-03-22 Tatsuya Kinoshita <tats@debian.org>
++
++ * menu.c, proto.h: Fix build failure when not USE_MOUSE for sgrmouse.
++ cf. https://twitter.com/naota344/status/711541592167854081
++
++2016-03-20 Tatsuya Kinoshita <tats@debian.org>
++
++ * rc.c: Fix reverse ordered config parameters.
++
++2016-03-19 Tatsuya Kinoshita <tats@debian.org>
++
++ * doc/FAQ.html: Update FAQ for extbrowser.
++
++2016-03-14 Tatsuya Kinoshita <tats@debian.org>
++
++ * po/de.po, po/ja.po, po/w3m.pot, po/zh_CN.po, po/zh_TW.po, rc.c:
++ Update PO strings for extbrowser2..9.
++
++2016-03-13 Tatsuya Kinoshita <tats@debian.org>
++
++ * acinclude.m4, configure:
++ Set firefox instead of mozilla to default browser.
++
++ * po/Makefile.in.in, po/de.po, po/ja.po, po/w3m.pot, po/zh_CN.po:
++ * po/zh_TW.po: Update PO strings for extbrowser4..9.
++
++ * doc-jp/MANUAL.html, doc/MANUAL.html, fm.h, main.c, rc.c:
++ Add extbrowser4, extbrowser5, ..., and extbrowser9.
++ e.g.
++ - extbrowser8 url=%s && printf %s "$url" | xsel && printf %s "$url" | xsel -b
++ - extbrowser9 mpv %s &
++ cf. https://github.com/spcmd/w3m
++
++2016-02-28 Tatsuya Kinoshita <tats@debian.org>
++
++ * menu.c: Fix SIGFPE for ACCESSKEY.
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=779092
++
++ * doc/README.func, main.c: Typo fix for ACCESSKEY.
++ cf. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=779092#5
++
++2015-12-20 Franz Thoma <franz.thoma@tngtech.com>
++
++ * w3mimg/x11/x11_w3mimg.c: Fix semi-transparent artifacts in w3m-img
++ when used with 32-bit color (e.g. urxvt).
++ imlib_render_image_on_drawable_at_size() tended to leave nasty
++ semi-transparent artifacts in 32-bit mode. Apparently, resizing an
++ image in 32-bit mode affects the alpha channel even if there is no
++ transparency in the image. With this patch, resizing is done in
++ 24-bit mode (or whatever depth the original image has) before
++ converting the image to 32-bit and rendering it on the display.
++ Origin: https://gist.github.com/fmthoma/f76a1b44e00d5ca972bb
++ cf. https://github.com/hut/ranger/issues/86#issuecomment-166027119
++
++2015-12-17 Tatsuya Kinoshita <tats@debian.org>
++
++ * w3mimg/x11/x11_w3mimg.c:
++ Wrap render_pixbuf_to_pixmap_32() in USE_GTK2.
++
++2015-12-17 Araki Ken <arakiken@users.sf.net>
++
++ * w3mimg/x11/x11_w3mimg.c:
++ w3mimgdisplay supports 32 bit depth screen. (e.g. gnome-terminal)
++ Origin: https://bitbucket.org/arakiken/w3m/commits/f9c22db8cfd1aaba9bb7301ef9ba51ed88d8bb40
++
++2015-12-17 Tatsuya Kinoshita <tats@debian.org>
++
++ * w3mimg/x11/x11_w3mimg.c:
++ Revert "Fix handling visuals and colormaps incorrectly".
++ This reverts commit e24b4064daf3e022e370788a8c7267db40c37dda.
++
++2015-11-19 Tatsuya Kinoshita <tats@debian.org>
++
++ * fm.h: Accept cookies by default.
++
++ * fm.h: Set argv_is_url to 1 by default.
++ Bug-Arch: https://bugs.archlinux.org/task/47102
++
++2015-11-18 Tatsuya Kinoshita <tats@debian.org>
++
++ * config.guess, config.sub:
++ Update config.* with autotools-dev 20150820.1.
++
++2015-11-11 Mingye Wang (Arthur2e5) <arthur200126@gmail.com>
++
++ * po/LINGUAS, po/zh_CN.po, po/zh_TW.po:
++ Add zh_CN and zh_TW translations.
++ Please note that the zh_TW translation is machine-converted using
++ OpenCC from zh_CN, and needs to be further polished by actual zh_TW
++ speakers.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=804732#10
++
++2015-10-24 BwackNinja <BwackNinja@gmail.com>
++
++ * w3mimg/x11/x11_w3mimg.c:
++ Fix handling visuals and colormaps incorrectly.
++ cf. https://github.com/hut/ranger/issues/86
++ Origin: https://gist.github.com/BwackNinja/60a344730170f9ce2163
++ Bug-Arch: https://bugs.archlinux.org/task/46836
++ Bug: https://sourceforge.net/p/w3m/patches/72/
++
++2015-10-10 Tatsuya Kinoshita <tats@debian.org>
++
++ * cookie.c: Remove incomplete special_domain tests.
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=385702
++
++2015-10-04 Gaetan Bisson <bisson@archlinux.org>
++
++ * scripts/w3mhelp.cgi.in: Do not use defined(%hash).
++ Origin: https://projects.archlinux.org/svntogit/packages.git/commit/trunk?h=packages/w3m&id=d9e0a4f0b461c9e2177cd9e64a10581386650503
++ Bug-Arch: https://bugs.archlinux.org/task/45608
++
++2015-09-06 Tatsuya Kinoshita <tats@debian.org>
++
++ * file.c: Do not use C99-style comments.
++
++2015-09-06 David Crosby <dave@dafyddcrosby.com>
++
++ * file.c: Mitigate issue #16 found by @kcwu.
++ * table.c: Fix stack overflow found by @kcwu.
++ Origin: https://github.com/dafyddcrosby/sw3m
++ Bug-sw3m: https://github.com/dafyddcrosby/sw3m/issues/16
++
++2015-08-21 Tatsuya Kinoshita <tats@debian.org>
++
++ * doc-jp/keymap.lynx, doc/keymap.lynx: Fix unknown key.
++ Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/w3m/+bug/265144
++ Bug: https://sourceforge.net/p/w3m/bugs/48/
++
++2015-08-11 David Crosby <dave@dafyddcrosby.com>
++
++ Fix resource leaks, dead assignments, divide-by-zero, and so on.
++ Origin: https://github.com/dafyddcrosby/sw3m
++
++ * buffer.c: Check for presence of prevl before using.
++
++ * html.h: Adjust UFclose to remove false positive of CWE-481.
++
++ * ftp.c: Move sockent for splint.
++
++ * cookie.c: Use unsigned int for max_count.
++
++ * libwc/iso2022.c: Add missing comparision that made if always true.
++
++ * Str.c: Use fgetc in while loops, use int instead of char.
++
++ * mailcap.c: Adjust len to size_t.
++
++ * history.c: Check return value of rename.
++
++ * main.c: Adjust while loop.
++
++ * news.c: Check dup call for errors.
++
++ * file.c: Remove unused value.
++
++ * ftp.c: dup can give a negative value.
++
++ * main.c: Use int for c.
++
++ * table.c: Initialize new_tabwidth at declaration.
++
++ * local.c: Remove overflow on readlink.
++
++ * anchor.c, file.c, istream.c, main.c, menu.c, rc.c, table.c, terms.c:
++ * url.c: Remove dead assignments flagged by Clang static analysis.
++
++ * w3mbookmark.c:
++ Move fclose to fix dereference after null check (Coverity).
++
++ * file.c: Fix resource leak in AuthDigestCred.
++
++ * buffer.c: Fix resource leak in readBufferCache.
++
++ * cookie.c: Fix resource leak in load_cookies.
++
++ * frame.c: Fix resource leak.
++
++ * w3mhelperpanel.c: Fix resource leak.
++
++ * w3mbookmark.c: Fix resource leak and a null return value dereference.
++
++ * linein.c: Fix a divide-by-zero.
++
++ * cookie.c: Change total_dot_number to unsigned int.
++
++ * cookie.c: Free tmp.
++
++ * local.c: Remove unreachable return.
++
++2015-08-10 Alan Grow <alangrow@gmail.com>
++
++ * url.c (HTTPrequest):
++ - Use Content-Type instead of Content-type.
++ - Use Content-Length instead of Content-length.
++ Origin: https://github.com/acg/w3m/commit/5946c2784d4eae46ec06e52390e43a874b3395fc
++
++2015-08-09 Egmont Koblinger <egmont@users.sourceforge.net>
++
++ * terms.c: Support sgrmouse for skip_escseq.
++ * menu.c: Adjust comments for keymaps.
++ Origin: https://sourceforge.net/p/w3m/patches/65/#e2aa
++
++2015-08-09 Tatsuya Kinoshita <tats@debian.org>
++
++ * keybind_lynx.c: Support sgrmouse for Lynx-like key binding.
++ cf. https://sourceforge.net/p/w3m/patches/65/
++
++2015-08-09 IWAMOTO Kouichi <sue@iwmt.org>
++
++ * menu.c: Support SGR style mouse handler for menu.
++ cf. https://github.com/tats/w3m/issues/5
++ Origin: https://gist.github.com/ttdoda/83fbcf676a21da28432b
++ Bug: https://sourceforge.net/p/w3m/patches/65/
++
++2015-08-06 Richard Quirk <richard@quirk.es>
++
++ Fix problems reported by cppcheck, clang --analyze and gcc warnings.
++ Origin: https://github.com/tats/w3m/pull/6
++
++ * Str.c, Str.h: Strnew_charp and co do not modify the char* input.
++
++ * local.c: Close temp file if pipe open fails.
++
++ * rc.c: Avoid passing null to strlen.
++
++ * file.c: Initialise hidden_input to NULL.
++ This prevents a possible use of garbage value on line 3017.
++
++ * file.c: Use pclose for pipe.
++
++2015-08-05 IWAMOTO Kouichi <sue@iwmt.org>
++
++ * main.c: Fix that SGR style mouse handler has off-by-one problem.
++ cf. https://github.com/tats/w3m/issues/5
++ Origin: https://gist.github.com/ttdoda/30c189a63d483beeb207
++ Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/w3m/+bug/1390768
++ Bug: https://sourceforge.net/p/w3m/patches/65/
++
++2015-07-31 yshl <yshl@takechiyo.net>
++
++ * Bonus/goodict.cgi:
++ - Use Encode.pm instead of NKF.
++ - Update to the current URL.
++ - Enable to select search mode.
++ Origin: https://github.com/tats/w3m/pull/4
++
++2015-07-20 Tatsuya Kinoshita <tats@debian.org>
++
++ * README: Add short description.
++
++ * doc-jp/FAQ.html, doc/FAQ.html: Mention GOPHER_PROXY and FTP_PROXY.
++
++2015-07-05 Tatsuya Kinoshita <tats@debian.org>
++
++ * doc-jp/FAQ.html, doc/FAQ.html: Mention HTTPS_PROXY.
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=791425
++
++2015-06-27 yshl <yshl@takechiyo.net>
++
++ * doc-jp/README.SSL: Modify certdata2pem.rb to assume the encoding
++ of the certdata.txt to be UTF-8.
++ Origin: https://github.com/tats/w3m/pull/3
++
++2015-06-23 Daniel Schepler <dschepler@gmail.com>
++
++ * terms.c: Wrap the functions used by image.c in USE_IMAGE.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=789539
++
++2015-05-09 Tatsuya Kinoshita <tats@debian.org>
++
++ * doc-jp/README.siteconf, doc/README.siteconf:
++ Update examples of siteconf for twitter.com.
++
++2015-05-03 Tatsuya Kinoshita <tats@debian.org>
++
++ * main.c: Correct GC version confirmation.
++
++2015-05-02 yshl <yshl@takechiyo.net>
++
++ * main.c: Correct GC version confirmation.
++ Origin: https://github.com/tats/w3m/pull/2
++
++2015-04-29 Markus Hiereth <post@hiereth.de>
++
++ * po/de.po: Update German translation.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=783383
++
++2015-04-29 Tatsuya Kinoshita <tats@debian.org>
++
++ * po/Makevars, po/de.po, po/ja.po, po/w3m.pot, rc.c:
++ Update PO strings for display_borders.
++
++2015-04-26 yshl <yshl@takechiyo.net>
++
++ * main.c: Use GC_oom_fn instead of GC_set_oom_fn for gc-7.1.
++ Origin: https://github.com/tats/w3m/pull/1
++
++2015-02-03 Tatsuya Kinoshita <tats@debian.org>
++
++ * po/de.po, po/ja.po, po/w3m.pot: Update PO.
++
++2015-02-02 Tatsuya Kinoshita <tats@debian.org>
++
++ * file.c, fm.h, rc.c:
++ New option "display_borders" to display 0 pixel table borders.
++ cf. http://d.hatena.ne.jp/rubikitch/20101120
++
++2015-01-24 Tatsuya Kinoshita <tats@debian.org>
++
++ * acinclude.m4, configure, version.c.in:
++ Update to 0.5.3+gitYYYYMMDD (generate from ChangeLog).
++
++2015-01-15 Tatsuya Kinoshita <tats@debian.org>
++
++ * alloc.h, main.c: Drop C99 features.
++
++2015-01-15 Scarlett <scarlett@xavin.net>
++
++ Add overflow detection.
++ Origin: http://marc.info/?l=openbsd-ports&m=142090828929750&w=2
++ * main.c: Call exit(1) when out of memory to avoid dereferencing null
++ pointers when gc's malloc fails.
++ * alloc.h: Replacements for w3m's allocation macros which add
++ overflow detection and concentrate the macros in one file.
++ * indep.h, libwc/charset.c, libwc/status.c, matrix.c: Use the
++ overflow-detecting allocation macros from alloc.h.
++
++2015-01-15 Tatsuya Kinoshita <tats@debian.org>
++
++ * Str.c, cookie.c, map.c:
++ Do not use C99 printf format specifiers and asprintf.
++
++2015-01-15 Scarlett <scarlett@xavin.net>
++
++ Correct printf arguments and use asprintf.
++ Origin: http://marc.info/?l=openbsd-ports&m=142090828929750&w=2
++ * Str.c: Use asprintf() instead of rolling our own printf string
++ length detection.
++ * cookie.c: Pass the char pointer in the string struct to printf %s
++ instead of the string struct itself.
++ Print time_t using %lld instead of %ld to allow for 64-bit time_t.
++ * main.c: Print a long int using the correct format specifier.
++ * map.c: Print size_t using the correct format specifier.
++
++2014-12-06 Araki Ken <arakiken@users.sf.net>
++
++ Support OSC 5379 remote imaging and sixel graphics.
++ Origin: https://bitbucket.org/arakiken/w3m/branch/remoteimg (2014-11-16)
++
++ * doc/README.sixel, terms.c: Add README.sixel. W3M_IMG2SIXEL
++ environmental variable enables to specify options of img2sixel.
++
++ * image.c, terms.c:
++ Add n_terminal_image argument to put_image_{sixel|osc5379}().
++ Use struct winsize to calculate ppc and ppl.
++
++ * terms.c: If SCREEN_VARIANT=sixel on GNU screen, exec img2sixel
++ without -P option.
++
++ * terms.c: ttymode_set() -> ttymode_reset().
++
++ * terms.c: Fix.
++
++ * terms.c: Support GNU screen.
++
++ * terms.c: Show GIF (except animation GIF) correctly.
++
++ * main.c, terms.c: img2sixel exits by Ctrl+C. Enable GIF Animation if
++ 'I' is pressed to show it.
++
++ * image.c: Add declaration of get_pixel_per_cell().
++
++ * terms.c: Show the first frame of animation gif files.
++
++ * terms.c: system() -> fork()&execvp()
++
++ * display.c: Draw underline on anchor which contains cboth text and
++ images.
++
++ * etc.c: Remove close_tty() from setup_child() because close_tty()
++ sometimes interrupts loadGeneralFile() in loadImage() and corrupt
++ image data can be cached in ~/.w3m.
++
++ * image.c: Minor fix.
++
++ * image.c: Cache image files if at all possible and convert them to
++ sixel when -sixel option is specified.
++
++ * image.c: Init pixel_per_{char|line}_i if get_pixel_per_cell() fails.
++
++ * display.c, file.c, fm.h, image.c, main.c, terms.c:
++ Add -sixel option which supports image processing by img2sixel.
++
++ * image.c: Don't download image files whose size is specified in
++ <img> tag.
++
++ * image.c: Minor fixes of parseImageHeader().
++
++ * image.c: Determine the format of an image file by its header data
++ not by its file name suffix.
++
++ * image.c: Read width and height from jpeg, png and gif files directly
++ instead of executing w3mimgdisplay -size.
++
++ * display.c: display.c: Draw underline on anchor text which is not
++ overlapped with any image.
++
++ * terms.c: Clear fd_set by FD_ZERO() before select().
++
++ * file.c: nw and ni are rounded up instead of rounded off to show
++ every corner of images.
++
++ * terms.c: Change time to wait for the response of "\x1b[14t\x1b[18t"
++ from 0.1 sec to 0.5 sec.
++
++ * image.c:
++ - clearImage() works.
++ - Use cached image files created by w3m in getImage().
++
++ * file.c: Hack for alignment.
++
++ * fm.h, image.c, terms.c:
++ - Adjust the image size to the terminal cell size.
++ - If the image size is specified in html source, skip to load the image.
++
++ * display.c, fm.h, image.c, main.c, terms.c, w3mimg/x11/x11_w3mimg.c:
++ Support remote image by OSC 5379 show_picture sequence.
++
++2014-12-06 Olaf Hering <olh@suse.de>
++
++ * parsetagx.c: Fix crash in parse_tag() during every start.
++ Origin: https://build.opensuse.org/package/view_file/openSUSE:Factory/w3m/w3m-parsetagx-crash.patch?expand=1
++
++ * fm.h: Change the default to alt_entity=0.
++ Change the default for the option "Use ASCII equivalents to
++ display entities" from YES to NO.
++ Origin: https://build.opensuse.org/package/view_file/openSUSE:Factory/w3m/w3m-0.5.1-no-ASCII-equivalents-by-default.patch?expand=1
++ Bug-Novell: https://bugzilla.novell.com/show_bug.cgi?id=247397
++
++ * anchor.c, libwc/gb18030.c, libwc/ucs.c, regex.c:
++ Fix a few harmless uninitialized variables.
++ Origin: https://build.opensuse.org/package/view_file/openSUSE:Factory/w3m/w3m-uninitialized.patch?expand=1
++
++2014-12-06 Peter Poeml <poeml@suse.de>
++
++ * terms.c: Prevent segfault when editing a textarea field with vi.
++ Add fix for segfault that can occur when editing a textarea field
++ with vi, and returning to w3m (it seems to happen if the terminal
++ is not writable, as when using w3m after 'su - some_user')
++ Origin: https://build.opensuse.org/package/view_file/openSUSE:Factory/w3m/w3m-0.4.1-textarea-segfault.dif?expand=1
++
++2014-12-04 Tatsuya Kinoshita <tats@debian.org>
++
++ * acinclude.m4: Follow updated configure.
++
++2014-12-03 Yusuke Baba <babayaga1@y8.dion.ne.jp>
++
++ * configure, w3mimg/fb/fb.c, w3mimg/fb/fb.h, w3mimg/fb/fb_w3mimg.c:
++ Support FreeBSD framebuffer.
++ Origin: http://www.ac.auone-net.jp/~baba/w3m-img/index.html
++ Bug-FreeBSD: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=122673
++
++2014-12-02 Naohiro Aota <naota@gentoo.org>
++
++ * acinclude.m4, configure, w3mimg/fb/fb_gdkpixbuf.c:
++ * w3mimg/x11/x11_w3mimg.c:
++ Depend on gdk-pixbuf instead of gtk when gtk2.
++ Origin: http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/www-client/w3m/files/w3m-0.5.3-gdk-pixbuf.patch?revision=1.1
++
++2014-12-02 Jeroen Roovers <jer@gentoo.org>
++
++ * acinclude.m4, configure: Add tinfo to with_termlib.
++ Fix building against sys-libs/ncurses[tinfo].
++ Origin: https://504588.bugs.gentoo.org/attachment.cgi?id=372650
++ Bug-Gentoo: https://bugs.gentoo.org/show_bug.cgi?id=504588
++
++2014-12-01 OBATA Akio <obache@netbsd.org>
++
++ * acinclude.m4, configure:
++ Assume defined PKG_CONFIG points right location when gtk2.
++ Origin: http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/www/w3m/patches/patch-aa?rev=1.13&content-type=text/x-cvsweb-markup
++ Origin: http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/www/w3m/patches/patch-ak?rev=1.1&content-type=text/x-cvsweb-markup
++
++2014-12-01 Vsevolod Stakhov <vsevolod@FreeBSD.org>
++
++ * config.h.in: Disable USE_EGD for LibreSSL.
++ Disable use of RAND_egd as it is absent in FreeBSD.
++ This also fixes build error with LibreSSL.
++ Origin: https://bz-attachments.freebsd.org/attachment.cgi?id=144635
++ Bug-FreeBSD: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=191852
++ Bug-FreeBSD: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=191956
++
++2014-12-01 zimous <zimous@matfyz.cz>
++
++ * po/ja.po: Set Language tag properly for Japanese translation.
++ Origin: https://512722.bugs.gentoo.org/attachment.cgi?id=378452
++ Bug-Gentoo: https://bugs.gentoo.org/show_bug.cgi?id=512722
++
++2014-11-30 Tatsuya Kinoshita <tats@debian.org>
++
++ * doc/w3m.1: Typo fix.
++
++2014-11-30 Markus Hiereth <post@hiereth.de>
++
++ * doc/w3m.1: Miscellaneous changes to improve English manpage.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=766550#30
++
++2014-11-29 Markus Hiereth <post@hiereth.de>
++
++ * doc/w3m.1: Improve FILES.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=766550#30
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=403634
++
++ * doc/w3m.1: Improve EXAMPLES.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=766550#30
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=380560
++
++ * doc/w3m.1: Improve explanation about option -N.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=766550#30
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=345084
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=530468
++
++ * doc/w3m.1: Note that -cols only affects when HTML is rendered.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=766550#30
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=285251
++
++ * doc/w3m.1: Add more info on configuration.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=766550#30
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=268211
++
++2014-11-29 Justin B Rye <justin.byam.rye@gmail.com>
++
++ * scripts/w3mman/w3mman.1.in: Tweak for W3MMAN_W3M.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=771003#5
++
++ * scripts/w3mman/w3mman.1.in: English fixes.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=766550#25
++
++2014-11-29 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-19+.
++
++2014-11-29 Justin B Rye <justin.byam.rye@gmail.com>
++
++ * scripts/w3mman/w3mman2html.cgi.in: Fix Perl warnings.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=771004
++
++2014-10-21 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-19
++
++ * po/LINGUAS: Correct LINGUAS to a whitespace separated list
++
++2014-10-21 Markus Hiereth <markus.hiereth@freenet.de>
++
++ * po/LINGUAS, po/de.po: Add German translation
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=763964
++
++2014-10-15 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-18
++
++ * doc-jp/README.SSL: Update README.SSL to follow default values
++
++ * config.sub: Update config.sub with autotools-dev 20140911.1
++
++ * fm.h: Disable SSLv3 by default [CVE-2014-3566]
++ cf. https://blog.mozilla.org/security/2014/10/14/the-poodle-attack-and-the-end-of-ssl-3-0/
++
++2014-10-15 Ludwig Nussel <ludwig.nussel@suse.de>
++
++ * fm.h: Force ssl_verify_server on and disable SSLv2 support
++ Origin: http://www.openwall.com/lists/oss-security/2010/06/14/4
++
++2014-10-13 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-17+
++
++2014-10-04 Tatsuya Kinoshita <tats@debian.org>
++
++ * libwc/ambwidth_map.awk, libwc/map/ucs_ambwidth.map:
++ Fix incorrect generation of ucs_ambwidth_map
++
++2014-08-22 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-17
++
++ * config.guess:
++ Update config.guess to 2014-03-23 with autotools-dev 20140510.1
++
++ * config.sub:
++ Update config.sub to 2014-05-01 with autotools-dev 20140510.1
++
++2014-08-22 Micah Cowan <micah@addictivecode.org>
++
++ * main.c: Support Boehm GC 7.2.
++ Replace Gentoo's patch to prevent segfaults due to infinite recursion.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?msg=5;filename=080_gc72.patch;att=1;bug=758831
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=758831
++ Bug-Fedora: https://bugzilla.redhat.com/show_bug.cgi?id=555467
++ Bug: http://sourceforge.net/p/w3m/patches/63/
++ Bug: http://sourceforge.net/p/w3m/patches/59/
++
++2014-08-22 Tatsuya Kinoshita <tats@debian.org>
++
++ * main.c:
++ Revert "Support Boehm GC 7.2" (w3m-0.5.2-gc72.patch from Gentoo)
++ This reverts commit 4331db3e3e673ac4dbfe8e9f2b42a8e0478dc98a.
++
++2014-06-23 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-16
++
++ * url.c: Disable ciphers that use keys smaller than 128 bits
++ Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/w3m/+bug/1325674
++
++2014-01-04 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-15
++
++2014-01-03 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-14
++
++ * acinclude.m4, configure: Use pkg-config to build with imlib2 1.4.6
++
++ * doc/HISTORY, doc/README.cookie, doc/README.m17n:
++ Prefer US-ASCII rathar than Japanese encodings in English documents
++
++2013-12-27 Tatsuya Kinoshita <tats@debian.org>
++
++ * doc-jp/MANUAL.html, doc/MANUAL.html:
++ Cleanup unusable links in MANUAL.html
++ Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=517315
++
++ * version.c.in: Update to 0.5.3+debian-13+
++
++2013-12-17 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-13
++
++2013-12-14 Tatsuya Kinoshita <tats@debian.org>
++
++ * config.guess:
++ Update config.guess to 2013-06-10 with autotools-dev 20130810.1
++
++ * config.sub:
++ Update config.sub to 2013-08-10 with autotools-dev 20130810.1
++
++2013-12-07 Reinhard Max <max@suse.de>
++
++ * local.c: Fix a directory descriptor leak in loadLocalDir.
++ Patch from openSUSE on 2009-09-07.
++ Origin: https://build.opensuse.org/package/view_file/openSUSE:Factory/w3m/w3m-closedir.patch
++ Bug-Novell: https://bugzilla.novell.com/show_bug.cgi?id=531675
++
++2013-12-07 AIDA Shinra <shinra@j10n.org>
++
++ * main.c: Fix crash after SEARCH_NEXT.
++ Patch from <http://www.j10n.org/files/w3m-cvs-1.1055-search-next.patch>,
++ [w3m-dev:04473] on 2013-12-07.
++
++2013-11-11 Paul Boekholt <p.boekholt@gmail.com>
++
++ * file.c: Add support for single quoted meta refresh URL
++ Bug: https://sourceforge.net/p/w3m/patches/53/
++ Bug-NetBSD: http://gnats.netbsd.org/42400
++
++2013-11-07 Cristian Rodriguez <crrodriguez@opensuse.org>
++
++ * url.c: Use SSL_OP_NO_COMPRESSION if available.
++ Due to the "CRIME attack" (CVE-2012-4929) HTTPS clients that
++ negotiate TLS-level compression can be abused for MITM attacks.
++ * url.c: Use SSL_MODE_RELEASE_BUFFERS if available.
++ Patch from openSUSE on 2012-11-12:
++ https://build.opensuse.org/request/show/141054
++
++2013-10-15 Tatsuya Kinoshita <tats@debian.org>
++
++ * Makefile.in:
++ Depend on funcname.tab to fix parallel make issue of scripts
++ Bug: https://sourceforge.net/p/w3m/patches/64/
++ Bug-Gentoo: https://bugs.gentoo.org/show_bug.cgi?id=362249
++
++ * w3mimg/Makefile.in:
++ Avoid prerequisite $(IMGOBJS) to fix parallel make issue of w3mimg
++ Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=726188
++
++ * acinclude.m4, configure:
++ Explicitly add -lX11 to IMGX11LDFLAGS only when gtk2
++ Bug: https://sourceforge.net/p/w3m/patches/57/
++
++ * w3mimg/Makefile.in: Revert "Fix parallel make issue"
++ This reverts commit aa6f871c6dcc108118142bcc786e4a6ac3d46867.
++
++ * Makefile.in:
++ Revert "Explicitly link w3mimgdisplay with -lX11 to build with gcc 4.5"
++ This reverts commit 7410954066d68ac2ad6aea638801714447321fec.
++
++2013-10-14 AIDA Shinra <shinra@j10n.org>
++
++ * url.c: Define schemeNumToName() to fix scheme bug.
++ Patch from <http://www.j10n.org/files/w3m-cvs-1.1055-schemebug.patch>,
++ [w3m-dev:04470] on 2013-10-14.
++ Bug: https://sourceforge.net/p/w3m/patches/60/
++
++ * config.h.in, file.c, fm.h, html.h, image.c, indep.c, indep.h:
++ * istream.c, istream.h, local.c, main.c, mimehead.c, proto.h:
++ Workaround of GC crash on Cygwin64.
++ Patch from <http://www.j10n.org/files/w3m-cvs-1.1055-win64gc.patch>,
++ [w3m-dev:04469] on 2013-10-14.
++
++2013-10-14 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-12+
++
++2013-10-14 Jarek Czekalski <jarekczek@poczta.onet.pl>
++
++ * terms.c: Fix paren in check_cygwin_console()
++ Bug: https://sourceforge.net/p/w3m/patches/66/
++
++2013-10-13 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-12
++
++ * doc-jp/MANUAL.html, doc-jp/w3m.1, doc/MANUAL.html, doc/w3m.1:
++ Update document for the -s option change
++ Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=75527
++
++ * terms.c: Do not fail when LANG is not set.
++ Check whether the value of LC_ALL, LC_CTYPE or LANG is not NULL in
++ check_cygwin_console().
++ Bug: https://sourceforge.net/p/w3m/patches/66/
++
++2013-10-12 Tatsuya Kinoshita <tats@debian.org>
++
++ * table.h: Bump MAXCOL to 256
++ Bug: https://sourceforge.net/p/w3m/feature-requests/24/
++
++2013-10-12 Laurence Richert <laurencerichert@yahoo.de>
++
++ * main.c, proto.h: vim/-perator like handling
++ - half page scrolling
++ - jumping to elements numbered by getLinkNumberStr() from Karsten
++ Schoelzel
++ Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=724028
++
++2013-10-12 Tatsuya Kinoshita <tats@debian.org>
++
++ * doc-jp/README, doc/README:
++ Mention project page rather than unavailable mailing lists
++
++2013-10-09 Rafael Laboissiere <rafael@laboissiere.net>
++
++ * doc/README.img: Fix typo
++ Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=725892
++
++2013-08-12 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-11+
++
++ * ChangeLog: Update ChangeLog to use contributor's name
++
++2013-08-08 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-11
++
++2013-08-04 Tatsuya Kinoshita <tats@debian.org>
++
++ * Str.c: Check length for Strchop()
++
++ * main.c: Fix potentially segfault of execdict()
++
++ * version.c.in: Update to 0.5.3+debian-10+
++
++ * file.c: Fix segfault of loadGeneralFile()
++ Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=718612
++
++2013-08-02 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-10
++
++2013-08-02 Piotr P. Karwasz <piotr.p@karwasz.org>
++
++ * scripts/w3mman/w3mman2html.cgi.in:
++ Correct underline processing and more UTF-8 support for w3mman2html.cgi.
++ Patch from <https://bugs.launchpad.net/ubuntu/+source/w3m/+bug/680202>
++ on 2010-11-23.
++
++2013-08-01 Hilko Bengen <bengen@debian.org>
++
++ * entity.c: Ignore SOFT HYPHEN to prevent drawing hyphens everywhere.
++ Patch from <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=441934>
++ on 2011-03-01.
++
++2013-08-01 Tatsuya Kinoshita <tats@debian.org>
++
++ * doc-jp/README, doc/README: Update contact list in README
++ Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=696209
++
++2013-07-30 Tatsuya Kinoshita <tats@debian.org>
++
++ * config.guess, config.sub:
++ Update config.guess and config.sub to supprot aarch64.
++ Updated with Debian autotools-dev version 20130515.1.
++
++2013-07-30 Conrad J.C. Hughes <debbugs@xrad.org>
++
++ * main.c: Sort anchors by sequence number in -dump.
++ Patch from <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=657666>
++ on 2012-01-27.
++
++2013-07-30 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-9+
++
++2013-07-29 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update version to w3m/0.5.3+debian-9
++
++ * version.c.in: Set CURRENT_VERSION to debian version
++
++2013-07-28 Tatsuya Kinoshita <tats@debian.org>
++
++ * file.c: Fix segfault of process_button()
++
++2013-04-08 AIDA Shinra <shinra@j10n.org>
++
++ * file.c: One more patch for siteconf from [w3m-dev 04464]
++
++ * anchor.c, config.h.in, display.c, doc-jp/README.siteconf:
++ * doc/README.siteconf, file.c, fm.h, form.c, frame.c, func.c:
++ * history.c, indep.c, indep.h, linein.c, main.c, map.c, menu.c:
++ * po/ja.po, proto.h, rc.c, url.c: Support the siteconf feature.
++ Patch to support the siteconf feature, from [w3m-dev 04463]
++ on 2012-06-27.
++
++2013-04-08 Hayaki Saito <user@zuse.jp>
++
++ * keybind.c, main.c, proto.h, terms.c:
++ Support SGR 1006 mouse reporting.
++ cf. [w3m-dev 04466] on 2012-07-15
++ Origin: https://gist.github.com/3114255
++ Bug: https://sourceforge.net/p/w3m/patches/65/
++
++2012-05-19 Hilko Bengen <bengen@debian.org>
++
++ * form.c: Assume "text" if an input type is unknown.
++ Patch from <http://bugs.debian.org/615843> on 2011-03-01.
++
++2012-05-19 Simon Ruderich <simon@ruderich.org>
++
++ * Makefile.in: Use $(CPPFLAGS) with $(CPP).
++ Patch from <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=665491>
++ on 2012-03-24.
++
++2012-05-03 Miroslav Å ulc <fordfrog@gentoo.org>
++
++ * w3mimg/Makefile.in: Fix parallel make issue.
++ Patch from Gentoo
++ <http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/www-client/w3m/files/w3m-0.5.3-parallel-make.patch?revision=1.1&view=markup>
++ <https://bugs.gentoo.org/show_bug.cgi?id=353390> on 2011-02-01.
++
++2012-05-03 MATSUU Takuto <matsuu@gentoo.org>
++
++ * main.c: Support Boehm GC 7.2.
++ Patch from Gentoo
++ <http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/www-client/w3m/files/w3m-0.5.2-gc72.patch?revision=1.1&view=markup>
++ on 2009-12-13.
++
++2012-05-02 Reinhard Tartler <siretart@tauware.de>
++
++ * istream.c, istream.h:
++ Fix that struct file_handle conflicts with glibc 2.14.
++ Patch from <https://bugs.launchpad.net/ubuntu/+source/w3m/+bug/935540>
++ on 2012-02-19.
++
++2011-10-30 Colin Watson <cjwatson@ubuntu.com>
++
++ * acinclude.m4, configure, w3mbookmark.c:
++ Appease gcc -Werror=format-security.
++ Patch from 0.5.3-3ubuntu1 on 2011-10-23.
++ Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=646321
++
++2011-06-19 Martin Pitt <martin.pitt@ubuntu.com>
++
++ * Makefile.in:
++ Explicitly link w3mimgdisplay with -lX11 to build with gcc 4.5.
++ Patch from 0.5.2-10ubuntu1 on 2010-12-03.
++ Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=605761
++
++2011-06-19 Fumitoshi UKAI <ukai@debian.or.jp>
++
++ * main.c: Change the -s option to "squeeze multiple blank lines".
++ Change the -s option from "display charset Shift_JIS" to "squeeze
++ multiple blank lines" to work as /usr/bin/pager. In addition, the
++ options -j and -e are disabled. To specify the display charset,
++ use -O{s|j|e} instead.
++ Patch from [w3m-dev 01275] on 2000-10-26.
++ Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=75527
++
++2011-06-19 Hiroyuki Ito <ZXB01226@nifty.com>
++
++ * file.c, fm.h, html.c, html.h, proto.h, table.c, tagtable.tab:
++ Support the button element as defined in HTML 4.01.
++ Patch from upstream, [w3m-dev 04411] on 2010-09-17, to support the
++ button element. It is discussed upstream and incomplete, but enough
++ to login Launchpad.
++ Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=136810
++ Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/w3m/+bug/628755
++
+ 2012-05-22 Tatsuya Kinoshita <tats@vega.ocn.ne.jp>
+
+ * [w3m-dev 04451] w3m/entity.h should be removed when `make clean'
+diff --git a/Makefile.in b/Makefile.in
+index 7d692f9..453072d 100644
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -111,6 +111,7 @@ IMGDISPLAY=w3mimgdisplay$(EXT)
+ MAN1_TARGET=$(PACKAGE).1
+ MAN1=$(top_srcdir)/doc/w3m.1
+ MAN1_JA=$(top_srcdir)/doc-jp/w3m.1
++MAN1_DE=$(top_srcdir)/doc-de/w3m.1
+
+ LIB_TARGETS=$(BOOKMARKER) $(HELPER)
+ AUXBIN_TARGETS=@AUXBIN_TARGETS@
+@@ -150,7 +151,7 @@ parsetagx.o: html.c
+
+ funcname.tab: $(DEFUNS)
+ (echo '#define DEFUN(x,y,z) x y';\
+- sed -ne '/^DEFUN/{p;n;/^[ ]/p;}' $(DEFUNS)) | $(CPP) - | \
++ sed -ne '/^DEFUN/{p;n;/^[ ]/p;}' $(DEFUNS)) | $(CPP) $(CPPFLAGS) - | \
+ awk '$$1 ~ /^[_A-Za-z]/ { \
+ for (i=2;i<=NF;i++) { print $$i, $$1} \
+ }' > $@.tmp
+@@ -220,10 +221,12 @@ install-core: $(TARGETS)
+ -$(MKDIR) $(DESTDIR)$(HELP_DIR)
+ -$(MKDIR) $(DESTDIR)$(mandir)/man1
+ -$(MKDIR) $(DESTDIR)$(mandir)/ja/man1
++ -$(MKDIR) $(DESTDIR)$(mandir)/de/man1
+ $(INSTALL_PROGRAM) $(TARGET) $(DESTDIR)$(bindir)/$(TARGET)
+ $(INSTALL_DATA) $(HELP_FILE) $(DESTDIR)$(HELP_DIR)/$(HELP_TARGET)
+ $(INSTALL_DATA) $(MAN1) $(DESTDIR)$(mandir)/man1/$(MAN1_TARGET)
+ $(INSTALL_DATA) $(MAN1_JA) $(DESTDIR)$(mandir)/ja/man1/$(MAN1_TARGET)
++ $(INSTALL_DATA) $(MAN1_DE) $(DESTDIR)$(mandir)/de/man1/$(MAN1_TARGET)
+ targets="$(AUXBIN_TARGETS)"; for file in $$targets; \
+ do \
+ case $$file in \
+@@ -250,7 +253,7 @@ install-po:
+ (cd $$subdir && $(MAKE) install); \
+ done
+
+-all-scripts:
++all-scripts: funcname.tab
+ for dir in $(SCRIPTSUBDIRS); \
+ do \
+ (cd $$dir && $(MAKE) $(MAKE_ARGS)); \
+@@ -280,6 +283,7 @@ uninstall:
+ -$(RM) -f $(HELP_DIR)/$(HELP_TARGET)
+ -$(RM) -f $(mandir)/man1/$(MAN1_TARGET)
+ -$(RM) -f $(mandir)/ja/man1/$(MAN1_TARGET)
++ -$(RM) -f $(mandir)/de/man1/$(MAN1_TARGET)
+ -for dir in $(SCRIPTSUBDIRS); \
+ do \
+ (cd $$dir && $(MAKE) $(MAKE_ARGS) uninstall); \
+diff --git a/NEWS b/NEWS
+index 66e309d..5fb5f24 100644
+--- a/NEWS
++++ b/NEWS
+@@ -1,3 +1,40 @@
++w3m X.X.X - YYYY-MM-DD
++
++* new features
++ - support OSC 5379 remote imaging and sixel graphics
++ - support SGR style mouse handler
++ - support 32-bit color images
++ - support FreeBSD framebuffer
++ - support button element
++ - support meta charset
++ - add extbrowser4..9
++ - add display_borders to display 0 pixel table borders
++ - add siteconf feature
++ - add German translation for options setting panel
++ - add translations for de, zh_CN and zh_TW
++* bug fixes
++ - fix segfaults with malformed text
++ - disable SSLv2 and SSLv3 by default [CVE-2014-3566]
++ - set ssl_verify_server to 1 by default
++ - disable RC4, export ciphers, and keys < 128 bits
++ - use SSL_OP_NO_COMPRESSION due to "CRIME attack" [CVE-2012-4929]
++ - use SSL_MODE_RELEASE_BUFFERS
++ - disable USE_EGD for LibreSSL
++ - appease gcc -Werror=format-security
++ - option -s is now "squeeze multiple blank lines" to work as pager, and
++ -j and -e are obsolete, so use -O{s|j|e} to specify display charset
++ - accept single quoted meta refresh URL
++ - assume "text" if a form input type is unknown
++ - accept cookies by default
++ - set use_dictcommand to 1 by default
++ - set default_url to 1 by default
++ - set argv_is_url to 1 by default
++ - set alt_entity to 0 by default
++ - fix build problems with Boehm GC 7.2, imlib2 1.4.6 and glibc 2.14
++ - fix parallel make failure
++ - fix incorrect ucs_ambwidth_map
++ - and many fixes
++
+ w3m 0.5.3 - 2011-01-15
+
+ * security fix
+diff --git a/README b/README
+index 8778d80..765c996 100644
+--- a/README
++++ b/README
+@@ -1,3 +1,9 @@
++w3m: WWW wo Miru Tool
++=====================
++
++w3m is a pager with WWW capability. It IS a pager, but it can be used
++as a text-mode WWW browser.
++
+ If you can read English, see doc/*.
+ If you can read Japanese, see doc-jp/*.
+ If you can read both, read both and correct English. :-)
+diff --git a/Str.c b/Str.c
+index e5a0982..d34129f 100644
+--- a/Str.c
++++ b/Str.c
+@@ -56,7 +56,7 @@ Strnew_size(int n)
+ }
+
+ Str
+-Strnew_charp(char *p)
++Strnew_charp(const char *p)
+ {
+ Str x;
+ int n;
+@@ -73,7 +73,7 @@ Strnew_charp(char *p)
+ }
+
+ Str
+-Strnew_m_charp(char *p, ...)
++Strnew_m_charp(const char *p, ...)
+ {
+ va_list ap;
+ Str r = Strnew();
+@@ -87,7 +87,7 @@ Strnew_m_charp(char *p, ...)
+ }
+
+ Str
+-Strnew_charp_n(char *p, int n)
++Strnew_charp_n(const char *p, int n)
+ {
+ Str x;
+
+@@ -140,7 +140,7 @@ Strcopy(Str x, Str y)
+ }
+
+ void
+-Strcopy_charp(Str x, char *y)
++Strcopy_charp(Str x, const char *y)
+ {
+ int len;
+
+@@ -160,7 +160,7 @@ Strcopy_charp(Str x, char *y)
+ }
+
+ void
+-Strcopy_charp_n(Str x, char *y, int n)
++Strcopy_charp_n(Str x, const char *y, int n)
+ {
+ int len = n;
+
+@@ -180,7 +180,7 @@ Strcopy_charp_n(Str x, char *y, int n)
+ }
+
+ void
+-Strcat_charp_n(Str x, char *y, int n)
++Strcat_charp_n(Str x, const char *y, int n)
+ {
+ int newlen;
+
+@@ -209,7 +209,7 @@ Strcat(Str x, Str y)
+ }
+
+ void
+-Strcat_charp(Str x, char *y)
++Strcat_charp(Str x, const char *y)
+ {
+ if (y == NULL)
+ return;
+@@ -232,8 +232,8 @@ Strgrow(Str x)
+ {
+ char *old = x->ptr;
+ int newlen;
+- newlen = x->length * 6 / 5;
+- if (newlen == x->length)
++ newlen = x->area_size * 6 / 5;
++ if (newlen == x->area_size)
+ newlen += 2;
+ x->ptr = GC_MALLOC_ATOMIC(newlen);
+ x->area_size = newlen;
+@@ -278,8 +278,8 @@ void
+ Strchop(Str s)
+ {
+ STR_LENGTH_CHECK(s);
+- while ((s->ptr[s->length - 1] == '\n' || s->ptr[s->length - 1] == '\r') &&
+- s->length > 0) {
++ while (s->length > 0 &&
++ (s->ptr[s->length - 1] == '\n' || s->ptr[s->length - 1] == '\r')) {
+ s->length--;
+ }
+ s->ptr[s->length] = '\0';
+@@ -301,7 +301,7 @@ Strinsert_char(Str s, int pos, char c)
+ }
+
+ void
+-Strinsert_charp(Str s, int pos, char *p)
++Strinsert_charp(Str s, int pos, const char *p)
+ {
+ STR_LENGTH_CHECK(s);
+ while (*p)
+@@ -530,11 +530,8 @@ Str
+ Strfgets(FILE * f)
+ {
+ Str s = Strnew();
+- char c;
+- while (1) {
+- c = fgetc(f);
+- if (feof(f) || ferror(f))
+- break;
++ int c;
++ while ((c = fgetc(f)) != EOF) {
+ Strcat_char(s, c);
+ if (c == '\n')
+ break;
+@@ -546,11 +543,8 @@ Str
+ Strfgetall(FILE * f)
+ {
+ Str s = Strnew();
+- char c;
+- while (1) {
+- c = fgetc(f);
+- if (feof(f) || ferror(f))
+- break;
++ int c;
++ while ((c = fgetc(f)) != EOF) {
+ Strcat_char(s, c);
+ }
+ return s;
+diff --git a/Str.h b/Str.h
+index f345c74..248815d 100644
+--- a/Str.h
++++ b/Str.h
+@@ -30,22 +30,22 @@ typedef struct _Str {
+
+ Str Strnew(void);
+ Str Strnew_size(int);
+-Str Strnew_charp(char *);
+-Str Strnew_charp_n(char *, int);
+-Str Strnew_m_charp(char *, ...);
++Str Strnew_charp(const char *);
++Str Strnew_charp_n(const char *, int);
++Str Strnew_m_charp(const char *, ...);
+ Str Strdup(Str);
+ void Strclear(Str);
+ void Strfree(Str);
+ void Strcopy(Str, Str);
+-void Strcopy_charp(Str, char *);
+-void Strcopy_charp_n(Str, char *, int);
+-void Strcat_charp_n(Str, char *, int);
++void Strcopy_charp(Str, const char *);
++void Strcopy_charp_n(Str, const char *, int);
++void Strcat_charp_n(Str, const char *, int);
+ void Strcat(Str, Str);
+-void Strcat_charp(Str, char *);
++void Strcat_charp(Str, const char *);
+ void Strcat_m_charp(Str, ...);
+ Str Strsubstr(Str, int, int);
+ void Strinsert_char(Str, int, char);
+-void Strinsert_charp(Str, int, char *);
++void Strinsert_charp(Str, int, const char *);
+ void Strdelete(Str, int, int);
+ void Strtruncate(Str, int);
+ void Strlower(Str);
+diff --git a/acinclude.m4 b/acinclude.m4
+index e4ccc3d..ed1035d 100644
+--- a/acinclude.m4
++++ b/acinclude.m4
+@@ -6,7 +6,8 @@ dnl w3m autoconf macros
+ AC_DEFUN([AC_W3M_VERSION],
+ [AC_SUBST(CURRENT_VERSION)
+ cvsver=`$AWK '\$[1] ~ /Id:/ { print \$[3]}' $srcdir/ChangeLog`
+- sed -e 's/define CURRENT_VERSION "\(.*\)+cvs/define CURRENT_VERSION "\1+cvs-'$cvsver'/' $srcdir/version.c.in > version.c
++ ymdver=`sed -e 's/ .*//;s/-//g;q' $srcdir/ChangeLog`
++ sed -e 's/define CURRENT_VERSION "\(.*\)YYYYMMDD/define CURRENT_VERSION "\1'$ymdver'/;s/define CURRENT_VERSION "\(.*\)+cvs/define CURRENT_VERSION "\1+cvs-'$cvsver'/' $srcdir/version.c.in > version.c
+ CURRENT_VERSION=`sed -n 's/.*define CURRENT_VERSION *"w3m\/\(.*\)".*$/\1/p' version.c`])
+ #
+ # ----------------------------------------------------------------
+@@ -330,10 +331,10 @@ AC_DEFINE_UNQUOTED(DEF_MAILER, "$w3m_mailer")])
+ # ----------------------------------------------------------------
+ AC_DEFUN([AC_W3M_EXT_BROWSER],
+ [AC_SUBST(DEF_EXT_BROWSER)
+-w3m_browser="/usr/bin/mozilla"
++w3m_browser="/usr/bin/firefox"
+ AC_MSG_CHECKING(which external browser is used by default)
+ AC_ARG_WITH(browser,
+- [ --with-browser=BROWSER default browser (/usr/bin/mozilla)],
++ [ --with-browser=BROWSER default browser (/usr/bin/firefox)],
+ [w3m_browser="$with_browser"])
+ AC_MSG_RESULT($w3m_browser)
+ AC_DEFINE_UNQUOTED(DEF_EXT_BROWSER, "$w3m_browser")])
+@@ -400,10 +401,10 @@ AC_DEFUN([AC_W3M_TERMLIB],
+ AC_ARG_WITH(termlib,
+ [ --with-termlib[=LIBS] terminal library
+ LIBS is space separated list of:
+- terminfo mytinfo termcap ncurses curses],,
++ terminfo mytinfo termcap tinfo ncurses curses],,
+ [with_termlib="yes"])
+ AC_MSG_RESULT($with_termlib)
+- test x"$with_termlib" = xyes && with_termlib="terminfo mytinfo termlib termcap ncurses curses"
++ test x"$with_termlib" = xyes && with_termlib="terminfo mytinfo termlib termcap tinfo ncurses curses"
+ for lib in $with_termlib; do
+ AC_CHECK_LIB($lib, tgetent, [W3M_LIBS="$W3M_LIBS -l$lib"; break])
+ done
+@@ -600,7 +601,7 @@ AC_DEFUN([AC_W3M_IMAGE],
+ if test x"$enable_image" = xyes; then
+ enable_image=x11
+ case "`uname -s`" in
+- Linux|linux|LINUX)
++ Linux|linux|LINUX|FreeBSD|freebsd|FREEBSD)
+ if test -c /dev/fb0; then
+ enable_image=x11,fb
+ fi;;
+@@ -649,6 +650,9 @@ AC_DEFUN([AC_W3M_IMAGE],
+ fi;;
+ imlib2)
+ with_imlib2="yes"
++ if test x"$PKG_CONFIG" = x; then
++ PKG_CONFIG=pkg-config
++ fi
+ if test x"$IMLIB2_CONFIG" = x; then
+ IMLIB2_CONFIG=imlib2-config
+ fi;;
+@@ -661,8 +665,6 @@ AC_DEFUN([AC_W3M_IMAGE],
+ with_gtk2="yes"
+ if test x"$PKG_CONFIG" = x; then
+ PKG_CONFIG=pkg-config
+- else
+- PKG_CONFIG=:
+ fi;;
+ esac
+ done
+@@ -705,8 +707,8 @@ AC_DEFUN([AC_W3M_IMAGE],
+ IMGTARGETS="x11"
+ AC_DEFINE(USE_GDKPIXBUF)
+ AC_DEFINE(USE_GTK2)
+- IMGX11CFLAGS="`${PKG_CONFIG} --cflags gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0 gtk+-2.0`"
+- IMGX11LDFLAGS="`${PKG_CONFIG} --libs gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0 gtk+-2.0`"
++ IMGX11CFLAGS="`${PKG_CONFIG} --cflags gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0`"
++ IMGX11LDFLAGS="-lX11 `${PKG_CONFIG} --libs gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0`"
+ elif test x"$have_gdkpixbuf" = xyes; then
+ AC_DEFINE(USE_W3MIMG_X11)
+ IMGOBJS="$IMGOBJS x11/x11_w3mimg.o"
+@@ -728,7 +730,7 @@ AC_DEFUN([AC_W3M_IMAGE],
+ IMGTARGETS="x11"
+ AC_DEFINE(USE_IMLIB2)
+ IMGX11CFLAGS="`${IMLIB2_CONFIG} --cflags`"
+- IMGX11LDFLAGS="`${IMLIB2_CONFIG} --libs`"
++ IMGX11LDFLAGS="-lX11 `${PKG_CONFIG} --libs imlib2`"
+ else
+ AC_MSG_WARN([unable to build w3mimgdisplay with X11 support])
+ fi
+@@ -740,8 +742,8 @@ AC_DEFUN([AC_W3M_IMAGE],
+ IMGTARGETS="${IMGTARGETS} fb"
+ AC_DEFINE(USE_GDKPIXBUF)
+ AC_DEFINE(USE_GTK2)
+- IMGFBCFLAGS="`${PKG_CONFIG} --cflags gdk-pixbuf-2.0 gtk+-2.0`"
+- IMGFBLDFLAGS="`${PKG_CONFIG} --libs gdk-pixbuf-2.0 gtk+-2.0`"
++ IMGFBCFLAGS="`${PKG_CONFIG} --cflags gdk-pixbuf-2.0`"
++ IMGFBLDFLAGS="`${PKG_CONFIG} --libs gdk-pixbuf-2.0`"
+ elif test x"$have_gdkpixbuf" = xyes; then
+ AC_DEFINE(USE_W3MIMG_FB)
+ IMGOBJS="$IMGOBJS fb/fb_w3mimg.o fb/fb.o fb/fb_img.o"
+@@ -756,7 +758,7 @@ AC_DEFUN([AC_W3M_IMAGE],
+ AC_DEFINE(USE_IMLIB2)
+ IMGOBJS="$IMGOBJS fb/fb_w3mimg.o fb/fb.o fb/fb_img.o"
+ IMGFBCFLAGS="`${IMLIB2_CONFIG} --cflags`"
+- IMGFBLDFLAGS="`${IMLIB2_CONFIG} --libs`"
++ IMGFBLDFLAGS="`${PKG_CONFIG} --libs imlib2`"
+ else
+ AC_MSG_WARN([unable to build w3mimgdisplay with FB support])
+ fi
+@@ -866,7 +868,7 @@ AC_MSG_CHECKING(for sys_errlist)
+ AC_TRY_COMPILE(
+ changequote(<<,>>)dnl
+ <<extern char *sys_errlist[];>>,
+-<<printf(sys_errlist[0]);>>,
++<<printf("%s", sys_errlist[0]);>>,
+ changequote([,])dnl
+ [have_sys_errlist="yes"; AC_DEFINE(HAVE_SYS_ERRLIST)],
+ [have_sys_errlist="no"])
+diff --git a/alloc.h b/alloc.h
+new file mode 100644
+index 0000000..fa0d391
+--- /dev/null
++++ b/alloc.h
+@@ -0,0 +1,39 @@
++/*
++ * by Scarlett. public domain.
++ * replacements for w3m's allocation macros which add overflow
++ * detection and concentrate the macros in one file
++ */
++#ifndef W3_ALLOC_H
++#define W3_ALLOC_H
++#include <gc.h>
++#include <stdlib.h>
++#include <stdio.h>
++#include <limits.h>
++
++static inline size_t
++z_mult_no_oflow_(size_t n, size_t size)
++{
++ if (size != 0 && n > ULONG_MAX / size) {
++ fprintf(stderr,
++ "w3m: overflow in malloc, %lu*%lu\n", (unsigned long)n, (unsigned long)size);
++ exit(1);
++ }
++ return n * size;
++}
++
++#define New(type) \
++ (GC_MALLOC(sizeof(type)))
++
++#define NewAtom(type) \
++ (GC_MALLOC_ATOMIC(sizeof(type)))
++
++#define New_N(type, n) \
++ (GC_MALLOC(z_mult_no_oflow_((n), sizeof(type))))
++
++#define NewAtom_N(type, n) \
++ (GC_MALLOC_ATOMIC(z_mult_no_oflow_((n), sizeof(type))))
++
++#define New_Reuse(type, ptr, n) \
++ (GC_REALLOC((ptr), z_mult_no_oflow_((n), sizeof(type))))
++
++#endif /* W3_ALLOC_H */
+diff --git a/anchor.c b/anchor.c
+index 27bbd56..fa8d3eb 100644
+--- a/anchor.c
++++ b/anchor.c
+@@ -11,7 +11,7 @@ putAnchor(AnchorList *al, char *url, char *target, Anchor **anchor_return,
+ {
+ int n, i, j;
+ Anchor *a;
+- BufferPoint bp;
++ BufferPoint bp = { 0 };
+ if (al == NULL) {
+ al = New(AnchorList);
+ al->anchors = NULL;
+@@ -200,10 +200,11 @@ _put_anchor_news(Buffer *buf, char *p1, char *p2, int line, int pos)
+ if (*(p2 - 1) == '>')
+ p2--;
+ }
+- tmp = wc_Str_conv_strict(Strnew_charp_n(p1, p2 - p1), InnerCharset,
+- buf->document_charset);
+- tmp = Sprintf("news:%s", file_quote(tmp->ptr));
+- return registerHref(buf, tmp->ptr, NULL, NO_REFERER, NULL, '\0', line,
++ tmp = Strnew_charp("news:");
++ Strcat_charp_n(tmp, p1, p2 - p1);
++ return registerHref(buf, url_encode(tmp->ptr, baseURL(buf),
++ buf->document_charset),
++ NULL, NO_REFERER, NULL, '\0', line,
+ pos);
+ }
+ #endif /* USE_NNTP */
+@@ -213,9 +214,10 @@ _put_anchor_all(Buffer *buf, char *p1, char *p2, int line, int pos)
+ {
+ Str tmp;
+
+- tmp = wc_Str_conv_strict(Strnew_charp_n(p1, p2 - p1), InnerCharset,
+- buf->document_charset);
+- return registerHref(buf, url_quote(tmp->ptr), NULL, NO_REFERER, NULL,
++ tmp = Strnew_charp_n(p1, p2 - p1);
++ return registerHref(buf, url_encode(tmp->ptr, baseURL(buf),
++ buf->document_charset),
++ NULL, NO_REFERER, NULL,
+ '\0', line, pos);
+ }
+
+@@ -641,7 +643,6 @@ addMultirowsForm(Buffer *buf, AnchorList *al)
+ {
+ int i, j, k, col, ecol, pos;
+ Anchor a_form, *a;
+- FormItemList *fi;
+ Line *l, *ls;
+
+ if (al == NULL || al->nanchor == 0)
+@@ -668,7 +669,6 @@ addMultirowsForm(Buffer *buf, AnchorList *al)
+ if (!ls)
+ continue;
+ }
+- fi = (FormItemList *)a_form.url;
+ col = COLPOS(ls, a_form.start.pos);
+ ecol = COLPOS(ls, a_form.end.pos);
+ for (j = 0; l && j < a_form.rows; l = l->next, j++) {
+@@ -685,6 +685,8 @@ addMultirowsForm(Buffer *buf, AnchorList *al)
+ a->hseq = a_form.hseq;
+ a->y = a_form.y;
+ a->end.pos = pos + ecol - col;
++ if (pos < 1 || a->end.pos >= l->size)
++ continue;
+ l->lineBuf[pos - 1] = '[';
+ l->lineBuf[a->end.pos] = ']';
+ for (k = pos; k < a->end.pos; k++)
+@@ -756,7 +758,7 @@ link_list_panel(Buffer *buf)
+ p = parsedURL2Str(&pu)->ptr;
+ u = html_quote(p);
+ if (DecodeURL)
+- p = html_quote(url_unquote_conv(p, buf->document_charset));
++ p = html_quote(url_decode2(p, buf));
+ else
+ p = u;
+ }
+@@ -787,7 +789,7 @@ link_list_panel(Buffer *buf)
+ p = parsedURL2Str(&pu)->ptr;
+ u = html_quote(p);
+ if (DecodeURL)
+- p = html_quote(url_unquote_conv(p, buf->document_charset));
++ p = html_quote(url_decode2(p, buf));
+ else
+ p = u;
+ t = getAnchorText(buf, al, a);
+@@ -809,16 +811,13 @@ link_list_panel(Buffer *buf)
+ p = parsedURL2Str(&pu)->ptr;
+ u = html_quote(p);
+ if (DecodeURL)
+- p = html_quote(url_unquote_conv(p, buf->document_charset));
++ p = html_quote(url_decode2(p, buf));
+ else
+ p = u;
+ if (a->title && *a->title)
+ t = html_quote(a->title);
+- else if (DecodeURL)
+- t = html_quote(url_unquote_conv
+- (a->url, buf->document_charset));
+ else
+- t = html_quote(a->url);
++ t = html_quote(url_decode2(a->url, buf));
+ Strcat_m_charp(tmp, "<li><a href=\"", u, "\">", t, "</a><br>", p,
+ "\n", NULL);
+ a = retrieveAnchor(buf->formitem, a->start.line, a->start.pos);
+@@ -842,19 +841,13 @@ link_list_panel(Buffer *buf)
+ p = parsedURL2Str(&pu)->ptr;
+ u = html_quote(p);
+ if (DecodeURL)
+- p = html_quote(url_unquote_conv(p,
+- buf->
+- document_charset));
++ p = html_quote(url_decode2(p, buf));
+ else
+ p = u;
+ if (m->alt && *m->alt)
+ t = html_quote(m->alt);
+- else if (DecodeURL)
+- t = html_quote(url_unquote_conv(m->url,
+- buf->
+- document_charset));
+ else
+- t = html_quote(m->url);
++ t = html_quote(url_decode2(m->url, buf));
+ Strcat_m_charp(tmp, "<li><a href=\"", u, "\">", t,
+ "</a><br>", p, "\n", NULL);
+ }
+diff --git a/buffer.c b/buffer.c
+index 5afc26a..3b2352a 100644
+--- a/buffer.c
++++ b/buffer.c
+@@ -705,6 +705,7 @@ readBufferCache(Buffer *buf)
+
+ cache = fopen(buf->savecache, "r");
+ if (cache == NULL || fread1(clnum, cache) || fread1(tlnum, cache)) {
++ fclose(cache);
+ buf->savecache = NULL;
+ return -1;
+ }
+@@ -760,8 +761,10 @@ readBufferCache(Buffer *buf)
+ }
+ #endif
+ }
+- buf->lastLine = prevl;
+- buf->lastLine->next = NULL;
++ if (prevl) {
++ buf->lastLine = prevl;
++ buf->lastLine->next = NULL;
++ }
+ fclose(cache);
+ unlink(buf->savecache);
+ buf->savecache = NULL;
+diff --git a/config.guess b/config.guess
+index 51fab47..0967f2a 100755
+--- a/config.guess
++++ b/config.guess
+@@ -1,13 +1,12 @@
+ #! /bin/sh
+ # Attempt to guess a canonical system name.
+-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+-# 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
++# Copyright 1992-2016 Free Software Foundation, Inc.
+
+-timestamp='2004-03-12'
++timestamp='2016-04-02'
+
+ # This file is free software; you can redistribute it and/or modify it
+ # under the terms of the GNU General Public License as published by
+-# the Free Software Foundation; either version 2 of the License, or
++# the Free Software Foundation; either version 3 of the License, or
+ # (at your option) any later version.
+ #
+ # This program is distributed in the hope that it will be useful, but
+@@ -16,24 +15,22 @@ timestamp='2004-03-12'
+ # General Public License for more details.
+ #
+ # You should have received a copy of the GNU General Public License
+-# along with this program; if not, write to the Free Software
+-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++# along with this program; if not, see <http://www.gnu.org/licenses/>.
+ #
+ # As a special exception to the GNU General Public License, if you
+ # distribute this file as part of a program that contains a
+ # configuration script generated by Autoconf, you may include it under
+-# the same distribution terms that you use for the rest of that program.
+-
+-# Originally written by Per Bothner <per@bothner.com>.
+-# Please send patches to <config-patches@gnu.org>. Submit a context
+-# diff and a properly formatted ChangeLog entry.
++# the same distribution terms that you use for the rest of that
++# program. This Exception is an additional permission under section 7
++# of the GNU General Public License, version 3 ("GPLv3").
++#
++# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
+ #
+-# This script attempts to guess a canonical system name similar to
+-# config.sub. If it succeeds, it prints the system name on stdout, and
+-# exits with 0. Otherwise, it exits with 1.
++# You can get the latest version of this script from:
++# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
+ #
+-# The plan is that this can be called by configure scripts if you
+-# don't specify an explicit build system type.
++# Please send patches to <config-patches@gnu.org>.
++
+
+ me=`echo "$0" | sed -e 's,.*/,,'`
+
+@@ -53,8 +50,7 @@ version="\
+ GNU config.guess ($timestamp)
+
+ Originally written by Per Bothner.
+-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+-Free Software Foundation, Inc.
++Copyright 1992-2016 Free Software Foundation, Inc.
+
+ This is free software; see the source for copying conditions. There is NO
+ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+@@ -66,11 +62,11 @@ Try \`$me --help' for more information."
+ while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+- echo "$timestamp" ; exit 0 ;;
++ echo "$timestamp" ; exit ;;
+ --version | -v )
+- echo "$version" ; exit 0 ;;
++ echo "$version" ; exit ;;
+ --help | --h* | -h )
+- echo "$usage"; exit 0 ;;
++ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+@@ -104,7 +100,7 @@ set_cc_for_build='
+ trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+ trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+ : ${TMPDIR=/tmp} ;
+- { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
++ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+@@ -123,7 +119,7 @@ case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+-esac ;'
++esac ; set_cc_for_build= ;'
+
+ # This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+ # (ghazi@noc.rutgers.edu 1994-08-24)
+@@ -136,12 +132,33 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+ UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+ UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
++case "${UNAME_SYSTEM}" in
++Linux|GNU|GNU/*)
++ # If the system lacks a compiler, then just pick glibc.
++ # We could probably try harder.
++ LIBC=gnu
++
++ eval $set_cc_for_build
++ cat <<-EOF > $dummy.c
++ #include <features.h>
++ #if defined(__UCLIBC__)
++ LIBC=uclibc
++ #elif defined(__dietlibc__)
++ LIBC=dietlibc
++ #else
++ LIBC=gnu
++ #endif
++ EOF
++ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
++ ;;
++esac
++
+ # Note: order is significant - the case branches are not exclusive.
+
+ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+- # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
++ # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+@@ -151,22 +168,30 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ sysctl="sysctl -n hw.machine_arch"
+- UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+- /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
++ UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
++ /sbin/$sysctl 2>/dev/null || \
++ /usr/sbin/$sysctl 2>/dev/null || \
++ echo unknown)`
+ case "${UNAME_MACHINE_ARCH}" in
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
++ sh5el) machine=sh5le-unknown ;;
++ earmv*)
++ arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
++ endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'`
++ machine=${arch}${endian}-unknown
++ ;;
+ *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently, or will in the future.
+ case "${UNAME_MACHINE_ARCH}" in
+- arm*|i386|m68k|ns32k|sh3*|sparc|vax)
++ arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ eval $set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+- | grep __ELF__ >/dev/null
++ | grep -q __ELF__
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+@@ -176,7 +201,14 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ fi
+ ;;
+ *)
+- os=netbsd
++ os=netbsd
++ ;;
++ esac
++ # Determine ABI tags.
++ case "${UNAME_MACHINE_ARCH}" in
++ earm*)
++ expr='s/^earmv[0-9]/-eabi/;s/eb$//'
++ abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"`
+ ;;
+ esac
+ # The OS release
+@@ -189,78 +221,48 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ release='-gnu'
+ ;;
+ *)
+- release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
++ release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+- echo "${machine}-${os}${release}"
+- exit 0 ;;
+- amd64:OpenBSD:*:*)
+- echo x86_64-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- amiga:OpenBSD:*:*)
+- echo m68k-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- arc:OpenBSD:*:*)
+- echo mipsel-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- cats:OpenBSD:*:*)
+- echo arm-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- hp300:OpenBSD:*:*)
+- echo m68k-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- mac68k:OpenBSD:*:*)
+- echo m68k-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- macppc:OpenBSD:*:*)
+- echo powerpc-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- mvme68k:OpenBSD:*:*)
+- echo m68k-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- mvme88k:OpenBSD:*:*)
+- echo m88k-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- mvmeppc:OpenBSD:*:*)
+- echo powerpc-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- pegasos:OpenBSD:*:*)
+- echo powerpc-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- pmax:OpenBSD:*:*)
+- echo mipsel-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- sgi:OpenBSD:*:*)
+- echo mipseb-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- sun3:OpenBSD:*:*)
+- echo m68k-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- wgrisc:OpenBSD:*:*)
+- echo mipsel-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
++ echo "${machine}-${os}${release}${abi}"
++ exit ;;
++ *:Bitrig:*:*)
++ UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
++ echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
++ exit ;;
+ *:OpenBSD:*:*)
+- echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
++ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
++ echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
++ exit ;;
++ *:LibertyBSD:*:*)
++ UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
++ echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE}
++ exit ;;
+ *:ekkoBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
++ *:SolidBSD:*:*)
++ echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
++ exit ;;
+ macppc:MirBSD:*:*)
+- echo powerppc-unknown-mirbsd${UNAME_RELEASE}
+- exit 0 ;;
++ echo powerpc-unknown-mirbsd${UNAME_RELEASE}
++ exit ;;
+ *:MirBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
++ *:Sortix:*:*)
++ echo ${UNAME_MACHINE}-unknown-sortix
++ exit ;;
+ alpha:OSF1:*:*)
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ ;;
+ *5.*)
+- UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
++ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+@@ -270,76 +272,82 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case "$ALPHA_CPU_TYPE" in
+ "EV4 (21064)")
+- UNAME_MACHINE="alpha" ;;
++ UNAME_MACHINE=alpha ;;
+ "EV4.5 (21064)")
+- UNAME_MACHINE="alpha" ;;
++ UNAME_MACHINE=alpha ;;
+ "LCA4 (21066/21068)")
+- UNAME_MACHINE="alpha" ;;
++ UNAME_MACHINE=alpha ;;
+ "EV5 (21164)")
+- UNAME_MACHINE="alphaev5" ;;
++ UNAME_MACHINE=alphaev5 ;;
+ "EV5.6 (21164A)")
+- UNAME_MACHINE="alphaev56" ;;
++ UNAME_MACHINE=alphaev56 ;;
+ "EV5.6 (21164PC)")
+- UNAME_MACHINE="alphapca56" ;;
++ UNAME_MACHINE=alphapca56 ;;
+ "EV5.7 (21164PC)")
+- UNAME_MACHINE="alphapca57" ;;
++ UNAME_MACHINE=alphapca57 ;;
+ "EV6 (21264)")
+- UNAME_MACHINE="alphaev6" ;;
++ UNAME_MACHINE=alphaev6 ;;
+ "EV6.7 (21264A)")
+- UNAME_MACHINE="alphaev67" ;;
++ UNAME_MACHINE=alphaev67 ;;
+ "EV6.8CB (21264C)")
+- UNAME_MACHINE="alphaev68" ;;
++ UNAME_MACHINE=alphaev68 ;;
+ "EV6.8AL (21264B)")
+- UNAME_MACHINE="alphaev68" ;;
++ UNAME_MACHINE=alphaev68 ;;
+ "EV6.8CX (21264D)")
+- UNAME_MACHINE="alphaev68" ;;
++ UNAME_MACHINE=alphaev68 ;;
+ "EV6.9A (21264/EV69A)")
+- UNAME_MACHINE="alphaev69" ;;
++ UNAME_MACHINE=alphaev69 ;;
+ "EV7 (21364)")
+- UNAME_MACHINE="alphaev7" ;;
++ UNAME_MACHINE=alphaev7 ;;
+ "EV7.9 (21364A)")
+- UNAME_MACHINE="alphaev79" ;;
++ UNAME_MACHINE=alphaev79 ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+- echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+- exit 0 ;;
+- Alpha*:OpenVMS:*:*)
+- echo alpha-hp-vms
+- exit 0 ;;
++ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
++ # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
++ exitcode=$?
++ trap '' 0
++ exit $exitcode ;;
+ Alpha\ *:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # Should we change UNAME_MACHINE based on the output of uname instead
+ # of the specific Alpha model?
+ echo alpha-pc-interix
+- exit 0 ;;
++ exit ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+- exit 0 ;;
++ exit ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-unknown-sysv4
+- exit 0;;
++ exit ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-amigaos
+- exit 0 ;;
++ exit ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-morphos
+- exit 0 ;;
++ exit ;;
+ *:OS/390:*:*)
+ echo i370-ibm-openedition
+- exit 0 ;;
++ exit ;;
++ *:z/VM:*:*)
++ echo s390-ibm-zvmoe
++ exit ;;
+ *:OS400:*:*)
+- echo powerpc-ibm-os400
+- exit 0 ;;
++ echo powerpc-ibm-os400
++ exit ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+- exit 0;;
++ exit ;;
++ arm*:riscos:*:*|arm*:RISCOS:*:*)
++ echo arm-unknown-riscos
++ exit ;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+- exit 0;;
++ exit ;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+@@ -347,32 +355,51 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ else
+ echo pyramid-pyramid-bsd
+ fi
+- exit 0 ;;
++ exit ;;
+ NILE*:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+- exit 0 ;;
++ exit ;;
+ DRS?6000:unix:4.0:6*)
+ echo sparc-icl-nx6
+- exit 0 ;;
+- DRS?6000:UNIX_SV:4.2*:7*)
++ exit ;;
++ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+ case `/usr/bin/uname -p` in
+- sparc) echo sparc-icl-nx7 && exit 0 ;;
++ sparc) echo sparc-icl-nx7; exit ;;
+ esac ;;
++ s390x:SunOS:*:*)
++ echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
++ exit ;;
+ sun4H:SunOS:5.*:*)
+ echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+- exit 0 ;;
++ exit ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+- exit 0 ;;
+- i86pc:SunOS:5.*:*)
+- echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+- exit 0 ;;
++ exit ;;
++ i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
++ echo i386-pc-auroraux${UNAME_RELEASE}
++ exit ;;
++ i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
++ eval $set_cc_for_build
++ SUN_ARCH=i386
++ # If there is a compiler, see if it is configured for 64-bit objects.
++ # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
++ # This test works for both compilers.
++ if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
++ if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
++ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
++ grep IS_64BIT_ARCH >/dev/null
++ then
++ SUN_ARCH=x86_64
++ fi
++ fi
++ echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
++ exit ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+- exit 0 ;;
++ exit ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+@@ -381,13 +408,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+- exit 0 ;;
++ exit ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+- test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
++ test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3
+ case "`/bin/arch`" in
+ sun3)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+@@ -396,10 +423,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ echo sparc-sun-sunos${UNAME_RELEASE}
+ ;;
+ esac
+- exit 0 ;;
++ exit ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+@@ -409,41 +436,41 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+- echo m68k-atari-mint${UNAME_RELEASE}
+- exit 0 ;;
++ echo m68k-atari-mint${UNAME_RELEASE}
++ exit ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+- echo m68k-atari-mint${UNAME_RELEASE}
+- exit 0 ;;
++ echo m68k-atari-mint${UNAME_RELEASE}
++ exit ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+- echo m68k-milan-mint${UNAME_RELEASE}
+- exit 0 ;;
++ echo m68k-milan-mint${UNAME_RELEASE}
++ exit ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+- echo m68k-hades-mint${UNAME_RELEASE}
+- exit 0 ;;
++ echo m68k-hades-mint${UNAME_RELEASE}
++ exit ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+- echo m68k-unknown-mint${UNAME_RELEASE}
+- exit 0 ;;
++ echo m68k-unknown-mint${UNAME_RELEASE}
++ exit ;;
+ m68k:machten:*:*)
+ echo m68k-apple-machten${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+- exit 0 ;;
++ exit ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ echo clipper-intergraph-clix${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+@@ -467,35 +494,36 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ exit (-1);
+ }
+ EOF
+- $CC_FOR_BUILD -o $dummy $dummy.c \
+- && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+- && exit 0
++ $CC_FOR_BUILD -o $dummy $dummy.c &&
++ dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
++ SYSTEM_NAME=`$dummy $dummyarg` &&
++ { echo "$SYSTEM_NAME"; exit; }
+ echo mips-mips-riscos${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ Motorola:PowerMAX_OS:*:*)
+ echo powerpc-motorola-powermax
+- exit 0 ;;
++ exit ;;
+ Motorola:*:4.3:PL8-*)
+ echo powerpc-harris-powermax
+- exit 0 ;;
++ exit ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ echo powerpc-harris-powermax
+- exit 0 ;;
++ exit ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+- exit 0 ;;
++ exit ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+- exit 0 ;;
++ exit ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+- exit 0 ;;
++ exit ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+- exit 0 ;;
++ exit ;;
+ AViiON:dgux:*:*)
+- # DG/UX returns AViiON for all architectures
+- UNAME_PROCESSOR=`/usr/bin/uname -p`
++ # DG/UX returns AViiON for all architectures
++ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+ then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+@@ -508,29 +536,29 @@ EOF
+ else
+ echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+- exit 0 ;;
++ exit ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+- exit 0 ;;
++ exit ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+- exit 0 ;;
++ exit ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+- exit 0 ;;
++ exit ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+- exit 0 ;;
++ exit ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+- exit 0 ;;
++ exit ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+- echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+- exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX '
++ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
++ exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ echo i386-ibm-aix
+- exit 0 ;;
++ exit ;;
+ ia64:AIX:*:*)
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+@@ -538,7 +566,7 @@ EOF
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+- exit 0 ;;
++ exit ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ eval $set_cc_for_build
+@@ -553,49 +581,54 @@ EOF
+ exit(0);
+ }
+ EOF
+- $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
+- echo rs6000-ibm-aix3.2.5
++ if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
++ then
++ echo "$SYSTEM_NAME"
++ else
++ echo rs6000-ibm-aix3.2.5
++ fi
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+- exit 0 ;;
+- *:AIX:*:[45])
++ exit ;;
++ *:AIX:*:[4567])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+- if [ -x /usr/bin/oslevel ] ; then
+- IBM_REV=`/usr/bin/oslevel`
++ if [ -x /usr/bin/lslpp ] ; then
++ IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
++ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+- exit 0 ;;
++ exit ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+- exit 0 ;;
++ exit ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+- exit 0 ;;
++ exit ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+- exit 0 ;; # report: romp-ibm BSD 4.3
++ exit ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+- exit 0 ;;
++ exit ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+- exit 0 ;;
++ exit ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+- exit 0 ;;
++ exit ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+- exit 0 ;;
++ exit ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ case "${UNAME_MACHINE}" in
+@@ -604,74 +637,84 @@ EOF
+ 9000/[678][0-9][0-9])
+ if [ -x /usr/bin/getconf ]; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+- sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+- case "${sc_cpu_version}" in
+- 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+- 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+- 532) # CPU_PA_RISC2_0
+- case "${sc_kernel_bits}" in
+- 32) HP_ARCH="hppa2.0n" ;;
+- 64) HP_ARCH="hppa2.0w" ;;
+- '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
+- esac ;;
+- esac
++ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
++ case "${sc_cpu_version}" in
++ 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
++ 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
++ 532) # CPU_PA_RISC2_0
++ case "${sc_kernel_bits}" in
++ 32) HP_ARCH=hppa2.0n ;;
++ 64) HP_ARCH=hppa2.0w ;;
++ '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20
++ esac ;;
++ esac
+ fi
+ if [ "${HP_ARCH}" = "" ]; then
+ eval $set_cc_for_build
+- sed 's/^ //' << EOF >$dummy.c
++ sed 's/^ //' << EOF >$dummy.c
+
+- #define _HPUX_SOURCE
+- #include <stdlib.h>
+- #include <unistd.h>
++ #define _HPUX_SOURCE
++ #include <stdlib.h>
++ #include <unistd.h>
+
+- int main ()
+- {
+- #if defined(_SC_KERNEL_BITS)
+- long bits = sysconf(_SC_KERNEL_BITS);
+- #endif
+- long cpu = sysconf (_SC_CPU_VERSION);
++ int main ()
++ {
++ #if defined(_SC_KERNEL_BITS)
++ long bits = sysconf(_SC_KERNEL_BITS);
++ #endif
++ long cpu = sysconf (_SC_CPU_VERSION);
+
+- switch (cpu)
+- {
+- case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+- case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+- case CPU_PA_RISC2_0:
+- #if defined(_SC_KERNEL_BITS)
+- switch (bits)
+- {
+- case 64: puts ("hppa2.0w"); break;
+- case 32: puts ("hppa2.0n"); break;
+- default: puts ("hppa2.0"); break;
+- } break;
+- #else /* !defined(_SC_KERNEL_BITS) */
+- puts ("hppa2.0"); break;
+- #endif
+- default: puts ("hppa1.0"); break;
+- }
+- exit (0);
+- }
++ switch (cpu)
++ {
++ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
++ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
++ case CPU_PA_RISC2_0:
++ #if defined(_SC_KERNEL_BITS)
++ switch (bits)
++ {
++ case 64: puts ("hppa2.0w"); break;
++ case 32: puts ("hppa2.0n"); break;
++ default: puts ("hppa2.0"); break;
++ } break;
++ #else /* !defined(_SC_KERNEL_BITS) */
++ puts ("hppa2.0"); break;
++ #endif
++ default: puts ("hppa1.0"); break;
++ }
++ exit (0);
++ }
+ EOF
+- (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
++ (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+- if [ ${HP_ARCH} = "hppa2.0w" ]
++ if [ ${HP_ARCH} = hppa2.0w ]
+ then
+- # avoid double evaluation of $set_cc_for_build
+- test -n "$CC_FOR_BUILD" || eval $set_cc_for_build
+- if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null
++ eval $set_cc_for_build
++
++ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
++ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
++ # generating 64-bit code. GNU and HP use different nomenclature:
++ #
++ # $ CC_FOR_BUILD=cc ./config.guess
++ # => hppa2.0w-hp-hpux11.23
++ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
++ # => hppa64-hp-hpux11.23
++
++ if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
++ grep -q __LP64__
+ then
+- HP_ARCH="hppa2.0w"
++ HP_ARCH=hppa2.0w
+ else
+- HP_ARCH="hppa64"
++ HP_ARCH=hppa64
+ fi
+ fi
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+- exit 0 ;;
++ exit ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ia64-hp-hpux${HPUX_REV}
+- exit 0 ;;
++ exit ;;
+ 3050*:HI-UX:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+@@ -699,340 +742,351 @@ EOF
+ exit (0);
+ }
+ EOF
+- $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
++ $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
++ { echo "$SYSTEM_NAME"; exit; }
+ echo unknown-hitachi-hiuxwe2
+- exit 0 ;;
++ exit ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+- exit 0 ;;
++ exit ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+- exit 0 ;;
++ exit ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ echo hppa1.0-hp-mpeix
+- exit 0 ;;
++ exit ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+- exit 0 ;;
++ exit ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+- exit 0 ;;
++ exit ;;
+ i*86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+- exit 0 ;;
++ exit ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+- exit 0 ;;
++ exit ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+- exit 0 ;;
++ exit ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+- exit 0 ;;
++ exit ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+- exit 0 ;;
++ exit ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+- exit 0 ;;
++ exit ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+- exit 0 ;;
++ exit ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+- exit 0 ;;
++ exit ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+- exit 0 ;;
++ exit ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+- exit 0 ;;
++ exit ;;
+ CRAY*T3E:*:*:*)
+ echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+- exit 0 ;;
++ exit ;;
+ CRAY*SV1:*:*:*)
+ echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+- exit 0 ;;
++ exit ;;
+ *:UNICOS/mp:*:*)
+- echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+- exit 0 ;;
++ echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
++ exit ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+- FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+- FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+- echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+- exit 0 ;;
++ FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
++ FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
++ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
++ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
++ exit ;;
+ 5000:UNIX_System_V:4.*:*)
+- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+- FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+- echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+- exit 0 ;;
++ FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
++ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
++ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
++ exit ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ sparc*:BSD/OS:*:*)
+ echo sparc-unknown-bsdi${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ *:FreeBSD:*:*)
+- # Determine whether the default compiler uses glibc.
+- eval $set_cc_for_build
+- sed 's/^ //' << EOF >$dummy.c
+- #include <features.h>
+- #if __GLIBC__ >= 2
+- LIBC=gnu
+- #else
+- LIBC=
+- #endif
+-EOF
+- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+- # GNU/KFreeBSD systems have a "k" prefix to indicate we are using
+- # FreeBSD's kernel, but not the complete OS.
+- case ${LIBC} in gnu) kernel_only='k' ;; esac
+- echo ${UNAME_MACHINE}-unknown-${kernel_only}freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC}
+- exit 0 ;;
++ UNAME_PROCESSOR=`/usr/bin/uname -p`
++ case ${UNAME_PROCESSOR} in
++ amd64)
++ echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
++ *)
++ echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
++ esac
++ exit ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin
+- exit 0 ;;
+- i*:MINGW*:*)
++ exit ;;
++ *:MINGW64*:*)
++ echo ${UNAME_MACHINE}-pc-mingw64
++ exit ;;
++ *:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+- exit 0 ;;
++ exit ;;
++ *:MSYS*:*)
++ echo ${UNAME_MACHINE}-pc-msys
++ exit ;;
++ i*:windows32*:*)
++ # uname -m includes "-pc" on this system.
++ echo ${UNAME_MACHINE}-mingw32
++ exit ;;
+ i*:PW*:*)
+ echo ${UNAME_MACHINE}-pc-pw32
+- exit 0 ;;
+- x86:Interix*:[34]*)
+- echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//'
+- exit 0 ;;
++ exit ;;
++ *:Interix*:*)
++ case ${UNAME_MACHINE} in
++ x86)
++ echo i586-pc-interix${UNAME_RELEASE}
++ exit ;;
++ authenticamd | genuineintel | EM64T)
++ echo x86_64-unknown-interix${UNAME_RELEASE}
++ exit ;;
++ IA64)
++ echo ia64-unknown-interix${UNAME_RELEASE}
++ exit ;;
++ esac ;;
+ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+ echo i${UNAME_MACHINE}-pc-mks
+- exit 0 ;;
++ exit ;;
++ 8664:Windows_NT:*)
++ echo x86_64-pc-mks
++ exit ;;
+ i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+ # UNAME_MACHINE based on the output of uname instead of i386?
+ echo i586-pc-interix
+- exit 0 ;;
++ exit ;;
+ i*:UWIN*:*)
+ echo ${UNAME_MACHINE}-pc-uwin
+- exit 0 ;;
++ exit ;;
++ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
++ echo x86_64-unknown-cygwin
++ exit ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin
+- exit 0 ;;
++ exit ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+- exit 0 ;;
++ exit ;;
+ *:GNU:*:*)
+ # the GNU system
+- echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+- exit 0 ;;
++ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
++ exit ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+- echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+- exit 0 ;;
++ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
++ exit ;;
+ i*86:Minix:*:*)
+ echo ${UNAME_MACHINE}-pc-minix
+- exit 0 ;;
++ exit ;;
++ aarch64:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
++ aarch64_be:Linux:*:*)
++ UNAME_MACHINE=aarch64_be
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
++ alpha:Linux:*:*)
++ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
++ EV5) UNAME_MACHINE=alphaev5 ;;
++ EV56) UNAME_MACHINE=alphaev56 ;;
++ PCA56) UNAME_MACHINE=alphapca56 ;;
++ PCA57) UNAME_MACHINE=alphapca56 ;;
++ EV6) UNAME_MACHINE=alphaev6 ;;
++ EV67) UNAME_MACHINE=alphaev67 ;;
++ EV68*) UNAME_MACHINE=alphaev68 ;;
++ esac
++ objdump --private-headers /bin/sh | grep -q ld.so.1
++ if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
++ arc:Linux:*:* | arceb:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
+ arm*:Linux:*:*)
+- echo ${UNAME_MACHINE}-unknown-linux-gnu
+- exit 0 ;;
++ eval $set_cc_for_build
++ if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
++ | grep -q __ARM_EABI__
++ then
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ else
++ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
++ | grep -q __ARM_PCS_VFP
++ then
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
++ else
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
++ fi
++ fi
++ exit ;;
++ avr32*:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
+ cris:Linux:*:*)
+- echo cris-axis-linux-gnu
+- exit 0 ;;
++ echo ${UNAME_MACHINE}-axis-linux-${LIBC}
++ exit ;;
++ crisv32:Linux:*:*)
++ echo ${UNAME_MACHINE}-axis-linux-${LIBC}
++ exit ;;
++ e2k:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
++ frv:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
++ hexagon:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
++ i*86:Linux:*:*)
++ echo ${UNAME_MACHINE}-pc-linux-${LIBC}
++ exit ;;
+ ia64:Linux:*:*)
+- echo ${UNAME_MACHINE}-unknown-linux-gnu
+- exit 0 ;;
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
++ k1om:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
+ m32r*:Linux:*:*)
+- echo ${UNAME_MACHINE}-unknown-linux-gnu
+- exit 0 ;;
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
+ m68*:Linux:*:*)
+- echo ${UNAME_MACHINE}-unknown-linux-gnu
+- exit 0 ;;
+- mips:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
++ mips:Linux:*:* | mips64:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+- #undef mips
+- #undef mipsel
++ #undef ${UNAME_MACHINE}
++ #undef ${UNAME_MACHINE}el
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+- CPU=mipsel
++ CPU=${UNAME_MACHINE}el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+- CPU=mips
++ CPU=${UNAME_MACHINE}
+ #else
+ CPU=
+ #endif
+ #endif
+ EOF
+- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+- test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
++ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
++ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
+ ;;
+- mips64:Linux:*:*)
+- eval $set_cc_for_build
+- sed 's/^ //' << EOF >$dummy.c
+- #undef CPU
+- #undef mips64
+- #undef mips64el
+- #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+- CPU=mips64el
+- #else
+- #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+- CPU=mips64
+- #else
+- CPU=
+- #endif
+- #endif
+-EOF
+- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+- test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
+- ;;
+- ppc:Linux:*:*)
+- echo powerpc-unknown-linux-gnu
+- exit 0 ;;
+- ppc64:Linux:*:*)
+- echo powerpc64-unknown-linux-gnu
+- exit 0 ;;
+- alpha:Linux:*:*)
+- case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+- EV5) UNAME_MACHINE=alphaev5 ;;
+- EV56) UNAME_MACHINE=alphaev56 ;;
+- PCA56) UNAME_MACHINE=alphapca56 ;;
+- PCA57) UNAME_MACHINE=alphapca56 ;;
+- EV6) UNAME_MACHINE=alphaev6 ;;
+- EV67) UNAME_MACHINE=alphaev67 ;;
+- EV68*) UNAME_MACHINE=alphaev68 ;;
+- esac
+- objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+- if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+- echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+- exit 0 ;;
++ openrisc*:Linux:*:*)
++ echo or1k-unknown-linux-${LIBC}
++ exit ;;
++ or32:Linux:*:* | or1k*:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
++ padre:Linux:*:*)
++ echo sparc-unknown-linux-${LIBC}
++ exit ;;
++ parisc64:Linux:*:* | hppa64:Linux:*:*)
++ echo hppa64-unknown-linux-${LIBC}
++ exit ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+- PA7*) echo hppa1.1-unknown-linux-gnu ;;
+- PA8*) echo hppa2.0-unknown-linux-gnu ;;
+- *) echo hppa-unknown-linux-gnu ;;
++ PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
++ PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
++ *) echo hppa-unknown-linux-${LIBC} ;;
+ esac
+- exit 0 ;;
+- parisc64:Linux:*:* | hppa64:Linux:*:*)
+- echo hppa64-unknown-linux-gnu
+- exit 0 ;;
++ exit ;;
++ ppc64:Linux:*:*)
++ echo powerpc64-unknown-linux-${LIBC}
++ exit ;;
++ ppc:Linux:*:*)
++ echo powerpc-unknown-linux-${LIBC}
++ exit ;;
++ ppc64le:Linux:*:*)
++ echo powerpc64le-unknown-linux-${LIBC}
++ exit ;;
++ ppcle:Linux:*:*)
++ echo powerpcle-unknown-linux-${LIBC}
++ exit ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+- echo ${UNAME_MACHINE}-ibm-linux
+- exit 0 ;;
++ echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
++ exit ;;
+ sh64*:Linux:*:*)
+- echo ${UNAME_MACHINE}-unknown-linux-gnu
+- exit 0 ;;
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
+ sh*:Linux:*:*)
+- echo ${UNAME_MACHINE}-unknown-linux-gnu
+- exit 0 ;;
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+- echo ${UNAME_MACHINE}-unknown-linux-gnu
+- exit 0 ;;
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
++ tile*:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
++ vax:Linux:*:*)
++ echo ${UNAME_MACHINE}-dec-linux-${LIBC}
++ exit ;;
+ x86_64:Linux:*:*)
+- echo x86_64-unknown-linux-gnu
+- exit 0 ;;
+- i*86:Linux:*:*)
+- # The BFD linker knows what the default object file format is, so
+- # first see if it will tell us. cd to the root directory to prevent
+- # problems with other programs or directories called `ld' in the path.
+- # Set LC_ALL=C to ensure ld outputs messages in English.
+- ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+- | sed -ne '/supported targets:/!d
+- s/[ ][ ]*/ /g
+- s/.*supported targets: *//
+- s/ .*//
+- p'`
+- case "$ld_supported_targets" in
+- elf32-i386)
+- TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+- ;;
+- a.out-i386-linux)
+- echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+- exit 0 ;;
+- coff-i386)
+- echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+- exit 0 ;;
+- "")
+- # Either a pre-BFD a.out linker (linux-gnuoldld) or
+- # one that does not give us useful --help.
+- echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+- exit 0 ;;
+- esac
+- # Determine whether the default compiler is a.out or elf
+- eval $set_cc_for_build
+- sed 's/^ //' << EOF >$dummy.c
+- #include <features.h>
+- #ifdef __ELF__
+- # ifdef __GLIBC__
+- # if __GLIBC__ >= 2
+- LIBC=gnu
+- # else
+- LIBC=gnulibc1
+- # endif
+- # else
+- LIBC=gnulibc1
+- # endif
+- #else
+- #ifdef __INTEL_COMPILER
+- LIBC=gnu
+- #else
+- LIBC=gnuaout
+- #endif
+- #endif
+- #ifdef __dietlibc__
+- LIBC=dietlibc
+- #endif
+-EOF
+- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+- test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0
+- test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
+- ;;
++ echo ${UNAME_MACHINE}-pc-linux-${LIBC}
++ exit ;;
++ xtensa*:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ echo i386-sequent-sysv4
+- exit 0 ;;
++ exit ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+- # Unixware is an offshoot of SVR4, but it has its own version
+- # number series starting with 2...
+- # I am not positive that other SVR4 systems won't match this,
++ # Unixware is an offshoot of SVR4, but it has its own version
++ # number series starting with 2...
++ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+- # Use sysv4.2uw... so that sysv4* matches it.
++ # Use sysv4.2uw... so that sysv4* matches it.
+ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+- exit 0 ;;
++ exit ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ echo ${UNAME_MACHINE}-pc-os2-emx
+- exit 0 ;;
++ exit ;;
+ i*86:XTS-300:*:STOP)
+ echo ${UNAME_MACHINE}-unknown-stop
+- exit 0 ;;
++ exit ;;
+ i*86:atheos:*:*)
+ echo ${UNAME_MACHINE}-unknown-atheos
+- exit 0 ;;
+- i*86:syllable:*:*)
++ exit ;;
++ i*86:syllable:*:*)
+ echo ${UNAME_MACHINE}-pc-syllable
+- exit 0 ;;
+- i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
++ exit ;;
++ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ i*86:*DOS:*:*)
+ echo ${UNAME_MACHINE}-pc-msdosdjgpp
+- exit 0 ;;
++ exit ;;
+ i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+ UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+@@ -1040,15 +1094,16 @@ EOF
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+ fi
+- exit 0 ;;
+- i*86:*:5:[78]*)
++ exit ;;
++ i*86:*:5:[678]*)
++ # UnixWare 7.x, OpenUNIX and OpenServer 6.
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+- exit 0 ;;
++ exit ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+@@ -1066,73 +1121,86 @@ EOF
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+- exit 0 ;;
++ exit ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+- # uname -m prints for DJGPP always 'pc', but it prints nothing about
+- # the processor, so we play safe by assuming i386.
+- echo i386-pc-msdosdjgpp
+- exit 0 ;;
++ # uname -m prints for DJGPP always 'pc', but it prints nothing about
++ # the processor, so we play safe by assuming i586.
++ # Note: whatever this is, it MUST be the same as what config.sub
++ # prints for the "djgpp" host, or else GDB configure will decide that
++ # this is a cross-build.
++ echo i586-pc-msdosdjgpp
++ exit ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+- exit 0 ;;
++ exit ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+- exit 0 ;;
++ exit ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+- exit 0 ;;
++ exit ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+- exit 0 ;;
++ exit ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ echo m68k-convergent-sysv
+- exit 0 ;;
++ exit ;;
+ M680?0:D-NIX:5.3:*)
+ echo m68k-diab-dnix
+- exit 0 ;;
+- M68*:*:R3V[567]*:*)
+- test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+- 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0)
++ exit ;;
++ M68*:*:R3V[5678]*:*)
++ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
++ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+- && echo i486-ncr-sysv4.3${OS_REL} && exit 0
++ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+- && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
++ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+- && echo i486-ncr-sysv4 && exit 0 ;;
++ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
++ && { echo i486-ncr-sysv4; exit; } ;;
++ NCR*:*:4.2:* | MPRAS*:*:4.2:*)
++ OS_REL='.3'
++ test -r /etc/.relid \
++ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
++ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
++ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
++ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
++ && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
++ /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
++ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+- exit 0 ;;
++ exit ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ rs6000:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+- exit 0 ;;
+- PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
++ exit ;;
++ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+ echo powerpc-unknown-lynxos${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ RM*:ReliantUNIX-*:*:*)
+ echo mips-sni-sysv4
+- exit 0 ;;
++ exit ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+- exit 0 ;;
++ exit ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+@@ -1140,278 +1208,203 @@ EOF
+ else
+ echo ns32k-sni-sysv
+ fi
+- exit 0 ;;
+- PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+- # says <Richard.M.Bartel@ccMail.Census.GOV>
+- echo i586-unisys-sysv4
+- exit 0 ;;
++ exit ;;
++ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
++ # says <Richard.M.Bartel@ccMail.Census.GOV>
++ echo i586-unisys-sysv4
++ exit ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+- exit 0 ;;
++ exit ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ echo i860-stratus-sysv4
+- exit 0 ;;
++ exit ;;
++ i*86:VOS:*:*)
++ # From Paul.Green@stratus.com.
++ echo ${UNAME_MACHINE}-stratus-vos
++ exit ;;
+ *:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo hppa1.1-stratus-vos
+- exit 0 ;;
++ exit ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ news*:NEWS-OS:6*:*)
+ echo mips-sony-newsos6
+- exit 0 ;;
++ exit ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if [ -d /usr/nec ]; then
+- echo mips-nec-sysv${UNAME_RELEASE}
++ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+- echo mips-unknown-sysv${UNAME_RELEASE}
++ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+- exit 0 ;;
++ exit ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ echo powerpc-be-beos
+- exit 0 ;;
++ exit ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ echo powerpc-apple-beos
+- exit 0 ;;
++ exit ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ echo i586-pc-beos
+- exit 0 ;;
++ exit ;;
++ BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
++ echo i586-pc-haiku
++ exit ;;
++ x86_64:Haiku:*:*)
++ echo x86_64-unknown-haiku
++ exit ;;
+ SX-4:SUPER-UX:*:*)
+ echo sx4-nec-superux${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ SX-5:SUPER-UX:*:*)
+ echo sx5-nec-superux${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ SX-6:SUPER-UX:*:*)
+ echo sx6-nec-superux${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
++ SX-7:SUPER-UX:*:*)
++ echo sx7-nec-superux${UNAME_RELEASE}
++ exit ;;
++ SX-8:SUPER-UX:*:*)
++ echo sx8-nec-superux${UNAME_RELEASE}
++ exit ;;
++ SX-8R:SUPER-UX:*:*)
++ echo sx8r-nec-superux${UNAME_RELEASE}
++ exit ;;
++ SX-ACE:SUPER-UX:*:*)
++ echo sxace-nec-superux${UNAME_RELEASE}
++ exit ;;
+ Power*:Rhapsody:*:*)
+ echo powerpc-apple-rhapsody${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ *:Rhapsody:*:*)
+ echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ *:Darwin:*:*)
+- case `uname -p` in
+- *86) UNAME_PROCESSOR=i686 ;;
+- powerpc) UNAME_PROCESSOR=powerpc ;;
+- esac
++ UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
++ eval $set_cc_for_build
++ if test "$UNAME_PROCESSOR" = unknown ; then
++ UNAME_PROCESSOR=powerpc
++ fi
++ if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
++ if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
++ if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
++ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
++ grep IS_64BIT_ARCH >/dev/null
++ then
++ case $UNAME_PROCESSOR in
++ i386) UNAME_PROCESSOR=x86_64 ;;
++ powerpc) UNAME_PROCESSOR=powerpc64 ;;
++ esac
++ fi
++ fi
++ elif test "$UNAME_PROCESSOR" = i386 ; then
++ # Avoid executing cc on OS X 10.9, as it ships with a stub
++ # that puts up a graphical alert prompting to install
++ # developer tools. Any system running Mac OS X 10.7 or
++ # later (Darwin 11 and later) is required to have a 64-bit
++ # processor. This is not true of the ARM version of Darwin
++ # that Apple uses in portable devices.
++ UNAME_PROCESSOR=x86_64
++ fi
+ echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+- if test "$UNAME_PROCESSOR" = "x86"; then
++ if test "$UNAME_PROCESSOR" = x86; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ *:QNX:*:4*)
+ echo i386-pc-qnx
+- exit 0 ;;
++ exit ;;
++ NEO-?:NONSTOP_KERNEL:*:*)
++ echo neo-tandem-nsk${UNAME_RELEASE}
++ exit ;;
++ NSE-*:NONSTOP_KERNEL:*:*)
++ echo nse-tandem-nsk${UNAME_RELEASE}
++ exit ;;
+ NSR-?:NONSTOP_KERNEL:*:*)
+ echo nsr-tandem-nsk${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ *:NonStop-UX:*:*)
+ echo mips-compaq-nonstopux
+- exit 0 ;;
++ exit ;;
+ BS2000:POSIX*:*:*)
+ echo bs2000-siemens-sysv
+- exit 0 ;;
++ exit ;;
+ DS/*:UNIX_System_V:*:*)
+ echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+- if test "$cputype" = "386"; then
++ if test "$cputype" = 386; then
+ UNAME_MACHINE=i386
+ else
+ UNAME_MACHINE="$cputype"
+ fi
+ echo ${UNAME_MACHINE}-unknown-plan9
+- exit 0 ;;
++ exit ;;
+ *:TOPS-10:*:*)
+ echo pdp10-unknown-tops10
+- exit 0 ;;
++ exit ;;
+ *:TENEX:*:*)
+ echo pdp10-unknown-tenex
+- exit 0 ;;
++ exit ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ echo pdp10-dec-tops20
+- exit 0 ;;
++ exit ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ echo pdp10-xkl-tops20
+- exit 0 ;;
++ exit ;;
+ *:TOPS-20:*:*)
+ echo pdp10-unknown-tops20
+- exit 0 ;;
++ exit ;;
+ *:ITS:*:*)
+ echo pdp10-unknown-its
+- exit 0 ;;
++ exit ;;
+ SEI:*:*:SEIUX)
+- echo mips-sei-seiux${UNAME_RELEASE}
+- exit 0 ;;
++ echo mips-sei-seiux${UNAME_RELEASE}
++ exit ;;
+ *:DragonFly:*:*)
+ echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+- exit 0 ;;
++ exit ;;
++ *:*VMS:*:*)
++ UNAME_MACHINE=`(uname -p) 2>/dev/null`
++ case "${UNAME_MACHINE}" in
++ A*) echo alpha-dec-vms ; exit ;;
++ I*) echo ia64-dec-vms ; exit ;;
++ V*) echo vax-dec-vms ; exit ;;
++ esac ;;
++ *:XENIX:*:SysV)
++ echo i386-pc-xenix
++ exit ;;
++ i*86:skyos:*:*)
++ echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'`
++ exit ;;
++ i*86:rdos:*:*)
++ echo ${UNAME_MACHINE}-pc-rdos
++ exit ;;
++ i*86:AROS:*:*)
++ echo ${UNAME_MACHINE}-pc-aros
++ exit ;;
++ x86_64:VMkernel:*:*)
++ echo ${UNAME_MACHINE}-unknown-esx
++ exit ;;
++ amd64:Isilon\ OneFS:*:*)
++ echo x86_64-unknown-onefs
++ exit ;;
+ esac
+
+-#echo '(No uname command or uname output not recognized.)' 1>&2
+-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+-
+-eval $set_cc_for_build
+-cat >$dummy.c <<EOF
+-#ifdef _SEQUENT_
+-# include <sys/types.h>
+-# include <sys/utsname.h>
+-#endif
+-main ()
+-{
+-#if defined (sony)
+-#if defined (MIPSEB)
+- /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+- I don't know.... */
+- printf ("mips-sony-bsd\n"); exit (0);
+-#else
+-#include <sys/param.h>
+- printf ("m68k-sony-newsos%s\n",
+-#ifdef NEWSOS4
+- "4"
+-#else
+- ""
+-#endif
+- ); exit (0);
+-#endif
+-#endif
+-
+-#if defined (__arm) && defined (__acorn) && defined (__unix)
+- printf ("arm-acorn-riscix"); exit (0);
+-#endif
+-
+-#if defined (hp300) && !defined (hpux)
+- printf ("m68k-hp-bsd\n"); exit (0);
+-#endif
+-
+-#if defined (NeXT)
+-#if !defined (__ARCHITECTURE__)
+-#define __ARCHITECTURE__ "m68k"
+-#endif
+- int version;
+- version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+- if (version < 4)
+- printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+- else
+- printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+- exit (0);
+-#endif
+-
+-#if defined (MULTIMAX) || defined (n16)
+-#if defined (UMAXV)
+- printf ("ns32k-encore-sysv\n"); exit (0);
+-#else
+-#if defined (CMU)
+- printf ("ns32k-encore-mach\n"); exit (0);
+-#else
+- printf ("ns32k-encore-bsd\n"); exit (0);
+-#endif
+-#endif
+-#endif
+-
+-#if defined (__386BSD__)
+- printf ("i386-pc-bsd\n"); exit (0);
+-#endif
+-
+-#if defined (sequent)
+-#if defined (i386)
+- printf ("i386-sequent-dynix\n"); exit (0);
+-#endif
+-#if defined (ns32000)
+- printf ("ns32k-sequent-dynix\n"); exit (0);
+-#endif
+-#endif
+-
+-#if defined (_SEQUENT_)
+- struct utsname un;
+-
+- uname(&un);
+-
+- if (strncmp(un.version, "V2", 2) == 0) {
+- printf ("i386-sequent-ptx2\n"); exit (0);
+- }
+- if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+- printf ("i386-sequent-ptx1\n"); exit (0);
+- }
+- printf ("i386-sequent-ptx\n"); exit (0);
+-
+-#endif
+-
+-#if defined (vax)
+-# if !defined (ultrix)
+-# include <sys/param.h>
+-# if defined (BSD)
+-# if BSD == 43
+- printf ("vax-dec-bsd4.3\n"); exit (0);
+-# else
+-# if BSD == 199006
+- printf ("vax-dec-bsd4.3reno\n"); exit (0);
+-# else
+- printf ("vax-dec-bsd\n"); exit (0);
+-# endif
+-# endif
+-# else
+- printf ("vax-dec-bsd\n"); exit (0);
+-# endif
+-# else
+- printf ("vax-dec-ultrix\n"); exit (0);
+-# endif
+-#endif
+-
+-#if defined (alliant) && defined (i860)
+- printf ("i860-alliant-bsd\n"); exit (0);
+-#endif
+-
+- exit (1);
+-}
+-EOF
+-
+-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0
+-
+-# Apollos put the system type in the environment.
+-
+-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+-
+-# Convex versions that predate uname can use getsysinfo(1)
+-
+-if [ -x /usr/convex/getsysinfo ]
+-then
+- case `getsysinfo -f cpu_type` in
+- c1*)
+- echo c1-convex-bsd
+- exit 0 ;;
+- c2*)
+- if getsysinfo -f scalar_acc
+- then echo c32-convex-bsd
+- else echo c2-convex-bsd
+- fi
+- exit 0 ;;
+- c34*)
+- echo c34-convex-bsd
+- exit 0 ;;
+- c38*)
+- echo c38-convex-bsd
+- exit 0 ;;
+- c4*)
+- echo c4-convex-bsd
+- exit 0 ;;
+- esac
+-fi
+-
+ cat >&2 <<EOF
+ $0: unable to guess system type
+
+@@ -1419,7 +1412,9 @@ This script, last modified $timestamp, has failed to recognize
+ the operating system you are using. It is advised that you
+ download the most up to date version of the config scripts from
+
+- ftp://ftp.gnu.org/pub/gnu/config/
++ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
++and
++ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
+
+ If the version you run ($0) is already up to date, please
+ send the following data and any information you think might be
+diff --git a/config.h.dist b/config.h.dist
+index 844a555..0440927 100644
+--- a/config.h.dist
++++ b/config.h.dist
+@@ -9,10 +9,10 @@
+ /* User Configuration */
+
+ /*
+- If you define DICT, you can use dictionary look-up function
++ If you define USE_DICT, you can use dictionary look-up function
+ in w3m. See README.dict for detail.
+ */
+-#define DICT
++#define USE_DICT
+
+ /*
+ If you want to load and save URL history.
+diff --git a/config.h.in b/config.h.in
+index 2f41eed..3b575e4 100644
+--- a/config.h.in
++++ b/config.h.in
+@@ -25,6 +25,7 @@
+
+ #define PASSWD_FILE RC_DIR "/passwd"
+ #define PRE_FORM_FILE RC_DIR "/pre_form"
++#define SITECONF_FILE RC_DIR "/siteconf"
+ #define USER_MAILCAP RC_DIR "/mailcap"
+ #define SYS_MAILCAP CONF_DIR "/mailcap"
+ #define USER_MIMETYPES "~/.mime.types"
+@@ -84,7 +85,7 @@
+ #undef INET6
+ #undef HAVE_SOCKLEN_T
+ #undef HAVE_OLD_SS_FAMILY
+-#define USE_EGD
++#undef USE_EGD
+ #define ENABLE_REMOVE_TRAILINGSPACES
+ #undef MENU_THIN_FRAME
+ #undef USE_RAW_SCROLL
+@@ -209,6 +210,10 @@ typedef RETSIGTYPE MySignalHandler;
+ #define SUPPORT_WIN9X_CONSOLE_MBCS 1
+ #endif
+
++#if defined(__CYGWIN__) && defined(__x86_64__)
++#define DONT_CALL_GC_AFTER_FORK
++#endif
++
+ #if defined(__DJGPP__)
+ #define DEFAULT_TERM "dosansi"
+ #else
+diff --git a/config.sub b/config.sub
+index ba33103..8d39c4b 100755
+--- a/config.sub
++++ b/config.sub
+@@ -1,42 +1,40 @@
+ #! /bin/sh
+ # Configuration validation subroutine script.
+-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+-# 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
++# Copyright 1992-2016 Free Software Foundation, Inc.
+
+-timestamp='2004-03-12'
++timestamp='2016-03-30'
+
+-# This file is (in principle) common to ALL GNU software.
+-# The presence of a machine in this file suggests that SOME GNU software
+-# can handle that machine. It does not imply ALL GNU software can.
+-#
+-# This file is free software; you can redistribute it and/or modify
+-# it under the terms of the GNU General Public License as published by
+-# the Free Software Foundation; either version 2 of the License, or
++# This file is free software; you can redistribute it and/or modify it
++# under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 3 of the License, or
+ # (at your option) any later version.
+ #
+-# This program is distributed in the hope that it will be useful,
+-# but WITHOUT ANY WARRANTY; without even the implied warranty of
+-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-# GNU General Public License for more details.
++# This program is distributed in the hope that it will be useful, but
++# WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++# General Public License for more details.
+ #
+ # You should have received a copy of the GNU General Public License
+-# along with this program; if not, write to the Free Software
+-# Foundation, Inc., 59 Temple Place - Suite 330,
+-# Boston, MA 02111-1307, USA.
+-
++# along with this program; if not, see <http://www.gnu.org/licenses/>.
++#
+ # As a special exception to the GNU General Public License, if you
+ # distribute this file as part of a program that contains a
+ # configuration script generated by Autoconf, you may include it under
+-# the same distribution terms that you use for the rest of that program.
++# the same distribution terms that you use for the rest of that
++# program. This Exception is an additional permission under section 7
++# of the GNU General Public License, version 3 ("GPLv3").
+
+-# Please send patches to <config-patches@gnu.org>. Submit a context
+-# diff and a properly formatted ChangeLog entry.
++
++# Please send patches to <config-patches@gnu.org>.
+ #
+ # Configuration subroutine to validate and canonicalize a configuration type.
+ # Supply the specified configuration type as an argument.
+ # If it is invalid, we print an error message on stderr and exit with code 1.
+ # Otherwise, we print the canonical config type on stdout and succeed.
+
++# You can get the latest version of this script from:
++# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
++
+ # This file is supposed to be the same for all GNU packages
+ # and recognize all the CPU types, system types and aliases
+ # that are meaningful with *any* GNU software.
+@@ -55,8 +53,7 @@ timestamp='2004-03-12'
+ me=`echo "$0" | sed -e 's,.*/,,'`
+
+ usage="\
+-Usage: $0 [OPTION] CPU-MFR-OPSYS
+- $0 [OPTION] ALIAS
++Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
+
+ Canonicalize a configuration name.
+
+@@ -70,8 +67,7 @@ Report bugs and patches to <config-patches@gnu.org>."
+ version="\
+ GNU config.sub ($timestamp)
+
+-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+-Free Software Foundation, Inc.
++Copyright 1992-2016 Free Software Foundation, Inc.
+
+ This is free software; see the source for copying conditions. There is NO
+ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+@@ -83,11 +79,11 @@ Try \`$me --help' for more information."
+ while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+- echo "$timestamp" ; exit 0 ;;
++ echo "$timestamp" ; exit ;;
+ --version | -v )
+- echo "$version" ; exit 0 ;;
++ echo "$version" ; exit ;;
+ --help | --h* | -h )
+- echo "$usage"; exit 0 ;;
++ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+@@ -99,7 +95,7 @@ while test $# -gt 0 ; do
+ *local*)
+ # First pass through any local machine types.
+ echo $1
+- exit 0;;
++ exit ;;
+
+ * )
+ break ;;
+@@ -118,11 +114,18 @@ esac
+ # Here we must recognize all the valid KERNEL-OS combinations.
+ maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+ case $maybe_os in
+- nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
+- kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
++ nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
++ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
++ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
++ kopensolaris*-gnu* | \
++ storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
++ android-linux)
++ os=-linux-android
++ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
++ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+@@ -145,10 +148,13 @@ case $os in
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+- -apple | -axis)
++ -apple | -axis | -knuth | -cray | -microblaze*)
+ os=
+ basic_machine=$1
+ ;;
++ -bluegene*)
++ os=-cnk
++ ;;
+ -sim | -cisco | -oki | -wec | -winbond)
+ os=
+ basic_machine=$1
+@@ -163,13 +169,17 @@ case $os in
+ os=-chorusos
+ basic_machine=$1
+ ;;
+- -chorusrdb)
+- os=-chorusrdb
++ -chorusrdb)
++ os=-chorusrdb
+ basic_machine=$1
+- ;;
++ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
++ -sco6)
++ os=-sco5v6
++ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
++ ;;
+ -sco5)
+ os=-sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+@@ -186,6 +196,10 @@ case $os in
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
++ -sco5v6*)
++ # Don't forget version if it is 3.2v4 or newer.
++ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
++ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+@@ -203,6 +217,12 @@ case $os in
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
++ -lynx*178)
++ os=-lynxos178
++ ;;
++ -lynx*5)
++ os=-lynxos5
++ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+@@ -227,57 +247,114 @@ case $basic_machine in
+ # Some are omitted here because they have special meanings below.
+ 1750a | 580 \
+ | a29k \
++ | aarch64 | aarch64_be \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+- | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+- | c4x | clipper \
++ | arc | arceb \
++ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
++ | avr | avr32 \
++ | ba \
++ | be32 | be64 \
++ | bfin \
++ | c4x | c8051 | clipper \
+ | d10v | d30v | dlx | dsp16xx \
+- | fr30 | frv \
++ | e2k | epiphany \
++ | fido | fr30 | frv | ft32 \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
++ | hexagon \
+ | i370 | i860 | i960 | ia64 \
+ | ip2k | iq2000 \
+- | m32r | m32rle | m68000 | m68k | m88k | mcore \
++ | k1om \
++ | le32 | le64 \
++ | lm32 \
++ | m32c | m32r | m32rle | m68000 | m68k | m88k \
++ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+- | mips64vr | mips64vrel \
++ | mips64octeon | mips64octeonel \
+ | mips64orion | mips64orionel \
++ | mips64r5900 | mips64r5900el \
++ | mips64vr | mips64vrel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
++ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
++ | mipsisa32r6 | mipsisa32r6el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
++ | mipsisa64r6 | mipsisa64r6el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
++ | mipsr5900 | mipsr5900el \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
++ | moxie \
++ | mt \
+ | msp430 \
++ | nds32 | nds32le | nds32be \
++ | nios | nios2 | nios2eb | nios2el \
+ | ns16k | ns32k \
+- | openrisc | or32 \
++ | open8 | or1k | or1knd | or32 \
+ | pdp10 | pdp11 | pj | pjl \
+- | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
++ | powerpc | powerpc64 | powerpc64le | powerpcle \
+ | pyramid \
+- | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
++ | riscv32 | riscv64 \
++ | rl78 | rx \
++ | score \
++ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+- | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv8 | sparcv9 | sparcv9b \
+- | strongarm \
+- | tahoe | thumb | tic4x | tic80 | tron \
+- | v850 | v850e \
++ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
++ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
++ | spu \
++ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
++ | ubicom32 \
++ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
++ | visium \
+ | we32k \
+- | x86 | xscale | xstormy16 | xtensa \
+- | z8k)
++ | x86 | xc16x | xstormy16 | xtensa \
++ | z8k | z80)
+ basic_machine=$basic_machine-unknown
+ ;;
+- m6811 | m68hc11 | m6812 | m68hc12)
+- # Motorola 68HC11/12.
++ c54x)
++ basic_machine=tic54x-unknown
++ ;;
++ c55x)
++ basic_machine=tic55x-unknown
++ ;;
++ c6x)
++ basic_machine=tic6x-unknown
++ ;;
++ leon|leon[3-9])
++ basic_machine=sparc-$basic_machine
++ ;;
++ m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ ;;
++ ms1)
++ basic_machine=mt-unknown
++ ;;
++
++ strongarm | thumb | xscale)
++ basic_machine=arm-unknown
++ ;;
++ xgate)
++ basic_machine=$basic_machine-unknown
++ os=-none
++ ;;
++ xscaleeb)
++ basic_machine=armeb-unknown
++ ;;
++
++ xscaleel)
++ basic_machine=armel-unknown
++ ;;
+
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+@@ -293,59 +370,89 @@ case $basic_machine in
+ # Recognize the basic CPU types with company name.
+ 580-* \
+ | a29k-* \
++ | aarch64-* | aarch64_be-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+- | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
++ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+- | avr-* \
+- | bs2000-* \
+- | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+- | clipper-* | cydra-* \
++ | avr-* | avr32-* \
++ | ba-* \
++ | be32-* | be64-* \
++ | bfin-* | bs2000-* \
++ | c[123]* | c30-* | [cjt]90-* | c4x-* \
++ | c8051-* | clipper-* | craynv-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+- | elxsi-* \
+- | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
++ | e2k-* | elxsi-* \
++ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
++ | hexagon-* \
+ | i*86-* | i860-* | i960-* | ia64-* \
+ | ip2k-* | iq2000-* \
+- | m32r-* | m32rle-* \
++ | k1om-* \
++ | le32-* | le64-* \
++ | lm32-* \
++ | m32c-* | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+- | m88110-* | m88k-* | mcore-* \
++ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
++ | microblaze-* | microblazeel-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+- | mips64vr-* | mips64vrel-* \
++ | mips64octeon-* | mips64octeonel-* \
+ | mips64orion-* | mips64orionel-* \
++ | mips64r5900-* | mips64r5900el-* \
++ | mips64vr-* | mips64vrel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
++ | mips64vr5900-* | mips64vr5900el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
++ | mipsisa32r6-* | mipsisa32r6el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
++ | mipsisa64r6-* | mipsisa64r6el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
++ | mipsr5900-* | mipsr5900el-* \
+ | mipstx39-* | mipstx39el-* \
++ | mmix-* \
++ | mt-* \
+ | msp430-* \
+- | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \
++ | nds32-* | nds32le-* | nds32be-* \
++ | nios-* | nios2-* | nios2eb-* | nios2el-* \
++ | none-* | np1-* | ns16k-* | ns32k-* \
++ | open8-* \
++ | or1k*-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+- | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
++ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+ | pyramid-* \
+- | romp-* | rs6000-* \
+- | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \
++ | riscv32-* | riscv64-* \
++ | rl78-* | romp-* | rs6000-* | rx-* \
++ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+- | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \
+- | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+- | tahoe-* | thumb-* \
++ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
++ | sparclite-* \
++ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
++ | tahoe-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
++ | tile*-* \
+ | tron-* \
+- | v850-* | v850e-* | vax-* \
++ | ubicom32-* \
++ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
++ | vax-* \
++ | visium-* \
+ | we32k-* \
+- | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \
+- | xtensa-* \
++ | x86-* | x86_64-* | xc16x-* | xps100-* \
++ | xstormy16-* | xtensa*-* \
+ | ymp-* \
+- | z8k-*)
++ | z8k-* | z80-*)
++ ;;
++ # Recognize the basic CPU types without company name, with glob match.
++ xtensa*)
++ basic_machine=$basic_machine-unknown
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+@@ -363,7 +470,7 @@ case $basic_machine in
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+- abacus)
++ abacus)
+ basic_machine=abacus-unknown
+ ;;
+ adobe68k)
+@@ -409,6 +516,13 @@ case $basic_machine in
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
++ aros)
++ basic_machine=i386-pc
++ os=-aros
++ ;;
++ asmjs)
++ basic_machine=asmjs-unknown
++ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+@@ -417,10 +531,35 @@ case $basic_machine in
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
++ blackfin)
++ basic_machine=bfin-unknown
++ os=-linux
++ ;;
++ blackfin-*)
++ basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
++ os=-linux
++ ;;
++ bluegene*)
++ basic_machine=powerpc-ibm
++ os=-cnk
++ ;;
++ c54x-*)
++ basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ;;
++ c55x-*)
++ basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ;;
++ c6x-*)
++ basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
++ cegcc)
++ basic_machine=arm-unknown
++ os=-cegcc
++ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+@@ -445,13 +584,20 @@ case $basic_machine in
+ basic_machine=j90-cray
+ os=-unicos
+ ;;
+- cr16c)
+- basic_machine=cr16c-unknown
++ craynv)
++ basic_machine=craynv-cray
++ os=-unicosmp
++ ;;
++ cr16 | cr16-*)
++ basic_machine=cr16-unknown
+ os=-elf
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
++ crisv32 | crisv32-* | etraxfs*)
++ basic_machine=crisv32-axis
++ ;;
+ cris | cris-* | etrax*)
+ basic_machine=cris-axis
+ ;;
+@@ -481,6 +627,14 @@ case $basic_machine in
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
++ dicos)
++ basic_machine=i686-pc
++ os=-dicos
++ ;;
++ djgpp)
++ basic_machine=i586-pc
++ os=-msdosdjgpp
++ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+@@ -592,7 +746,6 @@ case $basic_machine in
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ ;;
+-# I'm not sure what "Sysv32" means. Should this be sysv3.2?
+ i*86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+@@ -631,6 +784,17 @@ case $basic_machine in
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
++ leon-*|leon[3-9]-*)
++ basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`
++ ;;
++ m68knommu)
++ basic_machine=m68k-unknown
++ os=-linux
++ ;;
++ m68knommu-*)
++ basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
++ os=-linux
++ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+@@ -642,10 +806,21 @@ case $basic_machine in
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
++ microblaze*)
++ basic_machine=microblaze-xilinx
++ ;;
++ mingw64)
++ basic_machine=x86_64-pc
++ os=-mingw64
++ ;;
+ mingw32)
+- basic_machine=i386-pc
++ basic_machine=i686-pc
+ os=-mingw32
+ ;;
++ mingw32ce)
++ basic_machine=arm-unknown
++ os=-mingw32ce
++ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+@@ -659,10 +834,6 @@ case $basic_machine in
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+- mmix*)
+- basic_machine=mmix-knuth
+- os=-mmixware
+- ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ os=-coff
+@@ -671,14 +842,29 @@ case $basic_machine in
+ basic_machine=powerpc-unknown
+ os=-morphos
+ ;;
++ moxiebox)
++ basic_machine=moxie-unknown
++ os=-moxiebox
++ ;;
+ msdos)
+ basic_machine=i386-pc
+ os=-msdos
+ ;;
++ ms1-*)
++ basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
++ ;;
++ msys)
++ basic_machine=i686-pc
++ os=-msys
++ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
++ nacl)
++ basic_machine=le32-unknown
++ os=-nacl
++ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+@@ -743,9 +929,11 @@ case $basic_machine in
+ np1)
+ basic_machine=np1-gould
+ ;;
+- nv1)
+- basic_machine=nv1-cray
+- os=-unicosmp
++ neo-tandem)
++ basic_machine=neo-tandem
++ ;;
++ nse-tandem)
++ basic_machine=nse-tandem
+ ;;
+ nsr-tandem)
+ basic_machine=nsr-tandem
+@@ -754,9 +942,8 @@ case $basic_machine in
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+- or32 | or32-*)
++ openrisc | openrisc-*)
+ basic_machine=or32-unknown
+- os=-coff
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+@@ -778,6 +965,14 @@ case $basic_machine in
+ basic_machine=i860-intel
+ os=-osf
+ ;;
++ parisc)
++ basic_machine=hppa-unknown
++ os=-linux
++ ;;
++ parisc-*)
++ basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
++ os=-linux
++ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+@@ -787,6 +982,12 @@ case $basic_machine in
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
++ pc98)
++ basic_machine=i386-pc
++ ;;
++ pc98-*)
++ basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ;;
+ pentium | p5 | k5 | k6 | nexgen | viac3)
+ basic_machine=i586-pc
+ ;;
+@@ -816,9 +1017,10 @@ case $basic_machine in
+ ;;
+ power) basic_machine=power-ibm
+ ;;
+- ppc) basic_machine=powerpc-unknown
++ ppc | ppcbe) basic_machine=powerpc-unknown
+ ;;
+- ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ppc-* | ppcbe-*)
++ basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+@@ -843,6 +1045,14 @@ case $basic_machine in
+ basic_machine=i586-unknown
+ os=-pw32
+ ;;
++ rdos | rdos64)
++ basic_machine=x86_64-pc
++ os=-rdos
++ ;;
++ rdos32)
++ basic_machine=i386-pc
++ os=-rdos
++ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ os=-coff
+@@ -869,6 +1079,10 @@ case $basic_machine in
+ sb1el)
+ basic_machine=mipsisa64sb1el-unknown
+ ;;
++ sde)
++ basic_machine=mipsisa32-sde
++ os=-elf
++ ;;
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
+@@ -880,6 +1094,9 @@ case $basic_machine in
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
++ sh5el)
++ basic_machine=sh5le-unknown
++ ;;
+ sh64)
+ basic_machine=sh64-unknown
+ ;;
+@@ -901,6 +1118,9 @@ case $basic_machine in
+ basic_machine=i860-stratus
+ os=-sysv4
+ ;;
++ strongarm-* | thumb-*)
++ basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+@@ -957,17 +1177,9 @@ case $basic_machine in
+ basic_machine=t90-cray
+ os=-unicos
+ ;;
+- tic54x | c54x*)
+- basic_machine=tic54x-unknown
+- os=-coff
+- ;;
+- tic55x | c55x*)
+- basic_machine=tic55x-unknown
+- os=-coff
+- ;;
+- tic6x | c6x*)
+- basic_machine=tic6x-unknown
+- os=-coff
++ tile*)
++ basic_machine=$basic_machine-unknown
++ os=-linux-gnu
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+@@ -1029,9 +1241,16 @@ case $basic_machine in
+ basic_machine=hppa1.1-winbond
+ os=-proelf
+ ;;
++ xbox)
++ basic_machine=i686-pc
++ os=-mingw32
++ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
++ xscale-* | xscalee[bl]-*)
++ basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
++ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+@@ -1040,6 +1259,10 @@ case $basic_machine in
+ basic_machine=z8k-unknown
+ os=-sim
+ ;;
++ z80-*-coff)
++ basic_machine=z80-unknown
++ os=-sim
++ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+@@ -1059,6 +1282,9 @@ case $basic_machine in
+ romp)
+ basic_machine=romp-ibm
+ ;;
++ mmix)
++ basic_machine=mmix-knuth
++ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+@@ -1075,13 +1301,10 @@ case $basic_machine in
+ we32k)
+ basic_machine=we32k-att
+ ;;
+- sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele)
++ sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+ basic_machine=sh-unknown
+ ;;
+- sh64)
+- basic_machine=sh64-unknown
+- ;;
+- sparc | sparcv8 | sparcv9 | sparcv9b)
++ sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+@@ -1125,9 +1348,12 @@ esac
+ if [ x"$os" != x"" ]
+ then
+ case $os in
+- # First match some system type aliases
+- # that might get confused with valid system types.
++ # First match some system type aliases
++ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
++ -auroraux)
++ os=-auroraux
++ ;;
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+@@ -1148,26 +1374,32 @@ case $os in
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+- | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+- | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
++ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
++ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
++ | -sym* | -kopensolaris* | -plan9* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+- | -aos* \
++ | -aos* | -aros* | -cloudabi* | -sortix* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+- | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
++ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
++ | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \
+ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+- | -chorusos* | -chorusrdb* \
+- | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+- | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \
++ | -chorusos* | -chorusrdb* | -cegcc* \
++ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
++ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
++ | -linux-newlib* | -linux-musl* | -linux-uclibc* \
++ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+- | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*)
++ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
++ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \
++ | -onefs* | -tirtos*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -qnx*)
+@@ -1185,7 +1417,7 @@ case $os in
+ os=`echo $os | sed -e 's|nto|nto-qnx|'`
+ ;;
+ -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+- | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
++ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ ;;
+ -mac*)
+@@ -1206,7 +1438,7 @@ case $os in
+ -opened*)
+ os=-openedition
+ ;;
+- -os400*)
++ -os400*)
+ os=-os400
+ ;;
+ -wince*)
+@@ -1255,7 +1487,7 @@ case $os in
+ -sinix*)
+ os=-sysv4
+ ;;
+- -tpf*)
++ -tpf*)
+ os=-tpf
+ ;;
+ -triton*)
+@@ -1291,8 +1523,15 @@ case $os in
+ -aros*)
+ os=-aros
+ ;;
+- -kaos*)
+- os=-kaos
++ -zvmoe)
++ os=-zvmoe
++ ;;
++ -dicos*)
++ os=-dicos
++ ;;
++ -nacl*)
++ ;;
++ -ios)
+ ;;
+ -none)
+ ;;
+@@ -1316,6 +1555,12 @@ else
+ # system, and we'll never get to this point.
+
+ case $basic_machine in
++ score-*)
++ os=-elf
++ ;;
++ spu-*)
++ os=-elf
++ ;;
+ *-acorn)
+ os=-riscix1.2
+ ;;
+@@ -1325,9 +1570,24 @@ case $basic_machine in
+ arm*-semi)
+ os=-aout
+ ;;
+- c4x-* | tic4x-*)
+- os=-coff
+- ;;
++ c4x-* | tic4x-*)
++ os=-coff
++ ;;
++ c8051-*)
++ os=-elf
++ ;;
++ hexagon-*)
++ os=-elf
++ ;;
++ tic54x-*)
++ os=-coff
++ ;;
++ tic55x-*)
++ os=-coff
++ ;;
++ tic6x-*)
++ os=-coff
++ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=-tops20
+@@ -1346,13 +1606,13 @@ case $basic_machine in
+ ;;
+ m68000-sun)
+ os=-sunos3
+- # This also exists in the configure program, but was not the
+- # default.
+- # os=-sunos4
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
++ mep-*)
++ os=-elf
++ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+@@ -1371,9 +1631,15 @@ case $basic_machine in
+ *-be)
+ os=-beos
+ ;;
++ *-haiku)
++ os=-haiku
++ ;;
+ *-ibm)
+ os=-aix
+ ;;
++ *-knuth)
++ os=-mmixware
++ ;;
+ *-wec)
+ os=-proelf
+ ;;
+@@ -1476,7 +1742,7 @@ case $basic_machine in
+ -sunos*)
+ vendor=sun
+ ;;
+- -aix*)
++ -cnk*|-aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+@@ -1539,7 +1805,7 @@ case $basic_machine in
+ esac
+
+ echo $basic_machine$os
+-exit 0
++exit
+
+ # Local variables:
+ # eval: (add-hook 'write-file-hooks 'time-stamp)
+diff --git a/configure b/configure
+index 4c1bc06..140f050 100755
+--- a/configure
++++ b/configure
+@@ -1486,11 +1486,11 @@ Optional Packages:
+ --with-migemo=MIGEMO_COMMAND migemo command
+ --with-editor=EDITOR default editor (/usr/bin/vi)
+ --with-mailer=MAILER default mailer (/usr/bin/mail)
+- --with-browser=BROWSER default browser (/usr/bin/mozilla)
++ --with-browser=BROWSER default browser (/usr/bin/firefox)
+ --with-ssl=PREFIX support https protocol
+ --with-termlib=LIBS terminal library
+ LIBS is space separated list of:
+- terminfo mytinfo termcap ncurses curses
++ terminfo mytinfo termcap tinfo ncurses curses
+ --with-gc=PREFIX libgc PREFIX
+
+ Some influential environment variables:
+@@ -6755,7 +6755,7 @@ $as_echo "$enable_image" >&6; }
+ if test x"$enable_image" = xyes; then
+ enable_image=x11
+ case "`uname -s`" in
+- Linux|linux|LINUX)
++ Linux|linux|LINUX|FreeBSD|freebsd|FREEBSD)
+ if test -c /dev/fb0; then
+ enable_image=x11,fb
+ fi;;
+@@ -6811,6 +6811,9 @@ $as_echo "$with_imagelib" >&6; }
+ fi;;
+ imlib2)
+ with_imlib2="yes"
++ if test x"$PKG_CONFIG" = x; then
++ PKG_CONFIG=pkg-config
++ fi
+ if test x"$IMLIB2_CONFIG" = x; then
+ IMLIB2_CONFIG=imlib2-config
+ fi;;
+@@ -6823,8 +6826,6 @@ $as_echo "$with_imagelib" >&6; }
+ with_gtk2="yes"
+ if test x"$PKG_CONFIG" = x; then
+ PKG_CONFIG=pkg-config
+- else
+- PKG_CONFIG=:
+ fi;;
+ esac
+ done
+@@ -6926,8 +6927,8 @@ $as_echo "$as_me: WARNING: Imlib2 is not installed. Install Imlib2 (version >=
+
+ $as_echo "#define USE_GTK2 1" >>confdefs.h
+
+- IMGX11CFLAGS="`${PKG_CONFIG} --cflags gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0 gtk+-2.0`"
+- IMGX11LDFLAGS="`${PKG_CONFIG} --libs gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0 gtk+-2.0`"
++ IMGX11CFLAGS="`${PKG_CONFIG} --cflags gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0`"
++ IMGX11LDFLAGS="-lX11 `${PKG_CONFIG} --libs gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0`"
+ elif test x"$have_gdkpixbuf" = xyes; then
+ $as_echo "#define USE_W3MIMG_X11 1" >>confdefs.h
+
+@@ -6955,7 +6956,7 @@ $as_echo "$as_me: WARNING: Imlib2 is not installed. Install Imlib2 (version >=
+ $as_echo "#define USE_IMLIB2 1" >>confdefs.h
+
+ IMGX11CFLAGS="`${IMLIB2_CONFIG} --cflags`"
+- IMGX11LDFLAGS="`${IMLIB2_CONFIG} --libs`"
++ IMGX11LDFLAGS="-lX11 `${PKG_CONFIG} --libs imlib2`"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unable to build w3mimgdisplay with X11 support" >&5
+ $as_echo "$as_me: WARNING: unable to build w3mimgdisplay with X11 support" >&2;}
+@@ -6971,8 +6972,8 @@ $as_echo "$as_me: WARNING: unable to build w3mimgdisplay with X11 support" >&2;}
+
+ $as_echo "#define USE_GTK2 1" >>confdefs.h
+
+- IMGFBCFLAGS="`${PKG_CONFIG} --cflags gdk-pixbuf-2.0 gtk+-2.0`"
+- IMGFBLDFLAGS="`${PKG_CONFIG} --libs gdk-pixbuf-2.0 gtk+-2.0`"
++ IMGFBCFLAGS="`${PKG_CONFIG} --cflags gdk-pixbuf-2.0`"
++ IMGFBLDFLAGS="`${PKG_CONFIG} --libs gdk-pixbuf-2.0`"
+ elif test x"$have_gdkpixbuf" = xyes; then
+ $as_echo "#define USE_W3MIMG_FB 1" >>confdefs.h
+
+@@ -6991,7 +6992,7 @@ $as_echo "$as_me: WARNING: unable to build w3mimgdisplay with X11 support" >&2;}
+
+ IMGOBJS="$IMGOBJS fb/fb_w3mimg.o fb/fb.o fb/fb_img.o"
+ IMGFBCFLAGS="`${IMLIB2_CONFIG} --cflags`"
+- IMGFBLDFLAGS="`${IMLIB2_CONFIG} --libs`"
++ IMGFBLDFLAGS="`${PKG_CONFIG} --libs imlib2`"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unable to build w3mimgdisplay with FB support" >&5
+ $as_echo "$as_me: WARNING: unable to build w3mimgdisplay with FB support" >&2;}
+@@ -7344,7 +7345,7 @@ cat >>confdefs.h <<_ACEOF
+ _ACEOF
+
+
+-w3m_browser="/usr/bin/mozilla"
++w3m_browser="/usr/bin/firefox"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking which external browser is used by default" >&5
+ $as_echo_n "checking which external browser is used by default... " >&6; }
+
+@@ -7977,7 +7978,7 @@ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_termlib" >&5
+ $as_echo "$with_termlib" >&6; }
+- test x"$with_termlib" = xyes && with_termlib="terminfo mytinfo termlib termcap ncurses curses"
++ test x"$with_termlib" = xyes && with_termlib="terminfo mytinfo termlib termcap tinfo ncurses curses"
+ for lib in $with_termlib; do
+ as_ac_Lib=`$as_echo "ac_cv_lib_$lib''_tgetent" | $as_tr_sh`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tgetent in -l$lib" >&5
+@@ -8986,7 +8987,7 @@ extern char *sys_errlist[];
+ int
+ main ()
+ {
+-printf(sys_errlist[0]);
++printf("%s", sys_errlist[0]);
+ ;
+ return 0;
+ }
+@@ -9076,7 +9077,7 @@ RC_DIR="~/.$PACKAGE"
+ $as_echo "#define RC_DIR \"\$RC_DIR\"" >>confdefs.h
+
+
+-DOCDIRS="doc:en_English doc-jp:ja_Japanese"
++DOCDIRS="doc:en_English doc-jp:ja_Japanese doc-de:de_German"
+ cat >>confdefs.h <<_ACEOF
+ #define DOCDIRS "$DOCDIRS"
+ _ACEOF
+@@ -9084,9 +9085,10 @@ _ACEOF
+
+
+ cvsver=`$AWK '\$1 ~ /Id:/ { print \$3}' $srcdir/ChangeLog`
+- sed -e 's/define CURRENT_VERSION "\(.*\)+cvs/define CURRENT_VERSION "\1+cvs-'$cvsver'/' $srcdir/version.c.in > version.c
++ ymdver=`sed -e 's/ .*//;s/-//g;q' $srcdir/ChangeLog`
++ sed -e 's/define CURRENT_VERSION "\(.*\)YYYYMMDD/define CURRENT_VERSION "\1'$ymdver'/;s/define CURRENT_VERSION "\(.*\)+cvs/define CURRENT_VERSION "\1+cvs-'$cvsver'/' $srcdir/version.c.in > version.c
+ CURRENT_VERSION=`sed -n 's/.*define CURRENT_VERSION *"w3m\/\(.*\)".*$/\1/p' version.c`
+-ac_config_files="$ac_config_files Makefile posubst po/Makefile.in scripts/Makefile scripts/dirlist.cgi scripts/w3mhelp.cgi scripts/w3mmail.cgi scripts/xface2xpm scripts/multipart/Makefile scripts/multipart/multipart.cgi scripts/w3mman/Makefile scripts/w3mman/w3mman scripts/w3mman/w3mman.1 scripts/w3mman/w3mman2html.cgi libwc/Makefile w3mimg/Makefile w3mimg/fb/Makefile w3mimg/x11/Makefile w3mimg/win/Makefile w3mhelp-w3m_en.html w3mhelp-w3m_ja.html w3mhelp-lynx_en.html w3mhelp-lynx_ja.html"
++ac_config_files="$ac_config_files Makefile posubst po/Makefile.in scripts/Makefile scripts/dirlist.cgi scripts/w3mhelp.cgi scripts/w3mmail.cgi scripts/xface2xpm scripts/multipart/Makefile scripts/multipart/multipart.cgi scripts/w3mman/Makefile scripts/w3mman/w3mman scripts/w3mman/w3mman.1 scripts/w3mman/w3mman.de.1 scripts/w3mman/w3mman2html.cgi libwc/Makefile w3mimg/Makefile w3mimg/fb/Makefile w3mimg/x11/Makefile w3mimg/win/Makefile w3mhelp-w3m_en.html w3mhelp-w3m_ja.html w3mhelp-lynx_en.html w3mhelp-lynx_ja.html"
+
+ cat >confcache <<\_ACEOF
+ # This file is a shell script that caches the results of configure
+@@ -9810,6 +9812,7 @@ do
+ "scripts/w3mman/Makefile") CONFIG_FILES="$CONFIG_FILES scripts/w3mman/Makefile" ;;
+ "scripts/w3mman/w3mman") CONFIG_FILES="$CONFIG_FILES scripts/w3mman/w3mman" ;;
+ "scripts/w3mman/w3mman.1") CONFIG_FILES="$CONFIG_FILES scripts/w3mman/w3mman.1" ;;
++ "scripts/w3mman/w3mman.de.1") CONFIG_FILES="$CONFIG_FILES scripts/w3mman/w3mman.de.1" ;;
+ "scripts/w3mman/w3mman2html.cgi") CONFIG_FILES="$CONFIG_FILES scripts/w3mman/w3mman2html.cgi" ;;
+ "libwc/Makefile") CONFIG_FILES="$CONFIG_FILES libwc/Makefile" ;;
+ "w3mimg/Makefile") CONFIG_FILES="$CONFIG_FILES w3mimg/Makefile" ;;
+diff --git a/configure.ac b/configure.ac
+index 7308fc6..320a6e2 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -172,7 +172,7 @@ AC_SUBST(RC_DIR)
+ RC_DIR="~/.$PACKAGE"
+ AC_DEFINE(RC_DIR, "$RC_DIR")
+ AC_SUBST(DOCDIRS)
+-DOCDIRS="doc:en_English doc-jp:ja_Japanese"
++DOCDIRS="doc:en_English doc-jp:ja_Japanese doc-de:de_German"
+ AC_DEFINE_UNQUOTED(DOCDIRS, "$DOCDIRS")
+
+ AC_W3M_VERSION
+@@ -181,7 +181,8 @@ scripts/Makefile scripts/dirlist.cgi \
+ scripts/w3mhelp.cgi \
+ scripts/w3mmail.cgi scripts/xface2xpm \
+ scripts/multipart/Makefile scripts/multipart/multipart.cgi \
+-scripts/w3mman/Makefile scripts/w3mman/w3mman scripts/w3mman/w3mman.1 \
++scripts/w3mman/Makefile scripts/w3mman/w3mman \
++scripts/w3mman/w3mman.1 scripts/w3mman/w3mman.de.1 \
+ scripts/w3mman/w3mman2html.cgi \
+ libwc/Makefile \
+ w3mimg/Makefile w3mimg/fb/Makefile w3mimg/x11/Makefile w3mimg/win/Makefile \
+diff --git a/cookie.c b/cookie.c
+index 8020f6d..705e277 100644
+--- a/cookie.c
++++ b/cookie.c
+@@ -22,10 +22,10 @@ static int is_saved = 1;
+
+ #define contain_no_dots(p, ep) (total_dot_number((p),(ep),1)==0)
+
+-static int
+-total_dot_number(char *p, char *ep, int max_count)
++static unsigned int
++total_dot_number(char *p, char *ep, unsigned int max_count)
+ {
+- int count = 0;
++ unsigned int count = 0;
+ if (!ep)
+ ep = p + strlen(p);
+
+@@ -105,6 +105,7 @@ make_portlist(Str port)
+ pl->next = first;
+ first = pl;
+ }
++ Strfree(tmp);
+ return first;
+ }
+
+@@ -247,16 +248,12 @@ find_cookie(ParsedURL *pu)
+ Strcat(tmp, Sprintf("; $Domain=\"%s\"", p1->domain->ptr));
+ if (p1->portl)
+ Strcat(tmp,
+- Sprintf("; $Port=\"%s\"", portlist2str(p1->portl)));
++ Sprintf("; $Port=\"%s\"", portlist2str(p1->portl)->ptr));
+ }
+ }
+ return tmp;
+ }
+
+-char *special_domain[] = {
+- ".com", ".edu", ".gov", ".mil", ".net", ".org", ".int", NULL
+-};
+-
+ int
+ check_avoid_wrong_number_of_dots_domain( Str domain )
+ {
+@@ -324,7 +321,7 @@ add_cookie(ParsedURL *pu, Str name, Str value,
+
+ if (version == 0) {
+ /* [NETSCAPE] rule */
+- int n = total_dot_number(domain->ptr,
++ unsigned int n = total_dot_number(domain->ptr,
+ domain->ptr + domain->length,
+ 3);
+ if (n < 2) {
+@@ -332,19 +329,6 @@ add_cookie(ParsedURL *pu, Str name, Str value,
+ COOKIE_ERROR(COO_ESPECIAL);
+ }
+ }
+- else if (n == 2) {
+- char **sdomain;
+- int ok = 0;
+- for (sdomain = special_domain; !ok && *sdomain; sdomain++) {
+- int offset = domain->length - strlen(*sdomain);
+- if (offset >= 0 &&
+- strcasecmp(*sdomain, &domain->ptr[offset]) == 0)
+- ok = 1;
+- }
+- if (!ok && ! check_avoid_wrong_number_of_dots_domain(domain)) {
+- COOKIE_ERROR(COO_ESPECIAL);
+- }
+- }
+ }
+ else {
+ /* [DRAFT 12] s. 4.3.2 case 2 */
+@@ -463,7 +447,7 @@ save_cookies(void)
+ continue;
+ fprintf(fp, "%s\t%s\t%s\t%ld\t%s\t%s\t%d\t%d\t%s\t%s\t%s\n",
+ parsedURL2Str(&p->url)->ptr,
+- p->name->ptr, p->value->ptr, p->expires,
++ p->name->ptr, p->value->ptr, (long)p->expires,
+ p->domain->ptr, p->path->ptr, p->flag,
+ p->version, str2charp(p->comment),
+ (p->portl) ? portlist2str(p->portl)->ptr : "",
+@@ -517,36 +501,36 @@ load_cookies(void)
+ cookie->commentURL = NULL;
+ parseURL(readcol(&str)->ptr, &cookie->url, NULL);
+ if (!*str)
+- return;
++ break;
+ cookie->name = readcol(&str);
+ if (!*str)
+- return;
++ break;
+ cookie->value = readcol(&str);
+ if (!*str)
+- return;
++ break;
+ cookie->expires = (time_t) atol(readcol(&str)->ptr);
+ if (!*str)
+- return;
++ break;
+ cookie->domain = readcol(&str);
+ if (!*str)
+- return;
++ break;
+ cookie->path = readcol(&str);
+ if (!*str)
+- return;
++ break;
+ cookie->flag = atoi(readcol(&str)->ptr);
+ if (!*str)
+- return;
++ break;
+ cookie->version = atoi(readcol(&str)->ptr);
+ if (!*str)
+- return;
++ break;
+ cookie->comment = readcol(&str);
+ if (cookie->comment->length == 0)
+ cookie->comment = NULL;
+ if (!*str)
+- return;
++ break;
+ cookie->portl = make_portlist(readcol(&str));
+ if (!*str)
+- return;
++ break;
+ cookie->commentURL = readcol(&str);
+ if (cookie->commentURL->length == 0)
+ cookie->commentURL = NULL;
+diff --git a/display.c b/display.c
+index e00eb0c..d4f336a 100644
+--- a/display.c
++++ b/display.c
+@@ -257,7 +257,7 @@ make_lastline_link(Buffer *buf, char *title, char *url)
+ parseURL2(url, &pu, baseURL(buf));
+ u = parsedURL2Str(&pu);
+ if (DecodeURL)
+- u = Strnew_charp(url_unquote_conv(u->ptr, buf->document_charset));
++ u = Strnew_charp(url_decode2(u->ptr, buf));
+ #ifdef USE_M17N
+ u = checkType(u, &pr, NULL);
+ #endif
+@@ -487,7 +487,7 @@ displayBuffer(Buffer *buf, int mode)
+ term_title(conv_to_system(buf->buffername));
+ refresh();
+ #ifdef USE_IMAGE
+- if (activeImage && displayImage && buf->img) {
++ if (activeImage && displayImage && buf->img && buf->image_loaded) {
+ drawImage();
+ }
+ #endif
+@@ -521,7 +521,15 @@ drawAnchorCursor0(Buffer *buf, AnchorList *al, int hseq, int prevhseq,
+ break;
+ }
+ if (hseq >= 0 && an->hseq == hseq) {
++ int start_pos = an->start.pos;
++ int end_pos = an->end.pos;
+ for (i = an->start.pos; i < an->end.pos; i++) {
++ if (enable_inline_image && (l->propBuf[i] & PE_IMAGE)) {
++ if (start_pos == i)
++ start_pos = i + 1;
++ else if (end_pos == an->end.pos)
++ end_pos = i - 1;
++ }
+ if (l->propBuf[i] & (PE_IMAGE | PE_ANCHOR | PE_FORM)) {
+ if (active)
+ l->propBuf[i] |= PE_ACTIVE;
+@@ -529,9 +537,9 @@ drawAnchorCursor0(Buffer *buf, AnchorList *al, int hseq, int prevhseq,
+ l->propBuf[i] &= ~PE_ACTIVE;
+ }
+ }
+- if (active)
++ if (active && start_pos < end_pos)
+ redrawLineRegion(buf, l, l->linenumber - tline + buf->rootY,
+- an->start.pos, an->end.pos);
++ start_pos, end_pos);
+ }
+ else if (prevhseq >= 0 && an->hseq == prevhseq) {
+ if (active)
+@@ -855,14 +863,16 @@ redrawLineImage(Buffer *buf, Line *l, int i)
+ y = (int)(i * pixel_per_line);
+ sx = (int)((rcol - COLPOS(l, a->start.pos)) * pixel_per_char);
+ sy = (int)((l->linenumber - image->y) * pixel_per_line);
+- if (sx == 0 && x + image->xoffset >= 0)
+- x += image->xoffset;
+- else
+- sx -= image->xoffset;
+- if (sy == 0 && y + image->yoffset >= 0)
+- y += image->yoffset;
+- else
+- sy -= image->yoffset;
++ if (! enable_inline_image) {
++ if (sx == 0 && x + image->xoffset >= 0)
++ x += image->xoffset;
++ else
++ sx -= image->xoffset;
++ if (sy == 0 && y + image->yoffset >= 0)
++ y += image->yoffset;
++ else
++ sy -= image->yoffset;
++ }
+ if (image->width > 0)
+ w = image->width - sx;
+ else
+diff --git a/doc-de/FAQ.html b/doc-de/FAQ.html
+new file mode 100644
+index 0000000..d88ba64
+--- /dev/null
++++ b/doc-de/FAQ.html
+@@ -0,0 +1,691 @@
++
++<html>
++ <head>
++ <style>
++ span.mono {
++ font-family:mono;
++ }
++ </style>
++ <meta http-equiv="content-type" content="text/html;charset=UTF-8">
++ <title>W3M FAQ</title>
++ </head>
++ <body>
++ <h1 align="center">
++ Häufig gestellte Fragen zu w3m
++ </h1>
++ <p align="right">
++ Akinori Ito <aito@fw.ipsj.or.jp> <br>korrigiert von Tom Berger <tom.be@gmx.net>
++ </p>
++ <h2 id="index">
++ <u>
++ Ãbersicht
++ </u>
++ </h2>
++ <ul>
++ <li>
++ <a href="#general">
++ <b>
++ Allgemeine Fragen; wie bekomme ich das Programm, welche Arbeitsumgebung wird benötigt?
++ </b>
++ </a>
++ </li>
++ <ul>
++ <li>
++ <b>
++ Wie wird <q>w3m</q> ausgesprochen?
++ </b>
++ </li>
++ <li>
++ <b>
++ Warum hat man es <q>w3m</q> genannt?
++ </b>
++ </li>
++ <li>
++ <b>
++ Auf welchen Plattformen läuft es?
++ </b>
++ </li>
++ <li>
++ <b>
++ Wo bekomme ich mehr Informationen über w3m?
++ </b>
++ </li>
++ <li>
++ <b>
++ Gibt es eine Mailingliste für w3m?
++ </b>
++ </li>
++ <li>
++ <b>
++ Gibt es das Programm fertig kompiliert?
++ </b>
++ </li>
++ </ul>
++ <li>
++ <a href="#install">
++ <b>
++ Kompilierung und Installation
++ </b>
++ </a>
++ </li>
++ <li>
++ <a href="#command">
++ <b>
++ Optionen, Befehle und Verwendung
++ </b>
++ </a>
++ </li>
++ <ul>
++ <li>
++ <b>
++ w3m beendet sich von selbst, wenn es ohne Argumente aufgerufen wurde. Was läuft hier falsch?
++ </b>
++ </li>
++ <li>
++ <b>
++ w3m startet mit schwarzen Zeichen vor schwarzem Hintergrund. Wie kann ich das ändern?
++ </b>
++ </li>
++ <li>
++ <b>
++ Kann w3m Dinge in Farbe darstellen?
++ </b>
++ </li>
++ <li>
++ <b>
++ Kann w3m mit monochromen Bildschirmen benutzt werden?
++ </b>
++ </li>
++ <li>
++ <b>
++ Wie kann ich den angezeigten Bereich verschieben?
++ </b>
++ </li>
++ <li>
++ <b>
++ Wie komme ich von einem zum anderen Hyperlink?
++ </b>
++ </li>
++ <li>
++ <b>
++ Grafische Browser stellen ein Wort rot dar, w3m hingegen nicht. Warum?
++ </b>
++ </li>
++ <li>
++ <b>
++ Wie ändere ich die für Hyperlinks, Bilder und Formularfelder benutzten Farben?
++ </b>
++ </li>
++ <li>
++ <b>
++ w3m scheint die Umgebungsvariable EDITOR zu ignorieren. Weshalb?
++ </b>
++ </li>
++ <li>
++ <b>
++ Wie breche ich eine Suche oder die Eingabe einer URL ab?
++ </b>
++ </li>
++ </ul>
++ <li>
++ <a href="#www">
++ <b>
++ Fragen zur Benutzung als Internetbrowser
++ </b>
++ </a>
++ </li>
++ <ul>
++ <li>
++ <b>
++ Wie fülle ich mit w3m Formulare aus?
++ </b>
++ </li>
++ <li>
++ <b>
++ w3m scheint langsamer als einige andere Browser zu sein. Warum?
++ </b>
++ </li>
++ <li>
++ <b>
++ Die Zeit zum Laden einer Seite wird nicht geringer, wenn diese Seite schon einmal angezeigt wurde.
++ </b>
++ </li>
++ <li>
++ <b>
++ Wie lade ich eine Datei herunter, auf die verlinkt wird?
++ </b>
++ </li>
++ <li>
++ <b>
++ Wie gebe ich einen Proxy-Server vor?
++ </b>
++ </li>
++<!-- deleted, see mail dated Mon, 04 Apr 2016 20:50:27 +0900 (JST)
++from Tatsuya Kinoshita <tats@debian.org>
++ <li>
++ <b>
++ w3m freezes when I invoke an external browser.
++ </b>
++ </li>
++-->
++ <li>
++ <b>
++ Wie wähle ich den standardmäÃig verwendeten Bildbetrachter aus?
++ </b>
++ </li>
++ <li>
++ <b>
++ Wie wird eine URL eingegeben?
++ </b>
++ </li>
++ <li>
++ <b>
++ w3m hängt eine URL an die vorherige an, obwohl die Zeile mit <span class="mono">STRG-u</span> gelöscht worden war. Was ist zu tun?
++ </b>
++ </li>
++ </ul>
++ <li>
++ <a href="#other">
++ <b>
++ Verschiedenes
++ </b>
++ </a>
++ </li>
++ <ul>
++ <li>
++ <b>
++ Ich suche die Konfigurationsdatei von w3m.
++ </b>
++ </li>
++ <li>
++ <b>
++ Wofür sind die w3mxxxx Dateien in meinem ~/.w3m Verzeichnis gut?
++ </b>
++ </li>
++ </ul>
++ </ul>
++ <h2 id="general">
++ <u>
++ Allgemeine Fragen; wie bekomme ich das Programm, welche Arbeitsumgebung wird benötigt?
++ </u>
++ </h2>
++ <dl>
++ <dt>
++ <b>
++ Wie wird <q>w3m</q> ausgesprochen?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Der Name wird englisch ausgesprochen <q>W-three-M</q> und reimt sich nicht auf <q>pteranodon</q>.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Warum hat man es <q>w3m</q> genannt?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Darin steckt der japanische Satz <q>WWW-wo-Miru</q>, was <q>Sichte das weltweite Netz</q> bedeutet. Dieser Browser könnte also auf deutsch <q>Sdw2N</q> heiÃen.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Auf welchen Plattformen läuft es?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Das Programm läuft auf verschiedenen Unices, seit der Version 990226 auf OS/2 und seit Version 990303 auch auf Microsoft-Windows mit Cygwin32.
++ </p>
++ <p>
++ Es wurde bestätigt, dass neuere Versionen laufen auf:
++ </p>
++ <ul>
++ <li>
++ SunOS 4.1.x
++ </li>
++ <li>
++ HP-UX 9.x, 10.x
++ </li>
++ <li>
++ Solaris 2.5.x, 2.6, 8
++ </li>
++ <li>
++ Linux 2.0.1 bis 3.17
++ </li>
++ <li>
++ FreeBSD 2.2.8, 3.1, 3.2, 4.6
++ </li>
++ <li>
++ NetBSD/macppc, m68k
++ </li>
++ <li>
++ EWS4800 Rel.12.2 Rev.A
++ </li>
++ <li>
++ Digital UNIX: v3.2D, v4.0D
++ </li>
++ <li>
++ IRIX 5.3, IRIX 6.5
++ </li>
++ <li>
++ OS/2 mit emx
++ </li>
++ <li>
++ Windows 9x/NT mit Cygwin32 b20.1
++ </li>
++ <li>
++ MS-DOS mit DJGPP und WATT32 Pakettreiber
++ </li>
++ <li>
++ MacOS X Server
++ </li>
++ <li>
++ MacOS X 10.1, 10.2
++ </li>
++ </ul>
++ </dd>
++ <dt>
++ <b>
++ Wo bekomme ich mehr Informationen über w3m?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Auf der englischen <a href="http://w3m.sourceforge.net/index.en.html">Homepage</a> des w3m-Projekts.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Gibt es eine Mailingliste für w3m?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Es gibt eine Mailingliste für Entwickler (w3m-dev-en). Einzelheiten dazu finden Sie auf der <a href="http://w3m.sourceforge.net/index.en.html">Homepage</a> des w3m-Projekts. Sie können Ihre Anmerkungen auch dem <a href="mailto:aito@fw.ipsj.or.jp">Autor</a> schicken.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Gibt es das Programm fertig kompiliert?
++ </b>
++ </dt>
++ <dd>
++ <!--
++ You can get them from
++ <a href="http://prdownloads.sourceforge.net/w3m/">here</a>.
++!--><p>
++ Bis jetzt wurde das Programm nur für Windows /Cygnus32 kompiliert. Sollten Sie dies für andere Plattformen durchgeführt haben und möchten Ihre Binärversion der Allgemeinheit zur Verfügung stellen, kontaktieren Sie den <a href="mailto:aito@fw.ipsj.or.jp">Autor</a>.
++ </p>
++ </dd>
++ </dl>
++ <p align="right">
++ <i>
++ Zurück zur <a href="#index">Ãbersicht</a>
++ </i>
++ </p>
++ <h2 id="install">
++ <u>
++ Kompilierung und Installation
++ </u>
++ </h2>
++ <p>
++ Kein Problem :-)
++ </p>
++ <h2 id="command">
++ <u>
++ Optionen, Befehle und Verwendung
++ </u>
++ </h2>
++ <dl>
++ <dt>
++ <b>
++ w3m beendet sich von selbst, wenn es ohne Argumente aufgerufen wurde. Was läuft hier falsch?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ w3m ist ein <b>Textbetrachter</b>. Deshalb schlieÃt sich das Programm von selbst, wenn es ohne ein Argument aufgerufen wird. Es läuft weiter
++ </p>
++ <ul>
++ <li>
++ mit einem Dateinamen oder einer Adresse als Argument
++ </li>
++ <li>
++ mit aus der Standardeingabe eingehenden Daten
++ </li>
++ <li>
++ nach Aufruf mit der Option -B, woraufhin die Lesezeichendatei gezeigt wird
++ </li>
++ <li>
++ nach Aufruf mit der Option -v, woraufhin eine BegrüÃungsseite angezeigt wird
++ </li>
++ <li>
++ wenn die Variablen HTTP_HOME oder WWW_HOME spezifiziert wurden
++ </li>
++ </ul>
++ </dd>
++ <dt>
++ <b>
++ w3m startet mit schwarzen Zeichen vor schwarzem Hintergrund. Wie kann ich das ändern?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Wenn w3m für den Farbmodus kompiliert wurde, geht das Programm von weiÃem Hintergrund aus und zeigt die Buchstaben in schwarz.
++ </p>
++ <p>
++ Sie können entweder die Hintergrundfarbe Ihres Terminals ändern (bei xterm z.B. mit der Option -bg) oder so vorgehen
++ </p>
++ <ol>
++ <li>
++ Mit <span class="mono">w3m -M</span> den Monochrom-Modus von w3m starten
++ </li>
++ <li>
++ <q>o</q> eintippen, was Sie in den Einstellungs-Dialog bringt
++ </li>
++ <li>
++ <q>YES</q> neben <q>in Farbe anzeigen</q> markieren und irgendeine Farbe auswählen.
++ </li>
++ <li>
++ auf [OK] klicken
++ </li>
++ </ol>
++ </dd>
++ <dt>
++ <b>
++ Kann w3m Dinge in Farbe darstellen?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Ja. Wenn Sie <q>./configure</q> durchführen, werden Ihnen folgende Möglichkeiten angeboten:
++ </p>
++<pre>
++ Let's do some configurations. Choose config option among the list. <br> 1 - Baby model (no color, no menu, no mouse, no cookie, no SSL) <br> 2 - Little model (color, menu, no mouse, no cookie, no SSL) <br> 3 - Mouse model (color, menu, mouse, no cookie, no SSL) <br> 4 - Cookie model (color, menu, mouse, cookie, no SSL)<br> 5 - Monster model (with everything; you need openSSL library) <br> 6 - Customize Which?
++</pre>
++ <p>
++ Sie entscheiden sich für 2, 3, 4, oder 5.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Kann w3m mit monochromen Bildschirmen benutzt werden?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Ja, Sie können entweder
++ </p>
++ <ul>
++ <li>
++ obige Frage bei <q>./configure</q> mit 1 beantworten, oder
++ </li>
++ <li>
++ w3m mit der Option -M starten, oder
++ </li>
++ <li>
++ innerhalb von w3m die Taste <q>o</q> betätigen, was den Einstellungs-Dialog öffnet, in dem Sie <q>in Farbe anzeigen</q> abschalten können.
++ </li>
++ </ul>
++ </dd>
++ <dt>
++ <b>
++ Wie kann ich den angezeigten Bereich verschieben?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Indem Sie den Cursor an den Rand des Bildschirmes bewegen. AuÃerdem können Sie die folgenden Kommmandos nutzen
++ </p>
++ <ul>
++ <li>SHIFT_LEFT und SHIFT_RIGHT, denen die Tasten <span class="mono">></span> und <span class="mono"><</span> zugeordnet sind</li>
++ <li>SHIFT_LEFT1 und SHIFT_RIGHT1, denen die Tasten <span class="mono">.</span> und <span class="mono">,</span> zugeordnet sind</li>
++ </ul>
++ <p>
++ Ein weiterer Weg wäre, mit der Option -geometry des Terminalprogramms den zur Anzeige verfügbaren Platz anzupassen, beispielsweise mit einer Eingabe der Art
++ </p>
++ <pre> xterm -geometry 110x45 -bg white -name w3m -e w3m -B</pre>
++ </dd>
++ <dt>
++ <b>
++ Wie komme ich von einem zum anderen Hyperlink?
++ </b>
++ </dt>
++ <dd>
++ <p>
++
++ Sie erreichen den nächsten Hyperlink mit der TAB-Taste. Zum vorhergehenden springt der Cursor, wenn die ESC-Taste vor der TAB-Taste gedrückt wurde. (Mehr zu <a href="MANUAL.html#Functions" target="_blank"> Funktionen und Tastaturbelegung</a> im Handbuch von w3m)
++
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Grafische Browser stellen ein Wort rot dar, w3m hingegen nicht. Warum?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ w3m ignoriert das Attribut COLOR="..." in HTML. Dessen Berücksichtigung zu implementieren, wäre möglich, aber ich denke, die Dokumente wären am Ende schwerer lesbar.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Wie ändere ich die für Hyperlinks, Bilder und Formularfelder benutzten Farben?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Tippen Sie in w3m <q>o</q> ein und gelangen damit in den Einstellungs-Dialog. Dort können Sie die Farben ändern.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ w3m scheint die Umgebungsvariable EDITOR zu ignorieren. Weshalb?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Tippen Sie in w3m <q>o</q> ein und gelangen damit in den Einstellungs-Dialog. Jeglicher Eintrag im Feld <q>Editor</q> hat Vorrang gegenüber der Umgebungsvariablen.
++ </p>
++ <p>
++ Wenn Sie also das durch EDITOR angegebene Textbearbeitungsprogramm verwenden möchten, löschen Sie den Eintrag und drücken [OK].
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Wie breche ich eine Suche oder die Eingabe einer URL ab?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Löschen Sie den eingegebenen Text mit <span class="mono">STRG-u</span> und drücken Sie die Eingabetaste.
++ </p>
++ </dd>
++ </dl>
++ <p align="right">
++ <i>
++ Zurück zur <a href="#index">Ãbersicht</a>
++ </i>
++ </p>
++ <h2 id="www">
++ <u>
++ Fragen zur Benutzung als Internetbrowser
++ </u>
++ </h2>
++ <dl>
++ <dt>
++ <b>
++ Wie fülle ich mit w3m Formulare aus?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Formular-Eingabefelder werden in rot (oder invertiert) angezeigt. Bewegen Sie den Cursor dorthin. Wenn es
++ </p>
++ <ul>
++ <li>
++ ein Texteingabefeld ist, drücken Sie die Eingabetaste, schreiben den Text unten in die Eingabezeile und drücken die Eingabetaste nochmals,
++ </li>
++ <li>
++ sich um einen Radiobutton oder eine Checkbox handelt, wird bei Drücken der Eingabetaste die Auswahl verändert oder neu getroffen
++ </li>
++ <li>
++ sich um einen Texteingabebereich handelt, wird durch Drücken der Eingabetaste ein Editor gestartet
++ </li>
++ <li>
++ sich um eine Schaltflächen für <q>Ãbermitteln</q> oder <q>Zurücksetzen</q> handelt, wird die entsprechende Aktion ausgeführt.
++ </li>
++ </ul>
++ </dd>
++ <dt>
++ <b>
++ w3m scheint langsamer als einige andere Browser zu sein. Warum?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ HTML-Dokumente werden in zwei Schritten verarbeitet. Erst nachdem ein Dokument vollständig vorliegt, baut w3m die Anzeige auf.
++ </p>
++ <p>
++ Da die meisten anderen Browser die Seite aufbauen, ehe sie komplett ist, scheinen sie schneller.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Die Zeit zum Laden einer Seite wird nicht geringer, wenn diese Seite schon einmal angezeigt wurde.
++ </b>
++ </dt>
++ <dd>
++ <p>
++ w3m nutzt keinen eigenen Zwischenspeicher. Es liest daher Dokumente jedesmal neu vom Server ein. Wenn möglich, verwenden Sie einen Server für die Zwischenspeicherung.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Wie lade ich eine Datei herunter, auf die verlinkt wird?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Verwenden Sie <q>a</q> (oder <q>d</q> bei lynx-artiger Tastaturbelegung) oder <span class="mono">ESC RET</span>. Wenn Sie ein eingebundenes Bild herunterladen möchten, drücken Sie <span class="mono">ESC I</span>. (Mehr zu <a href="MANUAL.html#Functions" target="_blank"> Funktionen und Tastaturbelegung</a> im Handbuch von w3m)
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Wie gebe ich einen Proxy-Server vor?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Setzen Sie die Umgebungsvariablen HTTP_PROXY, HTTPS_PROXY, GOPHER_PROXY und FTP_PROXY oder öffnen mit <q>o</q> den Einstellungs-Dialog. Um beispielsweise den Port 8000 von proxy.example.org zu benutzen, geben Sie ein
++ </p>
++ <pre> http://proxy.example.org:8000/</pre>
++ </dd>
++<!-- deleted, see mail dated Mon, 04 Apr 2016 20:50:27 +0900 (JST)
++from Tatsuya Kinoshita <tats@debian.org>
++ <dt>
++ <b>
++ w3m freezes when I invoke an external browser.
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Enter w3m's option screen using the <q>o</q> key and specify
++ </p>
++ <pre> firefox %s &</pre>
++ <p>
++ (if you are using Firefox). Note that %s is replaced with the URL
++ when invoking.
++ </p>
++ </dd>
++ -->
++ <dt>
++ <b>
++ Wie wähle ich den standardmäÃig verwendeten Bildbetrachter aus?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ StandardmäÃig benutzt w3m den Bildbetrachter xv. Wenn Sie beispielsweise <q>display</q> vorziehen, ergänzen Sie ~/.w3m/mailcap oder /etc/mailcap um die Zeile:
++ </p>
++<pre>
++ image/*; display %s
++</pre>
++ <p>
++ Ebenso können Sie für andere Dateitypen externe Anzeigeprogramme festlegen:
++ </p>
++<pre>
++ image/*; display %s <br>application/postscript; ghostview %s <br>application/x-dvi; xdvi %s
++</pre>
++ </dd>
++ <dt>
++ <b>
++ Wie wird eine URL eingegeben?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Drücken Sie <span class="mono">U</span>
++ </p>
++ </dd>
++ <dt>
++ <b>
++ w3m hängt eine URL an die vorherige an, obwohl die Zeile mit <span class="mono">STRG-u</span> gelöscht worden war. Was ist zu tun?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Geben Sie die <i>komplette</i> Adresse ein, z.B. http://www.slashdot.org.
++ </p>
++ </dd>
++ </dl>
++ <p align="right">
++ <i>
++ Zurück zur <a href="#index">Ãbersicht</a>
++ </i>
++ </p>
++ <h2 id="other">
++ <u>
++ Verschiedenes
++ </u>
++ </h2>
++ <dl>
++ <dt>
++ <b>
++ Ich suche die Konfigurationsdatei von w3m.
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Es ist ~/.w3m/config.
++ </p>
++
++ <p>
++ In dieser Datei kann jeder Benutzer das Verhalten von w3m anpassen. Sie finden dort zeilenweise die Variablen zu den im Einstellungs-Dialog beschriebenen Optionen. Den Namen und die Belegung einer Variable trennt ein Leerzeichen.
++ </p>
++
++ <p>Ohne eine benutzerspezifische Konfigurationsdatei richtet sich w3m nach der systemweiten Konfigurationsdatei /etc/w3m/config.
++ </p>
++
++ </dd>
++ <dt>
++ <b>
++ Wofür sind die w3mxxxx Dateien in meinem ~/.w3m Verzeichnis gut?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Es handelt sich um temporäre Dateien, die w3m beim Lesen anlegt. Sie dienen nicht zur Zwischenspeicherung und werden beim Verlassen des Programms normalerweise gelöscht. Wenn welche zurückbleiben, löschen Sie sie einfach selbst.
++ </p>
++ </dd>
++ </dl>
++ <p align="right">
++ <i>
++ Zurück zur <a href="#index">Ãbersicht</a>
++ </i>
++ </p>
++ </body>
++</html>
+diff --git a/doc-de/MANUAL.html b/doc-de/MANUAL.html
+new file mode 100644
+index 0000000..f922314
+--- /dev/null
++++ b/doc-de/MANUAL.html
+@@ -0,0 +1,2340 @@
++
++<html>
++ <head>
++ <title>w3m Handbuch</title>
++ <style>
++ span.mono {
++ font-family:mono;
++ }
++ </style>
++ <meta http-equiv="content-type" content="text/html;charset=UTF-8">
++ </head>
++ <body>
++ <!--
++insertions tagged with "mh 2016-03-29" and "mh 2016-06-11" come from the latest version of manual page w3m (1)
++ -->
++
++ <h1>w3m HANDBUCH</h1>
++ <div align="right">
++ Akinori Ito<br> aito@fw.ipsj.or.jp
++ </div>
++ <h2>Ãbersicht</h2>
++ <ul>
++ <li>
++ <a href="#Einführung">
++ Einführung
++ </a>
++ </li>
++ <li>
++ <a href="#Einstellungen">
++ Einstellungen
++ </a>
++ </li>
++ <li>
++ <a href="#Color">
++ Farbzuordnung im Dokument
++ </a>
++ </li>
++ <li>
++ <a href="#Functions">
++ Funktionen und Tastaturbelegung
++ </a>
++ </li>
++<!-- mh 2016-06-13 obsolete
++ <li>
++ <a href="#Key:lynx">
++ Lynx-like key bindings
++ </a>
++ </li>
++-->
++ <li>
++ <a href="#Mouse">
++ Bedienung per Maus
++ </a>
++ </li>
++<!-- mh 2016-06-13 obsolete
++ <li>
++ <a href="#Key:custom">
++ Key customization
++ </a>
++ </li>
++ -->
++ <li>
++ <a href="#LocalCGI">
++ Lokale CGI-Skripte
++ </a>
++ </li>
++ </ul>
++ <hr>
++ <h2 id="Einführung">
++ Einführung
++ </h2>
++ <p>
++ w3m ist ein textorientierter Browser und Textbetrachter (Pager). In einem Terminalemulator können Sie damit lokale und andere Dokumente anzeigen lassen und Verknüpfungen (Hyperlinks) weiterverfolgen.
++ </p>
++ <hr>
++ <h2 id="Einstellungen">
++ Einstellungen
++ </h2>
++ <p>
++ Der Aufruf per Befehlszeile lautet
++ </p>
++<!-- mh 2016-08-06 invocation adapted to w3m(1). w3m accepts several options and several targets -->
++<pre>
++ w3m [Option]⦠[Datei|Adresse]â¦
++</pre>
++ <p>
++ Wenn Sie Dateinamen oder Adressen in der Befehlszeile angeben, werden diese Dokumente angezeigt. Fehlen entsprechende Argumente, wird w3m ein Dokument aus der Standardeingabe erwarten und anzeigen. Erhält das Programm auch hier keine Daten, beendet es sich normalerweise selbstständig.
++ </p>
++ <p>
++ Optionen sind unter anderem:
++ </p>
++ <dl>
++<h3>Allgemeine Optionen</h3>
++ <dt>
++ -B
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ starte mit einer Ansicht aller Lesezeichen (wenn kein anderes Zielobjekt angegeben ist)
++ </p>
++ </dd>
++ <dt>
++ -M
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ monochrome Anzeige
++ </p>
++ </dd>
++ <dt>
++ -no-mouse
++ </dt>
++ <dd>
++ <p>
++ Mausfunktion aus
++ </p>
++ </dd>
++ <dt>
++ -num
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ zeige Zeilennummern an
++
++ </p>
++ </dd>
++<!-- mh 2016-08-06 commented out. As implementation is not verified.
++ <dt>
++ -ppc <i>num</i>
++ </dt>
++ <dd>
++ <p>
++ width of <i>num</i> pixels per character. Range of 4.0 to 32.0,
++ default 8.0. Larger values will make tables
++ narrower. (Implementation not verified)
++ </p>
++ </dd>
++-->
++ <dt>
++ -v
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ begrüÃe den Benutzer mit einer eingebauten Seite (wenn kein anderes Zielobjekt angegeben ist)
++ </p>
++ </dd>
++ <dt>
++ -W
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ wechsle zwischen umlaufendem und nicht umlaufendem Suchen
++ </p>
++ </dd>
++ <dt>
++ -X
++ </dt>
++ <dd>
++ <p>
++ nach Beenden des Programms das Terminal nicht neu initialisieren.
++ </p>
++ </dd>
++ <dt>
++ +<i>Zahl</i>
++ </dt>
++ <dd>
++ <!--mh 2016-06-11 --><p>
++ gehe zu Zeile <i>Zahl</i>. Wirkt nur, wenn <i>Zahl</i> gröÃer ist als die im Terminal verfügbare Zeilenzahl
++ </p>
++ </dd>
++<h3>Browser-Optionen</h3>
++ <dt>
++ -cols <i>Zahl</i>
++ </dt>
++ <dd>
++ <!-- mh 2016-06-11 --><p>
++
++ bei für die Standardausgabe bestimmten Inhalten, nimm bei zur Umsetzung von HTML eine Länge von <i>num</i> Zeichen pro Zeile
++ </p>
++ </dd>
++ <dt>
++ -cookie
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ verwende gespeicherte Cookies und akzeptiere neue
++ </p>
++ </dd>
++ <dt>
++ -no-cookie
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ verwende weder gespeicherte Cookies noch akzeptiere neue
++
++ </p>
++ </dd>
++ <dt>
++ -F
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ verarbeite Frames
++ </p>
++ </dd>
++ <dt>
++ -no-graph
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ verwende bei der Umsetzung von Tabellen und Frames keine grafischen Zeichen
++ </p>
++ </dd>
++ <dt>
++ -header <i>Zeichenkette</i>
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ füge der HTTP(S)-Anfrage <i>Zeichenkette</i> an. Diese muss der Kopfdaten-Syntax <span class="mono">"Variable: Wert"</span> entsprechen
++ </p>
++ </dd>
++ <dt>
++ -m
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29
++Render the body of Usenet messages according to the header <q>Content-type</q>
++--><p>
++ arbeite im <q>Internetnachrichten-Modus</q>. Mit dieser Option entnimmt w3m den Typ eines Dokumentes dessen Kopfdaten. Dies ist nützlich beim Lesen von Mails und Usenet-Nachrichten.
++
++ </p>
++ </dd>
++ <dt>
++ -no-proxy
++ </dt>
++ <dd>
++ <!-- mh 2016-06-11--><p>
++
++ verwende keinen Proxy
++ </p>
++ </dd>
++ <dt>
++ -post <i>Datei</i>
++ </dt>
++ <dd>
++ <!--funktionierend 2016-06-28T08:22>--><p>
++ verwende die Methode POST, um in <i>Datei</i> hinterlegte Daten hochzuladen. Hierbei wird die Syntax <span class="mono">"var1=wert1[&var2=wert2]…"</span> erwartet
++ </p>
++ </dd>
++<h3>Textbetrachter-Optionen</h3>
++ <dt>
++ -l <i>Zahl</i>
++ </dt>
++ <dd>
++ <!-- mh2016-06-11--><p>
++
++ Anzahl der Zeilen, die zwischengespeichert werden, wenn Text per Standardeingabe übergeben wurde. (Voreinstellung ist 10000)
++ </p>
++ </dd>
++ <dt>
++ -r
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29 --><p>
++
++ verarbeite spezielle Escape-Zeichen (beispielsweise ANSI-Escape-Zeichen oder nroff-Rückwärtsschritte für fette und unterstrichene Zeichen) nicht, sondern zeige sie stattdessen mittels Caret-Notation.
++ </p>
++ </dd>
++ <dt>
++ -s
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ mehrere leere Zeilen werden bis auf eine gelöscht
++ </p>
++ </dd>
++
++ <!--mh 2016-03-29 --><dt>
++ -t <i>Zahl</i>
++ </dt>
++ <dd>
++ <!--mh 2016-03-29--><p>
++ Tab-Zeichen so verwerten, dass Spalten mit einer Weite von <i>Zahl</i> Zeichen entstehen. Wirkt nicht auf Standardausgabe
++ </p>
++ </dd>
++<h3>Datenart- und Datenkodierungs-Optionen</h3>
++ <dt>
++ -I <i>Zeichenkodierung</i>
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ zu benutzende Zeichenkodierung für erhaltene Daten
++ </p>
++ </dd>
++ <dt>
++ -O <i>Zeichenkodierung</i>
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29 --><p>
++
++ zu benutzende Zeichenkodierung für auszugebende Daten
++ </p>
++ </dd>
++ <dt>
++ -T <i>Typ</i>
++ </dt>
++ <dd>
++ <!-- mh 2016-06-11--><p>
++
++ legt den MIME-Typ erhaltener Daten fest. Ohne diese Option bestimmt ihn das Programm anhand der Dateinamen-Erweiterung. Wenn dies fehlschlägt, wird text/plain als Typ angenommen. Zum Beispiel:
++ </p>
++ <p>
++ Ãbernimm HTML-Dokument von der Standardeingabe und zeige es an
++ </p>
++<pre>
++ cat beispiel.html | w3m -T text/html
++</pre>
++ <p>
++ Zeige HTML-Quelltext an
++ </p>
++<pre>
++ w3m -T text/plain beispiel.html
++</pre>
++ </dd>
++<h3>Optionen zur Datenausgabe, mit sofortigem Verlassen des Programms</h3>
++ <dt>
++ -dump
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29 --><p>
++ lies das per URL angegebene Dokument und leite es verarbeitet der Standardausgabe zu. Wenn mit der Option -cols nichts anderes eingestellt ist, erhält es eine Breite von 80 Zeichen
++ </p>
++ </dd>
++ <dt>
++ -dump_source
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ leite den Seitenquelltext der Standardausgabe zu
++ </p>
++ </dd>
++ <dt>
++ -dump_head
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ leite die Antwort einer HEAD-Anfrage für eine URL der Standardausgabe zu
++ </p>
++ </dd>
++ <dt>
++ -dump_both
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ leite Antwort auf HEAD-Anfrage und Seitenquelltext der Standardausgabe zu
++
++ </p>
++ </dd>
++ <dt>
++ -dump_extra
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ leite Antwort auf HEAD-Anfrage, Seitenquelltext und Extrainformation der Standardausgabe zu
++ </p>
++ </dd>
++
++<h3>Optionen, die Standards für Einstellungen und Datenquellen auÃer Kraft setzen</h3>
++
++ <dt>
++ -bookmark <i>Datei</i>
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ benutze anstelle der Standarddatei bookmark.html für Lesezeichen die Datei <i>Datei</i>
++ </p>
++ </dd>
++ <dt>
++ -config <i>Datei</i>
++ </dt>
++ <dd>
++ <!--mh 2016-06-11--><p>
++
++ benutze <i>Datei</i> anstelle der Standard-Konfigurationsdatei
++ </p>
++ </dd>
++ <dt>
++ -o <i>Option</i>=<i>Wert</i>
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ arbeite mit einer Konfiguration, bei der die Einstellung <i>Option</i> mit <i>Wert</i> belegt ist. Ohne <i>Option=Wert</i> gleichwertig mit <i>-show-option</i>
++ </p>
++ </dd>
++ </dl>
++ <hr>
++ <h2 id="Color">
++ Farbzuordnung im Dokument
++ </h2>
++ <p>
++ Links und Bildelemente werden wie folgt angezeigt:
++ </p>
++ <div align="center"> <table border="1"> <tr>
++ <th>
++ </th>
++ <th>
++ Farbmodus
++ </th>
++ <th>
++ Monochrom-Modus
++ </th>
++ </tr>
++ <tr>
++ <td>
++ Hyperlinks
++ </td>
++ <td>
++ blau
++ </td>
++ <td>
++ unterstrichen
++ </td>
++ </tr>
++ <tr>
++ <td>
++ Bilder
++ </td>
++ <td>
++ grün
++ </td>
++ <td>
++ invertiert
++ </td>
++ </tr>
++ <tr>
++ <td>
++ Formular-Eingabefelder
++ </td>
++ <td>
++ rot
++ </td>
++ <td>
++ invertiert
++ </td>
++ </tr>
++ </table>
++ </div>
++ <p>
++ Diese Farben können nach Eingabe von <q>o</q> im Einstellungs-Dialog anders zugeordnet werden.
++ </p>
++ <hr>
++ <h2 id="Functions">
++ Funktionen und Tastaturbelegung
++ </h2>
++
++ <!-- mh 2016-06-13 obsolete
++ If you prefer using Lynx-like
++ key bindings, make w3m start with the respective keymap file keymap.lynx. (see w3m (1)).--><p>
++ Wenn w3m läuft, bedienen Sie das Programm, indem Sie Funktionen anhand ihres Namens oder der ihr zugeordneten Tastenkombination aufrufen. Es gibt voreingestellte Tastaturbelegungen.
++
++ </p>
++<!--
++ <h2 id="Key:custom">
++ Key customization
++ </h2>
++-->
++ <p>
++ Sie können die Tastaturbelegungen (abgesehen von jenen des Menü- und des Texteingabe-Modus) in einer Datei ~/.w3m/keymap anpassen. Beispielsweise bindet
++ </p>
++
++<pre>
++ keymap C-o NEXT_PAGE
++</pre>
++
++ <p>
++ die Funktion <span class="mono">NEXT_PAGE</span> (die normalerweise mit SPC und C-v verknüpft ist) mit C-o. Siehe die Liste verfügbarer Funktionen in <a href="README.func">README.func</a>. Original- und Lynx-artige Tastaturbelegungen enthalten die Beispieldateien <a href="keymap.default">keymap.default</a> und <a href="keymap.lynx">keymap.lynx</a>.
++ </p>
++
++ <p>
++ Im Folgenden stehen <i>C-</i> und <i>M-</i> für die Eingabe-Modifikationen mit der <i>Steuerungs-</i> und der <i>Meta-Taste</i>. Die letztere ersetzt die <i>ALT-Taste</i>, wohingegen Drücken der <i>ESC</i>-Taste zwischen <i>Meta</i>-modifiziertem und einfachen Tastendruck wechselt. Das Minus-Zeichen bedeutet das gleichzeitige Drücken von Tasten; der Leerraum dagegen steht dafür, dass eine Taste nach der anderen gedrückt wird. Mit <i>2 M</i> ist also gemeint, die <i>2</i> und dann <i>M</i> zu drücken.
++ </p>
++
++
++ <table border="1" width="100%">
++ <colgroup>
++ <col width="20%">
++ <col width="20%">
++ <col width="20%">
++ <col width="40%">
++ </colgroup>
++ <tr>
++ <th rowspan="2">
++ Funktion
++ </th>
++ <th colspan="2">Tastenkombination
++ </th>
++ <th rowspan="2">
++ Beschreibung
++ </th>
++ </tr>
++ <tr>
++ <th>
++ Standard
++ </th>
++ <th>
++ Lynx-ähnlich
++ </th>
++ </tr>
++ <tr>
++ <td colspan="4">
++ <h3>Navigation innerhalb von Seiten</h3>
++</td>
++ </tr>
++ <tr>
++ <td>
++ NEXT_PAGE
++ </td>
++ <td>
++ SPC, C-v, +, PGDN
++ </td>
++ <td>
++ SPC, C-v, +
++ </td>
++ <td>
++ Scrolle eine Seite abwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PREVIOUS_PAGE
++ </td>
++ <td>
++ b, M-v, -, PGUP
++ </td>
++ <td>
++ b, M-v, -
++ </td>
++ <td>
++ Scrolle eine Seite aufwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++ MOVE_RIGHT
++ </td>
++ <td>
++ l, C-f, RIGHT
++ </td>
++ <td>
++ l
++ </td>
++ <td>
++ Bewege Cursor nach rechts (mit Verschiebung um halbe Bildschirmbreite an dessen Rand)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ C-b, LEFT
++ </td>
++ <td>
++ h, C-b, LEFT
++ </td>
++ <td>
++ h
++ </td>
++ <td>
++ Bewege Cursor nach links (mit Verschiebung um halbe Bildschirmbreite an dessen Rand)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ MOVE_DOWN
++ </td>
++ <td>
++ j, C-n, DOWN
++ </td>
++ <td>
++ j
++ </td>
++ <td>
++ Bewege Cursor abwärts (scrolle eine Zeile am Bildschirmrand)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ MOVE_UP
++ </td>
++ <td>
++ k, C-p, UP
++ </td>
++ <td>
++ k
++ </td>
++ <td>
++ Bewege Cursor aufwärts (scrolle eine Zeile am Bildschirmrand)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ UP
++ </td>
++ <td>
++ J
++ </td>
++ <td>
++ J
++ </td>
++ <td>
++ Scrolle den Anzeigebereich eine Zeile aufwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++ DOWN
++ </td>
++ <td>
++ K
++ </td>
++ <td>
++ K
++ </td>
++ <td>
++ Scrolle den Anzeigebereich eine Zeile abwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++ LINE_BEGIN
++ </td>
++ <td>
++ ^, C-a
++ </td>
++ <td>
++ ^
++ </td>
++ <td>
++ Gehe zum Zeilenanfang
++ </td>
++ </tr>
++ <tr>
++ <td>
++ LINE_END
++ </td>
++ <td>
++ $, C-e
++ </td>
++ <td>
++ $
++ </td>
++ <td>
++ Gehe zum Zeilenende
++ </td>
++ </tr>
++ <tr>
++ <td>
++ NEXT_WORD
++ </td>
++ <td>
++ w
++ </td>
++ <td>
++ w
++ </td>
++ <td>
++ Gehe zum nächsten Wort
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PREVIOUS_WORD
++ </td>
++ <td>
++ W
++ </td>
++ <td>
++ W
++ </td>
++ <td>
++ Gehe zum vorherigen Wort
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SHIFT_RIGHT
++ </td>
++ <td>
++ >
++ </td>
++ <td>
++ >
++ </td>
++ <td>
++ Anzeigebereich nach rechts versetzen
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SHIFT_LEFT
++ </td>
++ <td>
++ <
++ </td>
++ <td>
++ <
++ </td>
++ <td>
++ Anzeigebereich nach links versetzen
++ </td>
++ </tr>
++ <tr>
++ <td>
++ RIGHT
++ </td>
++ <td>
++ .
++ </td>
++ <td>
++ .
++ </td>
++ <td>
++ Anzeigebereich um eine Spalte nach rechts verschieben
++ </td>
++ </tr>
++ <tr>
++ <td>
++ LEFT
++ </td>
++ <td>
++ ,
++ </td>
++ <td>
++ ,
++ </td>
++ <td>
++ Anzeigebereich um eine Spalte nach links verschieben
++ </td>
++ </tr>
++ <tr>
++ <td>
++ BEGIN
++ </td>
++ <td>
++ g, M-<, HOME
++ </td>
++ <td>
++ C-a, M-<
++ </td>
++ <td>
++ Gehe zur ersten Zeile
++ </td>
++ </tr>
++ <tr>
++ <td>
++ END
++ </td>
++ <td>
++ G, M->, END
++ </td>
++ <td>
++ C-e, M->
++ </td>
++ <td>
++ Gehe zur letzten Zeile
++ </td>
++ </tr>
++ <tr>
++ <td>
++ GOTO_LINE
++ </td>
++ <td>
++ M-g
++ </td>
++ <td>
++ G
++ </td>
++ <td>
++ Gehe zur angegebenen Zeile
++ </td>
++ </tr>
++ <tr>
++ <td>
++ LINE_INFO
++ </td>
++ <td>
++ C-g
++ </td>
++ <td>
++ C-g
++ </td>
++ <td>
++ Zeige aktuelle Position im Dokument an
++ </td>
++ </tr>
++ <tr>
++ <td>
++ CENTER_H
++ </td>
++ <td>
++ Z
++ </td>
++<!--Correction by mh 2014-04-06
++Description for keybinding of z and Z had been mingled
++-->
++ <td>
++ Z
++ </td>
++ <td>
++ Bildschirm rechts und links des Cursors zentrieren
++ </td>
++ </tr>
++ <tr>
++ <td>
++ CENTER_V
++ </td>
++ <td>
++ z
++ </td>
++ <td>
++ z
++ </td>
++ <td>
++ Bildschirm ober- und unterhalb des Cursors zentrieren
++ </td>
++ </tr>
++ <tr>
++ <td>
++ NEXT_LINK
++ </td>
++ <td>
++ TAB
++ </td>
++ <td>
++ TAB, C-n, DOWN
++ </td>
++ <td>
++ Gehe zum nächsten Hyperlink
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PREVIOUS_LINK
++ </td>
++ <td>
++ M-TAB, C-u
++ </td>
++ <td>
++ M-TAB, C-u, C-p, UP
++ </td>
++ <td>
++ Gehe zum vorangegangen Hyperlink
++ </td>
++<!-- Annotion mh 2016-04-06
++Keybinding description for C-g had been moved as it did not fit to "Hyperlink operation" and position in the default and lynx-like series differed
++ -->
++ </tr>
++ <tr>
++ <td>
++ LINK_BEGIN
++ </td>
++ <td>
++ [
++ </td>
++ <td>
++ [
++ </td>
++ <td>
++ Gehe zum ersten Hyperlink
++ </td>
++ </tr>
++ <tr>
++ <td>
++ LINK_END
++ </td>
++ <td>
++ ]
++ </td>
++ <td>
++ ]
++ </td>
++ <td>
++ Gehe zum letzten Hyperlink
++ </td>
++ </tr>
++<tr>
++<td>MOVE_LIST_MENU</td>
++<td>M-m</td>
++<td>M-m</td>
++<td>Ãffne Menü mit vorhandenen Hyperlinks</td>
++</tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Umgang mit Hyperlinks</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ GOTO_LINK
++ </td>
++ <td>
++ C-j, C-m, RET
++ </td>
++ <td width="100">
++ C-f, C-j, C-m, RET, RIGHT
++ </td>
++ <td>
++ Folge dem aktuellen Hyperlink in neuem Puffer
++ </td>
++ </tr>
++<tr>
++<td>LIST_MENU</td>
++<td>M-l</td>
++<td>M-l</td>
++<td>Ãffne Menü mit Hyperlinks und folge dem ausgewählten</td>
++</tr>
++ <tr>
++ <td>
++ SAVE_LINK
++ </td>
++ <td>
++ a, M-RET
++ </td>
++ <td>
++ d, M-RET
++ </td>
++ <td>
++ Speichere Ziel des Hyperlinks
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PEEK_LINK
++ </td>
++ <td>
++ u
++ </td>
++ <td>
++ u
++ </td>
++ <td>
++ Zeige Zieladresse
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PEEK_IMG
++ </td>
++ <td>
++ i
++ </td>
++ <td>
++ i
++ </td>
++ <td>
++ Zeige Adresse des Bildes
++ </td>
++ </tr>
++ <tr>
++ <td>
++ VIEW_IMAGE
++ </td>
++ <td>
++ I
++ </td>
++ <td>
++ I
++ </td>
++ <td>
++ Zeige Bild in Betrachter
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SAVE_IMAGE
++ </td>
++ <td>
++ M-I
++ </td>
++ <td>
++ M-I
++ </td>
++ <td>
++ Speichere Bild
++ </td>
++ </tr>
++<tr>
++<td>MARK_WORD</td>
++<td>;</td>
++<td>;</td>
++<td>Wandle aktuelles Wort in Hyperlink um</td>
++</tr>
++ <tr>
++ <td>
++ MARK_URL
++ </td>
++ <td>
++ :
++ </td>
++ <td>
++ :
++ </td>
++ <td>
++ Wandle URL-artige Zeichenketten um in Hyperlinks
++ </td>
++ </tr>
++ <tr>
++ <td>
++ MARK_MID
++ </td>
++ <td>
++ M-:
++ </td>
++ <td>
++ M-:
++ </td>
++ <!-- changed due to mail dated Mon, 04 Apr 2016 00:47:09 +0900 (JST)
++from Tatsuya Kinoshita --><td>
++
++ Wandle Nachrichten-ID-artige Zeichenketten um in Hyperlinks
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PEEK
++ </td>
++ <td>
++ c
++ </td>
++ <td>
++ c
++ </td>
++ <td>
++ Zeige aktuelle Adresse an
++ </td>
++ </tr>
++ <tr>
++ <td>
++ INFO
++ </td>
++ <td>
++ =
++ </td>
++ <td>
++ =
++ </td>
++ <td>
++ Zeige Informationen über dieses Dokument
++ </td>
++ </tr>
++ <tr>
++ <td>
++ HISTORY
++ </td>
++ <td>
++ C-h
++ </td>
++ <td>
++ C-h
++ </td>
++ <td>
++ Chronik aufgesuchter Dokumente
++ </td>
++ </tr>
++ <tr>
++ <td>
++ EXTERN
++ </td>
++ <td>
++ M
++ </td>
++ <td>
++ M
++ </td>
++ <td>
++ Zeige das aktuelle Dokument mit einem externen Browser (wird eine Taste von 2 bis 9 gedrückt, also beispielsweise 3 M, eingegeben, kommt ein anderer, in der Konfiguration hinterlegter Browser zum Einsatz)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ EXTERN_LINK
++ </td>
++ <td>
++ M-M
++ </td>
++ <td>
++ M-M
++ </td>
++ <td>
++ Bringe das Linkziel mit einem externen Browser zur Anzeige (vorangestellte Zahlen wirken sich wie oben beschrieben aus)
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Verwalten von Lesezeichen</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ BOOKMARK
++ </td>
++ <td>
++ M-b
++ </td>
++ <td>
++ v, M-b
++ </td>
++ <td>
++ Lesezeichen ansehen
++ </td>
++ </tr>
++ <tr>
++ <td>
++ ADD_BOOKMARK
++ </td>
++ <td>
++ M-a
++ </td>
++ <td>
++ a, M-a
++ </td>
++ <td>
++ Lege für aktuelle Seite Lesezeichen an
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Umgang mit Dateien und Datenströmen</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ GOTO
++ </td>
++ <td>
++ U
++ </td>
++ <td>
++ g, U
++ </td>
++ <td>
++ Ãffne angegebenes Dokument in neuem Puffer
++ </td>
++ </tr>
++<tr>
++<td>GOTO_RELATIVE</td>
++<td>M-u</td>
++<td>M-u</td>
++<td>Ãffne relative Adresse in neuem Puffer</td>
++</tr>
++ <tr>
++ <td>
++ LOAD
++ </td>
++ <td>
++ V
++ </td>
++ <td>
++ V
++ </td>
++ <td>
++ Ãffne lokale Datei in einem neuen Puffer
++ </td>
++ </tr>
++ <tr>
++ <td>
++ READ_SHELL
++ </td>
++ <td>
++ @
++ </td>
++ <td>
++ @
++ </td>
++ <!--Execute shell command and view output--><!--mh 2016-06-13 No difference to PIPE_SHELL could be discerned--><td>
++
++
++ Führe einen Shell-Befehl aus und zeige Ausgabe in einem neuen Puffer
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PIPE_SHELL
++ </td>
++ <td>
++ #
++ </td>
++ <td>
++ #
++ </td>
++ <!--Execute shell command and browse output--><!--mh 2016-06-13 No difference to READ_SHELL could be discerned--><td>
++
++
++ Führe einen Shell-Befehl aus und zeige Ausgabe in einem neuen Puffer
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Arbeit an Seiteninhalten</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <!-- is an alias to SOURCE --><td>
++ VIEW
++ </td>
++ <td>
++ v
++ </td>
++ <td>
++ \
++ </td>
++ <td>
++ Wechsle zwischen HTML-Quellcode und verarbeitetem Dokument
++ </td>
++ </tr>
++<tr>
++<td>LIST</td>
++<td>L</td>
++<td>L</td>
++<td>Liste Link-Elemente, Hyperlinks und Bilder auf</td>
++</tr>
++ <tr>
++ <td>
++ FRAME
++ </td>
++ <td>
++ F
++ </td>
++ <td>
++ F
++ </td>
++ <td>
++ Wechsle zwischen Kennung und Umsetzung von HTML-Frames
++ </td>
++ </tr>
++ <tr>
++ <td>
++ REDRAW
++ </td>
++ <td>
++ C-l
++ </td>
++ <td>
++ C-l, C-w
++ </td>
++ <td>
++ Bildschirmanzeige neu aufbauen
++ </td>
++ </tr>
++ <tr>
++ <td>
++ RELOAD
++ </td>
++ <td>
++ R
++ </td>
++ <td>
++ R, C-r
++ </td>
++ <td>
++ Aktuelles Dokument erneut laden
++ </td>
++ </tr>
++ <tr>
++ <td>
++ EDIT
++ </td>
++ <td>
++ E
++ </td>
++ <td>
++ E
++ </td>
++ <td>
++ Bearbeite lokales Quelldokument
++ </td>
++ </tr>
++ <tr>
++ <td>
++ EDIT_SCREEN
++ </td>
++ <td>
++ M-e
++ </td>
++ <td>
++ M-e
++ </td>
++ <td>
++ Bearbeite eine Kopie des verarbeiteten Dokuments
++ </td>
++ </tr>
++<tr>
++<td>PIPE_BUF</td>
++<td>|</td>
++<td>|</td>
++<td>Leite aktuellen Pufferinhalt einem Shell-Befehl zu und zeige Ausgabe an</td>
++</tr>
++ <tr>
++ <!-- is an alias to SAVE --><td>
++ DOWNLOAD
++ </td>
++ <td>
++ M-s
++ </td>
++ <td>
++ M-s
++ </td>
++ <td>
++ Dokument-Quellcode speichern
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SAVE_SCREEN
++ </td>
++ <td>
++ S
++ </td>
++ <td>
++ S, p
++ </td>
++ <td>
++ Speichere verarbeitetes Dokument
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Navigation zwischen Puffern und Reitern</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ BACK
++ </td>
++ <td>
++ B
++ </td>
++ <td>
++ B, C-b, LEFT
++ </td>
++ <td>
++ SchlieÃe aktuellen Puffer und kehre zu dem im Stapel darunterliegenden zurück
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SELECT_MENU
++ </td>
++ <td>
++ s
++ </td>
++ <td>
++ s, C-h
++ </td>
++ <td>
++ Ãffne Pufferstapel-Menü
++ </td>
++ </tr>
++ <tr>
++ <td>
++ TAB_MENU
++ </td>
++ <td>
++ M-t
++ </td>
++ <td>
++ M-t
++ </td>
++ <td>
++ Ãffne das Reiter-Auswahl-Menü
++ </td>
++ </tr>
++ <tr>
++ <td>
++ NEW_TAB
++ </td>
++ <td>
++ T
++ </td>
++ <td>
++ T
++ </td>
++ <td>
++ Ãffne neuen Reiter (mit aktuellem Dokument)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ TAB_LINK
++ </td>
++ <td>
++ C-t
++ </td>
++ <td>
++ C-t
++ </td>
++ <td>
++ Folge dem aktuellen Hyperlink in einem neuen Reiter
++ </td>
++ </tr>
++ <tr>
++ <td>
++ NEXT_TAB
++ </td>
++ <td>
++ }
++ </td>
++ <td>
++ }
++ </td>
++ <td>
++ Schalte zum nächsten Reiter
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PREV_TAB
++ </td>
++ <td>
++ {
++ </td>
++ <td>
++ {
++ </td>
++ <td>
++ Schalte zum vorherigen Reiter
++ </td>
++ </tr>
++ <tr>
++ <td>
++ CLOSE_TAB
++ </td>
++ <td>
++ C-q
++ </td>
++ <td>
++ C-q
++ </td>
++ <td>
++ SchlieÃe aktuellen Reiter
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Suchfunktionen</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ SEARCH
++ </td>
++ <td>
++ /
++ </td>
++ <td>
++ /, C-s
++ </td>
++ <td>
++ Suche vorwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SEARCH_BACK
++ </td>
++ <td>
++ ?
++ </td>
++ <td>
++ </td>
++ <td>
++ Suche rückwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++ ISEARCH
++ </td>
++ <td>
++ C-s
++ </td>
++ <td>
++ </td>
++ <td>
++ Inkrementelle Suche vorwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++ ISEARCH_BACK
++ </td>
++ <td>
++ C-r
++ </td>
++ <td>
++ </td>
++ <td>
++ Inkrementelle Suche rückwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SEARCH_NEXT
++ </td>
++ <td>
++ n
++ </td>
++ <td>
++ n
++ </td>
++ <td>
++ Setze Suche vorwärts fort
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SEARCH_PREV
++ </td>
++ <td>
++ N
++ </td>
++ <td>
++ </td>
++ <td>
++ Setze Suche rückwärts fort
++ </td>
++ </tr>
++ <tr>
++ <td>
++ WRAP_TOGGLE
++ </td>
++ <td>
++ C-w
++ </td>
++ <td>
++ w
++ </td>
++ <td>
++ Wechsle zwischen umlaufendem und nicht-umlaufendem Suchen
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Arbeit mit Textmarken</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ MARK
++ </td>
++ <td>
++ C-SPC
++ </td>
++ <td>
++ C-SPC
++ </td>
++ <td>
++ Setze/Lösche Markierung
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PREV_MARK
++ </td>
++ <td>
++ M-p
++ </td>
++ <td>
++ P
++ </td>
++ <td>
++ Gehe zur vorherigen Markierung
++ </td>
++ </tr>
++ <tr>
++ <td>
++ NEXT_MARK
++ </td>
++ <td>
++ M-n
++ </td>
++ <td>
++ N
++ </td>
++ <td>
++ Gehe zur nächsten Markierung
++ </td>
++ </tr>
++ <tr>
++ <td>
++ REG_MARK
++ </td>
++ <td>
++ "
++ </td>
++ <td>
++ "
++ </td>
++ <td>
++ Markiere alle Vorkommen eines Zeichenmusters
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Verschiedenes</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ COMMAND
++ </td>
++ <td>
++ M-c
++ </td>
++ <td>
++ M-c
++ </td>
++ <td>
++ Rufe eine oder mehrere durch Strichpunkt getrennte w3m-Funktionen auf
++ </td>
++ </tr>
++<!--
++TODO: Where does this key binding M-Fn come from. I do not find a Fn-key on my keyboard. I do not know how to type in the keystroke combinations listed in keymap.default which are
++keymap M-[E MENU
++keymap M-[L MENU
++keymap M-[2~ MENU
++keymap M-[28~ MENU
++<tr>
++<td>MENU</td>
++<Td>M-Fn</Td>
++<td></td>
++<td>Pop up menu</td>
++</tr>
++-->
++ <tr>
++ <td>
++ HELP
++ </td>
++ <td>
++ H
++ </td>
++ <td>
++ H, ?
++ </td>
++ <td>
++ Zeige Hilfe-Ãbersicht
++ </td>
++ </tr>
++ <tr>
++ <td>
++ OPTIONEN
++ </td>
++ <td>
++ o
++ </td>
++ <td>
++ o
++ </td>
++ <td>
++ Einstellungs-Dialog öffnen
++ </td>
++ </tr>
++<tr>
++<td>SET_OPTION</td>
++<td>M-o</td>
++<td>M-o</td>
++<td>Setze Option</td>
++</tr>
++<tr>
++<td>DEFINE_KEY</td>
++<td>M-k</td>
++<td>M-k</td>
++<td>Definiere eine Verbindung zwischen einer Tastenkombination und einem Kommando</td>
++</tr>
++<tr>
++<td>MOUSE_TOGGLE</td>
++<td>m</td>
++<td>m</td>
++<td>Schalte Mausbedienung an oder ab</td>
++</tr>
++<tr>
++<td>DOWNLOAD_LIST</td>
++<td>D</td>
++<td>D</td>
++<td>Ãbersicht heruntergeladener Dateien anzeigen</td>
++</tr>
++ <tr>
++ <td>
++ COOKIE
++ </td>
++ <td>
++ C-k
++ </td>
++ <td>
++ C-k
++ </td>
++ <td>
++ Zeige die gespeicherten Cookies
++ </td>
++ </tr>
++<!--
++mh 2016-06-12 Interrupt is an alias to SUSPEND, no need to mention it here
++ <tr>
++ <td>
++ INTERRUPT
++ </td>
++ <td>
++ C-c
++ </td>
++ <td>
++ C-c
++ </td>
++ <td>
++ Interrupt
++ </td>
++ </tr>
++-->
++<tr>
++<td>UNDO</td>
++<td>(</td>
++<td>(</td>
++<td>Nimm die letzte Cursorbewegung zurück</td>
++</tr>
++<tr>
++<td>REDO</td>
++<td>)</td>
++<td>)</td>
++<td>Den letzten Rücknahmebefehl zurücknehmen</td>
++</tr>
++ <tr>
++ <!-- is an alias of SHELL --><td>
++ EXEC_SHELL
++ </td>
++ <td>
++ !
++ </td>
++ <td>
++ !
++ </td>
++ <td>
++ Shell-Befehl ausführen
++ </td>
++ </tr>
++<tr>
++<td>DICT_WORD</td>
++<td>M-w</td>
++<td>M-w</td>
++<td>Führe eine Wörterbuch-Funktion aus (siehe <a href="../doc/README.dict">README.dict</a>)</td>
++</tr>
++<tr>
++<td>DICT_WORD_AT</td>
++<td>M-W</td>
++<td>M-W</td>
++<td>Benutze Wörterbuch für Wort unter Cursor</td>
++</tr>
++<tr>
++<td>VERSION</td>
++<td>r</td>
++<td>r</td>
++<td>Zeige die Version von w3m an</td>
++</tr>
++ <tr>
++ <td>
++ SUSPEND
++ </td>
++ <td>
++ C-z
++ </td>
++ <td>
++ C-z
++ </td>
++ <td>
++ w3m zum Hintergrundprozess machen. (Wird mit dem Shell-Befehl <span class="mono">fg</span> zurückgenommen.)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ QUIT
++ </td>
++ <td>
++ q
++ </td>
++ <td>
++ q
++ </td>
++ <td>
++ Mit Bestätigungsfrage beenden
++ </td>
++ </tr>
++ <tr>
++ <td>
++ EXIT
++ </td>
++ <td>
++ Q
++ </td>
++ <td>
++ Q
++ </td>
++ <td>
++ Sofort beenden
++ </td>
++ </tr>
++ </table>
++
++ <p>
++ Darüber hinaus gibt es die folgenden Bedien-Modi mit fester Tastaturbelegung für die entsprechenden Funktionen. Diese sind nicht durch die Funktion DEFINE_KEY oder Einträge der keymap-Datei veränderbar.
++ </p>
++
++ <table border="1" width="100%">
++ <colgroup>
++ <col width="20%">
++ <col width="40%">
++ <col width="40%">
++ </colgroup>
++ <tr>
++ <th>
++ Funktion<br>(interner Name)
++ </th>
++ <th>Tastenkombination
++ </th>
++ <th>
++ Beschreibung
++ </th>
++ </tr>
++ <tr>
++ <td colspan="3">
++ <h3>Menü-Auswahl-Modus</h3>
++ </td>
++ </tr>
++ <tr>
++ <td>
++ BUF:NEXT</td>
++ <td>
++ j, C-n, DOWN
++ </td>
++ <td>
++ Nächster Eintrag
++ </td>
++ </tr>
++ <tr>
++ <td>BUF:PREV
++ </td>
++ <td>
++ k, C-p, UP
++ </td>
++ <td>
++ Vorheriger Eintrag
++ </td>
++ </tr>
++ <tr>
++ <td>
++ BUF:DELETE</td>
++ <td>
++ D
++ </td>
++ <td>
++ Lösche Eintrag
++ </td>
++ </tr>
++ <tr>
++ <td>
++ BUF:GO
++ </td>
++ <td>
++ SPC, RET, RIGHT
++ </td>
++ <td>
++ Wähle Eintrag aus
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="3">
++ <h3>Popup-Menü-Modus</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++MENU:SELECT
++ </td>
++ <td>
++ SPC, RET, RIGHT</td>
++ <td>
++ Wähle Punkt aus
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:CLOSE
++ </td>
++ <td>C-c
++ </td>
++ <td>
++ SchlieÃe Menü
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:CANCEL
++ </td>
++ <td>
++ LEFT, BKSPC, C-h</td>
++ <td>
++ Einen Auswahlschritt zurück
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:DOWN
++ </td>
++ <td>j, C-n, DOWN
++ </td>
++ <td>
++ Gehe zum nächsten Punkt
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:UP
++ </td>
++ <td>
++ k, C-p, UP</td>
++ <td>
++ Gehe zum vorherigen Punkt
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:LINE_UP
++ </td>
++ <td>K
++ </td>
++ <td>
++ Scrolle einen Punkt aufwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:LINE_DOWN
++ </td>
++ <td>J
++ </td>
++ <td>
++ Scrolle einen Punkt abwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:TOP
++ </td>
++ <td>C-a
++ </td>
++ <td>
++ Gehe zum ersten Punkt
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:LAST
++ </td>
++ <td>C-e
++ </td>
++ <td>
++ Gehe zum letzten Punkt
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:NEXT
++ </td>
++ <td>C-v, C-f
++ </td>
++ <td>Gehe zur nächsten Seite
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:PREV
++ </td>
++ <td>ESC v, C-b
++ </td>
++ <td>
++ Gehe zur vorherigen Seite
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:SEARCH_FORE
++ </td>
++ <td>C-s, /
++ </td>
++ <td>
++ Suche vorwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:SEARCH_BACK
++ </td>
++ <td>
++ C-r, ?</td>
++ <td>
++ Suche rückwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:SEARCH_NEXT
++ </td>
++ <td>
++ n</td>
++ <td>
++ Suche weitere Ãbereinstimmung</td>
++ </tr>
++ <tr>
++ <td>
++MENU:SEARCH_PREV
++ </td>
++ <td>
++ N</td>
++ <td>
++ Suche frühere Ãbereinstimmung</td>
++ </tr>
++<!--mh 2016-06-12 Pressing C-z in menu mode (with menu active) has the same effect as in normal operation of w3m: Browser gets in the background
++ <tr>
++ <td>
++MENU:SUSPEND
++ </td>
++ <td>
++ C-z</td>
++ <td>
++ Suspend</td>
++ </tr>
++-->
++<!-- </table>-->
++ <tr>
++ <td colspan="3">
++ <h3>Eingabezeile-Bearbeitungs-Modus</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ LINEEDIT:FORWARD
++ </td>
++ <td width="100">
++ C-f, RIGHT
++ </td>
++ <td>
++ Bewege Cursor vorwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:BACK
++ </td>
++ <td>
++ C-b, LEFT
++ </td>
++ <td>
++ Bewege Cursor rückwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:BS
++ </td>
++ <td>
++ C-h, BKSPC
++ </td>
++ <td>
++ Vorheriges Zeichen löschen
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:DEL
++ </td>
++ <td>
++ C-d
++ </td>
++ <td>
++ Aktuelles Zeichen löschen
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:KILL_AFTER
++ </td>
++ <td>
++ C-k
++ </td>
++ <td>
++ Lösche alles nach dem Cursor
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:KILL_BEFORE
++ </td>
++ <td>
++ C-u
++ </td>
++ <td>
++ Lösche alles vor dem Cursor
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:TOP
++ </td>
++ <td>
++ C-a
++ </td>
++ <td>
++ Gehe zum Zeilenanfang
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:BOTTOM
++ </td>
++ <td>
++ C-e
++ </td>
++ <td>
++ Gehe zum Zeilenende
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:PREV
++ </td>
++ <td>
++ C-p, UP
++ </td>
++ <td>
++ Hole den vorherigen Chronik-Eintrag
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:NEXT
++ </td>
++ <td>
++ C-n, DOWN
++ </td>
++ <td>
++ Hole den nächsten Chronik-Eintrag
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:COMPLETE
++ </td>
++ <td>
++ TAB, SPC
++ </td>
++ <td>
++ Versuche, den Dateinamen zu komplettieren
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:EDITOR
++ </td>
++ <td>
++ C-o
++ </td>
++ <td>
++ Bearbeite mit externem Editor
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:ACCEPT
++ </td>
++ <td>
++ RET
++ </td>
++ <td>
++ Eingabezeile übernehmen
++ </td>
++ </tr>
++ </table>
++<!-- mh 2016-06-12 As it suffices to use the provided keymap file for Lynx-like keybindings and this file is listed in section FILES of man w3m (1), the following hint for getting w3m with Lynx-like key bindings has been deleted.
++ <p>
++ If w3m was compiled with <q>Lynx-like key bindings</q>, you can use
++ the following key bindings.
++ </p>
++-->
++<!-- mh 2016-06-12 Remark is obsolete as the two sets key binding are presented along within tables
++ <hr>
++ <h2 id="Key:lynx">
++ <p>
++ The Lynx-like configuration leaves keymappings unchanged in the
++ menu-selection and line-editing modes.
++ </p>
++ </h2>
++-->
++ <hr>
++ <h2 id="Mouse">
++ Bedienung per Maus
++ </h2>
++ <p>
++ Wenn w3m mit Mausfunktionen kompiliert wurde und Sie das Programm entweder in einer Konsole mit GPM oder in einem X-Terminal-Emulator starten, ist ein Navigieren mit der Maus möglich. (Im Falle von rxvt müssen Sie die Umgebungsvariable TERM mit <q>xterm</q> oder <q>kxterm</q> belegen.)
++ </p>
++ <p>Die Datei <a href="README.mouse">README.mouse</a> erklärt, wie die Bedienung per Maus an eigene Vorlieben angepasst werden kann.
++ </p>
++ <table border="1">
++ <colgroup>
++ <col width="20%">
++ <col width="80%">
++ </colgroup>
++ <tr>
++ <th>Handlung
++ </th>
++ <th>Beschreibung
++ </th>
++ </tr>
++ <tr>
++ <td>
++ Linksklick
++ </td>
++ <td>
++<b>Zuerst:</b><br> Der Cursor wird an die Mauszeigerposition versetzt.<br> <b>Dann:</b><br> Dem Hyperlink, auf dem der Cursor momentan steht und auf den sich der Mauszeiger richtet, wird gefolgt.
++ </td>
++ </tr>
++ <tr>
++ <td>
++ Mittelklick
++ </td>
++ <td>
++ Zurück zum vorherigen Puffer.
++ </td>
++ </tr>
++ <tr>
++ <td>
++ Rechtsklick
++ </td>
++ <td>
++ Ãffne Menü. Sie können Menüpunkte durch Anklicken auswählen.
++ </td>
++ </tr>
++ <tr>
++ <td>
++ Linksziehen
++ </td>
++ <td>
++ Dokument scrollen. StandardmäÃig wird das Dokument im Fenster verschoben. Ein Verschieben des Fensters über dem stehenden Dokument erreichen Sie über den Einstellungs-Dialog.
++ </td>
++ </tr>
++ </table>
++ <hr>
++ <h2 id="LocalCGI">
++ Lokale CGI-Skripte
++ </h2>
++ <p>
++ w3m ist in der Lage, CGI-Skripte direkt laufen zu lassen. Dies bedeutet, dass sich das Programm wie ein HTTP-Server verhält und das CGI-Skript ausführt und dessen Ausgabe anzeigt. Beispielsweise wurden die Lesezeichen-Registrierung und der Verzeichnis-Browser als lokale CGI-Skripte programmiert. Darüber hinaus kann w3m durch solche Skripte als Schnittstelle zum Einholen von Daten aller Art fungieren.
++ </p>
++ <p>
++ Aus Sicherheitsgründen kommen für von w3m benutzte CGI-Skripte nur folgende Verzeichnisse in Frage:
++ </p>
++ <ul>
++ <li>
++ Das Verzeichnis, in dem w3m-bezogene Dateien abgelegt sind (typischerweise /usr/local/lib/w3m). Auf dieses Verzeichnis kann mit der Variblen $LIB referenziert werden.
++ </li>
++ <li>
++ Das Verzeichnis /cgi-bin/. Sie können /cgi-bin/ im Feld <q>Verzeichnis für ausführbare Skripte</q> des Einstellungs-Dialogs jedem gewünschten Verzeichnis zuordnen. Mehrere Pfade lassen sich durch Doppelpunkt getrennt angeben, also in der Form <span class="mono">/usr/local/cgi-bin:/home/aito/cgi-bin</span>. Es wird davon abgeraten, das aktuelle Verzeichnis hier mitaufzunehmen. Zum Zugriff auf Skripte im Verzeichnis /cgi-bin/ erwartet w3m eine URL folgender Art:
++ </li>
++<pre>
++ w3m -o cgi_bin=/path/to/cgi-bin file:/cgi-bin/script.cgi
++</pre>
++ </ul>
++ <p>
++ Das CGI-Skript kann zur Steuerung von w3m die spezielle Kopfzeile <span class="mono">w3m-control:</span> enthalten. Darin können alle Funkionen (siehe <a href="README.func">README.func</a>) eingetragen sein. Die angegebene Funktion wird aufgerufen, nachdem das Dokument angezeigt wird. Beispielsweise, wird eine Skriptausgabe
++ </p>
++<pre>
++Content-Type: text/plain<br>W3m-control: BACK
++</pre>
++ <p>
++ eine leere Seite anzeigen und den Puffer sofort löschen. Dies ist nützlich, wenn es nicht gewünscht ist, die Seite nach Aufrufen des Skriptes anzuzeigen. Das nächste Beispiel
++ </p>
++<pre>
++Content-Type: text/plain<br>W3m-control: DELETE_PREVBUF contents.....
++</pre>
++ <p>
++ führt zum Ãbergehen des aktuellen Puffers.
++ </p>
++ <p>
++ Jede <span class="mono">w3m-control</span>-Kopfzeile kann nur eine Funktion aufrufen. Jedoch können Sie im Kopfteil einer HTTP-Kommunikation mehr als eine <span class="mono">w3m-control</span>-Anweisung hinterlegen. Ãberdies ist es möglich, die GOTO-Funktion mit einem Argument aufzurufen:
++ </p>
++<pre>
++Content-Type: text/plain<br>W3m-control: GOTO http://www.example.org/
++</pre>
++ <p>
++ Sie bewirken damit das gleiche wie mit der Anweisung <q>Location:</q> im Kopfteil:
++ </p>
++<pre>
++Content-Type: text/plain<br>Location: http://www.example.org/
++</pre>
++ <p>
++ Beachten Sie, dass diese Anweisung wirkungslos ist, wenn das CGI-Skript durch einen HTTP-Server angesprochen wird.
++ </p>
++ </body>
++</html>
+diff --git a/doc-de/README.func b/doc-de/README.func
+new file mode 100644
+index 0000000..72d7d45
+--- /dev/null
++++ b/doc-de/README.func
+@@ -0,0 +1,146 @@
++ABORT Sofort beenden
++ACCESSKEY Ãffne Zugangstasten-Menü
++ADD_BOOKMARK Lege für aktuelle Seite Lesezeichen an
++ALARM Alarm einrichten
++BACK SchlieÃe aktuellen Puffer und kehre zu dem im Stapel darunterliegenden zurück
++BEGIN Gehe zur ersten Zeile
++BOOKMARK Lesezeichen ansehen
++CENTER_H Um Cursor herum horizontal zentrieren
++CENTER_V Um Cursor herum vertikal zentrieren
++CHARSET Ãndere die Zeichenkodierung für das aktuelle Dokument
++CLOSE_TAB SchlieÃe Reiter
++CLOSE_TAB_MOUSE SchlieÃe Reiter bei Mauszeiger
++COMMAND Rufe w3m Funktion(en) auf
++COOKIE Cookie-Liste ansehen
++DEFAULT_CHARSET Ãndere die Voreinstellung für die Zeichenkodierung
++DEFINE_KEY Definiere eine Verbindung zwischen einer Tastenkombination und einem Kommando
++DELETE_PREVBUF Lösche vorherigen Puffer (hauptsächlich für lokale CGI-Skripte)
++DICT_WORD Führe eine Wörterbuch-Funktion aus (siehe README.dict)
++DICT_WORD_AT Benutze Wörterbuch für Wort unter Cursor
++DISPLAY_IMAGE Starte das Laden und die Erstellung von Bildern erneut
++DOWN Scrolle den Anzeigebereich eine Zeile abwärts
++DOWNLOAD Dokument-Quellcode speichern
++DOWNLOAD_LIST Die Ãbersicht heruntergeladener Dateien zeigen
++EDIT Bearbeite lokales Quelldokument
++EDIT_SCREEN Bearbeite eine Kopie des verarbeiteten Dokuments
++END Gehe zur letzten Zeile
++EXEC_SHELL Führe Shell-Befehl aus und zeige Ausgabe an
++EXIT Sofort beenden
++EXTERN Verwende externen Browser zur Anzeige
++EXTERN_LINK Verwende externen Browser zur Anzeige des Linkziels
++FRAME Wechsle zwischen Kennung und Umsetzung von HTML-Frames
++GOTO Ãffne angegebenes Dokument in neuem Puffer
++GOTO_LINE Gehe zur angebenen Zeile
++GOTO_LINK Folge dem aktuellen Hyperlink in neuem Puffer
++GOTO_RELATIVE Gehe zu relativer Adresse
++HELP Zeige Hilfe-Ãbersicht
++HISTORY Chronik aufgesuchter Dokumente
++INFO Zeige Informationen über dieses Dokument
++INTERRUPT w3m zum Hintergrundprozess machen
++ISEARCH Inkrementelle Suche vorwärts
++ISEARCH_BACK Inkrementelle Suche rückwärts
++LEFT Anzeigebereich um eine Spalte nach links verschieben
++LINE_BEGIN Gehe zum Zeilenanfang
++LINE_END Gehe zum Zeilenende
++LINE_INFO Zeige aktuelle Position im Dokument an
++LINK_BEGIN Gehe zum ersten Hyperlink
++LINK_END Gehe zum letzten Hyperlink
++LINK_MENU Ãffne Menü mit den Link-Elementen
++LIST Zeige alle referenzierten URLs
++LIST_MENU Ãffne Menü mit aufsuchbaren Hyperlinks
++LOAD Ãffne lokale Datei in einem neuen Puffer
++MAIN_MENU Ãffne Menü
++MARK Setze/Lösche Markierung
++MARK_MID Wandle Nachrichten-ID-artige Zeichenketten um in Hyperlinks
++MARK_URL Wandle URL-artige Zeichenketten um in Hyperlinks
++MARK_WORD Wandle aktuelles Wort in Hyperlink um
++MENU Ãffne Menü
++MENU_MOUSE Ãffne Menü beim Mauszeiger
++MOUSE_TOGGLE Schalte Mausbedienung an oder ab
++MOVE_DOWN Cursor abwärts
++MOVE_DOWN1 Cursor abwärts; am Rand gleitend bewegen
++MOVE_LEFT Cursor nach links
++MOVE_LEFT1 Cursor nach links; am Rand gleitend bewegen
++MOVE_LIST_MENU Ãffne Menü mit vorhandenen Hyperlinks
++MOVE_MOUSE Cursor auf Mauszeigerposition setzen
++MOVE_RIGHT Cursor nach rechts
++MOVE_RIGHT1 Cursor nach rechts; am Rand gleitend bewegen
++MOVE_UP Cursor aufwärts
++MOVE_UP1 Cursor aufwärts; am Rand gleitend bewegen
++MSGS Zeige Fehlermeldungen an
++NEW_TAB Ãffne neuen Reiter (mit aktuellem Dokument)
++NEXT Schalte zum nächsten Puffer
++NEXT_DOWN Gehe abwärts zum nächsten Hyperlink
++NEXT_HALF_PAGE Scrolle eine halbe Seite abwärts
++NEXT_LEFT Gehe zum nächsten Hyperlink links
++NEXT_LEFT_UP Gehe zum nächsten Hyperlink links oder oberhalb
++NEXT_LINK Gehe zum nächsten Hyperlink
++NEXT_MARK Gehe zur nächsten Markierung
++NEXT_PAGE Eine Seite abwärts
++NEXT_RIGHT Gehe zum nächsten Hyperlink rechts
++NEXT_RIGHT_DOWN Gehe zum nächsten Hyperlink rechts oder unterhalb
++NEXT_TAB Schalte zum nächsten Reiter
++NEXT_UP Gehe zum nächsten Hyperlink oberhalb
++NEXT_VISITED Gehe zum nächsten besuchten Hyperlink
++NEXT_WORD Gehe zum nächsten Wort
++NOTHING Tue nichts
++NULL Tue nichts
++OPTIONS Zeige Einstellungen für Ãnderungen
++PEEK Zeige aktuelle Adresse an
++PEEK_IMG Zeige Adresse des Bildes
++PEEK_LINK Zeige Zieladresse
++PIPE_BUF Leite aktuellen Pufferinhalt einem Shell-Befehl zu und zeige Ausgabe an
++PIPE_SHELL Führe Shell-Befehl aus und zeige Ausgabe an
++PREV Schalte zum vorherigen Puffer
++PREV_HALF_PAGE Scrolle eine halbe Seite aufwärts
++PREV_LINK Gehe zum vorangegangen Hyperlink
++PREV_MARK Gehe zur vorherigen Markierung
++PREV_PAGE Eine Seite aufwärts
++PREV_TAB Schalte zum vorherigen Reiter
++PREV_VISITED Gehe zum vorherigen besuchten Hyperlink
++PREV_WORD Gehe zum vorherigen Wort
++PRINT Speichere verarbeitetes Dokument
++QUIT Mit Bestätigungsfrage beenden
++READ_SHELL Führe Shell-Befehl aus und zeige Ausgabe an
++REDO Den letzten Rücknahmebefehl zurücknehmen
++REDRAW Bildschirmanzeige neu aufbauen
++REG_MARK Zu einem Muster passenden Zeichenfolgen überall markieren
++REINIT Konfigurationsdatei erneut laden
++RELOAD Aktuelles Dokument erneut laden
++RESHAPE Dokument nochmals verarbeiten
++RIGHT Anzeigebereich um eine Spalte nach rechts verschieben
++SAVE Dokument-Quellcode speichern
++SAVE_IMAGE Speichere Bild
++SAVE_LINK Speichere Ziel des Hyperlinks
++SAVE_SCREEN Speichere verarbeitetes Dokument
++SEARCH Suche vorwärts
++SEARCH_BACK Suche rückwärts
++SEARCH_FORE Suche vorwärts
++SEARCH_NEXT Setze Suche vorwärts fort
++SEARCH_PREV Setze Suche rückwärts fort
++SELECT Zeige Puffferstapel-Ãbersicht
++SELECT_MENU Ãffne Puffferstapel-Menü
++SETENV Setze Umgebungsvariable
++SET_OPTION Setze Option
++SHELL Führe Shell-Befehl aus und zeige Ausgabe an
++SHIFT_LEFT Anzeigebereich nach links versetzen
++SHIFT_RIGHT Anzeigebereich nach rechts versetzen
++SOURCE Wechsle zwischen HTML-Wiedergabe und -Verarbeitung
++STOP_IMAGE Bilder nicht mehr laden und anzeigen
++SUBMIT Formular übermitteln
++SUSPEND w3m zum Hintergrundprozess machen
++TAB_GOTO Ãffne das angegebene Dokument in einem neuen Reiter
++TAB_GOTO_RELATIVE Ãffne relative Adresse in einem neuen Reiter
++TAB_LEFT Einen Reiter weiter nach links gehen
++TAB_LINK Folge dem aktuellen Hyperlink in einem neuen Reiter
++TAB_MENU Ãffne das Reiter-Auswahl-Menü
++TAB_MOUSE Wähle per Maus Reiter aus
++TAB_RIGHT Einen Reiter weiter nach rechts gehen
++UNDO Nimm die letzte Cursorbewegung zurück
++UP Scrolle den Anzeigebereich eine Zeile aufwärts
++VERSION Zeige die Version von w3m an
++VIEW Wechsle zwischen HTML-Wiedergabe und -Verarbeitung
++VIEW_BOOKMARK Lesezeichen ansehen
++VIEW_IMAGE Zeige Bild in Betrachter
++WHEREIS Suche vorwärts
++WRAP_TOGGLE Wechsle zwischen umlaufendem und nicht-umlaufendem Suchen
+diff --git a/doc-de/w3m.1 b/doc-de/w3m.1
+new file mode 100644
+index 0000000..7deb203
+--- /dev/null
++++ b/doc-de/w3m.1
+@@ -0,0 +1,334 @@
++.nr N -1
++.nr D 5
++.\"*******************************************************************
++.\"
++.\" This file was generated with po4a. Translate the source file.
++.\"
++.\"*******************************************************************
++.TH W3M 1 2016\-08\-06 "w3m 0.5.3"
++.SH NAME
++w3m \- Ein auf Texte ausgerichtetes Programme zur Anzeige von Dateien und
++Datenströmen sowie zum Browsen im Internet
++.SH SYNOPSIS
++w3m [OPTION]... [ \fIDatei\fP | \fIURL\fP ]...
++.SH BESCHREIBUNG
++.\" This defines appropriate quote strings for nroff and troff
++.ds lq "
++.ds rq "
++.if t .ds lq ``
++.if t .ds rq ''
++.if \nN==0 .nr N 10
++.\" Just in case these number registers aren't set yet...
++.if \nD==0 .nr D 5
++
++\fIw3m\fP ist ein textorientierter Browser, der lokale oder im Internet
++liegende Seiten sowie andere Dokumente anzeigen kann. Er verarbeitet
++HTML\-Tabellen und Frames, nicht jedoch JavaScript und Cascading Style
++Sheets. \fIw3m\fP kann auch als Textbetrachter (Pager) dienen. Entsprechende
++Dateien werden beim Aufruf als Argument angegeben oder an der
++Standardeingabe als Datenstrom übernommen. Mit \fIw3m\fP kann sich der Benutzer
++überdies durch Verzeichnisbäume bewegen.
++
++\fIw3m\fP arbeitet mit Reitern (Registerkarten, Tabs) und Puffern, was einen
++einfachen Wechsel zwischen geladenen Inhalten erlaubt. Wenn die Erweiterung
++w3m\-img installiert ist, zeigt \fIw3m\fP auch in die Seiten eingebundene
++Grafiken an. Wann immer die Umsetzung von HTML\-Inhalten durch \fIw3m\fP Ihren
++Ansprüchen nicht genügt, reicht ein einzelnes Kommando, um die Ziel\-URL
++einem grafischen Browser zu übergeben.
++
++Um nach Start des Programms Hilfe zu den Optionen zu erhalten, drücken Sie
++\(lqH\(rq.
++
++.SH ARGUMENTE
++
++Wenn das Programm mit einem oder mehreren Argumenten aufgerufen wird,
++behandelt \fIw3m\fP diese Ziele je nach Typ des Inhalts. Bei Daten aus dem
++Internet verwertet \fIw3m\fP die Angabe in den HTTP\-Kopfzeilen. Bei relativen
++oder absoluten Pfaden in Dateisystemen richtet sich \fIw3m\fP nach dem
++Dateinamen.
++
++Ohne Argument aufgerufen, erwartet \fIw3m\fP unformatierte Daten aus der
++Standardeingabe, es sei denn, der Benutzer hat einen anderen MIME\-Typ
++angegeben.
++
++Sollte \fIw3m\fP weder ein Zielobjekt vorliegen noch ein Ausweichen vorgesehen
++sein (beispielsweise durch die Option \fB\-v\fP, siehe unten), gibt das Programm
++nur Benutzungshinweise aus.
++.SH OPTIONEN
++Vor Befehlszeilen\-Optionen steht das \(lq\-\(rq Zeichen einzeln, ihnen kann
++ein Argument folgen.
++.SS "Allgemeine Optionen"
++.TP
++\fB\-B\fP
++starte mit einer Ansicht aller Lesezeichen (wenn kein anderes Zielobjekt
++angegeben ist)
++.TP
++\fB\-M\fP
++monochrome Anzeige
++.TP
++\fB\-no\-mouse\fP
++Mausfunktion aus
++.TP
++\fB\-num\fP
++zeige Zeilennummern an
++.TP
++\fB\-N\fP
++verteile die übergebenen Argumente unter Reitern. StandardmäÃig würde ein
++Stapel von Puffern benutzt
++.TP
++\fB\-ppc \fP\fInum\fP
++Weite von \fInum\fP Bildpunkten pro Zeichen, einstellbar von 4.0 bis 32.0,
++standardmäÃig 8.0. GröÃere Werte machen Tabellen enger. (Implementierung
++unklar)
++.TP
++\fB\-ppl \fP\fInum\fP
++Höhe von \fInum\fP Bildpunkten pro Linie, einstellbar von 4.0 bis
++64.0. (Implementierung unklar)
++.TP
++\fB\-title\fP, \fB\-title=TERM\fP
++verwende den Puffernamen auch als Titel des Terminalfensters. Soweit TERM
++eingegeben wurde, konfiguriert dieser Wert den Stil des Titels
++.TP
++\fB\-v\fP
++begrüÃe den Benutzer mit einer eingebauten Seite (wenn kein anderes
++Zielobjekt angegeben ist)
++.TP
++\fB\-W\fP
++wechsle zwischen umlaufendem und nicht umlaufendem Suchen
++.TP
++\fB\-X\fP
++initialisiere nach Verlassen des Programms das Terminal nicht neu
++.TP
++\fB+\fP\fIZahl\fP
++gehe zu Zeile \fIZahl\fP; wirkt nur, wenn \fIZahl\fP gröÃer ist als die im
++Terminal verfügbare Zeilenzahl
++.SS Browser\-Optionen
++.TP
++\fB\-cols \fP\fInum\fP
++bei für die Standardausgabe bestimmten Inhalten, nimm bei der Umsetzung von
++HTML eine Länge von \fInum\fP Zeichen pro Zeile
++.TP
++\fB\-cookie\fP, \fB\-no\-cookie\fP
++verwende gespeicherte Cookies und akzeptiere neue. Oder tue weder das eine
++noch das andere
++.TP
++\fB\-F\fP
++verarbeite Frames
++.TP
++\fB\-graph\fP, \fB\-no\-graph\fP
++bei der Umsetzung von Tabellen und Frames grafische Zeichen verwenden oder
++nicht verwenden
++.TP
++\fB\-header \fP\fIZeichenkette\fP
++füge \fIZeichenkette\fP der HTTP(S)\-Anfrage an. Diese muss der Kopfdaten\-Syntax
++\f(CWVariable: Wert\fP entsprechen
++.TP
++\fB\-m\fP
++stelle eine Usenet\-Nachricht entsprechend \(lqContent\-type\(rq in den
++Kopfdaten dar
++.TP
++\fB\-no\-proxy\fP
++verwende keinen Proxy
++.TP
++\fB\-post \fP\fIDatei\fP
++verwende die Methode POST, um in \fIDatei\fP hinterlegte Daten
++hochzuladen. Hierbei wird die Syntax \f(CWvar1=wert1[&var2=wert2]â¦\fP erwartet
++.TP
++\fB\-4\fP
++nur IPv4. Entspricht dns_order=4 in der Konfigurationsdatei
++.TP
++\fB\-6\fP
++nur IPv6. Entspricht dns_order=6 in der Konfigurationsdatei
++.SS Textbetrachter\-Optionen
++.TP
++\fB\-l \fP\fInum\fP
++Anzahl der Zeilen, die zwischengespeichert werden, wenn Text per
++Standardeingabe übergeben wurde. (Voreinstellung ist 10000)
++.TP
++\fB\-r\fP
++verarbeite spezielle Escape\-Zeichen (beispielsweise ANSI\-Escape\-Zeichen oder
++nroff\-Rückwärtsschritte für fette und unterstrichene Zeichen) nicht, sondern
++zeige sie stattdessen mittels Caret\-Notation.
++.TP
++\fB\-s\fP
++mehrere leere Zeilen werden bis auf eine gelöscht
++.TP
++\fB\-t\fP \fInum\fP
++berücksichtige Tab\-Zeichen so, dass Spalten mit einer Weite von \fInum\fP
++Zeichen entstehen
++.SS "Datenart\- und Datenkodierungs\-Optionen"
++.TP
++\fB\-I \fP\fIcharset\fP
++zu benutzende Zeichenkodierung für erhaltene Daten
++.TP
++\fB\-O \fP\fIcharset\fP
++zu benutzende Zeichenkodierung für auszugebende Daten
++.TP
++\fB\-T \fP\fITyp\fP
++zu benutzender MIME\-Typ für erhaltenen Daten
++.SS "Optionen zur Datenausgabe, mit sofortigem Verlassen des Programms"
++.TP
++\fB\-dump\fP
++leite die verarbeitete Seite der Standardausgabe zu. Die Option gilt als
++gesetzt, wenn der Aufruf beinhaltet, dass die Ausgabe in eine Datei
++umgeleitet oder einem weiteren Programm übergeben wird.
++.TP
++\fB\-dump_source\fP
++leite den Seitenquelltext der Standardausgabe zu
++.TP
++\fB\-dump_head\fP
++leite die Antwort einer HEAD\-Anfrage für eine URL der Standardausgabe zu
++.TP
++\fB\-dump_both\fP
++leite Antwort auf HEAD\-Anfrage und Seitenquelltext der Standardausgabe zu
++.TP
++\fB\-dump_extra\fP
++leite Antwort auf HEAD\-Anfrage, Seitenquelltext und Extrainformation der
++Standardausgabe zu
++.TP
++\fB\-help\fP
++zeige eine Zusammenfassung verfügbarer Funktionen und Befehlszeilen\-Optionen
++.TP
++\fB\-show\-option\fP
++zeige alle zur Konfiguration verfügbaren Optionen
++.TP
++\fB\-version\fP
++gibt die Version von \fIw3m\fP aus
++.SS "Optionen, die Standards für Einstellungen und Datenquellen auÃer Kraft setzen"
++.TP
++\fB\-bookmark \fP\fIDatei\fP
++benutze anstelle der Standarddatei bookmark.html für Lesezeichen die Datei
++\fIDatei\fP
++.TP
++\fB\-config \fP\fIDatei\fP
++benutze \fIDatei\fP anstelle der Standardkonfigurationsdatei
++.TP
++\fB\-debug\fP
++BITTE NICHT BENUTZEN
++.TP
++\fB\-o \fP\fIOption=Wert\fP
++arbeite mit einer Konfiguration, bei der die Einstellung \fIOption\fP mit
++\fIWert\fP belegt ist. Ohne \fIOption=Wert\fP gleichwertig mit \fB\-show\-option\fP
++.TP
++\fB\-reqlog\fP
++Protokolliere Header der HTTP\-Kommunikation in Datei \f(CW~/.w3m/request.log\fP
++.SH BEISPIELE
++.SS "Verwendung als Textbetrachter"
++.TP
++zwei HTML\-Fragmente zusammengefügt anzeigen
++.EX
++$ cat header.html footer.html | w3m \-T text/html
++.EE
++.TP
++zwei Dateien unter Reitern einander gegenüberstellen
++.EX
++$ w3m \-N config.old config
++.EE
++.SS "browser\-artige Verwendung"
++.TP
++zeige Internet\-Inhalt in monochromem Terminal
++.EX
++$ w3m \-M http://w3m.sourceforge.net
++.EE
++.TP
++zeige eingebettete Grafiken an
++.EX
++$ w3m \-o auto_image=TRUE http://w3m.sourceforge.net
++.EE
++.TP
++zeige Inhalt aus dem Usenet
++.EX
++$ w3m \-m nntp://news.aioe.org/comp.os.linux.networking
++.EE
++.TP
++mit der POST\-Methode Daten für eine URL hochladen
++.EX
++$ w3m \-post \- http://example.com/form.php <<<'a=0&b=1'
++.EE
++.SS "filterartige Verwendung"
++.TP
++konvertiere eine HTML\-Datei in reinen Text von bestimmter Zeilenlänge
++.EX
++$ w3m \-cols 40 foo.html > foo.txt
++.EE
++.TP
++übergib den Bestand an Lesezeichen mit zugehörigen Links als reinen Text einer Datei.
++.EX
++$ w3m \-B \-o display_link_number=1 > out.txt
++.EE
++.TP
++Konvertierung in ein anderes Dateiformat und eine andere Zeichenkodierung
++.EX
++$ w3m \-T text/html \-I EUC\-JP \-O UTF\-8 < foo.html > foo.txt
++.EE
++.SS "starte ohne Eingabedaten"
++.TP
++begrüÃe den Benutzer mit einer eingebauten Seite
++.EX
++$ w3m \-v
++.EE
++.\".SH Errors
++.SH UMGEBUNGSVARIABLEN
++\fIw3m\fP weicht auf den Wert der Umgebungsvariablen WWW_HOME aus, wenn das
++Programm ohne Zielobjekt aufgerufen wurde.
++.SH DATEIEN
++.TP
++\f(CW~/.w3m/bookmark.html\fP
++voreingestellte Datei für Lesezeichen
++.TP
++\f(CW~/.w3m/config\fP
++benutzerdefinierte Konfigurationsdatei; gegenüber \f(CW/etc/w3m/config\fP
++vorrangig
++.TP
++\f(CW~/.w3m/cookie\fP
++Ablageort für Cookies; wird beim Verlassen des Programms geschrieben und
++beim Aufruf gelesen
++.TP
++\f(CW~/.w3m/history\fP
++Chronik besuchter Seiten und URLs
++.TP
++\f(CW~/.w3m/keymap\fP
++benutzerdefinierte Tastaturbelegung, setzt standardmäÃige Belegung auÃer
++Kraft
++.TP
++\f(CW~/.w3m/mailcap\fP
++Konfigurationsdatei für Programme zur externen Anzeige
++.TP
++\f(CW~/.w3m/menu\fP
++benutzerdefiniertes Menü; vorrangig gegenüber Standardmenü
++.TP
++\f(CW~/.w3m/mime.types\fP
++Datei mit MIME\-Typen
++.TP
++\f(CW~/.w3m/mouse\fP
++benutzerdefinierte Mauseinstellungen
++.TP
++\f(CW~/.w3m/passwd\fP
++Datei mit Nutzerkonto\-Passwort\-Liste
++.TP
++\f(CW~/.w3m/pre_form\fP
++.\" .TP
++.\" .I $~/.w3m/urimethodmap
++.\" ???
++enthält vordefinierte Werte für wiederkehrende HTML\-Formulare
++.SH "SIEHE AUCH"
++README und Beispieldateien finden Sie im Dokumentationsverzeichnis Ihrer
++\fIw3m\fP\-Installation. Aktuelle Informationen zu \fIw3m\fP finden Sie auf der
++Projektseite
++.UR http://w3m.sourceforge.net
++unter
++.UE
++.SH DANKSAGUNGEN
++In \fIw3m\fP ist Programmcode verschiedener Quellen eingeflossen. Benutzer
++haben mit Korrekturen (Patch\-Dateien) und Vorschlägen zur Verbesserung des
++Programms beigetragen.
++.SH AUTOR
++.UR aito@fw.ipsj.or.jp
++Akinori ITO
++.UE
++Die deutsche Ãbersetzung wurde 2016 von
++.UR markus.hiereth@freenet.de
++Markus Hiereth
++.UE
++erstellt.
++
+diff --git a/doc-jp/FAQ.html b/doc-jp/FAQ.html
+index e16a986..86ef05a 100644
+--- a/doc-jp/FAQ.html
++++ b/doc-jp/FAQ.html
+@@ -176,7 +176,7 @@ w3m
+ Êݸ¤·¤Þ¤¹¡¥²èÁü¤òÊݸ¤¹¤ë¾ì¹ç¤Ï ESC I ¤Ç¤¹¡¥
+ <p>
+ <dt>¥×¥í¥¥·¤ÎÀßÄê¤Ï¤É¤¦¤¹¤ë¤Î¡©
+-<dd>´Ä¶ÊÑ¿ô HTTP_proxy ¤òÀßÄꤹ¤ë¤«¡¤"o" ¥³¥Þ¥ó¥É¤Î¥ª¥×¥·¥ç¥óÀßÄê¥Ñ¥Í¥ë
++<dd>´Ä¶ÊÑ¿ô HTTP_PROXY, HTTPS_PROXY, GOPHER_PROXY, FTP_PROXY ¤òÀßÄꤹ¤ë¤«¡¤"o" ¥³¥Þ¥ó¥É¤Î¥ª¥×¥·¥ç¥óÀßÄê¥Ñ¥Í¥ë
+ ¤ÇÀßÄꤷ¤Þ¤¹¡¥Î㤨¤Ð proxy.hogege.com ¤È¤¤¤¦¥Û¥¹¥È¤Î 8000È֥ݡ¼¥È¤ò
+ ÍøÍѤ¹¤ë¾ì¹ç¡¤
+ <p>
+diff --git a/doc-jp/MANUAL.html b/doc-jp/MANUAL.html
+index 41d70f1..66fdc6e 100644
+--- a/doc-jp/MANUAL.html
++++ b/doc-jp/MANUAL.html
+@@ -51,15 +51,9 @@ w3m
+ <dt>-l ¹Ô¿ô
+ <dd>ɸ½àÆþÎϤÎÆâÍƤòɽ¼¨¤¹¤ë¤È¤¤ËÊݸ¤µ¤ì¤ëºÇÂç¹Ô¿ô¤ò»ØÄꤹ
+ ¤ë¡¥¥Ç¥Õ¥©¥ë¥È¤Ï 10000¡¥
+-<dt>-s
+-<dd>Shift_JIS ¥³¡¼¥É¤Çɽ¼¨¤¹¤ë¡¥
+-<dt>-e
+-<dd>EUC ¥³¡¼¥É¤Çɽ¼¨¤¹¤ë¡¥
+-<dt>-j
+-<dd>JIS(ISO-2022-JP) ¥³¡¼¥É¤Çɽ¼¨¤¹¤ë¡¥
+-<dt>-O e|s|j|N|m|n
++<dt>-O ʸ»ú¥³¡¼¥É
+ <dd>ɽ¼¨¤ËÍѤ¤¤ëʸ»ú¥³¡¼¥É¤ò»ØÄꤹ¤ë¡¥
+-<dt>-I e|s
++<dt>-I ʸ»ú¥³¡¼¥É
+ <dd>ÆþÎÏʸ½ñ¤Îʸ»ú¥³¡¼¥É¤ò»ØÄꤹ¤ë¡¥
+ <dt>-T ¥¿¥¤¥×
+ <dd>ɽ¼¨¤¹¤ëʸ½ñ¤Î¥¿¥¤¥×¤ò»ØÄꤹ¤ë¡¥¤³¤Î»ØÄ꤬¤Ê¤¤¾ì¹ç¡¤¥Õ¥¡¥¤¥ë
+@@ -89,7 +83,7 @@ HTML
+ <dd>¥«¥é¡¼É½¼¨¤ò¤·¤Ê¤¤¡¥
+ <dt>-F
+ <dd>¥Õ¥ì¡¼¥à¤ò¼«Æ°É½¼¨¤¹¤ë¡¥
+-<dt>-S
++<dt>-s
+ <dd>Ϣ³¤¹¤ë¶õ¹Ô¤ò1¹Ô¤Ë¤Þ¤È¤á¤Æɽ¼¨¤¹¤ë¡¥
+ <dt>-X
+ <dd>w3m½ªÎ»»þ¤Ë¡¤°ÊÁ°¤Î²èÌ̤ËÌá¤é¤Ê¤¤¡¥
+@@ -211,9 +205,9 @@ HTMLʸ
+ <TR><TD>F<TD><FRAMESET>¤ò´Þ¤àʸ½ñ¤òɽ¼¨¤·¤Æ¤¤¤ë¤È¤¤Ë¡¤<FRAME>
+ ¥¿¥°¤Î»Ø¤¹Ê£¿ô¤Îʸ½ñ¤ò1¤Ä¤Îʸ½ñ¤ËÊÑ´¹¤·¤Æɽ¼¨¤·¤Þ¤¹¡¥
+ <TR><TD>M<TD>¸½ºß¸«¤Æ¤¤¤ë¥Ú¡¼¥¸¤ò¡¤³°Éô¥Ö¥é¥¦¥¶¤ò»È¤Ã¤Æɽ¼¨¤·¤Þ¤¹¡¥
+-2M, 3M ¤Ç2ÈÖÌܤÈ3ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
++2M, 3M, ..., 9M ¤Ç2ÈÖÌÜ¡¤3ÈÖÌÜ¡¤9ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
+ <TR><TD>ESC M<TD>¸½ºß¤Î¥ê¥ó¥¯Àè¤ò¡¤³°Éô¥Ö¥é¥¦¥¶¤ò»È¤Ã¤Æɽ¼¨¤·¤Þ¤¹¡¥
+-2ESC M, 3ESC M ¤Ç2ÈÖÌܤÈ3ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
++2ESC M, 3ESC M, ..., 9ESC M ¤Ç2ÈÖÌÜ¡¤3ÈÖÌÜ¡¤9ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
+ </table>
+
+ <H3>¥Õ¥¡¥¤¥ë¤ÈURL´Ø·¸¤ÎÁàºî</H3>
+@@ -349,9 +343,9 @@ Lynx
+ <TR><TD>F<TD><FRAMESET>¤ò´Þ¤àʸ½ñ¤òɽ¼¨¤·¤Æ¤¤¤ë¤È¤¤Ë¡¤<FRAME>
+ ¥¿¥°¤Î»Ø¤¹Ê£¿ô¤Îʸ½ñ¤ò1¤Ä¤Îʸ½ñ¤ËÊÑ´¹¤·¤Æɽ¼¨¤·¤Þ¤¹¡¥
+ <TR><TD>M<TD>¸½ºß¸«¤Æ¤¤¤ë¥Ú¡¼¥¸¤ò¡¤³°Éô¥Ö¥é¥¦¥¶¤ò»È¤Ã¤Æɽ¼¨¤·¤Þ¤¹¡¥
+-2M, 3M ¤Ç2ÈÖÌܤÈ3ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
++2M, 3M, ..., 9M ¤Ç2ÈÖÌÜ¡¤3ÈÖÌÜ¡¤9ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
+ <TR><TD>ESC M<TD>¸½ºß¤Î¥ê¥ó¥¯Àè¤ò¡¤³°Éô¥Ö¥é¥¦¥¶¤ò»È¤Ã¤Æɽ¼¨¤·¤Þ¤¹¡¥
+-2ESC M, 3ESC M ¤Ç2ÈÖÌܤÈ3ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
++2ESC M, 3ESC M, ..., 9ESC M ¤Ç2ÈÖÌÜ¡¤3ÈÖÌÜ¡¤9ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
+ </table>
+
+ <H3>¥Õ¥¡¥¤¥ë¤ÈURL´Ø·¸¤ÎÁàºî</H3>
+@@ -489,8 +483,7 @@ w3m
+ w3m¤ò»È¤¨¤Ð¡¤HTTP¥µ¡¼¥Ð¤Ê¤·¤ÇCGI¥¹¥¯¥ê¥×¥È¤òµ¯Æ°¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡¥
+ ¤³¤Î¤È¤¡¤w3m¤¬¥µ¡¼¥Ð¤Î¤Õ¤ê¤ò¤·¤Æ¥¹¥¯¥ê¥×¥È¤òµ¯Æ°¤·¡¤¤½¤Î½ÐÎϤò
+ Æɤߤ³¤ó¤Çɽ¼¨¤¹¤ë¤ï¤±¤Ç¤¹¡¥
+-<a href="file:///$LIB/w3mbookmark?mode=panel&bmark=~/.w3m/bookmark.html&url=MANUAL.html&title=w3m+manual">¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ÎÅÐÏ¿</a>¤È
+-<a href="file:///$LIB/w3mhelperpanel?mode=panel">³°Éô¥Ó¥å¡¼¥¢¤ÎÊÔ½¸</a>
++¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ÎÅÐÏ¿¤È³°Éô¥Ó¥å¡¼¥¢¤ÎÊÔ½¸
+ ¤Ï¡¤local CGI¤Î¥¹¥¯¥ê¥×¥È¤È¤·¤Æ¼Â¸½¤µ¤ì¤Æ¤¤¤Þ¤¹¡¥
+ local CGI¤ò»È¤¨¤Ð¡¤w3m¤òÈÆÍѤΥե©¡¼¥àÆþÎÏ¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤È¤·¤Æ
+ »È¤¦¤³¤È¤¬¤Ç¤¤Þ¤¹¡¥
+diff --git a/doc-jp/README b/doc-jp/README
+index 074766f..e5e59b1 100644
+--- a/doc-jp/README
++++ b/doc-jp/README
+@@ -122,7 +122,6 @@ w3m
+ ÅìËÌÂç³Øɱ¡
+ satodai@w3m.jp
+
+-¤´°Õ¸«¡¤¤´´¶ÁÛ¤òML¤Þ¤Ç¤ª´ó¤»¤¯¤À¤µ¤¤¡¥
+- w3m-dev@sic.med.tohoku.ac.jp (ÆüËܸì)
+- w3m-dev-en@sic.med.tohoku.ac.jp (±Ñ¸ì)
++¤´°Õ¸«¡¤¤´´¶ÁÛ¤ò¤ª´ó¤»¤¯¤À¤µ¤¤¡¥
+ http://w3m.sourceforge.net/
++ https://sourceforge.net/projects/w3m/
+diff --git a/doc-jp/README.SSL b/doc-jp/README.SSL
+index 4aedfde..47d5fd6 100644
+--- a/doc-jp/README.SSL
++++ b/doc-jp/README.SSL
+@@ -25,9 +25,9 @@ SSL
+
+ ssl_forbid_method
+ »È¤ï¤Ê¤¤SSL¥á¥½¥Ã¥É¤Î¥ê¥¹¥È(2: SSLv2, 3: SSLv3, t: TLSv1)
+- (¥Ç¥Õ¥©¥ë¥È¤Ï<NULL>).
++ (¥Ç¥Õ¥©¥ë¥È¤Ï2, 3).
+ ssl_verify_server ON/OFF
+- SSL¤Î¥µ¡¼¥Ðǧ¾Ú¤ò¹Ô¤¦(¥Ç¥Õ¥©¥ë¥È¤ÏOFF).
++ SSL¤Î¥µ¡¼¥Ðǧ¾Ú¤ò¹Ô¤¦(¥Ç¥Õ¥©¥ë¥È¤ÏON).
+ ssl_cert_file ¥Õ¥¡¥¤¥ë̾
+ SSL¤Î¥¯¥é¥¤¥¢¥ó¥ÈÍÑPEM·Á¼°¾ÚÌÀ½ñ¥Õ¥¡¥¤¥ë(¥Ç¥Õ¥©¥ë¥È¤Ï<NULL>).
+ ssl_key_file ¥Õ¥¡¥¤¥ë̾
+@@ -85,6 +85,9 @@ SSL
+ #
+ # certdata2pem.rb
+
++if RUBY_VERSION>="1.9"
++ Encoding.default_external="UTF-8"
++end
+ while line = $stdin.gets
+ next if line =~ /^#/
+ next if line =~ /^\s*$/
+diff --git a/doc-jp/README.func b/doc-jp/README.func
+index 542aaa9..8a5f821 100644
+--- a/doc-jp/README.func
++++ b/doc-jp/README.func
+@@ -1,7 +1,7 @@
+ ABORT ³Îǧ¤»¤º¤Ëw3m¤ò½ªÎ»¤·¤Þ¤¹
+ ACCESSKEY Accesskey ¥á¥Ë¥å¡¼¤òΩ¤Á¾å¤²¤Þ¤¹
+-ALARM ¥¢¥é¡¼¥à¤òÀßÄꤷ¤Þ¤¹
+ ADD_BOOKMARK ¸½ºß¸«¤Æ¤¤¤ë¥Ú¡¼¥¸¤ò¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÄɲä·¤Þ¤¹
++ALARM ¥¢¥é¡¼¥à¤òÀßÄꤷ¤Þ¤¹
+ BACK °ì¤ÄÁ°¤Î¥Ð¥Ã¥Õ¥¡¤òɽ¼¨¤·¤Þ¤¹
+ BEGIN ʸ½ñ¤Î¤¤¤Á¤Ð¤ó¾å¤Î¹Ô¤Ë°ÜÆ°¤·¤Þ¤¹
+ BOOKMARK ¥Ö¥Ã¥¯¥Þ¡¼¥¯¤òÆɤ߹þ¤ß¤Þ¤¹
+@@ -36,7 +36,6 @@ GOTO_RELATIVE
+ HELP ¥Ø¥ë¥×¥Õ¥¡¥¤¥ë¤òɽ¼¨¤·¤Þ¤¹
+ HISTORY URLÍúÎò¤òɽ¼¨¤·¤Þ¤¹
+ INFO ¸½ºß¤Îʸ½ñ¤Ë´Ø¤¹¤ë¾ðÊó¤òɽ¼¨¤·¤Þ¤¹
+-INIT_MAILCAP mailcap ¤òºÆÆɤ߹þ¤ß¤·¤Þ¤¹(¼ç¤Ë local-CGI ÍÑ)
+ INTERRUPT ʸ½ñ¤ÎÆɤ߹þ¤ß¤òÃæÃǤ·¤Þ¤¹
+ ISEARCH ¥Õ¥¡¥¤¥ë¤ÎËöÈø¤Ë¤à¤«¤Ã¤Æ¥¤¥ó¥¯¥ê¥á¥ó¥¿¥ë¥µ¡¼¥Á¤·¤Þ¤¹
+ ISEARCH_BACK ¥Õ¥¡¥¤¥ë¤ÎÀèƬ¤Ë¤à¤«¤Ã¤Æ¥¤¥ó¥¯¥ê¥á¥ó¥¿¥ë¥µ¡¼¥Á¤·¤Þ¤¹
+@@ -72,6 +71,7 @@ MSGS
+ NEW_TAB ¿·¤·¤¤¥¿¥Ö¤ò³«¤¤Þ¤¹
+ NEXT ¼¡¤Î¥Ð¥Ã¥Õ¥¡¤òɽ¼¨¤·¤Þ¤¹
+ NEXT_DOWN ¥«¡¼¥½¥ë¤Î²¼Â¦¤Ë¤¢¤ë¥ê¥ó¥¯¤Ë°ÜÆ°¤·¤Þ¤¹
++NEXT_HALF_PAGE Ⱦ¥Ú¡¼¥¸²¼¤Ë¥¹¥¯¥í¡¼¥ë¤·¤Þ¤¹
+ NEXT_LEFT ¥«¡¼¥½¥ë¤Îº¸Â¦¤Ë¤¢¤ë¥ê¥ó¥¯¤Ë°ÜÆ°¤·¤Þ¤¹
+ NEXT_LEFT_UP ¥«¡¼¥½¥ë¤Îº¸Â¦(̵¤±¤ì¤ÐÁ°¤Î¹Ô°ÊÁ°)¤Ë¤¢¤ë¥ê¥ó¥¯¤Ë°ÜÆ°¤·¤Þ¤¹
+ NEXT_LINK ¼¡¤Î¥ê¥ó¥¯¤Ë°ÜÆ°¤·¤Þ¤¹
+@@ -92,6 +92,7 @@ PEEK_LINK
+ PIPE_BUF ¥Ð¥Ã¥Õ¥¡¤ÎÆâÍƤò¥Ñ¥¤¥×¤ËÅϤ·¤Þ¤¹
+ PIPE_SHELL ¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¤·ë²Ì¤òÆɤߤ³¤ß¤Ê¤¬¤éɽ¼¨¤·¤Þ¤¹
+ PREV Á°¤Î¥Ð¥Ã¥Õ¥¡¤òɽ¼¨¤·¤Þ¤¹
++PREV_HALF_PAGE Ⱦ¥Ú¡¼¥¸¾å¤Ë¥¹¥¯¥í¡¼¥ë¤·¤Þ¤¹
+ PREV_LINK Á°¤Î¥ê¥ó¥¯¤Ë°ÜÆ°¤·¤Þ¤¹
+ PREV_MARK °ì¤ÄÁ°¤Î¥Þ¡¼¥¯¤Ë°ÜÆ°¤·¤Þ¤¹
+ PREV_PAGE Á°¤Î¥Ú¡¼¥¸¤òɽ¼¨¤·¤Þ¤¹
+diff --git a/doc-jp/README.siteconf b/doc-jp/README.siteconf
+new file mode 100644
+index 0000000..90066f7
+--- /dev/null
++++ b/doc-jp/README.siteconf
+@@ -0,0 +1,60 @@
++siteconf: ¥µ¥¤¥ÈÊÌ¥«¥¹¥¿¥Þ¥¤¥º
++
++siteconf ¤Ï¡¢ URL ¤Î¥Ñ¥¿¡¼¥ó¤È¡¢¤½¤ì¤ËɳÉÕ¤±¤é¤ì¤¿ÀßÄ꤫¤éÀ®¤ê¤Þ¤¹¡£
++siteconf ¤ò»È¤¦¤È¡¢¥µ¥¤¥ÈËè¤Ëʸ»ú¥³¡¼¥É¤ò»ØÄꤷ¤Æ "decode_url"
++¤Î½ÐÎϤò²þÁ±¤·¤¿¤ê¡¢ Google ¤Î¥ê¥À¥¤¥ì¥¯¥¿¤ò±ª²ó¤·¤ÆÀǽ¤ä
++¥×¥é¥¤¥Ð¥·¡¼¤ò¸þ¾å¤µ¤»¤¿¤ê¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
++
++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï siteconf ¤Ï ~/.w3m/siteconf ¤«¤éÆɤ߹þ¤Þ¤ì¤Þ¤¹¡£
++
++===== ¹½Ê¸ =====
++
++url <url>|/<re-url>/|m@<re-url>@i [exact]
++substitute_url "<destination-url>"
++url_charset <charset>
++no_referer_from on|off
++no_referer_to on|off
++
++¸å¤í¤ÎÊý¤Ë½ñ¤«¤ì¤¿¤â¤Î¤¬Í¥À褵¤ì¤Þ¤¹¡£
++
++===== Îã =====
++
++url "https://twitter.com/"
++substitute_url "https://mobile.twitter.com/"
++
++twitter.com ¤ò¥â¥Ð¥¤¥ë¥µ¥¤¥È¤ËžÁ÷¤·¤Þ¤¹¡£
++
++url "http://your.bookmark.net/"
++no_referer_from on
++
++your.bookmark.net ¤«¤éÄ¥¤Ã¤¿¥ê¥ó¥¯¤òé¤ëºÝ¤Ë¡¢ HTTP referer ¤ò
++Á÷¤é¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£
++
++url "http://www.google.com/url?" exact
++substitute_url "file:///cgi-bin/your-redirector.cgi?"
++
++Google ¤Î¥ê¥À¥¤¥ì¥¯¥¿¤ò local CGI ¤ËžÁ÷¤·¤Þ¤¹¡£
++
++url /^http:\/\/[a-z]*\.wikipedia\.org\//
++url_charset utf-8
++
++Ʊ»þ¤Ë "decode_url" ¥ª¥×¥·¥ç¥ó¤ò¥ª¥ó¤Ë¤¹¤ë¤È¡¢ Wikipedia ¤Ø¤Î
++¥ê¥ó¥¯¤ò UTF-8 ¤È¤·¤Æ¥Ç¥³¡¼¥É¤·¤Æɽ¼¨¤·¤Þ¤¹¡£
++
++===== Àµµ¬É½¸½¤Ë¤Ä¤¤¤Æ =====
++
++¼¡¤ÎÀµµ¬É½¸½¤Ï¤¤¤º¤ì¤âƱ¤¸°ÕÌ£¤òɽ¤·¤Þ¤¹¡£
++
++/http:\/\/www\.example\.com\//
++m/http:\/\/www\.example\.com\//
++m@http://www\.example\.com/@
++m!http://www\.example\.com/!
++
++ºÇ¸å¤Ë 'i' ½¤¾þ»Ò¤òÉÕ¤±¤ë¤È¡¢Âçʸ»ú¾®Ê¸»ú¤ò¶èÊ̤»¤º¤Ë¾È¹ç¤ò¹Ô¤¤¤Þ¤¹¡£
++Î㤨¤Ð¡¢ m@^http://www\.example\.com/abc/@i ¤Ï°Ê²¼¤Î¤¤¤º¤ì¤È¤â°ìÃפ·¤Þ¤¹¡£
++
++http://www.example.com/abc/
++http://www.example.com/Abc/
++http://www.example.com/ABC/
++
++¤¿¤À¤·¡¢¥Û¥¹¥È̾¤ÎÉôʬ¤Ï¾ï¤Ë¾®Ê¸»ú¤ËÊÑ´¹¤·¤Æ¤«¤éÈæ³Ó¤·¤Þ¤¹¡£
+diff --git a/doc-jp/keymap.lynx b/doc-jp/keymap.lynx
+index 869c716..e4085c8 100644
+--- a/doc-jp/keymap.lynx
++++ b/doc-jp/keymap.lynx
+@@ -46,7 +46,7 @@ keymap - PREV_PAGE
+ keymap . RIGHT
+ keymap / SEARCH
+ keymap : MARK_URL
+-keymap ; MARK_WORD
++keymap ";" MARK_WORD
+ keymap < SHIFT_LEFT
+ keymap = INFO
+ keymap > SHIFT_RIGHT
+diff --git a/doc-jp/w3m.1 b/doc-jp/w3m.1
+index 89aacb6..a54e078 100644
+--- a/doc-jp/w3m.1
++++ b/doc-jp/w3m.1
+@@ -1,5 +1,5 @@
+ .\"
+-.TH W3M 1 "Jun 6 2000" "UNIX"
++.TH W3M 1 "2016-04-02" "w3m 0.5.3"
+ .SH NAME
+ .B w3m
+ \- text base pager/WWW browser
+@@ -39,19 +39,10 @@ text/plain
+ ɸ½àÆþÎϤÎÆâÍƤòɽ¼¨¤¹¤ë¤È¤¤ËÊݸ¤µ¤ì¤ëºÇÂç¹Ô¿ô¤ò»ØÄꤹ¤ë¡¥
+ ¥Ç¥Õ¥©¥ë¥È¤Ï10000¡¥
+ .TP
+-.B \-s
+-Shift_JIS¥³¡¼¥É¤Çɽ¼¨¤¹¤ë¡¥
+-.TP
+-.B \-e
+-EUC¥³¡¼¥É¤Çɽ¼¨¤¹¤ë¡¥
+-.TP
+-.B \-j
+-JIS (ISO-2022-JP)¥³¡¼¥É¤Çɽ¼¨¤¹¤ë¡¥
+-.TP
+-.BI \-O\ e|s|j|N|m
++.BI \-O\ ʸ»ú¥³¡¼¥É
+ ɽ¼¨¤Ë»È¤¦Ê¸»ú¥³¡¼¥É¤ò»ØÄꤹ¤ë.
+ .TP
+-.BI \-I\ e|s
++.BI \-I\ ʸ»ú¥³¡¼¥É
+ ÆþÎÏʸ½ñ¤Îʸ»ú¥³¡¼¥É¤ò»ØÄꤹ¤ë¡¥
+ .TP
+ .BI \-T\ ¥¿¥¤¥×
+@@ -90,7 +81,7 @@ Bookmark
+ .B \-F
+ ¥Õ¥ì¡¼¥à¤ò¼«Æ°É½¼¨¤¹¤ë¡¥
+ .TP
+-.B \-S
++.B \-s
+ Ϣ³¤¹¤ë¶õ¹Ô¤ò1¹Ô¤Ë¤Þ¤È¤á¤Æɽ¼¨¤¹¤ë¡¥
+ .TP
+ .B \-X
+@@ -327,13 +318,13 @@ URL
+ .TP
+ .B M
+ ¸½ºß¸«¤Æ¤¤¤ë¥Ú¡¼¥¸¤ò¡¤³°Éô¥Ö¥é¥¦¥¶¤ò»È¤Ã¤Æɽ¼¨¤·¤Þ¤¹¡¥
+-.B 2M, 3M
+-¤Ç2ÈÖÌܤÈ3ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
++.B 2M, 3M, ..., 9M
++¤Ç2ÈÖÌÜ¡¤3ÈÖÌÜ¡¤9ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
+ .TP
+ .B "ESC M"
+ ¸½ºß¤Î¥ê¥ó¥¯Àè¤ò¡¤³°Éô¥Ö¥é¥¦¥¶¤ò»È¤Ã¤Æɽ¼¨¤·¤Þ¤¹¡¥
+-.B "2ESC M", "3ESC M"
+-¤Ç2ÈÖÌܤÈ3ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
++.B "2ESC M", "3ESC M", ..., "9ESC M"
++¤Ç2ÈÖÌÜ¡¤3ÈÖÌÜ¡¤9ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
+ .SS ¥Õ¥¡¥¤¥ë¤ÈURL´Ø·¸¤ÎÁàºî
+ .TP
+ .B U
+diff --git a/doc/FAQ.html b/doc/FAQ.html
+index ed2a704..ca82c67 100644
+--- a/doc/FAQ.html
++++ b/doc/FAQ.html
+@@ -1,291 +1,763 @@
+-<HTML>
+-<HEAD>
+-<TITLE>W3M FAQ</TITLE>
+-</HEAD>
+-<BODY>
+-<p>
+-<center><h1>Frequently Asked Questions and Answers about w3m</h1></center>
+-<div align=right>
+-Akinori Ito<br>
+-aito@fw.ipsj.or.jp<br>
+-Corrected by Tom Berger <tom.be@gmx.net>
+-</div>
+-<p>
+-<b><center><font size=+1><u><a name="index">Index</a></u></font></center></b>
+-<p>
+-<br>
+-<ul>
+-<li><h2><a href="#general">General Questions, How to Get It, Required Environment</a></h2></li>
+-<ul>
+-<li><h3>How do I pronounce "w3m"?</h3>
+-<li><h3>Why is it called "w3m"?</h3>
+-<li><h3>On which platforms does w3m work?</h3>
+-<li><h3>Where can I get more information about w3m?</h3>
+-<li><h3>Is there a mailing list for w3m?</h3>
+-<li><h3>Are there any binary distributions?</h3>
+-</ul>
+-<br>
+-<li><a href="#install"><h2>Compile and Install</h2></a>
+-<br>
+-<li><a href="#command"><h2>Options, Commands, Usage</h2></a>
+-<ul>
+-<li><h3>w3m quits if started without parameters. What's wrong?</h3>
+-<li><h3>w3m starts with black characters on a black screen. How do I change this?</h3>
+-<li><h3>Does w3m support colours?</h3>
+-<li><h3>Does w3m support monochrome display?</h3>
+-<li><h3>How do I shift the display?</h3>
+-<li><h3>How do I move from anchor to anchor?</h3>
+-<li><h3>Netscape displays a word red, but w3m doesn't. Why?</h3>
+-<li><h3>How do I change the colour of anchor-/image-/form links?</h3>
+-<li><h3>w3m doesn't seem to use the variable EDITOR. Why? </h3>
+-<li><h3>How do I quit a search or URL text input?</h3>
+-</ul>
+-<br>
+-<li><a href="#www"><h2>Questions about WWW usage</h2></a>
+-<ul>
+-<li><h3>How do I fill in forms with w3m?</h3>
+-<li><h3>Seems like w3m is slower than Netscape or Lynx. Why?</h3>
+-<li><h3>Loading time doesn't decrease when loading a previously seen page</h3>
+-<li><h3>How do I download a linked file?</h3>
+-<li><h3>How do I specify a proxy server?</h3>
+-<li><h3>w3m freezes when I invoke an external browser.</h3>
+-<li><h3>How do I change the default image viewer?</h3>
+-<li><h3>How do I enter a URL?</h3>
+-<li><h3>w3m appends a URL to the former one despite of having cleared the line with Ctrl-u. What to do?</h3>
+-</ul>
+-<br>
+-<li><a href="#other"><h2>Misc</a></h2>
+-<ul>
+-<li><h3>What is w3m's configuration file?</h3>
+-<li><h3>What are these w3mxxxx files in my ~/.w3m directory for?</h3>
+-</ul>
+-<br>
+-<br>
+-<u><h2><a name="general">General Questions, How to Get It, Required Environment</a></h2></u>
+-<br>
+-<dl>
+-<dt><h3>How do I pronounce "w3m"?</h3>
+-<dd>It's "W-three-M". It doesn't rhyme with "pteranodon".
+-<p>
+-<dt><h3>Why is it called "w3m"?</h3>
+-<dd>It's an abbreviation of "WWW-wo-Miru", which is Japanese for
+-"See the WWW". So in English the name of this browser would be
+-something like "stw3".
+-<p>
+-<dt><h3>On which platforms does w3m work?</h3>
+-<dd>It runs on various versions of Unix, since version 990226 on OS/2 and since
+-version 990303 also on MS-Windows with Cygwin32.
+-<br>
+-Current versions have been confirmed to run on:
+-<ul>
+-<li>SunOS 4.1.x
+-<li>HP-UX 9.x, 10.x
+-<li>Solaris 2.5.x, 2.6, 8
+-<li>Linux 2.0.30
+-<li>FreeBSD 2.2.8, 3.1, 3.2, 4.6
+-<li>NetBSD/macppc, m68k
+-<li>EWS4800 Rel.12.2 Rev.A
+-<li>Digital UNIX: v3.2D, v4.0D
+-<li>IRIX 5.3, IRIX 6.5
+-<li>OS/2 with emx
+-<li>Windows 9x/NT with Cygwin32 b20.1
+-<li>MS-DOS with DJGPP and WATT32 packet driver
+-<li>MacOS X Server
+-<li>MacOS X 10.1, 10.2
+-</ul>
+-<dt><h3>Where can I get more information about w3m?</h3>
+-<dd>At the <a href="http://w3m.sourceforge.net/index.en.html">English w3m home page</a>.
+-<dt><h3>Is there a mailing list for w3m?</h3>
+-<dd>There is a mailing list for developpers (w3m-dev-en). Please see
+-<a href="http://w3m.sourceforge.net/index.en.html">w3m page</a>
+-for details. You may also mail your comments to <a href="mailto:aito@fw.ipsj.or.jp">the author</a>.
+-<dt><h3>Are there any binary distributions?</h3>
+-<dd>So far there are only binaries for the win/cygnus32 version. You can get
+-them from <a href="http://prdownloads.sourceforge.net/w3m/">here</a>.
+-Contact <a href="mailto:aito@fw.ipsj.or.jp">the author</a> if you want to contribute binaries for other platforms.
+-</dd>
+-</dl>
+-<br>
+-<div align=right>
+-<i>Up to <a href="#index">index</a></i>
+-</div>
+-<br>
+-<u><h2><a name="install">Compile and Install</a></h2></u>
+-No problem :-)
+-<u><h2><a name="command">Options, Commands, Usage</a></h2></u>
+-<br>
+-<dl>
+-<dt><h3>w3m quits if started without parameters. What's wrong?</h3>
+-<dd>w3m is a <b>pager</b>. Therefore it just quits when invoked without any
+-arguments. Possible arguments are:
+-<ol>
+-<li>A filename or an URL
+-<li>Pipe from standard input
+-<li>The -B option (Show bookmark file)
+-<li>The -v option (visual startup)
+-<li>From a specified HTTP_HOME or WWW_HOME variable
+-</ol>
+-<p>
+-<dt><h3>w3m starts with black characters on black background. How do I change
+-this?</h3>
+-<dd>
+-When compiled with colour support, w3m assumes a white background and therefore
+-displays black characters.
+-<br>
+-You may either change the background colour of your terminal (e.g. with the -bg
+-option in a xterm) or take these steps:
+-<ul>
+-<li>invoke w3m with 'w3m -M' (for monochrome),
+-<li>type 'o' for getting to the options screen
+-<li><b>Mark 'Display with colour' as ON</b> and choose an arbitrary colour.
+-Click on [OK].
+-</ul>
+-<p>
+-<dt><h3>Does w3m support colours?</h3>
+-<dd>Yes. When you run './configure', answer the question
+-<p>
++<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
++<html>
++ <head>
++ <style>
++ span.mono {
++ font-family:mono;
++ }
++ </style>
++ <meta http-equiv=content-type content="text/html;charset=US-ASCII">
++ <title>W3M FAQ</title>
++ </head>
++ <body>
++ <h1 align="center">
++ Frequently Asked Questions and Answers about w3m
++ </h1>
++ <p align="right">
++ Akinori Ito <aito@fw.ipsj.or.jp><br>
++ Corrected by Tom Berger <tom.be@gmx.net>
++ </p>
++ <h2 id="index">
++ <u>
++ Index
++ </u>
++ </h2>
++ <ul>
++ <li>
++ <a href="#general">
++ <b>
++ General Questions, How to Get It, Required Environment
++ </b>
++ </a>
++ </li>
++ <ul>
++ <li>
++ <b>
++ How do I pronounce <q>w3m</q>?
++ </b>
++ </li>
++ <li>
++ <b>
++ Why is it called <q>w3m</q>?
++ </b>
++ </li>
++ <li>
++ <b>
++ On which platforms does w3m work?
++ </b>
++ </li>
++ <li>
++ <b>
++ Where can I get more information about w3m?
++ </b>
++ </li>
++ <li>
++ <b>
++ Is there a mailing list for w3m?
++ </b>
++ </li>
++ <li>
++ <b>
++ Are there any binary distributions?
++ </b>
++ </li>
++ </ul>
++ <li>
++ <a href="#install">
++ <b>
++ Compile and Install
++ </b>
++ </a>
++ </li>
++ <li>
++ <a href="#command">
++ <b>
++ Options, Commands, Usage
++ </b>
++ </a>
++ </li>
++ <ul>
++ <li>
++ <b>
++ w3m quits if started without parameters. What's wrong?
++ </b>
++ </li>
++ <li>
++ <b>
++ w3m starts with black characters on a black background. How do
++ I change this?
++ </b>
++ </li>
++ <li>
++ <b>
++ Does w3m support colors?
++ </b>
++ </li>
++ <li>
++ <b>
++ Does w3m support monochrome displays?
++ </b>
++ </li>
++ <li>
++ <b>
++ How do I shift the display?
++ </b>
++ </li>
++ <li>
++ <b>
++ How do I move between hyperlinks?
++ </b>
++ </li>
++ <li>
++ <b>
++ Graphical browsers display a word red, but w3m doesn't. Why?
++ </b>
++ </li>
++ <li>
++ <b>
++ How do I change the colors for hyperlinks, images and form fields?
++ </b>
++ </li>
++ <li>
++ <b>
++ w3m doesn't seem to use the variable EDITOR. Why?
++ </b>
++ </li>
++ <li>
++ <b>
++ How do I quit a search or URL text input?
++ </b>
++ </li>
++ </ul>
++ <li>
++ <a href="#www">
++ <b>
++ Questions about WWW usage
++ </b>
++ </a>
++ </li>
++ <ul>
++ <li>
++ <b>
++ How do I fill in forms with w3m?
++ </b>
++ </li>
++ <li>
++ <b>
++ Seems like w3m is slower than some other browsers. Why?
++ </b>
++ </li>
++ <li>
++ <b>
++ Loading time doesn't decrease when loading a previously seen
++ page.
++ </b>
++ </li>
++ <li>
++ <b>
++ How do I download a linked file?
++ </b>
++ </li>
++ <li>
++ <b>
++ How do I specify a proxy server?
++ </b>
++ </li>
++<!-- deleted, see mail dated Mon, 04 Apr 2016 20:50:27 +0900 (JST)
++from Tatsuya Kinoshita <tats@debian.org>
++ <li>
++ <b>
++ w3m freezes when I invoke an external browser.
++ </b>
++ </li>
++-->
++ <li>
++ <b>
++ How do I change the default image viewer?
++ </b>
++ </li>
++ <li>
++ <b>
++ How do I enter a URL?
++ </b>
++ </li>
++ <li>
++ <b>
++ w3m appends a URL to the former one even when I clear the line
++ with <span class="mono">CTRL-u</span>. What should I do?
++ </b>
++ </li>
++ </ul>
++ <li>
++ <a href="#other">
++ <b>
++ Miscellaneous
++ </b>
++ </a>
++ </li>
++ <ul>
++ <li>
++ <b>
++ What is w3m's configuration file?
++ </b>
++ </li>
++ <li>
++ <b>
++ What are these w3mxxxx files in my ~/.w3m directory for?
++ </b>
++ </li>
++ </ul>
++ </ul>
++ <h2 id="general">
++ <u>
++ General Questions, How to Get It, Required Environment
++ </u>
++ </h2>
++ <dl>
++ <dt>
++ <b>
++ How do I pronounce <q>w3m</q>?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ It's <q>W-three-M</q>. It doesn't rhyme with <q>pteranodon</q>.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Why is it called <q>w3m</q>?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ It's an abbreviation of <q>WWW-wo-Miru</q>, which is Japanese
++ for <q>See the WWW</q>. So in English the name of this browser
++ would be something like <q>stw3</q>.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ On which platforms does w3m work?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ It runs on various versions of Unix, since version 990226 on OS/2
++ and since version 990303 also on MS-Windows with Cygwin32.
++ </p>
++ <p>
++ More recent versions have been confirmed to run on:
++ </p>
++ <ul>
++ <li>
++ SunOS 4.1.x
++ </li>
++ <li>
++ HP-UX 9.x, 10.x
++ </li>
++ <li>
++ Solaris 2.5.x, 2.6, 8
++ </li>
++ <li>
++ Linux 2.0.1 to 3.17
++ </li>
++ <li>
++ FreeBSD 2.2.8, 3.1, 3.2, 4.6
++ </li>
++ <li>
++ NetBSD/macppc, m68k
++ </li>
++ <li>
++ EWS4800 Rel.12.2 Rev.A
++ </li>
++ <li>
++ Digital UNIX: v3.2D, v4.0D
++ </li>
++ <li>
++ IRIX 5.3, IRIX 6.5
++ </li>
++ <li>
++ OS/2 with emx
++ </li>
++ <li>
++ Windows 9x/NT with Cygwin32 b20.1
++ </li>
++ <li>
++ MS-DOS with DJGPP and WATT32 packet driver
++ </li>
++ <li>
++ MacOS X Server
++ </li>
++ <li>
++ MacOS X 10.1, 10.2
++ </li>
++ </ul>
++ </dd>
++ <dt>
++ <b>
++ Where can I get more information about w3m?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ At the
++ <a href="http://w3m.sourceforge.net/index.en.html">English w3m
++ home page</a>.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Is there a mailing list for w3m?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ There is a mailing list for developers (w3m-dev-en). Please see
++ the <a href="http://w3m.sourceforge.net/index.en.html">w3m home
++ page</a> for details. You may also mail your comments to
++ <a href="mailto:aito@fw.ipsj.or.jp">the author</a>.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Are there any binary distributions?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ So far there are only binaries for the win/cygnus32 version.
++<!--
++ You can get them from
++ <a href="http://prdownloads.sourceforge.net/w3m/">here</a>.
++!-->
++ Contact <a href="mailto:aito@fw.ipsj.or.jp">the author</a> if you
++ want to contribute binaries for other platforms.
++ </p>
++ </dd>
++ </dl>
++ <p align="right">
++ <i>
++ Up to <a href="#index">index</a>
++ </i>
++ </p>
++ <h2 id="install">
++ <u>
++ Compile and Install
++ </u>
++ </h2>
++ <p>
++ No problem :-)
++ </p>
++ <h2 id="command">
++ <u>
++ Options, Commands, Usage
++ </u>
++ </h2>
++ <dl>
++ <dt>
++ <b>
++ w3m quits if started without parameters. What's wrong?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ w3m is a <b>pager</b>. Therefore it just quits when invoked
++ without any arguments. It keeps running
++ </p>
++ <ul>
++ <li>
++ with a filename or URL as argument
++ </li>
++ <li>
++ with data piped from standard input
++ </li>
++ <li>
++ when invoked with option -B to show the bookmark file
++ </li>
++ <li>
++ when invoked with option -v to welcome users with a built-in page
++ </li>
++ <li>
++ with specified HTTP_HOME or WWW_HOME variable
++ </li>
++ </ul>
++ </dd>
++ <dt>
++ <b>
++ w3m starts with black characters on a black background. How do I
++ change this?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ When compiled with color support, w3m assumes a white background
++ and therefore displays black characters.
++ </p>
++ <p>
++ You may either change the background color of your terminal
++ (e.g. with the -bg option in a xterm) or take these steps
++ </p>
++ <ol>
++ <li>
++ invoke monochrome mode of w3m with <span class="mono">w3m -M</span>
++ </li>
++ <li>
++ type <q>o</q> to get to the options setting panel
++ </li>
++ <li>
++ mark <q>Display with color</q> as <q>YES</q> and choose an
++ arbitrary color
++ </li>
++ <li>
++ click on [OK].
++ </li>
++ </ol>
++ </dd>
++ <dt>
++ <b>
++ Does w3m support colors?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Yes. When you run <q>./configure</q>, answer the question
++ </p>
+ <pre>
+-Let's do some configurations. Choose config option among the list."
++ Let's do some configurations. Choose config option among the list.
+
+-1 - Baby model (no color, no menu, no mouse, no cookie, no SSL)
+-2 - Little model (color, menu, no mouse, no cookie, no SSL)
+-3 - Mouse model (color, menu, mouse, no cookie, no SSL)
+-4 - Cookie model (color, menu, mouse, cookie, no SSL)
+-5 - Monster model (with everything; you need openSSL library)
+-6 - Customize
+-Which?
++ 1 - Baby model (no color, no menu, no mouse, no cookie, no SSL)
++ 2 - Little model (color, menu, no mouse, no cookie, no SSL)
++ 3 - Mouse model (color, menu, mouse, no cookie, no SSL)
++ 4 - Cookie model (color, menu, mouse, cookie, no SSL)
++ 5 - Monster model (with everything; you need openSSL library)
++ 6 - Customize
++ Which?
+ </pre>
+-<p>
+-with 2,3,4 or 5.
+-<p>
+-<dt><h3>Does w3m support monochrome display?</h3>
+-<dd>Yes. You may either
+-<ol>
+-<li>Answer the above mentioned 'configure' question with 1, or
+-<li>Invoke w3m with the -M option, or
+-<li>Type 'o' within w3m to enter the options screen and turn off colour display
+-mode.
+-</ol>
+-<dt><h3>How do I shift the display?</h3>
+-<dd>You can shift the display by moving the cursor to the edge of the screen. You
+-may also use the ">"/"<" or "."/"," keys.
+-<br>
+-Another idea would be adjusting the xterm with the -geometry option (e.g.
+-something like 'xterm -geometry 110x45 -bg white -name w3m -e w3m -B').
+-<dt><h3>How do I move from anchor to anchor?</h3>
+-<dd>You can move to the next anchor using TAB. ESC TAB moves cursor to the previous anchor.
+-<p>
+-<dt><h3>Netscape displays a word red, but w3m doesn't. Why?</h3>
+-<dd>w3m doesn't support <FONT COLOR=".."> tags. It won't be impossible to implement this, but I think it would make the document more difficult to read.
+-<p>
+-<dt><h3>How do I change the colour of anchor-/image-/form links?</h3>
+-<dd>Type 'o' within w3m to get the 'options' screen. You can change these
+-settings there.
+-<dt>
+-<dt><h3>w3m doesn't seem to use the variable EDITOR. Why? </h3>
+-<dd><dd>Go to the 'options' screen using the "o" key. Any entry in the 'Editor' field will override the environment variable.
+-<br>
+-If you want to use the editor specified by EDITOR blank the field and push [OK].
+-<p>
+-<dt><h3>How do I quit a search or URL text input?</h3>
+-<dd>Clear input text using Ctrl-u and hit RETURN.
+-</dd>
+-</dl>
+-<br>
+-<div align=right>
+-<i>Up to <a href="#index">index</a></i>
+-</div>
+-<br>
+-<u><h2><a name="www">Questions about WWW usage</a></h2></u>
+-<br>
+-<dl>
+-<dt><h3>How do I fill in forms with w3m?</h3>
+-<dd>Form input fields are displayed in red (or reverse). Move the cursor to
+-them and hit RETURN. Then,
+-<ul>
+-<li>if it is a text input field, put in your text on the bottom line,
+-<li>if it is a radiobutton or checkbox, that item is selected,
+-<li>if it is a textarea, an editor is spawned,
+-<li>if it is 'submit' or 'reset', well, just do it.
+-</ul>
+-<dt><h3>Seems like w3m is slower than Netscape or Lynx. Why?</h3>
+-<dd>w3m renders a HTML document in two passes. Therefore it displays the documentnot before having read the entire document.
+-<br>
+-Netscape or Lynx display the document before having read the whole page,
+-and therefore seem faster.
+-<p>
+-<dt><h3>Loading time doesn't decrease when loading a previously seen page</h3>
+-<dd>w3m doesn't have its own cache. Therefore, it reads the document
+-from the server each time it accesses it. If possible, use a cache server.
+-<p>
+-<dt><h3>How do I download a linked file?</h3>
+-<dd>Use 'a' (or 'd' with Lynx-like keybindings) or ESC RET. If you want to download an inline image, use ESC 'I'.
+-<p>
+-<dt><h3>How do I specify a proxy server?</h3>
+-<dd>Set the environment variable HTTP_PROXY or use the option setting panel
+-("o" key). For example, if you want to use port 8000 of proxy.hogege.com, specify
+-<p>
+-<pre>
+- http://proxy.hogege.com:8000/
+-</pre>
+-<p>
+-<dt><h3>w3m freezes when I invoke an external browser.</h3>
+-<dd>Enter w3m's option screen using the 'o' key and specify
+-<p>
+-<pre>
+- netscape %s &
+-</pre>
+-<p>
+-(if you are using netscape).
+-<p>
+-<dt><h3>How do I change the default image viewer?</h3>
+-<dd>By default w3m uses xv to view images. If you want to change it into, let's say, 'display', add the following line to ~/.w3m/mailcap or /etc/mailcap.
+-<p>
++ <p>
++ with 2, 3, 4, or 5.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Does w3m support monochrome displays?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Yes. You may either
++ </p>
++ <ul>
++ <li>
++ Answer the above-mentioned <q>configure</q> question with 1,
++ or
++ </li>
++ <li>
++ Invoke w3m with the -M option, or
++ </li>
++ <li>
++ Type <q>o</q> within w3m to enter the options setting panel and turn
++ off color display mode.
++ </li>
++ </ul>
++ </dd>
++ <dt>
++ <b>
++ How do I shift the display?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ You can shift the display by moving the cursor to the edge of
++ the screen. You may also use the following commands
++ </p>
++ <ul>
++ <li>SHIFT_LEFT and SHIFT_RIGHT, bound to the keys <span class="mono">></span> and <span class="mono"><</span></li>
++ <li>SHIFT_LEFT1 and SHIFT_RIGHT1, bound to the keys <span class="mono">.</span> and <span class="mono">,</span></li>
++ </ul>
++ <p>
++ Another idea would be adjusting the xterm with the -geometry
++ option e.g. something like
++ </p>
++ <pre> xterm -geometry 110x45 -bg white -name w3m -e w3m -B</pre>
++ </dd>
++ <dt>
++ <b>
++ How do I move between hyperlinks?
++ </b>
++ </dt>
++ <dd>
++ <p>
++
++ You can move to the next hyperlink
++ using <span class="mono">TAB</span>. <span class="mono">ESC
++ TAB</span> moves the cursor to the previous hyperlink. (see
++ Section <a href="MANUAL.html#Functions" target="_blank">
++ Functions and Key bindings</a> of w3m's manual)
++
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Graphical browsers display a word red, but w3m doesn't. Why?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ w3m doesn't support the attribute COLOR="..." of HTML. It wouldn't
++ be impossible to implement this, but I think it would make
++ documents more difficult to read.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ How do I change the colors for hyperlinks, images and form fields?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Type <q>o</q> within w3m to get the options panel. You
++ can change these settings there.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ w3m doesn't seem to use the variable EDITOR. Why?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Go to the options setting panel using the <q>o</q> key. Any
++ entry in the <q>Editor</q> field overrides the environment
++ variable.
++ </p>
++ <p>
++ If you want to use the editor specified by EDITOR, blank the
++ field and save the settings using the button [OK].
++ </p>
++ </dd>
++ <dt>
++ <b>
++ How do I quit a search or URL text input?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Clear input text using <span class="mono">CTRL-u</span> and hit <span class="mono">RETURN</span>.
++ </p>
++ </dd>
++ </dl>
++ <p align="right">
++ <i>
++ Up to <a href="#index">index</a>
++ </i>
++ </p>
++ <h2 id="www">
++ <u>
++ Questions about WWW usage
++ </u>
++ </h2>
++ <dl>
++ <dt>
++ <b>
++ How do I fill in forms with w3m?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Form input fields are displayed in red (or reverse). Move the
++ cursor to them. Then, if it is
++ </p>
++ <ul>
++ <li>
++ a text input field, hit <span class="mono">RETURN</span>
++ put in your text on the bottom line. Press
++ <span class="mono">RETURN</span> again
++ </li>
++ <li>
++ a radiobutton or checkbox, pressing
++ <span class="mono">RETURN</span> changes or toggles the selection
++ </li>
++ <li>
++ a textarea, pressing
++ <span class="mono">RETURN</span> spawns an editor
++ </li>
++ <li>
++ a <q>submit</q> or <q>reset</q> field,
++ the respective action is performed.
++ </li>
++ </ul>
++ </dd>
++ <dt>
++ <b>
++ Seems like w3m is slower than some other browsers. Why?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ w3m renders a HTML document in two passes. Therefore it doesn't
++ start to display the document until it has finished reading it.
++ </p>
++ <p>
++ Most other browsers display the document before having read the
++ whole page, and therefore seem faster.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Loading time doesn't decrease when loading a previously seen
++ page.
++ </b>
++ </dt>
++ <dd>
++ <p>
++ w3m doesn't have its own cache. Therefore, it reads the document
++ from the server each time it accesses it. If possible, use a
++ cache server.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ How do I download a linked file?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Use <q>a</q> (or <q>d</q> with Lynx-like keybindings) or
++ <span class="mono">ESC RET</span>.
++ If you want to download an inline image, use
++ <span class="mono">ESC I</span>. (see
++ Section <a href="MANUAL.html#Functions" target="_blank">
++ Functions and Key bindings</a> of w3m's manual)
++ </p>
++ </dd>
++ <dt>
++ <b>
++ How do I specify a proxy server?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Set the environment variables HTTP_PROXY, HTTPS_PROXY, GOPHER_PROXY
++ and FTP_PROXY, or use the options setting panel (<q>o</q> key). For
++ example, if you want to use port 8000 of proxy.example.org, specify
++ </p>
++ <pre> http://proxy.example.org:8000/</pre>
++ </dd>
++<!-- deleted, see mail dated Mon, 04 Apr 2016 20:50:27 +0900 (JST)
++from Tatsuya Kinoshita <tats@debian.org>
++ <dt>
++ <b>
++ w3m freezes when I invoke an external browser.
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Enter w3m's option screen using the <q>o</q> key and specify
++ </p>
++ <pre> firefox %s &</pre>
++ <p>
++ (if you are using Firefox). Note that %s is replaced with the URL
++ when invoking.
++ </p>
++ </dd>
++ -->
++ <dt>
++ <b>
++ How do I change the default image viewer?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ By default w3m uses xv to view images. If you want to change it
++ into, let's say, <q>display</q>, add the following line to
++ ~/.w3m/mailcap or /etc/mailcap:
++ </p>
+ <pre>
+-image/*; display %s
++ image/*; display %s
+ </pre>
+-<p>
+-You can specify external viewers of other file types as well:
+-<p>
++ <p>
++ You can specify external viewers of other file types as well:
++ </p>
+ <pre>
+-image/*; display %s
+-application/postscript; ghostview %s
+-application/x-dvi; xdvi %s
++ image/*; display %s
++ application/postscript; ghostview %s
++ application/x-dvi; xdvi %s
+ </pre>
+-<dt><h3>How do I enter a URL?</h3>
+-<dd>Type SHIFT-U
+-<p>
+-<dt><h3>w3m appends a URL to the former one despite of having cleared the line
+-with Ctrl-u. What to do?</h3>
+-<dd>Enter the <i>complete</i> adress, e.g. http://www.slashdot.org.
+-</dd>
+-</dl>
+-<br>
+-<div align=right>
+-<i>Up to <a href="#index">index</a></i>
+-</div>
+-<br>
+-<u><h2><a name="other">Miscellaneous</a></h2></u>
+-<br>
+-<dl>
+-<dt><h3>What is w3m's configuration file?</h3>
+-<dd>It is ~/.w3m/config.
+-With this file, you can adjust w3m's behavior by changing values of options
+-that are described to be varied with the option setting panel.
+-Each line contains setting for one option, which is a pair of an option name
+-and its value with a space as a separator.
+-<p>
+-<dt><h3>What are these w3mxxxx files in my ~/.w3m directory for?</h3>
+-<dd>These are temporary files used by w3m when reading documents from a
+-WWW server. They are not cache files and are usually deleted when w3m is
+-terminated. If there remain any temp files, please remove them by yourself.
+-<p>
+-</dd>
+-</dl>
+-<br>
+-<div align=right>
+-<i>Up to <a href="#index">index</a></i>
+-</div>
+-<br>
+-</BODY>
+-</HTML>
++ </dd>
++ <dt>
++ <b>
++ How do I enter a URL?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Type <span class="mono">U</span>
++ </p>
++ </dd>
++ <dt>
++ <b>
++ w3m appends a URL to the former one even when I clear the line
++ with <span class="mono">CTRL-u</span>. What should I do?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Enter the <i>complete</i> address, e.g. http://www.slashdot.org.
++ </p>
++ </dd>
++ </dl>
++ <p align="right">
++ <i>
++ Up to <a href="#index">index</a>
++ </i>
++ </p>
++ <h2 id="other">
++ <u>
++ Miscellaneous
++ </u>
++ </h2>
++ <dl>
++ <dt>
++ <b>
++ What is w3m's configuration file?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ It is ~/.w3m/config.
++ </p>
++
++ <p>
++ With this file, each user can adjust w3m's behavior by changing
++ the values of options whose effects are described in the options
++ setting panel. Each line contains one option setting, consisting
++ of an option name and its value with a space as a separator.
++ </p>
++
++ <p>Without a user-specific configuration file, w3m honours
++ the system wide configuration file /etc/w3m/config.
++ </p>
++
++ </dd>
++ <dt>
++ <b>
++ What are these w3mxxxx files in my ~/.w3m directory for?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ These are temporary files used by w3m when reading documents
++ from a WWW server. They are not cache files and are usually
++ deleted when w3m is terminated. If any temp files are left
++ behind, please remove them yourself.
++ </p>
++ </dd>
++ </dl>
++ <p align="right">
++ <i>
++ Up to <a href="#index">index</a>
++ </i>
++ </p>
++ </body>
++</html>
+diff --git a/doc/HISTORY b/doc/HISTORY
+index b8f5b94..7f7ae2b 100644
+--- a/doc/HISTORY
++++ b/doc/HISTORY
+@@ -588,7 +588,7 @@ From: Okabe Katsuya <okabek@guitar.ocn.ne.jp>
+ * space characters in a buffer are mapped into 0x80-0x9f.
+ * unprintable characters (0x80-0xa0) are displayed as \xxx.
+
+-From: Tsutomu Okada (^[$B2,ED^[(B ^[$BJY^[(B) <okada@furuno.co.jp>
++From: Tsutomu Okada <okada@furuno.co.jp>
+ Subject: [w3m-dev 01354] minimize when #undef USE_GOPHER or USE_NNTP
+
+ 2000/11/16
+@@ -1422,7 +1422,7 @@ HTML4.0 ID attribute support.
+
+ From: Okabe Katsuya <okabe@fphy.hep.okayama-u.ac.jp>
+ table get weird when it contains <input type=hidden>.
+-^[$B=$@5!%^[(B
++Fixed.
+
+ 2000.2.12
+ From: Rogue Metal - Jake Moorman <roguemtl@stampede.org>
+@@ -1649,15 +1649,15 @@ From: patakuti
+ If an <input type=button> tag has no `name' attribute,
+ w3m adds it an inappropriate name attribute.
+
+-From: ^[$B$d$^^[(B
++From: Yama
+ Now w3m can handle a frameset that has both ROWS and COLS.
+
+ From: aito
+ Now bookmarking is done by a separate command w3mbookmark.
+
+-C-s ^[$B$G2hLLI=<($,;_$^$C$F$$$?%P%0$N=$@5!%^[(B
++Bug fix that C-s hangs.
+
+-^[$BJ8;zF~NO;~$K^[(B C-g ^[$B$GCf;_$G$-$k$h$&$K$7$?!%^[(B
++Enable C-g to quit for keyboard input.
+
+ From: hovav@cs.stanford.edu
+ When downloading a file, an attempt to save it to a non-exist
+@@ -1699,7 +1699,7 @@ Menu behavior is changed.
+ * Clicking outside the menu causes cancellation of sub-menu.
+ * <, >, +, - abandoned
+
+-From: ^[$B$*$+$@^[(B <okada@furuno.co.jp>
++From: Okada <okada@furuno.co.jp>
+ Now C-a/C-e are bound to 'jump to the first/last item in menu.'
+
+ From: "OMAE, jun" <jun-o@osb.att.ne.jp>
+diff --git a/doc/MANUAL.html b/doc/MANUAL.html
+index aff0189..f0710a7 100644
+--- a/doc/MANUAL.html
++++ b/doc/MANUAL.html
+@@ -1,535 +1,2424 @@
+-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
++<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+ <html>
+-<head><title>w3m manual</title>
+-</head>
+-<body>
+-<h1>w3m MANUAL</h1>
+-<div align=right>
+-Akinori Ito<br>
+-aito@fw.ipsj.or.jp
+-</div>
+-<h2>Index</h2>
+-<menu>
+-<li><a href="#Introduction">Introduction</a>
+-<li><a href="#Options">Options</a>
+-<li><a href="#Color">Document color</a>
+-<li><a href="#Key:orig">Key binding</a>
+-<li><a href="#Key:lynx">Lynx-like key binding</a>
+-<li><a href="#Mouse">Mouse operation</a>
+-<li><a href="#Key:custom">Key customization</a>
+-<li><a href="#LocalCGI">Local CGI</a>
+-</menu>
+-
+-<hr>
+-<a name="Introduction"></a>
+-<h2>Introduction</h2>
+-w3m is a pager/text-based WWW browser. You can browse local documents and/or
+-documents on the WWW using a terminal emulator.
+-
+-<hr>
+-<a name="Options"></a>
+-<h2>Options</h2>
+-
+-Command line usage is
+-<p>
++ <head>
++ <title>w3m manual</title>
++ <style>
++ span.mono {
++ font-family:mono;
++ }
++ </style>
++ <meta http-equiv="content-type" content="text/html;charset=UTF-8">
++ </head>
++ <body>
++ <!--
++insertions tagged with "mh 2016-03-29" and "mh 2016-06-11" come from the latest version of manual page w3m (1)
++ -->
++
++ <h1>w3m MANUAL</h1>
++ <div align="right">
++ Akinori Ito<br>
++ aito@fw.ipsj.or.jp
++ </div>
++ <h2>Index</h2>
++ <ul>
++ <li>
++ <a href="#Introduction">
++ Introduction
++ </a>
++ </li>
++ <li>
++ <a href="#Options">
++ Options
++ </a>
++ </li>
++ <li>
++ <a href="#Color">
++ Document Colors
++ </a>
++ </li>
++ <li>
++ <a href="#Functions">
++ Functions and Key bindings
++ </a>
++ </li>
++<!-- mh 2016-06-13 obsolete
++ <li>
++ <a href="#Key:lynx">
++ Lynx-like key bindings
++ </a>
++ </li>
++-->
++ <li>
++ <a href="#Mouse">
++ Mouse Operation
++ </a>
++ </li>
++<!-- mh 2016-06-13 obsolete
++ <li>
++ <a href="#Key:custom">
++ Key customization
++ </a>
++ </li>
++ -->
++ <li>
++ <a href="#LocalCGI">
++ Local CGI scripts
++ </a>
++ </li>
++ </ul>
++ <hr>
++ <h2 id="Introduction">
++ Introduction
++ </h2>
++ <p>
++ w3m is a pager/text-based WWW browser. You can browse local
++ documents and/or documents on the WWW using a terminal emulator.
++ </p>
++ <hr>
++ <h2 id="Options">
++ Options
++ </h2>
++ <p>
++ Command line usage is
++ </p>
++<!-- mh 2016-08-06 invocation adapted to w3m(1). w3m accepts several options and several targets -->
+ <pre>
+- w3m [options] [file|URL]
++ w3m [option]... [file|URL]...
+ </pre>
+-<P>
+-If you specify filenames/URLs on command line, these documents are displayed.
+-If you specify nothing, w3m reads a document from standard input and display it.
+-If no filename and/or URLs are specified and standard input is tty, w3m terminates
+-without displaying anything.
++ <p>
++ If you specify filenames/URLs on the command line, these documents
++ are displayed. If you specify nothing, w3m will read a document
++ from standard input and display it. If it doesn't find a document
++ there either then normally w3m will terminate.
++ </p>
++ <p>
++ Options include:
++ </p>
++ <dl>
++<h3>General options</h3>
++ <dt>
++ -B
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ with no other target defined, use the bookmark page for startup
++ </p>
++ </dd>
++ <dt>
++ -M
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ monochrome display
++ </p>
++ </dd>
++ <dt>
++ -no-mouse
++ </dt>
++ <dd>
++ <p>
++ deactivate mouse support.
++ </p>
++ </dd>
++ <dt>
++ -num
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ display each line's number
+
+-<p>
+-Options are as follows:
+-<dl>
+-<dt>+<line number>
+-<dd>Move to the specified line.
+-<dt>-t width
+-<dd>Specify tab width. Default is 8.
+-<dt>-r
+-<dd>When displaying text/plain document, prohibit emphasis using backspace.
+-If you don't specify this option,
+-``A^H_'' is interpreted as underlined character and ``A^HA'' as a bold character.
+-<dt>-l number
+-<dd>Specify line number preserved internally when reading text/plain document
+-fron standard input. Default is 10000.
+-<dt>-s
+-<dd>Display documents with Shift_JIS code.
+-<dt>-e
+-<dd>Display documents with EUC_JP code.
+-<dt>-j
+-<dd>Display documents with ISO-2022-JP code.
+-<dt>-T type
+-<dd>Specify document type. Without this option, document type
+-is determined from extension of a file. If the determination
+-fails, the document is regarded as text/plain.
+-<p>
+-Example:<br>
+-Read HTML document from standard input and display it
++ </p>
++ </dd>
++<!-- mh 2016-08-06 commented out. As implementation is not verified.
++ <dt>
++ -ppc <i>num</i>
++ </dt>
++ <dd>
++ <p>
++ width of <i>num</i> pixels per character. Range of 4.0 to 32.0,
++ default 8.0. Larger values will make tables
++ narrower. (Implementation not verified)
++ </p>
++ </dd>
++-->
++ <dt>
++ -v
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ with no other target defined, welcome users with a built-in page
++ </p>
++ </dd>
++ <dt>
++ -W
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ toggle wrapping mode in searches
++ </p>
++ </dd>
++ <dt>
++ -X
++ </dt>
++ <dd>
++ <p>
++ upon exit, do not reinitialize the terminal.
++ </p>
++ </dd>
++ <dt>
++ +<i>num</i>
++ </dt>
++ <dd>
++ <p><!--mh 2016-06-11 -->
++ go to line <i>num</i>; only effective for numbers larger
++ than the number of lines in the terminal
++ </p>
++ </dd>
++<h3>Browser options</h3>
++ <dt>
++ -cols <i>num</i>
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-06-11 -->
++ with stdout as destination; HTML is rendered to lines of <i>num</i>
++ characters
++ </p>
++ </dd>
++ <dt>
++ -cookie
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ use stored cookies and accept new ones
++ </p>
++ </dd>
++ <dt>
++ -no-cookie
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ neither use stored cookies nor accept new ones
++
++ </p>
++ </dd>
++ <dt>
++ -F
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ render frames
++ </p>
++ </dd>
++ <dt>
++ -no-graph
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ do not use graphic characters for drawing HTML table and frame
++ borders
++ </p>
++ </dd>
++ <dt>
++ -header <i>string</i>
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ append <i>string</i> to the HTTP(S) request. Expected to match
++ the header syntax <span class="mono">"Variable: Value"</span>
++ </p>
++ </dd>
++ <dt>
++ -m
++ </dt>
++ <dd>
++ <p>
++ display document using <q>Internet message mode</q>. With this
++ option, w3m determines document type from header information.
++ This is useful when reading e-mail or Usenet news posts.
++<!-- mh 2016-03-29
++Render the body of Usenet messages according to the header <q>Content-type</q>
++-->
++ </p>
++ </dd>
++ <dt>
++ -no-proxy
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-06-11-->
++ do not use proxy
++ </p>
++ </dd>
++ <dt>
++ -post <i>file</i>
++ </dt>
++ <dd>
++ <p><!--funktionierend 2016-06-28T08:22>-->
++ use POST method to upload data defined in <i>file</i>. The
++ syntax to be used is <span class="mono">"var1=value1[&var2=value2]â¦"</span>
++ </p>
++ </dd>
++<h3>Text pager options</h3>
++ <dt>
++ -l <i>num</i>
++ </dt>
++ <dd>
++ <p>
++ <!-- mh2016-06-11-->
++ number of lines preserved internally when receiving plain text
++ from stdin (default 10,000)
++ </p>
++ </dd>
++ <dt>
++ -r
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29 -->
++ use caret notation to display special escape characters (such as
++ ANSI escapes or nroff-style backspaces for bold and underlined
++ characters) instead of processing them
++ </p>
++ </dd>
++ <dt>
++ -s
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ squeeze multiple blank lines into one
++ </p>
++ </dd>
++
++ <dt>
++ <!--mh 2016-03-29 --> -t <i>num</i>
++ </dt>
++ <dd>
++ <p>
++ <!--mh 2016-03-29--> set tab width to <i>num</i> columns. No effect on stdout
++ </p>
++ </dd>
++<h3>Data type/encoding options</h3>
++ <dt>
++ -I <i>charset</i>
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ user defined character encoding of input data
++ </p>
++ </dd>
++ <dt>
++ -O <i>charset</i>
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29 -->
++ user defined character encoding of output data
++ </p>
++ </dd>
++ <dt>
++ -T <i>type</i>
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-06-11-->
++ explicit characterization of input data by MIME type. Without
++ this option, document type is determined from the extension of a
++ file. If the determination fails, the document is regarded as
++ text/plain. For example:
++ </p>
++ <p>
++ Read HTML document from standard input and display it
++ </p>
+ <pre>
+- cat hoge.html | w3m -T text/html
++ cat example.html | w3m -T text/html
+ </pre>
+-<p>
+-Display HTML source
++ <p>
++ Display HTML source
++ </p>
+ <pre>
+- w3m -T text/plain hoge.html
++ w3m -T text/plain example.html
+ </pre>
+-<dt>-m
+-<dd>Display document with Internet message mode.
+-With this option, w3m determines document type from header information.
+-It is useful when reading E-mail or NetNews messages.
+-<dt>-v
+-<dd>visual startup mode.
+-<dt>-B
+-<dd>Show the bookmark.
+-<dt>-bookmark file
+-<dd>Specify bookmark file.
+-<dt>-M
+-<dd>Monochrome display mode.
+-<dt>-F
+-<dd>Automatically render frame.
+-<dt>-S
+-<dd>Squeeze blank lines.
+-<dt>-X
+-<dd>Upon exit, do not display preserved screen.
+-<dt>-W
+-<dd>Toggle wrap search mode.
+-<dt>-o option=value
+-<dd>Specify option. The option names and values are
+-same as that appears in ~/.w3m/config.
+-<dt>-cookie
+-<dd>Process cookies.
+-<dt>-no-cookie
+-<dd>Don't process cookies.
+-<dt>-num
+-<dd>Show linenumber.
+-<dt>-dump
+-<dd>Read document specified by URL and dump formatted text into standard
+-output. The width of the document become 80. This width can be overridden
+-with -cols option.
+-<dt>-cols width
+-<dd>Specify document width. Used with -dump option.
+-<dt>-ppc count
+-<dd> Specify the number of pixels per character (default 8.0). Larger
+- values will make tables narrower.
+-<dt>-dump_source
+-<dd>Read document specified by URL and dump the source.
+-<dt>-dump_head
+-<dd>Read document specified by URL and dump headers.
+-<dt>-dump_both
+-<dd>Read document specified by URL and dump headers and the source.
+-<dt>-dump_extra
+-<dd>Read document specified by URL and dump extra informations, headers and the source.
+-<dt>-post file
+-<dd>use POST method with file content.
+-<dt>-header string
+-<dd>insert string as a header.
+-<dt>-no-proxy
+-<dd>Don't use proxy server.
+-<dt>-no-graph
+-<dd>Use ASCII character to draw frames.
+-<dt>-no-mouse
+-<dd>Don't activate mouse.
+-<dt>-config file
+-<dd>specify config file.
+-</dl>
+-
+-<hr>
+-<a name="Color"></a>
+-<h2>Document color</h2>
+-
+-Links and images are displayed as follows.
+-<div align="center">
+-<table border="1">
+-<tr><th> </th><th>Color mode</th><th>Monochrome mode</th></tr>
+-<tr><td>links</td><td>blue</td><td>underline</td></tr>
+-<tr><td>inline images</td><td>green</td><td>reverse</td></tr>
+-<tr><td>form input</td><td>red</td><td>reverse</td></tr>
+-</table>
+-</div>
+-These colors can be customized using option setting command "o".
+-
+-<hr>
+-<a name="Key:orig"></a>
+-<h2>Key binding</h2>
+-
+-After invocation, you can operate w3m by one-character commands from
+-the keyboard.
+-<P>
+-Here's the original key-binding table. If you are using Lynx-like key
+-bindings, see <a href="#Key:lynx">the Lynx-like key binding</a>.
+-
+-<H3>Page/Cursor motion</H3>
+-<table>
+-<TR><TD WIDTH=100>SPC,C-v<TD>Forward page
+-<TR><TD>b,ESC v<TD>Backward page
+-<TR><TD>l,C-f<TD>Cursor right
+-<TR><TD>h,C-b<TD>Cursor left
+-<TR><TD>j,C-n<TD>Cursor down
+-<TR><TD>k,C-p<TD>Cursor up
+-<TR><TD>J<TD>Roll up one line
+-<TR><TD>K<TD>Roll down one line
+-<TR><TD>^,C-a<TD>Go to the beginning of line
+-<TR><TD>$,C-e<TD>Go to the end of line
+-<TR><TD>w<TD>Go to next word
+-<TR><TD>W<TD>Go to previous word
+-<TR><TD>><TD>Shift screen right
+-<TR><TD><<TD>Shift screen left
+-<TR><TD>.<TD>Shift screen one column right
+-<TR><TD>,<TD>Shift screen one column left
+-<TR><TD>g,M-<<TD>Go to the first line
+-<TR><TD>G,M-><TD>Go to the last line
+-<TR><TD>ESC g<TD>Go to specified line
+-<TR><TD>Z<TD>Move to the center line
+-<TR><TD>z<TD>Move to the center column
+-<TR><TD>TAB<TD>Move to next hyperlink
+-<TR><TD>C-u,ESC TAB<TD>Move to previous hyperlink
+-<TR><TD>[<TD>Move to the first hyperlink
+-<TR><TD>]<TD>Move to the last hyperlink
+-</table>
+-
+-<H3>Hyperlink operation</H3>
+-<table>
+-<TR><TD WIDTH=100>RET<TD>Follow hyperlink
+-<TR><TD>a, ESC RET<TD>Save link to file
+-<TR><TD>u<TD>Peek link URL
+-<TR><TD>i<TD>Peek image URL
+-<TR><TD>I<TD>View inline image
+-<TR><TD>ESC I<TD>Save inline image to file
+-<TR><TD>:<TD>Mark URL-like strings as anchors
+-<TR><TD>ESC :<TD>Mark Message-ID-like strings as news anchors
+-<TR><TD>c<TD>Peek current URL
+-<TR><TD>=<TD>Display information about current document
+-<TR><TD>C-g<TD>Show current line number
+-<TR><TD>C-h<TD>View history of URL
+-<TR><TD>F<TD>Render frame
+-<TR><TD>M<TD>Browse current document using external browser
+-(use 2M and 3M to invoke second and third browser)
+-<TR><TD>ESC M<TD>Browse link using external browser
+-(use 2ESC M and 3ESC M to invoke second and third browser)
+-</table>
+-
+-<H3>File/Stream operation</H3>
+-<table>
+-<TR><TD WIDTH=100>U<TD>Open URL
+-<TR><TD>V<TD>View new file
+-<TR><TD>@<TD>Execute shell command and load
+-<TR><TD>#<TD>Execute shell command and browse
+-</table>
+-
+-<H3>Buffer operation</H3>
+-<table>
+-<TR><TD WIDTH=100>B<TD>Back to the previous buffer
+-<TR><TD>v<TD>View HTML source
+-<TR><TD>s<TD>Select buffer
+-<TR><TD>E<TD>Edit buffer source
+-<TR><TD>C-l<TD>Redraw screen
+-<TR><TD>R<TD>Reload buffer
+-<TR><TD>S<TD>Save buffer
+-<TR><TD>ESC s<TD>Save source
+-<TR><TD>ESC e<TD>Edit buffer image
+-</table>
+-
+-<H3>Buffer selection mode</H3>
+-<table>
+-<TR><TD WIDTH=100>k, C-p<TD>Select previous buffer
+-<TR><TD>j, C-n<TD>Select next buffer
+-<TR><TD>D<TD>Delect current buffer
+-<TR><TD>RET<TD>Go to the selected buffer
+-</table>
+-
+-<H3>Bookmark operation</H3>
+-<table>
+-<TR><TD WIDTH=100>ESC b<TD>Load bookmark
+-<TR><TD>ESC a<TD>Add current to bookmark
+-</table>
+-
+-<H3>Search</H3>
+-<table>
+-<TR><TD WIDTH=100>/,C-s<TD>Search forward
+-<TR><TD>?,C-r<TD>Search backward
+-<TR><TD>n<TD>Search next
+-<TR><TD>N<TD>Search previous
+-<TR><TD>C-w<TD>Toggle wrap search mode
+-</table>
+-
+-<H3>Mark operation</H3>
+-<table>
+-<TR><TD WIDTH=100>C-SPC<TD>Set/unset mark
+-<TR><TD>ESC p<TD>Go to previous mark
+-<TR><TD>ESC n<TD>Go to next mark
+-<TR><TD>"<TD>Mark by regular expression
+-</table>
+-
+-<H3>Miscellany</H3>
+-<table>
+-<TR><TD WIDTH=100>!<TD>Execute shell command
+-<TR><TD>H<TD>Help (load this file)
+-<TR><TD>o<TD>Set option
+-<TR><TD>C-k<TD>Show cookie jar
+-<TR><TD>C-c<TD>Stop
+-<TR><TD>C-z<TD>Suspend
+-<TR><TD>q<TD>Quit (with confirmation, if you like)
+-<TR><TD>Q<TD>Quit without confirmation
+-</table>
+-
+-<H3>Line-edit mode</H3>
+-<table>
+-<TR><TD WIDTH=100>C-f<TD>Move cursor forward
+-<TR><TD>C-b<TD>Move cursor backward
+-<TR><TD>C-h<TD>Delete previous character
+-<TR><TD>C-d<TD>Delete current character
+-<TR><TD>C-k<TD>Kill everything after cursor
+-<TR><TD>C-u<TD>Kill everything before cursor
+-<TR><TD>C-a<TD>Move to the top of line
+-<TR><TD>C-e<TD>Move to the bottom of line
+-<TR><TD>C-p<TD>Fetch the previous string from the history list
+-<TR><TD>C-n<TD>Fetch the next string from the history list
+-<TR><TD>TAB,SPC<TD>Complete filename
+-<TR><TD>RETURN<TD>Accept
+-</table>
+-
+-<hr>
+-<a name="Key:lynx"></a>
+-<h2>Lynx-like key binding</h2>
+-
+-If you have chosen `Lynx-like key binding' at the compile time,
+-you can use the following key binding.
+-
+-<H3>Page/Cursor motion</H3>
+-<table>
+-<TR><TD WIDTH=100>SPC,C-v,+<TD>Forward page
+-<TR><TD>b,ESC v,-<TD>Previous page
+-<TR><TD>l<TD>Cursor right
+-<TR><TD>h<TD>Cursor left
+-<TR><TD>j<TD>Cursor down
+-<TR><TD>k<TD>Cursor up
+-<TR><TD>J<TD>Roll up one line
+-<TR><TD>K<TD>Roll down one line
+-<TR><TD>^<TD>Go to the beginning of line
+-<TR><TD>$<TD>Go to the end of line
+-<TR><TD>><TD>Shift screen right
+-<TR><TD><<TD>Shift screen left
+-<TR><TD>C-a<TD>Go to the first line
+-<TR><TD>C-e<TD>Go to the last line
+-<TR><TD>G<TD>Go to the specified line
+-<TR><TD>Z<TD>Move to the center line
+-<TR><TD>z<TD>Move to the center column
+-<TR><TD>TAB,C-n,Down arrow<TD>Move to next hyperlink
+-<TR><TD>ESC TAB,C-p,Up arrow<TD>Move to previous link
+-<TR><TD>C-g<TD>Show current page position
+-</table>
+-
++ </dd>
++<h3>Options for data output, followed by immediate exit</h3>
++ <dt>
++ -dump
++ </dt>
++ <dd>
++ <p>
++ read document specified by URL and dump page rendered as text
++ into standard output.
++ <!-- mh 2016-03-29 -->
++ Is set implicitly when output is directed
++ to a file or pipe. A width of 80 columns is used unless option
++ -cols sets another value.
++ </p>
++ </dd>
++ <dt>
++ -dump_source
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ dump the page's source code into stdout
++ </p>
++ </dd>
++ <dt>
++ -dump_head
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ dump response of a HEAD request for a URL into stdout
++ </p>
++ </dd>
++ <dt>
++ -dump_both
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ dump HEAD, and source code for a URL into stdout
+
+-<H2>Hyperlink operation</H2>
+-<table>
+-<TR><TD WIDTH=100>RET, C-f, Right arrow<TD>Follow hyperlink
+-<TR><TD>d, ESC RET<TD>Save link to file
+-<TR><TD>u<TD>Peek link URL
+-<TR><TD>i<TD>Peek image URL
+-<TR><TD>I<TD>View inline image
+-<TR><TD>ESC I<TD>Save inline image to file
+-<TR><TD>:<TD>Mark URL-like strings as anchors
+-<TR><TD>ESC :<TD>Mark Message-ID-like strings as news anchors
+-<TR><TD>c<TD>Peek current URL
+-<TR><TD>=<TD>Display information about current document
+-<TR><TD>C-h<TD>View history of URL
+-<TR><TD>F<TD>Render frame
+-<TR><TD>M<TD>Browse current document using external browser
+-(use 2M and 3M to invoke second and third browser)
+-<TR><TD>ESC M<TD>Browse link using external browser
+-(use 2ESC M and 3ESC M to invoke second and third browser)
+-</table>
++ </p>
++ </dd>
++ <dt>
++ -dump_extra
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ dump HEAD, source code, and extra information for a URL into
++ stdout
++ </p>
++ </dd>
+
+-<H2>File/Stream operation</H2>
+-<table>
+-<TR><TD WIDTH=100>g,U<TD>Open URL
+-<TR><TD>V<TD>View new file
+-<TR><TD>@<TD>Execute shell command and load
+-<TR><TD>#<TD>Execute shell command and browse
+-</table>
++<h3>Options for overriding default settings and resources</h3>
++
++ <dt>
++ -bookmark <i>file</i>
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ use <i>file</i> instead of the default bookmark.html file
++ </p>
++ </dd>
++ <dt>
++ -config <i>file</i>
++ </dt>
++ <dd>
++ <p>
++ <!--mh 2016-06-11-->
++ use <i>file</i> instead of the default configuration file
++ </p>
++ </dd>
++ <dt>
++ -o <i>option</i>=<i>value</i>
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ modify one configuration item with an explicitly given value; without <i>option=value</i>, equivalent to <i>-show-option</i>
++ </p>
++ </dd>
++ </dl>
++ <hr>
++ <h2 id="Color">
++ Document Colors
++ </h2>
++ <p>
++ Hyperlinks and images are displayed as follows.
++ </p>
++ <div align="center">
++ <table border="1">
++ <tr>
++ <th>
++ </th>
++ <th>
++ Color mode
++ </th>
++ <th>
++ Monochrome mode
++ </th>
++ </tr>
++ <tr>
++ <td>
++ Hyperlinks
++ </td>
++ <td>
++ blue
++ </td>
++ <td>
++ underline
++ </td>
++ </tr>
++ <tr>
++ <td>
++ Inline images
++ </td>
++ <td>
++ green
++ </td>
++ <td>
++ reverse
++ </td>
++ </tr>
++ <tr>
++ <td>
++ Form input
++ </td>
++ <td>
++ red
++ </td>
++ <td>
++ reverse
++ </td>
++ </tr>
++ </table>
++ </div>
++ <p>
++ These colors can be customized using the options setting command
++ <i>o</i>.
++ </p>
++ <hr>
++ <h2 id="Functions">
++ Functions and Key bindings
++ </h2>
++
++ <p>
++ After invocation, you can control w3m by typing in functions by name
++ or with keystroke combinations bound to a function. There are
++ default key bindings.
++<!-- mh 2016-06-13 obsolete
++ If you prefer using Lynx-like
++ key bindings, make w3m start with the respective keymap file keymap.lynx. (see w3m (1)).-->
++ </p>
++<!--
++ <h2 id="Key:custom">
++ Key customization
++ </h2>
++-->
++ <p>
++ You can customize the key bindings (except those for menu
++ operations and line-editing) in a ~/.w3m/keymap file. For example,
++ </p>
+
+-<H2>Buffer operation</H2>
+-<table>
+-<TR><TD WIDTH=100>B, C-b, Left arrow<TD>Back to the previous buffer
+-<TR><TD>\<TD>View HTML source
+-<TR><TD>s, C-h<TD>Select buffer
+-<TR><TD>E<TD>Edit buffer source
+-<TR><TD>C-l, C-w<TD>Redraw screen
+-<TR><TD>R, C-r<TD>Reload buffer
+-<TR><TD>S, p<TD>Save buffer
+-<TR><TD>ESC s<TD>Save source
+-<TR><TD>ESC e<TD>Edit buffer image
+-</table>
+-
+-<H2>Buffer selection mode</H2>
+-<table>
+-<TR><TD WIDTH=100>k, C-p<TD>Select previous buffer
+-<TR><TD>j, C-n<TD>Select next buffer
+-<TR><TD>D<TD>Delect current buffer
+-<TR><TD>RET<TD>Go to the selected buffer
+-</table>
+-
+-<H2>Bookmark operation</H2>
+-<table>
+-<TR><TD WIDTH=100>v, ESC b<TD>Load bookmark
+-<TR><TD>a, ESC a<TD>Add current to bookmark
+-</table>
+-
+-<H2>Search</H2>
+-<table>
+-<TR><TD WIDTH=100>/, C-s<TD>Search forward
+-<TR><TD>n<TD>Search next
+-<TR><TD>w<TD>Toggle wrap search mode
+-</table>
+-
+-<H2>Mark operation</H2>
+-<table>
+-<TR><TD WIDTH=100>C-SPC<TD>Set/unset mark
+-<TR><TD>P<TD>Go to previous mark
+-<TR><TD>N<TD>Go to next mark
+-<TR><TD>"<TD>Mark by regular expression
+-</table>
+-
+-<H2>Miscellany</H2>
+-<table>
+-<TR><TD WIDTH=100>!<TD>Execute shell command
+-<TR><TD>H, ?<TD>Help (load this file)
+-<TR><TD>o<TD>Set option
+-<TR><TD>C-k<TD>Show cookie jar
+-<TR><TD>C-c<TD>Stop
+-<TR><TD>C-z<TD>Suspend
+-<TR><TD>q<TD>Quit (with confirmation, if you like)
+-<TR><TD>Q<TD>Quit without confirmation
+-</table>
+-
+-<H2>Line-edit mode</H2>
+-<table>
+-<TR><TD WIDTH=100>C-f<TD>Move cursor forward
+-<TR><TD>C-b<TD>Move cursor backward
+-<TR><TD>C-h<TD>Delete previous character
+-<TR><TD>C-d<TD>Delete current character
+-<TR><TD>C-k<TD>Kill everything after cursor
+-<TR><TD>C-u<TD>Kill everything before cursor
+-<TR><TD>C-a<TD>Move to the top of line
+-<TR><TD>C-e<TD>Move to the bottom of line
+-<TR><TD>C-p<TD>Fetch the previous string from the history list
+-<TR><TD>C-n<TD>Fetch the next string from the history list
+-<TR><TD>TAB,SPC<TD>Complete filename
+-<TR><TD>RETURN<TD>Accept
+-</table>
+-
+-<hr>
+-<a name="Mouse"></a>
+-<h2>Mouse operation</h2>
+-If w3m is compiled with mouse option and you are using
+-xterm/kterm/rxvt (in this case, you have to set the TERM
+-environment variable to `xterm' or `kterm'.) or GPM
+-environment, you can use mouse
+-for the navigation.
+-<p>
+-<table border=0>
+-<tr><td>left click
+-<td>Move the cursor to the place pointed by the mouse cursor.
+-If you click the cursor and it is on an anchor, follow the anchor.
+-<tr><td>middle click
+-<td>Back to the previous buffer.
+-<tr><td>right click
+-<td>Open pop-up menu. You can choose an item by clicking it.
+-<tr><td>left drag
+-<td>Scroll document. The default behavior is to grab the document
+-and drag it. You can reverse the behavior (grab the window and drag it)
+-with the option setting panel.
+-</table>
+-<p>
++<pre>
++ keymap C-o NEXT_PAGE
++</pre>
+
++ <p>
++ binds the command <span class="mono">NEXT_PAGE</span> (normally bound to SPC and C-v)
++ to control-o. See <a href="README.func">README.func</a> for a list
++ of available functions. Original and Lynx-like keymap definitions
++ are provided as examples: <a href="keymap.default">keymap.default</a>
++ and <a href="keymap.lynx">keymap.lynx</a>.
++ </p>
+
+-<hr>
+-<a name="Key:custom"></a>
+-<h2>Key customization</h2>
+-You can customize the key binding (except line-editing keymap)
+-by describing ~/.w3m/keymap. For example,
+-<pre>
++ <p>
++ Throughout, the <i>C-</i> and <i>M-</i> notations indicate the
++ modifiers <i>control</i> and <i>meta</i>. The <i>ALT</i>-key
++ replaces the latter whereas pressing the <i>ESC</i>-key toggles
++ between <i>meta</i>-modified and simple keystrokes. The minus
++ indicates pressing the keys simultaneously wheras a space
++ represents that one key is pressed after the other, i.e. <i>2 M</i>
++ simply means <i>2</i> followed by <i>M</i>.
++ </p>
+
+- keymap C-o NEXT_PAGE
+
+-</pre>
+-binds `NEXT_PAGE' function (normally bound to SPC and C-v)
+-to control-o. See <a href="README.func">README.func</a> for
+-list of available functions. Original and Lynx-like keymap
+-definitions are provided (<a href="keymap.default">keymap.default</a>
+-and <a href="keymap.lynx">keymap.lynx</a>) as examples.
++ <table border="1" width="100%">
++ <colgroup>
++ <col width="20%">
++ <col width="20%">
++ <col width="20%">
++ <col width="40%">
++ </colgroup>
++ <tr>
++ <th rowspan="2">
++ Function
++ </th>
++ <th colspan="2">Key binding
++ </th>
++ <th rowspan="2">
++ Description
++ </th>
++ </tr>
++ <tr>
++ <th>
++ Default
++ </th>
++ <th>
++ Lynx-like
++ </th>
++ </tr>
++ <tr>
++ <td colspan="4">
++ <h3>In-page navigation</h3>
++</td>
++ </tr>
++ <tr>
++ <td>
++ NEXT_PAGE
++ </td>
++ <td>
++ SPC, C-v, +, PGDN
++ </td>
++ <td>
++ SPC, C-v, +
++ </td>
++ <td>
++ Scroll one page downwards
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PREVIOUS_PAGE
++ </td>
++ <td>
++ b, M-v, -, PGUP
++ </td>
++ <td>
++ b, M-v, -
++ </td>
++ <td>
++ Scroll one page upwards
++ </td>
++ </tr>
++ <tr>
++ <td>
++ MOVE_RIGHT
++ </td>
++ <td>
++ l, C-f, RIGHT
++ </td>
++ <td>
++ l
++ </td>
++ <td>
++ Move cursor right (with a half-screen shift at the screen edge)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ MOVE_LEFT
++ </td>
++ <td>
++ h, C-b, LEFT
++ </td>
++ <td>
++ h
++ </td>
++ <td>
++ Move cursor left (with a half-screen shift at the screen edge)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ MOVE_DOWN
++ </td>
++ <td>
++ j, C-n, DOWN
++ </td>
++ <td>
++ j
++ </td>
++ <td>
++ Move cursor down (with a one-line scroll at the screen edge)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ MOVE_UP
++ </td>
++ <td>
++ k, C-p, UP
++ </td>
++ <td>
++ k
++ </td>
++ <td>
++ Move cursor up (with a one-line scroll at the screen edge)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ UP
++ </td>
++ <td>
++ J
++ </td>
++ <td>
++ J
++ </td>
++ <td>
++ Scroll the screen up one line
++ </td>
++ </tr>
++ <tr>
++ <td>
++ DOWN
++ </td>
++ <td>
++ K
++ </td>
++ <td>
++ K
++ </td>
++ <td>
++ Scroll the screen down one line
++ </td>
++ </tr>
++ <tr>
++ <td>
++ LINE_BEGIN
++ </td>
++ <td>
++ ^, C-a
++ </td>
++ <td>
++ ^
++ </td>
++ <td>
++ Go to the beginning of the line
++ </td>
++ </tr>
++ <tr>
++ <td>
++ LINE_END
++ </td>
++ <td>
++ $, C-e
++ </td>
++ <td>
++ $
++ </td>
++ <td>
++ Go to the end of the line
++ </td>
++ </tr>
++ <tr>
++ <td>
++ NEXT_WORD
++ </td>
++ <td>
++ w
++ </td>
++ <td>
++ w
++ </td>
++ <td>
++ Move to the next word
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PREVIOUS_WORD
++ </td>
++ <td>
++ W
++ </td>
++ <td>
++ W
++ </td>
++ <td>
++ Move to the previous word
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SHIFT_RIGHT
++ </td>
++ <td>
++ >
++ </td>
++ <td>
++ >
++ </td>
++ <td>
++ Shift screen right
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SHIFT_LEFT
++ </td>
++ <td>
++ <
++ </td>
++ <td>
++ <
++ </td>
++ <td>
++ Shift screen left
++ </td>
++ </tr>
++ <tr>
++ <td>
++ RIGHT
++ </td>
++ <td>
++ .
++ </td>
++ <td>
++ .
++ </td>
++ <td>
++ Shift screen one column right
++ </td>
++ </tr>
++ <tr>
++ <td>
++ LEFT
++ </td>
++ <td>
++ ,
++ </td>
++ <td>
++ ,
++ </td>
++ <td>
++ Shift screen one column left
++ </td>
++ </tr>
++ <tr>
++ <td>
++ BEGIN
++ </td>
++ <td>
++ g, M-<, HOME
++ </td>
++ <td>
++ C-a, M-<
++ </td>
++ <td>
++ Go to the first line
++ </td>
++ </tr>
++ <tr>
++ <td>
++ END
++ </td>
++ <td>
++ G, M->, END
++ </td>
++ <td>
++ C-e, M->
++ </td>
++ <td>
++ Go to the last line
++ </td>
++ </tr>
++ <tr>
++ <td>
++ GOTO_LINE
++ </td>
++ <td>
++ M-g
++ </td>
++ <td>
++ G
++ </td>
++ <td>
++ Go to the specified line
++ </td>
++ </tr>
++ <tr>
++ <td>
++ LINE_INFO
++ </td>
++ <td>
++ C-g
++ </td>
++ <td>
++ C-g
++ </td>
++ <td>
++ Display current position in document
++ </td>
++ </tr>
++ <tr>
++ <td>
++ CENTER_H
++ </td>
++ <td>
++ Z
++ </td>
++<!--Correction by mh 2014-04-06
++Description for keybinding of z and Z had been mingled
++-->
++ <td>
++ Z
++ </td>
++ <td>
++ Center screen right and left of the cursor column
++ </td>
++ </tr>
++ <tr>
++ <td>
++ CENTER_V
++ </td>
++ <td>
++ z
++ </td>
++ <td>
++ z
++ </td>
++ <td>
++ Center screen above and below the cursor line
++ </td>
++ </tr>
++ <tr>
++ <td>
++ NEXT_LINK
++ </td>
++ <td>
++ TAB
++ </td>
++ <td>
++ TAB, C-n, DOWN
++ </td>
++ <td>
++ Move to the next hyperlink
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PREVIOUS_LINK
++ </td>
++ <td>
++ M-TAB, C-u
++ </td>
++ <td>
++ M-TAB, C-u, C-p, UP
++ </td>
++ <td>
++ Move to the previous hyperlink
++ </td>
++<!-- Annotion mh 2016-04-06
++Keybinding description for C-g had been moved as it did not fit to "Hyperlink operation" and position in the default and lynx-like series differed
++ -->
++ </tr>
++ <tr>
++ <td>
++ LINK_BEGIN
++ </td>
++ <td>
++ [
++ </td>
++ <td>
++ [
++ </td>
++ <td>
++ Move to the first hyperlink
++ </td>
++ </tr>
++ <tr>
++ <td>
++ LINK_END
++ </td>
++ <td>
++ ]
++ </td>
++ <td>
++ ]
++ </td>
++ <td>
++ Move to the last hyperlink
++ </td>
++ </tr>
++<tr>
++<td>MOVE_LIST_MENU</td>
++<td>M-m</td>
++<td>M-m</td>
++<td>Pop up menu to navigate between hyperlinks</td>
++</tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Hyperlink Operations</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ GOTO_LINK
++ </td>
++ <td>
++ C-j, C-m, RET
++ </td>
++ <td width="100">
++ C-f, C-j, C-m, RET, RIGHT
++ </td>
++ <td>
++ Follow current hyperlink in a new buffer
++ </td>
++ </tr>
++<tr>
++<td>LIST_MENU</td>
++<td>M-l</td>
++<td>M-l</td>
++<td>Pop up hyperlink menu and select one to be followed</td>
++</tr>
++ <tr>
++ <td>
++ SAVE_LINK
++ </td>
++ <td>
++ a, M-RET
++ </td>
++ <td>
++ d, M-RET
++ </td>
++ <td>
++ Save the hyperlink target
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PEEK_LINK
++ </td>
++ <td>
++ u
++ </td>
++ <td>
++ u
++ </td>
++ <td>
++ Show target address
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PEEK_IMG
++ </td>
++ <td>
++ i
++ </td>
++ <td>
++ i
++ </td>
++ <td>
++ Show image address
++ </td>
++ </tr>
++ <tr>
++ <td>
++ VIEW_IMAGE
++ </td>
++ <td>
++ I
++ </td>
++ <td>
++ I
++ </td>
++ <td>
++ Display image in viewer
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SAVE_IMAGE
++ </td>
++ <td>
++ M-I
++ </td>
++ <td>
++ M-I
++ </td>
++ <td>
++ Save inline image
++ </td>
++ </tr>
++<tr>
++<td>MARK_WORD</td>
++<td>;</td>
++<td>;</td>
++<td>Turn current word into hyperlink</td>
++</tr>
++ <tr>
++ <td>
++ MARK_URL
++ </td>
++ <td>
++ :
++ </td>
++ <td>
++ :
++ </td>
++ <td>
++ Turn URL-like strings into hyperlinks
++ </td>
++ </tr>
++ <tr>
++ <td>
++ MARK_MID
++ </td>
++ <td>
++ M-:
++ </td>
++ <td>
++ M-:
++ </td>
++ <td>
++<!-- changed due to mail dated Mon, 04 Apr 2016 00:47:09 +0900 (JST)
++from Tatsuya Kinoshita -->
++ Turn Message-ID-like strings into hyperlinks
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PEEK
++ </td>
++ <td>
++ c
++ </td>
++ <td>
++ c
++ </td>
++ <td>
++ Show current address
++ </td>
++ </tr>
++ <tr>
++ <td>
++ INFO
++ </td>
++ <td>
++ =
++ </td>
++ <td>
++ =
++ </td>
++ <td>
++ Display information about the current document
++ </td>
++ </tr>
++ <tr>
++ <td>
++ HISTORY
++ </td>
++ <td>
++ C-h
++ </td>
++ <td>
++ C-h
++ </td>
++ <td>
++ Show browsing history
++ </td>
++ </tr>
++ <tr>
++ <td>
++ EXTERN
++ </td>
++ <td>
++ M
++ </td>
++ <td>
++ M
++ </td>
++ <td>
++ Browse current document using external browser (prefix 2, 3, ...,
++ or 9 to invoke alternate configured browsers, e.g. 3 M)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ EXTERN_LINK
++ </td>
++ <td>
++ M-M
++ </td>
++ <td>
++ M-M
++ </td>
++ <td>
++ Browse link using external browser (prefixed as above, e.g.
++ 3 M-M)
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Bookmark management</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ BOOKMARK
++ </td>
++ <td>
++ M-b
++ </td>
++ <td>
++ v, M-b
++ </td>
++ <td>
++ View bookmarks
++ </td>
++ </tr>
++ <tr>
++ <td>
++ ADD_BOOKMARK
++ </td>
++ <td>
++ M-a
++ </td>
++ <td>
++ a, M-a
++ </td>
++ <td>
++ Add current page to bookmarks
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>File/Stream Operations</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ GOTO
++ </td>
++ <td>
++ U
++ </td>
++ <td>
++ g, U
++ </td>
++ <td>
++ Open specified document in a new buffer
++ </td>
++ </tr>
++<tr>
++<td>GOTO_RELATIVE</td>
++<td>M-u</td>
++<td>M-u</td>
++<td>Open relative address in a new buffer</td>
++</tr>
++ <tr>
++ <td>
++ LOAD
++ </td>
++ <td>
++ V
++ </td>
++ <td>
++ V
++ </td>
++ <td>
++ Open local file in a new buffer
++ </td>
++ </tr>
++ <tr>
++ <td>
++ READ_SHELL
++ </td>
++ <td>
++ @
++ </td>
++ <td>
++ @
++ </td>
++ <td>
++ <!--Execute shell command and view output-->
++ <!--mh 2016-06-13 No difference to PIPE_SHELL could be discerned-->
++ Execute shell command and display output in a new buffer
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PIPE_SHELL
++ </td>
++ <td>
++ #
++ </td>
++ <td>
++ #
++ </td>
++ <td>
++ <!--Execute shell command and browse output-->
++ <!--mh 2016-06-13 No difference to READ_SHELL could be discerned-->
++ Execute shell command and display output in a new buffer
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Content Operations</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ VIEW <!-- is an alias to SOURCE -->
++ </td>
++ <td>
++ v
++ </td>
++ <td>
++ \
++ </td>
++ <td>
++ Toggle between source code and rendered view of the document
++ </td>
++ </tr>
++<tr>
++<td>LIST</td>
++<td>L</td>
++<td>L</td>
++<td>List link elements, hyperlinks and images</td>
++</tr>
++ <tr>
++ <td>
++ FRAME
++ </td>
++ <td>
++ F
++ </td>
++ <td>
++ F
++ </td>
++ <td>
++ Toggle rendering HTML frames
++ </td>
++ </tr>
++ <tr>
++ <td>
++ REDRAW
++ </td>
++ <td>
++ C-l
++ </td>
++ <td>
++ C-l, C-w
++ </td>
++ <td>
++ Draw the screen anew
++ </td>
++ </tr>
++ <tr>
++ <td>
++ RELOAD
++ </td>
++ <td>
++ R
++ </td>
++ <td>
++ R, C-r
++ </td>
++ <td>
++ Load current document anew
++ </td>
++ </tr>
++ <tr>
++ <td>
++ EDIT
++ </td>
++ <td>
++ E
++ </td>
++ <td>
++ E
++ </td>
++ <td>
++ Edit local source
++ </td>
++ </tr>
++ <tr>
++ <td>
++ EDIT_SCREEN
++ </td>
++ <td>
++ M-e
++ </td>
++ <td>
++ M-e
++ </td>
++ <td>
++ Edit rendered copy of document
++ </td>
++ </tr>
++<tr>
++<td>PIPE_BUF</td>
++<td>|</td>
++<td>|</td>
++<td>Pipe current buffer through a shell command and display output</td>
++</tr>
++ <tr>
++ <td>
++ DOWNLOAD <!-- is an alias to SAVE -->
++ </td>
++ <td>
++ M-s
++ </td>
++ <td>
++ M-s
++ </td>
++ <td>
++ Save document source
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SAVE_SCREEN
++ </td>
++ <td>
++ S
++ </td>
++ <td>
++ S, p
++ </td>
++ <td>
++ Save rendered document
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Buffer/Tab Navigation</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ BACK
++ </td>
++ <td>
++ B
++ </td>
++ <td>
++ B, C-b, LEFT
++ </td>
++ <td>
++ Close current buffer and return to the one below in stack
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SELECT_MENU
++ </td>
++ <td>
++ s
++ </td>
++ <td>
++ s, C-h
++ </td>
++ <td>
++ Pop up buffer-stack menu
++ </td>
++ </tr>
++ <tr>
++ <td>
++ TAB_MENU
++ </td>
++ <td>
++ M-t
++ </td>
++ <td>
++ M-t
++ </td>
++ <td>
++ Pop up tab selection menu
++ </td>
++ </tr>
++ <tr>
++ <td>
++ NEW_TAB
++ </td>
++ <td>
++ T
++ </td>
++ <td>
++ T
++ </td>
++ <td>
++ Open a new tab (with current document)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ TAB_LINK
++ </td>
++ <td>
++ C-t
++ </td>
++ <td>
++ C-t
++ </td>
++ <td>
++ Follow current hyperlink in a new tab
++ </td>
++ </tr>
++ <tr>
++ <td>
++ NEXT_TAB
++ </td>
++ <td>
++ }
++ </td>
++ <td>
++ }
++ </td>
++ <td>
++ Switch to the next tab
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PREV_TAB
++ </td>
++ <td>
++ {
++ </td>
++ <td>
++ {
++ </td>
++ <td>
++ Switch to the previous tab
++ </td>
++ </tr>
++ <tr>
++ <td>
++ CLOSE_TAB
++ </td>
++ <td>
++ C-q
++ </td>
++ <td>
++ C-q
++ </td>
++ <td>
++ Close the current tab
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Searches</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ SEARCH
++ </td>
++ <td>
++ /
++ </td>
++ <td>
++ /, C-s
++ </td>
++ <td>
++ Search forward
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SEARCH_BACK
++ </td>
++ <td>
++ ?
++ </td>
++ <td>
++ </td>
++ <td>
++ Search backward
++ </td>
++ </tr>
++ <tr>
++ <td>
++ ISEARCH
++ </td>
++ <td>
++ C-s
++ </td>
++ <td>
++ </td>
++ <td>
++ Incremental search forward
++ </td>
++ </tr>
++ <tr>
++ <td>
++ ISEARCH_BACK
++ </td>
++ <td>
++ C-r
++ </td>
++ <td>
++ </td>
++ <td>
++ Incremental search backward
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SEARCH_NEXT
++ </td>
++ <td>
++ n
++ </td>
++ <td>
++ n
++ </td>
++ <td>
++ Continue search forward
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SEARCH_PREV
++ </td>
++ <td>
++ N
++ </td>
++ <td>
++ </td>
++ <td>
++ Continue search backward
++ </td>
++ </tr>
++ <tr>
++ <td>
++ WRAP_TOGGLE
++ </td>
++ <td>
++ C-w
++ </td>
++ <td>
++ w
++ </td>
++ <td>
++ Toggle wrapping mode in searches
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Mark Management</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ MARK
++ </td>
++ <td>
++ C-SPC
++ </td>
++ <td>
++ C-SPC
++ </td>
++ <td>
++ Set/unset mark
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PREV_MARK
++ </td>
++ <td>
++ M-p
++ </td>
++ <td>
++ P
++ </td>
++ <td>
++ Go to the previous mark
++ </td>
++ </tr>
++ <tr>
++ <td>
++ NEXT_MARK
++ </td>
++ <td>
++ M-n
++ </td>
++ <td>
++ N
++ </td>
++ <td>
++ Go to the next mark
++ </td>
++ </tr>
++ <tr>
++ <td>
++ REG_MARK
++ </td>
++ <td>
++ "
++ </td>
++ <td>
++ "
++ </td>
++ <td>
++ Mark all occurrences of a pattern
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Miscellaneous</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ COMMAND
++ </td>
++ <td>
++ M-c
++ </td>
++ <td>
++ M-c
++ </td>
++ <td>
++ Invoke one or more semicolon-separated w3m functions
++ </td>
++ </tr>
++<!--
++TODO: Where does this key binding M-Fn come from. I do not find a Fn-key on my keyboard. I do not know how to type in the keystroke combinations listed in keymap.default which are
++keymap M-[E MENU
++keymap M-[L MENU
++keymap M-[2~ MENU
++keymap M-[28~ MENU
++<tr>
++<td>MENU</td>
++<Td>M-Fn</Td>
++<td></td>
++<td>Pop up menu</td>
++</tr>
++-->
++ <tr>
++ <td>
++ HELP
++ </td>
++ <td>
++ H
++ </td>
++ <td>
++ H, ?
++ </td>
++ <td>
++ Show help panel
++ </td>
++ </tr>
++ <tr>
++ <td>
++ OPTIONS
++ </td>
++ <td>
++ o
++ </td>
++ <td>
++ o
++ </td>
++ <td>
++ Display options setting panel
++ </td>
++ </tr>
++<tr>
++<td>SET_OPTION</td>
++<td>M-o</td>
++<td>M-o</td>
++<td>Set option</td>
++</tr>
++<tr>
++<td>DEFINE_KEY</td>
++<td>M-k</td>
++<td>M-k</td>
++<td>Define a binding between a key stroke combination and a command</td>
++</tr>
++<tr>
++<td>MOUSE_TOGGLE</td>
++<td>m</td>
++<td>m</td>
++<td>Toggle mouse support</td>
++</tr>
++<tr>
++<td>DOWNLOAD_LIST</td>
++<td>D</td>
++<td>D</td>
++<td>Display downloads panel</td>
++</tr>
++ <tr>
++ <td>
++ COOKIE
++ </td>
++ <td>
++ C-k
++ </td>
++ <td>
++ C-k
++ </td>
++ <td>
++ Show cookie jar
++ </td>
++ </tr>
++<!--
++mh 2016-06-12 Interrupt is an alias to SUSPEND, no need to mention it here
++ <tr>
++ <td>
++ INTERRUPT
++ </td>
++ <td>
++ C-c
++ </td>
++ <td>
++ C-c
++ </td>
++ <td>
++ Interrupt
++ </td>
++ </tr>
++-->
++<tr>
++<td>UNDO</td>
++<td>(</td>
++<td>(</td>
++<td>Cancel the last cursor movement</td>
++</tr>
++<tr>
++<td>REDO</td>
++<td>)</td>
++<td>)</td>
++<td>Cancel the last undo</td>
++</tr>
++ <tr>
++ <td>
++ EXEC_SHELL <!-- is an alias of SHELL -->
++ </td>
++ <td>
++ !
++ </td>
++ <td>
++ !
++ </td>
++ <td>
++ Execute shell command
++ </td>
++ </tr>
++<tr>
++<td>DICT_WORD</td>
++<td>M-w</td>
++<td>M-w</td>
++<td>Execute dictionary command (see <a href="README.dict">README.dict</a>)</td>
++</tr>
++<tr>
++<td>DICT_WORD_AT</td>
++<td>M-W</td>
++<td>M-W</td>
++<td>Execute dictionary command for word at cursor</td>
++</tr>
++<tr>
++<td>VERSION</td>
++<td>r</td>
++<td>r</td>
++<td>Display the version of w3m</td>
++</tr>
++ <tr>
++ <td>
++ SUSPEND
++ </td>
++ <td>
++ C-z
++ </td>
++ <td>
++ C-z
++ </td>
++ <td>
++ Suspend w3m to background. (To be withdrawn with shell
++ command <span class="mono">fg</span>.)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ QUIT
++ </td>
++ <td>
++ q
++ </td>
++ <td>
++ q
++ </td>
++ <td>
++ Quit with confirmation request
++ </td>
++ </tr>
++ <tr>
++ <td>
++ EXIT
++ </td>
++ <td>
++ Q
++ </td>
++ <td>
++ Q
++ </td>
++ <td>
++ Quit at once
++ </td>
++ </tr>
++ </table>
+
+-<hr>
+-<a name="LocalCGI"></a>
+-<h2>Local CGI</h2>
+-You can run CGI scripts using w3m, without any HTTP server.
+-It means that w3m behaves like an HTTP server and activates CGI script,
+-then w3m reads the output of the script and display it. The
+-<a href="file:///$LIB/w3mbookmark?mode=panel&bmark=~/.w3m/bookmark.html&url=MANUAL.html&title=w3m+manual">bookmark registration</a>
+-and <a href="file:///$LIB/w3mhelperpanel?mode=panel">helper-app editor</a>
+-are realized as local CGI scripts.
+-Using local CGI, w3m can be used as a general purpose form interface.
+-<P>
+-For security reason, CGI scripts invoked by w3m must be in one of
+-these directories.
+-<ul>
+-<li>The directory where w3m-related files are stored
+-(typically /usr/local/lib/w3m). This directory can be referred
+-as $LIB.
+-<li>/cgi-bin/ directory. You can map /cgi-bin/ to any directory you like
+-with option setting panel (``Directory corresponds to /cgi-bin'' field).
+-You can specify multiple paths separated by `:', like
+-/usr/local/cgi-bin:/home/aito/cgi-bin. To use /cgi-bin/ directory,
+-you must use file:/cgi-bin URL as follows:
++ <p>
++ There are the following operational modes with built-in key
++ bindings for relevant functions. These bindings are not subject to
++ the DEFINE_KEY function or entries in the file keymap.
++ </p>
++
++ <table border="1" width="100%">
++ <colgroup>
++ <col width="20%">
++ <col width="40%">
++ <col width="40%">
++ </colgroup>
++ <tr>
++ <th>
++ Function<br>(internal name)
++ </th>
++ <th>Key binding
++ </th>
++ <th>
++ Description
++ </th>
++ </tr>
++ <tr>
++ <td colspan="3">
++ <h3>Menu Selection Mode</h3>
++ </td>
++ </tr>
++ <tr>
++ <td>
++ BUF:NEXT</td>
++ <td>
++ j, C-n, DOWN
++ </td>
++ <td>
++ Next item
++ </td>
++ </tr>
++ <tr>
++ <td>BUF:PREV
++ </td>
++ <td>
++ k, C-p, UP
++ </td>
++ <td>
++ Previous item
++ </td>
++ </tr>
++ <tr>
++ <td>
++ BUF:DELETE</td>
++ <td>
++ D
++ </td>
++ <td>
++ Delete item
++ </td>
++ </tr>
++ <tr>
++ <td>
++ BUF:GO
++ </td>
++ <td>
++ SPC, RET, RIGHT
++ </td>
++ <td>
++ Select item
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="3">
++ <h3>Popup Menu Mode</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++MENU:SELECT
++ </td>
++ <td>
++ SPC, RET, RIGHT</td>
++ <td>
++ Select
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:CLOSE
++ </td>
++ <td>C-c
++ </td>
++ <td>
++ Close menu
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:CANCEL
++ </td>
++ <td>
++ LEFT, BKSPC, C-h</td>
++ <td>
++ One selection step backward
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:DOWN
++ </td>
++ <td>j, C-n, DOWN
++ </td>
++ <td>
++ Move to the next item
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:UP
++ </td>
++ <td>
++ k, C-p, UP</td>
++ <td>
++ Move to the previous item
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:LINE_UP
++ </td>
++ <td>K
++ </td>
++ <td>
++ Scroll up one item
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:LINE_DOWN
++ </td>
++ <td>J
++ </td>
++ <td>
++ Scroll down one item
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:TOP
++ </td>
++ <td>C-a
++ </td>
++ <td>
++ Move to the first item
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:LAST
++ </td>
++ <td>C-e
++ </td>
++ <td>
++ Move to the final item
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:NEXT
++ </td>
++ <td>C-v, C-f
++ </td>
++ <td>Go to the next page
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:PREV
++ </td>
++ <td>ESC v, C-b
++ </td>
++ <td>
++ Go to the previous page
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:SEARCH_FORE
++ </td>
++ <td>C-s, /
++ </td>
++ <td>
++ Search forward
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:SEARCH_BACK
++ </td>
++ <td>
++ C-r, ?</td>
++ <td>
++ Search backward
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:SEARCH_NEXT
++ </td>
++ <td>
++ n</td>
++ <td>
++ Search for the next match</td>
++ </tr>
++ <tr>
++ <td>
++MENU:SEARCH_PREV
++ </td>
++ <td>
++ N</td>
++ <td>
++ Search for the previous match</td>
++ </tr>
++<!--mh 2016-06-12 Pressing C-z in menu mode (with menu active) has the same effect as in normal operation of w3m: Browser gets in the background
++ <tr>
++ <td>
++MENU:SUSPEND
++ </td>
++ <td>
++ C-z</td>
++ <td>
++ Suspend</td>
++ </tr>
++-->
++<!-- </table>-->
++ <tr>
++ <td colspan="3">
++ <h3>Line-editing Mode</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ LINEEDIT:FORWARD
++ </td>
++ <td width="100">
++ C-f, RIGHT
++ </td>
++ <td>
++ Move cursor forward
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:BACK
++ </td>
++ <td>
++ C-b, LEFT
++ </td>
++ <td>
++ Move cursor backward
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:BS
++ </td>
++ <td>
++ C-h, BKSPC
++ </td>
++ <td>
++ Delete previous character
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:DEL
++ </td>
++ <td>
++ C-d
++ </td>
++ <td>
++ Delete current character
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:KILL_AFTER
++ </td>
++ <td>
++ C-k
++ </td>
++ <td>
++ Delete everything after cursor
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:KILL_BEFORE
++ </td>
++ <td>
++ C-u
++ </td>
++ <td>
++ Delete everything before cursor
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:TOP
++ </td>
++ <td>
++ C-a
++ </td>
++ <td>
++ Move to the beginning of the line
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:BOTTOM
++ </td>
++ <td>
++ C-e
++ </td>
++ <td>
++ Move to the end of the line
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:PREV
++ </td>
++ <td>
++ C-p, UP
++ </td>
++ <td>
++ Fetch the previous string from the history list
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:NEXT
++ </td>
++ <td>
++ C-n, DOWN
++ </td>
++ <td>
++ Fetch the next string from the history list
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:COMPLETE
++ </td>
++ <td>
++ TAB, SPC
++ </td>
++ <td>
++ Try to complete filename
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:EDITOR
++ </td>
++ <td>
++ C-o
++ </td>
++ <td>
++ Edit with external editor
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:ACCEPT
++ </td>
++ <td>
++ RET
++ </td>
++ <td>
++ Accept input line
++ </td>
++ </tr>
++ </table>
++<!-- mh 2016-06-12 As it suffices to use the provided keymap file for Lynx-like keybindings and this file is listed in section FILES of man w3m (1), the following hint for getting w3m with Lynx-like key bindings has been deleted.
++ <p>
++ If w3m was compiled with <q>Lynx-like key bindings</q>, you can use
++ the following key bindings.
++ </p>
++-->
++<!-- mh 2016-06-12 Remark is obsolete as the two sets key binding are presented along within tables
++ <hr>
++ <h2 id="Key:lynx">
++ <p>
++ The Lynx-like configuration leaves keymappings unchanged in the
++ menu-selection and line-editing modes.
++ </p>
++ </h2>
++-->
++ <hr>
++ <h2 id="Mouse">
++ Mouse Operation
++ </h2>
++ <p>
++ If w3m is compiled with mouse support and you are invoking w3m
++ either from a console with GPM or from an X terminal emulator, you
++ can use the mouse for navigation (in the case of rxvt, you need to
++ set the TERM environment variable to <q>xterm</q> or <q>kterm</q>).
++ </p>
++ <p>An introduction to configure mouse actions is provided
++ with <a href="README.mouse">README.mouse</a>.
++ </p>
++ <table border="1">
++ <colgroup>
++ <col width="20%">
++ <col width="80%">
++ </colgroup>
++ <tr>
++ <th>Operation
++ </th>
++ <th>Description
++ </th>
++ </tr>
++ <tr>
++ <td>
++ left click
++ </td>
++ <td>
++<b>First:</b><br>
++Moves the cursor to the place indicated by the mouse pointer.<br>
++<b>Then:</b><br>
++Follows a hyperlink the cursor is currently located and the mouse points to.
++ </td>
++ </tr>
++ <tr>
++ <td>
++ middle click
++ </td>
++ <td>
++ Back to the previous buffer.
++ </td>
++ </tr>
++ <tr>
++ <td>
++ right click
++ </td>
++ <td>
++ Open pop-up menu. You can choose an item by clicking it.
++ </td>
++ </tr>
++ <tr>
++ <td>
++ left drag
++ </td>
++ <td>
++ Scroll document. The default behavior is to grab the document
++ and drag it. You can reverse the behavior (grab the window and
++ drag it) with the options setting panel.
++ </td>
++ </tr>
++ </table>
++ <hr>
++ <h2 id="LocalCGI">
++ Local CGI scripts
++ </h2>
++ <p>
++ You can run CGI scripts using w3m, without any HTTP server.
++ This means that w3m behaves like an HTTP server and runs the CGI
++ script, then reads the output of the script and displays it. For
++ example, the bookmark registration system and default directory
++ browser are realized as local CGI scripts. Moreover, such scripts
++ allow w3m to be used as a form interface to acquire all kinds of
++ data.
++ </p>
++ <p>
++ For security reason, CGI scripts invoked by w3m must be in one of
++ the following directories:
++ </p>
++ <ul>
++ <li>
++ The directory where w3m-related files are stored (typically
++ /usr/local/lib/w3m). This directory can be referenced as $LIB.
++ </li>
++ <li>
++ The /cgi-bin/ directory. You can map /cgi-bin/ to any directory you
++ like in the options setting panel (the <q>Directory corresponds to
++ /cgi-bin</q> field). You can specify multiple paths separated by
++ <q>:</q>, like /usr/local/cgi-bin:/home/aito/cgi-bin. It is not
++ recommended to include the current directory to this path. To use
++ a /cgi-bin/ directory, you must use a file:/cgi-bin URL as follows:
++ </li>
+ <pre>
+ w3m -o cgi_bin=/path/to/cgi-bin file:/cgi-bin/script.cgi
+ </pre>
+-It is not recommended to include current directory to this path.
+-</ul>
+-<p>
+-The CGI script can use special header `w3m-control:' to control w3m.
+-This field can take any function (see <a href="README.func">README.func</a>),
+-and the specified function is invoked after the document is displayed.
+-For example, The CGI output
++ </ul>
++ <p>
++ The CGI script can use the special header
++ <span class="mono">w3m-control:</span> to
++ control w3m. This field can take any function (see
++ <a href="README.func">README.func</a>), and the specified function
++ is invoked after the document is displayed. For example, the CGI
++ output
++ </p>
+ <pre>
+-
+ Content-Type: text/plain
+ W3m-control: BACK
+-
+ </pre>
+-will display blank page and delete that buffer immediately.
+-This is useful when you don't want to display any page after
+-the script is invoked. The next example
++ <p>
++ will display a blank page and delete that buffer immediately.
++ This is useful when you don't want to display any page after
++ the script is invoked. The next example
++ </p>
+ <pre>
+-
+ Content-Type: text/plain
+ W3m-control: DELETE_PREVBUF
+-
+ contents.....
+ </pre>
+-will override the current buffer.
+-<p>
+-One w3m-control: header have to contain only one function, but you can
+-include more than one w3m-control: lines in the HTTP header.
+-In addition, you can specify an argument to GOTO function:
++ <p>
++ will override the current buffer.
++ </p>
++ <p>
++ Each header <span class="mono">w3m-control:</span> can
++ contain only one function, but you can
++ include more than one <span class="mono">w3m-control:</span>
++ line in the HTTP header.
++ In addition, you can specify an argument to the GOTO function:
++ </p>
+ <pre>
+-
+ Content-Type: text/plain
+-W3m-control: GOTO http://www.yahoo.com/
+-
++W3m-control: GOTO http://www.example.org/
+ </pre>
+-This example works exactly the same way to the Location header:
++ <p>
++ This example works exactly the same way as the Location header:
++ </p>
+ <pre>
+-
+ Content-Type: text/plain
+-Location: http://www.yahoo.com/
+-
++Location: http://www.example.org/
+ </pre>
+-Note that this header has no effect when the CGI script is invoked
+-through HTTP server.
+-
+-</body>
++ <p>
++ Note that this header has no effect when the CGI script is invoked
++ through an HTTP server.
++ </p>
++ </body>
+ </html>
+diff --git a/doc/README b/doc/README
+index 324ea3e..60d6d19 100644
+--- a/doc/README
++++ b/doc/README
+@@ -115,7 +115,6 @@ Current Maintainer
+ Tohoku University Hospital
+ satodai@w3m.jp
+
+-Feel free to send your opinion to the w3m mailing-lists.
+- w3m-dev@sic.med.tohoku.ac.jp (Japanese)
+- w3m-dev-en@sic.med.tohoku.ac.jp (English)
++Feel free to send your opinion to:
+ http://w3m.sourceforge.net/
++ https://sourceforge.net/projects/w3m/
+diff --git a/doc/README.cookie b/doc/README.cookie
+index 56cca50..da16947 100644
+--- a/doc/README.cookie
++++ b/doc/README.cookie
+@@ -37,7 +37,7 @@ cookie support of w3m
+ (HDN: host domain name)
+
+
+- ¡¦ If the number of "." in domain name is lesser than 2, it is
++ * If the number of "." in domain name is lesser than 2, it is
+ assumed as invalid cookie (cf. RFC 2109 4.3.2), however, you can
+ use cookie_avoid_wrong_number_of_dots to avoid this
+ restriction. You can set this in "Domains to avoid [wrong number
+diff --git a/doc/README.func b/doc/README.func
+index 0b2c034..a3ef3ac 100644
+--- a/doc/README.func
++++ b/doc/README.func
+@@ -1,145 +1,146 @@
+-ABORT Quit w3m without confirmation
+-ACCESSSKEY Popup acceskey menu
+-ADD_BOOKMARK Add current page to bookmark
++ABORT Quit at once
++ACCESSKEY Pop up accesskey menu
++ADD_BOOKMARK Add current page to bookmarks
+ ALARM Set alarm
+-BACK Back to previous buffer
++BACK Close current buffer and return to the one below in stack
+ BEGIN Go to the first line
+-BOOKMARK Read bookmark
+-CENTER_H Move to the center line
+-CENTER_V Move to the center column
+-CHARSET Change the current document charset
+-CLOSE_TAB Close current tab
+-CLOSE_TAB_MOUSE Close tab on mouse cursor (for mouse action)
+-COMMAND Execute w3m command(s)
++BOOKMARK View bookmarks
++CENTER_H Center on cursor column
++CENTER_V Center on cursor line
++CHARSET Change the character encoding for the current document
++CLOSE_TAB Close tab
++CLOSE_TAB_MOUSE Close tab at mouse pointer
++COMMAND Invoke w3m function(s)
+ COOKIE View cookie list
+-DEFAULT_CHARSET Change the default document charset
+-DEFINE_KEY Define a binding between a key stroke and a user command
+-DELETE_PREVBUF Delete previous buffer (mainly for local-CGI)
++DEFAULT_CHARSET Change the default character encoding
++DEFINE_KEY Define a binding between a key stroke combination and a command
++DELETE_PREVBUF Delete previous buffer (mainly for local CGI-scripts)
+ DICT_WORD Execute dictionary command (see README.dict)
+-DICT_WORD_AT Execute dictionary command for word at cursor
++DICT_WORD_AT Execute dictionary command for word at cursor
+ DISPLAY_IMAGE Restart loading and drawing of images
+-DOWN Scroll down one line
+-DOWNLOAD Save document source to file
+-DOWNLOAD_LIST Display download list panel
+-EDIT Edit current document
+-EDIT_SCREEN Edit currently rendered document
++DOWN Scroll the screen down one line
++DOWNLOAD Save document source
++DOWNLOAD_LIST Display downloads panel
++EDIT Edit local source
++EDIT_SCREEN Edit rendered copy of document
+ END Go to the last line
+-EXEC_SHELL Execute shell command
+-EXIT Quit w3m without confirmation
+-EXTERN Execute external browser
+-EXTERN_LINK View current link using external browser
+-FRAME Render frame
+-GOTO Go to URL
+-GOTO_LINE Go to specified line
+-GOTO_LINK Go to current link
+-GOTO_RELATIVE Go to relative URL
+-HELP View help
+-HISTORY View history of URL
+-INFO View info of current document
+-INTERRUPT Stop loading document
+-INIT_MAILCAP Reread mailcap (mainly for local-CGI)
+-ISEARCH Incremental search forward
++EXEC_SHELL Execute shell command and display output
++EXIT Quit at once
++EXTERN Display using an external browser
++EXTERN_LINK Display target using an external browser
++FRAME Toggle rendering HTML frames
++GOTO Open specified document in a new buffer
++GOTO_LINE Go to the specified line
++GOTO_LINK Follow current hyperlink in a new buffer
++GOTO_RELATIVE Go to relative address
++HELP Show help panel
++HISTORY Show browsing history
++INFO Display information about the current document
++INTERRUPT Suspend w3m to background
++ISEARCH Incremental search forward
+ ISEARCH_BACK Incremental search backward
+-LEFT Shift screen one column
+-LINE_BEGIN Go to the beginning of line
+-LINE_END Go to the end of line
+-LINE_INFO Show current line number
+-LINK_BEGIN Go to the first link
+-LINK_END Go to the last link
+-LINK_MENU Popup link element menu
+-LIST Show all links and images
+-LIST_MENU Popup link list menu and go to selected link
+-LOAD Load local file
+-MAIN_MENU Popup menu
++LEFT Shift screen one column left
++LINE_BEGIN Go to the beginning of the line
++LINE_END Go to the end of the line
++LINE_INFO Display current position in document
++LINK_BEGIN Move to the first hyperlink
++LINK_END Move to the last hyperlink
++LINK_MENU Pop up link element menu
++LIST Show all URLs referenced
++LIST_MENU Pop up menu for hyperlinks to browse to
++LOAD Open local file in a new buffer
++MAIN_MENU Pop up menu
+ MARK Set/unset mark
+-MARK_MID Mark Message-ID-like strings as anchors
+-MARK_URL Mark URL-like strings as anchors
+-MARK_WORD Mark current word as anchor
+-MENU Popup menu
+-MENU_MOUSE Popup menu at mouse cursor (for mouse action)
+-MOUSE_TOGGLE Toggle activity of mouse
+-MOVE_DOWN Move cursor down (a half screen scroll at the end of screen)
+-MOVE_DOWN1 Move cursor down (1 line scroll at the end of screen)
+-MOVE_LEFT Move cursor left (a half screen shift at the left edge)
+-MOVE_LEFT1 Move cursor left (1 columns shift at the left edge)
+-MOVE_LIST_MENU Popup link list menu and move cursor to selected link
+-MOVE_MOUSE Move cursor to mouse cursor (for mouse action)
+-MOVE_RIGHT Move cursor right (a half screen shift at the right edge)
+-MOVE_RIGHT1 Move cursor right (1 columns shift at the right edge)
+-MOVE_UP Move cursor up (a half screen scroll at the top of screen)
+-MOVE_UP1 Move cursor up (1 line scrol at the top of screen)
+-MSGS Display error messages
+-NEW_TAB Open new tab
+-NEXT Move to next buffer
+-NEXT_DOWN Move to next downward link
+-NEXT_LEFT Move to next left link
+-NEXT_LEFT_UP Move to next left (or upward) link
+-NEXT_LINK Move to next link
+-NEXT_MARK Move to next word
+-NEXT_PAGE Move to next page
+-NEXT_RIGHT Move to next right link
+-NEXT_RIGHT_DOWN Move to next right (or downward) link
+-NEXT_TAB Move to next tab
+-NEXT_UP Move to next upward link
+-NEXT_VISITED Move to next visited link
+-NEXT_WORD Move to next word
+-NOTHING Do nothing
++MARK_MID Turn Message-ID-like strings into hyperlinks
++MARK_URL Turn URL-like strings into hyperlinks
++MARK_WORD Turn current word into hyperlink
++MENU Pop up menu
++MENU_MOUSE Pop up menu at mouse pointer
++MOUSE_TOGGLE Toggle mouse support
++MOVE_DOWN Cursor down
++MOVE_DOWN1 Cursor down. With edge touched, slide
++MOVE_LEFT Cursor left
++MOVE_LEFT1 Cursor left. With edge touched, slide
++MOVE_LIST_MENU Pop up menu to navigate between hyperlinks
++MOVE_MOUSE Move cursor to mouse pointer
++MOVE_RIGHT Cursor right
++MOVE_RIGHT1 Cursor right. With edge touched, slide
++MOVE_UP Cursor up
++MOVE_UP1 Cursor up. With edge touched, slide
++MSGS Display error messages
++NEW_TAB Open a new tab (with current document)
++NEXT Switch to the next buffer
++NEXT_DOWN Move downward to the next hyperlink
++NEXT_HALF_PAGE Scroll down half a page
++NEXT_LEFT Move left to the next hyperlink
++NEXT_LEFT_UP Move left or upward to the next hyperlink
++NEXT_LINK Move to the next hyperlink
++NEXT_MARK Go to the next mark
++NEXT_PAGE Scroll down one page
++NEXT_RIGHT Move right to the next hyperlink
++NEXT_RIGHT_DOWN Move right or downward to the next hyperlink
++NEXT_TAB Switch to the next tab
++NEXT_UP Move upward to the next hyperlink
++NEXT_VISITED Move to the next visited hyperlink
++NEXT_WORD Move to the next word
++NOTHING Do nothing
+ NULL Do nothing
+-OPTIONS Option setting panel
+-PEEK Peek current URL
+-PEEK_IMG Peek image URL
+-PEEK_LINK Peek link URL
+-PIPE_BUF Send rendered document to pipe
+-PIPE_SHELL Execute shell command and browse
+-PREV Move to previous buffer
+-PREV_LINK Move to previous link
+-PREV_MARK Move to previous mark
+-PREV_PAGE Move to previous page
+-PREV_TAB Move to previous tab
+-PREV_VISITED Move to previous visited link
+-PREV_WORD Move to previous word
+-PRINT Save buffer to file
+-QUIT Quit w3m
+-READ_SHELL Execute shell command and load
++OPTIONS Display options setting panel
++PEEK Show current address
++PEEK_IMG Show image address
++PEEK_LINK Show target address
++PIPE_BUF Pipe current buffer through a shell command and display output
++PIPE_SHELL Execute shell command and display output
++PREV Switch to the previous buffer
++PREV_HALF_PAGE Scroll up half a page
++PREV_LINK Move to the previous hyperlink
++PREV_MARK Go to the previous mark
++PREV_PAGE Scroll up one page
++PREV_TAB Switch to the previous tab
++PREV_VISITED Move to the previous visited hyperlink
++PREV_WORD Move to the previous word
++PRINT Save rendered document
++QUIT Quit with confirmation request
++READ_SHELL Execute shell command and display output
+ REDO Cancel the last undo
+-REDRAW Redraw screen
+-REG_MARK Set mark using regexp
+-REINIT Reload configuration files
+-RELOAD Reload buffer
+-RESHAPE Re-render buffer
++REDRAW Draw the screen anew
++REG_MARK Mark all occurences of a pattern
++REINIT Reload configuration file
++RELOAD Load current document anew
++RESHAPE Re-render document
+ RIGHT Shift screen one column right
+-SAVE Save document source to file
+-SAVE_IMAGE Save image to file
+-SAVE_LINK Save link to file
+-SAVE_SCREEN Save rendered document to file
++SAVE Save document source
++SAVE_IMAGE Save inline image
++SAVE_LINK Save hyperlink target
++SAVE_SCREEN Save rendered document
+ SEARCH Search forward
+ SEARCH_BACK Search backward
+ SEARCH_FORE Search forward
+-SEARCH_NEXT Search next regexp
+-SEARCH_PREV Search previous regexp
+-SELECT Go to buffer selection panel
+-SELECT_MENU Popup buffer selection menu
+-SETENV Set environment variable
+-SET_OPTION Set option
+-SHELL Execute shell command
++SEARCH_NEXT Continue search forward
++SEARCH_PREV Continue search backward
++SELECT Display buffer-stack panel
++SELECT_MENU Pop up buffer-stack menu
++SETENV Set environment variable
++SET_OPTION Set option
++SHELL Execute shell command and display output
+ SHIFT_LEFT Shift screen left
+ SHIFT_RIGHT Shift screen right
+-SOURCE View HTML source
++SOURCE Toggle between HTML shown or processed
+ STOP_IMAGE Stop loading and drawing of images
+ SUBMIT Submit form
+-SUSPEND Stop loading document
+-TAB_GOTO Open URL on new tab
+-TAB_GOTO_RELATIVE Open relative URL on new tab
+-TAB_LEFT Move current tab left
+-TAB_LINK Open current link on new tab
+-TAB_MENU Popup tab selection menu
+-TAB_MOUSE Move to tab on mouse cursor (for mouse action)
+-TAB_RIGHT Move current tab right
++SUSPEND Suspend w3m to background
++TAB_GOTO Open specified document in a new tab
++TAB_GOTO_RELATIVE Open relative address in a new tab
++TAB_LEFT Move left along the tab bar
++TAB_LINK Follow current hyperlink in a new tab
++TAB_MENU Pop up tab selection menu
++TAB_MOUSE Select tab by mouse action
++TAB_RIGHT Move right along the tab bar
+ UNDO Cancel the last cursor movement
+-UP Scroll up one line
+-VERSION Display version of w3m
+-VIEW View HTML source
+-VIEW_BOOKMARK View bookmark
+-VIEW_IMAGE View image
+-WHEREIS Search forward
+-WRAP_TOGGLE Toggle wrap search mode
++UP Scroll the screen up one line
++VERSION Display the version of w3m
++VIEW Toggle between HTML shown or processed
++VIEW_BOOKMARK View bookmarks
++VIEW_IMAGE Display image in viewer
++WHEREIS Search forward
++WRAP_TOGGLE Toggle wrapping mode in searches
+diff --git a/doc/README.img b/doc/README.img
+index 0c10114..f11362f 100644
+--- a/doc/README.img
++++ b/doc/README.img
+@@ -41,7 +41,7 @@ Key functions
+ Specify the following keymaps in ~/.w3m/keymap.
+ keymap X DISPLAY_IMAGE
+ keymap C-c STOP_IMAGE
+- keyamp t SET_OPTION display_image=toggle
++ keymap t SET_OPTION display_image=toggle
+
+ Commandline options
+
+diff --git a/doc/README.m17n b/doc/README.m17n
+index c064d76..da5408b 100644
+--- a/doc/README.m17n
++++ b/doc/README.m17n
+@@ -49,7 +49,7 @@ Supported encoding schemes (character set)
+ * Thai
+ TIS-620 (ISO-8859-11), CP874
+ * Other
+- US_ASCII, ISO-8859-1 ¡Á 10, 13 ¡Á 15,
++ US_ASCII, ISO-8859-1 - 10, 13 - 15,
+ KOI8-R, KOI8-U, NeXT, CP437, CP737, CP775, CP850, CP852, CP855, CP856,
+ CP857, CP860, CP861, CP862, CP863, CP864, CP865, CP866, CP869, CP1006,
+ CP1250, CP1251, CP1252, CP1253, CP1254, CP1255, CP1256, CP1257
+diff --git a/doc/README.siteconf b/doc/README.siteconf
+new file mode 100644
+index 0000000..39b1028
+--- /dev/null
++++ b/doc/README.siteconf
+@@ -0,0 +1,60 @@
++The siteconf: Site-specific preferences
++
++The siteconf consists of URL patterns and preferences associated to them.
++You can improve "decode_url" feature by giving charsets of URLs site by site,
++or bypass Google's redirector for performance and your privacy.
++
++The siteconf is read from ~/.w3m/siteconf by default.
++
++===== The syntax =====
++
++url <url>|/<re-url>/|m@<re-url>@i [exact]
++substitute_url "<destination-url>"
++url_charset <charset>
++no_referer_from on|off
++no_referer_to on|off
++
++The last match wins.
++
++===== Examples =====
++
++url "https://twitter.com/"
++substitute_url "https://mobile.twitter.com/"
++
++This forwards the twitter.com to its mobile site.
++
++url "http://your.bookmark.net/"
++no_referer_from on
++
++This prevents HTTP referers from being sent when you follow links
++at the your.bookmark.net.
++
++url "http://www.google.com/url?" exact
++substitute_url "file:///cgi-bin/your-redirector.cgi?"
++
++This forwards the Google's redirector to your local CGI.
++
++url /^http:\/\/[a-z]*\.wikipedia\.org\//
++url_charset utf-8
++
++When combinated with "decode_url" option turned on, links to
++Wikipedia will be human-readable.
++
++===== Regular expressions notes =====
++
++Following expressions are all equivalent:
++
++/http:\/\/www\.example\.com\//
++m/http:\/\/www\.example\.com\//
++m@http://www\.example\.com/@
++m!http://www\.example\.com/!
++
++With a trailing 'i' modifier, you can specify a case-insensitive match.
++For example, m@^http://www\.example\.com/abc/@i matches to:
++
++http://www.example.com/abc/
++http://www.example.com/Abc/
++http://www.example.com/ABC/
++
++Hostnames, however, are always converted to lowercases before compared.
++
+diff --git a/doc/README.sixel b/doc/README.sixel
+new file mode 100644
+index 0000000..588afc4
+--- /dev/null
++++ b/doc/README.sixel
+@@ -0,0 +1,27 @@
++Sixel support of w3m
++ 2014/11/05
++ K. Araki
++
++Introduction
++
++ This is the extension for w3m to show inline images by sixel graphics.
++
++Requirements
++
++ Install 'img2sixel' command provided by libsixel project.
++ (https://github.com/saitoha/libsixel)
++
++Build
++
++ $ ./configure --enable-image ...
++ $ make
++ $ make install
++
++Usage
++
++ $ w3m -sixel http://...
++
++ You can specify options of 'img2sixel' command by "W3M_IMG2SIXEL"
++ environmental variable.
++
++ $ W3M_IMG2SIXEL="img2sixel -d atkinson" w3m -sixel http://...
+diff --git a/doc/keymap.lynx b/doc/keymap.lynx
+index 869c716..e4085c8 100644
+--- a/doc/keymap.lynx
++++ b/doc/keymap.lynx
+@@ -46,7 +46,7 @@ keymap - PREV_PAGE
+ keymap . RIGHT
+ keymap / SEARCH
+ keymap : MARK_URL
+-keymap ; MARK_WORD
++keymap ";" MARK_WORD
+ keymap < SHIFT_LEFT
+ keymap = INFO
+ keymap > SHIFT_RIGHT
+diff --git a/doc/menu.submenu b/doc/menu.submenu
+index e55193d..e837f46 100644
+--- a/doc/menu.submenu
++++ b/doc/menu.submenu
+@@ -39,6 +39,6 @@ menu Link
+ end
+
+ menu Bookmark
+- func "Read bookmark (b)" BOOKMARK "bB"
++ func "View bookmarks (b)" BOOKMARK "bB"
+ func "Add page to bookmark(a)" ADD_BOOKMARK "aA"
+ end
+diff --git a/doc/w3m.1 b/doc/w3m.1
+index 8f071c6..90488f3 100644
+--- a/doc/w3m.1
++++ b/doc/w3m.1
+@@ -1,13 +1,10 @@
+ .nr N -1
+ .nr D 5
+-.TH W3M 1 Local
+-.UC 4
++.TH W3M 1 "2016-08-06" "w3m 0.5.3"
+ .SH NAME
+-w3m \- a text based Web browser and pager
++w3m \- a text based web browser and pager
+ .SH SYNOPSIS
+-.B w3m
+-[options] [URL or filename]
+-.PP
++w3m [OPTION]... [ \fIfile\fP | \fIURL\fP ]...
+ .SH DESCRIPTION
+ .\" This defines appropriate quote strings for nroff and troff
+ .ds lq \&"
+@@ -17,234 +14,283 @@ w3m \- a text based Web browser and pager
+ .\" Just in case these number registers aren't set yet...
+ .if \nN==0 .nr N 10
+ .if \nD==0 .nr D 5
+-.I
+-w3m
+-is a World Wide Web (WWW) text based client. It has English and
+-Japanese help files and an option menu and can be configured to
+-use either language. It will display hypertext markup language
+-(HTML) documents containing links to files residing on the local
+-system, as well as files residing on remote systems. It can
+-display HTML tables and frames.
+-In addition, it can be used as a "pager" in much the same manner
+-as "more" or "less".
+-Current versions of
+-.I
+-w3m
+-run on
+-Unix (Solaris, SunOS, HP-UX, Linux, FreeBSD, and EWS4800)
+-and on
+-Microsoft Windows 9x/NT.
+-.PP
++
++\fIw3m\fP is a text based browser which can display local or remote
++web pages as well as other documents. It is able to process HTML
++tables and frames but it ignores JavaScript and Cascading Style
++Sheets. \fIw3m\fP can also serve as a pager for text files named as
++arguments or passed on standard input, and as a general purpose
++directory browser.
++
++\fIw3m\fP organizes its content in buffers or tabs, allowing easy
++navigation between them. With the w3m-img extension installed, \fIw3m\fP can
++display inline graphics in web pages. And whenever \fIw3m\fP's HTML
++rendering capabilities do not meet your needs, the target URL can be
++handed over to a graphical browser with a single command.
++
++For help with runtime options, press \(lqH\(rq while running \fIw3m\fP.
++
++.SH ARGUMENTS
++
++When given one or more command line arguments, \fIw3m\fP will handle
++targets according to content type. For web, \fIw3m\fP gets this
++information from HTTP headers; for relative or absolute file system
++paths, it relies on filenames.
++
++With no argument, \fIw3m\fP expects data from standard input and
++assumes \(lqtext/plain\(rq unless another MIME type is given by the user.
++
++If provided with no target and no fallback target (see for instance
++option \fB\-v\fP below), \fIw3m\fP will exit with usage information.
+ .SH OPTIONS
+-At start up, \fIw3m\fR will load any local
+-file or remote URL specified at the command
+-line. For help with runtime options, press \fB"H"\fR
+-while running \fIw3m\fR.
+-Command line options are:
+-.PP
++Command line options are introduced with a single \(lq\-\(rq character and
++may take an argument.
++.SS General options
+ .TP
+-.B -t tab
+-set tab width
++\fB\-B\fP
++with no other target defined, use the bookmark page for startup
+ .TP
+-.B -r
+-ignore backspace effect
+-.TP
+-.B -l line
+-# of preserved line (default 10000)
+-.TP
+-.B -I charset
+-document charset
+-.TP
+-.B -O charset
+-display/output charset
++\fB\-M\fP
++monochrome display
+ .TP
+-.B -B
+-load bookmark
++\fB\-no-mouse\fP
++deactivate mouse support
+ .TP
+-.B -bookmark file
+-specify bookmark file
++\fB\-num\fP
++display each line's number
+ .TP
+-.B -T type
+-specify content-type
++\fB\-N\fP
++distribute multiple command line arguments to tabs. By default, a
++stack of buffers is used
++.TP
++\fB\-ppc \fInum\fR
++width of \fInum\fR pixels per character. Range of 4.0 to 32.0, default 8.0.
++Larger values will make tables narrower. (Implementation not verified)
+ .TP
+-.B -m
+-internet message mode
++\fB\-ppl \fInum\fR
++height of \fInum\fR pixels per line. Range of 4.0 to 64.0. (Implementation not verified)
+ .TP
+-.B -v
+-visual startup mode
++\fB\-title\fP, \fB\-title=TERM\fP
++use the buffer name as terminal title string. With specified TERM,
++this sets the title configuration style accordingly
+ .TP
+-.B -M
+-monochrome display
++\fB\-v\fP
++with no other target defined, welcome users with a built-in page
+ .TP
+-.B -N
+-open URL of command line on each new tab
++\fB\-W\fP
++toggle wrapping mode in searches
+ .TP
+-.B -F
+-automatically render frame
++\fB\-X\fP
++do not initialize/deinitialize the terminal
+ .TP
+-.B -dump
+-dump formatted page into stdout
++\fB+\fInum\fR
++go to line \fInum\fR; only effective for \fInum\fR larger than the number of lines in the terminal
++.SS Browser options
+ .TP
+-.B -cols width
+-specify column width (used with -dump)
++\fB\-cols \fInum\fR
++with stdout as destination; HTML is rendered to lines of \fInum\fR characters
+ .TP
+-.B -ppc count
+-specify the number of pixels per character (4.0...32.0).
+-Larger values will make tables narrower. [default 8.0]
++\fB\-cookie\fP, \fB\-no-cookie\fP
++use stored cookies and accept new ones, or do neither
+ .TP
+-.B -ppl count
+-specify the number of pixels per line (4.0...64.0)
++\fB\-F\fP
++render frames
+ .TP
+-.B -dump_source
+-dump page source into stdout
++\fB\-graph\fP, \fB\-no-graph\fP
++use or do not use graphic characters for drawing HTML table and frame borders
+ .TP
+-.B -dump_head
+-dump response of HEAD request into stdout
++\fB\-header \fIstring\fR
++append \fIstring\fR to the HTTP(S) request. Expected to match the header syntax \f(CWVariable: Value\fP
+ .TP
+-.B -dump_both
+-dump HEAD and source into stdout
++\fB\-m\fP
++Render the body of Usenet messages according to the header \(lqContent-type\(rq
+ .TP
+-.B -dump_extra
+-dump HEAD, source, and extra information into stdout
++\fB\-no-proxy\fP
++do not use proxy
+ .TP
+-.B -post file
+-use POST method with file content
++\fB\-post \fIfile\fR
++use POST method to upload data defined in \fIfile\fR. The syntax to be used
++is \f(CWvar1=value1[&var2=value2]...\fP
+ .TP
+-.B -header string
+-insert string as a header
++\fB\-4\fP
++IPv4 only. Corresponds to dns_order=4 in configuration files
+ .TP
+-.B +<num>
+-goto <num> line
++\fB\-6\fP
++IPv6 only. Corresponds to dns_order=6 in configuration files
++.SS Text pager options
+ .TP
+-.B -num
+-show line number
++\fB\-l \fInum\fR
++number of lines preserved internally when receiving plain text from
++stdin (default 10,000)
+ .TP
+-.B -no-proxy
+-don't use proxy
++\fB\-r\fP
++use caret notation to display special escape characters (such
++as ANSI escapes or nroff-style backspaces for bold and underlined
++characters) instead of processing them
+ .TP
+-.B -4
+-IPv4 only (-o dns_order=4)
++\fB\-s\fP
++squeeze multiple blank lines into one
+ .TP
+-.B -6
+-IPv6 only (-o dns_order=6)
++\fB\-t\fP \fInum\fP
++set tab width to \fInum\fR columns. No effect on stdout
++.SS Data type/encoding options
+ .TP
+-.B -no-mouse
+-don't use mouse
++\fB\-I \fIcharset\fR
++user defined character encoding of input data
+ .TP
+-.B -cookie
+-use cookie.
++\fB\-O \fIcharset\fR
++user defined character encoding of output data
+ .TP
+-.B -no-cookie
+-don't use cookie
++\fB\-T \fItype\fR
++explicit characterization of input data by MIME type
++.SS Options for data output, followed by immediate exit
+ .TP
+-.B -graph
+-use graphic character
++\fB\-dump\fP
++dump rendered page into stdout. Set implicitly when output is directed
++to a file or pipe
+ .TP
+-.B -no-graph
+-don't use graphic character
++\fB\-dump_source\fP
++dump the page's source code into stdout
+ .TP
+-.B -S
+-squeeze multiple blank lines
++\fB\-dump_head\fP
++dump response of a HEAD request for a URL into stdout
+ .TP
+-.B -W
+-toggle wrap search mode
++\fB\-dump_both\fP
++dump HEAD, and source code for a URL into stdout
+ .TP
+-.B -X
+-don't use termcap init/deinit
++\fB\-dump_extra\fP
++dump HEAD, source code, and extra information for a URL into stdout
+ .TP
+-.B -title [=TERM]
+-set buffer name to terminal title string.
+-If TERM is specified, use the TERM style title configuration.
++\fB\-help\fP
++show a summary of compiled-in features and command line options
+ .TP
+-.B -o opt=value
+-assign value to config option
++\fB\-show-option\fP
++show all available configuration options
+ .TP
+-.B -show-option
+-show all available config option
++\fB\-version\fP
++show the version of \fIw3m\fP
++.SS Options for overriding default settings and resources
+ .TP
+-.B -config file
+-specify config file
++\fB\-bookmark \fIfile\fR
++use \fIfile\fR instead of the default bookmark.html file
+ .TP
+-.B -help
+-show usage
++\fB\-config \fIfile\fR
++use \fIfile\fR instead of the default configuration file
+ .TP
+-.B -version
+-show w3m version
++\fB\-debug\fP
++DO NOT USE
+ .TP
+-.B -reqlog
+-write request logfile
++\fB\-o \fIoption=value\fR
++modify one configuration item with an explicitly given value; without \fIoption=value\fR, equivalent to \fB-show-option\fR
+ .TP
+-.B -debug
+-DO NOT USE
++\fB\-reqlog\fP
++log headers of HTTP communication in file \f(CW~/.w3m/request.log\fP
+ .SH EXAMPLES
++.SS Pager-like usage
++.TP
++Combine snippets of HTML code and preview the page
++.EX
++$ cat header.html footer.html | w3m -T text/html
++.EE
++.TP
++Compare two files using tabs
++.EX
++$ w3m -N config.old config
++.EE
++.SS Browser-like usage
++.TP
++Display web content in monochrome terminal
++.EX
++$ w3m -M http://w3m.sourceforge.net
++.EE
++.TP
++Display embedded graphics
++.EX
++$ w3m -o auto_image=TRUE http://w3m.sourceforge.net
++.EE
++.TP
++Display content from Usenet
++.EX
++$ w3m -m nntp://news.aioe.org/comp.os.linux.networking
++.EE
++.TP
++Upload data for a URL using the POST method
++.EX
++$ w3m -post - http://example.com/form.php <<<'a=0&b=1'
++.EE
++.SS Filter-like usage
++.TP
++Convert an HTML file to plain text with a defined line length
++.EX
++$ w3m -cols 40 foo.html > foo.txt
++.EE
++.TP
++Output the bookmarks page as text with an appended list of links
++.EX
++$ w3m -B -o display_link_number=1 > out.txt
++.EE
++.TP
++Conversion of file format and character encoding
++.EX
++$ w3m -T text/html -I EUC-JP -O UTF-8 < foo.html > foo.txt
++.EE
++.SS Start with no input
++.TP
++Welcome users with a built-in page
++.EX
++$ w3m -v
++.EE
++.\".SH Errors
++.SH ENVIRONMENT
++\fIw3m\fP recognises the environment variable WWW_HOME as defining a
++fallback target for use if it is invoked without one.
++.SH FILES
+ .TP
+-To use w3m as a pager:
+-.br
+-$ ls | w3m
+-.br
+-.TP
+-To use w3m to translate HTML files:
+-.br
+-$ cat foo.html | w3m -T text/html
++\f(CW~/.w3m/bookmark.html\fP
++default bookmark file
+ .TP
+-or
+-.br
+-$ cat foo.html | w3m -dump -T text/html >foo.txt
+-.SH FILES
++\f(CW~/.w3m/config\fP
++user defined configuration file; overrides \f(CW/etc/w3m/config\fP
+ .TP
+-.I ${HOME}/.w3m/config
+-configuration file
++\f(CW~/.w3m/cookie\fP
++cookie jar; written on exit, read on launch
+ .TP
+-.I ${HOME}/.w3m/keymap
+-key binding configuration file
+-.\" .TP
+-.\" .I ${HOME}/.w3m/menu
+-.\" ???
++\f(CW~/.w3m/history\fP
++browser history - visited files and URLs
+ .TP
+-.I ${HOME}/.w3m/mouse
+-mouse configuration file
++\f(CW~/.w3m/keymap\fP
++user defined key bindings; overrides default key bindings
+ .TP
+-.I ${HOME}/.w3m/cookie
+-cookie file
++\f(CW~/.w3m/mailcap\fP
++external viewer configuration file
+ .TP
+-.I ${HOME}/.w3m/history
+-history file
++\f(CW~/.w3m/menu\fP
++user defined menu; overrides default menu
+ .TP
+-.I ${HOME}/.w3m/passwd
+-passowrd and username file
++\f(CW~/.w3m/mime.types\fP
++MIME types file
+ .TP
+-.I ${HOME}/.w3m/pre_form
+-form parameters file
++\f(CW~/.w3m/mouse\fP
++user defined mouse settings
+ .TP
+-.I ${HOME}/.w3m/mailcap
+-external viewer configuration file
++\f(CW~/.w3m/passwd\fP
++password and username file
+ .TP
+-.I ${HOME}/.w3m/mime.types
+-MIME types file
++\f(CW~/.w3m/pre_form\fP
++contains predefined values to fill recurrent HTML forms
+ .\" .TP
+-.\" .I ${HOME}/.w3m/urimethodmap
++.\" .I $~/.w3m/urimethodmap
+ .\" ???
+-.SH NOTES
+-This is the
+-.I
+-w3m
+-0.5.3 Release.
+-.PP
+-Please see the MANUAL.html file distributed with w3m for
+-more detailed documentation.
+-
+-Additional information about
+-.I
+-w3m
+-may be found on its Japanese language Web site located at:
+- http://w3m.sourceforge.net/index.ja.html
+-.br
+-or on its English version of the site at:
+- http://w3m.sourceforge.net/index.en.html
++.SH SEE ALSO
++README and example files are to be found in the doc directory of your \fIw3m\fP installation. Recent information about \fIw3m\fP may be found on
++.UR http://w3m.sourceforge.net
++the project's web pages at
++.UE
+ .SH ACKNOWLEDGMENTS
+-.I
+-w3m
+-has incorporated code from several sources.
++\fIw3m\fP has incorporated code from several sources.
+ Users have contributed patches and suggestions over time.
+ .SH AUTHOR
+-Akinori ITO <aito@fw.ipsj.or.jp>
++.UR aito@fw.ipsj.or.jp
++Akinori ITO
++.UE
++
+diff --git a/entity.c b/entity.c
+index fdd8f64..45dc95e 100644
+--- a/entity.c
++++ b/entity.c
+@@ -44,6 +44,8 @@ conv_entity(unsigned int c)
+ return " ";
+ if (c == 0xa0)
+ return NBSP;
++ if (c == 0xad) /* SOFT HYPHEN */
++ return "";
+ if (c < 0x100) { /* Latin1 (ISO 8859-1) */
+ if (UseAltEntity)
+ return alt_latin1[c - 0xa0];
+diff --git a/etc.c b/etc.c
+index 8fe1215..dcc6edd 100644
+--- a/etc.c
++++ b/etc.c
+@@ -1365,7 +1365,13 @@ setup_child(int child, int i, int f)
+ if (!child)
+ SETPGRP();
+ #endif /* __MINGW32_VERSION */
++ /*
++ * I don't know why but close_tty() sometimes interrupts loadGeneralFile() in loadImage()
++ * and corrupt image data can be cached in ~/.w3m.
++ */
++#if 0
+ close_tty();
++#endif
+ close_all_fds_except(i, f);
+ QuietMessage = TRUE;
+ fmInitialized = FALSE;
+diff --git a/file.c b/file.c
+index 567d41e..b66f8c8 100644
+--- a/file.c
++++ b/file.c
+@@ -26,6 +26,8 @@
+ #define min(a,b) ((a) > (b) ? (b) : (a))
+ #endif /* not min */
+
++#define MAX_INPUT_SIZE 80 /* TODO - max should be screen line length */
++
+ static int frame_source = 0;
+
+ static char *guess_filename(char *file);
+@@ -47,11 +49,11 @@ static JMP_BUF AbortLoading;
+ static struct table *tables[MAX_TABLE];
+ static struct table_mode table_mode[MAX_TABLE];
+
+-#ifdef USE_IMAGE
++#if defined(USE_M17N) || defined(USE_IMAGE)
+ static ParsedURL *cur_baseURL = NULL;
+-#ifdef USE_M17N
+-static char cur_document_charset;
+ #endif
++#ifdef USE_M17N
++static wc_ces cur_document_charset = 0;
+ #endif
+
+ static Str cur_title;
+@@ -67,7 +69,7 @@ static int cur_status;
+ #ifdef MENU_SELECT
+ /* menu based <select> */
+ FormSelectOption *select_option;
+-static int max_select = MAX_SELECT;
++int max_select = MAX_SELECT;
+ static int n_select;
+ static int cur_option_maxwidth;
+ #endif /* MENU_SELECT */
+@@ -79,7 +81,7 @@ static int cur_textarea_rows;
+ static int cur_textarea_readonly;
+ static int n_textarea;
+ static int ignore_nl_textarea;
+-static int max_textarea = MAX_TEXTAREA;
++int max_textarea = MAX_TEXTAREA;
+
+ static int http_response_code;
+
+@@ -215,7 +217,6 @@ currentLn(Buffer *buf)
+
+ static Buffer *
+ loadSomething(URLFile *f,
+- char *path,
+ Buffer *(*loadproc) (URLFile *, Buffer *), Buffer *defaultbuf)
+ {
+ Buffer *buf;
+@@ -223,17 +224,23 @@ loadSomething(URLFile *f,
+ if ((buf = loadproc(f, defaultbuf)) == NULL)
+ return NULL;
+
+- buf->filename = path;
+ if (buf->buffername == NULL || buf->buffername[0] == '\0') {
+ buf->buffername = checkHeader(buf, "Subject:");
+- if (buf->buffername == NULL)
+- buf->buffername = conv_from_system(lastFileName(path));
++ if (buf->buffername == NULL && buf->filename != NULL)
++ buf->buffername = conv_from_system(lastFileName(buf->filename));
+ }
+ if (buf->currentURL.scheme == SCM_UNKNOWN)
+ buf->currentURL.scheme = f->scheme;
+- buf->real_scheme = f->scheme;
+ if (f->scheme == SCM_LOCAL && buf->sourcefile == NULL)
+- buf->sourcefile = path;
++ buf->sourcefile = buf->filename;
++ if (loadproc == loadHTMLBuffer
++#ifdef USE_IMAGE
++ || loadproc == loadImageBuffer
++#endif
++ )
++ buf->type = "text/html";
++ else
++ buf->type = "text/plain";
+ return buf;
+ }
+
+@@ -484,28 +491,6 @@ convertLine0(URLFile *uf, Str line, int mode)
+ return line;
+ }
+
+-/*
+- * loadFile: load file to buffer
+- */
+-Buffer *
+-loadFile(char *path)
+-{
+- Buffer *buf;
+- URLFile uf;
+- init_stream(&uf, SCM_LOCAL, NULL);
+- examineFile(path, &uf);
+- if (uf.stream == NULL)
+- return NULL;
+- buf = newBuffer(INIT_BUFFER_WIDTH);
+- current_content_length = 0;
+-#ifdef USE_M17N
+- content_charset = 0;
+-#endif
+- buf = loadSomething(&uf, path, loadBuffer, buf);
+- UFclose(&uf);
+- return buf;
+-}
+-
+ int
+ matchattr(char *p, char *attr, int len, Str *value)
+ {
+@@ -694,6 +679,7 @@ readHeader(URLFile *uf, Buffer *newBuf, int thru, ParsedURL *pu)
+ #endif
+ init_stream(&f, SCM_LOCAL, newStrStream(src));
+ loadHTMLstream(&f, newBuf, NULL, TRUE);
++ UFclose(&f);
+ for (l = newBuf->lastLine; l && l->real_linenumber;
+ l = l->prev)
+ l->real_linenumber = 0;
+@@ -1244,6 +1230,7 @@ AuthDigestCred(struct http_auth *ha, Str uname, Str pw, ParsedURL *pu,
+ unsigned char md5[MD5_DIGEST_LENGTH + 1];
+ Str uri = HTTPrequestURI(pu, hr);
+ char nc[] = "00000001";
++ FILE *fp;
+
+ Str algorithm = qstr_unquote(get_auth_param(ha->param, "algorithm"));
+ Str nonce = qstr_unquote(get_auth_param(ha->param, "nonce"));
+@@ -1326,10 +1313,11 @@ AuthDigestCred(struct http_auth *ha, Str uname, Str pw, ParsedURL *pu,
+ /* A2 = Method ":" digest-uri-value ":" H(entity-body) */
+ if (request && request->body) {
+ if (request->method == FORM_METHOD_POST && request->enctype == FORM_ENCTYPE_MULTIPART) {
+- FILE *fp = fopen(request->body, "r");
++ fp = fopen(request->body, "r");
+ if (fp != NULL) {
+ Str ebody;
+ ebody = Strfgetall(fp);
++ fclose(fp);
+ MD5(ebody->ptr, strlen(ebody->ptr), md5);
+ }
+ else {
+@@ -1697,13 +1685,15 @@ getLinkNumberStr(int correction)
+ /*
+ * loadGeneralFile: load file to buffer
+ */
++#define DO_EXTERNAL ((Buffer *(*)(URLFile *, Buffer *))doExternal)
+ Buffer *
+ loadGeneralFile(char *path, ParsedURL *volatile current, char *referer,
+ int flag, FormList *volatile request)
+ {
+ URLFile f, *volatile of = NULL;
+ ParsedURL pu;
+- Buffer *b = NULL, *(*volatile proc)() = loadBuffer;
++ Buffer *b = NULL;
++ Buffer *(*volatile proc)(URLFile *, Buffer *) = loadBuffer;
+ char *volatile tpath;
+ char *volatile t = "text/plain", *p, *volatile real_type = NULL;
+ Buffer *volatile t_buf = NULL;
+@@ -1730,7 +1720,22 @@ loadGeneralFile(char *path, ParsedURL *volatile current, char *referer,
+ add_auth_cookie_flag = 0;
+
+ checkRedirection(NULL);
++
+ load_doc:
++ {
++ const char *sc_redirect;
++ parseURL2(tpath, &pu, current);
++ sc_redirect = query_SCONF_SUBSTITUTE_URL(&pu);
++ if (sc_redirect && *sc_redirect && checkRedirection(&pu)) {
++ tpath = (char *)sc_redirect;
++ request = NULL;
++ add_auth_cookie_flag = 0;
++ current = New(ParsedURL);
++ *current = pu;
++ status = HTST_NORMAL;
++ goto load_doc;
++ }
++ }
+ TRAP_OFF;
+ url_option.referer = referer;
+ url_option.flag = flag;
+@@ -1863,7 +1868,7 @@ loadGeneralFile(char *path, ParsedURL *volatile current, char *referer,
+ /* 302: Found */
+ /* 303: See Other */
+ /* 307: Temporary Redirect (HTTP/1.1) */
+- tpath = url_quote_conv(p, DocumentCharset);
++ tpath = url_encode(p, NULL, 0);
+ request = NULL;
+ UFclose(&f);
+ current = New(ParsedURL);
+@@ -2022,7 +2027,7 @@ loadGeneralFile(char *path, ParsedURL *volatile current, char *referer,
+ if (f.is_cgi && (p = checkHeader(t_buf, "Location:")) != NULL &&
+ checkRedirection(&pu)) {
+ /* document moved */
+- tpath = url_quote_conv(remove_space(p), DocumentCharset);
++ tpath = url_encode(remove_space(p), NULL, 0);
+ request = NULL;
+ UFclose(&f);
+ add_auth_cookie_flag = 0;
+@@ -2123,10 +2128,6 @@ loadGeneralFile(char *path, ParsedURL *volatile current, char *referer,
+ if (real_type == NULL)
+ real_type = t;
+ proc = loadBuffer;
+-#ifdef USE_IMAGE
+- cur_baseURL = New(ParsedURL);
+- copyParsedURL(cur_baseURL, &pu);
+-#endif
+
+ current_content_length = 0;
+ if ((p = checkHeader(t_buf, "Content-Length:")) != NULL)
+@@ -2197,18 +2198,8 @@ loadGeneralFile(char *path, ParsedURL *volatile current, char *referer,
+ #endif
+ else if (w3m_backend) ;
+ else if (!(w3m_dump & ~DUMP_FRAME) || is_dump_text_type(t)) {
+- if (!do_download && doExternal(f,
+- pu.real_file ? pu.real_file : pu.file,
+- t, &b, t_buf)) {
+- if (b && b != NO_BUFFER) {
+- b->real_scheme = f.scheme;
+- b->real_type = real_type;
+- if (b->currentURL.host == NULL && b->currentURL.file == NULL)
+- copyParsedURL(&b->currentURL, &pu);
+- }
+- UFclose(&f);
+- TRAP_OFF;
+- return b;
++ if (!do_download && searchExtViewer(t) != NULL) {
++ proc = DO_EXTERNAL;
+ }
+ else {
+ TRAP_OFF;
+@@ -2232,36 +2223,30 @@ loadGeneralFile(char *path, ParsedURL *volatile current, char *referer,
+ else if (w3m_dump & DUMP_FRAME)
+ return NULL;
+
++ if (t_buf == NULL)
++ t_buf = newBuffer(INIT_BUFFER_WIDTH);
++ copyParsedURL(&t_buf->currentURL, &pu);
++ t_buf->filename = pu.real_file ? pu.real_file :
++ pu.file ? conv_to_system(pu.file) : NULL;
+ if (flag & RG_FRAME) {
+- if (t_buf == NULL)
+- t_buf = newBuffer(INIT_BUFFER_WIDTH);
+ t_buf->bufferprop |= BP_FRAME;
+ }
+ #ifdef USE_SSL
+- if (t_buf)
+- t_buf->ssl_certificate = f.ssl_certificate;
++ t_buf->ssl_certificate = f.ssl_certificate;
+ #endif
+ frame_source = flag & RG_FRAME_SRC;
+- b = loadSomething(&f, pu.real_file ? pu.real_file : pu.file, proc, t_buf);
++ if (proc == DO_EXTERNAL) {
++ b = doExternal(f, t, t_buf);
++ } else {
++ b = loadSomething(&f, proc, t_buf);
++ }
+ UFclose(&f);
+ frame_source = 0;
+- if (b) {
++ if (b && b != NO_BUFFER) {
+ b->real_scheme = f.scheme;
+ b->real_type = real_type;
+- if (b->currentURL.host == NULL && b->currentURL.file == NULL)
+- copyParsedURL(&b->currentURL, &pu);
+- if (is_html_type(t))
+- b->type = "text/html";
+- else if (w3m_backend) {
+- Str s = Strnew_charp(t);
+- b->type = s->ptr;
+- }
+-#ifdef USE_IMAGE
+- else if (proc == loadImageBuffer)
+- b->type = "text/html";
+-#endif
+- else
+- b->type = "text/plain";
++ if (w3m_backend)
++ b->type = allocStr(t, -1);
+ if (pu.label) {
+ if (proc == loadHTMLBuffer) {
+ Anchor *a;
+@@ -2287,10 +2272,11 @@ loadGeneralFile(char *path, ParsedURL *volatile current, char *referer,
+ if (header_string)
+ header_string = NULL;
+ #ifdef USE_NNTP
+- if (f.scheme == SCM_NNTP || f.scheme == SCM_NEWS)
++ if (b && b != NO_BUFFER && (f.scheme == SCM_NNTP || f.scheme == SCM_NEWS))
+ reAnchorNewsheader(b);
+ #endif
+- preFormUpdateBuffer(b);
++ if (b && b != NO_BUFFER)
++ preFormUpdateBuffer(b);
+ TRAP_OFF;
+ return b;
+ }
+@@ -2469,6 +2455,7 @@ set_breakpoint(struct readbuffer *obuf, int tag_length)
+ bcopy((void *)&obuf->anchor, (void *)&obuf->bp.anchor,
+ sizeof(obuf->anchor));
+ obuf->bp.img_alt = obuf->img_alt;
++ obuf->bp.input_alt = obuf->input_alt;
+ obuf->bp.in_bold = obuf->in_bold;
+ obuf->bp.in_italic = obuf->in_italic;
+ obuf->bp.in_under = obuf->in_under;
+@@ -2486,6 +2473,7 @@ back_to_breakpoint(struct readbuffer *obuf)
+ bcopy((void *)&obuf->bp.anchor, (void *)&obuf->anchor,
+ sizeof(obuf->anchor));
+ obuf->img_alt = obuf->bp.img_alt;
++ obuf->input_alt = obuf->bp.input_alt;
+ obuf->in_bold = obuf->bp.in_bold;
+ obuf->in_italic = obuf->bp.in_italic;
+ obuf->in_under = obuf->bp.in_under;
+@@ -2729,7 +2717,7 @@ flushline(struct html_feed_environ *h_env, struct readbuffer *obuf, int indent,
+ Str line = obuf->line, pass = NULL;
+ char *hidden_anchor = NULL, *hidden_img = NULL, *hidden_bold = NULL,
+ *hidden_under = NULL, *hidden_italic = NULL, *hidden_strike = NULL,
+- *hidden_ins = NULL, *hidden = NULL;
++ *hidden_ins = NULL, *hidden_input = NULL, *hidden = NULL;
+
+ #ifdef DEBUG
+ if (w3m_debug) {
+@@ -2761,6 +2749,12 @@ flushline(struct html_feed_environ *h_env, struct readbuffer *obuf, int indent,
+ hidden = hidden_img;
+ }
+ }
++ if (obuf->input_alt.in) {
++ if ((hidden_input = has_hidden_link(obuf, HTML_INPUT_ALT)) != NULL) {
++ if (!hidden || hidden_input < hidden)
++ hidden = hidden_input;
++ }
++ }
+ if (obuf->in_bold) {
+ if ((hidden_bold = has_hidden_link(obuf, HTML_B)) != NULL) {
+ if (!hidden || hidden_bold < hidden)
+@@ -2812,6 +2806,8 @@ flushline(struct html_feed_environ *h_env, struct readbuffer *obuf, int indent,
+ Strcat_charp(line, "</a>");
+ if (obuf->img_alt && !hidden_img)
+ Strcat_charp(line, "</img_alt>");
++ if (obuf->input_alt.in && !hidden_input)
++ Strcat_charp(line, "</input_alt>");
+ if (obuf->in_bold && !hidden_bold)
+ Strcat_charp(line, "</b>");
+ if (obuf->in_italic && !hidden_italic)
+@@ -3022,6 +3018,18 @@ flushline(struct html_feed_environ *h_env, struct readbuffer *obuf, int indent,
+ Strcat_charp(tmp, "\">");
+ push_tag(obuf, tmp->ptr, HTML_IMG_ALT);
+ }
++ if (!hidden_input && obuf->input_alt.in) {
++ Str tmp;
++ if (obuf->input_alt.hseq > 0)
++ obuf->input_alt.hseq = - obuf->input_alt.hseq;
++ tmp = Sprintf("<INPUT_ALT hseq=\"%d\" fid=\"%d\" name=\"%s\" type=\"%s\" value=\"%s\">",
++ obuf->input_alt.hseq,
++ obuf->input_alt.fid,
++ obuf->input_alt.name ? obuf->input_alt.name->ptr : "",
++ obuf->input_alt.type ? obuf->input_alt.type->ptr : "",
++ obuf->input_alt.value ? obuf->input_alt.value->ptr : "");
++ push_tag(obuf, tmp->ptr, HTML_INPUT_ALT);
++ }
+ if (!hidden_bold && obuf->in_bold)
+ push_tag(obuf, "<B>", HTML_B);
+ if (!hidden_italic && obuf->in_italic)
+@@ -3228,7 +3236,7 @@ process_img(struct parsed_tag *tag, int width)
+
+ if (!parsedtag_get_value(tag, ATTR_SRC, &p))
+ return tmp;
+- p = remove_space(p);
++ p = url_encode(remove_space(p), cur_baseURL, cur_document_charset);
+ q = NULL;
+ parsedtag_get_value(tag, ATTR_ALT, &q);
+ if (!pseudoInlines && (q == NULL || (*q == '\0' && ignore_null_img_alt)))
+@@ -3322,12 +3330,7 @@ process_img(struct parsed_tag *tag, int width)
+ Image image;
+ ParsedURL u;
+
+-#ifdef USE_M17N
+- parseURL2(wc_conv(p, InnerCharset, cur_document_charset)->ptr, &u,
+- cur_baseURL);
+-#else
+ parseURL2(p, &u, cur_baseURL);
+-#endif
+ image.url = parsedURL2Str(&u)->ptr;
+ if (!uncompressed_file_type(u.file, &image.ext))
+ image.ext = filename_extension(u.file, TRUE);
+@@ -3346,8 +3349,14 @@ process_img(struct parsed_tag *tag, int width)
+ if (i < 0)
+ i = pixel_per_line;
+ }
+- nw = (w > 3) ? (int)((w - 3) / pixel_per_char + 1) : 1;
+- ni = (i > 3) ? (int)((i - 3) / pixel_per_line + 1) : 1;
++ if (enable_inline_image) {
++ nw = (w > 1) ? ((w - 1) / pixel_per_char_i + 1) : 1 ;
++ ni = (i > 1) ? ((i - 1) / pixel_per_line_i + 1) : 1 ;
++ }
++ else {
++ nw = (w > 3) ? (int)((w - 3) / pixel_per_char + 1) : 1;
++ ni = (i > 3) ? (int)((i - 3) / pixel_per_line + 1) : 1;
++ }
+ Strcat(tmp,
+ Sprintf("<pre_int><img_alt hseq=\"%d\" src=\"", cur_iseq++));
+ pre_int = TRUE;
+@@ -3378,19 +3387,21 @@ process_img(struct parsed_tag *tag, int width)
+ if (i0 >= 0)
+ Strcat(tmp, Sprintf(" height=%d", i0));
+ switch (align) {
++ case ALIGN_MIDDLE:
++ if (!enable_inline_image) {
++ top = ni / 2;
++ bottom = top;
++ if (top * 2 == ni)
++ yoffset = (int)(((ni + 1) * pixel_per_line - i) / 2);
++ else
++ yoffset = (int)((ni * pixel_per_line - i) / 2);
++ break;
++ }
+ case ALIGN_TOP:
+ top = 0;
+ bottom = ni - 1;
+ yoffset = 0;
+ break;
+- case ALIGN_MIDDLE:
+- top = ni / 2;
+- bottom = top;
+- if (top * 2 == ni)
+- yoffset = (int)(((ni + 1) * pixel_per_line - i) / 2);
+- else
+- yoffset = (int)((ni * pixel_per_line - i) / 2);
+- break;
+ case ALIGN_BOTTOM:
+ top = ni - 1;
+ bottom = 0;
+@@ -3408,7 +3419,12 @@ process_img(struct parsed_tag *tag, int width)
+ }
+ break;
+ }
+- xoffset = (int)((nw * pixel_per_char - w) / 2);
++
++ if (enable_inline_image)
++ xoffset = 0;
++ else
++ xoffset = (int)((nw * pixel_per_char - w) / 2);
++
+ if (xoffset)
+ Strcat(tmp, Sprintf(" xoffset=%d", xoffset));
+ if (yoffset)
+@@ -3548,7 +3564,7 @@ process_anchor(struct parsed_tag *tag, char *tagbuf)
+ Str
+ process_input(struct parsed_tag *tag)
+ {
+- int i, w, v, x, y, z, iw, ih;
++ int i = 20, v, x, y, z, iw, ih, size = 20;
+ char *q, *p, *r, *p2, *s;
+ Str tmp = NULL;
+ char *qq = "";
+@@ -3567,9 +3583,9 @@ process_input(struct parsed_tag *tag)
+ parsedtag_get_value(tag, ATTR_VALUE, &q);
+ r = "";
+ parsedtag_get_value(tag, ATTR_NAME, &r);
+- w = 20;
+- parsedtag_get_value(tag, ATTR_SIZE, &w);
+- i = 20;
++ parsedtag_get_value(tag, ATTR_SIZE, &size);
++ if (size > MAX_INPUT_SIZE)
++ size = MAX_INPUT_SIZE;
+ parsedtag_get_value(tag, ATTR_MAXLENGTH, &i);
+ p2 = NULL;
+ parsedtag_get_value(tag, ATTR_ALT, &p2);
+@@ -3623,9 +3639,10 @@ process_input(struct parsed_tag *tag)
+ Strcat(tmp, getLinkNumberStr(0));
+ Strcat_char(tmp, '(');
+ }
+- Strcat(tmp, Sprintf("<input_alt hseq=\"%d\" fid=\"%d\" type=%s "
++ Strcat(tmp, Sprintf("<input_alt hseq=\"%d\" fid=\"%d\" type=\"%s\" "
+ "name=\"%s\" width=%d maxlength=%d value=\"%s\"",
+- cur_hseq++, cur_form_id, p, html_quote(r), w, i, qq));
++ cur_hseq++, cur_form_id, html_quote(p),
++ html_quote(r), size, i, qq));
+ if (x)
+ Strcat_charp(tmp, " checked");
+ if (y)
+@@ -3670,18 +3687,18 @@ process_input(struct parsed_tag *tag)
+ case FORM_INPUT_PASSWORD:
+ i = 0;
+ if (q) {
+- for (; i < qlen && i < w; i++)
++ for (; i < qlen && i < size; i++)
+ Strcat_char(tmp, '*');
+ }
+- for (; i < w; i++)
++ for (; i < size; i++)
+ Strcat_char(tmp, ' ');
+ break;
+ case FORM_INPUT_TEXT:
+ case FORM_INPUT_FILE:
+ if (q)
+- Strcat(tmp, textfieldrep(Strnew_charp(q), w));
++ Strcat(tmp, textfieldrep(Strnew_charp(q), size));
+ else {
+- for (i = 0; i < w; i++)
++ for (i = 0; i < size; i++)
+ Strcat_char(tmp, ' ');
+ }
+ break;
+@@ -3732,6 +3749,75 @@ process_input(struct parsed_tag *tag)
+ }
+
+ Str
++process_button(struct parsed_tag *tag)
++{
++ Str tmp = NULL;
++ char *p, *q, *r, *qq = "";
++ int qlen, v;
++
++ if (cur_form_id < 0) {
++ char *s = "<form_int method=internal action=none>";
++ tmp = process_form(parse_tag(&s, TRUE));
++ }
++ if (tmp == NULL)
++ tmp = Strnew();
++
++ p = "submit";
++ parsedtag_get_value(tag, ATTR_TYPE, &p);
++ q = NULL;
++ parsedtag_get_value(tag, ATTR_VALUE, &q);
++ r = "";
++ parsedtag_get_value(tag, ATTR_NAME, &r);
++
++ v = formtype(p);
++ if (v == FORM_UNKNOWN)
++ return NULL;
++
++ switch (v) {
++ case FORM_INPUT_SUBMIT:
++ case FORM_INPUT_BUTTON:
++ case FORM_INPUT_RESET:
++ break;
++ default:
++ p = "submit";
++ v = FORM_INPUT_SUBMIT;
++ break;
++ }
++
++ if (!q) {
++ switch (v) {
++ case FORM_INPUT_SUBMIT:
++ case FORM_INPUT_BUTTON:
++ q = "SUBMIT";
++ break;
++ case FORM_INPUT_RESET:
++ q = "RESET";
++ break;
++ }
++ }
++ if (q) {
++ qq = html_quote(q);
++ qlen = strlen(q);
++ }
++
++ /* Strcat_charp(tmp, "<pre_int>"); */
++ Strcat(tmp, Sprintf("<input_alt hseq=\"%d\" fid=\"%d\" type=\"%s\" "
++ "name=\"%s\" value=\"%s\">",
++ cur_hseq++, cur_form_id, html_quote(p),
++ html_quote(r), qq));
++ return tmp;
++}
++
++Str
++process_n_button(void)
++{
++ Str tmp = Strnew();
++ Strcat_charp(tmp, "</input_alt>");
++ /* Strcat_charp(tmp, "</pre_int>"); */
++ return tmp;
++}
++
++Str
+ process_select(struct parsed_tag *tag)
+ {
+ Str tmp = NULL;
+@@ -4084,6 +4170,7 @@ process_form_int(struct parsed_tag *tag, int fid)
+ parsedtag_get_value(tag, ATTR_METHOD, &p);
+ q = "!CURRENT_URL!";
+ parsedtag_get_value(tag, ATTR_ACTION, &q);
++ q = url_encode(remove_space(q), cur_baseURL, cur_document_charset);
+ r = NULL;
+ #ifdef USE_M17N
+ if (parsedtag_get_value(tag, ATTR_ACCEPT_CHARSET, &r))
+@@ -4113,7 +4200,7 @@ process_form_int(struct parsed_tag *tag, int fid)
+ forms = New_N(FormList *, forms_size);
+ form_stack = NewAtom_N(int, forms_size);
+ }
+- else if (forms_size <= form_max) {
++ if (forms_size <= form_max) {
+ forms_size += form_max;
+ forms = New_Reuse(FormList *, forms, forms_size);
+ form_stack = New_Reuse(int, form_stack, forms_size);
+@@ -4284,15 +4371,15 @@ getMetaRefreshParam(char *q, Str *refresh_uri)
+ while (*q) {
+ if (!strncasecmp(q, "url=", 4)) {
+ q += 4;
+- if (*q == '\"') /* " */
++ if (*q == '\"' || *q == '\'') /* " or ' */
+ q++;
+ r = q;
+ while (*r && !IS_SPACE(*r) && *r != ';')
+ r++;
+ s_tmp = Strnew_charp_n(q, r - q);
+
+- if (s_tmp->ptr[s_tmp->length - 1] == '\"') { /* "
+- */
++ if (s_tmp->ptr[s_tmp->length - 1] == '\"' /* " */
++ || s_tmp->ptr[s_tmp->length - 1] == '\'') { /* ' */
+ s_tmp->length--;
+ s_tmp->ptr[s_tmp->length] = '\0';
+ }
+@@ -4599,6 +4686,12 @@ HTMLtagproc1(struct parsed_tag *tag, struct html_feed_environ *h_env)
+ case HTML_DD:
+ CLOSE_A;
+ CLOSE_DT;
++ if (h_env->envc == 0 ||
++ (h_env->envc_real < h_env->nenv &&
++ envs[h_env->envc].env != HTML_DL &&
++ envs[h_env->envc].env != HTML_DL_COMPACT)) {
++ PUSH_ENV(HTML_DL);
++ }
+ if (envs[h_env->envc].env == HTML_DL_COMPACT) {
+ if (obuf->pos > envs[h_env->envc].indent)
+ flushline(h_env, obuf, envs[h_env->envc].indent, 0,
+@@ -4861,7 +4954,35 @@ HTMLtagproc1(struct parsed_tag *tag, struct html_feed_environ *h_env)
+ if (i > obuf->bottom_margin)
+ obuf->bottom_margin = i;
+ }
++ if (parsedtag_get_value(tag, ATTR_HSEQ, &hseq)) {
++ obuf->input_alt.hseq = hseq;
++ }
++ if (parsedtag_get_value(tag, ATTR_FID, &i)) {
++ obuf->input_alt.fid = i;
++ }
++ if (parsedtag_get_value(tag, ATTR_TYPE, &p)) {
++ obuf->input_alt.type = Strnew_charp(p);
++ }
++ if (parsedtag_get_value(tag, ATTR_VALUE, &p)) {
++ obuf->input_alt.value = Strnew_charp(p);
++ }
++ if (parsedtag_get_value(tag, ATTR_NAME, &p)) {
++ obuf->input_alt.name = Strnew_charp(p);
++ }
++ obuf->input_alt.in = 1;
+ return 0;
++ case HTML_N_INPUT_ALT:
++ if (obuf->input_alt.in) {
++ if (!close_effect0(obuf, HTML_INPUT_ALT))
++ push_tag(obuf, "</input_alt>", HTML_N_INPUT_ALT);
++ obuf->input_alt.hseq = 0;
++ obuf->input_alt.fid = -1;
++ obuf->input_alt.in = 0;
++ obuf->input_alt.type = NULL;
++ obuf->input_alt.name = NULL;
++ obuf->input_alt.value = NULL;
++ }
++ return 1;
+ case HTML_TABLE:
+ close_anchor(h_env, obuf);
+ obuf->table_level++;
+@@ -4884,6 +5005,8 @@ HTMLtagproc1(struct parsed_tag *tag, struct html_feed_environ *h_env)
+ else
+ w = BORDER_THIN;
+ }
++ if (DisplayBorders && w == BORDER_NONE)
++ w = BORDER_THIN;
+ if (parsedtag_get_value(tag, ATTR_WIDTH, &i)) {
+ if (obuf->table_level == 0)
+ width = REAL_WIDTH(i, h_env->limit - envs[h_env->envc].indent);
+@@ -4892,9 +5015,18 @@ HTMLtagproc1(struct parsed_tag *tag, struct html_feed_environ *h_env)
+ }
+ if (parsedtag_exists(tag, ATTR_HBORDER))
+ w = BORDER_NOWIN;
++#define MAX_CELLSPACING 1000
++#define MAX_CELLPADDING 1000
++#define MAX_VSPACE 1000
+ parsedtag_get_value(tag, ATTR_CELLSPACING, &x);
+ parsedtag_get_value(tag, ATTR_CELLPADDING, &y);
+ parsedtag_get_value(tag, ATTR_VSPACE, &z);
++ if (x > MAX_CELLSPACING)
++ x = MAX_CELLSPACING;
++ if (y > MAX_CELLPADDING)
++ y = MAX_CELLPADDING;
++ if (z > MAX_VSPACE)
++ z = MAX_VSPACE;
+ #ifdef ID_EXT
+ parsedtag_get_value(tag, ATTR_ID, &id);
+ #endif /* ID_EXT */
+@@ -4970,6 +5102,16 @@ HTMLtagproc1(struct parsed_tag *tag, struct html_feed_environ *h_env)
+ case HTML_INPUT:
+ close_anchor(h_env, obuf);
+ tmp = process_input(tag);
++ if (tmp)
++ HTMLlineproc1(tmp->ptr, h_env);
++ return 1;
++ case HTML_BUTTON:
++ tmp = process_button(tag);
++ if (tmp)
++ HTMLlineproc1(tmp->ptr, h_env);
++ return 1;
++ case HTML_N_BUTTON:
++ tmp = process_n_button();
+ if (tmp)
+ HTMLlineproc1(tmp->ptr, h_env);
+ return 1;
+@@ -5067,11 +5209,10 @@ HTMLtagproc1(struct parsed_tag *tag, struct html_feed_environ *h_env)
+ }
+ return 1;
+ case HTML_BASE:
+-#ifdef USE_IMAGE
++#if defined(USE_M17N) || defined(USE_IMAGE)
+ p = NULL;
+ if (parsedtag_get_value(tag, ATTR_HREF, &p)) {
+- if (!cur_baseURL)
+- cur_baseURL = New(ParsedURL);
++ cur_baseURL = New(ParsedURL);
+ parseURL(p, cur_baseURL, NULL);
+ }
+ #endif
+@@ -5329,6 +5470,13 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
+ #ifdef MENU_SELECT
+ Anchor **a_select = NULL;
+ #endif
++#if defined(USE_M17N) || defined(USE_IMAGE)
++ ParsedURL *base = baseURL(buf);
++#endif
++#ifdef USE_M17N
++ wc_ces name_charset = url_to_charset(NULL, &buf->currentURL,
++ buf->document_charset);
++#endif
+
+ if (out_size == 0) {
+ out_size = LINELEN;
+@@ -5523,16 +5671,17 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
+ hseq = 0;
+ id = NULL;
+ if (parsedtag_get_value(tag, ATTR_NAME, &id)) {
+- id = url_quote_conv(id, buf->document_charset);
++ id = url_quote_conv(id, name_charset);
+ registerName(buf, id, currentLn(buf), pos);
+ }
+ if (parsedtag_get_value(tag, ATTR_HREF, &p))
+- p = url_quote_conv(remove_space(p),
+- buf->document_charset);
++ p = url_encode(remove_space(p), base,
++ buf->document_charset);
+ if (parsedtag_get_value(tag, ATTR_TARGET, &q))
+ q = url_quote_conv(q, buf->document_charset);
+ if (parsedtag_get_value(tag, ATTR_REFERER, &r))
+- r = url_quote_conv(r, buf->document_charset);
++ r = url_encode(r, base,
++ buf->document_charset);
+ parsedtag_get_value(tag, ATTR_TITLE, &s);
+ parsedtag_get_value(tag, ATTR_ACCESSKEY, &t);
+ parsedtag_get_value(tag, ATTR_HSEQ, &hseq);
+@@ -5618,7 +5767,7 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
+ ParsedURL u;
+ Image *image;
+
+- parseURL2(a_img->url, &u, cur_baseURL);
++ parseURL2(a_img->url, &u, base);
+ a_img->image = image = New(Image);
+ image->url = parsedURL2Str(&u)->ptr;
+ if (!uncompressed_file_type(u.file, &image->ext))
+@@ -5639,7 +5788,7 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
+ image->map = q;
+ image->ismap = ismap;
+ image->touch = 0;
+- image->cache = getImage(image, cur_baseURL,
++ image->cache = getImage(image, base,
+ IMG_FLAG_SKIP);
+ }
+ else if (iseq < 0) {
+@@ -5689,6 +5838,21 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
+ putHmarker(buf->hmarklist, currentLn(buf),
+ hpos, hseq - 1);
+ }
++ else if (hseq < 0) {
++ int h = -hseq - 1;
++ int hpos = pos;
++ if (*str == '[')
++ hpos++;
++ if (buf->hmarklist &&
++ h < buf->hmarklist->nmark &&
++ buf->hmarklist->marks[h].invalid) {
++ buf->hmarklist->marks[h].pos = hpos;
++ buf->hmarklist->marks[h].line = currentLn(buf);
++ buf->hmarklist->marks[h].invalid = 0;
++ hseq = -hseq;
++ }
++ }
++
+ if (!form->target)
+ form->target = buf->baseTarget;
+ if (a_textarea &&
+@@ -5761,8 +5925,8 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
+ break;
+ if (parsedtag_get_value(tag, ATTR_HREF, &p)) {
+ MapArea *a;
+- p = url_quote_conv(remove_space(p),
+- buf->document_charset);
++ p = url_encode(remove_space(p), base,
++ buf->document_charset);
+ t = NULL;
+ parsedtag_get_value(tag, ATTR_TARGET, &t);
+ q = "";
+@@ -5811,11 +5975,14 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
+ break;
+ case HTML_BASE:
+ if (parsedtag_get_value(tag, ATTR_HREF, &p)) {
+- p = url_quote_conv(remove_space(p),
+- buf->document_charset);
++ p = url_encode(remove_space(p), NULL,
++ buf->document_charset);
+ if (!buf->baseURL)
+ buf->baseURL = New(ParsedURL);
+ parseURL(p, buf->baseURL, NULL);
++#if defined(USE_M17N) || defined(USE_IMAGE)
++ base = buf->baseURL;
++#endif
+ }
+ if (parsedtag_get_value(tag, ATTR_TARGET, &p))
+ buf->baseTarget =
+@@ -5830,8 +5997,8 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
+ int refresh_interval = getMetaRefreshParam(q, &tmp);
+ #ifdef USE_ALARM
+ if (tmp) {
+- p = url_quote_conv(remove_space(tmp->ptr),
+- buf->document_charset);
++ p = url_encode(remove_space(tmp->ptr), base,
++ buf->document_charset);
+ buf->event = setAlarmEvent(buf->event,
+ refresh_interval,
+ AL_IMPLICIT_ONCE,
+@@ -5844,8 +6011,8 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
+ FUNCNAME_reload, NULL);
+ #else
+ if (tmp && refresh_interval == 0) {
+- p = url_quote_conv(remove_space(tmp->ptr),
+- buf->document_charset);
++ p = url_encode(remove_space(tmp->ptr), base,
++ buf->document_charset);
+ pushEvent(FUNCNAME_gorURL, p);
+ }
+ #endif
+@@ -5864,7 +6031,7 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
+ case HTML_TEXTAREA_INT:
+ if (parsedtag_get_value(tag, ATTR_TEXTAREANUMBER,
+ &n_textarea)
+- && n_textarea < max_textarea) {
++ && n_textarea >= 0 && n_textarea < max_textarea) {
+ textarea_str[n_textarea] = Strnew();
+ }
+ else
+@@ -5881,7 +6048,7 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
+ #ifdef MENU_SELECT
+ case HTML_SELECT_INT:
+ if (parsedtag_get_value(tag, ATTR_SELECTNUMBER, &n_select)
+- && n_select < max_select) {
++ && n_select >= 0 && n_select < max_select) {
+ select_option[n_select].first = NULL;
+ select_option[n_select].last = NULL;
+ }
+@@ -5929,7 +6096,7 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
+ #ifdef ID_EXT
+ id = NULL;
+ if (parsedtag_get_value(tag, ATTR_ID, &id)) {
+- id = url_quote_conv(id, buf->document_charset);
++ id = url_quote_conv(id, name_charset);
+ registerName(buf, id, currentLn(buf), pos);
+ }
+ if (renderFrameSet &&
+@@ -5964,7 +6131,8 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
+ fclose(debug);
+ #endif
+ for (form_id = 1; form_id <= form_max; form_id++)
+- forms[form_id]->next = forms[form_id - 1];
++ if (forms[form_id])
++ forms[form_id]->next = forms[form_id - 1];
+ buf->formlist = (form_max >= 0) ? forms[form_max] : NULL;
+ if (n_textarea)
+ addMultirowsForm(buf, buf->formitem);
+@@ -5982,7 +6150,8 @@ addLink(Buffer *buf, struct parsed_tag *tag)
+
+ parsedtag_get_value(tag, ATTR_HREF, &href);
+ if (href)
+- href = url_quote_conv(remove_space(href), buf->document_charset);
++ href = url_encode(remove_space(href), baseURL(buf),
++ buf->document_charset);
+ parsedtag_get_value(tag, ATTR_TITLE, &title);
+ parsedtag_get_value(tag, ATTR_TYPE, &ctype);
+ parsedtag_get_value(tag, ATTR_REL, &rel);
+@@ -6756,6 +6925,12 @@ init_henv(struct html_feed_environ *h_env, struct readbuffer *obuf,
+ obuf->nobr_level = 0;
+ bzero((void *)&obuf->anchor, sizeof(obuf->anchor));
+ obuf->img_alt = 0;
++ obuf->input_alt.hseq = 0;
++ obuf->input_alt.fid = -1;
++ obuf->input_alt.in = 0;
++ obuf->input_alt.type = NULL;
++ obuf->input_alt.name = NULL;
++ obuf->input_alt.value = NULL;
+ obuf->in_bold = 0;
+ obuf->in_italic = 0;
+ obuf->in_under = 0;
+@@ -6791,6 +6966,15 @@ completeHTMLstream(struct html_feed_environ *h_env, struct readbuffer *obuf)
+ push_tag(obuf, "</img_alt>", HTML_N_IMG_ALT);
+ obuf->img_alt = NULL;
+ }
++ if (obuf->input_alt.in) {
++ push_tag(obuf, "</input_alt>", HTML_N_INPUT_ALT);
++ obuf->input_alt.hseq = 0;
++ obuf->input_alt.fid = -1;
++ obuf->input_alt.in = 0;
++ obuf->input_alt.type = NULL;
++ obuf->input_alt.name = NULL;
++ obuf->input_alt.value = NULL;
++ }
+ if (obuf->in_bold) {
+ push_tag(obuf, "</b>", HTML_N_B);
+ obuf->in_bold = 0;
+@@ -6963,8 +7147,6 @@ loadHTMLstream(URLFile *f, Buffer *newBuf, FILE * src, int internal)
+ image_flag = IMG_FLAG_AUTO;
+ else
+ image_flag = IMG_FLAG_SKIP;
+- if (newBuf->currentURL.file)
+- cur_baseURL = baseURL(newBuf);
+ #endif
+
+ if (w3m_halfload) {
+@@ -6987,6 +7169,9 @@ loadHTMLstream(URLFile *f, Buffer *newBuf, FILE * src, int internal)
+ htmlenv1.f = stdout;
+ else
+ htmlenv1.buf = newTextLineList();
++#if defined(USE_M17N) || defined(USE_IMAGE)
++ cur_baseURL = baseURL(newBuf);
++#endif
+
+ if (SETJMP(AbortLoading) != 0) {
+ HTMLlineproc1("<br>Transfer Interrupted!<br>", &htmlenv1);
+@@ -7048,18 +7233,23 @@ loadHTMLstream(URLFile *f, Buffer *newBuf, FILE * src, int internal)
+ }
+ #endif
+ lineBuf2 = convertLine(f, lineBuf2, HTML_MODE, &charset, doc_charset);
+-#if defined(USE_M17N) && defined(USE_IMAGE)
++#ifdef USE_M17N
+ cur_document_charset = charset;
+ #endif
+ HTMLlineproc0(lineBuf2->ptr, &htmlenv1, internal);
+ }
+ if (obuf.status != R_ST_NORMAL) {
+- obuf.status = R_ST_EOL;
+ HTMLlineproc0("\n", &htmlenv1, internal);
+ }
+ obuf.status = R_ST_NORMAL;
+ completeHTMLstream(&htmlenv1, &obuf);
+ flushline(&htmlenv1, &obuf, 0, 2, htmlenv1.limit);
++#if defined(USE_M17N) || defined(USE_IMAGE)
++ cur_baseURL = NULL;
++#endif
++#ifdef USE_M17N
++ cur_document_charset = 0;
++#endif
+ if (htmlenv1.title)
+ newBuf->buffername = htmlenv1.title;
+ if (w3m_halfdump) {
+@@ -7096,16 +7286,17 @@ loadHTMLString(Str page)
+ MySignalHandler(*volatile prevtrap) (SIGNAL_ARG) = NULL;
+ Buffer *newBuf;
+
++ init_stream(&f, SCM_LOCAL, newStrStream(page));
++
+ newBuf = newBuffer(INIT_BUFFER_WIDTH);
+ if (SETJMP(AbortLoading) != 0) {
+ TRAP_OFF;
+ discardBuffer(newBuf);
++ UFclose(&f);
+ return NULL;
+ }
+ TRAP_ON;
+
+- init_stream(&f, SCM_LOCAL, newStrStream(page));
+-
+ #ifdef USE_M17N
+ newBuf->document_charset = InnerCharset;
+ #endif
+@@ -7115,6 +7306,7 @@ loadHTMLString(Str page)
+ #endif
+
+ TRAP_OFF;
++ UFclose(&f);
+ newBuf->topLine = newBuf->firstLine;
+ newBuf->lastLine = newBuf->currentLine;
+ newBuf->currentLine = newBuf->firstLine;
+@@ -7207,7 +7399,7 @@ loadGopherDir(URLFile *uf, ParsedURL *pu, wc_ces * charset)
+ q = Strnew_m_charp("gopher://", host->ptr, ":", port->ptr,
+ "/", file->ptr, NULL)->ptr;
+ Strcat_m_charp(tmp, "<a href=\"",
+- html_quote(url_quote_conv(q, *charset)),
++ html_quote(url_encode(q, NULL, *charset)),
+ "\">", p, html_quote(name->ptr + 1), "</a>\n", NULL);
+ }
+
+@@ -7243,7 +7435,6 @@ loadBuffer(URLFile *uf, Buffer *volatile newBuf)
+
+ if (newBuf == NULL)
+ newBuf = newBuffer(INIT_BUFFER_WIDTH);
+- lineBuf2 = Strnew();
+
+ if (SETJMP(AbortLoading) != 0) {
+ goto _end;
+@@ -7331,6 +7522,7 @@ loadImageBuffer(URLFile *uf, Buffer *newBuf)
+ URLFile f;
+ MySignalHandler(*volatile prevtrap) (SIGNAL_ARG) = NULL;
+ struct stat st;
++ const ParsedURL *pu = newBuf ? &newBuf->currentURL : NULL;
+
+ loadImage(newBuf, IMG_FLAG_STOP);
+ image.url = uf->url;
+@@ -7338,20 +7530,18 @@ loadImageBuffer(URLFile *uf, Buffer *newBuf)
+ image.width = -1;
+ image.height = -1;
+ image.cache = NULL;
+- cache = getImage(&image, cur_baseURL, IMG_FLAG_AUTO);
+- if (!cur_baseURL->is_nocache && cache->loaded & IMG_FLAG_LOADED &&
++ cache = getImage(&image, (ParsedURL *)pu, IMG_FLAG_AUTO);
++ if (!(pu && pu->is_nocache) && cache->loaded & IMG_FLAG_LOADED &&
+ !stat(cache->file, &st))
+ goto image_buffer;
+
+- TRAP_ON;
+ if (IStype(uf->stream) != IST_ENCODED)
+ uf->stream = newEncodedStream(uf->stream, uf->encoding);
++ TRAP_ON;
+ if (save2tmp(*uf, cache->file) < 0) {
+- UFclose(uf);
+ TRAP_OFF;
+ return NULL;
+ }
+- UFclose(uf);
+ TRAP_OFF;
+
+ cache->loaded = IMG_FLAG_LOADED;
+@@ -7371,6 +7561,7 @@ loadImageBuffer(URLFile *uf, Buffer *newBuf)
+
+ init_stream(&f, SCM_LOCAL, newStrStream(tmp));
+ loadHTMLstream(&f, newBuf, src, TRUE);
++ UFclose(&f);
+ if (src)
+ fclose(src);
+
+@@ -7580,8 +7771,11 @@ openGeneralPagerBuffer(InputStream stream)
+ #ifdef USE_M17N
+ content_charset = 0;
+ #endif
++ t_buf = newBuffer(INIT_BUFFER_WIDTH);
++ copyParsedURL(&t_buf->currentURL, NULL);
++ t_buf->currentURL.scheme = SCM_LOCAL;
++ t_buf->currentURL.file = "-";
+ if (SearchHeader) {
+- t_buf = newBuffer(INIT_BUFFER_WIDTH);
+ readHeader(&uf, t_buf, TRUE, NULL);
+ t = checkContentType(t_buf);
+ if (t == NULL)
+@@ -7609,14 +7803,13 @@ openGeneralPagerBuffer(InputStream stream)
+ #ifdef USE_IMAGE
+ else if (activeImage && displayImage && !useExtImageViewer &&
+ !(w3m_dump & ~DUMP_FRAME) && !strncasecmp(t, "image/", 6)) {
+- cur_baseURL = New(ParsedURL);
+- parseURL("-", cur_baseURL, NULL);
+ buf = loadImageBuffer(&uf, t_buf);
+ buf->type = "text/html";
+ }
+ #endif
+ else {
+- if (doExternal(uf, "-", t, &buf, t_buf)) {
++ if (searchExtViewer(t)) {
++ buf = doExternal(uf, t, t_buf);
+ UFclose(&uf);
+ if (buf == NULL || buf == NO_BUFFER)
+ return buf;
+@@ -7629,8 +7822,6 @@ openGeneralPagerBuffer(InputStream stream)
+ }
+ }
+ buf->real_type = t;
+- buf->currentURL.scheme = SCM_LOCAL;
+- buf->currentURL.file = "-";
+ return buf;
+ }
+
+@@ -7766,6 +7957,8 @@ save2tmp(URLFile uf, char *tmpf)
+ clen_t linelen = 0, trbyte = 0;
+ MySignalHandler(*volatile prevtrap) (SIGNAL_ARG) = NULL;
+ static JMP_BUF env_bak;
++ volatile int retval = 0;
++ char *volatile buf = NULL;
+
+ ff = fopen(tmpf, "wb");
+ if (ff == NULL) {
+@@ -7802,30 +7995,29 @@ save2tmp(URLFile uf, char *tmpf)
+ else
+ #endif /* USE_NNTP */
+ {
+- Str buf = Strnew_size(SAVE_BUF_SIZE);
+- while (UFread(&uf, buf, SAVE_BUF_SIZE)) {
+- if (Strfputs(buf, ff) != buf->length) {
+- bcopy(env_bak, AbortLoading, sizeof(JMP_BUF));
+- TRAP_OFF;
+- fclose(ff);
+- current_content_length = 0;
+- return -2;
++ int count;
++
++ buf = NewWithoutGC_N(char, SAVE_BUF_SIZE);
++ while ((count = ISread_n(uf.stream, buf, SAVE_BUF_SIZE)) > 0) {
++ if (fwrite(buf, 1, count, ff) != count) {
++ retval = -2;
++ goto _end;
+ }
+- linelen += buf->length;
++ linelen += count;
+ showProgress(&linelen, &trbyte);
+ }
+ }
+ _end:
+ bcopy(env_bak, AbortLoading, sizeof(JMP_BUF));
+ TRAP_OFF;
++ xfree(buf);
+ fclose(ff);
+ current_content_length = 0;
+- return 0;
++ return retval;
+ }
+
+-int
+-doExternal(URLFile uf, char *path, char *type, Buffer **bufp,
+- Buffer *defaultbuf)
++Buffer *
++doExternal(URLFile uf, char *type, Buffer *defaultbuf)
+ {
+ Str tmpf, command;
+ struct mailcap *mcap;
+@@ -7834,7 +8026,7 @@ doExternal(URLFile uf, char *path, char *type, Buffer **bufp,
+ char *header, *src = NULL, *ext = uf.ext;
+
+ if (!(mcap = searchExtViewer(type)))
+- return 0;
++ return NULL;
+
+ if (mcap->nametemplate) {
+ tmpf = unquote_mailcap(mcap->nametemplate, NULL, "", NULL, NULL);
+@@ -7867,15 +8059,13 @@ doExternal(URLFile uf, char *path, char *type, Buffer **bufp,
+ UFclose(&uf);
+ myExec(command->ptr);
+ }
+- *bufp = NO_BUFFER;
+- return 1;
++ return NO_BUFFER;
+ }
+ else
+ #endif
+ {
+ if (save2tmp(uf, tmpf->ptr) < 0) {
+- *bufp = NULL;
+- return 1;
++ return NULL;
+ }
+ }
+ if (mcap->flags & (MAILCAP_HTMLOUTPUT | MAILCAP_COPIOUSOUTPUT)) {
+@@ -7918,14 +8108,13 @@ doExternal(URLFile uf, char *path, char *type, Buffer **bufp,
+ buf = NO_BUFFER;
+ }
+ if (buf && buf != NO_BUFFER) {
+- buf->filename = path;
+- if (buf->buffername == NULL || buf->buffername[0] == '\0')
+- buf->buffername = conv_from_system(lastFileName(path));
++ if ((buf->buffername == NULL || buf->buffername[0] == '\0') &&
++ buf->filename)
++ buf->buffername = conv_from_system(lastFileName(buf->filename));
+ buf->edit = mcap->edit;
+ buf->mailcap = mcap;
+ }
+- *bufp = buf;
+- return 1;
++ return buf;
+ }
+
+ static int
+@@ -7935,7 +8124,8 @@ _MoveFile(char *path1, char *path2)
+ FILE *f2;
+ int is_pipe;
+ clen_t linelen = 0, trbyte = 0;
+- Str buf;
++ char *buf = NULL;
++ int count;
+
+ f1 = openIS(path1);
+ if (f1 == NULL)
+@@ -7953,12 +8143,13 @@ _MoveFile(char *path1, char *path2)
+ return -1;
+ }
+ current_content_length = 0;
+- buf = Strnew_size(SAVE_BUF_SIZE);
+- while (ISread(f1, buf, SAVE_BUF_SIZE)) {
+- Strfputs(buf, f2);
+- linelen += buf->length;
++ buf = NewWithoutGC_N(char, SAVE_BUF_SIZE);
++ while ((count = ISread_n(f1, buf, SAVE_BUF_SIZE)) > 0) {
++ fwrite(buf, 1, count, f2);
++ linelen += count;
+ showProgress(&linelen, &trbyte);
+ }
++ xfree(buf);
+ ISclose(f1);
+ if (is_pipe)
+ pclose(f2);
+@@ -7998,7 +8189,7 @@ _doFileCopy(char *tmpf, char *defstr, int download)
+ else {
+ if (q) {
+ p = unescape_spaces(Strnew_charp(q))->ptr;
+- p = conv_to_system(q);
++ p = conv_to_system(p);
+ }
+ p = expandPath(p);
+ if (checkOverWrite(p) < 0)
+@@ -8317,21 +8508,23 @@ uncompress_stream(URLFile *uf, char **src)
+ }
+ if (pid2 == 0) {
+ /* child2 */
+- Str buf = Strnew_size(SAVE_BUF_SIZE);
++ char *buf = NewWithoutGC_N(char, SAVE_BUF_SIZE);
++ int count;
+ FILE *f = NULL;
+
+ setup_child(TRUE, 2, UFfileno(uf));
+ if (tmpf)
+ f = fopen(tmpf, "wb");
+- while (UFread(uf, buf, SAVE_BUF_SIZE)) {
+- if (Strfputs(buf, stdout) < 0)
++ while ((count = ISread_n(uf->stream, buf, SAVE_BUF_SIZE)) > 0) {
++ if (fwrite(buf, 1, count, stdout) != count)
++ break;
++ if (f && fwrite(buf, 1, count, f) != count)
+ break;
+- if (f)
+- Strfputs(buf, f);
+ }
+ UFclose(uf);
+ if (f)
+ fclose(f);
++ xfree(buf);
+ exit(0);
+ }
+ /* child1 */
+@@ -8378,7 +8571,7 @@ lessopen_stream(char *path)
+ }
+ c = getc(fp);
+ if (c == EOF) {
+- fclose(fp);
++ pclose(fp);
+ return NULL;
+ }
+ ungetc(c, fp);
+diff --git a/fm.h b/fm.h
+index 8378939..ede537b 100644
+--- a/fm.h
++++ b/fm.h
+@@ -76,6 +76,7 @@ typedef int wc_ces; /* XXX: not used */
+ #include "textlist.h"
+ #include "funcname1.h"
+ #include "terms.h"
++#include "istream.h"
+
+ #ifndef HAVE_BCOPY
+ void bcopy(const void *, void *, int);
+@@ -264,6 +265,18 @@ extern int REV_LB[];
+ #define IMG_FLAG_ERROR 2
+ #define IMG_FLAG_DONT_REMOVE 4
+
++#define IS_EMPTY_PARSED_URL(pu) ((pu)->scheme == SCM_UNKNOWN && !(pu)->file)
++#define SCONF_RESERVED 0
++#define SCONF_SUBSTITUTE_URL 1
++#define SCONF_URL_CHARSET 2
++#define SCONF_NO_REFERER_FROM 3
++#define SCONF_NO_REFERER_TO 4
++#define SCONF_N_FIELD 5
++#define query_SCONF_SUBSTITUTE_URL(pu) ((const char *)querySiteconf(pu, SCONF_SUBSTITUTE_URL))
++#define query_SCONF_URL_CHARSET(pu) ((const wc_ces *)querySiteconf(pu, SCONF_URL_CHARSET))
++#define query_SCONF_NO_REFERER_FROM(pu) ((const int *)querySiteconf(pu, SCONF_NO_REFERER_FROM))
++#define query_SCONF_NO_REFERER_TO(pu) ((const int *)querySiteconf(pu, SCONF_NO_REFERER_TO))
++
+ /*
+ * Macros.
+ */
+@@ -276,8 +289,6 @@ extern int REV_LB[];
+ #define inputFilenameHist(p,d,h) inputLineHist(p,d,IN_FILENAME,h)
+ #define inputChar(p) inputLine(p,"",IN_CHAR)
+
+-#define free(x) GC_free(x) /* let GC do it. */
+-
+ #ifdef __EMX__
+ #define HAVE_STRCASECMP
+ #define strcasecmp stricmp
+@@ -362,6 +373,8 @@ typedef struct _imageCache {
+ int index;
+ short width;
+ short height;
++ short a_width;
++ short a_height;
+ } ImageCache;
+
+ typedef struct _image {
+@@ -562,6 +575,13 @@ typedef struct _DownloadList {
+ #define INIT_BUFFER_WIDTH ((_INIT_BUFFER_WIDTH > 0) ? _INIT_BUFFER_WIDTH : 0)
+ #define FOLD_BUFFER_WIDTH (FoldLine ? (INIT_BUFFER_WIDTH + 1) : -1)
+
++struct input_alt_attr {
++ int hseq;
++ int fid;
++ int in;
++ Str type, name, value;
++};
++
+ typedef struct {
+ int pos;
+ int len;
+@@ -569,6 +589,7 @@ typedef struct {
+ long flag;
+ Anchor anchor;
+ Str img_alt;
++ struct input_alt_attr input_alt;
+ char fontstat[FONTSTAT_SIZE];
+ short nobr_level;
+ Lineprop prev_ctype;
+@@ -591,6 +612,7 @@ struct readbuffer {
+ short nobr_level;
+ Anchor anchor;
+ Str img_alt;
++ struct input_alt_attr input_alt;
+ char fontstat[FONTSTAT_SIZE];
+ char fontstat_stack[FONT_STACK_SIZE][FONTSTAT_SIZE];
+ int fontstat_sp;
+@@ -802,7 +824,7 @@ global char PermitSaveToPipe init(FALSE);
+ global char DecodeCTE init(FALSE);
+ global char AutoUncompress init(FALSE);
+ global char PreserveTimestamp init(TRUE);
+-global char ArgvIsURL init(FALSE);
++global char ArgvIsURL init(TRUE);
+ global char MetaRefresh init(FALSE);
+
+ global char fmInitialized init(FALSE);
+@@ -874,6 +896,9 @@ global char *index_file init(NULL);
+
+ global char *CurrentDir;
+ global int CurrentPid;
++#if defined(DONT_CALL_GC_AFTER_FORK) && defined(USE_IMAGE)
++global char *MyProgramName init("w3m");
++#endif /* defined(DONT_CALL_GC_AFTER_FORK) && defined(USE_IMAGE) */
+ /*
+ * global Buffer *Currentbuf;
+ * global Buffer *Firstbuf;
+@@ -896,6 +921,7 @@ global char *CurrentKeyData;
+ global char *CurrentCmdData;
+ global char *w3m_reqlog;
+ extern char *w3m_version;
++extern int enable_inline_image;
+
+ #define DUMP_BUFFER 0x01
+ #define DUMP_HEAD 0x02
+@@ -968,10 +994,17 @@ global int MailtoOptions init(MAILTO_OPTIONS_IGNORE);
+ global char *ExtBrowser init(DEF_EXT_BROWSER);
+ global char *ExtBrowser2 init(NULL);
+ global char *ExtBrowser3 init(NULL);
++global char *ExtBrowser4 init(NULL);
++global char *ExtBrowser5 init(NULL);
++global char *ExtBrowser6 init(NULL);
++global char *ExtBrowser7 init(NULL);
++global char *ExtBrowser8 init(NULL);
++global char *ExtBrowser9 init(NULL);
+ global int BackgroundExtViewer init(TRUE);
+ global int disable_secret_security_check init(FALSE);
+ global char *passwd_file init(PASSWD_FILE);
+ global char *pre_form_file init(PRE_FORM_FILE);
++global char *siteconf_file init(SITECONF_FILE);
+ global char *ftppasswd init(NULL);
+ global int ftppass_hostnamegen init(TRUE);
+ global int do_download init(FALSE);
+@@ -991,7 +1024,7 @@ global char *BookmarkFile init(NULL);
+ global int UseExternalDirBuffer init(TRUE);
+ global char *DirBufferCommand init("file:///$LIB/dirlist" CGI_EXTENSION);
+ #ifdef USE_DICT
+-global int UseDictCommand init(FALSE);
++global int UseDictCommand init(TRUE);
+ global char *DictCommand init("file:///$LIB/w3mdict" CGI_EXTENSION);
+ #endif /* USE_DICT */
+ global int ignore_null_img_alt init(TRUE);
+@@ -1004,7 +1037,7 @@ global int FoldLine init(FALSE);
+ #define DEFAULT_URL_EMPTY 0
+ #define DEFAULT_URL_CURRENT 1
+ #define DEFAULT_URL_LINK 2
+-global int DefaultURLString init(DEFAULT_URL_EMPTY);
++global int DefaultURLString init(DEFAULT_URL_CURRENT);
+ global int MarkAllPages init(FALSE);
+
+ #ifdef USE_MIGEMO
+@@ -1065,11 +1098,12 @@ global char SimplePreserveSpace init(FALSE);
+ #define wc_Str_conv(x,charset0,charset1) (x)
+ #define wc_Str_conv_strict(x,charset0,charset1) (x)
+ #endif
+-global char UseAltEntity init(TRUE);
++global char UseAltEntity init(FALSE);
+ #define GRAPHIC_CHAR_ASCII 2
+ #define GRAPHIC_CHAR_DEC 1
+ #define GRAPHIC_CHAR_CHARSET 0
+ global char UseGraphicChar init(GRAPHIC_CHAR_CHARSET);
++global char DisplayBorders init(FALSE);
+ extern char *graph_symbol[];
+ extern char *graph2_symbol[];
+ extern int symbol_width;
+@@ -1113,9 +1147,9 @@ global MouseAction mouse_action;
+
+ #ifdef USE_COOKIE
+ global int default_use_cookie init(TRUE);
+-global int use_cookie init(FALSE);
+-global int show_cookie init(TRUE);
+-global int accept_cookie init(FALSE);
++global int use_cookie init(TRUE);
++global int show_cookie init(FALSE);
++global int accept_cookie init(TRUE);
+ #define ACCEPT_BAD_COOKIE_DISCARD 0
+ #define ACCEPT_BAD_COOKIE_ACCEPT 1
+ #define ACCEPT_BAD_COOKIE_ASK 2
+@@ -1135,7 +1169,7 @@ global int view_unseenobject init(TRUE);
+ #endif
+
+ #if defined(USE_SSL) && defined(USE_SSL_VERIFY)
+-global int ssl_verify_server init(FALSE);
++global int ssl_verify_server init(TRUE);
+ global char *ssl_cert_file init(NULL);
+ global char *ssl_key_file init(NULL);
+ global char *ssl_ca_path init(NULL);
+@@ -1144,15 +1178,17 @@ global int ssl_path_modified init(FALSE);
+ #endif /* defined(USE_SSL) &&
+ * defined(USE_SSL_VERIFY) */
+ #ifdef USE_SSL
+-global char *ssl_forbid_method init(NULL);
++global char *ssl_forbid_method init("2, 3");
+ #endif
+
+ global int is_redisplay init(FALSE);
+ global int clear_buffer init(TRUE);
+ global double pixel_per_char init(DEFAULT_PIXEL_PER_CHAR);
++global int pixel_per_char_i init(DEFAULT_PIXEL_PER_CHAR);
+ global int set_pixel_per_char init(FALSE);
+ #ifdef USE_IMAGE
+ global double pixel_per_line init(DEFAULT_PIXEL_PER_LINE);
++global int pixel_per_line_i init(DEFAULT_PIXEL_PER_LINE);
+ global int set_pixel_per_line init(FALSE);
+ global double image_scale init(100);
+ #endif
+diff --git a/form.c b/form.c
+index b7556ca..de7a4d9 100644
+--- a/form.c
++++ b/form.c
+@@ -10,8 +10,10 @@
+ #include "regex.h"
+
+ extern Str *textarea_str;
++extern int max_textarea;
+ #ifdef MENU_SELECT
+ extern FormSelectOption *select_option;
++extern int max_select;
+ #include "menu.h"
+ #endif /* MENU_SELECT */
+
+@@ -122,10 +124,12 @@ formList_addInput(struct form_list *fl, struct parsed_tag *tag)
+ parsedtag_get_value(tag, ATTR_SIZE, &item->size);
+ parsedtag_get_value(tag, ATTR_MAXLENGTH, &item->maxlength);
+ item->readonly = parsedtag_exists(tag, ATTR_READONLY);
+- if (parsedtag_get_value(tag, ATTR_TEXTAREANUMBER, &i))
++ if (parsedtag_get_value(tag, ATTR_TEXTAREANUMBER, &i)
++ && i >= 0 && i < max_textarea)
+ item->value = item->init_value = textarea_str[i];
+ #ifdef MENU_SELECT
+- if (parsedtag_get_value(tag, ATTR_SELECTNUMBER, &i))
++ if (parsedtag_get_value(tag, ATTR_SELECTNUMBER, &i)
++ && i >= 0 && i < max_select)
+ item->select_option = select_option[i].first;
+ #endif /* MENU_SELECT */
+ if (parsedtag_get_value(tag, ATTR_ROWS, &p))
+@@ -196,7 +200,7 @@ formtype(char *typestr)
+ if (!strcasecmp(typestr, _formtypetbl[i]))
+ return i;
+ }
+- return FORM_UNKNOWN;
++ return FORM_INPUT_TEXT;
+ }
+
+ void
+@@ -438,6 +442,8 @@ formUpdateBuffer(Anchor *a, Buffer *buf, FormItemList *form)
+ switch (form->type) {
+ case FORM_INPUT_CHECKBOX:
+ case FORM_INPUT_RADIO:
++ if (spos >= buf->currentLine->len || spos < 0)
++ break;
+ if (form->checked)
+ buf->currentLine->lineBuf[spos] = '*';
+ else
+@@ -455,8 +461,14 @@ formUpdateBuffer(Anchor *a, Buffer *buf, FormItemList *form)
+ }
+ else
+ #endif /* MENU_SELECT */
++ {
++ if (!form->value)
++ break;
+ p = form->value->ptr;
++ }
+ l = buf->currentLine;
++ if (!l)
++ break;
+ if (form->type == FORM_TEXTAREA) {
+ int n = a->y - buf->currentLine->linenumber;
+ if (n > 0)
+@@ -477,6 +489,8 @@ formUpdateBuffer(Anchor *a, Buffer *buf, FormItemList *form)
+ spos = a->start.pos;
+ epos = a->end.pos;
+ }
++ if (a->start.line != a->end.line || spos > epos || epos >= l->len || spos < 0 || epos < 0)
++ break;
+ pos = form_update_line(l, &p, spos, epos, COLPOS(l, epos) - col,
+ rows > 1,
+ form->type == FORM_INPUT_PASSWORD);
+@@ -787,7 +801,7 @@ struct pre_form {
+ static struct pre_form *PreForm = NULL;
+
+ static struct pre_form *
+-add_pre_form(struct pre_form *prev, char *url, char *name, char *action)
++add_pre_form(struct pre_form *prev, char *url, Regex *re_url, char *name, char *action)
+ {
+ ParsedURL pu;
+ struct pre_form *new;
+@@ -796,21 +810,13 @@ add_pre_form(struct pre_form *prev, char *url, char *name, char *action)
+ new = prev->next = New(struct pre_form);
+ else
+ new = PreForm = New(struct pre_form);
+- if (url && *url == '/') {
+- int l = strlen(url);
+- if (l > 1 && url[l - 1] == '/')
+- new->url = allocStr(url + 1, l - 2);
+- else
+- new->url = url + 1;
+- new->re_url = newRegex(new->url, FALSE, NULL, NULL);
+- if (!new->re_url)
+- new->url = NULL;
+- }
+- else if (url) {
++ if (url && !re_url) {
+ parseURL2(url, &pu, NULL);
+ new->url = parsedURL2Str(&pu)->ptr;
+- new->re_url = NULL;
+ }
++ else
++ new->url = url;
++ new->re_url = re_url;
+ new->name = (name && *name) ? name : NULL;
+ new->action = (action && *action) ? action : NULL;
+ new->item = NULL;
+@@ -834,7 +840,7 @@ add_pre_form_item(struct pre_form *pf, struct pre_form_item *prev, int type,
+ new->name = name;
+ new->value = value;
+ if (checked && *checked && (!strcmp(checked, "0") ||
+- strcasecmp(checked, "off")
++ !strcasecmp(checked, "off")
+ || !strcasecmp(checked, "no")))
+ new->checked = 0;
+ else
+@@ -875,6 +881,7 @@ loadPreForm(void)
+ return;
+ while (1) {
+ char *p, *s, *arg;
++ Regex *re_arg;
+
+ line = Strfgets(fp);
+ if (line->length == 0)
+@@ -890,18 +897,20 @@ loadPreForm(void)
+ if (*p == '#' || *p == '\0')
+ continue; /* comment or empty line */
+ s = getWord(&p);
+- arg = getWord(&p);
+
+ if (!strcmp(s, "url")) {
++ arg = getRegexWord((const char **)&p, &re_arg);
+ if (!arg || !*arg)
+ continue;
+ p = getQWord(&p);
+- pf = add_pre_form(pf, arg, NULL, p);
++ pf = add_pre_form(pf, arg, re_arg, NULL, p);
+ pi = pf->item;
+ continue;
+ }
+ if (!pf)
+ continue;
++
++ arg = getWord(&p);
+ if (!strcmp(s, "form")) {
+ if (!arg || !*arg)
+ continue;
+@@ -913,7 +922,7 @@ loadPreForm(void)
+ }
+ if (pf->item) {
+ struct pre_form *prev = pf;
+- pf = add_pre_form(prev, "", s, p);
++ pf = add_pre_form(prev, "", NULL, s, p);
+ /* copy previous URL */
+ pf->url = prev->url;
+ pf->re_url = prev->re_url;
+diff --git a/frame.c b/frame.c
+index b431437..c595c40 100644
+--- a/frame.c
++++ b/frame.c
+@@ -91,7 +91,8 @@ newFrame(struct parsed_tag *tag, Buffer *buf)
+ body->baseURL = baseURL(buf);
+ if (tag) {
+ if (parsedtag_get_value(tag, ATTR_SRC, &p))
+- body->url = url_quote_conv(remove_space(p), buf->document_charset);
++ body->url = url_encode(remove_space(p), body->baseURL,
++ buf->document_charset);
+ if (parsedtag_get_value(tag, ATTR_NAME, &p) && *p != '_')
+ body->name = url_quote_conv(p, buf->document_charset);
+ }
+@@ -639,7 +640,7 @@ createFrameFile(struct frameset *f, FILE * f1, Buffer *current, int level,
+ case HTML_BASE:
+ /* "BASE" is prohibit tag */
+ if (parsedtag_get_value(tag, ATTR_HREF, &q)) {
+- q = url_quote_conv(remove_space(q), charset);
++ q = url_encode(remove_space(q), NULL, charset);
+ parseURL(q, &base, NULL);
+ }
+ if (parsedtag_get_value(tag, ATTR_TARGET, &q)) {
+@@ -768,8 +769,8 @@ createFrameFile(struct frameset *f, FILE * f1, Buffer *current, int level,
+ if (!tag->value[j])
+ break;
+ tag->value[j] =
+- url_quote_conv(remove_space(tag->value[j]),
+- charset);
++ url_encode(remove_space(tag->value[j]),
++ &base, charset);
+ tag->need_reconstruct = TRUE;
+ parseURL2(tag->value[j], &url, &base);
+ if (url.scheme == SCM_UNKNOWN ||
+@@ -894,8 +895,10 @@ renderFrame(Buffer *Cbuf, int force_reload)
+ /*
+ * if (Cbuf->frameQ != NULL) fset = Cbuf->frameQ->frameset; else */
+ fset = Cbuf->frameset;
+- if (fset == NULL || createFrameFile(fset, f, Cbuf, 0, force_reload) < 0)
++ if (fset == NULL || createFrameFile(fset, f, Cbuf, 0, force_reload) < 0) {
++ fclose(f);
+ return NULL;
++ }
+ fclose(f);
+ flag = RG_FRAME;
+ if ((Cbuf->currentURL).is_nocache)
+diff --git a/ftp.c b/ftp.c
+index 0002abd..2ca0247 100644
+--- a/ftp.c
++++ b/ftp.c
+@@ -123,6 +123,7 @@ static int
+ ftp_login(FTP ftp)
+ {
+ int sock, status;
++ int sock_wf;
+
+ sock = openSocket(ftp->host, "ftp", 21);
+ if (sock < 0)
+@@ -139,7 +140,6 @@ ftp_login(FTP ftp)
+ socklen_t socknamelen = sizeof(sockname);
+
+ if (!getsockname(sock, (struct sockaddr *)&sockname, &socknamelen)) {
+- struct hostent *sockent;
+ Str tmp = Strnew_charp(ftp->pass);
+ #ifdef INET6
+ char hostbuf[NI_MAXHOST];
+@@ -156,6 +156,7 @@ ftp_login(FTP ftp)
+ Strcat_charp(tmp, "unknown");
+ #else
+
++ struct hostent *sockent;
+ if ((sockent = gethostbyaddr((char *)&sockname.sin_addr,
+ sizeof(sockname.sin_addr),
+ sockname.sin_family)))
+@@ -169,7 +170,10 @@ ftp_login(FTP ftp)
+ }
+ }
+ ftp->rf = newInputStream(sock);
+- ftp->wf = fdopen(dup(sock), "wb");
++ if ((sock_wf = dup(sock)) >= 0 )
++ ftp->wf = fdopen(sock_wf, "wb");
++ else
++ goto open_err;
+ if (!ftp->rf || !ftp->wf)
+ goto open_err;
+ IStype(ftp->rf) |= IST_UNCLOSE;
+diff --git a/func.c b/func.c
+index f389e00..8b5deac 100644
+--- a/func.c
++++ b/func.c
+@@ -8,6 +8,7 @@
+ #include "fm.h"
+ #include "func.h"
+ #include "myctype.h"
++#include "regex.h"
+
+ #include "funcname.c"
+ #include "functable.c"
+@@ -434,6 +435,93 @@ getQWord(char **str)
+ return tmp->ptr;
+ }
+
++/* This extracts /regex/i or m@regex@i from the given string.
++ * Then advances *str to the end of regex.
++ * If the input does not seems to be a regex, this falls back to getQWord().
++ *
++ * Returns a word (no matter whether regex or not) in the give string.
++ * If regex_ret is non-NULL, compiles the regex and stores there.
++ *
++ * XXX: Actually this is unrelated to func.c.
++ */
++char *
++getRegexWord(const char **str, Regex **regex_ret)
++{
++ char *word = NULL;
++ const char *p, *headp, *bodyp, *tailp;
++ char delimiter;
++ int esc;
++ int igncase = 0;
++
++ p = *str;
++ SKIP_BLANKS(p);
++ headp = p;
++
++ /* Get the opening delimiter */
++ if (p[0] == 'm' && IS_PRINT(p[1]) && !IS_ALNUM(p[1]) && p[1] != '\\') {
++ delimiter = p[1];
++ p += 2;
++ }
++ else if (p[0] == '/') {
++ delimiter = '/';
++ p += 1;
++ }
++ else {
++ goto not_regex;
++ }
++ bodyp = p;
++
++ /* Scan the end of the expression */
++ for (esc = 0; *p; ++p) {
++ if (esc) {
++ esc = 0;
++ } else {
++ if (*p == delimiter)
++ break;
++ else if (*p == '\\')
++ esc = 1;
++ }
++ }
++ if (!*p && *headp == '/')
++ goto not_regex;
++ tailp = p;
++
++ /* Check the modifiers */
++ if (*p == delimiter) {
++ while (*++p && !IS_SPACE(*p)) {
++ switch (*p) {
++ case 'i':
++ igncase = 1;
++ break;
++ }
++ /* ignore unknown modifiers */
++ }
++ }
++
++ /* Save the expression */
++ word = allocStr(headp, p - headp);
++
++ /* Compile */
++ if (regex_ret) {
++ if (*tailp == delimiter)
++ word[tailp - headp] = 0;
++ *regex_ret = newRegex(word + (bodyp - headp), igncase, NULL, NULL);
++ if (*tailp == delimiter)
++ word[tailp - headp] = delimiter;
++ }
++ goto last;
++
++not_regex:
++ p = headp;
++ word = getQWord((char **)&p);
++ if (regex_ret)
++ *regex_ret = NULL;
++
++last:
++ *str = p;
++ return word;
++}
++
+ #ifdef USE_MOUSE
+ static MouseAction default_mouse_action = {
+ NULL,
+diff --git a/history.c b/history.c
+index 951ef83..f2a00b4 100644
+--- a/history.c
++++ b/history.c
+@@ -17,7 +17,7 @@ historyBuffer(Hist *hist)
+ for (item = hist->list->last; item; item = item->prev) {
+ q = html_quote((char *)item->ptr);
+ if (DecodeURL)
+- p = html_quote(url_unquote_conv((char *)item->ptr, 0));
++ p = html_quote(url_decode2((char *)item->ptr, NULL));
+ else
+ p = q;
+ Strcat_charp(src, "<li><a href=\"");
+@@ -60,6 +60,7 @@ saveHistory(Hist *hist, size_t size)
+ FILE *f;
+ HistItem *item;
+ char *tmpf;
++ int rename_ret;
+
+ if (hist == NULL || hist->list == NULL)
+ return;
+@@ -79,7 +80,11 @@ saveHistory(Hist *hist, size_t size)
+ disp_err_message("Can't save history", FALSE);
+ return;
+ }
+- rename(tmpf, rcFile(HISTORY_FILE));
++ rename_ret = rename(tmpf, rcFile(HISTORY_FILE));
++ if (rename_ret != 0) {
++ disp_err_message("Can't save history", FALSE);
++ return;
++ }
+ }
+ #endif /* USE_HISTORY */
+
+diff --git a/html.c b/html.c
+index bca227e..d9f08e9 100644
+--- a/html.c
++++ b/html.c
+@@ -56,6 +56,9 @@ unsigned char ALST_INPUT[] =
+ ATTR_CORE
+ };
+ #define MAXA_INPUT MAXA_CORE + 12
++unsigned char ALST_BUTTON[] =
++ { ATTR_TYPE, ATTR_VALUE, ATTR_NAME, ATTR_CORE };
++#define MAXA_BUTTON MAXA_CORE + 3
+ unsigned char ALST_TEXTAREA[] =
+ { ATTR_COLS, ATTR_ROWS, ATTR_NAME, ATTR_READONLY, ATTR_CORE };
+ #define MAXA_TEXTAREA MAXA_CORE + 4
+@@ -247,24 +250,24 @@ TagInfo TagMAP[MAX_HTMLTAG] = {
+ {"/bdo", NULL, 0, TFLG_END}, /* 121 HTML_N_BDO */
+ {"big", ALST_NOP, MAXA_NOP, 0}, /* 122 HTML_BIG */
+ {"/big", NULL, 0, TFLG_END}, /* 123 HTML_N_BIG */
+- {"button", ALST_NOP, MAXA_NOP, 0}, /* 124 HTML_BUTTON */
+- {"fieldset", ALST_NOP, MAXA_NOP, 0}, /* 125 HTML_FIELDSET */
+- {"/fieldset", NULL, 0, TFLG_END}, /* 126 HTML_N_FIELDSET */
+- {"iframe", ALST_NOP, MAXA_NOP, 0}, /* 127 HTML_IFRAME */
+- {"label", ALST_NOP, MAXA_NOP, 0}, /* 128 HTML_LABEL */
+- {"/label", NULL, 0, TFLG_END}, /* 129 HTML_N_LABEL */
+- {"legend", ALST_NOP, MAXA_NOP, 0}, /* 130 HTML_LEGEND */
+- {"/legend", NULL, 0, TFLG_END}, /* 131 HTML_N_LEGEND */
+- {"noscript", ALST_NOP, MAXA_NOP, 0}, /* 132 HTML_NOSCRIPT */
+- {"/noscript", NULL, 0, TFLG_END}, /* 133 HTML_N_NOSCRIPT */
+- {"object", ALST_NOP, MAXA_NOP, 0}, /* 134 HTML_OBJECT */
+- {"optgroup", ALST_NOP, MAXA_NOP, 0}, /* 135 HTML_OPTGROUP */
+- {"/optgroup", NULL, 0, TFLG_END}, /* 136 HTML_N_OPTGROUP */
+- {"param", ALST_NOP, MAXA_NOP, 0}, /* 137 HTML_PARAM */
+- {"small", ALST_NOP, MAXA_NOP, 0}, /* 138 HTML_SMALL */
+- {"/small", NULL, 0, TFLG_END}, /* 139 HTML_N_SMALL */
++ {"button", ALST_BUTTON, MAXA_BUTTON, 0}, /* 124 HTML_BUTTON */
++ {"/button", NULL, 0, TFLG_END}, /* 125 HTML_N_BUTTON */
++ {"fieldset", ALST_NOP, MAXA_NOP, 0}, /* 126 HTML_FIELDSET */
++ {"/fieldset", NULL, 0, TFLG_END}, /* 127 HTML_N_FIELDSET */
++ {"iframe", ALST_NOP, MAXA_NOP, 0}, /* 128 HTML_IFRAME */
++ {"label", ALST_NOP, MAXA_NOP, 0}, /* 129 HTML_LABEL */
++ {"/label", NULL, 0, TFLG_END}, /* 130 HTML_N_LABEL */
++ {"legend", ALST_NOP, MAXA_NOP, 0}, /* 131 HTML_LEGEND */
++ {"/legend", NULL, 0, TFLG_END}, /* 132 HTML_N_LEGEND */
++ {"noscript", ALST_NOP, MAXA_NOP, 0}, /* 133 HTML_NOSCRIPT */
++ {"/noscript", NULL, 0, TFLG_END}, /* 134 HTML_N_NOSCRIPT */
++ {"object", ALST_NOP, MAXA_NOP, 0}, /* 135 HTML_OBJECT */
++ {"optgroup", ALST_NOP, MAXA_NOP, 0}, /* 136 HTML_OPTGROUP */
++ {"/optgroup", NULL, 0, TFLG_END}, /* 137 HTML_N_OPTGROUP */
++ {"param", ALST_NOP, MAXA_NOP, 0}, /* 138 HTML_PARAM */
++ {"small", ALST_NOP, MAXA_NOP, 0}, /* 139 HTML_SMALL */
++ {"/small", NULL, 0, TFLG_END}, /* 140 HTML_N_SMALL */
+
+- {NULL, NULL, 0, 0}, /* 140 Undefined */
+ {NULL, NULL, 0, 0}, /* 141 Undefined */
+ {NULL, NULL, 0, 0}, /* 142 Undefined */
+ {NULL, NULL, 0, 0}, /* 143 Undefined */
+diff --git a/html.h b/html.h
+index 7abbd3b..c490655 100644
+--- a/html.h
++++ b/html.h
+@@ -1,20 +1,18 @@
+ /* $Id: html.h,v 1.31 2010/08/14 01:29:40 htrb Exp $ */
+ #ifndef _HTML_H
+ #define _HTML_H
++#include "config.h"
+ #ifdef USE_SSL
+ #include <openssl/bio.h>
+ #include <openssl/x509.h>
+ #include <openssl/ssl.h>
+ #endif /* USE_SSL */
+
+-#include "istream.h"
+-
+ #define StrUFgets(f) StrISgets((f)->stream)
+ #define StrmyUFgets(f) StrmyISgets((f)->stream)
+ #define UFgetc(f) ISgetc((f)->stream)
+ #define UFundogetc(f) ISundogetc((f)->stream)
+-#define UFread(f,buf,len) ISread((f)->stream,buf,len)
+-#define UFclose(f) (void)(ISclose((f)->stream) == 0 && ((f)->stream = NULL))
++#define UFclose(f) if (ISclose((f)->stream) == 0) {(f)->stream = NULL ;}
+ #define UFfileno(f) ISfileno((f)->stream)
+
+ struct cmdtable {
+@@ -62,11 +60,12 @@ typedef struct _ParsedURL {
+ int is_nocache;
+ } ParsedURL;
+
++union input_stream;
+ typedef struct {
+ unsigned char scheme;
+ char is_cgi;
+ char encoding;
+- InputStream stream;
++ union input_stream *stream;
+ char *ext;
+ int compression;
+ int content_encoding;
+@@ -214,21 +213,22 @@ typedef struct {
+ #define HTML_BIG 122
+ #define HTML_N_BIG 123
+ #define HTML_BUTTON 124
+-#define HTML_FIELDSET 125
+-#define HTML_N_FIELDSET 126
+-#define HTML_IFRAME 127
+-#define HTML_LABEL 128
+-#define HTML_N_LABEL 129
+-#define HTML_LEGEND 130
+-#define HTML_N_LEGEND 131
+-#define HTML_NOSCRIPT 132
+-#define HTML_N_NOSCRIPT 133
+-#define HTML_OBJECT 134
+-#define HTML_OPTGROUP 135
+-#define HTML_N_OPTGROUP 136
+-#define HTML_PARAM 137
+-#define HTML_SMALL 138
+-#define HTML_N_SMALL 139
++#define HTML_N_BUTTON 125
++#define HTML_FIELDSET 126
++#define HTML_N_FIELDSET 127
++#define HTML_IFRAME 128
++#define HTML_LABEL 129
++#define HTML_N_LABEL 130
++#define HTML_LEGEND 131
++#define HTML_N_LEGEND 132
++#define HTML_NOSCRIPT 133
++#define HTML_N_NOSCRIPT 134
++#define HTML_OBJECT 135
++#define HTML_OPTGROUP 136
++#define HTML_N_OPTGROUP 137
++#define HTML_PARAM 138
++#define HTML_SMALL 139
++#define HTML_N_SMALL 140
+
+ /* pseudo tag */
+ #define HTML_SELECT_INT 160
+diff --git a/image.c b/image.c
+index 5f5991a..91034ee 100644
+--- a/image.c
++++ b/image.c
+@@ -44,6 +44,8 @@ initImage()
+ activeImage = TRUE;
+ }
+
++int get_pixel_per_cell(int *ppc, int *ppl);
++
+ int
+ getCharSize()
+ {
+@@ -52,6 +54,24 @@ getCharSize()
+ int w = 0, h = 0;
+
+ set_environ("W3M_TTY", ttyname_tty());
++
++ if (enable_inline_image) {
++ int ppc, ppl;
++
++ if (get_pixel_per_cell(&ppc,&ppl)) {
++ pixel_per_char_i = ppc ;
++ pixel_per_line_i = ppl ;
++ pixel_per_char = (double)ppc;
++ pixel_per_line = (double)ppl;
++ }
++ else {
++ pixel_per_char_i = (int)pixel_per_char;
++ pixel_per_line_i = (int)pixel_per_line;
++ }
++
++ return TRUE;
++ }
++
+ tmp = Strnew();
+ if (!strchr(Imgdisplay, '/'))
+ Strcat_m_charp(tmp, w3m_auxbin_dir(), "/", NULL);
+@@ -90,17 +110,18 @@ termImage()
+ static int
+ openImgdisplay()
+ {
++ char *cmd;
++
++ if (!strchr(Imgdisplay, '/'))
++ cmd = Strnew_m_charp(w3m_auxbin_dir(), "/", Imgdisplay, NULL)->ptr;
++ else
++ cmd = Imgdisplay;
+ Imgdisplay_pid = open_pipe_rw(&Imgdisplay_rf, &Imgdisplay_wf);
+ if (Imgdisplay_pid < 0)
+ goto err0;
+ if (Imgdisplay_pid == 0) {
+ /* child */
+- char *cmd;
+ setup_child(FALSE, 2, -1);
+- if (!strchr(Imgdisplay, '/'))
+- cmd = Strnew_m_charp(w3m_auxbin_dir(), "/", Imgdisplay, NULL)->ptr;
+- else
+- cmd = Imgdisplay;
+ myExec(cmd);
+ /* XXX: ifdef __EMX__, use start /f ? */
+ }
+@@ -155,6 +176,10 @@ addImage(ImageCache * cache, int x, int y, int sx, int sy, int w, int h)
+ static void
+ syncImage(void)
+ {
++ if (enable_inline_image) {
++ return;
++ }
++
+ fputs("3;\n", Imgdisplay_wf); /* XSync() */
+ fputs("4;\n", Imgdisplay_wf); /* put '\n' */
+ while (fflush(Imgdisplay_wf) != 0) {
+@@ -170,12 +195,16 @@ syncImage(void)
+ n_terminal_image = 0;
+ }
+
++void put_image_osc5379(char *url, int x, int y, int w, int h, int sx, int sy, int sw, int sh, int n_terminal_image);
++void put_image_sixel(char *url, int x, int y, int w, int h, int sx, int sy, int sw, int sh, int n_terminal_image);
++
+ void
+ drawImage()
+ {
+ static char buf[64];
+ int j, draw = FALSE;
+ TerminalImage *i;
++ struct stat st ;
+
+ if (!activeImage)
+ return;
+@@ -183,6 +212,47 @@ drawImage()
+ return;
+ for (j = 0; j < n_terminal_image; j++) {
+ i = &terminal_image[j];
++
++ if (enable_inline_image) {
++ #if 0
++ fprintf(stderr,"file %s x %d y %d w %d h %d sx %d sy %d sw %d sh %d (ppc %d ppl %d)\n",
++ ((enable_inline_image == 2 || getenv("WINDOWID")) &&
++ i->cache->touch) ? i->cache->file : i->cache->url,
++ i->x, i->y,
++ i->cache->width > 0 ? i->cache->width : 0,
++ i->cache->height > 0 ? i->cache->height : 0,
++ i->sx, i->sy, i->width, i->height,
++ pixel_per_char_i, pixel_per_line_i);
++ #endif
++ (enable_inline_image == 2 ? put_image_sixel : put_image_osc5379)(
++ ((enable_inline_image == 2 /* sixel */ || getenv("WINDOWID")) &&
++ /* XXX I don't know why but sometimes i->cache->file doesn't exist. */
++ i->cache->touch && stat(i->cache->file,&st) == 0) ?
++ /* local */ i->cache->file : /* remote */ i->cache->url,
++ i->x / pixel_per_char_i,
++ i->y / pixel_per_line_i,
++ #if 1
++ i->cache->a_width > 0 ?
++ (i->cache->width + i->x % pixel_per_char_i + pixel_per_char_i - 1) /
++ pixel_per_char_i :
++ #endif
++ 0,
++
++ #if 1
++ i->cache->a_height > 0 ?
++ (i->cache->height + i->y % pixel_per_line_i + pixel_per_line_i - 1) /
++ pixel_per_line_i :
++ #endif
++ 0,
++ i->sx / pixel_per_char_i,
++ i->sy / pixel_per_line_i,
++ (i->width + i->sx % pixel_per_char_i + pixel_per_char_i - 1) / pixel_per_char_i,
++ (i->height + i->sy % pixel_per_line_i + pixel_per_line_i - 1) / pixel_per_line_i,
++ n_terminal_image);
++
++ continue ;
++ }
++
+ if (!(i->cache->loaded & IMG_FLAG_LOADED &&
+ i->width > 0 && i->height > 0))
+ continue;
+@@ -206,9 +276,15 @@ drawImage()
+ fputs("\n", Imgdisplay_wf);
+ draw = TRUE;
+ }
+- if (!draw)
+- return;
+- syncImage();
++
++ if (!enable_inline_image) {
++ if (!draw)
++ return;
++ syncImage();
++ }
++ else
++ n_terminal_image = 0;
++
+ touch_cursor();
+ refresh();
+ }
+@@ -320,6 +396,8 @@ showImageProgress(Buffer *buf)
+ }
+ }
+ if (n) {
++ if (enable_inline_image && n == l)
++ drawImage();
+ message(Sprintf("%d/%d images loaded", l, n)->ptr,
+ buf->cursorX + buf->rootX, buf->cursorY + buf->rootY);
+ refresh();
+@@ -333,6 +411,9 @@ loadImage(Buffer *buf, int flag)
+ struct stat st;
+ int i, draw = FALSE;
+ /* int wait_st; */
++#ifdef DONT_CALL_GC_AFTER_FORK
++ char *loadargs[7];
++#endif
+
+ if (maxLoadImage > MAX_LOAD_IMAGE)
+ maxLoadImage = MAX_LOAD_IMAGE;
+@@ -346,7 +427,7 @@ loadImage(Buffer *buf, int flag)
+ }
+ for (i = 0; i < n_load_image; i++) {
+ cache = image_cache[i];
+- if (!cache)
++ if (!cache || !cache->touch)
+ continue;
+ if (lstat(cache->touch, &st))
+ continue;
+@@ -377,7 +458,7 @@ loadImage(Buffer *buf, int flag)
+
+ for (i = (buf != image_buffer) ? 0 : maxLoadImage; i < n_load_image; i++) {
+ cache = image_cache[i];
+- if (!cache)
++ if (!cache || !cache->touch)
+ continue;
+ if (cache->pid) {
+ kill(cache->pid, SIGKILL);
+@@ -403,7 +484,8 @@ loadImage(Buffer *buf, int flag)
+ }
+
+ if (draw && image_buffer) {
+- drawImage();
++ if (!enable_inline_image)
++ drawImage();
+ showImageProgress(image_buffer);
+ }
+
+@@ -431,8 +513,29 @@ loadImage(Buffer *buf, int flag)
+ break;
+ }
+ image_cache[i] = cache;
++ if (!cache->touch) {
++ continue;
++ }
+
+ flush_tty();
++#ifdef DONT_CALL_GC_AFTER_FORK
++ loadargs[0] = MyProgramName;
++ loadargs[1] = "-$$getimage";
++ loadargs[2] = conv_to_system(cache->url);
++ loadargs[3] = conv_to_system(parsedURL2Str(cache->current)->ptr);
++ loadargs[4] = cache->file;
++ loadargs[5] = cache->touch;
++ loadargs[6] = NULL;
++ if ((cache->pid = fork()) == 0) {
++ setup_child(FALSE, 0, -1);
++ execvp(MyProgramName, loadargs);
++ exit(1);
++ }
++ else if (cache->pid < 0) {
++ cache->pid = 0;
++ return;
++ }
++#else /* !DONT_CALL_GC_AFTER_FORK */
+ if ((cache->pid = fork()) == 0) {
+ Buffer *b;
+ /*
+@@ -458,6 +561,7 @@ loadImage(Buffer *buf, int flag)
+ cache->pid = 0;
+ return;
+ }
++#endif /* !DONT_CALL_GC_AFTER_FORK */
+ }
+ }
+
+@@ -492,12 +596,30 @@ getImage(Image * image, ParsedURL *current, int flag)
+ cache->url = image->url;
+ cache->current = current;
+ cache->file = tmpfname(TMPF_DFL, image->ext)->ptr;
+- cache->touch = tmpfname(TMPF_DFL, NULL)->ptr;
+ cache->pid = 0;
+ cache->index = 0;
+ cache->loaded = IMG_FLAG_UNLOADED;
+- cache->width = image->width;
+- cache->height = image->height;
++ if (enable_inline_image == 1) {
++ if (image->width > 0 && image->width % pixel_per_char_i > 0)
++ image->width += (pixel_per_char_i - image->width % pixel_per_char_i);
++
++ if (image->height > 0 && image->height % pixel_per_line_i > 0)
++ image->height += (pixel_per_line_i - image->height % pixel_per_line_i);
++ if (image->height > 0 && image->width > 0) {
++ cache->loaded = IMG_FLAG_LOADED;
++ }
++ }
++ if (cache->loaded == IMG_FLAG_UNLOADED) {
++ cache->touch = tmpfname(TMPF_DFL, NULL)->ptr;
++ }
++ else {
++ cache->touch = NULL;
++ }
++
++ cache->width = image->width ;
++ cache->height = image->height ;
++ cache->a_width = image->width;
++ cache->a_height = image->height;
+ putHash_sv(image_hash, key->ptr, (void *)cache);
+ }
+ if (flag != IMG_FLAG_SKIP) {
+@@ -519,6 +641,78 @@ getImage(Image * image, ParsedURL *current, int flag)
+ return cache;
+ }
+
++static int
++parseImageHeader(char *path, u_int *width, u_int *height)
++{
++ FILE *fp;
++ u_char buf[8];
++
++ if (!(fp = fopen(path, "r"))) return FALSE;
++
++ if (fread(buf, 1, 2, fp) != 2) goto error;
++
++ if (memcmp(buf, "\xff\xd8", 2) == 0) {
++ /* JPEG */
++ if (fseek(fp, 2, SEEK_CUR) < 0) goto error; /* 0xffe0 */
++ while (fread(buf, 1, 2, fp) == 2) {
++ size_t len = ((buf[0] << 8) | buf[1]) - 2;
++ if (fseek(fp, len, SEEK_CUR) < 0) goto error;
++ if (fread(buf, 1, 2, fp) == 2 &&
++ /* SOF0 or SOF2 */
++ (memcmp(buf, "\xff\xc0", 2) == 0 || memcmp(buf, "\xff\xc2", 2) == 0)) {
++ fseek(fp, 3, SEEK_CUR);
++ if (fread(buf, 1, 2, fp) == 2) {
++ *height = (buf[0] << 8) | buf[1];
++ if (fread(buf, 1, 2, fp) == 2) {
++ *width = (buf[0] << 8) | buf[1];
++ goto success;
++ }
++ }
++ break;
++ }
++ }
++ goto error;
++ }
++
++ if (fread(buf + 2, 1, 1, fp) != 1) goto error;
++
++ if (memcmp(buf, "GIF", 3) == 0) {
++ /* GIF */
++ if (fseek(fp, 3, SEEK_CUR) < 0) goto error;
++ if (fread(buf, 1, 2, fp) == 2) {
++ *width = (buf[1] << 8) | buf[0];
++ if (fread(buf, 1, 2, fp) == 2) {
++ *height = (buf[1] << 8) | buf[0];
++ goto success;
++ }
++ }
++ goto error;
++ }
++
++ if (fread(buf + 3, 1, 5, fp) != 5) goto error;
++
++ if (memcmp(buf, "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a", 8) == 0) {
++ /* PNG */
++ if (fseek(fp, 8, SEEK_CUR) < 0) goto error;
++ if (fread(buf, 1, 4, fp) == 4) {
++ *width = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
++ if (fread(buf, 1, 4, fp) == 4) {
++ *height = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
++ goto success;
++ }
++ }
++ goto error;
++ }
++
++error:
++ fclose(fp);
++ return FALSE;
++
++success:
++ fclose(fp);
++ return TRUE;
++}
++
+ int
+ getImageSize(ImageCache * cache)
+ {
+@@ -531,6 +725,10 @@ getImageSize(ImageCache * cache)
+ if (!cache || !(cache->loaded & IMG_FLAG_LOADED) ||
+ (cache->width > 0 && cache->height > 0))
+ return FALSE;
++
++ if (parseImageHeader(cache->file, &w, &h))
++ goto got_image_size;
++
+ tmp = Strnew();
+ if (!strchr(Imgdisplay, '/'))
+ Strcat_m_charp(tmp, w3m_auxbin_dir(), "/", NULL);
+@@ -546,6 +744,8 @@ getImageSize(ImageCache * cache)
+
+ if (!(w > 0 && h > 0))
+ return FALSE;
++
++got_image_size:
+ w = (int)(w * image_scale / 100 + 0.5);
+ if (w == 0)
+ w = 1;
+@@ -558,11 +758,11 @@ getImageSize(ImageCache * cache)
+ }
+ else if (cache->width < 0) {
+ int tmp = (int)((double)cache->height * w / h + 0.5);
+- cache->width = (tmp > MAX_IMAGE_SIZE) ? MAX_IMAGE_SIZE : tmp;
++ cache->a_width = cache->width = (tmp > MAX_IMAGE_SIZE) ? MAX_IMAGE_SIZE : tmp;
+ }
+ else if (cache->height < 0) {
+ int tmp = (int)((double)cache->width * h / w + 0.5);
+- cache->height = (tmp > MAX_IMAGE_SIZE) ? MAX_IMAGE_SIZE : tmp;
++ cache->a_height = cache->height = (tmp > MAX_IMAGE_SIZE) ? MAX_IMAGE_SIZE : tmp;
+ }
+ if (cache->width == 0)
+ cache->width = 1;
+diff --git a/indep.c b/indep.c
+index 65b04aa..5c5de06 100644
+--- a/indep.c
++++ b/indep.c
+@@ -357,6 +357,20 @@ strcasemstr(char *str, char *srch[], char **ret_ptr)
+ return -1;
+ }
+
++int
++strmatchlen(const char *s1, const char *s2, int maxlen)
++{
++ int i;
++
++ /* To allow the maxlen to be negatie (infinity),
++ * compare by "!=" instead of "<=". */
++ for (i = 0; i != maxlen; ++i) {
++ if (!s1[i] || !s2[i] || s1[i] != s2[i])
++ break;
++ }
++ return i;
++}
++
+ char *
+ remove_space(char *str)
+ {
+@@ -707,6 +721,111 @@ shell_quote(char *str)
+ return str;
+ }
+
++void *
++xrealloc(void *ptr, size_t size)
++{
++ void *newptr = realloc(ptr, size);
++ if (newptr == NULL) {
++ fprintf(stderr, "Out of memory\n");
++ exit(-1);
++ }
++ return newptr;
++}
++
++/* Define this as a separate function in case the free() has
++ * an incompatible prototype. */
++void
++xfree(void *ptr)
++{
++ free(ptr);
++}
++
++void *
++w3m_GC_realloc_atomic(void *ptr, size_t size)
++{
++ return ptr ? GC_REALLOC(ptr, size) : GC_MALLOC_ATOMIC(size);
++}
++
++void
++w3m_GC_free(void *ptr)
++{
++ GC_FREE(ptr);
++}
++
++void
++growbuf_init(struct growbuf *gb)
++{
++ gb->ptr = NULL;
++ gb->length = 0;
++ gb->area_size = 0;
++ gb->realloc_proc = &w3m_GC_realloc_atomic;
++ gb->free_proc = &w3m_GC_free;
++}
++
++void
++growbuf_init_without_GC(struct growbuf *gb)
++{
++ gb->ptr = NULL;
++ gb->length = 0;
++ gb->area_size = 0;
++ gb->realloc_proc = &xrealloc;
++ gb->free_proc = &xfree;
++}
++
++void
++growbuf_clear(struct growbuf *gb)
++{
++ (*gb->free_proc) (gb->ptr);
++ gb->ptr = NULL;
++ gb->length = 0;
++ gb->area_size = 0;
++}
++
++Str
++growbuf_to_Str(struct growbuf *gb)
++{
++ Str s;
++
++ if (gb->free_proc == &w3m_GC_free) {
++ growbuf_reserve(gb, gb->length + 1);
++ gb->ptr[gb->length] = '\0';
++ s = New(struct _Str);
++ s->ptr = gb->ptr;
++ s->length = gb->length;
++ s->area_size = gb->area_size;
++ } else {
++ s = Strnew_charp_n(gb->ptr, gb->length);
++ (*gb->free_proc) (gb->ptr);
++ }
++ gb->ptr = NULL;
++ gb->length = 0;
++ gb->area_size = 0;
++ return s;
++}
++
++void
++growbuf_reserve(struct growbuf *gb, int leastarea)
++{
++ int newarea;
++
++ if (gb->area_size < leastarea) {
++ newarea = gb->area_size * 3 / 2;
++ if (newarea < leastarea)
++ newarea = leastarea;
++ newarea += 16;
++ gb->ptr = (*gb->realloc_proc) (gb->ptr, newarea);
++ gb->area_size = newarea;
++ }
++}
++
++void
++growbuf_append(struct growbuf *gb, const char *src, int len)
++{
++ growbuf_reserve(gb, gb->length + len);
++ memcpy(&gb->ptr[gb->length], src, len);
++ gb->length += len;
++}
++
+ static char *
+ w3m_dir(const char *name, char *dft)
+ {
+diff --git a/indep.h b/indep.h
+index b3819a3..2809832 100644
+--- a/indep.h
++++ b/indep.h
+@@ -1,7 +1,7 @@
+ /* $Id: indep.h,v 1.16 2003/09/22 21:02:19 ukai Exp $ */
+ #ifndef INDEP_H
+ #define INDEP_H
+-#include <gc.h>
++#include "alloc.h"
+ #include "Str.h"
+ #include "config.h"
+
+@@ -12,6 +12,14 @@
+ #define FALSE 0
+ #endif /* FALSE */
+
++struct growbuf {
++ char *ptr;
++ int length;
++ int area_size;
++ void *(*realloc_proc) (void *, size_t);
++ void (*free_proc) (void *);
++};
++
+ #define RAW_MODE 0
+ #define PAGER_MODE 1
+ #define HTML_MODE 2
+@@ -52,6 +60,7 @@ extern int strncasecmp(const char *s1, const char *s2, size_t n);
+ extern char *strcasestr(const char *s1, const char *s2);
+ #endif
+ extern int strcasemstr(char *str, char *srch[], char **ret_ptr);
++int strmatchlen(const char *s1, const char *s2, int maxlen);
+ extern char *remove_space(char *str);
+ extern int non_null(char *s);
+ extern void cleanup_line(Str s, int mode);
+@@ -64,6 +73,18 @@ extern Str Str_url_unquote(Str x, int is_form, int safe);
+ extern Str Str_form_quote(Str x);
+ #define Str_form_unquote(x) Str_url_unquote((x), TRUE, FALSE)
+ extern char *shell_quote(char *str);
++#define xmalloc(s) xrealloc(NULL, s)
++extern void *xrealloc(void *ptr, size_t size);
++extern void xfree(void *ptr);
++extern void *w3m_GC_realloc_atomic(void *ptr, size_t size);
++extern void w3m_GC_free(void *ptr);
++extern void growbuf_init(struct growbuf *gb);
++extern void growbuf_init_without_GC(struct growbuf *gb);
++extern void growbuf_clear(struct growbuf *gb);
++extern Str growbuf_to_Str(struct growbuf *gb);
++extern void growbuf_reserve(struct growbuf *gb, int leastarea);
++extern void growbuf_append(struct growbuf *gb, const char *src, int len);
++#define GROWBUF_ADD_CHAR(gb,ch) ((((gb)->length>=(gb)->area_size)?growbuf_reserve(gb,(gb)->length+1):(void)0),(void)((gb)->ptr[(gb)->length++] = (ch)))
+
+ extern char *w3m_auxbin_dir();
+ extern char *w3m_lib_dir();
+@@ -71,10 +92,8 @@ extern char *w3m_etc_dir();
+ extern char *w3m_conf_dir();
+ extern char *w3m_help_dir();
+
+-#define New(type) ((type*)GC_MALLOC(sizeof(type)))
+-#define NewAtom(type) ((type*)GC_MALLOC_ATOMIC(sizeof(type)))
+-#define New_N(type,n) ((type*)GC_MALLOC((n)*sizeof(type)))
+-#define NewAtom_N(type,n) ((type*)GC_MALLOC_ATOMIC((n)*sizeof(type)))
+-#define New_Reuse(type,ptr,n) ((type*)GC_REALLOC((ptr),(n)*sizeof(type)))
++#define NewWithoutGC(type) ((type*)xmalloc(sizeof(type)))
++#define NewWithoutGC_N(type,n) ((type*)xmalloc((n)*sizeof(type)))
++#define NewWithoutGC_Reuse(type,ptr,n) ((type*)xrealloc(ptr,(n)*sizeof(type)))
+
+ #endif /* INDEP_H */
+diff --git a/istream.c b/istream.c
+index 8967280..1387307 100644
+--- a/istream.c
++++ b/istream.c
+@@ -22,8 +22,8 @@
+ static void basic_close(int *handle);
+ static int basic_read(int *handle, char *buf, int len);
+
+-static void file_close(struct file_handle *handle);
+-static int file_read(struct file_handle *handle, char *buf, int len);
++static void file_close(struct io_file_handle *handle);
++static int file_read(struct io_file_handle *handle, char *buf, int len);
+
+ static int str_read(Str handle, char *buf, int len);
+
+@@ -35,12 +35,14 @@ static int ssl_read(struct ssl_handle *handle, char *buf, int len);
+ static int ens_read(struct ens_handle *handle, char *buf, int len);
+ static void ens_close(struct ens_handle *handle);
+
++static void memchop(char *p, int *len);
++
+ static void
+ do_update(BaseStream base)
+ {
+ int len;
+ base->stream.cur = base->stream.next = 0;
+- len = base->read(base->handle, base->stream.buf, base->stream.size);
++ len = (*base->read) (base->handle, base->stream.buf, base->stream.size);
+ if (len <= 0)
+ base->iseos = TRUE;
+ else
+@@ -66,12 +68,12 @@ init_buffer(BaseStream base, char *buf, int bufsize)
+ StreamBuffer sb = &base->stream;
+ sb->size = bufsize;
+ sb->cur = 0;
++ sb->buf = NewWithoutGC_N(uchar, bufsize);
+ if (buf) {
+- sb->buf = (uchar *) buf;
++ memcpy(sb->buf, buf, bufsize);
+ sb->next = bufsize;
+ }
+ else {
+- sb->buf = NewAtom_N(uchar, bufsize);
+ sb->next = 0;
+ }
+ base->iseos = FALSE;
+@@ -95,10 +97,10 @@ newInputStream(int des)
+ InputStream stream;
+ if (des < 0)
+ return NULL;
+- stream = New(union input_stream);
++ stream = NewWithoutGC(union input_stream);
+ init_base_stream(&stream->base, STREAM_BUF_SIZE);
+ stream->base.type = IST_BASIC;
+- stream->base.handle = New(int);
++ stream->base.handle = NewWithoutGC(int);
+ *(int *)stream->base.handle = des;
+ stream->base.read = (int (*)())basic_read;
+ stream->base.close = (void (*)())basic_close;
+@@ -111,10 +113,10 @@ newFileStream(FILE * f, void (*closep) ())
+ InputStream stream;
+ if (f == NULL)
+ return NULL;
+- stream = New(union input_stream);
++ stream = NewWithoutGC(union input_stream);
+ init_base_stream(&stream->base, STREAM_BUF_SIZE);
+ stream->file.type = IST_FILE;
+- stream->file.handle = New(struct file_handle);
++ stream->file.handle = NewWithoutGC(struct io_file_handle);
+ stream->file.handle->f = f;
+ if (closep)
+ stream->file.handle->close = closep;
+@@ -131,10 +133,10 @@ newStrStream(Str s)
+ InputStream stream;
+ if (s == NULL)
+ return NULL;
+- stream = New(union input_stream);
++ stream = NewWithoutGC(union input_stream);
+ init_str_stream(&stream->base, s);
+ stream->str.type = IST_STR;
+- stream->str.handle = s;
++ stream->str.handle = NULL;
+ stream->str.read = (int (*)())str_read;
+ stream->str.close = NULL;
+ return stream;
+@@ -147,10 +149,10 @@ newSSLStream(SSL * ssl, int sock)
+ InputStream stream;
+ if (sock < 0)
+ return NULL;
+- stream = New(union input_stream);
++ stream = NewWithoutGC(union input_stream);
+ init_base_stream(&stream->base, SSL_BUF_SIZE);
+ stream->ssl.type = IST_SSL;
+- stream->ssl.handle = New(struct ssl_handle);
++ stream->ssl.handle = NewWithoutGC(struct ssl_handle);
+ stream->ssl.handle->ssl = ssl;
+ stream->ssl.handle->sock = sock;
+ stream->ssl.read = (int (*)())ssl_read;
+@@ -166,14 +168,14 @@ newEncodedStream(InputStream is, char encoding)
+ if (is == NULL || (encoding != ENC_QUOTE && encoding != ENC_BASE64 &&
+ encoding != ENC_UUENCODE))
+ return is;
+- stream = New(union input_stream);
++ stream = NewWithoutGC(union input_stream);
+ init_base_stream(&stream->base, STREAM_BUF_SIZE);
+ stream->ens.type = IST_ENCODED;
+- stream->ens.handle = New(struct ens_handle);
++ stream->ens.handle = NewWithoutGC(struct ens_handle);
+ stream->ens.handle->is = is;
+ stream->ens.handle->pos = 0;
+ stream->ens.handle->encoding = encoding;
+- stream->ens.handle->s = NULL;
++ growbuf_init_without_GC(&stream->ens.handle->gb);
+ stream->ens.read = (int (*)())ens_read;
+ stream->ens.close = (void (*)())ens_close;
+ return stream;
+@@ -187,8 +189,10 @@ ISclose(InputStream stream)
+ stream->base.type & IST_UNCLOSE)
+ return -1;
+ prevtrap = mySignal(SIGINT, SIG_IGN);
+- stream->base.close(stream->base.handle);
++ stream->base.close (stream->base.handle);
+ mySignal(SIGINT, prevtrap);
++ xfree(stream->base.stream.buf);
++ xfree(stream);
+ return 0;
+ }
+
+@@ -218,122 +222,97 @@ ISundogetc(InputStream stream)
+ return -1;
+ }
+
+-#define MARGIN_STR_SIZE 10
+ Str
+-StrISgets(InputStream stream)
++StrISgets2(InputStream stream, char crnl)
+ {
+- BaseStream base;
+- StreamBuffer sb;
+- Str s = NULL;
+- uchar *p;
+- int len;
++ struct growbuf gb;
+
+ if (stream == NULL)
+- return '\0';
+- base = &stream->base;
+- sb = &base->stream;
+-
+- while (!base->iseos) {
+- if (MUST_BE_UPDATED(base)) {
+- do_update(base);
+- }
+- else {
+- if ((p = memchr(&sb->buf[sb->cur], '\n', sb->next - sb->cur))) {
+- len = p - &sb->buf[sb->cur] + 1;
+- if (s == NULL)
+- s = Strnew_size(len);
+- Strcat_charp_n(s, (char *)&sb->buf[sb->cur], len);
+- sb->cur += len;
+- return s;
+- }
+- else {
+- if (s == NULL)
+- s = Strnew_size(sb->next - sb->cur + MARGIN_STR_SIZE);
+- Strcat_charp_n(s, (char *)&sb->buf[sb->cur],
+- sb->next - sb->cur);
+- sb->cur = sb->next;
+- }
+- }
+- }
+-
+- if (s == NULL)
+- return Strnew();
+- return s;
++ return NULL;
++ growbuf_init(&gb);
++ ISgets_to_growbuf(stream, &gb, crnl);
++ return growbuf_to_Str(&gb);
+ }
+
+-Str
+-StrmyISgets(InputStream stream)
++void
++ISgets_to_growbuf(InputStream stream, struct growbuf *gb, char crnl)
+ {
+- BaseStream base;
+- StreamBuffer sb;
+- Str s = NULL;
+- int i, len;
++ BaseStream base = &stream->base;
++ StreamBuffer sb = &base->stream;
++ int i;
+
+- if (stream == NULL)
+- return '\0';
+- base = &stream->base;
+- sb = &base->stream;
++ gb->length = 0;
+
+ while (!base->iseos) {
+ if (MUST_BE_UPDATED(base)) {
+ do_update(base);
++ continue;
+ }
+- else {
+- if (s && Strlastchar(s) == '\r') {
+- if (sb->buf[sb->cur] == '\n')
+- Strcat_char(s, (char)sb->buf[sb->cur++]);
+- return s;
++ if (crnl && gb->length > 0 && gb->ptr[gb->length - 1] == '\r') {
++ if (sb->buf[sb->cur] == '\n') {
++ GROWBUF_ADD_CHAR(gb, '\n');
++ ++sb->cur;
+ }
+- for (i = sb->cur;
+- i < sb->next && sb->buf[i] != '\n' && sb->buf[i] != '\r';
+- i++) ;
+- if (i < sb->next) {
+- len = i - sb->cur + 1;
+- if (s == NULL)
+- s = Strnew_size(len + MARGIN_STR_SIZE);
+- Strcat_charp_n(s, (char *)&sb->buf[sb->cur], len);
+- sb->cur = i + 1;
+- if (sb->buf[i] == '\n')
+- return s;
+- }
+- else {
+- if (s == NULL)
+- s = Strnew_size(sb->next - sb->cur + MARGIN_STR_SIZE);
+- Strcat_charp_n(s, (char *)&sb->buf[sb->cur],
+- sb->next - sb->cur);
+- sb->cur = sb->next;
++ break;
++ }
++ for (i = sb->cur; i < sb->next; ++i) {
++ if (sb->buf[i] == '\n' || (crnl && sb->buf[i] == '\r')) {
++ ++i;
++ break;
+ }
+ }
++ growbuf_append(gb, &sb->buf[sb->cur], i - sb->cur);
++ sb->cur = i;
++ if (gb->length > 0 && gb->ptr[gb->length - 1] == '\n')
++ break;
+ }
+
+- if (s == NULL)
+- return Strnew();
+- return s;
++ growbuf_reserve(gb, gb->length + 1);
++ gb->ptr[gb->length] = '\0';
++ return;
+ }
+
++#ifdef unused
+ int
+ ISread(InputStream stream, Str buf, int count)
+ {
+- int rest, len;
++ int len;
++
++ if (count + 1 > buf->area_size) {
++ char *newptr = GC_MALLOC_ATOMIC(count + 1);
++ memcpy(newptr, buf->ptr, buf->length);
++ newptr[buf->length] = '\0';
++ buf->ptr = newptr;
++ buf->area_size = count + 1;
++ }
++ len = ISread_n(stream, buf->ptr, count);
++ buf->length = (len > 0) ? len : 0;
++ buf->ptr[buf->length] = '\0';
++ return (len > 0) ? 1 : 0;
++}
++#endif
++
++int
++ISread_n(InputStream stream, char *dst, int count)
++{
++ int len, l;
+ BaseStream base;
+
+- if (stream == NULL || (base = &stream->base)->iseos)
++ if (stream == NULL || count <= 0)
++ return -1;
++ if ((base = &stream->base)->iseos)
+ return 0;
+
+- len = buffer_read(&base->stream, buf->ptr, count);
+- rest = count - len;
++ len = buffer_read(&base->stream, dst, count);
+ if (MUST_BE_UPDATED(base)) {
+- len = base->read(base->handle, &buf->ptr[len], rest);
+- if (len <= 0) {
++ l = (*base->read) (base->handle, &dst[len], count - len);
++ if (l <= 0) {
+ base->iseos = TRUE;
+- len = 0;
++ } else {
++ len += l;
+ }
+- rest -= len;
+ }
+- Strtruncate(buf, count - rest);
+- if (buf->length > 0)
+- return 1;
+- return 0;
++ return len;
+ }
+
+ int
+@@ -496,8 +475,6 @@ ssl_check_cert_ident(X509 * x, char *hostname)
+ /* FIXME: gettextize? */
+ ret = Sprintf("Bad cert ident %s from %s", buf, hostname);
+ }
+- else
+- match_ident = TRUE;
+ }
+ return ret;
+ }
+@@ -645,6 +622,7 @@ basic_close(int *handle)
+ #else
+ close(*(int *)handle);
+ #endif
++ xfree(handle);
+ }
+
+ static int
+@@ -658,13 +636,14 @@ basic_read(int *handle, char *buf, int len)
+ }
+
+ static void
+-file_close(struct file_handle *handle)
++file_close(struct io_file_handle *handle)
+ {
+ handle->close(handle->f);
++ xfree(handle);
+ }
+
+ static int
+-file_read(struct file_handle *handle, char *buf, int len)
++file_read(struct io_file_handle *handle, char *buf, int len)
+ {
+ return fread(buf, 1, len, handle->f);
+ }
+@@ -682,6 +661,7 @@ ssl_close(struct ssl_handle *handle)
+ close(handle->sock);
+ if (handle->ssl)
+ SSL_free(handle->ssl);
++ xfree(handle);
+ }
+
+ static int
+@@ -717,38 +697,60 @@ static void
+ ens_close(struct ens_handle *handle)
+ {
+ ISclose(handle->is);
++ growbuf_clear(&handle->gb);
++ xfree(handle);
+ }
+
+ static int
+ ens_read(struct ens_handle *handle, char *buf, int len)
+ {
+- if (handle->s == NULL || handle->pos == handle->s->length) {
++ if (handle->pos == handle->gb.length) {
+ char *p;
+- handle->s = StrmyISgets(handle->is);
+- if (handle->s->length == 0)
++ struct growbuf gbtmp;
++
++ ISgets_to_growbuf(handle->is, &handle->gb, TRUE);
++ if (handle->gb.length == 0)
+ return 0;
+- cleanup_line(handle->s, PAGER_MODE);
+ if (handle->encoding == ENC_BASE64)
+- Strchop(handle->s);
++ memchop(handle->gb.ptr, &handle->gb.length);
+ else if (handle->encoding == ENC_UUENCODE) {
+- if (!strncmp(handle->s->ptr, "begin", 5))
+- handle->s = StrmyISgets(handle->is);
+- Strchop(handle->s);
++ if (handle->gb.length >= 5 &&
++ !strncmp(handle->gb.ptr, "begin", 5))
++ ISgets_to_growbuf(handle->is, &handle->gb, TRUE);
++ memchop(handle->gb.ptr, &handle->gb.length);
+ }
+- p = handle->s->ptr;
++ growbuf_init_without_GC(&gbtmp);
++ p = handle->gb.ptr;
+ if (handle->encoding == ENC_QUOTE)
+- handle->s = decodeQP(&p);
++ decodeQP_to_growbuf(&gbtmp, &p);
+ else if (handle->encoding == ENC_BASE64)
+- handle->s = decodeB(&p);
++ decodeB_to_growbuf(&gbtmp, &p);
+ else if (handle->encoding == ENC_UUENCODE)
+- handle->s = decodeU(&p);
++ decodeU_to_growbuf(&gbtmp, &p);
++ growbuf_clear(&handle->gb);
++ handle->gb = gbtmp;
+ handle->pos = 0;
+ }
+
+- if (len > handle->s->length - handle->pos)
+- len = handle->s->length - handle->pos;
++ if (len > handle->gb.length - handle->pos)
++ len = handle->gb.length - handle->pos;
+
+- bcopy(&handle->s->ptr[handle->pos], buf, len);
++ memcpy(buf, &handle->gb.ptr[handle->pos], len);
+ handle->pos += len;
+ return len;
+ }
++
++static void
++memchop(char *p, int *len)
++{
++ char *q;
++
++ for (q = p + *len; q > p; --q) {
++ if (q[-1] != '\n' && q[-1] != '\r')
++ break;
++ }
++ if (q != p + *len)
++ *q = '\0';
++ *len = q - p;
++ return;
++}
+diff --git a/istream.h b/istream.h
+index a220d8b..5a04be0 100644
+--- a/istream.h
++++ b/istream.h
+@@ -2,13 +2,13 @@
+ #ifndef IO_STREAM_H
+ #define IO_STREAM_H
+
++#include "indep.h"
+ #include <stdio.h>
+ #ifdef USE_SSL
+ #include <openssl/bio.h>
+ #include <openssl/x509.h>
+ #include <openssl/ssl.h>
+ #endif
+-#include "Str.h"
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <fcntl.h>
+@@ -20,7 +20,7 @@ struct stream_buffer {
+
+ typedef struct stream_buffer *StreamBuffer;
+
+-struct file_handle {
++struct io_file_handle {
+ FILE *f;
+ void (*close) ();
+ };
+@@ -36,7 +36,7 @@ union input_stream;
+
+ struct ens_handle {
+ union input_stream *is;
+- Str s;
++ struct growbuf gb;
+ int pos;
+ char encoding;
+ };
+@@ -53,7 +53,7 @@ struct base_stream {
+
+ struct file_stream {
+ struct stream_buffer stream;
+- struct file_handle *handle;
++ struct io_file_handle *handle;
+ char type;
+ char iseos;
+ int (*read) ();
+@@ -119,9 +119,14 @@ extern InputStream newEncodedStream(InputStream is, char encoding);
+ extern int ISclose(InputStream stream);
+ extern int ISgetc(InputStream stream);
+ extern int ISundogetc(InputStream stream);
+-extern Str StrISgets(InputStream stream);
+-extern Str StrmyISgets(InputStream stream);
++extern Str StrISgets2(InputStream stream, char crnl);
++#define StrISgets(stream) StrISgets2(stream, FALSE)
++#define StrmyISgets(stream) StrISgets2(stream, TRUE)
++void ISgets_to_growbuf(InputStream stream, struct growbuf *gb, char crnl);
++#ifdef unused
+ extern int ISread(InputStream stream, Str buf, int count);
++#endif
++int ISread_n(InputStream stream, char *dst, int bufsize);
+ extern int ISfileno(InputStream stream);
+ extern int ISeos(InputStream stream);
+ #ifdef USE_SSL
+diff --git a/keybind.c b/keybind.c
+index a490962..fec0c65 100644
+--- a/keybind.c
++++ b/keybind.c
+@@ -91,7 +91,7 @@ unsigned char EscBKeymap[128] = {
+ /* 0 1 2 3 4 5 6 7 */
+ nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd,
+ /* 8 9 : ; < = > ? */
+- nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd,
++ nulcmd, nulcmd, nulcmd, nulcmd, sgrmouse, nulcmd, nulcmd, nulcmd,
+ /* @ A B C D E F G */
+ nulcmd, movU, movD, movR, movL, nulcmd, goLineL, pgFore,
+ /* H I J K L M N O */
+diff --git a/keybind_lynx.c b/keybind_lynx.c
+index 163f6b2..42267ec 100644
+--- a/keybind_lynx.c
++++ b/keybind_lynx.c
+@@ -99,7 +99,7 @@ unsigned char EscBKeymap[128] = {
+ /* 0 1 2 3 4 5 6 7 */
+ nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd,
+ /* 8 9 : ; < = > ? */
+- nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd,
++ nulcmd, nulcmd, nulcmd, nulcmd, sgrmouse, nulcmd, nulcmd, nulcmd,
+ /* @ A B C D E F G */
+ nulcmd, prevA, nextA, followA, backBf, nulcmd, goLineL, pgFore,
+ /* H I J K L M N O */
+diff --git a/libwc/ambwidth_map.awk b/libwc/ambwidth_map.awk
+index 8544f58..1d9d25f 100644
+--- a/libwc/ambwidth_map.awk
++++ b/libwc/ambwidth_map.awk
+@@ -3,9 +3,15 @@ BEGIN {
+ i = 0;
+ }
+ $2 == "A" {
+- code = sprintf("0x%s", $1);
+- if (strtonum(code) < 0x10000) {
+- map[i] = code
++ code = code2 = strtonum(sprintf("0x%s", $1))
++ if (match($1, /[.]+[0-9A-Fa-f]+/)) {
++ s = substr($1, RSTART, RLENGTH)
++ sub(/[.]+/, "0x", s)
++ code2 = strtonum(s)
++ }
++ for (; code <= code2; code++) {
++ if (code >= 0x10000) { break }
++ map[i] = sprintf("0x%04X", code)
+ i++;
+ }
+ }
+@@ -15,28 +21,14 @@ END {
+ prev = strtonum(map[0]);
+ for (j = 1; j < i; j++) {
+ cur = strtonum(map[j]);
+- if (match(map[j], "[.]+")) {
++ if (cur - prev > 1) {
+ map2[n] = sprintf("%s, %s", start, map[j - 1]);
+ n++;
+- gsub("[.]+", ", 0x", map[j])
+- map2[n] = map[j];
+- n++;
+- start = map[j + 1];
+- cur = strtonum(start);
+- } else {
+- if (cur - prev > 2) {
+- map2[n] = sprintf("%s, %s", start, map[j - 1]);
+- start = map[j];
+- n++;
+- }
+-
+- if (j == i - 1) {
+- map2[n] = sprintf("%s, %s", start, map[j]);
+- n++;
+- }
++ start = map[j];
+ }
+ prev = cur;
+ }
++ if (i > 0) { map2[n] = sprintf("%s, %s", start, map[i - 1]); n++ }
+
+ printf("static wc_map ucs_ambwidth_map[] = {\n");
+ for (j = 0; j < n; j++) {
+diff --git a/libwc/charset.c b/libwc/charset.c
+index 3f0b74d..ea79b1c 100644
+--- a/libwc/charset.c
++++ b/libwc/charset.c
+@@ -1,8 +1,7 @@
+
+ #include <stdlib.h>
+ #include <ctype.h>
+-#include <gc.h>
+-#define New_N(type,n) ((type*)GC_MALLOC((n)*sizeof(type)))
++#include "../alloc.h"
+
+ #include "wc.h"
+
+diff --git a/libwc/gb18030.c b/libwc/gb18030.c
+index c195d49..d5c9018 100644
+--- a/libwc/gb18030.c
++++ b/libwc/gb18030.c
+@@ -151,6 +151,7 @@ wc_ucs_to_gb18030(wc_uint32 ucs)
+ return cc;
+ }
+ cc.ccs = WC_CCS_UNKNOWN;
++ cc.code = 0;
+ return cc;
+ }
+ #endif
+diff --git a/libwc/iso2022.c b/libwc/iso2022.c
+index 33d9a19..a191f28 100644
+--- a/libwc/iso2022.c
++++ b/libwc/iso2022.c
+@@ -405,7 +405,8 @@ wc_push_to_iso2022(Str os, wc_wchar_t cc, wc_status *st)
+ case WC_CCS_A_CS94:
+ if (cc.ccs == WC_CCS_US_ASCII)
+ cc.ccs = st->g0_ccs;
+- g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
++ if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE)
++ g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
+ break;
+ case WC_CCS_A_CS94W:
+ is_wide = 1;
+@@ -435,35 +436,41 @@ wc_push_to_iso2022(Str os, wc_wchar_t cc, wc_status *st)
+ break;
+ #endif
+ }
+- g = cs94w_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
++ if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE)
++ g = cs94w_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
+ break;
+ case WC_CCS_A_CS96:
+- g = cs96_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
++ if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE)
++ g = cs96_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
+ break;
+ case WC_CCS_A_CS96W:
+ is_wide = 1;
+- g = cs96w_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
++ if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE)
++ g = cs96w_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
+ break;
+ case WC_CCS_A_CS942:
+- g = cs942_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
++ if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE)
++ g = cs942_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
+ break;
+ case WC_CCS_A_UNKNOWN_W:
+ if (WcOption.no_replace)
+ return;
+ is_wide = 1;
+ cc.ccs = WC_CCS_US_ASCII;
+- g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
++ if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE)
++ g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
+ cc.code = ((wc_uint32)WC_REPLACE_W[0] << 8) | WC_REPLACE_W[1];
+ break;
+ case WC_CCS_A_UNKNOWN:
+ if (WcOption.no_replace)
+ return;
+ cc.ccs = WC_CCS_US_ASCII;
+- g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
++ if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE)
++ g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
+ cc.code = (wc_uint32)WC_REPLACE[0];
+ break;
+ default:
+- if ((cc.ccs == WC_CCS_JOHAB || WC_CCS_JOHAB_1 ||
++ if ((cc.ccs == WC_CCS_JOHAB || cc.ccs == WC_CCS_JOHAB_1 ||
+ cc.ccs == WC_CCS_JOHAB_2 || cc.ccs == WC_CCS_JOHAB_3) &&
+ cs94w_gmap[WC_F_KS_X_1001 - WC_F_ISO_BASE]) {
+ wc_wchar_t cc2 = wc_johab_to_ksx1001(cc);
+diff --git a/libwc/johab.c b/libwc/johab.c
+index 8d587b8..498b1bb 100644
+--- a/libwc/johab.c
++++ b/libwc/johab.c
+@@ -160,9 +160,9 @@ wc_N_to_johab1(wc_uint32 code)
+ {
+ wc_uint32 a, b, c;
+
+- a = N_johab1_map[0][(code / 28) / 21];
+- b = N_johab1_map[1][(code / 28) % 21];
+- c = N_johab1_map[2][ code % 28 ];
++ a = N_johab1_map[0][(code / 28) / 21 & 0x1F];
++ b = N_johab1_map[1][(code / 28) % 21 & 0x1F];
++ c = N_johab1_map[2][ code % 28 & 0x1F];
+ return 0x8000 | (a << 10) | (b << 5) | c;
+ }
+
+diff --git a/libwc/map/big5_ucs.map b/libwc/map/big5_ucs.map
+index 0c6fd12..ac817a9 100644
+--- a/libwc/map/big5_ucs.map
++++ b/libwc/map/big5_ucs.map
+@@ -1,6 +1,8 @@
+ /* Big5 (Chinese Taiwan) */
+
+-static wc_uint16 big5_ucs_map[ 0x59 * 0x9D ] = {
++#define N_big5_ucs_map (0x59 * 0x9D)
++
++static wc_uint16 big5_ucs_map[ N_big5_ucs_map ] = {
+ 0x3000, /* 0xA140 */
+ 0xFF0C, /* 0xA141 */
+ 0x3001, /* 0xA142 */
+diff --git a/libwc/map/cns11643_ucs.map b/libwc/map/cns11643_ucs.map
+index b426dd3..fcba334 100644
+--- a/libwc/map/cns11643_ucs.map
++++ b/libwc/map/cns11643_ucs.map
+@@ -1,6 +1,8 @@
+ /* CNS 11643 (Chinese Taiwan) */
+
+-static wc_uint16 cns116431_ucs_map[ 0x5E * 0x5E ] = {
++#define N_cns116431_ucs_map (0x5E * 0x5E)
++
++static wc_uint16 cns116431_ucs_map[ N_cns116431_ucs_map ] = {
+ 0x3000, /* 0x2121 */
+ 0xFF0C, /* 0x2122 */
+ 0x3001, /* 0x2123 */
+@@ -8839,7 +8841,9 @@ static wc_uint16 cns116431_ucs_map[ 0x5E * 0x5E ] = {
+ 0, /* 0x7E7E */
+ };
+
+-static wc_uint16 cns116432_ucs_map[ 0x5E * 0x5E ] = {
++#define N_cns116432_ucs_map (0x5E * 0x5E)
++
++static wc_uint16 cns116432_ucs_map[ N_cns116432_ucs_map ] = {
+ 0x4E42, /* 0x2121 */
+ 0x4E5C, /* 0x2122 */
+ 0x51F5, /* 0x2123 */
+diff --git a/libwc/map/gb12345_ucs.map b/libwc/map/gb12345_ucs.map
+index 55558c7..3fb338d 100644
+--- a/libwc/map/gb12345_ucs.map
++++ b/libwc/map/gb12345_ucs.map
+@@ -1,6 +1,8 @@
+ /* GB 12345 (Chinese) */
+
+-static wc_uint16 gb12345_ucs_map[ 0x5E * 0x5E ] = {
++#define N_gb12345_ucs_map (0x5E * 0x5E)
++
++static wc_uint16 gb12345_ucs_map[ N_gb12345_ucs_map ] = {
+ 0x3000, /* 0x2121 */
+ 0x3001, /* 0x2122 */
+ 0x3002, /* 0x2123 */
+diff --git a/libwc/map/gb2312_ucs.map b/libwc/map/gb2312_ucs.map
+index 38fb88f..3d37465 100644
+--- a/libwc/map/gb2312_ucs.map
++++ b/libwc/map/gb2312_ucs.map
+@@ -1,6 +1,8 @@
+ /* GB 2312 (Chinese) */
+
+-static wc_uint16 gb2312_ucs_map[ 0x5E * 0x5E ] = {
++#define N_gb2312_ucs_map (0x5E * 0x5E)
++
++static wc_uint16 gb2312_ucs_map[ N_gb2312_ucs_map ] = {
+ 0x3000, /* 0x2121 */
+ 0x3001, /* 0x2122 */
+ 0x3002, /* 0x2123 */
+diff --git a/libwc/map/gbk_ucs.map b/libwc/map/gbk_ucs.map
+index 5a0d5ba..d092fd7 100644
+--- a/libwc/map/gbk_ucs.map
++++ b/libwc/map/gbk_ucs.map
+@@ -6,7 +6,9 @@ static wc_map ucs_gbk_80_map[ N_ucs_gbk_80_map ] = {
+ { 0x20AC, 0x0080 },
+ };
+
+-static wc_uint16 gbk_ucs_map[ 0x7E * 0xBE - 0x5E * 0x5E + 0x0A + 0x16 + 0x06 ] = {
++#define N_gbk_ucs_map (0x7E * 0xBE - 0x5E * 0x5E + 0x0A + 0x16 + 0x06)
++
++static wc_uint16 gbk_ucs_map[ N_gbk_ucs_map ] = {
+ 0x4E02, /* 0x8140 */
+ 0x4E04, /* 0x8141 */
+ 0x4E05, /* 0x8142 */
+diff --git a/libwc/map/hkscs_ucs.map b/libwc/map/hkscs_ucs.map
+index 96d1566..2fbe6b4 100644
+--- a/libwc/map/hkscs_ucs.map
++++ b/libwc/map/hkscs_ucs.map
+@@ -1,6 +1,8 @@
+ /* HKSCS (Chinese Hong Kong) */
+
+-static wc_uint16 hkscs_ucs_map[ 0x1E * 0x9D ] = {
++#define N_hkscs_ucs_map (0x1E * 0x9D)
++
++static wc_uint16 hkscs_ucs_map[ N_hkscs_ucs_map ] = {
+ 0, /* 0x8840 */
+ 0, /* 0x8841 */
+ 0, /* 0x8842 */
+diff --git a/libwc/map/jisx0208x0212x0213_ucs.map b/libwc/map/jisx0208x0212x0213_ucs.map
+index 1a1d706..28c2a6c 100644
+--- a/libwc/map/jisx0208x0212x0213_ucs.map
++++ b/libwc/map/jisx0208x0212x0213_ucs.map
+@@ -1,6 +1,8 @@
+ /* JIS X 0208, JIS X 0212, JIS X 0213 (Japanese) */
+
+-static wc_uint16 jisx0208x02131_ucs_map[ 0x5E * 0x5E ] = {
++#define N_jisx0208x02131_ucs_map (0x5E * 0x5E)
++
++static wc_uint16 jisx0208x02131_ucs_map[ N_jisx0208x02131_ucs_map ] = {
+ 0x3000, /* JIS X 0208 0x2121 */
+ 0x3001, /* JIS X 0208 0x2122 */
+ 0x3002, /* JIS X 0208 0x2123 */
+@@ -8839,7 +8841,9 @@ static wc_uint16 jisx0208x02131_ucs_map[ 0x5E * 0x5E ] = {
+ 0, /* JIS X 0213-1 0x7E7E */
+ };
+
+-static wc_uint16 jisx0212x02132_ucs_map[ 0x5E * 0x5E ] = {
++#define N_jisx0212x02132_ucs_map (0x5E * 0x5E)
++
++static wc_uint16 jisx0212x02132_ucs_map[ N_jisx0212x02132_ucs_map ] = {
+ 0, /* JIS X 0213-2 0x2121 */
+ 0x4E02, /* JIS X 0213-2 0x2122 */
+ 0x4E0F, /* JIS X 0213-2 0x2123 */
+diff --git a/libwc/map/ksx1001_ucs.map b/libwc/map/ksx1001_ucs.map
+index 9a17d61..cb62f98 100644
+--- a/libwc/map/ksx1001_ucs.map
++++ b/libwc/map/ksx1001_ucs.map
+@@ -1,6 +1,8 @@
+ /* KS X 1001 (Korean) */
+
+-static wc_uint16 ksx1001_ucs_map[ 0x5E * 0x5E ] = {
++#define N_ksx1001_ucs_map (0x5E * 0x5E)
++
++static wc_uint16 ksx1001_ucs_map[ N_ksx1001_ucs_map ] = {
+ 0x3000, /* 0x2121 */
+ 0x3001, /* 0x2122 */
+ 0x3002, /* 0x2123 */
+diff --git a/libwc/map/sjis_ext_ucs.map b/libwc/map/sjis_ext_ucs.map
+index a82995c..cc748ba 100644
+--- a/libwc/map/sjis_ext_ucs.map
++++ b/libwc/map/sjis_ext_ucs.map
+@@ -1,6 +1,8 @@
+ /* Shift_JIS/CP932 (Japanese) */
+
+-static wc_uint16 sjis_ext_ucs_map[ 0x5E * 10 ] = {
++#define N_sjis_ext_ucs_map (0x5E * 10)
++
++static wc_uint16 sjis_ext_ucs_map[ N_sjis_ext_ucs_map ] = {
+ 0x2460, /* 0x8740 */
+ 0x2461, /* 0x8741 */
+ 0x2462, /* 0x8742 */
+diff --git a/libwc/map/ucs_ambwidth.map b/libwc/map/ucs_ambwidth.map
+index 6f03ba8..35ceedb 100644
+--- a/libwc/map/ucs_ambwidth.map
++++ b/libwc/map/ucs_ambwidth.map
+@@ -1,50 +1,82 @@
+ static wc_map ucs_ambwidth_map[] = {
+ { 0x00A1, 0x00A1 },
+ { 0x00A4, 0x00A4 },
+- { 0x00A7, 0x00AA },
+- { 0x00AD, 0x00BF },
++ { 0x00A7, 0x00A8 },
++ { 0x00AA, 0x00AA },
++ { 0x00AD, 0x00AE },
++ { 0x00B0, 0x00B4 },
++ { 0x00B6, 0x00BA },
++ { 0x00BC, 0x00BF },
+ { 0x00C6, 0x00C6 },
+ { 0x00D0, 0x00D0 },
+ { 0x00D7, 0x00D8 },
+ { 0x00DE, 0x00E1 },
+- { 0x00E6, 0x00ED },
+- { 0x00F0, 0x00F3 },
+- { 0x00F7, 0x00FE },
++ { 0x00E6, 0x00E6 },
++ { 0x00E8, 0x00EA },
++ { 0x00EC, 0x00ED },
++ { 0x00F0, 0x00F0 },
++ { 0x00F2, 0x00F3 },
++ { 0x00F7, 0x00FA },
++ { 0x00FC, 0x00FC },
++ { 0x00FE, 0x00FE },
+ { 0x0101, 0x0101 },
+- { 0x0111, 0x0113 },
++ { 0x0111, 0x0111 },
++ { 0x0113, 0x0113 },
+ { 0x011B, 0x011B },
+ { 0x0126, 0x0127 },
+ { 0x012B, 0x012B },
+ { 0x0131, 0x0133 },
+ { 0x0138, 0x0138 },
+- { 0x013F, 0x0144 },
+- { 0x0148, 0x014D },
++ { 0x013F, 0x0142 },
++ { 0x0144, 0x0144 },
++ { 0x0148, 0x014B },
++ { 0x014D, 0x014D },
+ { 0x0152, 0x0153 },
+ { 0x0166, 0x0167 },
+ { 0x016B, 0x016B },
+- { 0x01CE, 0x01DC },
++ { 0x01CE, 0x01CE },
++ { 0x01D0, 0x01D0 },
++ { 0x01D2, 0x01D2 },
++ { 0x01D4, 0x01D4 },
++ { 0x01D6, 0x01D6 },
++ { 0x01D8, 0x01D8 },
++ { 0x01DA, 0x01DA },
++ { 0x01DC, 0x01DC },
+ { 0x0251, 0x0251 },
+ { 0x0261, 0x0261 },
+ { 0x02C4, 0x02C4 },
+- { 0x02C7, 0x02CD },
++ { 0x02C7, 0x02C7 },
++ { 0x02C9, 0x02CB },
++ { 0x02CD, 0x02CD },
+ { 0x02D0, 0x02D0 },
+- { 0x02D8, 0x02DF },
++ { 0x02D8, 0x02DB },
++ { 0x02DD, 0x02DD },
++ { 0x02DF, 0x02DF },
+ { 0x0300, 0x036F },
+- { 0x0391, 0x03A9 },
+- { 0x03B1, 0x03C9 },
++ { 0x0391, 0x03A1 },
++ { 0x03A3, 0x03A9 },
++ { 0x03B1, 0x03C1 },
++ { 0x03C3, 0x03C9 },
+ { 0x0401, 0x0401 },
+- { 0x0410, 0x0451 },
++ { 0x0410, 0x044F },
++ { 0x0451, 0x0451 },
+ { 0x2010, 0x2010 },
+- { 0x2013, 0x2019 },
++ { 0x2013, 0x2016 },
++ { 0x2018, 0x2019 },
+ { 0x201C, 0x201D },
+- { 0x2020, 0x2027 },
+- { 0x2030, 0x2035 },
++ { 0x2020, 0x2022 },
++ { 0x2024, 0x2027 },
++ { 0x2030, 0x2030 },
++ { 0x2032, 0x2033 },
++ { 0x2035, 0x2035 },
+ { 0x203B, 0x203B },
+ { 0x203E, 0x203E },
+ { 0x2074, 0x2074 },
+- { 0x207F, 0x2084 },
++ { 0x207F, 0x207F },
++ { 0x2081, 0x2084 },
+ { 0x20AC, 0x20AC },
+- { 0x2103, 0x2105 },
++ { 0x2103, 0x2103 },
++ { 0x2105, 0x2105 },
+ { 0x2109, 0x2109 },
+ { 0x2113, 0x2113 },
+ { 0x2116, 0x2116 },
+@@ -52,21 +84,28 @@ static wc_map ucs_ambwidth_map[] = {
+ { 0x2126, 0x2126 },
+ { 0x212B, 0x212B },
+ { 0x2153, 0x2154 },
+- { 0x215B, 0x216B },
++ { 0x215B, 0x215E },
++ { 0x2160, 0x216B },
+ { 0x2170, 0x2179 },
+ { 0x2189, 0x2189 },
+ { 0x2190, 0x2199 },
+ { 0x21B8, 0x21B9 },
+- { 0x21D2, 0x21D4 },
++ { 0x21D2, 0x21D2 },
++ { 0x21D4, 0x21D4 },
+ { 0x21E7, 0x21E7 },
+- { 0x2200, 0x2203 },
++ { 0x2200, 0x2200 },
++ { 0x2202, 0x2203 },
+ { 0x2207, 0x2208 },
+ { 0x220B, 0x220B },
+- { 0x220F, 0x2211 },
++ { 0x220F, 0x220F },
++ { 0x2211, 0x2211 },
+ { 0x2215, 0x2215 },
+ { 0x221A, 0x221A },
+ { 0x221D, 0x2220 },
+- { 0x2223, 0x222E },
++ { 0x2223, 0x2223 },
++ { 0x2225, 0x2225 },
++ { 0x2227, 0x222C },
++ { 0x222E, 0x222E },
+ { 0x2234, 0x2237 },
+ { 0x223C, 0x223D },
+ { 0x2248, 0x2248 },
+@@ -83,11 +122,13 @@ static wc_map ucs_ambwidth_map[] = {
+ { 0x22A5, 0x22A5 },
+ { 0x22BF, 0x22BF },
+ { 0x2312, 0x2312 },
+- { 0x2460, 0x254B },
++ { 0x2460, 0x24E9 },
++ { 0x24EB, 0x254B },
+ { 0x2550, 0x2573 },
+ { 0x2580, 0x258F },
+ { 0x2592, 0x2595 },
+- { 0x25A0, 0x25A9 },
++ { 0x25A0, 0x25A1 },
++ { 0x25A3, 0x25A9 },
+ { 0x25B2, 0x25B3 },
+ { 0x25B6, 0x25B7 },
+ { 0x25BC, 0x25BD },
+@@ -101,12 +142,20 @@ static wc_map ucs_ambwidth_map[] = {
+ { 0x2609, 0x2609 },
+ { 0x260E, 0x260F },
+ { 0x2614, 0x2615 },
+- { 0x261C, 0x261E },
+- { 0x2640, 0x2642 },
+- { 0x2660, 0x266F },
++ { 0x261C, 0x261C },
++ { 0x261E, 0x261E },
++ { 0x2640, 0x2640 },
++ { 0x2642, 0x2642 },
++ { 0x2660, 0x2661 },
++ { 0x2663, 0x2665 },
++ { 0x2667, 0x266A },
++ { 0x266C, 0x266D },
++ { 0x266F, 0x266F },
+ { 0x269E, 0x269F },
+ { 0x26BE, 0x26BF },
+- { 0x26C4, 0x26E3 },
++ { 0x26C4, 0x26CD },
++ { 0x26CF, 0x26E1 },
++ { 0x26E3, 0x26E3 },
+ { 0x26E8, 0x26FF },
+ { 0x273D, 0x273D },
+ { 0x2757, 0x2757 },
+diff --git a/libwc/map/uhc_ucs.map b/libwc/map/uhc_ucs.map
+index b6b43ca..55efc09 100644
+--- a/libwc/map/uhc_ucs.map
++++ b/libwc/map/uhc_ucs.map
+@@ -1,6 +1,8 @@
+ /* UHC/CP949 (Korean) */
+
+-static wc_uint16 uhc_ucs_map[ 0x20 * 0xB2 + 0x27 * 0x54 + 2 ] = {
++#define N_uhc_ucs_map (0x20 * 0xB2 + 0x27 * 0x54 + 2)
++
++static wc_uint16 uhc_ucs_map[ N_uhc_ucs_map ] = {
+ 0xAC02, /* 0x8141 */
+ 0xAC03, /* 0x8142 */
+ 0xAC05, /* 0x8143 */
+diff --git a/libwc/status.c b/libwc/status.c
+index d25c924..4a2ebf8 100644
+--- a/libwc/status.c
++++ b/libwc/status.c
+@@ -1,7 +1,6 @@
+
+ #include <string.h>
+-#include <gc.h>
+-#define New_N(type,n) ((type*)GC_MALLOC((n)*sizeof(type)))
++#include "../alloc.h"
+
+ #include "wc.h"
+ #ifdef USE_UNICODE
+diff --git a/libwc/ucs.c b/libwc/ucs.c
+index d7b6948..727e574 100644
+--- a/libwc/ucs.c
++++ b/libwc/ucs.c
+@@ -100,6 +100,7 @@ wc_ucs_to_any(wc_uint32 ucs, wc_table *t)
+ return t->conv(t->ccs, map->code2);
+ }
+ cc.ccs = WC_CCS_UNKNOWN;
++ cc.code = 0;
+ return cc;
+ }
+
+@@ -108,6 +109,7 @@ wc_any_to_ucs(wc_wchar_t cc)
+ {
+ int f;
+ wc_uint16 *map = NULL;
++ wc_uint32 map_size = 0x80;
+ wc_map *map2;
+
+ f = WC_CCS_INDEX(cc.ccs);
+@@ -138,6 +140,7 @@ wc_any_to_ucs(wc_wchar_t cc)
+ if (f < WC_F_ISO_BASE || f > WC_F_CS94W_END)
+ return 0;
+ map = cs94w_ucs_map[f - WC_F_ISO_BASE];
++ map_size = cs94w_ucs_map_size[f - WC_F_ISO_BASE];
+ cc.code = WC_CS94W_N(cc.code);
+ break;
+ case WC_CCS_A_CS96:
+@@ -150,6 +153,7 @@ wc_any_to_ucs(wc_wchar_t cc)
+ if (f < WC_F_ISO_BASE || f > WC_F_CS96W_END)
+ return WC_C_UCS4_ERROR;
+ map = cs96w_ucs_map[f - WC_F_ISO_BASE];
++ map_size = cs96w_ucs_map_size[f - WC_F_ISO_BASE];
+ cc.code = WC_CS96W_N(cc.code);
+ break;
+ case WC_CCS_A_CS942:
+@@ -180,6 +184,7 @@ wc_any_to_ucs(wc_wchar_t cc)
+ if (f < WC_F_PCS_BASE || f > WC_F_PCSW_END)
+ return WC_C_UCS4_ERROR;
+ map = pcsw_ucs_map[f - WC_F_PCS_BASE];
++ map_size = pcsw_ucs_map_size[f - WC_F_PCS_BASE];
+ switch (cc.ccs) {
+ case WC_CCS_BIG5:
+ cc.code = WC_BIG5_N(cc.code);
+@@ -271,6 +276,8 @@ wc_any_to_ucs(wc_wchar_t cc)
+ }
+ if (map == NULL)
+ return WC_C_UCS4_ERROR;
++ if (map_size == 0 || cc.code > map_size - 1)
++ return WC_C_UCS4_ERROR;
+ cc.code = map[cc.code];
+ return cc.code ? cc.code : WC_C_UCS4_ERROR;
+ }
+diff --git a/libwc/ucs.map b/libwc/ucs.map
+index dfac6d9..5d6f688 100644
+--- a/libwc/ucs.map
++++ b/libwc/ucs.map
+@@ -195,7 +195,28 @@ static wc_uint16 *cs94w_ucs_map[] = {
+ jisx0212x02132_ucs_map, /* 50 (JIS X 0213-2) */
+ };
+
++static wc_uint32 cs94w_ucs_map_size[] = {
++ N_jisx0208x02131_ucs_map, /* 40 (JIS C 6226) */
++ N_gb2312_ucs_map, /* 41 (GB 2312) */
++ N_jisx0208x02131_ucs_map, /* 42 (JIS X 0208) */
++ N_ksx1001_ucs_map, /* 43 (KS X 1001) */
++ N_jisx0212x02132_ucs_map, /* 44 (JIS X 0212) */
++ 0, /* 45 (ISO IR 165) */
++ 0, /* 46 */
++ N_cns116431_ucs_map, /* 47 (CNS 11643-1) */
++ N_cns116432_ucs_map, /* 48 (CNS 11643-2) */
++ 0, /* 49 (CNS 11643-3) */
++ 0, /* 4A (CNS 11643-4) */
++ 0, /* 4B (CNS 11643-5) */
++ 0, /* 4C (CNS 11643-6) */
++ 0, /* 4D (CNS 11643-7) */
++ 0, /* 4E (KSP 9566) */
++ N_jisx0208x02131_ucs_map, /* 4F (JIS X 0213-1) */
++ N_jisx0212x02132_ucs_map, /* 50 (JIS X 0213-2) */
++};
++
+ static wc_uint16 **cs96w_ucs_map;
++static wc_uint32 *cs96w_ucs_map_size;
+
+ static wc_uint16 *pcsw_ucs_map[] = {
+ big5_ucs_map, /* Big5 */
+@@ -233,6 +254,42 @@ static wc_uint16 *pcsw_ucs_map[] = {
+ hkscs_ucs_map, /* HKSCS-2 */
+ };
+
++static wc_uint32 pcsw_ucs_map_size[] = {
++ N_big5_ucs_map, /* Big5 */
++ N_big5_ucs_map, /* Big5-1 */
++ N_big5_ucs_map, /* Big5-2 */
++ 0, /* CNS 11643-8 */
++ 0, /* CNS 11643-9 */
++ 0, /* CNS 11643-10 */
++ 0, /* CNS 11643-11 */
++ 0, /* CNS 11643-12 */
++ 0, /* CNS 11643-13 */
++ 0, /* CNS 11643-14 */
++ 0, /* CNS 11643-15 */
++ 0, /* CNS 11643-16 */
++ 0, /* CNS 11643-X */
++ N_gb12345_ucs_map, /* GB 12345 */
++ 0, /* Johab (special conversion) */
++ 0, /* Johab-1 (special conversion) */
++ 0, /* Johab-2 (special conversion) */
++ N_ksx1001_ucs_map, /* Johab-3 */
++ N_sjis_ext_ucs_map, /* Shift_JIS(CP932) ext */
++ N_sjis_ext_ucs_map, /* Shift_JIS(CP932) ext-1 */
++ N_sjis_ext_ucs_map, /* Shift_JIS(CP932) ext-2 */
++ N_gbk_ucs_map, /* GBK(CP936) */
++ N_gbk_ucs_map, /* GBK(CP936)-1 */
++ N_gbk_ucs_map, /* GBK(CP936)-2 */
++ 0, /* GB18030 GBK-ext (special conversion) */
++ 0, /* GB18030 GBK-ext-1 (special conversion) */
++ 0, /* GB18030 GBK-ext-2 (special conversion) */
++ N_uhc_ucs_map, /* UHC(CP949) */
++ N_uhc_ucs_map, /* UHC(CP949)-1 */
++ N_uhc_ucs_map, /* UHC(CP949)-2 */
++ N_hkscs_ucs_map, /* HKSCS */
++ N_hkscs_ucs_map, /* HKSCS-1 */
++ N_hkscs_ucs_map, /* HKSCS-2 */
++};
++
+ static wc_wchar_t
+ ucs_cs94_conv(wc_ccs ccs, wc_uint16 c)
+ {
+diff --git a/linein.c b/linein.c
+index b7e81b6..d8f9023 100644
+--- a/linein.c
++++ b/linein.c
+@@ -714,7 +714,8 @@ _rdcompl(void)
+ static void
+ next_dcompl(int next)
+ {
+- static int col, row, len;
++ static int col, row;
++ static unsigned int len;
+ static Str d;
+ int i, j, n, y;
+ Str f;
+@@ -780,9 +781,10 @@ next_dcompl(int next)
+ if (len < n)
+ len = n;
+ }
+- col = COLS / len;
+- if (col == 0)
+- col = 1;
++ if (len > 0 && COLS > len)
++ col = COLS / len;
++ else
++ col = 1;
+ row = (NCFileBuf + col - 1) / col;
+
+ disp_next:
+@@ -1026,7 +1028,7 @@ _prev(void)
+ strCurrentBuf = strBuf;
+ }
+ if (DecodeURL && (cm_mode & CPL_URL) )
+- p = url_unquote_conv(p, 0);
++ p = url_decode2(p, NULL);
+ strBuf = Strnew_charp(p);
+ CLen = CPos = setStrType(strBuf, strProp);
+ offset = 0;
+@@ -1045,7 +1047,7 @@ _next(void)
+ p = nextHist(hist);
+ if (p) {
+ if (DecodeURL && (cm_mode & CPL_URL) )
+- p = url_unquote_conv(p, 0);
++ p = url_decode2(p, NULL);
+ strBuf = Strnew_charp(p);
+ }
+ else {
+diff --git a/local.c b/local.c
+index f5a73a2..46ac579 100644
+--- a/local.c
++++ b/local.c
+@@ -109,6 +109,7 @@ loadLocalDir(char *dname)
+ n++;
+ }
+ }
++ closedir(d);
+
+ if (multicolList) {
+ l = COLS / (maxlen + 2);
+@@ -167,7 +168,7 @@ loadLocalDir(char *dname)
+ else {
+ #if defined(HAVE_LSTAT) && defined(HAVE_READLINK)
+ if (S_ISLNK(lst.st_mode)) {
+- if ((l = readlink(fbuf->ptr, lbuf, sizeof(lbuf))) > 0) {
++ if ((l = readlink(fbuf->ptr, lbuf, sizeof(lbuf) - 1)) > 0) {
+ lbuf[l] = '\0';
+ Strcat_m_charp(tmp, " -> ",
+ html_quote(conv_from_system(lbuf)), NULL);
+@@ -212,18 +213,17 @@ set_environ(char *var, char *value)
+ if (var != NULL && value != NULL)
+ setenv(var, value, 1);
+ #else /* not HAVE_SETENV */
+-#ifdef HAVE_PUTENV
+ static Hash_sv *env_hash = NULL;
+ Str tmp = Strnew_m_charp(var, "=", value, NULL);
+
+ if (env_hash == NULL)
+ env_hash = newHash_sv(20);
+ putHash_sv(env_hash, var, (void *)tmp->ptr);
++#ifdef HAVE_PUTENV
+ putenv(tmp->ptr);
+ #else /* not HAVE_PUTENV */
+ extern char **environ;
+ char **ne;
+- char *p;
+ int i, l, el;
+ char **e, **newenv;
+
+@@ -250,7 +250,7 @@ set_environ(char *var, char *value)
+ if (newenv == NULL)
+ return;
+ for (e = environ, ne = newenv; *e != NULL; *(ne++) = *(e++)) ;
+- *(ne++) = p;
++ *(ne++) = tmp->ptr;
+ *ne = NULL;
+ environ = newenv;
+ #endif /* not HAVE_PUTENV */
+@@ -359,6 +359,10 @@ localcgi_post(char *uri, char *qstr, FormList *request, char *referer)
+ int status;
+ pid_t pid;
+ char *file = uri, *name = uri, *path_info = NULL, *tmpf = NULL;
++#ifdef HAVE_CHDIR
++ char *cgi_dir;
++#endif
++ char *cgi_basename;
+
+ #ifdef __MINGW32_VERSION
+ return NULL;
+@@ -373,18 +377,25 @@ localcgi_post(char *uri, char *qstr, FormList *request, char *referer)
+ if (!fw)
+ return NULL;
+ }
++ if (qstr)
++ uri = Strnew_m_charp(uri, "?", qstr, NULL)->ptr;
++#ifdef HAVE_CHDIR
++ cgi_dir = mydirname(file);
++#endif
++ cgi_basename = mybasename(file);
+ pid = open_pipe_rw(&fr, NULL);
+- if (pid < 0)
++ /* Don't invoke gc after here, or the program might crash in some platforms */
++ if (pid < 0) {
++ if (fw)
++ fclose(fw);
+ return NULL;
+- else if (pid) {
++ } else if (pid) {
+ if (fw)
+ fclose(fw);
+ return fr;
+ }
+ setup_child(TRUE, 2, fw ? fileno(fw) : -1);
+
+- if (qstr)
+- uri = Strnew_m_charp(uri, "?", qstr, NULL)->ptr;
+ set_cgi_environ(name, file, uri);
+ if (path_info)
+ set_environ("PATH_INFO", path_info);
+@@ -415,12 +426,11 @@ localcgi_post(char *uri, char *qstr, FormList *request, char *referer)
+ }
+
+ #ifdef HAVE_CHDIR /* ifndef __EMX__ ? */
+- chdir(mydirname(file));
++ chdir(cgi_dir);
+ #endif
+- execl(file, mybasename(file), NULL);
++ execl(file, cgi_basename, NULL);
+ fprintf(stderr, "execl(\"%s\", \"%s\", NULL): %s\n",
+- file, mybasename(file), strerror(errno));
++ file, cgi_basename, strerror(errno));
+ exit(1);
+- return NULL;
+ #endif
+ }
+diff --git a/mailcap.c b/mailcap.c
+index c0461df..f0c6242 100644
+--- a/mailcap.c
++++ b/mailcap.c
+@@ -72,7 +72,7 @@ searchMailcap(struct mailcap *table, char *type)
+ }
+
+ static int
+-matchMailcapAttr(char *p, char *attr, int len, Str *value)
++matchMailcapAttr(char *p, char *attr, size_t len, Str *value)
+ {
+ int quoted;
+ char *q = NULL;
+diff --git a/main.c b/main.c
+index b421943..bd424de 100644
+--- a/main.c
++++ b/main.c
+@@ -1,6 +1,7 @@
+ /* $Id: main.c,v 1.270 2010/08/24 10:11:51 htrb Exp $ */
+ #define MAINPROGRAM
+ #include "fm.h"
++#include <stdio.h>
+ #include <signal.h>
+ #include <setjmp.h>
+ #include <sys/stat.h>
+@@ -11,6 +12,9 @@
+ #include <sys/wait.h>
+ #endif
+ #include <time.h>
++#if defined(__CYGWIN__) && defined(USE_BINMODE_STREAM)
++#include <io.h>
++#endif
+ #include "terms.h"
+ #include "myctype.h"
+ #include "regex.h"
+@@ -119,6 +123,8 @@ static int searchKeyNum(void);
+ #define help() fusage(stdout, 0)
+ #define usage() fusage(stderr, 1)
+
++int enable_inline_image; /* 1 == mlterm OSC 5379, 2 == sixel */
++
+ static void
+ fversion(FILE * f)
+ {
+@@ -200,10 +206,12 @@ fusage(FILE * f, int err)
+ #ifdef USE_M17N
+ fprintf(f, " -I charset document charset\n");
+ fprintf(f, " -O charset display/output charset\n");
++#if 0 /* use -O{s|j|e} instead */
+ fprintf(f, " -e EUC-JP\n");
+ fprintf(f, " -s Shift_JIS\n");
+ fprintf(f, " -j JIS\n");
+ #endif
++#endif
+ fprintf(f, " -B load bookmark\n");
+ fprintf(f, " -bookmark file specify bookmark file\n");
+ fprintf(f, " -T type specify content-type\n");
+@@ -214,7 +222,7 @@ fusage(FILE * f, int err)
+ #endif /* USE_COLOR */
+ fprintf(f,
+ " -N open URL of command line on each new tab\n");
+- fprintf(f, " -F automatically render frame\n");
++ fprintf(f, " -F automatically render frames\n");
+ fprintf(f,
+ " -cols width specify column width (used with -dump)\n");
+ fprintf(f,
+@@ -248,8 +256,12 @@ fusage(FILE * f, int err)
+ #endif /* USE_COOKIE */
+ fprintf(f, " -graph use DEC special graphics for border of table and menu\n");
+ fprintf(f, " -no-graph use ACII character for border of table and menu\n");
++#if 1 /* pager requires -s */
++ fprintf(f, " -s squeeze multiple blank lines\n");
++#else
+ fprintf(f, " -S squeeze multiple blank lines\n");
+- fprintf(f, " -W toggle wrap search mode\n");
++#endif
++ fprintf(f, " -W toggle search wrap mode\n");
+ fprintf(f, " -X don't use termcap init/deinit\n");
+ fprintf(f,
+ " -title[=TERM] set buffer name to terminal title string\n");
+@@ -372,6 +384,13 @@ make_optional_header_string(char *s)
+ return hs;
+ }
+
++static void *
++die_oom(size_t bytes)
++{
++ fprintf(stderr, "Out of memory: %lu bytes unavailable!\n", (unsigned long)bytes);
++ exit(1);
++}
++
+ int
+ main(int argc, char **argv, char **envp)
+ {
+@@ -397,7 +416,15 @@ main(int argc, char **argv, char **envp)
+ wc_ces CodePage;
+ #endif
+ #endif
++#if defined(DONT_CALL_GC_AFTER_FORK) && defined(USE_IMAGE)
++ char **getimage_args = NULL;
++#endif /* defined(DONT_CALL_GC_AFTER_FORK) && defined(USE_IMAGE) */
+ GC_INIT();
++#if (GC_VERSION_MAJOR>7) || ((GC_VERSION_MAJOR==7) && (GC_VERSION_MINOR>=2))
++ GC_set_oom_fn(die_oom);
++#else
++ GC_oom_fn = die_oom;
++#endif
+ #if defined(ENABLE_NLS) || (defined(USE_M17N) && defined(HAVE_LANGINFO_CODESET))
+ setlocale(LC_ALL, "");
+ #endif
+@@ -418,6 +445,10 @@ main(int argc, char **argv, char **envp)
+
+ CurrentDir = currentdir();
+ CurrentPid = (int)getpid();
++#if defined(DONT_CALL_GC_AFTER_FORK) && defined(USE_IMAGE)
++ if (argv[0] && *argv[0])
++ MyProgramName = argv[0];
++#endif /* defined(DONT_CALL_GC_AFTER_FORK) && defined(USE_IMAGE) */
+ BookmarkFile = NULL;
+ config_file = NULL;
+
+@@ -530,12 +561,14 @@ main(int argc, char **argv, char **envp)
+ PagerMax = atoi(argv[i]);
+ }
+ #ifdef USE_M17N
++#if 0 /* use -O{s|j|e} instead */
+ else if (!strcmp("-s", argv[i]))
+ DisplayCharset = WC_CES_SHIFT_JIS;
+ else if (!strcmp("-j", argv[i]))
+ DisplayCharset = WC_CES_ISO_2022_JP;
+ else if (!strcmp("-e", argv[i]))
+ DisplayCharset = WC_CES_EUC_JP;
++#endif
+ else if (!strncmp("-I", argv[i], 2)) {
+ if (argv[i][2] != '\0')
+ p = argv[i] + 2;
+@@ -660,6 +693,12 @@ main(int argc, char **argv, char **envp)
+ }
+ }
+ #endif
++ else if (!strcmp("-ri", argv[i])) {
++ enable_inline_image = 1;
++ }
++ else if (!strcmp("-sixel", argv[i])) {
++ enable_inline_image = 2;
++ }
+ else if (!strcmp("-num", argv[i]))
+ showLineNum = TRUE;
+ else if (!strcmp("-no-proxy", argv[i]))
+@@ -703,7 +742,11 @@ main(int argc, char **argv, char **envp)
+ accept_cookie = TRUE;
+ }
+ #endif /* USE_COOKIE */
++#if 1 /* pager requires -s */
++ else if (!strcmp("-s", argv[i]))
++#else
+ else if (!strcmp("-S", argv[i]))
++#endif
+ squeezeBlankLine = TRUE;
+ else if (!strcmp("-X", argv[i]))
+ Do_not_use_ti_te = TRUE;
+@@ -735,6 +778,15 @@ main(int argc, char **argv, char **envp)
+ else if (!strcmp("-reqlog",argv[i])) {
+ w3m_reqlog=rcFile("request.log");
+ }
++#if defined(DONT_CALL_GC_AFTER_FORK) && defined(USE_IMAGE)
++ else if (!strcmp("-$$getimage", argv[i])) {
++ ++i;
++ getimage_args = argv + i;
++ i += 4;
++ if (i > argc)
++ usage();
++ }
++#endif /* defined(DONT_CALL_GC_AFTER_FORK) && defined(USE_IMAGE) */
+ else {
+ usage();
+ }
+@@ -823,6 +875,30 @@ main(int argc, char **argv, char **envp)
+
+ if (w3m_backend)
+ backend();
++#if defined(DONT_CALL_GC_AFTER_FORK) && defined(USE_IMAGE)
++ if (getimage_args) {
++ char *image_url = conv_from_system(getimage_args[0]);
++ char *base_url = conv_from_system(getimage_args[1]);
++ ParsedURL base_pu;
++
++ parseURL2(base_url, &base_pu, NULL);
++ image_source = getimage_args[2];
++ newbuf = loadGeneralFile(image_url, &base_pu, NULL, 0, NULL);
++ if (!newbuf || !newbuf->real_type ||
++ strncasecmp(newbuf->real_type, "image/", 6))
++ unlink(getimage_args[2]);
++#if defined(HAVE_SYMLINK) && defined(HAVE_LSTAT)
++ symlink(getimage_args[2], getimage_args[3]);
++#else
++ {
++ FILE *f = fopen(getimage_args[3], "w");
++ if (f)
++ fclose(f);
++ }
++#endif
++ w3m_exit(0);
++ }
++#endif /* defined(DONT_CALL_GC_AFTER_FORK) && defined(USE_IMAGE) */
+
+ if (w3m_dump)
+ mySignal(SIGINT, SIG_IGN);
+@@ -833,7 +909,12 @@ main(int argc, char **argv, char **envp)
+ mySignal(SIGPIPE, SigPipe);
+ #endif
+
++#if (GC_VERSION_MAJOR>7) || ((GC_VERSION_MAJOR==7) && (GC_VERSION_MINOR>=2))
++ orig_GC_warn_proc = GC_get_warn_proc();
++ GC_set_warn_proc(wrap_GC_warn_proc);
++#else
+ orig_GC_warn_proc = GC_set_warn_proc(wrap_GC_warn_proc);
++#endif
+ err_msg = Strnew();
+ if (load_argc == 0) {
+ /* no URL specified */
+@@ -894,12 +975,17 @@ main(int argc, char **argv, char **envp)
+ if (i >= 0) {
+ SearchHeader = search_header;
+ DefaultType = default_type;
++ char *url;
++
++ url = load_argv[i];
++ if (getURLScheme(&url) == SCM_MISSING && !ArgvIsURL)
++ url = file_to_url(load_argv[i]);
++ else
++ url = url_encode(conv_from_system(load_argv[i]), NULL, 0);
+ if (w3m_dump == DUMP_HEAD) {
+ request = New(FormList);
+ request->method = FORM_METHOD_HEAD;
+- newbuf =
+- loadGeneralFile(load_argv[i], NULL, NO_REFERER, 0,
+- request);
++ newbuf = loadGeneralFile(url, NULL, NO_REFERER, 0, request);
+ }
+ else {
+ if (post_file && i == 0) {
+@@ -928,9 +1014,7 @@ main(int argc, char **argv, char **envp)
+ else {
+ request = NULL;
+ }
+- newbuf =
+- loadGeneralFile(load_argv[i], NULL, NO_REFERER, 0,
+- request);
++ newbuf = loadGeneralFile(url, NULL, NO_REFERER, 0, request);
+ }
+ if (newbuf == NULL) {
+ /* FIXME: gettextize? */
+@@ -945,7 +1029,7 @@ main(int argc, char **argv, char **envp)
+ break;
+ case SCM_LOCAL:
+ case SCM_LOCAL_CGI:
+- unshiftHist(LoadHist, conv_from_system(load_argv[i]));
++ unshiftHist(LoadHist, url);
+ default:
+ pushHashHist(URLHist, parsedURL2Str(&newbuf->currentURL)->ptr);
+ break;
+@@ -1183,13 +1267,13 @@ static void
+ dump_source(Buffer *buf)
+ {
+ FILE *f;
+- char c;
++ int c;
+ if (buf->sourcefile == NULL)
+ return;
+ f = fopen(buf->sourcefile, "r");
+ if (f == NULL)
+ return;
+- while (c = fgetc(f), !feof(f)) {
++ while ((c = fgetc(f)) != EOF) {
+ putchar(c);
+ }
+ fclose(f);
+@@ -1246,6 +1330,12 @@ dump_extra(Buffer *buf)
+ #endif
+ }
+
++static int
++cmp_anchor_hseq(const void *a, const void *b)
++{
++ return (*((const Anchor **) a))->hseq - (*((const Anchor **) b))->hseq;
++}
++
+ static void
+ do_dump(Buffer *buf)
+ {
+@@ -1266,18 +1356,20 @@ do_dump(Buffer *buf)
+ int i;
+ saveBuffer(buf, stdout, FALSE);
+ if (displayLinkNumber && buf->href) {
++ int nanchor = buf->href->nanchor;
+ printf("\nReferences:\n\n");
+- for (i = 0; i < buf->href->nanchor; i++) {
+- ParsedURL pu;
+- static Str s = NULL;
+- if (buf->href->anchors[i].slave)
++ Anchor **in_order = New_N(Anchor *, buf->href->nanchor);
++ for (i = 0; i < nanchor; i++)
++ in_order[i] = buf->href->anchors + i;
++ qsort(in_order, nanchor, sizeof(Anchor *), cmp_anchor_hseq);
++ for (i = 0; i < nanchor; i++) {
++ ParsedURL pu;
++ char *url;
++ if (in_order[i]->slave)
+ continue;
+- parseURL2(buf->href->anchors[i].url, &pu, baseURL(buf));
+- s = parsedURL2Str(&pu);
+- if (DecodeURL)
+- s = Strnew_charp(url_unquote_conv
+- (s->ptr, Currentbuf->document_charset));
+- printf("[%d] %s\n", buf->href->anchors[i].hseq + 1, s->ptr);
++ parseURL2(in_order[i]->url, &pu, baseURL(buf));
++ url = url_decode2(parsedURL2Str(&pu)->ptr, Currentbuf);
++ printf("[%d] %s\n", in_order[i]->hseq + 1, url);
+ }
+ }
+ }
+@@ -1547,7 +1639,7 @@ nscroll(int n, int mode)
+ }
+
+ /* Move page forward */
+-DEFUN(pgFore, NEXT_PAGE, "Move to next page")
++DEFUN(pgFore, NEXT_PAGE, "Scroll down one page")
+ {
+ if (vi_prec_num)
+ nscroll(searchKeyNum() * (Currentbuf->LINES - 1), B_NORMAL);
+@@ -1557,7 +1649,7 @@ DEFUN(pgFore, NEXT_PAGE, "Move to next page")
+ }
+
+ /* Move page backward */
+-DEFUN(pgBack, PREV_PAGE, "Move to previous page")
++DEFUN(pgBack, PREV_PAGE, "Scroll up one page")
+ {
+ if (vi_prec_num)
+ nscroll(-searchKeyNum() * (Currentbuf->LINES - 1), B_NORMAL);
+@@ -1566,20 +1658,32 @@ DEFUN(pgBack, PREV_PAGE, "Move to previous page")
+ * (Currentbuf->LINES - 1)), prec_num ? B_SCROLL : B_NORMAL);
+ }
+
++/* Move half page forward */
++DEFUN(hpgFore, NEXT_HALF_PAGE, "Scroll down half a page")
++{
++ nscroll(searchKeyNum() * (Currentbuf->LINES / 2 - 1), B_NORMAL);
++}
++
++/* Move half page backward */
++DEFUN(hpgBack, PREV_HALF_PAGE, "Scroll up half a page")
++{
++ nscroll(-searchKeyNum() * (Currentbuf->LINES / 2 - 1), B_NORMAL);
++}
++
+ /* 1 line up */
+-DEFUN(lup1, UP, "Scroll up one line")
++DEFUN(lup1, UP, "Scroll the screen up one line")
+ {
+ nscroll(searchKeyNum(), B_SCROLL);
+ }
+
+ /* 1 line down */
+-DEFUN(ldown1, DOWN, "Scroll down one line")
++DEFUN(ldown1, DOWN, "Scroll the screen down one line")
+ {
+ nscroll(-searchKeyNum(), B_SCROLL);
+ }
+
+ /* move cursor position to the center of screen */
+-DEFUN(ctrCsrV, CENTER_V, "Move to the center column")
++DEFUN(ctrCsrV, CENTER_V, "Center on cursor line")
+ {
+ int offsety;
+ if (Currentbuf->firstLine == NULL)
+@@ -1598,7 +1702,7 @@ DEFUN(ctrCsrV, CENTER_V, "Move to the center column")
+ }
+ }
+
+-DEFUN(ctrCsrH, CENTER_H, "Move to the center line")
++DEFUN(ctrCsrH, CENTER_H, "Center on cursor column")
+ {
+ int offsetx;
+ if (Currentbuf->firstLine == NULL)
+@@ -1612,7 +1716,7 @@ DEFUN(ctrCsrH, CENTER_H, "Move to the center line")
+ }
+
+ /* Redraw screen */
+-DEFUN(rdrwSc, REDRAW, "Redraw screen")
++DEFUN(rdrwSc, REDRAW, "Draw the screen anew")
+ {
+ clear();
+ arrangeCursor(Currentbuf);
+@@ -1844,19 +1948,23 @@ srch_nxtprv(int reverse)
+ result = srchcore(SearchString, routine[reverse]);
+ if (result & SR_FOUND)
+ clear_mark(Currentbuf->currentLine);
++ else {
++ if (reverse == 0)
++ Currentbuf->pos -= 1;
++ }
+ displayBuffer(Currentbuf, B_NORMAL);
+ disp_srchresult(result, (reverse ? "Backward: " : "Forward: "),
+ SearchString);
+ }
+
+ /* Search next matching */
+-DEFUN(srchnxt, SEARCH_NEXT, "Search next regexp")
++DEFUN(srchnxt, SEARCH_NEXT, "Continue search forward")
+ {
+ srch_nxtprv(0);
+ }
+
+ /* Search previous matching */
+-DEFUN(srchprv, SEARCH_PREV, "Search previous regexp")
++DEFUN(srchprv, SEARCH_PREV, "Continue search backward")
+ {
+ srch_nxtprv(1);
+ }
+@@ -1919,7 +2027,7 @@ DEFUN(col1R, RIGHT, "Shift screen one column right")
+ displayBuffer(Currentbuf, B_NORMAL);
+ }
+
+-DEFUN(col1L, LEFT, "Shift screen one column")
++DEFUN(col1L, LEFT, "Shift screen one column left")
+ {
+ Buffer *buf = Currentbuf;
+ Line *l = buf->currentLine;
+@@ -1960,7 +2068,7 @@ DEFUN(setEnv, SETENV, "Set environment variable")
+ displayBuffer(Currentbuf, B_NORMAL);
+ }
+
+-DEFUN(pipeBuf, PIPE_BUF, "Send rendered document to pipe")
++DEFUN(pipeBuf, PIPE_BUF, "Pipe current buffer through a shell command and display output")
+ {
+ Buffer *buf;
+ char *cmd, *tmpf;
+@@ -2006,7 +2114,7 @@ DEFUN(pipeBuf, PIPE_BUF, "Send rendered document to pipe")
+ }
+
+ /* Execute shell command and read output ac pipe. */
+-DEFUN(pipesh, PIPE_SHELL, "Execute shell command and browse")
++DEFUN(pipesh, PIPE_SHELL, "Execute shell command and display output")
+ {
+ Buffer *buf;
+ char *cmd;
+@@ -2037,7 +2145,7 @@ DEFUN(pipesh, PIPE_SHELL, "Execute shell command and browse")
+ }
+
+ /* Execute shell command and load entire output to buffer */
+-DEFUN(readsh, READ_SHELL, "Execute shell command and load")
++DEFUN(readsh, READ_SHELL, "Execute shell command and display output")
+ {
+ Buffer *buf;
+ MySignalHandler(*prevtrap) ();
+@@ -2074,7 +2182,7 @@ DEFUN(readsh, READ_SHELL, "Execute shell command and load")
+ }
+
+ /* Execute shell command */
+-DEFUN(execsh, EXEC_SHELL SHELL, "Execute shell command")
++DEFUN(execsh, EXEC_SHELL SHELL, "Execute shell command and display output")
+ {
+ char *cmd;
+
+@@ -2099,7 +2207,7 @@ DEFUN(execsh, EXEC_SHELL SHELL, "Execute shell command")
+ }
+
+ /* Load file */
+-DEFUN(ldfile, LOAD, "Load local file")
++DEFUN(ldfile, LOAD, "Open local file in a new buffer")
+ {
+ char *fn;
+
+@@ -2118,7 +2226,7 @@ DEFUN(ldfile, LOAD, "Load local file")
+ }
+
+ /* Load help file */
+-DEFUN(ldhelp, HELP, "View help")
++DEFUN(ldhelp, HELP, "Show help panel")
+ {
+ #ifdef USE_HELP_CGI
+ char *lang;
+@@ -2167,13 +2275,12 @@ _movL(int n)
+ displayBuffer(Currentbuf, B_NORMAL);
+ }
+
+-DEFUN(movL, MOVE_LEFT,
+- "Move cursor left (a half screen shift at the left edge)")
++DEFUN(movL, MOVE_LEFT, "Cursor left")
+ {
+ _movL(Currentbuf->COLS / 2);
+ }
+
+-DEFUN(movL1, MOVE_LEFT1, "Move cursor left (1 columns shift at the left edge)")
++DEFUN(movL1, MOVE_LEFT1, "Cursor left. With edge touched, slide")
+ {
+ _movL(1);
+ }
+@@ -2190,14 +2297,12 @@ _movD(int n)
+ displayBuffer(Currentbuf, B_NORMAL);
+ }
+
+-DEFUN(movD, MOVE_DOWN,
+- "Move cursor down (a half screen scroll at the end of screen)")
++DEFUN(movD, MOVE_DOWN, "Cursor down")
+ {
+ _movD((Currentbuf->LINES + 1) / 2);
+ }
+
+-DEFUN(movD1, MOVE_DOWN1,
+- "Move cursor down (1 line scroll at the end of screen)")
++DEFUN(movD1, MOVE_DOWN1, "Cursor down. With edge touched, slide")
+ {
+ _movD(1);
+ }
+@@ -2214,13 +2319,12 @@ _movU(int n)
+ displayBuffer(Currentbuf, B_NORMAL);
+ }
+
+-DEFUN(movU, MOVE_UP,
+- "Move cursor up (a half screen scroll at the top of screen)")
++DEFUN(movU, MOVE_UP, "Cursor up")
+ {
+ _movU((Currentbuf->LINES + 1) / 2);
+ }
+
+-DEFUN(movU1, MOVE_UP1, "Move cursor up (1 line scrol at the top of screen)")
++DEFUN(movU1, MOVE_UP1, "Cursor up. With edge touched, slide")
+ {
+ _movU(1);
+ }
+@@ -2237,14 +2341,12 @@ _movR(int n)
+ displayBuffer(Currentbuf, B_NORMAL);
+ }
+
+-DEFUN(movR, MOVE_RIGHT,
+- "Move cursor right (a half screen shift at the right edge)")
++DEFUN(movR, MOVE_RIGHT, "Cursor right")
+ {
+ _movR(Currentbuf->COLS / 2);
+ }
+
+-DEFUN(movR1, MOVE_RIGHT1,
+- "Move cursor right (1 columns shift at the right edge)")
++DEFUN(movR1, MOVE_RIGHT1, "Cursor right. With edge touched, slide")
+ {
+ _movR(1);
+ }
+@@ -2261,7 +2363,7 @@ DEFUN(movR1, MOVE_RIGHT1,
+ static wc_uint32
+ getChar(char *p)
+ {
+- return wc_any_to_ucs(wtf_parse1(&p));
++ return wc_any_to_ucs(wtf_parse1((wc_uchar **)&p));
+ }
+
+ static int
+@@ -2296,7 +2398,7 @@ prev_nonnull_line(Line *line)
+ return 0;
+ }
+
+-DEFUN(movLW, PREV_WORD, "Move to previous word")
++DEFUN(movLW, PREV_WORD, "Move to the previous word")
+ {
+ char *lb;
+ Line *pline, *l;
+@@ -2364,7 +2466,7 @@ next_nonnull_line(Line *line)
+ return 0;
+ }
+
+-DEFUN(movRW, NEXT_WORD, "Move to next word")
++DEFUN(movRW, NEXT_WORD, "Move to the next word")
+ {
+ char *lb;
+ Line *pline, *l;
+@@ -2442,19 +2544,19 @@ _quitfm(int confirm)
+ }
+
+ /* Quit */
+-DEFUN(quitfm, ABORT EXIT, "Quit w3m without confirmation")
++DEFUN(quitfm, ABORT EXIT, "Quit at once")
+ {
+ _quitfm(FALSE);
+ }
+
+ /* Question and Quit */
+-DEFUN(qquitfm, QUIT, "Quit w3m")
++DEFUN(qquitfm, QUIT, "Quit with confirmation request")
+ {
+ _quitfm(confirm_on_quit);
+ }
+
+ /* Select buffer */
+-DEFUN(selBuf, SELECT, "Go to buffer selection panel")
++DEFUN(selBuf, SELECT, "Display buffer-stack panel")
+ {
+ Buffer *buf;
+ int ok;
+@@ -2502,7 +2604,7 @@ DEFUN(selBuf, SELECT, "Go to buffer selection panel")
+ }
+
+ /* Suspend (on BSD), or run interactive shell (on SysV) */
+-DEFUN(susp, INTERRUPT SUSPEND, "Stop loading document")
++DEFUN(susp, INTERRUPT SUSPEND, "Suspend w3m to background")
+ {
+ #ifndef SIGSTOP
+ char *shell;
+@@ -2550,7 +2652,7 @@ _goLine(char *l)
+ displayBuffer(Currentbuf, B_FORCE_REDRAW);
+ }
+
+-DEFUN(goLine, GOTO_LINE, "Go to specified line")
++DEFUN(goLine, GOTO_LINE, "Go to the specified line")
+ {
+
+ char *str = searchKeyData();
+@@ -2575,7 +2677,7 @@ DEFUN(goLineL, END, "Go to the last line")
+ }
+
+ /* Go to the beginning of the line */
+-DEFUN(linbeg, LINE_BEGIN, "Go to the beginning of line")
++DEFUN(linbeg, LINE_BEGIN, "Go to the beginning of the line")
+ {
+ if (Currentbuf->firstLine == NULL)
+ return;
+@@ -2587,7 +2689,7 @@ DEFUN(linbeg, LINE_BEGIN, "Go to the beginning of line")
+ }
+
+ /* Go to the bottom of the line */
+-DEFUN(linend, LINE_END, "Go to the end of line")
++DEFUN(linend, LINE_END, "Go to the end of the line")
+ {
+ if (Currentbuf->firstLine == NULL)
+ return;
+@@ -2616,7 +2718,7 @@ cur_real_linenumber(Buffer *buf)
+ }
+
+ /* Run editor on the current buffer */
+-DEFUN(editBf, EDIT, "Edit current document")
++DEFUN(editBf, EDIT, "Edit local source")
+ {
+ char *fn = Currentbuf->filename;
+ Str cmd;
+@@ -2643,7 +2745,7 @@ DEFUN(editBf, EDIT, "Edit current document")
+ }
+
+ /* Run editor on the current screen */
+-DEFUN(editScr, EDIT_SCREEN, "Edit currently rendered document")
++DEFUN(editScr, EDIT_SCREEN, "Edit rendered copy of document")
+ {
+ char *tmpf;
+ FILE *f;
+@@ -2681,7 +2783,7 @@ DEFUN(_mark, MARK, "Set/unset mark")
+ }
+
+ /* Go to next mark */
+-DEFUN(nextMk, NEXT_MARK, "Move to next word")
++DEFUN(nextMk, NEXT_MARK, "Go to the next mark")
+ {
+ Line *l;
+ int i;
+@@ -2714,7 +2816,7 @@ DEFUN(nextMk, NEXT_MARK, "Move to next word")
+ }
+
+ /* Go to previous mark */
+-DEFUN(prevMk, PREV_MARK, "Move to previous mark")
++DEFUN(prevMk, PREV_MARK, "Go to the previous mark")
+ {
+ Line *l;
+ int i;
+@@ -2749,7 +2851,7 @@ DEFUN(prevMk, PREV_MARK, "Move to previous mark")
+ }
+
+ /* Mark place to which the regular expression matches */
+-DEFUN(reMark, REG_MARK, "Set mark using regexp")
++DEFUN(reMark, REG_MARK, "Mark all occurences of a pattern")
+ {
+ Line *l;
+ char *str;
+@@ -2804,12 +2906,15 @@ loadLink(char *url, char *target, char *referer, FormList *request)
+ union frameset_element *f_element = NULL;
+ int flag = 0;
+ ParsedURL *base, pu;
++ const int *no_referer_ptr;
+
+ message(Sprintf("loading %s", url)->ptr, 0, 0);
+ refresh();
+
++ no_referer_ptr = query_SCONF_NO_REFERER_FROM(&Currentbuf->currentURL);
+ base = baseURL(Currentbuf);
+- if (base == NULL ||
++ if ((no_referer_ptr && *no_referer_ptr) ||
++ base == NULL ||
+ base->scheme == SCM_LOCAL || base->scheme == SCM_LOCAL_CGI)
+ referer = NO_REFERER;
+ if (referer == NULL)
+@@ -2830,7 +2935,7 @@ loadLink(char *url, char *target, char *referer, FormList *request)
+ if (!on_target) /* open link as an indivisual page */
+ return loadNormalBuf(buf, TRUE);
+
+- if (do_download) /* download (thus no need to render frame) */
++ if (do_download) /* download (thus no need to render frames) */
+ return loadNormalBuf(buf, FALSE);
+
+ if (target == NULL || /* no target specified (that means this page is not a frame page) */
+@@ -2959,9 +3064,8 @@ handleMailto(char *url)
+ }
+
+ /* follow HREF link */
+-DEFUN(followA, GOTO_LINK, "Go to current link")
++DEFUN(followA, GOTO_LINK, "Follow current hyperlink in a new buffer")
+ {
+- Line *l;
+ Anchor *a;
+ ParsedURL u;
+ #ifdef USE_IMAGE
+@@ -2971,7 +3075,6 @@ DEFUN(followA, GOTO_LINK, "Go to current link")
+
+ if (Currentbuf->firstLine == NULL)
+ return;
+- l = Currentbuf->currentLine;
+
+ #ifdef USE_IMAGE
+ a = retrieveCurrentImg(Currentbuf);
+@@ -3051,15 +3154,13 @@ bufferA(void)
+ }
+
+ /* view inline image */
+-DEFUN(followI, VIEW_IMAGE, "View image")
++DEFUN(followI, VIEW_IMAGE, "Display image in viewer")
+ {
+- Line *l;
+ Anchor *a;
+ Buffer *buf;
+
+ if (Currentbuf->firstLine == NULL)
+ return;
+- l = Currentbuf->currentLine;
+
+ a = retrieveCurrentImg(Currentbuf);
+ if (a == NULL)
+@@ -3309,7 +3410,6 @@ followForm(void)
+ static void
+ _followForm(int submit)
+ {
+- Line *l;
+ Anchor *a, *a2;
+ char *p;
+ FormItemList *fi, *f2;
+@@ -3318,7 +3418,6 @@ _followForm(int submit)
+
+ if (Currentbuf->firstLine == NULL)
+ return;
+- l = Currentbuf->currentLine;
+
+ a = retrieveCurrentForm(Currentbuf);
+ if (a == NULL)
+@@ -3423,7 +3522,6 @@ _followForm(int submit)
+ case FORM_INPUT_BUTTON:
+ do_submit:
+ tmp = Strnew();
+- tmp2 = Strnew();
+ multipart = (fi->parent->method == FORM_METHOD_POST &&
+ fi->parent->enctype == FORM_ENCTYPE_MULTIPART);
+ query_from_followform(&tmp, fi, multipart);
+@@ -3501,7 +3599,7 @@ _followForm(int submit)
+ }
+
+ /* go to the top anchor */
+-DEFUN(topA, LINK_BEGIN, "Go to the first link")
++DEFUN(topA, LINK_BEGIN, "Move to the first hyperlink")
+ {
+ HmarkerList *hl = Currentbuf->hmarklist;
+ BufferPoint *po;
+@@ -3534,7 +3632,7 @@ DEFUN(topA, LINK_BEGIN, "Go to the first link")
+ }
+
+ /* go to the last anchor */
+-DEFUN(lastA, LINK_END, "Go to the last link")
++DEFUN(lastA, LINK_END, "Move to the last hyperlink")
+ {
+ HmarkerList *hl = Currentbuf->hmarklist;
+ BufferPoint *po;
+@@ -3568,26 +3666,53 @@ DEFUN(lastA, LINK_END, "Go to the last link")
+ displayBuffer(Currentbuf, B_NORMAL);
+ }
+
++/* go to the nth anchor */
++DEFUN(nthA, LINK_N, "Go to the nth link")
++{
++ HmarkerList *hl = Currentbuf->hmarklist;
++ BufferPoint *po;
++ Anchor *an;
++
++ int n = searchKeyNum();
++ if (n < 0 || n > hl->nmark) return;
++
++ if (Currentbuf->firstLine == NULL)
++ return;
++ if (!hl || hl->nmark == 0)
++ return;
++
++ po = hl->marks + n-1;
++ an = retrieveAnchor(Currentbuf->href, po->line, po->pos);
++ if (an == NULL)
++ an = retrieveAnchor(Currentbuf->formitem, po->line, po->pos);
++ if (an == NULL) return;
++
++ gotoLine(Currentbuf, po->line);
++ Currentbuf->pos = po->pos;
++ arrangeCursor(Currentbuf);
++ displayBuffer(Currentbuf, B_NORMAL);
++}
++
+ /* go to the next anchor */
+-DEFUN(nextA, NEXT_LINK, "Move to next link")
++DEFUN(nextA, NEXT_LINK, "Move to the next hyperlink")
+ {
+ _nextA(FALSE);
+ }
+
+ /* go to the previous anchor */
+-DEFUN(prevA, PREV_LINK, "Move to previous link")
++DEFUN(prevA, PREV_LINK, "Move to the previous hyperlink")
+ {
+ _prevA(FALSE);
+ }
+
+ /* go to the next visited anchor */
+-DEFUN(nextVA, NEXT_VISITED, "Move to next visited link")
++DEFUN(nextVA, NEXT_VISITED, "Move to the next visited hyperlink")
+ {
+ _nextA(TRUE);
+ }
+
+ /* go to the previous visited anchor */
+-DEFUN(prevVA, PREV_VISITED, "Move to previous visited link")
++DEFUN(prevVA, PREV_VISITED, "Move to the previous visited hyperlink")
+ {
+ _prevA(TRUE);
+ }
+@@ -3863,43 +3988,43 @@ nextY(int d)
+ }
+
+ /* go to the next left anchor */
+-DEFUN(nextL, NEXT_LEFT, "Move to next left link")
++DEFUN(nextL, NEXT_LEFT, "Move left to the next hyperlink")
+ {
+ nextX(-1, 0);
+ }
+
+ /* go to the next left-up anchor */
+-DEFUN(nextLU, NEXT_LEFT_UP, "Move to next left (or upward) link")
++DEFUN(nextLU, NEXT_LEFT_UP, "Move left or upward to the next hyperlink")
+ {
+ nextX(-1, -1);
+ }
+
+ /* go to the next right anchor */
+-DEFUN(nextR, NEXT_RIGHT, "Move to next right link")
++DEFUN(nextR, NEXT_RIGHT, "Move right to the next hyperlink")
+ {
+ nextX(1, 0);
+ }
+
+ /* go to the next right-down anchor */
+-DEFUN(nextRD, NEXT_RIGHT_DOWN, "Move to next right (or downward) link")
++DEFUN(nextRD, NEXT_RIGHT_DOWN, "Move right or downward to the next hyperlink")
+ {
+ nextX(1, 1);
+ }
+
+ /* go to the next downward anchor */
+-DEFUN(nextD, NEXT_DOWN, "Move to next downward link")
++DEFUN(nextD, NEXT_DOWN, "Move downward to the next hyperlink")
+ {
+ nextY(1);
+ }
+
+ /* go to the next upward anchor */
+-DEFUN(nextU, NEXT_UP, "Move to next upward link")
++DEFUN(nextU, NEXT_UP, "Move upward to the next hyperlink")
+ {
+ nextY(-1);
+ }
+
+ /* go to the next bufferr */
+-DEFUN(nextBf, NEXT, "Move to next buffer")
++DEFUN(nextBf, NEXT, "Switch to the next buffer")
+ {
+ Buffer *buf;
+ int i;
+@@ -3917,7 +4042,7 @@ DEFUN(nextBf, NEXT, "Move to next buffer")
+ }
+
+ /* go to the previous bufferr */
+-DEFUN(prevBf, PREV, "Move to previous buffer")
++DEFUN(prevBf, PREV, "Switch to the previous buffer")
+ {
+ Buffer *buf;
+ int i;
+@@ -3959,7 +4084,7 @@ checkBackBuffer(Buffer *buf)
+ }
+
+ /* delete current buffer and back to the previous buffer */
+-DEFUN(backBf, BACK, "Back to previous buffer")
++DEFUN(backBf, BACK, "Close current buffer and return to the one below in stack")
+ {
+ Buffer *buf = Currentbuf->linkBuffer[LB_N_FRAME];
+
+@@ -4008,8 +4133,7 @@ DEFUN(backBf, BACK, "Back to previous buffer")
+ displayBuffer(Currentbuf, B_FORCE_REDRAW);
+ }
+
+-DEFUN(deletePrevBuf, DELETE_PREVBUF,
+- "Delete previous buffer (mainly for local-CGI)")
++DEFUN(deletePrevBuf, DELETE_PREVBUF, "Delete previous buffer (mainly for local CGI-scripts)")
+ {
+ Buffer *buf = Currentbuf->nextBuffer;
+ if (buf)
+@@ -4055,6 +4179,7 @@ goURL0(char *prompt, int relative)
+ char *url, *referer;
+ ParsedURL p_url, *current;
+ Buffer *cur_buf = Currentbuf;
++ const int *no_referer_ptr;
+
+ url = searchKeyData();
+ if (url == NULL) {
+@@ -4064,11 +4189,8 @@ goURL0(char *prompt, int relative)
+ current = baseURL(Currentbuf);
+ if (current) {
+ char *c_url = parsedURL2Str(current)->ptr;
+- if (DefaultURLString == DEFAULT_URL_CURRENT) {
+- url = c_url;
+- if (DecodeURL)
+- url = url_unquote_conv(url, 0);
+- }
++ if (DefaultURLString == DEFAULT_URL_CURRENT)
++ url = url_decode2(c_url, NULL);
+ else
+ pushHist(hist, c_url);
+ }
+@@ -4077,11 +4199,8 @@ goURL0(char *prompt, int relative)
+ char *a_url;
+ parseURL2(a->url, &p_url, current);
+ a_url = parsedURL2Str(&p_url)->ptr;
+- if (DefaultURLString == DEFAULT_URL_LINK) {
+- url = a_url;
+- if (DecodeURL)
+- url = url_unquote_conv(url, Currentbuf->document_charset);
+- }
++ if (DefaultURLString == DEFAULT_URL_LINK)
++ url = url_decode2(a_url, Currentbuf);
+ else
+ pushHist(hist, a_url);
+ }
+@@ -4089,15 +4208,22 @@ goURL0(char *prompt, int relative)
+ if (url != NULL)
+ SKIP_BLANKS(url);
+ }
+-#ifdef USE_M17N
+- if (url != NULL) {
+- if ((relative || *url == '#') && Currentbuf->document_charset)
+- url = wc_conv_strict(url, InnerCharset,
+- Currentbuf->document_charset)->ptr;
++ if (relative) {
++ no_referer_ptr = query_SCONF_NO_REFERER_FROM(&Currentbuf->currentURL);
++ current = baseURL(Currentbuf);
++ if ((no_referer_ptr && *no_referer_ptr) ||
++ current == NULL ||
++ current->scheme == SCM_LOCAL || current->scheme == SCM_LOCAL_CGI)
++ referer = NO_REFERER;
+ else
+- url = conv_to_system(url);
++ referer = parsedURL2Str(&Currentbuf->currentURL)->ptr;
++ url = url_encode(url, current, Currentbuf->document_charset);
++ }
++ else {
++ current = NULL;
++ referer = NULL;
++ url = url_encode(url, NULL, 0);
+ }
+-#endif
+ if (url == NULL || *url == '\0') {
+ displayBuffer(Currentbuf, B_FORCE_REDRAW);
+ return;
+@@ -4106,14 +4232,6 @@ goURL0(char *prompt, int relative)
+ gotoLabel(url + 1);
+ return;
+ }
+- if (relative) {
+- current = baseURL(Currentbuf);
+- referer = parsedURL2Str(&Currentbuf->currentURL)->ptr;
+- }
+- else {
+- current = NULL;
+- referer = NULL;
+- }
+ parseURL2(url, &p_url, current);
+ pushHashHist(URLHist, parsedURL2Str(&p_url)->ptr);
+ cmd_loadURL(url, current, referer, NULL);
+@@ -4121,12 +4239,12 @@ goURL0(char *prompt, int relative)
+ pushHashHist(URLHist, parsedURL2Str(&Currentbuf->currentURL)->ptr);
+ }
+
+-DEFUN(goURL, GOTO, "Go to URL")
++DEFUN(goURL, GOTO, "Open specified document in a new buffer")
+ {
+ goURL0("Goto URL: ", FALSE);
+ }
+
+-DEFUN(gorURL, GOTO_RELATIVE, "Go to relative URL")
++DEFUN(gorURL, GOTO_RELATIVE, "Go to relative address")
+ {
+ goURL0("Goto relative URL: ", TRUE);
+ }
+@@ -4151,14 +4269,14 @@ cmd_loadBuffer(Buffer *buf, int prop, int linkid)
+ }
+
+ /* load bookmark */
+-DEFUN(ldBmark, BOOKMARK VIEW_BOOKMARK, "Read bookmark")
++DEFUN(ldBmark, BOOKMARK VIEW_BOOKMARK, "View bookmarks")
+ {
+ cmd_loadURL(BookmarkFile, NULL, NO_REFERER, NULL);
+ }
+
+
+ /* Add current to bookmark */
+-DEFUN(adBmark, ADD_BOOKMARK, "Add current page to bookmark")
++DEFUN(adBmark, ADD_BOOKMARK, "Add current page to bookmarks")
+ {
+ Str tmp;
+ FormList *request;
+@@ -4188,7 +4306,7 @@ DEFUN(adBmark, ADD_BOOKMARK, "Add current page to bookmark")
+ }
+
+ /* option setting */
+-DEFUN(ldOpt, OPTIONS, "Option setting panel")
++DEFUN(ldOpt, OPTIONS, "Display options setting panel")
+ {
+ cmd_loadBuffer(load_option_panel(), BP_NO_URL, LB_NOLINK);
+ }
+@@ -4223,7 +4341,7 @@ DEFUN(msgs, MSGS, "Display error messages")
+ }
+
+ /* page info */
+-DEFUN(pginfo, INFO, "View info of current document")
++DEFUN(pginfo, INFO, "Display information about the current document")
+ {
+ Buffer *buf;
+
+@@ -4291,7 +4409,7 @@ follow_map(struct parsed_tagarg *arg)
+
+ #ifdef USE_MENU
+ /* link menu */
+-DEFUN(linkMn, LINK_MENU, "Popup link element menu")
++DEFUN(linkMn, LINK_MENU, "Pop up link element menu")
+ {
+ LinkList *l = link_menu(Currentbuf);
+ ParsedURL p_url;
+@@ -4329,26 +4447,25 @@ anchorMn(Anchor *(*menu_func) (Buffer *), int go)
+ }
+
+ /* accesskey */
+-DEFUN(accessKey, ACCESSKEY, "Popup acceskey menu")
++DEFUN(accessKey, ACCESSKEY, "Pop up accesskey menu")
+ {
+ anchorMn(accesskey_menu, TRUE);
+ }
+
+ /* list menu */
+-DEFUN(listMn, LIST_MENU, "Popup link list menu and go to selected link")
++DEFUN(listMn, LIST_MENU, "Pop up menu for hyperlinks to browse to")
+ {
+ anchorMn(list_menu, TRUE);
+ }
+
+-DEFUN(movlistMn, MOVE_LIST_MENU,
+- "Popup link list menu and move cursor to selected link")
++DEFUN(movlistMn, MOVE_LIST_MENU, "Pop up menu to navigate between hyperlinks")
+ {
+ anchorMn(list_menu, FALSE);
+ }
+ #endif
+
+ /* link,anchor,image list */
+-DEFUN(linkLst, LIST, "Show all links and images")
++DEFUN(linkLst, LIST, "Show all URLs referenced")
+ {
+ Buffer *buf;
+
+@@ -4375,14 +4492,14 @@ DEFUN(cooLst, COOKIE, "View cookie list")
+
+ #ifdef USE_HISTORY
+ /* History page */
+-DEFUN(ldHist, HISTORY, "View history of URL")
++DEFUN(ldHist, HISTORY, "Show browsing history")
+ {
+ cmd_loadBuffer(historyBuffer(URLHist), BP_NO_URL, LB_NOLINK);
+ }
+ #endif /* USE_HISTORY */
+
+ /* download HREF link */
+-DEFUN(svA, SAVE_LINK, "Save link to file")
++DEFUN(svA, SAVE_LINK, "Save hyperlink target")
+ {
+ CurrentKeyData = NULL; /* not allowed in w3m-control: */
+ do_download = TRUE;
+@@ -4391,7 +4508,7 @@ DEFUN(svA, SAVE_LINK, "Save link to file")
+ }
+
+ /* download IMG link */
+-DEFUN(svI, SAVE_IMAGE, "Save image to file")
++DEFUN(svI, SAVE_IMAGE, "Save inline image")
+ {
+ CurrentKeyData = NULL; /* not allowed in w3m-control: */
+ do_download = TRUE;
+@@ -4400,7 +4517,7 @@ DEFUN(svI, SAVE_IMAGE, "Save image to file")
+ }
+
+ /* save buffer */
+-DEFUN(svBuf, PRINT SAVE_SCREEN, "Save rendered document to file")
++DEFUN(svBuf, PRINT SAVE_SCREEN, "Save rendered document")
+ {
+ char *qfile = NULL, *file;
+ FILE *f;
+@@ -4449,7 +4566,7 @@ DEFUN(svBuf, PRINT SAVE_SCREEN, "Save rendered document to file")
+ }
+
+ /* save source */
+-DEFUN(svSrc, DOWNLOAD SAVE, "Save document source to file")
++DEFUN(svSrc, DOWNLOAD SAVE, "Save document source")
+ {
+ char *file;
+
+@@ -4510,8 +4627,7 @@ _peekURL(int only_img)
+ s = parsedURL2Str(&pu);
+ }
+ if (DecodeURL)
+- s = Strnew_charp(url_unquote_conv
+- (s->ptr, Currentbuf->document_charset));
++ s = Strnew_charp(url_decode2(s->ptr, Currentbuf));
+ #ifdef USE_M17N
+ s = checkType(s, &pp, NULL);
+ p = NewAtom_N(Lineprop, s->length);
+@@ -4529,13 +4645,13 @@ _peekURL(int only_img)
+ }
+
+ /* peek URL */
+-DEFUN(peekURL, PEEK_LINK, "Peek link URL")
++DEFUN(peekURL, PEEK_LINK, "Show target address")
+ {
+ _peekURL(0);
+ }
+
+ /* peek URL of image */
+-DEFUN(peekIMG, PEEK_IMG, "Peek image URL")
++DEFUN(peekIMG, PEEK_IMG, "Show image address")
+ {
+ _peekURL(1);
+ }
+@@ -4549,7 +4665,7 @@ currentURL(void)
+ return parsedURL2Str(&Currentbuf->currentURL);
+ }
+
+-DEFUN(curURL, PEEK, "Peek current URL")
++DEFUN(curURL, PEEK, "Show current address")
+ {
+ static Str s = NULL;
+ #ifdef USE_M17N
+@@ -4570,7 +4686,7 @@ DEFUN(curURL, PEEK, "Peek current URL")
+ offset = 0;
+ s = currentURL();
+ if (DecodeURL)
+- s = Strnew_charp(url_unquote_conv(s->ptr, 0));
++ s = Strnew_charp(url_decode2(s->ptr, NULL));
+ #ifdef USE_M17N
+ s = checkType(s, &pp, NULL);
+ p = NewAtom_N(Lineprop, s->length);
+@@ -4588,7 +4704,7 @@ DEFUN(curURL, PEEK, "Peek current URL")
+ }
+ /* view HTML source */
+
+-DEFUN(vwSrc, SOURCE VIEW, "View HTML source")
++DEFUN(vwSrc, SOURCE VIEW, "Toggle between HTML shown or processed")
+ {
+ Buffer *buf;
+
+@@ -4679,7 +4795,7 @@ DEFUN(vwSrc, SOURCE VIEW, "View HTML source")
+ }
+
+ /* reload */
+-DEFUN(reload, RELOAD, "Reload buffer")
++DEFUN(reload, RELOAD, "Load current document anew")
+ {
+ Buffer *buf, *fbuf = NULL, sbuf;
+ #ifdef USE_M17N
+@@ -4804,7 +4920,7 @@ DEFUN(reload, RELOAD, "Reload buffer")
+ }
+
+ /* reshape */
+-DEFUN(reshape, RESHAPE, "Re-render buffer")
++DEFUN(reshape, RESHAPE, "Re-render document")
+ {
+ Currentbuf->need_reshape = TRUE;
+ reshapeBuffer(Currentbuf);
+@@ -4846,7 +4962,7 @@ change_charset(struct parsed_tagarg *arg)
+ _docCSet(charset);
+ }
+
+-DEFUN(docCSet, CHARSET, "Change the current document charset")
++DEFUN(docCSet, CHARSET, "Change the character encoding for the current document")
+ {
+ char *cs;
+ wc_ces charset;
+@@ -4864,7 +4980,7 @@ DEFUN(docCSet, CHARSET, "Change the current document charset")
+ _docCSet(charset);
+ }
+
+-DEFUN(defCSet, DEFAULT_CHARSET, "Change the default document charset")
++DEFUN(defCSet, DEFAULT_CHARSET, "Change the default character encoding")
+ {
+ char *cs;
+ wc_ces charset;
+@@ -4915,13 +5031,13 @@ chkURLBuffer(Buffer *buf)
+ buf->check_url |= CHK_URL;
+ }
+
+-DEFUN(chkURL, MARK_URL, "Mark URL-like strings as anchors")
++DEFUN(chkURL, MARK_URL, "Turn URL-like strings into hyperlinks")
+ {
+ chkURLBuffer(Currentbuf);
+ displayBuffer(Currentbuf, B_FORCE_REDRAW);
+ }
+
+-DEFUN(chkWORD, MARK_WORD, "Mark current word as anchor")
++DEFUN(chkWORD, MARK_WORD, "Turn current word into hyperlink")
+ {
+ char *p;
+ int spos, epos;
+@@ -4948,15 +5064,15 @@ chkNMIDBuffer(Buffer *buf)
+ buf->check_url |= CHK_NMID;
+ }
+
+-DEFUN(chkNMID, MARK_MID, "Mark Message-ID-like strings as anchors")
++DEFUN(chkNMID, MARK_MID, "Turn Message-ID-like strings into hyperlinks")
+ {
+ chkNMIDBuffer(Currentbuf);
+ displayBuffer(Currentbuf, B_FORCE_REDRAW);
+ }
+ #endif /* USE_NNTP */
+
+-/* render frame */
+-DEFUN(rFrame, FRAME, "Render frame")
++/* render frames */
++DEFUN(rFrame, FRAME, "Toggle rendering HTML frames")
+ {
+ Buffer *buf;
+
+@@ -5010,6 +5126,24 @@ invoke_browser(char *url)
+ case 3:
+ browser = ExtBrowser3;
+ break;
++ case 4:
++ browser = ExtBrowser4;
++ break;
++ case 5:
++ browser = ExtBrowser5;
++ break;
++ case 6:
++ browser = ExtBrowser6;
++ break;
++ case 7:
++ browser = ExtBrowser7;
++ break;
++ case 8:
++ browser = ExtBrowser8;
++ break;
++ case 9:
++ browser = ExtBrowser9;
++ break;
+ }
+ if (browser == NULL || *browser == '\0') {
+ browser = inputStr("Browse command: ", NULL);
+@@ -5038,7 +5172,7 @@ invoke_browser(char *url)
+ displayBuffer(Currentbuf, B_FORCE_REDRAW);
+ }
+
+-DEFUN(extbrz, EXTERN, "Execute external browser")
++DEFUN(extbrz, EXTERN, "Display using an external browser")
+ {
+ if (Currentbuf->bufferprop & BP_INTERNAL) {
+ /* FIXME: gettextize? */
+@@ -5055,7 +5189,7 @@ DEFUN(extbrz, EXTERN, "Execute external browser")
+ invoke_browser(parsedURL2Str(&Currentbuf->currentURL)->ptr);
+ }
+
+-DEFUN(linkbrz, EXTERN_LINK, "View current link using external browser")
++DEFUN(linkbrz, EXTERN_LINK, "Display target using an external browser")
+ {
+ Anchor *a;
+ ParsedURL pu;
+@@ -5070,7 +5204,7 @@ DEFUN(linkbrz, EXTERN_LINK, "View current link using external browser")
+ }
+
+ /* show current line number and number of lines in the entire document */
+-DEFUN(curlno, LINE_INFO, "Show current line number")
++DEFUN(curlno, LINE_INFO, "Display current position in document")
+ {
+ Line *l = Currentbuf->currentLine;
+ Str tmp;
+@@ -5362,7 +5496,7 @@ process_mouse(int btn, int x, int y)
+ }
+ }
+
+-DEFUN(msToggle, MOUSE_TOGGLE, "Toggle activity of mouse")
++DEFUN(msToggle, MOUSE_TOGGLE, "Toggle mouse support")
+ {
+ if (use_mouse) {
+ use_mouse = FALSE;
+@@ -5398,6 +5532,60 @@ DEFUN(mouse, MOUSE, "mouse operation")
+ process_mouse(btn, x, y);
+ }
+
++DEFUN(sgrmouse, SGRMOUSE, "SGR 1006 mouse operation")
++{
++ int btn = 0, x = 0, y = 0;
++ unsigned char c;
++
++ do {
++ c = getch();
++ if (IS_DIGIT(c))
++ btn = btn * 10 + c - '0';
++ else if (c == ';')
++ break;
++ else
++ return;
++ } while (1);
++
++#if defined(__CYGWIN__) && CYGWIN_VERSION_DLL_MAJOR < 1005
++ if (cygwin_mouse_btn_swapped) {
++ if (btn == MOUSE_BTN2_DOWN)
++ btn = MOUSE_BTN3_DOWN;
++ else if (btn == MOUSE_BTN3_DOWN)
++ btn = MOUSE_BTN2_DOWN;
++ };
++#endif
++
++ do {
++ c = getch();
++ if (IS_DIGIT(c))
++ x = x * 10 + c - '0';
++ else if (c == ';')
++ break;
++ else
++ return;
++ } while (1);
++ if (x>0) x--;
++
++ do {
++ c = getch();
++ if (IS_DIGIT(c))
++ y = y * 10 + c - '0';
++ else if (c == 'M')
++ break;
++ else if (c == 'm') {
++ btn |= 3;
++ break;
++ } else
++ return;
++ } while (1);
++ if (y>0) y--;
++
++ if (x < 0 || x >= COLS || y < 0 || y > LASTLINE)
++ return;
++ process_mouse(btn, x, y);
++}
++
+ #ifdef USE_GPM
+ int
+ gpm_process_mouse(Gpm_Event * event, void *data)
+@@ -5451,7 +5639,7 @@ sysm_process_mouse(int x, int y, int nbs, int obs)
+ }
+ #endif /* USE_SYSMOUSE */
+
+-DEFUN(movMs, MOVE_MOUSE, "Move cursor to mouse cursor (for mouse action)")
++DEFUN(movMs, MOVE_MOUSE, "Move cursor to mouse pointer")
+ {
+ if (!mouse_action.in_action)
+ return;
+@@ -5473,7 +5661,7 @@ DEFUN(movMs, MOVE_MOUSE, "Move cursor to mouse cursor (for mouse action)")
+ #define FRAME_WIDTH 1
+ #endif
+
+-DEFUN(menuMs, MENU_MOUSE, "Popup menu at mouse cursor (for mouse action)")
++DEFUN(menuMs, MENU_MOUSE, "Pop up menu at mouse pointer")
+ {
+ if (!mouse_action.in_action)
+ return;
+@@ -5490,7 +5678,7 @@ DEFUN(menuMs, MENU_MOUSE, "Popup menu at mouse cursor (for mouse action)")
+ }
+ #endif
+
+-DEFUN(tabMs, TAB_MOUSE, "Move to tab on mouse cursor (for mouse action)")
++DEFUN(tabMs, TAB_MOUSE, "Select tab by mouse action")
+ {
+ TabBuffer *tab;
+
+@@ -5503,8 +5691,7 @@ DEFUN(tabMs, TAB_MOUSE, "Move to tab on mouse cursor (for mouse action)")
+ displayBuffer(Currentbuf, B_FORCE_REDRAW);
+ }
+
+-DEFUN(closeTMs, CLOSE_TAB_MOUSE,
+- "Close tab on mouse cursor (for mouse action)")
++DEFUN(closeTMs, CLOSE_TAB_MOUSE, "Close tab at mouse pointer")
+ {
+ TabBuffer *tab;
+
+@@ -5518,12 +5705,12 @@ DEFUN(closeTMs, CLOSE_TAB_MOUSE,
+ }
+ #endif /* USE_MOUSE */
+
+-DEFUN(dispVer, VERSION, "Display version of w3m")
++DEFUN(dispVer, VERSION, "Display the version of w3m")
+ {
+ disp_message(Sprintf("w3m version %s", w3m_version)->ptr, TRUE);
+ }
+
+-DEFUN(wrapToggle, WRAP_TOGGLE, "Toggle wrap search mode")
++DEFUN(wrapToggle, WRAP_TOGGLE, "Toggle wrapping mode in searches")
+ {
+ if (WrapSearch) {
+ WrapSearch = FALSE;
+@@ -5604,7 +5791,7 @@ execdict(char *word)
+ disp_message("Execution failed", TRUE);
+ return;
+ }
+- else {
++ else if (buf != NO_BUFFER) {
+ buf->filename = w;
+ buf->buffername = Sprintf("%s %s", DICTBUFFERNAME, word)->ptr;
+ if (buf->type == NULL)
+@@ -5671,7 +5858,7 @@ set_buffer_environ(Buffer *buf)
+ set_environ("W3M_CURRENT_FORM", form2str((FormItemList *)a->url));
+ else
+ set_environ("W3M_CURRENT_FORM", "");
+- set_environ("W3M_CURRENT_LINE", Sprintf("%d",
++ set_environ("W3M_CURRENT_LINE", Sprintf("%ld",
+ l->real_linenumber)->ptr);
+ set_environ("W3M_CURRENT_COLUMN", Sprintf("%d",
+ buf->currentColumn +
+@@ -5747,8 +5934,14 @@ deleteFiles()
+ Firstbuf = buf;
+ }
+ }
+- while ((f = popText(fileToDelete)) != NULL)
++ while ((f = popText(fileToDelete)) != NULL) {
+ unlink(f);
++ if (enable_inline_image == 2 && strcmp(f+strlen(f)-4, ".gif") == 0) {
++ Str firstframe = Strnew_charp(f);
++ Strcat_charp(firstframe, "-1");
++ unlink(firstframe->ptr);
++ }
++ }
+ }
+
+ void
+@@ -5772,7 +5965,7 @@ w3m_exit(int i)
+ exit(i);
+ }
+
+-DEFUN(execCmd, COMMAND, "Execute w3m command(s)")
++DEFUN(execCmd, COMMAND, "Invoke w3m function(s)")
+ {
+ char *data, *p;
+ int cmd;
+@@ -5900,7 +6093,7 @@ setAlarmEvent(AlarmEvent * event, int sec, short status, int cmd, void *data)
+ }
+ #endif
+
+-DEFUN(reinit, REINIT, "Reload configuration files")
++DEFUN(reinit, REINIT, "Reload configuration file")
+ {
+ char *resource = searchKeyData();
+
+@@ -5969,8 +6162,7 @@ DEFUN(reinit, REINIT, "Reload configuration files")
+ ptr, FALSE);
+ }
+
+-DEFUN(defKey, DEFINE_KEY,
+- "Define a binding between a key stroke and a user command")
++DEFUN(defKey, DEFINE_KEY, "Define a binding between a key stroke combination and a command")
+ {
+ char *data;
+
+@@ -6031,7 +6223,7 @@ _newT(void)
+ nTab++;
+ }
+
+-DEFUN(newT, NEW_TAB, "Open new tab")
++DEFUN(newT, NEW_TAB, "Open a new tab (with current document)")
+ {
+ _newT();
+ displayBuffer(Currentbuf, B_REDRAW_IMAGE);
+@@ -6142,7 +6334,7 @@ deleteTab(TabBuffer * tab)
+ return FirstTab;
+ }
+
+-DEFUN(closeT, CLOSE_TAB, "Close current tab")
++DEFUN(closeT, CLOSE_TAB, "Close tab")
+ {
+ TabBuffer *tab;
+
+@@ -6157,7 +6349,7 @@ DEFUN(closeT, CLOSE_TAB, "Close current tab")
+ displayBuffer(Currentbuf, B_REDRAW_IMAGE);
+ }
+
+-DEFUN(nextT, NEXT_TAB, "Move to next tab")
++DEFUN(nextT, NEXT_TAB, "Switch to the next tab")
+ {
+ int i;
+
+@@ -6172,7 +6364,7 @@ DEFUN(nextT, NEXT_TAB, "Move to next tab")
+ displayBuffer(Currentbuf, B_REDRAW_IMAGE);
+ }
+
+-DEFUN(prevT, PREV_TAB, "Move to previous tab")
++DEFUN(prevT, PREV_TAB, "Switch to the previous tab")
+ {
+ int i;
+
+@@ -6236,7 +6428,7 @@ followTab(TabBuffer * tab)
+ displayBuffer(Currentbuf, B_FORCE_REDRAW);
+ }
+
+-DEFUN(tabA, TAB_LINK, "Open current link on new tab")
++DEFUN(tabA, TAB_LINK, "Follow current hyperlink in a new tab")
+ {
+ followTab(prec_num ? numTab(PREC_NUM) : NULL);
+ }
+@@ -6277,13 +6469,13 @@ tabURL0(TabBuffer * tab, char *prompt, int relative)
+ displayBuffer(Currentbuf, B_FORCE_REDRAW);
+ }
+
+-DEFUN(tabURL, TAB_GOTO, "Open URL on new tab")
++DEFUN(tabURL, TAB_GOTO, "Open specified document in a new tab")
+ {
+ tabURL0(prec_num ? numTab(PREC_NUM) : NULL,
+ "Goto URL on new tab: ", FALSE);
+ }
+
+-DEFUN(tabrURL, TAB_GOTO_RELATIVE, "Open relative URL on new tab")
++DEFUN(tabrURL, TAB_GOTO_RELATIVE, "Open relative address in a new tab")
+ {
+ tabURL0(prec_num ? numTab(PREC_NUM) : NULL,
+ "Goto relative URL on new tab: ", TRUE);
+@@ -6328,7 +6520,7 @@ moveTab(TabBuffer * t, TabBuffer * t2, int right)
+ displayBuffer(Currentbuf, B_FORCE_REDRAW);
+ }
+
+-DEFUN(tabR, TAB_RIGHT, "Move current tab right")
++DEFUN(tabR, TAB_RIGHT, "Move right along the tab bar")
+ {
+ TabBuffer *tab;
+ int i;
+@@ -6338,7 +6530,7 @@ DEFUN(tabR, TAB_RIGHT, "Move current tab right")
+ moveTab(CurrentTab, tab ? tab : LastTab, TRUE);
+ }
+
+-DEFUN(tabL, TAB_LEFT, "Move current tab left")
++DEFUN(tabL, TAB_LEFT, "Move left along the tab bar")
+ {
+ TabBuffer *tab;
+ int i;
+@@ -6547,7 +6739,7 @@ stopDownload(void)
+ }
+
+ /* download panel */
+-DEFUN(ldDL, DOWNLOAD_LIST, "Display download list panel")
++DEFUN(ldDL, DOWNLOAD_LIST, "Display downloads panel")
+ {
+ Buffer *buf;
+ int replace = FALSE, new_tab = FALSE;
+diff --git a/map.c b/map.c
+index 90aa35a..bb240ea 100644
+--- a/map.c
++++ b/map.c
+@@ -279,7 +279,7 @@ follow_map_panel(Buffer *buf, char *name)
+ p = parsedURL2Str(&pu)->ptr;
+ q = html_quote(p);
+ if (DecodeURL)
+- p = html_quote(url_unquote_conv(p, buf->document_charset));
++ p = html_quote(url_decode2(p, buf));
+ else
+ p = q;
+ Strcat_m_charp(mappage, "<tr valign=top><td><a href=\"", q, "\">",
+@@ -417,10 +417,7 @@ append_map_info(Buffer *buf, Str tmp, FormItemList *fi)
+ continue;
+ parseURL2(a->url, &pu, baseURL(buf));
+ q = html_quote(parsedURL2Str(&pu)->ptr);
+- if (DecodeURL)
+- p = html_quote(url_unquote_conv(a->url, buf->document_charset));
+- else
+- p = html_quote(a->url);
++ p = html_quote(url_decode2(a->url, buf));
+ Strcat_m_charp(tmp, "<tr valign=top><td> <td><a href=\"",
+ q, "\">",
+ html_quote(*a->alt ? a->alt : mybasename(a->url)),
+@@ -457,10 +454,8 @@ append_link_info(Buffer *buf, Str html, LinkList * link)
+ Strcat_charp(html, "[Rev]");
+ if (!l->url)
+ url = "(empty)";
+- else if (DecodeURL)
+- url = html_quote(url_unquote_conv(l->url, buf->document_charset));
+ else
+- url = html_quote(l->url);
++ url = html_quote(url_decode2(l->url, buf));
+ Strcat_m_charp(html, "<td>", url, NULL);
+ if (l->ctype)
+ Strcat_m_charp(html, " (", html_quote(l->ctype), ")", NULL);
+@@ -498,8 +493,7 @@ append_frame_info(Buffer *buf, Str html, struct frameset *set, int level)
+ Strcat_charp(html, p);
+ }
+ if (DecodeURL)
+- p = html_quote(url_unquote_conv(frame.body->url,
+- buf->document_charset));
++ p = html_quote(url_decode2(frame.body->url, buf));
+ else
+ p = q;
+ Strcat_m_charp(html, " ", p, "</a></pre_int><br>\n", NULL);
+@@ -550,9 +544,7 @@ page_info_panel(Buffer *buf)
+ #ifdef USE_M17N
+ Strcat_charp(tmp, "<form method=internal action=charset>");
+ #endif
+- p = parsedURL2Str(&buf->currentURL)->ptr;
+- if (DecodeURL)
+- p = url_unquote_conv(p, 0);
++ p = url_decode2(parsedURL2Str(&buf->currentURL)->ptr, NULL);
+ Strcat_m_charp(tmp, "<table cellpadding=0>",
+ "<tr valign=top><td nowrap>Title<td>",
+ html_quote(buf->buffername),
+@@ -581,7 +573,7 @@ page_info_panel(Buffer *buf)
+ "<tr valign=top><td nowrap>Number of lines<td>",
+ Sprintf("%d", all)->ptr,
+ "<tr valign=top><td nowrap>Transferred bytes<td>",
+- Sprintf("%d", buf->trbyte)->ptr, NULL);
++ Sprintf("%lu", (unsigned long)buf->trbyte)->ptr, NULL);
+
+ a = retrieveCurrentAnchor(buf);
+ if (a != NULL) {
+@@ -589,7 +581,7 @@ page_info_panel(Buffer *buf)
+ p = parsedURL2Str(&pu)->ptr;
+ q = html_quote(p);
+ if (DecodeURL)
+- p = html_quote(url_unquote_conv(p, buf->document_charset));
++ p = html_quote(url_decode2(p, buf));
+ else
+ p = q;
+ Strcat_m_charp(tmp,
+@@ -602,7 +594,7 @@ page_info_panel(Buffer *buf)
+ p = parsedURL2Str(&pu)->ptr;
+ q = html_quote(p);
+ if (DecodeURL)
+- p = html_quote(url_unquote_conv(p, buf->document_charset));
++ p = html_quote(url_decode2(p, buf));
+ else
+ p = q;
+ Strcat_m_charp(tmp,
+@@ -613,10 +605,7 @@ page_info_panel(Buffer *buf)
+ if (a != NULL) {
+ FormItemList *fi = (FormItemList *)a->url;
+ p = form2str(fi);
+- if (DecodeURL)
+- p = html_quote(url_unquote_conv(p, buf->document_charset));
+- else
+- p = html_quote(p);
++ p = html_quote(url_decode2(p, buf));
+ Strcat_m_charp(tmp,
+ "<tr valign=top><td nowrap>Method/type of current form <td>",
+ p, NULL);
+diff --git a/matrix.c b/matrix.c
+index 64fd0ad..bc7a5be 100644
+--- a/matrix.c
++++ b/matrix.c
+@@ -34,18 +34,12 @@
+
+ #include "config.h"
+ #include "matrix.h"
+-#include <gc.h>
++#include "alloc.h"
+
+ /*
+ * Macros from "fm.h".
+ */
+
+-#define New(type) ((type*)GC_MALLOC(sizeof(type)))
+-#define NewAtom(type) ((type*)GC_MALLOC_ATOMIC(sizeof(type)))
+-#define New_N(type,n) ((type*)GC_MALLOC((n)*sizeof(type)))
+-#define NewAtom_N(type,n) ((type*)GC_MALLOC_ATOMIC((n)*sizeof(type)))
+-#define Renew_N(type,ptr,n) ((type*)GC_REALLOC((ptr),(n)*sizeof(type)))
+-
+ #define SWAPD(a,b) { double tmp = a; a = b; b = tmp; }
+ #define SWAPI(a,b) { int tmp = a; a = b; b = tmp; }
+
+diff --git a/menu.c b/menu.c
+index 774b1bd..01acc31 100644
+--- a/menu.c
++++ b/menu.c
+@@ -57,6 +57,7 @@ static int mCancel(char c);
+ static int mClose(char c);
+ static int mSusp(char c);
+ static int mMouse(char c);
++static int mSgrMouse(char c);
+ static int mSrchF(char c);
+ static int mSrchB(char c);
+ static int mSrchN(char c);
+@@ -116,15 +117,15 @@ static int (*MenuEscKeymap[128]) (char c) = {
+ mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
+
+ mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
+-/* O */
++/* O */
+ mNull, mNull, mNull, mNull, mNull, mNull, mNull, mEscB,
+ mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
+-/* [ */
++/* [ */
+ mNull, mNull, mNull, mEscB, mNull, mNull, mNull, mNull,
+
+ mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
+ mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
+-/* v */
++/* v */
+ mNull, mNull, mNull, mNull, mNull, mNull, mPrev, mNull,
+ mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
+ };
+@@ -137,10 +138,11 @@ static int (*MenuEscBKeymap[128]) (char c) = {
+ mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
+ mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
+ mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
+- mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
+-/* A B C D E */
++/* 8 9 : ; < = > ? */
++ mNull, mNull, mNull, mNull, mSgrMouse,mNull,mNull, mNull,
++/* A B C D E */
+ mNull, mUp, mDown, mOk, mCancel,mClose, mNull, mNull,
+-/* L M */
++/* L M */
+ mNull, mNull, mNull, mNull, mClose, mMouse, mNull, mNull,
+ mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
+ mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
+@@ -359,7 +361,6 @@ geom_menu(Menu *menu, int x, int y, int mselect)
+ if (win_w > COLS) {
+ menu->width = COLS - 2 * FRAME_WIDTH;
+ menu->width -= menu->width % FRAME_WIDTH;
+- win_w = menu->width + 2 * FRAME_WIDTH;
+ }
+ }
+ menu->x = win_x + FRAME_WIDTH;
+@@ -1203,6 +1204,48 @@ mMouse(char c)
+ return process_mMouse(btn, x, y);
+ }
+
++static int
++mSgrMouse(char c)
++{
++ int btn = 0, x = 0, y = 0;
++ unsigned char ch;
++
++ for (ch = getch(); IS_DIGIT(ch); ch = getch())
++ btn = btn * 10 + ch - '0';
++ if (ch != ';')
++ return MENU_NOTHING;
++
++#if defined (__CYGWIN__) && CYGWIN_VERSION_DLL_MAJOR < 1005
++ if (cygwin_mouse_btn_swapped) {
++ if (btn == MOUSE_BTN2_DOWN)
++ btn = MOUSE_BTN3_DOWN;
++ else if (btn == MOUSE_BTN3_DOWN)
++ btn = MOUSE_BTN2_DOWN;
++ }
++#endif
++
++ for (ch = getch(); IS_DIGIT(ch); ch = getch())
++ x = x * 10 + ch - '0';
++ if (ch != ';')
++ return MENU_NOTHING;
++ if (x > 0)
++ x--;
++
++ for (ch = getch(); IS_DIGIT(ch); ch = getch())
++ y = y * 10 + ch - '0';
++ if (ch == 'm')
++ btn |= 3;
++ else if (ch != 'M' && ch != ';')
++ return MENU_NOTHING;
++ if (y > 0)
++ y--;
++
++ if (x < 0 || x >= COLS || y < 0 || y > LASTLINE)
++ return MENU_NOTHING;
++
++ return process_mMouse(btn, x, y);
++}
++
+ #ifdef USE_GPM
+ static int
+ gpm_process_menu_mouse(Gpm_Event * event, void *data)
+@@ -1261,6 +1304,12 @@ mMouse(char c)
+ {
+ return (MENU_NOTHING);
+ }
++
++static int
++mSgrMouse(char c)
++{
++ return (MENU_NOTHING);
++}
+ #endif /* not USE_MOUSE */
+
+ /* --- MenuFunctions (END) --- */
+@@ -1289,7 +1338,7 @@ mainMenu(int x, int y)
+ popupMenu(x, y, &MainMenu);
+ }
+
+-DEFUN(mainMn, MAIN_MENU MENU, "Popup menu")
++DEFUN(mainMn, MAIN_MENU MENU, "Pop up menu")
+ {
+ Menu *menu = &MainMenu;
+ char *data;
+@@ -1317,7 +1366,7 @@ DEFUN(mainMn, MAIN_MENU MENU, "Popup menu")
+
+ /* --- SelectMenu --- */
+
+-DEFUN(selMn, SELECT_MENU, "Popup buffer selection menu")
++DEFUN(selMn, SELECT_MENU, "Pop up buffer-stack menu")
+ {
+ int x = Currentbuf->cursorX + Currentbuf->rootX,
+ y = Currentbuf->cursorY + Currentbuf->rootY;
+@@ -1365,9 +1414,7 @@ initSelectMenu(void)
+ break;
+ default:
+ Strcat_char(str, ' ');
+- p = parsedURL2Str(&buf->currentURL)->ptr;
+- if (DecodeURL)
+- p = url_unquote_conv(p, 0);
++ p = url_decode2(parsedURL2Str(&buf->currentURL)->ptr, NULL);
+ Strcat_charp(str, p);
+ break;
+ }
+@@ -1464,7 +1511,7 @@ smDelBuf(char c)
+
+ /* --- SelTabMenu --- */
+
+-DEFUN(tabMn, TAB_MENU, "Popup tab selection menu")
++DEFUN(tabMn, TAB_MENU, "Pop up tab selection menu")
+ {
+ int x = Currentbuf->cursorX + Currentbuf->rootX,
+ y = Currentbuf->cursorY + Currentbuf->rootY;
+@@ -1513,9 +1560,7 @@ initSelTabMenu(void)
+ case SCM_MISSING:
+ break;
+ default:
+- p = parsedURL2Str(&buf->currentURL)->ptr;
+- if (DecodeURL)
+- p = url_unquote_conv(p, 0);
++ p = url_decode2(parsedURL2Str(&buf->currentURL)->ptr, NULL);
+ Strcat_charp(str, p);
+ break;
+ }
+@@ -1845,10 +1890,8 @@ link_menu(Buffer *buf)
+ Strcat_charp(str, " ");
+ if (!l->url)
+ p = "";
+- else if (DecodeURL)
+- p = url_unquote_conv(l->url, buf->document_charset);
+ else
+- p = l->url;
++ p = url_decode2(l->url, buf);
+ Strcat_charp(str, p);
+ label[i] = str->ptr;
+ if (len < str->length)
+@@ -1913,6 +1956,7 @@ accesskey_menu(Buffer *buf)
+ }
+ label[nitem] = NULL;
+
++ set_menu_frame();
+ new_option_menu(&menu, label, &key, NULL);
+
+ menu.initial = 0;
+@@ -2025,7 +2069,6 @@ list_menu(Buffer *buf)
+ label[nitem] = NULL;
+
+ set_menu_frame();
+- set_menu_frame();
+ new_option_menu(&menu, label, &key, NULL);
+
+ menu.initial = 0;
+diff --git a/mimehead.c b/mimehead.c
+index 78997e0..d16270c 100644
+--- a/mimehead.c
++++ b/mimehead.c
+@@ -64,12 +64,22 @@ ha2d(char x, char y)
+ Str
+ decodeB(char **ww)
+ {
++ struct growbuf gb;
++
++ growbuf_init(&gb);
++ decodeB_to_growbuf(&gb, ww);
++ return growbuf_to_Str(&gb);
++}
++
++void
++decodeB_to_growbuf(struct growbuf *gb, char **ww)
++{
+ unsigned char c[4];
+ char *wp = *ww;
+ char d[3];
+ int i, n_pad;
+- Str ap = Strnew_size(strlen(wp));
+
++ growbuf_reserve(gb, strlen(wp) + 1);
+ n_pad = 0;
+ while (1) {
+ for (i = 0; i < 4; i++) {
+@@ -93,39 +103,50 @@ decodeB(char **ww)
+ for (i = 0; i < 4; i++) {
+ c[i] = c2e(c[i]);
+ if (c[i] == BAD_BASE64) {
+- *ww = wp;
+- return ap;
++ goto last;
+ }
+ }
+ d[0] = ((c[0] << 2) | (c[1] >> 4));
+ d[1] = ((c[1] << 4) | (c[2] >> 2));
+ d[2] = ((c[2] << 6) | c[3]);
+ for (i = 0; i < 3 - n_pad; i++) {
+- Strcat_char(ap, d[i]);
++ GROWBUF_ADD_CHAR(gb, d[i]);
+ }
+ if (n_pad || *wp == '\0' || *wp == '?')
+ break;
+ }
++last:
++ growbuf_reserve(gb, gb->length + 1);
++ gb->ptr[gb->length] = '\0';
+ *ww = wp;
+- return ap;
++ return;
+ }
+
+ Str
+ decodeU(char **ww)
+ {
++ struct growbuf gb;
++
++ growbuf_init(&gb);
++ decodeU_to_growbuf(&gb, ww);
++ return growbuf_to_Str(&gb);
++}
++
++void
++decodeU_to_growbuf(struct growbuf *gb, char **ww)
++{
+ unsigned char c1, c2;
+ char *w = *ww;
+ int n, i;
+- Str a;
+
+ if (*w <= 0x20 || *w >= 0x60)
+- return Strnew_size(0);
++ return;
+ n = *w - 0x20;
+- a = Strnew_size(n);
++ growbuf_reserve(gb, n + 1);
+ for (w++, i = 2; *w != '\0' && n; n--) {
+ c1 = (w[0] - 0x20) % 0x40;
+ c2 = (w[1] - 0x20) % 0x40;
+- Strcat_char(a, (c1 << i) | (c2 >> (6 - i)));
++ gb->ptr[gb->length++] = (c1 << i) | (c2 >> (6 - i));
+ if (i == 6) {
+ w += 2;
+ i = 2;
+@@ -135,7 +156,8 @@ decodeU(char **ww)
+ i += 2;
+ }
+ }
+- return a;
++ gb->ptr[gb->length] = '\0';
++ return;
+ }
+
+ /* RFC2047 (4.2. The "Q" encoding) */
+@@ -165,9 +187,19 @@ decodeQ(char **ww)
+ Str
+ decodeQP(char **ww)
+ {
++ struct growbuf gb;
++
++ growbuf_init(&gb);
++ decodeQP_to_growbuf(&gb, ww);
++ return growbuf_to_Str(&gb);
++}
++
++void
++decodeQP_to_growbuf(struct growbuf *gb, char **ww)
++{
+ char *w = *ww;
+- Str a = Strnew_size(strlen(w));
+
++ growbuf_reserve(gb, strlen(w) + 1);
+ for (; *w != '\0'; w++) {
+ if (*w == '=') {
+ w++;
+@@ -180,15 +212,16 @@ decodeQP(char **ww)
+ else {
+ if (*w == '\0' || *(w + 1) == '\0')
+ break;
+- Strcat_char(a, ha2d(*w, *(w + 1)));
++ gb->ptr[gb->length++] = ha2d(*w, *(w + 1));
+ w++;
+ }
+ }
+ else
+- Strcat_char(a, *w);
++ gb->ptr[gb->length++] = *w;
+ }
++ gb->ptr[gb->length] = '\0';
+ *ww = w;
+- return a;
++ return;
+ }
+
+ #ifdef USE_M17N
+diff --git a/news.c b/news.c
+index 8a1f0e8..c0494b7 100644
+--- a/news.c
++++ b/news.c
+@@ -76,13 +76,15 @@ news_close(News * news)
+ static int
+ news_open(News * news)
+ {
+- int sock, status;
++ int sock, status, fd;
+
+ sock = openSocket(news->host, "nntp", news->port);
+ if (sock < 0)
+ goto open_err;
+ news->rf = newInputStream(sock);
+- news->wf = fdopen(dup(sock), "wb");
++ if ((fd = dup(sock)) < 0)
++ goto open_err;
++ news->wf = fdopen(fd, "wb");
+ if (!news->rf || !news->wf)
+ goto open_err;
+ IStype(news->rf) |= IST_UNCLOSE;
+diff --git a/parsetagx.c b/parsetagx.c
+index 6b627d2..1cc7048 100644
+--- a/parsetagx.c
++++ b/parsetagx.c
+@@ -120,6 +120,7 @@ parse_tag(char **s, int internal)
+ int i, attr_id = 0, nattr;
+
+ /* Parse tag name */
++ tagname[0] = '\0';
+ q = (*s) + 1;
+ p = tagname;
+ if (*q == '/') {
+@@ -221,6 +222,7 @@ parse_tag(char **s, int internal)
+ int j, hidden=FALSE;
+ for (j=0; j<i; j++) {
+ if (tag->attrid[j] == ATTR_TYPE &&
++ tag->value[j] &&
+ strcmp("hidden",tag->value[j]) == 0) {
+ hidden=TRUE;
+ break;
+diff --git a/po/LINGUAS b/po/LINGUAS
+index 1489115..ddd267b 100644
+--- a/po/LINGUAS
++++ b/po/LINGUAS
+@@ -1,2 +1,2 @@
+ # Set of available languages.
+-ja
++ja de zh_CN zh_TW
+diff --git a/po/Makefile.in.in b/po/Makefile.in.in
+index 83d8838..ef8bd94 100644
+--- a/po/Makefile.in.in
++++ b/po/Makefile.in.in
+@@ -153,14 +153,14 @@ $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed
+ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
+ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
+ --files-from=$(srcdir)/POTFILES.in \
+- --copyright-holder='$(COPYRIGHT_HOLDER)' \
++ --copyright-holder="$(COPYRIGHT_HOLDER)" \
+ --msgid-bugs-address="$$msgid_bugs_address" \
+ ;; \
+ *) \
+ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
+ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
+ --files-from=$(srcdir)/POTFILES.in \
+- --copyright-holder='$(COPYRIGHT_HOLDER)' \
++ --copyright-holder="$(COPYRIGHT_HOLDER)" \
+ --package-name="$${package_gnu}@PACKAGE@" \
+ --package-version='@VERSION@' \
+ --msgid-bugs-address="$$msgid_bugs_address" \
+diff --git a/po/Makevars b/po/Makevars
+index 2f57810..a60a09d 100644
+--- a/po/Makevars
++++ b/po/Makevars
+@@ -18,7 +18,7 @@ XGETTEXT_OPTIONS = --from-code=EUC-JP --keyword=_ --keyword=N_
+ # or entity, or to disclaim their copyright. The empty string stands for
+ # the public domain; in this case the translators are expected to disclaim
+ # their copyright.
+-COPYRIGHT_HOLDER = Fumitoshi UKAI
++COPYRIGHT_HOLDER = THE w3m'S COPYRIGHT HOLDER
+
+ # This is the email address or URL to which the translators shall report
+ # bugs in the untranslated strings:
+diff --git a/po/de.po b/po/de.po
+new file mode 100644
+index 0000000..96489c1
+--- /dev/null
++++ b/po/de.po
+@@ -0,0 +1,936 @@
++# German translation of w3m
++# Copyright (C) 2014 THE w3m'S COPYRIGHT HOLDER
++# This file is distributed under the same license as the w3m package.
++# Markus Hiereth <markus.hiereth@freenet.de>, 2014.
++msgid ""
++msgstr ""
++"Project-Id-Version: w3m 0.5.3\n"
++"Report-Msgid-Bugs-To: satodai@w3m.jp\n"
++"POT-Creation-Date: 2016-03-14 19:47+0900\n"
++"PO-Revision-Date: 2016-03-14 19:51+0900\n"
++"Last-Translator: Tatsuya Kinoshita <tats@debian.org>\n"
++"Language-Team: German <debian-l10n-german@lists.debian.org>\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Virtaal 0.7.1\n"
++
++#: menu.c:269
++msgid " Back (b) "
++msgstr " Zurück (b) "
++
++#: menu.c:270
++msgid " Select Buffer(s) "
++msgstr " Puffer auswählen (s) "
++
++#: menu.c:272
++msgid " Select Tab (t) "
++msgstr " Reiter auswählen (t) "
++
++#: menu.c:274
++msgid " View Source (v) "
++msgstr " Codeansicht (v) "
++
++#: menu.c:275
++msgid " Edit Source (e) "
++msgstr " Code bearbeiten (e) "
++
++#: menu.c:276
++msgid " Save Source (S) "
++msgstr " Code speichern (S) "
++
++#: menu.c:277
++msgid " Reload (r) "
++msgstr " Erneut laden (r) "
++
++#: menu.c:278 menu.c:285 menu.c:289
++msgid " ---------------- "
++msgstr " ---------------------- "
++
++#: menu.c:279
++msgid " Go Link (a) "
++msgstr " Ziel öffnen.. (a) "
++
++#: menu.c:280
++msgid " on New Tab (n) "
++msgstr " ..in neuem Reiter (n) "
++
++#: menu.c:281
++msgid " Save Link (A) "
++msgstr " Ziel speichern (A) "
++
++#: menu.c:282
++msgid " View Image (i) "
++msgstr " Bild anzeigen (i) "
++
++#: menu.c:283
++msgid " Save Image (I) "
++msgstr " Bild speichern (I) "
++
++#: menu.c:284
++msgid " View Frame (f) "
++msgstr " Frames zeigen (f) "
++
++#: menu.c:286
++msgid " Bookmark (B) "
++msgstr " Lesezeichen (B) "
++
++#: menu.c:287
++msgid " Help (h) "
++msgstr " Hilfe (h) "
++
++#: menu.c:288
++msgid " Option (o) "
++msgstr " Einstellungen (o) "
++
++#: menu.c:290
++msgid " Quit (q) "
++msgstr " Programm verlassen (q) "
++
++#: rc.c:62
++msgid "External Viewer Setup"
++msgstr "Konfiguration für externe Anzeigeprogramme"
++
++#: rc.c:63
++msgid "Tab width in characters"
++msgstr "Tabulatorbreite in Zeichen"
++
++#: rc.c:64
++msgid "Indent for HTML rendering"
++msgstr "Einzug bei HTML-Darstellung"
++
++#: rc.c:65
++msgid "Number of pixels per character (4.0...32.0)"
++msgstr "Anzahl von Pixeln pro Zeichen (4.0 bis 32.0)"
++
++#: rc.c:66
++msgid "Number of pixels per line (4.0...64.0)"
++msgstr "Anzahl von Pixeln pro Zeile (4.0 bis 64.0)"
++
++# entsprechend Bescheibung aus MANUAL.html, mh 14.10.2014
++#: rc.c:67
++msgid "Number of remembered lines when used as a pager"
++msgstr "Anzahl gemerkter, über die Standardeingabe erhaltener Zeilen"
++
++#: rc.c:68
++msgid "Use URL history"
++msgstr "URL-Chronik verwenden"
++
++#: rc.c:69
++msgid "Number of remembered URL"
++msgstr "Anzahl von URLs in Chronik"
++
++#: rc.c:70
++msgid "Save URL history"
++msgstr "URL-Chronik speichern"
++
++#: rc.c:71
++msgid "Render frames automatically"
++msgstr "Frames selbstständig darstellen"
++
++#: rc.c:72
++msgid "Treat argument without scheme as URL"
++msgstr "Eingabe ohne Protokoll-Präfix als URL auffassen"
++
++#: rc.c:73
++msgid "Use _self as default target"
++msgstr "_self als Standard-Zielfenster verwenden"
++
++#: rc.c:74
++msgid "Open link on new tab if target is _blank or _new"
++msgstr ""
++"Link in neuem Reiter öffnen, falls für Zielfenster _blank oder _new "
++"definiert ist"
++
++#: rc.c:75
++msgid "Open download list panel on new tab"
++msgstr "Downloadliste in neuem Reiter öffnen"
++
++#: rc.c:76
++msgid "Display link URL automatically"
++msgstr "URL der Links selbstständig anzeigen"
++
++#: rc.c:77
++msgid "Display link numbers"
++msgstr "Linknummern anzeigen"
++
++#: rc.c:78
++msgid "Display decoded URL"
++msgstr "URL entschlüsselt anzeigen"
++
++#: rc.c:79
++msgid "Display current line number"
++msgstr "Aktuelle Zeilennummer anzeigen"
++
++#: rc.c:80
++msgid "Display inline images"
++msgstr "Eingebettete Bilder anzeigen"
++
++#: rc.c:81
++msgid "Display pseudo-ALTs for inline images with no ALT or TITLE string"
++msgstr "Pseudo-ALTs zu eingebetteten Bildern ohne ALT oder TITLE anzeigen"
++
++#: rc.c:83
++msgid "Load inline images automatically"
++msgstr "Eingebettete Bilder selbstständig laden"
++
++#: rc.c:84
++msgid "Maximum processes for parallel image loading"
++msgstr "Anzahl zulässiger Prozesse zum gleichzeitigen Laden von Bildern"
++
++#: rc.c:85
++msgid "Use external image viewer"
++msgstr "Externen Bildbetrachter verwenden"
++
++#: rc.c:86
++msgid "Scale of image (%)"
++msgstr "Bilder prozentual skalieren"
++
++#: rc.c:87
++msgid "External command to display image"
++msgstr "Befehl für externen Bildbetrachter"
++
++#: rc.c:88
++msgid "Use link list of image map"
++msgstr "Bei Grafiken mit eingebetteten Links Ziele auflisten"
++
++#: rc.c:90
++msgid "Display file names in multi-column format"
++msgstr "Dateinamen auf Spalten verteilt anzeigen"
++
++#: rc.c:91
++msgid "Use ASCII equivalents to display entities"
++msgstr "ASCII-Ersatz für in HTML benannte Zeichen verwenden"
++
++#: rc.c:92
++msgid "Character type for border of table and menu"
++msgstr "Zeichen zum Einrahmen von Tabellen und Menüs"
++
++#: rc.c:93
++msgid "Display table borders, ignore value of BORDER"
++msgstr "Zeige Tabellen gerahmt, BORDER-Wert ignorieren"
++
++#: rc.c:94
++msgid "Fold lines in TEXTAREA"
++msgstr "In Eingabefeldern vom Typ TEXTAREA Texte umbrechen"
++
++#: rc.c:95
++msgid "Display INS, DEL, S and STRIKE element"
++msgstr "Umsetzung der Elemente INS, DEL, S und STRIKE"
++
++#: rc.c:96
++msgid "Display with color"
++msgstr "In Farbe anzeigen"
++
++#: rc.c:97
++msgid "Color of normal character"
++msgstr "Farbe für normalen Text"
++
++#: rc.c:98
++msgid "Color of anchor"
++msgstr "Farbe für Links / Element A"
++
++#: rc.c:99
++msgid "Color of image link"
++msgstr "Farbe für Bilder / Element IMG"
++
++#: rc.c:100
++msgid "Color of form"
++msgstr "Farbe für Eingaben / Element INPUT"
++
++#: rc.c:101
++msgid "Enable coloring of active link"
++msgstr "Aktiven Link farblich hervorheben"
++
++#: rc.c:102
++msgid "Color of currently active link"
++msgstr "Farbe des derzeit aktiven Links "
++
++#: rc.c:103
++msgid "Use visited link color"
++msgstr "Besuchte Links farblich hervorheben"
++
++#: rc.c:104
++msgid "Color of visited link"
++msgstr "Farbe für besuchte Links"
++
++#: rc.c:105
++msgid "Color of background"
++msgstr "Hintergrundfarbe"
++
++#: rc.c:106
++msgid "Color of mark"
++msgstr "Farbe für Textmarken"
++
++# msgstr "Farbe für Textmarkierungen"
++#: rc.c:107
++msgid "Use proxy"
++msgstr "Proxy verwenden"
++
++#: rc.c:108
++msgid "URL of HTTP proxy host"
++msgstr "URL des HTTP-Proxy-Hosts"
++
++#: rc.c:110
++msgid "URL of HTTPS proxy host"
++msgstr "URL des HTTPS-Proxy-Hosts"
++
++#: rc.c:113
++msgid "URL of GOPHER proxy host"
++msgstr "URL des GOPHER-Proxy-Hosts"
++
++#: rc.c:115
++msgid "URL of FTP proxy host"
++msgstr "URL des FTP-Proxy-Hosts"
++
++#: rc.c:116
++msgid "Domains to be accessed directly (no proxy)"
++msgstr "Ohne Proxy, direkt zu kontaktierende Domains"
++
++#: rc.c:117
++msgid "Check noproxy by network address"
++msgstr ""
++"Direkten Datentransfer ohne Proxy mittels Netzwerkadresse sicherstellen"
++
++#: rc.c:118
++msgid "Disable cache"
++msgstr "Zwischenspeicherung deaktivieren"
++
++#: rc.c:120
++msgid "News server"
++msgstr "News-Server"
++
++#: rc.c:121
++msgid "Mode of news server"
++msgstr "Modus des News-Servers"
++
++#: rc.c:122
++msgid "Number of news messages"
++msgstr "News-Anzahl"
++
++#: rc.c:124
++msgid "Order of name resolution"
++msgstr "Reihenfolge der Namens-Auflösung"
++
++#: rc.c:125
++msgid "Directory corresponding to / (document root)"
++msgstr "Wurzelverzeichnis für Dokumente (/)"
++
++#: rc.c:126
++msgid "Directory corresponding to /~user"
++msgstr "Pfad zum Benutzerverzeichnis (~)"
++
++#: rc.c:127
++msgid "Directory corresponding to /cgi-bin"
++msgstr "Verzeichnis für ausführbare Skripte (cgi-bin)"
++
++#: rc.c:128
++msgid "Confirm when quitting with q"
++msgstr "Das Programm erst nach Bestätigung verlassen"
++
++#: rc.c:129
++msgid "Close tab if buffer is last when back"
++msgstr "Reiter mit nur einem Puffer auf Zurück-Befehl hin schlieÃen"
++
++#: rc.c:131
++msgid "Enable mark operations"
++msgstr "Arbeit mit Textmarken ermöglichen"
++
++# msgstr "Arbeit mit Textmarkierungen ermöglichen"
++#: rc.c:133
++msgid "Enable Emacs-style line editing"
++msgstr "Zeilen wie in Emacs bearbeiten"
++
++#: rc.c:134
++msgid "Enable vi-like numeric prefix"
++msgstr "Vorangestellte Zahlen wie in vi aktivieren"
++
++#: rc.c:135
++msgid "Move cursor to top line when going to label"
++msgstr "Labels nach Aufsuchen immer oben positionieren"
++
++#: rc.c:136
++msgid "Move cursor to top line when moving to next page"
++msgstr "Beim Umblättern Eingabemarke nach oben setzen"
++
++#: rc.c:137
++msgid "Fold lines of plain text file"
++msgstr "Zeilen in Textdateien umbrechen"
++
++#: rc.c:138
++msgid "Show line numbers"
++msgstr "Zeilennummern anzeigen"
++
++#: rc.c:139
++msgid "Show search string"
++msgstr "Suchbegriff anzeigen"
++
++#: rc.c:140
++msgid "List of mime.types files"
++msgstr "Liste der mime.types-Dateien"
++
++#: rc.c:141
++msgid "List of mailcap files"
++msgstr "Liste der mailcap-Dateien"
++
++#: rc.c:142
++msgid "List of urimethodmap files"
++msgstr "Liste von Dateien mit URI-Methode-Zuordnungen"
++
++#: rc.c:143
++msgid "Editor"
++msgstr "Editor"
++
++#: rc.c:144
++msgid "Mailer"
++msgstr "Mail-Programm"
++
++# korrespondiert mit Pulldown-Menü, daher verkürzt. mh 09.10.2014
++#: rc.c:145
++msgid "How to call Mailer for mailto URLs with options"
++msgstr "Umgang mit mailto-URLs"
++
++#: rc.c:146
++msgid "External browser"
++msgstr "Externer browser"
++
++#: rc.c:147
++msgid "2nd external browser"
++msgstr "Zweiter externer browser"
++
++#: rc.c:148
++msgid "3rd external browser"
++msgstr "Dritter externer browser"
++
++#: rc.c:149
++msgid "4th external browser"
++msgstr "Vierter externer browser"
++
++#: rc.c:150
++msgid "5th external browser"
++msgstr "Fünfter externer browser"
++
++#: rc.c:151
++msgid "6th external browser"
++msgstr "Sechster externer browser"
++
++#: rc.c:152
++msgid "7th external browser"
++msgstr "Siebter externer browser"
++
++#: rc.c:153
++msgid "8th external browser"
++msgstr "Achter externer browser"
++
++#: rc.c:154
++msgid "9th external browser"
++msgstr "Neunter externer browser"
++
++# entsprechend file:///usr/share/doc/w3m/README.passwd
++# Prüfung beanstandete auch passwd_file mit Zugriffbytes 600, mh, 05.10.2014
++#: rc.c:155
++msgid "Disable secret file security check"
++msgstr "Keine Prüfung der Sicherheit bei Dateien mit geheimem Inhalt"
++
++#: rc.c:156
++msgid "Password file"
++msgstr "Passwort-Datei"
++
++#: rc.c:157
++msgid "File for setting form on loading"
++msgstr "Datei mit vordefinierten Eingaben für Formulare"
++
++#: rc.c:158
++msgid "File for preferences for each site"
++msgstr "Datei mit adress-spezifischen Voreinstellungen"
++
++#: rc.c:159
++msgid "Password for anonymous FTP (your mail address)"
++msgstr "Passwort für anonyme FTP-Anmeldung (Ihre Mailadresse)"
++
++#: rc.c:160
++msgid "Generate domain part of password for FTP"
++msgstr "Domain-Teil des FTP-Passwortes erzeugen"
++
++#: rc.c:161
++msgid "User-Agent identification string"
++msgstr "Browserkennung übermitteln"
++
++#: rc.c:162
++msgid "Accept-Encoding header"
++msgstr "Accept-Encoding-Kopfzeile"
++
++#: rc.c:163
++msgid "Accept header"
++msgstr "Accept-Kopfzeile"
++
++#: rc.c:164
++msgid "Accept-Language header"
++msgstr "Accept-Language-Kopfzeile"
++
++#: rc.c:165
++msgid "Treat URL-like strings as links in all pages"
++msgstr "URL-artige Zeichenketten auf allen Seiten als Links auffassen"
++
++#: rc.c:166
++msgid "Wrap search"
++msgstr "Im Dokument umlaufend suchen"
++
++#: rc.c:167
++msgid "Display unseen objects (e.g. bgimage tag)"
++msgstr "Nicht gezeigte Objekte melden (z.B. Hintergrundbild)"
++
++#: rc.c:168
++msgid "Uncompress compressed data automatically when downloading"
++msgstr "Komprimierte Daten beim Download selbstständig dekomprimieren"
++
++# String nicht in Optionen-Menü gefunden. mh, 05.10.2014
++#: rc.c:170
++msgid "Run external viewer in a separate session"
++msgstr "Externe Anzeigeprogramme in eigener Sitzung laufen lassen"
++
++#: rc.c:172
++msgid "Run external viewer in the background"
++msgstr "Externe Anzeigeprogramme im Hintergrund laufen lassen"
++
++#: rc.c:174
++msgid "Use external program for directory listing"
++msgstr "Externes Programm zum Auflisten von Verzeichnissen verwenden"
++
++#: rc.c:175
++msgid "URL of directory listing command"
++msgstr "URL des Befehls zum Auflisten von Verzeichnissen"
++
++#: rc.c:177
++msgid "Enable dictionary lookup through CGI"
++msgstr "Wörterbuchabfrage mittels CGI aktivieren"
++
++#: rc.c:178
++msgid "URL of dictionary lookup command"
++msgstr "URL des Befehls zur Wörterbuch-Abfrage"
++
++#: rc.c:180
++msgid "Display link name for images lacking ALT"
++msgstr "Bei Bildern ohne ALT-Angabe Linkziel anzeigen"
++
++#: rc.c:181
++msgid "Index file for directories"
++msgstr "Indexdatei für Verzeichnisse"
++
++#: rc.c:182
++msgid "Prepend http:// to URL automatically"
++msgstr "Ziel-Eingaben gegebenenfalls http:// voranstellen"
++
++#: rc.c:183
++msgid "Default value for open-URL command"
++msgstr "Vorgabewert bei der Adresseneingabe"
++
++#: rc.c:184
++msgid "Decode Content-Transfer-Encoding when saving"
++msgstr "Beim Speichern entsprechend Content-Transfer-Encoding entschlüsseln"
++
++#: rc.c:185
++msgid "Preserve timestamp when saving"
++msgstr "Zeitstempel beim Speichern erhalten"
++
++#: rc.c:187
++msgid "Enable mouse"
++msgstr "Maus aktivieren"
++
++#: rc.c:188
++msgid "Scroll in reverse direction of mouse drag"
++msgstr "Mausbewegungen entgegengesetzt scrollen"
++
++#: rc.c:189
++msgid "Behavior of wheel scroll speed"
++msgstr "Umsetzung der Mausradbewegung"
++
++#: rc.c:190
++msgid "(A only)Scroll by # (%) of screen"
++msgstr "(nur A) Um # % des Fensters scrollen"
++
++#: rc.c:191
++msgid "(B only)Scroll by # lines"
++msgstr "(nur B) Um # Zeilen scrollen"
++
++#: rc.c:193
++msgid "Free memory of undisplayed buffers"
++msgstr "Speicherplatz nicht angezeigter Puffer freigeben"
++
++#: rc.c:194
++msgid "Suppress `Referer:' header"
++msgstr "Referer-Kopfzeile unterdrücken"
++
++#: rc.c:195
++msgid "Search case-insensitively"
++msgstr "GroÃ- und Kleinschreibung beim Suchen ignorieren"
++
++#: rc.c:196
++msgid "Use LESSOPEN"
++msgstr "LESSOPEN verwenden"
++
++#: rc.c:199
++msgid "Perform SSL server verification"
++msgstr "SSL-Server-Verifizierung durchführen"
++
++#: rc.c:200
++msgid "PEM encoded certificate file of client"
++msgstr "PEM-kodierte Zertifikatsdatei des Clients"
++
++#: rc.c:201
++msgid "PEM encoded private key file of client"
++msgstr "PEM-kodierte private Schlüsseldatei des Clients"
++
++#: rc.c:202
++msgid "Path to directory for PEM encoded certificates of CAs"
++msgstr "Pfad zum Verzeichnis für PEM-kodierte Zertifikate von CAs"
++
++#: rc.c:203
++msgid "File consisting of PEM encoded certificates of CAs"
++msgstr "Datei mit PEM-kodierten Zertifikaten von CAs"
++
++#: rc.c:205
++msgid "List of forbidden SSL methods (2: SSLv2, 3: SSLv3, t:TLSv1)"
++msgstr "Liste unzulässiger SSL-Verfahren (2: SSLv2, 3: SSLv3, t: TLSv1)"
++
++#: rc.c:208
++msgid "Enable cookie processing"
++msgstr "Cookie-Verarbeitung aktivieren"
++
++#: rc.c:209
++msgid "Print a message when receiving a cookie"
++msgstr "Den Empfang von Cookies melden"
++
++#: rc.c:210
++msgid "Accept cookies"
++msgstr "Cookies akzeptieren"
++
++#: rc.c:211
++msgid "Action to be taken on invalid cookie"
++msgstr "Reaktion auf ungültiges Cookie"
++
++#: rc.c:212
++msgid "Domains to reject cookies from"
++msgstr "Domains, deren Cookies abzulehnen sind"
++
++#: rc.c:213
++msgid "Domains to accept cookies from"
++msgstr "Domains, deren Cookies akzeptiert werden"
++
++# Variable vom Typ String im Abschnitt Cookies-Einstellungen, mh 10.10.2014
++#: rc.c:214
++msgid "Domains to avoid [wrong number of dots]"
++msgstr "Zu meidende Domains (falsche Anzahl von Punkten)"
++
++#: rc.c:216
++msgid "Number of redirections to follow"
++msgstr "Anzahl zu akzeptierender Umleitungen"
++
++# Konfigurationsvariable vom Typ string, mh, 05.10.2014
++#: rc.c:217
++msgid "Enable processing of meta-refresh tag"
++msgstr "Meta-Refresh-Element verarbeiten"
++
++#: rc.c:220
++msgid "Enable Migemo (Roma-ji search)"
++msgstr "Romaji-Suche mittels Migemo aktivieren"
++
++#: rc.c:221
++msgid "Migemo command"
++msgstr "Migemo-Befehl"
++
++#: rc.c:225
++msgid "Display charset"
++msgstr "Zeichenkodierung der Anzeige"
++
++#: rc.c:226
++msgid "Default document charset"
++msgstr "Zeichenkodierungs-Vorgabe für Dokumente"
++
++#: rc.c:227
++msgid "Automatic charset detect when loading"
++msgstr "Selbstständige Erkennung der Zeichenkodierung beim Laden"
++
++#: rc.c:228
++msgid "System charset"
++msgstr "Zeichenkodierung des Systems"
++
++#: rc.c:229
++msgid "System charset follows locale(LC_CTYPE)"
++msgstr "Zeichenkodierung des Systems entsprechend Locale (LC_CTYPE)"
++
++# war zuvor
++# msgstr "Halfdump mit der zur Anzeige benutzten Zeichenkodierung exportieren"
++#: rc.c:230
++msgid "Output halfdump with display charset"
++msgstr "Halfdump in der zur Anzeige benutzten Kodierung"
++
++# Konfigurationsvariable vom Typ boolean, mh, 05.10.2014
++#: rc.c:231
++msgid "Use multi column characters"
++msgstr "Spaltenübergreifende Zeichen verwenden"
++
++#: rc.c:232
++msgid "Use combining characters"
++msgstr "Kombinationszeichen verwenden"
++
++#: rc.c:233
++msgid "Use double width for some Unicode characters"
++msgstr "Einzelnen Unicode-Zeichen zwei Spalten einräumen"
++
++#: rc.c:234
++msgid "Use Unicode language tags"
++msgstr "Unicode-Sprach-Tags verwenden"
++
++#: rc.c:235
++msgid "Charset conversion using Unicode map"
++msgstr "Zeichen in Unicode kodieren"
++
++#: rc.c:236
++msgid "Charset conversion when loading"
++msgstr "Zeichenkodierung beim Laden anpassen"
++
++#: rc.c:237
++msgid "Adjust search string for document charset"
++msgstr "Zu suchende Zeichenkette der Kodierung des Dokumentes anpassen"
++
++#: rc.c:238
++msgid "Fix character width when conversion"
++msgstr "Bei Umwandlung an der Breite von Zeichen festhalten"
++
++#: rc.c:239
++msgid "Use GB 12345 Unicode map instead of GB 2312's"
++msgstr "GB-12345-Unicode statt GB 2312 verwenden"
++
++#: rc.c:240
++msgid "Use JIS X 0201 Roman for ISO-2022-JP"
++msgstr "JIS X 0201 Roman statt ISO-2022-JP verwenden"
++
++#: rc.c:241
++msgid "Use JIS C 6226:1978 for ISO-2022-JP"
++msgstr "JIS C 6226:1978 statt ISO-2022-JP verwenden"
++
++#: rc.c:242
++msgid "Use JIS X 0201 Katakana"
++msgstr "JIS X 0201 Katakana verwenden"
++
++#: rc.c:243
++msgid "Use JIS X 0212:1990 (Supplemental Kanji)"
++msgstr "JIS X 0212:1990 verwenden (ergänzendes Kanji)"
++
++#: rc.c:244
++msgid "Use JIS X 0213:2000 (2000JIS)"
++msgstr "JIS X 0213:2000 verwenden (2000JIS)"
++
++#: rc.c:245
++msgid "Strict ISO-2022-JP/KR/CN"
++msgstr "Striktes ISO-2022-JP/KR/CN"
++
++#: rc.c:246
++msgid "Treat 4 bytes char. of GB18030 as Unicode"
++msgstr "4-Byte-Zeichen von GB 18030 als Unicode auffassen"
++
++#: rc.c:247
++msgid "Simple Preserve space"
++msgstr "Einfache Platzerhaltung"
++
++#: rc.c:250
++msgid "keymap file"
++msgstr "Tastaturbelegungs-Datei"
++
++#: rc.c:267
++msgid "black"
++msgstr "schwarz"
++
++#: rc.c:268
++msgid "red"
++msgstr "rot"
++
++#: rc.c:269
++msgid "green"
++msgstr "grün"
++
++#: rc.c:270
++msgid "yellow"
++msgstr "gelb"
++
++#: rc.c:271
++msgid "blue"
++msgstr "blau"
++
++#: rc.c:272
++msgid "magenta"
++msgstr "magenta"
++
++#: rc.c:273
++msgid "cyan"
++msgstr "cyan"
++
++#: rc.c:274
++msgid "white"
++msgstr "weiÃ"
++
++#: rc.c:275
++msgid "terminal"
++msgstr "wie Terminal"
++
++#: rc.c:294
++msgid "none"
++msgstr "keiner"
++
++#: rc.c:295
++msgid "current URL"
++msgstr "aktuelle URL"
++
++#: rc.c:296
++msgid "link URL"
++msgstr "Link-URL"
++
++#: rc.c:301
++msgid "simple"
++msgstr "einfach"
++
++#: rc.c:302
++msgid "use tag"
++msgstr "durch Tags"
++
++#: rc.c:303
++msgid "fontify"
++msgstr "hervorgehoben"
++
++#: rc.c:309
++msgid "A:relative to screen height"
++msgstr "A: relativ zu Fensterhöhe"
++
++#: rc.c:310
++msgid "B:fixed speed"
++msgstr "B: feste Geschwindigkeit"
++
++#: rc.c:317
++msgid "unspecified"
++msgstr "nicht spezifiziert"
++
++#: rc.c:318
++msgid "inet inet6"
++msgstr "inet inet6"
++
++#: rc.c:319
++msgid "inet6 inet"
++msgstr "inet6 inet"
++
++#: rc.c:320
++msgid "inet only"
++msgstr "nur inet"
++
++#: rc.c:321
++msgid "inet6 only"
++msgstr "nur inet6"
++
++#: rc.c:328
++msgid "discard"
++msgstr "verwerfen"
++
++#: rc.c:330
++msgid "accept"
++msgstr "annehmen"
++
++#: rc.c:332
++msgid "ask"
++msgstr "nachfragen"
++
++# gehört zu rc.c:142
++# erscheint in Pulldown-Menü, daher verkürzt. mh 09.10.2014
++#: rc.c:339
++msgid "use internal mailer instead"
++msgstr "Mail intern erstellen"
++
++# gehört zu rc.c:142
++# erscheint in Pulldown-Menü, daher verkürzt. mh 09.10.2014
++#: rc.c:341
++msgid "ignore options and use only the address"
++msgstr "Optionen ignorieren"
++
++# gehört zu rc.c:142
++# erscheint in Pulldown-Menü, daher verkürzt. mh 09.10.2014
++#: rc.c:342
++msgid "use full mailto URL"
++msgstr "komplett verwenden"
++
++#: rc.c:351
++msgid "OFF"
++msgstr "AUS"
++
++#: rc.c:352
++msgid "Only ISO 2022"
++msgstr "Nur ISO-2022"
++
++#: rc.c:353
++msgid "ON"
++msgstr "AN"
++
++# Wert aus einem Set zur Wiedergabe von Rändern, mh, 05.10.2014
++#: rc.c:359
++msgid "ASCII"
++msgstr "ASCII"
++
++# Wert aus einem Set zur Wiedergabe von Rändern, mh, 05.10.2014
++# hier ist "Zeichensatz" akzeptabel mh, 09.10.2014
++#: rc.c:360
++msgid "charset specific"
++msgstr "zeichensatzspezifisch"
++
++# Wert aus einem Set zur Wiedergabe von Rändern, mh, 05.10.2014
++#: rc.c:361
++msgid "DEC special graphics"
++msgstr "mit DEC-Grafiken"
++
++#: rc.c:740
++msgid "Display Settings"
++msgstr "Einstellungen zur Anzeige"
++
++#: rc.c:742
++msgid "Color Settings"
++msgstr "Farbeinstellungen"
++
++#: rc.c:744
++msgid "Miscellaneous Settings"
++msgstr "Weitere Einstellungen"
++
++#: rc.c:745
++msgid "Directory Settings"
++msgstr "Verzeichnis-Einstellungen"
++
++#: rc.c:746
++msgid "External Program Settings"
++msgstr "Einstellungen für externe Programme"
++
++#: rc.c:747
++msgid "Network Settings"
++msgstr "Netzwerk-Einstellungen"
++
++#: rc.c:748
++msgid "Proxy Settings"
++msgstr "Proxy-Einstellungen"
++
++#: rc.c:750
++msgid "SSL Settings"
++msgstr "SSL-Einstellungen"
++
++#: rc.c:753
++msgid "Cookie Settings"
++msgstr "Cookie-Einstellungen"
++
++#: rc.c:756
++msgid "Charset Settings"
++msgstr "Zeichenkodierungs-Einstellungen"
++
++#. TRANSLATORS:
++#. * AcceptLang default: this is used in Accept-Language: HTTP request
++#. * header. For example, ja.po should translate it as
++#. * "ja;q=1.0, en;q=0.5" like that.
++#.
++#: rc.c:1238
++msgid "en;q=1.0"
++msgstr "de;q=1.0, en;q=0.5"
+diff --git a/po/ja.po b/po/ja.po
+index d67c695..3810d30 100644
+--- a/po/ja.po
++++ b/po/ja.po
+@@ -1,6 +1,6 @@
+ # Japanese translations for w3m package
+ # w3m ããã±ã¼ã¸ã«å¯¾ããè±è¨³.
+-# Copyright (C) 2003 THE w3m'S COPYRIGHT HOLDER
++# Copyright (C) 2015 THE w3m'S COPYRIGHT HOLDER
+ # This file is distributed under the same license as the w3m package.
+ # Fumitoshi UKAI <ukai@debian.or.jp>, 2003.
+ #
+@@ -8,865 +8,897 @@ msgid ""
+ msgstr ""
+ "Project-Id-Version: w3m 0.5.3\n"
+ "Report-Msgid-Bugs-To: satodai@w3m.jp\n"
+-"POT-Creation-Date: 2010-08-20 18:44+0900\n"
+-"PO-Revision-Date: 2010-08-20 18:45+0900\n"
+-"Last-Translator: Fumitoshi UKAI <ukai@debian.or.jp>\n"
++"POT-Creation-Date: 2016-03-14 19:47+0900\n"
++"PO-Revision-Date: 2016-03-14 19:51+0900\n"
++"Last-Translator: Tatsuya Kinoshita <tats@debian.org>\n"
+ "Language-Team: Japanese\n"
+-"Language: \n"
++"Language: ja\n"
+ "MIME-Version: 1.0\n"
+ "Content-Type: text/plain; charset=UTF-8\n"
+ "Content-Transfer-Encoding: 8bit\n"
+ "Plural-Forms: nplurals=1; plural=0;\n"
+
+-#: menu.c:267
++#: menu.c:269
+ msgid " Back (b) "
+ msgstr "æ»ã (b)"
+
+-#: menu.c:268
++#: menu.c:270
+ msgid " Select Buffer(s) "
+ msgstr "ãããã¡é¸æ (s)"
+
+-#: menu.c:270
++#: menu.c:272
+ msgid " Select Tab (t) "
+ msgstr "ã¿ãé¸æ (t)"
+
+-#: menu.c:272
++#: menu.c:274
+ msgid " View Source (v) "
+ msgstr "ã½ã¼ã¹ã表示 (v)"
+
+-#: menu.c:273
++#: menu.c:275
+ msgid " Edit Source (e) "
+ msgstr "ã½ã¼ã¹ãç·¨é (e)"
+
+-#: menu.c:274
++#: menu.c:276
+ msgid " Save Source (S) "
+ msgstr "ã½ã¼ã¹ãä¿å (S)"
+
+-#: menu.c:275
++#: menu.c:277
+ msgid " Reload (r) "
+ msgstr "åèªã¿è¾¼ã¿ (r)"
+
+-#: menu.c:276 menu.c:283 menu.c:287
++#: menu.c:278 menu.c:285 menu.c:289
+ msgid " ---------------- "
+ msgstr "----------------"
+
+-#: menu.c:277
++#: menu.c:279
+ msgid " Go Link (a) "
+ msgstr "ãªã³ã¯ã表示 (a)"
+
+-#: menu.c:278
++#: menu.c:280
+ msgid " on New Tab (n) "
+ msgstr "æ°ã¿ãã§è¡¨ç¤º (n)"
+
+-#: menu.c:279
++#: menu.c:281
+ msgid " Save Link (A) "
+ msgstr "ãªã³ã¯ãä¿å (A)"
+
+-#: menu.c:280
++#: menu.c:282
+ msgid " View Image (i) "
+ msgstr "ç»åã表示 (i)"
+
+-#: menu.c:281
++#: menu.c:283
+ msgid " Save Image (I) "
+ msgstr "ç»åãä¿å (I)"
+
+-#: menu.c:282
++#: menu.c:284
+ msgid " View Frame (f) "
+ msgstr "ãã¬ã¼ã 表示 (f)"
+
+-#: menu.c:284
++#: menu.c:286
+ msgid " Bookmark (B) "
+ msgstr "ããã¯ãã¼ã¯ (B)"
+
+-#: menu.c:285
++#: menu.c:287
+ msgid " Help (h) "
+ msgstr "ãã«ã (h)"
+
+-#: menu.c:286
++#: menu.c:288
+ msgid " Option (o) "
+ msgstr "ãªãã·ã§ã³ (o)"
+
+-#: menu.c:288
++#: menu.c:290
+ msgid " Quit (q) "
+ msgstr "çµäº (q)"
+
+-#: rc.c:60
++#: rc.c:62
+ msgid "External Viewer Setup"
+ msgstr "å¤é¨ãã¥ã¼ã¢ã®ç·¨é"
+
+-#: rc.c:61
++#: rc.c:63
+ msgid "Tab width in characters"
+ msgstr "ã¿ãå¹
"
+
+-#: rc.c:62
++#: rc.c:64
+ msgid "Indent for HTML rendering"
+ msgstr "HTMLæ´å½¢æã®ã¤ã³ãã³ãå¹
"
+
+-#: rc.c:63
++#: rc.c:65
+ msgid "Number of pixels per character (4.0...32.0)"
+ msgstr "æåå¹
(4.0...32.0)"
+
+-#: rc.c:64
++#: rc.c:66
+ msgid "Number of pixels per line (4.0...64.0)"
+ msgstr "ä¸è¡ã®é«ã (4.0...64.0)"
+
+-#: rc.c:65
++#: rc.c:67
+ msgid "Number of remembered lines when used as a pager"
+ msgstr "ãã¼ã¸ã£ã¨ãã¦å©ç¨ããæã«ä¿åãããè¡æ°"
+
+-#: rc.c:66
++#: rc.c:68
+ msgid "Use URL history"
+ msgstr "å±¥æ´ã使ã"
+
+-#: rc.c:67
++#: rc.c:69
+ msgid "Number of remembered URL"
+ msgstr "ä¿æããURLå±¥æ´ã®æ°"
+
+-#: rc.c:68
++#: rc.c:70
+ msgid "Save URL history"
+ msgstr "URLå±¥æ´ã®ä¿å"
+
+-#: rc.c:69
++#: rc.c:71
+ msgid "Render frames automatically"
+ msgstr "ãã¬ã¼ã ã®èªå表示"
+
+-#: rc.c:70
++#: rc.c:72
+ msgid "Treat argument without scheme as URL"
+ msgstr "scheme ã®ãªãå¼æ°ã URL ã¨ã¿ãªã"
+
+-#: rc.c:71
++#: rc.c:73
+ msgid "Use _self as default target"
+ msgstr "targetãæªæå®ã®å ´åã«_selfã使ç¨ãã"
+
+-#: rc.c:72
++#: rc.c:74
+ msgid "Open link on new tab if target is _blank or _new"
+ msgstr "targetã_blankã_newã®å ´åã¯æ°ããã¿ãã§éã"
+
+-#: rc.c:73
++#: rc.c:75
+ msgid "Open download list panel on new tab"
+ msgstr "Download list panel ãæ°ããã¿ãã§éã"
+
+-#: rc.c:74
++#: rc.c:76
+ msgid "Display link URL automatically"
+ msgstr "ãªã³ã¯å
ã®èªå表示"
+
+-#: rc.c:75
++#: rc.c:77
+ msgid "Display link numbers"
+ msgstr "ãªã³ã¯çªå·ã®è¡¨ç¤º"
+
+-#: rc.c:76
++#: rc.c:78
+ msgid "Display decoded URL"
+ msgstr "URLããã³ã¼ããã¦è¡¨ç¤º"
+
+-#: rc.c:77
++#: rc.c:79
+ msgid "Display current line number"
+ msgstr "ç¾å¨ã®è¡çªå·ã®è¡¨ç¤º"
+
+-#: rc.c:78
++#: rc.c:80
+ msgid "Display inline images"
+ msgstr "ã¤ã³ã©ã¤ã³ç»åã表示"
+
+-#: rc.c:79
++#: rc.c:81
+ msgid "Display pseudo-ALTs for inline images with no ALT or TITLE string"
+ msgstr "ALT ã¾ã㯠TITLE ããªãç»åã®ä»£æ¿ããã¹ã表示"
+
+-#: rc.c:81
++#: rc.c:83
+ msgid "Load inline images automatically"
+ msgstr "ã¤ã³ã©ã¤ã³ç»åãèªåã§èªã¿è¾¼ã"
+
+-#: rc.c:82
++#: rc.c:84
+ msgid "Maximum processes for parallel image loading"
+ msgstr "ç»åèªã¿è¾¼ã¿æã®æ大ããã»ã¹æ°"
+
+-#: rc.c:83
++#: rc.c:85
+ msgid "Use external image viewer"
+ msgstr "ç»åãå¤é¨ãã¥ã¼ã¯ã§è¡¨ç¤º"
+
+-#: rc.c:84
++#: rc.c:86
+ msgid "Scale of image (%)"
+ msgstr "ç»åã®ã¹ã±ã¼ã«(%)"
+
+-#: rc.c:85
++#: rc.c:87
+ msgid "External command to display image"
+ msgstr "ç»åã表示ããããã®ã³ãã³ã"
+
+-#: rc.c:86
++#: rc.c:88
+ msgid "Use link list of image map"
+ msgstr "ã¤ã¡ã¼ã¸ãããã®ãªã³ã¯å
ä¸è¦§ã表示"
+
+-#: rc.c:88
++#: rc.c:90
+ msgid "Display file names in multi-column format"
+ msgstr "ãã¡ã¤ã«åã®ãã«ãã«ã©ã 表示"
+
+-#: rc.c:89
++#: rc.c:91
+ msgid "Use ASCII equivalents to display entities"
+ msgstr "ã¨ã³ãã£ãã£ã ASCII ã®ä»£æ¿è¡¨ç¾ã§è¡¨ã"
+
+-#: rc.c:90
++#: rc.c:92
+ msgid "Character type for border of table and menu"
+ msgstr "ãã¼ãã«ãã¡ãã¥ã¼ã®æ ã«ä½¿ãæå"
+
+-#: rc.c:91
++#: rc.c:93
++msgid "Display table borders, ignore value of BORDER"
++msgstr "BORDER ã®å¤ã¯ç¡è¦ãã¦ãã¼ãã«æ ã表示"
++
++#: rc.c:94
+ msgid "Fold lines in TEXTAREA"
+ msgstr "TEXTAREA ã®è¡ãæãè¿ãã¦è¡¨ç¤º"
+
+-#: rc.c:92
++#: rc.c:95
+ msgid "Display INS, DEL, S and STRIKE element"
+ msgstr "INS, DEL, S, STRIKE è¦ç´ ã®è¡¨ç¤º"
+
+-#: rc.c:93
++#: rc.c:96
+ msgid "Display with color"
+ msgstr "ã«ã©ã¼è¡¨ç¤º"
+
+-#: rc.c:94
++#: rc.c:97
+ msgid "Color of normal character"
+ msgstr "æåã®è²"
+
+-#: rc.c:95
++#: rc.c:98
+ msgid "Color of anchor"
+ msgstr "ã¢ã³ã«ã¼ã®è²"
+
+-#: rc.c:96
++#: rc.c:99
+ msgid "Color of image link"
+ msgstr "ç»åãªã³ã¯ã®è²"
+
+-#: rc.c:97
++#: rc.c:100
+ msgid "Color of form"
+ msgstr "ãã©ã¼ã ã®è²"
+
+-#: rc.c:98
++#: rc.c:101
+ msgid "Enable coloring of active link"
+ msgstr "ç¾å¨é¸æããã¦ãããªã³ã¯ã®è²ãæå®ãã"
+
+-#: rc.c:99
++#: rc.c:102
+ msgid "Color of currently active link"
+ msgstr "ç¾å¨é¸æããã¦ãããªã³ã¯ã®è²"
+
+-#: rc.c:100
++#: rc.c:103
+ msgid "Use visited link color"
+ msgstr "訪ãããã¨ããããªã³ã¯ã¯è²ãå¤ãã"
+
+-#: rc.c:101
++#: rc.c:104
+ msgid "Color of visited link"
+ msgstr "訪ãããã¨ããããªã³ã¯ã®è²"
+
+-#: rc.c:102
++#: rc.c:105
+ msgid "Color of background"
+ msgstr "èæ¯ã®è²"
+
+-#: rc.c:103
++#: rc.c:106
+ msgid "Color of mark"
+ msgstr "ãã¼ã¯ã®è²"
+
+-#: rc.c:104
++#: rc.c:107
+ msgid "Use proxy"
+ msgstr "ãããã·ã使ç¨ãã"
+
+-#: rc.c:105
++#: rc.c:108
+ msgid "URL of HTTP proxy host"
+ msgstr "HTTPãããã·(URLã§å
¥å)"
+
+-#: rc.c:107
++#: rc.c:110
+ msgid "URL of HTTPS proxy host"
+ msgstr "HTTPSãããã·(URLã§å
¥å)"
+
+-#: rc.c:110
++#: rc.c:113
+ msgid "URL of GOPHER proxy host"
+ msgstr "GOPHERãããã·(URLã§å
¥å)"
+
+-#: rc.c:112
++#: rc.c:115
+ msgid "URL of FTP proxy host"
+ msgstr "FTPãããã·(URLã§å
¥å)"
+
+-#: rc.c:113
++#: rc.c:116
+ msgid "Domains to be accessed directly (no proxy)"
+ msgstr "ãããã·ããé¤å¤ãããã¡ã¤ã³"
+
+-#: rc.c:114
++#: rc.c:117
+ msgid "Check noproxy by network address"
+ msgstr "ãããã¯ã¼ã¯ã¢ãã¬ã¹ã§ãããã·é¤å¤ã®ãã§ãã¯"
+
+-#: rc.c:115
++#: rc.c:118
+ msgid "Disable cache"
+ msgstr "Cache ã使ããªã"
+
+-#: rc.c:117
++#: rc.c:120
+ msgid "News server"
+ msgstr "News ãµã¼ã"
+
+-#: rc.c:118
++#: rc.c:121
+ msgid "Mode of news server"
+ msgstr "News ãµã¼ãã®ã¢ã¼ã"
+
+-#: rc.c:119
++#: rc.c:122
+ msgid "Number of news messages"
+ msgstr "News ãä¸è¦§è¡¨ç¤ºããæã®æ°"
+
+-#: rc.c:121
++#: rc.c:124
+ msgid "Order of name resolution"
+ msgstr "åå解決ã®é åº"
+
+-#: rc.c:122
++#: rc.c:125
+ msgid "Directory corresponding to / (document root)"
+ msgstr "/ ã§è¡¨ããããã£ã¬ã¯ããª(document root)"
+
+-#: rc.c:123
++#: rc.c:126
+ msgid "Directory corresponding to /~user"
+ msgstr "/~user ã§è¡¨ããããã£ã¬ã¯ããª"
+
+-#: rc.c:124
++#: rc.c:127
+ msgid "Directory corresponding to /cgi-bin"
+ msgstr "/cgi-bin ã§è¡¨ããããã£ã¬ã¯ããª"
+
+-#: rc.c:125
++#: rc.c:128
+ msgid "Confirm when quitting with q"
+ msgstr "q ã§ã®çµäºæã«ç¢ºèªãã"
+
+-#: rc.c:126
++#: rc.c:129
+ msgid "Close tab if buffer is last when back"
+ msgstr "æ»ãæã«ãããã¡ãæå¾ãªãã¿ããéãã"
+
+-#: rc.c:128
++#: rc.c:131
+ msgid "Enable mark operations"
+ msgstr "ãã¼ã¯æ©è½ãæå¹ã«ãã"
+
+-#: rc.c:130
++#: rc.c:133
+ msgid "Enable Emacs-style line editing"
+ msgstr "Emacs風ã®è¡ç·¨éã«ãã"
+
+-#: rc.c:131
++#: rc.c:134
+ msgid "Enable vi-like numeric prefix"
+ msgstr "vi風ã®æ°å¤ãã¬ãã£ã¯ã¹"
+
+-#: rc.c:132
++#: rc.c:135
+ msgid "Move cursor to top line when going to label"
+ msgstr "ã©ãã«ã«ç§»åããæã«ã«ã¼ã½ã«ããããã«ãªãããã«ãã"
+
+-#: rc.c:133
++#: rc.c:136
+ msgid "Move cursor to top line when moving to next page"
+ msgstr "次ã®ãã¼ã¸ã«ç§»åããæã«ã«ã¼ã½ã«ããããã«ãªãããã«ãã"
+
+-#: rc.c:134
++#: rc.c:137
+ msgid "Fold lines of plain text file"
+ msgstr "plain text ãã¡ã¤ã«ã®è¡ãæãè¿ã"
+
+-#: rc.c:135
++#: rc.c:138
+ msgid "Show line numbers"
+ msgstr "è¡çªå·ã表示ãã"
+
+-#: rc.c:136
++#: rc.c:139
+ msgid "Show search string"
+ msgstr "æ¤ç´¢æååã表示ãã"
+
+-#: rc.c:137
++#: rc.c:140
+ msgid "List of mime.types files"
+ msgstr "å©ç¨ããmime.types"
+
+-#: rc.c:138
++#: rc.c:141
+ msgid "List of mailcap files"
+ msgstr "å©ç¨ããmailcap"
+
+-#: rc.c:139
++#: rc.c:142
+ msgid "List of urimethodmap files"
+ msgstr "å©ç¨ããurimethodmap"
+
+-#: rc.c:140
++#: rc.c:143
+ msgid "Editor"
+ msgstr "å©ç¨ããã¨ãã£ã¿"
+
+-#: rc.c:141
++#: rc.c:144
+ msgid "Mailer"
+ msgstr "å©ç¨ããã¡ã¼ã©"
+
+-#: rc.c:142
++#: rc.c:145
+ msgid "How to call Mailer for mailto URLs with options"
+ msgstr "mailto ã¿ã°ã®åãæ±ã"
+
+-#: rc.c:143
+-msgid "External Browser"
++#: rc.c:146
++msgid "External browser"
+ msgstr "å¤é¨ãã©ã¦ã¶"
+
+-#: rc.c:144
+-msgid "Second External Browser"
++#: rc.c:147
++msgid "2nd external browser"
+ msgstr "å¤é¨ãã©ã¦ã¶ãã®2"
+
+-#: rc.c:145
+-msgid "Third External Browser"
++#: rc.c:148
++msgid "3rd external browser"
+ msgstr "å¤é¨ãã©ã¦ã¶ãã®3"
+
+-#: rc.c:146
++#: rc.c:149
++msgid "4th external browser"
++msgstr "å¤é¨ãã©ã¦ã¶ãã®4"
++
++#: rc.c:150
++msgid "5th external browser"
++msgstr "å¤é¨ãã©ã¦ã¶ãã®5"
++
++#: rc.c:151
++msgid "6th external browser"
++msgstr "å¤é¨ãã©ã¦ã¶ãã®6"
++
++#: rc.c:152
++msgid "7th external browser"
++msgstr "å¤é¨ãã©ã¦ã¶ãã®7"
++
++#: rc.c:153
++msgid "8th external browser"
++msgstr "å¤é¨ãã©ã¦ã¶ãã®8"
++
++#: rc.c:154
++msgid "9th external browser"
++msgstr "å¤é¨ãã©ã¦ã¶ãã®9"
++
++#: rc.c:155
+ msgid "Disable secret file security check"
+ msgstr "ãã¹ã¯ã¼ããã¡ã¤ã«ã®ãã¼ããã·ã§ã³ããã§ãã¯ããªã"
+
+-#: rc.c:147
++#: rc.c:156
+ msgid "Password file"
+ msgstr "ãã¹ã¯ã¼ããã¡ã¤ã«"
+
+-#: rc.c:148
++#: rc.c:157
+ msgid "File for setting form on loading"
+ msgstr "ææ¸èªè¾¼æã®ãã©ã¼ã è¨å®ç¨ãã¡ã¤ã«"
+
+-#: rc.c:149
++#: rc.c:158
++msgid "File for preferences for each site"
++msgstr "ãµã¤ãå¥è¨å®ã®ãã¡ã¤ã«"
++
++#: rc.c:159
+ msgid "Password for anonymous FTP (your mail address)"
+ msgstr "FTPã®ãã¹ã¯ã¼ã(æ®éã¯èªåã®mail addressã使ã)"
+
+-#: rc.c:150
++#: rc.c:160
+ msgid "Generate domain part of password for FTP"
+ msgstr "FTPã®ãã¹ã¯ã¼ãã®ãã¡ã¤ã³åãèªåçæãã"
+
+-#: rc.c:151
++#: rc.c:161
+ msgid "User-Agent identification string"
+ msgstr "User-Agent"
+
+-#: rc.c:152
++#: rc.c:162
+ msgid "Accept-Encoding header"
+ msgstr "å§ç¸®æ¹æ³(Accept-Encoding:)"
+
+-#: rc.c:153
++#: rc.c:163
+ msgid "Accept header"
+ msgstr "åãã¤ããã¡ãã£ã¢ã¿ã¤ã(Accept:)"
+
+-#: rc.c:154
++#: rc.c:164
+ msgid "Accept-Language header"
+ msgstr "åãã¤ããè¨èª(Accept-Language:)"
+
+-#: rc.c:155
++#: rc.c:165
+ msgid "Treat URL-like strings as links in all pages"
+ msgstr "å
¨ã¦ã®ãã¼ã¸ã®URL風ã®æååããªã³ã¯ã«ãã"
+
+-#: rc.c:156
++#: rc.c:166
+ msgid "Wrap search"
+ msgstr "æãè¿ãæ¤ç´¢"
+
+-#: rc.c:157
++#: rc.c:167
+ msgid "Display unseen objects (e.g. bgimage tag)"
+ msgstr "èæ¯ç»åçã¸ã®ãªã³ã¯ãä½ã"
+
+-#: rc.c:158
++#: rc.c:168
+ msgid "Uncompress compressed data automatically when downloading"
+ msgstr "ãã¦ã³ãã¼ãæã«èªåçã«å§ç¸®ããããã¼ã¿ã解åãã"
+
+-#: rc.c:160
++#: rc.c:170
+ msgid "Run external viewer in a separate session"
+ msgstr "å¤é¨ãã¥ã¼ã¢ãå¥ã»ãã·ã§ã³ã§åãã"
+
+-#: rc.c:162
++#: rc.c:172
+ msgid "Run external viewer in the background"
+ msgstr "å¤é¨ãã¥ã¼ã¢ãããã¯ã°ã©ã¦ã³ãã§åãã"
+
+-#: rc.c:164
++#: rc.c:174
+ msgid "Use external program for directory listing"
+ msgstr "ãã£ã¬ã¯ããªãªã¹ãã«å¤é¨ã³ãã³ãã使ã"
+
+-#: rc.c:165
++#: rc.c:175
+ msgid "URL of directory listing command"
+ msgstr "ãã£ã¬ã¯ããªãªã¹ãç¨ã³ãã³ã"
+
+-#: rc.c:167
++#: rc.c:177
+ msgid "Enable dictionary lookup through CGI"
+ msgstr "è¾æ¸å¼ããCGIçµç±ã§ãããªã"
+
+-#: rc.c:168
++#: rc.c:178
+ msgid "URL of dictionary lookup command"
+ msgstr "è¾æ¸å¼ãã³ãã³ãã®URL"
+
+-#: rc.c:170
++#: rc.c:180
+ msgid "Display link name for images lacking ALT"
+ msgstr "空ã®IMG ALTå±æ§ã®æã«ãªã³ã¯åã表示ãã"
+
+-#: rc.c:171
++#: rc.c:181
+ msgid "Index file for directories"
+ msgstr "åãã£ã¬ã¯ããªã®ã¤ã³ããã¯ã¹ãã¡ã¤ã«"
+
+-#: rc.c:172
++#: rc.c:182
+ msgid "Prepend http:// to URL automatically"
+ msgstr "URLã«èªåçã« http:// ãè£ã"
+
+-#: rc.c:173
++#: rc.c:183
+ msgid "Default value for open-URL command"
+ msgstr "URLãéãæã®ããã©ã«ãæåå"
+
+-#: rc.c:174
++#: rc.c:184
+ msgid "Decode Content-Transfer-Encoding when saving"
+ msgstr "ä¿åæã« Content-Transfer-Encoding ããã³ã¼ããã"
+
+-#: rc.c:175
++#: rc.c:185
+ msgid "Preserve timestamp when saving"
+ msgstr "ä¿åæã«ã¿ã¤ã ã¹ã¿ã³ããä¿æãã"
+
+-#: rc.c:177
++#: rc.c:187
+ msgid "Enable mouse"
+ msgstr "ãã¦ã¹ã使ã"
+
+-#: rc.c:178
++#: rc.c:188
+ msgid "Scroll in reverse direction of mouse drag"
+ msgstr "ãã¦ã¹ã®ãã©ãã°åä½ãéã«ãã"
+
+-#: rc.c:179
++#: rc.c:189
+ msgid "Behavior of wheel scroll speed"
+ msgstr "ãã¤ã¼ã«ã§ã®ã¹ã¯ãã¼ã«é度ã®æ±ã"
+
+-#: rc.c:180
++#: rc.c:190
+ msgid "(A only)Scroll by # (%) of screen"
+ msgstr "(Aã®ã¿)ç»é¢ã®ä½%ã¹ã¯ãã¼ã«ããã"
+
+-#: rc.c:181
++#: rc.c:191
+ msgid "(B only)Scroll by # lines"
+ msgstr "(Bã®ã¿)ã¹ã¯ãã¼ã«ããè¡æ°"
+
+-#: rc.c:183
++#: rc.c:193
+ msgid "Free memory of undisplayed buffers"
+ msgstr "表示ããã¦ããªããããã¡ã®ã¡ã¢ãªã解æ¾ãã"
+
+-#: rc.c:184
++#: rc.c:194
+ msgid "Suppress `Referer:' header"
+ msgstr "Referer: ãéããªãããã«ãã"
+
+-#: rc.c:185
++#: rc.c:195
+ msgid "Search case-insensitively"
+ msgstr "ãµã¼ãæã«å¤§æåå°æåã®åºå¥ãããªã"
+
+-#: rc.c:186
++#: rc.c:196
+ msgid "Use LESSOPEN"
+ msgstr "LESSOPENã使ç¨"
+
+-#: rc.c:189
++#: rc.c:199
+ msgid "Perform SSL server verification"
+ msgstr "SSLã®ãµã¼ãèªè¨¼ãè¡ã"
+
+-#: rc.c:190
++#: rc.c:200
+ msgid "PEM encoded certificate file of client"
+ msgstr "SSLã®ã¯ã©ã¤ã¢ã³ãç¨PEMå½¢å¼è¨¼ææ¸ãã¡ã¤ã«"
+
+-#: rc.c:191
++#: rc.c:201
+ msgid "PEM encoded private key file of client"
+ msgstr "SSLã®ã¯ã©ã¤ã¢ã³ãç¨PEMå½¢å¼ç§å¯éµãã¡ã¤ã«"
+
+-#: rc.c:192
++#: rc.c:202
+ msgid "Path to directory for PEM encoded certificates of CAs"
+ msgstr "SSLã®èªè¨¼å±ã®PEMå½¢å¼è¨¼ææ¸ç¾¤ã®ãããã£ã¬ã¯ããªã¸ã®ãã¹"
+
+-#: rc.c:193
++#: rc.c:203
+ msgid "File consisting of PEM encoded certificates of CAs"
+ msgstr "SSLã®èªè¨¼å±ã®PEMå½¢å¼è¨¼ææ¸ç¾¤ã®ãã¡ã¤ã«"
+
+-#: rc.c:195
++#: rc.c:205
+ msgid "List of forbidden SSL methods (2: SSLv2, 3: SSLv3, t:TLSv1)"
+ msgstr "使ããªãSSLã¡ã½ããã®ãªã¹ã(2: SSLv2, 3: SSLv3, t:TLSv1)"
+
+-#: rc.c:198
++#: rc.c:208
+ msgid "Enable cookie processing"
+ msgstr "ã¯ããã¼ã使ç¨ãã"
+
+-#: rc.c:199
++#: rc.c:209
+ msgid "Print a message when receiving a cookie"
+ msgstr "ã¯ããã¼ãåãä»ããã¨ãã«ã¡ãã»ã¼ã¸ã表示ãã"
+
+-#: rc.c:200
++#: rc.c:210
+ msgid "Accept cookies"
+ msgstr "ã¯ããã¼ãåãä»ãã"
+
+-#: rc.c:201
++#: rc.c:211
+ msgid "Action to be taken on invalid cookie"
+ msgstr "åé¡ã®ããã¯ããã¼ã§ãåãä»ãã"
+
+-#: rc.c:202
++#: rc.c:212
+ msgid "Domains to reject cookies from"
+ msgstr "ã¯ããã¼ãåãä»ããªããã¡ã¤ã³"
+
+-#: rc.c:203
++#: rc.c:213
+ msgid "Domains to accept cookies from"
+ msgstr "ã¯ããã¼ãåãä»ãããã¡ã¤ã³"
+
+-#: rc.c:204
++#: rc.c:214
+ msgid "Domains to avoid [wrong number of dots]"
+ msgstr "[wrong number of dots] ãç¡è¦ãããã¡ã¤ã³"
+
+-#: rc.c:206
++#: rc.c:216
+ msgid "Number of redirections to follow"
+ msgstr "å¾ããªãã¤ã¬ã¯ãã®åæ°"
+
+-#: rc.c:207
++#: rc.c:217
+ msgid "Enable processing of meta-refresh tag"
+ msgstr "meta refresh ã«å¯¾å¿ãã"
+
+-#: rc.c:210
++#: rc.c:220
+ msgid "Enable Migemo (Roma-ji search)"
+ msgstr "Migemo(ãã¼ãåæ¤ç´¢)ã使ç¨ãã"
+
+-#: rc.c:211
++#: rc.c:221
+ msgid "Migemo command"
+ msgstr "Migemoã³ãã³ã"
+
+-#: rc.c:215
++#: rc.c:225
+ msgid "Display charset"
+ msgstr "表示ç¨æåã³ã¼ã"
+
+-#: rc.c:216
++#: rc.c:226
+ msgid "Default document charset"
+ msgstr "ææ¸ã®æ¨æºã®æåã³ã¼ã"
+
+-#: rc.c:217
++#: rc.c:227
+ msgid "Automatic charset detect when loading"
+ msgstr "ææ¸ã®èªã¿è¾¼ã¿æã«æåã³ã¼ãã®èªåå¤å®ãè¡ã"
+
+-#: rc.c:218
++#: rc.c:228
+ msgid "System charset"
+ msgstr "ã·ã¹ãã ã®æåã³ã¼ã"
+
+-#: rc.c:219
++#: rc.c:229
+ msgid "System charset follows locale(LC_CTYPE)"
+ msgstr "Locale(LC_CTYPE) ã«å¾ã£ã¦ã·ã¹ãã ã®æåã³ã¼ããè¨å®"
+
+-#: rc.c:220
++#: rc.c:230
+ msgid "Output halfdump with display charset"
+ msgstr "表示ç¨æåã³ã¼ã㧠halfdump ã®åºåãè¡ã"
+
+-#: rc.c:221
++#: rc.c:231
+ msgid "Use multi column characters"
+ msgstr "è¤æ°ã«ã©ã ã®æåã使ã"
+
+-#: rc.c:222
++#: rc.c:232
+ msgid "Use combining characters"
+ msgstr "çµåæåã使ã"
+
+-#: rc.c:223
++#: rc.c:233
+ msgid "Use double width for some Unicode characters"
+ msgstr "ãã種ã®Unicodeæåãå
¨è§ã«ãã"
+
+-#: rc.c:224
++#: rc.c:234
+ msgid "Use Unicode language tags"
+ msgstr "Unicode ã®è¨èªã¿ã°ã使ã"
+
+-#: rc.c:225
++#: rc.c:235
+ msgid "Charset conversion using Unicode map"
+ msgstr "Unicodeãä»ããã³ã¼ãå¤æ"
+
+-#: rc.c:226
++#: rc.c:236
+ msgid "Charset conversion when loading"
+ msgstr "ææ¸ã®èªã¿è¾¼ã¿æã«æåã³ã¼ããå¤æãã"
+
+-#: rc.c:227
++#: rc.c:237
+ msgid "Adjust search string for document charset"
+ msgstr "æ¤ç´¢æååãææ¸ã®æåã³ã¼ãã«å¤æãã"
+
+-#: rc.c:228
++#: rc.c:238
+ msgid "Fix character width when conversion"
+ msgstr "æåå¹
ã®å¤ããå¤æãããªã"
+
+-#: rc.c:229
++#: rc.c:239
+ msgid "Use GB 12345 Unicode map instead of GB 2312's"
+ msgstr "GB 12345 ã® Unicode ãããã GB 2312 ç¨ã«ä½¿ã"
+
+-#: rc.c:230
++#: rc.c:240
+ msgid "Use JIS X 0201 Roman for ISO-2022-JP"
+ msgstr "ISO-2022-JP 㧠JIS X 0201-Roman ã使ã"
+
+-#: rc.c:231
++#: rc.c:241
+ msgid "Use JIS C 6226:1978 for ISO-2022-JP"
+ msgstr "ISO-2022-JP 㧠JIS C 6226:1978(æ§JIS) ã使ã"
+
+-#: rc.c:232
++#: rc.c:242
+ msgid "Use JIS X 0201 Katakana"
+ msgstr "JIS X 0201-Katakana ã使ã"
+
+-#: rc.c:233
++#: rc.c:243
+ msgid "Use JIS X 0212:1990 (Supplemental Kanji)"
+ msgstr "JIS X 0212:1990(è£å©æ¼¢å) ã使ã"
+
+-#: rc.c:234
++#: rc.c:244
+ msgid "Use JIS X 0213:2000 (2000JIS)"
+ msgstr "JIS X 0213:2000(2000JIS) ã使ã"
+
+-#: rc.c:235
++#: rc.c:245
+ msgid "Strict ISO-2022-JP/KR/CN"
+ msgstr "å³æ ¼ãª ISO-2022-JP/KR/CN ã使ã"
+
+-#: rc.c:236
++#: rc.c:246
+ msgid "Treat 4 bytes char. of GB18030 as Unicode"
+ msgstr "GB18030 ã® 4ãã¤ãæåã Unicode ã¨ãã¦æ±ã"
+
+-#: rc.c:237
++#: rc.c:247
+ msgid "Simple Preserve space"
+ msgstr "åç´ãªç©ºç½ã®ä¿å"
+
+-#: rc.c:240
++#: rc.c:250
+ msgid "keymap file"
+ msgstr "keymapãã¡ã¤ã«"
+
+-#: rc.c:257
++#: rc.c:267
+ msgid "black"
+ msgstr "é»"
+
+-#: rc.c:258
++#: rc.c:268
+ msgid "red"
+ msgstr "赤"
+
+-#: rc.c:259
++#: rc.c:269
+ msgid "green"
+ msgstr "ç·"
+
+-#: rc.c:260
++#: rc.c:270
+ msgid "yellow"
+ msgstr "é»"
+
+-#: rc.c:261
++#: rc.c:271
+ msgid "blue"
+ msgstr "é"
+
+-#: rc.c:262
++#: rc.c:272
+ msgid "magenta"
+ msgstr "ç´«"
+
+-#: rc.c:263
++#: rc.c:273
+ msgid "cyan"
+ msgstr "空è²"
+
+-#: rc.c:264
++#: rc.c:274
+ msgid "white"
+ msgstr "ç½"
+
+-#: rc.c:265
++#: rc.c:275
+ msgid "terminal"
+ msgstr "端æ«"
+
+-#: rc.c:284
++#: rc.c:294
+ msgid "none"
+ msgstr "ç¡ã"
+
+-#: rc.c:285
++#: rc.c:295
+ msgid "current URL"
+ msgstr "ç¾å¨ã®URL"
+
+-#: rc.c:286
++#: rc.c:296
+ msgid "link URL"
+ msgstr "ãªã³ã¯å
ã®URL"
+
+-#: rc.c:291
++#: rc.c:301
+ msgid "simple"
+ msgstr "ã·ã³ãã«"
+
+-#: rc.c:292
++#: rc.c:302
+ msgid "use tag"
+ msgstr "ã¿ã°ã§è¡¨ç¤º"
+
+-#: rc.c:293
++#: rc.c:303
+ msgid "fontify"
+ msgstr "æåè£
飾"
+
+-#: rc.c:299
++#: rc.c:309
+ msgid "A:relative to screen height"
+ msgstr "A:ç»é¢ãµã¤ãºã«æ¯ä¾"
+
+-#: rc.c:300
++#: rc.c:310
+ msgid "B:fixed speed"
+ msgstr "B:ä¸å®ã®è¡æ°"
+
+-#: rc.c:307
++#: rc.c:317
+ msgid "unspecified"
+ msgstr "æå®ããªã"
+
+-#: rc.c:308
++#: rc.c:318
+ msgid "inet inet6"
+ msgstr "IPv4åªå
"
+
+-#: rc.c:309
++#: rc.c:319
+ msgid "inet6 inet"
+ msgstr "IPv6åªå
"
+
+-#: rc.c:310
++#: rc.c:320
+ msgid "inet only"
+ msgstr "IPv4ã®ã¿"
+
+-#: rc.c:311
++#: rc.c:321
+ msgid "inet6 only"
+ msgstr "IPv6ã®ã¿"
+
+-#: rc.c:318
++#: rc.c:328
+ msgid "discard"
+ msgstr "ç ´æ£ãã"
+
+-#: rc.c:320
++#: rc.c:330
+ msgid "accept"
+ msgstr "åãå
¥ãã"
+
+-#: rc.c:322
++#: rc.c:332
+ msgid "ask"
+ msgstr "確èªãã"
+
+-#: rc.c:329
++#: rc.c:339
+ msgid "use internal mailer instead"
+ msgstr "å
é¨ã¡ã¼ã©ã使ç¨"
+
+-#: rc.c:331
++#: rc.c:341
+ msgid "ignore options and use only the address"
+ msgstr "ã¢ãã¬ã¹ã®ã¿ä½¿ç¨"
+
+-#: rc.c:332
++#: rc.c:342
+ msgid "use full mailto URL"
+ msgstr "URL å
¨ä½ã使ç¨"
+
+-#: rc.c:341
++#: rc.c:351
+ msgid "OFF"
+ msgstr "ç¡å¹"
+
+-#: rc.c:342
++#: rc.c:352
+ msgid "Only ISO 2022"
+ msgstr "ISO 2022 ã®ã¿"
+
+-#: rc.c:343
++#: rc.c:353
+ msgid "ON"
+ msgstr "æå¹"
+
+-#: rc.c:349
++#: rc.c:359
+ msgid "ASCII"
+ msgstr "ASCII"
+
+-#: rc.c:350
++#: rc.c:360
+ msgid "charset specific"
+ msgstr "æåã³ã¼ãä¾å"
+
+-#: rc.c:351
++#: rc.c:361
+ msgid "DEC special graphics"
+ msgstr "DEC ç¹æ®æå"
+
+-#: rc.c:714
++#: rc.c:740
+ msgid "Display Settings"
+ msgstr "表示é¢ä¿"
+
+-#: rc.c:716
++#: rc.c:742
+ msgid "Color Settings"
+ msgstr "表示è²"
+
+-#: rc.c:718
++#: rc.c:744
+ msgid "Miscellaneous Settings"
+ msgstr "éå¤ãªè¨å®"
+
+-#: rc.c:719
++#: rc.c:745
+ msgid "Directory Settings"
+ msgstr "ãã£ã¬ã¯ããªè¨å®"
+
+-#: rc.c:720
++#: rc.c:746
+ msgid "External Program Settings"
+ msgstr "å¤é¨ããã°ã©ã "
+
+-#: rc.c:721
++#: rc.c:747
+ msgid "Network Settings"
+ msgstr "ãããã¯ã¼ã¯ã®è¨å®"
+
+-#: rc.c:722
++#: rc.c:748
+ msgid "Proxy Settings"
+ msgstr "ãããã·ã®è¨å®"
+
+-#: rc.c:724
++#: rc.c:750
+ msgid "SSL Settings"
+ msgstr "SSLã®è¨å®"
+
+-#: rc.c:727
++#: rc.c:753
+ msgid "Cookie Settings"
+ msgstr "ã¯ããã¼ã®è¨å®"
+
+-#: rc.c:730
++#: rc.c:756
+ msgid "Charset Settings"
+ msgstr "æåã³ã¼ãã®è¨å®"
+
+@@ -875,6 +907,6 @@ msgstr "æåã³ã¼ãã®è¨å®"
+ #. * header. For example, ja.po should translate it as
+ #. * "ja;q=1.0, en;q=0.5" like that.
+ #.
+-#: rc.c:1209
++#: rc.c:1238
+ msgid "en;q=1.0"
+ msgstr "ja;q=1.0, en;q=0.5"
+diff --git a/po/w3m.pot b/po/w3m.pot
+index e164b1e..607e26f 100644
+--- a/po/w3m.pot
++++ b/po/w3m.pot
+@@ -1,6 +1,6 @@
+ # SOME DESCRIPTIVE TITLE.
+-# Copyright (C) YEAR Fumitoshi UKAI
+-# This file is distributed under the same license as the PACKAGE package.
++# Copyright (C) YEAR THE w3m'S COPYRIGHT HOLDER
++# This file is distributed under the same license as the w3m package.
+ # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+ #
+ #, fuzzy
+@@ -8,7 +8,7 @@ msgid ""
+ msgstr ""
+ "Project-Id-Version: w3m 0.5.3\n"
+ "Report-Msgid-Bugs-To: satodai@w3m.jp\n"
+-"POT-Creation-Date: 2010-08-20 18:44+0900\n"
++"POT-Creation-Date: 2016-03-14 19:47+0900\n"
+ "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+ "Language-Team: LANGUAGE <LL@li.org>\n"
+@@ -17,855 +17,887 @@ msgstr ""
+ "Content-Type: text/plain; charset=CHARSET\n"
+ "Content-Transfer-Encoding: 8bit\n"
+
+-#: menu.c:267
++#: menu.c:269
+ msgid " Back (b) "
+ msgstr ""
+
+-#: menu.c:268
++#: menu.c:270
+ msgid " Select Buffer(s) "
+ msgstr ""
+
+-#: menu.c:270
++#: menu.c:272
+ msgid " Select Tab (t) "
+ msgstr ""
+
+-#: menu.c:272
++#: menu.c:274
+ msgid " View Source (v) "
+ msgstr ""
+
+-#: menu.c:273
++#: menu.c:275
+ msgid " Edit Source (e) "
+ msgstr ""
+
+-#: menu.c:274
++#: menu.c:276
+ msgid " Save Source (S) "
+ msgstr ""
+
+-#: menu.c:275
++#: menu.c:277
+ msgid " Reload (r) "
+ msgstr ""
+
+-#: menu.c:276 menu.c:283 menu.c:287
++#: menu.c:278 menu.c:285 menu.c:289
+ msgid " ---------------- "
+ msgstr ""
+
+-#: menu.c:277
++#: menu.c:279
+ msgid " Go Link (a) "
+ msgstr ""
+
+-#: menu.c:278
++#: menu.c:280
+ msgid " on New Tab (n) "
+ msgstr ""
+
+-#: menu.c:279
++#: menu.c:281
+ msgid " Save Link (A) "
+ msgstr ""
+
+-#: menu.c:280
++#: menu.c:282
+ msgid " View Image (i) "
+ msgstr ""
+
+-#: menu.c:281
++#: menu.c:283
+ msgid " Save Image (I) "
+ msgstr ""
+
+-#: menu.c:282
++#: menu.c:284
+ msgid " View Frame (f) "
+ msgstr ""
+
+-#: menu.c:284
++#: menu.c:286
+ msgid " Bookmark (B) "
+ msgstr ""
+
+-#: menu.c:285
++#: menu.c:287
+ msgid " Help (h) "
+ msgstr ""
+
+-#: menu.c:286
++#: menu.c:288
+ msgid " Option (o) "
+ msgstr ""
+
+-#: menu.c:288
++#: menu.c:290
+ msgid " Quit (q) "
+ msgstr ""
+
+-#: rc.c:60
++#: rc.c:62
+ msgid "External Viewer Setup"
+ msgstr ""
+
+-#: rc.c:61
++#: rc.c:63
+ msgid "Tab width in characters"
+ msgstr ""
+
+-#: rc.c:62
++#: rc.c:64
+ msgid "Indent for HTML rendering"
+ msgstr ""
+
+-#: rc.c:63
++#: rc.c:65
+ msgid "Number of pixels per character (4.0...32.0)"
+ msgstr ""
+
+-#: rc.c:64
++#: rc.c:66
+ msgid "Number of pixels per line (4.0...64.0)"
+ msgstr ""
+
+-#: rc.c:65
++#: rc.c:67
+ msgid "Number of remembered lines when used as a pager"
+ msgstr ""
+
+-#: rc.c:66
++#: rc.c:68
+ msgid "Use URL history"
+ msgstr ""
+
+-#: rc.c:67
++#: rc.c:69
+ msgid "Number of remembered URL"
+ msgstr ""
+
+-#: rc.c:68
++#: rc.c:70
+ msgid "Save URL history"
+ msgstr ""
+
+-#: rc.c:69
++#: rc.c:71
+ msgid "Render frames automatically"
+ msgstr ""
+
+-#: rc.c:70
++#: rc.c:72
+ msgid "Treat argument without scheme as URL"
+ msgstr ""
+
+-#: rc.c:71
++#: rc.c:73
+ msgid "Use _self as default target"
+ msgstr ""
+
+-#: rc.c:72
++#: rc.c:74
+ msgid "Open link on new tab if target is _blank or _new"
+ msgstr ""
+
+-#: rc.c:73
++#: rc.c:75
+ msgid "Open download list panel on new tab"
+ msgstr ""
+
+-#: rc.c:74
++#: rc.c:76
+ msgid "Display link URL automatically"
+ msgstr ""
+
+-#: rc.c:75
++#: rc.c:77
+ msgid "Display link numbers"
+ msgstr ""
+
+-#: rc.c:76
++#: rc.c:78
+ msgid "Display decoded URL"
+ msgstr ""
+
+-#: rc.c:77
++#: rc.c:79
+ msgid "Display current line number"
+ msgstr ""
+
+-#: rc.c:78
++#: rc.c:80
+ msgid "Display inline images"
+ msgstr ""
+
+-#: rc.c:79
++#: rc.c:81
+ msgid "Display pseudo-ALTs for inline images with no ALT or TITLE string"
+ msgstr ""
+
+-#: rc.c:81
++#: rc.c:83
+ msgid "Load inline images automatically"
+ msgstr ""
+
+-#: rc.c:82
++#: rc.c:84
+ msgid "Maximum processes for parallel image loading"
+ msgstr ""
+
+-#: rc.c:83
++#: rc.c:85
+ msgid "Use external image viewer"
+ msgstr ""
+
+-#: rc.c:84
++#: rc.c:86
+ msgid "Scale of image (%)"
+ msgstr ""
+
+-#: rc.c:85
++#: rc.c:87
+ msgid "External command to display image"
+ msgstr ""
+
+-#: rc.c:86
++#: rc.c:88
+ msgid "Use link list of image map"
+ msgstr ""
+
+-#: rc.c:88
++#: rc.c:90
+ msgid "Display file names in multi-column format"
+ msgstr ""
+
+-#: rc.c:89
++#: rc.c:91
+ msgid "Use ASCII equivalents to display entities"
+ msgstr ""
+
+-#: rc.c:90
++#: rc.c:92
+ msgid "Character type for border of table and menu"
+ msgstr ""
+
+-#: rc.c:91
++#: rc.c:93
++msgid "Display table borders, ignore value of BORDER"
++msgstr ""
++
++#: rc.c:94
+ msgid "Fold lines in TEXTAREA"
+ msgstr ""
+
+-#: rc.c:92
++#: rc.c:95
+ msgid "Display INS, DEL, S and STRIKE element"
+ msgstr ""
+
+-#: rc.c:93
++#: rc.c:96
+ msgid "Display with color"
+ msgstr ""
+
+-#: rc.c:94
++#: rc.c:97
+ msgid "Color of normal character"
+ msgstr ""
+
+-#: rc.c:95
++#: rc.c:98
+ msgid "Color of anchor"
+ msgstr ""
+
+-#: rc.c:96
++#: rc.c:99
+ msgid "Color of image link"
+ msgstr ""
+
+-#: rc.c:97
++#: rc.c:100
+ msgid "Color of form"
+ msgstr ""
+
+-#: rc.c:98
++#: rc.c:101
+ msgid "Enable coloring of active link"
+ msgstr ""
+
+-#: rc.c:99
++#: rc.c:102
+ msgid "Color of currently active link"
+ msgstr ""
+
+-#: rc.c:100
++#: rc.c:103
+ msgid "Use visited link color"
+ msgstr ""
+
+-#: rc.c:101
++#: rc.c:104
+ msgid "Color of visited link"
+ msgstr ""
+
+-#: rc.c:102
++#: rc.c:105
+ msgid "Color of background"
+ msgstr ""
+
+-#: rc.c:103
++#: rc.c:106
+ msgid "Color of mark"
+ msgstr ""
+
+-#: rc.c:104
++#: rc.c:107
+ msgid "Use proxy"
+ msgstr ""
+
+-#: rc.c:105
++#: rc.c:108
+ msgid "URL of HTTP proxy host"
+ msgstr ""
+
+-#: rc.c:107
++#: rc.c:110
+ msgid "URL of HTTPS proxy host"
+ msgstr ""
+
+-#: rc.c:110
++#: rc.c:113
+ msgid "URL of GOPHER proxy host"
+ msgstr ""
+
+-#: rc.c:112
++#: rc.c:115
+ msgid "URL of FTP proxy host"
+ msgstr ""
+
+-#: rc.c:113
++#: rc.c:116
+ msgid "Domains to be accessed directly (no proxy)"
+ msgstr ""
+
+-#: rc.c:114
++#: rc.c:117
+ msgid "Check noproxy by network address"
+ msgstr ""
+
+-#: rc.c:115
++#: rc.c:118
+ msgid "Disable cache"
+ msgstr ""
+
+-#: rc.c:117
++#: rc.c:120
+ msgid "News server"
+ msgstr ""
+
+-#: rc.c:118
++#: rc.c:121
+ msgid "Mode of news server"
+ msgstr ""
+
+-#: rc.c:119
++#: rc.c:122
+ msgid "Number of news messages"
+ msgstr ""
+
+-#: rc.c:121
++#: rc.c:124
+ msgid "Order of name resolution"
+ msgstr ""
+
+-#: rc.c:122
++#: rc.c:125
+ msgid "Directory corresponding to / (document root)"
+ msgstr ""
+
+-#: rc.c:123
++#: rc.c:126
+ msgid "Directory corresponding to /~user"
+ msgstr ""
+
+-#: rc.c:124
++#: rc.c:127
+ msgid "Directory corresponding to /cgi-bin"
+ msgstr ""
+
+-#: rc.c:125
++#: rc.c:128
+ msgid "Confirm when quitting with q"
+ msgstr ""
+
+-#: rc.c:126
++#: rc.c:129
+ msgid "Close tab if buffer is last when back"
+ msgstr ""
+
+-#: rc.c:128
++#: rc.c:131
+ msgid "Enable mark operations"
+ msgstr ""
+
+-#: rc.c:130
++#: rc.c:133
+ msgid "Enable Emacs-style line editing"
+ msgstr ""
+
+-#: rc.c:131
++#: rc.c:134
+ msgid "Enable vi-like numeric prefix"
+ msgstr ""
+
+-#: rc.c:132
++#: rc.c:135
+ msgid "Move cursor to top line when going to label"
+ msgstr ""
+
+-#: rc.c:133
++#: rc.c:136
+ msgid "Move cursor to top line when moving to next page"
+ msgstr ""
+
+-#: rc.c:134
++#: rc.c:137
+ msgid "Fold lines of plain text file"
+ msgstr ""
+
+-#: rc.c:135
++#: rc.c:138
+ msgid "Show line numbers"
+ msgstr ""
+
+-#: rc.c:136
++#: rc.c:139
+ msgid "Show search string"
+ msgstr ""
+
+-#: rc.c:137
++#: rc.c:140
+ msgid "List of mime.types files"
+ msgstr ""
+
+-#: rc.c:138
++#: rc.c:141
+ msgid "List of mailcap files"
+ msgstr ""
+
+-#: rc.c:139
++#: rc.c:142
+ msgid "List of urimethodmap files"
+ msgstr ""
+
+-#: rc.c:140
++#: rc.c:143
+ msgid "Editor"
+ msgstr ""
+
+-#: rc.c:141
++#: rc.c:144
+ msgid "Mailer"
+ msgstr ""
+
+-#: rc.c:142
++#: rc.c:145
+ msgid "How to call Mailer for mailto URLs with options"
+ msgstr ""
+
+-#: rc.c:143
+-msgid "External Browser"
++#: rc.c:146
++msgid "External browser"
+ msgstr ""
+
+-#: rc.c:144
+-msgid "Second External Browser"
++#: rc.c:147
++msgid "2nd external browser"
+ msgstr ""
+
+-#: rc.c:145
+-msgid "Third External Browser"
++#: rc.c:148
++msgid "3rd external browser"
+ msgstr ""
+
+-#: rc.c:146
++#: rc.c:149
++msgid "4th external browser"
++msgstr ""
++
++#: rc.c:150
++msgid "5th external browser"
++msgstr ""
++
++#: rc.c:151
++msgid "6th external browser"
++msgstr ""
++
++#: rc.c:152
++msgid "7th external browser"
++msgstr ""
++
++#: rc.c:153
++msgid "8th external browser"
++msgstr ""
++
++#: rc.c:154
++msgid "9th external browser"
++msgstr ""
++
++#: rc.c:155
+ msgid "Disable secret file security check"
+ msgstr ""
+
+-#: rc.c:147
++#: rc.c:156
+ msgid "Password file"
+ msgstr ""
+
+-#: rc.c:148
++#: rc.c:157
+ msgid "File for setting form on loading"
+ msgstr ""
+
+-#: rc.c:149
++#: rc.c:158
++msgid "File for preferences for each site"
++msgstr ""
++
++#: rc.c:159
+ msgid "Password for anonymous FTP (your mail address)"
+ msgstr ""
+
+-#: rc.c:150
++#: rc.c:160
+ msgid "Generate domain part of password for FTP"
+ msgstr ""
+
+-#: rc.c:151
++#: rc.c:161
+ msgid "User-Agent identification string"
+ msgstr ""
+
+-#: rc.c:152
++#: rc.c:162
+ msgid "Accept-Encoding header"
+ msgstr ""
+
+-#: rc.c:153
++#: rc.c:163
+ msgid "Accept header"
+ msgstr ""
+
+-#: rc.c:154
++#: rc.c:164
+ msgid "Accept-Language header"
+ msgstr ""
+
+-#: rc.c:155
++#: rc.c:165
+ msgid "Treat URL-like strings as links in all pages"
+ msgstr ""
+
+-#: rc.c:156
++#: rc.c:166
+ msgid "Wrap search"
+ msgstr ""
+
+-#: rc.c:157
++#: rc.c:167
+ msgid "Display unseen objects (e.g. bgimage tag)"
+ msgstr ""
+
+-#: rc.c:158
++#: rc.c:168
+ msgid "Uncompress compressed data automatically when downloading"
+ msgstr ""
+
+-#: rc.c:160
++#: rc.c:170
+ msgid "Run external viewer in a separate session"
+ msgstr ""
+
+-#: rc.c:162
++#: rc.c:172
+ msgid "Run external viewer in the background"
+ msgstr ""
+
+-#: rc.c:164
++#: rc.c:174
+ msgid "Use external program for directory listing"
+ msgstr ""
+
+-#: rc.c:165
++#: rc.c:175
+ msgid "URL of directory listing command"
+ msgstr ""
+
+-#: rc.c:167
++#: rc.c:177
+ msgid "Enable dictionary lookup through CGI"
+ msgstr ""
+
+-#: rc.c:168
++#: rc.c:178
+ msgid "URL of dictionary lookup command"
+ msgstr ""
+
+-#: rc.c:170
++#: rc.c:180
+ msgid "Display link name for images lacking ALT"
+ msgstr ""
+
+-#: rc.c:171
++#: rc.c:181
+ msgid "Index file for directories"
+ msgstr ""
+
+-#: rc.c:172
++#: rc.c:182
+ msgid "Prepend http:// to URL automatically"
+ msgstr ""
+
+-#: rc.c:173
++#: rc.c:183
+ msgid "Default value for open-URL command"
+ msgstr ""
+
+-#: rc.c:174
++#: rc.c:184
+ msgid "Decode Content-Transfer-Encoding when saving"
+ msgstr ""
+
+-#: rc.c:175
++#: rc.c:185
+ msgid "Preserve timestamp when saving"
+ msgstr ""
+
+-#: rc.c:177
++#: rc.c:187
+ msgid "Enable mouse"
+ msgstr ""
+
+-#: rc.c:178
++#: rc.c:188
+ msgid "Scroll in reverse direction of mouse drag"
+ msgstr ""
+
+-#: rc.c:179
++#: rc.c:189
+ msgid "Behavior of wheel scroll speed"
+ msgstr ""
+
+-#: rc.c:180
++#: rc.c:190
+ msgid "(A only)Scroll by # (%) of screen"
+ msgstr ""
+
+-#: rc.c:181
++#: rc.c:191
+ msgid "(B only)Scroll by # lines"
+ msgstr ""
+
+-#: rc.c:183
++#: rc.c:193
+ msgid "Free memory of undisplayed buffers"
+ msgstr ""
+
+-#: rc.c:184
++#: rc.c:194
+ msgid "Suppress `Referer:' header"
+ msgstr ""
+
+-#: rc.c:185
++#: rc.c:195
+ msgid "Search case-insensitively"
+ msgstr ""
+
+-#: rc.c:186
++#: rc.c:196
+ msgid "Use LESSOPEN"
+ msgstr ""
+
+-#: rc.c:189
++#: rc.c:199
+ msgid "Perform SSL server verification"
+ msgstr ""
+
+-#: rc.c:190
++#: rc.c:200
+ msgid "PEM encoded certificate file of client"
+ msgstr ""
+
+-#: rc.c:191
++#: rc.c:201
+ msgid "PEM encoded private key file of client"
+ msgstr ""
+
+-#: rc.c:192
++#: rc.c:202
+ msgid "Path to directory for PEM encoded certificates of CAs"
+ msgstr ""
+
+-#: rc.c:193
++#: rc.c:203
+ msgid "File consisting of PEM encoded certificates of CAs"
+ msgstr ""
+
+-#: rc.c:195
++#: rc.c:205
+ msgid "List of forbidden SSL methods (2: SSLv2, 3: SSLv3, t:TLSv1)"
+ msgstr ""
+
+-#: rc.c:198
++#: rc.c:208
+ msgid "Enable cookie processing"
+ msgstr ""
+
+-#: rc.c:199
++#: rc.c:209
+ msgid "Print a message when receiving a cookie"
+ msgstr ""
+
+-#: rc.c:200
++#: rc.c:210
+ msgid "Accept cookies"
+ msgstr ""
+
+-#: rc.c:201
++#: rc.c:211
+ msgid "Action to be taken on invalid cookie"
+ msgstr ""
+
+-#: rc.c:202
++#: rc.c:212
+ msgid "Domains to reject cookies from"
+ msgstr ""
+
+-#: rc.c:203
++#: rc.c:213
+ msgid "Domains to accept cookies from"
+ msgstr ""
+
+-#: rc.c:204
++#: rc.c:214
+ msgid "Domains to avoid [wrong number of dots]"
+ msgstr ""
+
+-#: rc.c:206
++#: rc.c:216
+ msgid "Number of redirections to follow"
+ msgstr ""
+
+-#: rc.c:207
++#: rc.c:217
+ msgid "Enable processing of meta-refresh tag"
+ msgstr ""
+
+-#: rc.c:210
++#: rc.c:220
+ msgid "Enable Migemo (Roma-ji search)"
+ msgstr ""
+
+-#: rc.c:211
++#: rc.c:221
+ msgid "Migemo command"
+ msgstr ""
+
+-#: rc.c:215
++#: rc.c:225
+ msgid "Display charset"
+ msgstr ""
+
+-#: rc.c:216
++#: rc.c:226
+ msgid "Default document charset"
+ msgstr ""
+
+-#: rc.c:217
++#: rc.c:227
+ msgid "Automatic charset detect when loading"
+ msgstr ""
+
+-#: rc.c:218
++#: rc.c:228
+ msgid "System charset"
+ msgstr ""
+
+-#: rc.c:219
++#: rc.c:229
+ msgid "System charset follows locale(LC_CTYPE)"
+ msgstr ""
+
+-#: rc.c:220
++#: rc.c:230
+ msgid "Output halfdump with display charset"
+ msgstr ""
+
+-#: rc.c:221
++#: rc.c:231
+ msgid "Use multi column characters"
+ msgstr ""
+
+-#: rc.c:222
++#: rc.c:232
+ msgid "Use combining characters"
+ msgstr ""
+
+-#: rc.c:223
++#: rc.c:233
+ msgid "Use double width for some Unicode characters"
+ msgstr ""
+
+-#: rc.c:224
++#: rc.c:234
+ msgid "Use Unicode language tags"
+ msgstr ""
+
+-#: rc.c:225
++#: rc.c:235
+ msgid "Charset conversion using Unicode map"
+ msgstr ""
+
+-#: rc.c:226
++#: rc.c:236
+ msgid "Charset conversion when loading"
+ msgstr ""
+
+-#: rc.c:227
++#: rc.c:237
+ msgid "Adjust search string for document charset"
+ msgstr ""
+
+-#: rc.c:228
++#: rc.c:238
+ msgid "Fix character width when conversion"
+ msgstr ""
+
+-#: rc.c:229
++#: rc.c:239
+ msgid "Use GB 12345 Unicode map instead of GB 2312's"
+ msgstr ""
+
+-#: rc.c:230
++#: rc.c:240
+ msgid "Use JIS X 0201 Roman for ISO-2022-JP"
+ msgstr ""
+
+-#: rc.c:231
++#: rc.c:241
+ msgid "Use JIS C 6226:1978 for ISO-2022-JP"
+ msgstr ""
+
+-#: rc.c:232
++#: rc.c:242
+ msgid "Use JIS X 0201 Katakana"
+ msgstr ""
+
+-#: rc.c:233
++#: rc.c:243
+ msgid "Use JIS X 0212:1990 (Supplemental Kanji)"
+ msgstr ""
+
+-#: rc.c:234
++#: rc.c:244
+ msgid "Use JIS X 0213:2000 (2000JIS)"
+ msgstr ""
+
+-#: rc.c:235
++#: rc.c:245
+ msgid "Strict ISO-2022-JP/KR/CN"
+ msgstr ""
+
+-#: rc.c:236
++#: rc.c:246
+ msgid "Treat 4 bytes char. of GB18030 as Unicode"
+ msgstr ""
+
+-#: rc.c:237
++#: rc.c:247
+ msgid "Simple Preserve space"
+ msgstr ""
+
+-#: rc.c:240
++#: rc.c:250
+ msgid "keymap file"
+ msgstr ""
+
+-#: rc.c:257
++#: rc.c:267
+ msgid "black"
+ msgstr ""
+
+-#: rc.c:258
++#: rc.c:268
+ msgid "red"
+ msgstr ""
+
+-#: rc.c:259
++#: rc.c:269
+ msgid "green"
+ msgstr ""
+
+-#: rc.c:260
++#: rc.c:270
+ msgid "yellow"
+ msgstr ""
+
+-#: rc.c:261
++#: rc.c:271
+ msgid "blue"
+ msgstr ""
+
+-#: rc.c:262
++#: rc.c:272
+ msgid "magenta"
+ msgstr ""
+
+-#: rc.c:263
++#: rc.c:273
+ msgid "cyan"
+ msgstr ""
+
+-#: rc.c:264
++#: rc.c:274
+ msgid "white"
+ msgstr ""
+
+-#: rc.c:265
++#: rc.c:275
+ msgid "terminal"
+ msgstr ""
+
+-#: rc.c:284
++#: rc.c:294
+ msgid "none"
+ msgstr ""
+
+-#: rc.c:285
++#: rc.c:295
+ msgid "current URL"
+ msgstr ""
+
+-#: rc.c:286
++#: rc.c:296
+ msgid "link URL"
+ msgstr ""
+
+-#: rc.c:291
++#: rc.c:301
+ msgid "simple"
+ msgstr ""
+
+-#: rc.c:292
++#: rc.c:302
+ msgid "use tag"
+ msgstr ""
+
+-#: rc.c:293
++#: rc.c:303
+ msgid "fontify"
+ msgstr ""
+
+-#: rc.c:299
++#: rc.c:309
+ msgid "A:relative to screen height"
+ msgstr ""
+
+-#: rc.c:300
++#: rc.c:310
+ msgid "B:fixed speed"
+ msgstr ""
+
+-#: rc.c:307
++#: rc.c:317
+ msgid "unspecified"
+ msgstr ""
+
+-#: rc.c:308
++#: rc.c:318
+ msgid "inet inet6"
+ msgstr ""
+
+-#: rc.c:309
++#: rc.c:319
+ msgid "inet6 inet"
+ msgstr ""
+
+-#: rc.c:310
++#: rc.c:320
+ msgid "inet only"
+ msgstr ""
+
+-#: rc.c:311
++#: rc.c:321
+ msgid "inet6 only"
+ msgstr ""
+
+-#: rc.c:318
++#: rc.c:328
+ msgid "discard"
+ msgstr ""
+
+-#: rc.c:320
++#: rc.c:330
+ msgid "accept"
+ msgstr ""
+
+-#: rc.c:322
++#: rc.c:332
+ msgid "ask"
+ msgstr ""
+
+-#: rc.c:329
++#: rc.c:339
+ msgid "use internal mailer instead"
+ msgstr ""
+
+-#: rc.c:331
++#: rc.c:341
+ msgid "ignore options and use only the address"
+ msgstr ""
+
+-#: rc.c:332
++#: rc.c:342
+ msgid "use full mailto URL"
+ msgstr ""
+
+-#: rc.c:341
++#: rc.c:351
+ msgid "OFF"
+ msgstr ""
+
+-#: rc.c:342
++#: rc.c:352
+ msgid "Only ISO 2022"
+ msgstr ""
+
+-#: rc.c:343
++#: rc.c:353
+ msgid "ON"
+ msgstr ""
+
+-#: rc.c:349
++#: rc.c:359
+ msgid "ASCII"
+ msgstr ""
+
+-#: rc.c:350
++#: rc.c:360
+ msgid "charset specific"
+ msgstr ""
+
+-#: rc.c:351
++#: rc.c:361
+ msgid "DEC special graphics"
+ msgstr ""
+
+-#: rc.c:714
++#: rc.c:740
+ msgid "Display Settings"
+ msgstr ""
+
+-#: rc.c:716
++#: rc.c:742
+ msgid "Color Settings"
+ msgstr ""
+
+-#: rc.c:718
++#: rc.c:744
+ msgid "Miscellaneous Settings"
+ msgstr ""
+
+-#: rc.c:719
++#: rc.c:745
+ msgid "Directory Settings"
+ msgstr ""
+
+-#: rc.c:720
++#: rc.c:746
+ msgid "External Program Settings"
+ msgstr ""
+
+-#: rc.c:721
++#: rc.c:747
+ msgid "Network Settings"
+ msgstr ""
+
+-#: rc.c:722
++#: rc.c:748
+ msgid "Proxy Settings"
+ msgstr ""
+
+-#: rc.c:724
++#: rc.c:750
+ msgid "SSL Settings"
+ msgstr ""
+
+-#: rc.c:727
++#: rc.c:753
+ msgid "Cookie Settings"
+ msgstr ""
+
+-#: rc.c:730
++#: rc.c:756
+ msgid "Charset Settings"
+ msgstr ""
+
+@@ -874,6 +906,6 @@ msgstr ""
+ #. * header. For example, ja.po should translate it as
+ #. * "ja;q=1.0, en;q=0.5" like that.
+ #.
+-#: rc.c:1209
++#: rc.c:1238
+ msgid "en;q=1.0"
+ msgstr ""
+diff --git a/po/zh_CN.po b/po/zh_CN.po
+new file mode 100644
+index 0000000..8cfa8fd
+--- /dev/null
++++ b/po/zh_CN.po
+@@ -0,0 +1,916 @@
++# zh_CN translation for w3m
++# Copyright (C) YEAR THE w3m'S COPYRIGHT HOLDER
++# This file is distributed under the same license as the w3m package.
++# Junde Yi <lmy441900@gmail.com>, 2014.
++# Mingcong Bai <jeffbai@aosc.xyz>, 2014.
++# liushuyu <liushuyu_011@126.com>, 2014.
++# Xingda Zheng <icenowy@outlook.com>, 2014.
++# Mingye Wang (Arthur2e5) <arthur200126@gmail.com>, 2014, 2015.
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: w3m 0.5.3\n"
++"Report-Msgid-Bugs-To: satodai@w3m.jp\n"
++"POT-Creation-Date: 2016-03-14 19:47+0900\n"
++"PO-Revision-Date: 2016-03-14 19:51+0900\n"
++"Last-Translator: Tatsuya Kinoshita <tats@debian.org>\n"
++"Language-Team: AOSC zh_CN <aosc@members.fsf.org>\n"
++"Language: zh_CN\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Poedit 1.8.6\n"
++"Plural-Forms: nplurals=1; plural=0;\n"
++
++#: menu.c:269
++msgid " Back (b) "
++msgstr " åé (b) "
++
++#: menu.c:270
++msgid " Select Buffer(s) "
++msgstr " éæ©ç¼å²åº "
++
++#: menu.c:272
++msgid " Select Tab (t) "
++msgstr " éæ©æ ç¾ (t) "
++
++#: menu.c:274
++msgid " View Source (v) "
++msgstr " æ¥çæºç (v) "
++
++#: menu.c:275
++msgid " Edit Source (e) "
++msgstr " ä¿®æ¹æºç (e) "
++
++#: menu.c:276
++msgid " Save Source (S) "
++msgstr " ä¿åæºç (S) "
++
++#: menu.c:277
++msgid " Reload (r) "
++msgstr " éæ°è½½å
¥ (r) "
++
++#: menu.c:278 menu.c:285 menu.c:289
++msgid " ---------------- "
++msgstr " ---------------- "
++
++#: menu.c:279
++msgid " Go Link (a) "
++msgstr " 转å°é¾æ¥ (a) "
++
++#: menu.c:280
++msgid " on New Tab (n) "
++msgstr " å¨æ°æ ç¾ (n) "
++
++#: menu.c:281
++msgid " Save Link (A) "
++msgstr " ä¿åé¾æ¥ (A) "
++
++#: menu.c:282
++msgid " View Image (i) "
++msgstr " æ¥çå¾ç (i) "
++
++#: menu.c:283
++msgid " Save Image (I) "
++msgstr " ä¿åå¾ç (I) "
++
++#: menu.c:284
++msgid " View Frame (f) "
++msgstr " æ¥çæ¡æ¶ (f) "
++
++#: menu.c:286
++msgid " Bookmark (B) "
++msgstr " ä¹¦ç¾ (B) "
++
++#: menu.c:287
++msgid " Help (h) "
++msgstr " å¸®å© (h) "
++
++#: menu.c:288
++msgid " Option (o) "
++msgstr " é项 (o) "
++
++#: menu.c:290
++msgid " Quit (q) "
++msgstr " éåº (q) "
++
++#: rc.c:62
++msgid "External Viewer Setup"
++msgstr "å¤é¨æ¥çå¨è®¾ç½®"
++
++#: rc.c:63
++msgid "Tab width in characters"
++msgstr "æåä¸ç TAB 宽度"
++
++#: rc.c:64
++msgid "Indent for HTML rendering"
++msgstr "ç¨äº HTML 渲æ"
++
++#: rc.c:65
++msgid "Number of pixels per character (4.0...32.0)"
++msgstr "æ¯åä½å¤§å°çåç´ å¼ (4.0...32.0)"
++
++#: rc.c:66
++msgid "Number of pixels per line (4.0...64.0)"
++msgstr "æ¯è¡çåç´ æ° (4.0...64.0)"
++
++#: rc.c:67
++msgid "Number of remembered lines when used as a pager"
++msgstr "å½ä½ä¸ºå页å¨ä½¿ç¨æ¶è®°å¿çè¡æ°"
++
++#: rc.c:68
++msgid "Use URL history"
++msgstr "ä½¿ç¨ URL åå²è®°å½"
++
++#: rc.c:69
++msgid "Number of remembered URL"
++msgstr "è®°å½ç URL æ°é"
++
++#: rc.c:70
++msgid "Save URL history"
++msgstr "ä¿å URL åå²"
++
++#: rc.c:71
++msgid "Render frames automatically"
++msgstr "èªå¨æ¸²ææ¡æ¶"
++
++#: rc.c:72
++msgid "Treat argument without scheme as URL"
++msgstr "å°æ æ ¼å¼çåæ°çä½ URL"
++
++#: rc.c:73
++msgid "Use _self as default target"
++msgstr "å°èªèº«ä½ä¸ºé»è®¤ç®æ (_S)"
++
++#: rc.c:74
++msgid "Open link on new tab if target is _blank or _new"
++msgstr "å¦æç®æ 为空 (_b) ææ°å»º (_n) å¨æ°æ ç¾æå¼é¡µé¢"
++
++#: rc.c:75
++msgid "Open download list panel on new tab"
++msgstr "æå¼ä¸è½½å表é¢æ¿äºæ°æ ç¾"
++
++#: rc.c:76
++msgid "Display link URL automatically"
++msgstr "èªå¨æ¾ç¤ºé¾æ¥ URL"
++
++#: rc.c:77
++msgid "Display link numbers"
++msgstr "æ¾ç¤ºé¾æ¥ç¼å·"
++
++#: rc.c:78
++msgid "Display decoded URL"
++msgstr "æ¾ç¤ºè§£ç åç URL"
++
++#: rc.c:79
++msgid "Display current line number"
++msgstr "æ¾ç¤ºå½åè¡æ°"
++
++#: rc.c:80
++msgid "Display inline images"
++msgstr "æ¾ç¤ºå
èå¾å"
++
++#: rc.c:81
++msgid "Display pseudo-ALTs for inline images with no ALT or TITLE string"
++msgstr "为ä¸å¸¦æ ALT æ TITLE å串çå
èå¾åæ¾ç¤ºä¼ª ALT"
++
++#: rc.c:83
++msgid "Load inline images automatically"
++msgstr "èªå¨è½½å
¥è¡å
å¾å"
++
++#: rc.c:84
++msgid "Maximum processes for parallel image loading"
++msgstr "å¤çº¿ç¨å¾åå è½½çæ大è¿ç¨æ°"
++
++#: rc.c:85
++msgid "Use external image viewer"
++msgstr "使ç¨å¤é¨å¾çæ¥çå¨"
++
++#: rc.c:86
++msgid "Scale of image (%)"
++msgstr "å¾åæ¯ä¾å°º (%)"
++
++#: rc.c:87
++msgid "External command to display image"
++msgstr "ç¨äºæ¾ç¤ºå¾åçå¤é¨å½ä»¤"
++
++#: rc.c:88
++msgid "Use link list of image map"
++msgstr "使ç¨å¾åæ å°çé¾æ¥å表"
++
++#: rc.c:90
++msgid "Display file names in multi-column format"
++msgstr "以å¤åæ ¼å¼æ¾ç¤ºæ件å"
++
++#: rc.c:91
++msgid "Use ASCII equivalents to display entities"
++msgstr "使ç¨å¯¹åºç ASCII ç¼ç æ¥æ¾ç¤ºå®ä½ "
++
++#: rc.c:92
++msgid "Character type for border of table and menu"
++msgstr "è¡¨æ ¼åèåè¾¹æ¡çå符类å"
++
++#: rc.c:93
++msgid "Display table borders, ignore value of BORDER"
++msgstr "æ¾ç¤ºè¡¨æ ¼è¾¹æ¡ï¼å¿½ç¥ BORDER æ°å¼"
++
++#: rc.c:94
++msgid "Fold lines in TEXTAREA"
++msgstr "å¨ææ¬åº (TEXTAREA) ä¸æå è¡"
++
++#: rc.c:95
++msgid "Display INS, DEL, S and STRIKE element"
++msgstr "æ¾ç¤º INS, DEL, S å STRIKE å
ç´ "
++
++#: rc.c:96
++msgid "Display with color"
++msgstr "使ç¨å¸¦é¢è²çæ¾ç¤º"
++
++#: rc.c:97
++msgid "Color of normal character"
++msgstr "ä¸è¬æåé¢è²"
++
++#: rc.c:98
++msgid "Color of anchor"
++msgstr "é¾æ¥æåé¢è²"
++
++#: rc.c:99
++msgid "Color of image link"
++msgstr "å¾çé¾æ¥é¢è²"
++
++#: rc.c:100
++msgid "Color of form"
++msgstr "è¡¨æ ¼é¢è²"
++
++#: rc.c:101
++msgid "Enable coloring of active link"
++msgstr "为活å¨é¾æ¥å¼å¯ä¸è²"
++
++#: rc.c:102
++msgid "Color of currently active link"
++msgstr "å½åæ´»å¨é¾æ¥çé¢è²"
++
++#: rc.c:103
++msgid "Use visited link color"
++msgstr "为访é®è¿çé¾æ¥ä¸è²"
++
++#: rc.c:104
++msgid "Color of visited link"
++msgstr "已访é®é¾æ¥é¢è²"
++
++#: rc.c:105
++msgid "Color of background"
++msgstr "èæ¯è²"
++
++#: rc.c:106
++msgid "Color of mark"
++msgstr "æ è®°é¢è²"
++
++#: rc.c:107
++msgid "Use proxy"
++msgstr "使ç¨ä»£çæå¡å¨"
++
++#: rc.c:108
++msgid "URL of HTTP proxy host"
++msgstr "HTTP 代ç主æºå°å"
++
++#: rc.c:110
++msgid "URL of HTTPS proxy host"
++msgstr "HTTPS 代ç主æºå°å"
++
++#: rc.c:113
++msgid "URL of GOPHER proxy host"
++msgstr "GOPHER 代ç主æºå°å"
++
++#: rc.c:115
++msgid "URL of FTP proxy host"
++msgstr "FTP 代ç主æºå°å"
++
++#: rc.c:116
++msgid "Domains to be accessed directly (no proxy)"
++msgstr "ç´æ¥è®¿é®èä¸æ¯ç¨ä»£çæå¡å¨è®¿é®ç URL"
++
++#: rc.c:117
++msgid "Check noproxy by network address"
++msgstr "æ ¹æ®ç½ç»å°åæ£æ¥ noproxy"
++
++#: rc.c:118
++msgid "Disable cache"
++msgstr "ç¦ç¨ç¼å"
++
++#: rc.c:120
++msgid "News server"
++msgstr "æ°é»æå¡å¨"
++
++#: rc.c:121
++msgid "Mode of news server"
++msgstr "æ°é»æå¡å¨æ¨¡å¼"
++
++#: rc.c:122
++msgid "Number of news messages"
++msgstr "æ°é»æ¶æ¯çæ°é"
++
++#: rc.c:124
++msgid "Order of name resolution"
++msgstr "å称解æ顺åº"
++
++#: rc.c:125
++msgid "Directory corresponding to / (document root)"
++msgstr "å¯¹åº / çç®å½ (ææ¡£æ ¹ç®å½)"
++
++#: rc.c:126
++msgid "Directory corresponding to /~user"
++msgstr "å¯¹åº /~user çç®å½"
++
++#: rc.c:127
++msgid "Directory corresponding to /cgi-bin"
++msgstr "å¯¹åº /cgi-bin çç®å½"
++
++#: rc.c:128
++msgid "Confirm when quitting with q"
++msgstr "ä½¿ç¨ q é®éåºæ¶è¯·æ±ç¡®è®¤"
++
++#: rc.c:129
++msgid "Close tab if buffer is last when back"
++msgstr "å¨è¿åæ¶ç¼å²åºè¿æ¯ä»¥åç¶æå°±å
³éæ ç¾é¡µ"
++
++#: rc.c:131
++msgid "Enable mark operations"
++msgstr "å¯ç¨æ è®°æä½"
++
++#: rc.c:133
++msgid "Enable Emacs-style line editing"
++msgstr "å¯ç¨ Emacs é£æ ¼çè¡ç¼è¾"
++
++#: rc.c:134
++msgid "Enable vi-like numeric prefix"
++msgstr "å¯å¨ vi å¼çæ°å跳转"
++
++#: rc.c:135
++msgid "Move cursor to top line when going to label"
++msgstr "å½ç§»å¨å°æ ç¾æ¶å°å
æ 移å°æ顶è¡"
++
++#: rc.c:136
++msgid "Move cursor to top line when moving to next page"
++msgstr "å½è½¬å°ä¸ä¸é¡µæ¶å°å
æ 移å°æ顶è¡"
++
++#: rc.c:137
++msgid "Fold lines of plain text file"
++msgstr "对纯ææ¬æ件å®è¡è¡æå "
++
++#: rc.c:138
++msgid "Show line numbers"
++msgstr "æ¾ç¤ºè¡å·"
++
++#: rc.c:139
++msgid "Show search string"
++msgstr "æ¾ç¤ºæç´¢å符串"
++
++#: rc.c:140
++msgid "List of mime.types files"
++msgstr "mime.type æ件å表"
++
++#: rc.c:141
++msgid "List of mailcap files"
++msgstr "mailcap æ件å表"
++
++#: rc.c:142
++msgid "List of urimethodmap files"
++msgstr "urlmethodmap æ件å表"
++
++#: rc.c:143
++msgid "Editor"
++msgstr "ç¼è¾å¨"
++
++#: rc.c:144
++msgid "Mailer"
++msgstr "åéè
"
++
++#: rc.c:145
++msgid "How to call Mailer for mailto URLs with options"
++msgstr "å¯å¨ mailto å°åæ¶è°ç¨çµåé®ä»¶ç¨åºçæ¹å¼ååæ°"
++
++#: rc.c:146
++msgid "External browser"
++msgstr "å¤é¨æµè§å¨"
++
++#: rc.c:147
++msgid "2nd external browser"
++msgstr "第äºå¤é¨æµè§å¨"
++
++#: rc.c:148
++msgid "3rd external browser"
++msgstr "第ä¸å¤é¨æµè§å¨"
++
++#: rc.c:149
++msgid "4th external browser"
++msgstr "第åå¤é¨æµè§å¨"
++
++#: rc.c:150
++msgid "5th external browser"
++msgstr "第äºå¤é¨æµè§å¨"
++
++#: rc.c:151
++msgid "6th external browser"
++msgstr "第å
å¤é¨æµè§å¨"
++
++#: rc.c:152
++msgid "7th external browser"
++msgstr "第ä¸å¤é¨æµè§å¨"
++
++#: rc.c:153
++msgid "8th external browser"
++msgstr "第å
«å¤é¨æµè§å¨"
++
++#: rc.c:154
++msgid "9th external browser"
++msgstr "第ä¹å¤é¨æµè§å¨"
++
++#: rc.c:155
++msgid "Disable secret file security check"
++msgstr "å
³éç§å¯æ件å®å
¨æ£æ¥"
++
++#: rc.c:156
++msgid "Password file"
++msgstr "å¯ç æ件"
++
++#: rc.c:157
++msgid "File for setting form on loading"
++msgstr "设置çªå£å è½½æ¶çæ件"
++
++#: rc.c:158
++msgid "File for preferences for each site"
++msgstr "å个ç«ç¹çé¦é项æ件"
++
++#: rc.c:159
++msgid "Password for anonymous FTP (your mail address)"
++msgstr "å¿åFTPå¯ç ï¼æ¨çé®ç®±å°åï¼"
++
++#: rc.c:160
++msgid "Generate domain part of password for FTP"
++msgstr "为 FTP çæå¯ç çåé¨å"
++
++#: rc.c:161
++msgid "User-Agent identification string"
++msgstr "User-Agent 串"
++
++#: rc.c:162
++msgid "Accept-Encoding header"
++msgstr "æ¥åçç¼ç (Accept-Encoding) æ¥å¤´"
++
++#: rc.c:163
++msgid "Accept header"
++msgstr "æ¥å (Accept) æ¥å¤´"
++
++#: rc.c:164
++msgid "Accept-Language header"
++msgstr "æ¥åçè¯è¨ (Accept-Language) æ¥å¤´"
++
++#: rc.c:165
++msgid "Treat URL-like strings as links in all pages"
++msgstr "å°ææ页é¢ä¸ç±»ä¼¼äº URL çå符串å½åé¾æ¥"
++
++#: rc.c:166
++msgid "Wrap search"
++msgstr "å
è£
æç´¢ç»æ"
++
++#: rc.c:167
++msgid "Display unseen objects (e.g. bgimage tag)"
++msgstr "æ¾ç¤ºçä¸å°ç对象 ï¼ä¾å¦ï¼bdimageæ ç¾ï¼"
++
++#: rc.c:168
++msgid "Uncompress compressed data automatically when downloading"
++msgstr "å¨ä¸è½½æ¶èªå¨è§£å被å缩çæ°æ®"
++
++#: rc.c:170
++msgid "Run external viewer in a separate session"
++msgstr "å¨å¦ä¸ä¸ªä¼è¯ä¸è¿è¡å¤é¨æ¥çå¨"
++
++#: rc.c:172
++msgid "Run external viewer in the background"
++msgstr "å¨åå°è¿è¡å¤é¨æ¥çå¨"
++
++#: rc.c:174
++msgid "Use external program for directory listing"
++msgstr "使ç¨å¤é¨ç¨åºååºç®å½"
++
++#: rc.c:175
++msgid "URL of directory listing command"
++msgstr "ç®å½å表å½ä»¤çç½å"
++
++#: rc.c:177
++msgid "Enable dictionary lookup through CGI"
++msgstr "å¯ç¨åºäº CGI çè¯å
¸æ¥è¯¢"
++
++#: rc.c:178
++msgid "URL of dictionary lookup command"
++msgstr "åå
¸æ¥æ¾å½ä»¤çç½å"
++
++#: rc.c:180
++msgid "Display link name for images lacking ALT"
++msgstr "å¯¹ç¼ºå° ALT çå¾çæ¾ç¤ºé¾æ¥å称"
++
++#: rc.c:181
++msgid "Index file for directories"
++msgstr "ç®å½çç´¢å¼æ件"
++
++#: rc.c:182
++msgid "Prepend http:// to URL automatically"
++msgstr "èªå¨å¨ URL åå å
¥ http://"
++
++#: rc.c:183
++msgid "Default value for open-URL command"
++msgstr "æå¼ç½åå½ä»¤çé»è®¤å¼"
++
++#: rc.c:184
++msgid "Decode Content-Transfer-Encoding when saving"
++msgstr "ä¿åæ¶å¯¹å
å®¹ä¼ è¾ç¼ç ä¿¡æ¯ (Content-Transfer-Encoding) è¿è¡è§£ç "
++
++#: rc.c:185
++msgid "Preserve timestamp when saving"
++msgstr "å¨ä¿åæ¶ä¿çæ¶é´æ³"
++
++#: rc.c:187
++msgid "Enable mouse"
++msgstr "å¯ç¨é¼ æ "
++
++#: rc.c:188
++msgid "Scroll in reverse direction of mouse drag"
++msgstr "åé¼ æ æå¨çåæ¹åæ»å¨"
++
++#: rc.c:189
++msgid "Behavior of wheel scroll speed"
++msgstr "æ»è½®æ»å¨é度è¡ä¸º"
++
++#: rc.c:190
++msgid "(A only)Scroll by # (%) of screen"
++msgstr "(ä»
A) æ¯æ¬¡æ»å¨ # (%) çå±å¹é«åº¦"
++
++#: rc.c:191
++msgid "(B only)Scroll by # lines"
++msgstr "(ä»
B) æ¯æ¬¡æ»å¨ # è¡"
++
++#: rc.c:193
++msgid "Free memory of undisplayed buffers"
++msgstr "éæ¾æªæ¾ç¤ºç¼åçåå¨"
++
++#: rc.c:194
++msgid "Suppress `Referer:' header"
++msgstr "ç¦æ¢ 'Referer:' æ件头"
++
++#: rc.c:195
++msgid "Search case-insensitively"
++msgstr "æç´¢ä¸åºå大å°å"
++
++#: rc.c:196
++msgid "Use LESSOPEN"
++msgstr "ä½¿ç¨ LESSOPEN"
++
++#: rc.c:199
++msgid "Perform SSL server verification"
++msgstr "è¿è¡ SSL æå¡å¨æ£æ¥"
++
++#: rc.c:200
++msgid "PEM encoded certificate file of client"
++msgstr "客æ·ç«¯ç PEM ç¼ç è¯ä¹¦æ件"
++
++#: rc.c:201
++msgid "PEM encoded private key file of client"
++msgstr "客æ·ç«¯ç PEM ç¼ç ç§é¥æ件"
++
++#: rc.c:202
++msgid "Path to directory for PEM encoded certificates of CAs"
++msgstr "PEM ç¼ç CA è¯ä¹¦ç®å½çè·¯å¾"
++
++#: rc.c:203
++msgid "File consisting of PEM encoded certificates of CAs"
++msgstr "å
å« PEM ç¼ç CA è¯ä¹¦çæ件"
++
++#: rc.c:205
++msgid "List of forbidden SSL methods (2: SSLv2, 3: SSLv3, t:TLSv1)"
++msgstr "被ç¦æ¢ç SSL æ¹å¼å表 (2: SSLv2, 3: SSLv3, t:TLSv1)"
++
++#: rc.c:208
++msgid "Enable cookie processing"
++msgstr "å¼å¯ Cookie å¤ç"
++
++#: rc.c:209
++msgid "Print a message when receiving a cookie"
++msgstr "å¨æ¥æ¶ä¸ä¸ª Cookie æ¶æ¾ç¤ºä¸ä¸ªæ¶æ¯"
++
++#: rc.c:210
++msgid "Accept cookies"
++msgstr "æ¥å Cookies"
++
++#: rc.c:211
++msgid "Action to be taken on invalid cookie"
++msgstr "对æ æ Cookies è¿è¡çæä½"
++
++#: rc.c:212
++msgid "Domains to reject cookies from"
++msgstr "æç»å¦ä¸åç Cookies"
++
++#: rc.c:213
++msgid "Domains to accept cookies from"
++msgstr "æ¥åå¦ä¸åç Cookies"
++
++#: rc.c:214
++msgid "Domains to avoid [wrong number of dots]"
++msgstr "é¿å
访é®çå [é误çç¹æ°]"
++
++#: rc.c:216
++msgid "Number of redirections to follow"
++msgstr "è·éçéå®åæ°é"
++
++#: rc.c:217
++msgid "Enable processing of meta-refresh tag"
++msgstr "å¼å¯ meta-refresh æ ç¾å¤ç"
++
++#: rc.c:220
++msgid "Enable Migemo (Roma-ji search)"
++msgstr "å¼å¯ Migemo (ç½é©¬åæç´¢)"
++
++#: rc.c:221
++msgid "Migemo command"
++msgstr "Migemo å½ä»¤"
++
++#: rc.c:225
++msgid "Display charset"
++msgstr "æ¾ç¤ºå符é"
++
++#: rc.c:226
++msgid "Default document charset"
++msgstr "é»è®¤ææ¡£å符é"
++
++#: rc.c:227
++msgid "Automatic charset detect when loading"
++msgstr "å¨è½½å
¥æ¶è¿è¡èªå¨å符éæ¢æµ"
++
++#: rc.c:228
++msgid "System charset"
++msgstr "ç³»ç»å符é"
++
++#: rc.c:229
++msgid "System charset follows locale(LC_CTYPE)"
++msgstr "æ ¹æ®ç³»ç»è®¾ç½® (LC_CTYPE) éå®ç³»ç»å符é"
++
++#: rc.c:230
++msgid "Output halfdump with display charset"
++msgstr "使ç¨æ¾ç¤ºå符éè¾åº halfdump"
++
++#: rc.c:231
++msgid "Use multi column characters"
++msgstr "使ç¨å¤åå符"
++
++#: rc.c:232
++msgid "Use combining characters"
++msgstr "使ç¨å并å符"
++
++#: rc.c:233
++msgid "Use double width for some Unicode characters"
++msgstr "使 Unicode å符使ç¨åé宽度"
++
++#: rc.c:234
++msgid "Use Unicode language tags"
++msgstr "ä½¿ç¨ Unicode è¯è¨æ ç¾"
++
++#: rc.c:235
++msgid "Charset conversion using Unicode map"
++msgstr "ä½¿ç¨ Unicode æ å°è¿è¡å符é转æ¢"
++
++#: rc.c:236
++msgid "Charset conversion when loading"
++msgstr "å¨è½½å
¥æ¶è¿è¡å符é转æ¢"
++
++#: rc.c:237
++msgid "Adjust search string for document charset"
++msgstr "è°æ´ææ¡£å符éçæç´¢å串"
++
++#: rc.c:238
++msgid "Fix character width when conversion"
++msgstr "å¨è½¬æ¢æ¶åºå®å符宽度"
++
++#: rc.c:239
++msgid "Use GB 12345 Unicode map instead of GB 2312's"
++msgstr "ä½¿ç¨ GB 12345 Unicode æ å°èé GB 2312"
++
++#: rc.c:240
++msgid "Use JIS X 0201 Roman for ISO-2022-JP"
++msgstr "ä½¿ç¨ JIS X 0201 ç½é©¬åæ¯äº ISO-2022-JP"
++
++#: rc.c:241
++msgid "Use JIS C 6226:1978 for ISO-2022-JP"
++msgstr "ä½¿ç¨ JIS C 6226:1978 äº ISO-2022-JP"
++
++#: rc.c:242
++msgid "Use JIS X 0201 Katakana"
++msgstr "ä½¿ç¨ JIS X 0201 çåå"
++
++#: rc.c:243
++msgid "Use JIS X 0212:1990 (Supplemental Kanji)"
++msgstr "ä½¿ç¨ JIS X 0212:1990 (è¡¥å
æ±å)"
++
++#: rc.c:244
++msgid "Use JIS X 0213:2000 (2000JIS)"
++msgstr "ä½¿ç¨ JIS X 0213:2000 (2000JIS)"
++
++#: rc.c:245
++msgid "Strict ISO-2022-JP/KR/CN"
++msgstr "ä¸¥æ ¼ ISO-2022-JP/KR/CN"
++
++#: rc.c:246
++msgid "Treat 4 bytes char. of GB18030 as Unicode"
++msgstr "è§ GB18030 ç¼ç ç 4 åèå符为 Unicode"
++
++#: rc.c:247
++msgid "Simple Preserve space"
++msgstr "ç®åçä¿ç空é´"
++
++#: rc.c:250
++msgid "keymap file"
++msgstr "é®çæ å°æ件"
++
++#: rc.c:267
++msgid "black"
++msgstr "é»è²"
++
++#: rc.c:268
++msgid "red"
++msgstr "红è²"
++
++#: rc.c:269
++msgid "green"
++msgstr "绿è²"
++
++#: rc.c:270
++msgid "yellow"
++msgstr "é»è²"
++
++#: rc.c:271
++msgid "blue"
++msgstr "èè²"
++
++#: rc.c:272
++msgid "magenta"
++msgstr "å红"
++
++#: rc.c:273
++msgid "cyan"
++msgstr "éè²"
++
++#: rc.c:274
++msgid "white"
++msgstr "ç½è²"
++
++#: rc.c:275
++msgid "terminal"
++msgstr "ç»ç«¯"
++
++#: rc.c:294
++msgid "none"
++msgstr "æ "
++
++#: rc.c:295
++msgid "current URL"
++msgstr "å½å URL"
++
++#: rc.c:296
++msgid "link URL"
++msgstr "é¾æ¥ URL"
++
++#: rc.c:301
++msgid "simple"
++msgstr "ç®å"
++
++#: rc.c:302
++msgid "use tag"
++msgstr "使ç¨æ ç¾"
++
++#: rc.c:303
++msgid "fontify"
++msgstr ""
++
++#: rc.c:309
++msgid "A:relative to screen height"
++msgstr "A:ç¸å¯¹äºå±å¹é«åº¦"
++
++#: rc.c:310
++msgid "B:fixed speed"
++msgstr "B:åºå®é度"
++
++#: rc.c:317
++msgid "unspecified"
++msgstr "æªæå®"
++
++#: rc.c:318
++msgid "inet inet6"
++msgstr ""
++
++#: rc.c:319
++msgid "inet6 inet"
++msgstr ""
++
++#: rc.c:320
++msgid "inet only"
++msgstr "ä»
inet"
++
++#: rc.c:321
++msgid "inet6 only"
++msgstr "ä»
inet6"
++
++#: rc.c:328
++msgid "discard"
++msgstr "丢å¼"
++
++#: rc.c:330
++msgid "accept"
++msgstr "æ¥å"
++
++#: rc.c:332
++msgid "ask"
++msgstr "询é®"
++
++#: rc.c:339
++msgid "use internal mailer instead"
++msgstr "使ç¨å
建é®ä»¶åéå¨"
++
++#: rc.c:341
++msgid "ignore options and use only the address"
++msgstr "忽ç¥é项èåªä½¿ç¨å°å"
++
++#: rc.c:342
++msgid "use full mailto URL"
++msgstr "使ç¨æ´ä¸ª mailto URL"
++
++#: rc.c:351
++msgid "OFF"
++msgstr "å
³"
++
++#: rc.c:352
++msgid "Only ISO 2022"
++msgstr "ä»
ISO 2022"
++
++#: rc.c:353
++msgid "ON"
++msgstr "å¼"
++
++#: rc.c:359
++msgid "ASCII"
++msgstr "ASCII"
++
++#: rc.c:360
++msgid "charset specific"
++msgstr "å符éç¹å®"
++
++#: rc.c:361
++msgid "DEC special graphics"
++msgstr "DEC ç¹æ®å¾å"
++
++#: rc.c:740
++msgid "Display Settings"
++msgstr "æ¾ç¤ºè®¾ç½®"
++
++#: rc.c:742
++msgid "Color Settings"
++msgstr "é¢è²è®¾ç½®"
++
++#: rc.c:744
++msgid "Miscellaneous Settings"
++msgstr "æ项设置"
++
++#: rc.c:745
++msgid "Directory Settings"
++msgstr "ç®å½è®¾ç½®"
++
++#: rc.c:746
++msgid "External Program Settings"
++msgstr "å¤é¨ç¨åºè®¾ç½®"
++
++#: rc.c:747
++msgid "Network Settings"
++msgstr "ç½ç»è®¾ç½®"
++
++#: rc.c:748
++msgid "Proxy Settings"
++msgstr "代ç设置"
++
++#: rc.c:750
++msgid "SSL Settings"
++msgstr "SSL 设置"
++
++#: rc.c:753
++msgid "Cookie Settings"
++msgstr "Cookie 设置"
++
++#: rc.c:756
++msgid "Charset Settings"
++msgstr "å符é设置"
++
++#. TRANSLATORS:
++#. * AcceptLang default: this is used in Accept-Language: HTTP request
++#. * header. For example, ja.po should translate it as
++#. * "ja;q=1.0, en;q=0.5" like that.
++#.
++#: rc.c:1238
++msgid "en;q=1.0"
++msgstr "zh-CN;q=1.0, zh-Hans;q=0.9, zh;q=0.8, en;q=0.6"
+diff --git a/po/zh_TW.po b/po/zh_TW.po
+new file mode 100644
+index 0000000..954a4d2
+--- /dev/null
++++ b/po/zh_TW.po
+@@ -0,0 +1,916 @@
++# zh_TW translation for w3m, machine converted
++# Copyright (C) YEAR THE w3m'S COPYRIGHT HOLDER
++# This file is distributed under the same license as the w3m package.
++# Junde Yi <lmy441900@gmail.com>, 2014.
++# Mingcong Bai <jeffbai@aosc.xyz>, 2014.
++# liushuyu <liushuyu_011@126.com>, 2014.
++# Xingda Zheng <icenowy@outlook.com>, 2014.
++# Mingye Wang (Arthur2e5) <arthur200126@gmail.com>, 2014, 2015.
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: w3m 0.5.3\n"
++"Report-Msgid-Bugs-To: satodai@w3m.jp\n"
++"POT-Creation-Date: 2016-03-14 19:47+0900\n"
++"PO-Revision-Date: 2016-03-14 19:51+0900\n"
++"Last-Translator: Tatsuya Kinoshita <tats@debian.org>\n"
++"Language-Team: AOSC zh_TW fuzzy <aosc@members.fsf.org>\n"
++"Language: zh_TW\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Poedit 1.8.6\n"
++"Plural-Forms: nplurals=1; plural=0;\n"
++
++#: menu.c:269
++msgid " Back (b) "
++msgstr " å¾é (b) "
++
++#: menu.c:270
++msgid " Select Buffer(s) "
++msgstr " é¸æç·©è¡å "
++
++#: menu.c:272
++msgid " Select Tab (t) "
++msgstr " é¸ææ¨ç±¤ (t) "
++
++#: menu.c:274
++msgid " View Source (v) "
++msgstr " 檢è¦æºç¢¼ (v) "
++
++#: menu.c:275
++msgid " Edit Source (e) "
++msgstr " ä¿®æ¹æºç¢¼ (e) "
++
++#: menu.c:276
++msgid " Save Source (S) "
++msgstr " å²åæºç¢¼ (S) "
++
++#: menu.c:277
++msgid " Reload (r) "
++msgstr " éæ°è¼å
¥ (r) "
++
++#: menu.c:278 menu.c:285 menu.c:289
++msgid " ---------------- "
++msgstr " ---------------- "
++
++#: menu.c:279
++msgid " Go Link (a) "
++msgstr " è½å°é£çµ (a) "
++
++#: menu.c:280
++msgid " on New Tab (n) "
++msgstr " å¨æ°æ¨ç±¤ (n) "
++
++#: menu.c:281
++msgid " Save Link (A) "
++msgstr " å²åé£çµ (A) "
++
++#: menu.c:282
++msgid " View Image (i) "
++msgstr " 檢è¦åç (i) "
++
++#: menu.c:283
++msgid " Save Image (I) "
++msgstr " å²ååç (I) "
++
++#: menu.c:284
++msgid " View Frame (f) "
++msgstr " 檢è¦æ¡æ¶ (f) "
++
++#: menu.c:286
++msgid " Bookmark (B) "
++msgstr " æ¸ç±¤ (B) "
++
++#: menu.c:287
++msgid " Help (h) "
++msgstr " å¹«å© (h) "
++
++#: menu.c:288
++msgid " Option (o) "
++msgstr " é¸é
(o) "
++
++#: menu.c:290
++msgid " Quit (q) "
++msgstr " éåº (q) "
++
++#: rc.c:62
++msgid "External Viewer Setup"
++msgstr "å¤é¨æª¢è¦å¨è¨å®"
++
++#: rc.c:63
++msgid "Tab width in characters"
++msgstr "æåä¸ç TAB 寬度"
++
++#: rc.c:64
++msgid "Indent for HTML rendering"
++msgstr "ç¨æ¼ HTML 渲æ"
++
++#: rc.c:65
++msgid "Number of pixels per character (4.0...32.0)"
++msgstr "æ¯åå大å°çç«ç´ å¼ (4.0...32.0)"
++
++#: rc.c:66
++msgid "Number of pixels per line (4.0...64.0)"
++msgstr "æ¯è¡çç«ç´ æ¸ (4.0...64.0)"
++
++#: rc.c:67
++msgid "Number of remembered lines when used as a pager"
++msgstr "ç¶ä½çºåé å¨ä½¿ç¨æè¨æ¶çè¡æ¸"
++
++#: rc.c:68
++msgid "Use URL history"
++msgstr "ä½¿ç¨ URL æ·å²è¨é"
++
++#: rc.c:69
++msgid "Number of remembered URL"
++msgstr "è¨éç URL æ¸é"
++
++#: rc.c:70
++msgid "Save URL history"
++msgstr "å²å URL æ·å²"
++
++#: rc.c:71
++msgid "Render frames automatically"
++msgstr "èªå渲ææ¡æ¶"
++
++#: rc.c:72
++msgid "Treat argument without scheme as URL"
++msgstr "å°ç¡æ ¼å¼çåæ¸çä½ URL"
++
++#: rc.c:73
++msgid "Use _self as default target"
++msgstr "å°èªèº«ä½çºé è¨ç®æ¨ (_S)"
++
++#: rc.c:74
++msgid "Open link on new tab if target is _blank or _new"
++msgstr "å¦æç®æ¨çºç©º (_b) ææ°å»º (_n) å¨æ°æ¨ç±¤éåé é¢"
++
++#: rc.c:75
++msgid "Open download list panel on new tab"
++msgstr "éåä¸è¼å表é¢æ¿æ¼æ°æ¨ç±¤"
++
++#: rc.c:76
++msgid "Display link URL automatically"
++msgstr "èªå顯示é£çµ URL"
++
++#: rc.c:77
++msgid "Display link numbers"
++msgstr "顯示é£çµç·¨è"
++
++#: rc.c:78
++msgid "Display decoded URL"
++msgstr "顯示解碼å¾ç URL"
++
++#: rc.c:79
++msgid "Display current line number"
++msgstr "顯示ç¶åè¡æ¸"
++
++#: rc.c:80
++msgid "Display inline images"
++msgstr "顯示å
§è¯å½±è±¡"
++
++#: rc.c:81
++msgid "Display pseudo-ALTs for inline images with no ALT or TITLE string"
++msgstr "çºä¸å¸¶æ ALT æ TITLE å串çå
§è¯å½±è±¡é¡¯ç¤ºå½ ALT"
++
++#: rc.c:83
++msgid "Load inline images automatically"
++msgstr "èªåè¼å
¥è¡å
§å½±è±¡"
++
++#: rc.c:84
++msgid "Maximum processes for parallel image loading"
++msgstr "å¤å·è¡ç·å½±è±¡è¼å
¥çæ大ç¨åºæ¸"
++
++#: rc.c:85
++msgid "Use external image viewer"
++msgstr "使ç¨å¤é¨åç檢è¦å¨"
++
++#: rc.c:86
++msgid "Scale of image (%)"
++msgstr "影象æ¯ä¾å°º (%)"
++
++#: rc.c:87
++msgid "External command to display image"
++msgstr "ç¨æ¼é¡¯ç¤ºå½±è±¡çå¤é¨å½ä»¤"
++
++#: rc.c:88
++msgid "Use link list of image map"
++msgstr "使ç¨å½±è±¡å°æ çé£çµå表"
++
++#: rc.c:90
++msgid "Display file names in multi-column format"
++msgstr "以å¤åæ ¼å¼é¡¯ç¤ºæªå"
++
++#: rc.c:91
++msgid "Use ASCII equivalents to display entities"
++msgstr "使ç¨å°æç ASCII 編碼ä¾é¡¯ç¤ºå¯¦é« "
++
++#: rc.c:92
++msgid "Character type for border of table and menu"
++msgstr "è¡¨æ ¼åé¸å®éæ¡çåå
é¡å"
++
++#: rc.c:93
++msgid "Display table borders, ignore value of BORDER"
++msgstr "顯示é¶æ ¼éæ¡ï¼å¿½ç¥ BORDER æ¸å¼"
++
++#: rc.c:94
++msgid "Fold lines in TEXTAREA"
++msgstr "å¨æåå (TEXTAREA) ä¸æºçè¡"
++
++#: rc.c:95
++msgid "Display INS, DEL, S and STRIKE element"
++msgstr "顯示 INS, DEL, S å STRIKE å
ç´ "
++
++#: rc.c:96
++msgid "Display with color"
++msgstr "使ç¨å¸¶é¡è²ç顯示"
++
++#: rc.c:97
++msgid "Color of normal character"
++msgstr "ä¸è¬æåé¡è²"
++
++#: rc.c:98
++msgid "Color of anchor"
++msgstr "é£çµæåé¡è²"
++
++#: rc.c:99
++msgid "Color of image link"
++msgstr "åçé£çµé¡è²"
++
++#: rc.c:100
++msgid "Color of form"
++msgstr "è¡¨æ ¼é¡è²"
++
++#: rc.c:101
++msgid "Enable coloring of active link"
++msgstr "çºæ´»åé£çµéåä¸è²"
++
++#: rc.c:102
++msgid "Color of currently active link"
++msgstr "ç¶åæ´»åé£çµçé¡è²"
++
++#: rc.c:103
++msgid "Use visited link color"
++msgstr "çºè¨ªåéçé£çµä¸è²"
++
++#: rc.c:104
++msgid "Color of visited link"
++msgstr "已訪åé£çµé¡è²"
++
++#: rc.c:105
++msgid "Color of background"
++msgstr "èæ¯è²"
++
++#: rc.c:106
++msgid "Color of mark"
++msgstr "æ¨è¨é¡è²"
++
++#: rc.c:107
++msgid "Use proxy"
++msgstr "使ç¨ä»£ç伺æå¨"
++
++#: rc.c:108
++msgid "URL of HTTP proxy host"
++msgstr "HTTP 代ç主æ©å°å"
++
++#: rc.c:110
++msgid "URL of HTTPS proxy host"
++msgstr "HTTPS 代ç主æ©å°å"
++
++#: rc.c:113
++msgid "URL of GOPHER proxy host"
++msgstr "GOPHER 代ç主æ©å°å"
++
++#: rc.c:115
++msgid "URL of FTP proxy host"
++msgstr "FTP 代ç主æ©å°å"
++
++#: rc.c:116
++msgid "Domains to be accessed directly (no proxy)"
++msgstr "ç´æ¥è¨ªåèä¸æ¯ç¨ä»£ç伺æå¨è¨ªåç URL"
++
++#: rc.c:117
++msgid "Check noproxy by network address"
++msgstr "æ ¹æ網路å°åæª¢æ¥ noproxy"
++
++#: rc.c:118
++msgid "Disable cache"
++msgstr "ç¦ç¨å¿«å"
++
++#: rc.c:120
++msgid "News server"
++msgstr "æ°è伺æå¨"
++
++#: rc.c:121
++msgid "Mode of news server"
++msgstr "æ°è伺æå¨æ¨¡å¼"
++
++#: rc.c:122
++msgid "Number of news messages"
++msgstr "æ°èè¨æ¯çæ¸é"
++
++#: rc.c:124
++msgid "Order of name resolution"
++msgstr "å稱解æé åº"
++
++#: rc.c:125
++msgid "Directory corresponding to / (document root)"
++msgstr "å°æ / çç®é (æä»¶æ ¹ç®é)"
++
++#: rc.c:126
++msgid "Directory corresponding to /~user"
++msgstr "å°æ /~user çç®é"
++
++#: rc.c:127
++msgid "Directory corresponding to /cgi-bin"
++msgstr "å°æ /cgi-bin çç®é"
++
++#: rc.c:128
++msgid "Confirm when quitting with q"
++msgstr "ä½¿ç¨ q éµéåºæè«æ±ç¢ºèª"
++
++#: rc.c:129
++msgid "Close tab if buffer is last when back"
++msgstr "å¨è¿åæç·©è¡åéæ¯ä»¥åçæ
å°±ééæ¨ç±¤é "
++
++#: rc.c:131
++msgid "Enable mark operations"
++msgstr "åç¨æ¨è¨æä½"
++
++#: rc.c:133
++msgid "Enable Emacs-style line editing"
++msgstr "åç¨ Emacs é¢¨æ ¼çè¡ç·¨è¼¯"
++
++#: rc.c:134
++msgid "Enable vi-like numeric prefix"
++msgstr "åå vi å¼çæ¸åè·³è½"
++
++#: rc.c:135
++msgid "Move cursor to top line when going to label"
++msgstr "ç¶ç§»åå°æ¨ç±¤æå°æ¸¸æ¨ç§»å°æé è¡"
++
++#: rc.c:136
++msgid "Move cursor to top line when moving to next page"
++msgstr "ç¶è½å°ä¸ä¸é æå°æ¸¸æ¨ç§»å°æé è¡"
++
++#: rc.c:137
++msgid "Fold lines of plain text file"
++msgstr "å°ç´æåæªæ¡å¯¦è¡è¡æºç"
++
++#: rc.c:138
++msgid "Show line numbers"
++msgstr "顯示è¡è"
++
++#: rc.c:139
++msgid "Show search string"
++msgstr "顯示æå°åå
串"
++
++#: rc.c:140
++msgid "List of mime.types files"
++msgstr "mime.type æªæ¡å表"
++
++#: rc.c:141
++msgid "List of mailcap files"
++msgstr "mailcap æªæ¡å表"
++
++#: rc.c:142
++msgid "List of urimethodmap files"
++msgstr "urlmethodmap æªæ¡å表"
++
++#: rc.c:143
++msgid "Editor"
++msgstr "編輯å¨"
++
++#: rc.c:144
++msgid "Mailer"
++msgstr "å³éè
"
++
++#: rc.c:145
++msgid "How to call Mailer for mailto URLs with options"
++msgstr "åå mailto å°åæå¼å«é»åéµä»¶ç¨å¼çæ¹å¼ååæ¸"
++
++#: rc.c:146
++msgid "External browser"
++msgstr "å¤é¨ç覽å¨"
++
++#: rc.c:147
++msgid "2nd external browser"
++msgstr "第äºå¤é¨ç覽å¨"
++
++#: rc.c:148
++msgid "3rd external browser"
++msgstr "第ä¸å¤é¨ç覽å¨"
++
++#: rc.c:149
++msgid "4th external browser"
++msgstr "第åå¤é¨ç覽å¨"
++
++#: rc.c:150
++msgid "5th external browser"
++msgstr "第äºå¤é¨ç覽å¨"
++
++#: rc.c:151
++msgid "6th external browser"
++msgstr "第å
å¤é¨ç覽å¨"
++
++#: rc.c:152
++msgid "7th external browser"
++msgstr "第ä¸å¤é¨ç覽å¨"
++
++#: rc.c:153
++msgid "8th external browser"
++msgstr "第å
«å¤é¨ç覽å¨"
++
++#: rc.c:154
++msgid "9th external browser"
++msgstr "第ä¹å¤é¨ç覽å¨"
++
++#: rc.c:155
++msgid "Disable secret file security check"
++msgstr "ééç¥å¯æªæ¡å®å
¨æª¢æ¥"
++
++#: rc.c:156
++msgid "Password file"
++msgstr "å¯ç¢¼æªæ¡"
++
++#: rc.c:157
++msgid "File for setting form on loading"
++msgstr "è¨å®è¦çªè¼å
¥æçæªæ¡"
++
++#: rc.c:158
++msgid "File for preferences for each site"
++msgstr "ååç«é»çé¦é¸é
æªæ¡"
++
++#: rc.c:159
++msgid "Password for anonymous FTP (your mail address)"
++msgstr "å¿åFTPå¯ç¢¼ï¼æ¨çéµç®±å°åï¼"
++
++#: rc.c:160
++msgid "Generate domain part of password for FTP"
++msgstr "çº FTP çæå¯ç¢¼çåé¨å"
++
++#: rc.c:161
++msgid "User-Agent identification string"
++msgstr "User-Agent 串"
++
++#: rc.c:162
++msgid "Accept-Encoding header"
++msgstr "æ¥åç編碼 (Accept-Encoding) å ±é "
++
++#: rc.c:163
++msgid "Accept header"
++msgstr "æ¥å (Accept) å ±é "
++
++#: rc.c:164
++msgid "Accept-Language header"
++msgstr "æ¥åçèªè¨ (Accept-Language) å ±é "
++
++#: rc.c:165
++msgid "Treat URL-like strings as links in all pages"
++msgstr "å°ææé é¢ä¸é¡ä¼¼æ¼ URL çåå
串ç¶åé£çµ"
++
++#: rc.c:166
++msgid "Wrap search"
++msgstr "å
è£æå°çµæ"
++
++#: rc.c:167
++msgid "Display unseen objects (e.g. bgimage tag)"
++msgstr "顯示çä¸å°çç©ä»¶ ï¼ä¾å¦ï¼bdimageæ¨ç±¤ï¼"
++
++#: rc.c:168
++msgid "Uncompress compressed data automatically when downloading"
++msgstr "å¨ä¸è¼æèªå解å£è¢«å£ç¸®çè³æ"
++
++#: rc.c:170
++msgid "Run external viewer in a separate session"
++msgstr "å¨å¦ä¸åæ話ä¸å·è¡å¤é¨æª¢è¦å¨"
++
++#: rc.c:172
++msgid "Run external viewer in the background"
++msgstr "å¨å¾èºå·è¡å¤é¨æª¢è¦å¨"
++
++#: rc.c:174
++msgid "Use external program for directory listing"
++msgstr "使ç¨å¤é¨ç¨å¼ååºç®é"
++
++#: rc.c:175
++msgid "URL of directory listing command"
++msgstr "ç®éå表å½ä»¤ç網å"
++
++#: rc.c:177
++msgid "Enable dictionary lookup through CGI"
++msgstr "åç¨åºæ¼ CGI çè©å
¸æ¥è©¢"
++
++#: rc.c:178
++msgid "URL of dictionary lookup command"
++msgstr "åå
¸æ¥è©¢å½ä»¤ç網å"
++
++#: rc.c:180
++msgid "Display link name for images lacking ALT"
++msgstr "å°ç¼ºå° ALT çåç顯示é£çµå稱"
++
++#: rc.c:181
++msgid "Index file for directories"
++msgstr "ç®éçç´¢å¼æªæ¡"
++
++#: rc.c:182
++msgid "Prepend http:// to URL automatically"
++msgstr "èªåå¨ URL åå å
¥ http://"
++
++#: rc.c:183
++msgid "Default value for open-URL command"
++msgstr "éå網åå½ä»¤çé è¨å¼"
++
++#: rc.c:184
++msgid "Decode Content-Transfer-Encoding when saving"
++msgstr "å²åæå°å
§å®¹å³è¼¸ç·¨ç¢¼è³è¨ (Content-Transfer-Encoding) é²è¡è§£ç¢¼"
++
++#: rc.c:185
++msgid "Preserve timestamp when saving"
++msgstr "å¨å²åæä¿çæéæ³"
++
++#: rc.c:187
++msgid "Enable mouse"
++msgstr "åç¨æ»é¼ "
++
++#: rc.c:188
++msgid "Scroll in reverse direction of mouse drag"
++msgstr "åæ»é¼ æåçåæ¹å滾å"
++
++#: rc.c:189
++msgid "Behavior of wheel scroll speed"
++msgstr "滾輪滾åé度è¡çº"
++
++#: rc.c:190
++msgid "(A only)Scroll by # (%) of screen"
++msgstr "(å
A) æ¯æ¬¡æ»¾å # (%) çè¢å¹é«åº¦"
++
++#: rc.c:191
++msgid "(B only)Scroll by # lines"
++msgstr "(å
B) æ¯æ¬¡æ»¾å # è¡"
++
++#: rc.c:193
++msgid "Free memory of undisplayed buffers"
++msgstr "éæ¾æªé¡¯ç¤ºå¿«åçå²å"
++
++#: rc.c:194
++msgid "Suppress `Referer:' header"
++msgstr "ç¦æ¢ 'Referer:' æªæ¡é "
++
++#: rc.c:195
++msgid "Search case-insensitively"
++msgstr "æå°ä¸åå大å°å¯«"
++
++#: rc.c:196
++msgid "Use LESSOPEN"
++msgstr "ä½¿ç¨ LESSOPEN"
++
++#: rc.c:199
++msgid "Perform SSL server verification"
++msgstr "é²è¡ SSL 伺æå¨æª¢æ¥"
++
++#: rc.c:200
++msgid "PEM encoded certificate file of client"
++msgstr "客æ¶ç«¯ç PEM 編碼èæ¸æªæ¡"
++
++#: rc.c:201
++msgid "PEM encoded private key file of client"
++msgstr "客æ¶ç«¯ç PEM 編碼ç§é°æªæ¡"
++
++#: rc.c:202
++msgid "Path to directory for PEM encoded certificates of CAs"
++msgstr "PEM 編碼 CA èæ¸ç®éçè·¯å¾"
++
++#: rc.c:203
++msgid "File consisting of PEM encoded certificates of CAs"
++msgstr "å
å« PEM 編碼 CA èæ¸çæªæ¡"
++
++#: rc.c:205
++msgid "List of forbidden SSL methods (2: SSLv2, 3: SSLv3, t:TLSv1)"
++msgstr "被ç¦æ¢ç SSL æ¹å¼å表 (2: SSLv2, 3: SSLv3, t:TLSv1)"
++
++#: rc.c:208
++msgid "Enable cookie processing"
++msgstr "éå Cookie èç"
++
++#: rc.c:209
++msgid "Print a message when receiving a cookie"
++msgstr "å¨æ¥æ¶ä¸å Cookie æ顯示ä¸åè¨æ¯"
++
++#: rc.c:210
++msgid "Accept cookies"
++msgstr "æ¥å Cookies"
++
++#: rc.c:211
++msgid "Action to be taken on invalid cookie"
++msgstr "å°ç¡æ Cookies é²è¡çæä½"
++
++#: rc.c:212
++msgid "Domains to reject cookies from"
++msgstr "æçµå¦ä¸åç Cookies"
++
++#: rc.c:213
++msgid "Domains to accept cookies from"
++msgstr "æ¥åå¦ä¸åç Cookies"
++
++#: rc.c:214
++msgid "Domains to avoid [wrong number of dots]"
++msgstr "é¿å
訪åçå [é¯èª¤çé»æ¸]"
++
++#: rc.c:216
++msgid "Number of redirections to follow"
++msgstr "è·é¨çéå®åæ¸é"
++
++#: rc.c:217
++msgid "Enable processing of meta-refresh tag"
++msgstr "éå meta-refresh æ¨ç±¤èç"
++
++#: rc.c:220
++msgid "Enable Migemo (Roma-ji search)"
++msgstr "éå Migemo (ç¾
馬åæå°)"
++
++#: rc.c:221
++msgid "Migemo command"
++msgstr "Migemo å½ä»¤"
++
++#: rc.c:225
++msgid "Display charset"
++msgstr "顯示å符é"
++
++#: rc.c:226
++msgid "Default document charset"
++msgstr "é è¨æ件å符é"
++
++#: rc.c:227
++msgid "Automatic charset detect when loading"
++msgstr "å¨è¼å
¥æé²è¡èªåå符éæ¢æ¸¬"
++
++#: rc.c:228
++msgid "System charset"
++msgstr "系統å符é"
++
++#: rc.c:229
++msgid "System charset follows locale(LC_CTYPE)"
++msgstr "æ ¹æ系統è¨å® (LC_CTYPE) é¸å®ç³»çµ±å符é"
++
++#: rc.c:230
++msgid "Output halfdump with display charset"
++msgstr "使ç¨é¡¯ç¤ºå符éè¼¸åº halfdump"
++
++#: rc.c:231
++msgid "Use multi column characters"
++msgstr "使ç¨å¤ååå
"
++
++#: rc.c:232
++msgid "Use combining characters"
++msgstr "使ç¨åä½µåå
"
++
++#: rc.c:233
++msgid "Use double width for some Unicode characters"
++msgstr "使 Unicode åå
使ç¨éé寬度"
++
++#: rc.c:234
++msgid "Use Unicode language tags"
++msgstr "ä½¿ç¨ Unicode èªè¨æ¨ç±¤"
++
++#: rc.c:235
++msgid "Charset conversion using Unicode map"
++msgstr "ä½¿ç¨ Unicode å°æ é²è¡å符éè½æ"
++
++#: rc.c:236
++msgid "Charset conversion when loading"
++msgstr "å¨è¼å
¥æé²è¡å符éè½æ"
++
++#: rc.c:237
++msgid "Adjust search string for document charset"
++msgstr "調æ´æ件å符éçæå°å串"
++
++#: rc.c:238
++msgid "Fix character width when conversion"
++msgstr "å¨è½ææåºå®åå
寬度"
++
++#: rc.c:239
++msgid "Use GB 12345 Unicode map instead of GB 2312's"
++msgstr "ä½¿ç¨ GB 12345 Unicode å°æ èé GB 2312"
++
++#: rc.c:240
++msgid "Use JIS X 0201 Roman for ISO-2022-JP"
++msgstr "ä½¿ç¨ JIS X 0201 ç¾
馬åæ¯æ¼ ISO-2022-JP"
++
++#: rc.c:241
++msgid "Use JIS C 6226:1978 for ISO-2022-JP"
++msgstr "ä½¿ç¨ JIS C 6226:1978 æ¼ ISO-2022-JP"
++
++#: rc.c:242
++msgid "Use JIS X 0201 Katakana"
++msgstr "ä½¿ç¨ JIS X 0201 çåå"
++
++#: rc.c:243
++msgid "Use JIS X 0212:1990 (Supplemental Kanji)"
++msgstr "ä½¿ç¨ JIS X 0212:1990 (è£å
æ¼¢å)"
++
++#: rc.c:244
++msgid "Use JIS X 0213:2000 (2000JIS)"
++msgstr "ä½¿ç¨ JIS X 0213:2000 (2000JIS)"
++
++#: rc.c:245
++msgid "Strict ISO-2022-JP/KR/CN"
++msgstr "å´æ ¼ ISO-2022-JP/KR/CN"
++
++#: rc.c:246
++msgid "Treat 4 bytes char. of GB18030 as Unicode"
++msgstr "è¦ GB18030 編碼ç 4 ä½å
çµåå
çº Unicode"
++
++#: rc.c:247
++msgid "Simple Preserve space"
++msgstr "ç°¡å®çä¿ç空é"
++
++#: rc.c:250
++msgid "keymap file"
++msgstr "éµç¤å°æ æªæ¡"
++
++#: rc.c:267
++msgid "black"
++msgstr "é»è²"
++
++#: rc.c:268
++msgid "red"
++msgstr "ç´
è²"
++
++#: rc.c:269
++msgid "green"
++msgstr "ç¶ è²"
++
++#: rc.c:270
++msgid "yellow"
++msgstr "é»è²"
++
++#: rc.c:271
++msgid "blue"
++msgstr "èè²"
++
++#: rc.c:272
++msgid "magenta"
++msgstr "åç´
"
++
++#: rc.c:273
++msgid "cyan"
++msgstr "éè²"
++
++#: rc.c:274
++msgid "white"
++msgstr "ç½è²"
++
++#: rc.c:275
++msgid "terminal"
++msgstr "çµç«¯"
++
++#: rc.c:294
++msgid "none"
++msgstr "ç¡"
++
++#: rc.c:295
++msgid "current URL"
++msgstr "ç¶å URL"
++
++#: rc.c:296
++msgid "link URL"
++msgstr "é£çµ URL"
++
++#: rc.c:301
++msgid "simple"
++msgstr "ç°¡å®"
++
++#: rc.c:302
++msgid "use tag"
++msgstr "使ç¨æ¨ç±¤"
++
++#: rc.c:303
++msgid "fontify"
++msgstr ""
++
++#: rc.c:309
++msgid "A:relative to screen height"
++msgstr "A:ç¸å°æ¼è¢å¹é«åº¦"
++
++#: rc.c:310
++msgid "B:fixed speed"
++msgstr "B:åºå®é度"
++
++#: rc.c:317
++msgid "unspecified"
++msgstr "æªæå®"
++
++#: rc.c:318
++msgid "inet inet6"
++msgstr ""
++
++#: rc.c:319
++msgid "inet6 inet"
++msgstr ""
++
++#: rc.c:320
++msgid "inet only"
++msgstr "å
inet"
++
++#: rc.c:321
++msgid "inet6 only"
++msgstr "å
inet6"
++
++#: rc.c:328
++msgid "discard"
++msgstr "ä¸æ£"
++
++#: rc.c:330
++msgid "accept"
++msgstr "æ¥å"
++
++#: rc.c:332
++msgid "ask"
++msgstr "è©¢å"
++
++#: rc.c:339
++msgid "use internal mailer instead"
++msgstr "使ç¨å
§å»ºéµä»¶å³éå¨"
++
++#: rc.c:341
++msgid "ignore options and use only the address"
++msgstr "忽ç¥é¸é
èåªä½¿ç¨å°å"
++
++#: rc.c:342
++msgid "use full mailto URL"
++msgstr "使ç¨æ´å mailto URL"
++
++#: rc.c:351
++msgid "OFF"
++msgstr "é"
++
++#: rc.c:352
++msgid "Only ISO 2022"
++msgstr "å
ISO 2022"
++
++#: rc.c:353
++msgid "ON"
++msgstr "é"
++
++#: rc.c:359
++msgid "ASCII"
++msgstr "ASCII"
++
++#: rc.c:360
++msgid "charset specific"
++msgstr "å符éç¹å®"
++
++#: rc.c:361
++msgid "DEC special graphics"
++msgstr "DEC ç¹æ®å½±è±¡"
++
++#: rc.c:740
++msgid "Display Settings"
++msgstr "顯示è¨å®"
++
++#: rc.c:742
++msgid "Color Settings"
++msgstr "é¡è²è¨å®"
++
++#: rc.c:744
++msgid "Miscellaneous Settings"
++msgstr "éé
è¨å®"
++
++#: rc.c:745
++msgid "Directory Settings"
++msgstr "ç®éè¨å®"
++
++#: rc.c:746
++msgid "External Program Settings"
++msgstr "å¤é¨ç¨å¼è¨å®"
++
++#: rc.c:747
++msgid "Network Settings"
++msgstr "網路è¨å®"
++
++#: rc.c:748
++msgid "Proxy Settings"
++msgstr "代çè¨å®"
++
++#: rc.c:750
++msgid "SSL Settings"
++msgstr "SSL è¨å®"
++
++#: rc.c:753
++msgid "Cookie Settings"
++msgstr "Cookie è¨å®"
++
++#: rc.c:756
++msgid "Charset Settings"
++msgstr "å符éè¨å®"
++
++#. TRANSLATORS:
++#. * AcceptLang default: this is used in Accept-Language: HTTP request
++#. * header. For example, ja.po should translate it as
++#. * "ja;q=1.0, en;q=0.5" like that.
++#.
++#: rc.c:1238
++msgid "en;q=1.0"
++msgstr "zh-TW;q=1.0, zh-Hants;q=0.9, zh;q=0.8, en;q=0.6"
+diff --git a/proto.h b/proto.h
+index f8a7345..d744e14 100644
+--- a/proto.h
++++ b/proto.h
+@@ -11,6 +11,8 @@ extern void pushEvent(int cmd, void *data);
+ extern MySignalHandler intTrap(SIGNAL_ARG);
+ extern void pgFore(void);
+ extern void pgBack(void);
++extern void hpgFore(void);
++extern void hpgBack(void);
+ extern void lup1(void);
+ extern void ldown1(void);
+ extern void ctrCsrV(void);
+@@ -61,6 +63,7 @@ extern void submitForm(void);
+ extern void followForm(void);
+ extern void topA(void);
+ extern void lastA(void);
++extern void nthA(void);
+ extern void onA(void);
+
+ extern void nextA(void);
+@@ -162,6 +165,24 @@ extern Str searchURIMethods(ParsedURL *pu);
+ extern void chkExternalURIBuffer(Buffer *buf);
+ #endif
+ extern ParsedURL *schemeToProxy(int scheme);
++#ifdef USE_M17N
++extern wc_ces url_to_charset(const char *url, const ParsedURL *base,
++ wc_ces doc_charset);
++extern char *url_encode(const char *url, const ParsedURL *base,
++ wc_ces doc_charset);
++#if 0
++extern char *url_decode(const char *url, const ParsedURL *base,
++ wc_ces doc_charset);
++#endif
++extern char *url_decode2(const char *url, const Buffer *buf);
++#else /* !defined(USE_M17N) */
++#define url_encode(url, base, cs) url_quote(url)
++extern char *url_decode0(const char *url);
++#if 0
++#define url_decode(url, base, cs) url_decode0(url)
++#endif
++#define url_decode2(url, buf) url_decode0(url)
++#endif /* !defined(USE_M17N) */
+ extern void examineFile(char *path, URLFile *uf);
+ extern char *acceptableEncoding();
+ extern int dir_exist(char *path);
+@@ -180,7 +201,6 @@ extern void push_symbol(Str str, char symbol, int width, int n);
+ #ifdef USE_UNICODE
+ extern void update_utf8_symbol(void);
+ #endif
+-extern Buffer *loadFile(char *path);
+ extern Buffer *loadGeneralFile(char *path, ParsedURL *current, char *referer,
+ int flag, FormList *request);
+ extern int is_boundary(unsigned char *, unsigned char *);
+@@ -207,6 +227,8 @@ extern int getImageSize(ImageCache * cache);
+ extern Str process_img(struct parsed_tag *tag, int width);
+ extern Str process_anchor(struct parsed_tag *tag, char *tagbuf);
+ extern Str process_input(struct parsed_tag *tag);
++extern Str process_button(struct parsed_tag *tag);
++extern Str process_n_button(void);
+ extern Str process_select(struct parsed_tag *tag);
+ extern Str process_n_select(void);
+ extern void feed_select(char *str);
+@@ -249,8 +271,7 @@ extern Buffer *openPagerBuffer(InputStream stream, Buffer *buf);
+ extern Buffer *openGeneralPagerBuffer(InputStream stream);
+ extern Line *getNextPage(Buffer *buf, int plen);
+ extern int save2tmp(URLFile uf, char *tmpf);
+-extern int doExternal(URLFile uf, char *path, char *type, Buffer **bufp,
+- Buffer *defaultbuf);
++extern Buffer *doExternal(URLFile uf, char *type, Buffer *defaultbuf);
+ extern int _doFileCopy(char *tmpf, char *defstr, int download);
+ #define doFileCopy(tmpf, defstr) _doFileCopy(tmpf, defstr, FALSE);
+ extern int doFileMove(char *tmpf, char *defstr);
+@@ -507,7 +528,7 @@ extern ParsedURL *baseURL(Buffer *buf);
+ extern int openSocket(char *hostname, char *remoteport_name,
+ unsigned short remoteport_num);
+ extern void parseURL(char *url, ParsedURL *p_url, ParsedURL *current);
+-extern void copyParsedURL(ParsedURL *p, ParsedURL *q);
++extern void copyParsedURL(ParsedURL *p, const ParsedURL *q);
+ extern void parseURL2(char *url, ParsedURL *pu, ParsedURL *current);
+ extern Str parsedURL2Str(ParsedURL *pu);
+ extern int getURLScheme(char **url);
+@@ -586,9 +607,12 @@ extern char *getAnchorText(Buffer *buf, AnchorList *al, Anchor *a);
+ extern Buffer *link_list_panel(Buffer *buf);
+
+ extern Str decodeB(char **ww);
++extern void decodeB_to_growbuf(struct growbuf *gb, char **ww);
+ extern Str decodeQ(char **ww);
+ extern Str decodeQP(char **ww);
++extern void decodeQP_to_growbuf(struct growbuf *gb, char **ww);
+ extern Str decodeU(char **ww);
++extern void decodeU_to_growbuf(struct growbuf *gb, char **ww);
+ #ifdef USE_M17N
+ extern Str decodeWord(char **ow, wc_ces * charset);
+ extern Str decodeMIME(Str orgstr, wc_ces * charset);
+@@ -611,6 +635,7 @@ extern char *confFile(char *base);
+ extern char *auxbinFile(char *base);
+ extern char *libFile(char *base);
+ extern char *helpFile(char *base);
++extern const void *querySiteconf(const ParsedURL *query_pu, int field);
+ extern Str localCookie(void);
+ extern Str loadLocalDir(char *dirname);
+ extern void set_environ(char *var, char *value);
+@@ -683,6 +708,7 @@ extern void reMark(void);
+
+ #ifdef USE_MOUSE
+ extern void mouse(void);
++extern void sgrmouse(void);
+ extern void mouse_init(void);
+ extern void mouse_end(void);
+ extern void mouse_active(void);
+@@ -698,6 +724,7 @@ extern void tabMs(void);
+ extern void closeTMs(void);
+ #else /* not USE_MOUSE */
+ #define mouse nulcmd
++#define sgrmouse nulcmd
+ #define msToggle nulcmd
+ #define movMs nulcmd
+ #define menuMs nulcmd
+@@ -723,6 +750,8 @@ extern int getKey(char *s);
+ extern char *getKeyData(int key);
+ extern char *getWord(char **str);
+ extern char *getQWord(char **str);
++struct regex;
++extern char *getRegexWord(const char **str, struct regex **regex_ret);
+ #ifdef USE_MOUSE
+ extern void initMouseAction(void);
+ #endif
+@@ -786,5 +815,3 @@ extern void dispVer(void);
+ void srand48(long);
+ long lrand48(void);
+ #endif
+-
+-#include "indep.h"
+diff --git a/rc.c b/rc.c
+index 8441a39..7de87b8 100644
+--- a/rc.c
++++ b/rc.c
+@@ -9,7 +9,9 @@
+ #include <errno.h>
+ #include "parsetag.h"
+ #include "local.h"
++#include "regex.h"
+ #include <stdlib.h>
++#include <stddef.h>
+
+ struct param_ptr {
+ char *name;
+@@ -88,6 +90,7 @@ static int OptionEncode = FALSE;
+ #define CMT_MULTICOL N_("Display file names in multi-column format")
+ #define CMT_ALT_ENTITY N_("Use ASCII equivalents to display entities")
+ #define CMT_GRAPHIC_CHAR N_("Character type for border of table and menu")
++#define CMT_DISP_BORDERS N_("Display table borders, ignore value of BORDER")
+ #define CMT_FOLD_TEXTAREA N_("Fold lines in TEXTAREA")
+ #define CMT_DISP_INS_DEL N_("Display INS, DEL, S and STRIKE element")
+ #define CMT_COLOR N_("Display with color")
+@@ -140,12 +143,19 @@ static int OptionEncode = FALSE;
+ #define CMT_EDITOR N_("Editor")
+ #define CMT_MAILER N_("Mailer")
+ #define CMT_MAILTO_OPTIONS N_("How to call Mailer for mailto URLs with options")
+-#define CMT_EXTBRZ N_("External Browser")
+-#define CMT_EXTBRZ2 N_("Second External Browser")
+-#define CMT_EXTBRZ3 N_("Third External Browser")
++#define CMT_EXTBRZ N_("External browser")
++#define CMT_EXTBRZ2 N_("2nd external browser")
++#define CMT_EXTBRZ3 N_("3rd external browser")
++#define CMT_EXTBRZ4 N_("4th external browser")
++#define CMT_EXTBRZ5 N_("5th external browser")
++#define CMT_EXTBRZ6 N_("6th external browser")
++#define CMT_EXTBRZ7 N_("7th external browser")
++#define CMT_EXTBRZ8 N_("8th external browser")
++#define CMT_EXTBRZ9 N_("9th external browser")
+ #define CMT_DISABLE_SECRET_SECURITY_CHECK N_("Disable secret file security check")
+ #define CMT_PASSWDFILE N_("Password file")
+ #define CMT_PRE_FORM_FILE N_("File for setting form on loading")
++#define CMT_SITECONF_FILE N_("File for preferences for each site")
+ #define CMT_FTPPASS N_("Password for anonymous FTP (your mail address)")
+ #define CMT_FTPPASS_HOSTNAMEGEN N_("Generate domain part of password for FTP")
+ #define CMT_USERAGENT N_("User-Agent identification string")
+@@ -390,6 +400,8 @@ struct param_ptr params1[] = {
+ NULL},
+ {"graphic_char", P_CHARINT, PI_SEL_C, (void *)&UseGraphicChar,
+ CMT_GRAPHIC_CHAR, (void *)graphic_char_str},
++ {"display_borders", P_CHARINT, PI_ONOFF, (void *)&DisplayBorders,
++ CMT_DISP_BORDERS, NULL},
+ {"fold_textarea", P_CHARINT, PI_ONOFF, (void *)&FoldTextarea,
+ CMT_FOLD_TEXTAREA, NULL},
+ {"display_ins_del", P_INT, PI_SEL_C, (void *)&displayInsDel,
+@@ -561,6 +573,18 @@ struct param_ptr params6[] = {
+ NULL},
+ {"extbrowser3", P_STRING, PI_TEXT, (void *)&ExtBrowser3, CMT_EXTBRZ3,
+ NULL},
++ {"extbrowser4", P_STRING, PI_TEXT, (void *)&ExtBrowser4, CMT_EXTBRZ4,
++ NULL},
++ {"extbrowser5", P_STRING, PI_TEXT, (void *)&ExtBrowser5, CMT_EXTBRZ5,
++ NULL},
++ {"extbrowser6", P_STRING, PI_TEXT, (void *)&ExtBrowser6, CMT_EXTBRZ6,
++ NULL},
++ {"extbrowser7", P_STRING, PI_TEXT, (void *)&ExtBrowser7, CMT_EXTBRZ7,
++ NULL},
++ {"extbrowser8", P_STRING, PI_TEXT, (void *)&ExtBrowser8, CMT_EXTBRZ8,
++ NULL},
++ {"extbrowser9", P_STRING, PI_TEXT, (void *)&ExtBrowser9, CMT_EXTBRZ9,
++ NULL},
+ {"bgextviewer", P_INT, PI_ONOFF, (void *)&BackgroundExtViewer,
+ CMT_BGEXTVIEW, NULL},
+ {"use_lessopen", P_INT, PI_ONOFF, (void *)&use_lessopen, CMT_USE_LESSOPEN,
+@@ -619,6 +643,8 @@ struct param_ptr params9[] = {
+ CMT_FTPPASS_HOSTNAMEGEN, NULL},
+ {"pre_form_file", P_STRING, PI_TEXT, (void *)&pre_form_file,
+ CMT_PRE_FORM_FILE, NULL},
++ {"siteconf_file", P_STRING, PI_TEXT, (void *)&siteconf_file,
++ CMT_SITECONF_FILE, NULL},
+ {"user_agent", P_STRING, PI_TEXT, (void *)&UserAgent, CMT_USERAGENT, NULL},
+ {"no_referer", P_INT, PI_ONOFF, (void *)&NoSendReferer, CMT_NOSENDREFERER,
+ NULL},
+@@ -771,7 +797,7 @@ create_option_search_table()
+ qsort(RC_search_table, RC_table_size, sizeof(struct rc_search_table),
+ (int (*)(const void *, const void *))compare_table);
+
+- diff1 = diff2 = 0;
++ diff2 = 0;
+ for (i = 0; i < RC_table_size - 1; i++) {
+ p = RC_search_table[i].param->name;
+ q = RC_search_table[i + 1].param->name;
+@@ -829,7 +855,7 @@ void
+ show_params(FILE * fp)
+ {
+ int i, j, l;
+- char *t = NULL;
++ const char *t = "";
+ char *cmt;
+
+ #ifdef USE_M17N
+@@ -1173,6 +1199,8 @@ do_mkdir(const char *dir, long mode)
+ #endif /* not __MINW32_VERSION */
+ #endif /* not __EMX__ */
+
++static void loadSiteconf(void);
++
+ void
+ sync_with_option(void)
+ {
+@@ -1199,6 +1227,7 @@ sync_with_option(void)
+ #endif
+ loadPasswd();
+ loadPreForm();
++ loadSiteconf();
+
+ if (AcceptLang == NULL || *AcceptLang == '\0') {
+ /* TRANSLATORS:
+@@ -1483,6 +1512,7 @@ panel_set_option(struct parsed_tagarg *arg)
+ {
+ FILE *f = NULL;
+ char *p;
++ Str s = Strnew(), tmp;
+
+ if (config_file == NULL) {
+ disp_message("There's no config file... config not saved", FALSE);
+@@ -1498,14 +1528,17 @@ panel_set_option(struct parsed_tagarg *arg)
+ if (arg->value) {
+ p = conv_to_system(arg->value);
+ if (set_param(arg->arg, p)) {
+- if (f)
+- fprintf(f, "%s %s\n", arg->arg, p);
++ tmp = Sprintf("%s %s\n", arg->arg, p);
++ Strcat(tmp, s);
++ s = tmp;
+ }
+ }
+ arg = arg->next;
+ }
+- if (f)
++ if (f) {
++ fputs(s->ptr, f);
+ fclose(f);
++ }
+ sync_with_option();
+ backBf();
+ }
+@@ -1556,3 +1589,217 @@ helpFile(char *base)
+ return expandPath(Strnew_m_charp(w3m_help_dir(), "/", base, NULL)->ptr);
+ }
+ #endif
++
++/* siteconf */
++/*
++ * url "<url>"|/<re-url>/|m@<re-url>@i [exact]
++ * substitute_url "<destination-url>"
++ * url_charset <charset>
++ * no_referer_from on|off
++ * no_referer_to on|off
++ *
++ * The last match wins.
++ */
++
++struct siteconf_rec {
++ struct siteconf_rec *next;
++ char *url;
++ Regex *re_url;
++ int url_exact;
++ unsigned char mask[(SCONF_N_FIELD + 7) >> 3];
++
++ char *substitute_url;
++#ifdef USE_M17N
++ wc_ces url_charset;
++#endif
++ int no_referer_from;
++ int no_referer_to;
++};
++#define SCONF_TEST(ent, f) ((ent)->mask[(f)>>3] & (1U<<((f)&7)))
++#define SCONF_SET(ent, f) ((ent)->mask[(f)>>3] |= (1U<<((f)&7)))
++#define SCONF_CLEAR(ent, f) ((ent)->mask[(f)>>3] &= ~(1U<<((f)&7)))
++
++static struct siteconf_rec *siteconf_head = NULL;
++static struct siteconf_rec *newSiteconfRec(void);
++
++static struct siteconf_rec *
++newSiteconfRec(void)
++{
++ struct siteconf_rec *ent;
++
++ ent = New(struct siteconf_rec);
++ ent->next = NULL;
++ ent->url = NULL;
++ ent->re_url = NULL;
++ ent->url_exact = FALSE;
++ memset(ent->mask, 0, sizeof(ent->mask));
++
++ ent->substitute_url = NULL;
++#ifdef USE_M17N
++ ent->url_charset = 0;
++#endif
++ return ent;
++}
++
++static void
++loadSiteconf(void)
++{
++ char *efname;
++ FILE *fp;
++ Str line;
++ struct siteconf_rec *ent = NULL;
++
++ siteconf_head = NULL;
++ if (!siteconf_file)
++ return;
++ if ((efname = expandPath(siteconf_file)) == NULL)
++ return;
++ fp = fopen(efname, "r");
++ if (fp == NULL)
++ return;
++ while (line = Strfgets(fp), line->length > 0) {
++ char *p, *s;
++
++ Strchop(line);
++ p = line->ptr;
++ SKIP_BLANKS(p);
++ if (*p == '#' || *p == '\0')
++ continue;
++ s = getWord(&p);
++
++ /* The "url" begins a new record. */
++ if (strcmp(s, "url") == 0) {
++ char *url, *opt;
++ struct siteconf_rec *newent;
++
++ /* First, register the current record. */
++ if (ent) {
++ ent->next = siteconf_head;
++ siteconf_head = ent;
++ ent = NULL;
++ }
++
++ /* Second, create a new record. */
++ newent = newSiteconfRec();
++ url = getRegexWord((const char **)&p, &newent->re_url);
++ opt = getWord(&p);
++ SKIP_BLANKS(p);
++ if (!newent->re_url) {
++ ParsedURL pu;
++ if (!url || !*url)
++ continue;
++ parseURL2(url, &pu, NULL);
++ newent->url = parsedURL2Str(&pu)->ptr;
++ }
++ /* If we have an extra or unknown option, ignore this record
++ * for future extensions. */
++ if (strcmp(opt, "exact") == 0) {
++ newent->url_exact = TRUE;
++ }
++ else if (*opt != 0)
++ continue;
++ if (*p)
++ continue;
++ ent = newent;
++ continue;
++ }
++
++ /* If the current record is broken, skip to the next "url". */
++ if (!ent)
++ continue;
++
++ /* Fill the new record. */
++ if (strcmp(s, "substitute_url") == 0) {
++ ent->substitute_url = getQWord(&p);
++ SCONF_SET(ent, SCONF_SUBSTITUTE_URL);
++ }
++#ifdef USE_M17N
++ else if (strcmp(s, "url_charset") == 0) {
++ char *charset = getWord(&p);
++ ent->url_charset = (charset && *charset) ?
++ wc_charset_to_ces(charset) : 0;
++ SCONF_SET(ent, SCONF_URL_CHARSET);
++ }
++#endif /* USE_M17N */
++ else if (strcmp(s, "no_referer_from") == 0) {
++ ent->no_referer_from = str_to_bool(getWord(&p), 0);
++ SCONF_SET(ent, SCONF_NO_REFERER_FROM);
++ }
++ else if (strcmp(s, "no_referer_to") == 0) {
++ ent->no_referer_to = str_to_bool(getWord(&p), 0);
++ SCONF_SET(ent, SCONF_NO_REFERER_TO);
++ }
++ }
++ if (ent) {
++ ent->next = siteconf_head;
++ siteconf_head = ent;
++ ent = NULL;
++ }
++ fclose(fp);
++}
++
++const void *
++querySiteconf(const ParsedURL *query_pu, int field)
++{
++ const struct siteconf_rec *ent;
++ Str u;
++ char *firstp, *lastp;
++
++ if (field < 0 || field >= SCONF_N_FIELD)
++ return NULL;
++ if (!query_pu || IS_EMPTY_PARSED_URL(query_pu))
++ return NULL;
++ u = parsedURL2Str((ParsedURL *)query_pu);
++ if (u->length == 0)
++ return NULL;
++
++ for (ent = siteconf_head; ent; ent = ent->next) {
++ if (!SCONF_TEST(ent, field))
++ continue;
++ if (ent->re_url) {
++ if (RegexMatch(ent->re_url, u->ptr, u->length, 1)) {
++ MatchedPosition(ent->re_url, &firstp, &lastp);
++ if (!ent->url_exact)
++ goto url_found;
++ if (firstp != u->ptr || lastp == firstp)
++ continue;
++ if (*lastp == 0 || *lastp == '?' || *(lastp - 1) == '?' ||
++ *lastp == '#' || *(lastp - 1) == '#')
++ goto url_found;
++ }
++ } else {
++ int matchlen = strmatchlen(ent->url, u->ptr, u->length);
++ if (matchlen == 0 || ent->url[matchlen] != 0)
++ continue;
++ firstp = u->ptr;
++ lastp = u->ptr + matchlen;
++ if (*lastp == 0 || *lastp == '?' || *(lastp - 1) == '?' ||
++ *lastp == '#' || *(lastp - 1) == '#')
++ goto url_found;
++ if (!ent->url_exact && (*lastp == '/' || *(lastp - 1) == '/'))
++ goto url_found;
++ }
++ }
++ return NULL;
++
++url_found:
++ switch (field) {
++ case SCONF_SUBSTITUTE_URL:
++ if (ent->substitute_url && *ent->substitute_url) {
++ Str tmp = Strnew_charp_n(u->ptr, firstp - u->ptr);
++ Strcat_charp(tmp, ent->substitute_url);
++ Strcat_charp(tmp, lastp);
++ return tmp->ptr;
++ }
++ return NULL;
++#ifdef USE_M17N
++ case SCONF_URL_CHARSET:
++ return &ent->url_charset;
++#endif
++ case SCONF_NO_REFERER_FROM:
++ return &ent->no_referer_from;
++ case SCONF_NO_REFERER_TO:
++ return &ent->no_referer_to;
++ }
++ return NULL;
++}
+diff --git a/regex.c b/regex.c
+index 5bee4b2..93406e8 100644
+--- a/regex.c
++++ b/regex.c
+@@ -77,7 +77,7 @@ static longchar
+ set_longchar(char *str)
+ {
+ unsigned char *p = (unsigned char *)str;
+- longchar r;
++ longchar r = { };
+
+ #ifdef USE_M17N
+ if (*p & 0x80) {
+@@ -580,7 +580,7 @@ regmatch_iter(struct MatchingContext1 *c,
+ c->lastpos = c->str;
+ #ifdef REGEX_DEBUG
+ if (verbose)
+- printf("Succeed: %s %d\n", c->str, c->lastpos - c->str);
++ printf("Succeed: %s %ld\n", c->str, (long)(c->lastpos - c->str));
+ #endif
+ YIELD(1, c, 7);
+ return 0;
+diff --git a/scripts/Makefile.in b/scripts/Makefile.in
+index 4da9ce5..3384813 100644
+--- a/scripts/Makefile.in
++++ b/scripts/Makefile.in
+@@ -34,7 +34,7 @@ CONF_DIR = $(sysconfdir)/$(PACKAGE)
+ DOCDIRS = @DOCDIRS@
+
+ AUXBIN_TARGETS = xface2xpm
+-LIB_TARGETS = dirlist.cgi w3mhelp.cgi w3mmail.cgi
++LIB_TARGETS = dirlist.cgi w3mdict.cgi w3mhelp.cgi w3mmail.cgi
+ HELP_TARGETS = w3mhelp-funcname.pl w3mhelp-funcdesc-stamp
+ SUBDIRS = multipart w3mman
+ .PHONY: $(SUBDIRS)
+@@ -60,7 +60,7 @@ w3mhelp-funcname.pl: w3mhelp-funcname.pl.in ../funcname.tab $(top_srcdir)/doc/ke
+ @cat $(srcdir)/w3mhelp-funcname.pl.in >> w3mhelp-funcname.pl
+ @echo "done"
+
+-w3mhelp-funcdesc-stamp: $(top_srcdir)/doc/README.func $(top_srcdir)/doc-jp/README.func w3mhelp-funcdesc.en.pl.in w3mhelp-funcdesc.ja.pl.in
++w3mhelp-funcdesc-stamp: $(top_srcdir)/doc/README.func $(top_srcdir)/doc-jp/README.func $(top_srcdir)/doc-de/README.func w3mhelp-funcdesc.en.pl.in w3mhelp-funcdesc.ja.pl.in w3mhelp-funcdesc.de.pl.in
+ @echo "generating w3mhelp-funcdesc*.pl..."
+ @for dirlang in $(DOCDIRS); do \
+ dir=`expr "$$dirlang" : "\(.*\):.*"`; \
+diff --git a/scripts/w3mdict.cgi b/scripts/w3mdict.cgi
+new file mode 100755
+index 0000000..6b0e62e
+--- /dev/null
++++ b/scripts/w3mdict.cgi
+@@ -0,0 +1,56 @@
++#!/bin/sh
++# w3mdict.cgi - A dictd dictionary query cgi for w3m
++#
++# REQUIREMENTS:
++# + dict client software
++# + an address of a dict server, for variable ${DICT_SERVER}
++# + a name of a favorite database on that server, for variable
++# ${FAVORITE_DATABASE}
++# OPTIONALLY:
++# + locally install a dict server (eg. dictd) and a collection
++# of dict databases (eg. wordnet, aka "wn")
++
++DICT_SERVER="localhost"
++FAVORITE_DATABASE="wn"
++RETURN_MESSAGE="\n\nPress 'B' to return to the previous page."
++printf "Content-type: text/plain\n"
++type dict \
++|| {
++ # Originally, we inconsiderately failed silently ...
++ # printf "W3m-control: BACK\n\n"
++ printf "\n\nERROR: dict client software not found${RETURN_MESSAGE}"
++ exit
++ }
++# First, we check only our best and favorite database. This is most
++# likely to give us a best defintion, and avoids displaying a long and
++# cluttered page with entries from many databases.
++dict --host "${DICT_SERVER}" \
++ --database "${FAVORITE_DATABASE}" \
++ "${QUERY_STRING}" 2>&1 \
++&& {
++ printf "${RETURN_MESSAGE}"
++ } \
++|| {
++ # The initial attempt failed, so let's search ALL databases
++ # available on the server.
++ dict --host "${DICT_SERVER}" \
++ "${QUERY_STRING}" 2>&1 \
++ && {
++ printf "${RETURN_MESSAGE}"
++ } \
++ || {
++ # No defintions were found in any of the server's databases, so
++ # let's return to the favorite database in order to retrieve its
++ # guess of what we meant to type. Originally, for this case, we
++ # pushed the user's default action to be entering another word for
++ # a dict defintion, so the print command was:
++ # printf "W3m-control: DICT_WORD\n\n"
++ # Now, we need only print a blank line to separate the cgi header
++ # from the page content.
++ printf "\n"
++ dict --host "${DICT_SERVER}" \
++ --database "${FAVORITE_DATABASE}" \
++ "${QUERY_STRING}" 2>&1
++ printf "${RETURN_MESSAGE}"
++ }
++ }
+diff --git a/scripts/w3mhelp-funcdesc.de.pl.in b/scripts/w3mhelp-funcdesc.de.pl.in
+new file mode 100644
+index 0000000..11539d1
+--- /dev/null
++++ b/scripts/w3mhelp-funcdesc.de.pl.in
+@@ -0,0 +1,66 @@
++# charset
++$charset = 'UTF-8';
++
++# Buffer selection mode
++
++%buf_funcdesc = (
++ 'BUF:PREV', 'Gehe zum vorherigen Punkt',
++ 'BUF:NEXT', 'Gehe zum nächsten Punkt',
++ 'BUF:DELETE', 'Lösche den ausgewählten Eintrag',
++ 'BUF:GO', 'Gehe zum ausgewählten Eintrag',
++);
++
++%lineedit_funcdesc = (
++ 'LINEEDIT:FORWARD', 'Bewege Cursor vorwärts',
++ 'LINEEDIT:BACK', 'Bewege Cursor rückwärts',
++ 'LINEEDIT:BS', 'Vorheriges Zeichen löschen',
++ 'LINEEDIT:DEL', 'Aktuelles Zeichen löschen',
++ 'LINEEDIT:KILL_AFTER', 'Lösche alles nach dem Cursor',
++ 'LINEEDIT:KILL_BEFORE', 'Lösche alles vor dem Cursor',
++ 'LINEEDIT:TOP', 'Gehe zum Zeilenanfang',
++ 'LINEEDIT:BOTTOM', 'Gehe zum Zeilenende',
++ 'LINEEDIT:PREV', 'Hole den vorherigen Chronik-Eintrag',
++ 'LINEEDIT:NEXT', 'Hole den nächsten Chronik-Eintrag',
++ 'LINEEDIT:EDITOR', 'Bearbeite mit externem Editor',
++ 'LINEEDIT:COMPLETE', 'Versuche, den Dateinamen zu komplettieren',
++ 'LINEEDIT:ACCEPT', 'Eingabezeile annehmen',
++);
++
++%menu_funcdesc = (
++ 'MENU:SELECT', 'Wähle Eintrag aus',
++ 'MENU:CLOSE', 'SchlieÃe Menü',
++ 'MENU:CANCEL', 'Einen Auswahlschritt zurück',
++ 'MENU:DOWN', 'Gehe zum nächsten Punkt',
++ 'MENU:UP', 'Gehe zum vorherigen Punkt',
++ 'MENU:LINE_UP', 'Scrolle einen Punkt aufwärts',
++ 'MENU:LINE_DOWN', 'Scrolle einen Punkt abwärts',
++ 'MENU:TOP', 'Gehe zum ersten Punkt',
++ 'MENU:LAST', 'Gehe zum letzten Punkt',
++ 'MENU:NEXT', 'Gehe zur nächsten Seite',
++ 'MENU:PREV', 'Gehe zur vorherigen Seite',
++ 'MENU:SEARCH_FORE', 'Suche vorwärts',
++ 'MENU:SEARCH_BACK', 'Suche rückwärts',
++ 'MENU:SEARCH_NEXT', 'Suche weitere Ãbereinstimmung',
++ 'MENU:SEARCH_PREV', 'Suche frühere Ãbereinstimmung',
++ 'MENU:SUSPEND', 'Zurückstellen',
++);
++
++%title = (
++ "Current keymap file", 'Aktuelle Datei mit Tastaturbefehlszuordnung',
++ "In-page Navigation", 'Navigation auf der Seite',
++ "Hyperlink Operations", 'Umgang mit Hyperlinks',
++ "File/Stream Operations", 'Umgang mit Dateien und Datenströmen',
++ "Buffer Operations", 'Umgang mit Puffern',
++ "Tab Operations", 'Umgang mit Reitern',
++ "Buffer and Tab Selection Mode", 'Puffer/Reiter-Auswahl-Modus',
++ "Bookmark Management", 'Lesezeichenverwaltung',
++ "Searches", 'Suchen',
++ "Dictionary Lookup", 'Abgleich mit Wörterbuch',
++ "Mark Operations", 'Umgang mit Textmarken',
++ "Miscellaneous", 'Verschiedenes',
++ "User-defined key bindings", 'Benutzerdefinierte Tastaturbefehle',
++ "Input Line Editing Mode", 'Bearbeitung der Eingabezeile',
++ "Popup Menu Mode", 'Navigation in Menüs',
++);
++
++1;
+diff --git a/scripts/w3mhelp-funcdesc.en.pl.in b/scripts/w3mhelp-funcdesc.en.pl.in
+index d854b59..b9f4ed8 100644
+--- a/scripts/w3mhelp-funcdesc.en.pl.in
++++ b/scripts/w3mhelp-funcdesc.en.pl.in
+@@ -4,44 +4,44 @@ $charset = 'US-ASCII';
+ # Buffer selection mode
+
+ %buf_funcdesc = (
+- 'BUF:PREV', 'Select previous buffer',
+- 'BUF:NEXT', 'Select next buffer',
+- 'BUF:DELETE', 'Delete current buffer',
+- 'BUF:GO', 'Go to the selected buffer',
++ 'BUF:PREV', 'Previous item',
++ 'BUF:NEXT', 'Next item',
++ 'BUF:DELETE', 'Delete item',
++ 'BUF:GO', 'Select item',
+ );
+
+ %lineedit_funcdesc = (
+- 'LINEEDIT:FORWARD', 'Move cursor forward',
+- 'LINEEDIT:BACK', 'Move cursor backward',
++ 'LINEEDIT:FORWARD', 'Cursor forward',
++ 'LINEEDIT:BACK', 'Cursor backward',
+ 'LINEEDIT:BS', 'Delete previous character',
+- 'LINEEDIT:DEL', 'Delete current character',
+- 'LINEEDIT:KILL_AFTER', 'Kill everything after cursor',
+- 'LINEEDIT:KILL_BEFORE', 'Kill everything before cursor',
+- 'LINEEDIT:TOP', 'Move to the top of line',
+- 'LINEEDIT:BOTTOM', 'Move to the bottom of line',
++ 'LINEEDIT:DEL', 'Delete character',
++ 'LINEEDIT:KILL_AFTER', 'Delete everything after cursor',
++ 'LINEEDIT:KILL_BEFORE', 'Delete everything before cursor',
++ 'LINEEDIT:TOP', 'Cursor to the beginning of the line',
++ 'LINEEDIT:BOTTOM', 'Cursor to the end of the line',
+ 'LINEEDIT:PREV', 'Fetch the previous string from the history list',
+ 'LINEEDIT:NEXT', 'Fetch the next string from the history list',
+ 'LINEEDIT:EDITOR', 'Edit with external editor',
+- 'LINEEDIT:COMPLETE', 'Complete filename',
+- 'LINEEDIT:ACCEPT', 'Accept',
++ 'LINEEDIT:COMPLETE', 'Try to complete filename',
++ 'LINEEDIT:ACCEPT', 'Accept input line',
+ );
+
+ %menu_funcdesc = (
+ 'MENU:SELECT', 'Select item',
+ 'MENU:CLOSE', 'Close menu',
+- 'MENU:CANCEL', 'Back',
+- 'MENU:DOWN', 'Move to next item',
+- 'MENU:UP', 'Move to previous item',
++ 'MENU:CANCEL', 'One selection step backward',
++ 'MENU:DOWN', 'Move to the next item',
++ 'MENU:UP', 'Move to the previous item',
+ 'MENU:LINE_UP', 'Scroll up one item',
+ 'MENU:LINE_DOWN', 'Scroll down one item',
+- 'MENU:TOP', 'Go to top item',
+- 'MENU:LAST', 'Go to last item',
+- 'MENU:NEXT', 'Go to next page',
+- 'MENU:PREV', 'Go to previous page',
+- 'MENU:SEARCH_FORE', 'Search foreward',
++ 'MENU:TOP', 'Move to the first item',
++ 'MENU:LAST', 'Move to the final item',
++ 'MENU:NEXT', 'Go to the next page',
++ 'MENU:PREV', 'Go to the previous page',
++ 'MENU:SEARCH_FORE', 'Search forward',
+ 'MENU:SEARCH_BACK', 'Search backward',
+- 'MENU:SEARCH_NEXT', 'Search next regexp',
+- 'MENU:SEARCH_PREV', 'Search previous regexp',
++ 'MENU:SEARCH_NEXT', 'Search for the next match',
++ 'MENU:SEARCH_PREV', 'Search for the previous match',
+ 'MENU:SUSPEND', 'Suspend',
+ );
+
+diff --git a/scripts/w3mhelp-funcdesc.ja.pl.in b/scripts/w3mhelp-funcdesc.ja.pl.in
+index 051c888..4ef476e 100644
+--- a/scripts/w3mhelp-funcdesc.ja.pl.in
++++ b/scripts/w3mhelp-funcdesc.ja.pl.in
+@@ -46,21 +46,21 @@ $charset = 'EUC-JP';
+ );
+
+ %title = (
+- "Show keymap file", 'keymap ¥Õ¥¡¥¤¥ë¤ò¸«¤ë',
+- "Page/Cursor motion", '¥Ú¡¼¥¸/¥«¡¼¥½¥ë°ÜÆ°',
+- "Hyperlink operation", '¥Ï¥¤¥Ñ¡¼¥ê¥ó¥¯Áàºî',
+- "File/Stream operation", '¥Õ¥¡¥¤¥ë/¥¹¥È¥ê¡¼¥àÁàºî',
+- "Buffer operation", '¥Ð¥Ã¥Õ¥¡Áàºî',
+- "Tab operation", '¥¿¥ÖÁàºî',
+- "Buffer selection mode", '¥Ð¥Ã¥Õ¥¡ÁªÂò¥â¡¼¥É',
+- "Bookmark operation", '¥Ö¥Ã¥¯¥Þ¡¼¥¯Áàºî',
+- "Search", '¸¡º÷',
+- "Dictionary look-up", '¼½ñ¸¡º÷',
+- "Mark operation", '¥Þ¡¼¥¯Áàºî',
+- "Miscellany", '¤½¤Î¾',
+- "User defined keymaps", '¥æ¡¼¥¶ÄêµÁ',
+- "Line-edit mode", '¹ÔÊÔ½¸¥â¡¼¥É',
+- "Popup menu", '¥á¥Ë¥å¡¼',
++ "Current keymap file", 'keymap ¥Õ¥¡¥¤¥ë¤ò¸«¤ë',
++ "In-page Navigation", '¥Ú¡¼¥¸/¥«¡¼¥½¥ë°ÜÆ°',
++ "Hyperlink Operations", '¥Ï¥¤¥Ñ¡¼¥ê¥ó¥¯Áàºî',
++ "File/Stream Operations", '¥Õ¥¡¥¤¥ë/¥¹¥È¥ê¡¼¥àÁàºî',
++ "Buffer Operations", '¥Ð¥Ã¥Õ¥¡Áàºî',
++ "Tab Operations", '¥¿¥ÖÁàºî',
++ "Buffer and Tab Selection Mode", '¥Ð¥Ã¥Õ¥¡ÁªÂò¥â¡¼¥É',
++ "Bookmark Management", '¥Ö¥Ã¥¯¥Þ¡¼¥¯Áàºî',
++ "Searches", '¸¡º÷',
++ "Dictionary Lookup", '¼½ñ¸¡º÷',
++ "Mark Operations", '¥Þ¡¼¥¯Áàºî',
++ "Miscellaneous", '¤½¤Î¾',
++ "User-defined key bindings", '¥æ¡¼¥¶ÄêµÁ',
++ "Input Line Editing Mode", '¹ÔÊÔ½¸¥â¡¼¥É',
++ "Popup Menu Mode", '¥á¥Ë¥å¡¼',
+ );
+
+ 1;
+diff --git a/scripts/w3mhelp.cgi.in b/scripts/w3mhelp.cgi.in
+index b2fca8f..503dddc 100644
+--- a/scripts/w3mhelp.cgi.in
++++ b/scripts/w3mhelp.cgi.in
+@@ -48,7 +48,7 @@ if (defined($ENV{'QUERY_STRING'})) {
+ }
+ # print "tlang=$tlang\n";
+ eval {require "w3mhelp-funcdesc.$tlang.pl";};
+- if (defined(%funcdesc)) {
++ if (%funcdesc) {
+ $lang = $tlang;
+ }
+ }
+@@ -102,8 +102,7 @@ Content-Type: text/html; charset=$charset
+ *******
+ <A HREF="http://w3m.sourceforge.net/">w3m</A>
+ (WWW-wo-Miru) Version $version by
+-<A HREF="mailto:aito\@fw.ipsj.or.jp">A.ITO</A> ********<BR>
+- ***** Key assign table *****
++<A HREF="mailto:aito\@fw.ipsj.or.jp">A.ITO</A> ********
+ </CENTER>
+
+ HEADING
+@@ -112,25 +111,25 @@ $q_version = $version;
+ $q_version =~ s/[^A-Za-z0-9_\$\.\-]/sprintf('%%%02X', ord($&))/ge;
+ $script = "<A HREF=\"$ENV{'SCRIPT_NAME'}?version=$q_version&lang=";
+
+-# doc:en_English doc-jp:ja_Japanese
++# doc:en_English doc-jp:ja_Japanese doc-de:de_German
+ for $otherlang (@docdirs) {
+ local(@d) = split(/[:_]/, $otherlang);
+
+ if ($d[1] ne $lang) {
+ $d[1] =~ s/[^A-Za-z0-9_\$\.\-]/sprintf('%%%02X', ord($&))/ge;
+- print $script, $d[1], "\">$d[2] version</A>\n";
++ print $script, $d[1], "\">[$d[2]]</A>\n";
+ }
+ }
+
+ $keymap =~ s/[<>&]/$htmlesc{$&}/ge;
+-$head = "Show keymap file";
++$head = 'Current keymap file';
+ if (defined($title{$head})) {
+ $head = $title{$head};
+ $head =~ s/[<>&]/$htmlesc{$&}/ge;
+ }
+ print "<P><A HREF=\"$keymap\">$head</A>\n";
+
+-&show_keymap("Page/Cursor motion",
++&show_keymap('In-page Navigation',
+ split(" ", "pgFore pgBack movR movL movD movU
+ movR1 movL1 movD1 movU1 ldown1 lup1
+ shiftl shiftr col1L col1R linbeg linend ctrCsrH ctrCsrV
+@@ -139,50 +138,50 @@ print "<P><A HREF=\"$keymap\">$head</A>\n";
+ nextR nextL nextD nextU nextRD nextLU
+ undoPos redoPos"));
+
+-&show_keymap("Hyperlink operation",
++&show_keymap('Hyperlink Operations',
+ split(" ", "followA tabA svA followI svI submitForm
+ curURL peekURL peekIMG pginfo curlno chkURL chkWORD chkNMID
+ rFrame extbrz linkbrz linkLst listMn linkMn accessKey"));
+
+-&show_keymap("File/Stream operation",
++&show_keymap('File/Stream Operations',
+ split(" ", "goURL gorURL tabURL tabrURL ldfile readsh pipesh
+ pipeBuf"));
+
+-&show_keymap("Buffer operation",
++&show_keymap('Buffer Operations',
+ split(" ", "backBf nextBf prevBf selMn selBuf vwSrc svSrc svBuf
+ editBf editScr reload reshape rdrwSc dispI stopI"));
+
+-&show_keymap("Tab operation",
++&show_keymap('Tab Operations',
+ split(" ", "newT closeT nextT prevT tabMn tabR tabL"));
+
+-&show_keymap("Bookmark operation",
++&show_keymap('Bookmark Management',
+ split(" ", "ldBmark adBmark"));
+
+-&show_keymap("Search",
++&show_keymap('Searches',
+ split(" ", "srchfor srchbak srchnxt srchprv isrchfor isrchbak"));
+
+-&show_keymap("Dictionary look-up",
++&show_keymap('Dictionary Lookup',
+ split(" ", "dictword dictwordat"));
+
+-&show_keymap("Mark operation",
++&show_keymap('Mark Operations',
+ split(" ", "_mark nextMk prevMk reMark"));
+
+-&show_keymap("Miscellany",
++&show_keymap('Miscellaneous',
+ split(" ", "mainMn ldhelp ldOpt dispVer cooLst ldHist ldDL
+ docCSet defCSet
+ msgs msToggle wrapToggle execCmd setAlarm setOpt setEnv defKey
+ reinit execsh susp qquitfm quitfm"));
+
+-&show_keymap_data("User defined keymaps");
++&show_keymap_data('User-defined key bindings');
+
+ print "<BR>\n<HR WIDTH=80%>\n";
+
+-&show_keymap("Buffer selection mode",
++&show_keymap('Buffer and Tab Selection Mode',
+ split(" ", "buffer_next buffer_prev buffer_delete buffer_go"));
+
+ print "<BR>\n<HR WIDTH=80%>\n";
+
+-&show_keymap("Line-edit mode",
++&show_keymap('Input Line Editing Mode',
+ split(" ", "lineedit_forward lineedit_back lineedit_backspace
+ lineedit_delete lineedit_kill_after lineedit_kill_before
+ lineedit_top lineedit_bottom lineedit_prev lineedit_next
+@@ -190,7 +189,7 @@ print "<BR>\n<HR WIDTH=80%>\n";
+
+ print "<BR>\n<HR WIDTH=80%>\n";
+
+-&show_keymap("Popup menu",
++&show_keymap('Popup Menu Mode',
+ split(" ", "menu_select menu_close menu_cancel menu_down menu_up
+ menu_line_up menu_line_down menu_top menu_last menu_next
+ menu_prev menu_search_fore menu_search_back menu_search_next
+diff --git a/scripts/w3mman/Makefile.in b/scripts/w3mman/Makefile.in
+index 569e2fc..ad1cffe 100644
+--- a/scripts/w3mman/Makefile.in
++++ b/scripts/w3mman/Makefile.in
+@@ -33,11 +33,13 @@ ETC_DIR = $(sysconfdir)
+ CONF_DIR = $(sysconfdir)/$(PACKAGE)
+ BIN_DIR = $(bindir)
+ MAN1_DIR = $(mandir)/man1
++MAN1_DE_DIR = $(mandir)/de/man1
+
+ TARGETS = w3mman
+ CGIBIN_TARGETS = w3mman2html.cgi
+ MAN1_TARGETS = w3mman.1
+-MAN_TARGETS = $(MAN1_TARGETS)
++MAN1_DE_TARGETS = w3mman.de.1
++MAN_TARGETS = $(MAN1_TARGETS) $(MAN1_DE_TARGETS)
+
+ MKDIR = mkdir -p
+ INSTALL = @INSTALL@
+@@ -53,6 +55,7 @@ install: $(TARGETS) $(CGIBIN_TARGETS) $(MAN_TARGETS)
+ -$(MKDIR) $(DESTDIR)$(BIN_DIR)
+ -$(MKDIR) $(DESTDIR)$(CGIBIN_DIR)
+ -$(MKDIR) $(DESTDIR)$(MAN1_DIR)
++ -$(MKDIR) $(DESTDIR)$(MAN1_DE_DIR)
+ for file in $(TARGETS); \
+ do \
+ $(INSTALL_SCRIPT) $$file $(DESTDIR)$(BIN_DIR); \
+@@ -65,6 +68,12 @@ install: $(TARGETS) $(CGIBIN_TARGETS) $(MAN_TARGETS)
+ do \
+ $(INSTALL_MAN) $$file $(DESTDIR)$(MAN1_DIR); \
+ done
++ for file in $(MAN1_DE_TARGETS); \
++ do \
++ $(INSTALL_MAN) $$file $(DESTDIR)$(MAN1_DE_DIR); \
++ f=`echo "$$file" | sed -e 's/\.de\././'`; \
++ mv $(DESTDIR)$(MAN1_DE_DIR)/$$file $(DESTDIR)$(MAN1_DE_DIR)/$$f; \
++ done
+
+ uninstall:
+ -for file in $(TARGETS); \
+@@ -79,6 +88,11 @@ uninstall:
+ do \
+ rm -f $(MAN1_DIR)/$$file; \
+ done
++ -for file in $(MAN1_DE_TARGETS); \
++ do \
++ f=`echo "$$file" | sed -e 's/\.de\././'`; \
++ rm -f $(MAN1_DE_DIR)/$$f; \
++ done
+
+ clean:
+
+@@ -89,7 +103,7 @@ distclean:
+ dist: all
+ @-rm -fr $(distdir)/w3mman
+ -$(MKDIR) $(distdir)/w3mman
+- cp Makefile README w3mman.in w3mman2html.cgi.in hlink.cgi w3mman.1.in $(distdir)/w3mman
++ cp Makefile README w3mman.in w3mman2html.cgi.in hlink.cgi w3mman.1.in w3mman.de.1.in $(distdir)/w3mman
+ ( cd $(distdir); tar -cf - w3mman | GZIP='' gzip ) \
+ > $(distdir)/w3mman.tar.gz
+ -rm -fr $(distdir)/w3mman
+diff --git a/scripts/w3mman/w3mman.1.in b/scripts/w3mman/w3mman.1.in
+index 1c0361d..904fb5d 100644
+--- a/scripts/w3mman/w3mman.1.in
++++ b/scripts/w3mman/w3mman.1.in
+@@ -1,4 +1,4 @@
+-.TH W3MMAN 1 "Nov 5, 2005"
++.TH W3MMAN 1 "2016-07-13"
+ .\" Please adjust this date whenever revising the manpage.
+ .\"
+ .\" Some roff macros, for reference:
+@@ -12,36 +12,52 @@
+ .\" .sp <n> insert n+1 empty lines
+ .\" for manpage-specific macros, see man(7)
+ .SH NAME
+-w3mman \- an interface to the on-line reference manuals by w3m(1)
++w3mman \- an interface to the on-line reference manuals via w3m(1)
+ .SH SYNOPSIS
++.\" mh 2016-07-04: "page" is an optional argument.
++.\" Started without it, w3mman displays a form that allows selection
++.\" of a manual page according to section, name and keyword.
++.\" Therefore square brackets introduced
+ .B w3mman
+-.RI "[-M " path ] " " [ section ] " page"
++[
++.BI \-M " path"
++] [
++.I section
++] [
++.I page
++]
+ .br
+ .B w3mman
+-.RI "[-M " path "] -k " keyword
++[
++.BI \-M " path"
++]
++.BI \-k " keyword"
+ .br
+ .B w3mman
+-.RI -l " file
++.BI \-l " file"
++.br
+ .SH DESCRIPTION
++.\" mh 2016-07-04 text edited. This section shall deliver
++.\" more information than section NAME
+ .B w3mman
+-is the system's manual pager by
+-.BR w3m (1).
++is a Perl script that uses
++.BR w3m (1)
++to serve as a pager for on-line reference manuals.
+ .SH OPTIONS
+ A summary of options is included below.
+ .TP
+ .BI \-M " path"
+-Specify
++Specify
+ .I path
+-as MANPATH.
++as alternative MANPATH to use.
+ .TP
+ .BI \-k " keyword"
+-Specify
+-.I keyword.
++Specify \fIkeyword\fP.
+ .TP
+ .BI \-l " file"
+-Specify a
+-.I file.
++Specify a \fIfile\fP.
+ .SH ENVIRONMENT
++Two variables are available for debugging.
+ .TP
+ .B W3MMAN_W3M
+ If W3MMAN_W3M is set, its value is used instead of @W3M@.
+@@ -51,7 +67,7 @@ If W3MMAN_MAN is set, its value is used instead of @MAN@.
+ .SH FILES
+ .TP
+ .I @libexecdir@/@PACKAGE@/cgi-bin/w3mman2html.cgi
+-convert manual page to html.
++manual page to HTML convertor.
+ .SH SEE ALSO
+ .BR man (1),
+ .BR w3m (1).
+diff --git a/scripts/w3mman/w3mman.de.1.in b/scripts/w3mman/w3mman.de.1.in
+new file mode 100644
+index 0000000..d6c5a44
+--- /dev/null
++++ b/scripts/w3mman/w3mman.de.1.in
+@@ -0,0 +1,71 @@
++.\"*******************************************************************
++.\"
++.\" This file was generated with po4a. Translate the source file.
++.\"
++.\"*******************************************************************
++.TH W3MMAN 1 2016\-07\-13
++.\" Please adjust this date whenever revising the manpage.
++.\"
++.\" Some roff macros, for reference:
++.\" .nh disable hyphenation
++.\" .hy enable hyphenation
++.\" .ad l left justify
++.\" .ad b justify to both left and right margins
++.\" .nf disable filling
++.\" .fi enable filling
++.\" .br insert line break
++.\" .sp <n> insert n+1 empty lines
++.\" for manpage-specific macros, see man(7)
++.SH NAME
++w3mman \- eine Schnittstelle zur Anzeige von Online\-Referenzhandbüchern durch
++w3m(1)
++.SH SYNOPSIS
++.\" mh 2016-07-04: "page" is an optional argument.
++.\" Started without it, w3mman displays a form that allows selection
++.\" of a manual page according to section, name and keyword.
++.\" Therefore square brackets introduced
++\fBw3mman\fP [ \fB\-M\fP \fIPfad\fP ] [ \fIAbschnitt\fP ] [ \fISeite\fP ]
++.br
++\fBw3mman\fP [\fB\-M\fP \fIPfad\fP] \fB\-k\fP \fIStichwort\fP
++.br
++\fBw3mman\fP \fB\-l\fP \fIDatei\fP
++.br
++.SH BESCHREIBUNG
++.\" mh 2016-07-04 text edited. This section shall deliver
++.\" more information than section NAME
++\fBw3mman\fP ist ein Perl\-Skript, welches auf \fBw3m\fP(1) zurückgreift, um als
++Betrachter für Online\-Referenzhandbücher zu dienen.
++.SH OPTIONEN
++Es folgt eine Zusammenfassung der Optionen.
++.TP
++\fB\-M\fP\fI Pfad\fP
++Suchpfad für Handbuchseiten auf \fIPfad\fP setzen
++.TP
++\fB\-k\fP \fIStichwort\fP
++zum \fIStichwort\fP passende Handbuchseiten anzeigen
++.TP
++\fB\-l\fP \fIDatei\fP
++die Handbuchseiten\-Datei \fIDatei\fP anzeigen
++.SH UMGEBUNGSVARIABLEN
++Zur Fehleranalyse stehen zwei Variablen zur Verfügung.
++.TP
++\fBW3MMAN_W3M\fP
++Ist W3MMAN_W3M gesetzt, wird ihr Wert anstelle von @W3M@ verwendet.
++.TP
++\fBW3MMAN_MAN\fP
++Ist W3MMAN_MAN gesetzt, wird ihr Wert anstelle von @MAN@ verwendet.
++.SH DATEIEN
++.TP
++\fI@libexecdir@/@PACKAGE@/cgi\-bin/w3mman2html.cgi\fP
++Skript, welches Handbuchseiten in HTML konvertiert
++.SH "SIEHE AUCH"
++\fBman\fP(1), \fBw3m\fP(1).
++.SH AUTOR
++Diese Handbuchseite wurde von Fumitoshi UKAI <ukai@debian.or.jp> für
++Debian GNU / Linux geschrieben, sie kann aber auch auf anderen Systemen
++verwendet werden.
++Die deutsche Ãbersetzung wurde 2016 von
++.UR markus.hiereth@freenet.de
++Markus Hiereth
++.UE
++erstellt.
+diff --git a/scripts/w3mman/w3mman2html.cgi.in b/scripts/w3mman/w3mman2html.cgi.in
+index f430307..2cd00f9 100644
+--- a/scripts/w3mman/w3mman2html.cgi.in
++++ b/scripts/w3mman/w3mman2html.cgi.in
+@@ -34,7 +34,6 @@ Content-Type: text/html
+ EOF
+ $keyword =~ s:([^-\w\200-\377.,])::g;
+ open(F, "$MAN -k $keyword 2> /dev/null |");
+- @line = ();
+ while(<F>) {
+ chop;
+ $_ = &html_quote($_);
+@@ -126,12 +125,14 @@ while(<F>) {
+ s/\&/\&/g;
+ s/\</\</g;
+ s/\>/\>/g;
++ # non ASCII UTF-8 codepoint
++ my $utf8="[\300-\337][\200-\277]|[\340-\357][\200-\277]{2}|[\360-\367][\200-\277]{3}|[\370-\373][\200-\277]{4}|[\374\375][\200-\277]{5}";
+
+- s@([\200-\377].)(\010{1,2}\1)+@<b>$1</b>@g;
++ s@($utf8)(\010\1)+@<b>$1</b>@g;
+ s@(\&\w+;|.)(\010\1)+@<b>$1</b>@g;
+- s@__\010{1,2}((\<b\>)?[\200-\377].(\</b\>)?)@<u>$1</u>@g;
++ s@_\010((\<b\>)?($utf8)(\</b\>)?)@<u>$1</u>@g;
+ s@_\010((\<b\>)?(\&\w+\;|.)(\</b\>)?)@<u>$1</u>@g;
+- s@((\<b\>)?[\200-\377].(\</b\>)?)\010{1,2}__@<u>$1</u>@g;
++ s@((\<b\>)?($utf8)(\</b\>)?)\010_@<u>$1</u>@g;
+ s@((\<b\>)?(\&\w+\;|.)(\</b\>)?)\010_@<u>$1</u>@g;
+ s@.\010(.)@$1@g;
+
+@@ -156,7 +157,7 @@ EOF
+ }
+
+ s@(http|ftp)://[\w.\-/~]+[\w/]@<a href="$&">$&</a>@g;
+- s@(\W)(mailto:)?(\w[\w.\-]*\@\w[\w.\-]*\.[\w.\-]*\w)@$1<a href="mailto:$3">$2$3</a>@g;
++ s@\b(mailto:|)(\w[\w.\-]*\@\w[\w.\-]*\.[\w.\-]*\w)@<a href="mailto:$2">$1$2</a>@g;
+ s@(\W)(\~?/[\w.][\w.\-/~]*)@$1 . &file_ref($2)@ge;
+ s@(include(<\/?[bu]\>|\s)*\<)([\w.\-/]+)@$1 . &include_ref($3)@ge;
+ if ($prev && m@^\s*(\<[bu]\>)*(\w[\w.\-]*)(\</[bu]\>)*(\([\dm]\w*\))@) {
+@@ -220,7 +221,7 @@ sub is_command {
+ local($p);
+
+ (! -d && -x) || return 0;
+- if (! defined(%PATH)) {
++ if (! %PATH) {
+ for $p (split(":", $ENV{'PATH'})) {
+ $p =~ s@/+$@@;
+ $PATH{$p} = 1;
+diff --git a/table.c b/table.c
+index e1243ff..d88e983 100644
+--- a/table.c
++++ b/table.c
+@@ -188,7 +188,7 @@ dv2sv(double *dv, short *iv, int size)
+ indexarray = NewAtom_N(short, size);
+ edv = NewAtom_N(double, size);
+ for (i = 0; i < size; i++) {
+- iv[i] = ceil(dv[i]);
++ iv[i] = (short) ceil(dv[i]);
+ edv[i] = (double)iv[i] - dv[i];
+ }
+
+@@ -205,7 +205,7 @@ dv2sv(double *dv, short *iv, int size)
+ indexarray[i] = k;
+ }
+ iw = min((int)(w + 0.5), size);
+- if (iw == 0)
++ if (iw <= 1)
+ return;
+ x = edv[(int)indexarray[iw - 1]];
+ for (i = 0; i < size; i++) {
+@@ -429,7 +429,6 @@ visible_length(char *str)
+ char *t, *r2;
+ int amp_len = 0;
+
+- t = str;
+ while (*str) {
+ prev_status = status;
+ if (next_status(*str, &status)) {
+@@ -761,7 +760,7 @@ do_refill(struct table *tbl, int row, int col, int maxlimit)
+ struct parsed_tag *tag;
+ if ((tag = parse_tag(&p, TRUE)) != NULL)
+ parsedtag_get_value(tag, ATTR_TID, &id);
+- if (id >= 0 && id < tbl->ntable) {
++ if (id >= 0 && id < tbl->ntable && tbl->tables[id].ptr) {
+ int alignment;
+ TextLineListItem *ti;
+ struct table *t = tbl->tables[id].ptr;
+@@ -1691,7 +1690,7 @@ renderTable(struct table *t, int max_width, struct html_feed_environ *h_env)
+ {
+ int i, j, w, r, h;
+ Str renderbuf;
+- short new_tabwidth[MAXCOL];
++ short new_tabwidth[MAXCOL] = { 0 };
+ #ifdef MATRIX
+ int itr;
+ VEC *newwidth;
+@@ -1724,6 +1723,10 @@ renderTable(struct table *t, int max_width, struct html_feed_environ *h_env)
+ if (max_width < rulewidth)
+ max_width = rulewidth;
+
++#define MAX_TABWIDTH 10000
++ if (max_width > MAX_TABWIDTH)
++ max_width = MAX_TABWIDTH;
++
+ check_maximum_width(t);
+
+ #ifdef MATRIX
+@@ -2600,12 +2603,16 @@ feed_table_tag(struct table *tbl, char *line, struct table_mode *mode,
+ if ((tbl->row + rowspan) >= tbl->max_rowsize)
+ check_row(tbl, tbl->row + rowspan);
+ }
++ if (rowspan < 1)
++ rowspan = 1;
+ if (parsedtag_get_value(tag, ATTR_COLSPAN, &colspan)) {
+ if ((tbl->col + colspan) >= MAXCOL) {
+ /* Can't expand column */
+ colspan = MAXCOL - tbl->col;
+ }
+ }
++ if (colspan < 1)
++ colspan = 1;
+ if (parsedtag_get_value(tag, ATTR_ALIGN, &i)) {
+ switch (i) {
+ case ALIGN_LEFT:
+@@ -2878,6 +2885,14 @@ feed_table_tag(struct table *tbl, char *line, struct table_mode *mode,
+ tmp = process_input(tag);
+ feed_table1(tbl, tmp, mode, width);
+ break;
++ case HTML_BUTTON:
++ tmp = process_button(tag);
++ feed_table1(tbl, tmp, mode, width);
++ break;
++ case HTML_N_BUTTON:
++ tmp = process_n_button();
++ feed_table1(tbl, tmp, mode, width);
++ break;
+ case HTML_SELECT:
+ tmp = process_select(tag);
+ if (tmp)
+@@ -3010,7 +3025,6 @@ feed_table_tag(struct table *tbl, char *line, struct table_mode *mode,
+ break;
+ case HTML_TABLE_ALT:
+ id = -1;
+- w = 0;
+ parsedtag_get_value(tag, ATTR_TID, &id);
+ if (id >= 0 && id < tbl->ntable) {
+ struct table *tbl1 = tbl->tables[id].ptr;
+diff --git a/table.h b/table.h
+index 83b661f..fdcdef3 100644
+--- a/table.h
++++ b/table.h
+@@ -17,7 +17,7 @@
+ #define MAX_TABLE_N 20 /* maximum number of table in same level */
+
+ #define MAXROW 50
+-#define MAXCOL 50
++#define MAXCOL 256
+
+ #define MAX_WIDTH 80
+
+diff --git a/tagtable.tab b/tagtable.tab
+index f9b7b76..f5a2c30 100644
+--- a/tagtable.tab
++++ b/tagtable.tab
+@@ -176,6 +176,7 @@ bdo HTML_BDO
+ big HTML_BIG
+ /big HTML_N_BIG
+ button HTML_BUTTON
++/button HTML_N_BUTTON
+ fieldset HTML_FIELDSET
+ /fieldset HTML_N_FIELDSET
+ iframe HTML_IFRAME
+diff --git a/terms.c b/terms.c
+index 7a3c987..3d2ffd7 100644
+--- a/terms.c
++++ b/terms.c
+@@ -12,6 +12,7 @@
+ #include <unistd.h>
+ #include "config.h"
+ #include <string.h>
++#include <sys/wait.h>
+ #ifdef HAVE_SYS_SELECT_H
+ #include <sys/select.h>
+ #endif
+@@ -222,6 +223,7 @@ static void
+ check_cygwin_console(void)
+ {
+ char *term = getenv("TERM");
++ char *ctype;
+ HANDLE hWnd;
+
+ if (term == NULL)
+@@ -236,7 +238,9 @@ check_cygwin_console(void)
+ isLocalConsole = 1;
+ }
+ }
+- if (strncmp(getenv("LANG"), "ja", 2) == 0) {
++ if (((ctype = getenv("LC_ALL")) ||
++ (ctype = getenv("LC_CTYPE")) ||
++ (ctype = getenv("LANG"))) && strncmp(ctype, "ja", 2) == 0) {
+ isWinConsole = TERM_CYGWIN_RESERVE_IME;
+ }
+ #ifdef SUPPORT_WIN9X_CONSOLE_MBCS
+@@ -463,6 +467,262 @@ writestr(char *s)
+
+ #define MOVE(line,column) writestr(tgoto(T_cm,column,line));
+
++#ifdef USE_IMAGE
++void
++put_image_osc5379(char *url, int x, int y, int w, int h, int sx, int sy, int sw, int sh, int n_terminal_image)
++{
++ Str buf;
++ char *size ;
++
++ if (w > 0 && h > 0)
++ size = Sprintf("%dx%d",w,h)->ptr;
++ else
++ size = "";
++
++ MOVE(y,x);
++ buf = Sprintf("\x1b]5379;show_picture %s %s %dx%d+%d+%d\x07",url,size,sw,sh,sx,sy);
++ writestr(buf->ptr);
++ MOVE(Currentbuf->cursorY,Currentbuf->cursorX);
++}
++
++static void
++save_gif(const char *path, u_char *header, size_t header_size, u_char *body, size_t body_size)
++{
++ int fd;
++
++ if ((fd = open(path, O_WRONLY|O_CREAT, 0600)) >= 0) {
++ write(fd, header, header_size) ;
++ write(fd, body, body_size) ;
++ write(fd, "\x3b" , 1) ;
++ close(fd) ;
++ }
++}
++
++static u_char *
++skip_gif_header(u_char *p)
++{
++ /* Header */
++ p += 10;
++
++ if (*(p) & 0x80) {
++ p += (3 * (2 << ((*p) & 0x7)));
++ }
++ p += 3;
++
++ return p;
++}
++
++static Str
++save_first_animation_frame(const char *path)
++{
++ int fd;
++ struct stat st;
++ u_char *header;
++ size_t header_size;
++ u_char *body;
++ u_char *p;
++ ssize_t len;
++ Str new_path;
++
++ new_path = Strnew_charp(path);
++ Strcat_charp(new_path, "-1");
++ if (stat(new_path->ptr, &st) == 0) {
++ return new_path;
++ }
++
++ if ((fd = open( path, O_RDONLY)) < 0) {
++ return NULL;
++ }
++
++ if (fstat( fd, &st) != 0 || ! (header = GC_malloc( st.st_size))){
++ close( fd);
++ return NULL;
++ }
++
++ len = read(fd, header, st.st_size);
++ close(fd);
++
++ /* Header */
++
++ if (len != st.st_size || strncmp(header, "GIF89a", 6) != 0) {
++ return NULL;
++ }
++
++ p = skip_gif_header(header);
++ header_size = p - header;
++
++ /* Application Extension */
++ if (p[0] == 0x21 && p[1] == 0xff) {
++ p += 19;
++ }
++
++ /* Other blocks */
++ body = NULL;
++ while (p + 2 < header + st.st_size) {
++ if (*(p++) == 0x21 && *(p++) == 0xf9 && *(p++) == 0x04) {
++ if( body) {
++ /* Graphic Control Extension */
++ save_gif(new_path->ptr, header, header_size, body, p - 3 - body);
++ return new_path;
++ }
++ else {
++ /* skip the first frame. */
++ }
++ body = p - 3;
++ }
++ }
++
++ return NULL;
++}
++
++void ttymode_set(int mode, int imode);
++void ttymode_reset(int mode, int imode);
++
++void
++put_image_sixel(char *url, int x, int y, int w, int h, int sx, int sy, int sw, int sh, int n_terminal_image)
++{
++ pid_t pid;
++ int do_anim;
++ MySignalHandler(*volatile previntr) (SIGNAL_ARG);
++ MySignalHandler(*volatile prevquit) (SIGNAL_ARG);
++ MySignalHandler(*volatile prevstop) (SIGNAL_ARG);
++
++ MOVE(y,x);
++ flush_tty();
++
++ do_anim = (n_terminal_image == 1 && x == 0 && y == 0 && sx == 0 && sy == 0);
++
++ previntr = mySignal(SIGINT, SIG_IGN);
++ prevquit = mySignal(SIGQUIT, SIG_IGN);
++ prevstop = mySignal(SIGTSTP, SIG_IGN);
++
++ if ((pid = fork()) == 0) {
++ char *env;
++ int n = 0;
++ char *argv[20];
++ char digit[2][11+1];
++ char clip[44+3+1];
++ Str str_url;
++
++ close(STDERR_FILENO); /* Don't output error message. */
++ if (do_anim) {
++ writestr("\x1b[?80h");
++ }
++ else if (!strstr(url, "://") && strcmp(url+strlen(url)-4, ".gif") == 0 &&
++ (str_url = save_first_animation_frame(url))) {
++ url = str_url->ptr;
++ }
++ ttymode_set(ISIG, 0);
++
++ if ((env = getenv("W3M_IMG2SIXEL"))) {
++ char *p;
++ env = Strnew_charp(env)->ptr;
++ while (n < 8 && (p = strchr(env, ' '))) {
++ *p = '\0';
++ if (*env != '\0') {
++ argv[n++] = env;
++ }
++ env = p+1;
++ }
++ if (*env != '\0') {
++ argv[n++] = env;
++ }
++ }
++ else {
++ argv[n++] = "img2sixel";
++ }
++ argv[n++] = "-l";
++ argv[n++] = do_anim ? "auto" : "disable";
++ argv[n++] = "-w";
++ sprintf(digit[0], "%d", w*pixel_per_char_i);
++ argv[n++] = digit[0];
++ argv[n++] = "-h";
++ sprintf(digit[1], "%d", h*pixel_per_line_i);
++ argv[n++] = digit[1];
++ argv[n++] = "-c";
++ sprintf(clip, "%dx%d+%d+%d", sw*pixel_per_char_i, sh*pixel_per_line_i,
++ sx*pixel_per_char_i, sy*pixel_per_line_i);
++ argv[n++] = clip;
++ argv[n++] = url;
++ if (getenv("TERM") && strcmp(getenv("TERM"), "screen") == 0 &&
++ (!getenv("SCREEN_VARIANT") || strcmp(getenv("SCREEN_VARIANT"), "sixel") != 0)) {
++ argv[n++] = "-P";
++ }
++ argv[n++] = NULL;
++ execvp(argv[0],argv);
++ exit(0);
++ }
++ else if (pid > 0) {
++ int status;
++ waitpid(pid, &status, 0);
++ ttymode_reset(ISIG, 0);
++ mySignal(SIGINT, previntr);
++ mySignal(SIGQUIT, prevquit);
++ mySignal(SIGTSTP, prevstop);
++ if (do_anim) {
++ writestr("\x1b[?80l");
++ }
++ }
++
++ MOVE(Currentbuf->cursorY,Currentbuf->cursorX);
++}
++
++int
++get_pixel_per_cell(int *ppc, int *ppl)
++{
++ fd_set rfd;
++ struct timeval tval;
++ char buf[100];
++ char *p;
++ ssize_t len;
++ ssize_t left;
++ int wp,hp,wc,hc;
++ int i;
++
++#ifdef TIOCGWINSZ
++ struct winsize ws;
++ if (ioctl(tty, TIOCGWINSZ, &ws) == 0 && ws.ws_ypixel > 0 && ws.ws_row > 0 &&
++ ws.ws_xpixel > 0 && ws.ws_col > 0) {
++ *ppc = ws.ws_xpixel / ws.ws_col;
++ *ppl = ws.ws_ypixel / ws.ws_row;
++ return 1;
++ }
++#endif
++
++ fputs("\x1b[14t\x1b[18t",ttyf); flush_tty();
++
++ p = buf;
++ left = sizeof(buf) - 1;
++ for (i = 0; i < 10; i++) {
++ tval.tv_usec = 200000; /* 0.2 sec * 10 */
++ tval.tv_sec = 0;
++ FD_ZERO(&rfd);
++ FD_SET(tty,&rfd);
++ if (select(tty+1,&rfd,NULL,NULL,&tval) <= 0 || ! FD_ISSET(tty,&rfd))
++ continue;
++
++ if ((len = read(tty,p,left)) <= 0)
++ continue;
++ p[len] = '\0';
++
++ if (sscanf(buf,"\x1b[4;%d;%dt\x1b[8;%d;%dt",&hp,&wp,&hc,&wc) == 4) {
++ if (wp > 0 && wc > 0 && hp > 0 && hc > 0) {
++ *ppc = wp / wc;
++ *ppl = hp / hc;
++ return 1;
++ }
++ else {
++ return 0;
++ }
++ }
++ p += len;
++ left -= len;
++ }
++
++ return 0;
++}
++#endif /* USE_IMAGE */
++
+ #ifdef USE_MOUSE
+ #define W3M_TERM_INFO(name, title, mouse) name, title, mouse
+ #define NEED_XTERM_ON (1)
+@@ -634,7 +894,8 @@ reset_tty(void)
+ writestr(T_se); /* reset terminal */
+ flush_tty();
+ TerminalSet(tty, &d_ioval);
+- close_tty();
++ if (tty != 2)
++ close_tty();
+ }
+
+ static MySignalHandler
+@@ -953,7 +1214,6 @@ addch(char pc)
+ {
+ l_prop *pr;
+ int dest, i;
+- short *dirty;
+ #ifdef USE_M17N
+ static Str tmp = NULL;
+ char **p;
+@@ -975,7 +1235,6 @@ addch(char pc)
+ return;
+ p = ScreenImage[CurLine]->lineimage;
+ pr = ScreenImage[CurLine]->lineprop;
+- dirty = &ScreenImage[CurLine]->isdirty;
+
+ #ifndef USE_M17N
+ /* Eliminate unprintables according to * iso-8859-*.
+@@ -1986,6 +2245,10 @@ skip_escseq(void)
+ getch();
+ getch();
+ getch();
++ } else if (is_xterm && c == '<') {
++ c = getch();
++ while (IS_DIGIT(c) || c == ';')
++ c = getch();
+ }
+ else
+ #endif
+@@ -2027,8 +2290,8 @@ sleep_till_anykey(int sec, int purge)
+
+ #ifdef USE_MOUSE
+
+-#define XTERM_ON {fputs("\033[?1001s\033[?1000h",ttyf); flush_tty();}
+-#define XTERM_OFF {fputs("\033[?1000l\033[?1001r",ttyf); flush_tty();}
++#define XTERM_ON {fputs("\033[?1001s\033[?1000h\033[?1006h",ttyf); flush_tty();}
++#define XTERM_OFF {fputs("\033[?1006l\033[?1000l\033[?1001r",ttyf); flush_tty();}
+ #define CYGWIN_ON {fputs("\033[?1000h",ttyf); flush_tty();}
+ #define CYGWIN_OFF {fputs("\033[?1000l",ttyf); flush_tty();}
+
+diff --git a/url.c b/url.c
+index ed6062e..c90cd9f 100644
+--- a/url.c
++++ b/url.c
+@@ -121,6 +121,7 @@ static struct table2 DefaultGuess[] = {
+ };
+
+ static void add_index_file(ParsedURL *pu, URLFile *uf);
++static char * schemeNumToName(int scheme);
+
+ /* #define HTTP_DEFAULT_FILE "/index.html" */
+
+@@ -326,6 +327,7 @@ openSSLHandle(int sock, char *hostname, char **p_cert)
+ SSL_load_error_strings();
+ if (!(ssl_ctx = SSL_CTX_new(SSLv23_client_method())))
+ goto eend;
++ SSL_CTX_set_cipher_list(ssl_ctx, "DEFAULT:!LOW:!RC4:!EXP");
+ option = SSL_OP_ALL;
+ if (ssl_forbid_method) {
+ if (strchr(ssl_forbid_method, '2'))
+@@ -337,7 +339,15 @@ openSSLHandle(int sock, char *hostname, char **p_cert)
+ if (strchr(ssl_forbid_method, 'T'))
+ option |= SSL_OP_NO_TLSv1;
+ }
++#ifdef SSL_OP_NO_COMPRESSION
++ option |= SSL_OP_NO_COMPRESSION;
++#endif
+ SSL_CTX_set_options(ssl_ctx, option);
++
++#ifdef SSL_MODE_RELEASE_BUFFERS
++ SSL_CTX_set_mode (ssl_ctx, SSL_MODE_RELEASE_BUFFERS);
++#endif
++
+ #ifdef USE_SSL_VERIFY
+ /* derived from openssl-0.9.5/apps/s_{client,cb}.c */
+ #if 1 /* use SSL_get_verify_result() to verify cert */
+@@ -444,6 +454,8 @@ baseURL(Buffer *buf)
+ /* <BASE> tag is defined in the document */
+ return buf->baseURL;
+ }
++ else if (IS_EMPTY_PARSED_URL(&buf->currentURL))
++ return NULL;
+ else
+ return &buf->currentURL;
+ }
+@@ -638,16 +650,21 @@ openSocket(char *const hostname,
+ #define COPYPATH_SPC_ALLOW 0
+ #define COPYPATH_SPC_IGNORE 1
+ #define COPYPATH_SPC_REPLACE 2
++#define COPYPATH_SPC_MASK 3
++#define COPYPATH_LOWERCASE 4
+
+ static char *
+ copyPath(char *orgpath, int length, int option)
+ {
+ Str tmp = Strnew();
+- while (*orgpath && length != 0) {
+- if (IS_SPACE(*orgpath)) {
+- switch (option) {
++ char ch;
++ while ((ch = *orgpath) != 0 && length != 0) {
++ if (option & COPYPATH_LOWERCASE)
++ ch = TOLOWER(ch);
++ if (IS_SPACE(ch)) {
++ switch (option & COPYPATH_SPC_MASK) {
+ case COPYPATH_SPC_ALLOW:
+- Strcat_char(tmp, *orgpath);
++ Strcat_char(tmp, ch);
+ break;
+ case COPYPATH_SPC_IGNORE:
+ /* do nothing */
+@@ -658,7 +675,7 @@ copyPath(char *orgpath, int length, int option)
+ }
+ }
+ else
+- Strcat_char(tmp, *orgpath);
++ Strcat_char(tmp, ch);
+ orgpath++;
+ length--;
+ }
+@@ -668,22 +685,14 @@ copyPath(char *orgpath, int length, int option)
+ void
+ parseURL(char *url, ParsedURL *p_url, ParsedURL *current)
+ {
+- char *p, *q;
++ char *p, *q, *qq;
+ Str tmp;
+
+ url = url_quote(url); /* quote 0x01-0x20, 0x7F-0xFF */
+
+ p = url;
++ copyParsedURL(p_url, NULL);
+ p_url->scheme = SCM_MISSING;
+- p_url->port = 0;
+- p_url->user = NULL;
+- p_url->pass = NULL;
+- p_url->host = NULL;
+- p_url->is_nocache = 0;
+- p_url->file = NULL;
+- p_url->real_file = NULL;
+- p_url->query = NULL;
+- p_url->label = NULL;
+
+ /* RFC1808: Relative Uniform Resource Locators
+ * 4. Resolving Relative URLs
+@@ -694,7 +703,7 @@ parseURL(char *url, ParsedURL *p_url, ParsedURL *current)
+ goto do_label;
+ }
+ #if defined( __EMX__ ) || defined( __CYGWIN__ )
+- if (!strncmp(url, "file://localhost/", 17)) {
++ if (!strncasecmp(url, "file://localhost/", 17)) {
+ p_url->scheme = SCM_LOCAL;
+ p += 17 - 1;
+ url += 17 - 1;
+@@ -802,19 +811,20 @@ parseURL(char *url, ParsedURL *p_url, ParsedURL *current)
+ /* scheme://user:pass@host or
+ * scheme://host:port
+ */
+- p_url->host = copyPath(q, p - q, COPYPATH_SPC_IGNORE);
++ qq = q;
+ q = ++p;
+ while (*p && strchr("@/?#", *p) == NULL)
+ p++;
+ if (*p == '@') {
+ /* scheme://user:pass@... */
++ p_url->user = copyPath(qq, q - 1 - qq, COPYPATH_SPC_IGNORE);
+ p_url->pass = copyPath(q, p - q, COPYPATH_SPC_ALLOW);
+- q = ++p;
+- p_url->user = p_url->host;
+- p_url->host = NULL;
++ p++;
+ goto analyze_url;
+ }
+ /* scheme://host:port/ */
++ p_url->host = copyPath(qq, q - 1 - qq,
++ COPYPATH_SPC_IGNORE | COPYPATH_LOWERCASE);
+ tmp = Strnew_charp_n(q, p - q);
+ p_url->port = atoi(tmp->ptr);
+ /* *p is one of ['\0', '/', '?', '#'] */
+@@ -822,14 +832,15 @@ parseURL(char *url, ParsedURL *p_url, ParsedURL *current)
+ case '@':
+ /* scheme://user@... */
+ p_url->user = copyPath(q, p - q, COPYPATH_SPC_IGNORE);
+- q = ++p;
++ p++;
+ goto analyze_url;
+ case '\0':
+ /* scheme://host */
+ case '/':
+ case '?':
+ case '#':
+- p_url->host = copyPath(q, p - q, COPYPATH_SPC_IGNORE);
++ p_url->host = copyPath(q, p - q,
++ COPYPATH_SPC_IGNORE | COPYPATH_LOWERCASE);
+ p_url->port = DefaultPort[p_url->scheme];
+ break;
+ }
+@@ -956,12 +967,16 @@ parseURL(char *url, ParsedURL *p_url, ParsedURL *current)
+ p_url->label = NULL;
+ }
+
+-#define initParsedURL(p) bzero(p,sizeof(ParsedURL))
+ #define ALLOC_STR(s) ((s)==NULL?NULL:allocStr(s,-1))
+
+ void
+-copyParsedURL(ParsedURL *p, ParsedURL *q)
++copyParsedURL(ParsedURL *p, const ParsedURL *q)
+ {
++ if (q == NULL) {
++ memset(p, 0, sizeof(ParsedURL));
++ p->scheme = SCM_UNKNOWN;
++ return;
++ }
+ p->scheme = q->scheme;
+ p->port = q->port;
+ p->is_nocache = q->is_nocache;
+@@ -1280,9 +1295,23 @@ getURLScheme(char **url)
+ }
+
+ static char *
++schemeNumToName(int scheme)
++{
++ int i;
++
++ for (i = 0; schemetable[i].cmdname != NULL; i++) {
++ if (schemetable[i].cmd == scheme)
++ return schemetable[i].cmdname;
++ }
++ return NULL;
++}
++
++static char *
+ otherinfo(ParsedURL *target, ParsedURL *current, char *referer)
+ {
+ Str s = Strnew();
++ const int *no_referer_ptr;
++ int no_referer;
+
+ Strcat_charp(s, "User-Agent: ");
+ if (UserAgent == NULL || *UserAgent == '\0')
+@@ -1306,7 +1335,12 @@ otherinfo(ParsedURL *target, ParsedURL *current, char *referer)
+ Strcat_charp(s, "Pragma: no-cache\r\n");
+ Strcat_charp(s, "Cache-control: no-cache\r\n");
+ }
+- if (!NoSendReferer) {
++ no_referer = NoSendReferer;
++ no_referer_ptr = query_SCONF_NO_REFERER_FROM(current);
++ no_referer = no_referer || (no_referer_ptr && *no_referer_ptr);
++ no_referer_ptr = query_SCONF_NO_REFERER_TO(target);
++ no_referer = no_referer || (no_referer_ptr && *no_referer_ptr);
++ if (!no_referer) {
+ #ifdef USE_SSL
+ if (current && current->scheme == SCM_HTTPS && target->scheme != SCM_HTTPS) {
+ /* Don't send Referer: if https:// -> http:// */
+@@ -1314,6 +1348,7 @@ otherinfo(ParsedURL *target, ParsedURL *current, char *referer)
+ else
+ #endif
+ if (referer == NULL && current && current->scheme != SCM_LOCAL &&
++ current->scheme != SCM_LOCAL_CGI &&
+ (current->scheme != SCM_FTP ||
+ (current->user == NULL && current->pass == NULL))) {
+ char *p = current->label;
+@@ -1384,7 +1419,6 @@ HTTPrequest(ParsedURL *pu, ParsedURL *current, HRequest *hr, TextList *extra)
+ {
+ Str tmp;
+ TextListItem *i;
+- int seen_www_auth = 0;
+ #ifdef USE_COOKIE
+ Str cookie;
+ #endif /* USE_COOKIE */
+@@ -1400,7 +1434,6 @@ HTTPrequest(ParsedURL *pu, ParsedURL *current, HRequest *hr, TextList *extra)
+ for (i = extra->first; i != NULL; i = i->next) {
+ if (strncasecmp(i->ptr, "Authorization:",
+ sizeof("Authorization:") - 1) == 0) {
+- seen_www_auth = 1;
+ #ifdef USE_SSL
+ if (hr->command == HR_COMMAND_CONNECT)
+ continue;
+@@ -1430,20 +1463,20 @@ HTTPrequest(ParsedURL *pu, ParsedURL *current, HRequest *hr, TextList *extra)
+ #endif /* USE_COOKIE */
+ if (hr->command == HR_COMMAND_POST) {
+ if (hr->request->enctype == FORM_ENCTYPE_MULTIPART) {
+- Strcat_charp(tmp, "Content-type: multipart/form-data; boundary=");
++ Strcat_charp(tmp, "Content-Type: multipart/form-data; boundary=");
+ Strcat_charp(tmp, hr->request->boundary);
+ Strcat_charp(tmp, "\r\n");
+ Strcat(tmp,
+- Sprintf("Content-length: %ld\r\n", hr->request->length));
++ Sprintf("Content-Length: %ld\r\n", hr->request->length));
+ Strcat_charp(tmp, "\r\n");
+ }
+ else {
+ if (!override_content_type) {
+ Strcat_charp(tmp,
+- "Content-type: application/x-www-form-urlencoded\r\n");
++ "Content-Type: application/x-www-form-urlencoded\r\n");
+ }
+ Strcat(tmp,
+- Sprintf("Content-length: %ld\r\n", hr->request->length));
++ Sprintf("Content-Length: %ld\r\n", hr->request->length));
+ if (header_string)
+ Strcat(tmp, header_string);
+ Strcat_charp(tmp, "\r\n");
+@@ -1603,7 +1636,7 @@ openURL(char *url, ParsedURL *pu, ParsedURL *current,
+ pu->host != NULL && !check_no_proxy(pu->host)) {
+ hr->flag |= HR_FLAG_PROXY;
+ sock = openSocket(FTP_proxy_parsed.host,
+- schemetable[FTP_proxy_parsed.scheme].cmdname,
++ schemeNumToName(FTP_proxy_parsed.scheme),
+ FTP_proxy_parsed.port);
+ if (sock < 0)
+ return uf;
+@@ -1645,15 +1678,15 @@ openURL(char *url, ParsedURL *pu, ParsedURL *current,
+ }
+ else if (pu->scheme == SCM_HTTPS) {
+ sock = openSocket(HTTPS_proxy_parsed.host,
+- schemetable[HTTPS_proxy_parsed.scheme].
+- cmdname, HTTPS_proxy_parsed.port);
++ schemeNumToName(HTTPS_proxy_parsed.scheme),
++ HTTPS_proxy_parsed.port);
+ sslh = NULL;
+ }
+ else {
+ #endif /* USE_SSL */
+ sock = openSocket(HTTP_proxy_parsed.host,
+- schemetable[HTTP_proxy_parsed.scheme].
+- cmdname, HTTP_proxy_parsed.port);
++ schemeNumToName(HTTP_proxy_parsed.scheme),
++ HTTP_proxy_parsed.port);
+ #ifdef USE_SSL
+ sslh = NULL;
+ }
+@@ -1685,8 +1718,7 @@ openURL(char *url, ParsedURL *pu, ParsedURL *current,
+ }
+ }
+ else {
+- sock = openSocket(pu->host,
+- schemetable[pu->scheme].cmdname, pu->port);
++ sock = openSocket(pu->host, schemeNumToName(pu->scheme), pu->port);
+ if (sock < 0) {
+ *status = HTST_MISSING;
+ return uf;
+@@ -1750,7 +1782,7 @@ openURL(char *url, ParsedURL *pu, ParsedURL *current,
+ pu->host != NULL && !check_no_proxy(pu->host)) {
+ hr->flag |= HR_FLAG_PROXY;
+ sock = openSocket(GOPHER_proxy_parsed.host,
+- schemetable[GOPHER_proxy_parsed.scheme].cmdname,
++ schemeNumToName(GOPHER_proxy_parsed.scheme),
+ GOPHER_proxy_parsed.port);
+ if (sock < 0)
+ return uf;
+@@ -1758,8 +1790,7 @@ openURL(char *url, ParsedURL *pu, ParsedURL *current,
+ tmp = HTTPrequest(pu, current, hr, extra_header);
+ }
+ else {
+- sock = openSocket(pu->host,
+- schemetable[pu->scheme].cmdname, pu->port);
++ sock = openSocket(pu->host, schemeNumToName(pu->scheme), pu->port);
+ if (sock < 0)
+ return uf;
+ if (pu->file == NULL)
+@@ -2049,7 +2080,7 @@ filename_extension(char *path, int is_url)
+ break;
+ }
+ if (*last_dot == '.') {
+- for (i = 1; last_dot[i] && i < 8; i++) {
++ for (i = 1; i < 8 && last_dot[i]; i++) {
+ if (is_url && !IS_ALNUM(last_dot[i]))
+ break;
+ }
+@@ -2234,3 +2265,66 @@ schemeToProxy(int scheme)
+ }
+ return pu;
+ }
++
++#ifdef USE_M17N
++wc_ces
++url_to_charset(const char *url, const ParsedURL *base, wc_ces doc_charset)
++{
++ const ParsedURL *pu;
++ ParsedURL pu_buf;
++ const wc_ces *csptr;
++
++ if (url && *url && *url != '#') {
++ parseURL2((char *)url, &pu_buf, (ParsedURL *)base);
++ pu = &pu_buf;
++ } else {
++ pu = base;
++ }
++ if (pu && (pu->scheme == SCM_LOCAL || pu->scheme == SCM_LOCAL_CGI))
++ return SystemCharset;
++ csptr = query_SCONF_URL_CHARSET(pu);
++ return (csptr && *csptr) ? *csptr :
++ doc_charset ? doc_charset : DocumentCharset;
++}
++
++char *
++url_encode(const char *url, const ParsedURL *base, wc_ces doc_charset)
++{
++ return url_quote_conv((char *)url,
++ url_to_charset(url, base, doc_charset));
++}
++
++#if 0 /* unused */
++char *
++url_decode(const char *url, const ParsedURL *base, wc_ces doc_charset)
++{
++ if (!DecodeURL)
++ return (char *)url;
++ return url_unquote_conv((char *)url,
++ url_to_charset(url, base, doc_charset));
++}
++#endif
++
++char *
++url_decode2(const char *url, const Buffer *buf)
++{
++ wc_ces url_charset;
++
++ if (!DecodeURL)
++ return (char *)url;
++ url_charset = buf ?
++ url_to_charset(url, baseURL((Buffer *)buf), buf->document_charset) :
++ url_to_charset(url, NULL, 0);
++ return url_unquote_conv((char *)url, url_charset);
++}
++
++#else /* !defined(USE_M17N) */
++
++char *
++url_decode0(const char *url)
++{
++ if (!DecodeURL)
++ return (char *)url;
++ return url_unquote_conv((char *)url, 0);
++}
++#endif /* !defined(USE_M17N) */
+diff --git a/version.c.in b/version.c.in
+index 31d30e4..ab25163 100644
+--- a/version.c.in
++++ b/version.c.in
+@@ -1,5 +1,5 @@
+ /* $Id: version.c.in,v 1.49 2012/05/22 09:45:56 inu Exp $ */
+-#define CURRENT_VERSION "w3m/0.5.3+cvs"
++#define CURRENT_VERSION "w3m/0.5.3+gitYYYYMMDD"
+
+ #ifndef FM_H
+ char *w3m_version = CURRENT_VERSION;
+diff --git a/w3m-doc/outline.html.in b/w3m-doc/outline.html.in
+index 60bda47..4ed2a59 100644
+--- a/w3m-doc/outline.html.in
++++ b/w3m-doc/outline.html.in
+@@ -146,8 +146,8 @@ w3m ^[$B$N^[(Bmake^[$B;~$K;XDj$7$?%-!<A`:n$K$h$C$F!"%X%k%W%U%!%$%k$,0[$J$j$^$9!#^[(B
+ <TR> <TD>c</TD> <TD>^[$B8=%Z!<%8$N^[(B URL ^[$B$rI=<(^[(B</TD></TR>
+ <TR> <TD>=</TD> <TD>^[$B8=%I%-%e%a%s%H$N>pJs$rI=<(^[(B</TD></TR>
+ <TR> <TD>F</TD> <TD>^[$B%U%l!<%`$rI=<($9$k^[(B</TD></TR>
+- <TR> <TD>M</TD> <TD>^[$B8=%Z!<%8$r30It%V%i%&%6$GI=<($9$k^[(B(2M,3M ^[$B$G^[(B2^[$BHVL\$H^[(B3^[$BHVL\$N%V%i%&%6$r8F$S$@$9^[(B)</TD></TR>
+- <TR> <TD>ESC M</TD> <TD>^[$B%j%s%/@h$r30It%V%i%&%6$GI=<($9$k^[(B(2ESC M,3ESC M ^[$B$G^[(B2^[$BHVL\$H^[(B3^[$BHVL\$N%V%i%&%6$r8F$S$@$9^[(B)</TD></TR>
++ <TR> <TD>M</TD> <TD>^[$B8=%Z!<%8$r30It%V%i%&%6$GI=<($9$k^[(B(2M, 3M, ..., 9M ^[$B$G^[(B2^[$BHVL\!$^[(B3^[$BHVL\!$^[(B9^[$BHVL\$N%V%i%&%6$r8F$S$@$9^[(B)</TD></TR>
++ <TR> <TD>ESC M</TD> <TD>^[$B%j%s%/@h$r30It%V%i%&%6$GI=<($9$k^[(B(2ESC M, 3ESC M, ..., 9ESC M ^[$B$G^[(B2^[$BHVL\!$^[(B3^[$BHVL\!$^[(B9^[$BHVL\$N%V%i%&%6$r8F$S$@$9^[(B)</TD></TR>
+ </TABLE>
+
+ <H5>^[$B%U%!%$%k^[(B/^[$B%9%H%j!<%`A`:n^[(B</H5>
+@@ -257,8 +257,8 @@ w3m ^[$B$N^[(Bmake^[$B;~$K;XDj$7$?%-!<A`:n$K$h$C$F!"%X%k%W%U%!%$%k$,0[$J$j$^$9!#^[(B
+ <TR><TD>c<TD>^[$B8=:_$NJ8=q$N^[(B URL ^[$B$rI=<($7$^$9!%^[(B
+ <TR><TD>=<TD>^[$B8=:_$NJ8=q$K4X$9$k>pJs$rI=<($7$^$9!%^[(B
+ <TR><TD>F<TD><FRAMESET> ^[$B$r4^$`J8=q$rI=<($7$F$$$k$H$-$K!$^[(B<FRAME> ^[$B%?%0$N;X$9J#?t$NJ8=q$r^[(B1^[$B$D$NJ8=q$KJQ49$7$FI=<($7$^$9!%^[(B
+-<TR><TD>M<TD>^[$B8=:_8+$F$$$k%Z!<%8$r!$30It%V%i%&%6$r;H$C$FI=<($7$^$9!%^[(B 2M, 3M ^[$B$G^[(B2^[$BHVL\$H^[(B3^[$BHVL\$N%V%i%&%6$r;H$$$^$9!%^[(B
+-<TR><TD>ESC M<TD>^[$B8=:_$N%j%s%/@h$r!$30It%V%i%&%6$r;H$C$FI=<($7$^$9!%^[(B 2ESC M, 3ESC M ^[$B$G^[(B2^[$BHVL\$H^[(B3^[$BHVL\$N%V%i%&%6$r;H$$$^$9!%^[(B
++<TR><TD>M<TD>^[$B8=:_8+$F$$$k%Z!<%8$r!$30It%V%i%&%6$r;H$C$FI=<($7$^$9!%^[(B 2M, 3M, ..., 9M ^[$B$G^[(B2^[$BHVL\!$^[(B3^[$BHVL\!$^[(B9^[$BHVL\$N%V%i%&%6$r;H$$$^$9!%^[(B
++<TR><TD>ESC M<TD>^[$B8=:_$N%j%s%/@h$r!$30It%V%i%&%6$r;H$C$FI=<($7$^$9!%^[(B 2ESC M, 3ESC M, ..., 9ESC M ^[$B$G^[(B2^[$BHVL\!$^[(B3^[$BHVL\!$^[(B9^[$BHVL\$N%V%i%&%6$r;H$$$^$9!%^[(B
+ </table>
+
+ <H5>^[$B%U%!%$%k$H^[(B URL ^[$B4X78$NA`:n^[(B</H5>
+diff --git a/w3m-doc/sample/keymap.cgi b/w3m-doc/sample/keymap.cgi
+index f68f5fb..d92c60f 100755
+--- a/w3m-doc/sample/keymap.cgi
++++ b/w3m-doc/sample/keymap.cgi
+@@ -203,7 +203,6 @@ GOTO_LINK
+ HELP
+ HISTORY
+ INFO
+-INIT_MAILCAP
+ INTERRUPT
+ LEFT
+ LINE_BEGIN
+diff --git a/w3mbookmark.c b/w3mbookmark.c
+index 4355536..a306f26 100644
+--- a/w3mbookmark.c
++++ b/w3mbookmark.c
+@@ -79,6 +79,7 @@ print_bookmark_panel(char *bmark, char *url, char *title, char *charset)
+ }
+ }
+ printf("</select>\n");
++ fclose(f);
+ }
+ printf(bkmark_src2, html_quote(url), html_quote(title));
+ }
+@@ -99,7 +100,7 @@ create_new_bookmark(char *bmark, char *section, char *title, char *url,
+ fprintf(f, "<body>\n<h1>Bookmarks</h1>\n");
+ fprintf(f, "<h2>%s</h2>\n<ul>\n", section);
+ fprintf(f, "<li><a href=\"%s\">%s</a>\n", url, title);
+- fprintf(f, end_section);
++ fprintf(f, "%s", end_section);
+ fprintf(f, "</ul>\n</body>\n</html>\n");
+ fclose(f);
+ }
+@@ -168,7 +169,10 @@ insert_bookmark(char *bmark, struct parsed_tagarg *data)
+ /* In this case, a new bookmark is appeneded after the bookmark file */
+ return create_new_bookmark(bmark, section, title, url, "a");
+ }
+- f = fopen(bmark, "w");
++ if ((f = fopen(bmark, "w")) == NULL) {
++ printf("\nCannot open bookmark %s\n", bmark);
++ return FALSE;
++ }
+ while (tl->nitem) {
+ fputs(popText(tl), f);
+ }
+diff --git a/w3mhelp-lynx_en.html.in b/w3mhelp-lynx_en.html.in
+index 7448877..d073b0f 100644
+--- a/w3mhelp-lynx_en.html.in
++++ b/w3mhelp-lynx_en.html.in
+@@ -43,20 +43,20 @@ w3m</A>
+ <table cellpadding=0>
+ <TR><TD WIDTH=100>RET, C-f, Right arrow<TD>Follow hyperlink
+ <TR><TD>d, ESC RET<TD>Save link to file
+-<TR><TD>u<TD>Peek link URL
+-<TR><TD>i<TD>Peek image URL
++<TR><TD>u<TD>Peek at link URL
++<TR><TD>i<TD>Peek at image URL
+ <TR><TD>I<TD>View inline image
+ <TR><TD>ESC I<TD>Save inline image to file
+-<TR><TD>:<TD>Mark URL-like strings as anchors
+-<TR><TD>ESC :<TD>Mark Message-ID-like strings as news anchors
+-<TR><TD>c<TD>Peek current URL
++<TR><TD>:<TD>Mark URL-like strings as links
++<TR><TD>ESC :<TD>Mark Message-ID-like strings as links
++<TR><TD>c<TD>Peek at current URL
+ <TR><TD>=<TD>Display information about current document
+-<TR><TD>C-h<TD>View history of URL
+-<TR><TD>F<TD>Render frame
++<TR><TD>C-h<TD>View browser history
++<TR><TD>F<TD>Render frames
+ <TR><TD>M<TD>Browse current document using external browser
+-(use 2M and 3M to invoke second and third browser)
++(prefix 2, 3, ..., or 9 to invoke alternate configured browsers, e.g. 3 M)
+ <TR><TD>ESC M<TD>Browse link using external browser
+-(use 2ESC M and 3ESC M to invoke second and third browser)
++(prefixed as above, e.g. 3ESC M)
+ </table>
+
+ <H2>File/Stream operation</H2>
+@@ -98,7 +98,7 @@ w3m</A>
+ <table cellpadding=0>
+ <TR><TD WIDTH=100>/, C-s<TD>Search forward
+ <TR><TD>n<TD>Search next
+-<TR><TD>w<TD>Toggle wrap search mode
++<TR><TD>w<TD>Toggle search wrap mode
+ </table>
+
+ <H2>Mark operation</H2>
+@@ -121,7 +121,7 @@ w3m</A>
+ <TR><TD>Q<TD>Quit without confirmation
+ </table>
+
+-<H2>Line-edit mode</H2>
++<H2>Line-editing mode</H2>
+ <table cellpadding=0>
+ <TR><TD WIDTH=100>C-f<TD>Move cursor forward
+ <TR><TD>C-b<TD>Move cursor backward
+diff --git a/w3mhelp-lynx_ja.html.in b/w3mhelp-lynx_ja.html.in
+index d160984..828b5a3 100644
+--- a/w3mhelp-lynx_ja.html.in
++++ b/w3mhelp-lynx_ja.html.in
+@@ -58,9 +58,9 @@
+ <TR><TD>F<TD><FRAMESET>¤ò´Þ¤àʸ½ñ¤òɽ¼¨¤·¤Æ¤¤¤ë¤È¤¤Ë¡¤<FRAME>
+ ¥¿¥°¤Î»Ø¤¹Ê£¿ô¤Îʸ½ñ¤ò1¤Ä¤Îʸ½ñ¤ËÊÑ´¹¤·¤Æɽ¼¨¤·¤Þ¤¹¡¥
+ <TR><TD>M<TD>¸½ºß¸«¤Æ¤¤¤ë¥Ú¡¼¥¸¤ò¡¤³°Éô¥Ö¥é¥¦¥¶¤ò»È¤Ã¤Æɽ¼¨¤·¤Þ¤¹¡¥
+-2M, 3M ¤Ç2ÈÖÌܤÈ3ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
++2M, 3M, ..., 9M ¤Ç2ÈÖÌÜ¡¤3ÈÖÌÜ¡¤9ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
+ <TR><TD>ESC M<TD>¸½ºß¤Î¥ê¥ó¥¯Àè¤ò¡¤³°Éô¥Ö¥é¥¦¥¶¤ò»È¤Ã¤Æɽ¼¨¤·¤Þ¤¹¡¥
+-2ESC M, 3ESC M ¤Ç2ÈÖÌܤÈ3ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
++2ESC M, 3ESC M, ..., 9ESC M ¤Ç2ÈÖÌÜ¡¤3ÈÖÌÜ¡¤9ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
+ </table>
+
+ <H3>¥Õ¥¡¥¤¥ë¤ÈURL´Ø·¸¤ÎÁàºî</H3>
+diff --git a/w3mhelp-w3m_en.html.in b/w3mhelp-w3m_en.html.in
+index eb46e8a..a692142 100644
+--- a/w3mhelp-w3m_en.html.in
++++ b/w3mhelp-w3m_en.html.in
+@@ -47,21 +47,21 @@ w3m</A>
+ <table cellpadding=0>
+ <TR><TD WIDTH=100>RET<TD>Follow hyperlink
+ <TR><TD>a, ESC RET<TD>Save link to file
+-<TR><TD>u<TD>Peek link URL
+-<TR><TD>i<TD>Peek image URL
++<TR><TD>u<TD>Peek at link URL
++<TR><TD>i<TD>Peek at image URL
+ <TR><TD>I<TD>View inline image
+ <TR><TD>ESC I<TD>Save inline image to file
+-<TR><TD>:<TD>Mark URL-like strings as anchors
+-<TR><TD>ESC :<TD>Mark Message-ID-like strings as news anchors
+-<TR><TD>c<TD>Peek current URL
++<TR><TD>:<TD>Mark URL-like strings as links
++<TR><TD>ESC :<TD>Mark Message-ID-like strings as links
++<TR><TD>c<TD>Peek at current URL
+ <TR><TD>=<TD>Display information about current document
+ <TR><TD>C-g<TD>Show current line number
+-<TR><TD>C-h<TD>View history of URL
+-<TR><TD>F<TD>Render frame
++<TR><TD>C-h<TD>View browser history
++<TR><TD>F<TD>Render frames
+ <TR><TD>M<TD>Browse current document using external browser
+-(use 2M and 3M to invoke second and third browser)
++(prefix 2, 3, ..., or 9 to invoke alternate configured browsers, e.g. 3 M)
+ <TR><TD>ESC M<TD>Browse link using external browser
+-(use 2ESC M and 3ESC M to invoke second and third browser)
++(prefixed as above, e.g. 3ESC M)
+ </table>
+
+ <H2>File/Stream operation</H2>
+@@ -105,7 +105,7 @@ w3m</A>
+ <TR><TD>?,C-r<TD>Search backward
+ <TR><TD>n<TD>Search next
+ <TR><TD>N<TD>Search previous
+-<TR><TD>C-w<TD>Toggle wrap search mode
++<TR><TD>C-w<TD>Toggle search wrap mode
+ </table>
+
+ <H2>Dictionary look-up</H2>
+@@ -134,7 +134,7 @@ w3m</A>
+ <TR><TD>Q<TD>Quit without confirmation
+ </table>
+
+-<H2>Line-edit mode</H2>
++<H2>Line-editing mode</H2>
+ <table cellpadding=0>
+ <TR><TD WIDTH=100>C-f<TD>Move cursor forward
+ <TR><TD>C-b<TD>Move cursor backward
+diff --git a/w3mhelp-w3m_ja.html.in b/w3mhelp-w3m_ja.html.in
+index 95464ab..72cb849 100644
+--- a/w3mhelp-w3m_ja.html.in
++++ b/w3mhelp-w3m_ja.html.in
+@@ -61,8 +61,8 @@
+ <TR> <TD>C-g</TD> <TD>¥Ú¡¼¥¸Ãæ¤Ç¤Î¸½ºß°ÌÃÖ¤òɽ¼¨</TD></TR>
+ <TR> <TD>C-h</TD> <TD>URLÍúÎò¤òɽ¼¨</TD></TR>
+ <TR> <TD>F</TD> <TD>¥Õ¥ì¡¼¥à¤òɽ¼¨¤¹¤ë</TD></TR>
+- <TR> <TD>M</TD> <TD>¸½¥Ú¡¼¥¸¤ò³°Éô¥Ö¥é¥¦¥¶¤Çɽ¼¨¤¹¤ë(2M,3M¤Ç2ÈÖÌܤÈ3ÈÖÌܤΥ֥饦¥¶¤ò¸Æ¤Ó¤À¤¹)</TD></TR>
+- <TR> <TD>ESC M</TD> <TD>¥ê¥ó¥¯Àè¤ò³°Éô¥Ö¥é¥¦¥¶¤Çɽ¼¨¤¹¤ë(2ESC M,3ESC M¤Ç2ÈÖÌܤÈ3ÈÖÌܤΥ֥饦¥¶¤ò¸Æ¤Ó¤À¤¹)</TD></TR>
++ <TR> <TD>M</TD> <TD>¸½¥Ú¡¼¥¸¤ò³°Éô¥Ö¥é¥¦¥¶¤Çɽ¼¨¤¹¤ë(2M, 3M, ..., 9M ¤Ç2ÈÖÌÜ¡¤3ÈÖÌÜ¡¤9ÈÖÌܤΥ֥饦¥¶¤ò¸Æ¤Ó¤À¤¹)</TD></TR>
++ <TR> <TD>ESC M</TD> <TD>¥ê¥ó¥¯Àè¤ò³°Éô¥Ö¥é¥¦¥¶¤Çɽ¼¨¤¹¤ë(2ESC M, 3ESC M, ..., 9ESC M ¤Ç2ÈÖÌÜ¡¤3ÈÖÌÜ¡¤9ÈÖÌܤΥ֥饦¥¶¤ò¸Æ¤Ó¤À¤¹)</TD></TR>
+ </TABLE>
+
+ <H2>¥Õ¥¡¥¤¥ë/¥¹¥È¥ê¡¼¥àÁàºî</H2>
+diff --git a/w3mhelperpanel.c b/w3mhelperpanel.c
+index 110794b..96b60a0 100644
+--- a/w3mhelperpanel.c
++++ b/w3mhelperpanel.c
+@@ -115,6 +115,7 @@ printMailcapPanel(char *mailcap)
+ printf("</table>\n<input type=submit name=submit value=\"%s\">\n</form>\n\
+ </body>\n</html>\n",
+ MSG_DOIT);
++ fclose(f);
+ }
+
+ void
+diff --git a/w3mimg/Makefile.in b/w3mimg/Makefile.in
+index dfc550c..8e2ad73 100644
+--- a/w3mimg/Makefile.in
++++ b/w3mimg/Makefile.in
+@@ -16,9 +16,9 @@ IMGCFLAGS=@IMGX11CFLAGS@ @IMGFBCFLAGS@ @IMGWINCFLAGS@
+ IMGOBJS=@IMGOBJS@
+
+ .PHONY: $(SUBDIRS)
+-all: @IMGTARGETS@ w3mimg.a
++all: w3mimg.a
+
+-w3mimg.a: $(IMGOBJS)
++w3mimg.a: w3mimg.o @IMGTARGETS@
+ $(AR) rv $@ $(IMGOBJS)
+ $(RANLIB) $@
+
+diff --git a/w3mimg/fb/fb.c b/w3mimg/fb/fb.c
+index cd11128..7960584 100644
+--- a/w3mimg/fb/fb.c
++++ b/w3mimg/fb/fb.c
+@@ -12,12 +12,24 @@
+ #include <errno.h>
+ #include <sys/ioctl.h>
+ #include <sys/mman.h>
++#if defined(__linux__)
+ #include <linux/fb.h>
++#elif defined(__FreeBSD__)
++#include <sys/fbio.h>
++#endif
++#if defined(__FreeBSD__)
++#include <sys/types.h>
++#include <machine/param.h>
++#endif
+
+ #include "fb.h"
+
+ #define FB_ENV "FRAMEBUFFER"
++#if defined(__linux__)
+ #define FB_DEFDEV "/dev/fb0"
++#elif defined(__FreeBSD__)
++#define FB_DEFDEV "/dev/ttyv0"
++#endif
+
+ #define MONO_OFFSET_8BIT 0x40
+ #define COLORS_MONO_8BIT 0x40
+@@ -38,22 +50,65 @@
+
+ #define IMAGE_SIZE_MAX 10000
+
++#if defined(__linux__)
+ static struct fb_cmap *fb_cmap_create(struct fb_fix_screeninfo *,
+ struct fb_var_screeninfo *);
++#elif defined(__FreeBSD__)
++static video_color_palette_t *fb_cmap_create(video_info_t *video_info,
++ video_adapter_info_t *video_adapter_info);
++#endif
++#if defined(__linux__)
+ static void fb_cmap_destroy(struct fb_cmap *cmap);
++#elif defined(__FreeBSD__)
++static void fb_cmap_destroy(video_color_palette_t *cmap);
++#endif
++#if defined(__linux__)
+ static int fb_fscrn_get(int fbfp, struct fb_fix_screeninfo *scinfo);
++#endif
++#if defined(__linux__)
+ static void *fb_mmap(int fbfp, struct fb_fix_screeninfo *scinfo);
++#elif defined(__FreeBSD__)
++static void *fb_mmap(int fbfp, video_adapter_info_t *video_adapter_info);
++#endif
++#if defined(__linux__)
+ static int fb_munmap(void *buf, struct fb_fix_screeninfo *scinfo);
++#elif defined(__FreeBSD__)
++static int fb_munmap(void *buf, video_adapter_info_t *video_adapter_info);
++#endif
++#if defined(__linux__)
+ static int fb_vscrn_get(int fbfp, struct fb_var_screeninfo *scinfo);
++#endif
++#if defined(__linux__)
+ static int fb_cmap_set(int fbfp, struct fb_cmap *cmap);
++#elif defined(__FreeBSD__)
++static int fb_cmap_set(int fbfp, video_color_palette_t *cmap);
++#endif
++#if defined(__linux__)
+ static int fb_cmap_get(int fbfp, struct fb_cmap *cmap);
++#elif defined(__FreeBSD__)
++static int fb_cmap_get(int fbfp, video_color_palette_t *cmap);
++#endif
+ static int fb_cmap_init(void);
+ static int fb_get_cmap_index(int r, int g, int b);
+ static unsigned long fb_get_packed_color(int r, int g, int b);
++#if defined(__FreeBSD__)
++static int fb_video_mode_get(int fbfp, int *video_mode);
++static int fb_video_info_get(int fbfp, video_info_t *video_info);
++static int fb_video_adapter_info_get(int fbfp, video_adapter_info_t *video_adapter_info);
++#endif
+
++#if defined(__linux__)
+ static struct fb_fix_screeninfo fscinfo;
+ static struct fb_var_screeninfo vscinfo;
++#elif defined(__FreeBSD__)
++static video_info_t video_info;
++static video_adapter_info_t video_adapter_info;
++#endif
++#if defined(__linux__)
+ static struct fb_cmap *cmap = NULL, *cmap_org = NULL;
++#elif defined(__FreeBSD__)
++static video_color_palette_t *cmap = NULL, *cmap_org = NULL;
++#endif
+ static int is_open = FALSE;
+ static int fbfp = -1;
+ static size_t pixel_size = 0;
+@@ -63,6 +118,9 @@ int
+ fb_open(void)
+ {
+ char *fbdev = { FB_DEFDEV };
++#if defined(__FreeBSD__)
++ int video_mode;
++#endif
+
+ if (is_open == TRUE)
+ return 1;
+@@ -76,6 +134,7 @@ fb_open(void)
+ goto ERR_END;
+ }
+
++#if defined(__linux__)
+ if (fb_fscrn_get(fbfp, &fscinfo)) {
+ goto ERR_END;
+ }
+@@ -83,22 +142,69 @@ fb_open(void)
+ if (fb_vscrn_get(fbfp, &vscinfo)) {
+ goto ERR_END;
+ }
++#elif defined(__FreeBSD__)
++ if (fb_video_mode_get(fbfp, &video_mode)) {
++ goto ERR_END;
++ }
++ video_info.vi_mode = video_mode;
++
++ if (fb_video_info_get(fbfp, &video_info)) {
++ goto ERR_END;
++ }
+
++ if (fb_video_adapter_info_get(fbfp, &video_adapter_info)) {
++ goto ERR_END;
++ }
++ if (!(video_info.vi_flags & V_INFO_GRAPHICS) ||
++ !(video_info.vi_flags & V_INFO_LINEAR)) {
++ goto ERR_END;
++ }
++#endif
++
++#if defined(__linux__)
+ if ((cmap = fb_cmap_create(&fscinfo, &vscinfo)) == (struct fb_cmap *)-1) {
+ goto ERR_END;
+ }
++#elif defined(__FreeBSD__)
++ if ((cmap = fb_cmap_create(&video_info, &video_adapter_info)) == (video_color_palette_t *)-1) {
++ goto ERR_END;
++ }
++#endif
+
++#if defined(__linux__)
+ if (!(buf = fb_mmap(fbfp, &fscinfo))) {
+ fprintf(stderr, "Can't allocate memory.\n");
+ goto ERR_END;
+ }
++#elif defined(__FreeBSD__)
++ if (!(buf = fb_mmap(fbfp, &video_adapter_info))) {
++ fprintf(stderr, "Can't allocate memory.\n");
++ goto ERR_END;
++ }
++#endif
+
++#if defined(__linux__)
+ if (fscinfo.type != FB_TYPE_PACKED_PIXELS) {
+ fprintf(stderr, "This type of framebuffer is not supported.\n");
+ goto ERR_END;
+ }
++#elif defined(__FreeBSD__)
++ if (!(video_info.vi_mem_model == V_INFO_MM_PACKED ||
++ video_info.vi_mem_model == V_INFO_MM_DIRECT)) {
++ fprintf(stderr, "This type of framebuffer is not supported.\n");
++ goto ERR_END;
++ }
++#endif
+
++#if defined(__linux__)
+ if (fscinfo.visual == FB_VISUAL_PSEUDOCOLOR && vscinfo.bits_per_pixel == 8) {
++#elif defined(__FreeBSD__)
++ if (video_adapter_info.va_flags & V_ADP_PALETTE &&
++ video_info.vi_mem_model == V_INFO_MM_PACKED &&
++ video_info.vi_depth == 8) {
++#else
++ if (0) {
++#endif
+ if (fb_cmap_get(fbfp, cmap)) {
+ fprintf(stderr, "Can't get color map.\n");
+ fb_cmap_destroy(cmap);
+@@ -111,6 +217,7 @@ fb_open(void)
+
+ pixel_size = 1;
+ }
++#if defined(__linux__)
+ else if ((fscinfo.visual == FB_VISUAL_TRUECOLOR ||
+ fscinfo.visual == FB_VISUAL_DIRECTCOLOR) &&
+ (vscinfo.bits_per_pixel == 15 ||
+@@ -118,6 +225,14 @@ fb_open(void)
+ vscinfo.bits_per_pixel == 24 || vscinfo.bits_per_pixel == 32)) {
+ pixel_size = (vscinfo.bits_per_pixel + 7) / CHAR_BIT;
+ }
++#elif defined(__FreeBSD__)
++ else if (video_info.vi_mem_model == V_INFO_MM_DIRECT &&
++ (video_info.vi_depth == 15 ||
++ video_info.vi_depth == 16 ||
++ video_info.vi_depth == 24 || video_info.vi_depth == 32)) {
++ pixel_size = (video_info.vi_depth + 7) / CHAR_BIT;
++ }
++#endif
+ else {
+ fprintf(stderr, "This type of framebuffer is not supported.\n");
+ goto ERR_END;
+@@ -147,7 +262,11 @@ fb_close(void)
+ cmap = NULL;
+ }
+ if (buf != NULL) {
++#if defined(__linux__)
+ fb_munmap(buf, &fscinfo);
++#elif defined(__FreeBSD__)
++ fb_munmap(buf, &video_adapter_info);
++#endif
+ buf = NULL;
+ }
+
+@@ -259,11 +378,19 @@ fb_image_draw(FB_IMAGE * image, int x, int y, int sx, int sy, int width,
+ if (y + height > fb_height())
+ height = fb_height() - y;
+
++#if defined(__linux__)
+ offset_fb = fscinfo.line_length * y + pixel_size * x;
++#elif defined(__FreeBSD__)
++ offset_fb = video_adapter_info.va_line_width * y + pixel_size * x;
++#endif
+ offset_img = image->rowstride * sy + pixel_size * sx;
+ for (i = 0; i < height; i++) {
+ memcpy(buf + offset_fb, image->data + offset_img, pixel_size * width);
++#if defined(__linux__)
+ offset_fb += fscinfo.line_length;
++#elif defined(__FreeBSD__)
++ offset_fb += video_adapter_info.va_line_width;
++#endif
+ offset_img += image->rowstride;
+ }
+
+@@ -336,7 +463,11 @@ fb_width(void)
+ if (is_open != TRUE)
+ return 0;
+
++#if defined(__linux__)
+ return vscinfo.xres;
++#elif defined(__FreeBSD__)
++ return video_info.vi_width;
++#endif
+ }
+
+ int
+@@ -345,7 +476,11 @@ fb_height(void)
+ if (is_open != TRUE)
+ return 0;
+
++#if defined(__linux__)
+ return vscinfo.yres;
++#elif defined(__FreeBSD__)
++ return video_info.vi_height;
++#endif
+ }
+
+ int
+@@ -369,7 +504,11 @@ fb_clear(int x, int y, int w, int h, int r, int g, int b)
+ h = fb_height() - y;
+
+ if (tmp == NULL) {
++#if defined(__linux__)
+ tmp = malloc(fscinfo.line_length);
++#elif defined(__FreeBSD__)
++ tmp = malloc(video_adapter_info.va_line_width);
++#endif
+ if (tmp == NULL)
+ return 1;
+ }
+@@ -384,10 +523,18 @@ fb_clear(int x, int y, int w, int h, int r, int g, int b)
+ gg = g;
+ bb = b;
+ }
++#if defined(__linux__)
+ offset_fb = fscinfo.line_length * y + pixel_size * x;
++#elif defined(__FreeBSD__)
++ offset_fb = video_adapter_info.va_line_width * y + pixel_size * x;
++#endif
+ for (i = 0; i < h; i++) {
+ memcpy(buf + offset_fb, tmp, pixel_size * w);
++#if defined(__linux__)
+ offset_fb += fscinfo.line_length;
++#elif defined(__FreeBSD__)
++ offset_fb += video_adapter_info.va_line_width;
++#endif
+ }
+ return 0;
+ }
+@@ -400,11 +547,21 @@ fb_get_packed_color(int r, int g, int b)
+ return fb_get_cmap_index(r, g, b);
+ }
+ else {
++#if defined(__linux__)
+ return
+ ((r >> (CHAR_BIT - vscinfo.red.length)) << vscinfo.red.offset) +
+ ((g >> (CHAR_BIT - vscinfo.green.length)) << vscinfo.green.
+ offset) +
+ ((b >> (CHAR_BIT - vscinfo.blue.length)) << vscinfo.blue.offset);
++#elif defined(__FreeBSD__)
++ return
++ ((r >> (CHAR_BIT - video_info.vi_pixel_fsizes[0])) <<
++ video_info.vi_pixel_fields[0]) +
++ ((g >> (CHAR_BIT - video_info.vi_pixel_fsizes[1])) <<
++ video_info.vi_pixel_fields[1]) +
++ ((b >> (CHAR_BIT - video_info.vi_pixel_fsizes[2])) <<
++ video_info.vi_pixel_fields[2]);
++#endif
+ }
+ }
+
+@@ -433,16 +590,31 @@ fb_cmap_init(void)
+ if (cmap == NULL)
+ return 1;
+
++#if defined(__linux__)
+ if (cmap->len < COLOR_OFFSET_8BIT + COLORS_8BIT) {
+ fprintf(stderr, "Can't allocate enough color.\n");
+ return 1;
+ }
++#elif defined(__FreeBSD__)
++ if (cmap->count < COLOR_OFFSET_8BIT + COLORS_8BIT) {
++ fprintf(stderr, "Can't allocate enough color.\n");
++ return 1;
++ }
++#endif
+
+ if (cmap_org == NULL) {
++#if defined(__linux__)
+ if ((cmap_org =
+ fb_cmap_create(&fscinfo, &vscinfo)) == (struct fb_cmap *)-1) {
+ return 1;
+ }
++#elif defined(__FreeBSD__)
++ if ((cmap_org =
++ fb_cmap_create(&video_info, &video_adapter_info)) ==
++ (video_color_palette_t *)-1) {
++ return 1;
++ }
++#endif
+
+ if (fb_cmap_get(fbfp, cmap_org)) {
+ fprintf(stderr, "Can't get color map.\n");
+@@ -452,8 +624,13 @@ fb_cmap_init(void)
+ }
+ }
+
++#if defined(__linux__)
+ cmap->start = MONO_OFFSET_8BIT;
+ cmap->len = COLORS_8BIT + COLORS_MONO_8BIT;
++#elif defined(__FreeBSD__)
++ cmap->index = MONO_OFFSET_8BIT;
++ cmap->count = COLORS_8BIT + COLORS_MONO_8BIT;
++#endif
+
+ for (lp = 0; lp < COLORS_MONO_8BIT; lp++) {
+ int c;
+@@ -506,73 +683,223 @@ fb_cmap_init(void)
+
+ #define LUT_MAX (256)
+
++#if defined(__linux__)
+ static struct fb_cmap *
+ fb_cmap_create(struct fb_fix_screeninfo *fscinfo,
+ struct fb_var_screeninfo *vscinfo)
++#elif defined(__FreeBSD__)
++static video_color_palette_t *
++fb_cmap_create(video_info_t *video_info,
++ video_adapter_info_t *video_adapter_info)
++#endif
+ {
++#if defined(__linux__)
+ struct fb_cmap *cmap;
++#elif defined(__FreeBSD__)
++ video_color_palette_t *cmap;
++#endif
+ int cmaplen = LUT_MAX;
+
+ /* check the existence of colormap */
++#if defined(__linux__)
+ if (fscinfo->visual == FB_VISUAL_MONO01 ||
+ fscinfo->visual == FB_VISUAL_MONO10 ||
+ fscinfo->visual == FB_VISUAL_TRUECOLOR)
+ return NULL;
++#elif defined(__FreeBSD__)
++ if (!(video_adapter_info->va_flags & V_ADP_PALETTE))
++ return NULL;
++#endif
+
++#if defined(__linux__)
+ cmap = (struct fb_cmap *)malloc(sizeof(struct fb_cmap));
++#elif defined(__FreeBSD__)
++ cmap = (video_color_palette_t *)malloc(sizeof(video_color_palette_t));
++#endif
+ if (!cmap) {
+ perror("cmap malloc error\n");
++#if defined(__linux__)
+ return (struct fb_cmap *)-1;
++#elif defined(__FreeBSD__)
++ return (video_color_palette_t *)-1;
++#endif
+ }
++#if defined(__linux__)
+ memset(cmap, 0, sizeof(struct fb_cmap));
++#elif defined(__FreeBSD__)
++ memset(cmap, 0, sizeof(video_color_palette_t));
++#endif
++
++#if defined(__FreeBSD__)
++ if (video_info->vi_mem_model == V_INFO_MM_PACKED) {
++ cmap->red = (u_char *) malloc(sizeof(u_char) * cmaplen);
++ if (!cmap->red) {
++ perror("red lut malloc error\n");
++ return (video_color_palette_t *)-1;
++ }
++ cmap->green = (u_char *) malloc(sizeof(u_char) * cmaplen);
++ if (!cmap->green) {
++ perror("green lut malloc error\n");
++ free(cmap->red);
++ return (video_color_palette_t *)-1;
++ }
++ cmap->blue = (u_char *) malloc(sizeof(u_char) * cmaplen);
++ if (!cmap->blue) {
++ perror("blue lut malloc error\n");
++ free(cmap->red);
++ free(cmap->green);
++ return (video_color_palette_t *)-1;
++ }
++ cmap->transparent = (u_char *) malloc(sizeof(u_char) * cmaplen);
++ if (!cmap->transparent) {
++ perror("transparent lut malloc error\n");
++ free(cmap->red);
++ free(cmap->green);
++ free(cmap->blue);
++ return (video_color_palette_t *)-1;
++ }
++ cmap->count = cmaplen;
++ return cmap;
++ }
++#endif
+
+ /* Allocates memory for a colormap */
++#if defined(__linux__)
+ if (vscinfo->red.length) {
+ cmap->red = (__u16 *) malloc(sizeof(__u16) * cmaplen);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[0]) {
++ cmap->red = (u_char *) malloc(sizeof(u_char) * cmaplen);
++#else
++ if (0) {
++#endif
+ if (!cmap->red) {
+ perror("red lut malloc error\n");
++#if defined(__linux__)
+ return (struct fb_cmap *)-1;
++#elif defined(__FreeBSD__)
++ return (video_color_palette_t *)-1;
++#endif
+ }
+ }
++#if defined(__linux__)
+ if (vscinfo->green.length) {
+ cmap->green = (__u16 *) malloc(sizeof(__u16) * cmaplen);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[1]) {
++ cmap->green = (u_char *) malloc(sizeof(u_char) * cmaplen);
++#else
++ if (0) {
++#endif
+ if (!cmap->green) {
++#if defined(__linux__)
+ if (vscinfo->red.length)
+ free(cmap->red);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[0])
++ free(cmap->red);
++#endif
+ perror("green lut malloc error\n");
++#if defined(__linux__)
+ return (struct fb_cmap *)-1;
++#elif defined(__FreeBSD__)
++ return (video_color_palette_t *)-1;
++#endif
+ }
+ }
++#if defined(__linux__)
+ if (vscinfo->blue.length) {
+ cmap->blue = (__u16 *) malloc(sizeof(__u16) * cmaplen);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[2]) {
++ cmap->blue = (u_char *) malloc(sizeof(u_char) * cmaplen);
++#else
++ if (0) {
++#endif
+ if (!cmap->blue) {
++#if defined(__linux__)
+ if (vscinfo->red.length)
+ free(cmap->red);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[0])
++ free(cmap->red);
++#endif
++#if defined(__linux__)
+ if (vscinfo->green.length)
+ free(cmap->green);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[1])
++ free(cmap->green);
++#endif
+ perror("blue lut malloc error\n");
++#if defined(__linux__)
+ return (struct fb_cmap *)-1;
++#elif defined(__FreeBSD__)
++ return (video_color_palette_t *)-1;
++#endif
+ }
+ }
++#if defined(__linux__)
+ if (vscinfo->transp.length) {
+ cmap->transp = (__u16 *) malloc(sizeof(__u16) * cmaplen);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[3]) {
++ cmap->transparent = (u_char *) malloc(sizeof(u_char) * cmaplen);
++#else
++ if (0) {
++#endif
++#if defined(__linux__)
+ if (!cmap->transp) {
++#elif defined(__FreeBSD__)
++ if (!cmap->transparent) {
++#else
++ if (0) {
++#endif
++#if defined(__linux__)
+ if (vscinfo->red.length)
+ free(cmap->red);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[0])
++ free(cmap->red);
++#endif
++#if defined(__linux__)
+ if (vscinfo->green.length)
+ free(cmap->green);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[1])
++ free(cmap->green);
++#endif
++#if defined(__linux__)
+ if (vscinfo->blue.length)
+ free(cmap->blue);
+ perror("transp lut malloc error\n");
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[2])
++ free(cmap->blue);
++ perror("transparent lut malloc error\n");
++#endif
++#if defined(__linux__)
+ return (struct fb_cmap *)-1;
++#elif defined(__FreeBSD__)
++ return (video_color_palette_t *)-1;
++#endif
+ }
+ }
++#if defined(__linux__)
+ cmap->len = cmaplen;
++#elif defined(__FreeBSD__)
++ cmap->count = cmaplen;
++#endif
+ return cmap;
+ }
+
++#if defined(__linux__)
+ static void
+ fb_cmap_destroy(struct fb_cmap *cmap)
++#elif defined(__FreeBSD__)
++static void
++fb_cmap_destroy(video_color_palette_t *cmap)
++#endif
+ {
+ if (cmap->red)
+ free(cmap->red);
+@@ -580,28 +907,57 @@ fb_cmap_destroy(struct fb_cmap *cmap)
+ free(cmap->green);
+ if (cmap->blue)
+ free(cmap->blue);
++#if defined(__linux__)
+ if (cmap->transp)
+ free(cmap->transp);
++#elif defined(__FreeBSD__)
++ if (cmap->transparent)
++ free(cmap->transparent);
++#endif
+ free(cmap);
+ }
+
++#if defined(__linux__)
+ static int
+ fb_cmap_get(int fbfp, struct fb_cmap *cmap)
++#elif defined(__FreeBSD__)
++static int
++fb_cmap_get(int fbfp, video_color_palette_t *cmap)
++#endif
+ {
++#if defined(__linux__)
+ if (ioctl(fbfp, FBIOGETCMAP, cmap)) {
+ perror("ioctl FBIOGETCMAP error\n");
+ return -1;
+ }
++#elif defined(__FreeBSD__)
++ if (ioctl(fbfp, FBIO_GETPALETTE, cmap) == -1) {
++ perror("ioctl FBIO_GETPALETTE error\n");
++ return -1;
++ }
++#endif
+ return 0;
+ }
+
++#if defined(__linux__)
+ static int
+ fb_cmap_set(int fbfp, struct fb_cmap *cmap)
++#elif defined(__FreeBSD__)
++static int
++fb_cmap_set(int fbfp, video_color_palette_t *cmap)
++#endif
+ {
++#if defined(__linux__)
+ if (ioctl(fbfp, FBIOPUTCMAP, cmap)) {
+ perror("ioctl FBIOPUTCMAP error\n");
+ return -1;
+ }
++#elif defined(__FreeBSD__)
++ if (ioctl(fbfp, FBIO_SETPALETTE, cmap) == -1) {
++ perror("ioctl FBIO_SETPALETTE error\n");
++ return -1;
++ }
++#endif
+ return 0;
+ }
+
+@@ -612,10 +968,16 @@ fb_cmap_set(int fbfp, struct fb_cmap *cmap)
+ * fb_munmap() deletes the mappings
+ */
+
++#if defined(__linux__)
+ static void *
+ fb_mmap(int fbfp, struct fb_fix_screeninfo *scinfo)
++#elif defined(__FreeBSD__)
++static void *
++fb_mmap(int fbfp, video_adapter_info_t *video_adapter_info)
++#endif
+ {
+ void *buf;
++#if defined(__linux__)
+ if ((buf = (unsigned char *)
+ mmap(NULL, scinfo->smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fbfp,
+ (off_t) 0))
+@@ -623,13 +985,41 @@ fb_mmap(int fbfp, struct fb_fix_screeninfo *scinfo)
+ perror("mmap error");
+ return NULL;
+ }
++#elif defined(__FreeBSD__)
++ size_t mmap_offset;
++ size_t mmap_length;
++ mmap_offset = (size_t)(video_adapter_info->va_window) & (PAGE_MASK);
++ mmap_length = (size_t)(video_adapter_info->va_window_size +
++ mmap_offset + PAGE_MASK) & (~PAGE_MASK);
++ if ((buf = (unsigned char *)
++ mmap(NULL, mmap_length, PROT_READ | PROT_WRITE, MAP_SHARED, fbfp,
++ (off_t) 0))
++ == MAP_FAILED) {
++ perror("mmap error");
++ return NULL;
++ }
++#endif
+ return buf;
+ }
+
++#if defined(__linux__)
+ static int
+ fb_munmap(void *buf, struct fb_fix_screeninfo *scinfo)
++#elif defined(__FreeBSD__)
++static int
++fb_munmap(void *buf, video_adapter_info_t *video_adapter_info)
++#endif
+ {
++#if defined(__linux__)
+ return munmap(buf, scinfo->smem_len);
++#elif defined(__FreeBSD__)
++ size_t mmap_offset;
++ size_t mmap_length;
++ mmap_offset = (size_t)(video_adapter_info->va_window) & (PAGE_MASK);
++ mmap_length = (size_t)(video_adapter_info->va_window_size +
++ mmap_offset + PAGE_MASK) & (~PAGE_MASK);
++ return munmap((void *)((u_long)buf & (~PAGE_MASK)), mmap_length);
++#endif
+ }
+
+ /*
+@@ -637,6 +1027,7 @@ fb_munmap(void *buf, struct fb_fix_screeninfo *scinfo)
+ *
+ * fb_fscrn_get() get information
+ */
++#if defined(__linux__)
+ static int
+ fb_fscrn_get(int fbfp, struct fb_fix_screeninfo *scinfo)
+ {
+@@ -646,12 +1037,14 @@ fb_fscrn_get(int fbfp, struct fb_fix_screeninfo *scinfo)
+ }
+ return 0;
+ }
++#endif
+
+ /*
+ * (struct fb_var_screeninfo) device independent variable information
+ *
+ * fb_vscrn_get() get information
+ */
++#if defined(__linux__)
+ static int
+ fb_vscrn_get(int fbfp, struct fb_var_screeninfo *scinfo)
+ {
+@@ -661,3 +1054,41 @@ fb_vscrn_get(int fbfp, struct fb_var_screeninfo *scinfo)
+ }
+ return 0;
+ }
++#endif
++
++#if defined(__FreeBSD__)
++static int
++fb_video_mode_get(int fbfp, int *video_mode)
++{
++ if (ioctl(fbfp, FBIO_GETMODE, video_mode) == -1) {
++ perror("ioctl FBIO_GETMODE error\n");
++ return -1;
++ }
++ return 0;
++}
++#endif
++
++#if defined(__FreeBSD__)
++static int
++fb_video_info_get(int fbfp, video_info_t *video_info)
++{
++ if (ioctl(fbfp, FBIO_MODEINFO, video_info) == -1) {
++ perror("ioctl FBIO_MODEINFO error\n");
++ return -1;
++ }
++ return 0;
++}
++#endif
++
++#if defined(__FreeBSD__)
++static int
++fb_video_adapter_info_get(int fbfp, video_adapter_info_t *video_adapter_info)
++{
++ if (ioctl(fbfp, FBIO_ADPINFO, video_adapter_info) == -1) {
++ perror("ioctl FBIO_ADPINFO error\n");
++ return -1;
++ }
++ return 0;
++}
++#endif
++
+diff --git a/w3mimg/fb/fb.h b/w3mimg/fb/fb.h
+index 1138bb0..5d86454 100644
+--- a/w3mimg/fb/fb.h
++++ b/w3mimg/fb/fb.h
+@@ -1,7 +1,11 @@
+ /* $Id: fb.h,v 1.7 2003/07/07 15:48:17 ukai Exp $ */
+ #ifndef fb_header
+ #define fb_header
++#if defined(__linux__)
+ #include <linux/fb.h>
++#elif defined(__FreeBSD__)
++#include <sys/fbio.h>
++#endif
+
+ typedef struct {
+ int num;
+diff --git a/w3mimg/fb/fb_gdkpixbuf.c b/w3mimg/fb/fb_gdkpixbuf.c
+index 36e3b62..f1e8d97 100644
+--- a/w3mimg/fb/fb_gdkpixbuf.c
++++ b/w3mimg/fb/fb_gdkpixbuf.c
+@@ -6,7 +6,7 @@
+ #include "config.h"
+ #if defined(USE_GTK2)
+ #include <glib-object.h>
+-#include <gdk/gdk.h>
++#include <gdk-pixbuf/gdk-pixbuf.h>
+ #endif
+ #include <gdk-pixbuf/gdk-pixbuf.h>
+ #include "fb.h"
+diff --git a/w3mimg/fb/fb_w3mimg.c b/w3mimg/fb/fb_w3mimg.c
+index d3ae5a9..fb323f5 100644
+--- a/w3mimg/fb/fb_w3mimg.c
++++ b/w3mimg/fb/fb_w3mimg.c
+@@ -153,10 +153,15 @@ check_tty_console(char *tty)
+ return 0;
+ if (strncmp(tty, "/dev/", 5) == 0)
+ tty += 5;
++#if defined(__linux__)
+ if (strncmp(tty, "tty", 3) == 0 && isdigit(*(tty + 3)))
+ return 1;
+ if (strncmp(tty, "vc/", 3) == 0 && isdigit(*(tty + 3)))
+ return 1;
++#elif defined(__FreeBSD__)
++ if (strncmp(tty, "ttyv", 4) == 0 && isxdigit(*(tty + 4)))
++ return 1;
++#endif
+ return 0;
+ }
+ #else
+@@ -172,7 +177,9 @@ w3mimg_fbopen()
+ return NULL;
+ memset(wop, 0, sizeof(w3mimg_op));
+
+- if (!check_tty_console(getenv("W3M_TTY")) && strcmp("jfbterm", getenv("TERM")) != 0) {
++ if (!check_tty_console(getenv("W3M_TTY")) &&
++ strcmp("jfbterm", getenv("TERM")) != 0 &&
++ strncmp("jfbterm-", getenv("TERM"), 8) != 0) {
+ fprintf(stderr, "w3mimgdisplay/fb: tty is not console\n");
+ goto error;
+ }
+diff --git a/w3mimg/x11/x11_w3mimg.c b/w3mimg/x11/x11_w3mimg.c
+index f5be4a8..9a539de 100644
+--- a/w3mimg/x11/x11_w3mimg.c
++++ b/w3mimg/x11/x11_w3mimg.c
+@@ -14,7 +14,7 @@
+ #elif defined(USE_GDKPIXBUF)
+ #if defined(USE_GTK2)
+ #include <glib-object.h>
+-#include <gdk/gdk.h>
++#include <gdk-pixbuf/gdk-pixbuf.h>
+ #include <gdk-pixbuf-xlib/gdk-pixbuf-xlib.h>
+ #else
+ #include <gdk-pixbuf/gdk-pixbuf-xlib.h>
+@@ -121,24 +121,32 @@ x11_init(w3mimg_op * self)
+ if (self == NULL)
+ return 0;
+ xi = (struct x11_info *)self->priv;
++#if defined(USE_IMLIB)
+ if (xi == NULL)
+ return 0;
+-#if defined(USE_IMLIB)
+ if (!xi->id) {
+ xi->id = Imlib_init(xi->display);
+ if (!xi->id)
+ return 0;
+ }
+ #elif defined(USE_GDKPIXBUF)
+- if (!xi->init_flag) {
++ if (!xi) {
++#if defined(USE_GTK2)
++ g_type_init();
++#endif
++ }
++ else if (!xi->init_flag) {
++ XWindowAttributes attr;
+ #if defined(USE_GTK2)
+ g_type_init();
+ #endif
+- gdk_pixbuf_xlib_init(xi->display, 0);
++ XGetWindowAttributes(xi->display, xi->parent, &attr);
++ /* gdk_pixbuf_xlib_init_with_depth() ignores depth, sigh... */
++ gdk_pixbuf_xlib_init_with_depth(xi->display, 0, attr.depth);
+ xi->init_flag = TRUE;
+ }
+ #endif
+- if (!xi->imageGC) {
++ if (xi && !xi->imageGC) {
+ xi->imageGC = XCreateGC(xi->display, xi->parent, 0, NULL);
+ if (!xi->imageGC)
+ return 0;
+@@ -200,14 +208,16 @@ x11_set_background(w3mimg_op * self, char *background)
+ {
+ XColor screen_def, exact_def;
+ struct x11_info *xi;
++ XWindowAttributes attr;
+ if (self == NULL)
+ return;
+ xi = (struct x11_info *)self->priv;
+ if (xi == NULL)
+ return;
+
++ XGetWindowAttributes(xi->display, xi->window, &attr);
+ if (background &&
+- XAllocNamedColor(xi->display, DefaultColormap(xi->display, 0),
++ XAllocNamedColor(xi->display, attr.colormap,
+ background, &screen_def, &exact_def))
+ xi->background_pixel = screen_def.pixel;
+ else {
+@@ -216,7 +226,7 @@ x11_set_background(w3mimg_op * self, char *background)
+ XImage *i;
+
+ p = XCreatePixmap(xi->display, xi->window, 1, 1,
+- DefaultDepth(xi->display, 0));
++ attr.depth);
+ gc = XCreateGC(xi->display, xi->window, 0, NULL);
+ if (!p || !gc)
+ exit(1); /* XXX */
+@@ -258,6 +268,7 @@ x11_img_new(struct x11_info *xi, int w, int h, int n)
+ {
+ struct x11_image *img = NULL;
+ int i;
++ XWindowAttributes attr;
+
+ img = malloc(sizeof(*img));
+ if (!img)
+@@ -267,9 +278,10 @@ x11_img_new(struct x11_info *xi, int w, int h, int n)
+ if (!img->pixmap)
+ goto ERROR;
+
++ XGetWindowAttributes(xi->display, xi->window, &attr);
+ for (i = 0; i < n; i++) {
+ img->pixmap[i] = XCreatePixmap(xi->display, xi->parent, w, h,
+- DefaultDepth(xi->display, 0));
++ attr.depth);
+ if (!img->pixmap[i])
+ goto ERROR;
+
+@@ -318,6 +330,41 @@ resize_image(GdkPixbuf * pixbuf, int width, int height)
+ return NULL;
+ return resized_pixbuf;
+ }
++
++#if defined(USE_GTK2)
++static void
++render_pixbuf_to_pixmap_32(Display *display, GC gc, Pixmap pixmap, GdkPixbuf * pixbuf)
++{
++ unsigned int x, y, width, height, rowstride, bytes_per_pixel;
++ unsigned char *line;
++ XImage *image;
++
++ width = gdk_pixbuf_get_width(pixbuf) ;
++ height = gdk_pixbuf_get_height(pixbuf) ;
++
++ if (!(image = XGetImage(display, pixmap, 0, 0, width, height, AllPlanes, ZPixmap)))
++ return ;
++
++ bytes_per_pixel = (gdk_pixbuf_get_has_alpha(pixbuf)) ? 4 : 3;
++ rowstride = gdk_pixbuf_get_rowstride(pixbuf);
++ line = gdk_pixbuf_get_pixels(pixbuf);
++
++ for (y = 0; y < height; y++) {
++ u_char *pixel;
++
++ pixel = line;
++ for (x = 0; x < width; x++) {
++ XPutPixel(image, x, y,
++ (pixel[0] <<16) | (pixel[1] <<8) | pixel[2] | 0xff000000);
++ pixel += bytes_per_pixel;
++ }
++ line += rowstride;
++ }
++
++ XPutImage(display, pixmap, gc, image, 0, 0, 0, 0, width, height);
++ XDestroyImage(image);
++}
++#endif
+ #endif
+
+ static int
+@@ -342,6 +389,7 @@ x11_load_image(w3mimg_op * self, W3MImage * img, char *fname, int w, int h)
+ GList *frames;
+ #endif
+ #endif
++ XWindowAttributes attr;
+
+ if (self == NULL)
+ return 0;
+@@ -349,6 +397,7 @@ x11_load_image(w3mimg_op * self, W3MImage * img, char *fname, int w, int h)
+ if (xi == NULL)
+ return 0;
+
++ XGetWindowAttributes(xi->display, xi->window, &attr);
+ #if defined(USE_IMLIB)
+ im = Imlib_load_image(xi->id, fname);
+ if (!im)
+@@ -358,7 +407,7 @@ x11_load_image(w3mimg_op * self, W3MImage * img, char *fname, int w, int h)
+ if (h <= 0)
+ h = im->rgb_height;
+ img->pixmap = (void *)XCreatePixmap(xi->display, xi->parent, w, h,
+- DefaultDepth(xi->display, 0));
++ attr.depth);
+ if (!img->pixmap)
+ return 0;
+ XSetForeground(xi->display, xi->imageGC, xi->background_pixel);
+@@ -374,17 +423,21 @@ x11_load_image(w3mimg_op * self, W3MImage * img, char *fname, int w, int h)
+ w = imlib_image_get_width();
+ if (h <= 0)
+ h = imlib_image_get_height();
++
++ im = imlib_create_cropped_scaled_image(0, 0, imlib_image_get_width(), imlib_image_get_height(), w, h);
++ imlib_context_set_image(im);
++
+ img->pixmap = (void *)XCreatePixmap(xi->display, xi->parent, w, h,
+- DefaultDepth(xi->display, 0));
++ attr.depth);
+ if (!img->pixmap)
+ return 0;
+ XSetForeground(xi->display, xi->imageGC, xi->background_pixel);
+ XFillRectangle(xi->display, (Pixmap) img->pixmap, xi->imageGC, 0, 0, w, h);
+ imlib_context_set_display(xi->display);
+- imlib_context_set_visual(DefaultVisual(xi->display, 0));
+- imlib_context_set_colormap(DefaultColormap(xi->display, 0));
++ imlib_context_set_visual(attr.visual);
++ imlib_context_set_colormap(attr.colormap);
+ imlib_context_set_drawable((Drawable) img->pixmap);
+- imlib_render_image_on_drawable_at_size(0, 0, w, h);
++ imlib_render_image_on_drawable(0, 0);
+ imlib_free_image();
+ #elif defined(USE_GDKPIXBUF)
+ max_anim = self->max_anim;
+@@ -416,7 +469,7 @@ x11_load_image(w3mimg_op * self, W3MImage * img, char *fname, int w, int h)
+ ratio_h = 1.0 * h / ih;
+ }
+ tmp_pixmap = XCreatePixmap(xi->display, xi->parent, w, h,
+- DefaultDepth(xi->display, 0));
++ attr.depth);
+ XSetForeground(xi->display, xi->imageGC, xi->background_pixel);
+ XFillRectangle(xi->display, (Pixmap) tmp_pixmap, xi->imageGC, 0, 0, w, h);
+ if (!tmp_pixmap) {
+@@ -459,7 +512,10 @@ x11_load_image(w3mimg_op * self, W3MImage * img, char *fname, int w, int h)
+ if (delay > ximg->delay)
+ ximg->delay = delay;
+
+- gdk_pixbuf_xlib_render_to_drawable_alpha(pixbuf,
++ if (attr.depth == 32)
++ render_pixbuf_to_pixmap_32(xi->display, xi->imageGC, ximg->pixmap[j], pixbuf);
++ else
++ gdk_pixbuf_xlib_render_to_drawable_alpha(pixbuf,
+ (Drawable) ximg->pixmap[j], 0,
+ 0, 0, 0, w, h,
+ GDK_PIXBUF_ALPHA_BILEVEL, 1,
+@@ -653,9 +709,11 @@ x11_get_image_size(w3mimg_op * self, W3MImage * img, char *fname, int *w,
+
+ if (self == NULL)
+ return 0;
++#if defined(USE_IMLIB) && defined(USE_IMLIB2)
+ xi = (struct x11_info *)self->priv;
+ if (xi == NULL)
+ return 0;
++#endif
+
+ #if defined(USE_IMLIB)
+ im = Imlib_load_image(xi->id, fname);
+@@ -755,6 +813,9 @@ w3mimg_x11open()
+ return NULL;
+ memset(wop, 0, sizeof(w3mimg_op));
+
++ if (getenv("W3M_USE_REMOTE_IMAGE"))
++ goto end;
++
+ xi = (struct x11_info *)malloc(sizeof(struct x11_info));
+ if (xi == NULL)
+ goto error;
+@@ -807,6 +868,7 @@ w3mimg_x11open()
+
+ wop->priv = xi;
+
++ end:
+ wop->init = x11_init;
+ wop->finish = x11_finish;
+ wop->active = x11_active;
+diff --git a/w3mimgdisplay.c b/w3mimgdisplay.c
+index 5486a47..ccfa373 100644
+--- a/w3mimgdisplay.c
++++ b/w3mimgdisplay.c
+@@ -281,6 +281,10 @@ DrawImage(char *buf, int redraw)
+ maxImage = n + 1;
+ imageBuf = (W3MImage *) realloc((void *)imageBuf,
+ sizeof(W3MImage) * maxImage);
++ if (imageBuf == NULL) {
++ fprintf(stderr, "Out of memory\n");
++ exit(1);
++ }
+ for (; i < maxImage; i++)
+ imageBuf[i].pixmap = NULL;
+ }
diff --git a/gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch b/gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch
deleted file mode 100644
index 5b78f2d..0000000
--- a/gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-Subject: Disable SSLv2 and SSLv3.
-
-The only remaining methods are TLSv1.* (the code never distinguishes
-between TLSv1.0, TLSv1.1, and TLSv1.2).
----
- fm.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/fm.h b/fm.h
-index 320906c..ddcd4fc 100644
---- a/fm.h
-+++ b/fm.h
-@@ -1144,7 +1144,7 @@ global int ssl_path_modified init(FALSE);
- #endif /* defined(USE_SSL) &&
- * defined(USE_SSL_VERIFY) */
- #ifdef USE_SSL
--global char *ssl_forbid_method init(NULL);
-+global char *ssl_forbid_method init("2, 3");
- #endif
-
- global int is_redisplay init(FALSE);
---
-2.6.4
-
diff --git a/gnu/packages/patches/w3m-disable-weak-ciphers.patch b/gnu/packages/patches/w3m-disable-weak-ciphers.patch
deleted file mode 100644
index 4780d54..0000000
--- a/gnu/packages/patches/w3m-disable-weak-ciphers.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-Subject: Disable weak ciphers
-
-Disable RC4, "export ciphers", and all keys < 128 bits.
-
-Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/w3m/+bug/1325674
----
- url.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/url.c b/url.c
-index ed6062e..e86b1f3 100644
---- a/url.c
-+++ b/url.c
-@@ -326,6 +326,7 @@ openSSLHandle(int sock, char *hostname, char **p_cert)
- SSL_load_error_strings();
- if (!(ssl_ctx = SSL_CTX_new(SSLv23_client_method())))
- goto eend;
-+ SSL_CTX_set_cipher_list(ssl_ctx, "DEFAULT:!LOW:!RC4:!EXP");
- option = SSL_OP_ALL;
- if (ssl_forbid_method) {
- if (strchr(ssl_forbid_method, '2'))
---
-2.6.4
-
diff --git a/gnu/packages/patches/w3m-force-ssl_verify_server-on.patch b/gnu/packages/patches/w3m-force-ssl_verify_server-on.patch
deleted file mode 100644
index dc9f117..0000000
--- a/gnu/packages/patches/w3m-force-ssl_verify_server-on.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-Subject: Force ssl_verify_server on.
-
-By default, SSL/TLS certificates are not verified. This enables the
-verification.
----
- fm.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/fm.h b/fm.h
-index 8378939..320906c 100644
---- a/fm.h
-+++ b/fm.h
-@@ -1135,7 +1135,7 @@ global int view_unseenobject init(TRUE);
- #endif
-
- #if defined(USE_SSL) && defined(USE_SSL_VERIFY)
--global int ssl_verify_server init(FALSE);
-+global int ssl_verify_server init(TRUE);
- global char *ssl_cert_file init(NULL);
- global char *ssl_key_file init(NULL);
- global char *ssl_ca_path init(NULL);
---
-2.6.4
-
diff --git a/gnu/packages/patches/w3m-libgc.patch b/gnu/packages/patches/w3m-libgc.patch
deleted file mode 100644
index 0dc6a40..0000000
--- a/gnu/packages/patches/w3m-libgc.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-This patch fixes w3m compilation with libgc > 7.2.
-
-Reported:
-https://bugs.archlinux.org/task/33397
-
-Patch with explanation:
-http://anonscm.debian.org/cgit/collab-maint/w3m.git/commit/?id=770eec8304bdbe458
----
- main.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/main.c b/main.c
-index b421943..249eb1a 100644
---- a/main.c
-+++ b/main.c
-@@ -833,7 +833,8 @@ main(int argc, char **argv, char **envp)
- mySignal(SIGPIPE, SigPipe);
- #endif
-
-- orig_GC_warn_proc = GC_set_warn_proc(wrap_GC_warn_proc);
-+ orig_GC_warn_proc = GC_get_warn_proc();
-+ GC_set_warn_proc(wrap_GC_warn_proc);
- err_msg = Strnew();
- if (load_argc == 0) {
- /* no URL specified */
---
-2.6.4
-
diff --git a/gnu/packages/patches/w3m-upstream-20120522.patch b/gnu/packages/patches/w3m-upstream-20120522.patch
new file mode 100644
index 0000000..64e089d
--- /dev/null
+++ b/gnu/packages/patches/w3m-upstream-20120522.patch
@@ -0,0 +1,157 @@
+Description: Upstream development snapshot on 2012-05-22
+Origin: upstream, http://w3m.cvs.sourceforge.net/viewvc/w3m/w3m/
+
+diff -urN w3m-0.5.3/ChangeLog w3m/ChangeLog
+--- w3m-0.5.3/ChangeLog 2011-01-15 16:52:48.000000000 +0900
++++ w3m/ChangeLog 2012-05-22 22:11:44.000000000 +0900
+@@ -1,12 +1,31 @@
++2012-05-22 Tatsuya Kinoshita <tats@vega.ocn.ne.jp>
++
++ * [w3m-dev 04451] w3m/entity.h should be removed when `make clean'
++ * Makefile.in: add entity.h to "make clean" target.
++
++2012-05-22 Tatsuya Kinoshita <tats@vega.ocn.ne.jp>
++
++ * [w3m-dev 04452] Re: w3m on macosx 10.6.6
++ * doc/w3m.1, doc/STORY.html, doc-jp/STORY.html:
++ delete words about formerly included Boehm GC library.
++
++2012-05-22 Enu <theme.of.n@gmail.com>
++
++ * file.c, HTML.c: parse META CHARSET.
++
++2011-01-17 Dai Sato <satodai@w3m.jp>
++
++ * correction: ChangeLog of 2011-01-15 (0.5.2 -> 0.5.3)
++
+ 2011-01-15 Dai Sato <satodai@w3m.jp>
+
+- * w3m 0.5.2
++ * w3m 0.5.3
+ * version.c.in: update
+- * doc/README: version 0.5.2, release date, maintainer
++ * doc/README: version 0.5.3, release date, maintainer
+ * doc-jp/README: ditto
+ * po/w3m.pot, ja.po: ditto
+ * NEWS: update
+- * configure.ac: version 0.5.2
++ * configure.ac: version 0.5.3
+ * configure: regenerated
+
+ 2011-01-05 SAKAI Kiyotaka <kiyotaka.sakai@ntt-at.co.jp>
+@@ -9300,4 +9319,4 @@
+ * release-0-2-1
+ * import w3m-0.2.1
+
+-$Id: ChangeLog,v 1.1050 2011/01/15 07:52:48 inu Exp $
++$Id: ChangeLog,v 1.1055 2012/05/22 10:20:45 inu Exp $
+diff -urN w3m-0.5.3/Makefile.in w3m/Makefile.in
+--- w3m-0.5.3/Makefile.in 2011-01-04 18:22:18.000000000 +0900
++++ w3m/Makefile.in 2012-05-22 22:11:44.000000000 +0900
+@@ -288,7 +288,7 @@
+ clean: sweep
+ -$(RM) -f *.o *.a $(TARGETS) mktable$(EXT)
+ -$(RM) -f funcname.tab
+- -$(RM) -f funcname.c funcname1.h funcname2.h tagtable.c functable.c
++ -$(RM) -f entity.h funcname.c funcname1.h funcname2.h tagtable.c functable.c
+ -for dir in w3mimg libwc; \
+ do \
+ (cd $$dir && $(MAKE) clean RM="$(RM)"); \
+diff -urN w3m-0.5.3/doc/STORY.html w3m/doc/STORY.html
+--- w3m-0.5.3/doc/STORY.html 2001-11-21 13:29:14.000000000 +0900
++++ w3m/doc/STORY.html 2012-05-22 22:11:44.000000000 +0900
+@@ -182,6 +182,10 @@
+ I could distribute w3m without this library because one can
+ get the library separately, but I decided to contain it in the
+ w3m distribution for the convenience of an installer.
++<P>
++# Boehm GC library is no longer included into w3m packages
++# after w3m-0.4.2.
++<P>
+ W3m doesn't use libwww.
+ <P>
+ Boehm GC is a garbage collector for C and C++. I began to use this
+diff -urN w3m-0.5.3/doc/w3m.1 w3m/doc/w3m.1
+--- w3m-0.5.3/doc/w3m.1 2011-01-15 15:37:24.000000000 +0900
++++ w3m/doc/w3m.1 2012-05-22 22:11:44.000000000 +0900
+@@ -245,8 +245,6 @@
+ .I
+ w3m
+ has incorporated code from several sources.
+-Hans J. Boehm, Alan J. Demers, Xerox Corp. and Silicon Graphics
+-have the copyright of the GC library comes with w3m package.
+ Users have contributed patches and suggestions over time.
+ .SH AUTHOR
+ Akinori ITO <aito@fw.ipsj.or.jp>
+diff -urN w3m-0.5.3/doc-jp/STORY.html w3m/doc-jp/STORY.html
+--- w3m-0.5.3/doc-jp/STORY.html 2003-05-14 02:17:54.000000000 +0900
++++ w3m/doc-jp/STORY.html 2012-05-22 22:11:44.000000000 +0900
+@@ -158,6 +158,9 @@
+ <a href="http://www.hpl.hp.com/personal/Hans_Boehm/gc/">Boehm GC</a>
+ ¤È¤¤¤¦¥é¥¤¥Ö¥é¥ê¤òÍøÍѤ·¤Æ¤¤¤ë¡¥¤³¤ì¤Ï»ä¤¬½ñ¤¤¤¿¤â¤Î¤Ç¤Ï¤Ê¤¤¤¬¡¤
+ ¥³¥ó¥Ñ¥¤¥ë»þ¤ÎÊص¹¤ò¹Í¤¨¤ÆÇÛÉۥѥ屡¼¥¸¤Ë´Þ¤á¤Æ¤¤¤ë¡¥
++<P>
++# Boehm GC ¤Ï¡¢w3m-0.4.2 °Ê¹ß¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ë¤Ï´Þ¤Þ¤ì¤Æ¤¤¤Þ¤»¤ó¡£
++<P>
+ ¤Ê¤ª¡¤libwww ¤Ï»È¤Ã¤Æ¤¤¤Ê¤¤¡¥
+ <P>
+ Boehm GC¤Ï¡¤C¤«¤é»È¤¨¤ë¥¬¥Ù¡¼¥¸¥³¥ì¥¯¥¿¤À¡¥table ¤ò¼ÂÁõ¤·¤¿¤¢¤¿¤ê¤Ë¤³¤ì¤ò
+diff -urN w3m-0.5.3/file.c w3m/file.c
+--- w3m-0.5.3/file.c 2011-01-04 18:22:21.000000000 +0900
++++ w3m/file.c 2012-05-22 22:11:44.000000000 +0900
+@@ -1,4 +1,4 @@
+-/* $Id: file.c,v 1.265 2010/12/15 10:50:24 htrb Exp $ */
++/* $Id: file.c,v 1.266 2012/05/22 09:45:56 inu Exp $ */
+ #include "fm.h"
+ #include <sys/types.h>
+ #include "myctype.h"
+@@ -5020,10 +5020,17 @@
+ HTMLlineproc1(tmp->ptr, h_env);
+ return 1;
+ case HTML_META:
+- p = q = NULL;
++ p = q = r = NULL;
+ parsedtag_get_value(tag, ATTR_HTTP_EQUIV, &p);
+ parsedtag_get_value(tag, ATTR_CONTENT, &q);
+ #ifdef USE_M17N
++ parsedtag_get_value(tag, ATTR_CHARSET, &r);
++ if (r) {
++ /* <meta charset=""> */
++ SKIP_BLANKS(r);
++ meta_charset = wc_guess_charset(r, 0);
++ }
++ else
+ if (p && q && !strcasecmp(p, "Content-Type") &&
+ (q = strcasestr(q, "charset")) != NULL) {
+ q += 7;
+diff -urN w3m-0.5.3/html.c w3m/html.c
+--- w3m-0.5.3/html.c 2011-01-04 18:22:21.000000000 +0900
++++ w3m/html.c 2012-05-22 22:11:44.000000000 +0900
+@@ -1,4 +1,4 @@
+-/* $Id: html.c,v 1.32 2010/08/14 01:29:40 htrb Exp $ */
++/* $Id: html.c,v 1.33 2012/05/22 09:45:56 inu Exp $ */
+ #include "html.h"
+
+ /* Define HTML Tag Infomation Table */
+@@ -37,8 +37,8 @@
+ ATTR_CELLPADDING, ATTR_VSPACE, ATTR_CORE
+ };
+ #define MAXA_TABLE MAXA_CORE + 6
+-unsigned char ALST_META[] = { ATTR_HTTP_EQUIV, ATTR_CONTENT, ATTR_CORE };
+-#define MAXA_META MAXA_CORE + 2
++unsigned char ALST_META[] = { ATTR_HTTP_EQUIV, ATTR_CONTENT, ATTR_CHARSET, ATTR_CORE };
++#define MAXA_META MAXA_CORE + 3
+ unsigned char ALST_FRAME[] = { ATTR_SRC, ATTR_NAME, ATTR_CORE };
+ #define MAXA_FRAME MAXA_CORE + 2
+ unsigned char ALST_FRAMESET[] = { ATTR_COLS, ATTR_ROWS, ATTR_CORE };
+diff -urN w3m-0.5.3/version.c.in w3m/version.c.in
+--- w3m-0.5.3/version.c.in 2011-01-15 16:52:48.000000000 +0900
++++ w3m/version.c.in 2012-05-22 22:11:44.000000000 +0900
+@@ -1,5 +1,5 @@
+-/* $Id: version.c.in,v 1.48 2011/01/15 07:52:48 inu Exp $ */
+-#define CURRENT_VERSION "w3m/0.5.3"
++/* $Id: version.c.in,v 1.49 2012/05/22 09:45:56 inu Exp $ */
++#define CURRENT_VERSION "w3m/0.5.3+cvs"
+
+ #ifndef FM_H
+ char *w3m_version = CURRENT_VERSION;
diff --git a/gnu/packages/w3m.scm b/gnu/packages/w3m.scm
index e7dd583..466958a 100644
--- a/gnu/packages/w3m.scm
+++ b/gnu/packages/w3m.scm
@@ -1,6 +1,7 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
;;; Copyright © 2016 Leo Famulari <leo@famulari.name>
+;;; Copyright © 2016 Kei Kebreau <kei@openmailbox.org>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -36,33 +37,17 @@
(name "w3m")
(version "0.5.3")
(source (origin
- (method url-fetch)
- (uri (string-append "mirror://sourceforge/" name "/" name "/"
- name "-" version "/"
- name "-" version ".tar.gz"))
- (sha256
- (base32
- "1qx9f0kprf92r1wxl3sacykla0g04qsi0idypzz24b7xy9ix5579"))
-
- ;; cf. https://bugs.archlinux.org/task/33397
- (patches (search-patches "w3m-libgc.patch"
- "w3m-force-ssl_verify_server-on.patch"
- "w3m-disable-sslv2-and-sslv3.patch"
- "w3m-disable-weak-ciphers.patch"))))
+ (method url-fetch)
+ ;; Debian's fork of w3m is the only one that is still maintained.
+ (uri (string-append "mirror://debian/pool/main/w/w3m/w3m_"
+ version ".orig.tar.gz"))
+ (sha256
+ (base32
+ "1qx9f0kprf92r1wxl3sacykla0g04qsi0idypzz24b7xy9ix5579"))
+ (patches (search-patches "w3m-upstream-20120522.patch"
+ "w3m-debian-updates.patch"))))
(build-system gnu-build-system)
- (arguments `(#:tests? #f ; no check target
- #:phases (alist-cons-before
- 'configure 'fix-perl
- (lambda _
- ;; https://launchpad.net/bugs/935540
- ;; 'struct file_handle' is used by 'glibc'
- (substitute* '("istream.c" "istream.h")
- (("struct[[:blank:]]+file_handle")
- "struct w3m_file_handle"))
- (substitute* '("scripts/w3mmail.cgi.in"
- "scripts/dirlist.cgi.in")
- (("@PERL@") (which "perl"))))
- %standard-phases)))
+ (arguments `(#:tests? #f)) ; no check target
(inputs
`(("libgc" ,libgc)
("ncurses" ,ncurses)
--
2.10.2
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 818 bytes --]
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m.
@ 2016-11-03 22:54 Kei Kebreau
2016-11-04 3:17 ` Eric Bavier
0 siblings, 1 reply; 12+ messages in thread
From: Kei Kebreau @ 2016-11-03 22:54 UTC (permalink / raw
To: guix-devel
[-- Attachment #1: 0001-gnu-w3m-Switch-to-Debian-s-actively-maintained-fork-.patch --]
[-- Type: text/plain, Size: 825913 bytes --]
From b837111e3ddf406a3b9235538f63af678e3ac741 Mon Sep 17 00:00:00 2001
From: Kei Kebreau <kei@openmailbox.org>
Date: Thu, 3 Nov 2016 17:58:48 -0400
Subject: [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m.
Fixes some security issues seen here:
<http://www.openwall.com/lists/oss-security/2016/11/03/3>
* gnu/packages/patches/w3m-upstream-20120522.patch: New file.
* gnu/packages/patches/w3m-debian-updates.patch: New file.
* gnu/packages/w3m.scm (w3m): Switch to Debian's actively maintained
fork of w3m.
[source]: Use Debian's tarball and patches. Remove obsolete patches.
[arguments]: Remove unnecessary modification of %standard-phases.
* gnu/local.mk (dist_patch_DATA): Register new patches. Remove obsolete
patches.
---
gnu/local.mk | 6 +-
gnu/packages/patches/w3m-debian-updates.patch | 28498 +++++++++++++++++++
.../patches/w3m-disable-sslv2-and-sslv3.patch | 24 -
.../patches/w3m-disable-weak-ciphers.patch | 24 -
.../patches/w3m-force-ssl_verify_server-on.patch | 24 -
gnu/packages/patches/w3m-libgc.patch | 28 -
gnu/packages/patches/w3m-upstream-20120522.patch | 157 +
gnu/packages/w3m.scm | 37 +-
8 files changed, 28668 insertions(+), 130 deletions(-)
create mode 100644 gnu/packages/patches/w3m-debian-updates.patch
delete mode 100644 gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch
delete mode 100644 gnu/packages/patches/w3m-disable-weak-ciphers.patch
delete mode 100644 gnu/packages/patches/w3m-force-ssl_verify_server-on.patch
delete mode 100644 gnu/packages/patches/w3m-libgc.patch
create mode 100644 gnu/packages/patches/w3m-upstream-20120522.patch
diff --git a/gnu/local.mk b/gnu/local.mk
index a23d536..eb4778f 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -891,10 +891,8 @@ dist_patch_DATA = \
%D%/packages/patches/vte-CVE-2012-2738-pt1.patch \
%D%/packages/patches/vte-CVE-2012-2738-pt2.patch \
%D%/packages/patches/vtk-mesa-10.patch \
- %D%/packages/patches/w3m-libgc.patch \
- %D%/packages/patches/w3m-force-ssl_verify_server-on.patch \
- %D%/packages/patches/w3m-disable-sslv2-and-sslv3.patch \
- %D%/packages/patches/w3m-disable-weak-ciphers.patch \
+ %D%/packages/patches/w3m-upstream-20120522.patch \
+ %D%/packages/patches/w3m-debian-updates.patch \
%D%/packages/patches/weechat-python.patch \
%D%/packages/patches/weex-vacopy.patch \
%D%/packages/patches/wicd-bitrate-none-fix.patch \
diff --git a/gnu/packages/patches/w3m-debian-updates.patch b/gnu/packages/patches/w3m-debian-updates.patch
new file mode 100644
index 0000000..3bef2fa
--- /dev/null
+++ b/gnu/packages/patches/w3m-debian-updates.patch
@@ -0,0 +1,28498 @@
+Description: Git master branch of Debian's w3m
+Origin: https://anonscm.debian.org/cgit/collab-maint/w3m.git
+
+diff --git a/Bonus/goodict.cgi b/Bonus/goodict.cgi
+index 8f443c1..5fb6581 100755
+--- a/Bonus/goodict.cgi
++++ b/Bonus/goodict.cgi
+@@ -1,14 +1,20 @@
+ #!/usr/bin/perl
+
+ # ~/.w3m/urimethodmap
+-# e: file:/cgi-bin/goodict.cgi?%s
+-# w: file:/cgi-bin/goodict.cgi?%s
+-# j: file:/cgi-bin/goodict.cgi?%s
++# e: file:/cgi-bin/goodict.cgi?%s Englich-Japanese
++# w: file:/cgi-bin/goodict.cgi?%s Japanese-English
++# j: file:/cgi-bin/goodict.cgi?%s Japanese
++# a: file:/cgi-bin/goodict.cgi?%s All
++#
++# e:0:word start with word
++# e:1:word perfect match
++# e:2:word end with word
++# e:3:word search body text
++# e:6:word search title
++# e:word perfect match
+
+-use NKF;
+-#$mode = 0; # substring
+-$mode = 1; # perfect match
+-#$mode = 3; # search body text
++use Encode;
++use Encode::Guess qw/euc-jp utf8/;
+ $url = "http://dictionary.goo.ne.jp";
+ $_ = $ENV{"QUERY_STRING"};
+ if (/^e:/) {
+@@ -17,14 +23,22 @@ if (/^e:/) {
+ $kind = 'je';
+ } elsif (/^j:/) {
+ $kind = 'jn';
++} elsif (/^a:/) {
++ $kind = 'all'
++}
++s@^[ewja]:@@ && s@^//@@ && s@/$@@;
++if (/^([01236]):/) {
++ $mode=$1;
++ s/^[01236]://;
++}else{
++ $mode="1";
+ }
+-s@^[ewjs]:@@ && s@^//@@ && s@/$@@;
+ if ($_) {
+ s/\+/ /g;
+ s/%([\da-f][\da-f])/pack('C', hex($1))/egi;
+- $_ = nkf("-e", $_);
++ $_ = encode("utf8", decode("Guess", $_));
+ s/[\000-\040\+:#?&%<>"\177-\377]/sprintf('%%%02X', unpack('C', $&))/eg;
+- $url .= "/search.php?MT=$_&kind=$kind&mode=$mode";
++ $url .= "/srch/$kind/$_/m$mode"."u/";
+ } else {
+ $input = "w3m-control: GOTO_LINK";
+ }
+diff --git a/ChangeLog b/ChangeLog
+index 88358ef..f9cc112 100644
+--- a/ChangeLog
++++ b/ChangeLog
+@@ -1,3 +1,1198 @@
++2016-10-31 Tatsuya Kinoshita <tats@debian.org>
++
++ * table.c, table.h, textlist.h:
++ Revert "Treat table height as int instead of short".
++ This reverts commit 0c9aebb26a16ad3acc69b2e87ffd216d43879cb6.
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=842623
++
++2016-10-30 Tatsuya Kinoshita <tats@debian.org>
++
++ * NEWS: Update NEWS.
++
++ * fm.h: Set use_dictcommand to 1 by default.
++
++ * scripts/Makefile.in: Add w3mdict.cgi to LIB_TARGETS.
++
++ * config.h.dist: Typo fix for USE_DICT.
++
++2016-10-30 Boruch Baum <boruch-baum@gmx.com>
++
++ * scripts/w3mdict.cgi: Add w3mdict.cgi to use a dictd dictionary query.
++ Bug-Debian: https://github.com/tats/w3m/issues/30
++
++2016-10-09 Tatsuya Kinoshita <tats@debian.org>
++
++ * form.c:
++ Fix incorrect dereference in formUpdateBuffer when MENU_SELECT.
++ cf. https://github.com/tats/w3m/commit/ec9eb22e008a69ea9dc21fdca4b9b836679965ee
++
++2016-10-08 Tatsuya Kinoshita <tats@debian.org>
++
++ * table.c, table.h, textlist.h:
++ Treat table height as int instead of short.
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=838952
++
++ * form.c: Prevent global-buffer-overflow write in formUpdateBuffer.
++ Bug-Debian: https://github.com/tats/w3m/issues/29
++
++ * form.c: Fix null pointer dereference in formUpdateBuffer.
++ Bug-Debian: https://github.com/tats/w3m/issues/28
++
++2016-08-30 Kuang-che Wu <kcwu@google.com>
++
++ * Str.c: Fix potential heap buffer corruption due to Strgrow.
++ Origin: https://github.com/tats/w3m/pull/27
++
++2016-08-29 Tatsuya Kinoshita <tats@debian.org>
++
++ * anchor.c:
++ Prevent segfault due to buffer overflows in addMultirowsForm.
++ Bug-Debian: https://github.com/tats/w3m/issues/21
++ Bug-Debian: https://github.com/tats/w3m/issues/26
++
++ * form.c: Prevent segfault for formUpdateBuffer.
++ Bug-Debian: https://github.com/tats/w3m/issues/13#issuecomment-242981906
++
++2016-08-24 Tatsuya Kinoshita <tats@debian.org>
++
++ * table.c: Prevent segfault with malformed table_alt.
++ Bug-Debian: https://github.com/tats/w3m/issues/24
++
++ * form.c: Prevent segfault for formUpdateBuffer.
++ Bug-Debian: https://github.com/tats/w3m/issues/22
++
++ * table.c: Truncate max_width for renderTable.
++ Bug-Debian: https://github.com/tats/w3m/issues/25
++
++2016-08-20 Tatsuya Kinoshita <tats@debian.org>
++
++ * file.c, parsetagx.c: Fix uninitialised values for <i> and <dd>.
++ Bug-Debian: https://github.com/tats/w3m/issues/16
++
++ * file.c, parsetagx.c:
++ Revert "Fix uninitialised values for <i> and <dd>".
++ This reverts commit 0fba2f1a6eb6861206ad120a02af2643938082cd.
++ cf. https://github.com/tats/w3m/commit/0fba2f1a6eb6861206ad120a02af2643938082cd#commitcomment-18703355
++
++2016-08-19 Tatsuya Kinoshita <tats@debian.org>
++
++ * file.c, parsetagx.c: Fix uninitialised values for <i> and <dd>.
++ Bug-Debian: https://github.com/tats/w3m/issues/16
++
++2016-08-18 Kuang-che Wu <kcwu@google.com>
++
++ * table.c: Fix table rowspan and colspan.
++ Origin: https://github.com/tats/w3m/pull/19
++ Bug-Debian: https://github.com/tats/w3m/issues/8
++
++2016-08-18 Tatsuya Kinoshita <tats@debian.org>
++
++ * file.c: Prevent segfault with malformed input_alt.
++ Bug-Debian: https://github.com/tats/w3m/issues/18
++
++ * file.c: Prevent segfault with incorrect button type.
++ Bug-Debian: https://github.com/tats/w3m/issues/17
++
++2016-08-17 Tatsuya Kinoshita <tats@debian.org>
++
++ * file.c: Prevent segfault with incorrect form_int fid.
++ Bug-Debian: https://github.com/tats/w3m/issues/15
++
++ * libwc/iso2022.c: Prevent segfault when iso2022 parsing.
++ Bug-Debian: https://github.com/tats/w3m/issues/14
++
++ * form.c: Prevent segfault for formUpdateBuffer.
++ Bug-Debian: https://github.com/tats/w3m/issues/13
++
++ * file.c, form.c:
++ Prevent negative array index for selectnumber and textareanumber.
++ Bug-Debian: https://github.com/tats/w3m/issues/12
++
++2016-08-16 Tatsuya Kinoshita <tats@debian.org>
++
++ * file.c: Truncate large values of table attributes.
++ Bug-Debian: https://github.com/tats/w3m/issues/11
++
++2016-08-15 Tatsuya Kinoshita <tats@debian.org>
++
++ * form.c: Prevent segfault for formUpdateBuffer.
++ Bug-Debian: https://github.com/tats/w3m/issues/9
++ Bug-Debian: https://github.com/tats/w3m/issues/10
++
++2016-08-09 Tatsuya Kinoshita <tats@debian.org>
++
++ * file.c: Prevent segfault with malformed input type.
++ Bug-Debian: https://github.com/tats/w3m/issues/7
++
++2016-08-08 Tatsuya Kinoshita <tats@debian.org>
++
++ * Makefile.in, configure, configure.ac, scripts/w3mman/Makefile.in:
++ Install German manpages.
++
++2016-08-08 Markus Hiereth <post@hiereth.de>
++
++ * doc-de/MANUAL.html, doc/MANUAL.html:
++ Update MANUAL.html in English and German.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=772341#90
++
++ * doc-de/FAQ.html, doc/FAQ.html: Update FAQ.html in English and German.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=772341#85
++
++ * scripts/w3mman/w3mman.1.in, scripts/w3mman/w3mman.de.1.in:
++ Update manpage for w3mman in English and German.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=772341#80
++
++ * doc-de/w3m.1, doc/w3m.1:
++ Update manpage for w3m in English and German.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=772341#75
++
++2016-07-18 Tatsuya Kinoshita <tats@debian.org>
++
++ * NEWS: Update NEWS.
++
++ * fm.h: Set default_url to 1 by default.
++
++2016-06-20 Tatsuya Kinoshita <tats@debian.org>
++
++ * doc-de/README.func, scripts/w3mhelp-funcdesc.de.pl.in:
++ Trim trailing spaces.
++
++2016-06-20 Markus Hiereth <post@hiereth.de>
++
++ * doc-de/README.func, scripts/w3mhelp-funcdesc.de.pl.in:
++ Update German help messages.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=765682#47
++
++2016-06-19 Tatsuya Kinoshita <tats@debian.org>
++
++ * doc-de/README.func, scripts/w3mhelp-funcdesc.de.pl.in:
++ Convert German help messages to UTF-8.
++
++ * main.c: Update description of SOURCE and VIEW.
++
++2016-06-19 Markus Hiereth <post@hiereth.de>
++
++ * doc-de/README.func, doc/README.func:
++ Update description of SOURCE and VIEW.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=765682#37
++
++2016-06-19 Tatsuya Kinoshita <tats@debian.org>
++
++ * NEWS: Update NEWS.
++
++ * doc-de/README.func: Update German messages.
++
++ * doc/README.func, main.c, menu.c: Update English messages.
++
++ * doc-jp/README.func, scripts/w3mhelp-funcdesc.ja.pl.in:
++ Update Japanese help messages.
++
++2016-06-19 Markus Hiereth <post@hiereth.de>
++
++ * doc-de/README.func, scripts/w3mhelp-funcdesc.de.pl.in:
++ Update German help messages.
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=765682
++
++ * doc/README.func, scripts/w3mhelp-funcdesc.en.pl.in:
++ * scripts/w3mhelp.cgi.in: Update English help messages.
++
++2016-05-11 Tatsuya Kinoshita <tats@debian.org>
++
++ * config.guess, config.sub:
++ Update config.* with autotools-dev 20160430.1.
++
++2016-04-14 Tatsuya Kinoshita <tats@debian.org>
++
++ * doc-de/README.func, doc-jp/README.func, doc/README.func:
++ * w3m-doc/sample/keymap.cgi: Cleanup obsolete INIT_MAILCAP.
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=820902
++
++ * NEWS: Update NEWS.
++
++2016-04-08 Tatsuya Kinoshita <tats@debian.org>
++
++ * libwc/johab.c: Fix segfault on bogus text for wc_N_to_johab1.
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=820373
++
++2016-04-07 Tatsuya Kinoshita <tats@debian.org>
++
++ * libwc/map/big5_ucs.map, libwc/map/cns11643_ucs.map:
++ * libwc/map/gb12345_ucs.map, libwc/map/gb2312_ucs.map:
++ * libwc/map/gbk_ucs.map, libwc/map/hkscs_ucs.map:
++ * libwc/map/jisx0208x0212x0213_ucs.map, libwc/map/ksx1001_ucs.map:
++ * libwc/map/sjis_ext_ucs.map, libwc/map/uhc_ucs.map, libwc/ucs.c:
++ * libwc/ucs.map: Fix segfault on bogus text for wc_any_to_ucs.
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=820162
++
++2016-04-03 Tatsuya Kinoshita <tats@debian.org>
++
++ * doc/FAQ.html, doc/MANUAL.html: Update English documents.
++
++2016-04-03 Markus Hiereth <markus.hiereth@freenet.de>
++
++ * doc/FAQ.html, doc/MANUAL.html: Update English documents.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=772341#25
++
++2016-04-02 Tatsuya Kinoshita <tats@debian.org>
++
++ * configure, configure.ac, doc-de/README.func, scripts/Makefile.in:
++ * scripts/w3mhelp-funcdesc.de.pl.in, scripts/w3mhelp.cgi.in:
++ Support German translated help messages (translation is in progress).
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=765682
++
++ * doc-jp/w3m.1, doc/w3m.1: Update manpage footers to w3m 0.5.3.
++
++ * doc-jp/MANUAL.html, doc-jp/w3m.1, w3m-doc/outline.html.in:
++ * w3mhelp-lynx_ja.html.in, w3mhelp-w3m_ja.html.in:
++ Update Japanese documents for extbrowser4..9.
++
++2016-04-02 Justin B Rye <justin.byam.rye@gmail.com>
++
++ * doc/FAQ.html, doc/MANUAL.html, doc/README.func, doc/menu.submenu:
++ * main.c, menu.c, scripts/w3mhelp-funcdesc.ja.pl.in:
++ * scripts/w3mhelp.cgi.in, w3mhelp-lynx_en.html.in:
++ * w3mhelp-w3m_en.html.in: English fixes.
++ cf. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=772341#15
++ Origin: https://lists.debian.org/debian-l10n-english/2014/12/msg00002.html
++ Origin: https://lists.debian.org/debian-l10n-english/2014/12/msg00030.html
++ Origin: https://lists.debian.org/debian-l10n-english/2015/02/msg00011.html
++
++2016-03-30 Leo Famulari <leo@famulari.name>
++
++ * url.c: Disable RC4.
++ Origin: http://git.savannah.gnu.org/cgit/guix.git/commit/?id=62339e2d493bf87a3aabe12e45458581e9705d83
++
++2016-03-29 Tatsuya Kinoshita <tats@debian.org>
++
++ * url.c: Fix variable is reassigned a value before the old one has
++ been used.
++
++ * regex.c: Fix printf format specifier mismatch when REGEX_DEBUG.
++
++ * w3mimg/fb/fb.c: Fix invalid braces when not Linux or FreeBSD.
++
++ * local.c: Fix uninitialized variable when not HAVE_PUTENV.
++
++ * w3mimgdisplay.c: Fix realloc mistake for DrawImage.
++
++ * file.c: Fix mistake of unescape spaces for _doFileCopy.
++ cf. [w3m-dev-en 00751], [w3m-dev-en 00752] on 2002-06-09
++
++ * url.c: Fix style of array index is used before limits check.
++ Bug: https://sourceforge.net/p/w3m/feature-requests/25/
++
++2016-03-22 Tatsuya Kinoshita <tats@debian.org>
++
++ * menu.c, proto.h: Fix build failure when not USE_MOUSE for sgrmouse.
++ cf. https://twitter.com/naota344/status/711541592167854081
++
++2016-03-20 Tatsuya Kinoshita <tats@debian.org>
++
++ * rc.c: Fix reverse ordered config parameters.
++
++2016-03-19 Tatsuya Kinoshita <tats@debian.org>
++
++ * doc/FAQ.html: Update FAQ for extbrowser.
++
++2016-03-14 Tatsuya Kinoshita <tats@debian.org>
++
++ * po/de.po, po/ja.po, po/w3m.pot, po/zh_CN.po, po/zh_TW.po, rc.c:
++ Update PO strings for extbrowser2..9.
++
++2016-03-13 Tatsuya Kinoshita <tats@debian.org>
++
++ * acinclude.m4, configure:
++ Set firefox instead of mozilla to default browser.
++
++ * po/Makefile.in.in, po/de.po, po/ja.po, po/w3m.pot, po/zh_CN.po:
++ * po/zh_TW.po: Update PO strings for extbrowser4..9.
++
++ * doc-jp/MANUAL.html, doc/MANUAL.html, fm.h, main.c, rc.c:
++ Add extbrowser4, extbrowser5, ..., and extbrowser9.
++ e.g.
++ - extbrowser8 url=%s && printf %s "$url" | xsel && printf %s "$url" | xsel -b
++ - extbrowser9 mpv %s &
++ cf. https://github.com/spcmd/w3m
++
++2016-02-28 Tatsuya Kinoshita <tats@debian.org>
++
++ * menu.c: Fix SIGFPE for ACCESSKEY.
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=779092
++
++ * doc/README.func, main.c: Typo fix for ACCESSKEY.
++ cf. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=779092#5
++
++2015-12-20 Franz Thoma <franz.thoma@tngtech.com>
++
++ * w3mimg/x11/x11_w3mimg.c: Fix semi-transparent artifacts in w3m-img
++ when used with 32-bit color (e.g. urxvt).
++ imlib_render_image_on_drawable_at_size() tended to leave nasty
++ semi-transparent artifacts in 32-bit mode. Apparently, resizing an
++ image in 32-bit mode affects the alpha channel even if there is no
++ transparency in the image. With this patch, resizing is done in
++ 24-bit mode (or whatever depth the original image has) before
++ converting the image to 32-bit and rendering it on the display.
++ Origin: https://gist.github.com/fmthoma/f76a1b44e00d5ca972bb
++ cf. https://github.com/hut/ranger/issues/86#issuecomment-166027119
++
++2015-12-17 Tatsuya Kinoshita <tats@debian.org>
++
++ * w3mimg/x11/x11_w3mimg.c:
++ Wrap render_pixbuf_to_pixmap_32() in USE_GTK2.
++
++2015-12-17 Araki Ken <arakiken@users.sf.net>
++
++ * w3mimg/x11/x11_w3mimg.c:
++ w3mimgdisplay supports 32 bit depth screen. (e.g. gnome-terminal)
++ Origin: https://bitbucket.org/arakiken/w3m/commits/f9c22db8cfd1aaba9bb7301ef9ba51ed88d8bb40
++
++2015-12-17 Tatsuya Kinoshita <tats@debian.org>
++
++ * w3mimg/x11/x11_w3mimg.c:
++ Revert "Fix handling visuals and colormaps incorrectly".
++ This reverts commit e24b4064daf3e022e370788a8c7267db40c37dda.
++
++2015-11-19 Tatsuya Kinoshita <tats@debian.org>
++
++ * fm.h: Accept cookies by default.
++
++ * fm.h: Set argv_is_url to 1 by default.
++ Bug-Arch: https://bugs.archlinux.org/task/47102
++
++2015-11-18 Tatsuya Kinoshita <tats@debian.org>
++
++ * config.guess, config.sub:
++ Update config.* with autotools-dev 20150820.1.
++
++2015-11-11 Mingye Wang (Arthur2e5) <arthur200126@gmail.com>
++
++ * po/LINGUAS, po/zh_CN.po, po/zh_TW.po:
++ Add zh_CN and zh_TW translations.
++ Please note that the zh_TW translation is machine-converted using
++ OpenCC from zh_CN, and needs to be further polished by actual zh_TW
++ speakers.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=804732#10
++
++2015-10-24 BwackNinja <BwackNinja@gmail.com>
++
++ * w3mimg/x11/x11_w3mimg.c:
++ Fix handling visuals and colormaps incorrectly.
++ cf. https://github.com/hut/ranger/issues/86
++ Origin: https://gist.github.com/BwackNinja/60a344730170f9ce2163
++ Bug-Arch: https://bugs.archlinux.org/task/46836
++ Bug: https://sourceforge.net/p/w3m/patches/72/
++
++2015-10-10 Tatsuya Kinoshita <tats@debian.org>
++
++ * cookie.c: Remove incomplete special_domain tests.
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=385702
++
++2015-10-04 Gaetan Bisson <bisson@archlinux.org>
++
++ * scripts/w3mhelp.cgi.in: Do not use defined(%hash).
++ Origin: https://projects.archlinux.org/svntogit/packages.git/commit/trunk?h=packages/w3m&id=d9e0a4f0b461c9e2177cd9e64a10581386650503
++ Bug-Arch: https://bugs.archlinux.org/task/45608
++
++2015-09-06 Tatsuya Kinoshita <tats@debian.org>
++
++ * file.c: Do not use C99-style comments.
++
++2015-09-06 David Crosby <dave@dafyddcrosby.com>
++
++ * file.c: Mitigate issue #16 found by @kcwu.
++ * table.c: Fix stack overflow found by @kcwu.
++ Origin: https://github.com/dafyddcrosby/sw3m
++ Bug-sw3m: https://github.com/dafyddcrosby/sw3m/issues/16
++
++2015-08-21 Tatsuya Kinoshita <tats@debian.org>
++
++ * doc-jp/keymap.lynx, doc/keymap.lynx: Fix unknown key.
++ Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/w3m/+bug/265144
++ Bug: https://sourceforge.net/p/w3m/bugs/48/
++
++2015-08-11 David Crosby <dave@dafyddcrosby.com>
++
++ Fix resource leaks, dead assignments, divide-by-zero, and so on.
++ Origin: https://github.com/dafyddcrosby/sw3m
++
++ * buffer.c: Check for presence of prevl before using.
++
++ * html.h: Adjust UFclose to remove false positive of CWE-481.
++
++ * ftp.c: Move sockent for splint.
++
++ * cookie.c: Use unsigned int for max_count.
++
++ * libwc/iso2022.c: Add missing comparision that made if always true.
++
++ * Str.c: Use fgetc in while loops, use int instead of char.
++
++ * mailcap.c: Adjust len to size_t.
++
++ * history.c: Check return value of rename.
++
++ * main.c: Adjust while loop.
++
++ * news.c: Check dup call for errors.
++
++ * file.c: Remove unused value.
++
++ * ftp.c: dup can give a negative value.
++
++ * main.c: Use int for c.
++
++ * table.c: Initialize new_tabwidth at declaration.
++
++ * local.c: Remove overflow on readlink.
++
++ * anchor.c, file.c, istream.c, main.c, menu.c, rc.c, table.c, terms.c:
++ * url.c: Remove dead assignments flagged by Clang static analysis.
++
++ * w3mbookmark.c:
++ Move fclose to fix dereference after null check (Coverity).
++
++ * file.c: Fix resource leak in AuthDigestCred.
++
++ * buffer.c: Fix resource leak in readBufferCache.
++
++ * cookie.c: Fix resource leak in load_cookies.
++
++ * frame.c: Fix resource leak.
++
++ * w3mhelperpanel.c: Fix resource leak.
++
++ * w3mbookmark.c: Fix resource leak and a null return value dereference.
++
++ * linein.c: Fix a divide-by-zero.
++
++ * cookie.c: Change total_dot_number to unsigned int.
++
++ * cookie.c: Free tmp.
++
++ * local.c: Remove unreachable return.
++
++2015-08-10 Alan Grow <alangrow@gmail.com>
++
++ * url.c (HTTPrequest):
++ - Use Content-Type instead of Content-type.
++ - Use Content-Length instead of Content-length.
++ Origin: https://github.com/acg/w3m/commit/5946c2784d4eae46ec06e52390e43a874b3395fc
++
++2015-08-09 Egmont Koblinger <egmont@users.sourceforge.net>
++
++ * terms.c: Support sgrmouse for skip_escseq.
++ * menu.c: Adjust comments for keymaps.
++ Origin: https://sourceforge.net/p/w3m/patches/65/#e2aa
++
++2015-08-09 Tatsuya Kinoshita <tats@debian.org>
++
++ * keybind_lynx.c: Support sgrmouse for Lynx-like key binding.
++ cf. https://sourceforge.net/p/w3m/patches/65/
++
++2015-08-09 IWAMOTO Kouichi <sue@iwmt.org>
++
++ * menu.c: Support SGR style mouse handler for menu.
++ cf. https://github.com/tats/w3m/issues/5
++ Origin: https://gist.github.com/ttdoda/83fbcf676a21da28432b
++ Bug: https://sourceforge.net/p/w3m/patches/65/
++
++2015-08-06 Richard Quirk <richard@quirk.es>
++
++ Fix problems reported by cppcheck, clang --analyze and gcc warnings.
++ Origin: https://github.com/tats/w3m/pull/6
++
++ * Str.c, Str.h: Strnew_charp and co do not modify the char* input.
++
++ * local.c: Close temp file if pipe open fails.
++
++ * rc.c: Avoid passing null to strlen.
++
++ * file.c: Initialise hidden_input to NULL.
++ This prevents a possible use of garbage value on line 3017.
++
++ * file.c: Use pclose for pipe.
++
++2015-08-05 IWAMOTO Kouichi <sue@iwmt.org>
++
++ * main.c: Fix that SGR style mouse handler has off-by-one problem.
++ cf. https://github.com/tats/w3m/issues/5
++ Origin: https://gist.github.com/ttdoda/30c189a63d483beeb207
++ Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/w3m/+bug/1390768
++ Bug: https://sourceforge.net/p/w3m/patches/65/
++
++2015-07-31 yshl <yshl@takechiyo.net>
++
++ * Bonus/goodict.cgi:
++ - Use Encode.pm instead of NKF.
++ - Update to the current URL.
++ - Enable to select search mode.
++ Origin: https://github.com/tats/w3m/pull/4
++
++2015-07-20 Tatsuya Kinoshita <tats@debian.org>
++
++ * README: Add short description.
++
++ * doc-jp/FAQ.html, doc/FAQ.html: Mention GOPHER_PROXY and FTP_PROXY.
++
++2015-07-05 Tatsuya Kinoshita <tats@debian.org>
++
++ * doc-jp/FAQ.html, doc/FAQ.html: Mention HTTPS_PROXY.
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=791425
++
++2015-06-27 yshl <yshl@takechiyo.net>
++
++ * doc-jp/README.SSL: Modify certdata2pem.rb to assume the encoding
++ of the certdata.txt to be UTF-8.
++ Origin: https://github.com/tats/w3m/pull/3
++
++2015-06-23 Daniel Schepler <dschepler@gmail.com>
++
++ * terms.c: Wrap the functions used by image.c in USE_IMAGE.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=789539
++
++2015-05-09 Tatsuya Kinoshita <tats@debian.org>
++
++ * doc-jp/README.siteconf, doc/README.siteconf:
++ Update examples of siteconf for twitter.com.
++
++2015-05-03 Tatsuya Kinoshita <tats@debian.org>
++
++ * main.c: Correct GC version confirmation.
++
++2015-05-02 yshl <yshl@takechiyo.net>
++
++ * main.c: Correct GC version confirmation.
++ Origin: https://github.com/tats/w3m/pull/2
++
++2015-04-29 Markus Hiereth <post@hiereth.de>
++
++ * po/de.po: Update German translation.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=783383
++
++2015-04-29 Tatsuya Kinoshita <tats@debian.org>
++
++ * po/Makevars, po/de.po, po/ja.po, po/w3m.pot, rc.c:
++ Update PO strings for display_borders.
++
++2015-04-26 yshl <yshl@takechiyo.net>
++
++ * main.c: Use GC_oom_fn instead of GC_set_oom_fn for gc-7.1.
++ Origin: https://github.com/tats/w3m/pull/1
++
++2015-02-03 Tatsuya Kinoshita <tats@debian.org>
++
++ * po/de.po, po/ja.po, po/w3m.pot: Update PO.
++
++2015-02-02 Tatsuya Kinoshita <tats@debian.org>
++
++ * file.c, fm.h, rc.c:
++ New option "display_borders" to display 0 pixel table borders.
++ cf. http://d.hatena.ne.jp/rubikitch/20101120
++
++2015-01-24 Tatsuya Kinoshita <tats@debian.org>
++
++ * acinclude.m4, configure, version.c.in:
++ Update to 0.5.3+gitYYYYMMDD (generate from ChangeLog).
++
++2015-01-15 Tatsuya Kinoshita <tats@debian.org>
++
++ * alloc.h, main.c: Drop C99 features.
++
++2015-01-15 Scarlett <scarlett@xavin.net>
++
++ Add overflow detection.
++ Origin: http://marc.info/?l=openbsd-ports&m=142090828929750&w=2
++ * main.c: Call exit(1) when out of memory to avoid dereferencing null
++ pointers when gc's malloc fails.
++ * alloc.h: Replacements for w3m's allocation macros which add
++ overflow detection and concentrate the macros in one file.
++ * indep.h, libwc/charset.c, libwc/status.c, matrix.c: Use the
++ overflow-detecting allocation macros from alloc.h.
++
++2015-01-15 Tatsuya Kinoshita <tats@debian.org>
++
++ * Str.c, cookie.c, map.c:
++ Do not use C99 printf format specifiers and asprintf.
++
++2015-01-15 Scarlett <scarlett@xavin.net>
++
++ Correct printf arguments and use asprintf.
++ Origin: http://marc.info/?l=openbsd-ports&m=142090828929750&w=2
++ * Str.c: Use asprintf() instead of rolling our own printf string
++ length detection.
++ * cookie.c: Pass the char pointer in the string struct to printf %s
++ instead of the string struct itself.
++ Print time_t using %lld instead of %ld to allow for 64-bit time_t.
++ * main.c: Print a long int using the correct format specifier.
++ * map.c: Print size_t using the correct format specifier.
++
++2014-12-06 Araki Ken <arakiken@users.sf.net>
++
++ Support OSC 5379 remote imaging and sixel graphics.
++ Origin: https://bitbucket.org/arakiken/w3m/branch/remoteimg (2014-11-16)
++
++ * doc/README.sixel, terms.c: Add README.sixel. W3M_IMG2SIXEL
++ environmental variable enables to specify options of img2sixel.
++
++ * image.c, terms.c:
++ Add n_terminal_image argument to put_image_{sixel|osc5379}().
++ Use struct winsize to calculate ppc and ppl.
++
++ * terms.c: If SCREEN_VARIANT=sixel on GNU screen, exec img2sixel
++ without -P option.
++
++ * terms.c: ttymode_set() -> ttymode_reset().
++
++ * terms.c: Fix.
++
++ * terms.c: Support GNU screen.
++
++ * terms.c: Show GIF (except animation GIF) correctly.
++
++ * main.c, terms.c: img2sixel exits by Ctrl+C. Enable GIF Animation if
++ 'I' is pressed to show it.
++
++ * image.c: Add declaration of get_pixel_per_cell().
++
++ * terms.c: Show the first frame of animation gif files.
++
++ * terms.c: system() -> fork()&execvp()
++
++ * display.c: Draw underline on anchor which contains cboth text and
++ images.
++
++ * etc.c: Remove close_tty() from setup_child() because close_tty()
++ sometimes interrupts loadGeneralFile() in loadImage() and corrupt
++ image data can be cached in ~/.w3m.
++
++ * image.c: Minor fix.
++
++ * image.c: Cache image files if at all possible and convert them to
++ sixel when -sixel option is specified.
++
++ * image.c: Init pixel_per_{char|line}_i if get_pixel_per_cell() fails.
++
++ * display.c, file.c, fm.h, image.c, main.c, terms.c:
++ Add -sixel option which supports image processing by img2sixel.
++
++ * image.c: Don't download image files whose size is specified in
++ <img> tag.
++
++ * image.c: Minor fixes of parseImageHeader().
++
++ * image.c: Determine the format of an image file by its header data
++ not by its file name suffix.
++
++ * image.c: Read width and height from jpeg, png and gif files directly
++ instead of executing w3mimgdisplay -size.
++
++ * display.c: display.c: Draw underline on anchor text which is not
++ overlapped with any image.
++
++ * terms.c: Clear fd_set by FD_ZERO() before select().
++
++ * file.c: nw and ni are rounded up instead of rounded off to show
++ every corner of images.
++
++ * terms.c: Change time to wait for the response of "\x1b[14t\x1b[18t"
++ from 0.1 sec to 0.5 sec.
++
++ * image.c:
++ - clearImage() works.
++ - Use cached image files created by w3m in getImage().
++
++ * file.c: Hack for alignment.
++
++ * fm.h, image.c, terms.c:
++ - Adjust the image size to the terminal cell size.
++ - If the image size is specified in html source, skip to load the image.
++
++ * display.c, fm.h, image.c, main.c, terms.c, w3mimg/x11/x11_w3mimg.c:
++ Support remote image by OSC 5379 show_picture sequence.
++
++2014-12-06 Olaf Hering <olh@suse.de>
++
++ * parsetagx.c: Fix crash in parse_tag() during every start.
++ Origin: https://build.opensuse.org/package/view_file/openSUSE:Factory/w3m/w3m-parsetagx-crash.patch?expand=1
++
++ * fm.h: Change the default to alt_entity=0.
++ Change the default for the option "Use ASCII equivalents to
++ display entities" from YES to NO.
++ Origin: https://build.opensuse.org/package/view_file/openSUSE:Factory/w3m/w3m-0.5.1-no-ASCII-equivalents-by-default.patch?expand=1
++ Bug-Novell: https://bugzilla.novell.com/show_bug.cgi?id=247397
++
++ * anchor.c, libwc/gb18030.c, libwc/ucs.c, regex.c:
++ Fix a few harmless uninitialized variables.
++ Origin: https://build.opensuse.org/package/view_file/openSUSE:Factory/w3m/w3m-uninitialized.patch?expand=1
++
++2014-12-06 Peter Poeml <poeml@suse.de>
++
++ * terms.c: Prevent segfault when editing a textarea field with vi.
++ Add fix for segfault that can occur when editing a textarea field
++ with vi, and returning to w3m (it seems to happen if the terminal
++ is not writable, as when using w3m after 'su - some_user')
++ Origin: https://build.opensuse.org/package/view_file/openSUSE:Factory/w3m/w3m-0.4.1-textarea-segfault.dif?expand=1
++
++2014-12-04 Tatsuya Kinoshita <tats@debian.org>
++
++ * acinclude.m4: Follow updated configure.
++
++2014-12-03 Yusuke Baba <babayaga1@y8.dion.ne.jp>
++
++ * configure, w3mimg/fb/fb.c, w3mimg/fb/fb.h, w3mimg/fb/fb_w3mimg.c:
++ Support FreeBSD framebuffer.
++ Origin: http://www.ac.auone-net.jp/~baba/w3m-img/index.html
++ Bug-FreeBSD: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=122673
++
++2014-12-02 Naohiro Aota <naota@gentoo.org>
++
++ * acinclude.m4, configure, w3mimg/fb/fb_gdkpixbuf.c:
++ * w3mimg/x11/x11_w3mimg.c:
++ Depend on gdk-pixbuf instead of gtk when gtk2.
++ Origin: http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/www-client/w3m/files/w3m-0.5.3-gdk-pixbuf.patch?revision=1.1
++
++2014-12-02 Jeroen Roovers <jer@gentoo.org>
++
++ * acinclude.m4, configure: Add tinfo to with_termlib.
++ Fix building against sys-libs/ncurses[tinfo].
++ Origin: https://504588.bugs.gentoo.org/attachment.cgi?id=372650
++ Bug-Gentoo: https://bugs.gentoo.org/show_bug.cgi?id=504588
++
++2014-12-01 OBATA Akio <obache@netbsd.org>
++
++ * acinclude.m4, configure:
++ Assume defined PKG_CONFIG points right location when gtk2.
++ Origin: http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/www/w3m/patches/patch-aa?rev=1.13&content-type=text/x-cvsweb-markup
++ Origin: http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/www/w3m/patches/patch-ak?rev=1.1&content-type=text/x-cvsweb-markup
++
++2014-12-01 Vsevolod Stakhov <vsevolod@FreeBSD.org>
++
++ * config.h.in: Disable USE_EGD for LibreSSL.
++ Disable use of RAND_egd as it is absent in FreeBSD.
++ This also fixes build error with LibreSSL.
++ Origin: https://bz-attachments.freebsd.org/attachment.cgi?id=144635
++ Bug-FreeBSD: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=191852
++ Bug-FreeBSD: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=191956
++
++2014-12-01 zimous <zimous@matfyz.cz>
++
++ * po/ja.po: Set Language tag properly for Japanese translation.
++ Origin: https://512722.bugs.gentoo.org/attachment.cgi?id=378452
++ Bug-Gentoo: https://bugs.gentoo.org/show_bug.cgi?id=512722
++
++2014-11-30 Tatsuya Kinoshita <tats@debian.org>
++
++ * doc/w3m.1: Typo fix.
++
++2014-11-30 Markus Hiereth <post@hiereth.de>
++
++ * doc/w3m.1: Miscellaneous changes to improve English manpage.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=766550#30
++
++2014-11-29 Markus Hiereth <post@hiereth.de>
++
++ * doc/w3m.1: Improve FILES.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=766550#30
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=403634
++
++ * doc/w3m.1: Improve EXAMPLES.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=766550#30
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=380560
++
++ * doc/w3m.1: Improve explanation about option -N.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=766550#30
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=345084
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=530468
++
++ * doc/w3m.1: Note that -cols only affects when HTML is rendered.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=766550#30
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=285251
++
++ * doc/w3m.1: Add more info on configuration.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=766550#30
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=268211
++
++2014-11-29 Justin B Rye <justin.byam.rye@gmail.com>
++
++ * scripts/w3mman/w3mman.1.in: Tweak for W3MMAN_W3M.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=771003#5
++
++ * scripts/w3mman/w3mman.1.in: English fixes.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=766550#25
++
++2014-11-29 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-19+.
++
++2014-11-29 Justin B Rye <justin.byam.rye@gmail.com>
++
++ * scripts/w3mman/w3mman2html.cgi.in: Fix Perl warnings.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=771004
++
++2014-10-21 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-19
++
++ * po/LINGUAS: Correct LINGUAS to a whitespace separated list
++
++2014-10-21 Markus Hiereth <markus.hiereth@freenet.de>
++
++ * po/LINGUAS, po/de.po: Add German translation
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=763964
++
++2014-10-15 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-18
++
++ * doc-jp/README.SSL: Update README.SSL to follow default values
++
++ * config.sub: Update config.sub with autotools-dev 20140911.1
++
++ * fm.h: Disable SSLv3 by default [CVE-2014-3566]
++ cf. https://blog.mozilla.org/security/2014/10/14/the-poodle-attack-and-the-end-of-ssl-3-0/
++
++2014-10-15 Ludwig Nussel <ludwig.nussel@suse.de>
++
++ * fm.h: Force ssl_verify_server on and disable SSLv2 support
++ Origin: http://www.openwall.com/lists/oss-security/2010/06/14/4
++
++2014-10-13 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-17+
++
++2014-10-04 Tatsuya Kinoshita <tats@debian.org>
++
++ * libwc/ambwidth_map.awk, libwc/map/ucs_ambwidth.map:
++ Fix incorrect generation of ucs_ambwidth_map
++
++2014-08-22 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-17
++
++ * config.guess:
++ Update config.guess to 2014-03-23 with autotools-dev 20140510.1
++
++ * config.sub:
++ Update config.sub to 2014-05-01 with autotools-dev 20140510.1
++
++2014-08-22 Micah Cowan <micah@addictivecode.org>
++
++ * main.c: Support Boehm GC 7.2.
++ Replace Gentoo's patch to prevent segfaults due to infinite recursion.
++ Origin: https://bugs.debian.org/cgi-bin/bugreport.cgi?msg=5;filename=080_gc72.patch;att=1;bug=758831
++ Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=758831
++ Bug-Fedora: https://bugzilla.redhat.com/show_bug.cgi?id=555467
++ Bug: http://sourceforge.net/p/w3m/patches/63/
++ Bug: http://sourceforge.net/p/w3m/patches/59/
++
++2014-08-22 Tatsuya Kinoshita <tats@debian.org>
++
++ * main.c:
++ Revert "Support Boehm GC 7.2" (w3m-0.5.2-gc72.patch from Gentoo)
++ This reverts commit 4331db3e3e673ac4dbfe8e9f2b42a8e0478dc98a.
++
++2014-06-23 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-16
++
++ * url.c: Disable ciphers that use keys smaller than 128 bits
++ Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/w3m/+bug/1325674
++
++2014-01-04 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-15
++
++2014-01-03 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-14
++
++ * acinclude.m4, configure: Use pkg-config to build with imlib2 1.4.6
++
++ * doc/HISTORY, doc/README.cookie, doc/README.m17n:
++ Prefer US-ASCII rathar than Japanese encodings in English documents
++
++2013-12-27 Tatsuya Kinoshita <tats@debian.org>
++
++ * doc-jp/MANUAL.html, doc/MANUAL.html:
++ Cleanup unusable links in MANUAL.html
++ Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=517315
++
++ * version.c.in: Update to 0.5.3+debian-13+
++
++2013-12-17 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-13
++
++2013-12-14 Tatsuya Kinoshita <tats@debian.org>
++
++ * config.guess:
++ Update config.guess to 2013-06-10 with autotools-dev 20130810.1
++
++ * config.sub:
++ Update config.sub to 2013-08-10 with autotools-dev 20130810.1
++
++2013-12-07 Reinhard Max <max@suse.de>
++
++ * local.c: Fix a directory descriptor leak in loadLocalDir.
++ Patch from openSUSE on 2009-09-07.
++ Origin: https://build.opensuse.org/package/view_file/openSUSE:Factory/w3m/w3m-closedir.patch
++ Bug-Novell: https://bugzilla.novell.com/show_bug.cgi?id=531675
++
++2013-12-07 AIDA Shinra <shinra@j10n.org>
++
++ * main.c: Fix crash after SEARCH_NEXT.
++ Patch from <http://www.j10n.org/files/w3m-cvs-1.1055-search-next.patch>,
++ [w3m-dev:04473] on 2013-12-07.
++
++2013-11-11 Paul Boekholt <p.boekholt@gmail.com>
++
++ * file.c: Add support for single quoted meta refresh URL
++ Bug: https://sourceforge.net/p/w3m/patches/53/
++ Bug-NetBSD: http://gnats.netbsd.org/42400
++
++2013-11-07 Cristian Rodriguez <crrodriguez@opensuse.org>
++
++ * url.c: Use SSL_OP_NO_COMPRESSION if available.
++ Due to the "CRIME attack" (CVE-2012-4929) HTTPS clients that
++ negotiate TLS-level compression can be abused for MITM attacks.
++ * url.c: Use SSL_MODE_RELEASE_BUFFERS if available.
++ Patch from openSUSE on 2012-11-12:
++ https://build.opensuse.org/request/show/141054
++
++2013-10-15 Tatsuya Kinoshita <tats@debian.org>
++
++ * Makefile.in:
++ Depend on funcname.tab to fix parallel make issue of scripts
++ Bug: https://sourceforge.net/p/w3m/patches/64/
++ Bug-Gentoo: https://bugs.gentoo.org/show_bug.cgi?id=362249
++
++ * w3mimg/Makefile.in:
++ Avoid prerequisite $(IMGOBJS) to fix parallel make issue of w3mimg
++ Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=726188
++
++ * acinclude.m4, configure:
++ Explicitly add -lX11 to IMGX11LDFLAGS only when gtk2
++ Bug: https://sourceforge.net/p/w3m/patches/57/
++
++ * w3mimg/Makefile.in: Revert "Fix parallel make issue"
++ This reverts commit aa6f871c6dcc108118142bcc786e4a6ac3d46867.
++
++ * Makefile.in:
++ Revert "Explicitly link w3mimgdisplay with -lX11 to build with gcc 4.5"
++ This reverts commit 7410954066d68ac2ad6aea638801714447321fec.
++
++2013-10-14 AIDA Shinra <shinra@j10n.org>
++
++ * url.c: Define schemeNumToName() to fix scheme bug.
++ Patch from <http://www.j10n.org/files/w3m-cvs-1.1055-schemebug.patch>,
++ [w3m-dev:04470] on 2013-10-14.
++ Bug: https://sourceforge.net/p/w3m/patches/60/
++
++ * config.h.in, file.c, fm.h, html.h, image.c, indep.c, indep.h:
++ * istream.c, istream.h, local.c, main.c, mimehead.c, proto.h:
++ Workaround of GC crash on Cygwin64.
++ Patch from <http://www.j10n.org/files/w3m-cvs-1.1055-win64gc.patch>,
++ [w3m-dev:04469] on 2013-10-14.
++
++2013-10-14 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-12+
++
++2013-10-14 Jarek Czekalski <jarekczek@poczta.onet.pl>
++
++ * terms.c: Fix paren in check_cygwin_console()
++ Bug: https://sourceforge.net/p/w3m/patches/66/
++
++2013-10-13 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-12
++
++ * doc-jp/MANUAL.html, doc-jp/w3m.1, doc/MANUAL.html, doc/w3m.1:
++ Update document for the -s option change
++ Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=75527
++
++ * terms.c: Do not fail when LANG is not set.
++ Check whether the value of LC_ALL, LC_CTYPE or LANG is not NULL in
++ check_cygwin_console().
++ Bug: https://sourceforge.net/p/w3m/patches/66/
++
++2013-10-12 Tatsuya Kinoshita <tats@debian.org>
++
++ * table.h: Bump MAXCOL to 256
++ Bug: https://sourceforge.net/p/w3m/feature-requests/24/
++
++2013-10-12 Laurence Richert <laurencerichert@yahoo.de>
++
++ * main.c, proto.h: vim/-perator like handling
++ - half page scrolling
++ - jumping to elements numbered by getLinkNumberStr() from Karsten
++ Schoelzel
++ Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=724028
++
++2013-10-12 Tatsuya Kinoshita <tats@debian.org>
++
++ * doc-jp/README, doc/README:
++ Mention project page rather than unavailable mailing lists
++
++2013-10-09 Rafael Laboissiere <rafael@laboissiere.net>
++
++ * doc/README.img: Fix typo
++ Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=725892
++
++2013-08-12 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-11+
++
++ * ChangeLog: Update ChangeLog to use contributor's name
++
++2013-08-08 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-11
++
++2013-08-04 Tatsuya Kinoshita <tats@debian.org>
++
++ * Str.c: Check length for Strchop()
++
++ * main.c: Fix potentially segfault of execdict()
++
++ * version.c.in: Update to 0.5.3+debian-10+
++
++ * file.c: Fix segfault of loadGeneralFile()
++ Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=718612
++
++2013-08-02 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-10
++
++2013-08-02 Piotr P. Karwasz <piotr.p@karwasz.org>
++
++ * scripts/w3mman/w3mman2html.cgi.in:
++ Correct underline processing and more UTF-8 support for w3mman2html.cgi.
++ Patch from <https://bugs.launchpad.net/ubuntu/+source/w3m/+bug/680202>
++ on 2010-11-23.
++
++2013-08-01 Hilko Bengen <bengen@debian.org>
++
++ * entity.c: Ignore SOFT HYPHEN to prevent drawing hyphens everywhere.
++ Patch from <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=441934>
++ on 2011-03-01.
++
++2013-08-01 Tatsuya Kinoshita <tats@debian.org>
++
++ * doc-jp/README, doc/README: Update contact list in README
++ Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=696209
++
++2013-07-30 Tatsuya Kinoshita <tats@debian.org>
++
++ * config.guess, config.sub:
++ Update config.guess and config.sub to supprot aarch64.
++ Updated with Debian autotools-dev version 20130515.1.
++
++2013-07-30 Conrad J.C. Hughes <debbugs@xrad.org>
++
++ * main.c: Sort anchors by sequence number in -dump.
++ Patch from <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=657666>
++ on 2012-01-27.
++
++2013-07-30 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update to 0.5.3+debian-9+
++
++2013-07-29 Tatsuya Kinoshita <tats@debian.org>
++
++ * version.c.in: Update version to w3m/0.5.3+debian-9
++
++ * version.c.in: Set CURRENT_VERSION to debian version
++
++2013-07-28 Tatsuya Kinoshita <tats@debian.org>
++
++ * file.c: Fix segfault of process_button()
++
++2013-04-08 AIDA Shinra <shinra@j10n.org>
++
++ * file.c: One more patch for siteconf from [w3m-dev 04464]
++
++ * anchor.c, config.h.in, display.c, doc-jp/README.siteconf:
++ * doc/README.siteconf, file.c, fm.h, form.c, frame.c, func.c:
++ * history.c, indep.c, indep.h, linein.c, main.c, map.c, menu.c:
++ * po/ja.po, proto.h, rc.c, url.c: Support the siteconf feature.
++ Patch to support the siteconf feature, from [w3m-dev 04463]
++ on 2012-06-27.
++
++2013-04-08 Hayaki Saito <user@zuse.jp>
++
++ * keybind.c, main.c, proto.h, terms.c:
++ Support SGR 1006 mouse reporting.
++ cf. [w3m-dev 04466] on 2012-07-15
++ Origin: https://gist.github.com/3114255
++ Bug: https://sourceforge.net/p/w3m/patches/65/
++
++2012-05-19 Hilko Bengen <bengen@debian.org>
++
++ * form.c: Assume "text" if an input type is unknown.
++ Patch from <http://bugs.debian.org/615843> on 2011-03-01.
++
++2012-05-19 Simon Ruderich <simon@ruderich.org>
++
++ * Makefile.in: Use $(CPPFLAGS) with $(CPP).
++ Patch from <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=665491>
++ on 2012-03-24.
++
++2012-05-03 Miroslav Å ulc <fordfrog@gentoo.org>
++
++ * w3mimg/Makefile.in: Fix parallel make issue.
++ Patch from Gentoo
++ <http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/www-client/w3m/files/w3m-0.5.3-parallel-make.patch?revision=1.1&view=markup>
++ <https://bugs.gentoo.org/show_bug.cgi?id=353390> on 2011-02-01.
++
++2012-05-03 MATSUU Takuto <matsuu@gentoo.org>
++
++ * main.c: Support Boehm GC 7.2.
++ Patch from Gentoo
++ <http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/www-client/w3m/files/w3m-0.5.2-gc72.patch?revision=1.1&view=markup>
++ on 2009-12-13.
++
++2012-05-02 Reinhard Tartler <siretart@tauware.de>
++
++ * istream.c, istream.h:
++ Fix that struct file_handle conflicts with glibc 2.14.
++ Patch from <https://bugs.launchpad.net/ubuntu/+source/w3m/+bug/935540>
++ on 2012-02-19.
++
++2011-10-30 Colin Watson <cjwatson@ubuntu.com>
++
++ * acinclude.m4, configure, w3mbookmark.c:
++ Appease gcc -Werror=format-security.
++ Patch from 0.5.3-3ubuntu1 on 2011-10-23.
++ Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=646321
++
++2011-06-19 Martin Pitt <martin.pitt@ubuntu.com>
++
++ * Makefile.in:
++ Explicitly link w3mimgdisplay with -lX11 to build with gcc 4.5.
++ Patch from 0.5.2-10ubuntu1 on 2010-12-03.
++ Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=605761
++
++2011-06-19 Fumitoshi UKAI <ukai@debian.or.jp>
++
++ * main.c: Change the -s option to "squeeze multiple blank lines".
++ Change the -s option from "display charset Shift_JIS" to "squeeze
++ multiple blank lines" to work as /usr/bin/pager. In addition, the
++ options -j and -e are disabled. To specify the display charset,
++ use -O{s|j|e} instead.
++ Patch from [w3m-dev 01275] on 2000-10-26.
++ Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=75527
++
++2011-06-19 Hiroyuki Ito <ZXB01226@nifty.com>
++
++ * file.c, fm.h, html.c, html.h, proto.h, table.c, tagtable.tab:
++ Support the button element as defined in HTML 4.01.
++ Patch from upstream, [w3m-dev 04411] on 2010-09-17, to support the
++ button element. It is discussed upstream and incomplete, but enough
++ to login Launchpad.
++ Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=136810
++ Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/w3m/+bug/628755
++
+ 2012-05-22 Tatsuya Kinoshita <tats@vega.ocn.ne.jp>
+
+ * [w3m-dev 04451] w3m/entity.h should be removed when `make clean'
+diff --git a/Makefile.in b/Makefile.in
+index 7d692f9..453072d 100644
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -111,6 +111,7 @@ IMGDISPLAY=w3mimgdisplay$(EXT)
+ MAN1_TARGET=$(PACKAGE).1
+ MAN1=$(top_srcdir)/doc/w3m.1
+ MAN1_JA=$(top_srcdir)/doc-jp/w3m.1
++MAN1_DE=$(top_srcdir)/doc-de/w3m.1
+
+ LIB_TARGETS=$(BOOKMARKER) $(HELPER)
+ AUXBIN_TARGETS=@AUXBIN_TARGETS@
+@@ -150,7 +151,7 @@ parsetagx.o: html.c
+
+ funcname.tab: $(DEFUNS)
+ (echo '#define DEFUN(x,y,z) x y';\
+- sed -ne '/^DEFUN/{p;n;/^[ ]/p;}' $(DEFUNS)) | $(CPP) - | \
++ sed -ne '/^DEFUN/{p;n;/^[ ]/p;}' $(DEFUNS)) | $(CPP) $(CPPFLAGS) - | \
+ awk '$$1 ~ /^[_A-Za-z]/ { \
+ for (i=2;i<=NF;i++) { print $$i, $$1} \
+ }' > $@.tmp
+@@ -220,10 +221,12 @@ install-core: $(TARGETS)
+ -$(MKDIR) $(DESTDIR)$(HELP_DIR)
+ -$(MKDIR) $(DESTDIR)$(mandir)/man1
+ -$(MKDIR) $(DESTDIR)$(mandir)/ja/man1
++ -$(MKDIR) $(DESTDIR)$(mandir)/de/man1
+ $(INSTALL_PROGRAM) $(TARGET) $(DESTDIR)$(bindir)/$(TARGET)
+ $(INSTALL_DATA) $(HELP_FILE) $(DESTDIR)$(HELP_DIR)/$(HELP_TARGET)
+ $(INSTALL_DATA) $(MAN1) $(DESTDIR)$(mandir)/man1/$(MAN1_TARGET)
+ $(INSTALL_DATA) $(MAN1_JA) $(DESTDIR)$(mandir)/ja/man1/$(MAN1_TARGET)
++ $(INSTALL_DATA) $(MAN1_DE) $(DESTDIR)$(mandir)/de/man1/$(MAN1_TARGET)
+ targets="$(AUXBIN_TARGETS)"; for file in $$targets; \
+ do \
+ case $$file in \
+@@ -250,7 +253,7 @@ install-po:
+ (cd $$subdir && $(MAKE) install); \
+ done
+
+-all-scripts:
++all-scripts: funcname.tab
+ for dir in $(SCRIPTSUBDIRS); \
+ do \
+ (cd $$dir && $(MAKE) $(MAKE_ARGS)); \
+@@ -280,6 +283,7 @@ uninstall:
+ -$(RM) -f $(HELP_DIR)/$(HELP_TARGET)
+ -$(RM) -f $(mandir)/man1/$(MAN1_TARGET)
+ -$(RM) -f $(mandir)/ja/man1/$(MAN1_TARGET)
++ -$(RM) -f $(mandir)/de/man1/$(MAN1_TARGET)
+ -for dir in $(SCRIPTSUBDIRS); \
+ do \
+ (cd $$dir && $(MAKE) $(MAKE_ARGS) uninstall); \
+diff --git a/NEWS b/NEWS
+index 66e309d..5fb5f24 100644
+--- a/NEWS
++++ b/NEWS
+@@ -1,3 +1,40 @@
++w3m X.X.X - YYYY-MM-DD
++
++* new features
++ - support OSC 5379 remote imaging and sixel graphics
++ - support SGR style mouse handler
++ - support 32-bit color images
++ - support FreeBSD framebuffer
++ - support button element
++ - support meta charset
++ - add extbrowser4..9
++ - add display_borders to display 0 pixel table borders
++ - add siteconf feature
++ - add German translation for options setting panel
++ - add translations for de, zh_CN and zh_TW
++* bug fixes
++ - fix segfaults with malformed text
++ - disable SSLv2 and SSLv3 by default [CVE-2014-3566]
++ - set ssl_verify_server to 1 by default
++ - disable RC4, export ciphers, and keys < 128 bits
++ - use SSL_OP_NO_COMPRESSION due to "CRIME attack" [CVE-2012-4929]
++ - use SSL_MODE_RELEASE_BUFFERS
++ - disable USE_EGD for LibreSSL
++ - appease gcc -Werror=format-security
++ - option -s is now "squeeze multiple blank lines" to work as pager, and
++ -j and -e are obsolete, so use -O{s|j|e} to specify display charset
++ - accept single quoted meta refresh URL
++ - assume "text" if a form input type is unknown
++ - accept cookies by default
++ - set use_dictcommand to 1 by default
++ - set default_url to 1 by default
++ - set argv_is_url to 1 by default
++ - set alt_entity to 0 by default
++ - fix build problems with Boehm GC 7.2, imlib2 1.4.6 and glibc 2.14
++ - fix parallel make failure
++ - fix incorrect ucs_ambwidth_map
++ - and many fixes
++
+ w3m 0.5.3 - 2011-01-15
+
+ * security fix
+diff --git a/README b/README
+index 8778d80..765c996 100644
+--- a/README
++++ b/README
+@@ -1,3 +1,9 @@
++w3m: WWW wo Miru Tool
++=====================
++
++w3m is a pager with WWW capability. It IS a pager, but it can be used
++as a text-mode WWW browser.
++
+ If you can read English, see doc/*.
+ If you can read Japanese, see doc-jp/*.
+ If you can read both, read both and correct English. :-)
+diff --git a/Str.c b/Str.c
+index e5a0982..d34129f 100644
+--- a/Str.c
++++ b/Str.c
+@@ -56,7 +56,7 @@ Strnew_size(int n)
+ }
+
+ Str
+-Strnew_charp(char *p)
++Strnew_charp(const char *p)
+ {
+ Str x;
+ int n;
+@@ -73,7 +73,7 @@ Strnew_charp(char *p)
+ }
+
+ Str
+-Strnew_m_charp(char *p, ...)
++Strnew_m_charp(const char *p, ...)
+ {
+ va_list ap;
+ Str r = Strnew();
+@@ -87,7 +87,7 @@ Strnew_m_charp(char *p, ...)
+ }
+
+ Str
+-Strnew_charp_n(char *p, int n)
++Strnew_charp_n(const char *p, int n)
+ {
+ Str x;
+
+@@ -140,7 +140,7 @@ Strcopy(Str x, Str y)
+ }
+
+ void
+-Strcopy_charp(Str x, char *y)
++Strcopy_charp(Str x, const char *y)
+ {
+ int len;
+
+@@ -160,7 +160,7 @@ Strcopy_charp(Str x, char *y)
+ }
+
+ void
+-Strcopy_charp_n(Str x, char *y, int n)
++Strcopy_charp_n(Str x, const char *y, int n)
+ {
+ int len = n;
+
+@@ -180,7 +180,7 @@ Strcopy_charp_n(Str x, char *y, int n)
+ }
+
+ void
+-Strcat_charp_n(Str x, char *y, int n)
++Strcat_charp_n(Str x, const char *y, int n)
+ {
+ int newlen;
+
+@@ -209,7 +209,7 @@ Strcat(Str x, Str y)
+ }
+
+ void
+-Strcat_charp(Str x, char *y)
++Strcat_charp(Str x, const char *y)
+ {
+ if (y == NULL)
+ return;
+@@ -232,8 +232,8 @@ Strgrow(Str x)
+ {
+ char *old = x->ptr;
+ int newlen;
+- newlen = x->length * 6 / 5;
+- if (newlen == x->length)
++ newlen = x->area_size * 6 / 5;
++ if (newlen == x->area_size)
+ newlen += 2;
+ x->ptr = GC_MALLOC_ATOMIC(newlen);
+ x->area_size = newlen;
+@@ -278,8 +278,8 @@ void
+ Strchop(Str s)
+ {
+ STR_LENGTH_CHECK(s);
+- while ((s->ptr[s->length - 1] == '\n' || s->ptr[s->length - 1] == '\r') &&
+- s->length > 0) {
++ while (s->length > 0 &&
++ (s->ptr[s->length - 1] == '\n' || s->ptr[s->length - 1] == '\r')) {
+ s->length--;
+ }
+ s->ptr[s->length] = '\0';
+@@ -301,7 +301,7 @@ Strinsert_char(Str s, int pos, char c)
+ }
+
+ void
+-Strinsert_charp(Str s, int pos, char *p)
++Strinsert_charp(Str s, int pos, const char *p)
+ {
+ STR_LENGTH_CHECK(s);
+ while (*p)
+@@ -530,11 +530,8 @@ Str
+ Strfgets(FILE * f)
+ {
+ Str s = Strnew();
+- char c;
+- while (1) {
+- c = fgetc(f);
+- if (feof(f) || ferror(f))
+- break;
++ int c;
++ while ((c = fgetc(f)) != EOF) {
+ Strcat_char(s, c);
+ if (c == '\n')
+ break;
+@@ -546,11 +543,8 @@ Str
+ Strfgetall(FILE * f)
+ {
+ Str s = Strnew();
+- char c;
+- while (1) {
+- c = fgetc(f);
+- if (feof(f) || ferror(f))
+- break;
++ int c;
++ while ((c = fgetc(f)) != EOF) {
+ Strcat_char(s, c);
+ }
+ return s;
+diff --git a/Str.h b/Str.h
+index f345c74..248815d 100644
+--- a/Str.h
++++ b/Str.h
+@@ -30,22 +30,22 @@ typedef struct _Str {
+
+ Str Strnew(void);
+ Str Strnew_size(int);
+-Str Strnew_charp(char *);
+-Str Strnew_charp_n(char *, int);
+-Str Strnew_m_charp(char *, ...);
++Str Strnew_charp(const char *);
++Str Strnew_charp_n(const char *, int);
++Str Strnew_m_charp(const char *, ...);
+ Str Strdup(Str);
+ void Strclear(Str);
+ void Strfree(Str);
+ void Strcopy(Str, Str);
+-void Strcopy_charp(Str, char *);
+-void Strcopy_charp_n(Str, char *, int);
+-void Strcat_charp_n(Str, char *, int);
++void Strcopy_charp(Str, const char *);
++void Strcopy_charp_n(Str, const char *, int);
++void Strcat_charp_n(Str, const char *, int);
+ void Strcat(Str, Str);
+-void Strcat_charp(Str, char *);
++void Strcat_charp(Str, const char *);
+ void Strcat_m_charp(Str, ...);
+ Str Strsubstr(Str, int, int);
+ void Strinsert_char(Str, int, char);
+-void Strinsert_charp(Str, int, char *);
++void Strinsert_charp(Str, int, const char *);
+ void Strdelete(Str, int, int);
+ void Strtruncate(Str, int);
+ void Strlower(Str);
+diff --git a/acinclude.m4 b/acinclude.m4
+index e4ccc3d..ed1035d 100644
+--- a/acinclude.m4
++++ b/acinclude.m4
+@@ -6,7 +6,8 @@ dnl w3m autoconf macros
+ AC_DEFUN([AC_W3M_VERSION],
+ [AC_SUBST(CURRENT_VERSION)
+ cvsver=`$AWK '\$[1] ~ /Id:/ { print \$[3]}' $srcdir/ChangeLog`
+- sed -e 's/define CURRENT_VERSION "\(.*\)+cvs/define CURRENT_VERSION "\1+cvs-'$cvsver'/' $srcdir/version.c.in > version.c
++ ymdver=`sed -e 's/ .*//;s/-//g;q' $srcdir/ChangeLog`
++ sed -e 's/define CURRENT_VERSION "\(.*\)YYYYMMDD/define CURRENT_VERSION "\1'$ymdver'/;s/define CURRENT_VERSION "\(.*\)+cvs/define CURRENT_VERSION "\1+cvs-'$cvsver'/' $srcdir/version.c.in > version.c
+ CURRENT_VERSION=`sed -n 's/.*define CURRENT_VERSION *"w3m\/\(.*\)".*$/\1/p' version.c`])
+ #
+ # ----------------------------------------------------------------
+@@ -330,10 +331,10 @@ AC_DEFINE_UNQUOTED(DEF_MAILER, "$w3m_mailer")])
+ # ----------------------------------------------------------------
+ AC_DEFUN([AC_W3M_EXT_BROWSER],
+ [AC_SUBST(DEF_EXT_BROWSER)
+-w3m_browser="/usr/bin/mozilla"
++w3m_browser="/usr/bin/firefox"
+ AC_MSG_CHECKING(which external browser is used by default)
+ AC_ARG_WITH(browser,
+- [ --with-browser=BROWSER default browser (/usr/bin/mozilla)],
++ [ --with-browser=BROWSER default browser (/usr/bin/firefox)],
+ [w3m_browser="$with_browser"])
+ AC_MSG_RESULT($w3m_browser)
+ AC_DEFINE_UNQUOTED(DEF_EXT_BROWSER, "$w3m_browser")])
+@@ -400,10 +401,10 @@ AC_DEFUN([AC_W3M_TERMLIB],
+ AC_ARG_WITH(termlib,
+ [ --with-termlib[=LIBS] terminal library
+ LIBS is space separated list of:
+- terminfo mytinfo termcap ncurses curses],,
++ terminfo mytinfo termcap tinfo ncurses curses],,
+ [with_termlib="yes"])
+ AC_MSG_RESULT($with_termlib)
+- test x"$with_termlib" = xyes && with_termlib="terminfo mytinfo termlib termcap ncurses curses"
++ test x"$with_termlib" = xyes && with_termlib="terminfo mytinfo termlib termcap tinfo ncurses curses"
+ for lib in $with_termlib; do
+ AC_CHECK_LIB($lib, tgetent, [W3M_LIBS="$W3M_LIBS -l$lib"; break])
+ done
+@@ -600,7 +601,7 @@ AC_DEFUN([AC_W3M_IMAGE],
+ if test x"$enable_image" = xyes; then
+ enable_image=x11
+ case "`uname -s`" in
+- Linux|linux|LINUX)
++ Linux|linux|LINUX|FreeBSD|freebsd|FREEBSD)
+ if test -c /dev/fb0; then
+ enable_image=x11,fb
+ fi;;
+@@ -649,6 +650,9 @@ AC_DEFUN([AC_W3M_IMAGE],
+ fi;;
+ imlib2)
+ with_imlib2="yes"
++ if test x"$PKG_CONFIG" = x; then
++ PKG_CONFIG=pkg-config
++ fi
+ if test x"$IMLIB2_CONFIG" = x; then
+ IMLIB2_CONFIG=imlib2-config
+ fi;;
+@@ -661,8 +665,6 @@ AC_DEFUN([AC_W3M_IMAGE],
+ with_gtk2="yes"
+ if test x"$PKG_CONFIG" = x; then
+ PKG_CONFIG=pkg-config
+- else
+- PKG_CONFIG=:
+ fi;;
+ esac
+ done
+@@ -705,8 +707,8 @@ AC_DEFUN([AC_W3M_IMAGE],
+ IMGTARGETS="x11"
+ AC_DEFINE(USE_GDKPIXBUF)
+ AC_DEFINE(USE_GTK2)
+- IMGX11CFLAGS="`${PKG_CONFIG} --cflags gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0 gtk+-2.0`"
+- IMGX11LDFLAGS="`${PKG_CONFIG} --libs gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0 gtk+-2.0`"
++ IMGX11CFLAGS="`${PKG_CONFIG} --cflags gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0`"
++ IMGX11LDFLAGS="-lX11 `${PKG_CONFIG} --libs gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0`"
+ elif test x"$have_gdkpixbuf" = xyes; then
+ AC_DEFINE(USE_W3MIMG_X11)
+ IMGOBJS="$IMGOBJS x11/x11_w3mimg.o"
+@@ -728,7 +730,7 @@ AC_DEFUN([AC_W3M_IMAGE],
+ IMGTARGETS="x11"
+ AC_DEFINE(USE_IMLIB2)
+ IMGX11CFLAGS="`${IMLIB2_CONFIG} --cflags`"
+- IMGX11LDFLAGS="`${IMLIB2_CONFIG} --libs`"
++ IMGX11LDFLAGS="-lX11 `${PKG_CONFIG} --libs imlib2`"
+ else
+ AC_MSG_WARN([unable to build w3mimgdisplay with X11 support])
+ fi
+@@ -740,8 +742,8 @@ AC_DEFUN([AC_W3M_IMAGE],
+ IMGTARGETS="${IMGTARGETS} fb"
+ AC_DEFINE(USE_GDKPIXBUF)
+ AC_DEFINE(USE_GTK2)
+- IMGFBCFLAGS="`${PKG_CONFIG} --cflags gdk-pixbuf-2.0 gtk+-2.0`"
+- IMGFBLDFLAGS="`${PKG_CONFIG} --libs gdk-pixbuf-2.0 gtk+-2.0`"
++ IMGFBCFLAGS="`${PKG_CONFIG} --cflags gdk-pixbuf-2.0`"
++ IMGFBLDFLAGS="`${PKG_CONFIG} --libs gdk-pixbuf-2.0`"
+ elif test x"$have_gdkpixbuf" = xyes; then
+ AC_DEFINE(USE_W3MIMG_FB)
+ IMGOBJS="$IMGOBJS fb/fb_w3mimg.o fb/fb.o fb/fb_img.o"
+@@ -756,7 +758,7 @@ AC_DEFUN([AC_W3M_IMAGE],
+ AC_DEFINE(USE_IMLIB2)
+ IMGOBJS="$IMGOBJS fb/fb_w3mimg.o fb/fb.o fb/fb_img.o"
+ IMGFBCFLAGS="`${IMLIB2_CONFIG} --cflags`"
+- IMGFBLDFLAGS="`${IMLIB2_CONFIG} --libs`"
++ IMGFBLDFLAGS="`${PKG_CONFIG} --libs imlib2`"
+ else
+ AC_MSG_WARN([unable to build w3mimgdisplay with FB support])
+ fi
+@@ -866,7 +868,7 @@ AC_MSG_CHECKING(for sys_errlist)
+ AC_TRY_COMPILE(
+ changequote(<<,>>)dnl
+ <<extern char *sys_errlist[];>>,
+-<<printf(sys_errlist[0]);>>,
++<<printf("%s", sys_errlist[0]);>>,
+ changequote([,])dnl
+ [have_sys_errlist="yes"; AC_DEFINE(HAVE_SYS_ERRLIST)],
+ [have_sys_errlist="no"])
+diff --git a/alloc.h b/alloc.h
+new file mode 100644
+index 0000000..fa0d391
+--- /dev/null
++++ b/alloc.h
+@@ -0,0 +1,39 @@
++/*
++ * by Scarlett. public domain.
++ * replacements for w3m's allocation macros which add overflow
++ * detection and concentrate the macros in one file
++ */
++#ifndef W3_ALLOC_H
++#define W3_ALLOC_H
++#include <gc.h>
++#include <stdlib.h>
++#include <stdio.h>
++#include <limits.h>
++
++static inline size_t
++z_mult_no_oflow_(size_t n, size_t size)
++{
++ if (size != 0 && n > ULONG_MAX / size) {
++ fprintf(stderr,
++ "w3m: overflow in malloc, %lu*%lu\n", (unsigned long)n, (unsigned long)size);
++ exit(1);
++ }
++ return n * size;
++}
++
++#define New(type) \
++ (GC_MALLOC(sizeof(type)))
++
++#define NewAtom(type) \
++ (GC_MALLOC_ATOMIC(sizeof(type)))
++
++#define New_N(type, n) \
++ (GC_MALLOC(z_mult_no_oflow_((n), sizeof(type))))
++
++#define NewAtom_N(type, n) \
++ (GC_MALLOC_ATOMIC(z_mult_no_oflow_((n), sizeof(type))))
++
++#define New_Reuse(type, ptr, n) \
++ (GC_REALLOC((ptr), z_mult_no_oflow_((n), sizeof(type))))
++
++#endif /* W3_ALLOC_H */
+diff --git a/anchor.c b/anchor.c
+index 27bbd56..fa8d3eb 100644
+--- a/anchor.c
++++ b/anchor.c
+@@ -11,7 +11,7 @@ putAnchor(AnchorList *al, char *url, char *target, Anchor **anchor_return,
+ {
+ int n, i, j;
+ Anchor *a;
+- BufferPoint bp;
++ BufferPoint bp = { 0 };
+ if (al == NULL) {
+ al = New(AnchorList);
+ al->anchors = NULL;
+@@ -200,10 +200,11 @@ _put_anchor_news(Buffer *buf, char *p1, char *p2, int line, int pos)
+ if (*(p2 - 1) == '>')
+ p2--;
+ }
+- tmp = wc_Str_conv_strict(Strnew_charp_n(p1, p2 - p1), InnerCharset,
+- buf->document_charset);
+- tmp = Sprintf("news:%s", file_quote(tmp->ptr));
+- return registerHref(buf, tmp->ptr, NULL, NO_REFERER, NULL, '\0', line,
++ tmp = Strnew_charp("news:");
++ Strcat_charp_n(tmp, p1, p2 - p1);
++ return registerHref(buf, url_encode(tmp->ptr, baseURL(buf),
++ buf->document_charset),
++ NULL, NO_REFERER, NULL, '\0', line,
+ pos);
+ }
+ #endif /* USE_NNTP */
+@@ -213,9 +214,10 @@ _put_anchor_all(Buffer *buf, char *p1, char *p2, int line, int pos)
+ {
+ Str tmp;
+
+- tmp = wc_Str_conv_strict(Strnew_charp_n(p1, p2 - p1), InnerCharset,
+- buf->document_charset);
+- return registerHref(buf, url_quote(tmp->ptr), NULL, NO_REFERER, NULL,
++ tmp = Strnew_charp_n(p1, p2 - p1);
++ return registerHref(buf, url_encode(tmp->ptr, baseURL(buf),
++ buf->document_charset),
++ NULL, NO_REFERER, NULL,
+ '\0', line, pos);
+ }
+
+@@ -641,7 +643,6 @@ addMultirowsForm(Buffer *buf, AnchorList *al)
+ {
+ int i, j, k, col, ecol, pos;
+ Anchor a_form, *a;
+- FormItemList *fi;
+ Line *l, *ls;
+
+ if (al == NULL || al->nanchor == 0)
+@@ -668,7 +669,6 @@ addMultirowsForm(Buffer *buf, AnchorList *al)
+ if (!ls)
+ continue;
+ }
+- fi = (FormItemList *)a_form.url;
+ col = COLPOS(ls, a_form.start.pos);
+ ecol = COLPOS(ls, a_form.end.pos);
+ for (j = 0; l && j < a_form.rows; l = l->next, j++) {
+@@ -685,6 +685,8 @@ addMultirowsForm(Buffer *buf, AnchorList *al)
+ a->hseq = a_form.hseq;
+ a->y = a_form.y;
+ a->end.pos = pos + ecol - col;
++ if (pos < 1 || a->end.pos >= l->size)
++ continue;
+ l->lineBuf[pos - 1] = '[';
+ l->lineBuf[a->end.pos] = ']';
+ for (k = pos; k < a->end.pos; k++)
+@@ -756,7 +758,7 @@ link_list_panel(Buffer *buf)
+ p = parsedURL2Str(&pu)->ptr;
+ u = html_quote(p);
+ if (DecodeURL)
+- p = html_quote(url_unquote_conv(p, buf->document_charset));
++ p = html_quote(url_decode2(p, buf));
+ else
+ p = u;
+ }
+@@ -787,7 +789,7 @@ link_list_panel(Buffer *buf)
+ p = parsedURL2Str(&pu)->ptr;
+ u = html_quote(p);
+ if (DecodeURL)
+- p = html_quote(url_unquote_conv(p, buf->document_charset));
++ p = html_quote(url_decode2(p, buf));
+ else
+ p = u;
+ t = getAnchorText(buf, al, a);
+@@ -809,16 +811,13 @@ link_list_panel(Buffer *buf)
+ p = parsedURL2Str(&pu)->ptr;
+ u = html_quote(p);
+ if (DecodeURL)
+- p = html_quote(url_unquote_conv(p, buf->document_charset));
++ p = html_quote(url_decode2(p, buf));
+ else
+ p = u;
+ if (a->title && *a->title)
+ t = html_quote(a->title);
+- else if (DecodeURL)
+- t = html_quote(url_unquote_conv
+- (a->url, buf->document_charset));
+ else
+- t = html_quote(a->url);
++ t = html_quote(url_decode2(a->url, buf));
+ Strcat_m_charp(tmp, "<li><a href=\"", u, "\">", t, "</a><br>", p,
+ "\n", NULL);
+ a = retrieveAnchor(buf->formitem, a->start.line, a->start.pos);
+@@ -842,19 +841,13 @@ link_list_panel(Buffer *buf)
+ p = parsedURL2Str(&pu)->ptr;
+ u = html_quote(p);
+ if (DecodeURL)
+- p = html_quote(url_unquote_conv(p,
+- buf->
+- document_charset));
++ p = html_quote(url_decode2(p, buf));
+ else
+ p = u;
+ if (m->alt && *m->alt)
+ t = html_quote(m->alt);
+- else if (DecodeURL)
+- t = html_quote(url_unquote_conv(m->url,
+- buf->
+- document_charset));
+ else
+- t = html_quote(m->url);
++ t = html_quote(url_decode2(m->url, buf));
+ Strcat_m_charp(tmp, "<li><a href=\"", u, "\">", t,
+ "</a><br>", p, "\n", NULL);
+ }
+diff --git a/buffer.c b/buffer.c
+index 5afc26a..3b2352a 100644
+--- a/buffer.c
++++ b/buffer.c
+@@ -705,6 +705,7 @@ readBufferCache(Buffer *buf)
+
+ cache = fopen(buf->savecache, "r");
+ if (cache == NULL || fread1(clnum, cache) || fread1(tlnum, cache)) {
++ fclose(cache);
+ buf->savecache = NULL;
+ return -1;
+ }
+@@ -760,8 +761,10 @@ readBufferCache(Buffer *buf)
+ }
+ #endif
+ }
+- buf->lastLine = prevl;
+- buf->lastLine->next = NULL;
++ if (prevl) {
++ buf->lastLine = prevl;
++ buf->lastLine->next = NULL;
++ }
+ fclose(cache);
+ unlink(buf->savecache);
+ buf->savecache = NULL;
+diff --git a/config.guess b/config.guess
+index 51fab47..0967f2a 100755
+--- a/config.guess
++++ b/config.guess
+@@ -1,13 +1,12 @@
+ #! /bin/sh
+ # Attempt to guess a canonical system name.
+-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+-# 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
++# Copyright 1992-2016 Free Software Foundation, Inc.
+
+-timestamp='2004-03-12'
++timestamp='2016-04-02'
+
+ # This file is free software; you can redistribute it and/or modify it
+ # under the terms of the GNU General Public License as published by
+-# the Free Software Foundation; either version 2 of the License, or
++# the Free Software Foundation; either version 3 of the License, or
+ # (at your option) any later version.
+ #
+ # This program is distributed in the hope that it will be useful, but
+@@ -16,24 +15,22 @@ timestamp='2004-03-12'
+ # General Public License for more details.
+ #
+ # You should have received a copy of the GNU General Public License
+-# along with this program; if not, write to the Free Software
+-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++# along with this program; if not, see <http://www.gnu.org/licenses/>.
+ #
+ # As a special exception to the GNU General Public License, if you
+ # distribute this file as part of a program that contains a
+ # configuration script generated by Autoconf, you may include it under
+-# the same distribution terms that you use for the rest of that program.
+-
+-# Originally written by Per Bothner <per@bothner.com>.
+-# Please send patches to <config-patches@gnu.org>. Submit a context
+-# diff and a properly formatted ChangeLog entry.
++# the same distribution terms that you use for the rest of that
++# program. This Exception is an additional permission under section 7
++# of the GNU General Public License, version 3 ("GPLv3").
++#
++# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
+ #
+-# This script attempts to guess a canonical system name similar to
+-# config.sub. If it succeeds, it prints the system name on stdout, and
+-# exits with 0. Otherwise, it exits with 1.
++# You can get the latest version of this script from:
++# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
+ #
+-# The plan is that this can be called by configure scripts if you
+-# don't specify an explicit build system type.
++# Please send patches to <config-patches@gnu.org>.
++
+
+ me=`echo "$0" | sed -e 's,.*/,,'`
+
+@@ -53,8 +50,7 @@ version="\
+ GNU config.guess ($timestamp)
+
+ Originally written by Per Bothner.
+-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+-Free Software Foundation, Inc.
++Copyright 1992-2016 Free Software Foundation, Inc.
+
+ This is free software; see the source for copying conditions. There is NO
+ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+@@ -66,11 +62,11 @@ Try \`$me --help' for more information."
+ while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+- echo "$timestamp" ; exit 0 ;;
++ echo "$timestamp" ; exit ;;
+ --version | -v )
+- echo "$version" ; exit 0 ;;
++ echo "$version" ; exit ;;
+ --help | --h* | -h )
+- echo "$usage"; exit 0 ;;
++ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+@@ -104,7 +100,7 @@ set_cc_for_build='
+ trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+ trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+ : ${TMPDIR=/tmp} ;
+- { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
++ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+@@ -123,7 +119,7 @@ case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+-esac ;'
++esac ; set_cc_for_build= ;'
+
+ # This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+ # (ghazi@noc.rutgers.edu 1994-08-24)
+@@ -136,12 +132,33 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+ UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+ UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
++case "${UNAME_SYSTEM}" in
++Linux|GNU|GNU/*)
++ # If the system lacks a compiler, then just pick glibc.
++ # We could probably try harder.
++ LIBC=gnu
++
++ eval $set_cc_for_build
++ cat <<-EOF > $dummy.c
++ #include <features.h>
++ #if defined(__UCLIBC__)
++ LIBC=uclibc
++ #elif defined(__dietlibc__)
++ LIBC=dietlibc
++ #else
++ LIBC=gnu
++ #endif
++ EOF
++ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
++ ;;
++esac
++
+ # Note: order is significant - the case branches are not exclusive.
+
+ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+- # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
++ # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+@@ -151,22 +168,30 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ sysctl="sysctl -n hw.machine_arch"
+- UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+- /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
++ UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
++ /sbin/$sysctl 2>/dev/null || \
++ /usr/sbin/$sysctl 2>/dev/null || \
++ echo unknown)`
+ case "${UNAME_MACHINE_ARCH}" in
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
++ sh5el) machine=sh5le-unknown ;;
++ earmv*)
++ arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
++ endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'`
++ machine=${arch}${endian}-unknown
++ ;;
+ *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently, or will in the future.
+ case "${UNAME_MACHINE_ARCH}" in
+- arm*|i386|m68k|ns32k|sh3*|sparc|vax)
++ arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ eval $set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+- | grep __ELF__ >/dev/null
++ | grep -q __ELF__
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+@@ -176,7 +201,14 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ fi
+ ;;
+ *)
+- os=netbsd
++ os=netbsd
++ ;;
++ esac
++ # Determine ABI tags.
++ case "${UNAME_MACHINE_ARCH}" in
++ earm*)
++ expr='s/^earmv[0-9]/-eabi/;s/eb$//'
++ abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"`
+ ;;
+ esac
+ # The OS release
+@@ -189,78 +221,48 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ release='-gnu'
+ ;;
+ *)
+- release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
++ release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+- echo "${machine}-${os}${release}"
+- exit 0 ;;
+- amd64:OpenBSD:*:*)
+- echo x86_64-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- amiga:OpenBSD:*:*)
+- echo m68k-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- arc:OpenBSD:*:*)
+- echo mipsel-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- cats:OpenBSD:*:*)
+- echo arm-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- hp300:OpenBSD:*:*)
+- echo m68k-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- mac68k:OpenBSD:*:*)
+- echo m68k-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- macppc:OpenBSD:*:*)
+- echo powerpc-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- mvme68k:OpenBSD:*:*)
+- echo m68k-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- mvme88k:OpenBSD:*:*)
+- echo m88k-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- mvmeppc:OpenBSD:*:*)
+- echo powerpc-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- pegasos:OpenBSD:*:*)
+- echo powerpc-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- pmax:OpenBSD:*:*)
+- echo mipsel-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- sgi:OpenBSD:*:*)
+- echo mipseb-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- sun3:OpenBSD:*:*)
+- echo m68k-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
+- wgrisc:OpenBSD:*:*)
+- echo mipsel-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
++ echo "${machine}-${os}${release}${abi}"
++ exit ;;
++ *:Bitrig:*:*)
++ UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
++ echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
++ exit ;;
+ *:OpenBSD:*:*)
+- echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE}
+- exit 0 ;;
++ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
++ echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
++ exit ;;
++ *:LibertyBSD:*:*)
++ UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
++ echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE}
++ exit ;;
+ *:ekkoBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
++ *:SolidBSD:*:*)
++ echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
++ exit ;;
+ macppc:MirBSD:*:*)
+- echo powerppc-unknown-mirbsd${UNAME_RELEASE}
+- exit 0 ;;
++ echo powerpc-unknown-mirbsd${UNAME_RELEASE}
++ exit ;;
+ *:MirBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
++ *:Sortix:*:*)
++ echo ${UNAME_MACHINE}-unknown-sortix
++ exit ;;
+ alpha:OSF1:*:*)
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ ;;
+ *5.*)
+- UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
++ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+@@ -270,76 +272,82 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case "$ALPHA_CPU_TYPE" in
+ "EV4 (21064)")
+- UNAME_MACHINE="alpha" ;;
++ UNAME_MACHINE=alpha ;;
+ "EV4.5 (21064)")
+- UNAME_MACHINE="alpha" ;;
++ UNAME_MACHINE=alpha ;;
+ "LCA4 (21066/21068)")
+- UNAME_MACHINE="alpha" ;;
++ UNAME_MACHINE=alpha ;;
+ "EV5 (21164)")
+- UNAME_MACHINE="alphaev5" ;;
++ UNAME_MACHINE=alphaev5 ;;
+ "EV5.6 (21164A)")
+- UNAME_MACHINE="alphaev56" ;;
++ UNAME_MACHINE=alphaev56 ;;
+ "EV5.6 (21164PC)")
+- UNAME_MACHINE="alphapca56" ;;
++ UNAME_MACHINE=alphapca56 ;;
+ "EV5.7 (21164PC)")
+- UNAME_MACHINE="alphapca57" ;;
++ UNAME_MACHINE=alphapca57 ;;
+ "EV6 (21264)")
+- UNAME_MACHINE="alphaev6" ;;
++ UNAME_MACHINE=alphaev6 ;;
+ "EV6.7 (21264A)")
+- UNAME_MACHINE="alphaev67" ;;
++ UNAME_MACHINE=alphaev67 ;;
+ "EV6.8CB (21264C)")
+- UNAME_MACHINE="alphaev68" ;;
++ UNAME_MACHINE=alphaev68 ;;
+ "EV6.8AL (21264B)")
+- UNAME_MACHINE="alphaev68" ;;
++ UNAME_MACHINE=alphaev68 ;;
+ "EV6.8CX (21264D)")
+- UNAME_MACHINE="alphaev68" ;;
++ UNAME_MACHINE=alphaev68 ;;
+ "EV6.9A (21264/EV69A)")
+- UNAME_MACHINE="alphaev69" ;;
++ UNAME_MACHINE=alphaev69 ;;
+ "EV7 (21364)")
+- UNAME_MACHINE="alphaev7" ;;
++ UNAME_MACHINE=alphaev7 ;;
+ "EV7.9 (21364A)")
+- UNAME_MACHINE="alphaev79" ;;
++ UNAME_MACHINE=alphaev79 ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+- echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+- exit 0 ;;
+- Alpha*:OpenVMS:*:*)
+- echo alpha-hp-vms
+- exit 0 ;;
++ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
++ # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
++ exitcode=$?
++ trap '' 0
++ exit $exitcode ;;
+ Alpha\ *:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # Should we change UNAME_MACHINE based on the output of uname instead
+ # of the specific Alpha model?
+ echo alpha-pc-interix
+- exit 0 ;;
++ exit ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+- exit 0 ;;
++ exit ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-unknown-sysv4
+- exit 0;;
++ exit ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-amigaos
+- exit 0 ;;
++ exit ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-morphos
+- exit 0 ;;
++ exit ;;
+ *:OS/390:*:*)
+ echo i370-ibm-openedition
+- exit 0 ;;
++ exit ;;
++ *:z/VM:*:*)
++ echo s390-ibm-zvmoe
++ exit ;;
+ *:OS400:*:*)
+- echo powerpc-ibm-os400
+- exit 0 ;;
++ echo powerpc-ibm-os400
++ exit ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+- exit 0;;
++ exit ;;
++ arm*:riscos:*:*|arm*:RISCOS:*:*)
++ echo arm-unknown-riscos
++ exit ;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+- exit 0;;
++ exit ;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+@@ -347,32 +355,51 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ else
+ echo pyramid-pyramid-bsd
+ fi
+- exit 0 ;;
++ exit ;;
+ NILE*:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+- exit 0 ;;
++ exit ;;
+ DRS?6000:unix:4.0:6*)
+ echo sparc-icl-nx6
+- exit 0 ;;
+- DRS?6000:UNIX_SV:4.2*:7*)
++ exit ;;
++ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+ case `/usr/bin/uname -p` in
+- sparc) echo sparc-icl-nx7 && exit 0 ;;
++ sparc) echo sparc-icl-nx7; exit ;;
+ esac ;;
++ s390x:SunOS:*:*)
++ echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
++ exit ;;
+ sun4H:SunOS:5.*:*)
+ echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+- exit 0 ;;
++ exit ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+- exit 0 ;;
+- i86pc:SunOS:5.*:*)
+- echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+- exit 0 ;;
++ exit ;;
++ i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
++ echo i386-pc-auroraux${UNAME_RELEASE}
++ exit ;;
++ i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
++ eval $set_cc_for_build
++ SUN_ARCH=i386
++ # If there is a compiler, see if it is configured for 64-bit objects.
++ # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
++ # This test works for both compilers.
++ if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
++ if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
++ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
++ grep IS_64BIT_ARCH >/dev/null
++ then
++ SUN_ARCH=x86_64
++ fi
++ fi
++ echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
++ exit ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+- exit 0 ;;
++ exit ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+@@ -381,13 +408,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+- exit 0 ;;
++ exit ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+- test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
++ test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3
+ case "`/bin/arch`" in
+ sun3)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+@@ -396,10 +423,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ echo sparc-sun-sunos${UNAME_RELEASE}
+ ;;
+ esac
+- exit 0 ;;
++ exit ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+@@ -409,41 +436,41 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+- echo m68k-atari-mint${UNAME_RELEASE}
+- exit 0 ;;
++ echo m68k-atari-mint${UNAME_RELEASE}
++ exit ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+- echo m68k-atari-mint${UNAME_RELEASE}
+- exit 0 ;;
++ echo m68k-atari-mint${UNAME_RELEASE}
++ exit ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+- echo m68k-milan-mint${UNAME_RELEASE}
+- exit 0 ;;
++ echo m68k-milan-mint${UNAME_RELEASE}
++ exit ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+- echo m68k-hades-mint${UNAME_RELEASE}
+- exit 0 ;;
++ echo m68k-hades-mint${UNAME_RELEASE}
++ exit ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+- echo m68k-unknown-mint${UNAME_RELEASE}
+- exit 0 ;;
++ echo m68k-unknown-mint${UNAME_RELEASE}
++ exit ;;
+ m68k:machten:*:*)
+ echo m68k-apple-machten${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+- exit 0 ;;
++ exit ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ echo clipper-intergraph-clix${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+@@ -467,35 +494,36 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ exit (-1);
+ }
+ EOF
+- $CC_FOR_BUILD -o $dummy $dummy.c \
+- && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+- && exit 0
++ $CC_FOR_BUILD -o $dummy $dummy.c &&
++ dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
++ SYSTEM_NAME=`$dummy $dummyarg` &&
++ { echo "$SYSTEM_NAME"; exit; }
+ echo mips-mips-riscos${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ Motorola:PowerMAX_OS:*:*)
+ echo powerpc-motorola-powermax
+- exit 0 ;;
++ exit ;;
+ Motorola:*:4.3:PL8-*)
+ echo powerpc-harris-powermax
+- exit 0 ;;
++ exit ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ echo powerpc-harris-powermax
+- exit 0 ;;
++ exit ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+- exit 0 ;;
++ exit ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+- exit 0 ;;
++ exit ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+- exit 0 ;;
++ exit ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+- exit 0 ;;
++ exit ;;
+ AViiON:dgux:*:*)
+- # DG/UX returns AViiON for all architectures
+- UNAME_PROCESSOR=`/usr/bin/uname -p`
++ # DG/UX returns AViiON for all architectures
++ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+ then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+@@ -508,29 +536,29 @@ EOF
+ else
+ echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+- exit 0 ;;
++ exit ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+- exit 0 ;;
++ exit ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+- exit 0 ;;
++ exit ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+- exit 0 ;;
++ exit ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+- exit 0 ;;
++ exit ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+- exit 0 ;;
++ exit ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+- echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+- exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX '
++ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
++ exit ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ echo i386-ibm-aix
+- exit 0 ;;
++ exit ;;
+ ia64:AIX:*:*)
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+@@ -538,7 +566,7 @@ EOF
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+- exit 0 ;;
++ exit ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ eval $set_cc_for_build
+@@ -553,49 +581,54 @@ EOF
+ exit(0);
+ }
+ EOF
+- $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
+- echo rs6000-ibm-aix3.2.5
++ if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
++ then
++ echo "$SYSTEM_NAME"
++ else
++ echo rs6000-ibm-aix3.2.5
++ fi
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+- exit 0 ;;
+- *:AIX:*:[45])
++ exit ;;
++ *:AIX:*:[4567])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+- if [ -x /usr/bin/oslevel ] ; then
+- IBM_REV=`/usr/bin/oslevel`
++ if [ -x /usr/bin/lslpp ] ; then
++ IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
++ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+- exit 0 ;;
++ exit ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+- exit 0 ;;
++ exit ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+- exit 0 ;;
++ exit ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+- exit 0 ;; # report: romp-ibm BSD 4.3
++ exit ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+- exit 0 ;;
++ exit ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+- exit 0 ;;
++ exit ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+- exit 0 ;;
++ exit ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+- exit 0 ;;
++ exit ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ case "${UNAME_MACHINE}" in
+@@ -604,74 +637,84 @@ EOF
+ 9000/[678][0-9][0-9])
+ if [ -x /usr/bin/getconf ]; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+- sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+- case "${sc_cpu_version}" in
+- 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+- 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+- 532) # CPU_PA_RISC2_0
+- case "${sc_kernel_bits}" in
+- 32) HP_ARCH="hppa2.0n" ;;
+- 64) HP_ARCH="hppa2.0w" ;;
+- '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
+- esac ;;
+- esac
++ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
++ case "${sc_cpu_version}" in
++ 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
++ 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
++ 532) # CPU_PA_RISC2_0
++ case "${sc_kernel_bits}" in
++ 32) HP_ARCH=hppa2.0n ;;
++ 64) HP_ARCH=hppa2.0w ;;
++ '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20
++ esac ;;
++ esac
+ fi
+ if [ "${HP_ARCH}" = "" ]; then
+ eval $set_cc_for_build
+- sed 's/^ //' << EOF >$dummy.c
++ sed 's/^ //' << EOF >$dummy.c
+
+- #define _HPUX_SOURCE
+- #include <stdlib.h>
+- #include <unistd.h>
++ #define _HPUX_SOURCE
++ #include <stdlib.h>
++ #include <unistd.h>
+
+- int main ()
+- {
+- #if defined(_SC_KERNEL_BITS)
+- long bits = sysconf(_SC_KERNEL_BITS);
+- #endif
+- long cpu = sysconf (_SC_CPU_VERSION);
++ int main ()
++ {
++ #if defined(_SC_KERNEL_BITS)
++ long bits = sysconf(_SC_KERNEL_BITS);
++ #endif
++ long cpu = sysconf (_SC_CPU_VERSION);
+
+- switch (cpu)
+- {
+- case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+- case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+- case CPU_PA_RISC2_0:
+- #if defined(_SC_KERNEL_BITS)
+- switch (bits)
+- {
+- case 64: puts ("hppa2.0w"); break;
+- case 32: puts ("hppa2.0n"); break;
+- default: puts ("hppa2.0"); break;
+- } break;
+- #else /* !defined(_SC_KERNEL_BITS) */
+- puts ("hppa2.0"); break;
+- #endif
+- default: puts ("hppa1.0"); break;
+- }
+- exit (0);
+- }
++ switch (cpu)
++ {
++ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
++ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
++ case CPU_PA_RISC2_0:
++ #if defined(_SC_KERNEL_BITS)
++ switch (bits)
++ {
++ case 64: puts ("hppa2.0w"); break;
++ case 32: puts ("hppa2.0n"); break;
++ default: puts ("hppa2.0"); break;
++ } break;
++ #else /* !defined(_SC_KERNEL_BITS) */
++ puts ("hppa2.0"); break;
++ #endif
++ default: puts ("hppa1.0"); break;
++ }
++ exit (0);
++ }
+ EOF
+- (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
++ (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+- if [ ${HP_ARCH} = "hppa2.0w" ]
++ if [ ${HP_ARCH} = hppa2.0w ]
+ then
+- # avoid double evaluation of $set_cc_for_build
+- test -n "$CC_FOR_BUILD" || eval $set_cc_for_build
+- if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null
++ eval $set_cc_for_build
++
++ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
++ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
++ # generating 64-bit code. GNU and HP use different nomenclature:
++ #
++ # $ CC_FOR_BUILD=cc ./config.guess
++ # => hppa2.0w-hp-hpux11.23
++ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
++ # => hppa64-hp-hpux11.23
++
++ if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
++ grep -q __LP64__
+ then
+- HP_ARCH="hppa2.0w"
++ HP_ARCH=hppa2.0w
+ else
+- HP_ARCH="hppa64"
++ HP_ARCH=hppa64
+ fi
+ fi
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+- exit 0 ;;
++ exit ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ia64-hp-hpux${HPUX_REV}
+- exit 0 ;;
++ exit ;;
+ 3050*:HI-UX:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+@@ -699,340 +742,351 @@ EOF
+ exit (0);
+ }
+ EOF
+- $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
++ $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
++ { echo "$SYSTEM_NAME"; exit; }
+ echo unknown-hitachi-hiuxwe2
+- exit 0 ;;
++ exit ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+- exit 0 ;;
++ exit ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+- exit 0 ;;
++ exit ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ echo hppa1.0-hp-mpeix
+- exit 0 ;;
++ exit ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+- exit 0 ;;
++ exit ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+- exit 0 ;;
++ exit ;;
+ i*86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+- exit 0 ;;
++ exit ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+- exit 0 ;;
++ exit ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+- exit 0 ;;
++ exit ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+- exit 0 ;;
++ exit ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+- exit 0 ;;
++ exit ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+- exit 0 ;;
++ exit ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+- exit 0 ;;
++ exit ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+- exit 0 ;;
++ exit ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+- exit 0 ;;
++ exit ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+- exit 0 ;;
++ exit ;;
+ CRAY*T3E:*:*:*)
+ echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+- exit 0 ;;
++ exit ;;
+ CRAY*SV1:*:*:*)
+ echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+- exit 0 ;;
++ exit ;;
+ *:UNICOS/mp:*:*)
+- echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+- exit 0 ;;
++ echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
++ exit ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+- FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+- FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+- echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+- exit 0 ;;
++ FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
++ FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
++ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
++ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
++ exit ;;
+ 5000:UNIX_System_V:4.*:*)
+- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+- FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+- echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+- exit 0 ;;
++ FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
++ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
++ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
++ exit ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ sparc*:BSD/OS:*:*)
+ echo sparc-unknown-bsdi${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ *:FreeBSD:*:*)
+- # Determine whether the default compiler uses glibc.
+- eval $set_cc_for_build
+- sed 's/^ //' << EOF >$dummy.c
+- #include <features.h>
+- #if __GLIBC__ >= 2
+- LIBC=gnu
+- #else
+- LIBC=
+- #endif
+-EOF
+- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+- # GNU/KFreeBSD systems have a "k" prefix to indicate we are using
+- # FreeBSD's kernel, but not the complete OS.
+- case ${LIBC} in gnu) kernel_only='k' ;; esac
+- echo ${UNAME_MACHINE}-unknown-${kernel_only}freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC}
+- exit 0 ;;
++ UNAME_PROCESSOR=`/usr/bin/uname -p`
++ case ${UNAME_PROCESSOR} in
++ amd64)
++ echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
++ *)
++ echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
++ esac
++ exit ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin
+- exit 0 ;;
+- i*:MINGW*:*)
++ exit ;;
++ *:MINGW64*:*)
++ echo ${UNAME_MACHINE}-pc-mingw64
++ exit ;;
++ *:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+- exit 0 ;;
++ exit ;;
++ *:MSYS*:*)
++ echo ${UNAME_MACHINE}-pc-msys
++ exit ;;
++ i*:windows32*:*)
++ # uname -m includes "-pc" on this system.
++ echo ${UNAME_MACHINE}-mingw32
++ exit ;;
+ i*:PW*:*)
+ echo ${UNAME_MACHINE}-pc-pw32
+- exit 0 ;;
+- x86:Interix*:[34]*)
+- echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//'
+- exit 0 ;;
++ exit ;;
++ *:Interix*:*)
++ case ${UNAME_MACHINE} in
++ x86)
++ echo i586-pc-interix${UNAME_RELEASE}
++ exit ;;
++ authenticamd | genuineintel | EM64T)
++ echo x86_64-unknown-interix${UNAME_RELEASE}
++ exit ;;
++ IA64)
++ echo ia64-unknown-interix${UNAME_RELEASE}
++ exit ;;
++ esac ;;
+ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+ echo i${UNAME_MACHINE}-pc-mks
+- exit 0 ;;
++ exit ;;
++ 8664:Windows_NT:*)
++ echo x86_64-pc-mks
++ exit ;;
+ i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+ # UNAME_MACHINE based on the output of uname instead of i386?
+ echo i586-pc-interix
+- exit 0 ;;
++ exit ;;
+ i*:UWIN*:*)
+ echo ${UNAME_MACHINE}-pc-uwin
+- exit 0 ;;
++ exit ;;
++ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
++ echo x86_64-unknown-cygwin
++ exit ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin
+- exit 0 ;;
++ exit ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+- exit 0 ;;
++ exit ;;
+ *:GNU:*:*)
+ # the GNU system
+- echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+- exit 0 ;;
++ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
++ exit ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+- echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+- exit 0 ;;
++ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
++ exit ;;
+ i*86:Minix:*:*)
+ echo ${UNAME_MACHINE}-pc-minix
+- exit 0 ;;
++ exit ;;
++ aarch64:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
++ aarch64_be:Linux:*:*)
++ UNAME_MACHINE=aarch64_be
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
++ alpha:Linux:*:*)
++ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
++ EV5) UNAME_MACHINE=alphaev5 ;;
++ EV56) UNAME_MACHINE=alphaev56 ;;
++ PCA56) UNAME_MACHINE=alphapca56 ;;
++ PCA57) UNAME_MACHINE=alphapca56 ;;
++ EV6) UNAME_MACHINE=alphaev6 ;;
++ EV67) UNAME_MACHINE=alphaev67 ;;
++ EV68*) UNAME_MACHINE=alphaev68 ;;
++ esac
++ objdump --private-headers /bin/sh | grep -q ld.so.1
++ if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
++ arc:Linux:*:* | arceb:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
+ arm*:Linux:*:*)
+- echo ${UNAME_MACHINE}-unknown-linux-gnu
+- exit 0 ;;
++ eval $set_cc_for_build
++ if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
++ | grep -q __ARM_EABI__
++ then
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ else
++ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
++ | grep -q __ARM_PCS_VFP
++ then
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
++ else
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
++ fi
++ fi
++ exit ;;
++ avr32*:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
+ cris:Linux:*:*)
+- echo cris-axis-linux-gnu
+- exit 0 ;;
++ echo ${UNAME_MACHINE}-axis-linux-${LIBC}
++ exit ;;
++ crisv32:Linux:*:*)
++ echo ${UNAME_MACHINE}-axis-linux-${LIBC}
++ exit ;;
++ e2k:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
++ frv:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
++ hexagon:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
++ i*86:Linux:*:*)
++ echo ${UNAME_MACHINE}-pc-linux-${LIBC}
++ exit ;;
+ ia64:Linux:*:*)
+- echo ${UNAME_MACHINE}-unknown-linux-gnu
+- exit 0 ;;
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
++ k1om:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
+ m32r*:Linux:*:*)
+- echo ${UNAME_MACHINE}-unknown-linux-gnu
+- exit 0 ;;
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
+ m68*:Linux:*:*)
+- echo ${UNAME_MACHINE}-unknown-linux-gnu
+- exit 0 ;;
+- mips:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
++ mips:Linux:*:* | mips64:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+- #undef mips
+- #undef mipsel
++ #undef ${UNAME_MACHINE}
++ #undef ${UNAME_MACHINE}el
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+- CPU=mipsel
++ CPU=${UNAME_MACHINE}el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+- CPU=mips
++ CPU=${UNAME_MACHINE}
+ #else
+ CPU=
+ #endif
+ #endif
+ EOF
+- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+- test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
++ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
++ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
+ ;;
+- mips64:Linux:*:*)
+- eval $set_cc_for_build
+- sed 's/^ //' << EOF >$dummy.c
+- #undef CPU
+- #undef mips64
+- #undef mips64el
+- #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+- CPU=mips64el
+- #else
+- #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+- CPU=mips64
+- #else
+- CPU=
+- #endif
+- #endif
+-EOF
+- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+- test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
+- ;;
+- ppc:Linux:*:*)
+- echo powerpc-unknown-linux-gnu
+- exit 0 ;;
+- ppc64:Linux:*:*)
+- echo powerpc64-unknown-linux-gnu
+- exit 0 ;;
+- alpha:Linux:*:*)
+- case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+- EV5) UNAME_MACHINE=alphaev5 ;;
+- EV56) UNAME_MACHINE=alphaev56 ;;
+- PCA56) UNAME_MACHINE=alphapca56 ;;
+- PCA57) UNAME_MACHINE=alphapca56 ;;
+- EV6) UNAME_MACHINE=alphaev6 ;;
+- EV67) UNAME_MACHINE=alphaev67 ;;
+- EV68*) UNAME_MACHINE=alphaev68 ;;
+- esac
+- objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+- if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+- echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+- exit 0 ;;
++ openrisc*:Linux:*:*)
++ echo or1k-unknown-linux-${LIBC}
++ exit ;;
++ or32:Linux:*:* | or1k*:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
++ padre:Linux:*:*)
++ echo sparc-unknown-linux-${LIBC}
++ exit ;;
++ parisc64:Linux:*:* | hppa64:Linux:*:*)
++ echo hppa64-unknown-linux-${LIBC}
++ exit ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+- PA7*) echo hppa1.1-unknown-linux-gnu ;;
+- PA8*) echo hppa2.0-unknown-linux-gnu ;;
+- *) echo hppa-unknown-linux-gnu ;;
++ PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
++ PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
++ *) echo hppa-unknown-linux-${LIBC} ;;
+ esac
+- exit 0 ;;
+- parisc64:Linux:*:* | hppa64:Linux:*:*)
+- echo hppa64-unknown-linux-gnu
+- exit 0 ;;
++ exit ;;
++ ppc64:Linux:*:*)
++ echo powerpc64-unknown-linux-${LIBC}
++ exit ;;
++ ppc:Linux:*:*)
++ echo powerpc-unknown-linux-${LIBC}
++ exit ;;
++ ppc64le:Linux:*:*)
++ echo powerpc64le-unknown-linux-${LIBC}
++ exit ;;
++ ppcle:Linux:*:*)
++ echo powerpcle-unknown-linux-${LIBC}
++ exit ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+- echo ${UNAME_MACHINE}-ibm-linux
+- exit 0 ;;
++ echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
++ exit ;;
+ sh64*:Linux:*:*)
+- echo ${UNAME_MACHINE}-unknown-linux-gnu
+- exit 0 ;;
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
+ sh*:Linux:*:*)
+- echo ${UNAME_MACHINE}-unknown-linux-gnu
+- exit 0 ;;
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+- echo ${UNAME_MACHINE}-unknown-linux-gnu
+- exit 0 ;;
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
++ tile*:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
++ vax:Linux:*:*)
++ echo ${UNAME_MACHINE}-dec-linux-${LIBC}
++ exit ;;
+ x86_64:Linux:*:*)
+- echo x86_64-unknown-linux-gnu
+- exit 0 ;;
+- i*86:Linux:*:*)
+- # The BFD linker knows what the default object file format is, so
+- # first see if it will tell us. cd to the root directory to prevent
+- # problems with other programs or directories called `ld' in the path.
+- # Set LC_ALL=C to ensure ld outputs messages in English.
+- ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+- | sed -ne '/supported targets:/!d
+- s/[ ][ ]*/ /g
+- s/.*supported targets: *//
+- s/ .*//
+- p'`
+- case "$ld_supported_targets" in
+- elf32-i386)
+- TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+- ;;
+- a.out-i386-linux)
+- echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+- exit 0 ;;
+- coff-i386)
+- echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+- exit 0 ;;
+- "")
+- # Either a pre-BFD a.out linker (linux-gnuoldld) or
+- # one that does not give us useful --help.
+- echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+- exit 0 ;;
+- esac
+- # Determine whether the default compiler is a.out or elf
+- eval $set_cc_for_build
+- sed 's/^ //' << EOF >$dummy.c
+- #include <features.h>
+- #ifdef __ELF__
+- # ifdef __GLIBC__
+- # if __GLIBC__ >= 2
+- LIBC=gnu
+- # else
+- LIBC=gnulibc1
+- # endif
+- # else
+- LIBC=gnulibc1
+- # endif
+- #else
+- #ifdef __INTEL_COMPILER
+- LIBC=gnu
+- #else
+- LIBC=gnuaout
+- #endif
+- #endif
+- #ifdef __dietlibc__
+- LIBC=dietlibc
+- #endif
+-EOF
+- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+- test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0
+- test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
+- ;;
++ echo ${UNAME_MACHINE}-pc-linux-${LIBC}
++ exit ;;
++ xtensa*:Linux:*:*)
++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
++ exit ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ echo i386-sequent-sysv4
+- exit 0 ;;
++ exit ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+- # Unixware is an offshoot of SVR4, but it has its own version
+- # number series starting with 2...
+- # I am not positive that other SVR4 systems won't match this,
++ # Unixware is an offshoot of SVR4, but it has its own version
++ # number series starting with 2...
++ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+- # Use sysv4.2uw... so that sysv4* matches it.
++ # Use sysv4.2uw... so that sysv4* matches it.
+ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+- exit 0 ;;
++ exit ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ echo ${UNAME_MACHINE}-pc-os2-emx
+- exit 0 ;;
++ exit ;;
+ i*86:XTS-300:*:STOP)
+ echo ${UNAME_MACHINE}-unknown-stop
+- exit 0 ;;
++ exit ;;
+ i*86:atheos:*:*)
+ echo ${UNAME_MACHINE}-unknown-atheos
+- exit 0 ;;
+- i*86:syllable:*:*)
++ exit ;;
++ i*86:syllable:*:*)
+ echo ${UNAME_MACHINE}-pc-syllable
+- exit 0 ;;
+- i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
++ exit ;;
++ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ i*86:*DOS:*:*)
+ echo ${UNAME_MACHINE}-pc-msdosdjgpp
+- exit 0 ;;
++ exit ;;
+ i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+ UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+@@ -1040,15 +1094,16 @@ EOF
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+ fi
+- exit 0 ;;
+- i*86:*:5:[78]*)
++ exit ;;
++ i*86:*:5:[678]*)
++ # UnixWare 7.x, OpenUNIX and OpenServer 6.
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+- exit 0 ;;
++ exit ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+@@ -1066,73 +1121,86 @@ EOF
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+- exit 0 ;;
++ exit ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+- # uname -m prints for DJGPP always 'pc', but it prints nothing about
+- # the processor, so we play safe by assuming i386.
+- echo i386-pc-msdosdjgpp
+- exit 0 ;;
++ # uname -m prints for DJGPP always 'pc', but it prints nothing about
++ # the processor, so we play safe by assuming i586.
++ # Note: whatever this is, it MUST be the same as what config.sub
++ # prints for the "djgpp" host, or else GDB configure will decide that
++ # this is a cross-build.
++ echo i586-pc-msdosdjgpp
++ exit ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+- exit 0 ;;
++ exit ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+- exit 0 ;;
++ exit ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+- exit 0 ;;
++ exit ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+- exit 0 ;;
++ exit ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ echo m68k-convergent-sysv
+- exit 0 ;;
++ exit ;;
+ M680?0:D-NIX:5.3:*)
+ echo m68k-diab-dnix
+- exit 0 ;;
+- M68*:*:R3V[567]*:*)
+- test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+- 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0)
++ exit ;;
++ M68*:*:R3V[5678]*:*)
++ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
++ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+- && echo i486-ncr-sysv4.3${OS_REL} && exit 0
++ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+- && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
++ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+- && echo i486-ncr-sysv4 && exit 0 ;;
++ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
++ && { echo i486-ncr-sysv4; exit; } ;;
++ NCR*:*:4.2:* | MPRAS*:*:4.2:*)
++ OS_REL='.3'
++ test -r /etc/.relid \
++ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
++ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
++ && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
++ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
++ && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
++ /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
++ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+- exit 0 ;;
++ exit ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ rs6000:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+- exit 0 ;;
+- PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
++ exit ;;
++ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+ echo powerpc-unknown-lynxos${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ RM*:ReliantUNIX-*:*:*)
+ echo mips-sni-sysv4
+- exit 0 ;;
++ exit ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+- exit 0 ;;
++ exit ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+@@ -1140,278 +1208,203 @@ EOF
+ else
+ echo ns32k-sni-sysv
+ fi
+- exit 0 ;;
+- PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+- # says <Richard.M.Bartel@ccMail.Census.GOV>
+- echo i586-unisys-sysv4
+- exit 0 ;;
++ exit ;;
++ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
++ # says <Richard.M.Bartel@ccMail.Census.GOV>
++ echo i586-unisys-sysv4
++ exit ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+- exit 0 ;;
++ exit ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ echo i860-stratus-sysv4
+- exit 0 ;;
++ exit ;;
++ i*86:VOS:*:*)
++ # From Paul.Green@stratus.com.
++ echo ${UNAME_MACHINE}-stratus-vos
++ exit ;;
+ *:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo hppa1.1-stratus-vos
+- exit 0 ;;
++ exit ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ news*:NEWS-OS:6*:*)
+ echo mips-sony-newsos6
+- exit 0 ;;
++ exit ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if [ -d /usr/nec ]; then
+- echo mips-nec-sysv${UNAME_RELEASE}
++ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+- echo mips-unknown-sysv${UNAME_RELEASE}
++ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+- exit 0 ;;
++ exit ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ echo powerpc-be-beos
+- exit 0 ;;
++ exit ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ echo powerpc-apple-beos
+- exit 0 ;;
++ exit ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ echo i586-pc-beos
+- exit 0 ;;
++ exit ;;
++ BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
++ echo i586-pc-haiku
++ exit ;;
++ x86_64:Haiku:*:*)
++ echo x86_64-unknown-haiku
++ exit ;;
+ SX-4:SUPER-UX:*:*)
+ echo sx4-nec-superux${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ SX-5:SUPER-UX:*:*)
+ echo sx5-nec-superux${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ SX-6:SUPER-UX:*:*)
+ echo sx6-nec-superux${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
++ SX-7:SUPER-UX:*:*)
++ echo sx7-nec-superux${UNAME_RELEASE}
++ exit ;;
++ SX-8:SUPER-UX:*:*)
++ echo sx8-nec-superux${UNAME_RELEASE}
++ exit ;;
++ SX-8R:SUPER-UX:*:*)
++ echo sx8r-nec-superux${UNAME_RELEASE}
++ exit ;;
++ SX-ACE:SUPER-UX:*:*)
++ echo sxace-nec-superux${UNAME_RELEASE}
++ exit ;;
+ Power*:Rhapsody:*:*)
+ echo powerpc-apple-rhapsody${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ *:Rhapsody:*:*)
+ echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ *:Darwin:*:*)
+- case `uname -p` in
+- *86) UNAME_PROCESSOR=i686 ;;
+- powerpc) UNAME_PROCESSOR=powerpc ;;
+- esac
++ UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
++ eval $set_cc_for_build
++ if test "$UNAME_PROCESSOR" = unknown ; then
++ UNAME_PROCESSOR=powerpc
++ fi
++ if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
++ if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
++ if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
++ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
++ grep IS_64BIT_ARCH >/dev/null
++ then
++ case $UNAME_PROCESSOR in
++ i386) UNAME_PROCESSOR=x86_64 ;;
++ powerpc) UNAME_PROCESSOR=powerpc64 ;;
++ esac
++ fi
++ fi
++ elif test "$UNAME_PROCESSOR" = i386 ; then
++ # Avoid executing cc on OS X 10.9, as it ships with a stub
++ # that puts up a graphical alert prompting to install
++ # developer tools. Any system running Mac OS X 10.7 or
++ # later (Darwin 11 and later) is required to have a 64-bit
++ # processor. This is not true of the ARM version of Darwin
++ # that Apple uses in portable devices.
++ UNAME_PROCESSOR=x86_64
++ fi
+ echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+- if test "$UNAME_PROCESSOR" = "x86"; then
++ if test "$UNAME_PROCESSOR" = x86; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ *:QNX:*:4*)
+ echo i386-pc-qnx
+- exit 0 ;;
++ exit ;;
++ NEO-?:NONSTOP_KERNEL:*:*)
++ echo neo-tandem-nsk${UNAME_RELEASE}
++ exit ;;
++ NSE-*:NONSTOP_KERNEL:*:*)
++ echo nse-tandem-nsk${UNAME_RELEASE}
++ exit ;;
+ NSR-?:NONSTOP_KERNEL:*:*)
+ echo nsr-tandem-nsk${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ *:NonStop-UX:*:*)
+ echo mips-compaq-nonstopux
+- exit 0 ;;
++ exit ;;
+ BS2000:POSIX*:*:*)
+ echo bs2000-siemens-sysv
+- exit 0 ;;
++ exit ;;
+ DS/*:UNIX_System_V:*:*)
+ echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+- exit 0 ;;
++ exit ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+- if test "$cputype" = "386"; then
++ if test "$cputype" = 386; then
+ UNAME_MACHINE=i386
+ else
+ UNAME_MACHINE="$cputype"
+ fi
+ echo ${UNAME_MACHINE}-unknown-plan9
+- exit 0 ;;
++ exit ;;
+ *:TOPS-10:*:*)
+ echo pdp10-unknown-tops10
+- exit 0 ;;
++ exit ;;
+ *:TENEX:*:*)
+ echo pdp10-unknown-tenex
+- exit 0 ;;
++ exit ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ echo pdp10-dec-tops20
+- exit 0 ;;
++ exit ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ echo pdp10-xkl-tops20
+- exit 0 ;;
++ exit ;;
+ *:TOPS-20:*:*)
+ echo pdp10-unknown-tops20
+- exit 0 ;;
++ exit ;;
+ *:ITS:*:*)
+ echo pdp10-unknown-its
+- exit 0 ;;
++ exit ;;
+ SEI:*:*:SEIUX)
+- echo mips-sei-seiux${UNAME_RELEASE}
+- exit 0 ;;
++ echo mips-sei-seiux${UNAME_RELEASE}
++ exit ;;
+ *:DragonFly:*:*)
+ echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+- exit 0 ;;
++ exit ;;
++ *:*VMS:*:*)
++ UNAME_MACHINE=`(uname -p) 2>/dev/null`
++ case "${UNAME_MACHINE}" in
++ A*) echo alpha-dec-vms ; exit ;;
++ I*) echo ia64-dec-vms ; exit ;;
++ V*) echo vax-dec-vms ; exit ;;
++ esac ;;
++ *:XENIX:*:SysV)
++ echo i386-pc-xenix
++ exit ;;
++ i*86:skyos:*:*)
++ echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'`
++ exit ;;
++ i*86:rdos:*:*)
++ echo ${UNAME_MACHINE}-pc-rdos
++ exit ;;
++ i*86:AROS:*:*)
++ echo ${UNAME_MACHINE}-pc-aros
++ exit ;;
++ x86_64:VMkernel:*:*)
++ echo ${UNAME_MACHINE}-unknown-esx
++ exit ;;
++ amd64:Isilon\ OneFS:*:*)
++ echo x86_64-unknown-onefs
++ exit ;;
+ esac
+
+-#echo '(No uname command or uname output not recognized.)' 1>&2
+-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+-
+-eval $set_cc_for_build
+-cat >$dummy.c <<EOF
+-#ifdef _SEQUENT_
+-# include <sys/types.h>
+-# include <sys/utsname.h>
+-#endif
+-main ()
+-{
+-#if defined (sony)
+-#if defined (MIPSEB)
+- /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+- I don't know.... */
+- printf ("mips-sony-bsd\n"); exit (0);
+-#else
+-#include <sys/param.h>
+- printf ("m68k-sony-newsos%s\n",
+-#ifdef NEWSOS4
+- "4"
+-#else
+- ""
+-#endif
+- ); exit (0);
+-#endif
+-#endif
+-
+-#if defined (__arm) && defined (__acorn) && defined (__unix)
+- printf ("arm-acorn-riscix"); exit (0);
+-#endif
+-
+-#if defined (hp300) && !defined (hpux)
+- printf ("m68k-hp-bsd\n"); exit (0);
+-#endif
+-
+-#if defined (NeXT)
+-#if !defined (__ARCHITECTURE__)
+-#define __ARCHITECTURE__ "m68k"
+-#endif
+- int version;
+- version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+- if (version < 4)
+- printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+- else
+- printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+- exit (0);
+-#endif
+-
+-#if defined (MULTIMAX) || defined (n16)
+-#if defined (UMAXV)
+- printf ("ns32k-encore-sysv\n"); exit (0);
+-#else
+-#if defined (CMU)
+- printf ("ns32k-encore-mach\n"); exit (0);
+-#else
+- printf ("ns32k-encore-bsd\n"); exit (0);
+-#endif
+-#endif
+-#endif
+-
+-#if defined (__386BSD__)
+- printf ("i386-pc-bsd\n"); exit (0);
+-#endif
+-
+-#if defined (sequent)
+-#if defined (i386)
+- printf ("i386-sequent-dynix\n"); exit (0);
+-#endif
+-#if defined (ns32000)
+- printf ("ns32k-sequent-dynix\n"); exit (0);
+-#endif
+-#endif
+-
+-#if defined (_SEQUENT_)
+- struct utsname un;
+-
+- uname(&un);
+-
+- if (strncmp(un.version, "V2", 2) == 0) {
+- printf ("i386-sequent-ptx2\n"); exit (0);
+- }
+- if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+- printf ("i386-sequent-ptx1\n"); exit (0);
+- }
+- printf ("i386-sequent-ptx\n"); exit (0);
+-
+-#endif
+-
+-#if defined (vax)
+-# if !defined (ultrix)
+-# include <sys/param.h>
+-# if defined (BSD)
+-# if BSD == 43
+- printf ("vax-dec-bsd4.3\n"); exit (0);
+-# else
+-# if BSD == 199006
+- printf ("vax-dec-bsd4.3reno\n"); exit (0);
+-# else
+- printf ("vax-dec-bsd\n"); exit (0);
+-# endif
+-# endif
+-# else
+- printf ("vax-dec-bsd\n"); exit (0);
+-# endif
+-# else
+- printf ("vax-dec-ultrix\n"); exit (0);
+-# endif
+-#endif
+-
+-#if defined (alliant) && defined (i860)
+- printf ("i860-alliant-bsd\n"); exit (0);
+-#endif
+-
+- exit (1);
+-}
+-EOF
+-
+-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0
+-
+-# Apollos put the system type in the environment.
+-
+-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+-
+-# Convex versions that predate uname can use getsysinfo(1)
+-
+-if [ -x /usr/convex/getsysinfo ]
+-then
+- case `getsysinfo -f cpu_type` in
+- c1*)
+- echo c1-convex-bsd
+- exit 0 ;;
+- c2*)
+- if getsysinfo -f scalar_acc
+- then echo c32-convex-bsd
+- else echo c2-convex-bsd
+- fi
+- exit 0 ;;
+- c34*)
+- echo c34-convex-bsd
+- exit 0 ;;
+- c38*)
+- echo c38-convex-bsd
+- exit 0 ;;
+- c4*)
+- echo c4-convex-bsd
+- exit 0 ;;
+- esac
+-fi
+-
+ cat >&2 <<EOF
+ $0: unable to guess system type
+
+@@ -1419,7 +1412,9 @@ This script, last modified $timestamp, has failed to recognize
+ the operating system you are using. It is advised that you
+ download the most up to date version of the config scripts from
+
+- ftp://ftp.gnu.org/pub/gnu/config/
++ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
++and
++ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
+
+ If the version you run ($0) is already up to date, please
+ send the following data and any information you think might be
+diff --git a/config.h.dist b/config.h.dist
+index 844a555..0440927 100644
+--- a/config.h.dist
++++ b/config.h.dist
+@@ -9,10 +9,10 @@
+ /* User Configuration */
+
+ /*
+- If you define DICT, you can use dictionary look-up function
++ If you define USE_DICT, you can use dictionary look-up function
+ in w3m. See README.dict for detail.
+ */
+-#define DICT
++#define USE_DICT
+
+ /*
+ If you want to load and save URL history.
+diff --git a/config.h.in b/config.h.in
+index 2f41eed..3b575e4 100644
+--- a/config.h.in
++++ b/config.h.in
+@@ -25,6 +25,7 @@
+
+ #define PASSWD_FILE RC_DIR "/passwd"
+ #define PRE_FORM_FILE RC_DIR "/pre_form"
++#define SITECONF_FILE RC_DIR "/siteconf"
+ #define USER_MAILCAP RC_DIR "/mailcap"
+ #define SYS_MAILCAP CONF_DIR "/mailcap"
+ #define USER_MIMETYPES "~/.mime.types"
+@@ -84,7 +85,7 @@
+ #undef INET6
+ #undef HAVE_SOCKLEN_T
+ #undef HAVE_OLD_SS_FAMILY
+-#define USE_EGD
++#undef USE_EGD
+ #define ENABLE_REMOVE_TRAILINGSPACES
+ #undef MENU_THIN_FRAME
+ #undef USE_RAW_SCROLL
+@@ -209,6 +210,10 @@ typedef RETSIGTYPE MySignalHandler;
+ #define SUPPORT_WIN9X_CONSOLE_MBCS 1
+ #endif
+
++#if defined(__CYGWIN__) && defined(__x86_64__)
++#define DONT_CALL_GC_AFTER_FORK
++#endif
++
+ #if defined(__DJGPP__)
+ #define DEFAULT_TERM "dosansi"
+ #else
+diff --git a/config.sub b/config.sub
+index ba33103..8d39c4b 100755
+--- a/config.sub
++++ b/config.sub
+@@ -1,42 +1,40 @@
+ #! /bin/sh
+ # Configuration validation subroutine script.
+-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+-# 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
++# Copyright 1992-2016 Free Software Foundation, Inc.
+
+-timestamp='2004-03-12'
++timestamp='2016-03-30'
+
+-# This file is (in principle) common to ALL GNU software.
+-# The presence of a machine in this file suggests that SOME GNU software
+-# can handle that machine. It does not imply ALL GNU software can.
+-#
+-# This file is free software; you can redistribute it and/or modify
+-# it under the terms of the GNU General Public License as published by
+-# the Free Software Foundation; either version 2 of the License, or
++# This file is free software; you can redistribute it and/or modify it
++# under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 3 of the License, or
+ # (at your option) any later version.
+ #
+-# This program is distributed in the hope that it will be useful,
+-# but WITHOUT ANY WARRANTY; without even the implied warranty of
+-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-# GNU General Public License for more details.
++# This program is distributed in the hope that it will be useful, but
++# WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++# General Public License for more details.
+ #
+ # You should have received a copy of the GNU General Public License
+-# along with this program; if not, write to the Free Software
+-# Foundation, Inc., 59 Temple Place - Suite 330,
+-# Boston, MA 02111-1307, USA.
+-
++# along with this program; if not, see <http://www.gnu.org/licenses/>.
++#
+ # As a special exception to the GNU General Public License, if you
+ # distribute this file as part of a program that contains a
+ # configuration script generated by Autoconf, you may include it under
+-# the same distribution terms that you use for the rest of that program.
++# the same distribution terms that you use for the rest of that
++# program. This Exception is an additional permission under section 7
++# of the GNU General Public License, version 3 ("GPLv3").
+
+-# Please send patches to <config-patches@gnu.org>. Submit a context
+-# diff and a properly formatted ChangeLog entry.
++
++# Please send patches to <config-patches@gnu.org>.
+ #
+ # Configuration subroutine to validate and canonicalize a configuration type.
+ # Supply the specified configuration type as an argument.
+ # If it is invalid, we print an error message on stderr and exit with code 1.
+ # Otherwise, we print the canonical config type on stdout and succeed.
+
++# You can get the latest version of this script from:
++# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
++
+ # This file is supposed to be the same for all GNU packages
+ # and recognize all the CPU types, system types and aliases
+ # that are meaningful with *any* GNU software.
+@@ -55,8 +53,7 @@ timestamp='2004-03-12'
+ me=`echo "$0" | sed -e 's,.*/,,'`
+
+ usage="\
+-Usage: $0 [OPTION] CPU-MFR-OPSYS
+- $0 [OPTION] ALIAS
++Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
+
+ Canonicalize a configuration name.
+
+@@ -70,8 +67,7 @@ Report bugs and patches to <config-patches@gnu.org>."
+ version="\
+ GNU config.sub ($timestamp)
+
+-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+-Free Software Foundation, Inc.
++Copyright 1992-2016 Free Software Foundation, Inc.
+
+ This is free software; see the source for copying conditions. There is NO
+ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+@@ -83,11 +79,11 @@ Try \`$me --help' for more information."
+ while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+- echo "$timestamp" ; exit 0 ;;
++ echo "$timestamp" ; exit ;;
+ --version | -v )
+- echo "$version" ; exit 0 ;;
++ echo "$version" ; exit ;;
+ --help | --h* | -h )
+- echo "$usage"; exit 0 ;;
++ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+@@ -99,7 +95,7 @@ while test $# -gt 0 ; do
+ *local*)
+ # First pass through any local machine types.
+ echo $1
+- exit 0;;
++ exit ;;
+
+ * )
+ break ;;
+@@ -118,11 +114,18 @@ esac
+ # Here we must recognize all the valid KERNEL-OS combinations.
+ maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+ case $maybe_os in
+- nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
+- kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
++ nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
++ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
++ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
++ kopensolaris*-gnu* | \
++ storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
++ android-linux)
++ os=-linux-android
++ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
++ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+@@ -145,10 +148,13 @@ case $os in
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+- -apple | -axis)
++ -apple | -axis | -knuth | -cray | -microblaze*)
+ os=
+ basic_machine=$1
+ ;;
++ -bluegene*)
++ os=-cnk
++ ;;
+ -sim | -cisco | -oki | -wec | -winbond)
+ os=
+ basic_machine=$1
+@@ -163,13 +169,17 @@ case $os in
+ os=-chorusos
+ basic_machine=$1
+ ;;
+- -chorusrdb)
+- os=-chorusrdb
++ -chorusrdb)
++ os=-chorusrdb
+ basic_machine=$1
+- ;;
++ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
++ -sco6)
++ os=-sco5v6
++ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
++ ;;
+ -sco5)
+ os=-sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+@@ -186,6 +196,10 @@ case $os in
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
++ -sco5v6*)
++ # Don't forget version if it is 3.2v4 or newer.
++ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
++ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+@@ -203,6 +217,12 @@ case $os in
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
++ -lynx*178)
++ os=-lynxos178
++ ;;
++ -lynx*5)
++ os=-lynxos5
++ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+@@ -227,57 +247,114 @@ case $basic_machine in
+ # Some are omitted here because they have special meanings below.
+ 1750a | 580 \
+ | a29k \
++ | aarch64 | aarch64_be \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+- | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+- | c4x | clipper \
++ | arc | arceb \
++ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
++ | avr | avr32 \
++ | ba \
++ | be32 | be64 \
++ | bfin \
++ | c4x | c8051 | clipper \
+ | d10v | d30v | dlx | dsp16xx \
+- | fr30 | frv \
++ | e2k | epiphany \
++ | fido | fr30 | frv | ft32 \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
++ | hexagon \
+ | i370 | i860 | i960 | ia64 \
+ | ip2k | iq2000 \
+- | m32r | m32rle | m68000 | m68k | m88k | mcore \
++ | k1om \
++ | le32 | le64 \
++ | lm32 \
++ | m32c | m32r | m32rle | m68000 | m68k | m88k \
++ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+- | mips64vr | mips64vrel \
++ | mips64octeon | mips64octeonel \
+ | mips64orion | mips64orionel \
++ | mips64r5900 | mips64r5900el \
++ | mips64vr | mips64vrel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
++ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
++ | mipsisa32r6 | mipsisa32r6el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
++ | mipsisa64r6 | mipsisa64r6el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
++ | mipsr5900 | mipsr5900el \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
++ | moxie \
++ | mt \
+ | msp430 \
++ | nds32 | nds32le | nds32be \
++ | nios | nios2 | nios2eb | nios2el \
+ | ns16k | ns32k \
+- | openrisc | or32 \
++ | open8 | or1k | or1knd | or32 \
+ | pdp10 | pdp11 | pj | pjl \
+- | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
++ | powerpc | powerpc64 | powerpc64le | powerpcle \
+ | pyramid \
+- | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
++ | riscv32 | riscv64 \
++ | rl78 | rx \
++ | score \
++ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+- | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv8 | sparcv9 | sparcv9b \
+- | strongarm \
+- | tahoe | thumb | tic4x | tic80 | tron \
+- | v850 | v850e \
++ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
++ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
++ | spu \
++ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
++ | ubicom32 \
++ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
++ | visium \
+ | we32k \
+- | x86 | xscale | xstormy16 | xtensa \
+- | z8k)
++ | x86 | xc16x | xstormy16 | xtensa \
++ | z8k | z80)
+ basic_machine=$basic_machine-unknown
+ ;;
+- m6811 | m68hc11 | m6812 | m68hc12)
+- # Motorola 68HC11/12.
++ c54x)
++ basic_machine=tic54x-unknown
++ ;;
++ c55x)
++ basic_machine=tic55x-unknown
++ ;;
++ c6x)
++ basic_machine=tic6x-unknown
++ ;;
++ leon|leon[3-9])
++ basic_machine=sparc-$basic_machine
++ ;;
++ m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ ;;
++ ms1)
++ basic_machine=mt-unknown
++ ;;
++
++ strongarm | thumb | xscale)
++ basic_machine=arm-unknown
++ ;;
++ xgate)
++ basic_machine=$basic_machine-unknown
++ os=-none
++ ;;
++ xscaleeb)
++ basic_machine=armeb-unknown
++ ;;
++
++ xscaleel)
++ basic_machine=armel-unknown
++ ;;
+
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+@@ -293,59 +370,89 @@ case $basic_machine in
+ # Recognize the basic CPU types with company name.
+ 580-* \
+ | a29k-* \
++ | aarch64-* | aarch64_be-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+- | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
++ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+- | avr-* \
+- | bs2000-* \
+- | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+- | clipper-* | cydra-* \
++ | avr-* | avr32-* \
++ | ba-* \
++ | be32-* | be64-* \
++ | bfin-* | bs2000-* \
++ | c[123]* | c30-* | [cjt]90-* | c4x-* \
++ | c8051-* | clipper-* | craynv-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+- | elxsi-* \
+- | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
++ | e2k-* | elxsi-* \
++ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
++ | hexagon-* \
+ | i*86-* | i860-* | i960-* | ia64-* \
+ | ip2k-* | iq2000-* \
+- | m32r-* | m32rle-* \
++ | k1om-* \
++ | le32-* | le64-* \
++ | lm32-* \
++ | m32c-* | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+- | m88110-* | m88k-* | mcore-* \
++ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
++ | microblaze-* | microblazeel-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+- | mips64vr-* | mips64vrel-* \
++ | mips64octeon-* | mips64octeonel-* \
+ | mips64orion-* | mips64orionel-* \
++ | mips64r5900-* | mips64r5900el-* \
++ | mips64vr-* | mips64vrel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
++ | mips64vr5900-* | mips64vr5900el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
++ | mipsisa32r6-* | mipsisa32r6el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
++ | mipsisa64r6-* | mipsisa64r6el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
++ | mipsr5900-* | mipsr5900el-* \
+ | mipstx39-* | mipstx39el-* \
++ | mmix-* \
++ | mt-* \
+ | msp430-* \
+- | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \
++ | nds32-* | nds32le-* | nds32be-* \
++ | nios-* | nios2-* | nios2eb-* | nios2el-* \
++ | none-* | np1-* | ns16k-* | ns32k-* \
++ | open8-* \
++ | or1k*-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+- | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
++ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+ | pyramid-* \
+- | romp-* | rs6000-* \
+- | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \
++ | riscv32-* | riscv64-* \
++ | rl78-* | romp-* | rs6000-* | rx-* \
++ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+- | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \
+- | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+- | tahoe-* | thumb-* \
++ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
++ | sparclite-* \
++ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
++ | tahoe-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
++ | tile*-* \
+ | tron-* \
+- | v850-* | v850e-* | vax-* \
++ | ubicom32-* \
++ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
++ | vax-* \
++ | visium-* \
+ | we32k-* \
+- | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \
+- | xtensa-* \
++ | x86-* | x86_64-* | xc16x-* | xps100-* \
++ | xstormy16-* | xtensa*-* \
+ | ymp-* \
+- | z8k-*)
++ | z8k-* | z80-*)
++ ;;
++ # Recognize the basic CPU types without company name, with glob match.
++ xtensa*)
++ basic_machine=$basic_machine-unknown
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+@@ -363,7 +470,7 @@ case $basic_machine in
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+- abacus)
++ abacus)
+ basic_machine=abacus-unknown
+ ;;
+ adobe68k)
+@@ -409,6 +516,13 @@ case $basic_machine in
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
++ aros)
++ basic_machine=i386-pc
++ os=-aros
++ ;;
++ asmjs)
++ basic_machine=asmjs-unknown
++ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+@@ -417,10 +531,35 @@ case $basic_machine in
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
++ blackfin)
++ basic_machine=bfin-unknown
++ os=-linux
++ ;;
++ blackfin-*)
++ basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
++ os=-linux
++ ;;
++ bluegene*)
++ basic_machine=powerpc-ibm
++ os=-cnk
++ ;;
++ c54x-*)
++ basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ;;
++ c55x-*)
++ basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ;;
++ c6x-*)
++ basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
++ cegcc)
++ basic_machine=arm-unknown
++ os=-cegcc
++ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+@@ -445,13 +584,20 @@ case $basic_machine in
+ basic_machine=j90-cray
+ os=-unicos
+ ;;
+- cr16c)
+- basic_machine=cr16c-unknown
++ craynv)
++ basic_machine=craynv-cray
++ os=-unicosmp
++ ;;
++ cr16 | cr16-*)
++ basic_machine=cr16-unknown
+ os=-elf
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
++ crisv32 | crisv32-* | etraxfs*)
++ basic_machine=crisv32-axis
++ ;;
+ cris | cris-* | etrax*)
+ basic_machine=cris-axis
+ ;;
+@@ -481,6 +627,14 @@ case $basic_machine in
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
++ dicos)
++ basic_machine=i686-pc
++ os=-dicos
++ ;;
++ djgpp)
++ basic_machine=i586-pc
++ os=-msdosdjgpp
++ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+@@ -592,7 +746,6 @@ case $basic_machine in
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ ;;
+-# I'm not sure what "Sysv32" means. Should this be sysv3.2?
+ i*86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+@@ -631,6 +784,17 @@ case $basic_machine in
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
++ leon-*|leon[3-9]-*)
++ basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`
++ ;;
++ m68knommu)
++ basic_machine=m68k-unknown
++ os=-linux
++ ;;
++ m68knommu-*)
++ basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
++ os=-linux
++ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+@@ -642,10 +806,21 @@ case $basic_machine in
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
++ microblaze*)
++ basic_machine=microblaze-xilinx
++ ;;
++ mingw64)
++ basic_machine=x86_64-pc
++ os=-mingw64
++ ;;
+ mingw32)
+- basic_machine=i386-pc
++ basic_machine=i686-pc
+ os=-mingw32
+ ;;
++ mingw32ce)
++ basic_machine=arm-unknown
++ os=-mingw32ce
++ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+@@ -659,10 +834,6 @@ case $basic_machine in
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+- mmix*)
+- basic_machine=mmix-knuth
+- os=-mmixware
+- ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ os=-coff
+@@ -671,14 +842,29 @@ case $basic_machine in
+ basic_machine=powerpc-unknown
+ os=-morphos
+ ;;
++ moxiebox)
++ basic_machine=moxie-unknown
++ os=-moxiebox
++ ;;
+ msdos)
+ basic_machine=i386-pc
+ os=-msdos
+ ;;
++ ms1-*)
++ basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
++ ;;
++ msys)
++ basic_machine=i686-pc
++ os=-msys
++ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
++ nacl)
++ basic_machine=le32-unknown
++ os=-nacl
++ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+@@ -743,9 +929,11 @@ case $basic_machine in
+ np1)
+ basic_machine=np1-gould
+ ;;
+- nv1)
+- basic_machine=nv1-cray
+- os=-unicosmp
++ neo-tandem)
++ basic_machine=neo-tandem
++ ;;
++ nse-tandem)
++ basic_machine=nse-tandem
+ ;;
+ nsr-tandem)
+ basic_machine=nsr-tandem
+@@ -754,9 +942,8 @@ case $basic_machine in
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+- or32 | or32-*)
++ openrisc | openrisc-*)
+ basic_machine=or32-unknown
+- os=-coff
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+@@ -778,6 +965,14 @@ case $basic_machine in
+ basic_machine=i860-intel
+ os=-osf
+ ;;
++ parisc)
++ basic_machine=hppa-unknown
++ os=-linux
++ ;;
++ parisc-*)
++ basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
++ os=-linux
++ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+@@ -787,6 +982,12 @@ case $basic_machine in
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
++ pc98)
++ basic_machine=i386-pc
++ ;;
++ pc98-*)
++ basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ;;
+ pentium | p5 | k5 | k6 | nexgen | viac3)
+ basic_machine=i586-pc
+ ;;
+@@ -816,9 +1017,10 @@ case $basic_machine in
+ ;;
+ power) basic_machine=power-ibm
+ ;;
+- ppc) basic_machine=powerpc-unknown
++ ppc | ppcbe) basic_machine=powerpc-unknown
+ ;;
+- ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ppc-* | ppcbe-*)
++ basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+@@ -843,6 +1045,14 @@ case $basic_machine in
+ basic_machine=i586-unknown
+ os=-pw32
+ ;;
++ rdos | rdos64)
++ basic_machine=x86_64-pc
++ os=-rdos
++ ;;
++ rdos32)
++ basic_machine=i386-pc
++ os=-rdos
++ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ os=-coff
+@@ -869,6 +1079,10 @@ case $basic_machine in
+ sb1el)
+ basic_machine=mipsisa64sb1el-unknown
+ ;;
++ sde)
++ basic_machine=mipsisa32-sde
++ os=-elf
++ ;;
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
+@@ -880,6 +1094,9 @@ case $basic_machine in
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
++ sh5el)
++ basic_machine=sh5le-unknown
++ ;;
+ sh64)
+ basic_machine=sh64-unknown
+ ;;
+@@ -901,6 +1118,9 @@ case $basic_machine in
+ basic_machine=i860-stratus
+ os=-sysv4
+ ;;
++ strongarm-* | thumb-*)
++ basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
++ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+@@ -957,17 +1177,9 @@ case $basic_machine in
+ basic_machine=t90-cray
+ os=-unicos
+ ;;
+- tic54x | c54x*)
+- basic_machine=tic54x-unknown
+- os=-coff
+- ;;
+- tic55x | c55x*)
+- basic_machine=tic55x-unknown
+- os=-coff
+- ;;
+- tic6x | c6x*)
+- basic_machine=tic6x-unknown
+- os=-coff
++ tile*)
++ basic_machine=$basic_machine-unknown
++ os=-linux-gnu
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+@@ -1029,9 +1241,16 @@ case $basic_machine in
+ basic_machine=hppa1.1-winbond
+ os=-proelf
+ ;;
++ xbox)
++ basic_machine=i686-pc
++ os=-mingw32
++ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
++ xscale-* | xscalee[bl]-*)
++ basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
++ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+@@ -1040,6 +1259,10 @@ case $basic_machine in
+ basic_machine=z8k-unknown
+ os=-sim
+ ;;
++ z80-*-coff)
++ basic_machine=z80-unknown
++ os=-sim
++ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+@@ -1059,6 +1282,9 @@ case $basic_machine in
+ romp)
+ basic_machine=romp-ibm
+ ;;
++ mmix)
++ basic_machine=mmix-knuth
++ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+@@ -1075,13 +1301,10 @@ case $basic_machine in
+ we32k)
+ basic_machine=we32k-att
+ ;;
+- sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele)
++ sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+ basic_machine=sh-unknown
+ ;;
+- sh64)
+- basic_machine=sh64-unknown
+- ;;
+- sparc | sparcv8 | sparcv9 | sparcv9b)
++ sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+@@ -1125,9 +1348,12 @@ esac
+ if [ x"$os" != x"" ]
+ then
+ case $os in
+- # First match some system type aliases
+- # that might get confused with valid system types.
++ # First match some system type aliases
++ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
++ -auroraux)
++ os=-auroraux
++ ;;
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+@@ -1148,26 +1374,32 @@ case $os in
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+- | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+- | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
++ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
++ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
++ | -sym* | -kopensolaris* | -plan9* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+- | -aos* \
++ | -aos* | -aros* | -cloudabi* | -sortix* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+- | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
++ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
++ | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \
+ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+- | -chorusos* | -chorusrdb* \
+- | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+- | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \
++ | -chorusos* | -chorusrdb* | -cegcc* \
++ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
++ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
++ | -linux-newlib* | -linux-musl* | -linux-uclibc* \
++ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+- | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*)
++ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
++ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \
++ | -onefs* | -tirtos*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -qnx*)
+@@ -1185,7 +1417,7 @@ case $os in
+ os=`echo $os | sed -e 's|nto|nto-qnx|'`
+ ;;
+ -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+- | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
++ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ ;;
+ -mac*)
+@@ -1206,7 +1438,7 @@ case $os in
+ -opened*)
+ os=-openedition
+ ;;
+- -os400*)
++ -os400*)
+ os=-os400
+ ;;
+ -wince*)
+@@ -1255,7 +1487,7 @@ case $os in
+ -sinix*)
+ os=-sysv4
+ ;;
+- -tpf*)
++ -tpf*)
+ os=-tpf
+ ;;
+ -triton*)
+@@ -1291,8 +1523,15 @@ case $os in
+ -aros*)
+ os=-aros
+ ;;
+- -kaos*)
+- os=-kaos
++ -zvmoe)
++ os=-zvmoe
++ ;;
++ -dicos*)
++ os=-dicos
++ ;;
++ -nacl*)
++ ;;
++ -ios)
+ ;;
+ -none)
+ ;;
+@@ -1316,6 +1555,12 @@ else
+ # system, and we'll never get to this point.
+
+ case $basic_machine in
++ score-*)
++ os=-elf
++ ;;
++ spu-*)
++ os=-elf
++ ;;
+ *-acorn)
+ os=-riscix1.2
+ ;;
+@@ -1325,9 +1570,24 @@ case $basic_machine in
+ arm*-semi)
+ os=-aout
+ ;;
+- c4x-* | tic4x-*)
+- os=-coff
+- ;;
++ c4x-* | tic4x-*)
++ os=-coff
++ ;;
++ c8051-*)
++ os=-elf
++ ;;
++ hexagon-*)
++ os=-elf
++ ;;
++ tic54x-*)
++ os=-coff
++ ;;
++ tic55x-*)
++ os=-coff
++ ;;
++ tic6x-*)
++ os=-coff
++ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=-tops20
+@@ -1346,13 +1606,13 @@ case $basic_machine in
+ ;;
+ m68000-sun)
+ os=-sunos3
+- # This also exists in the configure program, but was not the
+- # default.
+- # os=-sunos4
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
++ mep-*)
++ os=-elf
++ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+@@ -1371,9 +1631,15 @@ case $basic_machine in
+ *-be)
+ os=-beos
+ ;;
++ *-haiku)
++ os=-haiku
++ ;;
+ *-ibm)
+ os=-aix
+ ;;
++ *-knuth)
++ os=-mmixware
++ ;;
+ *-wec)
+ os=-proelf
+ ;;
+@@ -1476,7 +1742,7 @@ case $basic_machine in
+ -sunos*)
+ vendor=sun
+ ;;
+- -aix*)
++ -cnk*|-aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+@@ -1539,7 +1805,7 @@ case $basic_machine in
+ esac
+
+ echo $basic_machine$os
+-exit 0
++exit
+
+ # Local variables:
+ # eval: (add-hook 'write-file-hooks 'time-stamp)
+diff --git a/configure b/configure
+index 4c1bc06..140f050 100755
+--- a/configure
++++ b/configure
+@@ -1486,11 +1486,11 @@ Optional Packages:
+ --with-migemo=MIGEMO_COMMAND migemo command
+ --with-editor=EDITOR default editor (/usr/bin/vi)
+ --with-mailer=MAILER default mailer (/usr/bin/mail)
+- --with-browser=BROWSER default browser (/usr/bin/mozilla)
++ --with-browser=BROWSER default browser (/usr/bin/firefox)
+ --with-ssl=PREFIX support https protocol
+ --with-termlib=LIBS terminal library
+ LIBS is space separated list of:
+- terminfo mytinfo termcap ncurses curses
++ terminfo mytinfo termcap tinfo ncurses curses
+ --with-gc=PREFIX libgc PREFIX
+
+ Some influential environment variables:
+@@ -6755,7 +6755,7 @@ $as_echo "$enable_image" >&6; }
+ if test x"$enable_image" = xyes; then
+ enable_image=x11
+ case "`uname -s`" in
+- Linux|linux|LINUX)
++ Linux|linux|LINUX|FreeBSD|freebsd|FREEBSD)
+ if test -c /dev/fb0; then
+ enable_image=x11,fb
+ fi;;
+@@ -6811,6 +6811,9 @@ $as_echo "$with_imagelib" >&6; }
+ fi;;
+ imlib2)
+ with_imlib2="yes"
++ if test x"$PKG_CONFIG" = x; then
++ PKG_CONFIG=pkg-config
++ fi
+ if test x"$IMLIB2_CONFIG" = x; then
+ IMLIB2_CONFIG=imlib2-config
+ fi;;
+@@ -6823,8 +6826,6 @@ $as_echo "$with_imagelib" >&6; }
+ with_gtk2="yes"
+ if test x"$PKG_CONFIG" = x; then
+ PKG_CONFIG=pkg-config
+- else
+- PKG_CONFIG=:
+ fi;;
+ esac
+ done
+@@ -6926,8 +6927,8 @@ $as_echo "$as_me: WARNING: Imlib2 is not installed. Install Imlib2 (version >=
+
+ $as_echo "#define USE_GTK2 1" >>confdefs.h
+
+- IMGX11CFLAGS="`${PKG_CONFIG} --cflags gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0 gtk+-2.0`"
+- IMGX11LDFLAGS="`${PKG_CONFIG} --libs gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0 gtk+-2.0`"
++ IMGX11CFLAGS="`${PKG_CONFIG} --cflags gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0`"
++ IMGX11LDFLAGS="-lX11 `${PKG_CONFIG} --libs gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0`"
+ elif test x"$have_gdkpixbuf" = xyes; then
+ $as_echo "#define USE_W3MIMG_X11 1" >>confdefs.h
+
+@@ -6955,7 +6956,7 @@ $as_echo "$as_me: WARNING: Imlib2 is not installed. Install Imlib2 (version >=
+ $as_echo "#define USE_IMLIB2 1" >>confdefs.h
+
+ IMGX11CFLAGS="`${IMLIB2_CONFIG} --cflags`"
+- IMGX11LDFLAGS="`${IMLIB2_CONFIG} --libs`"
++ IMGX11LDFLAGS="-lX11 `${PKG_CONFIG} --libs imlib2`"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unable to build w3mimgdisplay with X11 support" >&5
+ $as_echo "$as_me: WARNING: unable to build w3mimgdisplay with X11 support" >&2;}
+@@ -6971,8 +6972,8 @@ $as_echo "$as_me: WARNING: unable to build w3mimgdisplay with X11 support" >&2;}
+
+ $as_echo "#define USE_GTK2 1" >>confdefs.h
+
+- IMGFBCFLAGS="`${PKG_CONFIG} --cflags gdk-pixbuf-2.0 gtk+-2.0`"
+- IMGFBLDFLAGS="`${PKG_CONFIG} --libs gdk-pixbuf-2.0 gtk+-2.0`"
++ IMGFBCFLAGS="`${PKG_CONFIG} --cflags gdk-pixbuf-2.0`"
++ IMGFBLDFLAGS="`${PKG_CONFIG} --libs gdk-pixbuf-2.0`"
+ elif test x"$have_gdkpixbuf" = xyes; then
+ $as_echo "#define USE_W3MIMG_FB 1" >>confdefs.h
+
+@@ -6991,7 +6992,7 @@ $as_echo "$as_me: WARNING: unable to build w3mimgdisplay with X11 support" >&2;}
+
+ IMGOBJS="$IMGOBJS fb/fb_w3mimg.o fb/fb.o fb/fb_img.o"
+ IMGFBCFLAGS="`${IMLIB2_CONFIG} --cflags`"
+- IMGFBLDFLAGS="`${IMLIB2_CONFIG} --libs`"
++ IMGFBLDFLAGS="`${PKG_CONFIG} --libs imlib2`"
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unable to build w3mimgdisplay with FB support" >&5
+ $as_echo "$as_me: WARNING: unable to build w3mimgdisplay with FB support" >&2;}
+@@ -7344,7 +7345,7 @@ cat >>confdefs.h <<_ACEOF
+ _ACEOF
+
+
+-w3m_browser="/usr/bin/mozilla"
++w3m_browser="/usr/bin/firefox"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking which external browser is used by default" >&5
+ $as_echo_n "checking which external browser is used by default... " >&6; }
+
+@@ -7977,7 +7978,7 @@ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_termlib" >&5
+ $as_echo "$with_termlib" >&6; }
+- test x"$with_termlib" = xyes && with_termlib="terminfo mytinfo termlib termcap ncurses curses"
++ test x"$with_termlib" = xyes && with_termlib="terminfo mytinfo termlib termcap tinfo ncurses curses"
+ for lib in $with_termlib; do
+ as_ac_Lib=`$as_echo "ac_cv_lib_$lib''_tgetent" | $as_tr_sh`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tgetent in -l$lib" >&5
+@@ -8986,7 +8987,7 @@ extern char *sys_errlist[];
+ int
+ main ()
+ {
+-printf(sys_errlist[0]);
++printf("%s", sys_errlist[0]);
+ ;
+ return 0;
+ }
+@@ -9076,7 +9077,7 @@ RC_DIR="~/.$PACKAGE"
+ $as_echo "#define RC_DIR \"\$RC_DIR\"" >>confdefs.h
+
+
+-DOCDIRS="doc:en_English doc-jp:ja_Japanese"
++DOCDIRS="doc:en_English doc-jp:ja_Japanese doc-de:de_German"
+ cat >>confdefs.h <<_ACEOF
+ #define DOCDIRS "$DOCDIRS"
+ _ACEOF
+@@ -9084,9 +9085,10 @@ _ACEOF
+
+
+ cvsver=`$AWK '\$1 ~ /Id:/ { print \$3}' $srcdir/ChangeLog`
+- sed -e 's/define CURRENT_VERSION "\(.*\)+cvs/define CURRENT_VERSION "\1+cvs-'$cvsver'/' $srcdir/version.c.in > version.c
++ ymdver=`sed -e 's/ .*//;s/-//g;q' $srcdir/ChangeLog`
++ sed -e 's/define CURRENT_VERSION "\(.*\)YYYYMMDD/define CURRENT_VERSION "\1'$ymdver'/;s/define CURRENT_VERSION "\(.*\)+cvs/define CURRENT_VERSION "\1+cvs-'$cvsver'/' $srcdir/version.c.in > version.c
+ CURRENT_VERSION=`sed -n 's/.*define CURRENT_VERSION *"w3m\/\(.*\)".*$/\1/p' version.c`
+-ac_config_files="$ac_config_files Makefile posubst po/Makefile.in scripts/Makefile scripts/dirlist.cgi scripts/w3mhelp.cgi scripts/w3mmail.cgi scripts/xface2xpm scripts/multipart/Makefile scripts/multipart/multipart.cgi scripts/w3mman/Makefile scripts/w3mman/w3mman scripts/w3mman/w3mman.1 scripts/w3mman/w3mman2html.cgi libwc/Makefile w3mimg/Makefile w3mimg/fb/Makefile w3mimg/x11/Makefile w3mimg/win/Makefile w3mhelp-w3m_en.html w3mhelp-w3m_ja.html w3mhelp-lynx_en.html w3mhelp-lynx_ja.html"
++ac_config_files="$ac_config_files Makefile posubst po/Makefile.in scripts/Makefile scripts/dirlist.cgi scripts/w3mhelp.cgi scripts/w3mmail.cgi scripts/xface2xpm scripts/multipart/Makefile scripts/multipart/multipart.cgi scripts/w3mman/Makefile scripts/w3mman/w3mman scripts/w3mman/w3mman.1 scripts/w3mman/w3mman.de.1 scripts/w3mman/w3mman2html.cgi libwc/Makefile w3mimg/Makefile w3mimg/fb/Makefile w3mimg/x11/Makefile w3mimg/win/Makefile w3mhelp-w3m_en.html w3mhelp-w3m_ja.html w3mhelp-lynx_en.html w3mhelp-lynx_ja.html"
+
+ cat >confcache <<\_ACEOF
+ # This file is a shell script that caches the results of configure
+@@ -9810,6 +9812,7 @@ do
+ "scripts/w3mman/Makefile") CONFIG_FILES="$CONFIG_FILES scripts/w3mman/Makefile" ;;
+ "scripts/w3mman/w3mman") CONFIG_FILES="$CONFIG_FILES scripts/w3mman/w3mman" ;;
+ "scripts/w3mman/w3mman.1") CONFIG_FILES="$CONFIG_FILES scripts/w3mman/w3mman.1" ;;
++ "scripts/w3mman/w3mman.de.1") CONFIG_FILES="$CONFIG_FILES scripts/w3mman/w3mman.de.1" ;;
+ "scripts/w3mman/w3mman2html.cgi") CONFIG_FILES="$CONFIG_FILES scripts/w3mman/w3mman2html.cgi" ;;
+ "libwc/Makefile") CONFIG_FILES="$CONFIG_FILES libwc/Makefile" ;;
+ "w3mimg/Makefile") CONFIG_FILES="$CONFIG_FILES w3mimg/Makefile" ;;
+diff --git a/configure.ac b/configure.ac
+index 7308fc6..320a6e2 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -172,7 +172,7 @@ AC_SUBST(RC_DIR)
+ RC_DIR="~/.$PACKAGE"
+ AC_DEFINE(RC_DIR, "$RC_DIR")
+ AC_SUBST(DOCDIRS)
+-DOCDIRS="doc:en_English doc-jp:ja_Japanese"
++DOCDIRS="doc:en_English doc-jp:ja_Japanese doc-de:de_German"
+ AC_DEFINE_UNQUOTED(DOCDIRS, "$DOCDIRS")
+
+ AC_W3M_VERSION
+@@ -181,7 +181,8 @@ scripts/Makefile scripts/dirlist.cgi \
+ scripts/w3mhelp.cgi \
+ scripts/w3mmail.cgi scripts/xface2xpm \
+ scripts/multipart/Makefile scripts/multipart/multipart.cgi \
+-scripts/w3mman/Makefile scripts/w3mman/w3mman scripts/w3mman/w3mman.1 \
++scripts/w3mman/Makefile scripts/w3mman/w3mman \
++scripts/w3mman/w3mman.1 scripts/w3mman/w3mman.de.1 \
+ scripts/w3mman/w3mman2html.cgi \
+ libwc/Makefile \
+ w3mimg/Makefile w3mimg/fb/Makefile w3mimg/x11/Makefile w3mimg/win/Makefile \
+diff --git a/cookie.c b/cookie.c
+index 8020f6d..705e277 100644
+--- a/cookie.c
++++ b/cookie.c
+@@ -22,10 +22,10 @@ static int is_saved = 1;
+
+ #define contain_no_dots(p, ep) (total_dot_number((p),(ep),1)==0)
+
+-static int
+-total_dot_number(char *p, char *ep, int max_count)
++static unsigned int
++total_dot_number(char *p, char *ep, unsigned int max_count)
+ {
+- int count = 0;
++ unsigned int count = 0;
+ if (!ep)
+ ep = p + strlen(p);
+
+@@ -105,6 +105,7 @@ make_portlist(Str port)
+ pl->next = first;
+ first = pl;
+ }
++ Strfree(tmp);
+ return first;
+ }
+
+@@ -247,16 +248,12 @@ find_cookie(ParsedURL *pu)
+ Strcat(tmp, Sprintf("; $Domain=\"%s\"", p1->domain->ptr));
+ if (p1->portl)
+ Strcat(tmp,
+- Sprintf("; $Port=\"%s\"", portlist2str(p1->portl)));
++ Sprintf("; $Port=\"%s\"", portlist2str(p1->portl)->ptr));
+ }
+ }
+ return tmp;
+ }
+
+-char *special_domain[] = {
+- ".com", ".edu", ".gov", ".mil", ".net", ".org", ".int", NULL
+-};
+-
+ int
+ check_avoid_wrong_number_of_dots_domain( Str domain )
+ {
+@@ -324,7 +321,7 @@ add_cookie(ParsedURL *pu, Str name, Str value,
+
+ if (version == 0) {
+ /* [NETSCAPE] rule */
+- int n = total_dot_number(domain->ptr,
++ unsigned int n = total_dot_number(domain->ptr,
+ domain->ptr + domain->length,
+ 3);
+ if (n < 2) {
+@@ -332,19 +329,6 @@ add_cookie(ParsedURL *pu, Str name, Str value,
+ COOKIE_ERROR(COO_ESPECIAL);
+ }
+ }
+- else if (n == 2) {
+- char **sdomain;
+- int ok = 0;
+- for (sdomain = special_domain; !ok && *sdomain; sdomain++) {
+- int offset = domain->length - strlen(*sdomain);
+- if (offset >= 0 &&
+- strcasecmp(*sdomain, &domain->ptr[offset]) == 0)
+- ok = 1;
+- }
+- if (!ok && ! check_avoid_wrong_number_of_dots_domain(domain)) {
+- COOKIE_ERROR(COO_ESPECIAL);
+- }
+- }
+ }
+ else {
+ /* [DRAFT 12] s. 4.3.2 case 2 */
+@@ -463,7 +447,7 @@ save_cookies(void)
+ continue;
+ fprintf(fp, "%s\t%s\t%s\t%ld\t%s\t%s\t%d\t%d\t%s\t%s\t%s\n",
+ parsedURL2Str(&p->url)->ptr,
+- p->name->ptr, p->value->ptr, p->expires,
++ p->name->ptr, p->value->ptr, (long)p->expires,
+ p->domain->ptr, p->path->ptr, p->flag,
+ p->version, str2charp(p->comment),
+ (p->portl) ? portlist2str(p->portl)->ptr : "",
+@@ -517,36 +501,36 @@ load_cookies(void)
+ cookie->commentURL = NULL;
+ parseURL(readcol(&str)->ptr, &cookie->url, NULL);
+ if (!*str)
+- return;
++ break;
+ cookie->name = readcol(&str);
+ if (!*str)
+- return;
++ break;
+ cookie->value = readcol(&str);
+ if (!*str)
+- return;
++ break;
+ cookie->expires = (time_t) atol(readcol(&str)->ptr);
+ if (!*str)
+- return;
++ break;
+ cookie->domain = readcol(&str);
+ if (!*str)
+- return;
++ break;
+ cookie->path = readcol(&str);
+ if (!*str)
+- return;
++ break;
+ cookie->flag = atoi(readcol(&str)->ptr);
+ if (!*str)
+- return;
++ break;
+ cookie->version = atoi(readcol(&str)->ptr);
+ if (!*str)
+- return;
++ break;
+ cookie->comment = readcol(&str);
+ if (cookie->comment->length == 0)
+ cookie->comment = NULL;
+ if (!*str)
+- return;
++ break;
+ cookie->portl = make_portlist(readcol(&str));
+ if (!*str)
+- return;
++ break;
+ cookie->commentURL = readcol(&str);
+ if (cookie->commentURL->length == 0)
+ cookie->commentURL = NULL;
+diff --git a/display.c b/display.c
+index e00eb0c..d4f336a 100644
+--- a/display.c
++++ b/display.c
+@@ -257,7 +257,7 @@ make_lastline_link(Buffer *buf, char *title, char *url)
+ parseURL2(url, &pu, baseURL(buf));
+ u = parsedURL2Str(&pu);
+ if (DecodeURL)
+- u = Strnew_charp(url_unquote_conv(u->ptr, buf->document_charset));
++ u = Strnew_charp(url_decode2(u->ptr, buf));
+ #ifdef USE_M17N
+ u = checkType(u, &pr, NULL);
+ #endif
+@@ -487,7 +487,7 @@ displayBuffer(Buffer *buf, int mode)
+ term_title(conv_to_system(buf->buffername));
+ refresh();
+ #ifdef USE_IMAGE
+- if (activeImage && displayImage && buf->img) {
++ if (activeImage && displayImage && buf->img && buf->image_loaded) {
+ drawImage();
+ }
+ #endif
+@@ -521,7 +521,15 @@ drawAnchorCursor0(Buffer *buf, AnchorList *al, int hseq, int prevhseq,
+ break;
+ }
+ if (hseq >= 0 && an->hseq == hseq) {
++ int start_pos = an->start.pos;
++ int end_pos = an->end.pos;
+ for (i = an->start.pos; i < an->end.pos; i++) {
++ if (enable_inline_image && (l->propBuf[i] & PE_IMAGE)) {
++ if (start_pos == i)
++ start_pos = i + 1;
++ else if (end_pos == an->end.pos)
++ end_pos = i - 1;
++ }
+ if (l->propBuf[i] & (PE_IMAGE | PE_ANCHOR | PE_FORM)) {
+ if (active)
+ l->propBuf[i] |= PE_ACTIVE;
+@@ -529,9 +537,9 @@ drawAnchorCursor0(Buffer *buf, AnchorList *al, int hseq, int prevhseq,
+ l->propBuf[i] &= ~PE_ACTIVE;
+ }
+ }
+- if (active)
++ if (active && start_pos < end_pos)
+ redrawLineRegion(buf, l, l->linenumber - tline + buf->rootY,
+- an->start.pos, an->end.pos);
++ start_pos, end_pos);
+ }
+ else if (prevhseq >= 0 && an->hseq == prevhseq) {
+ if (active)
+@@ -855,14 +863,16 @@ redrawLineImage(Buffer *buf, Line *l, int i)
+ y = (int)(i * pixel_per_line);
+ sx = (int)((rcol - COLPOS(l, a->start.pos)) * pixel_per_char);
+ sy = (int)((l->linenumber - image->y) * pixel_per_line);
+- if (sx == 0 && x + image->xoffset >= 0)
+- x += image->xoffset;
+- else
+- sx -= image->xoffset;
+- if (sy == 0 && y + image->yoffset >= 0)
+- y += image->yoffset;
+- else
+- sy -= image->yoffset;
++ if (! enable_inline_image) {
++ if (sx == 0 && x + image->xoffset >= 0)
++ x += image->xoffset;
++ else
++ sx -= image->xoffset;
++ if (sy == 0 && y + image->yoffset >= 0)
++ y += image->yoffset;
++ else
++ sy -= image->yoffset;
++ }
+ if (image->width > 0)
+ w = image->width - sx;
+ else
+diff --git a/doc-de/FAQ.html b/doc-de/FAQ.html
+new file mode 100644
+index 0000000..d88ba64
+--- /dev/null
++++ b/doc-de/FAQ.html
+@@ -0,0 +1,691 @@
++
++<html>
++ <head>
++ <style>
++ span.mono {
++ font-family:mono;
++ }
++ </style>
++ <meta http-equiv="content-type" content="text/html;charset=UTF-8">
++ <title>W3M FAQ</title>
++ </head>
++ <body>
++ <h1 align="center">
++ Häufig gestellte Fragen zu w3m
++ </h1>
++ <p align="right">
++ Akinori Ito <aito@fw.ipsj.or.jp> <br>korrigiert von Tom Berger <tom.be@gmx.net>
++ </p>
++ <h2 id="index">
++ <u>
++ Ãbersicht
++ </u>
++ </h2>
++ <ul>
++ <li>
++ <a href="#general">
++ <b>
++ Allgemeine Fragen; wie bekomme ich das Programm, welche Arbeitsumgebung wird benötigt?
++ </b>
++ </a>
++ </li>
++ <ul>
++ <li>
++ <b>
++ Wie wird <q>w3m</q> ausgesprochen?
++ </b>
++ </li>
++ <li>
++ <b>
++ Warum hat man es <q>w3m</q> genannt?
++ </b>
++ </li>
++ <li>
++ <b>
++ Auf welchen Plattformen läuft es?
++ </b>
++ </li>
++ <li>
++ <b>
++ Wo bekomme ich mehr Informationen über w3m?
++ </b>
++ </li>
++ <li>
++ <b>
++ Gibt es eine Mailingliste für w3m?
++ </b>
++ </li>
++ <li>
++ <b>
++ Gibt es das Programm fertig kompiliert?
++ </b>
++ </li>
++ </ul>
++ <li>
++ <a href="#install">
++ <b>
++ Kompilierung und Installation
++ </b>
++ </a>
++ </li>
++ <li>
++ <a href="#command">
++ <b>
++ Optionen, Befehle und Verwendung
++ </b>
++ </a>
++ </li>
++ <ul>
++ <li>
++ <b>
++ w3m beendet sich von selbst, wenn es ohne Argumente aufgerufen wurde. Was läuft hier falsch?
++ </b>
++ </li>
++ <li>
++ <b>
++ w3m startet mit schwarzen Zeichen vor schwarzem Hintergrund. Wie kann ich das ändern?
++ </b>
++ </li>
++ <li>
++ <b>
++ Kann w3m Dinge in Farbe darstellen?
++ </b>
++ </li>
++ <li>
++ <b>
++ Kann w3m mit monochromen Bildschirmen benutzt werden?
++ </b>
++ </li>
++ <li>
++ <b>
++ Wie kann ich den angezeigten Bereich verschieben?
++ </b>
++ </li>
++ <li>
++ <b>
++ Wie komme ich von einem zum anderen Hyperlink?
++ </b>
++ </li>
++ <li>
++ <b>
++ Grafische Browser stellen ein Wort rot dar, w3m hingegen nicht. Warum?
++ </b>
++ </li>
++ <li>
++ <b>
++ Wie ändere ich die für Hyperlinks, Bilder und Formularfelder benutzten Farben?
++ </b>
++ </li>
++ <li>
++ <b>
++ w3m scheint die Umgebungsvariable EDITOR zu ignorieren. Weshalb?
++ </b>
++ </li>
++ <li>
++ <b>
++ Wie breche ich eine Suche oder die Eingabe einer URL ab?
++ </b>
++ </li>
++ </ul>
++ <li>
++ <a href="#www">
++ <b>
++ Fragen zur Benutzung als Internetbrowser
++ </b>
++ </a>
++ </li>
++ <ul>
++ <li>
++ <b>
++ Wie fülle ich mit w3m Formulare aus?
++ </b>
++ </li>
++ <li>
++ <b>
++ w3m scheint langsamer als einige andere Browser zu sein. Warum?
++ </b>
++ </li>
++ <li>
++ <b>
++ Die Zeit zum Laden einer Seite wird nicht geringer, wenn diese Seite schon einmal angezeigt wurde.
++ </b>
++ </li>
++ <li>
++ <b>
++ Wie lade ich eine Datei herunter, auf die verlinkt wird?
++ </b>
++ </li>
++ <li>
++ <b>
++ Wie gebe ich einen Proxy-Server vor?
++ </b>
++ </li>
++<!-- deleted, see mail dated Mon, 04 Apr 2016 20:50:27 +0900 (JST)
++from Tatsuya Kinoshita <tats@debian.org>
++ <li>
++ <b>
++ w3m freezes when I invoke an external browser.
++ </b>
++ </li>
++-->
++ <li>
++ <b>
++ Wie wähle ich den standardmäÃig verwendeten Bildbetrachter aus?
++ </b>
++ </li>
++ <li>
++ <b>
++ Wie wird eine URL eingegeben?
++ </b>
++ </li>
++ <li>
++ <b>
++ w3m hängt eine URL an die vorherige an, obwohl die Zeile mit <span class="mono">STRG-u</span> gelöscht worden war. Was ist zu tun?
++ </b>
++ </li>
++ </ul>
++ <li>
++ <a href="#other">
++ <b>
++ Verschiedenes
++ </b>
++ </a>
++ </li>
++ <ul>
++ <li>
++ <b>
++ Ich suche die Konfigurationsdatei von w3m.
++ </b>
++ </li>
++ <li>
++ <b>
++ Wofür sind die w3mxxxx Dateien in meinem ~/.w3m Verzeichnis gut?
++ </b>
++ </li>
++ </ul>
++ </ul>
++ <h2 id="general">
++ <u>
++ Allgemeine Fragen; wie bekomme ich das Programm, welche Arbeitsumgebung wird benötigt?
++ </u>
++ </h2>
++ <dl>
++ <dt>
++ <b>
++ Wie wird <q>w3m</q> ausgesprochen?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Der Name wird englisch ausgesprochen <q>W-three-M</q> und reimt sich nicht auf <q>pteranodon</q>.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Warum hat man es <q>w3m</q> genannt?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Darin steckt der japanische Satz <q>WWW-wo-Miru</q>, was <q>Sichte das weltweite Netz</q> bedeutet. Dieser Browser könnte also auf deutsch <q>Sdw2N</q> heiÃen.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Auf welchen Plattformen läuft es?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Das Programm läuft auf verschiedenen Unices, seit der Version 990226 auf OS/2 und seit Version 990303 auch auf Microsoft-Windows mit Cygwin32.
++ </p>
++ <p>
++ Es wurde bestätigt, dass neuere Versionen laufen auf:
++ </p>
++ <ul>
++ <li>
++ SunOS 4.1.x
++ </li>
++ <li>
++ HP-UX 9.x, 10.x
++ </li>
++ <li>
++ Solaris 2.5.x, 2.6, 8
++ </li>
++ <li>
++ Linux 2.0.1 bis 3.17
++ </li>
++ <li>
++ FreeBSD 2.2.8, 3.1, 3.2, 4.6
++ </li>
++ <li>
++ NetBSD/macppc, m68k
++ </li>
++ <li>
++ EWS4800 Rel.12.2 Rev.A
++ </li>
++ <li>
++ Digital UNIX: v3.2D, v4.0D
++ </li>
++ <li>
++ IRIX 5.3, IRIX 6.5
++ </li>
++ <li>
++ OS/2 mit emx
++ </li>
++ <li>
++ Windows 9x/NT mit Cygwin32 b20.1
++ </li>
++ <li>
++ MS-DOS mit DJGPP und WATT32 Pakettreiber
++ </li>
++ <li>
++ MacOS X Server
++ </li>
++ <li>
++ MacOS X 10.1, 10.2
++ </li>
++ </ul>
++ </dd>
++ <dt>
++ <b>
++ Wo bekomme ich mehr Informationen über w3m?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Auf der englischen <a href="http://w3m.sourceforge.net/index.en.html">Homepage</a> des w3m-Projekts.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Gibt es eine Mailingliste für w3m?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Es gibt eine Mailingliste für Entwickler (w3m-dev-en). Einzelheiten dazu finden Sie auf der <a href="http://w3m.sourceforge.net/index.en.html">Homepage</a> des w3m-Projekts. Sie können Ihre Anmerkungen auch dem <a href="mailto:aito@fw.ipsj.or.jp">Autor</a> schicken.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Gibt es das Programm fertig kompiliert?
++ </b>
++ </dt>
++ <dd>
++ <!--
++ You can get them from
++ <a href="http://prdownloads.sourceforge.net/w3m/">here</a>.
++!--><p>
++ Bis jetzt wurde das Programm nur für Windows /Cygnus32 kompiliert. Sollten Sie dies für andere Plattformen durchgeführt haben und möchten Ihre Binärversion der Allgemeinheit zur Verfügung stellen, kontaktieren Sie den <a href="mailto:aito@fw.ipsj.or.jp">Autor</a>.
++ </p>
++ </dd>
++ </dl>
++ <p align="right">
++ <i>
++ Zurück zur <a href="#index">Ãbersicht</a>
++ </i>
++ </p>
++ <h2 id="install">
++ <u>
++ Kompilierung und Installation
++ </u>
++ </h2>
++ <p>
++ Kein Problem :-)
++ </p>
++ <h2 id="command">
++ <u>
++ Optionen, Befehle und Verwendung
++ </u>
++ </h2>
++ <dl>
++ <dt>
++ <b>
++ w3m beendet sich von selbst, wenn es ohne Argumente aufgerufen wurde. Was läuft hier falsch?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ w3m ist ein <b>Textbetrachter</b>. Deshalb schlieÃt sich das Programm von selbst, wenn es ohne ein Argument aufgerufen wird. Es läuft weiter
++ </p>
++ <ul>
++ <li>
++ mit einem Dateinamen oder einer Adresse als Argument
++ </li>
++ <li>
++ mit aus der Standardeingabe eingehenden Daten
++ </li>
++ <li>
++ nach Aufruf mit der Option -B, woraufhin die Lesezeichendatei gezeigt wird
++ </li>
++ <li>
++ nach Aufruf mit der Option -v, woraufhin eine BegrüÃungsseite angezeigt wird
++ </li>
++ <li>
++ wenn die Variablen HTTP_HOME oder WWW_HOME spezifiziert wurden
++ </li>
++ </ul>
++ </dd>
++ <dt>
++ <b>
++ w3m startet mit schwarzen Zeichen vor schwarzem Hintergrund. Wie kann ich das ändern?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Wenn w3m für den Farbmodus kompiliert wurde, geht das Programm von weiÃem Hintergrund aus und zeigt die Buchstaben in schwarz.
++ </p>
++ <p>
++ Sie können entweder die Hintergrundfarbe Ihres Terminals ändern (bei xterm z.B. mit der Option -bg) oder so vorgehen
++ </p>
++ <ol>
++ <li>
++ Mit <span class="mono">w3m -M</span> den Monochrom-Modus von w3m starten
++ </li>
++ <li>
++ <q>o</q> eintippen, was Sie in den Einstellungs-Dialog bringt
++ </li>
++ <li>
++ <q>YES</q> neben <q>in Farbe anzeigen</q> markieren und irgendeine Farbe auswählen.
++ </li>
++ <li>
++ auf [OK] klicken
++ </li>
++ </ol>
++ </dd>
++ <dt>
++ <b>
++ Kann w3m Dinge in Farbe darstellen?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Ja. Wenn Sie <q>./configure</q> durchführen, werden Ihnen folgende Möglichkeiten angeboten:
++ </p>
++<pre>
++ Let's do some configurations. Choose config option among the list. <br> 1 - Baby model (no color, no menu, no mouse, no cookie, no SSL) <br> 2 - Little model (color, menu, no mouse, no cookie, no SSL) <br> 3 - Mouse model (color, menu, mouse, no cookie, no SSL) <br> 4 - Cookie model (color, menu, mouse, cookie, no SSL)<br> 5 - Monster model (with everything; you need openSSL library) <br> 6 - Customize Which?
++</pre>
++ <p>
++ Sie entscheiden sich für 2, 3, 4, oder 5.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Kann w3m mit monochromen Bildschirmen benutzt werden?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Ja, Sie können entweder
++ </p>
++ <ul>
++ <li>
++ obige Frage bei <q>./configure</q> mit 1 beantworten, oder
++ </li>
++ <li>
++ w3m mit der Option -M starten, oder
++ </li>
++ <li>
++ innerhalb von w3m die Taste <q>o</q> betätigen, was den Einstellungs-Dialog öffnet, in dem Sie <q>in Farbe anzeigen</q> abschalten können.
++ </li>
++ </ul>
++ </dd>
++ <dt>
++ <b>
++ Wie kann ich den angezeigten Bereich verschieben?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Indem Sie den Cursor an den Rand des Bildschirmes bewegen. AuÃerdem können Sie die folgenden Kommmandos nutzen
++ </p>
++ <ul>
++ <li>SHIFT_LEFT und SHIFT_RIGHT, denen die Tasten <span class="mono">></span> und <span class="mono"><</span> zugeordnet sind</li>
++ <li>SHIFT_LEFT1 und SHIFT_RIGHT1, denen die Tasten <span class="mono">.</span> und <span class="mono">,</span> zugeordnet sind</li>
++ </ul>
++ <p>
++ Ein weiterer Weg wäre, mit der Option -geometry des Terminalprogramms den zur Anzeige verfügbaren Platz anzupassen, beispielsweise mit einer Eingabe der Art
++ </p>
++ <pre> xterm -geometry 110x45 -bg white -name w3m -e w3m -B</pre>
++ </dd>
++ <dt>
++ <b>
++ Wie komme ich von einem zum anderen Hyperlink?
++ </b>
++ </dt>
++ <dd>
++ <p>
++
++ Sie erreichen den nächsten Hyperlink mit der TAB-Taste. Zum vorhergehenden springt der Cursor, wenn die ESC-Taste vor der TAB-Taste gedrückt wurde. (Mehr zu <a href="MANUAL.html#Functions" target="_blank"> Funktionen und Tastaturbelegung</a> im Handbuch von w3m)
++
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Grafische Browser stellen ein Wort rot dar, w3m hingegen nicht. Warum?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ w3m ignoriert das Attribut COLOR="..." in HTML. Dessen Berücksichtigung zu implementieren, wäre möglich, aber ich denke, die Dokumente wären am Ende schwerer lesbar.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Wie ändere ich die für Hyperlinks, Bilder und Formularfelder benutzten Farben?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Tippen Sie in w3m <q>o</q> ein und gelangen damit in den Einstellungs-Dialog. Dort können Sie die Farben ändern.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ w3m scheint die Umgebungsvariable EDITOR zu ignorieren. Weshalb?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Tippen Sie in w3m <q>o</q> ein und gelangen damit in den Einstellungs-Dialog. Jeglicher Eintrag im Feld <q>Editor</q> hat Vorrang gegenüber der Umgebungsvariablen.
++ </p>
++ <p>
++ Wenn Sie also das durch EDITOR angegebene Textbearbeitungsprogramm verwenden möchten, löschen Sie den Eintrag und drücken [OK].
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Wie breche ich eine Suche oder die Eingabe einer URL ab?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Löschen Sie den eingegebenen Text mit <span class="mono">STRG-u</span> und drücken Sie die Eingabetaste.
++ </p>
++ </dd>
++ </dl>
++ <p align="right">
++ <i>
++ Zurück zur <a href="#index">Ãbersicht</a>
++ </i>
++ </p>
++ <h2 id="www">
++ <u>
++ Fragen zur Benutzung als Internetbrowser
++ </u>
++ </h2>
++ <dl>
++ <dt>
++ <b>
++ Wie fülle ich mit w3m Formulare aus?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Formular-Eingabefelder werden in rot (oder invertiert) angezeigt. Bewegen Sie den Cursor dorthin. Wenn es
++ </p>
++ <ul>
++ <li>
++ ein Texteingabefeld ist, drücken Sie die Eingabetaste, schreiben den Text unten in die Eingabezeile und drücken die Eingabetaste nochmals,
++ </li>
++ <li>
++ sich um einen Radiobutton oder eine Checkbox handelt, wird bei Drücken der Eingabetaste die Auswahl verändert oder neu getroffen
++ </li>
++ <li>
++ sich um einen Texteingabebereich handelt, wird durch Drücken der Eingabetaste ein Editor gestartet
++ </li>
++ <li>
++ sich um eine Schaltflächen für <q>Ãbermitteln</q> oder <q>Zurücksetzen</q> handelt, wird die entsprechende Aktion ausgeführt.
++ </li>
++ </ul>
++ </dd>
++ <dt>
++ <b>
++ w3m scheint langsamer als einige andere Browser zu sein. Warum?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ HTML-Dokumente werden in zwei Schritten verarbeitet. Erst nachdem ein Dokument vollständig vorliegt, baut w3m die Anzeige auf.
++ </p>
++ <p>
++ Da die meisten anderen Browser die Seite aufbauen, ehe sie komplett ist, scheinen sie schneller.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Die Zeit zum Laden einer Seite wird nicht geringer, wenn diese Seite schon einmal angezeigt wurde.
++ </b>
++ </dt>
++ <dd>
++ <p>
++ w3m nutzt keinen eigenen Zwischenspeicher. Es liest daher Dokumente jedesmal neu vom Server ein. Wenn möglich, verwenden Sie einen Server für die Zwischenspeicherung.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Wie lade ich eine Datei herunter, auf die verlinkt wird?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Verwenden Sie <q>a</q> (oder <q>d</q> bei lynx-artiger Tastaturbelegung) oder <span class="mono">ESC RET</span>. Wenn Sie ein eingebundenes Bild herunterladen möchten, drücken Sie <span class="mono">ESC I</span>. (Mehr zu <a href="MANUAL.html#Functions" target="_blank"> Funktionen und Tastaturbelegung</a> im Handbuch von w3m)
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Wie gebe ich einen Proxy-Server vor?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Setzen Sie die Umgebungsvariablen HTTP_PROXY, HTTPS_PROXY, GOPHER_PROXY und FTP_PROXY oder öffnen mit <q>o</q> den Einstellungs-Dialog. Um beispielsweise den Port 8000 von proxy.example.org zu benutzen, geben Sie ein
++ </p>
++ <pre> http://proxy.example.org:8000/</pre>
++ </dd>
++<!-- deleted, see mail dated Mon, 04 Apr 2016 20:50:27 +0900 (JST)
++from Tatsuya Kinoshita <tats@debian.org>
++ <dt>
++ <b>
++ w3m freezes when I invoke an external browser.
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Enter w3m's option screen using the <q>o</q> key and specify
++ </p>
++ <pre> firefox %s &</pre>
++ <p>
++ (if you are using Firefox). Note that %s is replaced with the URL
++ when invoking.
++ </p>
++ </dd>
++ -->
++ <dt>
++ <b>
++ Wie wähle ich den standardmäÃig verwendeten Bildbetrachter aus?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ StandardmäÃig benutzt w3m den Bildbetrachter xv. Wenn Sie beispielsweise <q>display</q> vorziehen, ergänzen Sie ~/.w3m/mailcap oder /etc/mailcap um die Zeile:
++ </p>
++<pre>
++ image/*; display %s
++</pre>
++ <p>
++ Ebenso können Sie für andere Dateitypen externe Anzeigeprogramme festlegen:
++ </p>
++<pre>
++ image/*; display %s <br>application/postscript; ghostview %s <br>application/x-dvi; xdvi %s
++</pre>
++ </dd>
++ <dt>
++ <b>
++ Wie wird eine URL eingegeben?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Drücken Sie <span class="mono">U</span>
++ </p>
++ </dd>
++ <dt>
++ <b>
++ w3m hängt eine URL an die vorherige an, obwohl die Zeile mit <span class="mono">STRG-u</span> gelöscht worden war. Was ist zu tun?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Geben Sie die <i>komplette</i> Adresse ein, z.B. http://www.slashdot.org.
++ </p>
++ </dd>
++ </dl>
++ <p align="right">
++ <i>
++ Zurück zur <a href="#index">Ãbersicht</a>
++ </i>
++ </p>
++ <h2 id="other">
++ <u>
++ Verschiedenes
++ </u>
++ </h2>
++ <dl>
++ <dt>
++ <b>
++ Ich suche die Konfigurationsdatei von w3m.
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Es ist ~/.w3m/config.
++ </p>
++
++ <p>
++ In dieser Datei kann jeder Benutzer das Verhalten von w3m anpassen. Sie finden dort zeilenweise die Variablen zu den im Einstellungs-Dialog beschriebenen Optionen. Den Namen und die Belegung einer Variable trennt ein Leerzeichen.
++ </p>
++
++ <p>Ohne eine benutzerspezifische Konfigurationsdatei richtet sich w3m nach der systemweiten Konfigurationsdatei /etc/w3m/config.
++ </p>
++
++ </dd>
++ <dt>
++ <b>
++ Wofür sind die w3mxxxx Dateien in meinem ~/.w3m Verzeichnis gut?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Es handelt sich um temporäre Dateien, die w3m beim Lesen anlegt. Sie dienen nicht zur Zwischenspeicherung und werden beim Verlassen des Programms normalerweise gelöscht. Wenn welche zurückbleiben, löschen Sie sie einfach selbst.
++ </p>
++ </dd>
++ </dl>
++ <p align="right">
++ <i>
++ Zurück zur <a href="#index">Ãbersicht</a>
++ </i>
++ </p>
++ </body>
++</html>
+diff --git a/doc-de/MANUAL.html b/doc-de/MANUAL.html
+new file mode 100644
+index 0000000..f922314
+--- /dev/null
++++ b/doc-de/MANUAL.html
+@@ -0,0 +1,2340 @@
++
++<html>
++ <head>
++ <title>w3m Handbuch</title>
++ <style>
++ span.mono {
++ font-family:mono;
++ }
++ </style>
++ <meta http-equiv="content-type" content="text/html;charset=UTF-8">
++ </head>
++ <body>
++ <!--
++insertions tagged with "mh 2016-03-29" and "mh 2016-06-11" come from the latest version of manual page w3m (1)
++ -->
++
++ <h1>w3m HANDBUCH</h1>
++ <div align="right">
++ Akinori Ito<br> aito@fw.ipsj.or.jp
++ </div>
++ <h2>Ãbersicht</h2>
++ <ul>
++ <li>
++ <a href="#Einführung">
++ Einführung
++ </a>
++ </li>
++ <li>
++ <a href="#Einstellungen">
++ Einstellungen
++ </a>
++ </li>
++ <li>
++ <a href="#Color">
++ Farbzuordnung im Dokument
++ </a>
++ </li>
++ <li>
++ <a href="#Functions">
++ Funktionen und Tastaturbelegung
++ </a>
++ </li>
++<!-- mh 2016-06-13 obsolete
++ <li>
++ <a href="#Key:lynx">
++ Lynx-like key bindings
++ </a>
++ </li>
++-->
++ <li>
++ <a href="#Mouse">
++ Bedienung per Maus
++ </a>
++ </li>
++<!-- mh 2016-06-13 obsolete
++ <li>
++ <a href="#Key:custom">
++ Key customization
++ </a>
++ </li>
++ -->
++ <li>
++ <a href="#LocalCGI">
++ Lokale CGI-Skripte
++ </a>
++ </li>
++ </ul>
++ <hr>
++ <h2 id="Einführung">
++ Einführung
++ </h2>
++ <p>
++ w3m ist ein textorientierter Browser und Textbetrachter (Pager). In einem Terminalemulator können Sie damit lokale und andere Dokumente anzeigen lassen und Verknüpfungen (Hyperlinks) weiterverfolgen.
++ </p>
++ <hr>
++ <h2 id="Einstellungen">
++ Einstellungen
++ </h2>
++ <p>
++ Der Aufruf per Befehlszeile lautet
++ </p>
++<!-- mh 2016-08-06 invocation adapted to w3m(1). w3m accepts several options and several targets -->
++<pre>
++ w3m [Option]⦠[Datei|Adresse]â¦
++</pre>
++ <p>
++ Wenn Sie Dateinamen oder Adressen in der Befehlszeile angeben, werden diese Dokumente angezeigt. Fehlen entsprechende Argumente, wird w3m ein Dokument aus der Standardeingabe erwarten und anzeigen. Erhält das Programm auch hier keine Daten, beendet es sich normalerweise selbstständig.
++ </p>
++ <p>
++ Optionen sind unter anderem:
++ </p>
++ <dl>
++<h3>Allgemeine Optionen</h3>
++ <dt>
++ -B
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ starte mit einer Ansicht aller Lesezeichen (wenn kein anderes Zielobjekt angegeben ist)
++ </p>
++ </dd>
++ <dt>
++ -M
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ monochrome Anzeige
++ </p>
++ </dd>
++ <dt>
++ -no-mouse
++ </dt>
++ <dd>
++ <p>
++ Mausfunktion aus
++ </p>
++ </dd>
++ <dt>
++ -num
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ zeige Zeilennummern an
++
++ </p>
++ </dd>
++<!-- mh 2016-08-06 commented out. As implementation is not verified.
++ <dt>
++ -ppc <i>num</i>
++ </dt>
++ <dd>
++ <p>
++ width of <i>num</i> pixels per character. Range of 4.0 to 32.0,
++ default 8.0. Larger values will make tables
++ narrower. (Implementation not verified)
++ </p>
++ </dd>
++-->
++ <dt>
++ -v
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ begrüÃe den Benutzer mit einer eingebauten Seite (wenn kein anderes Zielobjekt angegeben ist)
++ </p>
++ </dd>
++ <dt>
++ -W
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ wechsle zwischen umlaufendem und nicht umlaufendem Suchen
++ </p>
++ </dd>
++ <dt>
++ -X
++ </dt>
++ <dd>
++ <p>
++ nach Beenden des Programms das Terminal nicht neu initialisieren.
++ </p>
++ </dd>
++ <dt>
++ +<i>Zahl</i>
++ </dt>
++ <dd>
++ <!--mh 2016-06-11 --><p>
++ gehe zu Zeile <i>Zahl</i>. Wirkt nur, wenn <i>Zahl</i> gröÃer ist als die im Terminal verfügbare Zeilenzahl
++ </p>
++ </dd>
++<h3>Browser-Optionen</h3>
++ <dt>
++ -cols <i>Zahl</i>
++ </dt>
++ <dd>
++ <!-- mh 2016-06-11 --><p>
++
++ bei für die Standardausgabe bestimmten Inhalten, nimm bei zur Umsetzung von HTML eine Länge von <i>num</i> Zeichen pro Zeile
++ </p>
++ </dd>
++ <dt>
++ -cookie
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ verwende gespeicherte Cookies und akzeptiere neue
++ </p>
++ </dd>
++ <dt>
++ -no-cookie
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ verwende weder gespeicherte Cookies noch akzeptiere neue
++
++ </p>
++ </dd>
++ <dt>
++ -F
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ verarbeite Frames
++ </p>
++ </dd>
++ <dt>
++ -no-graph
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ verwende bei der Umsetzung von Tabellen und Frames keine grafischen Zeichen
++ </p>
++ </dd>
++ <dt>
++ -header <i>Zeichenkette</i>
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ füge der HTTP(S)-Anfrage <i>Zeichenkette</i> an. Diese muss der Kopfdaten-Syntax <span class="mono">"Variable: Wert"</span> entsprechen
++ </p>
++ </dd>
++ <dt>
++ -m
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29
++Render the body of Usenet messages according to the header <q>Content-type</q>
++--><p>
++ arbeite im <q>Internetnachrichten-Modus</q>. Mit dieser Option entnimmt w3m den Typ eines Dokumentes dessen Kopfdaten. Dies ist nützlich beim Lesen von Mails und Usenet-Nachrichten.
++
++ </p>
++ </dd>
++ <dt>
++ -no-proxy
++ </dt>
++ <dd>
++ <!-- mh 2016-06-11--><p>
++
++ verwende keinen Proxy
++ </p>
++ </dd>
++ <dt>
++ -post <i>Datei</i>
++ </dt>
++ <dd>
++ <!--funktionierend 2016-06-28T08:22>--><p>
++ verwende die Methode POST, um in <i>Datei</i> hinterlegte Daten hochzuladen. Hierbei wird die Syntax <span class="mono">"var1=wert1[&var2=wert2]…"</span> erwartet
++ </p>
++ </dd>
++<h3>Textbetrachter-Optionen</h3>
++ <dt>
++ -l <i>Zahl</i>
++ </dt>
++ <dd>
++ <!-- mh2016-06-11--><p>
++
++ Anzahl der Zeilen, die zwischengespeichert werden, wenn Text per Standardeingabe übergeben wurde. (Voreinstellung ist 10000)
++ </p>
++ </dd>
++ <dt>
++ -r
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29 --><p>
++
++ verarbeite spezielle Escape-Zeichen (beispielsweise ANSI-Escape-Zeichen oder nroff-Rückwärtsschritte für fette und unterstrichene Zeichen) nicht, sondern zeige sie stattdessen mittels Caret-Notation.
++ </p>
++ </dd>
++ <dt>
++ -s
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ mehrere leere Zeilen werden bis auf eine gelöscht
++ </p>
++ </dd>
++
++ <!--mh 2016-03-29 --><dt>
++ -t <i>Zahl</i>
++ </dt>
++ <dd>
++ <!--mh 2016-03-29--><p>
++ Tab-Zeichen so verwerten, dass Spalten mit einer Weite von <i>Zahl</i> Zeichen entstehen. Wirkt nicht auf Standardausgabe
++ </p>
++ </dd>
++<h3>Datenart- und Datenkodierungs-Optionen</h3>
++ <dt>
++ -I <i>Zeichenkodierung</i>
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ zu benutzende Zeichenkodierung für erhaltene Daten
++ </p>
++ </dd>
++ <dt>
++ -O <i>Zeichenkodierung</i>
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29 --><p>
++
++ zu benutzende Zeichenkodierung für auszugebende Daten
++ </p>
++ </dd>
++ <dt>
++ -T <i>Typ</i>
++ </dt>
++ <dd>
++ <!-- mh 2016-06-11--><p>
++
++ legt den MIME-Typ erhaltener Daten fest. Ohne diese Option bestimmt ihn das Programm anhand der Dateinamen-Erweiterung. Wenn dies fehlschlägt, wird text/plain als Typ angenommen. Zum Beispiel:
++ </p>
++ <p>
++ Ãbernimm HTML-Dokument von der Standardeingabe und zeige es an
++ </p>
++<pre>
++ cat beispiel.html | w3m -T text/html
++</pre>
++ <p>
++ Zeige HTML-Quelltext an
++ </p>
++<pre>
++ w3m -T text/plain beispiel.html
++</pre>
++ </dd>
++<h3>Optionen zur Datenausgabe, mit sofortigem Verlassen des Programms</h3>
++ <dt>
++ -dump
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29 --><p>
++ lies das per URL angegebene Dokument und leite es verarbeitet der Standardausgabe zu. Wenn mit der Option -cols nichts anderes eingestellt ist, erhält es eine Breite von 80 Zeichen
++ </p>
++ </dd>
++ <dt>
++ -dump_source
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ leite den Seitenquelltext der Standardausgabe zu
++ </p>
++ </dd>
++ <dt>
++ -dump_head
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ leite die Antwort einer HEAD-Anfrage für eine URL der Standardausgabe zu
++ </p>
++ </dd>
++ <dt>
++ -dump_both
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ leite Antwort auf HEAD-Anfrage und Seitenquelltext der Standardausgabe zu
++
++ </p>
++ </dd>
++ <dt>
++ -dump_extra
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ leite Antwort auf HEAD-Anfrage, Seitenquelltext und Extrainformation der Standardausgabe zu
++ </p>
++ </dd>
++
++<h3>Optionen, die Standards für Einstellungen und Datenquellen auÃer Kraft setzen</h3>
++
++ <dt>
++ -bookmark <i>Datei</i>
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ benutze anstelle der Standarddatei bookmark.html für Lesezeichen die Datei <i>Datei</i>
++ </p>
++ </dd>
++ <dt>
++ -config <i>Datei</i>
++ </dt>
++ <dd>
++ <!--mh 2016-06-11--><p>
++
++ benutze <i>Datei</i> anstelle der Standard-Konfigurationsdatei
++ </p>
++ </dd>
++ <dt>
++ -o <i>Option</i>=<i>Wert</i>
++ </dt>
++ <dd>
++ <!-- mh 2016-03-29--><p>
++
++ arbeite mit einer Konfiguration, bei der die Einstellung <i>Option</i> mit <i>Wert</i> belegt ist. Ohne <i>Option=Wert</i> gleichwertig mit <i>-show-option</i>
++ </p>
++ </dd>
++ </dl>
++ <hr>
++ <h2 id="Color">
++ Farbzuordnung im Dokument
++ </h2>
++ <p>
++ Links und Bildelemente werden wie folgt angezeigt:
++ </p>
++ <div align="center"> <table border="1"> <tr>
++ <th>
++ </th>
++ <th>
++ Farbmodus
++ </th>
++ <th>
++ Monochrom-Modus
++ </th>
++ </tr>
++ <tr>
++ <td>
++ Hyperlinks
++ </td>
++ <td>
++ blau
++ </td>
++ <td>
++ unterstrichen
++ </td>
++ </tr>
++ <tr>
++ <td>
++ Bilder
++ </td>
++ <td>
++ grün
++ </td>
++ <td>
++ invertiert
++ </td>
++ </tr>
++ <tr>
++ <td>
++ Formular-Eingabefelder
++ </td>
++ <td>
++ rot
++ </td>
++ <td>
++ invertiert
++ </td>
++ </tr>
++ </table>
++ </div>
++ <p>
++ Diese Farben können nach Eingabe von <q>o</q> im Einstellungs-Dialog anders zugeordnet werden.
++ </p>
++ <hr>
++ <h2 id="Functions">
++ Funktionen und Tastaturbelegung
++ </h2>
++
++ <!-- mh 2016-06-13 obsolete
++ If you prefer using Lynx-like
++ key bindings, make w3m start with the respective keymap file keymap.lynx. (see w3m (1)).--><p>
++ Wenn w3m läuft, bedienen Sie das Programm, indem Sie Funktionen anhand ihres Namens oder der ihr zugeordneten Tastenkombination aufrufen. Es gibt voreingestellte Tastaturbelegungen.
++
++ </p>
++<!--
++ <h2 id="Key:custom">
++ Key customization
++ </h2>
++-->
++ <p>
++ Sie können die Tastaturbelegungen (abgesehen von jenen des Menü- und des Texteingabe-Modus) in einer Datei ~/.w3m/keymap anpassen. Beispielsweise bindet
++ </p>
++
++<pre>
++ keymap C-o NEXT_PAGE
++</pre>
++
++ <p>
++ die Funktion <span class="mono">NEXT_PAGE</span> (die normalerweise mit SPC und C-v verknüpft ist) mit C-o. Siehe die Liste verfügbarer Funktionen in <a href="README.func">README.func</a>. Original- und Lynx-artige Tastaturbelegungen enthalten die Beispieldateien <a href="keymap.default">keymap.default</a> und <a href="keymap.lynx">keymap.lynx</a>.
++ </p>
++
++ <p>
++ Im Folgenden stehen <i>C-</i> und <i>M-</i> für die Eingabe-Modifikationen mit der <i>Steuerungs-</i> und der <i>Meta-Taste</i>. Die letztere ersetzt die <i>ALT-Taste</i>, wohingegen Drücken der <i>ESC</i>-Taste zwischen <i>Meta</i>-modifiziertem und einfachen Tastendruck wechselt. Das Minus-Zeichen bedeutet das gleichzeitige Drücken von Tasten; der Leerraum dagegen steht dafür, dass eine Taste nach der anderen gedrückt wird. Mit <i>2 M</i> ist also gemeint, die <i>2</i> und dann <i>M</i> zu drücken.
++ </p>
++
++
++ <table border="1" width="100%">
++ <colgroup>
++ <col width="20%">
++ <col width="20%">
++ <col width="20%">
++ <col width="40%">
++ </colgroup>
++ <tr>
++ <th rowspan="2">
++ Funktion
++ </th>
++ <th colspan="2">Tastenkombination
++ </th>
++ <th rowspan="2">
++ Beschreibung
++ </th>
++ </tr>
++ <tr>
++ <th>
++ Standard
++ </th>
++ <th>
++ Lynx-ähnlich
++ </th>
++ </tr>
++ <tr>
++ <td colspan="4">
++ <h3>Navigation innerhalb von Seiten</h3>
++</td>
++ </tr>
++ <tr>
++ <td>
++ NEXT_PAGE
++ </td>
++ <td>
++ SPC, C-v, +, PGDN
++ </td>
++ <td>
++ SPC, C-v, +
++ </td>
++ <td>
++ Scrolle eine Seite abwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PREVIOUS_PAGE
++ </td>
++ <td>
++ b, M-v, -, PGUP
++ </td>
++ <td>
++ b, M-v, -
++ </td>
++ <td>
++ Scrolle eine Seite aufwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++ MOVE_RIGHT
++ </td>
++ <td>
++ l, C-f, RIGHT
++ </td>
++ <td>
++ l
++ </td>
++ <td>
++ Bewege Cursor nach rechts (mit Verschiebung um halbe Bildschirmbreite an dessen Rand)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ C-b, LEFT
++ </td>
++ <td>
++ h, C-b, LEFT
++ </td>
++ <td>
++ h
++ </td>
++ <td>
++ Bewege Cursor nach links (mit Verschiebung um halbe Bildschirmbreite an dessen Rand)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ MOVE_DOWN
++ </td>
++ <td>
++ j, C-n, DOWN
++ </td>
++ <td>
++ j
++ </td>
++ <td>
++ Bewege Cursor abwärts (scrolle eine Zeile am Bildschirmrand)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ MOVE_UP
++ </td>
++ <td>
++ k, C-p, UP
++ </td>
++ <td>
++ k
++ </td>
++ <td>
++ Bewege Cursor aufwärts (scrolle eine Zeile am Bildschirmrand)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ UP
++ </td>
++ <td>
++ J
++ </td>
++ <td>
++ J
++ </td>
++ <td>
++ Scrolle den Anzeigebereich eine Zeile aufwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++ DOWN
++ </td>
++ <td>
++ K
++ </td>
++ <td>
++ K
++ </td>
++ <td>
++ Scrolle den Anzeigebereich eine Zeile abwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++ LINE_BEGIN
++ </td>
++ <td>
++ ^, C-a
++ </td>
++ <td>
++ ^
++ </td>
++ <td>
++ Gehe zum Zeilenanfang
++ </td>
++ </tr>
++ <tr>
++ <td>
++ LINE_END
++ </td>
++ <td>
++ $, C-e
++ </td>
++ <td>
++ $
++ </td>
++ <td>
++ Gehe zum Zeilenende
++ </td>
++ </tr>
++ <tr>
++ <td>
++ NEXT_WORD
++ </td>
++ <td>
++ w
++ </td>
++ <td>
++ w
++ </td>
++ <td>
++ Gehe zum nächsten Wort
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PREVIOUS_WORD
++ </td>
++ <td>
++ W
++ </td>
++ <td>
++ W
++ </td>
++ <td>
++ Gehe zum vorherigen Wort
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SHIFT_RIGHT
++ </td>
++ <td>
++ >
++ </td>
++ <td>
++ >
++ </td>
++ <td>
++ Anzeigebereich nach rechts versetzen
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SHIFT_LEFT
++ </td>
++ <td>
++ <
++ </td>
++ <td>
++ <
++ </td>
++ <td>
++ Anzeigebereich nach links versetzen
++ </td>
++ </tr>
++ <tr>
++ <td>
++ RIGHT
++ </td>
++ <td>
++ .
++ </td>
++ <td>
++ .
++ </td>
++ <td>
++ Anzeigebereich um eine Spalte nach rechts verschieben
++ </td>
++ </tr>
++ <tr>
++ <td>
++ LEFT
++ </td>
++ <td>
++ ,
++ </td>
++ <td>
++ ,
++ </td>
++ <td>
++ Anzeigebereich um eine Spalte nach links verschieben
++ </td>
++ </tr>
++ <tr>
++ <td>
++ BEGIN
++ </td>
++ <td>
++ g, M-<, HOME
++ </td>
++ <td>
++ C-a, M-<
++ </td>
++ <td>
++ Gehe zur ersten Zeile
++ </td>
++ </tr>
++ <tr>
++ <td>
++ END
++ </td>
++ <td>
++ G, M->, END
++ </td>
++ <td>
++ C-e, M->
++ </td>
++ <td>
++ Gehe zur letzten Zeile
++ </td>
++ </tr>
++ <tr>
++ <td>
++ GOTO_LINE
++ </td>
++ <td>
++ M-g
++ </td>
++ <td>
++ G
++ </td>
++ <td>
++ Gehe zur angegebenen Zeile
++ </td>
++ </tr>
++ <tr>
++ <td>
++ LINE_INFO
++ </td>
++ <td>
++ C-g
++ </td>
++ <td>
++ C-g
++ </td>
++ <td>
++ Zeige aktuelle Position im Dokument an
++ </td>
++ </tr>
++ <tr>
++ <td>
++ CENTER_H
++ </td>
++ <td>
++ Z
++ </td>
++<!--Correction by mh 2014-04-06
++Description for keybinding of z and Z had been mingled
++-->
++ <td>
++ Z
++ </td>
++ <td>
++ Bildschirm rechts und links des Cursors zentrieren
++ </td>
++ </tr>
++ <tr>
++ <td>
++ CENTER_V
++ </td>
++ <td>
++ z
++ </td>
++ <td>
++ z
++ </td>
++ <td>
++ Bildschirm ober- und unterhalb des Cursors zentrieren
++ </td>
++ </tr>
++ <tr>
++ <td>
++ NEXT_LINK
++ </td>
++ <td>
++ TAB
++ </td>
++ <td>
++ TAB, C-n, DOWN
++ </td>
++ <td>
++ Gehe zum nächsten Hyperlink
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PREVIOUS_LINK
++ </td>
++ <td>
++ M-TAB, C-u
++ </td>
++ <td>
++ M-TAB, C-u, C-p, UP
++ </td>
++ <td>
++ Gehe zum vorangegangen Hyperlink
++ </td>
++<!-- Annotion mh 2016-04-06
++Keybinding description for C-g had been moved as it did not fit to "Hyperlink operation" and position in the default and lynx-like series differed
++ -->
++ </tr>
++ <tr>
++ <td>
++ LINK_BEGIN
++ </td>
++ <td>
++ [
++ </td>
++ <td>
++ [
++ </td>
++ <td>
++ Gehe zum ersten Hyperlink
++ </td>
++ </tr>
++ <tr>
++ <td>
++ LINK_END
++ </td>
++ <td>
++ ]
++ </td>
++ <td>
++ ]
++ </td>
++ <td>
++ Gehe zum letzten Hyperlink
++ </td>
++ </tr>
++<tr>
++<td>MOVE_LIST_MENU</td>
++<td>M-m</td>
++<td>M-m</td>
++<td>Ãffne Menü mit vorhandenen Hyperlinks</td>
++</tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Umgang mit Hyperlinks</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ GOTO_LINK
++ </td>
++ <td>
++ C-j, C-m, RET
++ </td>
++ <td width="100">
++ C-f, C-j, C-m, RET, RIGHT
++ </td>
++ <td>
++ Folge dem aktuellen Hyperlink in neuem Puffer
++ </td>
++ </tr>
++<tr>
++<td>LIST_MENU</td>
++<td>M-l</td>
++<td>M-l</td>
++<td>Ãffne Menü mit Hyperlinks und folge dem ausgewählten</td>
++</tr>
++ <tr>
++ <td>
++ SAVE_LINK
++ </td>
++ <td>
++ a, M-RET
++ </td>
++ <td>
++ d, M-RET
++ </td>
++ <td>
++ Speichere Ziel des Hyperlinks
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PEEK_LINK
++ </td>
++ <td>
++ u
++ </td>
++ <td>
++ u
++ </td>
++ <td>
++ Zeige Zieladresse
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PEEK_IMG
++ </td>
++ <td>
++ i
++ </td>
++ <td>
++ i
++ </td>
++ <td>
++ Zeige Adresse des Bildes
++ </td>
++ </tr>
++ <tr>
++ <td>
++ VIEW_IMAGE
++ </td>
++ <td>
++ I
++ </td>
++ <td>
++ I
++ </td>
++ <td>
++ Zeige Bild in Betrachter
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SAVE_IMAGE
++ </td>
++ <td>
++ M-I
++ </td>
++ <td>
++ M-I
++ </td>
++ <td>
++ Speichere Bild
++ </td>
++ </tr>
++<tr>
++<td>MARK_WORD</td>
++<td>;</td>
++<td>;</td>
++<td>Wandle aktuelles Wort in Hyperlink um</td>
++</tr>
++ <tr>
++ <td>
++ MARK_URL
++ </td>
++ <td>
++ :
++ </td>
++ <td>
++ :
++ </td>
++ <td>
++ Wandle URL-artige Zeichenketten um in Hyperlinks
++ </td>
++ </tr>
++ <tr>
++ <td>
++ MARK_MID
++ </td>
++ <td>
++ M-:
++ </td>
++ <td>
++ M-:
++ </td>
++ <!-- changed due to mail dated Mon, 04 Apr 2016 00:47:09 +0900 (JST)
++from Tatsuya Kinoshita --><td>
++
++ Wandle Nachrichten-ID-artige Zeichenketten um in Hyperlinks
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PEEK
++ </td>
++ <td>
++ c
++ </td>
++ <td>
++ c
++ </td>
++ <td>
++ Zeige aktuelle Adresse an
++ </td>
++ </tr>
++ <tr>
++ <td>
++ INFO
++ </td>
++ <td>
++ =
++ </td>
++ <td>
++ =
++ </td>
++ <td>
++ Zeige Informationen über dieses Dokument
++ </td>
++ </tr>
++ <tr>
++ <td>
++ HISTORY
++ </td>
++ <td>
++ C-h
++ </td>
++ <td>
++ C-h
++ </td>
++ <td>
++ Chronik aufgesuchter Dokumente
++ </td>
++ </tr>
++ <tr>
++ <td>
++ EXTERN
++ </td>
++ <td>
++ M
++ </td>
++ <td>
++ M
++ </td>
++ <td>
++ Zeige das aktuelle Dokument mit einem externen Browser (wird eine Taste von 2 bis 9 gedrückt, also beispielsweise 3 M, eingegeben, kommt ein anderer, in der Konfiguration hinterlegter Browser zum Einsatz)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ EXTERN_LINK
++ </td>
++ <td>
++ M-M
++ </td>
++ <td>
++ M-M
++ </td>
++ <td>
++ Bringe das Linkziel mit einem externen Browser zur Anzeige (vorangestellte Zahlen wirken sich wie oben beschrieben aus)
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Verwalten von Lesezeichen</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ BOOKMARK
++ </td>
++ <td>
++ M-b
++ </td>
++ <td>
++ v, M-b
++ </td>
++ <td>
++ Lesezeichen ansehen
++ </td>
++ </tr>
++ <tr>
++ <td>
++ ADD_BOOKMARK
++ </td>
++ <td>
++ M-a
++ </td>
++ <td>
++ a, M-a
++ </td>
++ <td>
++ Lege für aktuelle Seite Lesezeichen an
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Umgang mit Dateien und Datenströmen</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ GOTO
++ </td>
++ <td>
++ U
++ </td>
++ <td>
++ g, U
++ </td>
++ <td>
++ Ãffne angegebenes Dokument in neuem Puffer
++ </td>
++ </tr>
++<tr>
++<td>GOTO_RELATIVE</td>
++<td>M-u</td>
++<td>M-u</td>
++<td>Ãffne relative Adresse in neuem Puffer</td>
++</tr>
++ <tr>
++ <td>
++ LOAD
++ </td>
++ <td>
++ V
++ </td>
++ <td>
++ V
++ </td>
++ <td>
++ Ãffne lokale Datei in einem neuen Puffer
++ </td>
++ </tr>
++ <tr>
++ <td>
++ READ_SHELL
++ </td>
++ <td>
++ @
++ </td>
++ <td>
++ @
++ </td>
++ <!--Execute shell command and view output--><!--mh 2016-06-13 No difference to PIPE_SHELL could be discerned--><td>
++
++
++ Führe einen Shell-Befehl aus und zeige Ausgabe in einem neuen Puffer
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PIPE_SHELL
++ </td>
++ <td>
++ #
++ </td>
++ <td>
++ #
++ </td>
++ <!--Execute shell command and browse output--><!--mh 2016-06-13 No difference to READ_SHELL could be discerned--><td>
++
++
++ Führe einen Shell-Befehl aus und zeige Ausgabe in einem neuen Puffer
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Arbeit an Seiteninhalten</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <!-- is an alias to SOURCE --><td>
++ VIEW
++ </td>
++ <td>
++ v
++ </td>
++ <td>
++ \
++ </td>
++ <td>
++ Wechsle zwischen HTML-Quellcode und verarbeitetem Dokument
++ </td>
++ </tr>
++<tr>
++<td>LIST</td>
++<td>L</td>
++<td>L</td>
++<td>Liste Link-Elemente, Hyperlinks und Bilder auf</td>
++</tr>
++ <tr>
++ <td>
++ FRAME
++ </td>
++ <td>
++ F
++ </td>
++ <td>
++ F
++ </td>
++ <td>
++ Wechsle zwischen Kennung und Umsetzung von HTML-Frames
++ </td>
++ </tr>
++ <tr>
++ <td>
++ REDRAW
++ </td>
++ <td>
++ C-l
++ </td>
++ <td>
++ C-l, C-w
++ </td>
++ <td>
++ Bildschirmanzeige neu aufbauen
++ </td>
++ </tr>
++ <tr>
++ <td>
++ RELOAD
++ </td>
++ <td>
++ R
++ </td>
++ <td>
++ R, C-r
++ </td>
++ <td>
++ Aktuelles Dokument erneut laden
++ </td>
++ </tr>
++ <tr>
++ <td>
++ EDIT
++ </td>
++ <td>
++ E
++ </td>
++ <td>
++ E
++ </td>
++ <td>
++ Bearbeite lokales Quelldokument
++ </td>
++ </tr>
++ <tr>
++ <td>
++ EDIT_SCREEN
++ </td>
++ <td>
++ M-e
++ </td>
++ <td>
++ M-e
++ </td>
++ <td>
++ Bearbeite eine Kopie des verarbeiteten Dokuments
++ </td>
++ </tr>
++<tr>
++<td>PIPE_BUF</td>
++<td>|</td>
++<td>|</td>
++<td>Leite aktuellen Pufferinhalt einem Shell-Befehl zu und zeige Ausgabe an</td>
++</tr>
++ <tr>
++ <!-- is an alias to SAVE --><td>
++ DOWNLOAD
++ </td>
++ <td>
++ M-s
++ </td>
++ <td>
++ M-s
++ </td>
++ <td>
++ Dokument-Quellcode speichern
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SAVE_SCREEN
++ </td>
++ <td>
++ S
++ </td>
++ <td>
++ S, p
++ </td>
++ <td>
++ Speichere verarbeitetes Dokument
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Navigation zwischen Puffern und Reitern</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ BACK
++ </td>
++ <td>
++ B
++ </td>
++ <td>
++ B, C-b, LEFT
++ </td>
++ <td>
++ SchlieÃe aktuellen Puffer und kehre zu dem im Stapel darunterliegenden zurück
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SELECT_MENU
++ </td>
++ <td>
++ s
++ </td>
++ <td>
++ s, C-h
++ </td>
++ <td>
++ Ãffne Pufferstapel-Menü
++ </td>
++ </tr>
++ <tr>
++ <td>
++ TAB_MENU
++ </td>
++ <td>
++ M-t
++ </td>
++ <td>
++ M-t
++ </td>
++ <td>
++ Ãffne das Reiter-Auswahl-Menü
++ </td>
++ </tr>
++ <tr>
++ <td>
++ NEW_TAB
++ </td>
++ <td>
++ T
++ </td>
++ <td>
++ T
++ </td>
++ <td>
++ Ãffne neuen Reiter (mit aktuellem Dokument)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ TAB_LINK
++ </td>
++ <td>
++ C-t
++ </td>
++ <td>
++ C-t
++ </td>
++ <td>
++ Folge dem aktuellen Hyperlink in einem neuen Reiter
++ </td>
++ </tr>
++ <tr>
++ <td>
++ NEXT_TAB
++ </td>
++ <td>
++ }
++ </td>
++ <td>
++ }
++ </td>
++ <td>
++ Schalte zum nächsten Reiter
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PREV_TAB
++ </td>
++ <td>
++ {
++ </td>
++ <td>
++ {
++ </td>
++ <td>
++ Schalte zum vorherigen Reiter
++ </td>
++ </tr>
++ <tr>
++ <td>
++ CLOSE_TAB
++ </td>
++ <td>
++ C-q
++ </td>
++ <td>
++ C-q
++ </td>
++ <td>
++ SchlieÃe aktuellen Reiter
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Suchfunktionen</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ SEARCH
++ </td>
++ <td>
++ /
++ </td>
++ <td>
++ /, C-s
++ </td>
++ <td>
++ Suche vorwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SEARCH_BACK
++ </td>
++ <td>
++ ?
++ </td>
++ <td>
++ </td>
++ <td>
++ Suche rückwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++ ISEARCH
++ </td>
++ <td>
++ C-s
++ </td>
++ <td>
++ </td>
++ <td>
++ Inkrementelle Suche vorwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++ ISEARCH_BACK
++ </td>
++ <td>
++ C-r
++ </td>
++ <td>
++ </td>
++ <td>
++ Inkrementelle Suche rückwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SEARCH_NEXT
++ </td>
++ <td>
++ n
++ </td>
++ <td>
++ n
++ </td>
++ <td>
++ Setze Suche vorwärts fort
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SEARCH_PREV
++ </td>
++ <td>
++ N
++ </td>
++ <td>
++ </td>
++ <td>
++ Setze Suche rückwärts fort
++ </td>
++ </tr>
++ <tr>
++ <td>
++ WRAP_TOGGLE
++ </td>
++ <td>
++ C-w
++ </td>
++ <td>
++ w
++ </td>
++ <td>
++ Wechsle zwischen umlaufendem und nicht-umlaufendem Suchen
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Arbeit mit Textmarken</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ MARK
++ </td>
++ <td>
++ C-SPC
++ </td>
++ <td>
++ C-SPC
++ </td>
++ <td>
++ Setze/Lösche Markierung
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PREV_MARK
++ </td>
++ <td>
++ M-p
++ </td>
++ <td>
++ P
++ </td>
++ <td>
++ Gehe zur vorherigen Markierung
++ </td>
++ </tr>
++ <tr>
++ <td>
++ NEXT_MARK
++ </td>
++ <td>
++ M-n
++ </td>
++ <td>
++ N
++ </td>
++ <td>
++ Gehe zur nächsten Markierung
++ </td>
++ </tr>
++ <tr>
++ <td>
++ REG_MARK
++ </td>
++ <td>
++ "
++ </td>
++ <td>
++ "
++ </td>
++ <td>
++ Markiere alle Vorkommen eines Zeichenmusters
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Verschiedenes</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ COMMAND
++ </td>
++ <td>
++ M-c
++ </td>
++ <td>
++ M-c
++ </td>
++ <td>
++ Rufe eine oder mehrere durch Strichpunkt getrennte w3m-Funktionen auf
++ </td>
++ </tr>
++<!--
++TODO: Where does this key binding M-Fn come from. I do not find a Fn-key on my keyboard. I do not know how to type in the keystroke combinations listed in keymap.default which are
++keymap M-[E MENU
++keymap M-[L MENU
++keymap M-[2~ MENU
++keymap M-[28~ MENU
++<tr>
++<td>MENU</td>
++<Td>M-Fn</Td>
++<td></td>
++<td>Pop up menu</td>
++</tr>
++-->
++ <tr>
++ <td>
++ HELP
++ </td>
++ <td>
++ H
++ </td>
++ <td>
++ H, ?
++ </td>
++ <td>
++ Zeige Hilfe-Ãbersicht
++ </td>
++ </tr>
++ <tr>
++ <td>
++ OPTIONEN
++ </td>
++ <td>
++ o
++ </td>
++ <td>
++ o
++ </td>
++ <td>
++ Einstellungs-Dialog öffnen
++ </td>
++ </tr>
++<tr>
++<td>SET_OPTION</td>
++<td>M-o</td>
++<td>M-o</td>
++<td>Setze Option</td>
++</tr>
++<tr>
++<td>DEFINE_KEY</td>
++<td>M-k</td>
++<td>M-k</td>
++<td>Definiere eine Verbindung zwischen einer Tastenkombination und einem Kommando</td>
++</tr>
++<tr>
++<td>MOUSE_TOGGLE</td>
++<td>m</td>
++<td>m</td>
++<td>Schalte Mausbedienung an oder ab</td>
++</tr>
++<tr>
++<td>DOWNLOAD_LIST</td>
++<td>D</td>
++<td>D</td>
++<td>Ãbersicht heruntergeladener Dateien anzeigen</td>
++</tr>
++ <tr>
++ <td>
++ COOKIE
++ </td>
++ <td>
++ C-k
++ </td>
++ <td>
++ C-k
++ </td>
++ <td>
++ Zeige die gespeicherten Cookies
++ </td>
++ </tr>
++<!--
++mh 2016-06-12 Interrupt is an alias to SUSPEND, no need to mention it here
++ <tr>
++ <td>
++ INTERRUPT
++ </td>
++ <td>
++ C-c
++ </td>
++ <td>
++ C-c
++ </td>
++ <td>
++ Interrupt
++ </td>
++ </tr>
++-->
++<tr>
++<td>UNDO</td>
++<td>(</td>
++<td>(</td>
++<td>Nimm die letzte Cursorbewegung zurück</td>
++</tr>
++<tr>
++<td>REDO</td>
++<td>)</td>
++<td>)</td>
++<td>Den letzten Rücknahmebefehl zurücknehmen</td>
++</tr>
++ <tr>
++ <!-- is an alias of SHELL --><td>
++ EXEC_SHELL
++ </td>
++ <td>
++ !
++ </td>
++ <td>
++ !
++ </td>
++ <td>
++ Shell-Befehl ausführen
++ </td>
++ </tr>
++<tr>
++<td>DICT_WORD</td>
++<td>M-w</td>
++<td>M-w</td>
++<td>Führe eine Wörterbuch-Funktion aus (siehe <a href="../doc/README.dict">README.dict</a>)</td>
++</tr>
++<tr>
++<td>DICT_WORD_AT</td>
++<td>M-W</td>
++<td>M-W</td>
++<td>Benutze Wörterbuch für Wort unter Cursor</td>
++</tr>
++<tr>
++<td>VERSION</td>
++<td>r</td>
++<td>r</td>
++<td>Zeige die Version von w3m an</td>
++</tr>
++ <tr>
++ <td>
++ SUSPEND
++ </td>
++ <td>
++ C-z
++ </td>
++ <td>
++ C-z
++ </td>
++ <td>
++ w3m zum Hintergrundprozess machen. (Wird mit dem Shell-Befehl <span class="mono">fg</span> zurückgenommen.)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ QUIT
++ </td>
++ <td>
++ q
++ </td>
++ <td>
++ q
++ </td>
++ <td>
++ Mit Bestätigungsfrage beenden
++ </td>
++ </tr>
++ <tr>
++ <td>
++ EXIT
++ </td>
++ <td>
++ Q
++ </td>
++ <td>
++ Q
++ </td>
++ <td>
++ Sofort beenden
++ </td>
++ </tr>
++ </table>
++
++ <p>
++ Darüber hinaus gibt es die folgenden Bedien-Modi mit fester Tastaturbelegung für die entsprechenden Funktionen. Diese sind nicht durch die Funktion DEFINE_KEY oder Einträge der keymap-Datei veränderbar.
++ </p>
++
++ <table border="1" width="100%">
++ <colgroup>
++ <col width="20%">
++ <col width="40%">
++ <col width="40%">
++ </colgroup>
++ <tr>
++ <th>
++ Funktion<br>(interner Name)
++ </th>
++ <th>Tastenkombination
++ </th>
++ <th>
++ Beschreibung
++ </th>
++ </tr>
++ <tr>
++ <td colspan="3">
++ <h3>Menü-Auswahl-Modus</h3>
++ </td>
++ </tr>
++ <tr>
++ <td>
++ BUF:NEXT</td>
++ <td>
++ j, C-n, DOWN
++ </td>
++ <td>
++ Nächster Eintrag
++ </td>
++ </tr>
++ <tr>
++ <td>BUF:PREV
++ </td>
++ <td>
++ k, C-p, UP
++ </td>
++ <td>
++ Vorheriger Eintrag
++ </td>
++ </tr>
++ <tr>
++ <td>
++ BUF:DELETE</td>
++ <td>
++ D
++ </td>
++ <td>
++ Lösche Eintrag
++ </td>
++ </tr>
++ <tr>
++ <td>
++ BUF:GO
++ </td>
++ <td>
++ SPC, RET, RIGHT
++ </td>
++ <td>
++ Wähle Eintrag aus
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="3">
++ <h3>Popup-Menü-Modus</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++MENU:SELECT
++ </td>
++ <td>
++ SPC, RET, RIGHT</td>
++ <td>
++ Wähle Punkt aus
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:CLOSE
++ </td>
++ <td>C-c
++ </td>
++ <td>
++ SchlieÃe Menü
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:CANCEL
++ </td>
++ <td>
++ LEFT, BKSPC, C-h</td>
++ <td>
++ Einen Auswahlschritt zurück
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:DOWN
++ </td>
++ <td>j, C-n, DOWN
++ </td>
++ <td>
++ Gehe zum nächsten Punkt
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:UP
++ </td>
++ <td>
++ k, C-p, UP</td>
++ <td>
++ Gehe zum vorherigen Punkt
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:LINE_UP
++ </td>
++ <td>K
++ </td>
++ <td>
++ Scrolle einen Punkt aufwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:LINE_DOWN
++ </td>
++ <td>J
++ </td>
++ <td>
++ Scrolle einen Punkt abwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:TOP
++ </td>
++ <td>C-a
++ </td>
++ <td>
++ Gehe zum ersten Punkt
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:LAST
++ </td>
++ <td>C-e
++ </td>
++ <td>
++ Gehe zum letzten Punkt
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:NEXT
++ </td>
++ <td>C-v, C-f
++ </td>
++ <td>Gehe zur nächsten Seite
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:PREV
++ </td>
++ <td>ESC v, C-b
++ </td>
++ <td>
++ Gehe zur vorherigen Seite
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:SEARCH_FORE
++ </td>
++ <td>C-s, /
++ </td>
++ <td>
++ Suche vorwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:SEARCH_BACK
++ </td>
++ <td>
++ C-r, ?</td>
++ <td>
++ Suche rückwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:SEARCH_NEXT
++ </td>
++ <td>
++ n</td>
++ <td>
++ Suche weitere Ãbereinstimmung</td>
++ </tr>
++ <tr>
++ <td>
++MENU:SEARCH_PREV
++ </td>
++ <td>
++ N</td>
++ <td>
++ Suche frühere Ãbereinstimmung</td>
++ </tr>
++<!--mh 2016-06-12 Pressing C-z in menu mode (with menu active) has the same effect as in normal operation of w3m: Browser gets in the background
++ <tr>
++ <td>
++MENU:SUSPEND
++ </td>
++ <td>
++ C-z</td>
++ <td>
++ Suspend</td>
++ </tr>
++-->
++<!-- </table>-->
++ <tr>
++ <td colspan="3">
++ <h3>Eingabezeile-Bearbeitungs-Modus</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ LINEEDIT:FORWARD
++ </td>
++ <td width="100">
++ C-f, RIGHT
++ </td>
++ <td>
++ Bewege Cursor vorwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:BACK
++ </td>
++ <td>
++ C-b, LEFT
++ </td>
++ <td>
++ Bewege Cursor rückwärts
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:BS
++ </td>
++ <td>
++ C-h, BKSPC
++ </td>
++ <td>
++ Vorheriges Zeichen löschen
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:DEL
++ </td>
++ <td>
++ C-d
++ </td>
++ <td>
++ Aktuelles Zeichen löschen
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:KILL_AFTER
++ </td>
++ <td>
++ C-k
++ </td>
++ <td>
++ Lösche alles nach dem Cursor
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:KILL_BEFORE
++ </td>
++ <td>
++ C-u
++ </td>
++ <td>
++ Lösche alles vor dem Cursor
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:TOP
++ </td>
++ <td>
++ C-a
++ </td>
++ <td>
++ Gehe zum Zeilenanfang
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:BOTTOM
++ </td>
++ <td>
++ C-e
++ </td>
++ <td>
++ Gehe zum Zeilenende
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:PREV
++ </td>
++ <td>
++ C-p, UP
++ </td>
++ <td>
++ Hole den vorherigen Chronik-Eintrag
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:NEXT
++ </td>
++ <td>
++ C-n, DOWN
++ </td>
++ <td>
++ Hole den nächsten Chronik-Eintrag
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:COMPLETE
++ </td>
++ <td>
++ TAB, SPC
++ </td>
++ <td>
++ Versuche, den Dateinamen zu komplettieren
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:EDITOR
++ </td>
++ <td>
++ C-o
++ </td>
++ <td>
++ Bearbeite mit externem Editor
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:ACCEPT
++ </td>
++ <td>
++ RET
++ </td>
++ <td>
++ Eingabezeile übernehmen
++ </td>
++ </tr>
++ </table>
++<!-- mh 2016-06-12 As it suffices to use the provided keymap file for Lynx-like keybindings and this file is listed in section FILES of man w3m (1), the following hint for getting w3m with Lynx-like key bindings has been deleted.
++ <p>
++ If w3m was compiled with <q>Lynx-like key bindings</q>, you can use
++ the following key bindings.
++ </p>
++-->
++<!-- mh 2016-06-12 Remark is obsolete as the two sets key binding are presented along within tables
++ <hr>
++ <h2 id="Key:lynx">
++ <p>
++ The Lynx-like configuration leaves keymappings unchanged in the
++ menu-selection and line-editing modes.
++ </p>
++ </h2>
++-->
++ <hr>
++ <h2 id="Mouse">
++ Bedienung per Maus
++ </h2>
++ <p>
++ Wenn w3m mit Mausfunktionen kompiliert wurde und Sie das Programm entweder in einer Konsole mit GPM oder in einem X-Terminal-Emulator starten, ist ein Navigieren mit der Maus möglich. (Im Falle von rxvt müssen Sie die Umgebungsvariable TERM mit <q>xterm</q> oder <q>kxterm</q> belegen.)
++ </p>
++ <p>Die Datei <a href="README.mouse">README.mouse</a> erklärt, wie die Bedienung per Maus an eigene Vorlieben angepasst werden kann.
++ </p>
++ <table border="1">
++ <colgroup>
++ <col width="20%">
++ <col width="80%">
++ </colgroup>
++ <tr>
++ <th>Handlung
++ </th>
++ <th>Beschreibung
++ </th>
++ </tr>
++ <tr>
++ <td>
++ Linksklick
++ </td>
++ <td>
++<b>Zuerst:</b><br> Der Cursor wird an die Mauszeigerposition versetzt.<br> <b>Dann:</b><br> Dem Hyperlink, auf dem der Cursor momentan steht und auf den sich der Mauszeiger richtet, wird gefolgt.
++ </td>
++ </tr>
++ <tr>
++ <td>
++ Mittelklick
++ </td>
++ <td>
++ Zurück zum vorherigen Puffer.
++ </td>
++ </tr>
++ <tr>
++ <td>
++ Rechtsklick
++ </td>
++ <td>
++ Ãffne Menü. Sie können Menüpunkte durch Anklicken auswählen.
++ </td>
++ </tr>
++ <tr>
++ <td>
++ Linksziehen
++ </td>
++ <td>
++ Dokument scrollen. StandardmäÃig wird das Dokument im Fenster verschoben. Ein Verschieben des Fensters über dem stehenden Dokument erreichen Sie über den Einstellungs-Dialog.
++ </td>
++ </tr>
++ </table>
++ <hr>
++ <h2 id="LocalCGI">
++ Lokale CGI-Skripte
++ </h2>
++ <p>
++ w3m ist in der Lage, CGI-Skripte direkt laufen zu lassen. Dies bedeutet, dass sich das Programm wie ein HTTP-Server verhält und das CGI-Skript ausführt und dessen Ausgabe anzeigt. Beispielsweise wurden die Lesezeichen-Registrierung und der Verzeichnis-Browser als lokale CGI-Skripte programmiert. Darüber hinaus kann w3m durch solche Skripte als Schnittstelle zum Einholen von Daten aller Art fungieren.
++ </p>
++ <p>
++ Aus Sicherheitsgründen kommen für von w3m benutzte CGI-Skripte nur folgende Verzeichnisse in Frage:
++ </p>
++ <ul>
++ <li>
++ Das Verzeichnis, in dem w3m-bezogene Dateien abgelegt sind (typischerweise /usr/local/lib/w3m). Auf dieses Verzeichnis kann mit der Variblen $LIB referenziert werden.
++ </li>
++ <li>
++ Das Verzeichnis /cgi-bin/. Sie können /cgi-bin/ im Feld <q>Verzeichnis für ausführbare Skripte</q> des Einstellungs-Dialogs jedem gewünschten Verzeichnis zuordnen. Mehrere Pfade lassen sich durch Doppelpunkt getrennt angeben, also in der Form <span class="mono">/usr/local/cgi-bin:/home/aito/cgi-bin</span>. Es wird davon abgeraten, das aktuelle Verzeichnis hier mitaufzunehmen. Zum Zugriff auf Skripte im Verzeichnis /cgi-bin/ erwartet w3m eine URL folgender Art:
++ </li>
++<pre>
++ w3m -o cgi_bin=/path/to/cgi-bin file:/cgi-bin/script.cgi
++</pre>
++ </ul>
++ <p>
++ Das CGI-Skript kann zur Steuerung von w3m die spezielle Kopfzeile <span class="mono">w3m-control:</span> enthalten. Darin können alle Funkionen (siehe <a href="README.func">README.func</a>) eingetragen sein. Die angegebene Funktion wird aufgerufen, nachdem das Dokument angezeigt wird. Beispielsweise, wird eine Skriptausgabe
++ </p>
++<pre>
++Content-Type: text/plain<br>W3m-control: BACK
++</pre>
++ <p>
++ eine leere Seite anzeigen und den Puffer sofort löschen. Dies ist nützlich, wenn es nicht gewünscht ist, die Seite nach Aufrufen des Skriptes anzuzeigen. Das nächste Beispiel
++ </p>
++<pre>
++Content-Type: text/plain<br>W3m-control: DELETE_PREVBUF contents.....
++</pre>
++ <p>
++ führt zum Ãbergehen des aktuellen Puffers.
++ </p>
++ <p>
++ Jede <span class="mono">w3m-control</span>-Kopfzeile kann nur eine Funktion aufrufen. Jedoch können Sie im Kopfteil einer HTTP-Kommunikation mehr als eine <span class="mono">w3m-control</span>-Anweisung hinterlegen. Ãberdies ist es möglich, die GOTO-Funktion mit einem Argument aufzurufen:
++ </p>
++<pre>
++Content-Type: text/plain<br>W3m-control: GOTO http://www.example.org/
++</pre>
++ <p>
++ Sie bewirken damit das gleiche wie mit der Anweisung <q>Location:</q> im Kopfteil:
++ </p>
++<pre>
++Content-Type: text/plain<br>Location: http://www.example.org/
++</pre>
++ <p>
++ Beachten Sie, dass diese Anweisung wirkungslos ist, wenn das CGI-Skript durch einen HTTP-Server angesprochen wird.
++ </p>
++ </body>
++</html>
+diff --git a/doc-de/README.func b/doc-de/README.func
+new file mode 100644
+index 0000000..72d7d45
+--- /dev/null
++++ b/doc-de/README.func
+@@ -0,0 +1,146 @@
++ABORT Sofort beenden
++ACCESSKEY Ãffne Zugangstasten-Menü
++ADD_BOOKMARK Lege für aktuelle Seite Lesezeichen an
++ALARM Alarm einrichten
++BACK SchlieÃe aktuellen Puffer und kehre zu dem im Stapel darunterliegenden zurück
++BEGIN Gehe zur ersten Zeile
++BOOKMARK Lesezeichen ansehen
++CENTER_H Um Cursor herum horizontal zentrieren
++CENTER_V Um Cursor herum vertikal zentrieren
++CHARSET Ãndere die Zeichenkodierung für das aktuelle Dokument
++CLOSE_TAB SchlieÃe Reiter
++CLOSE_TAB_MOUSE SchlieÃe Reiter bei Mauszeiger
++COMMAND Rufe w3m Funktion(en) auf
++COOKIE Cookie-Liste ansehen
++DEFAULT_CHARSET Ãndere die Voreinstellung für die Zeichenkodierung
++DEFINE_KEY Definiere eine Verbindung zwischen einer Tastenkombination und einem Kommando
++DELETE_PREVBUF Lösche vorherigen Puffer (hauptsächlich für lokale CGI-Skripte)
++DICT_WORD Führe eine Wörterbuch-Funktion aus (siehe README.dict)
++DICT_WORD_AT Benutze Wörterbuch für Wort unter Cursor
++DISPLAY_IMAGE Starte das Laden und die Erstellung von Bildern erneut
++DOWN Scrolle den Anzeigebereich eine Zeile abwärts
++DOWNLOAD Dokument-Quellcode speichern
++DOWNLOAD_LIST Die Ãbersicht heruntergeladener Dateien zeigen
++EDIT Bearbeite lokales Quelldokument
++EDIT_SCREEN Bearbeite eine Kopie des verarbeiteten Dokuments
++END Gehe zur letzten Zeile
++EXEC_SHELL Führe Shell-Befehl aus und zeige Ausgabe an
++EXIT Sofort beenden
++EXTERN Verwende externen Browser zur Anzeige
++EXTERN_LINK Verwende externen Browser zur Anzeige des Linkziels
++FRAME Wechsle zwischen Kennung und Umsetzung von HTML-Frames
++GOTO Ãffne angegebenes Dokument in neuem Puffer
++GOTO_LINE Gehe zur angebenen Zeile
++GOTO_LINK Folge dem aktuellen Hyperlink in neuem Puffer
++GOTO_RELATIVE Gehe zu relativer Adresse
++HELP Zeige Hilfe-Ãbersicht
++HISTORY Chronik aufgesuchter Dokumente
++INFO Zeige Informationen über dieses Dokument
++INTERRUPT w3m zum Hintergrundprozess machen
++ISEARCH Inkrementelle Suche vorwärts
++ISEARCH_BACK Inkrementelle Suche rückwärts
++LEFT Anzeigebereich um eine Spalte nach links verschieben
++LINE_BEGIN Gehe zum Zeilenanfang
++LINE_END Gehe zum Zeilenende
++LINE_INFO Zeige aktuelle Position im Dokument an
++LINK_BEGIN Gehe zum ersten Hyperlink
++LINK_END Gehe zum letzten Hyperlink
++LINK_MENU Ãffne Menü mit den Link-Elementen
++LIST Zeige alle referenzierten URLs
++LIST_MENU Ãffne Menü mit aufsuchbaren Hyperlinks
++LOAD Ãffne lokale Datei in einem neuen Puffer
++MAIN_MENU Ãffne Menü
++MARK Setze/Lösche Markierung
++MARK_MID Wandle Nachrichten-ID-artige Zeichenketten um in Hyperlinks
++MARK_URL Wandle URL-artige Zeichenketten um in Hyperlinks
++MARK_WORD Wandle aktuelles Wort in Hyperlink um
++MENU Ãffne Menü
++MENU_MOUSE Ãffne Menü beim Mauszeiger
++MOUSE_TOGGLE Schalte Mausbedienung an oder ab
++MOVE_DOWN Cursor abwärts
++MOVE_DOWN1 Cursor abwärts; am Rand gleitend bewegen
++MOVE_LEFT Cursor nach links
++MOVE_LEFT1 Cursor nach links; am Rand gleitend bewegen
++MOVE_LIST_MENU Ãffne Menü mit vorhandenen Hyperlinks
++MOVE_MOUSE Cursor auf Mauszeigerposition setzen
++MOVE_RIGHT Cursor nach rechts
++MOVE_RIGHT1 Cursor nach rechts; am Rand gleitend bewegen
++MOVE_UP Cursor aufwärts
++MOVE_UP1 Cursor aufwärts; am Rand gleitend bewegen
++MSGS Zeige Fehlermeldungen an
++NEW_TAB Ãffne neuen Reiter (mit aktuellem Dokument)
++NEXT Schalte zum nächsten Puffer
++NEXT_DOWN Gehe abwärts zum nächsten Hyperlink
++NEXT_HALF_PAGE Scrolle eine halbe Seite abwärts
++NEXT_LEFT Gehe zum nächsten Hyperlink links
++NEXT_LEFT_UP Gehe zum nächsten Hyperlink links oder oberhalb
++NEXT_LINK Gehe zum nächsten Hyperlink
++NEXT_MARK Gehe zur nächsten Markierung
++NEXT_PAGE Eine Seite abwärts
++NEXT_RIGHT Gehe zum nächsten Hyperlink rechts
++NEXT_RIGHT_DOWN Gehe zum nächsten Hyperlink rechts oder unterhalb
++NEXT_TAB Schalte zum nächsten Reiter
++NEXT_UP Gehe zum nächsten Hyperlink oberhalb
++NEXT_VISITED Gehe zum nächsten besuchten Hyperlink
++NEXT_WORD Gehe zum nächsten Wort
++NOTHING Tue nichts
++NULL Tue nichts
++OPTIONS Zeige Einstellungen für Ãnderungen
++PEEK Zeige aktuelle Adresse an
++PEEK_IMG Zeige Adresse des Bildes
++PEEK_LINK Zeige Zieladresse
++PIPE_BUF Leite aktuellen Pufferinhalt einem Shell-Befehl zu und zeige Ausgabe an
++PIPE_SHELL Führe Shell-Befehl aus und zeige Ausgabe an
++PREV Schalte zum vorherigen Puffer
++PREV_HALF_PAGE Scrolle eine halbe Seite aufwärts
++PREV_LINK Gehe zum vorangegangen Hyperlink
++PREV_MARK Gehe zur vorherigen Markierung
++PREV_PAGE Eine Seite aufwärts
++PREV_TAB Schalte zum vorherigen Reiter
++PREV_VISITED Gehe zum vorherigen besuchten Hyperlink
++PREV_WORD Gehe zum vorherigen Wort
++PRINT Speichere verarbeitetes Dokument
++QUIT Mit Bestätigungsfrage beenden
++READ_SHELL Führe Shell-Befehl aus und zeige Ausgabe an
++REDO Den letzten Rücknahmebefehl zurücknehmen
++REDRAW Bildschirmanzeige neu aufbauen
++REG_MARK Zu einem Muster passenden Zeichenfolgen überall markieren
++REINIT Konfigurationsdatei erneut laden
++RELOAD Aktuelles Dokument erneut laden
++RESHAPE Dokument nochmals verarbeiten
++RIGHT Anzeigebereich um eine Spalte nach rechts verschieben
++SAVE Dokument-Quellcode speichern
++SAVE_IMAGE Speichere Bild
++SAVE_LINK Speichere Ziel des Hyperlinks
++SAVE_SCREEN Speichere verarbeitetes Dokument
++SEARCH Suche vorwärts
++SEARCH_BACK Suche rückwärts
++SEARCH_FORE Suche vorwärts
++SEARCH_NEXT Setze Suche vorwärts fort
++SEARCH_PREV Setze Suche rückwärts fort
++SELECT Zeige Puffferstapel-Ãbersicht
++SELECT_MENU Ãffne Puffferstapel-Menü
++SETENV Setze Umgebungsvariable
++SET_OPTION Setze Option
++SHELL Führe Shell-Befehl aus und zeige Ausgabe an
++SHIFT_LEFT Anzeigebereich nach links versetzen
++SHIFT_RIGHT Anzeigebereich nach rechts versetzen
++SOURCE Wechsle zwischen HTML-Wiedergabe und -Verarbeitung
++STOP_IMAGE Bilder nicht mehr laden und anzeigen
++SUBMIT Formular übermitteln
++SUSPEND w3m zum Hintergrundprozess machen
++TAB_GOTO Ãffne das angegebene Dokument in einem neuen Reiter
++TAB_GOTO_RELATIVE Ãffne relative Adresse in einem neuen Reiter
++TAB_LEFT Einen Reiter weiter nach links gehen
++TAB_LINK Folge dem aktuellen Hyperlink in einem neuen Reiter
++TAB_MENU Ãffne das Reiter-Auswahl-Menü
++TAB_MOUSE Wähle per Maus Reiter aus
++TAB_RIGHT Einen Reiter weiter nach rechts gehen
++UNDO Nimm die letzte Cursorbewegung zurück
++UP Scrolle den Anzeigebereich eine Zeile aufwärts
++VERSION Zeige die Version von w3m an
++VIEW Wechsle zwischen HTML-Wiedergabe und -Verarbeitung
++VIEW_BOOKMARK Lesezeichen ansehen
++VIEW_IMAGE Zeige Bild in Betrachter
++WHEREIS Suche vorwärts
++WRAP_TOGGLE Wechsle zwischen umlaufendem und nicht-umlaufendem Suchen
+diff --git a/doc-de/w3m.1 b/doc-de/w3m.1
+new file mode 100644
+index 0000000..7deb203
+--- /dev/null
++++ b/doc-de/w3m.1
+@@ -0,0 +1,334 @@
++.nr N -1
++.nr D 5
++.\"*******************************************************************
++.\"
++.\" This file was generated with po4a. Translate the source file.
++.\"
++.\"*******************************************************************
++.TH W3M 1 2016\-08\-06 "w3m 0.5.3"
++.SH NAME
++w3m \- Ein auf Texte ausgerichtetes Programme zur Anzeige von Dateien und
++Datenströmen sowie zum Browsen im Internet
++.SH SYNOPSIS
++w3m [OPTION]... [ \fIDatei\fP | \fIURL\fP ]...
++.SH BESCHREIBUNG
++.\" This defines appropriate quote strings for nroff and troff
++.ds lq "
++.ds rq "
++.if t .ds lq ``
++.if t .ds rq ''
++.if \nN==0 .nr N 10
++.\" Just in case these number registers aren't set yet...
++.if \nD==0 .nr D 5
++
++\fIw3m\fP ist ein textorientierter Browser, der lokale oder im Internet
++liegende Seiten sowie andere Dokumente anzeigen kann. Er verarbeitet
++HTML\-Tabellen und Frames, nicht jedoch JavaScript und Cascading Style
++Sheets. \fIw3m\fP kann auch als Textbetrachter (Pager) dienen. Entsprechende
++Dateien werden beim Aufruf als Argument angegeben oder an der
++Standardeingabe als Datenstrom übernommen. Mit \fIw3m\fP kann sich der Benutzer
++überdies durch Verzeichnisbäume bewegen.
++
++\fIw3m\fP arbeitet mit Reitern (Registerkarten, Tabs) und Puffern, was einen
++einfachen Wechsel zwischen geladenen Inhalten erlaubt. Wenn die Erweiterung
++w3m\-img installiert ist, zeigt \fIw3m\fP auch in die Seiten eingebundene
++Grafiken an. Wann immer die Umsetzung von HTML\-Inhalten durch \fIw3m\fP Ihren
++Ansprüchen nicht genügt, reicht ein einzelnes Kommando, um die Ziel\-URL
++einem grafischen Browser zu übergeben.
++
++Um nach Start des Programms Hilfe zu den Optionen zu erhalten, drücken Sie
++\(lqH\(rq.
++
++.SH ARGUMENTE
++
++Wenn das Programm mit einem oder mehreren Argumenten aufgerufen wird,
++behandelt \fIw3m\fP diese Ziele je nach Typ des Inhalts. Bei Daten aus dem
++Internet verwertet \fIw3m\fP die Angabe in den HTTP\-Kopfzeilen. Bei relativen
++oder absoluten Pfaden in Dateisystemen richtet sich \fIw3m\fP nach dem
++Dateinamen.
++
++Ohne Argument aufgerufen, erwartet \fIw3m\fP unformatierte Daten aus der
++Standardeingabe, es sei denn, der Benutzer hat einen anderen MIME\-Typ
++angegeben.
++
++Sollte \fIw3m\fP weder ein Zielobjekt vorliegen noch ein Ausweichen vorgesehen
++sein (beispielsweise durch die Option \fB\-v\fP, siehe unten), gibt das Programm
++nur Benutzungshinweise aus.
++.SH OPTIONEN
++Vor Befehlszeilen\-Optionen steht das \(lq\-\(rq Zeichen einzeln, ihnen kann
++ein Argument folgen.
++.SS "Allgemeine Optionen"
++.TP
++\fB\-B\fP
++starte mit einer Ansicht aller Lesezeichen (wenn kein anderes Zielobjekt
++angegeben ist)
++.TP
++\fB\-M\fP
++monochrome Anzeige
++.TP
++\fB\-no\-mouse\fP
++Mausfunktion aus
++.TP
++\fB\-num\fP
++zeige Zeilennummern an
++.TP
++\fB\-N\fP
++verteile die übergebenen Argumente unter Reitern. StandardmäÃig würde ein
++Stapel von Puffern benutzt
++.TP
++\fB\-ppc \fP\fInum\fP
++Weite von \fInum\fP Bildpunkten pro Zeichen, einstellbar von 4.0 bis 32.0,
++standardmäÃig 8.0. GröÃere Werte machen Tabellen enger. (Implementierung
++unklar)
++.TP
++\fB\-ppl \fP\fInum\fP
++Höhe von \fInum\fP Bildpunkten pro Linie, einstellbar von 4.0 bis
++64.0. (Implementierung unklar)
++.TP
++\fB\-title\fP, \fB\-title=TERM\fP
++verwende den Puffernamen auch als Titel des Terminalfensters. Soweit TERM
++eingegeben wurde, konfiguriert dieser Wert den Stil des Titels
++.TP
++\fB\-v\fP
++begrüÃe den Benutzer mit einer eingebauten Seite (wenn kein anderes
++Zielobjekt angegeben ist)
++.TP
++\fB\-W\fP
++wechsle zwischen umlaufendem und nicht umlaufendem Suchen
++.TP
++\fB\-X\fP
++initialisiere nach Verlassen des Programms das Terminal nicht neu
++.TP
++\fB+\fP\fIZahl\fP
++gehe zu Zeile \fIZahl\fP; wirkt nur, wenn \fIZahl\fP gröÃer ist als die im
++Terminal verfügbare Zeilenzahl
++.SS Browser\-Optionen
++.TP
++\fB\-cols \fP\fInum\fP
++bei für die Standardausgabe bestimmten Inhalten, nimm bei der Umsetzung von
++HTML eine Länge von \fInum\fP Zeichen pro Zeile
++.TP
++\fB\-cookie\fP, \fB\-no\-cookie\fP
++verwende gespeicherte Cookies und akzeptiere neue. Oder tue weder das eine
++noch das andere
++.TP
++\fB\-F\fP
++verarbeite Frames
++.TP
++\fB\-graph\fP, \fB\-no\-graph\fP
++bei der Umsetzung von Tabellen und Frames grafische Zeichen verwenden oder
++nicht verwenden
++.TP
++\fB\-header \fP\fIZeichenkette\fP
++füge \fIZeichenkette\fP der HTTP(S)\-Anfrage an. Diese muss der Kopfdaten\-Syntax
++\f(CWVariable: Wert\fP entsprechen
++.TP
++\fB\-m\fP
++stelle eine Usenet\-Nachricht entsprechend \(lqContent\-type\(rq in den
++Kopfdaten dar
++.TP
++\fB\-no\-proxy\fP
++verwende keinen Proxy
++.TP
++\fB\-post \fP\fIDatei\fP
++verwende die Methode POST, um in \fIDatei\fP hinterlegte Daten
++hochzuladen. Hierbei wird die Syntax \f(CWvar1=wert1[&var2=wert2]â¦\fP erwartet
++.TP
++\fB\-4\fP
++nur IPv4. Entspricht dns_order=4 in der Konfigurationsdatei
++.TP
++\fB\-6\fP
++nur IPv6. Entspricht dns_order=6 in der Konfigurationsdatei
++.SS Textbetrachter\-Optionen
++.TP
++\fB\-l \fP\fInum\fP
++Anzahl der Zeilen, die zwischengespeichert werden, wenn Text per
++Standardeingabe übergeben wurde. (Voreinstellung ist 10000)
++.TP
++\fB\-r\fP
++verarbeite spezielle Escape\-Zeichen (beispielsweise ANSI\-Escape\-Zeichen oder
++nroff\-Rückwärtsschritte für fette und unterstrichene Zeichen) nicht, sondern
++zeige sie stattdessen mittels Caret\-Notation.
++.TP
++\fB\-s\fP
++mehrere leere Zeilen werden bis auf eine gelöscht
++.TP
++\fB\-t\fP \fInum\fP
++berücksichtige Tab\-Zeichen so, dass Spalten mit einer Weite von \fInum\fP
++Zeichen entstehen
++.SS "Datenart\- und Datenkodierungs\-Optionen"
++.TP
++\fB\-I \fP\fIcharset\fP
++zu benutzende Zeichenkodierung für erhaltene Daten
++.TP
++\fB\-O \fP\fIcharset\fP
++zu benutzende Zeichenkodierung für auszugebende Daten
++.TP
++\fB\-T \fP\fITyp\fP
++zu benutzender MIME\-Typ für erhaltenen Daten
++.SS "Optionen zur Datenausgabe, mit sofortigem Verlassen des Programms"
++.TP
++\fB\-dump\fP
++leite die verarbeitete Seite der Standardausgabe zu. Die Option gilt als
++gesetzt, wenn der Aufruf beinhaltet, dass die Ausgabe in eine Datei
++umgeleitet oder einem weiteren Programm übergeben wird.
++.TP
++\fB\-dump_source\fP
++leite den Seitenquelltext der Standardausgabe zu
++.TP
++\fB\-dump_head\fP
++leite die Antwort einer HEAD\-Anfrage für eine URL der Standardausgabe zu
++.TP
++\fB\-dump_both\fP
++leite Antwort auf HEAD\-Anfrage und Seitenquelltext der Standardausgabe zu
++.TP
++\fB\-dump_extra\fP
++leite Antwort auf HEAD\-Anfrage, Seitenquelltext und Extrainformation der
++Standardausgabe zu
++.TP
++\fB\-help\fP
++zeige eine Zusammenfassung verfügbarer Funktionen und Befehlszeilen\-Optionen
++.TP
++\fB\-show\-option\fP
++zeige alle zur Konfiguration verfügbaren Optionen
++.TP
++\fB\-version\fP
++gibt die Version von \fIw3m\fP aus
++.SS "Optionen, die Standards für Einstellungen und Datenquellen auÃer Kraft setzen"
++.TP
++\fB\-bookmark \fP\fIDatei\fP
++benutze anstelle der Standarddatei bookmark.html für Lesezeichen die Datei
++\fIDatei\fP
++.TP
++\fB\-config \fP\fIDatei\fP
++benutze \fIDatei\fP anstelle der Standardkonfigurationsdatei
++.TP
++\fB\-debug\fP
++BITTE NICHT BENUTZEN
++.TP
++\fB\-o \fP\fIOption=Wert\fP
++arbeite mit einer Konfiguration, bei der die Einstellung \fIOption\fP mit
++\fIWert\fP belegt ist. Ohne \fIOption=Wert\fP gleichwertig mit \fB\-show\-option\fP
++.TP
++\fB\-reqlog\fP
++Protokolliere Header der HTTP\-Kommunikation in Datei \f(CW~/.w3m/request.log\fP
++.SH BEISPIELE
++.SS "Verwendung als Textbetrachter"
++.TP
++zwei HTML\-Fragmente zusammengefügt anzeigen
++.EX
++$ cat header.html footer.html | w3m \-T text/html
++.EE
++.TP
++zwei Dateien unter Reitern einander gegenüberstellen
++.EX
++$ w3m \-N config.old config
++.EE
++.SS "browser\-artige Verwendung"
++.TP
++zeige Internet\-Inhalt in monochromem Terminal
++.EX
++$ w3m \-M http://w3m.sourceforge.net
++.EE
++.TP
++zeige eingebettete Grafiken an
++.EX
++$ w3m \-o auto_image=TRUE http://w3m.sourceforge.net
++.EE
++.TP
++zeige Inhalt aus dem Usenet
++.EX
++$ w3m \-m nntp://news.aioe.org/comp.os.linux.networking
++.EE
++.TP
++mit der POST\-Methode Daten für eine URL hochladen
++.EX
++$ w3m \-post \- http://example.com/form.php <<<'a=0&b=1'
++.EE
++.SS "filterartige Verwendung"
++.TP
++konvertiere eine HTML\-Datei in reinen Text von bestimmter Zeilenlänge
++.EX
++$ w3m \-cols 40 foo.html > foo.txt
++.EE
++.TP
++übergib den Bestand an Lesezeichen mit zugehörigen Links als reinen Text einer Datei.
++.EX
++$ w3m \-B \-o display_link_number=1 > out.txt
++.EE
++.TP
++Konvertierung in ein anderes Dateiformat und eine andere Zeichenkodierung
++.EX
++$ w3m \-T text/html \-I EUC\-JP \-O UTF\-8 < foo.html > foo.txt
++.EE
++.SS "starte ohne Eingabedaten"
++.TP
++begrüÃe den Benutzer mit einer eingebauten Seite
++.EX
++$ w3m \-v
++.EE
++.\".SH Errors
++.SH UMGEBUNGSVARIABLEN
++\fIw3m\fP weicht auf den Wert der Umgebungsvariablen WWW_HOME aus, wenn das
++Programm ohne Zielobjekt aufgerufen wurde.
++.SH DATEIEN
++.TP
++\f(CW~/.w3m/bookmark.html\fP
++voreingestellte Datei für Lesezeichen
++.TP
++\f(CW~/.w3m/config\fP
++benutzerdefinierte Konfigurationsdatei; gegenüber \f(CW/etc/w3m/config\fP
++vorrangig
++.TP
++\f(CW~/.w3m/cookie\fP
++Ablageort für Cookies; wird beim Verlassen des Programms geschrieben und
++beim Aufruf gelesen
++.TP
++\f(CW~/.w3m/history\fP
++Chronik besuchter Seiten und URLs
++.TP
++\f(CW~/.w3m/keymap\fP
++benutzerdefinierte Tastaturbelegung, setzt standardmäÃige Belegung auÃer
++Kraft
++.TP
++\f(CW~/.w3m/mailcap\fP
++Konfigurationsdatei für Programme zur externen Anzeige
++.TP
++\f(CW~/.w3m/menu\fP
++benutzerdefiniertes Menü; vorrangig gegenüber Standardmenü
++.TP
++\f(CW~/.w3m/mime.types\fP
++Datei mit MIME\-Typen
++.TP
++\f(CW~/.w3m/mouse\fP
++benutzerdefinierte Mauseinstellungen
++.TP
++\f(CW~/.w3m/passwd\fP
++Datei mit Nutzerkonto\-Passwort\-Liste
++.TP
++\f(CW~/.w3m/pre_form\fP
++.\" .TP
++.\" .I $~/.w3m/urimethodmap
++.\" ???
++enthält vordefinierte Werte für wiederkehrende HTML\-Formulare
++.SH "SIEHE AUCH"
++README und Beispieldateien finden Sie im Dokumentationsverzeichnis Ihrer
++\fIw3m\fP\-Installation. Aktuelle Informationen zu \fIw3m\fP finden Sie auf der
++Projektseite
++.UR http://w3m.sourceforge.net
++unter
++.UE
++.SH DANKSAGUNGEN
++In \fIw3m\fP ist Programmcode verschiedener Quellen eingeflossen. Benutzer
++haben mit Korrekturen (Patch\-Dateien) und Vorschlägen zur Verbesserung des
++Programms beigetragen.
++.SH AUTOR
++.UR aito@fw.ipsj.or.jp
++Akinori ITO
++.UE
++Die deutsche Ãbersetzung wurde 2016 von
++.UR markus.hiereth@freenet.de
++Markus Hiereth
++.UE
++erstellt.
++
+diff --git a/doc-jp/FAQ.html b/doc-jp/FAQ.html
+index e16a986..86ef05a 100644
+--- a/doc-jp/FAQ.html
++++ b/doc-jp/FAQ.html
+@@ -176,7 +176,7 @@ w3m
+ Êݸ¤·¤Þ¤¹¡¥²èÁü¤òÊݸ¤¹¤ë¾ì¹ç¤Ï ESC I ¤Ç¤¹¡¥
+ <p>
+ <dt>¥×¥í¥¥·¤ÎÀßÄê¤Ï¤É¤¦¤¹¤ë¤Î¡©
+-<dd>´Ä¶ÊÑ¿ô HTTP_proxy ¤òÀßÄꤹ¤ë¤«¡¤"o" ¥³¥Þ¥ó¥É¤Î¥ª¥×¥·¥ç¥óÀßÄê¥Ñ¥Í¥ë
++<dd>´Ä¶ÊÑ¿ô HTTP_PROXY, HTTPS_PROXY, GOPHER_PROXY, FTP_PROXY ¤òÀßÄꤹ¤ë¤«¡¤"o" ¥³¥Þ¥ó¥É¤Î¥ª¥×¥·¥ç¥óÀßÄê¥Ñ¥Í¥ë
+ ¤ÇÀßÄꤷ¤Þ¤¹¡¥Î㤨¤Ð proxy.hogege.com ¤È¤¤¤¦¥Û¥¹¥È¤Î 8000È֥ݡ¼¥È¤ò
+ ÍøÍѤ¹¤ë¾ì¹ç¡¤
+ <p>
+diff --git a/doc-jp/MANUAL.html b/doc-jp/MANUAL.html
+index 41d70f1..66fdc6e 100644
+--- a/doc-jp/MANUAL.html
++++ b/doc-jp/MANUAL.html
+@@ -51,15 +51,9 @@ w3m
+ <dt>-l ¹Ô¿ô
+ <dd>ɸ½àÆþÎϤÎÆâÍƤòɽ¼¨¤¹¤ë¤È¤¤ËÊݸ¤µ¤ì¤ëºÇÂç¹Ô¿ô¤ò»ØÄꤹ
+ ¤ë¡¥¥Ç¥Õ¥©¥ë¥È¤Ï 10000¡¥
+-<dt>-s
+-<dd>Shift_JIS ¥³¡¼¥É¤Çɽ¼¨¤¹¤ë¡¥
+-<dt>-e
+-<dd>EUC ¥³¡¼¥É¤Çɽ¼¨¤¹¤ë¡¥
+-<dt>-j
+-<dd>JIS(ISO-2022-JP) ¥³¡¼¥É¤Çɽ¼¨¤¹¤ë¡¥
+-<dt>-O e|s|j|N|m|n
++<dt>-O ʸ»ú¥³¡¼¥É
+ <dd>ɽ¼¨¤ËÍѤ¤¤ëʸ»ú¥³¡¼¥É¤ò»ØÄꤹ¤ë¡¥
+-<dt>-I e|s
++<dt>-I ʸ»ú¥³¡¼¥É
+ <dd>ÆþÎÏʸ½ñ¤Îʸ»ú¥³¡¼¥É¤ò»ØÄꤹ¤ë¡¥
+ <dt>-T ¥¿¥¤¥×
+ <dd>ɽ¼¨¤¹¤ëʸ½ñ¤Î¥¿¥¤¥×¤ò»ØÄꤹ¤ë¡¥¤³¤Î»ØÄ꤬¤Ê¤¤¾ì¹ç¡¤¥Õ¥¡¥¤¥ë
+@@ -89,7 +83,7 @@ HTML
+ <dd>¥«¥é¡¼É½¼¨¤ò¤·¤Ê¤¤¡¥
+ <dt>-F
+ <dd>¥Õ¥ì¡¼¥à¤ò¼«Æ°É½¼¨¤¹¤ë¡¥
+-<dt>-S
++<dt>-s
+ <dd>Ϣ³¤¹¤ë¶õ¹Ô¤ò1¹Ô¤Ë¤Þ¤È¤á¤Æɽ¼¨¤¹¤ë¡¥
+ <dt>-X
+ <dd>w3m½ªÎ»»þ¤Ë¡¤°ÊÁ°¤Î²èÌ̤ËÌá¤é¤Ê¤¤¡¥
+@@ -211,9 +205,9 @@ HTMLʸ
+ <TR><TD>F<TD><FRAMESET>¤ò´Þ¤àʸ½ñ¤òɽ¼¨¤·¤Æ¤¤¤ë¤È¤¤Ë¡¤<FRAME>
+ ¥¿¥°¤Î»Ø¤¹Ê£¿ô¤Îʸ½ñ¤ò1¤Ä¤Îʸ½ñ¤ËÊÑ´¹¤·¤Æɽ¼¨¤·¤Þ¤¹¡¥
+ <TR><TD>M<TD>¸½ºß¸«¤Æ¤¤¤ë¥Ú¡¼¥¸¤ò¡¤³°Éô¥Ö¥é¥¦¥¶¤ò»È¤Ã¤Æɽ¼¨¤·¤Þ¤¹¡¥
+-2M, 3M ¤Ç2ÈÖÌܤÈ3ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
++2M, 3M, ..., 9M ¤Ç2ÈÖÌÜ¡¤3ÈÖÌÜ¡¤9ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
+ <TR><TD>ESC M<TD>¸½ºß¤Î¥ê¥ó¥¯Àè¤ò¡¤³°Éô¥Ö¥é¥¦¥¶¤ò»È¤Ã¤Æɽ¼¨¤·¤Þ¤¹¡¥
+-2ESC M, 3ESC M ¤Ç2ÈÖÌܤÈ3ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
++2ESC M, 3ESC M, ..., 9ESC M ¤Ç2ÈÖÌÜ¡¤3ÈÖÌÜ¡¤9ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
+ </table>
+
+ <H3>¥Õ¥¡¥¤¥ë¤ÈURL´Ø·¸¤ÎÁàºî</H3>
+@@ -349,9 +343,9 @@ Lynx
+ <TR><TD>F<TD><FRAMESET>¤ò´Þ¤àʸ½ñ¤òɽ¼¨¤·¤Æ¤¤¤ë¤È¤¤Ë¡¤<FRAME>
+ ¥¿¥°¤Î»Ø¤¹Ê£¿ô¤Îʸ½ñ¤ò1¤Ä¤Îʸ½ñ¤ËÊÑ´¹¤·¤Æɽ¼¨¤·¤Þ¤¹¡¥
+ <TR><TD>M<TD>¸½ºß¸«¤Æ¤¤¤ë¥Ú¡¼¥¸¤ò¡¤³°Éô¥Ö¥é¥¦¥¶¤ò»È¤Ã¤Æɽ¼¨¤·¤Þ¤¹¡¥
+-2M, 3M ¤Ç2ÈÖÌܤÈ3ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
++2M, 3M, ..., 9M ¤Ç2ÈÖÌÜ¡¤3ÈÖÌÜ¡¤9ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
+ <TR><TD>ESC M<TD>¸½ºß¤Î¥ê¥ó¥¯Àè¤ò¡¤³°Éô¥Ö¥é¥¦¥¶¤ò»È¤Ã¤Æɽ¼¨¤·¤Þ¤¹¡¥
+-2ESC M, 3ESC M ¤Ç2ÈÖÌܤÈ3ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
++2ESC M, 3ESC M, ..., 9ESC M ¤Ç2ÈÖÌÜ¡¤3ÈÖÌÜ¡¤9ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
+ </table>
+
+ <H3>¥Õ¥¡¥¤¥ë¤ÈURL´Ø·¸¤ÎÁàºî</H3>
+@@ -489,8 +483,7 @@ w3m
+ w3m¤ò»È¤¨¤Ð¡¤HTTP¥µ¡¼¥Ð¤Ê¤·¤ÇCGI¥¹¥¯¥ê¥×¥È¤òµ¯Æ°¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡¥
+ ¤³¤Î¤È¤¡¤w3m¤¬¥µ¡¼¥Ð¤Î¤Õ¤ê¤ò¤·¤Æ¥¹¥¯¥ê¥×¥È¤òµ¯Æ°¤·¡¤¤½¤Î½ÐÎϤò
+ Æɤߤ³¤ó¤Çɽ¼¨¤¹¤ë¤ï¤±¤Ç¤¹¡¥
+-<a href="file:///$LIB/w3mbookmark?mode=panel&bmark=~/.w3m/bookmark.html&url=MANUAL.html&title=w3m+manual">¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ÎÅÐÏ¿</a>¤È
+-<a href="file:///$LIB/w3mhelperpanel?mode=panel">³°Éô¥Ó¥å¡¼¥¢¤ÎÊÔ½¸</a>
++¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ÎÅÐÏ¿¤È³°Éô¥Ó¥å¡¼¥¢¤ÎÊÔ½¸
+ ¤Ï¡¤local CGI¤Î¥¹¥¯¥ê¥×¥È¤È¤·¤Æ¼Â¸½¤µ¤ì¤Æ¤¤¤Þ¤¹¡¥
+ local CGI¤ò»È¤¨¤Ð¡¤w3m¤òÈÆÍѤΥե©¡¼¥àÆþÎÏ¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤È¤·¤Æ
+ »È¤¦¤³¤È¤¬¤Ç¤¤Þ¤¹¡¥
+diff --git a/doc-jp/README b/doc-jp/README
+index 074766f..e5e59b1 100644
+--- a/doc-jp/README
++++ b/doc-jp/README
+@@ -122,7 +122,6 @@ w3m
+ ÅìËÌÂç³Øɱ¡
+ satodai@w3m.jp
+
+-¤´°Õ¸«¡¤¤´´¶ÁÛ¤òML¤Þ¤Ç¤ª´ó¤»¤¯¤À¤µ¤¤¡¥
+- w3m-dev@sic.med.tohoku.ac.jp (ÆüËܸì)
+- w3m-dev-en@sic.med.tohoku.ac.jp (±Ñ¸ì)
++¤´°Õ¸«¡¤¤´´¶ÁÛ¤ò¤ª´ó¤»¤¯¤À¤µ¤¤¡¥
+ http://w3m.sourceforge.net/
++ https://sourceforge.net/projects/w3m/
+diff --git a/doc-jp/README.SSL b/doc-jp/README.SSL
+index 4aedfde..47d5fd6 100644
+--- a/doc-jp/README.SSL
++++ b/doc-jp/README.SSL
+@@ -25,9 +25,9 @@ SSL
+
+ ssl_forbid_method
+ »È¤ï¤Ê¤¤SSL¥á¥½¥Ã¥É¤Î¥ê¥¹¥È(2: SSLv2, 3: SSLv3, t: TLSv1)
+- (¥Ç¥Õ¥©¥ë¥È¤Ï<NULL>).
++ (¥Ç¥Õ¥©¥ë¥È¤Ï2, 3).
+ ssl_verify_server ON/OFF
+- SSL¤Î¥µ¡¼¥Ðǧ¾Ú¤ò¹Ô¤¦(¥Ç¥Õ¥©¥ë¥È¤ÏOFF).
++ SSL¤Î¥µ¡¼¥Ðǧ¾Ú¤ò¹Ô¤¦(¥Ç¥Õ¥©¥ë¥È¤ÏON).
+ ssl_cert_file ¥Õ¥¡¥¤¥ë̾
+ SSL¤Î¥¯¥é¥¤¥¢¥ó¥ÈÍÑPEM·Á¼°¾ÚÌÀ½ñ¥Õ¥¡¥¤¥ë(¥Ç¥Õ¥©¥ë¥È¤Ï<NULL>).
+ ssl_key_file ¥Õ¥¡¥¤¥ë̾
+@@ -85,6 +85,9 @@ SSL
+ #
+ # certdata2pem.rb
+
++if RUBY_VERSION>="1.9"
++ Encoding.default_external="UTF-8"
++end
+ while line = $stdin.gets
+ next if line =~ /^#/
+ next if line =~ /^\s*$/
+diff --git a/doc-jp/README.func b/doc-jp/README.func
+index 542aaa9..8a5f821 100644
+--- a/doc-jp/README.func
++++ b/doc-jp/README.func
+@@ -1,7 +1,7 @@
+ ABORT ³Îǧ¤»¤º¤Ëw3m¤ò½ªÎ»¤·¤Þ¤¹
+ ACCESSKEY Accesskey ¥á¥Ë¥å¡¼¤òΩ¤Á¾å¤²¤Þ¤¹
+-ALARM ¥¢¥é¡¼¥à¤òÀßÄꤷ¤Þ¤¹
+ ADD_BOOKMARK ¸½ºß¸«¤Æ¤¤¤ë¥Ú¡¼¥¸¤ò¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÄɲä·¤Þ¤¹
++ALARM ¥¢¥é¡¼¥à¤òÀßÄꤷ¤Þ¤¹
+ BACK °ì¤ÄÁ°¤Î¥Ð¥Ã¥Õ¥¡¤òɽ¼¨¤·¤Þ¤¹
+ BEGIN ʸ½ñ¤Î¤¤¤Á¤Ð¤ó¾å¤Î¹Ô¤Ë°ÜÆ°¤·¤Þ¤¹
+ BOOKMARK ¥Ö¥Ã¥¯¥Þ¡¼¥¯¤òÆɤ߹þ¤ß¤Þ¤¹
+@@ -36,7 +36,6 @@ GOTO_RELATIVE
+ HELP ¥Ø¥ë¥×¥Õ¥¡¥¤¥ë¤òɽ¼¨¤·¤Þ¤¹
+ HISTORY URLÍúÎò¤òɽ¼¨¤·¤Þ¤¹
+ INFO ¸½ºß¤Îʸ½ñ¤Ë´Ø¤¹¤ë¾ðÊó¤òɽ¼¨¤·¤Þ¤¹
+-INIT_MAILCAP mailcap ¤òºÆÆɤ߹þ¤ß¤·¤Þ¤¹(¼ç¤Ë local-CGI ÍÑ)
+ INTERRUPT ʸ½ñ¤ÎÆɤ߹þ¤ß¤òÃæÃǤ·¤Þ¤¹
+ ISEARCH ¥Õ¥¡¥¤¥ë¤ÎËöÈø¤Ë¤à¤«¤Ã¤Æ¥¤¥ó¥¯¥ê¥á¥ó¥¿¥ë¥µ¡¼¥Á¤·¤Þ¤¹
+ ISEARCH_BACK ¥Õ¥¡¥¤¥ë¤ÎÀèƬ¤Ë¤à¤«¤Ã¤Æ¥¤¥ó¥¯¥ê¥á¥ó¥¿¥ë¥µ¡¼¥Á¤·¤Þ¤¹
+@@ -72,6 +71,7 @@ MSGS
+ NEW_TAB ¿·¤·¤¤¥¿¥Ö¤ò³«¤¤Þ¤¹
+ NEXT ¼¡¤Î¥Ð¥Ã¥Õ¥¡¤òɽ¼¨¤·¤Þ¤¹
+ NEXT_DOWN ¥«¡¼¥½¥ë¤Î²¼Â¦¤Ë¤¢¤ë¥ê¥ó¥¯¤Ë°ÜÆ°¤·¤Þ¤¹
++NEXT_HALF_PAGE Ⱦ¥Ú¡¼¥¸²¼¤Ë¥¹¥¯¥í¡¼¥ë¤·¤Þ¤¹
+ NEXT_LEFT ¥«¡¼¥½¥ë¤Îº¸Â¦¤Ë¤¢¤ë¥ê¥ó¥¯¤Ë°ÜÆ°¤·¤Þ¤¹
+ NEXT_LEFT_UP ¥«¡¼¥½¥ë¤Îº¸Â¦(̵¤±¤ì¤ÐÁ°¤Î¹Ô°ÊÁ°)¤Ë¤¢¤ë¥ê¥ó¥¯¤Ë°ÜÆ°¤·¤Þ¤¹
+ NEXT_LINK ¼¡¤Î¥ê¥ó¥¯¤Ë°ÜÆ°¤·¤Þ¤¹
+@@ -92,6 +92,7 @@ PEEK_LINK
+ PIPE_BUF ¥Ð¥Ã¥Õ¥¡¤ÎÆâÍƤò¥Ñ¥¤¥×¤ËÅϤ·¤Þ¤¹
+ PIPE_SHELL ¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¤·ë²Ì¤òÆɤߤ³¤ß¤Ê¤¬¤éɽ¼¨¤·¤Þ¤¹
+ PREV Á°¤Î¥Ð¥Ã¥Õ¥¡¤òɽ¼¨¤·¤Þ¤¹
++PREV_HALF_PAGE Ⱦ¥Ú¡¼¥¸¾å¤Ë¥¹¥¯¥í¡¼¥ë¤·¤Þ¤¹
+ PREV_LINK Á°¤Î¥ê¥ó¥¯¤Ë°ÜÆ°¤·¤Þ¤¹
+ PREV_MARK °ì¤ÄÁ°¤Î¥Þ¡¼¥¯¤Ë°ÜÆ°¤·¤Þ¤¹
+ PREV_PAGE Á°¤Î¥Ú¡¼¥¸¤òɽ¼¨¤·¤Þ¤¹
+diff --git a/doc-jp/README.siteconf b/doc-jp/README.siteconf
+new file mode 100644
+index 0000000..90066f7
+--- /dev/null
++++ b/doc-jp/README.siteconf
+@@ -0,0 +1,60 @@
++siteconf: ¥µ¥¤¥ÈÊÌ¥«¥¹¥¿¥Þ¥¤¥º
++
++siteconf ¤Ï¡¢ URL ¤Î¥Ñ¥¿¡¼¥ó¤È¡¢¤½¤ì¤ËɳÉÕ¤±¤é¤ì¤¿ÀßÄ꤫¤éÀ®¤ê¤Þ¤¹¡£
++siteconf ¤ò»È¤¦¤È¡¢¥µ¥¤¥ÈËè¤Ëʸ»ú¥³¡¼¥É¤ò»ØÄꤷ¤Æ "decode_url"
++¤Î½ÐÎϤò²þÁ±¤·¤¿¤ê¡¢ Google ¤Î¥ê¥À¥¤¥ì¥¯¥¿¤ò±ª²ó¤·¤ÆÀǽ¤ä
++¥×¥é¥¤¥Ð¥·¡¼¤ò¸þ¾å¤µ¤»¤¿¤ê¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
++
++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï siteconf ¤Ï ~/.w3m/siteconf ¤«¤éÆɤ߹þ¤Þ¤ì¤Þ¤¹¡£
++
++===== ¹½Ê¸ =====
++
++url <url>|/<re-url>/|m@<re-url>@i [exact]
++substitute_url "<destination-url>"
++url_charset <charset>
++no_referer_from on|off
++no_referer_to on|off
++
++¸å¤í¤ÎÊý¤Ë½ñ¤«¤ì¤¿¤â¤Î¤¬Í¥À褵¤ì¤Þ¤¹¡£
++
++===== Îã =====
++
++url "https://twitter.com/"
++substitute_url "https://mobile.twitter.com/"
++
++twitter.com ¤ò¥â¥Ð¥¤¥ë¥µ¥¤¥È¤ËžÁ÷¤·¤Þ¤¹¡£
++
++url "http://your.bookmark.net/"
++no_referer_from on
++
++your.bookmark.net ¤«¤éÄ¥¤Ã¤¿¥ê¥ó¥¯¤òé¤ëºÝ¤Ë¡¢ HTTP referer ¤ò
++Á÷¤é¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£
++
++url "http://www.google.com/url?" exact
++substitute_url "file:///cgi-bin/your-redirector.cgi?"
++
++Google ¤Î¥ê¥À¥¤¥ì¥¯¥¿¤ò local CGI ¤ËžÁ÷¤·¤Þ¤¹¡£
++
++url /^http:\/\/[a-z]*\.wikipedia\.org\//
++url_charset utf-8
++
++Ʊ»þ¤Ë "decode_url" ¥ª¥×¥·¥ç¥ó¤ò¥ª¥ó¤Ë¤¹¤ë¤È¡¢ Wikipedia ¤Ø¤Î
++¥ê¥ó¥¯¤ò UTF-8 ¤È¤·¤Æ¥Ç¥³¡¼¥É¤·¤Æɽ¼¨¤·¤Þ¤¹¡£
++
++===== Àµµ¬É½¸½¤Ë¤Ä¤¤¤Æ =====
++
++¼¡¤ÎÀµµ¬É½¸½¤Ï¤¤¤º¤ì¤âƱ¤¸°ÕÌ£¤òɽ¤·¤Þ¤¹¡£
++
++/http:\/\/www\.example\.com\//
++m/http:\/\/www\.example\.com\//
++m@http://www\.example\.com/@
++m!http://www\.example\.com/!
++
++ºÇ¸å¤Ë 'i' ½¤¾þ»Ò¤òÉÕ¤±¤ë¤È¡¢Âçʸ»ú¾®Ê¸»ú¤ò¶èÊ̤»¤º¤Ë¾È¹ç¤ò¹Ô¤¤¤Þ¤¹¡£
++Î㤨¤Ð¡¢ m@^http://www\.example\.com/abc/@i ¤Ï°Ê²¼¤Î¤¤¤º¤ì¤È¤â°ìÃפ·¤Þ¤¹¡£
++
++http://www.example.com/abc/
++http://www.example.com/Abc/
++http://www.example.com/ABC/
++
++¤¿¤À¤·¡¢¥Û¥¹¥È̾¤ÎÉôʬ¤Ï¾ï¤Ë¾®Ê¸»ú¤ËÊÑ´¹¤·¤Æ¤«¤éÈæ³Ó¤·¤Þ¤¹¡£
+diff --git a/doc-jp/keymap.lynx b/doc-jp/keymap.lynx
+index 869c716..e4085c8 100644
+--- a/doc-jp/keymap.lynx
++++ b/doc-jp/keymap.lynx
+@@ -46,7 +46,7 @@ keymap - PREV_PAGE
+ keymap . RIGHT
+ keymap / SEARCH
+ keymap : MARK_URL
+-keymap ; MARK_WORD
++keymap ";" MARK_WORD
+ keymap < SHIFT_LEFT
+ keymap = INFO
+ keymap > SHIFT_RIGHT
+diff --git a/doc-jp/w3m.1 b/doc-jp/w3m.1
+index 89aacb6..a54e078 100644
+--- a/doc-jp/w3m.1
++++ b/doc-jp/w3m.1
+@@ -1,5 +1,5 @@
+ .\"
+-.TH W3M 1 "Jun 6 2000" "UNIX"
++.TH W3M 1 "2016-04-02" "w3m 0.5.3"
+ .SH NAME
+ .B w3m
+ \- text base pager/WWW browser
+@@ -39,19 +39,10 @@ text/plain
+ ɸ½àÆþÎϤÎÆâÍƤòɽ¼¨¤¹¤ë¤È¤¤ËÊݸ¤µ¤ì¤ëºÇÂç¹Ô¿ô¤ò»ØÄꤹ¤ë¡¥
+ ¥Ç¥Õ¥©¥ë¥È¤Ï10000¡¥
+ .TP
+-.B \-s
+-Shift_JIS¥³¡¼¥É¤Çɽ¼¨¤¹¤ë¡¥
+-.TP
+-.B \-e
+-EUC¥³¡¼¥É¤Çɽ¼¨¤¹¤ë¡¥
+-.TP
+-.B \-j
+-JIS (ISO-2022-JP)¥³¡¼¥É¤Çɽ¼¨¤¹¤ë¡¥
+-.TP
+-.BI \-O\ e|s|j|N|m
++.BI \-O\ ʸ»ú¥³¡¼¥É
+ ɽ¼¨¤Ë»È¤¦Ê¸»ú¥³¡¼¥É¤ò»ØÄꤹ¤ë.
+ .TP
+-.BI \-I\ e|s
++.BI \-I\ ʸ»ú¥³¡¼¥É
+ ÆþÎÏʸ½ñ¤Îʸ»ú¥³¡¼¥É¤ò»ØÄꤹ¤ë¡¥
+ .TP
+ .BI \-T\ ¥¿¥¤¥×
+@@ -90,7 +81,7 @@ Bookmark
+ .B \-F
+ ¥Õ¥ì¡¼¥à¤ò¼«Æ°É½¼¨¤¹¤ë¡¥
+ .TP
+-.B \-S
++.B \-s
+ Ϣ³¤¹¤ë¶õ¹Ô¤ò1¹Ô¤Ë¤Þ¤È¤á¤Æɽ¼¨¤¹¤ë¡¥
+ .TP
+ .B \-X
+@@ -327,13 +318,13 @@ URL
+ .TP
+ .B M
+ ¸½ºß¸«¤Æ¤¤¤ë¥Ú¡¼¥¸¤ò¡¤³°Éô¥Ö¥é¥¦¥¶¤ò»È¤Ã¤Æɽ¼¨¤·¤Þ¤¹¡¥
+-.B 2M, 3M
+-¤Ç2ÈÖÌܤÈ3ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
++.B 2M, 3M, ..., 9M
++¤Ç2ÈÖÌÜ¡¤3ÈÖÌÜ¡¤9ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
+ .TP
+ .B "ESC M"
+ ¸½ºß¤Î¥ê¥ó¥¯Àè¤ò¡¤³°Éô¥Ö¥é¥¦¥¶¤ò»È¤Ã¤Æɽ¼¨¤·¤Þ¤¹¡¥
+-.B "2ESC M", "3ESC M"
+-¤Ç2ÈÖÌܤÈ3ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
++.B "2ESC M", "3ESC M", ..., "9ESC M"
++¤Ç2ÈÖÌÜ¡¤3ÈÖÌÜ¡¤9ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
+ .SS ¥Õ¥¡¥¤¥ë¤ÈURL´Ø·¸¤ÎÁàºî
+ .TP
+ .B U
+diff --git a/doc/FAQ.html b/doc/FAQ.html
+index ed2a704..ca82c67 100644
+--- a/doc/FAQ.html
++++ b/doc/FAQ.html
+@@ -1,291 +1,763 @@
+-<HTML>
+-<HEAD>
+-<TITLE>W3M FAQ</TITLE>
+-</HEAD>
+-<BODY>
+-<p>
+-<center><h1>Frequently Asked Questions and Answers about w3m</h1></center>
+-<div align=right>
+-Akinori Ito<br>
+-aito@fw.ipsj.or.jp<br>
+-Corrected by Tom Berger <tom.be@gmx.net>
+-</div>
+-<p>
+-<b><center><font size=+1><u><a name="index">Index</a></u></font></center></b>
+-<p>
+-<br>
+-<ul>
+-<li><h2><a href="#general">General Questions, How to Get It, Required Environment</a></h2></li>
+-<ul>
+-<li><h3>How do I pronounce "w3m"?</h3>
+-<li><h3>Why is it called "w3m"?</h3>
+-<li><h3>On which platforms does w3m work?</h3>
+-<li><h3>Where can I get more information about w3m?</h3>
+-<li><h3>Is there a mailing list for w3m?</h3>
+-<li><h3>Are there any binary distributions?</h3>
+-</ul>
+-<br>
+-<li><a href="#install"><h2>Compile and Install</h2></a>
+-<br>
+-<li><a href="#command"><h2>Options, Commands, Usage</h2></a>
+-<ul>
+-<li><h3>w3m quits if started without parameters. What's wrong?</h3>
+-<li><h3>w3m starts with black characters on a black screen. How do I change this?</h3>
+-<li><h3>Does w3m support colours?</h3>
+-<li><h3>Does w3m support monochrome display?</h3>
+-<li><h3>How do I shift the display?</h3>
+-<li><h3>How do I move from anchor to anchor?</h3>
+-<li><h3>Netscape displays a word red, but w3m doesn't. Why?</h3>
+-<li><h3>How do I change the colour of anchor-/image-/form links?</h3>
+-<li><h3>w3m doesn't seem to use the variable EDITOR. Why? </h3>
+-<li><h3>How do I quit a search or URL text input?</h3>
+-</ul>
+-<br>
+-<li><a href="#www"><h2>Questions about WWW usage</h2></a>
+-<ul>
+-<li><h3>How do I fill in forms with w3m?</h3>
+-<li><h3>Seems like w3m is slower than Netscape or Lynx. Why?</h3>
+-<li><h3>Loading time doesn't decrease when loading a previously seen page</h3>
+-<li><h3>How do I download a linked file?</h3>
+-<li><h3>How do I specify a proxy server?</h3>
+-<li><h3>w3m freezes when I invoke an external browser.</h3>
+-<li><h3>How do I change the default image viewer?</h3>
+-<li><h3>How do I enter a URL?</h3>
+-<li><h3>w3m appends a URL to the former one despite of having cleared the line with Ctrl-u. What to do?</h3>
+-</ul>
+-<br>
+-<li><a href="#other"><h2>Misc</a></h2>
+-<ul>
+-<li><h3>What is w3m's configuration file?</h3>
+-<li><h3>What are these w3mxxxx files in my ~/.w3m directory for?</h3>
+-</ul>
+-<br>
+-<br>
+-<u><h2><a name="general">General Questions, How to Get It, Required Environment</a></h2></u>
+-<br>
+-<dl>
+-<dt><h3>How do I pronounce "w3m"?</h3>
+-<dd>It's "W-three-M". It doesn't rhyme with "pteranodon".
+-<p>
+-<dt><h3>Why is it called "w3m"?</h3>
+-<dd>It's an abbreviation of "WWW-wo-Miru", which is Japanese for
+-"See the WWW". So in English the name of this browser would be
+-something like "stw3".
+-<p>
+-<dt><h3>On which platforms does w3m work?</h3>
+-<dd>It runs on various versions of Unix, since version 990226 on OS/2 and since
+-version 990303 also on MS-Windows with Cygwin32.
+-<br>
+-Current versions have been confirmed to run on:
+-<ul>
+-<li>SunOS 4.1.x
+-<li>HP-UX 9.x, 10.x
+-<li>Solaris 2.5.x, 2.6, 8
+-<li>Linux 2.0.30
+-<li>FreeBSD 2.2.8, 3.1, 3.2, 4.6
+-<li>NetBSD/macppc, m68k
+-<li>EWS4800 Rel.12.2 Rev.A
+-<li>Digital UNIX: v3.2D, v4.0D
+-<li>IRIX 5.3, IRIX 6.5
+-<li>OS/2 with emx
+-<li>Windows 9x/NT with Cygwin32 b20.1
+-<li>MS-DOS with DJGPP and WATT32 packet driver
+-<li>MacOS X Server
+-<li>MacOS X 10.1, 10.2
+-</ul>
+-<dt><h3>Where can I get more information about w3m?</h3>
+-<dd>At the <a href="http://w3m.sourceforge.net/index.en.html">English w3m home page</a>.
+-<dt><h3>Is there a mailing list for w3m?</h3>
+-<dd>There is a mailing list for developpers (w3m-dev-en). Please see
+-<a href="http://w3m.sourceforge.net/index.en.html">w3m page</a>
+-for details. You may also mail your comments to <a href="mailto:aito@fw.ipsj.or.jp">the author</a>.
+-<dt><h3>Are there any binary distributions?</h3>
+-<dd>So far there are only binaries for the win/cygnus32 version. You can get
+-them from <a href="http://prdownloads.sourceforge.net/w3m/">here</a>.
+-Contact <a href="mailto:aito@fw.ipsj.or.jp">the author</a> if you want to contribute binaries for other platforms.
+-</dd>
+-</dl>
+-<br>
+-<div align=right>
+-<i>Up to <a href="#index">index</a></i>
+-</div>
+-<br>
+-<u><h2><a name="install">Compile and Install</a></h2></u>
+-No problem :-)
+-<u><h2><a name="command">Options, Commands, Usage</a></h2></u>
+-<br>
+-<dl>
+-<dt><h3>w3m quits if started without parameters. What's wrong?</h3>
+-<dd>w3m is a <b>pager</b>. Therefore it just quits when invoked without any
+-arguments. Possible arguments are:
+-<ol>
+-<li>A filename or an URL
+-<li>Pipe from standard input
+-<li>The -B option (Show bookmark file)
+-<li>The -v option (visual startup)
+-<li>From a specified HTTP_HOME or WWW_HOME variable
+-</ol>
+-<p>
+-<dt><h3>w3m starts with black characters on black background. How do I change
+-this?</h3>
+-<dd>
+-When compiled with colour support, w3m assumes a white background and therefore
+-displays black characters.
+-<br>
+-You may either change the background colour of your terminal (e.g. with the -bg
+-option in a xterm) or take these steps:
+-<ul>
+-<li>invoke w3m with 'w3m -M' (for monochrome),
+-<li>type 'o' for getting to the options screen
+-<li><b>Mark 'Display with colour' as ON</b> and choose an arbitrary colour.
+-Click on [OK].
+-</ul>
+-<p>
+-<dt><h3>Does w3m support colours?</h3>
+-<dd>Yes. When you run './configure', answer the question
+-<p>
++<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
++<html>
++ <head>
++ <style>
++ span.mono {
++ font-family:mono;
++ }
++ </style>
++ <meta http-equiv=content-type content="text/html;charset=US-ASCII">
++ <title>W3M FAQ</title>
++ </head>
++ <body>
++ <h1 align="center">
++ Frequently Asked Questions and Answers about w3m
++ </h1>
++ <p align="right">
++ Akinori Ito <aito@fw.ipsj.or.jp><br>
++ Corrected by Tom Berger <tom.be@gmx.net>
++ </p>
++ <h2 id="index">
++ <u>
++ Index
++ </u>
++ </h2>
++ <ul>
++ <li>
++ <a href="#general">
++ <b>
++ General Questions, How to Get It, Required Environment
++ </b>
++ </a>
++ </li>
++ <ul>
++ <li>
++ <b>
++ How do I pronounce <q>w3m</q>?
++ </b>
++ </li>
++ <li>
++ <b>
++ Why is it called <q>w3m</q>?
++ </b>
++ </li>
++ <li>
++ <b>
++ On which platforms does w3m work?
++ </b>
++ </li>
++ <li>
++ <b>
++ Where can I get more information about w3m?
++ </b>
++ </li>
++ <li>
++ <b>
++ Is there a mailing list for w3m?
++ </b>
++ </li>
++ <li>
++ <b>
++ Are there any binary distributions?
++ </b>
++ </li>
++ </ul>
++ <li>
++ <a href="#install">
++ <b>
++ Compile and Install
++ </b>
++ </a>
++ </li>
++ <li>
++ <a href="#command">
++ <b>
++ Options, Commands, Usage
++ </b>
++ </a>
++ </li>
++ <ul>
++ <li>
++ <b>
++ w3m quits if started without parameters. What's wrong?
++ </b>
++ </li>
++ <li>
++ <b>
++ w3m starts with black characters on a black background. How do
++ I change this?
++ </b>
++ </li>
++ <li>
++ <b>
++ Does w3m support colors?
++ </b>
++ </li>
++ <li>
++ <b>
++ Does w3m support monochrome displays?
++ </b>
++ </li>
++ <li>
++ <b>
++ How do I shift the display?
++ </b>
++ </li>
++ <li>
++ <b>
++ How do I move between hyperlinks?
++ </b>
++ </li>
++ <li>
++ <b>
++ Graphical browsers display a word red, but w3m doesn't. Why?
++ </b>
++ </li>
++ <li>
++ <b>
++ How do I change the colors for hyperlinks, images and form fields?
++ </b>
++ </li>
++ <li>
++ <b>
++ w3m doesn't seem to use the variable EDITOR. Why?
++ </b>
++ </li>
++ <li>
++ <b>
++ How do I quit a search or URL text input?
++ </b>
++ </li>
++ </ul>
++ <li>
++ <a href="#www">
++ <b>
++ Questions about WWW usage
++ </b>
++ </a>
++ </li>
++ <ul>
++ <li>
++ <b>
++ How do I fill in forms with w3m?
++ </b>
++ </li>
++ <li>
++ <b>
++ Seems like w3m is slower than some other browsers. Why?
++ </b>
++ </li>
++ <li>
++ <b>
++ Loading time doesn't decrease when loading a previously seen
++ page.
++ </b>
++ </li>
++ <li>
++ <b>
++ How do I download a linked file?
++ </b>
++ </li>
++ <li>
++ <b>
++ How do I specify a proxy server?
++ </b>
++ </li>
++<!-- deleted, see mail dated Mon, 04 Apr 2016 20:50:27 +0900 (JST)
++from Tatsuya Kinoshita <tats@debian.org>
++ <li>
++ <b>
++ w3m freezes when I invoke an external browser.
++ </b>
++ </li>
++-->
++ <li>
++ <b>
++ How do I change the default image viewer?
++ </b>
++ </li>
++ <li>
++ <b>
++ How do I enter a URL?
++ </b>
++ </li>
++ <li>
++ <b>
++ w3m appends a URL to the former one even when I clear the line
++ with <span class="mono">CTRL-u</span>. What should I do?
++ </b>
++ </li>
++ </ul>
++ <li>
++ <a href="#other">
++ <b>
++ Miscellaneous
++ </b>
++ </a>
++ </li>
++ <ul>
++ <li>
++ <b>
++ What is w3m's configuration file?
++ </b>
++ </li>
++ <li>
++ <b>
++ What are these w3mxxxx files in my ~/.w3m directory for?
++ </b>
++ </li>
++ </ul>
++ </ul>
++ <h2 id="general">
++ <u>
++ General Questions, How to Get It, Required Environment
++ </u>
++ </h2>
++ <dl>
++ <dt>
++ <b>
++ How do I pronounce <q>w3m</q>?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ It's <q>W-three-M</q>. It doesn't rhyme with <q>pteranodon</q>.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Why is it called <q>w3m</q>?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ It's an abbreviation of <q>WWW-wo-Miru</q>, which is Japanese
++ for <q>See the WWW</q>. So in English the name of this browser
++ would be something like <q>stw3</q>.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ On which platforms does w3m work?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ It runs on various versions of Unix, since version 990226 on OS/2
++ and since version 990303 also on MS-Windows with Cygwin32.
++ </p>
++ <p>
++ More recent versions have been confirmed to run on:
++ </p>
++ <ul>
++ <li>
++ SunOS 4.1.x
++ </li>
++ <li>
++ HP-UX 9.x, 10.x
++ </li>
++ <li>
++ Solaris 2.5.x, 2.6, 8
++ </li>
++ <li>
++ Linux 2.0.1 to 3.17
++ </li>
++ <li>
++ FreeBSD 2.2.8, 3.1, 3.2, 4.6
++ </li>
++ <li>
++ NetBSD/macppc, m68k
++ </li>
++ <li>
++ EWS4800 Rel.12.2 Rev.A
++ </li>
++ <li>
++ Digital UNIX: v3.2D, v4.0D
++ </li>
++ <li>
++ IRIX 5.3, IRIX 6.5
++ </li>
++ <li>
++ OS/2 with emx
++ </li>
++ <li>
++ Windows 9x/NT with Cygwin32 b20.1
++ </li>
++ <li>
++ MS-DOS with DJGPP and WATT32 packet driver
++ </li>
++ <li>
++ MacOS X Server
++ </li>
++ <li>
++ MacOS X 10.1, 10.2
++ </li>
++ </ul>
++ </dd>
++ <dt>
++ <b>
++ Where can I get more information about w3m?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ At the
++ <a href="http://w3m.sourceforge.net/index.en.html">English w3m
++ home page</a>.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Is there a mailing list for w3m?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ There is a mailing list for developers (w3m-dev-en). Please see
++ the <a href="http://w3m.sourceforge.net/index.en.html">w3m home
++ page</a> for details. You may also mail your comments to
++ <a href="mailto:aito@fw.ipsj.or.jp">the author</a>.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Are there any binary distributions?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ So far there are only binaries for the win/cygnus32 version.
++<!--
++ You can get them from
++ <a href="http://prdownloads.sourceforge.net/w3m/">here</a>.
++!-->
++ Contact <a href="mailto:aito@fw.ipsj.or.jp">the author</a> if you
++ want to contribute binaries for other platforms.
++ </p>
++ </dd>
++ </dl>
++ <p align="right">
++ <i>
++ Up to <a href="#index">index</a>
++ </i>
++ </p>
++ <h2 id="install">
++ <u>
++ Compile and Install
++ </u>
++ </h2>
++ <p>
++ No problem :-)
++ </p>
++ <h2 id="command">
++ <u>
++ Options, Commands, Usage
++ </u>
++ </h2>
++ <dl>
++ <dt>
++ <b>
++ w3m quits if started without parameters. What's wrong?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ w3m is a <b>pager</b>. Therefore it just quits when invoked
++ without any arguments. It keeps running
++ </p>
++ <ul>
++ <li>
++ with a filename or URL as argument
++ </li>
++ <li>
++ with data piped from standard input
++ </li>
++ <li>
++ when invoked with option -B to show the bookmark file
++ </li>
++ <li>
++ when invoked with option -v to welcome users with a built-in page
++ </li>
++ <li>
++ with specified HTTP_HOME or WWW_HOME variable
++ </li>
++ </ul>
++ </dd>
++ <dt>
++ <b>
++ w3m starts with black characters on a black background. How do I
++ change this?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ When compiled with color support, w3m assumes a white background
++ and therefore displays black characters.
++ </p>
++ <p>
++ You may either change the background color of your terminal
++ (e.g. with the -bg option in a xterm) or take these steps
++ </p>
++ <ol>
++ <li>
++ invoke monochrome mode of w3m with <span class="mono">w3m -M</span>
++ </li>
++ <li>
++ type <q>o</q> to get to the options setting panel
++ </li>
++ <li>
++ mark <q>Display with color</q> as <q>YES</q> and choose an
++ arbitrary color
++ </li>
++ <li>
++ click on [OK].
++ </li>
++ </ol>
++ </dd>
++ <dt>
++ <b>
++ Does w3m support colors?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Yes. When you run <q>./configure</q>, answer the question
++ </p>
+ <pre>
+-Let's do some configurations. Choose config option among the list."
++ Let's do some configurations. Choose config option among the list.
+
+-1 - Baby model (no color, no menu, no mouse, no cookie, no SSL)
+-2 - Little model (color, menu, no mouse, no cookie, no SSL)
+-3 - Mouse model (color, menu, mouse, no cookie, no SSL)
+-4 - Cookie model (color, menu, mouse, cookie, no SSL)
+-5 - Monster model (with everything; you need openSSL library)
+-6 - Customize
+-Which?
++ 1 - Baby model (no color, no menu, no mouse, no cookie, no SSL)
++ 2 - Little model (color, menu, no mouse, no cookie, no SSL)
++ 3 - Mouse model (color, menu, mouse, no cookie, no SSL)
++ 4 - Cookie model (color, menu, mouse, cookie, no SSL)
++ 5 - Monster model (with everything; you need openSSL library)
++ 6 - Customize
++ Which?
+ </pre>
+-<p>
+-with 2,3,4 or 5.
+-<p>
+-<dt><h3>Does w3m support monochrome display?</h3>
+-<dd>Yes. You may either
+-<ol>
+-<li>Answer the above mentioned 'configure' question with 1, or
+-<li>Invoke w3m with the -M option, or
+-<li>Type 'o' within w3m to enter the options screen and turn off colour display
+-mode.
+-</ol>
+-<dt><h3>How do I shift the display?</h3>
+-<dd>You can shift the display by moving the cursor to the edge of the screen. You
+-may also use the ">"/"<" or "."/"," keys.
+-<br>
+-Another idea would be adjusting the xterm with the -geometry option (e.g.
+-something like 'xterm -geometry 110x45 -bg white -name w3m -e w3m -B').
+-<dt><h3>How do I move from anchor to anchor?</h3>
+-<dd>You can move to the next anchor using TAB. ESC TAB moves cursor to the previous anchor.
+-<p>
+-<dt><h3>Netscape displays a word red, but w3m doesn't. Why?</h3>
+-<dd>w3m doesn't support <FONT COLOR=".."> tags. It won't be impossible to implement this, but I think it would make the document more difficult to read.
+-<p>
+-<dt><h3>How do I change the colour of anchor-/image-/form links?</h3>
+-<dd>Type 'o' within w3m to get the 'options' screen. You can change these
+-settings there.
+-<dt>
+-<dt><h3>w3m doesn't seem to use the variable EDITOR. Why? </h3>
+-<dd><dd>Go to the 'options' screen using the "o" key. Any entry in the 'Editor' field will override the environment variable.
+-<br>
+-If you want to use the editor specified by EDITOR blank the field and push [OK].
+-<p>
+-<dt><h3>How do I quit a search or URL text input?</h3>
+-<dd>Clear input text using Ctrl-u and hit RETURN.
+-</dd>
+-</dl>
+-<br>
+-<div align=right>
+-<i>Up to <a href="#index">index</a></i>
+-</div>
+-<br>
+-<u><h2><a name="www">Questions about WWW usage</a></h2></u>
+-<br>
+-<dl>
+-<dt><h3>How do I fill in forms with w3m?</h3>
+-<dd>Form input fields are displayed in red (or reverse). Move the cursor to
+-them and hit RETURN. Then,
+-<ul>
+-<li>if it is a text input field, put in your text on the bottom line,
+-<li>if it is a radiobutton or checkbox, that item is selected,
+-<li>if it is a textarea, an editor is spawned,
+-<li>if it is 'submit' or 'reset', well, just do it.
+-</ul>
+-<dt><h3>Seems like w3m is slower than Netscape or Lynx. Why?</h3>
+-<dd>w3m renders a HTML document in two passes. Therefore it displays the documentnot before having read the entire document.
+-<br>
+-Netscape or Lynx display the document before having read the whole page,
+-and therefore seem faster.
+-<p>
+-<dt><h3>Loading time doesn't decrease when loading a previously seen page</h3>
+-<dd>w3m doesn't have its own cache. Therefore, it reads the document
+-from the server each time it accesses it. If possible, use a cache server.
+-<p>
+-<dt><h3>How do I download a linked file?</h3>
+-<dd>Use 'a' (or 'd' with Lynx-like keybindings) or ESC RET. If you want to download an inline image, use ESC 'I'.
+-<p>
+-<dt><h3>How do I specify a proxy server?</h3>
+-<dd>Set the environment variable HTTP_PROXY or use the option setting panel
+-("o" key). For example, if you want to use port 8000 of proxy.hogege.com, specify
+-<p>
+-<pre>
+- http://proxy.hogege.com:8000/
+-</pre>
+-<p>
+-<dt><h3>w3m freezes when I invoke an external browser.</h3>
+-<dd>Enter w3m's option screen using the 'o' key and specify
+-<p>
+-<pre>
+- netscape %s &
+-</pre>
+-<p>
+-(if you are using netscape).
+-<p>
+-<dt><h3>How do I change the default image viewer?</h3>
+-<dd>By default w3m uses xv to view images. If you want to change it into, let's say, 'display', add the following line to ~/.w3m/mailcap or /etc/mailcap.
+-<p>
++ <p>
++ with 2, 3, 4, or 5.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Does w3m support monochrome displays?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Yes. You may either
++ </p>
++ <ul>
++ <li>
++ Answer the above-mentioned <q>configure</q> question with 1,
++ or
++ </li>
++ <li>
++ Invoke w3m with the -M option, or
++ </li>
++ <li>
++ Type <q>o</q> within w3m to enter the options setting panel and turn
++ off color display mode.
++ </li>
++ </ul>
++ </dd>
++ <dt>
++ <b>
++ How do I shift the display?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ You can shift the display by moving the cursor to the edge of
++ the screen. You may also use the following commands
++ </p>
++ <ul>
++ <li>SHIFT_LEFT and SHIFT_RIGHT, bound to the keys <span class="mono">></span> and <span class="mono"><</span></li>
++ <li>SHIFT_LEFT1 and SHIFT_RIGHT1, bound to the keys <span class="mono">.</span> and <span class="mono">,</span></li>
++ </ul>
++ <p>
++ Another idea would be adjusting the xterm with the -geometry
++ option e.g. something like
++ </p>
++ <pre> xterm -geometry 110x45 -bg white -name w3m -e w3m -B</pre>
++ </dd>
++ <dt>
++ <b>
++ How do I move between hyperlinks?
++ </b>
++ </dt>
++ <dd>
++ <p>
++
++ You can move to the next hyperlink
++ using <span class="mono">TAB</span>. <span class="mono">ESC
++ TAB</span> moves the cursor to the previous hyperlink. (see
++ Section <a href="MANUAL.html#Functions" target="_blank">
++ Functions and Key bindings</a> of w3m's manual)
++
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Graphical browsers display a word red, but w3m doesn't. Why?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ w3m doesn't support the attribute COLOR="..." of HTML. It wouldn't
++ be impossible to implement this, but I think it would make
++ documents more difficult to read.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ How do I change the colors for hyperlinks, images and form fields?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Type <q>o</q> within w3m to get the options panel. You
++ can change these settings there.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ w3m doesn't seem to use the variable EDITOR. Why?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Go to the options setting panel using the <q>o</q> key. Any
++ entry in the <q>Editor</q> field overrides the environment
++ variable.
++ </p>
++ <p>
++ If you want to use the editor specified by EDITOR, blank the
++ field and save the settings using the button [OK].
++ </p>
++ </dd>
++ <dt>
++ <b>
++ How do I quit a search or URL text input?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Clear input text using <span class="mono">CTRL-u</span> and hit <span class="mono">RETURN</span>.
++ </p>
++ </dd>
++ </dl>
++ <p align="right">
++ <i>
++ Up to <a href="#index">index</a>
++ </i>
++ </p>
++ <h2 id="www">
++ <u>
++ Questions about WWW usage
++ </u>
++ </h2>
++ <dl>
++ <dt>
++ <b>
++ How do I fill in forms with w3m?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Form input fields are displayed in red (or reverse). Move the
++ cursor to them. Then, if it is
++ </p>
++ <ul>
++ <li>
++ a text input field, hit <span class="mono">RETURN</span>
++ put in your text on the bottom line. Press
++ <span class="mono">RETURN</span> again
++ </li>
++ <li>
++ a radiobutton or checkbox, pressing
++ <span class="mono">RETURN</span> changes or toggles the selection
++ </li>
++ <li>
++ a textarea, pressing
++ <span class="mono">RETURN</span> spawns an editor
++ </li>
++ <li>
++ a <q>submit</q> or <q>reset</q> field,
++ the respective action is performed.
++ </li>
++ </ul>
++ </dd>
++ <dt>
++ <b>
++ Seems like w3m is slower than some other browsers. Why?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ w3m renders a HTML document in two passes. Therefore it doesn't
++ start to display the document until it has finished reading it.
++ </p>
++ <p>
++ Most other browsers display the document before having read the
++ whole page, and therefore seem faster.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ Loading time doesn't decrease when loading a previously seen
++ page.
++ </b>
++ </dt>
++ <dd>
++ <p>
++ w3m doesn't have its own cache. Therefore, it reads the document
++ from the server each time it accesses it. If possible, use a
++ cache server.
++ </p>
++ </dd>
++ <dt>
++ <b>
++ How do I download a linked file?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Use <q>a</q> (or <q>d</q> with Lynx-like keybindings) or
++ <span class="mono">ESC RET</span>.
++ If you want to download an inline image, use
++ <span class="mono">ESC I</span>. (see
++ Section <a href="MANUAL.html#Functions" target="_blank">
++ Functions and Key bindings</a> of w3m's manual)
++ </p>
++ </dd>
++ <dt>
++ <b>
++ How do I specify a proxy server?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Set the environment variables HTTP_PROXY, HTTPS_PROXY, GOPHER_PROXY
++ and FTP_PROXY, or use the options setting panel (<q>o</q> key). For
++ example, if you want to use port 8000 of proxy.example.org, specify
++ </p>
++ <pre> http://proxy.example.org:8000/</pre>
++ </dd>
++<!-- deleted, see mail dated Mon, 04 Apr 2016 20:50:27 +0900 (JST)
++from Tatsuya Kinoshita <tats@debian.org>
++ <dt>
++ <b>
++ w3m freezes when I invoke an external browser.
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Enter w3m's option screen using the <q>o</q> key and specify
++ </p>
++ <pre> firefox %s &</pre>
++ <p>
++ (if you are using Firefox). Note that %s is replaced with the URL
++ when invoking.
++ </p>
++ </dd>
++ -->
++ <dt>
++ <b>
++ How do I change the default image viewer?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ By default w3m uses xv to view images. If you want to change it
++ into, let's say, <q>display</q>, add the following line to
++ ~/.w3m/mailcap or /etc/mailcap:
++ </p>
+ <pre>
+-image/*; display %s
++ image/*; display %s
+ </pre>
+-<p>
+-You can specify external viewers of other file types as well:
+-<p>
++ <p>
++ You can specify external viewers of other file types as well:
++ </p>
+ <pre>
+-image/*; display %s
+-application/postscript; ghostview %s
+-application/x-dvi; xdvi %s
++ image/*; display %s
++ application/postscript; ghostview %s
++ application/x-dvi; xdvi %s
+ </pre>
+-<dt><h3>How do I enter a URL?</h3>
+-<dd>Type SHIFT-U
+-<p>
+-<dt><h3>w3m appends a URL to the former one despite of having cleared the line
+-with Ctrl-u. What to do?</h3>
+-<dd>Enter the <i>complete</i> adress, e.g. http://www.slashdot.org.
+-</dd>
+-</dl>
+-<br>
+-<div align=right>
+-<i>Up to <a href="#index">index</a></i>
+-</div>
+-<br>
+-<u><h2><a name="other">Miscellaneous</a></h2></u>
+-<br>
+-<dl>
+-<dt><h3>What is w3m's configuration file?</h3>
+-<dd>It is ~/.w3m/config.
+-With this file, you can adjust w3m's behavior by changing values of options
+-that are described to be varied with the option setting panel.
+-Each line contains setting for one option, which is a pair of an option name
+-and its value with a space as a separator.
+-<p>
+-<dt><h3>What are these w3mxxxx files in my ~/.w3m directory for?</h3>
+-<dd>These are temporary files used by w3m when reading documents from a
+-WWW server. They are not cache files and are usually deleted when w3m is
+-terminated. If there remain any temp files, please remove them by yourself.
+-<p>
+-</dd>
+-</dl>
+-<br>
+-<div align=right>
+-<i>Up to <a href="#index">index</a></i>
+-</div>
+-<br>
+-</BODY>
+-</HTML>
++ </dd>
++ <dt>
++ <b>
++ How do I enter a URL?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Type <span class="mono">U</span>
++ </p>
++ </dd>
++ <dt>
++ <b>
++ w3m appends a URL to the former one even when I clear the line
++ with <span class="mono">CTRL-u</span>. What should I do?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ Enter the <i>complete</i> address, e.g. http://www.slashdot.org.
++ </p>
++ </dd>
++ </dl>
++ <p align="right">
++ <i>
++ Up to <a href="#index">index</a>
++ </i>
++ </p>
++ <h2 id="other">
++ <u>
++ Miscellaneous
++ </u>
++ </h2>
++ <dl>
++ <dt>
++ <b>
++ What is w3m's configuration file?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ It is ~/.w3m/config.
++ </p>
++
++ <p>
++ With this file, each user can adjust w3m's behavior by changing
++ the values of options whose effects are described in the options
++ setting panel. Each line contains one option setting, consisting
++ of an option name and its value with a space as a separator.
++ </p>
++
++ <p>Without a user-specific configuration file, w3m honours
++ the system wide configuration file /etc/w3m/config.
++ </p>
++
++ </dd>
++ <dt>
++ <b>
++ What are these w3mxxxx files in my ~/.w3m directory for?
++ </b>
++ </dt>
++ <dd>
++ <p>
++ These are temporary files used by w3m when reading documents
++ from a WWW server. They are not cache files and are usually
++ deleted when w3m is terminated. If any temp files are left
++ behind, please remove them yourself.
++ </p>
++ </dd>
++ </dl>
++ <p align="right">
++ <i>
++ Up to <a href="#index">index</a>
++ </i>
++ </p>
++ </body>
++</html>
+diff --git a/doc/HISTORY b/doc/HISTORY
+index b8f5b94..7f7ae2b 100644
+--- a/doc/HISTORY
++++ b/doc/HISTORY
+@@ -588,7 +588,7 @@ From: Okabe Katsuya <okabek@guitar.ocn.ne.jp>
+ * space characters in a buffer are mapped into 0x80-0x9f.
+ * unprintable characters (0x80-0xa0) are displayed as \xxx.
+
+-From: Tsutomu Okada (^[$B2,ED^[(B ^[$BJY^[(B) <okada@furuno.co.jp>
++From: Tsutomu Okada <okada@furuno.co.jp>
+ Subject: [w3m-dev 01354] minimize when #undef USE_GOPHER or USE_NNTP
+
+ 2000/11/16
+@@ -1422,7 +1422,7 @@ HTML4.0 ID attribute support.
+
+ From: Okabe Katsuya <okabe@fphy.hep.okayama-u.ac.jp>
+ table get weird when it contains <input type=hidden>.
+-^[$B=$@5!%^[(B
++Fixed.
+
+ 2000.2.12
+ From: Rogue Metal - Jake Moorman <roguemtl@stampede.org>
+@@ -1649,15 +1649,15 @@ From: patakuti
+ If an <input type=button> tag has no `name' attribute,
+ w3m adds it an inappropriate name attribute.
+
+-From: ^[$B$d$^^[(B
++From: Yama
+ Now w3m can handle a frameset that has both ROWS and COLS.
+
+ From: aito
+ Now bookmarking is done by a separate command w3mbookmark.
+
+-C-s ^[$B$G2hLLI=<($,;_$^$C$F$$$?%P%0$N=$@5!%^[(B
++Bug fix that C-s hangs.
+
+-^[$BJ8;zF~NO;~$K^[(B C-g ^[$B$GCf;_$G$-$k$h$&$K$7$?!%^[(B
++Enable C-g to quit for keyboard input.
+
+ From: hovav@cs.stanford.edu
+ When downloading a file, an attempt to save it to a non-exist
+@@ -1699,7 +1699,7 @@ Menu behavior is changed.
+ * Clicking outside the menu causes cancellation of sub-menu.
+ * <, >, +, - abandoned
+
+-From: ^[$B$*$+$@^[(B <okada@furuno.co.jp>
++From: Okada <okada@furuno.co.jp>
+ Now C-a/C-e are bound to 'jump to the first/last item in menu.'
+
+ From: "OMAE, jun" <jun-o@osb.att.ne.jp>
+diff --git a/doc/MANUAL.html b/doc/MANUAL.html
+index aff0189..f0710a7 100644
+--- a/doc/MANUAL.html
++++ b/doc/MANUAL.html
+@@ -1,535 +1,2424 @@
+-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
++<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+ <html>
+-<head><title>w3m manual</title>
+-</head>
+-<body>
+-<h1>w3m MANUAL</h1>
+-<div align=right>
+-Akinori Ito<br>
+-aito@fw.ipsj.or.jp
+-</div>
+-<h2>Index</h2>
+-<menu>
+-<li><a href="#Introduction">Introduction</a>
+-<li><a href="#Options">Options</a>
+-<li><a href="#Color">Document color</a>
+-<li><a href="#Key:orig">Key binding</a>
+-<li><a href="#Key:lynx">Lynx-like key binding</a>
+-<li><a href="#Mouse">Mouse operation</a>
+-<li><a href="#Key:custom">Key customization</a>
+-<li><a href="#LocalCGI">Local CGI</a>
+-</menu>
+-
+-<hr>
+-<a name="Introduction"></a>
+-<h2>Introduction</h2>
+-w3m is a pager/text-based WWW browser. You can browse local documents and/or
+-documents on the WWW using a terminal emulator.
+-
+-<hr>
+-<a name="Options"></a>
+-<h2>Options</h2>
+-
+-Command line usage is
+-<p>
++ <head>
++ <title>w3m manual</title>
++ <style>
++ span.mono {
++ font-family:mono;
++ }
++ </style>
++ <meta http-equiv="content-type" content="text/html;charset=UTF-8">
++ </head>
++ <body>
++ <!--
++insertions tagged with "mh 2016-03-29" and "mh 2016-06-11" come from the latest version of manual page w3m (1)
++ -->
++
++ <h1>w3m MANUAL</h1>
++ <div align="right">
++ Akinori Ito<br>
++ aito@fw.ipsj.or.jp
++ </div>
++ <h2>Index</h2>
++ <ul>
++ <li>
++ <a href="#Introduction">
++ Introduction
++ </a>
++ </li>
++ <li>
++ <a href="#Options">
++ Options
++ </a>
++ </li>
++ <li>
++ <a href="#Color">
++ Document Colors
++ </a>
++ </li>
++ <li>
++ <a href="#Functions">
++ Functions and Key bindings
++ </a>
++ </li>
++<!-- mh 2016-06-13 obsolete
++ <li>
++ <a href="#Key:lynx">
++ Lynx-like key bindings
++ </a>
++ </li>
++-->
++ <li>
++ <a href="#Mouse">
++ Mouse Operation
++ </a>
++ </li>
++<!-- mh 2016-06-13 obsolete
++ <li>
++ <a href="#Key:custom">
++ Key customization
++ </a>
++ </li>
++ -->
++ <li>
++ <a href="#LocalCGI">
++ Local CGI scripts
++ </a>
++ </li>
++ </ul>
++ <hr>
++ <h2 id="Introduction">
++ Introduction
++ </h2>
++ <p>
++ w3m is a pager/text-based WWW browser. You can browse local
++ documents and/or documents on the WWW using a terminal emulator.
++ </p>
++ <hr>
++ <h2 id="Options">
++ Options
++ </h2>
++ <p>
++ Command line usage is
++ </p>
++<!-- mh 2016-08-06 invocation adapted to w3m(1). w3m accepts several options and several targets -->
+ <pre>
+- w3m [options] [file|URL]
++ w3m [option]... [file|URL]...
+ </pre>
+-<P>
+-If you specify filenames/URLs on command line, these documents are displayed.
+-If you specify nothing, w3m reads a document from standard input and display it.
+-If no filename and/or URLs are specified and standard input is tty, w3m terminates
+-without displaying anything.
++ <p>
++ If you specify filenames/URLs on the command line, these documents
++ are displayed. If you specify nothing, w3m will read a document
++ from standard input and display it. If it doesn't find a document
++ there either then normally w3m will terminate.
++ </p>
++ <p>
++ Options include:
++ </p>
++ <dl>
++<h3>General options</h3>
++ <dt>
++ -B
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ with no other target defined, use the bookmark page for startup
++ </p>
++ </dd>
++ <dt>
++ -M
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ monochrome display
++ </p>
++ </dd>
++ <dt>
++ -no-mouse
++ </dt>
++ <dd>
++ <p>
++ deactivate mouse support.
++ </p>
++ </dd>
++ <dt>
++ -num
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ display each line's number
+
+-<p>
+-Options are as follows:
+-<dl>
+-<dt>+<line number>
+-<dd>Move to the specified line.
+-<dt>-t width
+-<dd>Specify tab width. Default is 8.
+-<dt>-r
+-<dd>When displaying text/plain document, prohibit emphasis using backspace.
+-If you don't specify this option,
+-``A^H_'' is interpreted as underlined character and ``A^HA'' as a bold character.
+-<dt>-l number
+-<dd>Specify line number preserved internally when reading text/plain document
+-fron standard input. Default is 10000.
+-<dt>-s
+-<dd>Display documents with Shift_JIS code.
+-<dt>-e
+-<dd>Display documents with EUC_JP code.
+-<dt>-j
+-<dd>Display documents with ISO-2022-JP code.
+-<dt>-T type
+-<dd>Specify document type. Without this option, document type
+-is determined from extension of a file. If the determination
+-fails, the document is regarded as text/plain.
+-<p>
+-Example:<br>
+-Read HTML document from standard input and display it
++ </p>
++ </dd>
++<!-- mh 2016-08-06 commented out. As implementation is not verified.
++ <dt>
++ -ppc <i>num</i>
++ </dt>
++ <dd>
++ <p>
++ width of <i>num</i> pixels per character. Range of 4.0 to 32.0,
++ default 8.0. Larger values will make tables
++ narrower. (Implementation not verified)
++ </p>
++ </dd>
++-->
++ <dt>
++ -v
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ with no other target defined, welcome users with a built-in page
++ </p>
++ </dd>
++ <dt>
++ -W
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ toggle wrapping mode in searches
++ </p>
++ </dd>
++ <dt>
++ -X
++ </dt>
++ <dd>
++ <p>
++ upon exit, do not reinitialize the terminal.
++ </p>
++ </dd>
++ <dt>
++ +<i>num</i>
++ </dt>
++ <dd>
++ <p><!--mh 2016-06-11 -->
++ go to line <i>num</i>; only effective for numbers larger
++ than the number of lines in the terminal
++ </p>
++ </dd>
++<h3>Browser options</h3>
++ <dt>
++ -cols <i>num</i>
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-06-11 -->
++ with stdout as destination; HTML is rendered to lines of <i>num</i>
++ characters
++ </p>
++ </dd>
++ <dt>
++ -cookie
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ use stored cookies and accept new ones
++ </p>
++ </dd>
++ <dt>
++ -no-cookie
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ neither use stored cookies nor accept new ones
++
++ </p>
++ </dd>
++ <dt>
++ -F
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ render frames
++ </p>
++ </dd>
++ <dt>
++ -no-graph
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ do not use graphic characters for drawing HTML table and frame
++ borders
++ </p>
++ </dd>
++ <dt>
++ -header <i>string</i>
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ append <i>string</i> to the HTTP(S) request. Expected to match
++ the header syntax <span class="mono">"Variable: Value"</span>
++ </p>
++ </dd>
++ <dt>
++ -m
++ </dt>
++ <dd>
++ <p>
++ display document using <q>Internet message mode</q>. With this
++ option, w3m determines document type from header information.
++ This is useful when reading e-mail or Usenet news posts.
++<!-- mh 2016-03-29
++Render the body of Usenet messages according to the header <q>Content-type</q>
++-->
++ </p>
++ </dd>
++ <dt>
++ -no-proxy
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-06-11-->
++ do not use proxy
++ </p>
++ </dd>
++ <dt>
++ -post <i>file</i>
++ </dt>
++ <dd>
++ <p><!--funktionierend 2016-06-28T08:22>-->
++ use POST method to upload data defined in <i>file</i>. The
++ syntax to be used is <span class="mono">"var1=value1[&var2=value2]â¦"</span>
++ </p>
++ </dd>
++<h3>Text pager options</h3>
++ <dt>
++ -l <i>num</i>
++ </dt>
++ <dd>
++ <p>
++ <!-- mh2016-06-11-->
++ number of lines preserved internally when receiving plain text
++ from stdin (default 10,000)
++ </p>
++ </dd>
++ <dt>
++ -r
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29 -->
++ use caret notation to display special escape characters (such as
++ ANSI escapes or nroff-style backspaces for bold and underlined
++ characters) instead of processing them
++ </p>
++ </dd>
++ <dt>
++ -s
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ squeeze multiple blank lines into one
++ </p>
++ </dd>
++
++ <dt>
++ <!--mh 2016-03-29 --> -t <i>num</i>
++ </dt>
++ <dd>
++ <p>
++ <!--mh 2016-03-29--> set tab width to <i>num</i> columns. No effect on stdout
++ </p>
++ </dd>
++<h3>Data type/encoding options</h3>
++ <dt>
++ -I <i>charset</i>
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ user defined character encoding of input data
++ </p>
++ </dd>
++ <dt>
++ -O <i>charset</i>
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29 -->
++ user defined character encoding of output data
++ </p>
++ </dd>
++ <dt>
++ -T <i>type</i>
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-06-11-->
++ explicit characterization of input data by MIME type. Without
++ this option, document type is determined from the extension of a
++ file. If the determination fails, the document is regarded as
++ text/plain. For example:
++ </p>
++ <p>
++ Read HTML document from standard input and display it
++ </p>
+ <pre>
+- cat hoge.html | w3m -T text/html
++ cat example.html | w3m -T text/html
+ </pre>
+-<p>
+-Display HTML source
++ <p>
++ Display HTML source
++ </p>
+ <pre>
+- w3m -T text/plain hoge.html
++ w3m -T text/plain example.html
+ </pre>
+-<dt>-m
+-<dd>Display document with Internet message mode.
+-With this option, w3m determines document type from header information.
+-It is useful when reading E-mail or NetNews messages.
+-<dt>-v
+-<dd>visual startup mode.
+-<dt>-B
+-<dd>Show the bookmark.
+-<dt>-bookmark file
+-<dd>Specify bookmark file.
+-<dt>-M
+-<dd>Monochrome display mode.
+-<dt>-F
+-<dd>Automatically render frame.
+-<dt>-S
+-<dd>Squeeze blank lines.
+-<dt>-X
+-<dd>Upon exit, do not display preserved screen.
+-<dt>-W
+-<dd>Toggle wrap search mode.
+-<dt>-o option=value
+-<dd>Specify option. The option names and values are
+-same as that appears in ~/.w3m/config.
+-<dt>-cookie
+-<dd>Process cookies.
+-<dt>-no-cookie
+-<dd>Don't process cookies.
+-<dt>-num
+-<dd>Show linenumber.
+-<dt>-dump
+-<dd>Read document specified by URL and dump formatted text into standard
+-output. The width of the document become 80. This width can be overridden
+-with -cols option.
+-<dt>-cols width
+-<dd>Specify document width. Used with -dump option.
+-<dt>-ppc count
+-<dd> Specify the number of pixels per character (default 8.0). Larger
+- values will make tables narrower.
+-<dt>-dump_source
+-<dd>Read document specified by URL and dump the source.
+-<dt>-dump_head
+-<dd>Read document specified by URL and dump headers.
+-<dt>-dump_both
+-<dd>Read document specified by URL and dump headers and the source.
+-<dt>-dump_extra
+-<dd>Read document specified by URL and dump extra informations, headers and the source.
+-<dt>-post file
+-<dd>use POST method with file content.
+-<dt>-header string
+-<dd>insert string as a header.
+-<dt>-no-proxy
+-<dd>Don't use proxy server.
+-<dt>-no-graph
+-<dd>Use ASCII character to draw frames.
+-<dt>-no-mouse
+-<dd>Don't activate mouse.
+-<dt>-config file
+-<dd>specify config file.
+-</dl>
+-
+-<hr>
+-<a name="Color"></a>
+-<h2>Document color</h2>
+-
+-Links and images are displayed as follows.
+-<div align="center">
+-<table border="1">
+-<tr><th> </th><th>Color mode</th><th>Monochrome mode</th></tr>
+-<tr><td>links</td><td>blue</td><td>underline</td></tr>
+-<tr><td>inline images</td><td>green</td><td>reverse</td></tr>
+-<tr><td>form input</td><td>red</td><td>reverse</td></tr>
+-</table>
+-</div>
+-These colors can be customized using option setting command "o".
+-
+-<hr>
+-<a name="Key:orig"></a>
+-<h2>Key binding</h2>
+-
+-After invocation, you can operate w3m by one-character commands from
+-the keyboard.
+-<P>
+-Here's the original key-binding table. If you are using Lynx-like key
+-bindings, see <a href="#Key:lynx">the Lynx-like key binding</a>.
+-
+-<H3>Page/Cursor motion</H3>
+-<table>
+-<TR><TD WIDTH=100>SPC,C-v<TD>Forward page
+-<TR><TD>b,ESC v<TD>Backward page
+-<TR><TD>l,C-f<TD>Cursor right
+-<TR><TD>h,C-b<TD>Cursor left
+-<TR><TD>j,C-n<TD>Cursor down
+-<TR><TD>k,C-p<TD>Cursor up
+-<TR><TD>J<TD>Roll up one line
+-<TR><TD>K<TD>Roll down one line
+-<TR><TD>^,C-a<TD>Go to the beginning of line
+-<TR><TD>$,C-e<TD>Go to the end of line
+-<TR><TD>w<TD>Go to next word
+-<TR><TD>W<TD>Go to previous word
+-<TR><TD>><TD>Shift screen right
+-<TR><TD><<TD>Shift screen left
+-<TR><TD>.<TD>Shift screen one column right
+-<TR><TD>,<TD>Shift screen one column left
+-<TR><TD>g,M-<<TD>Go to the first line
+-<TR><TD>G,M-><TD>Go to the last line
+-<TR><TD>ESC g<TD>Go to specified line
+-<TR><TD>Z<TD>Move to the center line
+-<TR><TD>z<TD>Move to the center column
+-<TR><TD>TAB<TD>Move to next hyperlink
+-<TR><TD>C-u,ESC TAB<TD>Move to previous hyperlink
+-<TR><TD>[<TD>Move to the first hyperlink
+-<TR><TD>]<TD>Move to the last hyperlink
+-</table>
+-
+-<H3>Hyperlink operation</H3>
+-<table>
+-<TR><TD WIDTH=100>RET<TD>Follow hyperlink
+-<TR><TD>a, ESC RET<TD>Save link to file
+-<TR><TD>u<TD>Peek link URL
+-<TR><TD>i<TD>Peek image URL
+-<TR><TD>I<TD>View inline image
+-<TR><TD>ESC I<TD>Save inline image to file
+-<TR><TD>:<TD>Mark URL-like strings as anchors
+-<TR><TD>ESC :<TD>Mark Message-ID-like strings as news anchors
+-<TR><TD>c<TD>Peek current URL
+-<TR><TD>=<TD>Display information about current document
+-<TR><TD>C-g<TD>Show current line number
+-<TR><TD>C-h<TD>View history of URL
+-<TR><TD>F<TD>Render frame
+-<TR><TD>M<TD>Browse current document using external browser
+-(use 2M and 3M to invoke second and third browser)
+-<TR><TD>ESC M<TD>Browse link using external browser
+-(use 2ESC M and 3ESC M to invoke second and third browser)
+-</table>
+-
+-<H3>File/Stream operation</H3>
+-<table>
+-<TR><TD WIDTH=100>U<TD>Open URL
+-<TR><TD>V<TD>View new file
+-<TR><TD>@<TD>Execute shell command and load
+-<TR><TD>#<TD>Execute shell command and browse
+-</table>
+-
+-<H3>Buffer operation</H3>
+-<table>
+-<TR><TD WIDTH=100>B<TD>Back to the previous buffer
+-<TR><TD>v<TD>View HTML source
+-<TR><TD>s<TD>Select buffer
+-<TR><TD>E<TD>Edit buffer source
+-<TR><TD>C-l<TD>Redraw screen
+-<TR><TD>R<TD>Reload buffer
+-<TR><TD>S<TD>Save buffer
+-<TR><TD>ESC s<TD>Save source
+-<TR><TD>ESC e<TD>Edit buffer image
+-</table>
+-
+-<H3>Buffer selection mode</H3>
+-<table>
+-<TR><TD WIDTH=100>k, C-p<TD>Select previous buffer
+-<TR><TD>j, C-n<TD>Select next buffer
+-<TR><TD>D<TD>Delect current buffer
+-<TR><TD>RET<TD>Go to the selected buffer
+-</table>
+-
+-<H3>Bookmark operation</H3>
+-<table>
+-<TR><TD WIDTH=100>ESC b<TD>Load bookmark
+-<TR><TD>ESC a<TD>Add current to bookmark
+-</table>
+-
+-<H3>Search</H3>
+-<table>
+-<TR><TD WIDTH=100>/,C-s<TD>Search forward
+-<TR><TD>?,C-r<TD>Search backward
+-<TR><TD>n<TD>Search next
+-<TR><TD>N<TD>Search previous
+-<TR><TD>C-w<TD>Toggle wrap search mode
+-</table>
+-
+-<H3>Mark operation</H3>
+-<table>
+-<TR><TD WIDTH=100>C-SPC<TD>Set/unset mark
+-<TR><TD>ESC p<TD>Go to previous mark
+-<TR><TD>ESC n<TD>Go to next mark
+-<TR><TD>"<TD>Mark by regular expression
+-</table>
+-
+-<H3>Miscellany</H3>
+-<table>
+-<TR><TD WIDTH=100>!<TD>Execute shell command
+-<TR><TD>H<TD>Help (load this file)
+-<TR><TD>o<TD>Set option
+-<TR><TD>C-k<TD>Show cookie jar
+-<TR><TD>C-c<TD>Stop
+-<TR><TD>C-z<TD>Suspend
+-<TR><TD>q<TD>Quit (with confirmation, if you like)
+-<TR><TD>Q<TD>Quit without confirmation
+-</table>
+-
+-<H3>Line-edit mode</H3>
+-<table>
+-<TR><TD WIDTH=100>C-f<TD>Move cursor forward
+-<TR><TD>C-b<TD>Move cursor backward
+-<TR><TD>C-h<TD>Delete previous character
+-<TR><TD>C-d<TD>Delete current character
+-<TR><TD>C-k<TD>Kill everything after cursor
+-<TR><TD>C-u<TD>Kill everything before cursor
+-<TR><TD>C-a<TD>Move to the top of line
+-<TR><TD>C-e<TD>Move to the bottom of line
+-<TR><TD>C-p<TD>Fetch the previous string from the history list
+-<TR><TD>C-n<TD>Fetch the next string from the history list
+-<TR><TD>TAB,SPC<TD>Complete filename
+-<TR><TD>RETURN<TD>Accept
+-</table>
+-
+-<hr>
+-<a name="Key:lynx"></a>
+-<h2>Lynx-like key binding</h2>
+-
+-If you have chosen `Lynx-like key binding' at the compile time,
+-you can use the following key binding.
+-
+-<H3>Page/Cursor motion</H3>
+-<table>
+-<TR><TD WIDTH=100>SPC,C-v,+<TD>Forward page
+-<TR><TD>b,ESC v,-<TD>Previous page
+-<TR><TD>l<TD>Cursor right
+-<TR><TD>h<TD>Cursor left
+-<TR><TD>j<TD>Cursor down
+-<TR><TD>k<TD>Cursor up
+-<TR><TD>J<TD>Roll up one line
+-<TR><TD>K<TD>Roll down one line
+-<TR><TD>^<TD>Go to the beginning of line
+-<TR><TD>$<TD>Go to the end of line
+-<TR><TD>><TD>Shift screen right
+-<TR><TD><<TD>Shift screen left
+-<TR><TD>C-a<TD>Go to the first line
+-<TR><TD>C-e<TD>Go to the last line
+-<TR><TD>G<TD>Go to the specified line
+-<TR><TD>Z<TD>Move to the center line
+-<TR><TD>z<TD>Move to the center column
+-<TR><TD>TAB,C-n,Down arrow<TD>Move to next hyperlink
+-<TR><TD>ESC TAB,C-p,Up arrow<TD>Move to previous link
+-<TR><TD>C-g<TD>Show current page position
+-</table>
+-
++ </dd>
++<h3>Options for data output, followed by immediate exit</h3>
++ <dt>
++ -dump
++ </dt>
++ <dd>
++ <p>
++ read document specified by URL and dump page rendered as text
++ into standard output.
++ <!-- mh 2016-03-29 -->
++ Is set implicitly when output is directed
++ to a file or pipe. A width of 80 columns is used unless option
++ -cols sets another value.
++ </p>
++ </dd>
++ <dt>
++ -dump_source
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ dump the page's source code into stdout
++ </p>
++ </dd>
++ <dt>
++ -dump_head
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ dump response of a HEAD request for a URL into stdout
++ </p>
++ </dd>
++ <dt>
++ -dump_both
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ dump HEAD, and source code for a URL into stdout
+
+-<H2>Hyperlink operation</H2>
+-<table>
+-<TR><TD WIDTH=100>RET, C-f, Right arrow<TD>Follow hyperlink
+-<TR><TD>d, ESC RET<TD>Save link to file
+-<TR><TD>u<TD>Peek link URL
+-<TR><TD>i<TD>Peek image URL
+-<TR><TD>I<TD>View inline image
+-<TR><TD>ESC I<TD>Save inline image to file
+-<TR><TD>:<TD>Mark URL-like strings as anchors
+-<TR><TD>ESC :<TD>Mark Message-ID-like strings as news anchors
+-<TR><TD>c<TD>Peek current URL
+-<TR><TD>=<TD>Display information about current document
+-<TR><TD>C-h<TD>View history of URL
+-<TR><TD>F<TD>Render frame
+-<TR><TD>M<TD>Browse current document using external browser
+-(use 2M and 3M to invoke second and third browser)
+-<TR><TD>ESC M<TD>Browse link using external browser
+-(use 2ESC M and 3ESC M to invoke second and third browser)
+-</table>
++ </p>
++ </dd>
++ <dt>
++ -dump_extra
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ dump HEAD, source code, and extra information for a URL into
++ stdout
++ </p>
++ </dd>
+
+-<H2>File/Stream operation</H2>
+-<table>
+-<TR><TD WIDTH=100>g,U<TD>Open URL
+-<TR><TD>V<TD>View new file
+-<TR><TD>@<TD>Execute shell command and load
+-<TR><TD>#<TD>Execute shell command and browse
+-</table>
++<h3>Options for overriding default settings and resources</h3>
++
++ <dt>
++ -bookmark <i>file</i>
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ use <i>file</i> instead of the default bookmark.html file
++ </p>
++ </dd>
++ <dt>
++ -config <i>file</i>
++ </dt>
++ <dd>
++ <p>
++ <!--mh 2016-06-11-->
++ use <i>file</i> instead of the default configuration file
++ </p>
++ </dd>
++ <dt>
++ -o <i>option</i>=<i>value</i>
++ </dt>
++ <dd>
++ <p>
++ <!-- mh 2016-03-29-->
++ modify one configuration item with an explicitly given value; without <i>option=value</i>, equivalent to <i>-show-option</i>
++ </p>
++ </dd>
++ </dl>
++ <hr>
++ <h2 id="Color">
++ Document Colors
++ </h2>
++ <p>
++ Hyperlinks and images are displayed as follows.
++ </p>
++ <div align="center">
++ <table border="1">
++ <tr>
++ <th>
++ </th>
++ <th>
++ Color mode
++ </th>
++ <th>
++ Monochrome mode
++ </th>
++ </tr>
++ <tr>
++ <td>
++ Hyperlinks
++ </td>
++ <td>
++ blue
++ </td>
++ <td>
++ underline
++ </td>
++ </tr>
++ <tr>
++ <td>
++ Inline images
++ </td>
++ <td>
++ green
++ </td>
++ <td>
++ reverse
++ </td>
++ </tr>
++ <tr>
++ <td>
++ Form input
++ </td>
++ <td>
++ red
++ </td>
++ <td>
++ reverse
++ </td>
++ </tr>
++ </table>
++ </div>
++ <p>
++ These colors can be customized using the options setting command
++ <i>o</i>.
++ </p>
++ <hr>
++ <h2 id="Functions">
++ Functions and Key bindings
++ </h2>
++
++ <p>
++ After invocation, you can control w3m by typing in functions by name
++ or with keystroke combinations bound to a function. There are
++ default key bindings.
++<!-- mh 2016-06-13 obsolete
++ If you prefer using Lynx-like
++ key bindings, make w3m start with the respective keymap file keymap.lynx. (see w3m (1)).-->
++ </p>
++<!--
++ <h2 id="Key:custom">
++ Key customization
++ </h2>
++-->
++ <p>
++ You can customize the key bindings (except those for menu
++ operations and line-editing) in a ~/.w3m/keymap file. For example,
++ </p>
+
+-<H2>Buffer operation</H2>
+-<table>
+-<TR><TD WIDTH=100>B, C-b, Left arrow<TD>Back to the previous buffer
+-<TR><TD>\<TD>View HTML source
+-<TR><TD>s, C-h<TD>Select buffer
+-<TR><TD>E<TD>Edit buffer source
+-<TR><TD>C-l, C-w<TD>Redraw screen
+-<TR><TD>R, C-r<TD>Reload buffer
+-<TR><TD>S, p<TD>Save buffer
+-<TR><TD>ESC s<TD>Save source
+-<TR><TD>ESC e<TD>Edit buffer image
+-</table>
+-
+-<H2>Buffer selection mode</H2>
+-<table>
+-<TR><TD WIDTH=100>k, C-p<TD>Select previous buffer
+-<TR><TD>j, C-n<TD>Select next buffer
+-<TR><TD>D<TD>Delect current buffer
+-<TR><TD>RET<TD>Go to the selected buffer
+-</table>
+-
+-<H2>Bookmark operation</H2>
+-<table>
+-<TR><TD WIDTH=100>v, ESC b<TD>Load bookmark
+-<TR><TD>a, ESC a<TD>Add current to bookmark
+-</table>
+-
+-<H2>Search</H2>
+-<table>
+-<TR><TD WIDTH=100>/, C-s<TD>Search forward
+-<TR><TD>n<TD>Search next
+-<TR><TD>w<TD>Toggle wrap search mode
+-</table>
+-
+-<H2>Mark operation</H2>
+-<table>
+-<TR><TD WIDTH=100>C-SPC<TD>Set/unset mark
+-<TR><TD>P<TD>Go to previous mark
+-<TR><TD>N<TD>Go to next mark
+-<TR><TD>"<TD>Mark by regular expression
+-</table>
+-
+-<H2>Miscellany</H2>
+-<table>
+-<TR><TD WIDTH=100>!<TD>Execute shell command
+-<TR><TD>H, ?<TD>Help (load this file)
+-<TR><TD>o<TD>Set option
+-<TR><TD>C-k<TD>Show cookie jar
+-<TR><TD>C-c<TD>Stop
+-<TR><TD>C-z<TD>Suspend
+-<TR><TD>q<TD>Quit (with confirmation, if you like)
+-<TR><TD>Q<TD>Quit without confirmation
+-</table>
+-
+-<H2>Line-edit mode</H2>
+-<table>
+-<TR><TD WIDTH=100>C-f<TD>Move cursor forward
+-<TR><TD>C-b<TD>Move cursor backward
+-<TR><TD>C-h<TD>Delete previous character
+-<TR><TD>C-d<TD>Delete current character
+-<TR><TD>C-k<TD>Kill everything after cursor
+-<TR><TD>C-u<TD>Kill everything before cursor
+-<TR><TD>C-a<TD>Move to the top of line
+-<TR><TD>C-e<TD>Move to the bottom of line
+-<TR><TD>C-p<TD>Fetch the previous string from the history list
+-<TR><TD>C-n<TD>Fetch the next string from the history list
+-<TR><TD>TAB,SPC<TD>Complete filename
+-<TR><TD>RETURN<TD>Accept
+-</table>
+-
+-<hr>
+-<a name="Mouse"></a>
+-<h2>Mouse operation</h2>
+-If w3m is compiled with mouse option and you are using
+-xterm/kterm/rxvt (in this case, you have to set the TERM
+-environment variable to `xterm' or `kterm'.) or GPM
+-environment, you can use mouse
+-for the navigation.
+-<p>
+-<table border=0>
+-<tr><td>left click
+-<td>Move the cursor to the place pointed by the mouse cursor.
+-If you click the cursor and it is on an anchor, follow the anchor.
+-<tr><td>middle click
+-<td>Back to the previous buffer.
+-<tr><td>right click
+-<td>Open pop-up menu. You can choose an item by clicking it.
+-<tr><td>left drag
+-<td>Scroll document. The default behavior is to grab the document
+-and drag it. You can reverse the behavior (grab the window and drag it)
+-with the option setting panel.
+-</table>
+-<p>
++<pre>
++ keymap C-o NEXT_PAGE
++</pre>
+
++ <p>
++ binds the command <span class="mono">NEXT_PAGE</span> (normally bound to SPC and C-v)
++ to control-o. See <a href="README.func">README.func</a> for a list
++ of available functions. Original and Lynx-like keymap definitions
++ are provided as examples: <a href="keymap.default">keymap.default</a>
++ and <a href="keymap.lynx">keymap.lynx</a>.
++ </p>
+
+-<hr>
+-<a name="Key:custom"></a>
+-<h2>Key customization</h2>
+-You can customize the key binding (except line-editing keymap)
+-by describing ~/.w3m/keymap. For example,
+-<pre>
++ <p>
++ Throughout, the <i>C-</i> and <i>M-</i> notations indicate the
++ modifiers <i>control</i> and <i>meta</i>. The <i>ALT</i>-key
++ replaces the latter whereas pressing the <i>ESC</i>-key toggles
++ between <i>meta</i>-modified and simple keystrokes. The minus
++ indicates pressing the keys simultaneously wheras a space
++ represents that one key is pressed after the other, i.e. <i>2 M</i>
++ simply means <i>2</i> followed by <i>M</i>.
++ </p>
+
+- keymap C-o NEXT_PAGE
+
+-</pre>
+-binds `NEXT_PAGE' function (normally bound to SPC and C-v)
+-to control-o. See <a href="README.func">README.func</a> for
+-list of available functions. Original and Lynx-like keymap
+-definitions are provided (<a href="keymap.default">keymap.default</a>
+-and <a href="keymap.lynx">keymap.lynx</a>) as examples.
++ <table border="1" width="100%">
++ <colgroup>
++ <col width="20%">
++ <col width="20%">
++ <col width="20%">
++ <col width="40%">
++ </colgroup>
++ <tr>
++ <th rowspan="2">
++ Function
++ </th>
++ <th colspan="2">Key binding
++ </th>
++ <th rowspan="2">
++ Description
++ </th>
++ </tr>
++ <tr>
++ <th>
++ Default
++ </th>
++ <th>
++ Lynx-like
++ </th>
++ </tr>
++ <tr>
++ <td colspan="4">
++ <h3>In-page navigation</h3>
++</td>
++ </tr>
++ <tr>
++ <td>
++ NEXT_PAGE
++ </td>
++ <td>
++ SPC, C-v, +, PGDN
++ </td>
++ <td>
++ SPC, C-v, +
++ </td>
++ <td>
++ Scroll one page downwards
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PREVIOUS_PAGE
++ </td>
++ <td>
++ b, M-v, -, PGUP
++ </td>
++ <td>
++ b, M-v, -
++ </td>
++ <td>
++ Scroll one page upwards
++ </td>
++ </tr>
++ <tr>
++ <td>
++ MOVE_RIGHT
++ </td>
++ <td>
++ l, C-f, RIGHT
++ </td>
++ <td>
++ l
++ </td>
++ <td>
++ Move cursor right (with a half-screen shift at the screen edge)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ MOVE_LEFT
++ </td>
++ <td>
++ h, C-b, LEFT
++ </td>
++ <td>
++ h
++ </td>
++ <td>
++ Move cursor left (with a half-screen shift at the screen edge)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ MOVE_DOWN
++ </td>
++ <td>
++ j, C-n, DOWN
++ </td>
++ <td>
++ j
++ </td>
++ <td>
++ Move cursor down (with a one-line scroll at the screen edge)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ MOVE_UP
++ </td>
++ <td>
++ k, C-p, UP
++ </td>
++ <td>
++ k
++ </td>
++ <td>
++ Move cursor up (with a one-line scroll at the screen edge)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ UP
++ </td>
++ <td>
++ J
++ </td>
++ <td>
++ J
++ </td>
++ <td>
++ Scroll the screen up one line
++ </td>
++ </tr>
++ <tr>
++ <td>
++ DOWN
++ </td>
++ <td>
++ K
++ </td>
++ <td>
++ K
++ </td>
++ <td>
++ Scroll the screen down one line
++ </td>
++ </tr>
++ <tr>
++ <td>
++ LINE_BEGIN
++ </td>
++ <td>
++ ^, C-a
++ </td>
++ <td>
++ ^
++ </td>
++ <td>
++ Go to the beginning of the line
++ </td>
++ </tr>
++ <tr>
++ <td>
++ LINE_END
++ </td>
++ <td>
++ $, C-e
++ </td>
++ <td>
++ $
++ </td>
++ <td>
++ Go to the end of the line
++ </td>
++ </tr>
++ <tr>
++ <td>
++ NEXT_WORD
++ </td>
++ <td>
++ w
++ </td>
++ <td>
++ w
++ </td>
++ <td>
++ Move to the next word
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PREVIOUS_WORD
++ </td>
++ <td>
++ W
++ </td>
++ <td>
++ W
++ </td>
++ <td>
++ Move to the previous word
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SHIFT_RIGHT
++ </td>
++ <td>
++ >
++ </td>
++ <td>
++ >
++ </td>
++ <td>
++ Shift screen right
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SHIFT_LEFT
++ </td>
++ <td>
++ <
++ </td>
++ <td>
++ <
++ </td>
++ <td>
++ Shift screen left
++ </td>
++ </tr>
++ <tr>
++ <td>
++ RIGHT
++ </td>
++ <td>
++ .
++ </td>
++ <td>
++ .
++ </td>
++ <td>
++ Shift screen one column right
++ </td>
++ </tr>
++ <tr>
++ <td>
++ LEFT
++ </td>
++ <td>
++ ,
++ </td>
++ <td>
++ ,
++ </td>
++ <td>
++ Shift screen one column left
++ </td>
++ </tr>
++ <tr>
++ <td>
++ BEGIN
++ </td>
++ <td>
++ g, M-<, HOME
++ </td>
++ <td>
++ C-a, M-<
++ </td>
++ <td>
++ Go to the first line
++ </td>
++ </tr>
++ <tr>
++ <td>
++ END
++ </td>
++ <td>
++ G, M->, END
++ </td>
++ <td>
++ C-e, M->
++ </td>
++ <td>
++ Go to the last line
++ </td>
++ </tr>
++ <tr>
++ <td>
++ GOTO_LINE
++ </td>
++ <td>
++ M-g
++ </td>
++ <td>
++ G
++ </td>
++ <td>
++ Go to the specified line
++ </td>
++ </tr>
++ <tr>
++ <td>
++ LINE_INFO
++ </td>
++ <td>
++ C-g
++ </td>
++ <td>
++ C-g
++ </td>
++ <td>
++ Display current position in document
++ </td>
++ </tr>
++ <tr>
++ <td>
++ CENTER_H
++ </td>
++ <td>
++ Z
++ </td>
++<!--Correction by mh 2014-04-06
++Description for keybinding of z and Z had been mingled
++-->
++ <td>
++ Z
++ </td>
++ <td>
++ Center screen right and left of the cursor column
++ </td>
++ </tr>
++ <tr>
++ <td>
++ CENTER_V
++ </td>
++ <td>
++ z
++ </td>
++ <td>
++ z
++ </td>
++ <td>
++ Center screen above and below the cursor line
++ </td>
++ </tr>
++ <tr>
++ <td>
++ NEXT_LINK
++ </td>
++ <td>
++ TAB
++ </td>
++ <td>
++ TAB, C-n, DOWN
++ </td>
++ <td>
++ Move to the next hyperlink
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PREVIOUS_LINK
++ </td>
++ <td>
++ M-TAB, C-u
++ </td>
++ <td>
++ M-TAB, C-u, C-p, UP
++ </td>
++ <td>
++ Move to the previous hyperlink
++ </td>
++<!-- Annotion mh 2016-04-06
++Keybinding description for C-g had been moved as it did not fit to "Hyperlink operation" and position in the default and lynx-like series differed
++ -->
++ </tr>
++ <tr>
++ <td>
++ LINK_BEGIN
++ </td>
++ <td>
++ [
++ </td>
++ <td>
++ [
++ </td>
++ <td>
++ Move to the first hyperlink
++ </td>
++ </tr>
++ <tr>
++ <td>
++ LINK_END
++ </td>
++ <td>
++ ]
++ </td>
++ <td>
++ ]
++ </td>
++ <td>
++ Move to the last hyperlink
++ </td>
++ </tr>
++<tr>
++<td>MOVE_LIST_MENU</td>
++<td>M-m</td>
++<td>M-m</td>
++<td>Pop up menu to navigate between hyperlinks</td>
++</tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Hyperlink Operations</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ GOTO_LINK
++ </td>
++ <td>
++ C-j, C-m, RET
++ </td>
++ <td width="100">
++ C-f, C-j, C-m, RET, RIGHT
++ </td>
++ <td>
++ Follow current hyperlink in a new buffer
++ </td>
++ </tr>
++<tr>
++<td>LIST_MENU</td>
++<td>M-l</td>
++<td>M-l</td>
++<td>Pop up hyperlink menu and select one to be followed</td>
++</tr>
++ <tr>
++ <td>
++ SAVE_LINK
++ </td>
++ <td>
++ a, M-RET
++ </td>
++ <td>
++ d, M-RET
++ </td>
++ <td>
++ Save the hyperlink target
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PEEK_LINK
++ </td>
++ <td>
++ u
++ </td>
++ <td>
++ u
++ </td>
++ <td>
++ Show target address
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PEEK_IMG
++ </td>
++ <td>
++ i
++ </td>
++ <td>
++ i
++ </td>
++ <td>
++ Show image address
++ </td>
++ </tr>
++ <tr>
++ <td>
++ VIEW_IMAGE
++ </td>
++ <td>
++ I
++ </td>
++ <td>
++ I
++ </td>
++ <td>
++ Display image in viewer
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SAVE_IMAGE
++ </td>
++ <td>
++ M-I
++ </td>
++ <td>
++ M-I
++ </td>
++ <td>
++ Save inline image
++ </td>
++ </tr>
++<tr>
++<td>MARK_WORD</td>
++<td>;</td>
++<td>;</td>
++<td>Turn current word into hyperlink</td>
++</tr>
++ <tr>
++ <td>
++ MARK_URL
++ </td>
++ <td>
++ :
++ </td>
++ <td>
++ :
++ </td>
++ <td>
++ Turn URL-like strings into hyperlinks
++ </td>
++ </tr>
++ <tr>
++ <td>
++ MARK_MID
++ </td>
++ <td>
++ M-:
++ </td>
++ <td>
++ M-:
++ </td>
++ <td>
++<!-- changed due to mail dated Mon, 04 Apr 2016 00:47:09 +0900 (JST)
++from Tatsuya Kinoshita -->
++ Turn Message-ID-like strings into hyperlinks
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PEEK
++ </td>
++ <td>
++ c
++ </td>
++ <td>
++ c
++ </td>
++ <td>
++ Show current address
++ </td>
++ </tr>
++ <tr>
++ <td>
++ INFO
++ </td>
++ <td>
++ =
++ </td>
++ <td>
++ =
++ </td>
++ <td>
++ Display information about the current document
++ </td>
++ </tr>
++ <tr>
++ <td>
++ HISTORY
++ </td>
++ <td>
++ C-h
++ </td>
++ <td>
++ C-h
++ </td>
++ <td>
++ Show browsing history
++ </td>
++ </tr>
++ <tr>
++ <td>
++ EXTERN
++ </td>
++ <td>
++ M
++ </td>
++ <td>
++ M
++ </td>
++ <td>
++ Browse current document using external browser (prefix 2, 3, ...,
++ or 9 to invoke alternate configured browsers, e.g. 3 M)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ EXTERN_LINK
++ </td>
++ <td>
++ M-M
++ </td>
++ <td>
++ M-M
++ </td>
++ <td>
++ Browse link using external browser (prefixed as above, e.g.
++ 3 M-M)
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Bookmark management</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ BOOKMARK
++ </td>
++ <td>
++ M-b
++ </td>
++ <td>
++ v, M-b
++ </td>
++ <td>
++ View bookmarks
++ </td>
++ </tr>
++ <tr>
++ <td>
++ ADD_BOOKMARK
++ </td>
++ <td>
++ M-a
++ </td>
++ <td>
++ a, M-a
++ </td>
++ <td>
++ Add current page to bookmarks
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>File/Stream Operations</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ GOTO
++ </td>
++ <td>
++ U
++ </td>
++ <td>
++ g, U
++ </td>
++ <td>
++ Open specified document in a new buffer
++ </td>
++ </tr>
++<tr>
++<td>GOTO_RELATIVE</td>
++<td>M-u</td>
++<td>M-u</td>
++<td>Open relative address in a new buffer</td>
++</tr>
++ <tr>
++ <td>
++ LOAD
++ </td>
++ <td>
++ V
++ </td>
++ <td>
++ V
++ </td>
++ <td>
++ Open local file in a new buffer
++ </td>
++ </tr>
++ <tr>
++ <td>
++ READ_SHELL
++ </td>
++ <td>
++ @
++ </td>
++ <td>
++ @
++ </td>
++ <td>
++ <!--Execute shell command and view output-->
++ <!--mh 2016-06-13 No difference to PIPE_SHELL could be discerned-->
++ Execute shell command and display output in a new buffer
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PIPE_SHELL
++ </td>
++ <td>
++ #
++ </td>
++ <td>
++ #
++ </td>
++ <td>
++ <!--Execute shell command and browse output-->
++ <!--mh 2016-06-13 No difference to READ_SHELL could be discerned-->
++ Execute shell command and display output in a new buffer
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Content Operations</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ VIEW <!-- is an alias to SOURCE -->
++ </td>
++ <td>
++ v
++ </td>
++ <td>
++ \
++ </td>
++ <td>
++ Toggle between source code and rendered view of the document
++ </td>
++ </tr>
++<tr>
++<td>LIST</td>
++<td>L</td>
++<td>L</td>
++<td>List link elements, hyperlinks and images</td>
++</tr>
++ <tr>
++ <td>
++ FRAME
++ </td>
++ <td>
++ F
++ </td>
++ <td>
++ F
++ </td>
++ <td>
++ Toggle rendering HTML frames
++ </td>
++ </tr>
++ <tr>
++ <td>
++ REDRAW
++ </td>
++ <td>
++ C-l
++ </td>
++ <td>
++ C-l, C-w
++ </td>
++ <td>
++ Draw the screen anew
++ </td>
++ </tr>
++ <tr>
++ <td>
++ RELOAD
++ </td>
++ <td>
++ R
++ </td>
++ <td>
++ R, C-r
++ </td>
++ <td>
++ Load current document anew
++ </td>
++ </tr>
++ <tr>
++ <td>
++ EDIT
++ </td>
++ <td>
++ E
++ </td>
++ <td>
++ E
++ </td>
++ <td>
++ Edit local source
++ </td>
++ </tr>
++ <tr>
++ <td>
++ EDIT_SCREEN
++ </td>
++ <td>
++ M-e
++ </td>
++ <td>
++ M-e
++ </td>
++ <td>
++ Edit rendered copy of document
++ </td>
++ </tr>
++<tr>
++<td>PIPE_BUF</td>
++<td>|</td>
++<td>|</td>
++<td>Pipe current buffer through a shell command and display output</td>
++</tr>
++ <tr>
++ <td>
++ DOWNLOAD <!-- is an alias to SAVE -->
++ </td>
++ <td>
++ M-s
++ </td>
++ <td>
++ M-s
++ </td>
++ <td>
++ Save document source
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SAVE_SCREEN
++ </td>
++ <td>
++ S
++ </td>
++ <td>
++ S, p
++ </td>
++ <td>
++ Save rendered document
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Buffer/Tab Navigation</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ BACK
++ </td>
++ <td>
++ B
++ </td>
++ <td>
++ B, C-b, LEFT
++ </td>
++ <td>
++ Close current buffer and return to the one below in stack
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SELECT_MENU
++ </td>
++ <td>
++ s
++ </td>
++ <td>
++ s, C-h
++ </td>
++ <td>
++ Pop up buffer-stack menu
++ </td>
++ </tr>
++ <tr>
++ <td>
++ TAB_MENU
++ </td>
++ <td>
++ M-t
++ </td>
++ <td>
++ M-t
++ </td>
++ <td>
++ Pop up tab selection menu
++ </td>
++ </tr>
++ <tr>
++ <td>
++ NEW_TAB
++ </td>
++ <td>
++ T
++ </td>
++ <td>
++ T
++ </td>
++ <td>
++ Open a new tab (with current document)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ TAB_LINK
++ </td>
++ <td>
++ C-t
++ </td>
++ <td>
++ C-t
++ </td>
++ <td>
++ Follow current hyperlink in a new tab
++ </td>
++ </tr>
++ <tr>
++ <td>
++ NEXT_TAB
++ </td>
++ <td>
++ }
++ </td>
++ <td>
++ }
++ </td>
++ <td>
++ Switch to the next tab
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PREV_TAB
++ </td>
++ <td>
++ {
++ </td>
++ <td>
++ {
++ </td>
++ <td>
++ Switch to the previous tab
++ </td>
++ </tr>
++ <tr>
++ <td>
++ CLOSE_TAB
++ </td>
++ <td>
++ C-q
++ </td>
++ <td>
++ C-q
++ </td>
++ <td>
++ Close the current tab
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Searches</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ SEARCH
++ </td>
++ <td>
++ /
++ </td>
++ <td>
++ /, C-s
++ </td>
++ <td>
++ Search forward
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SEARCH_BACK
++ </td>
++ <td>
++ ?
++ </td>
++ <td>
++ </td>
++ <td>
++ Search backward
++ </td>
++ </tr>
++ <tr>
++ <td>
++ ISEARCH
++ </td>
++ <td>
++ C-s
++ </td>
++ <td>
++ </td>
++ <td>
++ Incremental search forward
++ </td>
++ </tr>
++ <tr>
++ <td>
++ ISEARCH_BACK
++ </td>
++ <td>
++ C-r
++ </td>
++ <td>
++ </td>
++ <td>
++ Incremental search backward
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SEARCH_NEXT
++ </td>
++ <td>
++ n
++ </td>
++ <td>
++ n
++ </td>
++ <td>
++ Continue search forward
++ </td>
++ </tr>
++ <tr>
++ <td>
++ SEARCH_PREV
++ </td>
++ <td>
++ N
++ </td>
++ <td>
++ </td>
++ <td>
++ Continue search backward
++ </td>
++ </tr>
++ <tr>
++ <td>
++ WRAP_TOGGLE
++ </td>
++ <td>
++ C-w
++ </td>
++ <td>
++ w
++ </td>
++ <td>
++ Toggle wrapping mode in searches
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Mark Management</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ MARK
++ </td>
++ <td>
++ C-SPC
++ </td>
++ <td>
++ C-SPC
++ </td>
++ <td>
++ Set/unset mark
++ </td>
++ </tr>
++ <tr>
++ <td>
++ PREV_MARK
++ </td>
++ <td>
++ M-p
++ </td>
++ <td>
++ P
++ </td>
++ <td>
++ Go to the previous mark
++ </td>
++ </tr>
++ <tr>
++ <td>
++ NEXT_MARK
++ </td>
++ <td>
++ M-n
++ </td>
++ <td>
++ N
++ </td>
++ <td>
++ Go to the next mark
++ </td>
++ </tr>
++ <tr>
++ <td>
++ REG_MARK
++ </td>
++ <td>
++ "
++ </td>
++ <td>
++ "
++ </td>
++ <td>
++ Mark all occurrences of a pattern
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="4">
++ <h3>Miscellaneous</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ COMMAND
++ </td>
++ <td>
++ M-c
++ </td>
++ <td>
++ M-c
++ </td>
++ <td>
++ Invoke one or more semicolon-separated w3m functions
++ </td>
++ </tr>
++<!--
++TODO: Where does this key binding M-Fn come from. I do not find a Fn-key on my keyboard. I do not know how to type in the keystroke combinations listed in keymap.default which are
++keymap M-[E MENU
++keymap M-[L MENU
++keymap M-[2~ MENU
++keymap M-[28~ MENU
++<tr>
++<td>MENU</td>
++<Td>M-Fn</Td>
++<td></td>
++<td>Pop up menu</td>
++</tr>
++-->
++ <tr>
++ <td>
++ HELP
++ </td>
++ <td>
++ H
++ </td>
++ <td>
++ H, ?
++ </td>
++ <td>
++ Show help panel
++ </td>
++ </tr>
++ <tr>
++ <td>
++ OPTIONS
++ </td>
++ <td>
++ o
++ </td>
++ <td>
++ o
++ </td>
++ <td>
++ Display options setting panel
++ </td>
++ </tr>
++<tr>
++<td>SET_OPTION</td>
++<td>M-o</td>
++<td>M-o</td>
++<td>Set option</td>
++</tr>
++<tr>
++<td>DEFINE_KEY</td>
++<td>M-k</td>
++<td>M-k</td>
++<td>Define a binding between a key stroke combination and a command</td>
++</tr>
++<tr>
++<td>MOUSE_TOGGLE</td>
++<td>m</td>
++<td>m</td>
++<td>Toggle mouse support</td>
++</tr>
++<tr>
++<td>DOWNLOAD_LIST</td>
++<td>D</td>
++<td>D</td>
++<td>Display downloads panel</td>
++</tr>
++ <tr>
++ <td>
++ COOKIE
++ </td>
++ <td>
++ C-k
++ </td>
++ <td>
++ C-k
++ </td>
++ <td>
++ Show cookie jar
++ </td>
++ </tr>
++<!--
++mh 2016-06-12 Interrupt is an alias to SUSPEND, no need to mention it here
++ <tr>
++ <td>
++ INTERRUPT
++ </td>
++ <td>
++ C-c
++ </td>
++ <td>
++ C-c
++ </td>
++ <td>
++ Interrupt
++ </td>
++ </tr>
++-->
++<tr>
++<td>UNDO</td>
++<td>(</td>
++<td>(</td>
++<td>Cancel the last cursor movement</td>
++</tr>
++<tr>
++<td>REDO</td>
++<td>)</td>
++<td>)</td>
++<td>Cancel the last undo</td>
++</tr>
++ <tr>
++ <td>
++ EXEC_SHELL <!-- is an alias of SHELL -->
++ </td>
++ <td>
++ !
++ </td>
++ <td>
++ !
++ </td>
++ <td>
++ Execute shell command
++ </td>
++ </tr>
++<tr>
++<td>DICT_WORD</td>
++<td>M-w</td>
++<td>M-w</td>
++<td>Execute dictionary command (see <a href="README.dict">README.dict</a>)</td>
++</tr>
++<tr>
++<td>DICT_WORD_AT</td>
++<td>M-W</td>
++<td>M-W</td>
++<td>Execute dictionary command for word at cursor</td>
++</tr>
++<tr>
++<td>VERSION</td>
++<td>r</td>
++<td>r</td>
++<td>Display the version of w3m</td>
++</tr>
++ <tr>
++ <td>
++ SUSPEND
++ </td>
++ <td>
++ C-z
++ </td>
++ <td>
++ C-z
++ </td>
++ <td>
++ Suspend w3m to background. (To be withdrawn with shell
++ command <span class="mono">fg</span>.)
++ </td>
++ </tr>
++ <tr>
++ <td>
++ QUIT
++ </td>
++ <td>
++ q
++ </td>
++ <td>
++ q
++ </td>
++ <td>
++ Quit with confirmation request
++ </td>
++ </tr>
++ <tr>
++ <td>
++ EXIT
++ </td>
++ <td>
++ Q
++ </td>
++ <td>
++ Q
++ </td>
++ <td>
++ Quit at once
++ </td>
++ </tr>
++ </table>
+
+-<hr>
+-<a name="LocalCGI"></a>
+-<h2>Local CGI</h2>
+-You can run CGI scripts using w3m, without any HTTP server.
+-It means that w3m behaves like an HTTP server and activates CGI script,
+-then w3m reads the output of the script and display it. The
+-<a href="file:///$LIB/w3mbookmark?mode=panel&bmark=~/.w3m/bookmark.html&url=MANUAL.html&title=w3m+manual">bookmark registration</a>
+-and <a href="file:///$LIB/w3mhelperpanel?mode=panel">helper-app editor</a>
+-are realized as local CGI scripts.
+-Using local CGI, w3m can be used as a general purpose form interface.
+-<P>
+-For security reason, CGI scripts invoked by w3m must be in one of
+-these directories.
+-<ul>
+-<li>The directory where w3m-related files are stored
+-(typically /usr/local/lib/w3m). This directory can be referred
+-as $LIB.
+-<li>/cgi-bin/ directory. You can map /cgi-bin/ to any directory you like
+-with option setting panel (``Directory corresponds to /cgi-bin'' field).
+-You can specify multiple paths separated by `:', like
+-/usr/local/cgi-bin:/home/aito/cgi-bin. To use /cgi-bin/ directory,
+-you must use file:/cgi-bin URL as follows:
++ <p>
++ There are the following operational modes with built-in key
++ bindings for relevant functions. These bindings are not subject to
++ the DEFINE_KEY function or entries in the file keymap.
++ </p>
++
++ <table border="1" width="100%">
++ <colgroup>
++ <col width="20%">
++ <col width="40%">
++ <col width="40%">
++ </colgroup>
++ <tr>
++ <th>
++ Function<br>(internal name)
++ </th>
++ <th>Key binding
++ </th>
++ <th>
++ Description
++ </th>
++ </tr>
++ <tr>
++ <td colspan="3">
++ <h3>Menu Selection Mode</h3>
++ </td>
++ </tr>
++ <tr>
++ <td>
++ BUF:NEXT</td>
++ <td>
++ j, C-n, DOWN
++ </td>
++ <td>
++ Next item
++ </td>
++ </tr>
++ <tr>
++ <td>BUF:PREV
++ </td>
++ <td>
++ k, C-p, UP
++ </td>
++ <td>
++ Previous item
++ </td>
++ </tr>
++ <tr>
++ <td>
++ BUF:DELETE</td>
++ <td>
++ D
++ </td>
++ <td>
++ Delete item
++ </td>
++ </tr>
++ <tr>
++ <td>
++ BUF:GO
++ </td>
++ <td>
++ SPC, RET, RIGHT
++ </td>
++ <td>
++ Select item
++ </td>
++ </tr>
++<!-- </table>-->
++ <tr>
++ <td colspan="3">
++ <h3>Popup Menu Mode</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++MENU:SELECT
++ </td>
++ <td>
++ SPC, RET, RIGHT</td>
++ <td>
++ Select
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:CLOSE
++ </td>
++ <td>C-c
++ </td>
++ <td>
++ Close menu
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:CANCEL
++ </td>
++ <td>
++ LEFT, BKSPC, C-h</td>
++ <td>
++ One selection step backward
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:DOWN
++ </td>
++ <td>j, C-n, DOWN
++ </td>
++ <td>
++ Move to the next item
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:UP
++ </td>
++ <td>
++ k, C-p, UP</td>
++ <td>
++ Move to the previous item
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:LINE_UP
++ </td>
++ <td>K
++ </td>
++ <td>
++ Scroll up one item
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:LINE_DOWN
++ </td>
++ <td>J
++ </td>
++ <td>
++ Scroll down one item
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:TOP
++ </td>
++ <td>C-a
++ </td>
++ <td>
++ Move to the first item
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:LAST
++ </td>
++ <td>C-e
++ </td>
++ <td>
++ Move to the final item
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:NEXT
++ </td>
++ <td>C-v, C-f
++ </td>
++ <td>Go to the next page
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:PREV
++ </td>
++ <td>ESC v, C-b
++ </td>
++ <td>
++ Go to the previous page
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:SEARCH_FORE
++ </td>
++ <td>C-s, /
++ </td>
++ <td>
++ Search forward
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:SEARCH_BACK
++ </td>
++ <td>
++ C-r, ?</td>
++ <td>
++ Search backward
++ </td>
++ </tr>
++ <tr>
++ <td>
++MENU:SEARCH_NEXT
++ </td>
++ <td>
++ n</td>
++ <td>
++ Search for the next match</td>
++ </tr>
++ <tr>
++ <td>
++MENU:SEARCH_PREV
++ </td>
++ <td>
++ N</td>
++ <td>
++ Search for the previous match</td>
++ </tr>
++<!--mh 2016-06-12 Pressing C-z in menu mode (with menu active) has the same effect as in normal operation of w3m: Browser gets in the background
++ <tr>
++ <td>
++MENU:SUSPEND
++ </td>
++ <td>
++ C-z</td>
++ <td>
++ Suspend</td>
++ </tr>
++-->
++<!-- </table>-->
++ <tr>
++ <td colspan="3">
++ <h3>Line-editing Mode</h3>
++ </td>
++ </tr>
++<!-- <table>-->
++ <tr>
++ <td>
++ LINEEDIT:FORWARD
++ </td>
++ <td width="100">
++ C-f, RIGHT
++ </td>
++ <td>
++ Move cursor forward
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:BACK
++ </td>
++ <td>
++ C-b, LEFT
++ </td>
++ <td>
++ Move cursor backward
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:BS
++ </td>
++ <td>
++ C-h, BKSPC
++ </td>
++ <td>
++ Delete previous character
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:DEL
++ </td>
++ <td>
++ C-d
++ </td>
++ <td>
++ Delete current character
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:KILL_AFTER
++ </td>
++ <td>
++ C-k
++ </td>
++ <td>
++ Delete everything after cursor
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:KILL_BEFORE
++ </td>
++ <td>
++ C-u
++ </td>
++ <td>
++ Delete everything before cursor
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:TOP
++ </td>
++ <td>
++ C-a
++ </td>
++ <td>
++ Move to the beginning of the line
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:BOTTOM
++ </td>
++ <td>
++ C-e
++ </td>
++ <td>
++ Move to the end of the line
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:PREV
++ </td>
++ <td>
++ C-p, UP
++ </td>
++ <td>
++ Fetch the previous string from the history list
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:NEXT
++ </td>
++ <td>
++ C-n, DOWN
++ </td>
++ <td>
++ Fetch the next string from the history list
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:COMPLETE
++ </td>
++ <td>
++ TAB, SPC
++ </td>
++ <td>
++ Try to complete filename
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:EDITOR
++ </td>
++ <td>
++ C-o
++ </td>
++ <td>
++ Edit with external editor
++ </td>
++ </tr>
++ <tr>
++ <td>
++LINEEDIT:ACCEPT
++ </td>
++ <td>
++ RET
++ </td>
++ <td>
++ Accept input line
++ </td>
++ </tr>
++ </table>
++<!-- mh 2016-06-12 As it suffices to use the provided keymap file for Lynx-like keybindings and this file is listed in section FILES of man w3m (1), the following hint for getting w3m with Lynx-like key bindings has been deleted.
++ <p>
++ If w3m was compiled with <q>Lynx-like key bindings</q>, you can use
++ the following key bindings.
++ </p>
++-->
++<!-- mh 2016-06-12 Remark is obsolete as the two sets key binding are presented along within tables
++ <hr>
++ <h2 id="Key:lynx">
++ <p>
++ The Lynx-like configuration leaves keymappings unchanged in the
++ menu-selection and line-editing modes.
++ </p>
++ </h2>
++-->
++ <hr>
++ <h2 id="Mouse">
++ Mouse Operation
++ </h2>
++ <p>
++ If w3m is compiled with mouse support and you are invoking w3m
++ either from a console with GPM or from an X terminal emulator, you
++ can use the mouse for navigation (in the case of rxvt, you need to
++ set the TERM environment variable to <q>xterm</q> or <q>kterm</q>).
++ </p>
++ <p>An introduction to configure mouse actions is provided
++ with <a href="README.mouse">README.mouse</a>.
++ </p>
++ <table border="1">
++ <colgroup>
++ <col width="20%">
++ <col width="80%">
++ </colgroup>
++ <tr>
++ <th>Operation
++ </th>
++ <th>Description
++ </th>
++ </tr>
++ <tr>
++ <td>
++ left click
++ </td>
++ <td>
++<b>First:</b><br>
++Moves the cursor to the place indicated by the mouse pointer.<br>
++<b>Then:</b><br>
++Follows a hyperlink the cursor is currently located and the mouse points to.
++ </td>
++ </tr>
++ <tr>
++ <td>
++ middle click
++ </td>
++ <td>
++ Back to the previous buffer.
++ </td>
++ </tr>
++ <tr>
++ <td>
++ right click
++ </td>
++ <td>
++ Open pop-up menu. You can choose an item by clicking it.
++ </td>
++ </tr>
++ <tr>
++ <td>
++ left drag
++ </td>
++ <td>
++ Scroll document. The default behavior is to grab the document
++ and drag it. You can reverse the behavior (grab the window and
++ drag it) with the options setting panel.
++ </td>
++ </tr>
++ </table>
++ <hr>
++ <h2 id="LocalCGI">
++ Local CGI scripts
++ </h2>
++ <p>
++ You can run CGI scripts using w3m, without any HTTP server.
++ This means that w3m behaves like an HTTP server and runs the CGI
++ script, then reads the output of the script and displays it. For
++ example, the bookmark registration system and default directory
++ browser are realized as local CGI scripts. Moreover, such scripts
++ allow w3m to be used as a form interface to acquire all kinds of
++ data.
++ </p>
++ <p>
++ For security reason, CGI scripts invoked by w3m must be in one of
++ the following directories:
++ </p>
++ <ul>
++ <li>
++ The directory where w3m-related files are stored (typically
++ /usr/local/lib/w3m). This directory can be referenced as $LIB.
++ </li>
++ <li>
++ The /cgi-bin/ directory. You can map /cgi-bin/ to any directory you
++ like in the options setting panel (the <q>Directory corresponds to
++ /cgi-bin</q> field). You can specify multiple paths separated by
++ <q>:</q>, like /usr/local/cgi-bin:/home/aito/cgi-bin. It is not
++ recommended to include the current directory to this path. To use
++ a /cgi-bin/ directory, you must use a file:/cgi-bin URL as follows:
++ </li>
+ <pre>
+ w3m -o cgi_bin=/path/to/cgi-bin file:/cgi-bin/script.cgi
+ </pre>
+-It is not recommended to include current directory to this path.
+-</ul>
+-<p>
+-The CGI script can use special header `w3m-control:' to control w3m.
+-This field can take any function (see <a href="README.func">README.func</a>),
+-and the specified function is invoked after the document is displayed.
+-For example, The CGI output
++ </ul>
++ <p>
++ The CGI script can use the special header
++ <span class="mono">w3m-control:</span> to
++ control w3m. This field can take any function (see
++ <a href="README.func">README.func</a>), and the specified function
++ is invoked after the document is displayed. For example, the CGI
++ output
++ </p>
+ <pre>
+-
+ Content-Type: text/plain
+ W3m-control: BACK
+-
+ </pre>
+-will display blank page and delete that buffer immediately.
+-This is useful when you don't want to display any page after
+-the script is invoked. The next example
++ <p>
++ will display a blank page and delete that buffer immediately.
++ This is useful when you don't want to display any page after
++ the script is invoked. The next example
++ </p>
+ <pre>
+-
+ Content-Type: text/plain
+ W3m-control: DELETE_PREVBUF
+-
+ contents.....
+ </pre>
+-will override the current buffer.
+-<p>
+-One w3m-control: header have to contain only one function, but you can
+-include more than one w3m-control: lines in the HTTP header.
+-In addition, you can specify an argument to GOTO function:
++ <p>
++ will override the current buffer.
++ </p>
++ <p>
++ Each header <span class="mono">w3m-control:</span> can
++ contain only one function, but you can
++ include more than one <span class="mono">w3m-control:</span>
++ line in the HTTP header.
++ In addition, you can specify an argument to the GOTO function:
++ </p>
+ <pre>
+-
+ Content-Type: text/plain
+-W3m-control: GOTO http://www.yahoo.com/
+-
++W3m-control: GOTO http://www.example.org/
+ </pre>
+-This example works exactly the same way to the Location header:
++ <p>
++ This example works exactly the same way as the Location header:
++ </p>
+ <pre>
+-
+ Content-Type: text/plain
+-Location: http://www.yahoo.com/
+-
++Location: http://www.example.org/
+ </pre>
+-Note that this header has no effect when the CGI script is invoked
+-through HTTP server.
+-
+-</body>
++ <p>
++ Note that this header has no effect when the CGI script is invoked
++ through an HTTP server.
++ </p>
++ </body>
+ </html>
+diff --git a/doc/README b/doc/README
+index 324ea3e..60d6d19 100644
+--- a/doc/README
++++ b/doc/README
+@@ -115,7 +115,6 @@ Current Maintainer
+ Tohoku University Hospital
+ satodai@w3m.jp
+
+-Feel free to send your opinion to the w3m mailing-lists.
+- w3m-dev@sic.med.tohoku.ac.jp (Japanese)
+- w3m-dev-en@sic.med.tohoku.ac.jp (English)
++Feel free to send your opinion to:
+ http://w3m.sourceforge.net/
++ https://sourceforge.net/projects/w3m/
+diff --git a/doc/README.cookie b/doc/README.cookie
+index 56cca50..da16947 100644
+--- a/doc/README.cookie
++++ b/doc/README.cookie
+@@ -37,7 +37,7 @@ cookie support of w3m
+ (HDN: host domain name)
+
+
+- ¡¦ If the number of "." in domain name is lesser than 2, it is
++ * If the number of "." in domain name is lesser than 2, it is
+ assumed as invalid cookie (cf. RFC 2109 4.3.2), however, you can
+ use cookie_avoid_wrong_number_of_dots to avoid this
+ restriction. You can set this in "Domains to avoid [wrong number
+diff --git a/doc/README.func b/doc/README.func
+index 0b2c034..a3ef3ac 100644
+--- a/doc/README.func
++++ b/doc/README.func
+@@ -1,145 +1,146 @@
+-ABORT Quit w3m without confirmation
+-ACCESSSKEY Popup acceskey menu
+-ADD_BOOKMARK Add current page to bookmark
++ABORT Quit at once
++ACCESSKEY Pop up accesskey menu
++ADD_BOOKMARK Add current page to bookmarks
+ ALARM Set alarm
+-BACK Back to previous buffer
++BACK Close current buffer and return to the one below in stack
+ BEGIN Go to the first line
+-BOOKMARK Read bookmark
+-CENTER_H Move to the center line
+-CENTER_V Move to the center column
+-CHARSET Change the current document charset
+-CLOSE_TAB Close current tab
+-CLOSE_TAB_MOUSE Close tab on mouse cursor (for mouse action)
+-COMMAND Execute w3m command(s)
++BOOKMARK View bookmarks
++CENTER_H Center on cursor column
++CENTER_V Center on cursor line
++CHARSET Change the character encoding for the current document
++CLOSE_TAB Close tab
++CLOSE_TAB_MOUSE Close tab at mouse pointer
++COMMAND Invoke w3m function(s)
+ COOKIE View cookie list
+-DEFAULT_CHARSET Change the default document charset
+-DEFINE_KEY Define a binding between a key stroke and a user command
+-DELETE_PREVBUF Delete previous buffer (mainly for local-CGI)
++DEFAULT_CHARSET Change the default character encoding
++DEFINE_KEY Define a binding between a key stroke combination and a command
++DELETE_PREVBUF Delete previous buffer (mainly for local CGI-scripts)
+ DICT_WORD Execute dictionary command (see README.dict)
+-DICT_WORD_AT Execute dictionary command for word at cursor
++DICT_WORD_AT Execute dictionary command for word at cursor
+ DISPLAY_IMAGE Restart loading and drawing of images
+-DOWN Scroll down one line
+-DOWNLOAD Save document source to file
+-DOWNLOAD_LIST Display download list panel
+-EDIT Edit current document
+-EDIT_SCREEN Edit currently rendered document
++DOWN Scroll the screen down one line
++DOWNLOAD Save document source
++DOWNLOAD_LIST Display downloads panel
++EDIT Edit local source
++EDIT_SCREEN Edit rendered copy of document
+ END Go to the last line
+-EXEC_SHELL Execute shell command
+-EXIT Quit w3m without confirmation
+-EXTERN Execute external browser
+-EXTERN_LINK View current link using external browser
+-FRAME Render frame
+-GOTO Go to URL
+-GOTO_LINE Go to specified line
+-GOTO_LINK Go to current link
+-GOTO_RELATIVE Go to relative URL
+-HELP View help
+-HISTORY View history of URL
+-INFO View info of current document
+-INTERRUPT Stop loading document
+-INIT_MAILCAP Reread mailcap (mainly for local-CGI)
+-ISEARCH Incremental search forward
++EXEC_SHELL Execute shell command and display output
++EXIT Quit at once
++EXTERN Display using an external browser
++EXTERN_LINK Display target using an external browser
++FRAME Toggle rendering HTML frames
++GOTO Open specified document in a new buffer
++GOTO_LINE Go to the specified line
++GOTO_LINK Follow current hyperlink in a new buffer
++GOTO_RELATIVE Go to relative address
++HELP Show help panel
++HISTORY Show browsing history
++INFO Display information about the current document
++INTERRUPT Suspend w3m to background
++ISEARCH Incremental search forward
+ ISEARCH_BACK Incremental search backward
+-LEFT Shift screen one column
+-LINE_BEGIN Go to the beginning of line
+-LINE_END Go to the end of line
+-LINE_INFO Show current line number
+-LINK_BEGIN Go to the first link
+-LINK_END Go to the last link
+-LINK_MENU Popup link element menu
+-LIST Show all links and images
+-LIST_MENU Popup link list menu and go to selected link
+-LOAD Load local file
+-MAIN_MENU Popup menu
++LEFT Shift screen one column left
++LINE_BEGIN Go to the beginning of the line
++LINE_END Go to the end of the line
++LINE_INFO Display current position in document
++LINK_BEGIN Move to the first hyperlink
++LINK_END Move to the last hyperlink
++LINK_MENU Pop up link element menu
++LIST Show all URLs referenced
++LIST_MENU Pop up menu for hyperlinks to browse to
++LOAD Open local file in a new buffer
++MAIN_MENU Pop up menu
+ MARK Set/unset mark
+-MARK_MID Mark Message-ID-like strings as anchors
+-MARK_URL Mark URL-like strings as anchors
+-MARK_WORD Mark current word as anchor
+-MENU Popup menu
+-MENU_MOUSE Popup menu at mouse cursor (for mouse action)
+-MOUSE_TOGGLE Toggle activity of mouse
+-MOVE_DOWN Move cursor down (a half screen scroll at the end of screen)
+-MOVE_DOWN1 Move cursor down (1 line scroll at the end of screen)
+-MOVE_LEFT Move cursor left (a half screen shift at the left edge)
+-MOVE_LEFT1 Move cursor left (1 columns shift at the left edge)
+-MOVE_LIST_MENU Popup link list menu and move cursor to selected link
+-MOVE_MOUSE Move cursor to mouse cursor (for mouse action)
+-MOVE_RIGHT Move cursor right (a half screen shift at the right edge)
+-MOVE_RIGHT1 Move cursor right (1 columns shift at the right edge)
+-MOVE_UP Move cursor up (a half screen scroll at the top of screen)
+-MOVE_UP1 Move cursor up (1 line scrol at the top of screen)
+-MSGS Display error messages
+-NEW_TAB Open new tab
+-NEXT Move to next buffer
+-NEXT_DOWN Move to next downward link
+-NEXT_LEFT Move to next left link
+-NEXT_LEFT_UP Move to next left (or upward) link
+-NEXT_LINK Move to next link
+-NEXT_MARK Move to next word
+-NEXT_PAGE Move to next page
+-NEXT_RIGHT Move to next right link
+-NEXT_RIGHT_DOWN Move to next right (or downward) link
+-NEXT_TAB Move to next tab
+-NEXT_UP Move to next upward link
+-NEXT_VISITED Move to next visited link
+-NEXT_WORD Move to next word
+-NOTHING Do nothing
++MARK_MID Turn Message-ID-like strings into hyperlinks
++MARK_URL Turn URL-like strings into hyperlinks
++MARK_WORD Turn current word into hyperlink
++MENU Pop up menu
++MENU_MOUSE Pop up menu at mouse pointer
++MOUSE_TOGGLE Toggle mouse support
++MOVE_DOWN Cursor down
++MOVE_DOWN1 Cursor down. With edge touched, slide
++MOVE_LEFT Cursor left
++MOVE_LEFT1 Cursor left. With edge touched, slide
++MOVE_LIST_MENU Pop up menu to navigate between hyperlinks
++MOVE_MOUSE Move cursor to mouse pointer
++MOVE_RIGHT Cursor right
++MOVE_RIGHT1 Cursor right. With edge touched, slide
++MOVE_UP Cursor up
++MOVE_UP1 Cursor up. With edge touched, slide
++MSGS Display error messages
++NEW_TAB Open a new tab (with current document)
++NEXT Switch to the next buffer
++NEXT_DOWN Move downward to the next hyperlink
++NEXT_HALF_PAGE Scroll down half a page
++NEXT_LEFT Move left to the next hyperlink
++NEXT_LEFT_UP Move left or upward to the next hyperlink
++NEXT_LINK Move to the next hyperlink
++NEXT_MARK Go to the next mark
++NEXT_PAGE Scroll down one page
++NEXT_RIGHT Move right to the next hyperlink
++NEXT_RIGHT_DOWN Move right or downward to the next hyperlink
++NEXT_TAB Switch to the next tab
++NEXT_UP Move upward to the next hyperlink
++NEXT_VISITED Move to the next visited hyperlink
++NEXT_WORD Move to the next word
++NOTHING Do nothing
+ NULL Do nothing
+-OPTIONS Option setting panel
+-PEEK Peek current URL
+-PEEK_IMG Peek image URL
+-PEEK_LINK Peek link URL
+-PIPE_BUF Send rendered document to pipe
+-PIPE_SHELL Execute shell command and browse
+-PREV Move to previous buffer
+-PREV_LINK Move to previous link
+-PREV_MARK Move to previous mark
+-PREV_PAGE Move to previous page
+-PREV_TAB Move to previous tab
+-PREV_VISITED Move to previous visited link
+-PREV_WORD Move to previous word
+-PRINT Save buffer to file
+-QUIT Quit w3m
+-READ_SHELL Execute shell command and load
++OPTIONS Display options setting panel
++PEEK Show current address
++PEEK_IMG Show image address
++PEEK_LINK Show target address
++PIPE_BUF Pipe current buffer through a shell command and display output
++PIPE_SHELL Execute shell command and display output
++PREV Switch to the previous buffer
++PREV_HALF_PAGE Scroll up half a page
++PREV_LINK Move to the previous hyperlink
++PREV_MARK Go to the previous mark
++PREV_PAGE Scroll up one page
++PREV_TAB Switch to the previous tab
++PREV_VISITED Move to the previous visited hyperlink
++PREV_WORD Move to the previous word
++PRINT Save rendered document
++QUIT Quit with confirmation request
++READ_SHELL Execute shell command and display output
+ REDO Cancel the last undo
+-REDRAW Redraw screen
+-REG_MARK Set mark using regexp
+-REINIT Reload configuration files
+-RELOAD Reload buffer
+-RESHAPE Re-render buffer
++REDRAW Draw the screen anew
++REG_MARK Mark all occurences of a pattern
++REINIT Reload configuration file
++RELOAD Load current document anew
++RESHAPE Re-render document
+ RIGHT Shift screen one column right
+-SAVE Save document source to file
+-SAVE_IMAGE Save image to file
+-SAVE_LINK Save link to file
+-SAVE_SCREEN Save rendered document to file
++SAVE Save document source
++SAVE_IMAGE Save inline image
++SAVE_LINK Save hyperlink target
++SAVE_SCREEN Save rendered document
+ SEARCH Search forward
+ SEARCH_BACK Search backward
+ SEARCH_FORE Search forward
+-SEARCH_NEXT Search next regexp
+-SEARCH_PREV Search previous regexp
+-SELECT Go to buffer selection panel
+-SELECT_MENU Popup buffer selection menu
+-SETENV Set environment variable
+-SET_OPTION Set option
+-SHELL Execute shell command
++SEARCH_NEXT Continue search forward
++SEARCH_PREV Continue search backward
++SELECT Display buffer-stack panel
++SELECT_MENU Pop up buffer-stack menu
++SETENV Set environment variable
++SET_OPTION Set option
++SHELL Execute shell command and display output
+ SHIFT_LEFT Shift screen left
+ SHIFT_RIGHT Shift screen right
+-SOURCE View HTML source
++SOURCE Toggle between HTML shown or processed
+ STOP_IMAGE Stop loading and drawing of images
+ SUBMIT Submit form
+-SUSPEND Stop loading document
+-TAB_GOTO Open URL on new tab
+-TAB_GOTO_RELATIVE Open relative URL on new tab
+-TAB_LEFT Move current tab left
+-TAB_LINK Open current link on new tab
+-TAB_MENU Popup tab selection menu
+-TAB_MOUSE Move to tab on mouse cursor (for mouse action)
+-TAB_RIGHT Move current tab right
++SUSPEND Suspend w3m to background
++TAB_GOTO Open specified document in a new tab
++TAB_GOTO_RELATIVE Open relative address in a new tab
++TAB_LEFT Move left along the tab bar
++TAB_LINK Follow current hyperlink in a new tab
++TAB_MENU Pop up tab selection menu
++TAB_MOUSE Select tab by mouse action
++TAB_RIGHT Move right along the tab bar
+ UNDO Cancel the last cursor movement
+-UP Scroll up one line
+-VERSION Display version of w3m
+-VIEW View HTML source
+-VIEW_BOOKMARK View bookmark
+-VIEW_IMAGE View image
+-WHEREIS Search forward
+-WRAP_TOGGLE Toggle wrap search mode
++UP Scroll the screen up one line
++VERSION Display the version of w3m
++VIEW Toggle between HTML shown or processed
++VIEW_BOOKMARK View bookmarks
++VIEW_IMAGE Display image in viewer
++WHEREIS Search forward
++WRAP_TOGGLE Toggle wrapping mode in searches
+diff --git a/doc/README.img b/doc/README.img
+index 0c10114..f11362f 100644
+--- a/doc/README.img
++++ b/doc/README.img
+@@ -41,7 +41,7 @@ Key functions
+ Specify the following keymaps in ~/.w3m/keymap.
+ keymap X DISPLAY_IMAGE
+ keymap C-c STOP_IMAGE
+- keyamp t SET_OPTION display_image=toggle
++ keymap t SET_OPTION display_image=toggle
+
+ Commandline options
+
+diff --git a/doc/README.m17n b/doc/README.m17n
+index c064d76..da5408b 100644
+--- a/doc/README.m17n
++++ b/doc/README.m17n
+@@ -49,7 +49,7 @@ Supported encoding schemes (character set)
+ * Thai
+ TIS-620 (ISO-8859-11), CP874
+ * Other
+- US_ASCII, ISO-8859-1 ¡Á 10, 13 ¡Á 15,
++ US_ASCII, ISO-8859-1 - 10, 13 - 15,
+ KOI8-R, KOI8-U, NeXT, CP437, CP737, CP775, CP850, CP852, CP855, CP856,
+ CP857, CP860, CP861, CP862, CP863, CP864, CP865, CP866, CP869, CP1006,
+ CP1250, CP1251, CP1252, CP1253, CP1254, CP1255, CP1256, CP1257
+diff --git a/doc/README.siteconf b/doc/README.siteconf
+new file mode 100644
+index 0000000..39b1028
+--- /dev/null
++++ b/doc/README.siteconf
+@@ -0,0 +1,60 @@
++The siteconf: Site-specific preferences
++
++The siteconf consists of URL patterns and preferences associated to them.
++You can improve "decode_url" feature by giving charsets of URLs site by site,
++or bypass Google's redirector for performance and your privacy.
++
++The siteconf is read from ~/.w3m/siteconf by default.
++
++===== The syntax =====
++
++url <url>|/<re-url>/|m@<re-url>@i [exact]
++substitute_url "<destination-url>"
++url_charset <charset>
++no_referer_from on|off
++no_referer_to on|off
++
++The last match wins.
++
++===== Examples =====
++
++url "https://twitter.com/"
++substitute_url "https://mobile.twitter.com/"
++
++This forwards the twitter.com to its mobile site.
++
++url "http://your.bookmark.net/"
++no_referer_from on
++
++This prevents HTTP referers from being sent when you follow links
++at the your.bookmark.net.
++
++url "http://www.google.com/url?" exact
++substitute_url "file:///cgi-bin/your-redirector.cgi?"
++
++This forwards the Google's redirector to your local CGI.
++
++url /^http:\/\/[a-z]*\.wikipedia\.org\//
++url_charset utf-8
++
++When combinated with "decode_url" option turned on, links to
++Wikipedia will be human-readable.
++
++===== Regular expressions notes =====
++
++Following expressions are all equivalent:
++
++/http:\/\/www\.example\.com\//
++m/http:\/\/www\.example\.com\//
++m@http://www\.example\.com/@
++m!http://www\.example\.com/!
++
++With a trailing 'i' modifier, you can specify a case-insensitive match.
++For example, m@^http://www\.example\.com/abc/@i matches to:
++
++http://www.example.com/abc/
++http://www.example.com/Abc/
++http://www.example.com/ABC/
++
++Hostnames, however, are always converted to lowercases before compared.
++
+diff --git a/doc/README.sixel b/doc/README.sixel
+new file mode 100644
+index 0000000..588afc4
+--- /dev/null
++++ b/doc/README.sixel
+@@ -0,0 +1,27 @@
++Sixel support of w3m
++ 2014/11/05
++ K. Araki
++
++Introduction
++
++ This is the extension for w3m to show inline images by sixel graphics.
++
++Requirements
++
++ Install 'img2sixel' command provided by libsixel project.
++ (https://github.com/saitoha/libsixel)
++
++Build
++
++ $ ./configure --enable-image ...
++ $ make
++ $ make install
++
++Usage
++
++ $ w3m -sixel http://...
++
++ You can specify options of 'img2sixel' command by "W3M_IMG2SIXEL"
++ environmental variable.
++
++ $ W3M_IMG2SIXEL="img2sixel -d atkinson" w3m -sixel http://...
+diff --git a/doc/keymap.lynx b/doc/keymap.lynx
+index 869c716..e4085c8 100644
+--- a/doc/keymap.lynx
++++ b/doc/keymap.lynx
+@@ -46,7 +46,7 @@ keymap - PREV_PAGE
+ keymap . RIGHT
+ keymap / SEARCH
+ keymap : MARK_URL
+-keymap ; MARK_WORD
++keymap ";" MARK_WORD
+ keymap < SHIFT_LEFT
+ keymap = INFO
+ keymap > SHIFT_RIGHT
+diff --git a/doc/menu.submenu b/doc/menu.submenu
+index e55193d..e837f46 100644
+--- a/doc/menu.submenu
++++ b/doc/menu.submenu
+@@ -39,6 +39,6 @@ menu Link
+ end
+
+ menu Bookmark
+- func "Read bookmark (b)" BOOKMARK "bB"
++ func "View bookmarks (b)" BOOKMARK "bB"
+ func "Add page to bookmark(a)" ADD_BOOKMARK "aA"
+ end
+diff --git a/doc/w3m.1 b/doc/w3m.1
+index 8f071c6..90488f3 100644
+--- a/doc/w3m.1
++++ b/doc/w3m.1
+@@ -1,13 +1,10 @@
+ .nr N -1
+ .nr D 5
+-.TH W3M 1 Local
+-.UC 4
++.TH W3M 1 "2016-08-06" "w3m 0.5.3"
+ .SH NAME
+-w3m \- a text based Web browser and pager
++w3m \- a text based web browser and pager
+ .SH SYNOPSIS
+-.B w3m
+-[options] [URL or filename]
+-.PP
++w3m [OPTION]... [ \fIfile\fP | \fIURL\fP ]...
+ .SH DESCRIPTION
+ .\" This defines appropriate quote strings for nroff and troff
+ .ds lq \&"
+@@ -17,234 +14,283 @@ w3m \- a text based Web browser and pager
+ .\" Just in case these number registers aren't set yet...
+ .if \nN==0 .nr N 10
+ .if \nD==0 .nr D 5
+-.I
+-w3m
+-is a World Wide Web (WWW) text based client. It has English and
+-Japanese help files and an option menu and can be configured to
+-use either language. It will display hypertext markup language
+-(HTML) documents containing links to files residing on the local
+-system, as well as files residing on remote systems. It can
+-display HTML tables and frames.
+-In addition, it can be used as a "pager" in much the same manner
+-as "more" or "less".
+-Current versions of
+-.I
+-w3m
+-run on
+-Unix (Solaris, SunOS, HP-UX, Linux, FreeBSD, and EWS4800)
+-and on
+-Microsoft Windows 9x/NT.
+-.PP
++
++\fIw3m\fP is a text based browser which can display local or remote
++web pages as well as other documents. It is able to process HTML
++tables and frames but it ignores JavaScript and Cascading Style
++Sheets. \fIw3m\fP can also serve as a pager for text files named as
++arguments or passed on standard input, and as a general purpose
++directory browser.
++
++\fIw3m\fP organizes its content in buffers or tabs, allowing easy
++navigation between them. With the w3m-img extension installed, \fIw3m\fP can
++display inline graphics in web pages. And whenever \fIw3m\fP's HTML
++rendering capabilities do not meet your needs, the target URL can be
++handed over to a graphical browser with a single command.
++
++For help with runtime options, press \(lqH\(rq while running \fIw3m\fP.
++
++.SH ARGUMENTS
++
++When given one or more command line arguments, \fIw3m\fP will handle
++targets according to content type. For web, \fIw3m\fP gets this
++information from HTTP headers; for relative or absolute file system
++paths, it relies on filenames.
++
++With no argument, \fIw3m\fP expects data from standard input and
++assumes \(lqtext/plain\(rq unless another MIME type is given by the user.
++
++If provided with no target and no fallback target (see for instance
++option \fB\-v\fP below), \fIw3m\fP will exit with usage information.
+ .SH OPTIONS
+-At start up, \fIw3m\fR will load any local
+-file or remote URL specified at the command
+-line. For help with runtime options, press \fB"H"\fR
+-while running \fIw3m\fR.
+-Command line options are:
+-.PP
++Command line options are introduced with a single \(lq\-\(rq character and
++may take an argument.
++.SS General options
+ .TP
+-.B -t tab
+-set tab width
++\fB\-B\fP
++with no other target defined, use the bookmark page for startup
+ .TP
+-.B -r
+-ignore backspace effect
+-.TP
+-.B -l line
+-# of preserved line (default 10000)
+-.TP
+-.B -I charset
+-document charset
+-.TP
+-.B -O charset
+-display/output charset
++\fB\-M\fP
++monochrome display
+ .TP
+-.B -B
+-load bookmark
++\fB\-no-mouse\fP
++deactivate mouse support
+ .TP
+-.B -bookmark file
+-specify bookmark file
++\fB\-num\fP
++display each line's number
+ .TP
+-.B -T type
+-specify content-type
++\fB\-N\fP
++distribute multiple command line arguments to tabs. By default, a
++stack of buffers is used
++.TP
++\fB\-ppc \fInum\fR
++width of \fInum\fR pixels per character. Range of 4.0 to 32.0, default 8.0.
++Larger values will make tables narrower. (Implementation not verified)
+ .TP
+-.B -m
+-internet message mode
++\fB\-ppl \fInum\fR
++height of \fInum\fR pixels per line. Range of 4.0 to 64.0. (Implementation not verified)
+ .TP
+-.B -v
+-visual startup mode
++\fB\-title\fP, \fB\-title=TERM\fP
++use the buffer name as terminal title string. With specified TERM,
++this sets the title configuration style accordingly
+ .TP
+-.B -M
+-monochrome display
++\fB\-v\fP
++with no other target defined, welcome users with a built-in page
+ .TP
+-.B -N
+-open URL of command line on each new tab
++\fB\-W\fP
++toggle wrapping mode in searches
+ .TP
+-.B -F
+-automatically render frame
++\fB\-X\fP
++do not initialize/deinitialize the terminal
+ .TP
+-.B -dump
+-dump formatted page into stdout
++\fB+\fInum\fR
++go to line \fInum\fR; only effective for \fInum\fR larger than the number of lines in the terminal
++.SS Browser options
+ .TP
+-.B -cols width
+-specify column width (used with -dump)
++\fB\-cols \fInum\fR
++with stdout as destination; HTML is rendered to lines of \fInum\fR characters
+ .TP
+-.B -ppc count
+-specify the number of pixels per character (4.0...32.0).
+-Larger values will make tables narrower. [default 8.0]
++\fB\-cookie\fP, \fB\-no-cookie\fP
++use stored cookies and accept new ones, or do neither
+ .TP
+-.B -ppl count
+-specify the number of pixels per line (4.0...64.0)
++\fB\-F\fP
++render frames
+ .TP
+-.B -dump_source
+-dump page source into stdout
++\fB\-graph\fP, \fB\-no-graph\fP
++use or do not use graphic characters for drawing HTML table and frame borders
+ .TP
+-.B -dump_head
+-dump response of HEAD request into stdout
++\fB\-header \fIstring\fR
++append \fIstring\fR to the HTTP(S) request. Expected to match the header syntax \f(CWVariable: Value\fP
+ .TP
+-.B -dump_both
+-dump HEAD and source into stdout
++\fB\-m\fP
++Render the body of Usenet messages according to the header \(lqContent-type\(rq
+ .TP
+-.B -dump_extra
+-dump HEAD, source, and extra information into stdout
++\fB\-no-proxy\fP
++do not use proxy
+ .TP
+-.B -post file
+-use POST method with file content
++\fB\-post \fIfile\fR
++use POST method to upload data defined in \fIfile\fR. The syntax to be used
++is \f(CWvar1=value1[&var2=value2]...\fP
+ .TP
+-.B -header string
+-insert string as a header
++\fB\-4\fP
++IPv4 only. Corresponds to dns_order=4 in configuration files
+ .TP
+-.B +<num>
+-goto <num> line
++\fB\-6\fP
++IPv6 only. Corresponds to dns_order=6 in configuration files
++.SS Text pager options
+ .TP
+-.B -num
+-show line number
++\fB\-l \fInum\fR
++number of lines preserved internally when receiving plain text from
++stdin (default 10,000)
+ .TP
+-.B -no-proxy
+-don't use proxy
++\fB\-r\fP
++use caret notation to display special escape characters (such
++as ANSI escapes or nroff-style backspaces for bold and underlined
++characters) instead of processing them
+ .TP
+-.B -4
+-IPv4 only (-o dns_order=4)
++\fB\-s\fP
++squeeze multiple blank lines into one
+ .TP
+-.B -6
+-IPv6 only (-o dns_order=6)
++\fB\-t\fP \fInum\fP
++set tab width to \fInum\fR columns. No effect on stdout
++.SS Data type/encoding options
+ .TP
+-.B -no-mouse
+-don't use mouse
++\fB\-I \fIcharset\fR
++user defined character encoding of input data
+ .TP
+-.B -cookie
+-use cookie.
++\fB\-O \fIcharset\fR
++user defined character encoding of output data
+ .TP
+-.B -no-cookie
+-don't use cookie
++\fB\-T \fItype\fR
++explicit characterization of input data by MIME type
++.SS Options for data output, followed by immediate exit
+ .TP
+-.B -graph
+-use graphic character
++\fB\-dump\fP
++dump rendered page into stdout. Set implicitly when output is directed
++to a file or pipe
+ .TP
+-.B -no-graph
+-don't use graphic character
++\fB\-dump_source\fP
++dump the page's source code into stdout
+ .TP
+-.B -S
+-squeeze multiple blank lines
++\fB\-dump_head\fP
++dump response of a HEAD request for a URL into stdout
+ .TP
+-.B -W
+-toggle wrap search mode
++\fB\-dump_both\fP
++dump HEAD, and source code for a URL into stdout
+ .TP
+-.B -X
+-don't use termcap init/deinit
++\fB\-dump_extra\fP
++dump HEAD, source code, and extra information for a URL into stdout
+ .TP
+-.B -title [=TERM]
+-set buffer name to terminal title string.
+-If TERM is specified, use the TERM style title configuration.
++\fB\-help\fP
++show a summary of compiled-in features and command line options
+ .TP
+-.B -o opt=value
+-assign value to config option
++\fB\-show-option\fP
++show all available configuration options
+ .TP
+-.B -show-option
+-show all available config option
++\fB\-version\fP
++show the version of \fIw3m\fP
++.SS Options for overriding default settings and resources
+ .TP
+-.B -config file
+-specify config file
++\fB\-bookmark \fIfile\fR
++use \fIfile\fR instead of the default bookmark.html file
+ .TP
+-.B -help
+-show usage
++\fB\-config \fIfile\fR
++use \fIfile\fR instead of the default configuration file
+ .TP
+-.B -version
+-show w3m version
++\fB\-debug\fP
++DO NOT USE
+ .TP
+-.B -reqlog
+-write request logfile
++\fB\-o \fIoption=value\fR
++modify one configuration item with an explicitly given value; without \fIoption=value\fR, equivalent to \fB-show-option\fR
+ .TP
+-.B -debug
+-DO NOT USE
++\fB\-reqlog\fP
++log headers of HTTP communication in file \f(CW~/.w3m/request.log\fP
+ .SH EXAMPLES
++.SS Pager-like usage
++.TP
++Combine snippets of HTML code and preview the page
++.EX
++$ cat header.html footer.html | w3m -T text/html
++.EE
++.TP
++Compare two files using tabs
++.EX
++$ w3m -N config.old config
++.EE
++.SS Browser-like usage
++.TP
++Display web content in monochrome terminal
++.EX
++$ w3m -M http://w3m.sourceforge.net
++.EE
++.TP
++Display embedded graphics
++.EX
++$ w3m -o auto_image=TRUE http://w3m.sourceforge.net
++.EE
++.TP
++Display content from Usenet
++.EX
++$ w3m -m nntp://news.aioe.org/comp.os.linux.networking
++.EE
++.TP
++Upload data for a URL using the POST method
++.EX
++$ w3m -post - http://example.com/form.php <<<'a=0&b=1'
++.EE
++.SS Filter-like usage
++.TP
++Convert an HTML file to plain text with a defined line length
++.EX
++$ w3m -cols 40 foo.html > foo.txt
++.EE
++.TP
++Output the bookmarks page as text with an appended list of links
++.EX
++$ w3m -B -o display_link_number=1 > out.txt
++.EE
++.TP
++Conversion of file format and character encoding
++.EX
++$ w3m -T text/html -I EUC-JP -O UTF-8 < foo.html > foo.txt
++.EE
++.SS Start with no input
++.TP
++Welcome users with a built-in page
++.EX
++$ w3m -v
++.EE
++.\".SH Errors
++.SH ENVIRONMENT
++\fIw3m\fP recognises the environment variable WWW_HOME as defining a
++fallback target for use if it is invoked without one.
++.SH FILES
+ .TP
+-To use w3m as a pager:
+-.br
+-$ ls | w3m
+-.br
+-.TP
+-To use w3m to translate HTML files:
+-.br
+-$ cat foo.html | w3m -T text/html
++\f(CW~/.w3m/bookmark.html\fP
++default bookmark file
+ .TP
+-or
+-.br
+-$ cat foo.html | w3m -dump -T text/html >foo.txt
+-.SH FILES
++\f(CW~/.w3m/config\fP
++user defined configuration file; overrides \f(CW/etc/w3m/config\fP
+ .TP
+-.I ${HOME}/.w3m/config
+-configuration file
++\f(CW~/.w3m/cookie\fP
++cookie jar; written on exit, read on launch
+ .TP
+-.I ${HOME}/.w3m/keymap
+-key binding configuration file
+-.\" .TP
+-.\" .I ${HOME}/.w3m/menu
+-.\" ???
++\f(CW~/.w3m/history\fP
++browser history - visited files and URLs
+ .TP
+-.I ${HOME}/.w3m/mouse
+-mouse configuration file
++\f(CW~/.w3m/keymap\fP
++user defined key bindings; overrides default key bindings
+ .TP
+-.I ${HOME}/.w3m/cookie
+-cookie file
++\f(CW~/.w3m/mailcap\fP
++external viewer configuration file
+ .TP
+-.I ${HOME}/.w3m/history
+-history file
++\f(CW~/.w3m/menu\fP
++user defined menu; overrides default menu
+ .TP
+-.I ${HOME}/.w3m/passwd
+-passowrd and username file
++\f(CW~/.w3m/mime.types\fP
++MIME types file
+ .TP
+-.I ${HOME}/.w3m/pre_form
+-form parameters file
++\f(CW~/.w3m/mouse\fP
++user defined mouse settings
+ .TP
+-.I ${HOME}/.w3m/mailcap
+-external viewer configuration file
++\f(CW~/.w3m/passwd\fP
++password and username file
+ .TP
+-.I ${HOME}/.w3m/mime.types
+-MIME types file
++\f(CW~/.w3m/pre_form\fP
++contains predefined values to fill recurrent HTML forms
+ .\" .TP
+-.\" .I ${HOME}/.w3m/urimethodmap
++.\" .I $~/.w3m/urimethodmap
+ .\" ???
+-.SH NOTES
+-This is the
+-.I
+-w3m
+-0.5.3 Release.
+-.PP
+-Please see the MANUAL.html file distributed with w3m for
+-more detailed documentation.
+-
+-Additional information about
+-.I
+-w3m
+-may be found on its Japanese language Web site located at:
+- http://w3m.sourceforge.net/index.ja.html
+-.br
+-or on its English version of the site at:
+- http://w3m.sourceforge.net/index.en.html
++.SH SEE ALSO
++README and example files are to be found in the doc directory of your \fIw3m\fP installation. Recent information about \fIw3m\fP may be found on
++.UR http://w3m.sourceforge.net
++the project's web pages at
++.UE
+ .SH ACKNOWLEDGMENTS
+-.I
+-w3m
+-has incorporated code from several sources.
++\fIw3m\fP has incorporated code from several sources.
+ Users have contributed patches and suggestions over time.
+ .SH AUTHOR
+-Akinori ITO <aito@fw.ipsj.or.jp>
++.UR aito@fw.ipsj.or.jp
++Akinori ITO
++.UE
++
+diff --git a/entity.c b/entity.c
+index fdd8f64..45dc95e 100644
+--- a/entity.c
++++ b/entity.c
+@@ -44,6 +44,8 @@ conv_entity(unsigned int c)
+ return " ";
+ if (c == 0xa0)
+ return NBSP;
++ if (c == 0xad) /* SOFT HYPHEN */
++ return "";
+ if (c < 0x100) { /* Latin1 (ISO 8859-1) */
+ if (UseAltEntity)
+ return alt_latin1[c - 0xa0];
+diff --git a/etc.c b/etc.c
+index 8fe1215..dcc6edd 100644
+--- a/etc.c
++++ b/etc.c
+@@ -1365,7 +1365,13 @@ setup_child(int child, int i, int f)
+ if (!child)
+ SETPGRP();
+ #endif /* __MINGW32_VERSION */
++ /*
++ * I don't know why but close_tty() sometimes interrupts loadGeneralFile() in loadImage()
++ * and corrupt image data can be cached in ~/.w3m.
++ */
++#if 0
+ close_tty();
++#endif
+ close_all_fds_except(i, f);
+ QuietMessage = TRUE;
+ fmInitialized = FALSE;
+diff --git a/file.c b/file.c
+index 567d41e..b66f8c8 100644
+--- a/file.c
++++ b/file.c
+@@ -26,6 +26,8 @@
+ #define min(a,b) ((a) > (b) ? (b) : (a))
+ #endif /* not min */
+
++#define MAX_INPUT_SIZE 80 /* TODO - max should be screen line length */
++
+ static int frame_source = 0;
+
+ static char *guess_filename(char *file);
+@@ -47,11 +49,11 @@ static JMP_BUF AbortLoading;
+ static struct table *tables[MAX_TABLE];
+ static struct table_mode table_mode[MAX_TABLE];
+
+-#ifdef USE_IMAGE
++#if defined(USE_M17N) || defined(USE_IMAGE)
+ static ParsedURL *cur_baseURL = NULL;
+-#ifdef USE_M17N
+-static char cur_document_charset;
+ #endif
++#ifdef USE_M17N
++static wc_ces cur_document_charset = 0;
+ #endif
+
+ static Str cur_title;
+@@ -67,7 +69,7 @@ static int cur_status;
+ #ifdef MENU_SELECT
+ /* menu based <select> */
+ FormSelectOption *select_option;
+-static int max_select = MAX_SELECT;
++int max_select = MAX_SELECT;
+ static int n_select;
+ static int cur_option_maxwidth;
+ #endif /* MENU_SELECT */
+@@ -79,7 +81,7 @@ static int cur_textarea_rows;
+ static int cur_textarea_readonly;
+ static int n_textarea;
+ static int ignore_nl_textarea;
+-static int max_textarea = MAX_TEXTAREA;
++int max_textarea = MAX_TEXTAREA;
+
+ static int http_response_code;
+
+@@ -215,7 +217,6 @@ currentLn(Buffer *buf)
+
+ static Buffer *
+ loadSomething(URLFile *f,
+- char *path,
+ Buffer *(*loadproc) (URLFile *, Buffer *), Buffer *defaultbuf)
+ {
+ Buffer *buf;
+@@ -223,17 +224,23 @@ loadSomething(URLFile *f,
+ if ((buf = loadproc(f, defaultbuf)) == NULL)
+ return NULL;
+
+- buf->filename = path;
+ if (buf->buffername == NULL || buf->buffername[0] == '\0') {
+ buf->buffername = checkHeader(buf, "Subject:");
+- if (buf->buffername == NULL)
+- buf->buffername = conv_from_system(lastFileName(path));
++ if (buf->buffername == NULL && buf->filename != NULL)
++ buf->buffername = conv_from_system(lastFileName(buf->filename));
+ }
+ if (buf->currentURL.scheme == SCM_UNKNOWN)
+ buf->currentURL.scheme = f->scheme;
+- buf->real_scheme = f->scheme;
+ if (f->scheme == SCM_LOCAL && buf->sourcefile == NULL)
+- buf->sourcefile = path;
++ buf->sourcefile = buf->filename;
++ if (loadproc == loadHTMLBuffer
++#ifdef USE_IMAGE
++ || loadproc == loadImageBuffer
++#endif
++ )
++ buf->type = "text/html";
++ else
++ buf->type = "text/plain";
+ return buf;
+ }
+
+@@ -484,28 +491,6 @@ convertLine0(URLFile *uf, Str line, int mode)
+ return line;
+ }
+
+-/*
+- * loadFile: load file to buffer
+- */
+-Buffer *
+-loadFile(char *path)
+-{
+- Buffer *buf;
+- URLFile uf;
+- init_stream(&uf, SCM_LOCAL, NULL);
+- examineFile(path, &uf);
+- if (uf.stream == NULL)
+- return NULL;
+- buf = newBuffer(INIT_BUFFER_WIDTH);
+- current_content_length = 0;
+-#ifdef USE_M17N
+- content_charset = 0;
+-#endif
+- buf = loadSomething(&uf, path, loadBuffer, buf);
+- UFclose(&uf);
+- return buf;
+-}
+-
+ int
+ matchattr(char *p, char *attr, int len, Str *value)
+ {
+@@ -694,6 +679,7 @@ readHeader(URLFile *uf, Buffer *newBuf, int thru, ParsedURL *pu)
+ #endif
+ init_stream(&f, SCM_LOCAL, newStrStream(src));
+ loadHTMLstream(&f, newBuf, NULL, TRUE);
++ UFclose(&f);
+ for (l = newBuf->lastLine; l && l->real_linenumber;
+ l = l->prev)
+ l->real_linenumber = 0;
+@@ -1244,6 +1230,7 @@ AuthDigestCred(struct http_auth *ha, Str uname, Str pw, ParsedURL *pu,
+ unsigned char md5[MD5_DIGEST_LENGTH + 1];
+ Str uri = HTTPrequestURI(pu, hr);
+ char nc[] = "00000001";
++ FILE *fp;
+
+ Str algorithm = qstr_unquote(get_auth_param(ha->param, "algorithm"));
+ Str nonce = qstr_unquote(get_auth_param(ha->param, "nonce"));
+@@ -1326,10 +1313,11 @@ AuthDigestCred(struct http_auth *ha, Str uname, Str pw, ParsedURL *pu,
+ /* A2 = Method ":" digest-uri-value ":" H(entity-body) */
+ if (request && request->body) {
+ if (request->method == FORM_METHOD_POST && request->enctype == FORM_ENCTYPE_MULTIPART) {
+- FILE *fp = fopen(request->body, "r");
++ fp = fopen(request->body, "r");
+ if (fp != NULL) {
+ Str ebody;
+ ebody = Strfgetall(fp);
++ fclose(fp);
+ MD5(ebody->ptr, strlen(ebody->ptr), md5);
+ }
+ else {
+@@ -1697,13 +1685,15 @@ getLinkNumberStr(int correction)
+ /*
+ * loadGeneralFile: load file to buffer
+ */
++#define DO_EXTERNAL ((Buffer *(*)(URLFile *, Buffer *))doExternal)
+ Buffer *
+ loadGeneralFile(char *path, ParsedURL *volatile current, char *referer,
+ int flag, FormList *volatile request)
+ {
+ URLFile f, *volatile of = NULL;
+ ParsedURL pu;
+- Buffer *b = NULL, *(*volatile proc)() = loadBuffer;
++ Buffer *b = NULL;
++ Buffer *(*volatile proc)(URLFile *, Buffer *) = loadBuffer;
+ char *volatile tpath;
+ char *volatile t = "text/plain", *p, *volatile real_type = NULL;
+ Buffer *volatile t_buf = NULL;
+@@ -1730,7 +1720,22 @@ loadGeneralFile(char *path, ParsedURL *volatile current, char *referer,
+ add_auth_cookie_flag = 0;
+
+ checkRedirection(NULL);
++
+ load_doc:
++ {
++ const char *sc_redirect;
++ parseURL2(tpath, &pu, current);
++ sc_redirect = query_SCONF_SUBSTITUTE_URL(&pu);
++ if (sc_redirect && *sc_redirect && checkRedirection(&pu)) {
++ tpath = (char *)sc_redirect;
++ request = NULL;
++ add_auth_cookie_flag = 0;
++ current = New(ParsedURL);
++ *current = pu;
++ status = HTST_NORMAL;
++ goto load_doc;
++ }
++ }
+ TRAP_OFF;
+ url_option.referer = referer;
+ url_option.flag = flag;
+@@ -1863,7 +1868,7 @@ loadGeneralFile(char *path, ParsedURL *volatile current, char *referer,
+ /* 302: Found */
+ /* 303: See Other */
+ /* 307: Temporary Redirect (HTTP/1.1) */
+- tpath = url_quote_conv(p, DocumentCharset);
++ tpath = url_encode(p, NULL, 0);
+ request = NULL;
+ UFclose(&f);
+ current = New(ParsedURL);
+@@ -2022,7 +2027,7 @@ loadGeneralFile(char *path, ParsedURL *volatile current, char *referer,
+ if (f.is_cgi && (p = checkHeader(t_buf, "Location:")) != NULL &&
+ checkRedirection(&pu)) {
+ /* document moved */
+- tpath = url_quote_conv(remove_space(p), DocumentCharset);
++ tpath = url_encode(remove_space(p), NULL, 0);
+ request = NULL;
+ UFclose(&f);
+ add_auth_cookie_flag = 0;
+@@ -2123,10 +2128,6 @@ loadGeneralFile(char *path, ParsedURL *volatile current, char *referer,
+ if (real_type == NULL)
+ real_type = t;
+ proc = loadBuffer;
+-#ifdef USE_IMAGE
+- cur_baseURL = New(ParsedURL);
+- copyParsedURL(cur_baseURL, &pu);
+-#endif
+
+ current_content_length = 0;
+ if ((p = checkHeader(t_buf, "Content-Length:")) != NULL)
+@@ -2197,18 +2198,8 @@ loadGeneralFile(char *path, ParsedURL *volatile current, char *referer,
+ #endif
+ else if (w3m_backend) ;
+ else if (!(w3m_dump & ~DUMP_FRAME) || is_dump_text_type(t)) {
+- if (!do_download && doExternal(f,
+- pu.real_file ? pu.real_file : pu.file,
+- t, &b, t_buf)) {
+- if (b && b != NO_BUFFER) {
+- b->real_scheme = f.scheme;
+- b->real_type = real_type;
+- if (b->currentURL.host == NULL && b->currentURL.file == NULL)
+- copyParsedURL(&b->currentURL, &pu);
+- }
+- UFclose(&f);
+- TRAP_OFF;
+- return b;
++ if (!do_download && searchExtViewer(t) != NULL) {
++ proc = DO_EXTERNAL;
+ }
+ else {
+ TRAP_OFF;
+@@ -2232,36 +2223,30 @@ loadGeneralFile(char *path, ParsedURL *volatile current, char *referer,
+ else if (w3m_dump & DUMP_FRAME)
+ return NULL;
+
++ if (t_buf == NULL)
++ t_buf = newBuffer(INIT_BUFFER_WIDTH);
++ copyParsedURL(&t_buf->currentURL, &pu);
++ t_buf->filename = pu.real_file ? pu.real_file :
++ pu.file ? conv_to_system(pu.file) : NULL;
+ if (flag & RG_FRAME) {
+- if (t_buf == NULL)
+- t_buf = newBuffer(INIT_BUFFER_WIDTH);
+ t_buf->bufferprop |= BP_FRAME;
+ }
+ #ifdef USE_SSL
+- if (t_buf)
+- t_buf->ssl_certificate = f.ssl_certificate;
++ t_buf->ssl_certificate = f.ssl_certificate;
+ #endif
+ frame_source = flag & RG_FRAME_SRC;
+- b = loadSomething(&f, pu.real_file ? pu.real_file : pu.file, proc, t_buf);
++ if (proc == DO_EXTERNAL) {
++ b = doExternal(f, t, t_buf);
++ } else {
++ b = loadSomething(&f, proc, t_buf);
++ }
+ UFclose(&f);
+ frame_source = 0;
+- if (b) {
++ if (b && b != NO_BUFFER) {
+ b->real_scheme = f.scheme;
+ b->real_type = real_type;
+- if (b->currentURL.host == NULL && b->currentURL.file == NULL)
+- copyParsedURL(&b->currentURL, &pu);
+- if (is_html_type(t))
+- b->type = "text/html";
+- else if (w3m_backend) {
+- Str s = Strnew_charp(t);
+- b->type = s->ptr;
+- }
+-#ifdef USE_IMAGE
+- else if (proc == loadImageBuffer)
+- b->type = "text/html";
+-#endif
+- else
+- b->type = "text/plain";
++ if (w3m_backend)
++ b->type = allocStr(t, -1);
+ if (pu.label) {
+ if (proc == loadHTMLBuffer) {
+ Anchor *a;
+@@ -2287,10 +2272,11 @@ loadGeneralFile(char *path, ParsedURL *volatile current, char *referer,
+ if (header_string)
+ header_string = NULL;
+ #ifdef USE_NNTP
+- if (f.scheme == SCM_NNTP || f.scheme == SCM_NEWS)
++ if (b && b != NO_BUFFER && (f.scheme == SCM_NNTP || f.scheme == SCM_NEWS))
+ reAnchorNewsheader(b);
+ #endif
+- preFormUpdateBuffer(b);
++ if (b && b != NO_BUFFER)
++ preFormUpdateBuffer(b);
+ TRAP_OFF;
+ return b;
+ }
+@@ -2469,6 +2455,7 @@ set_breakpoint(struct readbuffer *obuf, int tag_length)
+ bcopy((void *)&obuf->anchor, (void *)&obuf->bp.anchor,
+ sizeof(obuf->anchor));
+ obuf->bp.img_alt = obuf->img_alt;
++ obuf->bp.input_alt = obuf->input_alt;
+ obuf->bp.in_bold = obuf->in_bold;
+ obuf->bp.in_italic = obuf->in_italic;
+ obuf->bp.in_under = obuf->in_under;
+@@ -2486,6 +2473,7 @@ back_to_breakpoint(struct readbuffer *obuf)
+ bcopy((void *)&obuf->bp.anchor, (void *)&obuf->anchor,
+ sizeof(obuf->anchor));
+ obuf->img_alt = obuf->bp.img_alt;
++ obuf->input_alt = obuf->bp.input_alt;
+ obuf->in_bold = obuf->bp.in_bold;
+ obuf->in_italic = obuf->bp.in_italic;
+ obuf->in_under = obuf->bp.in_under;
+@@ -2729,7 +2717,7 @@ flushline(struct html_feed_environ *h_env, struct readbuffer *obuf, int indent,
+ Str line = obuf->line, pass = NULL;
+ char *hidden_anchor = NULL, *hidden_img = NULL, *hidden_bold = NULL,
+ *hidden_under = NULL, *hidden_italic = NULL, *hidden_strike = NULL,
+- *hidden_ins = NULL, *hidden = NULL;
++ *hidden_ins = NULL, *hidden_input = NULL, *hidden = NULL;
+
+ #ifdef DEBUG
+ if (w3m_debug) {
+@@ -2761,6 +2749,12 @@ flushline(struct html_feed_environ *h_env, struct readbuffer *obuf, int indent,
+ hidden = hidden_img;
+ }
+ }
++ if (obuf->input_alt.in) {
++ if ((hidden_input = has_hidden_link(obuf, HTML_INPUT_ALT)) != NULL) {
++ if (!hidden || hidden_input < hidden)
++ hidden = hidden_input;
++ }
++ }
+ if (obuf->in_bold) {
+ if ((hidden_bold = has_hidden_link(obuf, HTML_B)) != NULL) {
+ if (!hidden || hidden_bold < hidden)
+@@ -2812,6 +2806,8 @@ flushline(struct html_feed_environ *h_env, struct readbuffer *obuf, int indent,
+ Strcat_charp(line, "</a>");
+ if (obuf->img_alt && !hidden_img)
+ Strcat_charp(line, "</img_alt>");
++ if (obuf->input_alt.in && !hidden_input)
++ Strcat_charp(line, "</input_alt>");
+ if (obuf->in_bold && !hidden_bold)
+ Strcat_charp(line, "</b>");
+ if (obuf->in_italic && !hidden_italic)
+@@ -3022,6 +3018,18 @@ flushline(struct html_feed_environ *h_env, struct readbuffer *obuf, int indent,
+ Strcat_charp(tmp, "\">");
+ push_tag(obuf, tmp->ptr, HTML_IMG_ALT);
+ }
++ if (!hidden_input && obuf->input_alt.in) {
++ Str tmp;
++ if (obuf->input_alt.hseq > 0)
++ obuf->input_alt.hseq = - obuf->input_alt.hseq;
++ tmp = Sprintf("<INPUT_ALT hseq=\"%d\" fid=\"%d\" name=\"%s\" type=\"%s\" value=\"%s\">",
++ obuf->input_alt.hseq,
++ obuf->input_alt.fid,
++ obuf->input_alt.name ? obuf->input_alt.name->ptr : "",
++ obuf->input_alt.type ? obuf->input_alt.type->ptr : "",
++ obuf->input_alt.value ? obuf->input_alt.value->ptr : "");
++ push_tag(obuf, tmp->ptr, HTML_INPUT_ALT);
++ }
+ if (!hidden_bold && obuf->in_bold)
+ push_tag(obuf, "<B>", HTML_B);
+ if (!hidden_italic && obuf->in_italic)
+@@ -3228,7 +3236,7 @@ process_img(struct parsed_tag *tag, int width)
+
+ if (!parsedtag_get_value(tag, ATTR_SRC, &p))
+ return tmp;
+- p = remove_space(p);
++ p = url_encode(remove_space(p), cur_baseURL, cur_document_charset);
+ q = NULL;
+ parsedtag_get_value(tag, ATTR_ALT, &q);
+ if (!pseudoInlines && (q == NULL || (*q == '\0' && ignore_null_img_alt)))
+@@ -3322,12 +3330,7 @@ process_img(struct parsed_tag *tag, int width)
+ Image image;
+ ParsedURL u;
+
+-#ifdef USE_M17N
+- parseURL2(wc_conv(p, InnerCharset, cur_document_charset)->ptr, &u,
+- cur_baseURL);
+-#else
+ parseURL2(p, &u, cur_baseURL);
+-#endif
+ image.url = parsedURL2Str(&u)->ptr;
+ if (!uncompressed_file_type(u.file, &image.ext))
+ image.ext = filename_extension(u.file, TRUE);
+@@ -3346,8 +3349,14 @@ process_img(struct parsed_tag *tag, int width)
+ if (i < 0)
+ i = pixel_per_line;
+ }
+- nw = (w > 3) ? (int)((w - 3) / pixel_per_char + 1) : 1;
+- ni = (i > 3) ? (int)((i - 3) / pixel_per_line + 1) : 1;
++ if (enable_inline_image) {
++ nw = (w > 1) ? ((w - 1) / pixel_per_char_i + 1) : 1 ;
++ ni = (i > 1) ? ((i - 1) / pixel_per_line_i + 1) : 1 ;
++ }
++ else {
++ nw = (w > 3) ? (int)((w - 3) / pixel_per_char + 1) : 1;
++ ni = (i > 3) ? (int)((i - 3) / pixel_per_line + 1) : 1;
++ }
+ Strcat(tmp,
+ Sprintf("<pre_int><img_alt hseq=\"%d\" src=\"", cur_iseq++));
+ pre_int = TRUE;
+@@ -3378,19 +3387,21 @@ process_img(struct parsed_tag *tag, int width)
+ if (i0 >= 0)
+ Strcat(tmp, Sprintf(" height=%d", i0));
+ switch (align) {
++ case ALIGN_MIDDLE:
++ if (!enable_inline_image) {
++ top = ni / 2;
++ bottom = top;
++ if (top * 2 == ni)
++ yoffset = (int)(((ni + 1) * pixel_per_line - i) / 2);
++ else
++ yoffset = (int)((ni * pixel_per_line - i) / 2);
++ break;
++ }
+ case ALIGN_TOP:
+ top = 0;
+ bottom = ni - 1;
+ yoffset = 0;
+ break;
+- case ALIGN_MIDDLE:
+- top = ni / 2;
+- bottom = top;
+- if (top * 2 == ni)
+- yoffset = (int)(((ni + 1) * pixel_per_line - i) / 2);
+- else
+- yoffset = (int)((ni * pixel_per_line - i) / 2);
+- break;
+ case ALIGN_BOTTOM:
+ top = ni - 1;
+ bottom = 0;
+@@ -3408,7 +3419,12 @@ process_img(struct parsed_tag *tag, int width)
+ }
+ break;
+ }
+- xoffset = (int)((nw * pixel_per_char - w) / 2);
++
++ if (enable_inline_image)
++ xoffset = 0;
++ else
++ xoffset = (int)((nw * pixel_per_char - w) / 2);
++
+ if (xoffset)
+ Strcat(tmp, Sprintf(" xoffset=%d", xoffset));
+ if (yoffset)
+@@ -3548,7 +3564,7 @@ process_anchor(struct parsed_tag *tag, char *tagbuf)
+ Str
+ process_input(struct parsed_tag *tag)
+ {
+- int i, w, v, x, y, z, iw, ih;
++ int i = 20, v, x, y, z, iw, ih, size = 20;
+ char *q, *p, *r, *p2, *s;
+ Str tmp = NULL;
+ char *qq = "";
+@@ -3567,9 +3583,9 @@ process_input(struct parsed_tag *tag)
+ parsedtag_get_value(tag, ATTR_VALUE, &q);
+ r = "";
+ parsedtag_get_value(tag, ATTR_NAME, &r);
+- w = 20;
+- parsedtag_get_value(tag, ATTR_SIZE, &w);
+- i = 20;
++ parsedtag_get_value(tag, ATTR_SIZE, &size);
++ if (size > MAX_INPUT_SIZE)
++ size = MAX_INPUT_SIZE;
+ parsedtag_get_value(tag, ATTR_MAXLENGTH, &i);
+ p2 = NULL;
+ parsedtag_get_value(tag, ATTR_ALT, &p2);
+@@ -3623,9 +3639,10 @@ process_input(struct parsed_tag *tag)
+ Strcat(tmp, getLinkNumberStr(0));
+ Strcat_char(tmp, '(');
+ }
+- Strcat(tmp, Sprintf("<input_alt hseq=\"%d\" fid=\"%d\" type=%s "
++ Strcat(tmp, Sprintf("<input_alt hseq=\"%d\" fid=\"%d\" type=\"%s\" "
+ "name=\"%s\" width=%d maxlength=%d value=\"%s\"",
+- cur_hseq++, cur_form_id, p, html_quote(r), w, i, qq));
++ cur_hseq++, cur_form_id, html_quote(p),
++ html_quote(r), size, i, qq));
+ if (x)
+ Strcat_charp(tmp, " checked");
+ if (y)
+@@ -3670,18 +3687,18 @@ process_input(struct parsed_tag *tag)
+ case FORM_INPUT_PASSWORD:
+ i = 0;
+ if (q) {
+- for (; i < qlen && i < w; i++)
++ for (; i < qlen && i < size; i++)
+ Strcat_char(tmp, '*');
+ }
+- for (; i < w; i++)
++ for (; i < size; i++)
+ Strcat_char(tmp, ' ');
+ break;
+ case FORM_INPUT_TEXT:
+ case FORM_INPUT_FILE:
+ if (q)
+- Strcat(tmp, textfieldrep(Strnew_charp(q), w));
++ Strcat(tmp, textfieldrep(Strnew_charp(q), size));
+ else {
+- for (i = 0; i < w; i++)
++ for (i = 0; i < size; i++)
+ Strcat_char(tmp, ' ');
+ }
+ break;
+@@ -3732,6 +3749,75 @@ process_input(struct parsed_tag *tag)
+ }
+
+ Str
++process_button(struct parsed_tag *tag)
++{
++ Str tmp = NULL;
++ char *p, *q, *r, *qq = "";
++ int qlen, v;
++
++ if (cur_form_id < 0) {
++ char *s = "<form_int method=internal action=none>";
++ tmp = process_form(parse_tag(&s, TRUE));
++ }
++ if (tmp == NULL)
++ tmp = Strnew();
++
++ p = "submit";
++ parsedtag_get_value(tag, ATTR_TYPE, &p);
++ q = NULL;
++ parsedtag_get_value(tag, ATTR_VALUE, &q);
++ r = "";
++ parsedtag_get_value(tag, ATTR_NAME, &r);
++
++ v = formtype(p);
++ if (v == FORM_UNKNOWN)
++ return NULL;
++
++ switch (v) {
++ case FORM_INPUT_SUBMIT:
++ case FORM_INPUT_BUTTON:
++ case FORM_INPUT_RESET:
++ break;
++ default:
++ p = "submit";
++ v = FORM_INPUT_SUBMIT;
++ break;
++ }
++
++ if (!q) {
++ switch (v) {
++ case FORM_INPUT_SUBMIT:
++ case FORM_INPUT_BUTTON:
++ q = "SUBMIT";
++ break;
++ case FORM_INPUT_RESET:
++ q = "RESET";
++ break;
++ }
++ }
++ if (q) {
++ qq = html_quote(q);
++ qlen = strlen(q);
++ }
++
++ /* Strcat_charp(tmp, "<pre_int>"); */
++ Strcat(tmp, Sprintf("<input_alt hseq=\"%d\" fid=\"%d\" type=\"%s\" "
++ "name=\"%s\" value=\"%s\">",
++ cur_hseq++, cur_form_id, html_quote(p),
++ html_quote(r), qq));
++ return tmp;
++}
++
++Str
++process_n_button(void)
++{
++ Str tmp = Strnew();
++ Strcat_charp(tmp, "</input_alt>");
++ /* Strcat_charp(tmp, "</pre_int>"); */
++ return tmp;
++}
++
++Str
+ process_select(struct parsed_tag *tag)
+ {
+ Str tmp = NULL;
+@@ -4084,6 +4170,7 @@ process_form_int(struct parsed_tag *tag, int fid)
+ parsedtag_get_value(tag, ATTR_METHOD, &p);
+ q = "!CURRENT_URL!";
+ parsedtag_get_value(tag, ATTR_ACTION, &q);
++ q = url_encode(remove_space(q), cur_baseURL, cur_document_charset);
+ r = NULL;
+ #ifdef USE_M17N
+ if (parsedtag_get_value(tag, ATTR_ACCEPT_CHARSET, &r))
+@@ -4113,7 +4200,7 @@ process_form_int(struct parsed_tag *tag, int fid)
+ forms = New_N(FormList *, forms_size);
+ form_stack = NewAtom_N(int, forms_size);
+ }
+- else if (forms_size <= form_max) {
++ if (forms_size <= form_max) {
+ forms_size += form_max;
+ forms = New_Reuse(FormList *, forms, forms_size);
+ form_stack = New_Reuse(int, form_stack, forms_size);
+@@ -4284,15 +4371,15 @@ getMetaRefreshParam(char *q, Str *refresh_uri)
+ while (*q) {
+ if (!strncasecmp(q, "url=", 4)) {
+ q += 4;
+- if (*q == '\"') /* " */
++ if (*q == '\"' || *q == '\'') /* " or ' */
+ q++;
+ r = q;
+ while (*r && !IS_SPACE(*r) && *r != ';')
+ r++;
+ s_tmp = Strnew_charp_n(q, r - q);
+
+- if (s_tmp->ptr[s_tmp->length - 1] == '\"') { /* "
+- */
++ if (s_tmp->ptr[s_tmp->length - 1] == '\"' /* " */
++ || s_tmp->ptr[s_tmp->length - 1] == '\'') { /* ' */
+ s_tmp->length--;
+ s_tmp->ptr[s_tmp->length] = '\0';
+ }
+@@ -4599,6 +4686,12 @@ HTMLtagproc1(struct parsed_tag *tag, struct html_feed_environ *h_env)
+ case HTML_DD:
+ CLOSE_A;
+ CLOSE_DT;
++ if (h_env->envc == 0 ||
++ (h_env->envc_real < h_env->nenv &&
++ envs[h_env->envc].env != HTML_DL &&
++ envs[h_env->envc].env != HTML_DL_COMPACT)) {
++ PUSH_ENV(HTML_DL);
++ }
+ if (envs[h_env->envc].env == HTML_DL_COMPACT) {
+ if (obuf->pos > envs[h_env->envc].indent)
+ flushline(h_env, obuf, envs[h_env->envc].indent, 0,
+@@ -4861,7 +4954,35 @@ HTMLtagproc1(struct parsed_tag *tag, struct html_feed_environ *h_env)
+ if (i > obuf->bottom_margin)
+ obuf->bottom_margin = i;
+ }
++ if (parsedtag_get_value(tag, ATTR_HSEQ, &hseq)) {
++ obuf->input_alt.hseq = hseq;
++ }
++ if (parsedtag_get_value(tag, ATTR_FID, &i)) {
++ obuf->input_alt.fid = i;
++ }
++ if (parsedtag_get_value(tag, ATTR_TYPE, &p)) {
++ obuf->input_alt.type = Strnew_charp(p);
++ }
++ if (parsedtag_get_value(tag, ATTR_VALUE, &p)) {
++ obuf->input_alt.value = Strnew_charp(p);
++ }
++ if (parsedtag_get_value(tag, ATTR_NAME, &p)) {
++ obuf->input_alt.name = Strnew_charp(p);
++ }
++ obuf->input_alt.in = 1;
+ return 0;
++ case HTML_N_INPUT_ALT:
++ if (obuf->input_alt.in) {
++ if (!close_effect0(obuf, HTML_INPUT_ALT))
++ push_tag(obuf, "</input_alt>", HTML_N_INPUT_ALT);
++ obuf->input_alt.hseq = 0;
++ obuf->input_alt.fid = -1;
++ obuf->input_alt.in = 0;
++ obuf->input_alt.type = NULL;
++ obuf->input_alt.name = NULL;
++ obuf->input_alt.value = NULL;
++ }
++ return 1;
+ case HTML_TABLE:
+ close_anchor(h_env, obuf);
+ obuf->table_level++;
+@@ -4884,6 +5005,8 @@ HTMLtagproc1(struct parsed_tag *tag, struct html_feed_environ *h_env)
+ else
+ w = BORDER_THIN;
+ }
++ if (DisplayBorders && w == BORDER_NONE)
++ w = BORDER_THIN;
+ if (parsedtag_get_value(tag, ATTR_WIDTH, &i)) {
+ if (obuf->table_level == 0)
+ width = REAL_WIDTH(i, h_env->limit - envs[h_env->envc].indent);
+@@ -4892,9 +5015,18 @@ HTMLtagproc1(struct parsed_tag *tag, struct html_feed_environ *h_env)
+ }
+ if (parsedtag_exists(tag, ATTR_HBORDER))
+ w = BORDER_NOWIN;
++#define MAX_CELLSPACING 1000
++#define MAX_CELLPADDING 1000
++#define MAX_VSPACE 1000
+ parsedtag_get_value(tag, ATTR_CELLSPACING, &x);
+ parsedtag_get_value(tag, ATTR_CELLPADDING, &y);
+ parsedtag_get_value(tag, ATTR_VSPACE, &z);
++ if (x > MAX_CELLSPACING)
++ x = MAX_CELLSPACING;
++ if (y > MAX_CELLPADDING)
++ y = MAX_CELLPADDING;
++ if (z > MAX_VSPACE)
++ z = MAX_VSPACE;
+ #ifdef ID_EXT
+ parsedtag_get_value(tag, ATTR_ID, &id);
+ #endif /* ID_EXT */
+@@ -4970,6 +5102,16 @@ HTMLtagproc1(struct parsed_tag *tag, struct html_feed_environ *h_env)
+ case HTML_INPUT:
+ close_anchor(h_env, obuf);
+ tmp = process_input(tag);
++ if (tmp)
++ HTMLlineproc1(tmp->ptr, h_env);
++ return 1;
++ case HTML_BUTTON:
++ tmp = process_button(tag);
++ if (tmp)
++ HTMLlineproc1(tmp->ptr, h_env);
++ return 1;
++ case HTML_N_BUTTON:
++ tmp = process_n_button();
+ if (tmp)
+ HTMLlineproc1(tmp->ptr, h_env);
+ return 1;
+@@ -5067,11 +5209,10 @@ HTMLtagproc1(struct parsed_tag *tag, struct html_feed_environ *h_env)
+ }
+ return 1;
+ case HTML_BASE:
+-#ifdef USE_IMAGE
++#if defined(USE_M17N) || defined(USE_IMAGE)
+ p = NULL;
+ if (parsedtag_get_value(tag, ATTR_HREF, &p)) {
+- if (!cur_baseURL)
+- cur_baseURL = New(ParsedURL);
++ cur_baseURL = New(ParsedURL);
+ parseURL(p, cur_baseURL, NULL);
+ }
+ #endif
+@@ -5329,6 +5470,13 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
+ #ifdef MENU_SELECT
+ Anchor **a_select = NULL;
+ #endif
++#if defined(USE_M17N) || defined(USE_IMAGE)
++ ParsedURL *base = baseURL(buf);
++#endif
++#ifdef USE_M17N
++ wc_ces name_charset = url_to_charset(NULL, &buf->currentURL,
++ buf->document_charset);
++#endif
+
+ if (out_size == 0) {
+ out_size = LINELEN;
+@@ -5523,16 +5671,17 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
+ hseq = 0;
+ id = NULL;
+ if (parsedtag_get_value(tag, ATTR_NAME, &id)) {
+- id = url_quote_conv(id, buf->document_charset);
++ id = url_quote_conv(id, name_charset);
+ registerName(buf, id, currentLn(buf), pos);
+ }
+ if (parsedtag_get_value(tag, ATTR_HREF, &p))
+- p = url_quote_conv(remove_space(p),
+- buf->document_charset);
++ p = url_encode(remove_space(p), base,
++ buf->document_charset);
+ if (parsedtag_get_value(tag, ATTR_TARGET, &q))
+ q = url_quote_conv(q, buf->document_charset);
+ if (parsedtag_get_value(tag, ATTR_REFERER, &r))
+- r = url_quote_conv(r, buf->document_charset);
++ r = url_encode(r, base,
++ buf->document_charset);
+ parsedtag_get_value(tag, ATTR_TITLE, &s);
+ parsedtag_get_value(tag, ATTR_ACCESSKEY, &t);
+ parsedtag_get_value(tag, ATTR_HSEQ, &hseq);
+@@ -5618,7 +5767,7 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
+ ParsedURL u;
+ Image *image;
+
+- parseURL2(a_img->url, &u, cur_baseURL);
++ parseURL2(a_img->url, &u, base);
+ a_img->image = image = New(Image);
+ image->url = parsedURL2Str(&u)->ptr;
+ if (!uncompressed_file_type(u.file, &image->ext))
+@@ -5639,7 +5788,7 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
+ image->map = q;
+ image->ismap = ismap;
+ image->touch = 0;
+- image->cache = getImage(image, cur_baseURL,
++ image->cache = getImage(image, base,
+ IMG_FLAG_SKIP);
+ }
+ else if (iseq < 0) {
+@@ -5689,6 +5838,21 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
+ putHmarker(buf->hmarklist, currentLn(buf),
+ hpos, hseq - 1);
+ }
++ else if (hseq < 0) {
++ int h = -hseq - 1;
++ int hpos = pos;
++ if (*str == '[')
++ hpos++;
++ if (buf->hmarklist &&
++ h < buf->hmarklist->nmark &&
++ buf->hmarklist->marks[h].invalid) {
++ buf->hmarklist->marks[h].pos = hpos;
++ buf->hmarklist->marks[h].line = currentLn(buf);
++ buf->hmarklist->marks[h].invalid = 0;
++ hseq = -hseq;
++ }
++ }
++
+ if (!form->target)
+ form->target = buf->baseTarget;
+ if (a_textarea &&
+@@ -5761,8 +5925,8 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
+ break;
+ if (parsedtag_get_value(tag, ATTR_HREF, &p)) {
+ MapArea *a;
+- p = url_quote_conv(remove_space(p),
+- buf->document_charset);
++ p = url_encode(remove_space(p), base,
++ buf->document_charset);
+ t = NULL;
+ parsedtag_get_value(tag, ATTR_TARGET, &t);
+ q = "";
+@@ -5811,11 +5975,14 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
+ break;
+ case HTML_BASE:
+ if (parsedtag_get_value(tag, ATTR_HREF, &p)) {
+- p = url_quote_conv(remove_space(p),
+- buf->document_charset);
++ p = url_encode(remove_space(p), NULL,
++ buf->document_charset);
+ if (!buf->baseURL)
+ buf->baseURL = New(ParsedURL);
+ parseURL(p, buf->baseURL, NULL);
++#if defined(USE_M17N) || defined(USE_IMAGE)
++ base = buf->baseURL;
++#endif
+ }
+ if (parsedtag_get_value(tag, ATTR_TARGET, &p))
+ buf->baseTarget =
+@@ -5830,8 +5997,8 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
+ int refresh_interval = getMetaRefreshParam(q, &tmp);
+ #ifdef USE_ALARM
+ if (tmp) {
+- p = url_quote_conv(remove_space(tmp->ptr),
+- buf->document_charset);
++ p = url_encode(remove_space(tmp->ptr), base,
++ buf->document_charset);
+ buf->event = setAlarmEvent(buf->event,
+ refresh_interval,
+ AL_IMPLICIT_ONCE,
+@@ -5844,8 +6011,8 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
+ FUNCNAME_reload, NULL);
+ #else
+ if (tmp && refresh_interval == 0) {
+- p = url_quote_conv(remove_space(tmp->ptr),
+- buf->document_charset);
++ p = url_encode(remove_space(tmp->ptr), base,
++ buf->document_charset);
+ pushEvent(FUNCNAME_gorURL, p);
+ }
+ #endif
+@@ -5864,7 +6031,7 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
+ case HTML_TEXTAREA_INT:
+ if (parsedtag_get_value(tag, ATTR_TEXTAREANUMBER,
+ &n_textarea)
+- && n_textarea < max_textarea) {
++ && n_textarea >= 0 && n_textarea < max_textarea) {
+ textarea_str[n_textarea] = Strnew();
+ }
+ else
+@@ -5881,7 +6048,7 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
+ #ifdef MENU_SELECT
+ case HTML_SELECT_INT:
+ if (parsedtag_get_value(tag, ATTR_SELECTNUMBER, &n_select)
+- && n_select < max_select) {
++ && n_select >= 0 && n_select < max_select) {
+ select_option[n_select].first = NULL;
+ select_option[n_select].last = NULL;
+ }
+@@ -5929,7 +6096,7 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
+ #ifdef ID_EXT
+ id = NULL;
+ if (parsedtag_get_value(tag, ATTR_ID, &id)) {
+- id = url_quote_conv(id, buf->document_charset);
++ id = url_quote_conv(id, name_charset);
+ registerName(buf, id, currentLn(buf), pos);
+ }
+ if (renderFrameSet &&
+@@ -5964,7 +6131,8 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
+ fclose(debug);
+ #endif
+ for (form_id = 1; form_id <= form_max; form_id++)
+- forms[form_id]->next = forms[form_id - 1];
++ if (forms[form_id])
++ forms[form_id]->next = forms[form_id - 1];
+ buf->formlist = (form_max >= 0) ? forms[form_max] : NULL;
+ if (n_textarea)
+ addMultirowsForm(buf, buf->formitem);
+@@ -5982,7 +6150,8 @@ addLink(Buffer *buf, struct parsed_tag *tag)
+
+ parsedtag_get_value(tag, ATTR_HREF, &href);
+ if (href)
+- href = url_quote_conv(remove_space(href), buf->document_charset);
++ href = url_encode(remove_space(href), baseURL(buf),
++ buf->document_charset);
+ parsedtag_get_value(tag, ATTR_TITLE, &title);
+ parsedtag_get_value(tag, ATTR_TYPE, &ctype);
+ parsedtag_get_value(tag, ATTR_REL, &rel);
+@@ -6756,6 +6925,12 @@ init_henv(struct html_feed_environ *h_env, struct readbuffer *obuf,
+ obuf->nobr_level = 0;
+ bzero((void *)&obuf->anchor, sizeof(obuf->anchor));
+ obuf->img_alt = 0;
++ obuf->input_alt.hseq = 0;
++ obuf->input_alt.fid = -1;
++ obuf->input_alt.in = 0;
++ obuf->input_alt.type = NULL;
++ obuf->input_alt.name = NULL;
++ obuf->input_alt.value = NULL;
+ obuf->in_bold = 0;
+ obuf->in_italic = 0;
+ obuf->in_under = 0;
+@@ -6791,6 +6966,15 @@ completeHTMLstream(struct html_feed_environ *h_env, struct readbuffer *obuf)
+ push_tag(obuf, "</img_alt>", HTML_N_IMG_ALT);
+ obuf->img_alt = NULL;
+ }
++ if (obuf->input_alt.in) {
++ push_tag(obuf, "</input_alt>", HTML_N_INPUT_ALT);
++ obuf->input_alt.hseq = 0;
++ obuf->input_alt.fid = -1;
++ obuf->input_alt.in = 0;
++ obuf->input_alt.type = NULL;
++ obuf->input_alt.name = NULL;
++ obuf->input_alt.value = NULL;
++ }
+ if (obuf->in_bold) {
+ push_tag(obuf, "</b>", HTML_N_B);
+ obuf->in_bold = 0;
+@@ -6963,8 +7147,6 @@ loadHTMLstream(URLFile *f, Buffer *newBuf, FILE * src, int internal)
+ image_flag = IMG_FLAG_AUTO;
+ else
+ image_flag = IMG_FLAG_SKIP;
+- if (newBuf->currentURL.file)
+- cur_baseURL = baseURL(newBuf);
+ #endif
+
+ if (w3m_halfload) {
+@@ -6987,6 +7169,9 @@ loadHTMLstream(URLFile *f, Buffer *newBuf, FILE * src, int internal)
+ htmlenv1.f = stdout;
+ else
+ htmlenv1.buf = newTextLineList();
++#if defined(USE_M17N) || defined(USE_IMAGE)
++ cur_baseURL = baseURL(newBuf);
++#endif
+
+ if (SETJMP(AbortLoading) != 0) {
+ HTMLlineproc1("<br>Transfer Interrupted!<br>", &htmlenv1);
+@@ -7048,18 +7233,23 @@ loadHTMLstream(URLFile *f, Buffer *newBuf, FILE * src, int internal)
+ }
+ #endif
+ lineBuf2 = convertLine(f, lineBuf2, HTML_MODE, &charset, doc_charset);
+-#if defined(USE_M17N) && defined(USE_IMAGE)
++#ifdef USE_M17N
+ cur_document_charset = charset;
+ #endif
+ HTMLlineproc0(lineBuf2->ptr, &htmlenv1, internal);
+ }
+ if (obuf.status != R_ST_NORMAL) {
+- obuf.status = R_ST_EOL;
+ HTMLlineproc0("\n", &htmlenv1, internal);
+ }
+ obuf.status = R_ST_NORMAL;
+ completeHTMLstream(&htmlenv1, &obuf);
+ flushline(&htmlenv1, &obuf, 0, 2, htmlenv1.limit);
++#if defined(USE_M17N) || defined(USE_IMAGE)
++ cur_baseURL = NULL;
++#endif
++#ifdef USE_M17N
++ cur_document_charset = 0;
++#endif
+ if (htmlenv1.title)
+ newBuf->buffername = htmlenv1.title;
+ if (w3m_halfdump) {
+@@ -7096,16 +7286,17 @@ loadHTMLString(Str page)
+ MySignalHandler(*volatile prevtrap) (SIGNAL_ARG) = NULL;
+ Buffer *newBuf;
+
++ init_stream(&f, SCM_LOCAL, newStrStream(page));
++
+ newBuf = newBuffer(INIT_BUFFER_WIDTH);
+ if (SETJMP(AbortLoading) != 0) {
+ TRAP_OFF;
+ discardBuffer(newBuf);
++ UFclose(&f);
+ return NULL;
+ }
+ TRAP_ON;
+
+- init_stream(&f, SCM_LOCAL, newStrStream(page));
+-
+ #ifdef USE_M17N
+ newBuf->document_charset = InnerCharset;
+ #endif
+@@ -7115,6 +7306,7 @@ loadHTMLString(Str page)
+ #endif
+
+ TRAP_OFF;
++ UFclose(&f);
+ newBuf->topLine = newBuf->firstLine;
+ newBuf->lastLine = newBuf->currentLine;
+ newBuf->currentLine = newBuf->firstLine;
+@@ -7207,7 +7399,7 @@ loadGopherDir(URLFile *uf, ParsedURL *pu, wc_ces * charset)
+ q = Strnew_m_charp("gopher://", host->ptr, ":", port->ptr,
+ "/", file->ptr, NULL)->ptr;
+ Strcat_m_charp(tmp, "<a href=\"",
+- html_quote(url_quote_conv(q, *charset)),
++ html_quote(url_encode(q, NULL, *charset)),
+ "\">", p, html_quote(name->ptr + 1), "</a>\n", NULL);
+ }
+
+@@ -7243,7 +7435,6 @@ loadBuffer(URLFile *uf, Buffer *volatile newBuf)
+
+ if (newBuf == NULL)
+ newBuf = newBuffer(INIT_BUFFER_WIDTH);
+- lineBuf2 = Strnew();
+
+ if (SETJMP(AbortLoading) != 0) {
+ goto _end;
+@@ -7331,6 +7522,7 @@ loadImageBuffer(URLFile *uf, Buffer *newBuf)
+ URLFile f;
+ MySignalHandler(*volatile prevtrap) (SIGNAL_ARG) = NULL;
+ struct stat st;
++ const ParsedURL *pu = newBuf ? &newBuf->currentURL : NULL;
+
+ loadImage(newBuf, IMG_FLAG_STOP);
+ image.url = uf->url;
+@@ -7338,20 +7530,18 @@ loadImageBuffer(URLFile *uf, Buffer *newBuf)
+ image.width = -1;
+ image.height = -1;
+ image.cache = NULL;
+- cache = getImage(&image, cur_baseURL, IMG_FLAG_AUTO);
+- if (!cur_baseURL->is_nocache && cache->loaded & IMG_FLAG_LOADED &&
++ cache = getImage(&image, (ParsedURL *)pu, IMG_FLAG_AUTO);
++ if (!(pu && pu->is_nocache) && cache->loaded & IMG_FLAG_LOADED &&
+ !stat(cache->file, &st))
+ goto image_buffer;
+
+- TRAP_ON;
+ if (IStype(uf->stream) != IST_ENCODED)
+ uf->stream = newEncodedStream(uf->stream, uf->encoding);
++ TRAP_ON;
+ if (save2tmp(*uf, cache->file) < 0) {
+- UFclose(uf);
+ TRAP_OFF;
+ return NULL;
+ }
+- UFclose(uf);
+ TRAP_OFF;
+
+ cache->loaded = IMG_FLAG_LOADED;
+@@ -7371,6 +7561,7 @@ loadImageBuffer(URLFile *uf, Buffer *newBuf)
+
+ init_stream(&f, SCM_LOCAL, newStrStream(tmp));
+ loadHTMLstream(&f, newBuf, src, TRUE);
++ UFclose(&f);
+ if (src)
+ fclose(src);
+
+@@ -7580,8 +7771,11 @@ openGeneralPagerBuffer(InputStream stream)
+ #ifdef USE_M17N
+ content_charset = 0;
+ #endif
++ t_buf = newBuffer(INIT_BUFFER_WIDTH);
++ copyParsedURL(&t_buf->currentURL, NULL);
++ t_buf->currentURL.scheme = SCM_LOCAL;
++ t_buf->currentURL.file = "-";
+ if (SearchHeader) {
+- t_buf = newBuffer(INIT_BUFFER_WIDTH);
+ readHeader(&uf, t_buf, TRUE, NULL);
+ t = checkContentType(t_buf);
+ if (t == NULL)
+@@ -7609,14 +7803,13 @@ openGeneralPagerBuffer(InputStream stream)
+ #ifdef USE_IMAGE
+ else if (activeImage && displayImage && !useExtImageViewer &&
+ !(w3m_dump & ~DUMP_FRAME) && !strncasecmp(t, "image/", 6)) {
+- cur_baseURL = New(ParsedURL);
+- parseURL("-", cur_baseURL, NULL);
+ buf = loadImageBuffer(&uf, t_buf);
+ buf->type = "text/html";
+ }
+ #endif
+ else {
+- if (doExternal(uf, "-", t, &buf, t_buf)) {
++ if (searchExtViewer(t)) {
++ buf = doExternal(uf, t, t_buf);
+ UFclose(&uf);
+ if (buf == NULL || buf == NO_BUFFER)
+ return buf;
+@@ -7629,8 +7822,6 @@ openGeneralPagerBuffer(InputStream stream)
+ }
+ }
+ buf->real_type = t;
+- buf->currentURL.scheme = SCM_LOCAL;
+- buf->currentURL.file = "-";
+ return buf;
+ }
+
+@@ -7766,6 +7957,8 @@ save2tmp(URLFile uf, char *tmpf)
+ clen_t linelen = 0, trbyte = 0;
+ MySignalHandler(*volatile prevtrap) (SIGNAL_ARG) = NULL;
+ static JMP_BUF env_bak;
++ volatile int retval = 0;
++ char *volatile buf = NULL;
+
+ ff = fopen(tmpf, "wb");
+ if (ff == NULL) {
+@@ -7802,30 +7995,29 @@ save2tmp(URLFile uf, char *tmpf)
+ else
+ #endif /* USE_NNTP */
+ {
+- Str buf = Strnew_size(SAVE_BUF_SIZE);
+- while (UFread(&uf, buf, SAVE_BUF_SIZE)) {
+- if (Strfputs(buf, ff) != buf->length) {
+- bcopy(env_bak, AbortLoading, sizeof(JMP_BUF));
+- TRAP_OFF;
+- fclose(ff);
+- current_content_length = 0;
+- return -2;
++ int count;
++
++ buf = NewWithoutGC_N(char, SAVE_BUF_SIZE);
++ while ((count = ISread_n(uf.stream, buf, SAVE_BUF_SIZE)) > 0) {
++ if (fwrite(buf, 1, count, ff) != count) {
++ retval = -2;
++ goto _end;
+ }
+- linelen += buf->length;
++ linelen += count;
+ showProgress(&linelen, &trbyte);
+ }
+ }
+ _end:
+ bcopy(env_bak, AbortLoading, sizeof(JMP_BUF));
+ TRAP_OFF;
++ xfree(buf);
+ fclose(ff);
+ current_content_length = 0;
+- return 0;
++ return retval;
+ }
+
+-int
+-doExternal(URLFile uf, char *path, char *type, Buffer **bufp,
+- Buffer *defaultbuf)
++Buffer *
++doExternal(URLFile uf, char *type, Buffer *defaultbuf)
+ {
+ Str tmpf, command;
+ struct mailcap *mcap;
+@@ -7834,7 +8026,7 @@ doExternal(URLFile uf, char *path, char *type, Buffer **bufp,
+ char *header, *src = NULL, *ext = uf.ext;
+
+ if (!(mcap = searchExtViewer(type)))
+- return 0;
++ return NULL;
+
+ if (mcap->nametemplate) {
+ tmpf = unquote_mailcap(mcap->nametemplate, NULL, "", NULL, NULL);
+@@ -7867,15 +8059,13 @@ doExternal(URLFile uf, char *path, char *type, Buffer **bufp,
+ UFclose(&uf);
+ myExec(command->ptr);
+ }
+- *bufp = NO_BUFFER;
+- return 1;
++ return NO_BUFFER;
+ }
+ else
+ #endif
+ {
+ if (save2tmp(uf, tmpf->ptr) < 0) {
+- *bufp = NULL;
+- return 1;
++ return NULL;
+ }
+ }
+ if (mcap->flags & (MAILCAP_HTMLOUTPUT | MAILCAP_COPIOUSOUTPUT)) {
+@@ -7918,14 +8108,13 @@ doExternal(URLFile uf, char *path, char *type, Buffer **bufp,
+ buf = NO_BUFFER;
+ }
+ if (buf && buf != NO_BUFFER) {
+- buf->filename = path;
+- if (buf->buffername == NULL || buf->buffername[0] == '\0')
+- buf->buffername = conv_from_system(lastFileName(path));
++ if ((buf->buffername == NULL || buf->buffername[0] == '\0') &&
++ buf->filename)
++ buf->buffername = conv_from_system(lastFileName(buf->filename));
+ buf->edit = mcap->edit;
+ buf->mailcap = mcap;
+ }
+- *bufp = buf;
+- return 1;
++ return buf;
+ }
+
+ static int
+@@ -7935,7 +8124,8 @@ _MoveFile(char *path1, char *path2)
+ FILE *f2;
+ int is_pipe;
+ clen_t linelen = 0, trbyte = 0;
+- Str buf;
++ char *buf = NULL;
++ int count;
+
+ f1 = openIS(path1);
+ if (f1 == NULL)
+@@ -7953,12 +8143,13 @@ _MoveFile(char *path1, char *path2)
+ return -1;
+ }
+ current_content_length = 0;
+- buf = Strnew_size(SAVE_BUF_SIZE);
+- while (ISread(f1, buf, SAVE_BUF_SIZE)) {
+- Strfputs(buf, f2);
+- linelen += buf->length;
++ buf = NewWithoutGC_N(char, SAVE_BUF_SIZE);
++ while ((count = ISread_n(f1, buf, SAVE_BUF_SIZE)) > 0) {
++ fwrite(buf, 1, count, f2);
++ linelen += count;
+ showProgress(&linelen, &trbyte);
+ }
++ xfree(buf);
+ ISclose(f1);
+ if (is_pipe)
+ pclose(f2);
+@@ -7998,7 +8189,7 @@ _doFileCopy(char *tmpf, char *defstr, int download)
+ else {
+ if (q) {
+ p = unescape_spaces(Strnew_charp(q))->ptr;
+- p = conv_to_system(q);
++ p = conv_to_system(p);
+ }
+ p = expandPath(p);
+ if (checkOverWrite(p) < 0)
+@@ -8317,21 +8508,23 @@ uncompress_stream(URLFile *uf, char **src)
+ }
+ if (pid2 == 0) {
+ /* child2 */
+- Str buf = Strnew_size(SAVE_BUF_SIZE);
++ char *buf = NewWithoutGC_N(char, SAVE_BUF_SIZE);
++ int count;
+ FILE *f = NULL;
+
+ setup_child(TRUE, 2, UFfileno(uf));
+ if (tmpf)
+ f = fopen(tmpf, "wb");
+- while (UFread(uf, buf, SAVE_BUF_SIZE)) {
+- if (Strfputs(buf, stdout) < 0)
++ while ((count = ISread_n(uf->stream, buf, SAVE_BUF_SIZE)) > 0) {
++ if (fwrite(buf, 1, count, stdout) != count)
++ break;
++ if (f && fwrite(buf, 1, count, f) != count)
+ break;
+- if (f)
+- Strfputs(buf, f);
+ }
+ UFclose(uf);
+ if (f)
+ fclose(f);
++ xfree(buf);
+ exit(0);
+ }
+ /* child1 */
+@@ -8378,7 +8571,7 @@ lessopen_stream(char *path)
+ }
+ c = getc(fp);
+ if (c == EOF) {
+- fclose(fp);
++ pclose(fp);
+ return NULL;
+ }
+ ungetc(c, fp);
+diff --git a/fm.h b/fm.h
+index 8378939..ede537b 100644
+--- a/fm.h
++++ b/fm.h
+@@ -76,6 +76,7 @@ typedef int wc_ces; /* XXX: not used */
+ #include "textlist.h"
+ #include "funcname1.h"
+ #include "terms.h"
++#include "istream.h"
+
+ #ifndef HAVE_BCOPY
+ void bcopy(const void *, void *, int);
+@@ -264,6 +265,18 @@ extern int REV_LB[];
+ #define IMG_FLAG_ERROR 2
+ #define IMG_FLAG_DONT_REMOVE 4
+
++#define IS_EMPTY_PARSED_URL(pu) ((pu)->scheme == SCM_UNKNOWN && !(pu)->file)
++#define SCONF_RESERVED 0
++#define SCONF_SUBSTITUTE_URL 1
++#define SCONF_URL_CHARSET 2
++#define SCONF_NO_REFERER_FROM 3
++#define SCONF_NO_REFERER_TO 4
++#define SCONF_N_FIELD 5
++#define query_SCONF_SUBSTITUTE_URL(pu) ((const char *)querySiteconf(pu, SCONF_SUBSTITUTE_URL))
++#define query_SCONF_URL_CHARSET(pu) ((const wc_ces *)querySiteconf(pu, SCONF_URL_CHARSET))
++#define query_SCONF_NO_REFERER_FROM(pu) ((const int *)querySiteconf(pu, SCONF_NO_REFERER_FROM))
++#define query_SCONF_NO_REFERER_TO(pu) ((const int *)querySiteconf(pu, SCONF_NO_REFERER_TO))
++
+ /*
+ * Macros.
+ */
+@@ -276,8 +289,6 @@ extern int REV_LB[];
+ #define inputFilenameHist(p,d,h) inputLineHist(p,d,IN_FILENAME,h)
+ #define inputChar(p) inputLine(p,"",IN_CHAR)
+
+-#define free(x) GC_free(x) /* let GC do it. */
+-
+ #ifdef __EMX__
+ #define HAVE_STRCASECMP
+ #define strcasecmp stricmp
+@@ -362,6 +373,8 @@ typedef struct _imageCache {
+ int index;
+ short width;
+ short height;
++ short a_width;
++ short a_height;
+ } ImageCache;
+
+ typedef struct _image {
+@@ -562,6 +575,13 @@ typedef struct _DownloadList {
+ #define INIT_BUFFER_WIDTH ((_INIT_BUFFER_WIDTH > 0) ? _INIT_BUFFER_WIDTH : 0)
+ #define FOLD_BUFFER_WIDTH (FoldLine ? (INIT_BUFFER_WIDTH + 1) : -1)
+
++struct input_alt_attr {
++ int hseq;
++ int fid;
++ int in;
++ Str type, name, value;
++};
++
+ typedef struct {
+ int pos;
+ int len;
+@@ -569,6 +589,7 @@ typedef struct {
+ long flag;
+ Anchor anchor;
+ Str img_alt;
++ struct input_alt_attr input_alt;
+ char fontstat[FONTSTAT_SIZE];
+ short nobr_level;
+ Lineprop prev_ctype;
+@@ -591,6 +612,7 @@ struct readbuffer {
+ short nobr_level;
+ Anchor anchor;
+ Str img_alt;
++ struct input_alt_attr input_alt;
+ char fontstat[FONTSTAT_SIZE];
+ char fontstat_stack[FONT_STACK_SIZE][FONTSTAT_SIZE];
+ int fontstat_sp;
+@@ -802,7 +824,7 @@ global char PermitSaveToPipe init(FALSE);
+ global char DecodeCTE init(FALSE);
+ global char AutoUncompress init(FALSE);
+ global char PreserveTimestamp init(TRUE);
+-global char ArgvIsURL init(FALSE);
++global char ArgvIsURL init(TRUE);
+ global char MetaRefresh init(FALSE);
+
+ global char fmInitialized init(FALSE);
+@@ -874,6 +896,9 @@ global char *index_file init(NULL);
+
+ global char *CurrentDir;
+ global int CurrentPid;
++#if defined(DONT_CALL_GC_AFTER_FORK) && defined(USE_IMAGE)
++global char *MyProgramName init("w3m");
++#endif /* defined(DONT_CALL_GC_AFTER_FORK) && defined(USE_IMAGE) */
+ /*
+ * global Buffer *Currentbuf;
+ * global Buffer *Firstbuf;
+@@ -896,6 +921,7 @@ global char *CurrentKeyData;
+ global char *CurrentCmdData;
+ global char *w3m_reqlog;
+ extern char *w3m_version;
++extern int enable_inline_image;
+
+ #define DUMP_BUFFER 0x01
+ #define DUMP_HEAD 0x02
+@@ -968,10 +994,17 @@ global int MailtoOptions init(MAILTO_OPTIONS_IGNORE);
+ global char *ExtBrowser init(DEF_EXT_BROWSER);
+ global char *ExtBrowser2 init(NULL);
+ global char *ExtBrowser3 init(NULL);
++global char *ExtBrowser4 init(NULL);
++global char *ExtBrowser5 init(NULL);
++global char *ExtBrowser6 init(NULL);
++global char *ExtBrowser7 init(NULL);
++global char *ExtBrowser8 init(NULL);
++global char *ExtBrowser9 init(NULL);
+ global int BackgroundExtViewer init(TRUE);
+ global int disable_secret_security_check init(FALSE);
+ global char *passwd_file init(PASSWD_FILE);
+ global char *pre_form_file init(PRE_FORM_FILE);
++global char *siteconf_file init(SITECONF_FILE);
+ global char *ftppasswd init(NULL);
+ global int ftppass_hostnamegen init(TRUE);
+ global int do_download init(FALSE);
+@@ -991,7 +1024,7 @@ global char *BookmarkFile init(NULL);
+ global int UseExternalDirBuffer init(TRUE);
+ global char *DirBufferCommand init("file:///$LIB/dirlist" CGI_EXTENSION);
+ #ifdef USE_DICT
+-global int UseDictCommand init(FALSE);
++global int UseDictCommand init(TRUE);
+ global char *DictCommand init("file:///$LIB/w3mdict" CGI_EXTENSION);
+ #endif /* USE_DICT */
+ global int ignore_null_img_alt init(TRUE);
+@@ -1004,7 +1037,7 @@ global int FoldLine init(FALSE);
+ #define DEFAULT_URL_EMPTY 0
+ #define DEFAULT_URL_CURRENT 1
+ #define DEFAULT_URL_LINK 2
+-global int DefaultURLString init(DEFAULT_URL_EMPTY);
++global int DefaultURLString init(DEFAULT_URL_CURRENT);
+ global int MarkAllPages init(FALSE);
+
+ #ifdef USE_MIGEMO
+@@ -1065,11 +1098,12 @@ global char SimplePreserveSpace init(FALSE);
+ #define wc_Str_conv(x,charset0,charset1) (x)
+ #define wc_Str_conv_strict(x,charset0,charset1) (x)
+ #endif
+-global char UseAltEntity init(TRUE);
++global char UseAltEntity init(FALSE);
+ #define GRAPHIC_CHAR_ASCII 2
+ #define GRAPHIC_CHAR_DEC 1
+ #define GRAPHIC_CHAR_CHARSET 0
+ global char UseGraphicChar init(GRAPHIC_CHAR_CHARSET);
++global char DisplayBorders init(FALSE);
+ extern char *graph_symbol[];
+ extern char *graph2_symbol[];
+ extern int symbol_width;
+@@ -1113,9 +1147,9 @@ global MouseAction mouse_action;
+
+ #ifdef USE_COOKIE
+ global int default_use_cookie init(TRUE);
+-global int use_cookie init(FALSE);
+-global int show_cookie init(TRUE);
+-global int accept_cookie init(FALSE);
++global int use_cookie init(TRUE);
++global int show_cookie init(FALSE);
++global int accept_cookie init(TRUE);
+ #define ACCEPT_BAD_COOKIE_DISCARD 0
+ #define ACCEPT_BAD_COOKIE_ACCEPT 1
+ #define ACCEPT_BAD_COOKIE_ASK 2
+@@ -1135,7 +1169,7 @@ global int view_unseenobject init(TRUE);
+ #endif
+
+ #if defined(USE_SSL) && defined(USE_SSL_VERIFY)
+-global int ssl_verify_server init(FALSE);
++global int ssl_verify_server init(TRUE);
+ global char *ssl_cert_file init(NULL);
+ global char *ssl_key_file init(NULL);
+ global char *ssl_ca_path init(NULL);
+@@ -1144,15 +1178,17 @@ global int ssl_path_modified init(FALSE);
+ #endif /* defined(USE_SSL) &&
+ * defined(USE_SSL_VERIFY) */
+ #ifdef USE_SSL
+-global char *ssl_forbid_method init(NULL);
++global char *ssl_forbid_method init("2, 3");
+ #endif
+
+ global int is_redisplay init(FALSE);
+ global int clear_buffer init(TRUE);
+ global double pixel_per_char init(DEFAULT_PIXEL_PER_CHAR);
++global int pixel_per_char_i init(DEFAULT_PIXEL_PER_CHAR);
+ global int set_pixel_per_char init(FALSE);
+ #ifdef USE_IMAGE
+ global double pixel_per_line init(DEFAULT_PIXEL_PER_LINE);
++global int pixel_per_line_i init(DEFAULT_PIXEL_PER_LINE);
+ global int set_pixel_per_line init(FALSE);
+ global double image_scale init(100);
+ #endif
+diff --git a/form.c b/form.c
+index b7556ca..de7a4d9 100644
+--- a/form.c
++++ b/form.c
+@@ -10,8 +10,10 @@
+ #include "regex.h"
+
+ extern Str *textarea_str;
++extern int max_textarea;
+ #ifdef MENU_SELECT
+ extern FormSelectOption *select_option;
++extern int max_select;
+ #include "menu.h"
+ #endif /* MENU_SELECT */
+
+@@ -122,10 +124,12 @@ formList_addInput(struct form_list *fl, struct parsed_tag *tag)
+ parsedtag_get_value(tag, ATTR_SIZE, &item->size);
+ parsedtag_get_value(tag, ATTR_MAXLENGTH, &item->maxlength);
+ item->readonly = parsedtag_exists(tag, ATTR_READONLY);
+- if (parsedtag_get_value(tag, ATTR_TEXTAREANUMBER, &i))
++ if (parsedtag_get_value(tag, ATTR_TEXTAREANUMBER, &i)
++ && i >= 0 && i < max_textarea)
+ item->value = item->init_value = textarea_str[i];
+ #ifdef MENU_SELECT
+- if (parsedtag_get_value(tag, ATTR_SELECTNUMBER, &i))
++ if (parsedtag_get_value(tag, ATTR_SELECTNUMBER, &i)
++ && i >= 0 && i < max_select)
+ item->select_option = select_option[i].first;
+ #endif /* MENU_SELECT */
+ if (parsedtag_get_value(tag, ATTR_ROWS, &p))
+@@ -196,7 +200,7 @@ formtype(char *typestr)
+ if (!strcasecmp(typestr, _formtypetbl[i]))
+ return i;
+ }
+- return FORM_UNKNOWN;
++ return FORM_INPUT_TEXT;
+ }
+
+ void
+@@ -438,6 +442,8 @@ formUpdateBuffer(Anchor *a, Buffer *buf, FormItemList *form)
+ switch (form->type) {
+ case FORM_INPUT_CHECKBOX:
+ case FORM_INPUT_RADIO:
++ if (spos >= buf->currentLine->len || spos < 0)
++ break;
+ if (form->checked)
+ buf->currentLine->lineBuf[spos] = '*';
+ else
+@@ -455,8 +461,14 @@ formUpdateBuffer(Anchor *a, Buffer *buf, FormItemList *form)
+ }
+ else
+ #endif /* MENU_SELECT */
++ {
++ if (!form->value)
++ break;
+ p = form->value->ptr;
++ }
+ l = buf->currentLine;
++ if (!l)
++ break;
+ if (form->type == FORM_TEXTAREA) {
+ int n = a->y - buf->currentLine->linenumber;
+ if (n > 0)
+@@ -477,6 +489,8 @@ formUpdateBuffer(Anchor *a, Buffer *buf, FormItemList *form)
+ spos = a->start.pos;
+ epos = a->end.pos;
+ }
++ if (a->start.line != a->end.line || spos > epos || epos >= l->len || spos < 0 || epos < 0)
++ break;
+ pos = form_update_line(l, &p, spos, epos, COLPOS(l, epos) - col,
+ rows > 1,
+ form->type == FORM_INPUT_PASSWORD);
+@@ -787,7 +801,7 @@ struct pre_form {
+ static struct pre_form *PreForm = NULL;
+
+ static struct pre_form *
+-add_pre_form(struct pre_form *prev, char *url, char *name, char *action)
++add_pre_form(struct pre_form *prev, char *url, Regex *re_url, char *name, char *action)
+ {
+ ParsedURL pu;
+ struct pre_form *new;
+@@ -796,21 +810,13 @@ add_pre_form(struct pre_form *prev, char *url, char *name, char *action)
+ new = prev->next = New(struct pre_form);
+ else
+ new = PreForm = New(struct pre_form);
+- if (url && *url == '/') {
+- int l = strlen(url);
+- if (l > 1 && url[l - 1] == '/')
+- new->url = allocStr(url + 1, l - 2);
+- else
+- new->url = url + 1;
+- new->re_url = newRegex(new->url, FALSE, NULL, NULL);
+- if (!new->re_url)
+- new->url = NULL;
+- }
+- else if (url) {
++ if (url && !re_url) {
+ parseURL2(url, &pu, NULL);
+ new->url = parsedURL2Str(&pu)->ptr;
+- new->re_url = NULL;
+ }
++ else
++ new->url = url;
++ new->re_url = re_url;
+ new->name = (name && *name) ? name : NULL;
+ new->action = (action && *action) ? action : NULL;
+ new->item = NULL;
+@@ -834,7 +840,7 @@ add_pre_form_item(struct pre_form *pf, struct pre_form_item *prev, int type,
+ new->name = name;
+ new->value = value;
+ if (checked && *checked && (!strcmp(checked, "0") ||
+- strcasecmp(checked, "off")
++ !strcasecmp(checked, "off")
+ || !strcasecmp(checked, "no")))
+ new->checked = 0;
+ else
+@@ -875,6 +881,7 @@ loadPreForm(void)
+ return;
+ while (1) {
+ char *p, *s, *arg;
++ Regex *re_arg;
+
+ line = Strfgets(fp);
+ if (line->length == 0)
+@@ -890,18 +897,20 @@ loadPreForm(void)
+ if (*p == '#' || *p == '\0')
+ continue; /* comment or empty line */
+ s = getWord(&p);
+- arg = getWord(&p);
+
+ if (!strcmp(s, "url")) {
++ arg = getRegexWord((const char **)&p, &re_arg);
+ if (!arg || !*arg)
+ continue;
+ p = getQWord(&p);
+- pf = add_pre_form(pf, arg, NULL, p);
++ pf = add_pre_form(pf, arg, re_arg, NULL, p);
+ pi = pf->item;
+ continue;
+ }
+ if (!pf)
+ continue;
++
++ arg = getWord(&p);
+ if (!strcmp(s, "form")) {
+ if (!arg || !*arg)
+ continue;
+@@ -913,7 +922,7 @@ loadPreForm(void)
+ }
+ if (pf->item) {
+ struct pre_form *prev = pf;
+- pf = add_pre_form(prev, "", s, p);
++ pf = add_pre_form(prev, "", NULL, s, p);
+ /* copy previous URL */
+ pf->url = prev->url;
+ pf->re_url = prev->re_url;
+diff --git a/frame.c b/frame.c
+index b431437..c595c40 100644
+--- a/frame.c
++++ b/frame.c
+@@ -91,7 +91,8 @@ newFrame(struct parsed_tag *tag, Buffer *buf)
+ body->baseURL = baseURL(buf);
+ if (tag) {
+ if (parsedtag_get_value(tag, ATTR_SRC, &p))
+- body->url = url_quote_conv(remove_space(p), buf->document_charset);
++ body->url = url_encode(remove_space(p), body->baseURL,
++ buf->document_charset);
+ if (parsedtag_get_value(tag, ATTR_NAME, &p) && *p != '_')
+ body->name = url_quote_conv(p, buf->document_charset);
+ }
+@@ -639,7 +640,7 @@ createFrameFile(struct frameset *f, FILE * f1, Buffer *current, int level,
+ case HTML_BASE:
+ /* "BASE" is prohibit tag */
+ if (parsedtag_get_value(tag, ATTR_HREF, &q)) {
+- q = url_quote_conv(remove_space(q), charset);
++ q = url_encode(remove_space(q), NULL, charset);
+ parseURL(q, &base, NULL);
+ }
+ if (parsedtag_get_value(tag, ATTR_TARGET, &q)) {
+@@ -768,8 +769,8 @@ createFrameFile(struct frameset *f, FILE * f1, Buffer *current, int level,
+ if (!tag->value[j])
+ break;
+ tag->value[j] =
+- url_quote_conv(remove_space(tag->value[j]),
+- charset);
++ url_encode(remove_space(tag->value[j]),
++ &base, charset);
+ tag->need_reconstruct = TRUE;
+ parseURL2(tag->value[j], &url, &base);
+ if (url.scheme == SCM_UNKNOWN ||
+@@ -894,8 +895,10 @@ renderFrame(Buffer *Cbuf, int force_reload)
+ /*
+ * if (Cbuf->frameQ != NULL) fset = Cbuf->frameQ->frameset; else */
+ fset = Cbuf->frameset;
+- if (fset == NULL || createFrameFile(fset, f, Cbuf, 0, force_reload) < 0)
++ if (fset == NULL || createFrameFile(fset, f, Cbuf, 0, force_reload) < 0) {
++ fclose(f);
+ return NULL;
++ }
+ fclose(f);
+ flag = RG_FRAME;
+ if ((Cbuf->currentURL).is_nocache)
+diff --git a/ftp.c b/ftp.c
+index 0002abd..2ca0247 100644
+--- a/ftp.c
++++ b/ftp.c
+@@ -123,6 +123,7 @@ static int
+ ftp_login(FTP ftp)
+ {
+ int sock, status;
++ int sock_wf;
+
+ sock = openSocket(ftp->host, "ftp", 21);
+ if (sock < 0)
+@@ -139,7 +140,6 @@ ftp_login(FTP ftp)
+ socklen_t socknamelen = sizeof(sockname);
+
+ if (!getsockname(sock, (struct sockaddr *)&sockname, &socknamelen)) {
+- struct hostent *sockent;
+ Str tmp = Strnew_charp(ftp->pass);
+ #ifdef INET6
+ char hostbuf[NI_MAXHOST];
+@@ -156,6 +156,7 @@ ftp_login(FTP ftp)
+ Strcat_charp(tmp, "unknown");
+ #else
+
++ struct hostent *sockent;
+ if ((sockent = gethostbyaddr((char *)&sockname.sin_addr,
+ sizeof(sockname.sin_addr),
+ sockname.sin_family)))
+@@ -169,7 +170,10 @@ ftp_login(FTP ftp)
+ }
+ }
+ ftp->rf = newInputStream(sock);
+- ftp->wf = fdopen(dup(sock), "wb");
++ if ((sock_wf = dup(sock)) >= 0 )
++ ftp->wf = fdopen(sock_wf, "wb");
++ else
++ goto open_err;
+ if (!ftp->rf || !ftp->wf)
+ goto open_err;
+ IStype(ftp->rf) |= IST_UNCLOSE;
+diff --git a/func.c b/func.c
+index f389e00..8b5deac 100644
+--- a/func.c
++++ b/func.c
+@@ -8,6 +8,7 @@
+ #include "fm.h"
+ #include "func.h"
+ #include "myctype.h"
++#include "regex.h"
+
+ #include "funcname.c"
+ #include "functable.c"
+@@ -434,6 +435,93 @@ getQWord(char **str)
+ return tmp->ptr;
+ }
+
++/* This extracts /regex/i or m@regex@i from the given string.
++ * Then advances *str to the end of regex.
++ * If the input does not seems to be a regex, this falls back to getQWord().
++ *
++ * Returns a word (no matter whether regex or not) in the give string.
++ * If regex_ret is non-NULL, compiles the regex and stores there.
++ *
++ * XXX: Actually this is unrelated to func.c.
++ */
++char *
++getRegexWord(const char **str, Regex **regex_ret)
++{
++ char *word = NULL;
++ const char *p, *headp, *bodyp, *tailp;
++ char delimiter;
++ int esc;
++ int igncase = 0;
++
++ p = *str;
++ SKIP_BLANKS(p);
++ headp = p;
++
++ /* Get the opening delimiter */
++ if (p[0] == 'm' && IS_PRINT(p[1]) && !IS_ALNUM(p[1]) && p[1] != '\\') {
++ delimiter = p[1];
++ p += 2;
++ }
++ else if (p[0] == '/') {
++ delimiter = '/';
++ p += 1;
++ }
++ else {
++ goto not_regex;
++ }
++ bodyp = p;
++
++ /* Scan the end of the expression */
++ for (esc = 0; *p; ++p) {
++ if (esc) {
++ esc = 0;
++ } else {
++ if (*p == delimiter)
++ break;
++ else if (*p == '\\')
++ esc = 1;
++ }
++ }
++ if (!*p && *headp == '/')
++ goto not_regex;
++ tailp = p;
++
++ /* Check the modifiers */
++ if (*p == delimiter) {
++ while (*++p && !IS_SPACE(*p)) {
++ switch (*p) {
++ case 'i':
++ igncase = 1;
++ break;
++ }
++ /* ignore unknown modifiers */
++ }
++ }
++
++ /* Save the expression */
++ word = allocStr(headp, p - headp);
++
++ /* Compile */
++ if (regex_ret) {
++ if (*tailp == delimiter)
++ word[tailp - headp] = 0;
++ *regex_ret = newRegex(word + (bodyp - headp), igncase, NULL, NULL);
++ if (*tailp == delimiter)
++ word[tailp - headp] = delimiter;
++ }
++ goto last;
++
++not_regex:
++ p = headp;
++ word = getQWord((char **)&p);
++ if (regex_ret)
++ *regex_ret = NULL;
++
++last:
++ *str = p;
++ return word;
++}
++
+ #ifdef USE_MOUSE
+ static MouseAction default_mouse_action = {
+ NULL,
+diff --git a/history.c b/history.c
+index 951ef83..f2a00b4 100644
+--- a/history.c
++++ b/history.c
+@@ -17,7 +17,7 @@ historyBuffer(Hist *hist)
+ for (item = hist->list->last; item; item = item->prev) {
+ q = html_quote((char *)item->ptr);
+ if (DecodeURL)
+- p = html_quote(url_unquote_conv((char *)item->ptr, 0));
++ p = html_quote(url_decode2((char *)item->ptr, NULL));
+ else
+ p = q;
+ Strcat_charp(src, "<li><a href=\"");
+@@ -60,6 +60,7 @@ saveHistory(Hist *hist, size_t size)
+ FILE *f;
+ HistItem *item;
+ char *tmpf;
++ int rename_ret;
+
+ if (hist == NULL || hist->list == NULL)
+ return;
+@@ -79,7 +80,11 @@ saveHistory(Hist *hist, size_t size)
+ disp_err_message("Can't save history", FALSE);
+ return;
+ }
+- rename(tmpf, rcFile(HISTORY_FILE));
++ rename_ret = rename(tmpf, rcFile(HISTORY_FILE));
++ if (rename_ret != 0) {
++ disp_err_message("Can't save history", FALSE);
++ return;
++ }
+ }
+ #endif /* USE_HISTORY */
+
+diff --git a/html.c b/html.c
+index bca227e..d9f08e9 100644
+--- a/html.c
++++ b/html.c
+@@ -56,6 +56,9 @@ unsigned char ALST_INPUT[] =
+ ATTR_CORE
+ };
+ #define MAXA_INPUT MAXA_CORE + 12
++unsigned char ALST_BUTTON[] =
++ { ATTR_TYPE, ATTR_VALUE, ATTR_NAME, ATTR_CORE };
++#define MAXA_BUTTON MAXA_CORE + 3
+ unsigned char ALST_TEXTAREA[] =
+ { ATTR_COLS, ATTR_ROWS, ATTR_NAME, ATTR_READONLY, ATTR_CORE };
+ #define MAXA_TEXTAREA MAXA_CORE + 4
+@@ -247,24 +250,24 @@ TagInfo TagMAP[MAX_HTMLTAG] = {
+ {"/bdo", NULL, 0, TFLG_END}, /* 121 HTML_N_BDO */
+ {"big", ALST_NOP, MAXA_NOP, 0}, /* 122 HTML_BIG */
+ {"/big", NULL, 0, TFLG_END}, /* 123 HTML_N_BIG */
+- {"button", ALST_NOP, MAXA_NOP, 0}, /* 124 HTML_BUTTON */
+- {"fieldset", ALST_NOP, MAXA_NOP, 0}, /* 125 HTML_FIELDSET */
+- {"/fieldset", NULL, 0, TFLG_END}, /* 126 HTML_N_FIELDSET */
+- {"iframe", ALST_NOP, MAXA_NOP, 0}, /* 127 HTML_IFRAME */
+- {"label", ALST_NOP, MAXA_NOP, 0}, /* 128 HTML_LABEL */
+- {"/label", NULL, 0, TFLG_END}, /* 129 HTML_N_LABEL */
+- {"legend", ALST_NOP, MAXA_NOP, 0}, /* 130 HTML_LEGEND */
+- {"/legend", NULL, 0, TFLG_END}, /* 131 HTML_N_LEGEND */
+- {"noscript", ALST_NOP, MAXA_NOP, 0}, /* 132 HTML_NOSCRIPT */
+- {"/noscript", NULL, 0, TFLG_END}, /* 133 HTML_N_NOSCRIPT */
+- {"object", ALST_NOP, MAXA_NOP, 0}, /* 134 HTML_OBJECT */
+- {"optgroup", ALST_NOP, MAXA_NOP, 0}, /* 135 HTML_OPTGROUP */
+- {"/optgroup", NULL, 0, TFLG_END}, /* 136 HTML_N_OPTGROUP */
+- {"param", ALST_NOP, MAXA_NOP, 0}, /* 137 HTML_PARAM */
+- {"small", ALST_NOP, MAXA_NOP, 0}, /* 138 HTML_SMALL */
+- {"/small", NULL, 0, TFLG_END}, /* 139 HTML_N_SMALL */
++ {"button", ALST_BUTTON, MAXA_BUTTON, 0}, /* 124 HTML_BUTTON */
++ {"/button", NULL, 0, TFLG_END}, /* 125 HTML_N_BUTTON */
++ {"fieldset", ALST_NOP, MAXA_NOP, 0}, /* 126 HTML_FIELDSET */
++ {"/fieldset", NULL, 0, TFLG_END}, /* 127 HTML_N_FIELDSET */
++ {"iframe", ALST_NOP, MAXA_NOP, 0}, /* 128 HTML_IFRAME */
++ {"label", ALST_NOP, MAXA_NOP, 0}, /* 129 HTML_LABEL */
++ {"/label", NULL, 0, TFLG_END}, /* 130 HTML_N_LABEL */
++ {"legend", ALST_NOP, MAXA_NOP, 0}, /* 131 HTML_LEGEND */
++ {"/legend", NULL, 0, TFLG_END}, /* 132 HTML_N_LEGEND */
++ {"noscript", ALST_NOP, MAXA_NOP, 0}, /* 133 HTML_NOSCRIPT */
++ {"/noscript", NULL, 0, TFLG_END}, /* 134 HTML_N_NOSCRIPT */
++ {"object", ALST_NOP, MAXA_NOP, 0}, /* 135 HTML_OBJECT */
++ {"optgroup", ALST_NOP, MAXA_NOP, 0}, /* 136 HTML_OPTGROUP */
++ {"/optgroup", NULL, 0, TFLG_END}, /* 137 HTML_N_OPTGROUP */
++ {"param", ALST_NOP, MAXA_NOP, 0}, /* 138 HTML_PARAM */
++ {"small", ALST_NOP, MAXA_NOP, 0}, /* 139 HTML_SMALL */
++ {"/small", NULL, 0, TFLG_END}, /* 140 HTML_N_SMALL */
+
+- {NULL, NULL, 0, 0}, /* 140 Undefined */
+ {NULL, NULL, 0, 0}, /* 141 Undefined */
+ {NULL, NULL, 0, 0}, /* 142 Undefined */
+ {NULL, NULL, 0, 0}, /* 143 Undefined */
+diff --git a/html.h b/html.h
+index 7abbd3b..c490655 100644
+--- a/html.h
++++ b/html.h
+@@ -1,20 +1,18 @@
+ /* $Id: html.h,v 1.31 2010/08/14 01:29:40 htrb Exp $ */
+ #ifndef _HTML_H
+ #define _HTML_H
++#include "config.h"
+ #ifdef USE_SSL
+ #include <openssl/bio.h>
+ #include <openssl/x509.h>
+ #include <openssl/ssl.h>
+ #endif /* USE_SSL */
+
+-#include "istream.h"
+-
+ #define StrUFgets(f) StrISgets((f)->stream)
+ #define StrmyUFgets(f) StrmyISgets((f)->stream)
+ #define UFgetc(f) ISgetc((f)->stream)
+ #define UFundogetc(f) ISundogetc((f)->stream)
+-#define UFread(f,buf,len) ISread((f)->stream,buf,len)
+-#define UFclose(f) (void)(ISclose((f)->stream) == 0 && ((f)->stream = NULL))
++#define UFclose(f) if (ISclose((f)->stream) == 0) {(f)->stream = NULL ;}
+ #define UFfileno(f) ISfileno((f)->stream)
+
+ struct cmdtable {
+@@ -62,11 +60,12 @@ typedef struct _ParsedURL {
+ int is_nocache;
+ } ParsedURL;
+
++union input_stream;
+ typedef struct {
+ unsigned char scheme;
+ char is_cgi;
+ char encoding;
+- InputStream stream;
++ union input_stream *stream;
+ char *ext;
+ int compression;
+ int content_encoding;
+@@ -214,21 +213,22 @@ typedef struct {
+ #define HTML_BIG 122
+ #define HTML_N_BIG 123
+ #define HTML_BUTTON 124
+-#define HTML_FIELDSET 125
+-#define HTML_N_FIELDSET 126
+-#define HTML_IFRAME 127
+-#define HTML_LABEL 128
+-#define HTML_N_LABEL 129
+-#define HTML_LEGEND 130
+-#define HTML_N_LEGEND 131
+-#define HTML_NOSCRIPT 132
+-#define HTML_N_NOSCRIPT 133
+-#define HTML_OBJECT 134
+-#define HTML_OPTGROUP 135
+-#define HTML_N_OPTGROUP 136
+-#define HTML_PARAM 137
+-#define HTML_SMALL 138
+-#define HTML_N_SMALL 139
++#define HTML_N_BUTTON 125
++#define HTML_FIELDSET 126
++#define HTML_N_FIELDSET 127
++#define HTML_IFRAME 128
++#define HTML_LABEL 129
++#define HTML_N_LABEL 130
++#define HTML_LEGEND 131
++#define HTML_N_LEGEND 132
++#define HTML_NOSCRIPT 133
++#define HTML_N_NOSCRIPT 134
++#define HTML_OBJECT 135
++#define HTML_OPTGROUP 136
++#define HTML_N_OPTGROUP 137
++#define HTML_PARAM 138
++#define HTML_SMALL 139
++#define HTML_N_SMALL 140
+
+ /* pseudo tag */
+ #define HTML_SELECT_INT 160
+diff --git a/image.c b/image.c
+index 5f5991a..91034ee 100644
+--- a/image.c
++++ b/image.c
+@@ -44,6 +44,8 @@ initImage()
+ activeImage = TRUE;
+ }
+
++int get_pixel_per_cell(int *ppc, int *ppl);
++
+ int
+ getCharSize()
+ {
+@@ -52,6 +54,24 @@ getCharSize()
+ int w = 0, h = 0;
+
+ set_environ("W3M_TTY", ttyname_tty());
++
++ if (enable_inline_image) {
++ int ppc, ppl;
++
++ if (get_pixel_per_cell(&ppc,&ppl)) {
++ pixel_per_char_i = ppc ;
++ pixel_per_line_i = ppl ;
++ pixel_per_char = (double)ppc;
++ pixel_per_line = (double)ppl;
++ }
++ else {
++ pixel_per_char_i = (int)pixel_per_char;
++ pixel_per_line_i = (int)pixel_per_line;
++ }
++
++ return TRUE;
++ }
++
+ tmp = Strnew();
+ if (!strchr(Imgdisplay, '/'))
+ Strcat_m_charp(tmp, w3m_auxbin_dir(), "/", NULL);
+@@ -90,17 +110,18 @@ termImage()
+ static int
+ openImgdisplay()
+ {
++ char *cmd;
++
++ if (!strchr(Imgdisplay, '/'))
++ cmd = Strnew_m_charp(w3m_auxbin_dir(), "/", Imgdisplay, NULL)->ptr;
++ else
++ cmd = Imgdisplay;
+ Imgdisplay_pid = open_pipe_rw(&Imgdisplay_rf, &Imgdisplay_wf);
+ if (Imgdisplay_pid < 0)
+ goto err0;
+ if (Imgdisplay_pid == 0) {
+ /* child */
+- char *cmd;
+ setup_child(FALSE, 2, -1);
+- if (!strchr(Imgdisplay, '/'))
+- cmd = Strnew_m_charp(w3m_auxbin_dir(), "/", Imgdisplay, NULL)->ptr;
+- else
+- cmd = Imgdisplay;
+ myExec(cmd);
+ /* XXX: ifdef __EMX__, use start /f ? */
+ }
+@@ -155,6 +176,10 @@ addImage(ImageCache * cache, int x, int y, int sx, int sy, int w, int h)
+ static void
+ syncImage(void)
+ {
++ if (enable_inline_image) {
++ return;
++ }
++
+ fputs("3;\n", Imgdisplay_wf); /* XSync() */
+ fputs("4;\n", Imgdisplay_wf); /* put '\n' */
+ while (fflush(Imgdisplay_wf) != 0) {
+@@ -170,12 +195,16 @@ syncImage(void)
+ n_terminal_image = 0;
+ }
+
++void put_image_osc5379(char *url, int x, int y, int w, int h, int sx, int sy, int sw, int sh, int n_terminal_image);
++void put_image_sixel(char *url, int x, int y, int w, int h, int sx, int sy, int sw, int sh, int n_terminal_image);
++
+ void
+ drawImage()
+ {
+ static char buf[64];
+ int j, draw = FALSE;
+ TerminalImage *i;
++ struct stat st ;
+
+ if (!activeImage)
+ return;
+@@ -183,6 +212,47 @@ drawImage()
+ return;
+ for (j = 0; j < n_terminal_image; j++) {
+ i = &terminal_image[j];
++
++ if (enable_inline_image) {
++ #if 0
++ fprintf(stderr,"file %s x %d y %d w %d h %d sx %d sy %d sw %d sh %d (ppc %d ppl %d)\n",
++ ((enable_inline_image == 2 || getenv("WINDOWID")) &&
++ i->cache->touch) ? i->cache->file : i->cache->url,
++ i->x, i->y,
++ i->cache->width > 0 ? i->cache->width : 0,
++ i->cache->height > 0 ? i->cache->height : 0,
++ i->sx, i->sy, i->width, i->height,
++ pixel_per_char_i, pixel_per_line_i);
++ #endif
++ (enable_inline_image == 2 ? put_image_sixel : put_image_osc5379)(
++ ((enable_inline_image == 2 /* sixel */ || getenv("WINDOWID")) &&
++ /* XXX I don't know why but sometimes i->cache->file doesn't exist. */
++ i->cache->touch && stat(i->cache->file,&st) == 0) ?
++ /* local */ i->cache->file : /* remote */ i->cache->url,
++ i->x / pixel_per_char_i,
++ i->y / pixel_per_line_i,
++ #if 1
++ i->cache->a_width > 0 ?
++ (i->cache->width + i->x % pixel_per_char_i + pixel_per_char_i - 1) /
++ pixel_per_char_i :
++ #endif
++ 0,
++
++ #if 1
++ i->cache->a_height > 0 ?
++ (i->cache->height + i->y % pixel_per_line_i + pixel_per_line_i - 1) /
++ pixel_per_line_i :
++ #endif
++ 0,
++ i->sx / pixel_per_char_i,
++ i->sy / pixel_per_line_i,
++ (i->width + i->sx % pixel_per_char_i + pixel_per_char_i - 1) / pixel_per_char_i,
++ (i->height + i->sy % pixel_per_line_i + pixel_per_line_i - 1) / pixel_per_line_i,
++ n_terminal_image);
++
++ continue ;
++ }
++
+ if (!(i->cache->loaded & IMG_FLAG_LOADED &&
+ i->width > 0 && i->height > 0))
+ continue;
+@@ -206,9 +276,15 @@ drawImage()
+ fputs("\n", Imgdisplay_wf);
+ draw = TRUE;
+ }
+- if (!draw)
+- return;
+- syncImage();
++
++ if (!enable_inline_image) {
++ if (!draw)
++ return;
++ syncImage();
++ }
++ else
++ n_terminal_image = 0;
++
+ touch_cursor();
+ refresh();
+ }
+@@ -320,6 +396,8 @@ showImageProgress(Buffer *buf)
+ }
+ }
+ if (n) {
++ if (enable_inline_image && n == l)
++ drawImage();
+ message(Sprintf("%d/%d images loaded", l, n)->ptr,
+ buf->cursorX + buf->rootX, buf->cursorY + buf->rootY);
+ refresh();
+@@ -333,6 +411,9 @@ loadImage(Buffer *buf, int flag)
+ struct stat st;
+ int i, draw = FALSE;
+ /* int wait_st; */
++#ifdef DONT_CALL_GC_AFTER_FORK
++ char *loadargs[7];
++#endif
+
+ if (maxLoadImage > MAX_LOAD_IMAGE)
+ maxLoadImage = MAX_LOAD_IMAGE;
+@@ -346,7 +427,7 @@ loadImage(Buffer *buf, int flag)
+ }
+ for (i = 0; i < n_load_image; i++) {
+ cache = image_cache[i];
+- if (!cache)
++ if (!cache || !cache->touch)
+ continue;
+ if (lstat(cache->touch, &st))
+ continue;
+@@ -377,7 +458,7 @@ loadImage(Buffer *buf, int flag)
+
+ for (i = (buf != image_buffer) ? 0 : maxLoadImage; i < n_load_image; i++) {
+ cache = image_cache[i];
+- if (!cache)
++ if (!cache || !cache->touch)
+ continue;
+ if (cache->pid) {
+ kill(cache->pid, SIGKILL);
+@@ -403,7 +484,8 @@ loadImage(Buffer *buf, int flag)
+ }
+
+ if (draw && image_buffer) {
+- drawImage();
++ if (!enable_inline_image)
++ drawImage();
+ showImageProgress(image_buffer);
+ }
+
+@@ -431,8 +513,29 @@ loadImage(Buffer *buf, int flag)
+ break;
+ }
+ image_cache[i] = cache;
++ if (!cache->touch) {
++ continue;
++ }
+
+ flush_tty();
++#ifdef DONT_CALL_GC_AFTER_FORK
++ loadargs[0] = MyProgramName;
++ loadargs[1] = "-$$getimage";
++ loadargs[2] = conv_to_system(cache->url);
++ loadargs[3] = conv_to_system(parsedURL2Str(cache->current)->ptr);
++ loadargs[4] = cache->file;
++ loadargs[5] = cache->touch;
++ loadargs[6] = NULL;
++ if ((cache->pid = fork()) == 0) {
++ setup_child(FALSE, 0, -1);
++ execvp(MyProgramName, loadargs);
++ exit(1);
++ }
++ else if (cache->pid < 0) {
++ cache->pid = 0;
++ return;
++ }
++#else /* !DONT_CALL_GC_AFTER_FORK */
+ if ((cache->pid = fork()) == 0) {
+ Buffer *b;
+ /*
+@@ -458,6 +561,7 @@ loadImage(Buffer *buf, int flag)
+ cache->pid = 0;
+ return;
+ }
++#endif /* !DONT_CALL_GC_AFTER_FORK */
+ }
+ }
+
+@@ -492,12 +596,30 @@ getImage(Image * image, ParsedURL *current, int flag)
+ cache->url = image->url;
+ cache->current = current;
+ cache->file = tmpfname(TMPF_DFL, image->ext)->ptr;
+- cache->touch = tmpfname(TMPF_DFL, NULL)->ptr;
+ cache->pid = 0;
+ cache->index = 0;
+ cache->loaded = IMG_FLAG_UNLOADED;
+- cache->width = image->width;
+- cache->height = image->height;
++ if (enable_inline_image == 1) {
++ if (image->width > 0 && image->width % pixel_per_char_i > 0)
++ image->width += (pixel_per_char_i - image->width % pixel_per_char_i);
++
++ if (image->height > 0 && image->height % pixel_per_line_i > 0)
++ image->height += (pixel_per_line_i - image->height % pixel_per_line_i);
++ if (image->height > 0 && image->width > 0) {
++ cache->loaded = IMG_FLAG_LOADED;
++ }
++ }
++ if (cache->loaded == IMG_FLAG_UNLOADED) {
++ cache->touch = tmpfname(TMPF_DFL, NULL)->ptr;
++ }
++ else {
++ cache->touch = NULL;
++ }
++
++ cache->width = image->width ;
++ cache->height = image->height ;
++ cache->a_width = image->width;
++ cache->a_height = image->height;
+ putHash_sv(image_hash, key->ptr, (void *)cache);
+ }
+ if (flag != IMG_FLAG_SKIP) {
+@@ -519,6 +641,78 @@ getImage(Image * image, ParsedURL *current, int flag)
+ return cache;
+ }
+
++static int
++parseImageHeader(char *path, u_int *width, u_int *height)
++{
++ FILE *fp;
++ u_char buf[8];
++
++ if (!(fp = fopen(path, "r"))) return FALSE;
++
++ if (fread(buf, 1, 2, fp) != 2) goto error;
++
++ if (memcmp(buf, "\xff\xd8", 2) == 0) {
++ /* JPEG */
++ if (fseek(fp, 2, SEEK_CUR) < 0) goto error; /* 0xffe0 */
++ while (fread(buf, 1, 2, fp) == 2) {
++ size_t len = ((buf[0] << 8) | buf[1]) - 2;
++ if (fseek(fp, len, SEEK_CUR) < 0) goto error;
++ if (fread(buf, 1, 2, fp) == 2 &&
++ /* SOF0 or SOF2 */
++ (memcmp(buf, "\xff\xc0", 2) == 0 || memcmp(buf, "\xff\xc2", 2) == 0)) {
++ fseek(fp, 3, SEEK_CUR);
++ if (fread(buf, 1, 2, fp) == 2) {
++ *height = (buf[0] << 8) | buf[1];
++ if (fread(buf, 1, 2, fp) == 2) {
++ *width = (buf[0] << 8) | buf[1];
++ goto success;
++ }
++ }
++ break;
++ }
++ }
++ goto error;
++ }
++
++ if (fread(buf + 2, 1, 1, fp) != 1) goto error;
++
++ if (memcmp(buf, "GIF", 3) == 0) {
++ /* GIF */
++ if (fseek(fp, 3, SEEK_CUR) < 0) goto error;
++ if (fread(buf, 1, 2, fp) == 2) {
++ *width = (buf[1] << 8) | buf[0];
++ if (fread(buf, 1, 2, fp) == 2) {
++ *height = (buf[1] << 8) | buf[0];
++ goto success;
++ }
++ }
++ goto error;
++ }
++
++ if (fread(buf + 3, 1, 5, fp) != 5) goto error;
++
++ if (memcmp(buf, "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a", 8) == 0) {
++ /* PNG */
++ if (fseek(fp, 8, SEEK_CUR) < 0) goto error;
++ if (fread(buf, 1, 4, fp) == 4) {
++ *width = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
++ if (fread(buf, 1, 4, fp) == 4) {
++ *height = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
++ goto success;
++ }
++ }
++ goto error;
++ }
++
++error:
++ fclose(fp);
++ return FALSE;
++
++success:
++ fclose(fp);
++ return TRUE;
++}
++
+ int
+ getImageSize(ImageCache * cache)
+ {
+@@ -531,6 +725,10 @@ getImageSize(ImageCache * cache)
+ if (!cache || !(cache->loaded & IMG_FLAG_LOADED) ||
+ (cache->width > 0 && cache->height > 0))
+ return FALSE;
++
++ if (parseImageHeader(cache->file, &w, &h))
++ goto got_image_size;
++
+ tmp = Strnew();
+ if (!strchr(Imgdisplay, '/'))
+ Strcat_m_charp(tmp, w3m_auxbin_dir(), "/", NULL);
+@@ -546,6 +744,8 @@ getImageSize(ImageCache * cache)
+
+ if (!(w > 0 && h > 0))
+ return FALSE;
++
++got_image_size:
+ w = (int)(w * image_scale / 100 + 0.5);
+ if (w == 0)
+ w = 1;
+@@ -558,11 +758,11 @@ getImageSize(ImageCache * cache)
+ }
+ else if (cache->width < 0) {
+ int tmp = (int)((double)cache->height * w / h + 0.5);
+- cache->width = (tmp > MAX_IMAGE_SIZE) ? MAX_IMAGE_SIZE : tmp;
++ cache->a_width = cache->width = (tmp > MAX_IMAGE_SIZE) ? MAX_IMAGE_SIZE : tmp;
+ }
+ else if (cache->height < 0) {
+ int tmp = (int)((double)cache->width * h / w + 0.5);
+- cache->height = (tmp > MAX_IMAGE_SIZE) ? MAX_IMAGE_SIZE : tmp;
++ cache->a_height = cache->height = (tmp > MAX_IMAGE_SIZE) ? MAX_IMAGE_SIZE : tmp;
+ }
+ if (cache->width == 0)
+ cache->width = 1;
+diff --git a/indep.c b/indep.c
+index 65b04aa..5c5de06 100644
+--- a/indep.c
++++ b/indep.c
+@@ -357,6 +357,20 @@ strcasemstr(char *str, char *srch[], char **ret_ptr)
+ return -1;
+ }
+
++int
++strmatchlen(const char *s1, const char *s2, int maxlen)
++{
++ int i;
++
++ /* To allow the maxlen to be negatie (infinity),
++ * compare by "!=" instead of "<=". */
++ for (i = 0; i != maxlen; ++i) {
++ if (!s1[i] || !s2[i] || s1[i] != s2[i])
++ break;
++ }
++ return i;
++}
++
+ char *
+ remove_space(char *str)
+ {
+@@ -707,6 +721,111 @@ shell_quote(char *str)
+ return str;
+ }
+
++void *
++xrealloc(void *ptr, size_t size)
++{
++ void *newptr = realloc(ptr, size);
++ if (newptr == NULL) {
++ fprintf(stderr, "Out of memory\n");
++ exit(-1);
++ }
++ return newptr;
++}
++
++/* Define this as a separate function in case the free() has
++ * an incompatible prototype. */
++void
++xfree(void *ptr)
++{
++ free(ptr);
++}
++
++void *
++w3m_GC_realloc_atomic(void *ptr, size_t size)
++{
++ return ptr ? GC_REALLOC(ptr, size) : GC_MALLOC_ATOMIC(size);
++}
++
++void
++w3m_GC_free(void *ptr)
++{
++ GC_FREE(ptr);
++}
++
++void
++growbuf_init(struct growbuf *gb)
++{
++ gb->ptr = NULL;
++ gb->length = 0;
++ gb->area_size = 0;
++ gb->realloc_proc = &w3m_GC_realloc_atomic;
++ gb->free_proc = &w3m_GC_free;
++}
++
++void
++growbuf_init_without_GC(struct growbuf *gb)
++{
++ gb->ptr = NULL;
++ gb->length = 0;
++ gb->area_size = 0;
++ gb->realloc_proc = &xrealloc;
++ gb->free_proc = &xfree;
++}
++
++void
++growbuf_clear(struct growbuf *gb)
++{
++ (*gb->free_proc) (gb->ptr);
++ gb->ptr = NULL;
++ gb->length = 0;
++ gb->area_size = 0;
++}
++
++Str
++growbuf_to_Str(struct growbuf *gb)
++{
++ Str s;
++
++ if (gb->free_proc == &w3m_GC_free) {
++ growbuf_reserve(gb, gb->length + 1);
++ gb->ptr[gb->length] = '\0';
++ s = New(struct _Str);
++ s->ptr = gb->ptr;
++ s->length = gb->length;
++ s->area_size = gb->area_size;
++ } else {
++ s = Strnew_charp_n(gb->ptr, gb->length);
++ (*gb->free_proc) (gb->ptr);
++ }
++ gb->ptr = NULL;
++ gb->length = 0;
++ gb->area_size = 0;
++ return s;
++}
++
++void
++growbuf_reserve(struct growbuf *gb, int leastarea)
++{
++ int newarea;
++
++ if (gb->area_size < leastarea) {
++ newarea = gb->area_size * 3 / 2;
++ if (newarea < leastarea)
++ newarea = leastarea;
++ newarea += 16;
++ gb->ptr = (*gb->realloc_proc) (gb->ptr, newarea);
++ gb->area_size = newarea;
++ }
++}
++
++void
++growbuf_append(struct growbuf *gb, const char *src, int len)
++{
++ growbuf_reserve(gb, gb->length + len);
++ memcpy(&gb->ptr[gb->length], src, len);
++ gb->length += len;
++}
++
+ static char *
+ w3m_dir(const char *name, char *dft)
+ {
+diff --git a/indep.h b/indep.h
+index b3819a3..2809832 100644
+--- a/indep.h
++++ b/indep.h
+@@ -1,7 +1,7 @@
+ /* $Id: indep.h,v 1.16 2003/09/22 21:02:19 ukai Exp $ */
+ #ifndef INDEP_H
+ #define INDEP_H
+-#include <gc.h>
++#include "alloc.h"
+ #include "Str.h"
+ #include "config.h"
+
+@@ -12,6 +12,14 @@
+ #define FALSE 0
+ #endif /* FALSE */
+
++struct growbuf {
++ char *ptr;
++ int length;
++ int area_size;
++ void *(*realloc_proc) (void *, size_t);
++ void (*free_proc) (void *);
++};
++
+ #define RAW_MODE 0
+ #define PAGER_MODE 1
+ #define HTML_MODE 2
+@@ -52,6 +60,7 @@ extern int strncasecmp(const char *s1, const char *s2, size_t n);
+ extern char *strcasestr(const char *s1, const char *s2);
+ #endif
+ extern int strcasemstr(char *str, char *srch[], char **ret_ptr);
++int strmatchlen(const char *s1, const char *s2, int maxlen);
+ extern char *remove_space(char *str);
+ extern int non_null(char *s);
+ extern void cleanup_line(Str s, int mode);
+@@ -64,6 +73,18 @@ extern Str Str_url_unquote(Str x, int is_form, int safe);
+ extern Str Str_form_quote(Str x);
+ #define Str_form_unquote(x) Str_url_unquote((x), TRUE, FALSE)
+ extern char *shell_quote(char *str);
++#define xmalloc(s) xrealloc(NULL, s)
++extern void *xrealloc(void *ptr, size_t size);
++extern void xfree(void *ptr);
++extern void *w3m_GC_realloc_atomic(void *ptr, size_t size);
++extern void w3m_GC_free(void *ptr);
++extern void growbuf_init(struct growbuf *gb);
++extern void growbuf_init_without_GC(struct growbuf *gb);
++extern void growbuf_clear(struct growbuf *gb);
++extern Str growbuf_to_Str(struct growbuf *gb);
++extern void growbuf_reserve(struct growbuf *gb, int leastarea);
++extern void growbuf_append(struct growbuf *gb, const char *src, int len);
++#define GROWBUF_ADD_CHAR(gb,ch) ((((gb)->length>=(gb)->area_size)?growbuf_reserve(gb,(gb)->length+1):(void)0),(void)((gb)->ptr[(gb)->length++] = (ch)))
+
+ extern char *w3m_auxbin_dir();
+ extern char *w3m_lib_dir();
+@@ -71,10 +92,8 @@ extern char *w3m_etc_dir();
+ extern char *w3m_conf_dir();
+ extern char *w3m_help_dir();
+
+-#define New(type) ((type*)GC_MALLOC(sizeof(type)))
+-#define NewAtom(type) ((type*)GC_MALLOC_ATOMIC(sizeof(type)))
+-#define New_N(type,n) ((type*)GC_MALLOC((n)*sizeof(type)))
+-#define NewAtom_N(type,n) ((type*)GC_MALLOC_ATOMIC((n)*sizeof(type)))
+-#define New_Reuse(type,ptr,n) ((type*)GC_REALLOC((ptr),(n)*sizeof(type)))
++#define NewWithoutGC(type) ((type*)xmalloc(sizeof(type)))
++#define NewWithoutGC_N(type,n) ((type*)xmalloc((n)*sizeof(type)))
++#define NewWithoutGC_Reuse(type,ptr,n) ((type*)xrealloc(ptr,(n)*sizeof(type)))
+
+ #endif /* INDEP_H */
+diff --git a/istream.c b/istream.c
+index 8967280..1387307 100644
+--- a/istream.c
++++ b/istream.c
+@@ -22,8 +22,8 @@
+ static void basic_close(int *handle);
+ static int basic_read(int *handle, char *buf, int len);
+
+-static void file_close(struct file_handle *handle);
+-static int file_read(struct file_handle *handle, char *buf, int len);
++static void file_close(struct io_file_handle *handle);
++static int file_read(struct io_file_handle *handle, char *buf, int len);
+
+ static int str_read(Str handle, char *buf, int len);
+
+@@ -35,12 +35,14 @@ static int ssl_read(struct ssl_handle *handle, char *buf, int len);
+ static int ens_read(struct ens_handle *handle, char *buf, int len);
+ static void ens_close(struct ens_handle *handle);
+
++static void memchop(char *p, int *len);
++
+ static void
+ do_update(BaseStream base)
+ {
+ int len;
+ base->stream.cur = base->stream.next = 0;
+- len = base->read(base->handle, base->stream.buf, base->stream.size);
++ len = (*base->read) (base->handle, base->stream.buf, base->stream.size);
+ if (len <= 0)
+ base->iseos = TRUE;
+ else
+@@ -66,12 +68,12 @@ init_buffer(BaseStream base, char *buf, int bufsize)
+ StreamBuffer sb = &base->stream;
+ sb->size = bufsize;
+ sb->cur = 0;
++ sb->buf = NewWithoutGC_N(uchar, bufsize);
+ if (buf) {
+- sb->buf = (uchar *) buf;
++ memcpy(sb->buf, buf, bufsize);
+ sb->next = bufsize;
+ }
+ else {
+- sb->buf = NewAtom_N(uchar, bufsize);
+ sb->next = 0;
+ }
+ base->iseos = FALSE;
+@@ -95,10 +97,10 @@ newInputStream(int des)
+ InputStream stream;
+ if (des < 0)
+ return NULL;
+- stream = New(union input_stream);
++ stream = NewWithoutGC(union input_stream);
+ init_base_stream(&stream->base, STREAM_BUF_SIZE);
+ stream->base.type = IST_BASIC;
+- stream->base.handle = New(int);
++ stream->base.handle = NewWithoutGC(int);
+ *(int *)stream->base.handle = des;
+ stream->base.read = (int (*)())basic_read;
+ stream->base.close = (void (*)())basic_close;
+@@ -111,10 +113,10 @@ newFileStream(FILE * f, void (*closep) ())
+ InputStream stream;
+ if (f == NULL)
+ return NULL;
+- stream = New(union input_stream);
++ stream = NewWithoutGC(union input_stream);
+ init_base_stream(&stream->base, STREAM_BUF_SIZE);
+ stream->file.type = IST_FILE;
+- stream->file.handle = New(struct file_handle);
++ stream->file.handle = NewWithoutGC(struct io_file_handle);
+ stream->file.handle->f = f;
+ if (closep)
+ stream->file.handle->close = closep;
+@@ -131,10 +133,10 @@ newStrStream(Str s)
+ InputStream stream;
+ if (s == NULL)
+ return NULL;
+- stream = New(union input_stream);
++ stream = NewWithoutGC(union input_stream);
+ init_str_stream(&stream->base, s);
+ stream->str.type = IST_STR;
+- stream->str.handle = s;
++ stream->str.handle = NULL;
+ stream->str.read = (int (*)())str_read;
+ stream->str.close = NULL;
+ return stream;
+@@ -147,10 +149,10 @@ newSSLStream(SSL * ssl, int sock)
+ InputStream stream;
+ if (sock < 0)
+ return NULL;
+- stream = New(union input_stream);
++ stream = NewWithoutGC(union input_stream);
+ init_base_stream(&stream->base, SSL_BUF_SIZE);
+ stream->ssl.type = IST_SSL;
+- stream->ssl.handle = New(struct ssl_handle);
++ stream->ssl.handle = NewWithoutGC(struct ssl_handle);
+ stream->ssl.handle->ssl = ssl;
+ stream->ssl.handle->sock = sock;
+ stream->ssl.read = (int (*)())ssl_read;
+@@ -166,14 +168,14 @@ newEncodedStream(InputStream is, char encoding)
+ if (is == NULL || (encoding != ENC_QUOTE && encoding != ENC_BASE64 &&
+ encoding != ENC_UUENCODE))
+ return is;
+- stream = New(union input_stream);
++ stream = NewWithoutGC(union input_stream);
+ init_base_stream(&stream->base, STREAM_BUF_SIZE);
+ stream->ens.type = IST_ENCODED;
+- stream->ens.handle = New(struct ens_handle);
++ stream->ens.handle = NewWithoutGC(struct ens_handle);
+ stream->ens.handle->is = is;
+ stream->ens.handle->pos = 0;
+ stream->ens.handle->encoding = encoding;
+- stream->ens.handle->s = NULL;
++ growbuf_init_without_GC(&stream->ens.handle->gb);
+ stream->ens.read = (int (*)())ens_read;
+ stream->ens.close = (void (*)())ens_close;
+ return stream;
+@@ -187,8 +189,10 @@ ISclose(InputStream stream)
+ stream->base.type & IST_UNCLOSE)
+ return -1;
+ prevtrap = mySignal(SIGINT, SIG_IGN);
+- stream->base.close(stream->base.handle);
++ stream->base.close (stream->base.handle);
+ mySignal(SIGINT, prevtrap);
++ xfree(stream->base.stream.buf);
++ xfree(stream);
+ return 0;
+ }
+
+@@ -218,122 +222,97 @@ ISundogetc(InputStream stream)
+ return -1;
+ }
+
+-#define MARGIN_STR_SIZE 10
+ Str
+-StrISgets(InputStream stream)
++StrISgets2(InputStream stream, char crnl)
+ {
+- BaseStream base;
+- StreamBuffer sb;
+- Str s = NULL;
+- uchar *p;
+- int len;
++ struct growbuf gb;
+
+ if (stream == NULL)
+- return '\0';
+- base = &stream->base;
+- sb = &base->stream;
+-
+- while (!base->iseos) {
+- if (MUST_BE_UPDATED(base)) {
+- do_update(base);
+- }
+- else {
+- if ((p = memchr(&sb->buf[sb->cur], '\n', sb->next - sb->cur))) {
+- len = p - &sb->buf[sb->cur] + 1;
+- if (s == NULL)
+- s = Strnew_size(len);
+- Strcat_charp_n(s, (char *)&sb->buf[sb->cur], len);
+- sb->cur += len;
+- return s;
+- }
+- else {
+- if (s == NULL)
+- s = Strnew_size(sb->next - sb->cur + MARGIN_STR_SIZE);
+- Strcat_charp_n(s, (char *)&sb->buf[sb->cur],
+- sb->next - sb->cur);
+- sb->cur = sb->next;
+- }
+- }
+- }
+-
+- if (s == NULL)
+- return Strnew();
+- return s;
++ return NULL;
++ growbuf_init(&gb);
++ ISgets_to_growbuf(stream, &gb, crnl);
++ return growbuf_to_Str(&gb);
+ }
+
+-Str
+-StrmyISgets(InputStream stream)
++void
++ISgets_to_growbuf(InputStream stream, struct growbuf *gb, char crnl)
+ {
+- BaseStream base;
+- StreamBuffer sb;
+- Str s = NULL;
+- int i, len;
++ BaseStream base = &stream->base;
++ StreamBuffer sb = &base->stream;
++ int i;
+
+- if (stream == NULL)
+- return '\0';
+- base = &stream->base;
+- sb = &base->stream;
++ gb->length = 0;
+
+ while (!base->iseos) {
+ if (MUST_BE_UPDATED(base)) {
+ do_update(base);
++ continue;
+ }
+- else {
+- if (s && Strlastchar(s) == '\r') {
+- if (sb->buf[sb->cur] == '\n')
+- Strcat_char(s, (char)sb->buf[sb->cur++]);
+- return s;
++ if (crnl && gb->length > 0 && gb->ptr[gb->length - 1] == '\r') {
++ if (sb->buf[sb->cur] == '\n') {
++ GROWBUF_ADD_CHAR(gb, '\n');
++ ++sb->cur;
+ }
+- for (i = sb->cur;
+- i < sb->next && sb->buf[i] != '\n' && sb->buf[i] != '\r';
+- i++) ;
+- if (i < sb->next) {
+- len = i - sb->cur + 1;
+- if (s == NULL)
+- s = Strnew_size(len + MARGIN_STR_SIZE);
+- Strcat_charp_n(s, (char *)&sb->buf[sb->cur], len);
+- sb->cur = i + 1;
+- if (sb->buf[i] == '\n')
+- return s;
+- }
+- else {
+- if (s == NULL)
+- s = Strnew_size(sb->next - sb->cur + MARGIN_STR_SIZE);
+- Strcat_charp_n(s, (char *)&sb->buf[sb->cur],
+- sb->next - sb->cur);
+- sb->cur = sb->next;
++ break;
++ }
++ for (i = sb->cur; i < sb->next; ++i) {
++ if (sb->buf[i] == '\n' || (crnl && sb->buf[i] == '\r')) {
++ ++i;
++ break;
+ }
+ }
++ growbuf_append(gb, &sb->buf[sb->cur], i - sb->cur);
++ sb->cur = i;
++ if (gb->length > 0 && gb->ptr[gb->length - 1] == '\n')
++ break;
+ }
+
+- if (s == NULL)
+- return Strnew();
+- return s;
++ growbuf_reserve(gb, gb->length + 1);
++ gb->ptr[gb->length] = '\0';
++ return;
+ }
+
++#ifdef unused
+ int
+ ISread(InputStream stream, Str buf, int count)
+ {
+- int rest, len;
++ int len;
++
++ if (count + 1 > buf->area_size) {
++ char *newptr = GC_MALLOC_ATOMIC(count + 1);
++ memcpy(newptr, buf->ptr, buf->length);
++ newptr[buf->length] = '\0';
++ buf->ptr = newptr;
++ buf->area_size = count + 1;
++ }
++ len = ISread_n(stream, buf->ptr, count);
++ buf->length = (len > 0) ? len : 0;
++ buf->ptr[buf->length] = '\0';
++ return (len > 0) ? 1 : 0;
++}
++#endif
++
++int
++ISread_n(InputStream stream, char *dst, int count)
++{
++ int len, l;
+ BaseStream base;
+
+- if (stream == NULL || (base = &stream->base)->iseos)
++ if (stream == NULL || count <= 0)
++ return -1;
++ if ((base = &stream->base)->iseos)
+ return 0;
+
+- len = buffer_read(&base->stream, buf->ptr, count);
+- rest = count - len;
++ len = buffer_read(&base->stream, dst, count);
+ if (MUST_BE_UPDATED(base)) {
+- len = base->read(base->handle, &buf->ptr[len], rest);
+- if (len <= 0) {
++ l = (*base->read) (base->handle, &dst[len], count - len);
++ if (l <= 0) {
+ base->iseos = TRUE;
+- len = 0;
++ } else {
++ len += l;
+ }
+- rest -= len;
+ }
+- Strtruncate(buf, count - rest);
+- if (buf->length > 0)
+- return 1;
+- return 0;
++ return len;
+ }
+
+ int
+@@ -496,8 +475,6 @@ ssl_check_cert_ident(X509 * x, char *hostname)
+ /* FIXME: gettextize? */
+ ret = Sprintf("Bad cert ident %s from %s", buf, hostname);
+ }
+- else
+- match_ident = TRUE;
+ }
+ return ret;
+ }
+@@ -645,6 +622,7 @@ basic_close(int *handle)
+ #else
+ close(*(int *)handle);
+ #endif
++ xfree(handle);
+ }
+
+ static int
+@@ -658,13 +636,14 @@ basic_read(int *handle, char *buf, int len)
+ }
+
+ static void
+-file_close(struct file_handle *handle)
++file_close(struct io_file_handle *handle)
+ {
+ handle->close(handle->f);
++ xfree(handle);
+ }
+
+ static int
+-file_read(struct file_handle *handle, char *buf, int len)
++file_read(struct io_file_handle *handle, char *buf, int len)
+ {
+ return fread(buf, 1, len, handle->f);
+ }
+@@ -682,6 +661,7 @@ ssl_close(struct ssl_handle *handle)
+ close(handle->sock);
+ if (handle->ssl)
+ SSL_free(handle->ssl);
++ xfree(handle);
+ }
+
+ static int
+@@ -717,38 +697,60 @@ static void
+ ens_close(struct ens_handle *handle)
+ {
+ ISclose(handle->is);
++ growbuf_clear(&handle->gb);
++ xfree(handle);
+ }
+
+ static int
+ ens_read(struct ens_handle *handle, char *buf, int len)
+ {
+- if (handle->s == NULL || handle->pos == handle->s->length) {
++ if (handle->pos == handle->gb.length) {
+ char *p;
+- handle->s = StrmyISgets(handle->is);
+- if (handle->s->length == 0)
++ struct growbuf gbtmp;
++
++ ISgets_to_growbuf(handle->is, &handle->gb, TRUE);
++ if (handle->gb.length == 0)
+ return 0;
+- cleanup_line(handle->s, PAGER_MODE);
+ if (handle->encoding == ENC_BASE64)
+- Strchop(handle->s);
++ memchop(handle->gb.ptr, &handle->gb.length);
+ else if (handle->encoding == ENC_UUENCODE) {
+- if (!strncmp(handle->s->ptr, "begin", 5))
+- handle->s = StrmyISgets(handle->is);
+- Strchop(handle->s);
++ if (handle->gb.length >= 5 &&
++ !strncmp(handle->gb.ptr, "begin", 5))
++ ISgets_to_growbuf(handle->is, &handle->gb, TRUE);
++ memchop(handle->gb.ptr, &handle->gb.length);
+ }
+- p = handle->s->ptr;
++ growbuf_init_without_GC(&gbtmp);
++ p = handle->gb.ptr;
+ if (handle->encoding == ENC_QUOTE)
+- handle->s = decodeQP(&p);
++ decodeQP_to_growbuf(&gbtmp, &p);
+ else if (handle->encoding == ENC_BASE64)
+- handle->s = decodeB(&p);
++ decodeB_to_growbuf(&gbtmp, &p);
+ else if (handle->encoding == ENC_UUENCODE)
+- handle->s = decodeU(&p);
++ decodeU_to_growbuf(&gbtmp, &p);
++ growbuf_clear(&handle->gb);
++ handle->gb = gbtmp;
+ handle->pos = 0;
+ }
+
+- if (len > handle->s->length - handle->pos)
+- len = handle->s->length - handle->pos;
++ if (len > handle->gb.length - handle->pos)
++ len = handle->gb.length - handle->pos;
+
+- bcopy(&handle->s->ptr[handle->pos], buf, len);
++ memcpy(buf, &handle->gb.ptr[handle->pos], len);
+ handle->pos += len;
+ return len;
+ }
++
++static void
++memchop(char *p, int *len)
++{
++ char *q;
++
++ for (q = p + *len; q > p; --q) {
++ if (q[-1] != '\n' && q[-1] != '\r')
++ break;
++ }
++ if (q != p + *len)
++ *q = '\0';
++ *len = q - p;
++ return;
++}
+diff --git a/istream.h b/istream.h
+index a220d8b..5a04be0 100644
+--- a/istream.h
++++ b/istream.h
+@@ -2,13 +2,13 @@
+ #ifndef IO_STREAM_H
+ #define IO_STREAM_H
+
++#include "indep.h"
+ #include <stdio.h>
+ #ifdef USE_SSL
+ #include <openssl/bio.h>
+ #include <openssl/x509.h>
+ #include <openssl/ssl.h>
+ #endif
+-#include "Str.h"
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <fcntl.h>
+@@ -20,7 +20,7 @@ struct stream_buffer {
+
+ typedef struct stream_buffer *StreamBuffer;
+
+-struct file_handle {
++struct io_file_handle {
+ FILE *f;
+ void (*close) ();
+ };
+@@ -36,7 +36,7 @@ union input_stream;
+
+ struct ens_handle {
+ union input_stream *is;
+- Str s;
++ struct growbuf gb;
+ int pos;
+ char encoding;
+ };
+@@ -53,7 +53,7 @@ struct base_stream {
+
+ struct file_stream {
+ struct stream_buffer stream;
+- struct file_handle *handle;
++ struct io_file_handle *handle;
+ char type;
+ char iseos;
+ int (*read) ();
+@@ -119,9 +119,14 @@ extern InputStream newEncodedStream(InputStream is, char encoding);
+ extern int ISclose(InputStream stream);
+ extern int ISgetc(InputStream stream);
+ extern int ISundogetc(InputStream stream);
+-extern Str StrISgets(InputStream stream);
+-extern Str StrmyISgets(InputStream stream);
++extern Str StrISgets2(InputStream stream, char crnl);
++#define StrISgets(stream) StrISgets2(stream, FALSE)
++#define StrmyISgets(stream) StrISgets2(stream, TRUE)
++void ISgets_to_growbuf(InputStream stream, struct growbuf *gb, char crnl);
++#ifdef unused
+ extern int ISread(InputStream stream, Str buf, int count);
++#endif
++int ISread_n(InputStream stream, char *dst, int bufsize);
+ extern int ISfileno(InputStream stream);
+ extern int ISeos(InputStream stream);
+ #ifdef USE_SSL
+diff --git a/keybind.c b/keybind.c
+index a490962..fec0c65 100644
+--- a/keybind.c
++++ b/keybind.c
+@@ -91,7 +91,7 @@ unsigned char EscBKeymap[128] = {
+ /* 0 1 2 3 4 5 6 7 */
+ nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd,
+ /* 8 9 : ; < = > ? */
+- nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd,
++ nulcmd, nulcmd, nulcmd, nulcmd, sgrmouse, nulcmd, nulcmd, nulcmd,
+ /* @ A B C D E F G */
+ nulcmd, movU, movD, movR, movL, nulcmd, goLineL, pgFore,
+ /* H I J K L M N O */
+diff --git a/keybind_lynx.c b/keybind_lynx.c
+index 163f6b2..42267ec 100644
+--- a/keybind_lynx.c
++++ b/keybind_lynx.c
+@@ -99,7 +99,7 @@ unsigned char EscBKeymap[128] = {
+ /* 0 1 2 3 4 5 6 7 */
+ nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd,
+ /* 8 9 : ; < = > ? */
+- nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd, nulcmd,
++ nulcmd, nulcmd, nulcmd, nulcmd, sgrmouse, nulcmd, nulcmd, nulcmd,
+ /* @ A B C D E F G */
+ nulcmd, prevA, nextA, followA, backBf, nulcmd, goLineL, pgFore,
+ /* H I J K L M N O */
+diff --git a/libwc/ambwidth_map.awk b/libwc/ambwidth_map.awk
+index 8544f58..1d9d25f 100644
+--- a/libwc/ambwidth_map.awk
++++ b/libwc/ambwidth_map.awk
+@@ -3,9 +3,15 @@ BEGIN {
+ i = 0;
+ }
+ $2 == "A" {
+- code = sprintf("0x%s", $1);
+- if (strtonum(code) < 0x10000) {
+- map[i] = code
++ code = code2 = strtonum(sprintf("0x%s", $1))
++ if (match($1, /[.]+[0-9A-Fa-f]+/)) {
++ s = substr($1, RSTART, RLENGTH)
++ sub(/[.]+/, "0x", s)
++ code2 = strtonum(s)
++ }
++ for (; code <= code2; code++) {
++ if (code >= 0x10000) { break }
++ map[i] = sprintf("0x%04X", code)
+ i++;
+ }
+ }
+@@ -15,28 +21,14 @@ END {
+ prev = strtonum(map[0]);
+ for (j = 1; j < i; j++) {
+ cur = strtonum(map[j]);
+- if (match(map[j], "[.]+")) {
++ if (cur - prev > 1) {
+ map2[n] = sprintf("%s, %s", start, map[j - 1]);
+ n++;
+- gsub("[.]+", ", 0x", map[j])
+- map2[n] = map[j];
+- n++;
+- start = map[j + 1];
+- cur = strtonum(start);
+- } else {
+- if (cur - prev > 2) {
+- map2[n] = sprintf("%s, %s", start, map[j - 1]);
+- start = map[j];
+- n++;
+- }
+-
+- if (j == i - 1) {
+- map2[n] = sprintf("%s, %s", start, map[j]);
+- n++;
+- }
++ start = map[j];
+ }
+ prev = cur;
+ }
++ if (i > 0) { map2[n] = sprintf("%s, %s", start, map[i - 1]); n++ }
+
+ printf("static wc_map ucs_ambwidth_map[] = {\n");
+ for (j = 0; j < n; j++) {
+diff --git a/libwc/charset.c b/libwc/charset.c
+index 3f0b74d..ea79b1c 100644
+--- a/libwc/charset.c
++++ b/libwc/charset.c
+@@ -1,8 +1,7 @@
+
+ #include <stdlib.h>
+ #include <ctype.h>
+-#include <gc.h>
+-#define New_N(type,n) ((type*)GC_MALLOC((n)*sizeof(type)))
++#include "../alloc.h"
+
+ #include "wc.h"
+
+diff --git a/libwc/gb18030.c b/libwc/gb18030.c
+index c195d49..d5c9018 100644
+--- a/libwc/gb18030.c
++++ b/libwc/gb18030.c
+@@ -151,6 +151,7 @@ wc_ucs_to_gb18030(wc_uint32 ucs)
+ return cc;
+ }
+ cc.ccs = WC_CCS_UNKNOWN;
++ cc.code = 0;
+ return cc;
+ }
+ #endif
+diff --git a/libwc/iso2022.c b/libwc/iso2022.c
+index 33d9a19..a191f28 100644
+--- a/libwc/iso2022.c
++++ b/libwc/iso2022.c
+@@ -405,7 +405,8 @@ wc_push_to_iso2022(Str os, wc_wchar_t cc, wc_status *st)
+ case WC_CCS_A_CS94:
+ if (cc.ccs == WC_CCS_US_ASCII)
+ cc.ccs = st->g0_ccs;
+- g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
++ if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE)
++ g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
+ break;
+ case WC_CCS_A_CS94W:
+ is_wide = 1;
+@@ -435,35 +436,41 @@ wc_push_to_iso2022(Str os, wc_wchar_t cc, wc_status *st)
+ break;
+ #endif
+ }
+- g = cs94w_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
++ if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE)
++ g = cs94w_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
+ break;
+ case WC_CCS_A_CS96:
+- g = cs96_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
++ if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE)
++ g = cs96_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
+ break;
+ case WC_CCS_A_CS96W:
+ is_wide = 1;
+- g = cs96w_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
++ if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE)
++ g = cs96w_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
+ break;
+ case WC_CCS_A_CS942:
+- g = cs942_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
++ if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE)
++ g = cs942_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
+ break;
+ case WC_CCS_A_UNKNOWN_W:
+ if (WcOption.no_replace)
+ return;
+ is_wide = 1;
+ cc.ccs = WC_CCS_US_ASCII;
+- g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
++ if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE)
++ g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
+ cc.code = ((wc_uint32)WC_REPLACE_W[0] << 8) | WC_REPLACE_W[1];
+ break;
+ case WC_CCS_A_UNKNOWN:
+ if (WcOption.no_replace)
+ return;
+ cc.ccs = WC_CCS_US_ASCII;
+- g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
++ if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE)
++ g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
+ cc.code = (wc_uint32)WC_REPLACE[0];
+ break;
+ default:
+- if ((cc.ccs == WC_CCS_JOHAB || WC_CCS_JOHAB_1 ||
++ if ((cc.ccs == WC_CCS_JOHAB || cc.ccs == WC_CCS_JOHAB_1 ||
+ cc.ccs == WC_CCS_JOHAB_2 || cc.ccs == WC_CCS_JOHAB_3) &&
+ cs94w_gmap[WC_F_KS_X_1001 - WC_F_ISO_BASE]) {
+ wc_wchar_t cc2 = wc_johab_to_ksx1001(cc);
+diff --git a/libwc/johab.c b/libwc/johab.c
+index 8d587b8..498b1bb 100644
+--- a/libwc/johab.c
++++ b/libwc/johab.c
+@@ -160,9 +160,9 @@ wc_N_to_johab1(wc_uint32 code)
+ {
+ wc_uint32 a, b, c;
+
+- a = N_johab1_map[0][(code / 28) / 21];
+- b = N_johab1_map[1][(code / 28) % 21];
+- c = N_johab1_map[2][ code % 28 ];
++ a = N_johab1_map[0][(code / 28) / 21 & 0x1F];
++ b = N_johab1_map[1][(code / 28) % 21 & 0x1F];
++ c = N_johab1_map[2][ code % 28 & 0x1F];
+ return 0x8000 | (a << 10) | (b << 5) | c;
+ }
+
+diff --git a/libwc/map/big5_ucs.map b/libwc/map/big5_ucs.map
+index 0c6fd12..ac817a9 100644
+--- a/libwc/map/big5_ucs.map
++++ b/libwc/map/big5_ucs.map
+@@ -1,6 +1,8 @@
+ /* Big5 (Chinese Taiwan) */
+
+-static wc_uint16 big5_ucs_map[ 0x59 * 0x9D ] = {
++#define N_big5_ucs_map (0x59 * 0x9D)
++
++static wc_uint16 big5_ucs_map[ N_big5_ucs_map ] = {
+ 0x3000, /* 0xA140 */
+ 0xFF0C, /* 0xA141 */
+ 0x3001, /* 0xA142 */
+diff --git a/libwc/map/cns11643_ucs.map b/libwc/map/cns11643_ucs.map
+index b426dd3..fcba334 100644
+--- a/libwc/map/cns11643_ucs.map
++++ b/libwc/map/cns11643_ucs.map
+@@ -1,6 +1,8 @@
+ /* CNS 11643 (Chinese Taiwan) */
+
+-static wc_uint16 cns116431_ucs_map[ 0x5E * 0x5E ] = {
++#define N_cns116431_ucs_map (0x5E * 0x5E)
++
++static wc_uint16 cns116431_ucs_map[ N_cns116431_ucs_map ] = {
+ 0x3000, /* 0x2121 */
+ 0xFF0C, /* 0x2122 */
+ 0x3001, /* 0x2123 */
+@@ -8839,7 +8841,9 @@ static wc_uint16 cns116431_ucs_map[ 0x5E * 0x5E ] = {
+ 0, /* 0x7E7E */
+ };
+
+-static wc_uint16 cns116432_ucs_map[ 0x5E * 0x5E ] = {
++#define N_cns116432_ucs_map (0x5E * 0x5E)
++
++static wc_uint16 cns116432_ucs_map[ N_cns116432_ucs_map ] = {
+ 0x4E42, /* 0x2121 */
+ 0x4E5C, /* 0x2122 */
+ 0x51F5, /* 0x2123 */
+diff --git a/libwc/map/gb12345_ucs.map b/libwc/map/gb12345_ucs.map
+index 55558c7..3fb338d 100644
+--- a/libwc/map/gb12345_ucs.map
++++ b/libwc/map/gb12345_ucs.map
+@@ -1,6 +1,8 @@
+ /* GB 12345 (Chinese) */
+
+-static wc_uint16 gb12345_ucs_map[ 0x5E * 0x5E ] = {
++#define N_gb12345_ucs_map (0x5E * 0x5E)
++
++static wc_uint16 gb12345_ucs_map[ N_gb12345_ucs_map ] = {
+ 0x3000, /* 0x2121 */
+ 0x3001, /* 0x2122 */
+ 0x3002, /* 0x2123 */
+diff --git a/libwc/map/gb2312_ucs.map b/libwc/map/gb2312_ucs.map
+index 38fb88f..3d37465 100644
+--- a/libwc/map/gb2312_ucs.map
++++ b/libwc/map/gb2312_ucs.map
+@@ -1,6 +1,8 @@
+ /* GB 2312 (Chinese) */
+
+-static wc_uint16 gb2312_ucs_map[ 0x5E * 0x5E ] = {
++#define N_gb2312_ucs_map (0x5E * 0x5E)
++
++static wc_uint16 gb2312_ucs_map[ N_gb2312_ucs_map ] = {
+ 0x3000, /* 0x2121 */
+ 0x3001, /* 0x2122 */
+ 0x3002, /* 0x2123 */
+diff --git a/libwc/map/gbk_ucs.map b/libwc/map/gbk_ucs.map
+index 5a0d5ba..d092fd7 100644
+--- a/libwc/map/gbk_ucs.map
++++ b/libwc/map/gbk_ucs.map
+@@ -6,7 +6,9 @@ static wc_map ucs_gbk_80_map[ N_ucs_gbk_80_map ] = {
+ { 0x20AC, 0x0080 },
+ };
+
+-static wc_uint16 gbk_ucs_map[ 0x7E * 0xBE - 0x5E * 0x5E + 0x0A + 0x16 + 0x06 ] = {
++#define N_gbk_ucs_map (0x7E * 0xBE - 0x5E * 0x5E + 0x0A + 0x16 + 0x06)
++
++static wc_uint16 gbk_ucs_map[ N_gbk_ucs_map ] = {
+ 0x4E02, /* 0x8140 */
+ 0x4E04, /* 0x8141 */
+ 0x4E05, /* 0x8142 */
+diff --git a/libwc/map/hkscs_ucs.map b/libwc/map/hkscs_ucs.map
+index 96d1566..2fbe6b4 100644
+--- a/libwc/map/hkscs_ucs.map
++++ b/libwc/map/hkscs_ucs.map
+@@ -1,6 +1,8 @@
+ /* HKSCS (Chinese Hong Kong) */
+
+-static wc_uint16 hkscs_ucs_map[ 0x1E * 0x9D ] = {
++#define N_hkscs_ucs_map (0x1E * 0x9D)
++
++static wc_uint16 hkscs_ucs_map[ N_hkscs_ucs_map ] = {
+ 0, /* 0x8840 */
+ 0, /* 0x8841 */
+ 0, /* 0x8842 */
+diff --git a/libwc/map/jisx0208x0212x0213_ucs.map b/libwc/map/jisx0208x0212x0213_ucs.map
+index 1a1d706..28c2a6c 100644
+--- a/libwc/map/jisx0208x0212x0213_ucs.map
++++ b/libwc/map/jisx0208x0212x0213_ucs.map
+@@ -1,6 +1,8 @@
+ /* JIS X 0208, JIS X 0212, JIS X 0213 (Japanese) */
+
+-static wc_uint16 jisx0208x02131_ucs_map[ 0x5E * 0x5E ] = {
++#define N_jisx0208x02131_ucs_map (0x5E * 0x5E)
++
++static wc_uint16 jisx0208x02131_ucs_map[ N_jisx0208x02131_ucs_map ] = {
+ 0x3000, /* JIS X 0208 0x2121 */
+ 0x3001, /* JIS X 0208 0x2122 */
+ 0x3002, /* JIS X 0208 0x2123 */
+@@ -8839,7 +8841,9 @@ static wc_uint16 jisx0208x02131_ucs_map[ 0x5E * 0x5E ] = {
+ 0, /* JIS X 0213-1 0x7E7E */
+ };
+
+-static wc_uint16 jisx0212x02132_ucs_map[ 0x5E * 0x5E ] = {
++#define N_jisx0212x02132_ucs_map (0x5E * 0x5E)
++
++static wc_uint16 jisx0212x02132_ucs_map[ N_jisx0212x02132_ucs_map ] = {
+ 0, /* JIS X 0213-2 0x2121 */
+ 0x4E02, /* JIS X 0213-2 0x2122 */
+ 0x4E0F, /* JIS X 0213-2 0x2123 */
+diff --git a/libwc/map/ksx1001_ucs.map b/libwc/map/ksx1001_ucs.map
+index 9a17d61..cb62f98 100644
+--- a/libwc/map/ksx1001_ucs.map
++++ b/libwc/map/ksx1001_ucs.map
+@@ -1,6 +1,8 @@
+ /* KS X 1001 (Korean) */
+
+-static wc_uint16 ksx1001_ucs_map[ 0x5E * 0x5E ] = {
++#define N_ksx1001_ucs_map (0x5E * 0x5E)
++
++static wc_uint16 ksx1001_ucs_map[ N_ksx1001_ucs_map ] = {
+ 0x3000, /* 0x2121 */
+ 0x3001, /* 0x2122 */
+ 0x3002, /* 0x2123 */
+diff --git a/libwc/map/sjis_ext_ucs.map b/libwc/map/sjis_ext_ucs.map
+index a82995c..cc748ba 100644
+--- a/libwc/map/sjis_ext_ucs.map
++++ b/libwc/map/sjis_ext_ucs.map
+@@ -1,6 +1,8 @@
+ /* Shift_JIS/CP932 (Japanese) */
+
+-static wc_uint16 sjis_ext_ucs_map[ 0x5E * 10 ] = {
++#define N_sjis_ext_ucs_map (0x5E * 10)
++
++static wc_uint16 sjis_ext_ucs_map[ N_sjis_ext_ucs_map ] = {
+ 0x2460, /* 0x8740 */
+ 0x2461, /* 0x8741 */
+ 0x2462, /* 0x8742 */
+diff --git a/libwc/map/ucs_ambwidth.map b/libwc/map/ucs_ambwidth.map
+index 6f03ba8..35ceedb 100644
+--- a/libwc/map/ucs_ambwidth.map
++++ b/libwc/map/ucs_ambwidth.map
+@@ -1,50 +1,82 @@
+ static wc_map ucs_ambwidth_map[] = {
+ { 0x00A1, 0x00A1 },
+ { 0x00A4, 0x00A4 },
+- { 0x00A7, 0x00AA },
+- { 0x00AD, 0x00BF },
++ { 0x00A7, 0x00A8 },
++ { 0x00AA, 0x00AA },
++ { 0x00AD, 0x00AE },
++ { 0x00B0, 0x00B4 },
++ { 0x00B6, 0x00BA },
++ { 0x00BC, 0x00BF },
+ { 0x00C6, 0x00C6 },
+ { 0x00D0, 0x00D0 },
+ { 0x00D7, 0x00D8 },
+ { 0x00DE, 0x00E1 },
+- { 0x00E6, 0x00ED },
+- { 0x00F0, 0x00F3 },
+- { 0x00F7, 0x00FE },
++ { 0x00E6, 0x00E6 },
++ { 0x00E8, 0x00EA },
++ { 0x00EC, 0x00ED },
++ { 0x00F0, 0x00F0 },
++ { 0x00F2, 0x00F3 },
++ { 0x00F7, 0x00FA },
++ { 0x00FC, 0x00FC },
++ { 0x00FE, 0x00FE },
+ { 0x0101, 0x0101 },
+- { 0x0111, 0x0113 },
++ { 0x0111, 0x0111 },
++ { 0x0113, 0x0113 },
+ { 0x011B, 0x011B },
+ { 0x0126, 0x0127 },
+ { 0x012B, 0x012B },
+ { 0x0131, 0x0133 },
+ { 0x0138, 0x0138 },
+- { 0x013F, 0x0144 },
+- { 0x0148, 0x014D },
++ { 0x013F, 0x0142 },
++ { 0x0144, 0x0144 },
++ { 0x0148, 0x014B },
++ { 0x014D, 0x014D },
+ { 0x0152, 0x0153 },
+ { 0x0166, 0x0167 },
+ { 0x016B, 0x016B },
+- { 0x01CE, 0x01DC },
++ { 0x01CE, 0x01CE },
++ { 0x01D0, 0x01D0 },
++ { 0x01D2, 0x01D2 },
++ { 0x01D4, 0x01D4 },
++ { 0x01D6, 0x01D6 },
++ { 0x01D8, 0x01D8 },
++ { 0x01DA, 0x01DA },
++ { 0x01DC, 0x01DC },
+ { 0x0251, 0x0251 },
+ { 0x0261, 0x0261 },
+ { 0x02C4, 0x02C4 },
+- { 0x02C7, 0x02CD },
++ { 0x02C7, 0x02C7 },
++ { 0x02C9, 0x02CB },
++ { 0x02CD, 0x02CD },
+ { 0x02D0, 0x02D0 },
+- { 0x02D8, 0x02DF },
++ { 0x02D8, 0x02DB },
++ { 0x02DD, 0x02DD },
++ { 0x02DF, 0x02DF },
+ { 0x0300, 0x036F },
+- { 0x0391, 0x03A9 },
+- { 0x03B1, 0x03C9 },
++ { 0x0391, 0x03A1 },
++ { 0x03A3, 0x03A9 },
++ { 0x03B1, 0x03C1 },
++ { 0x03C3, 0x03C9 },
+ { 0x0401, 0x0401 },
+- { 0x0410, 0x0451 },
++ { 0x0410, 0x044F },
++ { 0x0451, 0x0451 },
+ { 0x2010, 0x2010 },
+- { 0x2013, 0x2019 },
++ { 0x2013, 0x2016 },
++ { 0x2018, 0x2019 },
+ { 0x201C, 0x201D },
+- { 0x2020, 0x2027 },
+- { 0x2030, 0x2035 },
++ { 0x2020, 0x2022 },
++ { 0x2024, 0x2027 },
++ { 0x2030, 0x2030 },
++ { 0x2032, 0x2033 },
++ { 0x2035, 0x2035 },
+ { 0x203B, 0x203B },
+ { 0x203E, 0x203E },
+ { 0x2074, 0x2074 },
+- { 0x207F, 0x2084 },
++ { 0x207F, 0x207F },
++ { 0x2081, 0x2084 },
+ { 0x20AC, 0x20AC },
+- { 0x2103, 0x2105 },
++ { 0x2103, 0x2103 },
++ { 0x2105, 0x2105 },
+ { 0x2109, 0x2109 },
+ { 0x2113, 0x2113 },
+ { 0x2116, 0x2116 },
+@@ -52,21 +84,28 @@ static wc_map ucs_ambwidth_map[] = {
+ { 0x2126, 0x2126 },
+ { 0x212B, 0x212B },
+ { 0x2153, 0x2154 },
+- { 0x215B, 0x216B },
++ { 0x215B, 0x215E },
++ { 0x2160, 0x216B },
+ { 0x2170, 0x2179 },
+ { 0x2189, 0x2189 },
+ { 0x2190, 0x2199 },
+ { 0x21B8, 0x21B9 },
+- { 0x21D2, 0x21D4 },
++ { 0x21D2, 0x21D2 },
++ { 0x21D4, 0x21D4 },
+ { 0x21E7, 0x21E7 },
+- { 0x2200, 0x2203 },
++ { 0x2200, 0x2200 },
++ { 0x2202, 0x2203 },
+ { 0x2207, 0x2208 },
+ { 0x220B, 0x220B },
+- { 0x220F, 0x2211 },
++ { 0x220F, 0x220F },
++ { 0x2211, 0x2211 },
+ { 0x2215, 0x2215 },
+ { 0x221A, 0x221A },
+ { 0x221D, 0x2220 },
+- { 0x2223, 0x222E },
++ { 0x2223, 0x2223 },
++ { 0x2225, 0x2225 },
++ { 0x2227, 0x222C },
++ { 0x222E, 0x222E },
+ { 0x2234, 0x2237 },
+ { 0x223C, 0x223D },
+ { 0x2248, 0x2248 },
+@@ -83,11 +122,13 @@ static wc_map ucs_ambwidth_map[] = {
+ { 0x22A5, 0x22A5 },
+ { 0x22BF, 0x22BF },
+ { 0x2312, 0x2312 },
+- { 0x2460, 0x254B },
++ { 0x2460, 0x24E9 },
++ { 0x24EB, 0x254B },
+ { 0x2550, 0x2573 },
+ { 0x2580, 0x258F },
+ { 0x2592, 0x2595 },
+- { 0x25A0, 0x25A9 },
++ { 0x25A0, 0x25A1 },
++ { 0x25A3, 0x25A9 },
+ { 0x25B2, 0x25B3 },
+ { 0x25B6, 0x25B7 },
+ { 0x25BC, 0x25BD },
+@@ -101,12 +142,20 @@ static wc_map ucs_ambwidth_map[] = {
+ { 0x2609, 0x2609 },
+ { 0x260E, 0x260F },
+ { 0x2614, 0x2615 },
+- { 0x261C, 0x261E },
+- { 0x2640, 0x2642 },
+- { 0x2660, 0x266F },
++ { 0x261C, 0x261C },
++ { 0x261E, 0x261E },
++ { 0x2640, 0x2640 },
++ { 0x2642, 0x2642 },
++ { 0x2660, 0x2661 },
++ { 0x2663, 0x2665 },
++ { 0x2667, 0x266A },
++ { 0x266C, 0x266D },
++ { 0x266F, 0x266F },
+ { 0x269E, 0x269F },
+ { 0x26BE, 0x26BF },
+- { 0x26C4, 0x26E3 },
++ { 0x26C4, 0x26CD },
++ { 0x26CF, 0x26E1 },
++ { 0x26E3, 0x26E3 },
+ { 0x26E8, 0x26FF },
+ { 0x273D, 0x273D },
+ { 0x2757, 0x2757 },
+diff --git a/libwc/map/uhc_ucs.map b/libwc/map/uhc_ucs.map
+index b6b43ca..55efc09 100644
+--- a/libwc/map/uhc_ucs.map
++++ b/libwc/map/uhc_ucs.map
+@@ -1,6 +1,8 @@
+ /* UHC/CP949 (Korean) */
+
+-static wc_uint16 uhc_ucs_map[ 0x20 * 0xB2 + 0x27 * 0x54 + 2 ] = {
++#define N_uhc_ucs_map (0x20 * 0xB2 + 0x27 * 0x54 + 2)
++
++static wc_uint16 uhc_ucs_map[ N_uhc_ucs_map ] = {
+ 0xAC02, /* 0x8141 */
+ 0xAC03, /* 0x8142 */
+ 0xAC05, /* 0x8143 */
+diff --git a/libwc/status.c b/libwc/status.c
+index d25c924..4a2ebf8 100644
+--- a/libwc/status.c
++++ b/libwc/status.c
+@@ -1,7 +1,6 @@
+
+ #include <string.h>
+-#include <gc.h>
+-#define New_N(type,n) ((type*)GC_MALLOC((n)*sizeof(type)))
++#include "../alloc.h"
+
+ #include "wc.h"
+ #ifdef USE_UNICODE
+diff --git a/libwc/ucs.c b/libwc/ucs.c
+index d7b6948..727e574 100644
+--- a/libwc/ucs.c
++++ b/libwc/ucs.c
+@@ -100,6 +100,7 @@ wc_ucs_to_any(wc_uint32 ucs, wc_table *t)
+ return t->conv(t->ccs, map->code2);
+ }
+ cc.ccs = WC_CCS_UNKNOWN;
++ cc.code = 0;
+ return cc;
+ }
+
+@@ -108,6 +109,7 @@ wc_any_to_ucs(wc_wchar_t cc)
+ {
+ int f;
+ wc_uint16 *map = NULL;
++ wc_uint32 map_size = 0x80;
+ wc_map *map2;
+
+ f = WC_CCS_INDEX(cc.ccs);
+@@ -138,6 +140,7 @@ wc_any_to_ucs(wc_wchar_t cc)
+ if (f < WC_F_ISO_BASE || f > WC_F_CS94W_END)
+ return 0;
+ map = cs94w_ucs_map[f - WC_F_ISO_BASE];
++ map_size = cs94w_ucs_map_size[f - WC_F_ISO_BASE];
+ cc.code = WC_CS94W_N(cc.code);
+ break;
+ case WC_CCS_A_CS96:
+@@ -150,6 +153,7 @@ wc_any_to_ucs(wc_wchar_t cc)
+ if (f < WC_F_ISO_BASE || f > WC_F_CS96W_END)
+ return WC_C_UCS4_ERROR;
+ map = cs96w_ucs_map[f - WC_F_ISO_BASE];
++ map_size = cs96w_ucs_map_size[f - WC_F_ISO_BASE];
+ cc.code = WC_CS96W_N(cc.code);
+ break;
+ case WC_CCS_A_CS942:
+@@ -180,6 +184,7 @@ wc_any_to_ucs(wc_wchar_t cc)
+ if (f < WC_F_PCS_BASE || f > WC_F_PCSW_END)
+ return WC_C_UCS4_ERROR;
+ map = pcsw_ucs_map[f - WC_F_PCS_BASE];
++ map_size = pcsw_ucs_map_size[f - WC_F_PCS_BASE];
+ switch (cc.ccs) {
+ case WC_CCS_BIG5:
+ cc.code = WC_BIG5_N(cc.code);
+@@ -271,6 +276,8 @@ wc_any_to_ucs(wc_wchar_t cc)
+ }
+ if (map == NULL)
+ return WC_C_UCS4_ERROR;
++ if (map_size == 0 || cc.code > map_size - 1)
++ return WC_C_UCS4_ERROR;
+ cc.code = map[cc.code];
+ return cc.code ? cc.code : WC_C_UCS4_ERROR;
+ }
+diff --git a/libwc/ucs.map b/libwc/ucs.map
+index dfac6d9..5d6f688 100644
+--- a/libwc/ucs.map
++++ b/libwc/ucs.map
+@@ -195,7 +195,28 @@ static wc_uint16 *cs94w_ucs_map[] = {
+ jisx0212x02132_ucs_map, /* 50 (JIS X 0213-2) */
+ };
+
++static wc_uint32 cs94w_ucs_map_size[] = {
++ N_jisx0208x02131_ucs_map, /* 40 (JIS C 6226) */
++ N_gb2312_ucs_map, /* 41 (GB 2312) */
++ N_jisx0208x02131_ucs_map, /* 42 (JIS X 0208) */
++ N_ksx1001_ucs_map, /* 43 (KS X 1001) */
++ N_jisx0212x02132_ucs_map, /* 44 (JIS X 0212) */
++ 0, /* 45 (ISO IR 165) */
++ 0, /* 46 */
++ N_cns116431_ucs_map, /* 47 (CNS 11643-1) */
++ N_cns116432_ucs_map, /* 48 (CNS 11643-2) */
++ 0, /* 49 (CNS 11643-3) */
++ 0, /* 4A (CNS 11643-4) */
++ 0, /* 4B (CNS 11643-5) */
++ 0, /* 4C (CNS 11643-6) */
++ 0, /* 4D (CNS 11643-7) */
++ 0, /* 4E (KSP 9566) */
++ N_jisx0208x02131_ucs_map, /* 4F (JIS X 0213-1) */
++ N_jisx0212x02132_ucs_map, /* 50 (JIS X 0213-2) */
++};
++
+ static wc_uint16 **cs96w_ucs_map;
++static wc_uint32 *cs96w_ucs_map_size;
+
+ static wc_uint16 *pcsw_ucs_map[] = {
+ big5_ucs_map, /* Big5 */
+@@ -233,6 +254,42 @@ static wc_uint16 *pcsw_ucs_map[] = {
+ hkscs_ucs_map, /* HKSCS-2 */
+ };
+
++static wc_uint32 pcsw_ucs_map_size[] = {
++ N_big5_ucs_map, /* Big5 */
++ N_big5_ucs_map, /* Big5-1 */
++ N_big5_ucs_map, /* Big5-2 */
++ 0, /* CNS 11643-8 */
++ 0, /* CNS 11643-9 */
++ 0, /* CNS 11643-10 */
++ 0, /* CNS 11643-11 */
++ 0, /* CNS 11643-12 */
++ 0, /* CNS 11643-13 */
++ 0, /* CNS 11643-14 */
++ 0, /* CNS 11643-15 */
++ 0, /* CNS 11643-16 */
++ 0, /* CNS 11643-X */
++ N_gb12345_ucs_map, /* GB 12345 */
++ 0, /* Johab (special conversion) */
++ 0, /* Johab-1 (special conversion) */
++ 0, /* Johab-2 (special conversion) */
++ N_ksx1001_ucs_map, /* Johab-3 */
++ N_sjis_ext_ucs_map, /* Shift_JIS(CP932) ext */
++ N_sjis_ext_ucs_map, /* Shift_JIS(CP932) ext-1 */
++ N_sjis_ext_ucs_map, /* Shift_JIS(CP932) ext-2 */
++ N_gbk_ucs_map, /* GBK(CP936) */
++ N_gbk_ucs_map, /* GBK(CP936)-1 */
++ N_gbk_ucs_map, /* GBK(CP936)-2 */
++ 0, /* GB18030 GBK-ext (special conversion) */
++ 0, /* GB18030 GBK-ext-1 (special conversion) */
++ 0, /* GB18030 GBK-ext-2 (special conversion) */
++ N_uhc_ucs_map, /* UHC(CP949) */
++ N_uhc_ucs_map, /* UHC(CP949)-1 */
++ N_uhc_ucs_map, /* UHC(CP949)-2 */
++ N_hkscs_ucs_map, /* HKSCS */
++ N_hkscs_ucs_map, /* HKSCS-1 */
++ N_hkscs_ucs_map, /* HKSCS-2 */
++};
++
+ static wc_wchar_t
+ ucs_cs94_conv(wc_ccs ccs, wc_uint16 c)
+ {
+diff --git a/linein.c b/linein.c
+index b7e81b6..d8f9023 100644
+--- a/linein.c
++++ b/linein.c
+@@ -714,7 +714,8 @@ _rdcompl(void)
+ static void
+ next_dcompl(int next)
+ {
+- static int col, row, len;
++ static int col, row;
++ static unsigned int len;
+ static Str d;
+ int i, j, n, y;
+ Str f;
+@@ -780,9 +781,10 @@ next_dcompl(int next)
+ if (len < n)
+ len = n;
+ }
+- col = COLS / len;
+- if (col == 0)
+- col = 1;
++ if (len > 0 && COLS > len)
++ col = COLS / len;
++ else
++ col = 1;
+ row = (NCFileBuf + col - 1) / col;
+
+ disp_next:
+@@ -1026,7 +1028,7 @@ _prev(void)
+ strCurrentBuf = strBuf;
+ }
+ if (DecodeURL && (cm_mode & CPL_URL) )
+- p = url_unquote_conv(p, 0);
++ p = url_decode2(p, NULL);
+ strBuf = Strnew_charp(p);
+ CLen = CPos = setStrType(strBuf, strProp);
+ offset = 0;
+@@ -1045,7 +1047,7 @@ _next(void)
+ p = nextHist(hist);
+ if (p) {
+ if (DecodeURL && (cm_mode & CPL_URL) )
+- p = url_unquote_conv(p, 0);
++ p = url_decode2(p, NULL);
+ strBuf = Strnew_charp(p);
+ }
+ else {
+diff --git a/local.c b/local.c
+index f5a73a2..46ac579 100644
+--- a/local.c
++++ b/local.c
+@@ -109,6 +109,7 @@ loadLocalDir(char *dname)
+ n++;
+ }
+ }
++ closedir(d);
+
+ if (multicolList) {
+ l = COLS / (maxlen + 2);
+@@ -167,7 +168,7 @@ loadLocalDir(char *dname)
+ else {
+ #if defined(HAVE_LSTAT) && defined(HAVE_READLINK)
+ if (S_ISLNK(lst.st_mode)) {
+- if ((l = readlink(fbuf->ptr, lbuf, sizeof(lbuf))) > 0) {
++ if ((l = readlink(fbuf->ptr, lbuf, sizeof(lbuf) - 1)) > 0) {
+ lbuf[l] = '\0';
+ Strcat_m_charp(tmp, " -> ",
+ html_quote(conv_from_system(lbuf)), NULL);
+@@ -212,18 +213,17 @@ set_environ(char *var, char *value)
+ if (var != NULL && value != NULL)
+ setenv(var, value, 1);
+ #else /* not HAVE_SETENV */
+-#ifdef HAVE_PUTENV
+ static Hash_sv *env_hash = NULL;
+ Str tmp = Strnew_m_charp(var, "=", value, NULL);
+
+ if (env_hash == NULL)
+ env_hash = newHash_sv(20);
+ putHash_sv(env_hash, var, (void *)tmp->ptr);
++#ifdef HAVE_PUTENV
+ putenv(tmp->ptr);
+ #else /* not HAVE_PUTENV */
+ extern char **environ;
+ char **ne;
+- char *p;
+ int i, l, el;
+ char **e, **newenv;
+
+@@ -250,7 +250,7 @@ set_environ(char *var, char *value)
+ if (newenv == NULL)
+ return;
+ for (e = environ, ne = newenv; *e != NULL; *(ne++) = *(e++)) ;
+- *(ne++) = p;
++ *(ne++) = tmp->ptr;
+ *ne = NULL;
+ environ = newenv;
+ #endif /* not HAVE_PUTENV */
+@@ -359,6 +359,10 @@ localcgi_post(char *uri, char *qstr, FormList *request, char *referer)
+ int status;
+ pid_t pid;
+ char *file = uri, *name = uri, *path_info = NULL, *tmpf = NULL;
++#ifdef HAVE_CHDIR
++ char *cgi_dir;
++#endif
++ char *cgi_basename;
+
+ #ifdef __MINGW32_VERSION
+ return NULL;
+@@ -373,18 +377,25 @@ localcgi_post(char *uri, char *qstr, FormList *request, char *referer)
+ if (!fw)
+ return NULL;
+ }
++ if (qstr)
++ uri = Strnew_m_charp(uri, "?", qstr, NULL)->ptr;
++#ifdef HAVE_CHDIR
++ cgi_dir = mydirname(file);
++#endif
++ cgi_basename = mybasename(file);
+ pid = open_pipe_rw(&fr, NULL);
+- if (pid < 0)
++ /* Don't invoke gc after here, or the program might crash in some platforms */
++ if (pid < 0) {
++ if (fw)
++ fclose(fw);
+ return NULL;
+- else if (pid) {
++ } else if (pid) {
+ if (fw)
+ fclose(fw);
+ return fr;
+ }
+ setup_child(TRUE, 2, fw ? fileno(fw) : -1);
+
+- if (qstr)
+- uri = Strnew_m_charp(uri, "?", qstr, NULL)->ptr;
+ set_cgi_environ(name, file, uri);
+ if (path_info)
+ set_environ("PATH_INFO", path_info);
+@@ -415,12 +426,11 @@ localcgi_post(char *uri, char *qstr, FormList *request, char *referer)
+ }
+
+ #ifdef HAVE_CHDIR /* ifndef __EMX__ ? */
+- chdir(mydirname(file));
++ chdir(cgi_dir);
+ #endif
+- execl(file, mybasename(file), NULL);
++ execl(file, cgi_basename, NULL);
+ fprintf(stderr, "execl(\"%s\", \"%s\", NULL): %s\n",
+- file, mybasename(file), strerror(errno));
++ file, cgi_basename, strerror(errno));
+ exit(1);
+- return NULL;
+ #endif
+ }
+diff --git a/mailcap.c b/mailcap.c
+index c0461df..f0c6242 100644
+--- a/mailcap.c
++++ b/mailcap.c
+@@ -72,7 +72,7 @@ searchMailcap(struct mailcap *table, char *type)
+ }
+
+ static int
+-matchMailcapAttr(char *p, char *attr, int len, Str *value)
++matchMailcapAttr(char *p, char *attr, size_t len, Str *value)
+ {
+ int quoted;
+ char *q = NULL;
+diff --git a/main.c b/main.c
+index b421943..bd424de 100644
+--- a/main.c
++++ b/main.c
+@@ -1,6 +1,7 @@
+ /* $Id: main.c,v 1.270 2010/08/24 10:11:51 htrb Exp $ */
+ #define MAINPROGRAM
+ #include "fm.h"
++#include <stdio.h>
+ #include <signal.h>
+ #include <setjmp.h>
+ #include <sys/stat.h>
+@@ -11,6 +12,9 @@
+ #include <sys/wait.h>
+ #endif
+ #include <time.h>
++#if defined(__CYGWIN__) && defined(USE_BINMODE_STREAM)
++#include <io.h>
++#endif
+ #include "terms.h"
+ #include "myctype.h"
+ #include "regex.h"
+@@ -119,6 +123,8 @@ static int searchKeyNum(void);
+ #define help() fusage(stdout, 0)
+ #define usage() fusage(stderr, 1)
+
++int enable_inline_image; /* 1 == mlterm OSC 5379, 2 == sixel */
++
+ static void
+ fversion(FILE * f)
+ {
+@@ -200,10 +206,12 @@ fusage(FILE * f, int err)
+ #ifdef USE_M17N
+ fprintf(f, " -I charset document charset\n");
+ fprintf(f, " -O charset display/output charset\n");
++#if 0 /* use -O{s|j|e} instead */
+ fprintf(f, " -e EUC-JP\n");
+ fprintf(f, " -s Shift_JIS\n");
+ fprintf(f, " -j JIS\n");
+ #endif
++#endif
+ fprintf(f, " -B load bookmark\n");
+ fprintf(f, " -bookmark file specify bookmark file\n");
+ fprintf(f, " -T type specify content-type\n");
+@@ -214,7 +222,7 @@ fusage(FILE * f, int err)
+ #endif /* USE_COLOR */
+ fprintf(f,
+ " -N open URL of command line on each new tab\n");
+- fprintf(f, " -F automatically render frame\n");
++ fprintf(f, " -F automatically render frames\n");
+ fprintf(f,
+ " -cols width specify column width (used with -dump)\n");
+ fprintf(f,
+@@ -248,8 +256,12 @@ fusage(FILE * f, int err)
+ #endif /* USE_COOKIE */
+ fprintf(f, " -graph use DEC special graphics for border of table and menu\n");
+ fprintf(f, " -no-graph use ACII character for border of table and menu\n");
++#if 1 /* pager requires -s */
++ fprintf(f, " -s squeeze multiple blank lines\n");
++#else
+ fprintf(f, " -S squeeze multiple blank lines\n");
+- fprintf(f, " -W toggle wrap search mode\n");
++#endif
++ fprintf(f, " -W toggle search wrap mode\n");
+ fprintf(f, " -X don't use termcap init/deinit\n");
+ fprintf(f,
+ " -title[=TERM] set buffer name to terminal title string\n");
+@@ -372,6 +384,13 @@ make_optional_header_string(char *s)
+ return hs;
+ }
+
++static void *
++die_oom(size_t bytes)
++{
++ fprintf(stderr, "Out of memory: %lu bytes unavailable!\n", (unsigned long)bytes);
++ exit(1);
++}
++
+ int
+ main(int argc, char **argv, char **envp)
+ {
+@@ -397,7 +416,15 @@ main(int argc, char **argv, char **envp)
+ wc_ces CodePage;
+ #endif
+ #endif
++#if defined(DONT_CALL_GC_AFTER_FORK) && defined(USE_IMAGE)
++ char **getimage_args = NULL;
++#endif /* defined(DONT_CALL_GC_AFTER_FORK) && defined(USE_IMAGE) */
+ GC_INIT();
++#if (GC_VERSION_MAJOR>7) || ((GC_VERSION_MAJOR==7) && (GC_VERSION_MINOR>=2))
++ GC_set_oom_fn(die_oom);
++#else
++ GC_oom_fn = die_oom;
++#endif
+ #if defined(ENABLE_NLS) || (defined(USE_M17N) && defined(HAVE_LANGINFO_CODESET))
+ setlocale(LC_ALL, "");
+ #endif
+@@ -418,6 +445,10 @@ main(int argc, char **argv, char **envp)
+
+ CurrentDir = currentdir();
+ CurrentPid = (int)getpid();
++#if defined(DONT_CALL_GC_AFTER_FORK) && defined(USE_IMAGE)
++ if (argv[0] && *argv[0])
++ MyProgramName = argv[0];
++#endif /* defined(DONT_CALL_GC_AFTER_FORK) && defined(USE_IMAGE) */
+ BookmarkFile = NULL;
+ config_file = NULL;
+
+@@ -530,12 +561,14 @@ main(int argc, char **argv, char **envp)
+ PagerMax = atoi(argv[i]);
+ }
+ #ifdef USE_M17N
++#if 0 /* use -O{s|j|e} instead */
+ else if (!strcmp("-s", argv[i]))
+ DisplayCharset = WC_CES_SHIFT_JIS;
+ else if (!strcmp("-j", argv[i]))
+ DisplayCharset = WC_CES_ISO_2022_JP;
+ else if (!strcmp("-e", argv[i]))
+ DisplayCharset = WC_CES_EUC_JP;
++#endif
+ else if (!strncmp("-I", argv[i], 2)) {
+ if (argv[i][2] != '\0')
+ p = argv[i] + 2;
+@@ -660,6 +693,12 @@ main(int argc, char **argv, char **envp)
+ }
+ }
+ #endif
++ else if (!strcmp("-ri", argv[i])) {
++ enable_inline_image = 1;
++ }
++ else if (!strcmp("-sixel", argv[i])) {
++ enable_inline_image = 2;
++ }
+ else if (!strcmp("-num", argv[i]))
+ showLineNum = TRUE;
+ else if (!strcmp("-no-proxy", argv[i]))
+@@ -703,7 +742,11 @@ main(int argc, char **argv, char **envp)
+ accept_cookie = TRUE;
+ }
+ #endif /* USE_COOKIE */
++#if 1 /* pager requires -s */
++ else if (!strcmp("-s", argv[i]))
++#else
+ else if (!strcmp("-S", argv[i]))
++#endif
+ squeezeBlankLine = TRUE;
+ else if (!strcmp("-X", argv[i]))
+ Do_not_use_ti_te = TRUE;
+@@ -735,6 +778,15 @@ main(int argc, char **argv, char **envp)
+ else if (!strcmp("-reqlog",argv[i])) {
+ w3m_reqlog=rcFile("request.log");
+ }
++#if defined(DONT_CALL_GC_AFTER_FORK) && defined(USE_IMAGE)
++ else if (!strcmp("-$$getimage", argv[i])) {
++ ++i;
++ getimage_args = argv + i;
++ i += 4;
++ if (i > argc)
++ usage();
++ }
++#endif /* defined(DONT_CALL_GC_AFTER_FORK) && defined(USE_IMAGE) */
+ else {
+ usage();
+ }
+@@ -823,6 +875,30 @@ main(int argc, char **argv, char **envp)
+
+ if (w3m_backend)
+ backend();
++#if defined(DONT_CALL_GC_AFTER_FORK) && defined(USE_IMAGE)
++ if (getimage_args) {
++ char *image_url = conv_from_system(getimage_args[0]);
++ char *base_url = conv_from_system(getimage_args[1]);
++ ParsedURL base_pu;
++
++ parseURL2(base_url, &base_pu, NULL);
++ image_source = getimage_args[2];
++ newbuf = loadGeneralFile(image_url, &base_pu, NULL, 0, NULL);
++ if (!newbuf || !newbuf->real_type ||
++ strncasecmp(newbuf->real_type, "image/", 6))
++ unlink(getimage_args[2]);
++#if defined(HAVE_SYMLINK) && defined(HAVE_LSTAT)
++ symlink(getimage_args[2], getimage_args[3]);
++#else
++ {
++ FILE *f = fopen(getimage_args[3], "w");
++ if (f)
++ fclose(f);
++ }
++#endif
++ w3m_exit(0);
++ }
++#endif /* defined(DONT_CALL_GC_AFTER_FORK) && defined(USE_IMAGE) */
+
+ if (w3m_dump)
+ mySignal(SIGINT, SIG_IGN);
+@@ -833,7 +909,12 @@ main(int argc, char **argv, char **envp)
+ mySignal(SIGPIPE, SigPipe);
+ #endif
+
++#if (GC_VERSION_MAJOR>7) || ((GC_VERSION_MAJOR==7) && (GC_VERSION_MINOR>=2))
++ orig_GC_warn_proc = GC_get_warn_proc();
++ GC_set_warn_proc(wrap_GC_warn_proc);
++#else
+ orig_GC_warn_proc = GC_set_warn_proc(wrap_GC_warn_proc);
++#endif
+ err_msg = Strnew();
+ if (load_argc == 0) {
+ /* no URL specified */
+@@ -894,12 +975,17 @@ main(int argc, char **argv, char **envp)
+ if (i >= 0) {
+ SearchHeader = search_header;
+ DefaultType = default_type;
++ char *url;
++
++ url = load_argv[i];
++ if (getURLScheme(&url) == SCM_MISSING && !ArgvIsURL)
++ url = file_to_url(load_argv[i]);
++ else
++ url = url_encode(conv_from_system(load_argv[i]), NULL, 0);
+ if (w3m_dump == DUMP_HEAD) {
+ request = New(FormList);
+ request->method = FORM_METHOD_HEAD;
+- newbuf =
+- loadGeneralFile(load_argv[i], NULL, NO_REFERER, 0,
+- request);
++ newbuf = loadGeneralFile(url, NULL, NO_REFERER, 0, request);
+ }
+ else {
+ if (post_file && i == 0) {
+@@ -928,9 +1014,7 @@ main(int argc, char **argv, char **envp)
+ else {
+ request = NULL;
+ }
+- newbuf =
+- loadGeneralFile(load_argv[i], NULL, NO_REFERER, 0,
+- request);
++ newbuf = loadGeneralFile(url, NULL, NO_REFERER, 0, request);
+ }
+ if (newbuf == NULL) {
+ /* FIXME: gettextize? */
+@@ -945,7 +1029,7 @@ main(int argc, char **argv, char **envp)
+ break;
+ case SCM_LOCAL:
+ case SCM_LOCAL_CGI:
+- unshiftHist(LoadHist, conv_from_system(load_argv[i]));
++ unshiftHist(LoadHist, url);
+ default:
+ pushHashHist(URLHist, parsedURL2Str(&newbuf->currentURL)->ptr);
+ break;
+@@ -1183,13 +1267,13 @@ static void
+ dump_source(Buffer *buf)
+ {
+ FILE *f;
+- char c;
++ int c;
+ if (buf->sourcefile == NULL)
+ return;
+ f = fopen(buf->sourcefile, "r");
+ if (f == NULL)
+ return;
+- while (c = fgetc(f), !feof(f)) {
++ while ((c = fgetc(f)) != EOF) {
+ putchar(c);
+ }
+ fclose(f);
+@@ -1246,6 +1330,12 @@ dump_extra(Buffer *buf)
+ #endif
+ }
+
++static int
++cmp_anchor_hseq(const void *a, const void *b)
++{
++ return (*((const Anchor **) a))->hseq - (*((const Anchor **) b))->hseq;
++}
++
+ static void
+ do_dump(Buffer *buf)
+ {
+@@ -1266,18 +1356,20 @@ do_dump(Buffer *buf)
+ int i;
+ saveBuffer(buf, stdout, FALSE);
+ if (displayLinkNumber && buf->href) {
++ int nanchor = buf->href->nanchor;
+ printf("\nReferences:\n\n");
+- for (i = 0; i < buf->href->nanchor; i++) {
+- ParsedURL pu;
+- static Str s = NULL;
+- if (buf->href->anchors[i].slave)
++ Anchor **in_order = New_N(Anchor *, buf->href->nanchor);
++ for (i = 0; i < nanchor; i++)
++ in_order[i] = buf->href->anchors + i;
++ qsort(in_order, nanchor, sizeof(Anchor *), cmp_anchor_hseq);
++ for (i = 0; i < nanchor; i++) {
++ ParsedURL pu;
++ char *url;
++ if (in_order[i]->slave)
+ continue;
+- parseURL2(buf->href->anchors[i].url, &pu, baseURL(buf));
+- s = parsedURL2Str(&pu);
+- if (DecodeURL)
+- s = Strnew_charp(url_unquote_conv
+- (s->ptr, Currentbuf->document_charset));
+- printf("[%d] %s\n", buf->href->anchors[i].hseq + 1, s->ptr);
++ parseURL2(in_order[i]->url, &pu, baseURL(buf));
++ url = url_decode2(parsedURL2Str(&pu)->ptr, Currentbuf);
++ printf("[%d] %s\n", in_order[i]->hseq + 1, url);
+ }
+ }
+ }
+@@ -1547,7 +1639,7 @@ nscroll(int n, int mode)
+ }
+
+ /* Move page forward */
+-DEFUN(pgFore, NEXT_PAGE, "Move to next page")
++DEFUN(pgFore, NEXT_PAGE, "Scroll down one page")
+ {
+ if (vi_prec_num)
+ nscroll(searchKeyNum() * (Currentbuf->LINES - 1), B_NORMAL);
+@@ -1557,7 +1649,7 @@ DEFUN(pgFore, NEXT_PAGE, "Move to next page")
+ }
+
+ /* Move page backward */
+-DEFUN(pgBack, PREV_PAGE, "Move to previous page")
++DEFUN(pgBack, PREV_PAGE, "Scroll up one page")
+ {
+ if (vi_prec_num)
+ nscroll(-searchKeyNum() * (Currentbuf->LINES - 1), B_NORMAL);
+@@ -1566,20 +1658,32 @@ DEFUN(pgBack, PREV_PAGE, "Move to previous page")
+ * (Currentbuf->LINES - 1)), prec_num ? B_SCROLL : B_NORMAL);
+ }
+
++/* Move half page forward */
++DEFUN(hpgFore, NEXT_HALF_PAGE, "Scroll down half a page")
++{
++ nscroll(searchKeyNum() * (Currentbuf->LINES / 2 - 1), B_NORMAL);
++}
++
++/* Move half page backward */
++DEFUN(hpgBack, PREV_HALF_PAGE, "Scroll up half a page")
++{
++ nscroll(-searchKeyNum() * (Currentbuf->LINES / 2 - 1), B_NORMAL);
++}
++
+ /* 1 line up */
+-DEFUN(lup1, UP, "Scroll up one line")
++DEFUN(lup1, UP, "Scroll the screen up one line")
+ {
+ nscroll(searchKeyNum(), B_SCROLL);
+ }
+
+ /* 1 line down */
+-DEFUN(ldown1, DOWN, "Scroll down one line")
++DEFUN(ldown1, DOWN, "Scroll the screen down one line")
+ {
+ nscroll(-searchKeyNum(), B_SCROLL);
+ }
+
+ /* move cursor position to the center of screen */
+-DEFUN(ctrCsrV, CENTER_V, "Move to the center column")
++DEFUN(ctrCsrV, CENTER_V, "Center on cursor line")
+ {
+ int offsety;
+ if (Currentbuf->firstLine == NULL)
+@@ -1598,7 +1702,7 @@ DEFUN(ctrCsrV, CENTER_V, "Move to the center column")
+ }
+ }
+
+-DEFUN(ctrCsrH, CENTER_H, "Move to the center line")
++DEFUN(ctrCsrH, CENTER_H, "Center on cursor column")
+ {
+ int offsetx;
+ if (Currentbuf->firstLine == NULL)
+@@ -1612,7 +1716,7 @@ DEFUN(ctrCsrH, CENTER_H, "Move to the center line")
+ }
+
+ /* Redraw screen */
+-DEFUN(rdrwSc, REDRAW, "Redraw screen")
++DEFUN(rdrwSc, REDRAW, "Draw the screen anew")
+ {
+ clear();
+ arrangeCursor(Currentbuf);
+@@ -1844,19 +1948,23 @@ srch_nxtprv(int reverse)
+ result = srchcore(SearchString, routine[reverse]);
+ if (result & SR_FOUND)
+ clear_mark(Currentbuf->currentLine);
++ else {
++ if (reverse == 0)
++ Currentbuf->pos -= 1;
++ }
+ displayBuffer(Currentbuf, B_NORMAL);
+ disp_srchresult(result, (reverse ? "Backward: " : "Forward: "),
+ SearchString);
+ }
+
+ /* Search next matching */
+-DEFUN(srchnxt, SEARCH_NEXT, "Search next regexp")
++DEFUN(srchnxt, SEARCH_NEXT, "Continue search forward")
+ {
+ srch_nxtprv(0);
+ }
+
+ /* Search previous matching */
+-DEFUN(srchprv, SEARCH_PREV, "Search previous regexp")
++DEFUN(srchprv, SEARCH_PREV, "Continue search backward")
+ {
+ srch_nxtprv(1);
+ }
+@@ -1919,7 +2027,7 @@ DEFUN(col1R, RIGHT, "Shift screen one column right")
+ displayBuffer(Currentbuf, B_NORMAL);
+ }
+
+-DEFUN(col1L, LEFT, "Shift screen one column")
++DEFUN(col1L, LEFT, "Shift screen one column left")
+ {
+ Buffer *buf = Currentbuf;
+ Line *l = buf->currentLine;
+@@ -1960,7 +2068,7 @@ DEFUN(setEnv, SETENV, "Set environment variable")
+ displayBuffer(Currentbuf, B_NORMAL);
+ }
+
+-DEFUN(pipeBuf, PIPE_BUF, "Send rendered document to pipe")
++DEFUN(pipeBuf, PIPE_BUF, "Pipe current buffer through a shell command and display output")
+ {
+ Buffer *buf;
+ char *cmd, *tmpf;
+@@ -2006,7 +2114,7 @@ DEFUN(pipeBuf, PIPE_BUF, "Send rendered document to pipe")
+ }
+
+ /* Execute shell command and read output ac pipe. */
+-DEFUN(pipesh, PIPE_SHELL, "Execute shell command and browse")
++DEFUN(pipesh, PIPE_SHELL, "Execute shell command and display output")
+ {
+ Buffer *buf;
+ char *cmd;
+@@ -2037,7 +2145,7 @@ DEFUN(pipesh, PIPE_SHELL, "Execute shell command and browse")
+ }
+
+ /* Execute shell command and load entire output to buffer */
+-DEFUN(readsh, READ_SHELL, "Execute shell command and load")
++DEFUN(readsh, READ_SHELL, "Execute shell command and display output")
+ {
+ Buffer *buf;
+ MySignalHandler(*prevtrap) ();
+@@ -2074,7 +2182,7 @@ DEFUN(readsh, READ_SHELL, "Execute shell command and load")
+ }
+
+ /* Execute shell command */
+-DEFUN(execsh, EXEC_SHELL SHELL, "Execute shell command")
++DEFUN(execsh, EXEC_SHELL SHELL, "Execute shell command and display output")
+ {
+ char *cmd;
+
+@@ -2099,7 +2207,7 @@ DEFUN(execsh, EXEC_SHELL SHELL, "Execute shell command")
+ }
+
+ /* Load file */
+-DEFUN(ldfile, LOAD, "Load local file")
++DEFUN(ldfile, LOAD, "Open local file in a new buffer")
+ {
+ char *fn;
+
+@@ -2118,7 +2226,7 @@ DEFUN(ldfile, LOAD, "Load local file")
+ }
+
+ /* Load help file */
+-DEFUN(ldhelp, HELP, "View help")
++DEFUN(ldhelp, HELP, "Show help panel")
+ {
+ #ifdef USE_HELP_CGI
+ char *lang;
+@@ -2167,13 +2275,12 @@ _movL(int n)
+ displayBuffer(Currentbuf, B_NORMAL);
+ }
+
+-DEFUN(movL, MOVE_LEFT,
+- "Move cursor left (a half screen shift at the left edge)")
++DEFUN(movL, MOVE_LEFT, "Cursor left")
+ {
+ _movL(Currentbuf->COLS / 2);
+ }
+
+-DEFUN(movL1, MOVE_LEFT1, "Move cursor left (1 columns shift at the left edge)")
++DEFUN(movL1, MOVE_LEFT1, "Cursor left. With edge touched, slide")
+ {
+ _movL(1);
+ }
+@@ -2190,14 +2297,12 @@ _movD(int n)
+ displayBuffer(Currentbuf, B_NORMAL);
+ }
+
+-DEFUN(movD, MOVE_DOWN,
+- "Move cursor down (a half screen scroll at the end of screen)")
++DEFUN(movD, MOVE_DOWN, "Cursor down")
+ {
+ _movD((Currentbuf->LINES + 1) / 2);
+ }
+
+-DEFUN(movD1, MOVE_DOWN1,
+- "Move cursor down (1 line scroll at the end of screen)")
++DEFUN(movD1, MOVE_DOWN1, "Cursor down. With edge touched, slide")
+ {
+ _movD(1);
+ }
+@@ -2214,13 +2319,12 @@ _movU(int n)
+ displayBuffer(Currentbuf, B_NORMAL);
+ }
+
+-DEFUN(movU, MOVE_UP,
+- "Move cursor up (a half screen scroll at the top of screen)")
++DEFUN(movU, MOVE_UP, "Cursor up")
+ {
+ _movU((Currentbuf->LINES + 1) / 2);
+ }
+
+-DEFUN(movU1, MOVE_UP1, "Move cursor up (1 line scrol at the top of screen)")
++DEFUN(movU1, MOVE_UP1, "Cursor up. With edge touched, slide")
+ {
+ _movU(1);
+ }
+@@ -2237,14 +2341,12 @@ _movR(int n)
+ displayBuffer(Currentbuf, B_NORMAL);
+ }
+
+-DEFUN(movR, MOVE_RIGHT,
+- "Move cursor right (a half screen shift at the right edge)")
++DEFUN(movR, MOVE_RIGHT, "Cursor right")
+ {
+ _movR(Currentbuf->COLS / 2);
+ }
+
+-DEFUN(movR1, MOVE_RIGHT1,
+- "Move cursor right (1 columns shift at the right edge)")
++DEFUN(movR1, MOVE_RIGHT1, "Cursor right. With edge touched, slide")
+ {
+ _movR(1);
+ }
+@@ -2261,7 +2363,7 @@ DEFUN(movR1, MOVE_RIGHT1,
+ static wc_uint32
+ getChar(char *p)
+ {
+- return wc_any_to_ucs(wtf_parse1(&p));
++ return wc_any_to_ucs(wtf_parse1((wc_uchar **)&p));
+ }
+
+ static int
+@@ -2296,7 +2398,7 @@ prev_nonnull_line(Line *line)
+ return 0;
+ }
+
+-DEFUN(movLW, PREV_WORD, "Move to previous word")
++DEFUN(movLW, PREV_WORD, "Move to the previous word")
+ {
+ char *lb;
+ Line *pline, *l;
+@@ -2364,7 +2466,7 @@ next_nonnull_line(Line *line)
+ return 0;
+ }
+
+-DEFUN(movRW, NEXT_WORD, "Move to next word")
++DEFUN(movRW, NEXT_WORD, "Move to the next word")
+ {
+ char *lb;
+ Line *pline, *l;
+@@ -2442,19 +2544,19 @@ _quitfm(int confirm)
+ }
+
+ /* Quit */
+-DEFUN(quitfm, ABORT EXIT, "Quit w3m without confirmation")
++DEFUN(quitfm, ABORT EXIT, "Quit at once")
+ {
+ _quitfm(FALSE);
+ }
+
+ /* Question and Quit */
+-DEFUN(qquitfm, QUIT, "Quit w3m")
++DEFUN(qquitfm, QUIT, "Quit with confirmation request")
+ {
+ _quitfm(confirm_on_quit);
+ }
+
+ /* Select buffer */
+-DEFUN(selBuf, SELECT, "Go to buffer selection panel")
++DEFUN(selBuf, SELECT, "Display buffer-stack panel")
+ {
+ Buffer *buf;
+ int ok;
+@@ -2502,7 +2604,7 @@ DEFUN(selBuf, SELECT, "Go to buffer selection panel")
+ }
+
+ /* Suspend (on BSD), or run interactive shell (on SysV) */
+-DEFUN(susp, INTERRUPT SUSPEND, "Stop loading document")
++DEFUN(susp, INTERRUPT SUSPEND, "Suspend w3m to background")
+ {
+ #ifndef SIGSTOP
+ char *shell;
+@@ -2550,7 +2652,7 @@ _goLine(char *l)
+ displayBuffer(Currentbuf, B_FORCE_REDRAW);
+ }
+
+-DEFUN(goLine, GOTO_LINE, "Go to specified line")
++DEFUN(goLine, GOTO_LINE, "Go to the specified line")
+ {
+
+ char *str = searchKeyData();
+@@ -2575,7 +2677,7 @@ DEFUN(goLineL, END, "Go to the last line")
+ }
+
+ /* Go to the beginning of the line */
+-DEFUN(linbeg, LINE_BEGIN, "Go to the beginning of line")
++DEFUN(linbeg, LINE_BEGIN, "Go to the beginning of the line")
+ {
+ if (Currentbuf->firstLine == NULL)
+ return;
+@@ -2587,7 +2689,7 @@ DEFUN(linbeg, LINE_BEGIN, "Go to the beginning of line")
+ }
+
+ /* Go to the bottom of the line */
+-DEFUN(linend, LINE_END, "Go to the end of line")
++DEFUN(linend, LINE_END, "Go to the end of the line")
+ {
+ if (Currentbuf->firstLine == NULL)
+ return;
+@@ -2616,7 +2718,7 @@ cur_real_linenumber(Buffer *buf)
+ }
+
+ /* Run editor on the current buffer */
+-DEFUN(editBf, EDIT, "Edit current document")
++DEFUN(editBf, EDIT, "Edit local source")
+ {
+ char *fn = Currentbuf->filename;
+ Str cmd;
+@@ -2643,7 +2745,7 @@ DEFUN(editBf, EDIT, "Edit current document")
+ }
+
+ /* Run editor on the current screen */
+-DEFUN(editScr, EDIT_SCREEN, "Edit currently rendered document")
++DEFUN(editScr, EDIT_SCREEN, "Edit rendered copy of document")
+ {
+ char *tmpf;
+ FILE *f;
+@@ -2681,7 +2783,7 @@ DEFUN(_mark, MARK, "Set/unset mark")
+ }
+
+ /* Go to next mark */
+-DEFUN(nextMk, NEXT_MARK, "Move to next word")
++DEFUN(nextMk, NEXT_MARK, "Go to the next mark")
+ {
+ Line *l;
+ int i;
+@@ -2714,7 +2816,7 @@ DEFUN(nextMk, NEXT_MARK, "Move to next word")
+ }
+
+ /* Go to previous mark */
+-DEFUN(prevMk, PREV_MARK, "Move to previous mark")
++DEFUN(prevMk, PREV_MARK, "Go to the previous mark")
+ {
+ Line *l;
+ int i;
+@@ -2749,7 +2851,7 @@ DEFUN(prevMk, PREV_MARK, "Move to previous mark")
+ }
+
+ /* Mark place to which the regular expression matches */
+-DEFUN(reMark, REG_MARK, "Set mark using regexp")
++DEFUN(reMark, REG_MARK, "Mark all occurences of a pattern")
+ {
+ Line *l;
+ char *str;
+@@ -2804,12 +2906,15 @@ loadLink(char *url, char *target, char *referer, FormList *request)
+ union frameset_element *f_element = NULL;
+ int flag = 0;
+ ParsedURL *base, pu;
++ const int *no_referer_ptr;
+
+ message(Sprintf("loading %s", url)->ptr, 0, 0);
+ refresh();
+
++ no_referer_ptr = query_SCONF_NO_REFERER_FROM(&Currentbuf->currentURL);
+ base = baseURL(Currentbuf);
+- if (base == NULL ||
++ if ((no_referer_ptr && *no_referer_ptr) ||
++ base == NULL ||
+ base->scheme == SCM_LOCAL || base->scheme == SCM_LOCAL_CGI)
+ referer = NO_REFERER;
+ if (referer == NULL)
+@@ -2830,7 +2935,7 @@ loadLink(char *url, char *target, char *referer, FormList *request)
+ if (!on_target) /* open link as an indivisual page */
+ return loadNormalBuf(buf, TRUE);
+
+- if (do_download) /* download (thus no need to render frame) */
++ if (do_download) /* download (thus no need to render frames) */
+ return loadNormalBuf(buf, FALSE);
+
+ if (target == NULL || /* no target specified (that means this page is not a frame page) */
+@@ -2959,9 +3064,8 @@ handleMailto(char *url)
+ }
+
+ /* follow HREF link */
+-DEFUN(followA, GOTO_LINK, "Go to current link")
++DEFUN(followA, GOTO_LINK, "Follow current hyperlink in a new buffer")
+ {
+- Line *l;
+ Anchor *a;
+ ParsedURL u;
+ #ifdef USE_IMAGE
+@@ -2971,7 +3075,6 @@ DEFUN(followA, GOTO_LINK, "Go to current link")
+
+ if (Currentbuf->firstLine == NULL)
+ return;
+- l = Currentbuf->currentLine;
+
+ #ifdef USE_IMAGE
+ a = retrieveCurrentImg(Currentbuf);
+@@ -3051,15 +3154,13 @@ bufferA(void)
+ }
+
+ /* view inline image */
+-DEFUN(followI, VIEW_IMAGE, "View image")
++DEFUN(followI, VIEW_IMAGE, "Display image in viewer")
+ {
+- Line *l;
+ Anchor *a;
+ Buffer *buf;
+
+ if (Currentbuf->firstLine == NULL)
+ return;
+- l = Currentbuf->currentLine;
+
+ a = retrieveCurrentImg(Currentbuf);
+ if (a == NULL)
+@@ -3309,7 +3410,6 @@ followForm(void)
+ static void
+ _followForm(int submit)
+ {
+- Line *l;
+ Anchor *a, *a2;
+ char *p;
+ FormItemList *fi, *f2;
+@@ -3318,7 +3418,6 @@ _followForm(int submit)
+
+ if (Currentbuf->firstLine == NULL)
+ return;
+- l = Currentbuf->currentLine;
+
+ a = retrieveCurrentForm(Currentbuf);
+ if (a == NULL)
+@@ -3423,7 +3522,6 @@ _followForm(int submit)
+ case FORM_INPUT_BUTTON:
+ do_submit:
+ tmp = Strnew();
+- tmp2 = Strnew();
+ multipart = (fi->parent->method == FORM_METHOD_POST &&
+ fi->parent->enctype == FORM_ENCTYPE_MULTIPART);
+ query_from_followform(&tmp, fi, multipart);
+@@ -3501,7 +3599,7 @@ _followForm(int submit)
+ }
+
+ /* go to the top anchor */
+-DEFUN(topA, LINK_BEGIN, "Go to the first link")
++DEFUN(topA, LINK_BEGIN, "Move to the first hyperlink")
+ {
+ HmarkerList *hl = Currentbuf->hmarklist;
+ BufferPoint *po;
+@@ -3534,7 +3632,7 @@ DEFUN(topA, LINK_BEGIN, "Go to the first link")
+ }
+
+ /* go to the last anchor */
+-DEFUN(lastA, LINK_END, "Go to the last link")
++DEFUN(lastA, LINK_END, "Move to the last hyperlink")
+ {
+ HmarkerList *hl = Currentbuf->hmarklist;
+ BufferPoint *po;
+@@ -3568,26 +3666,53 @@ DEFUN(lastA, LINK_END, "Go to the last link")
+ displayBuffer(Currentbuf, B_NORMAL);
+ }
+
++/* go to the nth anchor */
++DEFUN(nthA, LINK_N, "Go to the nth link")
++{
++ HmarkerList *hl = Currentbuf->hmarklist;
++ BufferPoint *po;
++ Anchor *an;
++
++ int n = searchKeyNum();
++ if (n < 0 || n > hl->nmark) return;
++
++ if (Currentbuf->firstLine == NULL)
++ return;
++ if (!hl || hl->nmark == 0)
++ return;
++
++ po = hl->marks + n-1;
++ an = retrieveAnchor(Currentbuf->href, po->line, po->pos);
++ if (an == NULL)
++ an = retrieveAnchor(Currentbuf->formitem, po->line, po->pos);
++ if (an == NULL) return;
++
++ gotoLine(Currentbuf, po->line);
++ Currentbuf->pos = po->pos;
++ arrangeCursor(Currentbuf);
++ displayBuffer(Currentbuf, B_NORMAL);
++}
++
+ /* go to the next anchor */
+-DEFUN(nextA, NEXT_LINK, "Move to next link")
++DEFUN(nextA, NEXT_LINK, "Move to the next hyperlink")
+ {
+ _nextA(FALSE);
+ }
+
+ /* go to the previous anchor */
+-DEFUN(prevA, PREV_LINK, "Move to previous link")
++DEFUN(prevA, PREV_LINK, "Move to the previous hyperlink")
+ {
+ _prevA(FALSE);
+ }
+
+ /* go to the next visited anchor */
+-DEFUN(nextVA, NEXT_VISITED, "Move to next visited link")
++DEFUN(nextVA, NEXT_VISITED, "Move to the next visited hyperlink")
+ {
+ _nextA(TRUE);
+ }
+
+ /* go to the previous visited anchor */
+-DEFUN(prevVA, PREV_VISITED, "Move to previous visited link")
++DEFUN(prevVA, PREV_VISITED, "Move to the previous visited hyperlink")
+ {
+ _prevA(TRUE);
+ }
+@@ -3863,43 +3988,43 @@ nextY(int d)
+ }
+
+ /* go to the next left anchor */
+-DEFUN(nextL, NEXT_LEFT, "Move to next left link")
++DEFUN(nextL, NEXT_LEFT, "Move left to the next hyperlink")
+ {
+ nextX(-1, 0);
+ }
+
+ /* go to the next left-up anchor */
+-DEFUN(nextLU, NEXT_LEFT_UP, "Move to next left (or upward) link")
++DEFUN(nextLU, NEXT_LEFT_UP, "Move left or upward to the next hyperlink")
+ {
+ nextX(-1, -1);
+ }
+
+ /* go to the next right anchor */
+-DEFUN(nextR, NEXT_RIGHT, "Move to next right link")
++DEFUN(nextR, NEXT_RIGHT, "Move right to the next hyperlink")
+ {
+ nextX(1, 0);
+ }
+
+ /* go to the next right-down anchor */
+-DEFUN(nextRD, NEXT_RIGHT_DOWN, "Move to next right (or downward) link")
++DEFUN(nextRD, NEXT_RIGHT_DOWN, "Move right or downward to the next hyperlink")
+ {
+ nextX(1, 1);
+ }
+
+ /* go to the next downward anchor */
+-DEFUN(nextD, NEXT_DOWN, "Move to next downward link")
++DEFUN(nextD, NEXT_DOWN, "Move downward to the next hyperlink")
+ {
+ nextY(1);
+ }
+
+ /* go to the next upward anchor */
+-DEFUN(nextU, NEXT_UP, "Move to next upward link")
++DEFUN(nextU, NEXT_UP, "Move upward to the next hyperlink")
+ {
+ nextY(-1);
+ }
+
+ /* go to the next bufferr */
+-DEFUN(nextBf, NEXT, "Move to next buffer")
++DEFUN(nextBf, NEXT, "Switch to the next buffer")
+ {
+ Buffer *buf;
+ int i;
+@@ -3917,7 +4042,7 @@ DEFUN(nextBf, NEXT, "Move to next buffer")
+ }
+
+ /* go to the previous bufferr */
+-DEFUN(prevBf, PREV, "Move to previous buffer")
++DEFUN(prevBf, PREV, "Switch to the previous buffer")
+ {
+ Buffer *buf;
+ int i;
+@@ -3959,7 +4084,7 @@ checkBackBuffer(Buffer *buf)
+ }
+
+ /* delete current buffer and back to the previous buffer */
+-DEFUN(backBf, BACK, "Back to previous buffer")
++DEFUN(backBf, BACK, "Close current buffer and return to the one below in stack")
+ {
+ Buffer *buf = Currentbuf->linkBuffer[LB_N_FRAME];
+
+@@ -4008,8 +4133,7 @@ DEFUN(backBf, BACK, "Back to previous buffer")
+ displayBuffer(Currentbuf, B_FORCE_REDRAW);
+ }
+
+-DEFUN(deletePrevBuf, DELETE_PREVBUF,
+- "Delete previous buffer (mainly for local-CGI)")
++DEFUN(deletePrevBuf, DELETE_PREVBUF, "Delete previous buffer (mainly for local CGI-scripts)")
+ {
+ Buffer *buf = Currentbuf->nextBuffer;
+ if (buf)
+@@ -4055,6 +4179,7 @@ goURL0(char *prompt, int relative)
+ char *url, *referer;
+ ParsedURL p_url, *current;
+ Buffer *cur_buf = Currentbuf;
++ const int *no_referer_ptr;
+
+ url = searchKeyData();
+ if (url == NULL) {
+@@ -4064,11 +4189,8 @@ goURL0(char *prompt, int relative)
+ current = baseURL(Currentbuf);
+ if (current) {
+ char *c_url = parsedURL2Str(current)->ptr;
+- if (DefaultURLString == DEFAULT_URL_CURRENT) {
+- url = c_url;
+- if (DecodeURL)
+- url = url_unquote_conv(url, 0);
+- }
++ if (DefaultURLString == DEFAULT_URL_CURRENT)
++ url = url_decode2(c_url, NULL);
+ else
+ pushHist(hist, c_url);
+ }
+@@ -4077,11 +4199,8 @@ goURL0(char *prompt, int relative)
+ char *a_url;
+ parseURL2(a->url, &p_url, current);
+ a_url = parsedURL2Str(&p_url)->ptr;
+- if (DefaultURLString == DEFAULT_URL_LINK) {
+- url = a_url;
+- if (DecodeURL)
+- url = url_unquote_conv(url, Currentbuf->document_charset);
+- }
++ if (DefaultURLString == DEFAULT_URL_LINK)
++ url = url_decode2(a_url, Currentbuf);
+ else
+ pushHist(hist, a_url);
+ }
+@@ -4089,15 +4208,22 @@ goURL0(char *prompt, int relative)
+ if (url != NULL)
+ SKIP_BLANKS(url);
+ }
+-#ifdef USE_M17N
+- if (url != NULL) {
+- if ((relative || *url == '#') && Currentbuf->document_charset)
+- url = wc_conv_strict(url, InnerCharset,
+- Currentbuf->document_charset)->ptr;
++ if (relative) {
++ no_referer_ptr = query_SCONF_NO_REFERER_FROM(&Currentbuf->currentURL);
++ current = baseURL(Currentbuf);
++ if ((no_referer_ptr && *no_referer_ptr) ||
++ current == NULL ||
++ current->scheme == SCM_LOCAL || current->scheme == SCM_LOCAL_CGI)
++ referer = NO_REFERER;
+ else
+- url = conv_to_system(url);
++ referer = parsedURL2Str(&Currentbuf->currentURL)->ptr;
++ url = url_encode(url, current, Currentbuf->document_charset);
++ }
++ else {
++ current = NULL;
++ referer = NULL;
++ url = url_encode(url, NULL, 0);
+ }
+-#endif
+ if (url == NULL || *url == '\0') {
+ displayBuffer(Currentbuf, B_FORCE_REDRAW);
+ return;
+@@ -4106,14 +4232,6 @@ goURL0(char *prompt, int relative)
+ gotoLabel(url + 1);
+ return;
+ }
+- if (relative) {
+- current = baseURL(Currentbuf);
+- referer = parsedURL2Str(&Currentbuf->currentURL)->ptr;
+- }
+- else {
+- current = NULL;
+- referer = NULL;
+- }
+ parseURL2(url, &p_url, current);
+ pushHashHist(URLHist, parsedURL2Str(&p_url)->ptr);
+ cmd_loadURL(url, current, referer, NULL);
+@@ -4121,12 +4239,12 @@ goURL0(char *prompt, int relative)
+ pushHashHist(URLHist, parsedURL2Str(&Currentbuf->currentURL)->ptr);
+ }
+
+-DEFUN(goURL, GOTO, "Go to URL")
++DEFUN(goURL, GOTO, "Open specified document in a new buffer")
+ {
+ goURL0("Goto URL: ", FALSE);
+ }
+
+-DEFUN(gorURL, GOTO_RELATIVE, "Go to relative URL")
++DEFUN(gorURL, GOTO_RELATIVE, "Go to relative address")
+ {
+ goURL0("Goto relative URL: ", TRUE);
+ }
+@@ -4151,14 +4269,14 @@ cmd_loadBuffer(Buffer *buf, int prop, int linkid)
+ }
+
+ /* load bookmark */
+-DEFUN(ldBmark, BOOKMARK VIEW_BOOKMARK, "Read bookmark")
++DEFUN(ldBmark, BOOKMARK VIEW_BOOKMARK, "View bookmarks")
+ {
+ cmd_loadURL(BookmarkFile, NULL, NO_REFERER, NULL);
+ }
+
+
+ /* Add current to bookmark */
+-DEFUN(adBmark, ADD_BOOKMARK, "Add current page to bookmark")
++DEFUN(adBmark, ADD_BOOKMARK, "Add current page to bookmarks")
+ {
+ Str tmp;
+ FormList *request;
+@@ -4188,7 +4306,7 @@ DEFUN(adBmark, ADD_BOOKMARK, "Add current page to bookmark")
+ }
+
+ /* option setting */
+-DEFUN(ldOpt, OPTIONS, "Option setting panel")
++DEFUN(ldOpt, OPTIONS, "Display options setting panel")
+ {
+ cmd_loadBuffer(load_option_panel(), BP_NO_URL, LB_NOLINK);
+ }
+@@ -4223,7 +4341,7 @@ DEFUN(msgs, MSGS, "Display error messages")
+ }
+
+ /* page info */
+-DEFUN(pginfo, INFO, "View info of current document")
++DEFUN(pginfo, INFO, "Display information about the current document")
+ {
+ Buffer *buf;
+
+@@ -4291,7 +4409,7 @@ follow_map(struct parsed_tagarg *arg)
+
+ #ifdef USE_MENU
+ /* link menu */
+-DEFUN(linkMn, LINK_MENU, "Popup link element menu")
++DEFUN(linkMn, LINK_MENU, "Pop up link element menu")
+ {
+ LinkList *l = link_menu(Currentbuf);
+ ParsedURL p_url;
+@@ -4329,26 +4447,25 @@ anchorMn(Anchor *(*menu_func) (Buffer *), int go)
+ }
+
+ /* accesskey */
+-DEFUN(accessKey, ACCESSKEY, "Popup acceskey menu")
++DEFUN(accessKey, ACCESSKEY, "Pop up accesskey menu")
+ {
+ anchorMn(accesskey_menu, TRUE);
+ }
+
+ /* list menu */
+-DEFUN(listMn, LIST_MENU, "Popup link list menu and go to selected link")
++DEFUN(listMn, LIST_MENU, "Pop up menu for hyperlinks to browse to")
+ {
+ anchorMn(list_menu, TRUE);
+ }
+
+-DEFUN(movlistMn, MOVE_LIST_MENU,
+- "Popup link list menu and move cursor to selected link")
++DEFUN(movlistMn, MOVE_LIST_MENU, "Pop up menu to navigate between hyperlinks")
+ {
+ anchorMn(list_menu, FALSE);
+ }
+ #endif
+
+ /* link,anchor,image list */
+-DEFUN(linkLst, LIST, "Show all links and images")
++DEFUN(linkLst, LIST, "Show all URLs referenced")
+ {
+ Buffer *buf;
+
+@@ -4375,14 +4492,14 @@ DEFUN(cooLst, COOKIE, "View cookie list")
+
+ #ifdef USE_HISTORY
+ /* History page */
+-DEFUN(ldHist, HISTORY, "View history of URL")
++DEFUN(ldHist, HISTORY, "Show browsing history")
+ {
+ cmd_loadBuffer(historyBuffer(URLHist), BP_NO_URL, LB_NOLINK);
+ }
+ #endif /* USE_HISTORY */
+
+ /* download HREF link */
+-DEFUN(svA, SAVE_LINK, "Save link to file")
++DEFUN(svA, SAVE_LINK, "Save hyperlink target")
+ {
+ CurrentKeyData = NULL; /* not allowed in w3m-control: */
+ do_download = TRUE;
+@@ -4391,7 +4508,7 @@ DEFUN(svA, SAVE_LINK, "Save link to file")
+ }
+
+ /* download IMG link */
+-DEFUN(svI, SAVE_IMAGE, "Save image to file")
++DEFUN(svI, SAVE_IMAGE, "Save inline image")
+ {
+ CurrentKeyData = NULL; /* not allowed in w3m-control: */
+ do_download = TRUE;
+@@ -4400,7 +4517,7 @@ DEFUN(svI, SAVE_IMAGE, "Save image to file")
+ }
+
+ /* save buffer */
+-DEFUN(svBuf, PRINT SAVE_SCREEN, "Save rendered document to file")
++DEFUN(svBuf, PRINT SAVE_SCREEN, "Save rendered document")
+ {
+ char *qfile = NULL, *file;
+ FILE *f;
+@@ -4449,7 +4566,7 @@ DEFUN(svBuf, PRINT SAVE_SCREEN, "Save rendered document to file")
+ }
+
+ /* save source */
+-DEFUN(svSrc, DOWNLOAD SAVE, "Save document source to file")
++DEFUN(svSrc, DOWNLOAD SAVE, "Save document source")
+ {
+ char *file;
+
+@@ -4510,8 +4627,7 @@ _peekURL(int only_img)
+ s = parsedURL2Str(&pu);
+ }
+ if (DecodeURL)
+- s = Strnew_charp(url_unquote_conv
+- (s->ptr, Currentbuf->document_charset));
++ s = Strnew_charp(url_decode2(s->ptr, Currentbuf));
+ #ifdef USE_M17N
+ s = checkType(s, &pp, NULL);
+ p = NewAtom_N(Lineprop, s->length);
+@@ -4529,13 +4645,13 @@ _peekURL(int only_img)
+ }
+
+ /* peek URL */
+-DEFUN(peekURL, PEEK_LINK, "Peek link URL")
++DEFUN(peekURL, PEEK_LINK, "Show target address")
+ {
+ _peekURL(0);
+ }
+
+ /* peek URL of image */
+-DEFUN(peekIMG, PEEK_IMG, "Peek image URL")
++DEFUN(peekIMG, PEEK_IMG, "Show image address")
+ {
+ _peekURL(1);
+ }
+@@ -4549,7 +4665,7 @@ currentURL(void)
+ return parsedURL2Str(&Currentbuf->currentURL);
+ }
+
+-DEFUN(curURL, PEEK, "Peek current URL")
++DEFUN(curURL, PEEK, "Show current address")
+ {
+ static Str s = NULL;
+ #ifdef USE_M17N
+@@ -4570,7 +4686,7 @@ DEFUN(curURL, PEEK, "Peek current URL")
+ offset = 0;
+ s = currentURL();
+ if (DecodeURL)
+- s = Strnew_charp(url_unquote_conv(s->ptr, 0));
++ s = Strnew_charp(url_decode2(s->ptr, NULL));
+ #ifdef USE_M17N
+ s = checkType(s, &pp, NULL);
+ p = NewAtom_N(Lineprop, s->length);
+@@ -4588,7 +4704,7 @@ DEFUN(curURL, PEEK, "Peek current URL")
+ }
+ /* view HTML source */
+
+-DEFUN(vwSrc, SOURCE VIEW, "View HTML source")
++DEFUN(vwSrc, SOURCE VIEW, "Toggle between HTML shown or processed")
+ {
+ Buffer *buf;
+
+@@ -4679,7 +4795,7 @@ DEFUN(vwSrc, SOURCE VIEW, "View HTML source")
+ }
+
+ /* reload */
+-DEFUN(reload, RELOAD, "Reload buffer")
++DEFUN(reload, RELOAD, "Load current document anew")
+ {
+ Buffer *buf, *fbuf = NULL, sbuf;
+ #ifdef USE_M17N
+@@ -4804,7 +4920,7 @@ DEFUN(reload, RELOAD, "Reload buffer")
+ }
+
+ /* reshape */
+-DEFUN(reshape, RESHAPE, "Re-render buffer")
++DEFUN(reshape, RESHAPE, "Re-render document")
+ {
+ Currentbuf->need_reshape = TRUE;
+ reshapeBuffer(Currentbuf);
+@@ -4846,7 +4962,7 @@ change_charset(struct parsed_tagarg *arg)
+ _docCSet(charset);
+ }
+
+-DEFUN(docCSet, CHARSET, "Change the current document charset")
++DEFUN(docCSet, CHARSET, "Change the character encoding for the current document")
+ {
+ char *cs;
+ wc_ces charset;
+@@ -4864,7 +4980,7 @@ DEFUN(docCSet, CHARSET, "Change the current document charset")
+ _docCSet(charset);
+ }
+
+-DEFUN(defCSet, DEFAULT_CHARSET, "Change the default document charset")
++DEFUN(defCSet, DEFAULT_CHARSET, "Change the default character encoding")
+ {
+ char *cs;
+ wc_ces charset;
+@@ -4915,13 +5031,13 @@ chkURLBuffer(Buffer *buf)
+ buf->check_url |= CHK_URL;
+ }
+
+-DEFUN(chkURL, MARK_URL, "Mark URL-like strings as anchors")
++DEFUN(chkURL, MARK_URL, "Turn URL-like strings into hyperlinks")
+ {
+ chkURLBuffer(Currentbuf);
+ displayBuffer(Currentbuf, B_FORCE_REDRAW);
+ }
+
+-DEFUN(chkWORD, MARK_WORD, "Mark current word as anchor")
++DEFUN(chkWORD, MARK_WORD, "Turn current word into hyperlink")
+ {
+ char *p;
+ int spos, epos;
+@@ -4948,15 +5064,15 @@ chkNMIDBuffer(Buffer *buf)
+ buf->check_url |= CHK_NMID;
+ }
+
+-DEFUN(chkNMID, MARK_MID, "Mark Message-ID-like strings as anchors")
++DEFUN(chkNMID, MARK_MID, "Turn Message-ID-like strings into hyperlinks")
+ {
+ chkNMIDBuffer(Currentbuf);
+ displayBuffer(Currentbuf, B_FORCE_REDRAW);
+ }
+ #endif /* USE_NNTP */
+
+-/* render frame */
+-DEFUN(rFrame, FRAME, "Render frame")
++/* render frames */
++DEFUN(rFrame, FRAME, "Toggle rendering HTML frames")
+ {
+ Buffer *buf;
+
+@@ -5010,6 +5126,24 @@ invoke_browser(char *url)
+ case 3:
+ browser = ExtBrowser3;
+ break;
++ case 4:
++ browser = ExtBrowser4;
++ break;
++ case 5:
++ browser = ExtBrowser5;
++ break;
++ case 6:
++ browser = ExtBrowser6;
++ break;
++ case 7:
++ browser = ExtBrowser7;
++ break;
++ case 8:
++ browser = ExtBrowser8;
++ break;
++ case 9:
++ browser = ExtBrowser9;
++ break;
+ }
+ if (browser == NULL || *browser == '\0') {
+ browser = inputStr("Browse command: ", NULL);
+@@ -5038,7 +5172,7 @@ invoke_browser(char *url)
+ displayBuffer(Currentbuf, B_FORCE_REDRAW);
+ }
+
+-DEFUN(extbrz, EXTERN, "Execute external browser")
++DEFUN(extbrz, EXTERN, "Display using an external browser")
+ {
+ if (Currentbuf->bufferprop & BP_INTERNAL) {
+ /* FIXME: gettextize? */
+@@ -5055,7 +5189,7 @@ DEFUN(extbrz, EXTERN, "Execute external browser")
+ invoke_browser(parsedURL2Str(&Currentbuf->currentURL)->ptr);
+ }
+
+-DEFUN(linkbrz, EXTERN_LINK, "View current link using external browser")
++DEFUN(linkbrz, EXTERN_LINK, "Display target using an external browser")
+ {
+ Anchor *a;
+ ParsedURL pu;
+@@ -5070,7 +5204,7 @@ DEFUN(linkbrz, EXTERN_LINK, "View current link using external browser")
+ }
+
+ /* show current line number and number of lines in the entire document */
+-DEFUN(curlno, LINE_INFO, "Show current line number")
++DEFUN(curlno, LINE_INFO, "Display current position in document")
+ {
+ Line *l = Currentbuf->currentLine;
+ Str tmp;
+@@ -5362,7 +5496,7 @@ process_mouse(int btn, int x, int y)
+ }
+ }
+
+-DEFUN(msToggle, MOUSE_TOGGLE, "Toggle activity of mouse")
++DEFUN(msToggle, MOUSE_TOGGLE, "Toggle mouse support")
+ {
+ if (use_mouse) {
+ use_mouse = FALSE;
+@@ -5398,6 +5532,60 @@ DEFUN(mouse, MOUSE, "mouse operation")
+ process_mouse(btn, x, y);
+ }
+
++DEFUN(sgrmouse, SGRMOUSE, "SGR 1006 mouse operation")
++{
++ int btn = 0, x = 0, y = 0;
++ unsigned char c;
++
++ do {
++ c = getch();
++ if (IS_DIGIT(c))
++ btn = btn * 10 + c - '0';
++ else if (c == ';')
++ break;
++ else
++ return;
++ } while (1);
++
++#if defined(__CYGWIN__) && CYGWIN_VERSION_DLL_MAJOR < 1005
++ if (cygwin_mouse_btn_swapped) {
++ if (btn == MOUSE_BTN2_DOWN)
++ btn = MOUSE_BTN3_DOWN;
++ else if (btn == MOUSE_BTN3_DOWN)
++ btn = MOUSE_BTN2_DOWN;
++ };
++#endif
++
++ do {
++ c = getch();
++ if (IS_DIGIT(c))
++ x = x * 10 + c - '0';
++ else if (c == ';')
++ break;
++ else
++ return;
++ } while (1);
++ if (x>0) x--;
++
++ do {
++ c = getch();
++ if (IS_DIGIT(c))
++ y = y * 10 + c - '0';
++ else if (c == 'M')
++ break;
++ else if (c == 'm') {
++ btn |= 3;
++ break;
++ } else
++ return;
++ } while (1);
++ if (y>0) y--;
++
++ if (x < 0 || x >= COLS || y < 0 || y > LASTLINE)
++ return;
++ process_mouse(btn, x, y);
++}
++
+ #ifdef USE_GPM
+ int
+ gpm_process_mouse(Gpm_Event * event, void *data)
+@@ -5451,7 +5639,7 @@ sysm_process_mouse(int x, int y, int nbs, int obs)
+ }
+ #endif /* USE_SYSMOUSE */
+
+-DEFUN(movMs, MOVE_MOUSE, "Move cursor to mouse cursor (for mouse action)")
++DEFUN(movMs, MOVE_MOUSE, "Move cursor to mouse pointer")
+ {
+ if (!mouse_action.in_action)
+ return;
+@@ -5473,7 +5661,7 @@ DEFUN(movMs, MOVE_MOUSE, "Move cursor to mouse cursor (for mouse action)")
+ #define FRAME_WIDTH 1
+ #endif
+
+-DEFUN(menuMs, MENU_MOUSE, "Popup menu at mouse cursor (for mouse action)")
++DEFUN(menuMs, MENU_MOUSE, "Pop up menu at mouse pointer")
+ {
+ if (!mouse_action.in_action)
+ return;
+@@ -5490,7 +5678,7 @@ DEFUN(menuMs, MENU_MOUSE, "Popup menu at mouse cursor (for mouse action)")
+ }
+ #endif
+
+-DEFUN(tabMs, TAB_MOUSE, "Move to tab on mouse cursor (for mouse action)")
++DEFUN(tabMs, TAB_MOUSE, "Select tab by mouse action")
+ {
+ TabBuffer *tab;
+
+@@ -5503,8 +5691,7 @@ DEFUN(tabMs, TAB_MOUSE, "Move to tab on mouse cursor (for mouse action)")
+ displayBuffer(Currentbuf, B_FORCE_REDRAW);
+ }
+
+-DEFUN(closeTMs, CLOSE_TAB_MOUSE,
+- "Close tab on mouse cursor (for mouse action)")
++DEFUN(closeTMs, CLOSE_TAB_MOUSE, "Close tab at mouse pointer")
+ {
+ TabBuffer *tab;
+
+@@ -5518,12 +5705,12 @@ DEFUN(closeTMs, CLOSE_TAB_MOUSE,
+ }
+ #endif /* USE_MOUSE */
+
+-DEFUN(dispVer, VERSION, "Display version of w3m")
++DEFUN(dispVer, VERSION, "Display the version of w3m")
+ {
+ disp_message(Sprintf("w3m version %s", w3m_version)->ptr, TRUE);
+ }
+
+-DEFUN(wrapToggle, WRAP_TOGGLE, "Toggle wrap search mode")
++DEFUN(wrapToggle, WRAP_TOGGLE, "Toggle wrapping mode in searches")
+ {
+ if (WrapSearch) {
+ WrapSearch = FALSE;
+@@ -5604,7 +5791,7 @@ execdict(char *word)
+ disp_message("Execution failed", TRUE);
+ return;
+ }
+- else {
++ else if (buf != NO_BUFFER) {
+ buf->filename = w;
+ buf->buffername = Sprintf("%s %s", DICTBUFFERNAME, word)->ptr;
+ if (buf->type == NULL)
+@@ -5671,7 +5858,7 @@ set_buffer_environ(Buffer *buf)
+ set_environ("W3M_CURRENT_FORM", form2str((FormItemList *)a->url));
+ else
+ set_environ("W3M_CURRENT_FORM", "");
+- set_environ("W3M_CURRENT_LINE", Sprintf("%d",
++ set_environ("W3M_CURRENT_LINE", Sprintf("%ld",
+ l->real_linenumber)->ptr);
+ set_environ("W3M_CURRENT_COLUMN", Sprintf("%d",
+ buf->currentColumn +
+@@ -5747,8 +5934,14 @@ deleteFiles()
+ Firstbuf = buf;
+ }
+ }
+- while ((f = popText(fileToDelete)) != NULL)
++ while ((f = popText(fileToDelete)) != NULL) {
+ unlink(f);
++ if (enable_inline_image == 2 && strcmp(f+strlen(f)-4, ".gif") == 0) {
++ Str firstframe = Strnew_charp(f);
++ Strcat_charp(firstframe, "-1");
++ unlink(firstframe->ptr);
++ }
++ }
+ }
+
+ void
+@@ -5772,7 +5965,7 @@ w3m_exit(int i)
+ exit(i);
+ }
+
+-DEFUN(execCmd, COMMAND, "Execute w3m command(s)")
++DEFUN(execCmd, COMMAND, "Invoke w3m function(s)")
+ {
+ char *data, *p;
+ int cmd;
+@@ -5900,7 +6093,7 @@ setAlarmEvent(AlarmEvent * event, int sec, short status, int cmd, void *data)
+ }
+ #endif
+
+-DEFUN(reinit, REINIT, "Reload configuration files")
++DEFUN(reinit, REINIT, "Reload configuration file")
+ {
+ char *resource = searchKeyData();
+
+@@ -5969,8 +6162,7 @@ DEFUN(reinit, REINIT, "Reload configuration files")
+ ptr, FALSE);
+ }
+
+-DEFUN(defKey, DEFINE_KEY,
+- "Define a binding between a key stroke and a user command")
++DEFUN(defKey, DEFINE_KEY, "Define a binding between a key stroke combination and a command")
+ {
+ char *data;
+
+@@ -6031,7 +6223,7 @@ _newT(void)
+ nTab++;
+ }
+
+-DEFUN(newT, NEW_TAB, "Open new tab")
++DEFUN(newT, NEW_TAB, "Open a new tab (with current document)")
+ {
+ _newT();
+ displayBuffer(Currentbuf, B_REDRAW_IMAGE);
+@@ -6142,7 +6334,7 @@ deleteTab(TabBuffer * tab)
+ return FirstTab;
+ }
+
+-DEFUN(closeT, CLOSE_TAB, "Close current tab")
++DEFUN(closeT, CLOSE_TAB, "Close tab")
+ {
+ TabBuffer *tab;
+
+@@ -6157,7 +6349,7 @@ DEFUN(closeT, CLOSE_TAB, "Close current tab")
+ displayBuffer(Currentbuf, B_REDRAW_IMAGE);
+ }
+
+-DEFUN(nextT, NEXT_TAB, "Move to next tab")
++DEFUN(nextT, NEXT_TAB, "Switch to the next tab")
+ {
+ int i;
+
+@@ -6172,7 +6364,7 @@ DEFUN(nextT, NEXT_TAB, "Move to next tab")
+ displayBuffer(Currentbuf, B_REDRAW_IMAGE);
+ }
+
+-DEFUN(prevT, PREV_TAB, "Move to previous tab")
++DEFUN(prevT, PREV_TAB, "Switch to the previous tab")
+ {
+ int i;
+
+@@ -6236,7 +6428,7 @@ followTab(TabBuffer * tab)
+ displayBuffer(Currentbuf, B_FORCE_REDRAW);
+ }
+
+-DEFUN(tabA, TAB_LINK, "Open current link on new tab")
++DEFUN(tabA, TAB_LINK, "Follow current hyperlink in a new tab")
+ {
+ followTab(prec_num ? numTab(PREC_NUM) : NULL);
+ }
+@@ -6277,13 +6469,13 @@ tabURL0(TabBuffer * tab, char *prompt, int relative)
+ displayBuffer(Currentbuf, B_FORCE_REDRAW);
+ }
+
+-DEFUN(tabURL, TAB_GOTO, "Open URL on new tab")
++DEFUN(tabURL, TAB_GOTO, "Open specified document in a new tab")
+ {
+ tabURL0(prec_num ? numTab(PREC_NUM) : NULL,
+ "Goto URL on new tab: ", FALSE);
+ }
+
+-DEFUN(tabrURL, TAB_GOTO_RELATIVE, "Open relative URL on new tab")
++DEFUN(tabrURL, TAB_GOTO_RELATIVE, "Open relative address in a new tab")
+ {
+ tabURL0(prec_num ? numTab(PREC_NUM) : NULL,
+ "Goto relative URL on new tab: ", TRUE);
+@@ -6328,7 +6520,7 @@ moveTab(TabBuffer * t, TabBuffer * t2, int right)
+ displayBuffer(Currentbuf, B_FORCE_REDRAW);
+ }
+
+-DEFUN(tabR, TAB_RIGHT, "Move current tab right")
++DEFUN(tabR, TAB_RIGHT, "Move right along the tab bar")
+ {
+ TabBuffer *tab;
+ int i;
+@@ -6338,7 +6530,7 @@ DEFUN(tabR, TAB_RIGHT, "Move current tab right")
+ moveTab(CurrentTab, tab ? tab : LastTab, TRUE);
+ }
+
+-DEFUN(tabL, TAB_LEFT, "Move current tab left")
++DEFUN(tabL, TAB_LEFT, "Move left along the tab bar")
+ {
+ TabBuffer *tab;
+ int i;
+@@ -6547,7 +6739,7 @@ stopDownload(void)
+ }
+
+ /* download panel */
+-DEFUN(ldDL, DOWNLOAD_LIST, "Display download list panel")
++DEFUN(ldDL, DOWNLOAD_LIST, "Display downloads panel")
+ {
+ Buffer *buf;
+ int replace = FALSE, new_tab = FALSE;
+diff --git a/map.c b/map.c
+index 90aa35a..bb240ea 100644
+--- a/map.c
++++ b/map.c
+@@ -279,7 +279,7 @@ follow_map_panel(Buffer *buf, char *name)
+ p = parsedURL2Str(&pu)->ptr;
+ q = html_quote(p);
+ if (DecodeURL)
+- p = html_quote(url_unquote_conv(p, buf->document_charset));
++ p = html_quote(url_decode2(p, buf));
+ else
+ p = q;
+ Strcat_m_charp(mappage, "<tr valign=top><td><a href=\"", q, "\">",
+@@ -417,10 +417,7 @@ append_map_info(Buffer *buf, Str tmp, FormItemList *fi)
+ continue;
+ parseURL2(a->url, &pu, baseURL(buf));
+ q = html_quote(parsedURL2Str(&pu)->ptr);
+- if (DecodeURL)
+- p = html_quote(url_unquote_conv(a->url, buf->document_charset));
+- else
+- p = html_quote(a->url);
++ p = html_quote(url_decode2(a->url, buf));
+ Strcat_m_charp(tmp, "<tr valign=top><td> <td><a href=\"",
+ q, "\">",
+ html_quote(*a->alt ? a->alt : mybasename(a->url)),
+@@ -457,10 +454,8 @@ append_link_info(Buffer *buf, Str html, LinkList * link)
+ Strcat_charp(html, "[Rev]");
+ if (!l->url)
+ url = "(empty)";
+- else if (DecodeURL)
+- url = html_quote(url_unquote_conv(l->url, buf->document_charset));
+ else
+- url = html_quote(l->url);
++ url = html_quote(url_decode2(l->url, buf));
+ Strcat_m_charp(html, "<td>", url, NULL);
+ if (l->ctype)
+ Strcat_m_charp(html, " (", html_quote(l->ctype), ")", NULL);
+@@ -498,8 +493,7 @@ append_frame_info(Buffer *buf, Str html, struct frameset *set, int level)
+ Strcat_charp(html, p);
+ }
+ if (DecodeURL)
+- p = html_quote(url_unquote_conv(frame.body->url,
+- buf->document_charset));
++ p = html_quote(url_decode2(frame.body->url, buf));
+ else
+ p = q;
+ Strcat_m_charp(html, " ", p, "</a></pre_int><br>\n", NULL);
+@@ -550,9 +544,7 @@ page_info_panel(Buffer *buf)
+ #ifdef USE_M17N
+ Strcat_charp(tmp, "<form method=internal action=charset>");
+ #endif
+- p = parsedURL2Str(&buf->currentURL)->ptr;
+- if (DecodeURL)
+- p = url_unquote_conv(p, 0);
++ p = url_decode2(parsedURL2Str(&buf->currentURL)->ptr, NULL);
+ Strcat_m_charp(tmp, "<table cellpadding=0>",
+ "<tr valign=top><td nowrap>Title<td>",
+ html_quote(buf->buffername),
+@@ -581,7 +573,7 @@ page_info_panel(Buffer *buf)
+ "<tr valign=top><td nowrap>Number of lines<td>",
+ Sprintf("%d", all)->ptr,
+ "<tr valign=top><td nowrap>Transferred bytes<td>",
+- Sprintf("%d", buf->trbyte)->ptr, NULL);
++ Sprintf("%lu", (unsigned long)buf->trbyte)->ptr, NULL);
+
+ a = retrieveCurrentAnchor(buf);
+ if (a != NULL) {
+@@ -589,7 +581,7 @@ page_info_panel(Buffer *buf)
+ p = parsedURL2Str(&pu)->ptr;
+ q = html_quote(p);
+ if (DecodeURL)
+- p = html_quote(url_unquote_conv(p, buf->document_charset));
++ p = html_quote(url_decode2(p, buf));
+ else
+ p = q;
+ Strcat_m_charp(tmp,
+@@ -602,7 +594,7 @@ page_info_panel(Buffer *buf)
+ p = parsedURL2Str(&pu)->ptr;
+ q = html_quote(p);
+ if (DecodeURL)
+- p = html_quote(url_unquote_conv(p, buf->document_charset));
++ p = html_quote(url_decode2(p, buf));
+ else
+ p = q;
+ Strcat_m_charp(tmp,
+@@ -613,10 +605,7 @@ page_info_panel(Buffer *buf)
+ if (a != NULL) {
+ FormItemList *fi = (FormItemList *)a->url;
+ p = form2str(fi);
+- if (DecodeURL)
+- p = html_quote(url_unquote_conv(p, buf->document_charset));
+- else
+- p = html_quote(p);
++ p = html_quote(url_decode2(p, buf));
+ Strcat_m_charp(tmp,
+ "<tr valign=top><td nowrap>Method/type of current form <td>",
+ p, NULL);
+diff --git a/matrix.c b/matrix.c
+index 64fd0ad..bc7a5be 100644
+--- a/matrix.c
++++ b/matrix.c
+@@ -34,18 +34,12 @@
+
+ #include "config.h"
+ #include "matrix.h"
+-#include <gc.h>
++#include "alloc.h"
+
+ /*
+ * Macros from "fm.h".
+ */
+
+-#define New(type) ((type*)GC_MALLOC(sizeof(type)))
+-#define NewAtom(type) ((type*)GC_MALLOC_ATOMIC(sizeof(type)))
+-#define New_N(type,n) ((type*)GC_MALLOC((n)*sizeof(type)))
+-#define NewAtom_N(type,n) ((type*)GC_MALLOC_ATOMIC((n)*sizeof(type)))
+-#define Renew_N(type,ptr,n) ((type*)GC_REALLOC((ptr),(n)*sizeof(type)))
+-
+ #define SWAPD(a,b) { double tmp = a; a = b; b = tmp; }
+ #define SWAPI(a,b) { int tmp = a; a = b; b = tmp; }
+
+diff --git a/menu.c b/menu.c
+index 774b1bd..01acc31 100644
+--- a/menu.c
++++ b/menu.c
+@@ -57,6 +57,7 @@ static int mCancel(char c);
+ static int mClose(char c);
+ static int mSusp(char c);
+ static int mMouse(char c);
++static int mSgrMouse(char c);
+ static int mSrchF(char c);
+ static int mSrchB(char c);
+ static int mSrchN(char c);
+@@ -116,15 +117,15 @@ static int (*MenuEscKeymap[128]) (char c) = {
+ mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
+
+ mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
+-/* O */
++/* O */
+ mNull, mNull, mNull, mNull, mNull, mNull, mNull, mEscB,
+ mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
+-/* [ */
++/* [ */
+ mNull, mNull, mNull, mEscB, mNull, mNull, mNull, mNull,
+
+ mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
+ mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
+-/* v */
++/* v */
+ mNull, mNull, mNull, mNull, mNull, mNull, mPrev, mNull,
+ mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
+ };
+@@ -137,10 +138,11 @@ static int (*MenuEscBKeymap[128]) (char c) = {
+ mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
+ mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
+ mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
+- mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
+-/* A B C D E */
++/* 8 9 : ; < = > ? */
++ mNull, mNull, mNull, mNull, mSgrMouse,mNull,mNull, mNull,
++/* A B C D E */
+ mNull, mUp, mDown, mOk, mCancel,mClose, mNull, mNull,
+-/* L M */
++/* L M */
+ mNull, mNull, mNull, mNull, mClose, mMouse, mNull, mNull,
+ mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
+ mNull, mNull, mNull, mNull, mNull, mNull, mNull, mNull,
+@@ -359,7 +361,6 @@ geom_menu(Menu *menu, int x, int y, int mselect)
+ if (win_w > COLS) {
+ menu->width = COLS - 2 * FRAME_WIDTH;
+ menu->width -= menu->width % FRAME_WIDTH;
+- win_w = menu->width + 2 * FRAME_WIDTH;
+ }
+ }
+ menu->x = win_x + FRAME_WIDTH;
+@@ -1203,6 +1204,48 @@ mMouse(char c)
+ return process_mMouse(btn, x, y);
+ }
+
++static int
++mSgrMouse(char c)
++{
++ int btn = 0, x = 0, y = 0;
++ unsigned char ch;
++
++ for (ch = getch(); IS_DIGIT(ch); ch = getch())
++ btn = btn * 10 + ch - '0';
++ if (ch != ';')
++ return MENU_NOTHING;
++
++#if defined (__CYGWIN__) && CYGWIN_VERSION_DLL_MAJOR < 1005
++ if (cygwin_mouse_btn_swapped) {
++ if (btn == MOUSE_BTN2_DOWN)
++ btn = MOUSE_BTN3_DOWN;
++ else if (btn == MOUSE_BTN3_DOWN)
++ btn = MOUSE_BTN2_DOWN;
++ }
++#endif
++
++ for (ch = getch(); IS_DIGIT(ch); ch = getch())
++ x = x * 10 + ch - '0';
++ if (ch != ';')
++ return MENU_NOTHING;
++ if (x > 0)
++ x--;
++
++ for (ch = getch(); IS_DIGIT(ch); ch = getch())
++ y = y * 10 + ch - '0';
++ if (ch == 'm')
++ btn |= 3;
++ else if (ch != 'M' && ch != ';')
++ return MENU_NOTHING;
++ if (y > 0)
++ y--;
++
++ if (x < 0 || x >= COLS || y < 0 || y > LASTLINE)
++ return MENU_NOTHING;
++
++ return process_mMouse(btn, x, y);
++}
++
+ #ifdef USE_GPM
+ static int
+ gpm_process_menu_mouse(Gpm_Event * event, void *data)
+@@ -1261,6 +1304,12 @@ mMouse(char c)
+ {
+ return (MENU_NOTHING);
+ }
++
++static int
++mSgrMouse(char c)
++{
++ return (MENU_NOTHING);
++}
+ #endif /* not USE_MOUSE */
+
+ /* --- MenuFunctions (END) --- */
+@@ -1289,7 +1338,7 @@ mainMenu(int x, int y)
+ popupMenu(x, y, &MainMenu);
+ }
+
+-DEFUN(mainMn, MAIN_MENU MENU, "Popup menu")
++DEFUN(mainMn, MAIN_MENU MENU, "Pop up menu")
+ {
+ Menu *menu = &MainMenu;
+ char *data;
+@@ -1317,7 +1366,7 @@ DEFUN(mainMn, MAIN_MENU MENU, "Popup menu")
+
+ /* --- SelectMenu --- */
+
+-DEFUN(selMn, SELECT_MENU, "Popup buffer selection menu")
++DEFUN(selMn, SELECT_MENU, "Pop up buffer-stack menu")
+ {
+ int x = Currentbuf->cursorX + Currentbuf->rootX,
+ y = Currentbuf->cursorY + Currentbuf->rootY;
+@@ -1365,9 +1414,7 @@ initSelectMenu(void)
+ break;
+ default:
+ Strcat_char(str, ' ');
+- p = parsedURL2Str(&buf->currentURL)->ptr;
+- if (DecodeURL)
+- p = url_unquote_conv(p, 0);
++ p = url_decode2(parsedURL2Str(&buf->currentURL)->ptr, NULL);
+ Strcat_charp(str, p);
+ break;
+ }
+@@ -1464,7 +1511,7 @@ smDelBuf(char c)
+
+ /* --- SelTabMenu --- */
+
+-DEFUN(tabMn, TAB_MENU, "Popup tab selection menu")
++DEFUN(tabMn, TAB_MENU, "Pop up tab selection menu")
+ {
+ int x = Currentbuf->cursorX + Currentbuf->rootX,
+ y = Currentbuf->cursorY + Currentbuf->rootY;
+@@ -1513,9 +1560,7 @@ initSelTabMenu(void)
+ case SCM_MISSING:
+ break;
+ default:
+- p = parsedURL2Str(&buf->currentURL)->ptr;
+- if (DecodeURL)
+- p = url_unquote_conv(p, 0);
++ p = url_decode2(parsedURL2Str(&buf->currentURL)->ptr, NULL);
+ Strcat_charp(str, p);
+ break;
+ }
+@@ -1845,10 +1890,8 @@ link_menu(Buffer *buf)
+ Strcat_charp(str, " ");
+ if (!l->url)
+ p = "";
+- else if (DecodeURL)
+- p = url_unquote_conv(l->url, buf->document_charset);
+ else
+- p = l->url;
++ p = url_decode2(l->url, buf);
+ Strcat_charp(str, p);
+ label[i] = str->ptr;
+ if (len < str->length)
+@@ -1913,6 +1956,7 @@ accesskey_menu(Buffer *buf)
+ }
+ label[nitem] = NULL;
+
++ set_menu_frame();
+ new_option_menu(&menu, label, &key, NULL);
+
+ menu.initial = 0;
+@@ -2025,7 +2069,6 @@ list_menu(Buffer *buf)
+ label[nitem] = NULL;
+
+ set_menu_frame();
+- set_menu_frame();
+ new_option_menu(&menu, label, &key, NULL);
+
+ menu.initial = 0;
+diff --git a/mimehead.c b/mimehead.c
+index 78997e0..d16270c 100644
+--- a/mimehead.c
++++ b/mimehead.c
+@@ -64,12 +64,22 @@ ha2d(char x, char y)
+ Str
+ decodeB(char **ww)
+ {
++ struct growbuf gb;
++
++ growbuf_init(&gb);
++ decodeB_to_growbuf(&gb, ww);
++ return growbuf_to_Str(&gb);
++}
++
++void
++decodeB_to_growbuf(struct growbuf *gb, char **ww)
++{
+ unsigned char c[4];
+ char *wp = *ww;
+ char d[3];
+ int i, n_pad;
+- Str ap = Strnew_size(strlen(wp));
+
++ growbuf_reserve(gb, strlen(wp) + 1);
+ n_pad = 0;
+ while (1) {
+ for (i = 0; i < 4; i++) {
+@@ -93,39 +103,50 @@ decodeB(char **ww)
+ for (i = 0; i < 4; i++) {
+ c[i] = c2e(c[i]);
+ if (c[i] == BAD_BASE64) {
+- *ww = wp;
+- return ap;
++ goto last;
+ }
+ }
+ d[0] = ((c[0] << 2) | (c[1] >> 4));
+ d[1] = ((c[1] << 4) | (c[2] >> 2));
+ d[2] = ((c[2] << 6) | c[3]);
+ for (i = 0; i < 3 - n_pad; i++) {
+- Strcat_char(ap, d[i]);
++ GROWBUF_ADD_CHAR(gb, d[i]);
+ }
+ if (n_pad || *wp == '\0' || *wp == '?')
+ break;
+ }
++last:
++ growbuf_reserve(gb, gb->length + 1);
++ gb->ptr[gb->length] = '\0';
+ *ww = wp;
+- return ap;
++ return;
+ }
+
+ Str
+ decodeU(char **ww)
+ {
++ struct growbuf gb;
++
++ growbuf_init(&gb);
++ decodeU_to_growbuf(&gb, ww);
++ return growbuf_to_Str(&gb);
++}
++
++void
++decodeU_to_growbuf(struct growbuf *gb, char **ww)
++{
+ unsigned char c1, c2;
+ char *w = *ww;
+ int n, i;
+- Str a;
+
+ if (*w <= 0x20 || *w >= 0x60)
+- return Strnew_size(0);
++ return;
+ n = *w - 0x20;
+- a = Strnew_size(n);
++ growbuf_reserve(gb, n + 1);
+ for (w++, i = 2; *w != '\0' && n; n--) {
+ c1 = (w[0] - 0x20) % 0x40;
+ c2 = (w[1] - 0x20) % 0x40;
+- Strcat_char(a, (c1 << i) | (c2 >> (6 - i)));
++ gb->ptr[gb->length++] = (c1 << i) | (c2 >> (6 - i));
+ if (i == 6) {
+ w += 2;
+ i = 2;
+@@ -135,7 +156,8 @@ decodeU(char **ww)
+ i += 2;
+ }
+ }
+- return a;
++ gb->ptr[gb->length] = '\0';
++ return;
+ }
+
+ /* RFC2047 (4.2. The "Q" encoding) */
+@@ -165,9 +187,19 @@ decodeQ(char **ww)
+ Str
+ decodeQP(char **ww)
+ {
++ struct growbuf gb;
++
++ growbuf_init(&gb);
++ decodeQP_to_growbuf(&gb, ww);
++ return growbuf_to_Str(&gb);
++}
++
++void
++decodeQP_to_growbuf(struct growbuf *gb, char **ww)
++{
+ char *w = *ww;
+- Str a = Strnew_size(strlen(w));
+
++ growbuf_reserve(gb, strlen(w) + 1);
+ for (; *w != '\0'; w++) {
+ if (*w == '=') {
+ w++;
+@@ -180,15 +212,16 @@ decodeQP(char **ww)
+ else {
+ if (*w == '\0' || *(w + 1) == '\0')
+ break;
+- Strcat_char(a, ha2d(*w, *(w + 1)));
++ gb->ptr[gb->length++] = ha2d(*w, *(w + 1));
+ w++;
+ }
+ }
+ else
+- Strcat_char(a, *w);
++ gb->ptr[gb->length++] = *w;
+ }
++ gb->ptr[gb->length] = '\0';
+ *ww = w;
+- return a;
++ return;
+ }
+
+ #ifdef USE_M17N
+diff --git a/news.c b/news.c
+index 8a1f0e8..c0494b7 100644
+--- a/news.c
++++ b/news.c
+@@ -76,13 +76,15 @@ news_close(News * news)
+ static int
+ news_open(News * news)
+ {
+- int sock, status;
++ int sock, status, fd;
+
+ sock = openSocket(news->host, "nntp", news->port);
+ if (sock < 0)
+ goto open_err;
+ news->rf = newInputStream(sock);
+- news->wf = fdopen(dup(sock), "wb");
++ if ((fd = dup(sock)) < 0)
++ goto open_err;
++ news->wf = fdopen(fd, "wb");
+ if (!news->rf || !news->wf)
+ goto open_err;
+ IStype(news->rf) |= IST_UNCLOSE;
+diff --git a/parsetagx.c b/parsetagx.c
+index 6b627d2..1cc7048 100644
+--- a/parsetagx.c
++++ b/parsetagx.c
+@@ -120,6 +120,7 @@ parse_tag(char **s, int internal)
+ int i, attr_id = 0, nattr;
+
+ /* Parse tag name */
++ tagname[0] = '\0';
+ q = (*s) + 1;
+ p = tagname;
+ if (*q == '/') {
+@@ -221,6 +222,7 @@ parse_tag(char **s, int internal)
+ int j, hidden=FALSE;
+ for (j=0; j<i; j++) {
+ if (tag->attrid[j] == ATTR_TYPE &&
++ tag->value[j] &&
+ strcmp("hidden",tag->value[j]) == 0) {
+ hidden=TRUE;
+ break;
+diff --git a/po/LINGUAS b/po/LINGUAS
+index 1489115..ddd267b 100644
+--- a/po/LINGUAS
++++ b/po/LINGUAS
+@@ -1,2 +1,2 @@
+ # Set of available languages.
+-ja
++ja de zh_CN zh_TW
+diff --git a/po/Makefile.in.in b/po/Makefile.in.in
+index 83d8838..ef8bd94 100644
+--- a/po/Makefile.in.in
++++ b/po/Makefile.in.in
+@@ -153,14 +153,14 @@ $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed
+ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
+ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
+ --files-from=$(srcdir)/POTFILES.in \
+- --copyright-holder='$(COPYRIGHT_HOLDER)' \
++ --copyright-holder="$(COPYRIGHT_HOLDER)" \
+ --msgid-bugs-address="$$msgid_bugs_address" \
+ ;; \
+ *) \
+ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
+ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
+ --files-from=$(srcdir)/POTFILES.in \
+- --copyright-holder='$(COPYRIGHT_HOLDER)' \
++ --copyright-holder="$(COPYRIGHT_HOLDER)" \
+ --package-name="$${package_gnu}@PACKAGE@" \
+ --package-version='@VERSION@' \
+ --msgid-bugs-address="$$msgid_bugs_address" \
+diff --git a/po/Makevars b/po/Makevars
+index 2f57810..a60a09d 100644
+--- a/po/Makevars
++++ b/po/Makevars
+@@ -18,7 +18,7 @@ XGETTEXT_OPTIONS = --from-code=EUC-JP --keyword=_ --keyword=N_
+ # or entity, or to disclaim their copyright. The empty string stands for
+ # the public domain; in this case the translators are expected to disclaim
+ # their copyright.
+-COPYRIGHT_HOLDER = Fumitoshi UKAI
++COPYRIGHT_HOLDER = THE w3m'S COPYRIGHT HOLDER
+
+ # This is the email address or URL to which the translators shall report
+ # bugs in the untranslated strings:
+diff --git a/po/de.po b/po/de.po
+new file mode 100644
+index 0000000..96489c1
+--- /dev/null
++++ b/po/de.po
+@@ -0,0 +1,936 @@
++# German translation of w3m
++# Copyright (C) 2014 THE w3m'S COPYRIGHT HOLDER
++# This file is distributed under the same license as the w3m package.
++# Markus Hiereth <markus.hiereth@freenet.de>, 2014.
++msgid ""
++msgstr ""
++"Project-Id-Version: w3m 0.5.3\n"
++"Report-Msgid-Bugs-To: satodai@w3m.jp\n"
++"POT-Creation-Date: 2016-03-14 19:47+0900\n"
++"PO-Revision-Date: 2016-03-14 19:51+0900\n"
++"Last-Translator: Tatsuya Kinoshita <tats@debian.org>\n"
++"Language-Team: German <debian-l10n-german@lists.debian.org>\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Virtaal 0.7.1\n"
++
++#: menu.c:269
++msgid " Back (b) "
++msgstr " Zurück (b) "
++
++#: menu.c:270
++msgid " Select Buffer(s) "
++msgstr " Puffer auswählen (s) "
++
++#: menu.c:272
++msgid " Select Tab (t) "
++msgstr " Reiter auswählen (t) "
++
++#: menu.c:274
++msgid " View Source (v) "
++msgstr " Codeansicht (v) "
++
++#: menu.c:275
++msgid " Edit Source (e) "
++msgstr " Code bearbeiten (e) "
++
++#: menu.c:276
++msgid " Save Source (S) "
++msgstr " Code speichern (S) "
++
++#: menu.c:277
++msgid " Reload (r) "
++msgstr " Erneut laden (r) "
++
++#: menu.c:278 menu.c:285 menu.c:289
++msgid " ---------------- "
++msgstr " ---------------------- "
++
++#: menu.c:279
++msgid " Go Link (a) "
++msgstr " Ziel öffnen.. (a) "
++
++#: menu.c:280
++msgid " on New Tab (n) "
++msgstr " ..in neuem Reiter (n) "
++
++#: menu.c:281
++msgid " Save Link (A) "
++msgstr " Ziel speichern (A) "
++
++#: menu.c:282
++msgid " View Image (i) "
++msgstr " Bild anzeigen (i) "
++
++#: menu.c:283
++msgid " Save Image (I) "
++msgstr " Bild speichern (I) "
++
++#: menu.c:284
++msgid " View Frame (f) "
++msgstr " Frames zeigen (f) "
++
++#: menu.c:286
++msgid " Bookmark (B) "
++msgstr " Lesezeichen (B) "
++
++#: menu.c:287
++msgid " Help (h) "
++msgstr " Hilfe (h) "
++
++#: menu.c:288
++msgid " Option (o) "
++msgstr " Einstellungen (o) "
++
++#: menu.c:290
++msgid " Quit (q) "
++msgstr " Programm verlassen (q) "
++
++#: rc.c:62
++msgid "External Viewer Setup"
++msgstr "Konfiguration für externe Anzeigeprogramme"
++
++#: rc.c:63
++msgid "Tab width in characters"
++msgstr "Tabulatorbreite in Zeichen"
++
++#: rc.c:64
++msgid "Indent for HTML rendering"
++msgstr "Einzug bei HTML-Darstellung"
++
++#: rc.c:65
++msgid "Number of pixels per character (4.0...32.0)"
++msgstr "Anzahl von Pixeln pro Zeichen (4.0 bis 32.0)"
++
++#: rc.c:66
++msgid "Number of pixels per line (4.0...64.0)"
++msgstr "Anzahl von Pixeln pro Zeile (4.0 bis 64.0)"
++
++# entsprechend Bescheibung aus MANUAL.html, mh 14.10.2014
++#: rc.c:67
++msgid "Number of remembered lines when used as a pager"
++msgstr "Anzahl gemerkter, über die Standardeingabe erhaltener Zeilen"
++
++#: rc.c:68
++msgid "Use URL history"
++msgstr "URL-Chronik verwenden"
++
++#: rc.c:69
++msgid "Number of remembered URL"
++msgstr "Anzahl von URLs in Chronik"
++
++#: rc.c:70
++msgid "Save URL history"
++msgstr "URL-Chronik speichern"
++
++#: rc.c:71
++msgid "Render frames automatically"
++msgstr "Frames selbstständig darstellen"
++
++#: rc.c:72
++msgid "Treat argument without scheme as URL"
++msgstr "Eingabe ohne Protokoll-Präfix als URL auffassen"
++
++#: rc.c:73
++msgid "Use _self as default target"
++msgstr "_self als Standard-Zielfenster verwenden"
++
++#: rc.c:74
++msgid "Open link on new tab if target is _blank or _new"
++msgstr ""
++"Link in neuem Reiter öffnen, falls für Zielfenster _blank oder _new "
++"definiert ist"
++
++#: rc.c:75
++msgid "Open download list panel on new tab"
++msgstr "Downloadliste in neuem Reiter öffnen"
++
++#: rc.c:76
++msgid "Display link URL automatically"
++msgstr "URL der Links selbstständig anzeigen"
++
++#: rc.c:77
++msgid "Display link numbers"
++msgstr "Linknummern anzeigen"
++
++#: rc.c:78
++msgid "Display decoded URL"
++msgstr "URL entschlüsselt anzeigen"
++
++#: rc.c:79
++msgid "Display current line number"
++msgstr "Aktuelle Zeilennummer anzeigen"
++
++#: rc.c:80
++msgid "Display inline images"
++msgstr "Eingebettete Bilder anzeigen"
++
++#: rc.c:81
++msgid "Display pseudo-ALTs for inline images with no ALT or TITLE string"
++msgstr "Pseudo-ALTs zu eingebetteten Bildern ohne ALT oder TITLE anzeigen"
++
++#: rc.c:83
++msgid "Load inline images automatically"
++msgstr "Eingebettete Bilder selbstständig laden"
++
++#: rc.c:84
++msgid "Maximum processes for parallel image loading"
++msgstr "Anzahl zulässiger Prozesse zum gleichzeitigen Laden von Bildern"
++
++#: rc.c:85
++msgid "Use external image viewer"
++msgstr "Externen Bildbetrachter verwenden"
++
++#: rc.c:86
++msgid "Scale of image (%)"
++msgstr "Bilder prozentual skalieren"
++
++#: rc.c:87
++msgid "External command to display image"
++msgstr "Befehl für externen Bildbetrachter"
++
++#: rc.c:88
++msgid "Use link list of image map"
++msgstr "Bei Grafiken mit eingebetteten Links Ziele auflisten"
++
++#: rc.c:90
++msgid "Display file names in multi-column format"
++msgstr "Dateinamen auf Spalten verteilt anzeigen"
++
++#: rc.c:91
++msgid "Use ASCII equivalents to display entities"
++msgstr "ASCII-Ersatz für in HTML benannte Zeichen verwenden"
++
++#: rc.c:92
++msgid "Character type for border of table and menu"
++msgstr "Zeichen zum Einrahmen von Tabellen und Menüs"
++
++#: rc.c:93
++msgid "Display table borders, ignore value of BORDER"
++msgstr "Zeige Tabellen gerahmt, BORDER-Wert ignorieren"
++
++#: rc.c:94
++msgid "Fold lines in TEXTAREA"
++msgstr "In Eingabefeldern vom Typ TEXTAREA Texte umbrechen"
++
++#: rc.c:95
++msgid "Display INS, DEL, S and STRIKE element"
++msgstr "Umsetzung der Elemente INS, DEL, S und STRIKE"
++
++#: rc.c:96
++msgid "Display with color"
++msgstr "In Farbe anzeigen"
++
++#: rc.c:97
++msgid "Color of normal character"
++msgstr "Farbe für normalen Text"
++
++#: rc.c:98
++msgid "Color of anchor"
++msgstr "Farbe für Links / Element A"
++
++#: rc.c:99
++msgid "Color of image link"
++msgstr "Farbe für Bilder / Element IMG"
++
++#: rc.c:100
++msgid "Color of form"
++msgstr "Farbe für Eingaben / Element INPUT"
++
++#: rc.c:101
++msgid "Enable coloring of active link"
++msgstr "Aktiven Link farblich hervorheben"
++
++#: rc.c:102
++msgid "Color of currently active link"
++msgstr "Farbe des derzeit aktiven Links "
++
++#: rc.c:103
++msgid "Use visited link color"
++msgstr "Besuchte Links farblich hervorheben"
++
++#: rc.c:104
++msgid "Color of visited link"
++msgstr "Farbe für besuchte Links"
++
++#: rc.c:105
++msgid "Color of background"
++msgstr "Hintergrundfarbe"
++
++#: rc.c:106
++msgid "Color of mark"
++msgstr "Farbe für Textmarken"
++
++# msgstr "Farbe für Textmarkierungen"
++#: rc.c:107
++msgid "Use proxy"
++msgstr "Proxy verwenden"
++
++#: rc.c:108
++msgid "URL of HTTP proxy host"
++msgstr "URL des HTTP-Proxy-Hosts"
++
++#: rc.c:110
++msgid "URL of HTTPS proxy host"
++msgstr "URL des HTTPS-Proxy-Hosts"
++
++#: rc.c:113
++msgid "URL of GOPHER proxy host"
++msgstr "URL des GOPHER-Proxy-Hosts"
++
++#: rc.c:115
++msgid "URL of FTP proxy host"
++msgstr "URL des FTP-Proxy-Hosts"
++
++#: rc.c:116
++msgid "Domains to be accessed directly (no proxy)"
++msgstr "Ohne Proxy, direkt zu kontaktierende Domains"
++
++#: rc.c:117
++msgid "Check noproxy by network address"
++msgstr ""
++"Direkten Datentransfer ohne Proxy mittels Netzwerkadresse sicherstellen"
++
++#: rc.c:118
++msgid "Disable cache"
++msgstr "Zwischenspeicherung deaktivieren"
++
++#: rc.c:120
++msgid "News server"
++msgstr "News-Server"
++
++#: rc.c:121
++msgid "Mode of news server"
++msgstr "Modus des News-Servers"
++
++#: rc.c:122
++msgid "Number of news messages"
++msgstr "News-Anzahl"
++
++#: rc.c:124
++msgid "Order of name resolution"
++msgstr "Reihenfolge der Namens-Auflösung"
++
++#: rc.c:125
++msgid "Directory corresponding to / (document root)"
++msgstr "Wurzelverzeichnis für Dokumente (/)"
++
++#: rc.c:126
++msgid "Directory corresponding to /~user"
++msgstr "Pfad zum Benutzerverzeichnis (~)"
++
++#: rc.c:127
++msgid "Directory corresponding to /cgi-bin"
++msgstr "Verzeichnis für ausführbare Skripte (cgi-bin)"
++
++#: rc.c:128
++msgid "Confirm when quitting with q"
++msgstr "Das Programm erst nach Bestätigung verlassen"
++
++#: rc.c:129
++msgid "Close tab if buffer is last when back"
++msgstr "Reiter mit nur einem Puffer auf Zurück-Befehl hin schlieÃen"
++
++#: rc.c:131
++msgid "Enable mark operations"
++msgstr "Arbeit mit Textmarken ermöglichen"
++
++# msgstr "Arbeit mit Textmarkierungen ermöglichen"
++#: rc.c:133
++msgid "Enable Emacs-style line editing"
++msgstr "Zeilen wie in Emacs bearbeiten"
++
++#: rc.c:134
++msgid "Enable vi-like numeric prefix"
++msgstr "Vorangestellte Zahlen wie in vi aktivieren"
++
++#: rc.c:135
++msgid "Move cursor to top line when going to label"
++msgstr "Labels nach Aufsuchen immer oben positionieren"
++
++#: rc.c:136
++msgid "Move cursor to top line when moving to next page"
++msgstr "Beim Umblättern Eingabemarke nach oben setzen"
++
++#: rc.c:137
++msgid "Fold lines of plain text file"
++msgstr "Zeilen in Textdateien umbrechen"
++
++#: rc.c:138
++msgid "Show line numbers"
++msgstr "Zeilennummern anzeigen"
++
++#: rc.c:139
++msgid "Show search string"
++msgstr "Suchbegriff anzeigen"
++
++#: rc.c:140
++msgid "List of mime.types files"
++msgstr "Liste der mime.types-Dateien"
++
++#: rc.c:141
++msgid "List of mailcap files"
++msgstr "Liste der mailcap-Dateien"
++
++#: rc.c:142
++msgid "List of urimethodmap files"
++msgstr "Liste von Dateien mit URI-Methode-Zuordnungen"
++
++#: rc.c:143
++msgid "Editor"
++msgstr "Editor"
++
++#: rc.c:144
++msgid "Mailer"
++msgstr "Mail-Programm"
++
++# korrespondiert mit Pulldown-Menü, daher verkürzt. mh 09.10.2014
++#: rc.c:145
++msgid "How to call Mailer for mailto URLs with options"
++msgstr "Umgang mit mailto-URLs"
++
++#: rc.c:146
++msgid "External browser"
++msgstr "Externer browser"
++
++#: rc.c:147
++msgid "2nd external browser"
++msgstr "Zweiter externer browser"
++
++#: rc.c:148
++msgid "3rd external browser"
++msgstr "Dritter externer browser"
++
++#: rc.c:149
++msgid "4th external browser"
++msgstr "Vierter externer browser"
++
++#: rc.c:150
++msgid "5th external browser"
++msgstr "Fünfter externer browser"
++
++#: rc.c:151
++msgid "6th external browser"
++msgstr "Sechster externer browser"
++
++#: rc.c:152
++msgid "7th external browser"
++msgstr "Siebter externer browser"
++
++#: rc.c:153
++msgid "8th external browser"
++msgstr "Achter externer browser"
++
++#: rc.c:154
++msgid "9th external browser"
++msgstr "Neunter externer browser"
++
++# entsprechend file:///usr/share/doc/w3m/README.passwd
++# Prüfung beanstandete auch passwd_file mit Zugriffbytes 600, mh, 05.10.2014
++#: rc.c:155
++msgid "Disable secret file security check"
++msgstr "Keine Prüfung der Sicherheit bei Dateien mit geheimem Inhalt"
++
++#: rc.c:156
++msgid "Password file"
++msgstr "Passwort-Datei"
++
++#: rc.c:157
++msgid "File for setting form on loading"
++msgstr "Datei mit vordefinierten Eingaben für Formulare"
++
++#: rc.c:158
++msgid "File for preferences for each site"
++msgstr "Datei mit adress-spezifischen Voreinstellungen"
++
++#: rc.c:159
++msgid "Password for anonymous FTP (your mail address)"
++msgstr "Passwort für anonyme FTP-Anmeldung (Ihre Mailadresse)"
++
++#: rc.c:160
++msgid "Generate domain part of password for FTP"
++msgstr "Domain-Teil des FTP-Passwortes erzeugen"
++
++#: rc.c:161
++msgid "User-Agent identification string"
++msgstr "Browserkennung übermitteln"
++
++#: rc.c:162
++msgid "Accept-Encoding header"
++msgstr "Accept-Encoding-Kopfzeile"
++
++#: rc.c:163
++msgid "Accept header"
++msgstr "Accept-Kopfzeile"
++
++#: rc.c:164
++msgid "Accept-Language header"
++msgstr "Accept-Language-Kopfzeile"
++
++#: rc.c:165
++msgid "Treat URL-like strings as links in all pages"
++msgstr "URL-artige Zeichenketten auf allen Seiten als Links auffassen"
++
++#: rc.c:166
++msgid "Wrap search"
++msgstr "Im Dokument umlaufend suchen"
++
++#: rc.c:167
++msgid "Display unseen objects (e.g. bgimage tag)"
++msgstr "Nicht gezeigte Objekte melden (z.B. Hintergrundbild)"
++
++#: rc.c:168
++msgid "Uncompress compressed data automatically when downloading"
++msgstr "Komprimierte Daten beim Download selbstständig dekomprimieren"
++
++# String nicht in Optionen-Menü gefunden. mh, 05.10.2014
++#: rc.c:170
++msgid "Run external viewer in a separate session"
++msgstr "Externe Anzeigeprogramme in eigener Sitzung laufen lassen"
++
++#: rc.c:172
++msgid "Run external viewer in the background"
++msgstr "Externe Anzeigeprogramme im Hintergrund laufen lassen"
++
++#: rc.c:174
++msgid "Use external program for directory listing"
++msgstr "Externes Programm zum Auflisten von Verzeichnissen verwenden"
++
++#: rc.c:175
++msgid "URL of directory listing command"
++msgstr "URL des Befehls zum Auflisten von Verzeichnissen"
++
++#: rc.c:177
++msgid "Enable dictionary lookup through CGI"
++msgstr "Wörterbuchabfrage mittels CGI aktivieren"
++
++#: rc.c:178
++msgid "URL of dictionary lookup command"
++msgstr "URL des Befehls zur Wörterbuch-Abfrage"
++
++#: rc.c:180
++msgid "Display link name for images lacking ALT"
++msgstr "Bei Bildern ohne ALT-Angabe Linkziel anzeigen"
++
++#: rc.c:181
++msgid "Index file for directories"
++msgstr "Indexdatei für Verzeichnisse"
++
++#: rc.c:182
++msgid "Prepend http:// to URL automatically"
++msgstr "Ziel-Eingaben gegebenenfalls http:// voranstellen"
++
++#: rc.c:183
++msgid "Default value for open-URL command"
++msgstr "Vorgabewert bei der Adresseneingabe"
++
++#: rc.c:184
++msgid "Decode Content-Transfer-Encoding when saving"
++msgstr "Beim Speichern entsprechend Content-Transfer-Encoding entschlüsseln"
++
++#: rc.c:185
++msgid "Preserve timestamp when saving"
++msgstr "Zeitstempel beim Speichern erhalten"
++
++#: rc.c:187
++msgid "Enable mouse"
++msgstr "Maus aktivieren"
++
++#: rc.c:188
++msgid "Scroll in reverse direction of mouse drag"
++msgstr "Mausbewegungen entgegengesetzt scrollen"
++
++#: rc.c:189
++msgid "Behavior of wheel scroll speed"
++msgstr "Umsetzung der Mausradbewegung"
++
++#: rc.c:190
++msgid "(A only)Scroll by # (%) of screen"
++msgstr "(nur A) Um # % des Fensters scrollen"
++
++#: rc.c:191
++msgid "(B only)Scroll by # lines"
++msgstr "(nur B) Um # Zeilen scrollen"
++
++#: rc.c:193
++msgid "Free memory of undisplayed buffers"
++msgstr "Speicherplatz nicht angezeigter Puffer freigeben"
++
++#: rc.c:194
++msgid "Suppress `Referer:' header"
++msgstr "Referer-Kopfzeile unterdrücken"
++
++#: rc.c:195
++msgid "Search case-insensitively"
++msgstr "GroÃ- und Kleinschreibung beim Suchen ignorieren"
++
++#: rc.c:196
++msgid "Use LESSOPEN"
++msgstr "LESSOPEN verwenden"
++
++#: rc.c:199
++msgid "Perform SSL server verification"
++msgstr "SSL-Server-Verifizierung durchführen"
++
++#: rc.c:200
++msgid "PEM encoded certificate file of client"
++msgstr "PEM-kodierte Zertifikatsdatei des Clients"
++
++#: rc.c:201
++msgid "PEM encoded private key file of client"
++msgstr "PEM-kodierte private Schlüsseldatei des Clients"
++
++#: rc.c:202
++msgid "Path to directory for PEM encoded certificates of CAs"
++msgstr "Pfad zum Verzeichnis für PEM-kodierte Zertifikate von CAs"
++
++#: rc.c:203
++msgid "File consisting of PEM encoded certificates of CAs"
++msgstr "Datei mit PEM-kodierten Zertifikaten von CAs"
++
++#: rc.c:205
++msgid "List of forbidden SSL methods (2: SSLv2, 3: SSLv3, t:TLSv1)"
++msgstr "Liste unzulässiger SSL-Verfahren (2: SSLv2, 3: SSLv3, t: TLSv1)"
++
++#: rc.c:208
++msgid "Enable cookie processing"
++msgstr "Cookie-Verarbeitung aktivieren"
++
++#: rc.c:209
++msgid "Print a message when receiving a cookie"
++msgstr "Den Empfang von Cookies melden"
++
++#: rc.c:210
++msgid "Accept cookies"
++msgstr "Cookies akzeptieren"
++
++#: rc.c:211
++msgid "Action to be taken on invalid cookie"
++msgstr "Reaktion auf ungültiges Cookie"
++
++#: rc.c:212
++msgid "Domains to reject cookies from"
++msgstr "Domains, deren Cookies abzulehnen sind"
++
++#: rc.c:213
++msgid "Domains to accept cookies from"
++msgstr "Domains, deren Cookies akzeptiert werden"
++
++# Variable vom Typ String im Abschnitt Cookies-Einstellungen, mh 10.10.2014
++#: rc.c:214
++msgid "Domains to avoid [wrong number of dots]"
++msgstr "Zu meidende Domains (falsche Anzahl von Punkten)"
++
++#: rc.c:216
++msgid "Number of redirections to follow"
++msgstr "Anzahl zu akzeptierender Umleitungen"
++
++# Konfigurationsvariable vom Typ string, mh, 05.10.2014
++#: rc.c:217
++msgid "Enable processing of meta-refresh tag"
++msgstr "Meta-Refresh-Element verarbeiten"
++
++#: rc.c:220
++msgid "Enable Migemo (Roma-ji search)"
++msgstr "Romaji-Suche mittels Migemo aktivieren"
++
++#: rc.c:221
++msgid "Migemo command"
++msgstr "Migemo-Befehl"
++
++#: rc.c:225
++msgid "Display charset"
++msgstr "Zeichenkodierung der Anzeige"
++
++#: rc.c:226
++msgid "Default document charset"
++msgstr "Zeichenkodierungs-Vorgabe für Dokumente"
++
++#: rc.c:227
++msgid "Automatic charset detect when loading"
++msgstr "Selbstständige Erkennung der Zeichenkodierung beim Laden"
++
++#: rc.c:228
++msgid "System charset"
++msgstr "Zeichenkodierung des Systems"
++
++#: rc.c:229
++msgid "System charset follows locale(LC_CTYPE)"
++msgstr "Zeichenkodierung des Systems entsprechend Locale (LC_CTYPE)"
++
++# war zuvor
++# msgstr "Halfdump mit der zur Anzeige benutzten Zeichenkodierung exportieren"
++#: rc.c:230
++msgid "Output halfdump with display charset"
++msgstr "Halfdump in der zur Anzeige benutzten Kodierung"
++
++# Konfigurationsvariable vom Typ boolean, mh, 05.10.2014
++#: rc.c:231
++msgid "Use multi column characters"
++msgstr "Spaltenübergreifende Zeichen verwenden"
++
++#: rc.c:232
++msgid "Use combining characters"
++msgstr "Kombinationszeichen verwenden"
++
++#: rc.c:233
++msgid "Use double width for some Unicode characters"
++msgstr "Einzelnen Unicode-Zeichen zwei Spalten einräumen"
++
++#: rc.c:234
++msgid "Use Unicode language tags"
++msgstr "Unicode-Sprach-Tags verwenden"
++
++#: rc.c:235
++msgid "Charset conversion using Unicode map"
++msgstr "Zeichen in Unicode kodieren"
++
++#: rc.c:236
++msgid "Charset conversion when loading"
++msgstr "Zeichenkodierung beim Laden anpassen"
++
++#: rc.c:237
++msgid "Adjust search string for document charset"
++msgstr "Zu suchende Zeichenkette der Kodierung des Dokumentes anpassen"
++
++#: rc.c:238
++msgid "Fix character width when conversion"
++msgstr "Bei Umwandlung an der Breite von Zeichen festhalten"
++
++#: rc.c:239
++msgid "Use GB 12345 Unicode map instead of GB 2312's"
++msgstr "GB-12345-Unicode statt GB 2312 verwenden"
++
++#: rc.c:240
++msgid "Use JIS X 0201 Roman for ISO-2022-JP"
++msgstr "JIS X 0201 Roman statt ISO-2022-JP verwenden"
++
++#: rc.c:241
++msgid "Use JIS C 6226:1978 for ISO-2022-JP"
++msgstr "JIS C 6226:1978 statt ISO-2022-JP verwenden"
++
++#: rc.c:242
++msgid "Use JIS X 0201 Katakana"
++msgstr "JIS X 0201 Katakana verwenden"
++
++#: rc.c:243
++msgid "Use JIS X 0212:1990 (Supplemental Kanji)"
++msgstr "JIS X 0212:1990 verwenden (ergänzendes Kanji)"
++
++#: rc.c:244
++msgid "Use JIS X 0213:2000 (2000JIS)"
++msgstr "JIS X 0213:2000 verwenden (2000JIS)"
++
++#: rc.c:245
++msgid "Strict ISO-2022-JP/KR/CN"
++msgstr "Striktes ISO-2022-JP/KR/CN"
++
++#: rc.c:246
++msgid "Treat 4 bytes char. of GB18030 as Unicode"
++msgstr "4-Byte-Zeichen von GB 18030 als Unicode auffassen"
++
++#: rc.c:247
++msgid "Simple Preserve space"
++msgstr "Einfache Platzerhaltung"
++
++#: rc.c:250
++msgid "keymap file"
++msgstr "Tastaturbelegungs-Datei"
++
++#: rc.c:267
++msgid "black"
++msgstr "schwarz"
++
++#: rc.c:268
++msgid "red"
++msgstr "rot"
++
++#: rc.c:269
++msgid "green"
++msgstr "grün"
++
++#: rc.c:270
++msgid "yellow"
++msgstr "gelb"
++
++#: rc.c:271
++msgid "blue"
++msgstr "blau"
++
++#: rc.c:272
++msgid "magenta"
++msgstr "magenta"
++
++#: rc.c:273
++msgid "cyan"
++msgstr "cyan"
++
++#: rc.c:274
++msgid "white"
++msgstr "weiÃ"
++
++#: rc.c:275
++msgid "terminal"
++msgstr "wie Terminal"
++
++#: rc.c:294
++msgid "none"
++msgstr "keiner"
++
++#: rc.c:295
++msgid "current URL"
++msgstr "aktuelle URL"
++
++#: rc.c:296
++msgid "link URL"
++msgstr "Link-URL"
++
++#: rc.c:301
++msgid "simple"
++msgstr "einfach"
++
++#: rc.c:302
++msgid "use tag"
++msgstr "durch Tags"
++
++#: rc.c:303
++msgid "fontify"
++msgstr "hervorgehoben"
++
++#: rc.c:309
++msgid "A:relative to screen height"
++msgstr "A: relativ zu Fensterhöhe"
++
++#: rc.c:310
++msgid "B:fixed speed"
++msgstr "B: feste Geschwindigkeit"
++
++#: rc.c:317
++msgid "unspecified"
++msgstr "nicht spezifiziert"
++
++#: rc.c:318
++msgid "inet inet6"
++msgstr "inet inet6"
++
++#: rc.c:319
++msgid "inet6 inet"
++msgstr "inet6 inet"
++
++#: rc.c:320
++msgid "inet only"
++msgstr "nur inet"
++
++#: rc.c:321
++msgid "inet6 only"
++msgstr "nur inet6"
++
++#: rc.c:328
++msgid "discard"
++msgstr "verwerfen"
++
++#: rc.c:330
++msgid "accept"
++msgstr "annehmen"
++
++#: rc.c:332
++msgid "ask"
++msgstr "nachfragen"
++
++# gehört zu rc.c:142
++# erscheint in Pulldown-Menü, daher verkürzt. mh 09.10.2014
++#: rc.c:339
++msgid "use internal mailer instead"
++msgstr "Mail intern erstellen"
++
++# gehört zu rc.c:142
++# erscheint in Pulldown-Menü, daher verkürzt. mh 09.10.2014
++#: rc.c:341
++msgid "ignore options and use only the address"
++msgstr "Optionen ignorieren"
++
++# gehört zu rc.c:142
++# erscheint in Pulldown-Menü, daher verkürzt. mh 09.10.2014
++#: rc.c:342
++msgid "use full mailto URL"
++msgstr "komplett verwenden"
++
++#: rc.c:351
++msgid "OFF"
++msgstr "AUS"
++
++#: rc.c:352
++msgid "Only ISO 2022"
++msgstr "Nur ISO-2022"
++
++#: rc.c:353
++msgid "ON"
++msgstr "AN"
++
++# Wert aus einem Set zur Wiedergabe von Rändern, mh, 05.10.2014
++#: rc.c:359
++msgid "ASCII"
++msgstr "ASCII"
++
++# Wert aus einem Set zur Wiedergabe von Rändern, mh, 05.10.2014
++# hier ist "Zeichensatz" akzeptabel mh, 09.10.2014
++#: rc.c:360
++msgid "charset specific"
++msgstr "zeichensatzspezifisch"
++
++# Wert aus einem Set zur Wiedergabe von Rändern, mh, 05.10.2014
++#: rc.c:361
++msgid "DEC special graphics"
++msgstr "mit DEC-Grafiken"
++
++#: rc.c:740
++msgid "Display Settings"
++msgstr "Einstellungen zur Anzeige"
++
++#: rc.c:742
++msgid "Color Settings"
++msgstr "Farbeinstellungen"
++
++#: rc.c:744
++msgid "Miscellaneous Settings"
++msgstr "Weitere Einstellungen"
++
++#: rc.c:745
++msgid "Directory Settings"
++msgstr "Verzeichnis-Einstellungen"
++
++#: rc.c:746
++msgid "External Program Settings"
++msgstr "Einstellungen für externe Programme"
++
++#: rc.c:747
++msgid "Network Settings"
++msgstr "Netzwerk-Einstellungen"
++
++#: rc.c:748
++msgid "Proxy Settings"
++msgstr "Proxy-Einstellungen"
++
++#: rc.c:750
++msgid "SSL Settings"
++msgstr "SSL-Einstellungen"
++
++#: rc.c:753
++msgid "Cookie Settings"
++msgstr "Cookie-Einstellungen"
++
++#: rc.c:756
++msgid "Charset Settings"
++msgstr "Zeichenkodierungs-Einstellungen"
++
++#. TRANSLATORS:
++#. * AcceptLang default: this is used in Accept-Language: HTTP request
++#. * header. For example, ja.po should translate it as
++#. * "ja;q=1.0, en;q=0.5" like that.
++#.
++#: rc.c:1238
++msgid "en;q=1.0"
++msgstr "de;q=1.0, en;q=0.5"
+diff --git a/po/ja.po b/po/ja.po
+index d67c695..3810d30 100644
+--- a/po/ja.po
++++ b/po/ja.po
+@@ -1,6 +1,6 @@
+ # Japanese translations for w3m package
+ # w3m ããã±ã¼ã¸ã«å¯¾ããè±è¨³.
+-# Copyright (C) 2003 THE w3m'S COPYRIGHT HOLDER
++# Copyright (C) 2015 THE w3m'S COPYRIGHT HOLDER
+ # This file is distributed under the same license as the w3m package.
+ # Fumitoshi UKAI <ukai@debian.or.jp>, 2003.
+ #
+@@ -8,865 +8,897 @@ msgid ""
+ msgstr ""
+ "Project-Id-Version: w3m 0.5.3\n"
+ "Report-Msgid-Bugs-To: satodai@w3m.jp\n"
+-"POT-Creation-Date: 2010-08-20 18:44+0900\n"
+-"PO-Revision-Date: 2010-08-20 18:45+0900\n"
+-"Last-Translator: Fumitoshi UKAI <ukai@debian.or.jp>\n"
++"POT-Creation-Date: 2016-03-14 19:47+0900\n"
++"PO-Revision-Date: 2016-03-14 19:51+0900\n"
++"Last-Translator: Tatsuya Kinoshita <tats@debian.org>\n"
+ "Language-Team: Japanese\n"
+-"Language: \n"
++"Language: ja\n"
+ "MIME-Version: 1.0\n"
+ "Content-Type: text/plain; charset=UTF-8\n"
+ "Content-Transfer-Encoding: 8bit\n"
+ "Plural-Forms: nplurals=1; plural=0;\n"
+
+-#: menu.c:267
++#: menu.c:269
+ msgid " Back (b) "
+ msgstr "æ»ã (b)"
+
+-#: menu.c:268
++#: menu.c:270
+ msgid " Select Buffer(s) "
+ msgstr "ãããã¡é¸æ (s)"
+
+-#: menu.c:270
++#: menu.c:272
+ msgid " Select Tab (t) "
+ msgstr "ã¿ãé¸æ (t)"
+
+-#: menu.c:272
++#: menu.c:274
+ msgid " View Source (v) "
+ msgstr "ã½ã¼ã¹ã表示 (v)"
+
+-#: menu.c:273
++#: menu.c:275
+ msgid " Edit Source (e) "
+ msgstr "ã½ã¼ã¹ãç·¨é (e)"
+
+-#: menu.c:274
++#: menu.c:276
+ msgid " Save Source (S) "
+ msgstr "ã½ã¼ã¹ãä¿å (S)"
+
+-#: menu.c:275
++#: menu.c:277
+ msgid " Reload (r) "
+ msgstr "åèªã¿è¾¼ã¿ (r)"
+
+-#: menu.c:276 menu.c:283 menu.c:287
++#: menu.c:278 menu.c:285 menu.c:289
+ msgid " ---------------- "
+ msgstr "----------------"
+
+-#: menu.c:277
++#: menu.c:279
+ msgid " Go Link (a) "
+ msgstr "ãªã³ã¯ã表示 (a)"
+
+-#: menu.c:278
++#: menu.c:280
+ msgid " on New Tab (n) "
+ msgstr "æ°ã¿ãã§è¡¨ç¤º (n)"
+
+-#: menu.c:279
++#: menu.c:281
+ msgid " Save Link (A) "
+ msgstr "ãªã³ã¯ãä¿å (A)"
+
+-#: menu.c:280
++#: menu.c:282
+ msgid " View Image (i) "
+ msgstr "ç»åã表示 (i)"
+
+-#: menu.c:281
++#: menu.c:283
+ msgid " Save Image (I) "
+ msgstr "ç»åãä¿å (I)"
+
+-#: menu.c:282
++#: menu.c:284
+ msgid " View Frame (f) "
+ msgstr "ãã¬ã¼ã 表示 (f)"
+
+-#: menu.c:284
++#: menu.c:286
+ msgid " Bookmark (B) "
+ msgstr "ããã¯ãã¼ã¯ (B)"
+
+-#: menu.c:285
++#: menu.c:287
+ msgid " Help (h) "
+ msgstr "ãã«ã (h)"
+
+-#: menu.c:286
++#: menu.c:288
+ msgid " Option (o) "
+ msgstr "ãªãã·ã§ã³ (o)"
+
+-#: menu.c:288
++#: menu.c:290
+ msgid " Quit (q) "
+ msgstr "çµäº (q)"
+
+-#: rc.c:60
++#: rc.c:62
+ msgid "External Viewer Setup"
+ msgstr "å¤é¨ãã¥ã¼ã¢ã®ç·¨é"
+
+-#: rc.c:61
++#: rc.c:63
+ msgid "Tab width in characters"
+ msgstr "ã¿ãå¹
"
+
+-#: rc.c:62
++#: rc.c:64
+ msgid "Indent for HTML rendering"
+ msgstr "HTMLæ´å½¢æã®ã¤ã³ãã³ãå¹
"
+
+-#: rc.c:63
++#: rc.c:65
+ msgid "Number of pixels per character (4.0...32.0)"
+ msgstr "æåå¹
(4.0...32.0)"
+
+-#: rc.c:64
++#: rc.c:66
+ msgid "Number of pixels per line (4.0...64.0)"
+ msgstr "ä¸è¡ã®é«ã (4.0...64.0)"
+
+-#: rc.c:65
++#: rc.c:67
+ msgid "Number of remembered lines when used as a pager"
+ msgstr "ãã¼ã¸ã£ã¨ãã¦å©ç¨ããæã«ä¿åãããè¡æ°"
+
+-#: rc.c:66
++#: rc.c:68
+ msgid "Use URL history"
+ msgstr "å±¥æ´ã使ã"
+
+-#: rc.c:67
++#: rc.c:69
+ msgid "Number of remembered URL"
+ msgstr "ä¿æããURLå±¥æ´ã®æ°"
+
+-#: rc.c:68
++#: rc.c:70
+ msgid "Save URL history"
+ msgstr "URLå±¥æ´ã®ä¿å"
+
+-#: rc.c:69
++#: rc.c:71
+ msgid "Render frames automatically"
+ msgstr "ãã¬ã¼ã ã®èªå表示"
+
+-#: rc.c:70
++#: rc.c:72
+ msgid "Treat argument without scheme as URL"
+ msgstr "scheme ã®ãªãå¼æ°ã URL ã¨ã¿ãªã"
+
+-#: rc.c:71
++#: rc.c:73
+ msgid "Use _self as default target"
+ msgstr "targetãæªæå®ã®å ´åã«_selfã使ç¨ãã"
+
+-#: rc.c:72
++#: rc.c:74
+ msgid "Open link on new tab if target is _blank or _new"
+ msgstr "targetã_blankã_newã®å ´åã¯æ°ããã¿ãã§éã"
+
+-#: rc.c:73
++#: rc.c:75
+ msgid "Open download list panel on new tab"
+ msgstr "Download list panel ãæ°ããã¿ãã§éã"
+
+-#: rc.c:74
++#: rc.c:76
+ msgid "Display link URL automatically"
+ msgstr "ãªã³ã¯å
ã®èªå表示"
+
+-#: rc.c:75
++#: rc.c:77
+ msgid "Display link numbers"
+ msgstr "ãªã³ã¯çªå·ã®è¡¨ç¤º"
+
+-#: rc.c:76
++#: rc.c:78
+ msgid "Display decoded URL"
+ msgstr "URLããã³ã¼ããã¦è¡¨ç¤º"
+
+-#: rc.c:77
++#: rc.c:79
+ msgid "Display current line number"
+ msgstr "ç¾å¨ã®è¡çªå·ã®è¡¨ç¤º"
+
+-#: rc.c:78
++#: rc.c:80
+ msgid "Display inline images"
+ msgstr "ã¤ã³ã©ã¤ã³ç»åã表示"
+
+-#: rc.c:79
++#: rc.c:81
+ msgid "Display pseudo-ALTs for inline images with no ALT or TITLE string"
+ msgstr "ALT ã¾ã㯠TITLE ããªãç»åã®ä»£æ¿ããã¹ã表示"
+
+-#: rc.c:81
++#: rc.c:83
+ msgid "Load inline images automatically"
+ msgstr "ã¤ã³ã©ã¤ã³ç»åãèªåã§èªã¿è¾¼ã"
+
+-#: rc.c:82
++#: rc.c:84
+ msgid "Maximum processes for parallel image loading"
+ msgstr "ç»åèªã¿è¾¼ã¿æã®æ大ããã»ã¹æ°"
+
+-#: rc.c:83
++#: rc.c:85
+ msgid "Use external image viewer"
+ msgstr "ç»åãå¤é¨ãã¥ã¼ã¯ã§è¡¨ç¤º"
+
+-#: rc.c:84
++#: rc.c:86
+ msgid "Scale of image (%)"
+ msgstr "ç»åã®ã¹ã±ã¼ã«(%)"
+
+-#: rc.c:85
++#: rc.c:87
+ msgid "External command to display image"
+ msgstr "ç»åã表示ããããã®ã³ãã³ã"
+
+-#: rc.c:86
++#: rc.c:88
+ msgid "Use link list of image map"
+ msgstr "ã¤ã¡ã¼ã¸ãããã®ãªã³ã¯å
ä¸è¦§ã表示"
+
+-#: rc.c:88
++#: rc.c:90
+ msgid "Display file names in multi-column format"
+ msgstr "ãã¡ã¤ã«åã®ãã«ãã«ã©ã 表示"
+
+-#: rc.c:89
++#: rc.c:91
+ msgid "Use ASCII equivalents to display entities"
+ msgstr "ã¨ã³ãã£ãã£ã ASCII ã®ä»£æ¿è¡¨ç¾ã§è¡¨ã"
+
+-#: rc.c:90
++#: rc.c:92
+ msgid "Character type for border of table and menu"
+ msgstr "ãã¼ãã«ãã¡ãã¥ã¼ã®æ ã«ä½¿ãæå"
+
+-#: rc.c:91
++#: rc.c:93
++msgid "Display table borders, ignore value of BORDER"
++msgstr "BORDER ã®å¤ã¯ç¡è¦ãã¦ãã¼ãã«æ ã表示"
++
++#: rc.c:94
+ msgid "Fold lines in TEXTAREA"
+ msgstr "TEXTAREA ã®è¡ãæãè¿ãã¦è¡¨ç¤º"
+
+-#: rc.c:92
++#: rc.c:95
+ msgid "Display INS, DEL, S and STRIKE element"
+ msgstr "INS, DEL, S, STRIKE è¦ç´ ã®è¡¨ç¤º"
+
+-#: rc.c:93
++#: rc.c:96
+ msgid "Display with color"
+ msgstr "ã«ã©ã¼è¡¨ç¤º"
+
+-#: rc.c:94
++#: rc.c:97
+ msgid "Color of normal character"
+ msgstr "æåã®è²"
+
+-#: rc.c:95
++#: rc.c:98
+ msgid "Color of anchor"
+ msgstr "ã¢ã³ã«ã¼ã®è²"
+
+-#: rc.c:96
++#: rc.c:99
+ msgid "Color of image link"
+ msgstr "ç»åãªã³ã¯ã®è²"
+
+-#: rc.c:97
++#: rc.c:100
+ msgid "Color of form"
+ msgstr "ãã©ã¼ã ã®è²"
+
+-#: rc.c:98
++#: rc.c:101
+ msgid "Enable coloring of active link"
+ msgstr "ç¾å¨é¸æããã¦ãããªã³ã¯ã®è²ãæå®ãã"
+
+-#: rc.c:99
++#: rc.c:102
+ msgid "Color of currently active link"
+ msgstr "ç¾å¨é¸æããã¦ãããªã³ã¯ã®è²"
+
+-#: rc.c:100
++#: rc.c:103
+ msgid "Use visited link color"
+ msgstr "訪ãããã¨ããããªã³ã¯ã¯è²ãå¤ãã"
+
+-#: rc.c:101
++#: rc.c:104
+ msgid "Color of visited link"
+ msgstr "訪ãããã¨ããããªã³ã¯ã®è²"
+
+-#: rc.c:102
++#: rc.c:105
+ msgid "Color of background"
+ msgstr "èæ¯ã®è²"
+
+-#: rc.c:103
++#: rc.c:106
+ msgid "Color of mark"
+ msgstr "ãã¼ã¯ã®è²"
+
+-#: rc.c:104
++#: rc.c:107
+ msgid "Use proxy"
+ msgstr "ãããã·ã使ç¨ãã"
+
+-#: rc.c:105
++#: rc.c:108
+ msgid "URL of HTTP proxy host"
+ msgstr "HTTPãããã·(URLã§å
¥å)"
+
+-#: rc.c:107
++#: rc.c:110
+ msgid "URL of HTTPS proxy host"
+ msgstr "HTTPSãããã·(URLã§å
¥å)"
+
+-#: rc.c:110
++#: rc.c:113
+ msgid "URL of GOPHER proxy host"
+ msgstr "GOPHERãããã·(URLã§å
¥å)"
+
+-#: rc.c:112
++#: rc.c:115
+ msgid "URL of FTP proxy host"
+ msgstr "FTPãããã·(URLã§å
¥å)"
+
+-#: rc.c:113
++#: rc.c:116
+ msgid "Domains to be accessed directly (no proxy)"
+ msgstr "ãããã·ããé¤å¤ãããã¡ã¤ã³"
+
+-#: rc.c:114
++#: rc.c:117
+ msgid "Check noproxy by network address"
+ msgstr "ãããã¯ã¼ã¯ã¢ãã¬ã¹ã§ãããã·é¤å¤ã®ãã§ãã¯"
+
+-#: rc.c:115
++#: rc.c:118
+ msgid "Disable cache"
+ msgstr "Cache ã使ããªã"
+
+-#: rc.c:117
++#: rc.c:120
+ msgid "News server"
+ msgstr "News ãµã¼ã"
+
+-#: rc.c:118
++#: rc.c:121
+ msgid "Mode of news server"
+ msgstr "News ãµã¼ãã®ã¢ã¼ã"
+
+-#: rc.c:119
++#: rc.c:122
+ msgid "Number of news messages"
+ msgstr "News ãä¸è¦§è¡¨ç¤ºããæã®æ°"
+
+-#: rc.c:121
++#: rc.c:124
+ msgid "Order of name resolution"
+ msgstr "åå解決ã®é åº"
+
+-#: rc.c:122
++#: rc.c:125
+ msgid "Directory corresponding to / (document root)"
+ msgstr "/ ã§è¡¨ããããã£ã¬ã¯ããª(document root)"
+
+-#: rc.c:123
++#: rc.c:126
+ msgid "Directory corresponding to /~user"
+ msgstr "/~user ã§è¡¨ããããã£ã¬ã¯ããª"
+
+-#: rc.c:124
++#: rc.c:127
+ msgid "Directory corresponding to /cgi-bin"
+ msgstr "/cgi-bin ã§è¡¨ããããã£ã¬ã¯ããª"
+
+-#: rc.c:125
++#: rc.c:128
+ msgid "Confirm when quitting with q"
+ msgstr "q ã§ã®çµäºæã«ç¢ºèªãã"
+
+-#: rc.c:126
++#: rc.c:129
+ msgid "Close tab if buffer is last when back"
+ msgstr "æ»ãæã«ãããã¡ãæå¾ãªãã¿ããéãã"
+
+-#: rc.c:128
++#: rc.c:131
+ msgid "Enable mark operations"
+ msgstr "ãã¼ã¯æ©è½ãæå¹ã«ãã"
+
+-#: rc.c:130
++#: rc.c:133
+ msgid "Enable Emacs-style line editing"
+ msgstr "Emacs風ã®è¡ç·¨éã«ãã"
+
+-#: rc.c:131
++#: rc.c:134
+ msgid "Enable vi-like numeric prefix"
+ msgstr "vi風ã®æ°å¤ãã¬ãã£ã¯ã¹"
+
+-#: rc.c:132
++#: rc.c:135
+ msgid "Move cursor to top line when going to label"
+ msgstr "ã©ãã«ã«ç§»åããæã«ã«ã¼ã½ã«ããããã«ãªãããã«ãã"
+
+-#: rc.c:133
++#: rc.c:136
+ msgid "Move cursor to top line when moving to next page"
+ msgstr "次ã®ãã¼ã¸ã«ç§»åããæã«ã«ã¼ã½ã«ããããã«ãªãããã«ãã"
+
+-#: rc.c:134
++#: rc.c:137
+ msgid "Fold lines of plain text file"
+ msgstr "plain text ãã¡ã¤ã«ã®è¡ãæãè¿ã"
+
+-#: rc.c:135
++#: rc.c:138
+ msgid "Show line numbers"
+ msgstr "è¡çªå·ã表示ãã"
+
+-#: rc.c:136
++#: rc.c:139
+ msgid "Show search string"
+ msgstr "æ¤ç´¢æååã表示ãã"
+
+-#: rc.c:137
++#: rc.c:140
+ msgid "List of mime.types files"
+ msgstr "å©ç¨ããmime.types"
+
+-#: rc.c:138
++#: rc.c:141
+ msgid "List of mailcap files"
+ msgstr "å©ç¨ããmailcap"
+
+-#: rc.c:139
++#: rc.c:142
+ msgid "List of urimethodmap files"
+ msgstr "å©ç¨ããurimethodmap"
+
+-#: rc.c:140
++#: rc.c:143
+ msgid "Editor"
+ msgstr "å©ç¨ããã¨ãã£ã¿"
+
+-#: rc.c:141
++#: rc.c:144
+ msgid "Mailer"
+ msgstr "å©ç¨ããã¡ã¼ã©"
+
+-#: rc.c:142
++#: rc.c:145
+ msgid "How to call Mailer for mailto URLs with options"
+ msgstr "mailto ã¿ã°ã®åãæ±ã"
+
+-#: rc.c:143
+-msgid "External Browser"
++#: rc.c:146
++msgid "External browser"
+ msgstr "å¤é¨ãã©ã¦ã¶"
+
+-#: rc.c:144
+-msgid "Second External Browser"
++#: rc.c:147
++msgid "2nd external browser"
+ msgstr "å¤é¨ãã©ã¦ã¶ãã®2"
+
+-#: rc.c:145
+-msgid "Third External Browser"
++#: rc.c:148
++msgid "3rd external browser"
+ msgstr "å¤é¨ãã©ã¦ã¶ãã®3"
+
+-#: rc.c:146
++#: rc.c:149
++msgid "4th external browser"
++msgstr "å¤é¨ãã©ã¦ã¶ãã®4"
++
++#: rc.c:150
++msgid "5th external browser"
++msgstr "å¤é¨ãã©ã¦ã¶ãã®5"
++
++#: rc.c:151
++msgid "6th external browser"
++msgstr "å¤é¨ãã©ã¦ã¶ãã®6"
++
++#: rc.c:152
++msgid "7th external browser"
++msgstr "å¤é¨ãã©ã¦ã¶ãã®7"
++
++#: rc.c:153
++msgid "8th external browser"
++msgstr "å¤é¨ãã©ã¦ã¶ãã®8"
++
++#: rc.c:154
++msgid "9th external browser"
++msgstr "å¤é¨ãã©ã¦ã¶ãã®9"
++
++#: rc.c:155
+ msgid "Disable secret file security check"
+ msgstr "ãã¹ã¯ã¼ããã¡ã¤ã«ã®ãã¼ããã·ã§ã³ããã§ãã¯ããªã"
+
+-#: rc.c:147
++#: rc.c:156
+ msgid "Password file"
+ msgstr "ãã¹ã¯ã¼ããã¡ã¤ã«"
+
+-#: rc.c:148
++#: rc.c:157
+ msgid "File for setting form on loading"
+ msgstr "ææ¸èªè¾¼æã®ãã©ã¼ã è¨å®ç¨ãã¡ã¤ã«"
+
+-#: rc.c:149
++#: rc.c:158
++msgid "File for preferences for each site"
++msgstr "ãµã¤ãå¥è¨å®ã®ãã¡ã¤ã«"
++
++#: rc.c:159
+ msgid "Password for anonymous FTP (your mail address)"
+ msgstr "FTPã®ãã¹ã¯ã¼ã(æ®éã¯èªåã®mail addressã使ã)"
+
+-#: rc.c:150
++#: rc.c:160
+ msgid "Generate domain part of password for FTP"
+ msgstr "FTPã®ãã¹ã¯ã¼ãã®ãã¡ã¤ã³åãèªåçæãã"
+
+-#: rc.c:151
++#: rc.c:161
+ msgid "User-Agent identification string"
+ msgstr "User-Agent"
+
+-#: rc.c:152
++#: rc.c:162
+ msgid "Accept-Encoding header"
+ msgstr "å§ç¸®æ¹æ³(Accept-Encoding:)"
+
+-#: rc.c:153
++#: rc.c:163
+ msgid "Accept header"
+ msgstr "åãã¤ããã¡ãã£ã¢ã¿ã¤ã(Accept:)"
+
+-#: rc.c:154
++#: rc.c:164
+ msgid "Accept-Language header"
+ msgstr "åãã¤ããè¨èª(Accept-Language:)"
+
+-#: rc.c:155
++#: rc.c:165
+ msgid "Treat URL-like strings as links in all pages"
+ msgstr "å
¨ã¦ã®ãã¼ã¸ã®URL風ã®æååããªã³ã¯ã«ãã"
+
+-#: rc.c:156
++#: rc.c:166
+ msgid "Wrap search"
+ msgstr "æãè¿ãæ¤ç´¢"
+
+-#: rc.c:157
++#: rc.c:167
+ msgid "Display unseen objects (e.g. bgimage tag)"
+ msgstr "èæ¯ç»åçã¸ã®ãªã³ã¯ãä½ã"
+
+-#: rc.c:158
++#: rc.c:168
+ msgid "Uncompress compressed data automatically when downloading"
+ msgstr "ãã¦ã³ãã¼ãæã«èªåçã«å§ç¸®ããããã¼ã¿ã解åãã"
+
+-#: rc.c:160
++#: rc.c:170
+ msgid "Run external viewer in a separate session"
+ msgstr "å¤é¨ãã¥ã¼ã¢ãå¥ã»ãã·ã§ã³ã§åãã"
+
+-#: rc.c:162
++#: rc.c:172
+ msgid "Run external viewer in the background"
+ msgstr "å¤é¨ãã¥ã¼ã¢ãããã¯ã°ã©ã¦ã³ãã§åãã"
+
+-#: rc.c:164
++#: rc.c:174
+ msgid "Use external program for directory listing"
+ msgstr "ãã£ã¬ã¯ããªãªã¹ãã«å¤é¨ã³ãã³ãã使ã"
+
+-#: rc.c:165
++#: rc.c:175
+ msgid "URL of directory listing command"
+ msgstr "ãã£ã¬ã¯ããªãªã¹ãç¨ã³ãã³ã"
+
+-#: rc.c:167
++#: rc.c:177
+ msgid "Enable dictionary lookup through CGI"
+ msgstr "è¾æ¸å¼ããCGIçµç±ã§ãããªã"
+
+-#: rc.c:168
++#: rc.c:178
+ msgid "URL of dictionary lookup command"
+ msgstr "è¾æ¸å¼ãã³ãã³ãã®URL"
+
+-#: rc.c:170
++#: rc.c:180
+ msgid "Display link name for images lacking ALT"
+ msgstr "空ã®IMG ALTå±æ§ã®æã«ãªã³ã¯åã表示ãã"
+
+-#: rc.c:171
++#: rc.c:181
+ msgid "Index file for directories"
+ msgstr "åãã£ã¬ã¯ããªã®ã¤ã³ããã¯ã¹ãã¡ã¤ã«"
+
+-#: rc.c:172
++#: rc.c:182
+ msgid "Prepend http:// to URL automatically"
+ msgstr "URLã«èªåçã« http:// ãè£ã"
+
+-#: rc.c:173
++#: rc.c:183
+ msgid "Default value for open-URL command"
+ msgstr "URLãéãæã®ããã©ã«ãæåå"
+
+-#: rc.c:174
++#: rc.c:184
+ msgid "Decode Content-Transfer-Encoding when saving"
+ msgstr "ä¿åæã« Content-Transfer-Encoding ããã³ã¼ããã"
+
+-#: rc.c:175
++#: rc.c:185
+ msgid "Preserve timestamp when saving"
+ msgstr "ä¿åæã«ã¿ã¤ã ã¹ã¿ã³ããä¿æãã"
+
+-#: rc.c:177
++#: rc.c:187
+ msgid "Enable mouse"
+ msgstr "ãã¦ã¹ã使ã"
+
+-#: rc.c:178
++#: rc.c:188
+ msgid "Scroll in reverse direction of mouse drag"
+ msgstr "ãã¦ã¹ã®ãã©ãã°åä½ãéã«ãã"
+
+-#: rc.c:179
++#: rc.c:189
+ msgid "Behavior of wheel scroll speed"
+ msgstr "ãã¤ã¼ã«ã§ã®ã¹ã¯ãã¼ã«é度ã®æ±ã"
+
+-#: rc.c:180
++#: rc.c:190
+ msgid "(A only)Scroll by # (%) of screen"
+ msgstr "(Aã®ã¿)ç»é¢ã®ä½%ã¹ã¯ãã¼ã«ããã"
+
+-#: rc.c:181
++#: rc.c:191
+ msgid "(B only)Scroll by # lines"
+ msgstr "(Bã®ã¿)ã¹ã¯ãã¼ã«ããè¡æ°"
+
+-#: rc.c:183
++#: rc.c:193
+ msgid "Free memory of undisplayed buffers"
+ msgstr "表示ããã¦ããªããããã¡ã®ã¡ã¢ãªã解æ¾ãã"
+
+-#: rc.c:184
++#: rc.c:194
+ msgid "Suppress `Referer:' header"
+ msgstr "Referer: ãéããªãããã«ãã"
+
+-#: rc.c:185
++#: rc.c:195
+ msgid "Search case-insensitively"
+ msgstr "ãµã¼ãæã«å¤§æåå°æåã®åºå¥ãããªã"
+
+-#: rc.c:186
++#: rc.c:196
+ msgid "Use LESSOPEN"
+ msgstr "LESSOPENã使ç¨"
+
+-#: rc.c:189
++#: rc.c:199
+ msgid "Perform SSL server verification"
+ msgstr "SSLã®ãµã¼ãèªè¨¼ãè¡ã"
+
+-#: rc.c:190
++#: rc.c:200
+ msgid "PEM encoded certificate file of client"
+ msgstr "SSLã®ã¯ã©ã¤ã¢ã³ãç¨PEMå½¢å¼è¨¼ææ¸ãã¡ã¤ã«"
+
+-#: rc.c:191
++#: rc.c:201
+ msgid "PEM encoded private key file of client"
+ msgstr "SSLã®ã¯ã©ã¤ã¢ã³ãç¨PEMå½¢å¼ç§å¯éµãã¡ã¤ã«"
+
+-#: rc.c:192
++#: rc.c:202
+ msgid "Path to directory for PEM encoded certificates of CAs"
+ msgstr "SSLã®èªè¨¼å±ã®PEMå½¢å¼è¨¼ææ¸ç¾¤ã®ãããã£ã¬ã¯ããªã¸ã®ãã¹"
+
+-#: rc.c:193
++#: rc.c:203
+ msgid "File consisting of PEM encoded certificates of CAs"
+ msgstr "SSLã®èªè¨¼å±ã®PEMå½¢å¼è¨¼ææ¸ç¾¤ã®ãã¡ã¤ã«"
+
+-#: rc.c:195
++#: rc.c:205
+ msgid "List of forbidden SSL methods (2: SSLv2, 3: SSLv3, t:TLSv1)"
+ msgstr "使ããªãSSLã¡ã½ããã®ãªã¹ã(2: SSLv2, 3: SSLv3, t:TLSv1)"
+
+-#: rc.c:198
++#: rc.c:208
+ msgid "Enable cookie processing"
+ msgstr "ã¯ããã¼ã使ç¨ãã"
+
+-#: rc.c:199
++#: rc.c:209
+ msgid "Print a message when receiving a cookie"
+ msgstr "ã¯ããã¼ãåãä»ããã¨ãã«ã¡ãã»ã¼ã¸ã表示ãã"
+
+-#: rc.c:200
++#: rc.c:210
+ msgid "Accept cookies"
+ msgstr "ã¯ããã¼ãåãä»ãã"
+
+-#: rc.c:201
++#: rc.c:211
+ msgid "Action to be taken on invalid cookie"
+ msgstr "åé¡ã®ããã¯ããã¼ã§ãåãä»ãã"
+
+-#: rc.c:202
++#: rc.c:212
+ msgid "Domains to reject cookies from"
+ msgstr "ã¯ããã¼ãåãä»ããªããã¡ã¤ã³"
+
+-#: rc.c:203
++#: rc.c:213
+ msgid "Domains to accept cookies from"
+ msgstr "ã¯ããã¼ãåãä»ãããã¡ã¤ã³"
+
+-#: rc.c:204
++#: rc.c:214
+ msgid "Domains to avoid [wrong number of dots]"
+ msgstr "[wrong number of dots] ãç¡è¦ãããã¡ã¤ã³"
+
+-#: rc.c:206
++#: rc.c:216
+ msgid "Number of redirections to follow"
+ msgstr "å¾ããªãã¤ã¬ã¯ãã®åæ°"
+
+-#: rc.c:207
++#: rc.c:217
+ msgid "Enable processing of meta-refresh tag"
+ msgstr "meta refresh ã«å¯¾å¿ãã"
+
+-#: rc.c:210
++#: rc.c:220
+ msgid "Enable Migemo (Roma-ji search)"
+ msgstr "Migemo(ãã¼ãåæ¤ç´¢)ã使ç¨ãã"
+
+-#: rc.c:211
++#: rc.c:221
+ msgid "Migemo command"
+ msgstr "Migemoã³ãã³ã"
+
+-#: rc.c:215
++#: rc.c:225
+ msgid "Display charset"
+ msgstr "表示ç¨æåã³ã¼ã"
+
+-#: rc.c:216
++#: rc.c:226
+ msgid "Default document charset"
+ msgstr "ææ¸ã®æ¨æºã®æåã³ã¼ã"
+
+-#: rc.c:217
++#: rc.c:227
+ msgid "Automatic charset detect when loading"
+ msgstr "ææ¸ã®èªã¿è¾¼ã¿æã«æåã³ã¼ãã®èªåå¤å®ãè¡ã"
+
+-#: rc.c:218
++#: rc.c:228
+ msgid "System charset"
+ msgstr "ã·ã¹ãã ã®æåã³ã¼ã"
+
+-#: rc.c:219
++#: rc.c:229
+ msgid "System charset follows locale(LC_CTYPE)"
+ msgstr "Locale(LC_CTYPE) ã«å¾ã£ã¦ã·ã¹ãã ã®æåã³ã¼ããè¨å®"
+
+-#: rc.c:220
++#: rc.c:230
+ msgid "Output halfdump with display charset"
+ msgstr "表示ç¨æåã³ã¼ã㧠halfdump ã®åºåãè¡ã"
+
+-#: rc.c:221
++#: rc.c:231
+ msgid "Use multi column characters"
+ msgstr "è¤æ°ã«ã©ã ã®æåã使ã"
+
+-#: rc.c:222
++#: rc.c:232
+ msgid "Use combining characters"
+ msgstr "çµåæåã使ã"
+
+-#: rc.c:223
++#: rc.c:233
+ msgid "Use double width for some Unicode characters"
+ msgstr "ãã種ã®Unicodeæåãå
¨è§ã«ãã"
+
+-#: rc.c:224
++#: rc.c:234
+ msgid "Use Unicode language tags"
+ msgstr "Unicode ã®è¨èªã¿ã°ã使ã"
+
+-#: rc.c:225
++#: rc.c:235
+ msgid "Charset conversion using Unicode map"
+ msgstr "Unicodeãä»ããã³ã¼ãå¤æ"
+
+-#: rc.c:226
++#: rc.c:236
+ msgid "Charset conversion when loading"
+ msgstr "ææ¸ã®èªã¿è¾¼ã¿æã«æåã³ã¼ããå¤æãã"
+
+-#: rc.c:227
++#: rc.c:237
+ msgid "Adjust search string for document charset"
+ msgstr "æ¤ç´¢æååãææ¸ã®æåã³ã¼ãã«å¤æãã"
+
+-#: rc.c:228
++#: rc.c:238
+ msgid "Fix character width when conversion"
+ msgstr "æåå¹
ã®å¤ããå¤æãããªã"
+
+-#: rc.c:229
++#: rc.c:239
+ msgid "Use GB 12345 Unicode map instead of GB 2312's"
+ msgstr "GB 12345 ã® Unicode ãããã GB 2312 ç¨ã«ä½¿ã"
+
+-#: rc.c:230
++#: rc.c:240
+ msgid "Use JIS X 0201 Roman for ISO-2022-JP"
+ msgstr "ISO-2022-JP 㧠JIS X 0201-Roman ã使ã"
+
+-#: rc.c:231
++#: rc.c:241
+ msgid "Use JIS C 6226:1978 for ISO-2022-JP"
+ msgstr "ISO-2022-JP 㧠JIS C 6226:1978(æ§JIS) ã使ã"
+
+-#: rc.c:232
++#: rc.c:242
+ msgid "Use JIS X 0201 Katakana"
+ msgstr "JIS X 0201-Katakana ã使ã"
+
+-#: rc.c:233
++#: rc.c:243
+ msgid "Use JIS X 0212:1990 (Supplemental Kanji)"
+ msgstr "JIS X 0212:1990(è£å©æ¼¢å) ã使ã"
+
+-#: rc.c:234
++#: rc.c:244
+ msgid "Use JIS X 0213:2000 (2000JIS)"
+ msgstr "JIS X 0213:2000(2000JIS) ã使ã"
+
+-#: rc.c:235
++#: rc.c:245
+ msgid "Strict ISO-2022-JP/KR/CN"
+ msgstr "å³æ ¼ãª ISO-2022-JP/KR/CN ã使ã"
+
+-#: rc.c:236
++#: rc.c:246
+ msgid "Treat 4 bytes char. of GB18030 as Unicode"
+ msgstr "GB18030 ã® 4ãã¤ãæåã Unicode ã¨ãã¦æ±ã"
+
+-#: rc.c:237
++#: rc.c:247
+ msgid "Simple Preserve space"
+ msgstr "åç´ãªç©ºç½ã®ä¿å"
+
+-#: rc.c:240
++#: rc.c:250
+ msgid "keymap file"
+ msgstr "keymapãã¡ã¤ã«"
+
+-#: rc.c:257
++#: rc.c:267
+ msgid "black"
+ msgstr "é»"
+
+-#: rc.c:258
++#: rc.c:268
+ msgid "red"
+ msgstr "赤"
+
+-#: rc.c:259
++#: rc.c:269
+ msgid "green"
+ msgstr "ç·"
+
+-#: rc.c:260
++#: rc.c:270
+ msgid "yellow"
+ msgstr "é»"
+
+-#: rc.c:261
++#: rc.c:271
+ msgid "blue"
+ msgstr "é"
+
+-#: rc.c:262
++#: rc.c:272
+ msgid "magenta"
+ msgstr "ç´«"
+
+-#: rc.c:263
++#: rc.c:273
+ msgid "cyan"
+ msgstr "空è²"
+
+-#: rc.c:264
++#: rc.c:274
+ msgid "white"
+ msgstr "ç½"
+
+-#: rc.c:265
++#: rc.c:275
+ msgid "terminal"
+ msgstr "端æ«"
+
+-#: rc.c:284
++#: rc.c:294
+ msgid "none"
+ msgstr "ç¡ã"
+
+-#: rc.c:285
++#: rc.c:295
+ msgid "current URL"
+ msgstr "ç¾å¨ã®URL"
+
+-#: rc.c:286
++#: rc.c:296
+ msgid "link URL"
+ msgstr "ãªã³ã¯å
ã®URL"
+
+-#: rc.c:291
++#: rc.c:301
+ msgid "simple"
+ msgstr "ã·ã³ãã«"
+
+-#: rc.c:292
++#: rc.c:302
+ msgid "use tag"
+ msgstr "ã¿ã°ã§è¡¨ç¤º"
+
+-#: rc.c:293
++#: rc.c:303
+ msgid "fontify"
+ msgstr "æåè£
飾"
+
+-#: rc.c:299
++#: rc.c:309
+ msgid "A:relative to screen height"
+ msgstr "A:ç»é¢ãµã¤ãºã«æ¯ä¾"
+
+-#: rc.c:300
++#: rc.c:310
+ msgid "B:fixed speed"
+ msgstr "B:ä¸å®ã®è¡æ°"
+
+-#: rc.c:307
++#: rc.c:317
+ msgid "unspecified"
+ msgstr "æå®ããªã"
+
+-#: rc.c:308
++#: rc.c:318
+ msgid "inet inet6"
+ msgstr "IPv4åªå
"
+
+-#: rc.c:309
++#: rc.c:319
+ msgid "inet6 inet"
+ msgstr "IPv6åªå
"
+
+-#: rc.c:310
++#: rc.c:320
+ msgid "inet only"
+ msgstr "IPv4ã®ã¿"
+
+-#: rc.c:311
++#: rc.c:321
+ msgid "inet6 only"
+ msgstr "IPv6ã®ã¿"
+
+-#: rc.c:318
++#: rc.c:328
+ msgid "discard"
+ msgstr "ç ´æ£ãã"
+
+-#: rc.c:320
++#: rc.c:330
+ msgid "accept"
+ msgstr "åãå
¥ãã"
+
+-#: rc.c:322
++#: rc.c:332
+ msgid "ask"
+ msgstr "確èªãã"
+
+-#: rc.c:329
++#: rc.c:339
+ msgid "use internal mailer instead"
+ msgstr "å
é¨ã¡ã¼ã©ã使ç¨"
+
+-#: rc.c:331
++#: rc.c:341
+ msgid "ignore options and use only the address"
+ msgstr "ã¢ãã¬ã¹ã®ã¿ä½¿ç¨"
+
+-#: rc.c:332
++#: rc.c:342
+ msgid "use full mailto URL"
+ msgstr "URL å
¨ä½ã使ç¨"
+
+-#: rc.c:341
++#: rc.c:351
+ msgid "OFF"
+ msgstr "ç¡å¹"
+
+-#: rc.c:342
++#: rc.c:352
+ msgid "Only ISO 2022"
+ msgstr "ISO 2022 ã®ã¿"
+
+-#: rc.c:343
++#: rc.c:353
+ msgid "ON"
+ msgstr "æå¹"
+
+-#: rc.c:349
++#: rc.c:359
+ msgid "ASCII"
+ msgstr "ASCII"
+
+-#: rc.c:350
++#: rc.c:360
+ msgid "charset specific"
+ msgstr "æåã³ã¼ãä¾å"
+
+-#: rc.c:351
++#: rc.c:361
+ msgid "DEC special graphics"
+ msgstr "DEC ç¹æ®æå"
+
+-#: rc.c:714
++#: rc.c:740
+ msgid "Display Settings"
+ msgstr "表示é¢ä¿"
+
+-#: rc.c:716
++#: rc.c:742
+ msgid "Color Settings"
+ msgstr "表示è²"
+
+-#: rc.c:718
++#: rc.c:744
+ msgid "Miscellaneous Settings"
+ msgstr "éå¤ãªè¨å®"
+
+-#: rc.c:719
++#: rc.c:745
+ msgid "Directory Settings"
+ msgstr "ãã£ã¬ã¯ããªè¨å®"
+
+-#: rc.c:720
++#: rc.c:746
+ msgid "External Program Settings"
+ msgstr "å¤é¨ããã°ã©ã "
+
+-#: rc.c:721
++#: rc.c:747
+ msgid "Network Settings"
+ msgstr "ãããã¯ã¼ã¯ã®è¨å®"
+
+-#: rc.c:722
++#: rc.c:748
+ msgid "Proxy Settings"
+ msgstr "ãããã·ã®è¨å®"
+
+-#: rc.c:724
++#: rc.c:750
+ msgid "SSL Settings"
+ msgstr "SSLã®è¨å®"
+
+-#: rc.c:727
++#: rc.c:753
+ msgid "Cookie Settings"
+ msgstr "ã¯ããã¼ã®è¨å®"
+
+-#: rc.c:730
++#: rc.c:756
+ msgid "Charset Settings"
+ msgstr "æåã³ã¼ãã®è¨å®"
+
+@@ -875,6 +907,6 @@ msgstr "æåã³ã¼ãã®è¨å®"
+ #. * header. For example, ja.po should translate it as
+ #. * "ja;q=1.0, en;q=0.5" like that.
+ #.
+-#: rc.c:1209
++#: rc.c:1238
+ msgid "en;q=1.0"
+ msgstr "ja;q=1.0, en;q=0.5"
+diff --git a/po/w3m.pot b/po/w3m.pot
+index e164b1e..607e26f 100644
+--- a/po/w3m.pot
++++ b/po/w3m.pot
+@@ -1,6 +1,6 @@
+ # SOME DESCRIPTIVE TITLE.
+-# Copyright (C) YEAR Fumitoshi UKAI
+-# This file is distributed under the same license as the PACKAGE package.
++# Copyright (C) YEAR THE w3m'S COPYRIGHT HOLDER
++# This file is distributed under the same license as the w3m package.
+ # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+ #
+ #, fuzzy
+@@ -8,7 +8,7 @@ msgid ""
+ msgstr ""
+ "Project-Id-Version: w3m 0.5.3\n"
+ "Report-Msgid-Bugs-To: satodai@w3m.jp\n"
+-"POT-Creation-Date: 2010-08-20 18:44+0900\n"
++"POT-Creation-Date: 2016-03-14 19:47+0900\n"
+ "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+ "Language-Team: LANGUAGE <LL@li.org>\n"
+@@ -17,855 +17,887 @@ msgstr ""
+ "Content-Type: text/plain; charset=CHARSET\n"
+ "Content-Transfer-Encoding: 8bit\n"
+
+-#: menu.c:267
++#: menu.c:269
+ msgid " Back (b) "
+ msgstr ""
+
+-#: menu.c:268
++#: menu.c:270
+ msgid " Select Buffer(s) "
+ msgstr ""
+
+-#: menu.c:270
++#: menu.c:272
+ msgid " Select Tab (t) "
+ msgstr ""
+
+-#: menu.c:272
++#: menu.c:274
+ msgid " View Source (v) "
+ msgstr ""
+
+-#: menu.c:273
++#: menu.c:275
+ msgid " Edit Source (e) "
+ msgstr ""
+
+-#: menu.c:274
++#: menu.c:276
+ msgid " Save Source (S) "
+ msgstr ""
+
+-#: menu.c:275
++#: menu.c:277
+ msgid " Reload (r) "
+ msgstr ""
+
+-#: menu.c:276 menu.c:283 menu.c:287
++#: menu.c:278 menu.c:285 menu.c:289
+ msgid " ---------------- "
+ msgstr ""
+
+-#: menu.c:277
++#: menu.c:279
+ msgid " Go Link (a) "
+ msgstr ""
+
+-#: menu.c:278
++#: menu.c:280
+ msgid " on New Tab (n) "
+ msgstr ""
+
+-#: menu.c:279
++#: menu.c:281
+ msgid " Save Link (A) "
+ msgstr ""
+
+-#: menu.c:280
++#: menu.c:282
+ msgid " View Image (i) "
+ msgstr ""
+
+-#: menu.c:281
++#: menu.c:283
+ msgid " Save Image (I) "
+ msgstr ""
+
+-#: menu.c:282
++#: menu.c:284
+ msgid " View Frame (f) "
+ msgstr ""
+
+-#: menu.c:284
++#: menu.c:286
+ msgid " Bookmark (B) "
+ msgstr ""
+
+-#: menu.c:285
++#: menu.c:287
+ msgid " Help (h) "
+ msgstr ""
+
+-#: menu.c:286
++#: menu.c:288
+ msgid " Option (o) "
+ msgstr ""
+
+-#: menu.c:288
++#: menu.c:290
+ msgid " Quit (q) "
+ msgstr ""
+
+-#: rc.c:60
++#: rc.c:62
+ msgid "External Viewer Setup"
+ msgstr ""
+
+-#: rc.c:61
++#: rc.c:63
+ msgid "Tab width in characters"
+ msgstr ""
+
+-#: rc.c:62
++#: rc.c:64
+ msgid "Indent for HTML rendering"
+ msgstr ""
+
+-#: rc.c:63
++#: rc.c:65
+ msgid "Number of pixels per character (4.0...32.0)"
+ msgstr ""
+
+-#: rc.c:64
++#: rc.c:66
+ msgid "Number of pixels per line (4.0...64.0)"
+ msgstr ""
+
+-#: rc.c:65
++#: rc.c:67
+ msgid "Number of remembered lines when used as a pager"
+ msgstr ""
+
+-#: rc.c:66
++#: rc.c:68
+ msgid "Use URL history"
+ msgstr ""
+
+-#: rc.c:67
++#: rc.c:69
+ msgid "Number of remembered URL"
+ msgstr ""
+
+-#: rc.c:68
++#: rc.c:70
+ msgid "Save URL history"
+ msgstr ""
+
+-#: rc.c:69
++#: rc.c:71
+ msgid "Render frames automatically"
+ msgstr ""
+
+-#: rc.c:70
++#: rc.c:72
+ msgid "Treat argument without scheme as URL"
+ msgstr ""
+
+-#: rc.c:71
++#: rc.c:73
+ msgid "Use _self as default target"
+ msgstr ""
+
+-#: rc.c:72
++#: rc.c:74
+ msgid "Open link on new tab if target is _blank or _new"
+ msgstr ""
+
+-#: rc.c:73
++#: rc.c:75
+ msgid "Open download list panel on new tab"
+ msgstr ""
+
+-#: rc.c:74
++#: rc.c:76
+ msgid "Display link URL automatically"
+ msgstr ""
+
+-#: rc.c:75
++#: rc.c:77
+ msgid "Display link numbers"
+ msgstr ""
+
+-#: rc.c:76
++#: rc.c:78
+ msgid "Display decoded URL"
+ msgstr ""
+
+-#: rc.c:77
++#: rc.c:79
+ msgid "Display current line number"
+ msgstr ""
+
+-#: rc.c:78
++#: rc.c:80
+ msgid "Display inline images"
+ msgstr ""
+
+-#: rc.c:79
++#: rc.c:81
+ msgid "Display pseudo-ALTs for inline images with no ALT or TITLE string"
+ msgstr ""
+
+-#: rc.c:81
++#: rc.c:83
+ msgid "Load inline images automatically"
+ msgstr ""
+
+-#: rc.c:82
++#: rc.c:84
+ msgid "Maximum processes for parallel image loading"
+ msgstr ""
+
+-#: rc.c:83
++#: rc.c:85
+ msgid "Use external image viewer"
+ msgstr ""
+
+-#: rc.c:84
++#: rc.c:86
+ msgid "Scale of image (%)"
+ msgstr ""
+
+-#: rc.c:85
++#: rc.c:87
+ msgid "External command to display image"
+ msgstr ""
+
+-#: rc.c:86
++#: rc.c:88
+ msgid "Use link list of image map"
+ msgstr ""
+
+-#: rc.c:88
++#: rc.c:90
+ msgid "Display file names in multi-column format"
+ msgstr ""
+
+-#: rc.c:89
++#: rc.c:91
+ msgid "Use ASCII equivalents to display entities"
+ msgstr ""
+
+-#: rc.c:90
++#: rc.c:92
+ msgid "Character type for border of table and menu"
+ msgstr ""
+
+-#: rc.c:91
++#: rc.c:93
++msgid "Display table borders, ignore value of BORDER"
++msgstr ""
++
++#: rc.c:94
+ msgid "Fold lines in TEXTAREA"
+ msgstr ""
+
+-#: rc.c:92
++#: rc.c:95
+ msgid "Display INS, DEL, S and STRIKE element"
+ msgstr ""
+
+-#: rc.c:93
++#: rc.c:96
+ msgid "Display with color"
+ msgstr ""
+
+-#: rc.c:94
++#: rc.c:97
+ msgid "Color of normal character"
+ msgstr ""
+
+-#: rc.c:95
++#: rc.c:98
+ msgid "Color of anchor"
+ msgstr ""
+
+-#: rc.c:96
++#: rc.c:99
+ msgid "Color of image link"
+ msgstr ""
+
+-#: rc.c:97
++#: rc.c:100
+ msgid "Color of form"
+ msgstr ""
+
+-#: rc.c:98
++#: rc.c:101
+ msgid "Enable coloring of active link"
+ msgstr ""
+
+-#: rc.c:99
++#: rc.c:102
+ msgid "Color of currently active link"
+ msgstr ""
+
+-#: rc.c:100
++#: rc.c:103
+ msgid "Use visited link color"
+ msgstr ""
+
+-#: rc.c:101
++#: rc.c:104
+ msgid "Color of visited link"
+ msgstr ""
+
+-#: rc.c:102
++#: rc.c:105
+ msgid "Color of background"
+ msgstr ""
+
+-#: rc.c:103
++#: rc.c:106
+ msgid "Color of mark"
+ msgstr ""
+
+-#: rc.c:104
++#: rc.c:107
+ msgid "Use proxy"
+ msgstr ""
+
+-#: rc.c:105
++#: rc.c:108
+ msgid "URL of HTTP proxy host"
+ msgstr ""
+
+-#: rc.c:107
++#: rc.c:110
+ msgid "URL of HTTPS proxy host"
+ msgstr ""
+
+-#: rc.c:110
++#: rc.c:113
+ msgid "URL of GOPHER proxy host"
+ msgstr ""
+
+-#: rc.c:112
++#: rc.c:115
+ msgid "URL of FTP proxy host"
+ msgstr ""
+
+-#: rc.c:113
++#: rc.c:116
+ msgid "Domains to be accessed directly (no proxy)"
+ msgstr ""
+
+-#: rc.c:114
++#: rc.c:117
+ msgid "Check noproxy by network address"
+ msgstr ""
+
+-#: rc.c:115
++#: rc.c:118
+ msgid "Disable cache"
+ msgstr ""
+
+-#: rc.c:117
++#: rc.c:120
+ msgid "News server"
+ msgstr ""
+
+-#: rc.c:118
++#: rc.c:121
+ msgid "Mode of news server"
+ msgstr ""
+
+-#: rc.c:119
++#: rc.c:122
+ msgid "Number of news messages"
+ msgstr ""
+
+-#: rc.c:121
++#: rc.c:124
+ msgid "Order of name resolution"
+ msgstr ""
+
+-#: rc.c:122
++#: rc.c:125
+ msgid "Directory corresponding to / (document root)"
+ msgstr ""
+
+-#: rc.c:123
++#: rc.c:126
+ msgid "Directory corresponding to /~user"
+ msgstr ""
+
+-#: rc.c:124
++#: rc.c:127
+ msgid "Directory corresponding to /cgi-bin"
+ msgstr ""
+
+-#: rc.c:125
++#: rc.c:128
+ msgid "Confirm when quitting with q"
+ msgstr ""
+
+-#: rc.c:126
++#: rc.c:129
+ msgid "Close tab if buffer is last when back"
+ msgstr ""
+
+-#: rc.c:128
++#: rc.c:131
+ msgid "Enable mark operations"
+ msgstr ""
+
+-#: rc.c:130
++#: rc.c:133
+ msgid "Enable Emacs-style line editing"
+ msgstr ""
+
+-#: rc.c:131
++#: rc.c:134
+ msgid "Enable vi-like numeric prefix"
+ msgstr ""
+
+-#: rc.c:132
++#: rc.c:135
+ msgid "Move cursor to top line when going to label"
+ msgstr ""
+
+-#: rc.c:133
++#: rc.c:136
+ msgid "Move cursor to top line when moving to next page"
+ msgstr ""
+
+-#: rc.c:134
++#: rc.c:137
+ msgid "Fold lines of plain text file"
+ msgstr ""
+
+-#: rc.c:135
++#: rc.c:138
+ msgid "Show line numbers"
+ msgstr ""
+
+-#: rc.c:136
++#: rc.c:139
+ msgid "Show search string"
+ msgstr ""
+
+-#: rc.c:137
++#: rc.c:140
+ msgid "List of mime.types files"
+ msgstr ""
+
+-#: rc.c:138
++#: rc.c:141
+ msgid "List of mailcap files"
+ msgstr ""
+
+-#: rc.c:139
++#: rc.c:142
+ msgid "List of urimethodmap files"
+ msgstr ""
+
+-#: rc.c:140
++#: rc.c:143
+ msgid "Editor"
+ msgstr ""
+
+-#: rc.c:141
++#: rc.c:144
+ msgid "Mailer"
+ msgstr ""
+
+-#: rc.c:142
++#: rc.c:145
+ msgid "How to call Mailer for mailto URLs with options"
+ msgstr ""
+
+-#: rc.c:143
+-msgid "External Browser"
++#: rc.c:146
++msgid "External browser"
+ msgstr ""
+
+-#: rc.c:144
+-msgid "Second External Browser"
++#: rc.c:147
++msgid "2nd external browser"
+ msgstr ""
+
+-#: rc.c:145
+-msgid "Third External Browser"
++#: rc.c:148
++msgid "3rd external browser"
+ msgstr ""
+
+-#: rc.c:146
++#: rc.c:149
++msgid "4th external browser"
++msgstr ""
++
++#: rc.c:150
++msgid "5th external browser"
++msgstr ""
++
++#: rc.c:151
++msgid "6th external browser"
++msgstr ""
++
++#: rc.c:152
++msgid "7th external browser"
++msgstr ""
++
++#: rc.c:153
++msgid "8th external browser"
++msgstr ""
++
++#: rc.c:154
++msgid "9th external browser"
++msgstr ""
++
++#: rc.c:155
+ msgid "Disable secret file security check"
+ msgstr ""
+
+-#: rc.c:147
++#: rc.c:156
+ msgid "Password file"
+ msgstr ""
+
+-#: rc.c:148
++#: rc.c:157
+ msgid "File for setting form on loading"
+ msgstr ""
+
+-#: rc.c:149
++#: rc.c:158
++msgid "File for preferences for each site"
++msgstr ""
++
++#: rc.c:159
+ msgid "Password for anonymous FTP (your mail address)"
+ msgstr ""
+
+-#: rc.c:150
++#: rc.c:160
+ msgid "Generate domain part of password for FTP"
+ msgstr ""
+
+-#: rc.c:151
++#: rc.c:161
+ msgid "User-Agent identification string"
+ msgstr ""
+
+-#: rc.c:152
++#: rc.c:162
+ msgid "Accept-Encoding header"
+ msgstr ""
+
+-#: rc.c:153
++#: rc.c:163
+ msgid "Accept header"
+ msgstr ""
+
+-#: rc.c:154
++#: rc.c:164
+ msgid "Accept-Language header"
+ msgstr ""
+
+-#: rc.c:155
++#: rc.c:165
+ msgid "Treat URL-like strings as links in all pages"
+ msgstr ""
+
+-#: rc.c:156
++#: rc.c:166
+ msgid "Wrap search"
+ msgstr ""
+
+-#: rc.c:157
++#: rc.c:167
+ msgid "Display unseen objects (e.g. bgimage tag)"
+ msgstr ""
+
+-#: rc.c:158
++#: rc.c:168
+ msgid "Uncompress compressed data automatically when downloading"
+ msgstr ""
+
+-#: rc.c:160
++#: rc.c:170
+ msgid "Run external viewer in a separate session"
+ msgstr ""
+
+-#: rc.c:162
++#: rc.c:172
+ msgid "Run external viewer in the background"
+ msgstr ""
+
+-#: rc.c:164
++#: rc.c:174
+ msgid "Use external program for directory listing"
+ msgstr ""
+
+-#: rc.c:165
++#: rc.c:175
+ msgid "URL of directory listing command"
+ msgstr ""
+
+-#: rc.c:167
++#: rc.c:177
+ msgid "Enable dictionary lookup through CGI"
+ msgstr ""
+
+-#: rc.c:168
++#: rc.c:178
+ msgid "URL of dictionary lookup command"
+ msgstr ""
+
+-#: rc.c:170
++#: rc.c:180
+ msgid "Display link name for images lacking ALT"
+ msgstr ""
+
+-#: rc.c:171
++#: rc.c:181
+ msgid "Index file for directories"
+ msgstr ""
+
+-#: rc.c:172
++#: rc.c:182
+ msgid "Prepend http:// to URL automatically"
+ msgstr ""
+
+-#: rc.c:173
++#: rc.c:183
+ msgid "Default value for open-URL command"
+ msgstr ""
+
+-#: rc.c:174
++#: rc.c:184
+ msgid "Decode Content-Transfer-Encoding when saving"
+ msgstr ""
+
+-#: rc.c:175
++#: rc.c:185
+ msgid "Preserve timestamp when saving"
+ msgstr ""
+
+-#: rc.c:177
++#: rc.c:187
+ msgid "Enable mouse"
+ msgstr ""
+
+-#: rc.c:178
++#: rc.c:188
+ msgid "Scroll in reverse direction of mouse drag"
+ msgstr ""
+
+-#: rc.c:179
++#: rc.c:189
+ msgid "Behavior of wheel scroll speed"
+ msgstr ""
+
+-#: rc.c:180
++#: rc.c:190
+ msgid "(A only)Scroll by # (%) of screen"
+ msgstr ""
+
+-#: rc.c:181
++#: rc.c:191
+ msgid "(B only)Scroll by # lines"
+ msgstr ""
+
+-#: rc.c:183
++#: rc.c:193
+ msgid "Free memory of undisplayed buffers"
+ msgstr ""
+
+-#: rc.c:184
++#: rc.c:194
+ msgid "Suppress `Referer:' header"
+ msgstr ""
+
+-#: rc.c:185
++#: rc.c:195
+ msgid "Search case-insensitively"
+ msgstr ""
+
+-#: rc.c:186
++#: rc.c:196
+ msgid "Use LESSOPEN"
+ msgstr ""
+
+-#: rc.c:189
++#: rc.c:199
+ msgid "Perform SSL server verification"
+ msgstr ""
+
+-#: rc.c:190
++#: rc.c:200
+ msgid "PEM encoded certificate file of client"
+ msgstr ""
+
+-#: rc.c:191
++#: rc.c:201
+ msgid "PEM encoded private key file of client"
+ msgstr ""
+
+-#: rc.c:192
++#: rc.c:202
+ msgid "Path to directory for PEM encoded certificates of CAs"
+ msgstr ""
+
+-#: rc.c:193
++#: rc.c:203
+ msgid "File consisting of PEM encoded certificates of CAs"
+ msgstr ""
+
+-#: rc.c:195
++#: rc.c:205
+ msgid "List of forbidden SSL methods (2: SSLv2, 3: SSLv3, t:TLSv1)"
+ msgstr ""
+
+-#: rc.c:198
++#: rc.c:208
+ msgid "Enable cookie processing"
+ msgstr ""
+
+-#: rc.c:199
++#: rc.c:209
+ msgid "Print a message when receiving a cookie"
+ msgstr ""
+
+-#: rc.c:200
++#: rc.c:210
+ msgid "Accept cookies"
+ msgstr ""
+
+-#: rc.c:201
++#: rc.c:211
+ msgid "Action to be taken on invalid cookie"
+ msgstr ""
+
+-#: rc.c:202
++#: rc.c:212
+ msgid "Domains to reject cookies from"
+ msgstr ""
+
+-#: rc.c:203
++#: rc.c:213
+ msgid "Domains to accept cookies from"
+ msgstr ""
+
+-#: rc.c:204
++#: rc.c:214
+ msgid "Domains to avoid [wrong number of dots]"
+ msgstr ""
+
+-#: rc.c:206
++#: rc.c:216
+ msgid "Number of redirections to follow"
+ msgstr ""
+
+-#: rc.c:207
++#: rc.c:217
+ msgid "Enable processing of meta-refresh tag"
+ msgstr ""
+
+-#: rc.c:210
++#: rc.c:220
+ msgid "Enable Migemo (Roma-ji search)"
+ msgstr ""
+
+-#: rc.c:211
++#: rc.c:221
+ msgid "Migemo command"
+ msgstr ""
+
+-#: rc.c:215
++#: rc.c:225
+ msgid "Display charset"
+ msgstr ""
+
+-#: rc.c:216
++#: rc.c:226
+ msgid "Default document charset"
+ msgstr ""
+
+-#: rc.c:217
++#: rc.c:227
+ msgid "Automatic charset detect when loading"
+ msgstr ""
+
+-#: rc.c:218
++#: rc.c:228
+ msgid "System charset"
+ msgstr ""
+
+-#: rc.c:219
++#: rc.c:229
+ msgid "System charset follows locale(LC_CTYPE)"
+ msgstr ""
+
+-#: rc.c:220
++#: rc.c:230
+ msgid "Output halfdump with display charset"
+ msgstr ""
+
+-#: rc.c:221
++#: rc.c:231
+ msgid "Use multi column characters"
+ msgstr ""
+
+-#: rc.c:222
++#: rc.c:232
+ msgid "Use combining characters"
+ msgstr ""
+
+-#: rc.c:223
++#: rc.c:233
+ msgid "Use double width for some Unicode characters"
+ msgstr ""
+
+-#: rc.c:224
++#: rc.c:234
+ msgid "Use Unicode language tags"
+ msgstr ""
+
+-#: rc.c:225
++#: rc.c:235
+ msgid "Charset conversion using Unicode map"
+ msgstr ""
+
+-#: rc.c:226
++#: rc.c:236
+ msgid "Charset conversion when loading"
+ msgstr ""
+
+-#: rc.c:227
++#: rc.c:237
+ msgid "Adjust search string for document charset"
+ msgstr ""
+
+-#: rc.c:228
++#: rc.c:238
+ msgid "Fix character width when conversion"
+ msgstr ""
+
+-#: rc.c:229
++#: rc.c:239
+ msgid "Use GB 12345 Unicode map instead of GB 2312's"
+ msgstr ""
+
+-#: rc.c:230
++#: rc.c:240
+ msgid "Use JIS X 0201 Roman for ISO-2022-JP"
+ msgstr ""
+
+-#: rc.c:231
++#: rc.c:241
+ msgid "Use JIS C 6226:1978 for ISO-2022-JP"
+ msgstr ""
+
+-#: rc.c:232
++#: rc.c:242
+ msgid "Use JIS X 0201 Katakana"
+ msgstr ""
+
+-#: rc.c:233
++#: rc.c:243
+ msgid "Use JIS X 0212:1990 (Supplemental Kanji)"
+ msgstr ""
+
+-#: rc.c:234
++#: rc.c:244
+ msgid "Use JIS X 0213:2000 (2000JIS)"
+ msgstr ""
+
+-#: rc.c:235
++#: rc.c:245
+ msgid "Strict ISO-2022-JP/KR/CN"
+ msgstr ""
+
+-#: rc.c:236
++#: rc.c:246
+ msgid "Treat 4 bytes char. of GB18030 as Unicode"
+ msgstr ""
+
+-#: rc.c:237
++#: rc.c:247
+ msgid "Simple Preserve space"
+ msgstr ""
+
+-#: rc.c:240
++#: rc.c:250
+ msgid "keymap file"
+ msgstr ""
+
+-#: rc.c:257
++#: rc.c:267
+ msgid "black"
+ msgstr ""
+
+-#: rc.c:258
++#: rc.c:268
+ msgid "red"
+ msgstr ""
+
+-#: rc.c:259
++#: rc.c:269
+ msgid "green"
+ msgstr ""
+
+-#: rc.c:260
++#: rc.c:270
+ msgid "yellow"
+ msgstr ""
+
+-#: rc.c:261
++#: rc.c:271
+ msgid "blue"
+ msgstr ""
+
+-#: rc.c:262
++#: rc.c:272
+ msgid "magenta"
+ msgstr ""
+
+-#: rc.c:263
++#: rc.c:273
+ msgid "cyan"
+ msgstr ""
+
+-#: rc.c:264
++#: rc.c:274
+ msgid "white"
+ msgstr ""
+
+-#: rc.c:265
++#: rc.c:275
+ msgid "terminal"
+ msgstr ""
+
+-#: rc.c:284
++#: rc.c:294
+ msgid "none"
+ msgstr ""
+
+-#: rc.c:285
++#: rc.c:295
+ msgid "current URL"
+ msgstr ""
+
+-#: rc.c:286
++#: rc.c:296
+ msgid "link URL"
+ msgstr ""
+
+-#: rc.c:291
++#: rc.c:301
+ msgid "simple"
+ msgstr ""
+
+-#: rc.c:292
++#: rc.c:302
+ msgid "use tag"
+ msgstr ""
+
+-#: rc.c:293
++#: rc.c:303
+ msgid "fontify"
+ msgstr ""
+
+-#: rc.c:299
++#: rc.c:309
+ msgid "A:relative to screen height"
+ msgstr ""
+
+-#: rc.c:300
++#: rc.c:310
+ msgid "B:fixed speed"
+ msgstr ""
+
+-#: rc.c:307
++#: rc.c:317
+ msgid "unspecified"
+ msgstr ""
+
+-#: rc.c:308
++#: rc.c:318
+ msgid "inet inet6"
+ msgstr ""
+
+-#: rc.c:309
++#: rc.c:319
+ msgid "inet6 inet"
+ msgstr ""
+
+-#: rc.c:310
++#: rc.c:320
+ msgid "inet only"
+ msgstr ""
+
+-#: rc.c:311
++#: rc.c:321
+ msgid "inet6 only"
+ msgstr ""
+
+-#: rc.c:318
++#: rc.c:328
+ msgid "discard"
+ msgstr ""
+
+-#: rc.c:320
++#: rc.c:330
+ msgid "accept"
+ msgstr ""
+
+-#: rc.c:322
++#: rc.c:332
+ msgid "ask"
+ msgstr ""
+
+-#: rc.c:329
++#: rc.c:339
+ msgid "use internal mailer instead"
+ msgstr ""
+
+-#: rc.c:331
++#: rc.c:341
+ msgid "ignore options and use only the address"
+ msgstr ""
+
+-#: rc.c:332
++#: rc.c:342
+ msgid "use full mailto URL"
+ msgstr ""
+
+-#: rc.c:341
++#: rc.c:351
+ msgid "OFF"
+ msgstr ""
+
+-#: rc.c:342
++#: rc.c:352
+ msgid "Only ISO 2022"
+ msgstr ""
+
+-#: rc.c:343
++#: rc.c:353
+ msgid "ON"
+ msgstr ""
+
+-#: rc.c:349
++#: rc.c:359
+ msgid "ASCII"
+ msgstr ""
+
+-#: rc.c:350
++#: rc.c:360
+ msgid "charset specific"
+ msgstr ""
+
+-#: rc.c:351
++#: rc.c:361
+ msgid "DEC special graphics"
+ msgstr ""
+
+-#: rc.c:714
++#: rc.c:740
+ msgid "Display Settings"
+ msgstr ""
+
+-#: rc.c:716
++#: rc.c:742
+ msgid "Color Settings"
+ msgstr ""
+
+-#: rc.c:718
++#: rc.c:744
+ msgid "Miscellaneous Settings"
+ msgstr ""
+
+-#: rc.c:719
++#: rc.c:745
+ msgid "Directory Settings"
+ msgstr ""
+
+-#: rc.c:720
++#: rc.c:746
+ msgid "External Program Settings"
+ msgstr ""
+
+-#: rc.c:721
++#: rc.c:747
+ msgid "Network Settings"
+ msgstr ""
+
+-#: rc.c:722
++#: rc.c:748
+ msgid "Proxy Settings"
+ msgstr ""
+
+-#: rc.c:724
++#: rc.c:750
+ msgid "SSL Settings"
+ msgstr ""
+
+-#: rc.c:727
++#: rc.c:753
+ msgid "Cookie Settings"
+ msgstr ""
+
+-#: rc.c:730
++#: rc.c:756
+ msgid "Charset Settings"
+ msgstr ""
+
+@@ -874,6 +906,6 @@ msgstr ""
+ #. * header. For example, ja.po should translate it as
+ #. * "ja;q=1.0, en;q=0.5" like that.
+ #.
+-#: rc.c:1209
++#: rc.c:1238
+ msgid "en;q=1.0"
+ msgstr ""
+diff --git a/po/zh_CN.po b/po/zh_CN.po
+new file mode 100644
+index 0000000..8cfa8fd
+--- /dev/null
++++ b/po/zh_CN.po
+@@ -0,0 +1,916 @@
++# zh_CN translation for w3m
++# Copyright (C) YEAR THE w3m'S COPYRIGHT HOLDER
++# This file is distributed under the same license as the w3m package.
++# Junde Yi <lmy441900@gmail.com>, 2014.
++# Mingcong Bai <jeffbai@aosc.xyz>, 2014.
++# liushuyu <liushuyu_011@126.com>, 2014.
++# Xingda Zheng <icenowy@outlook.com>, 2014.
++# Mingye Wang (Arthur2e5) <arthur200126@gmail.com>, 2014, 2015.
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: w3m 0.5.3\n"
++"Report-Msgid-Bugs-To: satodai@w3m.jp\n"
++"POT-Creation-Date: 2016-03-14 19:47+0900\n"
++"PO-Revision-Date: 2016-03-14 19:51+0900\n"
++"Last-Translator: Tatsuya Kinoshita <tats@debian.org>\n"
++"Language-Team: AOSC zh_CN <aosc@members.fsf.org>\n"
++"Language: zh_CN\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Poedit 1.8.6\n"
++"Plural-Forms: nplurals=1; plural=0;\n"
++
++#: menu.c:269
++msgid " Back (b) "
++msgstr " åé (b) "
++
++#: menu.c:270
++msgid " Select Buffer(s) "
++msgstr " éæ©ç¼å²åº "
++
++#: menu.c:272
++msgid " Select Tab (t) "
++msgstr " éæ©æ ç¾ (t) "
++
++#: menu.c:274
++msgid " View Source (v) "
++msgstr " æ¥çæºç (v) "
++
++#: menu.c:275
++msgid " Edit Source (e) "
++msgstr " ä¿®æ¹æºç (e) "
++
++#: menu.c:276
++msgid " Save Source (S) "
++msgstr " ä¿åæºç (S) "
++
++#: menu.c:277
++msgid " Reload (r) "
++msgstr " éæ°è½½å
¥ (r) "
++
++#: menu.c:278 menu.c:285 menu.c:289
++msgid " ---------------- "
++msgstr " ---------------- "
++
++#: menu.c:279
++msgid " Go Link (a) "
++msgstr " 转å°é¾æ¥ (a) "
++
++#: menu.c:280
++msgid " on New Tab (n) "
++msgstr " å¨æ°æ ç¾ (n) "
++
++#: menu.c:281
++msgid " Save Link (A) "
++msgstr " ä¿åé¾æ¥ (A) "
++
++#: menu.c:282
++msgid " View Image (i) "
++msgstr " æ¥çå¾ç (i) "
++
++#: menu.c:283
++msgid " Save Image (I) "
++msgstr " ä¿åå¾ç (I) "
++
++#: menu.c:284
++msgid " View Frame (f) "
++msgstr " æ¥çæ¡æ¶ (f) "
++
++#: menu.c:286
++msgid " Bookmark (B) "
++msgstr " ä¹¦ç¾ (B) "
++
++#: menu.c:287
++msgid " Help (h) "
++msgstr " å¸®å© (h) "
++
++#: menu.c:288
++msgid " Option (o) "
++msgstr " é项 (o) "
++
++#: menu.c:290
++msgid " Quit (q) "
++msgstr " éåº (q) "
++
++#: rc.c:62
++msgid "External Viewer Setup"
++msgstr "å¤é¨æ¥çå¨è®¾ç½®"
++
++#: rc.c:63
++msgid "Tab width in characters"
++msgstr "æåä¸ç TAB 宽度"
++
++#: rc.c:64
++msgid "Indent for HTML rendering"
++msgstr "ç¨äº HTML 渲æ"
++
++#: rc.c:65
++msgid "Number of pixels per character (4.0...32.0)"
++msgstr "æ¯åä½å¤§å°çåç´ å¼ (4.0...32.0)"
++
++#: rc.c:66
++msgid "Number of pixels per line (4.0...64.0)"
++msgstr "æ¯è¡çåç´ æ° (4.0...64.0)"
++
++#: rc.c:67
++msgid "Number of remembered lines when used as a pager"
++msgstr "å½ä½ä¸ºå页å¨ä½¿ç¨æ¶è®°å¿çè¡æ°"
++
++#: rc.c:68
++msgid "Use URL history"
++msgstr "ä½¿ç¨ URL åå²è®°å½"
++
++#: rc.c:69
++msgid "Number of remembered URL"
++msgstr "è®°å½ç URL æ°é"
++
++#: rc.c:70
++msgid "Save URL history"
++msgstr "ä¿å URL åå²"
++
++#: rc.c:71
++msgid "Render frames automatically"
++msgstr "èªå¨æ¸²ææ¡æ¶"
++
++#: rc.c:72
++msgid "Treat argument without scheme as URL"
++msgstr "å°æ æ ¼å¼çåæ°çä½ URL"
++
++#: rc.c:73
++msgid "Use _self as default target"
++msgstr "å°èªèº«ä½ä¸ºé»è®¤ç®æ (_S)"
++
++#: rc.c:74
++msgid "Open link on new tab if target is _blank or _new"
++msgstr "å¦æç®æ 为空 (_b) ææ°å»º (_n) å¨æ°æ ç¾æå¼é¡µé¢"
++
++#: rc.c:75
++msgid "Open download list panel on new tab"
++msgstr "æå¼ä¸è½½å表é¢æ¿äºæ°æ ç¾"
++
++#: rc.c:76
++msgid "Display link URL automatically"
++msgstr "èªå¨æ¾ç¤ºé¾æ¥ URL"
++
++#: rc.c:77
++msgid "Display link numbers"
++msgstr "æ¾ç¤ºé¾æ¥ç¼å·"
++
++#: rc.c:78
++msgid "Display decoded URL"
++msgstr "æ¾ç¤ºè§£ç åç URL"
++
++#: rc.c:79
++msgid "Display current line number"
++msgstr "æ¾ç¤ºå½åè¡æ°"
++
++#: rc.c:80
++msgid "Display inline images"
++msgstr "æ¾ç¤ºå
èå¾å"
++
++#: rc.c:81
++msgid "Display pseudo-ALTs for inline images with no ALT or TITLE string"
++msgstr "为ä¸å¸¦æ ALT æ TITLE å串çå
èå¾åæ¾ç¤ºä¼ª ALT"
++
++#: rc.c:83
++msgid "Load inline images automatically"
++msgstr "èªå¨è½½å
¥è¡å
å¾å"
++
++#: rc.c:84
++msgid "Maximum processes for parallel image loading"
++msgstr "å¤çº¿ç¨å¾åå è½½çæ大è¿ç¨æ°"
++
++#: rc.c:85
++msgid "Use external image viewer"
++msgstr "使ç¨å¤é¨å¾çæ¥çå¨"
++
++#: rc.c:86
++msgid "Scale of image (%)"
++msgstr "å¾åæ¯ä¾å°º (%)"
++
++#: rc.c:87
++msgid "External command to display image"
++msgstr "ç¨äºæ¾ç¤ºå¾åçå¤é¨å½ä»¤"
++
++#: rc.c:88
++msgid "Use link list of image map"
++msgstr "使ç¨å¾åæ å°çé¾æ¥å表"
++
++#: rc.c:90
++msgid "Display file names in multi-column format"
++msgstr "以å¤åæ ¼å¼æ¾ç¤ºæ件å"
++
++#: rc.c:91
++msgid "Use ASCII equivalents to display entities"
++msgstr "使ç¨å¯¹åºç ASCII ç¼ç æ¥æ¾ç¤ºå®ä½ "
++
++#: rc.c:92
++msgid "Character type for border of table and menu"
++msgstr "è¡¨æ ¼åèåè¾¹æ¡çå符类å"
++
++#: rc.c:93
++msgid "Display table borders, ignore value of BORDER"
++msgstr "æ¾ç¤ºè¡¨æ ¼è¾¹æ¡ï¼å¿½ç¥ BORDER æ°å¼"
++
++#: rc.c:94
++msgid "Fold lines in TEXTAREA"
++msgstr "å¨ææ¬åº (TEXTAREA) ä¸æå è¡"
++
++#: rc.c:95
++msgid "Display INS, DEL, S and STRIKE element"
++msgstr "æ¾ç¤º INS, DEL, S å STRIKE å
ç´ "
++
++#: rc.c:96
++msgid "Display with color"
++msgstr "使ç¨å¸¦é¢è²çæ¾ç¤º"
++
++#: rc.c:97
++msgid "Color of normal character"
++msgstr "ä¸è¬æåé¢è²"
++
++#: rc.c:98
++msgid "Color of anchor"
++msgstr "é¾æ¥æåé¢è²"
++
++#: rc.c:99
++msgid "Color of image link"
++msgstr "å¾çé¾æ¥é¢è²"
++
++#: rc.c:100
++msgid "Color of form"
++msgstr "è¡¨æ ¼é¢è²"
++
++#: rc.c:101
++msgid "Enable coloring of active link"
++msgstr "为活å¨é¾æ¥å¼å¯ä¸è²"
++
++#: rc.c:102
++msgid "Color of currently active link"
++msgstr "å½åæ´»å¨é¾æ¥çé¢è²"
++
++#: rc.c:103
++msgid "Use visited link color"
++msgstr "为访é®è¿çé¾æ¥ä¸è²"
++
++#: rc.c:104
++msgid "Color of visited link"
++msgstr "已访é®é¾æ¥é¢è²"
++
++#: rc.c:105
++msgid "Color of background"
++msgstr "èæ¯è²"
++
++#: rc.c:106
++msgid "Color of mark"
++msgstr "æ è®°é¢è²"
++
++#: rc.c:107
++msgid "Use proxy"
++msgstr "使ç¨ä»£çæå¡å¨"
++
++#: rc.c:108
++msgid "URL of HTTP proxy host"
++msgstr "HTTP 代ç主æºå°å"
++
++#: rc.c:110
++msgid "URL of HTTPS proxy host"
++msgstr "HTTPS 代ç主æºå°å"
++
++#: rc.c:113
++msgid "URL of GOPHER proxy host"
++msgstr "GOPHER 代ç主æºå°å"
++
++#: rc.c:115
++msgid "URL of FTP proxy host"
++msgstr "FTP 代ç主æºå°å"
++
++#: rc.c:116
++msgid "Domains to be accessed directly (no proxy)"
++msgstr "ç´æ¥è®¿é®èä¸æ¯ç¨ä»£çæå¡å¨è®¿é®ç URL"
++
++#: rc.c:117
++msgid "Check noproxy by network address"
++msgstr "æ ¹æ®ç½ç»å°åæ£æ¥ noproxy"
++
++#: rc.c:118
++msgid "Disable cache"
++msgstr "ç¦ç¨ç¼å"
++
++#: rc.c:120
++msgid "News server"
++msgstr "æ°é»æå¡å¨"
++
++#: rc.c:121
++msgid "Mode of news server"
++msgstr "æ°é»æå¡å¨æ¨¡å¼"
++
++#: rc.c:122
++msgid "Number of news messages"
++msgstr "æ°é»æ¶æ¯çæ°é"
++
++#: rc.c:124
++msgid "Order of name resolution"
++msgstr "å称解æ顺åº"
++
++#: rc.c:125
++msgid "Directory corresponding to / (document root)"
++msgstr "å¯¹åº / çç®å½ (ææ¡£æ ¹ç®å½)"
++
++#: rc.c:126
++msgid "Directory corresponding to /~user"
++msgstr "å¯¹åº /~user çç®å½"
++
++#: rc.c:127
++msgid "Directory corresponding to /cgi-bin"
++msgstr "å¯¹åº /cgi-bin çç®å½"
++
++#: rc.c:128
++msgid "Confirm when quitting with q"
++msgstr "ä½¿ç¨ q é®éåºæ¶è¯·æ±ç¡®è®¤"
++
++#: rc.c:129
++msgid "Close tab if buffer is last when back"
++msgstr "å¨è¿åæ¶ç¼å²åºè¿æ¯ä»¥åç¶æå°±å
³éæ ç¾é¡µ"
++
++#: rc.c:131
++msgid "Enable mark operations"
++msgstr "å¯ç¨æ è®°æä½"
++
++#: rc.c:133
++msgid "Enable Emacs-style line editing"
++msgstr "å¯ç¨ Emacs é£æ ¼çè¡ç¼è¾"
++
++#: rc.c:134
++msgid "Enable vi-like numeric prefix"
++msgstr "å¯å¨ vi å¼çæ°å跳转"
++
++#: rc.c:135
++msgid "Move cursor to top line when going to label"
++msgstr "å½ç§»å¨å°æ ç¾æ¶å°å
æ 移å°æ顶è¡"
++
++#: rc.c:136
++msgid "Move cursor to top line when moving to next page"
++msgstr "å½è½¬å°ä¸ä¸é¡µæ¶å°å
æ 移å°æ顶è¡"
++
++#: rc.c:137
++msgid "Fold lines of plain text file"
++msgstr "对纯ææ¬æ件å®è¡è¡æå "
++
++#: rc.c:138
++msgid "Show line numbers"
++msgstr "æ¾ç¤ºè¡å·"
++
++#: rc.c:139
++msgid "Show search string"
++msgstr "æ¾ç¤ºæç´¢å符串"
++
++#: rc.c:140
++msgid "List of mime.types files"
++msgstr "mime.type æ件å表"
++
++#: rc.c:141
++msgid "List of mailcap files"
++msgstr "mailcap æ件å表"
++
++#: rc.c:142
++msgid "List of urimethodmap files"
++msgstr "urlmethodmap æ件å表"
++
++#: rc.c:143
++msgid "Editor"
++msgstr "ç¼è¾å¨"
++
++#: rc.c:144
++msgid "Mailer"
++msgstr "åéè
"
++
++#: rc.c:145
++msgid "How to call Mailer for mailto URLs with options"
++msgstr "å¯å¨ mailto å°åæ¶è°ç¨çµåé®ä»¶ç¨åºçæ¹å¼ååæ°"
++
++#: rc.c:146
++msgid "External browser"
++msgstr "å¤é¨æµè§å¨"
++
++#: rc.c:147
++msgid "2nd external browser"
++msgstr "第äºå¤é¨æµè§å¨"
++
++#: rc.c:148
++msgid "3rd external browser"
++msgstr "第ä¸å¤é¨æµè§å¨"
++
++#: rc.c:149
++msgid "4th external browser"
++msgstr "第åå¤é¨æµè§å¨"
++
++#: rc.c:150
++msgid "5th external browser"
++msgstr "第äºå¤é¨æµè§å¨"
++
++#: rc.c:151
++msgid "6th external browser"
++msgstr "第å
å¤é¨æµè§å¨"
++
++#: rc.c:152
++msgid "7th external browser"
++msgstr "第ä¸å¤é¨æµè§å¨"
++
++#: rc.c:153
++msgid "8th external browser"
++msgstr "第å
«å¤é¨æµè§å¨"
++
++#: rc.c:154
++msgid "9th external browser"
++msgstr "第ä¹å¤é¨æµè§å¨"
++
++#: rc.c:155
++msgid "Disable secret file security check"
++msgstr "å
³éç§å¯æ件å®å
¨æ£æ¥"
++
++#: rc.c:156
++msgid "Password file"
++msgstr "å¯ç æ件"
++
++#: rc.c:157
++msgid "File for setting form on loading"
++msgstr "设置çªå£å è½½æ¶çæ件"
++
++#: rc.c:158
++msgid "File for preferences for each site"
++msgstr "å个ç«ç¹çé¦é项æ件"
++
++#: rc.c:159
++msgid "Password for anonymous FTP (your mail address)"
++msgstr "å¿åFTPå¯ç ï¼æ¨çé®ç®±å°åï¼"
++
++#: rc.c:160
++msgid "Generate domain part of password for FTP"
++msgstr "为 FTP çæå¯ç çåé¨å"
++
++#: rc.c:161
++msgid "User-Agent identification string"
++msgstr "User-Agent 串"
++
++#: rc.c:162
++msgid "Accept-Encoding header"
++msgstr "æ¥åçç¼ç (Accept-Encoding) æ¥å¤´"
++
++#: rc.c:163
++msgid "Accept header"
++msgstr "æ¥å (Accept) æ¥å¤´"
++
++#: rc.c:164
++msgid "Accept-Language header"
++msgstr "æ¥åçè¯è¨ (Accept-Language) æ¥å¤´"
++
++#: rc.c:165
++msgid "Treat URL-like strings as links in all pages"
++msgstr "å°ææ页é¢ä¸ç±»ä¼¼äº URL çå符串å½åé¾æ¥"
++
++#: rc.c:166
++msgid "Wrap search"
++msgstr "å
è£
æç´¢ç»æ"
++
++#: rc.c:167
++msgid "Display unseen objects (e.g. bgimage tag)"
++msgstr "æ¾ç¤ºçä¸å°ç对象 ï¼ä¾å¦ï¼bdimageæ ç¾ï¼"
++
++#: rc.c:168
++msgid "Uncompress compressed data automatically when downloading"
++msgstr "å¨ä¸è½½æ¶èªå¨è§£å被å缩çæ°æ®"
++
++#: rc.c:170
++msgid "Run external viewer in a separate session"
++msgstr "å¨å¦ä¸ä¸ªä¼è¯ä¸è¿è¡å¤é¨æ¥çå¨"
++
++#: rc.c:172
++msgid "Run external viewer in the background"
++msgstr "å¨åå°è¿è¡å¤é¨æ¥çå¨"
++
++#: rc.c:174
++msgid "Use external program for directory listing"
++msgstr "使ç¨å¤é¨ç¨åºååºç®å½"
++
++#: rc.c:175
++msgid "URL of directory listing command"
++msgstr "ç®å½å表å½ä»¤çç½å"
++
++#: rc.c:177
++msgid "Enable dictionary lookup through CGI"
++msgstr "å¯ç¨åºäº CGI çè¯å
¸æ¥è¯¢"
++
++#: rc.c:178
++msgid "URL of dictionary lookup command"
++msgstr "åå
¸æ¥æ¾å½ä»¤çç½å"
++
++#: rc.c:180
++msgid "Display link name for images lacking ALT"
++msgstr "å¯¹ç¼ºå° ALT çå¾çæ¾ç¤ºé¾æ¥å称"
++
++#: rc.c:181
++msgid "Index file for directories"
++msgstr "ç®å½çç´¢å¼æ件"
++
++#: rc.c:182
++msgid "Prepend http:// to URL automatically"
++msgstr "èªå¨å¨ URL åå å
¥ http://"
++
++#: rc.c:183
++msgid "Default value for open-URL command"
++msgstr "æå¼ç½åå½ä»¤çé»è®¤å¼"
++
++#: rc.c:184
++msgid "Decode Content-Transfer-Encoding when saving"
++msgstr "ä¿åæ¶å¯¹å
å®¹ä¼ è¾ç¼ç ä¿¡æ¯ (Content-Transfer-Encoding) è¿è¡è§£ç "
++
++#: rc.c:185
++msgid "Preserve timestamp when saving"
++msgstr "å¨ä¿åæ¶ä¿çæ¶é´æ³"
++
++#: rc.c:187
++msgid "Enable mouse"
++msgstr "å¯ç¨é¼ æ "
++
++#: rc.c:188
++msgid "Scroll in reverse direction of mouse drag"
++msgstr "åé¼ æ æå¨çåæ¹åæ»å¨"
++
++#: rc.c:189
++msgid "Behavior of wheel scroll speed"
++msgstr "æ»è½®æ»å¨é度è¡ä¸º"
++
++#: rc.c:190
++msgid "(A only)Scroll by # (%) of screen"
++msgstr "(ä»
A) æ¯æ¬¡æ»å¨ # (%) çå±å¹é«åº¦"
++
++#: rc.c:191
++msgid "(B only)Scroll by # lines"
++msgstr "(ä»
B) æ¯æ¬¡æ»å¨ # è¡"
++
++#: rc.c:193
++msgid "Free memory of undisplayed buffers"
++msgstr "éæ¾æªæ¾ç¤ºç¼åçåå¨"
++
++#: rc.c:194
++msgid "Suppress `Referer:' header"
++msgstr "ç¦æ¢ 'Referer:' æ件头"
++
++#: rc.c:195
++msgid "Search case-insensitively"
++msgstr "æç´¢ä¸åºå大å°å"
++
++#: rc.c:196
++msgid "Use LESSOPEN"
++msgstr "ä½¿ç¨ LESSOPEN"
++
++#: rc.c:199
++msgid "Perform SSL server verification"
++msgstr "è¿è¡ SSL æå¡å¨æ£æ¥"
++
++#: rc.c:200
++msgid "PEM encoded certificate file of client"
++msgstr "客æ·ç«¯ç PEM ç¼ç è¯ä¹¦æ件"
++
++#: rc.c:201
++msgid "PEM encoded private key file of client"
++msgstr "客æ·ç«¯ç PEM ç¼ç ç§é¥æ件"
++
++#: rc.c:202
++msgid "Path to directory for PEM encoded certificates of CAs"
++msgstr "PEM ç¼ç CA è¯ä¹¦ç®å½çè·¯å¾"
++
++#: rc.c:203
++msgid "File consisting of PEM encoded certificates of CAs"
++msgstr "å
å« PEM ç¼ç CA è¯ä¹¦çæ件"
++
++#: rc.c:205
++msgid "List of forbidden SSL methods (2: SSLv2, 3: SSLv3, t:TLSv1)"
++msgstr "被ç¦æ¢ç SSL æ¹å¼å表 (2: SSLv2, 3: SSLv3, t:TLSv1)"
++
++#: rc.c:208
++msgid "Enable cookie processing"
++msgstr "å¼å¯ Cookie å¤ç"
++
++#: rc.c:209
++msgid "Print a message when receiving a cookie"
++msgstr "å¨æ¥æ¶ä¸ä¸ª Cookie æ¶æ¾ç¤ºä¸ä¸ªæ¶æ¯"
++
++#: rc.c:210
++msgid "Accept cookies"
++msgstr "æ¥å Cookies"
++
++#: rc.c:211
++msgid "Action to be taken on invalid cookie"
++msgstr "对æ æ Cookies è¿è¡çæä½"
++
++#: rc.c:212
++msgid "Domains to reject cookies from"
++msgstr "æç»å¦ä¸åç Cookies"
++
++#: rc.c:213
++msgid "Domains to accept cookies from"
++msgstr "æ¥åå¦ä¸åç Cookies"
++
++#: rc.c:214
++msgid "Domains to avoid [wrong number of dots]"
++msgstr "é¿å
访é®çå [é误çç¹æ°]"
++
++#: rc.c:216
++msgid "Number of redirections to follow"
++msgstr "è·éçéå®åæ°é"
++
++#: rc.c:217
++msgid "Enable processing of meta-refresh tag"
++msgstr "å¼å¯ meta-refresh æ ç¾å¤ç"
++
++#: rc.c:220
++msgid "Enable Migemo (Roma-ji search)"
++msgstr "å¼å¯ Migemo (ç½é©¬åæç´¢)"
++
++#: rc.c:221
++msgid "Migemo command"
++msgstr "Migemo å½ä»¤"
++
++#: rc.c:225
++msgid "Display charset"
++msgstr "æ¾ç¤ºå符é"
++
++#: rc.c:226
++msgid "Default document charset"
++msgstr "é»è®¤ææ¡£å符é"
++
++#: rc.c:227
++msgid "Automatic charset detect when loading"
++msgstr "å¨è½½å
¥æ¶è¿è¡èªå¨å符éæ¢æµ"
++
++#: rc.c:228
++msgid "System charset"
++msgstr "ç³»ç»å符é"
++
++#: rc.c:229
++msgid "System charset follows locale(LC_CTYPE)"
++msgstr "æ ¹æ®ç³»ç»è®¾ç½® (LC_CTYPE) éå®ç³»ç»å符é"
++
++#: rc.c:230
++msgid "Output halfdump with display charset"
++msgstr "使ç¨æ¾ç¤ºå符éè¾åº halfdump"
++
++#: rc.c:231
++msgid "Use multi column characters"
++msgstr "使ç¨å¤åå符"
++
++#: rc.c:232
++msgid "Use combining characters"
++msgstr "使ç¨å并å符"
++
++#: rc.c:233
++msgid "Use double width for some Unicode characters"
++msgstr "使 Unicode å符使ç¨åé宽度"
++
++#: rc.c:234
++msgid "Use Unicode language tags"
++msgstr "ä½¿ç¨ Unicode è¯è¨æ ç¾"
++
++#: rc.c:235
++msgid "Charset conversion using Unicode map"
++msgstr "ä½¿ç¨ Unicode æ å°è¿è¡å符é转æ¢"
++
++#: rc.c:236
++msgid "Charset conversion when loading"
++msgstr "å¨è½½å
¥æ¶è¿è¡å符é转æ¢"
++
++#: rc.c:237
++msgid "Adjust search string for document charset"
++msgstr "è°æ´ææ¡£å符éçæç´¢å串"
++
++#: rc.c:238
++msgid "Fix character width when conversion"
++msgstr "å¨è½¬æ¢æ¶åºå®å符宽度"
++
++#: rc.c:239
++msgid "Use GB 12345 Unicode map instead of GB 2312's"
++msgstr "ä½¿ç¨ GB 12345 Unicode æ å°èé GB 2312"
++
++#: rc.c:240
++msgid "Use JIS X 0201 Roman for ISO-2022-JP"
++msgstr "ä½¿ç¨ JIS X 0201 ç½é©¬åæ¯äº ISO-2022-JP"
++
++#: rc.c:241
++msgid "Use JIS C 6226:1978 for ISO-2022-JP"
++msgstr "ä½¿ç¨ JIS C 6226:1978 äº ISO-2022-JP"
++
++#: rc.c:242
++msgid "Use JIS X 0201 Katakana"
++msgstr "ä½¿ç¨ JIS X 0201 çåå"
++
++#: rc.c:243
++msgid "Use JIS X 0212:1990 (Supplemental Kanji)"
++msgstr "ä½¿ç¨ JIS X 0212:1990 (è¡¥å
æ±å)"
++
++#: rc.c:244
++msgid "Use JIS X 0213:2000 (2000JIS)"
++msgstr "ä½¿ç¨ JIS X 0213:2000 (2000JIS)"
++
++#: rc.c:245
++msgid "Strict ISO-2022-JP/KR/CN"
++msgstr "ä¸¥æ ¼ ISO-2022-JP/KR/CN"
++
++#: rc.c:246
++msgid "Treat 4 bytes char. of GB18030 as Unicode"
++msgstr "è§ GB18030 ç¼ç ç 4 åèå符为 Unicode"
++
++#: rc.c:247
++msgid "Simple Preserve space"
++msgstr "ç®åçä¿ç空é´"
++
++#: rc.c:250
++msgid "keymap file"
++msgstr "é®çæ å°æ件"
++
++#: rc.c:267
++msgid "black"
++msgstr "é»è²"
++
++#: rc.c:268
++msgid "red"
++msgstr "红è²"
++
++#: rc.c:269
++msgid "green"
++msgstr "绿è²"
++
++#: rc.c:270
++msgid "yellow"
++msgstr "é»è²"
++
++#: rc.c:271
++msgid "blue"
++msgstr "èè²"
++
++#: rc.c:272
++msgid "magenta"
++msgstr "å红"
++
++#: rc.c:273
++msgid "cyan"
++msgstr "éè²"
++
++#: rc.c:274
++msgid "white"
++msgstr "ç½è²"
++
++#: rc.c:275
++msgid "terminal"
++msgstr "ç»ç«¯"
++
++#: rc.c:294
++msgid "none"
++msgstr "æ "
++
++#: rc.c:295
++msgid "current URL"
++msgstr "å½å URL"
++
++#: rc.c:296
++msgid "link URL"
++msgstr "é¾æ¥ URL"
++
++#: rc.c:301
++msgid "simple"
++msgstr "ç®å"
++
++#: rc.c:302
++msgid "use tag"
++msgstr "使ç¨æ ç¾"
++
++#: rc.c:303
++msgid "fontify"
++msgstr ""
++
++#: rc.c:309
++msgid "A:relative to screen height"
++msgstr "A:ç¸å¯¹äºå±å¹é«åº¦"
++
++#: rc.c:310
++msgid "B:fixed speed"
++msgstr "B:åºå®é度"
++
++#: rc.c:317
++msgid "unspecified"
++msgstr "æªæå®"
++
++#: rc.c:318
++msgid "inet inet6"
++msgstr ""
++
++#: rc.c:319
++msgid "inet6 inet"
++msgstr ""
++
++#: rc.c:320
++msgid "inet only"
++msgstr "ä»
inet"
++
++#: rc.c:321
++msgid "inet6 only"
++msgstr "ä»
inet6"
++
++#: rc.c:328
++msgid "discard"
++msgstr "丢å¼"
++
++#: rc.c:330
++msgid "accept"
++msgstr "æ¥å"
++
++#: rc.c:332
++msgid "ask"
++msgstr "询é®"
++
++#: rc.c:339
++msgid "use internal mailer instead"
++msgstr "使ç¨å
建é®ä»¶åéå¨"
++
++#: rc.c:341
++msgid "ignore options and use only the address"
++msgstr "忽ç¥é项èåªä½¿ç¨å°å"
++
++#: rc.c:342
++msgid "use full mailto URL"
++msgstr "使ç¨æ´ä¸ª mailto URL"
++
++#: rc.c:351
++msgid "OFF"
++msgstr "å
³"
++
++#: rc.c:352
++msgid "Only ISO 2022"
++msgstr "ä»
ISO 2022"
++
++#: rc.c:353
++msgid "ON"
++msgstr "å¼"
++
++#: rc.c:359
++msgid "ASCII"
++msgstr "ASCII"
++
++#: rc.c:360
++msgid "charset specific"
++msgstr "å符éç¹å®"
++
++#: rc.c:361
++msgid "DEC special graphics"
++msgstr "DEC ç¹æ®å¾å"
++
++#: rc.c:740
++msgid "Display Settings"
++msgstr "æ¾ç¤ºè®¾ç½®"
++
++#: rc.c:742
++msgid "Color Settings"
++msgstr "é¢è²è®¾ç½®"
++
++#: rc.c:744
++msgid "Miscellaneous Settings"
++msgstr "æ项设置"
++
++#: rc.c:745
++msgid "Directory Settings"
++msgstr "ç®å½è®¾ç½®"
++
++#: rc.c:746
++msgid "External Program Settings"
++msgstr "å¤é¨ç¨åºè®¾ç½®"
++
++#: rc.c:747
++msgid "Network Settings"
++msgstr "ç½ç»è®¾ç½®"
++
++#: rc.c:748
++msgid "Proxy Settings"
++msgstr "代ç设置"
++
++#: rc.c:750
++msgid "SSL Settings"
++msgstr "SSL 设置"
++
++#: rc.c:753
++msgid "Cookie Settings"
++msgstr "Cookie 设置"
++
++#: rc.c:756
++msgid "Charset Settings"
++msgstr "å符é设置"
++
++#. TRANSLATORS:
++#. * AcceptLang default: this is used in Accept-Language: HTTP request
++#. * header. For example, ja.po should translate it as
++#. * "ja;q=1.0, en;q=0.5" like that.
++#.
++#: rc.c:1238
++msgid "en;q=1.0"
++msgstr "zh-CN;q=1.0, zh-Hans;q=0.9, zh;q=0.8, en;q=0.6"
+diff --git a/po/zh_TW.po b/po/zh_TW.po
+new file mode 100644
+index 0000000..954a4d2
+--- /dev/null
++++ b/po/zh_TW.po
+@@ -0,0 +1,916 @@
++# zh_TW translation for w3m, machine converted
++# Copyright (C) YEAR THE w3m'S COPYRIGHT HOLDER
++# This file is distributed under the same license as the w3m package.
++# Junde Yi <lmy441900@gmail.com>, 2014.
++# Mingcong Bai <jeffbai@aosc.xyz>, 2014.
++# liushuyu <liushuyu_011@126.com>, 2014.
++# Xingda Zheng <icenowy@outlook.com>, 2014.
++# Mingye Wang (Arthur2e5) <arthur200126@gmail.com>, 2014, 2015.
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: w3m 0.5.3\n"
++"Report-Msgid-Bugs-To: satodai@w3m.jp\n"
++"POT-Creation-Date: 2016-03-14 19:47+0900\n"
++"PO-Revision-Date: 2016-03-14 19:51+0900\n"
++"Last-Translator: Tatsuya Kinoshita <tats@debian.org>\n"
++"Language-Team: AOSC zh_TW fuzzy <aosc@members.fsf.org>\n"
++"Language: zh_TW\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Poedit 1.8.6\n"
++"Plural-Forms: nplurals=1; plural=0;\n"
++
++#: menu.c:269
++msgid " Back (b) "
++msgstr " å¾é (b) "
++
++#: menu.c:270
++msgid " Select Buffer(s) "
++msgstr " é¸æç·©è¡å "
++
++#: menu.c:272
++msgid " Select Tab (t) "
++msgstr " é¸ææ¨ç±¤ (t) "
++
++#: menu.c:274
++msgid " View Source (v) "
++msgstr " 檢è¦æºç¢¼ (v) "
++
++#: menu.c:275
++msgid " Edit Source (e) "
++msgstr " ä¿®æ¹æºç¢¼ (e) "
++
++#: menu.c:276
++msgid " Save Source (S) "
++msgstr " å²åæºç¢¼ (S) "
++
++#: menu.c:277
++msgid " Reload (r) "
++msgstr " éæ°è¼å
¥ (r) "
++
++#: menu.c:278 menu.c:285 menu.c:289
++msgid " ---------------- "
++msgstr " ---------------- "
++
++#: menu.c:279
++msgid " Go Link (a) "
++msgstr " è½å°é£çµ (a) "
++
++#: menu.c:280
++msgid " on New Tab (n) "
++msgstr " å¨æ°æ¨ç±¤ (n) "
++
++#: menu.c:281
++msgid " Save Link (A) "
++msgstr " å²åé£çµ (A) "
++
++#: menu.c:282
++msgid " View Image (i) "
++msgstr " 檢è¦åç (i) "
++
++#: menu.c:283
++msgid " Save Image (I) "
++msgstr " å²ååç (I) "
++
++#: menu.c:284
++msgid " View Frame (f) "
++msgstr " 檢è¦æ¡æ¶ (f) "
++
++#: menu.c:286
++msgid " Bookmark (B) "
++msgstr " æ¸ç±¤ (B) "
++
++#: menu.c:287
++msgid " Help (h) "
++msgstr " å¹«å© (h) "
++
++#: menu.c:288
++msgid " Option (o) "
++msgstr " é¸é
(o) "
++
++#: menu.c:290
++msgid " Quit (q) "
++msgstr " éåº (q) "
++
++#: rc.c:62
++msgid "External Viewer Setup"
++msgstr "å¤é¨æª¢è¦å¨è¨å®"
++
++#: rc.c:63
++msgid "Tab width in characters"
++msgstr "æåä¸ç TAB 寬度"
++
++#: rc.c:64
++msgid "Indent for HTML rendering"
++msgstr "ç¨æ¼ HTML 渲æ"
++
++#: rc.c:65
++msgid "Number of pixels per character (4.0...32.0)"
++msgstr "æ¯åå大å°çç«ç´ å¼ (4.0...32.0)"
++
++#: rc.c:66
++msgid "Number of pixels per line (4.0...64.0)"
++msgstr "æ¯è¡çç«ç´ æ¸ (4.0...64.0)"
++
++#: rc.c:67
++msgid "Number of remembered lines when used as a pager"
++msgstr "ç¶ä½çºåé å¨ä½¿ç¨æè¨æ¶çè¡æ¸"
++
++#: rc.c:68
++msgid "Use URL history"
++msgstr "ä½¿ç¨ URL æ·å²è¨é"
++
++#: rc.c:69
++msgid "Number of remembered URL"
++msgstr "è¨éç URL æ¸é"
++
++#: rc.c:70
++msgid "Save URL history"
++msgstr "å²å URL æ·å²"
++
++#: rc.c:71
++msgid "Render frames automatically"
++msgstr "èªå渲ææ¡æ¶"
++
++#: rc.c:72
++msgid "Treat argument without scheme as URL"
++msgstr "å°ç¡æ ¼å¼çåæ¸çä½ URL"
++
++#: rc.c:73
++msgid "Use _self as default target"
++msgstr "å°èªèº«ä½çºé è¨ç®æ¨ (_S)"
++
++#: rc.c:74
++msgid "Open link on new tab if target is _blank or _new"
++msgstr "å¦æç®æ¨çºç©º (_b) ææ°å»º (_n) å¨æ°æ¨ç±¤éåé é¢"
++
++#: rc.c:75
++msgid "Open download list panel on new tab"
++msgstr "éåä¸è¼å表é¢æ¿æ¼æ°æ¨ç±¤"
++
++#: rc.c:76
++msgid "Display link URL automatically"
++msgstr "èªå顯示é£çµ URL"
++
++#: rc.c:77
++msgid "Display link numbers"
++msgstr "顯示é£çµç·¨è"
++
++#: rc.c:78
++msgid "Display decoded URL"
++msgstr "顯示解碼å¾ç URL"
++
++#: rc.c:79
++msgid "Display current line number"
++msgstr "顯示ç¶åè¡æ¸"
++
++#: rc.c:80
++msgid "Display inline images"
++msgstr "顯示å
§è¯å½±è±¡"
++
++#: rc.c:81
++msgid "Display pseudo-ALTs for inline images with no ALT or TITLE string"
++msgstr "çºä¸å¸¶æ ALT æ TITLE å串çå
§è¯å½±è±¡é¡¯ç¤ºå½ ALT"
++
++#: rc.c:83
++msgid "Load inline images automatically"
++msgstr "èªåè¼å
¥è¡å
§å½±è±¡"
++
++#: rc.c:84
++msgid "Maximum processes for parallel image loading"
++msgstr "å¤å·è¡ç·å½±è±¡è¼å
¥çæ大ç¨åºæ¸"
++
++#: rc.c:85
++msgid "Use external image viewer"
++msgstr "使ç¨å¤é¨åç檢è¦å¨"
++
++#: rc.c:86
++msgid "Scale of image (%)"
++msgstr "影象æ¯ä¾å°º (%)"
++
++#: rc.c:87
++msgid "External command to display image"
++msgstr "ç¨æ¼é¡¯ç¤ºå½±è±¡çå¤é¨å½ä»¤"
++
++#: rc.c:88
++msgid "Use link list of image map"
++msgstr "使ç¨å½±è±¡å°æ çé£çµå表"
++
++#: rc.c:90
++msgid "Display file names in multi-column format"
++msgstr "以å¤åæ ¼å¼é¡¯ç¤ºæªå"
++
++#: rc.c:91
++msgid "Use ASCII equivalents to display entities"
++msgstr "使ç¨å°æç ASCII 編碼ä¾é¡¯ç¤ºå¯¦é« "
++
++#: rc.c:92
++msgid "Character type for border of table and menu"
++msgstr "è¡¨æ ¼åé¸å®éæ¡çåå
é¡å"
++
++#: rc.c:93
++msgid "Display table borders, ignore value of BORDER"
++msgstr "顯示é¶æ ¼éæ¡ï¼å¿½ç¥ BORDER æ¸å¼"
++
++#: rc.c:94
++msgid "Fold lines in TEXTAREA"
++msgstr "å¨æåå (TEXTAREA) ä¸æºçè¡"
++
++#: rc.c:95
++msgid "Display INS, DEL, S and STRIKE element"
++msgstr "顯示 INS, DEL, S å STRIKE å
ç´ "
++
++#: rc.c:96
++msgid "Display with color"
++msgstr "使ç¨å¸¶é¡è²ç顯示"
++
++#: rc.c:97
++msgid "Color of normal character"
++msgstr "ä¸è¬æåé¡è²"
++
++#: rc.c:98
++msgid "Color of anchor"
++msgstr "é£çµæåé¡è²"
++
++#: rc.c:99
++msgid "Color of image link"
++msgstr "åçé£çµé¡è²"
++
++#: rc.c:100
++msgid "Color of form"
++msgstr "è¡¨æ ¼é¡è²"
++
++#: rc.c:101
++msgid "Enable coloring of active link"
++msgstr "çºæ´»åé£çµéåä¸è²"
++
++#: rc.c:102
++msgid "Color of currently active link"
++msgstr "ç¶åæ´»åé£çµçé¡è²"
++
++#: rc.c:103
++msgid "Use visited link color"
++msgstr "çºè¨ªåéçé£çµä¸è²"
++
++#: rc.c:104
++msgid "Color of visited link"
++msgstr "已訪åé£çµé¡è²"
++
++#: rc.c:105
++msgid "Color of background"
++msgstr "èæ¯è²"
++
++#: rc.c:106
++msgid "Color of mark"
++msgstr "æ¨è¨é¡è²"
++
++#: rc.c:107
++msgid "Use proxy"
++msgstr "使ç¨ä»£ç伺æå¨"
++
++#: rc.c:108
++msgid "URL of HTTP proxy host"
++msgstr "HTTP 代ç主æ©å°å"
++
++#: rc.c:110
++msgid "URL of HTTPS proxy host"
++msgstr "HTTPS 代ç主æ©å°å"
++
++#: rc.c:113
++msgid "URL of GOPHER proxy host"
++msgstr "GOPHER 代ç主æ©å°å"
++
++#: rc.c:115
++msgid "URL of FTP proxy host"
++msgstr "FTP 代ç主æ©å°å"
++
++#: rc.c:116
++msgid "Domains to be accessed directly (no proxy)"
++msgstr "ç´æ¥è¨ªåèä¸æ¯ç¨ä»£ç伺æå¨è¨ªåç URL"
++
++#: rc.c:117
++msgid "Check noproxy by network address"
++msgstr "æ ¹æ網路å°åæª¢æ¥ noproxy"
++
++#: rc.c:118
++msgid "Disable cache"
++msgstr "ç¦ç¨å¿«å"
++
++#: rc.c:120
++msgid "News server"
++msgstr "æ°è伺æå¨"
++
++#: rc.c:121
++msgid "Mode of news server"
++msgstr "æ°è伺æå¨æ¨¡å¼"
++
++#: rc.c:122
++msgid "Number of news messages"
++msgstr "æ°èè¨æ¯çæ¸é"
++
++#: rc.c:124
++msgid "Order of name resolution"
++msgstr "å稱解æé åº"
++
++#: rc.c:125
++msgid "Directory corresponding to / (document root)"
++msgstr "å°æ / çç®é (æä»¶æ ¹ç®é)"
++
++#: rc.c:126
++msgid "Directory corresponding to /~user"
++msgstr "å°æ /~user çç®é"
++
++#: rc.c:127
++msgid "Directory corresponding to /cgi-bin"
++msgstr "å°æ /cgi-bin çç®é"
++
++#: rc.c:128
++msgid "Confirm when quitting with q"
++msgstr "ä½¿ç¨ q éµéåºæè«æ±ç¢ºèª"
++
++#: rc.c:129
++msgid "Close tab if buffer is last when back"
++msgstr "å¨è¿åæç·©è¡åéæ¯ä»¥åçæ
å°±ééæ¨ç±¤é "
++
++#: rc.c:131
++msgid "Enable mark operations"
++msgstr "åç¨æ¨è¨æä½"
++
++#: rc.c:133
++msgid "Enable Emacs-style line editing"
++msgstr "åç¨ Emacs é¢¨æ ¼çè¡ç·¨è¼¯"
++
++#: rc.c:134
++msgid "Enable vi-like numeric prefix"
++msgstr "åå vi å¼çæ¸åè·³è½"
++
++#: rc.c:135
++msgid "Move cursor to top line when going to label"
++msgstr "ç¶ç§»åå°æ¨ç±¤æå°æ¸¸æ¨ç§»å°æé è¡"
++
++#: rc.c:136
++msgid "Move cursor to top line when moving to next page"
++msgstr "ç¶è½å°ä¸ä¸é æå°æ¸¸æ¨ç§»å°æé è¡"
++
++#: rc.c:137
++msgid "Fold lines of plain text file"
++msgstr "å°ç´æåæªæ¡å¯¦è¡è¡æºç"
++
++#: rc.c:138
++msgid "Show line numbers"
++msgstr "顯示è¡è"
++
++#: rc.c:139
++msgid "Show search string"
++msgstr "顯示æå°åå
串"
++
++#: rc.c:140
++msgid "List of mime.types files"
++msgstr "mime.type æªæ¡å表"
++
++#: rc.c:141
++msgid "List of mailcap files"
++msgstr "mailcap æªæ¡å表"
++
++#: rc.c:142
++msgid "List of urimethodmap files"
++msgstr "urlmethodmap æªæ¡å表"
++
++#: rc.c:143
++msgid "Editor"
++msgstr "編輯å¨"
++
++#: rc.c:144
++msgid "Mailer"
++msgstr "å³éè
"
++
++#: rc.c:145
++msgid "How to call Mailer for mailto URLs with options"
++msgstr "åå mailto å°åæå¼å«é»åéµä»¶ç¨å¼çæ¹å¼ååæ¸"
++
++#: rc.c:146
++msgid "External browser"
++msgstr "å¤é¨ç覽å¨"
++
++#: rc.c:147
++msgid "2nd external browser"
++msgstr "第äºå¤é¨ç覽å¨"
++
++#: rc.c:148
++msgid "3rd external browser"
++msgstr "第ä¸å¤é¨ç覽å¨"
++
++#: rc.c:149
++msgid "4th external browser"
++msgstr "第åå¤é¨ç覽å¨"
++
++#: rc.c:150
++msgid "5th external browser"
++msgstr "第äºå¤é¨ç覽å¨"
++
++#: rc.c:151
++msgid "6th external browser"
++msgstr "第å
å¤é¨ç覽å¨"
++
++#: rc.c:152
++msgid "7th external browser"
++msgstr "第ä¸å¤é¨ç覽å¨"
++
++#: rc.c:153
++msgid "8th external browser"
++msgstr "第å
«å¤é¨ç覽å¨"
++
++#: rc.c:154
++msgid "9th external browser"
++msgstr "第ä¹å¤é¨ç覽å¨"
++
++#: rc.c:155
++msgid "Disable secret file security check"
++msgstr "ééç¥å¯æªæ¡å®å
¨æª¢æ¥"
++
++#: rc.c:156
++msgid "Password file"
++msgstr "å¯ç¢¼æªæ¡"
++
++#: rc.c:157
++msgid "File for setting form on loading"
++msgstr "è¨å®è¦çªè¼å
¥æçæªæ¡"
++
++#: rc.c:158
++msgid "File for preferences for each site"
++msgstr "ååç«é»çé¦é¸é
æªæ¡"
++
++#: rc.c:159
++msgid "Password for anonymous FTP (your mail address)"
++msgstr "å¿åFTPå¯ç¢¼ï¼æ¨çéµç®±å°åï¼"
++
++#: rc.c:160
++msgid "Generate domain part of password for FTP"
++msgstr "çº FTP çæå¯ç¢¼çåé¨å"
++
++#: rc.c:161
++msgid "User-Agent identification string"
++msgstr "User-Agent 串"
++
++#: rc.c:162
++msgid "Accept-Encoding header"
++msgstr "æ¥åç編碼 (Accept-Encoding) å ±é "
++
++#: rc.c:163
++msgid "Accept header"
++msgstr "æ¥å (Accept) å ±é "
++
++#: rc.c:164
++msgid "Accept-Language header"
++msgstr "æ¥åçèªè¨ (Accept-Language) å ±é "
++
++#: rc.c:165
++msgid "Treat URL-like strings as links in all pages"
++msgstr "å°ææé é¢ä¸é¡ä¼¼æ¼ URL çåå
串ç¶åé£çµ"
++
++#: rc.c:166
++msgid "Wrap search"
++msgstr "å
è£æå°çµæ"
++
++#: rc.c:167
++msgid "Display unseen objects (e.g. bgimage tag)"
++msgstr "顯示çä¸å°çç©ä»¶ ï¼ä¾å¦ï¼bdimageæ¨ç±¤ï¼"
++
++#: rc.c:168
++msgid "Uncompress compressed data automatically when downloading"
++msgstr "å¨ä¸è¼æèªå解å£è¢«å£ç¸®çè³æ"
++
++#: rc.c:170
++msgid "Run external viewer in a separate session"
++msgstr "å¨å¦ä¸åæ話ä¸å·è¡å¤é¨æª¢è¦å¨"
++
++#: rc.c:172
++msgid "Run external viewer in the background"
++msgstr "å¨å¾èºå·è¡å¤é¨æª¢è¦å¨"
++
++#: rc.c:174
++msgid "Use external program for directory listing"
++msgstr "使ç¨å¤é¨ç¨å¼ååºç®é"
++
++#: rc.c:175
++msgid "URL of directory listing command"
++msgstr "ç®éå表å½ä»¤ç網å"
++
++#: rc.c:177
++msgid "Enable dictionary lookup through CGI"
++msgstr "åç¨åºæ¼ CGI çè©å
¸æ¥è©¢"
++
++#: rc.c:178
++msgid "URL of dictionary lookup command"
++msgstr "åå
¸æ¥è©¢å½ä»¤ç網å"
++
++#: rc.c:180
++msgid "Display link name for images lacking ALT"
++msgstr "å°ç¼ºå° ALT çåç顯示é£çµå稱"
++
++#: rc.c:181
++msgid "Index file for directories"
++msgstr "ç®éçç´¢å¼æªæ¡"
++
++#: rc.c:182
++msgid "Prepend http:// to URL automatically"
++msgstr "èªåå¨ URL åå å
¥ http://"
++
++#: rc.c:183
++msgid "Default value for open-URL command"
++msgstr "éå網åå½ä»¤çé è¨å¼"
++
++#: rc.c:184
++msgid "Decode Content-Transfer-Encoding when saving"
++msgstr "å²åæå°å
§å®¹å³è¼¸ç·¨ç¢¼è³è¨ (Content-Transfer-Encoding) é²è¡è§£ç¢¼"
++
++#: rc.c:185
++msgid "Preserve timestamp when saving"
++msgstr "å¨å²åæä¿çæéæ³"
++
++#: rc.c:187
++msgid "Enable mouse"
++msgstr "åç¨æ»é¼ "
++
++#: rc.c:188
++msgid "Scroll in reverse direction of mouse drag"
++msgstr "åæ»é¼ æåçåæ¹å滾å"
++
++#: rc.c:189
++msgid "Behavior of wheel scroll speed"
++msgstr "滾輪滾åé度è¡çº"
++
++#: rc.c:190
++msgid "(A only)Scroll by # (%) of screen"
++msgstr "(å
A) æ¯æ¬¡æ»¾å # (%) çè¢å¹é«åº¦"
++
++#: rc.c:191
++msgid "(B only)Scroll by # lines"
++msgstr "(å
B) æ¯æ¬¡æ»¾å # è¡"
++
++#: rc.c:193
++msgid "Free memory of undisplayed buffers"
++msgstr "éæ¾æªé¡¯ç¤ºå¿«åçå²å"
++
++#: rc.c:194
++msgid "Suppress `Referer:' header"
++msgstr "ç¦æ¢ 'Referer:' æªæ¡é "
++
++#: rc.c:195
++msgid "Search case-insensitively"
++msgstr "æå°ä¸åå大å°å¯«"
++
++#: rc.c:196
++msgid "Use LESSOPEN"
++msgstr "ä½¿ç¨ LESSOPEN"
++
++#: rc.c:199
++msgid "Perform SSL server verification"
++msgstr "é²è¡ SSL 伺æå¨æª¢æ¥"
++
++#: rc.c:200
++msgid "PEM encoded certificate file of client"
++msgstr "客æ¶ç«¯ç PEM 編碼èæ¸æªæ¡"
++
++#: rc.c:201
++msgid "PEM encoded private key file of client"
++msgstr "客æ¶ç«¯ç PEM 編碼ç§é°æªæ¡"
++
++#: rc.c:202
++msgid "Path to directory for PEM encoded certificates of CAs"
++msgstr "PEM 編碼 CA èæ¸ç®éçè·¯å¾"
++
++#: rc.c:203
++msgid "File consisting of PEM encoded certificates of CAs"
++msgstr "å
å« PEM 編碼 CA èæ¸çæªæ¡"
++
++#: rc.c:205
++msgid "List of forbidden SSL methods (2: SSLv2, 3: SSLv3, t:TLSv1)"
++msgstr "被ç¦æ¢ç SSL æ¹å¼å表 (2: SSLv2, 3: SSLv3, t:TLSv1)"
++
++#: rc.c:208
++msgid "Enable cookie processing"
++msgstr "éå Cookie èç"
++
++#: rc.c:209
++msgid "Print a message when receiving a cookie"
++msgstr "å¨æ¥æ¶ä¸å Cookie æ顯示ä¸åè¨æ¯"
++
++#: rc.c:210
++msgid "Accept cookies"
++msgstr "æ¥å Cookies"
++
++#: rc.c:211
++msgid "Action to be taken on invalid cookie"
++msgstr "å°ç¡æ Cookies é²è¡çæä½"
++
++#: rc.c:212
++msgid "Domains to reject cookies from"
++msgstr "æçµå¦ä¸åç Cookies"
++
++#: rc.c:213
++msgid "Domains to accept cookies from"
++msgstr "æ¥åå¦ä¸åç Cookies"
++
++#: rc.c:214
++msgid "Domains to avoid [wrong number of dots]"
++msgstr "é¿å
訪åçå [é¯èª¤çé»æ¸]"
++
++#: rc.c:216
++msgid "Number of redirections to follow"
++msgstr "è·é¨çéå®åæ¸é"
++
++#: rc.c:217
++msgid "Enable processing of meta-refresh tag"
++msgstr "éå meta-refresh æ¨ç±¤èç"
++
++#: rc.c:220
++msgid "Enable Migemo (Roma-ji search)"
++msgstr "éå Migemo (ç¾
馬åæå°)"
++
++#: rc.c:221
++msgid "Migemo command"
++msgstr "Migemo å½ä»¤"
++
++#: rc.c:225
++msgid "Display charset"
++msgstr "顯示å符é"
++
++#: rc.c:226
++msgid "Default document charset"
++msgstr "é è¨æ件å符é"
++
++#: rc.c:227
++msgid "Automatic charset detect when loading"
++msgstr "å¨è¼å
¥æé²è¡èªåå符éæ¢æ¸¬"
++
++#: rc.c:228
++msgid "System charset"
++msgstr "系統å符é"
++
++#: rc.c:229
++msgid "System charset follows locale(LC_CTYPE)"
++msgstr "æ ¹æ系統è¨å® (LC_CTYPE) é¸å®ç³»çµ±å符é"
++
++#: rc.c:230
++msgid "Output halfdump with display charset"
++msgstr "使ç¨é¡¯ç¤ºå符éè¼¸åº halfdump"
++
++#: rc.c:231
++msgid "Use multi column characters"
++msgstr "使ç¨å¤ååå
"
++
++#: rc.c:232
++msgid "Use combining characters"
++msgstr "使ç¨åä½µåå
"
++
++#: rc.c:233
++msgid "Use double width for some Unicode characters"
++msgstr "使 Unicode åå
使ç¨éé寬度"
++
++#: rc.c:234
++msgid "Use Unicode language tags"
++msgstr "ä½¿ç¨ Unicode èªè¨æ¨ç±¤"
++
++#: rc.c:235
++msgid "Charset conversion using Unicode map"
++msgstr "ä½¿ç¨ Unicode å°æ é²è¡å符éè½æ"
++
++#: rc.c:236
++msgid "Charset conversion when loading"
++msgstr "å¨è¼å
¥æé²è¡å符éè½æ"
++
++#: rc.c:237
++msgid "Adjust search string for document charset"
++msgstr "調æ´æ件å符éçæå°å串"
++
++#: rc.c:238
++msgid "Fix character width when conversion"
++msgstr "å¨è½ææåºå®åå
寬度"
++
++#: rc.c:239
++msgid "Use GB 12345 Unicode map instead of GB 2312's"
++msgstr "ä½¿ç¨ GB 12345 Unicode å°æ èé GB 2312"
++
++#: rc.c:240
++msgid "Use JIS X 0201 Roman for ISO-2022-JP"
++msgstr "ä½¿ç¨ JIS X 0201 ç¾
馬åæ¯æ¼ ISO-2022-JP"
++
++#: rc.c:241
++msgid "Use JIS C 6226:1978 for ISO-2022-JP"
++msgstr "ä½¿ç¨ JIS C 6226:1978 æ¼ ISO-2022-JP"
++
++#: rc.c:242
++msgid "Use JIS X 0201 Katakana"
++msgstr "ä½¿ç¨ JIS X 0201 çåå"
++
++#: rc.c:243
++msgid "Use JIS X 0212:1990 (Supplemental Kanji)"
++msgstr "ä½¿ç¨ JIS X 0212:1990 (è£å
æ¼¢å)"
++
++#: rc.c:244
++msgid "Use JIS X 0213:2000 (2000JIS)"
++msgstr "ä½¿ç¨ JIS X 0213:2000 (2000JIS)"
++
++#: rc.c:245
++msgid "Strict ISO-2022-JP/KR/CN"
++msgstr "å´æ ¼ ISO-2022-JP/KR/CN"
++
++#: rc.c:246
++msgid "Treat 4 bytes char. of GB18030 as Unicode"
++msgstr "è¦ GB18030 編碼ç 4 ä½å
çµåå
çº Unicode"
++
++#: rc.c:247
++msgid "Simple Preserve space"
++msgstr "ç°¡å®çä¿ç空é"
++
++#: rc.c:250
++msgid "keymap file"
++msgstr "éµç¤å°æ æªæ¡"
++
++#: rc.c:267
++msgid "black"
++msgstr "é»è²"
++
++#: rc.c:268
++msgid "red"
++msgstr "ç´
è²"
++
++#: rc.c:269
++msgid "green"
++msgstr "ç¶ è²"
++
++#: rc.c:270
++msgid "yellow"
++msgstr "é»è²"
++
++#: rc.c:271
++msgid "blue"
++msgstr "èè²"
++
++#: rc.c:272
++msgid "magenta"
++msgstr "åç´
"
++
++#: rc.c:273
++msgid "cyan"
++msgstr "éè²"
++
++#: rc.c:274
++msgid "white"
++msgstr "ç½è²"
++
++#: rc.c:275
++msgid "terminal"
++msgstr "çµç«¯"
++
++#: rc.c:294
++msgid "none"
++msgstr "ç¡"
++
++#: rc.c:295
++msgid "current URL"
++msgstr "ç¶å URL"
++
++#: rc.c:296
++msgid "link URL"
++msgstr "é£çµ URL"
++
++#: rc.c:301
++msgid "simple"
++msgstr "ç°¡å®"
++
++#: rc.c:302
++msgid "use tag"
++msgstr "使ç¨æ¨ç±¤"
++
++#: rc.c:303
++msgid "fontify"
++msgstr ""
++
++#: rc.c:309
++msgid "A:relative to screen height"
++msgstr "A:ç¸å°æ¼è¢å¹é«åº¦"
++
++#: rc.c:310
++msgid "B:fixed speed"
++msgstr "B:åºå®é度"
++
++#: rc.c:317
++msgid "unspecified"
++msgstr "æªæå®"
++
++#: rc.c:318
++msgid "inet inet6"
++msgstr ""
++
++#: rc.c:319
++msgid "inet6 inet"
++msgstr ""
++
++#: rc.c:320
++msgid "inet only"
++msgstr "å
inet"
++
++#: rc.c:321
++msgid "inet6 only"
++msgstr "å
inet6"
++
++#: rc.c:328
++msgid "discard"
++msgstr "ä¸æ£"
++
++#: rc.c:330
++msgid "accept"
++msgstr "æ¥å"
++
++#: rc.c:332
++msgid "ask"
++msgstr "è©¢å"
++
++#: rc.c:339
++msgid "use internal mailer instead"
++msgstr "使ç¨å
§å»ºéµä»¶å³éå¨"
++
++#: rc.c:341
++msgid "ignore options and use only the address"
++msgstr "忽ç¥é¸é
èåªä½¿ç¨å°å"
++
++#: rc.c:342
++msgid "use full mailto URL"
++msgstr "使ç¨æ´å mailto URL"
++
++#: rc.c:351
++msgid "OFF"
++msgstr "é"
++
++#: rc.c:352
++msgid "Only ISO 2022"
++msgstr "å
ISO 2022"
++
++#: rc.c:353
++msgid "ON"
++msgstr "é"
++
++#: rc.c:359
++msgid "ASCII"
++msgstr "ASCII"
++
++#: rc.c:360
++msgid "charset specific"
++msgstr "å符éç¹å®"
++
++#: rc.c:361
++msgid "DEC special graphics"
++msgstr "DEC ç¹æ®å½±è±¡"
++
++#: rc.c:740
++msgid "Display Settings"
++msgstr "顯示è¨å®"
++
++#: rc.c:742
++msgid "Color Settings"
++msgstr "é¡è²è¨å®"
++
++#: rc.c:744
++msgid "Miscellaneous Settings"
++msgstr "éé
è¨å®"
++
++#: rc.c:745
++msgid "Directory Settings"
++msgstr "ç®éè¨å®"
++
++#: rc.c:746
++msgid "External Program Settings"
++msgstr "å¤é¨ç¨å¼è¨å®"
++
++#: rc.c:747
++msgid "Network Settings"
++msgstr "網路è¨å®"
++
++#: rc.c:748
++msgid "Proxy Settings"
++msgstr "代çè¨å®"
++
++#: rc.c:750
++msgid "SSL Settings"
++msgstr "SSL è¨å®"
++
++#: rc.c:753
++msgid "Cookie Settings"
++msgstr "Cookie è¨å®"
++
++#: rc.c:756
++msgid "Charset Settings"
++msgstr "å符éè¨å®"
++
++#. TRANSLATORS:
++#. * AcceptLang default: this is used in Accept-Language: HTTP request
++#. * header. For example, ja.po should translate it as
++#. * "ja;q=1.0, en;q=0.5" like that.
++#.
++#: rc.c:1238
++msgid "en;q=1.0"
++msgstr "zh-TW;q=1.0, zh-Hants;q=0.9, zh;q=0.8, en;q=0.6"
+diff --git a/proto.h b/proto.h
+index f8a7345..d744e14 100644
+--- a/proto.h
++++ b/proto.h
+@@ -11,6 +11,8 @@ extern void pushEvent(int cmd, void *data);
+ extern MySignalHandler intTrap(SIGNAL_ARG);
+ extern void pgFore(void);
+ extern void pgBack(void);
++extern void hpgFore(void);
++extern void hpgBack(void);
+ extern void lup1(void);
+ extern void ldown1(void);
+ extern void ctrCsrV(void);
+@@ -61,6 +63,7 @@ extern void submitForm(void);
+ extern void followForm(void);
+ extern void topA(void);
+ extern void lastA(void);
++extern void nthA(void);
+ extern void onA(void);
+
+ extern void nextA(void);
+@@ -162,6 +165,24 @@ extern Str searchURIMethods(ParsedURL *pu);
+ extern void chkExternalURIBuffer(Buffer *buf);
+ #endif
+ extern ParsedURL *schemeToProxy(int scheme);
++#ifdef USE_M17N
++extern wc_ces url_to_charset(const char *url, const ParsedURL *base,
++ wc_ces doc_charset);
++extern char *url_encode(const char *url, const ParsedURL *base,
++ wc_ces doc_charset);
++#if 0
++extern char *url_decode(const char *url, const ParsedURL *base,
++ wc_ces doc_charset);
++#endif
++extern char *url_decode2(const char *url, const Buffer *buf);
++#else /* !defined(USE_M17N) */
++#define url_encode(url, base, cs) url_quote(url)
++extern char *url_decode0(const char *url);
++#if 0
++#define url_decode(url, base, cs) url_decode0(url)
++#endif
++#define url_decode2(url, buf) url_decode0(url)
++#endif /* !defined(USE_M17N) */
+ extern void examineFile(char *path, URLFile *uf);
+ extern char *acceptableEncoding();
+ extern int dir_exist(char *path);
+@@ -180,7 +201,6 @@ extern void push_symbol(Str str, char symbol, int width, int n);
+ #ifdef USE_UNICODE
+ extern void update_utf8_symbol(void);
+ #endif
+-extern Buffer *loadFile(char *path);
+ extern Buffer *loadGeneralFile(char *path, ParsedURL *current, char *referer,
+ int flag, FormList *request);
+ extern int is_boundary(unsigned char *, unsigned char *);
+@@ -207,6 +227,8 @@ extern int getImageSize(ImageCache * cache);
+ extern Str process_img(struct parsed_tag *tag, int width);
+ extern Str process_anchor(struct parsed_tag *tag, char *tagbuf);
+ extern Str process_input(struct parsed_tag *tag);
++extern Str process_button(struct parsed_tag *tag);
++extern Str process_n_button(void);
+ extern Str process_select(struct parsed_tag *tag);
+ extern Str process_n_select(void);
+ extern void feed_select(char *str);
+@@ -249,8 +271,7 @@ extern Buffer *openPagerBuffer(InputStream stream, Buffer *buf);
+ extern Buffer *openGeneralPagerBuffer(InputStream stream);
+ extern Line *getNextPage(Buffer *buf, int plen);
+ extern int save2tmp(URLFile uf, char *tmpf);
+-extern int doExternal(URLFile uf, char *path, char *type, Buffer **bufp,
+- Buffer *defaultbuf);
++extern Buffer *doExternal(URLFile uf, char *type, Buffer *defaultbuf);
+ extern int _doFileCopy(char *tmpf, char *defstr, int download);
+ #define doFileCopy(tmpf, defstr) _doFileCopy(tmpf, defstr, FALSE);
+ extern int doFileMove(char *tmpf, char *defstr);
+@@ -507,7 +528,7 @@ extern ParsedURL *baseURL(Buffer *buf);
+ extern int openSocket(char *hostname, char *remoteport_name,
+ unsigned short remoteport_num);
+ extern void parseURL(char *url, ParsedURL *p_url, ParsedURL *current);
+-extern void copyParsedURL(ParsedURL *p, ParsedURL *q);
++extern void copyParsedURL(ParsedURL *p, const ParsedURL *q);
+ extern void parseURL2(char *url, ParsedURL *pu, ParsedURL *current);
+ extern Str parsedURL2Str(ParsedURL *pu);
+ extern int getURLScheme(char **url);
+@@ -586,9 +607,12 @@ extern char *getAnchorText(Buffer *buf, AnchorList *al, Anchor *a);
+ extern Buffer *link_list_panel(Buffer *buf);
+
+ extern Str decodeB(char **ww);
++extern void decodeB_to_growbuf(struct growbuf *gb, char **ww);
+ extern Str decodeQ(char **ww);
+ extern Str decodeQP(char **ww);
++extern void decodeQP_to_growbuf(struct growbuf *gb, char **ww);
+ extern Str decodeU(char **ww);
++extern void decodeU_to_growbuf(struct growbuf *gb, char **ww);
+ #ifdef USE_M17N
+ extern Str decodeWord(char **ow, wc_ces * charset);
+ extern Str decodeMIME(Str orgstr, wc_ces * charset);
+@@ -611,6 +635,7 @@ extern char *confFile(char *base);
+ extern char *auxbinFile(char *base);
+ extern char *libFile(char *base);
+ extern char *helpFile(char *base);
++extern const void *querySiteconf(const ParsedURL *query_pu, int field);
+ extern Str localCookie(void);
+ extern Str loadLocalDir(char *dirname);
+ extern void set_environ(char *var, char *value);
+@@ -683,6 +708,7 @@ extern void reMark(void);
+
+ #ifdef USE_MOUSE
+ extern void mouse(void);
++extern void sgrmouse(void);
+ extern void mouse_init(void);
+ extern void mouse_end(void);
+ extern void mouse_active(void);
+@@ -698,6 +724,7 @@ extern void tabMs(void);
+ extern void closeTMs(void);
+ #else /* not USE_MOUSE */
+ #define mouse nulcmd
++#define sgrmouse nulcmd
+ #define msToggle nulcmd
+ #define movMs nulcmd
+ #define menuMs nulcmd
+@@ -723,6 +750,8 @@ extern int getKey(char *s);
+ extern char *getKeyData(int key);
+ extern char *getWord(char **str);
+ extern char *getQWord(char **str);
++struct regex;
++extern char *getRegexWord(const char **str, struct regex **regex_ret);
+ #ifdef USE_MOUSE
+ extern void initMouseAction(void);
+ #endif
+@@ -786,5 +815,3 @@ extern void dispVer(void);
+ void srand48(long);
+ long lrand48(void);
+ #endif
+-
+-#include "indep.h"
+diff --git a/rc.c b/rc.c
+index 8441a39..7de87b8 100644
+--- a/rc.c
++++ b/rc.c
+@@ -9,7 +9,9 @@
+ #include <errno.h>
+ #include "parsetag.h"
+ #include "local.h"
++#include "regex.h"
+ #include <stdlib.h>
++#include <stddef.h>
+
+ struct param_ptr {
+ char *name;
+@@ -88,6 +90,7 @@ static int OptionEncode = FALSE;
+ #define CMT_MULTICOL N_("Display file names in multi-column format")
+ #define CMT_ALT_ENTITY N_("Use ASCII equivalents to display entities")
+ #define CMT_GRAPHIC_CHAR N_("Character type for border of table and menu")
++#define CMT_DISP_BORDERS N_("Display table borders, ignore value of BORDER")
+ #define CMT_FOLD_TEXTAREA N_("Fold lines in TEXTAREA")
+ #define CMT_DISP_INS_DEL N_("Display INS, DEL, S and STRIKE element")
+ #define CMT_COLOR N_("Display with color")
+@@ -140,12 +143,19 @@ static int OptionEncode = FALSE;
+ #define CMT_EDITOR N_("Editor")
+ #define CMT_MAILER N_("Mailer")
+ #define CMT_MAILTO_OPTIONS N_("How to call Mailer for mailto URLs with options")
+-#define CMT_EXTBRZ N_("External Browser")
+-#define CMT_EXTBRZ2 N_("Second External Browser")
+-#define CMT_EXTBRZ3 N_("Third External Browser")
++#define CMT_EXTBRZ N_("External browser")
++#define CMT_EXTBRZ2 N_("2nd external browser")
++#define CMT_EXTBRZ3 N_("3rd external browser")
++#define CMT_EXTBRZ4 N_("4th external browser")
++#define CMT_EXTBRZ5 N_("5th external browser")
++#define CMT_EXTBRZ6 N_("6th external browser")
++#define CMT_EXTBRZ7 N_("7th external browser")
++#define CMT_EXTBRZ8 N_("8th external browser")
++#define CMT_EXTBRZ9 N_("9th external browser")
+ #define CMT_DISABLE_SECRET_SECURITY_CHECK N_("Disable secret file security check")
+ #define CMT_PASSWDFILE N_("Password file")
+ #define CMT_PRE_FORM_FILE N_("File for setting form on loading")
++#define CMT_SITECONF_FILE N_("File for preferences for each site")
+ #define CMT_FTPPASS N_("Password for anonymous FTP (your mail address)")
+ #define CMT_FTPPASS_HOSTNAMEGEN N_("Generate domain part of password for FTP")
+ #define CMT_USERAGENT N_("User-Agent identification string")
+@@ -390,6 +400,8 @@ struct param_ptr params1[] = {
+ NULL},
+ {"graphic_char", P_CHARINT, PI_SEL_C, (void *)&UseGraphicChar,
+ CMT_GRAPHIC_CHAR, (void *)graphic_char_str},
++ {"display_borders", P_CHARINT, PI_ONOFF, (void *)&DisplayBorders,
++ CMT_DISP_BORDERS, NULL},
+ {"fold_textarea", P_CHARINT, PI_ONOFF, (void *)&FoldTextarea,
+ CMT_FOLD_TEXTAREA, NULL},
+ {"display_ins_del", P_INT, PI_SEL_C, (void *)&displayInsDel,
+@@ -561,6 +573,18 @@ struct param_ptr params6[] = {
+ NULL},
+ {"extbrowser3", P_STRING, PI_TEXT, (void *)&ExtBrowser3, CMT_EXTBRZ3,
+ NULL},
++ {"extbrowser4", P_STRING, PI_TEXT, (void *)&ExtBrowser4, CMT_EXTBRZ4,
++ NULL},
++ {"extbrowser5", P_STRING, PI_TEXT, (void *)&ExtBrowser5, CMT_EXTBRZ5,
++ NULL},
++ {"extbrowser6", P_STRING, PI_TEXT, (void *)&ExtBrowser6, CMT_EXTBRZ6,
++ NULL},
++ {"extbrowser7", P_STRING, PI_TEXT, (void *)&ExtBrowser7, CMT_EXTBRZ7,
++ NULL},
++ {"extbrowser8", P_STRING, PI_TEXT, (void *)&ExtBrowser8, CMT_EXTBRZ8,
++ NULL},
++ {"extbrowser9", P_STRING, PI_TEXT, (void *)&ExtBrowser9, CMT_EXTBRZ9,
++ NULL},
+ {"bgextviewer", P_INT, PI_ONOFF, (void *)&BackgroundExtViewer,
+ CMT_BGEXTVIEW, NULL},
+ {"use_lessopen", P_INT, PI_ONOFF, (void *)&use_lessopen, CMT_USE_LESSOPEN,
+@@ -619,6 +643,8 @@ struct param_ptr params9[] = {
+ CMT_FTPPASS_HOSTNAMEGEN, NULL},
+ {"pre_form_file", P_STRING, PI_TEXT, (void *)&pre_form_file,
+ CMT_PRE_FORM_FILE, NULL},
++ {"siteconf_file", P_STRING, PI_TEXT, (void *)&siteconf_file,
++ CMT_SITECONF_FILE, NULL},
+ {"user_agent", P_STRING, PI_TEXT, (void *)&UserAgent, CMT_USERAGENT, NULL},
+ {"no_referer", P_INT, PI_ONOFF, (void *)&NoSendReferer, CMT_NOSENDREFERER,
+ NULL},
+@@ -771,7 +797,7 @@ create_option_search_table()
+ qsort(RC_search_table, RC_table_size, sizeof(struct rc_search_table),
+ (int (*)(const void *, const void *))compare_table);
+
+- diff1 = diff2 = 0;
++ diff2 = 0;
+ for (i = 0; i < RC_table_size - 1; i++) {
+ p = RC_search_table[i].param->name;
+ q = RC_search_table[i + 1].param->name;
+@@ -829,7 +855,7 @@ void
+ show_params(FILE * fp)
+ {
+ int i, j, l;
+- char *t = NULL;
++ const char *t = "";
+ char *cmt;
+
+ #ifdef USE_M17N
+@@ -1173,6 +1199,8 @@ do_mkdir(const char *dir, long mode)
+ #endif /* not __MINW32_VERSION */
+ #endif /* not __EMX__ */
+
++static void loadSiteconf(void);
++
+ void
+ sync_with_option(void)
+ {
+@@ -1199,6 +1227,7 @@ sync_with_option(void)
+ #endif
+ loadPasswd();
+ loadPreForm();
++ loadSiteconf();
+
+ if (AcceptLang == NULL || *AcceptLang == '\0') {
+ /* TRANSLATORS:
+@@ -1483,6 +1512,7 @@ panel_set_option(struct parsed_tagarg *arg)
+ {
+ FILE *f = NULL;
+ char *p;
++ Str s = Strnew(), tmp;
+
+ if (config_file == NULL) {
+ disp_message("There's no config file... config not saved", FALSE);
+@@ -1498,14 +1528,17 @@ panel_set_option(struct parsed_tagarg *arg)
+ if (arg->value) {
+ p = conv_to_system(arg->value);
+ if (set_param(arg->arg, p)) {
+- if (f)
+- fprintf(f, "%s %s\n", arg->arg, p);
++ tmp = Sprintf("%s %s\n", arg->arg, p);
++ Strcat(tmp, s);
++ s = tmp;
+ }
+ }
+ arg = arg->next;
+ }
+- if (f)
++ if (f) {
++ fputs(s->ptr, f);
+ fclose(f);
++ }
+ sync_with_option();
+ backBf();
+ }
+@@ -1556,3 +1589,217 @@ helpFile(char *base)
+ return expandPath(Strnew_m_charp(w3m_help_dir(), "/", base, NULL)->ptr);
+ }
+ #endif
++
++/* siteconf */
++/*
++ * url "<url>"|/<re-url>/|m@<re-url>@i [exact]
++ * substitute_url "<destination-url>"
++ * url_charset <charset>
++ * no_referer_from on|off
++ * no_referer_to on|off
++ *
++ * The last match wins.
++ */
++
++struct siteconf_rec {
++ struct siteconf_rec *next;
++ char *url;
++ Regex *re_url;
++ int url_exact;
++ unsigned char mask[(SCONF_N_FIELD + 7) >> 3];
++
++ char *substitute_url;
++#ifdef USE_M17N
++ wc_ces url_charset;
++#endif
++ int no_referer_from;
++ int no_referer_to;
++};
++#define SCONF_TEST(ent, f) ((ent)->mask[(f)>>3] & (1U<<((f)&7)))
++#define SCONF_SET(ent, f) ((ent)->mask[(f)>>3] |= (1U<<((f)&7)))
++#define SCONF_CLEAR(ent, f) ((ent)->mask[(f)>>3] &= ~(1U<<((f)&7)))
++
++static struct siteconf_rec *siteconf_head = NULL;
++static struct siteconf_rec *newSiteconfRec(void);
++
++static struct siteconf_rec *
++newSiteconfRec(void)
++{
++ struct siteconf_rec *ent;
++
++ ent = New(struct siteconf_rec);
++ ent->next = NULL;
++ ent->url = NULL;
++ ent->re_url = NULL;
++ ent->url_exact = FALSE;
++ memset(ent->mask, 0, sizeof(ent->mask));
++
++ ent->substitute_url = NULL;
++#ifdef USE_M17N
++ ent->url_charset = 0;
++#endif
++ return ent;
++}
++
++static void
++loadSiteconf(void)
++{
++ char *efname;
++ FILE *fp;
++ Str line;
++ struct siteconf_rec *ent = NULL;
++
++ siteconf_head = NULL;
++ if (!siteconf_file)
++ return;
++ if ((efname = expandPath(siteconf_file)) == NULL)
++ return;
++ fp = fopen(efname, "r");
++ if (fp == NULL)
++ return;
++ while (line = Strfgets(fp), line->length > 0) {
++ char *p, *s;
++
++ Strchop(line);
++ p = line->ptr;
++ SKIP_BLANKS(p);
++ if (*p == '#' || *p == '\0')
++ continue;
++ s = getWord(&p);
++
++ /* The "url" begins a new record. */
++ if (strcmp(s, "url") == 0) {
++ char *url, *opt;
++ struct siteconf_rec *newent;
++
++ /* First, register the current record. */
++ if (ent) {
++ ent->next = siteconf_head;
++ siteconf_head = ent;
++ ent = NULL;
++ }
++
++ /* Second, create a new record. */
++ newent = newSiteconfRec();
++ url = getRegexWord((const char **)&p, &newent->re_url);
++ opt = getWord(&p);
++ SKIP_BLANKS(p);
++ if (!newent->re_url) {
++ ParsedURL pu;
++ if (!url || !*url)
++ continue;
++ parseURL2(url, &pu, NULL);
++ newent->url = parsedURL2Str(&pu)->ptr;
++ }
++ /* If we have an extra or unknown option, ignore this record
++ * for future extensions. */
++ if (strcmp(opt, "exact") == 0) {
++ newent->url_exact = TRUE;
++ }
++ else if (*opt != 0)
++ continue;
++ if (*p)
++ continue;
++ ent = newent;
++ continue;
++ }
++
++ /* If the current record is broken, skip to the next "url". */
++ if (!ent)
++ continue;
++
++ /* Fill the new record. */
++ if (strcmp(s, "substitute_url") == 0) {
++ ent->substitute_url = getQWord(&p);
++ SCONF_SET(ent, SCONF_SUBSTITUTE_URL);
++ }
++#ifdef USE_M17N
++ else if (strcmp(s, "url_charset") == 0) {
++ char *charset = getWord(&p);
++ ent->url_charset = (charset && *charset) ?
++ wc_charset_to_ces(charset) : 0;
++ SCONF_SET(ent, SCONF_URL_CHARSET);
++ }
++#endif /* USE_M17N */
++ else if (strcmp(s, "no_referer_from") == 0) {
++ ent->no_referer_from = str_to_bool(getWord(&p), 0);
++ SCONF_SET(ent, SCONF_NO_REFERER_FROM);
++ }
++ else if (strcmp(s, "no_referer_to") == 0) {
++ ent->no_referer_to = str_to_bool(getWord(&p), 0);
++ SCONF_SET(ent, SCONF_NO_REFERER_TO);
++ }
++ }
++ if (ent) {
++ ent->next = siteconf_head;
++ siteconf_head = ent;
++ ent = NULL;
++ }
++ fclose(fp);
++}
++
++const void *
++querySiteconf(const ParsedURL *query_pu, int field)
++{
++ const struct siteconf_rec *ent;
++ Str u;
++ char *firstp, *lastp;
++
++ if (field < 0 || field >= SCONF_N_FIELD)
++ return NULL;
++ if (!query_pu || IS_EMPTY_PARSED_URL(query_pu))
++ return NULL;
++ u = parsedURL2Str((ParsedURL *)query_pu);
++ if (u->length == 0)
++ return NULL;
++
++ for (ent = siteconf_head; ent; ent = ent->next) {
++ if (!SCONF_TEST(ent, field))
++ continue;
++ if (ent->re_url) {
++ if (RegexMatch(ent->re_url, u->ptr, u->length, 1)) {
++ MatchedPosition(ent->re_url, &firstp, &lastp);
++ if (!ent->url_exact)
++ goto url_found;
++ if (firstp != u->ptr || lastp == firstp)
++ continue;
++ if (*lastp == 0 || *lastp == '?' || *(lastp - 1) == '?' ||
++ *lastp == '#' || *(lastp - 1) == '#')
++ goto url_found;
++ }
++ } else {
++ int matchlen = strmatchlen(ent->url, u->ptr, u->length);
++ if (matchlen == 0 || ent->url[matchlen] != 0)
++ continue;
++ firstp = u->ptr;
++ lastp = u->ptr + matchlen;
++ if (*lastp == 0 || *lastp == '?' || *(lastp - 1) == '?' ||
++ *lastp == '#' || *(lastp - 1) == '#')
++ goto url_found;
++ if (!ent->url_exact && (*lastp == '/' || *(lastp - 1) == '/'))
++ goto url_found;
++ }
++ }
++ return NULL;
++
++url_found:
++ switch (field) {
++ case SCONF_SUBSTITUTE_URL:
++ if (ent->substitute_url && *ent->substitute_url) {
++ Str tmp = Strnew_charp_n(u->ptr, firstp - u->ptr);
++ Strcat_charp(tmp, ent->substitute_url);
++ Strcat_charp(tmp, lastp);
++ return tmp->ptr;
++ }
++ return NULL;
++#ifdef USE_M17N
++ case SCONF_URL_CHARSET:
++ return &ent->url_charset;
++#endif
++ case SCONF_NO_REFERER_FROM:
++ return &ent->no_referer_from;
++ case SCONF_NO_REFERER_TO:
++ return &ent->no_referer_to;
++ }
++ return NULL;
++}
+diff --git a/regex.c b/regex.c
+index 5bee4b2..93406e8 100644
+--- a/regex.c
++++ b/regex.c
+@@ -77,7 +77,7 @@ static longchar
+ set_longchar(char *str)
+ {
+ unsigned char *p = (unsigned char *)str;
+- longchar r;
++ longchar r = { };
+
+ #ifdef USE_M17N
+ if (*p & 0x80) {
+@@ -580,7 +580,7 @@ regmatch_iter(struct MatchingContext1 *c,
+ c->lastpos = c->str;
+ #ifdef REGEX_DEBUG
+ if (verbose)
+- printf("Succeed: %s %d\n", c->str, c->lastpos - c->str);
++ printf("Succeed: %s %ld\n", c->str, (long)(c->lastpos - c->str));
+ #endif
+ YIELD(1, c, 7);
+ return 0;
+diff --git a/scripts/Makefile.in b/scripts/Makefile.in
+index 4da9ce5..3384813 100644
+--- a/scripts/Makefile.in
++++ b/scripts/Makefile.in
+@@ -34,7 +34,7 @@ CONF_DIR = $(sysconfdir)/$(PACKAGE)
+ DOCDIRS = @DOCDIRS@
+
+ AUXBIN_TARGETS = xface2xpm
+-LIB_TARGETS = dirlist.cgi w3mhelp.cgi w3mmail.cgi
++LIB_TARGETS = dirlist.cgi w3mdict.cgi w3mhelp.cgi w3mmail.cgi
+ HELP_TARGETS = w3mhelp-funcname.pl w3mhelp-funcdesc-stamp
+ SUBDIRS = multipart w3mman
+ .PHONY: $(SUBDIRS)
+@@ -60,7 +60,7 @@ w3mhelp-funcname.pl: w3mhelp-funcname.pl.in ../funcname.tab $(top_srcdir)/doc/ke
+ @cat $(srcdir)/w3mhelp-funcname.pl.in >> w3mhelp-funcname.pl
+ @echo "done"
+
+-w3mhelp-funcdesc-stamp: $(top_srcdir)/doc/README.func $(top_srcdir)/doc-jp/README.func w3mhelp-funcdesc.en.pl.in w3mhelp-funcdesc.ja.pl.in
++w3mhelp-funcdesc-stamp: $(top_srcdir)/doc/README.func $(top_srcdir)/doc-jp/README.func $(top_srcdir)/doc-de/README.func w3mhelp-funcdesc.en.pl.in w3mhelp-funcdesc.ja.pl.in w3mhelp-funcdesc.de.pl.in
+ @echo "generating w3mhelp-funcdesc*.pl..."
+ @for dirlang in $(DOCDIRS); do \
+ dir=`expr "$$dirlang" : "\(.*\):.*"`; \
+diff --git a/scripts/w3mdict.cgi b/scripts/w3mdict.cgi
+new file mode 100755
+index 0000000..6b0e62e
+--- /dev/null
++++ b/scripts/w3mdict.cgi
+@@ -0,0 +1,56 @@
++#!/bin/sh
++# w3mdict.cgi - A dictd dictionary query cgi for w3m
++#
++# REQUIREMENTS:
++# + dict client software
++# + an address of a dict server, for variable ${DICT_SERVER}
++# + a name of a favorite database on that server, for variable
++# ${FAVORITE_DATABASE}
++# OPTIONALLY:
++# + locally install a dict server (eg. dictd) and a collection
++# of dict databases (eg. wordnet, aka "wn")
++
++DICT_SERVER="localhost"
++FAVORITE_DATABASE="wn"
++RETURN_MESSAGE="\n\nPress 'B' to return to the previous page."
++printf "Content-type: text/plain\n"
++type dict \
++|| {
++ # Originally, we inconsiderately failed silently ...
++ # printf "W3m-control: BACK\n\n"
++ printf "\n\nERROR: dict client software not found${RETURN_MESSAGE}"
++ exit
++ }
++# First, we check only our best and favorite database. This is most
++# likely to give us a best defintion, and avoids displaying a long and
++# cluttered page with entries from many databases.
++dict --host "${DICT_SERVER}" \
++ --database "${FAVORITE_DATABASE}" \
++ "${QUERY_STRING}" 2>&1 \
++&& {
++ printf "${RETURN_MESSAGE}"
++ } \
++|| {
++ # The initial attempt failed, so let's search ALL databases
++ # available on the server.
++ dict --host "${DICT_SERVER}" \
++ "${QUERY_STRING}" 2>&1 \
++ && {
++ printf "${RETURN_MESSAGE}"
++ } \
++ || {
++ # No defintions were found in any of the server's databases, so
++ # let's return to the favorite database in order to retrieve its
++ # guess of what we meant to type. Originally, for this case, we
++ # pushed the user's default action to be entering another word for
++ # a dict defintion, so the print command was:
++ # printf "W3m-control: DICT_WORD\n\n"
++ # Now, we need only print a blank line to separate the cgi header
++ # from the page content.
++ printf "\n"
++ dict --host "${DICT_SERVER}" \
++ --database "${FAVORITE_DATABASE}" \
++ "${QUERY_STRING}" 2>&1
++ printf "${RETURN_MESSAGE}"
++ }
++ }
+diff --git a/scripts/w3mhelp-funcdesc.de.pl.in b/scripts/w3mhelp-funcdesc.de.pl.in
+new file mode 100644
+index 0000000..11539d1
+--- /dev/null
++++ b/scripts/w3mhelp-funcdesc.de.pl.in
+@@ -0,0 +1,66 @@
++# charset
++$charset = 'UTF-8';
++
++# Buffer selection mode
++
++%buf_funcdesc = (
++ 'BUF:PREV', 'Gehe zum vorherigen Punkt',
++ 'BUF:NEXT', 'Gehe zum nächsten Punkt',
++ 'BUF:DELETE', 'Lösche den ausgewählten Eintrag',
++ 'BUF:GO', 'Gehe zum ausgewählten Eintrag',
++);
++
++%lineedit_funcdesc = (
++ 'LINEEDIT:FORWARD', 'Bewege Cursor vorwärts',
++ 'LINEEDIT:BACK', 'Bewege Cursor rückwärts',
++ 'LINEEDIT:BS', 'Vorheriges Zeichen löschen',
++ 'LINEEDIT:DEL', 'Aktuelles Zeichen löschen',
++ 'LINEEDIT:KILL_AFTER', 'Lösche alles nach dem Cursor',
++ 'LINEEDIT:KILL_BEFORE', 'Lösche alles vor dem Cursor',
++ 'LINEEDIT:TOP', 'Gehe zum Zeilenanfang',
++ 'LINEEDIT:BOTTOM', 'Gehe zum Zeilenende',
++ 'LINEEDIT:PREV', 'Hole den vorherigen Chronik-Eintrag',
++ 'LINEEDIT:NEXT', 'Hole den nächsten Chronik-Eintrag',
++ 'LINEEDIT:EDITOR', 'Bearbeite mit externem Editor',
++ 'LINEEDIT:COMPLETE', 'Versuche, den Dateinamen zu komplettieren',
++ 'LINEEDIT:ACCEPT', 'Eingabezeile annehmen',
++);
++
++%menu_funcdesc = (
++ 'MENU:SELECT', 'Wähle Eintrag aus',
++ 'MENU:CLOSE', 'SchlieÃe Menü',
++ 'MENU:CANCEL', 'Einen Auswahlschritt zurück',
++ 'MENU:DOWN', 'Gehe zum nächsten Punkt',
++ 'MENU:UP', 'Gehe zum vorherigen Punkt',
++ 'MENU:LINE_UP', 'Scrolle einen Punkt aufwärts',
++ 'MENU:LINE_DOWN', 'Scrolle einen Punkt abwärts',
++ 'MENU:TOP', 'Gehe zum ersten Punkt',
++ 'MENU:LAST', 'Gehe zum letzten Punkt',
++ 'MENU:NEXT', 'Gehe zur nächsten Seite',
++ 'MENU:PREV', 'Gehe zur vorherigen Seite',
++ 'MENU:SEARCH_FORE', 'Suche vorwärts',
++ 'MENU:SEARCH_BACK', 'Suche rückwärts',
++ 'MENU:SEARCH_NEXT', 'Suche weitere Ãbereinstimmung',
++ 'MENU:SEARCH_PREV', 'Suche frühere Ãbereinstimmung',
++ 'MENU:SUSPEND', 'Zurückstellen',
++);
++
++%title = (
++ "Current keymap file", 'Aktuelle Datei mit Tastaturbefehlszuordnung',
++ "In-page Navigation", 'Navigation auf der Seite',
++ "Hyperlink Operations", 'Umgang mit Hyperlinks',
++ "File/Stream Operations", 'Umgang mit Dateien und Datenströmen',
++ "Buffer Operations", 'Umgang mit Puffern',
++ "Tab Operations", 'Umgang mit Reitern',
++ "Buffer and Tab Selection Mode", 'Puffer/Reiter-Auswahl-Modus',
++ "Bookmark Management", 'Lesezeichenverwaltung',
++ "Searches", 'Suchen',
++ "Dictionary Lookup", 'Abgleich mit Wörterbuch',
++ "Mark Operations", 'Umgang mit Textmarken',
++ "Miscellaneous", 'Verschiedenes',
++ "User-defined key bindings", 'Benutzerdefinierte Tastaturbefehle',
++ "Input Line Editing Mode", 'Bearbeitung der Eingabezeile',
++ "Popup Menu Mode", 'Navigation in Menüs',
++);
++
++1;
+diff --git a/scripts/w3mhelp-funcdesc.en.pl.in b/scripts/w3mhelp-funcdesc.en.pl.in
+index d854b59..b9f4ed8 100644
+--- a/scripts/w3mhelp-funcdesc.en.pl.in
++++ b/scripts/w3mhelp-funcdesc.en.pl.in
+@@ -4,44 +4,44 @@ $charset = 'US-ASCII';
+ # Buffer selection mode
+
+ %buf_funcdesc = (
+- 'BUF:PREV', 'Select previous buffer',
+- 'BUF:NEXT', 'Select next buffer',
+- 'BUF:DELETE', 'Delete current buffer',
+- 'BUF:GO', 'Go to the selected buffer',
++ 'BUF:PREV', 'Previous item',
++ 'BUF:NEXT', 'Next item',
++ 'BUF:DELETE', 'Delete item',
++ 'BUF:GO', 'Select item',
+ );
+
+ %lineedit_funcdesc = (
+- 'LINEEDIT:FORWARD', 'Move cursor forward',
+- 'LINEEDIT:BACK', 'Move cursor backward',
++ 'LINEEDIT:FORWARD', 'Cursor forward',
++ 'LINEEDIT:BACK', 'Cursor backward',
+ 'LINEEDIT:BS', 'Delete previous character',
+- 'LINEEDIT:DEL', 'Delete current character',
+- 'LINEEDIT:KILL_AFTER', 'Kill everything after cursor',
+- 'LINEEDIT:KILL_BEFORE', 'Kill everything before cursor',
+- 'LINEEDIT:TOP', 'Move to the top of line',
+- 'LINEEDIT:BOTTOM', 'Move to the bottom of line',
++ 'LINEEDIT:DEL', 'Delete character',
++ 'LINEEDIT:KILL_AFTER', 'Delete everything after cursor',
++ 'LINEEDIT:KILL_BEFORE', 'Delete everything before cursor',
++ 'LINEEDIT:TOP', 'Cursor to the beginning of the line',
++ 'LINEEDIT:BOTTOM', 'Cursor to the end of the line',
+ 'LINEEDIT:PREV', 'Fetch the previous string from the history list',
+ 'LINEEDIT:NEXT', 'Fetch the next string from the history list',
+ 'LINEEDIT:EDITOR', 'Edit with external editor',
+- 'LINEEDIT:COMPLETE', 'Complete filename',
+- 'LINEEDIT:ACCEPT', 'Accept',
++ 'LINEEDIT:COMPLETE', 'Try to complete filename',
++ 'LINEEDIT:ACCEPT', 'Accept input line',
+ );
+
+ %menu_funcdesc = (
+ 'MENU:SELECT', 'Select item',
+ 'MENU:CLOSE', 'Close menu',
+- 'MENU:CANCEL', 'Back',
+- 'MENU:DOWN', 'Move to next item',
+- 'MENU:UP', 'Move to previous item',
++ 'MENU:CANCEL', 'One selection step backward',
++ 'MENU:DOWN', 'Move to the next item',
++ 'MENU:UP', 'Move to the previous item',
+ 'MENU:LINE_UP', 'Scroll up one item',
+ 'MENU:LINE_DOWN', 'Scroll down one item',
+- 'MENU:TOP', 'Go to top item',
+- 'MENU:LAST', 'Go to last item',
+- 'MENU:NEXT', 'Go to next page',
+- 'MENU:PREV', 'Go to previous page',
+- 'MENU:SEARCH_FORE', 'Search foreward',
++ 'MENU:TOP', 'Move to the first item',
++ 'MENU:LAST', 'Move to the final item',
++ 'MENU:NEXT', 'Go to the next page',
++ 'MENU:PREV', 'Go to the previous page',
++ 'MENU:SEARCH_FORE', 'Search forward',
+ 'MENU:SEARCH_BACK', 'Search backward',
+- 'MENU:SEARCH_NEXT', 'Search next regexp',
+- 'MENU:SEARCH_PREV', 'Search previous regexp',
++ 'MENU:SEARCH_NEXT', 'Search for the next match',
++ 'MENU:SEARCH_PREV', 'Search for the previous match',
+ 'MENU:SUSPEND', 'Suspend',
+ );
+
+diff --git a/scripts/w3mhelp-funcdesc.ja.pl.in b/scripts/w3mhelp-funcdesc.ja.pl.in
+index 051c888..4ef476e 100644
+--- a/scripts/w3mhelp-funcdesc.ja.pl.in
++++ b/scripts/w3mhelp-funcdesc.ja.pl.in
+@@ -46,21 +46,21 @@ $charset = 'EUC-JP';
+ );
+
+ %title = (
+- "Show keymap file", 'keymap ¥Õ¥¡¥¤¥ë¤ò¸«¤ë',
+- "Page/Cursor motion", '¥Ú¡¼¥¸/¥«¡¼¥½¥ë°ÜÆ°',
+- "Hyperlink operation", '¥Ï¥¤¥Ñ¡¼¥ê¥ó¥¯Áàºî',
+- "File/Stream operation", '¥Õ¥¡¥¤¥ë/¥¹¥È¥ê¡¼¥àÁàºî',
+- "Buffer operation", '¥Ð¥Ã¥Õ¥¡Áàºî',
+- "Tab operation", '¥¿¥ÖÁàºî',
+- "Buffer selection mode", '¥Ð¥Ã¥Õ¥¡ÁªÂò¥â¡¼¥É',
+- "Bookmark operation", '¥Ö¥Ã¥¯¥Þ¡¼¥¯Áàºî',
+- "Search", '¸¡º÷',
+- "Dictionary look-up", '¼½ñ¸¡º÷',
+- "Mark operation", '¥Þ¡¼¥¯Áàºî',
+- "Miscellany", '¤½¤Î¾',
+- "User defined keymaps", '¥æ¡¼¥¶ÄêµÁ',
+- "Line-edit mode", '¹ÔÊÔ½¸¥â¡¼¥É',
+- "Popup menu", '¥á¥Ë¥å¡¼',
++ "Current keymap file", 'keymap ¥Õ¥¡¥¤¥ë¤ò¸«¤ë',
++ "In-page Navigation", '¥Ú¡¼¥¸/¥«¡¼¥½¥ë°ÜÆ°',
++ "Hyperlink Operations", '¥Ï¥¤¥Ñ¡¼¥ê¥ó¥¯Áàºî',
++ "File/Stream Operations", '¥Õ¥¡¥¤¥ë/¥¹¥È¥ê¡¼¥àÁàºî',
++ "Buffer Operations", '¥Ð¥Ã¥Õ¥¡Áàºî',
++ "Tab Operations", '¥¿¥ÖÁàºî',
++ "Buffer and Tab Selection Mode", '¥Ð¥Ã¥Õ¥¡ÁªÂò¥â¡¼¥É',
++ "Bookmark Management", '¥Ö¥Ã¥¯¥Þ¡¼¥¯Áàºî',
++ "Searches", '¸¡º÷',
++ "Dictionary Lookup", '¼½ñ¸¡º÷',
++ "Mark Operations", '¥Þ¡¼¥¯Áàºî',
++ "Miscellaneous", '¤½¤Î¾',
++ "User-defined key bindings", '¥æ¡¼¥¶ÄêµÁ',
++ "Input Line Editing Mode", '¹ÔÊÔ½¸¥â¡¼¥É',
++ "Popup Menu Mode", '¥á¥Ë¥å¡¼',
+ );
+
+ 1;
+diff --git a/scripts/w3mhelp.cgi.in b/scripts/w3mhelp.cgi.in
+index b2fca8f..503dddc 100644
+--- a/scripts/w3mhelp.cgi.in
++++ b/scripts/w3mhelp.cgi.in
+@@ -48,7 +48,7 @@ if (defined($ENV{'QUERY_STRING'})) {
+ }
+ # print "tlang=$tlang\n";
+ eval {require "w3mhelp-funcdesc.$tlang.pl";};
+- if (defined(%funcdesc)) {
++ if (%funcdesc) {
+ $lang = $tlang;
+ }
+ }
+@@ -102,8 +102,7 @@ Content-Type: text/html; charset=$charset
+ *******
+ <A HREF="http://w3m.sourceforge.net/">w3m</A>
+ (WWW-wo-Miru) Version $version by
+-<A HREF="mailto:aito\@fw.ipsj.or.jp">A.ITO</A> ********<BR>
+- ***** Key assign table *****
++<A HREF="mailto:aito\@fw.ipsj.or.jp">A.ITO</A> ********
+ </CENTER>
+
+ HEADING
+@@ -112,25 +111,25 @@ $q_version = $version;
+ $q_version =~ s/[^A-Za-z0-9_\$\.\-]/sprintf('%%%02X', ord($&))/ge;
+ $script = "<A HREF=\"$ENV{'SCRIPT_NAME'}?version=$q_version&lang=";
+
+-# doc:en_English doc-jp:ja_Japanese
++# doc:en_English doc-jp:ja_Japanese doc-de:de_German
+ for $otherlang (@docdirs) {
+ local(@d) = split(/[:_]/, $otherlang);
+
+ if ($d[1] ne $lang) {
+ $d[1] =~ s/[^A-Za-z0-9_\$\.\-]/sprintf('%%%02X', ord($&))/ge;
+- print $script, $d[1], "\">$d[2] version</A>\n";
++ print $script, $d[1], "\">[$d[2]]</A>\n";
+ }
+ }
+
+ $keymap =~ s/[<>&]/$htmlesc{$&}/ge;
+-$head = "Show keymap file";
++$head = 'Current keymap file';
+ if (defined($title{$head})) {
+ $head = $title{$head};
+ $head =~ s/[<>&]/$htmlesc{$&}/ge;
+ }
+ print "<P><A HREF=\"$keymap\">$head</A>\n";
+
+-&show_keymap("Page/Cursor motion",
++&show_keymap('In-page Navigation',
+ split(" ", "pgFore pgBack movR movL movD movU
+ movR1 movL1 movD1 movU1 ldown1 lup1
+ shiftl shiftr col1L col1R linbeg linend ctrCsrH ctrCsrV
+@@ -139,50 +138,50 @@ print "<P><A HREF=\"$keymap\">$head</A>\n";
+ nextR nextL nextD nextU nextRD nextLU
+ undoPos redoPos"));
+
+-&show_keymap("Hyperlink operation",
++&show_keymap('Hyperlink Operations',
+ split(" ", "followA tabA svA followI svI submitForm
+ curURL peekURL peekIMG pginfo curlno chkURL chkWORD chkNMID
+ rFrame extbrz linkbrz linkLst listMn linkMn accessKey"));
+
+-&show_keymap("File/Stream operation",
++&show_keymap('File/Stream Operations',
+ split(" ", "goURL gorURL tabURL tabrURL ldfile readsh pipesh
+ pipeBuf"));
+
+-&show_keymap("Buffer operation",
++&show_keymap('Buffer Operations',
+ split(" ", "backBf nextBf prevBf selMn selBuf vwSrc svSrc svBuf
+ editBf editScr reload reshape rdrwSc dispI stopI"));
+
+-&show_keymap("Tab operation",
++&show_keymap('Tab Operations',
+ split(" ", "newT closeT nextT prevT tabMn tabR tabL"));
+
+-&show_keymap("Bookmark operation",
++&show_keymap('Bookmark Management',
+ split(" ", "ldBmark adBmark"));
+
+-&show_keymap("Search",
++&show_keymap('Searches',
+ split(" ", "srchfor srchbak srchnxt srchprv isrchfor isrchbak"));
+
+-&show_keymap("Dictionary look-up",
++&show_keymap('Dictionary Lookup',
+ split(" ", "dictword dictwordat"));
+
+-&show_keymap("Mark operation",
++&show_keymap('Mark Operations',
+ split(" ", "_mark nextMk prevMk reMark"));
+
+-&show_keymap("Miscellany",
++&show_keymap('Miscellaneous',
+ split(" ", "mainMn ldhelp ldOpt dispVer cooLst ldHist ldDL
+ docCSet defCSet
+ msgs msToggle wrapToggle execCmd setAlarm setOpt setEnv defKey
+ reinit execsh susp qquitfm quitfm"));
+
+-&show_keymap_data("User defined keymaps");
++&show_keymap_data('User-defined key bindings');
+
+ print "<BR>\n<HR WIDTH=80%>\n";
+
+-&show_keymap("Buffer selection mode",
++&show_keymap('Buffer and Tab Selection Mode',
+ split(" ", "buffer_next buffer_prev buffer_delete buffer_go"));
+
+ print "<BR>\n<HR WIDTH=80%>\n";
+
+-&show_keymap("Line-edit mode",
++&show_keymap('Input Line Editing Mode',
+ split(" ", "lineedit_forward lineedit_back lineedit_backspace
+ lineedit_delete lineedit_kill_after lineedit_kill_before
+ lineedit_top lineedit_bottom lineedit_prev lineedit_next
+@@ -190,7 +189,7 @@ print "<BR>\n<HR WIDTH=80%>\n";
+
+ print "<BR>\n<HR WIDTH=80%>\n";
+
+-&show_keymap("Popup menu",
++&show_keymap('Popup Menu Mode',
+ split(" ", "menu_select menu_close menu_cancel menu_down menu_up
+ menu_line_up menu_line_down menu_top menu_last menu_next
+ menu_prev menu_search_fore menu_search_back menu_search_next
+diff --git a/scripts/w3mman/Makefile.in b/scripts/w3mman/Makefile.in
+index 569e2fc..ad1cffe 100644
+--- a/scripts/w3mman/Makefile.in
++++ b/scripts/w3mman/Makefile.in
+@@ -33,11 +33,13 @@ ETC_DIR = $(sysconfdir)
+ CONF_DIR = $(sysconfdir)/$(PACKAGE)
+ BIN_DIR = $(bindir)
+ MAN1_DIR = $(mandir)/man1
++MAN1_DE_DIR = $(mandir)/de/man1
+
+ TARGETS = w3mman
+ CGIBIN_TARGETS = w3mman2html.cgi
+ MAN1_TARGETS = w3mman.1
+-MAN_TARGETS = $(MAN1_TARGETS)
++MAN1_DE_TARGETS = w3mman.de.1
++MAN_TARGETS = $(MAN1_TARGETS) $(MAN1_DE_TARGETS)
+
+ MKDIR = mkdir -p
+ INSTALL = @INSTALL@
+@@ -53,6 +55,7 @@ install: $(TARGETS) $(CGIBIN_TARGETS) $(MAN_TARGETS)
+ -$(MKDIR) $(DESTDIR)$(BIN_DIR)
+ -$(MKDIR) $(DESTDIR)$(CGIBIN_DIR)
+ -$(MKDIR) $(DESTDIR)$(MAN1_DIR)
++ -$(MKDIR) $(DESTDIR)$(MAN1_DE_DIR)
+ for file in $(TARGETS); \
+ do \
+ $(INSTALL_SCRIPT) $$file $(DESTDIR)$(BIN_DIR); \
+@@ -65,6 +68,12 @@ install: $(TARGETS) $(CGIBIN_TARGETS) $(MAN_TARGETS)
+ do \
+ $(INSTALL_MAN) $$file $(DESTDIR)$(MAN1_DIR); \
+ done
++ for file in $(MAN1_DE_TARGETS); \
++ do \
++ $(INSTALL_MAN) $$file $(DESTDIR)$(MAN1_DE_DIR); \
++ f=`echo "$$file" | sed -e 's/\.de\././'`; \
++ mv $(DESTDIR)$(MAN1_DE_DIR)/$$file $(DESTDIR)$(MAN1_DE_DIR)/$$f; \
++ done
+
+ uninstall:
+ -for file in $(TARGETS); \
+@@ -79,6 +88,11 @@ uninstall:
+ do \
+ rm -f $(MAN1_DIR)/$$file; \
+ done
++ -for file in $(MAN1_DE_TARGETS); \
++ do \
++ f=`echo "$$file" | sed -e 's/\.de\././'`; \
++ rm -f $(MAN1_DE_DIR)/$$f; \
++ done
+
+ clean:
+
+@@ -89,7 +103,7 @@ distclean:
+ dist: all
+ @-rm -fr $(distdir)/w3mman
+ -$(MKDIR) $(distdir)/w3mman
+- cp Makefile README w3mman.in w3mman2html.cgi.in hlink.cgi w3mman.1.in $(distdir)/w3mman
++ cp Makefile README w3mman.in w3mman2html.cgi.in hlink.cgi w3mman.1.in w3mman.de.1.in $(distdir)/w3mman
+ ( cd $(distdir); tar -cf - w3mman | GZIP='' gzip ) \
+ > $(distdir)/w3mman.tar.gz
+ -rm -fr $(distdir)/w3mman
+diff --git a/scripts/w3mman/w3mman.1.in b/scripts/w3mman/w3mman.1.in
+index 1c0361d..904fb5d 100644
+--- a/scripts/w3mman/w3mman.1.in
++++ b/scripts/w3mman/w3mman.1.in
+@@ -1,4 +1,4 @@
+-.TH W3MMAN 1 "Nov 5, 2005"
++.TH W3MMAN 1 "2016-07-13"
+ .\" Please adjust this date whenever revising the manpage.
+ .\"
+ .\" Some roff macros, for reference:
+@@ -12,36 +12,52 @@
+ .\" .sp <n> insert n+1 empty lines
+ .\" for manpage-specific macros, see man(7)
+ .SH NAME
+-w3mman \- an interface to the on-line reference manuals by w3m(1)
++w3mman \- an interface to the on-line reference manuals via w3m(1)
+ .SH SYNOPSIS
++.\" mh 2016-07-04: "page" is an optional argument.
++.\" Started without it, w3mman displays a form that allows selection
++.\" of a manual page according to section, name and keyword.
++.\" Therefore square brackets introduced
+ .B w3mman
+-.RI "[-M " path ] " " [ section ] " page"
++[
++.BI \-M " path"
++] [
++.I section
++] [
++.I page
++]
+ .br
+ .B w3mman
+-.RI "[-M " path "] -k " keyword
++[
++.BI \-M " path"
++]
++.BI \-k " keyword"
+ .br
+ .B w3mman
+-.RI -l " file
++.BI \-l " file"
++.br
+ .SH DESCRIPTION
++.\" mh 2016-07-04 text edited. This section shall deliver
++.\" more information than section NAME
+ .B w3mman
+-is the system's manual pager by
+-.BR w3m (1).
++is a Perl script that uses
++.BR w3m (1)
++to serve as a pager for on-line reference manuals.
+ .SH OPTIONS
+ A summary of options is included below.
+ .TP
+ .BI \-M " path"
+-Specify
++Specify
+ .I path
+-as MANPATH.
++as alternative MANPATH to use.
+ .TP
+ .BI \-k " keyword"
+-Specify
+-.I keyword.
++Specify \fIkeyword\fP.
+ .TP
+ .BI \-l " file"
+-Specify a
+-.I file.
++Specify a \fIfile\fP.
+ .SH ENVIRONMENT
++Two variables are available for debugging.
+ .TP
+ .B W3MMAN_W3M
+ If W3MMAN_W3M is set, its value is used instead of @W3M@.
+@@ -51,7 +67,7 @@ If W3MMAN_MAN is set, its value is used instead of @MAN@.
+ .SH FILES
+ .TP
+ .I @libexecdir@/@PACKAGE@/cgi-bin/w3mman2html.cgi
+-convert manual page to html.
++manual page to HTML convertor.
+ .SH SEE ALSO
+ .BR man (1),
+ .BR w3m (1).
+diff --git a/scripts/w3mman/w3mman.de.1.in b/scripts/w3mman/w3mman.de.1.in
+new file mode 100644
+index 0000000..d6c5a44
+--- /dev/null
++++ b/scripts/w3mman/w3mman.de.1.in
+@@ -0,0 +1,71 @@
++.\"*******************************************************************
++.\"
++.\" This file was generated with po4a. Translate the source file.
++.\"
++.\"*******************************************************************
++.TH W3MMAN 1 2016\-07\-13
++.\" Please adjust this date whenever revising the manpage.
++.\"
++.\" Some roff macros, for reference:
++.\" .nh disable hyphenation
++.\" .hy enable hyphenation
++.\" .ad l left justify
++.\" .ad b justify to both left and right margins
++.\" .nf disable filling
++.\" .fi enable filling
++.\" .br insert line break
++.\" .sp <n> insert n+1 empty lines
++.\" for manpage-specific macros, see man(7)
++.SH NAME
++w3mman \- eine Schnittstelle zur Anzeige von Online\-Referenzhandbüchern durch
++w3m(1)
++.SH SYNOPSIS
++.\" mh 2016-07-04: "page" is an optional argument.
++.\" Started without it, w3mman displays a form that allows selection
++.\" of a manual page according to section, name and keyword.
++.\" Therefore square brackets introduced
++\fBw3mman\fP [ \fB\-M\fP \fIPfad\fP ] [ \fIAbschnitt\fP ] [ \fISeite\fP ]
++.br
++\fBw3mman\fP [\fB\-M\fP \fIPfad\fP] \fB\-k\fP \fIStichwort\fP
++.br
++\fBw3mman\fP \fB\-l\fP \fIDatei\fP
++.br
++.SH BESCHREIBUNG
++.\" mh 2016-07-04 text edited. This section shall deliver
++.\" more information than section NAME
++\fBw3mman\fP ist ein Perl\-Skript, welches auf \fBw3m\fP(1) zurückgreift, um als
++Betrachter für Online\-Referenzhandbücher zu dienen.
++.SH OPTIONEN
++Es folgt eine Zusammenfassung der Optionen.
++.TP
++\fB\-M\fP\fI Pfad\fP
++Suchpfad für Handbuchseiten auf \fIPfad\fP setzen
++.TP
++\fB\-k\fP \fIStichwort\fP
++zum \fIStichwort\fP passende Handbuchseiten anzeigen
++.TP
++\fB\-l\fP \fIDatei\fP
++die Handbuchseiten\-Datei \fIDatei\fP anzeigen
++.SH UMGEBUNGSVARIABLEN
++Zur Fehleranalyse stehen zwei Variablen zur Verfügung.
++.TP
++\fBW3MMAN_W3M\fP
++Ist W3MMAN_W3M gesetzt, wird ihr Wert anstelle von @W3M@ verwendet.
++.TP
++\fBW3MMAN_MAN\fP
++Ist W3MMAN_MAN gesetzt, wird ihr Wert anstelle von @MAN@ verwendet.
++.SH DATEIEN
++.TP
++\fI@libexecdir@/@PACKAGE@/cgi\-bin/w3mman2html.cgi\fP
++Skript, welches Handbuchseiten in HTML konvertiert
++.SH "SIEHE AUCH"
++\fBman\fP(1), \fBw3m\fP(1).
++.SH AUTOR
++Diese Handbuchseite wurde von Fumitoshi UKAI <ukai@debian.or.jp> für
++Debian GNU / Linux geschrieben, sie kann aber auch auf anderen Systemen
++verwendet werden.
++Die deutsche Ãbersetzung wurde 2016 von
++.UR markus.hiereth@freenet.de
++Markus Hiereth
++.UE
++erstellt.
+diff --git a/scripts/w3mman/w3mman2html.cgi.in b/scripts/w3mman/w3mman2html.cgi.in
+index f430307..2cd00f9 100644
+--- a/scripts/w3mman/w3mman2html.cgi.in
++++ b/scripts/w3mman/w3mman2html.cgi.in
+@@ -34,7 +34,6 @@ Content-Type: text/html
+ EOF
+ $keyword =~ s:([^-\w\200-\377.,])::g;
+ open(F, "$MAN -k $keyword 2> /dev/null |");
+- @line = ();
+ while(<F>) {
+ chop;
+ $_ = &html_quote($_);
+@@ -126,12 +125,14 @@ while(<F>) {
+ s/\&/\&/g;
+ s/\</\</g;
+ s/\>/\>/g;
++ # non ASCII UTF-8 codepoint
++ my $utf8="[\300-\337][\200-\277]|[\340-\357][\200-\277]{2}|[\360-\367][\200-\277]{3}|[\370-\373][\200-\277]{4}|[\374\375][\200-\277]{5}";
+
+- s@([\200-\377].)(\010{1,2}\1)+@<b>$1</b>@g;
++ s@($utf8)(\010\1)+@<b>$1</b>@g;
+ s@(\&\w+;|.)(\010\1)+@<b>$1</b>@g;
+- s@__\010{1,2}((\<b\>)?[\200-\377].(\</b\>)?)@<u>$1</u>@g;
++ s@_\010((\<b\>)?($utf8)(\</b\>)?)@<u>$1</u>@g;
+ s@_\010((\<b\>)?(\&\w+\;|.)(\</b\>)?)@<u>$1</u>@g;
+- s@((\<b\>)?[\200-\377].(\</b\>)?)\010{1,2}__@<u>$1</u>@g;
++ s@((\<b\>)?($utf8)(\</b\>)?)\010_@<u>$1</u>@g;
+ s@((\<b\>)?(\&\w+\;|.)(\</b\>)?)\010_@<u>$1</u>@g;
+ s@.\010(.)@$1@g;
+
+@@ -156,7 +157,7 @@ EOF
+ }
+
+ s@(http|ftp)://[\w.\-/~]+[\w/]@<a href="$&">$&</a>@g;
+- s@(\W)(mailto:)?(\w[\w.\-]*\@\w[\w.\-]*\.[\w.\-]*\w)@$1<a href="mailto:$3">$2$3</a>@g;
++ s@\b(mailto:|)(\w[\w.\-]*\@\w[\w.\-]*\.[\w.\-]*\w)@<a href="mailto:$2">$1$2</a>@g;
+ s@(\W)(\~?/[\w.][\w.\-/~]*)@$1 . &file_ref($2)@ge;
+ s@(include(<\/?[bu]\>|\s)*\<)([\w.\-/]+)@$1 . &include_ref($3)@ge;
+ if ($prev && m@^\s*(\<[bu]\>)*(\w[\w.\-]*)(\</[bu]\>)*(\([\dm]\w*\))@) {
+@@ -220,7 +221,7 @@ sub is_command {
+ local($p);
+
+ (! -d && -x) || return 0;
+- if (! defined(%PATH)) {
++ if (! %PATH) {
+ for $p (split(":", $ENV{'PATH'})) {
+ $p =~ s@/+$@@;
+ $PATH{$p} = 1;
+diff --git a/table.c b/table.c
+index e1243ff..d88e983 100644
+--- a/table.c
++++ b/table.c
+@@ -188,7 +188,7 @@ dv2sv(double *dv, short *iv, int size)
+ indexarray = NewAtom_N(short, size);
+ edv = NewAtom_N(double, size);
+ for (i = 0; i < size; i++) {
+- iv[i] = ceil(dv[i]);
++ iv[i] = (short) ceil(dv[i]);
+ edv[i] = (double)iv[i] - dv[i];
+ }
+
+@@ -205,7 +205,7 @@ dv2sv(double *dv, short *iv, int size)
+ indexarray[i] = k;
+ }
+ iw = min((int)(w + 0.5), size);
+- if (iw == 0)
++ if (iw <= 1)
+ return;
+ x = edv[(int)indexarray[iw - 1]];
+ for (i = 0; i < size; i++) {
+@@ -429,7 +429,6 @@ visible_length(char *str)
+ char *t, *r2;
+ int amp_len = 0;
+
+- t = str;
+ while (*str) {
+ prev_status = status;
+ if (next_status(*str, &status)) {
+@@ -761,7 +760,7 @@ do_refill(struct table *tbl, int row, int col, int maxlimit)
+ struct parsed_tag *tag;
+ if ((tag = parse_tag(&p, TRUE)) != NULL)
+ parsedtag_get_value(tag, ATTR_TID, &id);
+- if (id >= 0 && id < tbl->ntable) {
++ if (id >= 0 && id < tbl->ntable && tbl->tables[id].ptr) {
+ int alignment;
+ TextLineListItem *ti;
+ struct table *t = tbl->tables[id].ptr;
+@@ -1691,7 +1690,7 @@ renderTable(struct table *t, int max_width, struct html_feed_environ *h_env)
+ {
+ int i, j, w, r, h;
+ Str renderbuf;
+- short new_tabwidth[MAXCOL];
++ short new_tabwidth[MAXCOL] = { 0 };
+ #ifdef MATRIX
+ int itr;
+ VEC *newwidth;
+@@ -1724,6 +1723,10 @@ renderTable(struct table *t, int max_width, struct html_feed_environ *h_env)
+ if (max_width < rulewidth)
+ max_width = rulewidth;
+
++#define MAX_TABWIDTH 10000
++ if (max_width > MAX_TABWIDTH)
++ max_width = MAX_TABWIDTH;
++
+ check_maximum_width(t);
+
+ #ifdef MATRIX
+@@ -2600,12 +2603,16 @@ feed_table_tag(struct table *tbl, char *line, struct table_mode *mode,
+ if ((tbl->row + rowspan) >= tbl->max_rowsize)
+ check_row(tbl, tbl->row + rowspan);
+ }
++ if (rowspan < 1)
++ rowspan = 1;
+ if (parsedtag_get_value(tag, ATTR_COLSPAN, &colspan)) {
+ if ((tbl->col + colspan) >= MAXCOL) {
+ /* Can't expand column */
+ colspan = MAXCOL - tbl->col;
+ }
+ }
++ if (colspan < 1)
++ colspan = 1;
+ if (parsedtag_get_value(tag, ATTR_ALIGN, &i)) {
+ switch (i) {
+ case ALIGN_LEFT:
+@@ -2878,6 +2885,14 @@ feed_table_tag(struct table *tbl, char *line, struct table_mode *mode,
+ tmp = process_input(tag);
+ feed_table1(tbl, tmp, mode, width);
+ break;
++ case HTML_BUTTON:
++ tmp = process_button(tag);
++ feed_table1(tbl, tmp, mode, width);
++ break;
++ case HTML_N_BUTTON:
++ tmp = process_n_button();
++ feed_table1(tbl, tmp, mode, width);
++ break;
+ case HTML_SELECT:
+ tmp = process_select(tag);
+ if (tmp)
+@@ -3010,7 +3025,6 @@ feed_table_tag(struct table *tbl, char *line, struct table_mode *mode,
+ break;
+ case HTML_TABLE_ALT:
+ id = -1;
+- w = 0;
+ parsedtag_get_value(tag, ATTR_TID, &id);
+ if (id >= 0 && id < tbl->ntable) {
+ struct table *tbl1 = tbl->tables[id].ptr;
+diff --git a/table.h b/table.h
+index 83b661f..fdcdef3 100644
+--- a/table.h
++++ b/table.h
+@@ -17,7 +17,7 @@
+ #define MAX_TABLE_N 20 /* maximum number of table in same level */
+
+ #define MAXROW 50
+-#define MAXCOL 50
++#define MAXCOL 256
+
+ #define MAX_WIDTH 80
+
+diff --git a/tagtable.tab b/tagtable.tab
+index f9b7b76..f5a2c30 100644
+--- a/tagtable.tab
++++ b/tagtable.tab
+@@ -176,6 +176,7 @@ bdo HTML_BDO
+ big HTML_BIG
+ /big HTML_N_BIG
+ button HTML_BUTTON
++/button HTML_N_BUTTON
+ fieldset HTML_FIELDSET
+ /fieldset HTML_N_FIELDSET
+ iframe HTML_IFRAME
+diff --git a/terms.c b/terms.c
+index 7a3c987..3d2ffd7 100644
+--- a/terms.c
++++ b/terms.c
+@@ -12,6 +12,7 @@
+ #include <unistd.h>
+ #include "config.h"
+ #include <string.h>
++#include <sys/wait.h>
+ #ifdef HAVE_SYS_SELECT_H
+ #include <sys/select.h>
+ #endif
+@@ -222,6 +223,7 @@ static void
+ check_cygwin_console(void)
+ {
+ char *term = getenv("TERM");
++ char *ctype;
+ HANDLE hWnd;
+
+ if (term == NULL)
+@@ -236,7 +238,9 @@ check_cygwin_console(void)
+ isLocalConsole = 1;
+ }
+ }
+- if (strncmp(getenv("LANG"), "ja", 2) == 0) {
++ if (((ctype = getenv("LC_ALL")) ||
++ (ctype = getenv("LC_CTYPE")) ||
++ (ctype = getenv("LANG"))) && strncmp(ctype, "ja", 2) == 0) {
+ isWinConsole = TERM_CYGWIN_RESERVE_IME;
+ }
+ #ifdef SUPPORT_WIN9X_CONSOLE_MBCS
+@@ -463,6 +467,262 @@ writestr(char *s)
+
+ #define MOVE(line,column) writestr(tgoto(T_cm,column,line));
+
++#ifdef USE_IMAGE
++void
++put_image_osc5379(char *url, int x, int y, int w, int h, int sx, int sy, int sw, int sh, int n_terminal_image)
++{
++ Str buf;
++ char *size ;
++
++ if (w > 0 && h > 0)
++ size = Sprintf("%dx%d",w,h)->ptr;
++ else
++ size = "";
++
++ MOVE(y,x);
++ buf = Sprintf("\x1b]5379;show_picture %s %s %dx%d+%d+%d\x07",url,size,sw,sh,sx,sy);
++ writestr(buf->ptr);
++ MOVE(Currentbuf->cursorY,Currentbuf->cursorX);
++}
++
++static void
++save_gif(const char *path, u_char *header, size_t header_size, u_char *body, size_t body_size)
++{
++ int fd;
++
++ if ((fd = open(path, O_WRONLY|O_CREAT, 0600)) >= 0) {
++ write(fd, header, header_size) ;
++ write(fd, body, body_size) ;
++ write(fd, "\x3b" , 1) ;
++ close(fd) ;
++ }
++}
++
++static u_char *
++skip_gif_header(u_char *p)
++{
++ /* Header */
++ p += 10;
++
++ if (*(p) & 0x80) {
++ p += (3 * (2 << ((*p) & 0x7)));
++ }
++ p += 3;
++
++ return p;
++}
++
++static Str
++save_first_animation_frame(const char *path)
++{
++ int fd;
++ struct stat st;
++ u_char *header;
++ size_t header_size;
++ u_char *body;
++ u_char *p;
++ ssize_t len;
++ Str new_path;
++
++ new_path = Strnew_charp(path);
++ Strcat_charp(new_path, "-1");
++ if (stat(new_path->ptr, &st) == 0) {
++ return new_path;
++ }
++
++ if ((fd = open( path, O_RDONLY)) < 0) {
++ return NULL;
++ }
++
++ if (fstat( fd, &st) != 0 || ! (header = GC_malloc( st.st_size))){
++ close( fd);
++ return NULL;
++ }
++
++ len = read(fd, header, st.st_size);
++ close(fd);
++
++ /* Header */
++
++ if (len != st.st_size || strncmp(header, "GIF89a", 6) != 0) {
++ return NULL;
++ }
++
++ p = skip_gif_header(header);
++ header_size = p - header;
++
++ /* Application Extension */
++ if (p[0] == 0x21 && p[1] == 0xff) {
++ p += 19;
++ }
++
++ /* Other blocks */
++ body = NULL;
++ while (p + 2 < header + st.st_size) {
++ if (*(p++) == 0x21 && *(p++) == 0xf9 && *(p++) == 0x04) {
++ if( body) {
++ /* Graphic Control Extension */
++ save_gif(new_path->ptr, header, header_size, body, p - 3 - body);
++ return new_path;
++ }
++ else {
++ /* skip the first frame. */
++ }
++ body = p - 3;
++ }
++ }
++
++ return NULL;
++}
++
++void ttymode_set(int mode, int imode);
++void ttymode_reset(int mode, int imode);
++
++void
++put_image_sixel(char *url, int x, int y, int w, int h, int sx, int sy, int sw, int sh, int n_terminal_image)
++{
++ pid_t pid;
++ int do_anim;
++ MySignalHandler(*volatile previntr) (SIGNAL_ARG);
++ MySignalHandler(*volatile prevquit) (SIGNAL_ARG);
++ MySignalHandler(*volatile prevstop) (SIGNAL_ARG);
++
++ MOVE(y,x);
++ flush_tty();
++
++ do_anim = (n_terminal_image == 1 && x == 0 && y == 0 && sx == 0 && sy == 0);
++
++ previntr = mySignal(SIGINT, SIG_IGN);
++ prevquit = mySignal(SIGQUIT, SIG_IGN);
++ prevstop = mySignal(SIGTSTP, SIG_IGN);
++
++ if ((pid = fork()) == 0) {
++ char *env;
++ int n = 0;
++ char *argv[20];
++ char digit[2][11+1];
++ char clip[44+3+1];
++ Str str_url;
++
++ close(STDERR_FILENO); /* Don't output error message. */
++ if (do_anim) {
++ writestr("\x1b[?80h");
++ }
++ else if (!strstr(url, "://") && strcmp(url+strlen(url)-4, ".gif") == 0 &&
++ (str_url = save_first_animation_frame(url))) {
++ url = str_url->ptr;
++ }
++ ttymode_set(ISIG, 0);
++
++ if ((env = getenv("W3M_IMG2SIXEL"))) {
++ char *p;
++ env = Strnew_charp(env)->ptr;
++ while (n < 8 && (p = strchr(env, ' '))) {
++ *p = '\0';
++ if (*env != '\0') {
++ argv[n++] = env;
++ }
++ env = p+1;
++ }
++ if (*env != '\0') {
++ argv[n++] = env;
++ }
++ }
++ else {
++ argv[n++] = "img2sixel";
++ }
++ argv[n++] = "-l";
++ argv[n++] = do_anim ? "auto" : "disable";
++ argv[n++] = "-w";
++ sprintf(digit[0], "%d", w*pixel_per_char_i);
++ argv[n++] = digit[0];
++ argv[n++] = "-h";
++ sprintf(digit[1], "%d", h*pixel_per_line_i);
++ argv[n++] = digit[1];
++ argv[n++] = "-c";
++ sprintf(clip, "%dx%d+%d+%d", sw*pixel_per_char_i, sh*pixel_per_line_i,
++ sx*pixel_per_char_i, sy*pixel_per_line_i);
++ argv[n++] = clip;
++ argv[n++] = url;
++ if (getenv("TERM") && strcmp(getenv("TERM"), "screen") == 0 &&
++ (!getenv("SCREEN_VARIANT") || strcmp(getenv("SCREEN_VARIANT"), "sixel") != 0)) {
++ argv[n++] = "-P";
++ }
++ argv[n++] = NULL;
++ execvp(argv[0],argv);
++ exit(0);
++ }
++ else if (pid > 0) {
++ int status;
++ waitpid(pid, &status, 0);
++ ttymode_reset(ISIG, 0);
++ mySignal(SIGINT, previntr);
++ mySignal(SIGQUIT, prevquit);
++ mySignal(SIGTSTP, prevstop);
++ if (do_anim) {
++ writestr("\x1b[?80l");
++ }
++ }
++
++ MOVE(Currentbuf->cursorY,Currentbuf->cursorX);
++}
++
++int
++get_pixel_per_cell(int *ppc, int *ppl)
++{
++ fd_set rfd;
++ struct timeval tval;
++ char buf[100];
++ char *p;
++ ssize_t len;
++ ssize_t left;
++ int wp,hp,wc,hc;
++ int i;
++
++#ifdef TIOCGWINSZ
++ struct winsize ws;
++ if (ioctl(tty, TIOCGWINSZ, &ws) == 0 && ws.ws_ypixel > 0 && ws.ws_row > 0 &&
++ ws.ws_xpixel > 0 && ws.ws_col > 0) {
++ *ppc = ws.ws_xpixel / ws.ws_col;
++ *ppl = ws.ws_ypixel / ws.ws_row;
++ return 1;
++ }
++#endif
++
++ fputs("\x1b[14t\x1b[18t",ttyf); flush_tty();
++
++ p = buf;
++ left = sizeof(buf) - 1;
++ for (i = 0; i < 10; i++) {
++ tval.tv_usec = 200000; /* 0.2 sec * 10 */
++ tval.tv_sec = 0;
++ FD_ZERO(&rfd);
++ FD_SET(tty,&rfd);
++ if (select(tty+1,&rfd,NULL,NULL,&tval) <= 0 || ! FD_ISSET(tty,&rfd))
++ continue;
++
++ if ((len = read(tty,p,left)) <= 0)
++ continue;
++ p[len] = '\0';
++
++ if (sscanf(buf,"\x1b[4;%d;%dt\x1b[8;%d;%dt",&hp,&wp,&hc,&wc) == 4) {
++ if (wp > 0 && wc > 0 && hp > 0 && hc > 0) {
++ *ppc = wp / wc;
++ *ppl = hp / hc;
++ return 1;
++ }
++ else {
++ return 0;
++ }
++ }
++ p += len;
++ left -= len;
++ }
++
++ return 0;
++}
++#endif /* USE_IMAGE */
++
+ #ifdef USE_MOUSE
+ #define W3M_TERM_INFO(name, title, mouse) name, title, mouse
+ #define NEED_XTERM_ON (1)
+@@ -634,7 +894,8 @@ reset_tty(void)
+ writestr(T_se); /* reset terminal */
+ flush_tty();
+ TerminalSet(tty, &d_ioval);
+- close_tty();
++ if (tty != 2)
++ close_tty();
+ }
+
+ static MySignalHandler
+@@ -953,7 +1214,6 @@ addch(char pc)
+ {
+ l_prop *pr;
+ int dest, i;
+- short *dirty;
+ #ifdef USE_M17N
+ static Str tmp = NULL;
+ char **p;
+@@ -975,7 +1235,6 @@ addch(char pc)
+ return;
+ p = ScreenImage[CurLine]->lineimage;
+ pr = ScreenImage[CurLine]->lineprop;
+- dirty = &ScreenImage[CurLine]->isdirty;
+
+ #ifndef USE_M17N
+ /* Eliminate unprintables according to * iso-8859-*.
+@@ -1986,6 +2245,10 @@ skip_escseq(void)
+ getch();
+ getch();
+ getch();
++ } else if (is_xterm && c == '<') {
++ c = getch();
++ while (IS_DIGIT(c) || c == ';')
++ c = getch();
+ }
+ else
+ #endif
+@@ -2027,8 +2290,8 @@ sleep_till_anykey(int sec, int purge)
+
+ #ifdef USE_MOUSE
+
+-#define XTERM_ON {fputs("\033[?1001s\033[?1000h",ttyf); flush_tty();}
+-#define XTERM_OFF {fputs("\033[?1000l\033[?1001r",ttyf); flush_tty();}
++#define XTERM_ON {fputs("\033[?1001s\033[?1000h\033[?1006h",ttyf); flush_tty();}
++#define XTERM_OFF {fputs("\033[?1006l\033[?1000l\033[?1001r",ttyf); flush_tty();}
+ #define CYGWIN_ON {fputs("\033[?1000h",ttyf); flush_tty();}
+ #define CYGWIN_OFF {fputs("\033[?1000l",ttyf); flush_tty();}
+
+diff --git a/url.c b/url.c
+index ed6062e..c90cd9f 100644
+--- a/url.c
++++ b/url.c
+@@ -121,6 +121,7 @@ static struct table2 DefaultGuess[] = {
+ };
+
+ static void add_index_file(ParsedURL *pu, URLFile *uf);
++static char * schemeNumToName(int scheme);
+
+ /* #define HTTP_DEFAULT_FILE "/index.html" */
+
+@@ -326,6 +327,7 @@ openSSLHandle(int sock, char *hostname, char **p_cert)
+ SSL_load_error_strings();
+ if (!(ssl_ctx = SSL_CTX_new(SSLv23_client_method())))
+ goto eend;
++ SSL_CTX_set_cipher_list(ssl_ctx, "DEFAULT:!LOW:!RC4:!EXP");
+ option = SSL_OP_ALL;
+ if (ssl_forbid_method) {
+ if (strchr(ssl_forbid_method, '2'))
+@@ -337,7 +339,15 @@ openSSLHandle(int sock, char *hostname, char **p_cert)
+ if (strchr(ssl_forbid_method, 'T'))
+ option |= SSL_OP_NO_TLSv1;
+ }
++#ifdef SSL_OP_NO_COMPRESSION
++ option |= SSL_OP_NO_COMPRESSION;
++#endif
+ SSL_CTX_set_options(ssl_ctx, option);
++
++#ifdef SSL_MODE_RELEASE_BUFFERS
++ SSL_CTX_set_mode (ssl_ctx, SSL_MODE_RELEASE_BUFFERS);
++#endif
++
+ #ifdef USE_SSL_VERIFY
+ /* derived from openssl-0.9.5/apps/s_{client,cb}.c */
+ #if 1 /* use SSL_get_verify_result() to verify cert */
+@@ -444,6 +454,8 @@ baseURL(Buffer *buf)
+ /* <BASE> tag is defined in the document */
+ return buf->baseURL;
+ }
++ else if (IS_EMPTY_PARSED_URL(&buf->currentURL))
++ return NULL;
+ else
+ return &buf->currentURL;
+ }
+@@ -638,16 +650,21 @@ openSocket(char *const hostname,
+ #define COPYPATH_SPC_ALLOW 0
+ #define COPYPATH_SPC_IGNORE 1
+ #define COPYPATH_SPC_REPLACE 2
++#define COPYPATH_SPC_MASK 3
++#define COPYPATH_LOWERCASE 4
+
+ static char *
+ copyPath(char *orgpath, int length, int option)
+ {
+ Str tmp = Strnew();
+- while (*orgpath && length != 0) {
+- if (IS_SPACE(*orgpath)) {
+- switch (option) {
++ char ch;
++ while ((ch = *orgpath) != 0 && length != 0) {
++ if (option & COPYPATH_LOWERCASE)
++ ch = TOLOWER(ch);
++ if (IS_SPACE(ch)) {
++ switch (option & COPYPATH_SPC_MASK) {
+ case COPYPATH_SPC_ALLOW:
+- Strcat_char(tmp, *orgpath);
++ Strcat_char(tmp, ch);
+ break;
+ case COPYPATH_SPC_IGNORE:
+ /* do nothing */
+@@ -658,7 +675,7 @@ copyPath(char *orgpath, int length, int option)
+ }
+ }
+ else
+- Strcat_char(tmp, *orgpath);
++ Strcat_char(tmp, ch);
+ orgpath++;
+ length--;
+ }
+@@ -668,22 +685,14 @@ copyPath(char *orgpath, int length, int option)
+ void
+ parseURL(char *url, ParsedURL *p_url, ParsedURL *current)
+ {
+- char *p, *q;
++ char *p, *q, *qq;
+ Str tmp;
+
+ url = url_quote(url); /* quote 0x01-0x20, 0x7F-0xFF */
+
+ p = url;
++ copyParsedURL(p_url, NULL);
+ p_url->scheme = SCM_MISSING;
+- p_url->port = 0;
+- p_url->user = NULL;
+- p_url->pass = NULL;
+- p_url->host = NULL;
+- p_url->is_nocache = 0;
+- p_url->file = NULL;
+- p_url->real_file = NULL;
+- p_url->query = NULL;
+- p_url->label = NULL;
+
+ /* RFC1808: Relative Uniform Resource Locators
+ * 4. Resolving Relative URLs
+@@ -694,7 +703,7 @@ parseURL(char *url, ParsedURL *p_url, ParsedURL *current)
+ goto do_label;
+ }
+ #if defined( __EMX__ ) || defined( __CYGWIN__ )
+- if (!strncmp(url, "file://localhost/", 17)) {
++ if (!strncasecmp(url, "file://localhost/", 17)) {
+ p_url->scheme = SCM_LOCAL;
+ p += 17 - 1;
+ url += 17 - 1;
+@@ -802,19 +811,20 @@ parseURL(char *url, ParsedURL *p_url, ParsedURL *current)
+ /* scheme://user:pass@host or
+ * scheme://host:port
+ */
+- p_url->host = copyPath(q, p - q, COPYPATH_SPC_IGNORE);
++ qq = q;
+ q = ++p;
+ while (*p && strchr("@/?#", *p) == NULL)
+ p++;
+ if (*p == '@') {
+ /* scheme://user:pass@... */
++ p_url->user = copyPath(qq, q - 1 - qq, COPYPATH_SPC_IGNORE);
+ p_url->pass = copyPath(q, p - q, COPYPATH_SPC_ALLOW);
+- q = ++p;
+- p_url->user = p_url->host;
+- p_url->host = NULL;
++ p++;
+ goto analyze_url;
+ }
+ /* scheme://host:port/ */
++ p_url->host = copyPath(qq, q - 1 - qq,
++ COPYPATH_SPC_IGNORE | COPYPATH_LOWERCASE);
+ tmp = Strnew_charp_n(q, p - q);
+ p_url->port = atoi(tmp->ptr);
+ /* *p is one of ['\0', '/', '?', '#'] */
+@@ -822,14 +832,15 @@ parseURL(char *url, ParsedURL *p_url, ParsedURL *current)
+ case '@':
+ /* scheme://user@... */
+ p_url->user = copyPath(q, p - q, COPYPATH_SPC_IGNORE);
+- q = ++p;
++ p++;
+ goto analyze_url;
+ case '\0':
+ /* scheme://host */
+ case '/':
+ case '?':
+ case '#':
+- p_url->host = copyPath(q, p - q, COPYPATH_SPC_IGNORE);
++ p_url->host = copyPath(q, p - q,
++ COPYPATH_SPC_IGNORE | COPYPATH_LOWERCASE);
+ p_url->port = DefaultPort[p_url->scheme];
+ break;
+ }
+@@ -956,12 +967,16 @@ parseURL(char *url, ParsedURL *p_url, ParsedURL *current)
+ p_url->label = NULL;
+ }
+
+-#define initParsedURL(p) bzero(p,sizeof(ParsedURL))
+ #define ALLOC_STR(s) ((s)==NULL?NULL:allocStr(s,-1))
+
+ void
+-copyParsedURL(ParsedURL *p, ParsedURL *q)
++copyParsedURL(ParsedURL *p, const ParsedURL *q)
+ {
++ if (q == NULL) {
++ memset(p, 0, sizeof(ParsedURL));
++ p->scheme = SCM_UNKNOWN;
++ return;
++ }
+ p->scheme = q->scheme;
+ p->port = q->port;
+ p->is_nocache = q->is_nocache;
+@@ -1280,9 +1295,23 @@ getURLScheme(char **url)
+ }
+
+ static char *
++schemeNumToName(int scheme)
++{
++ int i;
++
++ for (i = 0; schemetable[i].cmdname != NULL; i++) {
++ if (schemetable[i].cmd == scheme)
++ return schemetable[i].cmdname;
++ }
++ return NULL;
++}
++
++static char *
+ otherinfo(ParsedURL *target, ParsedURL *current, char *referer)
+ {
+ Str s = Strnew();
++ const int *no_referer_ptr;
++ int no_referer;
+
+ Strcat_charp(s, "User-Agent: ");
+ if (UserAgent == NULL || *UserAgent == '\0')
+@@ -1306,7 +1335,12 @@ otherinfo(ParsedURL *target, ParsedURL *current, char *referer)
+ Strcat_charp(s, "Pragma: no-cache\r\n");
+ Strcat_charp(s, "Cache-control: no-cache\r\n");
+ }
+- if (!NoSendReferer) {
++ no_referer = NoSendReferer;
++ no_referer_ptr = query_SCONF_NO_REFERER_FROM(current);
++ no_referer = no_referer || (no_referer_ptr && *no_referer_ptr);
++ no_referer_ptr = query_SCONF_NO_REFERER_TO(target);
++ no_referer = no_referer || (no_referer_ptr && *no_referer_ptr);
++ if (!no_referer) {
+ #ifdef USE_SSL
+ if (current && current->scheme == SCM_HTTPS && target->scheme != SCM_HTTPS) {
+ /* Don't send Referer: if https:// -> http:// */
+@@ -1314,6 +1348,7 @@ otherinfo(ParsedURL *target, ParsedURL *current, char *referer)
+ else
+ #endif
+ if (referer == NULL && current && current->scheme != SCM_LOCAL &&
++ current->scheme != SCM_LOCAL_CGI &&
+ (current->scheme != SCM_FTP ||
+ (current->user == NULL && current->pass == NULL))) {
+ char *p = current->label;
+@@ -1384,7 +1419,6 @@ HTTPrequest(ParsedURL *pu, ParsedURL *current, HRequest *hr, TextList *extra)
+ {
+ Str tmp;
+ TextListItem *i;
+- int seen_www_auth = 0;
+ #ifdef USE_COOKIE
+ Str cookie;
+ #endif /* USE_COOKIE */
+@@ -1400,7 +1434,6 @@ HTTPrequest(ParsedURL *pu, ParsedURL *current, HRequest *hr, TextList *extra)
+ for (i = extra->first; i != NULL; i = i->next) {
+ if (strncasecmp(i->ptr, "Authorization:",
+ sizeof("Authorization:") - 1) == 0) {
+- seen_www_auth = 1;
+ #ifdef USE_SSL
+ if (hr->command == HR_COMMAND_CONNECT)
+ continue;
+@@ -1430,20 +1463,20 @@ HTTPrequest(ParsedURL *pu, ParsedURL *current, HRequest *hr, TextList *extra)
+ #endif /* USE_COOKIE */
+ if (hr->command == HR_COMMAND_POST) {
+ if (hr->request->enctype == FORM_ENCTYPE_MULTIPART) {
+- Strcat_charp(tmp, "Content-type: multipart/form-data; boundary=");
++ Strcat_charp(tmp, "Content-Type: multipart/form-data; boundary=");
+ Strcat_charp(tmp, hr->request->boundary);
+ Strcat_charp(tmp, "\r\n");
+ Strcat(tmp,
+- Sprintf("Content-length: %ld\r\n", hr->request->length));
++ Sprintf("Content-Length: %ld\r\n", hr->request->length));
+ Strcat_charp(tmp, "\r\n");
+ }
+ else {
+ if (!override_content_type) {
+ Strcat_charp(tmp,
+- "Content-type: application/x-www-form-urlencoded\r\n");
++ "Content-Type: application/x-www-form-urlencoded\r\n");
+ }
+ Strcat(tmp,
+- Sprintf("Content-length: %ld\r\n", hr->request->length));
++ Sprintf("Content-Length: %ld\r\n", hr->request->length));
+ if (header_string)
+ Strcat(tmp, header_string);
+ Strcat_charp(tmp, "\r\n");
+@@ -1603,7 +1636,7 @@ openURL(char *url, ParsedURL *pu, ParsedURL *current,
+ pu->host != NULL && !check_no_proxy(pu->host)) {
+ hr->flag |= HR_FLAG_PROXY;
+ sock = openSocket(FTP_proxy_parsed.host,
+- schemetable[FTP_proxy_parsed.scheme].cmdname,
++ schemeNumToName(FTP_proxy_parsed.scheme),
+ FTP_proxy_parsed.port);
+ if (sock < 0)
+ return uf;
+@@ -1645,15 +1678,15 @@ openURL(char *url, ParsedURL *pu, ParsedURL *current,
+ }
+ else if (pu->scheme == SCM_HTTPS) {
+ sock = openSocket(HTTPS_proxy_parsed.host,
+- schemetable[HTTPS_proxy_parsed.scheme].
+- cmdname, HTTPS_proxy_parsed.port);
++ schemeNumToName(HTTPS_proxy_parsed.scheme),
++ HTTPS_proxy_parsed.port);
+ sslh = NULL;
+ }
+ else {
+ #endif /* USE_SSL */
+ sock = openSocket(HTTP_proxy_parsed.host,
+- schemetable[HTTP_proxy_parsed.scheme].
+- cmdname, HTTP_proxy_parsed.port);
++ schemeNumToName(HTTP_proxy_parsed.scheme),
++ HTTP_proxy_parsed.port);
+ #ifdef USE_SSL
+ sslh = NULL;
+ }
+@@ -1685,8 +1718,7 @@ openURL(char *url, ParsedURL *pu, ParsedURL *current,
+ }
+ }
+ else {
+- sock = openSocket(pu->host,
+- schemetable[pu->scheme].cmdname, pu->port);
++ sock = openSocket(pu->host, schemeNumToName(pu->scheme), pu->port);
+ if (sock < 0) {
+ *status = HTST_MISSING;
+ return uf;
+@@ -1750,7 +1782,7 @@ openURL(char *url, ParsedURL *pu, ParsedURL *current,
+ pu->host != NULL && !check_no_proxy(pu->host)) {
+ hr->flag |= HR_FLAG_PROXY;
+ sock = openSocket(GOPHER_proxy_parsed.host,
+- schemetable[GOPHER_proxy_parsed.scheme].cmdname,
++ schemeNumToName(GOPHER_proxy_parsed.scheme),
+ GOPHER_proxy_parsed.port);
+ if (sock < 0)
+ return uf;
+@@ -1758,8 +1790,7 @@ openURL(char *url, ParsedURL *pu, ParsedURL *current,
+ tmp = HTTPrequest(pu, current, hr, extra_header);
+ }
+ else {
+- sock = openSocket(pu->host,
+- schemetable[pu->scheme].cmdname, pu->port);
++ sock = openSocket(pu->host, schemeNumToName(pu->scheme), pu->port);
+ if (sock < 0)
+ return uf;
+ if (pu->file == NULL)
+@@ -2049,7 +2080,7 @@ filename_extension(char *path, int is_url)
+ break;
+ }
+ if (*last_dot == '.') {
+- for (i = 1; last_dot[i] && i < 8; i++) {
++ for (i = 1; i < 8 && last_dot[i]; i++) {
+ if (is_url && !IS_ALNUM(last_dot[i]))
+ break;
+ }
+@@ -2234,3 +2265,66 @@ schemeToProxy(int scheme)
+ }
+ return pu;
+ }
++
++#ifdef USE_M17N
++wc_ces
++url_to_charset(const char *url, const ParsedURL *base, wc_ces doc_charset)
++{
++ const ParsedURL *pu;
++ ParsedURL pu_buf;
++ const wc_ces *csptr;
++
++ if (url && *url && *url != '#') {
++ parseURL2((char *)url, &pu_buf, (ParsedURL *)base);
++ pu = &pu_buf;
++ } else {
++ pu = base;
++ }
++ if (pu && (pu->scheme == SCM_LOCAL || pu->scheme == SCM_LOCAL_CGI))
++ return SystemCharset;
++ csptr = query_SCONF_URL_CHARSET(pu);
++ return (csptr && *csptr) ? *csptr :
++ doc_charset ? doc_charset : DocumentCharset;
++}
++
++char *
++url_encode(const char *url, const ParsedURL *base, wc_ces doc_charset)
++{
++ return url_quote_conv((char *)url,
++ url_to_charset(url, base, doc_charset));
++}
++
++#if 0 /* unused */
++char *
++url_decode(const char *url, const ParsedURL *base, wc_ces doc_charset)
++{
++ if (!DecodeURL)
++ return (char *)url;
++ return url_unquote_conv((char *)url,
++ url_to_charset(url, base, doc_charset));
++}
++#endif
++
++char *
++url_decode2(const char *url, const Buffer *buf)
++{
++ wc_ces url_charset;
++
++ if (!DecodeURL)
++ return (char *)url;
++ url_charset = buf ?
++ url_to_charset(url, baseURL((Buffer *)buf), buf->document_charset) :
++ url_to_charset(url, NULL, 0);
++ return url_unquote_conv((char *)url, url_charset);
++}
++
++#else /* !defined(USE_M17N) */
++
++char *
++url_decode0(const char *url)
++{
++ if (!DecodeURL)
++ return (char *)url;
++ return url_unquote_conv((char *)url, 0);
++}
++#endif /* !defined(USE_M17N) */
+diff --git a/version.c.in b/version.c.in
+index 31d30e4..ab25163 100644
+--- a/version.c.in
++++ b/version.c.in
+@@ -1,5 +1,5 @@
+ /* $Id: version.c.in,v 1.49 2012/05/22 09:45:56 inu Exp $ */
+-#define CURRENT_VERSION "w3m/0.5.3+cvs"
++#define CURRENT_VERSION "w3m/0.5.3+gitYYYYMMDD"
+
+ #ifndef FM_H
+ char *w3m_version = CURRENT_VERSION;
+diff --git a/w3m-doc/outline.html.in b/w3m-doc/outline.html.in
+index 60bda47..4ed2a59 100644
+--- a/w3m-doc/outline.html.in
++++ b/w3m-doc/outline.html.in
+@@ -146,8 +146,8 @@ w3m ^[$B$N^[(Bmake^[$B;~$K;XDj$7$?%-!<A`:n$K$h$C$F!"%X%k%W%U%!%$%k$,0[$J$j$^$9!#^[(B
+ <TR> <TD>c</TD> <TD>^[$B8=%Z!<%8$N^[(B URL ^[$B$rI=<(^[(B</TD></TR>
+ <TR> <TD>=</TD> <TD>^[$B8=%I%-%e%a%s%H$N>pJs$rI=<(^[(B</TD></TR>
+ <TR> <TD>F</TD> <TD>^[$B%U%l!<%`$rI=<($9$k^[(B</TD></TR>
+- <TR> <TD>M</TD> <TD>^[$B8=%Z!<%8$r30It%V%i%&%6$GI=<($9$k^[(B(2M,3M ^[$B$G^[(B2^[$BHVL\$H^[(B3^[$BHVL\$N%V%i%&%6$r8F$S$@$9^[(B)</TD></TR>
+- <TR> <TD>ESC M</TD> <TD>^[$B%j%s%/@h$r30It%V%i%&%6$GI=<($9$k^[(B(2ESC M,3ESC M ^[$B$G^[(B2^[$BHVL\$H^[(B3^[$BHVL\$N%V%i%&%6$r8F$S$@$9^[(B)</TD></TR>
++ <TR> <TD>M</TD> <TD>^[$B8=%Z!<%8$r30It%V%i%&%6$GI=<($9$k^[(B(2M, 3M, ..., 9M ^[$B$G^[(B2^[$BHVL\!$^[(B3^[$BHVL\!$^[(B9^[$BHVL\$N%V%i%&%6$r8F$S$@$9^[(B)</TD></TR>
++ <TR> <TD>ESC M</TD> <TD>^[$B%j%s%/@h$r30It%V%i%&%6$GI=<($9$k^[(B(2ESC M, 3ESC M, ..., 9ESC M ^[$B$G^[(B2^[$BHVL\!$^[(B3^[$BHVL\!$^[(B9^[$BHVL\$N%V%i%&%6$r8F$S$@$9^[(B)</TD></TR>
+ </TABLE>
+
+ <H5>^[$B%U%!%$%k^[(B/^[$B%9%H%j!<%`A`:n^[(B</H5>
+@@ -257,8 +257,8 @@ w3m ^[$B$N^[(Bmake^[$B;~$K;XDj$7$?%-!<A`:n$K$h$C$F!"%X%k%W%U%!%$%k$,0[$J$j$^$9!#^[(B
+ <TR><TD>c<TD>^[$B8=:_$NJ8=q$N^[(B URL ^[$B$rI=<($7$^$9!%^[(B
+ <TR><TD>=<TD>^[$B8=:_$NJ8=q$K4X$9$k>pJs$rI=<($7$^$9!%^[(B
+ <TR><TD>F<TD><FRAMESET> ^[$B$r4^$`J8=q$rI=<($7$F$$$k$H$-$K!$^[(B<FRAME> ^[$B%?%0$N;X$9J#?t$NJ8=q$r^[(B1^[$B$D$NJ8=q$KJQ49$7$FI=<($7$^$9!%^[(B
+-<TR><TD>M<TD>^[$B8=:_8+$F$$$k%Z!<%8$r!$30It%V%i%&%6$r;H$C$FI=<($7$^$9!%^[(B 2M, 3M ^[$B$G^[(B2^[$BHVL\$H^[(B3^[$BHVL\$N%V%i%&%6$r;H$$$^$9!%^[(B
+-<TR><TD>ESC M<TD>^[$B8=:_$N%j%s%/@h$r!$30It%V%i%&%6$r;H$C$FI=<($7$^$9!%^[(B 2ESC M, 3ESC M ^[$B$G^[(B2^[$BHVL\$H^[(B3^[$BHVL\$N%V%i%&%6$r;H$$$^$9!%^[(B
++<TR><TD>M<TD>^[$B8=:_8+$F$$$k%Z!<%8$r!$30It%V%i%&%6$r;H$C$FI=<($7$^$9!%^[(B 2M, 3M, ..., 9M ^[$B$G^[(B2^[$BHVL\!$^[(B3^[$BHVL\!$^[(B9^[$BHVL\$N%V%i%&%6$r;H$$$^$9!%^[(B
++<TR><TD>ESC M<TD>^[$B8=:_$N%j%s%/@h$r!$30It%V%i%&%6$r;H$C$FI=<($7$^$9!%^[(B 2ESC M, 3ESC M, ..., 9ESC M ^[$B$G^[(B2^[$BHVL\!$^[(B3^[$BHVL\!$^[(B9^[$BHVL\$N%V%i%&%6$r;H$$$^$9!%^[(B
+ </table>
+
+ <H5>^[$B%U%!%$%k$H^[(B URL ^[$B4X78$NA`:n^[(B</H5>
+diff --git a/w3m-doc/sample/keymap.cgi b/w3m-doc/sample/keymap.cgi
+index f68f5fb..d92c60f 100755
+--- a/w3m-doc/sample/keymap.cgi
++++ b/w3m-doc/sample/keymap.cgi
+@@ -203,7 +203,6 @@ GOTO_LINK
+ HELP
+ HISTORY
+ INFO
+-INIT_MAILCAP
+ INTERRUPT
+ LEFT
+ LINE_BEGIN
+diff --git a/w3mbookmark.c b/w3mbookmark.c
+index 4355536..a306f26 100644
+--- a/w3mbookmark.c
++++ b/w3mbookmark.c
+@@ -79,6 +79,7 @@ print_bookmark_panel(char *bmark, char *url, char *title, char *charset)
+ }
+ }
+ printf("</select>\n");
++ fclose(f);
+ }
+ printf(bkmark_src2, html_quote(url), html_quote(title));
+ }
+@@ -99,7 +100,7 @@ create_new_bookmark(char *bmark, char *section, char *title, char *url,
+ fprintf(f, "<body>\n<h1>Bookmarks</h1>\n");
+ fprintf(f, "<h2>%s</h2>\n<ul>\n", section);
+ fprintf(f, "<li><a href=\"%s\">%s</a>\n", url, title);
+- fprintf(f, end_section);
++ fprintf(f, "%s", end_section);
+ fprintf(f, "</ul>\n</body>\n</html>\n");
+ fclose(f);
+ }
+@@ -168,7 +169,10 @@ insert_bookmark(char *bmark, struct parsed_tagarg *data)
+ /* In this case, a new bookmark is appeneded after the bookmark file */
+ return create_new_bookmark(bmark, section, title, url, "a");
+ }
+- f = fopen(bmark, "w");
++ if ((f = fopen(bmark, "w")) == NULL) {
++ printf("\nCannot open bookmark %s\n", bmark);
++ return FALSE;
++ }
+ while (tl->nitem) {
+ fputs(popText(tl), f);
+ }
+diff --git a/w3mhelp-lynx_en.html.in b/w3mhelp-lynx_en.html.in
+index 7448877..d073b0f 100644
+--- a/w3mhelp-lynx_en.html.in
++++ b/w3mhelp-lynx_en.html.in
+@@ -43,20 +43,20 @@ w3m</A>
+ <table cellpadding=0>
+ <TR><TD WIDTH=100>RET, C-f, Right arrow<TD>Follow hyperlink
+ <TR><TD>d, ESC RET<TD>Save link to file
+-<TR><TD>u<TD>Peek link URL
+-<TR><TD>i<TD>Peek image URL
++<TR><TD>u<TD>Peek at link URL
++<TR><TD>i<TD>Peek at image URL
+ <TR><TD>I<TD>View inline image
+ <TR><TD>ESC I<TD>Save inline image to file
+-<TR><TD>:<TD>Mark URL-like strings as anchors
+-<TR><TD>ESC :<TD>Mark Message-ID-like strings as news anchors
+-<TR><TD>c<TD>Peek current URL
++<TR><TD>:<TD>Mark URL-like strings as links
++<TR><TD>ESC :<TD>Mark Message-ID-like strings as links
++<TR><TD>c<TD>Peek at current URL
+ <TR><TD>=<TD>Display information about current document
+-<TR><TD>C-h<TD>View history of URL
+-<TR><TD>F<TD>Render frame
++<TR><TD>C-h<TD>View browser history
++<TR><TD>F<TD>Render frames
+ <TR><TD>M<TD>Browse current document using external browser
+-(use 2M and 3M to invoke second and third browser)
++(prefix 2, 3, ..., or 9 to invoke alternate configured browsers, e.g. 3 M)
+ <TR><TD>ESC M<TD>Browse link using external browser
+-(use 2ESC M and 3ESC M to invoke second and third browser)
++(prefixed as above, e.g. 3ESC M)
+ </table>
+
+ <H2>File/Stream operation</H2>
+@@ -98,7 +98,7 @@ w3m</A>
+ <table cellpadding=0>
+ <TR><TD WIDTH=100>/, C-s<TD>Search forward
+ <TR><TD>n<TD>Search next
+-<TR><TD>w<TD>Toggle wrap search mode
++<TR><TD>w<TD>Toggle search wrap mode
+ </table>
+
+ <H2>Mark operation</H2>
+@@ -121,7 +121,7 @@ w3m</A>
+ <TR><TD>Q<TD>Quit without confirmation
+ </table>
+
+-<H2>Line-edit mode</H2>
++<H2>Line-editing mode</H2>
+ <table cellpadding=0>
+ <TR><TD WIDTH=100>C-f<TD>Move cursor forward
+ <TR><TD>C-b<TD>Move cursor backward
+diff --git a/w3mhelp-lynx_ja.html.in b/w3mhelp-lynx_ja.html.in
+index d160984..828b5a3 100644
+--- a/w3mhelp-lynx_ja.html.in
++++ b/w3mhelp-lynx_ja.html.in
+@@ -58,9 +58,9 @@
+ <TR><TD>F<TD><FRAMESET>¤ò´Þ¤àʸ½ñ¤òɽ¼¨¤·¤Æ¤¤¤ë¤È¤¤Ë¡¤<FRAME>
+ ¥¿¥°¤Î»Ø¤¹Ê£¿ô¤Îʸ½ñ¤ò1¤Ä¤Îʸ½ñ¤ËÊÑ´¹¤·¤Æɽ¼¨¤·¤Þ¤¹¡¥
+ <TR><TD>M<TD>¸½ºß¸«¤Æ¤¤¤ë¥Ú¡¼¥¸¤ò¡¤³°Éô¥Ö¥é¥¦¥¶¤ò»È¤Ã¤Æɽ¼¨¤·¤Þ¤¹¡¥
+-2M, 3M ¤Ç2ÈÖÌܤÈ3ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
++2M, 3M, ..., 9M ¤Ç2ÈÖÌÜ¡¤3ÈÖÌÜ¡¤9ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
+ <TR><TD>ESC M<TD>¸½ºß¤Î¥ê¥ó¥¯Àè¤ò¡¤³°Éô¥Ö¥é¥¦¥¶¤ò»È¤Ã¤Æɽ¼¨¤·¤Þ¤¹¡¥
+-2ESC M, 3ESC M ¤Ç2ÈÖÌܤÈ3ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
++2ESC M, 3ESC M, ..., 9ESC M ¤Ç2ÈÖÌÜ¡¤3ÈÖÌÜ¡¤9ÈÖÌܤΥ֥饦¥¶¤ò»È¤¤¤Þ¤¹¡¥
+ </table>
+
+ <H3>¥Õ¥¡¥¤¥ë¤ÈURL´Ø·¸¤ÎÁàºî</H3>
+diff --git a/w3mhelp-w3m_en.html.in b/w3mhelp-w3m_en.html.in
+index eb46e8a..a692142 100644
+--- a/w3mhelp-w3m_en.html.in
++++ b/w3mhelp-w3m_en.html.in
+@@ -47,21 +47,21 @@ w3m</A>
+ <table cellpadding=0>
+ <TR><TD WIDTH=100>RET<TD>Follow hyperlink
+ <TR><TD>a, ESC RET<TD>Save link to file
+-<TR><TD>u<TD>Peek link URL
+-<TR><TD>i<TD>Peek image URL
++<TR><TD>u<TD>Peek at link URL
++<TR><TD>i<TD>Peek at image URL
+ <TR><TD>I<TD>View inline image
+ <TR><TD>ESC I<TD>Save inline image to file
+-<TR><TD>:<TD>Mark URL-like strings as anchors
+-<TR><TD>ESC :<TD>Mark Message-ID-like strings as news anchors
+-<TR><TD>c<TD>Peek current URL
++<TR><TD>:<TD>Mark URL-like strings as links
++<TR><TD>ESC :<TD>Mark Message-ID-like strings as links
++<TR><TD>c<TD>Peek at current URL
+ <TR><TD>=<TD>Display information about current document
+ <TR><TD>C-g<TD>Show current line number
+-<TR><TD>C-h<TD>View history of URL
+-<TR><TD>F<TD>Render frame
++<TR><TD>C-h<TD>View browser history
++<TR><TD>F<TD>Render frames
+ <TR><TD>M<TD>Browse current document using external browser
+-(use 2M and 3M to invoke second and third browser)
++(prefix 2, 3, ..., or 9 to invoke alternate configured browsers, e.g. 3 M)
+ <TR><TD>ESC M<TD>Browse link using external browser
+-(use 2ESC M and 3ESC M to invoke second and third browser)
++(prefixed as above, e.g. 3ESC M)
+ </table>
+
+ <H2>File/Stream operation</H2>
+@@ -105,7 +105,7 @@ w3m</A>
+ <TR><TD>?,C-r<TD>Search backward
+ <TR><TD>n<TD>Search next
+ <TR><TD>N<TD>Search previous
+-<TR><TD>C-w<TD>Toggle wrap search mode
++<TR><TD>C-w<TD>Toggle search wrap mode
+ </table>
+
+ <H2>Dictionary look-up</H2>
+@@ -134,7 +134,7 @@ w3m</A>
+ <TR><TD>Q<TD>Quit without confirmation
+ </table>
+
+-<H2>Line-edit mode</H2>
++<H2>Line-editing mode</H2>
+ <table cellpadding=0>
+ <TR><TD WIDTH=100>C-f<TD>Move cursor forward
+ <TR><TD>C-b<TD>Move cursor backward
+diff --git a/w3mhelp-w3m_ja.html.in b/w3mhelp-w3m_ja.html.in
+index 95464ab..72cb849 100644
+--- a/w3mhelp-w3m_ja.html.in
++++ b/w3mhelp-w3m_ja.html.in
+@@ -61,8 +61,8 @@
+ <TR> <TD>C-g</TD> <TD>¥Ú¡¼¥¸Ãæ¤Ç¤Î¸½ºß°ÌÃÖ¤òɽ¼¨</TD></TR>
+ <TR> <TD>C-h</TD> <TD>URLÍúÎò¤òɽ¼¨</TD></TR>
+ <TR> <TD>F</TD> <TD>¥Õ¥ì¡¼¥à¤òɽ¼¨¤¹¤ë</TD></TR>
+- <TR> <TD>M</TD> <TD>¸½¥Ú¡¼¥¸¤ò³°Éô¥Ö¥é¥¦¥¶¤Çɽ¼¨¤¹¤ë(2M,3M¤Ç2ÈÖÌܤÈ3ÈÖÌܤΥ֥饦¥¶¤ò¸Æ¤Ó¤À¤¹)</TD></TR>
+- <TR> <TD>ESC M</TD> <TD>¥ê¥ó¥¯Àè¤ò³°Éô¥Ö¥é¥¦¥¶¤Çɽ¼¨¤¹¤ë(2ESC M,3ESC M¤Ç2ÈÖÌܤÈ3ÈÖÌܤΥ֥饦¥¶¤ò¸Æ¤Ó¤À¤¹)</TD></TR>
++ <TR> <TD>M</TD> <TD>¸½¥Ú¡¼¥¸¤ò³°Éô¥Ö¥é¥¦¥¶¤Çɽ¼¨¤¹¤ë(2M, 3M, ..., 9M ¤Ç2ÈÖÌÜ¡¤3ÈÖÌÜ¡¤9ÈÖÌܤΥ֥饦¥¶¤ò¸Æ¤Ó¤À¤¹)</TD></TR>
++ <TR> <TD>ESC M</TD> <TD>¥ê¥ó¥¯Àè¤ò³°Éô¥Ö¥é¥¦¥¶¤Çɽ¼¨¤¹¤ë(2ESC M, 3ESC M, ..., 9ESC M ¤Ç2ÈÖÌÜ¡¤3ÈÖÌÜ¡¤9ÈÖÌܤΥ֥饦¥¶¤ò¸Æ¤Ó¤À¤¹)</TD></TR>
+ </TABLE>
+
+ <H2>¥Õ¥¡¥¤¥ë/¥¹¥È¥ê¡¼¥àÁàºî</H2>
+diff --git a/w3mhelperpanel.c b/w3mhelperpanel.c
+index 110794b..96b60a0 100644
+--- a/w3mhelperpanel.c
++++ b/w3mhelperpanel.c
+@@ -115,6 +115,7 @@ printMailcapPanel(char *mailcap)
+ printf("</table>\n<input type=submit name=submit value=\"%s\">\n</form>\n\
+ </body>\n</html>\n",
+ MSG_DOIT);
++ fclose(f);
+ }
+
+ void
+diff --git a/w3mimg/Makefile.in b/w3mimg/Makefile.in
+index dfc550c..8e2ad73 100644
+--- a/w3mimg/Makefile.in
++++ b/w3mimg/Makefile.in
+@@ -16,9 +16,9 @@ IMGCFLAGS=@IMGX11CFLAGS@ @IMGFBCFLAGS@ @IMGWINCFLAGS@
+ IMGOBJS=@IMGOBJS@
+
+ .PHONY: $(SUBDIRS)
+-all: @IMGTARGETS@ w3mimg.a
++all: w3mimg.a
+
+-w3mimg.a: $(IMGOBJS)
++w3mimg.a: w3mimg.o @IMGTARGETS@
+ $(AR) rv $@ $(IMGOBJS)
+ $(RANLIB) $@
+
+diff --git a/w3mimg/fb/fb.c b/w3mimg/fb/fb.c
+index cd11128..7960584 100644
+--- a/w3mimg/fb/fb.c
++++ b/w3mimg/fb/fb.c
+@@ -12,12 +12,24 @@
+ #include <errno.h>
+ #include <sys/ioctl.h>
+ #include <sys/mman.h>
++#if defined(__linux__)
+ #include <linux/fb.h>
++#elif defined(__FreeBSD__)
++#include <sys/fbio.h>
++#endif
++#if defined(__FreeBSD__)
++#include <sys/types.h>
++#include <machine/param.h>
++#endif
+
+ #include "fb.h"
+
+ #define FB_ENV "FRAMEBUFFER"
++#if defined(__linux__)
+ #define FB_DEFDEV "/dev/fb0"
++#elif defined(__FreeBSD__)
++#define FB_DEFDEV "/dev/ttyv0"
++#endif
+
+ #define MONO_OFFSET_8BIT 0x40
+ #define COLORS_MONO_8BIT 0x40
+@@ -38,22 +50,65 @@
+
+ #define IMAGE_SIZE_MAX 10000
+
++#if defined(__linux__)
+ static struct fb_cmap *fb_cmap_create(struct fb_fix_screeninfo *,
+ struct fb_var_screeninfo *);
++#elif defined(__FreeBSD__)
++static video_color_palette_t *fb_cmap_create(video_info_t *video_info,
++ video_adapter_info_t *video_adapter_info);
++#endif
++#if defined(__linux__)
+ static void fb_cmap_destroy(struct fb_cmap *cmap);
++#elif defined(__FreeBSD__)
++static void fb_cmap_destroy(video_color_palette_t *cmap);
++#endif
++#if defined(__linux__)
+ static int fb_fscrn_get(int fbfp, struct fb_fix_screeninfo *scinfo);
++#endif
++#if defined(__linux__)
+ static void *fb_mmap(int fbfp, struct fb_fix_screeninfo *scinfo);
++#elif defined(__FreeBSD__)
++static void *fb_mmap(int fbfp, video_adapter_info_t *video_adapter_info);
++#endif
++#if defined(__linux__)
+ static int fb_munmap(void *buf, struct fb_fix_screeninfo *scinfo);
++#elif defined(__FreeBSD__)
++static int fb_munmap(void *buf, video_adapter_info_t *video_adapter_info);
++#endif
++#if defined(__linux__)
+ static int fb_vscrn_get(int fbfp, struct fb_var_screeninfo *scinfo);
++#endif
++#if defined(__linux__)
+ static int fb_cmap_set(int fbfp, struct fb_cmap *cmap);
++#elif defined(__FreeBSD__)
++static int fb_cmap_set(int fbfp, video_color_palette_t *cmap);
++#endif
++#if defined(__linux__)
+ static int fb_cmap_get(int fbfp, struct fb_cmap *cmap);
++#elif defined(__FreeBSD__)
++static int fb_cmap_get(int fbfp, video_color_palette_t *cmap);
++#endif
+ static int fb_cmap_init(void);
+ static int fb_get_cmap_index(int r, int g, int b);
+ static unsigned long fb_get_packed_color(int r, int g, int b);
++#if defined(__FreeBSD__)
++static int fb_video_mode_get(int fbfp, int *video_mode);
++static int fb_video_info_get(int fbfp, video_info_t *video_info);
++static int fb_video_adapter_info_get(int fbfp, video_adapter_info_t *video_adapter_info);
++#endif
+
++#if defined(__linux__)
+ static struct fb_fix_screeninfo fscinfo;
+ static struct fb_var_screeninfo vscinfo;
++#elif defined(__FreeBSD__)
++static video_info_t video_info;
++static video_adapter_info_t video_adapter_info;
++#endif
++#if defined(__linux__)
+ static struct fb_cmap *cmap = NULL, *cmap_org = NULL;
++#elif defined(__FreeBSD__)
++static video_color_palette_t *cmap = NULL, *cmap_org = NULL;
++#endif
+ static int is_open = FALSE;
+ static int fbfp = -1;
+ static size_t pixel_size = 0;
+@@ -63,6 +118,9 @@ int
+ fb_open(void)
+ {
+ char *fbdev = { FB_DEFDEV };
++#if defined(__FreeBSD__)
++ int video_mode;
++#endif
+
+ if (is_open == TRUE)
+ return 1;
+@@ -76,6 +134,7 @@ fb_open(void)
+ goto ERR_END;
+ }
+
++#if defined(__linux__)
+ if (fb_fscrn_get(fbfp, &fscinfo)) {
+ goto ERR_END;
+ }
+@@ -83,22 +142,69 @@ fb_open(void)
+ if (fb_vscrn_get(fbfp, &vscinfo)) {
+ goto ERR_END;
+ }
++#elif defined(__FreeBSD__)
++ if (fb_video_mode_get(fbfp, &video_mode)) {
++ goto ERR_END;
++ }
++ video_info.vi_mode = video_mode;
++
++ if (fb_video_info_get(fbfp, &video_info)) {
++ goto ERR_END;
++ }
+
++ if (fb_video_adapter_info_get(fbfp, &video_adapter_info)) {
++ goto ERR_END;
++ }
++ if (!(video_info.vi_flags & V_INFO_GRAPHICS) ||
++ !(video_info.vi_flags & V_INFO_LINEAR)) {
++ goto ERR_END;
++ }
++#endif
++
++#if defined(__linux__)
+ if ((cmap = fb_cmap_create(&fscinfo, &vscinfo)) == (struct fb_cmap *)-1) {
+ goto ERR_END;
+ }
++#elif defined(__FreeBSD__)
++ if ((cmap = fb_cmap_create(&video_info, &video_adapter_info)) == (video_color_palette_t *)-1) {
++ goto ERR_END;
++ }
++#endif
+
++#if defined(__linux__)
+ if (!(buf = fb_mmap(fbfp, &fscinfo))) {
+ fprintf(stderr, "Can't allocate memory.\n");
+ goto ERR_END;
+ }
++#elif defined(__FreeBSD__)
++ if (!(buf = fb_mmap(fbfp, &video_adapter_info))) {
++ fprintf(stderr, "Can't allocate memory.\n");
++ goto ERR_END;
++ }
++#endif
+
++#if defined(__linux__)
+ if (fscinfo.type != FB_TYPE_PACKED_PIXELS) {
+ fprintf(stderr, "This type of framebuffer is not supported.\n");
+ goto ERR_END;
+ }
++#elif defined(__FreeBSD__)
++ if (!(video_info.vi_mem_model == V_INFO_MM_PACKED ||
++ video_info.vi_mem_model == V_INFO_MM_DIRECT)) {
++ fprintf(stderr, "This type of framebuffer is not supported.\n");
++ goto ERR_END;
++ }
++#endif
+
++#if defined(__linux__)
+ if (fscinfo.visual == FB_VISUAL_PSEUDOCOLOR && vscinfo.bits_per_pixel == 8) {
++#elif defined(__FreeBSD__)
++ if (video_adapter_info.va_flags & V_ADP_PALETTE &&
++ video_info.vi_mem_model == V_INFO_MM_PACKED &&
++ video_info.vi_depth == 8) {
++#else
++ if (0) {
++#endif
+ if (fb_cmap_get(fbfp, cmap)) {
+ fprintf(stderr, "Can't get color map.\n");
+ fb_cmap_destroy(cmap);
+@@ -111,6 +217,7 @@ fb_open(void)
+
+ pixel_size = 1;
+ }
++#if defined(__linux__)
+ else if ((fscinfo.visual == FB_VISUAL_TRUECOLOR ||
+ fscinfo.visual == FB_VISUAL_DIRECTCOLOR) &&
+ (vscinfo.bits_per_pixel == 15 ||
+@@ -118,6 +225,14 @@ fb_open(void)
+ vscinfo.bits_per_pixel == 24 || vscinfo.bits_per_pixel == 32)) {
+ pixel_size = (vscinfo.bits_per_pixel + 7) / CHAR_BIT;
+ }
++#elif defined(__FreeBSD__)
++ else if (video_info.vi_mem_model == V_INFO_MM_DIRECT &&
++ (video_info.vi_depth == 15 ||
++ video_info.vi_depth == 16 ||
++ video_info.vi_depth == 24 || video_info.vi_depth == 32)) {
++ pixel_size = (video_info.vi_depth + 7) / CHAR_BIT;
++ }
++#endif
+ else {
+ fprintf(stderr, "This type of framebuffer is not supported.\n");
+ goto ERR_END;
+@@ -147,7 +262,11 @@ fb_close(void)
+ cmap = NULL;
+ }
+ if (buf != NULL) {
++#if defined(__linux__)
+ fb_munmap(buf, &fscinfo);
++#elif defined(__FreeBSD__)
++ fb_munmap(buf, &video_adapter_info);
++#endif
+ buf = NULL;
+ }
+
+@@ -259,11 +378,19 @@ fb_image_draw(FB_IMAGE * image, int x, int y, int sx, int sy, int width,
+ if (y + height > fb_height())
+ height = fb_height() - y;
+
++#if defined(__linux__)
+ offset_fb = fscinfo.line_length * y + pixel_size * x;
++#elif defined(__FreeBSD__)
++ offset_fb = video_adapter_info.va_line_width * y + pixel_size * x;
++#endif
+ offset_img = image->rowstride * sy + pixel_size * sx;
+ for (i = 0; i < height; i++) {
+ memcpy(buf + offset_fb, image->data + offset_img, pixel_size * width);
++#if defined(__linux__)
+ offset_fb += fscinfo.line_length;
++#elif defined(__FreeBSD__)
++ offset_fb += video_adapter_info.va_line_width;
++#endif
+ offset_img += image->rowstride;
+ }
+
+@@ -336,7 +463,11 @@ fb_width(void)
+ if (is_open != TRUE)
+ return 0;
+
++#if defined(__linux__)
+ return vscinfo.xres;
++#elif defined(__FreeBSD__)
++ return video_info.vi_width;
++#endif
+ }
+
+ int
+@@ -345,7 +476,11 @@ fb_height(void)
+ if (is_open != TRUE)
+ return 0;
+
++#if defined(__linux__)
+ return vscinfo.yres;
++#elif defined(__FreeBSD__)
++ return video_info.vi_height;
++#endif
+ }
+
+ int
+@@ -369,7 +504,11 @@ fb_clear(int x, int y, int w, int h, int r, int g, int b)
+ h = fb_height() - y;
+
+ if (tmp == NULL) {
++#if defined(__linux__)
+ tmp = malloc(fscinfo.line_length);
++#elif defined(__FreeBSD__)
++ tmp = malloc(video_adapter_info.va_line_width);
++#endif
+ if (tmp == NULL)
+ return 1;
+ }
+@@ -384,10 +523,18 @@ fb_clear(int x, int y, int w, int h, int r, int g, int b)
+ gg = g;
+ bb = b;
+ }
++#if defined(__linux__)
+ offset_fb = fscinfo.line_length * y + pixel_size * x;
++#elif defined(__FreeBSD__)
++ offset_fb = video_adapter_info.va_line_width * y + pixel_size * x;
++#endif
+ for (i = 0; i < h; i++) {
+ memcpy(buf + offset_fb, tmp, pixel_size * w);
++#if defined(__linux__)
+ offset_fb += fscinfo.line_length;
++#elif defined(__FreeBSD__)
++ offset_fb += video_adapter_info.va_line_width;
++#endif
+ }
+ return 0;
+ }
+@@ -400,11 +547,21 @@ fb_get_packed_color(int r, int g, int b)
+ return fb_get_cmap_index(r, g, b);
+ }
+ else {
++#if defined(__linux__)
+ return
+ ((r >> (CHAR_BIT - vscinfo.red.length)) << vscinfo.red.offset) +
+ ((g >> (CHAR_BIT - vscinfo.green.length)) << vscinfo.green.
+ offset) +
+ ((b >> (CHAR_BIT - vscinfo.blue.length)) << vscinfo.blue.offset);
++#elif defined(__FreeBSD__)
++ return
++ ((r >> (CHAR_BIT - video_info.vi_pixel_fsizes[0])) <<
++ video_info.vi_pixel_fields[0]) +
++ ((g >> (CHAR_BIT - video_info.vi_pixel_fsizes[1])) <<
++ video_info.vi_pixel_fields[1]) +
++ ((b >> (CHAR_BIT - video_info.vi_pixel_fsizes[2])) <<
++ video_info.vi_pixel_fields[2]);
++#endif
+ }
+ }
+
+@@ -433,16 +590,31 @@ fb_cmap_init(void)
+ if (cmap == NULL)
+ return 1;
+
++#if defined(__linux__)
+ if (cmap->len < COLOR_OFFSET_8BIT + COLORS_8BIT) {
+ fprintf(stderr, "Can't allocate enough color.\n");
+ return 1;
+ }
++#elif defined(__FreeBSD__)
++ if (cmap->count < COLOR_OFFSET_8BIT + COLORS_8BIT) {
++ fprintf(stderr, "Can't allocate enough color.\n");
++ return 1;
++ }
++#endif
+
+ if (cmap_org == NULL) {
++#if defined(__linux__)
+ if ((cmap_org =
+ fb_cmap_create(&fscinfo, &vscinfo)) == (struct fb_cmap *)-1) {
+ return 1;
+ }
++#elif defined(__FreeBSD__)
++ if ((cmap_org =
++ fb_cmap_create(&video_info, &video_adapter_info)) ==
++ (video_color_palette_t *)-1) {
++ return 1;
++ }
++#endif
+
+ if (fb_cmap_get(fbfp, cmap_org)) {
+ fprintf(stderr, "Can't get color map.\n");
+@@ -452,8 +624,13 @@ fb_cmap_init(void)
+ }
+ }
+
++#if defined(__linux__)
+ cmap->start = MONO_OFFSET_8BIT;
+ cmap->len = COLORS_8BIT + COLORS_MONO_8BIT;
++#elif defined(__FreeBSD__)
++ cmap->index = MONO_OFFSET_8BIT;
++ cmap->count = COLORS_8BIT + COLORS_MONO_8BIT;
++#endif
+
+ for (lp = 0; lp < COLORS_MONO_8BIT; lp++) {
+ int c;
+@@ -506,73 +683,223 @@ fb_cmap_init(void)
+
+ #define LUT_MAX (256)
+
++#if defined(__linux__)
+ static struct fb_cmap *
+ fb_cmap_create(struct fb_fix_screeninfo *fscinfo,
+ struct fb_var_screeninfo *vscinfo)
++#elif defined(__FreeBSD__)
++static video_color_palette_t *
++fb_cmap_create(video_info_t *video_info,
++ video_adapter_info_t *video_adapter_info)
++#endif
+ {
++#if defined(__linux__)
+ struct fb_cmap *cmap;
++#elif defined(__FreeBSD__)
++ video_color_palette_t *cmap;
++#endif
+ int cmaplen = LUT_MAX;
+
+ /* check the existence of colormap */
++#if defined(__linux__)
+ if (fscinfo->visual == FB_VISUAL_MONO01 ||
+ fscinfo->visual == FB_VISUAL_MONO10 ||
+ fscinfo->visual == FB_VISUAL_TRUECOLOR)
+ return NULL;
++#elif defined(__FreeBSD__)
++ if (!(video_adapter_info->va_flags & V_ADP_PALETTE))
++ return NULL;
++#endif
+
++#if defined(__linux__)
+ cmap = (struct fb_cmap *)malloc(sizeof(struct fb_cmap));
++#elif defined(__FreeBSD__)
++ cmap = (video_color_palette_t *)malloc(sizeof(video_color_palette_t));
++#endif
+ if (!cmap) {
+ perror("cmap malloc error\n");
++#if defined(__linux__)
+ return (struct fb_cmap *)-1;
++#elif defined(__FreeBSD__)
++ return (video_color_palette_t *)-1;
++#endif
+ }
++#if defined(__linux__)
+ memset(cmap, 0, sizeof(struct fb_cmap));
++#elif defined(__FreeBSD__)
++ memset(cmap, 0, sizeof(video_color_palette_t));
++#endif
++
++#if defined(__FreeBSD__)
++ if (video_info->vi_mem_model == V_INFO_MM_PACKED) {
++ cmap->red = (u_char *) malloc(sizeof(u_char) * cmaplen);
++ if (!cmap->red) {
++ perror("red lut malloc error\n");
++ return (video_color_palette_t *)-1;
++ }
++ cmap->green = (u_char *) malloc(sizeof(u_char) * cmaplen);
++ if (!cmap->green) {
++ perror("green lut malloc error\n");
++ free(cmap->red);
++ return (video_color_palette_t *)-1;
++ }
++ cmap->blue = (u_char *) malloc(sizeof(u_char) * cmaplen);
++ if (!cmap->blue) {
++ perror("blue lut malloc error\n");
++ free(cmap->red);
++ free(cmap->green);
++ return (video_color_palette_t *)-1;
++ }
++ cmap->transparent = (u_char *) malloc(sizeof(u_char) * cmaplen);
++ if (!cmap->transparent) {
++ perror("transparent lut malloc error\n");
++ free(cmap->red);
++ free(cmap->green);
++ free(cmap->blue);
++ return (video_color_palette_t *)-1;
++ }
++ cmap->count = cmaplen;
++ return cmap;
++ }
++#endif
+
+ /* Allocates memory for a colormap */
++#if defined(__linux__)
+ if (vscinfo->red.length) {
+ cmap->red = (__u16 *) malloc(sizeof(__u16) * cmaplen);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[0]) {
++ cmap->red = (u_char *) malloc(sizeof(u_char) * cmaplen);
++#else
++ if (0) {
++#endif
+ if (!cmap->red) {
+ perror("red lut malloc error\n");
++#if defined(__linux__)
+ return (struct fb_cmap *)-1;
++#elif defined(__FreeBSD__)
++ return (video_color_palette_t *)-1;
++#endif
+ }
+ }
++#if defined(__linux__)
+ if (vscinfo->green.length) {
+ cmap->green = (__u16 *) malloc(sizeof(__u16) * cmaplen);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[1]) {
++ cmap->green = (u_char *) malloc(sizeof(u_char) * cmaplen);
++#else
++ if (0) {
++#endif
+ if (!cmap->green) {
++#if defined(__linux__)
+ if (vscinfo->red.length)
+ free(cmap->red);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[0])
++ free(cmap->red);
++#endif
+ perror("green lut malloc error\n");
++#if defined(__linux__)
+ return (struct fb_cmap *)-1;
++#elif defined(__FreeBSD__)
++ return (video_color_palette_t *)-1;
++#endif
+ }
+ }
++#if defined(__linux__)
+ if (vscinfo->blue.length) {
+ cmap->blue = (__u16 *) malloc(sizeof(__u16) * cmaplen);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[2]) {
++ cmap->blue = (u_char *) malloc(sizeof(u_char) * cmaplen);
++#else
++ if (0) {
++#endif
+ if (!cmap->blue) {
++#if defined(__linux__)
+ if (vscinfo->red.length)
+ free(cmap->red);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[0])
++ free(cmap->red);
++#endif
++#if defined(__linux__)
+ if (vscinfo->green.length)
+ free(cmap->green);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[1])
++ free(cmap->green);
++#endif
+ perror("blue lut malloc error\n");
++#if defined(__linux__)
+ return (struct fb_cmap *)-1;
++#elif defined(__FreeBSD__)
++ return (video_color_palette_t *)-1;
++#endif
+ }
+ }
++#if defined(__linux__)
+ if (vscinfo->transp.length) {
+ cmap->transp = (__u16 *) malloc(sizeof(__u16) * cmaplen);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[3]) {
++ cmap->transparent = (u_char *) malloc(sizeof(u_char) * cmaplen);
++#else
++ if (0) {
++#endif
++#if defined(__linux__)
+ if (!cmap->transp) {
++#elif defined(__FreeBSD__)
++ if (!cmap->transparent) {
++#else
++ if (0) {
++#endif
++#if defined(__linux__)
+ if (vscinfo->red.length)
+ free(cmap->red);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[0])
++ free(cmap->red);
++#endif
++#if defined(__linux__)
+ if (vscinfo->green.length)
+ free(cmap->green);
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[1])
++ free(cmap->green);
++#endif
++#if defined(__linux__)
+ if (vscinfo->blue.length)
+ free(cmap->blue);
+ perror("transp lut malloc error\n");
++#elif defined(__FreeBSD__)
++ if (video_info->vi_pixel_fsizes[2])
++ free(cmap->blue);
++ perror("transparent lut malloc error\n");
++#endif
++#if defined(__linux__)
+ return (struct fb_cmap *)-1;
++#elif defined(__FreeBSD__)
++ return (video_color_palette_t *)-1;
++#endif
+ }
+ }
++#if defined(__linux__)
+ cmap->len = cmaplen;
++#elif defined(__FreeBSD__)
++ cmap->count = cmaplen;
++#endif
+ return cmap;
+ }
+
++#if defined(__linux__)
+ static void
+ fb_cmap_destroy(struct fb_cmap *cmap)
++#elif defined(__FreeBSD__)
++static void
++fb_cmap_destroy(video_color_palette_t *cmap)
++#endif
+ {
+ if (cmap->red)
+ free(cmap->red);
+@@ -580,28 +907,57 @@ fb_cmap_destroy(struct fb_cmap *cmap)
+ free(cmap->green);
+ if (cmap->blue)
+ free(cmap->blue);
++#if defined(__linux__)
+ if (cmap->transp)
+ free(cmap->transp);
++#elif defined(__FreeBSD__)
++ if (cmap->transparent)
++ free(cmap->transparent);
++#endif
+ free(cmap);
+ }
+
++#if defined(__linux__)
+ static int
+ fb_cmap_get(int fbfp, struct fb_cmap *cmap)
++#elif defined(__FreeBSD__)
++static int
++fb_cmap_get(int fbfp, video_color_palette_t *cmap)
++#endif
+ {
++#if defined(__linux__)
+ if (ioctl(fbfp, FBIOGETCMAP, cmap)) {
+ perror("ioctl FBIOGETCMAP error\n");
+ return -1;
+ }
++#elif defined(__FreeBSD__)
++ if (ioctl(fbfp, FBIO_GETPALETTE, cmap) == -1) {
++ perror("ioctl FBIO_GETPALETTE error\n");
++ return -1;
++ }
++#endif
+ return 0;
+ }
+
++#if defined(__linux__)
+ static int
+ fb_cmap_set(int fbfp, struct fb_cmap *cmap)
++#elif defined(__FreeBSD__)
++static int
++fb_cmap_set(int fbfp, video_color_palette_t *cmap)
++#endif
+ {
++#if defined(__linux__)
+ if (ioctl(fbfp, FBIOPUTCMAP, cmap)) {
+ perror("ioctl FBIOPUTCMAP error\n");
+ return -1;
+ }
++#elif defined(__FreeBSD__)
++ if (ioctl(fbfp, FBIO_SETPALETTE, cmap) == -1) {
++ perror("ioctl FBIO_SETPALETTE error\n");
++ return -1;
++ }
++#endif
+ return 0;
+ }
+
+@@ -612,10 +968,16 @@ fb_cmap_set(int fbfp, struct fb_cmap *cmap)
+ * fb_munmap() deletes the mappings
+ */
+
++#if defined(__linux__)
+ static void *
+ fb_mmap(int fbfp, struct fb_fix_screeninfo *scinfo)
++#elif defined(__FreeBSD__)
++static void *
++fb_mmap(int fbfp, video_adapter_info_t *video_adapter_info)
++#endif
+ {
+ void *buf;
++#if defined(__linux__)
+ if ((buf = (unsigned char *)
+ mmap(NULL, scinfo->smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fbfp,
+ (off_t) 0))
+@@ -623,13 +985,41 @@ fb_mmap(int fbfp, struct fb_fix_screeninfo *scinfo)
+ perror("mmap error");
+ return NULL;
+ }
++#elif defined(__FreeBSD__)
++ size_t mmap_offset;
++ size_t mmap_length;
++ mmap_offset = (size_t)(video_adapter_info->va_window) & (PAGE_MASK);
++ mmap_length = (size_t)(video_adapter_info->va_window_size +
++ mmap_offset + PAGE_MASK) & (~PAGE_MASK);
++ if ((buf = (unsigned char *)
++ mmap(NULL, mmap_length, PROT_READ | PROT_WRITE, MAP_SHARED, fbfp,
++ (off_t) 0))
++ == MAP_FAILED) {
++ perror("mmap error");
++ return NULL;
++ }
++#endif
+ return buf;
+ }
+
++#if defined(__linux__)
+ static int
+ fb_munmap(void *buf, struct fb_fix_screeninfo *scinfo)
++#elif defined(__FreeBSD__)
++static int
++fb_munmap(void *buf, video_adapter_info_t *video_adapter_info)
++#endif
+ {
++#if defined(__linux__)
+ return munmap(buf, scinfo->smem_len);
++#elif defined(__FreeBSD__)
++ size_t mmap_offset;
++ size_t mmap_length;
++ mmap_offset = (size_t)(video_adapter_info->va_window) & (PAGE_MASK);
++ mmap_length = (size_t)(video_adapter_info->va_window_size +
++ mmap_offset + PAGE_MASK) & (~PAGE_MASK);
++ return munmap((void *)((u_long)buf & (~PAGE_MASK)), mmap_length);
++#endif
+ }
+
+ /*
+@@ -637,6 +1027,7 @@ fb_munmap(void *buf, struct fb_fix_screeninfo *scinfo)
+ *
+ * fb_fscrn_get() get information
+ */
++#if defined(__linux__)
+ static int
+ fb_fscrn_get(int fbfp, struct fb_fix_screeninfo *scinfo)
+ {
+@@ -646,12 +1037,14 @@ fb_fscrn_get(int fbfp, struct fb_fix_screeninfo *scinfo)
+ }
+ return 0;
+ }
++#endif
+
+ /*
+ * (struct fb_var_screeninfo) device independent variable information
+ *
+ * fb_vscrn_get() get information
+ */
++#if defined(__linux__)
+ static int
+ fb_vscrn_get(int fbfp, struct fb_var_screeninfo *scinfo)
+ {
+@@ -661,3 +1054,41 @@ fb_vscrn_get(int fbfp, struct fb_var_screeninfo *scinfo)
+ }
+ return 0;
+ }
++#endif
++
++#if defined(__FreeBSD__)
++static int
++fb_video_mode_get(int fbfp, int *video_mode)
++{
++ if (ioctl(fbfp, FBIO_GETMODE, video_mode) == -1) {
++ perror("ioctl FBIO_GETMODE error\n");
++ return -1;
++ }
++ return 0;
++}
++#endif
++
++#if defined(__FreeBSD__)
++static int
++fb_video_info_get(int fbfp, video_info_t *video_info)
++{
++ if (ioctl(fbfp, FBIO_MODEINFO, video_info) == -1) {
++ perror("ioctl FBIO_MODEINFO error\n");
++ return -1;
++ }
++ return 0;
++}
++#endif
++
++#if defined(__FreeBSD__)
++static int
++fb_video_adapter_info_get(int fbfp, video_adapter_info_t *video_adapter_info)
++{
++ if (ioctl(fbfp, FBIO_ADPINFO, video_adapter_info) == -1) {
++ perror("ioctl FBIO_ADPINFO error\n");
++ return -1;
++ }
++ return 0;
++}
++#endif
++
+diff --git a/w3mimg/fb/fb.h b/w3mimg/fb/fb.h
+index 1138bb0..5d86454 100644
+--- a/w3mimg/fb/fb.h
++++ b/w3mimg/fb/fb.h
+@@ -1,7 +1,11 @@
+ /* $Id: fb.h,v 1.7 2003/07/07 15:48:17 ukai Exp $ */
+ #ifndef fb_header
+ #define fb_header
++#if defined(__linux__)
+ #include <linux/fb.h>
++#elif defined(__FreeBSD__)
++#include <sys/fbio.h>
++#endif
+
+ typedef struct {
+ int num;
+diff --git a/w3mimg/fb/fb_gdkpixbuf.c b/w3mimg/fb/fb_gdkpixbuf.c
+index 36e3b62..f1e8d97 100644
+--- a/w3mimg/fb/fb_gdkpixbuf.c
++++ b/w3mimg/fb/fb_gdkpixbuf.c
+@@ -6,7 +6,7 @@
+ #include "config.h"
+ #if defined(USE_GTK2)
+ #include <glib-object.h>
+-#include <gdk/gdk.h>
++#include <gdk-pixbuf/gdk-pixbuf.h>
+ #endif
+ #include <gdk-pixbuf/gdk-pixbuf.h>
+ #include "fb.h"
+diff --git a/w3mimg/fb/fb_w3mimg.c b/w3mimg/fb/fb_w3mimg.c
+index d3ae5a9..fb323f5 100644
+--- a/w3mimg/fb/fb_w3mimg.c
++++ b/w3mimg/fb/fb_w3mimg.c
+@@ -153,10 +153,15 @@ check_tty_console(char *tty)
+ return 0;
+ if (strncmp(tty, "/dev/", 5) == 0)
+ tty += 5;
++#if defined(__linux__)
+ if (strncmp(tty, "tty", 3) == 0 && isdigit(*(tty + 3)))
+ return 1;
+ if (strncmp(tty, "vc/", 3) == 0 && isdigit(*(tty + 3)))
+ return 1;
++#elif defined(__FreeBSD__)
++ if (strncmp(tty, "ttyv", 4) == 0 && isxdigit(*(tty + 4)))
++ return 1;
++#endif
+ return 0;
+ }
+ #else
+@@ -172,7 +177,9 @@ w3mimg_fbopen()
+ return NULL;
+ memset(wop, 0, sizeof(w3mimg_op));
+
+- if (!check_tty_console(getenv("W3M_TTY")) && strcmp("jfbterm", getenv("TERM")) != 0) {
++ if (!check_tty_console(getenv("W3M_TTY")) &&
++ strcmp("jfbterm", getenv("TERM")) != 0 &&
++ strncmp("jfbterm-", getenv("TERM"), 8) != 0) {
+ fprintf(stderr, "w3mimgdisplay/fb: tty is not console\n");
+ goto error;
+ }
+diff --git a/w3mimg/x11/x11_w3mimg.c b/w3mimg/x11/x11_w3mimg.c
+index f5be4a8..9a539de 100644
+--- a/w3mimg/x11/x11_w3mimg.c
++++ b/w3mimg/x11/x11_w3mimg.c
+@@ -14,7 +14,7 @@
+ #elif defined(USE_GDKPIXBUF)
+ #if defined(USE_GTK2)
+ #include <glib-object.h>
+-#include <gdk/gdk.h>
++#include <gdk-pixbuf/gdk-pixbuf.h>
+ #include <gdk-pixbuf-xlib/gdk-pixbuf-xlib.h>
+ #else
+ #include <gdk-pixbuf/gdk-pixbuf-xlib.h>
+@@ -121,24 +121,32 @@ x11_init(w3mimg_op * self)
+ if (self == NULL)
+ return 0;
+ xi = (struct x11_info *)self->priv;
++#if defined(USE_IMLIB)
+ if (xi == NULL)
+ return 0;
+-#if defined(USE_IMLIB)
+ if (!xi->id) {
+ xi->id = Imlib_init(xi->display);
+ if (!xi->id)
+ return 0;
+ }
+ #elif defined(USE_GDKPIXBUF)
+- if (!xi->init_flag) {
++ if (!xi) {
++#if defined(USE_GTK2)
++ g_type_init();
++#endif
++ }
++ else if (!xi->init_flag) {
++ XWindowAttributes attr;
+ #if defined(USE_GTK2)
+ g_type_init();
+ #endif
+- gdk_pixbuf_xlib_init(xi->display, 0);
++ XGetWindowAttributes(xi->display, xi->parent, &attr);
++ /* gdk_pixbuf_xlib_init_with_depth() ignores depth, sigh... */
++ gdk_pixbuf_xlib_init_with_depth(xi->display, 0, attr.depth);
+ xi->init_flag = TRUE;
+ }
+ #endif
+- if (!xi->imageGC) {
++ if (xi && !xi->imageGC) {
+ xi->imageGC = XCreateGC(xi->display, xi->parent, 0, NULL);
+ if (!xi->imageGC)
+ return 0;
+@@ -200,14 +208,16 @@ x11_set_background(w3mimg_op * self, char *background)
+ {
+ XColor screen_def, exact_def;
+ struct x11_info *xi;
++ XWindowAttributes attr;
+ if (self == NULL)
+ return;
+ xi = (struct x11_info *)self->priv;
+ if (xi == NULL)
+ return;
+
++ XGetWindowAttributes(xi->display, xi->window, &attr);
+ if (background &&
+- XAllocNamedColor(xi->display, DefaultColormap(xi->display, 0),
++ XAllocNamedColor(xi->display, attr.colormap,
+ background, &screen_def, &exact_def))
+ xi->background_pixel = screen_def.pixel;
+ else {
+@@ -216,7 +226,7 @@ x11_set_background(w3mimg_op * self, char *background)
+ XImage *i;
+
+ p = XCreatePixmap(xi->display, xi->window, 1, 1,
+- DefaultDepth(xi->display, 0));
++ attr.depth);
+ gc = XCreateGC(xi->display, xi->window, 0, NULL);
+ if (!p || !gc)
+ exit(1); /* XXX */
+@@ -258,6 +268,7 @@ x11_img_new(struct x11_info *xi, int w, int h, int n)
+ {
+ struct x11_image *img = NULL;
+ int i;
++ XWindowAttributes attr;
+
+ img = malloc(sizeof(*img));
+ if (!img)
+@@ -267,9 +278,10 @@ x11_img_new(struct x11_info *xi, int w, int h, int n)
+ if (!img->pixmap)
+ goto ERROR;
+
++ XGetWindowAttributes(xi->display, xi->window, &attr);
+ for (i = 0; i < n; i++) {
+ img->pixmap[i] = XCreatePixmap(xi->display, xi->parent, w, h,
+- DefaultDepth(xi->display, 0));
++ attr.depth);
+ if (!img->pixmap[i])
+ goto ERROR;
+
+@@ -318,6 +330,41 @@ resize_image(GdkPixbuf * pixbuf, int width, int height)
+ return NULL;
+ return resized_pixbuf;
+ }
++
++#if defined(USE_GTK2)
++static void
++render_pixbuf_to_pixmap_32(Display *display, GC gc, Pixmap pixmap, GdkPixbuf * pixbuf)
++{
++ unsigned int x, y, width, height, rowstride, bytes_per_pixel;
++ unsigned char *line;
++ XImage *image;
++
++ width = gdk_pixbuf_get_width(pixbuf) ;
++ height = gdk_pixbuf_get_height(pixbuf) ;
++
++ if (!(image = XGetImage(display, pixmap, 0, 0, width, height, AllPlanes, ZPixmap)))
++ return ;
++
++ bytes_per_pixel = (gdk_pixbuf_get_has_alpha(pixbuf)) ? 4 : 3;
++ rowstride = gdk_pixbuf_get_rowstride(pixbuf);
++ line = gdk_pixbuf_get_pixels(pixbuf);
++
++ for (y = 0; y < height; y++) {
++ u_char *pixel;
++
++ pixel = line;
++ for (x = 0; x < width; x++) {
++ XPutPixel(image, x, y,
++ (pixel[0] <<16) | (pixel[1] <<8) | pixel[2] | 0xff000000);
++ pixel += bytes_per_pixel;
++ }
++ line += rowstride;
++ }
++
++ XPutImage(display, pixmap, gc, image, 0, 0, 0, 0, width, height);
++ XDestroyImage(image);
++}
++#endif
+ #endif
+
+ static int
+@@ -342,6 +389,7 @@ x11_load_image(w3mimg_op * self, W3MImage * img, char *fname, int w, int h)
+ GList *frames;
+ #endif
+ #endif
++ XWindowAttributes attr;
+
+ if (self == NULL)
+ return 0;
+@@ -349,6 +397,7 @@ x11_load_image(w3mimg_op * self, W3MImage * img, char *fname, int w, int h)
+ if (xi == NULL)
+ return 0;
+
++ XGetWindowAttributes(xi->display, xi->window, &attr);
+ #if defined(USE_IMLIB)
+ im = Imlib_load_image(xi->id, fname);
+ if (!im)
+@@ -358,7 +407,7 @@ x11_load_image(w3mimg_op * self, W3MImage * img, char *fname, int w, int h)
+ if (h <= 0)
+ h = im->rgb_height;
+ img->pixmap = (void *)XCreatePixmap(xi->display, xi->parent, w, h,
+- DefaultDepth(xi->display, 0));
++ attr.depth);
+ if (!img->pixmap)
+ return 0;
+ XSetForeground(xi->display, xi->imageGC, xi->background_pixel);
+@@ -374,17 +423,21 @@ x11_load_image(w3mimg_op * self, W3MImage * img, char *fname, int w, int h)
+ w = imlib_image_get_width();
+ if (h <= 0)
+ h = imlib_image_get_height();
++
++ im = imlib_create_cropped_scaled_image(0, 0, imlib_image_get_width(), imlib_image_get_height(), w, h);
++ imlib_context_set_image(im);
++
+ img->pixmap = (void *)XCreatePixmap(xi->display, xi->parent, w, h,
+- DefaultDepth(xi->display, 0));
++ attr.depth);
+ if (!img->pixmap)
+ return 0;
+ XSetForeground(xi->display, xi->imageGC, xi->background_pixel);
+ XFillRectangle(xi->display, (Pixmap) img->pixmap, xi->imageGC, 0, 0, w, h);
+ imlib_context_set_display(xi->display);
+- imlib_context_set_visual(DefaultVisual(xi->display, 0));
+- imlib_context_set_colormap(DefaultColormap(xi->display, 0));
++ imlib_context_set_visual(attr.visual);
++ imlib_context_set_colormap(attr.colormap);
+ imlib_context_set_drawable((Drawable) img->pixmap);
+- imlib_render_image_on_drawable_at_size(0, 0, w, h);
++ imlib_render_image_on_drawable(0, 0);
+ imlib_free_image();
+ #elif defined(USE_GDKPIXBUF)
+ max_anim = self->max_anim;
+@@ -416,7 +469,7 @@ x11_load_image(w3mimg_op * self, W3MImage * img, char *fname, int w, int h)
+ ratio_h = 1.0 * h / ih;
+ }
+ tmp_pixmap = XCreatePixmap(xi->display, xi->parent, w, h,
+- DefaultDepth(xi->display, 0));
++ attr.depth);
+ XSetForeground(xi->display, xi->imageGC, xi->background_pixel);
+ XFillRectangle(xi->display, (Pixmap) tmp_pixmap, xi->imageGC, 0, 0, w, h);
+ if (!tmp_pixmap) {
+@@ -459,7 +512,10 @@ x11_load_image(w3mimg_op * self, W3MImage * img, char *fname, int w, int h)
+ if (delay > ximg->delay)
+ ximg->delay = delay;
+
+- gdk_pixbuf_xlib_render_to_drawable_alpha(pixbuf,
++ if (attr.depth == 32)
++ render_pixbuf_to_pixmap_32(xi->display, xi->imageGC, ximg->pixmap[j], pixbuf);
++ else
++ gdk_pixbuf_xlib_render_to_drawable_alpha(pixbuf,
+ (Drawable) ximg->pixmap[j], 0,
+ 0, 0, 0, w, h,
+ GDK_PIXBUF_ALPHA_BILEVEL, 1,
+@@ -653,9 +709,11 @@ x11_get_image_size(w3mimg_op * self, W3MImage * img, char *fname, int *w,
+
+ if (self == NULL)
+ return 0;
++#if defined(USE_IMLIB) && defined(USE_IMLIB2)
+ xi = (struct x11_info *)self->priv;
+ if (xi == NULL)
+ return 0;
++#endif
+
+ #if defined(USE_IMLIB)
+ im = Imlib_load_image(xi->id, fname);
+@@ -755,6 +813,9 @@ w3mimg_x11open()
+ return NULL;
+ memset(wop, 0, sizeof(w3mimg_op));
+
++ if (getenv("W3M_USE_REMOTE_IMAGE"))
++ goto end;
++
+ xi = (struct x11_info *)malloc(sizeof(struct x11_info));
+ if (xi == NULL)
+ goto error;
+@@ -807,6 +868,7 @@ w3mimg_x11open()
+
+ wop->priv = xi;
+
++ end:
+ wop->init = x11_init;
+ wop->finish = x11_finish;
+ wop->active = x11_active;
+diff --git a/w3mimgdisplay.c b/w3mimgdisplay.c
+index 5486a47..ccfa373 100644
+--- a/w3mimgdisplay.c
++++ b/w3mimgdisplay.c
+@@ -281,6 +281,10 @@ DrawImage(char *buf, int redraw)
+ maxImage = n + 1;
+ imageBuf = (W3MImage *) realloc((void *)imageBuf,
+ sizeof(W3MImage) * maxImage);
++ if (imageBuf == NULL) {
++ fprintf(stderr, "Out of memory\n");
++ exit(1);
++ }
+ for (; i < maxImage; i++)
+ imageBuf[i].pixmap = NULL;
+ }
diff --git a/gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch b/gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch
deleted file mode 100644
index 5b78f2d..0000000
--- a/gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-Subject: Disable SSLv2 and SSLv3.
-
-The only remaining methods are TLSv1.* (the code never distinguishes
-between TLSv1.0, TLSv1.1, and TLSv1.2).
----
- fm.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/fm.h b/fm.h
-index 320906c..ddcd4fc 100644
---- a/fm.h
-+++ b/fm.h
-@@ -1144,7 +1144,7 @@ global int ssl_path_modified init(FALSE);
- #endif /* defined(USE_SSL) &&
- * defined(USE_SSL_VERIFY) */
- #ifdef USE_SSL
--global char *ssl_forbid_method init(NULL);
-+global char *ssl_forbid_method init("2, 3");
- #endif
-
- global int is_redisplay init(FALSE);
---
-2.6.4
-
diff --git a/gnu/packages/patches/w3m-disable-weak-ciphers.patch b/gnu/packages/patches/w3m-disable-weak-ciphers.patch
deleted file mode 100644
index 4780d54..0000000
--- a/gnu/packages/patches/w3m-disable-weak-ciphers.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-Subject: Disable weak ciphers
-
-Disable RC4, "export ciphers", and all keys < 128 bits.
-
-Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/w3m/+bug/1325674
----
- url.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/url.c b/url.c
-index ed6062e..e86b1f3 100644
---- a/url.c
-+++ b/url.c
-@@ -326,6 +326,7 @@ openSSLHandle(int sock, char *hostname, char **p_cert)
- SSL_load_error_strings();
- if (!(ssl_ctx = SSL_CTX_new(SSLv23_client_method())))
- goto eend;
-+ SSL_CTX_set_cipher_list(ssl_ctx, "DEFAULT:!LOW:!RC4:!EXP");
- option = SSL_OP_ALL;
- if (ssl_forbid_method) {
- if (strchr(ssl_forbid_method, '2'))
---
-2.6.4
-
diff --git a/gnu/packages/patches/w3m-force-ssl_verify_server-on.patch b/gnu/packages/patches/w3m-force-ssl_verify_server-on.patch
deleted file mode 100644
index dc9f117..0000000
--- a/gnu/packages/patches/w3m-force-ssl_verify_server-on.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-Subject: Force ssl_verify_server on.
-
-By default, SSL/TLS certificates are not verified. This enables the
-verification.
----
- fm.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/fm.h b/fm.h
-index 8378939..320906c 100644
---- a/fm.h
-+++ b/fm.h
-@@ -1135,7 +1135,7 @@ global int view_unseenobject init(TRUE);
- #endif
-
- #if defined(USE_SSL) && defined(USE_SSL_VERIFY)
--global int ssl_verify_server init(FALSE);
-+global int ssl_verify_server init(TRUE);
- global char *ssl_cert_file init(NULL);
- global char *ssl_key_file init(NULL);
- global char *ssl_ca_path init(NULL);
---
-2.6.4
-
diff --git a/gnu/packages/patches/w3m-libgc.patch b/gnu/packages/patches/w3m-libgc.patch
deleted file mode 100644
index 0dc6a40..0000000
--- a/gnu/packages/patches/w3m-libgc.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-This patch fixes w3m compilation with libgc > 7.2.
-
-Reported:
-https://bugs.archlinux.org/task/33397
-
-Patch with explanation:
-http://anonscm.debian.org/cgit/collab-maint/w3m.git/commit/?id=770eec8304bdbe458
----
- main.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/main.c b/main.c
-index b421943..249eb1a 100644
---- a/main.c
-+++ b/main.c
-@@ -833,7 +833,8 @@ main(int argc, char **argv, char **envp)
- mySignal(SIGPIPE, SigPipe);
- #endif
-
-- orig_GC_warn_proc = GC_set_warn_proc(wrap_GC_warn_proc);
-+ orig_GC_warn_proc = GC_get_warn_proc();
-+ GC_set_warn_proc(wrap_GC_warn_proc);
- err_msg = Strnew();
- if (load_argc == 0) {
- /* no URL specified */
---
-2.6.4
-
diff --git a/gnu/packages/patches/w3m-upstream-20120522.patch b/gnu/packages/patches/w3m-upstream-20120522.patch
new file mode 100644
index 0000000..64e089d
--- /dev/null
+++ b/gnu/packages/patches/w3m-upstream-20120522.patch
@@ -0,0 +1,157 @@
+Description: Upstream development snapshot on 2012-05-22
+Origin: upstream, http://w3m.cvs.sourceforge.net/viewvc/w3m/w3m/
+
+diff -urN w3m-0.5.3/ChangeLog w3m/ChangeLog
+--- w3m-0.5.3/ChangeLog 2011-01-15 16:52:48.000000000 +0900
++++ w3m/ChangeLog 2012-05-22 22:11:44.000000000 +0900
+@@ -1,12 +1,31 @@
++2012-05-22 Tatsuya Kinoshita <tats@vega.ocn.ne.jp>
++
++ * [w3m-dev 04451] w3m/entity.h should be removed when `make clean'
++ * Makefile.in: add entity.h to "make clean" target.
++
++2012-05-22 Tatsuya Kinoshita <tats@vega.ocn.ne.jp>
++
++ * [w3m-dev 04452] Re: w3m on macosx 10.6.6
++ * doc/w3m.1, doc/STORY.html, doc-jp/STORY.html:
++ delete words about formerly included Boehm GC library.
++
++2012-05-22 Enu <theme.of.n@gmail.com>
++
++ * file.c, HTML.c: parse META CHARSET.
++
++2011-01-17 Dai Sato <satodai@w3m.jp>
++
++ * correction: ChangeLog of 2011-01-15 (0.5.2 -> 0.5.3)
++
+ 2011-01-15 Dai Sato <satodai@w3m.jp>
+
+- * w3m 0.5.2
++ * w3m 0.5.3
+ * version.c.in: update
+- * doc/README: version 0.5.2, release date, maintainer
++ * doc/README: version 0.5.3, release date, maintainer
+ * doc-jp/README: ditto
+ * po/w3m.pot, ja.po: ditto
+ * NEWS: update
+- * configure.ac: version 0.5.2
++ * configure.ac: version 0.5.3
+ * configure: regenerated
+
+ 2011-01-05 SAKAI Kiyotaka <kiyotaka.sakai@ntt-at.co.jp>
+@@ -9300,4 +9319,4 @@
+ * release-0-2-1
+ * import w3m-0.2.1
+
+-$Id: ChangeLog,v 1.1050 2011/01/15 07:52:48 inu Exp $
++$Id: ChangeLog,v 1.1055 2012/05/22 10:20:45 inu Exp $
+diff -urN w3m-0.5.3/Makefile.in w3m/Makefile.in
+--- w3m-0.5.3/Makefile.in 2011-01-04 18:22:18.000000000 +0900
++++ w3m/Makefile.in 2012-05-22 22:11:44.000000000 +0900
+@@ -288,7 +288,7 @@
+ clean: sweep
+ -$(RM) -f *.o *.a $(TARGETS) mktable$(EXT)
+ -$(RM) -f funcname.tab
+- -$(RM) -f funcname.c funcname1.h funcname2.h tagtable.c functable.c
++ -$(RM) -f entity.h funcname.c funcname1.h funcname2.h tagtable.c functable.c
+ -for dir in w3mimg libwc; \
+ do \
+ (cd $$dir && $(MAKE) clean RM="$(RM)"); \
+diff -urN w3m-0.5.3/doc/STORY.html w3m/doc/STORY.html
+--- w3m-0.5.3/doc/STORY.html 2001-11-21 13:29:14.000000000 +0900
++++ w3m/doc/STORY.html 2012-05-22 22:11:44.000000000 +0900
+@@ -182,6 +182,10 @@
+ I could distribute w3m without this library because one can
+ get the library separately, but I decided to contain it in the
+ w3m distribution for the convenience of an installer.
++<P>
++# Boehm GC library is no longer included into w3m packages
++# after w3m-0.4.2.
++<P>
+ W3m doesn't use libwww.
+ <P>
+ Boehm GC is a garbage collector for C and C++. I began to use this
+diff -urN w3m-0.5.3/doc/w3m.1 w3m/doc/w3m.1
+--- w3m-0.5.3/doc/w3m.1 2011-01-15 15:37:24.000000000 +0900
++++ w3m/doc/w3m.1 2012-05-22 22:11:44.000000000 +0900
+@@ -245,8 +245,6 @@
+ .I
+ w3m
+ has incorporated code from several sources.
+-Hans J. Boehm, Alan J. Demers, Xerox Corp. and Silicon Graphics
+-have the copyright of the GC library comes with w3m package.
+ Users have contributed patches and suggestions over time.
+ .SH AUTHOR
+ Akinori ITO <aito@fw.ipsj.or.jp>
+diff -urN w3m-0.5.3/doc-jp/STORY.html w3m/doc-jp/STORY.html
+--- w3m-0.5.3/doc-jp/STORY.html 2003-05-14 02:17:54.000000000 +0900
++++ w3m/doc-jp/STORY.html 2012-05-22 22:11:44.000000000 +0900
+@@ -158,6 +158,9 @@
+ <a href="http://www.hpl.hp.com/personal/Hans_Boehm/gc/">Boehm GC</a>
+ ¤È¤¤¤¦¥é¥¤¥Ö¥é¥ê¤òÍøÍѤ·¤Æ¤¤¤ë¡¥¤³¤ì¤Ï»ä¤¬½ñ¤¤¤¿¤â¤Î¤Ç¤Ï¤Ê¤¤¤¬¡¤
+ ¥³¥ó¥Ñ¥¤¥ë»þ¤ÎÊص¹¤ò¹Í¤¨¤ÆÇÛÉۥѥ屡¼¥¸¤Ë´Þ¤á¤Æ¤¤¤ë¡¥
++<P>
++# Boehm GC ¤Ï¡¢w3m-0.4.2 °Ê¹ß¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ë¤Ï´Þ¤Þ¤ì¤Æ¤¤¤Þ¤»¤ó¡£
++<P>
+ ¤Ê¤ª¡¤libwww ¤Ï»È¤Ã¤Æ¤¤¤Ê¤¤¡¥
+ <P>
+ Boehm GC¤Ï¡¤C¤«¤é»È¤¨¤ë¥¬¥Ù¡¼¥¸¥³¥ì¥¯¥¿¤À¡¥table ¤ò¼ÂÁõ¤·¤¿¤¢¤¿¤ê¤Ë¤³¤ì¤ò
+diff -urN w3m-0.5.3/file.c w3m/file.c
+--- w3m-0.5.3/file.c 2011-01-04 18:22:21.000000000 +0900
++++ w3m/file.c 2012-05-22 22:11:44.000000000 +0900
+@@ -1,4 +1,4 @@
+-/* $Id: file.c,v 1.265 2010/12/15 10:50:24 htrb Exp $ */
++/* $Id: file.c,v 1.266 2012/05/22 09:45:56 inu Exp $ */
+ #include "fm.h"
+ #include <sys/types.h>
+ #include "myctype.h"
+@@ -5020,10 +5020,17 @@
+ HTMLlineproc1(tmp->ptr, h_env);
+ return 1;
+ case HTML_META:
+- p = q = NULL;
++ p = q = r = NULL;
+ parsedtag_get_value(tag, ATTR_HTTP_EQUIV, &p);
+ parsedtag_get_value(tag, ATTR_CONTENT, &q);
+ #ifdef USE_M17N
++ parsedtag_get_value(tag, ATTR_CHARSET, &r);
++ if (r) {
++ /* <meta charset=""> */
++ SKIP_BLANKS(r);
++ meta_charset = wc_guess_charset(r, 0);
++ }
++ else
+ if (p && q && !strcasecmp(p, "Content-Type") &&
+ (q = strcasestr(q, "charset")) != NULL) {
+ q += 7;
+diff -urN w3m-0.5.3/html.c w3m/html.c
+--- w3m-0.5.3/html.c 2011-01-04 18:22:21.000000000 +0900
++++ w3m/html.c 2012-05-22 22:11:44.000000000 +0900
+@@ -1,4 +1,4 @@
+-/* $Id: html.c,v 1.32 2010/08/14 01:29:40 htrb Exp $ */
++/* $Id: html.c,v 1.33 2012/05/22 09:45:56 inu Exp $ */
+ #include "html.h"
+
+ /* Define HTML Tag Infomation Table */
+@@ -37,8 +37,8 @@
+ ATTR_CELLPADDING, ATTR_VSPACE, ATTR_CORE
+ };
+ #define MAXA_TABLE MAXA_CORE + 6
+-unsigned char ALST_META[] = { ATTR_HTTP_EQUIV, ATTR_CONTENT, ATTR_CORE };
+-#define MAXA_META MAXA_CORE + 2
++unsigned char ALST_META[] = { ATTR_HTTP_EQUIV, ATTR_CONTENT, ATTR_CHARSET, ATTR_CORE };
++#define MAXA_META MAXA_CORE + 3
+ unsigned char ALST_FRAME[] = { ATTR_SRC, ATTR_NAME, ATTR_CORE };
+ #define MAXA_FRAME MAXA_CORE + 2
+ unsigned char ALST_FRAMESET[] = { ATTR_COLS, ATTR_ROWS, ATTR_CORE };
+diff -urN w3m-0.5.3/version.c.in w3m/version.c.in
+--- w3m-0.5.3/version.c.in 2011-01-15 16:52:48.000000000 +0900
++++ w3m/version.c.in 2012-05-22 22:11:44.000000000 +0900
+@@ -1,5 +1,5 @@
+-/* $Id: version.c.in,v 1.48 2011/01/15 07:52:48 inu Exp $ */
+-#define CURRENT_VERSION "w3m/0.5.3"
++/* $Id: version.c.in,v 1.49 2012/05/22 09:45:56 inu Exp $ */
++#define CURRENT_VERSION "w3m/0.5.3+cvs"
+
+ #ifndef FM_H
+ char *w3m_version = CURRENT_VERSION;
diff --git a/gnu/packages/w3m.scm b/gnu/packages/w3m.scm
index e7dd583..466958a 100644
--- a/gnu/packages/w3m.scm
+++ b/gnu/packages/w3m.scm
@@ -1,6 +1,7 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
;;; Copyright © 2016 Leo Famulari <leo@famulari.name>
+;;; Copyright © 2016 Kei Kebreau <kei@openmailbox.org>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -36,33 +37,17 @@
(name "w3m")
(version "0.5.3")
(source (origin
- (method url-fetch)
- (uri (string-append "mirror://sourceforge/" name "/" name "/"
- name "-" version "/"
- name "-" version ".tar.gz"))
- (sha256
- (base32
- "1qx9f0kprf92r1wxl3sacykla0g04qsi0idypzz24b7xy9ix5579"))
-
- ;; cf. https://bugs.archlinux.org/task/33397
- (patches (search-patches "w3m-libgc.patch"
- "w3m-force-ssl_verify_server-on.patch"
- "w3m-disable-sslv2-and-sslv3.patch"
- "w3m-disable-weak-ciphers.patch"))))
+ (method url-fetch)
+ ;; Debian's fork of w3m is the only one that is still maintained.
+ (uri (string-append "mirror://debian/pool/main/w/w3m/w3m_"
+ version ".orig.tar.gz"))
+ (sha256
+ (base32
+ "1qx9f0kprf92r1wxl3sacykla0g04qsi0idypzz24b7xy9ix5579"))
+ (patches (search-patches "w3m-upstream-20120522.patch"
+ "w3m-debian-updates.patch"))))
(build-system gnu-build-system)
- (arguments `(#:tests? #f ; no check target
- #:phases (alist-cons-before
- 'configure 'fix-perl
- (lambda _
- ;; https://launchpad.net/bugs/935540
- ;; 'struct file_handle' is used by 'glibc'
- (substitute* '("istream.c" "istream.h")
- (("struct[[:blank:]]+file_handle")
- "struct w3m_file_handle"))
- (substitute* '("scripts/w3mmail.cgi.in"
- "scripts/dirlist.cgi.in")
- (("@PERL@") (which "perl"))))
- %standard-phases)))
+ (arguments `(#:tests? #f)) ; no check target
(inputs
`(("libgc" ,libgc)
("ncurses" ,ncurses)
--
2.10.2
[-- Attachment #2.1: Type: text/plain, Size: 110 bytes --]
This patch switches the source of our w3m to Debian's maintenance
fork. SourceForge's w3m is highly inactive.
[-- Attachment #2.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 818 bytes --]
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m.
2016-11-03 22:54 [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m Kei Kebreau
@ 2016-11-04 3:17 ` Eric Bavier
2016-11-04 4:03 ` Leo Famulari
0 siblings, 1 reply; 12+ messages in thread
From: Eric Bavier @ 2016-11-04 3:17 UTC (permalink / raw
To: Kei Kebreau; +Cc: guix-devel
[-- Attachment #1: Type: text/plain, Size: 2255 bytes --]
On Thu, 03 Nov 2016 18:54:55 -0400
Kei Kebreau <kei@openmailbox.org> wrote:
> From b837111e3ddf406a3b9235538f63af678e3ac741 Mon Sep 17 00:00:00 2001
> From: Kei Kebreau <kei@openmailbox.org>
> Date: Thu, 3 Nov 2016 17:58:48 -0400
> Subject: [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m.
>
> Fixes some security issues seen here:
> <http://www.openwall.com/lists/oss-security/2016/11/03/3>
>
> * gnu/packages/patches/w3m-upstream-20120522.patch: New file.
> * gnu/packages/patches/w3m-debian-updates.patch: New file.
> * gnu/packages/w3m.scm (w3m): Switch to Debian's actively maintained
> fork of w3m.
> [source]: Use Debian's tarball and patches. Remove obsolete patches.
> [arguments]: Remove unnecessary modification of %standard-phases.
> * gnu/local.mk (dist_patch_DATA): Register new patches. Remove obsolete
> patches.
> ---
> gnu/local.mk | 6 +-
> gnu/packages/patches/w3m-debian-updates.patch | 28498 +++++++++++++++++++
So theirs is the only actively maintained version of w3m and all they
can provide is a 28.5 thousand line patch? No VCS repository? There
must be some point at which it would be better for us to fetch the
patch in an origin rather than importing it into our repo.
> .../patches/w3m-disable-sslv2-and-sslv3.patch | 24 -
> .../patches/w3m-disable-weak-ciphers.patch | 24 -
> .../patches/w3m-force-ssl_verify_server-on.patch | 24 -
> gnu/packages/patches/w3m-libgc.patch | 28 -
> gnu/packages/patches/w3m-upstream-20120522.patch | 157 +
> gnu/packages/w3m.scm | 37 +-
> 8 files changed, 28668 insertions(+), 130 deletions(-)
> create mode 100644 gnu/packages/patches/w3m-debian-updates.patch
> delete mode 100644 gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch
> delete mode 100644 gnu/packages/patches/w3m-disable-weak-ciphers.patch
> delete mode 100644 gnu/packages/patches/w3m-force-ssl_verify_server-on.patch
> delete mode 100644 gnu/packages/patches/w3m-libgc.patch
> create mode 100644 gnu/packages/patches/w3m-upstream-20120522.patch
Please list the removed patches in the commit message.
`~Eric
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 455 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m.
2016-11-04 3:17 ` Eric Bavier
@ 2016-11-04 4:03 ` Leo Famulari
2016-11-04 13:27 ` Ludovic Courtès
0 siblings, 1 reply; 12+ messages in thread
From: Leo Famulari @ 2016-11-04 4:03 UTC (permalink / raw
To: Eric Bavier; +Cc: guix-devel
[-- Attachment #1: Type: text/plain, Size: 1593 bytes --]
On Thu, Nov 03, 2016 at 10:17:18PM -0500, Eric Bavier wrote:
> On Thu, 03 Nov 2016 18:54:55 -0400
> Kei Kebreau <kei@openmailbox.org> wrote:
>
> > From b837111e3ddf406a3b9235538f63af678e3ac741 Mon Sep 17 00:00:00 2001
> > From: Kei Kebreau <kei@openmailbox.org>
> > Date: Thu, 3 Nov 2016 17:58:48 -0400
> > Subject: [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m.
> >
> > Fixes some security issues seen here:
> > <http://www.openwall.com/lists/oss-security/2016/11/03/3>
> >
> > * gnu/packages/patches/w3m-upstream-20120522.patch: New file.
> > * gnu/packages/patches/w3m-debian-updates.patch: New file.
> > * gnu/packages/w3m.scm (w3m): Switch to Debian's actively maintained
> > fork of w3m.
> > [source]: Use Debian's tarball and patches. Remove obsolete patches.
> > [arguments]: Remove unnecessary modification of %standard-phases.
> > * gnu/local.mk (dist_patch_DATA): Register new patches. Remove obsolete
> > patches.
> > ---
> > gnu/local.mk | 6 +-
> > gnu/packages/patches/w3m-debian-updates.patch | 28498 +++++++++++++++++++
>
> So theirs is the only actively maintained version of w3m and all they
> can provide is a 28.5 thousand line patch? No VCS repository? There
> must be some point at which it would be better for us to fetch the
> patch in an origin rather than importing it into our repo.
I think we build from their Git repo:
https://anonscm.debian.org/cgit/collab-maint/w3m.git
They even offer non-Debian-ized release tags, such as
<v0.5.3+git20161031>.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 801 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m.
2016-11-04 4:03 ` Leo Famulari
@ 2016-11-04 13:27 ` Ludovic Courtès
2016-11-04 13:59 ` Kei Kebreau
2016-11-04 14:52 ` Kei Kebreau
0 siblings, 2 replies; 12+ messages in thread
From: Ludovic Courtès @ 2016-11-04 13:27 UTC (permalink / raw
To: Leo Famulari; +Cc: guix-devel
Leo Famulari <leo@famulari.name> skribis:
> On Thu, Nov 03, 2016 at 10:17:18PM -0500, Eric Bavier wrote:
>> On Thu, 03 Nov 2016 18:54:55 -0400
>> Kei Kebreau <kei@openmailbox.org> wrote:
>>
>> > From b837111e3ddf406a3b9235538f63af678e3ac741 Mon Sep 17 00:00:00 2001
>> > From: Kei Kebreau <kei@openmailbox.org>
>> > Date: Thu, 3 Nov 2016 17:58:48 -0400
>> > Subject: [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m.
>> >
>> > Fixes some security issues seen here:
>> > <http://www.openwall.com/lists/oss-security/2016/11/03/3>
>> >
>> > * gnu/packages/patches/w3m-upstream-20120522.patch: New file.
>> > * gnu/packages/patches/w3m-debian-updates.patch: New file.
>> > * gnu/packages/w3m.scm (w3m): Switch to Debian's actively maintained
>> > fork of w3m.
>> > [source]: Use Debian's tarball and patches. Remove obsolete patches.
>> > [arguments]: Remove unnecessary modification of %standard-phases.
>> > * gnu/local.mk (dist_patch_DATA): Register new patches. Remove obsolete
>> > patches.
>> > ---
>> > gnu/local.mk | 6 +-
>> > gnu/packages/patches/w3m-debian-updates.patch | 28498 +++++++++++++++++++
>>
>> So theirs is the only actively maintained version of w3m and all they
>> can provide is a 28.5 thousand line patch? No VCS repository? There
>> must be some point at which it would be better for us to fetch the
>> patch in an origin rather than importing it into our repo.
>
> I think we build from their Git repo:
>
> https://anonscm.debian.org/cgit/collab-maint/w3m.git
>
> They even offer non-Debian-ized release tags, such as
> <v0.5.3+git20161031>.
Then we should use that instead of importing all the patches in our own
repo, IMO.
Kei: would that work for you?
Thanks,
Ludo’.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m.
2016-11-04 13:27 ` Ludovic Courtès
@ 2016-11-04 13:59 ` Kei Kebreau
2016-11-04 14:52 ` Kei Kebreau
1 sibling, 0 replies; 12+ messages in thread
From: Kei Kebreau @ 2016-11-04 13:59 UTC (permalink / raw
To: Ludovic Courtès; +Cc: guix-devel
[-- Attachment #1: Type: text/plain, Size: 1968 bytes --]
ludo@gnu.org (Ludovic Courtès) writes:
> Leo Famulari <leo@famulari.name> skribis:
>
>> On Thu, Nov 03, 2016 at 10:17:18PM -0500, Eric Bavier wrote:
>>> On Thu, 03 Nov 2016 18:54:55 -0400
>>> Kei Kebreau <kei@openmailbox.org> wrote:
>>>
>>> > From b837111e3ddf406a3b9235538f63af678e3ac741 Mon Sep 17 00:00:00 2001
>>> > From: Kei Kebreau <kei@openmailbox.org>
>>> > Date: Thu, 3 Nov 2016 17:58:48 -0400
>>> > Subject: [PATCH] gnu: w3m: Switch to Debian's actively maintained
>>> > fork of w3m.
>>> >
>>> > Fixes some security issues seen here:
>>> > <http://www.openwall.com/lists/oss-security/2016/11/03/3>
>>> >
>>> > * gnu/packages/patches/w3m-upstream-20120522.patch: New file.
>>> > * gnu/packages/patches/w3m-debian-updates.patch: New file.
>>> > * gnu/packages/w3m.scm (w3m): Switch to Debian's actively maintained
>>> > fork of w3m.
>>> > [source]: Use Debian's tarball and patches. Remove obsolete patches.
>>> > [arguments]: Remove unnecessary modification of %standard-phases.
>>> > * gnu/local.mk (dist_patch_DATA): Register new patches. Remove obsolete
>>> > patches.
>>> > ---
>>> > gnu/local.mk | 6 +-
>>> > gnu/packages/patches/w3m-debian-updates.patch | 28498
>>> > +++++++++++++++++++
>>>
>>> So theirs is the only actively maintained version of w3m and all they
>>> can provide is a 28.5 thousand line patch? No VCS repository? There
>>> must be some point at which it would be better for us to fetch the
>>> patch in an origin rather than importing it into our repo.
>>
>> I think we build from their Git repo:
>>
>> https://anonscm.debian.org/cgit/collab-maint/w3m.git
>>
>> They even offer non-Debian-ized release tags, such as
>> <v0.5.3+git20161031>.
>
> Then we should use that instead of importing all the patches in our own
> repo, IMO.
>
> Kei: would that work for you?
>
> Thanks,
> Ludo’.
It seems simple enough. I'll give it a go.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 800 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m.
2016-11-04 13:27 ` Ludovic Courtès
2016-11-04 13:59 ` Kei Kebreau
@ 2016-11-04 14:52 ` Kei Kebreau
2016-11-04 15:48 ` Leo Famulari
1 sibling, 1 reply; 12+ messages in thread
From: Kei Kebreau @ 2016-11-04 14:52 UTC (permalink / raw
To: Ludovic Courtès; +Cc: guix-devel
[-- Attachment #1.1: Type: text/plain, Size: 1928 bytes --]
ludo@gnu.org (Ludovic Courtès) writes:
> Leo Famulari <leo@famulari.name> skribis:
>
>> On Thu, Nov 03, 2016 at 10:17:18PM -0500, Eric Bavier wrote:
>>> On Thu, 03 Nov 2016 18:54:55 -0400
>>> Kei Kebreau <kei@openmailbox.org> wrote:
>>>
>>> > From b837111e3ddf406a3b9235538f63af678e3ac741 Mon Sep 17 00:00:00 2001
>>> > From: Kei Kebreau <kei@openmailbox.org>
>>> > Date: Thu, 3 Nov 2016 17:58:48 -0400
>>> > Subject: [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m.
>>> >
>>> > Fixes some security issues seen here:
>>> > <http://www.openwall.com/lists/oss-security/2016/11/03/3>
>>> >
>>> > * gnu/packages/patches/w3m-upstream-20120522.patch: New file.
>>> > * gnu/packages/patches/w3m-debian-updates.patch: New file.
>>> > * gnu/packages/w3m.scm (w3m): Switch to Debian's actively maintained
>>> > fork of w3m.
>>> > [source]: Use Debian's tarball and patches. Remove obsolete patches.
>>> > [arguments]: Remove unnecessary modification of %standard-phases.
>>> > * gnu/local.mk (dist_patch_DATA): Register new patches. Remove obsolete
>>> > patches.
>>> > ---
>>> > gnu/local.mk | 6 +-
>>> > gnu/packages/patches/w3m-debian-updates.patch | 28498 +++++++++++++++++++
>>>
>>> So theirs is the only actively maintained version of w3m and all they
>>> can provide is a 28.5 thousand line patch? No VCS repository? There
>>> must be some point at which it would be better for us to fetch the
>>> patch in an origin rather than importing it into our repo.
>>
>> I think we build from their Git repo:
>>
>> https://anonscm.debian.org/cgit/collab-maint/w3m.git
>>
>> They even offer non-Debian-ized release tags, such as
>> <v0.5.3+git20161031>.
>
> Then we should use that instead of importing all the patches in our own
> repo, IMO.
>
> Kei: would that work for you?
>
> Thanks,
> Ludo’.
Here it is!
[-- Attachment #1.2: 0001-gnu-w3m-Switch-to-Debian-s-actively-maintained-fork-.patch --]
[-- Type: text/plain, Size: 8960 bytes --]
From cc7a61d61160817ceb395b648b18c885175441e8 Mon Sep 17 00:00:00 2001
From: Kei Kebreau <kei@openmailbox.org>
Date: Fri, 4 Nov 2016 10:48:53 -0400
Subject: [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m.
Fixes some security issues seen here:
<http://www.openwall.com/lists/oss-security/2016/11/03/3>
* gnu/packages/w3m.scm (w3m): Switch to Debian's actively maintained
fork of w3m.
[source]: Use Debian's git tree. Remove obsolete patches.
[arguments]: Remove unnecessary modification of %standard-phases.
* gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch: Delete file.
* gnu/packages/patches/w3m-disable-weak-ciphers.patch: Delete file.
* gnu/packages/patches/w3m-force-ssl_verify_server-on.patch: Delete file.
* gnu/packages/patches/w3m-libgc.patch: Delete file.
* gnu/local.mk (dist_patch_DATA): Remove them.
---
gnu/local.mk | 4 ---
.../patches/w3m-disable-sslv2-and-sslv3.patch | 24 --------------
.../patches/w3m-disable-weak-ciphers.patch | 24 --------------
.../patches/w3m-force-ssl_verify_server-on.patch | 24 --------------
gnu/packages/patches/w3m-libgc.patch | 28 ----------------
gnu/packages/w3m.scm | 38 +++++++---------------
6 files changed, 11 insertions(+), 131 deletions(-)
delete mode 100644 gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch
delete mode 100644 gnu/packages/patches/w3m-disable-weak-ciphers.patch
delete mode 100644 gnu/packages/patches/w3m-force-ssl_verify_server-on.patch
delete mode 100644 gnu/packages/patches/w3m-libgc.patch
diff --git a/gnu/local.mk b/gnu/local.mk
index a23d536..a34d8ae 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -891,10 +891,6 @@ dist_patch_DATA = \
%D%/packages/patches/vte-CVE-2012-2738-pt1.patch \
%D%/packages/patches/vte-CVE-2012-2738-pt2.patch \
%D%/packages/patches/vtk-mesa-10.patch \
- %D%/packages/patches/w3m-libgc.patch \
- %D%/packages/patches/w3m-force-ssl_verify_server-on.patch \
- %D%/packages/patches/w3m-disable-sslv2-and-sslv3.patch \
- %D%/packages/patches/w3m-disable-weak-ciphers.patch \
%D%/packages/patches/weechat-python.patch \
%D%/packages/patches/weex-vacopy.patch \
%D%/packages/patches/wicd-bitrate-none-fix.patch \
diff --git a/gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch b/gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch
deleted file mode 100644
index 5b78f2d..0000000
--- a/gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-Subject: Disable SSLv2 and SSLv3.
-
-The only remaining methods are TLSv1.* (the code never distinguishes
-between TLSv1.0, TLSv1.1, and TLSv1.2).
----
- fm.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/fm.h b/fm.h
-index 320906c..ddcd4fc 100644
---- a/fm.h
-+++ b/fm.h
-@@ -1144,7 +1144,7 @@ global int ssl_path_modified init(FALSE);
- #endif /* defined(USE_SSL) &&
- * defined(USE_SSL_VERIFY) */
- #ifdef USE_SSL
--global char *ssl_forbid_method init(NULL);
-+global char *ssl_forbid_method init("2, 3");
- #endif
-
- global int is_redisplay init(FALSE);
---
-2.6.4
-
diff --git a/gnu/packages/patches/w3m-disable-weak-ciphers.patch b/gnu/packages/patches/w3m-disable-weak-ciphers.patch
deleted file mode 100644
index 4780d54..0000000
--- a/gnu/packages/patches/w3m-disable-weak-ciphers.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-Subject: Disable weak ciphers
-
-Disable RC4, "export ciphers", and all keys < 128 bits.
-
-Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/w3m/+bug/1325674
----
- url.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/url.c b/url.c
-index ed6062e..e86b1f3 100644
---- a/url.c
-+++ b/url.c
-@@ -326,6 +326,7 @@ openSSLHandle(int sock, char *hostname, char **p_cert)
- SSL_load_error_strings();
- if (!(ssl_ctx = SSL_CTX_new(SSLv23_client_method())))
- goto eend;
-+ SSL_CTX_set_cipher_list(ssl_ctx, "DEFAULT:!LOW:!RC4:!EXP");
- option = SSL_OP_ALL;
- if (ssl_forbid_method) {
- if (strchr(ssl_forbid_method, '2'))
---
-2.6.4
-
diff --git a/gnu/packages/patches/w3m-force-ssl_verify_server-on.patch b/gnu/packages/patches/w3m-force-ssl_verify_server-on.patch
deleted file mode 100644
index dc9f117..0000000
--- a/gnu/packages/patches/w3m-force-ssl_verify_server-on.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-Subject: Force ssl_verify_server on.
-
-By default, SSL/TLS certificates are not verified. This enables the
-verification.
----
- fm.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/fm.h b/fm.h
-index 8378939..320906c 100644
---- a/fm.h
-+++ b/fm.h
-@@ -1135,7 +1135,7 @@ global int view_unseenobject init(TRUE);
- #endif
-
- #if defined(USE_SSL) && defined(USE_SSL_VERIFY)
--global int ssl_verify_server init(FALSE);
-+global int ssl_verify_server init(TRUE);
- global char *ssl_cert_file init(NULL);
- global char *ssl_key_file init(NULL);
- global char *ssl_ca_path init(NULL);
---
-2.6.4
-
diff --git a/gnu/packages/patches/w3m-libgc.patch b/gnu/packages/patches/w3m-libgc.patch
deleted file mode 100644
index 0dc6a40..0000000
--- a/gnu/packages/patches/w3m-libgc.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-This patch fixes w3m compilation with libgc > 7.2.
-
-Reported:
-https://bugs.archlinux.org/task/33397
-
-Patch with explanation:
-http://anonscm.debian.org/cgit/collab-maint/w3m.git/commit/?id=770eec8304bdbe458
----
- main.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/main.c b/main.c
-index b421943..249eb1a 100644
---- a/main.c
-+++ b/main.c
-@@ -833,7 +833,8 @@ main(int argc, char **argv, char **envp)
- mySignal(SIGPIPE, SigPipe);
- #endif
-
-- orig_GC_warn_proc = GC_set_warn_proc(wrap_GC_warn_proc);
-+ orig_GC_warn_proc = GC_get_warn_proc();
-+ GC_set_warn_proc(wrap_GC_warn_proc);
- err_msg = Strnew();
- if (load_argc == 0) {
- /* no URL specified */
---
-2.6.4
-
diff --git a/gnu/packages/w3m.scm b/gnu/packages/w3m.scm
index e7dd583..80171de 100644
--- a/gnu/packages/w3m.scm
+++ b/gnu/packages/w3m.scm
@@ -1,6 +1,7 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
;;; Copyright © 2016 Leo Famulari <leo@famulari.name>
+;;; Copyright © 2016 Kei Kebreau <kei@openmailbox.org>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -28,7 +29,7 @@
#:use-module (gnu packages tls)
#:use-module (gnu packages)
#:use-module (guix packages)
- #:use-module (guix download)
+ #:use-module (guix git-download)
#:use-module (guix build-system gnu))
(define-public w3m
@@ -36,33 +37,16 @@
(name "w3m")
(version "0.5.3")
(source (origin
- (method url-fetch)
- (uri (string-append "mirror://sourceforge/" name "/" name "/"
- name "-" version "/"
- name "-" version ".tar.gz"))
- (sha256
- (base32
- "1qx9f0kprf92r1wxl3sacykla0g04qsi0idypzz24b7xy9ix5579"))
-
- ;; cf. https://bugs.archlinux.org/task/33397
- (patches (search-patches "w3m-libgc.patch"
- "w3m-force-ssl_verify_server-on.patch"
- "w3m-disable-sslv2-and-sslv3.patch"
- "w3m-disable-weak-ciphers.patch"))))
+ (method git-fetch)
+ ;; Debian's fork of w3m is the only one that is still maintained.
+ (uri (git-reference
+ (url "https://anonscm.debian.org/cgit/collab-maint/w3m.git")
+ (commit "v0.5.3+git20161031")))
+ (sha256
+ (base32
+ "142vkkmsk76wj9w6r4y2pa1hmy1kkzmc73an9zchx0ikm2z92x6s"))))
(build-system gnu-build-system)
- (arguments `(#:tests? #f ; no check target
- #:phases (alist-cons-before
- 'configure 'fix-perl
- (lambda _
- ;; https://launchpad.net/bugs/935540
- ;; 'struct file_handle' is used by 'glibc'
- (substitute* '("istream.c" "istream.h")
- (("struct[[:blank:]]+file_handle")
- "struct w3m_file_handle"))
- (substitute* '("scripts/w3mmail.cgi.in"
- "scripts/dirlist.cgi.in")
- (("@PERL@") (which "perl"))))
- %standard-phases)))
+ (arguments `(#:tests? #f)) ; no check target
(inputs
`(("libgc" ,libgc)
("ncurses" ,ncurses)
--
2.10.2
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 800 bytes --]
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m.
2016-11-04 14:52 ` Kei Kebreau
@ 2016-11-04 15:48 ` Leo Famulari
2016-11-04 17:05 ` Kei Kebreau
0 siblings, 1 reply; 12+ messages in thread
From: Leo Famulari @ 2016-11-04 15:48 UTC (permalink / raw
To: Kei Kebreau; +Cc: guix-devel
[-- Attachment #1: Type: text/plain, Size: 3089 bytes --]
On Fri, Nov 04, 2016 at 10:52:55AM -0400, Kei Kebreau wrote:
> > Leo Famulari <leo@famulari.name> skribis:
> >> I think we build from their Git repo:
> >>
> >> https://anonscm.debian.org/cgit/collab-maint/w3m.git
> >>
> >> They even offer non-Debian-ized release tags, such as
> >> <v0.5.3+git20161031>.
> Here it is!
Thanks!
> From cc7a61d61160817ceb395b648b18c885175441e8 Mon Sep 17 00:00:00 2001
> From: Kei Kebreau <kei@openmailbox.org>
> Date: Fri, 4 Nov 2016 10:48:53 -0400
> Subject: [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m.
>
> Fixes some security issues seen here:
> <http://www.openwall.com/lists/oss-security/2016/11/03/3>
>
> * gnu/packages/w3m.scm (w3m): Switch to Debian's actively maintained
> fork of w3m.
No need to rewrite the commit title here :)
> [source]: Use Debian's git tree. Remove obsolete patches.
> [arguments]: Remove unnecessary modification of %standard-phases.
> * gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch: Delete file.
> * gnu/packages/patches/w3m-disable-weak-ciphers.patch: Delete file.
> * gnu/packages/patches/w3m-force-ssl_verify_server-on.patch: Delete file.
> * gnu/packages/patches/w3m-libgc.patch: Delete file.
Or:
* gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch,
gnu/packages/patches/w3m-disable-weak-ciphers.patch,
gnu/packages/patches/w3m-force-ssl_verify_server-on.patch,
gnu/packages/patches/w3m-libgc.patch: Delete files.
By the way, I double-checked that all these patches are indeed
integrated into the release tag used by this package definition.
> (define-public w3m
> @@ -36,33 +37,16 @@
> (name "w3m")
> (version "0.5.3")
This should reflect the tag used in (commit).
> (source (origin
> - (method url-fetch)
> - (uri (string-append "mirror://sourceforge/" name "/" name "/"
> - name "-" version "/"
> - name "-" version ".tar.gz"))
> - (sha256
> - (base32
> - "1qx9f0kprf92r1wxl3sacykla0g04qsi0idypzz24b7xy9ix5579"))
> -
> - ;; cf. https://bugs.archlinux.org/task/33397
> - (patches (search-patches "w3m-libgc.patch"
> - "w3m-force-ssl_verify_server-on.patch"
> - "w3m-disable-sslv2-and-sslv3.patch"
> - "w3m-disable-weak-ciphers.patch"))))
> + (method git-fetch)
> + ;; Debian's fork of w3m is the only one that is still maintained.
> + (uri (git-reference
> + (url "https://anonscm.debian.org/cgit/collab-maint/w3m.git")
> + (commit "v0.5.3+git20161031")))
> - (substitute* '("scripts/w3mmail.cgi.in"
> - "scripts/dirlist.cgi.in")
> - (("@PERL@") (which "perl"))))
Does this @PERL@ get patched correctly?
Thanks for taking this on!
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 801 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m.
2016-11-04 15:48 ` Leo Famulari
@ 2016-11-04 17:05 ` Kei Kebreau
2016-11-04 23:54 ` Leo Famulari
0 siblings, 1 reply; 12+ messages in thread
From: Kei Kebreau @ 2016-11-04 17:05 UTC (permalink / raw
To: Leo Famulari; +Cc: guix-devel
[-- Attachment #1.1: 0001-gnu-w3m-Switch-to-Debian-s-actively-maintained-fork-.patch --]
[-- Type: text/plain, Size: 10846 bytes --]
From 1eede14194c83b70725b6de062b9d3e0acce6340 Mon Sep 17 00:00:00 2001
From: Kei Kebreau <kei@openmailbox.org>
Date: Fri, 4 Nov 2016 12:43:28 -0400
Subject: [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m.
Fixes some security issues seen here:
<http://www.openwall.com/lists/oss-security/2016/11/03/3>
* gnu/packages/w3m.scm (w3m): Switch it.
[source]: Use Debian's git tree. Remove obsolete patches.
[arguments]: Remove unnecessary modification of %standard-phases.
* gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch,
gnu/packages/patches/w3m-disable-weak-ciphers.patch,
gnu/packages/patches/w3m-force-ssl_verify_server-on.patch,
gnu/packages/patches/w3m-libgc.patch: Delete files.
* gnu/local.mk (dist_patch_DATA): Remove them.
---
gnu/local.mk | 4 -
.../patches/w3m-disable-sslv2-and-sslv3.patch | 24 ------
.../patches/w3m-disable-weak-ciphers.patch | 24 ------
.../patches/w3m-force-ssl_verify_server-on.patch | 24 ------
gnu/packages/patches/w3m-libgc.patch | 28 -------
gnu/packages/w3m.scm | 89 ++++++++++------------
6 files changed, 42 insertions(+), 151 deletions(-)
delete mode 100644 gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch
delete mode 100644 gnu/packages/patches/w3m-disable-weak-ciphers.patch
delete mode 100644 gnu/packages/patches/w3m-force-ssl_verify_server-on.patch
delete mode 100644 gnu/packages/patches/w3m-libgc.patch
diff --git a/gnu/local.mk b/gnu/local.mk
index a23d536..a34d8ae 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -891,10 +891,6 @@ dist_patch_DATA = \
%D%/packages/patches/vte-CVE-2012-2738-pt1.patch \
%D%/packages/patches/vte-CVE-2012-2738-pt2.patch \
%D%/packages/patches/vtk-mesa-10.patch \
- %D%/packages/patches/w3m-libgc.patch \
- %D%/packages/patches/w3m-force-ssl_verify_server-on.patch \
- %D%/packages/patches/w3m-disable-sslv2-and-sslv3.patch \
- %D%/packages/patches/w3m-disable-weak-ciphers.patch \
%D%/packages/patches/weechat-python.patch \
%D%/packages/patches/weex-vacopy.patch \
%D%/packages/patches/wicd-bitrate-none-fix.patch \
diff --git a/gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch b/gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch
deleted file mode 100644
index 5b78f2d..0000000
--- a/gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-Subject: Disable SSLv2 and SSLv3.
-
-The only remaining methods are TLSv1.* (the code never distinguishes
-between TLSv1.0, TLSv1.1, and TLSv1.2).
----
- fm.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/fm.h b/fm.h
-index 320906c..ddcd4fc 100644
---- a/fm.h
-+++ b/fm.h
-@@ -1144,7 +1144,7 @@ global int ssl_path_modified init(FALSE);
- #endif /* defined(USE_SSL) &&
- * defined(USE_SSL_VERIFY) */
- #ifdef USE_SSL
--global char *ssl_forbid_method init(NULL);
-+global char *ssl_forbid_method init("2, 3");
- #endif
-
- global int is_redisplay init(FALSE);
---
-2.6.4
-
diff --git a/gnu/packages/patches/w3m-disable-weak-ciphers.patch b/gnu/packages/patches/w3m-disable-weak-ciphers.patch
deleted file mode 100644
index 4780d54..0000000
--- a/gnu/packages/patches/w3m-disable-weak-ciphers.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-Subject: Disable weak ciphers
-
-Disable RC4, "export ciphers", and all keys < 128 bits.
-
-Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/w3m/+bug/1325674
----
- url.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/url.c b/url.c
-index ed6062e..e86b1f3 100644
---- a/url.c
-+++ b/url.c
-@@ -326,6 +326,7 @@ openSSLHandle(int sock, char *hostname, char **p_cert)
- SSL_load_error_strings();
- if (!(ssl_ctx = SSL_CTX_new(SSLv23_client_method())))
- goto eend;
-+ SSL_CTX_set_cipher_list(ssl_ctx, "DEFAULT:!LOW:!RC4:!EXP");
- option = SSL_OP_ALL;
- if (ssl_forbid_method) {
- if (strchr(ssl_forbid_method, '2'))
---
-2.6.4
-
diff --git a/gnu/packages/patches/w3m-force-ssl_verify_server-on.patch b/gnu/packages/patches/w3m-force-ssl_verify_server-on.patch
deleted file mode 100644
index dc9f117..0000000
--- a/gnu/packages/patches/w3m-force-ssl_verify_server-on.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-Subject: Force ssl_verify_server on.
-
-By default, SSL/TLS certificates are not verified. This enables the
-verification.
----
- fm.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/fm.h b/fm.h
-index 8378939..320906c 100644
---- a/fm.h
-+++ b/fm.h
-@@ -1135,7 +1135,7 @@ global int view_unseenobject init(TRUE);
- #endif
-
- #if defined(USE_SSL) && defined(USE_SSL_VERIFY)
--global int ssl_verify_server init(FALSE);
-+global int ssl_verify_server init(TRUE);
- global char *ssl_cert_file init(NULL);
- global char *ssl_key_file init(NULL);
- global char *ssl_ca_path init(NULL);
---
-2.6.4
-
diff --git a/gnu/packages/patches/w3m-libgc.patch b/gnu/packages/patches/w3m-libgc.patch
deleted file mode 100644
index 0dc6a40..0000000
--- a/gnu/packages/patches/w3m-libgc.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-This patch fixes w3m compilation with libgc > 7.2.
-
-Reported:
-https://bugs.archlinux.org/task/33397
-
-Patch with explanation:
-http://anonscm.debian.org/cgit/collab-maint/w3m.git/commit/?id=770eec8304bdbe458
----
- main.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/main.c b/main.c
-index b421943..249eb1a 100644
---- a/main.c
-+++ b/main.c
-@@ -833,7 +833,8 @@ main(int argc, char **argv, char **envp)
- mySignal(SIGPIPE, SigPipe);
- #endif
-
-- orig_GC_warn_proc = GC_set_warn_proc(wrap_GC_warn_proc);
-+ orig_GC_warn_proc = GC_get_warn_proc();
-+ GC_set_warn_proc(wrap_GC_warn_proc);
- err_msg = Strnew();
- if (load_argc == 0) {
- /* no URL specified */
---
-2.6.4
-
diff --git a/gnu/packages/w3m.scm b/gnu/packages/w3m.scm
index e7dd583..8b8a33a 100644
--- a/gnu/packages/w3m.scm
+++ b/gnu/packages/w3m.scm
@@ -1,6 +1,7 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
;;; Copyright © 2016 Leo Famulari <leo@famulari.name>
+;;; Copyright © 2016 Kei Kebreau <kei@openmailbox.org>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -28,56 +29,50 @@
#:use-module (gnu packages tls)
#:use-module (gnu packages)
#:use-module (guix packages)
- #:use-module (guix download)
+ #:use-module (guix git-download)
#:use-module (guix build-system gnu))
(define-public w3m
- (package
- (name "w3m")
- (version "0.5.3")
- (source (origin
- (method url-fetch)
- (uri (string-append "mirror://sourceforge/" name "/" name "/"
- name "-" version "/"
- name "-" version ".tar.gz"))
- (sha256
- (base32
- "1qx9f0kprf92r1wxl3sacykla0g04qsi0idypzz24b7xy9ix5579"))
-
- ;; cf. https://bugs.archlinux.org/task/33397
- (patches (search-patches "w3m-libgc.patch"
- "w3m-force-ssl_verify_server-on.patch"
- "w3m-disable-sslv2-and-sslv3.patch"
- "w3m-disable-weak-ciphers.patch"))))
- (build-system gnu-build-system)
- (arguments `(#:tests? #f ; no check target
- #:phases (alist-cons-before
- 'configure 'fix-perl
- (lambda _
- ;; https://launchpad.net/bugs/935540
- ;; 'struct file_handle' is used by 'glibc'
- (substitute* '("istream.c" "istream.h")
- (("struct[[:blank:]]+file_handle")
- "struct w3m_file_handle"))
- (substitute* '("scripts/w3mmail.cgi.in"
- "scripts/dirlist.cgi.in")
- (("@PERL@") (which "perl"))))
- %standard-phases)))
- (inputs
- `(("libgc" ,libgc)
- ("ncurses" ,ncurses)
- ("openssl" ,openssl)
- ("zlib" ,zlib)))
- (native-inputs
- `(("gettext" ,gnu-gettext)
- ("perl" ,perl)
- ("pkg-config" ,pkg-config)))
- (home-page "http://w3m.sourceforge.net/")
- (synopsis "Text-mode web browser")
- (description
- "w3m is a text-based web browser as well as a pager like 'more' or
+ (let ((commit "5cf75248f5833db00d53a33c30a525bb40f5512b")
+ (revision "1")) ; Guix package revision
+ (package
+ (name "w3m")
+ (version (string-append "0.5.3-" revision "." (string-take commit 7)))
+ (source (origin
+ (method git-fetch)
+ ;; Debian's fork of w3m is the only one that is still
+ ;; maintained.
+ (uri (git-reference
+ (url "https://anonscm.debian.org/cgit/collab-maint/w3m.git")
+ (commit commit)))
+ (file-name (string-append "w3m-" version "-checkout"))
+ (sha256
+ (base32
+ "142vkkmsk76wj9w6r4y2pa1hmy1kkzmc73an9zchx0ikm2z92x6s"))))
+ (build-system gnu-build-system)
+ (arguments `(#:tests? #f ; no check target
+ #:phases (alist-cons-before
+ 'configure 'fix-perl
+ (lambda _
+ (substitute* '("scripts/w3mmail.cgi.in"
+ "scripts/dirlist.cgi.in")
+ (("@PERL@") (which "perl"))))
+ %standard-phases)))
+ (inputs
+ `(("libgc" ,libgc)
+ ("ncurses" ,ncurses)
+ ("openssl" ,openssl)
+ ("zlib" ,zlib)))
+ (native-inputs
+ `(("gettext" ,gnu-gettext)
+ ("perl" ,perl)
+ ("pkg-config" ,pkg-config)))
+ (home-page "http://w3m.sourceforge.net/")
+ (synopsis "Text-mode web browser")
+ (description
+ "w3m is a text-based web browser as well as a pager like 'more' or
'less'. With w3m you can browse web pages through a terminal emulator
window. Moreover, w3m can be used as a text formatting tool which
typesets HTML into plain text.")
- (license (x11-style "file://doc/README"
- "See 'doc/README' in the distribution."))))
+ (license (x11-style "file://doc/README"
+ "See 'doc/README' in the distribution.")))))
--
2.10.2
[-- Attachment #1.2: Type: text/plain, Size: 3399 bytes --]
Updated patch attached!
Leo Famulari <leo@famulari.name> writes:
> On Fri, Nov 04, 2016 at 10:52:55AM -0400, Kei Kebreau wrote:
>
> Thanks!
>
>> From cc7a61d61160817ceb395b648b18c885175441e8 Mon Sep 17 00:00:00 2001
>> From: Kei Kebreau <kei@openmailbox.org>
>> Date: Fri, 4 Nov 2016 10:48:53 -0400
>> Subject: [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m.
>>
>> Fixes some security issues seen here:
>> <http://www.openwall.com/lists/oss-security/2016/11/03/3>
>>
>> * gnu/packages/w3m.scm (w3m): Switch to Debian's actively maintained
>> fork of w3m.
>
> No need to rewrite the commit title here :)
>
Got it. :)
>> [source]: Use Debian's git tree. Remove obsolete patches.
>> [arguments]: Remove unnecessary modification of %standard-phases.
>> * gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch: Delete file.
>> * gnu/packages/patches/w3m-disable-weak-ciphers.patch: Delete file.
>> * gnu/packages/patches/w3m-force-ssl_verify_server-on.patch: Delete file.
>> * gnu/packages/patches/w3m-libgc.patch: Delete file.
>
> Or:
> * gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch,
> gnu/packages/patches/w3m-disable-weak-ciphers.patch,
> gnu/packages/patches/w3m-force-ssl_verify_server-on.patch,
> gnu/packages/patches/w3m-libgc.patch: Delete files.
>
Fixed.
> By the way, I double-checked that all these patches are indeed
> integrated into the release tag used by this package definition.
>
I checked, too! Nice to know that we're doubly safe.
>> (define-public w3m
>> @@ -36,33 +37,16 @@
>> (name "w3m")
>> (version "0.5.3")
>
> This should reflect the tag used in (commit).
>
I adjusted this according to what some other packages have done. Please
tell me if I did it correctly.
>> (source (origin
>> - (method url-fetch)
>> - (uri (string-append "mirror://sourceforge/" name "/" name "/"
>> - name "-" version "/"
>> - name "-" version ".tar.gz"))
>> - (sha256
>> - (base32
>> - "1qx9f0kprf92r1wxl3sacykla0g04qsi0idypzz24b7xy9ix5579"))
>> -
>> - ;; cf. https://bugs.archlinux.org/task/33397
>> - (patches (search-patches "w3m-libgc.patch"
>> - "w3m-force-ssl_verify_server-on.patch"
>> - "w3m-disable-sslv2-and-sslv3.patch"
>> - "w3m-disable-weak-ciphers.patch"))))
>> + (method git-fetch)
>> + ;; Debian's fork of w3m is the only one that is still maintained.
>> + (uri (git-reference
>> + (url "https://anonscm.debian.org/cgit/collab-maint/w3m.git")
>> + (commit "v0.5.3+git20161031")))
>
>> - (substitute* '("scripts/w3mmail.cgi.in"
>> - "scripts/dirlist.cgi.in")
>> - (("@PERL@") (which "perl"))))
>
> Does this @PERL@ get patched correctly?
>
No, it does not! I added the substitution back in. The other
substitution appears to be handled by Debian upstream.
> Thanks for taking this on!
You're welcome! It frees up other developers' time to handle larger
hacking targets than I can muster.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 800 bytes --]
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m.
2016-11-04 17:05 ` Kei Kebreau
@ 2016-11-04 23:54 ` Leo Famulari
2016-11-05 0:08 ` Kei Kebreau
0 siblings, 1 reply; 12+ messages in thread
From: Leo Famulari @ 2016-11-04 23:54 UTC (permalink / raw
To: Kei Kebreau; +Cc: guix-devel
[-- Attachment #1: Type: text/plain, Size: 1678 bytes --]
On Fri, Nov 04, 2016 at 01:05:02PM -0400, Kei Kebreau wrote:
> From 1eede14194c83b70725b6de062b9d3e0acce6340 Mon Sep 17 00:00:00 2001
> From: Kei Kebreau <kei@openmailbox.org>
> Date: Fri, 4 Nov 2016 12:43:28 -0400
> Subject: [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m.
>
> Fixes some security issues seen here:
> <http://www.openwall.com/lists/oss-security/2016/11/03/3>
>
> * gnu/packages/w3m.scm (w3m): Switch it.
> [source]: Use Debian's git tree. Remove obsolete patches.
> [arguments]: Remove unnecessary modification of %standard-phases.
> * gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch,
> gnu/packages/patches/w3m-disable-weak-ciphers.patch,
> gnu/packages/patches/w3m-force-ssl_verify_server-on.patch,
> gnu/packages/patches/w3m-libgc.patch: Delete files.
> * gnu/local.mk (dist_patch_DATA): Remove them.
> + (let ((commit "5cf75248f5833db00d53a33c30a525bb40f5512b")
> + (revision "1")) ; Guix package revision
> + (package
> + (name "w3m")
> + (version (string-append "0.5.3-" revision "." (string-take commit 7)))
> + (source (origin
> + (method git-fetch)
> + ;; Debian's fork of w3m is the only one that is still
> + ;; maintained.
> + (uri (git-reference
> + (url "https://anonscm.debian.org/cgit/collab-maint/w3m.git")
> + (commit commit)))
We can just use the Git tag as the version and the commit, like in this
stale package:
https://github.com/lfam/pkgs/blob/master/leo/packages/w3m-debian.scm
I think that's simpler.
Looks good with this change :)
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 801 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m.
2016-11-04 23:54 ` Leo Famulari
@ 2016-11-05 0:08 ` Kei Kebreau
2016-11-05 0:16 ` Leo Famulari
0 siblings, 1 reply; 12+ messages in thread
From: Kei Kebreau @ 2016-11-05 0:08 UTC (permalink / raw
To: Leo Famulari; +Cc: guix-devel
[-- Attachment #1.1: Type: text/plain, Size: 1784 bytes --]
Leo Famulari <leo@famulari.name> writes:
> On Fri, Nov 04, 2016 at 01:05:02PM -0400, Kei Kebreau wrote:
>> From 1eede14194c83b70725b6de062b9d3e0acce6340 Mon Sep 17 00:00:00 2001
>> From: Kei Kebreau <kei@openmailbox.org>
>> Date: Fri, 4 Nov 2016 12:43:28 -0400
>> Subject: [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m.
>>
>> Fixes some security issues seen here:
>> <http://www.openwall.com/lists/oss-security/2016/11/03/3>
>>
>> * gnu/packages/w3m.scm (w3m): Switch it.
>> [source]: Use Debian's git tree. Remove obsolete patches.
>> [arguments]: Remove unnecessary modification of %standard-phases.
>> * gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch,
>> gnu/packages/patches/w3m-disable-weak-ciphers.patch,
>> gnu/packages/patches/w3m-force-ssl_verify_server-on.patch,
>> gnu/packages/patches/w3m-libgc.patch: Delete files.
>> * gnu/local.mk (dist_patch_DATA): Remove them.
>
>> + (let ((commit "5cf75248f5833db00d53a33c30a525bb40f5512b")
>> + (revision "1")) ; Guix package revision
>> + (package
>> + (name "w3m")
>> + (version (string-append "0.5.3-" revision "." (string-take commit 7)))
>> + (source (origin
>> + (method git-fetch)
>> + ;; Debian's fork of w3m is the only one that is still
>> + ;; maintained.
>> + (uri (git-reference
>> + (url "https://anonscm.debian.org/cgit/collab-maint/w3m.git")
>> + (commit commit)))
>
> We can just use the Git tag as the version and the commit, like in this
> stale package:
>
> https://github.com/lfam/pkgs/blob/master/leo/packages/w3m-debian.scm
>
> I think that's simpler.
>
> Looks good with this change :)
Is this good?
[-- Attachment #1.2: 0001-gnu-w3m-Switch-to-Debian-s-actively-maintained-fork-.patch --]
[-- Type: text/plain, Size: 8806 bytes --]
From 674a0f955809d40c2fe3e5092b2927c4c96e8351 Mon Sep 17 00:00:00 2001
From: Kei Kebreau <kei@openmailbox.org>
Date: Fri, 4 Nov 2016 20:06:03 -0400
Subject: [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m.
Fixes some security issues seen here:
<http://www.openwall.com/lists/oss-security/2016/11/03/3>
* gnu/packages/w3m.scm (w3m): Switch it.
[source]: Use Debian's git tree. Remove obsolete patches.
[arguments]: Remove an unneeded substitute* function.
* gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch,
gnu/packages/patches/w3m-disable-weak-ciphers.patch,
gnu/packages/patches/w3m-force-ssl_verify_server-on.patch,
gnu/packages/patches/w3m-libgc.patch: Delete files.
* gnu/local.mk (dist_patch_DATA): Remove them.
---
gnu/local.mk | 4 ---
.../patches/w3m-disable-sslv2-and-sslv3.patch | 24 ----------------
.../patches/w3m-disable-weak-ciphers.patch | 24 ----------------
.../patches/w3m-force-ssl_verify_server-on.patch | 24 ----------------
gnu/packages/patches/w3m-libgc.patch | 28 ------------------
gnu/packages/w3m.scm | 33 +++++++++-------------
6 files changed, 13 insertions(+), 124 deletions(-)
delete mode 100644 gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch
delete mode 100644 gnu/packages/patches/w3m-disable-weak-ciphers.patch
delete mode 100644 gnu/packages/patches/w3m-force-ssl_verify_server-on.patch
delete mode 100644 gnu/packages/patches/w3m-libgc.patch
diff --git a/gnu/local.mk b/gnu/local.mk
index 27848ac..49b6721 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -891,10 +891,6 @@ dist_patch_DATA = \
%D%/packages/patches/vte-CVE-2012-2738-pt1.patch \
%D%/packages/patches/vte-CVE-2012-2738-pt2.patch \
%D%/packages/patches/vtk-mesa-10.patch \
- %D%/packages/patches/w3m-libgc.patch \
- %D%/packages/patches/w3m-force-ssl_verify_server-on.patch \
- %D%/packages/patches/w3m-disable-sslv2-and-sslv3.patch \
- %D%/packages/patches/w3m-disable-weak-ciphers.patch \
%D%/packages/patches/weechat-python.patch \
%D%/packages/patches/weex-vacopy.patch \
%D%/packages/patches/wicd-bitrate-none-fix.patch \
diff --git a/gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch b/gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch
deleted file mode 100644
index 5b78f2d..0000000
--- a/gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-Subject: Disable SSLv2 and SSLv3.
-
-The only remaining methods are TLSv1.* (the code never distinguishes
-between TLSv1.0, TLSv1.1, and TLSv1.2).
----
- fm.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/fm.h b/fm.h
-index 320906c..ddcd4fc 100644
---- a/fm.h
-+++ b/fm.h
-@@ -1144,7 +1144,7 @@ global int ssl_path_modified init(FALSE);
- #endif /* defined(USE_SSL) &&
- * defined(USE_SSL_VERIFY) */
- #ifdef USE_SSL
--global char *ssl_forbid_method init(NULL);
-+global char *ssl_forbid_method init("2, 3");
- #endif
-
- global int is_redisplay init(FALSE);
---
-2.6.4
-
diff --git a/gnu/packages/patches/w3m-disable-weak-ciphers.patch b/gnu/packages/patches/w3m-disable-weak-ciphers.patch
deleted file mode 100644
index 4780d54..0000000
--- a/gnu/packages/patches/w3m-disable-weak-ciphers.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-Subject: Disable weak ciphers
-
-Disable RC4, "export ciphers", and all keys < 128 bits.
-
-Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/w3m/+bug/1325674
----
- url.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/url.c b/url.c
-index ed6062e..e86b1f3 100644
---- a/url.c
-+++ b/url.c
-@@ -326,6 +326,7 @@ openSSLHandle(int sock, char *hostname, char **p_cert)
- SSL_load_error_strings();
- if (!(ssl_ctx = SSL_CTX_new(SSLv23_client_method())))
- goto eend;
-+ SSL_CTX_set_cipher_list(ssl_ctx, "DEFAULT:!LOW:!RC4:!EXP");
- option = SSL_OP_ALL;
- if (ssl_forbid_method) {
- if (strchr(ssl_forbid_method, '2'))
---
-2.6.4
-
diff --git a/gnu/packages/patches/w3m-force-ssl_verify_server-on.patch b/gnu/packages/patches/w3m-force-ssl_verify_server-on.patch
deleted file mode 100644
index dc9f117..0000000
--- a/gnu/packages/patches/w3m-force-ssl_verify_server-on.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-Subject: Force ssl_verify_server on.
-
-By default, SSL/TLS certificates are not verified. This enables the
-verification.
----
- fm.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/fm.h b/fm.h
-index 8378939..320906c 100644
---- a/fm.h
-+++ b/fm.h
-@@ -1135,7 +1135,7 @@ global int view_unseenobject init(TRUE);
- #endif
-
- #if defined(USE_SSL) && defined(USE_SSL_VERIFY)
--global int ssl_verify_server init(FALSE);
-+global int ssl_verify_server init(TRUE);
- global char *ssl_cert_file init(NULL);
- global char *ssl_key_file init(NULL);
- global char *ssl_ca_path init(NULL);
---
-2.6.4
-
diff --git a/gnu/packages/patches/w3m-libgc.patch b/gnu/packages/patches/w3m-libgc.patch
deleted file mode 100644
index 0dc6a40..0000000
--- a/gnu/packages/patches/w3m-libgc.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-This patch fixes w3m compilation with libgc > 7.2.
-
-Reported:
-https://bugs.archlinux.org/task/33397
-
-Patch with explanation:
-http://anonscm.debian.org/cgit/collab-maint/w3m.git/commit/?id=770eec8304bdbe458
----
- main.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/main.c b/main.c
-index b421943..249eb1a 100644
---- a/main.c
-+++ b/main.c
-@@ -833,7 +833,8 @@ main(int argc, char **argv, char **envp)
- mySignal(SIGPIPE, SigPipe);
- #endif
-
-- orig_GC_warn_proc = GC_set_warn_proc(wrap_GC_warn_proc);
-+ orig_GC_warn_proc = GC_get_warn_proc();
-+ GC_set_warn_proc(wrap_GC_warn_proc);
- err_msg = Strnew();
- if (load_argc == 0) {
- /* no URL specified */
---
-2.6.4
-
diff --git a/gnu/packages/w3m.scm b/gnu/packages/w3m.scm
index e7dd583..54d4a11 100644
--- a/gnu/packages/w3m.scm
+++ b/gnu/packages/w3m.scm
@@ -1,6 +1,7 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
;;; Copyright © 2016 Leo Famulari <leo@famulari.name>
+;;; Copyright © 2016 Kei Kebreau <kei@openmailbox.org>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -28,37 +29,29 @@
#:use-module (gnu packages tls)
#:use-module (gnu packages)
#:use-module (guix packages)
- #:use-module (guix download)
+ #:use-module (guix git-download)
#:use-module (guix build-system gnu))
(define-public w3m
(package
(name "w3m")
- (version "0.5.3")
+ (version "0.5.3+git20161031")
(source (origin
- (method url-fetch)
- (uri (string-append "mirror://sourceforge/" name "/" name "/"
- name "-" version "/"
- name "-" version ".tar.gz"))
- (sha256
- (base32
- "1qx9f0kprf92r1wxl3sacykla0g04qsi0idypzz24b7xy9ix5579"))
-
- ;; cf. https://bugs.archlinux.org/task/33397
- (patches (search-patches "w3m-libgc.patch"
- "w3m-force-ssl_verify_server-on.patch"
- "w3m-disable-sslv2-and-sslv3.patch"
- "w3m-disable-weak-ciphers.patch"))))
+ (method git-fetch)
+ ;; Debian's fork of w3m is the only one that is still
+ ;; maintained.
+ (uri (git-reference
+ (url "https://anonscm.debian.org/cgit/collab-maint/w3m.git")
+ (commit version)))
+ (file-name (string-append "w3m-" version "-checkout"))
+ (sha256
+ (base32
+ "142vkkmsk76wj9w6r4y2pa1hmy1kkzmc73an9zchx0ikm2z92x6s"))))
(build-system gnu-build-system)
(arguments `(#:tests? #f ; no check target
#:phases (alist-cons-before
'configure 'fix-perl
(lambda _
- ;; https://launchpad.net/bugs/935540
- ;; 'struct file_handle' is used by 'glibc'
- (substitute* '("istream.c" "istream.h")
- (("struct[[:blank:]]+file_handle")
- "struct w3m_file_handle"))
(substitute* '("scripts/w3mmail.cgi.in"
"scripts/dirlist.cgi.in")
(("@PERL@") (which "perl"))))
--
2.10.2
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 800 bytes --]
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m.
2016-11-05 0:08 ` Kei Kebreau
@ 2016-11-05 0:16 ` Leo Famulari
0 siblings, 0 replies; 12+ messages in thread
From: Leo Famulari @ 2016-11-05 0:16 UTC (permalink / raw
To: Kei Kebreau; +Cc: guix-devel
[-- Attachment #1: Type: text/plain, Size: 885 bytes --]
On Fri, Nov 04, 2016 at 08:08:13PM -0400, Kei Kebreau wrote:
> Is this good?
> From 674a0f955809d40c2fe3e5092b2927c4c96e8351 Mon Sep 17 00:00:00 2001
> From: Kei Kebreau <kei@openmailbox.org>
> Date: Fri, 4 Nov 2016 20:06:03 -0400
> Subject: [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m.
>
> Fixes some security issues seen here:
> <http://www.openwall.com/lists/oss-security/2016/11/03/3>
>
> * gnu/packages/w3m.scm (w3m): Switch it.
> [source]: Use Debian's git tree. Remove obsolete patches.
> [arguments]: Remove an unneeded substitute* function.
> * gnu/packages/patches/w3m-disable-sslv2-and-sslv3.patch,
> gnu/packages/patches/w3m-disable-weak-ciphers.patch,
> gnu/packages/patches/w3m-force-ssl_verify_server-on.patch,
> gnu/packages/patches/w3m-libgc.patch: Delete files.
> * gnu/local.mk (dist_patch_DATA): Remove them.
LGTM!
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 801 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2016-11-05 0:16 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-11-03 22:54 [PATCH] gnu: w3m: Switch to Debian's actively maintained fork of w3m Kei Kebreau
2016-11-04 3:17 ` Eric Bavier
2016-11-04 4:03 ` Leo Famulari
2016-11-04 13:27 ` Ludovic Courtès
2016-11-04 13:59 ` Kei Kebreau
2016-11-04 14:52 ` Kei Kebreau
2016-11-04 15:48 ` Leo Famulari
2016-11-04 17:05 ` Kei Kebreau
2016-11-04 23:54 ` Leo Famulari
2016-11-05 0:08 ` Kei Kebreau
2016-11-05 0:16 ` Leo Famulari
-- strict thread matches above, loose matches on Subject: below --
2016-11-03 22:08 Kei Kebreau
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/guix.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.