summaryrefslogtreecommitdiffstats
path: root/apropos.c
diff options
context:
space:
mode:
authoruqs <uqs@FreeBSD.org>2014-01-31 19:59:03 +0000
committeruqs <uqs@FreeBSD.org>2014-01-31 19:59:03 +0000
commit7ae17de732546145e4a582d503a54b9870ada39c (patch)
tree23b6a81a1df09aafea64657d4d56bc50e677df33 /apropos.c
parentc2dfbbd38125b2ba3608eb48ca3b5e2e23f819df (diff)
downloadFreeBSD-src-7ae17de732546145e4a582d503a54b9870ada39c.zip
FreeBSD-src-7ae17de732546145e4a582d503a54b9870ada39c.tar.gz
Import mdocml version 1.12.3
Diffstat (limited to 'apropos.c')
-rw-r--r--apropos.c137
1 files changed, 27 insertions, 110 deletions
diff --git a/apropos.c b/apropos.c
index 9c3cae9..f5d1425 100644
--- a/apropos.c
+++ b/apropos.c
@@ -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));
}
OpenPOWER on IntegriCloud