From: Michel Zou Subject: [PATCH 2/2] reg: merge key open code Message-Id: Date: Sun, 4 Oct 2015 21:14:47 +0200 In-Reply-To: <1443986087-6845-1-git-send-email-xantares09@hotmail.com> References: <1443986087-6845-1-git-send-email-xantares09@hotmail.com> From: Jonathan Vollebregt Signed-off-by: Michel Zou --- 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