=================================================================== RCS file: /cvs/mandoc/mdoc_term.c,v retrieving revision 1.35 retrieving revision 1.39 diff -u -p -r1.35 -r1.39 --- mandoc/mdoc_term.c 2009/07/12 20:24:24 1.35 +++ mandoc/mdoc_term.c 2009/07/14 15:17:25 1.39 @@ -1,4 +1,4 @@ -/* $Id: mdoc_term.c,v 1.35 2009/07/12 20:24:24 kristaps Exp $ */ +/* $Id: mdoc_term.c,v 1.39 2009/07/14 15:17:25 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -147,7 +147,6 @@ static int termp_ft_pre(DECL_ARGS); static int termp_ic_pre(DECL_ARGS); static int termp_in_pre(DECL_ARGS); static int termp_it_pre(DECL_ARGS); -static int termp_lb_pre(DECL_ARGS); static int termp_lk_pre(DECL_ARGS); static int termp_ms_pre(DECL_ARGS); static int termp_mt_pre(DECL_ARGS); @@ -166,7 +165,6 @@ static int termp_sh_pre(DECL_ARGS); static int termp_sm_pre(DECL_ARGS); static int termp_sq_pre(DECL_ARGS); static int termp_ss_pre(DECL_ARGS); -static int termp_st_pre(DECL_ARGS); static int termp_sx_pre(DECL_ARGS); static int termp_sy_pre(DECL_ARGS); static int termp_ud_pre(DECL_ARGS); @@ -213,7 +211,7 @@ static const struct termact termacts[MDOC_MAX] = { { NULL, NULL }, /* Ot */ { termp_pa_pre, NULL }, /* Pa */ { termp_rv_pre, NULL }, /* Rv */ - { termp_st_pre, NULL }, /* St */ + { NULL, NULL }, /* St */ { termp_va_pre, NULL }, /* Va */ { termp_vt_pre, termp_vt_post }, /* Vt */ { termp_xr_pre, NULL }, /* Xr */ @@ -282,7 +280,7 @@ static const struct termact termacts[MDOC_MAX] = { { NULL, NULL }, /* Hf */ { NULL, NULL }, /* Fr */ { termp_ud_pre, NULL }, /* Ud */ - { termp_lb_pre, termp_lb_post }, /* Lb */ + { NULL, termp_lb_post }, /* Lb */ { termp_pp_pre, NULL }, /* Lp */ { termp_lk_pre, NULL }, /* Lk */ { termp_mt_pre, NULL }, /* Mt */ @@ -573,16 +571,15 @@ arg_listtype(const struct mdoc_node *n) /* FALLTHROUGH */ case (MDOC_Column): /* FALLTHROUGH */ + case (MDOC_Hang): + /* FALLTHROUGH */ case (MDOC_Ohang): return(n->args->argv[i].arg); default: break; } - /* FIXME: mandated by parser. */ - - errx(1, "list type not supported"); - /* NOTREACHED */ + return(-1); } @@ -703,7 +700,7 @@ termp_it_pre(DECL_ARGS) { const struct mdoc_node *bl, *n; char buf[7]; - int i, type, keys[3], vals[3], sv; + int i, type, keys[3], vals[3]; size_t width, offset; if (MDOC_BLOCK == node->type) @@ -728,6 +725,7 @@ termp_it_pre(DECL_ARGS) (void)arg_getattrs(keys, vals, 3, bl); type = arg_listtype(bl); + assert(-1 != type); /* Calculate real width and offset. */ @@ -754,7 +752,7 @@ termp_it_pre(DECL_ARGS) /* * List-type can override the width in the case of fixed-head * values (bullet, dash/hyphen, enum). Tags need a non-zero - * offset. + * offset. FIXME: double-check that correct. */ switch (type) { @@ -770,6 +768,10 @@ termp_it_pre(DECL_ARGS) if (width < 5) width = 5; break; + case (MDOC_Hang): + if (0 == width) + width = 8; + break; case (MDOC_Tag): if (0 == width) width = 10; @@ -827,16 +829,30 @@ termp_it_pre(DECL_ARGS) case (MDOC_Enum): /* FALLTHROUGH */ case (MDOC_Hyphen): - /* FALLTHROUGH */ + if (MDOC_HEAD == node->type) + p->flags |= TERMP_NOBREAK; + else + p->flags |= TERMP_NOLPAD; + break; + case (MDOC_Hang): + if (MDOC_HEAD == node->type) + p->flags |= TERMP_NOBREAK; + else + p->flags |= TERMP_NOLPAD; + + if (MDOC_HEAD == node->type) + p->flags |= TERMP_HANG; + break; case (MDOC_Tag): if (MDOC_HEAD == node->type) p->flags |= TERMP_NOBREAK; else p->flags |= TERMP_NOLPAD; - if (MDOC_HEAD == node->type && MDOC_Tag == type) - if (NULL == node->next || - NULL == node->next->child) - p->flags |= TERMP_NONOBREAK; + + if (MDOC_HEAD != node->type) + break; + if (NULL == node->next || NULL == node->next->child) + p->flags |= TERMP_DANGLE; break; case (MDOC_Column): if (MDOC_HEAD == node->type) { @@ -874,6 +890,8 @@ termp_it_pre(DECL_ARGS) /* FALLTHROUGH */ case (MDOC_Hyphen): /* FALLTHROUGH */ + case (MDOC_Hang): + /* FALLTHROUGH */ case (MDOC_Tag): if (MDOC_HEAD == node->type) p->rmargin = p->offset + width; @@ -892,18 +910,19 @@ termp_it_pre(DECL_ARGS) * HEAD character (temporarily bold, in some cases). */ - sv = p->flags; if (MDOC_HEAD == node->type) switch (type) { case (MDOC_Bullet): p->flags |= TERMP_BOLD; term_word(p, "\\[bu]"); + p->flags &= ~TERMP_BOLD; break; case (MDOC_Dash): /* FALLTHROUGH */ case (MDOC_Hyphen): p->flags |= TERMP_BOLD; term_word(p, "\\(hy"); + p->flags &= ~TERMP_BOLD; break; case (MDOC_Enum): (pair->ppair->ppair->count)++; @@ -915,8 +934,6 @@ termp_it_pre(DECL_ARGS) break; } - p->flags = sv; /* Restore saved flags. */ - /* * If we're not going to process our children, indicate so here. */ @@ -956,6 +973,7 @@ termp_it_post(DECL_ARGS) return; type = arg_listtype(node->parent->parent->parent); + assert(-1 != type); switch (type) { case (MDOC_Diag): @@ -1042,18 +1060,6 @@ termp_pp_pre(DECL_ARGS) /* ARGSUSED */ static int -termp_st_pre(DECL_ARGS) -{ - const char *cp; - - if (node->child && (cp = mdoc_a2st(node->child->string))) - term_word(p, cp); - return(0); -} - - -/* ARGSUSED */ -static int termp_rs_pre(DECL_ARGS) { @@ -1292,23 +1298,6 @@ termp_bt_pre(DECL_ARGS) { term_word(p, "is currently in beta test."); - return(1); -} - - -/* ARGSUSED */ -static int -termp_lb_pre(DECL_ARGS) -{ - const char *lb; - - assert(node->child && MDOC_TEXT == node->child->type); - lb = mdoc_a2lib(node->child->string); - if (lb) { - term_word(p, lb); - return(0); - } - term_word(p, "library"); return(1); }