diff options
author | Fumitoshi UKAI <ukai@debian.or.jp> | 2002-01-14 15:59:17 +0000 |
---|---|---|
committer | Fumitoshi UKAI <ukai@debian.or.jp> | 2002-01-14 15:59:17 +0000 |
commit | a5ab3f27e084a5b0f887137ad3c16fe19f3ebba9 (patch) | |
tree | 7b8a0f2562bdb6430ddcd6ab6154589bbe0b7f86 | |
parent | [w3m-dev 02832] external URI loader support (diff) | |
download | w3m-a5ab3f27e084a5b0f887137ad3c16fe19f3ebba9.tar.gz w3m-a5ab3f27e084a5b0f887137ad3c16fe19f3ebba9.zip |
[w3m-dev 02832] external URI loader support
From: Fumitoshi UKAI <ukai@debian.or.jp>
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | config.h.dist | 3 | ||||
-rwxr-xr-x | configure | 6 | ||||
-rw-r--r-- | file.c | 17 | ||||
-rw-r--r-- | fm.h | 5 | ||||
-rw-r--r-- | menu.c | 4 | ||||
-rw-r--r-- | proto.h | 6 | ||||
-rw-r--r-- | rc.c | 11 | ||||
-rw-r--r-- | url.c | 115 |
10 files changed, 160 insertions, 11 deletions
@@ -1,6 +1,7 @@ 2002-01-15 Fumitoshi UKAI <ukai@debian.or.jp> * [w3m-dev 02832] external URI loader support + * NEWS: support external URI loader * config.h.dist (USE_EXTERNAL_URI_LOADER): added * config.h.dist (USER_URIMETHODMAP): added * config.h.dist (SYS_URIMETHODMAP): added @@ -1914,4 +1915,4 @@ * release-0-2-1 * import w3m-0.2.1 -$Id: ChangeLog,v 1.213 2002/01/14 15:59:16 ukai Exp $ +$Id: ChangeLog,v 1.214 2002/01/14 16:00:59 ukai Exp $ @@ -1,5 +1,6 @@ w3m 0.3? +* support external URI loader * support -dump_extra ftp:// * new regex implementation diff --git a/config.h.dist b/config.h.dist index a55d00f..e1208ae 100644 --- a/config.h.dist +++ b/config.h.dist @@ -117,6 +117,7 @@ MODEL=Linux.i686-monster-ja #undef FTPPASS_HOSTNAMEGEN #undef USE_NNTP #undef USE_GOPHER +#define USE_EXTERNAL_URI_LOADER #undef USE_ALARM #define USE_HELP_CGI @@ -147,6 +148,8 @@ MODEL=Linux.i686-monster-ja #define SYS_MAILCAP "/etc/mailcap" #define USER_MIMETYPES "~/.mime.types" #define SYS_MIMETYPES "/usr/local/lib/mime.types" +#define USER_URIMETHODMAP RC_DIR "/urimethodmap" +#define SYS_URIMETHODMAP ETC_DIR "/urimethodmap" #define DEF_SAVE_FILE "index.html" @@ -1,5 +1,5 @@ #!/bin/sh -# $Id: configure,v 1.47 2002/01/05 16:13:27 ukai Exp $ +# $Id: configure,v 1.48 2002/01/14 15:59:17 ukai Exp $ # Configuration. # @@ -698,6 +698,7 @@ else fi # protocols? +ask_param "External URI loader support" use_external_uri_loader y ask_param "NNTP support" use_nntp $include_opt ask_param "Gopher support" use_gopher $include_opt @@ -2044,6 +2045,7 @@ $def_use_cookie $def_use_ssl $def_use_ssl_verify $def_ftppass_hostnamegen +$def_use_external_uri_loader $def_use_nntp $def_use_gopher $def_use_alarm @@ -2076,6 +2078,8 @@ $def_use_help_cgi #define SYS_MAILCAP "/etc/mailcap" #define USER_MIMETYPES "~/.mime.types" #define SYS_MIMETYPES "$MIME_TYPES" +#define USER_URIMETHODMAP RC_DIR "/urimethodmap" +#define SYS_URIMETHODMAP ETC_DIR "/urimethodmap" #define DEF_SAVE_FILE "index.html" @@ -1,4 +1,4 @@ -/* $Id: file.c,v 1.42 2002/01/12 13:33:47 ukai Exp $ */ +/* $Id: file.c,v 1.43 2002/01/14 15:59:17 ukai Exp $ */ #include "fm.h" #include <sys/types.h> #include "myctype.h" @@ -1069,14 +1069,27 @@ loadGeneralFile(char *path, ParsedURL *volatile current, char *referer, else { b = dirBuffer(pu.real_file); if (b == NULL) - return NULL; + return NO_BUFFER; t = "text/html"; b->real_scheme = pu.scheme; goto loaded; } } } + break; +#ifdef USE_EXTERNAL_URI_LOADER + case SCM_UNKNOWN: + tmp = searchURIMethods(&pu); + if (tmp != NULL) { + b = loadGeneralFile(tmp->ptr, NULL, NO_REFERER, 0, NULL); + if (b != NO_BUFFER) + return b; + } + break; +#endif } + disp_err_message(Sprintf("Unknown URI: %s", + parsedURL2Str(&pu)->ptr)->ptr, FALSE); return NO_BUFFER; } @@ -1,4 +1,4 @@ -/* $Id: fm.h,v 1.36 2001/12/27 17:50:56 ukai Exp $ */ +/* $Id: fm.h,v 1.37 2002/01/14 15:59:17 ukai Exp $ */ /* * w3m: WWW wo Miru utility * @@ -784,6 +784,9 @@ global struct cookie *First_cookie init(NULL); global char *mailcap_files init(USER_MAILCAP ", " SYS_MAILCAP); global char *mimetypes_files init(USER_MIMETYPES ", " SYS_MIMETYPES); +#ifdef USE_EXTERNAL_URI_LOADER +global char *urimethodmap_files init(USER_URIMETHODMAP ", " SYS_URIMETHODMAP); +#endif global TextList *fileToDelete; @@ -1,4 +1,4 @@ -/* $Id: menu.c,v 1.11 2002/01/10 15:43:11 ukai Exp $ */ +/* $Id: menu.c,v 1.12 2002/01/14 15:59:17 ukai Exp $ */ /* * w3m menu.c */ @@ -1281,7 +1281,7 @@ initSelectMenu(void) conv_from_system(buf->currentURL.real_file)); } break; - case SCM_UNKNOWN: + // case SCM_UNKNOWN: case SCM_MISSING: break; default: @@ -1,4 +1,4 @@ -/* $Id: proto.h,v 1.23 2002/01/11 20:05:58 ukai Exp $ */ +/* $Id: proto.h,v 1.24 2002/01/14 15:59:17 ukai Exp $ */ /* * This file was automatically generated by version 1.7 of cextract. * Manual editing not recommended. @@ -110,6 +110,10 @@ extern void setAlarmEvent(int sec, short status, int cmd, void *data); extern int currentLn(Buffer *buf); extern void tmpClearBuffer(Buffer *buf); extern char *filename_extension(char *patch, int is_url); +#ifdef USE_EXTERNAL_URI_LOADER +extern void initURIMethods(); +extern Str searchURIMethods(ParsedURL *pu); +#endif extern void examineFile(char *path, URLFile *uf); extern char *acceptableEncoding(); extern int dir_exist(char *path); @@ -1,4 +1,4 @@ -/* $Id: rc.c,v 1.24 2001/12/27 17:37:49 ukai Exp $ */ +/* $Id: rc.c,v 1.25 2002/01/14 15:59:17 ukai Exp $ */ /* * Initialization file etc. */ @@ -110,6 +110,7 @@ static char *config_file = NULL; #define CMT_SHOW_SRCH_STR "検索文字列を表示する" #define CMT_MIMETYPES "利用するmime.types" #define CMT_MAILCAP "利用するmailcap" +#define CMT_URIMETHODMAP "利用するurimethodmap" #define CMT_EDITOR "利用するエディタ" #define CMT_MAILER "利用するメーラ" #define CMT_EXTBRZ "外部ブラウザ" @@ -227,6 +228,7 @@ static char *config_file = NULL; #define CMT_SHOW_SRCH_STR "Show search strings" #define CMT_MIMETYPES "mime.types files" #define CMT_MAILCAP "mailcap files" +#define CMT_URIMETHODMAP "urimethodmap files" #define CMT_EDITOR "Editor" #define CMT_MAILER "Mailer" #define CMT_EXTBRZ "External Browser" @@ -503,6 +505,10 @@ struct param_ptr params6[] = { {"mime_types", P_STRING, PI_TEXT, (void *)&mimetypes_files, CMT_MIMETYPES, NULL}, {"mailcap", P_STRING, PI_TEXT, (void *)&mailcap_files, CMT_MAILCAP, NULL}, +#ifdef USE_EXTERNAL_URI_LOADER + {"urimethodmap", P_STRING, PI_TEXT, (void *)&urimethodmap_files, + CMT_URIMETHODMAP, NULL}, +#endif {"editor", P_STRING, PI_TEXT, (void *)&Editor, CMT_EDITOR, NULL}, {"mailer", P_STRING, PI_TEXT, (void *)&Mailer, CMT_MAILER, NULL}, {"extbrowser", P_STRING, PI_TEXT, (void *)&ExtBrowser, CMT_EXTBRZ, NULL}, @@ -1099,6 +1105,9 @@ sync_with_option(void) #endif initMailcap(); initMimeTypes(); +#ifdef USE_EXTERNAL_URI_LOADER + initURIMethods(); +#endif if (AcceptLang == NULL || *AcceptLang == '\0') { #if LANG == JA @@ -1,4 +1,4 @@ -/* $Id: url.c,v 1.32 2002/01/12 15:34:34 ukai Exp $ */ +/* $Id: url.c,v 1.33 2002/01/14 15:59:17 ukai Exp $ */ #include "fm.h" #include <sys/types.h> #include <sys/socket.h> @@ -709,6 +709,10 @@ parseURL(char *url, ParsedURL *p_url, ParsedURL *current) goto analyze_file; } /* scheme part has been found */ + if (p_url->scheme == SCM_UNKNOWN) { + p_url->file = allocStr(url, -1); + return; + } /* get host and port */ if (p[0] != '/' || p[1] != '/') { /* scheme:foo or scheme:/foo */ p_url->host = NULL; @@ -1083,9 +1087,12 @@ _parsedURL2Str(ParsedURL *pu, int pass) #endif /* USE_SSL */ }; - if (pu->scheme == SCM_UNKNOWN || pu->scheme == SCM_MISSING) { + if (pu->scheme == SCM_MISSING) { return Strnew_charp("???"); } + else if (pu->scheme == SCM_UNKNOWN) { + return Strnew_charp(pu->file); + } if (pu->host == NULL && pu->file == NULL && pu->label != NULL) { /* local label */ return Sprintf("#%s", pu->label); @@ -1945,3 +1952,107 @@ filename_extension(char *path, int is_url) else return last_dot; } + +#ifdef USE_EXTERNAL_URI_LOADER +static struct table2 **urimethods; + +static struct table2 * +loadURIMethods(char *filename) +{ + FILE *f; + int i, n; + Str tmp; + struct table2 *um; + char *up, *p; + + f = fopen(expandName(filename), "r"); + if (f == NULL) + return NULL; + i = 0; + while (tmp = Strfgets(f), tmp->length > 0) { + if (tmp->ptr[0] != '#') + i++; + } + fseek(f, 0, 0); + n = i; + um = New_N(struct table2, n + 1); + i = 0; + while (tmp = Strfgets(f), tmp->length > 0) { + if (tmp->ptr[0] == '#') + continue; + while (IS_SPACE(Strlastchar(tmp))) + Strshrink(tmp, 1); + for (up = p = tmp->ptr; *p != '\0'; p++) { + if (*p == ':') { + um[i].item1 = Strnew_charp_n(up, p - up)->ptr; + p++; + break; + } + } + if (*p == '\0') + continue; + while (*p != '\0' && IS_SPACE(*p)) + p++; + um[i].item2 = Strnew_charp(p)->ptr; + i++; + } + um[i].item1 = NULL; + um[i].item2 = NULL; + fclose(f); + return um; +} + +void +initURIMethods() +{ + TextList *methodmap_list = NULL; + TextListItem *tl; + int i; + + if (non_null(urimethodmap_files)) + methodmap_list = make_domain_list(urimethodmap_files); + if (methodmap_list == NULL) + return; + urimethods = New_N(struct table2 *, (methodmap_list->nitem + 1)); + for (i = 0, tl = methodmap_list->first; tl; tl = tl->next) { + urimethods[i] = loadURIMethods(tl->ptr); + if (urimethods[i]) + i++; + } + urimethods[i] = NULL; +} + +Str +searchURIMethods(ParsedURL *pu) +{ + struct table2 *ump; + int i; + Str scheme = NULL; + Str url; + char *p; + + if (pu->scheme != SCM_UNKNOWN) + return NULL; /* use internal */ + if (urimethods == NULL) + return NULL; + url = parsedURL2Str(pu); + for (p = url->ptr; *p != '\0'; p++) { + if (*p == ':') { + scheme = Strnew_charp_n(url->ptr, p - url->ptr); + break; + } + } + if (scheme == NULL) + return NULL; + + for (i = 0; (ump = urimethods[i]) != NULL; i++) { + while (ump->item1 != NULL) { + if (strcmp(ump->item1, scheme->ptr) == 0) { + return Sprintf(ump->item2, url_quote(url->ptr)); + } + ump++; + } + } + return NULL; +} +#endif |