static bool
match_one_of(const char *haystack, const char *needle, char sep)
{
- const char *s = strstr(haystack, needle);
+ const char *s = haystack;
+ const size_t len = strlen(needle);
- if (s == NULL)
- return false;
-
- if (s != haystack && *s != sep)
- return false;
+ do {
+ if (strncmp(s, needle, len) == 0 && (s[len] == '\0' || s[len] == sep))
+ return true;
+ s = strchr(s, sep);
+ } while (s++);
- s += strlen(needle);
- if (*s != '\0' && *s != sep)
- return false;
-
- return true;
+ return false;
}
static int
--- /dev/null
+! model = keycodes
+ my_model = my_keycodes
+ * = default_keycodes
+
+! layout variant = symbols
+ my_layout my_variant = my_symbols+extra_variant
+
+! layout = symbols
+ my_layout = my_symbols
+ * = default_symbols
+
+! model = types
+ my_model = my_types
+ * = default_types
+
+! model = compat
+ my_model = my_compat
+ * = default_compat
+
+! option = compat
+ option111 = +substring
+ option1 = +some:compat
+ option11 = +group(bla)
+
+! option = symbols
+ option3 = +compose(foo)+keypad(bar)
+ colon:opt = +altwin(menu)
};
assert(test_rules(ctx, &test6));
+ struct test_data test7 = {
+ .rules = "multiple-options",
+
+ .model = "my_model", .layout = "my_layout", .variant = "my_variant",
+ .options = "option3,option1,colon:opt,option11",
+
+ .keycodes = "my_keycodes", .types = "my_types",
+ .compat = "my_compat+some:compat+group(bla)",
+ .symbols = "my_symbols+extra_variant+compose(foo)+keypad(bar)+altwin(menu)",
+ };
+ assert(test_rules(ctx, &test7));
+
xkb_context_unref(ctx);
return 0;
}