static void hangul_keyboard_list_clear() { size_t i; for (i = 0; i < hangul_keyboards.n; ++i) { hangul_keyboard_delete(hangul_keyboards.keyboards[i]); } free(hangul_keyboards.keyboards); hangul_keyboards.n = 0; hangul_keyboards.nalloced = 0; hangul_keyboards.keyboards = NULL; }
END_TEST START_TEST(test_hangul_keyboard) { const char* id; const char* name; unsigned int n; unsigned int i; n = hangul_keyboard_list_get_count(); fail_unless(n != 0, "error: there is no hangul keyboard"); for (i = 0; i < n; ++i) { id = hangul_keyboard_list_get_keyboard_id(i); fail_unless(id != NULL, "error: keyboard id == NULL"); } for (i = 0; i < n; ++i) { name = hangul_keyboard_list_get_keyboard_name(i); fail_unless(name != NULL, "error: keyboard id == NULL"); } HangulKeyboard* keyboard; fail_unless( (keyboard = hangul_keyboard_new_from_file(TEST_SOURCE_DIR "/recursive.xml")) != NULL ); fail_unless( (id = hangul_keyboard_list_register_keyboard(keyboard)) != NULL ); fail_unless( strcmp(id, "recursive") == 0 ); fail_unless( hangul_keyboard_list_get_count() == n + 1 ); fail_unless( hangul_keyboard_list_get_keyboard(id) == keyboard ); fail_unless( hangul_keyboard_list_unregister_keyboard(id) == keyboard ); hangul_keyboard_delete(keyboard); }
static void XMLCALL on_element_start(void* data, const XML_Char* element, const XML_Char** attr) { HangulKeyboardLoadContext* context = (HangulKeyboardLoadContext*)data; if (strcmp(element, "hangul-keyboard") == 0) { if (context->keyboard != NULL) { hangul_keyboard_delete(context->keyboard); } context->keyboard = hangul_keyboard_new(); const char* id = attr_lookup(attr, "id"); hangul_keyboard_set_id(context->keyboard, id); const char* typestr = attr_lookup(attr, "type"); int type = HANGUL_KEYBOARD_TYPE_JAMO; if (strcmp(typestr, "jamo") == 0) { type = HANGUL_KEYBOARD_TYPE_JAMO; } else if (strcmp(typestr, "jamo-yet") == 0) { type = HANGUL_KEYBOARD_TYPE_JAMO_YET; } else if (strcmp(typestr, "jaso") == 0) { type = HANGUL_KEYBOARD_TYPE_JASO; } else if (strcmp(typestr, "jaso-yet") == 0) { type = HANGUL_KEYBOARD_TYPE_JASO_YET; } else if (strcmp(typestr, "romaja") == 0) { type = HANGUL_KEYBOARD_TYPE_ROMAJA; } hangul_keyboard_set_type(context->keyboard, type); } else if (strcmp(element, "name") == 0) { if (context->keyboard == NULL) return; const char* lang = attr_lookup(attr, "xml:lang"); if (lang == NULL) { context->save_name = true; } else { const char* locale = setlocale(LC_ALL, NULL); size_t n = strlen(lang); if (strncmp(lang, locale, n) == 0) { context->save_name = true; } } context->current_element = "name"; } else if (strcmp(element, "map") == 0) { if (context->keyboard == NULL) return; unsigned int id = attr_lookup_as_uint(attr, "id"); if (id < countof(context->keyboard->table)) { context->current_id = id; context->current_element = "map"; } } else if (strcmp(element, "combination") == 0) { if (context->keyboard == NULL) return; unsigned int id = attr_lookup_as_uint(attr, "id"); if (id < countof(context->keyboard->combination)) { if (context->keyboard->combination[id] != NULL) { hangul_combination_delete(context->keyboard->combination[id]); } context->current_id = id; context->current_element = "combination"; context->keyboard->combination[id] = hangul_combination_new(); } } else if (strcmp(element, "item") == 0) { if (context->keyboard == NULL) return; unsigned int id = context->current_id; if (strcmp(context->current_element, "map") == 0) { HangulKeyboard* keyboard = context->keyboard; unsigned int key = attr_lookup_as_uint(attr, "key"); unsigned int value = attr_lookup_as_uint(attr, "value"); hangul_keyboard_set_mapping(keyboard, id, key, value); } else if (strcmp(context->current_element, "combination") == 0) { HangulCombination* combination = context->keyboard->combination[id]; unsigned int first = attr_lookup_as_uint(attr, "first"); unsigned int second = attr_lookup_as_uint(attr, "second"); unsigned int result = attr_lookup_as_uint(attr, "result"); hangul_combination_add_item(combination, first, second, result); } } else if (strcmp(element, "include") == 0) { const char* file = attr_lookup(attr, "file"); if (file == NULL) return; size_t n = strlen(file) + strlen(context->path) + 1; char* path = malloc(n); if (path == NULL) return; if (file[0] == '/') { strncpy(path, file, n); } else { char* orig_path = strdup(context->path); char* dir = dirname(orig_path); snprintf(path, n, "%s/%s", dir, file); free(orig_path); } hangul_keyboard_parse_file(path, context); free(path); } }