aboutsummaryrefslogtreecommitdiffstats
path: root/debian/patches/020_debian.patch
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--debian/patches/020_debian.patch11826
1 files changed, 11826 insertions, 0 deletions
diff --git a/debian/patches/020_debian.patch b/debian/patches/020_debian.patch
new file mode 100644
index 0000000..a53d97c
--- /dev/null
+++ b/debian/patches/020_debian.patch
@@ -0,0 +1,11826 @@
+Description: Git master branch of Debian's w3m
+Origin: http://anonscm.debian.org/cgit/collab-maint/w3m.git
+
+diff --git a/ChangeLog b/ChangeLog
+index 88358ef..7629962 100644
+--- a/ChangeLog
++++ b/ChangeLog
+@@ -1,3 +1,605 @@
++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/
++
++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
++ Patch to support SGR 1006 mouse reporting, from [w3m-dev 04466]
++ on 2012-07-15.
++
++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" for pager
++ 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
++
+ 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..8fa799e 100644
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -150,7 +150,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
+@@ -250,7 +250,7 @@ install-po:
+ (cd $$subdir && $(MAKE) install); \
+ done
+
+-all-scripts:
++all-scripts: funcname.tab
+ for dir in $(SCRIPTSUBDIRS); \
+ do \
+ (cd $$dir && $(MAKE) $(MAKE_ARGS)); \
+diff --git a/Str.c b/Str.c
+index e5a0982..eff82a4 100644
+--- a/Str.c
++++ b/Str.c
+@@ -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';
+diff --git a/acinclude.m4 b/acinclude.m4
+index e4ccc3d..60705f4 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`])
+ #
+ # ----------------------------------------------------------------
+@@ -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..a353bb9 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);
+ }
+
+@@ -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/config.guess b/config.guess
+index 51fab47..1f5c50c 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-2014 Free Software Foundation, Inc.
+
+-timestamp='2004-03-12'
++timestamp='2014-03-23'
+
+ # 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.
+ #
+-# 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;hb=HEAD
+ #
+-# The plan is that this can be called by configure scripts if you
+-# don't specify an explicit build system type.
++# Please send patches with a ChangeLog entry 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-2014 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
+@@ -158,6 +175,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
++ sh5el) machine=sh5le-unknown ;;
+ *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+@@ -166,7 +184,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ arm*|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 +194,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ fi
+ ;;
+ *)
+- os=netbsd
++ os=netbsd
+ ;;
+ esac
+ # The OS release
+@@ -196,71 +214,34 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ # 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 ;;
++ 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 ;;
+ *: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 ;;
+ 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
+@@ -306,40 +287,46 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ # 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 ;;
++ # 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 +334,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,10 +387,10 @@ 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
+@@ -396,10 +402,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 +415,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 +473,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 +515,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 +545,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,15 +560,19 @@ 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
+@@ -574,28 +585,28 @@ EOF
+ 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,52 +615,52 @@ 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" ;;
++ 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
++ 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`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+@@ -657,9 +668,19 @@ EOF
+ esac
+ 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"
+ else
+@@ -667,11 +688,11 @@ EOF
+ 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 +720,345 @@ 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_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 '[A-Z]' '[a-z]'``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 ;;
++ 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 ;;
+ 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}-unknown-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 +1066,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 +1093,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 configury 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,68 +1180,109 @@ 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 ;;
+ 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
+@@ -1209,22 +1290,28 @@ EOF
+ 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
+@@ -1235,183 +1322,55 @@ EOF
+ 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 ;;
+ 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 +1378,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;hb=HEAD
++and
++ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+ 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.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..bba4efb 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-2014 Free Software Foundation, Inc.
+
+-timestamp='2004-03-12'
++timestamp='2014-09-11'
+
+-# 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 with a ChangeLog entry 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;hb=HEAD
++
+ # 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.
+@@ -70,8 +68,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-2014 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 +80,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 +96,7 @@ while test $# -gt 0 ; do
+ *local*)
+ # First pass through any local machine types.
+ echo $1
+- exit 0;;
++ exit ;;
+
+ * )
+ break ;;
+@@ -118,11 +115,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* | \
++ 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 +149,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 +170,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 +197,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 +218,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 +248,109 @@ 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 \
++ | be32 | be64 \
++ | bfin \
++ | c4x | c8051 | clipper \
+ | d10v | d30v | dlx | dsp16xx \
+- | fr30 | frv \
++ | epiphany \
++ | fido | fr30 | frv \
+ | 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[34]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 \
+ | 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
++ ;;
++ 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 +366,86 @@ 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-* \
++ | be32-* | be64-* \
++ | bfin-* | bs2000-* \
++ | c[123]* | c30-* | [cjt]90-* | c4x-* \
++ | c8051-* | clipper-* | craynv-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+ | elxsi-* \
+- | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
++ | 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-* \
++ | 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-* \
+ | 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 +463,7 @@ case $basic_machine in
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+- abacus)
++ abacus)
+ basic_machine=abacus-unknown
+ ;;
+ adobe68k)
+@@ -409,6 +509,10 @@ case $basic_machine in
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
++ aros)
++ basic_machine=i386-pc
++ os=-aros
++ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+@@ -417,10 +521,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 +574,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 +617,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 +736,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 +774,14 @@ case $basic_machine in
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
++ 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 +793,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 +821,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 +829,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 +916,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 +929,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 +952,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 +969,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 +1004,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 +1032,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 +1066,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 +1081,9 @@ case $basic_machine in
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
++ sh5el)
++ basic_machine=sh5le-unknown
++ ;;
+ sh64)
+ basic_machine=sh64-unknown
+ ;;
+@@ -901,6 +1105,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 +1164,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 +1228,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 +1246,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 +1269,9 @@ case $basic_machine in
+ romp)
+ basic_machine=romp-ibm
+ ;;
++ mmix)
++ basic_machine=mmix-knuth
++ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+@@ -1075,13 +1288,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 +1335,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 +1361,31 @@ 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* \
+ | -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* \
+ | -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* | -tirtos*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -qnx*)
+@@ -1185,7 +1403,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 +1424,7 @@ case $os in
+ -opened*)
+ os=-openedition
+ ;;
+- -os400*)
++ -os400*)
+ os=-os400
+ ;;
+ -wince*)
+@@ -1255,7 +1473,7 @@ case $os in
+ -sinix*)
+ os=-sysv4
+ ;;
+- -tpf*)
++ -tpf*)
+ os=-tpf
+ ;;
+ -triton*)
+@@ -1291,8 +1509,13 @@ case $os in
+ -aros*)
+ os=-aros
+ ;;
+- -kaos*)
+- os=-kaos
++ -zvmoe)
++ os=-zvmoe
++ ;;
++ -dicos*)
++ os=-dicos
++ ;;
++ -nacl*)
+ ;;
+ -none)
+ ;;
+@@ -1316,6 +1539,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 +1554,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 +1590,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 +1615,15 @@ case $basic_machine in
+ *-be)
+ os=-beos
+ ;;
++ *-haiku)
++ os=-haiku
++ ;;
+ *-ibm)
+ os=-aix
+ ;;
++ *-knuth)
++ os=-mmixware
++ ;;
+ *-wec)
+ os=-proelf
+ ;;
+@@ -1476,7 +1726,7 @@ case $basic_machine in
+ -sunos*)
+ vendor=sun
+ ;;
+- -aix*)
++ -cnk*|-aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+@@ -1539,7 +1789,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..c721825 100755
+--- a/configure
++++ b/configure
+@@ -1490,7 +1490,7 @@ Optional Packages:
+ --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;}
+@@ -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;
+ }
+@@ -9084,7 +9085,8 @@ _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"
+
+diff --git a/cookie.c b/cookie.c
+index 8020f6d..c11649c 100644
+--- a/cookie.c
++++ b/cookie.c
+@@ -247,7 +247,7 @@ 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;
+@@ -463,7 +463,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 : "",
+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-jp/MANUAL.html b/doc-jp/MANUAL.html
+index 41d70f1..a8623e2 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œȘλ»ț€ËĄ€°ÊÁ°€ÎČèÌÌ€ËÌá€é€Ê€€Ą„
+@@ -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..670ed5f 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 „Ő„Ą„€„ëÌŸ
+diff --git a/doc-jp/README.siteconf b/doc-jp/README.siteconf
+new file mode 100644
+index 0000000..58b51c7
+--- /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 "http://twitter.com/#!/"
++substitute_url "http://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/w3m.1 b/doc-jp/w3m.1
+index 89aacb6..099a803 100644
+--- a/doc-jp/w3m.1
++++ b/doc-jp/w3m.1
+@@ -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
+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..8353f33 100644
+--- a/doc/MANUAL.html
++++ b/doc/MANUAL.html
+@@ -55,12 +55,10 @@ If you don't specify this option,
+ <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>-O charset
++<dd>Specify display/output charset.
++<dt>-I charset
++<dd>Specify document charset.
+ <dt>-T type
+ <dd>Specify document type. Without this option, document type
+ is determined from extension of a file. If the determination
+@@ -90,7 +88,7 @@ It is useful when reading E-mail or NetNews messages.
+ <dd>Monochrome display mode.
+ <dt>-F
+ <dd>Automatically render frame.
+-<dt>-S
++<dt>-s
+ <dd>Squeeze blank lines.
+ <dt>-X
+ <dd>Upon exit, do not display preserved screen.
+@@ -468,8 +466,7 @@ and <a href="keymap.lynx">keymap.lynx</a>) as examples.
+ 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>
++bookmark registration and helper-app editor
+ are realized as local CGI scripts.
+ Using local CGI, w3m can be used as a general purpose form interface.
+ <P>
+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.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..f173087
+--- /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 "http://twitter.com/#!/"
++substitute_url "http://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/w3m.1 b/doc/w3m.1
+index 8f071c6..0762f51 100644
+--- a/doc/w3m.1
++++ b/doc/w3m.1
+@@ -1,13 +1,11 @@
+ .nr N -1
+ .nr D 5
+-.TH W3M 1 Local
++.TH W3M 1 "2014-11-29"
+ .UC 4
+ .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 +15,285 @@ 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 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(CW Variable: 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 config 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 config 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 -show-option
+ .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
++This is the \fIw3m\fP 0.5.3 Release.
++.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..709a0c1 100644
+--- a/file.c
++++ b/file.c
+@@ -47,11 +47,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;
+@@ -215,7 +215,6 @@ currentLn(Buffer *buf)
+
+ static Buffer *
+ loadSomething(URLFile *f,
+- char *path,
+ Buffer *(*loadproc) (URLFile *, Buffer *), Buffer *defaultbuf)
+ {
+ Buffer *buf;
+@@ -223,17 +222,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 +489,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 +677,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;
+@@ -1697,13 +1681,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 +1716,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 +1864,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 +2023,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 +2124,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 +2194,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 +2219,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 +2268,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 +2451,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 +2469,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 +2713,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, *hidden = NULL;
+
+ #ifdef DEBUG
+ if (w3m_debug) {
+@@ -2761,6 +2745,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 +2802,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 +3014,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->ptr,
++ obuf->input_alt.type->ptr,
++ 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 +3232,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 +3326,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 +3345,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 +3383,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 +3415,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)
+@@ -3732,6 +3744,63 @@ 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;
++
++ 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, 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 +4153,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))
+@@ -4284,15 +4354,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';
+ }
+@@ -4861,7 +4931,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++;
+@@ -4970,6 +5068,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 +5175,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 +5436,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 +5637,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 +5733,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 +5754,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 +5804,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 +5891,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 +5941,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 +5963,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 +5977,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
+@@ -5929,7 +6062,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 &&
+@@ -5982,7 +6115,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 +6890,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 +6931,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 +7112,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 +7134,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,7 +7198,7 @@ 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);
+@@ -7060,6 +7210,12 @@ loadHTMLstream(URLFile *f, Buffer *newBuf, FILE * src, int 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 +7252,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 +7272,7 @@ loadHTMLString(Str page)
+ #endif
+
+ TRAP_OFF;
++ UFclose(&f);
+ newBuf->topLine = newBuf->firstLine;
+ newBuf->lastLine = newBuf->currentLine;
+ newBuf->currentLine = newBuf->firstLine;
+@@ -7207,7 +7365,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);
+ }
+
+@@ -7331,6 +7489,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 +7497,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 +7528,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 +7738,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 +7770,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 +7789,6 @@ openGeneralPagerBuffer(InputStream stream)
+ }
+ }
+ buf->real_type = t;
+- buf->currentURL.scheme = SCM_LOCAL;
+- buf->currentURL.file = "-";
+ return buf;
+ }
+
+@@ -7766,6 +7924,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 +7962,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 +7993,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 +8026,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 +8075,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 +8091,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 +8110,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);
+@@ -8317,21 +8475,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 */
+diff --git a/fm.h b/fm.h
+index 8378939..8f594dc 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;
+@@ -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
+@@ -972,6 +998,7 @@ 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);
+@@ -1065,7 +1092,7 @@ 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
+@@ -1135,7 +1162,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 +1171,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..62b568e 100644
+--- a/form.c
++++ b/form.c
+@@ -196,7 +196,7 @@ formtype(char *typestr)
+ if (!strcasecmp(typestr, _formtypetbl[i]))
+ return i;
+ }
+- return FORM_UNKNOWN;
++ return FORM_INPUT_TEXT;
+ }
+
+ void
+@@ -787,7 +787,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 +796,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 +826,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 +867,7 @@ loadPreForm(void)
+ return;
+ while (1) {
+ char *p, *s, *arg;
++ Regex *re_arg;
+
+ line = Strfgets(fp);
+ if (line->length == 0)
+@@ -890,18 +883,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 +908,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..48c2d72 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 ||
+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..e9be09b 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=\"");
+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..b4b3df9 100644
+--- a/html.h
++++ b/html.h
+@@ -1,19 +1,17 @@
+ /* $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 UFfileno(f) ISfileno((f)->stream)
+
+@@ -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..3126142 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
+@@ -645,6 +624,7 @@ basic_close(int *handle)
+ #else
+ close(*(int *)handle);
+ #endif
++ xfree(handle);
+ }
+
+ static int
+@@ -658,13 +638,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 +663,7 @@ ssl_close(struct ssl_handle *handle)
+ close(handle->sock);
+ if (handle->ssl)
+ SSL_free(handle->ssl);
++ xfree(handle);
+ }
+
+ static int
+@@ -717,38 +699,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/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/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/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..5e78b4e 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;
+ }
+
+diff --git a/linein.c b/linein.c
+index b7e81b6..572b015 100644
+--- a/linein.c
++++ b/linein.c
+@@ -1026,7 +1026,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 +1045,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..9428319 100644
+--- a/local.c
++++ b/local.c
+@@ -109,6 +109,7 @@ loadLocalDir(char *dname)
+ n++;
+ }
+ }
++ closedir(d);
+
+ if (multicolList) {
+ l = COLS / (maxlen + 2);
+@@ -359,6 +360,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,7 +378,14 @@ 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);
++ /* Don't invoke gc after here, or the program might crash in some platforms */
+ if (pid < 0)
+ return NULL;
+ else if (pid) {
+@@ -383,8 +395,6 @@ localcgi_post(char *uri, char *qstr, FormList *request, char *referer)
+ }
+ 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,11 +425,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/main.c b/main.c
+index b421943..d37b243 100644
+--- a/main.c
++++ b/main.c
+@@ -11,6 +11,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 +122,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 +205,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");
+@@ -248,7 +255,11 @@ 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");
++#endif
+ fprintf(f, " -W toggle wrap search mode\n");
+ fprintf(f, " -X don't use termcap init/deinit\n");
+ fprintf(f,
+@@ -372,6 +383,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 +415,11 @@ 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();
++ GC_set_oom_fn(die_oom);
+ #if defined(ENABLE_NLS) || (defined(USE_M17N) && defined(HAVE_LANGINFO_CODESET))
+ setlocale(LC_ALL, "");
+ #endif
+@@ -418,6 +440,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 +556,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 +688,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 +737,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 +773,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 +870,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 +904,12 @@ main(int argc, char **argv, char **envp)
+ mySignal(SIGPIPE, SigPipe);
+ #endif
+
++#if 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 +970,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 +1009,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 +1024,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;
+@@ -1246,6 +1325,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 +1351,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);
+ }
+ }
+ }
+@@ -1566,6 +1653,18 @@ 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 page")
++{
++ nscroll(searchKeyNum() * (Currentbuf->LINES / 2 - 1), B_NORMAL);
++}
++
++/* Move half page backward */
++DEFUN(hpgBack, PREV_HALF_PAGE, "Scroll up half page")
++{
++ nscroll(-searchKeyNum() * (Currentbuf->LINES / 2 - 1), B_NORMAL);
++}
++
+ /* 1 line up */
+ DEFUN(lup1, UP, "Scroll up one line")
+ {
+@@ -1844,6 +1943,10 @@ 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);
+@@ -2261,7 +2364,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
+@@ -2804,12 +2907,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)
+@@ -3568,6 +3674,33 @@ 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")
+ {
+@@ -4055,6 +4188,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 +4198,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 +4208,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 +4217,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 +4241,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);
+@@ -4510,8 +4637,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);
+@@ -4570,7 +4696,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);
+@@ -5398,6 +5524,58 @@ 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);
++
++ 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 (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)
+@@ -5604,7 +5782,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 +5849,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 +5925,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
+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>&nbsp;&nbsp;<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&nbsp;<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..0f66583 100644
+--- a/menu.c
++++ b/menu.c
+@@ -1365,9 +1365,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;
+ }
+@@ -1513,9 +1511,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 +1841,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)
+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/parsetagx.c b/parsetagx.c
+index 6b627d2..3435f9f 100644
+--- a/parsetagx.c
++++ b/parsetagx.c
+@@ -221,6 +221,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..ade7ca2 100644
+--- a/po/LINGUAS
++++ b/po/LINGUAS
+@@ -1,2 +1,2 @@
+ # Set of available languages.
+-ja
++ja de
+diff --git a/po/de.po b/po/de.po
+new file mode 100644
+index 0000000..5e84022
+--- /dev/null
++++ b/po/de.po
+@@ -0,0 +1,903 @@
++# German translation of w3m
++# Copyright (C) 2014 Fumitoshi UKAI
++# 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: 2010-08-20 18:44+0900\n"
++"PO-Revision-Date: 2014-10-19 11:15+0200\n"
++"Last-Translator: Markus Hiereth <markus.hiereth@freenet.de>\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:267
++msgid " Back (b) "
++msgstr " ZurĂŒck (b) "
++
++#: menu.c:268
++msgid " Select Buffer(s) "
++msgstr " Puffer auswÀhlen (s) "
++
++#: menu.c:270
++msgid " Select Tab (t) "
++msgstr " Reiter auswÀhlen (t) "
++
++#: menu.c:272
++msgid " View Source (v) "
++msgstr " Codeansicht (v) "
++
++#: menu.c:273
++msgid " Edit Source (e) "
++msgstr " Code bearbeiten (e) "
++
++#: menu.c:274
++msgid " Save Source (S) "
++msgstr " Code speichern (S) "
++
++#: menu.c:275
++msgid " Reload (r) "
++msgstr " Erneut laden (r) "
++
++#: menu.c:276 menu.c:283 menu.c:287
++msgid " ---------------- "
++msgstr " ---------------------- "
++
++#: menu.c:277
++msgid " Go Link (a) "
++msgstr " Ziel öffnen.. (a) "
++
++#: menu.c:278
++msgid " on New Tab (n) "
++msgstr " ..in neuem Reiter (n) "
++
++#: menu.c:279
++msgid " Save Link (A) "
++msgstr " Ziel speichern (A) "
++
++#: menu.c:280
++msgid " View Image (i) "
++msgstr " Bild anzeigen (i) "
++
++#: menu.c:281
++msgid " Save Image (I) "
++msgstr " Bild speichern (I) "
++
++#: menu.c:282
++msgid " View Frame (f) "
++msgstr " Frames zeigen (f) "
++
++#: menu.c:284
++msgid " Bookmark (B) "
++msgstr " Lesezeichen (B) "
++
++#: menu.c:285
++msgid " Help (h) "
++msgstr " Hilfe (h) "
++
++#: menu.c:286
++msgid " Option (o) "
++msgstr " Einstellungen (o) "
++
++#: menu.c:288
++msgid " Quit (q) "
++msgstr " Programm verlassen (q) "
++
++#: rc.c:60
++msgid "External Viewer Setup"
++msgstr "Konfiguration fĂŒr externe Anzeigeprogramme"
++
++#: rc.c:61
++msgid "Tab width in characters"
++msgstr "Tabulatorbreite in Zeichen"
++
++#: rc.c:62
++msgid "Indent for HTML rendering"
++msgstr "Einzug bei HTML-Darstellung"
++
++#: rc.c:63
++msgid "Number of pixels per character (4.0...32.0)"
++msgstr "Anzahl von Pixeln pro Zeichen (4.0 bis 32.0)"
++
++#: rc.c:64
++msgid "Number of pixels per line (4.0...64.0)"
++msgstr "Anzahl von Pixeln pro Zeile (4.0 bis 64.0)"
++
++#: rc.c:65
++#entsprechend Bescheibung aus MANUAL.html, mh 14.10.2014
++msgid "Number of remembered lines when used as a pager"
++msgstr "Anzahl gemerkter, ĂŒber die Standardeingabe erhaltener Zeilen"
++
++#: rc.c:66
++msgid "Use URL history"
++msgstr "URL-Chronik verwenden"
++
++#: rc.c:67
++msgid "Number of remembered URL"
++msgstr "Anzahl von URLs in Chronik"
++
++#: rc.c:68
++msgid "Save URL history"
++msgstr "URL-Chronik speichern"
++
++#: rc.c:69
++msgid "Render frames automatically"
++msgstr "Frames selbststÀndig darstellen"
++
++#: rc.c:70
++msgid "Treat argument without scheme as URL"
++msgstr "Eingabe ohne Protokoll-PrÀfix als URL auffassen"
++
++#: rc.c:71
++msgid "Use _self as default target"
++msgstr "_self als Standard-Zielfenster verwenden"
++
++#: rc.c:72
++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:73
++msgid "Open download list panel on new tab"
++msgstr "Downloadliste in neuem Reiter öffnen"
++
++#: rc.c:74
++msgid "Display link URL automatically"
++msgstr "URL der Links selbststÀndig anzeigen"
++
++#: rc.c:75
++msgid "Display link numbers"
++msgstr "Linknummern anzeigen"
++
++#: rc.c:76
++msgid "Display decoded URL"
++msgstr "URL entschlĂŒsselt anzeigen"
++
++#: rc.c:77
++msgid "Display current line number"
++msgstr "Aktuelle Zeilennummer anzeigen"
++
++#: rc.c:78
++msgid "Display inline images"
++msgstr "Eingebettete Bilder anzeigen"
++
++#: rc.c:79
++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:81
++msgid "Load inline images automatically"
++msgstr "Eingebettete Bilder selbststÀndig laden"
++
++#: rc.c:82
++msgid "Maximum processes for parallel image loading"
++msgstr "Anzahl zulÀssiger Prozesse zum gleichzeitigen Laden von Bildern"
++
++#: rc.c:83
++msgid "Use external image viewer"
++msgstr "Externen Bildbetrachter verwenden"
++
++#: rc.c:84
++msgid "Scale of image (%)"
++msgstr "Bilder prozentual skalieren"
++
++#: rc.c:85
++msgid "External command to display image"
++msgstr "Befehl fĂŒr externen Bildbetrachter"
++
++#: rc.c:86
++msgid "Use link list of image map"
++msgstr "Bei Grafiken mit eingebetteten Links Ziele auflisten"
++
++#: rc.c:88
++msgid "Display file names in multi-column format"
++msgstr "Dateinamen auf Spalten verteilt anzeigen"
++
++#: rc.c:89
++msgid "Use ASCII equivalents to display entities"
++msgstr "ASCII-Ersatz fĂŒr in HTML benannte Zeichen verwenden"
++
++#: rc.c:90
++msgid "Character type for border of table and menu"
++msgstr "Zeichen zum Einrahmen von Tabellen und MenĂŒs"
++
++#: rc.c:91
++msgid "Fold lines in TEXTAREA"
++msgstr "In Eingabefeldern vom Typ TEXTAREA Texte umbrechen"
++
++#: rc.c:92
++msgid "Display INS, DEL, S and STRIKE element"
++msgstr "Umsetzung der Elemente INS, DEL, S und STRIKE"
++
++#: rc.c:93
++msgid "Display with color"
++msgstr "In Farbe anzeigen"
++
++#: rc.c:94
++msgid "Color of normal character"
++msgstr "Farbe fĂŒr normalen Text"
++
++#: rc.c:95
++msgid "Color of anchor"
++msgstr "Farbe fĂŒr Links / Element A"
++
++#: rc.c:96
++msgid "Color of image link"
++msgstr "Farbe fĂŒr Bilder / Element IMG"
++
++#: rc.c:97
++msgid "Color of form"
++msgstr "Farbe fĂŒr Eingaben / Element INPUT"
++
++#: rc.c:98
++msgid "Enable coloring of active link"
++msgstr "Aktiven Link farblich hervorheben"
++
++#: rc.c:99
++msgid "Color of currently active link"
++msgstr "Farbe des derzeit aktiven Links "
++
++#: rc.c:100
++msgid "Use visited link color"
++msgstr "Besuchte Links farblich hervorheben"
++
++#: rc.c:101
++msgid "Color of visited link"
++msgstr "Farbe fĂŒr besuchte Links"
++
++#: rc.c:102
++msgid "Color of background"
++msgstr "Hintergrundfarbe"
++
++#: rc.c:103
++msgid "Color of mark"
++msgstr "Farbe fĂŒr Textmarken"
++#msgstr "Farbe fĂŒr Textmarkierungen"
++
++#: rc.c:104
++msgid "Use proxy"
++msgstr "Proxy verwenden"
++
++#: rc.c:105
++msgid "URL of HTTP proxy host"
++msgstr "URL des HTTP-Proxy-Hosts"
++
++#: rc.c:107
++msgid "URL of HTTPS proxy host"
++msgstr "URL des HTTPS-Proxy-Hosts"
++
++#: rc.c:110
++msgid "URL of GOPHER proxy host"
++msgstr "URL des GOPHER-Proxy-Hosts"
++
++#: rc.c:112
++msgid "URL of FTP proxy host"
++msgstr "URL des FTP-Proxy-Hosts"
++
++#: rc.c:113
++msgid "Domains to be accessed directly (no proxy)"
++msgstr "Ohne Proxy, direkt zu kontaktierende Domains"
++
++#: rc.c:114
++msgid "Check noproxy by network address"
++msgstr "Direkten Datentransfer ohne Proxy mittels Netzwerkadresse sicherstellen"
++
++#: rc.c:115
++msgid "Disable cache"
++msgstr "Zwischenspeicherung deaktivieren"
++
++#: rc.c:117
++msgid "News server"
++msgstr "News-Server"
++
++#: rc.c:118
++msgid "Mode of news server"
++msgstr "Modus des News-Servers"
++
++#: rc.c:119
++msgid "Number of news messages"
++msgstr "News-Anzahl"
++
++#: rc.c:121
++msgid "Order of name resolution"
++msgstr "Reihenfolge der Namens-Auflösung"
++
++#: rc.c:122
++msgid "Directory corresponding to / (document root)"
++msgstr "Wurzelverzeichnis fĂŒr Dokumente (/)"
++
++#: rc.c:123
++msgid "Directory corresponding to /~user"
++msgstr "Pfad zum Benutzerverzeichnis (~)"
++
++#: rc.c:124
++msgid "Directory corresponding to /cgi-bin"
++msgstr "Verzeichnis fĂŒr ausfĂŒhrbare Skripte (cgi-bin)"
++
++#: rc.c:125
++msgid "Confirm when quitting with q"
++msgstr "Das Programm erst nach BestÀtigung verlassen"
++
++#: rc.c:126
++msgid "Close tab if buffer is last when back"
++msgstr "Reiter mit nur einem Puffer auf ZurĂŒck-Befehl hin schließen"
++
++#: rc.c:128
++msgid "Enable mark operations"
++msgstr "Arbeit mit Textmarken ermöglichen"
++#msgstr "Arbeit mit Textmarkierungen ermöglichen"
++
++#: rc.c:130
++msgid "Enable Emacs-style line editing"
++msgstr "Zeilen wie in Emacs bearbeiten"
++
++#: rc.c:131
++msgid "Enable vi-like numeric prefix"
++msgstr "Vorangestellte Zahlen wie in vi aktivieren"
++
++#: rc.c:132
++msgid "Move cursor to top line when going to label"
++msgstr "Labels nach Aufsuchen immer oben positionieren"
++
++#: rc.c:133
++msgid "Move cursor to top line when moving to next page"
++msgstr "Beim UmblÀttern Eingabemarke nach oben setzen"
++
++#: rc.c:134
++msgid "Fold lines of plain text file"
++msgstr "Zeilen in Textdateien umbrechen"
++
++#: rc.c:135
++msgid "Show line numbers"
++msgstr "Zeilennummern anzeigen"
++
++#: rc.c:136
++msgid "Show search string"
++msgstr "Suchbegriff anzeigen"
++
++#: rc.c:137
++msgid "List of mime.types files"
++msgstr "Liste der mime.types-Dateien"
++
++#: rc.c:138
++msgid "List of mailcap files"
++msgstr "Liste der mailcap-Dateien"
++
++#: rc.c:139
++msgid "List of urimethodmap files"
++msgstr "Liste von Dateien mit URI-Methode-Zuordnungen"
++
++#: rc.c:140
++msgid "Editor"
++msgstr "Editor"
++
++#: rc.c:141
++msgid "Mailer"
++msgstr "Mail-Programm"
++
++#: rc.c:142
++# korrespondiert mit Pulldown-MenĂŒ, daher verkĂŒrzt. mh 09.10.2014
++msgid "How to call Mailer for mailto URLs with options"
++msgstr "Umgang mit mailto-URLs"
++
++#: rc.c:143
++msgid "External Browser"
++msgstr "Externer Browser"
++
++#: rc.c:144
++msgid "Second External Browser"
++msgstr "Zweiter externer Browser"
++
++#: rc.c:145
++msgid "Third External Browser"
++msgstr "Dritter externer Browser"
++
++#: rc.c:146
++# entsprechend file:///usr/share/doc/w3m/README.passwd
++# PrĂŒfung beanstandete auch passwd_file mit Zugriffbytes 600, mh, 05.10.2014
++msgid "Disable secret file security check"
++msgstr "Keine PrĂŒfung der Sicherheit bei Dateien mit geheimem Inhalt"
++
++#: rc.c:147
++msgid "Password file"
++msgstr "Passwort-Datei"
++
++#: rc.c:148
++msgid "File for setting form on loading"
++msgstr "Datei mit vordefinierten Eingaben fĂŒr Formulare"
++
++#: rc.c:149
++msgid "Password for anonymous FTP (your mail address)"
++msgstr "Passwort fĂŒr anonyme FTP-Anmeldung (Ihre Mailadresse)"
++
++#: rc.c:150
++msgid "Generate domain part of password for FTP"
++msgstr "Domain-Teil des FTP-Passwortes erzeugen"
++
++#: rc.c:151
++msgid "User-Agent identification string"
++msgstr "Browserkennung ĂŒbermitteln"
++
++#: rc.c:152
++msgid "Accept-Encoding header"
++msgstr "Accept-Encoding-Kopfzeile"
++
++#: rc.c:153
++msgid "Accept header"
++msgstr "Accept-Kopfzeile"
++
++#: rc.c:154
++msgid "Accept-Language header"
++msgstr "Accept-Language-Kopfzeile"
++
++#: rc.c:155
++msgid "Treat URL-like strings as links in all pages"
++msgstr "URL-artige Zeichenketten auf allen Seiten als Links auffassen"
++
++#: rc.c:156
++msgid "Wrap search"
++msgstr "Im Dokument umlaufend suchen"
++
++#: rc.c:157
++msgid "Display unseen objects (e.g. bgimage tag)"
++msgstr "Nicht gezeigte Objekte melden (z.B. Hintergrundbild)"
++
++#: rc.c:158
++msgid "Uncompress compressed data automatically when downloading"
++msgstr "Komprimierte Daten beim Download selbststÀndig dekomprimieren"
++
++#: rc.c:160
++# String nicht in Optionen-MenĂŒ gefunden. mh, 05.10.2014
++msgid "Run external viewer in a separate session"
++msgstr "Externe Anzeigeprogramme in eigener Sitzung laufen lassen"
++
++#: rc.c:162
++msgid "Run external viewer in the background"
++msgstr "Externe Anzeigeprogramme im Hintergrund laufen lassen"
++
++#: rc.c:164
++msgid "Use external program for directory listing"
++msgstr "Externes Programm zum Auflisten von Verzeichnissen verwenden"
++
++#: rc.c:165
++msgid "URL of directory listing command"
++msgstr "URL des Befehls zum Auflisten von Verzeichnissen"
++
++#: rc.c:167
++msgid "Enable dictionary lookup through CGI"
++msgstr "Wörterbuchabfrage mittels CGI aktivieren"
++
++#: rc.c:168
++msgid "URL of dictionary lookup command"
++msgstr "URL des Befehls zur Wörterbuch-Abfrage"
++
++#: rc.c:170
++msgid "Display link name for images lacking ALT"
++msgstr "Bei Bildern ohne ALT-Angabe Linkziel anzeigen"
++
++#: rc.c:171
++msgid "Index file for directories"
++msgstr "Indexdatei fĂŒr Verzeichnisse"
++
++#: rc.c:172
++msgid "Prepend http:// to URL automatically"
++msgstr "Ziel-Eingaben gegebenenfalls http:// voranstellen"
++
++#: rc.c:173
++msgid "Default value for open-URL command"
++msgstr "Vorgabewert bei der Adresseneingabe"
++
++#: rc.c:174
++msgid "Decode Content-Transfer-Encoding when saving"
++msgstr "Beim Speichern entsprechend Content-Transfer-Encoding entschlĂŒsseln"
++
++#: rc.c:175
++msgid "Preserve timestamp when saving"
++msgstr "Zeitstempel beim Speichern erhalten"
++
++#: rc.c:177
++msgid "Enable mouse"
++msgstr "Maus aktivieren"
++
++#: rc.c:178
++msgid "Scroll in reverse direction of mouse drag"
++msgstr "Mausbewegungen entgegengesetzt scrollen"
++
++#: rc.c:179
++msgid "Behavior of wheel scroll speed"
++msgstr "Umsetzung der Mausradbewegung"
++
++#: rc.c:180
++msgid "(A only)Scroll by # (%) of screen"
++msgstr "(nur A) Um # % des Fensters scrollen"
++
++#: rc.c:181
++msgid "(B only)Scroll by # lines"
++msgstr "(nur B) Um # Zeilen scrollen"
++
++#: rc.c:183
++msgid "Free memory of undisplayed buffers"
++msgstr "Speicherplatz nicht angezeigter Puffer freigeben"
++
++#: rc.c:184
++msgid "Suppress `Referer:' header"
++msgstr "Referer-Kopfzeile unterdrĂŒcken"
++
++#: rc.c:185
++msgid "Search case-insensitively"
++msgstr "Groß- und Kleinschreibung beim Suchen ignorieren"
++
++#: rc.c:186
++msgid "Use LESSOPEN"
++msgstr "LESSOPEN verwenden"
++
++#: rc.c:189
++msgid "Perform SSL server verification"
++msgstr "SSL-Server-Verifizierung durchfĂŒhren"
++
++#: rc.c:190
++msgid "PEM encoded certificate file of client"
++msgstr "PEM-kodierte Zertifikatsdatei des Clients"
++
++#: rc.c:191
++msgid "PEM encoded private key file of client"
++msgstr "PEM-kodierte private SchlĂŒsseldatei des Clients"
++
++#: rc.c:192
++msgid "Path to directory for PEM encoded certificates of CAs"
++msgstr "Pfad zum Verzeichnis fĂŒr PEM-kodierte Zertifikate von CAs"
++
++#: rc.c:193
++msgid "File consisting of PEM encoded certificates of CAs"
++msgstr "Datei mit PEM-kodierten Zertifikaten von CAs"
++
++#: rc.c:195
++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:198
++msgid "Enable cookie processing"
++msgstr "Cookie-Verarbeitung aktivieren"
++
++#: rc.c:199
++msgid "Print a message when receiving a cookie"
++msgstr "Den Empfang von Cookies melden"
++
++#: rc.c:200
++msgid "Accept cookies"
++msgstr "Cookies akzeptieren"
++
++#: rc.c:201
++msgid "Action to be taken on invalid cookie"
++msgstr "Reaktion auf ungĂŒltiges Cookie"
++
++#: rc.c:202
++msgid "Domains to reject cookies from"
++msgstr "Domains, deren Cookies abzulehnen sind"
++
++#: rc.c:203
++msgid "Domains to accept cookies from"
++msgstr "Domains, deren Cookies akzeptiert werden"
++
++#: rc.c:204
++# Variable vom Typ String im Abschnitt Cookies-Einstellungen, mh 10.10.2014
++#, fuzzy
++msgid "Domains to avoid [wrong number of dots]"
++msgstr "Zu meidende Domains (falsche Anzahl von Punkten)"
++
++#: rc.c:206
++msgid "Number of redirections to follow"
++msgstr "Anzahl zu akzeptierender Umleitungen"
++
++# Konfigurationsvariable vom Typ string, mh, 05.10.2014
++#: rc.c:207
++msgid "Enable processing of meta-refresh tag"
++msgstr "Meta-Refresh-Element verarbeiten"
++
++#: rc.c:210
++msgid "Enable Migemo (Roma-ji search)"
++msgstr "Romaji-Suche mittels Migemo aktivieren"
++
++#: rc.c:211
++msgid "Migemo command"
++msgstr "Migemo-Befehl"
++
++#: rc.c:215
++msgid "Display charset"
++msgstr "Zeichenkodierung der Anzeige"
++
++#: rc.c:216
++msgid "Default document charset"
++msgstr "Zeichenkodierungs-Vorgabe fĂŒr Dokumente"
++
++#: rc.c:217
++msgid "Automatic charset detect when loading"
++msgstr "SelbststÀndige Erkennung der Zeichenkodierung beim Laden"
++
++#: rc.c:218
++msgid "System charset"
++msgstr "Zeichenkodierung des Systems"
++
++#: rc.c:219
++msgid "System charset follows locale(LC_CTYPE)"
++msgstr "Zeichenkodierung des Systems entsprechend Locale (LC_CTYPE)"
++
++#: rc.c:220
++# war zuvor
++# msgstr "Halfdump mit der zur Anzeige benutzten Zeichenkodierung exportieren"
++msgid "Output halfdump with display charset"
++msgstr "Halfdump in der zur Anzeige benutzten Kodierung"
++
++#: rc.c:221
++# Konfigurationsvariable vom Typ boolean, mh, 05.10.2014
++#, fuzzy
++msgid "Use multi column characters"
++msgstr "SpaltenĂŒbergreifende Zeichen verwenden"
++
++#: rc.c:222
++msgid "Use combining characters"
++msgstr "Kombinationszeichen verwenden"
++
++#: rc.c:223
++msgid "Use double width for some Unicode characters"
++msgstr "Einzelnen Unicode-Zeichen zwei Spalten einrÀumen"
++
++#: rc.c:224
++msgid "Use Unicode language tags"
++msgstr "Unicode-Sprach-Tags verwenden"
++
++#: rc.c:225
++msgid "Charset conversion using Unicode map"
++msgstr "Zeichen in Unicode kodieren"
++
++#: rc.c:226
++msgid "Charset conversion when loading"
++msgstr "Zeichenkodierung beim Laden anpassen"
++
++#: rc.c:227
++msgid "Adjust search string for document charset"
++msgstr "Zu suchende Zeichenkette der Kodierung des Dokumentes anpassen"
++
++#: rc.c:228
++msgid "Fix character width when conversion"
++msgstr "Bei Umwandlung an der Breite von Zeichen festhalten"
++
++#: rc.c:229
++msgid "Use GB 12345 Unicode map instead of GB 2312's"
++msgstr "GB-12345-Unicode statt GB 2312 verwenden"
++
++#: rc.c:230
++msgid "Use JIS X 0201 Roman for ISO-2022-JP"
++msgstr "JIS X 0201 Roman statt ISO-2022-JP verwenden"
++
++#: rc.c:231
++msgid "Use JIS C 6226:1978 for ISO-2022-JP"
++msgstr "JIS C 6226:1978 statt ISO-2022-JP verwenden"
++
++#: rc.c:232
++msgid "Use JIS X 0201 Katakana"
++msgstr "JIS X 0201 Katakana verwenden"
++
++#: rc.c:233
++msgid "Use JIS X 0212:1990 (Supplemental Kanji)"
++msgstr "JIS X 0212:1990 verwenden (ergÀnzendes Kanji)"
++
++#: rc.c:234
++msgid "Use JIS X 0213:2000 (2000JIS)"
++msgstr "JIS X 0213:2000 verwenden (2000JIS)"
++
++#: rc.c:235
++msgid "Strict ISO-2022-JP/KR/CN"
++msgstr "Striktes ISO-2022-JP/KR/CN"
++
++#: rc.c:236
++msgid "Treat 4 bytes char. of GB18030 as Unicode"
++msgstr "4-Byte-Zeichen von GB 18030 als Unicode auffassen"
++
++#: rc.c:237
++msgid "Simple Preserve space"
++msgstr "Einfache Platzerhaltung"
++
++#: rc.c:240
++msgid "keymap file"
++msgstr "Tastaturbelegungs-Datei"
++
++#: rc.c:257
++msgid "black"
++msgstr "schwarz"
++
++#: rc.c:258
++msgid "red"
++msgstr "rot"
++
++#: rc.c:259
++msgid "green"
++msgstr "grĂŒn"
++
++#: rc.c:260
++msgid "yellow"
++msgstr "gelb"
++
++#: rc.c:261
++msgid "blue"
++msgstr "blau"
++
++#: rc.c:262
++msgid "magenta"
++msgstr "magenta"
++
++#: rc.c:263
++msgid "cyan"
++msgstr "cyan"
++
++#: rc.c:264
++msgid "white"
++msgstr "weiß"
++
++#: rc.c:265
++msgid "terminal"
++msgstr "wie Terminal"
++
++#: rc.c:284
++msgid "none"
++msgstr "keiner"
++
++#: rc.c:285
++msgid "current URL"
++msgstr "aktuelle URL"
++
++#: rc.c:286
++msgid "link URL"
++msgstr "Link-URL"
++
++#: rc.c:291
++msgid "simple"
++msgstr "einfach"
++
++#: rc.c:292
++msgid "use tag"
++msgstr "durch Tags"
++
++#: rc.c:293
++msgid "fontify"
++msgstr "hervorgehoben"
++
++#: rc.c:299
++msgid "A:relative to screen height"
++msgstr "A: relativ zu Fensterhöhe"
++
++#: rc.c:300
++msgid "B:fixed speed"
++msgstr "B: feste Geschwindigkeit"
++
++#: rc.c:307
++msgid "unspecified"
++msgstr "nicht spezifiziert"
++
++#: rc.c:308
++msgid "inet inet6"
++msgstr "inet inet6"
++
++#: rc.c:309
++msgid "inet6 inet"
++msgstr "inet6 inet"
++
++#: rc.c:310
++msgid "inet only"
++msgstr "nur inet"
++
++#: rc.c:311
++msgid "inet6 only"
++msgstr "nur inet6"
++
++#: rc.c:318
++msgid "discard"
++msgstr "verwerfen"
++
++#: rc.c:320
++msgid "accept"
++msgstr "annehmen"
++
++#: rc.c:322
++msgid "ask"
++msgstr "nachfragen"
++
++#: rc.c:329
++# gehört zu rc.c:142
++# erscheint in Pulldown-MenĂŒ, daher verkĂŒrzt. mh 09.10.2014
++msgid "use internal mailer instead"
++msgstr "Mail intern erstellen"
++
++#: rc.c:331
++# gehört zu rc.c:142
++# erscheint in Pulldown-MenĂŒ, daher verkĂŒrzt. mh 09.10.2014
++msgid "ignore options and use only the address"
++msgstr "Optionen ignorieren"
++
++#: rc.c:332
++# gehört zu rc.c:142
++# erscheint in Pulldown-MenĂŒ, daher verkĂŒrzt. mh 09.10.2014
++msgid "use full mailto URL"
++msgstr "komplett verwenden"
++
++#: rc.c:341
++msgid "OFF"
++msgstr "AUS"
++
++#: rc.c:342
++msgid "Only ISO 2022"
++msgstr "Nur ISO-2022"
++
++#: rc.c:343
++msgid "ON"
++msgstr "AN"
++
++#: rc.c:349
++# Wert aus einem Set zur Wiedergabe von RĂ€ndern, mh, 05.10.2014
++msgid "ASCII"
++msgstr "ASCII"
++
++#: rc.c:350
++# Wert aus einem Set zur Wiedergabe von RĂ€ndern, mh, 05.10.2014
++# hier ist "Zeichensatz" akzeptabel mh, 09.10.2014
++msgid "charset specific"
++msgstr "zeichensatzspezifisch"
++
++#: rc.c:351
++# Wert aus einem Set zur Wiedergabe von RĂ€ndern, mh, 05.10.2014
++msgid "DEC special graphics"
++msgstr "mit DEC-Grafiken"
++
++#: rc.c:714
++msgid "Display Settings"
++msgstr "Einstellungen zur Anzeige"
++
++#: rc.c:716
++msgid "Color Settings"
++msgstr "Farbeinstellungen"
++
++#: rc.c:718
++msgid "Miscellaneous Settings"
++msgstr "Weitere Einstellungen"
++
++#: rc.c:719
++msgid "Directory Settings"
++msgstr "Verzeichnis-Einstellungen"
++
++#: rc.c:720
++msgid "External Program Settings"
++msgstr "Einstellungen fĂŒr externe Programme"
++
++#: rc.c:721
++msgid "Network Settings"
++msgstr "Netzwerk-Einstellungen"
++
++#: rc.c:722
++msgid "Proxy Settings"
++msgstr "Proxy-Einstellungen"
++
++#: rc.c:724
++msgid "SSL Settings"
++msgstr "SSL-Einstellungen"
++
++#: rc.c:727
++msgid "Cookie Settings"
++msgstr "Cookie-Einstellungen"
++
++#: rc.c:730
++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:1209
++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..c16557a 100644
+--- a/po/ja.po
++++ b/po/ja.po
+@@ -12,7 +12,7 @@ msgstr ""
+ "PO-Revision-Date: 2010-08-20 18:45+0900\n"
+ "Last-Translator: Fumitoshi UKAI <ukai@debian.or.jp>\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"
+@@ -407,6 +407,10 @@ msgid "File for setting form on loading"
+ msgstr "文曞èȘ­èŸŒæ™‚ăźăƒ•ă‚©ăƒŒăƒ èš­ćźšç”šăƒ•ă‚Ąă‚€ăƒ«"
+
+ #: rc.c:149
++msgid "File for preferences for each site"
++msgstr "ă‚”ă‚€ăƒˆćˆ„èš­ćźšăźăƒ•ă‚Ąă‚€ăƒ«"
++
++#: rc.c:149
+ msgid "Password for anonymous FTP (your mail address)"
+ msgstr "FTPぼパă‚čăƒŻăƒŒăƒ‰(æ™źé€šăŻè‡Ș戆ぼmail addressă‚’äœżă†)"
+
+diff --git a/proto.h b/proto.h
+index f8a7345..0d8beb5 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);
+@@ -723,6 +749,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 +814,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..3bf6cea 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;
+@@ -146,6 +148,7 @@ static int OptionEncode = FALSE;
+ #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")
+@@ -619,6 +622,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},
+@@ -1173,6 +1178,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 +1206,7 @@ sync_with_option(void)
+ #endif
+ loadPasswd();
+ loadPreForm();
++ loadSiteconf();
+
+ if (AcceptLang == NULL || *AcceptLang == '\0') {
+ /* TRANSLATORS:
+@@ -1556,3 +1564,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..5675d09 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) {
+diff --git a/scripts/w3mman/w3mman.1.in b/scripts/w3mman/w3mman.1.in
+index 1c0361d..1b1d990 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 "Nov 23, 2014"
+ .\" Please adjust this date whenever revising the manpage.
+ .\"
+ .\" Some roff macros, for reference:
+@@ -12,19 +12,19 @@
+ .\" .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
+ .B w3mman
+-.RI "[-M " path ] " " [ section ] " page"
++.RI "[\-M " path ] " " [ section ] " page"
+ .br
+ .B w3mman
+-.RI "[-M " path "] -k " keyword
++.RI "[\-M " path "] \-k " keyword
+ .br
+ .B w3mman
+-.RI -l " file
++.RI \-l " file
+ .SH DESCRIPTION
+ .B w3mman
+-is the system's manual pager by
++is a pager for manual pages, using
+ .BR w3m (1).
+ .SH OPTIONS
+ A summary of options is included below.
+@@ -42,6 +42,7 @@ Specify
+ Specify a
+ .I file.
+ .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 +52,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/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/\&/\&amp;/g;
+ s/\</\&lt;/g;
+ s/\>/\&gt;/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)*\&lt;)([\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..d376284 100644
+--- a/table.c
++++ b/table.c
+@@ -2878,6 +2878,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)
+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..79996f1 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,260 @@ writestr(char *s)
+
+ #define MOVE(line,column) writestr(tgoto(T_cm,column,line));
+
++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;
++}
++
+ #ifdef USE_MOUSE
+ #define W3M_TERM_INFO(name, title, mouse) name, title, mouse
+ #define NEED_XTERM_ON (1)
+@@ -634,7 +892,8 @@ reset_tty(void)
+ writestr(T_se); /* reset terminal */
+ flush_tty();
+ TerminalSet(tty, &d_ioval);
+- close_tty();
++ if (tty != 2)
++ close_tty();
+ }
+
+ static MySignalHandler
+@@ -2027,8 +2286,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..10089ca 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:!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;
+ 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', '/', '?', '#'] */
+@@ -829,7 +839,8 @@ parseURL(char *url, ParsedURL *p_url, ParsedURL *current)
+ 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 = NoSendReferer || (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;
+@@ -1603,7 +1638,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 +1680,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 +1720,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 +1784,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 +1792,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)
+@@ -2234,3 +2267,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/w3mbookmark.c b/w3mbookmark.c
+index 4355536..fcbad11 100644
+--- a/w3mbookmark.c
++++ b/w3mbookmark.c
+@@ -99,7 +99,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);
+ }
+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..7b6f23b 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,67 @@ 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) {
++#endif
+ if (fb_cmap_get(fbfp, cmap)) {
+ fprintf(stderr, "Can't get color map.\n");
+ fb_cmap_destroy(cmap);
+@@ -111,12 +215,20 @@ 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 ||
+ vscinfo.bits_per_pixel == 16 ||
+ 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");
+@@ -147,7 +259,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 +375,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 +460,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 +473,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 +501,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 +520,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 +544,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 +587,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 +621,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 +680,213 @@ 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);
++#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);
++#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);
++#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);
++#endif
++#if defined(__linux__)
+ if (!cmap->transp) {
++#elif defined(__FreeBSD__)
++ if (!cmap->transparent) {
++#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 +894,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 +955,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 +972,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 +1014,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 +1024,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 +1041,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..bc8d0aa 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,16 +121,21 @@ 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) {
+ #if defined(USE_GTK2)
+ g_type_init();
+ #endif
+@@ -138,7 +143,7 @@ x11_init(w3mimg_op * self)
+ 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;
+@@ -653,9 +658,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 +762,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 +817,7 @@ w3mimg_x11open()
+
+ wop->priv = xi;
+
++ end:
+ wop->init = x11_init;
+ wop->finish = x11_finish;
+ wop->active = x11_active;