summaryrefslogtreecommitdiffstats
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
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
-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