diff options
Diffstat (limited to 'xkb/maprules.c')
-rw-r--r-- | xkb/maprules.c | 126 |
1 files changed, 43 insertions, 83 deletions
diff --git a/xkb/maprules.c b/xkb/maprules.c index e071ab539..8a1944ef5 100644 --- a/xkb/maprules.c +++ b/xkb/maprules.c @@ -24,9 +24,7 @@ ********************************************************/ -#ifdef HAVE_DIX_CONFIG_H #include <dix-config.h> -#endif #include <stdio.h> #include <ctype.h> @@ -42,6 +40,9 @@ #include <X11/Xfuncs.h> #include <X11/Xatom.h> #include <X11/keysym.h> + +#include "xkb/xkbrules_priv.h" + #include "misc.h" #include "inputstr.h" #include "dix.h" @@ -49,7 +50,11 @@ #include "xkbstr.h" #include <xkbsrv.h> -/***====================================================================***/ + +#define XkbRF_PendingMatch (1L<<1) +#define XkbRF_Option (1L<<2) +#define XkbRF_Append (1L<<3) +#define XkbRF_Normal (1L<<4) #define DFLT_LINE_SIZE 128 @@ -257,7 +262,6 @@ SetUpRemap(InputLine * line, RemapSpec * remap) { char *tok, *str; unsigned present, l_ndx_present, v_ndx_present; - register int i; int len, ndx; _Xstrtokparams strtok_buf; Bool found; @@ -272,7 +276,7 @@ SetUpRemap(InputLine * line, RemapSpec * remap) str = NULL; if (strcmp(tok, "=") == 0) continue; - for (i = 0; i < MAX_WORDS; i++) { + for (int i = 0; i < MAX_WORDS; i++) { len = strlen(cname[i]); if (strncmp(cname[i], tok, len) == 0) { if (strlen(tok) > len) { @@ -318,7 +322,7 @@ SetUpRemap(InputLine * line, RemapSpec * remap) unsigned mask = PART_MASK; ErrorF("Mapping needs at least one of "); - for (i = 0; (i < MAX_WORDS); i++) { + for (int i = 0; (i < MAX_WORDS); i++) { if ((1L << i) & mask) { mask &= ~(1L << i); if (mask) @@ -371,8 +375,7 @@ CheckLine(InputLine * line, RemapSpec * remap, XkbRF_RulePtr rule, XkbRF_GroupPtr group) { char *str, *tok; - register int nread, i; - FileSpec tmp; + register int nread; _Xstrtokparams strtok_buf; Bool append = FALSE; @@ -393,6 +396,8 @@ CheckLine(InputLine * line, return FALSE; group->name = Xstrdup(gname); group->words = Xstrdup(words); + + int i; for (i = 1, words = group->words; *words; words++) { if (*words == ' ') { *words++ = '\0'; @@ -413,7 +418,9 @@ CheckLine(InputLine * line, DebugF("Illegal line of data ignored\n"); return FALSE; } - memset((char *) &tmp, 0, sizeof(FileSpec)); + + FileSpec tmp = { 0 }; + str = line->line; for (nread = 0; (tok = _XStrtok(str, " ", strtok_buf)) != NULL; nread++) { str = NULL; @@ -456,7 +463,7 @@ CheckLine(InputLine * line, rule->geometry = Xstrdup(tmp.name[GEOMETRY]); rule->layout_num = rule->variant_num = 0; - for (i = 0; i < nread; i++) { + for (int i = 0; i < nread; i++) { if (remap->remap[i].index) { if (remap->remap[i].word == LAYOUT) rule->layout_num = remap->remap[i].index; @@ -484,9 +491,7 @@ _Concat(char *str1, const char *str2) static void squeeze_spaces(char *p1) { - char *p2; - - for (p2 = p1; *p2; p2++) { + for (char *p2 = p1; *p2; p2++) { *p1 = *p2; if (*p1 != ' ') p1++; @@ -512,7 +517,6 @@ MakeMultiDefs(XkbRF_MultiDefsPtr mdefs, XkbRF_VarDefsPtr defs) else { char *p; char *layout; - int i; layout = Xstrdup(defs->layout); if (layout == NULL) @@ -520,7 +524,7 @@ MakeMultiDefs(XkbRF_MultiDefsPtr mdefs, XkbRF_VarDefsPtr defs) squeeze_spaces(layout); mdefs->layout[1] = layout; p = layout; - for (i = 2; i <= XkbNumKbdGroups; i++) { + for (int i = 2; i <= XkbNumKbdGroups; i++) { if ((p = strchr(p, ','))) { *p++ = '\0'; mdefs->layout[i] = p; @@ -541,7 +545,6 @@ MakeMultiDefs(XkbRF_MultiDefsPtr mdefs, XkbRF_VarDefsPtr defs) else { char *p; char *variant; - int i; variant = Xstrdup(defs->variant); if (variant == NULL) @@ -549,7 +552,7 @@ MakeMultiDefs(XkbRF_MultiDefsPtr mdefs, XkbRF_VarDefsPtr defs) squeeze_spaces(variant); mdefs->variant[1] = variant; p = variant; - for (i = 2; i <= XkbNumKbdGroups; i++) { + for (int i = 2; i <= XkbNumKbdGroups; i++) { if ((p = strchr(p, ','))) { *p++ = '\0'; mdefs->variant[i] = p; @@ -965,84 +968,41 @@ XkbRF_LoadRules(FILE * file, XkbRF_RulesPtr rules) return TRUE; } -Bool -XkbRF_LoadRulesByName(char *base, char *locale, XkbRF_RulesPtr rules) -{ - FILE *file; - char buf[PATH_MAX]; - Bool ok; - - if ((!base) || (!rules)) - return FALSE; - if (locale) { - if (snprintf(buf, PATH_MAX, "%s-%s", base, locale) >= PATH_MAX) - return FALSE; - } - else { - if (strlen(base) + 1 > PATH_MAX) - return FALSE; - strcpy(buf, base); - } - - file = fopen(buf, "r"); - if ((!file) && (locale)) { /* fallback if locale was specified */ - strcpy(buf, base); - file = fopen(buf, "r"); - } - if (!file) - return FALSE; - ok = XkbRF_LoadRules(file, rules); - fclose(file); - return ok; -} - -/***====================================================================***/ - -XkbRF_RulesPtr -XkbRF_Create(void) -{ - return calloc(1, sizeof(XkbRF_RulesRec)); -} - -/***====================================================================***/ - void -XkbRF_Free(XkbRF_RulesPtr rules, Bool freeRules) +XkbRF_Free(XkbRF_RulesPtr rules) { - int i; - XkbRF_RulePtr rule; - XkbRF_GroupPtr group; - if (!rules) return; + if (rules->rules) { - for (i = 0, rule = rules->rules; i < rules->num_rules; i++, rule++) { - free((void *) rule->model); - free((void *) rule->layout); - free((void *) rule->variant); - free((void *) rule->option); - free((void *) rule->keycodes); - free((void *) rule->symbols); - free((void *) rule->types); - free((void *) rule->compat); - free((void *) rule->geometry); - memset((char *) rule, 0, sizeof(XkbRF_RuleRec)); + XkbRF_RulePtr r = rules->rules; + int num = rules->num_rules; + for (int i = 0; i < num; i++) { + // the typecast on free() is necessary because the pointers are const + free((void *) r[i].model); + free((void *) r[i].layout); + free((void *) r[i].variant); + free((void *) r[i].option); + free((void *) r[i].keycodes); + free((void *) r[i].symbols); + free((void *) r[i].types); + free((void *) r[i].compat); + free((void *) r[i].geometry); } free(rules->rules); - rules->num_rules = rules->sz_rules = 0; - rules->rules = NULL; } if (rules->groups) { - for (i = 0, group = rules->groups; i < rules->num_groups; i++, group++) { - free((void *) group->name); - free(group->words); + XkbRF_GroupPtr g = rules->groups; + int num = rules->num_groups; + for (int i = 0; i < num; i++) { + // the typecast on free() is necessary because the pointers are const + free((void *) g[i].name); + free(g[i].words); } free(rules->groups); - rules->num_groups = 0; - rules->groups = NULL; } - if (freeRules) - free(rules); + + free(rules); return; } |