version 1.15, 2009/07/12 21:08:29 |
version 1.16, 2009/07/12 21:45:44 |
|
|
static int parsetext(struct mdoc *, int, char *); |
static int parsetext(struct mdoc *, int, char *); |
static int parsemacro(struct mdoc *, int, char *); |
static int parsemacro(struct mdoc *, int, char *); |
static int macrowarn(struct mdoc *, int, const char *); |
static int macrowarn(struct mdoc *, int, const char *); |
static int perr(struct mdoc *, int, int, enum merr); |
|
|
|
|
|
const struct mdoc_node * |
const struct mdoc_node * |
mdoc_node(const struct mdoc *m) |
mdoc_node(const struct mdoc *m) |
{ |
{ |
|
|
|
|
if (iserr) |
if (iserr) |
return(mdoc_verr(m, line, pos, p)); |
return(mdoc_verr(m, line, pos, p)); |
|
|
return(mdoc_vwarn(m, line, pos, p)); |
return(mdoc_vwarn(m, line, pos, p)); |
} |
} |
|
|
|
|
} |
} |
|
|
int |
int |
mdoc_perr(struct mdoc *mdoc, int line, int pos, const char *fmt, ...) |
|
{ |
|
char buf[256]; |
|
va_list ap; |
|
|
|
if (NULL == mdoc->cb.mdoc_err) |
|
return(0); |
|
|
|
va_start(ap, fmt); |
|
(void)vsnprintf(buf, sizeof(buf) - 1, fmt, ap); |
|
va_end(ap); |
|
return((*mdoc->cb.mdoc_err)(mdoc->data, line, pos, buf)); |
|
} |
|
|
|
|
|
int |
|
mdoc_macro(struct mdoc *m, int tok, |
mdoc_macro(struct mdoc *m, int tok, |
int ln, int pp, int *pos, char *buf) |
int ln, int pp, int *pos, char *buf) |
{ |
{ |
|
|
if (MDOC_PROLOGUE & mdoc_macros[tok].flags && |
if (MDOC_PROLOGUE & mdoc_macros[tok].flags && |
MDOC_PBODY & m->flags) |
MDOC_PBODY & m->flags) |
return(perr(m, ln, pp, EPROLBODY)); |
return(mdoc_perr(m, ln, pp, EPROLBODY)); |
if ( ! (MDOC_PROLOGUE & mdoc_macros[tok].flags) && |
if ( ! (MDOC_PROLOGUE & mdoc_macros[tok].flags) && |
! (MDOC_PBODY & m->flags)) |
! (MDOC_PBODY & m->flags)) |
return(perr(m, ln, pp, EBODYPROL)); |
return(mdoc_perr(m, ln, pp, EBODYPROL)); |
|
|
if (1 != pp && ! (MDOC_CALLABLE & mdoc_macros[tok].flags)) |
if (1 != pp && ! (MDOC_CALLABLE & mdoc_macros[tok].flags)) |
return(perr(m, ln, pp, ENOCALL)); |
return(mdoc_perr(m, ln, pp, ENOCALL)); |
|
|
return((*mdoc_macros[tok].fp)(m, tok, ln, pp, pos, buf)); |
return((*mdoc_macros[tok].fp)(m, tok, ln, pp, pos, buf)); |
} |
} |
|
|
|
|
static int |
static int |
perr(struct mdoc *m, int line, int pos, enum merr type) |
|
{ |
|
char *p; |
|
|
|
p = NULL; |
|
switch (type) { |
|
case (ENOCALL): |
|
p = "not callable"; |
|
break; |
|
case (EPROLBODY): |
|
p = "macro disallowed in document body"; |
|
break; |
|
case (EBODYPROL): |
|
p = "macro disallowed in document prologue"; |
|
break; |
|
case (EMALLOC): |
|
p = "memory exhausted"; |
|
break; |
|
case (ETEXTPROL): |
|
p = "text disallowed in document prologue"; |
|
break; |
|
case (ENOBLANK): |
|
p = "blank lines disallowed in non-literal contexts"; |
|
break; |
|
case (ESPACE): |
|
p = "whitespace disallowed after delimiter"; |
|
break; |
|
} |
|
assert(p); |
|
return(mdoc_perr(m, line, pos, p)); |
|
} |
|
|
|
|
|
static int |
|
node_append(struct mdoc *mdoc, struct mdoc_node *p) |
node_append(struct mdoc *mdoc, struct mdoc_node *p) |
{ |
{ |
|
|
|
|
{ |
{ |
|
|
if (SEC_NONE == m->lastnamed) |
if (SEC_NONE == m->lastnamed) |
return(perr(m, line, 0, ETEXTPROL)); |
return(mdoc_perr(m, line, 0, ETEXTPROL)); |
|
|
if (0 == buf[0] && ! (MDOC_LITERAL & m->flags)) |
if (0 == buf[0] && ! (MDOC_LITERAL & m->flags)) |
return(perr(m, line, 0, ENOBLANK)); |
return(mdoc_perr(m, line, 0, ENOBLANK)); |
|
|
if ( ! mdoc_word_alloc(m, line, 0, buf)) |
if ( ! mdoc_word_alloc(m, line, 0, buf)) |
return(0); |
return(0); |
|
|
i++; |
i++; |
if (0 == buf[i]) |
if (0 == buf[i]) |
return(1); |
return(1); |
return(perr(m, ln, 1, ESPACE)); |
return(mdoc_perr(m, ln, 1, ESPACE)); |
} |
} |
|
|
/* Copy the first word into a nil-terminated buffer. */ |
/* Copy the first word into a nil-terminated buffer. */ |