From bf8e53c9869db7abf5443183f2efb7ec67b973bc Mon Sep 17 00:00:00 2001 From: schwarze Date: Tue, 23 Dec 2014 13:48:15 +0000 Subject: [PATCH] support negative horizontal widths in man(7); minus twenty lines of code in spite of enhanced functionality --- regress/usr.bin/mandoc/man/HP/spacing.in | 49 +++-- .../usr.bin/mandoc/man/HP/spacing.out_ascii | 37 ++-- regress/usr.bin/mandoc/man/IP/width.in | 21 +++ regress/usr.bin/mandoc/man/IP/width.out_ascii | 24 +++ regress/usr.bin/mandoc/man/RS/width.in | 16 +- regress/usr.bin/mandoc/man/RS/width.out_ascii | 8 +- regress/usr.bin/mandoc/man/TP/width.in | 29 ++- regress/usr.bin/mandoc/man/TP/width.out_ascii | 26 ++- regress/usr.bin/mandoc/roff/scale/horiz.in | 2 + .../usr.bin/mandoc/roff/scale/horiz.out_ascii | 1 + usr.bin/mandoc/man_term.c | 178 +++++++----------- usr.bin/mandoc/mdoc_html.c | 10 +- usr.bin/mandoc/mdoc_man.c | 6 +- usr.bin/mandoc/mdoc_term.c | 5 +- usr.bin/mandoc/out.c | 5 +- usr.bin/mandoc/term.c | 24 +-- usr.bin/mandoc/term.h | 8 +- 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 @@ -8,6 +8,18 @@ NNAAMMEE DDEESSCCRRIIPPTTIIOONN Regular mode: + tag +indented +text + + tag + indented + text + + tag + indented + text + tag indented text @@ -34,6 +46,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,9 +3,13 @@ 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 @@ -13,4 +17,4 @@ DDEESSCCRRIIPPTTIIOONN -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 @@ -8,6 +8,18 @@ NNAAMMEE DDEESSCCRRIIPPTTIIOONN Regular mode: + tag +indented +text + + tag + indented + text + + tag + indented + text + tag indented text @@ -31,6 +43,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 * Copyright (c) 2010-2014 Ingo Schwarze @@ -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 * Copyright (c) 2014 Ingo Schwarze @@ -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 * @@ -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 * Copyright (c) 2010, 2012, 2013, 2014 Ingo Schwarze @@ -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 * Copyright (c) 2011, 2014 Ingo Schwarze @@ -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 * Copyright (c) 2010-2014 Ingo Schwarze @@ -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 * Copyright (c) 2011, 2012, 2013, 2014 Ingo Schwarze @@ -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); -- 2.20.1