=================================================================== RCS file: /cvs/pod2mdoc/pod2mdoc.c,v retrieving revision 1.43 retrieving revision 1.44 diff -u -p -r1.43 -r1.44 --- pod2mdoc/pod2mdoc.c 2015/02/14 11:12:48 1.43 +++ pod2mdoc/pod2mdoc.c 2015/02/14 12:47:09 1.44 @@ -1,4 +1,4 @@ -/* $Id: pod2mdoc.c,v 1.43 2015/02/14 11:12:48 schwarze Exp $ */ +/* $Id: pod2mdoc.c,v 1.44 2015/02/14 12:47:09 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2014, 2015 Ingo Schwarze @@ -1328,9 +1328,9 @@ donamenm(struct state *st, const char *buf, size_t *st static void ordinary(struct state *st, const char *buf, size_t start, size_t end) { - size_t i, j, opstack; + size_t i, j, opstack, wend; enum mdoc_type mtype; - int seq; + int eos, noeos, seq; if ( ! st->parsing || st->paused) return; @@ -1399,22 +1399,46 @@ ordinary(struct state *st, const char *buf, size_t sta /* Merely buffer non-whitespace. */ last = buf[start++]; - if ( ! isspace(last)) { + if ( ! isspace(last)) outbuf_addchar(st); + if (start < end && + ! isspace((unsigned char)buf[start])) continue; - } - /* Detect function names. */ + /* + * Found the end of a word. + * Rewind trailing delimiters. + */ + eos = noeos = 0; + for (wend = st->outbuflen; wend; wend--) + if ('.' == st->outbuf[wend - 1] || + '!' == st->outbuf[wend - 1] || + '?' == st->outbuf[wend - 1]) + eos = 1; + else if ('|' == st->outbuf[wend - 1] || + ',' == st->outbuf[wend - 1] || + ';' == st->outbuf[wend - 1] || + ':' == st->outbuf[wend - 1]) + noeos = 1; + else if ('\'' != st->outbuf[wend - 1] && + '"' != st->outbuf[wend - 1] && + ')' != st->outbuf[wend - 1] && + ']' != st->outbuf[wend - 1]) + break; + eos &= ! noeos; + + /* + * Detect function names. + */ + mtype = MDOC_Fa; - if (st->outbuflen > 2 && - ')' == st->outbuf[st->outbuflen - 1] && - '(' == st->outbuf[st->outbuflen - 2]) { - mtype = dict_get(st->outbuf, - st->outbuflen - 2); + if (wend && ')' == st->outbuf[wend] && + '(' == st->outbuf[wend - 1]) { + mtype = dict_get(st->outbuf, --wend); if (MDOC_Fo == mtype || MDOC_MAX == mtype) { - st->outbuflen -= 2; - st->outbuf[st->outbuflen] = '\0'; + st->outbuflen = wend; + st->outbuf[wend] = '\0'; mdoc_newln(st); if (MDOC_Fo == mtype) fputs(".Fn ", stdout); @@ -1436,20 +1460,23 @@ ordinary(struct state *st, const char *buf, size_t sta * end text lines at the end of sentences. */ - if (OUST_MAC == st->oust || (start > 3 && - ('.' == buf[start - 2] || - '!' == buf[start - 2] || - '?' == buf[start - 2]) && - islower((unsigned char)buf[start - 3]) && - islower((unsigned char)buf[start - 4]))) { + if (OUST_MAC == st->oust || (eos && wend > 1 && + islower((unsigned char)st->outbuf[wend - 1]))) { if (MDOC_MAX == mtype) fputs(" 3", stdout); + if (MDOC_Fa != mtype) + for (wend += 2; + '\0' != st->outbuf[wend]; + wend++) + printf(" %c", + st->outbuf[wend]); mdoc_newln(st); } /* Advance to the next word. */ - while (isspace((unsigned char)buf[start])) + while ('\n' != buf[start] && + isspace((unsigned char)buf[start])) start++; st->wantws = 1; }