/* Copyright (c) 1979 Regents of the University of California */ #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); }