version 1.124, 2010/11/29 13:12:24 |
version 1.125, 2010/11/29 13:51:03 |
Line 1544 post_sh_body(POST_ARGS) |
|
Line 1544 post_sh_body(POST_ARGS) |
|
static int |
static int |
post_sh_head(POST_ARGS) |
post_sh_head(POST_ARGS) |
{ |
{ |
char buf[BUFSIZ]; |
char buf[BUFSIZ]; |
enum mdoc_sec sec; |
enum mdoc_sec sec; |
const struct mdoc_node *n; |
struct mdoc_node *n; |
|
|
/* |
/* |
* Process a new section. Sections are either "named" or |
* Process a new section. Sections are either "named" or |
* "custom"; custom sections are user-defined, while named ones |
* "custom". Custom sections are user-defined, while named ones |
* usually follow a conventional order and may only appear in |
* follow a conventional order and may only appear in certain |
* certain manual sections. |
* manual sections. |
*/ |
*/ |
|
|
buf[0] = '\0'; |
buf[0] = '\0'; |
|
|
/* |
/* FIXME: use dynamic buffer... */ |
* FIXME: yes, these can use a dynamic buffer, but I don't do so |
|
* in the interests of simplicity. |
|
*/ |
|
|
|
for (n = mdoc->last->child; n; n = n->next) { |
for (n = mdoc->last->child; n; n = n->next) { |
/* XXX - copied from compact(). */ |
/* XXX - copied from concat(). */ |
assert(MDOC_TEXT == n->type); |
assert(MDOC_TEXT == n->type); |
|
|
if (strlcat(buf, n->string, BUFSIZ) >= BUFSIZ) { |
if (strlcat(buf, n->string, BUFSIZ) >= BUFSIZ) { |
mdoc_nmsg(mdoc, n, MANDOCERR_MEM); |
mdoc_nmsg(mdoc, n, MANDOCERR_MEM); |
return(0); |
return(0); |
} |
} |
|
|
if (NULL == n->next) |
if (NULL == n->next) |
continue; |
continue; |
|
|
if (strlcat(buf, " ", BUFSIZ) >= BUFSIZ) { |
if (strlcat(buf, " ", BUFSIZ) >= BUFSIZ) { |
mdoc_nmsg(mdoc, n, MANDOCERR_MEM); |
mdoc_nmsg(mdoc, n, MANDOCERR_MEM); |
return(0); |
return(0); |
Line 1580 post_sh_head(POST_ARGS) |
|
Line 1579 post_sh_head(POST_ARGS) |
|
|
|
sec = mdoc_str2sec(buf); |
sec = mdoc_str2sec(buf); |
|
|
/* |
/* The NAME should be first. */ |
* Check: NAME should always be first, CUSTOM has no roles, |
|
* non-CUSTOM has a conventional order to be followed. |
|
*/ |
|
|
|
if (SEC_NAME != sec && SEC_NONE == mdoc->lastnamed) |
if (SEC_NAME != sec && SEC_NONE == mdoc->lastnamed) |
if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NAMESECFIRST)) |
mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NAMESECFIRST); |
return(0); |
|
|
|
|
/* The SYNOPSIS gets special attention in other areas. */ |
|
|
|
if (SEC_SYNOPSIS == sec) |
|
mdoc->flags |= MDOC_SYNOPSIS; |
|
else |
|
mdoc->flags &= ~MDOC_SYNOPSIS; |
|
|
|
/* Mark our last section. */ |
|
|
|
mdoc->lastsec = sec; |
|
|
|
/* We don't care about custom sections after this. */ |
|
|
if (SEC_CUSTOM == sec) |
if (SEC_CUSTOM == sec) |
return(1); |
return(1); |
|
|
|
/* |
|
* Check whether our non-custom section is being repeated or is |
|
* out of order. |
|
*/ |
|
|
if (sec == mdoc->lastnamed) |
if (sec == mdoc->lastnamed) |
if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_SECREP)) |
mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_SECREP); |
return(0); |
|
|
|
if (sec < mdoc->lastnamed) |
if (sec < mdoc->lastnamed) |
if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_SECOOO)) |
mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_SECOOO); |
return(0); |
|
|
|
/* |
/* Mark the last named section. */ |
* Check particular section/manual conventions. LIBRARY can |
|
* only occur in manual section 2, 3, and 9. |
|
*/ |
|
|
|
|
mdoc->lastnamed = sec; |
|
|
|
/* Check particular section/manual conventions. */ |
|
|
|
assert(mdoc->meta.msec); |
|
|
switch (sec) { |
switch (sec) { |
|
case (SEC_RETURN_VALUES): |
|
/* FALLTHROUGH */ |
|
case (SEC_ERRORS): |
|
/* FALLTHROUGH */ |
case (SEC_LIBRARY): |
case (SEC_LIBRARY): |
assert(mdoc->meta.msec); |
|
if (*mdoc->meta.msec == '2') |
if (*mdoc->meta.msec == '2') |
break; |
break; |
if (*mdoc->meta.msec == '3') |
if (*mdoc->meta.msec == '3') |
break; |
break; |
if (*mdoc->meta.msec == '9') |
if (*mdoc->meta.msec == '9') |
break; |
break; |
return(mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_SECMSEC)); |
mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_SECMSEC); |
|
break; |
default: |
default: |
break; |
break; |
} |
} |