diff options
author | Kristaps Dzonsons <kristaps@bsd.lv> | 2011-12-31 18:47:52 +0000 |
---|---|---|
committer | Kristaps Dzonsons <kristaps@bsd.lv> | 2011-12-31 18:47:52 +0000 |
commit | bf6e3f75fa4e2decf43c5157cdb9d823d482de85 (patch) | |
tree | af2589ebecde6c9ae256276a3b0ffa6850607b12 /mandocdb.c | |
parent | 9ce737999e4dfba3414d61dcd62441d7eb9b21cd (diff) | |
download | mandoc-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.c | 58 |
1 files changed, 43 insertions, 15 deletions
@@ -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 |