version 1.79, 2010/11/29 12:22:28 |
version 1.82, 2010/11/29 14:50:33 |
|
|
static int concat(struct mdoc *, char *, |
static int concat(struct mdoc *, char *, |
const struct mdoc_node *, size_t); |
const struct mdoc_node *, size_t); |
|
|
static int post_ar(POST_ARGS); |
|
static int post_at(POST_ARGS); |
|
static int post_bl(POST_ARGS); |
static int post_bl(POST_ARGS); |
static int post_bl_head(POST_ARGS); |
static int post_bl_head(POST_ARGS); |
static int post_bl_tagwidth(POST_ARGS); |
static int post_bl_tagwidth(POST_ARGS); |
Line 61 static int post_dd(POST_ARGS); |
|
Line 59 static int post_dd(POST_ARGS); |
|
static int post_display(POST_ARGS); |
static int post_display(POST_ARGS); |
static int post_dt(POST_ARGS); |
static int post_dt(POST_ARGS); |
static int post_lb(POST_ARGS); |
static int post_lb(POST_ARGS); |
static int post_li(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); |
static int post_pa(POST_ARGS); |
static int post_pa(POST_ARGS); |
static int post_prol(POST_ARGS); |
static int post_prol(POST_ARGS); |
static int post_sh(POST_ARGS); |
|
static int post_st(POST_ARGS); |
static int post_st(POST_ARGS); |
static int post_std(POST_ARGS); |
static int post_std(POST_ARGS); |
|
|
Line 78 static const struct actions mdoc_actions[MDOC_MAX] = { |
|
Line 74 static const struct actions mdoc_actions[MDOC_MAX] = { |
|
{ NULL, post_dd }, /* Dd */ |
{ NULL, post_dd }, /* Dd */ |
{ NULL, post_dt }, /* Dt */ |
{ NULL, post_dt }, /* Dt */ |
{ NULL, post_os }, /* Os */ |
{ NULL, post_os }, /* Os */ |
{ NULL, post_sh }, /* Sh */ |
{ NULL, NULL }, /* Sh */ |
{ NULL, NULL }, /* Ss */ |
{ NULL, NULL }, /* Ss */ |
{ NULL, NULL }, /* Pp */ |
{ NULL, NULL }, /* Pp */ |
{ NULL, NULL }, /* D1 */ |
{ NULL, NULL }, /* D1 */ |
Line 90 static const struct actions mdoc_actions[MDOC_MAX] = { |
|
Line 86 static const struct actions mdoc_actions[MDOC_MAX] = { |
|
{ NULL, NULL }, /* It */ |
{ NULL, NULL }, /* It */ |
{ NULL, NULL }, /* Ad */ |
{ NULL, NULL }, /* Ad */ |
{ NULL, NULL }, /* An */ |
{ NULL, NULL }, /* An */ |
{ NULL, post_ar }, /* Ar */ |
{ NULL, NULL }, /* Ar */ |
{ NULL, NULL }, /* Cd */ |
{ NULL, NULL }, /* Cd */ |
{ NULL, NULL }, /* Cm */ |
{ NULL, NULL }, /* Cm */ |
{ NULL, NULL }, /* Dv */ |
{ NULL, NULL }, /* Dv */ |
Line 104 static const struct actions mdoc_actions[MDOC_MAX] = { |
|
Line 100 static const struct actions mdoc_actions[MDOC_MAX] = { |
|
{ NULL, NULL }, /* Ft */ |
{ NULL, NULL }, /* Ft */ |
{ NULL, NULL }, /* Ic */ |
{ NULL, NULL }, /* Ic */ |
{ NULL, NULL }, /* In */ |
{ NULL, NULL }, /* In */ |
{ NULL, post_li }, /* Li */ |
{ NULL, NULL }, /* Li */ |
{ NULL, NULL }, /* Nd */ |
{ NULL, NULL }, /* Nd */ |
{ NULL, post_nm }, /* Nm */ |
{ NULL, post_nm }, /* Nm */ |
{ NULL, NULL }, /* Op */ |
{ NULL, NULL }, /* Op */ |
Line 129 static const struct actions mdoc_actions[MDOC_MAX] = { |
|
Line 125 static const struct actions mdoc_actions[MDOC_MAX] = { |
|
{ NULL, NULL }, /* Ac */ |
{ NULL, NULL }, /* Ac */ |
{ NULL, NULL }, /* Ao */ |
{ NULL, NULL }, /* Ao */ |
{ NULL, NULL }, /* Aq */ |
{ NULL, NULL }, /* Aq */ |
{ NULL, post_at }, /* At */ |
{ NULL, NULL }, /* At */ |
{ NULL, NULL }, /* Bc */ |
{ NULL, NULL }, /* Bc */ |
{ NULL, NULL }, /* Bf */ |
{ NULL, NULL }, /* Bf */ |
{ NULL, NULL }, /* Bo */ |
{ NULL, NULL }, /* Bo */ |
Line 390 post_st(POST_ARGS) |
|
Line 386 post_st(POST_ARGS) |
|
|
|
|
|
/* |
/* |
* Look up the standard string in a table. We know that it exists from |
|
* the validation phase, so assert on failure. If a standard key wasn't |
|
* supplied, supply the default ``AT&T UNIX''. |
|
*/ |
|
static int |
|
post_at(POST_ARGS) |
|
{ |
|
struct mdoc_node *nn; |
|
const char *p, *q; |
|
char *buf; |
|
size_t sz; |
|
|
|
if (n->child) { |
|
assert(MDOC_TEXT == n->child->type); |
|
p = mdoc_a2att(n->child->string); |
|
if (p) { |
|
free(n->child->string); |
|
n->child->string = mandoc_strdup(p); |
|
} else { |
|
p = "AT&T UNIX "; |
|
q = n->child->string; |
|
sz = strlen(p) + strlen(q) + 1; |
|
buf = mandoc_malloc(sz); |
|
strlcpy(buf, p, sz); |
|
strlcat(buf, q, sz); |
|
free(n->child->string); |
|
n->child->string = buf; |
|
} |
|
return(1); |
|
} |
|
|
|
nn = n; |
|
m->next = MDOC_NEXT_CHILD; |
|
if ( ! mdoc_word_alloc(m, nn->line, nn->pos, "AT&T UNIX")) |
|
return(0); |
|
m->last = nn; |
|
return(1); |
|
} |
|
|
|
|
|
/* |
|
* Mark the current section. The ``named'' section (lastnamed) is set |
|
* whenever the current section isn't a custom section--we use this to |
|
* keep track of section ordering. Also check that the section is |
|
* allowed within the document's manual section. |
|
*/ |
|
static int |
|
post_sh(POST_ARGS) |
|
{ |
|
enum mdoc_sec sec; |
|
char buf[BUFSIZ]; |
|
|
|
if (MDOC_HEAD != n->type) |
|
return(1); |
|
|
|
if ( ! concat(m, buf, n->child, BUFSIZ)) |
|
return(0); |
|
sec = mdoc_str2sec(buf); |
|
/* |
|
* The first section should always make us move into a non-new |
|
* state. |
|
*/ |
|
if (SEC_NONE == m->lastnamed || SEC_CUSTOM != sec) |
|
m->lastnamed = sec; |
|
|
|
/* |
|
* Switch the parser's SYNOPSIS mode, to be copied |
|
* into individual nodes when creating them. |
|
* Note that this mode can also be set and unset |
|
* using the roff nS register. |
|
*/ |
|
if (SEC_SYNOPSIS == sec) |
|
m->flags |= MDOC_SYNOPSIS; |
|
else |
|
m->flags &= ~MDOC_SYNOPSIS; |
|
|
|
/* Some sections only live in certain manual sections. */ |
|
|
|
switch ((m->lastsec = sec)) { |
|
case (SEC_RETURN_VALUES): |
|
/* FALLTHROUGH */ |
|
case (SEC_ERRORS): |
|
assert(m->meta.msec); |
|
if (*m->meta.msec == '2') |
|
break; |
|
if (*m->meta.msec == '3') |
|
break; |
|
if (*m->meta.msec == '9') |
|
break; |
|
return(mdoc_nmsg(m, n, MANDOCERR_SECMSEC)); |
|
default: |
|
break; |
|
} |
|
return(1); |
|
} |
|
|
|
|
|
/* |
|
* Parse out the contents of `Dt'. See in-line documentation for how we |
* Parse out the contents of `Dt'. See in-line documentation for how we |
* handle the various fields of this macro. |
* handle the various fields of this macro. |
*/ |
*/ |
Line 850 post_pa(POST_ARGS) |
|
Line 748 post_pa(POST_ARGS) |
|
np = n; |
np = n; |
m->next = MDOC_NEXT_CHILD; |
m->next = MDOC_NEXT_CHILD; |
if ( ! mdoc_word_alloc(m, n->line, n->pos, "~")) |
if ( ! mdoc_word_alloc(m, n->line, n->pos, "~")) |
return(0); |
|
m->last = np; |
|
return(1); |
|
} |
|
|
|
|
|
/* |
|
* Empty `Li' macros get an empty string to make front-ends add an extra |
|
* space. |
|
*/ |
|
static int |
|
post_li(POST_ARGS) |
|
{ |
|
struct mdoc_node *np; |
|
|
|
if (n->child) |
|
return(1); |
|
|
|
np = n; |
|
m->next = MDOC_NEXT_CHILD; |
|
if ( ! mdoc_word_alloc(m, n->line, n->pos, "")) |
|
return(0); |
|
m->last = np; |
|
return(1); |
|
} |
|
|
|
|
|
/* |
|
* The `Ar' macro defaults to two strings "file ..." if no value is |
|
* provided as an argument. |
|
*/ |
|
static int |
|
post_ar(POST_ARGS) |
|
{ |
|
struct mdoc_node *np; |
|
|
|
if (n->child) |
|
return(1); |
|
|
|
np = n; |
|
m->next = MDOC_NEXT_CHILD; |
|
/* XXX: make into macro values. */ |
|
if ( ! mdoc_word_alloc(m, n->line, n->pos, "file")) |
|
return(0); |
|
if ( ! mdoc_word_alloc(m, n->line, n->pos, "...")) |
|
return(0); |
return(0); |
m->last = np; |
m->last = np; |
return(1); |
return(1); |