winhelp

Eric Pouech pouech-eric at wanadoo.fr
Fri May 23 13:50:39 CDT 2003


this patch solves a couple of issues with winhelp (see changelog)
A+
-- 
Eric Pouech
-------------- next part --------------
Name:          winhlp
ChangeLog:     
	- added some missing strings to resources
	- made the decompression code a bit more pedantic to avoid crashes
	- fixed startup without .HLP filename passed on command line
	- passed a few more commands from remote applications to the macros
License:       X11
GenDate:       2003/05/23 18:48:43 UTC
ModifiedFiles: programs/winhelp/Si.rc programs/winhelp/Sk.rc programs/winhelp/hlpfile.c programs/winhelp/winhelp.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/winhelp/Si.rc,v
retrieving revision 1.2
diff -u -u -r1.2 Si.rc
--- programs/winhelp/Si.rc	21 Oct 2002 19:18:42 -0000	1.2
+++ programs/winhelp/Si.rc	21 Oct 2002 19:32:53 -0000
@@ -62,6 +62,7 @@
 STID_SEARCH, 		"&Iskanje"
 STID_BACK, 			"&Nazaj"
 STID_HISTORY, 		"&Zgodovina"
+STID_TOPICS,		"&Topics"
 STID_ALL_FILES, 		"Vse datiteke (*.*)"
 STID_HELP_FILES_HLP, 	"Datoteke s pomoèjo (*.hlp)"
 }
Index: programs/winhelp/Sk.rc
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/winhelp/Sk.rc,v
retrieving revision 1.6
diff -u -u -r1.6 Sk.rc
--- programs/winhelp/Sk.rc	21 Oct 2002 19:18:42 -0000	1.6
+++ programs/winhelp/Sk.rc	21 Oct 2002 19:32:35 -0000
@@ -59,6 +59,7 @@
 STID_SEARCH,                "&H¾ada"
 STID_BACK,                  "&Spä"
 STID_HISTORY,               "&História"
+STID_TOPICS,		    "&Topics"
 STID_ALL_FILES,             "Všetky súbory (*.*)"
 STID_HELP_FILES_HLP,        "Súbory pomoci (*.hlp)"
 }
Index: programs/winhelp/hlpfile.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/winhelp/hlpfile.c,v
retrieving revision 1.17
diff -u -u -r1.17 hlpfile.c
--- programs/winhelp/hlpfile.c	14 Jan 2003 23:43:41 -0000	1.17
+++ programs/winhelp/hlpfile.c	23 May 2003 18:48:39 -0000
@@ -85,7 +85,7 @@
 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_UncompressRLE(const BYTE* src, unsigned sz, BYTE** dst);
+static void  HLPFILE_UncompressRLE(const BYTE* src, const BYTE* end, BYTE** dst, unsigned dstsz);
 static BOOL  HLPFILE_ReadFont(HLPFILE* hlpfile);
 
 /***********************************************************************
@@ -523,15 +523,15 @@
     {
     case 0: /* uncompressed */
         if (sz != csz)
-            WINE_WARN("Bogus gfx sizes: %u / %u\n", sz, csz);
+            WINE_WARN("Bogus gfx sizes (uncompressed): %u / %u\n", sz, csz);
         dst = src;
         break;
     case 1: /* RunLen */
         tmp = dst = HeapAlloc(GetProcessHeap(), 0, sz);
         if (!dst) return NULL;
-        HLPFILE_UncompressRLE(src, csz, &tmp);
+        HLPFILE_UncompressRLE(src, src + csz, &tmp, sz);
         if (tmp - dst != sz)
-            WINE_FIXME("Bogus gfx sizes: %u/%u\n", tmp - dst, sz);
+            WINE_FIXME("Bogus gfx sizes (RunLen): %u/%u\n", tmp - dst, sz);
         break;
     case 2: /* LZ77 */
         sz77 = HLPFILE_UncompressedLZ77_Size(src, src + csz);
@@ -539,18 +539,18 @@
         if (!dst) return NULL;
         HLPFILE_UncompressLZ77(src, src + csz, dst);
         if (sz77 != sz)
-            WINE_WARN("Bogus gfx sizes: %u / %u\n", sz77, sz);
+            WINE_WARN("Bogus gfx sizes (LZ77): %u / %u\n", sz77, sz);
         break;
     case 3: /* LZ77 then RLE */
         sz77 = HLPFILE_UncompressedLZ77_Size(src, src + csz);
-        tmp = HeapAlloc(GetProcessHeap(), 0, sz/*sz77*/);
+        tmp = HeapAlloc(GetProcessHeap(), 0, sz77);
         if (!tmp) return FALSE;
         HLPFILE_UncompressLZ77(src, src + csz, tmp);
         dst = tmp2 = HeapAlloc(GetProcessHeap(), 0, sz);
         if (!dst) return FALSE;
-        HLPFILE_UncompressRLE(tmp, sz77, &tmp2);
+        HLPFILE_UncompressRLE(tmp, tmp + sz77, &tmp2, sz);
         if (tmp2 - dst != sz)
