=================================================================== RCS file: /cvs/mandoc/roff.c,v retrieving revision 1.48 retrieving revision 1.49 diff -u -p -r1.48 -r1.49 --- mandoc/roff.c 2008/12/07 14:38:57 1.48 +++ mandoc/roff.c 2008/12/07 16:41:04 1.49 @@ -1,4 +1,4 @@ -/* $Id: roff.c,v 1.48 2008/12/07 14:38:57 kristaps Exp $ */ +/* $Id: roff.c,v 1.49 2008/12/07 16:41:04 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -640,6 +640,13 @@ roffspecial(struct rofftree *tree, int tok, const char break; roff_err(tree, start, "invalid `At' arg"); return(0); + + case (ROFF_Fn): + if (0 != sz) + break; + roff_err(tree, start, "`%s' expects at least " + "one arg", toknames[tok]); + return(0); case (ROFF_Nm): if (0 == sz) { @@ -1201,9 +1208,11 @@ roff_ordered(ROFFCALL_ARGS) if ( ! roffparseopts(tree, tok, &argv, argcp, argvp)) return(0); - if (NULL == *argv) + if (NULL == *argv) { + ordp[0] = NULL; return(roffspecial(tree, tok, p, argcp, (const char **)argvp, 0, ordp)); + } i = 0; while (*argv && i < ROFF_MAXLINEARG) { @@ -1281,6 +1290,8 @@ roff_text(ROFFCALL_ARGS) * terminating punctuation. If we encounter it and all * subsequent tokens are punctuation, then stop processing (the * line-dominant macro will print these tokens after closure). + * If the punctuation is followed by non-punctuation, then close + * and re-open our scope, then continue. */ i = 0; @@ -1312,8 +1323,20 @@ roff_text(ROFFCALL_ARGS) break; if (argv[j]) { + if (ROFF_LSCOPE & tokens[tok].flags) { + if ( ! roffdata(tree, 0, *argv++)) + return(0); + continue; + } + if ( ! (*tree->cb.roffout)(tree->arg, tok)) + return(0); if ( ! roffdata(tree, 0, *argv++)) return(0); + if ( ! (*tree->cb.roffin)(tree->arg, tok, + argcp, argvp)) + return(0); + + i = 0; continue; }