+ if (node->sec == SEC_SYNOPSIS && node->next)
+ vspace(p);
+
+}
+
+
+/* ARGSUSED */
+static int
+termp_sx_pre(DECL_ARGS)
+{
+
+ TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_LINK]);
+ return(1);
+}
+
+
+/* ARGSUSED */
+static int
+termp_fa_pre(DECL_ARGS)
+{
+ struct mdoc_node *n;
+
+ if (node->parent->tok != MDOC_Fo) {
+ TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_FUNC_ARG]);
+ return(1);
+ }
+
+ for (n = node->child; n; n = n->next) {
+ assert(MDOC_TEXT == n->type);
+
+ p->flags |= ttypes[TTYPE_FUNC_ARG];
+ word(p, n->data.text.string);
+ p->flags &= ~ttypes[TTYPE_FUNC_ARG];
+
+ if (n->next)
+ word(p, ",");
+ }
+
+ if (node->next && node->next->tok == MDOC_Fa)
+ word(p, ",");
+
+ return(0);
+}
+
+
+/* ARGSUSED */
+static int
+termp_va_pre(DECL_ARGS)
+{
+
+ TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_VAR_DECL]);
+ return(1);
+}
+
+
+/* ARGSUSED */
+static int
+termp_bd_pre(DECL_ARGS)
+{
+ const struct mdoc_block *bl;
+ const struct mdoc_node *n;
+ int i, type;
+
+ if (MDOC_BLOCK == node->type) {
+ if (node->prev)
+ vspace(p);
+ return(1);
+ } else if (MDOC_BODY != node->type)
+ return(1);
+
+ 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) {
+ warnx("non-text children not yet allowed");
+ continue;
+ }
+ word(p, n->data.text.string);
+ flushln(p);
+ }
+
+ return(0);
+}
+
+
+/* ARGSUSED */
+static void
+termp_bd_post(DECL_ARGS)
+{
+
+ if (MDOC_BODY != node->type)
+ return;
+
+ if ( ! (p->flags & TERMP_LITERAL))
+ flushln(p);
+
+ p->flags &= ~TERMP_LITERAL;
+ p->offset = pair->offset;
+}
+
+
+/* ARGSUSED */
+static int
+termp_qq_pre(DECL_ARGS)
+{
+
+ if (MDOC_BODY != node->type)
+ return(1);
+ word(p, "\"");
+ p->flags |= TERMP_NOSPACE;
+ return(1);
+}
+
+
+/* ARGSUSED */
+static void
+termp_qq_post(DECL_ARGS)
+{
+
+ if (MDOC_BODY != node->type)
+ return;
+ p->flags |= TERMP_NOSPACE;
+ word(p, "\"");
+}
+
+
+/* ARGSUSED */
+static int
+termp_bsx_pre(DECL_ARGS)
+{
+
+ word(p, "BSDI BSD/OS");
+ return(1);
+}
+
+
+/* ARGSUSED */
+static void
+termp_bx_post(DECL_ARGS)
+{
+
+ if (node->child)
+ p->flags |= TERMP_NOSPACE;
+ word(p, "BSD");
+}
+
+
+/* ARGSUSED */
+static int
+termp_ox_pre(DECL_ARGS)
+{
+
+ word(p, "OpenBSD");
+ return(1);
+}
+
+
+/* ARGSUSED */
+static int
+termp_ux_pre(DECL_ARGS)
+{
+
+ word(p, "UNIX");
+ return(1);
+}
+
+
+/* ARGSUSED */
+static int
+termp_fx_pre(DECL_ARGS)
+{
+
+ word(p, "FreeBSD");
+ return(1);
+}
+
+
+/* ARGSUSED */
+static int
+termp_nx_pre(DECL_ARGS)
+{
+
+ word(p, "NetBSD");
+ return(1);
+}
+
+
+/* ARGSUSED */
+static int
+termp_sq_pre(DECL_ARGS)
+{
+
+ if (MDOC_BODY != node->type)
+ return(1);
+ word(p, "`");
+ p->flags |= TERMP_NOSPACE;
+ return(1);
+}
+
+
+/* ARGSUSED */
+static void
+termp_sq_post(DECL_ARGS)
+{
+
+ if (MDOC_BODY != node->type)
+ return;
+ p->flags |= TERMP_NOSPACE;
+ word(p, "\'");
+}
+
+
+/* ARGSUSED */
+static int
+termp_pf_pre(DECL_ARGS)
+{
+
+ p->flags |= TERMP_IGNDELIM;
+ return(1);
+}
+
+
+/* ARGSUSED */
+static void
+termp_pf_post(DECL_ARGS)
+{
+
+ p->flags &= ~TERMP_IGNDELIM;
+ p->flags |= TERMP_NOSPACE;
+}
+
+
+/* ARGSUSED */
+static int
+termp_ss_pre(DECL_ARGS)
+{
+
+ switch (node->type) {
+ case (MDOC_HEAD):
+ vspace(p);
+ TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_SSECTION]);
+ p->offset = INDENT / 2;
+ break;
+ default:
+ break;
+ }
+
+ return(1);
+}
+
+
+/* ARGSUSED */
+static void
+termp_ss_post(DECL_ARGS)
+{
+
+ switch (node->type) {
+ case (MDOC_HEAD):
+ newln(p);
+ p->offset = INDENT;
+ break;
+ default:
+ break;
+ }
+}
+
+
+/* ARGSUSED */
+static int
+termp_pa_pre(DECL_ARGS)
+{
+
+ TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_FILE]);
+ return(1);
+}
+
+
+/* ARGSUSED */
+static int
+termp_em_pre(DECL_ARGS)
+{
+
+ TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_EMPH]);
+ return(1);
+}
+
+
+/* ARGSUSED */
+static int
+termp_cd_pre(DECL_ARGS)
+{
+
+ TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_CONFIG]);
+ newln(p);
+ return(1);
+}
+
+
+/* ARGSUSED */
+static int
+termp_cm_pre(DECL_ARGS)
+{
+
+ TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_CMD_FLAG]);
+ return(1);
+}
+
+
+/* ARGSUSED */
+static int
+termp_ic_pre(DECL_ARGS)
+{
+
+ TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_CMD]);
+ return(1);
+}
+
+
+/* ARGSUSED */
+static int
+termp_in_pre(DECL_ARGS)
+{
+
+ TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_INCLUDE]);
+ word(p, "#include");
+ word(p, "<");
+ p->flags |= TERMP_NOSPACE;
+ return(1);
+}
+
+
+/* ARGSUSED */
+static void
+termp_in_post(DECL_ARGS)
+{
+
+ p->flags |= TERMP_NOSPACE;
+ word(p, ">");
+
+ newln(p);
+ if (SEC_SYNOPSIS != node->sec)
+ return;
+ if (node->next && MDOC_In != node->next->tok)
+ vspace(p);
+}
+
+
+/* ARGSUSED */
+static int
+termp_at_pre(DECL_ARGS)
+{
+ enum mdoc_att c;
+
+ c = ATT_DEFAULT;
+ if (node->child) {
+ assert(MDOC_TEXT == node->child->type);
+ c = mdoc_atoatt(node->child->data.text.string);
+ }
+
+ word(p, mdoc_att2a(c));
+ return(0);
+}
+
+
+/* ARGSUSED */
+static int
+termp_bq_pre(DECL_ARGS)
+{
+
+ if (MDOC_BODY != node->type)
+ return(1);
+ word(p, "[");
+ p->flags |= TERMP_NOSPACE;
+ return(1);
+}
+
+
+/* ARGSUSED */
+static void
+termp_bq_post(DECL_ARGS)
+{
+
+ if (MDOC_BODY != node->type)
+ return;
+ word(p, "]");
+}
+
+
+/* ARGSUSED */
+static int
+termp_pq_pre(DECL_ARGS)
+{
+
+ if (MDOC_BODY != node->type)
+ return(1);
+ word(p, "\\&(");
+ p->flags |= TERMP_NOSPACE;
+ return(1);
+}
+
+
+/* ARGSUSED */
+static void
+termp_pq_post(DECL_ARGS)
+{
+
+ if (MDOC_BODY != node->type)
+ return;
+ word(p, ")");
+}
+
+
+/* ARGSUSED */
+static int
+termp_fo_pre(DECL_ARGS)
+{
+ const struct mdoc_node *n;
+
+ if (MDOC_BODY == node->type) {
+ word(p, "(");
+ p->flags |= TERMP_NOSPACE;
+ return(1);
+ } else if (MDOC_HEAD != node->type)
+ return(1);
+
+ /* XXX - groff shows only first parameter */
+
+ p->flags |= ttypes[TTYPE_FUNC_NAME];
+ for (n = node->child; n; n = n->next) {
+ assert(MDOC_TEXT == n->type);
+ word(p, n->data.text.string);
+ }
+ p->flags &= ~ttypes[TTYPE_FUNC_NAME];
+
+ return(0);
+}
+
+
+/* ARGSUSED */
+static void
+termp_fo_post(DECL_ARGS)
+{
+
+ if (MDOC_BODY != node->type)
+ return;
+ word(p, ")");
+ word(p, ";");
+ newln(p);
+}
+
+
+/* ARGSUSED */
+static int
+termp_bf_pre(DECL_ARGS)
+{
+ const struct mdoc_node *n;
+ const struct mdoc_block *b;
+
+ /* XXX - we skip over possible trailing HEAD tokens. */
+
+ if (MDOC_HEAD == node->type)