From d687586337f23b878d3678fc908d2c30b540a058 Mon Sep 17 00:00:00 2001 From: Ingo Schwarze Date: Wed, 14 Jun 2017 17:51:15 +0000 Subject: improve rounding rules for scaling units in horizontal orientation in the terminal formatter --- man_term.c | 12 ++++++------ mdoc_term.c | 8 ++++---- regress/man/HP/spacing.in | 4 ++-- regress/man/IP/width.in | 4 ++-- regress/man/RS/width.in | 4 ++-- regress/man/TP/width.in | 8 ++++---- regress/mdoc/Bd/offset-neg.in | 4 ++-- regress/mdoc/Bl/offset.in | 8 ++++---- regress/mdoc/Bl/offset.out_ascii | 4 ++-- regress/mdoc/Bl/offset.out_markdown | 4 ++-- regress/mdoc/Bl/tag.in | 4 ++-- regress/roff/esc/h.in | 2 ++ regress/roff/esc/h.out_ascii | 1 + regress/roff/esc/h.out_lint | 2 +- regress/roff/ta/basic-man.in | 3 +++ regress/roff/ta/basic-man.out_ascii | 2 ++ regress/roff/ti/basic-man.in | 4 ++-- regress/tbl/mod/width.in | 2 +- roff_term.c | 4 ++-- tbl_term.c | 4 ++-- term.c | 22 ++++++++++++++++++---- term.h | 3 ++- term_tab.c | 12 ++++-------- 23 files changed, 72 insertions(+), 53 deletions(-) diff --git a/man_term.c b/man_term.c index 7f026ce9..a2cc1f0c 100644 --- a/man_term.c +++ b/man_term.c @@ -1,4 +1,4 @@ -/* $Id: man_term.c,v 1.204 2017/06/08 12:54:58 schwarze Exp $ */ +/* $Id: man_term.c,v 1.205 2017/06/14 17:51:15 schwarze Exp $ */ /* * Copyright (c) 2008-2012 Kristaps Dzonsons * Copyright (c) 2010-2015, 2017 Ingo Schwarze @@ -377,7 +377,7 @@ pre_in(DECL_ARGS) if (a2roffsu(++cp, &su, SCALE_EN) == NULL) return 0; - v = (term_hspan(p, &su) + 11) / 24; + v = term_hen(p, &su); if (less < 0) p->tcol->offset -= p->tcol->offset > v ? v : p->tcol->offset; @@ -426,7 +426,7 @@ pre_HP(DECL_ARGS) if ((nn = n->parent->head->child) != NULL && a2roffsu(nn->string, &su, SCALE_EN) != NULL) { - len = term_hspan(p, &su) / 24; + len = term_hen(p, &su); if (len < 0 && (size_t)(-len) > mt->offset) len = -mt->offset; else if (len > SHRT_MAX) @@ -511,7 +511,7 @@ pre_IP(DECL_ARGS) if ((nn = n->parent->head->child) != NULL && (nn = nn->next) != NULL && a2roffsu(nn->string, &su, SCALE_EN) != NULL) { - len = term_hspan(p, &su) / 24; + len = term_hen(p, &su); if (len < 0 && (size_t)(-len) > mt->offset) len = -mt->offset; else if (len > SHRT_MAX) @@ -593,7 +593,7 @@ pre_TP(DECL_ARGS) if ((nn = n->parent->head->child) != NULL && nn->string != NULL && ! (NODE_LINE & nn->flags) && a2roffsu(nn->string, &su, SCALE_EN) != NULL) { - len = term_hspan(p, &su) / 24; + len = term_hen(p, &su); if (len < 0 && (size_t)(-len) > mt->offset) len = -mt->offset; else if (len > SHRT_MAX) @@ -797,7 +797,7 @@ pre_RS(DECL_ARGS) if (n->child == NULL) n->aux = mt->lmargin[mt->lmargincur]; else if (a2roffsu(n->child->string, &su, SCALE_EN) != NULL) - n->aux = term_hspan(p, &su) / 24; + n->aux = term_hen(p, &su); if (n->aux < 0 && (size_t)(-n->aux) > mt->offset) n->aux = -mt->offset; else if (n->aux > SHRT_MAX) diff --git a/mdoc_term.c b/mdoc_term.c index 471c52ca..4e420c5c 100644 --- a/mdoc_term.c +++ b/mdoc_term.c @@ -1,4 +1,4 @@ -/* $Id: mdoc_term.c,v 1.363 2017/06/08 12:54:58 schwarze Exp $ */ +/* $Id: mdoc_term.c,v 1.364 2017/06/14 17:51:15 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010, 2012-2017 Ingo Schwarze @@ -540,7 +540,7 @@ a2width(const struct termp *p, const char *v) SCALE_HS_INIT(&su, term_strlen(p, v)); su.scale /= term_strlen(p, "0"); } - return term_hspan(p, &su) / 24; + return term_hen(p, &su); } /* @@ -686,7 +686,7 @@ termp_it_pre(DECL_ARGS) SCALE_HS_INIT(&su, term_strlen(p, bl->norm->Bl.cols[i])); su.scale /= term_strlen(p, "0"); - offset += term_hspan(p, &su) / 24 + dcol; + offset += term_hen(p, &su) + dcol; } /* @@ -704,7 +704,7 @@ termp_it_pre(DECL_ARGS) */ SCALE_HS_INIT(&su, term_strlen(p, bl->norm->Bl.cols[i])); su.scale /= term_strlen(p, "0"); - width = term_hspan(p, &su) / 24 + dcol; + width = term_hen(p, &su) + dcol; break; default: if (NULL == bl->norm->Bl.width) diff --git a/regress/man/HP/spacing.in b/regress/man/HP/spacing.in index 0faec1b5..be511684 100644 --- a/regress/man/HP/spacing.in +++ b/regress/man/HP/spacing.in @@ -17,7 +17,7 @@ Each hanged paragraph gets a sufficient amount of text to wrap to the next line. .br And a second line. -.HP -4n +.HP -0.36i Each hanged paragraph gets a sufficient amount of text to wrap to the next line. .br @@ -42,7 +42,7 @@ Each hanged paragraph gets a sufficient amount of text to wrap to the next line. .br And a second line. -.HP 8n +.HP .76i Each hanged paragraph gets a sufficient amount of text to wrap to the next line. .br diff --git a/regress/man/IP/width.in b/regress/man/IP/width.in index 1c919a38..74372005 100644 --- a/regress/man/IP/width.in +++ b/regress/man/IP/width.in @@ -7,7 +7,7 @@ Regular mode: indented .br text -.IP tag -4n +.IP tag -0.36i indented .br text @@ -61,7 +61,7 @@ text .IP tag 2n indented text -.IP tag 3n +.IP tag 0.26i indented text .IP tag 4n diff --git a/regress/man/RS/width.in b/regress/man/RS/width.in index e723b583..bba4abc8 100644 --- a/regress/man/RS/width.in +++ b/regress/man/RS/width.in @@ -10,13 +10,13 @@ text .RE regular text -.RS -4n +.RS -0.36i indented text .RE regular text -.RS 4n +.RS 0.36i indented text .RE diff --git a/regress/man/TP/width.in b/regress/man/TP/width.in index 1ba99e40..2f4cb1f7 100644 --- a/regress/man/TP/width.in +++ b/regress/man/TP/width.in @@ -8,7 +8,7 @@ tag indented .br text -.TP -4n +.TP -0.36i tag indented .br @@ -23,7 +23,7 @@ tag indented .br text -.TP 2n +.TP 0.16i tag indented .br @@ -51,7 +51,7 @@ text .PP Literal mode: .nf -.TP -10n +.TP -0.96i tag indented text @@ -71,7 +71,7 @@ text tag indented text -.TP 3n +.TP 0.26i tag indented text diff --git a/regress/mdoc/Bd/offset-neg.in b/regress/mdoc/Bd/offset-neg.in index 30f0fe73..f1d0a2a1 100644 --- a/regress/mdoc/Bd/offset-neg.in +++ b/regress/mdoc/Bd/offset-neg.in @@ -6,9 +6,9 @@ .Nd indenting display blocks .Sh DESCRIPTION regular text -.Bd -ragged -offset 8n +.Bd -ragged -offset 0.76i outer display -.Bd -ragged -offset -5n +.Bd -ragged -offset -0.46i inner display .Ed outer display diff --git a/regress/mdoc/Bl/offset.in b/regress/mdoc/Bl/offset.in index 9564b105..923dd68f 100644 --- a/regress/mdoc/Bl/offset.in +++ b/regress/mdoc/Bl/offset.in @@ -57,9 +57,9 @@ Bl tag width Ds offset indent .It tag Bl tag width Ds offset indent-two .El -.Bl -tag -width Ds -offset 4n +.Bl -tag -width Ds -offset 0.36i .It tag -Bl tag width Ds offset 4n +Bl tag width Ds offset 0.36i .El .Bl -tag -width Ds -offset mystring .It tag @@ -73,7 +73,7 @@ Bl tag width Ds offset Ds .It tag Bl tag width Ds offset 78n .El -.Bl -tag -width Ds -offset -3n +.Bl -tag -width Ds -offset -0.26i .It tag -Bl tag width Ds offset -3n +Bl tag width Ds offset -0.26i .El diff --git a/regress/mdoc/Bl/offset.out_ascii b/regress/mdoc/Bl/offset.out_ascii index 8c871d44..22474aa5 100644 --- a/regress/mdoc/Bl/offset.out_ascii +++ b/regress/mdoc/Bl/offset.out_ascii @@ -33,7 +33,7 @@ DDEESSCCRRIIPPTTIIOONN tag Bl tag width Ds offset indent-two - tag Bl tag width Ds offset 4n + tag Bl tag width Ds offset 0.36i tag Bl tag width Ds offset mystring @@ -46,6 +46,6 @@ DDEESSCCRRIIPPTTIIOONN offset 78n - tag Bl tag width Ds offset -3n + tag Bl tag width Ds offset -0.26i OpenBSD December 25, 2014 OpenBSD diff --git a/regress/mdoc/Bl/offset.out_markdown b/regress/mdoc/Bl/offset.out_markdown index 807950be..a58ce6bc 100644 --- a/regress/mdoc/Bl/offset.out_markdown +++ b/regress/mdoc/Bl/offset.out_markdown @@ -42,7 +42,7 @@ tag tag -> Bl tag width Ds offset 4n +> Bl tag width Ds offset 0.36i tag @@ -58,6 +58,6 @@ tag tag -> Bl tag width Ds offset -3n +> Bl tag width Ds offset -0.26i OpenBSD - December 25, 2014 diff --git a/regress/mdoc/Bl/tag.in b/regress/mdoc/Bl/tag.in index 49cc903e..c7b99822 100644 --- a/regress/mdoc/Bl/tag.in +++ b/regress/mdoc/Bl/tag.in @@ -9,7 +9,7 @@ .It tag x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x .El -.Bl -tag -width -3n +.Bl -tag -width -0.26i .It tag x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x .El @@ -53,7 +53,7 @@ x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x .It quint x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x .El -.Bl -tag -width 5n +.Bl -tag -width 0.46i .It indent x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x .El diff --git a/regress/roff/esc/h.in b/regress/roff/esc/h.in index 4bc1953e..56e4275c 100644 --- a/regress/roff/esc/h.in +++ b/regress/roff/esc/h.in @@ -7,6 +7,8 @@ .Sh DESCRIPTION simple: >\h'0'< .br +rounding: >\h'0.16i'< +.br escape only: >\h'\w'\&'M'< .br escape at the end: >\h'0+\w'\&''< diff --git a/regress/roff/esc/h.out_ascii b/regress/roff/esc/h.out_ascii index 858dcf32..ae378a45 100644 --- a/regress/roff/esc/h.out_ascii +++ b/regress/roff/esc/h.out_ascii @@ -5,6 +5,7 @@ NNAAMMEE DDEESSCCRRIIPPTTIIOONN simple: >< + rounding: > < escape only: >< escape at the end: >< escape at the beginning: >< diff --git a/regress/roff/esc/h.out_lint b/regress/roff/esc/h.out_lint index 6e2eb342..b7facfb1 100644 --- a/regress/roff/esc/h.out_lint +++ b/regress/roff/esc/h.out_lint @@ -1,2 +1,2 @@ -mandoc: h.in:18:21: WARNING: invalid escape sequence: \h- +mandoc: h.in:20:21: WARNING: invalid escape sequence: \h- mandoc: h.in:1:5: STYLE: Mdocdate missing: Dd May diff --git a/regress/roff/ta/basic-man.in b/regress/roff/ta/basic-man.in index f2f4641d..db0644a7 100644 --- a/regress/roff/ta/basic-man.in +++ b/regress/roff/ta/basic-man.in @@ -17,3 +17,6 @@ none: default unit: .ta 3 +4 12 1 2 3 4 +rounding: +.ta 0.26i T 1c +1 2 3 4 5 6 7 8 9 diff --git a/regress/roff/ta/basic-man.out_ascii b/regress/roff/ta/basic-man.out_ascii index 37062245..659422f2 100644 --- a/regress/roff/ta/basic-man.out_ascii +++ b/regress/roff/ta/basic-man.out_ascii @@ -16,6 +16,8 @@ DDEESSCCRRIIPPTTIIOONN 1 2 3 4 5 6 7 8 9 default unit: 1 2 3 4 + rounding: + 1 2 3 4 5 6 7 8 9 diff --git a/regress/roff/ti/basic-man.in b/regress/roff/ti/basic-man.in index deb1542f..d4f00a01 100644 --- a/regress/roff/ti/basic-man.in +++ b/regress/roff/ti/basic-man.in @@ -3,14 +3,14 @@ ti-basic-man \- temporary indentation in man(7) .SH DESCRIPTION initial text -.ti 10n +.ti 0.96i This text is indented. However, the indent is temporary, so as soon as the line wraps, it is gone. .ti +10n The temporary indent can be relative. All the same, it will expire in the usual way. -.ti -3n +.ti -0.26i It is also possible to temporarily reduce the indentation, but that will also last until the next line break only. .ti -10n diff --git a/regress/tbl/mod/width.in b/regress/tbl/mod/width.in index 702dd19e..46306089 100644 --- a/regress/tbl/mod/width.in +++ b/regress/tbl/mod/width.in @@ -5,7 +5,7 @@ tbl-mod-width \- width modifier in table layout normal text .TS box tab(:); -lw2 | lw(2n) | lw(0.2i) | lw2 . +lw2 | lw(2n) | lw(0.16i) | lw2 . a:abcd:T{ a T}:T{ diff --git a/roff_term.c b/roff_term.c index bfcb2d0f..db59db08 100644 --- a/roff_term.c +++ b/roff_term.c @@ -1,4 +1,4 @@ -/* $Id: roff_term.c,v 1.11 2017/06/14 13:00:31 schwarze Exp $ */ +/* $Id: roff_term.c,v 1.12 2017/06/14 17:51:15 schwarze Exp $ */ /* * Copyright (c) 2010, 2014, 2015, 2017 Ingo Schwarze * @@ -205,7 +205,7 @@ roff_term_pre_ti(ROFF_TERM_ARGS) if (a2roffsu(cp, &su, SCALE_EM) == NULL) return; - len = term_hspan(p, &su) / 24; + len = term_hen(p, &su); if (sign == 0) { p->ti = len - p->tcol->offset; diff --git a/tbl_term.c b/tbl_term.c index 4104f0ad..c7c1b07c 100644 --- a/tbl_term.c +++ b/tbl_term.c @@ -1,4 +1,4 @@ -/* $Id: tbl_term.c,v 1.51 2017/06/13 14:39:13 schwarze Exp $ */ +/* $Id: tbl_term.c,v 1.52 2017/06/14 17:51:15 schwarze Exp $ */ /* * Copyright (c) 2009, 2011 Kristaps Dzonsons * Copyright (c) 2011,2012,2014,2015,2017 Ingo Schwarze @@ -47,7 +47,7 @@ static void tbl_word(struct termp *, const struct tbl_dat *); static size_t term_tbl_sulen(const struct roffsu *su, void *arg) { - return term_hspan((const struct termp *)arg, su) / 24; + return term_hen((const struct termp *)arg, su); } static size_t diff --git a/term.c b/term.c index 4a227988..e0308dd9 100644 --- a/term.c +++ b/term.c @@ -1,4 +1,4 @@ -/* $Id: term.c,v 1.270 2017/06/14 01:31:27 schwarze Exp $ */ +/* $Id: term.c,v 1.271 2017/06/14 17:51:15 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010-2017 Ingo Schwarze @@ -528,7 +528,7 @@ term_word(struct termp *p, const char *word) case ESCAPE_HORIZ: if (a2roffsu(seq, &su, SCALE_EM) == NULL) continue; - uc = term_hspan(p, &su) / 24; + uc = term_hen(p, &su); if (uc > 0) while (uc-- > 0) bufferc(p, ASCII_NBRSP); @@ -549,7 +549,7 @@ term_word(struct termp *p, const char *word) case ESCAPE_HLINE: if ((seq = a2roffsu(seq, &su, SCALE_EM)) == NULL) continue; - uc = term_hspan(p, &su) / 24; + uc = term_hen(p, &su); if (uc <= 0) { if (p->tcol->rmargin <= p->tcol->offset) continue; @@ -966,7 +966,7 @@ term_vspan(const struct termp *p, const struct roffsu *su) } /* - * Convert a scaling width to basic units, rounding down. + * Convert a scaling width to basic units, rounding towards 0. */ int term_hspan(const struct termp *p, const struct roffsu *su) @@ -974,3 +974,17 @@ term_hspan(const struct termp *p, const struct roffsu *su) return (*p->hspan)(p, su); } + +/* + * Convert a scaling width to basic units, rounding to closest. + */ +int +term_hen(const struct termp *p, const struct roffsu *su) +{ + int bu; + + if ((bu = (*p->hspan)(p, su)) >= 0) + return (bu + 11) / 24; + else + return -((-bu + 11) / 24); +} diff --git a/term.h b/term.h index f06bbd87..dc5702f6 100644 --- a/term.h +++ b/term.h @@ -1,4 +1,4 @@ -/* $Id: term.h,v 1.127 2017/06/12 19:05:47 schwarze Exp $ */ +/* $Id: term.h,v 1.128 2017/06/14 17:51:15 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2011-2015, 2017 Ingo Schwarze @@ -140,6 +140,7 @@ void term_end(struct termp *); void term_setwidth(struct termp *, const char *); int term_hspan(const struct termp *, const struct roffsu *); +int term_hen(const struct termp *, const struct roffsu *); int term_vspan(const struct termp *, const struct roffsu *); size_t term_strlen(const struct termp *, const char *); size_t term_len(const struct termp *, size_t); diff --git a/term_tab.c b/term_tab.c index 88c47c18..2acfd46a 100644 --- a/term_tab.c +++ b/term_tab.c @@ -52,7 +52,7 @@ term_tab_set(const struct termp *p, const char *arg) recording_period = 0; if (tabs.d == 0) { a2roffsu(".8i", &su, SCALE_IN); - tabs.d = term_hspan(p, &su) / 24; + tabs.d = term_hen(p, &su); } return; } @@ -81,7 +81,7 @@ term_tab_set(const struct termp *p, const char *arg) /* Append the new position. */ - pos = term_hspan(p, &su); + pos = term_hen(p, &su); tl->t[tl->n] = pos; if (add && tl->n) tl->t[tl->n] += tl->t[tl->n - 1]; @@ -97,10 +97,6 @@ term_tab_next(size_t prev) if (i == tabs.a.n) { if (tabs.p.n == 0) return prev; -/* - return i ? prev : - (prev / tabs.d + 1) * tabs.d; - */ tabs.a.n += tabs.p.n; if (tabs.a.s < tabs.a.n) { tabs.a.s = tabs.a.n; @@ -111,7 +107,7 @@ term_tab_next(size_t prev) tabs.a.t[i + j] = tabs.p.t[j] + (i ? tabs.a.t[i - 1] : 0); } - if (prev < tabs.a.t[i] / 24) - return tabs.a.t[i] / 24; + if (prev < tabs.a.t[i]) + return tabs.a.t[i]; } } -- cgit v1.2.3-56-ge451