diff options
-rw-r--r-- | ChangeLog | 16 | ||||
-rw-r--r-- | fm.h | 7 | ||||
-rw-r--r-- | main.c | 123 | ||||
-rw-r--r-- | search.c | 26 |
4 files changed, 88 insertions, 84 deletions
@@ -1,5 +1,19 @@ 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> + * [w3m-dev 02699] initialization too late * main.c (MAIN): initializations moved before arg processing * debian bug closes: Bug##102445: ignores SIGWINCH while downloading @@ -1443,4 +1457,4 @@ * release-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 $ @@ -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 * @@ -184,6 +184,11 @@ void bzero(void *, int); #define LB_N_SOURCE LB_SOURCE #define MAX_LB 5 +/* Search Result */ +#define SR_FOUND 0x1 +#define SR_NOTFOUND 0x2 +#define SR_WRAPPED 0x4 + #ifdef MAINPROGRAM int REV_LB[MAX_LB] = { LB_N_FRAME, LB_FRAME, LB_N_INFO, LB_INFO, LB_N_SOURCE, @@ -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 #include "fm.h" #include <signal.h> @@ -1308,78 +1308,82 @@ rdrwSc(void) displayBuffer(Currentbuf, B_FORCE_REDRAW); } -/* Search regular expression forward */ -void -srchfor(void) +/* search by regular expression */ +static int +srchcore(char *str, int (*func) (Buffer *, char *)) { MySignalHandler(*prevtrap) (); - char *str; - int i, n = searchKeyNum(); - volatile int wrapped = 0; + volatile int i, result = SR_NOTFOUND; + + 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); crmode(); if (SETJMP(IntReturn) == 0) - for (i = 0; i < n; i++) - wrapped = forwardSearch(Currentbuf, SearchString); + for (i = 0; i < PREC_NUM; i++) + result = func(Currentbuf, SearchString); signal(SIGINT, prevtrap); term_raw(); displayBuffer(Currentbuf, B_NORMAL); onA(); - if (wrapped) { - disp_message("Search wrapped", FALSE); - } - searchRoutine = forwardSearch; + return result; } -/* Search regular expression backward */ void -srchbak(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) { - MySignalHandler(*prevtrap) (); char *str; - int i, n = searchKeyNum(); - volatile int wrapped = 0; + int result; - str = inputStrHist("Backward: ", NULL, TextHist); + str = inputStrHist(prompt, NULL, TextHist); if (str != NULL && *str == '\0') str = SearchString; - if (str == NULL || *str == '\0') { - displayBuffer(Currentbuf, B_NORMAL); + if (str == NULL) 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; + 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 */ +void +srchbak(void) +{ + srch(backwardSearch, "Backward: "); } static void -srch_nxtprv(volatile int reverse) +srch_nxtprv(int reverse) { - int i; - volatile int wrapped = 0; + int result; + /* *INDENT-OFF* */ static int (*routine[2]) (Buffer *, char *) = { - forwardSearch, backwardSearch}; - MySignalHandler(*prevtrap) (); + forwardSearch, backwardSearch + }; + /* *INDENT-ON* */ if (searchRoutine == NULL) { disp_message("No previous regular expression", TRUE); @@ -1389,24 +1393,9 @@ srch_nxtprv(volatile int reverse) reverse = 1; if (searchRoutine == backwardSearch) reverse ^= 1; - prevtrap = signal(SIGINT, intTrap); - crmode(); - if (SETJMP(IntReturn) == 0) - 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); - } + result = srchcore(SearchString, routine[reverse]); + disp_srchresult(result, (reverse ? "Backward: " : "Forward: "), + SearchString); } /* Search next matching */ @@ -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 "regex.h" @@ -12,12 +12,11 @@ forwardSearch(Buffer *buf, char *str) if ((p = regexCompile(str, IgnoreCase)) != NULL) { message(p, 0, 0); - return FALSE; + return SR_NOTFOUND; } l = begin = buf->currentLine; if (l == NULL) { - disp_message("Not found", FALSE); - return FALSE; + return SR_NOTFOUND; } pos = buf->pos + 1; #ifdef JP_CHARSET @@ -28,7 +27,7 @@ forwardSearch(Buffer *buf, char *str) matchedPosition(&first, &last); buf->pos = first - l->lineBuf; arrangeCursor(buf); - return FALSE; + return SR_FOUND; } for (l = l->next;; l = l->next) { if (l == NULL) { @@ -61,13 +60,12 @@ forwardSearch(Buffer *buf, char *str) buf->currentLine = l; gotoLine(buf, l->linenumber); arrangeCursor(buf); - return wrapped; + return SR_FOUND | (wrapped ? SR_WRAPPED : 0); } if (wrapped && l == begin) /* no match */ break; } - disp_message("Not found", FALSE); - return FALSE; + return SR_NOTFOUND; } int @@ -80,12 +78,11 @@ backwardSearch(Buffer *buf, char *str) if ((p = regexCompile(str, IgnoreCase)) != NULL) { message(p, 0, 0); - return FALSE; + return SR_NOTFOUND; } l = begin = buf->currentLine; if (l == NULL) { - disp_message("Not found", FALSE); - return FALSE; + return SR_NOTFOUND; } if (buf->pos > 0) { pos = buf->pos - 1; @@ -112,7 +109,7 @@ backwardSearch(Buffer *buf, char *str) if (found) { buf->pos = found - l->lineBuf; arrangeCursor(buf); - return FALSE; + return SR_FOUND; } } for (l = l->prev;; l = l->prev) { @@ -146,11 +143,10 @@ backwardSearch(Buffer *buf, char *str) buf->currentLine = l; gotoLine(buf, l->linenumber); arrangeCursor(buf); - return wrapped; + return SR_FOUND | (wrapped ? SR_WRAPPED : 0); } if (wrapped && l == begin) /* no match */ break; } - disp_message("Not found", FALSE); - return FALSE; + return SR_NOTFOUND; } |