=================================================================== RCS file: /cvs/mandoc/mandocdb.c,v retrieving revision 1.130 retrieving revision 1.132 diff -u -p -r1.130 -r1.132 --- mandoc/mandocdb.c 2014/04/04 16:43:16 1.130 +++ mandoc/mandocdb.c 2014/04/09 21:50:08 1.132 @@ -1,4 +1,4 @@ -/* $Id: mandocdb.c,v 1.130 2014/04/04 16:43:16 schwarze Exp $ */ +/* $Id: mandocdb.c,v 1.132 2014/04/09 21:50:08 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); @@ -224,7 +224,7 @@ static const struct mdoc_handler mdocs[MDOC_MAX] = { { NULL, TYPE_Ic }, /* Ic */ { NULL, TYPE_In }, /* In */ { NULL, TYPE_Li }, /* Li */ - { parse_mdoc_Nd, TYPE_Nd }, /* Nd */ + { parse_mdoc_Nd, 0 }, /* Nd */ { parse_mdoc_Nm, 0 }, /* Nm */ { NULL, 0 }, /* Op */ { NULL, 0 }, /* Ot */ @@ -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,27 +1149,24 @@ 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); assert(NULL == mpage->desc); parse_mdoc(mpage, mdoc_node(mdoc)); - putkey(mpage, NULL != mpage->desc ? - mpage->desc : mpage->mlinks->name, TYPE_Nd); + if (NULL == mpage->desc) + mpage->desc = mandoc_strdup( + mpage->mlinks->name); } else if (NULL != man) 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); nextpage: @@ -1293,7 +1299,6 @@ parse_cat(struct mpage *mpage, int fd) "Cannot find NAME section"); assert(NULL == mpage->desc); mpage->desc = mandoc_strdup(mpage->mlinks->name); - putkey(mpage, mpage->mlinks->name, TYPE_Nd); fclose(stream); free(title); return; @@ -1334,7 +1339,6 @@ parse_cat(struct mpage *mpage, int fd) assert(NULL == mpage->desc); mpage->desc = mandoc_strdup(p); - putkey(mpage, mpage->desc, TYPE_Nd); fclose(stream); free(title); } @@ -1475,7 +1479,6 @@ parse_man(struct mpage *mpage, const struct man_node * assert(NULL == mpage->desc); mpage->desc = mandoc_strdup(start); - putkey(mpage, mpage->desc, TYPE_Nd); free(title); return; } @@ -1923,16 +1926,7 @@ dbadd(struct mpage *mpage, struct mchars *mc) if (NULL != mlink) fputs(", ", stdout); } - for (key = ohash_first(&strings, &slot); NULL != key; - key = ohash_next(&strings, &slot)) { - if (TYPE_Nd & key->mask) { - if (NULL == key->rendered) - render_key(mc, key); - printf(" - %s", key->rendered); - break; - } - } - putchar('\n'); + printf(" - %s\n", mpage->desc); return; } @@ -1940,6 +1934,7 @@ dbadd(struct mpage *mpage, struct mchars *mc) say(mlink->file, "Adding to database"); i = 1; + SQL_BIND_TEXT(stmts[STMT_INSERT_PAGE], i, mpage->desc); SQL_BIND_INT(stmts[STMT_INSERT_PAGE], i, FORM_SRC == mpage->form); SQL_STEP(stmts[STMT_INSERT_PAGE]); mpage->recno = sqlite3_last_insert_rowid(db); @@ -2152,6 +2147,7 @@ dbopen(int real) create_tables: sql = "CREATE TABLE \"mpages\" (\n" + " \"desc\" TEXT NOT NULL,\n" " \"form\" INTEGER NOT NULL,\n" " \"id\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL\n" ");\n" @@ -2184,7 +2180,7 @@ prepare_statements: "sec=? AND arch=? AND name=?)"; sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_DELETE_PAGE], NULL); sql = "INSERT INTO mpages " - "(form) VALUES (?)"; + "(desc,form) VALUES (?,?)"; sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_INSERT_PAGE], NULL); sql = "INSERT INTO mlinks " "(sec,arch,name,pageid) VALUES (?,?,?,?)";