Hugh McMaster : reg: Split 'delete' functions from reg.c.

Alexandre Julliard julliard at winehq.org
Wed Mar 17 16:23:15 CDT 2021


Module: wine
Branch: master
Commit: 81a3eecc3c2e7ddced2f25cabc6de47101fd4fb1
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=81a3eecc3c2e7ddced2f25cabc6de47101fd4fb1

Author: Hugh McMaster <hugh.mcmaster at outlook.com>
Date:   Wed Mar 17 23:38:05 2021 +1100

reg: Split 'delete' functions from reg.c.

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

---

 programs/reg/Makefile.in |   1 +
 programs/reg/delete.c    | 109 +++++++++++++++++++++++++++++++++++++++++++++++
 programs/reg/reg.c       |  88 --------------------------------------
 programs/reg/reg.h       |   4 ++
 4 files changed, 114 insertions(+), 88 deletions(-)

diff --git a/programs/reg/Makefile.in b/programs/reg/Makefile.in
index 3203126db66..161be0062f1 100644
--- a/programs/reg/Makefile.in
+++ b/programs/reg/Makefile.in
@@ -5,6 +5,7 @@ DELAYIMPORTS = user32
 EXTRADLLFLAGS = -mconsole -municode -mno-cygwin
 
 C_SRCS = \
+	delete.c \
 	export.c \
 	import.c \
 	query.c \
diff --git a/programs/reg/delete.c b/programs/reg/delete.c
new file mode 100644
index 00000000000..530d4513ece
--- /dev/null
+++ b/programs/reg/delete.c
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2016-2017, 2021 Hugh McMaster
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <windows.h>
+#include <wine/heap.h>
+#include "reg.h"
+
+int reg_delete(HKEY root, WCHAR *path, WCHAR *key_name, WCHAR *value_name,
+               BOOL value_empty, BOOL value_all, BOOL force)
+{
+    HKEY key;
+
+    if (!force)
+    {
+        BOOL ret;
+
+        if (value_name || value_empty)
+            ret = ask_confirm(STRING_DELETE_VALUE, value_name);
+        else if (value_all)
+            ret = ask_confirm(STRING_DELETE_VALUEALL, key_name);
+        else
+            ret = ask_confirm(STRING_DELETE_SUBKEY, key_name);
+
+        if (!ret)
+        {
+            output_message(STRING_CANCELLED);
+            return 0;
+        }
+    }
+
+    /* Delete subtree only if no /v* option is given */
+    if (!value_name && !value_empty && !value_all)
+    {
+        if (RegDeleteTreeW(root, path) != ERROR_SUCCESS)
+        {
+            output_message(STRING_CANNOT_FIND);
+            return 1;
+        }
+        output_message(STRING_SUCCESS);
+        return 0;
+    }
+
+    if (RegOpenKeyW(root, path, &key) != ERROR_SUCCESS)
+    {
+        output_message(STRING_CANNOT_FIND);
+        return 1;
+    }
+
+    if (value_all)
+    {
+        DWORD max_value_len = 256, value_len;
+        WCHAR *value_name;
+        LONG rc;
+
+        value_name = heap_xalloc(max_value_len * sizeof(WCHAR));
+
+        while (1)
+        {
+            value_len = max_value_len;
+            rc = RegEnumValueW(key, 0, value_name, &value_len, NULL, NULL, NULL, NULL);
+            if (rc == ERROR_SUCCESS)
+            {
+                rc = RegDeleteValueW(key, value_name);
+                if (rc != ERROR_SUCCESS)
+                {
+                    heap_free(value_name);
+                    RegCloseKey(key);
+                    output_message(STRING_VALUEALL_FAILED, key_name);
+                    return 1;
+                }
+            }
+            else if (rc == ERROR_MORE_DATA)
+            {
+                max_value_len *= 2;
+                value_name = heap_xrealloc(value_name, max_value_len * sizeof(WCHAR));
+            }
+            else break;
+        }
+        heap_free(value_name);
+    }
+    else if (value_name || value_empty)
+    {
+        if (RegDeleteValueW(key, value_empty ? NULL : value_name) != ERROR_SUCCESS)
+        {
+            RegCloseKey(key);
+            output_message(STRING_CANNOT_FIND);
+            return 1;
+        }
+    }
+
+    RegCloseKey(key);
+    output_message(STRING_SUCCESS);
+    return 0;
+}
diff --git a/programs/reg/reg.c b/programs/reg/reg.c
index 8b97c560118..079ed9b1a1e 100644
--- a/programs/reg/reg.c
+++ b/programs/reg/reg.c
@@ -422,94 +422,6 @@ static int reg_add(HKEY root, WCHAR *path, WCHAR *value_name, BOOL value_empty,
     return 0;
 }
 
