diff options
140 files changed, 2735 insertions, 16476 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 = "<"; - } - } - } - 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 --> %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 = ⊤ - 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 @@ -1,3 +1,318 @@ +2014-06-23 Tatsuya Kinoshita <tats@debian.org> + + * version.c.in: Update to 0.5.3+debian-16 + + * url.c: Disable ciphers that use keys smaller than 128 bits + Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/w3m/+bug/1325674 + +2014-01-04 Tatsuya Kinoshita <tats@debian.org> + + * version.c.in: Update to 0.5.3+debian-15 + +2014-01-03 Tatsuya Kinoshita <tats@debian.org> + + * version.c.in: Update to 0.5.3+debian-14 + + * acinclude.m4, configure: Use pkg-config to build with imlib2 1.4.6 + + * doc/HISTORY, doc/README.cookie, doc/README.m17n: + Prefer US-ASCII rathar than Japanese encodings in English documents + +2013-12-27 Tatsuya Kinoshita <tats@debian.org> + + * doc-jp/MANUAL.html, doc/MANUAL.html: + Cleanup unusable links in MANUAL.html + Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=517315 + + * version.c.in: Update to 0.5.3+debian-13+ + +2013-12-17 Tatsuya Kinoshita <tats@debian.org> + + * version.c.in: Update to 0.5.3+debian-13 + +2013-12-14 Tatsuya Kinoshita <tats@debian.org> + + * config.guess: + Update config.guess to 2013-06-10 with autotools-dev 20130810.1 + + * config.sub: + Update config.sub to 2013-08-10 with autotools-dev 20130810.1 + +2013-12-07 Reinhard Max <max@suse.de> + + * local.c: Fix a directory descriptor leak in loadLocalDir + Patch from openSUSE on 2009-09-07. + Origin: https://build.opensuse.org/package/view_file/openSUSE:Factory/w3m/w3m-closedir.patch + Bug-Novell: https://bugzilla.novell.com/show_bug.cgi?id=531675 + +2013-12-07 AIDA Shinra <shinra@j10n.org> + + * main.c: Fix crash after SEARCH_NEXT + Patch from <http://www.j10n.org/files/w3m-cvs-1.1055-search-next.patch>, + [w3m-dev:04473] on 2013-12-07. + +2013-11-11 Paul Boekholt <p.boekholt@gmail.com> + + * file.c: Add support for single quoted meta refresh URL + Bug: https://sourceforge.net/p/w3m/patches/53/ + +2013-11-07 Cristian Rodriguez <crrodriguez@opensuse.org> + + * url.c: Use SSL_OP_NO_COMPRESSION if available + Due to the "CRIME attack" (CVE-2012-4929) HTTPS clients that + negotiate TLS-level compression can be abused for MITM attacks. + * url.c: Use SSL_MODE_RELEASE_BUFFERS if available + Patch from openSUSE on 2012-11-12: + https://build.opensuse.org/request/show/141054 + +2013-10-15 Tatsuya Kinoshita <tats@debian.org> + + * Makefile.in: + Depend on funcname.tab to fix parallel make issue of scripts + Bug: https://sourceforge.net/p/w3m/patches/64/ + Bug-Gentoo: https://bugs.gentoo.org/show_bug.cgi?id=362249 + + * w3mimg/Makefile.in: + Avoid prerequisite $(IMGOBJS) to fix parallel make issue of w3mimg + Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=726188 + + * acinclude.m4, configure: + Explicitly add -lX11 to IMGX11LDFLAGS only when gtk2 + Bug: https://sourceforge.net/p/w3m/patches/57/ + + * w3mimg/Makefile.in: Revert "Fix parallel make issue" + This reverts commit aa6f871c6dcc108118142bcc786e4a6ac3d46867. + + * Makefile.in: + Revert "Explicitly link w3mimgdisplay with -lX11 to build with gcc 4.5" + This reverts commit 7410954066d68ac2ad6aea638801714447321fec. + +2013-10-14 AIDA Shinra <shinra@j10n.org> + + * url.c: Define schemeNumToName() to fix scheme bug + Patch from <http://www.j10n.org/files/w3m-cvs-1.1055-schemebug.patch>, + [w3m-dev:04470] on 2013-10-14. + Bug: https://sourceforge.net/p/w3m/patches/60/ + + * config.h.in, file.c, fm.h, html.h, image.c, indep.c, indep.h: + * istream.c, istream.h, local.c, main.c, mimehead.c, proto.h: + Workaround of GC crash on Cygwin64 + Patch from <http://www.j10n.org/files/w3m-cvs-1.1055-win64gc.patch>, + [w3m-dev:04469] on 2013-10-14. + +2013-10-14 Tatsuya Kinoshita <tats@debian.org> + + * version.c.in: Update to 0.5.3+debian-12+ + +2013-10-14 Jarek Czekalski <jarekczek@poczta.onet.pl> + + * terms.c: Fix paren in check_cygwin_console() + Bug: https://sourceforge.net/p/w3m/patches/66/ + +2013-10-13 Tatsuya Kinoshita <tats@debian.org> + + * version.c.in: Update to 0.5.3+debian-12 + + * doc-jp/MANUAL.html, doc-jp/w3m.1, doc/MANUAL.html, doc/w3m.1: + Update document for the -s option change + Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=75527 + + * terms.c: Do not fail when LANG is not set + Check whether the value of LC_ALL, LC_CTYPE or LANG is not NULL in + check_cygwin_console(). + Bug: https://sourceforge.net/p/w3m/patches/66/ + +2013-10-12 Tatsuya Kinoshita <tats@debian.org> + + * table.h: Bump MAXCOL to 256 + Bug: https://sourceforge.net/p/w3m/feature-requests/24/ + +2013-10-12 Laurence Richert <laurencerichert@yahoo.de> + + * main.c, proto.h: vim/-perator like handling + - half page scrolling + - jumping to elements numbered by getLinkNumberStr() from Karsten + Schoelzel + Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=724028 + +2013-10-12 Tatsuya Kinoshita <tats@debian.org> + + * doc-jp/README, doc/README: + Mention project page rather than unavailable mailing lists + +2013-10-09 Rafael Laboissiere <rafael@laboissiere.net> + + * doc/README.img: Fix typo + Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=725892 + +2013-08-12 Tatsuya Kinoshita <tats@debian.org> + + * version.c.in: Update to 0.5.3+debian-11+ + + * ChangeLog: Update ChangeLog to use contributor's name + +2013-08-08 Tatsuya Kinoshita <tats@debian.org> + + * version.c.in: Update to 0.5.3+debian-11 + +2013-08-04 Tatsuya Kinoshita <tats@debian.org> + + * Str.c: Check length for Strchop() + + * main.c: Fix potentially segfault of execdict() + + * version.c.in: Update to 0.5.3+debian-10+ + + * file.c: Fix segfault of loadGeneralFile() + Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=718612 + +2013-08-02 Tatsuya Kinoshita <tats@debian.org> + + * version.c.in: Update to 0.5.3+debian-10 + +2013-08-02 Piotr P. Karwasz <piotr.p@karwasz.org> + + * scripts/w3mman/w3mman2html.cgi.in: + Correct underline processing and more UTF-8 support for w3mman2html.cgi + Patch from <https://bugs.launchpad.net/ubuntu/+source/w3m/+bug/680202> + on 2010-11-23. + +2013-08-01 Hilko Bengen <bengen@debian.org> + + * entity.c: Ignore SOFT HYPHEN to prevent drawing hyphens everywhere + Patch from <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=441934> + on 2011-03-01. + +2013-08-01 Tatsuya Kinoshita <tats@debian.org> + + * doc-jp/README, doc/README: Update contact list in README + Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=696209 + +2013-07-30 Tatsuya Kinoshita <tats@debian.org> + + * config.guess, config.sub: + Update config.guess and config.sub to supprot aarch64 + Updated with Debian autotools-dev version 20130515.1. + +2013-07-30 Conrad J.C. Hughes <debbugs@xrad.org> + + * main.c: Sort anchors by sequence number in -dump + Patch from <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=657666> + on 2012-01-27. + +2013-07-30 Tatsuya Kinoshita <tats@debian.org> + + * version.c.in: Update to 0.5.3+debian-9+ + +2013-07-29 Tatsuya Kinoshita <tats@debian.org> + + * version.c.in: Update version to w3m/0.5.3+debian-9 + + * version.c.in: Set CURRENT_VERSION to debian version + +2013-07-28 Tatsuya Kinoshita <tats@debian.org> + + * file.c: Fix segfault of process_button() + +2013-04-08 AIDA Shinra <shinra@j10n.org> + + * file.c: One more patch for siteconf from [w3m-dev 04464] + + * anchor.c, config.h.in, display.c, doc-jp/README.siteconf: + * doc/README.siteconf, file.c, fm.h, form.c, frame.c, func.c: + * history.c, indep.c, indep.h, linein.c, main.c, map.c, menu.c: + * po/ja.po, proto.h, rc.c, url.c: Support the siteconf feature + Patch to support the siteconf feature, from [w3m-dev 04463] + on 2012-06-27. + +2013-04-08 Hayaki Saito <user@zuse.jp> + + * keybind.c, main.c, proto.h, terms.c: + Support SGR 1006 mouse reporting + Patch to support SGR 1006 mouse reporting, from [w3m-dev 04466] + on 2012-07-15. + +2012-05-19 Hilko Bengen <bengen@debian.org> + + * form.c: Assume "text" if an input type is unknown + Patch from <http://bugs.debian.org/615843> on 2011-03-01. + +2012-05-19 Simon Ruderich <simon@ruderich.org> + + * Makefile.in: Use $(CPPFLAGS) with $(CPP) + Patch from <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=665491> + on 2012-03-24. + +2012-05-03 Miroslav Šulc <fordfrog@gentoo.org> + + * w3mimg/Makefile.in: Fix parallel make issue + Patch from Gentoo + <http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/www-client/w3m/files/w3m-0.5.3-parallel-make.patch?revision=1.1&view=markup> + <https://bugs.gentoo.org/show_bug.cgi?id=353390> on 2011-02-01. + +2012-05-03 MATSUU Takuto <matsuu@gentoo.org> + + * main.c: Support Boehm GC 7.2 + Patch from Gentoo + <http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/www-client/w3m/files/w3m-0.5.2-gc72.patch?revision=1.1&view=markup> + on 2009-12-13. + +2012-05-02 Reinhard Tartler <siretart@tauware.de> + + * istream.c, istream.h: + Fix that struct file_handle conflicts with glibc 2.14 + Patch from <https://bugs.launchpad.net/ubuntu/+source/w3m/+bug/935540> + on 2012-02-19. + +2011-10-30 Colin Watson <cjwatson@ubuntu.com> + + * acinclude.m4, configure, w3mbookmark.c: + Appease gcc -Werror=format-security. + Patch from 0.5.3-3ubuntu1 on 2011-10-23. + Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=646321 + +2011-06-19 Martin Pitt <martin.pitt@ubuntu.com> + + * Makefile.in: + Explicitly link w3mimgdisplay with -lX11 to build with gcc 4.5 + Patch from 0.5.2-10ubuntu1 on 2010-12-03. + Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=605761 + +2011-06-19 Fumitoshi UKAI <ukai@debian.or.jp> + + * main.c: + Change the -s option to "squeeze multiple blank lines" for pager + Change the -s option from "display charset Shift_JIS" to "squeeze + multiple blank lines" to work as /usr/bin/pager. In addition, the + options -j and -e are disabled. To specify the display charset, + use -O{s|j|e} instead. + Patch from [w3m-dev 01275] on 2000-10-26. + Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=75527 + +2011-06-19 Hiroyuki Ito <ZXB01226@nifty.com> + + * file.c, fm.h, html.c, html.h, proto.h, table.c, tagtable.tab: + Support the button element as defined in HTML 4.01 + Patch from upstream, [w3m-dev 04411] on 2010-09-17, to support the + button element. It is discussed upstream and incomplete, but enough + to login Launchpad. + Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=136810 + +2012-05-22 Tatsuya Kinoshita <tats@vega.ocn.ne.jp> + + * [w3m-dev 04451] w3m/entity.h should be removed when `make clean' + * 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 +9619,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 52a0aae..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 @@ -250,7 +250,7 @@ install-po: (cd $$subdir && $(MAKE) install); \ done -all-scripts: +all-scripts: funcname.tab for dir in $(SCRIPTSUBDIRS); \ do \ (cd $$dir && $(MAKE) $(MAKE_ARGS)); \ @@ -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 @@ -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..c1d112b 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -649,6 +649,9 @@ AC_DEFUN([AC_W3M_IMAGE], fi;; imlib2) with_imlib2="yes" + if test x"$PKG_CONFIG" = x; then + PKG_CONFIG=pkg-config + fi if test x"$IMLIB2_CONFIG" = x; then IMLIB2_CONFIG=imlib2-config fi;; @@ -706,7 +709,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" @@ -728,7 +731,7 @@ AC_DEFUN([AC_W3M_IMAGE], IMGTARGETS="x11" AC_DEFINE(USE_IMLIB2) IMGX11CFLAGS="`${IMLIB2_CONFIG} --cflags`" - IMGX11LDFLAGS="`${IMLIB2_CONFIG} --libs`" + IMGX11LDFLAGS="-lX11 `${PKG_CONFIG} --libs imlib2`" else AC_MSG_WARN([unable to build w3mimgdisplay with X11 support]) fi @@ -756,7 +759,7 @@ AC_DEFUN([AC_W3M_IMAGE], AC_DEFINE(USE_IMLIB2) IMGOBJS="$IMGOBJS fb/fb_w3mimg.o fb/fb.o fb/fb_img.o" IMGFBCFLAGS="`${IMLIB2_CONFIG} --cflags`" - IMGFBLDFLAGS="`${IMLIB2_CONFIG} --libs`" + IMGFBLDFLAGS="`${PKG_CONFIG} --libs imlib2`" else AC_MSG_WARN([unable to build w3mimgdisplay with FB support]) fi @@ -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..b79252d 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-06-10' # 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,345 @@ EOF exit (0); } EOF - $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 - exit 0 ;; + exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd - exit 0 ;; + exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd - exit 0 ;; + exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix - exit 0 ;; + exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf - exit 0 ;; + exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf - exit 0 ;; + exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi - exit 0 ;; + exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites - exit 0 ;; + exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd - exit 0 ;; + exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi - exit 0 ;; + exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd - exit 0 ;; + exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd - exit 0 ;; + exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd - exit 0 ;; + exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; + exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' - exit 0 ;; + exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; + exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; + exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; + exit ;; *:UNICOS/mp:*:*) - echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit 0 ;; + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit 0 ;; + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} - exit 0 ;; + exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} - exit 0 ;; + exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit 0 ;; + exit ;; *:FreeBSD:*:*) - # Determine whether the default compiler uses glibc. - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include <features.h> - #if __GLIBC__ >= 2 - LIBC=gnu - #else - LIBC= - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` - # GNU/KFreeBSD systems have a "k" prefix to indicate we are using - # FreeBSD's kernel, but not the complete OS. - case ${LIBC} in gnu) kernel_only='k' ;; esac - echo ${UNAME_MACHINE}-unknown-${kernel_only}freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} - exit 0 ;; + UNAME_PROCESSOR=`/usr/bin/uname -p` + case ${UNAME_PROCESSOR} in + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin - exit 0 ;; - i*:MINGW*:*) + exit ;; + *:MINGW64*:*) + echo ${UNAME_MACHINE}-pc-mingw64 + exit ;; + *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 - exit 0 ;; + exit ;; + 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 ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-${LIBC} + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-${LIBC} + exit ;; s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux - exit 0 ;; + echo ${UNAME_MACHINE}-ibm-linux-${LIBC} + exit ;; sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit 0 ;; + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit 0 ;; + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit 0 ;; + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + tile*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-${LIBC} + exit ;; x86_64:Linux:*:*) - echo x86_64-unknown-linux-gnu - exit 0 ;; - i*86:Linux:*:*) - # The BFD linker knows what the default object file format is, so - # first see if it will tell us. cd to the root directory to prevent - # problems with other programs or directories called `ld' in the path. - # Set LC_ALL=C to ensure ld outputs messages in English. - ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ - | sed -ne '/supported targets:/!d - s/[ ][ ]*/ /g - s/.*supported targets: *// - s/ .*// - p'` - case "$ld_supported_targets" in - elf32-i386) - TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" - ;; - a.out-i386-linux) - echo "${UNAME_MACHINE}-pc-linux-gnuaout" - exit 0 ;; - coff-i386) - echo "${UNAME_MACHINE}-pc-linux-gnucoff" - exit 0 ;; - "") - # Either a pre-BFD a.out linker (linux-gnuoldld) or - # one that does not give us useful --help. - echo "${UNAME_MACHINE}-pc-linux-gnuoldld" - exit 0 ;; - esac - # Determine whether the default compiler is a.out or elf - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include <features.h> - #ifdef __ELF__ - # ifdef __GLIBC__ - # if __GLIBC__ >= 2 - LIBC=gnu - # else - LIBC=gnulibc1 - # endif - # else - LIBC=gnulibc1 - # endif - #else - #ifdef __INTEL_COMPILER - LIBC=gnu - #else - LIBC=gnuaout - #endif - #endif - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` - test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 - test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 - ;; + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 - exit 0 ;; + exit ;; i*86:UNIX_SV:4.2MP:2.*) - # Unixware is an offshoot of SVR4, but it has its own version - # number series starting with 2... - # I am not positive that other SVR4 systems won't match this, + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. - # Use sysv4.2uw... so that sysv4* matches it. + # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} - exit 0 ;; + exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx - exit 0 ;; + exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop - exit 0 ;; + exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos - exit 0 ;; - i*86:syllable:*:*) + exit ;; + i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable - exit 0 ;; - i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; + exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp - exit 0 ;; + exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then @@ -1040,15 +1066,16 @@ EOF else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi - exit 0 ;; - i*86:*:5:[78]*) + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} - exit 0 ;; + exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name` @@ -1066,73 +1093,86 @@ EOF else echo ${UNAME_MACHINE}-pc-sysv32 fi - exit 0 ;; + exit ;; pc:*:*:*) # Left here for compatibility: - # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i386. - echo i386-pc-msdosdjgpp - exit 0 ;; + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 - exit 0 ;; + exit ;; paragon:*:*:*) echo i860-intel-osf1 - exit 0 ;; + exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi - exit 0 ;; + exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv - exit 0 ;; + exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv - exit 0 ;; + exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix - exit 0 ;; - M68*:*:R3V[567]*:*) - test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; - 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0) + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && echo i486-ncr-sysv4.3${OS_REL} && exit 0 + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && echo i486-ncr-sysv4 && exit 0 ;; + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; + exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 - exit 0 ;; + exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; + exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; + exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} - exit 0 ;; + exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 - exit 0 ;; + exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 - exit 0 ;; + exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` @@ -1140,68 +1180,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 +1280,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 +1312,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 +1378,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 +1476,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 +1490,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 +1516,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 @@ -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-08-10' -# 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 \ - | c4x | clipper \ + | arc | arceb \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | be32 | be64 \ + | bfin \ + | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ - | fr30 | frv \ + | epiphany \ + | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ - | m32r | m32rle | m68000 | m68k | m88k | mcore \ + | 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-* \ + | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ - | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ - | m32r-* | m32rle-* \ + | 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 + basic_machine=i686-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=i686-pc + os=-msys + ;; mvs) basic_machine=i370-ibm os=-mvs ;; + nacl) + basic_machine=le32-unknown + os=-nacl + ;; ncr3000) basic_machine=i486-ncr os=-sysv4 @@ -743,9 +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,24 @@ case $basic_machine in arm*-semi) os=-aout ;; - c4x-* | tic4x-*) - os=-coff - ;; + c4x-* | tic4x-*) + os=-coff + ;; + c8051-*) + os=-elf + ;; + hexagon-*) + os=-elf + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 @@ -1346,19 +1579,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 +1607,15 @@ case $basic_machine in *-be) os=-beos ;; + *-haiku) + os=-haiku + ;; *-ibm) os=-aix ;; + *-knuth) + os=-mmixware + ;; *-wec) os=-proelf ;; @@ -1476,7 +1718,7 @@ case $basic_machine in -sunos*) vendor=sun ;; - -aix*) + -cnk*|-aix*) vendor=ibm ;; -beos*) @@ -1539,7 +1781,7 @@ case $basic_machine in esac echo $basic_machine$os -exit 0 +exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) @@ -6811,6 +6811,9 @@ $as_echo "$with_imagelib" >&6; } fi;; imlib2) with_imlib2="yes" + if test x"$PKG_CONFIG" = x; then + PKG_CONFIG=pkg-config + fi if test x"$IMLIB2_CONFIG" = x; then IMLIB2_CONFIG=imlib2-config fi;; @@ -6927,7 +6930,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 @@ -6955,7 +6958,7 @@ $as_echo "$as_me: WARNING: Imlib2 is not installed. Install Imlib2 (version >= $as_echo "#define USE_IMLIB2 1" >>confdefs.h IMGX11CFLAGS="`${IMLIB2_CONFIG} --cflags`" - IMGX11LDFLAGS="`${IMLIB2_CONFIG} --libs`" + IMGX11LDFLAGS="-lX11 `${PKG_CONFIG} --libs imlib2`" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unable to build w3mimgdisplay with X11 support" >&5 $as_echo "$as_me: WARNING: unable to build w3mimgdisplay with X11 support" >&2;} @@ -6991,7 +6994,7 @@ $as_echo "$as_me: WARNING: unable to build w3mimgdisplay with X11 support" >&2;} IMGOBJS="$IMGOBJS fb/fb_w3mimg.o fb/fb.o fb/fb_img.o" IMGFBCFLAGS="`${IMLIB2_CONFIG} --cflags`" - IMGFBLDFLAGS="`${IMLIB2_CONFIG} --libs`" + IMGFBLDFLAGS="`${PKG_CONFIG} --libs imlib2`" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unable to build w3mimgdisplay with FB support" >&5 $as_echo "$as_me: WARNING: unable to build w3mimgdisplay with FB support" >&2;} @@ -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..a8623e2 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λˡβ̤ʤ @@ -489,8 +483,7 @@ w3m뤳ȤǤޤޥȤΤϡxterm/kterm/rxvt w3mȤСHTTPФʤCGIץȤư뤳ȤǤޤ ΤȤw3mФΤդƥץȤưνϤ ɤߤɽ櫓Ǥ -<a href="file:///$LIB/w3mbookmark?mode=panel&bmark=~/.w3m/bookmark.html&url=MANUAL.html&title=w3m+manual">֥åޡϿ</a> -<a href="file:///$LIB/w3mhelperpanel?mode=panel">ӥ塼Խ</a> +֥åޡϿȳӥ塼Խ ϡlocal CGIΥץȤȤƼ¸Ƥޤ local CGIȤСw3mѤΥեϥեȤ ȤȤǤޤ diff --git a/doc-jp/README b/doc-jp/README index 074766f..e5e59b1 100644 --- a/doc-jp/README +++ b/doc-jp/README @@ -122,7 +122,6 @@ w3m ϡƣ§°Ƥޤ ± satodai@w3m.jp -ոۤMLޤǤ - w3m-dev@sic.med.tohoku.ac.jp (ܸ) - w3m-dev-en@sic.med.tohoku.ac.jp (Ѹ) +ոۤ http://w3m.sourceforge.net/ + https://sourceforge.net/projects/w3m/ diff --git a/doc-jp/README.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/HISTORY b/doc/HISTORY index b8f5b94..7f7ae2b 100644 --- a/doc/HISTORY +++ b/doc/HISTORY @@ -588,7 +588,7 @@ From: Okabe Katsuya <okabek@guitar.ocn.ne.jp> * space characters in a buffer are mapped into 0x80-0x9f. * unprintable characters (0x80-0xa0) are displayed as \xxx. -From: Tsutomu Okada ($B2,ED(B $BJY(B) <okada@furuno.co.jp> +From: Tsutomu Okada <okada@furuno.co.jp> Subject: [w3m-dev 01354] minimize when #undef USE_GOPHER or USE_NNTP 2000/11/16 @@ -1422,7 +1422,7 @@ HTML4.0 ID attribute support. From: Okabe Katsuya <okabe@fphy.hep.okayama-u.ac.jp> table get weird when it contains <input type=hidden>. -$B=$@5!%(B +Fixed. 2000.2.12 From: Rogue Metal - Jake Moorman <roguemtl@stampede.org> @@ -1649,15 +1649,15 @@ From: patakuti If an <input type=button> tag has no `name' attribute, w3m adds it an inappropriate name attribute. -From: $B$d$^(B +From: Yama Now w3m can handle a frameset that has both ROWS and COLS. From: aito Now bookmarking is done by a separate command w3mbookmark. -C-s $B$G2hLLI=<($,;_$^$C$F$$$?%P%0$N=$@5!%(B +Bug fix that C-s hangs. -$BJ8;zF~NO;~$K(B C-g $B$GCf;_$G$-$k$h$&$K$7$?!%(B +Enable C-g to quit for keyboard input. From: hovav@cs.stanford.edu When downloading a file, an attempt to save it to a non-exist @@ -1699,7 +1699,7 @@ Menu behavior is changed. * Clicking outside the menu causes cancellation of sub-menu. * <, >, +, - abandoned -From: $B$*$+$@(B <okada@furuno.co.jp> +From: Okada <okada@furuno.co.jp> Now C-a/C-e are bound to 'jump to the first/last item in menu.' From: "OMAE, jun" <jun-o@osb.att.ne.jp> diff --git a/doc/MANUAL.html b/doc/MANUAL.html index aff0189..8353f33 100644 --- a/doc/MANUAL.html +++ b/doc/MANUAL.html @@ -55,12 +55,10 @@ If you don't specify this option, <dt>-l number <dd>Specify line number preserved internally when reading text/plain document fron standard input. Default is 10000. -<dt>-s -<dd>Display documents with Shift_JIS code. -<dt>-e -<dd>Display documents with EUC_JP code. -<dt>-j -<dd>Display documents with ISO-2022-JP code. +<dt>-O charset +<dd>Specify display/output charset. +<dt>-I charset +<dd>Specify document charset. <dt>-T type <dd>Specify document type. Without this option, document type is determined from extension of a file. If the determination @@ -90,7 +88,7 @@ It is useful when reading E-mail or NetNews messages. <dd>Monochrome display mode. <dt>-F <dd>Automatically render frame. -<dt>-S +<dt>-s <dd>Squeeze blank lines. <dt>-X <dd>Upon exit, do not display preserved screen. @@ -468,8 +466,7 @@ and <a href="keymap.lynx">keymap.lynx</a>) as examples. You can run CGI scripts using w3m, without any HTTP server. It means that w3m behaves like an HTTP server and activates CGI script, then w3m reads the output of the script and display it. The -<a href="file:///$LIB/w3mbookmark?mode=panel&bmark=~/.w3m/bookmark.html&url=MANUAL.html&title=w3m+manual">bookmark registration</a> -and <a href="file:///$LIB/w3mhelperpanel?mode=panel">helper-app editor</a> +bookmark registration and helper-app editor are realized as local CGI scripts. Using local CGI, w3m can be used as a general purpose form interface. <P> @@ -115,7 +115,6 @@ Current Maintainer Tohoku University Hospital satodai@w3m.jp -Feel free to send your opinion to the w3m mailing-lists. - w3m-dev@sic.med.tohoku.ac.jp (Japanese) - w3m-dev-en@sic.med.tohoku.ac.jp (English) +Feel free to send your opinion to: http://w3m.sourceforge.net/ + https://sourceforge.net/projects/w3m/ diff --git a/doc/README.cookie b/doc/README.cookie index 56cca50..da16947 100644 --- a/doc/README.cookie +++ b/doc/README.cookie @@ -37,7 +37,7 @@ cookie support of w3m (HDN: host domain name) - If the number of "." in domain name is lesser than 2, it is + * If the number of "." in domain name is lesser than 2, it is assumed as invalid cookie (cf. RFC 2109 4.3.2), however, you can use cookie_avoid_wrong_number_of_dots to avoid this restriction. You can set this in "Domains to avoid [wrong number diff --git a/doc/README.img b/doc/README.img index 0c10114..f11362f 100644 --- a/doc/README.img +++ b/doc/README.img @@ -41,7 +41,7 @@ Key functions Specify the following keymaps in ~/.w3m/keymap. keymap X DISPLAY_IMAGE keymap C-c STOP_IMAGE - keyamp t SET_OPTION display_image=toggle + keymap t SET_OPTION display_image=toggle Commandline options diff --git a/doc/README.m17n b/doc/README.m17n index c064d76..da5408b 100644 --- a/doc/README.m17n +++ b/doc/README.m17n @@ -49,7 +49,7 @@ Supported encoding schemes (character set) * Thai TIS-620 (ISO-8859-11), CP874 * Other - US_ASCII, ISO-8859-1 10, 13 15, + US_ASCII, ISO-8859-1 - 10, 13 - 15, KOI8-R, KOI8-U, NeXT, CP437, CP737, CP775, CP850, CP852, CP855, CP856, CP857, CP860, CP861, CP862, CP863, CP864, CP865, CP866, CP869, CP1006, CP1250, CP1251, CP1252, CP1253, CP1254, CP1255, CP1256, CP1257 diff --git a/doc/README.siteconf b/doc/README.siteconf new file mode 100644 index 0000000..f173087 --- /dev/null +++ b/doc/README.siteconf @@ -0,0 +1,60 @@ +The siteconf: Site-specific preferences + +The siteconf consists of URL patterns and preferences associated to them. +You can improve "decode_url" feature by giving charsets of URLs site by site, +or bypass Google's redirector for performance and your privacy. + +The siteconf is read from ~/.w3m/siteconf by default. + +===== The syntax ===== + +url <url>|/<re-url>/|m@<re-url>@i [exact] +substitute_url "<destination-url>" +url_charset <charset> +no_referer_from on|off +no_referer_to on|off + +The last match wins. + +===== Examples ===== + +url "http://twitter.com/#!/" +substitute_url "http://mobile.twitter.com/" + +This forwards the twitter.com to its mobile site. + +url "http://your.bookmark.net/" +no_referer_from on + +This prevents HTTP referers from being sent when you follow links +at the your.bookmark.net. + +url "http://www.google.com/url?" exact +substitute_url "file:///cgi-bin/your-redirector.cgi?" + +This forwards the Google's redirector to your local CGI. + +url /^http:\/\/[a-z]*\.wikipedia\.org\// +url_charset utf-8 + +When combinated with "decode_url" option turned on, links to +Wikipedia will be human-readable. + +===== Regular expressions notes ===== + +Following expressions are all equivalent: + +/http:\/\/www\.example\.com\// +m/http:\/\/www\.example\.com\// +m@http://www\.example\.com/@ +m!http://www\.example\.com/! + +With a trailing 'i' modifier, you can specify a case-insensitive match. +For example, m@^http://www\.example\.com/abc/@i matches to: + +http://www.example.com/abc/ +http://www.example.com/Abc/ +http://www.example.com/ABC/ + +Hostnames, however, are always converted to lowercases before compared. + diff --git a/doc/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 @@ -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> @@ -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]; @@ -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)) @@ -4363,15 +4341,15 @@ getMetaRefreshParam(char *q, Str *refresh_uri) while (*q) { if (!strncasecmp(q, "url=", 4)) { q += 4; - if (*q == '\"') /* " */ + if (*q == '\"' || *q == '\'') /* " or ' */ q++; r = q; while (*r && !IS_SPACE(*r) && *r != ';') r++; s_tmp = Strnew_charp_n(q, r - q); - if (s_tmp->ptr[s_tmp->length - 1] == '\"') { /* " - */ + if (s_tmp->ptr[s_tmp->length - 1] == '\"' /* " */ + || s_tmp->ptr[s_tmp->length - 1] == '\'') { /* ' */ s_tmp->length--; s_tmp->ptr[s_tmp->length] = '\0'; } @@ -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 */ @@ -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); @@ -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; @@ -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 || @@ -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 @@ -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=\""); @@ -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 }; @@ -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; @@ -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 */ } } @@ -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) { @@ -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 @@ -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; +} @@ -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 @@ -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 @@ -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 { @@ -109,6 +109,7 @@ loadLocalDir(char *dname) n++; } } + closedir(d); if (multicolList) { l = COLS / (maxlen + 2); @@ -359,6 +360,10 @@ localcgi_post(char *uri, char *qstr, FormList *request, char *referer) int status; pid_t pid; char *file = uri, *name = uri, *path_info = NULL, *tmpf = NULL; +#ifdef HAVE_CHDIR + char *cgi_dir; +#endif + char *cgi_basename; #ifdef __MINGW32_VERSION return NULL; @@ -373,7 +378,14 @@ localcgi_post(char *uri, char *qstr, FormList *request, char *referer) if (!fw) return NULL; } + if (qstr) + uri = Strnew_m_charp(uri, "?", qstr, NULL)->ptr; +#ifdef HAVE_CHDIR + cgi_dir = mydirname(file); +#endif + cgi_basename = mybasename(file); pid = open_pipe_rw(&fr, NULL); + /* Don't invoke gc after here, or the program might crash in some platforms */ if (pid < 0) return NULL; else if (pid) { @@ -383,8 +395,6 @@ localcgi_post(char *uri, char *qstr, FormList *request, char *referer) } setup_child(TRUE, 2, fw ? fileno(fw) : -1); - if (qstr) - uri = Strnew_m_charp(uri, "?", qstr, NULL)->ptr; set_cgi_environ(name, file, uri); if (path_info) set_environ("PATH_INFO", path_info); @@ -415,11 +425,11 @@ localcgi_post(char *uri, char *qstr, FormList *request, char *referer) } #ifdef HAVE_CHDIR /* ifndef __EMX__ ? */ - chdir(mydirname(file)); + chdir(cgi_dir); #endif - execl(file, mybasename(file), NULL); + execl(file, cgi_basename, NULL); fprintf(stderr, "execl(\"%s\", \"%s\", NULL): %s\n", - file, mybasename(file), strerror(errno)); + file, cgi_basename, strerror(errno)); exit(1); return NULL; #endif @@ -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" @@ -403,6 +406,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, ""); @@ -424,6 +431,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; @@ -747,6 +758,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(); } @@ -835,6 +855,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); @@ -911,12 +955,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) { @@ -945,9 +994,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? */ @@ -962,7 +1009,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; @@ -1263,6 +1310,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) { @@ -1283,18 +1336,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); } } } @@ -1583,6 +1638,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") { @@ -1861,6 +1928,10 @@ srch_nxtprv(int reverse) result = srchcore(SearchString, routine[reverse]); if (result & SR_FOUND) clear_mark(Currentbuf->currentLine); + else { + if (reverse == 0) + Currentbuf->pos -= 1; + } displayBuffer(Currentbuf, B_NORMAL); disp_srchresult(result, (reverse ? "Backward: " : "Forward: "), SearchString); @@ -2278,7 +2349,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 @@ -2821,12 +2892,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) @@ -3585,6 +3659,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") { @@ -4072,6 +4173,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) { @@ -4081,11 +4183,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); } @@ -4094,11 +4193,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); } @@ -4106,15 +4202,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; @@ -4123,14 +4226,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); @@ -4527,8 +4622,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); @@ -4587,7 +4681,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); @@ -5415,6 +5509,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) @@ -5621,7 +5767,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) @@ -279,7 +279,7 @@ follow_map_panel(Buffer *buf, char *name) p = parsedURL2Str(&pu)->ptr; q = html_quote(p); if (DecodeURL) - p = html_quote(url_unquote_conv(p, buf->document_charset)); + p = html_quote(url_decode2(p, buf)); else p = q; Strcat_m_charp(mappage, "<tr valign=top><td><a href=\"", q, "\">", @@ -417,10 +417,7 @@ append_map_info(Buffer *buf, Str tmp, FormItemList *fi) continue; parseURL2(a->url, &pu, baseURL(buf)); q = html_quote(parsedURL2Str(&pu)->ptr); - if (DecodeURL) - p = html_quote(url_unquote_conv(a->url, buf->document_charset)); - else - p = html_quote(a->url); + p = html_quote(url_decode2(a->url, buf)); Strcat_m_charp(tmp, "<tr valign=top><td> <td><a href=\"", q, "\">", html_quote(*a->alt ? a->alt : mybasename(a->url)), @@ -457,10 +454,8 @@ append_link_info(Buffer *buf, Str html, LinkList * link) Strcat_charp(html, "[Rev]"); if (!l->url) url = "(empty)"; - else if (DecodeURL) - url = html_quote(url_unquote_conv(l->url, buf->document_charset)); else - url = html_quote(l->url); + url = html_quote(url_decode2(l->url, buf)); Strcat_m_charp(html, "<td>", url, NULL); if (l->ctype) Strcat_m_charp(html, " (", html_quote(l->ctype), ")", NULL); @@ -498,8 +493,7 @@ append_frame_info(Buffer *buf, Str html, struct frameset *set, int level) Strcat_charp(html, p); } if (DecodeURL) - p = html_quote(url_unquote_conv(frame.body->url, - buf->document_charset)); + p = html_quote(url_decode2(frame.body->url, buf)); else p = q; Strcat_m_charp(html, " ", p, "</a></pre_int><br>\n", NULL); @@ -550,9 +544,7 @@ page_info_panel(Buffer *buf) #ifdef USE_M17N Strcat_charp(tmp, "<form method=internal action=charset>"); #endif - p = parsedURL2Str(&buf->currentURL)->ptr; - if (DecodeURL) - p = url_unquote_conv(p, 0); + p = url_decode2(parsedURL2Str(&buf->currentURL)->ptr, NULL); Strcat_m_charp(tmp, "<table cellpadding=0>", "<tr valign=top><td nowrap>Title<td>", html_quote(buf->buffername), @@ -589,7 +581,7 @@ page_info_panel(Buffer *buf) p = parsedURL2Str(&pu)->ptr; q = html_quote(p); if (DecodeURL) - p = html_quote(url_unquote_conv(p, buf->document_charset)); + p = html_quote(url_decode2(p, buf)); else p = q; Strcat_m_charp(tmp, @@ -602,7 +594,7 @@ page_info_panel(Buffer *buf) p = parsedURL2Str(&pu)->ptr; q = html_quote(p); if (DecodeURL) - p = html_quote(url_unquote_conv(p, buf->document_charset)); + p = html_quote(url_decode2(p, buf)); else p = q; Strcat_m_charp(tmp, @@ -613,10 +605,7 @@ page_info_panel(Buffer *buf) if (a != NULL) { FormItemList *fi = (FormItemList *)a->url; p = form2str(fi); - if (DecodeURL) - p = html_quote(url_unquote_conv(p, buf->document_charset)); - else - p = html_quote(p); + p = html_quote(url_decode2(p, buf)); Strcat_m_charp(tmp, "<tr valign=top><td nowrap>Method/type of current form <td>", p, NULL); @@ -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) @@ -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 @@ -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を使う)" @@ -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" @@ -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/\&/\&/g; s/\</\</g; s/\>/\>/g; + # non ASCII UTF-8 codepoint + my $utf8="[\300-\337][\200-\277]|[\340-\357][\200-\277]{2}|[\360-\367][\200-\277]{3}|[\370-\373][\200-\277]{4}|[\374\375][\200-\277]{5}"; - s@([\200-\377].)(\010{1,2}\1)+@<b>$1</b>@g; + s@($utf8)(\010\1)+@<b>$1</b>@g; s@(\&\w+;|.)(\010\1)+@<b>$1</b>@g; - s@__\010{1,2}((\<b\>)?[\200-\377].(\</b\>)?)@<u>$1</u>@g; + s@_\010((\<b\>)?($utf8)(\</b\>)?)@<u>$1</u>@g; s@_\010((\<b\>)?(\&\w+\;|.)(\</b\>)?)@<u>$1</u>@g; - s@((\<b\>)?[\200-\377].(\</b\>)?)\010{1,2}__@<u>$1</u>@g; + s@((\<b\>)?($utf8)(\</b\>)?)\010_@<u>$1</u>@g; s@((\<b\>)?(\&\w+\;|.)(\</b\>)?)\010_@<u>$1</u>@g; s@.\010(.)@$1@g; @@ -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 @@ -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();} @@ -121,6 +121,7 @@ static struct table2 DefaultGuess[] = { }; static void add_index_file(ParsedURL *pu, URLFile *uf); +static char * schemeNumToName(int scheme); /* #define HTTP_DEFAULT_FILE "/index.html" */ @@ -326,6 +327,7 @@ openSSLHandle(int sock, char *hostname, char **p_cert) SSL_load_error_strings(); if (!(ssl_ctx = SSL_CTX_new(SSLv23_client_method()))) goto eend; + SSL_CTX_set_cipher_list(ssl_ctx, "DEFAULT:!LOW:!EXP"); option = SSL_OP_ALL; if (ssl_forbid_method) { if (strchr(ssl_forbid_method, '2')) @@ -337,7 +339,15 @@ openSSLHandle(int sock, char *hostname, char **p_cert) if (strchr(ssl_forbid_method, 'T')) option |= SSL_OP_NO_TLSv1; } +#ifdef SSL_OP_NO_COMPRESSION + option |= SSL_OP_NO_COMPRESSION; +#endif SSL_CTX_set_options(ssl_ctx, option); + +#ifdef SSL_MODE_RELEASE_BUFFERS + SSL_CTX_set_mode (ssl_ctx, SSL_MODE_RELEASE_BUFFERS); +#endif + #ifdef USE_SSL_VERIFY /* derived from openssl-0.9.5/apps/s_{client,cb}.c */ #if 1 /* use SSL_get_verify_result() to verify cert */ @@ -444,6 +454,8 @@ baseURL(Buffer *buf) /* <BASE> tag is defined in the document */ return buf->baseURL; } + else if (IS_EMPTY_PARSED_URL(&buf->currentURL)) + return NULL; else return &buf->currentURL; } @@ -638,16 +650,21 @@ openSocket(char *const hostname, #define COPYPATH_SPC_ALLOW 0 #define COPYPATH_SPC_IGNORE 1 #define COPYPATH_SPC_REPLACE 2 +#define COPYPATH_SPC_MASK 3 +#define COPYPATH_LOWERCASE 4 static char * copyPath(char *orgpath, int length, int option) { Str tmp = Strnew(); - while (*orgpath && length != 0) { - if (IS_SPACE(*orgpath)) { - switch (option) { + char ch; + while ((ch = *orgpath) != 0 && length != 0) { + if (option & COPYPATH_LOWERCASE) + ch = TOLOWER(ch); + if (IS_SPACE(ch)) { + switch (option & COPYPATH_SPC_MASK) { case COPYPATH_SPC_ALLOW: - Strcat_char(tmp, *orgpath); + Strcat_char(tmp, ch); break; case COPYPATH_SPC_IGNORE: /* do nothing */ @@ -658,7 +675,7 @@ copyPath(char *orgpath, int length, int option) } } else - Strcat_char(tmp, *orgpath); + Strcat_char(tmp, ch); orgpath++; length--; } @@ -668,22 +685,14 @@ copyPath(char *orgpath, int length, int option) void parseURL(char *url, ParsedURL *p_url, ParsedURL *current) { - char *p, *q; + char *p, *q, *qq; Str tmp; url = url_quote(url); /* quote 0x01-0x20, 0x7F-0xFF */ p = url; + copyParsedURL(p_url, NULL); p_url->scheme = SCM_MISSING; - p_url->port = 0; - p_url->user = NULL; - p_url->pass = NULL; - p_url->host = NULL; - p_url->is_nocache = 0; - p_url->file = NULL; - p_url->real_file = NULL; - p_url->query = NULL; - p_url->label = NULL; /* RFC1808: Relative Uniform Resource Locators * 4. Resolving Relative URLs @@ -694,7 +703,7 @@ parseURL(char *url, ParsedURL *p_url, ParsedURL *current) goto do_label; } #if defined( __EMX__ ) || defined( __CYGWIN__ ) - if (!strncmp(url, "file://localhost/", 17)) { + if (!strncasecmp(url, "file://localhost/", 17)) { p_url->scheme = SCM_LOCAL; p += 17 - 1; url += 17 - 1; @@ -802,19 +811,20 @@ parseURL(char *url, ParsedURL *p_url, ParsedURL *current) /* scheme://user:pass@host or * scheme://host:port */ - p_url->host = copyPath(q, p - q, COPYPATH_SPC_IGNORE); + qq = q; q = ++p; while (*p && strchr("@/?#", *p) == NULL) p++; if (*p == '@') { /* scheme://user:pass@... */ + p_url->user = copyPath(qq, q - 1 - qq, COPYPATH_SPC_IGNORE); p_url->pass = copyPath(q, p - q, COPYPATH_SPC_ALLOW); q = ++p; - p_url->user = p_url->host; - p_url->host = NULL; goto analyze_url; } /* scheme://host:port/ */ + p_url->host = copyPath(qq, q - 1 - qq, + COPYPATH_SPC_IGNORE | COPYPATH_LOWERCASE); tmp = Strnew_charp_n(q, p - q); p_url->port = atoi(tmp->ptr); /* *p is one of ['\0', '/', '?', '#'] */ @@ -829,7 +839,8 @@ parseURL(char *url, ParsedURL *p_url, ParsedURL *current) case '/': case '?': case '#': - p_url->host = copyPath(q, p - q, COPYPATH_SPC_IGNORE); + p_url->host = copyPath(q, p - q, + COPYPATH_SPC_IGNORE | COPYPATH_LOWERCASE); p_url->port = DefaultPort[p_url->scheme]; break; } @@ -956,12 +967,16 @@ parseURL(char *url, ParsedURL *p_url, ParsedURL *current) p_url->label = NULL; } -#define initParsedURL(p) bzero(p,sizeof(ParsedURL)) #define ALLOC_STR(s) ((s)==NULL?NULL:allocStr(s,-1)) void -copyParsedURL(ParsedURL *p, ParsedURL *q) +copyParsedURL(ParsedURL *p, const ParsedURL *q) { + if (q == NULL) { + memset(p, 0, sizeof(ParsedURL)); + p->scheme = SCM_UNKNOWN; + return; + } p->scheme = q->scheme; p->port = q->port; p->is_nocache = q->is_nocache; @@ -1280,9 +1295,23 @@ getURLScheme(char **url) } static char * +schemeNumToName(int scheme) +{ + int i; + + for (i = 0; schemetable[i].cmdname != NULL; i++) { + if (schemetable[i].cmd == scheme) + return schemetable[i].cmdname; + } + return NULL; +} + +static char * otherinfo(ParsedURL *target, ParsedURL *current, char *referer) { Str s = Strnew(); + const int *no_referer_ptr; + int no_referer; Strcat_charp(s, "User-Agent: "); if (UserAgent == NULL || *UserAgent == '\0') @@ -1306,7 +1335,12 @@ otherinfo(ParsedURL *target, ParsedURL *current, char *referer) Strcat_charp(s, "Pragma: no-cache\r\n"); Strcat_charp(s, "Cache-control: no-cache\r\n"); } - if (!NoSendReferer) { + no_referer = NoSendReferer; + no_referer_ptr = query_SCONF_NO_REFERER_FROM(current); + no_referer = NoSendReferer || (no_referer_ptr && *no_referer_ptr); + no_referer_ptr = query_SCONF_NO_REFERER_TO(target); + no_referer = no_referer || (no_referer_ptr && *no_referer_ptr); + if (!no_referer) { #ifdef USE_SSL if (current && current->scheme == SCM_HTTPS && target->scheme != SCM_HTTPS) { /* Don't send Referer: if https:// -> http:// */ @@ -1314,6 +1348,7 @@ otherinfo(ParsedURL *target, ParsedURL *current, char *referer) else #endif if (referer == NULL && current && current->scheme != SCM_LOCAL && + current->scheme != SCM_LOCAL_CGI && (current->scheme != SCM_FTP || (current->user == NULL && current->pass == NULL))) { char *p = current->label; @@ -1603,7 +1638,7 @@ openURL(char *url, ParsedURL *pu, ParsedURL *current, pu->host != NULL && !check_no_proxy(pu->host)) { hr->flag |= HR_FLAG_PROXY; sock = openSocket(FTP_proxy_parsed.host, - schemetable[FTP_proxy_parsed.scheme].cmdname, + schemeNumToName(FTP_proxy_parsed.scheme), FTP_proxy_parsed.port); if (sock < 0) return uf; @@ -1645,15 +1680,15 @@ openURL(char *url, ParsedURL *pu, ParsedURL *current, } else if (pu->scheme == SCM_HTTPS) { sock = openSocket(HTTPS_proxy_parsed.host, - schemetable[HTTPS_proxy_parsed.scheme]. - cmdname, HTTPS_proxy_parsed.port); + schemeNumToName(HTTPS_proxy_parsed.scheme), + HTTPS_proxy_parsed.port); sslh = NULL; } else { #endif /* USE_SSL */ sock = openSocket(HTTP_proxy_parsed.host, - schemetable[HTTP_proxy_parsed.scheme]. - cmdname, HTTP_proxy_parsed.port); + schemeNumToName(HTTP_proxy_parsed.scheme), + HTTP_proxy_parsed.port); #ifdef USE_SSL sslh = NULL; } @@ -1685,8 +1720,7 @@ openURL(char *url, ParsedURL *pu, ParsedURL *current, } } else { - sock = openSocket(pu->host, - schemetable[pu->scheme].cmdname, pu->port); + sock = openSocket(pu->host, schemeNumToName(pu->scheme), pu->port); if (sock < 0) { *status = HTST_MISSING; return uf; @@ -1750,7 +1784,7 @@ openURL(char *url, ParsedURL *pu, ParsedURL *current, pu->host != NULL && !check_no_proxy(pu->host)) { hr->flag |= HR_FLAG_PROXY; sock = openSocket(GOPHER_proxy_parsed.host, - schemetable[GOPHER_proxy_parsed.scheme].cmdname, + schemeNumToName(GOPHER_proxy_parsed.scheme), GOPHER_proxy_parsed.port); if (sock < 0) return uf; @@ -1758,8 +1792,7 @@ openURL(char *url, ParsedURL *pu, ParsedURL *current, tmp = HTTPrequest(pu, current, hr, extra_header); } else { - sock = openSocket(pu->host, - schemetable[pu->scheme].cmdname, pu->port); + sock = openSocket(pu->host, schemeNumToName(pu->scheme), pu->port); if (sock < 0) return uf; if (pu->file == NULL) @@ -2234,3 +2267,66 @@ schemeToProxy(int scheme) } return pu; } + +#ifdef USE_M17N +wc_ces +url_to_charset(const char *url, const ParsedURL *base, wc_ces doc_charset) +{ + const ParsedURL *pu; + ParsedURL pu_buf; + const wc_ces *csptr; + + if (url && *url && *url != '#') { + parseURL2((char *)url, &pu_buf, (ParsedURL *)base); + pu = &pu_buf; + } else { + pu = base; + } + if (pu && (pu->scheme == SCM_LOCAL || pu->scheme == SCM_LOCAL_CGI)) + return SystemCharset; + csptr = query_SCONF_URL_CHARSET(pu); + return (csptr && *csptr) ? *csptr : + doc_charset ? doc_charset : DocumentCharset; +} + +char * +url_encode(const char *url, const ParsedURL *base, wc_ces doc_charset) +{ + return url_quote_conv((char *)url, + url_to_charset(url, base, doc_charset)); +} + +#if 0 /* unused */ +char * +url_decode(const char *url, const ParsedURL *base, wc_ces doc_charset) +{ + if (!DecodeURL) + return (char *)url; + return url_unquote_conv((char *)url, + url_to_charset(url, base, doc_charset)); +} +#endif + +char * +url_decode2(const char *url, const Buffer *buf) +{ + wc_ces url_charset; + + if (!DecodeURL) + return (char *)url; + url_charset = buf ? + url_to_charset(url, baseURL((Buffer *)buf), buf->document_charset) : + url_to_charset(url, NULL, 0); + return url_unquote_conv((char *)url, url_charset); +} + +#else /* !defined(USE_M17N) */ + +char * +url_decode0(const char *url) +{ + if (!DecodeURL) + return (char *)url; + return url_unquote_conv((char *)url, 0); +} +#endif /* !defined(USE_M17N) */ diff --git a/version.c.in b/version.c.in index 27dab36..4f87e63 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-16" #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/Makefile.in b/w3mimg/Makefile.in index dfc550c..8e2ad73 100644 --- a/w3mimg/Makefile.in +++ b/w3mimg/Makefile.in @@ -16,9 +16,9 @@ IMGCFLAGS=@IMGX11CFLAGS@ @IMGFBCFLAGS@ @IMGWINCFLAGS@ IMGOBJS=@IMGOBJS@ .PHONY: $(SUBDIRS) -all: @IMGTARGETS@ w3mimg.a +all: w3mimg.a -w3mimg.a: $(IMGOBJS) +w3mimg.a: w3mimg.o @IMGTARGETS@ $(AR) rv $@ $(IMGOBJS) $(RANLIB) $@ diff --git a/w3mimg/fb/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 |