diff options
-rw-r--r-- | mdoc_man.c | 81 |
1 files changed, 54 insertions, 27 deletions
@@ -254,6 +254,8 @@ static int outflags; #define MMAN_An_split (1 << 8) /* author mode is "split" */ #define MMAN_An_nosplit (1 << 9) /* author mode is "nosplit" */ +static int TPremain; /* characters before tag is full */ + static struct { char *head; char *tail; @@ -270,7 +272,8 @@ font_push(char newfont) fontqueue.size); } *fontqueue.tail = newfont; - print_word("\\f"); + print_word(""); + printf("\\f"); putchar(newfont); outflags &= ~MMAN_spc; } @@ -282,7 +285,8 @@ font_pop(void) if (fontqueue.tail > fontqueue.head) fontqueue.tail--; outflags &= ~MMAN_spc; - print_word("\\f"); + print_word(""); + printf("\\f"); putchar(*fontqueue.tail); } @@ -305,28 +309,34 @@ print_word(const char *s) else if (MMAN_nl & outflags) putchar('\n'); outflags &= ~(MMAN_PP|MMAN_sp|MMAN_br|MMAN_nl|MMAN_spc); - } else if (MMAN_spc & outflags && '\0' != s[0]) + if (1 == TPremain) + printf(".br\n"); + TPremain = 0; + } else if (MMAN_spc & outflags) { /* * If we need a space, only print it if * (1) it is forced by `No' or * (2) what follows is not terminating punctuation or * (3) what follows is longer than one character. */ - if (MMAN_spc_force & outflags || + if (MMAN_spc_force & outflags || '\0' == s[0] || NULL == strchr(".,:;)]?!", s[0]) || '\0' != s[1]) { if (MMAN_Bk & outflags) { putchar('\\'); putchar('~'); } else putchar(' '); + if (TPremain) + TPremain--; } + } /* * Reassign needing space if we're not following opening * punctuation. */ - if (MMAN_Sm & outflags && - (('(' != s[0] && '[' != s[0]) || '\0' != s[1])) + if (MMAN_Sm & outflags && ('\0' == s[0] || + (('(' != s[0] && '[' != s[0]) || '\0' != s[1]))) outflags |= MMAN_spc; else outflags &= ~MMAN_spc; @@ -344,6 +354,8 @@ print_word(const char *s) putchar((unsigned char)*s); break; } + if (TPremain) + TPremain--; } } @@ -400,33 +412,38 @@ print_width(const char *v, const struct mdoc_node *child, size_t defsz) char buf[24]; struct roffsu su; size_t sz, chsz; + int numeric, remain; - /* XXX Rough estimation, might have multiple parts. */ - chsz = (NULL != child && MDOC_TEXT == child->type) ? - strlen(child->string) : 0; - + numeric = 1; + remain = 0; if (NULL == v) sz = defsz; else if (a2roffsu(v, &su, SCALE_MAX)) { if (SCALE_EN == su.unit) sz = su.scale; else { - if (chsz) - print_block(".HP", 0); - else - print_block(".TP", 0); - print_word(v); - return; + sz = 0; + numeric = 0; } } else sz = strlen(v); - if (chsz > sz) + /* XXX Rough estimation, might have multiple parts. */ + chsz = (NULL != child && MDOC_TEXT == child->type) ? + strlen(child->string) : 0; + + if (defsz && chsz > sz) print_block(".HP", 0); - else + else { print_block(".TP", 0); - snprintf(buf, sizeof(buf), "%ldn", sz + 2); - print_word(buf); + remain = sz + 2; + } + if (numeric) { + snprintf(buf, sizeof(buf), "%ldn", sz + 2); + print_word(buf); + } else + print_word(v); + TPremain = remain; } void @@ -499,7 +516,8 @@ print_node(DECL_ARGS) */ if (MMAN_nl & outflags && ('.' == *n->string || '\'' == *n->string)) { - print_word("\\&"); + print_word(""); + printf("\\&"); outflags &= ~MMAN_spc; } print_word(n->string); @@ -599,7 +617,8 @@ pre__t(DECL_ARGS) if (n->parent && MDOC_Rs == n->parent->tok && n->parent->norm->Rs.quote_T) { - print_word("\""); + print_word(""); + putchar('\"'); outflags &= ~MMAN_spc; } else font_push('I'); @@ -613,7 +632,8 @@ post__t(DECL_ARGS) if (n->parent && MDOC_Rs == n->parent->tok && n->parent->norm->Rs.quote_T) { outflags &= ~MMAN_spc; - print_word("\""); + print_word(""); + putchar('\"'); } else font_pop(); post_percent(m, n); @@ -630,7 +650,8 @@ pre_sect(DECL_ARGS) return(1); outflags |= MMAN_sp; print_block(manacts[n->tok].prefix, 0); - print_word("\""); + print_word(""); + putchar('\"'); outflags &= ~MMAN_spc; return(1); } @@ -645,7 +666,8 @@ post_sect(DECL_ARGS) if (MDOC_HEAD != n->type) return; outflags &= ~MMAN_spc; - print_word("\""); + print_word(""); + putchar('\"'); outflags |= MMAN_nl; if (MDOC_Sh == n->tok && SEC_AUTHORS == n->sec) outflags &= ~(MMAN_An_split | MMAN_An_nosplit); @@ -1117,6 +1139,7 @@ pre_it(DECL_ARGS) /* FALLTHROUGH */ case (LIST_hyphen): print_width(bln->norm->Bl.width, NULL, 0); + TPremain = 0; outflags |= MMAN_nl; font_push('B'); if (LIST_bullet == bln->norm->Bl.type) @@ -1127,15 +1150,19 @@ pre_it(DECL_ARGS) break; case (LIST_enum): print_width(bln->norm->Bl.width, NULL, 0); + TPremain = 0; outflags |= MMAN_nl; print_count(&bln->norm->Bl.count); break; case (LIST_hang): print_width(bln->norm->Bl.width, n->child, 6); + TPremain = 0; break; case (LIST_tag): - print_width(bln->norm->Bl.width, NULL, 8); - break; + print_width(bln->norm->Bl.width, n->child, 0); + putchar('\n'); + outflags &= ~MMAN_spc; + return(1); default: return(1); } |