=================================================================== RCS file: /cvs/mandoc/man_term.c,v retrieving revision 1.142 retrieving revision 1.146 diff -u -p -r1.142 -r1.146 --- mandoc/man_term.c 2014/03/08 16:22:04 1.142 +++ mandoc/man_term.c 2014/04/20 16:46:04 1.146 @@ -1,4 +1,4 @@ -/* $Id: man_term.c,v 1.142 2014/03/08 16:22:04 schwarze Exp $ */ +/* $Id: man_term.c,v 1.146 2014/04/20 16:46:04 schwarze Exp $ */ /* * Copyright (c) 2008-2012 Kristaps Dzonsons * Copyright (c) 2010-2014 Ingo Schwarze @@ -45,7 +45,7 @@ struct mtermp { int pardist; /* vert. space before par., unit: [v] */ }; -#define DECL_ARGS struct termp *p, \ +#define DECL_ARGS struct termp *p, \ struct mtermp *mt, \ const struct man_node *n, \ const struct man_meta *meta @@ -64,7 +64,7 @@ static void print_man_nodelist(DECL_ARGS); static void print_man_node(DECL_ARGS); static void print_man_head(struct termp *, const void *); static void print_man_foot(struct termp *, const void *); -static void print_bvspace(struct termp *, +static void print_bvspace(struct termp *, const struct man_node *, int); static int pre_B(DECL_ARGS); @@ -84,6 +84,7 @@ 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_ll(DECL_ARGS); static int pre_sp(DECL_ARGS); static void post_IP(DECL_ARGS); @@ -104,7 +105,7 @@ static const struct termact termacts[MAN_MAX] = { { pre_PP, NULL, 0 }, /* PP */ { pre_PP, NULL, 0 }, /* P */ { pre_IP, post_IP, 0 }, /* IP */ - { pre_HP, post_HP, 0 }, /* HP */ + { pre_HP, post_HP, 0 }, /* HP */ { NULL, NULL, 0 }, /* SM */ { pre_B, NULL, 0 }, /* SB */ { pre_alternate, NULL, 0 }, /* BI */ @@ -133,10 +134,10 @@ static const struct termact termacts[MAN_MAX] = { { pre_literal, NULL, 0 }, /* EE */ { pre_UR, post_UR, 0 }, /* UR */ { NULL, NULL, 0 }, /* UE */ + { pre_ll, NULL, MAN_NOTEXT }, /* ll */ }; - void terminal_man(void *arg, const struct man *man) { @@ -187,7 +188,6 @@ a2height(const struct termp *p, const char *cp) return(term_vspan(p, &su)); } - static int a2width(const struct termp *p, const char *cp) { @@ -226,7 +226,7 @@ print_bvspace(struct termp *p, const struct man_node * term_vspace(p); } -/* ARGSUSED */ + static int pre_ign(DECL_ARGS) { @@ -234,8 +234,14 @@ pre_ign(DECL_ARGS) return(0); } +static int +pre_ll(DECL_ARGS) +{ -/* ARGSUSED */ + term_setwidth(p, n->nchild ? n->child->string : NULL); + return(0); +} + static int pre_I(DECL_ARGS) { @@ -244,8 +250,6 @@ pre_I(DECL_ARGS) return(1); } - -/* ARGSUSED */ static int pre_literal(DECL_ARGS) { @@ -266,14 +270,13 @@ pre_literal(DECL_ARGS) p->offset = p->rmargin; p->rmargin = p->maxrmargin; p->trailspace = 0; - p->flags &= ~TERMP_NOBREAK; + p->flags &= ~(TERMP_NOBREAK | TERMP_BRIND); p->flags |= TERMP_NOSPACE; } return(0); } -/* ARGSUSED */ static int pre_PD(DECL_ARGS) { @@ -288,7 +291,6 @@ pre_PD(DECL_ARGS) return(0); } -/* ARGSUSED */ static int pre_alternate(DECL_ARGS) { @@ -297,27 +299,27 @@ pre_alternate(DECL_ARGS) int savelit, i; switch (n->tok) { - case (MAN_RB): + case MAN_RB: font[0] = TERMFONT_NONE; font[1] = TERMFONT_BOLD; break; - case (MAN_RI): + case MAN_RI: font[0] = TERMFONT_NONE; font[1] = TERMFONT_UNDER; break; - case (MAN_BR): + case MAN_BR: font[0] = TERMFONT_BOLD; font[1] = TERMFONT_NONE; break; - case (MAN_BI): + case MAN_BI: font[0] = TERMFONT_BOLD; font[1] = TERMFONT_UNDER; break; - case (MAN_IR): + case MAN_IR: font[0] = TERMFONT_UNDER; font[1] = TERMFONT_NONE; break; - case (MAN_IB): + case MAN_IB: font[0] = TERMFONT_UNDER; font[1] = TERMFONT_BOLD; break; @@ -340,7 +342,6 @@ pre_alternate(DECL_ARGS) return(0); } -/* ARGSUSED */ static int pre_B(DECL_ARGS) { @@ -349,7 +350,6 @@ pre_B(DECL_ARGS) return(1); } -/* ARGSUSED */ static int pre_OP(DECL_ARGS) { @@ -372,7 +372,6 @@ pre_OP(DECL_ARGS) return(0); } -/* ARGSUSED */ static int pre_ft(DECL_ARGS) { @@ -385,26 +384,26 @@ pre_ft(DECL_ARGS) cp = n->child->string; switch (*cp) { - case ('4'): + case '4': /* FALLTHROUGH */ - case ('3'): + case '3': /* FALLTHROUGH */ - case ('B'): + case 'B': term_fontrepl(p, TERMFONT_BOLD); break; - case ('2'): + case '2': /* FALLTHROUGH */ - case ('I'): + case 'I': term_fontrepl(p, TERMFONT_UNDER); break; - case ('P'): + case 'P': term_fontlast(p); break; - case ('1'): + case '1': /* FALLTHROUGH */ - case ('C'): + case 'C': /* FALLTHROUGH */ - case ('R'): + case 'R': term_fontrepl(p, TERMFONT_NONE); break; default: @@ -413,7 +412,6 @@ pre_ft(DECL_ARGS) return(0); } -/* ARGSUSED */ static int pre_in(DECL_ARGS) { @@ -447,7 +445,7 @@ pre_in(DECL_ARGS) p->offset -= p->offset > v ? v : p->offset; else if (less > 0) p->offset += v; - else + else p->offset = v; /* Don't let this creep beyond the right margin. */ @@ -458,8 +456,6 @@ pre_in(DECL_ARGS) return(0); } - -/* ARGSUSED */ static int pre_sp(DECL_ARGS) { @@ -469,15 +465,15 @@ pre_sp(DECL_ARGS) if ((NULL == n->prev && n->parent)) { switch (n->parent->tok) { - case (MAN_SH): + case MAN_SH: /* FALLTHROUGH */ - case (MAN_SS): + case MAN_SS: /* FALLTHROUGH */ - case (MAN_PP): + case MAN_PP: /* FALLTHROUGH */ - case (MAN_LP): + case MAN_LP: /* FALLTHROUGH */ - case (MAN_P): + case MAN_P: /* FALLTHROUGH */ return(0); default: @@ -487,7 +483,7 @@ pre_sp(DECL_ARGS) neg = 0; switch (n->tok) { - case (MAN_br): + case MAN_br: len = 0; break; default: @@ -515,8 +511,6 @@ pre_sp(DECL_ARGS) return(0); } - -/* ARGSUSED */ static int pre_HP(DECL_ARGS) { @@ -525,17 +519,17 @@ pre_HP(DECL_ARGS) const struct man_node *nn; switch (n->type) { - case (MAN_BLOCK): + case MAN_BLOCK: print_bvspace(p, n, mt->pardist); return(1); - case (MAN_BODY): + case MAN_BODY: break; default: return(0); } if ( ! (MANT_LITERAL & mt->fl)) { - p->flags |= TERMP_NOBREAK; + p->flags |= TERMP_NOBREAK | TERMP_BRIND; p->trailspace = 2; } @@ -561,16 +555,14 @@ pre_HP(DECL_ARGS) return(1); } - -/* ARGSUSED */ static void post_HP(DECL_ARGS) { switch (n->type) { - case (MAN_BODY): + case MAN_BODY: term_newln(p); - p->flags &= ~TERMP_NOBREAK; + p->flags &= ~(TERMP_NOBREAK | TERMP_BRIND); p->trailspace = 0; p->offset = mt->offset; p->rmargin = p->maxrmargin; @@ -580,14 +572,12 @@ post_HP(DECL_ARGS) } } - -/* ARGSUSED */ static int pre_PP(DECL_ARGS) { switch (n->type) { - case (MAN_BLOCK): + case MAN_BLOCK: mt->lmargin[mt->lmargincur] = term_len(p, p->defindent); print_bvspace(p, n, mt->pardist); break; @@ -599,8 +589,6 @@ pre_PP(DECL_ARGS) return(MAN_HEAD != n->type); } - -/* ARGSUSED */ static int pre_IP(DECL_ARGS) { @@ -609,14 +597,14 @@ pre_IP(DECL_ARGS) int savelit, ival; switch (n->type) { - case (MAN_BODY): + case MAN_BODY: p->flags |= TERMP_NOSPACE; break; - case (MAN_HEAD): + case MAN_HEAD: p->flags |= TERMP_NOBREAK; p->trailspace = 1; break; - case (MAN_BLOCK): + case MAN_BLOCK: print_bvspace(p, n, mt->pardist); /* FALLTHROUGH */ default: @@ -633,7 +621,7 @@ pre_IP(DECL_ARGS) len = (size_t)ival; switch (n->type) { - case (MAN_HEAD): + case MAN_HEAD: /* Handle zero-width lengths. */ if (0 == len) len = term_len(p, 1); @@ -656,10 +644,10 @@ pre_IP(DECL_ARGS) mt->fl |= MANT_LITERAL; return(0); - case (MAN_BODY): + case MAN_BODY: p->offset = mt->offset + len; p->rmargin = p->maxrmargin > p->offset ? - p->maxrmargin : p->offset; + p->maxrmargin : p->offset; break; default: break; @@ -668,20 +656,18 @@ pre_IP(DECL_ARGS) return(1); } - -/* ARGSUSED */ static void post_IP(DECL_ARGS) { switch (n->type) { - case (MAN_HEAD): + case MAN_HEAD: term_flushln(p); p->flags &= ~TERMP_NOBREAK; p->trailspace = 0; p->rmargin = p->maxrmargin; break; - case (MAN_BODY): + case MAN_BODY: term_newln(p); p->offset = mt->offset; break; @@ -690,8 +676,6 @@ post_IP(DECL_ARGS) } } - -/* ARGSUSED */ static int pre_TP(DECL_ARGS) { @@ -700,14 +684,14 @@ pre_TP(DECL_ARGS) int savelit, ival; switch (n->type) { - case (MAN_HEAD): + case MAN_HEAD: p->flags |= TERMP_NOBREAK; p->trailspace = 1; break; - case (MAN_BODY): + case MAN_BODY: p->flags |= TERMP_NOSPACE; break; - case (MAN_BLOCK): + case MAN_BLOCK: print_bvspace(p, n, mt->pardist); /* FALLTHROUGH */ default: @@ -725,7 +709,7 @@ pre_TP(DECL_ARGS) len = (size_t)ival; switch (n->type) { - case (MAN_HEAD): + case MAN_HEAD: /* Handle zero-length properly. */ if (0 == len) len = term_len(p, 1); @@ -752,10 +736,10 @@ pre_TP(DECL_ARGS) mt->lmargin[mt->lmargincur] = (size_t)ival; return(0); - case (MAN_BODY): + case MAN_BODY: p->offset = mt->offset + len; p->rmargin = p->maxrmargin > p->offset ? - p->maxrmargin : p->offset; + p->maxrmargin : p->offset; p->trailspace = 0; p->flags &= ~TERMP_NOBREAK; break; @@ -766,17 +750,15 @@ pre_TP(DECL_ARGS) return(1); } - -/* ARGSUSED */ static void post_TP(DECL_ARGS) { switch (n->type) { - case (MAN_HEAD): + case MAN_HEAD: term_flushln(p); break; - case (MAN_BODY): + case MAN_BODY: term_newln(p); p->offset = mt->offset; break; @@ -785,15 +767,13 @@ post_TP(DECL_ARGS) } } - -/* ARGSUSED */ static int pre_SS(DECL_ARGS) { int i; switch (n->type) { - case (MAN_BLOCK): + case MAN_BLOCK: mt->fl &= ~MANT_LITERAL; mt->lmargin[mt->lmargincur] = term_len(p, p->defindent); mt->offset = term_len(p, p->defindent); @@ -806,11 +786,11 @@ pre_SS(DECL_ARGS) for (i = 0; i < mt->pardist; i++) term_vspace(p); break; - case (MAN_HEAD): + case MAN_HEAD: term_fontrepl(p, TERMFONT_BOLD); p->offset = term_len(p, 3); break; - case (MAN_BODY): + case MAN_BODY: p->offset = mt->offset; break; default: @@ -820,17 +800,15 @@ pre_SS(DECL_ARGS) return(1); } - -/* ARGSUSED */ static void post_SS(DECL_ARGS) { - + switch (n->type) { - case (MAN_HEAD): + case MAN_HEAD: term_newln(p); break; - case (MAN_BODY): + case MAN_BODY: term_newln(p); break; default: @@ -838,15 +816,13 @@ post_SS(DECL_ARGS) } } - -/* ARGSUSED */ static int pre_SH(DECL_ARGS) { int i; switch (n->type) { - case (MAN_BLOCK): + case MAN_BLOCK: mt->fl &= ~MANT_LITERAL; mt->lmargin[mt->lmargincur] = term_len(p, p->defindent); mt->offset = term_len(p, p->defindent); @@ -860,11 +836,11 @@ pre_SH(DECL_ARGS) for (i = 0; i < mt->pardist; i++) term_vspace(p); break; - case (MAN_HEAD): + case MAN_HEAD: term_fontrepl(p, TERMFONT_BOLD); p->offset = 0; break; - case (MAN_BODY): + case MAN_BODY: p->offset = mt->offset; break; default: @@ -874,17 +850,15 @@ pre_SH(DECL_ARGS) return(1); } - -/* ARGSUSED */ static void post_SH(DECL_ARGS) { - + switch (n->type) { - case (MAN_HEAD): + case MAN_HEAD: term_newln(p); break; - case (MAN_BODY): + case MAN_BODY: term_newln(p); break; default: @@ -892,7 +866,6 @@ post_SH(DECL_ARGS) } } -/* ARGSUSED */ static int pre_RS(DECL_ARGS) { @@ -900,10 +873,10 @@ pre_RS(DECL_ARGS) size_t sz; switch (n->type) { - case (MAN_BLOCK): + case MAN_BLOCK: term_newln(p); return(1); - case (MAN_HEAD): + case MAN_HEAD: return(0); default: break; @@ -912,13 +885,13 @@ pre_RS(DECL_ARGS) sz = term_len(p, p->defindent); if (NULL != (n = n->parent->head->child)) - if ((ival = a2width(p, n->string)) >= 0) + if ((ival = a2width(p, n->string)) >= 0) sz = (size_t)ival; mt->offset += sz; p->offset = mt->offset; p->rmargin = p->maxrmargin > p->offset ? - p->maxrmargin : p->offset; + p->maxrmargin : p->offset; if (++mt->lmarginsz < MAXMARGINS) mt->lmargincur = mt->lmarginsz; @@ -927,7 +900,6 @@ pre_RS(DECL_ARGS) return(1); } -/* ARGSUSED */ static void post_RS(DECL_ARGS) { @@ -935,9 +907,9 @@ post_RS(DECL_ARGS) size_t sz; switch (n->type) { - case (MAN_BLOCK): + case MAN_BLOCK: return; - case (MAN_HEAD): + case MAN_HEAD: return; default: term_newln(p); @@ -946,8 +918,8 @@ post_RS(DECL_ARGS) sz = term_len(p, p->defindent); - if (NULL != (n = n->parent->head->child)) - if ((ival = a2width(p, n->string)) >= 0) + if (NULL != (n = n->parent->head->child)) + if ((ival = a2width(p, n->string)) >= 0) sz = (size_t)ival; mt->offset = mt->offset < sz ? 0 : mt->offset - sz; @@ -957,7 +929,6 @@ post_RS(DECL_ARGS) mt->lmargincur = mt->lmarginsz; } -/* ARGSUSED */ static int pre_UR(DECL_ARGS) { @@ -965,7 +936,6 @@ pre_UR(DECL_ARGS) return (MAN_HEAD != n->type); } -/* ARGSUSED */ static void post_UR(DECL_ARGS) { @@ -990,7 +960,7 @@ print_man_node(DECL_ARGS) int c; switch (n->type) { - case(MAN_TEXT): + case MAN_TEXT: /* * If we have a blank line, output a vertical space. * If we have a space as the first character, break @@ -1005,15 +975,15 @@ print_man_node(DECL_ARGS) term_word(p, n->string); goto out; - case (MAN_EQN): + case MAN_EQN: term_eqn(p, n->eqn); return; - case (MAN_TBL): + case MAN_TBL: /* * Tables are preceded by a newline. Then process a * table line, which will cause line termination, */ - if (TBL_SPAN_FIRST & n->span->flags) + if (TBL_SPAN_FIRST & n->span->flags) term_newln(p); term_tbl(p, n->span); return; @@ -1076,7 +1046,6 @@ print_man_nodelist(DECL_ARGS) print_man_nodelist(p, mt, n->next, meta); } - static void print_man_foot(struct termp *p, const void *arg) { @@ -1144,7 +1113,6 @@ print_man_foot(struct termp *p, const void *arg) term_flushln(p); } - static void print_man_head(struct termp *p, const void *arg) { @@ -1171,7 +1139,7 @@ print_man_head(struct termp *p, const void *arg) p->trailspace = 1; p->offset = 0; p->rmargin = 2 * (titlen+1) + buflen < p->maxrmargin ? - (p->maxrmargin - + (p->maxrmargin - term_strlen(p, buf) + term_len(p, 1)) / 2 : p->maxrmargin - buflen; @@ -1204,7 +1172,7 @@ print_man_head(struct termp *p, const void *arg) p->offset = 0; p->rmargin = p->maxrmargin; - /* + /* * Groff prints three blank lines before the content. * Do the same, except in the temporary, undocumented * mode imitating mdoc(7) output.