[w3m-dev 02700] search refactoring

From: Fumitoshi UKAI  <ukai@debian.or.jp>
This commit is contained in:
Fumitoshi UKAI
2001-12-23 14:44:00 +00:00
parent 3710eaebe0
commit ad72e6e164
4 changed files with 91 additions and 87 deletions
+15 -1
View File
@@ -1,3 +1,17 @@
2001-12-23 Fumitoshi UKAI <ukai@debian.or.jp>
* [w3m-dev 02700] search refactoring
* based on http://www.nmn.jp/~hidai/software/w3m/
* fm.h: add SR_* constants, result value for search
* main.c (srchcore): added
* main.c (disp_srchresult): added
* main.c (srch): added
* main.c (srchfor): use srch()
* main.c (srchbak): use srch()
* main.c (srch_nxtprv): use srchcore() & disp_srch_result()
* search.c (forwardSearch): return SR_* result value
* search.c (backwardSearch): ditto
2001-12-23 Fumitoshi UKAI <ukai@debian.or.jp> 2001-12-23 Fumitoshi UKAI <ukai@debian.or.jp>
* [w3m-dev 02699] initialization too late * [w3m-dev 02699] initialization too late
@@ -1443,4 +1457,4 @@
* release-0-2-1 * release-0-2-1
* import w3m-0.2.1 * import w3m-0.2.1
$Id: ChangeLog,v 1.162 2001/12/23 14:24:22 ukai Exp $ $Id: ChangeLog,v 1.163 2001/12/23 14:44:00 ukai Exp $
+6 -1
View File
@@ -1,4 +1,4 @@
/* $Id: fm.h,v 1.29 2001/12/14 17:35:08 ukai Exp $ */ /* $Id: fm.h,v 1.30 2001/12/23 14:44:00 ukai Exp $ */
/* /*
* w3m: WWW wo Miru utility * w3m: WWW wo Miru utility
* *
@@ -184,6 +184,11 @@ void bzero(void *, int);
#define LB_N_SOURCE LB_SOURCE #define LB_N_SOURCE LB_SOURCE
#define MAX_LB 5 #define MAX_LB 5
/* Search Result */
#define SR_FOUND 0x1
#define SR_NOTFOUND 0x2
#define SR_WRAPPED 0x4
#ifdef MAINPROGRAM #ifdef MAINPROGRAM
int REV_LB[MAX_LB] = { int REV_LB[MAX_LB] = {
LB_N_FRAME, LB_FRAME, LB_N_INFO, LB_INFO, LB_N_SOURCE, LB_N_FRAME, LB_FRAME, LB_N_INFO, LB_INFO, LB_N_SOURCE,
+59 -70
View File
@@ -1,4 +1,4 @@
/* $Id: main.c,v 1.41 2001/12/23 14:24:22 ukai Exp $ */ /* $Id: main.c,v 1.42 2001/12/23 14:44:00 ukai Exp $ */
#define MAINPROGRAM #define MAINPROGRAM
#include "fm.h" #include "fm.h"
#include <signal.h> #include <signal.h>
@@ -1308,78 +1308,82 @@ rdrwSc(void)
displayBuffer(Currentbuf, B_FORCE_REDRAW); displayBuffer(Currentbuf, B_FORCE_REDRAW);
} }
/* Search regular expression forward */ /* search by regular expression */
void static int
srchfor(void) srchcore(char *str, int (*func) (Buffer *, char *))
{ {
MySignalHandler(*prevtrap) (); MySignalHandler(*prevtrap) ();
char *str; volatile int i, result = SR_NOTFOUND;
int i, n = searchKeyNum();
volatile int wrapped = 0; if (str != NULL && str != SearchString)
SearchString = str;
if (SearchString == NULL || *SearchString == '\0')
return SR_NOTFOUND;
str = inputStrHist("Forward: ", NULL, TextHist);
if (str != NULL && *str == '\0')
str = SearchString;
if (str == NULL || *str == '\0') {
displayBuffer(Currentbuf, B_NORMAL);
return;
}
SearchString = str;
prevtrap = signal(SIGINT, intTrap); prevtrap = signal(SIGINT, intTrap);
crmode(); crmode();
if (SETJMP(IntReturn) == 0) if (SETJMP(IntReturn) == 0)
for (i = 0; i < n; i++) for (i = 0; i < PREC_NUM; i++)
wrapped = forwardSearch(Currentbuf, SearchString); result = func(Currentbuf, SearchString);
signal(SIGINT, prevtrap); signal(SIGINT, prevtrap);
term_raw(); term_raw();
displayBuffer(Currentbuf, B_NORMAL); displayBuffer(Currentbuf, B_NORMAL);
onA(); onA();
if (wrapped) { return result;
disp_message("Search wrapped", FALSE); }
}
searchRoutine = forwardSearch; 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, FALSE);
else if (result & SR_WRAPPED)
disp_message(Sprintf("Search wrapped: %s", str)->ptr, FALSE);
else if (show_srch_str)
disp_message(Sprintf("%s%s", prompt, str)->ptr, FALSE);
}
void
srch(int (*func) (Buffer *, char *), char *prompt)
{
char *str;
int result;
str = inputStrHist(prompt, NULL, TextHist);
if (str != NULL && *str == '\0')
str = SearchString;
if (str == NULL)
return;
result = srchcore(str, func);
disp_srchresult(result, prompt, str);
searchRoutine = func;
}
/* Search regular expression forward */
void
srchfor(void)
{
srch(forwardSearch, "Forward: ");
} }
/* Search regular expression backward */ /* Search regular expression backward */
void void
srchbak(void) srchbak(void)
{ {
MySignalHandler(*prevtrap) (); srch(backwardSearch, "Backward: ");
char *str;
int i, n = searchKeyNum();
volatile int wrapped = 0;
str = inputStrHist("Backward: ", NULL, TextHist);
if (str != NULL && *str == '\0')
str = SearchString;
if (str == NULL || *str == '\0') {
displayBuffer(Currentbuf, B_NORMAL);
return;
}
SearchString = str;
prevtrap = signal(SIGINT, intTrap);
crmode();
if (SETJMP(IntReturn) == 0)
for (i = 0; i < n; i++)
wrapped = backwardSearch(Currentbuf, SearchString);
signal(SIGINT, prevtrap);
term_raw();
displayBuffer(Currentbuf, B_NORMAL);
onA();
if (wrapped) {
disp_message("Search wrapped", FALSE);
}
searchRoutine = backwardSearch;
} }
static void static void
srch_nxtprv(volatile int reverse) srch_nxtprv(int reverse)
{ {
int i; int result;
volatile int wrapped = 0; /* *INDENT-OFF* */
static int (*routine[2]) (Buffer *, char *) = { static int (*routine[2]) (Buffer *, char *) = {
forwardSearch, backwardSearch}; forwardSearch, backwardSearch
MySignalHandler(*prevtrap) (); };
/* *INDENT-ON* */
if (searchRoutine == NULL) { if (searchRoutine == NULL) {
disp_message("No previous regular expression", TRUE); disp_message("No previous regular expression", TRUE);
@@ -1389,24 +1393,9 @@ srch_nxtprv(volatile int reverse)
reverse = 1; reverse = 1;
if (searchRoutine == backwardSearch) if (searchRoutine == backwardSearch)
reverse ^= 1; reverse ^= 1;
prevtrap = signal(SIGINT, intTrap); result = srchcore(SearchString, routine[reverse]);
crmode(); disp_srchresult(result, (reverse ? "Backward: " : "Forward: "),
if (SETJMP(IntReturn) == 0) SearchString);
for (i = 0; i < PREC_NUM; i++)
wrapped = (*routine[reverse]) (Currentbuf, SearchString);
signal(SIGINT, prevtrap);
term_raw();
displayBuffer(Currentbuf, B_NORMAL);
onA();
if (wrapped) {
disp_message("Search wrapped", FALSE);
}
else if (show_srch_str) {
disp_message(Sprintf("%s%s",
routine[reverse] ==
forwardSearch ? "Forward: " : "Backward: ",
SearchString)->ptr, FALSE);
}
} }
/* Search next matching */ /* Search next matching */
+11 -15
View File
@@ -1,4 +1,4 @@
/* $Id: search.c,v 1.4 2001/11/24 02:01:26 ukai Exp $ */ /* $Id: search.c,v 1.5 2001/12/23 14:44:00 ukai Exp $ */
#include "fm.h" #include "fm.h"
#include "regex.h" #include "regex.h"
@@ -12,12 +12,11 @@ forwardSearch(Buffer *buf, char *str)
if ((p = regexCompile(str, IgnoreCase)) != NULL) { if ((p = regexCompile(str, IgnoreCase)) != NULL) {
message(p, 0, 0); message(p, 0, 0);
return FALSE; return SR_NOTFOUND;
} }
l = begin = buf->currentLine; l = begin = buf->currentLine;
if (l == NULL) { if (l == NULL) {
disp_message("Not found", FALSE); return SR_NOTFOUND;
return FALSE;
} }
pos = buf->pos + 1; pos = buf->pos + 1;
#ifdef JP_CHARSET #ifdef JP_CHARSET
@@ -28,7 +27,7 @@ forwardSearch(Buffer *buf, char *str)
matchedPosition(&first, &last); matchedPosition(&first, &last);
buf->pos = first - l->lineBuf; buf->pos = first - l->lineBuf;
arrangeCursor(buf); arrangeCursor(buf);
return FALSE; return SR_FOUND;
} }
for (l = l->next;; l = l->next) { for (l = l->next;; l = l->next) {
if (l == NULL) { if (l == NULL) {
@@ -61,13 +60,12 @@ forwardSearch(Buffer *buf, char *str)
buf->currentLine = l; buf->currentLine = l;
gotoLine(buf, l->linenumber); gotoLine(buf, l->linenumber);
arrangeCursor(buf); arrangeCursor(buf);
return wrapped; return SR_FOUND | (wrapped ? SR_WRAPPED : 0);
} }
if (wrapped && l == begin) /* no match */ if (wrapped && l == begin) /* no match */
break; break;
} }
disp_message("Not found", FALSE); return SR_NOTFOUND;
return FALSE;
} }
int int
@@ -80,12 +78,11 @@ backwardSearch(Buffer *buf, char *str)
if ((p = regexCompile(str, IgnoreCase)) != NULL) { if ((p = regexCompile(str, IgnoreCase)) != NULL) {
message(p, 0, 0); message(p, 0, 0);
return FALSE; return SR_NOTFOUND;
} }
l = begin = buf->currentLine; l = begin = buf->currentLine;
if (l == NULL) { if (l == NULL) {
disp_message("Not found", FALSE); return SR_NOTFOUND;
return FALSE;
} }
if (buf->pos > 0) { if (buf->pos > 0) {
pos = buf->pos - 1; pos = buf->pos - 1;
@@ -112,7 +109,7 @@ backwardSearch(Buffer *buf, char *str)
if (found) { if (found) {
buf->pos = found - l->lineBuf; buf->pos = found - l->lineBuf;
arrangeCursor(buf); arrangeCursor(buf);
return FALSE; return SR_FOUND;
} }
} }
for (l = l->prev;; l = l->prev) { for (l = l->prev;; l = l->prev) {
@@ -146,11 +143,10 @@ backwardSearch(Buffer *buf, char *str)
buf->currentLine = l; buf->currentLine = l;
gotoLine(buf, l->linenumber); gotoLine(buf, l->linenumber);
arrangeCursor(buf); arrangeCursor(buf);
return wrapped; return SR_FOUND | (wrapped ? SR_WRAPPED : 0);
} }
if (wrapped && l == begin) /* no match */ if (wrapped && l == begin) /* no match */
break; break;
} }
disp_message("Not found", FALSE); return SR_NOTFOUND;
return FALSE;
} }