=================================================================== RCS file: /cvs/pod2mdoc/pod2mdoc.c,v retrieving revision 1.29 retrieving revision 1.30 diff -u -p -r1.29 -r1.30 --- pod2mdoc/pod2mdoc.c 2014/07/11 20:45:55 1.29 +++ pod2mdoc/pod2mdoc.c 2014/07/15 19:00:48 1.30 @@ -1,4 +1,4 @@ -/* $Id: pod2mdoc.c,v 1.29 2014/07/11 20:45:55 schwarze Exp $ */ +/* $Id: pod2mdoc.c,v 1.30 2014/07/15 19:00:48 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * @@ -397,19 +397,12 @@ formatcode(struct state *st, const char *buf, size_t * /* * First, look up the format code. - * If it's not valid, then exit immediately. + * If it's not valid, treat it as a NOOP. */ for (fmt = 0; fmt < FMT__MAX; fmt++) if (buf[*start] == fmts[fmt]) break; - if (FMT__MAX == fmt) { - putchar(last = buf[(*start)++]); - if ('\\' == last) - putchar('e'); - return(0); - } - /* * Determine whether we're overriding our delimiter. * According to POD, if we have more than one '<' followed by a @@ -472,7 +465,7 @@ formatcode(struct state *st, const char *buf, size_t * * Check whether we're supposed to print macro stuff (this is * suppressed in, e.g., "Nm" and "Sh" macros). */ - if ( ! nomacro) { + if (FMT__MAX != fmt && !nomacro) { /* * Print out the macro describing this format code. * If we're not "reentrant" (not yet on a macro line) @@ -599,6 +592,9 @@ formatcode(struct state *st, const char *buf, size_t * (*start)++; } + if (FMT__MAX == fmt) + return(0); + if ( ! nomacro && FMT_CODE == fmt) printf(" Qc "); @@ -1095,18 +1091,12 @@ ordinary(struct state *st, const char *buf, size_t sta } if (start < end - 1 && '<' == buf[start + 1]) { - /* - * We've encountered a format code. - * This is going to trigger a macro no matter - * what, so print a newline now. - * Then print the (possibly nested) macros and - * following that, a newline. - * Consume all whitespace so we don't - * accidentally start an implicit literal line. - * If the macro ends with a flush comma or - * period, let mdoc(7) handle it for us. - */ if (formatcode(st, buf, &start, end, 0, 0, seq)) { + /* + * Let mdoc(7) handle trailing punctuation. + * XXX Some punctuation characters + * are not handled yet. + */ if ((start == end - 1 || (start < end - 1 && (' ' == buf[start + 1] || @@ -1116,7 +1106,13 @@ ordinary(struct state *st, const char *buf, size_t sta putchar(' '); putchar(buf[start++]); } + /* End the macro line. */ putchar(last = '\n'); + /* + * Consume all whitespace + * so we don't accidentally start + * an implicit literal line. + */ while (start < end && ' ' == buf[start]) start++; }