void test_string_hash_set() { FcitxStringHashSet* sset = fcitx_string_hashset_parse("a,b,c,d", ','); assert(fcitx_dict_size(sset) == 4); assert(fcitx_string_hashset_contains(sset, "c")); assert(!fcitx_string_hashset_contains(sset, "e")); fcitx_string_hashset_remove(sset, "c"); assert(!fcitx_string_hashset_contains(sset, "c")); fcitx_string_hashset_insert(sset, "e"); assert(fcitx_string_hashset_contains(sset, "e")); /* uthash guarantee order, so we can sure about this */ char* joined = fcitx_string_hashset_join(sset, ','); assert(strcmp(joined, "a,b,d,e") == 0); free(joined); fcitx_string_hashset_free(sset); }
FCITX_EXPORT_API void fcitx_addon_manager_set_override(FcitxAddonManager* manager, const char* enabled, const char* disabled) { fcitx_string_hashset_free(manager->enabledAddons); fcitx_string_hashset_free(manager->disabledAddons); manager->enabledAddons = enabled ? fcitx_string_hashset_parse(enabled, ',') : NULL; manager->disabledAddons = disabled ? fcitx_string_hashset_parse(disabled, ',') : NULL; manager->disabledAllAddons = manager->disabledAddons ? fcitx_string_hashset_contains(manager->disabledAddons, "all") : false; }
void struct_attribute_foreach(FcitxConfiguration* config, const char* path, void* userData) { FcitxDescription* desc = userData; if (desc->error) { return; } const char* type = fcitx_configuration_get_value_by_path(config, "Type"); if (!type) { asprintf(&desc->errorMessage, "%s misses Type.", path); desc->error = true; return; } if (!is_builtin_type(type)) { asprintf(&desc->errorMessage, "Invalide Type."); desc->error = true; return; } if (strcmp(type, "List") == 0) { const char* subType = fcitx_configuration_get_value_by_path(config, "SubType"); if (!subType) { asprintf(&desc->errorMessage, "%s misses SubType.", path); desc->error = true; return; } if (strcmp(subType, "List") == 0) { asprintf(&desc->errorMessage, "Recursive List is not allowed."); desc->error = true; return; } if (!is_builtin_type(subType) && !fcitx_string_hashset_contains(desc->structs, subType)) { asprintf(&desc->errorMessage, "Invalide SubType."); desc->error = true; return; } fcitx_string_hashset_remove(desc->topLevelStructs, subType); } }
bool _fcitx_addon_load_metadata(const char* key, size_t keyLen, void** data, void* userData) { FCITX_UNUSED(key); FCITX_UNUSED(keyLen); FcitxStandardPathFile* files = *data; size_t i = 0; while (files[i].fp) { i++; } FcitxConfiguration* config = NULL; while (i != 0) { i --; config = fcitx_ini_parse(files[i].fp, config); } FcitxAddonConfig* addonConfig = fcitx_addon_config_new(); fcitx_addon_config_load(addonConfig, config); fcitx_configuration_unref(config); do { if (addonConfig->addon.name[0] == 0 || addonConfig->addon.type[0] == 0 || addonConfig->addon.category >= FAC_Last) { fcitx_addon_config_free(addonConfig); break; } FcitxAddonManager* manager = userData; FcitxAddon* addon = NULL; if (fcitx_dict_lookup_by_str(manager->addons, addonConfig->addon.name, &addon)) { // don't touch the running addon if (addon->loaded) { fcitx_addon_config_free(addonConfig); addon = NULL; break; } else { fcitx_addon_config_free(addon->config); addon->config = addonConfig; } } else { addon = fcitx_utils_new(FcitxAddon); addon->config = addonConfig; fcitx_dict_insert_by_str(manager->addons, addon->config->addon.name, addon, false); } if (addon) { addon->dependencies = fcitx_string_hashset_parse(addon->config->addon.dependency, ','); } if (addon && (manager->disabledAllAddons || (manager->disabledAllAddons && fcitx_string_hashset_contains(manager->disabledAddons, addon->config->addon.name)))) { addon->config->addon.enabled = false; } if (addon && (manager->enabledAddons && fcitx_string_hashset_contains(manager->enabledAddons, addon->config->addon.name))) { addon->config->addon.enabled = true; } } while(0); return false; }