=================================================================== RCS file: /cvs/mandoc/mandocdb.c,v retrieving revision 1.154 retrieving revision 1.161 diff -u -p -r1.154 -r1.161 --- mandoc/mandocdb.c 2014/08/05 14:43:10 1.154 +++ mandoc/mandocdb.c 2014/09/03 18:09:14 1.161 @@ -1,4 +1,4 @@ -/* $Id: mandocdb.c,v 1.154 2014/08/05 14:43:10 schwarze Exp $ */ +/* $OpenBSD: mandocdb.c,v 1.161 2014/09/03 18:09:14 schwarze Exp $ */ /* * Copyright (c) 2011, 2012 Kristaps Dzonsons * Copyright (c) 2011, 2012, 2013, 2014 Ingo Schwarze @@ -15,18 +15,21 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif #include +#include #include #include #include #include #include +#if HAVE_FTS #include +#else +#include "compat_fts.h" +#endif #include #include #include @@ -36,7 +39,7 @@ #include #include -#ifdef HAVE_OHASH +#if HAVE_OHASH #include #else #include "compat_ohash.h" @@ -80,12 +83,6 @@ enum op { OP_TEST /* change no databases, report potential problems */ }; -enum form { - FORM_NONE, /* format is unknown */ - FORM_SRC, /* format is -man or -mdoc */ - FORM_CAT /* format is cat */ -}; - struct str { char *rendered; /* key in UTF-8 or ASCII form */ const struct mpage *mpage; /* if set, the owning parse */ @@ -101,24 +98,24 @@ struct inodev { struct mpage { struct inodev inodev; /* used for hashing routine */ int64_t pageid; /* pageid in mpages SQL table */ - enum form form; /* format from file content */ char *sec; /* section from file content */ char *arch; /* architecture from file content */ char *title; /* title from file content */ char *desc; /* description from file content */ struct mlink *mlinks; /* singly linked list */ + int form; /* format from file content */ }; struct mlink { char file[PATH_MAX]; /* filename rel. to manpath */ - enum form dform; /* format from directory */ - enum form fform; /* format from file name suffix */ char *dsec; /* section from directory */ char *arch; /* architecture from directory */ char *name; /* name from file name (not empty) */ char *fsec; /* section from file name suffix */ struct mlink *next; /* singly linked list */ struct mpage *mpage; /* parent */ + int dform; /* format from directory */ + int fform; /* format from file name suffix */ int gzip; /* filename has a .gz suffix */ }; @@ -835,6 +832,7 @@ filescan(const char *file) } mlink = mandoc_calloc(1, sizeof(struct mlink)); + mlink->dform = FORM_NONE; if (strlcpy(mlink->file, start, sizeof(mlink->file)) >= sizeof(mlink->file)) { say(start, "Filename too long"); @@ -1198,8 +1196,9 @@ mpages_merge(struct mchars *mc, struct mparse *mp) goto nextpage; } else if (NULL != mdoc) { mpage->form = FORM_SRC; - mpage->sec = - mandoc_strdup(mdoc_meta(mdoc)->msec); + mpage->sec = mdoc_meta(mdoc)->msec; + mpage->sec = mandoc_strdup( + NULL == mpage->sec ? "" : mpage->sec); mpage->arch = mdoc_meta(mdoc)->arch; mpage->arch = mandoc_strdup( NULL == mpage->arch ? "" : mpage->arch); @@ -1222,6 +1221,8 @@ mpages_merge(struct mchars *mc, struct mparse *mp) mpage->title = mandoc_strdup(mpage->mlinks->name); } + if (mpage->mlinks->gzip) + mpage->form |= FORM_GZ; putkey(mpage, mpage->sec, TYPE_sec); putkey(mpage, '\0' == *mpage->arch ? any : mpage->arch, TYPE_arch); @@ -1328,6 +1329,8 @@ parse_cat(struct mpage *mpage, int fd) fopen(mpage->mlinks->file, "r") : fdopen(fd, "r"); if (NULL == stream) { + if (-1 != fd) + close(fd); if (warnings) say(mpage->mlinks->file, "&fopen"); return; @@ -1978,6 +1981,13 @@ dbadd_mlink(const struct mlink *mlink) SQL_BIND_INT64(stmts[STMT_INSERT_LINK], i, mlink->mpage->pageid); SQL_STEP(stmts[STMT_INSERT_LINK]); sqlite3_reset(stmts[STMT_INSERT_LINK]); + + i = 1; + SQL_BIND_INT64(stmts[STMT_INSERT_NAME], i, NAME_FILE); + SQL_BIND_TEXT(stmts[STMT_INSERT_NAME], i, mlink->name); + SQL_BIND_INT64(stmts[STMT_INSERT_NAME], i, mlink->mpage->pageid); + SQL_STEP(stmts[STMT_INSERT_NAME]); + sqlite3_reset(stmts[STMT_INSERT_NAME]); } /* @@ -2044,7 +2054,7 @@ dbadd(struct mpage *mpage, struct mchars *mc) i = 1; SQL_BIND_TEXT(stmts[STMT_INSERT_PAGE], i, key->rendered); - SQL_BIND_INT(stmts[STMT_INSERT_PAGE], i, FORM_SRC == mpage->form); + SQL_BIND_INT(stmts[STMT_INSERT_PAGE], i, mpage->form); SQL_STEP(stmts[STMT_INSERT_PAGE]); mpage->pageid = sqlite3_last_insert_rowid(db); sqlite3_reset(stmts[STMT_INSERT_PAGE]);