=================================================================== RCS file: /cvs/mandoc/mandocdb.c,v retrieving revision 1.177 retrieving revision 1.178 diff -u -p -r1.177 -r1.178 --- mandoc/mandocdb.c 2014/12/05 15:16:54 1.177 +++ mandoc/mandocdb.c 2014/12/05 16:18:14 1.178 @@ -1,4 +1,4 @@ -/* $Id: mandocdb.c,v 1.177 2014/12/05 15:16:54 schwarze Exp $ */ +/* $Id: mandocdb.c,v 1.178 2014/12/05 16:18:14 schwarze Exp $ */ /* * Copyright (c) 2011, 2012 Kristaps Dzonsons * Copyright (c) 2011, 2012, 2013, 2014 Ingo Schwarze @@ -165,6 +165,7 @@ static int parse_mdoc_head(struct mpage *, const stru const struct mdoc_node *); static int parse_mdoc_Fd(struct mpage *, const struct mdoc_meta *, const struct mdoc_node *); +static void parse_mdoc_fname(struct mpage *, const struct mdoc_node *); static int parse_mdoc_Fn(struct mpage *, const struct mdoc_meta *, const struct mdoc_node *); static int parse_mdoc_Fo(struct mpage *, const struct mdoc_meta *, @@ -1640,37 +1641,39 @@ parse_mdoc_Fd(struct mpage *mpage, const struct mdoc_m return(0); } -static int -parse_mdoc_Fn(struct mpage *mpage, const struct mdoc_meta *meta, - const struct mdoc_node *n) +static void +parse_mdoc_fname(struct mpage *mpage, const struct mdoc_node *n) { char *cp; + size_t sz; - if (NULL == (n = n->child) || MDOC_TEXT != n->type) - return(0); + if (n->type != MDOC_TEXT) + return; - /* - * Parse: .Fn "struct type *name" "char *arg". - * First strip away pointer symbol. - * Then store the function name, then type. - * Finally, store the arguments. - */ + /* Skip function pointer punctuation. */ - if (NULL == (cp = strrchr(n->string, ' '))) - cp = n->string; - - while ('*' == *cp) + cp = n->string; + while (*cp == '(' || *cp == '*') cp++; + sz = strcspn(cp, "()"); - putkey(mpage, cp, TYPE_Fn); + putkeys(mpage, cp, sz, TYPE_Fn); if (n->sec == SEC_SYNOPSIS) - putkey(mpage, cp, NAME_SYN); + putkeys(mpage, cp, sz, NAME_SYN); +} - if (n->string < cp) - putkeys(mpage, n->string, cp - n->string, TYPE_Ft); +static int +parse_mdoc_Fn(struct mpage *mpage, const struct mdoc_meta *meta, + const struct mdoc_node *n) +{ - for (n = n->next; NULL != n; n = n->next) - if (MDOC_TEXT == n->type) + if (n->child == NULL) + return(0); + + parse_mdoc_fname(mpage, n->child); + + for (n = n->child->next; n != NULL; n = n->next) + if (n->type == MDOC_TEXT) putkey(mpage, n->string, TYPE_Fa); return(0); @@ -1684,9 +1687,9 @@ parse_mdoc_Fo(struct mpage *mpage, const struct mdoc_m if (n->type != MDOC_HEAD) return(1); - putmdockey(mpage, n->child, TYPE_Fn); - if (n->sec == SEC_SYNOPSIS) - putmdockey(mpage, n->child, NAME_SYN); + if (n->child != NULL) + parse_mdoc_fname(mpage, n->child); + return(0); }