diff options
-rw-r--r-- | mdoc.7 | 2 | ||||
-rw-r--r-- | mdoc_macro.c | 43 | ||||
-rw-r--r-- | mdoc_term.c | 3 | ||||
-rw-r--r-- | mdoc_validate.c | 9 |
4 files changed, 49 insertions, 8 deletions
@@ -330,6 +330,7 @@ don't have heads. .Pp .Bl -column -compact -offset indent "MacroX" "CallableX" "ParsableX" "Closing" .It Em Macro Ta Em Callable Ta Em Parsable Ta Em Closing +.It \&.Nd Ta \&No Ta \&No Ta \&.Sh .It \&.Sh Ta \&No Ta \&No Ta \&.Sh .It \&.Ss Ta \&No Ta \&No Ta \&.Sh, \&.Ss .It \&.It Ta \&No Ta Yes Ta \&.It, \&.El @@ -453,7 +454,6 @@ then the macro accepts an arbitrary number of arguments. .It \&.Ic Ta Yes Ta Yes Ta >0 .It \&.In Ta \&No Ta \&No Ta n .It \&.Li Ta Yes Ta Yes Ta n -.It \&.Nd Ta \&No Ta \&No Ta n .It \&.Nm Ta Yes Ta Yes Ta n .It \&.Ot Ta \&No Ta \&No Ta n .It \&.Pa Ta Yes Ta Yes Ta n diff --git a/mdoc_macro.c b/mdoc_macro.c index 709dc3d7..664263e9 100644 --- a/mdoc_macro.c +++ b/mdoc_macro.c @@ -85,7 +85,7 @@ const struct mdoc_macro __mdoc_macros[MDOC_MAX] = { { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Ic */ { in_line_argn, MDOC_CALLABLE | MDOC_PARSED }, /* In */ { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Li */ - { in_line_eoln, 0 }, /* Nd */ + { blk_full, 0 }, /* Nd */ { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Nm */ { blk_part_imp, MDOC_CALLABLE | MDOC_PARSED }, /* Op */ { obsolete, 0 }, /* Ot */ @@ -386,6 +386,8 @@ rew_dohalt(int tok, enum mdoc_type type, const struct mdoc_node *p) if (type == p->type && tok == p->tok) return(REWIND_REWIND); break; + case (MDOC_Nd): + /* FALLTHROUGH */ case (MDOC_Ss): assert(MDOC_TAIL != type); if (type == p->type && tok == p->tok) @@ -491,9 +493,13 @@ rew_dobreak(int tok, const struct mdoc_node *p) switch (tok) { case (MDOC_It): return(MDOC_It == p->tok); + case (MDOC_Nd): + return(MDOC_Nd == p->tok); case (MDOC_Ss): return(MDOC_Ss == p->tok); case (MDOC_Sh): + if (MDOC_Nd == p->tok) + return(1); if (MDOC_Ss == p->tok) return(1); return(MDOC_Sh == p->tok); @@ -875,10 +881,26 @@ in_line(MACRO_PROT_ARGS) static int blk_full(MACRO_PROT_ARGS) { - int c, lastarg, reopen; + int c, lastarg, reopen, dohead; struct mdoc_arg *arg; char *p; + /* + * Whether to process a block-head section. If this is + * non-zero, then a head will be opened for all line arguments. + * If not, then the head will always be empty and only a body + * will be opened, which will stay open at the eoln. + */ + + switch (tok) { + case (MDOC_Nd): + dohead = 0; + break; + default: + dohead = 1; + break; + } + if ( ! (MDOC_EXPLICIT & mdoc_macros[tok].flags)) { if ( ! rew_subblock(MDOC_BODY, mdoc, tok, line, ppos)) @@ -923,6 +945,16 @@ blk_full(MACRO_PROT_ARGS) if ( ! mdoc_head_alloc(mdoc, line, ppos, tok)) return(0); + + /* Immediately close out head and enter body, if applicable. */ + + if (0 == dohead) { + if ( ! rew_subblock(MDOC_HEAD, mdoc, tok, line, ppos)) + return(0); + if ( ! mdoc_body_alloc(mdoc, line, ppos, tok)) + return(0); + } + mdoc->next = MDOC_NEXT_CHILD; for (reopen = 0;; ) { @@ -934,6 +966,7 @@ blk_full(MACRO_PROT_ARGS) if (ARGS_EOLN == c) break; if (ARGS_PHRASE == c) { + assert(dohead); if (reopen && ! mdoc_head_alloc (mdoc, line, ppos, tok)) return(0); @@ -970,9 +1003,13 @@ blk_full(MACRO_PROT_ARGS) if (1 == ppos && ! append_delims(mdoc, line, pos, buf)) return(0); + + /* If the body's already open, then just return. */ + if (0 == dohead) + return(1); + if ( ! rew_subblock(MDOC_HEAD, mdoc, tok, line, ppos)) return(0); - if ( ! mdoc_body_alloc(mdoc, line, ppos, tok)) return(0); mdoc->next = MDOC_NEXT_CHILD; diff --git a/mdoc_term.c b/mdoc_term.c index 3cc580d2..97508810 100644 --- a/mdoc_term.c +++ b/mdoc_term.c @@ -1134,6 +1134,9 @@ termp_ex_pre(DECL_ARGS) static int termp_nd_pre(DECL_ARGS) { + + if (MDOC_BODY != node->type) + return(1); /* * XXX: signed off by jmc@openbsd.org. This technically * produces a minus sign after the Nd, which is wrong, but is diff --git a/mdoc_validate.c b/mdoc_validate.c index a55d8e4f..b19aba56 100644 --- a/mdoc_validate.c +++ b/mdoc_validate.c @@ -86,6 +86,7 @@ static int eerr_eq1(POST_ARGS); static int eerr_ge1(POST_ARGS); static int ewarn_eq0(POST_ARGS); static int bwarn_ge1(POST_ARGS); +static int berr_ge1(POST_ARGS); static int hwarn_eq1(POST_ARGS); static int ewarn_ge1(POST_ARGS); static int ebool(POST_ARGS); @@ -130,6 +131,7 @@ static v_post posts_bl[] = { bwarn_ge1, post_bl, NULL }; static v_post posts_it[] = { post_it, NULL }; static v_post posts_in[] = { eerr_eq1, NULL }; static v_post posts_ss[] = { herr_ge1, NULL }; +static v_post posts_nd[] = { berr_ge1, NULL }; static v_post posts_pf[] = { eerr_eq1, NULL }; static v_post posts_lb[] = { eerr_eq1, NULL }; static v_post posts_st[] = { eerr_eq1, post_st, NULL }; @@ -175,7 +177,7 @@ const struct valids mdoc_valids[MDOC_MAX] = { { NULL, posts_text }, /* Ic */ { NULL, posts_in }, /* In */ { NULL, NULL }, /* Li */ - { NULL, posts_wtext }, /* Nd */ + { NULL, posts_nd }, /* Nd */ { NULL, posts_nm }, /* Nm */ { NULL, posts_wline }, /* Op */ { NULL, NULL }, /* Ot */ @@ -407,6 +409,7 @@ CHECK_CHILD_DEFN(err, eq, ==) /* err_child_eq() */ CHECK_CHILD_DEFN(err, lt, <) /* err_child_lt() */ CHECK_CHILD_DEFN(warn, lt, <) /* warn_child_lt() */ CHECK_BODY_DEFN(ge1, warn, warn_child_gt, 0) /* bwarn_ge1() */ +CHECK_BODY_DEFN(ge1, err, err_child_gt, 0) /* berr_ge1() */ CHECK_ELEM_DEFN(eq0, warn, warn_child_eq, 0) /* ewarn_eq0() */ CHECK_ELEM_DEFN(ge1, warn, warn_child_gt, 0) /* ewarn_gt1() */ CHECK_ELEM_DEFN(eq1, err, err_child_eq, 1) /* eerr_eq1() */ @@ -1165,13 +1168,11 @@ post_sh_body(POST_ARGS) for ( ; n && n->next; n = n->next) { if (MDOC_ELEM == n->type && MDOC_Nm == n->tok) continue; - if (MDOC_TEXT == n->type) - continue; if ( ! mdoc_nwarn(mdoc, mdoc->last, ENAMESECINC)) return(0); } - if (MDOC_ELEM == n->type && MDOC_Nd == n->tok) + if (MDOC_BLOCK == n->type && MDOC_Nd == n->tok) return(1); return(mdoc_nwarn(mdoc, mdoc->last, ENAMESECINC)); } |