aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--NEWS1
-rw-r--r--config.h.dist3
-rwxr-xr-xconfigure6
-rw-r--r--file.c17
-rw-r--r--fm.h5
-rw-r--r--menu.c4
-rw-r--r--proto.h6
-rw-r--r--rc.c11
-rw-r--r--url.c115
10 files changed, 160 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index e8943ba..12d561c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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 $
diff --git a/NEWS b/NEWS
index c578cfa..cfe688a 100644
--- a/NEWS
+++ b/NEWS
@@ -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"
diff --git a/configure b/configure
index 0106625..cf9f6e8 100755
--- a/configure
+++ b/configure
@@ -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"
diff --git a/file.c b/file.c
index 2e0d951..86c995b 100644
--- a/file.c
+++ b/file.c
@@ -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;
}
diff --git a/fm.h b/fm.h
index 0ded9fd..fde478e 100644
--- a/fm.h
+++ b/fm.h
@@ -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;
diff --git a/menu.c b/menu.c
index 992ec50..bf03ae9 100644
--- a/menu.c
+++ b/menu.c
@@ -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:
diff --git a/proto.h b/proto.h
index ed255df..0c4f481 100644
--- a/proto.h
+++ b/proto.h
@@ -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);
diff --git a/rc.c b/rc.c
index ac794b6..436e51d 100644
--- a/rc.c
+++ b/rc.c
@@ -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
diff --git a/url.c b/url.c
index c7fc0ee..17cbf50 100644
--- a/url.c
+++ b/url.c
@@ -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