=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/apropos/Attic/apropos.c,v retrieving revision 1.10 retrieving revision 1.16 diff -u -r1.10 -r1.16 --- src/usr.bin/apropos/Attic/apropos.c 2003/06/10 22:20:44 1.10 +++ src/usr.bin/apropos/Attic/apropos.c 2013/11/25 18:02:49 1.16 @@ -1,4 +1,4 @@ -/* $OpenBSD: apropos.c,v 1.10 2003/06/10 22:20:44 deraadt Exp $ */ +/* $OpenBSD: apropos.c,v 1.16 2013/11/25 18:02:49 deraadt Exp $ */ /* $NetBSD: apropos.c,v 1.5 1995/09/04 20:46:20 tls Exp $ */ /* @@ -30,20 +30,6 @@ * SUCH DAMAGE. */ -#ifndef lint -static char copyright[] = -"@(#) Copyright (c) 1987, 1993, 1994\n\ - The Regents of the University of California. All rights reserved.\n"; -#endif /* not lint */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)apropos.c 8.8 (Berkeley) 5/4/95"; -#else -static char rcsid[] = "$OpenBSD: apropos.c,v 1.10 2003/06/10 22:20:44 deraadt Exp $"; -#endif -#endif /* not lint */ - #include #include @@ -62,7 +48,7 @@ #define MAXLINELEN 8192 /* max line handled */ -void apropos(char **, char *, int); +void apropos(char **, char *, int, char *, char *); void lowstr(char *, char *); int match(char *, char *); void usage(void); @@ -73,11 +59,12 @@ ENTRY *ep; TAG *tp; int ch, rv; - char *conffile, **p, *p_augment, *p_path; + char *conffile, *machine, **p, *p_augment, *p_path, *sflag; conffile = NULL; p_augment = p_path = NULL; - while ((ch = getopt(argc, argv, "C:M:m:P:")) != -1) + machine = sflag = NULL; + while ((ch = getopt(argc, argv, "C:M:m:P:S:s:")) != -1) switch (ch) { case 'C': conffile = optarg; @@ -89,6 +76,14 @@ case 'm': p_augment = optarg; break; + case 'S': + machine = optarg; + lowstr(machine, machine); + break; + case 's': + sflag = optarg; + lowstr(sflag, sflag); + break; case '?': default: usage(); @@ -99,23 +94,22 @@ if (argc < 1) usage(); - if ((found = malloc((u_int)argc * sizeof(int))) == NULL) + if ((found = calloc(argc, sizeof(int))) == NULL) err(1, NULL); - memset(found, 0, argc * sizeof(int)); for (p = argv; *p; ++p) /* convert to lower-case */ lowstr(*p, *p); if (p_augment) - apropos(argv, p_augment, 1); + apropos(argv, p_augment, 1, sflag, machine); if (p_path || (p_path = getenv("MANPATH"))) - apropos(argv, p_path, 1); + apropos(argv, p_path, 1, sflag, machine); else { config(conffile); ep = (tp = getlist("_whatdb")) == NULL ? - NULL : tp->list.tqh_first; - for (; ep != NULL; ep = ep->q.tqe_next) - apropos(argv, ep->s, 0); + NULL : TAILQ_FIRST(&tp->list); + for (; ep != NULL; ep = TAILQ_NEXT(ep, q)) + apropos(argv, ep->s, 0, sflag, machine); } if (!foundman) @@ -131,12 +125,18 @@ } void -apropos(char **argv, char *path, int buildpath) +apropos(char **argv, char *path, int buildpath, char *sflag, char *machine) { char *end, *name, **p; char buf[MAXLINELEN + 1], wbuf[MAXLINELEN + 1]; char hold[MAXPATHLEN]; + size_t slen = 0, mlen = 0; + if (sflag) + slen = strlen(sflag); + if (machine) + mlen = strlen(machine); + for (name = path; name; name = end) { /* through name list */ if ((end = strchr(name, ':'))) *end++ = '\0'; @@ -159,6 +159,21 @@ continue; } lowstr(buf, wbuf); + if (sflag || machine) { + char *s = strstr(wbuf, ") - "); + if (!s) + continue; + while (s > wbuf && *s != '/' && *s != '(') + s--; + if (machine && *s == '/' && + strncmp(s+1, machine, mlen)) + continue; + while (s > wbuf && *s != '(') + s--; + if (sflag && *s == '(' && + strncmp(s+1, sflag, slen)) + continue; + } for (p = argv; *p; ++p) if (match(wbuf, *p)) { (void)printf("%s", buf); @@ -202,7 +217,7 @@ void lowstr(char *from, char *to) { - char ch; + unsigned char ch; while ((ch = *from++) && ch != '\n') *to++ = isupper(ch) ? tolower(ch) : ch; @@ -218,6 +233,8 @@ { (void)fprintf(stderr, - "usage: apropos [-C file] [-M path] [-m path] keyword [...]\n"); + "usage: apropos [-C file] [-M path] [-m path] " + "[-S subsection] [-s section]\n" + " keyword ...\n"); exit(1); }