int main () { char *u8string; int u8len; int len; char u8string2[16]; u8string = "HelloWorld"; u8len = ueStrLen(u8string); len = strlen(u8string); ok (u8len == len, "ueStrLen"); u8string = "\xE6\xB8\xAC\xE8\xA9\xA6\xE8\xA8\x88\xE7\xAE\x97\xE9\x95\xB7\xE5\xBA\xA6"; /* 測試計算長度 */ u8len = ueStrLen(u8string); ok (u8len == 6, "ueStrLen"); u8string = "\xE6\xB8\xAC\xE8\xA9\xA6\xE8\xA8\x88\xE7\xAE\x97\xE9\x95\xB7\xE5\xBA\xA6"; /* 測試計算長度 */ ueStrNCpy(u8string2, u8string, 3, STRNCPY_CLOSE); ok (!strcmp(u8string2, "\xE6\xB8\xAC\xE8\xA9\xA6\xE8\xA8\x88" /* 測試計 */ ), "ueStrNCpy"); u8string = "\xE6\xB8\xAC\xE8\xA9\xA6\xE8\xA8\x88\xE7\xAE\x97\xE9\x95\xB7\xE5\xBA\xA6"; /* 測試計算長度 */ u8string = ueStrSeek(u8string, 3); ok (!strcmp(u8string, "\xE7\xAE\x97\xE9\x95\xB7\xE5\xBA\xA6" /* 算長度 */ ), "ueStrSeek"); u8string = "\xE6\xB8\xAC\xE8\xA9\xA6\xE8\xA8\x88\xE7\xAE\x97\xE9\x95\xB7\xE5\xBA\xA6"; /* 測試計算長度 */ u8string = ueStrSeek(u8string, 0); ok (!strcmp(u8string, "\xE6\xB8\xAC\xE8\xA9\xA6\xE8\xA8\x88\xE7\xAE\x97\xE9\x95\xB7\xE5\xBA\xA6" /* 測試計算長度 */ ), "ueStrSeek"); return exit_status(); }
void test_Space_selection_word() { ChewingContext *ctx; char *buf; int len; clean_userphrase(); ctx = chewing_new(); start_testcase(ctx, fd); chewing_set_spaceAsSelection(ctx, 1); type_keystroke_by_string(ctx, "hk4g4<H>" /* 測試 */ ); type_keystroke_by_string(ctx, " "); /* open candidate window */ chewing_cand_Enumerate(ctx); buf = chewing_cand_String(ctx); len = ueStrLen(buf); ok(len == 2, "candidate `%s' length `%d' shall be `%d'", buf, len, 2); chewing_free(buf); type_keystroke_by_string(ctx, " "); /* next candidate list */ chewing_cand_Enumerate(ctx); buf = chewing_cand_String(ctx); len = ueStrLen(buf); ok(len == 1, "candidate `%s' length `%d' shall be `%d'", buf, len, 1); chewing_free(buf); type_keystroke_by_string(ctx, " "); /* next page */ ok(chewing_cand_CurrentPage(ctx) == 1, "current page shall be 1"); chewing_delete(ctx); }
void test_utf8() { char *u8string; int u8len; int len; char u8string2[16]; start_testcase(NULL, fd); u8string = "HelloWorld"; u8len = ueStrLen(u8string); len = strlen(u8string); ok(u8len == len, "ueStrLen"); u8string = "\xE6\xB8\xAC\xE8\xA9\xA6\xE8\xA8\x88\xE7\xAE\x97\xE9\x95\xB7\xE5\xBA\xA6"; /* 測試計算長度 */ u8len = ueStrLen(u8string); ok(u8len == 6, "ueStrLen"); u8string = "\xE6\xB8\xAC\xE8\xA9\xA6\xE8\xA8\x88\xE7\xAE\x97\xE9\x95\xB7\xE5\xBA\xA6"; /* 測試計算長度 */ ueStrNCpy(u8string2, u8string, 3, STRNCPY_CLOSE); ok(!strcmp(u8string2, "\xE6\xB8\xAC\xE8\xA9\xA6\xE8\xA8\x88" /* 測試計 */ ), "ueStrNCpy"); u8string = "\xE6\xB8\xAC\xE8\xA9\xA6\xE8\xA8\x88\xE7\xAE\x97\xE9\x95\xB7\xE5\xBA\xA6"; /* 測試計算長度 */ u8string = ueStrSeek(u8string, 3); ok(!strcmp(u8string, "\xE7\xAE\x97\xE9\x95\xB7\xE5\xBA\xA6" /* 算長度 */ ), "ueStrSeek"); u8string = "\xE6\xB8\xAC\xE8\xA9\xA6\xE8\xA8\x88\xE7\xAE\x97\xE9\x95\xB7\xE5\xBA\xA6"; /* 測試計算長度 */ u8string = ueStrSeek(u8string, 0); ok(!strcmp (u8string, "\xE6\xB8\xAC\xE8\xA9\xA6\xE8\xA8\x88\xE7\xAE\x97\xE9\x95\xB7\xE5\xBA\xA6" /* 測試計算長度 */ ), "ueStrSeek"); }
int main (int argc, char *argv[]) { char *u8string; int u8len; u8string = "HelloWorld"; u8len = ueStrLen(u8string); int len = strlen(u8string); ok (u8len == len, "ueStrLen"); u8string = "測試計算長度"; u8len = ueStrLen(u8string); ok (u8len == 6, "ueStrLen"); u8string = "測試計算長度"; char u8string2[16]; ueStrNCpy(u8string2, u8string, 3, STRNCPY_CLOSE); ok (!strcmp(u8string2, "測試計"), "ueStrNCpy"); u8string = "測試計算長度"; u8string = ueStrSeek(u8string, 3); ok (!strcmp(u8string, "算長度"), "ueStrSeek"); u8string = "測試計算長度"; u8string = ueStrSeek(u8string, 0); ok (!strcmp(u8string, "測試計算長度"), "ueStrSeek"); return exit_status(); }
void compare_per_run() { int i, len; char utf8buf_expect[16]; char utf8buf_commit[16]; printf( "Expected: %s", expect_string_buf ); printf( "Committed: "); tested_word_count += (len = ueStrLen( expect_string_buf ) - 1); /* omit the suffix character */ for ( i = 0; i < len; i++ ) { ueStrNCpy( utf8buf_expect, ueStrSeek( expect_string_buf, i ), 1, STRNCPY_CLOSE ); ueStrNCpy( utf8buf_commit, ueStrSeek( commit_string_buf, i ), 1, STRNCPY_CLOSE ); if ( ! strcmp( utf8buf_expect, utf8buf_commit ) ) printf( "%s", utf8buf_commit ); else { printf( "\033[44;37m%s\033[m", utf8buf_commit ); failed_word_count++; } } memset( commit_string_buf, 0, MAXLEN ); printf( "\n\n" ); }
int ChoiceEndChoice( ChewingData *pgdata ) { pgdata->bSelect = 0; pgdata->choiceInfo.nTotalChoice = 0; pgdata->choiceInfo.nPage = 0; #ifdef FAFT_CHEWING /* This is really strange */ if ( pgdata->choiceInfo.isSymbol != 1 && pgdata->choiceInfo.isSymbol != 2 ) { #else if ( pgdata->choiceInfo.isSymbol != 1 || pgdata->choiceInfo.isSymbol != 2 ) { #endif /* return to the old chiSymbolCursor position */ pgdata->chiSymbolCursor = pgdata->choiceInfo.oldChiSymbolCursor; } pgdata->choiceInfo.isSymbol = 0; return 0; } #ifndef FAFT_CHEWING static void ChangeUserData( ChewingData *pgdata, int selectNo ) { uint16 userPhoneSeq[ MAX_PHONE_SEQ_LEN ]; int len; len = ueStrLen( pgdata->choiceInfo.totalChoiceStr[ selectNo ] ); memcpy( userPhoneSeq, &( pgdata->phoneSeq[ PhoneSeqCursor( pgdata ) ] ), len * sizeof( uint16 ) ); userPhoneSeq[ len ] = 0; UserUpdatePhrase( userPhoneSeq, pgdata->choiceInfo.totalChoiceStr[ selectNo ] ); }
void test_select_candidate_rearward_start_with_symbol() { ChewingContext *ctx; int ret; char *buf; int len; clean_userphrase(); ctx = chewing_new(); start_testcase(ctx, fd); chewing_set_phraseChoiceRearward(ctx, 1); type_keystroke_by_string(ctx, "`31hk4g4" /* ,測試 */ ); type_keystroke_by_string(ctx, "<EE><H><D>"); ret = chewing_cand_TotalChoice(ctx); ok(ret > 0, "chewing_cand_TotalChoice() returns `%d' shall greater than 0 at pos `%d'", ret, 0); chewing_cand_Enumerate(ctx); buf = chewing_cand_String(ctx); len = ueStrLen(buf); ok(len == 1, "candidate `%s' length `%d' shall be `%d' at pos `%d'", buf, len, 1, 0); chewing_free(buf); type_keystroke_by_string(ctx, "<EE><H><R><D>"); ret = chewing_cand_TotalChoice(ctx); ok(ret > 0, "chewing_cand_TotalChoice() returns `%d' shall greater than 0 at pos `%d'", ret, 1); chewing_cand_Enumerate(ctx); buf = chewing_cand_String(ctx); len = ueStrLen(buf); ok(len == 1, "candidate `%s' length `%d' shall be `%d' at pos `%d'", buf, len, 1, 1); chewing_free(buf); type_keystroke_by_string(ctx, "<EE><H><R><R><D>"); ret = chewing_cand_TotalChoice(ctx); ok(ret > 0, "chewing_cand_TotalChoice() returns `%d' shall greater than 0 at pos `%d'", ret, 2); chewing_cand_Enumerate(ctx); buf = chewing_cand_String(ctx); len = ueStrLen(buf); ok(len == 2, "candidate `%s' length `%d' shall be `%d' at pos `%d'", buf, len, 2, 2); chewing_free(buf); chewing_delete(ctx); }
void internal_ok_buffer( const char *file, int line, ChewingContext *ctx, const char *expected, const BufferType *buffer ) { char *buf; int actual_ret; int expected_ret; int expected_len; assert( ctx ); assert( expected ); assert( buffer ); expected_len = ueStrLen( expected ); if ( buffer->check ) { actual_ret = buffer->check( ctx ); expected_ret = !!expected_len; internal_ok( file, line, actual_ret == expected_ret, "actual_ret == expected_ret", "%s check function returned `%d' shall be `%d'", buffer->name, actual_ret, expected_ret ); } if ( buffer->check_alt ) { actual_ret = buffer->check_alt( ctx ); expected_ret = !expected_len; internal_ok( file, line, actual_ret == expected_ret, "actual_ret == expected_ret", "%s check function returned `%d' shall be `%d'", buffer->name, actual_ret, expected_ret ); } if ( buffer->get_length ) { actual_ret = buffer->get_length( ctx ); expected_ret = expected_len; internal_ok( file, line, actual_ret == expected_ret, "actual_ret == expected_ret", "%s get length function returned `%d' shall be `%d'", buffer->name, actual_ret, expected_ret ); } if ( buffer->get_string ) { buf = buffer->get_string( ctx ); internal_ok( file, line, !strcmp( buf, expected ), "!strcmp( buf, expected )", "%s string function returned `%s' shall be `%s'", buffer->name, buf, expected ); chewing_free( buf ); } if ( buffer->get_string_alt ) { buf = buffer->get_string_alt( ctx, &actual_ret ); expected_ret = expected_len; internal_ok( file, line, actual_ret == expected_ret, "actual_ret == expected_ret", "%s string function returned parameter `%d' shall be `%d'", buffer->name, actual_ret, expected_ret ); internal_ok( file, line, !strcmp( buf, expected ), "!strcmp( buf, expected )", "%s string function returned `%s' shall be `%s'", buffer->name, buf, expected ); chewing_free( buf ); } }
static void ChangeUserData(ChewingData *pgdata, int selectNo) { uint16_t userPhoneSeq[MAX_PHONE_SEQ_LEN]; int len; len = ueStrLen(pgdata->choiceInfo.totalChoiceStr[selectNo]); memcpy(userPhoneSeq, &(pgdata->phoneSeq[PhoneSeqCursor(pgdata)]), len * sizeof(uint16_t)); userPhoneSeq[len] = 0; UserUpdatePhrase(pgdata, userPhoneSeq, pgdata->choiceInfo.totalChoiceStr[selectNo]); }
void internal_ok_candidate_len(const char *file, int line, ChewingContext *ctx, size_t expected_len) { const char *buf; size_t actual_len; assert(ctx); buf = chewing_cand_string_by_index_static(ctx, 0); actual_len = ueStrLen(buf); internal_ok(file, line, actual_len == expected_len, __func__, "candidate length `%d' shall be `%d'", actual_len, expected_len); }
int UserUpdatePhrase( ChewingData *pgdata, const uint16_t phoneSeq[], const char wordSeq[] ) { HASH_ITEM *pItem; UserPhraseData data; int len; len = ueStrLen( wordSeq ); pItem = HashFindEntry( pgdata, phoneSeq, wordSeq ); if ( ! pItem ) { if ( ! AlcUserPhraseSeq( &data, len, strlen( wordSeq ) ) ) { return USER_UPDATE_FAIL; } memcpy( data.phoneSeq, phoneSeq, len * sizeof( phoneSeq[ 0 ] ) ); data.phoneSeq[ len ] = 0; strcpy( data.wordSeq, wordSeq ); /* load initial freq */ data.origfreq = LoadOriginalFreq( pgdata, phoneSeq, wordSeq, len ); data.maxfreq = LoadMaxFreq( pgdata, phoneSeq, len ); data.userfreq = data.origfreq; data.recentTime = pgdata->static_data.chewing_lifetime; pItem = HashInsert( pgdata, &data ); LogUserPhrase( pgdata, phoneSeq, wordSeq, pItem->data.origfreq, pItem->data.maxfreq, pItem->data.userfreq, pItem->data.recentTime ); HashModify( pgdata, pItem ); return USER_UPDATE_INSERT; } else { pItem->data.maxfreq = LoadMaxFreq( pgdata, phoneSeq, len ); pItem->data.userfreq = UpdateFreq( pItem->data.userfreq, pItem->data.maxfreq, pItem->data.origfreq, pgdata->static_data.chewing_lifetime - pItem->data.recentTime ); pItem->data.recentTime = pgdata->static_data.chewing_lifetime; LogUserPhrase( pgdata, phoneSeq, wordSeq, pItem->data.origfreq, pItem->data.maxfreq, pItem->data.userfreq, pItem->data.recentTime ); HashModify( pgdata, pItem ); return USER_UPDATE_MODIFY; } }
int UserUpdatePhrase(ChewingData *pgdata, const uint16_t phoneSeq[], const char wordSeq[]) { int ret; int action; int phone_len; int word_len; int orig_freq; int max_freq; int user_freq; int recent_time; int orig_time; assert(pgdata); assert(phoneSeq); assert(wordSeq); phone_len = GetPhoneLen(phoneSeq); word_len = ueStrLen(wordSeq); if (phone_len != word_len) { LOG_WARN("Do not update userphrase because phoneSeq length %d != wordSeq length %d", phone_len, word_len); return USER_UPDATE_FAIL; } if (word_len > MAX_PHRASE_LEN) { LOG_WARN("wordSeq length %d > MAX_PHRASE_LEN (%d)", word_len, MAX_PHRASE_LEN); return USER_UPDATE_FAIL; } ret = UserBindPhone(pgdata, STMT_USERPHRASE_SELECT_BY_PHONE_PHRASE, phoneSeq, phone_len); if (ret != SQLITE_OK) { LOG_ERROR("UserBindPhone returns %d", ret); action = USER_UPDATE_FAIL; goto end; } ret = sqlite3_bind_text(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE_PHRASE], BIND_USERPHRASE_PHRASE, wordSeq, -1, SQLITE_STATIC); if (ret != SQLITE_OK) { LOG_ERROR("sqlite3_bind_text returns %d", ret); action = USER_UPDATE_FAIL; goto end; } recent_time = GetCurrentLifeTime(pgdata); ret = sqlite3_step(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE_PHRASE]); if (ret == SQLITE_ROW) { action = USER_UPDATE_MODIFY; orig_freq = sqlite3_column_int(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE_PHRASE], SQL_STMT_USERPHRASE[STMT_USERPHRASE_SELECT_BY_PHONE_PHRASE].column [COLUMN_USERPHRASE_ORIG_FREQ]); max_freq = LoadMaxFreq(pgdata, phoneSeq, phone_len); user_freq = sqlite3_column_int(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE_PHRASE], SQL_STMT_USERPHRASE[STMT_USERPHRASE_SELECT_BY_PHONE_PHRASE].column [COLUMN_USERPHRASE_USER_FREQ]); orig_time = sqlite3_column_int(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE_PHRASE], SQL_STMT_USERPHRASE[STMT_USERPHRASE_SELECT_BY_PHONE_PHRASE].column [COLUMN_USERPHRASE_TIME]); user_freq = UpdateFreq(user_freq, max_freq, orig_freq, recent_time - orig_time); } else { action = USER_UPDATE_INSERT; orig_freq = LoadOriginalFreq(pgdata, phoneSeq, wordSeq, word_len); max_freq = LoadMaxFreq(pgdata, phoneSeq, phone_len); user_freq = orig_freq; } assert(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_UPSERT]); ret = sqlite3_bind_int(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_UPSERT], BIND_USERPHRASE_TIME, recent_time); if (ret != SQLITE_OK) { LOG_ERROR("sqlite3_bind_int returns %d", ret); action = USER_UPDATE_FAIL; goto end; } ret = sqlite3_bind_int(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_UPSERT], BIND_USERPHRASE_USER_FREQ, user_freq); if (ret != SQLITE_OK) { LOG_ERROR("sqlite3_bind_int returns %d", ret); action = USER_UPDATE_FAIL; goto end; } ret = sqlite3_bind_int(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_UPSERT], BIND_USERPHRASE_MAX_FREQ, max_freq); if (ret != SQLITE_OK) { LOG_ERROR("sqlite3_bind_int returns %d", ret); action = USER_UPDATE_FAIL; goto end; } ret = sqlite3_bind_int(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_UPSERT], BIND_USERPHRASE_ORIG_FREQ, orig_freq); if (ret != SQLITE_OK) { LOG_ERROR("sqlite3_bind_int returns %d", ret); action = USER_UPDATE_FAIL; goto end; } ret = UserBindPhone(pgdata, STMT_USERPHRASE_UPSERT, phoneSeq, phone_len); if (ret != SQLITE_OK) { LOG_ERROR("UserBindPhone returns %d", ret); action = USER_UPDATE_FAIL; goto end; } ret = sqlite3_bind_text(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_UPSERT], BIND_USERPHRASE_PHRASE, wordSeq, -1, SQLITE_STATIC); if (ret != SQLITE_OK) { LOG_ERROR("sqlite3_bind_text returns %d", ret); action = USER_UPDATE_FAIL; goto end; } ret = sqlite3_step(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_UPSERT]); if (ret != SQLITE_DONE) { LOG_ERROR("sqlite3_step returns %d", ret); action = USER_UPDATE_FAIL; goto end; } LogUserPhrase(pgdata, phoneSeq, wordSeq, orig_freq, max_freq, user_freq, recent_time); end: ret = sqlite3_reset(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_UPSERT]); if (ret != SQLITE_OK) { LOG_ERROR("sqlite3_reset returns %d", ret); } ret = sqlite3_reset(pgdata->static_data.stmt_userphrase[STMT_USERPHRASE_SELECT_BY_PHONE_PHRASE]); if (ret != SQLITE_OK) { LOG_ERROR("sqlite3_reset returns %d", ret); } return action; }