[PATCH 7/8] winedump: Use common binary dumper for typelib.

Dmitry Timoshkov dmitry at baikal.ru
Mon Jul 9 22:41:54 CDT 2018


This is an adapted code from dump.c.

Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
---
 tools/winedump/tlb.c | 52 +++++++++++++++++++++++++++++++-------------
 1 file changed, 37 insertions(+), 15 deletions(-)

diff --git a/tools/winedump/tlb.c b/tools/winedump/tlb.c
index d2883598d7..5d009fcedb 100644
--- a/tools/winedump/tlb.c
+++ b/tools/winedump/tlb.c
@@ -283,25 +283,47 @@ static void print_ctl2(const char *name)
     printf("\n");
 }
 
-static void dump_binary(int n)
+static int tlb_isprint(unsigned char c)
 {
-    int i;
+    return c >= 32;
+}
 
-    for(i = 1; i <= n; i++) {
-        switch(i & 0x0f) {
-        case 0:
-            printf("%02x\n", tlb_read_byte());
-            break;
-        case 1:
-            print_offset();
-            /* fall through */
-        default:
-            printf("%02x ", tlb_read_byte());
+static void dump_binary(int size)
+{
+    const unsigned char *ptr;
+    int i, j;
+
+    if (!size) return;
+
+    ptr = tlb_read(size);
+    if (!ptr) return;
+
+    print_offset();
+    printf("%08x: ", offset - size);
+
+    for (i = 0; i < size; i++)
+    {
+        printf("%02x%c", ptr[i], (i % 16 == 7) ? '-' : ' ');
+        if ((i % 16) == 15)
+        {
+            printf( " " );
+            for (j = 0; j < 16; j++)
+                printf("%c", tlb_isprint(ptr[i-15+j]) ? ptr[i-15+j] : '.');
+            if (i < size-1)
+            {
+                printf("\n");
+                print_offset();
+                printf("%08x: ", offset - size + i + 1);
+            }
         }
     }
-
-    if(n&0x0f)
-        printf("\n");
+    if (i % 16)
+    {
+        printf("%*s ", 3 * (16-(i%16)), "");
+        for (j = 0; j < i % 16; j++)
+            printf("%c", tlb_isprint(ptr[i-(i%16)+j]) ? ptr[i-(i%16)+j] : '.');
+    }
+    printf("\n");
 }
 
 static int dump_msft_varflags(void)
-- 
2.17.1




More information about the wine-devel mailing list