winhelp: Constify the internal .hlp file parsing.

oldstable
Eric Pouech 2008-07-12 10:37:31 +02:00 committed by Alexandre Julliard
parent ace5171df6
commit cdd235e24a
1 changed files with 49 additions and 45 deletions

View File

@ -55,16 +55,16 @@ static BOOL HLPFILE_DoReadHlpFile(HLPFILE*, LPCSTR);
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);
static INT HLPFILE_UncompressedLZ77_Size(const BYTE *ptr, const BYTE *end);
static BYTE* HLPFILE_UncompressLZ77(const BYTE *ptr, const BYTE *end, BYTE *newptr);
static BOOL HLPFILE_UncompressLZ77_Phrases(HLPFILE*);
static BOOL HLPFILE_Uncompress_Phrases40(HLPFILE*);
static BOOL HLPFILE_Uncompress_Topic(HLPFILE*);
static BOOL HLPFILE_GetContext(HLPFILE*);
static BOOL HLPFILE_GetKeywords(HLPFILE*);
static BOOL HLPFILE_GetMap(HLPFILE*);
static BOOL HLPFILE_AddPage(HLPFILE*, BYTE*, BYTE*, unsigned, unsigned);
static BOOL HLPFILE_SkipParagraph(HLPFILE*, BYTE *, BYTE*, unsigned*);
static BOOL HLPFILE_AddPage(HLPFILE*, const BYTE*, const BYTE*, unsigned, unsigned);
static BOOL HLPFILE_SkipParagraph(HLPFILE*, const BYTE*, const BYTE*, unsigned*);
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);
@ -370,10 +370,10 @@ static BOOL HLPFILE_DoReadHlpFile(HLPFILE *hlpfile, LPCSTR lpszPath)
*
* HLPFILE_AddPage
*/
static BOOL HLPFILE_AddPage(HLPFILE *hlpfile, BYTE *buf, BYTE *end, unsigned ref, unsigned offset)
static BOOL HLPFILE_AddPage(HLPFILE *hlpfile, const BYTE *buf, const BYTE *end, unsigned ref, unsigned offset)
{
HLPFILE_PAGE* page;
BYTE* title;
const BYTE* title;
UINT titlesize, blocksize, datalen;
char* ptr;
HLPFILE_MACRO*macro;
@ -457,70 +457,70 @@ static BOOL HLPFILE_AddPage(HLPFILE *hlpfile, BYTE *buf, BYTE *end, unsigned ref
return TRUE;
}
static long fetch_long(BYTE** ptr)
static long fetch_long(const BYTE** ptr)
{
long ret;
if (*(*ptr) & 1)
{
ret = (*(unsigned long*)(*ptr) - 0x80000000L) / 2;
ret = (*(const unsigned long*)(*ptr) - 0x80000000L) / 2;
(*ptr) += 4;
}
else
{
ret = (*(unsigned short*)(*ptr) - 0x8000) / 2;
ret = (*(const unsigned short*)(*ptr) - 0x8000) / 2;
(*ptr) += 2;
}
return ret;
}
static unsigned long fetch_ulong(BYTE** ptr)
static unsigned long fetch_ulong(const BYTE** ptr)
{
unsigned long ret;
if (*(*ptr) & 1)
{
ret = *(unsigned long*)(*ptr) / 2;
ret = *(const unsigned long*)(*ptr) / 2;
(*ptr) += 4;
}
else
{
ret = *(unsigned short*)(*ptr) / 2;
ret = *(const unsigned short*)(*ptr) / 2;
(*ptr) += 2;
}
return ret;
}
static short fetch_short(BYTE** ptr)
static short fetch_short(const BYTE** ptr)
{
short ret;
if (*(*ptr) & 1)
{
ret = (*(unsigned short*)(*ptr) - 0x8000) / 2;
ret = (*(const unsigned short*)(*ptr) - 0x8000) / 2;
(*ptr) += 2;
}
else
{
ret = (*(unsigned char*)(*ptr) - 0x80) / 2;
ret = (*(const unsigned char*)(*ptr) - 0x80) / 2;
(*ptr)++;
}
return ret;
}
static unsigned short fetch_ushort(BYTE** ptr)
static unsigned short fetch_ushort(const BYTE** ptr)
{
unsigned short ret;
if (*(*ptr) & 1)
{
ret = *(unsigned short*)(*ptr) / 2;
ret = *(const unsigned short*)(*ptr) / 2;
(*ptr) += 2;
}
else
{
ret = *(unsigned char*)(*ptr) / 2;
ret = *(const unsigned char*)(*ptr) / 2;
(*ptr)++;
}
return ret;
@ -530,9 +530,9 @@ static unsigned short fetch_ushort(BYTE** ptr)
*
* HLPFILE_SkipParagraph
*/
static BOOL HLPFILE_SkipParagraph(HLPFILE *hlpfile, BYTE *buf, BYTE *end, unsigned* len)
static BOOL HLPFILE_SkipParagraph(HLPFILE *hlpfile, const BYTE *buf, const BYTE *end, unsigned* len)
{
BYTE *tmp;
const BYTE *tmp;
if (!hlpfile->first_page) {WINE_WARN("no page\n"); return FALSE;};
if (buf + 0x19 > end) {WINE_WARN("header too small\n"); return FALSE;};
@ -553,9 +553,10 @@ static BOOL HLPFILE_SkipParagraph(HLPFILE *hlpfile, BYTE *buf, BYTE *end, unsign
*
* Decompress the data part of a bitmap or a metafile
*/
static BYTE* HLPFILE_DecompressGfx(BYTE* src, unsigned csz, unsigned sz, BYTE packing)
static const BYTE* HLPFILE_DecompressGfx(const BYTE* src, unsigned csz, unsigned sz, BYTE packing,
BYTE** alloc)
{
BYTE* dst;
const BYTE* dst;
BYTE* tmp;
unsigned sz77;
@ -567,17 +568,18 @@ static BYTE* HLPFILE_DecompressGfx(BYTE* src, unsigned csz, unsigned sz, BYTE
if (sz != csz)
WINE_WARN("Bogus gfx sizes (uncompressed): %u / %u\n", sz, csz);
dst = src;
*alloc = NULL;
break;
case 1: /* RunLen */
dst = HeapAlloc(GetProcessHeap(), 0, sz);
dst = *alloc = HeapAlloc(GetProcessHeap(), 0, sz);
if (!dst) return NULL;
HLPFILE_UncompressRLE(src, src + csz, dst, sz);
HLPFILE_UncompressRLE(src, src + csz, *alloc, sz);
break;
case 2: /* LZ77 */
sz77 = HLPFILE_UncompressedLZ77_Size(src, src + csz);
dst = HeapAlloc(GetProcessHeap(), 0, sz77);
dst = *alloc = HeapAlloc(GetProcessHeap(), 0, sz77);
if (!dst) return NULL;
HLPFILE_UncompressLZ77(src, src + csz, dst);
HLPFILE_UncompressLZ77(src, src + csz, *alloc);
if (sz77 != sz)
WINE_WARN("Bogus gfx sizes (LZ77): %u / %u\n", sz77, sz);
break;
@ -586,13 +588,13 @@ static BYTE* HLPFILE_DecompressGfx(BYTE* src, unsigned csz, unsigned sz, BYTE
tmp = HeapAlloc(GetProcessHeap(), 0, sz77);
if (!tmp) return FALSE;
HLPFILE_UncompressLZ77(src, src + csz, tmp);
dst = HeapAlloc(GetProcessHeap(), 0, sz);
dst = *alloc = HeapAlloc(GetProcessHeap(), 0, sz);
if (!dst)
{
HeapFree(GetProcessHeap(), 0, tmp);
return FALSE;
}
HLPFILE_UncompressRLE(tmp, tmp + sz77, dst, sz);
HLPFILE_UncompressRLE(tmp, tmp + sz77, *alloc, sz);
HeapFree(GetProcessHeap(), 0, tmp);
break;
default:
@ -774,10 +776,11 @@ static BOOL HLPFILE_RtfAddTransparentBitmap(struct RtfData* rd, const BITMAPINFO
* HLPFILE_RtfAddBitmap
*
*/
static BOOL HLPFILE_RtfAddBitmap(struct RtfData* rd, BYTE* beg, BYTE type, BYTE pack)
static BOOL HLPFILE_RtfAddBitmap(struct RtfData* rd, const BYTE* beg, BYTE type, BYTE pack)
{
BYTE* ptr;
BYTE* pict_beg;
const BYTE* ptr;
const BYTE* pict_beg;
BYTE* alloc = NULL;
BITMAPINFO* bi;
unsigned long off, csz;
unsigned nc = 0;
@ -835,7 +838,7 @@ static BOOL HLPFILE_RtfAddBitmap(struct RtfData* rd, BYTE* beg, BYTE type, BYTE
ptr += 4;
}
}
pict_beg = HLPFILE_DecompressGfx(beg + off, csz, bi->bmiHeader.biSizeImage, pack);
pict_beg = HLPFILE_DecompressGfx(beg + off, csz, bi->bmiHeader.biSizeImage, pack, &alloc);
if (clrImportant == 1 && nc > 0)
{
@ -863,7 +866,7 @@ static BOOL HLPFILE_RtfAddBitmap(struct RtfData* rd, BYTE* beg, BYTE type, BYTE
ret = TRUE;
done:
HeapFree(GetProcessHeap(), 0, bi);
if (pict_beg != beg + off) HeapFree(GetProcessHeap(), 0, pict_beg);
HeapFree(GetProcessHeap(), 0, alloc);
return ret;
}
@ -872,12 +875,13 @@ done:
* HLPFILE_RtfAddMetaFile
*
*/
static BOOL HLPFILE_RtfAddMetaFile(struct RtfData* rd, BYTE* beg, BYTE pack)
static BOOL HLPFILE_RtfAddMetaFile(struct RtfData* rd, const BYTE* beg, BYTE pack)
{
BYTE* ptr;
const BYTE* ptr;
unsigned long size, csize;
unsigned long off, hsoff;
BYTE* bits;
const BYTE* bits;
BYTE* alloc = NULL;
char tmp[256];
unsigned mm;
BOOL ret;
@ -902,13 +906,13 @@ static BOOL HLPFILE_RtfAddMetaFile(struct RtfData* rd, BYTE* beg, BYTE pack)
WINE_TRACE("sz=%lu csz=%lu offs=%lu/%u,%lu\n",
size, csize, off, ptr - beg, hsoff);
bits = HLPFILE_DecompressGfx(beg + off, csize, size, pack);
bits = HLPFILE_DecompressGfx(beg + off, csize, size, pack, &alloc);
if (!bits) return FALSE;
ret = HLPFILE_RtfAddHexBytes(rd, bits, size) &&
HLPFILE_RtfAddControl(rd, "}");
if (bits != beg + off) HeapFree(GetProcessHeap(), 0, bits);
HeapFree(GetProcessHeap(), 0, alloc);
return ret;
}
@ -918,7 +922,7 @@ static BOOL HLPFILE_RtfAddMetaFile(struct RtfData* rd, BYTE* beg, BYTE pack)
*
*/
static BOOL HLPFILE_RtfAddGfxByAddr(struct RtfData* rd, HLPFILE *hlpfile,
BYTE* ref, unsigned long size)
const BYTE* ref, unsigned long size)
{
unsigned i, numpict;
@ -927,9 +931,9 @@ static BOOL HLPFILE_RtfAddGfxByAddr(struct RtfData* rd, HLPFILE *hlpfile,
for (i = 0; i < numpict; i++)
{
BYTE* beg;
BYTE* ptr;
BYTE type, pack;
const BYTE* beg;
const BYTE* ptr;
BYTE type, pack;
WINE_TRACE("Offset[%d] = %x\n", i, GET_UINT(ref, (1 + i) * 4));
beg = ptr = ref + GET_UINT(ref, (1 + i) * 4);
@ -1038,7 +1042,7 @@ static BOOL HLPFILE_BrowseParagraph(HLPFILE_PAGE* page, struct RtfData* rd,
BYTE *buf, BYTE* end, unsigned* parlen)
{
UINT textsize;
BYTE *format, *format_end;
const BYTE *format, *format_end;
char *text, *text_base, *text_end;
long size, blocksize, datalen;
unsigned short bits;
@ -1991,7 +1995,7 @@ static BOOL HLPFILE_SystemCommands(HLPFILE* hlpfile)
*
* HLPFILE_UncompressedLZ77_Size
*/
static INT HLPFILE_UncompressedLZ77_Size(BYTE *ptr, BYTE *end)
static INT HLPFILE_UncompressedLZ77_Size(const BYTE *ptr, const BYTE *end)
{
int i, newsize = 0;
@ -2018,7 +2022,7 @@ static INT HLPFILE_UncompressedLZ77_Size(BYTE *ptr, BYTE *end)
*
* HLPFILE_UncompressLZ77
*/
static BYTE *HLPFILE_UncompressLZ77(BYTE *ptr, BYTE *end, BYTE *newptr)
static BYTE *HLPFILE_UncompressLZ77(const BYTE *ptr, const BYTE *end, BYTE *newptr)
{
int i;