=================================================================== RCS file: /cvs/mandoc/mdoc.c,v retrieving revision 1.24 retrieving revision 1.26 diff -u -p -r1.24 -r1.26 --- mandoc/mdoc.c 2009/01/08 15:05:50 1.24 +++ mandoc/mdoc.c 2009/01/12 10:31:53 1.26 @@ -1,4 +1,4 @@ -/* $Id: mdoc.c,v 1.24 2009/01/08 15:05:50 kristaps Exp $ */ +/* $Id: mdoc.c,v 1.26 2009/01/12 10:31:53 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -243,7 +243,13 @@ mdoc_alloc(void *data, const struct mdoc_cb *cb) p->data = data; (void)memcpy(&p->cb, cb, sizeof(struct mdoc_cb)); + p->last = xcalloc(1, sizeof(struct mdoc_node)); + p->last->type = MDOC_ROOT; + p->first = p->last; + + p->next = MDOC_NEXT_CHILD; p->htab = mdoc_tokhash_alloc(); + return(p); } @@ -277,7 +283,8 @@ mdoc_parseln(struct mdoc *mdoc, int line, char *buf) if ('.' != *buf) { if (SEC_PROLOGUE != mdoc->sec_lastn) { - mdoc_word_alloc(mdoc, line, 0, buf); + if ( ! mdoc_word_alloc(mdoc, line, 0, buf)) + return(0); mdoc->next = MDOC_NEXT_SIBLING; return(1); } @@ -386,50 +393,12 @@ mdoc_macro(struct mdoc *mdoc, int tok, static int mdoc_node_append(struct mdoc *mdoc, struct mdoc_node *p) { - const char *nn, *on, *nt, *ot, *act; + const char *on, *ot, *act; - switch (p->type) { - case (MDOC_TEXT): - nn = p->data.text.string; - nt = "text"; - break; - case (MDOC_BODY): - nn = mdoc_macronames[p->data.body.tok]; - nt = "body"; - break; - case (MDOC_ELEM): - nn = mdoc_macronames[p->data.elem.tok]; - nt = "elem"; - break; - case (MDOC_HEAD): - nn = mdoc_macronames[p->data.head.tok]; - nt = "head"; - break; - case (MDOC_TAIL): - nn = mdoc_macronames[p->data.tail.tok]; - nt = "tail"; - break; - case (MDOC_BLOCK): - nn = mdoc_macronames[p->data.block.tok]; - nt = "block"; - break; - default: - abort(); - /* NOTREACHED */ - } + assert(mdoc->last); + assert(mdoc->first); + assert(MDOC_ROOT != p->type); - if (NULL == mdoc->first) { - assert(NULL == mdoc->last); - if ( ! mdoc_valid_pre(mdoc, p)) - return(0); - if ( ! mdoc_action_pre(mdoc, p)) - return(0); - mdoc->first = p; - mdoc->last = p; - mdoc_msg(mdoc, "parse: root %s `%s'", nt, nn); - return(1); - } - switch (mdoc->last->type) { case (MDOC_TEXT): on = ""; @@ -455,6 +424,10 @@ mdoc_node_append(struct mdoc *mdoc, struct mdoc_node * on = mdoc_macronames[mdoc->last->data.block.tok]; ot = "block"; break; + case (MDOC_ROOT): + on = "root"; + ot = "root"; + break; default: abort(); /* NOTREACHED */ @@ -545,6 +518,19 @@ mdoc_body_alloc(struct mdoc *mdoc, int line, int pos, int +mdoc_root_alloc(struct mdoc *mdoc) +{ + struct mdoc_node *p; + + p = xcalloc(1, sizeof(struct mdoc_node)); + + p->type = MDOC_ROOT; + + return(mdoc_node_append(mdoc, p)); +} + + +int mdoc_block_alloc(struct mdoc *mdoc, int line, int pos, int tok, size_t argsz, const struct mdoc_arg *args) { @@ -693,6 +679,8 @@ argcpy(struct mdoc_arg *dst, const struct mdoc_arg *sr { int i; + dst->line = src->line; + dst->pos = src->pos; dst->arg = src->arg; if (0 == (dst->sz = src->sz)) return;