summaryrefslogtreecommitdiffstats
path: root/mandocdb.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2011-12-31 18:47:52 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2011-12-31 18:47:52 +0000
commitbf6e3f75fa4e2decf43c5157cdb9d823d482de85 (patch)
treeaf2589ebecde6c9ae256276a3b0ffa6850607b12 /mandocdb.c
parent9ce737999e4dfba3414d61dcd62441d7eb9b21cd (diff)
downloadmandoc-bf6e3f75fa4e2decf43c5157cdb9d823d482de85.tar.gz
When parsing catpages, read from the first section (NAME, we hope) until
the next section. Also, remove the limit of 72 characters and enforce this, instead in the apropos frontend.
Diffstat (limited to 'mandocdb.c')
-rw-r--r--mandocdb.c58
1 files changed, 43 insertions, 15 deletions
diff --git a/mandocdb.c b/mandocdb.c
index ff75b7d1..44d69877 100644
--- a/mandocdb.c
+++ b/mandocdb.c
@@ -23,6 +23,7 @@
#include <sys/types.h>
#include <assert.h>
+#include <ctype.h>
#include <dirent.h>
#include <fcntl.h>
#include <getopt.h>
@@ -129,8 +130,8 @@ static void ofile_argbuild(int, char *[], struct of **);
static void ofile_dirbuild(const char *, const char *,
const char *, int, struct of **);
static void ofile_free(struct of *);
-static void pformatted(DB *, struct buf *, struct buf *,
- const struct of *);
+static void pformatted(DB *, struct buf *,
+ struct buf *, const struct of *);
static int pman_node(MAN_ARGS);
static void pmdoc_node(MDOC_ARGS);
static int pmdoc_head(MDOC_ARGS);
@@ -1334,6 +1335,8 @@ pman_node(MAN_ARGS)
if (0 == strncmp(start, "-", 1))
start += 1;
+ else if (0 == strncmp(start, "\\-\\-", 4))
+ start += 4;
else if (0 == strncmp(start, "\\-", 2))
start += 2;
else if (0 == strncmp(start, "\\(en", 4))
@@ -1364,12 +1367,12 @@ pman_node(MAN_ARGS)
* By necessity, this involves rather crude guesswork.
*/
static void
-pformatted(DB *hash, struct buf *buf, struct buf *dbuf,
- const struct of *of)
+pformatted(DB *hash, struct buf *buf,
+ struct buf *dbuf, const struct of *of)
{
FILE *stream;
- char *line, *p;
- size_t len, plen;
+ char *line, *p, *title;
+ size_t len, plen, titlesz;
if (NULL == (stream = fopen(of->fname, "r"))) {
if (warnings)
@@ -1402,6 +1405,32 @@ pformatted(DB *hash, struct buf *buf, struct buf *dbuf,
while (NULL != (line = fgetln(stream, &len)))
if ('\n' != *line && ' ' != *line)
break;
+
+ /*
+ * Read up until the next section into a buffer.
+ * Strip the leading and trailing newline from each read line,
+ * appending a trailing space.
+ * Ignore empty (whitespace-only) lines.
+ */
+
+ titlesz = 0;
+ title = NULL;
+
+ while (NULL != (line = fgetln(stream, &len))) {
+ if (' ' != *line || '\n' != line[(int)len - 1])
+ break;
+ while (len > 0 && isspace((unsigned char)*line)) {
+ line++;
+ len--;
+ }
+ if (1 == len)
+ continue;
+ title = mandoc_realloc(title, titlesz + len);
+ memcpy(title + titlesz, line, len);
+ titlesz += len;
+ title[(int)titlesz - 1] = ' ';
+ }
+
/*
* If no page content can be found, or the input line
@@ -1410,18 +1439,19 @@ pformatted(DB *hash, struct buf *buf, struct buf *dbuf,
* description.
*/
- line = fgetln(stream, &len);
- if (NULL == line || ' ' != *line || '\n' != line[(int)len - 1]) {
+ if (NULL == title || '\0' == *title) {
if (warnings)
fprintf(stderr, "%s: cannot find NAME section\n",
of->fname);
buf_appendb(dbuf, buf->cp, buf->size);
hash_put(hash, buf, TYPE_Nd);
fclose(stream);
+ free(title);
return;
}
- line[(int)--len] = '\0';
+ title = mandoc_realloc(title, titlesz + 1);
+ title[(int)titlesz] = '\0';
/*
* Skip to the first dash.
@@ -1429,20 +1459,17 @@ pformatted(DB *hash, struct buf *buf, struct buf *dbuf,
* bytes).
*/
- if (NULL != (p = strstr(line, "- "))) {
+ if (NULL != (p = strstr(title, "- "))) {
for (p += 2; ' ' == *p || '\b' == *p; p++)
/* Skip to next word. */ ;
} else {
if (warnings)
fprintf(stderr, "%s: no dash in title line\n",
of->fname);
- p = line;
+ p = title;
}
- if ((plen = strlen(p)) > 70) {
- plen = 70;
- p[plen] = '\0';
- }
+ plen = strlen(p);
/* Strip backspace-encoding from line. */
@@ -1461,6 +1488,7 @@ pformatted(DB *hash, struct buf *buf, struct buf *dbuf,
buf_appendb(buf, p, plen + 1);
hash_put(hash, buf, TYPE_Nd);
fclose(stream);
+ free(title);
}
static void