=================================================================== RCS file: /cvs/mandoc/mdoc.c,v retrieving revision 1.19 retrieving revision 1.22 diff -u -p -r1.19 -r1.22 --- mandoc/mdoc.c 2009/01/06 15:49:44 1.19 +++ mandoc/mdoc.c 2009/01/07 16:11:40 1.22 @@ -1,4 +1,4 @@ -/* $Id: mdoc.c,v 1.19 2009/01/06 15:49:44 kristaps Exp $ */ +/* $Id: mdoc.c,v 1.22 2009/01/07 16:11:40 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -121,7 +121,7 @@ const struct mdoc_macro __mdoc_macros[MDOC_MAX] = { { macro_obsolete, 0 }, /* Ot */ { macro_text, MDOC_CALLABLE | MDOC_PARSED }, /* Pa */ { macro_constant, 0 }, /* Rv */ - /* XXX - supposed to be (but isn't) callable. */ + /* XXX - .St supposed to be (but isn't) callable. */ { macro_constant_delimited, MDOC_PARSED }, /* St */ { macro_text, MDOC_CALLABLE | MDOC_PARSED }, /* Va */ { macro_text, MDOC_CALLABLE | MDOC_PARSED }, /* Vt */ @@ -249,15 +249,36 @@ 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)); - mdoc_word_alloc(mdoc, 0, buf); + mdoc_word_alloc(mdoc, line, 0, buf); mdoc->next = MDOC_NEXT_SIBLING; return(1); } @@ -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,8 @@ 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)); } @@ -447,7 +479,7 @@ mdoc_node_append(struct mdoc *mdoc, int pos, struct md void -mdoc_tail_alloc(struct mdoc *mdoc, int pos, int tok) +mdoc_tail_alloc(struct mdoc *mdoc, int line, int pos, int tok) { struct mdoc_node *p; @@ -456,6 +488,8 @@ mdoc_tail_alloc(struct mdoc *mdoc, int pos, int tok) p = xcalloc(1, sizeof(struct mdoc_node)); + p->line = line; + p->pos = pos; p->type = MDOC_TAIL; p->data.tail.tok = tok; @@ -464,7 +498,7 @@ mdoc_tail_alloc(struct mdoc *mdoc, int pos, int tok) void -mdoc_head_alloc(struct mdoc *mdoc, int pos, int tok) +mdoc_head_alloc(struct mdoc *mdoc, int line, int pos, int tok) { struct mdoc_node *p; @@ -473,6 +507,8 @@ mdoc_head_alloc(struct mdoc *mdoc, int pos, int tok) p = xcalloc(1, sizeof(struct mdoc_node)); + p->line = line; + p->pos = pos; p->type = MDOC_HEAD; p->data.head.tok = tok; @@ -481,7 +517,7 @@ mdoc_head_alloc(struct mdoc *mdoc, int pos, int tok) void -mdoc_body_alloc(struct mdoc *mdoc, int pos, int tok) +mdoc_body_alloc(struct mdoc *mdoc, int line, int pos, int tok) { struct mdoc_node *p; @@ -490,6 +526,8 @@ mdoc_body_alloc(struct mdoc *mdoc, int pos, int tok) p = xcalloc(1, sizeof(struct mdoc_node)); + p->line = line; + p->pos = pos; p->type = MDOC_BODY; p->data.body.tok = tok; @@ -498,13 +536,15 @@ mdoc_body_alloc(struct mdoc *mdoc, int pos, int tok) void -mdoc_block_alloc(struct mdoc *mdoc, int pos, int tok, - size_t argsz, const struct mdoc_arg *args) +mdoc_block_alloc(struct mdoc *mdoc, int line, int pos, + int tok, size_t argsz, const struct mdoc_arg *args) { struct mdoc_node *p; p = xcalloc(1, sizeof(struct mdoc_node)); + p->pos = pos; + p->line = line; p->type = MDOC_BLOCK; p->data.block.tok = tok; p->data.block.argc = argsz; @@ -515,12 +555,15 @@ mdoc_block_alloc(struct mdoc *mdoc, int pos, int tok, void -mdoc_elem_alloc(struct mdoc *mdoc, int pos, int tok, - size_t argsz, const struct mdoc_arg *args) +mdoc_elem_alloc(struct mdoc *mdoc, int line, int pos, + int tok, size_t argsz, const struct mdoc_arg *args) { struct mdoc_node *p; p = xcalloc(1, sizeof(struct mdoc_node)); + + p->line = line; + p->pos = pos; p->type = MDOC_ELEM; p->data.elem.tok = tok; p->data.elem.argc = argsz; @@ -531,11 +574,14 @@ mdoc_elem_alloc(struct mdoc *mdoc, int pos, int tok, void -mdoc_word_alloc(struct mdoc *mdoc, int pos, const char *word) +mdoc_word_alloc(struct mdoc *mdoc, + int line, int pos, const char *word) { struct mdoc_node *p; p = xcalloc(1, sizeof(struct mdoc_node)); + p->line = line; + p->pos = pos; p->type = MDOC_TEXT; p->data.text.string = xstrdup(word);