=================================================================== RCS file: /cvs/mandoc/mdoc_term.c,v retrieving revision 1.17 retrieving revision 1.28 diff -u -p -r1.17 -r1.28 --- mandoc/mdoc_term.c 2009/06/22 12:38:07 1.17 +++ mandoc/mdoc_term.c 2009/07/12 17:25:07 1.28 @@ -1,4 +1,4 @@ -/* $Id: mdoc_term.c,v 1.17 2009/06/22 12:38:07 kristaps Exp $ */ +/* $Id: mdoc_term.c,v 1.28 2009/07/12 17:25:07 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -80,26 +80,18 @@ const int ttypes[TTYPE_NMAX] = { TERMP_BOLD /* TTYPE_LIST */ }; -/* XXX - clean this up. */ - +/* + * This is used to preserve a style of value across a macro, instead of + * losing it while the body is processed. + */ struct termpair { struct termpair *ppair; - int type; -#define TERMPAIR_FLAG (1 << 0) int flag; /* Whether being used. */ size_t offset; /* Left margin. */ size_t rmargin; /* Right margin. */ int count; /* Enum count. */ }; -#define TERMPAIR_SETFLAG(termp, p, fl) \ - do { \ - assert(! (TERMPAIR_FLAG & (p)->type)); \ - (termp)->flags |= (fl); \ - (p)->flag = (fl); \ - (p)->type |= TERMPAIR_FLAG; \ - } while ( /* CONSTCOND */ 0) - #define DECL_ARGS \ struct termp *p, struct termpair *pair, \ const struct mdoc_meta *meta, \ @@ -141,16 +133,13 @@ DECL_PRE(termp_ap); DECL_PRE(termp_ar); DECL_PRE(termp_at); DECL_PRE(termp_bf); -DECL_PRE(termp_bsx); DECL_PRE(termp_bt); DECL_PRE(termp_cd); DECL_PRE(termp_cm); -DECL_PRE(termp_dx); DECL_PRE(termp_em); DECL_PRE(termp_ex); DECL_PRE(termp_fa); DECL_PRE(termp_fl); -DECL_PRE(termp_fx); DECL_PRE(termp_ic); DECL_PRE(termp_lk); DECL_PRE(termp_ms); @@ -158,8 +147,7 @@ DECL_PRE(termp_mt); DECL_PRE(termp_nd); DECL_PRE(termp_nm); DECL_PRE(termp_ns); -DECL_PRE(termp_nx); -DECL_PRE(termp_ox); +DECL_PRE(termp_xx); DECL_PRE(termp_pa); DECL_PRE(termp_pp); DECL_PRE(termp_rs); @@ -169,7 +157,6 @@ DECL_PRE(termp_st); DECL_PRE(termp_sx); DECL_PRE(termp_sy); DECL_PRE(termp_ud); -DECL_PRE(termp_ux); DECL_PRE(termp_va); DECL_PRE(termp_xr); @@ -243,7 +230,7 @@ static const struct termact termacts[MDOC_MAX] = { { termp_bf_pre, NULL }, /* Bf */ { termp_bq_pre, termp_bq_post }, /* Bo */ { termp_bq_pre, termp_bq_post }, /* Bq */ - { termp_bsx_pre, NULL }, /* Bsx */ + { termp_xx_pre, NULL }, /* Bsx */ { NULL, termp_bx_post }, /* Bx */ { NULL, NULL }, /* Db */ { NULL, NULL }, /* Dc */ @@ -253,12 +240,12 @@ static const struct termact termacts[MDOC_MAX] = { { NULL, NULL }, /* Ef */ { termp_em_pre, NULL }, /* Em */ { NULL, NULL }, /* Eo */ - { termp_fx_pre, NULL }, /* Fx */ + { termp_xx_pre, NULL }, /* Fx */ { termp_ms_pre, NULL }, /* Ms */ { NULL, NULL }, /* No */ { termp_ns_pre, NULL }, /* Ns */ - { termp_nx_pre, NULL }, /* Nx */ - { termp_ox_pre, NULL }, /* Ox */ + { 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 */ @@ -276,7 +263,7 @@ static const struct termact termacts[MDOC_MAX] = { { termp_sx_pre, NULL }, /* Sx */ { termp_sy_pre, NULL }, /* Sy */ { NULL, NULL }, /* Tn */ - { termp_ux_pre, NULL }, /* Ux */ + { termp_xx_pre, NULL }, /* Ux */ { NULL, NULL }, /* Xc */ { NULL, NULL }, /* Xo */ { termp_fo_pre, termp_fo_post }, /* Fo */ @@ -299,7 +286,7 @@ static const struct termact termacts[MDOC_MAX] = { { NULL, NULL }, /* %C */ { NULL, NULL }, /* Es */ { NULL, NULL }, /* En */ - { termp_dx_pre, NULL }, /* Dx */ + { termp_xx_pre, NULL }, /* Dx */ { NULL, NULL }, /* %Q */ }; @@ -365,7 +352,6 @@ print_node(DECL_ARGS) dochild = 1; npair.ppair = pair; - npair.type = 0; npair.offset = npair.rmargin = 0; npair.flag = 0; npair.count = 0; @@ -379,14 +365,12 @@ print_node(DECL_ARGS) /* Children. */ - if (TERMPAIR_FLAG & npair.type) - p->flags |= npair.flag; + p->flags |= npair.flag; if (dochild && node->child) print_body(p, &npair, meta, node->child); - if (TERMPAIR_FLAG & npair.type) - p->flags &= ~npair.flag; + p->flags &= ~npair.flag; /* Post-processing. */ @@ -532,10 +516,6 @@ arg_width(const struct mdoc_argv *arg, int pos) assert(pos < (int)arg->sz && pos >= 0); assert(arg->value[pos]); - if (0 == strcmp(arg->value[pos], "indent")) - return(INDENT + 3); - if (0 == strcmp(arg->value[pos], "indent-two")) - return(INDENT * 2 + 2); if (0 == (len = (int)strlen(arg->value[pos]))) return(0); @@ -604,11 +584,11 @@ arg_offset(const struct mdoc_argv *arg) assert(*arg->value); if (0 == strcmp(*arg->value, "left")) - return(INDENT - 1); + return(0); if (0 == strcmp(*arg->value, "indent")) return(INDENT + 1); if (0 == strcmp(*arg->value, "indent-two")) - return(INDENT * 2); + return((INDENT + 1) * 2); /* FIXME: needs to support field-widths (10n, etc.). */ @@ -761,7 +741,7 @@ termp_it_pre(DECL_ARGS) if (vals[0] >= 0) width = arg_width(&bl->args->argv[vals[0]], 0); if (vals[1] >= 0) - offset = arg_offset(&bl->args->argv[vals[1]]); + offset += arg_offset(&bl->args->argv[vals[1]]); break; } @@ -917,7 +897,7 @@ termp_it_pre(DECL_ARGS) /* FALLTHROUGH */ case (MDOC_Hyphen): p->flags |= TERMP_BOLD; - term_word(p, "\\-"); + term_word(p, "\\(hy"); break; case (MDOC_Enum): (pair->ppair->ppair->count)++; @@ -1003,7 +983,9 @@ termp_nm_pre(DECL_ARGS) if (SEC_SYNOPSIS == node->sec) term_newln(p); - TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_PROG]); + pair->flag |= ttypes[TTYPE_PROG]; + p->flags |= ttypes[TTYPE_PROG]; + if (NULL == node->child) term_word(p, meta->name); @@ -1016,7 +998,8 @@ static int termp_fl_pre(DECL_ARGS) { - TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_CMD_FLAG]); + pair->flag |= ttypes[TTYPE_CMD_FLAG]; + p->flags |= ttypes[TTYPE_CMD_FLAG]; term_word(p, "\\-"); p->flags |= TERMP_NOSPACE; return(1); @@ -1028,7 +1011,7 @@ static int termp_ar_pre(DECL_ARGS) { - TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_CMD_ARG]); + pair->flag |= ttypes[TTYPE_CMD_ARG]; return(1); } @@ -1139,7 +1122,18 @@ static int termp_nd_pre(DECL_ARGS) { + if (MDOC_BODY != node->type) + return(1); + /* + * XXX: signed off by jmc@openbsd.org. This technically + * produces a minus sign after the Nd, which is wrong, but is + * consistent with the historic OpenBSD tmac file. + */ +#if defined(__OpenBSD__) || defined(__linux__) term_word(p, "\\-"); +#else + term_word(p, "\\(em"); +#endif return(1); } @@ -1194,7 +1188,7 @@ termp_vt_pre(DECL_ARGS) { /* FIXME: this can be "type name". */ - TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_VAR_DECL]); + pair->flag |= TTYPE_VAR_DECL; return(1); } @@ -1214,11 +1208,7 @@ static int termp_fd_pre(DECL_ARGS) { - /* - * FIXME: this naming is bad. This value is used, in general, - * for the #include header or other preprocessor statement. - */ - TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_FUNC_DECL]); + pair->flag |= TTYPE_FUNC_DECL; return(1); } @@ -1244,7 +1234,7 @@ termp_sh_pre(DECL_ARGS) switch (node->type) { case (MDOC_HEAD): term_vspace(p); - TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_SECTION]); + pair->flag |= ttypes[TTYPE_SECTION]; break; case (MDOC_BODY): p->offset = INDENT; @@ -1309,7 +1299,8 @@ termp_lb_pre(DECL_ARGS) const char *lb; assert(node->child && MDOC_TEXT == node->child->type); - if ((lb = mdoc_a2lib(node->child->string))) { + lb = mdoc_a2lib(node->child->string); + if (lb) { term_word(p, lb); return(0); } @@ -1396,7 +1387,7 @@ termp_ft_pre(DECL_ARGS) if (SEC_SYNOPSIS == node->sec) if (node->prev && MDOC_Fo == node->prev->tok) term_vspace(p); - TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_FUNC_TYPE]); + pair->flag |= ttypes[TTYPE_FUNC_TYPE]; return(1); } @@ -1452,7 +1443,6 @@ termp_fn_post(DECL_ARGS) if (node->sec == SEC_SYNOPSIS && node->next) term_vspace(p); - } @@ -1461,7 +1451,7 @@ static int termp_sx_pre(DECL_ARGS) { - TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_LINK]); + pair->flag |= ttypes[TTYPE_LINK]; return(1); } @@ -1473,7 +1463,7 @@ termp_fa_pre(DECL_ARGS) struct mdoc_node *n; if (node->parent->tok != MDOC_Fo) { - TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_FUNC_ARG]); + pair->flag |= ttypes[TTYPE_FUNC_ARG]; return(1); } @@ -1497,7 +1487,7 @@ static int termp_va_pre(DECL_ARGS) { - TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_VAR_DECL]); + pair->flag |= ttypes[TTYPE_VAR_DECL]; return(1); } @@ -1631,16 +1621,6 @@ termp_qq_post(DECL_ARGS) /* ARGSUSED */ -static int -termp_bsx_pre(DECL_ARGS) -{ - - term_word(p, "BSDI BSD/OS"); - return(1); -} - - -/* ARGSUSED */ static void termp_bx_post(DECL_ARGS) { @@ -1653,56 +1633,42 @@ termp_bx_post(DECL_ARGS) /* ARGSUSED */ static int -termp_ox_pre(DECL_ARGS) +termp_xx_pre(DECL_ARGS) { + const char *pp; - term_word(p, "OpenBSD"); - return(1); -} + pp = NULL; + switch (node->tok) { + case (MDOC_Bsx): + pp = "BSDI BSD/OS"; + break; + case (MDOC_Dx): + pp = "DragonFlyBSD"; + break; + case (MDOC_Fx): + pp = "FreeBSD"; + break; + case (MDOC_Nx): + pp = "NetBSD"; + break; + case (MDOC_Ox): + pp = "OpenBSD"; + break; + case (MDOC_Ux): + pp = "UNIX"; + break; + default: + break; + } - -/* ARGSUSED */ -static int -termp_dx_pre(DECL_ARGS) -{ - - term_word(p, "DragonFly"); + assert(pp); + term_word(p, pp); return(1); } /* ARGSUSED */ static int -termp_ux_pre(DECL_ARGS) -{ - - term_word(p, "UNIX"); - return(1); -} - - -/* ARGSUSED */ -static int -termp_fx_pre(DECL_ARGS) -{ - - term_word(p, "FreeBSD"); - return(1); -} - - -/* ARGSUSED */ -static int -termp_nx_pre(DECL_ARGS) -{ - - term_word(p, "NetBSD"); - return(1); -} - - -/* ARGSUSED */ -static int termp_sq_pre(DECL_ARGS) { @@ -1758,7 +1724,7 @@ termp_ss_pre(DECL_ARGS) term_vspace(p); break; case (MDOC_HEAD): - TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_SSECTION]); + pair->flag |= ttypes[TTYPE_SSECTION]; p->offset = HALFINDENT; break; default: @@ -1790,7 +1756,7 @@ static int termp_pa_pre(DECL_ARGS) { - TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_FILE]); + pair->flag |= ttypes[TTYPE_FILE]; return(1); } @@ -1800,7 +1766,7 @@ static int termp_em_pre(DECL_ARGS) { - TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_EMPH]); + pair->flag |= ttypes[TTYPE_EMPH]; return(1); } @@ -1810,7 +1776,7 @@ static int termp_cd_pre(DECL_ARGS) { - TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_CONFIG]); + pair->flag |= ttypes[TTYPE_CONFIG]; term_newln(p); return(1); } @@ -1821,7 +1787,7 @@ static int termp_cm_pre(DECL_ARGS) { - TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_CMD_FLAG]); + pair->flag |= ttypes[TTYPE_CMD_FLAG]; return(1); } @@ -1831,7 +1797,7 @@ static int termp_ic_pre(DECL_ARGS) { - TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_CMD]); + pair->flag |= ttypes[TTYPE_CMD]; return(1); } @@ -1841,8 +1807,12 @@ static int termp_in_pre(DECL_ARGS) { - TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_INCLUDE]); - term_word(p, "#include"); + pair->flag |= ttypes[TTYPE_INCLUDE]; + p->flags |= ttypes[TTYPE_INCLUDE]; + + if (SEC_SYNOPSIS == node->sec) + term_word(p, "#include"); + term_word(p, "<"); p->flags |= TERMP_NOSPACE; return(1); @@ -1857,9 +1827,16 @@ termp_in_post(DECL_ARGS) p->flags |= TERMP_NOSPACE; term_word(p, ">"); - term_newln(p); if (SEC_SYNOPSIS != node->sec) return; + + term_newln(p); + /* + * XXX Not entirely correct. If `.In foo bar' is specified in + * the SYNOPSIS section, then it produces a single break after + * the ; mandoc asserts a vertical space. Since this + * construction is rarely used, I think it's fine. + */ if (node->next && MDOC_In != node->next->tok) term_vspace(p); } @@ -2004,25 +1981,25 @@ termp_bf_pre(DECL_ARGS) { const struct mdoc_node *n; - if (MDOC_HEAD == node->type) { + if (MDOC_HEAD == node->type) return(0); - } else if (MDOC_BLOCK != node->type) + else if (MDOC_BLOCK != node->type) return(1); if (NULL == (n = node->head->child)) { if (arg_hasattr(MDOC_Emphasis, node)) - TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_EMPH]); + pair->flag |= ttypes[TTYPE_EMPH]; else if (arg_hasattr(MDOC_Symbolic, node)) - TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_SYMB]); + pair->flag |= ttypes[TTYPE_SYMB]; return(1); } assert(MDOC_TEXT == n->type); if (0 == strcmp("Em", n->string)) - TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_EMPH]); + pair->flag |= ttypes[TTYPE_EMPH]; else if (0 == strcmp("Sy", n->string)) - TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_EMPH]); + pair->flag |= ttypes[TTYPE_SYMB]; return(1); } @@ -2033,7 +2010,7 @@ static int termp_sy_pre(DECL_ARGS) { - TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_SYMB]); + pair->flag |= ttypes[TTYPE_SYMB]; return(1); } @@ -2043,7 +2020,7 @@ static int termp_ms_pre(DECL_ARGS) { - TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_SYMBOL]); + pair->flag |= ttypes[TTYPE_SYMBOL]; return(1); } @@ -2082,7 +2059,7 @@ static int termp__j_pre(DECL_ARGS) { - TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_REF_JOURNAL]); + pair->flag |= ttypes[TTYPE_REF_JOURNAL]; return(1); } @@ -2129,7 +2106,7 @@ termp_lk_pre(DECL_ARGS) n = node->child; if (NULL == n->next) { - TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_LINK_ANCHOR]); + pair->flag |= ttypes[TTYPE_LINK_ANCHOR]; return(1); } @@ -2153,7 +2130,7 @@ static int termp_mt_pre(DECL_ARGS) { - TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_LINK_ANCHOR]); + pair->flag |= ttypes[TTYPE_LINK_ANCHOR]; return(1); }