BSD 3 release
[unix-history] / usr / src / cmd / whatis.c
#include <stdio.h>
#include <ctype.h>
/*
* whatis - what the heck is that file anyways
*
* Bill Joy UCB
*/
char *calloc();
char *trim();
unsigned blklen();
main(argc, argv)
int argc;
char *argv[];
{
register char **avp;
argc--, argv++;
if (argc == 0) {
fprintf(stderr, "whatis name ...\n");
exit(1);
}
if (freopen("/usr/lib/whatis", "r", stdin) == NULL) {
perror("/usr/lib/whatis");
exit (1);
}
argv[argc] = 0;
for (avp = argv; *avp; avp++)
*avp = trim(*avp);
whatis(argv);
exit(0);
}
whatis(argv)
char **argv;
{
char buf[BUFSIZ];
register char *gotit;
register char **vp;
gotit = calloc(1, blklen(argv));
while (fgets(buf, sizeof buf, stdin) != NULL)
for (vp = argv; *vp; vp++)
if (match(buf, *vp)) {
printf("%s", buf);
gotit[vp - argv] = 1;
for (vp++; *vp; vp++)
if (match(buf, *vp))
gotit[vp - argv] = 1;
break;
}
for (vp = argv; *vp; vp++)
if (gotit[vp - argv] == 0)
printf("%s: not found\n", *vp);
}
match(buf, str)
char *buf, *str;
{
register char *bp, *cp;
bp = buf;
again:
cp = str;
while (*bp && *cp && lmatch(*bp, *cp))
bp++, cp++;
if (*cp == 0 && (*bp == '(' || *bp == ',' || *bp == '\t' || *bp == ' '))
return (1);
while (isalpha(*bp) || isdigit(*bp))
bp++;
if (*bp != ',')
return (0);
bp++;
while (isspace(*bp))
bp++;
goto again;
}
lmatch(c, d)
char c, d;
{
if (c == d)
return (1);
if (!isalpha(c) || !isalpha(d))
return (0);
if (islower(c))
c = toupper(c);
if (islower(d))
d = toupper(d);
return (c == d);
}
unsigned
blklen(ip)
register char **ip;
{
register int i = 0;
while (*ip++)
i++;
return (i);
}
char *
trim(cp)
register char *cp;
{
register char *dp;
for (dp = cp; *dp; dp++)
if (*dp == '/')
cp = dp + 1;
if (cp[0] != '.') {
if (cp + 3 <= dp && dp[-2] == '.' && any(dp[-1], "cosa12345678npP"))
dp[-2] = 0;
if (cp + 4 <= dp && dp[-3] == '.' && any(dp[-2], "13") && isalpha(dp[-1]))
dp[-3] = 0;
}
return (cp);
}
any(c, cp)
register int c;
register char *cp;
{
while (*cp)
if (c == *cp++)
return (1);
return (0);
}