version 1.355, 2021/06/02 18:28:19 |
version 1.358, 2021/09/04 22:38:46 |
Line 94 struct outstate { |
|
Line 94 struct outstate { |
|
int mandocdb(int, char *[]); |
int mandocdb(int, char *[]); |
|
|
static void check_xr(struct manpaths *); |
static void check_xr(struct manpaths *); |
static int fs_lookup(const struct manpaths *, |
static void fs_append(char **, size_t, int, |
size_t ipath, const char *, |
size_t, const char *, enum form, |
const char *, const char *, |
|
struct manpage **, size_t *); |
struct manpage **, size_t *); |
|
static int fs_lookup(const struct manpaths *, size_t, |
|
const char *, const char *, const char *, |
|
struct manpage **, size_t *); |
static int fs_search(const struct mansearch *, |
static int fs_search(const struct mansearch *, |
const struct manpaths *, const char *, |
const struct manpaths *, const char *, |
struct manpage **, size_t *); |
struct manpage **, size_t *); |
Line 130 main(int argc, char *argv[]) |
|
Line 132 main(int argc, char *argv[]) |
|
struct mparse *mp; /* Opaque parser object. */ |
struct mparse *mp; /* Opaque parser object. */ |
const char *conf_file; /* -C: alternate config file. */ |
const char *conf_file; /* -C: alternate config file. */ |
const char *os_s; /* -I: Operating system for display. */ |
const char *os_s; /* -I: Operating system for display. */ |
const char *progname, *sec; |
const char *progname, *sec, *ep; |
char *defpaths; /* -M: override manpaths. */ |
char *defpaths; /* -M: override manpaths. */ |
char *auxpaths; /* -m: additional manpaths. */ |
char *auxpaths; /* -m: additional manpaths. */ |
char *oarg; /* -O: output option string. */ |
char *oarg; /* -O: output option string. */ |
Line 534 main(int argc, char *argv[]) |
|
Line 536 main(int argc, char *argv[]) |
|
sec++; /* Prefer without suffix. */ |
sec++; /* Prefer without suffix. */ |
if (*sec != '/') |
if (*sec != '/') |
prio += 10; /* Wrong dir name. */ |
prio += 10; /* Wrong dir name. */ |
if (search.sec != NULL && |
if (search.sec != NULL) { |
(strlen(sec) <= ssz + 3 || |
ep = strchr(sec, '\0'); |
strcmp(sec + strlen(sec) - ssz, |
if (ep - sec > 3 && |
search.sec) != 0)) |
strncmp(ep - 3, ".gz", 3) == 0) |
prio += 20; /* Wrong file ext. */ |
ep -= 3; |
|
if ((size_t)(ep - sec) < ssz + 3 || |
|
strncmp(ep - ssz, search.sec, |
|
ssz) != 0) /* Wrong file */ |
|
prio += 20; /* extension. */ |
|
} |
if (prio >= best_prio) |
if (prio >= best_prio) |
continue; |
continue; |
best_prio = prio; |
best_prio = prio; |
Line 700 glob_esc(char **dst, const char *src, const char *suff |
|
Line 707 glob_esc(char **dst, const char *src, const char *suff |
|
*(*dst)++ = *suffix++; |
*(*dst)++ = *suffix++; |
} |
} |
|
|
|
static void |
|
fs_append(char **file, size_t filesz, int copy, size_t ipath, |
|
const char *sec, enum form form, struct manpage **res, size_t *ressz) |
|
{ |
|
struct manpage *page; |
|
|
|
*res = mandoc_reallocarray(*res, *ressz + filesz, sizeof(**res)); |
|
page = *res + *ressz; |
|
*ressz += filesz; |
|
for (;;) { |
|
page->file = copy ? mandoc_strdup(*file) : *file; |
|
page->names = NULL; |
|
page->output = NULL; |
|
page->bits = NAME_FILE & NAME_MASK; |
|
page->ipath = ipath; |
|
page->sec = (*sec >= '1' && *sec <= '9') ? *sec - '1' + 1 : 10; |
|
page->form = form; |
|
if (--filesz == 0) |
|
break; |
|
file++; |
|
page++; |
|
} |
|
} |
|
|
static int |
static int |
fs_lookup(const struct manpaths *paths, size_t ipath, |
fs_lookup(const struct manpaths *paths, size_t ipath, |
const char *sec, const char *arch, const char *name, |
const char *sec, const char *arch, const char *name, |
Line 707 fs_lookup(const struct manpaths *paths, size_t ipath, |
|
Line 738 fs_lookup(const struct manpaths *paths, size_t ipath, |
|
{ |
{ |
struct stat sb; |
struct stat sb; |
glob_t globinfo; |
glob_t globinfo; |
struct manpage *page; |
char *file, *cp, secnum[2]; |
char *file, *cp; |
|
int globres; |
int globres; |
enum form form; |
enum form form; |
|
|
const char *const slman = "/man"; |
const char *const slman = "/man"; |
const char *const slash = "/"; |
const char *const slash = "/"; |
const char *const sglob = ".[01-9]*"; |
const char *const sglob = ".[01-9]*"; |
|
const char *const dot = "."; |
|
const char *const aster = "*"; |
|
|
|
memset(&globinfo, 0, sizeof(globinfo)); |
form = FORM_SRC; |
form = FORM_SRC; |
|
|
mandoc_asprintf(&file, "%s/man%s/%s.%s", |
mandoc_asprintf(&file, "%s/man%s/%s.%s", |
paths->paths[ipath], sec, name, sec); |
paths->paths[ipath], sec, name, sec); |
if (stat(file, &sb) != -1) |
if (stat(file, &sb) != -1) |
Line 751 fs_lookup(const struct manpaths *paths, size_t ipath, |
|
Line 785 fs_lookup(const struct manpaths *paths, size_t ipath, |
|
mandoc_msg(MANDOCERR_GLOB, 0, 0, |
mandoc_msg(MANDOCERR_GLOB, 0, 0, |
"%s: %s", file, strerror(errno)); |
"%s: %s", file, strerror(errno)); |
free(file); |
free(file); |
|
file = NULL; |
if (globres == 0) |
if (globres == 0) |
file = mandoc_strdup(*globinfo.gl_pathv); |
goto found; |
globfree(&globinfo); |
globfree(&globinfo); |
if (globres == 0) { |
|
if (stat(file, &sb) != -1) |
if (sec[1] != '\0' && *ressz == 0) { |
goto found; |
secnum[0] = sec[0]; |
|
secnum[1] = '\0'; |
|
cp = file = mandoc_malloc(strlen(paths->paths[ipath]) * 2 + |
|
strlen(slman) + strlen(secnum) * 2 + strlen(slash) + |
|
strlen(name) * 2 + strlen(dot) + |
|
strlen(sec) * 2 + strlen(aster) + 1); |
|
glob_esc(&cp, paths->paths[ipath], slman); |
|
glob_esc(&cp, secnum, slash); |
|
glob_esc(&cp, name, dot); |
|
glob_esc(&cp, sec, aster); |
|
*cp = '\0'; |
|
globres = glob(file, 0, NULL, &globinfo); |
|
if (globres != 0 && globres != GLOB_NOMATCH) |
|
mandoc_msg(MANDOCERR_GLOB, 0, 0, |
|
"%s: %s", file, strerror(errno)); |
free(file); |
free(file); |
|
file = NULL; |
|
if (globres == 0) |
|
goto found; |
|
globfree(&globinfo); |
} |
} |
|
|
if (res != NULL || ipath + 1 != paths->sz) |
if (res != NULL || ipath + 1 != paths->sz) |
return -1; |
return -1; |
|
|
Line 770 fs_lookup(const struct manpaths *paths, size_t ipath, |
|
Line 824 fs_lookup(const struct manpaths *paths, size_t ipath, |
|
found: |
found: |
warnx("outdated mandoc.db lacks %s(%s) entry, run %s %s", |
warnx("outdated mandoc.db lacks %s(%s) entry, run %s %s", |
name, sec, BINM_MAKEWHATIS, paths->paths[ipath]); |
name, sec, BINM_MAKEWHATIS, paths->paths[ipath]); |
if (res == NULL) { |
if (res == NULL) |
free(file); |
free(file); |
return 0; |
else if (file == NULL) |
} |
fs_append(globinfo.gl_pathv, globinfo.gl_pathc, 1, |
*res = mandoc_reallocarray(*res, ++*ressz, sizeof(**res)); |
ipath, sec, form, res, ressz); |
page = *res + (*ressz - 1); |
else |
page->file = file; |
fs_append(&file, 1, 0, ipath, sec, form, res, ressz); |
page->names = NULL; |
globfree(&globinfo); |
page->output = NULL; |
|
page->bits = NAME_FILE & NAME_MASK; |
|
page->ipath = ipath; |
|
page->sec = (*sec >= '1' && *sec <= '9') ? *sec - '1' + 1 : 10; |
|
page->form = form; |
|
return 0; |
return 0; |
} |
} |
|
|
Line 967 parse(struct mparse *mp, int fd, const char *file, |
|
Line 1016 parse(struct mparse *mp, int fd, const char *file, |
|
case OUTT_LOCALE: |
case OUTT_LOCALE: |
case OUTT_PS: |
case OUTT_PS: |
terminal_man(outst->outdata, meta); |
terminal_man(outst->outdata, meta); |
|
break; |
|
case OUTT_MARKDOWN: |
|
mandoc_msg(MANDOCERR_MAN_TMARKDOWN, 0, 0, NULL); |
break; |
break; |
default: |
default: |
break; |
break; |