summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mandocdb.c265
-rw-r--r--mdoc_html.c35
-rw-r--r--mdoc_man.c12
-rw-r--r--mdoc_term.c58
-rw-r--r--mdoc_validate.c48
-rw-r--r--roff.c8
6 files changed, 207 insertions, 219 deletions
diff --git a/mandocdb.c b/mandocdb.c
index 0c30e6ce..57c1e3ec 100644
--- a/mandocdb.c
+++ b/mandocdb.c
@@ -1,7 +1,7 @@
/* $Id$ */
/*
* Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2011-2016 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2011-2017 Ingo Schwarze <schwarze@openbsd.org>
* Copyright (c) 2016 Ed Maste <emaste@freebsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
@@ -110,6 +110,7 @@ typedef int (*mdoc_fp)(struct mpage *, const struct roff_meta *,
struct mdoc_handler {
mdoc_fp fp; /* optional handler */
uint64_t mask; /* set unless handler returns 0 */
+ int taboo; /* node flags that must not be set */
};
@@ -158,7 +159,7 @@ static int parse_mdoc_Xr(struct mpage *, const struct roff_meta *,
static void putkey(const struct mpage *, char *, uint64_t);
static void putkeys(const struct mpage *, char *, size_t, uint64_t);
static void putmdockey(const struct mpage *,
- const struct roff_node *, uint64_t);
+ const struct roff_node *, uint64_t, int);
static int render_string(char **, size_t *);
static void say(const char *, const char *, ...)
__attribute__((__format__ (printf, 2, 3)));
@@ -183,129 +184,129 @@ static struct ohash strings; /* table of all strings */
static uint64_t name_mask;
static const struct mdoc_handler mdocs[MDOC_MAX] = {
- { NULL, 0 }, /* Ap */
- { NULL, 0 }, /* Dd */
- { NULL, 0 }, /* Dt */
- { NULL, 0 }, /* Os */
- { parse_mdoc_Sh, TYPE_Sh }, /* Sh */
- { parse_mdoc_head, TYPE_Ss }, /* Ss */
- { NULL, 0 }, /* Pp */
- { NULL, 0 }, /* D1 */
- { NULL, 0 }, /* Dl */
- { NULL, 0 }, /* Bd */
- { NULL, 0 }, /* Ed */
- { NULL, 0 }, /* Bl */
- { NULL, 0 }, /* El */
- { NULL, 0 }, /* It */
- { NULL, 0 }, /* Ad */
- { NULL, TYPE_An }, /* An */
- { NULL, TYPE_Ar }, /* Ar */
- { NULL, TYPE_Cd }, /* Cd */
- { NULL, TYPE_Cm }, /* Cm */
- { NULL, TYPE_Dv }, /* Dv */
- { NULL, TYPE_Er }, /* Er */
- { NULL, TYPE_Ev }, /* Ev */
- { NULL, 0 }, /* Ex */
- { NULL, TYPE_Fa }, /* Fa */
- { parse_mdoc_Fd, 0 }, /* Fd */
- { NULL, TYPE_Fl }, /* Fl */
- { parse_mdoc_Fn, 0 }, /* Fn */
- { NULL, TYPE_Ft }, /* Ft */
- { NULL, TYPE_Ic }, /* Ic */
- { NULL, TYPE_In }, /* In */
- { NULL, TYPE_Li }, /* Li */
- { parse_mdoc_Nd, 0 }, /* Nd */
- { parse_mdoc_Nm, 0 }, /* Nm */
- { NULL, 0 }, /* Op */
- { NULL, 0 }, /* Ot */
- { NULL, TYPE_Pa }, /* Pa */
- { NULL, 0 }, /* Rv */
- { NULL, TYPE_St }, /* St */
- { parse_mdoc_Va, TYPE_Va }, /* Va */
- { parse_mdoc_Va, TYPE_Vt }, /* Vt */
- { parse_mdoc_Xr, 0 }, /* Xr */
- { NULL, 0 }, /* %A */
- { NULL, 0 }, /* %B */
- { NULL, 0 }, /* %D */
- { NULL, 0 }, /* %I */
- { NULL, 0 }, /* %J */
- { NULL, 0 }, /* %N */
- { NULL, 0 }, /* %O */
- { NULL, 0 }, /* %P */
- { NULL, 0 }, /* %R */
- { NULL, 0 }, /* %T */
- { NULL, 0 }, /* %V */
- { NULL, 0 }, /* Ac */
- { NULL, 0 }, /* Ao */
- { NULL, 0 }, /* Aq */
- { NULL, TYPE_At }, /* At */
- { NULL, 0 }, /* Bc */
- { NULL, 0 }, /* Bf */
- { NULL, 0 }, /* Bo */
- { NULL, 0 }, /* Bq */
- { NULL, TYPE_Bsx }, /* Bsx */
- { NULL, TYPE_Bx }, /* Bx */
- { NULL, 0 }, /* Db */
- { NULL, 0 }, /* Dc */
- { NULL, 0 }, /* Do */
- { NULL, 0 }, /* Dq */
- { NULL, 0 }, /* Ec */
- { NULL, 0 }, /* Ef */
- { NULL, TYPE_Em }, /* Em */
- { NULL, 0 }, /* Eo */
- { NULL, TYPE_Fx }, /* Fx */
- { NULL, TYPE_Ms }, /* Ms */
- { NULL, 0 }, /* No */
- { NULL, 0 }, /* Ns */
- { NULL, TYPE_Nx }, /* Nx */
- { NULL, TYPE_Ox }, /* Ox */
- { NULL, 0 }, /* Pc */
- { NULL, 0 }, /* Pf */
- { NULL, 0 }, /* Po */
- { NULL, 0 }, /* Pq */
- { NULL, 0 }, /* Qc */
- { NULL, 0 }, /* Ql */
- { NULL, 0 }, /* Qo */
- { NULL, 0 }, /* Qq */
- { NULL, 0 }, /* Re */
- { NULL, 0 }, /* Rs */
- { NULL, 0 }, /* Sc */
- { NULL, 0 }, /* So */
- { NULL, 0 }, /* Sq */
- { NULL, 0 }, /* Sm */
- { NULL, 0 }, /* Sx */
- { NULL, TYPE_Sy }, /* Sy */
- { NULL, TYPE_Tn }, /* Tn */
- { NULL, 0 }, /* Ux */
- { NULL, 0 }, /* Xc */
- { NULL, 0 }, /* Xo */
- { parse_mdoc_Fo, 0 }, /* Fo */
- { NULL, 0 }, /* Fc */
- { NULL, 0 }, /* Oo */
- { NULL, 0 }, /* Oc */
- { NULL, 0 }, /* Bk */
- { NULL, 0 }, /* Ek */
- { NULL, 0 }, /* Bt */
- { NULL, 0 }, /* Hf */
- { NULL, 0 }, /* Fr */
- { NULL, 0 }, /* Ud */
- { NULL, TYPE_Lb }, /* Lb */
- { NULL, 0 }, /* Lp */
- { NULL, TYPE_Lk }, /* Lk */
- { NULL, TYPE_Mt }, /* Mt */
- { NULL, 0 }, /* Brq */
- { NULL, 0 }, /* Bro */
- { NULL, 0 }, /* Brc */
- { NULL, 0 }, /* %C */
- { NULL, 0 }, /* Es */
- { NULL, 0 }, /* En */
- { NULL, TYPE_Dx }, /* Dx */
- { NULL, 0 }, /* %Q */
- { NULL, 0 }, /* br */
- { NULL, 0 }, /* sp */
- { NULL, 0 }, /* %U */
- { NULL, 0 }, /* Ta */
- { NULL, 0 }, /* ll */
+ { NULL, 0, 0 }, /* Ap */
+ { NULL, 0, NODE_NOPRT }, /* Dd */
+ { NULL, 0, NODE_NOPRT }, /* Dt */
+ { NULL, 0, NODE_NOPRT }, /* Os */
+ { parse_mdoc_Sh, TYPE_Sh, 0 }, /* Sh */
+ { parse_mdoc_head, TYPE_Ss, 0 }, /* Ss */
+ { NULL, 0, 0 }, /* Pp */
+ { NULL, 0, 0 }, /* D1 */
+ { NULL, 0, 0 }, /* Dl */
+ { NULL, 0, 0 }, /* Bd */
+ { NULL, 0, 0 }, /* Ed */
+ { NULL, 0, 0 }, /* Bl */
+ { NULL, 0, 0 }, /* El */
+ { NULL, 0, 0 }, /* It */
+ { NULL, 0, 0 }, /* Ad */
+ { NULL, TYPE_An, 0 }, /* An */
+ { NULL, TYPE_Ar, 0 }, /* Ar */
+ { NULL, TYPE_Cd, 0 }, /* Cd */
+ { NULL, TYPE_Cm, 0 }, /* Cm */
+ { NULL, TYPE_Dv, 0 }, /* Dv */
+ { NULL, TYPE_Er, 0 }, /* Er */
+ { NULL, TYPE_Ev, 0 }, /* Ev */
+ { NULL, 0, 0 }, /* Ex */
+ { NULL, TYPE_Fa, 0 }, /* Fa */
+ { parse_mdoc_Fd, 0, 0 }, /* Fd */
+ { NULL, TYPE_Fl, 0 }, /* Fl */
+ { parse_mdoc_Fn, 0, 0 }, /* Fn */
+ { NULL, TYPE_Ft, 0 }, /* Ft */
+ { NULL, TYPE_Ic, 0 }, /* Ic */
+ { NULL, TYPE_In, 0 }, /* In */
+ { NULL, TYPE_Li, 0 }, /* Li */
+ { parse_mdoc_Nd, 0, 0 }, /* Nd */
+ { parse_mdoc_Nm, 0, 0 }, /* Nm */
+ { NULL, 0, 0 }, /* Op */
+ { NULL, 0, 0 }, /* Ot */
+ { NULL, TYPE_Pa, NODE_NOSRC }, /* Pa */
+ { NULL, 0, 0 }, /* Rv */
+ { NULL, TYPE_St, 0 }, /* St */
+ { parse_mdoc_Va, TYPE_Va, 0 }, /* Va */
+ { parse_mdoc_Va, TYPE_Vt, 0 }, /* Vt */
+ { parse_mdoc_Xr, 0, 0 }, /* Xr */
+ { NULL, 0, 0 }, /* %A */
+ { NULL, 0, 0 }, /* %B */
+ { NULL, 0, 0 }, /* %D */
+ { NULL, 0, 0 }, /* %I */
+ { NULL, 0, 0 }, /* %J */
+ { NULL, 0, 0 }, /* %N */
+ { NULL, 0, 0 }, /* %O */
+ { NULL, 0, 0 }, /* %P */
+ { NULL, 0, 0 }, /* %R */
+ { NULL, 0, 0 }, /* %T */
+ { NULL, 0, 0 }, /* %V */
+ { NULL, 0, 0 }, /* Ac */
+ { NULL, 0, 0 }, /* Ao */
+ { NULL, 0, 0 }, /* Aq */
+ { NULL, TYPE_At, 0 }, /* At */
+ { NULL, 0, 0 }, /* Bc */
+ { NULL, 0, 0 }, /* Bf */
+ { NULL, 0, 0 }, /* Bo */
+ { NULL, 0, 0 }, /* Bq */
+ { NULL, TYPE_Bsx, NODE_NOSRC }, /* Bsx */
+ { NULL, TYPE_Bx, 0 }, /* Bx */
+ { NULL, 0, 0 }, /* Db */
+ { NULL, 0, 0 }, /* Dc */
+ { NULL, 0, 0 }, /* Do */
+ { NULL, 0, 0 }, /* Dq */
+ { NULL, 0, 0 }, /* Ec */
+ { NULL, 0, 0 }, /* Ef */
+ { NULL, TYPE_Em, 0 }, /* Em */
+ { NULL, 0, 0 }, /* Eo */
+ { NULL, TYPE_Fx, NODE_NOSRC }, /* Fx */
+ { NULL, TYPE_Ms, 0 }, /* Ms */
+ { NULL, 0, 0 }, /* No */
+ { NULL, 0, 0 }, /* Ns */
+ { NULL, TYPE_Nx, NODE_NOSRC }, /* Nx */
+ { NULL, TYPE_Ox, NODE_NOSRC }, /* Ox */
+ { NULL, 0, 0 }, /* Pc */
+ { NULL, 0, 0 }, /* Pf */
+ { NULL, 0, 0 }, /* Po */
+ { NULL, 0, 0 }, /* Pq */
+ { NULL, 0, 0 }, /* Qc */
+ { NULL, 0, 0 }, /* Ql */
+ { NULL, 0, 0 }, /* Qo */
+ { NULL, 0, 0 }, /* Qq */
+ { NULL, 0, 0 }, /* Re */
+ { NULL, 0, 0 }, /* Rs */
+ { NULL, 0, 0 }, /* Sc */
+ { NULL, 0, 0 }, /* So */
+ { NULL, 0, 0 }, /* Sq */
+ { NULL, 0, 0 }, /* Sm */
+ { NULL, 0, 0 }, /* Sx */
+ { NULL, TYPE_Sy, 0 }, /* Sy */
+ { NULL, TYPE_Tn, 0 }, /* Tn */
+ { NULL, 0, NODE_NOSRC }, /* Ux */
+ { NULL, 0, 0 }, /* Xc */
+ { NULL, 0, 0 }, /* Xo */
+ { parse_mdoc_Fo, 0, 0 }, /* Fo */
+ { NULL, 0, 0 }, /* Fc */
+ { NULL, 0, 0 }, /* Oo */
+ { NULL, 0, 0 }, /* Oc */
+ { NULL, 0, 0 }, /* Bk */
+ { NULL, 0, 0 }, /* Ek */
+ { NULL, 0, 0 }, /* Bt */
+ { NULL, 0, 0 }, /* Hf */
+ { NULL, 0, 0 }, /* Fr */
+ { NULL, 0, 0 }, /* Ud */
+ { NULL, TYPE_Lb, 0 }, /* Lb */
+ { NULL, 0, 0 }, /* Lp */
+ { NULL, TYPE_Lk, 0 }, /* Lk */
+ { NULL, TYPE_Mt, NODE_NOSRC }, /* Mt */
+ { NULL, 0, 0 }, /* Brq */
+ { NULL, 0, 0 }, /* Bro */
+ { NULL, 0, 0 }, /* Brc */
+ { NULL, 0, 0 }, /* %C */
+ { NULL, 0, 0 }, /* Es */
+ { NULL, 0, 0 }, /* En */
+ { NULL, TYPE_Dx, NODE_NOSRC }, /* Dx */
+ { NULL, 0, 0 }, /* %Q */
+ { NULL, 0, 0 }, /* br */
+ { NULL, 0, 0 }, /* sp */
+ { NULL, 0, 0 }, /* %U */
+ { NULL, 0, 0 }, /* Ta */
+ { NULL, 0, 0 }, /* ll */
};
@@ -1359,12 +1360,14 @@ putkey(const struct mpage *mpage, char *value, uint64_t type)
*/
static void
putmdockey(const struct mpage *mpage,
- const struct roff_node *n, uint64_t m)
+ const struct roff_node *n, uint64_t m, int taboo)
{
for ( ; NULL != n; n = n->next) {
+ if (n->flags & taboo)
+ continue;
if (NULL != n->child)
- putmdockey(mpage, n->child, m);
+ putmdockey(mpage, n->child, m, taboo);
if (n->type == ROFFT_TEXT)
putkey(mpage, n->string, m);
}
@@ -1502,6 +1505,8 @@ parse_mdoc(struct mpage *mpage, const struct roff_meta *meta,
assert(NULL != n);
for (n = n->child; NULL != n; n = n->next) {
+ if (n->flags & mdocs[n->tok].taboo)
+ continue;
switch (n->type) {
case ROFFT_ELEM:
case ROFFT_BLOCK:
@@ -1513,7 +1518,7 @@ parse_mdoc(struct mpage *mpage, const struct roff_meta *meta,
break;
if (mdocs[n->tok].mask)
putmdockey(mpage, n->child,
- mdocs[n->tok].mask);
+ mdocs[n->tok].mask, mdocs[n->tok].taboo);
break;
default:
assert(n->type != ROFFT_ROOT);
@@ -1681,12 +1686,12 @@ parse_mdoc_Nm(struct mpage *mpage, const struct roff_meta *meta,
{
if (SEC_NAME == n->sec)
- putmdockey(mpage, n->child, NAME_TITLE);
+ putmdockey(mpage, n->child, NAME_TITLE, 0);
else if (n->sec == SEC_SYNOPSIS && n->type == ROFFT_HEAD) {
if (n->child == NULL)
putkey(mpage, meta->name, NAME_SYN);
else
- putmdockey(mpage, n->child, NAME_SYN);
+ putmdockey(mpage, n->child, NAME_SYN, 0);
}
if ( ! (mpage->name_head_done ||
n->child == NULL || n->child->string == NULL ||
diff --git a/mdoc_html.c b/mdoc_html.c
index 7251be73..4409964d 100644
--- a/mdoc_html.c
+++ b/mdoc_html.c
@@ -732,44 +732,11 @@ mdoc_ar_pre(MDOC_ARGS)
static int
mdoc_xx_pre(MDOC_ARGS)
{
- const char *pp;
struct htmlpair tag;
- int flags;
-
- switch (n->tok) {
- case MDOC_Bsx:
- pp = "BSD/OS";
- break;
- case MDOC_Dx:
- pp = "DragonFly";
- 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:
- return 1;
- }
PAIR_CLASS_INIT(&tag, "unix");
print_otag(h, TAG_SPAN, 1, &tag);
-
- print_text(h, pp);
- if (n->child) {
- flags = h->flags;
- h->flags |= HTML_KEEP;
- print_text(h, n->child->string);
- h->flags = flags;
- }
- return 0;
+ return 1;
}
static int
diff --git a/mdoc_man.c b/mdoc_man.c
index a27923d3..176cbd10 100644
--- a/mdoc_man.c
+++ b/mdoc_man.c
@@ -182,7 +182,7 @@ static const struct manact manacts[MDOC_MAX + 1] = {
{ NULL, pre_bf, post_bf, NULL, NULL }, /* Bf */
{ cond_body, pre_enc, post_enc, "[", "]" }, /* Bo */
{ cond_body, pre_enc, post_enc, "[", "]" }, /* Bq */
- { NULL, pre_ux, NULL, "BSD/OS", NULL }, /* Bsx */
+ { NULL, NULL, NULL, NULL, NULL }, /* Bsx */
{ NULL, pre_bx, NULL, NULL, NULL }, /* Bx */
{ NULL, pre_skip, NULL, NULL, NULL }, /* Db */
{ NULL, NULL, NULL, NULL, NULL }, /* Dc */
@@ -192,12 +192,12 @@ static const struct manact manacts[MDOC_MAX + 1] = {
{ NULL, NULL, NULL, NULL, NULL }, /* Ef */
{ NULL, pre_em, post_font, NULL, NULL }, /* Em */
{ cond_body, pre_eo, post_eo, NULL, NULL }, /* Eo */
- { NULL, pre_ux, NULL, "FreeBSD", NULL }, /* Fx */
+ { NULL, NULL, NULL, NULL, NULL }, /* Fx */
{ NULL, pre_sy, post_font, NULL, NULL }, /* Ms */
{ NULL, pre_no, NULL, NULL, NULL }, /* No */
{ NULL, pre_ns, NULL, NULL, NULL }, /* Ns */
- { NULL, pre_ux, NULL, "NetBSD", NULL }, /* Nx */
- { NULL, pre_ux, NULL, "OpenBSD", NULL }, /* Ox */
+ { NULL, NULL, NULL, NULL, NULL }, /* Nx */
+ { NULL, NULL, NULL, NULL, NULL }, /* Ox */
{ NULL, NULL, NULL, NULL, NULL }, /* Pc */
{ NULL, NULL, post_pf, NULL, NULL }, /* Pf */
{ cond_body, pre_enc, post_enc, "(", ")" }, /* Po */
@@ -215,7 +215,7 @@ static const struct manact manacts[MDOC_MAX + 1] = {
{ NULL, pre_em, post_font, NULL, NULL }, /* Sx */
{ NULL, pre_sy, post_font, NULL, NULL }, /* Sy */
{ NULL, pre_li, post_font, NULL, NULL }, /* Tn */
- { NULL, pre_ux, NULL, "UNIX", NULL }, /* Ux */
+ { NULL, NULL, NULL, NULL, NULL }, /* Ux */
{ NULL, NULL, NULL, NULL, NULL }, /* Xc */
{ NULL, NULL, NULL, NULL, NULL }, /* Xo */
{ NULL, pre_fo, post_fo, NULL, NULL }, /* Fo */
@@ -238,7 +238,7 @@ static const struct manact manacts[MDOC_MAX + 1] = {
{ NULL, NULL, post_percent, NULL, NULL }, /* %C */
{ NULL, pre_skip, NULL, NULL, NULL }, /* Es */
{ cond_body, pre_en, post_en, NULL, NULL }, /* En */
- { NULL, pre_ux, NULL, "DragonFly", NULL }, /* Dx */
+ { NULL, NULL, NULL, NULL, NULL }, /* Dx */
{ NULL, NULL, post_percent, NULL, NULL }, /* %Q */
{ NULL, pre_br, NULL, NULL, NULL }, /* br */
{ NULL, pre_sp, post_sp, NULL, NULL }, /* sp */
diff --git a/mdoc_term.c b/mdoc_term.c
index 363e616d..183d5224 100644
--- a/mdoc_term.c
+++ b/mdoc_term.c
@@ -1,7 +1,7 @@
/* $Id$ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2010, 2012-2016 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2010, 2012-2017 Ingo Schwarze <schwarze@openbsd.org>
* Copyright (c) 2013 Franco Fichtner <franco@lastsummer.de>
*
* Permission to use, copy, modify, and distribute this software for any
@@ -80,6 +80,7 @@ static void termp_pf_post(DECL_ARGS);
static void termp_quote_post(DECL_ARGS);
static void termp_sh_post(DECL_ARGS);
static void termp_ss_post(DECL_ARGS);
+static void termp_xx_post(DECL_ARGS);
static int termp__a_pre(DECL_ARGS);
static int termp__t_pre(DECL_ARGS);
@@ -189,7 +190,7 @@ static const struct termact termacts[MDOC_MAX] = {
{ termp_bf_pre, NULL }, /* Bf */
{ termp_quote_pre, termp_quote_post }, /* Bo */
{ termp_quote_pre, termp_quote_post }, /* Bq */
- { termp_xx_pre, NULL }, /* Bsx */
+ { termp_xx_pre, termp_xx_post }, /* Bsx */
{ termp_bx_pre, NULL }, /* Bx */
{ termp_skip_pre, NULL }, /* Db */
{ NULL, NULL }, /* Dc */
@@ -199,12 +200,12 @@ static const struct termact termacts[MDOC_MAX] = {
{ NULL, NULL }, /* Ef */
{ termp_em_pre, NULL }, /* Em */
{ termp_eo_pre, termp_eo_post }, /* Eo */
- { termp_xx_pre, NULL }, /* Fx */
+ { termp_xx_pre, termp_xx_post }, /* Fx */
{ termp_bold_pre, NULL }, /* Ms */
{ termp_li_pre, NULL }, /* No */
{ termp_ns_pre, NULL }, /* Ns */
- { termp_xx_pre, NULL }, /* Nx */
- { termp_xx_pre, NULL }, /* Ox */
+ { termp_xx_pre, termp_xx_post }, /* Nx */
+ { termp_xx_pre, termp_xx_post }, /* Ox */
{ NULL, NULL }, /* Pc */
{ NULL, termp_pf_post }, /* Pf */
{ termp_quote_pre, termp_quote_post }, /* Po */
@@ -222,7 +223,7 @@ static const struct termact termacts[MDOC_MAX] = {
{ termp_under_pre, NULL }, /* Sx */
{ termp_sy_pre, NULL }, /* Sy */
{ NULL, NULL }, /* Tn */
- { termp_xx_pre, NULL }, /* Ux */
+ { termp_xx_pre, termp_xx_post }, /* Ux */
{ NULL, NULL }, /* Xc */
{ NULL, NULL }, /* Xo */
{ termp_fo_pre, termp_fo_post }, /* Fo */
@@ -245,7 +246,7 @@ static const struct termact termacts[MDOC_MAX] = {
{ NULL, termp____post }, /* %C */
{ termp_skip_pre, NULL }, /* Es */
{ termp_quote_pre, termp_quote_post }, /* En */
- { termp_xx_pre, NULL }, /* Dx */
+ { termp_xx_pre, termp_xx_post }, /* Dx */
{ NULL, termp____post }, /* %Q */
{ termp_sp_pre, NULL }, /* br */
{ termp_sp_pre, NULL }, /* sp */
@@ -1677,41 +1678,16 @@ termp_bx_pre(DECL_ARGS)
static int
termp_xx_pre(DECL_ARGS)
{
- const char *pp;
- int flags;
-
- pp = NULL;
- switch (n->tok) {
- case MDOC_Bsx:
- pp = "BSD/OS";
- break;
- case MDOC_Dx:
- pp = "DragonFly";
- 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:
- abort();
- }
+ if ((n->aux = p->flags & TERMP_PREKEEP) == 0)
+ p->flags |= TERMP_PREKEEP;
+ return 1;
+}
- term_word(p, pp);
- if (n->child) {
- flags = p->flags;
- p->flags |= TERMP_KEEP;
- term_word(p, n->child->string);
- p->flags = flags;
- }
- return 0;
+static void
+termp_xx_post(DECL_ARGS)
+{
+ if (n->aux == 0)
+ p->flags &= ~(TERMP_KEEP | TERMP_PREKEEP);
}
static void
diff --git a/mdoc_validate.c b/mdoc_validate.c
index b41125a5..3e1afb0b 100644
--- a/mdoc_validate.c
+++ b/mdoc_validate.c
@@ -104,6 +104,7 @@ static void post_sm(POST_ARGS);
static void post_st(POST_ARGS);
static void post_std(POST_ARGS);
static void post_xr(POST_ARGS);
+static void post_xx(POST_ARGS);
static v_post mdoc_valids[MDOC_MAX] = {
NULL, /* Ap */
@@ -166,7 +167,7 @@ static v_post mdoc_valids[MDOC_MAX] = {
post_bf, /* Bf */
NULL, /* Bo */
NULL, /* Bq */
- NULL, /* Bsx */
+ post_xx, /* Bsx */
post_bx, /* Bx */
post_obsolete, /* Db */
NULL, /* Dc */
@@ -176,12 +177,12 @@ static v_post mdoc_valids[MDOC_MAX] = {
NULL, /* Ef */
NULL, /* Em */
NULL, /* Eo */
- NULL, /* Fx */
+ post_xx, /* Fx */
NULL, /* Ms */
NULL, /* No */
post_ns, /* Ns */
- NULL, /* Nx */
- NULL, /* Ox */
+ post_xx, /* Nx */
+ post_xx, /* Ox */
NULL, /* Pc */
NULL, /* Pf */
NULL, /* Po */
@@ -199,7 +200,7 @@ static v_post mdoc_valids[MDOC_MAX] = {
post_hyph, /* Sx */
NULL, /* Sy */
NULL, /* Tn */
- NULL, /* Ux */
+ post_xx, /* Ux */
NULL, /* Xc */
NULL, /* Xo */
post_fo, /* Fo */
@@ -222,7 +223,7 @@ static v_post mdoc_valids[MDOC_MAX] = {
NULL, /* %C */
post_es, /* Es */
post_en, /* En */
- NULL, /* Dx */
+ post_xx, /* Dx */
NULL, /* %Q */
post_par, /* br */
post_par, /* sp */
@@ -1031,6 +1032,41 @@ post_es(POST_ARGS)
}
static void
+post_xx(POST_ARGS)
+{
+ struct roff_node *n;
+ const char *os;
+
+ n = mdoc->last;
+ switch (n->tok) {
+ case MDOC_Bsx:
+ os = "BSD/OS";
+ break;
+ case MDOC_Dx:
+ os = "DragonFly";
+ break;
+ case MDOC_Fx:
+ os = "FreeBSD";
+ break;
+ case MDOC_Nx:
+ os = "NetBSD";
+ break;
+ case MDOC_Ox:
+ os = "OpenBSD";
+ break;
+ case MDOC_Ux:
+ os = "UNIX";
+ break;
+ default:
+ abort();
+ }
+ mdoc->next = ROFF_NEXT_CHILD;
+ roff_word_alloc(mdoc, n->line, n->pos, os);
+ mdoc->last->flags |= NODE_NOSRC;
+ mdoc->last = n;
+}
+
+static void
post_it(POST_ARGS)
{
struct roff_node *nbl, *nit, *nch;
diff --git a/roff.c b/roff.c
index 5ad37793..8a9e49e9 100644
--- a/roff.c
+++ b/roff.c
@@ -1,7 +1,7 @@
/* $Id$ */
/*
* Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2010-2015 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2010-2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -1017,9 +1017,13 @@ roff_node_append(struct roff_man *man, struct roff_node *n)
n->parent = man->last->parent;
break;
case ROFF_NEXT_CHILD:
+ if (man->last->child != NULL) {
+ n->next = man->last->child;
+ man->last->child->prev = n;
+ } else
+ man->last->last = n;
man->last->child = n;
n->parent = man->last;
- n->parent->last = n;
break;
default:
abort();