=================================================================== RCS file: /cvs/mandoc/main.c,v retrieving revision 1.216 retrieving revision 1.222 diff -u -p -r1.216 -r1.222 --- mandoc/main.c 2015/01/16 21:15:05 1.216 +++ mandoc/main.c 2015/02/27 16:02:10 1.222 @@ -1,4 +1,4 @@ -/* $Id: main.c,v 1.216 2015/01/16 21:15:05 schwarze Exp $ */ +/* $Id: main.c,v 1.222 2015/02/27 16:02:10 schwarze Exp $ */ /* * Copyright (c) 2008-2012 Kristaps Dzonsons * Copyright (c) 2010-2012, 2014, 2015 Ingo Schwarze @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -83,7 +84,6 @@ struct curparse { char outopts[BUFSIZ]; /* buf of output opts */ }; -#if HAVE_SQLITE3 static int fs_lookup(const struct manpaths *, size_t ipath, const char *, const char *, const char *, @@ -91,7 +91,6 @@ static int fs_lookup(const struct manpaths *, static void fs_search(const struct mansearch *, const struct manpaths *, int, char**, struct manpage **, size_t *); -#endif static int koptions(int *, char *); #if HAVE_SQLITE3 int mandocdb(int, char**); @@ -101,13 +100,10 @@ static void mmsg(enum mandocerr, enum mandoclevel, const char *, int, int, const char *); static void parse(struct curparse *, int, const char *, enum mandoclevel *); -#if HAVE_SQLITE3 static enum mandoclevel passthrough(const char *, int, int); -#endif static void spawn_pager(void); static int toptions(struct curparse *, char *); static void usage(enum argmode) __attribute__((noreturn)); -static void version(void) __attribute__((noreturn)); static int woptions(struct curparse *, char *); static const int sec_prios[] = {1, 4, 5, 8, 6, 3, 7, 2, 9}; @@ -125,13 +121,11 @@ main(int argc, char *argv[]) char *auxpaths; char *defos; unsigned char *uc; -#if HAVE_SQLITE3 struct manpage *res, *resp; char *conf_file, *defpaths; size_t isec, i, sz; int prio, best_prio, synopsis_only; char sec; -#endif enum mandoclevel rc, rctmp; enum outmode outmode; int fd; @@ -140,8 +134,9 @@ main(int argc, char *argv[]) int options; int c; - progname = strrchr(argv[0], '/'); - if (progname == NULL) + if (argc < 1) + progname = "mandoc"; + else if ((progname = strrchr(argv[0], '/')) == NULL) progname = argv[0]; else ++progname; @@ -154,9 +149,7 @@ main(int argc, char *argv[]) /* Search options. */ memset(&paths, 0, sizeof(struct manpaths)); -#if HAVE_SQLITE3 conf_file = defpaths = NULL; -#endif auxpaths = NULL; memset(&search, 0, sizeof(struct mansearch)); @@ -183,9 +176,7 @@ main(int argc, char *argv[]) use_pager = 1; show_usage = 0; -#if HAVE_SQLITE3 synopsis_only = 0; -#endif outmode = OUTMODE_DEF; while (-1 != (c = getopt(argc, argv, @@ -195,9 +186,7 @@ main(int argc, char *argv[]) outmode = OUTMODE_ALL; break; case 'C': -#if HAVE_SQLITE3 conf_file = optarg; -#endif break; case 'c': use_pager = 0; @@ -207,9 +196,7 @@ main(int argc, char *argv[]) break; case 'h': (void)strlcat(curp.outopts, "synopsis,", BUFSIZ); -#if HAVE_SQLITE3 synopsis_only = 1; -#endif use_pager = 0; outmode = OUTMODE_ALL; break; @@ -243,9 +230,7 @@ main(int argc, char *argv[]) outmode = OUTMODE_ALL; break; case 'M': -#if HAVE_SQLITE3 defpaths = optarg; -#endif break; case 'm': auxpaths = optarg; @@ -272,9 +257,6 @@ main(int argc, char *argv[]) case 'w': outmode = OUTMODE_FLN; break; - case 'V': - version(); - /* NOTREACHED */ default: show_usage = 1; break; @@ -303,11 +285,11 @@ main(int argc, char *argv[]) /* Parse arguments. */ - argc -= optind; - argv += optind; -#if HAVE_SQLITE3 + if (argc > 0) { + argc -= optind; + argv += optind; + } resp = NULL; -#endif /* * Quirks for help(1) @@ -340,7 +322,6 @@ main(int argc, char *argv[]) /* man(1), whatis(1), apropos(1) */ if (search.argmode != ARG_FILE) { -#if HAVE_SQLITE3 if (argc == 0) usage(search.argmode); @@ -351,9 +332,18 @@ main(int argc, char *argv[]) /* Access the mandoc database. */ manpath_parse(&paths, conf_file, defpaths, auxpaths); +#if HAVE_SQLITE3 mansearch_setup(1); if( ! mansearch(&search, &paths, argc, argv, &res, &sz)) usage(search.argmode); +#else + if (search.argmode != ARG_NAME) { + fputs("mandoc: database support not compiled in\n", + stderr); + return((int)MANDOCLEVEL_BADARG); + } + sz = 0; +#endif if (sz == 0 && search.argmode == ARG_NAME) fs_search(&search, &paths, argc, argv, &res, &sz); @@ -407,11 +397,6 @@ main(int argc, char *argv[]) if (outmode == OUTMODE_FLN || outmode == OUTMODE_LST) goto out; -#else - fputs("mandoc: database support not compiled in\n", - stderr); - return((int)MANDOCLEVEL_BADARG); -#endif } /* mandoc(1) */ @@ -429,18 +414,15 @@ main(int argc, char *argv[]) if (OUTT_MAN == curp.outtype) mparse_keep(curp.mp); - if (argc == 0) { + if (argc < 1) { if (use_pager && isatty(STDOUT_FILENO)) spawn_pager(); parse(&curp, STDIN_FILENO, "", &rc); } - while (argc) { + while (argc > 0) { rctmp = mparse_open(curp.mp, &fd, -#if HAVE_SQLITE3 - resp != NULL ? resp->file : -#endif - *argv); + resp != NULL ? resp->file : *argv); if (rc < rctmp) rc = rctmp; @@ -449,11 +431,8 @@ main(int argc, char *argv[]) spawn_pager(); use_pager = 0; -#if HAVE_SQLITE3 if (resp == NULL) -#endif parse(&curp, fd, *argv, &rc); -#if HAVE_SQLITE3 else if (resp->form & FORM_SRC) { /* For .so only; ignore failure. */ chdir(paths.paths[resp->ipath]); @@ -464,7 +443,6 @@ main(int argc, char *argv[]) if (rc < rctmp) rc = rctmp; } -#endif rctmp = mparse_wait(curp.mp); if (rc < rctmp) @@ -477,11 +455,9 @@ main(int argc, char *argv[]) if (MANDOCLEVEL_OK != rc && curp.wstop) break; -#if HAVE_SQLITE3 if (resp != NULL) resp++; else -#endif argv++; if (--argc) mparse_reset(curp.mp); @@ -492,14 +468,14 @@ main(int argc, char *argv[]) mparse_free(curp.mp); mchars_free(curp.mchars); -#if HAVE_SQLITE3 out: if (search.argmode != ARG_FILE) { manpath_free(&paths); +#if HAVE_SQLITE3 mansearch_free(res, sz); mansearch_setup(0); - } #endif + } free(defos); @@ -507,37 +483,29 @@ out: } static void -version(void) -{ - - printf("mandoc %s\n", VERSION); - exit((int)MANDOCLEVEL_OK); -} - -static void usage(enum argmode argmode) { switch (argmode) { case ARG_FILE: - fputs("usage: mandoc [-acfhklV] [-Ios=name] " + fputs("usage: mandoc [-acfhkl] [-Ios=name] " "[-Kencoding] [-mformat] [-Ooption]\n" "\t [-Toutput] [-Wlevel] [file ...]\n", stderr); break; case ARG_NAME: - fputs("usage: man [-acfhklVw] [-C file] [-I os=name] " + fputs("usage: man [-acfhklw] [-C file] [-I os=name] " "[-K encoding] [-M path] [-m path]\n" "\t [-O option=value] [-S subsection] [-s section] " "[-T output] [-W level]\n" "\t [section] name ...\n", stderr); break; case ARG_WORD: - fputs("usage: whatis [-acfhklVw] [-C file] " + fputs("usage: whatis [-acfhklw] [-C file] " "[-M path] [-m path] [-O outkey] [-S arch]\n" "\t [-s section] name ...\n", stderr); break; case ARG_EXPR: - fputs("usage: apropos [-acfhklVw] [-C file] " + fputs("usage: apropos [-acfhklw] [-C file] " "[-M path] [-m path] [-O outkey] [-S arch]\n" "\t [-s section] expression ...\n", stderr); break; @@ -545,22 +513,21 @@ usage(enum argmode argmode) exit((int)MANDOCLEVEL_BADARG); } -#if HAVE_SQLITE3 static int fs_lookup(const struct manpaths *paths, size_t ipath, const char *sec, const char *arch, const char *name, struct manpage **res, size_t *ressz) { + glob_t globinfo; struct manpage *page; char *file; - int form; + int form, globres; + form = FORM_SRC; mandoc_asprintf(&file, "%s/man%s/%s.%s", paths->paths[ipath], sec, name, sec); - if (access(file, R_OK) != -1) { - form = FORM_SRC; + if (access(file, R_OK) != -1) goto found; - } free(file); mandoc_asprintf(&file, "%s/cat%s/%s.0", @@ -574,19 +541,31 @@ fs_lookup(const struct manpaths *paths, size_t ipath, if (arch != NULL) { mandoc_asprintf(&file, "%s/man%s/%s/%s.%s", paths->paths[ipath], sec, arch, name, sec); - if (access(file, R_OK) != -1) { - form = FORM_SRC; + if (access(file, R_OK) != -1) goto found; - } free(file); } - return(0); + mandoc_asprintf(&file, "%s/man%s/%s.*", + paths->paths[ipath], sec, name); + globres = glob(file, 0, NULL, &globinfo); + if (globres != 0 && globres != GLOB_NOMATCH) + fprintf(stderr, "%s: %s: glob: %s\n", + progname, file, strerror(errno)); + free(file); + if (globres == 0) + file = mandoc_strdup(*globinfo.gl_pathv); + globfree(&globinfo); + if (globres != 0) + return(0); + found: +#if HAVE_SQLITE3 fprintf(stderr, "%s: outdated mandoc.db lacks %s(%s) entry,\n" " consider running # makewhatis %s\n", progname, name, sec, paths->paths[ipath]); - +#endif + *res = mandoc_reallocarray(*res, ++*ressz, sizeof(struct manpage)); page = *res + (*ressz - 1); page->file = file; @@ -635,7 +614,6 @@ fs_search(const struct mansearch *cfg, const struct ma argc--; } } -#endif static void parse(struct curparse *curp, int fd, const char *file, @@ -742,7 +720,6 @@ cleanup: *level = rc; } -#if HAVE_SQLITE3 static enum mandoclevel passthrough(const char *file, int fd, int synopsis_only) { @@ -808,7 +785,6 @@ fail: progname, file, syscall, strerror(errno)); return(MANDOCLEVEL_SYSERR); } -#endif static int koptions(int *options, char *arg) @@ -889,14 +865,15 @@ static int woptions(struct curparse *curp, char *arg) { char *v, *o; - const char *toks[6]; + const char *toks[7]; toks[0] = "stop"; toks[1] = "all"; toks[2] = "warning"; toks[3] = "error"; - toks[4] = "fatal"; - toks[5] = NULL; + toks[4] = "unsupp"; + toks[5] = "fatal"; + toks[6] = NULL; while (*arg) { o = arg; @@ -913,6 +890,9 @@ woptions(struct curparse *curp, char *arg) curp->wlevel = MANDOCLEVEL_ERROR; break; case 4: + curp->wlevel = MANDOCLEVEL_UNSUPP; + break; + case 5: curp->wlevel = MANDOCLEVEL_BADARG; break; default: