version 1.44, 2009/03/20 15:14:01 |
version 1.50, 2009/03/23 14:22:11 |
|
|
#include <stdlib.h> |
#include <stdlib.h> |
#include <string.h> |
#include <string.h> |
|
|
#include "private.h" |
#include "libmdoc.h" |
|
|
/* |
/* |
* Actions are executed on macros after they've been post-validated: in |
* Actions are executed on macros after they've been post-validated: in |
|
|
* children have been filled in (post-fix order). |
* children have been filled in (post-fix order). |
*/ |
*/ |
|
|
enum merr { |
|
ENOWIDTH |
|
}; |
|
|
|
enum mwarn { |
enum mwarn { |
WBADSEC, |
WBADSEC, |
WNOWIDTH, |
WNOWIDTH, |
|
|
}; |
}; |
|
|
static int pwarn(struct mdoc *, int, int, enum mwarn); |
static int pwarn(struct mdoc *, int, int, enum mwarn); |
static int perr(struct mdoc *, int, int, enum merr); |
|
|
|
static int post_ar(POST_ARGS); |
static int post_ar(POST_ARGS); |
static int post_bl(POST_ARGS); |
static int post_bl(POST_ARGS); |
static int post_bl_width(POST_ARGS); |
static int post_bl_width(POST_ARGS); |
static int post_bl_tagwidth(POST_ARGS); |
static int post_bl_tagwidth(POST_ARGS); |
static int post_display(POST_ARGS); |
|
static int post_dd(POST_ARGS); |
static int post_dd(POST_ARGS); |
|
static int post_display(POST_ARGS); |
static int post_dt(POST_ARGS); |
static int post_dt(POST_ARGS); |
static int post_nm(POST_ARGS); |
static int post_nm(POST_ARGS); |
static int post_os(POST_ARGS); |
static int post_os(POST_ARGS); |
Line 66 static int post_prol(POST_ARGS); |
|
Line 61 static int post_prol(POST_ARGS); |
|
static int post_sh(POST_ARGS); |
static int post_sh(POST_ARGS); |
static int post_std(POST_ARGS); |
static int post_std(POST_ARGS); |
|
|
static int pre_display(PRE_ARGS); |
static int pre_bd(PRE_ARGS); |
|
static int pre_dl(PRE_ARGS); |
|
|
#define merr(m, t) perr((m), (m)->last->line, (m)->last->pos, (t)) |
|
#define mwarn(m, t) pwarn((m), (m)->last->line, (m)->last->pos, (t)) |
#define mwarn(m, t) pwarn((m), (m)->last->line, (m)->last->pos, (t)) |
|
|
const struct actions mdoc_actions[MDOC_MAX] = { |
const struct actions mdoc_actions[MDOC_MAX] = { |
Line 80 const struct actions mdoc_actions[MDOC_MAX] = { |
|
Line 75 const struct actions mdoc_actions[MDOC_MAX] = { |
|
{ NULL, NULL }, /* Ss */ |
{ NULL, NULL }, /* Ss */ |
{ NULL, NULL }, /* Pp */ |
{ NULL, NULL }, /* Pp */ |
{ NULL, NULL }, /* D1 */ |
{ NULL, NULL }, /* D1 */ |
{ pre_display, post_display }, /* Dl */ |
{ pre_dl, post_display }, /* Dl */ |
{ pre_display, post_display }, /* Bd */ |
{ pre_bd, post_display }, /* Bd */ |
{ NULL, NULL }, /* Ed */ |
{ NULL, NULL }, /* Ed */ |
{ NULL, post_bl }, /* Bl */ |
{ NULL, post_bl }, /* Bl */ |
{ NULL, NULL }, /* El */ |
{ NULL, NULL }, /* El */ |
Line 190 const struct actions mdoc_actions[MDOC_MAX] = { |
|
Line 185 const struct actions mdoc_actions[MDOC_MAX] = { |
|
{ NULL, NULL }, /* Es */ |
{ NULL, NULL }, /* Es */ |
{ NULL, NULL }, /* En */ |
{ NULL, NULL }, /* En */ |
{ NULL, NULL }, /* Dx */ |
{ NULL, NULL }, /* Dx */ |
|
{ NULL, NULL }, /* %Q */ |
}; |
}; |
|
|
|
|
Line 234 mdoc_action_post(struct mdoc *m) |
|
Line 230 mdoc_action_post(struct mdoc *m) |
|
|
|
|
|
static int |
static int |
perr(struct mdoc *m, int line, int pos, enum merr type) |
|
{ |
|
char *p; |
|
|
|
p = NULL; |
|
|
|
switch (type) { |
|
case (ENOWIDTH): |
|
p = "missing width argument"; |
|
break; |
|
} |
|
|
|
assert(p); |
|
return(mdoc_perr(m, line, pos, p)); |
|
} |
|
|
|
|
|
static int |
|
pwarn(struct mdoc *m, int line, int pos, enum mwarn type) |
pwarn(struct mdoc *m, int line, int pos, enum mwarn type) |
{ |
{ |
char *p; |
char *p; |
Line 294 post_std(POST_ARGS) |
|
Line 272 post_std(POST_ARGS) |
|
|
|
assert(m->meta.name); |
assert(m->meta.name); |
|
|
m->last->args->argv[0].value = xcalloc(1, sizeof(char *)); |
m->last->args->argv[0].value = calloc(1, sizeof(char *)); |
|
if (NULL == m->last->args->argv[0].value) |
|
err(1, "calloc"); |
|
|
m->last->args->argv[0].sz = 1; |
m->last->args->argv[0].sz = 1; |
m->last->args->argv[0].value[0] = xstrdup(m->meta.name); |
m->last->args->argv[0].value[0] = xstrdup(m->meta.name); |
return(1); |
return(1); |
Line 403 post_dt(POST_ARGS) |
|
Line 384 post_dt(POST_ARGS) |
|
* arch = NULL |
* arch = NULL |
*/ |
*/ |
|
|
if ((cp = mdoc_a2msec(n->string))) { |
cp = mdoc_a2msec(n->string); |
|
if (cp) { |
m->meta.vol = xstrdup(cp); |
m->meta.vol = xstrdup(cp); |
errno = 0; |
errno = 0; |
lval = strtol(n->string, &ep, 10); |
lval = strtol(n->string, &ep, 10); |
Line 422 post_dt(POST_ARGS) |
|
Line 404 post_dt(POST_ARGS) |
|
* VOL |
* VOL |
*/ |
*/ |
|
|
if ((cp = mdoc_a2vol(n->string))) { |
cp = mdoc_a2vol(n->string); |
|
if (cp) { |
free(m->meta.vol); |
free(m->meta.vol); |
m->meta.vol = xstrdup(cp); |
m->meta.vol = xstrdup(cp); |
n = n->next; |
n = n->next; |
Line 467 post_os(POST_ARGS) |
|
Line 450 post_os(POST_ARGS) |
|
} |
} |
|
|
|
|
|
/* |
|
* Calculate the -width for a `Bl -tag' list if it hasn't been provided. |
|
* Uses the first head macro. |
|
*/ |
static int |
static int |
post_bl_tagwidth(struct mdoc *m) |
post_bl_tagwidth(struct mdoc *m) |
{ |
{ |
Line 475 post_bl_tagwidth(struct mdoc *m) |
|
Line 462 post_bl_tagwidth(struct mdoc *m) |
|
char buf[32]; |
char buf[32]; |
|
|
/* |
/* |
* If -tag has been specified and -width has not been, then try |
|
* to intuit our width from the first body element. |
|
*/ |
|
|
|
if (NULL == (n = m->last->body->child)) |
|
return(1); |
|
|
|
/* |
|
* Use the text width, if a text node, or the default macro |
* Use the text width, if a text node, or the default macro |
* width if a macro. |
* width if a macro. |
*/ |
*/ |
|
|
if ((n = n->head->child)) { |
n = m->last->head->child; |
|
sz = 10; /* Default size. */ |
|
|
|
if (n) { |
if (MDOC_TEXT != n->type) { |
if (MDOC_TEXT != n->type) { |
if (0 == (sz = (int)mdoc_macro2len(n->tok))) |
if (0 == (sz = (int)mdoc_macro2len(n->tok))) |
sz = -1; |
if ( ! mwarn(m, WNOWIDTH)) |
|
return(0); |
} else |
} else |
sz = (int)strlen(n->string) + 1; |
sz = (int)strlen(n->string) + 1; |
} else |
} |
sz = -1; |
|
|
|
if (-1 == sz) { |
|
if ( ! mwarn(m, WNOWIDTH)) |
|
return(0); |
|
sz = 10; |
|
} |
|
|
|
(void)snprintf(buf, sizeof(buf), "%dn", sz); |
(void)snprintf(buf, sizeof(buf), "%dn", sz); |
|
|
/* |
/* |
Line 509 post_bl_tagwidth(struct mdoc *m) |
|
Line 485 post_bl_tagwidth(struct mdoc *m) |
|
* We're guaranteed that a MDOC_Width doesn't already exist. |
* We're guaranteed that a MDOC_Width doesn't already exist. |
*/ |
*/ |
|
|
if (NULL == m->last->args) { |
|
m->last->args = xcalloc |
|
(1, sizeof(struct mdoc_arg)); |
|
m->last->args->refcnt = 1; |
|
} |
|
|
|
n = m->last; |
n = m->last; |
sz = (int)n->args->argc; |
assert(n->args); |
|
|
(n->args->argc)++; |
|
|
|
|
(n->args->argc)++; |
n->args->argv = xrealloc(n->args->argv, |
n->args->argv = xrealloc(n->args->argv, |
n->args->argc * sizeof(struct mdoc_arg)); |
n->args->argc * sizeof(struct mdoc_argv)); |
|
|
n->args->argv[sz - 1].arg = MDOC_Width; |
n->args->argv[n->args->argc - 1].arg = MDOC_Width; |
n->args->argv[sz - 1].line = m->last->line; |
n->args->argv[n->args->argc - 1].line = m->last->line; |
n->args->argv[sz - 1].pos = m->last->pos; |
n->args->argv[n->args->argc - 1].pos = m->last->pos; |
n->args->argv[sz - 1].sz = 1; |
n->args->argv[n->args->argc - 1].sz = 1; |
n->args->argv[sz - 1].value = xcalloc(1, sizeof(char *)); |
n->args->argv[n->args->argc - 1].value = calloc(1, sizeof(char *)); |
n->args->argv[sz - 1].value[0] = xstrdup(buf); |
if (NULL == n->args->argv[n->args->argc - 1].value) |
|
err(1, "calloc"); |
|
n->args->argv[n->args->argc - 1].value[0] = xstrdup(buf); |
|
|
return(1); |
return(1); |
} |
} |
Line 543 post_bl_width(struct mdoc *m) |
|
Line 514 post_bl_width(struct mdoc *m) |
|
char *p; |
char *p; |
|
|
if (NULL == m->last->args) |
if (NULL == m->last->args) |
return(merr(m, ENOWIDTH)); |
return(1); |
|
|
for (i = 0; i < (int)m->last->args->argc; i++) |
for (i = 0; i < (int)m->last->args->argc; i++) |
if (MDOC_Width == m->last->args->argv[i].arg) |
if (MDOC_Width == m->last->args->argv[i].arg) |
break; |
break; |
|
|
if (i == (int)m->last->args->argc) |
if (i == (int)m->last->args->argc) |
return(merr(m, ENOWIDTH)); |
return(1); |
|
|
p = m->last->args->argv[i].value[0]; |
p = m->last->args->argv[i].value[0]; |
|
|
Line 686 post_prol(POST_ARGS) |
|
Line 657 post_prol(POST_ARGS) |
|
|
|
|
|
static int |
static int |
pre_display(PRE_ARGS) |
pre_dl(PRE_ARGS) |
{ |
{ |
|
|
|
if (MDOC_BODY != n->type) |
|
return(1); |
|
m->flags |= MDOC_LITERAL; |
|
return(1); |
|
} |
|
|
|
|
|
static int |
|
pre_bd(PRE_ARGS) |
|
{ |
int i; |
int i; |
|
|
if (MDOC_BODY != n->type) |
if (MDOC_BODY != n->type) |
Line 699 pre_display(PRE_ARGS) |
|
Line 681 pre_display(PRE_ARGS) |
|
*/ |
*/ |
|
|
n = n->parent; |
n = n->parent; |
|
|
for (i = 0; i < (int)n->args->argc; i++) |
for (i = 0; i < (int)n->args->argc; i++) |
if (MDOC_Literal == n->args->argv[i].arg) |
if (MDOC_Literal == n->args->argv[i].arg) |
break; |
break; |