Commit | Line | Data |
---|---|---|
6125c060 EA |
1 | # include "../hdr/defines.h" |
2 | ||
cdf06976 | 3 | static char Sccsid[] = "@(#)help.c 4.3 %G%"; |
6125c060 EA |
4 | |
5 | /* | |
6 | Program to locate helpful info in an ascii file. | |
7 | The program accepts a variable number of arguments. | |
8 | ||
9 | The file to be searched is determined from the argument. If the | |
10 | argument does not contain numerics, the search | |
11 | will be attempted on '/usr/local/lib/help/cmds', with the search key | |
12 | being the whole argument. | |
13 | If the argument begins with non-numerics but contains | |
14 | numerics (e.g, zz32) the search will be attempted on | |
15 | '/usr/local/lib/help/<non-numeric prefix>', (e.g,/usr/lib/help/zz), | |
16 | with the search key being <remainder of arg>, (e.g., 32). | |
17 | If the argument is all numeric, or if the file as | |
18 | determined above does not exist, the search will be attempted on | |
19 | '/usr/local/lib/sccs.hf', which is the old help file, with the | |
20 | search key being the entire argument. | |
21 | In no case will more than one search per argument be performed. | |
22 | ||
23 | File is formatted as follows: | |
24 | ||
25 | * comment | |
26 | * comment | |
27 | -str1 | |
28 | text | |
29 | -str2 | |
30 | text | |
31 | * comment | |
32 | text | |
33 | -str3 | |
34 | text | |
35 | ||
36 | The "str?" that matches the key is found and | |
37 | the following text lines are printed. | |
38 | Comments are ignored. | |
39 | ||
40 | If the argument is omitted, the program requests it. | |
41 | */ | |
38c01699 JL |
42 | char oldfile[] = "/usr/local/lib/sccs.hf"; |
43 | char helpdir[] = "/usr/local/lib/help/"; | |
6125c060 EA |
44 | char hfile[64]; |
45 | FILE *iop; | |
46 | char line [512]; | |
47 | ||
48 | ||
49 | main(argc,argv) | |
50 | int argc; | |
51 | char *argv[]; | |
52 | { | |
53 | register int i; | |
54 | extern int Fcnt; | |
55 | ||
56 | /* | |
57 | Tell 'fatal' to issue messages, clean up, and return to its caller. | |
58 | */ | |
59 | Fflags = FTLMSG | FTLCLN | FTLJMP; | |
60 | ||
61 | if (argc == 1) | |
62 | findprt(ask()); /* ask user for argument */ | |
63 | else | |
64 | for (i = 1; i < argc; i++) | |
65 | findprt(argv[i]); | |
66 | ||
67 | exit(Fcnt ? 1 : 0); | |
68 | } | |
69 | ||
70 | ||
71 | findprt(p) | |
72 | char *p; | |
73 | { | |
74 | register char *q; | |
75 | char key[50]; | |
76 | ||
77 | if (setjmp(Fjmp)) /* set up to return here from */ | |
78 | return; /* 'fatal' and return to 'main' */ | |
79 | ||
80 | if (size(p) > 50) | |
81 | fatal("argument too long (he2)"); | |
82 | ||
83 | q = p; | |
84 | ||
85 | while (*q && !numeric(*q)) | |
86 | q++; | |
87 | ||
88 | if (*q == '\0') { /* all alphabetics */ | |
89 | copy(p,key); | |
90 | cat(hfile,helpdir,"cmds",0); | |
91 | if (!exists(hfile)) | |
92 | copy(oldfile,hfile); | |
93 | } | |
94 | else | |
95 | if (q == p) { /* first char numeric */ | |
96 | copy(p,key); | |
97 | copy(oldfile,hfile); | |
98 | } | |
99 | else { /* first char alpha, then numeric */ | |
100 | copy(p,key); /* key used as temporary */ | |
101 | *(key + (q - p)) = '\0'; | |
102 | cat(hfile,helpdir,key,0); | |
103 | copy(q,key); | |
104 | if (!exists(hfile)) { | |
105 | copy(p,key); | |
106 | copy(oldfile,hfile); | |
107 | } | |
108 | } | |
109 | ||
110 | iop = xfopen(hfile,0); | |
111 | ||
112 | /* | |
113 | Now read file, looking for key. | |
114 | */ | |
115 | while ((q = fgets(line,512,iop)) != NULL) { | |
116 | repl(line,'\n','\0'); /* replace newline char */ | |
117 | if (line[0] == '-' && equal(&line[1],key)) | |
118 | break; | |
119 | } | |
120 | ||
121 | if (q == NULL) { /* endfile? */ | |
122 | printf("\n"); | |
cdf06976 KB |
123 | sprintf(Error,"%s not found (he1)",p); |
124 | fatal(Error); | |
6125c060 EA |
125 | } |
126 | ||
127 | printf("\n%s:\n",p); | |
128 | ||
129 | while (fgets(line,512,iop) != NULL && line[0] == '-') | |
130 | ; | |
131 | do { | |
132 | if (line[0] != '*') | |
133 | printf("%s",line); | |
134 | } while (fgets(line,512,iop) != NULL && line[0] != '-'); | |
135 | ||
136 | fclose(iop); | |
137 | } | |
138 | ||
139 | ||
140 | ask() | |
141 | { | |
142 | static char resp[51]; | |
143 | ||
144 | iop = stdin; | |
145 | ||
146 | printf("msg number or comd name? "); | |
147 | fgets(resp,51,iop); | |
148 | return(repl(resp,'\n','\0')); | |
149 | } | |
150 | ||
151 | ||
152 | clean_up() | |
153 | { | |
154 | fclose(iop); | |
155 | } |