Пример #1
0
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);
    
}
Пример #2
0
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;
            }
        }
    }
}