diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2013-09-17 23:23:10 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2013-09-17 23:23:10 +0000 |
commit | ab293a0ef329d4c3b4af07706b5454c5691e6040 (patch) | |
tree | 523344b4a33c58a132d3ef445b94cd84709e82c8 | |
parent | 5979c85913d6f3c76ac1ba7dfc2cdd63b6d24317 (diff) | |
download | mandoc-ab293a0ef329d4c3b4af07706b5454c5691e6040.tar.gz mandoc-ab293a0ef329d4c3b4af07706b5454c5691e6040.tar.zst mandoc-ab293a0ef329d4c3b4af07706b5454c5691e6040.zip |
Merge OpenBSD revision 1.17:
Without arguments, show the usage line and EXIT_FAILURE.
Resolve some gratuitious differences (order, parantheses, white space, etc).
-rw-r--r-- | apropos.c | 94 |
1 files changed, 70 insertions, 24 deletions
@@ -1,6 +1,7 @@ -/* $Id: apropos.c,v 1.34 2013/07/05 09:33:02 schwarze Exp $ */ +/* $Id: apropos.c,v 1.27.2.1 2013/09/17 23:23:10 schwarze Exp $ */ /* - * Copyright (c) 2012 Kristaps Dzonsons <kristaps@bsd.lv> + * Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv> + * Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org> * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -21,26 +22,30 @@ #include <assert.h> #include <getopt.h> -#include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <unistd.h> +#include "apropos_db.h" +#include "mandoc.h" #include "manpath.h" -#include "mansearch.h" + +static int cmp(const void *, const void *); +static void list(struct res *, size_t, void *); + +static char *progname; int main(int argc, char *argv[]) { - int ch, whatis; - struct mansearch search; - size_t i, sz; - struct manpage *res; + int ch, rc, whatis; + struct res *res; struct manpaths paths; + size_t terms, ressz; + struct opts opts; + struct expr *e; char *defpaths, *auxpaths; char *conf_file; - char *progname; extern char *optarg; extern int optind; @@ -53,10 +58,13 @@ main(int argc, char *argv[]) whatis = (0 == strncmp(progname, "whatis", 6)); memset(&paths, 0, sizeof(struct manpaths)); - memset(&search, 0, sizeof(struct mansearch)); + memset(&opts, 0, sizeof(struct opts)); + ressz = 0; + res = NULL; auxpaths = defpaths = NULL; conf_file = NULL; + e = NULL; while (-1 != (ch = getopt(argc, argv, "C:M:m:S:s:"))) switch (ch) { @@ -70,10 +78,10 @@ main(int argc, char *argv[]) auxpaths = optarg; break; case ('S'): - search.arch = optarg; + opts.arch = optarg; break; case ('s'): - search.sec = optarg; + opts.cat = optarg; break; default: goto usage; @@ -85,26 +93,64 @@ main(int argc, char *argv[]) if (0 == argc) goto usage; - search.deftype = whatis ? TYPE_Nm : TYPE_Nm | TYPE_Nd; - search.flags = whatis ? MANSEARCH_WHATIS : 0; + rc = 0; manpath_parse(&paths, conf_file, defpaths, auxpaths); - ch = mansearch(&search, &paths, argc, argv, &res, &sz); - manpath_free(&paths); - if (0 == ch) - goto usage; + e = whatis ? termcomp(argc, argv, &terms) : + exprcomp(argc, argv, &terms); + + if (NULL == e) { + fprintf(stderr, "%s: Bad expression\n", progname); + goto out; + } - for (i = 0; i < sz; i++) { - printf("%s - %s\n", res[i].file, res[i].desc); - free(res[i].desc); + rc = apropos_search + (paths.sz, paths.paths, &opts, + e, terms, NULL, &ressz, &res, list); + + if (0 == rc) { + fprintf(stderr, "%s: Bad database\n", progname); + goto out; } - free(res); - return(sz ? EXIT_SUCCESS : EXIT_FAILURE); +out: + manpath_free(&paths); + resfree(res, ressz); + exprfree(e); + return(rc ? EXIT_SUCCESS : EXIT_FAILURE); + 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); } + +/* ARGSUSED */ +static void +list(struct res *res, size_t sz, void *arg) +{ + size_t i; + + qsort(res, sz, sizeof(struct res), cmp); + + 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) +{ + + return(strcasecmp(((const struct res *)p1)->title, + ((const struct res *)p2)->title)); +} |