support negative horizontal widths in man(7);
authorschwarze <schwarze@openbsd.org>
Tue, 23 Dec 2014 13:48:15 +0000 (13:48 +0000)
committerschwarze <schwarze@openbsd.org>
Tue, 23 Dec 2014 13:48:15 +0000 (13:48 +0000)
minus twenty lines of code in spite of enhanced functionality

17 files changed:
regress/usr.bin/mandoc/man/HP/spacing.in
regress/usr.bin/mandoc/man/HP/spacing.out_ascii
regress/usr.bin/mandoc/man/IP/width.in
regress/usr.bin/mandoc/man/IP/width.out_ascii
regress/usr.bin/mandoc/man/RS/width.in
regress/usr.bin/mandoc/man/RS/width.out_ascii
regress/usr.bin/mandoc/man/TP/width.in
regress/usr.bin/mandoc/man/TP/width.out_ascii
regress/usr.bin/mandoc/roff/scale/horiz.in
regress/usr.bin/mandoc/roff/scale/horiz.out_ascii
usr.bin/mandoc/man_term.c
usr.bin/mandoc/mdoc_html.c
usr.bin/mandoc/mdoc_man.c
usr.bin/mandoc/mdoc_term.c
usr.bin/mandoc/out.c
usr.bin/mandoc/term.c
usr.bin/mandoc/term.h

index 5a9614f..485fae9 100644 (file)
@@ -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.
index d4f50d4..7697cff 100644 (file)
@@ -8,26 +8,39 @@ N\bNA\bAM\bME\bE
 D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
        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)
index 8c30b93..1c919a3 100644 (file)
@@ -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
index 83a6e32..a867ba7 100644 (file)
@@ -8,6 +8,18 @@ N\bNA\bAM\bME\bE
 D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
        Regular mode:
 
+       tag
+indented
+text
+
+       tag
+   indented
+   text
+
+       tag
+       indented
+       text
+
        tag
         indented
         text
@@ -34,6 +46,18 @@ D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
 
        Literal mode:
 
+       tag
+indented
+text
+
+       tag
+   indented
+   text
+
+       tag
+       indented
+       text
+
        tag
         indented
         text
index 7dc19da..c6b1dbf 100644 (file)
@@ -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
index 35efea8..95951e5 100644 (file)
@@ -3,9 +3,13 @@ RS-WIDTH(1)                 General Commands Manual                RS-WIDTH(1)
 
 
 N\bNA\bAM\bME\bE
-       RS-width - excessive indentation
+       RS-width - negative and excessive indentation
 
 D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
+       regular text
+   indented text
+       regular text
+           indented text
        regular text
                                                                                                            indented
                                                                                                            text
@@ -13,4 +17,4 @@ D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
 
 
 
-OpenBSD                        February 16, 2014                   RS-WIDTH(1)
+OpenBSD                        December 23, 2014                   RS-WIDTH(1)
index d57aa00..1ba99e4 100644 (file)
@@ -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
index f726f8f..fea6388 100644 (file)
@@ -8,6 +8,18 @@ N\bNA\bAM\bME\bE
 D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
        Regular mode:
 
+       tag
+indented
+text
+
+       tag
+   indented
+   text
+
+       tag
+       indented
+       text
+
        tag
         indented
         text
@@ -31,6 +43,18 @@ D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
 
        Literal mode:
 
+       tag
+indented
+text
+
+       tag
+   indented
+   text
+
+       tag
+       indented
+       text
+
        tag
         indented
         text
@@ -54,4 +78,4 @@ D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
 
 
 
-OpenBSD                        February 16, 2014                   TP-WIDTH(1)
+OpenBSD                        December 23, 2014                   TP-WIDTH(1)
index f3b3665..edba2f7 100644 (file)
@@ -25,5 +25,7 @@ initial text
 79n
 .in 1.5ix
 1.5ix
+.in -6n
+-6n
 .PP
 final text
index 8db827e..75e12a4 100644 (file)
@@ -18,6 +18,7 @@ D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
      5m
                                                                                79n
                1.5ix
+         -6n
 
        final text
 
index 06340e2..68324f2 100644 (file)
@@ -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)
index 05b678b..4647aa4 100644 (file)
@@ -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;
 
index 5151b3a..28cede1 100644 (file)
@@ -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 {
index f12989e..902f5bd 100644 (file)
@@ -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));
 }
index e182243..ccffdff 100644 (file)
@@ -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);
 }
 
index 1c69ca2..21443c7 100644 (file)
@@ -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);
 }
index afdffd0..2bb97aa 100644 (file)
@@ -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);