diff options
author | Kristaps Dzonsons <kristaps@bsd.lv> | 2011-12-08 09:19:13 +0000 |
---|---|---|
committer | Kristaps Dzonsons <kristaps@bsd.lv> | 2011-12-08 09:19:13 +0000 |
commit | 524e89a4c20ecf2405bc891d7e147fb2bd10ddc8 (patch) | |
tree | 14494e87dd8a0a47f8b63d8dedecece55cb774f2 /mandocdb.c | |
parent | 937031525e4adf2b90ee570da9bb4152ebbb864c (diff) | |
download | mandoc-524e89a4c20ecf2405bc891d7e147fb2bd10ddc8.tar.gz |
Clean up grok of preformatted manual description.
(1) put fclose() at the end, as line isn't valid afterward (see fgetln())
(2) clean up loops to be more readable to my old eyes
(3) mandate trailing newline, nul-terminate, and use strrchr
Diffstat (limited to 'mandocdb.c')
-rw-r--r-- | mandocdb.c | 63 |
1 files changed, 35 insertions, 28 deletions
@@ -1288,52 +1288,59 @@ pformatted(DB *hash, struct buf *buf, struct buf *dbuf, buf_append(buf, of->title); hash_put(hash, buf, TYPE_Nm); - while (NULL != (line = fgetln(stream, &len)) && '\n' != *line) - /* Skip to first blank line. */ ; + /* Skip to first blank line. */ - while (NULL != (line = fgetln(stream, &len)) && - ('\n' == *line || ' ' == *line)) - /* Skip to first section header. */ ; + while (NULL != (line = fgetln(stream, &len))) + if (len && '\n' == *line) + break; + + /* + * Skip to first section header. + * This happens when text is flush-left. + */ + + while (NULL != (line = fgetln(stream, &len))) + if (len && '\n' != *line && ' ' != *line) + break; /* - * If no page content can be found, - * reuse the page title as the page description. + * If no page content can be found or the input line is + * malformed (zer-length or has no trailing newline), reuse the + * page title as the page description. */ - if (NULL == (line = fgetln(stream, &len))) { + line = fgetln(stream, &len); + if (NULL == line || len == 0 || '\n' != line[(int)len - 1]) { buf_appendb(dbuf, buf->cp, buf->size); hash_put(hash, buf, TYPE_Nd); fclose(stream); return; } - fclose(stream); - /* - * If there is a dash, skip to the text following it. + line[(int)--len] = '\0'; + + /* + * Skip to the last dash. + * Use the remaining line as the description (no more than 70 + * bytes). */ - for (p = line, plen = len; plen; p++, plen--) - if ('-' == *p) - break; - for ( ; plen; p++, plen--) - if ('-' != *p && ' ' != *p && 8 != *p) - break; - if (0 == plen) { + if (NULL != (p = strrchr(line, '-'))) { + for (++p; ' ' == *p || '\b' == *p; p++) + /* Skip to next word. */ ; + } else p = line; - plen = len; - } - /* - * Copy the rest of the line, but no more than 70 bytes. - */ - - if (70 < plen) + if ((plen = strlen(p)) > 70) { plen = 70; - p[plen-1] = '\0'; - buf_appendb(dbuf, p, plen); + p[plen] = '\0'; + } + + buf_appendb(dbuf, p, plen + 1); buf->len = 0; - buf_appendb(buf, p, plen); + buf_appendb(buf, p, plen + 1); hash_put(hash, buf, TYPE_Nd); + fclose(stream); } static void |