=================================================================== RCS file: /cvs/mandoc/roff.c,v retrieving revision 1.55 retrieving revision 1.59 diff -u -p -r1.55 -r1.59 --- mandoc/roff.c 2008/12/09 17:09:12 1.55 +++ mandoc/roff.c 2008/12/10 12:05:33 1.59 @@ -1,4 +1,4 @@ -/* $Id: roff.c,v 1.55 2008/12/09 17:09:12 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; @@ -704,7 +706,7 @@ roffspecial(struct rofftree *tree, int tok, const char case (ROFF_At): if (0 == sz) break; - if (ROFF_ATT_MAX == roff_att(*ordp)) + if (ROFF_ATT_MAX != roff_att(*ordp)) break; return(roff_errp(tree, *ordp, tok, ERR_BADARG)); @@ -938,11 +940,11 @@ roff_Dd(ROFFCALL_ARGS) /* * This is a bit complex because there are many forms the date - * can be in: it can be simply $Mdocdate: December 9 2008 $, $Mdocdate $, + * can be in: it can be simply $Mdocdate: December 10 2008 $, $Mdocdate $, * or a raw date. Process accordingly. */ - if (0 == strcmp(*argv, "$Mdocdate: December 9 2008 $")) { + if (0 == strcmp(*argv, "$Mdocdate: December 10 2008 $")) { t = time(NULL); if (NULL == localtime_r(&t, &tree->tm)) err(1, "localtime_r"); @@ -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; @@ -1154,7 +1190,7 @@ static int roff_layout(ROFFCALL_ARGS) { 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 @@ -1180,9 +1216,8 @@ roff_layout(ROFFCALL_ARGS) return((*tree->cb.roffblkout)(tree->arg, tok)); } + argv++; assert( ! (ROFF_CALLABLE & tokens[tok].flags)); - - p = *argv++; if ( ! roffparseopts(tree, tok, &argv, argcp, argvp)) return(0);