=================================================================== RCS file: /cvs/mandoc/mdoc.c,v retrieving revision 1.19 retrieving revision 1.21 diff -u -p -r1.19 -r1.21 --- mandoc/mdoc.c 2009/01/06 15:49:44 1.19 +++ mandoc/mdoc.c 2009/01/07 15:57:14 1.21 @@ -1,4 +1,4 @@ -/* $Id: mdoc.c,v 1.19 2009/01/06 15:49:44 kristaps Exp $ */ +/* $Id: mdoc.c,v 1.21 2009/01/07 15:57:14 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -249,11 +249,32 @@ mdoc_alloc(void *data, const struct mdoc_cb *cb) int -mdoc_parseln(struct mdoc *mdoc, char *buf) +mdoc_endparse(struct mdoc *mdoc) { + + if (MDOC_HALT & mdoc->flags) + return(0); + if (NULL == mdoc->first) + return(1); + + assert(mdoc->last); + if ( ! macro_end(mdoc)) { + mdoc->flags |= MDOC_HALT; + return(0); + } + return(1); +} + + +int +mdoc_parseln(struct mdoc *mdoc, int line, char *buf) +{ int c, i; char tmp[5]; + if (MDOC_HALT & mdoc->flags) + return(0); + if ('.' != *buf) { if (SEC_PROLOGUE == mdoc->sec_lastn) return(mdoc_err(mdoc, -1, 0, ERR_SYNTAX_NOTEXT)); @@ -270,23 +291,32 @@ mdoc_parseln(struct mdoc *mdoc, char *buf) while (buf[i] && ! isspace(buf[i]) && i < (int)sizeof(tmp)) i++; - if (i == (int)sizeof(tmp)) + if (i == (int)sizeof(tmp)) { + mdoc->flags |= MDOC_HALT; return(mdoc_err(mdoc, -1, 1, ERR_MACRO_NOTSUP)); - else if (i <= 2) + } else if (i <= 2) { + mdoc->flags |= MDOC_HALT; return(mdoc_err(mdoc, -1, 1, ERR_MACRO_NOTSUP)); + } i--; (void)memcpy(tmp, buf + 1, (size_t)i); tmp[i++] = 0; - if (MDOC_MAX == (c = mdoc_find(mdoc, tmp))) + if (MDOC_MAX == (c = mdoc_find(mdoc, tmp))) { + mdoc->flags |= MDOC_HALT; return(mdoc_err(mdoc, c, 1, ERR_MACRO_NOTSUP)); + } while (buf[i] && isspace(buf[i])) i++; - return(mdoc_macro(mdoc, c, 1, &i, buf)); + if ( ! mdoc_macro(mdoc, c, line, 1, &i, buf)) { + mdoc->flags |= MDOC_HALT; + return(0); + } + return(1); } @@ -328,7 +358,8 @@ mdoc_warn(struct mdoc *mdoc, int tok, int pos, enum md int -mdoc_macro(struct mdoc *mdoc, int tok, int ppos, int *pos, char *buf) +mdoc_macro(struct mdoc *mdoc, int tok, + int line, int ppos, int *pos, char *buf) { if ( ! (MDOC_PROLOGUE & mdoc_macros[tok].flags) && @@ -345,7 +376,7 @@ mdoc_macro(struct mdoc *mdoc, int tok, int ppos, int * return(0); } - return((*mdoc_macros[tok].fp)(mdoc, tok, ppos, pos, buf)); + return((*mdoc_macros[tok].fp)(mdoc, tok, line, ppos, pos, buf)); }