summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd C. Miller <millert@cvs.openbsd.org>1997-11-13 03:56:54 +0000
committerTodd C. Miller <millert@cvs.openbsd.org>1997-11-13 03:56:54 +0000
commit8ca244c36666cd1c5ec7c18ec008a0546ed93c6d (patch)
tree618832e2b8bac98548f0ace2d7e0c84ff20c700d
parent2167c6e73d5a7bad279fba7025c9db9c6307e5fa (diff)
4.4BSD lite version. Adds -w flag for whatis entries.
-rw-r--r--libexec/getNAME/getNAME.c166
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");