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