-/* $Id: man.c,v 1.58 2010/03/29 04:52:14 kristaps Exp $ */
+/* $Id: man.c,v 1.60 2010/04/08 07:53:01 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
"invalid nesting of roff declarations", /* WROFFNEST */
"scope in roff instructions broken", /* WROFFSCOPE */
"document title should be uppercase", /* WTITLECASE */
+ "deprecated comment style", /* WBADCOMMENT */
};
const char *const __man_macronames[MAN_MAX] = {
int i, j;
char sv;
+ /* Ignore bogus comments. */
+
+ if ('\\' == buf[0] && '.' == buf[1] && '\"' == buf[2])
+ return(man_pwarn(m, line, 0, WBADCOMMENT));
+
/* Literal free-form text whitespace is preserved. */
if (MAN_LITERAL & m->flags) {
/* Comments and empties are quickly ignored. */
- if (MAN_BLINE & m->flags)
- m->flags |= MAN_BPLINE;
-
if ('\0' == buf[1])
return(1);
* Remove prior ELINE macro, as it's being clobbering by a new
* macro. Note that NSCOPED macros do not close out ELINE
* macros---they don't print text---so we let those slip by.
+ * NOTE: we don't allow roff blocks (NOCLOSE) to be embedded
+ * here because that would stipulate blocks as children of
+ * elements!
*/
if ( ! (MAN_NSCOPED & man_macros[tok].flags) &&
m->flags &= ~MAN_ELINE;
}
- /* Begin recursive parse sequence. */
+ /*
+ * Save the fact that we're in the next-line for a block. In
+ * this way, embedded roff instructions can "remember" state
+ * when they exit.
+ */
+
+ if (MAN_BLINE & m->flags)
+ m->flags |= MAN_BPLINE;
+
+ /* Call to handler... */
assert(man_macros[tok].fp);
-
if ( ! (*man_macros[tok].fp)(m, tok, ln, ppos, &i, buf))
goto err;
/*
* We weren't in a block-line scope when entering the
* above-parsed macro, so return.
- *
- * FIXME: this prohibits the nesting of blocks (e.g., `de' and
- * family) within BLINE or ELINE systems. This is annoying.
*/
if ( ! (MAN_BPLINE & m->flags)) {