-static int reg_delete(HKEY root, WCHAR *path, WCHAR *key_name, WCHAR *value_name,
-                      BOOL value_empty, BOOL value_all, BOOL force)
-{
-    HKEY key;
-
-    if (!force)
-    {
-        BOOL ret;
-
-        if (value_name || value_empty)
-            ret = ask_confirm(STRING_DELETE_VALUE, value_name);
-        else if (value_all)
-            ret = ask_confirm(STRING_DELETE_VALUEALL, key_name);
-        else
-            ret = ask_confirm(STRING_DELETE_SUBKEY, key_name);
-
-        if (!ret)
-        {
-            output_message(STRING_CANCELLED);
-            return 0;
-        }
-    }
-
-    /* Delete subtree only if no /v* option is given */
-    if (!value_name && !value_empty && !value_all)
-    {
-        if (RegDeleteTreeW(root, path) != ERROR_SUCCESS)
-        {
-            output_message(STRING_CANNOT_FIND);
-            return 1;
-        }
-        output_message(STRING_SUCCESS);
-        return 0;
-    }
-
-    if (RegOpenKeyW(root, path, &key) != ERROR_SUCCESS)
-    {
-        output_message(STRING_CANNOT_FIND);
-        return 1;
-    }
-
-    if (value_all)
-    {
-        DWORD max_value_len = 256, value_len;
-        WCHAR *value_name;
-        LONG rc;
-
-        value_name = heap_xalloc(max_value_len * sizeof(WCHAR));
-
-        while (1)
-        {
-            value_len = max_value_len;
-            rc = RegEnumValueW(key, 0, value_name, &value_len, NULL, NULL, NULL, NULL);
-            if (rc == ERROR_SUCCESS)
-            {
-                rc = RegDeleteValueW(key, value_name);
-                if (rc != ERROR_SUCCESS)
-                {
-                    heap_free(value_name);
-                    RegCloseKey(key);
-                    output_message(STRING_VALUEALL_FAILED, key_name);
-                    return 1;
-                }
-            }
-            else if (rc == ERROR_MORE_DATA)
-            {
-                max_value_len *= 2;
-                value_name = heap_xrealloc(value_name, max_value_len * sizeof(WCHAR));
-            }
-            else break;
-        }
-        heap_free(value_name);
-    }
-    else if (value_name || value_empty)
-    {
-        if (RegDeleteValueW(key, value_empty ? NULL : value_name) != ERROR_SUCCESS)
-        {
-            RegCloseKey(key);
-            output_message(STRING_CANNOT_FIND);
-            return 1;
-        }
-    }
-
-    RegCloseKey(key);
-    output_message(STRING_SUCCESS);
-    return 0;
-}
-
 WCHAR *build_subkey_path(WCHAR *path, DWORD path_len, WCHAR *subkey_name, DWORD subkey_len)
 {
     WCHAR *subkey_path;
diff --git a/programs/reg/reg.h b/programs/reg/reg.h
index 471ed9c4d55..c8baaa0f9a9 100644
--- a/programs/reg/reg.h
+++ b/programs/reg/reg.h
@@ -41,6 +41,10 @@ HKEY path_get_rootkey(const WCHAR *path);
 WCHAR *build_subkey_path(WCHAR *path, DWORD path_len, WCHAR *subkey_name, DWORD subkey_len);
 BOOL parse_registry_key(const WCHAR *key, HKEY *root, WCHAR **path, WCHAR **long_key);
 
+/* delete.c */
+int reg_delete(HKEY root, WCHAR *path, WCHAR *key_name, WCHAR *value_name,
+               BOOL value_empty, BOOL value_all, BOOL force);
+
 /* export.c */
 int reg_export(int argc, WCHAR *argv[]);
 




More information about the wine-cvs mailing list