[PATCH 2/2] reg: merge key open code

Michel Zou xantares09 at hotmail.com
Sun Oct 4 14:14:47 CDT 2015


From: Jonathan Vollebregt <jnvsor at gmail.com> 

Signed-off-by: Michel Zou <xantares09 at hotmail.com>

---
 programs/reg/reg.c | 91 ++++++++++++++++++++++++++++--------------------------
 1 file changed, 48 insertions(+), 43 deletions(-)

diff --git a/programs/reg/reg.c b/programs/reg/reg.c
index 00eaab0..403cc57 100644
--- a/programs/reg/reg.c
+++ b/programs/reg/reg.c
@@ -143,6 +143,36 @@ static HKEY path_get_rootkey(const WCHAR *path)
     return NULL;
 }
 
+static HKEY path_open(const WCHAR *path, BOOL create)
+{
+    LONG err;
+    HKEY k;
+
+    k = path_get_rootkey(path);
+    if (!k)
+    {
+        reg_message(STRING_INVALID_KEY);
+        return NULL;
+    }
+
+    path = strchrW(path, '\\');
+    if (path)
+        path++;
+
+    if (create)
+        err = RegCreateKeyW(k, path, &k);
+    else
+        err = RegOpenKeyW(k, path, &k);
+
+    if (err != ERROR_SUCCESS)
+    {
+        reg_message(STRING_CANNOT_FIND);
+        return NULL;
+    }
+
+    return k;
+}
+
 static DWORD wchar_get_type(const WCHAR *type_name)
 {
     DWORD i;
@@ -265,34 +295,16 @@ static int reg_add(WCHAR *key_name, WCHAR *value_name, BOOL value_empty,
 {
     static const WCHAR stubW[] = {'A','D','D',' ','-',' ','%','s',
         ' ','%','s',' ','%','d',' ','%','s',' ','%','s',' ','%','d','\n',0};
-    LPWSTR p;
-    HKEY root,subkey;
+    HKEY subkey;
 
     reg_printfW(stubW, key_name, value_name, value_empty, type, data, force);
 
     if (!sane_path(key_name))
         return 1;
 
-    p = strchrW(key_name,'\\');
-    if (!p)
-    {
-        reg_message(STRING_INVALID_KEY);
-        return 1;
-    }
-    p++;
-
-    root = path_get_rootkey(key_name);
-    if (!root)
-    {
-        reg_message(STRING_INVALID_KEY);
+    subkey = path_open(key_name, TRUE);
+    if (!subkey)
         return 1;
-    }
-
-    if(RegCreateKeyW(root,p,&subkey)!=ERROR_SUCCESS)
-    {
-        reg_message(STRING_INVALID_KEY);
-        return 1;
-    }
 
     if (value_name || data)
     {
@@ -332,8 +344,8 @@ static int reg_add(WCHAR *key_name, WCHAR *value_name, BOOL value_empty,
 static int reg_delete(WCHAR *key_name, WCHAR *value_name, BOOL value_empty,
     BOOL value_all, BOOL force)
 {
-    LPWSTR p;
-    HKEY root,subkey;
+    HKEY subkey;
+    LONG err;
 
     static const WCHAR stubW[] = {'D','E','L','E','T','E',
         ' ','-',' ','%','s',' ','%','s',' ','%','d',' ','%','d',' ','%','d','\n'
@@ -343,20 +355,9 @@ static int reg_delete(WCHAR *key_name, WCHAR *value_name, BOOL value_empty,
     if (!sane_path(key_name))
         return 1;
 
-    p = strchrW(key_name,'\\');
-    if (!p)
-    {
-        reg_message(STRING_INVALID_KEY);
-        return 1;
-    }
-    p++;
-
-    root = path_get_rootkey(key_name);
-    if (!root)
-    {
-        reg_message(STRING_INVALID_KEY);
+    subkey = path_open(key_name, FALSE);
+    if (!subkey)
         return 1;
-    }
 
     if (value_name && value_empty)
     {
@@ -378,7 +379,17 @@ static int reg_delete(WCHAR *key_name, WCHAR *value_name, BOOL value_empty,
     /* Delete subtree only if no /v* option is given */
     if (!value_name && !value_empty && !value_all)
     {
-        if (RegDeleteTreeW(root,p)!=ERROR_SUCCESS)
+        static const WCHAR empty_wstr[] = {0};
+
+        err = RegDeleteTreeW(subkey, NULL);
+        if (err != ERROR_SUCCESS)
+        {
+            reg_message(STRING_CANNOT_FIND);
+            return 1;
+        }
+
+        err = RegDeleteKeyW(subkey, empty_wstr);
+        if (err != ERROR_SUCCESS)
         {
             reg_message(STRING_CANNOT_FIND);
             return 1;
@@ -387,12 +398,6 @@ static int reg_delete(WCHAR *key_name, WCHAR *value_name, BOOL value_empty,
         return 0;
     }
 
-    if(RegOpenKeyW(root,p,&subkey)!=ERROR_SUCCESS)
-    {
-        reg_message(STRING_CANNOT_FIND);
-        return 1;
-    }
-
     if (value_all)
     {
         LPWSTR szValue;
-- 
2.6.0




More information about the wine-patches mailing list