=================================================================== RCS file: /cvs/mandoc/mdoc_term.c,v retrieving revision 1.181 retrieving revision 1.194 diff -u -p -r1.181 -r1.194 --- mandoc/mdoc_term.c 2010/08/09 00:00:37 1.181 +++ mandoc/mdoc_term.c 2010/10/23 23:31:10 1.194 @@ -1,4 +1,4 @@ -/* $Id: mdoc_term.c,v 1.181 2010/08/09 00:00:37 kristaps Exp $ */ +/* $Id: mdoc_term.c,v 1.194 2010/10/23 23:31:10 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons * Copyright (c) 2010 Ingo Schwarze @@ -69,49 +69,40 @@ static void synopsis_pre(struct termp *, static void termp____post(DECL_ARGS); static void termp_an_post(DECL_ARGS); -static void termp_aq_post(DECL_ARGS); static void termp_bd_post(DECL_ARGS); static void termp_bk_post(DECL_ARGS); static void termp_bl_post(DECL_ARGS); -static void termp_bq_post(DECL_ARGS); -static void termp_brq_post(DECL_ARGS); static void termp_bx_post(DECL_ARGS); static void termp_d1_post(DECL_ARGS); -static void termp_dq_post(DECL_ARGS); -static int termp_fd_pre(DECL_ARGS); static void termp_fo_post(DECL_ARGS); static void termp_in_post(DECL_ARGS); static void termp_it_post(DECL_ARGS); static void termp_lb_post(DECL_ARGS); static void termp_nm_post(DECL_ARGS); -static void termp_op_post(DECL_ARGS); static void termp_pf_post(DECL_ARGS); -static void termp_pq_post(DECL_ARGS); -static void termp_qq_post(DECL_ARGS); +static void termp_quote_post(DECL_ARGS); static void termp_sh_post(DECL_ARGS); -static void termp_sq_post(DECL_ARGS); static void termp_ss_post(DECL_ARGS); +static int termp__a_pre(DECL_ARGS); static int termp_an_pre(DECL_ARGS); static int termp_ap_pre(DECL_ARGS); -static int termp_aq_pre(DECL_ARGS); static int termp_bd_pre(DECL_ARGS); static int termp_bf_pre(DECL_ARGS); static int termp_bk_pre(DECL_ARGS); static int termp_bl_pre(DECL_ARGS); static int termp_bold_pre(DECL_ARGS); -static int termp_bq_pre(DECL_ARGS); -static int termp_brq_pre(DECL_ARGS); static int termp_bt_pre(DECL_ARGS); static int termp_cd_pre(DECL_ARGS); static int termp_d1_pre(DECL_ARGS); -static int termp_dq_pre(DECL_ARGS); static int termp_ex_pre(DECL_ARGS); static int termp_fa_pre(DECL_ARGS); +static int termp_fd_pre(DECL_ARGS); static int termp_fl_pre(DECL_ARGS); static int termp_fn_pre(DECL_ARGS); static int termp_fo_pre(DECL_ARGS); static int termp_ft_pre(DECL_ARGS); +static int termp_igndelim_pre(DECL_ARGS); static int termp_in_pre(DECL_ARGS); static int termp_it_pre(DECL_ARGS); static int termp_li_pre(DECL_ARGS); @@ -119,16 +110,12 @@ static int termp_lk_pre(DECL_ARGS); static int termp_nd_pre(DECL_ARGS); static int termp_nm_pre(DECL_ARGS); static int termp_ns_pre(DECL_ARGS); -static int termp_op_pre(DECL_ARGS); -static int termp_pf_pre(DECL_ARGS); -static int termp_pq_pre(DECL_ARGS); -static int termp_qq_pre(DECL_ARGS); +static int termp_quote_pre(DECL_ARGS); static int termp_rs_pre(DECL_ARGS); static int termp_rv_pre(DECL_ARGS); static int termp_sh_pre(DECL_ARGS); static int termp_sm_pre(DECL_ARGS); static int termp_sp_pre(DECL_ARGS); -static int termp_sq_pre(DECL_ARGS); static int termp_ss_pre(DECL_ARGS); static int termp_under_pre(DECL_ARGS); static int termp_ud_pre(DECL_ARGS); @@ -170,7 +157,7 @@ static const struct termact termacts[MDOC_MAX] = { { termp_li_pre, NULL }, /* Li */ { termp_nd_pre, NULL }, /* Nd */ { termp_nm_pre, termp_nm_post }, /* Nm */ - { termp_op_pre, termp_op_post }, /* Op */ + { termp_quote_pre, termp_quote_post }, /* Op */ { NULL, NULL }, /* Ot */ { termp_under_pre, NULL }, /* Pa */ { termp_rv_pre, NULL }, /* Rv */ @@ -178,7 +165,7 @@ static const struct termact termacts[MDOC_MAX] = { { termp_under_pre, NULL }, /* Va */ { termp_vt_pre, NULL }, /* Vt */ { termp_xr_pre, NULL }, /* Xr */ - { NULL, termp____post }, /* %A */ + { termp__a_pre, termp____post }, /* %A */ { termp_under_pre, termp____post }, /* %B */ { NULL, termp____post }, /* %D */ { termp_under_pre, termp____post }, /* %I */ @@ -190,42 +177,42 @@ static const struct termact termacts[MDOC_MAX] = { { termp_under_pre, termp____post }, /* %T */ { NULL, termp____post }, /* %V */ { NULL, NULL }, /* Ac */ - { termp_aq_pre, termp_aq_post }, /* Ao */ - { termp_aq_pre, termp_aq_post }, /* Aq */ + { termp_quote_pre, termp_quote_post }, /* Ao */ + { termp_quote_pre, termp_quote_post }, /* Aq */ { NULL, NULL }, /* At */ { NULL, NULL }, /* Bc */ { termp_bf_pre, NULL }, /* Bf */ - { termp_bq_pre, termp_bq_post }, /* Bo */ - { termp_bq_pre, termp_bq_post }, /* Bq */ + { termp_quote_pre, termp_quote_post }, /* Bo */ + { termp_quote_pre, termp_quote_post }, /* Bq */ { termp_xx_pre, NULL }, /* Bsx */ { NULL, termp_bx_post }, /* Bx */ { NULL, NULL }, /* Db */ { NULL, NULL }, /* Dc */ - { termp_dq_pre, termp_dq_post }, /* Do */ - { termp_dq_pre, termp_dq_post }, /* Dq */ + { termp_quote_pre, termp_quote_post }, /* Do */ + { termp_quote_pre, termp_quote_post }, /* Dq */ { NULL, NULL }, /* Ec */ /* FIXME: no space */ { NULL, NULL }, /* Ef */ { termp_under_pre, NULL }, /* Em */ { NULL, NULL }, /* Eo */ { termp_xx_pre, NULL }, /* Fx */ { termp_bold_pre, NULL }, /* Ms */ - { NULL, NULL }, /* No */ + { termp_igndelim_pre, NULL }, /* No */ { termp_ns_pre, NULL }, /* Ns */ { termp_xx_pre, NULL }, /* Nx */ { termp_xx_pre, NULL }, /* Ox */ { NULL, NULL }, /* Pc */ - { termp_pf_pre, termp_pf_post }, /* Pf */ - { termp_pq_pre, termp_pq_post }, /* Po */ - { termp_pq_pre, termp_pq_post }, /* Pq */ + { termp_igndelim_pre, termp_pf_post }, /* Pf */ + { termp_quote_pre, termp_quote_post }, /* Po */ + { termp_quote_pre, termp_quote_post }, /* Pq */ { NULL, NULL }, /* Qc */ - { termp_sq_pre, termp_sq_post }, /* Ql */ - { termp_qq_pre, termp_qq_post }, /* Qo */ - { termp_qq_pre, termp_qq_post }, /* Qq */ + { termp_quote_pre, termp_quote_post }, /* Ql */ + { termp_quote_pre, termp_quote_post }, /* Qo */ + { termp_quote_pre, termp_quote_post }, /* Qq */ { NULL, NULL }, /* Re */ { termp_rs_pre, NULL }, /* Rs */ { NULL, NULL }, /* Sc */ - { termp_sq_pre, termp_sq_post }, /* So */ - { termp_sq_pre, termp_sq_post }, /* Sq */ + { termp_quote_pre, termp_quote_post }, /* So */ + { termp_quote_pre, termp_quote_post }, /* Sq */ { termp_sm_pre, NULL }, /* Sm */ { termp_under_pre, NULL }, /* Sx */ { termp_bold_pre, NULL }, /* Sy */ @@ -235,7 +222,7 @@ static const struct termact termacts[MDOC_MAX] = { { NULL, NULL }, /* Xo */ { termp_fo_pre, termp_fo_post }, /* Fo */ { NULL, NULL }, /* Fc */ - { termp_op_pre, termp_op_post }, /* Oo */ + { termp_quote_pre, termp_quote_post }, /* Oo */ { NULL, NULL }, /* Oc */ { termp_bk_pre, termp_bk_post }, /* Bk */ { NULL, NULL }, /* Ek */ @@ -247,8 +234,8 @@ static const struct termact termacts[MDOC_MAX] = { { termp_sp_pre, NULL }, /* Lp */ { termp_lk_pre, NULL }, /* Lk */ { termp_under_pre, NULL }, /* Mt */ - { termp_brq_pre, termp_brq_post }, /* Brq */ - { termp_brq_pre, termp_brq_post }, /* Bro */ + { termp_quote_pre, termp_quote_post }, /* Brq */ + { termp_quote_pre, termp_quote_post }, /* Bro */ { NULL, NULL }, /* Brc */ { NULL, termp____post }, /* %C */ { NULL, NULL }, /* Es */ /* TODO */ @@ -596,33 +583,6 @@ print_bvspace(struct termp *p, /* ARGSUSED */ static int -termp_dq_pre(DECL_ARGS) -{ - - if (MDOC_BODY != n->type) - return(1); - - term_word(p, "\\(lq"); - p->flags |= TERMP_NOSPACE; - return(1); -} - - -/* ARGSUSED */ -static void -termp_dq_post(DECL_ARGS) -{ - - if (MDOC_BODY != n->type) - return; - - p->flags |= TERMP_NOSPACE; - term_word(p, "\\(rq"); -} - - -/* ARGSUSED */ -static int termp_it_pre(DECL_ARGS) { const struct mdoc_node *bl, *nn; @@ -1030,12 +990,18 @@ termp_nm_pre(DECL_ARGS) synopsis_pre(p, n->parent); if (MDOC_HEAD == n->type && n->next->child) { - p->flags |= TERMP_NOSPACE | TERMP_NOBREAK | TERMP_HANG; - p->rmargin = p->offset + term_len(p, 1) + - (NULL == n->child ? term_strlen(p, m->name) : - MDOC_TEXT == n->child->type ? - term_strlen(p, n->child->string) : - term_len(p, 5)); + p->flags |= TERMP_NOSPACE | TERMP_NOBREAK; + p->rmargin = p->offset + term_len(p, 1); + if (NULL == n->child) { + p->rmargin += term_strlen(p, m->name); + } else if (MDOC_TEXT == n->child->type) { + p->rmargin += term_strlen(p, n->child->string); + if (n->child->next) + p->flags |= TERMP_HANG; + } else { + p->rmargin += term_len(p, 5); + p->flags |= TERMP_HANG; + } } term_fontpush(p, TERMFONT_BOLD); @@ -1079,6 +1045,19 @@ termp_fl_pre(DECL_ARGS) /* ARGSUSED */ static int +termp__a_pre(DECL_ARGS) +{ + + if (n->prev && MDOC__A == n->prev->tok) + if (NULL == n->next || MDOC__A != n->next->tok) + term_word(p, "and"); + + return(1); +} + + +/* ARGSUSED */ +static int termp_an_pre(DECL_ARGS) { @@ -1269,18 +1248,6 @@ termp_bl_post(DECL_ARGS) /* ARGSUSED */ -static void -termp_op_post(DECL_ARGS) -{ - - if (MDOC_BODY != n->type) - return; - p->flags |= TERMP_NOSPACE; - term_word(p, "\\(rB"); -} - - -/* ARGSUSED */ static int termp_xr_pre(DECL_ARGS) { @@ -1297,9 +1264,7 @@ termp_xr_pre(DECL_ARGS) return(0); p->flags |= TERMP_NOSPACE; term_word(p, "("); - p->flags |= TERMP_NOSPACE; term_word(p, nn->string); - p->flags |= TERMP_NOSPACE; term_word(p, ")"); return(0); @@ -1449,23 +1414,6 @@ termp_sh_post(DECL_ARGS) /* ARGSUSED */ static int -termp_op_pre(DECL_ARGS) -{ - - switch (n->type) { - case (MDOC_BODY): - term_word(p, "\\(lB"); - p->flags |= TERMP_NOSPACE; - break; - default: - break; - } - return(1); -} - - -/* ARGSUSED */ -static int termp_bt_pre(DECL_ARGS) { @@ -1522,31 +1470,6 @@ termp_d1_post(DECL_ARGS) /* ARGSUSED */ static int -termp_aq_pre(DECL_ARGS) -{ - - if (MDOC_BODY != n->type) - return(1); - term_word(p, "\\(la"); - p->flags |= TERMP_NOSPACE; - return(1); -} - - -/* ARGSUSED */ -static void -termp_aq_post(DECL_ARGS) -{ - - if (MDOC_BODY != n->type) - return; - p->flags |= TERMP_NOSPACE; - term_word(p, "\\(ra"); -} - - -/* ARGSUSED */ -static int termp_ft_pre(DECL_ARGS) { @@ -1654,6 +1577,28 @@ termp_bd_pre(DECL_ARGS) for (nn = n->child; nn; nn = nn->next) { print_mdoc_node(p, pair, m, nn); + /* + * If the printed node flushes its own line, then we + * needn't do it here as well. This is hacky, but the + * notion of selective eoln whitespace is pretty dumb + * anyway, so don't sweat it. + */ + switch (nn->tok) { + case (MDOC_Sm): + /* FALLTHROUGH */ + case (MDOC_br): + /* FALLTHROUGH */ + case (MDOC_sp): + /* FALLTHROUGH */ + case (MDOC_Bl): + /* FALLTHROUGH */ + case (MDOC_Lp): + /* FALLTHROUGH */ + case (MDOC_Pp): + continue; + default: + break; + } if (nn->next && nn->next->line == nn->line) continue; term_flushln(p); @@ -1693,32 +1638,7 @@ termp_bd_post(DECL_ARGS) /* ARGSUSED */ -static int -termp_qq_pre(DECL_ARGS) -{ - - if (MDOC_BODY != n->type) - return(1); - term_word(p, "\""); - p->flags |= TERMP_NOSPACE; - return(1); -} - - -/* ARGSUSED */ static void -termp_qq_post(DECL_ARGS) -{ - - if (MDOC_BODY != n->type) - return; - p->flags |= TERMP_NOSPACE; - term_word(p, "\""); -} - - -/* ARGSUSED */ -static void termp_bx_post(DECL_ARGS) { @@ -1737,7 +1657,7 @@ termp_xx_pre(DECL_ARGS) pp = NULL; switch (n->tok) { case (MDOC_Bsx): - pp = "BSDI BSD/OS"; + pp = "BSD/OS"; break; case (MDOC_Dx): pp = "DragonFly"; @@ -1766,34 +1686,9 @@ termp_xx_pre(DECL_ARGS) /* ARGSUSED */ static int -termp_sq_pre(DECL_ARGS) +termp_igndelim_pre(DECL_ARGS) { - if (MDOC_BODY != n->type) - return(1); - term_word(p, "\\(oq"); - p->flags |= TERMP_NOSPACE; - return(1); -} - - -/* ARGSUSED */ -static void -termp_sq_post(DECL_ARGS) -{ - - if (MDOC_BODY != n->type) - return; - p->flags |= TERMP_NOSPACE; - term_word(p, "\\(aq"); -} - - -/* ARGSUSED */ -static int -termp_pf_pre(DECL_ARGS) -{ - p->flags |= TERMP_IGNDELIM; return(1); } @@ -1804,7 +1699,6 @@ static void termp_pf_post(DECL_ARGS) { - p->flags &= ~TERMP_IGNDELIM; p->flags |= TERMP_NOSPACE; } @@ -1924,75 +1818,120 @@ termp_sp_pre(DECL_ARGS) /* ARGSUSED */ static int -termp_brq_pre(DECL_ARGS) +termp_quote_pre(DECL_ARGS) { if (MDOC_BODY != n->type) return(1); - term_word(p, "\\(lC"); - p->flags |= TERMP_NOSPACE; - return(1); -} + switch (n->tok) { + case (MDOC_Ao): + /* FALLTHROUGH */ + case (MDOC_Aq): + term_word(p, "<"); + break; + case (MDOC_Bro): + /* FALLTHROUGH */ + case (MDOC_Brq): + term_word(p, "{"); + break; + case (MDOC_Oo): + /* FALLTHROUGH */ + case (MDOC_Op): + /* FALLTHROUGH */ + case (MDOC_Bo): + /* FALLTHROUGH */ + case (MDOC_Bq): + term_word(p, "["); + break; + case (MDOC_Do): + /* FALLTHROUGH */ + case (MDOC_Dq): + term_word(p, "``"); + break; + case (MDOC_Po): + /* FALLTHROUGH */ + case (MDOC_Pq): + term_word(p, "("); + break; + case (MDOC_Qo): + /* FALLTHROUGH */ + case (MDOC_Qq): + term_word(p, "\""); + break; + case (MDOC_Ql): + /* FALLTHROUGH */ + case (MDOC_So): + /* FALLTHROUGH */ + case (MDOC_Sq): + term_word(p, "`"); + break; + default: + abort(); + /* NOTREACHED */ + } -/* ARGSUSED */ -static void -termp_brq_post(DECL_ARGS) -{ - - if (MDOC_BODY != n->type) - return; p->flags |= TERMP_NOSPACE; - term_word(p, "\\(rC"); -} - - -/* ARGSUSED */ -static int -termp_bq_pre(DECL_ARGS) -{ - - if (MDOC_BODY != n->type) - return(1); - term_word(p, "\\(lB"); - p->flags |= TERMP_NOSPACE; return(1); } /* ARGSUSED */ static void -termp_bq_post(DECL_ARGS) +termp_quote_post(DECL_ARGS) { if (MDOC_BODY != n->type) return; - p->flags |= TERMP_NOSPACE; - term_word(p, "\\(rB"); -} - -/* ARGSUSED */ -static int -termp_pq_pre(DECL_ARGS) -{ - - if (MDOC_BODY != n->type) - return(1); - term_word(p, "\\&("); p->flags |= TERMP_NOSPACE; - return(1); -} - -/* ARGSUSED */ -static void -termp_pq_post(DECL_ARGS) -{ - - if (MDOC_BODY != n->type) - return; - term_word(p, ")"); + switch (n->tok) { + case (MDOC_Ao): + /* FALLTHROUGH */ + case (MDOC_Aq): + term_word(p, ">"); + break; + case (MDOC_Bro): + /* FALLTHROUGH */ + case (MDOC_Brq): + term_word(p, "}"); + break; + case (MDOC_Oo): + /* FALLTHROUGH */ + case (MDOC_Op): + /* FALLTHROUGH */ + case (MDOC_Bo): + /* FALLTHROUGH */ + case (MDOC_Bq): + term_word(p, "]"); + break; + case (MDOC_Do): + /* FALLTHROUGH */ + case (MDOC_Dq): + term_word(p, "''"); + break; + case (MDOC_Po): + /* FALLTHROUGH */ + case (MDOC_Pq): + term_word(p, ")"); + break; + case (MDOC_Qo): + /* FALLTHROUGH */ + case (MDOC_Qq): + term_word(p, "\""); + break; + case (MDOC_Ql): + /* FALLTHROUGH */ + case (MDOC_So): + /* FALLTHROUGH */ + case (MDOC_Sq): + term_word(p, "'"); + break; + default: + abort(); + /* NOTREACHED */ + } } @@ -2007,7 +1946,6 @@ termp_fo_pre(DECL_ARGS) } else if (MDOC_BODY == n->type) { p->flags |= TERMP_NOSPACE; term_word(p, "("); - p->flags |= TERMP_NOSPACE; return(1); } @@ -2031,13 +1969,10 @@ termp_fo_post(DECL_ARGS) if (MDOC_BODY != n->type) return; - p->flags |= TERMP_NOSPACE; term_word(p, ")"); - if (MDOC_SYNPRETTY & n->flags) { - p->flags |= TERMP_NOSPACE; + if (MDOC_SYNPRETTY & n->flags) term_word(p, ";"); - } } @@ -2087,7 +2022,7 @@ termp_ap_pre(DECL_ARGS) { p->flags |= TERMP_NOSPACE; - term_word(p, "\\(aq"); + term_word(p, "'"); p->flags |= TERMP_NOSPACE; return(1); } @@ -2098,10 +2033,26 @@ static void termp____post(DECL_ARGS) { + /* + * Handle lists of authors. In general, print each followed by + * a comma. Don't print the comma if there are only two + * authors. + */ + if (MDOC__A == n->tok && n->next && MDOC__A == n->next->tok) + if (NULL == n->next->next || MDOC__A != n->next->next->tok) + if (NULL == n->prev || MDOC__A != n->prev->tok) + return; + /* TODO: %U. */ - p->flags |= TERMP_NOSPACE; - term_word(p, n->next ? "," : "."); + if (NULL == n->parent || MDOC_Rs != n->parent->tok) + return; + + if (NULL == n->next) { + term_word(p, "."); + p->flags |= TERMP_SENTENCE; + } else + term_word(p, ","); } @@ -2133,7 +2084,6 @@ termp_lk_pre(DECL_ARGS) term_fontpop(p); - p->flags |= TERMP_NOSPACE; term_word(p, ":"); term_fontpush(p, TERMFONT_BOLD);