1 /*
2 * HELP.C
3 *
4 * Written by John Dennis and released to the public domain.
5 *
6 * Help subsystem code.
7 */
8
9 #include <stdio.h>
10 #include <string.h>
11 #include "memextra.h"
12 #include "winsys.h"
13 #include "menu.h"
14 #include "main.h"
15 #include "keys.h"
16 #include "help.h"
17
18 static FILE *help;
19 static HFileHdr Fheader;
20 static HTopicHdr *topics;
21 static char *line;
22 static int setup;
23 static int CurrTopic;
24 static int numTopics;
25
26 #ifdef __DJGPP__
27 #include <io.h>
28 #include <fcntl.h>
29 #endif
30
31 #ifdef __TURBOC__
32 #include <share.h>
33 #endif
34
HelpInit(char * fileName)35 void HelpInit(char *fileName)
36 {
37 int i;
38
39 #ifdef __TURBOC__
40 help = _fsopen(fileName, "rb", SH_DENYNONE);
41 #elif defined(__DJGPP__)
42 int handle = sopen(fileName, O_RDONLY|O_BINARY, SH_DENYNO, 0);
43 if (handle == -1)
44 {
45 return;
46 }
47 help = fdopen(handle, "rb");
48 #else
49 help = fopen(fileName, "rb");
50 #endif
51 if (help == NULL)
52 {
53 return;
54 }
55
56 setup = 0;
57
58 fread(&Fheader, sizeof(HFileHdr), 1, help);
59 numTopics = (Fheader.topics[1] << 8) | Fheader.topics[0];
60 topics = xcalloc(numTopics, sizeof *topics);
61 for (i = 0; i < numTopics; i++)
62 {
63 fread(&topics[i], sizeof (HTopicHdr), 1, help);
64 }
65 setup = 1;
66 CurrTopic = 0;
67 }
68
DisplayPage(long offset,int max)69 void DisplayPage(long offset, int max)
70 {
71 char *s;
72 int done;
73 int line_num;
74
75 done = 0;
76 line_num = 0;
77
78 fseek(help, offset, SEEK_SET);
79
80 if (line == NULL) line = xmalloc(255);
81
82 WndClear(0, 0, 54, 14, cm[HP_NTXT]);
83
84 while (!done)
85 {
86 if (line_num == max)
87 {
88 break;
89 }
90
91 if (fgets(line, 254, help) == NULL)
92 {
93 break;
94 }
95
96 if (!strncmp(line, "*Page", 5) || !strncmp(line, "*End", 4))
97 {
98 break;
99 }
100
101 if (*line != '\n')
102 {
103 s = strchr(line, '\n');
104 if (s != NULL)
105 {
106 *s = '\0';
107 }
108
109 if (!strncmp(line, "*High", 5))
110 {
111 s = line + 5;
112 WndWriteStr(0, line_num, cm[HP_TTXT], s);
113 }
114 else
115 {
116 WndWriteStr(0, line_num, cm[HP_NTXT], line);
117 }
118 }
119 line_num++;
120 }
121 }
122
DoHelp(int topic)123 void DoHelp(int topic)
124 {
125 WND *hWnd, *hCurr;
126 long offset[20];
127 int depth, page, pages, ch, done;
128
129 if (help == NULL)
130 {
131 return;
132 }
133
134 if (topic < 0 || topic > numTopics)
135 {
136 return;
137 }
138
139 if (line == NULL) line = xmalloc(255);
140
141 fseek(help, topics[topic].offset, SEEK_SET);
142
143 if (fgets(line, 254, help) == NULL)
144 {
145 return;
146 }
147
148 if (strncmp(line, "*Begin", 6))
149 {
150 return;
151 }
152
153 done = 0;
154 pages = 1;
155 offset[pages - 1] = ftell(help);
156
157 while (!done)
158 {
159 if (fgets(line, 254, help) == NULL)
160 {
161 return;
162 }
163
164 if (!strncmp(line, "*End", 4))
165 {
166 break;
167 }
168
169 if (!strncmp(line, "*Page", 5))
170 {
171 pages++;
172 offset[pages - 1] = ftell(help);
173 }
174 }
175
176 fseek(help, offset[0], SEEK_SET);
177
178 hCurr = WndTop();
179 hWnd = WndPopUp(60, 18, INSBDR | SHADOW, cm[HP_BTXT], cm[HP_NTXT]);
180
181 WndTitle(" Help ", cm[HP_TTXT]);
182
183 done = 0;
184 page = 0;
185 depth = 14;
186
187 DisplayPage(offset[page], depth);
188
189 while (!done)
190 {
191 ch = TTGetChr();
192 switch (ch)
193 {
194 case Key_PgDn:
195 case Key_Dwn:
196 if (page + 1 < pages)
197 {
198 page++;
199 DisplayPage(offset[page], depth);
200 }
201 break;
202
203 case Key_PgUp:
204 case Key_Up:
205 if (page > 0)
206 {
207 page--;
208 DisplayPage(offset[page], depth);
209 }
210 break;
211
212 case Key_Esc:
213 done = TRUE;
214 break;
215
216 default:
217 break;
218 }
219 }
220 WndClose(hWnd);
221 WndCurr(hCurr);
222 }
223