parent
a9477b5754
commit
52939d4bea
|
@ -895,99 +895,126 @@ apply_matching_rules(struct rules *rules, struct multi_defs *mdefs,
|
||||||
/***====================================================================***/
|
/***====================================================================***/
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
XkbRF_SubstituteVars(char *name, struct multi_defs *mdefs)
|
substitute_vars(char *name, struct multi_defs *mdefs)
|
||||||
{
|
{
|
||||||
char *str, *outstr, *orig, *var;
|
char *str, *outstr, *var;
|
||||||
size_t len;
|
char *orig = name;
|
||||||
|
size_t len, extra_len;
|
||||||
|
char pfx, sfx;
|
||||||
int ndx;
|
int ndx;
|
||||||
|
|
||||||
if (!name)
|
if (!name)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
orig= name;
|
str = strchr(name, '%');
|
||||||
str= strchr(name,'%');
|
if (str == NULL)
|
||||||
if (str==NULL)
|
|
||||||
return name;
|
return name;
|
||||||
len= strlen(name);
|
|
||||||
while (str!=NULL) {
|
len = strlen(name);
|
||||||
char pfx= str[1];
|
|
||||||
int extra_len= 0;
|
while (str != NULL) {
|
||||||
if ((pfx=='+')||(pfx=='|')||(pfx=='_')||(pfx=='-')) {
|
pfx = str[1];
|
||||||
extra_len= 1;
|
extra_len = 0;
|
||||||
|
|
||||||
|
if (pfx == '+' || pfx == '|' || pfx == '_' || pfx == '-') {
|
||||||
|
extra_len = 1;
|
||||||
str++;
|
str++;
|
||||||
}
|
}
|
||||||
else if (pfx=='(') {
|
else if (pfx == '(') {
|
||||||
extra_len= 2;
|
extra_len = 2;
|
||||||
str++;
|
str++;
|
||||||
}
|
}
|
||||||
|
|
||||||
var = str + 1;
|
var = str + 1;
|
||||||
str = get_index(var + 1, &ndx);
|
str = get_index(var + 1, &ndx);
|
||||||
if (ndx == -1) {
|
if (ndx == -1) {
|
||||||
str = strchr(str,'%');
|
str = strchr(str, '%');
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ((*var=='l') && mdefs->layout[ndx] && *mdefs->layout[ndx])
|
|
||||||
len+= strlen(mdefs->layout[ndx])+extra_len;
|
if (*var == 'l' && mdefs->layout[ndx] && *mdefs->layout[ndx])
|
||||||
else if ((*var=='m')&&mdefs->model)
|
len += strlen(mdefs->layout[ndx]) + extra_len;
|
||||||
len+= strlen(mdefs->model)+extra_len;
|
else if (*var == 'm' && mdefs->model)
|
||||||
else if ((*var=='v') && mdefs->variant[ndx] && *mdefs->variant[ndx])
|
len += strlen(mdefs->model) + extra_len;
|
||||||
len+= strlen(mdefs->variant[ndx])+extra_len;
|
else if (*var == 'v' && mdefs->variant[ndx] && *mdefs->variant[ndx])
|
||||||
if ((pfx=='(')&&(*str==')')) {
|
len += strlen(mdefs->variant[ndx]) + extra_len;
|
||||||
|
|
||||||
|
if (pfx == '(' && *str == ')')
|
||||||
str++;
|
str++;
|
||||||
|
|
||||||
|
str = strchr(&str[0], '%');
|
||||||
}
|
}
|
||||||
str= strchr(&str[0],'%');
|
|
||||||
}
|
|
||||||
name = malloc(len + 1);
|
name = malloc(len + 1);
|
||||||
str= orig;
|
str = orig;
|
||||||
outstr= name;
|
outstr = name;
|
||||||
while (*str!='\0') {
|
|
||||||
if (str[0]=='%') {
|
while (*str != '\0') {
|
||||||
char pfx,sfx;
|
if (str[0] == '%') {
|
||||||
str++;
|
str++;
|
||||||
pfx= str[0];
|
pfx = str[0];
|
||||||
sfx= '\0';
|
sfx = '\0';
|
||||||
if ((pfx=='+')||(pfx=='|')||(pfx=='_')||(pfx=='-')) {
|
|
||||||
|
if (pfx == '+' || pfx == '|' || pfx == '_' || pfx == '-') {
|
||||||
str++;
|
str++;
|
||||||
}
|
}
|
||||||
else if (pfx=='(') {
|
else if (pfx == '(') {
|
||||||
sfx= ')';
|
sfx = ')';
|
||||||
str++;
|
str++;
|
||||||
}
|
}
|
||||||
else pfx= '\0';
|
else {
|
||||||
|
pfx = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
var = str;
|
var = str;
|
||||||
str = get_index(var + 1, &ndx);
|
str = get_index(var + 1, &ndx);
|
||||||
if (ndx == -1) {
|
if (ndx == -1)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (*var == 'l' && mdefs->layout[ndx] && *mdefs->layout[ndx]) {
|
||||||
|
if (pfx)
|
||||||
|
*outstr++ = pfx;
|
||||||
|
|
||||||
|
strcpy(outstr, mdefs->layout[ndx]);
|
||||||
|
outstr += strlen(mdefs->layout[ndx]);
|
||||||
|
|
||||||
|
if (sfx)
|
||||||
|
*outstr++ = sfx;
|
||||||
}
|
}
|
||||||
if ((*var=='l') && mdefs->layout[ndx] && *mdefs->layout[ndx]) {
|
else if (*var == 'm' && mdefs->model) {
|
||||||
if (pfx) *outstr++= pfx;
|
if (pfx)
|
||||||
strcpy(outstr,mdefs->layout[ndx]);
|
*outstr++ = pfx;
|
||||||
outstr+= strlen(mdefs->layout[ndx]);
|
|
||||||
if (sfx) *outstr++= sfx;
|
strcpy(outstr, mdefs->model);
|
||||||
|
outstr += strlen(mdefs->model);
|
||||||
|
|
||||||
|
if (sfx)
|
||||||
|
*outstr++ = sfx;
|
||||||
}
|
}
|
||||||
else if ((*var=='m')&&(mdefs->model)) {
|
else if (*var == 'v' && mdefs->variant[ndx] && *mdefs->variant[ndx]) {
|
||||||
if (pfx) *outstr++= pfx;
|
if (pfx)
|
||||||
strcpy(outstr,mdefs->model);
|
*outstr++ = pfx;
|
||||||
outstr+= strlen(mdefs->model);
|
|
||||||
if (sfx) *outstr++= sfx;
|
strcpy(outstr, mdefs->variant[ndx]);
|
||||||
|
outstr += strlen(mdefs->variant[ndx]);
|
||||||
|
|
||||||
|
if (sfx)
|
||||||
|
*outstr++ = sfx;
|
||||||
}
|
}
|
||||||
else if ((*var=='v') && mdefs->variant[ndx] && *mdefs->variant[ndx]) {
|
|
||||||
if (pfx) *outstr++= pfx;
|
if (pfx == '(' && *str == ')')
|
||||||
strcpy(outstr,mdefs->variant[ndx]);
|
|
||||||
outstr+= strlen(mdefs->variant[ndx]);
|
|
||||||
if (sfx) *outstr++= sfx;
|
|
||||||
}
|
|
||||||
if ((pfx=='(')&&(*str==')'))
|
|
||||||
str++;
|
str++;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
*outstr++= *str++;
|
*outstr++= *str++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*outstr++= '\0';
|
*outstr++= '\0';
|
||||||
if (orig!=name)
|
|
||||||
|
if (orig != name)
|
||||||
free(orig);
|
free(orig);
|
||||||
|
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1013,11 +1040,11 @@ XkbcRF_GetComponents(struct rules *rules, struct var_defs *defs,
|
||||||
apply_matching_rules(rules, &mdefs, names, RULE_FLAG_OPTION);
|
apply_matching_rules(rules, &mdefs, names, RULE_FLAG_OPTION);
|
||||||
apply_partial_matches(rules, names);
|
apply_partial_matches(rules, names);
|
||||||
|
|
||||||
names->keycodes = XkbRF_SubstituteVars(names->keycodes, &mdefs);
|
names->keycodes = substitute_vars(names->keycodes, &mdefs);
|
||||||
names->symbols = XkbRF_SubstituteVars(names->symbols, &mdefs);
|
names->symbols = substitute_vars(names->symbols, &mdefs);
|
||||||
names->types = XkbRF_SubstituteVars(names->types, &mdefs);
|
names->types = substitute_vars(names->types, &mdefs);
|
||||||
names->compat = XkbRF_SubstituteVars(names->compat, &mdefs);
|
names->compat = substitute_vars(names->compat, &mdefs);
|
||||||
names->keymap = XkbRF_SubstituteVars(names->keymap, &mdefs);
|
names->keymap = substitute_vars(names->keymap, &mdefs);
|
||||||
|
|
||||||
free_multi_defs(&mdefs);
|
free_multi_defs(&mdefs);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue