From: xantares 09 Subject: [PATCH 2/2] reg: merge key open code Message-Id: Date: Thu, 6 Aug 2015 21:14:49 +0000 From: Jonathan Vollebregt --- programs/reg/reg.c | 91 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 48 insertions(+), 43 deletions(-)
 
From: Jonathan Vollebregt <jnvsor@gmail.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 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;