|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <sgtty.h> ! 3: #include <sys/types.h> ! 4: #include <stat.h> ! 5: #include <local/uparm.h> ! 6: /* ! 7: * man - intelligent man command ! 8: * ! 9: * Author: Bill Joy UCB August 25, 1977 ! 10: * ! 11: * Man is an intelligent man command which obviates the need to know ! 12: * section numbers in the manual. Also if the standard output is a teletype and ! 13: * the option - is not given we pipe through "ssp, ul, and more" to eliminate piled ! 14: * up blank lines. ! 15: */ ! 16: int nocr3; ! 17: int cflag; ! 18: char *strcpy(); ! 19: char *strcat(); ! 20: int section; ! 21: int subsec; ! 22: int troffit; ! 23: ! 24: #define eq(a,b) (strcmp(a,b) == 0) ! 25: ! 26: main(argc, argv) ! 27: int argc; ! 28: char *argv[]; ! 29: { ! 30: ! 31: if (argc <= 1) { ! 32: fprintf(stderr, "Usage: man [ section ] name ...\n"); ! 33: exit(1); ! 34: } ! 35: if (chdir("/usr/man") < 0) { ! 36: fprintf(stderr, "Can't chdir to /usr/man.\n"); ! 37: exit(1); ! 38: } ! 39: argc--, argv++; ! 40: while (argc > 0 && argv[0][0] == '-') { ! 41: switch(argv[0][1]) { ! 42: ! 43: case 0: ! 44: nocr3++; ! 45: break; ! 46: ! 47: case 'c': ! 48: cflag++; ! 49: break; ! 50: ! 51: case 't': ! 52: troffit++; ! 53: break; ! 54: } ! 55: argc--, argv++; ! 56: } ! 57: if (troffit == 0 && nocr3 == 0 && !isatty(1)) ! 58: nocr3++; ! 59: section = 0; ! 60: do { ! 61: if (eq(argv[0], "ucb")) { ! 62: section = 'u'; ! 63: goto sectin; ! 64: } else if (eq(argv[0], "local")) { ! 65: section = 'l'; ! 66: goto sectin; ! 67: } else if (eq(argv[0], "new")) { ! 68: section = 'n'; ! 69: goto sectin; ! 70: } else if (eq(argv[0], "public")) { ! 71: section = 'p'; ! 72: goto sectin; ! 73: } else if (eq(argv[0], "sccs")) { ! 74: section = 's'; ! 75: goto sectin; ! 76: } else if (eq(argv[0], "junk")) { ! 77: section = 'j'; ! 78: goto sectin; ! 79: } else if (argv[0][0] >= '0' && argv[0][0] <= '9' && (argv[0][1] == 0 || argv[0][2] == 0)) { ! 80: section = argv[0][0]; ! 81: subsec = argv[0][1]; ! 82: sectin: ! 83: argc--, argv++; ! 84: if (argc == 0) { ! 85: fprintf(stderr, "But what do you want from section %s?\n", argv[-1]); ! 86: exit(1); ! 87: } ! 88: continue; ! 89: } ! 90: manual(section, argv[0]); ! 91: argc--, argv++; ! 92: } while (argc > 0); ! 93: exit(0); ! 94: } ! 95: ! 96: manual(sec, name) ! 97: char sec; ! 98: char *name; ! 99: { ! 100: char section = sec; ! 101: char work[100]; ! 102: int ss; ! 103: struct stat stbuf; ! 104: int last; ! 105: char *sp = "lun16823457psj"; ! 106: ! 107: strcpy(work, "manx/"); ! 108: strcat(work, name); ! 109: strcat(work, ".x"); ! 110: last = strlen(work) - 1; ! 111: if (section == '1') { ! 112: sp = "lun16pj"; ! 113: section = 0; ! 114: } ! 115: if (section == 0) { ! 116: ss = 0; ! 117: for (section = *sp++; section; section = *sp++) { ! 118: work[3] = section; ! 119: work[last] = section; ! 120: work[last+1] = 0; ! 121: if (stat(work, &stbuf) >= 0) ! 122: break; ! 123: if (work[last] == '1' || work[last] == '3') { ! 124: char *cp; ! 125: search: ! 126: cp = work[last] == '1' ? "mcg" : "xmsf"; ! 127: while (*cp) { ! 128: work[last+1] = *cp++; ! 129: if (stat(work, &stbuf) >= 0) { ! 130: ss = work[last+1]; ! 131: goto found; ! 132: } ! 133: } ! 134: if (ss = 0) ! 135: work[last+1] = 0; ! 136: } ! 137: } ! 138: if (section == 0) { ! 139: if (sec == 0) ! 140: printf("No manual entry for %s.\n", name); ! 141: else ! 142: printf("No entry for %s in section %c of the manual.\n", name, sec); ! 143: return; ! 144: } ! 145: } else { ! 146: work[3] = section; ! 147: work[last] = section; ! 148: work[last+1] = subsec; ! 149: if (stat(work, &stbuf) < 0) { ! 150: if ((section == '1' || section == '3') && subsec == 0) { ! 151: sp = "\0"; ! 152: goto search; ! 153: } ! 154: printf("No entry for %s in section %c", name, section); ! 155: if (subsec) ! 156: putchar(subsec); ! 157: printf(" of the manual.\n"); ! 158: return; ! 159: } ! 160: } ! 161: found: ! 162: if (troffit) ! 163: troff(work); ! 164: else ! 165: nroff(work); ! 166: } ! 167: ! 168: nroff(cp) ! 169: char *cp; ! 170: { ! 171: char cmdbuf[BUFSIZ]; ! 172: ! 173: if (nocr3) ! 174: sprintf(cmdbuf, "nroff -h -man %s", cp); ! 175: else ! 176: sprintf(cmdbuf, "nroff -h -man %s | %s | %s | %s", ! 177: cp, binpath(ssp), binpath(ul), ! 178: cflag ? binpath(cr3) : binpath(more)); ! 179: system(cmdbuf); ! 180: } ! 181: ! 182: troff(cp) ! 183: char *cp; ! 184: { ! 185: char cmdbuf[BUFSIZ]; ! 186: ! 187: sprintf(cmdbuf, "%s -t -man %s %s | %s | %s -t", "/usr/bin/troff", ! 188: libpath(tmac/tmac.vcat), cp, libpath(vsort), binpath(vpr)); ! 189: system(cmdbuf); ! 190: } ! 191: ! 192: any(c, sp) ! 193: register int c; ! 194: register char *sp; ! 195: { ! 196: register int d; ! 197: ! 198: while (d = *sp++) ! 199: if (c == d) ! 200: return (1); ! 201: return (0); ! 202: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.