=================================================================== RCS file: /cvs/mandoc/mdoc.c,v retrieving revision 1.25 retrieving revision 1.28 diff -u -p -r1.25 -r1.28 --- mandoc/mdoc.c 2009/01/09 14:45:44 1.25 +++ mandoc/mdoc.c 2009/01/12 16:39:57 1.28 @@ -1,4 +1,4 @@ -/* $Id: mdoc.c,v 1.25 2009/01/09 14:45:44 kristaps Exp $ */ +/* $Id: mdoc.c,v 1.28 2009/01/12 16:39:57 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -97,7 +97,7 @@ const struct mdoc_macro __mdoc_macros[MDOC_MAX] = { { macro_close_explicit, 0 }, /* Ed */ { macro_scoped, MDOC_EXPLICIT }, /* Bl */ { macro_close_explicit, 0 }, /* El */ - { macro_scoped, MDOC_NESTED | MDOC_PARSED }, /* It */ + { macro_scoped, MDOC_NESTED | MDOC_PARSED | MDOC_TABSEP}, /* It */ { macro_text, MDOC_CALLABLE | MDOC_PARSED }, /* Ad */ { macro_constant, MDOC_PARSED }, /* An */ { macro_text, MDOC_CALLABLE | MDOC_PARSED }, /* Ar */ @@ -283,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); } @@ -392,69 +393,40 @@ 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 (MDOC_TEXT == mdoc->last->type) + on = ""; + else if (MDOC_ROOT == mdoc->last->type) + on = ""; + else + on = mdoc_macronames[mdoc->last->tok]; + + /* FIXME: put this into util.c. */ switch (mdoc->last->type) { case (MDOC_TEXT): - on = ""; ot = "text"; break; case (MDOC_BODY): - on = mdoc_macronames[mdoc->last->data.body.tok]; ot = "body"; break; case (MDOC_ELEM): - on = mdoc_macronames[mdoc->last->data.elem.tok]; ot = "elem"; break; case (MDOC_HEAD): - on = mdoc_macronames[mdoc->last->data.head.tok]; ot = "head"; break; case (MDOC_TAIL): - on = mdoc_macronames[mdoc->last->data.tail.tok]; ot = "tail"; break; case (MDOC_BLOCK): - on = mdoc_macronames[mdoc->last->data.block.tok]; ot = "block"; break; case (MDOC_ROOT): - on = "root"; ot = "root"; break; default: @@ -483,6 +455,24 @@ mdoc_node_append(struct mdoc *mdoc, struct mdoc_node * return(0); if ( ! mdoc_action_pre(mdoc, p)) return(0); + + switch (p->type) { + case (MDOC_HEAD): + assert(MDOC_BLOCK == p->parent->type); + p->parent->data.block.head = p; + break; + case (MDOC_TAIL): + assert(MDOC_BLOCK == p->parent->type); + p->parent->data.block.tail = p; + break; + case (MDOC_BODY): + assert(MDOC_BLOCK == p->parent->type); + p->parent->data.block.body = p; + break; + default: + break; + } + mdoc->last = p; mdoc_msg(mdoc, "parse: %s of %s `%s'", act, ot, on); return(1); @@ -502,7 +492,7 @@ mdoc_tail_alloc(struct mdoc *mdoc, int line, int pos, p->line = line; p->pos = pos; p->type = MDOC_TAIL; - p->data.tail.tok = tok; + p->tok = tok; return(mdoc_node_append(mdoc, p)); } @@ -521,7 +511,7 @@ mdoc_head_alloc(struct mdoc *mdoc, int line, int pos, p->line = line; p->pos = pos; p->type = MDOC_HEAD; - p->data.head.tok = tok; + p->tok = tok; return(mdoc_node_append(mdoc, p)); } @@ -540,7 +530,7 @@ mdoc_body_alloc(struct mdoc *mdoc, int line, int pos, p->line = line; p->pos = pos; p->type = MDOC_BODY; - p->data.body.tok = tok; + p->tok = tok; return(mdoc_node_append(mdoc, p)); } @@ -570,7 +560,7 @@ mdoc_block_alloc(struct mdoc *mdoc, int line, int pos, p->pos = pos; p->line = line; p->type = MDOC_BLOCK; - p->data.block.tok = tok; + p->tok = tok; p->data.block.argc = argsz; p->data.block.argv = argdup(argsz, args); @@ -589,7 +579,7 @@ mdoc_elem_alloc(struct mdoc *mdoc, int line, int pos, p->line = line; p->pos = pos; p->type = MDOC_ELEM; - p->data.elem.tok = tok; + p->tok = tok; p->data.elem.argc = argsz; p->data.elem.argv = argdup(argsz, args); @@ -708,6 +698,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;