1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
/*
* Help Viewer
*
* Copyright 1996 Ulrich Schmid
* 2002, 2008 Eric Pouech
* 2007 Kirill K. Smirnov
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
struct tagHelpFile;
typedef struct
{
char type[10];
char name[9];
char caption[51];
POINT origin;
SIZE size;
int style;
DWORD win_style;
COLORREF sr_color; /* color for scrollable region */
COLORREF nsr_color; /* color for non scrollable region */
} HLPFILE_WINDOWINFO;
typedef struct tagHlpFileLink
{
enum {hlp_link_link, hlp_link_popup, hlp_link_macro} cookie;
LPCSTR string; /* name of the file to for the link (NULL if same file) */
LONG hash; /* topic index */
unsigned bClrChange : 1; /* true if the link is green & underlined */
unsigned bHotSpot : 1; /* true if the link is an hotspot (actually HLPFILE_HOTSPOTLINK) */
unsigned window; /* window number for displaying the link (-1 is current) */
DWORD cpMin;
DWORD cpMax;
struct tagHlpFileLink* next;
} HLPFILE_LINK;
typedef struct tagHlpFileHotSpotLink
{
HLPFILE_LINK link;
unsigned x;
unsigned y;
unsigned width;
unsigned height;
} HLPFILE_HOTSPOTLINK;
typedef struct tagHlpFileMacro
{
LPCSTR lpszMacro;
struct tagHlpFileMacro* next;
} HLPFILE_MACRO;
typedef struct tagHlpFilePage
{
LPSTR lpszTitle;
HLPFILE_MACRO* first_macro;
HLPFILE_LINK* first_link;
unsigned wNumber;
unsigned offset;
DWORD reference;
struct tagHlpFilePage* next;
struct tagHlpFilePage* prev;
DWORD browse_bwd;
DWORD browse_fwd;
struct tagHlpFileFile* file;
} HLPFILE_PAGE;
typedef struct
{
LONG lMap;
unsigned long offset;
} HLPFILE_MAP;
typedef struct
{
LOGFONT LogFont;
HFONT hFont;
COLORREF color;
} HLPFILE_FONT;
typedef struct tagHlpFileFile
{
BYTE* file_buffer;
UINT file_buffer_size;
LPSTR lpszPath;
LPSTR lpszTitle;
LPSTR lpszCopyright;
HLPFILE_PAGE* first_page;
HLPFILE_PAGE* last_page;
HLPFILE_MACRO* first_macro;
BYTE* Context;
BYTE* kwbtree;
BYTE* kwdata;
unsigned wMapLen;
HLPFILE_MAP* Map;
unsigned wTOMapLen;
unsigned* TOMap;
unsigned long contents_start;
struct tagHlpFileFile* prev;
struct tagHlpFileFile* next;
unsigned wRefCount;
unsigned short version;
unsigned short flags;
unsigned short charset;
unsigned short tbsize; /* topic block size */
unsigned short dsize; /* decompress size */
unsigned short compressed;
unsigned hasPhrases; /* file has |Phrases */
unsigned hasPhrases40; /* file has |PhrIndex/|PhrImage */
UINT num_phrases;
unsigned* phrases_offsets;
char* phrases_buffer;
BYTE** topic_map;
BYTE* topic_end;
UINT topic_maplen;
unsigned numBmps;
HBITMAP* bmps;
unsigned numFonts;
HLPFILE_FONT* fonts;
unsigned numWindows;
HLPFILE_WINDOWINFO* windows;
HICON hIcon;
BOOL has_popup_color;
COLORREF popup_color;
LPSTR help_on_file;
} HLPFILE;
/*
* Compare function type for HLPFILE_BPTreeSearch function.
*
* PARAMS
* p [I] pointer to testing block (key + data)
* key [I] pointer to key value to look for
* leaf [I] whether this function called for index of leaf page
* next [O] pointer to pointer to next block
*/
typedef int (*HLPFILE_BPTreeCompare)(void *p, const void *key,
int leaf, void **next);
/*
* Callback function type for HLPFILE_BPTreeEnum function.
*
* PARAMS
* p [I] pointer to data block
* next [O] pointer to pointer to next block
* cookie [IO] cookie data
*/
typedef void (*HLPFILE_BPTreeCallback)(void *p, void **next, void *cookie);
HLPFILE* HLPFILE_ReadHlpFile(LPCSTR lpszPath);
HLPFILE_PAGE* HLPFILE_PageByHash(HLPFILE* hlpfile, LONG lHash, ULONG* relative);
HLPFILE_PAGE* HLPFILE_PageByMap(HLPFILE* hlpfile, LONG lMap, ULONG* relative);
HLPFILE_PAGE* HLPFILE_PageByOffset(HLPFILE* hlpfile, LONG offset, ULONG* relative);
LONG HLPFILE_Hash(LPCSTR lpszContext);
void HLPFILE_FreeHlpFile(HLPFILE*);
void HLPFILE_BPTreeEnum(BYTE*, HLPFILE_BPTreeCallback cb, void *cookie);
struct RtfData {
BOOL in_text;
char* data; /* RTF stream start */
char* ptr; /* current position in stream */
unsigned allocated; /* overall allocated size */
unsigned char_pos; /* current char position (in richedit) */
char* where; /* pointer to feed back richedit */
unsigned font_scale; /* how to scale fonts */
HLPFILE_LINK*first_link;
HLPFILE_LINK*current_link;
BOOL force_color;
unsigned relative; /* offset within page to lookup for */
unsigned char_pos_rel; /* char_pos correspondinf to relative */
};
BOOL HLPFILE_BrowsePage(HLPFILE_PAGE*, struct RtfData* rd,
unsigned font_scale, unsigned relative);