localed: introduce helper function to simplify matching

This commit is contained in:
Zbigniew Jędrzejewski-Szmek
2014-09-03 22:55:52 -04:00
parent 502f961425
commit 81fd105a5f
+10 -12
View File
@@ -101,6 +101,12 @@ static void free_and_replace(char **s, char *v) {
*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);
@@ -679,26 +685,18 @@ static int find_legacy_keymap(Context *c, char **new_keymap) {
/* 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;
}
}