-            WINE_WARN("Bogus gfx: %u / %u\n", tmp2 - dst, sz);
+            WINE_WARN("Bogus gfx sizes (LZ77+RunLen): %u / %u\n", tmp2 - dst, sz);
         HeapFree(GetProcessHeap(), 0, tmp);
         break;
     default:
@@ -592,6 +592,9 @@
     if (bi->bmiHeader.biBitCount > 32) WINE_FIXME("Unknown bit count %u\n", bi->bmiHeader.biBitCount);
     if (bi->bmiHeader.biPlanes != 1) WINE_FIXME("Unsupported planes %u\n", bi->bmiHeader.biPlanes);
     bi->bmiHeader.biSizeImage = (((bi->bmiHeader.biWidth * bi->bmiHeader.biBitCount + 31) & ~31) / 8) * bi->bmiHeader.biHeight;
+    WINE_TRACE("planes=%d bc=%d size=(%ld,%ld)\n",
+               bi->bmiHeader.biPlanes, bi->bmiHeader.biBitCount, 
+               bi->bmiHeader.biWidth, bi->bmiHeader.biHeight);
 
     csz = fetch_ulong(&ptr);
     fetch_ulong(&ptr); /* hotspot size */
@@ -1406,7 +1409,7 @@
                 wi->style = (flags & 0x0080) ? GET_USHORT(ptr, 84) : SW_SHOW;
                 wi->sr_color = (flags & 0x0100) ? GET_UINT(ptr, 86) : 0xFFFFFF;
                 wi->nsr_color = (flags & 0x0200) ? GET_UINT(ptr, 90) : 0xFFFFFF;
-                WINE_FIXME("System-Window: flags=%c%c%c%c%c%c%c%c type=%s name=%s caption=%s (%ld,%ld)x(%ld,%ld)\n",
+                WINE_TRACE("System-Window: flags=%c%c%c%c%c%c%c%c type=%s name=%s caption=%s (%ld,%ld)x(%ld,%ld)\n",
                            flags & 0x0001 ? 'T' : 't',
                            flags & 0x0002 ? 'N' : 'n',
                            flags & 0x0004 ? 'C' : 'c',
@@ -1715,7 +1718,8 @@
             else 
             {
                 len = phrases.offsets[idx + 1] - phrases.offsets[idx];
-                memcpy(dst, &phrases.buffer[phrases.offsets[idx]], len);
+                if (dst + len <= dst_end)
+                    memcpy(dst, &phrases.buffer[phrases.offsets[idx]], len);
             }
         }
         else if ((*src & 0x03) == 0x01)
@@ -1730,19 +1734,22 @@
             else
             {
                 len = phrases.offsets[idx + 1] - phrases.offsets[idx];
-                memcpy(dst, &phrases.buffer[phrases.offsets[idx]], len);
+                if (dst + len <= dst_end)
+                    memcpy(dst, &phrases.buffer[phrases.offsets[idx]], len);
             }
         }
         else if ((*src & 0x07) == 0x03)
         {
             len = (*src / 8) + 1;
-            memcpy(dst, src + 1, len);
+            if (dst + len <= dst_end)
+                memcpy(dst, src + 1, len);
             src += len;
         }
         else
         {
             len = (*src / 16) + 1;
-            memset(dst, ((*src & 0x0F) == 0x07) ? ' ' : 0, len);
+            if (dst + len <= dst_end)
+                memset(dst, ((*src & 0x0F) == 0x07) ? ' ' : 0, len);
         }
         dst += len;
     }
@@ -1756,27 +1763,37 @@
  *
  *
  */
-static void HLPFILE_UncompressRLE(const BYTE* src, unsigned sz, BYTE** dst)
+static void HLPFILE_UncompressRLE(const BYTE* src, const BYTE* end, BYTE** dst, unsigned dstsz)
 {
-    unsigned    i;
     BYTE        ch;
+    BYTE*       sdst = *dst + dstsz;
 
-    for (i = 0; i < sz; i++)
+    while (src < end)
     {
-        ch = src[i];
+        ch = *src++;
         if (ch & 0x80)
         {
             ch &= 0x7F;
-            memcpy(*dst, src + i + 1, ch);
-            i += ch;
+            if (ch == 0) WINE_FIXME("Null length 1, next is %u\n", *src);
+            if ((*dst) + ch < sdst)
+                memcpy(*dst, src, ch);
+            src += ch;
         }
         else
         {
-            memset(*dst, (char)src[i + 1], ch);
-            i++;
+            if ((*dst) + ch < sdst)
+                memset(*dst, (char)*src, ch);
+            src++;
+            if (ch == 0)
+            {
+                WINE_FIXME("Null length 2, next is %u\n", *src);
+            }
         }
         *dst += ch;
     }
+    if (*dst != sdst)
+        WINE_FIXME("Buffer X-flow: d(%u) instead of d(%u)\n",
+                   *dst - (sdst - dstsz), dstsz);
 }
 
 /******************************************************************
Index: programs/winhelp/winhelp.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/winhelp/winhelp.c,v
retrieving revision 1.25
diff -u -u -r1.25 winhelp.c
--- programs/winhelp/winhelp.c	8 Jan 2003 21:09:25 -0000	1.25
+++ programs/winhelp/winhelp.c	23 May 2003 16:35:25 -0000
@@ -91,9 +91,10 @@
     if (!name || !name[0])
         name = Globals.active_win->lpszName;
 
-    for (i = 0; i < hlpfile->numWindows; i++)
-        if (!strcmp(hlpfile->windows[i].name, name))
-            return &hlpfile->windows[i];
+    if (hlpfile)
+        for (i = 0; i < hlpfile->numWindows; i++)
+            if (!strcmp(hlpfile->windows[i].name, name))
+                return &hlpfile->windows[i];
 
     if (strcmp(name, "main") != 0)
     {
@@ -196,9 +197,12 @@
 
     /* Create primary window */
     WINHELP_RegisterWinClasses();
