=================================================================== RCS file: /cvs/mandoc/mdoc.c,v retrieving revision 1.213 retrieving revision 1.220 diff -u -p -r1.213 -r1.220 --- mandoc/mdoc.c 2014/04/20 16:46:05 1.213 +++ mandoc/mdoc.c 2014/07/09 11:31:43 1.220 @@ -1,4 +1,4 @@ -/* $Id: mdoc.c,v 1.213 2014/04/20 16:46:05 schwarze Exp $ */ +/* $Id: mdoc.c,v 1.220 2014/07/09 11:31:43 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010, 2012, 2013, 2014 Ingo Schwarze @@ -35,7 +35,7 @@ #include "libmdoc.h" #include "libmandoc.h" -const char *const __mdoc_macronames[MDOC_MAX] = { +const char *const __mdoc_macronames[MDOC_MAX + 1] = { "Ap", "Dd", "Dt", "Os", "Sh", "Ss", "Pp", "D1", "Dl", "Bd", "Ed", "Bl", @@ -66,7 +66,7 @@ const char *const __mdoc_macronames[MDOC_MAX] = { "Lk", "Mt", "Brq", "Bro", "Brc", "%C", "Es", "En", "Dx", "%Q", "br", "sp", - "%U", "Ta", "ll", + "%U", "Ta", "ll", "text", }; const char *const __mdoc_argnames[MDOC_ARG_MAX] = { @@ -189,7 +189,7 @@ mdoc_free(struct mdoc *mdoc) */ struct mdoc * mdoc_alloc(struct roff *roff, struct mparse *parse, - char *defos, int quick) + const char *defos, int quick) { struct mdoc *p; @@ -227,13 +227,6 @@ mdoc_addeqn(struct mdoc *mdoc, const struct eqn *ep) assert( ! (MDOC_HALT & mdoc->flags)); - /* No text before an initial macro. */ - - if (SEC_NONE == mdoc->lastnamed) { - mdoc_pmsg(mdoc, ep->ln, ep->pos, MANDOCERR_NOTEXT); - return(1); - } - n = node_alloc(mdoc, ep->ln, ep->pos, MDOC_MAX, MDOC_EQN); n->eqn = ep; @@ -251,13 +244,6 @@ mdoc_addspan(struct mdoc *mdoc, const struct tbl_span assert( ! (MDOC_HALT & mdoc->flags)); - /* No text before an initial macro. */ - - if (SEC_NONE == mdoc->lastnamed) { - mdoc_pmsg(mdoc, sp->line, 0, MANDOCERR_NOTEXT); - return(1); - } - n = node_alloc(mdoc, sp->line, 0, MDOC_MAX, MDOC_TBL); n->span = sp; @@ -305,7 +291,8 @@ mdoc_macro(MACRO_PROT_ARGS) if (MDOC_PROLOGUE & mdoc_macros[tok].flags && MDOC_PBODY & mdoc->flags) { - mdoc_pmsg(mdoc, line, ppos, MANDOCERR_BADBODY); + mandoc_vmsg(MANDOCERR_PROLOG_ONLY, mdoc->parse, + line, ppos, "%s", mdoc_macronames[tok]); return(1); } @@ -313,7 +300,8 @@ mdoc_macro(MACRO_PROT_ARGS) if ( ! (MDOC_PROLOGUE & mdoc_macros[tok].flags) && ! (MDOC_PBODY & mdoc->flags)) { - mdoc_pmsg(mdoc, line, ppos, MANDOCERR_BADPROLOG); + mandoc_vmsg(MANDOCERR_PROLOG_BAD, mdoc->parse, + line, ppos, "%s", mdoc_macronames[tok]); if (NULL == mdoc->meta.msec) mdoc->meta.msec = mandoc_strdup("1"); if (NULL == mdoc->meta.title) @@ -514,6 +502,8 @@ mdoc_block_alloc(struct mdoc *mdoc, int line, int pos, /* FALLTHROUGH */ case MDOC_Bl: /* FALLTHROUGH */ + case MDOC_En: + /* FALLTHROUGH */ case MDOC_Rs: p->norm = mandoc_calloc(1, sizeof(union mdoc_data)); break; @@ -718,13 +708,6 @@ mdoc_ptext(struct mdoc *mdoc, int line, char *buf, int char *c, *ws, *end; struct mdoc_node *n; - /* No text before an initial macro. */ - - if (SEC_NONE == mdoc->lastnamed) { - mdoc_pmsg(mdoc, line, offs, MANDOCERR_NOTEXT); - return(1); - } - assert(mdoc->last); n = mdoc->last; @@ -793,10 +776,12 @@ mdoc_ptext(struct mdoc *mdoc, int line, char *buf, int *end = '\0'; if (ws) - mdoc_pmsg(mdoc, line, (int)(ws-buf), MANDOCERR_EOLNSPACE); + mandoc_msg(MANDOCERR_SPACE_EOL, mdoc->parse, + line, (int)(ws-buf), NULL); if ('\0' == buf[offs] && ! (MDOC_LITERAL & mdoc->flags)) { - mdoc_pmsg(mdoc, line, (int)(c-buf), MANDOCERR_NOBLANKLN); + mandoc_msg(MANDOCERR_FI_BLANK, mdoc->parse, + line, (int)(c - buf), NULL); /* * Insert a `sp' in the case of a blank line. Technically, @@ -846,7 +831,8 @@ mdoc_pmacro(struct mdoc *mdoc, int ln, char *buf, int /* Empty post-control lines are ignored. */ if ('"' == buf[offs]) { - mdoc_pmsg(mdoc, ln, offs, MANDOCERR_BADCOMMENT); + mandoc_msg(MANDOCERR_COMMENT_BAD, mdoc->parse, + ln, offs, NULL); return(1); } else if ('\0' == buf[offs]) return(1); @@ -865,7 +851,7 @@ mdoc_pmacro(struct mdoc *mdoc, int ln, char *buf, int mac[i] = '\0'; - tok = (i > 1 || i < 4) ? mdoc_hash_find(mac) : MDOC_MAX; + tok = (i > 1 && i < 4) ? mdoc_hash_find(mac) : MDOC_MAX; if (MDOC_MAX == tok) { mandoc_vmsg(MANDOCERR_MACRO, mdoc->parse, @@ -889,7 +875,8 @@ mdoc_pmacro(struct mdoc *mdoc, int ln, char *buf, int */ if ('\0' == buf[offs] && ' ' == buf[offs - 1]) - mdoc_pmsg(mdoc, ln, offs - 1, MANDOCERR_EOLNSPACE); + mandoc_msg(MANDOCERR_SPACE_EOL, mdoc->parse, + ln, offs - 1, NULL); /* * If an initial macro or a list invocation, divert directly