Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>
---
 data/README.md     |  1 -
 src/quirks.c       | 20 +++++++++++++++--
 test/test-quirks.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 82 insertions(+), 3 deletions(-)

diff --git a/data/README.md b/data/README.md
index 66897938..55b9056f 100644
--- a/data/README.md
+++ b/data/README.md
@@ -60,7 +60,6 @@ The following will cause parser errors and are considered 
invalid data
 files:
 
 * Whitespace at the beginning of the line
-* Inline comments, e.g. `MatchBus=usb # oops, fail`
 * Sections without at least one `Match*` entry
 * Sections with the same `Match*` entry repeated
 * Sections without at least one of `Model*` or `Attr` entries
diff --git a/src/quirks.c b/src/quirks.c
index b88d8bc9..1a44574a 100644
--- a/src/quirks.c
+++ b/src/quirks.c
@@ -767,10 +767,26 @@ parse_file(struct quirks_context *ctx, const char *path)
        }
 
        while (fgets(line, sizeof(line), fp)) {
+               char *comment;
+
                lineno++;
-               if (strlen(line) >= 1 && line[strlen(line) - 1] == '\n')
-                       line[strlen(line) - 1] = '\0'; /* drop trailing \n */
 
+               comment = strstr(line, "#");
+               if (comment) {
+                       /* comment points to # but we need to remove the
+                        * preceding whitespaces too */
+                       comment--;
+                       while (comment >= line) {
+                               if (*comment != ' ' && *comment != '\t')
+                                       break;
+                               comment--;
+                       }
+                       *(comment + 1) = '\0';
+               } else { /* strip the trailing newline */
+                       comment = strstr(line, "\n");
+                       if (comment)
+                               *comment = '\0';
+               }
                if (strlen(line) == 0)
                        continue;
 
diff --git a/test/test-quirks.c b/test/test-quirks.c
index 646559ed..6c427dad 100644
--- a/test/test-quirks.c
+++ b/test/test-quirks.c
@@ -264,6 +264,25 @@ START_TEST(quirks_parse_error_section)
 }
 END_TEST
 
+START_TEST(quirks_parse_error_trailing_whitespace)
+{
+       struct quirks_context *ctx;
+       const char quirks_file[] =
+       "[Section name]\n"
+       "MatchUdevType=mouse    \n"
+       "AttrSizeHint=10x10\n";
+       struct data_dir dd = make_data_dir(quirks_file);
+
+       ctx = quirks_init_subsystem(dd.dirname,
+                                   NULL,
+                                   log_handler,
+                                   NULL,
+                                   QLOG_CUSTOM_LOG_PRIORITIES);
+       ck_assert(ctx == NULL);
+       cleanup_data_dir(dd);
+}
+END_TEST
+
 START_TEST(quirks_parse_error_unknown_match)
 {
        struct quirks_context *ctx;
@@ -340,6 +359,48 @@ START_TEST(quirks_parse_error_model_not_one)
 }
 END_TEST
 
+START_TEST(quirks_parse_comment_inline)
+{
+       struct quirks_context *ctx;
+       const char quirks_file[] =
+       "[Section name] # some inline comment\n"
+       "MatchUdevType=mouse\t   # another inline comment\n"
+       "ModelAppleTouchpad=1#\n";
+       struct data_dir dd = make_data_dir(quirks_file);
+
+       ctx = quirks_init_subsystem(dd.dirname,
+                                   NULL,
+                                   log_handler,
+                                   NULL,
+                                   QLOG_CUSTOM_LOG_PRIORITIES);
+       ck_assert_notnull(ctx);
+       quirks_context_unref(ctx);
+       cleanup_data_dir(dd);
+}
+END_TEST
+
+START_TEST(quirks_parse_comment_empty)
+{
+       struct quirks_context *ctx;
+       const char quirks_file[] =
+       "[Section name]\n"
+       "#\n"
+       "   #\n"
+       "MatchUdevType=mouse\n"
+       "ModelAppleTouchpad=1\n";
+       struct data_dir dd = make_data_dir(quirks_file);
+
+       ctx = quirks_init_subsystem(dd.dirname,
+                                   NULL,
+                                   log_handler,
+                                   NULL,
+                                   QLOG_CUSTOM_LOG_PRIORITIES);
+       ck_assert_notnull(ctx);
+       quirks_context_unref(ctx);
+       cleanup_data_dir(dd);
+}
+END_TEST
+
 START_TEST(quirks_parse_bustype)
 {
        struct quirks_context *ctx;
@@ -786,10 +847,13 @@ TEST_COLLECTION(quirks)
        litest_add_for_device("quirks:structure", 
quirks_section_duplicate_attr, LITEST_MOUSE);
 
        litest_add_for_device("quirks:parsing", quirks_parse_error_section, 
LITEST_MOUSE);
+       litest_add_for_device("quirks:parsing", 
quirks_parse_error_trailing_whitespace, LITEST_MOUSE);
        litest_add_for_device("quirks:parsing", 
quirks_parse_error_unknown_match, LITEST_MOUSE);
        litest_add_for_device("quirks:parsing", 
quirks_parse_error_unknown_attr, LITEST_MOUSE);
        litest_add_for_device("quirks:parsing", 
quirks_parse_error_unknown_model, LITEST_MOUSE);
        litest_add_for_device("quirks:parsing", 
quirks_parse_error_model_not_one, LITEST_MOUSE);
+       litest_add_for_device("quirks:parsing", quirks_parse_comment_inline, 
LITEST_MOUSE);
+       litest_add_for_device("quirks:parsing", quirks_parse_comment_empty, 
LITEST_MOUSE);
 
        litest_add_for_device("quirks:parsing", quirks_parse_bustype, 
LITEST_MOUSE);
        litest_add_for_device("quirks:parsing", quirks_parse_bustype_invalid, 
LITEST_MOUSE);
-- 
2.14.4

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to