[PATCH 2/2] reg: merge key open code
Michel Zou
xantares09 at hotmail.com
Thu Sep 3 14:52:00 CDT 2015
---
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 0f28b63..cf6425e 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;
@@ -222,34 +252,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)
{
@@ -289,8 +301,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'
@@ -300,20 +312,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)
{
@@ -335,7 +336,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;
@@ -344,12 +355,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.5.1
More information about the wine-patches
mailing list