version 1.29, 2009/01/14 11:58:24 |
version 1.31, 2009/01/15 17:38:57 |
Line 288 mdoc_parseln(struct mdoc *mdoc, int line, char *buf) |
|
Line 288 mdoc_parseln(struct mdoc *mdoc, int line, char *buf) |
|
mdoc->next = MDOC_NEXT_SIBLING; |
mdoc->next = MDOC_NEXT_SIBLING; |
return(1); |
return(1); |
} |
} |
return(mdoc_perr(mdoc, line, 0, ERR_SYNTAX_NOTEXT)); |
return(mdoc_perr(mdoc, line, 0, "text disallowed")); |
} |
} |
|
|
if (buf[1] && '\\' == buf[1]) |
if (buf[1] && '\\' == buf[1]) |
Line 301 mdoc_parseln(struct mdoc *mdoc, int line, char *buf) |
|
Line 301 mdoc_parseln(struct mdoc *mdoc, int line, char *buf) |
|
|
|
if (i == (int)sizeof(tmp)) { |
if (i == (int)sizeof(tmp)) { |
mdoc->flags |= MDOC_HALT; |
mdoc->flags |= MDOC_HALT; |
return(mdoc_perr(mdoc, line, 1, ERR_MACRO_NOTSUP)); |
return(mdoc_perr(mdoc, line, 1, "unknown macro")); |
} else if (i <= 2) { |
} else if (i <= 2) { |
mdoc->flags |= MDOC_HALT; |
mdoc->flags |= MDOC_HALT; |
return(mdoc_perr(mdoc, line, 1, ERR_MACRO_NOTSUP)); |
return(mdoc_perr(mdoc, line, 1, "unknown macro")); |
} |
} |
|
|
i--; |
i--; |
Line 314 mdoc_parseln(struct mdoc *mdoc, int line, char *buf) |
|
Line 314 mdoc_parseln(struct mdoc *mdoc, int line, char *buf) |
|
|
|
if (MDOC_MAX == (c = mdoc_find(mdoc, tmp))) { |
if (MDOC_MAX == (c = mdoc_find(mdoc, tmp))) { |
mdoc->flags |= MDOC_HALT; |
mdoc->flags |= MDOC_HALT; |
return(mdoc_perr(mdoc, line, 1, ERR_MACRO_NOTSUP)); |
return(mdoc_perr(mdoc, line, 1, "unknown macro")); |
} |
} |
|
|
while (buf[i] && isspace(buf[i])) |
while (buf[i] && isspace(buf[i])) |
Line 329 mdoc_parseln(struct mdoc *mdoc, int line, char *buf) |
|
Line 329 mdoc_parseln(struct mdoc *mdoc, int line, char *buf) |
|
|
|
|
|
void |
void |
mdoc_msg(struct mdoc *mdoc, const char *fmt, ...) |
mdoc_vmsg(struct mdoc *mdoc, int ln, int pos, const char *fmt, ...) |
{ |
{ |
struct mdoc_node *n; |
|
va_list ap; |
|
char buf[256]; |
char buf[256]; |
|
va_list ap; |
|
|
if (NULL == mdoc->cb.mdoc_msg) |
if (NULL == mdoc->cb.mdoc_msg) |
return; |
return; |
|
|
n = mdoc->last; |
|
assert(n); |
|
|
|
va_start(ap, fmt); |
va_start(ap, fmt); |
(void)vsnprintf(buf, sizeof(buf), fmt, ap); |
(void)vsnprintf(buf, sizeof(buf) - 1, fmt, ap); |
va_end(ap); |
va_end(ap); |
|
(*mdoc->cb.mdoc_msg)(mdoc->data, ln, pos, buf); |
(*mdoc->cb.mdoc_msg)(mdoc->data, n->line, n->pos, buf); |
|
} |
} |
|
|
|
|
int |
int |
mdoc_perr(struct mdoc *mdoc, |
mdoc_verr(struct mdoc *mdoc, int ln, int pos, |
int line, int pos, enum mdoc_err type) |
const char *fmt, ...) |
{ |
{ |
|
char buf[256]; |
|
va_list ap; |
|
|
if (NULL == mdoc->cb.mdoc_err) |
if (NULL == mdoc->cb.mdoc_err) |
return(0); |
return(0); |
return((*mdoc->cb.mdoc_err)(mdoc->data, line, pos, type)); |
|
|
va_start(ap, fmt); |
|
(void)vsnprintf(buf, sizeof(buf) - 1, fmt, ap); |
|
va_end(ap); |
|
return((*mdoc->cb.mdoc_err)(mdoc->data, ln, pos, buf)); |
} |
} |
|
|
|
|
int |
int |
mdoc_pwarn(struct mdoc *mdoc, |
mdoc_vwarn(struct mdoc *mdoc, int ln, int pos, |
int line, int pos, enum mdoc_warn type) |
enum mdoc_warn type, const char *fmt, ...) |
{ |
{ |
|
char buf[256]; |
|
va_list ap; |
|
|
if (NULL == mdoc->cb.mdoc_warn) |
if (NULL == mdoc->cb.mdoc_warn) |
return(0); |
return(0); |
return((*mdoc->cb.mdoc_warn)(mdoc->data, line, pos, type)); |
|
|
va_start(ap, fmt); |
|
(void)vsnprintf(buf, sizeof(buf) - 1, fmt, ap); |
|
va_end(ap); |
|
return((*mdoc->cb.mdoc_warn)(mdoc->data, ln, pos, type, buf)); |
} |
} |
|
|
|
|
Line 376 mdoc_macro(struct mdoc *mdoc, int tok, |
|
Line 383 mdoc_macro(struct mdoc *mdoc, int tok, |
|
int ln, int ppos, int *pos, char *buf) |
int ln, int ppos, int *pos, char *buf) |
{ |
{ |
|
|
|
assert(mdoc_macros[tok].fp); |
|
|
if ( ! (MDOC_PROLOGUE & mdoc_macros[tok].flags) && |
if ( ! (MDOC_PROLOGUE & mdoc_macros[tok].flags) && |
SEC_PROLOGUE == mdoc->sec_lastn) |
SEC_PROLOGUE == mdoc->sec_lastn) |
return(mdoc_perr(mdoc, ln, ppos, ERR_SEC_PROLOGUE)); |
return(mdoc_perr(mdoc, ln, ppos, "macro disallowed in document prologue")); |
|
|
if (NULL == (mdoc_macros[tok].fp)) |
|
return(mdoc_perr(mdoc, ln, ppos, ERR_MACRO_NOTSUP)); |
|
|
|
if (1 != ppos && ! (MDOC_CALLABLE & mdoc_macros[tok].flags)) |
if (1 != ppos && ! (MDOC_CALLABLE & mdoc_macros[tok].flags)) |
return(mdoc_perr(mdoc, ln, ppos, ERR_MACRO_NOTCALL)); |
return(mdoc_perr(mdoc, ln, ppos, "macro not callable")); |
|
|
return((*mdoc_macros[tok].fp)(mdoc, tok, ln, ppos, pos, buf)); |
return((*mdoc_macros[tok].fp)(mdoc, tok, ln, ppos, pos, buf)); |
} |
} |
|
|
Line 393 mdoc_macro(struct mdoc *mdoc, int tok, |
|
Line 397 mdoc_macro(struct mdoc *mdoc, int tok, |
|
static int |
static int |
mdoc_node_append(struct mdoc *mdoc, struct mdoc_node *p) |
mdoc_node_append(struct mdoc *mdoc, struct mdoc_node *p) |
{ |
{ |
const char *on, *ot, *act; |
const char *nn, *nt, *on, *ot, *act; |
|
|
assert(mdoc->last); |
assert(mdoc->last); |
assert(mdoc->first); |
assert(mdoc->first); |
Line 406 mdoc_node_append(struct mdoc *mdoc, struct mdoc_node * |
|
Line 410 mdoc_node_append(struct mdoc *mdoc, struct mdoc_node * |
|
else |
else |
on = mdoc_macronames[mdoc->last->tok]; |
on = mdoc_macronames[mdoc->last->tok]; |
|
|
/* FIXME: put this into util.c. */ |
if (MDOC_TEXT == p->type) |
switch (mdoc->last->type) { |
nn = "<text>"; |
case (MDOC_TEXT): |
else if (MDOC_ROOT == p->type) |
ot = "text"; |
nn = "<root>"; |
break; |
else |
case (MDOC_BODY): |
nn = mdoc_macronames[p->tok]; |
ot = "body"; |
|
break; |
|
case (MDOC_ELEM): |
|
ot = "elem"; |
|
break; |
|
case (MDOC_HEAD): |
|
ot = "head"; |
|
break; |
|
case (MDOC_TAIL): |
|
ot = "tail"; |
|
break; |
|
case (MDOC_BLOCK): |
|
ot = "block"; |
|
break; |
|
case (MDOC_ROOT): |
|
ot = "root"; |
|
break; |
|
default: |
|
abort(); |
|
/* NOTREACHED */ |
|
} |
|
|
|
|
ot = mdoc_type2a(mdoc->last->type); |
|
nt = mdoc_type2a(p->type); |
|
|
switch (mdoc->next) { |
switch (mdoc->next) { |
case (MDOC_NEXT_SIBLING): |
case (MDOC_NEXT_SIBLING): |
mdoc->last->next = p; |
mdoc->last->next = p; |
Line 474 mdoc_node_append(struct mdoc *mdoc, struct mdoc_node * |
|
Line 460 mdoc_node_append(struct mdoc *mdoc, struct mdoc_node * |
|
} |
} |
|
|
mdoc->last = p; |
mdoc->last = p; |
mdoc_msg(mdoc, "parse: %s of %s `%s'", act, ot, on); |
mdoc_msg(mdoc, "parse: %s `%s' %s of %s `%s'", |
|
nt, nn, act, ot, on); |
return(1); |
return(1); |
} |
} |
|
|