146048Sbostic /*- 246048Sbostic * Copyright (c) 1980 The Regents of the University of California. 346048Sbostic * All rights reserved. 446048Sbostic * 546048Sbostic * %sccs.include.redist.c% 619818Sdist */ 719818Sdist 813912Ssam #ifndef lint 946048Sbostic char copyright[] = 1046048Sbostic "@(#) Copyright (c) 1980 The Regents of the University of California.\n\ 1146048Sbostic All rights reserved.\n"; 1246048Sbostic #endif /* not lint */ 1313912Ssam 1446048Sbostic #ifndef lint 15*63530Smckusick static char sccsid[] = "@(#)getNAME.c 5.7 (Berkeley) 06/18/93"; 1646048Sbostic #endif /* not lint */ 1746048Sbostic 1813912Ssam /* 1913912Ssam * Get name sections from manual pages. 2013912Ssam * -t for building toc 2113912Ssam * -i for building intro entries 2213912Ssam * other apropos database 2313912Ssam */ 241022Sbill #include <stdio.h> 2560088Sbostic #include <stdlib.h> 2642028Sbostic #include <string.h> 271022Sbill 281022Sbill int tocrc; 2913912Ssam int intro; 3063443Smckusick int typeflag; 311022Sbill 3260088Sbostic void doname __P((char *)); 3360088Sbostic void dorefname __P((char *)); 3460088Sbostic void getfrom __P((char *)); 3560088Sbostic void split __P((char *, char *)); 3660088Sbostic void trimln __P((char *)); 3760088Sbostic void usage __P((void)); 3860088Sbostic 3960088Sbostic int 401022Sbill main(argc, argv) 411022Sbill int argc; 4260088Sbostic char *argv[]; 431022Sbill { 4446048Sbostic extern int optind; 4546048Sbostic int ch; 461022Sbill 4763443Smckusick while ((ch = getopt(argc, argv, "itw")) != EOF) 4846048Sbostic switch(ch) { 4946048Sbostic case 'i': 5046048Sbostic intro = 1; 5146048Sbostic break; 5246048Sbostic case 't': 5346048Sbostic tocrc = 1; 5446048Sbostic break; 5563443Smckusick case 'w': 5663443Smckusick typeflag = 1; 5763443Smckusick break; 5846048Sbostic case '?': 5946048Sbostic default: 6046048Sbostic usage(); 6146048Sbostic } 6246048Sbostic argc -= optind; 6346048Sbostic argv += optind; 6446048Sbostic 6546048Sbostic if (!*argv) 6646048Sbostic usage(); 6746048Sbostic 6846048Sbostic for (; *argv; ++argv) 6946048Sbostic getfrom(*argv); 701022Sbill exit(0); 711022Sbill } 721022Sbill 7360088Sbostic void 7463443Smckusick getfrom(pathname) 7563443Smckusick char *pathname; 761022Sbill { 7746048Sbostic int i = 0; 7863443Smckusick char *name, *loc; 791022Sbill char headbuf[BUFSIZ]; 801022Sbill char linbuf[BUFSIZ]; 811022Sbill 8263443Smckusick if (freopen(pathname, "r", stdin) == 0) { 8363443Smckusick perror(pathname); 8425245Skarels return; 851022Sbill } 8663443Smckusick if (name = strrchr(pathname, '/')) 8763443Smckusick name++; 8863443Smckusick else 8963443Smckusick name = pathname; 901022Sbill for (;;) { 9163443Smckusick if (fgets(headbuf, sizeof headbuf, stdin) == NULL) { 9263443Smckusick if (typeflag) 9363443Smckusick printf("%-60s UNKNOWN\n", pathname); 941022Sbill return; 9563443Smckusick } 961022Sbill if (headbuf[0] != '.') 971022Sbill continue; 9863443Smckusick if ((headbuf[1] == 'T' && headbuf[2] == 'H') || 9963443Smckusick (headbuf[1] == 't' && headbuf[2] == 'h')) 1001022Sbill break; 10163443Smckusick if (headbuf[1] == 'D' && headbuf[2] == 't') { 10263443Smckusick if (typeflag) { 10363443Smckusick printf("%-60s NEW\n", pathname); 10463443Smckusick return; 10563443Smckusick } 10663443Smckusick goto newman; 10763443Smckusick } 1081022Sbill } 10963443Smckusick if (typeflag) { 11063443Smckusick printf("%-60s OLD\n", pathname); 11163443Smckusick return; 11263443Smckusick } 1131022Sbill for (;;) { 1141022Sbill if (fgets(linbuf, sizeof linbuf, stdin) == NULL) 1151022Sbill return; 1161022Sbill if (linbuf[0] != '.') 1171022Sbill continue; 1181022Sbill if (linbuf[1] == 'S' && linbuf[2] == 'H') 1191022Sbill break; 1201022Sbill if (linbuf[1] == 's' && linbuf[2] == 'h') 1211022Sbill break; 1221022Sbill } 1231022Sbill trimln(headbuf); 12413912Ssam if (tocrc) 12513912Ssam doname(name); 12613912Ssam if (!intro) 12713912Ssam printf("%s\t", headbuf); 12863443Smckusick linbuf[0] = '\0'; 1291022Sbill for (;;) { 13063443Smckusick if (fgets(headbuf, sizeof headbuf, stdin) == NULL) 1311022Sbill break; 13263443Smckusick if (headbuf[0] == '.') { 13363443Smckusick if (headbuf[1] == 'S' && headbuf[2] == 'H') 1341022Sbill break; 13563443Smckusick if (headbuf[1] == 's' && headbuf[2] == 'h') 1361022Sbill break; 1371022Sbill } 13863443Smckusick if (i != 0) 13963443Smckusick strcat(linbuf, " "); 14063443Smckusick i++; 14163443Smckusick trimln(headbuf); 14263443Smckusick strcat(linbuf, headbuf); 14363443Smckusick } 14463443Smckusick if (intro) 14563443Smckusick split(linbuf, name); 14663443Smckusick else 14763443Smckusick printf("%s\n", linbuf); 14863443Smckusick return; 14963443Smckusick 15063443Smckusick newman: 15163443Smckusick for (;;) { 15263443Smckusick if (fgets(linbuf, sizeof linbuf, stdin) == NULL) 15363443Smckusick return; 15463443Smckusick if (linbuf[0] != '.') 15513912Ssam continue; 15663443Smckusick if (linbuf[1] == 'S' && linbuf[2] == 'h') 15763443Smckusick break; 15863443Smckusick } 15963443Smckusick trimln(headbuf); 16063443Smckusick if (tocrc) 16163443Smckusick doname(name); 16263443Smckusick if (!tocrc && !intro) 16363443Smckusick printf(".TH%s\t", &headbuf[3]); 16463443Smckusick linbuf[0] = '\0'; 16563443Smckusick for (;;) { 16663443Smckusick if (fgets(headbuf, sizeof headbuf, stdin) == NULL) 16763443Smckusick break; 16863443Smckusick if (headbuf[0] == '.') { 16963443Smckusick if (headbuf[1] == 'S' && headbuf[2] == 'h') 17063443Smckusick break; 17113912Ssam } 1721022Sbill if (i != 0) 17363443Smckusick strcat(linbuf, " "); 1741022Sbill i++; 17563443Smckusick trimln(headbuf); 176*63530Smckusick for (loc = strchr(headbuf, ' '); loc; loc = strchr(loc, ' ')) 17763443Smckusick if (loc[1] == ',') 17863443Smckusick strcpy(loc, &loc[1]); 17963443Smckusick else 18063443Smckusick loc++; 18163443Smckusick if (headbuf[0] != '.') { 18263443Smckusick strcat(linbuf, headbuf); 18363443Smckusick } else { 184*63530Smckusick /* 185*63530Smckusick * Get rid of quotes in macros. 186*63530Smckusick */ 187*63530Smckusick for (loc = strchr(&headbuf[4], '"'); loc; ) { 188*63530Smckusick strcpy(loc, &loc[1]); 189*63530Smckusick loc = strchr(loc, '"'); 190*63530Smckusick } 191*63530Smckusick /* 192*63530Smckusick * Handle cross references 193*63530Smckusick */ 194*63530Smckusick if (headbuf[1] == 'X' && headbuf[2] == 'r') { 195*63530Smckusick for (loc = &headbuf[4]; *loc != ' '; loc++) 196*63530Smckusick continue; 197*63530Smckusick loc[0] = '('; 198*63530Smckusick loc[2] = ')'; 199*63530Smckusick loc[3] = '\0'; 200*63530Smckusick } 201*63530Smckusick /* 202*63530Smckusick * Put dash between names and description. 203*63530Smckusick */ 20463443Smckusick if (headbuf[1] == 'N' && headbuf[2] == 'd') 20563443Smckusick strcat(linbuf, "\\- "); 206*63530Smckusick /* 207*63530Smckusick * Skip over macro names. 208*63530Smckusick */ 20963443Smckusick strcat(linbuf, &headbuf[4]); 21063443Smckusick } 2111022Sbill } 21263443Smckusick if (intro) 21363443Smckusick split(linbuf, name); 21463443Smckusick else 21563443Smckusick printf("%s\n", linbuf); 2161022Sbill } 2171022Sbill 21860088Sbostic void 2191022Sbill trimln(cp) 2201022Sbill register char *cp; 2211022Sbill { 2221022Sbill 2231022Sbill while (*cp) 2241022Sbill cp++; 2251022Sbill if (*--cp == '\n') 2261022Sbill *cp = 0; 2271022Sbill } 22813912Ssam 22960088Sbostic void 23013912Ssam doname(name) 23113912Ssam char *name; 23213912Ssam { 23313912Ssam register char *dp = name, *ep; 23413912Ssam 23513912Ssam again: 23613912Ssam while (*dp && *dp != '.') 23713912Ssam putchar(*dp++); 23813912Ssam if (*dp) 23913912Ssam for (ep = dp+1; *ep; ep++) 24013912Ssam if (*ep == '.') { 24113912Ssam putchar(*dp++); 24213912Ssam goto again; 24313912Ssam } 24413912Ssam putchar('('); 24513912Ssam if (*dp) 24613912Ssam dp++; 24713912Ssam while (*dp) 24813912Ssam putchar (*dp++); 24913912Ssam putchar(')'); 25013912Ssam putchar(' '); 25113912Ssam } 25213912Ssam 25360088Sbostic void 25413912Ssam split(line, name) 25513912Ssam char *line, *name; 25613912Ssam { 25713912Ssam register char *cp, *dp; 25813912Ssam char *sp, *sep; 25913912Ssam 26060088Sbostic cp = strchr(line, '-'); 26113912Ssam if (cp == 0) 26213912Ssam return; 26313912Ssam sp = cp + 1; 26413912Ssam for (--cp; *cp == ' ' || *cp == '\t' || *cp == '\\'; cp--) 26513912Ssam ; 26613912Ssam *++cp = '\0'; 26713912Ssam while (*sp && (*sp == ' ' || *sp == '\t')) 26813912Ssam sp++; 26913912Ssam for (sep = "", dp = line; dp && *dp; dp = cp, sep = "\n") { 27060088Sbostic cp = strchr(dp, ','); 27113912Ssam if (cp) { 27213912Ssam register char *tp; 27313912Ssam 27413912Ssam for (tp = cp - 1; *tp == ' ' || *tp == '\t'; tp--) 27513912Ssam ; 27613912Ssam *++tp = '\0'; 27713912Ssam for (++cp; *cp == ' ' || *cp == '\t'; cp++) 27813912Ssam ; 27913912Ssam } 28013912Ssam printf("%s%s\t", sep, dp); 28113913Ssam dorefname(name); 28213912Ssam printf("\t%s", sp); 28313912Ssam } 28413912Ssam } 28513913Ssam 28660088Sbostic void 28713913Ssam dorefname(name) 28813913Ssam char *name; 28913913Ssam { 29013913Ssam register char *dp = name, *ep; 29113913Ssam 29213913Ssam again: 29313913Ssam while (*dp && *dp != '.') 29413913Ssam putchar(*dp++); 29513913Ssam if (*dp) 29613913Ssam for (ep = dp+1; *ep; ep++) 29713913Ssam if (*ep == '.') { 29813913Ssam putchar(*dp++); 29913913Ssam goto again; 30013913Ssam } 30113913Ssam putchar('.'); 30213913Ssam if (*dp) 30313913Ssam dp++; 30413913Ssam while (*dp) 30513913Ssam putchar (*dp++); 30613913Ssam } 30746048Sbostic 30860088Sbostic void 30946048Sbostic usage() 31046048Sbostic { 31146048Sbostic (void)fprintf(stderr, "usage: getNAME [-it] file ...\n"); 31246048Sbostic exit(1); 31346048Sbostic } 314