date and time created 88/07/21 17:33:38 by marc
[unix-history] / usr / src / local / sccscmds / sccscmds.ok / cmd / help.c
CommitLineData
6125c060
EA
1# include "../hdr/defines.h"
2
cdf06976 3static 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
42char oldfile[] = "/usr/local/lib/sccs.hf";
43char helpdir[] = "/usr/local/lib/help/";
6125c060
EA
44char hfile[64];
45FILE *iop;
46char line [512];
47
48
49main(argc,argv)
50int argc;
51char *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
71findprt(p)
72char *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
140ask()
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
152clean_up()
153{
154 fclose(iop);
155}