Hugh McMaster : reg: Delete registry values via the state machine.

Alexandre Julliard julliard at winehq.org
Sun Aug 20 00:02:28 CDT 2017


Module: wine
Branch: master
Commit: d90f2a55bf270c53ff7edb1f768c657e677ace01
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d90f2a55bf270c53ff7edb1f768c657e677ace01

Author: Hugh McMaster <hugh.mcmaster at 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 at outlook.com>
Signed-off-by: Alexandre Julliard <julliard at 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 */




More information about the wine-cvs mailing list