summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--man.c40
-rw-r--r--man.h2
-rw-r--r--mandocdb.c53
3 files changed, 49 insertions, 46 deletions
diff --git a/man.c b/man.c
index b456829b..88bce3f0 100644
--- a/man.c
+++ b/man.c
@@ -23,6 +23,7 @@
#include <sys/types.h>
#include <assert.h>
+#include <ctype.h>
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
@@ -706,3 +707,42 @@ man_mparse(const struct man *man)
assert(man && man->parse);
return(man->parse);
}
+
+void
+man_deroff(char **dest, const struct man_node *n)
+{
+ char *cp;
+ size_t sz;
+
+ if (MAN_TEXT != n->type) {
+ for (n = n->child; n; n = n->next)
+ man_deroff(dest, n);
+ return;
+ }
+
+ /* Skip leading whitespace. */
+
+ for (cp = n->string; '\0' != *cp; cp++)
+ if (0 == isspace((unsigned char)*cp))
+ break;
+
+ /* Skip trailing whitespace. */
+
+ for (sz = strlen(cp); sz; sz--)
+ if (0 == isspace((unsigned char)cp[sz-1]))
+ break;
+
+ /* Skip empty strings. */
+
+ if (0 == sz)
+ return;
+
+ if (NULL == *dest) {
+ *dest = mandoc_strndup(cp, sz);
+ return;
+ }
+
+ mandoc_asprintf(&cp, "%s %*s", *dest, (int)sz, cp);
+ free(*dest);
+ *dest = cp;
+}
diff --git a/man.h b/man.h
index a8bfcc5a..fa479cce 100644
--- a/man.h
+++ b/man.h
@@ -1,6 +1,7 @@
/* $Id$ */
/*
* Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
+ * Copyright (c) 2014 Ingo Schwarze <schwarze@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -111,6 +112,7 @@ struct man;
const struct man_node *man_node(const struct man *);
const struct man_meta *man_meta(const struct man *);
const struct mparse *man_mparse(const struct man *);
+void man_deroff(char **, const struct man_node *);
__END_DECLS
diff --git a/mandocdb.c b/mandocdb.c
index 3ffd851a..e2b73b84 100644
--- a/mandocdb.c
+++ b/mandocdb.c
@@ -1263,9 +1263,9 @@ static void
parse_man(struct mpage *mpage, const struct man_node *n)
{
const struct man_node *head, *body;
- char *start, *sv, *title;
+ char *start, *title;
char byte;
- size_t sz, titlesz;
+ size_t sz;
if (NULL == n)
return;
@@ -1285,11 +1285,7 @@ parse_man(struct mpage *mpage, const struct man_node *n)
NULL != (head = (head->child)) &&
MAN_TEXT == head->type &&
0 == strcmp(head->string, "NAME") &&
- NULL != (body = body->child) &&
- MAN_TEXT == body->type) {
-
- title = NULL;
- titlesz = 0;
+ NULL != body->child) {
/*
* Suck the entire NAME section into memory.
@@ -1298,47 +1294,11 @@ parse_man(struct mpage *mpage, const struct man_node *n)
* NAME sections over many lines.
*/
- for ( ; NULL != body; body = body->next) {
- if (MAN_TEXT != body->type)
- break;
- if (0 == (sz = strlen(body->string)))
- continue;
- title = mandoc_realloc
- (title, titlesz + sz + 1);
- memcpy(title + titlesz, body->string, sz);
- titlesz += sz + 1;
- title[titlesz - 1] = ' ';
- }
+ title = NULL;
+ man_deroff(&title, body);
if (NULL == title)
return;
- title = mandoc_realloc(title, titlesz + 1);
- title[titlesz] = '\0';
-
- /* Skip leading space. */
-
- sv = title;
- while (isspace((unsigned char)*sv))
- sv++;
-
- if (0 == (sz = strlen(sv))) {
- free(title);
- return;
- }
-
- /* Erase trailing space. */
-
- start = &sv[sz - 1];
- while (start > sv && isspace((unsigned char)*start))
- *start-- = '\0';
-
- if (start == sv) {
- free(title);
- return;
- }
-
- start = sv;
-
/*
* Go through a special heuristic dance here.
* Conventionally, one or more manual names are
@@ -1347,6 +1307,7 @@ parse_man(struct mpage *mpage, const struct man_node *n)
* the name parts here.
*/
+ start = title;
for ( ;; ) {
sz = strcspn(start, " ,");
if ('\0' == start[sz])
@@ -1377,7 +1338,7 @@ parse_man(struct mpage *mpage, const struct man_node *n)
start++;
}
- if (sv == start) {
+ if (start == title) {
putkey(mpage, start, TYPE_Nm);
free(title);
return;