Lines Matching +full:data +full:- +full:width
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
64 dst->unit = def == SCALE_MAX ? SCALE_BU : def; in a2roffsu()
65 dst->scale = strtod(src, &endptr); in a2roffsu()
71 dst->unit = SCALE_CM; in a2roffsu()
74 dst->unit = SCALE_IN; in a2roffsu()
77 dst->unit = SCALE_FS; in a2roffsu()
80 dst->unit = SCALE_MM; in a2roffsu()
83 dst->unit = SCALE_EM; in a2roffsu()
86 dst->unit = SCALE_EN; in a2roffsu()
89 dst->unit = SCALE_PC; in a2roffsu()
92 dst->unit = SCALE_PT; in a2roffsu()
95 dst->unit = SCALE_BU; in a2roffsu()
98 dst->unit = SCALE_VS; in a2roffsu()
101 endptr--; in a2roffsu()
104 dst->unit = def; in a2roffsu()
114 * used for the actual width calculations.
127 size_t ewidth, min1, min2, wanted, width, xwidth; in tblcalc() local
136 assert(tbl->cols == NULL); in tblcalc()
137 tbl->cols = mandoc_calloc((size_t)sp_first->opts->cols, in tblcalc()
139 opts = sp_first->opts; in tblcalc()
141 maxcol = -1; in tblcalc()
143 for (sp = sp_first; sp != NULL; sp = sp->next) { in tblcalc()
144 if (sp->pos != TBL_SPAN_DATA) in tblcalc()
148 * Account for the data cells in the layout, matching it in tblcalc()
149 * to data cells in the data section. in tblcalc()
152 for (dp = sp->first; dp != NULL; dp = dp->next) { in tblcalc()
153 icol = dp->layout->col; in tblcalc()
154 while (maxcol < icol + dp->hspans) in tblcalc()
155 tbl->cols[++maxcol].spacing = SIZE_MAX; in tblcalc()
156 col = tbl->cols + icol; in tblcalc()
157 col->flags |= dp->layout->flags; in tblcalc()
158 if (dp->layout->flags & TBL_CELL_WIGN) in tblcalc()
161 /* Handle explicit width specifications. */ in tblcalc()
163 if (dp->layout->wstr != NULL && in tblcalc()
164 dp->layout->width == 0 && in tblcalc()
165 a2roffsu(dp->layout->wstr, &su, SCALE_EN) in tblcalc()
167 dp->layout->width = in tblcalc()
168 (*tbl->sulen)(&su, tbl->arg); in tblcalc()
169 if (col->width < dp->layout->width) in tblcalc()
170 col->width = dp->layout->width; in tblcalc()
171 if (dp->layout->spacing != SIZE_MAX && in tblcalc()
172 (col->spacing == SIZE_MAX || in tblcalc()
173 col->spacing < dp->layout->spacing)) in tblcalc()
174 col->spacing = dp->layout->spacing; in tblcalc()
177 * Calculate an automatic width. in tblcalc()
181 width = tblcalc_data(tbl, in tblcalc()
182 dp->hspans == 0 ? col : NULL, in tblcalc()
184 dp->block == 0 ? 0 : in tblcalc()
185 dp->layout->width ? dp->layout->width : in tblcalc()
186 rmargin ? (rmargin + sp->opts->cols / 2) in tblcalc()
187 / (sp->opts->cols + 1) : 0); in tblcalc()
188 if (dp->hspans == 0) in tblcalc()
194 * recording the minimum width for each group. in tblcalc()
198 while (*gp != NULL && ((*gp)->startcol != icol || in tblcalc()
199 (*gp)->endcol != icol + dp->hspans)) in tblcalc()
200 gp = &(*gp)->next; in tblcalc()
203 g->next = *gp; in tblcalc()
204 g->wanted = width; in tblcalc()
205 g->startcol = icol; in tblcalc()
206 g->endcol = icol + dp->hspans; in tblcalc()
208 } else if ((*gp)->wanted < width) in tblcalc()
209 (*gp)->wanted = width; in tblcalc()
214 * The minimum width of columns explicitly specified in tblcalc()
218 if (maxcol < sp_first->opts->cols - 1) in tblcalc()
219 maxcol = sp_first->opts->cols - 1; in tblcalc()
221 col = tbl->cols + icol; in tblcalc()
222 if (col->width < 1) in tblcalc()
223 col->width = 1; in tblcalc()
226 * Column spacings are needed for span width in tblcalc()
230 if (col->spacing == SIZE_MAX || icol == maxcol) in tblcalc()
231 col->spacing = 3; in tblcalc()
242 for (icol = g->startcol; icol <= g->endcol; icol++) { in tblcalc()
243 width = tbl->cols[icol].width; in tblcalc()
244 if (icol < g->endcol) in tblcalc()
245 width += tbl->cols[icol].spacing; in tblcalc()
246 if (g->wanted <= width) { in tblcalc()
250 g->wanted -= width; in tblcalc()
253 *gp = g->next; in tblcalc()
256 gp = &g->next; in tblcalc()
269 for (g = first_group; g != NULL; g = g->next) in tblcalc()
270 for (icol = g->startcol; icol <= g->endcol; icol++) in tblcalc()
271 colwidth[icol] = tbl->cols[icol].width; in tblcalc()
274 * Find the smallest and second smallest column width in tblcalc()
280 width = colwidth[icol]; in tblcalc()
281 if (min1 > width) { in tblcalc()
283 min1 = width; in tblcalc()
284 } else if (min1 < width && min2 > width) in tblcalc()
285 min2 = width; in tblcalc()
289 * Find the minimum wanted width in tblcalc()
291 * and mark the columns wanting that width. in tblcalc()
295 for (g = first_group; g != NULL; g = g->next) { in tblcalc()
297 for (icol = g->startcol; icol <= g->endcol; icol++) in tblcalc()
302 width = min1 + (g->wanted - 1) / necol + 1; in tblcalc()
303 if (width > min2) in tblcalc()
304 width = min2; in tblcalc()
305 if (wanted > width) in tblcalc()
306 wanted = width; in tblcalc()
314 for (icol = g->startcol; icol <= g->endcol; icol++) { in tblcalc()
317 if (g->wanted <= wanted - min1) { in tblcalc()
318 tbl->cols[icol].width += g->wanted; in tblcalc()
322 tbl->cols[icol].width = wanted; in tblcalc()
323 g->wanted -= wanted - min1; in tblcalc()
326 *gp = g->next; in tblcalc()
329 gp = &g->next; in tblcalc()
337 * Find maximum width of the columns to equalize. in tblcalc()
338 * Find total width of the columns *not* to maximize. in tblcalc()
344 col = tbl->cols + icol; in tblcalc()
345 if (col->width > col->nwidth) in tblcalc()
346 col->decimal += (col->width - col->nwidth) / 2; in tblcalc()
347 if (col->flags & TBL_CELL_EQUAL) { in tblcalc()
349 if (ewidth < col->width) in tblcalc()
350 ewidth = col->width; in tblcalc()
352 if (col->flags & TBL_CELL_WMAX) in tblcalc()
355 xwidth += col->width; in tblcalc()
360 * Update total width of the columns not to maximize. in tblcalc()
365 col = tbl->cols + icol; in tblcalc()
366 if ( ! (col->flags & TBL_CELL_EQUAL)) in tblcalc()
368 if (col->width == ewidth) in tblcalc()
371 xwidth += ewidth - col->width; in tblcalc()
372 col->width = ewidth; in tblcalc()
378 * available width, deducting 3n margins between columns. in tblcalc()
379 * Distribute the available width evenly. in tblcalc()
384 (opts->opts & (TBL_OPT_BOX | TBL_OPT_DBOX) ? in tblcalc()
385 2 : !!opts->lvert + !!opts->rvert); in tblcalc()
388 xwidth = rmargin - offset - xwidth; in tblcalc()
391 * Emulate a bug in GNU tbl width calculation that in tblcalc()
392 * manifests itself for large numbers of x-columns. in tblcalc()
393 * Emulating it for 5 x-columns gives identical in tblcalc()
394 * behaviour for up to 6 x-columns. in tblcalc()
400 quirkcol = -1; in tblcalc()
402 quirkcol = -1; in tblcalc()
407 col = tbl->cols + icol; in tblcalc()
408 if ( ! (col->flags & TBL_CELL_WMAX)) in tblcalc()
410 col->width = (double)xwidth * ++necol / nxcol in tblcalc()
411 - ewidth + 0.4995; in tblcalc()
413 col->width--; in tblcalc()
414 ewidth += col->width; in tblcalc()
425 /* Branch down into data sub-types. */ in tblcalc_data()
427 switch (dp->layout->pos) { in tblcalc_data()
430 sz = (*tbl->len)(1, tbl->arg); in tblcalc_data()
431 if (col != NULL && col->width < sz) in tblcalc_data()
432 col->width = sz; in tblcalc_data()
459 if (dp->string == NULL || *dp->string == '\0') in tblcalc_literal()
461 str = mw ? mandoc_strdup(dp->string) : dp->string; in tblcalc_literal()
470 wsz = (*tbl->slen)(beg, tbl->arg); in tblcalc_literal()
480 if (col != NULL && col->width < msz) in tblcalc_literal()
481 col->width = msz; in tblcalc_literal()
493 if (dp->string == NULL || *dp->string == '\0') in tblcalc_number()
496 totsz = (*tbl->slen)(dp->string, tbl->arg); in tblcalc_number()
507 for (cp = dp->string; cp[0] != '\0'; cp++) { in tblcalc_number()
511 } else if (cp[0] == opts->decimal && in tblcalc_number()
513 (cp > dp->string && isdigit((unsigned char)cp[-1])))) in tblcalc_number()
522 if (col != NULL && col->width < totsz) in tblcalc_number()
523 col->width = totsz; in tblcalc_number()
527 /* Measure the width of the integer part. */ in tblcalc_number()
533 for (cp = dp->string; cp < lastpoint; cp++) { in tblcalc_number()
535 intsz += (*tbl->slen)(buf, tbl->arg); in tblcalc_number()
544 if (intsz > col->decimal) { in tblcalc_number()
545 col->nwidth += intsz - col->decimal; in tblcalc_number()
546 col->decimal = intsz; in tblcalc_number()
548 totsz += col->decimal - intsz; in tblcalc_number()
550 /* Update the maximum total width seen so far. */ in tblcalc_number()
552 if (totsz > col->nwidth) in tblcalc_number()
553 col->nwidth = totsz; in tblcalc_number()
554 if (col->nwidth > col->width) in tblcalc_number()
555 col->width = col->nwidth; in tblcalc_number()