[PATCH 11/13] reg: Delete registry keys via the state machine
Hugh McMaster
hugh.mcmaster at outlook.com
Fri Aug 18 04:31:17 CDT 2017
Signed-off-by: Hugh McMaster <hugh.mcmaster at outlook.com>
---
programs/reg/import.c | 27 +++++++++++++++++++++++++--
programs/reg/tests/reg.c | 36 ++++++++++++++++++------------------
2 files changed, 43 insertions(+), 20 deletions(-)
diff --git a/programs/reg/import.c b/programs/reg/import.c
index 654235b056..c4879244c3 100644
--- a/programs/reg/import.c
+++ b/programs/reg/import.c
@@ -66,6 +66,7 @@ enum parser_state
PARSE_WIN31_LINE, /* parsing a Windows 3.1 registry line */
LINE_START, /* at the beginning of a registry line */
KEY_NAME, /* parsing a key name */
+ DELETE_KEY, /* deleting a registry key */
DEFAULT_VALUE_NAME, /* parsing a default value name */
QUOTED_VALUE_NAME, /* parsing a double-quoted value name */
DATA_START, /* preparing for data parsing operations */
@@ -105,6 +106,7 @@ static WCHAR *header_state(struct parser *parser, WCHAR *pos);
static WCHAR *parse_win31_line_state(struct parser *parser, WCHAR *pos);
static WCHAR *line_start_state(struct parser *parser, WCHAR *pos);
static WCHAR *key_name_state(struct parser *parser, WCHAR *pos);
+static WCHAR *delete_key_state(struct parser *parser, WCHAR *pos);
static WCHAR *default_value_name_state(struct parser *parser, WCHAR *pos);
static WCHAR *quoted_value_name_state(struct parser *parser, WCHAR *pos);
static WCHAR *data_start_state(struct parser *parser, WCHAR *pos);
@@ -124,6 +126,7 @@ static const parser_state_func parser_funcs[NB_PARSER_STATES] =
parse_win31_line_state, /* PARSE_WIN31_LINE */
line_start_state, /* LINE_START */
key_name_state, /* KEY_NAME */
+ delete_key_state, /* DELETE_KEY */
default_value_name_state, /* DEFAULT_VALUE_NAME */
quoted_value_name_state, /* QUOTED_VALUE_NAME */
data_start_state, /* DATA_START */
@@ -581,8 +584,8 @@ static WCHAR *key_name_state(struct parser *parser, WCHAR *pos)
if (*p == '-')
{
- FIXME("key deletion not yet implemented\n");
- goto done;
+ set_state(parser, DELETE_KEY);
+ return p + 1;
}
else if (open_key(parser, p) != ERROR_SUCCESS)
output_message(STRING_OPEN_KEY_FAILED, p);
@@ -592,6 +595,26 @@ done:
return p;
}
+/* handler for parser DELETE_KEY state */
+static WCHAR *delete_key_state(struct parser *parser, WCHAR *pos)
+{
+ WCHAR *p = pos;
+
+ if (*p == 'H' || *p == 'h')
+ {
+ HKEY root;
+ WCHAR *path;
+
+ root = parse_key_name(p, &path);
+
+ if (root && path && *path)
+ RegDeleteTreeW(root, path);
+ }
+
+ set_state(parser, LINE_START);
+ return p;
+}
+
/* handler for parser DEFAULT_VALUE_NAME state */
static WCHAR *default_value_name_state(struct parser *parser, WCHAR *pos)
{
diff --git a/programs/reg/tests/reg.c b/programs/reg/tests/reg.c
index 8ddeabc34b..6409196076 100644
--- a/programs/reg/tests/reg.c
+++ b/programs/reg/tests/reg.c
@@ -1713,8 +1713,8 @@ static void test_import(void)
"[-HKEY_CURRENT_USER\\" KEY_BASE "\\Subkey2a]\n\n"
"[-HKEY_CURRENT_USER\\" KEY_BASE "\\Subkey2b]\n\n", &r);
todo_wine ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
- todo_wine verify_key_nonexist(hkey, "Subkey2a");
- todo_wine verify_key_nonexist(hkey, "Subkey2b");
+ verify_key_nonexist(hkey, "Subkey2a");
+ verify_key_nonexist(hkey, "Subkey2b");
/* Test case sensitivity when creating and deleting registry keys. */
test_import_str("REGEDIT4\n\n"
@@ -1728,8 +1728,8 @@ static void test_import(void)
"[-HKEY_current_USER\\" KEY_BASE "\\sUBKEY3A]\n\n"
"[-hKeY_cUrReNt_UsEr\\" KEY_BASE "\\sUbKeY3B]\n\n", &r);
todo_wine ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
- todo_wine verify_key_nonexist(hkey, "Subkey3a");
- todo_wine verify_key_nonexist(hkey, "Subkey3b");
+ verify_key_nonexist(hkey, "Subkey3a");
+ verify_key_nonexist(hkey, "Subkey3b");
/* Test value deletion. We start by creating some registry values. */
test_import_str("REGEDIT4\n\n"
@@ -2278,7 +2278,7 @@ static void test_import(void)
ok(err == ERROR_SUCCESS, "got %d, expected 0\n", err);
err = RegDeleteKeyA(HKEY_CURRENT_USER, KEY_BASE);
- todo_wine ok(err == ERROR_SUCCESS, "got %d, expected 0\n", err);
+ ok(err == ERROR_SUCCESS, "got %d, expected 0\n", err);
}
static void test_unicode_import(void)
@@ -2330,39 +2330,39 @@ static void test_unicode_import(void)
"[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
"\"Test1\"=\"Value\"\n", &r);
ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
- todo_wine verify_reg_nonexist(hkey, "Test1");
+ verify_reg_nonexist(hkey, "Test1");
test_import_wstr("\xef\xbb\xbfregedit4\n\n"
"[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
"\"Test2\"=\"Value\"\n", &r);
ok(r == REG_EXIT_FAILURE || broken(r == REG_EXIT_SUCCESS) /* WinXP */,
"got exit code %d, expected 1\n", r);
- todo_wine verify_reg_nonexist(hkey, "Test2");
+ verify_reg_nonexist(hkey, "Test2");
test_import_wstr("\xef\xbb\xbfRegedit4\n\n"
"[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
"\"Test3\"=\"Value\"\n", &r);
ok(r == REG_EXIT_FAILURE || broken(r == REG_EXIT_SUCCESS) /* WinXP */,
"got exit code %d, expected 1\n", r);
- todo_wine verify_reg_nonexist(hkey, "Test3");
+ verify_reg_nonexist(hkey, "Test3");
test_import_wstr("\xef\xbb\xbfREGEDIT 4\n\n"
"[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
"\"Test4\"=\"Value\"\n", &r);
ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
- todo_wine verify_reg_nonexist(hkey, "Test4");
+ verify_reg_nonexist(hkey, "Test4");
test_import_wstr("\xef\xbb\xbfREGEDIT4FOO\n\n"
"[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
"\"Test5\"=\"Value\"\n", &r);
ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
- todo_wine verify_reg_nonexist(hkey, "Test5");
+ verify_reg_nonexist(hkey, "Test5");
test_import_wstr("\xef\xbb\xbfREGEDIT4 FOO\n\n"
"[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
"\"Test6\"=\"Value\"\n", &r);
ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
- todo_wine verify_reg_nonexist(hkey, "Test6");
+ verify_reg_nonexist(hkey, "Test6");
test_import_wstr("\xef\xbb\xbfREGEDIT5\n\n"
"[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
@@ -3169,8 +3169,8 @@ static void test_unicode_import(void)
"[-HKEY_CURRENT_USER\\" KEY_BASE "\\Subkey2a]\n\n"
"[-HKEY_CURRENT_USER\\" KEY_BASE "\\Subkey2b]\n\n", &r);
todo_wine ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
- todo_wine verify_key_nonexist(hkey, "Subkey2a");
- todo_wine verify_key_nonexist(hkey, "Subkey2b");
+ verify_key_nonexist(hkey, "Subkey2a");
+ verify_key_nonexist(hkey, "Subkey2b");
/* Test case sensitivity when creating and deleting registry keys. */
test_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
@@ -3184,8 +3184,8 @@ static void test_unicode_import(void)
"[-HKEY_current_USER\\" KEY_BASE "\\sUBKEY3A]\n\n"
"[-hKeY_cUrReNt_UsEr\\" KEY_BASE "\\sUbKeY3B]\n\n", &r);
todo_wine ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
- todo_wine verify_key_nonexist(hkey, "Subkey3a");
- todo_wine verify_key_nonexist(hkey, "Subkey3b");
+ verify_key_nonexist(hkey, "Subkey3a");
+ verify_key_nonexist(hkey, "Subkey3b");
/* Test value deletion. We start by creating some registry values. */
test_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
@@ -3744,7 +3744,7 @@ static void test_unicode_import(void)
ok(err == ERROR_SUCCESS, "got %d, expected 0\n", err);
err = RegDeleteKeyA(HKEY_CURRENT_USER, KEY_BASE);
- todo_wine ok(err == ERROR_SUCCESS, "got %d, expected 0\n", err);
+ ok(err == ERROR_SUCCESS, "got %d, expected 0\n", err);
}
static void test_import_with_whitespace(void)
@@ -3891,7 +3891,7 @@ static void test_import_with_whitespace(void)
ok(err == ERROR_SUCCESS, "RegCloseKey failed: got %d, expected 0\n", err);
err = RegDeleteKeyA(HKEY_CURRENT_USER, KEY_BASE);
- todo_wine ok(err == ERROR_SUCCESS, "RegDeleteKeyA failed: got %d, expected 0\n", err);
+ ok(err == ERROR_SUCCESS, "RegDeleteKeyA failed: got %d, expected 0\n", err);
}
static void test_unicode_import_with_whitespace(void)
@@ -4038,7 +4038,7 @@ static void test_unicode_import_with_whitespace(void)
ok(err == ERROR_SUCCESS, "RegCloseKey failed: got %d, expected 0\n", err);
err = RegDeleteKeyA(HKEY_CURRENT_USER, KEY_BASE);
- todo_wine ok(err == ERROR_SUCCESS, "RegDeleteKeyA failed: got %d, expected 0\n", err);
+ ok(err == ERROR_SUCCESS, "RegDeleteKeyA failed: got %d, expected 0\n", err);
}
static void test_import_31(void)
--
2.14.1
More information about the wine-patches
mailing list