version 1.1, 1995/10/18 08:44:52 |
version 1.12, 2006/04/02 21:38:56 |
|
|
|
/* $OpenBSD$ */ |
/* $NetBSD: apropos.c,v 1.5 1995/09/04 20:46:20 tls Exp $ */ |
/* $NetBSD: apropos.c,v 1.5 1995/09/04 20:46:20 tls Exp $ */ |
|
|
/* |
/* |
|
|
* 2. Redistributions in binary form must reproduce the above copyright |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* 3. Neither the name of the University nor the names of its contributors |
* must display the following acknowledgement: |
|
* This product includes software developed by the University of |
|
* California, Berkeley and its contributors. |
|
* 4. Neither the name of the University nor the names of its contributors |
|
* may be used to endorse or promote products derived from this software |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* without specific prior written permission. |
* |
* |
|
|
#if 0 |
#if 0 |
static char sccsid[] = "@(#)apropos.c 8.8 (Berkeley) 5/4/95"; |
static char sccsid[] = "@(#)apropos.c 8.8 (Berkeley) 5/4/95"; |
#else |
#else |
static char rcsid[] = "$NetBSD: apropos.c,v 1.5 1995/09/04 20:46:20 tls Exp $"; |
static char rcsid[] = "$OpenBSD$"; |
#endif |
#endif |
#endif /* not lint */ |
#endif /* not lint */ |
|
|
|
|
|
|
static int *found, foundman; |
static int *found, foundman; |
|
|
void apropos __P((char **, char *, int)); |
#define MAXLINELEN 8192 /* max line handled */ |
void lowstr __P((char *, char *)); |
|
int match __P((char *, char *)); |
|
void usage __P((void)); |
|
|
|
|
void apropos(char **, char *, int); |
|
void lowstr(char *, char *); |
|
int match(char *, char *); |
|
void usage(void); |
|
|
int |
int |
main(argc, argv) |
main(int argc, char *argv[]) |
int argc; |
|
char *argv[]; |
|
{ |
{ |
ENTRY *ep; |
ENTRY *ep; |
TAG *tp; |
TAG *tp; |
|
|
|
|
conffile = NULL; |
conffile = NULL; |
p_augment = p_path = NULL; |
p_augment = p_path = NULL; |
while ((ch = getopt(argc, argv, "C:M:m:P:")) != EOF) |
while ((ch = getopt(argc, argv, "C:M:m:P:")) != -1) |
switch (ch) { |
switch (ch) { |
case 'C': |
case 'C': |
conffile = optarg; |
conffile = optarg; |
|
|
if (argc < 1) |
if (argc < 1) |
usage(); |
usage(); |
|
|
if ((found = malloc((u_int)argc * sizeof(int))) == NULL) |
if ((found = calloc(argc, sizeof(int))) == NULL) |
err(1, NULL); |
err(1, NULL); |
memset(found, 0, argc * sizeof(int)); |
|
|
|
for (p = argv; *p; ++p) /* convert to lower-case */ |
for (p = argv; *p; ++p) /* convert to lower-case */ |
lowstr(*p, *p); |
lowstr(*p, *p); |
|
|
else { |
else { |
config(conffile); |
config(conffile); |
ep = (tp = getlist("_whatdb")) == NULL ? |
ep = (tp = getlist("_whatdb")) == NULL ? |
NULL : tp->list.tqh_first; |
NULL : TAILQ_FIRST(&tp->list); |
for (; ep != NULL; ep = ep->q.tqe_next) |
for (; ep != NULL; ep = TAILQ_NEXT(ep, q)) |
apropos(argv, ep->s, 0); |
apropos(argv, ep->s, 0); |
} |
} |
|
|
|
|
} |
} |
|
|
void |
void |
apropos(argv, path, buildpath) |
apropos(char **argv, char *path, int buildpath) |
char **argv, *path; |
|
int buildpath; |
|
{ |
{ |
char *end, *name, **p; |
char *end, *name, **p; |
char buf[LINE_MAX + 1], wbuf[LINE_MAX + 1]; |
char buf[MAXLINELEN + 1], wbuf[MAXLINELEN + 1]; |
|
char hold[MAXPATHLEN]; |
|
|
for (name = path; name; name = end) { /* through name list */ |
for (name = path; name; name = end) { /* through name list */ |
if (end = strchr(name, ':')) |
if ((end = strchr(name, ':'))) |
*end++ = '\0'; |
*end++ = '\0'; |
|
|
if (buildpath) { |
if (buildpath) { |
char hold[MAXPATHLEN + 1]; |
(void)snprintf(hold, sizeof(hold), "%s/%s", name, |
|
_PATH_WHATIS); |
(void)sprintf(hold, "%s/%s", name, _PATH_WHATIS); |
|
name = hold; |
name = hold; |
} |
} |
|
|
|
|
* match anywhere the string appears |
* match anywhere the string appears |
*/ |
*/ |
int |
int |
match(bp, str) |
match(char *bp, char *str) |
char *bp, *str; |
|
{ |
{ |
int len; |
int len; |
char test; |
char test; |
|
|
* convert a string to lower case |
* convert a string to lower case |
*/ |
*/ |
void |
void |
lowstr(from, to) |
lowstr(char *from, char *to) |
char *from, *to; |
|
{ |
{ |
char ch; |
char ch; |
|
|
|
|
* print usage message and die |
* print usage message and die |
*/ |
*/ |
void |
void |
usage() |
usage(void) |
{ |
{ |
|
|
(void)fprintf(stderr, |
(void)fprintf(stderr, |
"usage: apropos [-C file] [-M path] [-m path] keyword ...\n"); |
"usage: apropos [-C file] [-M path] [-m path] keyword [...]\n"); |
exit(1); |
exit(1); |
} |
} |