Kirill K. Smirnov : winhelp: Export enum and search B+ tree functions.

Alexandre Julliard julliard at winehq.org
Thu Dec 13 08:23:11 CST 2007


Module: wine
Branch: master
Commit: af21361dbff5b21b7b8354a1a1af532184840da9
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=af21361dbff5b21b7b8354a1a1af532184840da9

Author: Kirill K. Smirnov <lich at math.spbu.ru>
Date:   Thu Dec 13 00:57:45 2007 +0300

winhelp: Export enum and search B+ tree functions.

---

 programs/winhelp/hlpfile.c |   66 +++++++++++++++++++++++++++++++++----------
 programs/winhelp/hlpfile.h |   26 +++++++++++++++++
 2 files changed, 76 insertions(+), 16 deletions(-)

diff --git a/programs/winhelp/hlpfile.c b/programs/winhelp/hlpfile.c
index 2aafaf6..88cfabb 100644
--- a/programs/winhelp/hlpfile.c
+++ b/programs/winhelp/hlpfile.c
@@ -76,18 +76,6 @@ static struct
     HLPFILE_LINK*       link;
 } attributes;
 
-/*
- * 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);
-
 static BOOL  HLPFILE_DoReadHlpFile(HLPFILE*, LPCSTR);
 static BOOL  HLPFILE_ReadFileToBuffer(HFILE);
 static BOOL  HLPFILE_FindSubFile(LPCSTR name, BYTE**, BYTE**);
@@ -106,8 +94,6 @@ static BOOL  HLPFILE_Uncompress3(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);
 
-static void* HLPFILE_BPTreeSearch(BYTE*, const void*, HLPFILE_BPTreeCompare);
-
 /***********************************************************************
  *
  *           HLPFILE_PageByNumber
@@ -1924,8 +1910,8 @@ static void HLPFILE_UncompressRLE(const BYTE* src, const BYTE* end, BYTE** dst,
  *     Pointer to block identified by key, or NULL if failure.
  *
  */
-static void* HLPFILE_BPTreeSearch(BYTE* buf, const void* key,
-                                  HLPFILE_BPTreeCompare comp)
+void* HLPFILE_BPTreeSearch(BYTE* buf, const void* key,
+                           HLPFILE_BPTreeCompare comp)
 {
     unsigned magic;
     unsigned page_size;
@@ -1970,6 +1956,54 @@ static void* HLPFILE_BPTreeSearch(BYTE* buf, const void* key,
     return NULL;
 }
 
+/**************************************************************************
+ * HLPFILE_BPTreeEnum
+ *
+ * Enumerates elements in B+ tree.
+ *
+ * PARAMS
+ *     buf        [I]  pointer to the embedded file structured as a B+ tree
+ *     cb         [I]  compare function
+ *     cookie     [IO] cookie for cb function
+ */
+void HLPFILE_BPTreeEnum(BYTE* buf, HLPFILE_BPTreeCallback cb, void* cookie)
+{
+    unsigned magic;
+    unsigned page_size;
+    unsigned cur_page;
+    unsigned level;
+    BYTE *pages, *ptr, *newptr;
+    int i, entries;
+
+    magic = GET_USHORT(buf, 9);
+    if (magic != 0x293B)
+    {
+        WINE_ERR("Invalid magic in B+ tree: 0x%x\n", magic);
+        return;
+    }
+    page_size = GET_USHORT(buf, 9+4);
+    cur_page  = GET_USHORT(buf, 9+26);
+    level     = GET_USHORT(buf, 9+32);
+    pages     = buf + 9 + 38;
+    while (--level > 0)
+    {
+        ptr = pages + cur_page*page_size;
+        cur_page = GET_USHORT(ptr, 4);
+    }
+    while (cur_page != 0xFFFF)
+    {
+        ptr = pages + cur_page*page_size;
+        entries = GET_SHORT(ptr, 2);
+        ptr += 8;
+        for (i = 0; i < entries; i++)
+        {
+            cb(ptr, (void **)&newptr, cookie);
+            ptr = newptr;
+        }
+        cur_page = GET_USHORT(pages+cur_page*page_size, 6);
+    }
+}
+
 
 /***********************************************************************
  *
diff --git a/programs/winhelp/hlpfile.h b/programs/winhelp/hlpfile.h
index c7e643e..8c9e201 100644
--- a/programs/winhelp/hlpfile.h
+++ b/programs/winhelp/hlpfile.h
@@ -3,6 +3,7 @@
  *
  * Copyright    1996 Ulrich Schmid
  *              2002 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
@@ -150,6 +151,28 @@ typedef struct tagHlpFileFile
     HLPFILE_WINDOWINFO*         windows;
 } 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_Contents(HLPFILE* hlpfile);
 HLPFILE_PAGE* HLPFILE_PageByHash(HLPFILE* hlpfile, LONG lHash);
@@ -158,3 +181,6 @@ HLPFILE_PAGE* HLPFILE_PageByOffset(HLPFILE* hlpfile, LONG offset);
 LONG          HLPFILE_Hash(LPCSTR lpszContext);
 void          HLPFILE_FreeLink(HLPFILE_LINK* link);
 void          HLPFILE_FreeHlpFile(HLPFILE*);
+
+void* HLPFILE_BPTreeSearch(BYTE*, const void*, HLPFILE_BPTreeCompare);
+void  HLPFILE_BPTreeEnum(BYTE*, HLPFILE_BPTreeCallback cb, void *cookie);




More information about the wine-cvs mailing list