-/* $Id: makewhatis.c,v 1.13 2011/07/01 10:17:24 kristaps Exp $ */
+/* $Id: makewhatis.c,v 1.14 2011/07/01 10:46:32 kristaps Exp $ */
/*
* Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
*
const struct mdoc_meta *m
static void buf_appendmdoc(struct buf *,
- const struct mdoc_node *);
+ const struct mdoc_node *, int);
static void buf_append(struct buf *, const char *);
static void buf_appendb(struct buf *,
const void *, size_t);
* This is optimised for general mdoc nodes in this context, which do
* not consist of subexpressions and having a recursive call for n->next
* would be wasteful.
+ * The "f" variable should be 0 unless called from pmdoc_Nd for the
+ * description buffer, which does not start at the beginning of the
+ * buffer.
*/
static void
-buf_appendmdoc(struct buf *buf, const struct mdoc_node *n)
+buf_appendmdoc(struct buf *buf, const struct mdoc_node *n, int f)
{
for ( ; n; n = n->next) {
if (n->child)
- buf_appendmdoc(buf, n->child);
- if (MDOC_TEXT == n->type)
+ buf_appendmdoc(buf, n->child, f);
+
+ if (MDOC_TEXT == n->type && f) {
+ f = 0;
+ buf_appendb(buf, n->string,
+ strlen(n->string) + 1);
+ } else if (MDOC_TEXT == n->type)
buf_append(buf, n->string);
+
}
}
if (SEC_AUTHORS != n->sec)
return;
- buf_appendmdoc(buf, n->child);
+ buf_appendmdoc(buf, n->child, 0);
hash_put(hash, buf, TYPE_AUTHOR);
}
if (SEC_SYNOPSIS != n->sec)
return;
- buf_appendmdoc(buf, n->child);
+ buf_appendmdoc(buf, n->child, 0);
hash_put(hash, buf, TYPE_CONFIG);
}
static void
pmdoc_Nd(MDOC_ARGS)
{
- size_t sz;
if (MDOC_BODY != n->type)
return;
- else if (NULL == (n = n->child))
- return;
-
- /* FIXME: don't assume this. */
- assert(MDOC_TEXT == n->type);
- sz = strlen(n->string) + 1;
- buf_appendb(dbuf, n->string, sz);
- buf_appendb(buf, n->string, sz);
-
- buf_appendmdoc(dbuf, n->next);
- buf_appendmdoc(buf, n->next);
+ buf_appendmdoc(dbuf, n->child, 1);
+ buf_appendmdoc(buf, n->child, 0);
hash_put(hash, buf, TYPE_DESC);
}
if (SEC_FILES != n->sec)
return;
- buf_appendmdoc(buf, n->child);
+ buf_appendmdoc(buf, n->child, 0);
hash_put(hash, buf, TYPE_PATH);
}
{
if (SEC_NAME == n->sec) {
- buf_appendmdoc(buf, n->child);
+ buf_appendmdoc(buf, n->child, 0);
hash_put(hash, buf, TYPE_NAME);
return;
} else if (SEC_SYNOPSIS != n->sec || MDOC_HEAD != n->type)
if (NULL == n->child)
buf_append(buf, m->name);
- buf_appendmdoc(buf, n->child);
+ buf_appendmdoc(buf, n->child, 0);
hash_put(hash, buf, TYPE_UTILITY);
}