diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2014-12-23 13:48:57 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2014-12-23 13:48:57 +0000 |
commit | 4ad53635f5202474c55af90f70bba0ade18962cb (patch) | |
tree | ec073e4714b3d859a66a94147789aa077e78dd38 /man_term.c | |
parent | f2c1420553b275dd2f792b3a15c8fb0437f58052 (diff) | |
download | mandoc-4ad53635f5202474c55af90f70bba0ade18962cb.tar.gz |
support negative horizontal widths in man(7);
minus twenty lines of code in spite of enhanced functionality
Diffstat (limited to 'man_term.c')
-rw-r--r-- | man_term.c | 176 |
1 files changed, 71 insertions, 105 deletions
@@ -37,7 +37,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 */ @@ -56,8 +56,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 *); @@ -183,17 +181,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. @@ -412,9 +399,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); @@ -433,10 +421,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; @@ -452,9 +440,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) { @@ -474,31 +460,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); @@ -509,9 +484,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: @@ -528,24 +503,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); } @@ -587,9 +558,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: @@ -606,28 +577,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; @@ -672,9 +637,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: @@ -691,22 +656,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; @@ -725,9 +688,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; @@ -872,8 +832,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: @@ -885,13 +845,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; @@ -905,8 +868,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: @@ -918,13 +881,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) |