void test_string() { const char *test = TEST_STR; FcitxStringList* list = fcitx_utils_string_split(test, ","); assert(utarray_len(list) == 4); assert(fcitx_utils_string_list_contains(list, "a")); assert(fcitx_utils_string_list_contains(list, "b")); assert(fcitx_utils_string_list_contains(list, "c")); assert(fcitx_utils_string_list_contains(list, "d")); assert(!fcitx_utils_string_list_contains(list, "e")); char* join = fcitx_utils_string_list_join(list, ','); assert(strcmp(join, test) == 0); fcitx_utils_string_list_append_split(list, TEST_STR, "\n"); fcitx_utils_string_list_printf_append(list, "%s", TEST_STR); char *join2 = fcitx_utils_string_list_join(list, ','); assert(strcmp(join2, TEST_STR","TEST_STR","TEST_STR) == 0); char* cat = NULL; fcitx_utils_alloc_cat_str(cat, join, ",e"); assert(strcmp(cat, TEST_STR",e") == 0); fcitx_utils_set_cat_str(cat, join, ",e,", join); assert(strcmp(cat, TEST_STR",e,"TEST_STR) == 0); join = fcitx_utils_set_str(join, join2); assert(strcmp(join, join2) == 0); free(cat); free(join); free(join2); fcitx_utils_string_list_free(list); list = fcitx_utils_string_split_full("a b", " ", false); assert(utarray_len(list) == 2); fcitx_utils_string_list_free(list); char localcat[20]; const char *array[] = {"a", ",b", ",c", ",d"}; fcitx_utils_cat_str_simple(localcat, 4, array); assert(strcmp(localcat, test) == 0); char localcat2[6]; fcitx_utils_cat_str_simple_with_len(localcat2, 4, 4, array); assert(strcmp(localcat2, "a,b") == 0); fcitx_utils_cat_str_simple_with_len(localcat2, 5, 4, array); assert(strcmp(localcat2, "a,b,") == 0); fcitx_utils_cat_str_simple_with_len(localcat2, 6, 4, array); assert(strcmp(localcat2, "a,b,c") == 0); const char *orig = "\r78\"1\n\\\e\\3\f\a\v\'cc\td\b"; char *escape = fcitx_utils_set_escape_str(NULL, orig); assert(strcmp(escape, "\\r78\\\"1\\n\\\\\\e\\\\3\\f\\a\\v\\\'cc\\td\\b") == 0); char *back = fcitx_utils_set_unescape_str(NULL, escape); assert(strcmp(orig, back) == 0); fcitx_utils_unescape_str_inplace(escape); assert(strcmp(orig, escape) == 0); free(escape); free(back); char* replace_result = fcitx_utils_string_replace("abcabc", "a", "b", true); assert(strcmp(replace_result, "bbcbbc") == 0); free(replace_result); #define REPEAT 2049 char largeReplace[3 * REPEAT + 1]; char largeReplaceCorrect[REPEAT + 1]; char largeReplaceCorrect2[4 * REPEAT + 1]; int i = 0, j = 0, k = 0; for (int n = 0; n < REPEAT; n ++) { largeReplace[i++] = 'a'; largeReplace[i++] = 'b'; largeReplace[i++] = 'c'; largeReplaceCorrect[j++] = 'e'; largeReplaceCorrect2[k++] = 'a'; largeReplaceCorrect2[k++] = 'b'; largeReplaceCorrect2[k++] = 'c'; largeReplaceCorrect2[k++] = 'd'; } largeReplace[i] = '\0'; largeReplaceCorrect[j] = '\0'; largeReplaceCorrect2[k] = '\0'; replace_result = fcitx_utils_string_replace(largeReplace, "abc", "e", true); assert(strcmp(replace_result, largeReplaceCorrect) == 0); char* replace_result2 = fcitx_utils_string_replace(replace_result, "e", "abcd", true); free(replace_result); assert(strcmp(replace_result2, largeReplaceCorrect2) == 0); free(replace_result2); assert(fcitx_utils_string_replace(largeReplace, "de", "bcd", true) == NULL); }
void FcitxInstanceResolveAddonDependencyInternal(FcitxInstance* instance, FcitxAddon* startAddon) { UT_array* addons = &instance->addons; boolean remove = true; FcitxAddon *addon; FcitxAddon *uiaddon = NULL, *uifallbackaddon = NULL; boolean reloadIM = true; if (!startAddon) { startAddon = (FcitxAddon*) utarray_front(addons); reloadIM = false; } /* check "all" */ if (instance->disableList && utarray_len(instance->disableList) == 1 && fcitx_utils_string_list_contains(instance->disableList, "all")) { for (addon = startAddon; addon != NULL; addon = (FcitxAddon *) utarray_next(addons, addon)) { addon->bEnabled = false; } } /* override the enable and disable option */ for (addon = startAddon; addon != NULL; addon = (FcitxAddon *) utarray_next(addons, addon)) { if (instance->enableList && fcitx_utils_string_list_contains(instance->enableList, addon->name)) addon->bEnabled = true; else if (instance->disableList && fcitx_utils_string_list_contains(instance->disableList, addon->name)) addon->bEnabled = false; } if (!reloadIM) { /* choose ui */ for (addon = startAddon; addon != NULL; addon = (FcitxAddon *) utarray_next(addons, addon)) { if (addon->category == AC_UI) { if (instance->uiname == NULL) { if (addon->bEnabled) { uiaddon = addon; break; } } else { if (strcmp(instance->uiname, addon->name) == 0) { addon->bEnabled = true; uiaddon = addon; break; } } } } if (uiaddon && uiaddon->uifallback) { for (addon = startAddon; addon != NULL; addon = (FcitxAddon *) utarray_next(addons, addon)) { if (addon->category == AC_UI && addon->bEnabled && strcmp(uiaddon->uifallback, addon->name) == 0) { FcitxAddon temp; int uiidx = utarray_eltidx(addons, uiaddon); int fallbackidx = utarray_eltidx(addons, addon); if (fallbackidx < uiidx) { temp = *uiaddon; *uiaddon = *addon; *addon = temp; /* they swapped, addon is normal ui, and ui addon is fallback */ uifallbackaddon = uiaddon; uiaddon = addon; } else { uifallbackaddon = addon; } break; } } } for (addon = startAddon; addon != NULL; addon = (FcitxAddon *) utarray_next(addons, addon)) { if (addon->category == AC_UI && addon != uiaddon && addon != uifallbackaddon) { addon->bEnabled = false; } } } while (remove) { remove = false; for (addon = startAddon; addon != NULL; addon = (FcitxAddon *) utarray_next(addons, addon)) { if (!addon->bEnabled) continue; UT_array* dependlist = fcitx_utils_split_string(addon->depend, ','); boolean valid = true; char **depend = NULL; for (depend = (char **) utarray_front(dependlist); depend != NULL; depend = (char **) utarray_next(dependlist, depend)) { if (!FcitxAddonsIsAddonAvailable(addons, *depend)) { valid = false; break; } } utarray_free(dependlist); if (!valid) { FcitxLog(WARNING, _("Disable addon %s, dependency %s can not be satisfied."), addon->name, addon->depend); addon->bEnabled = false; } } } }