BSD 2 development
authorBill Joy <wnj@ucbvax.Berkeley.EDU>
Wed, 9 May 1979 07:12:18 +0000 (23:12 -0800)
committerBill Joy <wnj@ucbvax.Berkeley.EDU>
Wed, 9 May 1979 07:12:18 +0000 (23:12 -0800)
Work on file src/man.c

Synthesized-from: 2bsd

src/man.c [new file with mode: 0644]

diff --git a/src/man.c b/src/man.c
new file mode 100644 (file)
index 0000000..76849fb
--- /dev/null
+++ b/src/man.c
@@ -0,0 +1,186 @@
+/* Copyright (c) 1979 Regents of the University of California */
+#include <retrofit.h>
+#include <stdio.h>
+#include <sgtty.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/*
+ * man - intelligent man command
+ *
+ * Author: Bill Joy UCB August 25, 1977
+ *
+ * Man is an intelligent man command which obviates the need to know
+ * section numbers in the manual.  Also if the standard output is a teletype and
+ * the option - is not given we pipe through "ssp and cr3" to eliminate piled
+ * up blank lines.
+ */
+int    nocr3;
+char   *strcpy();
+char   *strcat();
+int    section;
+int    subsec;
+int    troffit;
+
+#define        eq(a,b) (strcmp(a,b) == 0)
+
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+
+       if (argc <= 1) {
+               fprintf(stderr, "Usage: man [ section ] name ...\n");
+               exit(1);
+       }
+       if (chdir("/usr/man") < 0) {
+               fprintf(stderr, "Can't chdir to /usr/man.\n");
+               exit(1);
+       }
+       argc--, argv++;
+       while (argc > 0 && argv[0][0] == '-') {
+               switch(argv[0][1]) {
+
+               case 0:
+                       nocr3++;
+                       break;
+
+               case 't':
+                       troffit++;
+                       break;
+               }
+               argc--, argv++;
+       }
+       if (troffit == 0 && nocr3 == 0 && !isatty(1))
+               nocr3++;
+       section = 0;
+       do {
+               if (eq(argv[0], "new") || eq(argv[0], "ucb")) {
+                       section = 'u';
+                       goto sectin;
+               } else if (eq(argv[0], "public")) {
+                       section = 'p';
+                       goto sectin;
+               } else if (eq(argv[0], "sccs")) {
+                       section = 's';
+                       goto sectin;
+               } else if (argv[0][0] >= '0' && argv[0][0] <= '9' && (argv[0][1] == 0 || argv[0][2] == 0)) {
+                       section = argv[0][0];
+                       subsec = argv[0][1];
+sectin:
+                       argc--, argv++;
+                       if (argc == 0) {
+                               fprintf(stderr, "But what do you want from section %s?\n", argv[-1]);
+                               exit(1);
+                       }
+                       continue;
+               }
+               manual(section, argv[0]);
+               argc--, argv++;
+       } while (argc > 0);
+       exit(0);
+}
+
+manual(sec, name)
+       char sec;
+       char *name;
+{
+       char section = sec;
+       char work[100];
+       int ss;
+       struct stat stbuf;
+       int last;
+       char *sp = "u16823457ps";
+
+       strcpy(work, "manx/");
+       strcat(work, name);
+       strcat(work, ".x");
+       last = strlen(work) - 1;
+       if (section == '1') {
+               sp = "u16p";
+               section = 0;
+       }
+       if (section == 0) {
+               ss = 0;
+               for (section = *sp++; section; section = *sp++) {
+                       work[3] = section;
+                       work[last] = section;
+                       work[last+1] = 0;
+                       if (stat(work, &stbuf) >= 0)
+                               break;
+                       if (work[last] == '1' || work[last] == '3') {
+                               char *cp;
+search:
+                               cp = work[last] == '1' ? "mcg" : "xmsf";
+                               while (*cp) {
+                                       work[last+1] = *cp++;
+                                       if (stat(work, &stbuf) >= 0) {
+                                               ss = work[last+1];
+                                               goto found;
+                                       }
+                               }
+                               if (ss = 0)
+                                       work[last+1] = 0;
+                       }
+               }
+               if (section == 0) {
+                       if (sec == 0)
+                               printf("No manual entry for %s.\n", name);
+                       else
+                               printf("No entry for %s in section %c of the manual.\n", name, sec);
+                       return;
+               }
+       } else {
+               work[3] = section;
+               work[last] = section;
+               work[last+1] = subsec;
+               if (stat(work, &stbuf) < 0) {
+                       if ((section == '1' || section == '3') && subsec == 0) {
+                               sp = "\0";
+                               goto search;
+                       }
+                       printf("No entry for %s in section %c", name, section);
+                       if (subsec)
+                               putchar(subsec);
+                       printf(" of the manual.\n");
+                       return;
+               }
+       }
+found:
+       if (troffit)
+               troff(work);
+       else
+               nroff(work);
+}
+
+nroff(cp)
+       char *cp;
+{
+       char cmdbuf[BUFSIZ];
+
+       if (nocr3)
+               sprintf(cmdbuf, "nroff -h -man %s", cp);
+       else
+               sprintf(cmdbuf, "nroff -h -man %s | /usr/ucb/ssp | /usr/ucb/cr3", cp);
+       system(cmdbuf);
+}
+
+troff(cp)
+       char *cp;
+{
+       char cmdbuf[BUFSIZ];
+
+       sprintf(cmdbuf, "/usr/ucb/troff -t -man /usr/lib/tmac/tmac.vcat %s | /usr/ucb/vsort | /usr/ucb/vpr -t", cp);
+       system(cmdbuf);
+}
+
+any(c, sp)
+       register int c;
+       register char *sp;
+{
+       register int d;
+
+       while (d = *sp++)
+               if (c == d)
+                       return (1);
+       return (0);
+}