version 1.56, 2008/12/09 19:57:26 |
version 1.60, 2008/12/10 12:09:47 |
|
|
ERR_PR_OOO, /* Prelude macro bad order. */ |
ERR_PR_OOO, /* Prelude macro bad order. */ |
ERR_PR_REP, /* Prelude macro repeated. */ |
ERR_PR_REP, /* Prelude macro repeated. */ |
ERR_NOT_PR, /* Not allowed in prelude. */ |
ERR_NOT_PR, /* Not allowed in prelude. */ |
WRN_SECORD, /* Sections out-of-order. */ |
WRN_SECORD /* Sections out-of-order. */ |
}; |
}; |
|
|
struct rofftree { |
struct rofftree { |
Line 70 struct rofftree { |
|
Line 70 struct rofftree { |
|
char os[64]; /* `Os' results. */ |
char os[64]; /* `Os' results. */ |
char title[64]; /* `Dt' results. */ |
char title[64]; /* `Dt' results. */ |
enum roffmsec section; |
enum roffmsec section; |
char volume[64]; /* `Dt' results. */ |
enum roffvol volume; |
int state; |
int state; |
#define ROFF_PRELUDE (1 << 1) /* In roff prelude. */ /* FIXME: put into asec. */ |
#define ROFF_PRELUDE (1 << 1) /* In roff prelude. */ /* FIXME: put into asec. */ |
#define ROFF_PRELUDE_Os (1 << 2) /* `Os' is parsed. */ |
#define ROFF_PRELUDE_Os (1 << 2) /* `Os' is parsed. */ |
Line 164 roff_free(struct rofftree *tree, int flush) |
|
Line 164 roff_free(struct rofftree *tree, int flush) |
|
goto end; |
goto end; |
} |
} |
|
|
if ( ! (*tree->cb.rofftail)(tree->arg)) |
if ( ! (*tree->cb.rofftail)(tree->arg, &tree->tm, |
|
tree->os, tree->title, |
|
tree->section, tree->volume)) |
goto end; |
goto end; |
|
|
error = 0; |
error = 0; |
Line 527 rofffindtok(const char *buf) |
|
Line 529 rofffindtok(const char *buf) |
|
static int |
static int |
roffchecksec(struct rofftree *tree, const char *start, int sec) |
roffchecksec(struct rofftree *tree, const char *start, int sec) |
{ |
{ |
int prior; |
|
|
|
switch (sec) { |
switch (sec) { |
case(ROFFSec_SYNOP): |
case(ROFFSec_SYNOP): |
if ((prior = ROFFSec_NAME) & tree->asec) |
if (ROFFSec_NAME & tree->asec) |
return(1); |
return(1); |
break; |
break; |
case(ROFFSec_DESC): |
case(ROFFSec_DESC): |
if ((prior = ROFFSec_SYNOP) & tree->asec) |
if (ROFFSec_SYNOP & tree->asec) |
return(1); |
return(1); |
break; |
break; |
case(ROFFSec_RETVAL): |
case(ROFFSec_RETVAL): |
if ((prior = ROFFSec_DESC) & tree->asec) |
if (ROFFSec_DESC & tree->asec) |
return(1); |
return(1); |
break; |
break; |
case(ROFFSec_ENV): |
case(ROFFSec_ENV): |
if ((prior = ROFFSec_RETVAL) & tree->asec) |
if (ROFFSec_RETVAL & tree->asec) |
return(1); |
return(1); |
break; |
break; |
case(ROFFSec_FILES): |
case(ROFFSec_FILES): |
if ((prior = ROFFSec_ENV) & tree->asec) |
if (ROFFSec_ENV & tree->asec) |
return(1); |
return(1); |
break; |
break; |
case(ROFFSec_EX): |
case(ROFFSec_EX): |
if ((prior = ROFFSec_FILES) & tree->asec) |
if (ROFFSec_FILES & tree->asec) |
return(1); |
return(1); |
break; |
break; |
case(ROFFSec_DIAG): |
case(ROFFSec_DIAG): |
if ((prior = ROFFSec_EX) & tree->asec) |
if (ROFFSec_EX & tree->asec) |
return(1); |
return(1); |
break; |
break; |
case(ROFFSec_ERRS): |
case(ROFFSec_ERRS): |
if ((prior = ROFFSec_DIAG) & tree->asec) |
if (ROFFSec_DIAG & tree->asec) |
return(1); |
return(1); |
break; |
break; |
case(ROFFSec_SEEALSO): |
case(ROFFSec_SEEALSO): |
if ((prior = ROFFSec_ERRS) & tree->asec) |
if (ROFFSec_ERRS & tree->asec) |
return(1); |
return(1); |
break; |
break; |
case(ROFFSec_STAND): |
case(ROFFSec_STAND): |
if ((prior = ROFFSec_SEEALSO) & tree->asec) |
if (ROFFSec_SEEALSO & tree->asec) |
return(1); |
return(1); |
break; |
break; |
case(ROFFSec_HIST): |
case(ROFFSec_HIST): |
if ((prior = ROFFSec_STAND) & tree->asec) |
if (ROFFSec_STAND & tree->asec) |
return(1); |
return(1); |
break; |
break; |
case(ROFFSec_AUTH): |
case(ROFFSec_AUTH): |
if ((prior = ROFFSec_HIST) & tree->asec) |
if (ROFFSec_HIST & tree->asec) |
return(1); |
return(1); |
break; |
break; |
case(ROFFSec_CAVEATS): |
case(ROFFSec_CAVEATS): |
if ((prior = ROFFSec_AUTH) & tree->asec) |
if (ROFFSec_AUTH & tree->asec) |
return(1); |
return(1); |
break; |
break; |
case(ROFFSec_BUGS): |
case(ROFFSec_BUGS): |
if ((prior = ROFFSec_CAVEATS) & tree->asec) |
if (ROFFSec_CAVEATS & tree->asec) |
return(1); |
return(1); |
break; |
break; |
default: |
default: |
Line 1022 roff_Dt(ROFFCALL_ARGS) |
|
Line 1023 roff_Dt(ROFFCALL_ARGS) |
|
return(roff_errp(tree, *argv, tok, ERR_BADARG)); |
return(roff_errp(tree, *argv, tok, ERR_BADARG)); |
|
|
argv++; |
argv++; |
sz = sizeof(tree->volume); |
|
|
|
if (NULL == *argv) { |
if (NULL == *argv) { |
tree->volume[0] = 0; |
switch (tree->section) { |
} else if (strlcpy(tree->volume, *argv, sz) >= sz) |
case(ROFF_MSEC_1): |
return(roff_errp(tree, *argv, tok, ERR_ARGLEN)); |
/* FALLTHROUGH */ |
|
case(ROFF_MSEC_6): |
|
/* FALLTHROUGH */ |
|
case(ROFF_MSEC_7): |
|
tree->volume = ROFF_VOL_URM; |
|
break; |
|
case(ROFF_MSEC_2): |
|
/* FALLTHROUGH */ |
|
case(ROFF_MSEC_3): |
|
/* FALLTHROUGH */ |
|
case(ROFF_MSEC_3p): |
|
/* FALLTHROUGH */ |
|
case(ROFF_MSEC_4): |
|
/* FALLTHROUGH */ |
|
case(ROFF_MSEC_5): |
|
tree->volume = ROFF_VOL_PRM; |
|
break; |
|
case(ROFF_MSEC_8): |
|
tree->volume = ROFF_VOL_PRM; |
|
break; |
|
case(ROFF_MSEC_9): |
|
tree->volume = ROFF_VOL_KM; |
|
break; |
|
case(ROFF_MSEC_UNASS): |
|
/* FALLTHROUGH */ |
|
case(ROFF_MSEC_DRAFT): |
|
/* FALLTHROUGH */ |
|
case(ROFF_MSEC_PAPER): |
|
tree->volume = ROFF_VOL_NONE; |
|
break; |
|
default: |
|
abort(); |
|
/* NOTREACHED */ |
|
} |
|
} else if (ROFF_VOL_MAX == (tree->volume = roff_vol(*argv))) |
|
return(roff_errp(tree, *argv, tok, ERR_BADARG)); |
|
|
assert(NULL == tree->last); |
assert(NULL == tree->last); |
tree->state |= ROFF_PRELUDE_Dt; |
tree->state |= ROFF_PRELUDE_Dt; |
|
|
roff_layout(ROFFCALL_ARGS) |
roff_layout(ROFFCALL_ARGS) |
{ |
{ |
int i, c, argcp[ROFF_MAXLINEARG]; |
int i, c, argcp[ROFF_MAXLINEARG]; |
char *argvp[ROFF_MAXLINEARG], *p; |
char *argvp[ROFF_MAXLINEARG]; |
|
|
/* |
/* |
* The roff_layout function is for multi-line macros. A layout |
* The roff_layout function is for multi-line macros. A layout |
Line 1180 roff_layout(ROFFCALL_ARGS) |
|
Line 1215 roff_layout(ROFFCALL_ARGS) |
|
return((*tree->cb.roffblkout)(tree->arg, tok)); |
return((*tree->cb.roffblkout)(tree->arg, tok)); |
} |
} |
|
|
|
argv++; |
assert( ! (ROFF_CALLABLE & tokens[tok].flags)); |
assert( ! (ROFF_CALLABLE & tokens[tok].flags)); |
|
|
p = *argv++; |
|
|
|
if ( ! roffparseopts(tree, tok, &argv, argcp, argvp)) |
if ( ! roffparseopts(tree, tok, &argv, argcp, argvp)) |
return(0); |
return(0); |