summaryrefslogtreecommitdiff
path: root/xkb/maprules.c
diff options
context:
space:
mode:
Diffstat (limited to 'xkb/maprules.c')
-rw-r--r--xkb/maprules.c126
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;
}