[PATCH 03/11] [WinHelp]: moved all static data used when parsing HLP files into the internal structures
Eric Pouech
eric.pouech at orange.fr
Fri Apr 18 14:33:57 CDT 2008
A+
---
programs/winhelp/hlpfile.c | 209 ++++++++++++++++++++------------------------
programs/winhelp/hlpfile.h | 11 ++
2 files changed, 104 insertions(+), 116 deletions(-)
diff --git a/programs/winhelp/hlpfile.c b/programs/winhelp/hlpfile.c
index bdb0092..4d21275 100644
--- a/programs/winhelp/hlpfile.c
+++ b/programs/winhelp/hlpfile.c
@@ -2,7 +2,7 @@
* Help Viewer
*
* Copyright 1996 Ulrich Schmid
- * 2002 Eric Pouech
+ * 2002-2008 Eric Pouech
* 2007 Kirill K. Smirnov
*
* This library is free software; you can redistribute it and/or
@@ -50,22 +50,6 @@ static inline unsigned GET_UINT(const BYTE* buffer, unsigned i)
}
static HLPFILE *first_hlpfile = 0;
-static BYTE *file_buffer;
-static UINT file_buffer_size;
-
-static struct
-{
- UINT num;
- unsigned* offsets;
- char* buffer;
-} phrases;
-
-static struct
-{
- BYTE** map;
- BYTE* end;
- UINT wMapLen;
-} topic;
static struct
{
@@ -77,8 +61,8 @@ static struct
} attributes;
static BOOL HLPFILE_DoReadHlpFile(HLPFILE*, LPCSTR);
-static BOOL HLPFILE_ReadFileToBuffer(HFILE);
-static BOOL HLPFILE_FindSubFile(LPCSTR name, BYTE**, BYTE**);
+static BOOL HLPFILE_ReadFileToBuffer(HLPFILE*, HFILE);
+static BOOL HLPFILE_FindSubFile(HLPFILE*, LPCSTR, BYTE**, BYTE**);
static BOOL HLPFILE_SystemCommands(HLPFILE*);
static INT HLPFILE_UncompressedLZ77_Size(BYTE *ptr, BYTE *end);
static BYTE* HLPFILE_UncompressLZ77(BYTE *ptr, BYTE *end, BYTE *newptr);
@@ -90,8 +74,8 @@ static BOOL HLPFILE_GetKeywords(HLPFILE*);
static BOOL HLPFILE_GetMap(HLPFILE*);
static BOOL HLPFILE_AddPage(HLPFILE*, BYTE*, BYTE*, unsigned);
static BOOL HLPFILE_AddParagraph(HLPFILE*, BYTE *, BYTE*, unsigned*);
-static void HLPFILE_Uncompress2(const BYTE*, const BYTE*, BYTE*, const BYTE*);
-static BOOL HLPFILE_Uncompress3(char*, const char*, const BYTE*, const BYTE*);
+static void HLPFILE_Uncompress2(HLPFILE*, const BYTE*, const BYTE*, BYTE*, const BYTE*);
+static BOOL HLPFILE_Uncompress3(HLPFILE*, char*, const char*, const BYTE*, const BYTE*);
static void HLPFILE_UncompressRLE(const BYTE* src, const BYTE* end, BYTE** dst, unsigned dstsz);
static BOOL HLPFILE_ReadFont(HLPFILE* hlpfile);
@@ -285,23 +269,12 @@ HLPFILE *HLPFILE_ReadHlpFile(LPCSTR lpszPath)
first_hlpfile = hlpfile;
if (hlpfile->next) hlpfile->next->prev = hlpfile;
- phrases.offsets = NULL;
- phrases.buffer = NULL;
- topic.map = NULL;
- topic.end = NULL;
- file_buffer = NULL;
-
if (!HLPFILE_DoReadHlpFile(hlpfile, lpszPath))
{
HLPFILE_FreeHlpFile(hlpfile);
hlpfile = 0;
}
- HeapFree(GetProcessHeap(), 0, phrases.offsets);
- HeapFree(GetProcessHeap(), 0, phrases.buffer);
- HeapFree(GetProcessHeap(), 0, topic.map);
- HeapFree(GetProcessHeap(), 0, file_buffer);
-
return hlpfile;
}
@@ -321,7 +294,7 @@ static BOOL HLPFILE_DoReadHlpFile(HLPFILE *hlpfile, LPCSTR lpszPath)
hFile = OpenFile(lpszPath, &ofs, OF_READ);
if (hFile == HFILE_ERROR) return FALSE;
- ret = HLPFILE_ReadFileToBuffer(hFile);
+ ret = HLPFILE_ReadFileToBuffer(hlpfile, hFile);
_lclose(hFile);
if (!ret) return FALSE;
@@ -334,7 +307,7 @@ static BOOL HLPFILE_DoReadHlpFile(HLPFILE *hlpfile, LPCSTR lpszPath)
if (!HLPFILE_Uncompress_Topic(hlpfile)) return FALSE;
if (!HLPFILE_ReadFont(hlpfile)) return FALSE;
- buf = topic.map[0];
+ buf = hlpfile->topic_map[0];
old_index = -1;
offs = 0;
do
@@ -361,10 +334,10 @@ static BOOL HLPFILE_DoReadHlpFile(HLPFILE *hlpfile, LPCSTR lpszPath)
WINE_TRACE("ref=%08x => [%u/%u]\n", ref, index, offset);
- if (index >= topic.wMapLen) {WINE_WARN("maplen\n"); break;}
- buf = topic.map[index] + offset;
- if (buf + 0x15 >= topic.end) {WINE_WARN("extra\n"); break;}
- end = min(buf + GET_UINT(buf, 0), topic.end);
+ if (index >= hlpfile->topic_maplen) {WINE_WARN("maplen\n"); break;}
+ buf = hlpfile->topic_map[index] + offset;
+ if (buf + 0x15 >= hlpfile->topic_end) {WINE_WARN("extra\n"); break;}
+ end = min(buf + GET_UINT(buf, 0), hlpfile->topic_end);
if (index != old_index) {offs = 0; old_index = index;}
switch (buf[0x14])
@@ -426,9 +399,9 @@ static BOOL HLPFILE_AddPage(HLPFILE *hlpfile, BYTE *buf, BYTE *end, unsigned off
{
/* need to decompress */
if (hlpfile->hasPhrases)
- HLPFILE_Uncompress2(title, end, (BYTE*)page->lpszTitle, (BYTE*)page->lpszTitle + titlesize);
+ HLPFILE_Uncompress2(hlpfile, title, end, (BYTE*)page->lpszTitle, (BYTE*)page->lpszTitle + titlesize);
else if (hlpfile->hasPhrases40)
- HLPFILE_Uncompress3(page->lpszTitle, page->lpszTitle + titlesize, title, end);
+ HLPFILE_Uncompress3(hlpfile, page->lpszTitle, page->lpszTitle + titlesize, title, end);
else
{
WINE_FIXME("Text size is too long, splitting\n");
@@ -817,7 +790,7 @@ static BOOL HLPFILE_LoadGfxByIndex(HLPFILE *hlpfile, unsigned index,
sprintf(tmp, "|bm%u", index);
- if (!HLPFILE_FindSubFile(tmp, &ref, &end)) {WINE_WARN("no sub file\n"); return FALSE;}
+ if (!HLPFILE_FindSubFile(hlpfile, tmp, &ref, &end)) {WINE_WARN("no sub file\n"); return FALSE;}
ref += 9;
@@ -904,9 +877,9 @@ static BOOL HLPFILE_AddParagraph(HLPFILE *hlpfile, BYTE *buf, BYTE *end, unsigne
{
/* need to decompress */
if (hlpfile->hasPhrases)
- HLPFILE_Uncompress2(buf + datalen, end, (BYTE*)text, (BYTE*)text + size);
+ HLPFILE_Uncompress2(hlpfile, buf + datalen, end, (BYTE*)text, (BYTE*)text + size);
else if (hlpfile->hasPhrases40)
- HLPFILE_Uncompress3(text, text + size, buf + datalen, end);
+ HLPFILE_Uncompress3(hlpfile, text, text + size, buf + datalen, end);
else
{
WINE_FIXME("Text size is too long, splitting\n");
@@ -1219,7 +1192,7 @@ static BOOL HLPFILE_ReadFont(HLPFILE* hlpfile)
unsigned face_num, dscr_num, face_offset, dscr_offset;
BYTE flag, family;
- if (!HLPFILE_FindSubFile("|FONT", &ref, &end))
+ if (!HLPFILE_FindSubFile(hlpfile, "|FONT", &ref, &end))
{
WINE_WARN("no subfile FONT\n");
hlpfile->numFonts = 0;
@@ -1308,7 +1281,7 @@ static BOOL HLPFILE_ReadFont(HLPFILE* hlpfile)
*
* HLPFILE_ReadFileToBuffer
*/
-static BOOL HLPFILE_ReadFileToBuffer(HFILE hFile)
+static BOOL HLPFILE_ReadFileToBuffer(HLPFILE* hlpfile, HFILE hFile)
{
BYTE header[16], dummy[1];
@@ -1318,17 +1291,17 @@ static BOOL HLPFILE_ReadFileToBuffer(HFILE hFile)
if (GET_UINT(header, 0) != 0x00035F3F)
{WINE_WARN("wrong header\n"); return FALSE;};
- file_buffer_size = GET_UINT(header, 12);
- file_buffer = HeapAlloc(GetProcessHeap(), 0, file_buffer_size + 1);
- if (!file_buffer) return FALSE;
+ hlpfile->file_buffer_size = GET_UINT(header, 12);
+ hlpfile->file_buffer = HeapAlloc(GetProcessHeap(), 0, hlpfile->file_buffer_size + 1);
+ if (!hlpfile->file_buffer) return FALSE;
- memcpy(file_buffer, header, 16);
- if (_hread(hFile, file_buffer + 16, file_buffer_size - 16) != file_buffer_size - 16)
+ memcpy(hlpfile->file_buffer, header, 16);
+ if (_hread(hFile, hlpfile->file_buffer + 16, hlpfile->file_buffer_size - 16) !=hlpfile->file_buffer_size - 16)
{WINE_WARN("filesize1\n"); return FALSE;};
if (_hread(hFile, dummy, 1) != 0) WINE_WARN("filesize2\n");
- file_buffer[file_buffer_size] = '\0'; /* FIXME: was '0', sounds ackward to me */
+ hlpfile->file_buffer[hlpfile->file_buffer_size] = '\0'; /* FIXME: was '0', sounds ackward to me */
return TRUE;
}
@@ -1351,22 +1324,22 @@ static int comp_FindSubFile(void *p, const void *key,
*
* HLPFILE_FindSubFile
*/
-static BOOL HLPFILE_FindSubFile(LPCSTR name, BYTE **subbuf, BYTE **subend)
+static BOOL HLPFILE_FindSubFile(HLPFILE* hlpfile, LPCSTR name, BYTE **subbuf, BYTE **subend)
{
BYTE *ptr;
WINE_TRACE("looking for file '%s'\n", name);
- ptr = HLPFILE_BPTreeSearch(file_buffer + GET_UINT(file_buffer, 4),
+ ptr = HLPFILE_BPTreeSearch(hlpfile->file_buffer + GET_UINT(hlpfile->file_buffer, 4),
name, comp_FindSubFile);
if (!ptr) return FALSE;
- *subbuf = file_buffer + GET_UINT(ptr, strlen(name)+1);
- if (*subbuf >= file_buffer + file_buffer_size)
+ *subbuf = hlpfile->file_buffer + GET_UINT(ptr, strlen(name)+1);
+ if (*subbuf >= hlpfile->file_buffer + hlpfile->file_buffer_size)
{
WINE_ERR("internal file %s does not fit\n", name);
return FALSE;
}
*subend = *subbuf + GET_UINT(*subbuf, 0);
- if (*subend > file_buffer + file_buffer_size)
+ if (*subend > hlpfile->file_buffer + hlpfile->file_buffer_size)
{
WINE_ERR("internal file %s does not fit\n", name);
return FALSE;
@@ -1392,7 +1365,7 @@ static BOOL HLPFILE_SystemCommands(HLPFILE* hlpfile)
hlpfile->lpszTitle = NULL;
- if (!HLPFILE_FindSubFile("|SYSTEM", &buf, &end)) return FALSE;
+ if (!HLPFILE_FindSubFile(hlpfile, "|SYSTEM", &buf, &end)) return FALSE;
magic = GET_USHORT(buf + 9, 0);
minor = GET_USHORT(buf + 9, 2);
@@ -1594,14 +1567,14 @@ static BOOL HLPFILE_UncompressLZ77_Phrases(HLPFILE* hlpfile)
UINT i, num, dec_size, head_size;
BYTE *buf, *end;
- if (!HLPFILE_FindSubFile("|Phrases", &buf, &end)) return FALSE;
+ if (!HLPFILE_FindSubFile(hlpfile, "|Phrases", &buf, &end)) return FALSE;
if (hlpfile->version <= 16)
head_size = 13;
else
head_size = 17;
- num = phrases.num = GET_USHORT(buf, 9);
+ num = hlpfile->num_phrases = GET_USHORT(buf, 9);
if (buf + 2 * num + 0x13 >= end) {WINE_WARN("1a\n"); return FALSE;};
if (hlpfile->version <= 16)
@@ -1609,22 +1582,22 @@ static BOOL HLPFILE_UncompressLZ77_Phrases(HLPFILE* hlpfile)
else
dec_size = HLPFILE_UncompressedLZ77_Size(buf + 0x13 + 2 * num, end);
- phrases.offsets = HeapAlloc(GetProcessHeap(), 0, sizeof(unsigned) * (num + 1));
- phrases.buffer = HeapAlloc(GetProcessHeap(), 0, dec_size);
- if (!phrases.offsets || !phrases.buffer)
+ hlpfile->phrases_offsets = HeapAlloc(GetProcessHeap(), 0, sizeof(unsigned) * (num + 1));
+ hlpfile->phrases_buffer = HeapAlloc(GetProcessHeap(), 0, dec_size);
+ if (!hlpfile->phrases_offsets || !hlpfile->phrases_buffer)
{
- HeapFree(GetProcessHeap(), 0, phrases.offsets);
- HeapFree(GetProcessHeap(), 0, phrases.buffer);
+ HeapFree(GetProcessHeap(), 0, hlpfile->phrases_offsets);
+ HeapFree(GetProcessHeap(), 0, hlpfile->phrases_buffer);
return FALSE;
}
for (i = 0; i <= num; i++)
- phrases.offsets[i] = GET_USHORT(buf, head_size + 2 * i) - 2 * num - 2;
+ hlpfile->phrases_offsets[i] = GET_USHORT(buf, 0x11 + 2 * i) - 2 * num - 2;
if (hlpfile->version <= 16)
- memcpy(phrases.buffer, buf + 15 + 2*num, dec_size);
+ memcpy(hlpfile->phrases_buffer, buf + 15 + 2*num, dec_size);
else
- HLPFILE_UncompressLZ77(buf + 0x13 + 2 * num, end, (BYTE*)phrases.buffer);
+ HLPFILE_UncompressLZ77(buf + 0x13 + 2 * num, end, (BYTE*)hlpfile->phrases_buffer);
hlpfile->hasPhrases = TRUE;
return TRUE;
@@ -1644,12 +1617,12 @@ static BOOL HLPFILE_Uncompress_Phrases40(HLPFILE* hlpfile)
unsigned int i;
unsigned short bc, n;
- if (!HLPFILE_FindSubFile("|PhrIndex", &buf_idx, &end_idx) ||
- !HLPFILE_FindSubFile("|PhrImage", &buf_phs, &end_phs)) return FALSE;
+ if (!HLPFILE_FindSubFile(hlpfile, "|PhrIndex", &buf_idx, &end_idx) ||
+ !HLPFILE_FindSubFile(hlpfile, "|PhrImage", &buf_phs, &end_phs)) return FALSE;
ptr = (long*)(buf_idx + 9 + 28);
bc = GET_USHORT(buf_idx, 9 + 24) & 0x0F;
- num = phrases.num = GET_USHORT(buf_idx, 9 + 4);
+ num = hlpfile->num_phrases = GET_USHORT(buf_idx, 9 + 4);
WINE_TRACE("Index: Magic=%08x #entries=%u CpsdSize=%u PhrImgSize=%u\n"
"\tPhrImgCprsdSize=%u 0=%u bc=%x ukn=%x\n",
@@ -1673,18 +1646,18 @@ static BOOL HLPFILE_Uncompress_Phrases40(HLPFILE* hlpfile)
dec_size = max(dec_size, HLPFILE_UncompressedLZ77_Size(buf_phs + 9, end_phs));
}
- phrases.offsets = HeapAlloc(GetProcessHeap(), 0, sizeof(unsigned) * (num + 1));
- phrases.buffer = HeapAlloc(GetProcessHeap(), 0, dec_size);
- if (!phrases.offsets || !phrases.buffer)
+ hlpfile->phrases_offsets = HeapAlloc(GetProcessHeap(), 0, sizeof(unsigned) * (num + 1));
+ hlpfile->phrases_buffer = HeapAlloc(GetProcessHeap(), 0, dec_size);
+ if (!hlpfile->phrases_offsets || !hlpfile->phrases_buffer)
{
- HeapFree(GetProcessHeap(), 0, phrases.offsets);
- HeapFree(GetProcessHeap(), 0, phrases.buffer);
+ HeapFree(GetProcessHeap(), 0, hlpfile->phrases_offsets);
+ HeapFree(GetProcessHeap(), 0, hlpfile->phrases_buffer);
return FALSE;
}
#define getbit() (ptr += (mask < 0), mask = mask*2 + (mask<=0), (*ptr & mask) != 0)
- phrases.offsets[0] = 0;
+ hlpfile->phrases_offsets[0] = 0;
for (i = 0; i < num; i++)
{
for (n = 1; getbit(); n += 1 << bc);
@@ -1693,14 +1666,14 @@ static BOOL HLPFILE_Uncompress_Phrases40(HLPFILE* hlpfile)
if (bc > 2 && getbit()) n += 4;
if (bc > 3 && getbit()) n += 8;
if (bc > 4 && getbit()) n += 16;
- phrases.offsets[i + 1] = phrases.offsets[i] + n;
+ hlpfile->phrases_offsets[i + 1] = hlpfile->phrases_offsets[i] + n;
}
#undef getbit
if (dec_size == cpr_size)
- memcpy(phrases.buffer, buf_phs + 9, dec_size);
+ memcpy(hlpfile->phrases_buffer, buf_phs + 9, dec_size);
else
- HLPFILE_UncompressLZ77(buf_phs + 9, end_phs, (BYTE*)phrases.buffer);
+ HLPFILE_UncompressLZ77(buf_phs + 9, end_phs, (BYTE*)hlpfile->phrases_buffer);
hlpfile->hasPhrases40 = TRUE;
return TRUE;
@@ -1716,16 +1689,16 @@ static BOOL HLPFILE_Uncompress_Topic(HLPFILE* hlpfile)
unsigned int i, newsize = 0;
unsigned int topic_size;
- if (!HLPFILE_FindSubFile("|TOPIC", &buf, &end))
+ if (!HLPFILE_FindSubFile(hlpfile, "|TOPIC", &buf, &end))
{WINE_WARN("topic0\n"); return FALSE;}
buf += 9; /* Skip file header */
topic_size = end - buf;
if (hlpfile->compressed)
{
- topic.wMapLen = (topic_size - 1) / hlpfile->tbsize + 1;
+ hlpfile->topic_maplen = (topic_size - 1) / hlpfile->tbsize + 1;
- for (i = 0; i < topic.wMapLen; i++)
+ for (i = 0; i < hlpfile->topic_maplen; i++)
{
ptr = buf + i * hlpfile->tbsize;
@@ -1735,18 +1708,18 @@ static BOOL HLPFILE_Uncompress_Topic(HLPFILE* hlpfile)
newsize += HLPFILE_UncompressedLZ77_Size(ptr + 0xc, min(end, ptr + hlpfile->tbsize));
}
- topic.map = HeapAlloc(GetProcessHeap(), 0,
- topic.wMapLen * sizeof(topic.map[0]) + newsize);
- if (!topic.map) return FALSE;
- newptr = (BYTE*)(topic.map + topic.wMapLen);
- topic.end = newptr + newsize;
+ hlpfile->topic_map = HeapAlloc(GetProcessHeap(), 0,
+ hlpfile->topic_maplen * sizeof(hlpfile->topic_map[0]) + newsize);
+ if (!hlpfile->topic_map) return FALSE;
+ newptr = (BYTE*)(hlpfile->topic_map + hlpfile->topic_maplen);
+ hlpfile->topic_end = newptr + newsize;
- for (i = 0; i < topic.wMapLen; i++)
+ for (i = 0; i < hlpfile->topic_maplen; i++)
{
ptr = buf + i * hlpfile->tbsize;
if (ptr + 0x44 > end) ptr = end - 0x44;
- topic.map[i] = newptr;
+ hlpfile->topic_map[i] = newptr;
newptr = HLPFILE_UncompressLZ77(ptr + 0xc, min(end, ptr + hlpfile->tbsize), newptr);
}
}
@@ -1755,17 +1728,17 @@ static BOOL HLPFILE_Uncompress_Topic(HLPFILE* hlpfile)
/* basically, we need to copy the TopicBlockSize byte pages
* (removing the first 0x0C) in one single area in memory
*/
- topic.wMapLen = (topic_size - 1) / hlpfile->tbsize + 1;
- topic.map = HeapAlloc(GetProcessHeap(), 0,
- topic.wMapLen * (sizeof(topic.map[0]) + hlpfile->dsize));
- if (!topic.map) return FALSE;
- newptr = (BYTE*)(topic.map + topic.wMapLen);
- topic.end = newptr + topic_size;
-
- for (i = 0; i < topic.wMapLen; i++)
+ hlpfile->topic_maplen = (topic_size - 1) / hlpfile->tbsize + 1;
+ hlpfile->topic_map = HeapAlloc(GetProcessHeap(), 0,
+ hlpfile->topic_maplen * (sizeof(hlpfile->topic_map[0]) + hlpfile->dsize));
+ if (!hlpfile->topic_map) return FALSE;
+ newptr = (BYTE*)(hlpfile->topic_map + hlpfile->topic_maplen);
+ hlpfile->topic_end = newptr + topic_size;
+
+ for (i = 0; i < hlpfile->topic_maplen; i++)
{
- topic.map[i] = newptr + i * hlpfile->dsize;
- memcpy(topic.map[i], buf + i * hlpfile->tbsize + 0x0C, hlpfile->dsize);
+ hlpfile->topic_map[i] = newptr + i * hlpfile->dsize;
+ memcpy(hlpfile->topic_map[i], buf + i * hlpfile->tbsize + 0x0C, hlpfile->dsize);
}
}
return TRUE;
@@ -1776,7 +1749,7 @@ static BOOL HLPFILE_Uncompress_Topic(HLPFILE* hlpfile)
* HLPFILE_Uncompress2
*/
-static void HLPFILE_Uncompress2(const BYTE *ptr, const BYTE *end, BYTE *newptr, const BYTE *newend)
+static void HLPFILE_Uncompress2(HLPFILE* hlpfile, const BYTE *ptr, const BYTE *end, BYTE *newptr, const BYTE *newend)
{
BYTE *phptr, *phend;
UINT code;
@@ -1791,8 +1764,8 @@ static void HLPFILE_Uncompress2(const BYTE *ptr, const BYTE *end, BYTE *newptr,
code = 0x100 * ptr[0] + ptr[1];
index = (code - 0x100) / 2;
- phptr = (BYTE*)phrases.buffer + phrases.offsets[index];
- phend = (BYTE*)phrases.buffer + phrases.offsets[index + 1];
+ phptr = (BYTE*)hlpfile->phrases_buffer + hlpfile->phrases_offsets[index];
+ phend = (BYTE*)hlpfile->phrases_buffer + hlpfile->phrases_offsets[index + 1];
if (newptr + (phend - phptr) > newend)
{
@@ -1815,7 +1788,7 @@ static void HLPFILE_Uncompress2(const BYTE *ptr, const BYTE *end, BYTE *newptr,
*
*
*/
-static BOOL HLPFILE_Uncompress3(char* dst, const char* dst_end,
+static BOOL HLPFILE_Uncompress3(HLPFILE* hlpfile, char* dst, const char* dst_end,
const BYTE* src, const BYTE* src_end)
{
unsigned int idx, len;
@@ -1825,32 +1798,32 @@ static BOOL HLPFILE_Uncompress3(char* dst, const char* dst_end,
if ((*src & 1) == 0)
{
idx = *src / 2;
- if (idx > phrases.num)
+ if (idx > hlpfile->num_phrases)
{
- WINE_ERR("index in phrases %d/%d\n", idx, phrases.num);
+ WINE_ERR("index in phrases %d/%d\n", idx, hlpfile->num_phrases);
len = 0;
}
else
{
- len = phrases.offsets[idx + 1] - phrases.offsets[idx];
+ len = hlpfile->phrases_offsets[idx + 1] - hlpfile->phrases_offsets[idx];
if (dst + len <= dst_end)
- memcpy(dst, &phrases.buffer[phrases.offsets[idx]], len);
+ memcpy(dst, &hlpfile->phrases_buffer[hlpfile->phrases_offsets[idx]], len);
}
}
else if ((*src & 0x03) == 0x01)
{
idx = (*src + 1) * 64;
idx += *++src;
- if (idx > phrases.num)
+ if (idx > hlpfile->num_phrases)
{
- WINE_ERR("index in phrases %d/%d\n", idx, phrases.num);
+ WINE_ERR("index in phrases %d/%d\n", idx, hlpfile->num_phrases);
len = 0;
}
else
{
- len = phrases.offsets[idx + 1] - phrases.offsets[idx];
+ len = hlpfile->phrases_offsets[idx + 1] - hlpfile->phrases_offsets[idx];
if (dst + len <= dst_end)
- memcpy(dst, &phrases.buffer[phrases.offsets[idx]], len);
+ memcpy(dst, &hlpfile->phrases_buffer[hlpfile->phrases_offsets[idx]], len);
}
}
else if ((*src & 0x07) == 0x03)
@@ -2024,7 +1997,8 @@ static BOOL HLPFILE_GetContext(HLPFILE *hlpfile)
BYTE *cbuf, *cend;
unsigned clen;
- if (!HLPFILE_FindSubFile("|CONTEXT", &cbuf, &cend)) {WINE_WARN("context0\n"); return FALSE;}
+ if (!HLPFILE_FindSubFile(hlpfile, "|CONTEXT", &cbuf, &cend))
+ {WINE_WARN("context0\n"); return FALSE;}
clen = cend - cbuf;
hlpfile->Context = HeapAlloc(GetProcessHeap(), 0, clen);
@@ -2043,13 +2017,13 @@ static BOOL HLPFILE_GetKeywords(HLPFILE *hlpfile)
BYTE *cbuf, *cend;
unsigned clen;
- if (!HLPFILE_FindSubFile("|KWBTREE", &cbuf, &cend)) return FALSE;
+ if (!HLPFILE_FindSubFile(hlpfile, "|KWBTREE", &cbuf, &cend)) return FALSE;
clen = cend - cbuf;
hlpfile->kwbtree = HeapAlloc(GetProcessHeap(), 0, clen);
if (!hlpfile->kwbtree) return FALSE;
memcpy(hlpfile->kwbtree, cbuf, clen);
- if (!HLPFILE_FindSubFile("|KWDATA", &cbuf, &cend))
+ if (!HLPFILE_FindSubFile(hlpfile, "|KWDATA", &cbuf, &cend))
{
WINE_ERR("corrupted help file: kwbtree present but kwdata absent\n");
HeapFree(GetProcessHeap(), 0, hlpfile->kwbtree);
@@ -2076,7 +2050,8 @@ static BOOL HLPFILE_GetMap(HLPFILE *hlpfile)
BYTE *cbuf, *cend;
unsigned entries, i;
- if (!HLPFILE_FindSubFile("|CTXOMAP", &cbuf, &cend)) {WINE_WARN("no map section\n"); return FALSE;}
+ if (!HLPFILE_FindSubFile(hlpfile, "|CTXOMAP", &cbuf, &cend))
+ {WINE_WARN("no map section\n"); return FALSE;}
entries = GET_USHORT(cbuf, 9);
hlpfile->Map = HeapAlloc(GetProcessHeap(), 0, entries * sizeof(HLPFILE_MAP));
@@ -2197,5 +2172,9 @@ void HLPFILE_FreeHlpFile(HLPFILE* hlpfile)
HeapFree(GetProcessHeap(), 0, hlpfile->Map);
HeapFree(GetProcessHeap(), 0, hlpfile->lpszTitle);
HeapFree(GetProcessHeap(), 0, hlpfile->lpszCopyright);
+ HeapFree(GetProcessHeap(), 0, hlpfile->file_buffer);
+ HeapFree(GetProcessHeap(), 0, hlpfile->phrases_offsets);
+ HeapFree(GetProcessHeap(), 0, hlpfile->phrases_buffer);
+ HeapFree(GetProcessHeap(), 0, hlpfile->topic_map);
HeapFree(GetProcessHeap(), 0, hlpfile);
}
diff --git a/programs/winhelp/hlpfile.h b/programs/winhelp/hlpfile.h
index 3632902..4d4dfce 100644
--- a/programs/winhelp/hlpfile.h
+++ b/programs/winhelp/hlpfile.h
@@ -2,7 +2,7 @@
* Help Viewer
*
* Copyright 1996 Ulrich Schmid
- * 2002 Eric Pouech
+ * 2002-2008 Eric Pouech
* 2007 Kirill K. Smirnov
*
* This library is free software; you can redistribute it and/or
@@ -118,6 +118,8 @@ typedef struct
typedef struct tagHlpFileFile
{
+ BYTE* file_buffer;
+ UINT file_buffer_size;
LPSTR lpszPath;
LPSTR lpszTitle;
LPSTR lpszCopyright;
@@ -143,6 +145,13 @@ typedef struct tagHlpFileFile
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;
More information about the wine-patches
mailing list