aboutsummaryrefslogtreecommitdiffstats
path: root/table.c
diff options
context:
space:
mode:
authorTatsuya Kinoshita <tats@debian.org>2021-03-30 13:48:53 +0000
committerTatsuya Kinoshita <tats@debian.org>2021-03-30 13:48:53 +0000
commit540eb60fddd0869ef66b6cf5e107f1a0a1eec21a (patch)
treeefe0850256f073dfdcdf6c23fa018b90746aba2c /table.c
parentTreat textlist item number as int instead of short (diff)
downloadw3m-540eb60fddd0869ef66b6cf5e107f1a0a1eec21a.tar.gz
w3m-540eb60fddd0869ef66b6cf5e107f1a0a1eec21a.zip
Treat table height as int instead of short
Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=838952
Diffstat (limited to '')
-rw-r--r--table.c47
1 files changed, 40 insertions, 7 deletions
diff --git a/table.c b/table.c
index eb5c9ba..46bef1d 100644
--- a/table.c
+++ b/table.c
@@ -278,7 +278,7 @@ newTable()
t->max_rowsize = MAXROW;
t->tabdata = New_N(GeneralList **, MAXROW);
t->tabattr = New_N(table_attr *, MAXROW);
- t->tabheight = NewAtom_N(short, MAXROW);
+ t->tabheight = NewAtom_N(int, MAXROW);
#ifdef ID_EXT
t->tabidvalue = New_N(Str *, MAXROW);
t->tridvalue = New_N(Str, MAXROW);
@@ -331,7 +331,7 @@ check_row(struct table *t, int row)
int i, r;
GeneralList ***tabdata;
table_attr **tabattr;
- short *tabheight;
+ int *tabheight;
#ifdef ID_EXT
Str **tabidvalue;
Str *tridvalue;
@@ -341,7 +341,7 @@ check_row(struct table *t, int row)
r = max(t->max_rowsize * 2, row + 1);
tabdata = New_N(GeneralList **, r);
tabattr = New_N(table_attr *, r);
- tabheight = NewAtom_N(short, r);
+ tabheight = NewAtom_N(int, r);
#ifdef ID_EXT
tabidvalue = New_N(Str *, r);
tridvalue = New_N(Str, r);
@@ -846,6 +846,39 @@ table_rule_width(struct table *t)
}
static void
+check_cell_height(int *tabheight, int *cellheight,
+ short *row, short *rowspan, short maxcell,
+ short *indexarray, int space, int dir)
+{
+ int i, j, k, brow, erow;
+ int sheight, height;
+
+ for (k = 0; k <= maxcell; k++) {
+ j = indexarray[k];
+ if (cellheight[j] <= 0)
+ continue;
+ brow = row[j];
+ erow = brow + rowspan[j];
+ sheight = 0;
+ for (i = brow; i < erow; i++)
+ sheight += tabheight[i];
+
+ height = cellheight[j] - (rowspan[j] - 1) * space;
+ if (height > sheight) {
+ int w = (height - sheight) / rowspan[j];
+ int r = (height - sheight) % rowspan[j];
+ for (i = brow; i < erow; i++)
+ tabheight[i] += w;
+ /* dir {0: horizontal, 1: vertical} */
+ if (dir == 1 && r > 0)
+ r = rowspan[j];
+ for (i = 1; i <= r; i++)
+ tabheight[erow - i]++;
+ }
+ }
+}
+
+static void
check_cell_width(short *tabwidth, short *cellwidth,
short *col, short *colspan, short maxcell,
short *indexarray, int space, int dir)
@@ -1478,7 +1511,7 @@ check_table_height(struct table *t)
short *indexarray;
short maxcell;
short size;
- short *height;
+ int *height;
} cell;
int space = 0;
@@ -1517,7 +1550,7 @@ check_table_height(struct table *t)
cell.row = NewAtom_N(short, cell.size);
cell.rowspan = NewAtom_N(short, cell.size);
cell.indexarray = NewAtom_N(short, cell.size);
- cell.height = NewAtom_N(short, cell.size);
+ cell.height = NewAtom_N(int, cell.size);
}
else {
cell.size = max(cell.size + MAXCELL, c + 1);
@@ -1526,7 +1559,7 @@ check_table_height(struct table *t)
cell.size);
cell.indexarray = New_Reuse(short, cell.indexarray,
cell.size);
- cell.height = New_Reuse(short, cell.height, cell.size);
+ cell.height = New_Reuse(int, cell.height, cell.size);
}
}
if (c > cell.maxcell) {
@@ -1560,7 +1593,7 @@ check_table_height(struct table *t)
case BORDER_NONE:
space = 0;
}
- check_cell_width(t->tabheight, cell.height, cell.row, cell.rowspan,
+ check_cell_height(t->tabheight, cell.height, cell.row, cell.rowspan,
cell.maxcell, cell.indexarray, space, 1);
}