From e831f755f6b70a0a8e350399f06de7712380b3ce Mon Sep 17 00:00:00 2001 From: Kristaps Dzonsons Date: Wed, 14 Jan 2009 11:58:24 +0000 Subject: *** empty log message *** --- macro.c | 354 +++++++++++++++++++++++++++++++++++++++++++++---------------- mdoc.c | 52 ++++----- mdoc.h | 6 +- mdocml.c | 19 ++-- private.h | 7 +- strings.c | 29 ++++- validate.c | 4 +- 7 files changed, 333 insertions(+), 138 deletions(-) diff --git a/macro.c b/macro.c index 55c6f89d..761d6e53 100644 --- a/macro.c +++ b/macro.c @@ -1,4 +1,4 @@ -/* $Id: macro.c,v 1.34 2009/01/12 17:26:42 kristaps Exp $ */ +/* $Id: macro.c,v 1.35 2009/01/14 11:58:24 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -29,6 +29,16 @@ /* FIXME: maxlineargs should be per LINE, no per TOKEN. */ +static int rewind_alt(int); +static int rewind_dohalt(int, enum mdoc_type, + const struct mdoc_node *); +#define REWIND_REWIND (1 << 0) +#define REWIND_NOHALT (1 << 1) +#define REWIND_HALT (1 << 2) +static int rewind_dobreak(int, enum mdoc_type, + const struct mdoc_node *); + + static int rewind_elem(struct mdoc *, int); static int rewind_impblock(struct mdoc *, int); static int rewind_expblock(struct mdoc *, int); @@ -68,7 +78,8 @@ rewind_last(struct mdoc *mdoc, struct mdoc_node *to) return(0); if ( ! mdoc_action_post(mdoc)) return(0); - mdoc_msg(mdoc, "rewound to %s", + mdoc_msg(mdoc, "rewound to %s %s", + mdoc_type2a(mdoc->last->type), mdoc_macronames[mdoc->last->tok]); return(1); } @@ -80,7 +91,8 @@ rewind_last(struct mdoc *mdoc, struct mdoc_node *to) return(0); if ( ! mdoc_action_post(mdoc)) return(0); - mdoc_msg(mdoc, "rewound to %s", + mdoc_msg(mdoc, "rewound to %s %s", + mdoc_type2a(mdoc->last->type), mdoc_macronames[mdoc->last->tok]); } while (mdoc->last != to); @@ -88,6 +100,208 @@ rewind_last(struct mdoc *mdoc, struct mdoc_node *to) } +static int +rewind_alt(int tok) +{ + switch (tok) { + case (MDOC_Ac): + return(MDOC_Ao); + case (MDOC_Bc): + return(MDOC_Bo); + case (MDOC_Dc): + return(MDOC_Do); + case (MDOC_Ec): + return(MDOC_Eo); + case (MDOC_Ed): + return(MDOC_Bd); + case (MDOC_Ef): + return(MDOC_Bf); + case (MDOC_Ek): + return(MDOC_Bk); + case (MDOC_El): + return(MDOC_Bl); + case (MDOC_Fc): + return(MDOC_Fo); + case (MDOC_Oc): + return(MDOC_Oo); + case (MDOC_Pc): + return(MDOC_Po); + case (MDOC_Qc): + return(MDOC_Qo); + case (MDOC_Re): + return(MDOC_Rs); + case (MDOC_Sc): + return(MDOC_So); + case (MDOC_Xc): + return(MDOC_Xo); + default: + break; + } + abort(); + /* NOTREACHED */ +} + + +static int +rewind_dohalt(int tok, enum mdoc_type type, const struct mdoc_node *p) +{ + + if (MDOC_ROOT == p->type) + return(REWIND_HALT); + if (MDOC_TEXT == p->type) + return(REWIND_NOHALT); + if (MDOC_ELEM == p->type) + return(REWIND_NOHALT); + + switch (tok) { + /* One-liner implicit-scope. */ + case (MDOC_Aq): + /* FALLTHROUGH */ + case (MDOC_Bq): + /* FALLTHROUGH */ + case (MDOC_D1): + /* FALLTHROUGH */ + case (MDOC_Dl): + /* FALLTHROUGH */ + case (MDOC_Dq): + /* FALLTHROUGH */ + case (MDOC_Op): + /* FALLTHROUGH */ + case (MDOC_Pq): + /* FALLTHROUGH */ + case (MDOC_Ql): + /* FALLTHROUGH */ + case (MDOC_Qq): + /* FALLTHROUGH */ + case (MDOC_Sq): + assert(MDOC_BODY != type); + assert(MDOC_TAIL != type); + if (type == p->type && tok == p->tok) + return(REWIND_REWIND); + break; + + /* Multi-line implicit-scope. */ + case (MDOC_It): + assert(MDOC_TAIL != type); + if (type == p->type && tok == p->tok) + return(REWIND_REWIND); + if (MDOC_BLOCK == type && MDOC_BODY == p->type && + MDOC_Bl == p->tok) + return(REWIND_HALT); + break; + case (MDOC_Sh): + /* FALLTHROUGH */ + case (MDOC_Ss): + if (type == p->type && tok == p->tok) + return(REWIND_REWIND); + break; + + /* Multi-line explicit scope start. */ + case (MDOC_Ao): + /* FALLTHROUGH */ + case (MDOC_Bd): + /* FALLTHROUGH */ + case (MDOC_Bf): + /* FALLTHROUGH */ + case (MDOC_Bk): + /* FALLTHROUGH */ + case (MDOC_Bl): + /* FALLTHROUGH */ + case (MDOC_Bo): + /* FALLTHROUGH */ + case (MDOC_Do): + /* FALLTHROUGH */ + case (MDOC_Eo): + /* FALLTHROUGH */ + case (MDOC_Fo): + /* FALLTHROUGH */ + case (MDOC_Oo): + /* FALLTHROUGH */ + case (MDOC_Po): + /* FALLTHROUGH */ + case (MDOC_Qo): + /* FALLTHROUGH */ + case (MDOC_Rs): + /* FALLTHROUGH */ + case (MDOC_So): + /* FALLTHROUGH */ + case (MDOC_Xo): + if (type == p->type && tok == p->tok) + return(REWIND_REWIND); + break; + + /* Multi-line explicit scope close. */ + case (MDOC_Ac): + /* FALLTHROUGH */ + case (MDOC_Bc): + /* FALLTHROUGH */ + case (MDOC_Dc): + /* FALLTHROUGH */ + case (MDOC_Ec): + /* FALLTHROUGH */ + case (MDOC_Ed): + /* FALLTHROUGH */ + case (MDOC_Ek): + /* FALLTHROUGH */ + case (MDOC_El): + /* FALLTHROUGH */ + case (MDOC_Fc): + /* FALLTHROUGH */ + case (MDOC_Ef): + /* FALLTHROUGH */ + case (MDOC_Oc): + /* FALLTHROUGH */ + case (MDOC_Pc): + /* FALLTHROUGH */ + case (MDOC_Qc): + /* FALLTHROUGH */ + case (MDOC_Re): + /* FALLTHROUGH */ + case (MDOC_Sc): + /* FALLTHROUGH */ + case (MDOC_Xc): + if (type == p->type && rewind_alt(tok) == p->tok) + return(REWIND_REWIND); + break; + default: + abort(); + /* NOTREACHED */ + } + + return(REWIND_NOHALT); +} + + +static int +rewind_dobreak(int tok, enum mdoc_type type, const struct mdoc_node *p) +{ + + assert(MDOC_ROOT != p->type); + if (MDOC_ELEM == p->type) + return(1); + if (MDOC_TEXT == p->type) + return(1); + + switch (tok) { + case (MDOC_It): + return(MDOC_It == p->tok); + case (MDOC_Ss): + return(MDOC_Ss == p->tok); + case (MDOC_Sh): + if (MDOC_Ss == p->tok) + return(1); + return(MDOC_Sh == p->tok); + } + + if (MDOC_EXPLICIT & mdoc_macros[tok].flags) + return(p->tok == rewind_alt(tok)); + else if (MDOC_BLOCK == p->type) + return(1); + + return(tok == p->tok); +} + + static int rewind_elem(struct mdoc *mdoc, int tok) { @@ -107,16 +321,16 @@ static int rewind_body(struct mdoc *mdoc, int tok) { struct mdoc_node *n; - int t; - - assert(mdoc->last); + int c; /* LINTED */ for (n = mdoc->last; n; n = n->parent) { - t = n->tok; - if (MDOC_BODY == n->type && tok == t) + c = rewind_dohalt(tok, MDOC_BODY, n); + if (REWIND_HALT == c) + return(1); + if (REWIND_REWIND == c) break; - if (MDOC_NESTED & mdoc_macros[t].flags) + else if (rewind_dobreak(tok, MDOC_BODY, n)) continue; return(mdoc_verr(mdoc, n, ERR_SCOPE_BREAK)); } @@ -130,16 +344,16 @@ static int rewind_head(struct mdoc *mdoc, int tok) { struct mdoc_node *n; - int t; - - assert(mdoc->last); + int c; /* LINTED */ for (n = mdoc->last; n; n = n->parent) { - t = n->tok; - if (MDOC_HEAD == n->type && tok == t) + c = rewind_dohalt(tok, MDOC_HEAD, n); + if (REWIND_HALT == c) + return(1); + if (REWIND_REWIND == c) break; - if (MDOC_NESTED & mdoc_macros[t].flags) + else if (rewind_dobreak(tok, MDOC_HEAD, n)) continue; return(mdoc_verr(mdoc, n, ERR_SCOPE_BREAK)); } @@ -153,16 +367,16 @@ static int rewind_expblock(struct mdoc *mdoc, int tok) { struct mdoc_node *n; - int t; - - n = mdoc->last ? mdoc->last->parent : NULL; + int c; /* LINTED */ - for ( ; n; n = n->parent) { - t = n->tok; - if (MDOC_BLOCK == n->type && tok == t) + for (n = mdoc->last; n; n = n->parent) { + c = rewind_dohalt(tok, MDOC_BLOCK, n); + if (REWIND_HALT == c) + return(mdoc_err(mdoc, ERR_SCOPE_NOCTX)); + if (REWIND_REWIND == c) break; - if (MDOC_NESTED & mdoc_macros[t].flags) + else if (rewind_dobreak(tok, MDOC_BLOCK, n)) continue; return(mdoc_verr(mdoc, n, ERR_SCOPE_BREAK)); } @@ -175,25 +389,22 @@ rewind_expblock(struct mdoc *mdoc, int tok) static int rewind_impblock(struct mdoc *mdoc, int tok) { - int t; struct mdoc_node *n; - - n = mdoc->last ? mdoc->last->parent : NULL; + int c; /* LINTED */ - for ( ; n; n = n->parent) { - t = n->tok; - if (MDOC_BLOCK == n->type && tok == t) + for (n = mdoc->last; n; n = n->parent) { + c = rewind_dohalt(tok, MDOC_BLOCK, n); + if (REWIND_HALT == c) + return(1); + else if (REWIND_REWIND == c) break; - if ( ! (MDOC_EXPLICIT & mdoc_macros[t].flags)) + else if (rewind_dobreak(tok, MDOC_BLOCK, n)) continue; - if (MDOC_NESTED & mdoc_macros[tok].flags) - return(1); return(mdoc_verr(mdoc, n, ERR_SCOPE_BREAK)); } - if (NULL == n) - return(1); + assert(n); return(rewind_last(mdoc, n)); } @@ -227,62 +438,11 @@ append_delims(struct mdoc *mdoc, int tok, /* ARGSUSED */ int -macro_close_explicit(MACRO_PROT_ARGS) +macro_scoped_close(MACRO_PROT_ARGS) { int tt, j, c, lastarg, maxargs, flushed; char *p; - switch (tok) { - case (MDOC_Ac): - tt = MDOC_Ao; - break; - case (MDOC_Bc): - tt = MDOC_Bo; - break; - case (MDOC_Dc): - tt = MDOC_Do; - break; - case (MDOC_Ec): - tt = MDOC_Eo; - break; - case (MDOC_Ed): - tt = MDOC_Bd; - break; - case (MDOC_Ef): - tt = MDOC_Bf; - break; - case (MDOC_Ek): - tt = MDOC_Bk; - break; - case (MDOC_El): - tt = MDOC_Bl; - break; - case (MDOC_Fc): - tt = MDOC_Fo; - break; - case (MDOC_Oc): - tt = MDOC_Oo; - break; - case (MDOC_Pc): - tt = MDOC_Po; - break; - case (MDOC_Qc): - tt = MDOC_Qo; - break; - case (MDOC_Re): - tt = MDOC_Rs; - break; - case (MDOC_Sc): - tt = MDOC_So; - break; - case (MDOC_Xc): - tt = MDOC_Xo; - break; - default: - abort(); - /* NOTREACHED */ - } - switch (tok) { case (MDOC_Ec): maxargs = 1; @@ -292,13 +452,18 @@ macro_close_explicit(MACRO_PROT_ARGS) break; } + tt = rewind_alt(tok); + if ( ! (MDOC_CALLABLE & mdoc_macros[tok].flags)) { - if (0 == buf[*pos]) - return(rewind_expblock(mdoc, tt)); + if (0 == buf[*pos]) { + if ( ! rewind_body(mdoc, tok)) + return(0); + return(rewind_expblock(mdoc, tok)); + } return(mdoc_perr(mdoc, line, ppos, ERR_ARGS_EQ0)); } - if ( ! rewind_body(mdoc, tt)) + if ( ! rewind_body(mdoc, tok)) return(0); lastarg = ppos; @@ -314,7 +479,7 @@ macro_close_explicit(MACRO_PROT_ARGS) lastarg = *pos; if (j == maxargs && ! flushed) { - if ( ! rewind_expblock(mdoc, tt)) + if ( ! rewind_expblock(mdoc, tok)) return(0); flushed = 1; } @@ -331,7 +496,7 @@ macro_close_explicit(MACRO_PROT_ARGS) return(0); else if (MDOC_MAX != c) { if ( ! flushed) { - if ( ! rewind_expblock(mdoc, tt)) + if ( ! rewind_expblock(mdoc, tok)) return(0); flushed = 1; } @@ -348,7 +513,7 @@ macro_close_explicit(MACRO_PROT_ARGS) if (MDOC_LINEARG_MAX == j) return(mdoc_perr(mdoc, line, ppos, ERR_ARGS_MANY)); - if ( ! flushed && ! rewind_expblock(mdoc, tt)) + if ( ! flushed && ! rewind_expblock(mdoc, tok)) return(0); if (ppos > 1) @@ -485,9 +650,12 @@ macro_scoped(MACRO_PROT_ARGS) assert ( ! (MDOC_CALLABLE & mdoc_macros[tok].flags)); - if ( ! (MDOC_EXPLICIT & mdoc_macros[tok].flags)) + if ( ! (MDOC_EXPLICIT & mdoc_macros[tok].flags)) { + if ( ! rewind_body(mdoc, tok)) + return(0); if ( ! rewind_impblock(mdoc, tok)) return(0); + } for (argc = 0; argc < MDOC_LINEARG_MAX; argc++) { lastarg = *pos; @@ -629,6 +797,8 @@ macro_scoped_line(MACRO_PROT_ARGS) if ( ! append_delims(mdoc, tok, line, pos, buf)) return(0); } + if ( ! rewind_head(mdoc, tok)) + return(0); return(rewind_impblock(mdoc, tok)); } diff --git a/mdoc.c b/mdoc.c index 9ab96374..2994c737 100644 --- a/mdoc.c +++ b/mdoc.c @@ -1,4 +1,4 @@ -/* $Id: mdoc.c,v 1.28 2009/01/12 16:39:57 kristaps Exp $ */ +/* $Id: mdoc.c,v 1.29 2009/01/14 11:58:24 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -94,10 +94,10 @@ const struct mdoc_macro __mdoc_macros[MDOC_MAX] = { { macro_scoped_line, MDOC_PARSED }, /* D1 */ { macro_scoped_line, MDOC_PARSED }, /* Dl */ { macro_scoped, MDOC_EXPLICIT }, /* Bd */ - { macro_close_explicit, 0 }, /* Ed */ + { macro_scoped_close, MDOC_EXPLICIT }, /* Ed */ { macro_scoped, MDOC_EXPLICIT }, /* Bl */ - { macro_close_explicit, 0 }, /* El */ - { macro_scoped, MDOC_NESTED | MDOC_PARSED | MDOC_TABSEP}, /* It */ + { macro_scoped_close, MDOC_EXPLICIT }, /* El */ + { macro_scoped, MDOC_PARSED | MDOC_TABSEP}, /* It */ { macro_text, MDOC_CALLABLE | MDOC_PARSED }, /* Ad */ { macro_constant, MDOC_PARSED }, /* An */ { macro_text, MDOC_CALLABLE | MDOC_PARSED }, /* Ar */ @@ -137,58 +137,58 @@ const struct mdoc_macro __mdoc_macros[MDOC_MAX] = { { macro_constant, MDOC_QUOTABLE }, /* %R */ { macro_constant, MDOC_QUOTABLE }, /* %T */ { macro_constant, MDOC_QUOTABLE }, /* %V */ - { macro_close_explicit, MDOC_CALLABLE | MDOC_PARSED }, /* Ac */ - { macro_constant_scoped, MDOC_CALLABLE | MDOC_PARSED }, /* Ao */ + { macro_scoped_close, MDOC_EXPLICIT | MDOC_CALLABLE | MDOC_PARSED }, /* Ac */ + { macro_constant_scoped, MDOC_CALLABLE | MDOC_PARSED | MDOC_EXPLICIT }, /* Ao */ { macro_scoped_line, MDOC_CALLABLE | MDOC_PARSED }, /* Aq */ { macro_constant, 0 }, /* At */ - { macro_close_explicit, MDOC_CALLABLE | MDOC_PARSED }, /* Bc */ + { macro_scoped_close, MDOC_EXPLICIT | MDOC_CALLABLE | MDOC_PARSED }, /* Bc */ { macro_scoped, MDOC_EXPLICIT }, /* Bf */ - { macro_constant_scoped, MDOC_CALLABLE | MDOC_PARSED }, /* Bo */ + { macro_constant_scoped, MDOC_CALLABLE | MDOC_PARSED | MDOC_EXPLICIT }, /* Bo */ { macro_scoped_line, MDOC_CALLABLE | MDOC_PARSED }, /* Bq */ { macro_constant_delimited, MDOC_PARSED }, /* Bsx */ { macro_constant_delimited, MDOC_PARSED }, /* Bx */ { macro_constant, 0 }, /* Db */ - { macro_close_explicit, MDOC_CALLABLE | MDOC_PARSED }, /* Dc */ - { macro_constant_scoped, MDOC_CALLABLE | MDOC_PARSED }, /* Do */ + { macro_scoped_close, MDOC_EXPLICIT | MDOC_CALLABLE | MDOC_PARSED }, /* Dc */ + { macro_constant_scoped, MDOC_CALLABLE | MDOC_PARSED | MDOC_EXPLICIT }, /* Do */ { macro_scoped_line, MDOC_CALLABLE | MDOC_PARSED }, /* Dq */ - { macro_close_explicit, MDOC_CALLABLE | MDOC_PARSED }, /* Ec */ - { macro_close_explicit, 0 }, /* Ef */ + { macro_scoped_close, MDOC_EXPLICIT | MDOC_CALLABLE | MDOC_PARSED }, /* Ec */ + { macro_scoped_close, MDOC_EXPLICIT }, /* Ef */ { macro_text, MDOC_CALLABLE | MDOC_PARSED }, /* Em */ - { macro_constant_scoped, MDOC_CALLABLE | MDOC_PARSED }, /* Eo */ + { macro_constant_scoped, MDOC_CALLABLE | MDOC_PARSED | MDOC_EXPLICIT }, /* Eo */ { macro_constant_delimited, MDOC_PARSED }, /* Fx */ { macro_text, MDOC_PARSED }, /* Ms */ { macro_constant_delimited, MDOC_CALLABLE | MDOC_PARSED }, /* No */ { macro_constant_delimited, MDOC_CALLABLE | MDOC_PARSED }, /* Ns */ { macro_constant_delimited, MDOC_PARSED }, /* Nx */ { macro_constant_delimited, MDOC_PARSED }, /* Ox */ - { macro_close_explicit, MDOC_CALLABLE | MDOC_PARSED }, /* Pc */ + { macro_scoped_close, MDOC_EXPLICIT | MDOC_CALLABLE | MDOC_PARSED }, /* Pc */ { macro_constant, MDOC_PARSED }, /* Pf */ - { macro_constant_scoped, MDOC_CALLABLE | MDOC_PARSED }, /* Po */ + { macro_constant_scoped, MDOC_CALLABLE | MDOC_PARSED | MDOC_EXPLICIT }, /* Po */ { macro_scoped_line, MDOC_CALLABLE | MDOC_PARSED }, /* Pq */ - { macro_close_explicit, MDOC_CALLABLE | MDOC_PARSED }, /* Qc */ + { macro_scoped_close, MDOC_EXPLICIT | MDOC_CALLABLE | MDOC_PARSED }, /* Qc */ { macro_scoped_line, MDOC_CALLABLE | MDOC_PARSED }, /* Ql */ - { macro_constant_scoped, MDOC_CALLABLE | MDOC_PARSED }, /* Qo */ + { macro_constant_scoped, MDOC_CALLABLE | MDOC_PARSED | MDOC_EXPLICIT }, /* Qo */ { macro_scoped_line, MDOC_CALLABLE | MDOC_PARSED }, /* Qq */ - { macro_close_explicit, 0 }, /* Re */ + { macro_scoped_close, MDOC_EXPLICIT }, /* Re */ { macro_scoped, MDOC_EXPLICIT }, /* Rs */ - { macro_close_explicit, MDOC_CALLABLE | MDOC_PARSED }, /* Sc */ - { macro_constant_scoped, MDOC_CALLABLE | MDOC_PARSED }, /* So */ + { macro_scoped_close, MDOC_EXPLICIT | MDOC_CALLABLE | MDOC_PARSED }, /* Sc */ + { macro_constant_scoped, MDOC_CALLABLE | MDOC_PARSED | MDOC_EXPLICIT }, /* So */ { macro_scoped_line, MDOC_CALLABLE | MDOC_PARSED }, /* Sq */ { macro_constant, 0 }, /* Sm */ { macro_text, MDOC_CALLABLE | MDOC_PARSED }, /* Sx */ { macro_text, MDOC_CALLABLE | MDOC_PARSED }, /* Sy */ { macro_text, MDOC_CALLABLE | MDOC_PARSED }, /* Tn */ { macro_constant_delimited, MDOC_PARSED }, /* Ux */ - { macro_close_explicit, MDOC_CALLABLE | MDOC_PARSED }, /* Xc */ - { macro_constant_scoped, MDOC_CALLABLE | MDOC_PARSED }, /* Xo */ + { macro_scoped_close, MDOC_EXPLICIT | MDOC_CALLABLE | MDOC_PARSED }, /* Xc */ + { macro_constant_scoped, MDOC_CALLABLE | MDOC_PARSED | MDOC_EXPLICIT }, /* Xo */ /* XXX - .Fo supposed to be (but isn't) callable. */ { macro_scoped, MDOC_EXPLICIT | MDOC_PARSED }, /* Fo */ /* XXX - .Fc supposed to be (but isn't) callable. */ - { macro_close_explicit, MDOC_PARSED }, /* Fc */ - { macro_constant_scoped, MDOC_CALLABLE | MDOC_PARSED }, /* Oo */ - { macro_close_explicit, MDOC_CALLABLE | MDOC_PARSED }, /* Oc */ + { macro_scoped_close, MDOC_EXPLICIT | MDOC_PARSED }, /* Fc */ + { macro_constant_scoped, MDOC_CALLABLE | MDOC_PARSED | MDOC_EXPLICIT }, /* Oo */ + { macro_scoped_close, MDOC_EXPLICIT | MDOC_CALLABLE | MDOC_PARSED }, /* Oc */ { macro_scoped, MDOC_EXPLICIT }, /* Bk */ - { macro_close_explicit, 0 }, /* Ek */ + { macro_scoped_close, MDOC_EXPLICIT }, /* Ek */ { macro_constant, 0 }, /* Bt */ { macro_constant, 0 }, /* Hf */ { macro_obsolete, 0 }, /* Fr */ diff --git a/mdoc.h b/mdoc.h index 23444612..a083791d 100644 --- a/mdoc.h +++ b/mdoc.h @@ -1,4 +1,4 @@ -/* $Id: mdoc.h,v 1.20 2009/01/12 12:52:21 kristaps Exp $ */ +/* $Id: mdoc.h,v 1.21 2009/01/14 11:58:24 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -193,6 +193,8 @@ #define MDOC_Symbolic 61 #define MDOC_ARG_MAX 62 +/* FIXME: have these be generic groups. */ + enum mdoc_err { ERR_SYNTAX_QUOTE, /* NOTUSED */ ERR_SYNTAX_UNQUOTE, @@ -434,6 +436,8 @@ const struct mdoc_node *mdoc_result(struct mdoc *); int mdoc_endparse(struct mdoc *); +char *mdoc_type2a(enum mdoc_type); + __END_DECLS #endif /*!MDOC_H*/ diff --git a/mdocml.c b/mdocml.c index f3afbf21..0175a3e5 100644 --- a/mdocml.c +++ b/mdocml.c @@ -1,4 +1,4 @@ -/* $Id: mdocml.c,v 1.41 2009/01/12 16:39:57 kristaps Exp $ */ +/* $Id: mdocml.c,v 1.42 2009/01/14 11:58:24 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -192,40 +192,34 @@ print_node(const struct mdoc_node *n, int indent) params = NULL; sz = 0; - /* FIXME: put parts of this in util.c. */ + t = mdoc_type2a(n->type); + switch (n->type) { case (MDOC_TEXT): assert(NULL == n->child); p = n->data.text.string; - t = "text"; break; case (MDOC_BODY): p = mdoc_macronames[n->tok]; - t = "block-body"; break; case (MDOC_HEAD): p = mdoc_macronames[n->tok]; - t = "block-head"; break; case (MDOC_TAIL): p = mdoc_macronames[n->tok]; - t = "block-tail"; break; case (MDOC_ELEM): p = mdoc_macronames[n->tok]; - t = "element"; argv = n->data.elem.argv; argc = n->data.elem.argc; break; case (MDOC_BLOCK): p = mdoc_macronames[n->tok]; - t = "block"; argv = n->data.block.argv; argc = n->data.block.argc; break; case (MDOC_ROOT): p = "root"; - t = "root"; break; default: abort(); @@ -238,11 +232,11 @@ print_node(const struct mdoc_node *n, int indent) for (i = 0; i < (int)argc; i++) { (void)printf(" -%s", mdoc_argnames[argv[i].arg]); - if (j > 0) + if (argv[i].sz > 0) (void)printf(" ["); for (j = 0; j < (int)argv[i].sz; j++) (void)printf(" [%s]", argv[i].value[j]); - if (j > 0) + if (argv[i].sz > 0) (void)printf(" ]"); } @@ -361,8 +355,7 @@ msg_err(void *arg, int line, int col, enum mdoc_err type) lit = "syntax: unknown argument for macro"; break; case (ERR_SCOPE_BREAK): - /* Which scope is broken? */ - lit = "scope: macro breaks prior explicit scope"; + lit = "scope: macro breaks prior scope"; break; case (ERR_SCOPE_NOCTX): lit = "scope: closure macro has no context"; diff --git a/private.h b/private.h index 10559e77..42c1b85c 100644 --- a/private.h +++ b/private.h @@ -1,4 +1,4 @@ -/* $Id: private.h,v 1.62 2009/01/12 16:39:57 kristaps Exp $ */ +/* $Id: private.h,v 1.63 2009/01/14 11:58:24 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -52,8 +52,7 @@ struct mdoc_macro { #define MDOC_EXPLICIT (1 << 2) #define MDOC_QUOTABLE (1 << 3) #define MDOC_PROLOGUE (1 << 4) -#define MDOC_NESTED (1 << 5) -#define MDOC_TABSEP (1 << 6) +#define MDOC_TABSEP (1 << 5) }; extern const struct mdoc_macro *const mdoc_macros; @@ -133,7 +132,7 @@ int macro_constant_scoped(MACRO_PROT_ARGS); int macro_constant_delimited(MACRO_PROT_ARGS); int macro_text(MACRO_PROT_ARGS); int macro_scoped(MACRO_PROT_ARGS); -int macro_close_explicit(MACRO_PROT_ARGS); +int macro_scoped_close(MACRO_PROT_ARGS); int macro_scoped_line(MACRO_PROT_ARGS); int macro_prologue(MACRO_PROT_ARGS); int macro_end(struct mdoc *); diff --git a/strings.c b/strings.c index 3b10c770..c985240f 100644 --- a/strings.c +++ b/strings.c @@ -1,4 +1,4 @@ -/* $Id: strings.c,v 1.5 2009/01/06 15:49:44 kristaps Exp $ */ +/* $Id: strings.c,v 1.6 2009/01/14 11:58:24 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -307,3 +307,30 @@ mdoc_atoatt(const char *p) return(ATT_DEFAULT); } + + +char * +mdoc_type2a(enum mdoc_type type) +{ + switch (type) { + case (MDOC_ROOT): + return("root"); + case (MDOC_BLOCK): + return("block"); + case (MDOC_HEAD): + return("block-head"); + case (MDOC_BODY): + return("block-body"); + case (MDOC_TAIL): + return("block-tail"); + case (MDOC_ELEM): + return("elem"); + case (MDOC_TEXT): + return("text"); + default: + break; + } + + abort(); + /* NOTREACHED */ +} diff --git a/validate.c b/validate.c index 87f686ac..9c4fc706 100644 --- a/validate.c +++ b/validate.c @@ -1,4 +1,4 @@ -/* $Id: validate.c,v 1.27 2009/01/12 17:26:42 kristaps Exp $ */ +/* $Id: validate.c,v 1.28 2009/01/14 11:58:24 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -79,8 +79,10 @@ const struct valids mdoc_valids[MDOC_MAX] = { { pres_prologue, NULL }, /* Os */ /* FIXME: preceding Pp. */ /* FIXME: NAME section internal ordering. */ + /* FIXME: can only be a child of root. */ { NULL, posts_sh }, /* Sh */ /* FIXME: preceding Pp. */ + /* FIXME: can only be a child of Sh. */ { NULL, posts_ss }, /* Ss */ /* FIXME: proceeding... */ { NULL, posts_pp }, /* Pp */ -- cgit v1.2.3-56-ge451