version 1.67, 2013/06/07 04:51:26 |
version 1.71, 2013/07/02 13:26:52 |
|
|
char *arch; /* path-cued arch. (or empty) */ |
char *arch; /* path-cued arch. (or empty) */ |
}; |
}; |
|
|
|
struct title { |
|
char *title; /* name(sec/arch) given inside the file */ |
|
char *file; /* file name in case of mismatch */ |
|
}; |
|
|
enum stmt { |
enum stmt { |
STMT_DELETE = 0, /* delete manpage */ |
STMT_DELETE = 0, /* delete manpage */ |
STMT_INSERT_DOC, /* insert manpage */ |
STMT_INSERT_DOC, /* insert manpage */ |
Line 118 typedef int (*mdoc_fp)(struct of *, const struct mdoc_ |
|
Line 123 typedef int (*mdoc_fp)(struct of *, const struct mdoc_ |
|
struct mdoc_handler { |
struct mdoc_handler { |
mdoc_fp fp; /* optional handler */ |
mdoc_fp fp; /* optional handler */ |
uint64_t mask; /* set unless handler returns 0 */ |
uint64_t mask; /* set unless handler returns 0 */ |
int flags; /* for use by pmdoc_node */ |
|
#define MDOCF_CHILD 0x01 /* automatically index child nodes */ |
|
}; |
}; |
|
|
static void dbclose(int); |
static void dbclose(int); |
Line 137 static int inocheck(const struct stat *); |
|
Line 140 static int inocheck(const struct stat *); |
|
static void ofadd(int, const char *, const char *, const char *, |
static void ofadd(int, const char *, const char *, const char *, |
const char *, const char *, const struct stat *); |
const char *, const char *, const struct stat *); |
static void offree(void); |
static void offree(void); |
static void ofmerge(struct mchars *, struct mparse *, |
static void ofmerge(struct mchars *, struct mparse *, int); |
struct ohash_info*); |
|
static void parse_catpage(struct of *); |
static void parse_catpage(struct of *); |
static void parse_man(struct of *, const struct man_node *); |
static void parse_man(struct of *, const struct man_node *); |
static void parse_mdoc(struct of *, const struct mdoc_node *); |
static void parse_mdoc(struct of *, const struct mdoc_node *); |
Line 180 static sqlite3 *db = NULL; /* current database */ |
|
Line 182 static sqlite3 *db = NULL; /* current database */ |
|
static sqlite3_stmt *stmts[STMT__MAX]; /* current statements */ |
static sqlite3_stmt *stmts[STMT__MAX]; /* current statements */ |
|
|
static const struct mdoc_handler mdocs[MDOC_MAX] = { |
static const struct mdoc_handler mdocs[MDOC_MAX] = { |
{ NULL, 0, 0 }, /* Ap */ |
{ NULL, 0 }, /* Ap */ |
{ NULL, 0, 0 }, /* Dd */ |
{ NULL, 0 }, /* Dd */ |
{ NULL, 0, 0 }, /* Dt */ |
{ NULL, 0 }, /* Dt */ |
{ NULL, 0, 0 }, /* Os */ |
{ NULL, 0 }, /* Os */ |
{ parse_mdoc_Sh, TYPE_Sh, MDOCF_CHILD }, /* Sh */ |
{ parse_mdoc_Sh, TYPE_Sh }, /* Sh */ |
{ parse_mdoc_head, TYPE_Ss, MDOCF_CHILD }, /* Ss */ |
{ parse_mdoc_head, TYPE_Ss }, /* Ss */ |
{ NULL, 0, 0 }, /* Pp */ |
{ NULL, 0 }, /* Pp */ |
{ NULL, 0, 0 }, /* D1 */ |
{ NULL, 0 }, /* D1 */ |
{ NULL, 0, 0 }, /* Dl */ |
{ NULL, 0 }, /* Dl */ |
{ NULL, 0, 0 }, /* Bd */ |
{ NULL, 0 }, /* Bd */ |
{ NULL, 0, 0 }, /* Ed */ |
{ NULL, 0 }, /* Ed */ |
{ NULL, 0, 0 }, /* Bl */ |
{ NULL, 0 }, /* Bl */ |
{ NULL, 0, 0 }, /* El */ |
{ NULL, 0 }, /* El */ |
{ NULL, 0, 0 }, /* It */ |
{ NULL, 0 }, /* It */ |
{ NULL, 0, 0 }, /* Ad */ |
{ NULL, 0 }, /* Ad */ |
{ NULL, TYPE_An, MDOCF_CHILD }, /* An */ |
{ NULL, TYPE_An }, /* An */ |
{ NULL, TYPE_Ar, MDOCF_CHILD }, /* Ar */ |
{ NULL, TYPE_Ar }, /* Ar */ |
{ NULL, TYPE_Cd, MDOCF_CHILD }, /* Cd */ |
{ NULL, TYPE_Cd }, /* Cd */ |
{ NULL, TYPE_Cm, MDOCF_CHILD }, /* Cm */ |
{ NULL, TYPE_Cm }, /* Cm */ |
{ NULL, TYPE_Dv, MDOCF_CHILD }, /* Dv */ |
{ NULL, TYPE_Dv }, /* Dv */ |
{ NULL, TYPE_Er, MDOCF_CHILD }, /* Er */ |
{ NULL, TYPE_Er }, /* Er */ |
{ NULL, TYPE_Ev, MDOCF_CHILD }, /* Ev */ |
{ NULL, TYPE_Ev }, /* Ev */ |
{ NULL, 0, 0 }, /* Ex */ |
{ NULL, 0 }, /* Ex */ |
{ NULL, TYPE_Fa, MDOCF_CHILD }, /* Fa */ |
{ NULL, TYPE_Fa }, /* Fa */ |
{ parse_mdoc_Fd, TYPE_In, 0 }, /* Fd */ |
{ parse_mdoc_Fd, 0 }, /* Fd */ |
{ NULL, TYPE_Fl, MDOCF_CHILD }, /* Fl */ |
{ NULL, TYPE_Fl }, /* Fl */ |
{ parse_mdoc_Fn, 0, 0 }, /* Fn */ |
{ parse_mdoc_Fn, 0 }, /* Fn */ |
{ NULL, TYPE_Ft, MDOCF_CHILD }, /* Ft */ |
{ NULL, TYPE_Ft }, /* Ft */ |
{ NULL, TYPE_Ic, MDOCF_CHILD }, /* Ic */ |
{ NULL, TYPE_Ic }, /* Ic */ |
{ parse_mdoc_In, TYPE_In, MDOCF_CHILD }, /* In */ |
{ parse_mdoc_In, TYPE_In }, /* In */ |
{ NULL, TYPE_Li, MDOCF_CHILD }, /* Li */ |
{ NULL, TYPE_Li }, /* Li */ |
{ parse_mdoc_Nd, TYPE_Nd, MDOCF_CHILD }, /* Nd */ |
{ parse_mdoc_Nd, TYPE_Nd }, /* Nd */ |
{ parse_mdoc_Nm, TYPE_Nm, MDOCF_CHILD }, /* Nm */ |
{ parse_mdoc_Nm, TYPE_Nm }, /* Nm */ |
{ NULL, 0, 0 }, /* Op */ |
{ NULL, 0 }, /* Op */ |
{ NULL, 0, 0 }, /* Ot */ |
{ NULL, 0 }, /* Ot */ |
{ NULL, TYPE_Pa, MDOCF_CHILD }, /* Pa */ |
{ NULL, TYPE_Pa }, /* Pa */ |
{ NULL, 0, 0 }, /* Rv */ |
{ NULL, 0 }, /* Rv */ |
{ parse_mdoc_St, TYPE_St, 0 }, /* St */ |
{ parse_mdoc_St, 0 }, /* St */ |
{ NULL, TYPE_Va, MDOCF_CHILD }, /* Va */ |
{ NULL, TYPE_Va }, /* Va */ |
{ parse_mdoc_body, TYPE_Va, MDOCF_CHILD }, /* Vt */ |
{ parse_mdoc_body, TYPE_Va }, /* Vt */ |
{ parse_mdoc_Xr, TYPE_Xr, 0 }, /* Xr */ |
{ parse_mdoc_Xr, 0 }, /* Xr */ |
{ NULL, 0, 0 }, /* %A */ |
{ NULL, 0 }, /* %A */ |
{ NULL, 0, 0 }, /* %B */ |
{ NULL, 0 }, /* %B */ |
{ NULL, 0, 0 }, /* %D */ |
{ NULL, 0 }, /* %D */ |
{ NULL, 0, 0 }, /* %I */ |
{ NULL, 0 }, /* %I */ |
{ NULL, 0, 0 }, /* %J */ |
{ NULL, 0 }, /* %J */ |
{ NULL, 0, 0 }, /* %N */ |
{ NULL, 0 }, /* %N */ |
{ NULL, 0, 0 }, /* %O */ |
{ NULL, 0 }, /* %O */ |
{ NULL, 0, 0 }, /* %P */ |
{ NULL, 0 }, /* %P */ |
{ NULL, 0, 0 }, /* %R */ |
{ NULL, 0 }, /* %R */ |
{ NULL, 0, 0 }, /* %T */ |
{ NULL, 0 }, /* %T */ |
{ NULL, 0, 0 }, /* %V */ |
{ NULL, 0 }, /* %V */ |
{ NULL, 0, 0 }, /* Ac */ |
{ NULL, 0 }, /* Ac */ |
{ NULL, 0, 0 }, /* Ao */ |
{ NULL, 0 }, /* Ao */ |
{ NULL, 0, 0 }, /* Aq */ |
{ NULL, 0 }, /* Aq */ |
{ NULL, TYPE_At, MDOCF_CHILD }, /* At */ |
{ NULL, TYPE_At }, /* At */ |
{ NULL, 0, 0 }, /* Bc */ |
{ NULL, 0 }, /* Bc */ |
{ NULL, 0, 0 }, /* Bf */ |
{ NULL, 0 }, /* Bf */ |
{ NULL, 0, 0 }, /* Bo */ |
{ NULL, 0 }, /* Bo */ |
{ NULL, 0, 0 }, /* Bq */ |
{ NULL, 0 }, /* Bq */ |
{ NULL, TYPE_Bsx, MDOCF_CHILD }, /* Bsx */ |
{ NULL, TYPE_Bsx }, /* Bsx */ |
{ NULL, TYPE_Bx, MDOCF_CHILD }, /* Bx */ |
{ NULL, TYPE_Bx }, /* Bx */ |
{ NULL, 0, 0 }, /* Db */ |
{ NULL, 0 }, /* Db */ |
{ NULL, 0, 0 }, /* Dc */ |
{ NULL, 0 }, /* Dc */ |
{ NULL, 0, 0 }, /* Do */ |
{ NULL, 0 }, /* Do */ |
{ NULL, 0, 0 }, /* Dq */ |
{ NULL, 0 }, /* Dq */ |
{ NULL, 0, 0 }, /* Ec */ |
{ NULL, 0 }, /* Ec */ |
{ NULL, 0, 0 }, /* Ef */ |
{ NULL, 0 }, /* Ef */ |
{ NULL, TYPE_Em, MDOCF_CHILD }, /* Em */ |
{ NULL, TYPE_Em }, /* Em */ |
{ NULL, 0, 0 }, /* Eo */ |
{ NULL, 0 }, /* Eo */ |
{ NULL, TYPE_Fx, MDOCF_CHILD }, /* Fx */ |
{ NULL, TYPE_Fx }, /* Fx */ |
{ NULL, TYPE_Ms, MDOCF_CHILD }, /* Ms */ |
{ NULL, TYPE_Ms }, /* Ms */ |
{ NULL, 0, 0 }, /* No */ |
{ NULL, 0 }, /* No */ |
{ NULL, 0, 0 }, /* Ns */ |
{ NULL, 0 }, /* Ns */ |
{ NULL, TYPE_Nx, MDOCF_CHILD }, /* Nx */ |
{ NULL, TYPE_Nx }, /* Nx */ |
{ NULL, TYPE_Ox, MDOCF_CHILD }, /* Ox */ |
{ NULL, TYPE_Ox }, /* Ox */ |
{ NULL, 0, 0 }, /* Pc */ |
{ NULL, 0 }, /* Pc */ |
{ NULL, 0, 0 }, /* Pf */ |
{ NULL, 0 }, /* Pf */ |
{ NULL, 0, 0 }, /* Po */ |
{ NULL, 0 }, /* Po */ |
{ NULL, 0, 0 }, /* Pq */ |
{ NULL, 0 }, /* Pq */ |
{ NULL, 0, 0 }, /* Qc */ |
{ NULL, 0 }, /* Qc */ |
{ NULL, 0, 0 }, /* Ql */ |
{ NULL, 0 }, /* Ql */ |
{ NULL, 0, 0 }, /* Qo */ |
{ NULL, 0 }, /* Qo */ |
{ NULL, 0, 0 }, /* Qq */ |
{ NULL, 0 }, /* Qq */ |
{ NULL, 0, 0 }, /* Re */ |
{ NULL, 0 }, /* Re */ |
{ NULL, 0, 0 }, /* Rs */ |
{ NULL, 0 }, /* Rs */ |
{ NULL, 0, 0 }, /* Sc */ |
{ NULL, 0 }, /* Sc */ |
{ NULL, 0, 0 }, /* So */ |
{ NULL, 0 }, /* So */ |
{ NULL, 0, 0 }, /* Sq */ |
{ NULL, 0 }, /* Sq */ |
{ NULL, 0, 0 }, /* Sm */ |
{ NULL, 0 }, /* Sm */ |
{ NULL, 0, 0 }, /* Sx */ |
{ NULL, 0 }, /* Sx */ |
{ NULL, TYPE_Sy, MDOCF_CHILD }, /* Sy */ |
{ NULL, TYPE_Sy }, /* Sy */ |
{ NULL, TYPE_Tn, MDOCF_CHILD }, /* Tn */ |
{ NULL, TYPE_Tn }, /* Tn */ |
{ NULL, 0, 0 }, /* Ux */ |
{ NULL, 0 }, /* Ux */ |
{ NULL, 0, 0 }, /* Xc */ |
{ NULL, 0 }, /* Xc */ |
{ NULL, 0, 0 }, /* Xo */ |
{ NULL, 0 }, /* Xo */ |
{ parse_mdoc_head, TYPE_Fn, 0 }, /* Fo */ |
{ parse_mdoc_head, 0 }, /* Fo */ |
{ NULL, 0, 0 }, /* Fc */ |
{ NULL, 0 }, /* Fc */ |
{ NULL, 0, 0 }, /* Oo */ |
{ NULL, 0 }, /* Oo */ |
{ NULL, 0, 0 }, /* Oc */ |
{ NULL, 0 }, /* Oc */ |
{ NULL, 0, 0 }, /* Bk */ |
{ NULL, 0 }, /* Bk */ |
{ NULL, 0, 0 }, /* Ek */ |
{ NULL, 0 }, /* Ek */ |
{ NULL, 0, 0 }, /* Bt */ |
{ NULL, 0 }, /* Bt */ |
{ NULL, 0, 0 }, /* Hf */ |
{ NULL, 0 }, /* Hf */ |
{ NULL, 0, 0 }, /* Fr */ |
{ NULL, 0 }, /* Fr */ |
{ NULL, 0, 0 }, /* Ud */ |
{ NULL, 0 }, /* Ud */ |
{ NULL, TYPE_Lb, MDOCF_CHILD }, /* Lb */ |
{ NULL, TYPE_Lb }, /* Lb */ |
{ NULL, 0, 0 }, /* Lp */ |
{ NULL, 0 }, /* Lp */ |
{ NULL, TYPE_Lk, MDOCF_CHILD }, /* Lk */ |
{ NULL, TYPE_Lk }, /* Lk */ |
{ NULL, TYPE_Mt, MDOCF_CHILD }, /* Mt */ |
{ NULL, TYPE_Mt }, /* Mt */ |
{ NULL, 0, 0 }, /* Brq */ |
{ NULL, 0 }, /* Brq */ |
{ NULL, 0, 0 }, /* Bro */ |
{ NULL, 0 }, /* Bro */ |
{ NULL, 0, 0 }, /* Brc */ |
{ NULL, 0 }, /* Brc */ |
{ NULL, 0, 0 }, /* %C */ |
{ NULL, 0 }, /* %C */ |
{ NULL, 0, 0 }, /* Es */ |
{ NULL, 0 }, /* Es */ |
{ NULL, 0, 0 }, /* En */ |
{ NULL, 0 }, /* En */ |
{ NULL, TYPE_Dx, MDOCF_CHILD }, /* Dx */ |
{ NULL, TYPE_Dx }, /* Dx */ |
{ NULL, 0, 0 }, /* %Q */ |
{ NULL, 0 }, /* %Q */ |
{ NULL, 0, 0 }, /* br */ |
{ NULL, 0 }, /* br */ |
{ NULL, 0, 0 }, /* sp */ |
{ NULL, 0 }, /* sp */ |
{ NULL, 0, 0 }, /* %U */ |
{ NULL, 0 }, /* %U */ |
{ NULL, 0, 0 }, /* Ta */ |
{ NULL, 0 }, /* Ta */ |
}; |
}; |
|
|
int |
int |
Line 313 main(int argc, char *argv[]) |
|
Line 315 main(int argc, char *argv[]) |
|
struct mchars *mc; |
struct mchars *mc; |
struct manpaths dirs; |
struct manpaths dirs; |
struct mparse *mp; |
struct mparse *mp; |
struct ohash_info ino_info, filename_info, str_info; |
struct ohash_info ino_info, filename_info; |
|
|
memset(stmts, 0, STMT__MAX * sizeof(sqlite3_stmt *)); |
memset(stmts, 0, STMT__MAX * sizeof(sqlite3_stmt *)); |
memset(&dirs, 0, sizeof(struct manpaths)); |
memset(&dirs, 0, sizeof(struct manpaths)); |
|
|
ino_info.halloc = filename_info.halloc = |
ino_info.alloc = filename_info.alloc = hash_alloc; |
str_info.halloc = hash_halloc; |
ino_info.halloc = filename_info.halloc = hash_halloc; |
ino_info.hfree = filename_info.hfree = |
ino_info.hfree = filename_info.hfree = hash_free; |
str_info.hfree = hash_free; |
|
ino_info.alloc = filename_info.alloc = |
|
str_info.alloc = hash_alloc; |
|
|
|
ino_info.key_offset = offsetof(struct of, id); |
ino_info.key_offset = offsetof(struct of, id); |
filename_info.key_offset = offsetof(struct of, file); |
filename_info.key_offset = offsetof(struct of, file); |
str_info.key_offset = offsetof(struct str, key); |
|
|
|
progname = strrchr(argv[0], '/'); |
progname = strrchr(argv[0], '/'); |
if (progname == NULL) |
if (progname == NULL) |
Line 424 main(int argc, char *argv[]) |
|
Line 422 main(int argc, char *argv[]) |
|
if (OP_TEST != op) |
if (OP_TEST != op) |
dbprune(); |
dbprune(); |
if (OP_DELETE != op) |
if (OP_DELETE != op) |
ofmerge(mc, mp, &str_info); |
ofmerge(mc, mp, 0); |
dbclose(1); |
dbclose(1); |
} else { |
} else { |
/* |
/* |
Line 442 main(int argc, char *argv[]) |
|
Line 440 main(int argc, char *argv[]) |
|
manpath_parse(&dirs, path_arg, NULL, NULL); |
manpath_parse(&dirs, path_arg, NULL, NULL); |
|
|
/* |
/* |
* First scan the tree rooted at a base directory. |
* First scan the tree rooted at a base directory, then |
* Then whak its database (if one exists), parse, and |
* build a new database and finally move it into place. |
* build up the database. |
|
* Ignore zero-length directories and strip trailing |
* Ignore zero-length directories and strip trailing |
* slashes. |
* slashes. |
*/ |
*/ |
Line 469 main(int argc, char *argv[]) |
|
Line 466 main(int argc, char *argv[]) |
|
if (0 == dbopen(0)) |
if (0 == dbopen(0)) |
goto out; |
goto out; |
|
|
/* |
ofmerge(mc, mp, warnings && !use_all); |
* Since we're opening up a new database, we can |
|
* turn off synchronous mode for much better |
|
* performance. |
|
*/ |
|
#ifndef __APPLE__ |
|
SQL_EXEC("PRAGMA synchronous = OFF"); |
|
#endif |
|
|
|
ofmerge(mc, mp, &str_info); |
|
dbclose(0); |
dbclose(0); |
|
|
if (j + 1 < dirs.sz) { |
if (j + 1 < dirs.sz) { |
|
|
* and filename to determine whether the file is parsable or not. |
* and filename to determine whether the file is parsable or not. |
*/ |
*/ |
static void |
static void |
ofmerge(struct mchars *mc, struct mparse *mp, |
ofmerge(struct mchars *mc, struct mparse *mp, int check_reachable) |
struct ohash_info *infop) |
|
{ |
{ |
int form; |
struct ohash title_table; |
size_t sz; |
struct ohash_info title_info, str_info; |
struct mdoc *mdoc; |
char buf[PATH_MAX]; |
struct man *man; |
struct of *of; |
char buf[PATH_MAX]; |
struct mdoc *mdoc; |
char *bufp; |
struct man *man; |
const char *msec, *march, *mtitle, *cp; |
struct title *title_entry; |
struct of *of; |
char *bufp, *title_str; |
enum mandoclevel lvl; |
const char *msec, *march, *mtitle, *cp; |
|
size_t sz; |
|
int form; |
|
int match; |
|
unsigned int slot; |
|
enum mandoclevel lvl; |
|
|
|
str_info.alloc = hash_alloc; |
|
str_info.halloc = hash_halloc; |
|
str_info.hfree = hash_free; |
|
str_info.key_offset = offsetof(struct str, key); |
|
|
|
if (check_reachable) { |
|
title_info.alloc = hash_alloc; |
|
title_info.halloc = hash_halloc; |
|
title_info.hfree = hash_free; |
|
title_info.key_offset = offsetof(struct title, title); |
|
ohash_init(&title_table, 6, &title_info); |
|
} |
|
|
for (of = ofs; NULL != of; of = of->next) { |
for (of = ofs; NULL != of; of = of->next) { |
/* |
/* |
* If we're a catpage (as defined by our path), then see |
* If we're a catpage (as defined by our path), then see |
Line 941 ofmerge(struct mchars *mc, struct mparse *mp, |
|
Line 946 ofmerge(struct mchars *mc, struct mparse *mp, |
|
} |
} |
} |
} |
|
|
ohash_init(&strings, 6, infop); |
ohash_init(&strings, 6, &str_info); |
mparse_reset(mp); |
mparse_reset(mp); |
mdoc = NULL; |
mdoc = NULL; |
man = NULL; |
man = NULL; |
Line 949 ofmerge(struct mchars *mc, struct mparse *mp, |
|
Line 954 ofmerge(struct mchars *mc, struct mparse *mp, |
|
msec = of->dsec; |
msec = of->dsec; |
march = of->arch; |
march = of->arch; |
mtitle = of->name; |
mtitle = of->name; |
|
match = 1; |
|
|
/* |
/* |
* Try interpreting the file as mdoc(7) or man(7) |
* Try interpreting the file as mdoc(7) or man(7) |
Line 990 ofmerge(struct mchars *mc, struct mparse *mp, |
|
Line 996 ofmerge(struct mchars *mc, struct mparse *mp, |
|
* manuals for such reasons. |
* manuals for such reasons. |
*/ |
*/ |
if (warnings && !use_all && form && |
if (warnings && !use_all && form && |
strcasecmp(msec, of->dsec)) |
strcasecmp(msec, of->dsec)) { |
|
match = 0; |
say(of->file, "Section \"%s\" " |
say(of->file, "Section \"%s\" " |
"manual in %s directory", |
"manual in %s directory", |
msec, of->dsec); |
msec, of->dsec); |
|
} |
|
|
/* |
/* |
* Manual page directories exist for each kernel |
* Manual page directories exist for each kernel |
Line 1009 ofmerge(struct mchars *mc, struct mparse *mp, |
|
Line 1017 ofmerge(struct mchars *mc, struct mparse *mp, |
|
* Thus, warn about architecture mismatches, |
* Thus, warn about architecture mismatches, |
* but don't skip manuals for this reason. |
* but don't skip manuals for this reason. |
*/ |
*/ |
if (warnings && !use_all && strcasecmp(march, of->arch)) |
if (warnings && !use_all && strcasecmp(march, of->arch)) { |
|
match = 0; |
say(of->file, "Architecture \"%s\" " |
say(of->file, "Architecture \"%s\" " |
"manual in \"%s\" directory", |
"manual in \"%s\" directory", |
march, of->arch); |
march, of->arch); |
|
} |
|
if (warnings && !use_all && strcasecmp(mtitle, of->name)) |
|
match = 0; |
|
|
putkey(of, of->name, TYPE_Nm); |
putkey(of, of->name, TYPE_Nm); |
|
|
Line 1028 ofmerge(struct mchars *mc, struct mparse *mp, |
|
Line 1040 ofmerge(struct mchars *mc, struct mparse *mp, |
|
else |
else |
parse_catpage(of); |
parse_catpage(of); |
|
|
|
/* |
|
* Build a title string for the file. If it matches |
|
* the location of the file, remember the title as |
|
* found; else, remember it as missing. |
|
*/ |
|
|
|
if (check_reachable) { |
|
if (-1 == asprintf(&title_str, "%s(%s%s%s)", mtitle, |
|
msec, '\0' == *march ? "" : "/", march)) { |
|
perror(NULL); |
|
exit((int)MANDOCLEVEL_SYSERR); |
|
} |
|
slot = ohash_qlookup(&title_table, title_str); |
|
title_entry = ohash_find(&title_table, slot); |
|
if (NULL == title_entry) { |
|
title_entry = mandoc_malloc( |
|
sizeof(struct title)); |
|
title_entry->title = title_str; |
|
title_entry->file = mandoc_strdup( |
|
match ? "" : of->file); |
|
ohash_insert(&title_table, slot, |
|
title_entry); |
|
} else { |
|
if (match) |
|
*title_entry->file = '\0'; |
|
free(title_str); |
|
} |
|
} |
|
|
dbindex(mc, form, of); |
dbindex(mc, form, of); |
ohash_delete(&strings); |
ohash_delete(&strings); |
} |
} |
|
|
|
if (check_reachable) { |
|
title_entry = ohash_first(&title_table, &slot); |
|
while (NULL != title_entry) { |
|
if ('\0' != *title_entry->file) |
|
say(title_entry->file, |
|
"Probably unreachable, title is %s", |
|
title_entry->title); |
|
free(title_entry->title); |
|
free(title_entry->file); |
|
free(title_entry); |
|
title_entry = ohash_next(&title_table, &slot); |
|
} |
|
ohash_delete(&title_table); |
|
} |
} |
} |
|
|
static void |
static void |
Line 1332 parse_mdoc(struct of *of, const struct mdoc_node *n) |
|
Line 1388 parse_mdoc(struct of *of, const struct mdoc_node *n) |
|
if (NULL != mdocs[n->tok].fp) |
if (NULL != mdocs[n->tok].fp) |
if (0 == (*mdocs[n->tok].fp)(of, n)) |
if (0 == (*mdocs[n->tok].fp)(of, n)) |
break; |
break; |
|
if (mdocs[n->tok].mask) |
if (MDOCF_CHILD & mdocs[n->tok].flags) |
|
putmdockey(of, n->child, mdocs[n->tok].mask); |
putmdockey(of, n->child, mdocs[n->tok].mask); |
break; |
break; |
default: |
default: |
Line 1907 prepare_statements: |
|
Line 1962 prepare_statements: |
|
sql = "INSERT INTO keys " |
sql = "INSERT INTO keys " |
"(bits,key,docid) VALUES (?,?,?)"; |
"(bits,key,docid) VALUES (?,?,?)"; |
sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_INSERT_KEY], NULL); |
sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_INSERT_KEY], NULL); |
|
|
|
#ifndef __APPLE__ |
|
/* |
|
* When opening a new database, we can turn off |
|
* synchronous mode for much better performance. |
|
*/ |
|
|
|
if (real) |
|
SQL_EXEC("PRAGMA synchronous = OFF"); |
|
#endif |
|
|
return(1); |
return(1); |
} |
} |
|
|