diff options
author | uqs <uqs@FreeBSD.org> | 2014-01-31 19:59:03 +0000 |
---|---|---|
committer | uqs <uqs@FreeBSD.org> | 2014-01-31 19:59:03 +0000 |
commit | 7ae17de732546145e4a582d503a54b9870ada39c (patch) | |
tree | 23b6a81a1df09aafea64657d4d56bc50e677df33 /apropos.c | |
parent | c2dfbbd38125b2ba3608eb48ca3b5e2e23f819df (diff) | |
download | FreeBSD-src-7ae17de732546145e4a582d503a54b9870ada39c.zip FreeBSD-src-7ae17de732546145e4a582d503a54b9870ada39c.tar.gz |
Import mdocml version 1.12.3
Diffstat (limited to 'apropos.c')
-rw-r--r-- | apropos.c | 137 |
1 files changed, 27 insertions, 110 deletions
@@ -1,4 +1,4 @@ -/* $Id: apropos.c,v 1.30 2012/03/24 02:18:51 kristaps Exp $ */ +/* $Id: apropos.c,v 1.27.2.1 2013/09/17 23:23:10 schwarze Exp $ */ /* * Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org> @@ -25,40 +25,29 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <unistd.h> #include "apropos_db.h" #include "mandoc.h" #include "manpath.h" -#define SINGLETON(_res, _sz) \ - ((_sz) && (_res)[0].matched && \ - (1 == (_sz) || 0 == (_res)[1].matched)) -#define EMPTYSET(_res, _sz) \ - ((0 == (_sz)) || 0 == (_res)[0].matched) - static int cmp(const void *, const void *); static void list(struct res *, size_t, void *); -static void usage(void); static char *progname; int main(int argc, char *argv[]) { - int ch, rc, whatis, usecat; + int ch, rc, whatis; struct res *res; struct manpaths paths; - const char *prog; - pid_t pid; - char path[PATH_MAX]; - int fds[2]; - size_t terms, ressz, sz; + size_t terms, ressz; struct opts opts; struct expr *e; - char *defpaths, *auxpaths, *conf_file, *cp; - extern int optind; + char *defpaths, *auxpaths; + char *conf_file; extern char *optarg; + extern int optind; progname = strrchr(argv[0], '/'); if (progname == NULL) @@ -66,18 +55,16 @@ main(int argc, char *argv[]) else ++progname; - whatis = 0 == strncmp(progname, "whatis", 6); + whatis = (0 == strncmp(progname, "whatis", 6)); memset(&paths, 0, sizeof(struct manpaths)); memset(&opts, 0, sizeof(struct opts)); - usecat = 0; ressz = 0; res = NULL; auxpaths = defpaths = NULL; conf_file = NULL; e = NULL; - path[0] = '\0'; while (-1 != (ch = getopt(argc, argv, "C:M:m:S:s:"))) switch (ch) { @@ -97,15 +84,14 @@ main(int argc, char *argv[]) opts.cat = optarg; break; default: - usage(); - return(EXIT_FAILURE); + goto usage; } argc -= optind; argv += optind; - if (0 == argc) - return(EXIT_SUCCESS); + if (0 == argc) + goto usage; rc = 0; @@ -123,63 +109,21 @@ main(int argc, char *argv[]) (paths.sz, paths.paths, &opts, e, terms, NULL, &ressz, &res, list); - terms = 1; - if (0 == rc) { fprintf(stderr, "%s: Bad database\n", progname); goto out; - } else if ( ! isatty(STDOUT_FILENO) || EMPTYSET(res, ressz)) - goto out; - - if ( ! SINGLETON(res, ressz)) { - printf("Which manpage would you like [1]? "); - fflush(stdout); - if (NULL != (cp = fgetln(stdin, &sz)) && - sz > 1 && '\n' == cp[--sz]) { - if ((ch = atoi(cp)) <= 0) - goto out; - terms = (size_t)ch; - } } - if (--terms < ressz && res[terms].matched) { - chdir(paths.paths[res[terms].volume]); - strlcpy(path, res[terms].file, PATH_MAX); - usecat = RESTYPE_CAT == res[terms].type; - } out: manpath_free(&paths); resfree(res, ressz); exprfree(e); + return(rc ? EXIT_SUCCESS : EXIT_FAILURE); - if ('\0' == path[0]) - return(rc ? EXIT_SUCCESS : EXIT_FAILURE); - - if (-1 == pipe(fds)) { - perror(NULL); - exit(EXIT_FAILURE); - } - - if (-1 == (pid = fork())) { - perror(NULL); - exit(EXIT_FAILURE); - } else if (pid > 0) { - dup2(fds[0], STDIN_FILENO); - close(fds[1]); - prog = NULL != getenv("MANPAGER") ? - getenv("MANPAGER") : - (NULL != getenv("PAGER") ? - getenv("PAGER") : "more"); - execlp(prog, prog, (char *)NULL); - perror(prog); - return(EXIT_FAILURE); - } - - dup2(fds[1], STDOUT_FILENO); - close(fds[0]); - prog = usecat ? "cat" : "mandoc"; - execlp(prog, prog, path, (char *)NULL); - perror(prog); +usage: + fprintf(stderr, "usage: %s [-C file] [-M path] [-m path] " + "[-S arch] [-s section]%s ...\n", progname, + whatis ? " name" : "\n expression"); return(EXIT_FAILURE); } @@ -191,49 +135,22 @@ list(struct res *res, size_t sz, void *arg) qsort(res, sz, sizeof(struct res), cmp); - if (EMPTYSET(res, sz) || SINGLETON(res, sz)) - return; - - if ( ! isatty(STDOUT_FILENO)) - for (i = 0; i < sz && res[i].matched; i++) - printf("%s(%s%s%s) - %.70s\n", - res[i].title, res[i].cat, - *res[i].arch ? "/" : "", - *res[i].arch ? res[i].arch : "", - res[i].desc); - else - for (i = 0; i < sz && res[i].matched; i++) - printf("[%zu] %s(%s%s%s) - %.70s\n", i + 1, - res[i].title, res[i].cat, - *res[i].arch ? "/" : "", - *res[i].arch ? res[i].arch : "", - res[i].desc); + for (i = 0; i < sz; i++) { + if ( ! res[i].matched) + continue; + printf("%s(%s%s%s) - %.70s\n", + res[i].title, + res[i].cat, + *res[i].arch ? "/" : "", + *res[i].arch ? res[i].arch : "", + res[i].desc); + } } static int cmp(const void *p1, const void *p2) { - const struct res *r1 = p1; - const struct res *r2 = p2; - - if (0 == r1->matched) - return(1); - else if (0 == r2->matched) - return(1); - - return(strcasecmp(r1->title, r2->title)); -} - -static void -usage(void) -{ - fprintf(stderr, "usage: %s " - "[-C file] " - "[-M manpath] " - "[-m manpath] " - "[-S arch] " - "[-s section] " - "expression ...\n", - progname); + return(strcasecmp(((const struct res *)p1)->title, + ((const struct res *)p2)->title)); } |