version 1.53, 2015/01/20 18:21:18 |
version 1.56, 2015/03/27 17:37:25 |
|
|
* purpose with or without fee is hereby granted, provided that the above |
* purpose with or without fee is hereby granted, provided that the above |
* copyright notice and this permission notice appear in all copies. |
* copyright notice and this permission notice appear in all copies. |
* |
* |
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES |
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR |
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
|
|
#include <errno.h> |
#include <errno.h> |
#include <fcntl.h> |
#include <fcntl.h> |
#include <getopt.h> |
#include <getopt.h> |
|
#include <glob.h> |
#include <limits.h> |
#include <limits.h> |
#include <regex.h> |
#include <regex.h> |
#include <stdio.h> |
#include <stdio.h> |
|
|
|
|
#include "mandoc.h" |
#include "mandoc.h" |
#include "mandoc_aux.h" |
#include "mandoc_aux.h" |
#include "manpath.h" |
#include "manconf.h" |
#include "mansearch.h" |
#include "mansearch.h" |
|
|
extern int mansearch_keymax; |
extern int mansearch_keymax; |
Line 194 mansearch(const struct mansearch *search, |
|
Line 195 mansearch(const struct mansearch *search, |
|
if (NULL == (e = exprcomp(search, argc, argv))) |
if (NULL == (e = exprcomp(search, argc, argv))) |
goto out; |
goto out; |
|
|
outbit = 0; |
|
if (NULL != search->outkey) { |
if (NULL != search->outkey) { |
|
outbit = TYPE_Nd; |
for (indexbit = 0, iterbit = 1; |
for (indexbit = 0, iterbit = 1; |
indexbit < mansearch_keymax; |
indexbit < mansearch_keymax; |
indexbit++, iterbit <<= 1) { |
indexbit++, iterbit <<= 1) { |
Line 205 mansearch(const struct mansearch *search, |
|
Line 206 mansearch(const struct mansearch *search, |
|
break; |
break; |
} |
} |
} |
} |
} |
} else |
|
outbit = 0; |
|
|
/* |
/* |
* Save a descriptor to the current working directory. |
* Save a descriptor to the current working directory. |
Line 412 buildnames(const struct mansearch *search, struct manp |
|
Line 414 buildnames(const struct mansearch *search, struct manp |
|
sqlite3 *db, sqlite3_stmt *s, |
sqlite3 *db, sqlite3_stmt *s, |
uint64_t pageid, const char *path, int form) |
uint64_t pageid, const char *path, int form) |
{ |
{ |
char *newnames, *prevsec, *prevarch; |
glob_t globinfo; |
|
char *firstname, *newnames, *prevsec, *prevarch; |
const char *oldnames, *sep1, *name, *sec, *sep2, *arch, *fsec; |
const char *oldnames, *sep1, *name, *sec, *sep2, *arch, *fsec; |
size_t i; |
size_t i; |
int c; |
int c, globres; |
|
|
mpage->file = NULL; |
mpage->file = NULL; |
mpage->names = NULL; |
mpage->names = NULL; |
prevsec = prevarch = NULL; |
firstname = prevsec = prevarch = NULL; |
i = 1; |
i = 1; |
SQL_BIND_INT64(db, s, i, pageid); |
SQL_BIND_INT64(db, s, i, pageid); |
while (SQLITE_ROW == (c = sqlite3_step(s))) { |
while (SQLITE_ROW == (c = sqlite3_step(s))) { |
Line 494 buildnames(const struct mansearch *search, struct manp |
|
Line 497 buildnames(const struct mansearch *search, struct manp |
|
sep2 = *arch == '\0' ? "" : "/"; |
sep2 = *arch == '\0' ? "" : "/"; |
mandoc_asprintf(&mpage->file, "%s/%s%s%s%s/%s.%s", |
mandoc_asprintf(&mpage->file, "%s/%s%s%s%s/%s.%s", |
path, sep1, sec, sep2, arch, name, fsec); |
path, sep1, sec, sep2, arch, name, fsec); |
|
if (access(mpage->file, R_OK) != -1) |
|
continue; |
|
|
|
/* Handle unusual file name extensions. */ |
|
|
|
if (firstname == NULL) |
|
firstname = mpage->file; |
|
else |
|
free(mpage->file); |
|
mandoc_asprintf(&mpage->file, "%s/%s%s%s%s/%s.*", |
|
path, sep1, sec, sep2, arch, name); |
|
globres = glob(mpage->file, 0, NULL, &globinfo); |
|
free(mpage->file); |
|
mpage->file = globres ? NULL : |
|
mandoc_strdup(*globinfo.gl_pathv); |
|
globfree(&globinfo); |
} |
} |
if (c != SQLITE_DONE) |
if (c != SQLITE_DONE) |
fprintf(stderr, "%s\n", sqlite3_errmsg(db)); |
fprintf(stderr, "%s\n", sqlite3_errmsg(db)); |
sqlite3_reset(s); |
sqlite3_reset(s); |
|
|
|
/* If none of the files is usable, use the first name. */ |
|
|
|
if (mpage->file == NULL) |
|
mpage->file = firstname; |
|
else if (mpage->file != firstname) |
|
free(firstname); |
|
|
/* Append one final section to the names. */ |
/* Append one final section to the names. */ |
|
|