Annotation of src/usr.bin/mandoc/apropos.c, Revision 1.19
1.19 ! schwarze 1: /* $Id: apropos.c,v 1.18 2013/12/31 00:40:19 schwarze Exp $ */
1.1 schwarze 2: /*
1.18 schwarze 3: * Copyright (c) 2012 Kristaps Dzonsons <kristaps@bsd.lv>
1.19 ! schwarze 4: * Copyright (c) 2013 Ingo Schwarze <schwarze@openbsd.org>
1.1 schwarze 5: *
6: * Permission to use, copy, modify, and distribute this software for any
7: * purpose with or without fee is hereby granted, provided that the above
8: * copyright notice and this permission notice appear in all copies.
9: *
10: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17: */
1.16 schwarze 18: #include <sys/param.h>
19:
1.1 schwarze 20: #include <assert.h>
21: #include <getopt.h>
1.18 schwarze 22: #include <stdint.h>
1.1 schwarze 23: #include <stdio.h>
24: #include <stdlib.h>
25: #include <string.h>
1.18 schwarze 26: #include <unistd.h>
1.1 schwarze 27:
1.8 schwarze 28: #include "manpath.h"
1.18 schwarze 29: #include "mansearch.h"
1.1 schwarze 30:
31: int
32: apropos(int argc, char *argv[])
33: {
1.18 schwarze 34: int ch, whatis;
35: struct mansearch search;
36: size_t i, sz;
37: struct manpage *res;
1.8 schwarze 38: struct manpaths paths;
39: char *defpaths, *auxpaths;
1.12 schwarze 40: char *conf_file;
1.18 schwarze 41: char *progname;
1.19 ! schwarze 42: char *outkey;
1.17 schwarze 43: extern char *optarg;
1.1 schwarze 44: extern int optind;
45:
46: progname = strrchr(argv[0], '/');
47: if (progname == NULL)
48: progname = argv[0];
49: else
50: ++progname;
51:
1.17 schwarze 52: whatis = (0 == strncmp(progname, "whatis", 6));
1.9 schwarze 53:
1.8 schwarze 54: memset(&paths, 0, sizeof(struct manpaths));
1.18 schwarze 55: memset(&search, 0, sizeof(struct mansearch));
1.8 schwarze 56:
57: auxpaths = defpaths = NULL;
1.12 schwarze 58: conf_file = NULL;
1.19 ! schwarze 59: outkey = NULL;
1.8 schwarze 60:
1.19 ! schwarze 61: while (-1 != (ch = getopt(argc, argv, "C:M:m:O:S:s:")))
1.1 schwarze 62: switch (ch) {
1.12 schwarze 63: case ('C'):
64: conf_file = optarg;
65: break;
1.6 schwarze 66: case ('M'):
1.8 schwarze 67: defpaths = optarg;
68: break;
1.6 schwarze 69: case ('m'):
1.8 schwarze 70: auxpaths = optarg;
1.6 schwarze 71: break;
1.19 ! schwarze 72: case ('O'):
! 73: outkey = optarg;
! 74: break;
1.3 schwarze 75: case ('S'):
1.18 schwarze 76: search.arch = optarg;
1.1 schwarze 77: break;
1.3 schwarze 78: case ('s'):
1.18 schwarze 79: search.sec = optarg;
1.1 schwarze 80: break;
81: default:
1.17 schwarze 82: goto usage;
1.1 schwarze 83: }
84:
85: argc -= optind;
86: argv += optind;
87:
1.17 schwarze 88: if (0 == argc)
89: goto usage;
1.9 schwarze 90:
1.18 schwarze 91: search.deftype = whatis ? TYPE_Nm : TYPE_Nm | TYPE_Nd;
92: search.flags = whatis ? MANSEARCH_WHATIS : 0;
1.8 schwarze 93:
1.12 schwarze 94: manpath_parse(&paths, conf_file, defpaths, auxpaths);
1.19 ! schwarze 95: ch = mansearch(&search, &paths, argc, argv, outkey, &res, &sz);
1.18 schwarze 96: manpath_free(&paths);
1.1 schwarze 97:
1.18 schwarze 98: if (0 == ch)
99: goto usage;
1.1 schwarze 100:
1.18 schwarze 101: for (i = 0; i < sz; i++) {
1.19 ! schwarze 102: printf("%s - %s\n", res[i].names,
! 103: NULL == outkey ? res[i].desc :
! 104: NULL == res[i].output ? "" : res[i].output);
1.18 schwarze 105: free(res[i].file);
106: free(res[i].names);
107: free(res[i].desc);
1.19 ! schwarze 108: free(res[i].output);
1.16 schwarze 109: }
1.17 schwarze 110:
1.18 schwarze 111: free(res);
112: return(sz ? EXIT_SUCCESS : EXIT_FAILURE);
1.17 schwarze 113: usage:
114: fprintf(stderr, "usage: %s [-C file] [-M path] [-m path] "
1.19 ! schwarze 115: "[-O outkey] "
1.17 schwarze 116: "[-S arch] [-s section]%s ...\n", progname,
117: whatis ? " name" : "\n expression");
118: return(EXIT_FAILURE);
1.1 schwarze 119: }