=================================================================== RCS file: /cvs/pod2mdoc/pod2mdoc.c,v retrieving revision 1.35 retrieving revision 1.36 diff -u -p -r1.35 -r1.36 --- pod2mdoc/pod2mdoc.c 2014/10/22 23:10:05 1.35 +++ pod2mdoc/pod2mdoc.c 2014/10/24 00:28:34 1.36 @@ -1,4 +1,4 @@ -/* $Id: pod2mdoc.c,v 1.35 2014/10/22 23:10:05 schwarze Exp $ */ +/* $Id: pod2mdoc.c,v 1.36 2014/10/24 00:28:34 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * @@ -1010,8 +1010,9 @@ command(struct state *st, const char *buf, size_t star static void verbatim(struct state *st, char *buf, size_t start, size_t end) { - size_t i, ift, ifo, ifa, ifc; + size_t i, ift, ifo, ifa, ifc, inl; char *cp; + int nopen; if ( ! st->parsing || st->paused || start == end) return; @@ -1052,18 +1053,51 @@ again: /* Parse function declaration. */ ifo = ifa = ifc = 0; - for (ift = i; i < end && buf[i] != '\n'; i++) { - if (ifa) { - if (buf[i] == ')') + inl = end; + nopen = 0; + for (ift = i; i < end; i++) { + if (ifc) { + if (buf[i] != '\n') + continue; + inl = i; + break; + } + switch (buf[i]) { + case ' ': + if ( ! ifa) + ifo = i; + break; + case '(': + if (ifo) { + nopen++; + if ( ! ifa) + ifa = i; + } else + i = end; + break; + case ')': + switch (nopen) { + case 0: + i = end; + break; + case 1: ifc = i; - } else if (ifo && buf[i] == '(') - ifa = i; - else if (buf[i] == ' ') - ifo = i; + break; + default: + nopen--; + break; + } + break; + default: + break; + } } /* Encode function declaration. */ if (ifc) { + for (i = ifa; i < ifc; i++) + if (buf[i] == '\n') + buf[i] = ' '; buf[ifo++] = '\0'; printf(".Ft %s", buf + ift); if (buf[ifo] == '*') { @@ -1077,20 +1111,22 @@ again: for (;;) { cp = strchr(buf + ifa, ','); if (cp != NULL) - *cp = '\0'; + *cp++ = '\0'; printf(".Fa \"%s\"\n", buf + ifa); if (cp == NULL) break; - ifa = cp - buf + 1; + while (*cp == ' ') + cp++; + ifa = cp - buf; } puts(".Fc"); if (buf[ifc] == ';') ifc++; - if (ifc < i) { - buf[i] = '\0'; + if (ifc < inl) { + buf[inl] = '\0'; puts(buf + ifc); } - start = i + 1; + start = inl + 1; if (start < end) goto again; return;