=================================================================== RCS file: /cvs/mandoc/roff.c,v retrieving revision 1.57 retrieving revision 1.59 diff -u -p -r1.57 -r1.59 --- mandoc/roff.c 2008/12/10 00:52:46 1.57 +++ mandoc/roff.c 2008/12/10 12:05:33 1.59 @@ -1,4 +1,4 @@ -/* $Id: roff.c,v 1.57 2008/12/10 00:52:46 kristaps Exp $ */ +/* $Id: roff.c,v 1.59 2008/12/10 12:05:33 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -70,7 +70,7 @@ struct rofftree { char os[64]; /* `Os' results. */ char title[64]; /* `Dt' results. */ enum roffmsec section; - char volume[64]; /* `Dt' results. */ + enum roffvol volume; int state; #define ROFF_PRELUDE (1 << 1) /* In roff prelude. */ /* FIXME: put into asec. */ #define ROFF_PRELUDE_Os (1 << 2) /* `Os' is parsed. */ @@ -164,7 +164,9 @@ roff_free(struct rofftree *tree, int flush) 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; error = 0; @@ -1022,12 +1024,46 @@ roff_Dt(ROFFCALL_ARGS) return(roff_errp(tree, *argv, tok, ERR_BADARG)); argv++; - sz = sizeof(tree->volume); if (NULL == *argv) { - tree->volume[0] = 0; - } else if (strlcpy(tree->volume, *argv, sz) >= sz) - return(roff_errp(tree, *argv, tok, ERR_ARGLEN)); + switch (tree->section) { + case(ROFF_MSEC_1): + /* 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); tree->state |= ROFF_PRELUDE_Dt;