*s = v;
}
+static bool startswith_comma(const char *s, const char *prefix) {
+ const char *t;
+
+ return s && (t = startswith(s, prefix)) && (*t == ',');
+}
+
static void context_free_x11(Context *c) {
free_and_replace(&c->x11_layout, NULL);
free_and_replace(&c->x11_model, NULL);
/* If we got an exact match, this is best */
matching = 10;
else {
- size_t x;
-
- x = strcspn(c->x11_layout, ",");
-
/* We have multiple X layouts, look for an
* entry that matches our key with everything
* but the first layout stripped off. */
- if (x > 0 &&
- strlen(a[1]) == x &&
- strneq(c->x11_layout, a[1], x))
+ if (startswith_comma(c->x11_layout, a[1]))
matching = 5;
else {
- size_t w;
+ char *x;
/* If that didn't work, strip off the
* other layouts from the entry, too */
- w = strcspn(a[1], ",");
-
- if (x > 0 && x == w &&
- memcmp(c->x11_layout, a[1], x) == 0)
+ x = strndupa(a[1], strcspn(a[1], ","));
+ if (startswith_comma(c->x11_layout, x))
matching = 1;
}
}