diff options
author | Todd C. Miller <millert@cvs.openbsd.org> | 1997-11-13 03:56:54 +0000 |
---|---|---|
committer | Todd C. Miller <millert@cvs.openbsd.org> | 1997-11-13 03:56:54 +0000 |
commit | 8ca244c36666cd1c5ec7c18ec008a0546ed93c6d (patch) | |
tree | 618832e2b8bac98548f0ace2d7e0c84ff20c700d | |
parent | 2167c6e73d5a7bad279fba7025c9db9c6307e5fa (diff) |
4.4BSD lite version. Adds -w flag for whatis entries.
-rw-r--r-- | libexec/getNAME/getNAME.c | 166 |
1 files changed, 138 insertions, 28 deletions
diff --git a/libexec/getNAME/getNAME.c b/libexec/getNAME/getNAME.c index c6a859ee85b..952f8f15c20 100644 --- a/libexec/getNAME/getNAME.c +++ b/libexec/getNAME/getNAME.c @@ -1,6 +1,8 @@ +/* $OpenBSD: getNAME.c,v 1.4 1997/11/13 03:56:53 millert Exp $ */ + /*- - * Copyright (c) 1980 The Regents of the University of California. - * All rights reserved. + * Copyright (c) 1980, 1993 + * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -32,14 +34,17 @@ */ #ifndef lint -char copyright[] = -"@(#) Copyright (c) 1980 The Regents of the University of California.\n\ - All rights reserved.\n"; +static char copyright[] = +"@(#) Copyright (c) 1980, 1993\n\ + The Regents of the University of California. All rights reserved.\n"; #endif /* not lint */ #ifndef lint -/*static char sccsid[] = "from: @(#)getNAME.c 5.4 (Berkeley) 1/20/91";*/ -static char rcsid[] = "$Id: getNAME.c,v 1.3 1997/01/17 07:12:01 millert Exp $"; +#if 0 +static char sccsid[] = "@(#)getNAME.c 8.1 (Berkeley) 6/30/93"; +#else +static char rcsid[] = "$OpenBSD: getNAME.c,v 1.4 1997/11/13 03:56:53 millert Exp $"; +#endif #endif /* not lint */ /* @@ -49,19 +54,29 @@ static char rcsid[] = "$Id: getNAME.c,v 1.3 1997/01/17 07:12:01 millert Exp $"; * other apropos database */ #include <stdio.h> +#include <stdlib.h> #include <string.h> int tocrc; int intro; +int typeflag; + +void doname __P((char *)); +void dorefname __P((char *)); +void getfrom __P((char *)); +void split __P((char *, char *)); +void trimln __P((char *)); +void usage __P((void)); +int main(argc, argv) int argc; - char **argv; + char *argv[]; { extern int optind; int ch; - while ((ch = getopt(argc, argv, "it")) != -1) + while ((ch = getopt(argc, argv, "itw")) != -1) switch(ch) { case 'i': intro = 1; @@ -69,6 +84,9 @@ main(argc, argv) case 't': tocrc = 1; break; + case 'w': + typeflag = 1; + break; case '?': default: usage(); @@ -84,26 +102,45 @@ main(argc, argv) exit(0); } -getfrom(name) - char *name; +void +getfrom(pathname) + char *pathname; { int i = 0; + char *name, *loc; char headbuf[BUFSIZ]; char linbuf[BUFSIZ]; - if (freopen(name, "r", stdin) == 0) { - perror(name); + if (freopen(pathname, "r", stdin) == 0) { + perror(pathname); return; } + if (name = strrchr(pathname, '/')) + name++; + else + name = pathname; for (;;) { - if (fgets(headbuf, sizeof headbuf, stdin) == NULL) + if (fgets(headbuf, sizeof headbuf, stdin) == NULL) { + if (typeflag) + printf("%-60s UNKNOWN\n", pathname); return; + } if (headbuf[0] != '.') continue; - if (headbuf[1] == 'T' && headbuf[2] == 'H') - break; - if (headbuf[1] == 't' && headbuf[2] == 'h') + if ((headbuf[1] == 'T' && headbuf[2] == 'H') || + (headbuf[1] == 't' && headbuf[2] == 'h')) break; + if (headbuf[1] == 'D' && headbuf[2] == 't') { + if (typeflag) { + printf("%-60s NEW\n", pathname); + return; + } + goto newman; + } + } + if (typeflag) { + printf("%-60s OLD\n", pathname); + return; } for (;;) { if (fgets(linbuf, sizeof linbuf, stdin) == NULL) @@ -118,30 +155,99 @@ getfrom(name) trimln(headbuf); if (tocrc) doname(name); - if (!intro) + if (!tocrc && !intro) printf("%s\t", headbuf); + linbuf[0] = '\0'; for (;;) { - if (fgets(linbuf, sizeof linbuf, stdin) == NULL) + if (fgets(headbuf, sizeof headbuf, stdin) == NULL) break; - if (linbuf[0] == '.') { - if (linbuf[1] == 'S' && linbuf[2] == 'H') + if (headbuf[0] == '.') { + if (headbuf[1] == 'S' && headbuf[2] == 'H') break; - if (linbuf[1] == 's' && linbuf[2] == 'h') + if (headbuf[1] == 's' && headbuf[2] == 'h') break; } - trimln(linbuf); - if (intro) { - split(linbuf, name); + if (i != 0) + strcat(linbuf, " "); + i++; + trimln(headbuf); + strcat(linbuf, headbuf); + } + if (intro) + split(linbuf, name); + else + printf("%s\n", linbuf); + return; + +newman: + for (;;) { + if (fgets(linbuf, sizeof linbuf, stdin) == NULL) + return; + if (linbuf[0] != '.') continue; + if (linbuf[1] == 'S' && linbuf[2] == 'h') + break; + } + trimln(headbuf); + if (tocrc) + doname(name); + if (!tocrc && !intro) + printf(".TH%s\t", &headbuf[3]); + linbuf[0] = '\0'; + for (;;) { + if (fgets(headbuf, sizeof headbuf, stdin) == NULL) + break; + if (headbuf[0] == '.') { + if (headbuf[1] == 'S' && headbuf[2] == 'h') + break; } if (i != 0) - printf(" "); + strcat(linbuf, " "); i++; - printf("%s", linbuf); + trimln(headbuf); + for (loc = strchr(headbuf, ' '); loc; loc = strchr(loc, ' ')) + if (loc[1] == ',') + strcpy(loc, &loc[1]); + else + loc++; + if (headbuf[0] != '.') { + strcat(linbuf, headbuf); + } else { + /* + * Get rid of quotes in macros. + */ + for (loc = strchr(&headbuf[4], '"'); loc; ) { + strcpy(loc, &loc[1]); + loc = strchr(loc, '"'); + } + /* + * Handle cross references + */ + if (headbuf[1] == 'X' && headbuf[2] == 'r') { + for (loc = &headbuf[4]; *loc != ' '; loc++) + continue; + loc[0] = '('; + loc[2] = ')'; + loc[3] = '\0'; + } + /* + * Put dash between names and description. + */ + if (headbuf[1] == 'N' && headbuf[2] == 'd') + strcat(linbuf, "\\- "); + /* + * Skip over macro names. + */ + strcat(linbuf, &headbuf[4]); + } } - printf("\n"); + if (intro) + split(linbuf, name); + else + printf("%s\n", linbuf); } +void trimln(cp) register char *cp; { @@ -152,6 +258,7 @@ trimln(cp) *cp = 0; } +void doname(name) char *name; { @@ -175,6 +282,7 @@ again: putchar(' '); } +void split(line, name) char *line, *name; { @@ -207,6 +315,7 @@ split(line, name) } } +void dorefname(name) char *name; { @@ -228,6 +337,7 @@ again: putchar (*dp++); } +void usage() { (void)fprintf(stderr, "usage: getNAME [-it] file ...\n"); |