=================================================================== RCS file: /cvs/mandoc/term.c,v retrieving revision 1.34 retrieving revision 1.36 diff -u -p -r1.34 -r1.36 --- mandoc/term.c 2009/03/02 12:09:32 1.34 +++ mandoc/term.c 2009/03/02 17:29:16 1.36 @@ -1,4 +1,4 @@ -/* $Id: term.c,v 1.34 2009/03/02 12:09:32 kristaps Exp $ */ +/* $Id: term.c,v 1.36 2009/03/02 17:29:16 kristaps Exp $ */ /* * Copyright (c) 2009 Kristaps Dzonsons * @@ -30,7 +30,6 @@ * post-fix operations are defined here. */ -/* FIXME: indent/tab. */ /* FIXME: macro arguments can be escaped. */ #define TTYPE_PROG 0 @@ -59,6 +58,8 @@ * the same thing (like .Ex -std cmd and .Nm cmd). */ +/* TODO: abstract this into mdocterm.c. */ + const int ttypes[TTYPE_NMAX] = { TERMP_BOLD, /* TTYPE_PROG */ TERMP_BOLD, /* TTYPE_CMD_FLAG */ @@ -1051,8 +1052,8 @@ static int termp_bd_pre(DECL_ARGS) { const struct mdoc_block *bl; - const struct mdoc_node *n; - int i; + const struct mdoc_node *n; + int i, type; if (MDOC_BLOCK == node->type) { if (node->prev) @@ -1061,31 +1062,55 @@ termp_bd_pre(DECL_ARGS) } else if (MDOC_BODY != node->type) return(1); - assert(MDOC_BLOCK == node->parent->type); pair->offset = p->offset; - bl = &node->parent->data.block; + for (type = -1, i = 0; i < (int)bl->argc; i++) { + switch (bl->argv[i].arg) { + case (MDOC_Ragged): + /* FALLTHROUGH */ + case (MDOC_Filled): + /* FALLTHROUGH */ + case (MDOC_Unfilled): + /* FALLTHROUGH */ + case (MDOC_Literal): + type = bl->argv[i].arg; + i = (int)bl->argc; + break; + default: + errx(1, "display type not supported"); + } + } + + assert(-1 != type); + i = arg_getattr(MDOC_Offset, bl->argc, bl->argv); if (-1 != i) { assert(1 == bl->argv[i].sz); p->offset += arg_offset(&bl->argv[i]); } + + switch (type) { + case (MDOC_Literal): + /* FALLTHROUGH */ + case (MDOC_Unfilled): + break; + default: + return(1); + } + p->flags |= TERMP_LITERAL; for (n = node->child; n; n = n->next) { - if (MDOC_TEXT != n->type) - errx(1, "non-text displays unsupported"); - if ((*n->data.text.string)) { - word(p, n->data.text.string); - flushln(p); - } else - vspace(p); - + if (MDOC_TEXT != n->type) { + warnx("non-text children not yet allowed"); + continue; + } + word(p, n->data.text.string); + flushln(p); } - p->flags &= ~TERMP_LITERAL; return(0); } @@ -1097,7 +1122,11 @@ termp_bd_post(DECL_ARGS) if (MDOC_BODY != node->type) return; - newln(p); + + if ( ! (p->flags & TERMP_LITERAL)) + flushln(p); + + p->flags &= ~TERMP_LITERAL; p->offset = pair->offset; }