aboutsummaryrefslogtreecommitdiffstats
path: root/search.c
diff options
context:
space:
mode:
authorFumitoshi UKAI <ukai@debian.or.jp>2003-01-23 18:37:18 +0000
committerFumitoshi UKAI <ukai@debian.or.jp>2003-01-23 18:37:18 +0000
commit61c2c2de18d3ef19c321bac335043424c862aba7 (patch)
tree52b5d72b1c3298f7e12b72daabfff2b37eb37680 /search.c
parent* etc.c (next_status): after = is R_ST_VALUE (diff)
downloadw3m-61c2c2de18d3ef19c321bac335043424c862aba7.tar.gz
w3m-61c2c2de18d3ef19c321bac335043424c862aba7.zip
[w3m-dev 03667] fold patch
* anchor.c (reAnchorPos): rewrite (reAnchorWord): delete reseq_anchor() (reAnchorAny): use l->size delete reseq_anchor() * backend.c (internal_get): pass TRUE to saveBuffer * buffer.c (newBuffer): delete n->linelen (reshapeBuffer): rewrite * display.c (displayBuffer): FoldLine (redrawLine): l->bpos (cursorUp0): added (cursorUp): rewrite (cursorDown0): added (cursowDown): rewrite (cursorRight): check l->next l->bwidth (cursorLeft): l->prev && l->bpos l->bwidth (arrangeCursor): buf->currentLine->bwidth buf->cursorX * etc.c (checkType): **oporp rewrite (calcPosition): realColumn allocated by New_reuse * file.c (addnewline): add nlines arg (propBuffer): deleted (colorBuffer): deleted (readHeader): propBuffer FOLD_BUFFER_WIDTH (HTMLlineproc2body): rewrite (addnewline2): added (addnewline): rewrite (loadBuffer): propBuffer, colorBuffer (saveBuffer): cont arg (getNextPage): rewrite * fm.h (LINELEN): 256 (FNLEN): deleted (Line): add size, bpos, bwidth (Buffer): delete linelen (INIT_BUFFER_WIDTH): check showLineNum (FOLD_BUFFER_WIDTH): added (FoldLine): added * funcname.tab (RESHAPE): added * main.c (do_dump): pass FALSE to saveBuffer (nscroll): rewrite (clear_mark): l->size (shiftvisualpos): rewrite (pipeBuf): pass TRUE to saveBuffer (linebeg): check line->prev && line->bpos (linend): check line->next, line->next->bpos (editScr): pass TRUE to saveBuffer (svBuf): pass TRUE to saveBuffer (vmSrc): pass TRUE to saveBuffer (reshape): added (curlno): rewrite * mimehead.c (LINELEN): deleted * proto.h (reshape): added (saveBuffer): add cont arg (cursorUp0): added (cursorDown0): added (checkType): change type oprop, ocolor, delete check_color, len * rc.c (CMT_FOLD_LINE): added (params1): add fold_line (sync_with_option): check PagerMax * search.c (set_mark): l->size (forwardSearch): rewrite (backwardSearch): rewrite * doc/README.func (RESHAPE): added * doc-jp/README.func (RESHAPE): added * scripts/w3mhelp.cgi.in (Buffer operation): add reshape From: Hironori SAKAMOTO <hsaka@mth.biglobe.ne.jp>
Diffstat (limited to '')
-rw-r--r--search.c76
1 files changed, 57 insertions, 19 deletions
diff --git a/search.c b/search.c
index e671f85..612b83e 100644
--- a/search.c
+++ b/search.c
@@ -1,4 +1,4 @@
-/* $Id: search.c,v 1.25 2003/01/22 16:10:29 ukai Exp $ */
+/* $Id: search.c,v 1.26 2003/01/23 18:37:21 ukai Exp $ */
#include "fm.h"
#include "regex.h"
#include <signal.h>
@@ -8,7 +8,7 @@
static void
set_mark(Line *l, int pos, int epos)
{
- for (; pos < epos && pos < l->len; pos++)
+ for (; pos < epos && pos < l->size; pos++)
l->propBuf[pos] |= PE_MARK;
}
@@ -103,20 +103,33 @@ forwardSearch(Buffer *buf, char *str)
message(p, 0, 0);
return SR_NOTFOUND;
}
- l = begin = buf->currentLine;
+ l = buf->currentLine;
if (l == NULL) {
return SR_NOTFOUND;
}
pos = buf->pos + 1;
+ if (l->bpos) {
+ pos += l->bpos;
+ while (l->bpos && l->prev)
+ l = l->prev;
+ }
+ begin = l;
#ifdef JP_CHARSET
if (l->propBuf[pos] & PC_KANJI2)
pos++;
#endif
- if (pos < l->len && regexMatch(&l->lineBuf[pos], l->len - pos, 0) == 1) {
+ if (pos < l->size && regexMatch(&l->lineBuf[pos], l->size - pos, 0) == 1) {
matchedPosition(&first, &last);
- buf->pos = first - l->lineBuf;
+ pos = first - l->lineBuf;
+ while (pos >= l->len) {
+ pos -= l->len;
+ l = l->next;
+ }
+ buf->pos = pos;
+ if (l != buf->currentLine)
+ gotoLine(buf, l->linenumber);
arrangeCursor(buf);
- set_mark(l, buf->pos, last - l->lineBuf);
+ set_mark(l, pos, pos + last - first);
return SR_FOUND;
}
for (l = l->next;; l = l->next) {
@@ -141,16 +154,23 @@ forwardSearch(Buffer *buf, char *str)
break;
}
}
- if (regexMatch(l->lineBuf, l->len, 1) == 1) {
+ if (l->bpos)
+ continue;
+ if (regexMatch(l->lineBuf, l->size, 1) == 1) {
matchedPosition(&first, &last);
if (wrapped && l == begin && buf->pos == first - l->lineBuf)
/* exactly same match */
break;
- buf->pos = first - l->lineBuf;
+ pos = first - l->lineBuf;
+ while (pos >= l->len) {
+ pos -= l->len;
+ l = l->next;
+ }
+ buf->pos = pos;
buf->currentLine = l;
gotoLine(buf, l->linenumber);
arrangeCursor(buf);
- set_mark(l, buf->pos, last - l->lineBuf);
+ set_mark(l, pos, pos + last - first);
return SR_FOUND | (wrapped ? SR_WRAPPED : 0);
}
if (wrapped && l == begin) /* no match */
@@ -181,12 +201,19 @@ backwardSearch(Buffer *buf, char *str)
message(p, 0, 0);
return SR_NOTFOUND;
}
- l = begin = buf->currentLine;
+ l = buf->currentLine;
if (l == NULL) {
return SR_NOTFOUND;
}
- if (buf->pos > 0) {
- pos = buf->pos - 1;
+ pos = buf->pos;
+ if (l->bpos) {
+ pos += l->bpos;
+ while (l->bpos && l->prev)
+ l = l->prev;
+ }
+ begin = l;
+ if (pos > 0) {
+ pos--;
#ifdef JP_CHARSET
if (l->propBuf[pos] & PC_KANJI2)
pos--;
@@ -195,7 +222,7 @@ backwardSearch(Buffer *buf, char *str)
found = NULL;
found_last = NULL;
q = l->lineBuf;
- while (regexMatch(q, &l->lineBuf[l->len] - q, q == l->lineBuf) == 1) {
+ while (regexMatch(q, &l->lineBuf[l->size] - q, q == l->lineBuf) == 1) {
matchedPosition(&first, &last);
if (first <= p) {
found = first;
@@ -211,9 +238,16 @@ backwardSearch(Buffer *buf, char *str)
break;
}
if (found) {
- buf->pos = found - l->lineBuf;
+ pos = found - l->lineBuf;
+ while (pos >= l->len) {
+ pos -= l->len;
+ l = l->next;
+ }
+ buf->pos = pos;
+ if (l != buf->currentLine)
+ gotoLine(buf, l->linenumber);
arrangeCursor(buf);
- set_mark(l, buf->pos, found_last - l->lineBuf);
+ set_mark(l, pos, pos + found_last - found);
return SR_FOUND;
}
}
@@ -230,7 +264,7 @@ backwardSearch(Buffer *buf, char *str)
found = NULL;
found_last = NULL;
q = l->lineBuf;
- while (regexMatch(q, &l->lineBuf[l->len] - q, q == l->lineBuf) == 1) {
+ while (regexMatch(q, &l->lineBuf[l->size] - q, q == l->lineBuf) == 1) {
matchedPosition(&first, &last);
if (wrapped && l == begin && buf->pos == first - l->lineBuf)
/* exactly same match */
@@ -247,11 +281,15 @@ backwardSearch(Buffer *buf, char *str)
q++;
}
if (found) {
- buf->pos = found - l->lineBuf;
- buf->currentLine = l;
+ pos = found - l->lineBuf;
+ while (pos >= l->len) {
+ pos -= l->len;
+ l = l->next;
+ }
+ buf->pos = pos;
gotoLine(buf, l->linenumber);
arrangeCursor(buf);
- set_mark(l, buf->pos, found_last - l->lineBuf);
+ set_mark(l, pos, pos + found_last - found);
return SR_FOUND | (wrapped ? SR_WRAPPED : 0);
}
if (wrapped && l == begin) /* no match */