=================================================================== RCS file: /cvs/mandoc/man_term.c,v retrieving revision 1.124 retrieving revision 1.130 diff -u -p -r1.124 -r1.130 --- mandoc/man_term.c 2011/11/18 17:04:06 1.124 +++ mandoc/man_term.c 2012/07/10 19:54:11 1.130 @@ -1,7 +1,7 @@ -/* $Id: man_term.c,v 1.124 2011/11/18 17:04:06 joerg Exp $ */ +/* $Id: man_term.c,v 1.130 2012/07/10 19:54:11 schwarze Exp $ */ /* - * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons - * Copyright (c) 2010, 2011 Ingo Schwarze + * Copyright (c) 2008-2012 Kristaps Dzonsons + * Copyright (c) 2010, 2011, 2012 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -68,21 +68,22 @@ static void print_man_foot(struct termp *, const vo static void print_bvspace(struct termp *, const struct man_node *); -static int pre_alternate(DECL_ARGS); static int pre_B(DECL_ARGS); static int pre_HP(DECL_ARGS); static int pre_I(DECL_ARGS); static int pre_IP(DECL_ARGS); +static int pre_OP(DECL_ARGS); static int pre_PP(DECL_ARGS); static int pre_RS(DECL_ARGS); static int pre_SH(DECL_ARGS); static int pre_SS(DECL_ARGS); static int pre_TP(DECL_ARGS); +static int pre_alternate(DECL_ARGS); +static int pre_ft(DECL_ARGS); static int pre_ign(DECL_ARGS); static int pre_in(DECL_ARGS); static int pre_literal(DECL_ARGS); static int pre_sp(DECL_ARGS); -static int pre_ft(DECL_ARGS); static void post_IP(DECL_ARGS); static void post_HP(DECL_ARGS); @@ -125,6 +126,9 @@ static const struct termact termacts[MAN_MAX] = { { pre_ign, NULL, 0 }, /* AT */ { pre_in, NULL, MAN_NOTEXT }, /* in */ { pre_ft, NULL, MAN_NOTEXT }, /* ft */ + { pre_OP, NULL, 0 }, /* OP */ + { pre_literal, NULL, 0 }, /* EX */ + { pre_literal, NULL, 0 }, /* EE */ }; @@ -241,7 +245,7 @@ pre_literal(DECL_ARGS) term_newln(p); - if (MAN_nf == n->tok) + if (MAN_nf == n->tok || MAN_EX == n->tok) mt->fl |= MANT_LITERAL; else mt->fl &= ~MANT_LITERAL; @@ -324,6 +328,29 @@ pre_B(DECL_ARGS) /* ARGSUSED */ static int +pre_OP(DECL_ARGS) +{ + + term_word(p, "["); + p->flags |= TERMP_NOSPACE; + + if (NULL != (n = n->child)) { + term_fontrepl(p, TERMFONT_BOLD); + term_word(p, n->string); + } + if (NULL != n && NULL != n->next) { + term_fontrepl(p, TERMFONT_UNDER); + term_word(p, n->next->string); + } + + term_fontrepl(p, TERMFONT_NONE); + p->flags |= TERMP_NOSPACE; + term_word(p, "]"); + return(0); +} + +/* ARGSUSED */ +static int pre_ft(DECL_ARGS) { const char *cp; @@ -453,13 +480,16 @@ pre_HP(DECL_ARGS) print_bvspace(p, n); return(1); case (MAN_BODY): - p->flags |= TERMP_NOBREAK; - p->flags |= TERMP_TWOSPACE; break; default: return(0); } + if ( ! (MANT_LITERAL & mt->fl)) { + p->flags |= TERMP_NOBREAK; + p->flags |= TERMP_TWOSPACE; + } + len = mt->lmargin[mt->lmargincur]; ival = -1; @@ -489,9 +519,6 @@ post_HP(DECL_ARGS) { switch (n->type) { - case (MAN_BLOCK): - term_flushln(p); - break; case (MAN_BODY): term_flushln(p); p->flags &= ~TERMP_NOBREAK; @@ -669,6 +696,8 @@ pre_TP(DECL_ARGS) case (MAN_BODY): p->offset = mt->offset + len; p->rmargin = p->maxrmargin; + p->flags &= ~TERMP_NOBREAK; + p->flags &= ~TERMP_TWOSPACE; break; default: break; @@ -686,9 +715,6 @@ post_TP(DECL_ARGS) switch (n->type) { case (MAN_HEAD): term_flushln(p); - p->flags &= ~TERMP_NOBREAK; - p->flags &= ~TERMP_TWOSPACE; - p->rmargin = p->maxrmargin; break; case (MAN_BODY): term_newln(p); @@ -885,29 +911,8 @@ print_man_node(DECL_ARGS) term_newln(p); term_word(p, n->string); + goto out; - /* - * If we're in a literal context, make sure that words - * togehter on the same line stay together. This is a - * POST-printing call, so we check the NEXT word. Since - * -man doesn't have nested macros, we don't need to be - * more specific than this. - */ - if (MANT_LITERAL & mt->fl && ! (TERMP_NOBREAK & p->flags) && - (NULL == n->next || - n->next->line > n->line)) { - rm = p->rmargin; - rmax = p->maxrmargin; - p->rmargin = p->maxrmargin = TERM_MAXMARGIN; - p->flags |= TERMP_NOSPACE; - term_flushln(p); - p->rmargin = rm; - p->maxrmargin = rmax; - } - - if (MAN_EOS & n->flags) - p->flags |= TERMP_SENTENCE; - return; case (MAN_EQN): term_eqn(p, n->eqn); return; @@ -939,6 +944,31 @@ print_man_node(DECL_ARGS) if ( ! (MAN_NOTEXT & termacts[n->tok].flags)) term_fontrepl(p, TERMFONT_NONE); +out: + /* + * If we're in a literal context, make sure that words + * together on the same line stay together. This is a + * POST-printing call, so we check the NEXT word. Since + * -man doesn't have nested macros, we don't need to be + * more specific than this. + */ + if (MANT_LITERAL & mt->fl && ! (TERMP_NOBREAK & p->flags) && + NULL != n->next && n->next->line > n->line) { + rm = p->rmargin; + rmax = p->maxrmargin; + p->rmargin = p->maxrmargin = TERM_MAXMARGIN; + p->flags |= TERMP_NOSPACE; + if (NULL != n->string && '\0' != *n->string) + term_flushln(p); + else + term_newln(p); + if (rm < rmax && n->parent->tok == MAN_HP) { + p->offset = rm; + p->rmargin = rmax; + } else + p->rmargin = rm; + p->maxrmargin = rmax; + } if (MAN_EOS & n->flags) p->flags |= TERMP_SENTENCE; } @@ -963,16 +993,33 @@ print_man_foot(struct termp *p, const void *arg) const struct man_meta *meta; meta = (const struct man_meta *)arg; + assert(meta->title); + assert(meta->msec); + assert(meta->date); term_fontrepl(p, TERMFONT_NONE); term_vspace(p); - term_vspace(p); - term_vspace(p); - snprintf(title, BUFSIZ, "%s(%s)", meta->title ? meta->title : "", - meta->msec ? meta->msec : ""); - datelen = term_strlen(p, meta->date ? meta->date : ""); + /* + * Temporary, undocumented option to imitate mdoc(7) output. + * In the bottom right corner, use the source instead of + * the title. + */ + + if ( ! p->mdocstyle) { + term_vspace(p); + term_vspace(p); + snprintf(title, BUFSIZ, "%s(%s)", meta->title, meta->msec); + } else if (meta->source) { + strlcpy(title, meta->source, BUFSIZ); + } else { + title[0] = '\0'; + } + datelen = term_strlen(p, meta->date); + + /* Bottom left corner: manual source. */ + p->flags |= TERMP_NOSPACE | TERMP_NOBREAK; p->offset = 0; p->rmargin = (p->maxrmargin - datelen + term_len(p, 1)) / 2; @@ -981,15 +1028,19 @@ print_man_foot(struct termp *p, const void *arg) term_word(p, meta->source); term_flushln(p); + /* At the bottom in the middle: manual date. */ + p->flags |= TERMP_NOSPACE; p->offset = p->rmargin; p->rmargin = p->maxrmargin - term_strlen(p, title); if (p->offset + datelen >= p->rmargin) p->rmargin = p->offset + datelen; - term_word(p, meta->date ? meta->date : ""); + term_word(p, meta->date); term_flushln(p); + /* Bottom right corner: manual title and section. */ + p->flags &= ~TERMP_NOBREAK; p->flags |= TERMP_NOSPACE; p->offset = p->rmargin; @@ -1008,24 +1059,18 @@ print_man_head(struct termp *p, const void *arg) const struct man_meta *m; m = (const struct man_meta *)arg; + assert(m->title); + assert(m->msec); - /* - * Note that old groff would spit out some spaces before the - * header. We discontinue this strange behaviour, but at one - * point we did so here. - */ - - p->offset = 0; - p->rmargin = p->maxrmargin; - - buf[0] = title[0] = '\0'; - if (m->vol) strlcpy(buf, m->vol, BUFSIZ); + else + buf[0] = '\0'; buflen = term_strlen(p, buf); - snprintf(title, BUFSIZ, "%s(%s)", m->title ? m->title : "", - m->msec ? m->msec : ""); + /* Top left corner: manual title and section. */ + + snprintf(title, BUFSIZ, "%s(%s)", m->title, m->msec); titlen = term_strlen(p, title); p->flags |= TERMP_NOBREAK | TERMP_NOSPACE; @@ -1038,6 +1083,8 @@ print_man_head(struct termp *p, const void *arg) term_word(p, title); term_flushln(p); + /* At the top in the middle: manual volume. */ + p->flags |= TERMP_NOSPACE; p->offset = p->rmargin; p->rmargin = p->offset + buflen + titlen < p->maxrmargin ? @@ -1046,6 +1093,8 @@ print_man_head(struct termp *p, const void *arg) term_word(p, buf); term_flushln(p); + /* Top right corner: title and section, again. */ + p->flags &= ~TERMP_NOBREAK; if (p->rmargin + titlen <= p->maxrmargin) { p->flags |= TERMP_NOSPACE; @@ -1060,11 +1109,14 @@ print_man_head(struct termp *p, const void *arg) p->rmargin = p->maxrmargin; /* - * Groff likes to have some leading spaces before content. Well - * that's fine by me. + * Groff prints three blank lines before the content. + * Do the same, except in the temporary, undocumented + * mode imitating mdoc(7) output. */ term_vspace(p); - term_vspace(p); - term_vspace(p); + if ( ! p->mdocstyle) { + term_vspace(p); + term_vspace(p); + } }