diff options
| -rw-r--r-- | ChangeLog | 16 | ||||
| -rw-r--r-- | file.c | 93 | 
2 files changed, 86 insertions, 23 deletions
| @@ -1,3 +1,17 @@ +2002-12-22  Hironori SAKAMOTO <hsaka@mth.biglobe.ne.jp> + +	* [w3m-dev 03593] Re: segmentation fault when <title> exist after <img> +	* file.c (cur_title): added +		(save_obuf): deleted +		(process_title): added +		(process_n_title): added +		(feed_title): added +		(HTMLtagproc1): rewrite HTML_TITLE, HTML_N_TITLE,  +				HTML_TITLE_ALT, HTML_N_HEAD, HTML_HEAD +		(HTMLlineproc0): check RB_TITLE +		(completeHTMLstream): add RB_TITLE +		(loadHTMLstream): initialize cur_title +  2002-12-21  Hironori SAKAMOTO <hsaka@mth.biglobe.ne.jp>  	* [w3m-dev 03590] segmentation fault when <title> exist after <img> @@ -5982,4 +5996,4 @@ a	* [w3m-dev 03276] compile error on EWS4800  	* release-0-2-1  	* import w3m-0.2.1 -$Id: ChangeLog,v 1.637 2002/12/20 20:20:52 ukai Exp $ +$Id: ChangeLog,v 1.638 2002/12/21 16:16:43 ukai Exp $ @@ -1,4 +1,4 @@ -/* $Id: file.c,v 1.165 2002/12/20 20:20:53 ukai Exp $ */ +/* $Id: file.c,v 1.166 2002/12/21 16:16:43 ukai Exp $ */  #include "fm.h"  #include <sys/types.h>  #include "myctype.h" @@ -59,6 +59,7 @@ static char cur_document_code;  #endif  #endif +static Str cur_title;  static Str cur_select;  static Str select_str;  static int select_is_multiple; @@ -95,8 +96,6 @@ static char check_charset(char *s);  static char check_accept_charset(char *s);  #endif -static struct readbuffer save_obuf; -  struct link_stack {      int cmd;      short offset; @@ -2939,6 +2938,45 @@ restore_fonteffect(struct html_feed_environ *h_env, struct readbuffer *obuf)  	push_tag(obuf, "<u>", HTML_U);  } +static Str +process_title(struct parsed_tag *tag) +{ +    cur_title = Strnew(); +    return NULL; +} + +static Str +process_n_title(struct parsed_tag *tag) +{ +    Str tmp; + +    if (!cur_title) +	return NULL; +    Strremovefirstspaces(cur_title); +    Strremovetrailingspaces(cur_title); +    tmp = Strnew_m_charp("<title_alt title=\"", +			 html_quote(cur_title->ptr), "\">", NULL); +    cur_title = NULL; +    return tmp; +} + +static void +feed_title(char *str) +{ +    if (!cur_title) +	return; +    while (*str) { +	if (*str == '&') +	    Strcat_charp(cur_title, getescapecmd(&str)); +	else if (*str == '\n' || *str == '\r') { +	    Strcat_char(cur_title, ' '); +	    str++; +	} +	else +	    Strcat_char(cur_title, *(str++)); +    } +} +  Str  process_img(struct parsed_tag *tag, int width)  { @@ -4299,27 +4337,24 @@ HTMLtagproc1(struct parsed_tag *tag, struct html_feed_environ *h_env)  	/* obuf->flag |= RB_IGNORE_P; */  	return 1;      case HTML_TITLE: -	append_tags(obuf); -	set_breakpoint(obuf, 0); -	bcopy((void *)obuf, (void *)&save_obuf, sizeof(struct readbuffer)); -	obuf->line = Strnew(); -	discardline(obuf, 0); -	obuf->flag |= (RB_NOBR | RB_TITLE); +	close_anchor(h_env, obuf); +	process_title(tag); +	obuf->flag |= RB_TITLE; +	obuf->end_tag = HTML_N_TITLE;  	return 1;      case HTML_N_TITLE:  	if (!(obuf->flag & RB_TITLE))  	    return 1; -	obuf->flag &= ~(RB_NOBR | RB_TITLE); -	tmp = Strnew_charp(obuf->line->ptr); -	Strremovetrailingspaces(tmp); -	h_env->title = html_unquote(tmp->ptr); -	bcopy((void *)&save_obuf, (void *)obuf, sizeof(struct readbuffer)); -	append_tags(obuf); -	back_to_breakpoint(obuf); -	tmp = Strnew_m_charp("<title_alt title=\"", -			     html_quote(h_env->title), "\">", NULL); -	push_tag(obuf, tmp->ptr, HTML_TITLE_ALT); +	obuf->flag &= ~RB_TITLE; +	obuf->end_tag = 0; +	tmp = process_n_title(tag); +	if (tmp) +	    HTMLlineproc1(tmp->ptr, h_env);  	return 1; +    case HTML_TITLE_ALT: +	if (parsedtag_get_value(tag, ATTR_TITLE, &p)) +	    h_env->title = html_unquote(p); +	return 0;      case HTML_FRAMESET:  	PUSH_ENV(cmd);  	push_charp(obuf, 9, "--FRAME--", PC_ASCII); @@ -4849,6 +4884,10 @@ HTMLtagproc1(struct parsed_tag *tag, struct html_feed_environ *h_env)  		HTMLlineproc1(s->ptr, h_env);  	    }  	} +    case HTML_N_HEAD: +	if (obuf->flag & RB_TITLE) +	     HTMLlineproc1("</title>", h_env); +    case HTML_HEAD:      case HTML_N_BODY:  	return 1;      default: @@ -5652,7 +5691,7 @@ HTMLlineproc0(char *line, struct html_feed_environ *h_env, int internal)  		if (str[1] && REALLY_THE_BEGINNING_OF_A_TAG(str))  		    is_tag = TRUE;  		else if (!(pre_mode & (RB_PLAIN | RB_INTXTA | RB_INSELECT | -				       RB_SCRIPT | RB_STYLE))) { +				       RB_SCRIPT | RB_STYLE | RB_TITLE))) {  		    line = Strnew_m_charp(str + 1, line, NULL)->ptr;  		    str = "<";  		} @@ -5666,15 +5705,22 @@ HTMLlineproc0(char *line, struct html_feed_environ *h_env, int internal)  	}  	if (pre_mode & (RB_PLAIN | RB_INTXTA | RB_INSELECT | RB_SCRIPT | -			RB_STYLE)) { +			RB_STYLE | RB_TITLE)) {  	    if (is_tag) {  		p = str;  		if ((tag = parse_tag(&p, internal))) {  		    if (tag->tagid == end_tag || -			(pre_mode & RB_INSELECT && tag->tagid == HTML_N_FORM)) +			(pre_mode & RB_INSELECT && tag->tagid == HTML_N_FORM) || +			(pre_mode & RB_TITLE && (tag->tagid == HTML_N_HEAD || +						 tag->tagid == HTML_BODY)))  			goto proc_normal;  		}  	    } +	    /* title */ +	    if (pre_mode & RB_TITLE) { +		feed_title(str); +		continue; +	    }  	    /* select */  	    if (pre_mode & RB_INSELECT) {  		if (obuf->table_level >= 0) @@ -6210,6 +6256,8 @@ completeHTMLstream(struct html_feed_environ *h_env, struct readbuffer *obuf)      /* for unbalanced select tag */      if (obuf->flag & RB_INSELECT)  	HTMLlineproc1("</select>", h_env); +    if (obuf->flag & RB_TITLE) +	HTMLlineproc1("</title>", h_env);      /* for unbalanced table tag */      while (obuf->table_level >= 0) { @@ -6312,6 +6360,7 @@ loadHTMLstream(URLFile *f, Buffer *newBuf, FILE * src, int internal)  #endif      MySignalHandler(*volatile prevtrap) (SIGNAL_ARG) = NULL; +    cur_title = NULL;      n_textarea = 0;      cur_textarea = NULL;      max_textarea = MAX_TEXTAREA; | 
