Module: wine Branch: master Commit: d90f2a55bf270c53ff7edb1f768c657e677ace01 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d90f2a55bf270c53ff7edb1f76...
Author: Hugh McMaster hugh.mcmaster@outlook.com Date: Fri Aug 18 09:31:08 2017 +0000
reg: Delete registry values via the state machine.
Signed-off-by: Hugh McMaster hugh.mcmaster@outlook.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
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 544a085..654235b 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 991284f..8ddeabc 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 */