=================================================================== RCS file: /cvs/mandoc/mandocdb.c,v retrieving revision 1.118 retrieving revision 1.122 diff -u -p -r1.118 -r1.122 --- mandoc/mandocdb.c 2014/03/19 22:33:09 1.118 +++ mandoc/mandocdb.c 2014/03/23 12:44:56 1.122 @@ -1,4 +1,4 @@ -/* $Id: mandocdb.c,v 1.118 2014/03/19 22:33:09 schwarze Exp $ */ +/* $Id: mandocdb.c,v 1.122 2014/03/23 12:44:56 schwarze Exp $ */ /* * Copyright (c) 2011, 2012 Kristaps Dzonsons * Copyright (c) 2011, 2012, 2013, 2014 Ingo Schwarze @@ -46,6 +46,7 @@ #include "mdoc.h" #include "man.h" #include "mandoc.h" +#include "mandoc_aux.h" #include "manpath.h" #include "mansearch.h" @@ -1262,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; @@ -1284,12 +1285,8 @@ parse_man(struct mpage *mpage, const struct man_node * NULL != (head = (head->child)) && MAN_TEXT == head->type && 0 == strcmp(head->string, "NAME") && - NULL != (body = body->child) && - MAN_TEXT == body->type) { + NULL != body->child) { - title = NULL; - titlesz = 0; - /* * Suck the entire NAME section into memory. * Yes, we might run away. @@ -1297,47 +1294,11 @@ parse_man(struct mpage *mpage, const struct man_node * * 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 @@ -1346,6 +1307,7 @@ parse_man(struct mpage *mpage, const struct man_node * * the name parts here. */ + start = title; for ( ;; ) { sz = strcspn(start, " ,"); if ('\0' == start[sz]) @@ -1376,7 +1338,7 @@ parse_man(struct mpage *mpage, const struct man_node * start++; } - if (sv == start) { + if (start == title) { putkey(mpage, start, TYPE_Nm); free(title); return; @@ -1535,10 +1497,7 @@ parse_mdoc_Xr(struct mpage *mpage, const struct mdoc_n return(0); } - if (-1 == asprintf(&cp, "%s(%s)", n->string, n->next->string)) { - perror(NULL); - exit((int)MANDOCLEVEL_SYSERR); - } + mandoc_asprintf(&cp, "%s(%s)", n->string, n->next->string); putkey(mpage, cp, TYPE_Xr); free(cp); return(0); @@ -1547,32 +1506,10 @@ parse_mdoc_Xr(struct mpage *mpage, const struct mdoc_n static int parse_mdoc_Nd(struct mpage *mpage, const struct mdoc_node *n) { - size_t sz; - if (MDOC_BODY != n->type) - return(0); - - /* - * Special-case the `Nd' because we need to put the description - * into the document table. - */ - - for (n = n->child; NULL != n; n = n->next) { - if (MDOC_TEXT == n->type) { - if (NULL != mpage->desc) { - sz = strlen(mpage->desc) + - strlen(n->string) + 2; - mpage->desc = mandoc_realloc( - mpage->desc, sz); - strlcat(mpage->desc, " ", sz); - strlcat(mpage->desc, n->string, sz); - } else - mpage->desc = mandoc_strdup(n->string); - } - if (NULL != n->child) - parse_mdoc_Nd(mpage, n); - } - return(1); + if (MDOC_BODY == n->type) + mdoc_deroff(&mpage->desc, n); + return(0); } static int