[PATCH v4 7/8] reg.exe: Clean up reg_add

Jonathan Vollebregt jnvsor at gmail.com
Thu Oct 9 03:55:13 CDT 2014


---
 programs/reg/reg.c       | 61 ++++++++++++++++++++----------------------------
 programs/reg/tests/reg.c |  6 ++---
 2 files changed, 28 insertions(+), 39 deletions(-)

diff --git a/programs/reg/reg.c b/programs/reg/reg.c
index bade263..fe42dd5 100644
--- a/programs/reg/reg.c
+++ b/programs/reg/reg.c
@@ -544,29 +544,24 @@ static DWORD print_all_values(const HKEY hkey, const WCHAR *key_name, const BOOL
     return 0;
 }
 
-static int reg_add(WCHAR *key_name, WCHAR *value_name, BOOL value_empty,
-    WCHAR *type, WCHAR separator, WCHAR *data, BOOL force)
+static int reg_add( const WCHAR *key_name,  const WCHAR *value_name,    const BOOL value_empty,
+                    const WCHAR *type,      const WCHAR separator,      const WCHAR *data,
+                    const BOOL force)
 {
-    static const WCHAR stubW[] = {'A','D','D',' ','-',' ','%','s',
-        ' ','%','s',' ','%','d',' ','%','s',' ','%','s',' ','%','d','\n',0};
-    LPWSTR p;
-    HKEY root,subkey;
-
-    reg_printfW(stubW, key_name, value_name, value_empty, type, data, force);
+    HKEY key;
 
-    p = strchrW(key_name,'\\');
-    if (!p)
+    if (value_name && value_empty)
     {
-        reg_message(STRING_INVALID_KEY);
+        reg_message(STRING_INVALID_CMDLINE);
         return 1;
     }
-    p++;
 
-    root = path_get_rootkey(key_name);
-    if (!root)
+    key = path_get_rootkey(key_name);
+    if (!key)
         return 1;
 
-    if(RegCreateKeyW(root,p,&subkey)!=ERROR_SUCCESS)
+    key_name = strchrW(key_name, '\\');
+    if (key_name && RegCreateKeyW(key, key_name + 1, &key) != ERROR_SUCCESS)
     {
         reg_message(STRING_INVALID_KEY);
         return 1;
@@ -574,16 +569,15 @@ static int reg_add(WCHAR *key_name, WCHAR *value_name, BOOL value_empty,
 
     if (value_name || data)
     {
-        DWORD reg_type;
-        DWORD reg_count = 0;
-        BYTE* reg_data = NULL;
+        DWORD size, reg_type;
+        BYTE *data_out;
 
-        if (!force)
+        if (value_name && !value_name[0])
+            value_name = NULL;
+
+        if (!force && RegQueryValueW(key, value_name, NULL, NULL) == ERROR_SUCCESS)
         {
-            if (RegQueryValueW(subkey,value_name,NULL,NULL)==ERROR_SUCCESS)
-            {
-                /* FIXME:  Prompt for overwrite */
-            }
+            /* FIXME:  Prompt for overwrite */
         }
 
         if (!type)
@@ -593,29 +587,24 @@ static int reg_add(WCHAR *key_name, WCHAR *value_name, BOOL value_empty,
 
         if (reg_type == -1)
         {
-            RegCloseKey(subkey);
+            RegCloseKey(key);
             reg_message(STRING_INVALID_CMDLINE);
             return 1;
         }
 
-        if (data)
+        data_out = wchar_get_data(data, reg_type, separator, &size);
+        if (!data_out)
         {
-            reg_data = wchar_get_data(data, reg_type, separator, &reg_count);
-            if (!reg_data)
-            {
-                RegCloseKey(subkey);
-                reg_message(STRING_ERROR);
-                return 1;
-            }
+            RegCloseKey(key);
+            return 1;
         }
 
-        RegSetValueExW(subkey,value_name,0,reg_type,reg_data,reg_count);
-        HeapFree(GetProcessHeap(),0,reg_data);
+        RegSetValueExW(key, value_name, 0, reg_type, data_out, size);
+        HeapFree(GetProcessHeap(), 0, data_out);
     }
 
-    RegCloseKey(subkey);
+    RegCloseKey(key);
     reg_message(STRING_SUCCESS);
-
     return 0;
 }
 
diff --git a/programs/reg/tests/reg.c b/programs/reg/tests/reg.c
index 75ff631..1b1cad0 100644
--- a/programs/reg/tests/reg.c
+++ b/programs/reg/tests/reg.c
@@ -122,7 +122,7 @@ static void test_add(void)
 
     run_reg_exe("reg add HKCU\\" KEY_BASE " /v test /f", &r);
     ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
-    verify_reg(hkey, "test", REG_SZ, "", 1, TODO_REG_SIZE);
+    verify_reg(hkey, "test", REG_SZ, "", 1, 0);
 
     run_reg_exe("reg add HKEY_CURRENT_USER\\" KEY_BASE " /ve /d WineTEST /f", &r);
     ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
@@ -130,7 +130,7 @@ static void test_add(void)
 
     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_SZ /v test2 /f", &r);
     ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
-    verify_reg(hkey, "test2", REG_SZ, "", 1, TODO_REG_SIZE);
+    verify_reg(hkey, "test2", REG_SZ, "", 1, 0);
 
     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_SZ /v test3 /f /d \"\"", &r);
     ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
@@ -147,7 +147,7 @@ static void test_add(void)
         win_skip("broken reg.exe detected\n");
 
     run_reg_exe("reg add HKCU\\" KEY_BASE " /v dword1 /t REG_DWORD /f", &r);
-    todo_wine ok(r == REG_EXIT_FAILURE || broken(r == REG_EXIT_SUCCESS /* WinXP */),
+    ok(r == REG_EXIT_FAILURE || broken(r == REG_EXIT_SUCCESS /* WinXP */),
        "got exit code %d, expected 0\n", r);
     run_reg_exe("reg add HKCU\\" KEY_BASE " /v dword2 /t REG_DWORD /d zzz /f", &r);
     ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
-- 
2.1.1




More information about the wine-patches mailing list