Hugh McMaster : reg: Export hex data types.

Alexandre Julliard julliard at winehq.org
Mon Dec 4 14:58:20 CST 2017


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

Author: Hugh McMaster <hugh.mcmaster at outlook.com>
Date:   Sun Dec  3 06:50:21 2017 +0000

reg: Export hex data types.

Signed-off-by: Hugh McMaster <hugh.mcmaster at outlook.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 programs/reg/export.c    | 79 +++++++++++++++++++++++++++++++++++++++++++-----
 programs/reg/tests/reg.c |  4 +--
 2 files changed, 73 insertions(+), 10 deletions(-)

diff --git a/programs/reg/export.c b/programs/reg/export.c
index ff16963..6e59ca4 100644
--- a/programs/reg/export.c
+++ b/programs/reg/export.c
@@ -20,12 +20,9 @@
 #include <stdlib.h>
 
 #include <wine/unicode.h>
-#include <wine/debug.h>
 
 #include "reg.h"
 
-WINE_DEFAULT_DEBUG_CHANNEL(reg);
-
 static void write_file(HANDLE hFile, const WCHAR *str)
 {
     DWORD written;
@@ -121,6 +118,62 @@ static void export_string_data(WCHAR **buf, WCHAR *data, size_t size)
     heap_free(str);
 }
 
+static size_t export_hex_data_type(HANDLE hFile, DWORD type)
+{
+    static const WCHAR hex[] = {'h','e','x',':',0};
+    static const WCHAR hexp_fmt[] = {'h','e','x','(','%','x',')',':',0};
+    size_t line_len;
+
+    if (type == REG_BINARY)
+    {
+        line_len = lstrlenW(hex);
+        write_file(hFile, hex);
+    }
+    else
+    {
+        WCHAR *buf = heap_xalloc(15 * sizeof(WCHAR));
+        line_len = sprintfW(buf, hexp_fmt, type);
+        write_file(hFile, buf);
+        heap_free(buf);
+    }
+
+    return line_len;
+}
+
+#define MAX_HEX_CHARS 77
+
+static void export_hex_data(HANDLE hFile, WCHAR **buf, DWORD type,
+                            DWORD line_len, void *data, DWORD size)
+{
+    static const WCHAR fmt[] = {'%','0','2','x',0};
+    static const WCHAR hex_concat[] = {'\\','\r','\n',' ',' ',0};
+    size_t num_commas, i, pos;
+
+    line_len += export_hex_data_type(hFile, type);
+
+    if (!size) return;
+
+    num_commas = size - 1;
+    *buf = heap_xalloc(size * 3 * sizeof(WCHAR));
+
+    for (i = 0, pos = 0; i < size; i++)
+    {
+        pos += sprintfW(*buf + pos, fmt, ((BYTE *)data)[i]);
+        if (i == num_commas) break;
+        (*buf)[pos++] = ',';
+        (*buf)[pos] = 0;
+        line_len += 3;
+
+        if (line_len >= MAX_HEX_CHARS)
+        {
+            write_file(hFile, *buf);
+            write_file(hFile, hex_concat);
+            line_len = 2;
+            pos = 0;
+        }
+    }
+}
+
 static void export_newline(HANDLE hFile)
 {
     static const WCHAR newline[] = {'\r','\n',0};
@@ -132,17 +185,27 @@ static void export_data(HANDLE hFile, WCHAR *value_name, DWORD value_len,
                         DWORD type, void *data, size_t size)
 {
     WCHAR *buf = NULL;
+    size_t line_len = export_value_name(hFile, value_name, value_len);
 
-    export_value_name(hFile, value_name, value_len);
-
-    if (type == REG_SZ)
+    switch (type)
     {
+    case REG_SZ:
         export_string_data(&buf, data, size);
+        break;
+    case REG_NONE:
+    case REG_EXPAND_SZ:
+    case REG_BINARY:
+    case REG_MULTI_SZ:
+    default:
+        export_hex_data(hFile, &buf, type, line_len, data, size);
+        break;
+    }
+
+    if (size || type == REG_SZ)
+    {
         write_file(hFile, buf);
         heap_free(buf);
     }
-    else
-        FIXME(": export of data type [0x%x] not yet implemented\n", type);
 
     export_newline(hFile);
 }
diff --git a/programs/reg/tests/reg.c b/programs/reg/tests/reg.c
index f1fa8e6..88ec308 100644
--- a/programs/reg/tests/reg.c
+++ b/programs/reg/tests/reg.c
@@ -4536,7 +4536,7 @@ static void test_export(void)
 
     run_reg_exe("reg export HKEY_CURRENT_USER\\" KEY_BASE " file.reg", &r);
     ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
-    ok(compare_export("file.reg", empty_hex_test, TODO_REG_COMPARE), "compare_export() failed\n");
+    ok(compare_export("file.reg", empty_hex_test, 0), "compare_export() failed\n");
 
     delete_key(HKEY_CURRENT_USER, KEY_BASE);
 
@@ -4554,7 +4554,7 @@ static void test_export(void)
 
     run_reg_exe("reg export HKEY_CURRENT_USER\\" KEY_BASE " file.reg", &r);
     ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
-    ok(compare_export("file.reg", empty_hex_test2, TODO_REG_COMPARE), "compare_export() failed\n");
+    ok(compare_export("file.reg", empty_hex_test2, 0), "compare_export() failed\n");
 
     delete_key(HKEY_CURRENT_USER, KEY_BASE);
 




More information about the wine-cvs mailing list