aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.#file.c.1.2438188
-rw-r--r--.#main.c.1.2536600
-rw-r--r--Bonus/CVS/Entries15
-rw-r--r--Bonus/CVS/Repository1
-rw-r--r--Bonus/CVS/Root1
-rw-r--r--CVS/Entries114
-rw-r--r--CVS/Repository1
-rw-r--r--CVS/Root1
-rw-r--r--ChangeLog206
-rw-r--r--Makefile.in7
-rw-r--r--Patches/CVS/Entries1
-rw-r--r--Patches/CVS/Repository1
-rw-r--r--Patches/CVS/Root1
-rw-r--r--Str.c4
-rw-r--r--Symbols/CVS/Entries11
-rw-r--r--Symbols/CVS/Repository1
-rw-r--r--Symbols/CVS/Root1
-rw-r--r--acinclude.m42
-rw-r--r--anchor.c37
-rwxr-xr-xconfig.guess1091
-rw-r--r--config.h.in5
-rwxr-xr-xconfig.sub483
-rwxr-xr-xconfigure2
-rw-r--r--display.c2
-rw-r--r--doc-jp/CVS/Entries26
-rw-r--r--doc-jp/CVS/Repository1
-rw-r--r--doc-jp/CVS/Root1
-rw-r--r--doc-jp/MANUAL.html12
-rw-r--r--doc-jp/README5
-rw-r--r--doc-jp/README.siteconf60
-rw-r--r--doc-jp/STORY.html3
-rw-r--r--doc-jp/w3m.115
-rw-r--r--doc/CVS/Entries21
-rw-r--r--doc/CVS/Repository1
-rw-r--r--doc/CVS/Root1
-rw-r--r--doc/MANUAL.html12
-rw-r--r--doc/README5
-rw-r--r--doc/README.img2
-rw-r--r--doc/README.siteconf60
-rw-r--r--doc/STORY.html4
-rw-r--r--doc/w3m.14
-rw-r--r--entity.c2
-rw-r--r--file.c307
-rw-r--r--fm.h19
-rw-r--r--form.c31
-rw-r--r--frame.c9
-rw-r--r--func.c88
-rw-r--r--gc/CVS/Entries5
-rw-r--r--gc/CVS/Repository1
-rw-r--r--gc/CVS/Root1
-rw-r--r--gc/Mac_files/CVS/Entries1
-rw-r--r--gc/Mac_files/CVS/Repository1
-rw-r--r--gc/Mac_files/CVS/Root1
-rw-r--r--gc/cord/CVS/Entries1
-rw-r--r--gc/cord/CVS/Repository1
-rw-r--r--gc/cord/CVS/Root1
-rw-r--r--gc/cord/private/CVS/Entries1
-rw-r--r--gc/cord/private/CVS/Repository1
-rw-r--r--gc/cord/private/CVS/Root1
-rw-r--r--gc/doc/CVS/Entries1
-rw-r--r--gc/doc/CVS/Repository1
-rw-r--r--gc/doc/CVS/Root1
-rw-r--r--gc/include/CVS/Entries1
-rw-r--r--gc/include/CVS/Repository1
-rw-r--r--gc/include/CVS/Root1
-rw-r--r--gc/include/private/CVS/Entries1
-rw-r--r--gc/include/private/CVS/Repository1
-rw-r--r--gc/include/private/CVS/Root1
-rw-r--r--gc/tests/CVS/Entries1
-rw-r--r--gc/tests/CVS/Repository1
-rw-r--r--gc/tests/CVS/Root1
-rw-r--r--history.c2
-rw-r--r--html.c6
-rw-r--r--html.h7
-rw-r--r--image.c33
-rw-r--r--indep.c119
-rw-r--r--indep.h24
-rw-r--r--intl/CVS/Entries1
-rw-r--r--intl/CVS/Repository1
-rw-r--r--intl/CVS/Root1
-rw-r--r--istream.c234
-rw-r--r--istream.h13
-rw-r--r--keybind.c2
-rw-r--r--libwc/CVS/Entries53
-rw-r--r--libwc/CVS/Repository1
-rw-r--r--libwc/CVS/Root1
-rw-r--r--libwc/map/CVS/Entries112
-rw-r--r--libwc/map/CVS/Repository1
-rw-r--r--libwc/map/CVS/Root1
-rw-r--r--linein.c4
-rw-r--r--local.c19
-rw-r--r--main.c238
-rw-r--r--map.c27
-rw-r--r--menu.c12
-rw-r--r--mimehead.c61
-rw-r--r--po/CVS/Entries16
-rw-r--r--po/CVS/Repository1
-rw-r--r--po/CVS/Root1
-rw-r--r--po/ja.po4
-rw-r--r--proto.h36
-rw-r--r--rc.c222
-rw-r--r--scripts/CVS/Entries13
-rw-r--r--scripts/CVS/Repository1
-rw-r--r--scripts/CVS/Root1
-rw-r--r--scripts/bm2menu/CVS/Entries3
-rw-r--r--scripts/bm2menu/CVS/Repository1
-rw-r--r--scripts/bm2menu/CVS/Root1
-rw-r--r--scripts/multipart/CVS/Entries6
-rw-r--r--scripts/multipart/CVS/Repository1
-rw-r--r--scripts/multipart/CVS/Root1
-rw-r--r--scripts/w3mman/CVS/Entries8
-rw-r--r--scripts/w3mman/CVS/Repository1
-rw-r--r--scripts/w3mman/CVS/Root1
-rw-r--r--scripts/w3mman/w3mman2html.cgi.in8
-rw-r--r--table.h2
-rw-r--r--terms.c9
-rw-r--r--url.c153
-rw-r--r--version.c.in4
-rw-r--r--w3m-doc/CVS/Entries18
-rw-r--r--w3m-doc/CVS/Repository1
-rw-r--r--w3m-doc/CVS/Root1
-rw-r--r--w3m-doc/sample/CVS/Entries9
-rw-r--r--w3m-doc/sample/CVS/Repository1
-rw-r--r--w3m-doc/sample/CVS/Root1
-rw-r--r--w3mimg/CVS/Entries7
-rw-r--r--w3mimg/CVS/Repository1
-rw-r--r--w3mimg/CVS/Root1
-rw-r--r--w3mimg/fb/CVS/Entries11
-rw-r--r--w3mimg/fb/CVS/Repository1
-rw-r--r--w3mimg/fb/CVS/Root1
-rw-r--r--w3mimg/win/CVS/Entries4
-rw-r--r--w3mimg/win/CVS/Repository1
-rw-r--r--w3mimg/win/CVS/Root1
-rw-r--r--w3mimg/x11/CVS/Entries4
-rw-r--r--w3mimg/x11/CVS/Repository1
-rw-r--r--w3mimg/x11/CVS/Root1
136 files changed, 2573 insertions, 16452 deletions
diff --git a/.#file.c.1.243 b/.#file.c.1.243
deleted file mode 100644
index 411aa7a..0000000
--- a/.#file.c.1.243
+++ /dev/null
@@ -1,8188 +0,0 @@
-/* $Id: file.c,v 1.243 2006/05/29 12:54:26 inu Exp $ */
-#include "fm.h"
-#include <sys/types.h>
-#include "myctype.h"
-#include <signal.h>
-#include <setjmp.h>
-#if defined(HAVE_WAITPID) || defined(HAVE_WAIT3)
-#include <sys/wait.h>
-#endif
-#include <stdio.h>
-#include <time.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <utime.h>
-/* foo */
-
-#include "html.h"
-#include "parsetagx.h"
-#include "local.h"
-#include "regex.h"
-
-#ifndef max
-#define max(a,b) ((a) > (b) ? (a) : (b))
-#endif /* not max */
-#ifndef min
-#define min(a,b) ((a) > (b) ? (b) : (a))
-#endif /* not min */
-
-static int frame_source = 0;
-
-static char *guess_filename(char *file);
-static int _MoveFile(char *path1, char *path2);
-static void uncompress_stream(URLFile *uf, char **src);
-static FILE *lessopen_stream(char *path);
-static Buffer *loadcmdout(char *cmd,
- Buffer *(*loadproc) (URLFile *, Buffer *),
- Buffer *defaultbuf);
-#ifndef USE_ANSI_COLOR
-#define addnewline(a,b,c,d,e,f,g) _addnewline(a,b,c,e,f,g)
-#endif
-static void addnewline(Buffer *buf, char *line, Lineprop *prop,
- Linecolor *color, int pos, int width, int nlines);
-static void addLink(Buffer *buf, struct parsed_tag *tag);
-
-static JMP_BUF AbortLoading;
-
-static struct table *tables[MAX_TABLE];
-static struct table_mode table_mode[MAX_TABLE];
-
-#ifdef USE_IMAGE
-static ParsedURL *cur_baseURL = NULL;
-#ifdef USE_M17N
-static char cur_document_charset;
-#endif
-#endif
-
-static Str cur_title;
-static Str cur_select;
-static Str select_str;
-static int select_is_multiple;
-static int n_selectitem;
-static Str cur_option;
-static Str cur_option_value;
-static Str cur_option_label;
-static int cur_option_selected;
-static int cur_status;
-#ifdef MENU_SELECT
-/* menu based <select> */
-FormSelectOption *select_option;
-static int max_select = MAX_SELECT;
-static int n_select;
-static int cur_option_maxwidth;
-#endif /* MENU_SELECT */
-
-static Str cur_textarea;
-Str *textarea_str;
-static int cur_textarea_size;
-static int cur_textarea_rows;
-static int cur_textarea_readonly;
-static int n_textarea;
-static int ignore_nl_textarea;
-static int max_textarea = MAX_TEXTAREA;
-
-static int http_response_code;
-
-#ifdef USE_M17N
-static wc_ces content_charset = 0;
-static wc_ces meta_charset = 0;
-static char *check_charset(char *p);
-static char *check_accept_charset(char *p);
-#endif
-
-#define set_prevchar(x,y,n) Strcopy_charp_n((x),(y),(n))
-#define set_space_to_prevchar(x) Strcopy_charp_n((x)," ",1)
-
-struct link_stack {
- int cmd;
- short offset;
- short pos;
- struct link_stack *next;
-};
-
-static struct link_stack *link_stack = NULL;
-
-#define FORMSTACK_SIZE 10
-#define FRAMESTACK_SIZE 10
-
-#ifdef USE_NNTP
-#define Str_news_endline(s) ((s)->ptr[0]=='.'&&((s)->ptr[1]=='\n'||(s)->ptr[1]=='\r'||(s)->ptr[1]=='\0'))
-#endif /* USE_NNTP */
-
-#define INITIAL_FORM_SIZE 10
-static FormList **forms;
-static int *form_stack;
-static int form_max = -1;
-static int forms_size = 0;
-#define cur_form_id ((form_sp >= 0)? form_stack[form_sp] : -1)
-static int form_sp = 0;
-
-static clen_t current_content_length;
-
-static int cur_hseq;
-#ifdef USE_IMAGE
-static int cur_iseq;
-#endif
-
-#define MAX_UL_LEVEL 9
-#define UL_SYMBOL(x) (N_GRAPH_SYMBOL + (x))
-#define UL_SYMBOL_DISC UL_SYMBOL(9)
-#define UL_SYMBOL_CIRCLE UL_SYMBOL(10)
-#define UL_SYMBOL_SQUARE UL_SYMBOL(11)
-#define IMG_SYMBOL UL_SYMBOL(12)
-#define HR_SYMBOL 26
-
-#ifdef USE_COOKIE
-/* This array should be somewhere else */
-/* FIXME: gettextize? */
-char *violations[COO_EMAX] = {
- "internal error",
- "tail match failed",
- "wrong number of dots",
- "RFC 2109 4.3.2 rule 1",
- "RFC 2109 4.3.2 rule 2.1",
- "RFC 2109 4.3.2 rule 2.2",
- "RFC 2109 4.3.2 rule 3",
- "RFC 2109 4.3.2 rule 4",
- "RFC XXXX 4.3.2 rule 5"
-};
-#endif
-
-/* *INDENT-OFF* */
-static struct compression_decoder {
- int type;
- char *ext;
- char *mime_type;
- int auxbin_p;
- char *cmd;
- char *name;
- char *encoding;
- char *encodings[4];
-} compression_decoders[] = {
- { CMP_COMPRESS, ".gz", "application/x-gzip",
- 0, GUNZIP_CMDNAME, GUNZIP_NAME, "gzip",
- {"gzip", "x-gzip", NULL} },
- { CMP_COMPRESS, ".Z", "application/x-compress",
- 0, GUNZIP_CMDNAME, GUNZIP_NAME, "compress",
- {"compress", "x-compress", NULL} },
- { CMP_BZIP2, ".bz2", "application/x-bzip",
- 0, BUNZIP2_CMDNAME, BUNZIP2_NAME, "bzip, bzip2",
- {"x-bzip", "bzip", "bzip2", NULL} },
- { CMP_DEFLATE, ".deflate", "application/x-deflate",
- 1, INFLATE_CMDNAME, INFLATE_NAME, "deflate",
- {"deflate", "x-deflate", NULL} },
- { CMP_NOCOMPRESS, NULL, NULL, 0, NULL, NULL, NULL, {NULL}},
-};
-/* *INDENT-ON* */
-
-#define SAVE_BUF_SIZE 1536
-
-static MySignalHandler
-KeyAbort(SIGNAL_ARG)
-{
- LONGJMP(AbortLoading, 1);
- SIGNAL_RETURN;
-}
-
-static void
-UFhalfclose(URLFile *f)
-{
- switch (f->scheme) {
- case SCM_FTP:
- closeFTP();
- break;
-#ifdef USE_NNTP
- case SCM_NEWS:
- case SCM_NNTP:
- closeNews();
- break;
-#endif
- default:
- UFclose(f);
- break;
- }
-}
-
-int
-currentLn(Buffer *buf)
-{
- if (buf->currentLine)
- /* return buf->currentLine->real_linenumber + 1; */
- return buf->currentLine->linenumber + 1;
- else
- return 1;
-}
-
-static Buffer *
-loadSomething(URLFile *f,
- char *path,
- Buffer *(*loadproc) (URLFile *, Buffer *), Buffer *defaultbuf)
-{
- Buffer *buf;
-
- 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->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;
- return buf;
-}
-
-int
-dir_exist(char *path)
-{
- struct stat stbuf;
-
- if (path == NULL || *path == '\0')
- return 0;
- if (stat(path, &stbuf) == -1)
- return 0;
- return IS_DIRECTORY(stbuf.st_mode);
-}
-
-static int
-is_dump_text_type(char *type)
-{
- struct mailcap *mcap;
- return (type && (mcap = searchExtViewer(type)) &&
- (mcap->flags & (MAILCAP_HTMLOUTPUT | MAILCAP_COPIOUSOUTPUT)));
-}
-
-static int
-is_text_type(char *type)
-{
- return (type == NULL || type[0] == '\0' ||
- strncasecmp(type, "text/", 5) == 0 ||
- strncasecmp(type, "message/", sizeof("message/") - 1) == 0);
-}
-
-static int
-is_plain_text_type(char *type)
-{
- return ((type && strcasecmp(type, "text/plain") == 0) ||
- (is_text_type(type) && !is_dump_text_type(type)));
-}
-
-static void
-check_compression(char *path, URLFile *uf)
-{
- int len;
- struct compression_decoder *d;
-
- if (path == NULL)
- return;
-
- len = strlen(path);
- uf->compression = CMP_NOCOMPRESS;
- for (d = compression_decoders; d->type != CMP_NOCOMPRESS; d++) {
- int elen;
- if (d->ext == NULL)
- continue;
- elen = strlen(d->ext);
- if (len > elen && strcasecmp(&path[len - elen], d->ext) == 0) {
- uf->compression = d->type;
- uf->guess_type = d->mime_type;
- break;
- }
- }
-}
-
-static char *
-compress_application_type(int compression)
-{
- struct compression_decoder *d;
-
- for (d = compression_decoders; d->type != CMP_NOCOMPRESS; d++) {
- if (d->type == compression)
- return d->mime_type;
- }
- return NULL;
-}
-
-static char *
-uncompressed_file_type(char *path, char **ext)
-{
- int len, slen;
- Str fn;
- char *t0;
- struct compression_decoder *d;
-
- if (path == NULL)
- return NULL;
-
- slen = 0;
- len = strlen(path);
- for (d = compression_decoders; d->type != CMP_NOCOMPRESS; d++) {
- if (d->ext == NULL)
- continue;
- slen = strlen(d->ext);
- if (len > slen && strcasecmp(&path[len - slen], d->ext) == 0)
- break;
- }
- if (d->type == CMP_NOCOMPRESS)
- return NULL;
-
- fn = Strnew_charp(path);
- Strshrink(fn, slen);
- if (ext)
- *ext = filename_extension(fn->ptr, 0);
- t0 = guessContentType(fn->ptr);
- if (t0 == NULL)
- t0 = "text/plain";
- return t0;
-}
-
-static int
-setModtime(char *path, time_t modtime)
-{
- struct utimbuf t;
- struct stat st;
-
- if (stat(path, &st) == 0)
- t.actime = st.st_atime;
- else
- t.actime = time(NULL);
- t.modtime = modtime;
- return utime(path, &t);
-}
-
-void
-examineFile(char *path, URLFile *uf)
-{
- struct stat stbuf;
-
- uf->guess_type = NULL;
- if (path == NULL || *path == '\0' ||
- stat(path, &stbuf) == -1 || NOT_REGULAR(stbuf.st_mode)) {
- uf->stream = NULL;
- return;
- }
- uf->stream = openIS(path);
- if (!do_download) {
- if (use_lessopen && getenv("LESSOPEN") != NULL) {
- FILE *fp;
- uf->guess_type = guessContentType(path);
- if (uf->guess_type == NULL)
- uf->guess_type = "text/plain";
- if (strcasecmp(uf->guess_type, "text/html") == 0)
- return;
- if ((fp = lessopen_stream(path))) {
- UFclose(uf);
- uf->stream = newFileStream(fp, (void (*)())pclose);
- uf->guess_type = "text/plain";
- return;
- }
- }
- check_compression(path, uf);
- if (uf->compression != CMP_NOCOMPRESS) {
- char *ext = uf->ext;
- char *t0 = uncompressed_file_type(path, &ext);
- uf->guess_type = t0;
- uf->ext = ext;
- uncompress_stream(uf, NULL);
- return;
- }
- }
-}
-
-#define S_IXANY (S_IXUSR|S_IXGRP|S_IXOTH)
-
-int
-check_command(char *cmd, int auxbin_p)
-{
- static char *path = NULL;
- Str dirs;
- char *p, *np;
- Str pathname;
- struct stat st;
-
- if (path == NULL)
- path = getenv("PATH");
- if (auxbin_p)
- dirs = Strnew_charp(w3m_auxbin_dir());
- else
- dirs = Strnew_charp(path);
- for (p = dirs->ptr; p != NULL; p = np) {
- np = strchr(p, PATH_SEPARATOR);
- if (np)
- *np++ = '\0';
- pathname = Strnew();
- Strcat_charp(pathname, p);
- Strcat_char(pathname, '/');
- Strcat_charp(pathname, cmd);
- if (stat(pathname->ptr, &st) == 0 && S_ISREG(st.st_mode)
- && (st.st_mode & S_IXANY) != 0)
- return 1;
- }
- return 0;
-}
-
-char *
-acceptableEncoding()
-{
- static Str encodings = NULL;
- struct compression_decoder *d;
- TextList *l;
- char *p;
-
- if (encodings != NULL)
- return encodings->ptr;
- l = newTextList();
- for (d = compression_decoders; d->type != CMP_NOCOMPRESS; d++) {
- if (check_command(d->cmd, d->auxbin_p)) {
- pushText(l, d->encoding);
- }
- }
- encodings = Strnew();
- while ((p = popText(l)) != NULL) {
- if (encodings->length)
- Strcat_charp(encodings, ", ");
- Strcat_charp(encodings, p);
- }
- return encodings->ptr;
-}
-
-/*
- * convert line
- */
-#ifdef USE_M17N
-Str
-convertLine(URLFile *uf, Str line, int mode, wc_ces * charset,
- wc_ces doc_charset)
-#else
-Str
-convertLine0(URLFile *uf, Str line, int mode)
-#endif
-{
-#ifdef USE_M17N
- line = wc_Str_conv_with_detect(line, charset, doc_charset, InnerCharset);
-#endif
- if (mode != RAW_MODE)
- cleanup_line(line, mode);
-#ifdef USE_NNTP
- if (uf && uf->scheme == SCM_NEWS)
- Strchop(line);
-#endif /* USE_NNTP */
- 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)
-{
- int quoted;
- char *q = NULL;
-
- if (strncasecmp(p, attr, len) == 0) {
- p += len;
- SKIP_BLANKS(p);
- if (value) {
- *value = Strnew();
- if (*p == '=') {
- p++;
- SKIP_BLANKS(p);
- quoted = 0;
- while (!IS_ENDL(*p) && (quoted || *p != ';')) {
- if (!IS_SPACE(*p))
- q = p;
- if (*p == '"')
- quoted = (quoted) ? 0 : 1;
- else
- Strcat_char(*value, *p);
- p++;
- }
- if (q)
- Strshrink(*value, p - q - 1);
- }
- return 1;
- }
- else {
- if (IS_ENDT(*p)) {
- return 1;
- }
- }
- }
- return 0;
-}
-
-#ifdef USE_IMAGE
-#ifdef USE_XFACE
-static char *
-xface2xpm(char *xface)
-{
- Image image;
- ImageCache *cache;
- FILE *f;
- struct stat st;
-
- SKIP_BLANKS(xface);
- image.url = xface;
- image.ext = ".xpm";
- image.width = 48;
- image.height = 48;
- image.cache = NULL;
- cache = getImage(&image, NULL, IMG_FLAG_AUTO);
- if (cache->loaded & IMG_FLAG_LOADED && !stat(cache->file, &st))
- return cache->file;
- cache->loaded = IMG_FLAG_ERROR;
-
- f = popen(Sprintf("%s > %s", shell_quote(auxbinFile(XFACE2XPM)),
- shell_quote(cache->file))->ptr, "w");
- if (!f)
- return NULL;
- fputs(xface, f);
- pclose(f);
- if (stat(cache->file, &st) || !st.st_size)
- return NULL;
- cache->loaded = IMG_FLAG_LOADED | IMG_FLAG_DONT_REMOVE;
- cache->index = 0;
- return cache->file;
-}
-#endif
-#endif
-
-void
-readHeader(URLFile *uf, Buffer *newBuf, int thru, ParsedURL *pu)
-{
- char *p, *q;
-#ifdef USE_COOKIE
- char *emsg;
-#endif
- char c;
- Str lineBuf2 = NULL;
- Str tmp;
- TextList *headerlist;
-#ifdef USE_M17N
- wc_ces charset = WC_CES_US_ASCII, mime_charset;
-#endif
- char *tmpf;
- FILE *src = NULL;
- Lineprop *propBuffer;
-
- headerlist = newBuf->document_header = newTextList();
- if (uf->scheme == SCM_HTTP
-#ifdef USE_SSL
- || uf->scheme == SCM_HTTPS
-#endif /* USE_SSL */
- )
- http_response_code = -1;
- else
- http_response_code = 0;
-
- if (thru && !newBuf->header_source
-#ifdef USE_IMAGE
- && !image_source
-#endif
- ) {
- tmpf = tmpfname(TMPF_DFL, NULL)->ptr;
- src = fopen(tmpf, "w");
- if (src)
- newBuf->header_source = tmpf;
- }
- while ((tmp = StrmyUFgets(uf))->length) {
-#ifdef USE_NNTP
- if (uf->scheme == SCM_NEWS && tmp->ptr[0] == '.')
- Strshrinkfirst(tmp, 1);
-#endif
-#ifdef HTTP_DEBUG
- {
- FILE *ff;
- ff = fopen("zzrequest", "a");
- Strfputs(tmp, ff);
- fclose(ff);
- }
-#endif /* HTTP_DEBUG */
- if (src)
- Strfputs(tmp, src);
- cleanup_line(tmp, HEADER_MODE);
- if (tmp->ptr[0] == '\n' || tmp->ptr[0] == '\r' || tmp->ptr[0] == '\0') {
- if (!lineBuf2)
- /* there is no header */
- break;
- /* last header */
- }
- else if (!(w3m_dump & DUMP_HEAD)) {
- if (lineBuf2) {
- Strcat(lineBuf2, tmp);
- }
- else {
- lineBuf2 = tmp;
- }
- c = UFgetc(uf);
- UFundogetc(uf);
- if (c == ' ' || c == '\t')
- /* header line is continued */
- continue;
- lineBuf2 = decodeMIME(lineBuf2, &mime_charset);
- lineBuf2 = convertLine(NULL, lineBuf2, RAW_MODE,
- mime_charset ? &mime_charset : &charset,
- mime_charset ? mime_charset
- : DocumentCharset);
- /* separated with line and stored */
- tmp = Strnew_size(lineBuf2->length);
- for (p = lineBuf2->ptr; *p; p = q) {
- for (q = p; *q && *q != '\r' && *q != '\n'; q++) ;
- lineBuf2 = checkType(Strnew_charp_n(p, q - p), &propBuffer,
- NULL);
- Strcat(tmp, lineBuf2);
- if (thru)
- addnewline(newBuf, lineBuf2->ptr, propBuffer, NULL,
- lineBuf2->length, FOLD_BUFFER_WIDTH, -1);
- for (; *q && (*q == '\r' || *q == '\n'); q++) ;
- }
-#ifdef USE_IMAGE
- if (thru && activeImage && displayImage) {
- Str src = NULL;
- if (!strncasecmp(tmp->ptr, "X-Image-URL:", 12)) {
- tmpf = &tmp->ptr[12];
- SKIP_BLANKS(tmpf);
- src = Strnew_m_charp("<img src=\"", html_quote(tmpf),
- "\" alt=\"X-Image-URL\">", NULL);
- }
-#ifdef USE_XFACE
- else if (!strncasecmp(tmp->ptr, "X-Face:", 7)) {
- tmpf = xface2xpm(&tmp->ptr[7]);
- if (tmpf)
- src = Strnew_m_charp("<img src=\"file:",
- html_quote(tmpf),
- "\" alt=\"X-Face\"",
- " width=48 height=48>", NULL);
- }
-#endif
- if (src) {
- URLFile f;
- Line *l;
-#ifdef USE_M17N
- wc_ces old_charset = newBuf->document_charset;
-#endif
- init_stream(&f, SCM_LOCAL, newStrStream(src));
- loadHTMLstream(&f, newBuf, NULL, TRUE);
- for (l = newBuf->lastLine; l && l->real_linenumber;
- l = l->prev)
- l->real_linenumber = 0;
-#ifdef USE_M17N
- newBuf->document_charset = old_charset;
-#endif
- }
- }
-#endif
- lineBuf2 = tmp;
- }
- else {
- lineBuf2 = tmp;
- }
- if ((uf->scheme == SCM_HTTP
-#ifdef USE_SSL
- || uf->scheme == SCM_HTTPS
-#endif /* USE_SSL */
- ) && http_response_code == -1) {
- p = lineBuf2->ptr;
- while (*p && !IS_SPACE(*p))
- p++;
- while (*p && IS_SPACE(*p))
- p++;
- http_response_code = atoi(p);
- if (fmInitialized) {
- message(lineBuf2->ptr, 0, 0);
- refresh();
- }
- }
- if (!strncasecmp(lineBuf2->ptr, "content-transfer-encoding:", 26)) {
- p = lineBuf2->ptr + 26;
- while (IS_SPACE(*p))
- p++;
- if (!strncasecmp(p, "base64", 6))
- uf->encoding = ENC_BASE64;
- else if (!strncasecmp(p, "quoted-printable", 16))
- uf->encoding = ENC_QUOTE;
- else if (!strncasecmp(p, "uuencode", 8) ||
- !strncasecmp(p, "x-uuencode", 10))
- uf->encoding = ENC_UUENCODE;
- else
- uf->encoding = ENC_7BIT;
- }
- else if (!strncasecmp(lineBuf2->ptr, "content-encoding:", 17)) {
- struct compression_decoder *d;
- p = lineBuf2->ptr + 17;
- while (IS_SPACE(*p))
- p++;
- uf->compression = CMP_NOCOMPRESS;
- for (d = compression_decoders; d->type != CMP_NOCOMPRESS; d++) {
- char **e;
- for (e = d->encodings; *e != NULL; e++) {
- if (strncasecmp(p, *e, strlen(*e)) == 0) {
- uf->compression = d->type;
- break;
- }
- }
- if (uf->compression != CMP_NOCOMPRESS)
- break;
- }
- uf->content_encoding = uf->compression;
- }
-#ifdef USE_COOKIE
- else if (use_cookie && accept_cookie &&
- pu && check_cookie_accept_domain(pu->host) &&
- (!strncasecmp(lineBuf2->ptr, "Set-Cookie:", 11) ||
- !strncasecmp(lineBuf2->ptr, "Set-Cookie2:", 12))) {
- Str name = Strnew(), value = Strnew(), domain = NULL, path = NULL,
- comment = NULL, commentURL = NULL, port = NULL, tmp2;
- int version, quoted, flag = 0;
- time_t expires = (time_t) - 1;
-
- q = NULL;
- if (lineBuf2->ptr[10] == '2') {
- p = lineBuf2->ptr + 12;
- version = 1;
- }
- else {
- p = lineBuf2->ptr + 11;
- version = 0;
- }
-#ifdef DEBUG
- fprintf(stderr, "Set-Cookie: [%s]\n", p);
-#endif /* DEBUG */
- SKIP_BLANKS(p);
- while (*p != '=' && !IS_ENDT(*p))
- Strcat_char(name, *(p++));
- Strremovetrailingspaces(name);
- if (*p == '=') {
- p++;
- SKIP_BLANKS(p);
- quoted = 0;
- while (!IS_ENDL(*p) && (quoted || *p != ';')) {
- if (!IS_SPACE(*p))
- q = p;
- if (*p == '"')
- quoted = (quoted) ? 0 : 1;
- Strcat_char(value, *(p++));
- }
- if (q)
- Strshrink(value, p - q - 1);
- }
- while (*p == ';') {
- p++;
- SKIP_BLANKS(p);
- if (matchattr(p, "expires", 7, &tmp2)) {
- /* version 0 */
- expires = mymktime(tmp2->ptr);
- }
- else if (matchattr(p, "max-age", 7, &tmp2)) {
- /* XXX Is there any problem with max-age=0? (RFC 2109 ss. 4.2.1, 4.2.2 */
- expires = time(NULL) + atol(tmp2->ptr);
- }
- else if (matchattr(p, "domain", 6, &tmp2)) {
- domain = tmp2;
- }
- else if (matchattr(p, "path", 4, &tmp2)) {
- path = tmp2;
- }
- else if (matchattr(p, "secure", 6, NULL)) {
- flag |= COO_SECURE;
- }
- else if (matchattr(p, "comment", 7, &tmp2)) {
- comment = tmp2;
- }
- else if (matchattr(p, "version", 7, &tmp2)) {
- version = atoi(tmp2->ptr);
- }
- else if (matchattr(p, "port", 4, &tmp2)) {
- /* version 1, Set-Cookie2 */
- port = tmp2;
- }
- else if (matchattr(p, "commentURL", 10, &tmp2)) {
- /* version 1, Set-Cookie2 */
- commentURL = tmp2;
- }
- else if (matchattr(p, "discard", 7, NULL)) {
- /* version 1, Set-Cookie2 */
- flag |= COO_DISCARD;
- }
- quoted = 0;
- while (!IS_ENDL(*p) && (quoted || *p != ';')) {
- if (*p == '"')
- quoted = (quoted) ? 0 : 1;
- p++;
- }
- }
- if (pu && name->length > 0) {
- int err;
- if (show_cookie) {
- if (flag & COO_SECURE)
- disp_message_nsec("Received a secured cookie", FALSE, 1,
- TRUE, FALSE);
- else
- disp_message_nsec(Sprintf("Received cookie: %s=%s",
- name->ptr, value->ptr)->ptr,
- FALSE, 1, TRUE, FALSE);
- }
- err =
- add_cookie(pu, name, value, expires, domain, path, flag,
- comment, version, port, commentURL);
- if (err) {
- char *ans = (accept_bad_cookie == ACCEPT_BAD_COOKIE_ACCEPT)
- ? "y" : NULL;
- if (fmInitialized && (err & COO_OVERRIDE_OK) &&
- accept_bad_cookie == ACCEPT_BAD_COOKIE_ASK) {
- Str msg = Sprintf("Accept bad cookie from %s for %s?",
- pu->host,
- ((domain && domain->ptr)
- ? domain->ptr : "<localdomain>"));
- if (msg->length > COLS - 10)
- Strshrink(msg, msg->length - (COLS - 10));
- Strcat_charp(msg, " (y/n)");
- ans = inputAnswer(msg->ptr);
- }
- if (ans == NULL || TOLOWER(*ans) != 'y' ||
- (err =
- add_cookie(pu, name, value, expires, domain, path,
- flag | COO_OVERRIDE, comment, version,
- port, commentURL))) {
- err = (err & ~COO_OVERRIDE_OK) - 1;
- if (err >= 0 && err < COO_EMAX)
- emsg = Sprintf("This cookie was rejected "
- "to prevent security violation. [%s]",
- violations[err])->ptr;
- else
- emsg =
- "This cookie was rejected to prevent security violation.";
- record_err_message(emsg);
- if (show_cookie)
- disp_message_nsec(emsg, FALSE, 1, TRUE, FALSE);
- }
- else
- if (show_cookie)
- disp_message_nsec(Sprintf
- ("Accepting invalid cookie: %s=%s",
- name->ptr, value->ptr)->ptr, FALSE,
- 1, TRUE, FALSE);
- }
- }
- }
-#endif /* USE_COOKIE */
- else if (!strncasecmp(lineBuf2->ptr, "w3m-control:", 12) &&
- uf->scheme == SCM_LOCAL_CGI) {
- Str funcname = Strnew();
- int f;
-
- p = lineBuf2->ptr + 12;
- SKIP_BLANKS(p);
- while (*p && !IS_SPACE(*p))
- Strcat_char(funcname, *(p++));
- SKIP_BLANKS(p);
- f = getFuncList(funcname->ptr);
- if (f >= 0) {
- tmp = Strnew_charp(p);
- Strchop(tmp);
- pushEvent(f, tmp->ptr);
- }
- }
- if (headerlist)
- pushText(headerlist, lineBuf2->ptr);
- Strfree(lineBuf2);
- lineBuf2 = NULL;
- }
- if (thru)
- addnewline(newBuf, "", propBuffer, NULL, 0, -1, -1);
- if (src)
- fclose(src);
-}
-
-char *
-checkHeader(Buffer *buf, char *field)
-{
- int len;
- TextListItem *i;
- char *p;
-
- if (buf == NULL || field == NULL || buf->document_header == NULL)
- return NULL;
- len = strlen(field);
- for (i = buf->document_header->first; i != NULL; i = i->next) {
- if (!strncasecmp(i->ptr, field, len)) {
- p = i->ptr + len;
- return remove_space(p);
- }
- }
- return NULL;
-}
-
-char *
-checkContentType(Buffer *buf)
-{
- char *p;
- Str r;
- p = checkHeader(buf, "Content-Type:");
- if (p == NULL)
- return NULL;
- r = Strnew();
- while (*p && *p != ';' && !IS_SPACE(*p))
- Strcat_char(r, *p++);
-#ifdef USE_M17N
- if ((p = strcasestr(p, "charset")) != NULL) {
- p += 7;
- SKIP_BLANKS(p);
- if (*p == '=') {
- p++;
- SKIP_BLANKS(p);
- if (*p == '"')
- p++;
- content_charset = wc_guess_charset(p, 0);
- }
- }
-#endif
- return r->ptr;
-}
-
-struct auth_param {
- char *name;
- Str val;
-};
-
-struct http_auth {
- int pri;
- char *scheme;
- struct auth_param *param;
- Str (*cred) (struct http_auth * ha, Str uname, Str pw, ParsedURL *pu,
- HRequest *hr, FormList *request);
-};
-
-enum {
- AUTHCHR_NUL,
- AUTHCHR_SEP,
- AUTHCHR_TOKEN,
-};
-
-static int
-skip_auth_token(char **pp)
-{
- char *p;
- int first = AUTHCHR_NUL, typ;
-
- for (p = *pp ;; ++p) {
- switch (*p) {
- case '\0':
- goto endoftoken;
- default:
- if ((unsigned char)*p > 037) {
- typ = AUTHCHR_TOKEN;
- break;
- }
- /* thru */
- case '\177':
- case '[':
- case ']':
- case '(':
- case ')':
- case '<':
- case '>':
- case '@':
- case ';':
- case ':':
- case '\\':
- case '"':
- case '/':
- case '?':
- case '=':
- case ' ':
- case '\t':
- case ',':
- typ = AUTHCHR_SEP;
- break;
- }
-
- if (!first)
- first = typ;
- else if (first != typ)
- break;
- }
-endoftoken:
- *pp = p;
- return first;
-}
-
-static Str
-extract_auth_val(char **q)
-{
- unsigned char *qq = *(unsigned char **)q;
- int quoted = 0;
- Str val = Strnew();
-
- SKIP_BLANKS(qq);
- if (*qq == '"') {
- quoted = TRUE;
- Strcat_char(val, *qq++);
- }
- while (*qq != '\0') {
- if (quoted && *qq == '"') {
- Strcat_char(val, *qq++);
- break;
- }
- if (!quoted) {
- switch (*qq) {
- case '[':
- case ']':
- case '(':
- case ')':
- case '<':
- case '>':
- case '@':
- case ';':
- case ':':
- case '\\':
- case '"':
- case '/':
- case '?':
- case '=':
- case ' ':
- case '\t':
- qq++;
- case ',':
- goto end_token;
- default:
- if (*qq <= 037 || *qq == 0177) {
- qq++;
- goto end_token;
- }
- }
- }
- else if (quoted && *qq == '\\')
- Strcat_char(val, *qq++);
- Strcat_char(val, *qq++);
- }
- end_token:
- *q = (char *)qq;
- return val;
-}
-
-static Str
-qstr_unquote(Str s)
-{
- char *p;
-
- if (s == NULL)
- return NULL;
- p = s->ptr;
- if (*p == '"') {
- Str tmp = Strnew();
- for (p++; *p != '\0'; p++) {
- if (*p == '\\')
- p++;
- Strcat_char(tmp, *p);
- }
- if (Strlastchar(tmp) == '"')
- Strshrink(tmp, 1);
- return tmp;
- }
- else
- return s;
-}
-
-static char *
-extract_auth_param(char *q, struct auth_param *auth)
-{
- struct auth_param *ap;
- char *p;
-
- for (ap = auth; ap->name != NULL; ap++) {
- ap->val = NULL;
- }
-
- while (*q != '\0') {
- SKIP_BLANKS(q);
- for (ap = auth; ap->name != NULL; ap++) {
- size_t len;
-
- len = strlen(ap->name);
- if (strncasecmp(q, ap->name, len) == 0 &&
- (IS_SPACE(q[len]) || q[len] == '=')) {
- p = q + len;
- SKIP_BLANKS(p);
- if (*p != '=')
- return q;
- q = p + 1;
- ap->val = extract_auth_val(&q);
- break;
- }
- }
- if (ap->name == NULL) {
- /* skip unknown param */
- int token_type;
- p = q;
- if ((token_type = skip_auth_token(&q)) == AUTHCHR_TOKEN &&
- (IS_SPACE(*q) || *q == '=')) {
- SKIP_BLANKS(q);
- if (*q != '=')
- return p;
- q++;
- extract_auth_val(&q);
- }
- else
- return p;
- }
- if (*q != '\0') {
- SKIP_BLANKS(q);
- if (*q == ',')
- q++;
- else
- break;
- }
- }
- return q;
-}
-
-static Str
-get_auth_param(struct auth_param *auth, char *name)
-{
- struct auth_param *ap;
- for (ap = auth; ap->name != NULL; ap++) {
- if (strcasecmp(name, ap->name) == 0)
- return ap->val;
- }
- return NULL;
-}
-
-static Str
-AuthBasicCred(struct http_auth *ha, Str uname, Str pw, ParsedURL *pu,
- HRequest *hr, FormList *request)
-{
- Str s = Strdup(uname);
- Strcat_char(s, ':');
- Strcat(s, pw);
- return Strnew_m_charp("Basic ", encodeB(s->ptr)->ptr, NULL);
-}
-
-#ifdef USE_DIGEST_AUTH
-#include <openssl/md5.h>
-
-/* RFC2617: 3.2.2 The Authorization Request Header
- *
- * credentials = "Digest" digest-response
- * digest-response = 1#( username | realm | nonce | digest-uri
- * | response | [ algorithm ] | [cnonce] |
- * [opaque] | [message-qop] |
- * [nonce-count] | [auth-param] )
- *
- * username = "username" "=" username-value
- * username-value = quoted-string
- * digest-uri = "uri" "=" digest-uri-value
- * digest-uri-value = request-uri ; As specified by HTTP/1.1
- * message-qop = "qop" "=" qop-value
- * cnonce = "cnonce" "=" cnonce-value
- * cnonce-value = nonce-value
- * nonce-count = "nc" "=" nc-value
- * nc-value = 8LHEX
- * response = "response" "=" request-digest
- * request-digest = <"> 32LHEX <">
- * LHEX = "0" | "1" | "2" | "3" |
- * "4" | "5" | "6" | "7" |
- * "8" | "9" | "a" | "b" |
- * "c" | "d" | "e" | "f"
- */
-
-static Str
-digest_hex(char *p)
-{
- char *h = "0123456789abcdef";
- Str tmp = Strnew_size(MD5_DIGEST_LENGTH * 2 + 1);
- int i;
- for (i = 0; i < MD5_DIGEST_LENGTH; i++, p++) {
- Strcat_char(tmp, h[(*p >> 4) & 0x0f]);
- Strcat_char(tmp, h[*p & 0x0f]);
- }
- return tmp;
-}
-
-enum {
- QOP_NONE,
- QOP_AUTH,
- QOP_AUTH_INT,
-};
-
-static Str
-AuthDigestCred(struct http_auth *ha, Str uname, Str pw, ParsedURL *pu,
- HRequest *hr, FormList *request)
-{
- Str tmp, a1buf, a2buf, rd, s;
- char md5[MD5_DIGEST_LENGTH + 1];
- Str uri = HTTPrequestURI(pu, hr);
- char nc[] = "00000001";
-
- Str algorithm = qstr_unquote(get_auth_param(ha->param, "algorithm"));
- Str nonce = qstr_unquote(get_auth_param(ha->param, "nonce"));
- Str cnonce /* = qstr_unquote(get_auth_param(ha->param, "cnonce")) */;
- /* cnonce is what client should generate. */
- Str qop = qstr_unquote(get_auth_param(ha->param, "qop"));
-
- static union {
- int r[4];
- char s[sizeof(int) * 4];
- } cnonce_seed;
- int qop_i = QOP_NONE;
-
- cnonce_seed.r[0] = rand();
- cnonce_seed.r[1] = rand();
- cnonce_seed.r[2] = rand();
- MD5(cnonce_seed.s, sizeof(cnonce_seed.s), md5);
- cnonce = digest_hex(md5);
- cnonce_seed.r[3]++;
-
- if (qop) {
- char *p;
- size_t i;
-
- p = qop->ptr;
- SKIP_BLANKS(p);
-
- for (;;) {
- if ((i = strcspn(p, " \t,")) > 0) {
- if (i == sizeof("auth-int") - sizeof("") && !strncasecmp(p, "auth-int", i)) {
- if (qop_i < QOP_AUTH_INT)
- qop_i = QOP_AUTH_INT;
- }
- else if (i == sizeof("auth") - sizeof("") && !strncasecmp(p, "auth", i)) {
- if (qop_i < QOP_AUTH)
- qop_i = QOP_AUTH;
- }
- }
-
- if (p[i]) {
- p += i + 1;
- SKIP_BLANKS(p);
- }
- else
- break;
- }
- }
-
- /* A1 = unq(username-value) ":" unq(realm-value) ":" passwd */
- tmp = Strnew_m_charp(uname->ptr, ":",
- qstr_unquote(get_auth_param(ha->param, "realm"))->ptr,
- ":", pw->ptr, NULL);
- MD5(tmp->ptr, strlen(tmp->ptr), md5);
- a1buf = digest_hex(md5);
-
- if (algorithm) {
- if (strcasecmp(algorithm->ptr, "MD5-sess") == 0) {
- /* A1 = H(unq(username-value) ":" unq(realm-value) ":" passwd)
- * ":" unq(nonce-value) ":" unq(cnonce-value)
- */
- if (nonce == NULL)
- return NULL;
- tmp = Strnew_m_charp(a1buf->ptr, ":",
- qstr_unquote(nonce)->ptr,
- ":", qstr_unquote(cnonce)->ptr, NULL);
- MD5(tmp->ptr, strlen(tmp->ptr), md5);
- a1buf = digest_hex(md5);
- }
- else if (strcasecmp(algorithm->ptr, "MD5") == 0)
- /* ok default */
- ;
- else
- /* unknown algorithm */
- return NULL;
- }
-
- /* A2 = Method ":" digest-uri-value */
- tmp = Strnew_m_charp(HTTPrequestMethod(hr)->ptr, ":", uri->ptr, NULL);
- if (qop_i == QOP_AUTH_INT) {
- /* A2 = Method ":" digest-uri-value ":" H(entity-body) */
- if (request && request->body) {
- if (request->method == FORM_METHOD_POST && request->enctype == FORM_ENCTYPE_MULTIPART) {
- FILE *fp = fopen(request->body, "r");
- if (fp != NULL) {
- Str ebody;
- ebody = Strfgetall(fp);
- MD5(ebody->ptr, strlen(ebody->ptr), md5);
- }
- else {
- MD5("", 0, md5);
- }
- }
- else {
- MD5(request->body, request->length, md5);
- }
- }
- else {
- MD5("", 0, md5);
- }
- Strcat_char(tmp, ':');
- Strcat(tmp, digest_hex(md5));
- }
- MD5(tmp->ptr, strlen(tmp->ptr), md5);
- a2buf = digest_hex(md5);
-
- if (qop_i >= QOP_AUTH) {
- /* request-digest = <"> < KD ( H(A1), unq(nonce-value)
- * ":" nc-value
- * ":" unq(cnonce-value)
- * ":" unq(qop-value)
- * ":" H(A2)
- * ) <">
- */
- if (nonce == NULL)
- return NULL;
- tmp = Strnew_m_charp(a1buf->ptr, ":", qstr_unquote(nonce)->ptr,
- ":", nc,
- ":", qstr_unquote(cnonce)->ptr,
- ":", qop_i == QOP_AUTH ? "auth" : "auth-int",
- ":", a2buf->ptr, NULL);
- MD5(tmp->ptr, strlen(tmp->ptr), md5);
- rd = digest_hex(md5);
- }
- else {
- /* compatibility with RFC 2069
- * request_digest = KD(H(A1), unq(nonce), H(A2))
- */
- tmp = Strnew_m_charp(a1buf->ptr, ":",
- qstr_unquote(get_auth_param(ha->param, "nonce"))->
- ptr, ":", a2buf->ptr, NULL);
- MD5(tmp->ptr, strlen(tmp->ptr), md5);
- rd = digest_hex(md5);
- }
-
- /*
- * digest-response = 1#( username | realm | nonce | digest-uri
- * | response | [ algorithm ] | [cnonce] |
- * [opaque] | [message-qop] |
- * [nonce-count] | [auth-param] )
- */
-
- tmp = Strnew_m_charp("Digest username=\"", uname->ptr, "\"", NULL);
- Strcat_m_charp(tmp, ", realm=",
- get_auth_param(ha->param, "realm")->ptr, NULL);
- Strcat_m_charp(tmp, ", nonce=",
- get_auth_param(ha->param, "nonce")->ptr, NULL);
- Strcat_m_charp(tmp, ", uri=\"", uri->ptr, "\"", NULL);
- Strcat_m_charp(tmp, ", response=\"", rd->ptr, "\"", NULL);
-
- if (algorithm)
- Strcat_m_charp(tmp, ", algorithm=",
- get_auth_param(ha->param, "algorithm")->ptr, NULL);
-
- if (cnonce)
- Strcat_m_charp(tmp, ", cnonce=\"", cnonce->ptr, "\"", NULL);
-
- if ((s = get_auth_param(ha->param, "opaque")) != NULL)
- Strcat_m_charp(tmp, ", opaque=", s->ptr, NULL);
-
- if (qop_i >= QOP_AUTH) {
- Strcat_m_charp(tmp, ", qop=",
- qop_i == QOP_AUTH ? "auth" : "auth-int",
- NULL);
- /* XXX how to count? */
- /* Since nonce is unique up to each *-Authenticate and w3m does not re-use *-Authenticate: headers,
- nonce-count should be always "00000001". */
- Strcat_m_charp(tmp, ", nc=", nc, NULL);
- }
-
- return tmp;
-}
-#endif
-
-/* *INDENT-OFF* */
-struct auth_param none_auth_param[] = {
- {NULL, NULL}
-};
-
-struct auth_param basic_auth_param[] = {
- {"realm", NULL},
- {NULL, NULL}
-};
-
-#ifdef USE_DIGEST_AUTH
-/* RFC2617: 3.2.1 The WWW-Authenticate Response Header
- * challenge = "Digest" digest-challenge
- *
- * digest-challenge = 1#( realm | [ domain ] | nonce |
- * [ opaque ] |[ stale ] | [ algorithm ] |
- * [ qop-options ] | [auth-param] )
- *
- * domain = "domain" "=" <"> URI ( 1*SP URI ) <">
- * URI = absoluteURI | abs_path
- * nonce = "nonce" "=" nonce-value
- * nonce-value = quoted-string
- * opaque = "opaque" "=" quoted-string
- * stale = "stale" "=" ( "true" | "false" )
- * algorithm = "algorithm" "=" ( "MD5" | "MD5-sess" |
- * token )
- * qop-options = "qop" "=" <"> 1#qop-value <">
- * qop-value = "auth" | "auth-int" | token
- */
-struct auth_param digest_auth_param[] = {
- {"realm", NULL},
- {"domain", NULL},
- {"nonce", NULL},
- {"opaque", NULL},
- {"stale", NULL},
- {"algorithm", NULL},
- {"qop", NULL},
- {NULL, NULL}
-};
-#endif
-/* for RFC2617: HTTP Authentication */
-struct http_auth www_auth[] = {
- { 1, "Basic ", basic_auth_param, AuthBasicCred },
-#ifdef USE_DIGEST_AUTH
- { 10, "Digest ", digest_auth_param, AuthDigestCred },
-#endif
- { 0, NULL, NULL, NULL,}
-};
-/* *INDENT-ON* */
-
-static struct http_auth *
-findAuthentication(struct http_auth *hauth, Buffer *buf, char *auth_field)
-{
- struct http_auth *ha;
- int len = strlen(auth_field), slen;
- TextListItem *i;
- char *p0, *p;
-
- bzero(hauth, sizeof(struct http_auth));
- for (i = buf->document_header->first; i != NULL; i = i->next) {
- if (strncasecmp(i->ptr, auth_field, len) == 0) {
- for (p = i->ptr + len; p != NULL && *p != '\0';) {
- SKIP_BLANKS(p);
- p0 = p;
- for (ha = &www_auth[0]; ha->scheme != NULL; ha++) {
- slen = strlen(ha->scheme);
- if (strncasecmp(p, ha->scheme, slen) == 0) {
- p += slen;
- SKIP_BLANKS(p);
- if (hauth->pri < ha->pri) {
- *hauth = *ha;
- p = extract_auth_param(p, hauth->param);
- break;
- }
- else {
- /* weak auth */
- p = extract_auth_param(p, none_auth_param);
- }
- }
- }
- if (p0 == p) {
- /* all unknown auth failed */
- int token_type;
- if ((token_type = skip_auth_token(&p)) == AUTHCHR_TOKEN && IS_SPACE(*p)) {
- SKIP_BLANKS(p);
- p = extract_auth_param(p, none_auth_param);
- }
- else
- break;
- }
- }
- }
- }
- return hauth->scheme ? hauth : NULL;
-}
-
-static void
-getAuthCookie(struct http_auth *hauth, char *auth_header,
- TextList *extra_header, ParsedURL *pu, HRequest *hr,
- FormList *request,
- volatile Str *uname, volatile Str *pwd)
-{
- Str ss = NULL;
- Str tmp;
- TextListItem *i;
- int a_found;
- int auth_header_len = strlen(auth_header);
- char *realm = NULL;
- int proxy;
-
- if (hauth)
- realm = qstr_unquote(get_auth_param(hauth->param, "realm"))->ptr;
-
- if (!realm)
- return;
-
- a_found = FALSE;
- for (i = extra_header->first; i != NULL; i = i->next) {
- if (!strncasecmp(i->ptr, auth_header, auth_header_len)) {
- a_found = TRUE;
- break;
- }
- }
- proxy = !strncasecmp("Proxy-Authorization:", auth_header,
- auth_header_len);
- if (a_found) {
- /* This means that *-Authenticate: header is received after
- * Authorization: header is sent to the server.
- */
- if (fmInitialized) {
- message("Wrong username or password", 0, 0);
- refresh();
- }
- else
- fprintf(stderr, "Wrong username or password\n");
- sleep(1);
- /* delete Authenticate: header from extra_header */
- delText(extra_header, i);
- invalidate_auth_user_passwd(pu, realm, *uname, *pwd, proxy);
- }
- *uname = NULL;
- *pwd = NULL;
-
- if (!a_found && find_auth_user_passwd(pu, realm, (Str*)uname, (Str*)pwd,
- proxy)) {
- /* found username & password in passwd file */ ;
- }
- else {
- if (QuietMessage)
- return;
- /* input username and password */
- sleep(2);
- if (fmInitialized) {
- char *pp;
- term_raw();
- /* FIXME: gettextize? */
- if ((pp = inputStr(Sprintf("Username for %s: ", realm)->ptr,
- NULL)) == NULL)
- return;
- *uname = Str_conv_to_system(Strnew_charp(pp));
- if ((pp = inputLine(Sprintf("Password for %s: ", realm)->ptr, NULL,
- IN_PASSWORD)) == NULL) {
- *uname = NULL;
- return;
- }
- *pwd = Str_conv_to_system(Strnew_charp(pp));
- term_cbreak();
- }
- else {
- /*
- * If post file is specified as '-', stdin is closed at this
- * point.
- * In this case, w3m cannot read username from stdin.
- * So exit with error message.
- * (This is same behavior as lwp-request.)
- */
- if (feof(stdin) || ferror(stdin)) {
- /* FIXME: gettextize? */
- fprintf(stderr, "w3m: Authorization required for %s\n",
- realm);
- exit(1);
- }
-
- /* FIXME: gettextize? */
- printf(proxy ? "Proxy Username for %s: " : "Username for %s: ",
- realm);
- fflush(stdout);
- *uname = Strfgets(stdin);
- Strchop(*uname);
-#ifdef HAVE_GETPASSPHRASE
- *pwd = Strnew_charp((char *)
- getpassphrase(proxy ? "Proxy Password: " :
- "Password: "));
-#else
- *pwd = Strnew_charp((char *)
- getpass(proxy ? "Proxy Password: " :
- "Password: "));
-#endif
- }
- }
- ss = hauth->cred(hauth, *uname, *pwd, pu, hr, request);
- if (ss) {
- tmp = Strnew_charp(auth_header);
- Strcat_m_charp(tmp, " ", ss->ptr, "\r\n", NULL);
- pushText(extra_header, tmp->ptr);
- }
- else {
- *uname = NULL;
- *pwd = NULL;
- }
- return;
-}
-
-static int
-same_url_p(ParsedURL *pu1, ParsedURL *pu2)
-{
- return (pu1->scheme == pu2->scheme && pu1->port == pu2->port &&
- (pu1->host ? pu2->host ? !strcasecmp(pu1->host, pu2->host) : 0 : 1)
- && (pu1->file ? pu2->
- file ? !strcmp(pu1->file, pu2->file) : 0 : 1));
-}
-
-static int
-checkRedirection(ParsedURL *pu)
-{
- static ParsedURL *puv = NULL;
- static int nredir = 0;
- static int nredir_size = 0;
- Str tmp;
-
- if (pu == NULL) {
- nredir = 0;
- nredir_size = 0;
- puv = NULL;
- return TRUE;
- }
- if (nredir >= FollowRedirection) {
- /* FIXME: gettextize? */
- tmp = Sprintf("Number of redirections exceeded %d at %s",
- FollowRedirection, parsedURL2Str(pu)->ptr);
- disp_err_message(tmp->ptr, FALSE);
- return FALSE;
- }
- else if (nredir_size > 0 &&
- (same_url_p(pu, &puv[(nredir - 1) % nredir_size]) ||
- (!(nredir % 2)
- && same_url_p(pu, &puv[(nredir / 2) % nredir_size])))) {
- /* FIXME: gettextize? */
- tmp = Sprintf("Redirection loop detected (%s)",
- parsedURL2Str(pu)->ptr);
- disp_err_message(tmp->ptr, FALSE);
- return FALSE;
- }
- if (!puv) {
- nredir_size = FollowRedirection / 2 + 1;
- puv = New_N(ParsedURL, nredir_size);
- memset(puv, 0, sizeof(ParsedURL) * nredir_size);
- }
- copyParsedURL(&puv[nredir % nredir_size], pu);
- nredir++;
- return TRUE;
-}
-
-/*
- * loadGeneralFile: load file to buffer
- */
-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;
- char *volatile tpath;
- char *volatile t = "text/plain", *p, *volatile real_type = NULL;
- Buffer *volatile t_buf = NULL;
- int volatile searchHeader = SearchHeader;
- int volatile searchHeader_through = TRUE;
- MySignalHandler(*volatile prevtrap) (SIGNAL_ARG) = NULL;
- TextList *extra_header = newTextList();
- volatile Str uname = NULL;
- volatile Str pwd = NULL;
- volatile Str realm = NULL;
- int volatile add_auth_cookie_flag;
- unsigned char status = HTST_NORMAL;
- URLOption url_option;
- Str tmp;
- Str volatile page = NULL;
-#ifdef USE_M17N
- wc_ces charset = WC_CES_US_ASCII;
-#endif
- HRequest hr;
- ParsedURL *volatile auth_pu;
-
- tpath = path;
- prevtrap = NULL;
- add_auth_cookie_flag = 0;
-
- checkRedirection(NULL);
- load_doc:
- TRAP_OFF;
- url_option.referer = referer;
- url_option.flag = flag;
- f = openURL(tpath, &pu, current, &url_option, request, extra_header, of,
- &hr, &status);
- of = NULL;
-#ifdef USE_M17N
- content_charset = 0;
-#endif
- if (f.stream == NULL) {
- switch (f.scheme) {
- case SCM_LOCAL:
- {
- struct stat st;
- if (stat(pu.real_file, &st) < 0)
- return NULL;
- if (S_ISDIR(st.st_mode)) {
- if (UseExternalDirBuffer) {
- Str cmd = Sprintf("%s?dir=%s#current",
- DirBufferCommand, pu.file);
- b = loadGeneralFile(cmd->ptr, NULL, NO_REFERER, 0,
- NULL);
- if (b != NULL && b != NO_BUFFER) {
- copyParsedURL(&b->currentURL, &pu);
- b->filename = b->currentURL.real_file;
- }
- return b;
- }
- else {
- page = loadLocalDir(pu.real_file);
- t = "local:directory";
-#ifdef USE_M17N
- charset = SystemCharset;
-#endif
- }
- }
- }
- break;
- case SCM_FTPDIR:
- page = loadFTPDir(&pu, &charset);
- t = "ftp:directory";
- break;
-#ifdef USE_NNTP
- case SCM_NEWS_GROUP:
- page = loadNewsgroup(&pu, &charset);
- t = "news:group";
- break;
-#endif
- case SCM_UNKNOWN:
-#ifdef USE_EXTERNAL_URI_LOADER
- tmp = searchURIMethods(&pu);
- if (tmp != NULL) {
- b = loadGeneralFile(tmp->ptr, current, referer, flag, request);
- if (b != NULL && b != NO_BUFFER)
- copyParsedURL(&b->currentURL, &pu);
- return b;
- }
-#endif
- /* FIXME: gettextize? */
- disp_err_message(Sprintf("Unknown URI: %s",
- parsedURL2Str(&pu)->ptr)->ptr, FALSE);
- break;
- }
- if (page && page->length > 0)
- goto page_loaded;
- return NULL;
- }
-
- if (status == HTST_MISSING) {
- TRAP_OFF;
- UFclose(&f);
- return NULL;
- }
-
- /* openURL() succeeded */
- if (SETJMP(AbortLoading) != 0) {
- /* transfer interrupted */
- TRAP_OFF;
- if (b)
- discardBuffer(b);
- UFclose(&f);
- return NULL;
- }
-
- b = NULL;
- if (f.is_cgi) {
- /* local CGI */
- searchHeader = TRUE;
- searchHeader_through = FALSE;
- }
- if (header_string)
- header_string = NULL;
- TRAP_ON;
- if (pu.scheme == SCM_HTTP ||
-#ifdef USE_SSL
- pu.scheme == SCM_HTTPS ||
-#endif /* USE_SSL */
- ((
-#ifdef USE_GOPHER
- (pu.scheme == SCM_GOPHER && non_null(GOPHER_proxy)) ||
-#endif /* USE_GOPHER */
- (pu.scheme == SCM_FTP && non_null(FTP_proxy))
- ) && !Do_not_use_proxy && !check_no_proxy(pu.host))) {
-
- if (fmInitialized) {
- term_cbreak();
- /* FIXME: gettextize? */
- message(Sprintf("%s contacted. Waiting for reply...", pu.host)->
- ptr, 0, 0);
- refresh();
- }
- if (t_buf == NULL)
- t_buf = newBuffer(INIT_BUFFER_WIDTH);
-#if 0 /* USE_SSL */
- if (IStype(f.stream) == IST_SSL) {
- Str s = ssl_get_certificate(f.stream, pu.host);
- if (s == NULL)
- return NULL;
- else
- t_buf->ssl_certificate = s->ptr;
- }
-#endif
- readHeader(&f, t_buf, FALSE, &pu);
- if (((http_response_code >= 301 && http_response_code <= 303)
- || http_response_code == 307)
- && (p = checkHeader(t_buf, "Location:")) != NULL
- && checkRedirection(&pu)) {
- /* document moved */
- /* 301: Moved Permanently */
- /* 302: Found */
- /* 303: See Other */
- /* 307: Temporary Redirect (HTTP/1.1) */
- tpath = url_quote_conv(p, DocumentCharset);
- request = NULL;
- UFclose(&f);
- current = New(ParsedURL);
- copyParsedURL(current, &pu);
- t_buf = newBuffer(INIT_BUFFER_WIDTH);
- t_buf->bufferprop |= BP_REDIRECTED;
- status = HTST_NORMAL;
- goto load_doc;
- }
- t = checkContentType(t_buf);
- if (t == NULL && pu.file != NULL) {
- if (!((http_response_code >= 400 && http_response_code <= 407) ||
- (http_response_code >= 500 && http_response_code <= 505)))
- t = guessContentType(pu.file);
- }
- if (t == NULL)
- t = "text/plain";
- if (add_auth_cookie_flag && realm && uname && pwd) {
- /* If authorization is required and passed */
- add_auth_user_passwd(&pu, qstr_unquote(realm)->ptr, uname, pwd,
- 0);
- add_auth_cookie_flag = 0;
- }
- if ((p = checkHeader(t_buf, "WWW-Authenticate:")) != NULL &&
- http_response_code == 401) {
- /* Authentication needed */
- struct http_auth hauth;
- if (findAuthentication(&hauth, t_buf, "WWW-Authenticate:") != NULL
- && (realm = get_auth_param(hauth.param, "realm")) != NULL) {
- auth_pu = &pu;
- getAuthCookie(&hauth, "Authorization:", extra_header,
- auth_pu, &hr, request, &uname, &pwd);
- if (uname == NULL) {
- /* abort */
- TRAP_OFF;
- goto page_loaded;
- }
- UFclose(&f);
- add_auth_cookie_flag = 1;
- status = HTST_NORMAL;
- goto load_doc;
- }
- }
- if ((p = checkHeader(t_buf, "Proxy-Authenticate:")) != NULL &&
- http_response_code == 407) {
- /* Authentication needed */
- struct http_auth hauth;
- if (findAuthentication(&hauth, t_buf, "Proxy-Authenticate:")
- != NULL
- && (realm = get_auth_param(hauth.param, "realm")) != NULL) {
- auth_pu = schemeToProxy(pu.scheme);
- getAuthCookie(&hauth, "Proxy-Authorization:",
- extra_header, auth_pu, &hr, request,
- &uname, &pwd);
- if (uname == NULL) {
- /* abort */
- TRAP_OFF;
- goto page_loaded;
- }
- UFclose(&f);
- add_auth_cookie_flag = 1;
- status = HTST_NORMAL;
- goto load_doc;
- }
- }
- /* XXX: RFC2617 3.2.3 Authentication-Info: ? */
-
- if (status == HTST_CONNECT) {
- of = &f;
- goto load_doc;
- }
-
- f.modtime = mymktime(checkHeader(t_buf, "Last-Modified:"));
- }
-#ifdef USE_NNTP
- else if (pu.scheme == SCM_NEWS || pu.scheme == SCM_NNTP) {
- if (t_buf == NULL)
- t_buf = newBuffer(INIT_BUFFER_WIDTH);
- readHeader(&f, t_buf, TRUE, &pu);
- t = checkContentType(t_buf);
- if (t == NULL)
- t = "text/plain";
- }
-#endif /* USE_NNTP */
-#ifdef USE_GOPHER
- else if (pu.scheme == SCM_GOPHER) {
- switch (*pu.file) {
- case '0':
- t = "text/plain";
- break;
- case '1':
- case 'm':
- page = loadGopherDir(&f, &pu, &charset);
- t = "gopher:directory";
- TRAP_OFF;
- goto page_loaded;
- case 's':
- t = "audio/basic";
- break;
- case 'g':
- t = "image/gif";
- break;
- case 'h':
- t = "text/html";
- break;
- }
- }
-#endif /* USE_GOPHER */
- else if (pu.scheme == SCM_FTP) {
- check_compression(path, &f);
- if (f.compression != CMP_NOCOMPRESS) {
- char *t1 = uncompressed_file_type(pu.file, NULL);
- real_type = f.guess_type;
-#if 0
- if (t1 && strncasecmp(t1, "application/", 12) == 0) {
- f.compression = CMP_NOCOMPRESS;
- t = real_type;
- }
- else
-#endif
- if (t1)
- t = t1;
- else
- t = real_type;
- }
- else {
- real_type = guessContentType(pu.file);
- if (real_type == NULL)
- real_type = "text/plain";
- t = real_type;
- }
-#if 0
- if (!strncasecmp(t, "application/", 12)) {
- char *tmpf = tmpfname(TMPF_DFL, NULL)->ptr;
- current_content_length = 0;
- if (save2tmp(f, tmpf) < 0)
- UFclose(&f);
- else {
- UFclose(&f);
- TRAP_OFF;
- doFileMove(tmpf, guess_save_name(t_buf, pu.file));
- }
- return NO_BUFFER;
- }
-#endif
- }
- else if (pu.scheme == SCM_DATA) {
- t = f.guess_type;
- }
- else if (searchHeader) {
- searchHeader = SearchHeader = FALSE;
- if (t_buf == NULL)
- t_buf = newBuffer(INIT_BUFFER_WIDTH);
- readHeader(&f, t_buf, searchHeader_through, &pu);
- if (f.is_cgi && (p = checkHeader(t_buf, "Location:")) != NULL &&
- checkRedirection(&pu)) {
- /* document moved */
- tpath = url_quote_conv(remove_space(p), DocumentCharset);
- request = NULL;
- UFclose(&f);
- add_auth_cookie_flag = 0;
- current = New(ParsedURL);
- copyParsedURL(current, &pu);
- t_buf = newBuffer(INIT_BUFFER_WIDTH);
- t_buf->bufferprop |= BP_REDIRECTED;
- status = HTST_NORMAL;
- goto load_doc;
- }
-#ifdef AUTH_DEBUG
- if ((p = checkHeader(t_buf, "WWW-Authenticate:")) != NULL) {
- /* Authentication needed */
- struct http_auth hauth;
- if (findAuthentication(&hauth, t_buf, "WWW-Authenticate:") != NULL
- && (realm = get_auth_param(hauth.param, "realm")) != NULL) {
- auth_pu = &pu;
- getAuthCookie(&hauth, "Authorization:", extra_header,
- auth_pu, &hr, request, &uname, &pwd);
- if (uname == NULL) {
- /* abort */
- TRAP_OFF;
- goto page_loaded;
- }
- UFclose(&f);
- add_auth_cookie_flag = 1;
- status = HTST_NORMAL;
- goto load_doc;
- }
- }
-#endif /* defined(AUTH_DEBUG) */
- t = checkContentType(t_buf);
- if (t == NULL)
- t = "text/plain";
- }
- else if (DefaultType) {
- t = DefaultType;
- DefaultType = NULL;
- }
- else {
- t = guessContentType(pu.file);
- if (t == NULL)
- t = "text/plain";
- real_type = t;
- if (f.guess_type)
- t = f.guess_type;
- }
-
- page_loaded:
- if (page) {
- FILE *src;
-#ifdef USE_IMAGE
- if (image_source)
- return NULL;
-#endif
- tmp = tmpfname(TMPF_SRC, ".html");
- src = fopen(tmp->ptr, "w");
- if (src) {
- Str s;
- s = wc_Str_conv_strict(page, InnerCharset, charset);
- Strfputs(s, src);
- fclose(src);
- }
- if (do_download) {
- char *file;
- if (!src)
- return NULL;
- file = guess_filename(pu.file);
-#ifdef USE_GOPHER
- if (f.scheme == SCM_GOPHER)
- file = Sprintf("%s.html", file)->ptr;
-#endif
-#ifdef USE_NNTP
- if (f.scheme == SCM_NEWS_GROUP)
- file = Sprintf("%s.html", file)->ptr;
-#endif
- doFileMove(tmp->ptr, file);
- return NO_BUFFER;
- }
- b = loadHTMLString(page);
- if (b) {
- copyParsedURL(&b->currentURL, &pu);
- b->real_scheme = pu.scheme;
- b->real_type = t;
- if (src)
- b->sourcefile = tmp->ptr;
-#ifdef USE_M17N
- b->document_charset = charset;
-#endif
- }
- return b;
- }
-
- 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)
- current_content_length = strtoclen(p);
- if (do_download) {
- /* download only */
- char *file;
- TRAP_OFF;
- if (DecodeCTE && IStype(f.stream) != IST_ENCODED)
- f.stream = newEncodedStream(f.stream, f.encoding);
- if (pu.scheme == SCM_LOCAL) {
- struct stat st;
- if (PreserveTimestamp && !stat(pu.real_file, &st))
- f.modtime = st.st_mtime;
- file = conv_from_system(guess_save_name(NULL, pu.real_file));
- }
- else
- file = guess_save_name(t_buf, pu.file);
- if (doFileSave(f, file) == 0)
- UFhalfclose(&f);
- else
- UFclose(&f);
- return NO_BUFFER;
- }
-
- if (f.content_encoding != CMP_NOCOMPRESS) {
- uncompress_stream(&f, &pu.real_file);
- }
- else if (f.compression != CMP_NOCOMPRESS) {
- if (!(w3m_dump & DUMP_SOURCE) &&
- (w3m_dump & ~DUMP_FRAME || is_text_type(t)
- || searchExtViewer(t))) {
- if (t_buf == NULL)
- t_buf = newBuffer(INIT_BUFFER_WIDTH);
- uncompress_stream(&f, &t_buf->sourcefile);
- uncompressed_file_type(pu.file, &f.ext);
- }
- else {
- t = compress_application_type(f.compression);
- f.compression = CMP_NOCOMPRESS;
- }
- }
-#ifdef USE_IMAGE
- if (image_source) {
- Buffer *b = NULL;
- if (IStype(f.stream) != IST_ENCODED)
- f.stream = newEncodedStream(f.stream, f.encoding);
- if (save2tmp(f, image_source) == 0) {
- b = newBuffer(INIT_BUFFER_WIDTH);
- b->sourcefile = image_source;
- b->real_type = t;
- }
- UFclose(&f);
- TRAP_OFF;
- return b;
- }
-#endif
-
- if (!strcasecmp(t, "text/html"))
- proc = loadHTMLBuffer;
- else if (is_plain_text_type(t))
- proc = loadBuffer;
-#ifdef USE_IMAGE
- else if (activeImage && displayImage && !useExtImageViewer &&
- !(w3m_dump & ~DUMP_FRAME) && !strncasecmp(t, "image/", 6))
- proc = loadImageBuffer;
-#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;
- }
- else {
- TRAP_OFF;
- if (pu.scheme == SCM_LOCAL) {
- UFclose(&f);
- _doFileCopy(pu.real_file,
- conv_from_system(guess_save_name
- (NULL, pu.real_file)), TRUE);
- }
- else {
- if (DecodeCTE && IStype(f.stream) != IST_ENCODED)
- f.stream = newEncodedStream(f.stream, f.encoding);
- if (doFileSave(f, guess_save_name(t_buf, pu.file)) == 0)
- UFhalfclose(&f);
- else
- UFclose(&f);
- }
- return NO_BUFFER;
- }
- }
- else if (w3m_dump & DUMP_FRAME)
- return 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;
-#endif
- frame_source = flag & RG_FRAME_SRC;
- b = loadSomething(&f, pu.real_file ? pu.real_file : pu.file, proc, t_buf);
- UFclose(&f);
- frame_source = 0;
- if (b) {
- b->real_scheme = f.scheme;
- b->real_type = real_type;
- if (b->currentURL.host == NULL && b->currentURL.file == NULL)
- copyParsedURL(&b->currentURL, &pu);
- if (!strcasecmp(t, "text/html"))
- 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 (pu.label) {
- if (proc == loadHTMLBuffer) {
- Anchor *a;
- a = searchURLLabel(b, pu.label);
- if (a != NULL) {
- gotoLine(b, a->start.line);
- if (label_topline)
- b->topLine = lineSkip(b, b->topLine,
- b->currentLine->linenumber
- - b->topLine->linenumber, FALSE);
- b->pos = a->start.pos;
- arrangeCursor(b);
- }
- }
- else { /* plain text */
- int l = atoi(pu.label);
- gotoLine(b, l);
- b->pos = 0;
- arrangeCursor(b);
- }
- }
- }
- if (header_string)
- header_string = NULL;
-#ifdef USE_NNTP
- if (f.scheme == SCM_NNTP || f.scheme == SCM_NEWS)
- reAnchorNewsheader(b);
-#endif
- preFormUpdateBuffer(b);
- TRAP_OFF;
- return b;
-}
-
-#define TAG_IS(s,tag,len)\
- (strncasecmp(s,tag,len)==0&&(s[len] == '>' || IS_SPACE((int)s[len])))
-
-static char *
-has_hidden_link(struct readbuffer *obuf, int cmd)
-{
- Str line = obuf->line;
- struct link_stack *p;
-
- if (Strlastchar(line) != '>')
- return NULL;
-
- for (p = link_stack; p; p = p->next)
- if (p->cmd == cmd)
- break;
- if (!p)
- return NULL;
-
- if (obuf->pos == p->pos)
- return line->ptr + p->offset;
-
- return NULL;
-}
-
-static void
-push_link(int cmd, int offset, int pos)
-{
- struct link_stack *p;
- p = New(struct link_stack);
- p->cmd = cmd;
- p->offset = offset;
- p->pos = pos;
- p->next = link_stack;
- link_stack = p;
-}
-
-static int
-is_period_char(unsigned char *ch)
-{
- switch (*ch) {
- case ',':
- case '.':
- case ':':
- case ';':
- case '?':
- case '!':
- case ')':
- case ']':
- case '}':
- case '>':
- return 1;
- default:
- return 0;
- }
-}
-
-static int
-is_beginning_char(unsigned char *ch)
-{
- switch (*ch) {
- case '(':
- case '[':
- case '{':
- case '`':
- case '<':
- return 1;
- default:
- return 0;
- }
-}
-
-static int
-is_word_char(unsigned char *ch)
-{
- Lineprop ctype = get_mctype(ch);
-
-#ifdef USE_M17N
- if (ctype & (PC_CTRL | PC_KANJI | PC_UNKNOWN))
- return 0;
- if (ctype & (PC_WCHAR1 | PC_WCHAR2))
- return 1;
-#else
- if (ctype == PC_CTRL)
- return 0;
-#endif
-
- if (IS_ALNUM(*ch))
- return 1;
-
- switch (*ch) {
- case ',':
- case '.':
- case ':':
- case '\"': /* " */
- case '\'':
- case '$':
- case '%':
- case '*':
- case '+':
- case '-':
- case '@':
- case '~':
- case '_':
- return 1;
- }
-#ifdef USE_M17N
- if (*ch == NBSP_CODE)
- return 1;
-#else
- if (*ch == TIMES_CODE || *ch == DIVIDE_CODE || *ch == ANSP_CODE)
- return 0;
- if (*ch >= AGRAVE_CODE || *ch == NBSP_CODE)
- return 1;
-#endif
- return 0;
-}
-
-#ifdef USE_M17N
-static int
-is_combining_char(unsigned char *ch)
-{
- Lineprop ctype = get_mctype(ch);
-
- if (ctype & PC_WCHAR2)
- return 1;
- return 0;
-}
-#endif
-
-int
-is_boundary(unsigned char *ch1, unsigned char *ch2)
-{
- if (!*ch1 || !*ch2)
- return 1;
-
- if (*ch1 == ' ' && *ch2 == ' ')
- return 0;
-
- if (*ch1 != ' ' && is_period_char(ch2))
- return 0;
-
- if (*ch2 != ' ' && is_beginning_char(ch1))
- return 0;
-
-#ifdef USE_M17N
- if (is_combining_char(ch2))
- return 0;
-#endif
- if (is_word_char(ch1) && is_word_char(ch2))
- return 0;
-
- return 1;
-}
-
-
-static void
-set_breakpoint(struct readbuffer *obuf, int tag_length)
-{
- obuf->bp.len = obuf->line->length;
- obuf->bp.pos = obuf->pos;
- obuf->bp.tlen = tag_length;
- obuf->bp.flag = obuf->flag;
-#ifdef FORMAT_NICE
- obuf->bp.flag &= ~RB_FILL;
-#endif /* FORMAT_NICE */
- obuf->bp.top_margin = obuf->top_margin;
- obuf->bp.bottom_margin = obuf->bottom_margin;
-
- if (!obuf->bp.init_flag)
- return;
-
- bcopy((void *)&obuf->anchor, (void *)&obuf->bp.anchor,
- sizeof(obuf->anchor));
- obuf->bp.img_alt = obuf->img_alt;
- obuf->bp.in_bold = obuf->in_bold;
- obuf->bp.in_under = obuf->in_under;
- obuf->bp.nobr_level = obuf->nobr_level;
- obuf->bp.prev_ctype = obuf->prev_ctype;
- obuf->bp.init_flag = 0;
-}
-
-static void
-back_to_breakpoint(struct readbuffer *obuf)
-{
- obuf->flag = obuf->bp.flag;
- bcopy((void *)&obuf->bp.anchor, (void *)&obuf->anchor,
- sizeof(obuf->anchor));
- obuf->img_alt = obuf->bp.img_alt;
- obuf->in_bold = obuf->bp.in_bold;
- obuf->in_under = obuf->bp.in_under;
- obuf->prev_ctype = obuf->bp.prev_ctype;
- obuf->pos = obuf->bp.pos;
- obuf->top_margin = obuf->bp.top_margin;
- obuf->bottom_margin = obuf->bp.bottom_margin;
- if (obuf->flag & RB_NOBR)
- obuf->nobr_level = obuf->bp.nobr_level;
-}
-
-static void
-append_tags(struct readbuffer *obuf)
-{
- int i;
- int len = obuf->line->length;
- int set_bp = 0;
-
- for (i = 0; i < obuf->tag_sp; i++) {
- switch (obuf->tag_stack[i]->cmd) {
- case HTML_A:
- case HTML_IMG_ALT:
- case HTML_B:
- case HTML_U:
- push_link(obuf->tag_stack[i]->cmd, obuf->line->length, obuf->pos);
- break;
- }
- Strcat_charp(obuf->line, obuf->tag_stack[i]->cmdname);
- switch (obuf->tag_stack[i]->cmd) {
- case HTML_NOBR:
- if (obuf->nobr_level > 1)
- break;
- case HTML_WBR:
- set_bp = 1;
- break;
- }
- }
- obuf->tag_sp = 0;
- if (set_bp)
- set_breakpoint(obuf, obuf->line->length - len);
-}
-
-static void
-push_tag(struct readbuffer *obuf, char *cmdname, int cmd)
-{
- obuf->tag_stack[obuf->tag_sp] = New(struct cmdtable);
- obuf->tag_stack[obuf->tag_sp]->cmdname = allocStr(cmdname, -1);
- obuf->tag_stack[obuf->tag_sp]->cmd = cmd;
- obuf->tag_sp++;
- if (obuf->tag_sp >= TAG_STACK_SIZE || obuf->flag & (RB_SPECIAL & ~RB_NOBR))
- append_tags(obuf);
-}
-
-static void
-push_nchars(struct readbuffer *obuf, int width,
- char *str, int len, Lineprop mode)
-{
- append_tags(obuf);
- Strcat_charp_n(obuf->line, str, len);
- obuf->pos += width;
- if (width > 0) {
- set_prevchar(obuf->prevchar, str, len);
- obuf->prev_ctype = mode;
- }
- obuf->flag |= RB_NFLUSHED;
-}
-
-#define push_charp(obuf, width, str, mode)\
-push_nchars(obuf, width, str, strlen(str), mode)
-
-#define push_str(obuf, width, str, mode)\
-push_nchars(obuf, width, str->ptr, str->length, mode)
-
-static void
-check_breakpoint(struct readbuffer *obuf, int pre_mode, char *ch)
-{
- int tlen, len = obuf->line->length;
-
- append_tags(obuf);
- if (pre_mode)
- return;
- tlen = obuf->line->length - len;
- if (tlen > 0
- || is_boundary((unsigned char *)obuf->prevchar->ptr,
- (unsigned char *)ch))
- set_breakpoint(obuf, tlen);
-}
-
-static void
-push_char(struct readbuffer *obuf, int pre_mode, char ch)
-{
- check_breakpoint(obuf, pre_mode, &ch);
- Strcat_char(obuf->line, ch);
- obuf->pos++;
- set_prevchar(obuf->prevchar, &ch, 1);
- if (ch != ' ')
- obuf->prev_ctype = PC_ASCII;
- obuf->flag |= RB_NFLUSHED;
-}
-
-#define PUSH(c) push_char(obuf, obuf->flag & RB_SPECIAL, c)
-
-static void
-push_spaces(struct readbuffer *obuf, int pre_mode, int width)
-{
- int i;
-
- if (width <= 0)
- return;
- check_breakpoint(obuf, pre_mode, " ");
- for (i = 0; i < width; i++)
- Strcat_char(obuf->line, ' ');
- obuf->pos += width;
- set_space_to_prevchar(obuf->prevchar);
- obuf->flag |= RB_NFLUSHED;
-}
-
-static void
-proc_mchar(struct readbuffer *obuf, int pre_mode,
- int width, char **str, Lineprop mode)
-{
- check_breakpoint(obuf, pre_mode, *str);
- obuf->pos += width;
- Strcat_charp_n(obuf->line, *str, get_mclen(*str));
- if (width > 0) {
- set_prevchar(obuf->prevchar, *str, 1);
- if (**str != ' ')
- obuf->prev_ctype = mode;
- }
- (*str) += get_mclen(*str);
- obuf->flag |= RB_NFLUSHED;
-}
-
-void
-push_render_image(Str str, int width, int limit,
- struct html_feed_environ *h_env)
-{
- struct readbuffer *obuf = h_env->obuf;
- int indent = h_env->envs[h_env->envc].indent;
-
- push_spaces(obuf, 1, (limit - width) / 2);
- push_str(obuf, width, str, PC_ASCII);
- push_spaces(obuf, 1, (limit - width + 1) / 2);
- if (width > 0)
- flushline(h_env, obuf, indent, 0, h_env->limit);
-}
-
-static int
-sloppy_parse_line(char **str)
-{
- if (**str == '<') {
- while (**str && **str != '>')
- (*str)++;
- if (**str == '>')
- (*str)++;
- return 1;
- }
- else {
- while (**str && **str != '<')
- (*str)++;
- return 0;
- }
-}
-
-static void
-passthrough(struct readbuffer *obuf, char *str, int back)
-{
- int cmd;
- Str tok = Strnew();
- char *str_bak;
-
- if (back) {
- Str str_save = Strnew_charp(str);
- Strshrink(obuf->line, obuf->line->ptr + obuf->line->length - str);
- str = str_save->ptr;
- }
- while (*str) {
- str_bak = str;
- if (sloppy_parse_line(&str)) {
- char *q = str_bak;
- cmd = gethtmlcmd(&q);
- if (back) {
- struct link_stack *p;
- for (p = link_stack; p; p = p->next) {
- if (p->cmd == cmd) {
- link_stack = p->next;
- break;
- }
- }
- back = 0;
- }
- else {
- Strcat_charp_n(tok, str_bak, str - str_bak);
- push_tag(obuf, tok->ptr, cmd);
- Strclear(tok);
- }
- }
- else {
- push_nchars(obuf, 0, str_bak, str - str_bak, obuf->prev_ctype);
- }
- }
-}
-
-#if 0
-int
-is_blank_line(char *line, int indent)
-{
- int i, is_blank = 0;
-
- for (i = 0; i < indent; i++) {
- if (line[i] == '\0') {
- is_blank = 1;
- }
- else if (line[i] != ' ') {
- break;
- }
- }
- if (i == indent && line[i] == '\0')
- is_blank = 1;
- return is_blank;
-}
-#endif
-
-void
-fillline(struct readbuffer *obuf, int indent)
-{
- push_spaces(obuf, 1, indent - obuf->pos);
- obuf->flag &= ~RB_NFLUSHED;
-}
-
-void
-flushline(struct html_feed_environ *h_env, struct readbuffer *obuf, int indent,
- int force, int width)
-{
- TextLineList *buf = h_env->buf;
- FILE *f = h_env->f;
- Str line = obuf->line, pass = NULL;
- char *hidden_anchor = NULL, *hidden_img = NULL, *hidden_bold = NULL,
- *hidden_under = NULL, *hidden = NULL;
-
-#ifdef DEBUG
- if (w3m_debug) {
- FILE *df = fopen("zzzproc1", "a");
- fprintf(df, "flushline(%s,%d,%d,%d)\n", obuf->line->ptr, indent, force,
- width);
- if (buf) {
- TextLineListItem *p;
- for (p = buf->first; p; p = p->next) {
- fprintf(df, "buf=\"%s\"\n", p->ptr->line->ptr);
- }
- }
- fclose(df);
- }
-#endif
-
- if (!(obuf->flag & (RB_SPECIAL & ~RB_NOBR)) && Strlastchar(line) == ' ') {
- Strshrink(line, 1);
- obuf->pos--;
- }
-
- append_tags(obuf);
-
- if (obuf->anchor.url)
- hidden = hidden_anchor = has_hidden_link(obuf, HTML_A);
- if (obuf->img_alt) {
- if ((hidden_img = has_hidden_link(obuf, HTML_IMG_ALT)) != NULL) {
- if (!hidden || hidden_img < hidden)
- hidden = hidden_img;
- }
- }
- if (obuf->in_bold) {
- if ((hidden_bold = has_hidden_link(obuf, HTML_B)) != NULL) {
- if (!hidden || hidden_bold < hidden)
- hidden = hidden_bold;
- }
- }
- if (obuf->in_under) {
- if ((hidden_under = has_hidden_link(obuf, HTML_U)) != NULL) {
- if (!hidden || hidden_under < hidden)
- hidden = hidden_under;
- }
- }
- if (hidden) {
- pass = Strnew_charp(hidden);
- Strshrink(line, line->ptr + line->length - hidden);
- }
-
- if (!(obuf->flag & (RB_SPECIAL & ~RB_NOBR)) && obuf->pos > width) {
- char *tp = &line->ptr[obuf->bp.len - obuf->bp.tlen];
- char *ep = &line->ptr[line->length];
-
- if (obuf->bp.pos == obuf->pos && tp <= ep &&
- tp > line->ptr && tp[-1] == ' ') {
- bcopy(tp, tp - 1, ep - tp + 1);
- line->length--;
- obuf->pos--;
- }
- }
-
- if (obuf->anchor.url && !hidden_anchor)
- Strcat_charp(line, "</a>");
- if (obuf->img_alt && !hidden_img)
- Strcat_charp(line, "</img_alt>");
- if (obuf->in_bold && !hidden_bold)
- Strcat_charp(line, "</b>");
- if (obuf->in_under && !hidden_under)
- Strcat_charp(line, "</u>");
-
- if (obuf->top_margin > 0) {
- int i;
- struct html_feed_environ h;
- struct readbuffer o;
- struct environment e[1];
-
- init_henv(&h, &o, e, 1, NULL, width, indent);
- o.line = Strnew_size(width + 20);
- o.pos = obuf->pos;
- o.flag = obuf->flag;
- o.top_margin = -1;
- o.bottom_margin = -1;
- Strcat_charp(o.line, "<pre_int>");
- for (i = 0; i < o.pos; i++)
- Strcat_char(o.line, ' ');
- Strcat_charp(o.line, "</pre_int>");
- for (i = 0; i < obuf->top_margin; i++)
- flushline(h_env, &o, indent, force, width);
- }
-
- if (force == 1 || obuf->flag & RB_NFLUSHED) {
- TextLine *lbuf = newTextLine(line, obuf->pos);
- if (RB_GET_ALIGN(obuf) == RB_CENTER) {
- align(lbuf, width, ALIGN_CENTER);
- }
- else if (RB_GET_ALIGN(obuf) == RB_RIGHT) {
- align(lbuf, width, ALIGN_RIGHT);
- }
- else if (RB_GET_ALIGN(obuf) == RB_LEFT && obuf->flag & RB_INTABLE) {
- align(lbuf, width, ALIGN_LEFT);
- }
-#ifdef FORMAT_NICE
- else if (obuf->flag & RB_FILL) {
- char *p;
- int rest, rrest;
- int nspace, d, i;
-
- rest = width - get_Str_strwidth(line);
- if (rest > 1) {
- nspace = 0;
- for (p = line->ptr + indent; *p; p++) {
- if (*p == ' ')
- nspace++;
- }
- if (nspace > 0) {
- int indent_here = 0;
- d = rest / nspace;
- p = line->ptr;
- while (IS_SPACE(*p)) {
- p++;
- indent_here++;
- }
- rrest = rest - d * nspace;
- line = Strnew_size(width + 1);
- for (i = 0; i < indent_here; i++)
- Strcat_char(line, ' ');
- for (; *p; p++) {
- Strcat_char(line, *p);
- if (*p == ' ') {
- for (i = 0; i < d; i++)
- Strcat_char(line, ' ');
- if (rrest > 0) {
- Strcat_char(line, ' ');
- rrest--;
- }
- }
- }
- lbuf = newTextLine(line, width);
- }
- }
- }
-#endif /* FORMAT_NICE */
-#ifdef TABLE_DEBUG
- if (w3m_debug) {
- FILE *f = fopen("zzzproc1", "a");
- fprintf(f, "pos=%d,%d, maxlimit=%d\n",
- visible_length(lbuf->line->ptr), lbuf->pos,
- h_env->maxlimit);
- fclose(f);
- }
-#endif
- if (lbuf->pos > h_env->maxlimit)
- h_env->maxlimit = lbuf->pos;
- if (buf)
- pushTextLine(buf, lbuf);
- else if (f) {
- Strfputs(Str_conv_to_halfdump(lbuf->line), f);
- fputc('\n', f);
- }
- if (obuf->flag & RB_SPECIAL || obuf->flag & RB_NFLUSHED)
- h_env->blank_lines = 0;
- else
- h_env->blank_lines++;
- }
- else {
- char *p = line->ptr, *q;
- Str tmp = Strnew(), tmp2 = Strnew();
-
-#define APPEND(str) \
- if (buf) \
- appendTextLine(buf,(str),0); \
- else if (f) \
- Strfputs((str),f)
-
- while (*p) {
- q = p;
- if (sloppy_parse_line(&p)) {
- Strcat_charp_n(tmp, q, p - q);
- if (force == 2) {
- APPEND(tmp);
- }
- else
- Strcat(tmp2, tmp);
- Strclear(tmp);
- }
- }
- if (force == 2) {
- if (pass) {
- APPEND(pass);
- }
- pass = NULL;
- }
- else {
- if (pass)
- Strcat(tmp2, pass);
- pass = tmp2;
- }
- }
-
- if (obuf->bottom_margin > 0) {
- int i;
- struct html_feed_environ h;
- struct readbuffer o;
- struct environment e[1];
-
- init_henv(&h, &o, e, 1, NULL, width, indent);
- o.line = Strnew_size(width + 20);
- o.pos = obuf->pos;
- o.flag = obuf->flag;
- o.top_margin = -1;
- o.bottom_margin = -1;
- Strcat_charp(o.line, "<pre_int>");
- for (i = 0; i < o.pos; i++)
- Strcat_char(o.line, ' ');
- Strcat_charp(o.line, "</pre_int>");
- for (i = 0; i < obuf->bottom_margin; i++)
- flushline(h_env, &o, indent, force, width);
- }
- if (obuf->top_margin < 0 || obuf->bottom_margin < 0)
- return;
-
- obuf->line = Strnew_size(256);
- obuf->pos = 0;
- obuf->top_margin = 0;
- obuf->bottom_margin = 0;
- set_space_to_prevchar(obuf->prevchar);
- obuf->bp.init_flag = 1;
- obuf->flag &= ~RB_NFLUSHED;
- set_breakpoint(obuf, 0);
- obuf->prev_ctype = PC_ASCII;
- link_stack = NULL;
- fillline(obuf, indent);
- if (pass)
- passthrough(obuf, pass->ptr, 0);
- if (!hidden_anchor && obuf->anchor.url) {
- Str tmp;
- if (obuf->anchor.hseq > 0)
- obuf->anchor.hseq = -obuf->anchor.hseq;
- tmp = Sprintf("<A HSEQ=\"%d\" HREF=\"", obuf->anchor.hseq);
- Strcat_charp(tmp, html_quote(obuf->anchor.url));
- if (obuf->anchor.target) {
- Strcat_charp(tmp, "\" TARGET=\"");
- Strcat_charp(tmp, html_quote(obuf->anchor.target));
- }
- if (obuf->anchor.referer) {
- Strcat_charp(tmp, "\" REFERER=\"");
- Strcat_charp(tmp, html_quote(obuf->anchor.referer));
- }
- if (obuf->anchor.title) {
- Strcat_charp(tmp, "\" TITLE=\"");
- Strcat_charp(tmp, html_quote(obuf->anchor.title));
- }
- if (obuf->anchor.accesskey) {
- char *c = html_quote_char(obuf->anchor.accesskey);
- Strcat_charp(tmp, "\" ACCESSKEY=\"");
- if (c)
- Strcat_charp(tmp, c);
- else
- Strcat_char(tmp, obuf->anchor.accesskey);
- }
- Strcat_charp(tmp, "\">");
- push_tag(obuf, tmp->ptr, HTML_A);
- }
- if (!hidden_img && obuf->img_alt) {
- Str tmp = Strnew_charp("<IMG_ALT SRC=\"");
- Strcat_charp(tmp, html_quote(obuf->img_alt->ptr));
- Strcat_charp(tmp, "\">");
- push_tag(obuf, tmp->ptr, HTML_IMG_ALT);
- }
- if (!hidden_bold && obuf->in_bold)
- push_tag(obuf, "<B>", HTML_B);
- if (!hidden_under && obuf->in_under)
- push_tag(obuf, "<U>", HTML_U);
-}
-
-void
-do_blankline(struct html_feed_environ *h_env, struct readbuffer *obuf,
- int indent, int indent_incr, int width)
-{
- if (h_env->blank_lines == 0)
- flushline(h_env, obuf, indent, 1, width);
-}
-
-void
-purgeline(struct html_feed_environ *h_env)
-{
- char *p, *q;
- Str tmp;
-
- if (h_env->buf == NULL || h_env->blank_lines == 0)
- return;
-
- p = rpopTextLine(h_env->buf)->line->ptr;
- tmp = Strnew();
- while (*p) {
- q = p;
- if (sloppy_parse_line(&p)) {
- Strcat_charp_n(tmp, q, p - q);
- }
- }
- appendTextLine(h_env->buf, tmp, 0);
- h_env->blank_lines--;
-}
-
-static int
-close_effect0(struct readbuffer *obuf, int cmd)
-{
- int i;
- char *p;
-
- for (i = obuf->tag_sp - 1; i >= 0; i--) {
- if (obuf->tag_stack[i]->cmd == cmd)
- break;
- }
- if (i >= 0) {
- obuf->tag_sp--;
- bcopy(&obuf->tag_stack[i + 1], &obuf->tag_stack[i],
- (obuf->tag_sp - i) * sizeof(struct cmdtable *));
- return 1;
- }
- else if ((p = has_hidden_link(obuf, cmd)) != NULL) {
- passthrough(obuf, p, 1);
- return 1;
- }
- return 0;
-}
-
-static void
-close_anchor(struct html_feed_environ *h_env, struct readbuffer *obuf)
-{
- if (obuf->anchor.url) {
- int i;
- char *p = NULL;
- int is_erased = 0;
-
- for (i = obuf->tag_sp - 1; i >= 0; i--) {
- if (obuf->tag_stack[i]->cmd == HTML_A)
- break;
- }
- if (i < 0 && obuf->anchor.hseq > 0 && Strlastchar(obuf->line) == ' ') {
- Strshrink(obuf->line, 1);
- obuf->pos--;
- is_erased = 1;
- }
-
- if (i >= 0 || (p = has_hidden_link(obuf, HTML_A))) {
- if (obuf->anchor.hseq > 0) {
- HTMLlineproc1(ANSP, h_env);
- set_space_to_prevchar(obuf->prevchar);
- }
- else {
- if (i >= 0) {
- obuf->tag_sp--;
- bcopy(&obuf->tag_stack[i + 1], &obuf->tag_stack[i],
- (obuf->tag_sp - i) * sizeof(struct cmdtable *));
- }
- else {
- passthrough(obuf, p, 1);
- }
- bzero((void *)&obuf->anchor, sizeof(obuf->anchor));
- return;
- }
- is_erased = 0;
- }
- if (is_erased) {
- Strcat_char(obuf->line, ' ');
- obuf->pos++;
- }
-
- push_tag(obuf, "</a>", HTML_N_A);
- }
- bzero((void *)&obuf->anchor, sizeof(obuf->anchor));
-}
-
-void
-save_fonteffect(struct html_feed_environ *h_env, struct readbuffer *obuf)
-{
- if (obuf->fontstat_sp < FONT_STACK_SIZE)
- bcopy(obuf->fontstat, obuf->fontstat_stack[obuf->fontstat_sp],
- FONTSTAT_SIZE);
- obuf->fontstat_sp++;
- if (obuf->in_bold)
- push_tag(obuf, "</b>", HTML_N_B);
- if (obuf->in_under)
- push_tag(obuf, "</u>", HTML_N_U);
- bzero(obuf->fontstat, FONTSTAT_SIZE);
-}
-
-void
-restore_fonteffect(struct html_feed_environ *h_env, struct readbuffer *obuf)
-{
- if (obuf->fontstat_sp > 0)
- obuf->fontstat_sp--;
- if (obuf->fontstat_sp < FONT_STACK_SIZE)
- bcopy(obuf->fontstat_stack[obuf->fontstat_sp], obuf->fontstat,
- FONTSTAT_SIZE);
- if (obuf->in_bold)
- push_tag(obuf, "<b>", HTML_B);
- if (obuf->in_under)
- push_tag(obuf, "<u>", HTML_U);
-}
-
-static Str
-process_title(struct parsed_tag *tag)
-{
- cur_title = Strnew();
- return NULL;
-}
-
-static Str
-process_n_title(struct parsed_tag *tag)
-{
- Str tmp;
-
- if (!cur_title)
- return NULL;
- Strremovefirstspaces(cur_title);
- Strremovetrailingspaces(cur_title);
- tmp = Strnew_m_charp("<title_alt title=\"",
- html_quote(cur_title->ptr), "\">", NULL);
- cur_title = NULL;
- return tmp;
-}
-
-static void
-feed_title(char *str)
-{
- if (!cur_title)
- return;
- while (*str) {
- if (*str == '&')
- Strcat_charp(cur_title, getescapecmd(&str));
- else if (*str == '\n' || *str == '\r') {
- Strcat_char(cur_title, ' ');
- str++;
- }
- else
- Strcat_char(cur_title, *(str++));
- }
-}
-
-Str
-process_img(struct parsed_tag *tag, int width)
-{
- char *p, *q, *r, *r2 = NULL, *s, *t;
-#ifdef USE_IMAGE
- int w, i, nw, ni = 1, n, w0 = -1, i0 = -1;
- int align, xoffset, yoffset, top, bottom, ismap = 0;
- int use_image = activeImage && displayImage;
-#else
- int w, i, nw, n;
-#endif
- int pre_int = FALSE;
- Str tmp = Strnew();
-
- if (!parsedtag_get_value(tag, ATTR_SRC, &p))
- return tmp;
- p = remove_space(p);
- q = NULL;
- parsedtag_get_value(tag, ATTR_ALT, &q);
- t = q;
- parsedtag_get_value(tag, ATTR_TITLE, &t);
- w = -1;
- if (parsedtag_get_value(tag, ATTR_WIDTH, &w)) {
- if (w < 0) {
- if (width > 0)
- w = (int)(-width * pixel_per_char * w / 100 + 0.5);
- else
- w = -1;
- }
-#ifdef USE_IMAGE
- if (use_image) {
- if (w > 0) {
- w = (int)(w * image_scale / 100 + 0.5);
- if (w == 0)
- w = 1;
- else if (w > MAX_IMAGE_SIZE)
- w = MAX_IMAGE_SIZE;
- }
- }
-#endif
- }
-#ifdef USE_IMAGE
- if (use_image) {
- i = -1;
- if (parsedtag_get_value(tag, ATTR_HEIGHT, &i)) {
- if (i > 0) {
- i = (int)(i * image_scale / 100 + 0.5);
- if (i == 0)
- i = 1;
- else if (i > MAX_IMAGE_SIZE)
- i = MAX_IMAGE_SIZE;
- }
- else {
- i = -1;
- }
- }
- align = -1;
- parsedtag_get_value(tag, ATTR_ALIGN, &align);
- ismap = 0;
- if (parsedtag_exists(tag, ATTR_ISMAP))
- ismap = 1;
- }
- else
-#endif
- parsedtag_get_value(tag, ATTR_HEIGHT, &i);
- r = NULL;
- parsedtag_get_value(tag, ATTR_USEMAP, &r);
-
- tmp = Strnew_size(128);
-#ifdef USE_IMAGE
- if (use_image) {
- switch (align) {
- case ALIGN_LEFT:
- Strcat_charp(tmp, "<div_int align=left>");
- break;
- case ALIGN_CENTER:
- Strcat_charp(tmp, "<div_int align=center>");
- break;
- case ALIGN_RIGHT:
- Strcat_charp(tmp, "<div_int align=right>");
- break;
- }
- }
-#endif
- if (r) {
- Str tmp2;
- r2 = strchr(r, '#');
- s = "<form_int method=internal action=map>";
- tmp2 = process_form(parse_tag(&s, TRUE));
- if (tmp2)
- Strcat(tmp, tmp2);
- Strcat(tmp, Sprintf("<input_alt fid=\"%d\" "
- "type=hidden name=link value=\"", cur_form_id));
- Strcat_charp(tmp, html_quote((r2) ? r2 + 1 : r));
- Strcat(tmp, Sprintf("\"><input_alt hseq=\"%d\" fid=\"%d\" "
- "type=submit no_effect=true>",
- cur_hseq++, cur_form_id));
- }
-#ifdef USE_IMAGE
- if (use_image) {
- w0 = w;
- i0 = i;
- if (w < 0 || i < 0) {
- 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);
- image.cache = NULL;
- image.width = w;
- image.height = i;
-
- image.cache = getImage(&image, cur_baseURL, IMG_FLAG_SKIP);
- if (image.cache && image.cache->width > 0 &&
- image.cache->height > 0) {
- w = w0 = image.cache->width;
- i = i0 = image.cache->height;
- }
- if (w < 0)
- w = 8 * pixel_per_char;
- 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;
- Strcat(tmp,
- Sprintf("<pre_int><img_alt hseq=\"%d\" src=\"", cur_iseq++));
- pre_int = TRUE;
- }
- else
-#endif
- {
- if (w < 0)
- w = 12 * pixel_per_char;
- nw = w ? (int)((w - 1) / pixel_per_char + 1) : 1;
- if (r) {
- Strcat_charp(tmp, "<pre_int>");
- pre_int = TRUE;
- }
- Strcat_charp(tmp, "<img_alt src=\"");
- }
- Strcat_charp(tmp, html_quote(p));
- Strcat_charp(tmp, "\"");
- if (t) {
- Strcat_charp(tmp, " title=\"");
- Strcat_charp(tmp, html_quote(t));
- Strcat_charp(tmp, "\"");
- }
-#ifdef USE_IMAGE
- if (use_image) {
- if (w0 >= 0)
- Strcat(tmp, Sprintf(" width=%d", w0));
- if (i0 >= 0)
- Strcat(tmp, Sprintf(" height=%d", i0));
- switch (align) {
- 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;
- yoffset = (int)(ni * pixel_per_line - i);
- break;
- default:
- top = ni - 1;
- bottom = 0;
- if (ni == 1 && ni * pixel_per_line > i)
- yoffset = 0;
- else {
- yoffset = (int)(ni * pixel_per_line - i);
- if (yoffset <= -2)
- yoffset++;
- }
- break;
- }
- xoffset = (int)((nw * pixel_per_char - w) / 2);
- if (xoffset)
- Strcat(tmp, Sprintf(" xoffset=%d", xoffset));
- if (yoffset)
- Strcat(tmp, Sprintf(" yoffset=%d", yoffset));
- if (top)
- Strcat(tmp, Sprintf(" top_margin=%d", top));
- if (bottom)
- Strcat(tmp, Sprintf(" bottom_margin=%d", bottom));
- if (r) {
- Strcat_charp(tmp, " usemap=\"");
- Strcat_charp(tmp, html_quote((r2) ? r2 + 1 : r));
- Strcat_charp(tmp, "\"");
- }
- if (ismap)
- Strcat_charp(tmp, " ismap");
- }
-#endif
- Strcat_charp(tmp, ">");
- if (q != NULL && *q == '\0' && ignore_null_img_alt)
- q = NULL;
- if (q != NULL) {
- n = get_strwidth(q);
-#ifdef USE_IMAGE
- if (use_image) {
- if (n > nw) {
- char *r;
- for (r = q, n = 0; r; r += get_mclen(r), n += get_mcwidth(r)) {
- if (n + get_mcwidth(r) > nw)
- break;
- }
- Strcat_charp(tmp, html_quote(Strnew_charp_n(q, r - q)->ptr));
- }
- else
- Strcat_charp(tmp, html_quote(q));
- }
- else
-#endif
- Strcat_charp(tmp, html_quote(q));
- goto img_end;
- }
- if (w > 0 && i > 0) {
- /* guess what the image is! */
- if (w < 32 && i < 48) {
- /* must be an icon or space */
- n = 1;
- if (strcasestr(p, "space") || strcasestr(p, "blank"))
- Strcat_charp(tmp, "_");
- else {
- if (w * i < 8 * 16)
- Strcat_charp(tmp, "*");
- else {
- if (!pre_int) {
- Strcat_charp(tmp, "<pre_int>");
- pre_int = TRUE;
- }
- push_symbol(tmp, IMG_SYMBOL, symbol_width, 1);
- n = symbol_width;
- }
- }
- goto img_end;
- }
- if (w > 200 && i < 13) {
- /* must be a horizontal line */
- if (!pre_int) {
- Strcat_charp(tmp, "<pre_int>");
- pre_int = TRUE;
- }
- w = w / pixel_per_char / symbol_width;
- if (w <= 0)
- w = 1;
- push_symbol(tmp, HR_SYMBOL, symbol_width, w);
- n = w * symbol_width;
- goto img_end;
- }
- }
- for (q = p; *q; q++) ;
- while (q > p && *q != '/')
- q--;
- if (*q == '/')
- q++;
- Strcat_char(tmp, '[');
- n = 1;
- p = q;
- for (; *q; q++) {
- if (!IS_ALNUM(*q) && *q != '_' && *q != '-') {
- break;
- }
- Strcat_char(tmp, *q);
- n++;
- if (n + 1 >= nw)
- break;
- }
- Strcat_char(tmp, ']');
- n++;
- img_end:
-#ifdef USE_IMAGE
- if (use_image) {
- for (; n < nw; n++)
- Strcat_char(tmp, ' ');
- }
-#endif
- Strcat_charp(tmp, "</img_alt>");
- if (pre_int)
- Strcat_charp(tmp, "</pre_int>");
- if (r) {
- Strcat_charp(tmp, "</input_alt>");
- process_n_form();
- }
-#ifdef USE_IMAGE
- if (use_image) {
- switch (align) {
- case ALIGN_RIGHT:
- case ALIGN_CENTER:
- case ALIGN_LEFT:
- Strcat_charp(tmp, "</div_int>");
- break;
- }
- }
-#endif
- return tmp;
-}
-
-Str
-process_anchor(struct parsed_tag *tag, char *tagbuf)
-{
- if (parsedtag_need_reconstruct(tag)) {
- parsedtag_set_value(tag, ATTR_HSEQ, Sprintf("%d", cur_hseq++)->ptr);
- return parsedtag2str(tag);
- }
- else {
- Str tmp = Sprintf("<a hseq=\"%d\"", cur_hseq++);
- Strcat_charp(tmp, tagbuf + 2);
- return tmp;
- }
-}
-
-Str
-process_input(struct parsed_tag *tag)
-{
- int i, w, v, x, y, z, iw, ih;
- char *q, *p, *r, *p2, *s;
- Str tmp = NULL;
- char *qq = "";
- int qlen = 0;
-
- 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 = "text";
- parsedtag_get_value(tag, ATTR_TYPE, &p);
- q = NULL;
- parsedtag_get_value(tag, ATTR_VALUE, &q);
- r = "";
- parsedtag_get_value(tag, ATTR_NAME, &r);
- w = 20;
- parsedtag_get_value(tag, ATTR_SIZE, &w);
- i = 20;
- parsedtag_get_value(tag, ATTR_MAXLENGTH, &i);
- p2 = NULL;
- parsedtag_get_value(tag, ATTR_ALT, &p2);
- x = parsedtag_exists(tag, ATTR_CHECKED);
- y = parsedtag_exists(tag, ATTR_ACCEPT);
- z = parsedtag_exists(tag, ATTR_READONLY);
-
- v = formtype(p);
- if (v == FORM_UNKNOWN)
- return NULL;
-
- if (!q) {
- switch (v) {
- case FORM_INPUT_IMAGE:
- case FORM_INPUT_SUBMIT:
- case FORM_INPUT_BUTTON:
- q = "SUBMIT";
- break;
- case FORM_INPUT_RESET:
- q = "RESET";
- break;
- /* if no VALUE attribute is specified in
- * <INPUT TYPE=CHECKBOX> tag, then the value "on" is used
- * as a default value. It is not a part of HTML4.0
- * specification, but an imitation of Netscape behaviour.
- */
- case FORM_INPUT_CHECKBOX:
- q = "on";
- }
- }
- /* VALUE attribute is not allowed in <INPUT TYPE=FILE> tag. */
- if (v == FORM_INPUT_FILE)
- q = NULL;
- if (q) {
- qq = html_quote(q);
- qlen = get_strwidth(q);
- }
-
- Strcat_charp(tmp, "<pre_int>");
- switch (v) {
- case FORM_INPUT_PASSWORD:
- case FORM_INPUT_TEXT:
- case FORM_INPUT_FILE:
- case FORM_INPUT_CHECKBOX:
- Strcat_char(tmp, '[');
- break;
- case FORM_INPUT_RADIO:
- Strcat_char(tmp, '(');
- }
- Strcat(tmp, Sprintf("<input_alt hseq=\"%d\" fid=\"%d\" type=%s "
- "name=\"%s\" width=%d maxlength=%d value=\"%s\"",
- cur_hseq++, cur_form_id, p, html_quote(r), w, i, qq));
- if (x)
- Strcat_charp(tmp, " checked");
- if (y)
- Strcat_charp(tmp, " accept");
- if (z)
- Strcat_charp(tmp, " readonly");
- Strcat_char(tmp, '>');
-
- if (v == FORM_INPUT_HIDDEN)
- Strcat_charp(tmp, "</input_alt></pre_int>");
- else {
- switch (v) {
- case FORM_INPUT_PASSWORD:
- case FORM_INPUT_TEXT:
- case FORM_INPUT_FILE:
- Strcat_charp(tmp, "<u>");
- break;
- case FORM_INPUT_IMAGE:
- s = NULL;
- parsedtag_get_value(tag, ATTR_SRC, &s);
- if (s) {
- Strcat(tmp, Sprintf("<img src=\"%s\"", html_quote(s)));
- if (p2)
- Strcat(tmp, Sprintf(" alt=\"%s\"", html_quote(p2)));
- if (parsedtag_get_value(tag, ATTR_WIDTH, &iw))
- Strcat(tmp, Sprintf(" width=\"%d\"", iw));
- if (parsedtag_get_value(tag, ATTR_HEIGHT, &ih))
- Strcat(tmp, Sprintf(" height=\"%d\"", ih));
- Strcat_charp(tmp, ">");
- Strcat_charp(tmp, "</input_alt></pre_int>");
- return tmp;
- }
- case FORM_INPUT_SUBMIT:
- case FORM_INPUT_BUTTON:
- case FORM_INPUT_RESET:
- Strcat_charp(tmp, "[");
- break;
- }
- switch (v) {
- case FORM_INPUT_PASSWORD:
- i = 0;
- if (q) {
- for (; i < qlen && i < w; i++)
- Strcat_char(tmp, '*');
- }
- for (; i < w; i++)
- Strcat_char(tmp, ' ');
- break;
- case FORM_INPUT_TEXT:
- case FORM_INPUT_FILE:
- if (q)
- Strcat(tmp, textfieldrep(Strnew_charp(q), w));
- else {
- for (i = 0; i < w; i++)
- Strcat_char(tmp, ' ');
- }
- break;
- case FORM_INPUT_SUBMIT:
- case FORM_INPUT_BUTTON:
- if (p2)
- Strcat_charp(tmp, html_quote(p2));
- else
- Strcat_charp(tmp, qq);
- break;
- case FORM_INPUT_RESET:
- Strcat_charp(tmp, qq);
- break;
- case FORM_INPUT_RADIO:
- case FORM_INPUT_CHECKBOX:
- if (x)
- Strcat_char(tmp, '*');
- else
- Strcat_char(tmp, ' ');
- break;
- }
- switch (v) {
- case FORM_INPUT_PASSWORD:
- case FORM_INPUT_TEXT:
- case FORM_INPUT_FILE:
- Strcat_charp(tmp, "</u>");
- break;
- case FORM_INPUT_IMAGE:
- case FORM_INPUT_SUBMIT:
- case FORM_INPUT_BUTTON:
- case FORM_INPUT_RESET:
- Strcat_charp(tmp, "]");
- }
- Strcat_charp(tmp, "</input_alt>");
- switch (v) {
- case FORM_INPUT_PASSWORD:
- case FORM_INPUT_TEXT:
- case FORM_INPUT_FILE:
- case FORM_INPUT_CHECKBOX:
- Strcat_char(tmp, ']');
- break;
- case FORM_INPUT_RADIO:
- Strcat_char(tmp, ')');
- }
- Strcat_charp(tmp, "</pre_int>");
- }
- return tmp;
-}
-
-Str
-process_select(struct parsed_tag *tag)
-{
- Str tmp = NULL;
- char *p;
-
- if (cur_form_id < 0) {
- char *s = "<form_int method=internal action=none>";
- tmp = process_form(parse_tag(&s, TRUE));
- }
-
- p = "";
- parsedtag_get_value(tag, ATTR_NAME, &p);
- cur_select = Strnew_charp(p);
- select_is_multiple = parsedtag_exists(tag, ATTR_MULTIPLE);
-
-#ifdef MENU_SELECT
- if (!select_is_multiple) {
- select_str = Sprintf("<pre_int>[<input_alt hseq=\"%d\" "
- "fid=\"%d\" type=select name=\"%s\" selectnumber=%d",
- cur_hseq++, cur_form_id, html_quote(p), n_select);
- Strcat_charp(select_str, ">");
- if (n_select == max_select) {
- max_select *= 2;
- select_option =
- New_Reuse(FormSelectOption, select_option, max_select);
- }
- select_option[n_select].first = NULL;
- select_option[n_select].last = NULL;
- cur_option_maxwidth = 0;
- }
- else
-#endif /* MENU_SELECT */
- select_str = Strnew();
- cur_option = NULL;
- cur_status = R_ST_NORMAL;
- n_selectitem = 0;
- return tmp;
-}
-
-Str
-process_n_select(void)
-{
- if (cur_select == NULL)
- return NULL;
- process_option();
-#ifdef MENU_SELECT
- if (!select_is_multiple) {
- if (select_option[n_select].first) {
- FormItemList sitem;
- chooseSelectOption(&sitem, select_option[n_select].first);
- Strcat(select_str, textfieldrep(sitem.label, cur_option_maxwidth));
- }
- Strcat_charp(select_str, "</input_alt>]</pre_int>");
- n_select++;
- }
- else
-#endif /* MENU_SELECT */
- Strcat_charp(select_str, "<br>");
- cur_select = NULL;
- n_selectitem = 0;
- return select_str;
-}
-
-void
-feed_select(char *str)
-{
- Str tmp = Strnew();
- int prev_status = cur_status;
- static int prev_spaces = -1;
- char *p;
-
- if (cur_select == NULL)
- return;
- while (read_token(tmp, &str, &cur_status, 0, 0)) {
- if (cur_status != R_ST_NORMAL || prev_status != R_ST_NORMAL)
- continue;
- p = tmp->ptr;
- if (tmp->ptr[0] == '<' && Strlastchar(tmp) == '>') {
- struct parsed_tag *tag;
- char *q;
- if (!(tag = parse_tag(&p, FALSE)))
- continue;
- switch (tag->tagid) {
- case HTML_OPTION:
- process_option();
- cur_option = Strnew();
- if (parsedtag_get_value(tag, ATTR_VALUE, &q))
- cur_option_value = Strnew_charp(q);
- else
- cur_option_value = NULL;
- if (parsedtag_get_value(tag, ATTR_LABEL, &q))
- cur_option_label = Strnew_charp(q);
- else
- cur_option_label = NULL;
- cur_option_selected = parsedtag_exists(tag, ATTR_SELECTED);
- prev_spaces = -1;
- break;
- case HTML_N_OPTION:
- /* do nothing */
- break;
- default:
- /* never happen */
- break;
- }
- }
- else if (cur_option) {
- while (*p) {
- if (IS_SPACE(*p) && prev_spaces != 0) {
- p++;
- if (prev_spaces > 0)
- prev_spaces++;
- }
- else {
- if (IS_SPACE(*p))
- prev_spaces = 1;
- else
- prev_spaces = 0;
- if (*p == '&')
- Strcat_charp(cur_option, getescapecmd(&p));
- else
- Strcat_char(cur_option, *(p++));
- }
- }
- }
- }
-}
-
-void
-process_option(void)
-{
- char begin_char = '[', end_char = ']';
- int len;
-
- if (cur_select == NULL || cur_option == NULL)
- return;
- while (cur_option->length > 0 && IS_SPACE(Strlastchar(cur_option)))
- Strshrink(cur_option, 1);
- if (cur_option_value == NULL)
- cur_option_value = cur_option;
- if (cur_option_label == NULL)
- cur_option_label = cur_option;
-#ifdef MENU_SELECT
- if (!select_is_multiple) {
- len = get_Str_strwidth(cur_option_label);
- if (len > cur_option_maxwidth)
- cur_option_maxwidth = len;
- addSelectOption(&select_option[n_select],
- cur_option_value,
- cur_option_label, cur_option_selected);
- return;
- }
-#endif /* MENU_SELECT */
- if (!select_is_multiple) {
- begin_char = '(';
- end_char = ')';
- }
- Strcat(select_str, Sprintf("<br><pre_int>%c<input_alt hseq=\"%d\" "
- "fid=\"%d\" type=%s name=\"%s\" value=\"%s\"",
- begin_char, cur_hseq++, cur_form_id,
- select_is_multiple ? "checkbox" : "radio",
- html_quote(cur_select->ptr),
- html_quote(cur_option_value->ptr)));
- if (cur_option_selected)
- Strcat_charp(select_str, " checked>*</input_alt>");
- else
- Strcat_charp(select_str, "> </input_alt>");
- Strcat_char(select_str, end_char);
- Strcat_charp(select_str, html_quote(cur_option_label->ptr));
- Strcat_charp(select_str, "</pre_int>");
- n_selectitem++;
-}
-
-Str
-process_textarea(struct parsed_tag *tag, int width)
-{
- Str tmp = NULL;
- char *p;
-
- if (cur_form_id < 0) {
- char *s = "<form_int method=internal action=none>";
- tmp = process_form(parse_tag(&s, TRUE));
- }
-
- p = "";
- parsedtag_get_value(tag, ATTR_NAME, &p);
- cur_textarea = Strnew_charp(p);
- cur_textarea_size = 20;
- if (parsedtag_get_value(tag, ATTR_COLS, &p)) {
- cur_textarea_size = atoi(p);
- if (p[strlen(p) - 1] == '%')
- cur_textarea_size = width * cur_textarea_size / 100 - 2;
- if (cur_textarea_size <= 0)
- cur_textarea_size = 20;
- }
- cur_textarea_rows = 1;
- if (parsedtag_get_value(tag, ATTR_ROWS, &p)) {
- cur_textarea_rows = atoi(p);
- if (cur_textarea_rows <= 0)
- cur_textarea_rows = 1;
- }
- cur_textarea_readonly = parsedtag_exists(tag, ATTR_READONLY);
- if (n_textarea >= max_textarea) {
- max_textarea *= 2;
- textarea_str = New_Reuse(Str, textarea_str, max_textarea);
- }
- textarea_str[n_textarea] = Strnew();
- ignore_nl_textarea = TRUE;
-
- return tmp;
-}
-
-Str
-process_n_textarea(void)
-{
- Str tmp;
- int i;
-
- if (cur_textarea == NULL)
- return NULL;
-
- tmp = Strnew();
- Strcat(tmp, Sprintf("<pre_int>[<input_alt hseq=\"%d\" fid=\"%d\" "
- "type=textarea name=\"%s\" size=%d rows=%d "
- "top_margin=%d textareanumber=%d",
- cur_hseq, cur_form_id,
- html_quote(cur_textarea->ptr),
- cur_textarea_size, cur_textarea_rows,
- cur_textarea_rows - 1, n_textarea));
- if (cur_textarea_readonly)
- Strcat_charp(tmp, " readonly");
- Strcat_charp(tmp, "><u>");
- for (i = 0; i < cur_textarea_size; i++)
- Strcat_char(tmp, ' ');
- Strcat_charp(tmp, "</u></input_alt>]</pre_int>\n");
- cur_hseq++;
- n_textarea++;
- cur_textarea = NULL;
-
- return tmp;
-}
-
-void
-feed_textarea(char *str)
-{
- if (cur_textarea == NULL)
- return;
- if (ignore_nl_textarea) {
- if (*str == '\r')
- str++;
- if (*str == '\n')
- str++;
- }
- ignore_nl_textarea = FALSE;
- while (*str) {
- if (*str == '&')
- Strcat_charp(textarea_str[n_textarea], getescapecmd(&str));
- else if (*str == '\n') {
- Strcat_charp(textarea_str[n_textarea], "\r\n");
- str++;
- }
- else if (*str != '\r')
- Strcat_char(textarea_str[n_textarea], *(str++));
- }
-}
-
-Str
-process_hr(struct parsed_tag *tag, int width, int indent_width)
-{
- Str tmp = Strnew_charp("<nobr>");
- int w = 0;
- int x = ALIGN_CENTER;
-
- if (width > indent_width)
- width -= indent_width;
- if (parsedtag_get_value(tag, ATTR_WIDTH, &w))
- w = REAL_WIDTH(w, width);
- else
- w = width;
-
- parsedtag_get_value(tag, ATTR_ALIGN, &x);
- switch (x) {
- case ALIGN_CENTER:
- Strcat_charp(tmp, "<div_int align=center>");
- break;
- case ALIGN_RIGHT:
- Strcat_charp(tmp, "<div_int align=right>");
- break;
- case ALIGN_LEFT:
- Strcat_charp(tmp, "<div_int align=left>");
- break;
- }
- w /= symbol_width;
- if (w <= 0)
- w = 1;
- push_symbol(tmp, HR_SYMBOL, symbol_width, w);
- Strcat_charp(tmp, "</div_int></nobr>");
- return tmp;
-}
-
-#ifdef USE_M17N
-static char *
-check_charset(char *p)
-{
- return wc_guess_charset(p, 0) ? p : NULL;
-}
-
-static char *
-check_accept_charset(char *ac)
-{
- char *s = ac, *e;
-
- while (*s) {
- while (*s && (IS_SPACE(*s) || *s == ','))
- s++;
- if (!*s)
- break;
- e = s;
- while (*e && !(IS_SPACE(*e) || *e == ','))
- e++;
- if (wc_guess_charset(Strnew_charp_n(s, e - s)->ptr, 0))
- return ac;
- s = e;
- }
- return NULL;
-}
-#endif
-
-static Str
-process_form_int(struct parsed_tag *tag, int fid)
-{
- char *p, *q, *r, *s, *tg, *n;
-
- p = "get";
- parsedtag_get_value(tag, ATTR_METHOD, &p);
- q = "!CURRENT_URL!";
- parsedtag_get_value(tag, ATTR_ACTION, &q);
- r = NULL;
-#ifdef USE_M17N
- if (parsedtag_get_value(tag, ATTR_ACCEPT_CHARSET, &r))
- r = check_accept_charset(r);
- if (!r && parsedtag_get_value(tag, ATTR_CHARSET, &r))
- r = check_charset(r);
-#endif
- s = NULL;
- parsedtag_get_value(tag, ATTR_ENCTYPE, &s);
- tg = NULL;
- parsedtag_get_value(tag, ATTR_TARGET, &tg);
- n = NULL;
- parsedtag_get_value(tag, ATTR_NAME, &n);
-
- if (fid < 0) {
- form_max++;
- form_sp++;
- fid = form_max;
- }
- else { /* <form_int> */
- if (form_max < fid)
- form_max = fid;
- form_sp = fid;
- }
- if (forms_size == 0) {
- forms_size = INITIAL_FORM_SIZE;
- forms = New_N(FormList *, forms_size);
- form_stack = NewAtom_N(int, forms_size);
- }
- else if (forms_size <= form_max) {
- forms_size += form_max;
- forms = New_Reuse(FormList *, forms, forms_size);
- form_stack = New_Reuse(int, form_stack, forms_size);
- }
- form_stack[form_sp] = fid;
-
- if (w3m_halfdump) {
- Str tmp = Sprintf("<form_int fid=\"%d\" action=\"%s\" method=\"%s\"",
- fid, html_quote(q), html_quote(p));
- if (s)
- Strcat(tmp, Sprintf(" enctype=\"%s\"", html_quote(s)));
- if (tg)
- Strcat(tmp, Sprintf(" target=\"%s\"", html_quote(tg)));
- if (n)
- Strcat(tmp, Sprintf(" name=\"%s\"", html_quote(n)));
-#ifdef USE_M17N
- if (r)
- Strcat(tmp, Sprintf(" accept-charset=\"%s\"", html_quote(r)));
-#endif
- Strcat_charp(tmp, ">");
- return tmp;
- }
-
- forms[fid] = newFormList(q, p, r, s, tg, n, NULL);
- return NULL;
-}
-
-Str
-process_form(struct parsed_tag *tag)
-{
- return process_form_int(tag, -1);
-}
-
-Str
-process_n_form(void)
-{
- if (form_sp >= 0)
- form_sp--;
- return NULL;
-}
-
-static void
-clear_ignore_p_flag(int cmd, struct readbuffer *obuf)
-{
- static int clear_flag_cmd[] = {
- HTML_HR, HTML_UNKNOWN
- };
- int i;
-
- for (i = 0; clear_flag_cmd[i] != HTML_UNKNOWN; i++) {
- if (cmd == clear_flag_cmd[i]) {
- obuf->flag &= ~RB_IGNORE_P;
- return;
- }
- }
-}
-
-static void
-set_alignment(struct readbuffer *obuf, struct parsed_tag *tag)
-{
- long flag = -1;
- int align;
-
- if (parsedtag_get_value(tag, ATTR_ALIGN, &align)) {
- switch (align) {
- case ALIGN_CENTER:
- flag = RB_CENTER;
- break;
- case ALIGN_RIGHT:
- flag = RB_RIGHT;
- break;
- case ALIGN_LEFT:
- flag = RB_LEFT;
- }
- }
- RB_SAVE_FLAG(obuf);
- if (flag != -1) {
- RB_SET_ALIGN(obuf, flag);
- }
-}
-
-#ifdef ID_EXT
-static void
-process_idattr(struct readbuffer *obuf, int cmd, struct parsed_tag *tag)
-{
- char *id = NULL, *framename = NULL;
- Str idtag = NULL;
-
- /*
- * HTML_TABLE is handled by the other process.
- */
- if (cmd == HTML_TABLE)
- return;
-
- parsedtag_get_value(tag, ATTR_ID, &id);
- parsedtag_get_value(tag, ATTR_FRAMENAME, &framename);
- if (id == NULL)
- return;
- if (framename)
- idtag = Sprintf("<_id id=\"%s\" framename=\"%s\">",
- html_quote(id), html_quote(framename));
- else
- idtag = Sprintf("<_id id=\"%s\">", html_quote(id));
- push_tag(obuf, idtag->ptr, HTML_NOP);
-}
-#endif /* ID_EXT */
-
-#define CLOSE_P if (obuf->flag & RB_P) { \
- flushline(h_env, obuf, envs[h_env->envc].indent,0,h_env->limit);\
- RB_RESTORE_FLAG(obuf);\
- obuf->flag &= ~RB_P;\
- }
-
-#define CLOSE_A \
- CLOSE_P; \
- close_anchor(h_env, obuf);
-
-#define CLOSE_DT \
- if (obuf->flag & RB_IN_DT) { \
- obuf->flag &= ~RB_IN_DT; \
- HTMLlineproc1("</b>", h_env); \
- }
-
-#define PUSH_ENV(cmd) \
- if (++h_env->envc_real < h_env->nenv) { \
- ++h_env->envc; \
- envs[h_env->envc].env = cmd; \
- envs[h_env->envc].count = 0; \
- if (h_env->envc <= MAX_INDENT_LEVEL) \
- envs[h_env->envc].indent = envs[h_env->envc - 1].indent + INDENT_INCR; \
- else \
- envs[h_env->envc].indent = envs[h_env->envc - 1].indent; \
- }
-
-#define POP_ENV \
- if (h_env->envc_real-- < h_env->nenv) \
- h_env->envc--;
-
-static int
-ul_type(struct parsed_tag *tag, int default_type)
-{
- char *p;
- if (parsedtag_get_value(tag, ATTR_TYPE, &p)) {
- if (!strcasecmp(p, "disc"))
- return (int)'d';
- else if (!strcasecmp(p, "circle"))
- return (int)'c';
- else if (!strcasecmp(p, "square"))
- return (int)'s';
- }
- return default_type;
-}
-
-int
-getMetaRefreshParam(char *q, Str *refresh_uri)
-{
- int refresh_interval;
- char *r;
- Str s_tmp = NULL;
-
- if (q == NULL || refresh_uri == NULL)
- return 0;
-
- refresh_interval = atoi(q);
- if (refresh_interval < 0)
- return 0;
-
- while (*q) {
- if (!strncasecmp(q, "url=", 4)) {
- q += 4;
- if (*q == '\"') /* " */
- 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] == '\"') { /* "
- */
- s_tmp->length--;
- s_tmp->ptr[s_tmp->length] = '\0';
- }
- q = r;
- }
- while (*q && *q != ';')
- q++;
- if (*q == ';')
- q++;
- while (*q && *q == ' ')
- q++;
- }
- *refresh_uri = s_tmp;
- return refresh_interval;
-}
-
-int
-HTMLtagproc1(struct parsed_tag *tag, struct html_feed_environ *h_env)
-{
- char *p, *q, *r;
- int i, w, x, y, z, count, width;
- struct readbuffer *obuf = h_env->obuf;
- struct environment *envs = h_env->envs;
- Str tmp;
- int hseq;
- int cmd;
-#ifdef ID_EXT
- char *id = NULL;
-#endif /* ID_EXT */
-
- cmd = tag->tagid;
-
- if (obuf->flag & RB_PRE) {
- switch (cmd) {
- case HTML_NOBR:
- case HTML_N_NOBR:
- case HTML_PRE_INT:
- case HTML_N_PRE_INT:
- return 1;
- }
- }
-
- switch (cmd) {
- case HTML_B:
- obuf->in_bold++;
- if (obuf->in_bold > 1)
- return 1;
- return 0;
- case HTML_N_B:
- if (obuf->in_bold == 1 && close_effect0(obuf, HTML_B))
- obuf->in_bold = 0;
- if (obuf->in_bold > 0) {
- obuf->in_bold--;
- if (obuf->in_bold == 0)
- return 0;
- }
- return 1;
- case HTML_U:
- obuf->in_under++;
- if (obuf->in_under > 1)
- return 1;
- return 0;
- case HTML_N_U:
- if (obuf->in_under == 1 && close_effect0(obuf, HTML_U))
- obuf->in_under = 0;
- if (obuf->in_under > 0) {
- obuf->in_under--;
- if (obuf->in_under == 0)
- return 0;
- }
- return 1;
- case HTML_EM:
- HTMLlineproc1("<b>", h_env);
- return 1;
- case HTML_N_EM:
- HTMLlineproc1("</b>", h_env);
- return 1;
- case HTML_Q:
- HTMLlineproc1("`", h_env);
- return 1;
- case HTML_N_Q:
- HTMLlineproc1("'", h_env);
- return 1;
- case HTML_P:
- case HTML_N_P:
- CLOSE_A;
- if (!(obuf->flag & RB_IGNORE_P)) {
- flushline(h_env, obuf, envs[h_env->envc].indent, 1, h_env->limit);
- do_blankline(h_env, obuf, envs[h_env->envc].indent, 0,
- h_env->limit);
- }
- obuf->flag |= RB_IGNORE_P;
- if (cmd == HTML_P) {
- set_alignment(obuf, tag);
- obuf->flag |= RB_P;
- }
- return 1;
- case HTML_BR:
- flushline(h_env, obuf, envs[h_env->envc].indent, 1, h_env->limit);
- h_env->blank_lines = 0;
- return 1;
- case HTML_H:
- if (!(obuf->flag & (RB_PREMODE | RB_IGNORE_P))) {
- flushline(h_env, obuf, envs[h_env->envc].indent, 0, h_env->limit);
- do_blankline(h_env, obuf, envs[h_env->envc].indent, 0,
- h_env->limit);
- }
- HTMLlineproc1("<b>", h_env);
- set_alignment(obuf, tag);
- return 1;
- case HTML_N_H:
- HTMLlineproc1("</b>", h_env);
- if (!(obuf->flag & RB_PREMODE)) {
- flushline(h_env, obuf, envs[h_env->envc].indent, 0, h_env->limit);
- }
- do_blankline(h_env, obuf, envs[h_env->envc].indent, 0, h_env->limit);
- RB_RESTORE_FLAG(obuf);
- close_anchor(h_env, obuf);
- obuf->flag |= RB_IGNORE_P;
- return 1;
- case HTML_UL:
- case HTML_OL:
- case HTML_BLQ:
- CLOSE_A;
- if (!(obuf->flag & RB_IGNORE_P)) {
- flushline(h_env, obuf, envs[h_env->envc].indent, 0, h_env->limit);
- if (!(obuf->flag & RB_PREMODE) &&
- (h_env->envc == 0 || cmd == HTML_BLQ))
- do_blankline(h_env, obuf, envs[h_env->envc].indent, 0,
- h_env->limit);
- }
- PUSH_ENV(cmd);
- if (cmd == HTML_UL || cmd == HTML_OL) {
- if (parsedtag_get_value(tag, ATTR_START, &count)) {
- envs[h_env->envc].count = count - 1;
- }
- }
- if (cmd == HTML_OL) {
- envs[h_env->envc].type = '1';
- if (parsedtag_get_value(tag, ATTR_TYPE, &p)) {
- envs[h_env->envc].type = (int)*p;
- }
- }
- if (cmd == HTML_UL)
- envs[h_env->envc].type = ul_type(tag, 0);
- flushline(h_env, obuf, envs[h_env->envc].indent, 0, h_env->limit);
- return 1;
- case HTML_N_UL:
- case HTML_N_OL:
- case HTML_N_DL:
- case HTML_N_BLQ:
- CLOSE_DT;
- CLOSE_A;
- if (h_env->envc > 0) {
- flushline(h_env, obuf, envs[h_env->envc - 1].indent, 0,
- h_env->limit);
- POP_ENV;
- if (!(obuf->flag & RB_PREMODE) &&
- (h_env->envc == 0 || cmd == HTML_N_DL || cmd == HTML_N_BLQ)) {
- do_blankline(h_env, obuf,
- envs[h_env->envc].indent,
- INDENT_INCR, h_env->limit);
- obuf->flag |= RB_IGNORE_P;
- }
- }
- close_anchor(h_env, obuf);
- return 1;
- case HTML_DL:
- CLOSE_A;
- if (!(obuf->flag & RB_IGNORE_P)) {
- flushline(h_env, obuf, envs[h_env->envc].indent, 0, h_env->limit);
- if (!(obuf->flag & RB_PREMODE))
- do_blankline(h_env, obuf, envs[h_env->envc].indent, 0,
- h_env->limit);
- }
- PUSH_ENV(cmd);
- if (parsedtag_exists(tag, ATTR_COMPACT))
- envs[h_env->envc].env = HTML_DL_COMPACT;
- obuf->flag |= RB_IGNORE_P;
- return 1;
- case HTML_LI:
- CLOSE_A;
- CLOSE_DT;
- if (h_env->envc > 0) {
- Str num;
- flushline(h_env, obuf,
- envs[h_env->envc - 1].indent, 0, h_env->limit);
- envs[h_env->envc].count++;
- if (parsedtag_get_value(tag, ATTR_VALUE, &p)) {
- count = atoi(p);
- if (count > 0)
- envs[h_env->envc].count = count;
- else
- envs[h_env->envc].count = 0;
- }
- switch (envs[h_env->envc].env) {
- case HTML_UL:
- envs[h_env->envc].type = ul_type(tag, envs[h_env->envc].type);
- for (i = 0; i < INDENT_INCR - 3; i++)
- push_charp(obuf, 1, NBSP, PC_ASCII);
- tmp = Strnew();
- switch (envs[h_env->envc].type) {
- case 'd':
- push_symbol(tmp, UL_SYMBOL_DISC, symbol_width, 1);
- break;
- case 'c':
- push_symbol(tmp, UL_SYMBOL_CIRCLE, symbol_width, 1);
- break;
- case 's':
- push_symbol(tmp, UL_SYMBOL_SQUARE, symbol_width, 1);
- break;
- default:
- push_symbol(tmp,
- UL_SYMBOL((h_env->envc_real -
- 1) % MAX_UL_LEVEL), symbol_width,
- 1);
- break;
- }
- if (symbol_width == 1)
- push_charp(obuf, 1, NBSP, PC_ASCII);
- push_str(obuf, symbol_width, tmp, PC_ASCII);
- push_charp(obuf, 1, NBSP, PC_ASCII);
- set_space_to_prevchar(obuf->prevchar);
- break;
- case HTML_OL:
- if (parsedtag_get_value(tag, ATTR_TYPE, &p))
- envs[h_env->envc].type = (int)*p;
- switch ((envs[h_env->envc].count > 0)? envs[h_env->envc].type: '1') {
- case 'i':
- num = romanNumeral(envs[h_env->envc].count);
- break;
- case 'I':
- num = romanNumeral(envs[h_env->envc].count);
- Strupper(num);
- break;
- case 'a':
- num = romanAlphabet(envs[h_env->envc].count);
- break;
- case 'A':
- num = romanAlphabet(envs[h_env->envc].count);
- Strupper(num);
- break;
- default:
- num = Sprintf("%d", envs[h_env->envc].count);
- break;
- }
- if (INDENT_INCR >= 4)
- Strcat_charp(num, ". ");
- else
- Strcat_char(num, '.');
- push_spaces(obuf, 1, INDENT_INCR - num->length);
- push_str(obuf, num->length, num, PC_ASCII);
- if (INDENT_INCR >= 4)
- set_space_to_prevchar(obuf->prevchar);
- break;
- default:
- push_spaces(obuf, 1, INDENT_INCR);
- break;
- }
- }
- else {
- flushline(h_env, obuf, 0, 0, h_env->limit);
- }
- obuf->flag |= RB_IGNORE_P;
- return 1;
- case HTML_DT:
- CLOSE_A;
- if (h_env->envc == 0 ||
- (h_env->envc_real < h_env->nenv &&
- envs[h_env->envc].env != HTML_DL &&
- envs[h_env->envc].env != HTML_DL_COMPACT)) {
- PUSH_ENV(HTML_DL);
- }
- if (h_env->envc > 0) {
- flushline(h_env, obuf,
- envs[h_env->envc - 1].indent, 0, h_env->limit);
- }
- if (!(obuf->flag & RB_IN_DT)) {
- HTMLlineproc1("<b>", h_env);
- obuf->flag |= RB_IN_DT;
- }
- obuf->flag |= RB_IGNORE_P;
- return 1;
- case HTML_DD:
- CLOSE_A;
- CLOSE_DT;
- if (envs[h_env->envc].env == HTML_DL_COMPACT) {
- if (obuf->pos > envs[h_env->envc].indent)
- flushline(h_env, obuf, envs[h_env->envc].indent, 0,
- h_env->limit);
- else
- push_spaces(obuf, 1, envs[h_env->envc].indent - obuf->pos);
- }
- else
- flushline(h_env, obuf, envs[h_env->envc].indent, 0, h_env->limit);
- /* obuf->flag |= RB_IGNORE_P; */
- return 1;
- case HTML_TITLE:
- close_anchor(h_env, obuf);
- process_title(tag);
- obuf->flag |= RB_TITLE;
- obuf->end_tag = HTML_N_TITLE;
- return 1;
- case HTML_N_TITLE:
- if (!(obuf->flag & RB_TITLE))
- return 1;
- obuf->flag &= ~RB_TITLE;
- obuf->end_tag = 0;
- tmp = process_n_title(tag);
- if (tmp)
- HTMLlineproc1(tmp->ptr, h_env);
- return 1;
- case HTML_TITLE_ALT:
- if (parsedtag_get_value(tag, ATTR_TITLE, &p))
- h_env->title = html_unquote(p);
- return 0;
- case HTML_FRAMESET:
- PUSH_ENV(cmd);
- push_charp(obuf, 9, "--FRAME--", PC_ASCII);
- flushline(h_env, obuf, envs[h_env->envc].indent, 0, h_env->limit);
- return 0;
- case HTML_N_FRAMESET:
- if (h_env->envc > 0) {
- POP_ENV;
- flushline(h_env, obuf, envs[h_env->envc].indent, 0, h_env->limit);
- }
- return 0;
- case HTML_NOFRAMES:
- CLOSE_A;
- flushline(h_env, obuf, envs[h_env->envc].indent, 0, h_env->limit);
- obuf->flag |= (RB_NOFRAMES | RB_IGNORE_P);
- /* istr = str; */
- return 1;
- case HTML_N_NOFRAMES:
- CLOSE_A;
- flushline(h_env, obuf, envs[h_env->envc].indent, 0, h_env->limit);
- obuf->flag &= ~RB_NOFRAMES;
- return 1;
- case HTML_FRAME:
- q = r = NULL;
- parsedtag_get_value(tag, ATTR_SRC, &q);
- parsedtag_get_value(tag, ATTR_NAME, &r);
- if (q) {
- q = html_quote(q);
- push_tag(obuf, Sprintf("<a hseq=\"%d\" href=\"%s\">",
- cur_hseq++, q)->ptr, HTML_A);
- if (r)
- q = html_quote(r);
- push_charp(obuf, get_strwidth(q), q, PC_ASCII);
- push_tag(obuf, "</a>", HTML_N_A);
- }
- flushline(h_env, obuf, envs[h_env->envc].indent, 0, h_env->limit);
- return 0;
- case HTML_HR:
- close_anchor(h_env, obuf);
- tmp = process_hr(tag, h_env->limit, envs[h_env->envc].indent);
- HTMLlineproc1(tmp->ptr, h_env);
- set_space_to_prevchar(obuf->prevchar);
- return 1;
- case HTML_PRE:
- x = parsedtag_exists(tag, ATTR_FOR_TABLE);
- CLOSE_A;
- if (!(obuf->flag & RB_IGNORE_P)) {
- flushline(h_env, obuf, envs[h_env->envc].indent, 0, h_env->limit);
- if (!x)
- do_blankline(h_env, obuf, envs[h_env->envc].indent, 0,
- h_env->limit);
- }
- else
- fillline(obuf, envs[h_env->envc].indent);
- obuf->flag |= (RB_PRE | RB_IGNORE_P);
- /* istr = str; */
- return 1;
- case HTML_N_PRE:
- flushline(h_env, obuf, envs[h_env->envc].indent, 0, h_env->limit);
- if (!(obuf->flag & RB_IGNORE_P)) {
- do_blankline(h_env, obuf, envs[h_env->envc].indent, 0,
- h_env->limit);
- obuf->flag |= RB_IGNORE_P;
- }
- obuf->flag &= ~RB_PRE;
- close_anchor(h_env, obuf);
- return 1;
- case HTML_PRE_INT:
- i = obuf->line->length;
- append_tags(obuf);
- if (!(obuf->flag & RB_SPECIAL)) {
- set_breakpoint(obuf, obuf->line->length - i);
- }
- obuf->flag |= RB_PRE_INT;
- return 0;
- case HTML_N_PRE_INT:
- push_tag(obuf, "</pre_int>", HTML_N_PRE_INT);
- obuf->flag &= ~RB_PRE_INT;
- if (!(obuf->flag & RB_SPECIAL) && obuf->pos > obuf->bp.pos) {
- set_prevchar(obuf->prevchar, "", 0);
- obuf->prev_ctype = PC_CTRL;
- }
- return 1;
- case HTML_NOBR:
- obuf->flag |= RB_NOBR;
- obuf->nobr_level++;
- return 0;
- case HTML_N_NOBR:
- if (obuf->nobr_level > 0)
- obuf->nobr_level--;
- if (obuf->nobr_level == 0)
- obuf->flag &= ~RB_NOBR;
- return 0;
- case HTML_PRE_PLAIN:
- CLOSE_A;
- if (!(obuf->flag & RB_IGNORE_P)) {
- flushline(h_env, obuf, envs[h_env->envc].indent, 0, h_env->limit);
- do_blankline(h_env, obuf, envs[h_env->envc].indent, 0,
- h_env->limit);
- }
- obuf->flag |= (RB_PRE | RB_IGNORE_P);
- return 1;
- case HTML_N_PRE_PLAIN:
- CLOSE_A;
- if (!(obuf->flag & RB_IGNORE_P)) {
- flushline(h_env, obuf, envs[h_env->envc].indent, 0, h_env->limit);
- do_blankline(h_env, obuf, envs[h_env->envc].indent, 0,
- h_env->limit);
- obuf->flag |= RB_IGNORE_P;
- }
- obuf->flag &= ~RB_PRE;
- return 1;
- case HTML_LISTING:
- case HTML_XMP:
- case HTML_PLAINTEXT:
- CLOSE_A;
- if (!(obuf->flag & RB_IGNORE_P)) {
- flushline(h_env, obuf, envs[h_env->envc].indent, 0, h_env->limit);
- do_blankline(h_env, obuf, envs[h_env->envc].indent, 0,
- h_env->limit);
- }
- obuf->flag |= (RB_PLAIN | RB_IGNORE_P);
- switch (cmd) {
- case HTML_LISTING:
- obuf->end_tag = HTML_N_LISTING;
- break;
- case HTML_XMP:
- obuf->end_tag = HTML_N_XMP;
- break;
- case HTML_PLAINTEXT:
- obuf->end_tag = MAX_HTMLTAG;
- break;
- }
- return 1;
- case HTML_N_LISTING:
- case HTML_N_XMP:
- CLOSE_A;
- if (!(obuf->flag & RB_IGNORE_P)) {
- flushline(h_env, obuf, envs[h_env->envc].indent, 0, h_env->limit);
- do_blankline(h_env, obuf, envs[h_env->envc].indent, 0,
- h_env->limit);
- obuf->flag |= RB_IGNORE_P;
- }
- obuf->flag &= ~RB_PLAIN;
- obuf->end_tag = 0;
- return 1;
- case HTML_SCRIPT:
- obuf->flag |= RB_SCRIPT;
- obuf->end_tag = HTML_N_SCRIPT;
- return 1;
- case HTML_STYLE:
- obuf->flag |= RB_STYLE;
- obuf->end_tag = HTML_N_STYLE;
- return 1;
- case HTML_N_SCRIPT:
- obuf->flag &= ~RB_SCRIPT;
- obuf->end_tag = 0;
- return 1;
- case HTML_N_STYLE:
- obuf->flag &= ~RB_STYLE;
- obuf->end_tag = 0;
- return 1;
- case HTML_A:
- if (obuf->anchor.url)
- close_anchor(h_env, obuf);
-
- hseq = 0;
-
- if (parsedtag_get_value(tag, ATTR_HREF, &p))
- obuf->anchor.url = Strnew_charp(p)->ptr;
- if (parsedtag_get_value(tag, ATTR_TARGET, &p))
- obuf->anchor.target = Strnew_charp(p)->ptr;
- if (parsedtag_get_value(tag, ATTR_REFERER, &p))
- obuf->anchor.referer = Strnew_charp(p)->ptr;
- if (parsedtag_get_value(tag, ATTR_TITLE, &p))
- obuf->anchor.title = Strnew_charp(p)->ptr;
- if (parsedtag_get_value(tag, ATTR_ACCESSKEY, &p))
- obuf->anchor.accesskey = (unsigned char)*p;
- if (parsedtag_get_value(tag, ATTR_HSEQ, &hseq))
- obuf->anchor.hseq = hseq;
-
- if (hseq == 0 && obuf->anchor.url) {
- obuf->anchor.hseq = cur_hseq;
- tmp = process_anchor(tag, h_env->tagbuf->ptr);
- push_tag(obuf, tmp->ptr, HTML_A);
- return 1;
- }
- return 0;
- case HTML_N_A:
- close_anchor(h_env, obuf);
- return 1;
- case HTML_IMG:
- tmp = process_img(tag, h_env->limit);
- HTMLlineproc1(tmp->ptr, h_env);
- return 1;
- case HTML_IMG_ALT:
- if (parsedtag_get_value(tag, ATTR_SRC, &p))
- obuf->img_alt = Strnew_charp(p);
-#ifdef USE_IMAGE
- i = 0;
- if (parsedtag_get_value(tag, ATTR_TOP_MARGIN, &i)) {
- if (i > obuf->top_margin)
- obuf->top_margin = i;
- }
- i = 0;
- if (parsedtag_get_value(tag, ATTR_BOTTOM_MARGIN, &i)) {
- if (i > obuf->bottom_margin)
- obuf->bottom_margin = i;
- }
-#endif
- return 0;
- case HTML_N_IMG_ALT:
- if (obuf->img_alt) {
- if (!close_effect0(obuf, HTML_IMG_ALT))
- push_tag(obuf, "</img_alt>", HTML_N_IMG_ALT);
- obuf->img_alt = NULL;
- }
- return 1;
- case HTML_INPUT_ALT:
- i = 0;
- if (parsedtag_get_value(tag, ATTR_TOP_MARGIN, &i)) {
- if (i > obuf->top_margin)
- obuf->top_margin = i;
- }
- i = 0;
- if (parsedtag_get_value(tag, ATTR_BOTTOM_MARGIN, &i)) {
- if (i > obuf->bottom_margin)
- obuf->bottom_margin = i;
- }
- return 0;
- case HTML_TABLE:
- close_anchor(h_env, obuf);
- obuf->table_level++;
- if (obuf->table_level >= MAX_TABLE)
- break;
- w = BORDER_NONE;
- /* x: cellspacing, y: cellpadding */
- x = 2;
- y = 1;
- z = 0;
- width = 0;
- if (parsedtag_exists(tag, ATTR_BORDER)) {
- if (parsedtag_get_value(tag, ATTR_BORDER, &w)) {
- if (w > 2)
- w = BORDER_THICK;
- else if (w < 0) { /* weird */
- w = BORDER_THIN;
- }
- }
- else
- w = BORDER_THIN;
- }
- if (parsedtag_get_value(tag, ATTR_WIDTH, &i)) {
- if (obuf->table_level == 0)
- width = REAL_WIDTH(i, h_env->limit - envs[h_env->envc].indent);
- else
- width = RELATIVE_WIDTH(i);
- }
- if (parsedtag_exists(tag, ATTR_HBORDER))
- w = BORDER_NOWIN;
- parsedtag_get_value(tag, ATTR_CELLSPACING, &x);
- parsedtag_get_value(tag, ATTR_CELLPADDING, &y);
- parsedtag_get_value(tag, ATTR_VSPACE, &z);
-#ifdef ID_EXT
- parsedtag_get_value(tag, ATTR_ID, &id);
-#endif /* ID_EXT */
- tables[obuf->table_level] = begin_table(w, x, y, z);
-#ifdef ID_EXT
- if (id != NULL)
- tables[obuf->table_level]->id = Strnew_charp(id);
-#endif /* ID_EXT */
- table_mode[obuf->table_level].pre_mode = 0;
- table_mode[obuf->table_level].indent_level = 0;
- table_mode[obuf->table_level].nobr_level = 0;
- table_mode[obuf->table_level].caption = 0;
- table_mode[obuf->table_level].end_tag = 0; /* HTML_UNKNOWN */
-#ifndef TABLE_EXPAND
- tables[obuf->table_level]->total_width = width;
-#else
- tables[obuf->table_level]->real_width = width;
- tables[obuf->table_level]->total_width = 0;
-#endif
- return 1;
- case HTML_N_TABLE:
- /* should be processed in HTMLlineproc() */
- return 1;
- case HTML_CENTER:
- CLOSE_A;
- if (!(obuf->flag & (RB_PREMODE | RB_IGNORE_P)))
- flushline(h_env, obuf, envs[h_env->envc].indent, 0, h_env->limit);
- RB_SAVE_FLAG(obuf);
- RB_SET_ALIGN(obuf, RB_CENTER);
- return 1;
- case HTML_N_CENTER:
- CLOSE_A;
- if (!(obuf->flag & RB_PREMODE))
- flushline(h_env, obuf, envs[h_env->envc].indent, 0, h_env->limit);
- RB_RESTORE_FLAG(obuf);
- return 1;
- case HTML_DIV:
- CLOSE_A;
- if (!(obuf->flag & RB_IGNORE_P))
- flushline(h_env, obuf, envs[h_env->envc].indent, 0, h_env->limit);
- set_alignment(obuf, tag);
- return 1;
- case HTML_N_DIV:
- CLOSE_A;
- flushline(h_env, obuf, envs[h_env->envc].indent, 0, h_env->limit);
- RB_RESTORE_FLAG(obuf);
- return 1;
- case HTML_DIV_INT:
- CLOSE_P;
- if (!(obuf->flag & RB_IGNORE_P))
- flushline(h_env, obuf, envs[h_env->envc].indent, 0, h_env->limit);
- set_alignment(obuf, tag);
- return 1;
- case HTML_N_DIV_INT:
- CLOSE_P;
- flushline(h_env, obuf, envs[h_env->envc].indent, 0, h_env->limit);
- RB_RESTORE_FLAG(obuf);
- return 1;
- case HTML_FORM:
- CLOSE_A;
- if (!(obuf->flag & RB_IGNORE_P))
- flushline(h_env, obuf, envs[h_env->envc].indent, 0, h_env->limit);
- tmp = process_form(tag);
- if (tmp)
- HTMLlineproc1(tmp->ptr, h_env);
- return 1;
- case HTML_N_FORM:
- CLOSE_A;
- flushline(h_env, obuf, envs[h_env->envc].indent, 0, h_env->limit);
- obuf->flag |= RB_IGNORE_P;
- process_n_form();
- return 1;
- case HTML_INPUT:
- close_anchor(h_env, obuf);
- tmp = process_input(tag);
- if (tmp)
- HTMLlineproc1(tmp->ptr, h_env);
- return 1;
- case HTML_SELECT:
- close_anchor(h_env, obuf);
- tmp = process_select(tag);
- if (tmp)
- HTMLlineproc1(tmp->ptr, h_env);
- obuf->flag |= RB_INSELECT;
- obuf->end_tag = HTML_N_SELECT;
- return 1;
- case HTML_N_SELECT:
- obuf->flag &= ~RB_INSELECT;
- obuf->end_tag = 0;
- tmp = process_n_select();
- if (tmp)
- HTMLlineproc1(tmp->ptr, h_env);
- return 1;
- case HTML_OPTION:
- /* nothing */
- return 1;
- case HTML_TEXTAREA:
- close_anchor(h_env, obuf);
- tmp = process_textarea(tag, h_env->limit);
- if (tmp)
- HTMLlineproc1(tmp->ptr, h_env);
- obuf->flag |= RB_INTXTA;
- obuf->end_tag = HTML_N_TEXTAREA;
- return 1;
- case HTML_N_TEXTAREA:
- obuf->flag &= ~RB_INTXTA;
- obuf->end_tag = 0;
- tmp = process_n_textarea();
- if (tmp)
- HTMLlineproc1(tmp->ptr, h_env);
- return 1;
- case HTML_ISINDEX:
- p = "";
- q = "!CURRENT_URL!";
- parsedtag_get_value(tag, ATTR_PROMPT, &p);
- parsedtag_get_value(tag, ATTR_ACTION, &q);
- tmp = Strnew_m_charp("<form method=get action=\"",
- html_quote(q),
- "\">",
- html_quote(p),
- "<input type=text name=\"\" accept></form>",
- NULL);
- HTMLlineproc1(tmp->ptr, h_env);
- return 1;
- case HTML_META:
- p = q = NULL;
- parsedtag_get_value(tag, ATTR_HTTP_EQUIV, &p);
- parsedtag_get_value(tag, ATTR_CONTENT, &q);
-#ifdef USE_M17N
- if (p && q && !strcasecmp(p, "Content-Type") &&
- (q = strcasestr(q, "charset")) != NULL) {
- q += 7;
- SKIP_BLANKS(q);
- if (*q == '=') {
- q++;
- SKIP_BLANKS(q);
- meta_charset = wc_guess_charset(q, 0);
- }
- }
- else
-#endif
- if (p && q && !strcasecmp(p, "refresh")) {
- int refresh_interval;
- tmp = NULL;
- refresh_interval = getMetaRefreshParam(q, &tmp);
- if (tmp) {
- q = html_quote(tmp->ptr);
- tmp = Sprintf("Refresh (%d sec) <a href=\"%s\">%s</a>",
- refresh_interval, q, q);
- }
- else if (refresh_interval > 0)
- tmp = Sprintf("Refresh (%d sec)", refresh_interval);
- if (tmp) {
- HTMLlineproc1(tmp->ptr, h_env);
- do_blankline(h_env, obuf, envs[h_env->envc].indent, 0,
- h_env->limit);
- if (!is_redisplay &&
- !((obuf->flag & RB_NOFRAMES) && RenderFrame)) {
- tag->need_reconstruct = TRUE;
- return 0;
- }
- }
- }
- return 1;
- case HTML_BASE:
-#ifdef USE_IMAGE
- p = NULL;
- if (parsedtag_get_value(tag, ATTR_HREF, &p)) {
- if (!cur_baseURL)
- cur_baseURL = New(ParsedURL);
- parseURL(p, cur_baseURL, NULL);
- }
-#endif
- case HTML_MAP:
- case HTML_N_MAP:
- case HTML_AREA:
- return 0;
- case HTML_DEL:
- if (displayInsDel)
- HTMLlineproc1("<U>[DEL:</U>", h_env);
- else
- obuf->flag |= RB_DEL;
- return 1;
- case HTML_N_DEL:
- if (displayInsDel)
- HTMLlineproc1("<U>:DEL]</U>", h_env);
- else
- obuf->flag &= ~RB_DEL;
- return 1;
- case HTML_S:
- if (displayInsDel)
- HTMLlineproc1("<U>[S:</U>", h_env);
- else
- obuf->flag |= RB_S;
- return 1;
- case HTML_N_S:
- if (displayInsDel)
- HTMLlineproc1("<U>:S]</U>", h_env);
- else
- obuf->flag &= ~RB_S;
- return 1;
- case HTML_INS:
- if (displayInsDel)
- HTMLlineproc1("<U>[INS:</U>", h_env);
- return 1;
- case HTML_N_INS:
- if (displayInsDel)
- HTMLlineproc1("<U>:INS]</U>", h_env);
- return 1;
- case HTML_SUP:
- if (!(obuf->flag & (RB_DEL | RB_S)))
- HTMLlineproc1("^", h_env);
- return 1;
- case HTML_N_SUP:
- return 1;
- case HTML_SUB:
- if (!(obuf->flag & (RB_DEL | RB_S)))
- HTMLlineproc1("[", h_env);
- return 1;
- case HTML_N_SUB:
- if (!(obuf->flag & (RB_DEL | RB_S)))
- HTMLlineproc1("]", h_env);
- return 1;
- case HTML_FONT:
- case HTML_N_FONT:
- case HTML_NOP:
- return 1;
- case HTML_BGSOUND:
- if (view_unseenobject) {
- if (parsedtag_get_value(tag, ATTR_SRC, &p)) {
- Str s;
- q = html_quote(p);
- s = Sprintf("<A HREF=\"%s\">bgsound(%s)</A>", q, q);
- HTMLlineproc1(s->ptr, h_env);
- }
- }
- return 1;
- case HTML_EMBED:
- if (view_unseenobject) {
- if (parsedtag_get_value(tag, ATTR_SRC, &p)) {
- Str s;
- q = html_quote(p);
- s = Sprintf("<A HREF=\"%s\">embed(%s)</A>", q, q);
- HTMLlineproc1(s->ptr, h_env);
- }
- }
- return 1;
- case HTML_APPLET:
- if (view_unseenobject) {
- if (parsedtag_get_value(tag, ATTR_ARCHIVE, &p)) {
- Str s;
- q = html_quote(p);
- s = Sprintf("<A HREF=\"%s\">applet archive(%s)</A>", q, q);
- HTMLlineproc1(s->ptr, h_env);
- }
- }
- return 1;
- case HTML_BODY:
- if (view_unseenobject) {
- if (parsedtag_get_value(tag, ATTR_BACKGROUND, &p)) {
- Str s;
- q = html_quote(p);
- s = Sprintf("<IMG SRC=\"%s\" ALT=\"bg image(%s)\"><BR>", q, q);
- HTMLlineproc1(s->ptr, h_env);
- }
- }
- case HTML_N_HEAD:
- if (obuf->flag & RB_TITLE)
- HTMLlineproc1("</title>", h_env);
- case HTML_HEAD:
- case HTML_N_BODY:
- return 1;
- default:
- /* obuf->prevchar = '\0'; */
- return 0;
- }
- /* not reached */
- return 0;
-}
-
-#define PPUSH(p,c) {outp[pos]=(p);outc[pos]=(c);pos++;}
-#define PSIZE \
- if (out_size <= pos + 1) { \
- out_size = pos * 3 / 2; \
- outc = New_Reuse(char, outc, out_size); \
- outp = New_Reuse(Lineprop, outp, out_size); \
- }
-
-static TextLineListItem *_tl_lp2;
-
-static Str
-textlist_feed()
-{
- TextLine *p;
- if (_tl_lp2 != NULL) {
- p = _tl_lp2->ptr;
- _tl_lp2 = _tl_lp2->next;
- return p->line;
- }
- return NULL;
-}
-
-static void
-HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
-{
- static char *outc = NULL;
- static Lineprop *outp = NULL;
- static int out_size = 0;
- Anchor *a_href = NULL, *a_img = NULL, *a_form = NULL;
- char *p, *q, *r, *s, *t, *str;
- Lineprop mode, effect;
- int pos;
- int nlines;
-#ifdef DEBUG
- FILE *debug = NULL;
-#endif
- struct frameset *frameset_s[FRAMESTACK_SIZE];
- int frameset_sp = -1;
- union frameset_element *idFrame = NULL;
- char *id = NULL;
- int hseq, form_id;
- Str line;
- char *endp;
- char symbol = '\0';
- int internal = 0;
- Anchor **a_textarea = NULL;
-#ifdef MENU_SELECT
- Anchor **a_select = NULL;
-#endif
-
- if (out_size == 0) {
- out_size = LINELEN;
- outc = NewAtom_N(char, out_size);
- outp = NewAtom_N(Lineprop, out_size);
- }
-
- n_textarea = -1;
- if (!max_textarea) { /* halfload */
- max_textarea = MAX_TEXTAREA;
- textarea_str = New_N(Str, max_textarea);
- a_textarea = New_N(Anchor *, max_textarea);
- }
-#ifdef MENU_SELECT
- n_select = -1;
- if (!max_select) { /* halfload */
- max_select = MAX_SELECT;
- select_option = New_N(FormSelectOption, max_select);
- a_select = New_N(Anchor *, max_select);
- }
-#endif
-
-#ifdef DEBUG
- if (w3m_debug)
- debug = fopen("zzzerr", "a");
-#endif
-
- effect = 0;
- nlines = 0;
- while ((line = feed()) != NULL) {
-#ifdef DEBUG
- if (w3m_debug) {
- Strfputs(line, debug);
- fputc('\n', debug);
- }
-#endif
- if (n_textarea >= 0 && *(line->ptr) != '<') { /* halfload */
- Strcat(textarea_str[n_textarea], line);
- continue;
- }
- proc_again:
- if (++nlines == llimit)
- break;
- pos = 0;
-#ifdef ENABLE_REMOVE_TRAILINGSPACES
- Strremovetrailingspaces(line);
-#endif
- str = line->ptr;
- endp = str + line->length;
- while (str < endp) {
- PSIZE;
- mode = get_mctype(str);
- if (effect & PC_SYMBOL && *str != '<') {
-#ifdef USE_M17N
- char **buf = set_symbol(symbol_width0);
- int len;
-
- p = buf[(int)symbol];
- len = get_mclen(p);
- mode = get_mctype(p);
- PPUSH(mode | effect, *(p++));
- if (--len) {
- mode = (mode & ~PC_WCHAR1) | PC_WCHAR2;
- while (len--) {
- PSIZE;
- PPUSH(mode | effect, *(p++));
- }
- }
-#else
- PPUSH(PC_ASCII | effect, SYMBOL_BASE + symbol);
-#endif
- str += symbol_width;
- }
-#ifdef USE_M17N
- else if (mode == PC_CTRL || mode == PC_UNDEF) {
-#else
- else if (mode == PC_CTRL || IS_INTSPACE(*str)) {
-#endif
- PPUSH(PC_ASCII | effect, ' ');
- str++;
- }
-#ifdef USE_M17N
- else if (mode & PC_UNKNOWN) {
- PPUSH(PC_ASCII | effect, ' ');
- str += get_mclen(str);
- }
-#endif
- else if (*str != '<' && *str != '&') {
-#ifdef USE_M17N
- int len = get_mclen(str);
-#endif
- PPUSH(mode | effect, *(str++));
-#ifdef USE_M17N
- if (--len) {
- mode = (mode & ~PC_WCHAR1) | PC_WCHAR2;
- while (len--) {
- PSIZE;
- PPUSH(mode | effect, *(str++));
- }
- }
-#endif
- }
- else if (*str == '&') {
- /*
- * & escape processing
- */
- p = getescapecmd(&str);
- while (*p) {
- PSIZE;
- mode = get_mctype((unsigned char *)p);
-#ifdef USE_M17N
- if (mode == PC_CTRL || mode == PC_UNDEF) {
-#else
- if (mode == PC_CTRL || IS_INTSPACE(*str)) {
-#endif
- PPUSH(PC_ASCII | effect, ' ');
- p++;
- }
-#ifdef USE_M17N
- else if (mode & PC_UNKNOWN) {
- PPUSH(PC_ASCII | effect, ' ');
- p += get_mclen(p);
- }
-#endif
- else {
-#ifdef USE_M17N
- int len = get_mclen(p);
-#endif
- PPUSH(mode | effect, *(p++));
-#ifdef USE_M17N
- if (--len) {
- mode = (mode & ~PC_WCHAR1) | PC_WCHAR2;
- while (len--) {
- PSIZE;
- PPUSH(mode | effect, *(p++));
- }
- }
-#endif
- }
- }
- }
- else {
- /* tag processing */
- struct parsed_tag *tag;
- if (!(tag = parse_tag(&str, TRUE)))
- continue;
- switch (tag->tagid) {
- case HTML_B:
- effect |= PE_BOLD;
- break;
- case HTML_N_B:
- effect &= ~PE_BOLD;
- break;
- case HTML_U:
- effect |= PE_UNDER;
- break;
- case HTML_N_U:
- effect &= ~PE_UNDER;
- break;
- case HTML_A:
- if (renderFrameSet &&
- parsedtag_get_value(tag, ATTR_FRAMENAME, &p)) {
- p = url_quote_conv(p, buf->document_charset);
- if (!idFrame || strcmp(idFrame->body->name, p)) {
- idFrame = search_frame(renderFrameSet, p);
- if (idFrame && idFrame->body->attr != F_BODY)
- idFrame = NULL;
- }
- }
- p = r = s = NULL;
- q = buf->baseTarget;
- t = "";
- hseq = 0;
- id = NULL;
- if (parsedtag_get_value(tag, ATTR_NAME, &id)) {
- id = url_quote_conv(id, buf->document_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);
- 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);
- parsedtag_get_value(tag, ATTR_TITLE, &s);
- parsedtag_get_value(tag, ATTR_ACCESSKEY, &t);
- parsedtag_get_value(tag, ATTR_HSEQ, &hseq);
- if (hseq > 0)
- buf->hmarklist =
- putHmarker(buf->hmarklist, currentLn(buf),
- pos, hseq - 1);
- else if (hseq < 0) {
- int h = -hseq - 1;
- if (buf->hmarklist &&
- h < buf->hmarklist->nmark &&
- buf->hmarklist->marks[h].invalid) {
- buf->hmarklist->marks[h].pos = pos;
- buf->hmarklist->marks[h].line = currentLn(buf);
- buf->hmarklist->marks[h].invalid = 0;
- hseq = -hseq;
- }
- }
- if (id && idFrame)
- idFrame->body->nameList =
- putAnchor(idFrame->body->nameList, id, NULL,
- (Anchor **)NULL, NULL, NULL, '\0',
- currentLn(buf), pos);
- if (p) {
- effect |= PE_ANCHOR;
- a_href = registerHref(buf, p, q, r, s,
- *t, currentLn(buf), pos);
- a_href->hseq = ((hseq > 0) ? hseq : -hseq) - 1;
- a_href->slave = (hseq > 0) ? FALSE : TRUE;
- }
- break;
- case HTML_N_A:
- effect &= ~PE_ANCHOR;
- if (a_href) {
- a_href->end.line = currentLn(buf);
- a_href->end.pos = pos;
- if (a_href->start.line == a_href->end.line &&
- a_href->start.pos == a_href->end.pos) {
- if (buf->hmarklist &&
- a_href->hseq < buf->hmarklist->nmark)
- buf->hmarklist->marks[a_href->hseq].invalid = 1;
- a_href->hseq = -1;
- }
- a_href = NULL;
- }
- break;
-
- case HTML_LINK:
- addLink(buf, tag);
- break;
-
- case HTML_IMG_ALT:
- if (parsedtag_get_value(tag, ATTR_SRC, &p)) {
-#ifdef USE_IMAGE
- int w = -1, h = -1, iseq = 0, ismap = 0;
- int xoffset = 0, yoffset = 0, top = 0, bottom = 0;
- parsedtag_get_value(tag, ATTR_HSEQ, &iseq);
- parsedtag_get_value(tag, ATTR_WIDTH, &w);
- parsedtag_get_value(tag, ATTR_HEIGHT, &h);
- parsedtag_get_value(tag, ATTR_XOFFSET, &xoffset);
- parsedtag_get_value(tag, ATTR_YOFFSET, &yoffset);
- parsedtag_get_value(tag, ATTR_TOP_MARGIN, &top);
- parsedtag_get_value(tag, ATTR_BOTTOM_MARGIN, &bottom);
- if (parsedtag_exists(tag, ATTR_ISMAP))
- ismap = 1;
- q = NULL;
- parsedtag_get_value(tag, ATTR_USEMAP, &q);
- if (iseq > 0) {
- buf->imarklist = putHmarker(buf->imarklist,
- currentLn(buf), pos,
- iseq - 1);
- }
-#endif
- s = NULL;
- parsedtag_get_value(tag, ATTR_TITLE, &s);
- p = url_quote_conv(remove_space(p),
- buf->document_charset);
- a_img = registerImg(buf, p, s, currentLn(buf), pos);
-#ifdef USE_IMAGE
- a_img->hseq = iseq;
- a_img->image = NULL;
- if (iseq > 0) {
- ParsedURL u;
- Image *image;
-
- parseURL2(a_img->url, &u, cur_baseURL);
- a_img->image = image = New(Image);
- image->url = parsedURL2Str(&u)->ptr;
- if (!uncompressed_file_type(u.file, &image->ext))
- image->ext = filename_extension(u.file, TRUE);
- image->cache = NULL;
- image->width =
- (w > MAX_IMAGE_SIZE) ? MAX_IMAGE_SIZE : w;
- image->height =
- (h > MAX_IMAGE_SIZE) ? MAX_IMAGE_SIZE : h;
- image->xoffset = xoffset;
- image->yoffset = yoffset;
- image->y = currentLn(buf) - top;
- if (image->xoffset < 0 && pos == 0)
- image->xoffset = 0;
- if (image->yoffset < 0 && image->y == 1)
- image->yoffset = 0;
- image->rows = 1 + top + bottom;
- image->map = q;
- image->ismap = ismap;
- image->touch = 0;
- image->cache = getImage(image, cur_baseURL,
- IMG_FLAG_SKIP);
- }
- else if (iseq < 0) {
- BufferPoint *po = buf->imarklist->marks - iseq - 1;
- Anchor *a = retrieveAnchor(buf->img,
- po->line, po->pos);
- if (a) {
- a_img->url = a->url;
- a_img->image = a->image;
- }
- }
-#endif
- }
- effect |= PE_IMAGE;
- break;
- case HTML_N_IMG_ALT:
- effect &= ~PE_IMAGE;
- if (a_img) {
- a_img->end.line = currentLn(buf);
- a_img->end.pos = pos;
- }
- a_img = NULL;
- break;
- case HTML_INPUT_ALT:
- {
- FormList *form;
- int top = 0, bottom = 0;
- int textareanumber = -1;
-#ifdef MENU_SELECT
- int selectnumber = -1;
-#endif
- hseq = 0;
- form_id = -1;
-
- parsedtag_get_value(tag, ATTR_HSEQ, &hseq);
- parsedtag_get_value(tag, ATTR_FID, &form_id);
- parsedtag_get_value(tag, ATTR_TOP_MARGIN, &top);
- parsedtag_get_value(tag, ATTR_BOTTOM_MARGIN, &bottom);
- if (form_id < 0 || form_id > form_max || forms == NULL)
- break; /* outside of <form>..</form> */
- form = forms[form_id];
- if (hseq > 0) {
- int hpos = pos;
- if (*str == '[')
- hpos++;
- buf->hmarklist =
- putHmarker(buf->hmarklist, currentLn(buf),
- hpos, hseq - 1);
- }
- if (!form->target)
- form->target = buf->baseTarget;
- if (a_textarea &&
- parsedtag_get_value(tag, ATTR_TEXTAREANUMBER,
- &textareanumber)) {
- if (textareanumber >= max_textarea) {
- max_textarea = 2 * textareanumber;
- textarea_str = New_Reuse(Str, textarea_str,
- max_textarea);
- a_textarea = New_Reuse(Anchor *, a_textarea,
- max_textarea);
- }
- }
-#ifdef MENU_SELECT
- if (a_select &&
- parsedtag_get_value(tag, ATTR_SELECTNUMBER,
- &selectnumber)) {
- if (selectnumber >= max_select) {
- max_select = 2 * selectnumber;
- select_option = New_Reuse(FormSelectOption,
- select_option,
- max_select);
- a_select = New_Reuse(Anchor *, a_select,
- max_select);
- }
- }
-#endif
- a_form =
- registerForm(buf, form, tag, currentLn(buf), pos);
- if (a_textarea && textareanumber >= 0)
- a_textarea[textareanumber] = a_form;
-#ifdef MENU_SELECT
- if (a_select && selectnumber >= 0)
- a_select[selectnumber] = a_form;
-#endif
- if (a_form) {
- a_form->hseq = hseq - 1;
- a_form->y = currentLn(buf) - top;
- a_form->rows = 1 + top + bottom;
- if (!parsedtag_exists(tag, ATTR_NO_EFFECT))
- effect |= PE_FORM;
- break;
- }
- }
- case HTML_N_INPUT_ALT:
- effect &= ~PE_FORM;
- if (a_form) {
- a_form->end.line = currentLn(buf);
- a_form->end.pos = pos;
- if (a_form->start.line == a_form->end.line &&
- a_form->start.pos == a_form->end.pos)
- a_form->hseq = -1;
- }
- a_form = NULL;
- break;
- case HTML_MAP:
- if (parsedtag_get_value(tag, ATTR_NAME, &p)) {
- MapList *m = New(MapList);
- m->name = Strnew_charp(p);
- m->area = newGeneralList();
- m->next = buf->maplist;
- buf->maplist = m;
- }
- break;
- case HTML_N_MAP:
- /* nothing to do */
- break;
- case HTML_AREA:
- if (buf->maplist == NULL) /* outside of <map>..</map> */
- break;
- if (parsedtag_get_value(tag, ATTR_HREF, &p)) {
- MapArea *a;
- p = url_quote_conv(remove_space(p),
- buf->document_charset);
- t = NULL;
- parsedtag_get_value(tag, ATTR_TARGET, &t);
- q = "";
- parsedtag_get_value(tag, ATTR_ALT, &q);
- r = NULL;
- s = NULL;
-#ifdef USE_IMAGE
- parsedtag_get_value(tag, ATTR_SHAPE, &r);
- parsedtag_get_value(tag, ATTR_COORDS, &s);
-#endif
- a = newMapArea(p, t, q, r, s);
- pushValue(buf->maplist->area, (void *)a);
- }
- break;
- case HTML_FRAMESET:
- frameset_sp++;
- if (frameset_sp >= FRAMESTACK_SIZE)
- break;
- frameset_s[frameset_sp] = newFrameSet(tag);
- if (frameset_s[frameset_sp] == NULL)
- break;
- if (frameset_sp == 0) {
- if (buf->frameset == NULL) {
- buf->frameset = frameset_s[frameset_sp];
- }
- else
- pushFrameTree(&(buf->frameQ),
- frameset_s[frameset_sp], NULL);
- }
- else
- addFrameSetElement(frameset_s[frameset_sp - 1],
- *(union frameset_element *)
- &frameset_s[frameset_sp]);
- break;
- case HTML_N_FRAMESET:
- if (frameset_sp >= 0)
- frameset_sp--;
- break;
- case HTML_FRAME:
- if (frameset_sp >= 0 && frameset_sp < FRAMESTACK_SIZE) {
- union frameset_element element;
-
- element.body = newFrame(tag, buf);
- addFrameSetElement(frameset_s[frameset_sp], element);
- }
- break;
- case HTML_BASE:
- if (parsedtag_get_value(tag, ATTR_HREF, &p)) {
- p = url_quote_conv(remove_space(p),
- buf->document_charset);
- if (!buf->baseURL)
- buf->baseURL = New(ParsedURL);
- parseURL(p, buf->baseURL, NULL);
- }
- if (parsedtag_get_value(tag, ATTR_TARGET, &p))
- buf->baseTarget =
- url_quote_conv(p, buf->document_charset);
- break;
- case HTML_META:
- p = q = NULL;
- parsedtag_get_value(tag, ATTR_HTTP_EQUIV, &p);
- parsedtag_get_value(tag, ATTR_CONTENT, &q);
- if (p && q && !strcasecmp(p, "refresh") && MetaRefresh) {
- Str tmp = NULL;
- int refresh_interval = getMetaRefreshParam(q, &tmp);
-#ifdef USE_ALARM
- if (tmp) {
- p = url_quote_conv(remove_space(tmp->ptr),
- buf->document_charset);
- buf->event = setAlarmEvent(buf->event,
- refresh_interval,
- AL_IMPLICIT_ONCE,
- FUNCNAME_gorURL, p);
- }
- else if (refresh_interval > 0)
- buf->event = setAlarmEvent(buf->event,
- refresh_interval,
- AL_IMPLICIT,
- FUNCNAME_reload, NULL);
-#else
- if (tmp && refresh_interval == 0) {
- p = url_quote_conv(remove_space(tmp->ptr),
- buf->document_charset);
- pushEvent(FUNCNAME_gorURL, p);
- }
-#endif
- }
- break;
- case HTML_INTERNAL:
- internal = HTML_INTERNAL;
- break;
- case HTML_N_INTERNAL:
- internal = HTML_N_INTERNAL;
- break;
- case HTML_FORM_INT:
- if (parsedtag_get_value(tag, ATTR_FID, &form_id))
- process_form_int(tag, form_id);
- break;
- case HTML_TEXTAREA_INT:
- if (parsedtag_get_value(tag, ATTR_TEXTAREANUMBER,
- &n_textarea)
- && n_textarea < max_textarea) {
- textarea_str[n_textarea] = Strnew();
- }
- else
- n_textarea = -1;
- break;
- case HTML_N_TEXTAREA_INT:
- if (n_textarea >= 0) {
- FormItemList *item =
- (FormItemList *)a_textarea[n_textarea]->url;
- item->init_value = item->value =
- textarea_str[n_textarea];
- }
- break;
-#ifdef MENU_SELECT
- case HTML_SELECT_INT:
- if (parsedtag_get_value(tag, ATTR_SELECTNUMBER, &n_select)
- && n_select < max_select) {
- select_option[n_select].first = NULL;
- select_option[n_select].last = NULL;
- }
- else
- n_select = -1;
- break;
- case HTML_N_SELECT_INT:
- if (n_select >= 0) {
- FormItemList *item =
- (FormItemList *)a_select[n_select]->url;
- item->select_option = select_option[n_select].first;
- chooseSelectOption(item, item->select_option);
- item->init_selected = item->selected;
- item->init_value = item->value;
- item->init_label = item->label;
- }
- break;
- case HTML_OPTION_INT:
- if (n_select >= 0) {
- int selected;
- q = "";
- parsedtag_get_value(tag, ATTR_LABEL, &q);
- p = q;
- parsedtag_get_value(tag, ATTR_VALUE, &p);
- selected = parsedtag_exists(tag, ATTR_SELECTED);
- addSelectOption(&select_option[n_select],
- Strnew_charp(p), Strnew_charp(q),
- selected);
- }
- break;
-#endif
- case HTML_TITLE_ALT:
- if (parsedtag_get_value(tag, ATTR_TITLE, &p))
- buf->buffername = html_unquote(p);
- break;
- case HTML_SYMBOL:
- effect |= PC_SYMBOL;
- if (parsedtag_get_value(tag, ATTR_TYPE, &p))
- symbol = (char)atoi(p);
- break;
- case HTML_N_SYMBOL:
- effect &= ~PC_SYMBOL;
- break;
- }
-#ifdef ID_EXT
- id = NULL;
- if (parsedtag_get_value(tag, ATTR_ID, &id)) {
- id = url_quote_conv(id, buf->document_charset);
- registerName(buf, id, currentLn(buf), pos);
- }
- if (renderFrameSet &&
- parsedtag_get_value(tag, ATTR_FRAMENAME, &p)) {
- p = url_quote_conv(p, buf->document_charset);
- if (!idFrame || strcmp(idFrame->body->name, p)) {
- idFrame = search_frame(renderFrameSet, p);
- if (idFrame && idFrame->body->attr != F_BODY)
- idFrame = NULL;
- }
- }
- if (id && idFrame)
- idFrame->body->nameList =
- putAnchor(idFrame->body->nameList, id, NULL,
- (Anchor **)NULL, NULL, NULL, '\0',
- currentLn(buf), pos);
-#endif /* ID_EXT */
- }
- }
- /* end of processing for one line */
- if (!internal)
- addnewline(buf, outc, outp, NULL, pos, -1, nlines);
- if (internal == HTML_N_INTERNAL)
- internal = 0;
- if (str != endp) {
- line = Strsubstr(line, str - line->ptr, endp - str);
- goto proc_again;
- }
- }
-#ifdef DEBUG
- if (w3m_debug)
- fclose(debug);
-#endif
- for (form_id = 1; form_id <= form_max; form_id++)
- forms[form_id]->next = forms[form_id - 1];
- buf->formlist = (form_max >= 0) ? forms[form_max] : NULL;
- if (n_textarea)
- addMultirowsForm(buf, buf->formitem);
-#ifdef USE_IMAGE
- addMultirowsImg(buf, buf->img);
-#endif
-}
-
-static void
-addLink(Buffer *buf, struct parsed_tag *tag)
-{
- char *href = NULL, *title = NULL, *ctype = NULL, *rel = NULL, *rev = NULL;
- char type = LINK_TYPE_NONE;
- LinkList *l;
-
- parsedtag_get_value(tag, ATTR_HREF, &href);
- if (href)
- href = url_quote_conv(remove_space(href), buf->document_charset);
- parsedtag_get_value(tag, ATTR_TITLE, &title);
- parsedtag_get_value(tag, ATTR_TYPE, &ctype);
- parsedtag_get_value(tag, ATTR_REL, &rel);
- if (rel != NULL) {
- /* forward link type */
- type = LINK_TYPE_REL;
- if (title == NULL)
- title = rel;
- }
- parsedtag_get_value(tag, ATTR_REV, &rev);
- if (rev != NULL) {
- /* reverse link type */
- type = LINK_TYPE_REV;
- if (title == NULL)
- title = rev;
- }
-
- l = New(LinkList);
- l->url = href;
- l->title = title;
- l->ctype = ctype;
- l->type = type;
- l->next = NULL;
- if (buf->linklist) {
- LinkList *i;
- for (i = buf->linklist; i->next; i = i->next) ;
- i->next = l;
- }
- else
- buf->linklist = l;
-}
-
-void
-HTMLlineproc2(Buffer *buf, TextLineList *tl)
-{
- _tl_lp2 = tl->first;
- HTMLlineproc2body(buf, textlist_feed, -1);
-}
-
-static InputStream _file_lp2;
-
-static Str
-file_feed()
-{
- Str s;
- s = StrISgets(_file_lp2);
- if (s->length == 0) {
- ISclose(_file_lp2);
- return NULL;
- }
- return s;
-}
-
-void
-HTMLlineproc3(Buffer *buf, InputStream stream)
-{
- _file_lp2 = stream;
- HTMLlineproc2body(buf, file_feed, -1);
-}
-
-static void
-proc_escape(struct readbuffer *obuf, char **str_return)
-{
- char *str = *str_return, *estr;
- int ech = getescapechar(str_return);
- int width, n_add = *str_return - str;
- Lineprop mode = PC_ASCII;
-
- if (ech < 0) {
- *str_return = str;
- proc_mchar(obuf, obuf->flag & RB_SPECIAL, 1, str_return, PC_ASCII);
- return;
- }
- mode = IS_CNTRL(ech) ? PC_CTRL : PC_ASCII;
-
- estr = conv_entity(ech);
- check_breakpoint(obuf, obuf->flag & RB_SPECIAL, estr);
- width = get_strwidth(estr);
- if (width == 1 && ech == (unsigned char)*estr &&
- ech != '&' && ech != '<' && ech != '>') {
- if (IS_CNTRL(ech))
- mode = PC_CTRL;
- push_charp(obuf, width, estr, mode);
- }
- else
- push_nchars(obuf, width, str, n_add, mode);
- set_prevchar(obuf->prevchar, estr, strlen(estr));
- obuf->prev_ctype = mode;
-}
-
-
-static int
-need_flushline(struct html_feed_environ *h_env, struct readbuffer *obuf,
- Lineprop mode)
-{
- char ch;
-
- if (obuf->flag & RB_PRE_INT) {
- if (obuf->pos > h_env->limit)
- return 1;
- else
- return 0;
- }
-
- ch = Strlastchar(obuf->line);
- /* if (ch == ' ' && obuf->tag_sp > 0) */
- if (ch == ' ')
- return 0;
-
- if (obuf->pos > h_env->limit)
- return 1;
-
- return 0;
-}
-
-static int
-table_width(struct html_feed_environ *h_env, int table_level)
-{
- int width;
- if (table_level < 0)
- return 0;
- width = tables[table_level]->total_width;
- if (table_level > 0 || width > 0)
- return width;
- return h_env->limit - h_env->envs[h_env->envc].indent;
-}
-
-/* HTML processing first pass */
-void
-HTMLlineproc0(char *line, struct html_feed_environ *h_env, int internal)
-{
- Lineprop mode;
- int cmd;
- struct readbuffer *obuf = h_env->obuf;
- int indent, delta;
- struct parsed_tag *tag;
- Str tokbuf;
- struct table *tbl = NULL;
- struct table_mode *tbl_mode = NULL;
- int tbl_width = 0;
-#ifdef USE_M17N
- int is_hangul, prev_is_hangul = 0;
-#endif
-
-#ifdef DEBUG
- if (w3m_debug) {
- FILE *f = fopen("zzzproc1", "a");
- fprintf(f, "%c%c%c%c",
- (obuf->flag & RB_PREMODE) ? 'P' : ' ',
- (obuf->table_level >= 0) ? 'T' : ' ',
- (obuf->flag & RB_INTXTA) ? 'X' : ' ',
- (obuf->flag & (RB_SCRIPT | RB_STYLE)) ? 'S' : ' ');
- fprintf(f, "HTMLlineproc1(\"%s\",%d,%lx)\n", line, h_env->limit,
- (unsigned long)h_env);
- fclose(f);
- }
-#endif
-
- tokbuf = Strnew();
-
- table_start:
- if (obuf->table_level >= 0) {
- int level = min(obuf->table_level, MAX_TABLE - 1);
- tbl = tables[level];
- tbl_mode = &table_mode[level];
- tbl_width = table_width(h_env, level);
- }
-
- while (*line != '\0') {
- char *str, *p;
- int is_tag = FALSE;
- int pre_mode = (obuf->table_level >= 0) ? tbl_mode->pre_mode :
- obuf->flag;
- int end_tag = (obuf->table_level >= 0) ? tbl_mode->end_tag :
- obuf->end_tag;
-
- if (*line == '<' || obuf->status != R_ST_NORMAL) {
- /*
- * Tag processing
- */
- if (obuf->status == R_ST_EOL)
- obuf->status = R_ST_NORMAL;
- else {
- read_token(h_env->tagbuf, &line, &obuf->status,
- pre_mode & RB_PREMODE, obuf->status != R_ST_NORMAL);
- if (obuf->status != R_ST_NORMAL)
- return;
- }
- if (h_env->tagbuf->length == 0)
- continue;
- str = h_env->tagbuf->ptr;
- if (*str == '<') {
- if (str[1] && REALLY_THE_BEGINNING_OF_A_TAG(str))
- is_tag = TRUE;
- else if (!(pre_mode & (RB_PLAIN | RB_INTXTA | RB_INSELECT |
- RB_SCRIPT | RB_STYLE | RB_TITLE))) {
- line = Strnew_m_charp(str + 1, line, NULL)->ptr;
- str = "&lt;";
- }
- }
- }
- else {
- read_token(tokbuf, &line, &obuf->status, pre_mode & RB_PREMODE, 0);
- if (obuf->status != R_ST_NORMAL) /* R_ST_AMP ? */
- obuf->status = R_ST_NORMAL;
- str = tokbuf->ptr;
- }
-
- if (pre_mode & (RB_PLAIN | RB_INTXTA | RB_INSELECT | RB_SCRIPT |
- RB_STYLE | RB_TITLE)) {
- if (is_tag) {
- p = str;
- if ((tag = parse_tag(&p, internal))) {
- if (tag->tagid == end_tag ||
- (pre_mode & RB_INSELECT && tag->tagid == HTML_N_FORM)
- || (pre_mode & RB_TITLE
- && (tag->tagid == HTML_N_HEAD
- || tag->tagid == HTML_BODY)))
- goto proc_normal;
- }
- }
- /* title */
- if (pre_mode & RB_TITLE) {
- feed_title(str);
- continue;
- }
- /* select */
- if (pre_mode & RB_INSELECT) {
- if (obuf->table_level >= 0)
- goto proc_normal;
- feed_select(str);
- continue;
- }
- if (is_tag) {
- if (strncmp(str, "<!--", 4) && (p = strchr(str + 1, '<'))) {
- str = Strnew_charp_n(str, p - str)->ptr;
- line = Strnew_m_charp(p, line, NULL)->ptr;
- }
- is_tag = FALSE;
- }
- if (obuf->table_level >= 0)
- goto proc_normal;
- /* textarea */
- if (pre_mode & RB_INTXTA) {
- feed_textarea(str);
- continue;
- }
- /* script */
- if (pre_mode & RB_SCRIPT)
- continue;
- /* style */
- if (pre_mode & RB_STYLE)
- continue;
- }
-
- proc_normal:
- if (obuf->table_level >= 0) {
- /*
- * within table: in <table>..</table>, all input tokens
- * are fed to the table renderer, and then the renderer
- * makes HTML output.
- */
- switch (feed_table(tbl, str, tbl_mode, tbl_width, internal)) {
- case 0:
- /* </table> tag */
- obuf->table_level--;
- if (obuf->table_level >= MAX_TABLE - 1)
- continue;
- end_table(tbl);
- if (obuf->table_level >= 0) {
- struct table *tbl0 = tables[obuf->table_level];
- str = Sprintf("<table_alt tid=%d>", tbl0->ntable)->ptr;
- pushTable(tbl0, tbl);
- tbl = tbl0;
- tbl_mode = &table_mode[obuf->table_level];
- tbl_width = table_width(h_env, obuf->table_level);
- feed_table(tbl, str, tbl_mode, tbl_width, TRUE);
- continue;
- /* continue to the next */
- }
- if (obuf->flag & RB_DEL)
- continue;
- /* all tables have been read */
- if (tbl->vspace > 0 && !(obuf->flag & RB_IGNORE_P)) {
- int indent = h_env->envs[h_env->envc].indent;
- flushline(h_env, obuf, indent, 0, h_env->limit);
- do_blankline(h_env, obuf, indent, 0, h_env->limit);
- }
- save_fonteffect(h_env, obuf);
- renderTable(tbl, tbl_width, h_env);
- restore_fonteffect(h_env, obuf);
- obuf->flag &= ~RB_IGNORE_P;
- if (tbl->vspace > 0) {
- int indent = h_env->envs[h_env->envc].indent;
- do_blankline(h_env, obuf, indent, 0, h_env->limit);
- obuf->flag |= RB_IGNORE_P;
- }
- set_space_to_prevchar(obuf->prevchar);
- continue;
- case 1:
- /* <table> tag */
- break;
- default:
- continue;
- }
- }
-
- if (is_tag) {
-/*** Beginning of a new tag ***/
- if ((tag = parse_tag(&str, internal)))
- cmd = tag->tagid;
- else
- continue;
- /* process tags */
- if (HTMLtagproc1(tag, h_env) == 0) {
- /* preserve the tag for second-stage processing */
- if (parsedtag_need_reconstruct(tag))
- h_env->tagbuf = parsedtag2str(tag);
- push_tag(obuf, h_env->tagbuf->ptr, cmd);
- }
-#ifdef ID_EXT
- else {
- process_idattr(obuf, cmd, tag);
- }
-#endif /* ID_EXT */
- obuf->bp.init_flag = 1;
- clear_ignore_p_flag(cmd, obuf);
- if (cmd == HTML_TABLE)
- goto table_start;
- else
- continue;
- }
-
- if (obuf->flag & (RB_DEL | RB_S))
- continue;
- while (*str) {
- mode = get_mctype(str);
- delta = get_mcwidth(str);
- if (obuf->flag & (RB_SPECIAL & ~RB_NOBR)) {
- char ch = *str;
- if (!(obuf->flag & RB_PLAIN) && (*str == '&')) {
- char *p = str;
- int ech = getescapechar(&p);
- if (ech == '\n' || ech == '\r') {
- ch = '\n';
- str = p - 1;
- }
- else if (ech == '\t') {
- ch = '\t';
- str = p - 1;
- }
- }
- if (ch != '\n')
- obuf->flag &= ~RB_IGNORE_P;
- if (ch == '\n') {
- str++;
- if (obuf->flag & RB_IGNORE_P) {
- obuf->flag &= ~RB_IGNORE_P;
- continue;
- }
- if (obuf->flag & RB_PRE_INT)
- PUSH(' ');
- else
- flushline(h_env, obuf, h_env->envs[h_env->envc].indent,
- 1, h_env->limit);
- }
- else if (ch == '\t') {
- do {
- PUSH(' ');
- } while ((h_env->envs[h_env->envc].indent + obuf->pos)
- % Tabstop != 0);
- str++;
- }
- else if (obuf->flag & RB_PLAIN) {
- char *p = html_quote_char(*str);
- if (p) {
- push_charp(obuf, 1, p, PC_ASCII);
- str++;
- }
- else {
- proc_mchar(obuf, 1, delta, &str, mode);
- }
- }
- else {
- if (*str == '&')
- proc_escape(obuf, &str);
- else
- proc_mchar(obuf, 1, delta, &str, mode);
- }
- if (obuf->flag & (RB_SPECIAL & ~RB_PRE_INT))
- continue;
- }
- else {
- if (!IS_SPACE(*str))
- obuf->flag &= ~RB_IGNORE_P;
- if ((mode == PC_ASCII || mode == PC_CTRL) && IS_SPACE(*str)) {
- if (*obuf->prevchar->ptr != ' ') {
- PUSH(' ');
- }
- str++;
- }
- else {
-#ifdef USE_M17N
- if (mode == PC_KANJI1)
- is_hangul = wtf_is_hangul((wc_uchar *) str);
- else
- is_hangul = 0;
- if (mode == PC_KANJI1 &&
- !is_hangul && !prev_is_hangul &&
- obuf->pos > h_env->envs[h_env->envc].indent &&
- Strlastchar(obuf->line) == ' ') {
- while (obuf->line->length >= 2 &&
- !strncmp(obuf->line->ptr + obuf->line->length -
- 2, " ", 2)
- && obuf->pos >= h_env->envs[h_env->envc].indent) {
- Strshrink(obuf->line, 1);
- obuf->pos--;
- }
- if (obuf->line->length >= 3 &&
- obuf->prev_ctype == PC_KANJI1 &&
- Strlastchar(obuf->line) == ' ' &&
- obuf->pos >= h_env->envs[h_env->envc].indent) {
- Strshrink(obuf->line, 1);
- obuf->pos--;
- }
- }
- prev_is_hangul = is_hangul;
-#endif
- if (*str == '&')
- proc_escape(obuf, &str);
- else
- proc_mchar(obuf, obuf->flag & RB_SPECIAL, delta, &str,
- mode);
- }
- }
- if (need_flushline(h_env, obuf, mode)) {
- char *bp = obuf->line->ptr + obuf->bp.len;
- char *tp = bp - obuf->bp.tlen;
- int i = 0;
-
- if (tp > obuf->line->ptr && tp[-1] == ' ')
- i = 1;
-
- indent = h_env->envs[h_env->envc].indent;
- if (obuf->bp.pos - i > indent) {
- Str line;
- append_tags(obuf);
- line = Strnew_charp(bp);
- Strshrink(obuf->line, obuf->line->length - obuf->bp.len);
-#ifdef FORMAT_NICE
- if (obuf->pos - i > h_env->limit)
- obuf->flag |= RB_FILL;
-#endif /* FORMAT_NICE */
- back_to_breakpoint(obuf);
- flushline(h_env, obuf, indent, 0, h_env->limit);
-#ifdef FORMAT_NICE
- obuf->flag &= ~RB_FILL;
-#endif /* FORMAT_NICE */
- HTMLlineproc1(line->ptr, h_env);
- }
- }
- }
- }
- if (!(obuf->flag & (RB_SPECIAL | RB_INTXTA | RB_INSELECT))) {
- char *tp;
- int i = 0;
-
- if (obuf->bp.pos == obuf->pos) {
- tp = &obuf->line->ptr[obuf->bp.len - obuf->bp.tlen];
- }
- else {
- tp = &obuf->line->ptr[obuf->line->length];
- }
-
- if (tp > obuf->line->ptr && tp[-1] == ' ')
- i = 1;
- indent = h_env->envs[h_env->envc].indent;
- if (obuf->pos - i > h_env->limit) {
-#ifdef FORMAT_NICE
- obuf->flag |= RB_FILL;
-#endif /* FORMAT_NICE */
- flushline(h_env, obuf, indent, 0, h_env->limit);
-#ifdef FORMAT_NICE
- obuf->flag &= ~RB_FILL;
-#endif /* FORMAT_NICE */
- }
- }
-}
-
-extern char *NullLine;
-extern Lineprop NullProp[];
-
-#ifndef USE_ANSI_COLOR
-#define addnewline2(a,b,c,d,e,f) _addnewline2(a,b,c,e,f)
-#endif
-static void
-addnewline2(Buffer *buf, char *line, Lineprop *prop, Linecolor *color, int pos,
- int nlines)
-{
- Line *l;
- l = New(Line);
- l->next = NULL;
- l->lineBuf = line;
- l->propBuf = prop;
-#ifdef USE_ANSI_COLOR
- l->colorBuf = color;
-#endif
- l->len = pos;
- l->width = -1;
- l->size = pos;
- l->bpos = 0;
- l->bwidth = 0;
- l->prev = buf->currentLine;
- if (buf->currentLine) {
- l->next = buf->currentLine->next;
- buf->currentLine->next = l;
- }
- else
- l->next = NULL;
- if (buf->lastLine == NULL || buf->lastLine == buf->currentLine)
- buf->lastLine = l;
- buf->currentLine = l;
- if (buf->firstLine == NULL)
- buf->firstLine = l;
- l->linenumber = ++buf->allLine;
- if (nlines < 0) {
- /* l->real_linenumber = l->linenumber; */
- l->real_linenumber = 0;
- }
- else {
- l->real_linenumber = nlines;
- }
- l = NULL;
-}
-
-static void
-addnewline(Buffer *buf, char *line, Lineprop *prop, Linecolor *color, int pos,
- int width, int nlines)
-{
- char *s;
- Lineprop *p;
-#ifdef USE_ANSI_COLOR
- Linecolor *c;
-#endif
- Line *l;
- int i, bpos, bwidth;
-
- if (pos > 0) {
- s = allocStr(line, pos);
- p = NewAtom_N(Lineprop, pos);
- bcopy((void *)prop, (void *)p, pos * sizeof(Lineprop));
- }
- else {
- s = NullLine;
- p = NullProp;
- }
-#ifdef USE_ANSI_COLOR
- if (pos > 0 && color) {
- c = NewAtom_N(Linecolor, pos);
- bcopy((void *)color, (void *)c, pos * sizeof(Linecolor));
- }
- else {
- c = NULL;
- }
-#endif
- addnewline2(buf, s, p, c, pos, nlines);
- if (pos <= 0 || width <= 0)
- return;
- bpos = 0;
- bwidth = 0;
- while (1) {
- l = buf->currentLine;
- l->bpos = bpos;
- l->bwidth = bwidth;
- i = columnLen(l, width);
- if (i == 0) {
- i++;
-#ifdef USE_M17N
- while (i < l->len && p[i] & PC_WCHAR2)
- i++;
-#endif
- }
- l->len = i;
- l->width = COLPOS(l, l->len);
- if (pos <= i)
- return;
- bpos += l->len;
- bwidth += l->width;
- s += i;
- p += i;
-#ifdef USE_ANSI_COLOR
- if (c)
- c += i;
-#endif
- pos -= i;
- addnewline2(buf, s, p, c, pos, nlines);
- }
-}
-
-/*
- * loadHTMLBuffer: read file and make new buffer
- */
-Buffer *
-loadHTMLBuffer(URLFile *f, Buffer *newBuf)
-{
- FILE *src = NULL;
- Str tmp;
-
- if (newBuf == NULL)
- newBuf = newBuffer(INIT_BUFFER_WIDTH);
- if (newBuf->sourcefile == NULL &&
- (f->scheme != SCM_LOCAL || newBuf->mailcap)) {
- tmp = tmpfname(TMPF_SRC, ".html");
- src = fopen(tmp->ptr, "w");
- if (src)
- newBuf->sourcefile = tmp->ptr;
- }
-
- loadHTMLstream(f, newBuf, src, newBuf->bufferprop & BP_FRAME);
-
- newBuf->topLine = newBuf->firstLine;
- newBuf->lastLine = newBuf->currentLine;
- newBuf->currentLine = newBuf->firstLine;
- if (n_textarea)
- formResetBuffer(newBuf, newBuf->formitem);
- if (src)
- fclose(src);
-
- return newBuf;
-}
-
-static char *_size_unit[] = { "b", "kb", "Mb", "Gb", "Tb",
- "Pb", "Eb", "Zb", "Bb", "Yb", NULL
-};
-
-char *
-convert_size(clen_t size, int usefloat)
-{
- float csize;
- int sizepos = 0;
- char **sizes = _size_unit;
-
- csize = (float)size;
- while (csize >= 999.495 && sizes[sizepos + 1]) {
- csize = csize / 1024.0;
- sizepos++;
- }
- return Sprintf(usefloat ? "%.3g%s" : "%.0f%s",
- floor(csize * 100.0 + 0.5) / 100.0, sizes[sizepos])->ptr;
-}
-
-char *
-convert_size2(clen_t size1, clen_t size2, int usefloat)
-{
- char **sizes = _size_unit;
- float csize, factor = 1;
- int sizepos = 0;
-
- csize = (float)((size1 > size2) ? size1 : size2);
- while (csize / factor >= 999.495 && sizes[sizepos + 1]) {
- factor *= 1024.0;
- sizepos++;
- }
- return Sprintf(usefloat ? "%.3g/%.3g%s" : "%.0f/%.0f%s",
- floor(size1 / factor * 100.0 + 0.5) / 100.0,
- floor(size2 / factor * 100.0 + 0.5) / 100.0,
- sizes[sizepos])->ptr;
-}
-
-void
-showProgress(clen_t * linelen, clen_t * trbyte)
-{
- int i, j, rate, duration, eta, pos;
- static time_t last_time, start_time;
- time_t cur_time;
- Str messages;
- char *fmtrbyte, *fmrate;
-
- if (!fmInitialized)
- return;
-
- if (*linelen < 1024)
- return;
- if (current_content_length > 0) {
- double ratio;
- cur_time = time(0);
- if (*trbyte == 0) {
- move(LASTLINE, 0);
- clrtoeolx();
- start_time = cur_time;
- }
- *trbyte += *linelen;
- *linelen = 0;
- if (cur_time == last_time)
- return;
- last_time = cur_time;
- move(LASTLINE, 0);
- ratio = 100.0 * (*trbyte) / current_content_length;
- fmtrbyte = convert_size2(*trbyte, current_content_length, 1);
- duration = cur_time - start_time;
- if (duration) {
- rate = *trbyte / duration;
- fmrate = convert_size(rate, 1);
- eta = rate ? (current_content_length - *trbyte) / rate : -1;
- messages = Sprintf("%11s %3.0f%% "
- "%7s/s "
- "eta %02d:%02d:%02d ",
- fmtrbyte, ratio,
- fmrate,
- eta / (60 * 60), (eta / 60) % 60, eta % 60);
- }
- else {
- messages = Sprintf("%11s %3.0f%% ",
- fmtrbyte, ratio);
- }
- addstr(messages->ptr);
- pos = 42;
- i = pos + (COLS - pos - 1) * (*trbyte) / current_content_length;
- move(LASTLINE, pos);
- standout();
- addch(' ');
- for (j = pos + 1; j <= i; j++)
- addch('|');
- standend();
- /* no_clrtoeol(); */
- refresh();
- }
- else {
- cur_time = time(0);
- if (*trbyte == 0) {
- move(LASTLINE, 0);
- clrtoeolx();
- start_time = cur_time;
- }
- *trbyte += *linelen;
- *linelen = 0;
- if (cur_time == last_time)
- return;
- last_time = cur_time;
- move(LASTLINE, 0);
- fmtrbyte = convert_size(*trbyte, 1);
- duration = cur_time - start_time;
- if (duration) {
- fmrate = convert_size(*trbyte / duration, 1);
- messages = Sprintf("%7s loaded %7s/s", fmtrbyte, fmrate);
- }
- else {
- messages = Sprintf("%7s loaded", fmtrbyte);
- }
- message(messages->ptr, 0, 0);
- refresh();
- }
-}
-
-void
-init_henv(struct html_feed_environ *h_env, struct readbuffer *obuf,
- struct environment *envs, int nenv, TextLineList *buf,
- int limit, int indent)
-{
- envs[0].indent = indent;
-
- obuf->line = Strnew();
- obuf->cprop = 0;
- obuf->pos = 0;
- obuf->prevchar = Strnew_size(8);
- set_space_to_prevchar(obuf->prevchar);
- obuf->flag = RB_IGNORE_P;
- obuf->flag_sp = 0;
- obuf->status = R_ST_NORMAL;
- obuf->table_level = -1;
- obuf->nobr_level = 0;
- bzero((void *)&obuf->anchor, sizeof(obuf->anchor));
- obuf->img_alt = 0;
- obuf->in_bold = 0;
- obuf->in_under = 0;
- obuf->prev_ctype = PC_ASCII;
- obuf->tag_sp = 0;
- obuf->fontstat_sp = 0;
- obuf->top_margin = 0;
- obuf->bottom_margin = 0;
- obuf->bp.init_flag = 1;
- set_breakpoint(obuf, 0);
-
- h_env->buf = buf;
- h_env->f = NULL;
- h_env->obuf = obuf;
- h_env->tagbuf = Strnew();
- h_env->limit = limit;
- h_env->maxlimit = 0;
- h_env->envs = envs;
- h_env->nenv = nenv;
- h_env->envc = 0;
- h_env->envc_real = 0;
- h_env->title = NULL;
- h_env->blank_lines = 0;
-}
-
-void
-completeHTMLstream(struct html_feed_environ *h_env, struct readbuffer *obuf)
-{
- close_anchor(h_env, obuf);
- if (obuf->img_alt) {
- push_tag(obuf, "</img_alt>", HTML_N_IMG_ALT);
- obuf->img_alt = NULL;
- }
- if (obuf->in_bold) {
- push_tag(obuf, "</b>", HTML_N_B);
- obuf->in_bold = 0;
- }
- if (obuf->in_under) {
- push_tag(obuf, "</u>", HTML_N_U);
- obuf->in_under = 0;
- }
- if (obuf->flag & RB_INTXTA)
- HTMLlineproc1("</textarea>", h_env);
- /* for unbalanced select tag */
- if (obuf->flag & RB_INSELECT)
- HTMLlineproc1("</select>", h_env);
- if (obuf->flag & RB_TITLE)
- HTMLlineproc1("</title>", h_env);
-
- /* for unbalanced table tag */
- if (obuf->table_level >= MAX_TABLE)
- obuf->table_level = MAX_TABLE - 1;
-
- while (obuf->table_level >= 0) {
- table_mode[obuf->table_level].pre_mode
- &= ~(TBLM_SCRIPT | TBLM_STYLE | TBLM_PLAIN);
- HTMLlineproc1("</table>", h_env);
- }
-}
-
-static void
-print_internal_information(struct html_feed_environ *henv)
-{
- int i;
- Str s;
- TextLineList *tl = newTextLineList();
-
- s = Strnew_charp("<internal>");
- pushTextLine(tl, newTextLine(s, 0));
- if (henv->title) {
- s = Strnew_m_charp("<title_alt title=\"",
- html_quote(henv->title), "\">", NULL);
- pushTextLine(tl, newTextLine(s, 0));
- }
-#if 0
- if (form_max >= 0) {
- FormList *fp;
- for (i = 0; i <= form_max; i++) {
- fp = forms[i];
- s = Sprintf("<form_int fid=\"%d\" action=\"%s\" method=\"%s\"",
- i, html_quote(fp->action->ptr),
- (fp->method == FORM_METHOD_POST) ? "post"
- : ((fp->method ==
- FORM_METHOD_INTERNAL) ? "internal" : "get"));
- if (fp->target)
- Strcat(s, Sprintf(" target=\"%s\"", html_quote(fp->target)));
- if (fp->enctype == FORM_ENCTYPE_MULTIPART)
- Strcat_charp(s, " enctype=\"multipart/form-data\"");
-#ifdef USE_M17N
- if (fp->charset)
- Strcat(s, Sprintf(" accept-charset=\"%s\"",
- html_quote(fp->charset)));
-#endif
- Strcat_charp(s, ">");
- pushTextLine(tl, newTextLine(s, 0));
- }
- }
-#endif
-#ifdef MENU_SELECT
- if (n_select > 0) {
- FormSelectOptionItem *ip;
- for (i = 0; i < n_select; i++) {
- s = Sprintf("<select_int selectnumber=%d>", i);
- pushTextLine(tl, newTextLine(s, 0));
- for (ip = select_option[i].first; ip; ip = ip->next) {
- s = Sprintf("<option_int value=\"%s\" label=\"%s\"%s>",
- html_quote(ip->value ? ip->value->ptr :
- ip->label->ptr),
- html_quote(ip->label->ptr),
- ip->checked ? " selected" : "");
- pushTextLine(tl, newTextLine(s, 0));
- }
- s = Strnew_charp("</select_int>");
- pushTextLine(tl, newTextLine(s, 0));
- }
- }
-#endif /* MENU_SELECT */
- if (n_textarea > 0) {
- for (i = 0; i < n_textarea; i++) {
- s = Sprintf("<textarea_int textareanumber=%d>", i);
- pushTextLine(tl, newTextLine(s, 0));
- s = Strnew_charp(html_quote(textarea_str[i]->ptr));
- Strcat_charp(s, "</textarea_int>");
- pushTextLine(tl, newTextLine(s, 0));
- }
- }
- s = Strnew_charp("</internal>");
- pushTextLine(tl, newTextLine(s, 0));
-
- if (henv->buf)
- appendTextLineList(henv->buf, tl);
- else if (henv->f) {
- TextLineListItem *p;
- for (p = tl->first; p; p = p->next)
- fprintf(henv->f, "%s\n", Str_conv_to_halfdump(p->ptr->line)->ptr);
- }
-}
-
-void
-loadHTMLstream(URLFile *f, Buffer *newBuf, FILE * src, int internal)
-{
- struct environment envs[MAX_ENV_LEVEL];
- clen_t linelen = 0;
- clen_t trbyte = 0;
- Str lineBuf2 = Strnew();
-#ifdef USE_M17N
- wc_ces charset = WC_CES_US_ASCII;
- wc_ces volatile doc_charset = DocumentCharset;
-#endif
- struct html_feed_environ htmlenv1;
- struct readbuffer obuf;
-#ifdef USE_IMAGE
- int volatile image_flag;
-#endif
- MySignalHandler(*volatile prevtrap) (SIGNAL_ARG) = NULL;
-
-#ifdef USE_M17N
- if (fmInitialized && graph_ok()) {
- symbol_width = symbol_width0 = 1;
- }
- else {
- symbol_width0 = 0;
- get_symbol(DisplayCharset, &symbol_width0);
- symbol_width = WcOption.use_wide ? symbol_width0 : 1;
- }
-#else
- symbol_width = symbol_width0 = 1;
-#endif
-
- cur_title = NULL;
- n_textarea = 0;
- cur_textarea = NULL;
- max_textarea = MAX_TEXTAREA;
- textarea_str = New_N(Str, max_textarea);
-#ifdef MENU_SELECT
- n_select = 0;
- max_select = MAX_SELECT;
- select_option = New_N(FormSelectOption, max_select);
-#endif /* MENU_SELECT */
- cur_select = NULL;
- form_sp = -1;
- form_max = -1;
- forms_size = 0;
- forms = NULL;
- cur_hseq = 1;
-#ifdef USE_IMAGE
- cur_iseq = 1;
- if (newBuf->image_flag)
- image_flag = newBuf->image_flag;
- else if (activeImage && displayImage && autoImage)
- image_flag = IMG_FLAG_AUTO;
- else
- image_flag = IMG_FLAG_SKIP;
- if (newBuf->currentURL.file)
- cur_baseURL = baseURL(newBuf);
-#endif
-
- if (w3m_halfload) {
- newBuf->buffername = "---";
-#ifdef USE_M17N
- newBuf->document_charset = InnerCharset;
-#endif
- max_textarea = 0;
-#ifdef MENU_SELECT
- max_select = 0;
-#endif
- HTMLlineproc3(newBuf, f->stream);
- w3m_halfload = FALSE;
- return;
- }
-
- init_henv(&htmlenv1, &obuf, envs, MAX_ENV_LEVEL, NULL, newBuf->width, 0);
-
- if (w3m_halfdump)
- htmlenv1.f = stdout;
- else
- htmlenv1.buf = newTextLineList();
-
- if (SETJMP(AbortLoading) != 0) {
- HTMLlineproc1("<br>Transfer Interrupted!<br>", &htmlenv1);
- goto phase2;
- }
- TRAP_ON;
-
-#ifdef USE_M17N
- if (newBuf != NULL) {
- if (newBuf->bufferprop & BP_FRAME)
- charset = InnerCharset;
- else if (newBuf->document_charset)
- charset = doc_charset = newBuf->document_charset;
- }
- if (content_charset && UseContentCharset)
- doc_charset = content_charset;
- meta_charset = 0;
-#endif
-#if 0
- do_blankline(&htmlenv1, &obuf, 0, 0, htmlenv1.limit);
- obuf.flag = RB_IGNORE_P;
-#endif
- if (IStype(f->stream) != IST_ENCODED)
- f->stream = newEncodedStream(f->stream, f->encoding);
- while ((lineBuf2 = StrmyUFgets(f))->length) {
-#ifdef USE_NNTP
- if (f->scheme == SCM_NEWS && lineBuf2->ptr[0] == '.') {
- Strshrinkfirst(lineBuf2, 1);
- if (lineBuf2->ptr[0] == '\n' || lineBuf2->ptr[0] == '\r' ||
- lineBuf2->ptr[0] == '\0') {
- /*
- * iseos(f->stream) = TRUE;
- */
- break;
- }
- }
-#endif /* USE_NNTP */
- if (src)
- Strfputs(lineBuf2, src);
- linelen += lineBuf2->length;
- if (w3m_dump & DUMP_EXTRA)
- printf("W3m-in-progress: %s?n", convert_size2(linelen, current_content_length, TRUE));
- if (w3m_dump & DUMP_SOURCE)
- continue;
- showProgress(&linelen, &trbyte);
- /*
- * if (frame_source)
- * continue;
- */
-#ifdef USE_M17N
- if (meta_charset) { /* <META> */
- if (content_charset == 0 && UseContentCharset) {
- doc_charset = meta_charset;
- charset = WC_CES_US_ASCII;
- }
- meta_charset = 0;
- }
-#endif
- lineBuf2 = convertLine(f, lineBuf2, HTML_MODE, &charset, doc_charset);
-#if defined(USE_M17N) && defined(USE_IMAGE)
- cur_document_charset = charset;
-#endif
- HTMLlineproc0(lineBuf2->ptr, &htmlenv1, internal);
- }
- if (obuf.status != R_ST_NORMAL) {
- obuf.status = R_ST_EOL;
- HTMLlineproc0("\n", &htmlenv1, internal);
- }
- obuf.status = R_ST_NORMAL;
- completeHTMLstream(&htmlenv1, &obuf);
- flushline(&htmlenv1, &obuf, 0, 2, htmlenv1.limit);
- if (htmlenv1.title)
- newBuf->buffername = htmlenv1.title;
- if (w3m_halfdump) {
- TRAP_OFF;
- print_internal_information(&htmlenv1);
- return;
- }
- if (w3m_backend) {
- TRAP_OFF;
- print_internal_information(&htmlenv1);
- backend_halfdump_buf = htmlenv1.buf;
- return;
- }
- phase2:
- newBuf->trbyte = trbyte + linelen;
- TRAP_OFF;
-#ifdef USE_M17N
- if (!(newBuf->bufferprop & BP_FRAME))
- newBuf->document_charset = charset;
-#endif
-#ifdef USE_IMAGE
- newBuf->image_flag = image_flag;
-#endif
- HTMLlineproc2(newBuf, htmlenv1.buf);
-}
-
-/*
- * loadHTMLString: read string and make new buffer
- */
-Buffer *
-loadHTMLString(Str page)
-{
- URLFile f;
- MySignalHandler(*volatile prevtrap) (SIGNAL_ARG) = NULL;
- Buffer *newBuf;
-
- newBuf = newBuffer(INIT_BUFFER_WIDTH);
- if (SETJMP(AbortLoading) != 0) {
- TRAP_OFF;
- discardBuffer(newBuf);
- return NULL;
- }
- TRAP_ON;
-
- init_stream(&f, SCM_LOCAL, newStrStream(page));
-
-#ifdef USE_M17N
- newBuf->document_charset = InnerCharset;
-#endif
- loadHTMLstream(&f, newBuf, NULL, TRUE);
-#ifdef USE_M17N
- newBuf->document_charset = WC_CES_US_ASCII;
-#endif
-
- TRAP_OFF;
- newBuf->topLine = newBuf->firstLine;
- newBuf->lastLine = newBuf->currentLine;
- newBuf->currentLine = newBuf->firstLine;
- newBuf->type = "text/html";
- newBuf->real_type = newBuf->type;
- if (n_textarea)
- formResetBuffer(newBuf, newBuf->formitem);
- return newBuf;
-}
-
-#ifdef USE_GOPHER
-
-/*
- * loadGopherDir: get gopher directory
- */
-Str
-loadGopherDir(URLFile *uf, ParsedURL *pu, wc_ces * charset)
-{
- Str volatile tmp;
- Str lbuf, name, file, host, port;
- char *volatile p, *volatile q;
- MySignalHandler(*volatile prevtrap) (SIGNAL_ARG) = NULL;
-#ifdef USE_M17N
- wc_ces doc_charset = DocumentCharset;
-#endif
-
- tmp = parsedURL2Str(pu);
- p = html_quote(tmp->ptr);
- tmp =
- convertLine(NULL, Strnew_charp(file_unquote(tmp->ptr)), RAW_MODE,
- charset, doc_charset);
- q = html_quote(tmp->ptr);
- tmp = Strnew_m_charp("<html>\n<head>\n<base href=\"", p, "\">\n<title>", q,
- "</title>\n</head>\n<body>\n<h1>Index of ", q,
- "</h1>\n<table>\n", NULL);
-
- if (SETJMP(AbortLoading) != 0)
- goto gopher_end;
- TRAP_ON;
-
- while (1) {
- if (lbuf = StrUFgets(uf), lbuf->length == 0)
- break;
- if (lbuf->ptr[0] == '.' &&
- (lbuf->ptr[1] == '\n' || lbuf->ptr[1] == '\r'))
- break;
- lbuf = convertLine(uf, lbuf, HTML_MODE, charset, doc_charset);
- p = lbuf->ptr;
- for (q = p; *q && *q != '\t'; q++) ;
- name = Strnew_charp_n(p, q - p);
- if (!*q)
- continue;
- p = q + 1;
- for (q = p; *q && *q != '\t'; q++) ;
- file = Strnew_charp_n(p, q - p);
- if (!*q)
- continue;
- p = q + 1;
- for (q = p; *q && *q != '\t'; q++) ;
- host = Strnew_charp_n(p, q - p);
- if (!*q)
- continue;
- p = q + 1;
- for (q = p; *q && *q != '\t' && *q != '\r' && *q != '\n'; q++) ;
- port = Strnew_charp_n(p, q - p);
-
- switch (name->ptr[0]) {
- case '0':
- p = "[text file]";
- break;
- case '1':
- p = "[directory]";
- break;
- case 'm':
- p = "[message]";
- break;
- case 's':
- p = "[sound]";
- break;
- case 'g':
- p = "[gif]";
- break;
- case 'h':
- p = "[HTML]";
- break;
- default:
- p = "[unsupported]";
- break;
- }
- 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)),
- "\">", p, html_quote(name->ptr + 1), "</a>\n", NULL);
- }
-
- gopher_end:
- TRAP_OFF;
-
- Strcat_charp(tmp, "</table>\n</body>\n</html>\n");
- return tmp;
-}
-#endif /* USE_GOPHER */
-
-/*
- * loadBuffer: read file and make new buffer
- */
-Buffer *
-loadBuffer(URLFile *uf, Buffer *volatile newBuf)
-{
- FILE *volatile src = NULL;
-#ifdef USE_M17N
- wc_ces charset = WC_CES_US_ASCII;
- wc_ces volatile doc_charset = DocumentCharset;
-#endif
- Str lineBuf2;
- volatile char pre_lbuf = '\0';
- int nlines;
- Str tmpf;
- clen_t linelen = 0, trbyte = 0;
- Lineprop *propBuffer = NULL;
-#ifdef USE_ANSI_COLOR
- Linecolor *colorBuffer = NULL;
-#endif
- MySignalHandler(*volatile prevtrap) (SIGNAL_ARG) = NULL;
-
- if (newBuf == NULL)
- newBuf = newBuffer(INIT_BUFFER_WIDTH);
- lineBuf2 = Strnew();
-
- if (SETJMP(AbortLoading) != 0) {
- goto _end;
- }
- TRAP_ON;
-
- if (newBuf->sourcefile == NULL &&
- (uf->scheme != SCM_LOCAL || newBuf->mailcap)) {
- tmpf = tmpfname(TMPF_SRC, NULL);
- src = fopen(tmpf->ptr, "w");
- if (src)
- newBuf->sourcefile = tmpf->ptr;
- }
-#ifdef USE_M17N
- if (newBuf->document_charset)
- charset = doc_charset = newBuf->document_charset;
- if (content_charset && UseContentCharset)
- doc_charset = content_charset;
-#endif
-
- nlines = 0;
- if (IStype(uf->stream) != IST_ENCODED)
- uf->stream = newEncodedStream(uf->stream, uf->encoding);
- while ((lineBuf2 = StrmyISgets(uf->stream))->length) {
-#ifdef USE_NNTP
- if (uf->scheme == SCM_NEWS && lineBuf2->ptr[0] == '.') {
- Strshrinkfirst(lineBuf2, 1);
- if (lineBuf2->ptr[0] == '\n' || lineBuf2->ptr[0] == '\r' ||
- lineBuf2->ptr[0] == '\0') {
- /*
- * iseos(uf->stream) = TRUE;
- */
- break;
- }
- }
-#endif /* USE_NNTP */
- if (src)
- Strfputs(lineBuf2, src);
- linelen += lineBuf2->length;
- if (w3m_dump & DUMP_SOURCE)
- continue;
- showProgress(&linelen, &trbyte);
- if (frame_source)
- continue;
- lineBuf2 =
- convertLine(uf, lineBuf2, PAGER_MODE, &charset, doc_charset);
- if (squeezeBlankLine) {
- if (lineBuf2->ptr[0] == '\n' && pre_lbuf == '\n') {
- ++nlines;
- continue;
- }
- pre_lbuf = lineBuf2->ptr[0];
- }
- ++nlines;
- Strchop(lineBuf2);
- lineBuf2 = checkType(lineBuf2, &propBuffer, NULL);
- addnewline(newBuf, lineBuf2->ptr, propBuffer, colorBuffer,
- lineBuf2->length, FOLD_BUFFER_WIDTH, nlines);
- }
- _end:
- TRAP_OFF;
- newBuf->topLine = newBuf->firstLine;
- newBuf->lastLine = newBuf->currentLine;
- newBuf->currentLine = newBuf->firstLine;
- newBuf->trbyte = trbyte + linelen;
-#ifdef USE_M17N
- newBuf->document_charset = charset;
-#endif
- if (src)
- fclose(src);
-
- return newBuf;
-}
-
-#ifdef USE_IMAGE
-Buffer *
-loadImageBuffer(URLFile *uf, Buffer *newBuf)
-{
- Image image;
- ImageCache *cache;
- Str tmp, tmpf;
- FILE *src = NULL;
- URLFile f;
- MySignalHandler(*volatile prevtrap) (SIGNAL_ARG) = NULL;
- struct stat st;
-
- loadImage(newBuf, IMG_FLAG_STOP);
- image.url = uf->url;
- image.ext = uf->ext;
- 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 &&
- !stat(cache->file, &st))
- goto image_buffer;
-
- TRAP_ON;
- if (IStype(uf->stream) != IST_ENCODED)
- uf->stream = newEncodedStream(uf->stream, uf->encoding);
- if (save2tmp(*uf, cache->file) < 0) {
- UFclose(uf);
- TRAP_OFF;
- return NULL;
- }
- UFclose(uf);
- TRAP_OFF;
-
- cache->loaded = IMG_FLAG_LOADED;
- cache->index = 0;
-
- image_buffer:
- if (newBuf == NULL)
- newBuf = newBuffer(INIT_BUFFER_WIDTH);
- cache->loaded |= IMG_FLAG_DONT_REMOVE;
- if (newBuf->sourcefile == NULL && uf->scheme != SCM_LOCAL)
- newBuf->sourcefile = cache->file;
-
- tmp = Sprintf("<img src=\"%s\"><br><br>", html_quote(image.url));
- tmpf = tmpfname(TMPF_SRC, ".html");
- src = fopen(tmpf->ptr, "w");
- newBuf->mailcap_source = tmpf->ptr;
-
- init_stream(&f, SCM_LOCAL, newStrStream(tmp));
- loadHTMLstream(&f, newBuf, src, TRUE);
- if (src)
- fclose(src);
-
- newBuf->topLine = newBuf->firstLine;
- newBuf->lastLine = newBuf->currentLine;
- newBuf->currentLine = newBuf->firstLine;
- newBuf->image_flag = IMG_FLAG_AUTO;
- return newBuf;
-}
-#endif
-
-static Str
-conv_symbol(Line *l)
-{
- Str tmp = NULL;
- char *p = l->lineBuf, *ep = p + l->len;
- Lineprop *pr = l->propBuf;
-#ifdef USE_M17N
- int w;
- char **symbol = NULL;
-#else
- char **symbol = get_symbol();
-#endif
-
- for (; p < ep; p++, pr++) {
- if (*pr & PC_SYMBOL) {
-#ifdef USE_M17N
- char c = ((char)wtf_get_code((wc_uchar *) p) & 0x7f) - SYMBOL_BASE;
- int len = get_mclen(p);
-#else
- char c = *p - SYMBOL_BASE;
-#endif
- if (tmp == NULL) {
- tmp = Strnew_size(l->len);
- Strcopy_charp_n(tmp, l->lineBuf, p - l->lineBuf);
-#ifdef USE_M17N
- w = (*pr & PC_KANJI) ? 2 : 1;
- symbol = get_symbol(DisplayCharset, &w);
-#endif
- }
- Strcat_charp(tmp, symbol[(int)c]);
-#ifdef USE_M17N
- p += len - 1;
- pr += len - 1;
-#endif
- }
- else if (tmp != NULL)
- Strcat_char(tmp, *p);
- }
- if (tmp)
- return tmp;
- else
- return Strnew_charp_n(l->lineBuf, l->len);
-}
-
-/*
- * saveBuffer: write buffer to file
- */
-static void
-_saveBuffer(Buffer *buf, Line *l, FILE * f, int cont)
-{
- Str tmp;
- int is_html = FALSE;
-#ifdef USE_M17N
- int set_charset = !DisplayCharset;
- wc_ces charset = DisplayCharset ? DisplayCharset : WC_CES_US_ASCII;
-#endif
-
- if (buf->type && !strcasecmp(buf->type, "text/html"))
- is_html = TRUE;
-
- pager_next:
- for (; l != NULL; l = l->next) {
- if (is_html)
- tmp = conv_symbol(l);
- else
- tmp = Strnew_charp_n(l->lineBuf, l->len);
- tmp = wc_Str_conv(tmp, InnerCharset, charset);
- Strfputs(tmp, f);
- if (Strlastchar(tmp) != '\n' && !(cont && l->next && l->next->bpos))
- putc('\n', f);
- }
- if (buf->pagerSource && !(buf->bufferprop & BP_CLOSE)) {
- l = getNextPage(buf, PagerMax);
-#ifdef USE_M17N
- if (set_charset)
- charset = buf->document_charset;
-#endif
- goto pager_next;
- }
-}
-
-void
-saveBuffer(Buffer *buf, FILE * f, int cont)
-{
- _saveBuffer(buf, buf->firstLine, f, cont);
-}
-
-void
-saveBufferBody(Buffer *buf, FILE * f, int cont)
-{
- Line *l = buf->firstLine;
-
- while (l != NULL && l->real_linenumber == 0)
- l = l->next;
- _saveBuffer(buf, l, f, cont);
-}
-
-static Buffer *
-loadcmdout(char *cmd,
- Buffer *(*loadproc) (URLFile *, Buffer *), Buffer *defaultbuf)
-{
- FILE *f, *popen(const char *, const char *);
- Buffer *buf;
- URLFile uf;
-
- if (cmd == NULL || *cmd == '\0')
- return NULL;
- f = popen(cmd, "r");
- if (f == NULL)
- return NULL;
- init_stream(&uf, SCM_UNKNOWN, newFileStream(f, (void (*)())pclose));
- buf = loadproc(&uf, defaultbuf);
- UFclose(&uf);
- return buf;
-}
-
-/*
- * getshell: execute shell command and get the result into a buffer
- */
-Buffer *
-getshell(char *cmd)
-{
- Buffer *buf;
-
- buf = loadcmdout(cmd, loadBuffer, NULL);
- if (buf == NULL)
- return NULL;
- buf->filename = cmd;
- buf->buffername = Sprintf("%s %s", SHELLBUFFERNAME,
- conv_from_system(cmd))->ptr;
- return buf;
-}
-
-/*
- * getpipe: execute shell command and connect pipe to the buffer
- */
-Buffer *
-getpipe(char *cmd)
-{
- FILE *f, *popen(const char *, const char *);
- Buffer *buf;
-
- if (cmd == NULL || *cmd == '\0')
- return NULL;
- f = popen(cmd, "r");
- if (f == NULL)
- return NULL;
- buf = newBuffer(INIT_BUFFER_WIDTH);
- buf->pagerSource = newFileStream(f, (void (*)())pclose);
- buf->filename = cmd;
- buf->buffername = Sprintf("%s %s", PIPEBUFFERNAME,
- conv_from_system(cmd))->ptr;
- buf->bufferprop |= BP_PIPE;
-#ifdef USE_M17N
- buf->document_charset = WC_CES_US_ASCII;
-#endif
- return buf;
-}
-
-/*
- * Open pager buffer
- */
-Buffer *
-openPagerBuffer(InputStream stream, Buffer *buf)
-{
-
- if (buf == NULL)
- buf = newBuffer(INIT_BUFFER_WIDTH);
- buf->pagerSource = stream;
- buf->buffername = getenv("MAN_PN");
- if (buf->buffername == NULL)
- buf->buffername = PIPEBUFFERNAME;
- else
- buf->buffername = conv_from_system(buf->buffername);
- buf->bufferprop |= BP_PIPE;
-#ifdef USE_M17N
- if (content_charset && UseContentCharset)
- buf->document_charset = content_charset;
- else
- buf->document_charset = WC_CES_US_ASCII;
-#endif
- buf->currentLine = buf->firstLine;
-
- return buf;
-}
-
-Buffer *
-openGeneralPagerBuffer(InputStream stream)
-{
- Buffer *buf;
- char *t = "text/plain";
- Buffer *t_buf = NULL;
- URLFile uf;
-
- init_stream(&uf, SCM_UNKNOWN, stream);
-
-#ifdef USE_M17N
- content_charset = 0;
-#endif
- if (SearchHeader) {
- t_buf = newBuffer(INIT_BUFFER_WIDTH);
- readHeader(&uf, t_buf, TRUE, NULL);
- t = checkContentType(t_buf);
- if (t == NULL)
- t = "text/plain";
- if (t_buf) {
- t_buf->topLine = t_buf->firstLine;
- t_buf->currentLine = t_buf->lastLine;
- }
- SearchHeader = FALSE;
- }
- else if (DefaultType) {
- t = DefaultType;
- DefaultType = NULL;
- }
- if (!strcasecmp(t, "text/html")) {
- buf = loadHTMLBuffer(&uf, t_buf);
- buf->type = "text/html";
- }
- else if (is_plain_text_type(t)) {
- if (IStype(stream) != IST_ENCODED)
- stream = newEncodedStream(stream, uf.encoding);
- buf = openPagerBuffer(stream, t_buf);
- buf->type = "text/plain";
- }
-#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)) {
- UFclose(&uf);
- if (buf == NULL || buf == NO_BUFFER)
- return buf;
- }
- else { /* unknown type is regarded as text/plain */
- if (IStype(stream) != IST_ENCODED)
- stream = newEncodedStream(stream, uf.encoding);
- buf = openPagerBuffer(stream, t_buf);
- buf->type = "text/plain";
- }
- }
- buf->real_type = t;
- buf->currentURL.scheme = SCM_LOCAL;
- buf->currentURL.file = "-";
- return buf;
-}
-
-Line *
-getNextPage(Buffer *buf, int plen)
-{
- Line *volatile top = buf->topLine, *volatile last = buf->lastLine,
- *volatile cur = buf->currentLine;
- int i;
- int volatile nlines = 0;
- clen_t linelen = 0, trbyte = buf->trbyte;
- Str lineBuf2;
- char volatile pre_lbuf = '\0';
- URLFile uf;
-#ifdef USE_M17N
- wc_ces charset;
- wc_ces volatile doc_charset = DocumentCharset;
- wc_uint8 old_auto_detect = WcOption.auto_detect;
-#endif
- int volatile squeeze_flag = FALSE;
- Lineprop *propBuffer = NULL;
-
-#ifdef USE_ANSI_COLOR
- Linecolor *colorBuffer = NULL;
-#endif
- MySignalHandler(*volatile prevtrap) (SIGNAL_ARG) = NULL;
-
- if (buf->pagerSource == NULL)
- return NULL;
-
- if (last != NULL) {
- nlines = last->real_linenumber;
- pre_lbuf = *(last->lineBuf);
- if (pre_lbuf == '\0')
- pre_lbuf = '\n';
- buf->currentLine = last;
- }
-
-#ifdef USE_M17N
- charset = buf->document_charset;
- if (buf->document_charset != WC_CES_US_ASCII)
- doc_charset = buf->document_charset;
- else if (UseContentCharset) {
- content_charset = 0;
- checkContentType(buf);
- if (content_charset)
- doc_charset = content_charset;
- }
- WcOption.auto_detect = buf->auto_detect;
-#endif
-
- if (SETJMP(AbortLoading) != 0) {
- goto pager_end;
- }
- TRAP_ON;
-
- init_stream(&uf, SCM_UNKNOWN, NULL);
- for (i = 0; i < plen; i++) {
- lineBuf2 = StrmyISgets(buf->pagerSource);
- if (lineBuf2->length == 0) {
- /* Assume that `cmd == buf->filename' */
- if (buf->filename)
- buf->buffername = Sprintf("%s %s",
- CPIPEBUFFERNAME,
- conv_from_system(buf->filename))->
- ptr;
- else if (getenv("MAN_PN") == NULL)
- buf->buffername = CPIPEBUFFERNAME;
- buf->bufferprop |= BP_CLOSE;
- break;
- }
- linelen += lineBuf2->length;
- showProgress(&linelen, &trbyte);
- lineBuf2 =
- convertLine(&uf, lineBuf2, PAGER_MODE, &charset, doc_charset);
- if (squeezeBlankLine) {
- squeeze_flag = FALSE;
- if (lineBuf2->ptr[0] == '\n' && pre_lbuf == '\n') {
- ++nlines;
- --i;
- squeeze_flag = TRUE;
- continue;
- }
- pre_lbuf = lineBuf2->ptr[0];
- }
- ++nlines;
- Strchop(lineBuf2);
- lineBuf2 = checkType(lineBuf2, &propBuffer, &colorBuffer);
- addnewline(buf, lineBuf2->ptr, propBuffer, colorBuffer,
- lineBuf2->length, FOLD_BUFFER_WIDTH, nlines);
- if (!top) {
- top = buf->firstLine;
- cur = top;
- }
- if (buf->lastLine->real_linenumber - buf->firstLine->real_linenumber
- >= PagerMax) {
- Line *l = buf->firstLine;
- do {
- if (top == l)
- top = l->next;
- if (cur == l)
- cur = l->next;
- if (last == l)
- last = NULL;
- l = l->next;
- } while (l && l->bpos);
- buf->firstLine = l;
- buf->firstLine->prev = NULL;
- }
- }
- pager_end:
- TRAP_OFF;
-
- buf->trbyte = trbyte + linelen;
-#ifdef USE_M17N
- buf->document_charset = charset;
- WcOption.auto_detect = old_auto_detect;
-#endif
- buf->topLine = top;
- buf->currentLine = cur;
- if (!last)
- last = buf->firstLine;
- else if (last && (last->next || !squeeze_flag))
- last = last->next;
- return last;
-}
-
-int
-save2tmp(URLFile uf, char *tmpf)
-{
- FILE *ff;
- int check;
- clen_t linelen = 0, trbyte = 0;
- MySignalHandler(*volatile prevtrap) (SIGNAL_ARG) = NULL;
- static JMP_BUF env_bak;
-
- ff = fopen(tmpf, "wb");
- if (ff == NULL) {
- /* fclose(f); */
- return -1;
- }
- bcopy(AbortLoading, env_bak, sizeof(JMP_BUF));
- if (SETJMP(AbortLoading) != 0) {
- goto _end;
- }
- TRAP_ON;
- check = 0;
-#ifdef USE_NNTP
- if (uf.scheme == SCM_NEWS) {
- char c;
- while (c = UFgetc(&uf), !iseos(uf.stream)) {
- if (c == '\n') {
- if (check == 0)
- check++;
- else if (check == 3)
- break;
- }
- else if (c == '.' && check == 1)
- check++;
- else if (c == '\r' && check == 2)
- check++;
- else
- check = 0;
- putc(c, ff);
- linelen += sizeof(c);
- showProgress(&linelen, &trbyte);
- }
- }
- else
-#endif /* USE_NNTP */
- {
- Str buf = Strnew_size(SAVE_BUF_SIZE);
- while (UFread(&uf, buf, SAVE_BUF_SIZE)) {
- Strfputs(buf, ff);
- linelen += buf->length;
- showProgress(&linelen, &trbyte);
- }
- }
- _end:
- bcopy(env_bak, AbortLoading, sizeof(JMP_BUF));
- TRAP_OFF;
- fclose(ff);
- current_content_length = 0;
- return 0;
-}
-
-int
-doExternal(URLFile uf, char *path, char *type, Buffer **bufp,
- Buffer *defaultbuf)
-{
- Str tmpf, command;
- struct mailcap *mcap;
- int mc_stat;
- Buffer *buf = NULL;
- char *header, *src = NULL, *ext = uf.ext;
-
- if (!(mcap = searchExtViewer(type)))
- return 0;
-
- if (mcap->nametemplate) {
- tmpf = unquote_mailcap(mcap->nametemplate, NULL, "", NULL, NULL);
- if (tmpf->ptr[0] == '.')
- ext = tmpf->ptr;
- }
- tmpf = tmpfname(TMPF_DFL, (ext && *ext) ? ext : NULL);
-
- if (IStype(uf.stream) != IST_ENCODED)
- uf.stream = newEncodedStream(uf.stream, uf.encoding);
- header = checkHeader(defaultbuf, "Content-Type:");
- if (header)
- header = conv_to_system(header);
- command = unquote_mailcap(mcap->viewer, type, tmpf->ptr, header, &mc_stat);
-#ifndef __EMX__
- if (!(mc_stat & MCSTAT_REPNAME)) {
- Str tmp = Sprintf("(%s) < %s", command->ptr, shell_quote(tmpf->ptr));
- command = tmp;
- }
-#endif
-
-#ifdef HAVE_SETPGRP
- if (!(mcap->flags & (MAILCAP_HTMLOUTPUT | MAILCAP_COPIOUSOUTPUT)) &&
- !(mcap->flags & MAILCAP_NEEDSTERMINAL) && BackgroundExtViewer) {
- flush_tty();
- if (!fork()) {
- setup_child(FALSE, 0, UFfileno(&uf));
- if (save2tmp(uf, tmpf->ptr) < 0)
- exit(1);
- UFclose(&uf);
- myExec(command->ptr);
- }
- *bufp = NO_BUFFER;
- return 1;
- }
- else
-#endif
- {
- if (save2tmp(uf, tmpf->ptr) < 0) {
- *bufp = NULL;
- return 1;
- }
- }
- if (mcap->flags & (MAILCAP_HTMLOUTPUT | MAILCAP_COPIOUSOUTPUT)) {
- if (defaultbuf == NULL)
- defaultbuf = newBuffer(INIT_BUFFER_WIDTH);
- if (defaultbuf->sourcefile)
- src = defaultbuf->sourcefile;
- else
- src = tmpf->ptr;
- defaultbuf->sourcefile = NULL;
- defaultbuf->mailcap = mcap;
- }
- if (mcap->flags & MAILCAP_HTMLOUTPUT) {
- buf = loadcmdout(command->ptr, loadHTMLBuffer, defaultbuf);
- if (buf && buf != NO_BUFFER) {
- buf->type = "text/html";
- buf->mailcap_source = buf->sourcefile;
- buf->sourcefile = src;
- }
- }
- else if (mcap->flags & MAILCAP_COPIOUSOUTPUT) {
- buf = loadcmdout(command->ptr, loadBuffer, defaultbuf);
- if (buf && buf != NO_BUFFER) {
- buf->type = "text/plain";
- buf->mailcap_source = buf->sourcefile;
- buf->sourcefile = src;
- }
- }
- else {
- if (mcap->flags & MAILCAP_NEEDSTERMINAL || !BackgroundExtViewer) {
- fmTerm();
- mySystem(command->ptr, 0);
- fmInit();
- if (CurrentTab && Currentbuf)
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
- }
- else {
- mySystem(command->ptr, 1);
- }
- 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));
- buf->edit = mcap->edit;
- buf->mailcap = mcap;
- }
- *bufp = buf;
- return 1;
-}
-
-static int
-_MoveFile(char *path1, char *path2)
-{
- InputStream f1;
- FILE *f2;
- int is_pipe;
- clen_t linelen = 0, trbyte = 0;
- Str buf;
-
- f1 = openIS(path1);
- if (f1 == NULL)
- return -1;
- if (*path2 == '|' && PermitSaveToPipe) {
- is_pipe = TRUE;
- f2 = popen(path2 + 1, "w");
- }
- else {
- is_pipe = FALSE;
- f2 = fopen(path2, "wb");
- }
- if (f2 == NULL) {
- ISclose(f1);
- 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;
- showProgress(&linelen, &trbyte);
- }
- ISclose(f1);
- if (is_pipe)
- pclose(f2);
- else
- fclose(f2);
- return 0;
-}
-
-int
-_doFileCopy(char *tmpf, char *defstr, int download)
-{
- Str msg;
- Str filen;
- char *p, *q = NULL;
- pid_t pid;
- char *lock;
-#if !(defined(HAVE_SYMLINK) && defined(HAVE_LSTAT))
- FILE *f;
-#endif
- struct stat st;
- clen_t size = 0;
- int is_pipe = FALSE;
-
- if (fmInitialized) {
- p = searchKeyData();
- if (p == NULL || *p == '\0') {
- /* FIXME: gettextize? */
- q = inputLineHist("(Download)Save file to: ",
- defstr, IN_COMMAND, SaveHist);
- if (q == NULL || *q == '\0')
- return FALSE;
- p = conv_to_system(q);
- }
- if (*p == '|' && PermitSaveToPipe)
- is_pipe = TRUE;
- else {
- if (q) {
- p = unescape_spaces(Strnew_charp(q))->ptr;
- p = conv_to_system(q);
- }
- p = expandPath(p);
- if (checkOverWrite(p) < 0)
- return -1;
- }
- if (checkCopyFile(tmpf, p) < 0) {
- /* FIXME: gettextize? */
- msg = Sprintf("Can't copy. %s and %s are identical.",
- conv_from_system(tmpf), conv_from_system(p));
- disp_err_message(msg->ptr, FALSE);
- return -1;
- }
- if (!download) {
- if (_MoveFile(tmpf, p) < 0) {
- /* FIXME: gettextize? */
- msg = Sprintf("Can't save to %s", conv_from_system(p));
- disp_err_message(msg->ptr, FALSE);
- }
- return -1;
- }
- lock = tmpfname(TMPF_DFL, ".lock")->ptr;
-#if defined(HAVE_SYMLINK) && defined(HAVE_LSTAT)
- symlink(p, lock);
-#else
- f = fopen(lock, "w");
- if (f)
- fclose(f);
-#endif
- flush_tty();
- pid = fork();
- if (!pid) {
- setup_child(FALSE, 0, -1);
- if (!_MoveFile(tmpf, p) && PreserveTimestamp && !is_pipe &&
- !stat(tmpf, &st))
- setModtime(p, st.st_mtime);
- unlink(lock);
- exit(0);
- }
- if (!stat(tmpf, &st))
- size = st.st_size;
- addDownloadList(pid, conv_from_system(tmpf), p, lock, size);
- }
- else {
- q = searchKeyData();
- if (q == NULL || *q == '\0') {
- /* FIXME: gettextize? */
- printf("(Download)Save file to: ");
- fflush(stdout);
- filen = Strfgets(stdin);
- if (filen->length == 0)
- return -1;
- q = filen->ptr;
- }
- for (p = q + strlen(q) - 1; IS_SPACE(*p); p--) ;
- *(p + 1) = '\0';
- if (*q == '\0')
- return -1;
- p = q;
- if (*p == '|' && PermitSaveToPipe)
- is_pipe = TRUE;
- else {
- p = expandPath(p);
- if (checkOverWrite(p) < 0)
- return -1;
- }
- if (checkCopyFile(tmpf, p) < 0) {
- /* FIXME: gettextize? */
- printf("Can't copy. %s and %s are identical.", tmpf, p);
- return -1;
- }
- if (_MoveFile(tmpf, p) < 0) {
- /* FIXME: gettextize? */
- printf("Can't save to %s\n", p);
- return -1;
- }
- if (PreserveTimestamp && !is_pipe && !stat(tmpf, &st))
- setModtime(p, st.st_mtime);
- }
- return 0;
-}
-
-int
-doFileMove(char *tmpf, char *defstr)
-{
- int ret = doFileCopy(tmpf, defstr);
- unlink(tmpf);
- return ret;
-}
-
-int
-doFileSave(URLFile uf, char *defstr)
-{
- Str msg;
- Str filen;
- char *p, *q;
- pid_t pid;
- char *lock;
- char *tmpf = NULL;
-#if !(defined(HAVE_SYMLINK) && defined(HAVE_LSTAT))
- FILE *f;
-#endif
-
- if (fmInitialized) {
- p = searchKeyData();
- if (p == NULL || *p == '\0') {
- /* FIXME: gettextize? */
- p = inputLineHist("(Download)Save file to: ",
- defstr, IN_FILENAME, SaveHist);
- if (p == NULL || *p == '\0')
- return -1;
- p = conv_to_system(p);
- }
- if (checkOverWrite(p) < 0)
- return -1;
- if (checkSaveFile(uf.stream, p) < 0) {
- /* FIXME: gettextize? */
- msg = Sprintf("Can't save. Load file and %s are identical.",
- conv_from_system(p));
- disp_err_message(msg->ptr, FALSE);
- return -1;
- }
- /*
- * if (save2tmp(uf, p) < 0) {
- * msg = Sprintf("Can't save to %s", conv_from_system(p));
- * disp_err_message(msg->ptr, FALSE);
- * }
- */
- lock = tmpfname(TMPF_DFL, ".lock")->ptr;
-#if defined(HAVE_SYMLINK) && defined(HAVE_LSTAT)
- symlink(p, lock);
-#else
- f = fopen(lock, "w");
- if (f)
- fclose(f);
-#endif
- flush_tty();
- pid = fork();
- if (!pid) {
- if (uf.content_encoding != CMP_NOCOMPRESS) {
- uncompress_stream(&uf, &tmpf);
- if (tmpf)
- unlink(tmpf);
- }
- setup_child(FALSE, 0, UFfileno(&uf));
- if (!save2tmp(uf, p) && PreserveTimestamp && uf.modtime != -1)
- setModtime(p, uf.modtime);
- UFclose(&uf);
- unlink(lock);
- exit(0);
- }
- addDownloadList(pid, uf.url, p, lock, current_content_length);
- }
- else {
- q = searchKeyData();
- if (q == NULL || *q == '\0') {
- /* FIXME: gettextize? */
- printf("(Download)Save file to: ");
- fflush(stdout);
- filen = Strfgets(stdin);
- if (filen->length == 0)
- return -1;
- q = filen->ptr;
- }
- for (p = q + strlen(q) - 1; IS_SPACE(*p); p--) ;
- *(p + 1) = '\0';
- if (*q == '\0')
- return -1;
- p = expandPath(q);
- if (checkOverWrite(p) < 0)
- return -1;
- if (checkSaveFile(uf.stream, p) < 0) {
- /* FIXME: gettextize? */
- printf("Can't save. Load file and %s are identical.", p);
- return -1;
- }
- if (uf.content_encoding != CMP_NOCOMPRESS) {
- uncompress_stream(&uf, &tmpf);
- if (tmpf)
- unlink(tmpf);
- }
- if (save2tmp(uf, p) < 0) {
- /* FIXME: gettextize? */
- printf("Can't save to %s\n", p);
- return -1;
- }
- if (PreserveTimestamp && uf.modtime != -1)
- setModtime(p, uf.modtime);
- }
- return 0;
-}
-
-int
-checkCopyFile(char *path1, char *path2)
-{
- struct stat st1, st2;
-
- if (*path2 == '|' && PermitSaveToPipe)
- return 0;
- if ((stat(path1, &st1) == 0) && (stat(path2, &st2) == 0))
- if (st1.st_ino == st2.st_ino)
- return -1;
- return 0;
-}
-
-int
-checkSaveFile(InputStream stream, char *path2)
-{
- struct stat st1, st2;
- int des = ISfileno(stream);
-
- if (des < 0)
- return 0;
- if (*path2 == '|' && PermitSaveToPipe)
- return 0;
- if ((fstat(des, &st1) == 0) && (stat(path2, &st2) == 0))
- if (st1.st_ino == st2.st_ino)
- return -1;
- return 0;
-}
-
-int
-checkOverWrite(char *path)
-{
- struct stat st;
- char *ans;
-
- if (stat(path, &st) < 0)
- return 0;
- /* FIXME: gettextize? */
- ans = inputAnswer("File exists. Overwrite? (y/n)");
- if (ans && TOLOWER(*ans) == 'y')
- return 0;
- else
- return -1;
-}
-
-char *
-inputAnswer(char *prompt)
-{
- char *ans;
-
- if (QuietMessage)
- return "n";
- if (fmInitialized) {
- term_raw();
- ans = inputChar(prompt);
- }
- else {
- printf(prompt);
- fflush(stdout);
- ans = Strfgets(stdin)->ptr;
- }
- return ans;
-}
-
-static void
-uncompress_stream(URLFile *uf, char **src)
-{
- pid_t pid1;
- FILE *f1;
- char *expand_cmd = GUNZIP_CMDNAME;
- char *expand_name = GUNZIP_NAME;
- char *tmpf = NULL;
- char *ext = NULL;
- struct compression_decoder *d;
-
- if (IStype(uf->stream) != IST_ENCODED) {
- uf->stream = newEncodedStream(uf->stream, uf->encoding);
- uf->encoding = ENC_7BIT;
- }
- for (d = compression_decoders; d->type != CMP_NOCOMPRESS; d++) {
- if (uf->compression == d->type) {
- if (d->auxbin_p)
- expand_cmd = auxbinFile(d->cmd);
- else
- expand_cmd = d->cmd;
- expand_name = d->name;
- ext = d->ext;
- break;
- }
- }
- uf->compression = CMP_NOCOMPRESS;
-
- if (uf->scheme != SCM_LOCAL
-#ifdef USE_IMAGE
- && !image_source
-#endif
- ) {
- tmpf = tmpfname(TMPF_DFL, ext)->ptr;
- }
-
- /* child1 -- stdout|f1=uf -> parent */
- pid1 = open_pipe_rw(&f1, NULL);
- if (pid1 < 0) {
- UFclose(uf);
- return;
- }
- if (pid1 == 0) {
- /* child */
- pid_t pid2;
- FILE *f2 = stdin;
-
- /* uf -> child2 -- stdout|stdin -> child1 */
- pid2 = open_pipe_rw(&f2, NULL);
- if (pid2 < 0) {
- UFclose(uf);
- exit(1);
- }
- if (pid2 == 0) {
- /* child2 */
- Str buf = Strnew_size(SAVE_BUF_SIZE);
- 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)
- break;
- if (f)
- Strfputs(buf, f);
- }
- UFclose(uf);
- if (f)
- fclose(f);
- exit(0);
- }
- /* child1 */
- dup2(1, 2); /* stderr>&stdout */
- setup_child(TRUE, -1, -1);
- execlp(expand_cmd, expand_name, NULL);
- exit(1);
- }
- if (tmpf) {
- if (src)
- *src = tmpf;
- else
- uf->scheme = SCM_LOCAL;
- }
- UFhalfclose(uf);
- uf->stream = newFileStream(f1, (void (*)())fclose);
-}
-
-static FILE *
-lessopen_stream(char *path)
-{
- char *lessopen;
- FILE *fp;
-
- lessopen = getenv("LESSOPEN");
- if (lessopen == NULL) {
- return NULL;
- }
- if (lessopen[0] == '\0') {
- return NULL;
- }
-
- if (lessopen[0] == '|') {
- /* pipe mode */
- Str tmpf;
- int c;
-
- ++lessopen;
- tmpf = Sprintf(lessopen, shell_quote(path));
- fp = popen(tmpf->ptr, "r");
- if (fp == NULL) {
- return NULL;
- }
- c = getc(fp);
- if (c == EOF) {
- fclose(fp);
- return NULL;
- }
- ungetc(c, fp);
- }
- else {
- /* filename mode */
- /* not supported m(__)m */
- fp = NULL;
- }
- return fp;
-}
-
-#if 0
-void
-reloadBuffer(Buffer *buf)
-{
- URLFile uf;
-
- if (buf->sourcefile == NULL || buf->pagerSource != NULL)
- return;
- init_stream(&uf, SCM_UNKNOWN, NULL);
- examineFile(buf->mailcap_source ? buf->mailcap_source : buf->sourcefile,
- &uf);
- if (uf.stream == NULL)
- return;
- is_redisplay = TRUE;
- buf->allLine = 0;
- buf->href = NULL;
- buf->name = NULL;
- buf->img = NULL;
- buf->formitem = NULL;
- buf->linklist = NULL;
- buf->maplist = NULL;
- if (buf->hmarklist)
- buf->hmarklist->nmark = 0;
- if (buf->imarklist)
- buf->imarklist->nmark = 0;
- if (!strcasecmp(buf->type, "text/html"))
- loadHTMLBuffer(&uf, buf);
- else
- loadBuffer(&uf, buf);
- UFclose(&uf);
- is_redisplay = FALSE;
-}
-#endif
-
-static char *
-guess_filename(char *file)
-{
- char *p = NULL, *s;
-
- if (file != NULL)
- p = mybasename(file);
- if (p == NULL || *p == '\0')
- return DEF_SAVE_FILE;
- s = p;
- if (*p == '#')
- p++;
- while (*p != '\0') {
- if ((*p == '#' && *(p + 1) != '\0') || *p == '?') {
- *p = '\0';
- break;
- }
- p++;
- }
- return s;
-}
-
-char *
-guess_save_name(Buffer *buf, char *path)
-{
- if (buf && buf->document_header) {
- Str name = NULL;
- char *p, *q;
- if ((p = checkHeader(buf, "Content-Disposition:")) != NULL &&
- (q = strcasestr(p, "filename")) != NULL &&
- (q == p || IS_SPACE(*(q - 1)) || *(q - 1) == ';') &&
- matchattr(q, "filename", 8, &name))
- path = name->ptr;
- else if ((p = checkHeader(buf, "Content-Type:")) != NULL &&
- (q = strcasestr(p, "name")) != NULL &&
- (q == p || IS_SPACE(*(q - 1)) || *(q - 1) == ';') &&
- matchattr(q, "name", 4, &name))
- path = name->ptr;
- }
- return guess_filename(path);
-}
-
-/* Local Variables: */
-/* c-basic-offset: 4 */
-/* tab-width: 8 */
-/* End: */
diff --git a/.#main.c.1.253 b/.#main.c.1.253
deleted file mode 100644
index 9a4c755..0000000
--- a/.#main.c.1.253
+++ /dev/null
@@ -1,6600 +0,0 @@
-/* $Id: main.c,v 1.253 2006/12/10 10:49:23 inu Exp $ */
-#define MAINPROGRAM
-#include "fm.h"
-#include <signal.h>
-#include <setjmp.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <fcntl.h>
-#if defined(HAVE_WAITPID) || defined(HAVE_WAIT3)
-#include <sys/wait.h>
-#endif
-#include <time.h>
-#include "terms.h"
-#include "myctype.h"
-#include "regex.h"
-#ifdef USE_MOUSE
-#ifdef USE_GPM
-#include <gpm.h>
-#endif /* USE_GPM */
-#if defined(USE_GPM) || defined(USE_SYSMOUSE)
-extern int do_getch();
-#define getch() do_getch()
-#endif /* defined(USE_GPM) || defined(USE_SYSMOUSE) */
-#endif
-
-#define DSTR_LEN 256
-
-Hist *LoadHist;
-Hist *SaveHist;
-Hist *URLHist;
-Hist *ShellHist;
-Hist *TextHist;
-
-typedef struct _Event {
- int cmd;
- void *data;
- struct _Event *next;
-} Event;
-static Event *CurrentEvent = NULL;
-static Event *LastEvent = NULL;
-
-#ifdef USE_ALARM
-static AlarmEvent DefaultAlarm = {
- 0, AL_UNSET, FUNCNAME_nulcmd, NULL
-};
-static AlarmEvent *CurrentAlarm = &DefaultAlarm;
-static MySignalHandler SigAlarm(SIGNAL_ARG);
-#endif
-
-#ifdef SIGWINCH
-static int need_resize_screen = FALSE;
-static MySignalHandler resize_hook(SIGNAL_ARG);
-static void resize_screen(void);
-#endif
-
-#ifdef SIGPIPE
-static MySignalHandler SigPipe(SIGNAL_ARG);
-#endif
-
-#ifdef USE_MARK
-static char *MarkString = NULL;
-#endif
-static char *SearchString = NULL;
-int (*searchRoutine) (Buffer *, char *);
-
-JMP_BUF IntReturn;
-
-static void delBuffer(Buffer *buf);
-static void cmd_loadfile(char *path);
-static void cmd_loadURL(char *url, ParsedURL *current, char *referer,
- FormList *request);
-static void cmd_loadBuffer(Buffer *buf, int prop, int linkid);
-static void keyPressEventProc(int c);
-int show_params_p = 0;
-void show_params(FILE * fp);
-
-static char *getCurWord(Buffer *buf, int *spos, int *epos,
- const char *badchars);
-
-static int display_ok = FALSE;
-static void do_dump(Buffer *);
-int prec_num = 0;
-int prev_key = -1;
-int on_target = 1;
-static int add_download_list = FALSE;
-
-void set_buffer_environ(Buffer *);
-static void save_buffer_position(Buffer *buf);
-
-static void _followForm(int);
-static void _goLine(char *);
-static void _newT(void);
-static void followTab(TabBuffer * tab);
-static void moveTab(TabBuffer * t, TabBuffer * t2, int right);
-static void _nextA(int);
-static void _prevA(int);
-static int check_target = TRUE;
-#define PREC_NUM (prec_num ? prec_num : 1)
-#define PREC_LIMIT 10000
-static int searchKeyNum(void);
-
-#define help() fusage(stdout, 0)
-#define usage() fusage(stderr, 1)
-
-static void
-fversion(FILE * f)
-{
- fprintf(f, "w3m version %s, options %s\n", w3m_version,
-#if LANG == JA
- "lang=ja"
-#else
- "lang=en"
-#endif
-#ifdef USE_M17N
- ",m17n"
-#endif
-#ifdef USE_IMAGE
- ",image"
-#endif
-#ifdef USE_COLOR
- ",color"
-#ifdef USE_ANSI_COLOR
- ",ansi-color"
-#endif
-#endif
-#ifdef USE_MOUSE
- ",mouse"
-#ifdef USE_GPM
- ",gpm"
-#endif
-#ifdef USE_SYSMOUSE
- ",sysmouse"
-#endif
-#endif
-#ifdef USE_MENU
- ",menu"
-#endif
-#ifdef USE_COOKIE
- ",cookie"
-#endif
-#ifdef USE_SSL
- ",ssl"
-#ifdef USE_SSL_VERIFY
- ",ssl-verify"
-#endif
-#endif
-#ifdef USE_EXTERNAL_URI_LOADER
- ",external-uri-loader"
-#endif
-#ifdef USE_W3MMAILER
- ",w3mmailer"
-#endif
-#ifdef USE_NNTP
- ",nntp"
-#endif
-#ifdef USE_GOPHER
- ",gopher"
-#endif
-#ifdef INET6
- ",ipv6"
-#endif
-#ifdef USE_ALARM
- ",alarm"
-#endif
-#ifdef USE_MARK
- ",mark"
-#endif
-#ifdef USE_MIGEMO
- ",migemo"
-#endif
- );
-}
-
-static void
-fusage(FILE * f, int err)
-{
- fversion(f);
- /* FIXME: gettextize? */
- fprintf(f, "usage: w3m [options] [URL or filename]\noptions:\n");
- fprintf(f, " -t tab set tab width\n");
- fprintf(f, " -r ignore backspace effect\n");
- fprintf(f, " -l line # of preserved line (default 10000)\n");
-#ifdef USE_M17N
- fprintf(f, " -I charset document charset\n");
- fprintf(f, " -O charset display/output charset\n");
-#ifndef DEBIAN /* disabled by ukai: -s is used for squeeze multi lines */
- 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");
- fprintf(f, " -m internet message mode\n");
- fprintf(f, " -v visual startup mode\n");
-#ifdef USE_COLOR
- fprintf(f, " -M monochrome display\n");
-#endif /* USE_COLOR */
- fprintf(f,
- " -N open URL of command line on each new tab\n");
- fprintf(f, " -F automatically render frame\n");
- fprintf(f,
- " -cols width specify column width (used with -dump)\n");
- fprintf(f,
- " -ppc count specify the number of pixels per character (4.0...32.0)\n");
-#ifdef USE_IMAGE
- fprintf(f,
- " -ppl count specify the number of pixels per line (4.0...64.0)\n");
-#endif
- fprintf(f, " -dump dump formatted page into stdout\n");
- fprintf(f,
- " -dump_head dump response of HEAD request into stdout\n");
- fprintf(f, " -dump_source dump page source into stdout\n");
- fprintf(f, " -dump_both dump HEAD and source into stdout\n");
- fprintf(f,
- " -dump_extra dump HEAD, source, and extra information into stdout\n");
- fprintf(f, " -post file use POST method with file content\n");
- fprintf(f, " -header string insert string as a header\n");
- fprintf(f, " +<num> goto <num> line\n");
- fprintf(f, " -num show line number\n");
- fprintf(f, " -no-proxy don't use proxy\n");
-#ifdef INET6
- fprintf(f, " -4 IPv4 only (-o dns_order=4)\n");
- fprintf(f, " -6 IPv6 only (-o dns_order=6)\n");
-#endif
-#ifdef USE_MOUSE
- fprintf(f, " -no-mouse don't use mouse\n");
-#endif /* USE_MOUSE */
-#ifdef USE_COOKIE
- fprintf(f,
- " -cookie use cookie (-no-cookie: don't use cookie)\n");
-#endif /* USE_COOKIE */
- fprintf(f, " -pauth user:pass proxy authentication\n");
- fprintf(f, " -graph use graphic character\n");
- fprintf(f, " -no-graph don't use graphic character\n");
-#ifdef DEBIAN /* replaced by ukai: 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,
- " -title[=TERM] set buffer name to terminal title string\n");
- fprintf(f, " -o opt=value assign value to config option\n");
- fprintf(f, " -show-option print all config options\n");
- fprintf(f, " -config file specify config file\n");
- fprintf(f, " -help print this usage message\n");
- fprintf(f, " -version print w3m version\n");
- fprintf(f, " -reqlog write request logfile\n");
- fprintf(f, " -debug DO NOT USE\n");
- if (show_params_p)
- show_params(f);
- exit(err);
-}
-
-#ifdef USE_M17N
-#ifdef __EMX__
-static char *getCodePage(void);
-#endif
-#endif
-
-static GC_warn_proc orig_GC_warn_proc = NULL;
-#define GC_WARN_KEEP_MAX (20)
-
-static void
-wrap_GC_warn_proc(char *msg, GC_word arg)
-{
- if (fmInitialized) {
- /* *INDENT-OFF* */
- static struct {
- char *msg;
- GC_word arg;
- } msg_ring[GC_WARN_KEEP_MAX];
- /* *INDENT-ON* */
- static int i = 0;
- static int n = 0;
- static int lock = 0;
- int j;
-
- j = (i + n) % (sizeof(msg_ring) / sizeof(msg_ring[0]));
- msg_ring[j].msg = msg;
- msg_ring[j].arg = arg;
-
- if (n < sizeof(msg_ring) / sizeof(msg_ring[0]))
- ++n;
- else
- ++i;
-
- if (!lock) {
- lock = 1;
-
- for (; n > 0; --n, ++i) {
- i %= sizeof(msg_ring) / sizeof(msg_ring[0]);
-
- printf(msg_ring[i].msg, (unsigned long)msg_ring[i].arg);
- sleep_till_anykey(1, 1);
- }
-
- lock = 0;
- }
- }
- else if (orig_GC_warn_proc)
- orig_GC_warn_proc(msg, arg);
- else
- fprintf(stderr, msg, (unsigned long)arg);
-}
-
-#ifdef SIGCHLD
-static void
-sig_chld(int signo)
-{
- int p_stat;
-#ifdef HAVE_WAITPID
- pid_t pid;
-
- while ((pid = waitpid(-1, &p_stat, WNOHANG)) > 0) {
- ;
- }
-#elif HAVE_WAIT3
- int pid;
-
- while ((pid = wait3(&p_stat, WNOHANG, NULL)) > 0) {
- ;
- }
-#else
- wait(&p_stat);
-#endif
- mySignal(SIGCHLD, sig_chld);
- return;
-}
-#endif
-
-Str
-make_optional_header_string(char *s)
-{
- char *p;
- Str hs;
-
- if (strchr(s, '\n') || strchr(s, '\r'))
- return NULL;
- for (p = s; *p && *p != ':'; p++) ;
- if (*p != ':' || p == s)
- return NULL;
- hs = Strnew_size(strlen(s) + 3);
- Strcopy_charp_n(hs, s, p - s);
- if (!Strcasecmp_charp(hs, "content-type"))
- override_content_type = TRUE;
- Strcat_charp(hs, ": ");
- if (*(++p)) { /* not null header */
- SKIP_BLANKS(p); /* skip white spaces */
- Strcat_charp(hs, p);
- }
- Strcat_charp(hs, "\r\n");
- return hs;
-}
-
-int
-main(int argc, char **argv, char **envp)
-{
- Buffer *newbuf = NULL;
- char *p, c;
- int i;
- InputStream redin;
- char *line_str = NULL;
- char **load_argv;
- FormList *request;
- int load_argc = 0;
- int load_bookmark = FALSE;
- int visual_start = FALSE;
- int open_new_tab = FALSE;
- char search_header = FALSE;
- char *default_type = NULL;
- char *post_file = NULL;
- Str err_msg;
-#ifdef USE_M17N
- char *Locale = NULL;
- wc_uint8 auto_detect;
-#ifdef __EMX__
- wc_ces CodePage;
-#endif
-#endif
- GC_init();
-#if ENABLE_NLS
- setlocale(LC_ALL, "");
- bindtextdomain(PACKAGE, LOCALEDIR);
- textdomain(PACKAGE);
-#endif
-
-#ifndef HAVE_SYS_ERRLIST
- prepare_sys_errlist();
-#endif /* not HAVE_SYS_ERRLIST */
-
- NO_proxy_domains = newTextList();
- fileToDelete = newTextList();
-
- load_argv = New_N(char *, argc - 1);
- load_argc = 0;
-
- CurrentDir = currentdir();
- CurrentPid = (int)getpid();
- BookmarkFile = NULL;
- config_file = NULL;
-
- /* argument search 1 */
- for (i = 1; i < argc; i++) {
- if (*argv[i] == '-') {
- if (!strcmp("-config", argv[i])) {
- argv[i] = "-dummy";
- if (++i >= argc)
- usage();
- config_file = argv[i];
- argv[i] = "-dummy";
- }
- else if (!strcmp("-h", argv[i]) || !strcmp("-help", argv[i]))
- help();
- else if (!strcmp("-V", argv[i]) || !strcmp("-version", argv[i])) {
- fversion(stdout);
- exit(0);
- }
- }
- }
-
-#ifdef USE_M17N
- if (non_null(Locale = getenv("LC_ALL")) ||
- non_null(Locale = getenv("LC_CTYPE")) ||
- non_null(Locale = getenv("LANG"))) {
- DisplayCharset = wc_guess_locale_charset(Locale, DisplayCharset);
- DocumentCharset = wc_guess_locale_charset(Locale, DocumentCharset);
- SystemCharset = wc_guess_locale_charset(Locale, SystemCharset);
- }
-#ifdef __EMX__
- CodePage = wc_guess_charset(getCodePage(), 0);
- if (CodePage)
- DisplayCharset = DocumentCharset = SystemCharset = CodePage;
-#endif
-#endif
-
- /* initializations */
- init_rc();
-
- LoadHist = newHist();
- SaveHist = newHist();
- ShellHist = newHist();
- TextHist = newHist();
- URLHist = newHist();
-
-#ifdef USE_M17N
- if (FollowLocale && Locale) {
- DisplayCharset = wc_guess_locale_charset(Locale, DisplayCharset);
- SystemCharset = wc_guess_locale_charset(Locale, SystemCharset);
- }
- auto_detect = WcOption.auto_detect;
- BookmarkCharset = DocumentCharset;
-#endif
-
- if (!non_null(HTTP_proxy) &&
- ((p = getenv("HTTP_PROXY")) ||
- (p = getenv("http_proxy")) || (p = getenv("HTTP_proxy"))))
- HTTP_proxy = p;
-#ifdef USE_SSL
- if (!non_null(HTTPS_proxy) &&
- ((p = getenv("HTTPS_PROXY")) ||
- (p = getenv("https_proxy")) || (p = getenv("HTTPS_proxy"))))
- HTTPS_proxy = p;
- if (HTTPS_proxy == NULL && non_null(HTTP_proxy))
- HTTPS_proxy = HTTP_proxy;
-#endif /* USE_SSL */
-#ifdef USE_GOPHER
- if (!non_null(GOPHER_proxy) &&
- ((p = getenv("GOPHER_PROXY")) ||
- (p = getenv("gopher_proxy")) || (p = getenv("GOPHER_proxy"))))
- GOPHER_proxy = p;
-#endif /* USE_GOPHER */
- if (!non_null(FTP_proxy) &&
- ((p = getenv("FTP_PROXY")) ||
- (p = getenv("ftp_proxy")) || (p = getenv("FTP_proxy"))))
- FTP_proxy = p;
- if (!non_null(NO_proxy) &&
- ((p = getenv("NO_PROXY")) ||
- (p = getenv("no_proxy")) || (p = getenv("NO_proxy"))))
- NO_proxy = p;
-#ifdef USE_NNTP
- if (!non_null(NNTP_server) && (p = getenv("NNTPSERVER")) != NULL)
- NNTP_server = p;
- if (!non_null(NNTP_mode) && (p = getenv("NNTPMODE")) != NULL)
- NNTP_mode = p;
-#endif
-
- if (!non_null(Editor) && (p = getenv("EDITOR")) != NULL)
- Editor = p;
- if (!non_null(Mailer) && (p = getenv("MAILER")) != NULL)
- Mailer = p;
-
- /* argument search 2 */
- i = 1;
- while (i < argc) {
- if (*argv[i] == '-') {
- if (!strcmp("-t", argv[i])) {
- if (++i >= argc)
- usage();
- if (atoi(argv[i]) > 0)
- Tabstop = atoi(argv[i]);
- }
- else if (!strcmp("-r", argv[i]))
- ShowEffect = FALSE;
- else if (!strcmp("-l", argv[i])) {
- if (++i >= argc)
- usage();
- if (atoi(argv[i]) > 0)
- PagerMax = atoi(argv[i]);
- }
-#ifdef USE_M17N
-#ifndef DEBIAN /* XXX: use -o kanjicode={S|J|E} */
- 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;
- else {
- if (++i >= argc)
- usage();
- p = argv[i];
- }
- DocumentCharset = wc_guess_charset_short(p, DocumentCharset);
- WcOption.auto_detect = WC_OPT_DETECT_OFF;
- UseContentCharset = FALSE;
- }
- else if (!strncmp("-O", argv[i], 2)) {
- if (argv[i][2] != '\0')
- p = argv[i] + 2;
- else {
- if (++i >= argc)
- usage();
- p = argv[i];
- }
- DisplayCharset = wc_guess_charset_short(p, DisplayCharset);
- }
-#endif
- else if (!strcmp("-graph", argv[i]))
- UseGraphicChar = TRUE;
- else if (!strcmp("-no-graph", argv[i]))
- UseGraphicChar = FALSE;
- else if (!strcmp("-T", argv[i])) {
- if (++i >= argc)
- usage();
- DefaultType = default_type = argv[i];
- }
- else if (!strcmp("-m", argv[i]))
- SearchHeader = search_header = TRUE;
- else if (!strcmp("-v", argv[i]))
- visual_start = TRUE;
- else if (!strcmp("-N", argv[i]))
- open_new_tab = TRUE;
-#ifdef USE_COLOR
- else if (!strcmp("-M", argv[i]))
- useColor = FALSE;
-#endif /* USE_COLOR */
- else if (!strcmp("-B", argv[i]))
- load_bookmark = TRUE;
- else if (!strcmp("-bookmark", argv[i])) {
- if (++i >= argc)
- usage();
- BookmarkFile = argv[i];
- if (BookmarkFile[0] != '~' && BookmarkFile[0] != '/') {
- Str tmp = Strnew_charp(CurrentDir);
- if (Strlastchar(tmp) != '/')
- Strcat_char(tmp, '/');
- Strcat_charp(tmp, BookmarkFile);
- BookmarkFile = cleanupName(tmp->ptr);
- }
- }
- else if (!strcmp("-F", argv[i]))
- RenderFrame = TRUE;
- else if (!strcmp("-W", argv[i])) {
- if (WrapDefault)
- WrapDefault = FALSE;
- else
- WrapDefault = TRUE;
- }
- else if (!strcmp("-dump", argv[i]))
- w3m_dump = DUMP_BUFFER;
- else if (!strcmp("-dump_source", argv[i]))
- w3m_dump = DUMP_SOURCE;
- else if (!strcmp("-dump_head", argv[i]))
- w3m_dump = DUMP_HEAD;
- else if (!strcmp("-dump_both", argv[i]))
- w3m_dump = (DUMP_HEAD | DUMP_SOURCE);
- else if (!strcmp("-dump_extra", argv[i]))
- w3m_dump = (DUMP_HEAD | DUMP_SOURCE | DUMP_EXTRA);
- else if (!strcmp("-halfdump", argv[i]))
- w3m_dump = DUMP_HALFDUMP;
- else if (!strcmp("-halfload", argv[i])) {
- w3m_dump = 0;
- w3m_halfload = TRUE;
- DefaultType = default_type = "text/html";
- }
- else if (!strcmp("-backend", argv[i])) {
- w3m_backend = TRUE;
- }
- else if (!strcmp("-backend_batch", argv[i])) {
- w3m_backend = TRUE;
- if (++i >= argc)
- usage();
- if (!backend_batch_commands)
- backend_batch_commands = newTextList();
- pushText(backend_batch_commands, argv[i]);
- }
- else if (!strcmp("-cols", argv[i])) {
- if (++i >= argc)
- usage();
- COLS = atoi(argv[i]);
- }
- else if (!strcmp("-ppc", argv[i])) {
- double ppc;
- if (++i >= argc)
- usage();
- ppc = atof(argv[i]);
- if (ppc >= MINIMUM_PIXEL_PER_CHAR &&
- ppc <= MAXIMUM_PIXEL_PER_CHAR) {
- pixel_per_char = ppc;
- set_pixel_per_char = TRUE;
- }
- }
-#ifdef USE_IMAGE
- else if (!strcmp("-ppl", argv[i])) {
- double ppc;
- if (++i >= argc)
- usage();
- ppc = atof(argv[i]);
- if (ppc >= MINIMUM_PIXEL_PER_CHAR &&
- ppc <= MAXIMUM_PIXEL_PER_CHAR * 2) {
- pixel_per_line = ppc;
- set_pixel_per_line = TRUE;
- }
- }
-#endif
- else if (!strcmp("-num", argv[i]))
- showLineNum = TRUE;
- else if (!strcmp("-no-proxy", argv[i]))
- use_proxy = FALSE;
-#ifdef INET6
- else if (!strcmp("-4", argv[i]) || !strcmp("-6", argv[i]))
- set_param_option(Sprintf("dns_order=%c", argv[i][1])->ptr);
-#endif
- else if (!strcmp("-post", argv[i])) {
- if (++i >= argc)
- usage();
- post_file = argv[i];
- }
- else if (!strcmp("-header", argv[i])) {
- Str hs;
- if (++i >= argc)
- usage();
- if ((hs = make_optional_header_string(argv[i])) != NULL) {
- if (header_string == NULL)
- header_string = hs;
- else
- Strcat(header_string, hs);
- }
- while (argv[i][0]) {
- argv[i][0] = '\0';
- argv[i]++;
- }
- }
-#ifdef USE_MOUSE
- else if (!strcmp("-no-mouse", argv[i])) {
- use_mouse = FALSE;
- }
-#endif /* USE_MOUSE */
-#ifdef USE_COOKIE
- else if (!strcmp("-no-cookie", argv[i])) {
- use_cookie = FALSE;
- accept_cookie = FALSE;
- }
- else if (!strcmp("-cookie", argv[i])) {
- use_cookie = TRUE;
- accept_cookie = TRUE;
- }
-#endif /* USE_COOKIE */
- else if (!strcmp("-pauth", argv[i])) {
- if (++i >= argc)
- usage();
- proxy_auth_cookie = Strnew_m_charp("Basic ",
- encodeB(argv[i])->ptr,
- NULL);
- while (argv[i][0]) {
- argv[i][0] = '\0';
- argv[i]++;
- }
- }
-#ifdef DEBIAN
- 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;
- else if (!strcmp("-title", argv[i]))
- displayTitleTerm = getenv("TERM");
- else if (!strncmp("-title=", argv[i], 7))
- displayTitleTerm = argv[i] + 7;
- else if (!strcmp("-o", argv[i]) ||
- !strcmp("-show-option", argv[i])) {
- if (!strcmp("-show-option", argv[i]) || ++i >= argc ||
- !strcmp(argv[i], "?")) {
- show_params(stdout);
- exit(0);
- }
- if (!set_param_option(argv[i])) {
- /* option set failed */
- /* FIXME: gettextize? */
- fprintf(stderr, "%s: bad option\n", argv[i]);
- show_params_p = 1;
- usage();
- }
- }
- else if (!strcmp("-dummy", argv[i])) {
- /* do nothing */
- }
- else if (!strcmp("-debug", argv[i])) {
- w3m_debug = TRUE;
- }
- else if (!strcmp("-reqlog",argv[i])) {
- w3m_reqlog=rcFile("request.log");
- }
- else {
- usage();
- }
- }
- else if (*argv[i] == '+') {
- line_str = argv[i] + 1;
- }
- else {
- load_argv[load_argc++] = argv[i];
- }
- i++;
- }
-
-#ifdef __WATT32__
- if (w3m_debug)
- dbug_init();
- sock_init();
-#endif
-
- FirstTab = NULL;
- LastTab = NULL;
- nTab = 0;
- CurrentTab = NULL;
- CurrentKey = -1;
- if (BookmarkFile == NULL)
- BookmarkFile = rcFile(BOOKMARK);
-
- if (!isatty(1) && !w3m_dump) {
- /* redirected output */
- w3m_dump = DUMP_BUFFER;
- }
- if (w3m_dump) {
- if (COLS == 0)
- COLS = 80;
- }
-
-#ifdef USE_BINMODE_STREAM
- setmode(fileno(stdout), O_BINARY);
-#endif
- if (!w3m_dump && !w3m_backend) {
- fmInit();
-#ifdef SIGWINCH
- mySignal(SIGWINCH, resize_hook);
-#else /* not SIGWINCH */
- setlinescols();
- setupscreen();
-#endif /* not SIGWINCH */
- }
-#ifdef USE_IMAGE
- else if (w3m_halfdump && displayImage)
- activeImage = TRUE;
-#endif
-
- sync_with_option();
-#ifdef USE_COOKIE
- initCookie();
-#endif /* USE_COOKIE */
-#ifdef USE_HISTORY
- if (UseHistory)
- loadHistory(URLHist);
-#endif /* not USE_HISTORY */
-
-#ifdef USE_M17N
- wtf_init(DocumentCharset, DisplayCharset);
- /* if (w3m_dump)
- * WcOption.pre_conv = WC_TRUE;
- */
-#endif
-
- if (w3m_backend)
- backend();
-
- if (w3m_dump)
- mySignal(SIGINT, SIG_IGN);
-#ifdef SIGCHLD
- mySignal(SIGCHLD, sig_chld);
-#endif
-#ifdef SIGPIPE
- mySignal(SIGPIPE, SigPipe);
-#endif
-
- orig_GC_warn_proc = GC_set_warn_proc(wrap_GC_warn_proc);
- err_msg = Strnew();
- if (load_argc == 0) {
- /* no URL specified */
- if (!isatty(0)) {
- redin = newFileStream(fdopen(dup(0), "rb"), (void (*)())pclose);
- newbuf = openGeneralPagerBuffer(redin);
- dup2(1, 0);
- }
- else if (load_bookmark) {
- newbuf = loadGeneralFile(BookmarkFile, NULL, NO_REFERER, 0, NULL);
- if (newbuf == NULL)
- Strcat_charp(err_msg, "w3m: Can't load bookmark.\n");
- }
- else if (visual_start) {
- /* FIXME: gettextize? */
- Str s_page;
- s_page =
- Strnew_charp
- ("<title>W3M startup page</title><center><b>Welcome to ");
- Strcat_charp(s_page, "<a href='http://w3m.sourceforge.net/'>");
- Strcat_m_charp(s_page,
- "w3m</a>!<p><p>This is w3m version ",
- w3m_version,
- "<br>Written by <a href='mailto:aito@fw.ipsj.or.jp'>Akinori Ito</a>",
- NULL);
-#ifdef DEBIAN
- Strcat_m_charp(s_page,
- "<p>Debian package is maintained by <a href='mailto:ukai@debian.or.jp'>Fumitoshi UKAI</a>.",
- "You can read <a href='file:///usr/share/doc/w3m/'>w3m documents on your local system</a>.",
- NULL);
-#endif /* DEBIAN */
- newbuf = loadHTMLString(s_page);
- if (newbuf == NULL)
- Strcat_charp(err_msg, "w3m: Can't load string.\n");
- else if (newbuf != NO_BUFFER)
- newbuf->bufferprop |= (BP_INTERNAL | BP_NO_URL);
- }
- else if ((p = getenv("HTTP_HOME")) != NULL ||
- (p = getenv("WWW_HOME")) != NULL) {
- newbuf = loadGeneralFile(p, NULL, NO_REFERER, 0, NULL);
- if (newbuf == NULL)
- Strcat(err_msg, Sprintf("w3m: Can't load %s.\n", p));
- else if (newbuf != NO_BUFFER)
- pushHashHist(URLHist, parsedURL2Str(&newbuf->currentURL)->ptr);
- }
- else {
- if (fmInitialized)
- fmTerm();
- usage();
- }
- if (newbuf == NULL) {
- if (fmInitialized)
- fmTerm();
- if (err_msg->length)
- fprintf(stderr, "%s", err_msg->ptr);
- w3m_exit(2);
- }
- i = -1;
- }
- else {
- i = 0;
- }
- for (; i < load_argc; i++) {
- if (i >= 0) {
- SearchHeader = search_header;
- DefaultType = default_type;
- if (w3m_dump == DUMP_HEAD) {
- request = New(FormList);
- request->method = FORM_METHOD_HEAD;
- newbuf =
- loadGeneralFile(load_argv[i], NULL, NO_REFERER, 0,
- request);
- }
- else {
- if (post_file && i == 0) {
- FILE *fp;
- Str body;
- if (!strcmp(post_file, "-"))
- fp = stdin;
- else
- fp = fopen(post_file, "r");
- if (fp == NULL) {
- /* FIXME: gettextize? */
- Strcat(err_msg,
- Sprintf("w3m: Can't open %s.\n", post_file));
- continue;
- }
- body = Strfgetall(fp);
- if (fp != stdin)
- fclose(fp);
- request =
- newFormList(NULL, "post", NULL, NULL, NULL, NULL,
- NULL);
- request->body = body->ptr;
- request->boundary = NULL;
- request->length = body->length;
- }
- else {
- request = NULL;
- }
- newbuf =
- loadGeneralFile(load_argv[i], NULL, NO_REFERER, 0,
- request);
- }
- if (newbuf == NULL) {
- /* FIXME: gettextize? */
- Strcat(err_msg,
- Sprintf("w3m: Can't load %s.\n", load_argv[i]));
- continue;
- }
- else if (newbuf == NO_BUFFER)
- continue;
- switch (newbuf->real_scheme) {
- case SCM_MAILTO:
- break;
- case SCM_LOCAL:
- case SCM_LOCAL_CGI:
- unshiftHist(LoadHist, conv_from_system(load_argv[i]));
- default:
- pushHashHist(URLHist, parsedURL2Str(&newbuf->currentURL)->ptr);
- break;
- }
- }
- else if (newbuf == NO_BUFFER)
- continue;
- if (newbuf->pagerSource ||
- (newbuf->real_scheme == SCM_LOCAL && newbuf->header_source &&
- newbuf->currentURL.file && strcmp(newbuf->currentURL.file, "-")))
- newbuf->search_header = search_header;
- if (CurrentTab == NULL) {
- FirstTab = LastTab = CurrentTab = newTab();
- nTab = 1;
- Firstbuf = Currentbuf = newbuf;
- }
- else if (open_new_tab) {
- _newT();
- Currentbuf->nextBuffer = newbuf;
- delBuffer(Currentbuf);
- }
- else {
- Currentbuf->nextBuffer = newbuf;
- Currentbuf = newbuf;
- }
- if (!w3m_dump || w3m_dump == DUMP_BUFFER) {
- if (Currentbuf->frameset != NULL && RenderFrame)
- rFrame();
- }
- if (w3m_dump)
- do_dump(Currentbuf);
- else {
- Currentbuf = newbuf;
-#ifdef USE_BUFINFO
- saveBufferInfo();
-#endif
- }
- }
- if (w3m_dump) {
- if (err_msg->length)
- fprintf(stderr, "%s", err_msg->ptr);
-#ifdef USE_COOKIE
- save_cookies();
-#endif /* USE_COOKIE */
- w3m_exit(0);
- }
-
- if (add_download_list) {
- add_download_list = FALSE;
- CurrentTab = LastTab;
- if (!FirstTab) {
- FirstTab = LastTab = CurrentTab = newTab();
- nTab = 1;
- }
- if (!Firstbuf || Firstbuf == NO_BUFFER) {
- Firstbuf = Currentbuf = newBuffer(INIT_BUFFER_WIDTH);
- Currentbuf->bufferprop = BP_INTERNAL | BP_NO_URL;
- Currentbuf->buffername = DOWNLOAD_LIST_TITLE;
- }
- else
- Currentbuf = Firstbuf;
- ldDL();
- }
- else
- CurrentTab = FirstTab;
- if (!FirstTab || !Firstbuf || Firstbuf == NO_BUFFER) {
- if (newbuf == NO_BUFFER) {
- if (fmInitialized)
- /* FIXME: gettextize? */
- inputChar("Hit any key to quit w3m:");
- }
- if (fmInitialized)
- fmTerm();
- if (err_msg->length)
- fprintf(stderr, "%s", err_msg->ptr);
- if (newbuf == NO_BUFFER) {
-#ifdef USE_COOKIE
- save_cookies();
-#endif /* USE_COOKIE */
- if (!err_msg->length)
- w3m_exit(0);
- }
- w3m_exit(2);
- }
- if (err_msg->length)
- disp_message_nsec(err_msg->ptr, FALSE, 1, TRUE, FALSE);
-
- SearchHeader = FALSE;
- DefaultType = NULL;
-#ifdef USE_M17N
- UseContentCharset = TRUE;
- WcOption.auto_detect = auto_detect;
-#endif
-
- Currentbuf = Firstbuf;
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
- if (line_str) {
- _goLine(line_str);
- }
- for (;;) {
- if (add_download_list) {
- add_download_list = FALSE;
- ldDL();
- }
- if (Currentbuf->submit) {
- Anchor *a = Currentbuf->submit;
- Currentbuf->submit = NULL;
- gotoLine(Currentbuf, a->start.line);
- Currentbuf->pos = a->start.pos;
- _followForm(TRUE);
- continue;
- }
- /* event processing */
- if (CurrentEvent) {
- CurrentKey = -1;
- CurrentKeyData = NULL;
- CurrentCmdData = (char *)CurrentEvent->data;
- w3mFuncList[CurrentEvent->cmd].func();
- CurrentCmdData = NULL;
- CurrentEvent = CurrentEvent->next;
- continue;
- }
- /* get keypress event */
-#ifdef USE_ALARM
- if (Currentbuf->event) {
- if (Currentbuf->event->status != AL_UNSET) {
- CurrentAlarm = Currentbuf->event;
- if (CurrentAlarm->sec == 0) { /* refresh (0sec) */
- Currentbuf->event = NULL;
- CurrentKey = -1;
- CurrentKeyData = NULL;
- CurrentCmdData = (char *)CurrentAlarm->data;
- w3mFuncList[CurrentAlarm->cmd].func();
- CurrentCmdData = NULL;
- continue;
- }
- }
- else
- Currentbuf->event = NULL;
- }
- if (!Currentbuf->event)
- CurrentAlarm = &DefaultAlarm;
-#endif
-#ifdef USE_MOUSE
- mouse_action.in_action = FALSE;
- if (use_mouse)
- mouse_active();
-#endif /* USE_MOUSE */
-#ifdef USE_ALARM
- if (CurrentAlarm->sec > 0) {
- mySignal(SIGALRM, SigAlarm);
- alarm(CurrentAlarm->sec);
- }
-#endif
-#ifdef SIGWINCH
- mySignal(SIGWINCH, resize_hook);
-#endif
-#ifdef USE_IMAGE
- if (activeImage && displayImage && Currentbuf->img &&
- !Currentbuf->image_loaded) {
- do {
-#ifdef SIGWINCH
- if (need_resize_screen)
- resize_screen();
-#endif
- loadImage(Currentbuf, IMG_FLAG_NEXT);
- } while (sleep_till_anykey(1, 0) <= 0);
- }
-#ifdef SIGWINCH
- else
-#endif
-#endif
-#ifdef SIGWINCH
- {
- do {
- if (need_resize_screen)
- resize_screen();
- } while (sleep_till_anykey(1, 0) <= 0);
- }
-#endif
- c = getch();
-#ifdef USE_ALARM
- if (CurrentAlarm->sec > 0) {
- alarm(0);
- }
-#endif
-#ifdef USE_MOUSE
- if (use_mouse)
- mouse_inactive();
-#endif /* USE_MOUSE */
- if (IS_ASCII(c)) { /* Ascii */
- if(((prec_num && c == '0') || '1' <= c) && (c <= '9')) {
- prec_num = prec_num * 10 + (int)(c - '0');
- if (prec_num > PREC_LIMIT)
- prec_num = PREC_LIMIT;
- }
- else {
- set_buffer_environ(Currentbuf);
- save_buffer_position(Currentbuf);
- keyPressEventProc((int)c);
- prec_num = 0;
- }
- }
- prev_key = CurrentKey;
- CurrentKey = -1;
- CurrentKeyData = NULL;
- }
-}
-
-static void
-keyPressEventProc(int c)
-{
- CurrentKey = c;
- w3mFuncList[(int)GlobalKeymap[c]].func();
-}
-
-void
-pushEvent(int cmd, void *data)
-{
- Event *event;
-
- event = New(Event);
- event->cmd = cmd;
- event->data = data;
- event->next = NULL;
- if (CurrentEvent)
- LastEvent->next = event;
- else
- CurrentEvent = event;
- LastEvent = event;
-}
-
-static void
-dump_source(Buffer *buf)
-{
- FILE *f;
- char c;
- if (buf->sourcefile == NULL)
- return;
- f = fopen(buf->sourcefile, "r");
- if (f == NULL)
- return;
- while (c = fgetc(f), !feof(f)) {
- putchar(c);
- }
- fclose(f);
-}
-
-static void
-dump_head(Buffer *buf)
-{
- TextListItem *ti;
-
- if (buf->document_header == NULL) {
- if (w3m_dump & DUMP_EXTRA)
- printf("\n");
- return;
- }
- for (ti = buf->document_header->first; ti; ti = ti->next) {
-#ifdef USE_M17N
- printf("%s",
- wc_conv_strict(ti->ptr, InnerCharset,
- buf->document_charset)->ptr);
-#else
- printf("%s", ti->ptr);
-#endif
- }
- puts("");
-}
-
-static void
-dump_extra(Buffer *buf)
-{
- printf("W3m-current-url: %s\n", parsedURL2Str(&buf->currentURL)->ptr);
- if (buf->baseURL)
- printf("W3m-base-url: %s\n", parsedURL2Str(buf->baseURL)->ptr);
-#ifdef USE_M17N
- printf("W3m-document-charset: %s\n",
- wc_ces_to_charset(buf->document_charset));
-#endif
-#ifdef USE_SSL
- if (buf->ssl_certificate) {
- Str tmp = Strnew();
- char *p;
- for (p = buf->ssl_certificate; *p; p++) {
- Strcat_char(tmp, *p);
- if (*p == '\n') {
- for (; *(p + 1) == '\n'; p++) ;
- if (*(p + 1))
- Strcat_char(tmp, '\t');
- }
- }
- if (Strlastchar(tmp) != '\n')
- Strcat_char(tmp, '\n');
- printf("W3m-ssl-certificate: %s", tmp->ptr);
- }
-#endif
-}
-
-static void
-do_dump(Buffer *buf)
-{
- MySignalHandler(*volatile prevtrap) (SIGNAL_ARG) = NULL;
-
- prevtrap = mySignal(SIGINT, intTrap);
- if (SETJMP(IntReturn) != 0) {
- mySignal(SIGINT, prevtrap);
- return;
- }
- if (w3m_dump & DUMP_EXTRA)
- dump_extra(buf);
- if (w3m_dump & DUMP_HEAD)
- dump_head(buf);
- if (w3m_dump & DUMP_SOURCE)
- dump_source(buf);
- if (w3m_dump == DUMP_BUFFER)
- saveBuffer(buf, stdout, FALSE);
- mySignal(SIGINT, prevtrap);
-}
-
-DEFUN(nulcmd, NOTHING NULL @@@, "Do nothing")
-{ /* do nothing */
-}
-
-#ifdef __EMX__
-DEFUN(pcmap, PCMAP, "pcmap")
-{
- w3mFuncList[(int)PcKeymap[(int)getch()]].func();
-}
-#else /* not __EMX__ */
-void
-pcmap(void)
-{
-}
-#endif
-
-static void
-escKeyProc(int c, int esc, unsigned char *map)
-{
- if (CurrentKey >= 0 && CurrentKey & K_MULTI) {
- unsigned char **mmap;
- mmap = (unsigned char **)getKeyData(MULTI_KEY(CurrentKey));
- if (!mmap)
- return;
- switch (esc) {
- case K_ESCD:
- map = mmap[3];
- break;
- case K_ESCB:
- map = mmap[2];
- break;
- case K_ESC:
- map = mmap[1];
- break;
- default:
- map = mmap[0];
- break;
- }
- esc |= (CurrentKey & ~0xFFFF);
- }
- CurrentKey = esc | c;
- w3mFuncList[(int)map[c]].func();
-}
-
-DEFUN(escmap, ESCMAP, "ESC map")
-{
- char c;
- c = getch();
- if (IS_ASCII(c))
- escKeyProc((int)c, K_ESC, EscKeymap);
-}
-
-DEFUN(escbmap, ESCBMAP, "ESC [ map")
-{
- char c;
- c = getch();
- if (IS_DIGIT(c)) {
- escdmap(c);
- return;
- }
- if (IS_ASCII(c))
- escKeyProc((int)c, K_ESCB, EscBKeymap);
-}
-
-void
-escdmap(char c)
-{
- int d;
- d = (int)c - (int)'0';
- c = getch();
- if (IS_DIGIT(c)) {
- d = d * 10 + (int)c - (int)'0';
- c = getch();
- }
- if (c == '~')
- escKeyProc((int)d, K_ESCD, EscDKeymap);
-}
-
-DEFUN(multimap, MULTIMAP, "multimap")
-{
- char c;
- c = getch();
- if (IS_ASCII(c)) {
- CurrentKey = K_MULTI | (CurrentKey << 16) | c;
- escKeyProc((int)c, 0, NULL);
- }
-}
-
-void
-tmpClearBuffer(Buffer *buf)
-{
- if (buf->pagerSource == NULL && writeBufferCache(buf) == 0) {
- buf->firstLine = NULL;
- buf->topLine = NULL;
- buf->currentLine = NULL;
- buf->lastLine = NULL;
- }
-}
-
-static Str currentURL(void);
-
-#ifdef USE_BUFINFO
-void
-saveBufferInfo()
-{
- FILE *fp;
-
- if (w3m_dump)
- return;
- if ((fp = fopen(rcFile("bufinfo"), "w")) == NULL) {
- return;
- }
- fprintf(fp, "%s\n", currentURL()->ptr);
- fclose(fp);
-}
-#endif
-
-static void
-pushBuffer(Buffer *buf)
-{
- Buffer *b;
-
-#ifdef USE_IMAGE
- deleteImage(Currentbuf);
-#endif
- if (clear_buffer)
- tmpClearBuffer(Currentbuf);
- if (Firstbuf == Currentbuf) {
- buf->nextBuffer = Firstbuf;
- Firstbuf = Currentbuf = buf;
- }
- else if ((b = prevBuffer(Firstbuf, Currentbuf)) != NULL) {
- b->nextBuffer = buf;
- buf->nextBuffer = Currentbuf;
- Currentbuf = buf;
- }
-#ifdef USE_BUFINFO
- saveBufferInfo();
-#endif
-
-}
-
-static void
-delBuffer(Buffer *buf)
-{
- if (buf == NULL)
- return;
- if (Currentbuf == buf)
- Currentbuf = buf->nextBuffer;
- Firstbuf = deleteBuffer(Firstbuf, buf);
- if (!Currentbuf)
- Currentbuf = Firstbuf;
-}
-
-static void
-repBuffer(Buffer *oldbuf, Buffer *buf)
-{
- Firstbuf = replaceBuffer(Firstbuf, oldbuf, buf);
- Currentbuf = buf;
-}
-
-
-MySignalHandler
-intTrap(SIGNAL_ARG)
-{ /* Interrupt catcher */
- LONGJMP(IntReturn, 0);
- SIGNAL_RETURN;
-}
-
-#ifdef SIGWINCH
-static MySignalHandler
-resize_hook(SIGNAL_ARG)
-{
- need_resize_screen = TRUE;
- mySignal(SIGWINCH, resize_hook);
- SIGNAL_RETURN;
-}
-
-static void
-resize_screen(void)
-{
- need_resize_screen = FALSE;
- setlinescols();
- setupscreen();
- if (CurrentTab)
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-#endif /* SIGWINCH */
-
-#ifdef SIGPIPE
-static MySignalHandler
-SigPipe(SIGNAL_ARG)
-{
-#ifdef USE_MIGEMO
- init_migemo();
-#endif
- mySignal(SIGPIPE, SigPipe);
- SIGNAL_RETURN;
-}
-#endif
-
-/*
- * Command functions: These functions are called with a keystroke.
- */
-
-#define MAX(a, b) ((a) > (b) ? (a) : (b))
-#define MIN(a, b) ((a) < (b) ? (a) : (b))
-
-static void
-nscroll(int n, int mode)
-{
- Buffer *buf = Currentbuf;
- Line *top = buf->topLine, *cur = buf->currentLine;
- int lnum, tlnum, llnum, diff_n;
-
- if (buf->firstLine == NULL)
- return;
- lnum = cur->linenumber;
- buf->topLine = lineSkip(buf, top, n, FALSE);
- if (buf->topLine == top) {
- lnum += n;
- if (lnum < buf->topLine->linenumber)
- lnum = buf->topLine->linenumber;
- else if (lnum > buf->lastLine->linenumber)
- lnum = buf->lastLine->linenumber;
- }
- else {
- tlnum = buf->topLine->linenumber;
- llnum = buf->topLine->linenumber + buf->LINES - 1;
- if (nextpage_topline)
- diff_n = 0;
- else
- diff_n = n - (tlnum - top->linenumber);
- if (lnum < tlnum)
- lnum = tlnum + diff_n;
- if (lnum > llnum)
- lnum = llnum + diff_n;
- }
- gotoLine(buf, lnum);
- arrangeLine(buf);
- if (n > 0) {
- if (buf->currentLine->bpos &&
- buf->currentLine->bwidth >= buf->currentColumn + buf->visualpos)
- cursorDown(buf, 1);
- else {
- while (buf->currentLine->next && buf->currentLine->next->bpos &&
- buf->currentLine->bwidth + buf->currentLine->width <
- buf->currentColumn + buf->visualpos)
- cursorDown0(buf, 1);
- }
- }
- else {
- if (buf->currentLine->bwidth + buf->currentLine->width <
- buf->currentColumn + buf->visualpos)
- cursorUp(buf, 1);
- else {
- while (buf->currentLine->prev && buf->currentLine->bpos &&
- buf->currentLine->bwidth >=
- buf->currentColumn + buf->visualpos)
- cursorUp0(buf, 1);
- }
- }
- displayBuffer(buf, mode);
-}
-
-/* Move page forward */
-DEFUN(pgFore, NEXT_PAGE, "Move to next page")
-{
- if (vi_prec_num)
- nscroll(searchKeyNum() * (Currentbuf->LINES - 1), B_NORMAL);
- else
- nscroll(prec_num ? searchKeyNum() : searchKeyNum()
- * (Currentbuf->LINES - 1), prec_num ? B_SCROLL : B_NORMAL);
-}
-
-/* Move page backward */
-DEFUN(pgBack, PREV_PAGE, "Move to previous page")
-{
- if (vi_prec_num)
- nscroll(-searchKeyNum() * (Currentbuf->LINES - 1), B_NORMAL);
- else
- nscroll(-(prec_num ? searchKeyNum() : searchKeyNum()
- * (Currentbuf->LINES - 1)), prec_num ? B_SCROLL : B_NORMAL);
-}
-
-/* 1 line up */
-DEFUN(lup1, UP, "Scroll up one line")
-{
- nscroll(searchKeyNum(), B_SCROLL);
-}
-
-/* 1 line down */
-DEFUN(ldown1, DOWN, "Scroll down one line")
-{
- nscroll(-searchKeyNum(), B_SCROLL);
-}
-
-/* move cursor position to the center of screen */
-DEFUN(ctrCsrV, CENTER_V, "Move to the center column")
-{
- int offsety;
- if (Currentbuf->firstLine == NULL)
- return;
- offsety = Currentbuf->LINES / 2 - Currentbuf->cursorY;
- if (offsety != 0) {
-#if 0
- Currentbuf->currentLine = lineSkip(Currentbuf,
- Currentbuf->currentLine, offsety,
- FALSE);
-#endif
- Currentbuf->topLine =
- lineSkip(Currentbuf, Currentbuf->topLine, -offsety, FALSE);
- arrangeLine(Currentbuf);
- displayBuffer(Currentbuf, B_NORMAL);
- }
-}
-
-DEFUN(ctrCsrH, CENTER_H, "Move to the center line")
-{
- int offsetx;
- if (Currentbuf->firstLine == NULL)
- return;
- offsetx = Currentbuf->cursorX - Currentbuf->COLS / 2;
- if (offsetx != 0) {
- columnSkip(Currentbuf, offsetx);
- arrangeCursor(Currentbuf);
- displayBuffer(Currentbuf, B_NORMAL);
- }
-}
-
-/* Redraw screen */
-DEFUN(rdrwSc, REDRAW, "Redraw screen")
-{
- clear();
- arrangeCursor(Currentbuf);
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-static void
-clear_mark(Line *l)
-{
- int pos;
- if (!l)
- return;
- for (pos = 0; pos < l->size; pos++)
- l->propBuf[pos] &= ~PE_MARK;
-}
-
-/* search by regular expression */
-static int
-srchcore(char *volatile str, int (*func) (Buffer *, char *))
-{
- MySignalHandler(*prevtrap) ();
- volatile int i, result = SR_NOTFOUND;
-
- if (str != NULL && str != SearchString)
- SearchString = str;
- if (SearchString == NULL || *SearchString == '\0')
- return SR_NOTFOUND;
-
- str = conv_search_string(SearchString, DisplayCharset);
- prevtrap = mySignal(SIGINT, intTrap);
- crmode();
- if (SETJMP(IntReturn) == 0) {
- for (i = 0; i < PREC_NUM; i++) {
- result = func(Currentbuf, str);
- if (i < PREC_NUM - 1 && result & SR_FOUND)
- clear_mark(Currentbuf->currentLine);
- }
- }
- mySignal(SIGINT, prevtrap);
- term_raw();
- return result;
-}
-
-static void
-disp_srchresult(int result, char *prompt, char *str)
-{
- if (str == NULL)
- str = "";
- if (result & SR_NOTFOUND)
- disp_message(Sprintf("Not found: %s", str)->ptr, TRUE);
- else if (result & SR_WRAPPED)
- disp_message(Sprintf("Search wrapped: %s", str)->ptr, TRUE);
- else if (show_srch_str)
- disp_message(Sprintf("%s%s", prompt, str)->ptr, TRUE);
-}
-
-static int
-dispincsrch(int ch, Str buf, Lineprop *prop)
-{
- static Buffer sbuf;
- static Line *currentLine;
- static int pos;
- char *str;
- int do_next_search = FALSE;
-
- if (ch == 0 && buf == NULL) {
- SAVE_BUFPOSITION(&sbuf); /* search starting point */
- currentLine = sbuf.currentLine;
- pos = sbuf.pos;
- return -1;
- }
-
- str = buf->ptr;
- switch (ch) {
- case 022: /* C-r */
- searchRoutine = backwardSearch;
- do_next_search = TRUE;
- break;
- case 023: /* C-s */
- searchRoutine = forwardSearch;
- do_next_search = TRUE;
- break;
-
-#ifdef USE_MIGEMO
- case 034:
- migemo_active = -migemo_active;
- goto done;
-#endif
-
- default:
- if (ch >= 0)
- return ch; /* use InputKeymap */
- }
-
- if (do_next_search) {
- if (*str) {
- if (searchRoutine == forwardSearch)
- Currentbuf->pos += 1;
- SAVE_BUFPOSITION(&sbuf);
- if (srchcore(str, searchRoutine) == SR_NOTFOUND
- && searchRoutine == forwardSearch) {
- Currentbuf->pos -= 1;
- SAVE_BUFPOSITION(&sbuf);
- }
- arrangeCursor(Currentbuf);
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
- clear_mark(Currentbuf->currentLine);
- return -1;
- }
- else
- return 020; /* _prev completion for C-s C-s */
- }
- else if (*str) {
- RESTORE_BUFPOSITION(&sbuf);
- arrangeCursor(Currentbuf);
- srchcore(str, searchRoutine);
- arrangeCursor(Currentbuf);
- currentLine = Currentbuf->currentLine;
- pos = Currentbuf->pos;
- }
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
- clear_mark(Currentbuf->currentLine);
-#ifdef USE_MIGEMO
- done:
- while (*str++ != '\0') {
- if (migemo_active > 0)
- *prop++ |= PE_UNDER;
- else
- *prop++ &= ~PE_UNDER;
- }
-#endif
- return -1;
-}
-
-void
-isrch(int (*func) (Buffer *, char *), char *prompt)
-{
- char *str;
- Buffer sbuf;
- SAVE_BUFPOSITION(&sbuf);
- dispincsrch(0, NULL, NULL); /* initialize incremental search state */
-
- searchRoutine = func;
- str = inputLineHistSearch(prompt, NULL, IN_STRING, TextHist, dispincsrch);
- if (str == NULL) {
- RESTORE_BUFPOSITION(&sbuf);
- }
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-void
-srch(int (*func) (Buffer *, char *), char *prompt)
-{
- char *str;
- int result;
- int disp = FALSE;
- int pos;
-
- str = searchKeyData();
- if (str == NULL || *str == '\0') {
- str = inputStrHist(prompt, NULL, TextHist);
- if (str != NULL && *str == '\0')
- str = SearchString;
- if (str == NULL) {
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
- disp = TRUE;
- }
- pos = Currentbuf->pos;
- if (func == forwardSearch)
- Currentbuf->pos += 1;
- result = srchcore(str, func);
- if (result & SR_FOUND)
- clear_mark(Currentbuf->currentLine);
- else
- Currentbuf->pos = pos;
- displayBuffer(Currentbuf, B_NORMAL);
- if (disp)
- disp_srchresult(result, prompt, str);
- searchRoutine = func;
-}
-
-/* Search regular expression forward */
-
-DEFUN(srchfor, SEARCH SEARCH_FORE WHEREIS, "Search forward")
-{
- srch(forwardSearch, "Forward: ");
-}
-
-DEFUN(isrchfor, ISEARCH, "Incremental search forward")
-{
- isrch(forwardSearch, "I-search: ");
-}
-
-/* Search regular expression backward */
-
-DEFUN(srchbak, SEARCH_BACK, "Search backward")
-{
- srch(backwardSearch, "Backward: ");
-}
-
-DEFUN(isrchbak, ISEARCH_BACK, "Incremental search backward")
-{
- isrch(backwardSearch, "I-search backward: ");
-}
-
-static void
-srch_nxtprv(int reverse)
-{
- int result;
- /* *INDENT-OFF* */
- static int (*routine[2]) (Buffer *, char *) = {
- forwardSearch, backwardSearch
- };
- /* *INDENT-ON* */
-
- if (searchRoutine == NULL) {
- /* FIXME: gettextize? */
- disp_message("No previous regular expression", TRUE);
- return;
- }
- if (reverse != 0)
- reverse = 1;
- if (searchRoutine == backwardSearch)
- reverse ^= 1;
- if (reverse == 0)
- Currentbuf->pos += 1;
- result = srchcore(SearchString, routine[reverse]);
- if (result & SR_FOUND)
- clear_mark(Currentbuf->currentLine);
- displayBuffer(Currentbuf, B_NORMAL);
- disp_srchresult(result, (reverse ? "Backward: " : "Forward: "),
- SearchString);
-}
-
-/* Search next matching */
-DEFUN(srchnxt, SEARCH_NEXT, "Search next regexp")
-{
- srch_nxtprv(0);
-}
-
-/* Search previous matching */
-DEFUN(srchprv, SEARCH_PREV, "Search previous regexp")
-{
- srch_nxtprv(1);
-}
-
-static void
-shiftvisualpos(Buffer *buf, int shift)
-{
- Line *l = buf->currentLine;
- buf->visualpos -= shift;
- if (buf->visualpos - l->bwidth >= buf->COLS)
- buf->visualpos = l->bwidth + buf->COLS - 1;
- else if (buf->visualpos - l->bwidth < 0)
- buf->visualpos = l->bwidth;
- arrangeLine(buf);
- if (buf->visualpos - l->bwidth == -shift && buf->cursorX == 0)
- buf->visualpos = l->bwidth;
-}
-
-/* Shift screen left */
-DEFUN(shiftl, SHIFT_LEFT, "Shift screen left")
-{
- int column;
-
- if (Currentbuf->firstLine == NULL)
- return;
- column = Currentbuf->currentColumn;
- columnSkip(Currentbuf, searchKeyNum() * (-Currentbuf->COLS + 1) + 1);
- shiftvisualpos(Currentbuf, Currentbuf->currentColumn - column);
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-/* Shift screen right */
-DEFUN(shiftr, SHIFT_RIGHT, "Shift screen right")
-{
- int column;
-
- if (Currentbuf->firstLine == NULL)
- return;
- column = Currentbuf->currentColumn;
- columnSkip(Currentbuf, searchKeyNum() * (Currentbuf->COLS - 1) - 1);
- shiftvisualpos(Currentbuf, Currentbuf->currentColumn - column);
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-DEFUN(col1R, RIGHT, "Shift screen one column right")
-{
- Buffer *buf = Currentbuf;
- Line *l = buf->currentLine;
- int j, column, n = searchKeyNum();
-
- if (l == NULL)
- return;
- for (j = 0; j < n; j++) {
- column = buf->currentColumn;
- columnSkip(Currentbuf, 1);
- if (column == buf->currentColumn)
- break;
- shiftvisualpos(Currentbuf, 1);
- }
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-DEFUN(col1L, LEFT, "Shift screen one column")
-{
- Buffer *buf = Currentbuf;
- Line *l = buf->currentLine;
- int j, n = searchKeyNum();
-
- if (l == NULL)
- return;
- for (j = 0; j < n; j++) {
- if (buf->currentColumn == 0)
- break;
- columnSkip(Currentbuf, -1);
- shiftvisualpos(Currentbuf, -1);
- }
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-DEFUN(setEnv, SETENV, "Set environment variable")
-{
- char *env;
- char *var, *value;
-
- CurrentKeyData = NULL; /* not allowed in w3m-control: */
- env = searchKeyData();
- if (env == NULL || *env == '\0' || strchr(env, '=') == NULL) {
- if (env != NULL && *env != '\0')
- env = Sprintf("%s=", env)->ptr;
- env = inputStrHist("Set environ: ", env, TextHist);
- if (env == NULL || *env == '\0') {
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
- }
- if ((value = strchr(env, '=')) != NULL && value > env) {
- var = allocStr(env, value - env);
- value++;
- set_environ(var, value);
- }
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-DEFUN(pipeBuf, PIPE_BUF, "Send rendered document to pipe")
-{
- Buffer *buf;
- char *cmd, *tmpf;
- FILE *f;
-
- CurrentKeyData = NULL; /* not allowed in w3m-control: */
- cmd = searchKeyData();
- if (cmd == NULL || *cmd == '\0') {
- /* FIXME: gettextize? */
- cmd = inputLineHist("Pipe buffer to: ", "", IN_COMMAND, ShellHist);
- }
- if (cmd != NULL)
- cmd = conv_to_system(cmd);
- if (cmd == NULL || *cmd == '\0') {
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
- tmpf = tmpfname(TMPF_DFL, NULL)->ptr;
- f = fopen(tmpf, "w");
- if (f == NULL) {
- /* FIXME: gettextize? */
- disp_message(Sprintf("Can't save buffer to %s", cmd)->ptr, TRUE);
- return;
- }
- saveBuffer(Currentbuf, f, TRUE);
- fclose(f);
- buf = getpipe(myExtCommand(cmd, shell_quote(tmpf), TRUE)->ptr);
- if (buf == NULL) {
- disp_message("Execution failed", TRUE);
- return;
- }
- else {
- buf->filename = cmd;
- buf->buffername = Sprintf("%s %s", PIPEBUFFERNAME,
- conv_from_system(cmd))->ptr;
- buf->bufferprop |= (BP_INTERNAL | BP_NO_URL);
- if (buf->type == NULL)
- buf->type = "text/plain";
- buf->currentURL.file = "-";
- pushBuffer(buf);
- }
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-/* Execute shell command and read output ac pipe. */
-DEFUN(pipesh, PIPE_SHELL, "Execute shell command and browse")
-{
- Buffer *buf;
- char *cmd;
-
- CurrentKeyData = NULL; /* not allowed in w3m-control: */
- cmd = searchKeyData();
- if (cmd == NULL || *cmd == '\0') {
- cmd = inputLineHist("(read shell[pipe])!", "", IN_COMMAND, ShellHist);
- }
- if (cmd != NULL)
- cmd = conv_to_system(cmd);
- if (cmd == NULL || *cmd == '\0') {
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
- buf = getpipe(cmd);
- if (buf == NULL) {
- disp_message("Execution failed", TRUE);
- return;
- }
- else {
- buf->bufferprop |= (BP_INTERNAL | BP_NO_URL);
- if (buf->type == NULL)
- buf->type = "text/plain";
- pushBuffer(buf);
- }
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-/* Execute shell command and load entire output to buffer */
-DEFUN(readsh, READ_SHELL, "Execute shell command and load")
-{
- Buffer *buf;
- MySignalHandler(*prevtrap) ();
- char *cmd;
-
- CurrentKeyData = NULL; /* not allowed in w3m-control: */
- cmd = searchKeyData();
- if (cmd == NULL || *cmd == '\0') {
- cmd = inputLineHist("(read shell)!", "", IN_COMMAND, ShellHist);
- }
- if (cmd != NULL)
- cmd = conv_to_system(cmd);
- if (cmd == NULL || *cmd == '\0') {
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
- prevtrap = mySignal(SIGINT, intTrap);
- crmode();
- buf = getshell(cmd);
- mySignal(SIGINT, prevtrap);
- term_raw();
- if (buf == NULL) {
- /* FIXME: gettextize? */
- disp_message("Execution failed", TRUE);
- return;
- }
- else {
- buf->bufferprop |= (BP_INTERNAL | BP_NO_URL);
- if (buf->type == NULL)
- buf->type = "text/plain";
- pushBuffer(buf);
- }
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-/* Execute shell command */
-DEFUN(execsh, EXEC_SHELL SHELL, "Execute shell command")
-{
- char *cmd;
-
- CurrentKeyData = NULL; /* not allowed in w3m-control: */
- cmd = searchKeyData();
- if (cmd == NULL || *cmd == '\0') {
- cmd = inputLineHist("(exec shell)!", "", IN_COMMAND, ShellHist);
- }
- if (cmd != NULL)
- cmd = conv_to_system(cmd);
- if (cmd != NULL && *cmd != '\0') {
- fmTerm();
- printf("\n");
- system(cmd);
- /* FIXME: gettextize? */
- printf("\n[Hit any key]");
- fflush(stdout);
- fmInit();
- getch();
- }
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-/* Load file */
-DEFUN(ldfile, LOAD, "Load local file")
-{
- char *fn;
-
- fn = searchKeyData();
- if (fn == NULL || *fn == '\0') {
- /* FIXME: gettextize? */
- fn = inputFilenameHist("(Load)Filename? ", NULL, LoadHist);
- }
- if (fn != NULL)
- fn = conv_to_system(fn);
- if (fn == NULL || *fn == '\0') {
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
- cmd_loadfile(fn);
-}
-
-/* Load help file */
-DEFUN(ldhelp, HELP, "View help")
-{
-#ifdef USE_HELP_CGI
- char *lang;
- int n;
- Str tmp;
-
- lang = AcceptLang;
- n = strcspn(lang, ";, \t");
- tmp = Sprintf("file:///$LIB/" HELP_CGI CGI_EXTENSION "?version=%s&lang=%s",
- Str_form_quote(Strnew_charp(w3m_version))->ptr,
- Str_form_quote(Strnew_charp_n(lang, n))->ptr);
- cmd_loadURL(tmp->ptr, NULL, NO_REFERER, NULL);
-#else
- cmd_loadURL(helpFile(HELP_FILE), NULL, NO_REFERER, NULL);
-#endif
-}
-
-static void
-cmd_loadfile(char *fn)
-{
- Buffer *buf;
-
- buf = loadGeneralFile(file_to_url(fn), NULL, NO_REFERER, 0, NULL);
- if (buf == NULL) {
- /* FIXME: gettextize? */
- char *emsg = Sprintf("%s not found", conv_from_system(fn))->ptr;
- disp_err_message(emsg, FALSE);
- }
- else if (buf != NO_BUFFER) {
- pushBuffer(buf);
- if (RenderFrame && Currentbuf->frameset != NULL)
- rFrame();
- }
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-/* Move cursor left */
-static void
-_movL(int n)
-{
- int i, m = searchKeyNum();
- if (Currentbuf->firstLine == NULL)
- return;
- for (i = 0; i < m; i++)
- cursorLeft(Currentbuf, n);
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-DEFUN(movL, MOVE_LEFT,
- "Move cursor left (a half screen shift at the left edge)")
-{
- _movL(Currentbuf->COLS / 2);
-}
-
-DEFUN(movL1, MOVE_LEFT1, "Move cursor left (1 columns shift at the left edge)")
-{
- _movL(1);
-}
-
-/* Move cursor downward */
-static void
-_movD(int n)
-{
- int i, m = searchKeyNum();
- if (Currentbuf->firstLine == NULL)
- return;
- for (i = 0; i < m; i++)
- cursorDown(Currentbuf, n);
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-DEFUN(movD, MOVE_DOWN,
- "Move cursor down (a half screen scroll at the end of screen)")
-{
- _movD((Currentbuf->LINES + 1) / 2);
-}
-
-DEFUN(movD1, MOVE_DOWN1,
- "Move cursor down (1 line scroll at the end of screen)")
-{
- _movD(1);
-}
-
-/* move cursor upward */
-static void
-_movU(int n)
-{
- int i, m = searchKeyNum();
- if (Currentbuf->firstLine == NULL)
- return;
- for (i = 0; i < m; i++)
- cursorUp(Currentbuf, n);
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-DEFUN(movU, MOVE_UP,
- "Move cursor up (a half screen scroll at the top of screen)")
-{
- _movU((Currentbuf->LINES + 1) / 2);
-}
-
-DEFUN(movU1, MOVE_UP1, "Move cursor up (1 line scrol at the top of screen)")
-{
- _movU(1);
-}
-
-/* Move cursor right */
-static void
-_movR(int n)
-{
- int i, m = searchKeyNum();
- if (Currentbuf->firstLine == NULL)
- return;
- for (i = 0; i < m; i++)
- cursorRight(Currentbuf, n);
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-DEFUN(movR, MOVE_RIGHT,
- "Move cursor right (a half screen shift at the right edge)")
-{
- _movR(Currentbuf->COLS / 2);
-}
-
-DEFUN(movR1, MOVE_RIGHT1,
- "Move cursor right (1 columns shift at the right edge)")
-{
- _movR(1);
-}
-
-/* movLW, movRW */
-/*
- * From: Takashi Nishimoto <g96p0935@mse.waseda.ac.jp> Date: Mon, 14 Jun
- * 1999 09:29:56 +0900
- */
-#define IS_WORD_CHAR(c,p) (IS_ALNUM(c) && CharType(p) == PC_ASCII)
-
-static int
-prev_nonnull_line(Line *line)
-{
- Line *l;
-
- for (l = line; l != NULL && l->len == 0; l = l->prev) ;
- if (l == NULL || l->len == 0)
- return -1;
-
- Currentbuf->currentLine = l;
- if (l != line)
- Currentbuf->pos = Currentbuf->currentLine->len;
- return 0;
-}
-
-DEFUN(movLW, PREV_WORD, "Move to previous word")
-{
- char *lb;
- Lineprop *pb;
- Line *pline;
- int ppos;
- int i, n = searchKeyNum();
-
- if (Currentbuf->firstLine == NULL)
- return;
-
- for (i = 0; i < n; i++) {
- pline = Currentbuf->currentLine;
- ppos = Currentbuf->pos;
-
- if (prev_nonnull_line(Currentbuf->currentLine) < 0)
- goto end;
-
- while (1) {
- lb = Currentbuf->currentLine->lineBuf;
- pb = Currentbuf->currentLine->propBuf;
- while (Currentbuf->pos > 0 &&
- !IS_WORD_CHAR(lb[Currentbuf->pos - 1],
- pb[Currentbuf->pos - 1])) {
- Currentbuf->pos--;
- }
- if (Currentbuf->pos > 0)
- break;
- if (prev_nonnull_line(Currentbuf->currentLine->prev) < 0) {
- Currentbuf->currentLine = pline;
- Currentbuf->pos = ppos;
- goto end;
- }
- Currentbuf->pos = Currentbuf->currentLine->len;
- }
-
- lb = Currentbuf->currentLine->lineBuf;
- pb = Currentbuf->currentLine->propBuf;
- while (Currentbuf->pos > 0 &&
- IS_WORD_CHAR(lb[Currentbuf->pos - 1],
- pb[Currentbuf->pos - 1])) {
- Currentbuf->pos--;
- }
- }
- end:
- arrangeCursor(Currentbuf);
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-static int
-next_nonnull_line(Line *line)
-{
- Line *l;
-
- for (l = line; l != NULL && l->len == 0; l = l->next) ;
-
- if (l == NULL || l->len == 0)
- return -1;
-
- Currentbuf->currentLine = l;
- if (l != line)
- Currentbuf->pos = 0;
- return 0;
-}
-
-DEFUN(movRW, NEXT_WORD, "Move to next word")
-{
- char *lb;
- Lineprop *pb;
- Line *pline;
- int ppos;
- int i, n = searchKeyNum();
-
- if (Currentbuf->firstLine == NULL)
- return;
-
- for (i = 0; i < n; i++) {
- pline = Currentbuf->currentLine;
- ppos = Currentbuf->pos;
-
- if (next_nonnull_line(Currentbuf->currentLine) < 0)
- goto end;
-
- lb = Currentbuf->currentLine->lineBuf;
- pb = Currentbuf->currentLine->propBuf;
-
- while (lb[Currentbuf->pos] &&
- IS_WORD_CHAR(lb[Currentbuf->pos], pb[Currentbuf->pos]))
- Currentbuf->pos++;
-
- while (1) {
- while (lb[Currentbuf->pos] &&
- !IS_WORD_CHAR(lb[Currentbuf->pos], pb[Currentbuf->pos]))
- Currentbuf->pos++;
- if (lb[Currentbuf->pos])
- break;
- if (next_nonnull_line(Currentbuf->currentLine->next) < 0) {
- Currentbuf->currentLine = pline;
- Currentbuf->pos = ppos;
- goto end;
- }
- Currentbuf->pos = 0;
- lb = Currentbuf->currentLine->lineBuf;
- pb = Currentbuf->currentLine->propBuf;
- }
- }
- end:
- arrangeCursor(Currentbuf);
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-static void
-_quitfm(int confirm)
-{
- char *ans = "y";
-
- if (checkDownloadList())
- /* FIXME: gettextize? */
- ans = inputChar("Download process retains. "
- "Do you want to exit w3m? (y/n)");
- else if (confirm)
- /* FIXME: gettextize? */
- ans = inputChar("Do you want to exit w3m? (y/n)");
- if (!(ans && TOLOWER(*ans) == 'y')) {
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
-
- term_title(""); /* XXX */
-#ifdef USE_IMAGE
- if (activeImage)
- termImage();
-#endif
- fmTerm();
-#ifdef USE_COOKIE
- save_cookies();
-#endif /* USE_COOKIE */
-#ifdef USE_HISTORY
- if (UseHistory && SaveURLHist)
- saveHistory(URLHist, URLHistSize);
-#endif /* USE_HISTORY */
- w3m_exit(0);
-}
-
-/* Quit */
-DEFUN(quitfm, ABORT EXIT, "Quit w3m without confirmation")
-{
- _quitfm(FALSE);
-}
-
-/* Question and Quit */
-DEFUN(qquitfm, QUIT, "Quit w3m")
-{
- _quitfm(confirm_on_quit);
-}
-
-/* Select buffer */
-DEFUN(selBuf, SELECT, "Go to buffer selection panel")
-{
- Buffer *buf;
- int ok;
- char cmd;
-
- ok = FALSE;
- do {
- buf = selectBuffer(Firstbuf, Currentbuf, &cmd);
- switch (cmd) {
- case 'B':
- ok = TRUE;
- break;
- case '\n':
- case ' ':
- Currentbuf = buf;
- ok = TRUE;
- break;
- case 'D':
- delBuffer(buf);
- if (Firstbuf == NULL) {
- /* No more buffer */
- Firstbuf = nullBuffer();
- Currentbuf = Firstbuf;
- }
- break;
- case 'q':
- qquitfm();
- break;
- case 'Q':
- quitfm();
- break;
- }
- } while (!ok);
-
- for (buf = Firstbuf; buf != NULL; buf = buf->nextBuffer) {
- if (buf == Currentbuf)
- continue;
-#ifdef USE_IMAGE
- deleteImage(buf);
-#endif
- if (clear_buffer)
- tmpClearBuffer(buf);
- }
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-/* Suspend (on BSD), or run interactive shell (on SysV) */
-DEFUN(susp, INTERRUPT SUSPEND, "Stop loading document")
-{
-#ifndef SIGSTOP
- char *shell;
-#endif /* not SIGSTOP */
- move(LASTLINE, 0);
- clrtoeolx();
- refresh();
- fmTerm();
-#ifndef SIGSTOP
- shell = getenv("SHELL");
- if (shell == NULL)
- shell = "/bin/sh";
- system(shell);
-#else /* SIGSTOP */
- kill((pid_t) 0, SIGSTOP);
-#endif /* SIGSTOP */
- fmInit();
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-/* Go to specified line */
-static void
-_goLine(char *l)
-{
- if (l == NULL || *l == '\0' || Currentbuf->currentLine == NULL) {
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
- return;
- }
- Currentbuf->pos = 0;
- if (((*l == '^') || (*l == '$')) && prec_num) {
- gotoRealLine(Currentbuf, prec_num);
- }
- else if (*l == '^') {
- Currentbuf->topLine = Currentbuf->currentLine = Currentbuf->firstLine;
- }
- else if (*l == '$') {
- Currentbuf->topLine =
- lineSkip(Currentbuf, Currentbuf->lastLine,
- -(Currentbuf->LINES + 1) / 2, TRUE);
- Currentbuf->currentLine = Currentbuf->lastLine;
- }
- else
- gotoRealLine(Currentbuf, atoi(l));
- arrangeCursor(Currentbuf);
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-DEFUN(goLine, GOTO_LINE, "Go to specified line")
-{
-
- char *str = searchKeyData();
- if (prec_num)
- _goLine("^");
- else if (str)
- _goLine(str);
- else
- /* FIXME: gettextize? */
- _goLine(inputStr("Goto line: ", ""));
-}
-
-
-DEFUN(goLineF, BEGIN, "Go to the first line")
-{
- _goLine("^");
-}
-
-DEFUN(goLineL, END, "Go to the last line")
-{
- _goLine("$");
-}
-
-/* Go to the beginning of the line */
-DEFUN(linbeg, LINE_BEGIN, "Go to the beginning of line")
-{
- if (Currentbuf->firstLine == NULL)
- return;
- while (Currentbuf->currentLine->prev && Currentbuf->currentLine->bpos)
- cursorUp0(Currentbuf, 1);
- Currentbuf->pos = 0;
- arrangeCursor(Currentbuf);
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-/* Go to the bottom of the line */
-DEFUN(linend, LINE_END, "Go to the end of line")
-{
- if (Currentbuf->firstLine == NULL)
- return;
- while (Currentbuf->currentLine->next
- && Currentbuf->currentLine->next->bpos)
- cursorDown0(Currentbuf, 1);
- Currentbuf->pos = Currentbuf->currentLine->len - 1;
- arrangeCursor(Currentbuf);
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-static int
-cur_real_linenumber(Buffer *buf)
-{
- Line *l, *cur = buf->currentLine;
- int n;
-
- if (!cur)
- return 1;
- n = cur->real_linenumber ? cur->real_linenumber : 1;
- for (l = buf->firstLine; l && l != cur && l->real_linenumber == 0; l = l->next) { /* header */
- if (l->bpos == 0)
- n++;
- }
- return n;
-}
-
-/* Run editor on the current buffer */
-DEFUN(editBf, EDIT, "Edit current document")
-{
- char *fn = Currentbuf->filename;
- Str cmd;
-
- if (fn == NULL || Currentbuf->pagerSource != NULL || /* Behaving as a pager */
- (Currentbuf->type == NULL && Currentbuf->edit == NULL) || /* Reading shell */
- Currentbuf->real_scheme != SCM_LOCAL || !strcmp(Currentbuf->currentURL.file, "-") || /* file is std input */
- Currentbuf->bufferprop & BP_FRAME) { /* Frame */
- disp_err_message("Can't edit other than local file", TRUE);
- return;
- }
- if (Currentbuf->edit)
- cmd = unquote_mailcap(Currentbuf->edit, Currentbuf->real_type, fn,
- checkHeader(Currentbuf, "Content-Type:"), NULL);
- else
- cmd = myEditor(Editor, shell_quote(fn),
- cur_real_linenumber(Currentbuf));
- fmTerm();
- system(cmd->ptr);
- fmInit();
-
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
- reload();
-}
-
-/* Run editor on the current screen */
-DEFUN(editScr, EDIT_SCREEN, "Edit currently rendered document")
-{
- char *tmpf;
- FILE *f;
-
- tmpf = tmpfname(TMPF_DFL, NULL)->ptr;
- f = fopen(tmpf, "w");
- if (f == NULL) {
- /* FIXME: gettextize? */
- disp_err_message(Sprintf("Can't open %s", tmpf)->ptr, TRUE);
- return;
- }
- saveBuffer(Currentbuf, f, TRUE);
- fclose(f);
- fmTerm();
- system(myEditor(Editor, shell_quote(tmpf),
- cur_real_linenumber(Currentbuf))->ptr);
- fmInit();
- unlink(tmpf);
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-#ifdef USE_MARK
-
-/* Set / unset mark */
-DEFUN(_mark, MARK, "Set/unset mark")
-{
- Line *l;
- if (!use_mark)
- return;
- if (Currentbuf->firstLine == NULL)
- return;
- l = Currentbuf->currentLine;
- l->propBuf[Currentbuf->pos] ^= PE_MARK;
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-/* Go to next mark */
-DEFUN(nextMk, NEXT_MARK, "Move to next word")
-{
- Line *l;
- int i;
-
- if (!use_mark)
- return;
- if (Currentbuf->firstLine == NULL)
- return;
- i = Currentbuf->pos + 1;
- l = Currentbuf->currentLine;
- if (i >= l->len) {
- i = 0;
- l = l->next;
- }
- while (l != NULL) {
- for (; i < l->len; i++) {
- if (l->propBuf[i] & PE_MARK) {
- Currentbuf->currentLine = l;
- Currentbuf->pos = i;
- arrangeCursor(Currentbuf);
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
- }
- l = l->next;
- i = 0;
- }
- /* FIXME: gettextize? */
- disp_message("No mark exist after here", TRUE);
-}
-
-/* Go to previous mark */
-DEFUN(prevMk, PREV_MARK, "Move to previous mark")
-{
- Line *l;
- int i;
-
- if (!use_mark)
- return;
- if (Currentbuf->firstLine == NULL)
- return;
- i = Currentbuf->pos - 1;
- l = Currentbuf->currentLine;
- if (i < 0) {
- l = l->prev;
- if (l != NULL)
- i = l->len - 1;
- }
- while (l != NULL) {
- for (; i >= 0; i--) {
- if (l->propBuf[i] & PE_MARK) {
- Currentbuf->currentLine = l;
- Currentbuf->pos = i;
- arrangeCursor(Currentbuf);
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
- }
- l = l->prev;
- if (l != NULL)
- i = l->len - 1;
- }
- /* FIXME: gettextize? */
- disp_message("No mark exist before here", TRUE);
-}
-
-/* Mark place to which the regular expression matches */
-DEFUN(reMark, REG_MARK, "Set mark using regexp")
-{
- Line *l;
- char *str;
- char *p, *p1, *p2;
-
- if (!use_mark)
- return;
- str = searchKeyData();
- if (str == NULL || *str == '\0') {
- str = inputStrHist("(Mark)Regexp: ", MarkString, TextHist);
- if (str == NULL || *str == '\0') {
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
- }
- str = conv_search_string(str, DisplayCharset);
- if ((str = regexCompile(str, 1)) != NULL) {
- disp_message(str, TRUE);
- return;
- }
- MarkString = str;
- for (l = Currentbuf->firstLine; l != NULL; l = l->next) {
- p = l->lineBuf;
- for (;;) {
- if (regexMatch(p, &l->lineBuf[l->len] - p, p == l->lineBuf) == 1) {
- matchedPosition(&p1, &p2);
- l->propBuf[p1 - l->lineBuf] |= PE_MARK;
- p = p2;
- }
- else
- break;
- }
- }
-
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-#endif /* USE_MARK */
-
-static Buffer *
-loadNormalBuf(Buffer *buf, int renderframe)
-{
- pushBuffer(buf);
- if (renderframe && RenderFrame && Currentbuf->frameset != NULL)
- rFrame();
- return buf;
-}
-
-static Buffer *
-loadLink(char *url, char *target, char *referer, FormList *request)
-{
- Buffer *buf, *nfbuf;
- union frameset_element *f_element = NULL;
- int flag = 0;
- ParsedURL *base, pu;
-
- message(Sprintf("loading %s", url)->ptr, 0, 0);
- refresh();
-
- base = baseURL(Currentbuf);
- if (base == NULL ||
- base->scheme == SCM_LOCAL || base->scheme == SCM_LOCAL_CGI)
- referer = NO_REFERER;
- if (referer == NULL)
- referer = parsedURL2Str(&Currentbuf->currentURL)->ptr;
- buf = loadGeneralFile(url, baseURL(Currentbuf), referer, flag, request);
- if (buf == NULL) {
- char *emsg = Sprintf("Can't load %s", url)->ptr;
- disp_err_message(emsg, FALSE);
- return NULL;
- }
-
- parseURL2(url, &pu, base);
- pushHashHist(URLHist, parsedURL2Str(&pu)->ptr);
-
- if (buf == NO_BUFFER) {
- return NULL;
- }
- if (!on_target) /* open link as an indivisual page */
- return loadNormalBuf(buf, TRUE);
-
- if (do_download) /* download (thus no need to render frame) */
- return loadNormalBuf(buf, FALSE);
-
- if (target == NULL || /* no target specified (that means this page is not a frame page) */
- !strcmp(target, "_top") || /* this link is specified to be opened as an indivisual * page */
- !(Currentbuf->bufferprop & BP_FRAME) /* This page is not a frame page */
- ) {
- return loadNormalBuf(buf, TRUE);
- }
- nfbuf = Currentbuf->linkBuffer[LB_N_FRAME];
- if (nfbuf == NULL) {
- /* original page (that contains <frameset> tag) doesn't exist */
- return loadNormalBuf(buf, TRUE);
- }
-
- f_element = search_frame(nfbuf->frameset, target);
- if (f_element == NULL) {
- /* specified target doesn't exist in this frameset */
- return loadNormalBuf(buf, TRUE);
- }
-
- /* frame page */
-
- /* stack current frameset */
- pushFrameTree(&(nfbuf->frameQ), copyFrameSet(nfbuf->frameset), Currentbuf);
- /* delete frame view buffer */
- delBuffer(Currentbuf);
- Currentbuf = nfbuf;
- /* nfbuf->frameset = copyFrameSet(nfbuf->frameset); */
- resetFrameElement(f_element, buf, referer, request);
- discardBuffer(buf);
- rFrame();
- {
- Anchor *al = NULL;
- char *label = pu.label;
-
- if (label && f_element->element->attr == F_BODY) {
- al = searchAnchor(f_element->body->nameList, label);
- }
- if (!al) {
- label = Strnew_m_charp("_", target, NULL)->ptr;
- al = searchURLLabel(Currentbuf, label);
- }
- if (al) {
- gotoLine(Currentbuf, al->start.line);
- if (label_topline)
- Currentbuf->topLine = lineSkip(Currentbuf, Currentbuf->topLine,
- Currentbuf->currentLine->
- linenumber -
- Currentbuf->topLine->linenumber,
- FALSE);
- Currentbuf->pos = al->start.pos;
- arrangeCursor(Currentbuf);
- }
- }
- displayBuffer(Currentbuf, B_NORMAL);
- return buf;
-}
-
-static void
-gotoLabel(char *label)
-{
- Buffer *buf;
- Anchor *al;
- int i;
-
- al = searchURLLabel(Currentbuf, label);
- if (al == NULL) {
- /* FIXME: gettextize? */
- disp_message(Sprintf("%s is not found", label)->ptr, TRUE);
- return;
- }
- buf = newBuffer(Currentbuf->width);
- copyBuffer(buf, Currentbuf);
- for (i = 0; i < MAX_LB; i++)
- buf->linkBuffer[i] = NULL;
- buf->currentURL.label = allocStr(label, -1);
- pushHashHist(URLHist, parsedURL2Str(&buf->currentURL)->ptr);
- (*buf->clone)++;
- pushBuffer(buf);
- gotoLine(Currentbuf, al->start.line);
- if (label_topline)
- Currentbuf->topLine = lineSkip(Currentbuf, Currentbuf->topLine,
- Currentbuf->currentLine->linenumber
- - Currentbuf->topLine->linenumber,
- FALSE);
- Currentbuf->pos = al->start.pos;
- arrangeCursor(Currentbuf);
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
- return;
-}
-
-/* follow HREF link */
-DEFUN(followA, GOTO_LINK, "Go to current link")
-{
- Line *l;
- Anchor *a;
- ParsedURL u;
-#ifdef USE_IMAGE
- int x = 0, y = 0, map = 0;
-#endif
- char *url;
-
- if (Currentbuf->firstLine == NULL)
- return;
- l = Currentbuf->currentLine;
-
-#ifdef USE_IMAGE
- a = retrieveCurrentImg(Currentbuf);
- if (a && a->image && a->image->map) {
- _followForm(FALSE);
- return;
- }
- if (a && a->image && a->image->ismap) {
- getMapXY(Currentbuf, a, &x, &y);
- map = 1;
- }
-#else
- a = retrieveCurrentMap(Currentbuf);
- if (a) {
- _followForm(FALSE);
- return;
- }
-#endif
- a = retrieveCurrentAnchor(Currentbuf);
- if (a == NULL) {
- _followForm(FALSE);
- return;
- }
- if (*a->url == '#') { /* index within this buffer */
- gotoLabel(a->url + 1);
- return;
- }
- parseURL2(a->url, &u, baseURL(Currentbuf));
- if (Strcmp(parsedURL2Str(&u), parsedURL2Str(&Currentbuf->currentURL)) == 0) {
- /* index within this buffer */
- if (u.label) {
- gotoLabel(u.label);
- return;
- }
- }
- if (!strncasecmp(a->url, "mailto:", 7)
-#ifdef USE_W3MMAILER
- && non_null(Mailer) && strchr(a->url, '?') == NULL
-#endif
- ) {
- /* invoke external mailer */
- Str to = Strnew_charp(a->url + 7);
-#ifndef USE_W3MMAILER
- char *pos;
- if (!non_null(Mailer)) {
- /* FIXME: gettextize? */
- disp_err_message("no mailer is specified", TRUE);
- return;
- }
- if ((pos = strchr(to->ptr, '?')) != NULL)
- Strtruncate(to, pos - to->ptr);
-#endif
- fmTerm();
- system(myExtCommand(Mailer, shell_quote(file_unquote(to->ptr)),
- FALSE)->ptr);
- fmInit();
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
- pushHashHist(URLHist, a->url);
- return;
- }
-#if 0
- else if (!strncasecmp(a->url, "news:", 5) && strchr(a->url, '@') == NULL) {
- /* news:newsgroup is not supported */
- /* FIXME: gettextize? */
- disp_err_message("news:newsgroup_name is not supported", TRUE);
- return;
- }
-#endif /* USE_NNTP */
- url = a->url;
-#ifdef USE_IMAGE
- if (map)
- url = Sprintf("%s?%d,%d", a->url, x, y)->ptr;
-#endif
-
- if (check_target && open_tab_blank && a->target &&
- (!strcasecmp(a->target, "_new") || !strcasecmp(a->target, "_blank"))) {
- Buffer *buf;
-
- _newT();
- buf = Currentbuf;
- loadLink(url, a->target, a->referer, NULL);
- if (buf != Currentbuf)
- delBuffer(buf);
- else
- deleteTab(CurrentTab);
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
- return;
- }
- loadLink(url, a->target, a->referer, NULL);
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-/* follow HREF link in the buffer */
-void
-bufferA(void)
-{
- on_target = FALSE;
- followA();
- on_target = TRUE;
-}
-
-/* view inline image */
-DEFUN(followI, VIEW_IMAGE, "View image")
-{
- Line *l;
- Anchor *a;
- Buffer *buf;
-
- if (Currentbuf->firstLine == NULL)
- return;
- l = Currentbuf->currentLine;
-
- a = retrieveCurrentImg(Currentbuf);
- if (a == NULL)
- return;
- /* FIXME: gettextize? */
- message(Sprintf("loading %s", a->url)->ptr, 0, 0);
- refresh();
- buf = loadGeneralFile(a->url, baseURL(Currentbuf), NULL, 0, NULL);
- if (buf == NULL) {
- /* FIXME: gettextize? */
- char *emsg = Sprintf("Can't load %s", a->url)->ptr;
- disp_err_message(emsg, FALSE);
- }
- else if (buf != NO_BUFFER) {
- pushBuffer(buf);
- }
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-static FormItemList *
-save_submit_formlist(FormItemList *src)
-{
- FormList *list;
- FormList *srclist;
- FormItemList *srcitem;
- FormItemList *item;
- FormItemList *ret = NULL;
-#ifdef MENU_SELECT
- FormSelectOptionItem *opt;
- FormSelectOptionItem *curopt;
- FormSelectOptionItem *srcopt;
-#endif /* MENU_SELECT */
-
- if (src == NULL)
- return NULL;
- srclist = src->parent;
- list = New(FormList);
- list->method = srclist->method;
- list->action = Strdup(srclist->action);
-#ifdef USE_M17N
- list->charset = srclist->charset;
-#endif
- list->enctype = srclist->enctype;
- list->nitems = srclist->nitems;
- list->body = srclist->body;
- list->boundary = srclist->boundary;
- list->length = srclist->length;
-
- for (srcitem = srclist->item; srcitem; srcitem = srcitem->next) {
- item = New(FormItemList);
- item->type = srcitem->type;
- item->name = Strdup(srcitem->name);
- item->value = Strdup(srcitem->value);
- item->checked = srcitem->checked;
- item->accept = srcitem->accept;
- item->size = srcitem->size;
- item->rows = srcitem->rows;
- item->maxlength = srcitem->maxlength;
- item->readonly = srcitem->readonly;
-#ifdef MENU_SELECT
- opt = curopt = NULL;
- for (srcopt = srcitem->select_option; srcopt; srcopt = srcopt->next) {
- if (!srcopt->checked)
- continue;
- opt = New(FormSelectOptionItem);
- opt->value = Strdup(srcopt->value);
- opt->label = Strdup(srcopt->label);
- opt->checked = srcopt->checked;
- if (item->select_option == NULL) {
- item->select_option = curopt = opt;
- }
- else {
- curopt->next = opt;
- curopt = curopt->next;
- }
- }
- item->select_option = opt;
- if (srcitem->label)
- item->label = Strdup(srcitem->label);
-#endif /* MENU_SELECT */
- item->parent = list;
- item->next = NULL;
-
- if (list->lastitem == NULL) {
- list->item = list->lastitem = item;
- }
- else {
- list->lastitem->next = item;
- list->lastitem = item;
- }
-
- if (srcitem == src)
- ret = item;
- }
-
- return ret;
-}
-
-#ifdef USE_M17N
-static Str
-conv_form_encoding(Str val, FormItemList *fi, Buffer *buf)
-{
- wc_ces charset = SystemCharset;
-
- if (fi->parent->charset)
- charset = fi->parent->charset;
- else if (buf->document_charset && buf->document_charset != WC_CES_US_ASCII)
- charset = buf->document_charset;
- return wc_Str_conv_strict(val, InnerCharset, charset);
-}
-#else
-#define conv_form_encoding(val, fi, buf) (val)
-#endif
-
-static void
-query_from_followform(Str *query, FormItemList *fi, int multipart)
-{
- FormItemList *f2;
- FILE *body = NULL;
-
- if (multipart) {
- *query = tmpfname(TMPF_DFL, NULL);
- body = fopen((*query)->ptr, "w");
- if (body == NULL) {
- return;
- }
- fi->parent->body = (*query)->ptr;
- fi->parent->boundary =
- Sprintf("------------------------------%d%ld%ld%ld", CurrentPid,
- fi->parent, fi->parent->body, fi->parent->boundary)->ptr;
- }
- *query = Strnew();
- for (f2 = fi->parent->item; f2; f2 = f2->next) {
- if (f2->name == NULL)
- continue;
- /* <ISINDEX> is translated into single text form */
- if (f2->name->length == 0 &&
- (multipart || f2->type != FORM_INPUT_TEXT))
- continue;
- switch (f2->type) {
- case FORM_INPUT_RESET:
- /* do nothing */
- continue;
- case FORM_INPUT_SUBMIT:
- case FORM_INPUT_IMAGE:
- if (f2 != fi || f2->value == NULL)
- continue;
- break;
- case FORM_INPUT_RADIO:
- case FORM_INPUT_CHECKBOX:
- if (!f2->checked)
- continue;
- }
- if (multipart) {
- if (f2->type == FORM_INPUT_IMAGE) {
- int x = 0, y = 0;
-#ifdef USE_IMAGE
- getMapXY(Currentbuf, retrieveCurrentImg(Currentbuf), &x, &y);
-#endif
- *query = Strdup(conv_form_encoding(f2->name, fi, Currentbuf));
- Strcat_charp(*query, ".x");
- form_write_data(body, fi->parent->boundary, (*query)->ptr,
- Sprintf("%d", x)->ptr);
- *query = Strdup(conv_form_encoding(f2->name, fi, Currentbuf));
- Strcat_charp(*query, ".y");
- form_write_data(body, fi->parent->boundary, (*query)->ptr,
- Sprintf("%d", y)->ptr);
- }
- else if (f2->name && f2->name->length > 0 && f2->value != NULL) {
- /* not IMAGE */
- *query = conv_form_encoding(f2->value, fi, Currentbuf);
- if (f2->type == FORM_INPUT_FILE)
- form_write_from_file(body, fi->parent->boundary,
- conv_form_encoding(f2->name, fi,
- Currentbuf)->ptr,
- (*query)->ptr,
- Str_conv_to_system(f2->value)->ptr);
- else
- form_write_data(body, fi->parent->boundary,
- conv_form_encoding(f2->name, fi,
- Currentbuf)->ptr,
- (*query)->ptr);
- }
- }
- else {
- /* not multipart */
- if (f2->type == FORM_INPUT_IMAGE) {
- int x = 0, y = 0;
-#ifdef USE_IMAGE
- getMapXY(Currentbuf, retrieveCurrentImg(Currentbuf), &x, &y);
-#endif
- Strcat(*query,
- Str_form_quote(conv_form_encoding
- (f2->name, fi, Currentbuf)));
- Strcat(*query, Sprintf(".x=%d&", x));
- Strcat(*query,
- Str_form_quote(conv_form_encoding
- (f2->name, fi, Currentbuf)));
- Strcat(*query, Sprintf(".y=%d", y));
- }
- else {
- /* not IMAGE */
- if (f2->name && f2->name->length > 0) {
- Strcat(*query,
- Str_form_quote(conv_form_encoding
- (f2->name, fi, Currentbuf)));
- Strcat_char(*query, '=');
- }
- if (f2->value != NULL) {
- if (fi->parent->method == FORM_METHOD_INTERNAL)
- Strcat(*query, Str_form_quote(f2->value));
- else {
- Strcat(*query,
- Str_form_quote(conv_form_encoding
- (f2->value, fi, Currentbuf)));
- }
- }
- }
- if (f2->next)
- Strcat_char(*query, '&');
- }
- }
- if (multipart) {
- fprintf(body, "--%s--\r\n", fi->parent->boundary);
- fclose(body);
- }
- else {
- /* remove trailing & */
- while (Strlastchar(*query) == '&')
- Strshrink(*query, 1);
- }
-}
-
-/* submit form */
-DEFUN(submitForm, SUBMIT, "Submit form")
-{
- _followForm(TRUE);
-}
-
-/* process form */
-void
-followForm(void)
-{
- _followForm(FALSE);
-}
-
-static void
-_followForm(int submit)
-{
- Line *l;
- Anchor *a, *a2;
- char *p;
- FormItemList *fi, *f2;
- Str tmp, tmp2;
- int multipart = 0, i;
-
- if (Currentbuf->firstLine == NULL)
- return;
- l = Currentbuf->currentLine;
-
- a = retrieveCurrentForm(Currentbuf);
- if (a == NULL)
- return;
- fi = (FormItemList *)a->url;
- switch (fi->type) {
- case FORM_INPUT_TEXT:
- if (submit)
- goto do_submit;
- if (fi->readonly)
- /* FIXME: gettextize? */
- disp_message_nsec("Read only field!", FALSE, 1, TRUE, FALSE);
- /* FIXME: gettextize? */
- p = inputStrHist("TEXT:", fi->value ? fi->value->ptr : NULL, TextHist);
- if (p == NULL || fi->readonly)
- break;
- fi->value = Strnew_charp(p);
- formUpdateBuffer(a, Currentbuf, fi);
- if (fi->accept || fi->parent->nitems == 1)
- goto do_submit;
- break;
- case FORM_INPUT_FILE:
- if (submit)
- goto do_submit;
- if (fi->readonly)
- /* FIXME: gettextize? */
- disp_message_nsec("Read only field!", FALSE, 1, TRUE, FALSE);
- /* FIXME: gettextize? */
- p = inputFilenameHist("Filename:", fi->value ? fi->value->ptr : NULL,
- NULL);
- if (p == NULL || fi->readonly)
- break;
- fi->value = Strnew_charp(p);
- formUpdateBuffer(a, Currentbuf, fi);
- if (fi->accept || fi->parent->nitems == 1)
- goto do_submit;
- break;
- case FORM_INPUT_PASSWORD:
- if (submit)
- goto do_submit;
- if (fi->readonly) {
- /* FIXME: gettextize? */
- disp_message_nsec("Read only field!", FALSE, 1, TRUE, FALSE);
- break;
- }
- /* FIXME: gettextize? */
- p = inputLine("Password:", fi->value ? fi->value->ptr : NULL,
- IN_PASSWORD);
- if (p == NULL)
- break;
- fi->value = Strnew_charp(p);
- formUpdateBuffer(a, Currentbuf, fi);
- if (fi->accept)
- goto do_submit;
- break;
- case FORM_TEXTAREA:
- if (submit)
- goto do_submit;
- if (fi->readonly)
- /* FIXME: gettextize? */
- disp_message_nsec("Read only field!", FALSE, 1, TRUE, FALSE);
- input_textarea(fi);
- formUpdateBuffer(a, Currentbuf, fi);
- break;
- case FORM_INPUT_RADIO:
- if (submit)
- goto do_submit;
- if (fi->readonly) {
- /* FIXME: gettextize? */
- disp_message_nsec("Read only field!", FALSE, 1, TRUE, FALSE);
- break;
- }
- formRecheckRadio(a, Currentbuf, fi);
- break;
- case FORM_INPUT_CHECKBOX:
- if (submit)
- goto do_submit;
- if (fi->readonly) {
- /* FIXME: gettextize? */
- disp_message_nsec("Read only field!", FALSE, 1, TRUE, FALSE);
- break;
- }
- fi->checked = !fi->checked;
- formUpdateBuffer(a, Currentbuf, fi);
- break;
-#ifdef MENU_SELECT
- case FORM_SELECT:
- if (submit)
- goto do_submit;
- if (!formChooseOptionByMenu(fi,
- Currentbuf->cursorX - Currentbuf->pos +
- a->start.pos + Currentbuf->rootX,
- Currentbuf->cursorY + Currentbuf->rootY))
- break;
- formUpdateBuffer(a, Currentbuf, fi);
- if (fi->parent->nitems == 1)
- goto do_submit;
- break;
-#endif /* MENU_SELECT */
- case FORM_INPUT_IMAGE:
- case FORM_INPUT_SUBMIT:
- case FORM_INPUT_BUTTON:
- do_submit:
- tmp = Strnew();
- tmp2 = Strnew();
- multipart = (fi->parent->method == FORM_METHOD_POST &&
- fi->parent->enctype == FORM_ENCTYPE_MULTIPART);
- query_from_followform(&tmp, fi, multipart);
-
- tmp2 = Strdup(fi->parent->action);
- if (!Strcmp_charp(tmp2, "!CURRENT_URL!")) {
- /* It means "current URL" */
- tmp2 = parsedURL2Str(&Currentbuf->currentURL);
- if ((p = strchr(tmp2->ptr, '?')) != NULL)
- Strshrink(tmp2, (tmp2->ptr + tmp2->length) - p);
- }
-
- if (fi->parent->method == FORM_METHOD_GET) {
- if ((p = strchr(tmp2->ptr, '?')) != NULL)
- Strshrink(tmp2, (tmp2->ptr + tmp2->length) - p);
- Strcat_charp(tmp2, "?");
- Strcat(tmp2, tmp);
- loadLink(tmp2->ptr, a->target, NULL, NULL);
- }
- else if (fi->parent->method == FORM_METHOD_POST) {
- Buffer *buf;
- if (multipart) {
- struct stat st;
- stat(fi->parent->body, &st);
- fi->parent->length = st.st_size;
- }
- else {
- fi->parent->body = tmp->ptr;
- fi->parent->length = tmp->length;
- }
- buf = loadLink(tmp2->ptr, a->target, NULL, fi->parent);
- if (multipart) {
- unlink(fi->parent->body);
- }
- if (buf && !(buf->bufferprop & BP_REDIRECTED)) { /* buf must be Currentbuf */
- /* BP_REDIRECTED means that the buffer is obtained through
- * Location: header. In this case, buf->form_submit must not be set
- * because the page is not loaded by POST method but GET method.
- */
- buf->form_submit = save_submit_formlist(fi);
- }
- }
- else if ((fi->parent->method == FORM_METHOD_INTERNAL && (!Strcmp_charp(fi->parent->action, "map") || !Strcmp_charp(fi->parent->action, "none"))) || Currentbuf->bufferprop & BP_INTERNAL) { /* internal */
- do_internal(tmp2->ptr, tmp->ptr);
- }
- else {
- disp_err_message("Can't send form because of illegal method.",
- FALSE);
- }
- break;
- case FORM_INPUT_RESET:
- for (i = 0; i < Currentbuf->formitem->nanchor; i++) {
- a2 = &Currentbuf->formitem->anchors[i];
- f2 = (FormItemList *)a2->url;
- if (f2->parent == fi->parent &&
- f2->name && f2->value &&
- f2->type != FORM_INPUT_SUBMIT &&
- f2->type != FORM_INPUT_HIDDEN &&
- f2->type != FORM_INPUT_RESET) {
- f2->value = f2->init_value;
- f2->checked = f2->init_checked;
-#ifdef MENU_SELECT
- f2->label = f2->init_label;
- f2->selected = f2->init_selected;
-#endif /* MENU_SELECT */
- formUpdateBuffer(a2, Currentbuf, f2);
- }
- }
- break;
- case FORM_INPUT_HIDDEN:
- default:
- break;
- }
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-/* go to the top anchor */
-DEFUN(topA, LINK_BEGIN, "Go to the first link")
-{
- HmarkerList *hl = Currentbuf->hmarklist;
- BufferPoint *po;
- Anchor *an;
- int hseq = 0;
-
- if (Currentbuf->firstLine == NULL)
- return;
- if (!hl || hl->nmark == 0)
- return;
-
- if (prec_num > hl->nmark)
- hseq = hl->nmark - 1;
- else if (prec_num > 0)
- hseq = prec_num - 1;
- do {
- if (hseq >= hl->nmark)
- return;
- po = hl->marks + hseq;
- an = retrieveAnchor(Currentbuf->href, po->line, po->pos);
- if (an == NULL)
- an = retrieveAnchor(Currentbuf->formitem, po->line, po->pos);
- hseq++;
- } while (an == NULL);
-
- gotoLine(Currentbuf, po->line);
- Currentbuf->pos = po->pos;
- arrangeCursor(Currentbuf);
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-/* go to the last anchor */
-DEFUN(lastA, LINK_END, "Go to the last link")
-{
- HmarkerList *hl = Currentbuf->hmarklist;
- BufferPoint *po;
- Anchor *an;
- int hseq;
-
- if (Currentbuf->firstLine == NULL)
- return;
- if (!hl || hl->nmark == 0)
- return;
-
- if (prec_num >= hl->nmark)
- hseq = 0;
- else if (prec_num > 0)
- hseq = hl->nmark - prec_num;
- else
- hseq = hl->nmark - 1;
- do {
- if (hseq < 0)
- return;
- po = hl->marks + hseq;
- an = retrieveAnchor(Currentbuf->href, po->line, po->pos);
- if (an == NULL)
- an = retrieveAnchor(Currentbuf->formitem, po->line, po->pos);
- hseq--;
- } while (an == NULL);
-
- 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")
-{
- _nextA(FALSE);
-}
-
-/* go to the previous anchor */
-DEFUN(prevA, PREV_LINK, "Move to previous link")
-{
- _prevA(FALSE);
-}
-
-/* go to the next visited anchor */
-DEFUN(nextVA, NEXT_VISITED, "Move to next visited link")
-{
- _nextA(TRUE);
-}
-
-/* go to the previous visited anchor */
-DEFUN(prevVA, PREV_VISITED, "Move to previous visited link")
-{
- _prevA(TRUE);
-}
-
-/* go to the next [visited] anchor */
-static void
-_nextA(int visited)
-{
- HmarkerList *hl = Currentbuf->hmarklist;
- BufferPoint *po;
- Anchor *an, *pan;
- int i, x, y, n = searchKeyNum();
- ParsedURL url;
-
- if (Currentbuf->firstLine == NULL)
- return;
- if (!hl || hl->nmark == 0)
- return;
-
- an = retrieveCurrentAnchor(Currentbuf);
- if (visited != TRUE && an == NULL)
- an = retrieveCurrentForm(Currentbuf);
-
- y = Currentbuf->currentLine->linenumber;
- x = Currentbuf->pos;
-
- if (visited == TRUE) {
- n = hl->nmark;
- }
-
- for (i = 0; i < n; i++) {
- pan = an;
- if (an && an->hseq >= 0) {
- int hseq = an->hseq + 1;
- do {
- if (hseq >= hl->nmark) {
- if (visited == TRUE)
- return;
- an = pan;
- goto _end;
- }
- po = &hl->marks[hseq];
- an = retrieveAnchor(Currentbuf->href, po->line, po->pos);
- if (visited != TRUE && an == NULL)
- an = retrieveAnchor(Currentbuf->formitem, po->line,
- po->pos);
- hseq++;
- if (visited == TRUE && an) {
- parseURL2(an->url, &url, baseURL(Currentbuf));
- if (getHashHist(URLHist, parsedURL2Str(&url)->ptr)) {
- goto _end;
- }
- }
- } while (an == NULL || an == pan);
- }
- else {
- an = closest_next_anchor(Currentbuf->href, NULL, x, y);
- if (visited != TRUE)
- an = closest_next_anchor(Currentbuf->formitem, an, x, y);
- if (an == NULL) {
- if (visited == TRUE)
- return;
- an = pan;
- break;
- }
- x = an->start.pos;
- y = an->start.line;
- if (visited == TRUE) {
- parseURL2(an->url, &url, baseURL(Currentbuf));
- if (getHashHist(URLHist, parsedURL2Str(&url)->ptr)) {
- goto _end;
- }
- }
- }
- }
- if (visited == TRUE)
- return;
-
- _end:
- if (an == NULL || an->hseq < 0)
- return;
- po = &hl->marks[an->hseq];
- gotoLine(Currentbuf, po->line);
- Currentbuf->pos = po->pos;
- arrangeCursor(Currentbuf);
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-/* go to the previous anchor */
-static void
-_prevA(int visited)
-{
- HmarkerList *hl = Currentbuf->hmarklist;
- BufferPoint *po;
- Anchor *an, *pan;
- int i, x, y, n = searchKeyNum();
- ParsedURL url;
-
- if (Currentbuf->firstLine == NULL)
- return;
- if (!hl || hl->nmark == 0)
- return;
-
- an = retrieveCurrentAnchor(Currentbuf);
- if (visited != TRUE && an == NULL)
- an = retrieveCurrentForm(Currentbuf);
-
- y = Currentbuf->currentLine->linenumber;
- x = Currentbuf->pos;
-
- if (visited == TRUE) {
- n = hl->nmark;
- }
-
- for (i = 0; i < n; i++) {
- pan = an;
- if (an && an->hseq >= 0) {
- int hseq = an->hseq - 1;
- do {
- if (hseq < 0) {
- if (visited == TRUE)
- return;
- an = pan;
- goto _end;
- }
- po = hl->marks + hseq;
- an = retrieveAnchor(Currentbuf->href, po->line, po->pos);
- if (visited != TRUE && an == NULL)
- an = retrieveAnchor(Currentbuf->formitem, po->line,
- po->pos);
- hseq--;
- if (visited == TRUE && an) {
- parseURL2(an->url, &url, baseURL(Currentbuf));
- if (getHashHist(URLHist, parsedURL2Str(&url)->ptr)) {
- goto _end;
- }
- }
- } while (an == NULL || an == pan);
- }
- else {
- an = closest_prev_anchor(Currentbuf->href, NULL, x, y);
- if (visited != TRUE)
- an = closest_prev_anchor(Currentbuf->formitem, an, x, y);
- if (an == NULL) {
- if (visited == TRUE)
- return;
- an = pan;
- break;
- }
- x = an->start.pos;
- y = an->start.line;
- if (visited == TRUE && an) {
- parseURL2(an->url, &url, baseURL(Currentbuf));
- if (getHashHist(URLHist, parsedURL2Str(&url)->ptr)) {
- goto _end;
- }
- }
- }
- }
- if (visited == TRUE)
- return;
-
- _end:
- if (an == NULL || an->hseq < 0)
- return;
- po = hl->marks + an->hseq;
- gotoLine(Currentbuf, po->line);
- Currentbuf->pos = po->pos;
- arrangeCursor(Currentbuf);
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-/* go to the next left/right anchor */
-static void
-nextX(int d, int dy)
-{
- HmarkerList *hl = Currentbuf->hmarklist;
- Anchor *an, *pan;
- Line *l;
- int i, x, y, n = searchKeyNum();
-
- if (Currentbuf->firstLine == NULL)
- return;
- if (!hl || hl->nmark == 0)
- return;
-
- an = retrieveCurrentAnchor(Currentbuf);
- if (an == NULL)
- an = retrieveCurrentForm(Currentbuf);
-
- l = Currentbuf->currentLine;
- x = Currentbuf->pos;
- y = l->linenumber;
- pan = NULL;
- for (i = 0; i < n; i++) {
- if (an)
- x = (d > 0) ? an->end.pos : an->start.pos - 1;
- an = NULL;
- while (1) {
- for (; x >= 0 && x < l->len; x += d) {
- an = retrieveAnchor(Currentbuf->href, y, x);
- if (!an)
- an = retrieveAnchor(Currentbuf->formitem, y, x);
- if (an) {
- pan = an;
- break;
- }
- }
- if (!dy || an)
- break;
- l = (dy > 0) ? l->next : l->prev;
- if (!l)
- break;
- x = (d > 0) ? 0 : l->len - 1;
- y = l->linenumber;
- }
- if (!an)
- break;
- }
-
- if (pan == NULL)
- return;
- gotoLine(Currentbuf, y);
- Currentbuf->pos = pan->start.pos;
- arrangeCursor(Currentbuf);
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-/* go to the next downward/upward anchor */
-static void
-nextY(int d)
-{
- HmarkerList *hl = Currentbuf->hmarklist;
- Anchor *an, *pan;
- int i, x, y, n = searchKeyNum();
- int hseq;
-
- if (Currentbuf->firstLine == NULL)
- return;
- if (!hl || hl->nmark == 0)
- return;
-
- an = retrieveCurrentAnchor(Currentbuf);
- if (an == NULL)
- an = retrieveCurrentForm(Currentbuf);
-
- x = Currentbuf->pos;
- y = Currentbuf->currentLine->linenumber + d;
- pan = NULL;
- hseq = -1;
- for (i = 0; i < n; i++) {
- if (an)
- hseq = abs(an->hseq);
- an = NULL;
- for (; y >= 0 && y <= Currentbuf->lastLine->linenumber; y += d) {
- an = retrieveAnchor(Currentbuf->href, y, x);
- if (!an)
- an = retrieveAnchor(Currentbuf->formitem, y, x);
- if (an && hseq != abs(an->hseq)) {
- pan = an;
- break;
- }
- }
- if (!an)
- break;
- }
-
- if (pan == NULL)
- return;
- gotoLine(Currentbuf, pan->start.line);
- arrangeLine(Currentbuf);
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-/* go to the next left anchor */
-DEFUN(nextL, NEXT_LEFT, "Move to next left link")
-{
- nextX(-1, 0);
-}
-
-/* go to the next left-up anchor */
-DEFUN(nextLU, NEXT_LEFT_UP, "Move to next left (or upward) link")
-{
- nextX(-1, -1);
-}
-
-/* go to the next right anchor */
-DEFUN(nextR, NEXT_RIGHT, "Move to next right link")
-{
- nextX(1, 0);
-}
-
-/* go to the next right-down anchor */
-DEFUN(nextRD, NEXT_RIGHT_DOWN, "Move to next right (or downward) link")
-{
- nextX(1, 1);
-}
-
-/* go to the next downward anchor */
-DEFUN(nextD, NEXT_DOWN, "Move to next downward link")
-{
- nextY(1);
-}
-
-/* go to the next upward anchor */
-DEFUN(nextU, NEXT_UP, "Move to next upward link")
-{
- nextY(-1);
-}
-
-/* go to the next bufferr */
-DEFUN(nextBf, NEXT, "Move to next buffer")
-{
- Buffer *buf;
- int i;
-
- for (i = 0; i < PREC_NUM; i++) {
- buf = prevBuffer(Firstbuf, Currentbuf);
- if (!buf) {
- if (i == 0)
- return;
- break;
- }
- Currentbuf = buf;
- }
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-/* go to the previous bufferr */
-DEFUN(prevBf, PREV, "Move to previous buffer")
-{
- Buffer *buf;
- int i;
-
- for (i = 0; i < PREC_NUM; i++) {
- buf = Currentbuf->nextBuffer;
- if (!buf) {
- if (i == 0)
- return;
- break;
- }
- Currentbuf = buf;
- }
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-static int
-checkBackBuffer(Buffer *buf)
-{
- Buffer *fbuf = buf->linkBuffer[LB_N_FRAME];
-
- if (fbuf) {
- if (fbuf->frameQ)
- return TRUE; /* Currentbuf has stacked frames */
- /* when no frames stacked and next is frame source, try next's
- * nextBuffer */
- if (RenderFrame && fbuf == buf->nextBuffer) {
- if (fbuf->nextBuffer != NULL)
- return TRUE;
- else
- return FALSE;
- }
- }
-
- if (buf->nextBuffer)
- return TRUE;
-
- return FALSE;
-}
-
-/* delete current buffer and back to the previous buffer */
-DEFUN(backBf, BACK, "Back to previous buffer")
-{
- Buffer *buf = Currentbuf->linkBuffer[LB_N_FRAME];
-
- if (!checkBackBuffer(Currentbuf)) {
- if (close_tab_back && nTab >= 1) {
- deleteTab(CurrentTab);
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
- }
- else
- /* FIXME: gettextize? */
- disp_message("Can't back...", TRUE);
- return;
- }
-
- delBuffer(Currentbuf);
-
- if (buf) {
- if (buf->frameQ) {
- struct frameset *fs;
- long linenumber = buf->frameQ->linenumber;
- long top = buf->frameQ->top_linenumber;
- int pos = buf->frameQ->pos;
- int currentColumn = buf->frameQ->currentColumn;
- AnchorList *formitem = buf->frameQ->formitem;
-
- fs = popFrameTree(&(buf->frameQ));
- deleteFrameSet(buf->frameset);
- buf->frameset = fs;
-
- if (buf == Currentbuf) {
- rFrame();
- Currentbuf->topLine = lineSkip(Currentbuf,
- Currentbuf->firstLine, top - 1,
- FALSE);
- gotoLine(Currentbuf, linenumber);
- Currentbuf->pos = pos;
- Currentbuf->currentColumn = currentColumn;
- arrangeCursor(Currentbuf);
- formResetBuffer(Currentbuf, formitem);
- }
- }
- else if (RenderFrame && buf == Currentbuf) {
- delBuffer(Currentbuf);
- }
- }
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-DEFUN(deletePrevBuf, DELETE_PREVBUF,
- "Delete previous buffer (mainly for local-CGI)")
-{
- Buffer *buf = Currentbuf->nextBuffer;
- if (buf)
- delBuffer(buf);
-}
-
-static void
-cmd_loadURL(char *url, ParsedURL *current, char *referer, FormList *request)
-{
- Buffer *buf;
-
- if (!strncasecmp(url, "mailto:", 7)
-#ifdef USE_W3MMAILER
- && non_null(Mailer) && strchr(url, '?') == NULL
-#endif
- ) {
- /* invoke external mailer */
- Str to = Strnew_charp(url + 7);
-#ifndef USE_W3MMAILER
- char *pos;
- if (!non_null(Mailer)) {
- /* FIXME: gettextize? */
- disp_err_message("no mailer is specified", TRUE);
- return;
- }
- if ((pos = strchr(to->ptr, '?')) != NULL)
- Strtruncate(to, pos - to->ptr);
-#endif
- fmTerm();
- system(myExtCommand(Mailer, shell_quote(file_unquote(to->ptr)),
- FALSE)->ptr);
- fmInit();
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
- pushHashHist(URLHist, url);
- return;
- }
-#if 0
- if (!strncasecmp(url, "news:", 5) && strchr(url, '@') == NULL) {
- /* news:newsgroup is not supported */
- /* FIXME: gettextize? */
- disp_err_message("news:newsgroup_name is not supported", TRUE);
- return;
- }
-#endif /* USE_NNTP */
-
- refresh();
- buf = loadGeneralFile(url, current, referer, 0, request);
- if (buf == NULL) {
- /* FIXME: gettextize? */
- char *emsg = Sprintf("Can't load %s", conv_from_system(url))->ptr;
- disp_err_message(emsg, FALSE);
- }
- else if (buf != NO_BUFFER) {
- pushBuffer(buf);
- if (RenderFrame && Currentbuf->frameset != NULL)
- rFrame();
- }
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-
-/* go to specified URL */
-static void
-goURL0(char *prompt, int relative)
-{
- char *url, *referer;
- ParsedURL p_url, *current;
- Buffer *cur_buf = Currentbuf;
-
- url = searchKeyData();
- if (url == NULL) {
- Hist *hist = copyHist(URLHist);
- Anchor *a;
-
- 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);
- }
- else
- pushHist(hist, c_url);
- }
- a = retrieveCurrentAnchor(Currentbuf);
- if (a) {
- 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);
- }
- else
- pushHist(hist, a_url);
- }
- url = inputLineHist(prompt, url, IN_URL, hist);
- 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;
- else
- url = conv_to_system(url);
- }
-#endif
- if (url == NULL || *url == '\0') {
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
- return;
- }
- if (*url == '#') {
- 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);
- if (Currentbuf != cur_buf) /* success */
- pushHashHist(URLHist, parsedURL2Str(&Currentbuf->currentURL)->ptr);
-}
-
-DEFUN(goURL, GOTO, "Go to URL")
-{
- goURL0("Goto URL: ", FALSE);
-}
-
-DEFUN(gorURL, GOTO_RELATIVE, "Go to relative URL")
-{
- goURL0("Goto relative URL: ", TRUE);
-}
-
-static void
-cmd_loadBuffer(Buffer *buf, int prop, int linkid)
-{
- if (buf == NULL) {
- disp_err_message("Can't load string", FALSE);
- }
- else if (buf != NO_BUFFER) {
- buf->bufferprop |= (BP_INTERNAL | prop);
- if (!(buf->bufferprop & BP_NO_URL))
- copyParsedURL(&buf->currentURL, &Currentbuf->currentURL);
- if (linkid != LB_NOLINK) {
- buf->linkBuffer[REV_LB[linkid]] = Currentbuf;
- Currentbuf->linkBuffer[linkid] = buf;
- }
- pushBuffer(buf);
- }
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-/* load bookmark */
-DEFUN(ldBmark, BOOKMARK VIEW_BOOKMARK, "Read bookmark")
-{
- cmd_loadURL(BookmarkFile, NULL, NO_REFERER, NULL);
-}
-
-
-/* Add current to bookmark */
-DEFUN(adBmark, ADD_BOOKMARK, "Add current page to bookmark")
-{
- Str tmp;
- FormList *request;
-
- tmp = Sprintf("mode=panel&cookie=%s&bmark=%s&url=%s&title=%s"
-#ifdef USE_M17N
- "&charset=%s"
-#endif
- ,
- (Str_form_quote(localCookie()))->ptr,
- (Str_form_quote(Strnew_charp(BookmarkFile)))->ptr,
- (Str_form_quote(parsedURL2Str(&Currentbuf->currentURL)))->
- ptr,
-#ifdef USE_M17N
- (Str_form_quote(wc_conv_strict(Currentbuf->buffername,
- InnerCharset,
- BookmarkCharset)))->ptr,
- wc_ces_to_charset(BookmarkCharset));
-#else
- (Str_form_quote(Strnew_charp(Currentbuf->buffername)))->ptr);
-#endif
- request = newFormList(NULL, "post", NULL, NULL, NULL, NULL, NULL);
- request->body = tmp->ptr;
- request->length = tmp->length;
- cmd_loadURL("file:///$LIB/" W3MBOOKMARK_CMDNAME, NULL, NO_REFERER,
- request);
-}
-
-/* option setting */
-DEFUN(ldOpt, OPTIONS, "Option setting panel")
-{
- cmd_loadBuffer(load_option_panel(), BP_NO_URL, LB_NOLINK);
-}
-
-/* set an option */
-DEFUN(setOpt, SET_OPTION, "Set option")
-{
- char *opt;
-
- CurrentKeyData = NULL; /* not allowed in w3m-control: */
- opt = searchKeyData();
- if (opt == NULL || *opt == '\0' || strchr(opt, '=') == NULL) {
- if (opt != NULL && *opt != '\0') {
- char *v = get_param_option(opt);
- opt = Sprintf("%s=%s", opt, v ? v : "")->ptr;
- }
- opt = inputStrHist("Set option: ", opt, TextHist);
- if (opt == NULL || *opt == '\0') {
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
- }
- if (set_param_option(opt))
- sync_with_option();
- displayBuffer(Currentbuf, B_REDRAW_IMAGE);
-}
-
-/* error message list */
-DEFUN(msgs, MSGS, "Display error messages")
-{
- cmd_loadBuffer(message_list_panel(), BP_NO_URL, LB_NOLINK);
-}
-
-/* page info */
-DEFUN(pginfo, INFO, "View info of current document")
-{
- Buffer *buf;
-
- if ((buf = Currentbuf->linkBuffer[LB_N_INFO]) != NULL) {
- Currentbuf = buf;
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
- if ((buf = Currentbuf->linkBuffer[LB_INFO]) != NULL)
- delBuffer(buf);
- buf = page_info_panel(Currentbuf);
- cmd_loadBuffer(buf, BP_NORMAL, LB_INFO);
-}
-
-void
-follow_map(struct parsed_tagarg *arg)
-{
- char *name = tag_get_value(arg, "link");
-#if defined(MENU_MAP) || defined(USE_IMAGE)
- Anchor *an;
- MapArea *a;
- int x, y;
- ParsedURL p_url;
-
- an = retrieveCurrentImg(Currentbuf);
- x = Currentbuf->cursorX + Currentbuf->rootX;
- y = Currentbuf->cursorY + Currentbuf->rootY;
- a = follow_map_menu(Currentbuf, name, an, x, y);
- if (a == NULL || a->url == NULL || *(a->url) == '\0') {
-#endif
-#ifndef MENU_MAP
- Buffer *buf = follow_map_panel(Currentbuf, name);
-
- if (buf != NULL)
- cmd_loadBuffer(buf, BP_NORMAL, LB_NOLINK);
-#endif
-#if defined(MENU_MAP) || defined(USE_IMAGE)
- return;
- }
- if (*(a->url) == '#') {
- gotoLabel(a->url + 1);
- return;
- }
- parseURL2(a->url, &p_url, baseURL(Currentbuf));
- pushHashHist(URLHist, parsedURL2Str(&p_url)->ptr);
- if (check_target && open_tab_blank && a->target &&
- (!strcasecmp(a->target, "_new") || !strcasecmp(a->target, "_blank"))) {
- Buffer *buf;
-
- _newT();
- buf = Currentbuf;
- cmd_loadURL(a->url, baseURL(Currentbuf),
- parsedURL2Str(&Currentbuf->currentURL)->ptr, NULL);
- if (buf != Currentbuf)
- delBuffer(buf);
- else
- deleteTab(CurrentTab);
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
- return;
- }
- cmd_loadURL(a->url, baseURL(Currentbuf),
- parsedURL2Str(&Currentbuf->currentURL)->ptr, NULL);
-#endif
-}
-
-#ifdef USE_MENU
-/* link menu */
-DEFUN(linkMn, LINK_MENU, "Popup link element menu")
-{
- LinkList *l = link_menu(Currentbuf);
- ParsedURL p_url;
-
- if (!l || !l->url)
- return;
- if (*(l->url) == '#') {
- gotoLabel(l->url + 1);
- return;
- }
- parseURL2(l->url, &p_url, baseURL(Currentbuf));
- pushHashHist(URLHist, parsedURL2Str(&p_url)->ptr);
- cmd_loadURL(l->url, baseURL(Currentbuf),
- parsedURL2Str(&Currentbuf->currentURL)->ptr, NULL);
-}
-
-static void
-anchorMn(Anchor *(*menu_func) (Buffer *), int go)
-{
- Anchor *a;
- BufferPoint *po;
-
- if (!Currentbuf->href || !Currentbuf->hmarklist)
- return;
- a = menu_func(Currentbuf);
- if (!a || a->hseq < 0)
- return;
- po = &Currentbuf->hmarklist->marks[a->hseq];
- gotoLine(Currentbuf, po->line);
- Currentbuf->pos = po->pos;
- arrangeCursor(Currentbuf);
- displayBuffer(Currentbuf, B_NORMAL);
- if (go)
- followA();
-}
-
-/* accesskey */
-DEFUN(accessKey, ACCESSKEY, "Popup acceskey menu")
-{
- anchorMn(accesskey_menu, TRUE);
-}
-
-/* list menu */
-DEFUN(listMn, LIST_MENU, "Popup link list menu and go to selected link")
-{
- anchorMn(list_menu, TRUE);
-}
-
-DEFUN(movlistMn, MOVE_LIST_MENU,
- "Popup link list menu and move cursor to selected link")
-{
- anchorMn(list_menu, FALSE);
-}
-#endif
-
-/* link,anchor,image list */
-DEFUN(linkLst, LIST, "Show all links and images")
-{
- Buffer *buf;
-
- buf = link_list_panel(Currentbuf);
- if (buf != NULL) {
-#ifdef USE_M17N
- buf->document_charset = Currentbuf->document_charset;
-#endif
- cmd_loadBuffer(buf, BP_NORMAL, LB_NOLINK);
- }
-}
-
-#ifdef USE_COOKIE
-/* cookie list */
-DEFUN(cooLst, COOKIE, "View cookie list")
-{
- Buffer *buf;
-
- buf = cookie_list_panel();
- if (buf != NULL)
- cmd_loadBuffer(buf, BP_NO_URL, LB_NOLINK);
-}
-#endif /* USE_COOKIE */
-
-#ifdef USE_HISTORY
-/* History page */
-DEFUN(ldHist, HISTORY, "View history of URL")
-{
- cmd_loadBuffer(historyBuffer(URLHist), BP_NO_URL, LB_NOLINK);
-}
-#endif /* USE_HISTORY */
-
-/* download HREF link */
-DEFUN(svA, SAVE_LINK, "Save link to file")
-{
- CurrentKeyData = NULL; /* not allowed in w3m-control: */
- do_download = TRUE;
- followA();
- do_download = FALSE;
-}
-
-/* download IMG link */
-DEFUN(svI, SAVE_IMAGE, "Save image to file")
-{
- CurrentKeyData = NULL; /* not allowed in w3m-control: */
- do_download = TRUE;
- followI();
- do_download = FALSE;
-}
-
-/* save buffer */
-DEFUN(svBuf, PRINT SAVE_SCREEN, "Save rendered document to file")
-{
- char *qfile = NULL, *file;
- FILE *f;
- int is_pipe;
-
- CurrentKeyData = NULL; /* not allowed in w3m-control: */
- file = searchKeyData();
- if (file == NULL || *file == '\0') {
- /* FIXME: gettextize? */
- qfile = inputLineHist("Save buffer to: ", NULL, IN_COMMAND, SaveHist);
- if (qfile == NULL || *qfile == '\0') {
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
- }
- file = conv_to_system(qfile ? qfile : file);
- if (*file == '|') {
- is_pipe = TRUE;
- f = popen(file + 1, "w");
- }
- else {
- if (qfile) {
- file = unescape_spaces(Strnew_charp(qfile))->ptr;
- file = conv_to_system(file);
- }
- file = expandPath(file);
- if (checkOverWrite(file) < 0) {
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
- f = fopen(file, "w");
- is_pipe = FALSE;
- }
- if (f == NULL) {
- /* FIXME: gettextize? */
- char *emsg = Sprintf("Can't open %s", conv_from_system(file))->ptr;
- disp_err_message(emsg, TRUE);
- return;
- }
- saveBuffer(Currentbuf, f, TRUE);
- if (is_pipe)
- pclose(f);
- else
- fclose(f);
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-/* save source */
-DEFUN(svSrc, DOWNLOAD SAVE, "Save document source to file")
-{
- char *file;
-
- if (Currentbuf->sourcefile == NULL)
- return;
- CurrentKeyData = NULL; /* not allowed in w3m-control: */
- PermitSaveToPipe = TRUE;
- if (Currentbuf->real_scheme == SCM_LOCAL)
- file = conv_from_system(guess_save_name(NULL,
- Currentbuf->currentURL.
- real_file));
- else
- file = guess_save_name(Currentbuf, Currentbuf->currentURL.file);
- doFileCopy(Currentbuf->sourcefile, file);
- PermitSaveToPipe = FALSE;
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-static void
-_peekURL(int only_img)
-{
-
- Anchor *a;
- ParsedURL pu;
- static Str s = NULL;
-#ifdef USE_M17N
- static Lineprop *p = NULL;
- Lineprop *pp;
-#endif
- static int offset = 0, n;
-
- if (Currentbuf->firstLine == NULL)
- return;
- if (CurrentKey == prev_key && s != NULL) {
- if (s->length - offset >= COLS)
- offset++;
- else if (s->length <= offset) /* bug ? */
- offset = 0;
- goto disp;
- }
- else {
- offset = 0;
- }
- s = NULL;
- a = (only_img ? NULL : retrieveCurrentAnchor(Currentbuf));
- if (a == NULL) {
- a = (only_img ? NULL : retrieveCurrentForm(Currentbuf));
- if (a == NULL) {
- a = retrieveCurrentImg(Currentbuf);
- if (a == NULL)
- return;
- }
- else
- s = Strnew_charp(form2str((FormItemList *)a->url));
- }
- if (s == NULL) {
- parseURL2(a->url, &pu, baseURL(Currentbuf));
- s = parsedURL2Str(&pu);
- }
- if (DecodeURL)
- s = Strnew_charp(url_unquote_conv
- (s->ptr, Currentbuf->document_charset));
-#ifdef USE_M17N
- s = checkType(s, &pp, NULL);
- p = NewAtom_N(Lineprop, s->length);
- bcopy((void *)pp, (void *)p, s->length * sizeof(Lineprop));
-#endif
- disp:
- n = searchKeyNum();
- if (n > 1 && s->length > (n - 1) * (COLS - 1))
- offset = (n - 1) * (COLS - 1);
-#ifdef USE_M17N
- while (offset < s->length && p[offset] & PC_WCHAR2)
- offset++;
-#endif
- disp_message_nomouse(&s->ptr[offset], TRUE);
-}
-
-/* peek URL */
-DEFUN(peekURL, PEEK_LINK, "Peek link URL")
-{
- _peekURL(0);
-}
-
-/* peek URL of image */
-DEFUN(peekIMG, PEEK_IMG, "Peek image URL")
-{
- _peekURL(1);
-}
-
-/* show current URL */
-static Str
-currentURL(void)
-{
- if (Currentbuf->bufferprop & BP_INTERNAL)
- return Strnew_size(0);
- return parsedURL2Str(&Currentbuf->currentURL);
-}
-
-DEFUN(curURL, PEEK, "Peek current URL")
-{
- static Str s = NULL;
-#ifdef USE_M17N
- static Lineprop *p = NULL;
- Lineprop *pp;
-#endif
- static int offset = 0, n;
-
- if (Currentbuf->bufferprop & BP_INTERNAL)
- return;
- if (CurrentKey == prev_key && s != NULL) {
- if (s->length - offset >= COLS)
- offset++;
- else if (s->length <= offset) /* bug ? */
- offset = 0;
- }
- else {
- offset = 0;
- s = currentURL();
- if (DecodeURL)
- s = Strnew_charp(url_unquote_conv(s->ptr, 0));
-#ifdef USE_M17N
- s = checkType(s, &pp, NULL);
- p = NewAtom_N(Lineprop, s->length);
- bcopy((void *)pp, (void *)p, s->length * sizeof(Lineprop));
-#endif
- }
- n = searchKeyNum();
- if (n > 1 && s->length > (n - 1) * (COLS - 1))
- offset = (n - 1) * (COLS - 1);
-#ifdef USE_M17N
- while (offset < s->length && p[offset] & PC_WCHAR2)
- offset++;
-#endif
- disp_message_nomouse(&s->ptr[offset], TRUE);
-}
-/* view HTML source */
-
-DEFUN(vwSrc, SOURCE VIEW, "View HTML source")
-{
- Buffer *buf;
-
- if (Currentbuf->type == NULL || Currentbuf->bufferprop & BP_FRAME)
- return;
- if ((buf = Currentbuf->linkBuffer[LB_SOURCE]) != NULL ||
- (buf = Currentbuf->linkBuffer[LB_N_SOURCE]) != NULL) {
- Currentbuf = buf;
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
- if (Currentbuf->sourcefile == NULL) {
- if (Currentbuf->pagerSource &&
- !strcasecmp(Currentbuf->type, "text/plain")) {
-#ifdef USE_M17N
- wc_ces old_charset;
- wc_bool old_fix_width_conv;
-#endif
- FILE *f;
- Str tmpf = tmpfname(TMPF_SRC, NULL);
- f = fopen(tmpf->ptr, "w");
- if (f == NULL)
- return;
-#ifdef USE_M17N
- old_charset = DisplayCharset;
- old_fix_width_conv = WcOption.fix_width_conv;
- DisplayCharset = (Currentbuf->document_charset != WC_CES_US_ASCII)
- ? Currentbuf->document_charset : 0;
- WcOption.fix_width_conv = WC_FALSE;
-#endif
- saveBufferBody(Currentbuf, f, TRUE);
-#ifdef USE_M17N
- DisplayCharset = old_charset;
- WcOption.fix_width_conv = old_fix_width_conv;
-#endif
- fclose(f);
- Currentbuf->sourcefile = tmpf->ptr;
- }
- else {
- return;
- }
- }
-
- buf = newBuffer(INIT_BUFFER_WIDTH);
-
- if (!strcasecmp(Currentbuf->type, "text/html")) {
- buf->type = "text/plain";
- if (Currentbuf->real_type &&
- !strcasecmp(Currentbuf->real_type, "text/html"))
- buf->real_type = "text/plain";
- else
- buf->real_type = Currentbuf->real_type;
- buf->buffername = Sprintf("source of %s", Currentbuf->buffername)->ptr;
- buf->linkBuffer[LB_N_SOURCE] = Currentbuf;
- Currentbuf->linkBuffer[LB_SOURCE] = buf;
- }
- else if (!strcasecmp(Currentbuf->type, "text/plain")) {
- buf->type = "text/html";
- if (Currentbuf->real_type &&
- !strcasecmp(Currentbuf->real_type, "text/plain"))
- buf->real_type = "text/html";
- else
- buf->real_type = Currentbuf->real_type;
- buf->buffername = Sprintf("HTML view of %s",
- Currentbuf->buffername)->ptr;
- buf->linkBuffer[LB_SOURCE] = Currentbuf;
- Currentbuf->linkBuffer[LB_N_SOURCE] = buf;
- }
- else {
- return;
- }
- buf->currentURL = Currentbuf->currentURL;
- buf->real_scheme = Currentbuf->real_scheme;
- buf->filename = Currentbuf->filename;
- buf->sourcefile = Currentbuf->sourcefile;
- buf->header_source = Currentbuf->header_source;
- buf->search_header = Currentbuf->search_header;
-#ifdef USE_M17N
- buf->document_charset = Currentbuf->document_charset;
-#endif
- buf->clone = Currentbuf->clone;
- (*buf->clone)++;
-
- buf->need_reshape = TRUE;
- reshapeBuffer(buf);
- pushBuffer(buf);
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-/* reload */
-DEFUN(reload, RELOAD, "Reload buffer")
-{
- Buffer *buf, *fbuf = NULL, sbuf;
-#ifdef USE_M17N
- wc_ces old_charset;
-#endif
- Str url;
- FormList *request;
- int multipart;
-
- if (Currentbuf->bufferprop & BP_INTERNAL) {
- if (!strcmp(Currentbuf->buffername, DOWNLOAD_LIST_TITLE)) {
- ldDL();
- return;
- }
- /* FIXME: gettextize? */
- disp_err_message("Can't reload...", TRUE);
- return;
- }
- if (Currentbuf->currentURL.scheme == SCM_LOCAL &&
- !strcmp(Currentbuf->currentURL.file, "-")) {
- /* file is std input */
- /* FIXME: gettextize? */
- disp_err_message("Can't reload stdin", TRUE);
- return;
- }
- copyBuffer(&sbuf, Currentbuf);
- if (Currentbuf->bufferprop & BP_FRAME &&
- (fbuf = Currentbuf->linkBuffer[LB_N_FRAME])) {
- if (fmInitialized) {
- message("Rendering frame", 0, 0);
- refresh();
- }
- if (!(buf = renderFrame(fbuf, 1))) {
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
- if (fbuf->linkBuffer[LB_FRAME]) {
- if (buf->sourcefile &&
- fbuf->linkBuffer[LB_FRAME]->sourcefile &&
- !strcmp(buf->sourcefile,
- fbuf->linkBuffer[LB_FRAME]->sourcefile))
- fbuf->linkBuffer[LB_FRAME]->sourcefile = NULL;
- delBuffer(fbuf->linkBuffer[LB_FRAME]);
- }
- fbuf->linkBuffer[LB_FRAME] = buf;
- buf->linkBuffer[LB_N_FRAME] = fbuf;
- pushBuffer(buf);
- Currentbuf = buf;
- if (Currentbuf->firstLine)
- restorePosition(Currentbuf, &sbuf);
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
- return;
- }
- else if (Currentbuf->frameset != NULL)
- fbuf = Currentbuf->linkBuffer[LB_FRAME];
- multipart = 0;
- if (Currentbuf->form_submit) {
- request = Currentbuf->form_submit->parent;
- if (request->method == FORM_METHOD_POST
- && request->enctype == FORM_ENCTYPE_MULTIPART) {
- Str query;
- struct stat st;
- multipart = 1;
- query_from_followform(&query, Currentbuf->form_submit, multipart);
- stat(request->body, &st);
- request->length = st.st_size;
- }
- }
- else {
- request = NULL;
- }
- url = parsedURL2Str(&Currentbuf->currentURL);
- /* FIXME: gettextize? */
- message("Reloading...", 0, 0);
- refresh();
-#ifdef USE_M17N
- old_charset = DocumentCharset;
- if (Currentbuf->document_charset != WC_CES_US_ASCII)
- DocumentCharset = Currentbuf->document_charset;
-#endif
- SearchHeader = Currentbuf->search_header;
- DefaultType = Currentbuf->real_type;
- buf = loadGeneralFile(url->ptr, NULL, NO_REFERER, RG_NOCACHE, request);
-#ifdef USE_M17N
- DocumentCharset = old_charset;
-#endif
- SearchHeader = FALSE;
- DefaultType = NULL;
-
- if (multipart)
- unlink(request->body);
- if (buf == NULL) {
- /* FIXME: gettextize? */
- disp_err_message("Can't reload...", TRUE);
- return;
- }
- else if (buf == NO_BUFFER) {
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
- if (fbuf != NULL)
- Firstbuf = deleteBuffer(Firstbuf, fbuf);
- repBuffer(Currentbuf, buf);
- if ((buf->type != NULL) && (sbuf.type != NULL) &&
- ((!strcasecmp(buf->type, "text/plain") &&
- !strcasecmp(sbuf.type, "text/html")) ||
- (!strcasecmp(buf->type, "text/html") &&
- !strcasecmp(sbuf.type, "text/plain")))) {
- vwSrc();
- if (Currentbuf != buf)
- Firstbuf = deleteBuffer(Firstbuf, buf);
- }
- Currentbuf->search_header = sbuf.search_header;
- Currentbuf->form_submit = sbuf.form_submit;
- if (Currentbuf->firstLine)
- restorePosition(Currentbuf, &sbuf);
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-/* reshape */
-DEFUN(reshape, RESHAPE, "Re-render buffer")
-{
- Currentbuf->need_reshape = TRUE;
- reshapeBuffer(Currentbuf);
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-#ifdef USE_M17N
-static void
-_docCSet(wc_ces charset)
-{
- if (Currentbuf->bufferprop & BP_INTERNAL)
- return;
- if (Currentbuf->sourcefile == NULL) {
- disp_message("Can't reload...", FALSE);
- return;
- }
- Currentbuf->document_charset = charset;
- Currentbuf->need_reshape = TRUE;
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-void
-change_charset(struct parsed_tagarg *arg)
-{
- Buffer *buf = Currentbuf->linkBuffer[LB_N_INFO];
- wc_ces charset;
-
- if (buf == NULL)
- return;
- delBuffer(Currentbuf);
- Currentbuf = buf;
- if (Currentbuf->bufferprop & BP_INTERNAL)
- return;
- charset = Currentbuf->document_charset;
- for (; arg; arg = arg->next) {
- if (!strcmp(arg->arg, "charset"))
- charset = atoi(arg->value);
- }
- _docCSet(charset);
-}
-
-DEFUN(docCSet, CHARSET, "Change the current document charset")
-{
- char *cs;
- wc_ces charset;
-
- cs = searchKeyData();
- if (cs == NULL || *cs == '\0')
- /* FIXME: gettextize? */
- cs = inputStr("Document charset: ",
- wc_ces_to_charset(Currentbuf->document_charset));
- charset = wc_guess_charset_short(cs, 0);
- if (charset == 0) {
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
- _docCSet(charset);
-}
-
-DEFUN(defCSet, DEFAULT_CHARSET, "Change the default document charset")
-{
- char *cs;
- wc_ces charset;
-
- cs = searchKeyData();
- if (cs == NULL || *cs == '\0')
- /* FIXME: gettextize? */
- cs = inputStr("Default document charset: ",
- wc_ces_to_charset(DocumentCharset));
- charset = wc_guess_charset_short(cs, 0);
- if (charset != 0)
- DocumentCharset = charset;
- displayBuffer(Currentbuf, B_NORMAL);
-}
-#endif
-
-/* mark URL-like patterns as anchors */
-void
-chkURLBuffer(Buffer *buf)
-{
- static char *url_like_pat[] = {
- "https?://[a-zA-Z0-9][a-zA-Z0-9:%\\-\\./?=~_\\&+@#,\\$;]*[a-zA-Z0-9_/=\\-]",
- "file:/[a-zA-Z0-9:%\\-\\./=_\\+@#,\\$;]*",
-#ifdef USE_GOPHER
- "gopher://[a-zA-Z0-9][a-zA-Z0-9:%\\-\\./_]*",
-#endif /* USE_GOPHER */
- "ftp://[a-zA-Z0-9][a-zA-Z0-9:%\\-\\./=_+@#,\\$]*[a-zA-Z0-9_/]",
-#ifdef USE_NNTP
- "news:[^<> ][^<> ]*",
- "nntp://[a-zA-Z0-9][a-zA-Z0-9:%\\-\\./_]*",
-#endif /* USE_NNTP */
-#ifndef USE_W3MMAILER /* see also chkExternalURIBuffer() */
- "mailto:[^<> ][^<> ]*@[a-zA-Z0-9][a-zA-Z0-9\\-\\._]*[a-zA-Z0-9]",
-#endif
-#ifdef INET6
- "https?://[a-zA-Z0-9:%\\-\\./_@]*\\[[a-fA-F0-9:][a-fA-F0-9:\\.]*\\][a-zA-Z0-9:%\\-\\./?=~_\\&+@#,\\$;]*",
- "ftp://[a-zA-Z0-9:%\\-\\./_@]*\\[[a-fA-F0-9:][a-fA-F0-9:\\.]*\\][a-zA-Z0-9:%\\-\\./=_+@#,\\$]*",
-#endif /* INET6 */
- NULL
- };
- int i;
- for (i = 0; url_like_pat[i]; i++) {
- reAnchor(buf, url_like_pat[i]);
- }
-#ifdef USE_EXTERNAL_URI_LOADER
- chkExternalURIBuffer(buf);
-#endif
- buf->check_url |= CHK_URL;
-}
-
-DEFUN(chkURL, MARK_URL, "Mark URL-like strings as anchors")
-{
- chkURLBuffer(Currentbuf);
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-DEFUN(chkWORD, MARK_WORD, "Mark current word as anchor")
-{
- char *p;
- int spos, epos;
- p = getCurWord(Currentbuf, &spos, &epos, ":\"\'`<>()[]{}&|;*?$");
- if (p == NULL)
- return;
- reAnchorWord(Currentbuf, Currentbuf->currentLine, spos, epos);
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-#ifdef USE_NNTP
-/* mark Message-ID-like patterns as NEWS anchors */
-void
-chkNMIDBuffer(Buffer *buf)
-{
- static char *url_like_pat[] = {
- "<[!-;=?-~]+@[a-zA-Z0-9\\.\\-_]+>",
- NULL,
- };
- int i;
- for (i = 0; url_like_pat[i]; i++) {
- reAnchorNews(buf, url_like_pat[i]);
- }
- buf->check_url |= CHK_NMID;
-}
-
-DEFUN(chkNMID, MARK_MID, "Mark Message-ID-like strings as anchors")
-{
- chkNMIDBuffer(Currentbuf);
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-#endif /* USE_NNTP */
-
-/* render frame */
-DEFUN(rFrame, FRAME, "Render frame")
-{
- Buffer *buf;
-
- if ((buf = Currentbuf->linkBuffer[LB_FRAME]) != NULL) {
- Currentbuf = buf;
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
- if (Currentbuf->frameset == NULL) {
- if ((buf = Currentbuf->linkBuffer[LB_N_FRAME]) != NULL) {
- Currentbuf = buf;
- displayBuffer(Currentbuf, B_NORMAL);
- }
- return;
- }
- if (fmInitialized) {
- message("Rendering frame", 0, 0);
- refresh();
- }
- buf = renderFrame(Currentbuf, 0);
- if (buf == NULL) {
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
- buf->linkBuffer[LB_N_FRAME] = Currentbuf;
- Currentbuf->linkBuffer[LB_FRAME] = buf;
- pushBuffer(buf);
- if (fmInitialized && display_ok)
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-/* spawn external browser */
-static void
-invoke_browser(char *url)
-{
- Str cmd;
- char *browser = NULL;
- int bg = 0, len;
-
- CurrentKeyData = NULL; /* not allowed in w3m-control: */
- browser = searchKeyData();
- if (browser == NULL || *browser == '\0') {
- switch (prec_num) {
- case 0:
- case 1:
- browser = ExtBrowser;
- break;
- case 2:
- browser = ExtBrowser2;
- break;
- case 3:
- browser = ExtBrowser3;
- break;
- }
- if (browser == NULL || *browser == '\0') {
- browser = inputStr("Browse command: ", NULL);
- if (browser != NULL)
- browser = conv_to_system(browser);
- }
- }
- else {
- browser = conv_to_system(browser);
- }
- if (browser == NULL || *browser == '\0') {
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
-
- if ((len = strlen(browser)) >= 2 && browser[len - 1] == '&' &&
- browser[len - 2] != '\\') {
- browser = allocStr(browser, len - 2);
- bg = 1;
- }
- cmd = myExtCommand(browser, shell_quote(url), FALSE);
- Strremovetrailingspaces(cmd);
- fmTerm();
- mySystem(cmd->ptr, bg);
- fmInit();
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-DEFUN(extbrz, EXTERN, "Execute external browser")
-{
- if (Currentbuf->bufferprop & BP_INTERNAL) {
- /* FIXME: gettextize? */
- disp_err_message("Can't browse...", TRUE);
- return;
- }
- if (Currentbuf->currentURL.scheme == SCM_LOCAL &&
- !strcmp(Currentbuf->currentURL.file, "-")) {
- /* file is std input */
- /* FIXME: gettextize? */
- disp_err_message("Can't browse stdin", TRUE);
- return;
- }
- invoke_browser(parsedURL2Str(&Currentbuf->currentURL)->ptr);
-}
-
-DEFUN(linkbrz, EXTERN_LINK, "View current link using external browser")
-{
- Anchor *a;
- ParsedURL pu;
-
- if (Currentbuf->firstLine == NULL)
- return;
- a = retrieveCurrentAnchor(Currentbuf);
- if (a == NULL)
- return;
- parseURL2(a->url, &pu, baseURL(Currentbuf));
- invoke_browser(parsedURL2Str(&pu)->ptr);
-}
-
-/* show current line number and number of lines in the entire document */
-DEFUN(curlno, LINE_INFO, "Show current line number")
-{
- Line *l = Currentbuf->currentLine;
- Str tmp;
- int cur = 0, all = 0, col = 0, len = 0;
-
- if (l != NULL) {
- cur = l->real_linenumber;
- col = l->bwidth + Currentbuf->currentColumn + Currentbuf->cursorX + 1;
- while (l->next && l->next->bpos)
- l = l->next;
- if (l->width < 0)
- l->width = COLPOS(l, l->len);
- len = l->bwidth + l->width;
- }
- if (Currentbuf->lastLine)
- all = Currentbuf->lastLine->real_linenumber;
- if (Currentbuf->pagerSource && !(Currentbuf->bufferprop & BP_CLOSE))
- tmp = Sprintf("line %d col %d/%d", cur, col, len);
- else
- tmp = Sprintf("line %d/%d (%d%%) col %d/%d", cur, all,
- (int)((double)cur * 100.0 / (double)(all ? all : 1)
- + 0.5), col, len);
-#ifdef USE_M17N
- Strcat_charp(tmp, " ");
- Strcat_charp(tmp, wc_ces_to_charset_desc(Currentbuf->document_charset));
-#endif
-
- disp_message(tmp->ptr, FALSE);
-}
-
-#ifdef USE_IMAGE
-DEFUN(dispI, DISPLAY_IMAGE, "Restart loading and drawing of images")
-{
- if (!displayImage)
- initImage();
- if (!activeImage)
- return;
- displayImage = TRUE;
- /*
- * if (!(Currentbuf->type && !strcmp(Currentbuf->type, "text/html")))
- * return;
- */
- Currentbuf->image_flag = IMG_FLAG_AUTO;
- Currentbuf->need_reshape = TRUE;
- displayBuffer(Currentbuf, B_REDRAW_IMAGE);
-}
-
-DEFUN(stopI, STOP_IMAGE, "Stop loading and drawing of images")
-{
- if (!activeImage)
- return;
- /*
- * if (!(Currentbuf->type && !strcmp(Currentbuf->type, "text/html")))
- * return;
- */
- Currentbuf->image_flag = IMG_FLAG_SKIP;
- displayBuffer(Currentbuf, B_REDRAW_IMAGE);
-}
-#endif
-
-#ifdef USE_MOUSE
-
-static int
-mouse_scroll_line(void)
-{
- if (relative_wheel_scroll)
- return (relative_wheel_scroll_ratio * LASTLINE + 99) / 100;
- else
- return fixed_wheel_scroll_count;
-}
-
-static TabBuffer *
-posTab(int x, int y)
-{
- TabBuffer *tab;
-
- if (mouse_action.menu_str && x < mouse_action.menu_width && y == 0)
- return NO_TABBUFFER;
- if (y > LastTab->y)
- return NULL;
- for (tab = FirstTab; tab; tab = tab->nextTab) {
- if (tab->x1 <= x && x <= tab->x2 && tab->y == y)
- return tab;
- }
- return NULL;
-}
-
-static void
-do_mouse_action(int btn, int x, int y)
-{
- MouseActionMap *map = NULL;
- int ny = -1;
-
- if (nTab > 1 || mouse_action.menu_str)
- ny = LastTab->y + 1;
-
- switch (btn) {
- case MOUSE_BTN1_DOWN:
- btn = 0;
- break;
- case MOUSE_BTN2_DOWN:
- btn = 1;
- break;
- case MOUSE_BTN3_DOWN:
- btn = 2;
- break;
- default:
- return;
- }
- if (y < ny) {
- if (mouse_action.menu_str && x >= 0 && x < mouse_action.menu_width) {
- if (mouse_action.menu_map[btn])
- map = &mouse_action.menu_map[btn][x];
- }
- else
- map = &mouse_action.tab_map[btn];
- }
- else if (y == LASTLINE) {
- if (mouse_action.lastline_str && x >= 0 &&
- x < mouse_action.lastline_width) {
- if (mouse_action.lastline_map[btn])
- map = &mouse_action.lastline_map[btn][x];
- }
- }
- else if (y > ny) {
- if (y == Currentbuf->cursorY + Currentbuf->rootY &&
- (x == Currentbuf->cursorX + Currentbuf->rootX
-#ifdef USE_M17N
- || (WcOption.use_wide && Currentbuf->currentLine != NULL &&
- (CharType(Currentbuf->currentLine->propBuf[Currentbuf->pos])
- == PC_KANJI1)
- && x == Currentbuf->cursorX + Currentbuf->rootX + 1)
-#endif
- )) {
- if (retrieveCurrentAnchor(Currentbuf) ||
- retrieveCurrentForm(Currentbuf)) {
- map = &mouse_action.active_map[btn];
- if (!(map && map->func))
- map = &mouse_action.anchor_map[btn];
- }
- }
- else {
- int cx = Currentbuf->cursorX, cy = Currentbuf->cursorY;
- cursorXY(Currentbuf, x - Currentbuf->rootX, y - Currentbuf->rootY);
- if (y == Currentbuf->cursorY + Currentbuf->rootY &&
- (x == Currentbuf->cursorX + Currentbuf->rootX
-#ifdef USE_M17N
- || (WcOption.use_wide && Currentbuf->currentLine != NULL &&
- (CharType(Currentbuf->currentLine->
- propBuf[Currentbuf->pos]) == PC_KANJI1)
- && x == Currentbuf->cursorX + Currentbuf->rootX + 1)
-#endif
- ) &&
- (retrieveCurrentAnchor(Currentbuf) ||
- retrieveCurrentForm(Currentbuf)))
- map = &mouse_action.anchor_map[btn];
- cursorXY(Currentbuf, cx, cy);
- }
- }
- if (!(map && map->func))
- map = &mouse_action.default_map[btn];
- if (map && map->func) {
- mouse_action.in_action = TRUE;
- mouse_action.cursorX = x;
- mouse_action.cursorY = y;
- CurrentKey = -1;
- CurrentKeyData = NULL;
- CurrentCmdData = map->data;
- (*map->func) ();
- CurrentCmdData = NULL;
- }
-}
-
-static void
-process_mouse(int btn, int x, int y)
-{
- int delta_x, delta_y, i;
- static int press_btn = MOUSE_BTN_RESET, press_x, press_y;
- TabBuffer *t;
- int ny = -1;
-
- if (nTab > 1 || mouse_action.menu_str)
- ny = LastTab->y + 1;
- if (btn == MOUSE_BTN_UP) {
- switch (press_btn) {
- case MOUSE_BTN1_DOWN:
- if (press_y == y && press_x == x)
- do_mouse_action(press_btn, x, y);
- else if (ny > 0 && y < ny) {
- if (press_y < ny) {
- moveTab(posTab(press_x, press_y), posTab(x, y),
- (press_y == y) ? (press_x < x) : (press_y < y));
- return;
- }
- else if (press_x >= Currentbuf->rootX) {
- Buffer *buf = Currentbuf;
- int cx = Currentbuf->cursorX, cy = Currentbuf->cursorY;
-
- t = posTab(x, y);
- if (t == NULL)
- return;
- if (t == NO_TABBUFFER)
- t = NULL; /* open new tab */
- cursorXY(Currentbuf, press_x - Currentbuf->rootX,
- press_y - Currentbuf->rootY);
- if (Currentbuf->cursorY == press_y - Currentbuf->rootY &&
- (Currentbuf->cursorX == press_x - Currentbuf->rootX
-#ifdef USE_M17N
- || (WcOption.use_wide &&
- Currentbuf->currentLine != NULL &&
- (CharType(Currentbuf->currentLine->
- propBuf[Currentbuf->pos]) == PC_KANJI1)
- && Currentbuf->cursorX == press_x
- - Currentbuf->rootX - 1)
-#endif
- )) {
- displayBuffer(Currentbuf, B_NORMAL);
- followTab(t);
- }
- if (buf == Currentbuf)
- cursorXY(Currentbuf, cx, cy);
- }
- return;
- }
- else {
- delta_x = x - press_x;
- delta_y = y - press_y;
-
- if (abs(delta_x) < abs(delta_y) / 3)
- delta_x = 0;
- if (abs(delta_y) < abs(delta_x) / 3)
- delta_y = 0;
- if (reverse_mouse) {
- delta_y = -delta_y;
- delta_x = -delta_x;
- }
- if (delta_y > 0) {
- prec_num = delta_y;
- ldown1();
- }
- else if (delta_y < 0) {
- prec_num = -delta_y;
- lup1();
- }
- if (delta_x > 0) {
- prec_num = delta_x;
- col1L();
- }
- else if (delta_x < 0) {
- prec_num = -delta_x;
- col1R();
- }
- }
- break;
- case MOUSE_BTN2_DOWN:
- case MOUSE_BTN3_DOWN:
- if (press_y == y && press_x == x)
- do_mouse_action(press_btn, x, y);
- break;
- case MOUSE_BTN4_DOWN_RXVT:
- for (i = 0; i < mouse_scroll_line(); i++)
- ldown1();
- break;
- case MOUSE_BTN5_DOWN_RXVT:
- for (i = 0; i < mouse_scroll_line(); i++)
- lup1();
- break;
- }
- }
- else if (btn == MOUSE_BTN4_DOWN_XTERM) {
- for (i = 0; i < mouse_scroll_line(); i++)
- ldown1();
- }
- else if (btn == MOUSE_BTN5_DOWN_XTERM) {
- for (i = 0; i < mouse_scroll_line(); i++)
- lup1();
- }
-
- if (btn != MOUSE_BTN4_DOWN_RXVT || press_btn == MOUSE_BTN_RESET) {
- press_btn = btn;
- press_x = x;
- press_y = y;
- }
- else {
- press_btn = MOUSE_BTN_RESET;
- }
-}
-
-DEFUN(msToggle, MOUSE_TOGGLE, "Toggle activity of mouse")
-{
- if (use_mouse) {
- use_mouse = FALSE;
- }
- else {
- use_mouse = TRUE;
- }
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-DEFUN(mouse, MOUSE, "mouse operation")
-{
- int btn, x, y;
-
- btn = (unsigned char)getch() - 32;
-#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
- x = (unsigned char)getch() - 33;
- if (x < 0)
- x += 0x100;
- y = (unsigned char)getch() - 33;
- if (y < 0)
- y += 0x100;
-
- 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)
-{
- int btn = MOUSE_BTN_RESET, x, y;
- if (event->type & GPM_UP)
- btn = MOUSE_BTN_UP;
- else if (event->type & GPM_DOWN) {
- switch (event->buttons) {
- case GPM_B_LEFT:
- btn = MOUSE_BTN1_DOWN;
- break;
- case GPM_B_MIDDLE:
- btn = MOUSE_BTN2_DOWN;
- break;
- case GPM_B_RIGHT:
- btn = MOUSE_BTN3_DOWN;
- break;
- }
- }
- else {
- GPM_DRAWPOINTER(event);
- return 0;
- }
- x = event->x;
- y = event->y;
- process_mouse(btn, x - 1, y - 1);
- return 0;
-}
-#endif /* USE_GPM */
-
-#ifdef USE_SYSMOUSE
-int
-sysm_process_mouse(int x, int y, int nbs, int obs)
-{
- int btn;
- int bits;
-
- if (obs & ~nbs)
- btn = MOUSE_BTN_UP;
- else if (nbs & ~obs) {
- bits = nbs & ~obs;
- btn = bits & 0x1 ? MOUSE_BTN1_DOWN :
- (bits & 0x2 ? MOUSE_BTN2_DOWN :
- (bits & 0x4 ? MOUSE_BTN3_DOWN : 0));
- }
- else /* nbs == obs */
- return 0;
- process_mouse(btn, x, y);
- return 0;
-}
-#endif /* USE_SYSMOUSE */
-
-DEFUN(movMs, MOVE_MOUSE, "Move cursor to mouse cursor (for mouse action)")
-{
- if (!mouse_action.in_action)
- return;
- if ((nTab > 1 || mouse_action.menu_str) &&
- mouse_action.cursorY < LastTab->y + 1)
- return;
- else if (mouse_action.cursorX >= Currentbuf->rootX &&
- mouse_action.cursorY < LASTLINE) {
- cursorXY(Currentbuf, mouse_action.cursorX - Currentbuf->rootX,
- mouse_action.cursorY - Currentbuf->rootY);
- }
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-#ifdef USE_MENU
-#ifdef KANJI_SYMBOLS
-#define FRAME_WIDTH 2
-#else
-#define FRAME_WIDTH 1
-#endif
-
-DEFUN(menuMs, MENU_MOUSE, "Popup menu at mouse cursor (for mouse action)")
-{
- if (!mouse_action.in_action)
- return;
- if ((nTab > 1 || mouse_action.menu_str) &&
- mouse_action.cursorY < LastTab->y + 1)
- mouse_action.cursorX -= FRAME_WIDTH + 1;
- else if (mouse_action.cursorX >= Currentbuf->rootX &&
- mouse_action.cursorY < LASTLINE) {
- cursorXY(Currentbuf, mouse_action.cursorX - Currentbuf->rootX,
- mouse_action.cursorY - Currentbuf->rootY);
- displayBuffer(Currentbuf, B_NORMAL);
- }
- mainMn();
-}
-#endif
-
-DEFUN(tabMs, TAB_MOUSE, "Move to tab on mouse cursor (for mouse action)")
-{
- TabBuffer *tab;
-
- if (!mouse_action.in_action)
- return;
- tab = posTab(mouse_action.cursorX, mouse_action.cursorY);
- if (!tab || tab == NO_TABBUFFER)
- return;
- CurrentTab = tab;
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-DEFUN(closeTMs, CLOSE_TAB_MOUSE,
- "Close tab on mouse cursor (for mouse action)")
-{
- TabBuffer *tab;
-
- if (!mouse_action.in_action)
- return;
- tab = posTab(mouse_action.cursorX, mouse_action.cursorY);
- if (!tab || tab == NO_TABBUFFER)
- return;
- deleteTab(tab);
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-#endif /* USE_MOUSE */
-
-DEFUN(dispVer, VERSION, "Display version of w3m")
-{
- disp_message(Sprintf("w3m version %s", w3m_version)->ptr, TRUE);
-}
-
-DEFUN(wrapToggle, WRAP_TOGGLE, "Toggle wrap search mode")
-{
- if (WrapSearch) {
- WrapSearch = FALSE;
- /* FIXME: gettextize? */
- disp_message("Wrap search off", TRUE);
- }
- else {
- WrapSearch = TRUE;
- /* FIXME: gettextize? */
- disp_message("Wrap search on", TRUE);
- }
-}
-
-static int
-is_wordchar(int c, const char *badchars)
-{
- if (badchars)
- return !(IS_SPACE(c) || strchr(badchars, c));
- else
- return IS_ALPHA(c);
-}
-
-static char *
-getCurWord(Buffer *buf, int *spos, int *epos, const char *badchars)
-{
- char *p;
- Line *l = buf->currentLine;
- int b, e;
-
- *spos = 0;
- *epos = 0;
- if (l == NULL)
- return NULL;
- p = l->lineBuf;
- e = buf->pos;
- while (e > 0 && !is_wordchar(p[e], badchars))
- e--;
- if (!is_wordchar(p[e], badchars))
- return NULL;
- b = e;
- while (b > 0 && is_wordchar(p[b - 1], badchars))
- b--;
- while (e < l->len && is_wordchar(p[e], badchars))
- e++;
- *spos = b;
- *epos = e;
- return &p[b];
-}
-
-static char *
-GetWord(Buffer *buf)
-{
- int b, e;
- char *p;
-
- if ((p = getCurWord(buf, &b, &e, 0)) != NULL) {
- return Strnew_charp_n(p, e - b)->ptr;
- }
- return NULL;
-}
-
-#ifdef USE_DICT
-static void
-execdict(char *word)
-{
- char *w, *dictcmd;
- Buffer *buf;
-
- if (!UseDictCommand || word == NULL || *word == '\0') {
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
- w = conv_to_system(word);
- if (*w == '\0') {
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
- dictcmd = Sprintf("%s?%s", DictCommand,
- Str_form_quote(Strnew_charp(w))->ptr)->ptr;
- buf = loadGeneralFile(dictcmd, NULL, NO_REFERER, 0, NULL);
- if (buf == NULL) {
- disp_message("Execution failed", TRUE);
- return;
- }
- else {
- buf->filename = w;
- buf->buffername = Sprintf("%s %s", DICTBUFFERNAME, word)->ptr;
- if (buf->type == NULL)
- buf->type = "text/plain";
- pushBuffer(buf);
- }
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-DEFUN(dictword, DICT_WORD, "Execute dictionary command (see README.dict)")
-{
- execdict(inputStr("(dictionary)!", ""));
-}
-
-DEFUN(dictwordat, DICT_WORD_AT,
- "Execute dictionary command for word at cursor")
-{
- execdict(GetWord(Currentbuf));
-}
-#endif /* USE_DICT */
-
-void
-set_buffer_environ(Buffer *buf)
-{
- static Buffer *prev_buf = NULL;
- static Line *prev_line = NULL;
- static int prev_pos = -1;
- Line *l;
-
- if (buf == NULL)
- return;
- if (buf != prev_buf) {
- set_environ("W3M_SOURCEFILE", buf->sourcefile);
- set_environ("W3M_FILENAME", buf->filename);
- set_environ("W3M_TITLE", buf->buffername);
- set_environ("W3M_URL", parsedURL2Str(&buf->currentURL)->ptr);
- set_environ("W3M_TYPE", buf->real_type ? buf->real_type : "unknown");
-#ifdef USE_M17N
- set_environ("W3M_CHARSET", wc_ces_to_charset(buf->document_charset));
-#endif
- }
- l = buf->currentLine;
- if (l && (buf != prev_buf || l != prev_line || buf->pos != prev_pos)) {
- Anchor *a;
- ParsedURL pu;
- char *s = GetWord(buf);
- set_environ("W3M_CURRENT_WORD", s ? s : "");
- a = retrieveCurrentAnchor(buf);
- if (a) {
- parseURL2(a->url, &pu, baseURL(buf));
- set_environ("W3M_CURRENT_LINK", parsedURL2Str(&pu)->ptr);
- }
- else
- set_environ("W3M_CURRENT_LINK", "");
- a = retrieveCurrentImg(buf);
- if (a) {
- parseURL2(a->url, &pu, baseURL(buf));
- set_environ("W3M_CURRENT_IMG", parsedURL2Str(&pu)->ptr);
- }
- else
- set_environ("W3M_CURRENT_IMG", "");
- a = retrieveCurrentForm(buf);
- if (a)
- set_environ("W3M_CURRENT_FORM", form2str((FormItemList *)a->url));
- else
- set_environ("W3M_CURRENT_FORM", "");
- set_environ("W3M_CURRENT_LINE", Sprintf("%d",
- l->real_linenumber)->ptr);
- set_environ("W3M_CURRENT_COLUMN", Sprintf("%d",
- buf->currentColumn +
- buf->cursorX + 1)->ptr);
- }
- else if (!l) {
- set_environ("W3M_CURRENT_WORD", "");
- set_environ("W3M_CURRENT_LINK", "");
- set_environ("W3M_CURRENT_IMG", "");
- set_environ("W3M_CURRENT_FORM", "");
- set_environ("W3M_CURRENT_LINE", "0");
- set_environ("W3M_CURRENT_COLUMN", "0");
- }
- prev_buf = buf;
- prev_line = l;
- prev_pos = buf->pos;
-}
-
-char *
-searchKeyData(void)
-{
- char *data = NULL;
-
- if (CurrentKeyData != NULL && *CurrentKeyData != '\0')
- data = CurrentKeyData;
- else if (CurrentCmdData != NULL && *CurrentCmdData != '\0')
- data = CurrentCmdData;
- else if (CurrentKey >= 0)
- data = getKeyData(CurrentKey);
- CurrentKeyData = NULL;
- CurrentCmdData = NULL;
- if (data == NULL || *data == '\0')
- return NULL;
- return allocStr(data, -1);
-}
-
-static int
-searchKeyNum(void)
-{
- char *d;
- int n = 1;
-
- d = searchKeyData();
- if (d != NULL)
- n = atoi(d);
- return n * PREC_NUM;
-}
-
-#ifdef __EMX__
-#ifdef USE_M17N
-static char *
-getCodePage(void)
-{
- unsigned long CpList[8], CpSize;
-
- if (!getenv("WINDOWID") && !DosQueryCp(sizeof(CpList), CpList, &CpSize))
- return Sprintf("CP%d", *CpList)->ptr;
- return NULL;
-}
-#endif
-#endif
-
-void
-deleteFiles()
-{
- Buffer *buf;
- char *f;
-
- for (CurrentTab = FirstTab; CurrentTab; CurrentTab = CurrentTab->nextTab) {
- while (Firstbuf && Firstbuf != NO_BUFFER) {
- buf = Firstbuf->nextBuffer;
- discardBuffer(Firstbuf);
- Firstbuf = buf;
- }
- }
- while ((f = popText(fileToDelete)) != NULL)
- unlink(f);
-}
-
-void
-w3m_exit(int i)
-{
-#ifdef USE_MIGEMO
- init_migemo(); /* close pipe to migemo */
-#endif
- stopDownload();
- deleteFiles();
-#ifdef USE_SSL
- free_ssl_ctx();
-#endif
- disconnectFTP();
-#ifdef USE_NNTP
- disconnectNews();
-#endif
- exit(i);
-}
-
-DEFUN(execCmd, COMMAND, "Execute w3m command(s)")
-{
- char *data, *p;
- int cmd;
-
- CurrentKeyData = NULL; /* not allowed in w3m-control: */
- data = searchKeyData();
- if (data == NULL || *data == '\0') {
- data = inputStrHist("command [; ...]: ", "", TextHist);
- if (data == NULL) {
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
- }
- /* data: FUNC [DATA] [; FUNC [DATA] ...] */
- while (*data) {
- SKIP_BLANKS(data);
- if (*data == ';') {
- data++;
- continue;
- }
- p = getWord(&data);
- cmd = getFuncList(p);
- if (cmd < 0)
- break;
- p = getQWord(&data);
- CurrentKey = -1;
- CurrentKeyData = NULL;
- CurrentCmdData = *p ? p : NULL;
-#ifdef USE_MOUSE
- if (use_mouse)
- mouse_inactive();
-#endif
- w3mFuncList[cmd].func();
-#ifdef USE_MOUSE
- if (use_mouse)
- mouse_active();
-#endif
- CurrentCmdData = NULL;
- }
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-#ifdef USE_ALARM
-static MySignalHandler
-SigAlarm(SIGNAL_ARG)
-{
- char *data;
-
- if (CurrentAlarm->sec > 0) {
- CurrentKey = -1;
- CurrentKeyData = NULL;
- CurrentCmdData = data = (char *)CurrentAlarm->data;
-#ifdef USE_MOUSE
- if (use_mouse)
- mouse_inactive();
-#endif
- w3mFuncList[CurrentAlarm->cmd].func();
-#ifdef USE_MOUSE
- if (use_mouse)
- mouse_active();
-#endif
- CurrentCmdData = NULL;
- if (CurrentAlarm->status == AL_IMPLICIT_ONCE) {
- CurrentAlarm->sec = 0;
- CurrentAlarm->status = AL_UNSET;
- }
- if (Currentbuf->event) {
- if (Currentbuf->event->status != AL_UNSET)
- CurrentAlarm = Currentbuf->event;
- else
- Currentbuf->event = NULL;
- }
- if (!Currentbuf->event)
- CurrentAlarm = &DefaultAlarm;
- if (CurrentAlarm->sec > 0) {
- mySignal(SIGALRM, SigAlarm);
- alarm(CurrentAlarm->sec);
- }
- }
- SIGNAL_RETURN;
-}
-
-
-DEFUN(setAlarm, ALARM, "Set alarm")
-{
- char *data;
- int sec = 0, cmd = -1;
-
- CurrentKeyData = NULL; /* not allowed in w3m-control: */
- data = searchKeyData();
- if (data == NULL || *data == '\0') {
- data = inputStrHist("(Alarm)sec command: ", "", TextHist);
- if (data == NULL) {
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
- }
- if (*data != '\0') {
- sec = atoi(getWord(&data));
- if (sec > 0)
- cmd = getFuncList(getWord(&data));
- }
- if (cmd >= 0) {
- data = getQWord(&data);
- setAlarmEvent(&DefaultAlarm, sec, AL_EXPLICIT, cmd, data);
- disp_message_nsec(Sprintf("%dsec %s %s", sec, w3mFuncList[cmd].id,
- data)->ptr, FALSE, 1, FALSE, TRUE);
- }
- else {
- setAlarmEvent(&DefaultAlarm, 0, AL_UNSET, FUNCNAME_nulcmd, NULL);
- }
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-AlarmEvent *
-setAlarmEvent(AlarmEvent * event, int sec, short status, int cmd, void *data)
-{
- if (event == NULL)
- event = New(AlarmEvent);
- event->sec = sec;
- event->status = status;
- event->cmd = cmd;
- event->data = data;
- return event;
-}
-#endif
-
-DEFUN(reinit, REINIT, "Reload configuration files")
-{
- char *resource = searchKeyData();
-
- if (resource == NULL) {
- init_rc();
- sync_with_option();
-#ifdef USE_COOKIE
- initCookie();
-#endif
- displayBuffer(Currentbuf, B_REDRAW_IMAGE);
- return;
- }
-
- if (!strcasecmp(resource, "CONFIG") || !strcasecmp(resource, "RC")) {
- init_rc();
- sync_with_option();
- displayBuffer(Currentbuf, B_REDRAW_IMAGE);
- return;
- }
-
-#ifdef USE_COOKIE
- if (!strcasecmp(resource, "COOKIE")) {
- initCookie();
- return;
- }
-#endif
-
- if (!strcasecmp(resource, "KEYMAP")) {
- initKeymap(TRUE);
- return;
- }
-
- if (!strcasecmp(resource, "MAILCAP")) {
- initMailcap();
- return;
- }
-
-#ifdef USE_MOUSE
- if (!strcasecmp(resource, "MOUSE")) {
- initMouseAction();
- displayBuffer(Currentbuf, B_REDRAW_IMAGE);
- return;
- }
-#endif
-
-#ifdef USE_MENU
- if (!strcasecmp(resource, "MENU")) {
- initMenu();
- return;
- }
-#endif
-
- if (!strcasecmp(resource, "MIMETYPES")) {
- initMimeTypes();
- return;
- }
-
-#ifdef USE_EXTERNAL_URI_LOADER
- if (!strcasecmp(resource, "URIMETHODS")) {
- initURIMethods();
- return;
- }
-#endif
-
- disp_err_message(Sprintf("Don't know how to reinitialize '%s'", resource)->
- ptr, FALSE);
-}
-
-DEFUN(defKey, DEFINE_KEY,
- "Define a binding between a key stroke and a user command")
-{
- char *data;
-
- CurrentKeyData = NULL; /* not allowed in w3m-control: */
- data = searchKeyData();
- if (data == NULL || *data == '\0') {
- data = inputStrHist("Key definition: ", "", TextHist);
- if (data == NULL || *data == '\0') {
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
- }
- setKeymap(allocStr(data, -1), -1, TRUE);
- displayBuffer(Currentbuf, B_NORMAL);
-}
-
-TabBuffer *
-newTab(void)
-{
- TabBuffer *n;
-
- n = New(TabBuffer);
- if (n == NULL)
- return NULL;
- n->nextTab = NULL;
- n->currentBuffer = NULL;
- n->firstBuffer = NULL;
- return n;
-}
-
-static void
-_newT(void)
-{
- TabBuffer *tag;
- Buffer *buf;
- int i;
-
- tag = newTab();
- if (!tag)
- return;
-
- buf = newBuffer(Currentbuf->width);
- copyBuffer(buf, Currentbuf);
- buf->nextBuffer = NULL;
- for (i = 0; i < MAX_LB; i++)
- buf->linkBuffer[i] = NULL;
- (*buf->clone)++;
- tag->firstBuffer = tag->currentBuffer = buf;
-
- tag->nextTab = CurrentTab->nextTab;
- tag->prevTab = CurrentTab;
- if (CurrentTab->nextTab)
- CurrentTab->nextTab->prevTab = tag;
- else
- LastTab = tag;
- CurrentTab->nextTab = tag;
- CurrentTab = tag;
- nTab++;
-}
-
-DEFUN(newT, NEW_TAB, "Open new tab")
-{
- _newT();
- displayBuffer(Currentbuf, B_REDRAW_IMAGE);
-}
-
-static TabBuffer *
-numTab(int n)
-{
- TabBuffer *tab;
- int i;
-
- if (n == 0)
- return CurrentTab;
- if (n == 1)
- return FirstTab;
- if (nTab <= 1)
- return NULL;
- for (tab = FirstTab, i = 1; tab && i < n; tab = tab->nextTab, i++) ;
- return tab;
-}
-
-void
-calcTabPos(void)
-{
- TabBuffer *tab;
-#if 0
- int lcol = 0, rcol = 2, col;
-#else
- int lcol = 0, rcol = 0, col;
-#endif
- int n1, n2, na, nx, ny, ix, iy;
-
-#ifdef USE_MOUSE
- lcol = mouse_action.menu_str ? mouse_action.menu_width : 0;
-#endif
-
- if (nTab <= 0)
- return;
- n1 = (COLS - rcol - lcol) / TabCols;
- if (n1 >= nTab) {
- n2 = 1;
- ny = 1;
- }
- else {
- if (n1 < 0)
- n1 = 0;
- n2 = COLS / TabCols;
- if (n2 == 0)
- n2 = 1;
- ny = (nTab - n1 - 1) / n2 + 2;
- }
- na = n1 + n2 * (ny - 1);
- n1 -= (na - nTab) / ny;
- if (n1 < 0)
- n1 = 0;
- na = n1 + n2 * (ny - 1);
- tab = FirstTab;
- for (iy = 0; iy < ny && tab; iy++) {
- if (iy == 0) {
- nx = n1;
- col = COLS - rcol - lcol;
- }
- else {
- nx = n2 - (na - nTab + (iy - 1)) / (ny - 1);
- col = COLS;
- }
- for (ix = 0; ix < nx && tab; ix++, tab = tab->nextTab) {
- tab->x1 = col * ix / nx;
- tab->x2 = col * (ix + 1) / nx - 1;
- tab->y = iy;
- if (iy == 0) {
- tab->x1 += lcol;
- tab->x2 += lcol;
- }
- }
- }
-}
-
-TabBuffer *
-deleteTab(TabBuffer * tab)
-{
- Buffer *buf, *next;
-
- if (nTab <= 1)
- return FirstTab;
- if (tab->prevTab) {
- if (tab->nextTab)
- tab->nextTab->prevTab = tab->prevTab;
- else
- LastTab = tab->prevTab;
- tab->prevTab->nextTab = tab->nextTab;
- if (tab == CurrentTab)
- CurrentTab = tab->prevTab;
- }
- else { /* tab == FirstTab */
- tab->nextTab->prevTab = NULL;
- FirstTab = tab->nextTab;
- if (tab == CurrentTab)
- CurrentTab = tab->nextTab;
- }
- nTab--;
- buf = tab->firstBuffer;
- while (buf && buf != NO_BUFFER) {
- next = buf->nextBuffer;
- discardBuffer(buf);
- buf = next;
- }
- return FirstTab;
-}
-
-DEFUN(closeT, CLOSE_TAB, "Close current tab")
-{
- TabBuffer *tab;
-
- if (nTab <= 1)
- return;
- if (prec_num)
- tab = numTab(PREC_NUM);
- else
- tab = CurrentTab;
- if (tab)
- deleteTab(tab);
- displayBuffer(Currentbuf, B_REDRAW_IMAGE);
-}
-
-DEFUN(nextT, NEXT_TAB, "Move to next tab")
-{
- int i;
-
- if (nTab <= 1)
- return;
- for (i = 0; i < PREC_NUM; i++) {
- if (CurrentTab->nextTab)
- CurrentTab = CurrentTab->nextTab;
- else
- CurrentTab = FirstTab;
- }
- displayBuffer(Currentbuf, B_REDRAW_IMAGE);
-}
-
-DEFUN(prevT, PREV_TAB, "Move to previous tab")
-{
- int i;
-
- if (nTab <= 1)
- return;
- for (i = 0; i < PREC_NUM; i++) {
- if (CurrentTab->prevTab)
- CurrentTab = CurrentTab->prevTab;
- else
- CurrentTab = LastTab;
- }
- displayBuffer(Currentbuf, B_REDRAW_IMAGE);
-}
-
-void
-followTab(TabBuffer * tab)
-{
- Buffer *buf;
- Anchor *a;
-
-#ifdef USE_IMAGE
- a = retrieveCurrentImg(Currentbuf);
- if (!(a && a->image && a->image->map))
-#endif
- a = retrieveCurrentAnchor(Currentbuf);
- if (a == NULL)
- return;
-
- if (tab == CurrentTab) {
- check_target = FALSE;
- followA();
- check_target = TRUE;
- return;
- }
- _newT();
- buf = Currentbuf;
- check_target = FALSE;
- followA();
- check_target = TRUE;
- if (tab == NULL) {
- if (buf != Currentbuf)
- delBuffer(buf);
- else
- deleteTab(CurrentTab);
- }
- else if (buf != Currentbuf) {
- /* buf <- p <- ... <- Currentbuf = c */
- Buffer *c, *p;
-
- c = Currentbuf;
- p = prevBuffer(c, buf);
- p->nextBuffer = NULL;
- Firstbuf = buf;
- deleteTab(CurrentTab);
- CurrentTab = tab;
- for (buf = p; buf; buf = p) {
- p = prevBuffer(c, buf);
- pushBuffer(buf);
- }
- }
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-DEFUN(tabA, TAB_LINK, "Open current link on new tab")
-{
- followTab(prec_num ? numTab(PREC_NUM) : NULL);
-}
-
-static void
-tabURL0(TabBuffer * tab, char *prompt, int relative)
-{
- Buffer *buf;
-
- if (tab == CurrentTab) {
- goURL0(prompt, relative);
- return;
- }
- _newT();
- buf = Currentbuf;
- goURL0(prompt, relative);
- if (tab == NULL) {
- if (buf != Currentbuf)
- delBuffer(buf);
- else
- deleteTab(CurrentTab);
- }
- else if (buf != Currentbuf) {
- /* buf <- p <- ... <- Currentbuf = c */
- Buffer *c, *p;
-
- c = Currentbuf;
- p = prevBuffer(c, buf);
- p->nextBuffer = NULL;
- Firstbuf = buf;
- deleteTab(CurrentTab);
- CurrentTab = tab;
- for (buf = p; buf; buf = p) {
- p = prevBuffer(c, buf);
- pushBuffer(buf);
- }
- }
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-DEFUN(tabURL, TAB_GOTO, "Open URL on new tab")
-{
- tabURL0(prec_num ? numTab(PREC_NUM) : NULL,
- "Goto URL on new tab: ", FALSE);
-}
-
-DEFUN(tabrURL, TAB_GOTO_RELATIVE, "Open relative URL on new tab")
-{
- tabURL0(prec_num ? numTab(PREC_NUM) : NULL,
- "Goto relative URL on new tab: ", TRUE);
-}
-
-void
-moveTab(TabBuffer * t, TabBuffer * t2, int right)
-{
- if (t2 == NO_TABBUFFER)
- t2 = FirstTab;
- if (!t || !t2 || t == t2 || t == NO_TABBUFFER)
- return;
- if (t->prevTab) {
- if (t->nextTab)
- t->nextTab->prevTab = t->prevTab;
- else
- LastTab = t->prevTab;
- t->prevTab->nextTab = t->nextTab;
- }
- else {
- t->nextTab->prevTab = NULL;
- FirstTab = t->nextTab;
- }
- if (right) {
- t->nextTab = t2->nextTab;
- t->prevTab = t2;
- if (t2->nextTab)
- t2->nextTab->prevTab = t;
- else
- LastTab = t;
- t2->nextTab = t;
- }
- else {
- t->prevTab = t2->prevTab;
- t->nextTab = t2;
- if (t2->prevTab)
- t2->prevTab->nextTab = t;
- else
- FirstTab = t;
- t2->prevTab = t;
- }
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-DEFUN(tabR, TAB_RIGHT, "Move current tab right")
-{
- TabBuffer *tab;
- int i;
-
- for (tab = CurrentTab, i = 0; tab && i < PREC_NUM;
- tab = tab->nextTab, i++) ;
- moveTab(CurrentTab, tab ? tab : LastTab, TRUE);
-}
-
-DEFUN(tabL, TAB_LEFT, "Move current tab left")
-{
- TabBuffer *tab;
- int i;
-
- for (tab = CurrentTab, i = 0; tab && i < PREC_NUM;
- tab = tab->prevTab, i++) ;
- moveTab(CurrentTab, tab ? tab : FirstTab, FALSE);
-}
-
-void
-addDownloadList(pid_t pid, char *url, char *save, char *lock, clen_t size)
-{
- DownloadList *d;
-
- d = New(DownloadList);
- d->pid = pid;
- d->url = url;
- if (save[0] != '/' && save[0] != '~')
- save = Strnew_m_charp(CurrentDir, "/", save, NULL)->ptr;
- d->save = expandPath(save);
- d->lock = lock;
- d->size = size;
- d->time = time(0);
- d->ok = FALSE;
- d->next = NULL;
- d->prev = LastDL;
- if (LastDL)
- LastDL->next = d;
- else
- FirstDL = d;
- LastDL = d;
- add_download_list = TRUE;
-}
-
-int
-checkDownloadList(void)
-{
- DownloadList *d;
- struct stat st;
-
- if (!FirstDL)
- return FALSE;
- for (d = FirstDL; d != NULL; d = d->next) {
- if (!d->ok && !lstat(d->lock, &st))
- return TRUE;
- }
- return FALSE;
-}
-
-static char *
-convert_size3(clen_t size)
-{
- Str tmp = Strnew();
- int n;
-
- do {
- n = size % 1000;
- size /= 1000;
- tmp = Sprintf(size ? ",%.3d%s" : "%d%s", n, tmp->ptr);
- } while (size);
- return tmp->ptr;
-}
-
-static Buffer *
-DownloadListBuffer(void)
-{
- DownloadList *d;
- Str src = NULL;
- struct stat st;
- time_t cur_time;
- int duration, rate, eta;
- size_t size;
-
- if (!FirstDL)
- return NULL;
- cur_time = time(0);
- /* FIXME: gettextize? */
- src = Strnew_charp("<html><head><title>" DOWNLOAD_LIST_TITLE
- "</title></head>\n<body><h1 align=center>"
- DOWNLOAD_LIST_TITLE "</h1>\n"
- "<form method=internal action=download><hr>\n");
- for (d = LastDL; d != NULL; d = d->prev) {
- if (lstat(d->lock, &st))
- d->ok = TRUE;
- Strcat_charp(src, "<pre>\n");
- Strcat(src, Sprintf("%s\n --&gt; %s\n ", html_quote(d->url),
- html_quote(conv_from_system(d->save))));
- duration = cur_time - d->time;
- if (!stat(d->save, &st)) {
- size = st.st_size;
- if (d->ok) {
- d->size = size;
- duration = st.st_mtime - d->time;
- }
- }
- else
- size = 0;
- if (d->size) {
- int i, l = COLS - 6;
- if (size < d->size)
- i = 1.0 * l * size / d->size;
- else
- i = l;
- l -= i;
- while (i-- > 0)
- Strcat_char(src, '#');
- while (l-- > 0)
- Strcat_char(src, '_');
- Strcat_char(src, '\n');
- }
- if (!d->ok && size < d->size)
- Strcat(src, Sprintf(" %s / %s bytes (%d%%)",
- convert_size3(size), convert_size3(d->size),
- (int)(100.0 * size / d->size)));
- else
- Strcat(src, Sprintf(" %s bytes loaded", convert_size3(size)));
- if (duration > 0) {
- rate = size / duration;
- Strcat(src, Sprintf(" %02d:%02d:%02d rate %s/sec",
- duration / (60 * 60), (duration / 60) % 60,
- duration % 60, convert_size(rate, 1)));
- if (!d->ok && size < d->size && rate) {
- eta = (d->size - size) / rate;
- Strcat(src, Sprintf(" eta %02d:%02d:%02d", eta / (60 * 60),
- (eta / 60) % 60, eta % 60));
- }
- }
- Strcat_char(src, '\n');
- if (d->ok) {
- Strcat(src, Sprintf("<input type=submit name=ok%d value=OK>",
- d->pid));
- if (size < d->size)
- Strcat_charp(src, " Download incompleted");
- else
- Strcat_charp(src, " Download completed");
- }
- else
- Strcat(src, Sprintf("<input type=submit name=stop%d value=STOP>",
- d->pid));
- Strcat_charp(src, "\n</pre><hr>\n");
- }
- Strcat_charp(src, "</form></body></html>");
- return loadHTMLString(src);
-}
-
-void
-download_action(struct parsed_tagarg *arg)
-{
- DownloadList *d;
- pid_t pid;
-
- for (; arg; arg = arg->next) {
- if (!strncmp(arg->arg, "stop", 4)) {
- pid = (pid_t) atoi(&arg->arg[4]);
- kill(pid, SIGKILL);
- }
- else if (!strncmp(arg->arg, "ok", 2))
- pid = (pid_t) atoi(&arg->arg[2]);
- else
- continue;
- for (d = FirstDL; d; d = d->next) {
- if (d->pid == pid) {
- unlink(d->lock);
- if (d->prev)
- d->prev->next = d->next;
- else
- FirstDL = d->next;
- if (d->next)
- d->next->prev = d->prev;
- else
- LastDL = d->prev;
- break;
- }
- }
- }
- ldDL();
-}
-
-void
-stopDownload(void)
-{
- DownloadList *d;
-
- if (!FirstDL)
- return;
- for (d = FirstDL; d != NULL; d = d->next) {
- if (d->ok)
- continue;
- kill(d->pid, SIGKILL);
- unlink(d->lock);
- }
-}
-
-/* download panel */
-DEFUN(ldDL, DOWNLOAD_LIST, "Display download list panel")
-{
- Buffer *buf;
- int replace = FALSE, new_tab = FALSE;
-#ifdef USE_ALARM
- int reload;
-#endif
-
- if (Currentbuf->bufferprop & BP_INTERNAL &&
- !strcmp(Currentbuf->buffername, DOWNLOAD_LIST_TITLE))
- replace = TRUE;
- if (!FirstDL) {
- if (replace) {
- if (Currentbuf == Firstbuf && Currentbuf->nextBuffer == NULL) {
- if (nTab > 1)
- deleteTab(CurrentTab);
- }
- else
- delBuffer(Currentbuf);
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
- }
- return;
- }
-#ifdef USE_ALARM
- reload = checkDownloadList();
-#endif
- buf = DownloadListBuffer();
- if (!buf) {
- displayBuffer(Currentbuf, B_NORMAL);
- return;
- }
- buf->bufferprop |= (BP_INTERNAL | BP_NO_URL);
- if (replace)
- restorePosition(buf, Currentbuf);
- if (!replace && open_tab_dl_list) {
- _newT();
- new_tab = TRUE;
- }
- pushBuffer(buf);
- if (replace || new_tab)
- deletePrevBuf();
-#ifdef USE_ALARM
- if (reload)
- Currentbuf->event = setAlarmEvent(Currentbuf->event, 1, AL_IMPLICIT,
- FUNCNAME_reload, NULL);
-#endif
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-static void
-save_buffer_position(Buffer *buf)
-{
- BufferPos *b = buf->undo;
-
- if (!buf->firstLine)
- return;
- if (b && b->top_linenumber == TOP_LINENUMBER(buf) &&
- b->cur_linenumber == CUR_LINENUMBER(buf) &&
- b->currentColumn == buf->currentColumn && b->pos == buf->pos)
- return;
- b = New(BufferPos);
- b->top_linenumber = TOP_LINENUMBER(buf);
- b->cur_linenumber = CUR_LINENUMBER(buf);
- b->currentColumn = buf->currentColumn;
- b->pos = buf->pos;
- b->bpos = buf->currentLine ? buf->currentLine->bpos : 0;
- b->next = NULL;
- b->prev = buf->undo;
- if (buf->undo)
- buf->undo->next = b;
- buf->undo = b;
-}
-
-static void
-resetPos(BufferPos * b)
-{
- Buffer buf;
- Line top, cur;
-
- top.linenumber = b->top_linenumber;
- cur.linenumber = b->cur_linenumber;
- cur.bpos = b->bpos;
- buf.topLine = &top;
- buf.currentLine = &cur;
- buf.pos = b->pos;
- buf.currentColumn = b->currentColumn;
- restorePosition(Currentbuf, &buf);
- Currentbuf->undo = b;
- displayBuffer(Currentbuf, B_FORCE_REDRAW);
-}
-
-DEFUN(undoPos, UNDO, "Cancel the last cursor movement")
-{
- BufferPos *b = Currentbuf->undo;
- int i;
-
- if (!Currentbuf->firstLine)
- return;
- if (!b || !b->prev)
- return;
- for (i = 0; i < PREC_NUM && b->prev; i++, b = b->prev) ;
- resetPos(b);
-}
-
-DEFUN(redoPos, REDO, "Cancel the last undo")
-{
- BufferPos *b = Currentbuf->undo;
- int i;
-
- if (!Currentbuf->firstLine)
- return;
- if (!b || !b->next)
- return;
- for (i = 0; i < PREC_NUM && b->next; i++, b = b->next) ;
- resetPos(b);
-}
diff --git a/Bonus/CVS/Entries b/Bonus/CVS/Entries
deleted file mode 100644
index b22f196..0000000
--- a/Bonus/CVS/Entries
+++ /dev/null
@@ -1,15 +0,0 @@
-/2ch.cgi/1.3/Sat Apr 26 17:01:02 2003//
-/README/1.4/Wed Jan 15 15:51:29 2003//
-/README.eng/1.4/Wed Jan 15 15:51:30 2003//
-/backslash_to_slash.cgi/1.1/Tue Apr 15 14:46:23 2003//
-/goodict.cgi/1.2/Sat Apr 12 14:28:56 2003//
-/google.cgi/1.1/Fri Jan 10 16:24:01 2003//
-/html2latex/1.2/Fri Nov 9 04:59:18 2001//
-/htmldump/1.1.1.1/Thu Nov 8 05:16:01 2001//
-/makeref/1.1.1.1/Thu Nov 8 05:16:01 2001//
-/oldconfigure.sh/1.3/Wed Mar 12 17:20:47 2003//
-/scanhist.rb/1.1.1.1/Thu Nov 8 05:16:01 2001//
-/smb.cgi/1.3/Fri Jan 31 16:25:12 2003//
-/utf8.cgi/1.1/Thu Feb 27 15:14:42 2003//
-/wrap3m/1.1.1.1/Thu Nov 8 05:16:01 2001//
-D
diff --git a/Bonus/CVS/Repository b/Bonus/CVS/Repository
deleted file mode 100644
index a8a0516..0000000
--- a/Bonus/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/Bonus
diff --git a/Bonus/CVS/Root b/Bonus/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/Bonus/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
diff --git a/CVS/Entries b/CVS/Entries
deleted file mode 100644
index 55c22e0..0000000
--- a/CVS/Entries
+++ /dev/null
@@ -1,114 +0,0 @@
-/.cvsignore/1.12/Fri Sep 26 20:45:53 2003//
-/README/1.1.1.1/Thu Nov 8 05:14:08 2001//
-/Str.c/1.8/Tue Dec 24 17:20:46 2002//
-/Str.h/1.6/Fri Apr 7 13:35:35 2006//
-/TODO/1.21/Sun Apr 4 16:47:20 2004//
-/anchor.c/1.33/Sat Apr 8 11:33:16 2006//
-/charset-list/1.1/Mon Sep 22 21:02:16 2003//
-/config.guess/1.2/Wed Aug 4 17:32:27 2004//
-/config.h.dist/1.36/Fri Apr 9 17:18:49 2004//
-/config.sub/1.2/Wed Aug 4 17:32:27 2004//
-/ctrlcode.h/1.3/Mon Sep 22 21:02:17 2003//
-/entity.c/1.7/Wed Sep 24 18:48:59 2003//
-/entity.tab/1.1/Fri Nov 9 04:59:17 2001//
-/form.h/1.6/Mon Sep 22 21:02:18 2003//
-/frame.c/1.34/Fri Sep 26 17:59:51 2003//
-/frame.h/1.6/Sat Jan 25 17:42:17 2003//
-/func.c/1.27/Fri Sep 26 17:59:51 2003//
-/func.h/1.4/Tue Dec 3 16:01:33 2002//
-/funcname0.awk/1.1.1.1/Thu Nov 8 05:14:56 2001//
-/funcname1.awk/1.1.1.1/Thu Nov 8 05:14:56 2001//
-/funcname2.awk/1.1.1.1/Thu Nov 8 05:14:56 2001//
-/functable.awk/1.1/Mon Dec 10 17:02:44 2001//
-/hash.c/1.5/Mon Apr 7 16:27:10 2003//
-/hash.h/1.6/Wed Sep 24 18:48:59 2003//
-/history.c/1.11/Fri Sep 26 17:59:51 2003//
-/history.h/1.5/Sat Jan 26 17:24:01 2002//
-/indep.h/1.16/Mon Sep 22 21:02:19 2003//
-/inflate.c/1.7/Thu Jan 31 18:28:24 2002//
-/islang.c/1.3/Sat Feb 26 17:06:44 2005//
-/istream.h/1.12/Mon Oct 20 16:41:56 2003//
-/local.h/1.3/Tue Nov 20 17:49:23 2001//
-/map.c/1.30/Wed Sep 24 18:49:00 2003//
-/matrix.c/1.8/Mon Apr 7 16:27:10 2003//
-/matrix.h/1.7/Thu Jul 18 14:59:02 2002//
-/menu.h/1.2/Tue Nov 20 17:49:23 2001//
-/mimehead.c/1.10/Sun Oct 5 18:52:51 2003//
-/mkinstalldirs/1.1/Tue Sep 23 18:42:25 2003//
-/myctype.c/1.7/Mon Sep 22 21:02:20 2003//
-/myctype.h/1.6/Mon Sep 22 21:02:20 2003//
-/news.c/1.17/Sun Oct 5 18:52:51 2003//
-/parsetag.c/1.4/Tue Nov 20 17:49:23 2001//
-/parsetag.h/1.2/Tue Nov 20 17:49:23 2001//
-/parsetagx.h/1.4/Sat Nov 24 02:01:26 2001//
-/posubst.in/1.1/Thu Sep 25 18:15:47 2003//
-/regex.h/1.6/Mon Sep 22 21:02:21 2003//
-/scrsize.c/1.2/Sat Nov 24 02:01:26 2001//
-/search.c/1.31/Tue Mar 23 16:44:02 2004//
-/table.h/1.12/Mon Sep 22 21:02:21 2003//
-/terms.h/1.10/Thu Jul 15 16:32:39 2004//
-/textlist.c/1.6/Mon Apr 7 16:27:11 2003//
-/textlist.h/1.6/Mon Jan 20 15:30:22 2003//
-/w3mhelp-lynx_en.html.in/1.1/Fri Dec 21 22:02:39 2001//
-/w3mhelp-lynx_ja.html.in/1.1/Fri Dec 21 22:02:39 2001//
-/w3mhelp-w3m_en.html.in/1.1/Fri Dec 21 22:02:39 2001//
-/w3mhelp-w3m_ja.html.in/1.1/Fri Dec 21 22:02:39 2001//
-D/Bonus////
-D/Patches////
-D/Symbols////
-D/doc////
-D/doc-jp////
-D/gc////
-D/intl////
-D/libwc////
-D/po////
-D/scripts////
-D/w3m-doc////
-D/w3mimg////
-/keybind.c/1.10/Sat Jun 10 09:52:18 2006//
-/keybind_lynx.c/1.8/Sat Jun 10 09:52:18 2006//
-/parsetagx.c/1.18/Sat Jun 10 09:52:18 2006//
-/mailcap.c/1.13/Tue Jan 23 12:24:11 2007//
-/Makefile.in/1.44/Tue Jan 4 09:22:18 2011//
-/acinclude.m4/1.45/Tue Jan 4 09:22:18 2011//
-/aclocal.m4/1.46/Tue Jan 4 09:22:18 2011//
-/backend.c/1.15/Tue Jan 4 09:22:19 2011//
-/buffer.c/1.30/Tue Jan 4 09:22:19 2011//
-/config.h.in/1.21/Tue Jan 4 09:22:19 2011//
-/cookie.c/1.11/Tue Jan 4 09:22:20 2011//
-/display.c/1.71/Tue Jan 4 09:22:20 2011//
-/etc.c/1.81/Tue Jan 4 09:22:20 2011//
-/file.c/1.265/Tue Jan 4 09:22:21 2011//
-/fm.h/1.149/Tue Jan 4 09:22:21 2011//
-/form.c/1.35/Tue Jan 4 09:22:21 2011//
-/ftp.c/1.42/Tue Jan 4 09:22:21 2011//
-/html.c/1.32/Tue Jan 4 09:22:21 2011//
-/html.h/1.31/Tue Jan 4 09:22:21 2011//
-/image.c/1.37/Tue Jan 4 09:22:22 2011//
-/indep.c/1.38/Tue Jan 4 09:22:22 2011//
-/istream.c/1.27/Tue Jan 4 09:22:22 2011//
-/linein.c/1.35/Tue Jan 4 09:22:22 2011//
-/local.c/1.35/Tue Jan 4 09:22:22 2011//
-/menu.c/1.46/Tue Jan 4 09:22:23 2011//
-/mktable.c/1.16/Tue Jan 4 09:22:23 2011//
-/proto.h/1.104/Tue Jan 4 09:22:23 2011//
-/rc.c/1.116/Tue Jan 4 09:22:23 2011//
-/regex.c/1.23/Tue Jan 4 09:22:23 2011//
-/symbol.c/1.4/Tue Jan 4 09:22:23 2011//
-/table.c/1.58/Tue Jan 4 09:22:23 2011//
-/tagtable.tab/1.14/Tue Jan 4 09:22:23 2011//
-/terms.c/1.63/Tue Jan 4 09:22:23 2011//
-/url.c/1.100/Tue Jan 4 09:22:24 2011//
-/w3mbookmark.c/1.12/Tue Jan 4 09:22:24 2011//
-/w3mhelperpanel.c/1.14/Tue Jan 4 09:22:24 2011//
-/w3mimgdisplay.c/1.19/Tue Jan 4 09:22:24 2011//
-/main.c/1.270/Tue Jan 4 09:42:19 2011//
-/ABOUT-NLS/1.2/Tue Jan 4 12:39:27 2011//
-/config.rpath/1.2/Tue Jan 4 12:39:29 2011//
-/entity.h/1.6/Tue Jan 4 12:39:29 2011//
-/install-sh/1.8/Tue Jan 4 12:39:29 2011//
-/ChangeLog/1.1050/Sat Jan 15 07:52:48 2011//
-/NEWS/1.80/Sat Jan 15 03:01:36 2011//
-/configure/1.164/Sat Jan 15 03:04:22 2011//
-/configure.ac/1.12/Sat Jan 15 03:01:55 2011//
-/version.c.in/1.48/Sat Jan 15 07:52:48 2011//
diff --git a/CVS/Repository b/CVS/Repository
deleted file mode 100644
index 625add0..0000000
--- a/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m
diff --git a/CVS/Root b/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
diff --git a/ChangeLog b/ChangeLog
index f9162e1..01b0a2e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,207 @@
+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'
+ * Makefile.in: add entity.h to "make clean" target.
+
+2012-05-22 Tatsuya Kinoshita <tats@vega.ocn.ne.jp>
+
+ * [w3m-dev 04452] Re: w3m on macosx 10.6.6
+ * doc/w3m.1, doc/STORY.html, doc-jp/STORY.html:
+ delete words about formerly included Boehm GC library.
+
+2012-05-22 Enu <theme.of.n@gmail.com>
+
+ * file.c, HTML.c: parse META CHARSET.
+
2011-01-17 Dai Sato <satodai@w3m.jp>
* correction: ChangeLog of 2011-01-15 (0.5.2 -> 0.5.3)
@@ -9304,4 +9508,4 @@ a * [w3m-dev 03276] compile error on EWS4800
* release-0-2-1
* import w3m-0.2.1
-$Id: ChangeLog,v 1.1051 2011/01/17 11:53:57 inu Exp $
+$Id: ChangeLog,v 1.1055 2012/05/22 10:20:45 inu Exp $
diff --git a/Makefile.in b/Makefile.in
index b283f29..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
@@ -199,7 +199,7 @@ dummy.o: entity.c
$(CC) $(CFLAGS) -DDUMMY -c -o $@ $?
$(IMGDISPLAY): w3mimgdisplay.o $(ALIB) w3mimg/w3mimg.a
- $(IMGLINK) $(CFLAGS) -o $(IMGDISPLAY) w3mimgdisplay.o w3mimg/w3mimg.a $(LDFLAGS) $(LIBS) -lX11 $(IMGLDFLAGS)
+ $(IMGLINK) $(CFLAGS) -o $(IMGDISPLAY) w3mimgdisplay.o w3mimg/w3mimg.a $(LDFLAGS) $(LIBS) $(IMGLDFLAGS)
w3mimgdisplay.o: w3mimgdisplay.c w3mimg/w3mimg.h
$(CC) $(CFLAGS) $(IMGCFLAGS) -o $@ -c $(srcdir)/w3mimgdisplay.c
@@ -288,8 +288,7 @@ uninstall:
clean: sweep
-$(RM) -f *.o *.a $(TARGETS) mktable$(EXT)
-$(RM) -f funcname.tab
- -$(RM) -f entity.h
- -$(RM) -f funcname.c funcname1.h funcname2.h tagtable.c functable.c
+ -$(RM) -f entity.h funcname.c funcname1.h funcname2.h tagtable.c functable.c
-for dir in w3mimg libwc; \
do \
(cd $$dir && $(MAKE) clean RM="$(RM)"); \
diff --git a/Patches/CVS/Entries b/Patches/CVS/Entries
deleted file mode 100644
index 1784810..0000000
--- a/Patches/CVS/Entries
+++ /dev/null
@@ -1 +0,0 @@
-D
diff --git a/Patches/CVS/Repository b/Patches/CVS/Repository
deleted file mode 100644
index cd4278c..0000000
--- a/Patches/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/Patches
diff --git a/Patches/CVS/Root b/Patches/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/Patches/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
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/Symbols/CVS/Entries b/Symbols/CVS/Entries
deleted file mode 100644
index dc12f1a..0000000
--- a/Symbols/CVS/Entries
+++ /dev/null
@@ -1,11 +0,0 @@
-/alt.sym/1.1/Mon Sep 22 21:02:22 2003//
-/big5.sym/1.1/Mon Sep 22 21:02:22 2003//
-/cp850.sym/1.1/Mon Sep 22 21:02:22 2003//
-/euccn.sym/1.1/Mon Sep 22 21:02:22 2003//
-/eucjp.sym/1.1/Mon Sep 22 21:02:22 2003//
-/euckr.sym/1.1/Mon Sep 22 21:02:22 2003//
-/euctw.sym/1.1/Mon Sep 22 21:02:22 2003//
-/graph.sym/1.1/Mon Sep 22 21:02:22 2003//
-/sym.pl/1.1/Mon Sep 22 21:02:22 2003//
-/utf8.sym/1.1/Mon Sep 22 21:02:22 2003//
-D
diff --git a/Symbols/CVS/Repository b/Symbols/CVS/Repository
deleted file mode 100644
index 9d32bc6..0000000
--- a/Symbols/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/Symbols
diff --git a/Symbols/CVS/Root b/Symbols/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/Symbols/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
diff --git a/acinclude.m4 b/acinclude.m4
index 52c8874..48e0ff8 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -706,7 +706,7 @@ AC_DEFUN([AC_W3M_IMAGE],
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`"
+ IMGX11LDFLAGS="-lX11 `${PKG_CONFIG} --libs gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0 gtk+-2.0`"
elif test x"$have_gdkpixbuf" = xyes; then
AC_DEFINE(USE_W3MIMG_X11)
IMGOBJS="$IMGOBJS x11/x11_w3mimg.o"
diff --git a/anchor.c b/anchor.c
index 27bbd56..39f221d 100644
--- a/anchor.c
+++ b/anchor.c
@@ -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..120cc0d 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-2013 Free Software Foundation, Inc.
-timestamp='2004-03-12'
+timestamp='2013-05-16'
# 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-2013 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'`
+ ;;
+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,339 @@ 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 ;;
+ i*: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 ;;
+ or1k:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ or32: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 ;;
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 +1060,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 +1087,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 +1174,99 @@ 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 [ "$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
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 +1274,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,36 +1306,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_
@@ -1282,16 +1372,16 @@ main ()
#include <sys/param.h>
printf ("m68k-sony-newsos%s\n",
#ifdef NEWSOS4
- "4"
+ "4"
#else
- ""
+ ""
#endif
- ); exit (0);
+ ); exit (0);
#endif
#endif
#if defined (__arm) && defined (__acorn) && defined (__unix)
- printf ("arm-acorn-riscix"); exit (0);
+ printf ("arm-acorn-riscix\n"); exit (0);
#endif
#if defined (hp300) && !defined (hpux)
@@ -1380,11 +1470,12 @@ main ()
}
EOF
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+ { echo "$SYSTEM_NAME"; exit; }
# Apollos put the system type in the environment.
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
# Convex versions that predate uname can use getsysinfo(1)
@@ -1393,22 +1484,22 @@ then
case `getsysinfo -f cpu_type` in
c1*)
echo c1-convex-bsd
- exit 0 ;;
+ exit ;;
c2*)
if getsysinfo -f scalar_acc
then echo c32-convex-bsd
else echo c2-convex-bsd
fi
- exit 0 ;;
+ exit ;;
c34*)
echo c34-convex-bsd
- exit 0 ;;
+ exit ;;
c38*)
echo c38-convex-bsd
- exit 0 ;;
+ exit ;;
c4*)
echo c4-convex-bsd
- exit 0 ;;
+ exit ;;
esac
fi
@@ -1419,7 +1510,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..a4110ea 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"
@@ -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..8b612ab 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-2013 Free Software Foundation, Inc.
-timestamp='2004-03-12'
+timestamp='2013-04-24'
-# 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-2013 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,106 @@ 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 \
+ | arc | arceb \
+ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
+ | avr | avr32 \
+ | be32 | be64 \
+ | bfin \
| c4x | 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 \
+ | 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 \
| mipsisa64 | mipsisa64el \
| mipsisa64r2 | mipsisa64r2el \
| 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 | 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 \
+ | 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 | 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 +363,82 @@ 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-* \
+ | 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-* \
+ | 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-* \
| mipsisa64-* | mipsisa64el-* \
| mipsisa64r2-* | mipsisa64r2el-* \
| 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-* \
| 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 +456,7 @@ case $basic_machine in
basic_machine=a29k-amd
os=-udi
;;
- abacus)
+ abacus)
basic_machine=abacus-unknown
;;
adobe68k)
@@ -409,6 +502,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 +514,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 +567,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 +610,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 +729,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 +767,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 +786,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
os=-mingw32
;;
+ mingw32ce)
+ basic_machine=arm-unknown
+ os=-mingw32ce
+ ;;
miniframe)
basic_machine=m68000-convergent
;;
@@ -659,10 +814,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
@@ -675,10 +826,21 @@ case $basic_machine in
basic_machine=i386-pc
os=-msdos
;;
+ ms1-*)
+ basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+ ;;
+ msys)
+ basic_machine=i386-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 +905,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 +918,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 +941,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 +958,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 +993,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 +1021,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 +1055,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 +1070,9 @@ case $basic_machine in
basic_machine=sh-hitachi
os=-hms
;;
+ sh5el)
+ basic_machine=sh5le-unknown
+ ;;
sh64)
basic_machine=sh64-unknown
;;
@@ -901,6 +1094,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 +1153,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 +1217,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 +1235,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 +1258,9 @@ case $basic_machine in
romp)
basic_machine=romp-ibm
;;
+ mmix)
+ basic_machine=mmix-knuth
+ ;;
rs6000)
basic_machine=rs6000-ibm
;;
@@ -1075,13 +1277,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 +1324,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 +1350,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* \
| -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*)
# Remember, each alternative MUST END IN *, to match a version number.
;;
-qnx*)
@@ -1185,7 +1392,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 +1413,7 @@ case $os in
-opened*)
os=-openedition
;;
- -os400*)
+ -os400*)
os=-os400
;;
-wince*)
@@ -1255,7 +1462,7 @@ case $os in
-sinix*)
os=-sysv4
;;
- -tpf*)
+ -tpf*)
os=-tpf
;;
-triton*)
@@ -1291,8 +1498,13 @@ case $os in
-aros*)
os=-aros
;;
- -kaos*)
- os=-kaos
+ -zvmoe)
+ os=-zvmoe
+ ;;
+ -dicos*)
+ os=-dicos
+ ;;
+ -nacl*)
;;
-none)
;;
@@ -1316,6 +1528,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 +1543,21 @@ case $basic_machine in
arm*-semi)
os=-aout
;;
- c4x-* | tic4x-*)
- os=-coff
- ;;
+ c4x-* | tic4x-*)
+ os=-coff
+ ;;
+ hexagon-*)
+ os=-elf
+ ;;
+ tic54x-*)
+ os=-coff
+ ;;
+ tic55x-*)
+ os=-coff
+ ;;
+ tic6x-*)
+ os=-coff
+ ;;
# This must come before the *-dec entry.
pdp10-*)
os=-tops20
@@ -1346,19 +1576,22 @@ 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
;;
mips*-*)
os=-elf
;;
+ or1k-*)
+ os=-elf
+ ;;
or32-*)
os=-coff
;;
@@ -1371,9 +1604,15 @@ case $basic_machine in
*-be)
os=-beos
;;
+ *-haiku)
+ os=-haiku
+ ;;
*-ibm)
os=-aix
;;
+ *-knuth)
+ os=-mmixware
+ ;;
*-wec)
os=-proelf
;;
@@ -1476,7 +1715,7 @@ case $basic_machine in
-sunos*)
vendor=sun
;;
- -aix*)
+ -cnk*|-aix*)
vendor=ibm
;;
-beos*)
@@ -1539,7 +1778,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 2e37bb1..42977d0 100755
--- a/configure
+++ b/configure
@@ -6927,7 +6927,7 @@ $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`"
+ IMGX11LDFLAGS="-lX11 `${PKG_CONFIG} --libs gdk-pixbuf-2.0 gdk-pixbuf-xlib-2.0 gtk+-2.0`"
elif test x"$have_gdkpixbuf" = xyes; then
$as_echo "#define USE_W3MIMG_X11 1" >>confdefs.h
diff --git a/display.c b/display.c
index e00eb0c..2fe1183 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
diff --git a/doc-jp/CVS/Entries b/doc-jp/CVS/Entries
deleted file mode 100644
index cfd3d8e..0000000
--- a/doc-jp/CVS/Entries
+++ /dev/null
@@ -1,26 +0,0 @@
-/FAQ.html/1.9/Sat Apr 8 11:26:23 2006//
-/HISTORY/1.1.1.1/Thu Nov 8 05:16:27 2001//
-/README.SSL/1.4/Tue May 13 17:17:54 2003//
-/README.cygwin/1.4/Sun Feb 23 16:00:17 2003//
-/README.dict/1.4/Wed Apr 24 18:46:48 2002//
-/README.func/1.22/Mon Sep 22 21:02:23 2003//
-/README.keymap/1.1.1.1/Thu Nov 8 05:16:34 2001//
-/README.mailcap/1.2/Fri Nov 9 04:59:18 2001//
-/README.menu/1.2/Wed Nov 27 16:28:37 2002//
-/README.migemo/1.2/Tue May 13 17:17:54 2003//
-/README.mouse/1.1/Mon Nov 25 17:23:47 2002//
-/README.pre_form/1.3/Mon May 12 16:24:53 2003//
-/README.tab/1.1/Tue Nov 5 17:24:48 2002//
-/STORY.html/1.3/Tue May 13 17:17:54 2003//
-/keymap.lynx/1.4/Fri Dec 13 03:02:04 2002//
-/menu.default/1.4/Fri Apr 7 15:22:07 2006//
-/menu.submenu/1.3/Fri Apr 7 15:22:07 2006//
-/keymap.default/1.8/Sat Jun 10 09:52:18 2006//
-/MANUAL.html/1.9/Tue Jan 4 09:22:24 2011//
-/README.img/1.7/Tue Jan 4 09:22:24 2011//
-/README.m17n/1.3/Tue Jan 4 09:22:24 2011//
-/README.passwd/1.1/Tue Aug 3 10:02:16 2010//
-/w3m.1/1.7/Tue Jan 4 09:22:24 2011//
-/README.cookie/1.4/Sat Jan 15 01:57:39 2011//
-/README/1.26/Sat Jan 15 02:17:10 2011//
-D
diff --git a/doc-jp/CVS/Repository b/doc-jp/CVS/Repository
deleted file mode 100644
index f7f574e..0000000
--- a/doc-jp/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/doc-jp
diff --git a/doc-jp/CVS/Root b/doc-jp/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/doc-jp/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
diff --git a/doc-jp/MANUAL.html b/doc-jp/MANUAL.html
index 41d70f1..f197cfb 100644
--- a/doc-jp/MANUAL.html
+++ b/doc-jp/MANUAL.html
@@ -51,15 +51,9 @@ w3m ϡƥȥ١Υڡ/WWW֥饦ǤȤȡkterm ʤɤΥ
<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λˡβ̤ʤ
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.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/STORY.html b/doc-jp/STORY.html
index c261b47..a3b22a4 100644
--- a/doc-jp/STORY.html
+++ b/doc-jp/STORY.html
@@ -158,6 +158,9 @@ w3m ϡ
<a href="http://www.hpl.hp.com/personal/Hans_Boehm/gc/">Boehm GC</a>
Ȥ饤֥ѤƤ롥ϻ䤬񤤤ΤǤϤʤ
ѥصͤۥѥå˴ޤƤ롥
+<P>
+# Boehm GC ϡw3m-0.4.2 ʹߤΥѥåˤϴޤޤƤޤ
+<P>
ʤlibwww ϻȤäƤʤ
<P>
Boehm GCϡCȤ륬١쥯table ˤ
diff --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/CVS/Entries b/doc/CVS/Entries
deleted file mode 100644
index 8cae998..0000000
--- a/doc/CVS/Entries
+++ /dev/null
@@ -1,21 +0,0 @@
-/HISTORY/1.2/Tue Jul 9 05:54:46 2002//
-/README.cygwin/1.5/Sun Feb 23 16:00:16 2003//
-/README.dict/1.4/Wed Apr 24 18:46:48 2002//
-/README.func/1.21/Mon Sep 22 21:02:22 2003//
-/README.mouse/1.1/Mon Nov 25 17:23:45 2002//
-/README.pre_form/1.3/Mon May 12 16:24:53 2003//
-/README.tab/1.1/Tue Nov 5 17:24:47 2002//
-/STORY.html/1.3/Wed Nov 21 04:29:14 2001//
-/keymap.lynx/1.4/Fri Dec 13 03:02:04 2002//
-/menu.default/1.4/Fri Apr 7 15:05:49 2006//
-/menu.submenu/1.3/Fri Apr 7 15:05:49 2006//
-/keymap.default/1.8/Sat Jun 10 09:52:18 2006//
-/FAQ.html/1.9/Tue Jan 4 09:22:24 2011//
-/MANUAL.html/1.6/Tue Jan 4 09:22:24 2011//
-/README.img/1.6/Tue Jan 4 09:22:24 2011//
-/README.m17n/1.3/Tue Jan 4 09:22:24 2011//
-/README.passwd/1.1/Tue Aug 3 10:02:16 2010//
-/README.cookie/1.2/Sat Jan 15 01:57:39 2011//
-/README/1.26/Sat Jan 15 02:17:25 2011//
-/w3m.1/1.9/Sat Jan 15 06:37:24 2011//
-D
diff --git a/doc/CVS/Repository b/doc/CVS/Repository
deleted file mode 100644
index 5431c7e..0000000
--- a/doc/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/doc
diff --git a/doc/CVS/Root b/doc/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/doc/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
diff --git a/doc/MANUAL.html b/doc/MANUAL.html
index aff0189..0a00b59 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.
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.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.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/STORY.html b/doc/STORY.html
index 8e89f8c..4ac29ec 100644
--- a/doc/STORY.html
+++ b/doc/STORY.html
@@ -182,6 +182,10 @@ library. This library was written by H. Boehm and A. Demers.
I could distribute w3m without this library because one can
get the library separately, but I decided to contain it in the
w3m distribution for the convenience of an installer.
+<P>
+# Boehm GC library is no longer included into w3m packages
+# after w3m-0.4.2.
+<P>
W3m doesn't use libwww.
<P>
Boehm GC is a garbage collector for C and C++. I began to use this
diff --git a/doc/w3m.1 b/doc/w3m.1
index aeb4a60..58a8965 100644
--- a/doc/w3m.1
+++ b/doc/w3m.1
@@ -143,7 +143,7 @@ use graphic character
.B -no-graph
don't use graphic character
.TP
-.B -S
+.B -s
squeeze multiple blank lines
.TP
.B -W
@@ -245,8 +245,6 @@ or on its English version of the site at:
.I
w3m
has incorporated code from several sources.
-Hans J. Boehm, Alan J. Demers, Xerox Corp. and Silicon Graphics
-have the copyright of the GC library comes with w3m package.
Users have contributed patches and suggestions over time.
.SH AUTHOR
Akinori ITO <aito@fw.ipsj.or.jp>
diff --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/file.c b/file.c
index 9e63eb3..6f4d5b8 100644
--- a/file.c
+++ b/file.c
@@ -1,4 +1,4 @@
-/* $Id: file.c,v 1.265 2010/12/15 10:50:24 htrb Exp $ */
+/* $Id: file.c,v 1.266 2012/05/22 09:45:56 inu Exp $ */
#include "fm.h"
#include <sys/types.h>
#include "myctype.h"
@@ -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;
}
@@ -3250,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)))
@@ -3344,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);
@@ -3757,7 +3734,7 @@ Str
process_button(struct parsed_tag *tag)
{
Str tmp = NULL;
- char *p, *q, *r, *qq = NULL;
+ char *p, *q, *r, *qq = "";
int qlen, v;
if (cur_form_id < 0) {
@@ -4163,6 +4140,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))
@@ -5137,10 +5115,17 @@ HTMLtagproc1(struct parsed_tag *tag, struct html_feed_environ *h_env)
HTMLlineproc1(tmp->ptr, h_env);
return 1;
case HTML_META:
- p = q = NULL;
+ p = q = r = NULL;
parsedtag_get_value(tag, ATTR_HTTP_EQUIV, &p);
parsedtag_get_value(tag, ATTR_CONTENT, &q);
#ifdef USE_M17N
+ parsedtag_get_value(tag, ATTR_CHARSET, &r);
+ if (r) {
+ /* <meta charset=""> */
+ SKIP_BLANKS(r);
+ meta_charset = wc_guess_charset(r, 0);
+ }
+ else
if (p && q && !strcasecmp(p, "Content-Type") &&
(q = strcasestr(q, "charset")) != NULL) {
q += 7;
@@ -5177,11 +5162,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
@@ -5439,6 +5423,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;
@@ -5633,16 +5624,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);
@@ -5728,7 +5720,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))
@@ -5749,7 +5741,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) {
@@ -5886,8 +5878,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 = "";
@@ -5936,11 +5928,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 =
@@ -5955,8 +5950,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,
@@ -5969,8 +5964,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
@@ -6054,7 +6049,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 &&
@@ -6107,7 +6102,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);
@@ -7103,8 +7099,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) {
@@ -7127,6 +7121,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);
@@ -7188,7 +7185,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);
@@ -7200,6 +7197,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) {
@@ -7236,16 +7239,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
@@ -7255,6 +7259,7 @@ loadHTMLString(Str page)
#endif
TRAP_OFF;
+ UFclose(&f);
newBuf->topLine = newBuf->firstLine;
newBuf->lastLine = newBuf->currentLine;
newBuf->currentLine = newBuf->firstLine;
@@ -7347,7 +7352,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);
}
@@ -7471,6 +7476,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;
@@ -7478,20 +7484,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;
@@ -7511,6 +7515,7 @@ loadImageBuffer(URLFile *uf, Buffer *newBuf)
init_stream(&f, SCM_LOCAL, newStrStream(tmp));
loadHTMLstream(&f, newBuf, src, TRUE);
+ UFclose(&f);
if (src)
fclose(src);
@@ -7720,8 +7725,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)
@@ -7749,14 +7757,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;
@@ -7769,8 +7776,6 @@ openGeneralPagerBuffer(InputStream stream)
}
}
buf->real_type = t;
- buf->currentURL.scheme = SCM_LOCAL;
- buf->currentURL.file = "-";
return buf;
}
@@ -7906,6 +7911,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) {
@@ -7942,30 +7949,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;
@@ -7974,7 +7980,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);
@@ -8007,15 +8013,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)) {
@@ -8058,14 +8062,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
@@ -8075,7 +8078,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)
@@ -8093,12 +8097,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);
@@ -8457,21 +8462,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 633ce90..2216b06 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
@@ -883,6 +894,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;
@@ -981,6 +995,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);
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/gc/CVS/Entries b/gc/CVS/Entries
deleted file mode 100644
index 7eb3836..0000000
--- a/gc/CVS/Entries
+++ /dev/null
@@ -1,5 +0,0 @@
-D/Mac_files////
-D/cord////
-D/doc////
-D/include////
-D/tests////
diff --git a/gc/CVS/Repository b/gc/CVS/Repository
deleted file mode 100644
index e390d2f..0000000
--- a/gc/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/gc
diff --git a/gc/CVS/Root b/gc/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/gc/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
diff --git a/gc/Mac_files/CVS/Entries b/gc/Mac_files/CVS/Entries
deleted file mode 100644
index 1784810..0000000
--- a/gc/Mac_files/CVS/Entries
+++ /dev/null
@@ -1 +0,0 @@
-D
diff --git a/gc/Mac_files/CVS/Repository b/gc/Mac_files/CVS/Repository
deleted file mode 100644
index 3832d0b..0000000
--- a/gc/Mac_files/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/gc/Mac_files
diff --git a/gc/Mac_files/CVS/Root b/gc/Mac_files/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/gc/Mac_files/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
diff --git a/gc/cord/CVS/Entries b/gc/cord/CVS/Entries
deleted file mode 100644
index a7ce60a..0000000
--- a/gc/cord/CVS/Entries
+++ /dev/null
@@ -1 +0,0 @@
-D/private////
diff --git a/gc/cord/CVS/Repository b/gc/cord/CVS/Repository
deleted file mode 100644
index 656cb33..0000000
--- a/gc/cord/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/gc/cord
diff --git a/gc/cord/CVS/Root b/gc/cord/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/gc/cord/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
diff --git a/gc/cord/private/CVS/Entries b/gc/cord/private/CVS/Entries
deleted file mode 100644
index 1784810..0000000
--- a/gc/cord/private/CVS/Entries
+++ /dev/null
@@ -1 +0,0 @@
-D
diff --git a/gc/cord/private/CVS/Repository b/gc/cord/private/CVS/Repository
deleted file mode 100644
index 8bf419d..0000000
--- a/gc/cord/private/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/gc/cord/private
diff --git a/gc/cord/private/CVS/Root b/gc/cord/private/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/gc/cord/private/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
diff --git a/gc/doc/CVS/Entries b/gc/doc/CVS/Entries
deleted file mode 100644
index 1784810..0000000
--- a/gc/doc/CVS/Entries
+++ /dev/null
@@ -1 +0,0 @@
-D
diff --git a/gc/doc/CVS/Repository b/gc/doc/CVS/Repository
deleted file mode 100644
index 24977cc..0000000
--- a/gc/doc/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/gc/doc
diff --git a/gc/doc/CVS/Root b/gc/doc/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/gc/doc/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
diff --git a/gc/include/CVS/Entries b/gc/include/CVS/Entries
deleted file mode 100644
index a7ce60a..0000000
--- a/gc/include/CVS/Entries
+++ /dev/null
@@ -1 +0,0 @@
-D/private////
diff --git a/gc/include/CVS/Repository b/gc/include/CVS/Repository
deleted file mode 100644
index cbc551f..0000000
--- a/gc/include/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/gc/include
diff --git a/gc/include/CVS/Root b/gc/include/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/gc/include/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
diff --git a/gc/include/private/CVS/Entries b/gc/include/private/CVS/Entries
deleted file mode 100644
index 1784810..0000000
--- a/gc/include/private/CVS/Entries
+++ /dev/null
@@ -1 +0,0 @@
-D
diff --git a/gc/include/private/CVS/Repository b/gc/include/private/CVS/Repository
deleted file mode 100644
index 55fc1f1..0000000
--- a/gc/include/private/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/gc/include/private
diff --git a/gc/include/private/CVS/Root b/gc/include/private/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/gc/include/private/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
diff --git a/gc/tests/CVS/Entries b/gc/tests/CVS/Entries
deleted file mode 100644
index 1784810..0000000
--- a/gc/tests/CVS/Entries
+++ /dev/null
@@ -1 +0,0 @@
-D
diff --git a/gc/tests/CVS/Repository b/gc/tests/CVS/Repository
deleted file mode 100644
index aa9da7e..0000000
--- a/gc/tests/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/gc/tests
diff --git a/gc/tests/CVS/Root b/gc/tests/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/gc/tests/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
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 c86205d..d9f08e9 100644
--- a/html.c
+++ b/html.c
@@ -1,4 +1,4 @@
-/* $Id: html.c,v 1.32 2010/08/14 01:29:40 htrb Exp $ */
+/* $Id: html.c,v 1.33 2012/05/22 09:45:56 inu Exp $ */
#include "html.h"
/* Define HTML Tag Infomation Table */
@@ -37,8 +37,8 @@ unsigned char ALST_TABLE[] =
ATTR_CELLPADDING, ATTR_VSPACE, ATTR_CORE
};
#define MAXA_TABLE MAXA_CORE + 6
-unsigned char ALST_META[] = { ATTR_HTTP_EQUIV, ATTR_CONTENT, ATTR_CORE };
-#define MAXA_META MAXA_CORE + 2
+unsigned char ALST_META[] = { ATTR_HTTP_EQUIV, ATTR_CONTENT, ATTR_CHARSET, ATTR_CORE };
+#define MAXA_META MAXA_CORE + 3
unsigned char ALST_FRAME[] = { ATTR_SRC, ATTR_NAME, ATTR_CORE };
#define MAXA_FRAME MAXA_CORE + 2
unsigned char ALST_FRAMESET[] = { ATTR_COLS, ATTR_ROWS, ATTR_CORE };
diff --git a/html.h b/html.h
index 4a2827b..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;
diff --git a/image.c b/image.c
index 5f5991a..9d0e9b5 100644
--- a/image.c
+++ b/image.c
@@ -90,17 +90,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 ? */
}
@@ -333,6 +334,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;
@@ -433,6 +437,24 @@ loadImage(Buffer *buf, int flag)
image_cache[i] = cache;
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 +480,7 @@ loadImage(Buffer *buf, int flag)
cache->pid = 0;
return;
}
+#endif /* !DONT_CALL_GC_AFTER_FORK */
}
}
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..84416ed 100644
--- a/indep.h
+++ b/indep.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();
@@ -76,5 +97,8 @@ extern char *w3m_help_dir();
#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/intl/CVS/Entries b/intl/CVS/Entries
deleted file mode 100644
index 1784810..0000000
--- a/intl/CVS/Entries
+++ /dev/null
@@ -1 +0,0 @@
-D
diff --git a/intl/CVS/Repository b/intl/CVS/Repository
deleted file mode 100644
index eb89a50..0000000
--- a/intl/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/intl
diff --git a/intl/CVS/Root b/intl/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/intl/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
diff --git a/istream.c b/istream.c
index d8c8e45..3126142 100644
--- a/istream.c
+++ b/istream.c
@@ -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 io_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
@@ -661,6 +641,7 @@ static void
file_close(struct io_file_handle *handle)
{
handle->close(handle->f);
+ xfree(handle);
}
static int
@@ -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 e710e78..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>
@@ -36,7 +36,7 @@ union input_stream;
struct ens_handle {
union input_stream *is;
- Str s;
+ struct growbuf gb;
int pos;
char encoding;
};
@@ -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/CVS/Entries b/libwc/CVS/Entries
deleted file mode 100644
index bdd6455..0000000
--- a/libwc/CVS/Entries
+++ /dev/null
@@ -1,53 +0,0 @@
-/.cvsignore/1.1/Mon Sep 22 22:53:53 2003//
-/big5.c/1.1/Mon Sep 22 21:02:23 2003//
-/big5.h/1.1/Mon Sep 22 21:02:23 2003//
-/ccs.h/1.1/Mon Sep 22 21:02:23 2003//
-/ces.c/1.1/Mon Sep 22 21:02:23 2003//
-/char_conv.c/1.1/Mon Sep 22 21:02:23 2003//
-/combining.c/1.1/Mon Sep 22 21:02:23 2003//
-/conv.c/1.1/Mon Sep 22 21:02:23 2003//
-/detect.c/1.3/Wed Apr 5 14:18:54 2006//
-/gb18030.c/1.1/Mon Sep 22 21:02:23 2003//
-/gb18030.h/1.1/Mon Sep 22 21:02:23 2003//
-/gbk.c/1.1/Mon Sep 22 21:02:23 2003//
-/gbk.h/1.1/Mon Sep 22 21:02:23 2003//
-/hkscs.c/1.1/Mon Sep 22 21:02:23 2003//
-/hkscs.h/1.1/Mon Sep 22 21:02:23 2003//
-/hz.c/1.1/Mon Sep 22 21:02:23 2003//
-/hz.h/1.1/Mon Sep 22 21:02:23 2003//
-/iso2022.c/1.1/Mon Sep 22 21:02:23 2003//
-/iso2022.h/1.1/Mon Sep 22 21:02:23 2003//
-/jis.c/1.1/Mon Sep 22 21:02:23 2003//
-/jis.h/1.1/Mon Sep 22 21:02:23 2003//
-/johab.c/1.1/Mon Sep 22 21:02:23 2003//
-/johab.h/1.1/Mon Sep 22 21:02:23 2003//
-/priv.c/1.1/Mon Sep 22 21:02:23 2003//
-/priv.h/1.1/Mon Sep 22 21:02:23 2003//
-/putc.c/1.1/Mon Sep 22 21:02:23 2003//
-/search.c/1.1/Mon Sep 22 21:02:23 2003//
-/search.h/1.1/Mon Sep 22 21:02:23 2003//
-/sjis.c/1.1/Mon Sep 22 21:02:23 2003//
-/sjis.h/1.1/Mon Sep 22 21:02:23 2003//
-/test.c/1.1/Mon Sep 22 21:02:23 2003//
-/ucs.map/1.1/Mon Sep 22 21:02:23 2003//
-/uhc.c/1.1/Mon Sep 22 21:02:23 2003//
-/uhc.h/1.1/Mon Sep 22 21:02:23 2003//
-/utf7.c/1.1/Mon Sep 22 21:02:23 2003//
-/utf7.h/1.1/Mon Sep 22 21:02:23 2003//
-/utf8.c/1.1/Mon Sep 22 21:02:23 2003//
-/utf8.h/1.1/Mon Sep 22 21:02:23 2003//
-/viet.c/1.1/Mon Sep 22 21:02:23 2003//
-/viet.h/1.1/Mon Sep 22 21:02:23 2003//
-/wc.h/1.1/Mon Sep 22 21:02:23 2003//
-/wtf.c/1.1/Mon Sep 22 21:02:23 2003//
-/wtf.h/1.1/Mon Sep 22 21:02:23 2003//
-D/map////
-/EastAsianWidth.txt/1.1/Sun Jul 25 09:55:05 2010//
-/Makefile.in/1.7/Tue Jan 4 09:22:27 2011//
-/ambwidth_map.awk/1.1/Sun Jul 25 09:55:05 2010//
-/ces.h/1.2/Tue Jan 4 09:22:27 2011//
-/charset.c/1.4/Tue Jan 4 09:22:27 2011//
-/status.c/1.2/Tue Jan 4 09:22:27 2011//
-/ucs.c/1.4/Tue Jan 4 09:22:27 2011//
-/ucs.h/1.4/Tue Jan 4 09:22:27 2011//
-/wc_types.h/1.3/Tue Jan 4 09:22:27 2011//
diff --git a/libwc/CVS/Repository b/libwc/CVS/Repository
deleted file mode 100644
index 6ad67c0..0000000
--- a/libwc/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/libwc
diff --git a/libwc/CVS/Root b/libwc/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/libwc/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
diff --git a/libwc/map/CVS/Entries b/libwc/map/CVS/Entries
deleted file mode 100644
index 7e3a839..0000000
--- a/libwc/map/CVS/Entries
+++ /dev/null
@@ -1,112 +0,0 @@
-/big5_ucs.map/1.1/Mon Sep 22 21:02:24 2003//
-/cns11643_ucs.map/1.1/Mon Sep 22 21:02:24 2003//
-/cp1006_ucs.map/1.1/Mon Sep 22 21:02:24 2003//
-/cp1250_ucs.map/1.1/Mon Sep 22 21:02:24 2003//
-/cp1251_ucs.map/1.1/Mon Sep 22 21:02:24 2003//
-/cp1252_ucs.map/1.1/Mon Sep 22 21:02:24 2003//
-/cp1253_ucs.map/1.1/Mon Sep 22 21:02:24 2003//
-/cp1254_ucs.map/1.1/Mon Sep 22 21:02:24 2003//
-/cp1255_combining.map/1.1/Mon Sep 22 21:02:25 2003//
-/cp1255_ucs.map/1.1/Mon Sep 22 21:02:25 2003//
-/cp1256_combining.map/1.1/Mon Sep 22 21:02:25 2003//
-/cp1256_ucs.map/1.1/Mon Sep 22 21:02:25 2003//
-/cp1257_ucs.map/1.1/Mon Sep 22 21:02:25 2003//
-/cp1258_combining.map/1.1/Mon Sep 22 21:02:25 2003//
-/cp1258_ucs.map/1.1/Mon Sep 22 21:02:25 2003//
-/cp437_ucs.map/1.1/Mon Sep 22 21:02:25 2003//
-/cp737_ucs.map/1.1/Mon Sep 22 21:02:25 2003//
-/cp775_ucs.map/1.1/Mon Sep 22 21:02:25 2003//
-/cp850_ucs.map/1.1/Mon Sep 22 21:02:25 2003//
-/cp852_ucs.map/1.1/Mon Sep 22 21:02:25 2003//
-/cp855_ucs.map/1.1/Mon Sep 22 21:02:25 2003//
-/cp856_ucs.map/1.1/Mon Sep 22 21:02:25 2003//
-/cp857_ucs.map/1.1/Mon Sep 22 21:02:25 2003//
-/cp860_ucs.map/1.1/Mon Sep 22 21:02:25 2003//
-/cp861_ucs.map/1.1/Mon Sep 22 21:02:25 2003//
-/cp862_ucs.map/1.1/Mon Sep 22 21:02:25 2003//
-/cp863_ucs.map/1.1/Mon Sep 22 21:02:25 2003//
-/cp864_combining.map/1.1/Mon Sep 22 21:02:25 2003//
-/cp864_ucs.map/1.1/Mon Sep 22 21:02:25 2003//
-/cp865_ucs.map/1.1/Mon Sep 22 21:02:25 2003//
-/cp866_ucs.map/1.1/Mon Sep 22 21:02:25 2003//
-/cp869_ucs.map/1.1/Mon Sep 22 21:02:25 2003//
-/cp874_combining.map/1.1/Mon Sep 22 21:02:25 2003//
-/cp874_ucs.map/1.1/Mon Sep 22 21:02:25 2003//
-/gb12345_ucs.map/1.1/Mon Sep 22 21:02:25 2003//
-/gb18030_ucs.map/1.1/Mon Sep 22 21:02:25 2003//
-/gb2312_gbk.map/1.1/Mon Sep 22 21:02:25 2003//
-/gb2312_ucs.map/1.1/Mon Sep 22 21:02:25 2003//
-/gbk_ucs.map/1.1/Mon Sep 22 21:02:25 2003//
-/hkscs_ucs.map/1.1/Mon Sep 22 21:02:26 2003//
-/hkscs_ucs_p2.map/1.1/Mon Sep 22 21:02:26 2003//
-/iso885910_ucs.map/1.1/Mon Sep 22 21:02:26 2003//
-/iso885911_combining.map/1.1/Mon Sep 22 21:02:26 2003//
-/iso885911_ucs.map/1.1/Mon Sep 22 21:02:26 2003//
-/iso885913_ucs.map/1.1/Mon Sep 22 21:02:26 2003//
-/iso885914_ucs.map/1.1/Mon Sep 22 21:02:26 2003//
-/iso885915_ucs.map/1.1/Mon Sep 22 21:02:26 2003//
-/iso885916_ucs.map/1.1/Mon Sep 22 21:02:26 2003//
-/iso88591_ucs.map/1.1/Mon Sep 22 21:02:26 2003//
-/iso88592_ucs.map/1.1/Mon Sep 22 21:02:26 2003//
-/iso88593_ucs.map/1.1/Mon Sep 22 21:02:26 2003//
-/iso88594_ucs.map/1.1/Mon Sep 22 21:02:26 2003//
-/iso88595_ucs.map/1.1/Mon Sep 22 21:02:26 2003//
-/iso88596_combining.map/1.1/Mon Sep 22 21:02:26 2003//
-/iso88596_ucs.map/1.1/Mon Sep 22 21:02:26 2003//
-/iso88597_ucs.map/1.1/Mon Sep 22 21:02:26 2003//
-/iso88598_ucs.map/1.1/Mon Sep 22 21:02:26 2003//
-/iso88599_ucs.map/1.1/Mon Sep 22 21:02:26 2003//
-/jisx0201k_jisx0208.map/1.1/Mon Sep 22 21:02:26 2003//
-/jisx0201k_ucs.map/1.1/Mon Sep 22 21:02:26 2003//
-/jisx0208_jisx02131.map/1.1/Mon Sep 22 21:02:26 2003//
-/jisx0208x0212x0213_ucs.map/1.1/Mon Sep 22 21:02:26 2003//
-/jisx02132_sjis.map/1.1/Mon Sep 22 21:02:28 2003//
-/jisx0213_ucs_p2.map/1.1/Mon Sep 22 21:02:28 2003//
-/johab_ucs.map/1.1/Mon Sep 22 21:02:28 2003//
-/koi8r_ucs.map/1.1/Mon Sep 22 21:02:28 2003//
-/koi8u_ucs.map/1.1/Mon Sep 22 21:02:28 2003//
-/ksx1001_ucs.map/1.1/Mon Sep 22 21:02:28 2003//
-/mk_big5_txt.pl/1.1/Mon Sep 22 21:02:28 2003//
-/mk_big5_ucs_map.pl/1.1/Mon Sep 22 21:02:28 2003//
-/mk_cns_ucs_map.pl/1.1/Mon Sep 22 21:02:28 2003//
-/mk_combining_map.pl/1.1/Mon Sep 22 21:02:28 2003//
-/mk_cp1258_ucs_map.pl/1.1/Mon Sep 22 21:02:28 2003//
-/mk_cp950_txt.pl/1.1/Mon Sep 22 21:02:28 2003//
-/mk_gb18030_ucs_map.pl/1.1/Mon Sep 22 21:02:28 2003//
-/mk_gb_ucs_map.pl/1.1/Mon Sep 22 21:02:28 2003//
-/mk_gbk_ucs_map.pl/1.1/Mon Sep 22 21:02:28 2003//
-/mk_hkscs_p2_txt.pl/1.1/Mon Sep 22 21:02:28 2003//
-/mk_hkscs_txt.pl/1.1/Mon Sep 22 21:02:28 2003//
-/mk_hkscs_ucs_map.pl/1.1/Mon Sep 22 21:02:28 2003//
-/mk_hkscs_ucs_p2_map.pl/1.1/Mon Sep 22 21:02:28 2003//
-/mk_jis_ucs_map.pl/1.1/Mon Sep 22 21:02:28 2003//
-/mk_jisx0213_ucs_map.pl/1.1/Mon Sep 22 21:02:28 2003//
-/mk_johab_ucs_map.pl/1.1/Mon Sep 22 21:02:28 2003//
-/mk_ks_ucs_map.pl/1.1/Mon Sep 22 21:02:28 2003//
-/mk_sjis_ucs_map.pl/1.1/Mon Sep 22 21:02:28 2003//
-/mk_tis_ucs_map.pl/1.1/Mon Sep 22 21:02:28 2003//
-/mk_ucs_map.pl/1.1/Mon Sep 22 21:02:28 2003//
-/mk_uhc_ucs_map.pl/1.1/Mon Sep 22 21:02:28 2003//
-/mk_viet_ucs_map.pl/1.1/Mon Sep 22 21:02:28 2003//
-/nextstep_ucs.map/1.1/Mon Sep 22 21:02:28 2003//
-/sjis_ext_ucs.map/1.1/Mon Sep 22 21:02:28 2003//
-/tcvn57123_tcvn5712.map/1.1/Mon Sep 22 21:02:28 2003//
-/tcvn5712_combining.map/1.1/Mon Sep 22 21:02:28 2003//
-/tcvn5712_ucs.map/1.1/Mon Sep 22 21:02:28 2003//
-/ucs_combining.map/1.1/Mon Sep 22 21:02:28 2003//
-/ucs_fullwidth.map/1.1/Mon Sep 22 21:02:28 2003//
-/ucs_hangul.map/1.1/Mon Sep 22 21:02:28 2003//
-/ucs_precompose.map/1.1/Mon Sep 22 21:02:28 2003//
-/uhc_ucs.map/1.1/Mon Sep 22 21:02:28 2003//
-/viscii11_ucs.map/1.1/Mon Sep 22 21:02:29 2003//
-/vps_ucs.map/1.1/Mon Sep 22 21:02:29 2003//
-/mk_ucs_case_map.pl/1.1/Tue Aug 24 10:11:51 2010//
-/mk_ucs_isdigit_map.pl/1.1/Tue Aug 24 10:11:51 2010//
-/ucs_ambwidth.map/1.1/Sun Jul 25 09:55:05 2010//
-/ucs_case.map/1.1/Tue Aug 24 10:11:51 2010//
-/ucs_isalpha.map/1.1/Tue Aug 24 10:11:51 2010//
-/ucs_isdigit.map/1.1/Tue Aug 24 10:11:51 2010//
-/ucs_islower.map/1.1/Tue Aug 24 10:11:51 2010//
-/ucs_isupper.map/1.1/Tue Aug 24 10:11:51 2010//
-/ucs_wide.map/1.2/Tue Jan 4 09:22:28 2011//
-D
diff --git a/libwc/map/CVS/Repository b/libwc/map/CVS/Repository
deleted file mode 100644
index 487f8e5..0000000
--- a/libwc/map/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/libwc/map
diff --git a/libwc/map/CVS/Root b/libwc/map/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/libwc/map/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
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..959bd66 100644
--- a/local.c
+++ b/local.c
@@ -359,6 +359,10 @@ localcgi_post(char *uri, char *qstr, FormList *request, char *referer)
int status;
pid_t pid;
char *file = uri, *name = uri, *path_info = NULL, *tmpf = NULL;
+#ifdef HAVE_CHDIR
+ char *cgi_dir;
+#endif
+ char *cgi_basename;
#ifdef __MINGW32_VERSION
return NULL;
@@ -373,7 +377,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 +394,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 +424,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 7dcfd74..ec77085 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"
@@ -407,6 +410,10 @@ main(int argc, char **argv, char **envp)
wc_ces CodePage;
#endif
#endif
+#if defined(DONT_CALL_GC_AFTER_FORK) && defined(USE_IMAGE)
+ char **getimage_args = NULL;
+#endif /* defined(DONT_CALL_GC_AFTER_FORK) && defined(USE_IMAGE) */
+
GC_INIT();
#if defined(ENABLE_NLS) || (defined(USE_M17N) && defined(HAVE_LANGINFO_CODESET))
setlocale(LC_ALL, "");
@@ -428,6 +435,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;
@@ -751,6 +762,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();
}
@@ -839,6 +859,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);
@@ -914,12 +958,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) {
@@ -948,9 +997,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? */
@@ -965,7 +1012,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;
@@ -1266,6 +1313,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)
{
@@ -1286,18 +1339,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);
}
}
}
@@ -1586,6 +1641,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")
{
@@ -2281,7 +2348,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
@@ -2824,12 +2891,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)
@@ -3588,6 +3658,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")
{
@@ -4075,6 +4172,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) {
@@ -4084,11 +4182,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);
}
@@ -4097,11 +4192,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);
}
@@ -4109,15 +4201,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;
@@ -4126,14 +4225,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);
@@ -4530,8 +4621,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);
@@ -4590,7 +4680,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);
@@ -5418,6 +5508,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)
@@ -5624,7 +5766,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)
diff --git a/map.c b/map.c
index 90aa35a..12701e7 100644
--- a/map.c
+++ b/map.c
@@ -279,7 +279,7 @@ follow_map_panel(Buffer *buf, char *name)
p = parsedURL2Str(&pu)->ptr;
q = html_quote(p);
if (DecodeURL)
- p = html_quote(url_unquote_conv(p, buf->document_charset));
+ p = html_quote(url_decode2(p, buf));
else
p = q;
Strcat_m_charp(mappage, "<tr valign=top><td><a href=\"", q, "\">",
@@ -417,10 +417,7 @@ append_map_info(Buffer *buf, Str tmp, FormItemList *fi)
continue;
parseURL2(a->url, &pu, baseURL(buf));
q = html_quote(parsedURL2Str(&pu)->ptr);
- if (DecodeURL)
- p = html_quote(url_unquote_conv(a->url, buf->document_charset));
- else
- p = html_quote(a->url);
+ p = html_quote(url_decode2(a->url, buf));
Strcat_m_charp(tmp, "<tr valign=top><td>&nbsp;&nbsp;<td><a href=\"",
q, "\">",
html_quote(*a->alt ? a->alt : mybasename(a->url)),
@@ -457,10 +454,8 @@ append_link_info(Buffer *buf, Str html, LinkList * link)
Strcat_charp(html, "[Rev]");
if (!l->url)
url = "(empty)";
- else if (DecodeURL)
- url = html_quote(url_unquote_conv(l->url, buf->document_charset));
else
- url = html_quote(l->url);
+ url = html_quote(url_decode2(l->url, buf));
Strcat_m_charp(html, "<td>", url, NULL);
if (l->ctype)
Strcat_m_charp(html, " (", html_quote(l->ctype), ")", NULL);
@@ -498,8 +493,7 @@ append_frame_info(Buffer *buf, Str html, struct frameset *set, int level)
Strcat_charp(html, p);
}
if (DecodeURL)
- p = html_quote(url_unquote_conv(frame.body->url,
- buf->document_charset));
+ p = html_quote(url_decode2(frame.body->url, buf));
else
p = q;
Strcat_m_charp(html, " ", p, "</a></pre_int><br>\n", NULL);
@@ -550,9 +544,7 @@ page_info_panel(Buffer *buf)
#ifdef USE_M17N
Strcat_charp(tmp, "<form method=internal action=charset>");
#endif
- p = parsedURL2Str(&buf->currentURL)->ptr;
- if (DecodeURL)
- p = url_unquote_conv(p, 0);
+ p = url_decode2(parsedURL2Str(&buf->currentURL)->ptr, NULL);
Strcat_m_charp(tmp, "<table cellpadding=0>",
"<tr valign=top><td nowrap>Title<td>",
html_quote(buf->buffername),
@@ -589,7 +581,7 @@ page_info_panel(Buffer *buf)
p = parsedURL2Str(&pu)->ptr;
q = html_quote(p);
if (DecodeURL)
- p = html_quote(url_unquote_conv(p, buf->document_charset));
+ p = html_quote(url_decode2(p, buf));
else
p = q;
Strcat_m_charp(tmp,
@@ -602,7 +594,7 @@ page_info_panel(Buffer *buf)
p = parsedURL2Str(&pu)->ptr;
q = html_quote(p);
if (DecodeURL)
- p = html_quote(url_unquote_conv(p, buf->document_charset));
+ p = html_quote(url_decode2(p, buf));
else
p = q;
Strcat_m_charp(tmp,
@@ -613,10 +605,7 @@ page_info_panel(Buffer *buf)
if (a != NULL) {
FormItemList *fi = (FormItemList *)a->url;
p = form2str(fi);
- if (DecodeURL)
- p = html_quote(url_unquote_conv(p, buf->document_charset));
- else
- p = html_quote(p);
+ p = html_quote(url_decode2(p, buf));
Strcat_m_charp(tmp,
"<tr valign=top><td nowrap>Method/type of current form&nbsp;<td>",
p, NULL);
diff --git a/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/po/CVS/Entries b/po/CVS/Entries
deleted file mode 100644
index 1e7831b..0000000
--- a/po/CVS/Entries
+++ /dev/null
@@ -1,16 +0,0 @@
-/.cvsignore/1.2/Thu Sep 25 18:35:43 2003//
-/LINGUAS/1.1/Wed Sep 24 18:35:06 2003//
-/POTFILES.in/1.2/Wed Sep 24 18:35:06 2003//
-/boldquot.sed/1.1/Tue Sep 23 18:42:25 2003//
-/en@boldquot.header/1.1/Tue Sep 23 18:42:25 2003//
-/en@quot.header/1.1/Tue Sep 23 18:42:25 2003//
-/insert-header.sin/1.1/Tue Sep 23 18:42:25 2003//
-/quot.sed/1.1/Tue Sep 23 18:42:25 2003//
-/remove-potcdate.sin/1.1/Tue Sep 23 18:42:25 2003//
-/Makevars/1.2/Tue Jan 4 09:22:28 2011//
-/ChangeLog/1.2/Tue Jan 4 12:39:29 2011//
-/Makefile.in.in/1.3/Tue Jan 4 12:39:29 2011//
-/Rules-quot/1.2/Tue Jan 4 12:39:29 2011//
-/ja.po/1.14/Sat Jan 15 04:29:58 2011//
-/w3m.pot/1.14/Sat Jan 15 02:20:26 2011//
-D
diff --git a/po/CVS/Repository b/po/CVS/Repository
deleted file mode 100644
index 139f7dd..0000000
--- a/po/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/po
diff --git a/po/CVS/Root b/po/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/po/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
diff --git a/po/ja.po b/po/ja.po
index d67c695..947191c 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -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 c7992ca..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 *);
@@ -251,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);
@@ -509,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);
@@ -588,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);
@@ -613,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);
@@ -685,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);
@@ -725,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
@@ -788,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/scripts/CVS/Entries b/scripts/CVS/Entries
deleted file mode 100644
index 2d1a4e5..0000000
--- a/scripts/CVS/Entries
+++ /dev/null
@@ -1,13 +0,0 @@
-/.cvsignore/1.10/Mon Sep 22 22:53:53 2003//
-/dirlist.cgi.in/1.7/Fri Feb 7 15:06:17 2003//
-/w3mhelp-funcdesc.en.pl.in/1.4/Mon Mar 22 17:03:13 2004//
-/w3mhelp-funcdesc.ja.pl.in/1.4/Mon Mar 22 17:03:13 2004//
-/w3mhelp-funcname.pl.in/1.3/Mon Apr 7 15:19:43 2003//
-/w3mmail.cgi.in/1.14/Mon Aug 30 16:32:24 2004//
-/xface2xbm.in/1.3/Mon Nov 18 17:33:01 2002//
-/xface2xpm.in/1.1/Tue Apr 9 14:45:58 2002//
-D/bm2menu////
-D/multipart////
-D/w3mman////
-/Makefile.in/1.11/Tue Jan 4 09:22:28 2011//
-/w3mhelp.cgi.in/1.29/Tue Jan 4 09:22:28 2011//
diff --git a/scripts/CVS/Repository b/scripts/CVS/Repository
deleted file mode 100644
index 578c817..0000000
--- a/scripts/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/scripts
diff --git a/scripts/CVS/Root b/scripts/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/scripts/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
diff --git a/scripts/bm2menu/CVS/Entries b/scripts/bm2menu/CVS/Entries
deleted file mode 100644
index 448ac0a..0000000
--- a/scripts/bm2menu/CVS/Entries
+++ /dev/null
@@ -1,3 +0,0 @@
-/README/1.1/Thu Nov 15 00:32:14 2001//
-/bm2menu.pl/1.1/Thu Nov 15 00:32:14 2001//
-D
diff --git a/scripts/bm2menu/CVS/Repository b/scripts/bm2menu/CVS/Repository
deleted file mode 100644
index c3eaf83..0000000
--- a/scripts/bm2menu/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/scripts/bm2menu
diff --git a/scripts/bm2menu/CVS/Root b/scripts/bm2menu/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/scripts/bm2menu/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
diff --git a/scripts/multipart/CVS/Entries b/scripts/multipart/CVS/Entries
deleted file mode 100644
index b503f2a..0000000
--- a/scripts/multipart/CVS/Entries
+++ /dev/null
@@ -1,6 +0,0 @@
-/.cvsignore/1.2/Mon Sep 22 22:53:53 2003//
-/README/1.2/Wed Nov 21 09:21:59 2001//
-/mailcap/1.1/Thu Nov 15 00:32:14 2001//
-/multipart.cgi.in/1.11/Tue Feb 18 15:26:39 2003//
-/Makefile.in/1.6/Tue Jan 4 09:22:28 2011//
-D
diff --git a/scripts/multipart/CVS/Repository b/scripts/multipart/CVS/Repository
deleted file mode 100644
index cb383c6..0000000
--- a/scripts/multipart/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/scripts/multipart
diff --git a/scripts/multipart/CVS/Root b/scripts/multipart/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/scripts/multipart/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
diff --git a/scripts/w3mman/CVS/Entries b/scripts/w3mman/CVS/Entries
deleted file mode 100644
index 2cc31ff..0000000
--- a/scripts/w3mman/CVS/Entries
+++ /dev/null
@@ -1,8 +0,0 @@
-/.cvsignore/1.3/Mon Sep 22 22:53:53 2003//
-/README/1.3/Wed Dec 18 16:48:02 2002//
-/hlink.cgi/1.1/Thu Nov 15 00:32:14 2001//
-/w3mman.1.in/1.6/Fri Apr 7 15:33:56 2006//
-/w3mman.in/1.5/Fri Apr 7 15:33:56 2006//
-/Makefile.in/1.5/Tue Jan 4 09:22:28 2011//
-/w3mman2html.cgi.in/1.9/Tue Jan 4 09:22:28 2011//
-D
diff --git a/scripts/w3mman/CVS/Repository b/scripts/w3mman/CVS/Repository
deleted file mode 100644
index 430e75e..0000000
--- a/scripts/w3mman/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/scripts/w3mman
diff --git a/scripts/w3mman/CVS/Root b/scripts/w3mman/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/scripts/w3mman/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
diff --git a/scripts/w3mman/w3mman2html.cgi.in b/scripts/w3mman/w3mman2html.cgi.in
index f430307..2e3576c 100644
--- a/scripts/w3mman/w3mman2html.cgi.in
+++ b/scripts/w3mman/w3mman2html.cgi.in
@@ -126,12 +126,14 @@ while(<F>) {
s/\&/\&amp;/g;
s/\</\&lt;/g;
s/\>/\&gt;/g;
+ # non ASCII UTF-8 codepoint
+ my $utf8="[\300-\337][\200-\277]|[\340-\357][\200-\277]{2}|[\360-\367][\200-\277]{3}|[\370-\373][\200-\277]{4}|[\374\375][\200-\277]{5}";
- s@([\200-\377].)(\010{1,2}\1)+@<b>$1</b>@g;
+ s@($utf8)(\010\1)+@<b>$1</b>@g;
s@(\&\w+;|.)(\010\1)+@<b>$1</b>@g;
- s@__\010{1,2}((\<b\>)?[\200-\377].(\</b\>)?)@<u>$1</u>@g;
+ s@_\010((\<b\>)?($utf8)(\</b\>)?)@<u>$1</u>@g;
s@_\010((\<b\>)?(\&\w+\;|.)(\</b\>)?)@<u>$1</u>@g;
- s@((\<b\>)?[\200-\377].(\</b\>)?)\010{1,2}__@<u>$1</u>@g;
+ s@((\<b\>)?($utf8)(\</b\>)?)\010_@<u>$1</u>@g;
s@((\<b\>)?(\&\w+\;|.)(\</b\>)?)\010_@<u>$1</u>@g;
s@.\010(.)@$1@g;
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/terms.c b/terms.c
index 7a3c987..ca81d28 100644
--- a/terms.c
+++ b/terms.c
@@ -222,6 +222,7 @@ static void
check_cygwin_console(void)
{
char *term = getenv("TERM");
+ char *ctype;
HANDLE hWnd;
if (term == NULL)
@@ -236,7 +237,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
@@ -2027,8 +2030,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..d7b1d6e 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" */
@@ -444,6 +445,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 +641,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 +666,7 @@ copyPath(char *orgpath, int length, int option)
}
}
else
- Strcat_char(tmp, *orgpath);
+ Strcat_char(tmp, ch);
orgpath++;
length--;
}
@@ -668,22 +676,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 +694,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 +802,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 +830,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 +958,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 +1286,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 +1326,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 +1339,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 +1629,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 +1671,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 +1711,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 +1775,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 +1783,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 +2258,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 27dab36..b9245a0 100644
--- a/version.c.in
+++ b/version.c.in
@@ -1,5 +1,5 @@
-/* $Id: version.c.in,v 1.48 2011/01/15 07:52:48 inu Exp $ */
-#define CURRENT_VERSION "w3m/0.5.3"
+/* $Id: version.c.in,v 1.49 2012/05/22 09:45:56 inu Exp $ */
+#define CURRENT_VERSION "w3m/0.5.3+debian-12+"
#ifndef FM_H
char *w3m_version = CURRENT_VERSION;
diff --git a/w3m-doc/CVS/Entries b/w3m-doc/CVS/Entries
deleted file mode 100644
index f0a18f0..0000000
--- a/w3m-doc/CVS/Entries
+++ /dev/null
@@ -1,18 +0,0 @@
-/README.html/1.1.1.1/Thu Nov 8 05:18:53 2001//
-/community.html.in/1.2/Tue Nov 27 03:54:49 2001//
-/configuration.html.in/1.2/Tue Nov 27 03:54:49 2001//
-/contain.wd/1.3/Tue Nov 27 03:54:49 2001//
-/copyright.html.in/1.2/Tue Nov 27 03:54:49 2001//
-/define.wd/1.2/Tue Nov 27 03:54:49 2001//
-/detail.html.in/1.3/Tue Nov 27 03:54:49 2001//
-/development.html.in/1.1/Fri Nov 9 04:59:18 2001//
-/faq.html.in/1.2/Tue Nov 27 03:54:49 2001//
-/function.html.in/1.2/Tue Nov 27 03:54:49 2001//
-/index.html.in/1.3/Tue Nov 27 03:54:49 2001//
-/install.html.in/1.3/Tue Jul 9 06:14:14 2002//
-/mkdocs/1.2/Tue Nov 27 03:54:49 2001//
-/operation.html.in/1.2/Tue Nov 27 03:54:49 2001//
-/outline.html.in/1.2/Tue Nov 27 03:54:49 2001//
-/prologue.html.in/1.3/Tue Oct 29 14:28:30 2002//
-/w3mdoc.pl/1.1.1.1/Thu Nov 8 05:18:52 2001//
-D/sample////
diff --git a/w3m-doc/CVS/Repository b/w3m-doc/CVS/Repository
deleted file mode 100644
index 2dd7815..0000000
--- a/w3m-doc/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/w3m-doc
diff --git a/w3m-doc/CVS/Root b/w3m-doc/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/w3m-doc/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
diff --git a/w3m-doc/sample/CVS/Entries b/w3m-doc/sample/CVS/Entries
deleted file mode 100644
index 1207c1a..0000000
--- a/w3m-doc/sample/CVS/Entries
+++ /dev/null
@@ -1,9 +0,0 @@
-/README/1.1.1.1/Thu Nov 8 05:18:53 2001//
-/define.wd/1.1.1.1/Thu Nov 8 05:18:53 2001//
-/html.wd/1.1.1.1/Thu Nov 8 05:18:53 2001//
-/keymap.cgi/1.1.1.1/Thu Nov 8 05:18:54 2001//
-/s.wd/1.1.1.1/Thu Nov 8 05:18:54 2001//
-/sample.html/1.1.1.1/Thu Nov 8 05:18:54 2001//
-/sample.wd/1.1.1.1/Thu Nov 8 05:18:53 2001//
-/w3mdoc.pl/1.1.1.1/Thu Nov 8 05:18:53 2001//
-D
diff --git a/w3m-doc/sample/CVS/Repository b/w3m-doc/sample/CVS/Repository
deleted file mode 100644
index d328633..0000000
--- a/w3m-doc/sample/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/w3m-doc/sample
diff --git a/w3m-doc/sample/CVS/Root b/w3m-doc/sample/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/w3m-doc/sample/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
diff --git a/w3mimg/CVS/Entries b/w3mimg/CVS/Entries
deleted file mode 100644
index ad83b16..0000000
--- a/w3mimg/CVS/Entries
+++ /dev/null
@@ -1,7 +0,0 @@
-/.cvsignore/1.1/Mon Sep 22 22:53:53 2003//
-D/fb////
-D/x11////
-/Makefile.in/1.11/Tue Jan 4 09:22:28 2011//
-/w3mimg.c/1.6/Tue Jan 4 09:22:28 2011//
-/w3mimg.h/1.9/Tue Jan 4 09:22:28 2011//
-D/win////
diff --git a/w3mimg/CVS/Repository b/w3mimg/CVS/Repository
deleted file mode 100644
index d59666d..0000000
--- a/w3mimg/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/w3mimg
diff --git a/w3mimg/CVS/Root b/w3mimg/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/w3mimg/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
diff --git a/w3mimg/fb/CVS/Entries b/w3mimg/fb/CVS/Entries
deleted file mode 100644
index 549e962..0000000
--- a/w3mimg/fb/CVS/Entries
+++ /dev/null
@@ -1,11 +0,0 @@
-/.cvsignore/1.1/Mon Sep 22 22:53:53 2003//
-/Makefile.in/1.4/Mon Apr 26 17:00:38 2004//
-/fb.c/1.16/Sun Jul 13 16:19:10 2003//
-/fb.h/1.7/Mon Jul 7 15:48:17 2003//
-/fb_gdkpixbuf.c/1.21/Mon Nov 8 17:14:06 2004//
-/fb_img.c/1.6/Mon Jul 7 15:48:17 2003//
-/fb_img.h/1.9/Wed Aug 4 17:32:28 2004//
-/fb_imlib2.c/1.10/Wed Aug 4 17:32:28 2004//
-/fb_w3mimg.c/1.14/Wed Aug 4 17:32:28 2004//
-/readme.txt/1.2/Mon Jul 22 16:17:32 2002//
-D
diff --git a/w3mimg/fb/CVS/Repository b/w3mimg/fb/CVS/Repository
deleted file mode 100644
index 336666e..0000000
--- a/w3mimg/fb/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/w3mimg/fb
diff --git a/w3mimg/fb/CVS/Root b/w3mimg/fb/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/w3mimg/fb/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
diff --git a/w3mimg/win/CVS/Entries b/w3mimg/win/CVS/Entries
deleted file mode 100644
index 5025b4b..0000000
--- a/w3mimg/win/CVS/Entries
+++ /dev/null
@@ -1,4 +0,0 @@
-/Makefile.in/1.1/Tue Dec 21 10:13:55 2010//
-/win_w3mimg.cpp/1.2/Fri Dec 24 09:52:06 2010//
-/.cvsignore/1.1/Wed Jan 5 09:52:10 2011//
-D
diff --git a/w3mimg/win/CVS/Repository b/w3mimg/win/CVS/Repository
deleted file mode 100644
index 06901a3..0000000
--- a/w3mimg/win/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/w3mimg/win
diff --git a/w3mimg/win/CVS/Root b/w3mimg/win/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/w3mimg/win/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m
diff --git a/w3mimg/x11/CVS/Entries b/w3mimg/x11/CVS/Entries
deleted file mode 100644
index a3cf134..0000000
--- a/w3mimg/x11/CVS/Entries
+++ /dev/null
@@ -1,4 +0,0 @@
-/.cvsignore/1.1/Mon Sep 22 22:53:53 2003//
-/Makefile.in/1.4/Mon Apr 26 17:00:38 2004//
-/x11_w3mimg.c/1.29/Mon Nov 8 17:14:06 2004//
-D
diff --git a/w3mimg/x11/CVS/Repository b/w3mimg/x11/CVS/Repository
deleted file mode 100644
index 1268050..0000000
--- a/w3mimg/x11/CVS/Repository
+++ /dev/null
@@ -1 +0,0 @@
-w3m/w3mimg/x11
diff --git a/w3mimg/x11/CVS/Root b/w3mimg/x11/CVS/Root
deleted file mode 100644
index 121fa06..0000000
--- a/w3mimg/x11/CVS/Root
+++ /dev/null
@@ -1 +0,0 @@
-:ext:inu@w3m.cvs.sourceforge.net:/cvsroot/w3m