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;