summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--regress/usr.bin/mandoc/man/HP/spacing.in49
-rw-r--r--regress/usr.bin/mandoc/man/HP/spacing.out_ascii37
-rw-r--r--regress/usr.bin/mandoc/man/IP/width.in21
-rw-r--r--regress/usr.bin/mandoc/man/IP/width.out_ascii24
-rw-r--r--regress/usr.bin/mandoc/man/RS/width.in16
-rw-r--r--regress/usr.bin/mandoc/man/RS/width.out_ascii8
-rw-r--r--regress/usr.bin/mandoc/man/TP/width.in29
-rw-r--r--regress/usr.bin/mandoc/man/TP/width.out_ascii26
-rw-r--r--regress/usr.bin/mandoc/roff/scale/horiz.in2
-rw-r--r--regress/usr.bin/mandoc/roff/scale/horiz.out_ascii1
-rw-r--r--usr.bin/mandoc/man_term.c178
-rw-r--r--usr.bin/mandoc/mdoc_html.c10
-rw-r--r--usr.bin/mandoc/mdoc_man.c6
-rw-r--r--usr.bin/mandoc/mdoc_term.c5
-rw-r--r--usr.bin/mandoc/out.c5
-rw-r--r--usr.bin/mandoc/term.c24
-rw-r--r--usr.bin/mandoc/term.h8
17 files changed, 275 insertions, 174 deletions
diff --git a/regress/usr.bin/mandoc/man/HP/spacing.in b/regress/usr.bin/mandoc/man/HP/spacing.in
index 5a9614f1b01..485fae9a97f 100644
--- a/regress/usr.bin/mandoc/man/HP/spacing.in
+++ b/regress/usr.bin/mandoc/man/HP/spacing.in
@@ -1,28 +1,37 @@
-.TH HP-SPACING 1 "November 20, 2014" OpenBSD
+.TH HP-SPACING 1 "December 23, 2014" OpenBSD
.SH NAME
HP-spacing \- spacing in hanged lists
.SH DESCRIPTION
Normal text.
.HP
-tag
-Indented text.
-.HP
-four
-Indented text.
-.HP
-ffive
-Indented text.
-.HP
-sixsix
-Indented text.
-.HP
-seseven
-Indented text.
-.HP
-a much longer tag
-Indented text.
+Each hanged paragraph gets a sufficient amount of text
+to wrap to the next line.
+.HP -10n
+Each hanged paragraph gets a sufficient amount of text
+to wrap to the next line.
+.HP -4n
+Each hanged paragraph gets a sufficient amount of text
+to wrap to the next line.
+.HP 0n
+Each hanged paragraph gets a sufficient amount of text
+to wrap to the next line.
+.HP 1n
+Each hanged paragraph gets a sufficient amount of text
+to wrap to the next line.
+.HP 2n
+Each hanged paragraph gets a sufficient amount of text
+to wrap to the next line.
+.HP 4n
+Each hanged paragraph gets a sufficient amount of text
+to wrap to the next line.
+.HP 8n
+Each hanged paragraph gets a sufficient amount of text
+to wrap to the next line.
+.HP 16n
+Each hanged paragraph gets a sufficient amount of text
+to wrap to the next line.
.HP 78n
-Testing a hanged paragraph with a large indentation width,
-in this case 78n, requires more text.
+Each hanged paragraph gets a sufficient amount of text
+to wrap to the next line.
.LP
Normal text.
diff --git a/regress/usr.bin/mandoc/man/HP/spacing.out_ascii b/regress/usr.bin/mandoc/man/HP/spacing.out_ascii
index d4f50d42b54..7697cffcfea 100644
--- a/regress/usr.bin/mandoc/man/HP/spacing.out_ascii
+++ b/regress/usr.bin/mandoc/man/HP/spacing.out_ascii
@@ -8,26 +8,39 @@ NNAAMMEE
DDEESSCCRRIIPPTTIIOONN
Normal text.
- tag Indented text.
+ Each hanged paragraph gets a sufficient amount of text to wrap to the
+ next line.
- four Indented text.
+ Each hanged paragraph gets a sufficient amount of text to wrap to the
+next line.
- ffive Indented text.
+ Each hanged paragraph gets a sufficient amount of text to wrap to the
+ next line.
- sixsix Indented text.
+ Each hanged paragraph gets a sufficient amount of text to wrap to the
+ next line.
- seseven Indented text.
+ Each hanged paragraph gets a sufficient amount of text to wrap to the
+ next line.
- a much longer tag Indented text.
+ Each hanged paragraph gets a sufficient amount of text to wrap to the
+ next line.
- Testing a hanged paragraph with a large indentation width, in this case
- 78n,
- requires
- more
- text.
+ Each hanged paragraph gets a sufficient amount of text to wrap to the
+ next line.
+
+ Each hanged paragraph gets a sufficient amount of text to wrap to the
+ next line.
+
+ Each hanged paragraph gets a sufficient amount of text to wrap to the
+ next line.
+
+ Each hanged paragraph gets a sufficient amount of text to wrap to the
+ next
+ line.
Normal text.
-OpenBSD November 20, 2014 HP-SPACING(1)
+OpenBSD December 23, 2014 HP-SPACING(1)
diff --git a/regress/usr.bin/mandoc/man/IP/width.in b/regress/usr.bin/mandoc/man/IP/width.in
index 8c30b93b15e..1c919a386f6 100644
--- a/regress/usr.bin/mandoc/man/IP/width.in
+++ b/regress/usr.bin/mandoc/man/IP/width.in
@@ -3,6 +3,18 @@
IP-width \- indentation width of indented paragraphs
.SH DESCRIPTION
Regular mode:
+.IP tag -10n
+indented
+.br
+text
+.IP tag -4n
+indented
+.br
+text
+.IP tag 0n
+indented
+.br
+text
.IP tag 1n
indented
.br
@@ -34,6 +46,15 @@ text
.PP
Literal mode:
.nf
+.IP tag -10n
+indented
+text
+.IP tag -4n
+indented
+text
+.IP tag 0n
+indented
+text
.IP tag 1n
indented
text
diff --git a/regress/usr.bin/mandoc/man/IP/width.out_ascii b/regress/usr.bin/mandoc/man/IP/width.out_ascii
index 83a6e32229c..a867ba70471 100644
--- a/regress/usr.bin/mandoc/man/IP/width.out_ascii
+++ b/regress/usr.bin/mandoc/man/IP/width.out_ascii
@@ -9,6 +9,18 @@ DDEESSCCRRIIPPTTIIOONN
Regular mode:
tag
+indented
+text
+
+ tag
+ indented
+ text
+
+ tag
+ indented
+ text
+
+ tag
indented
text
@@ -35,6 +47,18 @@ DDEESSCCRRIIPPTTIIOONN
Literal mode:
tag
+indented
+text
+
+ tag
+ indented
+ text
+
+ tag
+ indented
+ text
+
+ tag
indented
text
diff --git a/regress/usr.bin/mandoc/man/RS/width.in b/regress/usr.bin/mandoc/man/RS/width.in
index 7dc19dad9e8..c6b1dbf5e2c 100644
--- a/regress/usr.bin/mandoc/man/RS/width.in
+++ b/regress/usr.bin/mandoc/man/RS/width.in
@@ -1,9 +1,21 @@
-.TH RS-WIDTH 1 "February 16, 2014" OpenBSD
+.TH RS-WIDTH 1 "December 23, 2014" OpenBSD
.SH NAME
-RS-width \- excessive indentation
+RS-width \- negative and excessive indentation
.SH DESCRIPTION
regular
text
+.RS -4n
+indented
+text
+.RE
+regular
+text
+.RS 4n
+indented
+text
+.RE
+regular
+text
.RS 100n
indented
text
diff --git a/regress/usr.bin/mandoc/man/RS/width.out_ascii b/regress/usr.bin/mandoc/man/RS/width.out_ascii
index 35efea8094e..95951e55956 100644
--- a/regress/usr.bin/mandoc/man/RS/width.out_ascii
+++ b/regress/usr.bin/mandoc/man/RS/width.out_ascii
@@ -3,14 +3,18 @@ RS-WIDTH(1) General Commands Manual RS-WIDTH(1)
NNAAMMEE
- RS-width - excessive indentation
+ RS-width - negative and excessive indentation
DDEESSCCRRIIPPTTIIOONN
regular text
+ indented text
+ regular text
+ indented text
+ regular text
indented
text
regular text
-OpenBSD February 16, 2014 RS-WIDTH(1)
+OpenBSD December 23, 2014 RS-WIDTH(1)
diff --git a/regress/usr.bin/mandoc/man/TP/width.in b/regress/usr.bin/mandoc/man/TP/width.in
index d57aa0049b5..1ba99e402b7 100644
--- a/regress/usr.bin/mandoc/man/TP/width.in
+++ b/regress/usr.bin/mandoc/man/TP/width.in
@@ -1,8 +1,23 @@
-.TH TP-WIDTH 1 "February 16, 2014" OpenBSD
+.TH TP-WIDTH 1 "December 23, 2014" OpenBSD
.SH NAME
TP-width \- indentation width of indented paragraphs
.SH DESCRIPTION
Regular mode:
+.TP -10n
+tag
+indented
+.br
+text
+.TP -4n
+tag
+indented
+.br
+text
+.TP 0n
+tag
+indented
+.br
+text
.TP 1n
tag
indented
@@ -36,6 +51,18 @@ text
.PP
Literal mode:
.nf
+.TP -10n
+tag
+indented
+text
+.TP -4n
+tag
+indented
+text
+.TP 0n
+tag
+indented
+text
.TP 1n
tag
indented
diff --git a/regress/usr.bin/mandoc/man/TP/width.out_ascii b/regress/usr.bin/mandoc/man/TP/width.out_ascii
index f726f8fca30..fea6388394f 100644
--- a/regress/usr.bin/mandoc/man/TP/width.out_ascii
+++ b/regress/usr.bin/mandoc/man/TP/width.out_ascii
@@ -9,6 +9,18 @@ DDEESSCCRRIIPPTTIIOONN
Regular mode:
tag
+indented
+text
+
+ tag
+ indented
+ text
+
+ tag
+ indented
+ text
+
+ tag
indented
text
@@ -32,6 +44,18 @@ DDEESSCCRRIIPPTTIIOONN
Literal mode:
tag
+indented
+text
+
+ tag
+ indented
+ text
+
+ tag
+ indented
+ text
+
+ tag
indented
text
@@ -54,4 +78,4 @@ DDEESSCCRRIIPPTTIIOONN
-OpenBSD February 16, 2014 TP-WIDTH(1)
+OpenBSD December 23, 2014 TP-WIDTH(1)
diff --git a/regress/usr.bin/mandoc/roff/scale/horiz.in b/regress/usr.bin/mandoc/roff/scale/horiz.in
index f3b36652019..edba2f755f9 100644
--- a/regress/usr.bin/mandoc/roff/scale/horiz.in
+++ b/regress/usr.bin/mandoc/roff/scale/horiz.in
@@ -25,5 +25,7 @@ initial text
79n
.in 1.5ix
1.5ix
+.in -6n
+-6n
.PP
final text
diff --git a/regress/usr.bin/mandoc/roff/scale/horiz.out_ascii b/regress/usr.bin/mandoc/roff/scale/horiz.out_ascii
index 8db827eb1e3..75e12a4f323 100644
--- a/regress/usr.bin/mandoc/roff/scale/horiz.out_ascii
+++ b/regress/usr.bin/mandoc/roff/scale/horiz.out_ascii
@@ -18,6 +18,7 @@ DDEESSCCRRIIPPTTIIOONN
5m
79n
1.5ix
+ -6n
final text
diff --git a/usr.bin/mandoc/man_term.c b/usr.bin/mandoc/man_term.c
index 06340e2a232..68324f294c3 100644
--- a/usr.bin/mandoc/man_term.c
+++ b/usr.bin/mandoc/man_term.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: man_term.c,v 1.115 2014/12/23 09:31:17 schwarze Exp $ */
+/* $OpenBSD: man_term.c,v 1.116 2014/12/23 13:48:15 schwarze Exp $ */
/*
* Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -35,7 +35,7 @@
struct mtermp {
int fl;
#define MANT_LITERAL (1 << 0)
- size_t lmargin[MAXMARGINS]; /* margins (incl. visible page) */
+ int lmargin[MAXMARGINS]; /* margins (incl. vis. page) */
int lmargincur; /* index of current margin */
int lmarginsz; /* actual number of nested margins */
size_t offset; /* default offset to visible page */
@@ -54,8 +54,6 @@ struct termact {
#define MAN_NOTEXT (1 << 0) /* Never has text children. */
};
-static int a2width(const struct termp *, const char *);
-
static void print_man_nodelist(DECL_ARGS);
static void print_man_node(DECL_ARGS);
static void print_man_head(struct termp *, const void *);
@@ -181,17 +179,6 @@ terminal_man(void *arg, const struct man *man)
}
}
-static int
-a2width(const struct termp *p, const char *cp)
-{
- struct roffsu su;
-
- if ( ! a2roffsu(cp, &su, SCALE_EN))
- return(-1);
-
- return((int)term_hspan(p, &su));
-}
-
/*
* Printing leading vertical space before a block.
* This is used for the paragraph macros.
@@ -410,9 +397,10 @@ pre_ft(DECL_ARGS)
static int
pre_in(DECL_ARGS)
{
- int len, less;
- size_t v;
+ struct roffsu su;
const char *cp;
+ size_t v;
+ int less;
term_newln(p);
@@ -431,10 +419,10 @@ pre_in(DECL_ARGS)
else
cp--;
- if ((len = a2width(p, ++cp)) < 0)
+ if ( ! a2roffsu(++cp, &su, SCALE_EN))
return(0);
- v = (size_t)len;
+ v = term_hspan(p, &su);
if (less < 0)
p->offset -= p->offset > v ? v : p->offset;
@@ -450,9 +438,7 @@ static int
pre_sp(DECL_ARGS)
{
struct roffsu su;
- char *s;
- size_t i, len;
- int neg;
+ int i, len;
if ((NULL == n->prev && n->parent)) {
switch (n->parent->tok) {
@@ -472,31 +458,20 @@ pre_sp(DECL_ARGS)
}
}
- neg = 0;
- switch (n->tok) {
- case MAN_br:
+ if (n->tok == MAN_br)
len = 0;
- break;
- default:
- if (NULL == n->child) {
- len = 1;
- break;
- }
- s = n->child->string;
- if ('-' == *s) {
- neg = 1;
- s++;
- }
- if ( ! a2roffsu(s, &su, SCALE_VS))
+ else if (n->child == NULL)
+ len = 1;
+ else {
+ if ( ! a2roffsu(n->child->string, &su, SCALE_VS))
su.scale = 1.0;
len = term_vspan(p, &su);
- break;
}
- if (0 == len)
+ if (len == 0)
term_newln(p);
- else if (neg)
- p->skipvsp += len;
+ else if (len < 0)
+ p->skipvsp -= len;
else
for (i = 0; i < len; i++)
term_vspace(p);
@@ -507,9 +482,9 @@ pre_sp(DECL_ARGS)
static int
pre_HP(DECL_ARGS)
{
- size_t len, one;
- int ival;
+ struct roffsu su;
const struct man_node *nn;
+ int len;
switch (n->type) {
case MAN_BLOCK:
@@ -526,24 +501,20 @@ pre_HP(DECL_ARGS)
p->trailspace = 2;
}
- len = mt->lmargin[mt->lmargincur];
- ival = -1;
-
/* Calculate offset. */
- if (NULL != (nn = n->parent->head->child))
- if ((ival = a2width(p, nn->string)) >= 0)
- len = (size_t)ival;
-
- one = term_len(p, 1);
- if (len < one)
- len = one;
+ if ((nn = n->parent->head->child) != NULL &&
+ a2roffsu(nn->string, &su, SCALE_EN)) {
+ len = term_hspan(p, &su);
+ mt->lmargin[mt->lmargincur] = len;
+ } else
+ len = mt->lmargin[mt->lmargincur];
p->offset = mt->offset;
- p->rmargin = mt->offset + len;
-
- if (ival >= 0)
- mt->lmargin[mt->lmargincur] = (size_t)ival;
+ if (len > 0 || (size_t)(-len) < mt->offset)
+ p->rmargin = mt->offset + len;
+ else
+ p->rmargin = 0;
return(1);
}
@@ -585,9 +556,9 @@ pre_PP(DECL_ARGS)
static int
pre_IP(DECL_ARGS)
{
+ struct roffsu su;
const struct man_node *nn;
- size_t len;
- int savelit, ival;
+ int len, savelit;
switch (n->type) {
case MAN_BODY:
@@ -604,28 +575,22 @@ pre_IP(DECL_ARGS)
return(1);
}
- len = mt->lmargin[mt->lmargincur];
- ival = -1;
-
/* Calculate the offset from the optional second argument. */
- if (NULL != (nn = n->parent->head->child))
- if (NULL != (nn = nn->next))
- if ((ival = a2width(p, nn->string)) >= 0)
- len = (size_t)ival;
+ if ((nn = n->parent->head->child) != NULL &&
+ (nn = nn->next) != NULL &&
+ a2roffsu(nn->string, &su, SCALE_EN)) {
+ len = term_hspan(p, &su);
+ mt->lmargin[mt->lmargincur] = len;
+ if (len < 0 && (size_t)(-len) > mt->offset)
+ len = -mt->offset;
+ } else
+ len = mt->lmargin[mt->lmargincur];
switch (n->type) {
case MAN_HEAD:
- /* Handle zero-width lengths. */
- if (0 == len)
- len = term_len(p, 1);
-
p->offset = mt->offset;
p->rmargin = mt->offset + len;
- /* Set the saved left-margin. */
- if (ival >= 0)
- mt->lmargin[mt->lmargincur] = (size_t)ival;
-
savelit = MANT_LITERAL & mt->fl;
mt->fl &= ~MANT_LITERAL;
@@ -670,9 +635,9 @@ post_IP(DECL_ARGS)
static int
pre_TP(DECL_ARGS)
{
+ struct roffsu su;
const struct man_node *nn;
- size_t len;
- int savelit, ival;
+ int len, savelit;
switch (n->type) {
case MAN_HEAD:
@@ -689,22 +654,20 @@ pre_TP(DECL_ARGS)
return(1);
}
- len = (size_t)mt->lmargin[mt->lmargincur];
- ival = -1;
-
/* Calculate offset. */
- if (NULL != (nn = n->parent->head->child))
- if (nn->string && 0 == (MAN_LINE & nn->flags))
- if ((ival = a2width(p, nn->string)) >= 0)
- len = (size_t)ival;
+ if ((nn = n->parent->head->child) != NULL &&
+ nn->string != NULL && ! (MAN_LINE & nn->flags) &&
+ a2roffsu(nn->string, &su, SCALE_EN)) {
+ len = term_hspan(p, &su);
+ mt->lmargin[mt->lmargincur] = len;
+ if (len < 0 && (size_t)(-len) > mt->offset)
+ len = -mt->offset;
+ } else
+ len = mt->lmargin[mt->lmargincur];
switch (n->type) {
case MAN_HEAD:
- /* Handle zero-length properly. */
- if (0 == len)
- len = term_len(p, 1);
-
p->offset = mt->offset;
p->rmargin = mt->offset + len;
@@ -723,9 +686,6 @@ pre_TP(DECL_ARGS)
if (savelit)
mt->fl |= MANT_LITERAL;
- if (ival >= 0)
- mt->lmargin[mt->lmargincur] = (size_t)ival;
-
return(0);
case MAN_BODY:
p->offset = mt->offset + len;
@@ -870,8 +830,8 @@ post_SH(DECL_ARGS)
static int
pre_RS(DECL_ARGS)
{
- int ival;
- size_t sz;
+ struct roffsu su;
+ int len;
switch (n->type) {
case MAN_BLOCK:
@@ -883,13 +843,16 @@ pre_RS(DECL_ARGS)
break;
}
- sz = term_len(p, p->defindent);
-
- if (NULL != (n = n->parent->head->child))
- if ((ival = a2width(p, n->string)) >= 0)
- sz = (size_t)ival;
+ if ((n = n->parent->head->child) != NULL &&
+ a2roffsu(n->string, &su, SCALE_EN))
+ len = term_hspan(p, &su);
+ else
+ len = term_len(p, p->defindent);
- mt->offset += sz;
+ if (len > 0 || (size_t)(-len) < mt->offset)
+ mt->offset += len;
+ else
+ mt->offset = 0;
p->offset = mt->offset;
p->rmargin = p->maxrmargin;
@@ -903,8 +866,8 @@ pre_RS(DECL_ARGS)
static void
post_RS(DECL_ARGS)
{
- int ival;
- size_t sz;
+ struct roffsu su;
+ int len;
switch (n->type) {
case MAN_BLOCK:
@@ -916,13 +879,16 @@ post_RS(DECL_ARGS)
break;
}
- sz = term_len(p, p->defindent);
-
- if (NULL != (n = n->parent->head->child))
- if ((ival = a2width(p, n->string)) >= 0)
- sz = (size_t)ival;
+ if ((n = n->parent->head->child) != NULL &&
+ a2roffsu(n->string, &su, SCALE_EN))
+ len = term_hspan(p, &su);
+ else
+ len = term_len(p, p->defindent);
- mt->offset = mt->offset < sz ? 0 : mt->offset - sz;
+ if (len < 0 || (size_t)len < mt->offset)
+ mt->offset -= len;
+ else
+ mt->offset = 0;
p->offset = mt->offset;
if (--mt->lmarginsz < MAXMARGINS)
diff --git a/usr.bin/mandoc/mdoc_html.c b/usr.bin/mandoc/mdoc_html.c
index 05b678b2d26..4647aa41443 100644
--- a/usr.bin/mandoc/mdoc_html.c
+++ b/usr.bin/mandoc/mdoc_html.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mdoc_html.c,v 1.92 2014/12/23 09:31:17 schwarze Exp $ */
+/* $OpenBSD: mdoc_html.c,v 1.93 2014/12/23 13:48:15 schwarze Exp $ */
/*
* Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -280,7 +280,8 @@ a2width(const char *p, struct roffsu *su)
if (a2roffsu(p, su, SCALE_MAX) < 2) {
su->unit = SCALE_EN;
su->scale = html_strlen(p);
- }
+ } else if (su->scale < 0.0)
+ su->scale = 0.0;
}
/*
@@ -1564,9 +1565,12 @@ mdoc_sp_pre(MDOC_ARGS)
SCALE_VS_INIT(&su, 1);
if (MDOC_sp == n->tok) {
- if (NULL != (n = n->child))
+ if (NULL != (n = n->child)) {
if ( ! a2roffsu(n->string, &su, SCALE_VS))
su.scale = 1.0;
+ else if (su.scale < 0.0)
+ su.scale = 0.0;
+ }
} else
su.scale = 0.0;
diff --git a/usr.bin/mandoc/mdoc_man.c b/usr.bin/mandoc/mdoc_man.c
index 5151b3a4b00..28cede1fd0b 100644
--- a/usr.bin/mandoc/mdoc_man.c
+++ b/usr.bin/mandoc/mdoc_man.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mdoc_man.c,v 1.77 2014/12/23 10:09:23 schwarze Exp $ */
+/* $OpenBSD: mdoc_man.c,v 1.78 2014/12/23 13:48:15 schwarze Exp $ */
/*
* Copyright (c) 2011, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>
*
@@ -433,6 +433,8 @@ print_offs(const char *v, int keywords)
else if (keywords && !strcmp(v, "indent-two"))
sz = 12;
else if (a2roffsu(v, &su, SCALE_EN) > 1) {
+ if (su.scale < 0.0)
+ su.scale = 0.0;
if (SCALE_EN == su.unit)
sz = su.scale;
else {
@@ -480,6 +482,8 @@ print_width(const char *v, const struct mdoc_node *child, size_t defsz)
if (NULL == v)
sz = defsz;
else if (a2roffsu(v, &su, SCALE_MAX) > 1) {
+ if (su.scale < 0.0)
+ su.scale = 0.0;
if (SCALE_EN == su.unit)
sz = su.scale;
else {
diff --git a/usr.bin/mandoc/mdoc_term.c b/usr.bin/mandoc/mdoc_term.c
index f12989e5f54..902f5bdc4dc 100644
--- a/usr.bin/mandoc/mdoc_term.c
+++ b/usr.bin/mandoc/mdoc_term.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mdoc_term.c,v 1.199 2014/12/23 09:31:17 schwarze Exp $ */
+/* $OpenBSD: mdoc_term.c,v 1.200 2014/12/23 13:48:15 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -531,7 +531,8 @@ a2width(const struct termp *p, const char *v)
if (a2roffsu(v, &su, SCALE_MAX) < 2) {
SCALE_HS_INIT(&su, term_strlen(p, v));
su.scale /= term_strlen(p, "0");
- }
+ } else if (su.scale < 0.0)
+ su.scale = 0.0;
return(term_hspan(p, &su));
}
diff --git a/usr.bin/mandoc/out.c b/usr.bin/mandoc/out.c
index e18224399cd..ccffdff2298 100644
--- a/usr.bin/mandoc/out.c
+++ b/usr.bin/mandoc/out.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: out.c,v 1.28 2014/12/23 09:31:17 schwarze Exp $ */
+/* $OpenBSD: out.c,v 1.29 2014/12/23 13:48:15 schwarze Exp $ */
/*
* Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2011, 2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -92,9 +92,6 @@ a2roffsu(const char *src, struct roffsu *dst, enum roffscale def)
break;
}
- /* FIXME: do this in the caller. */
- if (dst->scale < 0.0)
- dst->scale = 0.0;
return(*endptr == '\0' ? 2 : 1);
}
diff --git a/usr.bin/mandoc/term.c b/usr.bin/mandoc/term.c
index 1c69ca2417d..21443c7111e 100644
--- a/usr.bin/mandoc/term.c
+++ b/usr.bin/mandoc/term.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: term.c,v 1.99 2014/12/23 06:16:21 schwarze Exp $ */
+/* $OpenBSD: term.c,v 1.100 2014/12/23 13:48:15 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -99,7 +99,6 @@ term_flushln(struct termp *p)
size_t j; /* temporary loop index for p->buf */
size_t jhy; /* last hyph before overflow w/r/t j */
size_t maxvis; /* output position of visible boundary */
- size_t rmargin; /* the rightmost of the two margins */
/*
* First, establish the maximum columns of "visible" content.
@@ -112,8 +111,7 @@ term_flushln(struct termp *p)
* is negative, it gets sign extended. Subtracting that
* very large size_t effectively adds a small number to dv.
*/
- rmargin = p->rmargin > p->offset ? p->rmargin : p->offset;
- dv = p->rmargin - p->offset;
+ dv = p->rmargin > p->offset ? p->rmargin - p->offset : 0;
maxvis = (int)dv > p->overstep ? dv - (size_t)p->overstep : 0;
if (p->flags & TERMP_NOBREAK) {
@@ -191,8 +189,9 @@ term_flushln(struct termp *p)
(*p->endline)(p);
p->viscol = 0;
if (TERMP_BRIND & p->flags) {
- vbl = rmargin;
- vend += rmargin - p->offset;
+ vbl = p->rmargin;
+ vend += p->rmargin;
+ vend -= p->offset;
} else
vbl = p->offset;
@@ -768,7 +767,7 @@ term_strlen(const struct termp *p, const char *cp)
return(sz);
}
-size_t
+int
term_vspan(const struct termp *p, const struct roffsu *su)
{
double r;
@@ -807,19 +806,14 @@ term_vspan(const struct termp *p, const struct roffsu *su)
abort();
/* NOTREACHED */
}
-
- if (r < 0.0)
- r = 0.0;
- return((size_t)(r + 0.4995));
+ return(r > 0.0 ? r + 0.4995 : r - 0.4995);
}
-size_t
+int
term_hspan(const struct termp *p, const struct roffsu *su)
{
double v;
v = (*p->hspan)(p, su);
- if (v < 0.0)
- v = 0.0;
- return((size_t)(v + 0.0005));
+ return(v > 0.0 ? v + 0.0005 : v - 0.0005);
}
diff --git a/usr.bin/mandoc/term.h b/usr.bin/mandoc/term.h
index afdffd0f857..2bb97aa7d37 100644
--- a/usr.bin/mandoc/term.h
+++ b/usr.bin/mandoc/term.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: term.h,v 1.53 2014/12/19 17:10:42 schwarze Exp $ */
+/* $OpenBSD: term.h,v 1.54 2014/12/23 13:48:15 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2011, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -121,10 +121,8 @@ void term_begin(struct termp *, term_margin,
void term_end(struct termp *);
void term_setwidth(struct termp *, const char *);
-size_t term_hspan(const struct termp *,
- const struct roffsu *);
-size_t term_vspan(const struct termp *,
- const struct roffsu *);
+int term_hspan(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);