=================================================================== RCS file: /cvs/mandoc/mandocdb.c,v retrieving revision 1.130 retrieving revision 1.131 diff -u -p -r1.130 -r1.131 --- mandoc/mandocdb.c 2014/04/04 16:43:16 1.130 +++ mandoc/mandocdb.c 2014/04/04 18:23:30 1.131 @@ -1,4 +1,4 @@ -/* $Id: mandocdb.c,v 1.130 2014/04/04 16:43:16 schwarze Exp $ */ +/* $Id: mandocdb.c,v 1.131 2014/04/04 18:23:30 schwarze Exp $ */ /* * Copyright (c) 2011, 2012 Kristaps Dzonsons * Copyright (c) 2011, 2012, 2013, 2014 Ingo Schwarze @@ -147,7 +147,7 @@ static void *hash_alloc(size_t, void *); static void hash_free(void *, size_t, void *); static void *hash_halloc(size_t, void *); static void mlink_add(struct mlink *, const struct stat *); -static int mlink_check(struct mpage *, struct mlink *); +static void mlink_check(struct mpage *, struct mlink *); static void mlink_free(struct mlink *); static void mlinks_undupe(struct mpage *); static void mpages_free(void); @@ -924,13 +924,12 @@ nextlink: } } -static int +static void mlink_check(struct mpage *mpage, struct mlink *mlink) { - int match; + struct str *str; + unsigned int slot; - match = 1; - /* * Check whether the manual section given in a file * agrees with the directory where the file is located. @@ -941,11 +940,9 @@ mlink_check(struct mpage *mpage, struct mlink *mlink) */ if (FORM_SRC == mpage->form && - strcasecmp(mpage->sec, mlink->dsec)) { - match = 0; + strcasecmp(mpage->sec, mlink->dsec)) say(mlink->file, "Section \"%s\" manual in %s directory", mpage->sec, mlink->dsec); - } /* * Manual page directories exist for each kernel @@ -960,16 +957,28 @@ mlink_check(struct mpage *mpage, struct mlink *mlink) * on amd64, i386, sparc, and sparc64. */ - if (strcasecmp(mpage->arch, mlink->arch)) { - match = 0; + if (strcasecmp(mpage->arch, mlink->arch)) say(mlink->file, "Architecture \"%s\" manual in " "\"%s\" directory", mpage->arch, mlink->arch); - } - if (strcasecmp(mpage->title, mlink->name)) - match = 0; + /* + * XXX + * parse_cat() doesn't set TYPE_Nm and TYPE_NAME yet. + */ - return(match); + if (FORM_CAT == mpage->form) + return; + + /* + * Check whether this mlink + * appears as a name in the NAME section. + */ + + slot = ohash_qlookup(&strings, mlink->name); + str = ohash_find(&strings, slot); + assert(NULL != str); + if ( ! (TYPE_NAME & str->mask)) + say(mlink->file, "Name missing in NAME section"); } /* @@ -992,7 +1001,7 @@ mpages_merge(struct mchars *mc, struct mparse *mp) char *sodest; char *cp; pid_t child_pid; - int match, status; + int status; unsigned int pslot; enum mandoclevel lvl; @@ -1140,15 +1149,6 @@ mpages_merge(struct mchars *mc, struct mparse *mp) putkey(mpage, mlink->name, TYPE_Nm); } - if (warnings && !use_all) { - match = 0; - for (mlink = mpage->mlinks; mlink; - mlink = mlink->next) - if (mlink_check(mpage, mlink)) - match = 1; - } else - match = 1; - if (NULL != mdoc) { if (NULL != (cp = mdoc_meta(mdoc)->name)) putkey(mpage, cp, TYPE_Nm); @@ -1160,6 +1160,11 @@ mpages_merge(struct mchars *mc, struct mparse *mp) parse_man(mpage, man_node(man)); else parse_cat(mpage, fd[0]); + + if (warnings && !use_all) + for (mlink = mpage->mlinks; mlink; + mlink = mlink->next) + mlink_check(mpage, mlink); dbadd(mpage, mc);