diff options
| author | Fumitoshi UKAI <ukai@debian.or.jp> | 2003-01-23 18:37:18 +0000 | 
|---|---|---|
| committer | Fumitoshi UKAI <ukai@debian.or.jp> | 2003-01-23 18:37:18 +0000 | 
| commit | 61c2c2de18d3ef19c321bac335043424c862aba7 (patch) | |
| tree | 52b5d72b1c3298f7e12b72daabfff2b37eb37680 | |
| parent | * etc.c (next_status): after = is R_ST_VALUE (diff) | |
| download | w3m-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>
| -rw-r--r-- | ChangeLog | 74 | ||||
| -rw-r--r-- | anchor.c | 33 | ||||
| -rw-r--r-- | backend.c | 4 | ||||
| -rw-r--r-- | buffer.c | 18 | ||||
| -rw-r--r-- | display.c | 90 | ||||
| -rw-r--r-- | doc-jp/README.func | 1 | ||||
| -rw-r--r-- | doc/README.func | 1 | ||||
| -rw-r--r-- | etc.c | 56 | ||||
| -rw-r--r-- | file.c | 278 | ||||
| -rw-r--r-- | fm.h | 13 | ||||
| -rw-r--r-- | funcname.tab | 3 | ||||
| -rw-r--r-- | main.c | 103 | ||||
| -rw-r--r-- | mimehead.c | 4 | ||||
| -rw-r--r-- | proto.h | 13 | ||||
| -rw-r--r-- | rc.c | 7 | ||||
| -rw-r--r-- | scripts/w3mhelp.cgi.in | 4 | ||||
| -rw-r--r-- | search.c | 76 | 
17 files changed, 543 insertions, 235 deletions
| @@ -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 @@ -6743,4 +6815,4 @@ a	* [w3m-dev 03276] compile error on EWS4800  	* release-0-2-1  	* import w3m-0.2.1 -$Id: ChangeLog,v 1.708 2003/01/23 18:01:01 ukai Exp $ +$Id: ChangeLog,v 1.709 2003/01/23 18:37:18 ukai Exp $ @@ -1,4 +1,4 @@ -/* $Id: anchor.c,v 1.20 2003/01/15 16:11:43 ukai Exp $ */ +/* $Id: anchor.c,v 1.21 2003/01/23 18:37:20 ukai Exp $ */  #include "fm.h"  #include "myctype.h"  #include "regex.h" @@ -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;  } @@ -1,4 +1,4 @@ -/* $Id: backend.c,v 1.10 2002/12/24 17:20:46 ukai Exp $ */ +/* $Id: backend.c,v 1.11 2003/01/23 18:37:20 ukai Exp $ */  #include <stdio.h>  #include <string.h>  #include <sys/types.h> @@ -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); @@ -1,4 +1,4 @@ -/* $Id: buffer.c,v 1.19 2003/01/22 16:16:19 ukai Exp $ */ +/* $Id: buffer.c,v 1.20 2003/01/23 18:37:20 ukai Exp $ */  #include "fm.h"  #ifdef USE_MOUSE @@ -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 @@ -1,4 +1,4 @@ -/* $Id: display.c,v 1.52 2003/01/20 15:32:02 ukai Exp $ */ +/* $Id: display.c,v 1.53 2003/01/23 18:37:20 ukai Exp $ */  #include <signal.h>  #include "fm.h" @@ -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 index 3f63e49..e5fbfa8 100644 --- 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 index 67f6152..e48cabf 100644 --- 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 @@ -1,4 +1,4 @@ -/* $Id: etc.c,v 1.57 2003/01/23 18:01:05 ukai Exp $ */ +/* $Id: etc.c,v 1.58 2003/01/23 18:37:20 ukai Exp $ */  #include "fm.h"  #include <pwd.h>  #include "myctype.h" @@ -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++) { @@ -1,4 +1,4 @@ -/* $Id: file.c,v 1.202 2003/01/23 16:05:56 ukai Exp $ */ +/* $Id: file.c,v 1.203 2003/01/23 18:37:20 ukai Exp $ */  #include "fm.h"  #include <sys/types.h>  #include "myctype.h" @@ -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 @@ -1,4 +1,4 @@ -/* $Id: fm.h,v 1.106 2003/01/23 18:01:06 ukai Exp $ */ +/* $Id: fm.h,v 1.107 2003/01/23 18:37:20 ukai Exp $ */  /*    * w3m: WWW wo Miru utility   *  @@ -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 index c238ce1..d5b4589 100644 --- a/funcname.tab +++ b/funcname.tab @@ -1,4 +1,4 @@ -# $Id: funcname.tab,v 1.19 2002/12/10 15:51:14 ukai Exp $ +# $Id: funcname.tab,v 1.20 2003/01/23 18:37:21 ukai Exp $  # macro name	function name  #----------------------------  @@@		nulcmd @@ -110,6 +110,7 @@ REDRAW		rdrwSc  REG_MARK	reMark  REINIT		reinit  RELOAD		reload +RESHAPE		reshape  RIGHT		col1R  SAVE		svSrc  SAVE_IMAGE	svI @@ -1,4 +1,4 @@ -/* $Id: main.c,v 1.197 2003/01/22 16:16:20 ukai Exp $ */ +/* $Id: main.c,v 1.198 2003/01/23 18:37:21 ukai Exp $ */  #define MAINPROGRAM  #include "fm.h"  #include <signal.h> @@ -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)) @@ -1,4 +1,4 @@ -/* $Id: mimehead.c,v 1.7 2002/12/24 17:20:47 ukai Exp $ */ +/* $Id: mimehead.c,v 1.8 2003/01/23 18:37:21 ukai Exp $ */  /*    * MIME header support by Akinori ITO   */ @@ -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) \ @@ -1,4 +1,4 @@ -/* $Id: proto.h,v 1.83 2003/01/22 16:10:28 ukai Exp $ */ +/* $Id: proto.h,v 1.84 2003/01/23 18:37:21 ukai Exp $ */  /*    *   This file was automatically generated by version 1.7 of cextract.   *   Manual editing not recommended. @@ -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); @@ -1,4 +1,4 @@ -/* $Id: rc.c,v 1.79 2003/01/20 15:24:20 ukai Exp $ */ +/* $Id: rc.c,v 1.80 2003/01/23 18:37:21 ukai Exp $ */  /*    * Initialization file etc.   */ @@ -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 index 12c1b63..761c9a3 100644 --- a/scripts/w3mhelp.cgi.in +++ b/scripts/w3mhelp.cgi.in @@ -1,5 +1,5 @@  #!@PERL@ -# $Id: w3mhelp.cgi.in,v 1.23 2003/01/15 17:13:22 ukai Exp $ +# $Id: w3mhelp.cgi.in,v 1.24 2003/01/23 18:37:22 ukai Exp $  if ( $^O =~ /^(ms)?(dos|win(32|nt)?)/i ) {    $CYGPATH = 1; @@ -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")); @@ -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 */ | 
