version 1.111, 2009/10/26 07:11:07 |
version 1.113, 2009/10/30 05:58:38 |
|
|
#include <string.h> |
#include <string.h> |
|
|
#include "libmdoc.h" |
#include "libmdoc.h" |
|
#include "libmandoc.h" |
|
|
const char *const __mdoc_merrnames[MERRMAX] = { |
const char *const __mdoc_merrnames[MERRMAX] = { |
"trailing whitespace", /* ETAILWS */ |
"trailing whitespace", /* ETAILWS */ |
"unexpected quoted parameter", /* EQUOTPARM */ |
"unexpected quoted parameter", /* EQUOTPARM */ |
"unterminated quoted parameter", /* EQUOTTERM */ |
"unterminated quoted parameter", /* EQUOTTERM */ |
"system: malloc error", /* EMALLOC */ |
|
"argument parameter suggested", /* EARGVAL */ |
"argument parameter suggested", /* EARGVAL */ |
"macro disallowed in prologue", /* EBODYPROL */ |
"macro disallowed in prologue", /* EBODYPROL */ |
"macro disallowed in body", /* EPROLBODY */ |
"macro disallowed in body", /* EPROLBODY */ |
Line 137 const char * const *mdoc_macronames = __mdoc_macroname |
|
Line 137 const char * const *mdoc_macronames = __mdoc_macroname |
|
const char * const *mdoc_argnames = __mdoc_argnames; |
const char * const *mdoc_argnames = __mdoc_argnames; |
|
|
static void mdoc_free1(struct mdoc *); |
static void mdoc_free1(struct mdoc *); |
static int mdoc_alloc1(struct mdoc *); |
static void mdoc_alloc1(struct mdoc *); |
static struct mdoc_node *node_alloc(struct mdoc *, int, int, |
static struct mdoc_node *node_alloc(struct mdoc *, int, int, |
int, enum mdoc_type); |
int, enum mdoc_type); |
static int node_append(struct mdoc *, |
static int node_append(struct mdoc *, |
Line 194 mdoc_free1(struct mdoc *mdoc) |
|
Line 194 mdoc_free1(struct mdoc *mdoc) |
|
/* |
/* |
* Allocate all volatile resources (parse tree, meta-data, fields). |
* Allocate all volatile resources (parse tree, meta-data, fields). |
*/ |
*/ |
static int |
static void |
mdoc_alloc1(struct mdoc *mdoc) |
mdoc_alloc1(struct mdoc *mdoc) |
{ |
{ |
|
|
bzero(&mdoc->meta, sizeof(struct mdoc_meta)); |
memset(&mdoc->meta, 0, sizeof(struct mdoc_meta)); |
mdoc->flags = 0; |
mdoc->flags = 0; |
mdoc->lastnamed = mdoc->lastsec = SEC_NONE; |
mdoc->lastnamed = mdoc->lastsec = SEC_NONE; |
mdoc->last = calloc(1, sizeof(struct mdoc_node)); |
mdoc->last = mandoc_calloc(1, sizeof(struct mdoc_node)); |
if (NULL == mdoc->last) |
|
return(0); |
|
|
|
mdoc->first = mdoc->last; |
mdoc->first = mdoc->last; |
mdoc->last->type = MDOC_ROOT; |
mdoc->last->type = MDOC_ROOT; |
mdoc->next = MDOC_NEXT_CHILD; |
mdoc->next = MDOC_NEXT_CHILD; |
return(1); |
|
} |
} |
|
|
|
|
Line 218 mdoc_alloc1(struct mdoc *mdoc) |
|
Line 214 mdoc_alloc1(struct mdoc *mdoc) |
|
* and the parser is ready for re-invocation on a new tree; however, |
* and the parser is ready for re-invocation on a new tree; however, |
* cross-parse non-volatile data is kept intact. |
* cross-parse non-volatile data is kept intact. |
*/ |
*/ |
int |
void |
mdoc_reset(struct mdoc *mdoc) |
mdoc_reset(struct mdoc *mdoc) |
{ |
{ |
|
|
mdoc_free1(mdoc); |
mdoc_free1(mdoc); |
return(mdoc_alloc1(mdoc)); |
mdoc_alloc1(mdoc); |
} |
} |
|
|
|
|
Line 248 mdoc_alloc(void *data, int pflags, const struct mdoc_c |
|
Line 244 mdoc_alloc(void *data, int pflags, const struct mdoc_c |
|
{ |
{ |
struct mdoc *p; |
struct mdoc *p; |
|
|
if (NULL == (p = calloc(1, sizeof(struct mdoc)))) |
p = mandoc_calloc(1, sizeof(struct mdoc)); |
return(NULL); |
|
if (cb) |
if (cb) |
(void)memcpy(&p->cb, cb, sizeof(struct mdoc_cb)); |
memcpy(&p->cb, cb, sizeof(struct mdoc_cb)); |
|
|
mdoc_hash_init(); |
|
|
|
p->data = data; |
p->data = data; |
p->pflags = pflags; |
p->pflags = pflags; |
|
|
if (mdoc_alloc1(p)) |
mdoc_hash_init(); |
return(p); |
mdoc_alloc1(p); |
|
return(p); |
free(p); |
|
return(NULL); |
|
} |
} |
|
|
|
|
Line 438 node_alloc(struct mdoc *m, int line, |
|
Line 430 node_alloc(struct mdoc *m, int line, |
|
{ |
{ |
struct mdoc_node *p; |
struct mdoc_node *p; |
|
|
if (NULL == (p = calloc(1, sizeof(struct mdoc_node)))) { |
p = mandoc_calloc(1, sizeof(struct mdoc_node)); |
(void)mdoc_nerr(m, m->last, EMALLOC); |
|
return(NULL); |
|
} |
|
|
|
p->sec = m->lastsec; |
p->sec = m->lastsec; |
p->line = line; |
p->line = line; |
p->pos = pos; |
p->pos = pos; |
Line 460 mdoc_tail_alloc(struct mdoc *m, int line, int pos, int |
|
Line 448 mdoc_tail_alloc(struct mdoc *m, int line, int pos, int |
|
struct mdoc_node *p; |
struct mdoc_node *p; |
|
|
p = node_alloc(m, line, pos, tok, MDOC_TAIL); |
p = node_alloc(m, line, pos, tok, MDOC_TAIL); |
if (NULL == p) |
|
return(0); |
|
if ( ! node_append(m, p)) |
if ( ! node_append(m, p)) |
return(0); |
return(0); |
m->next = MDOC_NEXT_CHILD; |
m->next = MDOC_NEXT_CHILD; |
Line 478 mdoc_head_alloc(struct mdoc *m, int line, int pos, int |
|
Line 464 mdoc_head_alloc(struct mdoc *m, int line, int pos, int |
|
assert(m->last); |
assert(m->last); |
|
|
p = node_alloc(m, line, pos, tok, MDOC_HEAD); |
p = node_alloc(m, line, pos, tok, MDOC_HEAD); |
if (NULL == p) |
|
return(0); |
|
if ( ! node_append(m, p)) |
if ( ! node_append(m, p)) |
return(0); |
return(0); |
m->next = MDOC_NEXT_CHILD; |
m->next = MDOC_NEXT_CHILD; |
Line 493 mdoc_body_alloc(struct mdoc *m, int line, int pos, int |
|
Line 477 mdoc_body_alloc(struct mdoc *m, int line, int pos, int |
|
struct mdoc_node *p; |
struct mdoc_node *p; |
|
|
p = node_alloc(m, line, pos, tok, MDOC_BODY); |
p = node_alloc(m, line, pos, tok, MDOC_BODY); |
if (NULL == p) |
|
return(0); |
|
if ( ! node_append(m, p)) |
if ( ! node_append(m, p)) |
return(0); |
return(0); |
m->next = MDOC_NEXT_CHILD; |
m->next = MDOC_NEXT_CHILD; |
Line 509 mdoc_block_alloc(struct mdoc *m, int line, int pos, |
|
Line 491 mdoc_block_alloc(struct mdoc *m, int line, int pos, |
|
struct mdoc_node *p; |
struct mdoc_node *p; |
|
|
p = node_alloc(m, line, pos, tok, MDOC_BLOCK); |
p = node_alloc(m, line, pos, tok, MDOC_BLOCK); |
if (NULL == p) |
|
return(0); |
|
p->args = args; |
p->args = args; |
if (p->args) |
if (p->args) |
(args->refcnt)++; |
(args->refcnt)++; |
Line 528 mdoc_elem_alloc(struct mdoc *m, int line, int pos, |
|
Line 508 mdoc_elem_alloc(struct mdoc *m, int line, int pos, |
|
struct mdoc_node *p; |
struct mdoc_node *p; |
|
|
p = node_alloc(m, line, pos, tok, MDOC_ELEM); |
p = node_alloc(m, line, pos, tok, MDOC_ELEM); |
if (NULL == p) |
|
return(0); |
|
p->args = args; |
p->args = args; |
if (p->args) |
if (p->args) |
(args->refcnt)++; |
(args->refcnt)++; |
Line 547 pstring(struct mdoc *m, int line, int pos, const char |
|
Line 525 pstring(struct mdoc *m, int line, int pos, const char |
|
size_t sv; |
size_t sv; |
|
|
n = node_alloc(m, line, pos, -1, MDOC_TEXT); |
n = node_alloc(m, line, pos, -1, MDOC_TEXT); |
if (NULL == n) |
n->string = mandoc_malloc(len + 1); |
return(mdoc_nerr(m, m->last, EMALLOC)); |
|
|
|
n->string = malloc(len + 1); |
|
if (NULL == n->string) { |
|
free(n); |
|
return(mdoc_nerr(m, m->last, EMALLOC)); |
|
} |
|
|
|
sv = strlcpy(n->string, p, len + 1); |
sv = strlcpy(n->string, p, len + 1); |
|
|
/* Prohibit truncation. */ |
/* Prohibit truncation. */ |