From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 29861 invoked from network); 28 Sep 2021 17:07:31 -0000 Received: from bsd.lv (HELO mandoc.bsd.lv) (66.111.2.12) by inbox.vuxu.org with ESMTPUTF8; 28 Sep 2021 17:07:31 -0000 Received: from fantadrom.bsd.lv (localhost [127.0.0.1]) by mandoc.bsd.lv (OpenSMTPD) with ESMTP id d11c98ba for ; Tue, 28 Sep 2021 12:07:29 -0500 (EST) Received: from localhost (mandoc.bsd.lv [local]) by mandoc.bsd.lv (OpenSMTPD) with ESMTPA id b46ce067 for ; Tue, 28 Sep 2021 12:07:29 -0500 (EST) Date: Tue, 28 Sep 2021 12:07:29 -0500 (EST) X-Mailinglist: mandoc-source Reply-To: source@mandoc.bsd.lv MIME-Version: 1.0 From: schwarze@mandoc.bsd.lv To: source@mandoc.bsd.lv Subject: mandoc: Revert part of the previous diff to fix a regression (another X-Mailer: activitymail 1.26, http://search.cpan.org/dist/activitymail/ Content-Type: text/plain; charset=utf-8 Message-ID: Log Message: ----------- Revert part of the previous diff to fix a regression (another endless loop) reported by Michael in the Linux md(4) manual. The reason the colwidth[] array is needed is not that it stores widths different from those in tbl->cols[].width, but that only part of the columns participate in the comparisons, i.e. only those intersecting at least one span the still requires width distribution. Modified Files: -------------- mandoc: out.c Revision Data ------------- Index: out.c =================================================================== RCS file: /home/cvs/mandoc/mandoc/out.c,v retrieving revision 1.82 retrieving revision 1.83 diff -Lout.c -Lout.c -u -p -r1.82 -r1.83 --- out.c +++ out.c @@ -123,6 +123,7 @@ tblcalc(struct rofftbl *tbl, const struc const struct tbl_dat *dp; struct roffcol *col; struct tbl_colgroup *first_group, **gp, *g; + size_t *colwidth; size_t ewidth, min1, min2, wanted, width, xwidth; int done, icol, maxcol, necol, nxcol, quirkcol; @@ -256,16 +257,28 @@ tblcalc(struct rofftbl *tbl, const struc gp = &(*gp)->next; } + colwidth = mandoc_reallocarray(NULL, maxcol + 1, sizeof(*colwidth)); while (first_group != NULL) { /* + * Rebuild the array of the widths of all columns + * participating in spans that require expansion. + */ + + for (icol = 0; icol <= maxcol; icol++) + colwidth[icol] = SIZE_MAX; + for (g = first_group; g != NULL; g = g->next) + for (icol = g->startcol; icol <= g->endcol; icol++) + colwidth[icol] = tbl->cols[icol].width; + + /* * Find the smallest and second smallest column width * among the columns which may need expamsion. */ min1 = min2 = SIZE_MAX; for (icol = 0; icol <= maxcol; icol++) { - width = tbl->cols[icol].width; + width = colwidth[icol]; if (min1 > width) { min2 = min1; min1 = width; @@ -283,7 +296,7 @@ tblcalc(struct rofftbl *tbl, const struc for (g = first_group; g != NULL; g = g->next) { necol = 0; for (icol = g->startcol; icol <= g->endcol; icol++) - if (tbl->cols[icol].width == min1) + if (colwidth[icol] == min1) necol++; if (necol == 0) continue; @@ -300,7 +313,7 @@ tblcalc(struct rofftbl *tbl, const struc while ((g = *gp) != NULL) { done = 0; for (icol = g->startcol; icol <= g->endcol; icol++) { - if (tbl->cols[icol].width != min1) + if (colwidth[icol] != min1) continue; if (g->wanted <= wanted - min1) { tbl->cols[icol].width += g->wanted; @@ -317,6 +330,7 @@ tblcalc(struct rofftbl *tbl, const struc gp = &(*gp)->next; } } + free(colwidth); /* * Align numbers with text. -- To unsubscribe send an email to source+unsubscribe@mandoc.bsd.lv