w3m

Unnamed repository; edit this file to name it for gitweb.
git clone https://logand.com/git/w3m.git/
Log | Files | Refs | README

commit 676b5bc73f7a2d0e4343059c4aac46208e92ad0f
parent 496b3e7801de96ed9b311966380cba071727eb0d
Author: ukai <ukai>
Date:   Thu, 10 Jan 2002 15:39:21 +0000

[w3m-dev 02815]
From: aito@fw.ipsj.or.jp

Diffstat:
MChangeLog | 14++++++++++++++
Mcookie.c | 6+++---
Mmain.c | 12+++---------
Mmenu.c | 2+-
Mregex.c | 57+++++++++++++++++++++++++++++++++------------------------
Murl.c | 4++--
6 files changed, 56 insertions(+), 39 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -1,3 +1,17 @@ +2002-01-11 aito@fw.ipsj.or.jp + + * [w3m-dev 02815] + * cookie.c (domain_match): use new regex + * main.c (chkURLBuffer): use new regex + * main.c (chkNMIDBuffer): use new regex + * menu.c (menuForwardSearch): new regexMatch() + * regex.c (RegexMatch): negative length means whole string + * regex.c (RegexMatch): new regmatch() + * regex.c (regmatch_sub_anytime): add 5th arg `char *' + * regex.c (regmatch_iter): add 4th arg `char *' + * regex.c (regmatch): add 3rd arg `char *' + * url.c (openSocket): use new regex + 2002-01-10 aito@fw.ipsj.or.jp * [w3m-dev 02811] new regexp implementation diff --git a/cookie.c b/cookie.c @@ -45,9 +45,9 @@ domain_match(char *host, char *domain) /* [RFC 2109] s. 2, "domain-match", case 1 * (both are IP and identical) */ - regexCompile("[0-9][0-9]*\\.[0-9][0-9]*\\.[0-9][0-9]*\\.[0-9][0-9]*", 0); - m0 = regexMatch(host, 0, 1); - m1 = regexMatch(domain, 0, 1); + regexCompile("[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+", 0); + m0 = regexMatch(host, -1, 1); + m1 = regexMatch(domain, -1, 1); if (m0 && m1) { if (strcasecmp(host, domain) == 0) return host; diff --git a/main.c b/main.c @@ -4147,10 +4147,7 @@ void chkURLBuffer(Buffer *buf) { static char *url_like_pat[] = { - "http://[a-zA-Z0-9][a-zA-Z0-9:%\\-\\./?=~_\\&+@#,\\$;]*[a-zA-Z0-9_/=]", -#ifdef USE_SSL - "https://[a-zA-Z0-9][a-zA-Z0-9:%\\-\\./?=~_\\&+@#,\\$;]*[a-zA-Z0-9_/=]", -#endif /* USE_SSL */ + "https?://[a-zA-Z0-9][a-zA-Z0-9:%\\-\\./?=~_\\&+@#,\\$;]*[a-zA-Z0-9_/=]", #ifdef USE_GOPHER "gopher://[a-zA-Z0-9][a-zA-Z0-9:%\\-\\./_]*", #endif /* USE_GOPHER */ @@ -4161,10 +4158,7 @@ chkURLBuffer(Buffer *buf) #endif /* USE_NNTP */ "mailto:[^<> ][^<> ]*@[a-zA-Z0-9][a-zA-Z0-9\\-\\._]*[a-zA-Z0-9]", #ifdef INET6 - "http://[a-zA-Z0-9:%\\-\\./_@]*\\[[a-fA-F0-9:][a-fA-F0-9:\\.]*\\][a-zA-Z0-9:%\\-\\./?=~_\\&+@#,\\$;]*", -#ifdef USE_SSL - "https://[a-zA-Z0-9:%\\-\\./_@]*\\[[a-fA-F0-9:][a-fA-F0-9:\\.]*\\][a-zA-Z0-9:%\\-\\./?=~_\\&+@#,\\$;]*", -#endif /* USE_SSL */ + "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 @@ -4189,7 +4183,7 @@ void chkNMIDBuffer(Buffer *buf) { static char *url_like_pat[] = { - "<[^<> ][^<> ]*@[A-z0-9\\.\\-_][A-z0-9\\.\\-_]*>", + "<[^<> ][^<> ]*@[A-z0-9\\.\\-_]+>", NULL, }; int i; diff --git a/menu.c b/menu.c @@ -930,7 +930,7 @@ menuForwardSearch(Menu *menu, char *str, int from) from = 0; for (i = from; i < menu->nitem; i++) if (menu->item[i].type != MENU_NOP && - regexMatch(menu->item[i].label, 0, 1) == 1) + regexMatch(menu->item[i].label, -1, 1) == 1) return i; return -1; } diff --git a/regex.c b/regex.c @@ -66,7 +66,7 @@ static Regex DefaultRegex; #define CompiledRegex DefaultRegex.re #define Cstorage DefaultRegex.storage -static int regmatch(regexchar *, char *, int, char **); +static int regmatch(regexchar *, char *, char *, int, char **); static int regmatch1(regexchar *, longchar); static int matchWhich(longchar *, longchar); @@ -261,7 +261,7 @@ RegexMatch(Regex *re, char *str, int len, int firstp) if (str == NULL) return 0; - if (len == 0) + if (len < 0) len = strlen(str); re->position = NULL; ep = str + len; @@ -269,7 +269,7 @@ RegexMatch(Regex *re, char *str, int len, int firstp) lpos = NULL; re->lposition = NULL; for (r = re; r != NULL; r = r->alt_regex) { - switch (regmatch(r->re, p, firstp && (p == str), &lpos)) { + switch (regmatch(r->re, p, ep, firstp && (p == str), &lpos)) { case 1: /* matched */ re->position = p; if (re->lposition == NULL || re->lposition < lpos) @@ -341,11 +341,13 @@ struct MatchingContext2 { #define YIELD(retval,context,lnum) (context)->label = lnum; return (retval); label##lnum: -static int regmatch_iter(struct MatchingContext1 *, regexchar *, char *, int); +static int regmatch_iter(struct MatchingContext1 *, + regexchar *, char *, char *, int); static int regmatch_sub_anytime(struct MatchingContext2 *c, Regex *regex, - regexchar * pat2, char *str, int iter_limit, int firstp) + regexchar * pat2, + char *str, char *end_p, int iter_limit, int firstp) { switch (c->label) { case 1: @@ -364,7 +366,7 @@ regmatch_sub_anytime(struct MatchingContext2 *c, Regex *regex, c->firstp = firstp; for (;;) { c->ctx->label = 0; - while (regmatch_iter(c->ctx, c->regex->re, c->str, c->firstp)) { + while (regmatch_iter(c->ctx, c->regex->re, c->str, end_p, c->firstp)) { c->n_any = c->ctx->lastpos - c->str; if (c->n_any <= 0) continue; @@ -373,7 +375,7 @@ regmatch_sub_anytime(struct MatchingContext2 *c, Regex *regex, c->lastpos = c->str + c->n_any; YIELD(1, c, 1); } - else if (regmatch(pat2, c->str + c->n_any, + else if (regmatch(pat2, c->str + c->n_any, end_p, c->firstp, &c->lastpos) == 1) { YIELD(1, c, 2); } @@ -381,8 +383,8 @@ regmatch_sub_anytime(struct MatchingContext2 *c, Regex *regex, continue; c->ctx2->label = 0; while (regmatch_sub_anytime(c->ctx2, regex, pat2, - c->str + c->n_any, iter_limit - 1, - c->firstp)) { + c->str + c->n_any, end_p, + iter_limit - 1, c->firstp)) { c->lastpos = c->ctx2->lastpos; YIELD(1, c, 3); @@ -397,7 +399,7 @@ regmatch_sub_anytime(struct MatchingContext2 *c, Regex *regex, static int regmatch_iter(struct MatchingContext1 *c, - regexchar * re, char *str, int firstp) + regexchar * re, char *str, char *end_p, int firstp) { switch (c->label) { case 1: @@ -418,10 +420,11 @@ regmatch_iter(struct MatchingContext1 *c, if (RE_MODE(re) == RE_ENDMARK) return 0; c->re = re; - c->end_p = str + strlen(str); c->firstp = firstp; c->str = str; + c->end_p = end_p; c->sub_ctx = NULL; + c->lastpos = NULL; while (RE_MODE(c->re) != RE_ENDMARK) { if (c->re->mode & (RE_ANYTIME | RE_OPT)) { if (c->re->mode & RE_ANYTIME) @@ -441,6 +444,7 @@ regmatch_iter(struct MatchingContext1 *c, c->re->p.sub, c->re + 1, c->str + c->n_any, + c->end_p, c->iter_limit, c->firstp)) { c->n_any = c->ctx2->lastpos - c->str; @@ -480,7 +484,7 @@ regmatch_iter(struct MatchingContext1 *c, c->lastpos = c->str + c->n_any; YIELD(1, c, 2); } - else if (regmatch(c->re + 1, c->str + c->n_any, + else if (regmatch(c->re + 1, c->str + c->n_any, c->end_p, c->firstp, &c->lastpos) == 1) { YIELD(1, c, 3); } @@ -488,8 +492,6 @@ regmatch_iter(struct MatchingContext1 *c, return 0; } /* regexp other than pat*, pat+ and pat? */ - if (c->str >= c->end_p) - return 0; switch (RE_MODE(c->re)) { case RE_BEGIN: if (!c->firstp) @@ -497,9 +499,15 @@ regmatch_iter(struct MatchingContext1 *c, c->re++; break; case RE_END: - c->lastpos = c->str; - c->re++; - YIELD((c->str >= c->end_p), c, 4); + if (c->str >= c->end_p) { + c->lastpos = c->str; + c->re++; + YIELD(1, c, 4); + } + else { + c->lastpos = NULL; + return 0; + } break; case RE_SUBREGEX: if (c->sub_ctx == NULL) { @@ -509,14 +517,14 @@ regmatch_iter(struct MatchingContext1 *c, for (;;) { c->sub_ctx->label = 0; while (regmatch_iter(c->sub_ctx, c->sub_regex->re, - c->str, c->firstp)) { + c->str, c->end_p, c->firstp)) { if (c->sub_ctx->lastpos != c->str) c->firstp = 0; if (RE_MODE(c->re + 1) == RE_ENDMARK) { c->lastpos = c->sub_ctx->lastpos; YIELD(1, c, 5); } - else if (regmatch(c->re + 1, c->sub_ctx->lastpos, + else if (regmatch(c->re + 1, c->sub_ctx->lastpos, c->end_p, c->firstp, &c->lastpos) == 1) { YIELD(1, c, 6); } @@ -557,14 +565,14 @@ regmatch_iter(struct MatchingContext1 *c, } static int -regmatch(regexchar * re, char *str, int firstp, char **lastpos) +regmatch(regexchar * re, char *str, char *end_p, int firstp, char **lastpos) { struct MatchingContext1 contx; *lastpos = NULL; contx.label = 0; - while (regmatch_iter(&contx, re, str, firstp)) { + while (regmatch_iter(&contx, re, str, end_p, firstp)) { #ifdef REGEX_DEBUG char *p; if (verbose) { @@ -756,14 +764,15 @@ main(int argc, char **argv) printf("Error on regexp /%s/: %s\n", buf, msg); exit(1); } - if (RegexMatch(re, buf2, 0, 1)) { - printf("/%s/\t%s\t", buf, buf2); + if (RegexMatch(re, buf2, -1, 1)) { + printf("/%s/\t\"%s\"\t\"", buf, buf2); MatchedPosition(re, &fpos, &epos); while (fpos < epos) putchar(*(fpos++)); + putchar('"'); } else - printf("/%s/\t%s\tno_match", buf, buf2); + printf("/%s/\t\"%s\"\tno_match", buf, buf2); putchar('\n'); } /* notreatched */ diff --git a/url.c b/url.c @@ -626,8 +626,8 @@ openSocket(char *const hostname, #endif goto error; } - regexCompile("^[0-9][0-9]*\\.[0-9][0-9]*\\.[0-9][0-9]*\\.[0-9][0-9]*$", 0); - if (regexMatch(hostname, 0, 1)) { + regexCompile("^[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+$", 0); + if (regexMatch(hostname, -1, 1)) { sscanf(hostname, "%d.%d.%d.%d", &a1, &a2, &a3, &a4); adr = htonl((a1 << 24) | (a2 << 16) | (a3 << 8) | a4); bcopy((void *)&adr, (void *)&hostaddr.sin_addr, sizeof(long));