summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2017-06-14 17:51:15 +0000
committerIngo Schwarze <schwarze@openbsd.org>2017-06-14 17:51:15 +0000
commit29dca53ec230c4b598c402ca964e308ca2dd627f (patch)
tree6a59b819bf4540af0b4a051be1fed72ff1323f83
parent249038d8e46090d651314d34d995078a1aeb6ee9 (diff)
downloadmandoc-29dca53ec230c4b598c402ca964e308ca2dd627f.tar.gz
improve rounding rules for scaling units
in horizontal orientation in the terminal formatter
-rw-r--r--man_term.c10
-rw-r--r--mdoc_term.c6
-rw-r--r--regress/man/HP/spacing.in4
-rw-r--r--regress/man/IP/width.in4
-rw-r--r--regress/man/RS/width.in4
-rw-r--r--regress/man/TP/width.in8
-rw-r--r--regress/mdoc/Bd/offset-neg.in4
-rw-r--r--regress/mdoc/Bl/offset.in8
-rw-r--r--regress/mdoc/Bl/offset.out_ascii4
-rw-r--r--regress/mdoc/Bl/offset.out_markdown4
-rw-r--r--regress/mdoc/Bl/tag.in4
-rw-r--r--regress/roff/esc/h.in2
-rw-r--r--regress/roff/esc/h.out_ascii1
-rw-r--r--regress/roff/esc/h.out_lint2
-rw-r--r--regress/roff/ta/basic-man.in3
-rw-r--r--regress/roff/ta/basic-man.out_ascii2
-rw-r--r--regress/roff/ti/basic-man.in4
-rw-r--r--regress/tbl/mod/width.in2
-rw-r--r--roff_term.c2
-rw-r--r--tbl_term.c2
-rw-r--r--term.c20
-rw-r--r--term.h1
-rw-r--r--term_tab.c12
23 files changed, 66 insertions, 47 deletions
diff --git a/man_term.c b/man_term.c
index 763a3949..11431079 100644
--- a/man_term.c
+++ b/man_term.c
@@ -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 9058f055..2f0728ff 100644
--- a/mdoc_term.c
+++ b/mdoc_term.c
@@ -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 83c2b16e..59de74fc 100644
--- a/roff_term.c
+++ b/roff_term.c
@@ -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 d0228b32..69d91eb2 100644
--- a/tbl_term.c
+++ b/tbl_term.c
@@ -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 a7236f87..c91ac2f2 100644
--- a/term.c
+++ b/term.c
@@ -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 25735631..a9131e46 100644
--- a/term.h
+++ b/term.h
@@ -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];
}
}