=================================================================== RCS file: /cvs/mandoc/mdoc.c,v retrieving revision 1.32 retrieving revision 1.35 diff -u -p -r1.32 -r1.35 --- mandoc/mdoc.c 2009/01/16 14:04:26 1.32 +++ mandoc/mdoc.c 2009/01/17 20:10:36 1.35 @@ -1,4 +1,4 @@ -/* $Id: mdoc.c,v 1.32 2009/01/16 14:04:26 kristaps Exp $ */ +/* $Id: mdoc.c,v 1.35 2009/01/17 20:10:36 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -140,7 +140,7 @@ const struct mdoc_macro __mdoc_macros[MDOC_MAX] = { { macro_scoped_close, MDOC_EXPLICIT | MDOC_CALLABLE | MDOC_PARSED }, /* Ac */ { macro_constant_scoped, MDOC_CALLABLE | MDOC_PARSED | MDOC_EXPLICIT }, /* Ao */ { macro_scoped_line, MDOC_CALLABLE | MDOC_PARSED }, /* Aq */ - { macro_constant, 0 }, /* At */ + { macro_constant_delimited, 0 }, /* At */ { macro_scoped_close, MDOC_EXPLICIT | MDOC_CALLABLE | MDOC_PARSED }, /* Bc */ { macro_scoped, MDOC_EXPLICIT }, /* Bf */ { macro_constant_scoped, MDOC_CALLABLE | MDOC_PARSED | MDOC_EXPLICIT }, /* Bo */ @@ -221,6 +221,19 @@ mdoc_result(struct mdoc *mdoc) void +mdoc_meta_free(struct mdoc *mdoc) +{ + + if (mdoc->meta.title) + free(mdoc->meta.title); + if (mdoc->meta.os) + free(mdoc->meta.os); + if (mdoc->meta.name) + free(mdoc->meta.name); +} + + +void mdoc_free(struct mdoc *mdoc) { @@ -241,7 +254,8 @@ mdoc_alloc(void *data, const struct mdoc_cb *cb) p = xcalloc(1, sizeof(struct mdoc)); p->data = data; - (void)memcpy(&p->cb, cb, sizeof(struct mdoc_cb)); + if (cb) + (void)memcpy(&p->cb, cb, sizeof(struct mdoc_cb)); p->last = xcalloc(1, sizeof(struct mdoc_node)); p->last->type = MDOC_ROOT; @@ -439,8 +453,6 @@ mdoc_node_append(struct mdoc *mdoc, struct mdoc_node * if ( ! mdoc_valid_pre(mdoc, p)) return(0); - if ( ! mdoc_action_pre(mdoc, p)) - return(0); switch (p->type) { case (MDOC_HEAD): @@ -711,4 +723,26 @@ argdup(size_t argsz, const struct mdoc_arg *args) return(pp); } + + +char * +mdoc_node2a(struct mdoc_node *node) +{ + static char buf[64]; + + assert(node); + + buf[0] = 0; + (void)xstrlcat(buf, mdoc_type2a(node->type), 64); + if (MDOC_ROOT == node->type) + return(buf); + (void)xstrlcat(buf, " `", 64); + if (MDOC_TEXT == node->type) + (void)xstrlcat(buf, node->data.text.string, 64); + else + (void)xstrlcat(buf, mdoc_macronames[node->tok], 64); + + return(buf); +} +