-    hlpfile = WINHELP_LookupHelpFile(cmdline);
-    if (!hlpfile)
-        return 0;
+    if (*cmdline)
+    {
+        hlpfile = WINHELP_LookupHelpFile(cmdline);
+        if (!hlpfile) return 0;
+    }
+    else hlpfile = NULL;
     WINHELP_CreateHelpWindowByHash(hlpfile, lHash, 
                                    WINHELP_GetWindowInfo(hlpfile, "main"), show);
 
@@ -285,33 +289,60 @@
 
     if (wh)
     {
+        char*   ptr = (wh->ofsFilename) ? (LPSTR)wh + wh->ofsFilename : NULL;
+
         WINE_TRACE("Got[%u]: cmd=%u data=%08lx fn=%s\n", 
-                   wh->size, wh->command, wh->data,
-                   wh->ofsFilename ? (LPSTR)wh + wh->ofsFilename : "");
+                   wh->size, wh->command, wh->data, ptr);
         switch (wh->command)
         {
+        case HELP_CONTEXT:
+            if (ptr)
+            {
+                MACRO_JumpContext(ptr, "main", wh->data);
+            }
+            break;
         case HELP_QUIT:
             MACRO_Exit();
             break;
-        case HELP_FINDER:
-            /* in fact, should be the topic dialog box */
-            if (wh->ofsFilename)
+        case HELP_CONTENTS:
+            if (ptr)
             {
-                MACRO_JumpHash((LPSTR)wh + wh->ofsFilename, "main", 0);
+                MACRO_JumpContents(ptr, "main");
             }
             break;
-        case HELP_CONTEXT:
+        case HELP_HELPONHELP:
+            MACRO_HelpOn();
+            break;
+        /* case HELP_SETINDEX: */
         case HELP_SETCONTENTS:
-        case HELP_CONTENTS:
+            if (ptr)
+            {
+                MACRO_SetContents(ptr, wh->data);
+            }
+            break;
         case HELP_CONTEXTPOPUP:
-        case HELP_FORCEFILE:
-        case HELP_HELPONHELP:
-        case HELP_KEY:
-        case HELP_PARTIALKEY:
-        case HELP_COMMAND:
-        case HELP_MULTIKEY:
-        case HELP_SETWINPOS:
-            WINE_FIXME("NIY\n");
+            if (ptr)
+            {
+                MACRO_PopupContext(ptr, wh->data);
+            }
+            break;
+        /* case HELP_FORCEFILE:*/
+        /* case HELP_CONTEXTMENU: */
+        case HELP_FINDER:
+            /* in fact, should be the topic dialog box */
+            if (ptr)
+            {
+                MACRO_JumpHash(ptr, "main", 0);
+            }
+            break;
+        /* case HELP_WM_HELP: */
+        /* case HELP_SETPOPUP_POS: */
+        /* case HELP_KEY: */
+        /* case HELP_COMMAND: */
+        /* case HELP_PARTIALKEY: */
+        /* case HELP_MULTIKEY: */
+        /* case HELP_SETWINPOS: */
+            WINE_FIXME("Unknown command (%x) for remote winhelp control\n", wh->command);
             break;
         }
     }
@@ -478,6 +509,7 @@
             MACRO_ExecuteMacro(macro->lpszMacro);
     }
 
+    win->histIndex = win->backIndex = 0;
     /* Reuse existing window */
     if (!bPopup)
     {
@@ -488,13 +520,13 @@
                 return WINHELP_ReuseWindow(win, oldwin, page, nCmdShow);
             }
         }
-
-        win->histIndex = win->backIndex = 1;
-        win->history[0] = win->back[0] = page;
-        page->file->wRefCount += 2;
+        if (page)
+        {
+            win->histIndex = win->backIndex = 1;
+            win->history[0] = win->back[0] = page;
+            page->file->wRefCount += 2;
+        }
     }
-    else
-        win->histIndex = win->backIndex = 0;
 
     hWnd = CreateWindow(bPopup ? TEXT_WIN_CLASS_NAME : MAIN_WIN_CLASS_NAME,
                         wi->caption, wi->win_style,


More information about the wine-patches mailing list