rules: reformat SubstituteVars

Signed-off-by: Ran Benita <ran234@gmail.com>
master
Ran Benita 2012-05-18 18:25:59 +03:00
parent a9477b5754
commit 52939d4bea
1 changed files with 116 additions and 89 deletions

View File

@ -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);