[w3m-dev 02700] search refactoring
From: Fumitoshi UKAI <ukai@debian.or.jp>
This commit is contained in:
@@ -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 $
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user