diff -urN -x CVS -x config.h -x config.param -x XXMakefile -x gc -x doc-jp w3m.org/configure w3m.new/configure --- w3m.org/configure Fri Dec 1 18:55:28 2000 +++ w3m.new/configure Fri Dec 1 21:08:41 2000 @@ -1544,7 +1544,7 @@ #undef EMACS_LIKE_LINEEDIT /* - * Remove line tailing spaces in html buffer. + * Remove line trailing spaces in html buffer. */ #undef ENABLE_REMOVE_TRAILINGSPACES diff -urN -x CVS -x config.h -x config.param -x XXMakefile -x gc -x doc-jp w3m.org/file.c w3m.new/file.c --- w3m.org/file.c Sat Dec 2 01:36:14 2000 +++ w3m.new/file.c Sat Dec 2 01:11:50 2000 @@ -1,4 +1,4 @@ @@ -3347,6 +3347,9 @@ } return 1; case HTML_TABLE: + obuf->table_level++; + if (obuf->table_level >= MAX_TABLE) + break; #ifndef ID_EXT targ = parse_tag(h_env->tagbuf->ptr); #endif /* !ID_EXT */ @@ -3418,7 +3421,6 @@ tables[obuf->table_level]->real_width = width; tables[obuf->table_level]->total_width = 0; #endif - obuf->table_level++; return 1; case HTML_N_TABLE: /* should be processed in HTMLlineproc() */ @@ -3931,7 +3933,7 @@ #endif /* NEW_FORM */ } #ifdef NEW_FORM - if (form_id < 0 || forms == NULL) + if (form_id < 0 || form_id > form_max || forms == NULL) break; /* outside of
..
*/ form = forms[form_id]; #else /* not NEW_FORM */ @@ -4233,7 +4235,7 @@ FILE *f = fopen("zzzproc1", "a"); fprintf(f, "%c%c%c%c", (obuf->flag & RB_PREMODE) ? 'P' : ' ', - (obuf->table_level > 0) ? 'T' : ' ', + (obuf->table_level >= 0) ? 'T' : ' ', (obuf->flag & RB_INTXTA) ? 'X' : ' ', (obuf->flag & RB_IGNORE) ? 'I' : ' '); fprintf(f, "HTMLlineproc1(\"%s\",%d,%lx)\n", istr, h_env->limit, (unsigned long) h_env); @@ -4311,63 +4313,62 @@ } while (*str != '\0') { - if (obuf->table_level > 0 && obuf->status == R_ST_NORMAL) { + if (obuf->table_level >= 0 && obuf->status == R_ST_NORMAL) { /* * within table: in ..
, all input tokens * are fed to the table renderer, and then the renderer * makes HTML output. */ + int level = min(obuf->table_level, MAX_TABLE - 1); + struct table *tbl = tables[level]; + struct table_mode *tmode = &table_mode[level]; + int width = table_width(h_env, level); + check_table_tag: if (*str == '\0') return; - switch (feed_table(tables[obuf->table_level - 1], &str, - &table_mode[obuf->table_level - 1], - table_width(h_env, obuf->table_level - 1), internal)) { + switch (feed_table(tbl, &str, tmode, width, internal)) { case 0: /* tag */ obuf->table_level--; - obuf->prevchar = ' '; - if (obuf->table_level > 0) { + if (obuf->table_level >= MAX_TABLE - 1) + goto check_table_tag; + end_table(tbl); + if (obuf->table_level >= 0) { Str tmp; - if (table_width(h_env, obuf->table_level) > 0) - tmp = Sprintf("", - tables[obuf->table_level - 1]->ntable, - table_width(h_env, obuf->table_level)); - else - tmp = Sprintf("", - tables[obuf->table_level - 1]->ntable); - pushTable(tables[obuf->table_level - 1], - tables[obuf->table_level]); - feed_table1(tables[obuf->table_level - 1], tmp, - &table_mode[obuf->table_level - 1], - table_width(h_env, obuf->table_level - 1)); + struct table *tbl0 = tables[obuf->table_level]; + tmp = Sprintf("", tbl0->ntable); + pushTable(tbl0, tbl); + tbl = tbl0; + tmode = &table_mode[obuf->table_level]; + width = table_width(h_env, obuf->table_level); + feed_table1(tbl, tmp, tmode, width); goto check_table_tag; /* continue to the next */ } - if (obuf->table_level == 0) { - if (tables[0]->vspace > 0 && !(obuf->flag & RB_IGNORE_P)) { - int indent = h_env->envs[h_env->envc].indent; - flushline(h_env, obuf, indent, 0, h_env->limit); - do_blankline(h_env, obuf, indent, 0, h_env->limit); - } - save_fonteffect(h_env, obuf); - renderTable(tables[0], table_width(h_env, 0), h_env); - restore_fonteffect(h_env, obuf); - mode = PC_ASCII; - obuf->flag &= ~RB_IGNORE_P; - if (tables[0]->vspace > 0) { - int indent = h_env->envs[h_env->envc].indent; - do_blankline(h_env, obuf, indent, 0, h_env->limit); - obuf->flag |= RB_IGNORE_P; - } + /* all tables have been read */ + if (tbl->vspace > 0 && !(obuf->flag & RB_IGNORE_P)) { + int indent = h_env->envs[h_env->envc].indent; + flushline(h_env, obuf, indent, 0, h_env->limit); + do_blankline(h_env, obuf, indent, 0, h_env->limit); + } + save_fonteffect(h_env, obuf); + renderTable(tbl, width, h_env); + restore_fonteffect(h_env, obuf); + obuf->flag &= ~RB_IGNORE_P; + if (tbl->vspace > 0) { + int indent = h_env->envs[h_env->envc].indent; + do_blankline(h_env, obuf, indent, 0, h_env->limit); + obuf->flag |= RB_IGNORE_P; } + obuf->prevchar = ' '; case 1: /* tag */ goto proc_normal; case 2: /* comment */ - obuf->status = tables[obuf->table_level - 1]->status; - tables[obuf->table_level - 1]->status = R_ST_NORMAL; + obuf->status = tbl->status; + tbl->status = R_ST_NORMAL; return; default: goto check_table_tag; @@ -4813,7 +4814,7 @@ obuf->flag = RB_IGNORE_P; obuf->flag_sp = 0; obuf->status = R_ST_NORMAL; - obuf->table_level = 0; + obuf->table_level = -1; obuf->nobr_level = 0; obuf->anchor = 0; obuf->anchor_target = 0; @@ -4967,8 +4968,8 @@ HTMLlineproc1("", &htmlenv1); #endif /* for unbalanced table tag */ - while (obuf.table_level > 0) { - table_mode[obuf.table_level -1].pre_mode + while (obuf.table_level >= 0) { + table_mode[obuf.table_level].pre_mode &= ~(TBLM_IGNORE | TBLM_XMP | TBLM_LST); HTMLlineproc1("
", &htmlenv1); } diff -urN -x CVS -x config.h -x config.param -x XXMakefile -x gc -x doc-jp w3m.org/proto.h w3m.new/proto.h --- w3m.org/proto.h Sat Dec 2 01:29:50 2000 +++ w3m.new/proto.h Sat Dec 2 01:11:57 2000 @@ -235,6 +235,7 @@ extern void do_refill(struct table *tbl, int row, int col, int maxlimit); extern void renderTable(struct table *t, int max_width, struct html_feed_environ *h_env); extern struct table *begin_table(int border, int spacing, int padding, int vspace); +extern void end_table(struct table * tbl); extern void check_rowcol(struct table *tbl, struct table_mode *mode); extern int minimum_length(char *line); extern int feed_table(struct table *tbl, char **tline, struct table_mode *mode, int width, int internal); diff -urN -x CVS -x config.h -x config.param -x XXMakefile -x gc -x doc-jp w3m.org/table.c w3m.new/table.c --- w3m.org/table.c Sat Dec 2 01:36:14 2000 +++ w3m.new/table.c Sat Dec 2 01:11:57 2000 @@ -842,7 +842,7 @@ break; } } - if (id >= 0) { + if (id >= 0 && id < tbl->ntable) { int alignment; TextLineListItem *ti; struct table *t = tbl->tables[id].ptr; @@ -2084,6 +2084,39 @@ return t; } +void +end_table(struct table *tbl) +{ + struct table_cell *cell = &tbl->cell; + int i, rulewidth = table_rule_width(tbl); + if (rulewidth > 1) { + if (tbl->total_width > 0) + tbl->total_width = + ceil_at_intervals(tbl->total_width, rulewidth); + for (i = 0; i <= tbl->maxcol; i++) { + tbl->minimum_width[i] = + ceil_at_intervals(tbl->minimum_width[i], rulewidth); + tbl->tabwidth[i] = + ceil_at_intervals(tbl->tabwidth[i], rulewidth); + if (tbl->fixed_width[i] > 0) + tbl->fixed_width[i] = + ceil_at_intervals(tbl->fixed_width[i], rulewidth); + } + for (i = 0; i <= cell->maxcell; i++) { + cell->minimum_width[i] = + ceil_at_intervals(cell->minimum_width[i], rulewidth); + cell->width[i] = + ceil_at_intervals(cell->width[i], rulewidth); + if (cell->fixed_width[i] > 0) + cell->fixed_width[i] = + ceil_at_intervals(cell->fixed_width[i], rulewidth); + } + } + tbl->sloppy_width = fixed_table_width(tbl); + if (tbl->total_width > tbl->sloppy_width) + tbl->sloppy_width = tbl->total_width; +} + static void check_minimum0(struct table *t, int min) { @@ -2942,16 +2975,14 @@ if (!strcasecmp(t->arg, "id") && t->value) { id = atoi(t->value); } - else if (!strcasecmp(t->arg, "width") && t->value) { - w = atoi(t->value); - } } - if (id >= 0) { + if (id >= 0 && id < tbl->ntable) { struct table *tbl1 = tbl->tables[id].ptr; feed_table_block_tag(tbl, line, mode, 0); addcontentssize(tbl, maximum_table_width(tbl1)); check_minimum0(tbl, tbl1->sloppy_width); #ifdef TABLE_EXPAND + w = tbl1->total_width; v = 0; colspan = table_colspan(tbl, tbl->row, tbl->col); if (colspan > 1) { @@ -3062,37 +3093,8 @@ int action = feed_table_tag(tbl, line, mode, width, internal); if (action == TAG_ACTION_NONE) continue; - else if (action == TAG_ACTION_N_TABLE) { - struct table_cell *cell = &tbl->cell; - int i, rulewidth = table_rule_width(tbl); - if (rulewidth > 1) { - if (tbl->total_width > 0) - tbl->total_width = - ceil_at_intervals(tbl->total_width, rulewidth); - for (i = 0; i <= tbl->maxcol; i++) { - tbl->minimum_width[i] = - ceil_at_intervals(tbl->minimum_width[i], rulewidth); - tbl->tabwidth[i] = - ceil_at_intervals(tbl->tabwidth[i], rulewidth); - if (tbl->fixed_width[i] > 0) - tbl->fixed_width[i] = - ceil_at_intervals(tbl->fixed_width[i], rulewidth); - } - for (i = 0; i <= cell->maxcell; i++) { - cell->minimum_width[i] = - ceil_at_intervals(cell->minimum_width[i], rulewidth); - cell->width[i] = - ceil_at_intervals(cell->width[i], rulewidth); - if (cell->fixed_width[i] > 0) - cell->fixed_width[i] = - ceil_at_intervals(cell->fixed_width[i], rulewidth); - } - } - tbl->sloppy_width = fixed_table_width(tbl); - if (tbl->total_width > tbl->sloppy_width) - tbl->sloppy_width = tbl->total_width; + else if (action == TAG_ACTION_N_TABLE) return 0; - } else if (action == TAG_ACTION_TABLE) { *tline -= tok->length; return 1;