=================================================================== RCS file: /cvs/mandoc/mdoc_term.c,v retrieving revision 1.162 retrieving revision 1.168 diff -u -p -r1.162 -r1.168 --- mandoc/mdoc_term.c 2010/06/29 19:20:38 1.162 +++ mandoc/mdoc_term.c 2010/07/02 15:03:14 1.168 @@ -1,4 +1,4 @@ -/* $Id: mdoc_term.c,v 1.162 2010/06/29 19:20:38 schwarze Exp $ */ +/* $Id: mdoc_term.c,v 1.168 2010/07/02 15:03:14 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -57,7 +57,6 @@ static size_t a2width(const struct termp *, const ch static size_t a2height(const struct termp *, const char *); static size_t a2offs(const struct termp *, const char *); -static int arg_hasattr(int, const struct mdoc_node *); static int arg_getattr(int, const struct mdoc_node *); static void print_bvspace(struct termp *, const struct mdoc_node *, @@ -85,6 +84,7 @@ 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); @@ -170,7 +170,7 @@ static const struct termact termacts[MDOC_MAX] = { { termp_in_pre, termp_in_post }, /* In */ { termp_li_pre, NULL }, /* Li */ { termp_nd_pre, NULL }, /* Nd */ - { termp_nm_pre, NULL }, /* Nm */ + { termp_nm_pre, termp_nm_post }, /* Nm */ { termp_op_pre, termp_op_post }, /* Op */ { NULL, NULL }, /* Ot */ { termp_under_pre, NULL }, /* Pa */ @@ -327,7 +327,7 @@ print_mdoc_node(DECL_ARGS) if (MDOC_TEXT == n->type) term_word(p, n->string); - else if (termacts[n->tok].pre && !n->end) + else if (termacts[n->tok].pre && ENDBODY_NOT == n->end) chld = (*termacts[n->tok].pre)(p, &npair, m, n); if (chld && n->child) @@ -335,17 +335,16 @@ print_mdoc_node(DECL_ARGS) term_fontpopq(p, font); - if (MDOC_TEXT != n->type && - termacts[n->tok].post && - ! (MDOC_ENDED & n->flags)) { - (*termacts[n->tok].post)(p, &npair, m, n); + if (MDOC_TEXT != n->type && termacts[n->tok].post && + ! (MDOC_ENDED & n->flags)) { + (void)(*termacts[n->tok].post)(p, &npair, m, n); /* * Explicit end tokens not only call the post * handler, but also tell the respective block * that it must not call the post handler again. */ - if (n->end) + if (ENDBODY_NOT != n->end) n->pending->flags |= MDOC_ENDED; /* @@ -528,18 +527,6 @@ a2offs(const struct termp *p, const char *v) /* - * Return 1 if an argument has a particular argument value or 0 if it - * does not. See arg_getattr(). - */ -static int -arg_hasattr(int arg, const struct mdoc_node *n) -{ - - return(-1 != arg_getattr(arg, n)); -} - - -/* * Get the index of an argument in a node's argument list or -1 if it * does not exist. */ @@ -573,9 +560,9 @@ print_bvspace(struct termp *p, term_newln(p); - if (MDOC_Bd == bl->tok && bl->data.Bd.comp) + if (MDOC_Bd == bl->tok && bl->data.Bd->comp) return; - if (MDOC_Bl == bl->tok && bl->data.Bl.comp) + if (MDOC_Bl == bl->tok && bl->data.Bl->comp) return; /* Do not vspace directly after Ss/Sh. */ @@ -594,13 +581,13 @@ print_bvspace(struct termp *p, /* A `-column' does not assert vspace within the list. */ - if (MDOC_Bl == bl->tok && LIST_column == bl->data.Bl.type) + if (MDOC_Bl == bl->tok && LIST_column == bl->data.Bl->type) if (n->prev && MDOC_It == n->prev->tok) return; /* A `-diag' without body does not vspace. */ - if (MDOC_Bl == bl->tok && LIST_diag == bl->data.Bl.type) + if (MDOC_Bl == bl->tok && LIST_diag == bl->data.Bl->type) if (n->prev && MDOC_It == n->prev->tok) { assert(n->prev->body); if (NULL == n->prev->body->child) @@ -654,7 +641,8 @@ termp_it_pre(DECL_ARGS) } bl = n->parent->parent->parent; - type = bl->data.Bl.type; + assert(bl->data.Bl); + type = bl->data.Bl->type; /* * First calculate width and offset. This is pretty easy unless @@ -664,8 +652,8 @@ termp_it_pre(DECL_ARGS) width = offset = 0; - if (bl->data.Bl.offs) - offset = a2offs(p, bl->data.Bl.offs); + if (bl->data.Bl->offs) + offset = a2offs(p, bl->data.Bl->offs); switch (type) { case (LIST_column): @@ -715,7 +703,7 @@ termp_it_pre(DECL_ARGS) width = a2width(p, bl->args->argv[col].value[i]) + dcol; break; default: - if (NULL == bl->data.Bl.width) + if (NULL == bl->data.Bl->width) break; /* @@ -723,8 +711,8 @@ termp_it_pre(DECL_ARGS) * number for buffering single arguments. See the above * handling for column for how this changes. */ - assert(bl->data.Bl.width); - width = a2width(p, bl->data.Bl.width) + term_len(p, 2); + assert(bl->data.Bl->width); + width = a2width(p, bl->data.Bl->width) + term_len(p, 2); break; } @@ -986,7 +974,7 @@ termp_it_post(DECL_ARGS) if (MDOC_BLOCK == n->type) return; - type = n->parent->parent->parent->data.Bl.type; + type = n->parent->parent->parent->data.Bl->type; switch (type) { case (LIST_item): @@ -1025,11 +1013,35 @@ static int termp_nm_pre(DECL_ARGS) { - if (NULL == n->child && NULL == m->name) + if (MDOC_BLOCK == n->type) return(1); + if (MDOC_BODY == n->type) { + if (NULL == n->child) + return(0); + p->flags |= TERMP_NOLPAD | TERMP_NOSPACE; + p->offset += term_len(p, 1) + + (NULL == n->prev->child ? term_strlen(p, m->name) : + MDOC_TEXT == n->prev->child->type ? + term_strlen(p, n->prev->child->string) : + term_len(p, 5)); + return(1); + } + + if (NULL == n->child && NULL == m->name) + return(0); + synopsis_pre(p, n); + 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)); + } + term_fontpush(p, TERMFONT_BOLD); if (NULL == n->child) term_word(p, m->name); @@ -1038,6 +1050,21 @@ termp_nm_pre(DECL_ARGS) /* ARGSUSED */ +static void +termp_nm_post(DECL_ARGS) +{ + + if (MDOC_HEAD == n->type && n->next->child) { + term_flushln(p); + p->flags &= ~(TERMP_NOBREAK | TERMP_HANG); + } else if (MDOC_BODY == n->type && n->child) { + term_flushln(p); + p->flags &= ~TERMP_NOLPAD; + } +} + + +/* ARGSUSED */ static int termp_fl_pre(DECL_ARGS) { @@ -1101,10 +1128,10 @@ termp_an_post(DECL_ARGS) return; } - if (arg_hasattr(MDOC_Split, n)) { + if (AUTH_split == n->data.An.auth) { p->flags &= ~TERMP_NOSPLIT; p->flags |= TERMP_SPLIT; - } else { + } else if (AUTH_nosplit == n->data.An.auth) { p->flags &= ~TERMP_SPLIT; p->flags |= TERMP_NOSPLIT; } @@ -1608,8 +1635,9 @@ termp_bd_pre(DECL_ARGS) } else if (MDOC_HEAD == n->type) return(0); - if (n->data.Bd.offs) - p->offset += a2offs(p, n->data.Bd.offs); + assert(n->data.Bd); + if (n->data.Bd->offs) + p->offset += a2offs(p, n->data.Bd->offs); /* * If -ragged or -filled are specified, the block does nothing @@ -1619,8 +1647,8 @@ termp_bd_pre(DECL_ARGS) * lines are allowed. */ - if (DISP_literal != n->data.Bd.type && - DISP_unfilled != n->data.Bd.type) + if (DISP_literal != n->data.Bd->type && + DISP_unfilled != n->data.Bd->type) return(1); tabwidth = p->tabwidth; @@ -1657,8 +1685,9 @@ termp_bd_post(DECL_ARGS) rm = p->rmargin; rmax = p->maxrmargin; - if (DISP_literal == n->data.Bd.type || - DISP_unfilled == n->data.Bd.type) + assert(n->data.Bd); + if (DISP_literal == n->data.Bd->type || + DISP_unfilled == n->data.Bd->type) p->rmargin = p->maxrmargin = TERM_MAXMARGIN; p->flags |= TERMP_NOSPACE; @@ -2015,30 +2044,19 @@ termp_fo_post(DECL_ARGS) static int termp_bf_pre(DECL_ARGS) { - const struct mdoc_node *nn; if (MDOC_HEAD == n->type) return(0); else if (MDOC_BLOCK != n->type) return(1); - if (NULL == (nn = n->head->child)) { - if (arg_hasattr(MDOC_Emphasis, n)) - term_fontpush(p, TERMFONT_UNDER); - else if (arg_hasattr(MDOC_Symbolic, n)) - term_fontpush(p, TERMFONT_BOLD); - else - term_fontpush(p, TERMFONT_NONE); + assert(n->data.Bf); - return(1); - } - - assert(MDOC_TEXT == nn->type); - if (0 == strcmp("Em", nn->string)) + if (FONT_Em == n->data.Bf->font) term_fontpush(p, TERMFONT_UNDER); - else if (0 == strcmp("Sy", nn->string)) + else if (FONT_Sy == n->data.Bf->font) term_fontpush(p, TERMFONT_BOLD); - else + else term_fontpush(p, TERMFONT_NONE); return(1); @@ -2128,15 +2146,18 @@ termp_bk_pre(DECL_ARGS) switch (n->type) { case (MDOC_BLOCK): - return(1); + break; case (MDOC_HEAD): return(0); case (MDOC_BODY): p->flags |= TERMP_PREKEEP; - return(1); + break; default: abort(); + /* NOTREACHED */ } + + return(1); }