=================================================================== RCS file: /cvs/pod2mdoc/pod2mdoc.c,v retrieving revision 1.41 retrieving revision 1.42 diff -u -p -r1.41 -r1.42 --- pod2mdoc/pod2mdoc.c 2015/02/13 18:44:04 1.41 +++ pod2mdoc/pod2mdoc.c 2015/02/14 10:35:02 1.42 @@ -1,4 +1,4 @@ -/* $Id: pod2mdoc.c,v 1.41 2015/02/13 18:44:04 schwarze Exp $ */ +/* $Id: pod2mdoc.c,v 1.42 2015/02/14 10:35:02 schwarze Exp $ */ /* * Copyright (c) 2014 Kristaps Dzonsons * Copyright (c) 2014, 2015 Ingo Schwarze @@ -135,7 +135,7 @@ static const char fmts[FMT__MAX] = { 'Z' /* FMT_NULL */ }; -static int last; +static unsigned char last; static void @@ -1395,35 +1395,53 @@ ordinary(struct state *st, const char *buf, size_t sta &start, end, &opstack)) continue; - /* - * On whitespace, flush the output buffer - * and allow breaking to a macro line. - * Otherwise, merely buffer text. - */ + /* Merely buffer non-whitespace. */ last = buf[start++]; - if (' ' != last) { + if ( ! isspace(last)) { outbuf_addchar(st); continue; } - if ( ! strcmp(st->outbuf + st->outbuflen - 2, "()") && + /* Detect function names. */ + + if (st->outbuflen > 2 && + ')' == st->outbuf[st->outbuflen - 1] && + '(' == st->outbuf[st->outbuflen - 2] && dict_get(st->outbuf, st->outbuflen - 2) == MDOC_Fo) { st->outbuflen -= 2; st->outbuf[st->outbuflen] = '\0'; mdoc_newln(st); fputs(".Fn ", stdout); - outbuf_flush(st); - mdoc_newln(st); - continue; + st->oust = OUST_MAC; } + /* + * On whitespace, flush the output buffer + * and allow breaking to a macro line. + */ + outbuf_flush(st); - if (OUST_MAC == st->oust) + + /* + * End macro lines, and + * 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]))) mdoc_newln(st); - else - st->wantws = 1; + + /* Advance to the next word. */ + + while (isspace((unsigned char)buf[start])) + start++; + st->wantws = 1; } if (start < end - 1 && '<' == buf[start + 1] &&