summaryrefslogtreecommitdiffstats
path: root/mandocdb.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2011-12-08 09:19:13 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2011-12-08 09:19:13 +0000
commit524e89a4c20ecf2405bc891d7e147fb2bd10ddc8 (patch)
tree14494e87dd8a0a47f8b63d8dedecece55cb774f2 /mandocdb.c
parent937031525e4adf2b90ee570da9bb4152ebbb864c (diff)
downloadmandoc-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.c63
1 files changed, 35 insertions, 28 deletions
diff --git a/mandocdb.c b/mandocdb.c
index f95ff686..64e85414 100644
--- a/mandocdb.c
+++ b/mandocdb.c
@@ -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