Kirill K. Smirnov : winhelp: Add support for winhelp 3.0 topics.
Alexandre Julliard
julliard at winehq.org
Mon Dec 3 09:17:54 CST 2007
Module: wine
Branch: master
Commit: ee863153cd2a159e8a058d401d0c97ed76627778
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ee863153cd2a159e8a058d401d0c97ed76627778
Author: Kirill K. Smirnov <lich at math.spbu.ru>
Date: Sat Dec 1 18:59:41 2007 +0300
winhelp: Add support for winhelp 3.0 topics.
---
programs/winhelp/hlpfile.c | 43 ++++++++++++++++++++++++++++++++++---------
1 files changed, 34 insertions(+), 9 deletions(-)
diff --git a/programs/winhelp/hlpfile.c b/programs/winhelp/hlpfile.c
index e678a4a..1b4fc58 100644
--- a/programs/winhelp/hlpfile.c
+++ b/programs/winhelp/hlpfile.c
@@ -341,6 +341,13 @@ static BOOL HLPFILE_DoReadHlpFile(HLPFILE *hlpfile, LPCSTR lpszPath)
index = (ref - 0x0C) / hlpfile->dsize;
offset = (ref - 0x0C) % hlpfile->dsize;
+ if (hlpfile->version <= 16 && index != old_index && index != 0)
+ {
+ /* we jumped to the next block, adjust pointers */
+ ref -= 12;
+ offset -= 12;
+ }
+
WINE_TRACE("ref=%08x => [%u/%u]\n", ref, index, offset);
if (index >= topic.wMapLen) {WINE_WARN("maplen\n"); break;}
@@ -355,11 +362,8 @@ static BOOL HLPFILE_DoReadHlpFile(HLPFILE *hlpfile, LPCSTR lpszPath)
if (!HLPFILE_AddPage(hlpfile, buf, end, index * 0x8000L + offs)) return FALSE;
break;
+ case 0x01:
case 0x20:
- if (!HLPFILE_AddParagraph(hlpfile, buf, end, &len)) return FALSE;
- offs += len;
- break;
-
case 0x23:
if (!HLPFILE_AddParagraph(hlpfile, buf, end, &len)) return FALSE;
offs += len;
@@ -369,10 +373,18 @@ static BOOL HLPFILE_DoReadHlpFile(HLPFILE *hlpfile, LPCSTR lpszPath)
WINE_ERR("buf[0x14] = %x\n", buf[0x14]);
}
- ref = GET_UINT(buf, 0xc);
+ if (hlpfile->version <= 16)
+ {
+ ref += GET_UINT(buf, 0xc);
+ if (GET_UINT(buf, 0xc) == 0)
+ break;
+ }
+ else
+ ref = GET_UINT(buf, 0xc);
} while (ref != 0xffffffff);
HLPFILE_GetMap(hlpfile);
+ if (hlpfile->version <= 16) return TRUE;
return HLPFILE_GetContext(hlpfile);
}
@@ -388,7 +400,6 @@ static BOOL HLPFILE_AddPage(HLPFILE *hlpfile, BYTE *buf, BYTE *end, unsigned off
char* ptr;
HLPFILE_MACRO*macro;
- if (buf + 0x31 > end) {WINE_WARN("page1\n"); return FALSE;};
title = buf + GET_UINT(buf, 0x10);
if (title > end) {WINE_WARN("page2\n"); return FALSE;};
@@ -897,8 +908,12 @@ static BOOL HLPFILE_AddParagraph(HLPFILE *hlpfile, BYTE *buf, BYTE *end, unsigne
format = buf + 0x15;
format_end = buf + GET_UINT(buf, 0x10);
- fetch_long(&format);
- *len = fetch_ushort(&format);
+ if (buf[0x14] == 0x20 || buf[0x14] == 0x23)
+ {
+ fetch_long(&format);
+ *len = fetch_ushort(&format);
+ }
+ else *len = end-buf-15;
if (buf[0x14] == 0x23)
{
@@ -918,7 +933,10 @@ static BOOL HLPFILE_AddParagraph(HLPFILE *hlpfile, BYTE *buf, BYTE *end, unsigne
WINE_TRACE("looking for format at offset %u for column %d\n", format - (buf + 0x15), nc);
if (buf[0x14] == 0x23)
format += 5;
- format += 4;
+ if (buf[0x14] == 0x01)
+ format += 6;
+ else
+ format += 4;
bits = GET_USHORT(format, 0); format += 2;
if (bits & 0x0001) fetch_long(&format);
if (bits & 0x0002) fetch_short(&format);
@@ -1108,6 +1126,13 @@ static BOOL HLPFILE_AddParagraph(HLPFILE *hlpfile, BYTE *buf, BYTE *end, unsigne
case 0xE0:
case 0xE1:
WINE_WARN("jump topic 1 => %u\n", GET_UINT(format, 1));
+ HLPFILE_FreeLink(attributes.link);
+ attributes.link = HLPFILE_AllocLink((*format & 1) ? hlp_link_link : hlp_link_popup,
+ hlpfile->lpszPath,
+ GET_UINT(format, 1)-16,
+ 1, -1);
+
+
format += 5;
break;
More information about the wine-cvs
mailing list