[PATCH 10/13] reg: Delete registry values via the state machine
Hugh McMaster
hugh.mcmaster at outlook.com
Fri Aug 18 04:31:08 CDT 2017
Signed-off-by: Hugh McMaster <hugh.mcmaster at outlook.com>
---
programs/reg/import.c | 23 +++++++++++++++++++----
programs/reg/tests/reg.c | 16 ++++++++--------
2 files changed, 27 insertions(+), 12 deletions(-)
diff --git a/programs/reg/import.c b/programs/reg/import.c
index 544a0853a1..654235b056 100644
--- a/programs/reg/import.c
+++ b/programs/reg/import.c
@@ -69,6 +69,7 @@ enum parser_state
DEFAULT_VALUE_NAME, /* parsing a default value name */
QUOTED_VALUE_NAME, /* parsing a double-quoted value name */
DATA_START, /* preparing for data parsing operations */
+ DELETE_VALUE, /* deleting a registry value */
DATA_TYPE, /* parsing the registry data type */
STRING_DATA, /* parsing REG_SZ data */
DWORD_DATA, /* parsing DWORD data */
@@ -107,6 +108,7 @@ static WCHAR *key_name_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);
+static WCHAR *delete_value_state(struct parser *parser, WCHAR *pos);
static WCHAR *data_type_state(struct parser *parser, WCHAR *pos);
static WCHAR *string_data_state(struct parser *parser, WCHAR *pos);
static WCHAR *dword_data_state(struct parser *parser, WCHAR *pos);
@@ -125,6 +127,7 @@ static const parser_state_func parser_funcs[NB_PARSER_STATES] =
default_value_name_state, /* DEFAULT_VALUE_NAME */
quoted_value_name_state, /* QUOTED_VALUE_NAME */
data_start_state, /* DATA_START */
+ delete_value_state, /* DELETE_VALUE */
data_type_state, /* DATA_TYPE */
string_data_state, /* STRING_DATA */
dword_data_state, /* DWORD_DATA */
@@ -642,10 +645,7 @@ static WCHAR *data_start_state(struct parser *parser, WCHAR *pos)
p[len] = 0;
if (*p == '-')
- {
- FIXME("value deletion not yet implemented\n");
- goto invalid;
- }
+ set_state(parser, DELETE_VALUE);
else
set_state(parser, DATA_TYPE);
return p;
@@ -655,6 +655,21 @@ invalid:
return p;
}
+/* handler for parser DELETE_VALUE state */
+static WCHAR *delete_value_state(struct parser *parser, WCHAR *pos)
+{
+ WCHAR *p = pos + 1;
+
+ while (*p == ' ' || *p == '\t') p++;
+ if (*p && *p != ';') goto done;
+
+ RegDeleteValueW(parser->hkey, parser->value_name);
+
+done:
+ set_state(parser, LINE_START);
+ return p;
+}
+
/* handler for parser DATA_TYPE state */
static WCHAR *data_type_state(struct parser *parser, WCHAR *pos)
{
diff --git a/programs/reg/tests/reg.c b/programs/reg/tests/reg.c
index 991284fd58..8ddeabc34b 100644
--- a/programs/reg/tests/reg.c
+++ b/programs/reg/tests/reg.c
@@ -1758,11 +1758,11 @@ static void test_import(void)
"\"Wine46e\"=- ;comment\n"
"\"Wine46f\"=- #comment\n\n", &r);
todo_wine ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
- todo_wine verify_reg_nonexist(hkey, "Wine46a");
- todo_wine verify_reg_nonexist(hkey, "Wine46b");
- todo_wine verify_reg_nonexist(hkey, "Wine46c");
+ verify_reg_nonexist(hkey, "Wine46a");
+ verify_reg_nonexist(hkey, "Wine46b");
+ verify_reg_nonexist(hkey, "Wine46c");
verify_reg(hkey, "Wine46d", REG_MULTI_SZ, "Line concatenation\0", 20, 0);
- todo_wine verify_reg_nonexist(hkey, "Wine46e");
+ verify_reg_nonexist(hkey, "Wine46e");
verify_reg(hkey, "Wine46f", REG_NONE, "V\0a\0l\0u\0e\0\0", 12, 0);
/* Test the accepted range of the hex-based data types */
@@ -3215,11 +3215,11 @@ static void test_unicode_import(void)
"\"Wine46e\"=- ;comment\n"
"\"Wine46f\"=- #comment\n\n", &r);
todo_wine ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
- todo_wine verify_reg_nonexist(hkey, "Wine46a");
- todo_wine verify_reg_nonexist(hkey, "Wine46b");
- todo_wine verify_reg_nonexist(hkey, "Wine46c");
+ verify_reg_nonexist(hkey, "Wine46a");
+ verify_reg_nonexist(hkey, "Wine46b");
+ verify_reg_nonexist(hkey, "Wine46c");
verify_reg(hkey, "Wine46d", REG_MULTI_SZ, "Line concatenation\0", 20, 0);
- todo_wine verify_reg_nonexist(hkey, "Wine46e");
+ verify_reg_nonexist(hkey, "Wine46e");
verify_reg(hkey, "Wine46f", REG_NONE, "V\0a\0l\0u\0e\0\0", 12, 0);
/* Test the accepted range of the hex-based data types */
--
2.14.1
More information about the wine-patches
mailing list