void MergeRules(FcitxXkbRules* rules, FcitxXkbRules* rulesextra) { utarray_concat(rules->modelInfos, rulesextra->modelInfos); utarray_concat(rules->optionGroupInfos, rulesextra->optionGroupInfos); FcitxXkbLayoutInfo* layoutInfo; UT_array toAdd; utarray_init(&toAdd, fcitx_ptr_icd); for (layoutInfo = (FcitxXkbLayoutInfo*) utarray_front(rulesextra->layoutInfos); layoutInfo != NULL; layoutInfo = (FcitxXkbLayoutInfo*) utarray_next(rulesextra->layoutInfos, layoutInfo)) { FcitxXkbLayoutInfo* l = FindByName(rules, layoutInfo->name); if (l) { utarray_concat(l->languages, layoutInfo->languages); utarray_concat(l->variantInfos, layoutInfo->variantInfos); } else utarray_push_back(&toAdd, &layoutInfo); } unsigned int i; for(i = 0;i < utarray_len(&toAdd);i++) { FcitxXkbLayoutInfo* p = *(FcitxXkbLayoutInfo**)utarray_eltptr(&toAdd, i); utarray_push_back(rules->layoutInfos, p); } utarray_done(&toAdd); FcitxXkbRulesFree(rulesextra); }
int main(int argc, char* argv[]) { FcitxXkbRules* rules = FcitxXkbReadRules(argv[1]); char* result = FcitxXkbRulesToReadableString(rules); printf("%s\n", result); assert(strcmp(correct, result) == 0); free(result); FcitxXkbRulesFree(rules); return 0; }