Treat table height as int instead of short

Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=838952
This commit is contained in:
Tatsuya Kinoshita
2021-03-30 22:48:53 +09:00
parent 1a9bcdf202
commit 540eb60fdd
2 changed files with 41 additions and 8 deletions

47
table.c
View File

@@ -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);
@@ -845,6 +845,39 @@ table_rule_width(struct table *t)
return RULE_WIDTH;
}
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,
@@ -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);
}

View File

@@ -100,7 +100,7 @@ struct table {
short minimum_width[MAXCOL];
short fixed_width[MAXCOL];
struct table_cell cell;
short *tabheight;
int *tabheight;
struct table_in *tables;
short ntable;
short tables_size;