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 (strlen(base)+strlen(locale)+2 > PATH_MAX) return FALSE; sprintf(buf,"%s-%s", base, locale); } 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; }
Bool XkbDDXNamesFromRules( DeviceIntPtr keybd, char * rules_name, XkbRF_VarDefsPtr defs, XkbComponentNamesPtr names) { char buf[PATH_MAX]; FILE * file; Bool complete; XkbRF_RulesPtr rules; if (!rules_name) return FALSE; if (strlen(XkbBaseDirectory) + strlen(rules_name) + 8 > PATH_MAX) { LogMessage(X_ERROR, "XKB: Rules name is too long\n"); return FALSE; } sprintf(buf,"%s/rules/%s", XkbBaseDirectory, rules_name); file = fopen(buf, "r"); if (!file) { LogMessage(X_ERROR, "XKB: Couldn't open rules file %s\n", buf); return FALSE; } rules = XkbRF_Create(); if (!rules) { LogMessage(X_ERROR, "XKB: Couldn't create rules struct\n"); fclose(file); return FALSE; } if (!XkbRF_LoadRules(file, rules)) { LogMessage(X_ERROR, "XKB: Couldn't parse rules file %s\n", rules_name); fclose(file); XkbRF_Free(rules,TRUE); return FALSE; } memset(names, 0, sizeof(*names)); complete = XkbRF_GetComponents(rules,defs,names); fclose(file); XkbRF_Free(rules, TRUE); if (!complete) LogMessage(X_ERROR, "XKB: Rules returned no components\n"); return complete; }
Bool XkbDDXNamesFromRules( DeviceIntPtr keybd, char * rules_name, XkbRF_VarDefsPtr defs, XkbComponentNamesPtr names) { char buf[PATH_MAX]; FILE * file; Bool complete; XkbRF_RulesPtr rules; if (!rules_name) return False; if (XkbBaseDirectory==NULL) { if (strlen(rules_name)+7 > PATH_MAX) return False; sprintf(buf,"rules/%s",rules_name); } else { if (strlen(XkbBaseDirectory)+strlen(rules_name)+8 > PATH_MAX) return False; sprintf(buf,"%s/rules/%s",XkbBaseDirectory,rules_name); } if ((file= fopen(buf,"r"))==NULL) return False; if ((rules= XkbRF_Create(0,0))==NULL) { fclose(file); return False; } if (!XkbRF_LoadRules(file,rules)) { fclose(file); XkbRF_Free(rules,True); return False; } bzero((char *)names,sizeof(XkbComponentNamesRec)); complete= XkbRF_GetComponents(rules,defs,names); fclose(file); XkbRF_Free(rules,True); return complete; }