version 1.17, 2011/07/10 13:03:31 |
version 1.18, 2011/07/11 09:36:15 |
Line 84 static void buf_appendb(struct buf *, |
|
Line 84 static void buf_appendb(struct buf *, |
|
const void *, size_t); |
const void *, size_t); |
static void dbt_put(DB *, const char *, DBT *, DBT *); |
static void dbt_put(DB *, const char *, DBT *, DBT *); |
static void hash_put(DB *, const struct buf *, int); |
static void hash_put(DB *, const struct buf *, int); |
|
static void hash_reset(DB **); |
static int pman_node(MAN_ARGS); |
static int pman_node(MAN_ARGS); |
static void pmdoc_node(MDOC_ARGS); |
static void pmdoc_node(MDOC_ARGS); |
static void pmdoc_An(MDOC_ARGS); |
static void pmdoc_An(MDOC_ARGS); |
Line 243 main(int argc, char *argv[]) |
|
Line 244 main(int argc, char *argv[]) |
|
*arch, /* manual architecture */ |
*arch, /* manual architecture */ |
*dir; /* result dir (default: cwd) */ |
*dir; /* result dir (default: cwd) */ |
char ibuf[MAXPATHLEN], /* index fname */ |
char ibuf[MAXPATHLEN], /* index fname */ |
ibbuf[MAXPATHLEN], /* index backup fname */ |
|
fbuf[MAXPATHLEN], /* btree fname */ |
fbuf[MAXPATHLEN], /* btree fname */ |
fbbuf[MAXPATHLEN], /* btree backup fname */ |
|
vbuf[8]; /* stringified record number */ |
vbuf[8]; /* stringified record number */ |
int ch, seq, verb; |
int ch, seq, verb; |
DB *idx, /* index database */ |
DB *idx, /* index database */ |
*db, /* keyword database */ |
*db, /* keyword database */ |
*hash; /* temporary keyword hashtable */ |
*hash; /* temporary keyword hashtable */ |
DBT key, val; |
DBT key, val; |
|
enum mandocerr ec; |
size_t sv; |
size_t sv; |
BTREEINFO info; /* btree configuration */ |
BTREEINFO info; /* btree configuration */ |
recno_t rec; /* current record number */ |
recno_t rec; /* current record number */ |
Line 268 main(int argc, char *argv[]) |
|
Line 268 main(int argc, char *argv[]) |
|
|
|
dir = ""; |
dir = ""; |
verb = 0; |
verb = 0; |
|
db = idx = NULL; |
|
mp = NULL; |
|
hash = NULL; |
|
ec = MANDOCLEVEL_SYSERR; |
|
|
|
memset(&buf, 0, sizeof(struct buf)); |
|
memset(&dbuf, 0, sizeof(struct buf)); |
|
|
while (-1 != (ch = getopt(argc, argv, "d:v"))) |
while (-1 != (ch = getopt(argc, argv, "d:v"))) |
switch (ch) { |
switch (ch) { |
case ('d'): |
case ('d'): |
Line 285 main(int argc, char *argv[]) |
|
Line 292 main(int argc, char *argv[]) |
|
argc -= optind; |
argc -= optind; |
argv += optind; |
argv += optind; |
|
|
/* |
|
* Set up temporary file-names into which we're going to write |
|
* all of our data (both for the index and database). These |
|
* will be securely renamed to the real file-names after we've |
|
* written all of our data. |
|
*/ |
|
|
|
ibuf[0] = ibuf[MAXPATHLEN - 2] = |
ibuf[0] = ibuf[MAXPATHLEN - 2] = |
ibbuf[0] = ibbuf[MAXPATHLEN - 2] = |
fbuf[0] = fbuf[MAXPATHLEN - 2] = '\0'; |
fbuf[0] = fbuf[MAXPATHLEN - 2] = |
|
fbbuf[0] = fbbuf[MAXPATHLEN - 2] = '\0'; |
|
|
|
strlcat(fbuf, dir, MAXPATHLEN); |
strlcat(fbuf, dir, MAXPATHLEN); |
strlcat(fbuf, MANDOC_DB, MAXPATHLEN); |
strlcat(fbuf, MANDOC_DB, MAXPATHLEN); |
|
|
strlcat(fbbuf, fbuf, MAXPATHLEN); |
|
strlcat(fbbuf, "~", MAXPATHLEN); |
|
|
|
strlcat(ibuf, dir, MAXPATHLEN); |
strlcat(ibuf, dir, MAXPATHLEN); |
strlcat(ibuf, MANDOC_IDX, MAXPATHLEN); |
strlcat(ibuf, MANDOC_IDX, MAXPATHLEN); |
|
|
strlcat(ibbuf, ibuf, MAXPATHLEN); |
|
strlcat(ibbuf, "~", MAXPATHLEN); |
|
|
|
if ('\0' != fbuf[MAXPATHLEN - 2] || |
if ('\0' != fbuf[MAXPATHLEN - 2] || |
'\0' != fbbuf[MAXPATHLEN - 2] || |
'\0' != ibuf[MAXPATHLEN - 2]) { |
'\0' != ibuf[MAXPATHLEN - 2] || |
|
'\0' != ibbuf[MAXPATHLEN - 2]) { |
|
fprintf(stderr, "%s: Path too long\n", dir); |
fprintf(stderr, "%s: Path too long\n", dir); |
exit((int)MANDOCLEVEL_SYSERR); |
goto out; |
} |
} |
|
|
/* |
/* |
Line 325 main(int argc, char *argv[]) |
|
Line 315 main(int argc, char *argv[]) |
|
|
|
memset(&info, 0, sizeof(BTREEINFO)); |
memset(&info, 0, sizeof(BTREEINFO)); |
info.flags = R_DUP; |
info.flags = R_DUP; |
db = dbopen(fbbuf, MANDOC_FLAGS, 0644, DB_BTREE, &info); |
|
|
|
if (NULL == db) { |
db = dbopen(fbuf, MANDOC_FLAGS, 0644, DB_BTREE, &info); |
perror(fbbuf); |
idx = dbopen(ibuf, MANDOC_FLAGS, 0644, DB_RECNO, NULL); |
exit((int)MANDOCLEVEL_SYSERR); |
|
} |
|
|
|
idx = dbopen(ibbuf, MANDOC_FLAGS, 0644, DB_RECNO, NULL); |
|
|
|
if (NULL == db) { |
if (NULL == db) { |
perror(ibbuf); |
perror(fbuf); |
(*db->close)(db); |
goto out; |
exit((int)MANDOCLEVEL_SYSERR); |
} else if (NULL == db) { |
|
perror(ibuf); |
|
goto out; |
} |
} |
|
|
/* |
/* |
Line 349 main(int argc, char *argv[]) |
|
Line 336 main(int argc, char *argv[]) |
|
|
|
mp = mparse_alloc(MPARSE_AUTO, MANDOCLEVEL_FATAL, NULL, NULL); |
mp = mparse_alloc(MPARSE_AUTO, MANDOCLEVEL_FATAL, NULL, NULL); |
|
|
rec = 1; |
|
hash = NULL; |
|
|
|
memset(&buf, 0, sizeof(struct buf)); |
|
memset(&dbuf, 0, sizeof(struct buf)); |
|
|
|
buf.size = dbuf.size = MANDOC_BUFSZ; |
buf.size = dbuf.size = MANDOC_BUFSZ; |
|
|
buf.cp = mandoc_malloc(buf.size); |
buf.cp = mandoc_malloc(buf.size); |
dbuf.cp = mandoc_malloc(dbuf.size); |
dbuf.cp = mandoc_malloc(dbuf.size); |
|
|
|
rec = 1; |
|
|
while (NULL != (fn = *argv++)) { |
while (NULL != (fn = *argv++)) { |
mparse_reset(mp); |
mparse_reset(mp); |
|
hash_reset(&hash); |
|
|
/* Initialise the in-memory hash of keywords. */ |
|
|
|
if (hash) |
|
(*hash->close)(hash); |
|
|
|
hash = dbopen(NULL, MANDOC_FLAGS, 0644, DB_HASH, NULL); |
|
|
|
if (NULL == hash) { |
|
perror("hash"); |
|
exit((int)MANDOCLEVEL_SYSERR); |
|
} |
|
|
|
/* Parse and get (non-empty) AST. */ |
|
|
|
if (mparse_readfd(mp, -1, fn) >= MANDOCLEVEL_FATAL) { |
if (mparse_readfd(mp, -1, fn) >= MANDOCLEVEL_FATAL) { |
fprintf(stderr, "%s: Parse failure\n", fn); |
fprintf(stderr, "%s: Parse failure\n", fn); |
continue; |
continue; |
} |
} |
|
|
mparse_result(mp, &mdoc, &man); |
mparse_result(mp, &mdoc, &man); |
|
|
if (NULL == mdoc && NULL == man) |
if (NULL == mdoc && NULL == man) |
continue; |
continue; |
|
|
msec = NULL != mdoc ? |
msec = NULL != mdoc ? |
mdoc_meta(mdoc)->msec : |
mdoc_meta(mdoc)->msec : man_meta(man)->msec; |
man_meta(man)->msec; |
|
mtitle = NULL != mdoc ? |
mtitle = NULL != mdoc ? |
mdoc_meta(mdoc)->title : |
mdoc_meta(mdoc)->title : man_meta(man)->title; |
man_meta(man)->title; |
arch = NULL != mdoc ? |
arch = NULL != mdoc ? mdoc_meta(mdoc)->arch : NULL; |
mdoc_meta(mdoc)->arch : ""; |
|
|
/* |
/* |
* The index record value consists of a nil-terminated |
* The index record value consists of a nil-terminated |
Line 407 main(int argc, char *argv[]) |
|
Line 374 main(int argc, char *argv[]) |
|
buf_appendb(&dbuf, fn, strlen(fn) + 1); |
buf_appendb(&dbuf, fn, strlen(fn) + 1); |
buf_appendb(&dbuf, msec, strlen(msec) + 1); |
buf_appendb(&dbuf, msec, strlen(msec) + 1); |
buf_appendb(&dbuf, mtitle, strlen(mtitle) + 1); |
buf_appendb(&dbuf, mtitle, strlen(mtitle) + 1); |
buf_appendb(&dbuf, arch ? arch : "", |
buf_appendb(&dbuf, arch, strlen(arch) + 1); |
arch ? strlen(arch) + 1 : 1); |
|
|
|
sv = dbuf.len; |
sv = dbuf.len; |
|
|
Line 437 main(int argc, char *argv[]) |
|
Line 403 main(int argc, char *argv[]) |
|
val.data = vbuf; |
val.data = vbuf; |
|
|
if (verb > 1) |
if (verb > 1) |
printf("%s: Keyword %s (%zu): 0x%x\n", |
printf("%s: Keyword %s: 0x%x\n", |
fn, (char *)key.data, key.size, |
fn, (char *)key.data, |
*(int *)val.data); |
*(int *)val.data); |
|
|
dbt_put(db, fbbuf, &key, &val); |
dbt_put(db, fbuf, &key, &val); |
|
|
} |
} |
|
|
if (ch < 0) { |
if (ch < 0) { |
perror("hash"); |
perror("hash"); |
exit((int)MANDOCLEVEL_SYSERR); |
exit((int)MANDOCLEVEL_SYSERR); |
Line 467 main(int argc, char *argv[]) |
|
Line 432 main(int argc, char *argv[]) |
|
if (verb > 0) |
if (verb > 0) |
printf("%s: Indexed\n", fn); |
printf("%s: Indexed\n", fn); |
|
|
dbt_put(idx, ibbuf, &key, &val); |
dbt_put(idx, ibuf, &key, &val); |
rec++; |
rec++; |
} |
} |
|
|
(*db->close)(db); |
ec = MANDOCLEVEL_OK; |
(*idx->close)(idx); |
|
|
|
|
out: |
|
if (db) |
|
(*db->close)(db); |
|
if (idx) |
|
(*idx->close)(idx); |
if (hash) |
if (hash) |
(*hash->close)(hash); |
(*hash->close)(hash); |
|
if (mp) |
|
mparse_free(mp); |
|
|
mparse_free(mp); |
|
|
|
free(buf.cp); |
free(buf.cp); |
free(dbuf.cp); |
free(dbuf.cp); |
|
|
/* Atomically replace the file with our temporary one. */ |
return((int)ec); |
|
|
if (-1 == rename(fbbuf, fbuf)) |
|
perror(fbuf); |
|
if (-1 == rename(ibbuf, ibuf)) |
|
perror(fbuf); |
|
|
|
return((int)MANDOCLEVEL_OK); |
|
} |
} |
|
|
/* |
/* |
Line 567 pmdoc_An(MDOC_ARGS) |
|
Line 529 pmdoc_An(MDOC_ARGS) |
|
|
|
buf_appendmdoc(buf, n->child, 0); |
buf_appendmdoc(buf, n->child, 0); |
hash_put(hash, buf, TYPE_AUTHOR); |
hash_put(hash, buf, TYPE_AUTHOR); |
|
} |
|
|
|
static void |
|
hash_reset(DB **db) |
|
{ |
|
DB *hash; |
|
|
|
if (NULL != (hash = *db)) |
|
(*hash->close)(hash); |
|
|
|
*db = dbopen(NULL, MANDOC_FLAGS, 0644, DB_HASH, NULL); |
|
if (NULL == *db) { |
|
perror("hash"); |
|
exit((int)MANDOCLEVEL_SYSERR); |
|
} |
} |
} |
|
|
/* ARGSUSED */ |
/* ARGSUSED */ |