diff options
author | Tatsuya Kinoshita <tats@debian.org> | 2015-01-24 14:36:40 +0000 |
---|---|---|
committer | Tatsuya Kinoshita <tats@debian.org> | 2015-01-24 14:37:05 +0000 |
commit | 8595cb4102d547388d0d9e699d10a14f8f7aa71c (patch) | |
tree | cd27e4b710769000b651b9af4db2704a1cd328dd /debian/patches/020_debian.patch | |
parent | Update Vcs-Browser (diff) | |
download | w3m-8595cb4102d547388d0d9e699d10a14f8f7aa71c.tar.gz w3m-8595cb4102d547388d0d9e699d10a14f8f7aa71c.zip |
Integrate Debian changes into 020_debian.patch (closes: #776112)
(debian/patches/*.patch except 010_upstream.patch are merged)
Diffstat (limited to 'debian/patches/020_debian.patch')
-rw-r--r-- | debian/patches/020_debian.patch | 11826 |
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> <td><a href=\"", + q, "\">", + html_quote(*a->alt ? a->alt : mybasename(a->url)), +@@ -457,10 +454,8 @@ append_link_info(Buffer *buf, Str html, LinkList * link) + Strcat_charp(html, "[Rev]"); + if (!l->url) + url = "(empty)"; +- else if (DecodeURL) +- url = html_quote(url_unquote_conv(l->url, buf->document_charset)); + else +- url = html_quote(l->url); ++ url = html_quote(url_decode2(l->url, buf)); + Strcat_m_charp(html, "<td>", url, NULL); + if (l->ctype) + Strcat_m_charp(html, " (", html_quote(l->ctype), ")", NULL); +@@ -498,8 +493,7 @@ append_frame_info(Buffer *buf, Str html, struct frameset *set, int level) + Strcat_charp(html, p); + } + if (DecodeURL) +- p = html_quote(url_unquote_conv(frame.body->url, +- buf->document_charset)); ++ p = html_quote(url_decode2(frame.body->url, buf)); + else + p = q; + Strcat_m_charp(html, " ", p, "</a></pre_int><br>\n", NULL); +@@ -550,9 +544,7 @@ page_info_panel(Buffer *buf) + #ifdef USE_M17N + Strcat_charp(tmp, "<form method=internal action=charset>"); + #endif +- p = parsedURL2Str(&buf->currentURL)->ptr; +- if (DecodeURL) +- p = url_unquote_conv(p, 0); ++ p = url_decode2(parsedURL2Str(&buf->currentURL)->ptr, NULL); + Strcat_m_charp(tmp, "<table cellpadding=0>", + "<tr valign=top><td nowrap>Title<td>", + html_quote(buf->buffername), +@@ -581,7 +573,7 @@ page_info_panel(Buffer *buf) + "<tr valign=top><td nowrap>Number of lines<td>", + Sprintf("%d", all)->ptr, + "<tr valign=top><td nowrap>Transferred bytes<td>", +- Sprintf("%d", buf->trbyte)->ptr, NULL); ++ Sprintf("%lu", (unsigned long)buf->trbyte)->ptr, NULL); + + a = retrieveCurrentAnchor(buf); + if (a != NULL) { +@@ -589,7 +581,7 @@ page_info_panel(Buffer *buf) + p = parsedURL2Str(&pu)->ptr; + q = html_quote(p); + if (DecodeURL) +- p = html_quote(url_unquote_conv(p, buf->document_charset)); ++ p = html_quote(url_decode2(p, buf)); + else + p = q; + Strcat_m_charp(tmp, +@@ -602,7 +594,7 @@ page_info_panel(Buffer *buf) + p = parsedURL2Str(&pu)->ptr; + q = html_quote(p); + if (DecodeURL) +- p = html_quote(url_unquote_conv(p, buf->document_charset)); ++ p = html_quote(url_decode2(p, buf)); + else + p = q; + Strcat_m_charp(tmp, +@@ -613,10 +605,7 @@ page_info_panel(Buffer *buf) + if (a != NULL) { + FormItemList *fi = (FormItemList *)a->url; + p = form2str(fi); +- if (DecodeURL) +- p = html_quote(url_unquote_conv(p, buf->document_charset)); +- else +- p = html_quote(p); ++ p = html_quote(url_decode2(p, buf)); + Strcat_m_charp(tmp, + "<tr valign=top><td nowrap>Method/type of current form <td>", + p, NULL); +diff --git a/matrix.c b/matrix.c +index 64fd0ad..bc7a5be 100644 +--- a/matrix.c ++++ b/matrix.c +@@ -34,18 +34,12 @@ + + #include "config.h" + #include "matrix.h" +-#include <gc.h> ++#include "alloc.h" + + /* + * Macros from "fm.h". + */ + +-#define New(type) ((type*)GC_MALLOC(sizeof(type))) +-#define NewAtom(type) ((type*)GC_MALLOC_ATOMIC(sizeof(type))) +-#define New_N(type,n) ((type*)GC_MALLOC((n)*sizeof(type))) +-#define NewAtom_N(type,n) ((type*)GC_MALLOC_ATOMIC((n)*sizeof(type))) +-#define Renew_N(type,ptr,n) ((type*)GC_REALLOC((ptr),(n)*sizeof(type))) +- + #define SWAPD(a,b) { double tmp = a; a = b; b = tmp; } + #define SWAPI(a,b) { int tmp = a; a = b; b = tmp; } + +diff --git a/menu.c b/menu.c +index 774b1bd..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/\&/\&/g; + s/\</\</g; + s/\>/\>/g; ++ # non ASCII UTF-8 codepoint ++ my $utf8="[\300-\337][\200-\277]|[\340-\357][\200-\277]{2}|[\360-\367][\200-\277]{3}|[\370-\373][\200-\277]{4}|[\374\375][\200-\277]{5}"; + +- s@([\200-\377].)(\010{1,2}\1)+@<b>$1</b>@g; ++ s@($utf8)(\010\1)+@<b>$1</b>@g; + s@(\&\w+;|.)(\010\1)+@<b>$1</b>@g; +- s@__\010{1,2}((\<b\>)?[\200-\377].(\</b\>)?)@<u>$1</u>@g; ++ s@_\010((\<b\>)?($utf8)(\</b\>)?)@<u>$1</u>@g; + s@_\010((\<b\>)?(\&\w+\;|.)(\</b\>)?)@<u>$1</u>@g; +- s@((\<b\>)?[\200-\377].(\</b\>)?)\010{1,2}__@<u>$1</u>@g; ++ s@((\<b\>)?($utf8)(\</b\>)?)\010_@<u>$1</u>@g; + s@((\<b\>)?(\&\w+\;|.)(\</b\>)?)\010_@<u>$1</u>@g; + s@.\010(.)@$1@g; + +@@ -156,7 +157,7 @@ EOF + } + + s@(http|ftp)://[\w.\-/~]+[\w/]@<a href="$&">$&</a>@g; +- s@(\W)(mailto:)?(\w[\w.\-]*\@\w[\w.\-]*\.[\w.\-]*\w)@$1<a href="mailto:$3">$2$3</a>@g; ++ s@\b(mailto:|)(\w[\w.\-]*\@\w[\w.\-]*\.[\w.\-]*\w)@<a href="mailto:$2">$1$2</a>@g; + s@(\W)(\~?/[\w.][\w.\-/~]*)@$1 . &file_ref($2)@ge; + s@(include(<\/?[bu]\>|\s)*\<)([\w.\-/]+)@$1 . &include_ref($3)@ge; + if ($prev && m@^\s*(\<[bu]\>)*(\w[\w.\-]*)(\</[bu]\>)*(\([\dm]\w*\))@) { +@@ -220,7 +221,7 @@ sub is_command { + local($p); + + (! -d && -x) || return 0; +- if (! defined(%PATH)) { ++ if (! %PATH) { + for $p (split(":", $ENV{'PATH'})) { + $p =~ s@/+$@@; + $PATH{$p} = 1; +diff --git a/table.c b/table.c +index e1243ff..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; |