commit ca6e57e69edcffae7cd324f7b4f16c3b02b1251b
parent 5af6784ee134004c99c1670373bda6c271e52769
Author: ukai <ukai>
Date: Thu, 23 Jan 2003 18:37:18 +0000
[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:
17 files changed, 528 insertions(+), 220 deletions(-)
diff --git a/ChangeLog b/ChangeLog
@@ -1,5 +1,77 @@
2003-01-24 Hironori SAKAMOTO <hsaka@mth.biglobe.ne.jp>
+ * [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
+
+2003-01-24 Hironori SAKAMOTO <hsaka@mth.biglobe.ne.jp>
+
* etc.c (next_status): after = is R_ST_VALUE
R_ST_VALUE > => R_ST_NORMAL
R_ST_VALUE SP => R_ST_TAG
diff --git a/anchor.c b/anchor.c
@@ -294,7 +294,7 @@ reAnchorPos(Buffer *buf, Line *l, char *p1, char *p2,
{
Anchor *a;
int spos, epos;
- int i;
+ int i, hseq = -2;
spos = p1 - l->lineBuf;
epos = p2 - l->lineBuf;
@@ -302,12 +302,27 @@ reAnchorPos(Buffer *buf, Line *l, char *p1, char *p2,
if (l->propBuf[i] & (PE_ANCHOR | PE_FORM))
return p2;
}
- a = anchorproc(buf, p1, p2, l->linenumber, p1 - l->lineBuf);
- a->end.line = l->linenumber;
- a->end.pos = epos;
- a->hseq = -2;
- for (i = a->start.pos; i < a->end.pos; i++)
+ for (i = spos; i < epos; i++)
l->propBuf[i] |= PE_ANCHOR;
+ while (1) {
+ a = anchorproc(buf, p1, p2, l->linenumber, spos);
+ a->hseq = hseq;
+ if (hseq == -2) {
+ reseq_anchor(buf);
+ hseq = a->hseq;
+ }
+ a->end.line = l->linenumber;
+ if (epos > l->len) {
+ a->end.pos = l->len;
+ spos = 0;
+ epos -= l->len;
+ l = l->next;
+ }
+ else {
+ a->end.pos = epos;
+ break;
+ }
+ }
return p2;
}
@@ -315,7 +330,6 @@ void
reAnchorWord(Buffer *buf, Line *l, int spos, int epos)
{
reAnchorPos(buf, l, &l->lineBuf[spos], &l->lineBuf[epos], _put_anchor_all);
- reseq_anchor(buf);
}
/* search regexp and register them as anchors */
@@ -338,7 +352,7 @@ reAnchorAny(Buffer *buf, char *re,
l = l->next) {
p = l->lineBuf;
for (;;) {
- if (regexMatch(p, &l->lineBuf[l->len] - p, p == l->lineBuf) == 1) {
+ if (regexMatch(p, &l->lineBuf[l->size] - p, p == l->lineBuf) == 1) {
matchedPosition(&p1, &p2);
p = reAnchorPos(buf, l, p1, p2, anchorproc);
}
@@ -346,7 +360,6 @@ reAnchorAny(Buffer *buf, char *re,
break;
}
}
- reseq_anchor(buf);
return NULL;
}
diff --git a/backend.c b/backend.c
@@ -148,7 +148,7 @@ internal_get(char *url, int flag, FormList *request)
}
print_headers(buf, len);
printf("\n");
- saveBuffer(buf, stdout);
+ saveBuffer(buf, stdout, TRUE);
}
else {
print_headers(buf, 0);
diff --git a/buffer.c b/buffer.c
@@ -40,7 +40,6 @@ newBuffer(int width)
n->bufferprop = BP_NORMAL;
n->clone = New(int);
*n->clone = 1;
- n->linelen = 0;
n->trbyte = 0;
#ifdef USE_SSL
n->ssl_certificate = NULL;
@@ -558,8 +557,19 @@ reshapeBuffer(Buffer *buf)
#endif
buf->height = LASTLINE + 1;
- if (buf->firstLine)
- restorePosition(buf, &sbuf);
+ if (buf->firstLine && sbuf.firstLine) {
+ int n;
+ gotoRealLine(buf, sbuf.currentLine->real_linenumber);
+ n = (buf->currentLine->linenumber - buf->topLine->linenumber)
+ - (sbuf.currentLine->linenumber - sbuf.topLine->linenumber);
+ if (n) {
+ buf->topLine = lineSkip(buf, buf->topLine, n, FALSE);
+ gotoRealLine(buf, sbuf.currentLine->real_linenumber);
+ }
+ buf->pos = sbuf.pos;
+ buf->currentColumn = sbuf.currentColumn;
+ arrangeCursor(buf);
+ }
if (buf->check_url & CHK_URL)
chkURLBuffer(buf);
#ifdef USE_NNTP
diff --git a/display.c b/display.c
@@ -363,8 +363,8 @@ displayBuffer(Buffer *buf, int mode)
buf->width = COLS;
if (buf->height == 0)
buf->height = LASTLINE + 1;
- if ((buf->width != INIT_BUFFER_WIDTH && buf->type &&
- !strcmp(buf->type, "text/html")) || buf->need_reshape) {
+ if ((buf->width != INIT_BUFFER_WIDTH && (buf->type &&
+ !strcmp(buf->type, "text/html") || FoldLine)) || buf->need_reshape) {
buf->need_reshape = TRUE;
reshapeBuffer(buf);
}
@@ -679,7 +679,7 @@ redrawLine(Buffer *buf, Line *l, int i)
buf->rootX = COLS;
buf->COLS = COLS - buf->rootX;
}
- if (l->real_linenumber)
+ if (l->real_linenumber && !l->bpos)
sprintf(tmp, "%*ld:", buf->rootX - 1, l->real_linenumber);
else
sprintf(tmp, "%*s ", buf->rootX - 1, "");
@@ -1233,10 +1233,8 @@ set_delayed_message(char *s)
}
void
-cursorUp(Buffer *buf, int n)
+cursorUp0(Buffer *buf, int n)
{
- if (buf->firstLine == NULL)
- return;
if (buf->cursorY > 0)
cursorUpDown(buf, -1);
else {
@@ -1248,10 +1246,28 @@ cursorUp(Buffer *buf, int n)
}
void
-cursorDown(Buffer *buf, int n)
+cursorUp(Buffer *buf, int n)
{
+ Line *l = buf->currentLine;
if (buf->firstLine == NULL)
return;
+ while (buf->currentLine->prev && buf->currentLine->bpos)
+ cursorUp0(buf, n);
+ if (buf->currentLine == buf->firstLine) {
+ gotoLine(buf, l->linenumber);
+ arrangeLine(buf);
+ return;
+ }
+ cursorUp0(buf, n);
+ while (buf->currentLine->prev && buf->currentLine->bpos &&
+ buf->currentLine->bwidth >=
+ buf->currentColumn + buf->visualpos)
+ cursorUp0(buf, n);
+}
+
+void
+cursorDown0(Buffer *buf, int n)
+{
if (buf->cursorY < buf->LINES - 1)
cursorUpDown(buf, 1);
else {
@@ -1263,6 +1279,26 @@ cursorDown(Buffer *buf, int n)
}
void
+cursorDown(Buffer *buf, int n)
+{
+ Line *l = buf->currentLine;
+ if (buf->firstLine == NULL)
+ return;
+ while (buf->currentLine->next && buf->currentLine->next->bpos)
+ cursorDown0(buf, n);
+ if (buf->currentLine == buf->lastLine) {
+ gotoLine(buf, l->linenumber);
+ arrangeLine(buf);
+ return;
+ }
+ cursorDown0(buf, n);
+ while (buf->currentLine->next && buf->currentLine->next->bpos &&
+ buf->currentLine->bwidth + buf->currentLine->width <
+ buf->currentColumn + buf->visualpos)
+ cursorDown0(buf, n);
+}
+
+void
cursorUpDown(Buffer *buf, int n)
{
Line *cl = buf->currentLine;
@@ -1283,7 +1319,7 @@ cursorRight(Buffer *buf, int n)
if (buf->firstLine == NULL)
return;
- if (buf->pos == l->len)
+ if (buf->pos == l->len && !(l->next && l->next->bpos))
return;
i = buf->pos;
p = l->propBuf;
@@ -1297,6 +1333,12 @@ cursorRight(Buffer *buf, int n)
else if (l->len == 0) {
buf->pos = 0;
}
+ else if (l->next && l->next->bpos) {
+ cursorDown0(buf, 1);
+ buf->pos = 0;
+ arrangeCursor(buf);
+ return;
+ }
else {
buf->pos = l->len - 1;
#ifdef JP_CHARSET
@@ -1305,7 +1347,7 @@ cursorRight(Buffer *buf, int n)
#endif /* JP_CHARSET */
}
cpos = COLPOS(l, buf->pos);
- buf->visualpos = cpos - buf->currentColumn;
+ buf->visualpos = l->bwidth + cpos - buf->currentColumn;
delta = 1;
#ifdef JP_CHARSET
if (CharType(p[buf->pos]) == PC_KANJI1)
@@ -1314,9 +1356,9 @@ cursorRight(Buffer *buf, int n)
vpos2 = COLPOS(l, buf->pos + delta) - buf->currentColumn - 1;
if (vpos2 >= buf->COLS && n) {
columnSkip(buf, n + (vpos2 - buf->COLS) - (vpos2 - buf->COLS) % n);
- buf->visualpos = cpos - buf->currentColumn;
+ buf->visualpos = l->bwidth + cpos - buf->currentColumn;
}
- buf->cursorX = buf->visualpos;
+ buf->cursorX = buf->visualpos - l->bwidth;
}
void
@@ -1334,17 +1376,23 @@ cursorLeft(Buffer *buf, int n)
if (i >= 2 && CharType(p[i - 1]) == PC_KANJI2)
delta = 2;
#endif /* JP_CHARSET */
- if (i > delta)
+ if (i >= delta)
buf->pos = i - delta;
+ else if (l->prev && l->bpos) {
+ cursorUp0(buf, -1);
+ buf->pos = buf->currentLine->len - 1;
+ arrangeCursor(buf);
+ return;
+ }
else
buf->pos = 0;
cpos = COLPOS(l, buf->pos);
- buf->visualpos = cpos - buf->currentColumn;
- if (buf->visualpos < 0 && n) {
- columnSkip(buf, -n + buf->visualpos - buf->visualpos % n);
- buf->visualpos = cpos - buf->currentColumn;
+ buf->visualpos = l->bwidth + cpos - buf->currentColumn;
+ if (buf->visualpos - l->bwidth < 0 && n) {
+ columnSkip(buf, -n + buf->visualpos - l->bwidth - (buf->visualpos - l->bwidth) % n);
+ buf->visualpos = l->bwidth + cpos - buf->currentColumn;
}
- buf->cursorX = buf->visualpos;
+ buf->cursorX = buf->visualpos - l->bwidth;
}
void
@@ -1396,8 +1444,9 @@ arrangeCursor(Buffer *buf)
}
/* Arrange cursor */
buf->cursorY = buf->currentLine->linenumber - buf->topLine->linenumber;
- buf->visualpos = buf->cursorX =
+ buf->visualpos = buf->currentLine->bwidth +
COLPOS(buf->currentLine, buf->pos) - buf->currentColumn;
+ buf->cursorX = buf->visualpos - buf->currentLine->bwidth;
#ifdef DISPLAY_DEBUG
fprintf(stderr,
"arrangeCursor: column=%d, cursorX=%d, visualpos=%d, pos=%d, len=%d\n",
@@ -1414,7 +1463,8 @@ arrangeLine(Buffer *buf)
if (buf->firstLine == NULL)
return;
buf->cursorY = buf->currentLine->linenumber - buf->topLine->linenumber;
- i = columnPos(buf->currentLine, buf->currentColumn + buf->visualpos);
+ i = columnPos(buf->currentLine, buf->currentColumn + buf->visualpos
+ - buf->currentLine->bwidth);
cpos = COLPOS(buf->currentLine, i) - buf->currentColumn;
if (cpos >= 0) {
buf->cursorX = cpos;
diff --git a/doc-jp/README.func b/doc-jp/README.func
@@ -102,6 +102,7 @@ REDRAW
REG_MARK 正規表現で指定された文字列を全てマークします
REINIT 設定ファイルを再読込します。
RELOAD バッファを再度読み込みます
+RESHAPE 再レンダリングする
RIGHT 画面全体を1文字右にずらします
SAVE 文書のソースをファイルに保存します
SAVE_IMAGE リンクが指す画像をファイルに保存します
diff --git a/doc/README.func b/doc/README.func
@@ -102,6 +102,7 @@ REDRAW Redraw screen
REG_MARK Set mark using regexp
REINIT Reload configuration files
RELOAD Reload buffer
+RESHAPE Re-render buffer
RIGHT Shift screen one column right
SAVE Save document source to file
SAVE_IMAGE Save image to file
diff --git a/etc.c b/etc.c
@@ -236,50 +236,62 @@ parse_ansi_color(char **str, Lineprop *effect, Linecolor *color)
*/
Str
-checkType(Str s, Lineprop *oprop,
+checkType(Str s, Lineprop **oprop
#ifdef USE_ANSI_COLOR
- Linecolor *ocolor, int *check_color,
+ , Linecolor **ocolor
#endif
- int len)
+ )
{
Lineprop mode;
Lineprop effect = PE_NORMAL;
- Lineprop *prop = oprop;
+ Lineprop *prop;
+ static Lineprop *prop_buffer = NULL;
+ static int prop_size = 0;
char *str = s->ptr, *endp = &s->ptr[s->length], *bs = NULL;
#ifdef USE_ANSI_COLOR
Lineprop ceffect = PE_NORMAL;
Linecolor cmode = 0;
+ int check_color = FALSE;
Linecolor *color = NULL;
+ static Linecolor *color_buffer = NULL;
+ static int color_size = 0;
char *es = NULL;
#endif
int do_copy = FALSE;
- int size = (len < s->length) ? len : s->length;
-#ifdef USE_ANSI_COLOR
- if (check_color)
- *check_color = FALSE;
-#endif
+ if (prop_size < s->length) {
+ prop_size = (s->length > LINELEN) ? s->length : LINELEN;
+ prop_buffer = New_Reuse(Lineprop, prop_buffer, prop_size);
+ }
+ prop = prop_buffer;
+
if (ShowEffect) {
bs = memchr(str, '\b', s->length);
#ifdef USE_ANSI_COLOR
if (ocolor) {
es = memchr(str, ESC_CODE, s->length);
- if (es)
- color = ocolor;
+ if (es) {
+ if (color_size < s->length) {
+ color_size = (s->length > LINELEN) ? s->length : LINELEN;
+ color_buffer = New_Reuse(Linecolor, color_buffer,
+ color_size);
+ }
+ color = color_buffer;
+ }
}
#endif
- if (s->length > size || (bs != NULL)
+ if ((bs != NULL)
#ifdef USE_ANSI_COLOR
|| (es != NULL)
#endif
) {
- s = Strnew_size(size);
+ s = Strnew_size(s->length);
do_copy = TRUE;
}
}
while (str < endp) {
- if (prop - oprop >= len)
+ if (prop - prop_buffer >= prop_size)
break;
if (bs != NULL) {
if (str == bs - 2 && !strncmp(str, "__\b\b", 4)) {
@@ -410,7 +422,7 @@ checkType(Str s, Lineprop *oprop,
es = memchr(str, ESC_CODE, endp - str);
if (ok) {
if (cmode)
- *check_color = TRUE;
+ check_color = TRUE;
continue;
}
}
@@ -458,13 +470,19 @@ checkType(Str s, Lineprop *oprop,
}
effect = PE_NORMAL;
}
+ *oprop = prop_buffer;
+#ifdef USE_ANSI_COLOR
+ if (ocolor)
+ *ocolor = check_color ? color_buffer : NULL;
+#endif
return s;
}
int
calcPosition(char *l, Lineprop *pr, int len, int pos, int bpos, int mode)
{
- static short realColumn[LINELEN + 1];
+ static short *realColumn = NULL;
+ static int size = 0;
static char *prevl = NULL;
int i, j;
@@ -474,6 +492,10 @@ calcPosition(char *l, Lineprop *pr, int len, int pos, int bpos, int mode)
if (pos <= len)
return realColumn[pos];
}
+ if (size < len + 1) {
+ size = (len + 1 > LINELEN) ? (len + 1) : LINELEN;
+ realColumn = New_Reuse(short, realColumn, size);
+ }
prevl = l;
j = bpos;
for (i = 0;; i++) {
diff --git a/file.c b/file.c
@@ -39,14 +39,9 @@ static void addnewline(Buffer *buf, char *line, Lineprop *prop,
#ifdef USE_ANSI_COLOR
Linecolor *color,
#endif
- int pos, int nlines);
+ int pos, int width, int nlines);
static void addLink(Buffer *buf, struct parsed_tag *tag);
-static Lineprop propBuffer[LINELEN];
-#ifdef USE_ANSI_COLOR
-static Linecolor colorBuffer[LINELEN];
-#endif
-
static JMP_BUF AbortLoading;
static struct table *tables[MAX_TABLE];
@@ -594,6 +589,7 @@ readHeader(URLFile *uf, Buffer *newBuf, int thru, ParsedURL *pu)
char code;
char *tmpf;
FILE *src = NULL;
+ Lineprop *propBuffer;
headerlist = newBuf->document_header = newTextList();
if (uf->scheme == SCM_HTTP
@@ -658,18 +654,18 @@ readHeader(URLFile *uf, Buffer *newBuf, int thru, ParsedURL *pu)
tmp = Strnew_size(lineBuf2->length);
for (p = lineBuf2->ptr; *p; p = q) {
for (q = p; *q && *q != '\r' && *q != '\n'; q++) ;
- lineBuf2 = checkType(Strnew_charp_n(p, q - p), propBuffer,
+ lineBuf2 = checkType(Strnew_charp_n(p, q - p), &propBuffer
#ifdef USE_ANSI_COLOR
- NULL, NULL,
+ , NULL
#endif
- min(LINELEN, q - p));
+ );
Strcat(tmp, lineBuf2);
if (thru)
addnewline(newBuf, lineBuf2->ptr, propBuffer,
#ifdef USE_ANSI_COLOR
NULL,
#endif
- lineBuf2->length, -1);
+ lineBuf2->length, FOLD_BUFFER_WIDTH, -1);
for (; *q && (*q == '\r' || *q == '\n'); q++) ;
}
#ifdef USE_IMAGE
@@ -908,7 +904,7 @@ readHeader(URLFile *uf, Buffer *newBuf, int thru, ParsedURL *pu)
#ifdef USE_ANSI_COLOR
NULL,
#endif
- 0, -1);
+ 0, -1, -1);
if (src)
fclose(src);
}
@@ -4981,10 +4977,12 @@ textlist_feed()
static void
HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
{
+ static char *outc = NULL;
+ static Lineprop *outp = NULL;
+ static int out_size = 0;
Anchor *a_href = NULL, *a_img = NULL, *a_form = NULL;
- char outc[LINELEN];
char *p, *q, *r, *s, *t, *str;
- Lineprop outp[LINELEN], mode, effect;
+ Lineprop mode, effect;
int pos;
int nlines;
FILE *debug = NULL;
@@ -5004,6 +5002,12 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
Anchor **a_select = NULL;
#endif
+ if (out_size == 0) {
+ out_size = LINELEN;
+ outc = New_N(char, out_size);
+ outp = New_N(Lineprop, out_size);
+ }
+
n_textarea = -1;
if (!max_textarea) { /* halfload */
max_textarea = MAX_TEXTAREA;
@@ -5042,7 +5046,12 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
#endif
str = line->ptr;
endp = str + line->length;
- while (str < endp && pos < LINELEN) {
+ while (str < endp) {
+ if (out_size <= pos) {
+ out_size = pos * 3 / 2;
+ outc = New_N(char, out_size);
+ outp = New_N(Lineprop, out_size);
+ }
mode = get_mctype(str);
#ifndef KANJI_SYMBOLS
if (effect & PC_RULE && *str != '<') {
@@ -5539,7 +5548,7 @@ HTMLlineproc2body(Buffer *buf, Str (*feed) (), int llimit)
#ifdef USE_ANSI_COLOR
NULL,
#endif
- pos, nlines);
+ pos, -1, nlines);
if (internal == HTML_N_INTERNAL)
internal = 0;
if (str != endp) {
@@ -6048,7 +6057,7 @@ extern char *NullLine;
extern Lineprop NullProp[];
static void
-addnewline(Buffer *buf, char *line, Lineprop *prop,
+addnewline2(Buffer *buf, char *line, Lineprop *prop,
#ifdef USE_ANSI_COLOR
Linecolor *color,
#endif
@@ -6057,26 +6066,16 @@ addnewline(Buffer *buf, char *line, Lineprop *prop,
Line *l;
l = New(Line);
l->next = NULL;
- if (pos > 0) {
- l->lineBuf = allocStr(line, pos);
- l->propBuf = NewAtom_N(Lineprop, pos);
- bcopy((void *)prop, (void *)l->propBuf, pos * sizeof(Lineprop));
- }
- else {
- l->lineBuf = NullLine;
- l->propBuf = NullProp;
- }
+ l->lineBuf = line;
+ l->propBuf = prop;
#ifdef USE_ANSI_COLOR
- if (pos > 0 && color) {
- l->colorBuf = NewAtom_N(Linecolor, pos);
- bcopy((void *)color, (void *)l->colorBuf, pos * sizeof(Linecolor));
- }
- else {
- l->colorBuf = NULL;
- }
+ l->colorBuf = color;
#endif
l->len = pos;
l->width = -1;
+ l->size = pos;
+ l->bpos = 0;
+ l->bwidth = 0;
l->prev = buf->currentLine;
if (buf->currentLine) {
l->next = buf->currentLine->next;
@@ -6100,6 +6099,86 @@ addnewline(Buffer *buf, char *line, Lineprop *prop,
l = NULL;
}
+static void
+addnewline(Buffer *buf, char *line, Lineprop *prop,
+#ifdef USE_ANSI_COLOR
+ Linecolor *color,
+#endif
+ int pos, int width, int nlines)
+{
+ char *s;
+ Lineprop *p;
+#ifdef USE_ANSI_COLOR
+ Linecolor *c;
+#endif
+ Line *l;
+ int i, bpos, bwidth;
+
+ if (pos > 0) {
+ s = allocStr(line, pos);
+ p = NewAtom_N(Lineprop, pos);
+ bcopy((void *)prop, (void *)p, pos * sizeof(Lineprop));
+ }
+ else {
+ s = NullLine;
+ p = NullProp;
+ }
+#ifdef USE_ANSI_COLOR
+ if (pos > 0 && color) {
+ c = NewAtom_N(Linecolor, pos);
+ bcopy((void *)color, (void *)c, pos * sizeof(Linecolor));
+ }
+ else {
+ c = NULL;
+ }
+#endif
+ addnewline2(buf, s, p,
+#ifdef USE_ANSI_COLOR
+ c,
+#endif
+ pos, nlines);
+ if (pos <= 0 || width <= 0)
+ return;
+ bpos = 0;
+ bwidth = 0;
+ while (1) {
+ l = buf->currentLine;
+ l->width = COLPOS(l, l->len);
+ l->bpos = bpos;
+ l->bwidth = bwidth;
+ if (l->width <= width)
+ return;
+ i = columnPos(l, width);
+#ifdef JP_CHARSET
+ if (CharType(p[i]) == PC_KANJI2)
+ i--;
+#endif
+ if (i > 0 && COLPOS(l, i) > width) {
+ i--;
+#ifdef JP_CHARSET
+ if (CharType(p[i]) == PC_KANJI2)
+ i--;
+#endif
+ }
+ l->len = i;
+ l->width = COLPOS(l, l->len);
+ bpos += l->len;
+ bwidth += l->width;
+ s += i;
+ p += i;
+#ifdef USE_ANSI_COLOR
+ if (c)
+ c += i;
+#endif
+ pos -= i;
+ addnewline2(buf, s, p,
+#ifdef USE_ANSI_COLOR
+ c,
+#endif
+ pos, nlines);
+ }
+}
+
/*
* loadHTMLBuffer: read file and make new buffer
*/
@@ -6734,8 +6813,9 @@ loadBuffer(URLFile *uf, Buffer *volatile newBuf)
int nlines;
Str tmpf;
clen_t linelen = 0, trbyte = 0;
+ Lineprop *propBuffer = NULL;
#ifdef USE_ANSI_COLOR
- int check_color;
+ Linecolor *colorBuffer = NULL;
#endif
MySignalHandler(*volatile prevtrap) (SIGNAL_ARG) = NULL;
@@ -6801,16 +6881,16 @@ loadBuffer(URLFile *uf, Buffer *volatile newBuf)
}
++nlines;
Strchop(lineBuf2);
- lineBuf2 = checkType(lineBuf2, propBuffer,
+ lineBuf2 = checkType(lineBuf2, &propBuffer
#ifdef USE_ANSI_COLOR
- colorBuffer, &check_color,
+ , &colorBuffer
#endif
- LINELEN);
+ );
addnewline(newBuf, lineBuf2->ptr, propBuffer,
#ifdef USE_ANSI_COLOR
- check_color ? colorBuffer : NULL,
+ colorBuffer,
#endif
- lineBuf2->length, nlines);
+ lineBuf2->length, FOLD_BUFFER_WIDTH, nlines);
}
_end:
if (fmInitialized)
@@ -6927,7 +7007,7 @@ conv_rule(Line *l)
* saveBuffer: write buffer to file
*/
void
-saveBuffer(Buffer *buf, FILE * f)
+saveBuffer(Buffer *buf, FILE * f, int cont)
{
Line *l = buf->firstLine;
Str tmp;
@@ -6949,7 +7029,7 @@ saveBuffer(Buffer *buf, FILE * f)
tmp = Strnew_charp_n(l->lineBuf, l->len);
tmp = conv_str(tmp, InnerCode, DisplayCode);
Strfputs(tmp, f);
- if (Strlastchar(tmp) != '\n')
+ if (Strlastchar(tmp) != '\n' && !(cont && l->next && l->next->bpos))
putc('\n', f);
}
if (buf->pagerSource && !(buf->bufferprop & BP_CLOSE)) {
@@ -7112,17 +7192,17 @@ openGeneralPagerBuffer(InputStream stream)
Line *
getNextPage(Buffer *buf, int plen)
{
- Line *l, *fl, *pl = buf->lastLine;
- Line *rl = NULL;
- int len, i, nlines = 0;
- clen_t linelen = buf->linelen, trbyte = buf->trbyte;
+ Line *top = buf->topLine, *last = buf->lastLine, *cur = buf->currentLine;
+ int i, nlines = 0;
+ clen_t linelen = 0, trbyte = buf->trbyte;
Str lineBuf2;
char pre_lbuf = '\0';
URLFile uf;
char code;
- int squeeze_flag = 0;
+ int squeeze_flag = FALSE;
+ Lineprop *propBuffer = NULL;
#ifdef USE_ANSI_COLOR
- int check_color;
+ Linecolor *colorBuffer = NULL;
#endif
if (buf->pagerSource == NULL)
@@ -7130,11 +7210,12 @@ getNextPage(Buffer *buf, int plen)
if (fmInitialized)
crmode();
- if (pl != NULL) {
- nlines = pl->real_linenumber;
- pre_lbuf = *(pl->lineBuf);
+ if (last != NULL) {
+ nlines = last->real_linenumber;
+ pre_lbuf = *(last->lineBuf);
if (pre_lbuf == '\0')
pre_lbuf = '\n';
+ buf->currentLine = last;
}
#ifdef JP_CHARSET
@@ -7156,93 +7237,66 @@ getNextPage(Buffer *buf, int plen)
else if (getenv("MAN_PN") == NULL)
buf->buffername = CPIPEBUFFERNAME;
buf->bufferprop |= BP_CLOSE;
- trbyte += linelen;
- linelen = 0;
break;
}
linelen += lineBuf2->length;
showProgress(&linelen, &trbyte);
lineBuf2 = convertLine(&uf, lineBuf2, &code, PAGER_MODE);
if (squeezeBlankLine) {
- squeeze_flag = 0;
+ squeeze_flag = FALSE;
if (lineBuf2->ptr[0] == '\n' && pre_lbuf == '\n') {
++nlines;
--i;
- squeeze_flag = 1;
+ squeeze_flag = TRUE;
continue;
}
pre_lbuf = lineBuf2->ptr[0];
}
++nlines;
Strchop(lineBuf2);
- lineBuf2 = checkType(lineBuf2, propBuffer,
-#ifdef USE_ANSI_COLOR
- colorBuffer, &check_color,
-#endif
- LINELEN);
- len = lineBuf2->length;
- l = New(Line);
- l->lineBuf = lineBuf2->ptr;
- l->propBuf = NewAtom_N(Lineprop, len);
- bcopy((void *)propBuffer, (void *)l->propBuf, len * sizeof(Lineprop));
+ lineBuf2 = checkType(lineBuf2, &propBuffer
#ifdef USE_ANSI_COLOR
- if (check_color) {
- l->colorBuf = NewAtom_N(Linecolor, len);
- bcopy((void *)colorBuffer, (void *)l->colorBuf,
- len * sizeof(Linecolor));
- }
- else {
- l->colorBuf = NULL;
- }
-#endif
- l->len = len;
- l->width = -1;
- l->prev = pl;
-#if 0
- if (squeezeBlankLine) {
+ , &colorBuffer
#endif
- l->real_linenumber = nlines;
- l->linenumber = (pl == NULL ? nlines : pl->linenumber + 1);
-#if 0
- }
- else {
- l->real_linenumber = l->linenumber = nlines;
- }
+ );
+ addnewline(buf, lineBuf2->ptr, propBuffer,
+#ifdef USE_ANSI_COLOR
+ colorBuffer,
#endif
- if (pl == NULL) {
- pl = l;
- buf->firstLine = buf->topLine = buf->currentLine = l;
+ lineBuf2->length, FOLD_BUFFER_WIDTH, nlines);
+ if (!top) {
+ top = buf->firstLine;
+ cur = buf->currentLine;
+ }
+ if (buf->lastLine->real_linenumber - buf->firstLine->real_linenumber
+ >= PagerMax) {
+ Line *l = buf->firstLine;
+ do {
+ if (top == l)
+ top = l->next;
+ if (cur == l)
+ cur = l->next;
+ if (last == l)
+ last = NULL;
+ l = l->next;
+ } while (l && l->bpos);
+ buf->firstLine = l;
+ buf->firstLine->prev = NULL;
}
- else {
- pl->next = l;
- pl = l;
- }
- if (rl == NULL)
- rl = l;
- if (nlines > PagerMax) {
- fl = buf->firstLine;
- buf->firstLine = fl->next;
- fl->next->prev = NULL;
- if (buf->topLine == fl)
- buf->topLine = fl->next;
- if (buf->currentLine == fl)
- buf->currentLine = fl->next;
- }
- }
- if (pl != NULL)
- pl->next = NULL;
- buf->lastLine = pl;
- if (rl == NULL && squeeze_flag) {
- rl = pl;
}
if (fmInitialized)
term_raw();
- buf->linelen = linelen;
- buf->trbyte = trbyte;
+ buf->trbyte = trbyte + linelen;
#ifdef JP_CHARSET
buf->document_code = code;
#endif
- return rl;
+ buf->topLine = top;
+ buf->currentLine = cur;
+ if (!last)
+ last = buf->firstLine;
+ else if (last && (last->next || !squeeze_flag))
+ last = last->next;
+ return last;
}
int
diff --git a/fm.h b/fm.h
@@ -71,9 +71,8 @@ void bzero(void *, int);
/*
* Constants.
*/
-#define LINELEN 4096 /* Maximum line length */
+#define LINELEN 256 /* Initial line length */
#define PAGER_MAX_LINE 10000 /* Maximum line kept as pager */
-#define FNLEN 80
#ifdef USE_IMAGE
#define MAX_IMAGE 1000
@@ -316,6 +315,9 @@ typedef struct _Line {
long linenumber; /* on buffer */
long real_linenumber; /* on file */
unsigned short usrflags;
+ short size;
+ short bpos;
+ short bwidth;
} Line;
typedef struct {
@@ -438,7 +440,6 @@ typedef struct _Buffer {
struct frameset *frameset;
struct frameset_queue *frameQ;
int *clone;
- size_t linelen;
size_t trbyte;
char check_url;
#ifdef JP_CHARSET
@@ -521,7 +522,8 @@ typedef struct _DownloadList {
#define FONTSTAT_SIZE 4
-#define INIT_BUFFER_WIDTH (COLS - 1)
+#define INIT_BUFFER_WIDTH (COLS - (showLineNum ? 6 : 1))
+#define FOLD_BUFFER_WIDTH (FoldLine ? (INIT_BUFFER_WIDTH + 1) : -1)
typedef struct {
int pos;
@@ -955,6 +957,7 @@ global char *DictCommand init("file:///$LIB/w3mdict" CGI_EXTENSION);
global int ignore_null_img_alt init(TRUE);
global int displayInsDel init(TRUE);
global int FoldTextarea init(FALSE);
+global int FoldLine init(FALSE);
#define DEFAULT_URL_EMPTY 0
#define DEFAULT_URL_CURRENT 1
#define DEFAULT_URL_LINK 2
diff --git a/funcname.tab b/funcname.tab
@@ -110,6 +110,7 @@ REDRAW rdrwSc
REG_MARK reMark
REINIT reinit
RELOAD reload
+RESHAPE reshape
RIGHT col1R
SAVE svSrc
SAVE_IMAGE svI
diff --git a/main.c b/main.c
@@ -1175,7 +1175,7 @@ do_dump(Buffer *buf)
if (w3m_dump & DUMP_SOURCE)
dump_source(buf);
if (w3m_dump == DUMP_BUFFER)
- saveBuffer(buf, stdout);
+ saveBuffer(buf, stdout, FALSE);
signal(SIGINT, prevtrap);
}
@@ -1402,37 +1402,60 @@ SigPipe(SIGNAL_ARG)
static void
nscroll(int n, int mode)
{
- Line *curtop = Currentbuf->topLine;
+ Buffer *buf = Currentbuf;
+ Line *top = buf->topLine, *cur = buf->currentLine;
int lnum, tlnum, llnum, diff_n;
- if (Currentbuf->firstLine == NULL)
+ if (buf->firstLine == NULL)
return;
- lnum = Currentbuf->currentLine->linenumber;
- Currentbuf->topLine = lineSkip(Currentbuf, curtop, n, FALSE);
- if (Currentbuf->topLine == curtop) {
+ lnum = cur->linenumber;
+ buf->topLine = lineSkip(buf, top, n, FALSE);
+ if (buf->topLine == top) {
lnum += n;
- if (lnum < Currentbuf->topLine->linenumber)
- lnum = Currentbuf->topLine->linenumber;
- else if (lnum > Currentbuf->lastLine->linenumber)
- lnum = Currentbuf->lastLine->linenumber;
+ if (lnum < buf->topLine->linenumber)
+ lnum = buf->topLine->linenumber;
+ else if (lnum > buf->lastLine->linenumber)
+ lnum = buf->lastLine->linenumber;
}
else {
- tlnum = Currentbuf->topLine->linenumber;
- llnum = Currentbuf->topLine->linenumber + Currentbuf->LINES - 1;
+ tlnum = buf->topLine->linenumber;
+ llnum = buf->topLine->linenumber + buf->LINES - 1;
#ifdef NEXTPAGE_TOPLINE
if (nextpage_topline)
diff_n = 0;
else
#endif
- diff_n = n - (tlnum - curtop->linenumber);
+ diff_n = n - (tlnum - top->linenumber);
if (lnum < tlnum)
lnum = tlnum + diff_n;
if (lnum > llnum)
lnum = llnum + diff_n;
}
- gotoLine(Currentbuf, lnum);
- arrangeLine(Currentbuf);
- displayBuffer(Currentbuf, mode);
+ gotoLine(buf, lnum);
+ arrangeLine(buf);
+ if (n > 0) {
+ if (buf->currentLine->bpos &&
+ buf->currentLine->bwidth >= buf->currentColumn + buf->visualpos)
+ cursorDown(buf, 1);
+ else {
+ while (buf->currentLine->next && buf->currentLine->next->bpos &&
+ buf->currentLine->bwidth + buf->currentLine->width <
+ buf->currentColumn + buf->visualpos)
+ cursorDown0(buf, 1);
+ }
+ }
+ else {
+ if (buf->currentLine->bwidth + buf->currentLine->width <
+ buf->currentColumn + buf->visualpos)
+ cursorUp(buf, 1);
+ else {
+ while (buf->currentLine->prev && buf->currentLine->bpos &&
+ buf->currentLine->bwidth >=
+ buf->currentColumn + buf->visualpos)
+ cursorUp0(buf, 1);
+ }
+ }
+ displayBuffer(buf, mode);
}
/* Move page forward */
@@ -1525,7 +1548,7 @@ clear_mark(Line *l)
short pos;
if (!l)
return;
- for (pos = 0; pos < l->len; pos++)
+ for (pos = 0; pos < l->size; pos++)
l->propBuf[pos] &= ~PE_MARK;
}
@@ -1756,14 +1779,15 @@ srchprv(void)
static void
shiftvisualpos(Buffer *buf, int shift)
{
+ Line *l = buf->currentLine;
buf->visualpos -= shift;
- if (buf->visualpos >= buf->COLS)
- buf->visualpos = buf->COLS - 1;
- else if (buf->visualpos < 0)
- buf->visualpos = 0;
+ if (buf->visualpos - l->bwidth >= buf->COLS)
+ buf->visualpos = l->bwidth + buf->COLS - 1;
+ else if (buf->visualpos - l->bwidth < 0)
+ buf->visualpos = l->bwidth;
arrangeLine(buf);
- if (buf->visualpos == -shift && buf->cursorX == 0)
- buf->visualpos = 0;
+ if (buf->visualpos - l->bwidth == -shift && buf->cursorX == 0)
+ buf->visualpos = l->bwidth;
}
/* Shift screen left */
@@ -1878,7 +1902,7 @@ pipeBuf(void)
disp_message(Sprintf("Can't save buffer to %s", cmd)->ptr, TRUE);
return;
}
- saveBuffer(Currentbuf, f);
+ saveBuffer(Currentbuf, f, TRUE);
fclose(f);
buf = getpipe(myExtCommand(cmd, tmpf, TRUE)->ptr);
if (buf == NULL) {
@@ -2450,6 +2474,8 @@ linbeg(void)
{
if (Currentbuf->firstLine == NULL)
return;
+ while (Currentbuf->currentLine->prev && Currentbuf->currentLine->bpos)
+ cursorUp0(Currentbuf, 1);
Currentbuf->pos = 0;
arrangeCursor(Currentbuf);
displayBuffer(Currentbuf, B_NORMAL);
@@ -2461,6 +2487,8 @@ linend(void)
{
if (Currentbuf->firstLine == NULL)
return;
+ while (Currentbuf->currentLine->next && Currentbuf->currentLine->next->bpos)
+ cursorDown0(Currentbuf, 1);
Currentbuf->pos = Currentbuf->currentLine->len - 1;
arrangeCursor(Currentbuf);
displayBuffer(Currentbuf, B_NORMAL);
@@ -2506,7 +2534,7 @@ editScr(void)
disp_err_message(Sprintf("Can't open %s", tmpf)->ptr, TRUE);
return;
}
- saveBuffer(Currentbuf, f);
+ saveBuffer(Currentbuf, f, TRUE);
fclose(f);
fmTerm();
system(myEditor(Editor, tmpf, CUR_LINENUMBER(Currentbuf))->ptr);
@@ -4225,7 +4253,7 @@ svBuf(void)
disp_err_message(emsg, TRUE);
return;
}
- saveBuffer(Currentbuf, f);
+ saveBuffer(Currentbuf, f, TRUE);
if (is_pipe)
pclose(f);
else
@@ -4370,7 +4398,7 @@ vwSrc(void)
f = fopen(tmpf->ptr, "w");
if (f == NULL)
return;
- saveBuffer(Currentbuf, f);
+ saveBuffer(Currentbuf, f, TRUE);
fclose(f);
Currentbuf->sourcefile = tmpf->ptr;
}
@@ -4543,6 +4571,15 @@ reload(void)
displayBuffer(Currentbuf, B_FORCE_REDRAW);
}
+/* reshape */
+void
+reshape(void)
+{
+ Currentbuf->need_reshape = TRUE;
+ reshapeBuffer(Currentbuf);
+ displayBuffer(Currentbuf, B_FORCE_REDRAW);
+}
+
/* mark URL-like patterns as anchors */
void
chkURLBuffer(Buffer *buf)
@@ -4739,22 +4776,22 @@ linkbrz()
void
curlno()
{
+ Line *l = Currentbuf->currentLine;
Str tmp;
int cur = 0, all, col, len = 0;
- if (Currentbuf->currentLine != NULL) {
- Line *l = Currentbuf->currentLine;
+ if (l != NULL) {
cur = l->real_linenumber;
if (l->width < 0)
l->width = COLPOS(l, l->len);
- len = l->width;
+ len = l->bwidth + l->width;
}
- col = Currentbuf->currentColumn + Currentbuf->cursorX + 1;
+ col = l->bwidth + Currentbuf->currentColumn + Currentbuf->cursorX + 1;
all =
(Currentbuf->lastLine ? Currentbuf->lastLine->
real_linenumber : Currentbuf->allLine);
if (all == 0 && Currentbuf->lastLine != NULL)
- all = Currentbuf->currentLine->real_linenumber;
+ all = l->real_linenumber;
if (all == 0)
all = 1;
if (Currentbuf->pagerSource && !(Currentbuf->bufferprop & BP_CLOSE))
diff --git a/mimehead.c b/mimehead.c
@@ -7,8 +7,6 @@
#include "myctype.h"
#include "Str.h"
-#define LINELEN 4096
-
#define MIME_ENCODED_LINE_LIMIT 80
#define MIME_ENCODED_WORD_LENGTH_OFFSET 18
#define MIME_ENCODED_WORD_LENGTH_ESTIMATION(x) \
diff --git a/proto.h b/proto.h
@@ -92,6 +92,7 @@ extern void peekIMG(void);
extern void curURL(void);
extern void vwSrc(void);
extern void reload(void);
+extern void reshape(void);
extern void chkURL(void);
extern void chkURLBuffer(Buffer *buf);
extern void chkWORD(void);
@@ -224,7 +225,7 @@ extern Buffer *loadBuffer(URLFile *uf, Buffer *newBuf);
#ifdef USE_IMAGE
extern Buffer *loadImageBuffer(URLFile *uf, Buffer *newBuf);
#endif
-extern void saveBuffer(Buffer *buf, FILE * f);
+extern void saveBuffer(Buffer *buf, FILE * f, int cont);
extern Buffer *getshell(char *cmd);
extern Buffer *getpipe(char *cmd);
extern Buffer *openPagerBuffer(InputStream stream, Buffer *buf);
@@ -286,7 +287,9 @@ extern void disp_message_nomouse(char *s, int redraw_current);
#define disp_message_nomouse disp_message
#endif
extern void set_delayed_message(char *s);
+extern void cursorUp0(Buffer *buf, int n);
extern void cursorUp(Buffer *buf, int n);
+extern void cursorDown0(Buffer *buf, int n);
extern void cursorDown(Buffer *buf, int n);
extern void cursorUpDown(Buffer *buf, int n);
extern void cursorRight(Buffer *buf, int n);
@@ -301,11 +304,11 @@ extern int columnPos(Line *line, int column);
extern Line *lineSkip(Buffer *buf, Line *line, int offset, int last);
extern Line *currentLineSkip(Buffer *buf, Line *line, int offset, int last);
extern int gethtmlcmd(char **s);
-extern Str checkType(Str s, Lineprop *oprop,
+extern Str checkType(Str s, Lineprop **oprop
#ifdef USE_ANSI_COLOR
- Linecolor *ocolor, int *check_color,
+ , Linecolor **ocolor
#endif
- int len);
+ );
extern int calcPosition(char *l, Lineprop *pr, int len, int pos, int bpos,
int mode);
extern char *lastFileName(char *path);
diff --git a/rc.c b/rc.c
@@ -130,6 +130,7 @@ static int RC_table_size;
#ifdef NEXTPAGE_TOPLINE
#define CMT_NEXTPAGE_TOPLINE "次のページに移動する時にカーソルがトップになるようにする"
#endif
+#define CMT_FOLD_LINE "plain text ファイルの行を折り返す"
#define CMT_SHOW_NUM "行番号を表示する"
#define CMT_SHOW_SRCH_STR "検索文字列を表示する"
#define CMT_MIMETYPES "利用するmime.types"
@@ -293,6 +294,7 @@ static int RC_table_size;
#ifdef NEXTPAGE_TOPLINE
#define CMT_NEXTPAGE_TOPLINE "Move cursor to top line when moving to next page"
#endif
+#define CMT_FOLD_LINE "Fold lines of plain text file"
#define CMT_SHOW_NUM "Show line numbers"
#define CMT_SHOW_SRCH_STR "Show search string"
#define CMT_MIMETYPES "List of mime.types files"
@@ -566,6 +568,7 @@ struct param_ptr params1[] = {
{"image_map_list", P_INT, PI_ONOFF, (void *)&image_map_list,
CMT_IMAGE_MAP_LIST, NULL},
#endif
+ {"fold_line", P_INT, PI_ONOFF, (void *)&FoldLine, CMT_FOLD_LINE, NULL},
{"show_lnum", P_INT, PI_ONOFF, (void *)&showLineNum, CMT_SHOW_NUM, NULL},
{"show_srch_str", P_INT, PI_ONOFF, (void *)&show_srch_str,
CMT_SHOW_SRCH_STR, NULL},
@@ -1319,6 +1322,8 @@ do_mkdir(const char *dir, long mode)
void
sync_with_option(void)
{
+ if (PagerMax < LINES)
+ PagerMax = LINES;
WrapSearch = WrapDefault;
parse_proxy();
#ifdef USE_COOKIE
diff --git a/scripts/w3mhelp.cgi.in b/scripts/w3mhelp.cgi.in
@@ -135,7 +135,7 @@ for $otherlang (@docdirs) {
&show_keymap("Buffer operation",
split(" ", "backBf nextBf prevBf selMn selBuf vwSrc svSrc svBuf
- editBf editScr reload rdrwSc dispI stopI"));
+ editBf editScr reload reshape rdrwSc dispI stopI"));
&show_keymap("Tab operation",
split(" ", "newT closeT nextT prevT tabMn tabR tabL"));
diff --git a/search.c b/search.c
@@ -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 */