void test_Tab_connect_word() { ChewingContext *ctx; IntervalType it; ctx = chewing_new(); start_testcase(ctx, fd); chewing_set_maxChiSymbolLen(ctx, 16); type_keystroke_by_string(ctx, "u -4<L>"); chewing_interval_Enumerate(ctx); ok(chewing_interval_hasNext(ctx) == 1, "shall have next interval"); chewing_interval_Get(ctx, &it); ok(it.from == 0 && it.to == 1, "interval (%d, %d) shall be (0, 1)", it.from, it.to); ok(chewing_interval_hasNext(ctx) == 1, "shall have next interval"); chewing_interval_Get(ctx, &it); ok(it.from == 1 && it.to == 2, "interval (%d, %d) shall be (1, 2)", it.from, it.to); ok(chewing_interval_hasNext(ctx) == 0, "shall not have next interval"); /* connect 一 and 二 */ type_keystroke_by_string(ctx, "<T>"); chewing_interval_Enumerate(ctx); ok(chewing_interval_hasNext(ctx) == 1, "shall have next interval"); chewing_interval_Get(ctx, &it); ok(it.from == 0 && it.to == 2, "interval (%d, %d) shall be (0, 2)", it.from, it.to); ok(chewing_interval_hasNext(ctx) == 0, "shall not have next interval"); chewing_delete(ctx); }
void test_interval() { ChewingContext *ctx; IntervalType it; ctx = chewing_new(); start_testcase(ctx, fd); type_keystroke_by_string(ctx, "`31hk4g4`31hk4g4`31" /* ,測試,測試, */ ); ok_preedit_buffer(ctx, "\xEF\xBC\x8C\xE6\xB8\xAC\xE8\xA9\xA6\xEF\xBC\x8C\xE6\xB8\xAC\xE8\xA9\xA6\xEF\xBC\x8C" /* ,測試,測試, */ ); chewing_interval_Enumerate(ctx); ok(chewing_interval_hasNext(ctx) == 1, "shall have next interval"); chewing_interval_Get(ctx, &it); ok(it.from == 1 && it.to == 3, "interval (%d, %d) shall be (1, 3)", it.from, it.to); ok(chewing_interval_hasNext(ctx) == 1, "shall have next interval"); chewing_interval_Get(ctx, &it); ok(it.from == 4 && it.to == 6, "interval (%d, %d) shall be (4, 6)", it.from, it.to); ok(chewing_interval_hasNext(ctx) == 0, "shall not have next interval"); chewing_delete(ctx); }
// Return the length of interval array int Chewing::IntervalLen() { int i; chewing_interval_Enumerate(ctx); for (i = 0; chewing_interval_hasNext(ctx); i++) chewing_interval_Get(ctx, NULL); return i*2; }
IBusText *decorate_pre_edit(IBusChewingPreEdit * icPreEdit, IBusCapabilite capabilite) { gchar *preEdit = ibus_chewing_pre_edit_get_pre_edit(icPreEdit); IBusText *iText = g_object_ref_sink(ibus_text_new_from_string(preEdit)); gint chiSymbolCursor = chewing_cursor_Current(icPreEdit->context); IBUS_CHEWING_LOG(DEBUG, "decorate_pre_edit() cursor=%d preEdit=%s", chiSymbolCursor, preEdit); gint charLen = (gint) g_utf8_strlen(preEdit, -1); gint cursorRight = chiSymbolCursor + icPreEdit->bpmfLen; IBUS_CHEWING_LOG(DEBUG, "decorate_pre_edit() charLen=%d cursorRight=%d", charLen, cursorRight); IntervalType it; chewing_interval_Enumerate(icPreEdit->context); /* Add double lines on chewing interval that contains cursor */ /* Add single line on other chewing interval */ while (chewing_interval_hasNext(icPreEdit->context)) { chewing_interval_Get(icPreEdit->context, &it); if (it.from <= chiSymbolCursor && chiSymbolCursor <= it.to) { ibus_text_append_attribute(iText, IBUS_ATTR_TYPE_UNDERLINE, IBUS_ATTR_UNDERLINE_DOUBLE, it.from, it.to + 1); } else { ibus_text_append_attribute(iText, IBUS_ATTR_TYPE_UNDERLINE, IBUS_ATTR_UNDERLINE_SINGLE, it.from, it.to + 1); } } if (!mkdg_has_flag(capabilite, IBUS_CAP_SURROUNDING_TEXT) || !mkdg_has_flag(capabilite, IBUS_CAP_AUXILIARY_TEXT)) { /* Cannot change color when if the client is not capable * of showing surrounding text or auxiliary text */ return iText; } /* Show current cursor in red */ ibus_text_append_attribute(iText, IBUS_ATTR_TYPE_BACKGROUND, 0x00ff0000, chiSymbolCursor, chiSymbolCursor + 1); return iText; }
CHEWING_API void chewing_interval_Get( ChewingContext *ctx, IntervalType *it ) { if ( chewing_interval_hasNext( ctx ) ) { if ( it ) { it->from = ctx->output->dispInterval[ ctx->it_no ].from; it->to = ctx->output->dispInterval[ ctx->it_no ].to; } ctx->it_no++; } }
void test_Tab_at_the_end() { ChewingContext *ctx; IntervalType it; ctx = chewing_new(); chewing_set_maxChiSymbolLen( ctx, 16 ); type_keystroke_by_string( ctx, "hk4<T>g4" ); chewing_interval_Enumerate( ctx ); ok( chewing_interval_hasNext( ctx ) == 1, "shall have next interval" ); chewing_interval_Get( ctx, &it ); ok( it.from == 0 && it.to == 2, "interval (%d, %d) shall be (0, 2)", it.from, it.to ); ok( chewing_interval_hasNext( ctx ) == 0, "shall not have next interval" ); chewing_delete( ctx ); }
// Return interval array // caller must free return value unsigned char* Chewing::IntervalArray() { unsigned char* interval = (unsigned char*)calloc( IntervalLen(), sizeof( unsigned char ) ); IntervalType it; chewing_interval_Enumerate(ctx); for( int i = 0; chewing_interval_hasNext(ctx); ++i ) { chewing_interval_Get(ctx, &it); interval[i * 2] = it.from; interval[i * 2 + 1] = it.to; } return interval; }
void test_Tab_insert_breakpoint_between_word() { ChewingContext *ctx; IntervalType it; ctx = chewing_new(); chewing_set_maxChiSymbolLen( ctx, 16 ); type_keystroke_by_string( ctx, "hk4g4<L>" ); chewing_interval_Enumerate( ctx ); ok( chewing_interval_hasNext( ctx ) == 1, "shall have next interval" ); chewing_interval_Get( ctx, &it ); ok( it.from == 0 && it.to == 2, "interval (%d, %d) shall be (0, 2)", it.from, it.to ); ok( chewing_interval_hasNext( ctx ) == 0, "shall not have next interval" ); /* inserts a breakpoint between 測 and 試 */ type_keystroke_by_string( ctx, "<T>" ); chewing_interval_Enumerate( ctx ); ok( chewing_interval_hasNext( ctx ) == 1, "shall have next interval" ); chewing_interval_Get( ctx, &it ); ok( it.from == 0 && it.to == 1, "interval (%d, %d) shall be (0, 1)", it.from, it.to ); ok( chewing_interval_hasNext( ctx ) == 1, "shall have next interval" ); chewing_interval_Get( ctx, &it ); ok( it.from == 1 && it.to == 2, "interval (%d, %d) shall be (1, 2)", it.from, it.to ); ok( chewing_interval_hasNext( ctx ) == 0, "shall not have next interval" ); chewing_delete( ctx ); }
void show_interval_buffer( int x, int y, ChewingContext *ctx ) { char *buf; char *p; int buf_len; char out_buf[ 100 ]; int i, count; int arrPos[ 50 ]; IntervalType it; move( x, y ); addstr( FILL_BLANK ); move( x, y ); /* Check if buffer is available. */ if ( ! chewing_buffer_Check( ctx ) ) { return; } buf = chewing_buffer_String( ctx ); buf_len = chewing_buffer_Len( ctx ); p = buf; count = 0; for ( i = 0 ;i < buf_len; i++ ) { arrPos[ i ] = count; count += ueBytesFromChar(*p) <= 1 ? 1 : 2; p += ueBytesFromChar(*p); } arrPos[ i ] = count; memset( out_buf, ' ', count * ( sizeof( char ) ) ); out_buf[ count ] = '\0'; chewing_interval_Enumerate( ctx ); while ( chewing_interval_hasNext( ctx ) ) { chewing_interval_Get( ctx, &it ); out_buf[ arrPos[ it.from ] ] = '['; out_buf[ arrPos[ it.to ] - 1 ] = ']'; memset( &out_buf[ arrPos[ it.from ] + 1 ], '-', arrPos[ it.to ] - arrPos[ it.from ] - 2 ); } addstr( out_buf ); }
CHEWING_API void chewing_interval_Get(ChewingContext *ctx, IntervalType * it) { ChewingData *pgdata; if (!ctx) { return; } pgdata = ctx->data; LOG_API(""); if (chewing_interval_hasNext(ctx)) { if (it) { it->from = ctx->output->dispInterval[ctx->it_no].from; it->to = ctx->output->dispInterval[ctx->it_no].to; } ctx->it_no++; } }
void test_longest_phrase() { ChewingContext *ctx; IntervalType it; ctx = chewing_new(); start_testcase(ctx, fd); type_keystroke_by_string(ctx, "rup ji up6ji 1j4bj6y4ru32k7e.3ji " /* ㄐㄧㄣ ㄨㄛ ㄧㄣˊ ㄨㄛ ㄅㄨˋ ㄖㄨˊ ㄗˋ ㄐㄧˇ ㄉㄜ˙ ㄍㄡˇ ㄨㄛ */ ); ok_preedit_buffer(ctx, "\xE9\x87\x91\xE7\xAA\xA9\xE9\x8A\x80\xE7\xAA\xA9\xE4\xB8\x8D\xE5\xA6\x82\xE8\x87\xAA\xE5\xB7\xB1\xE7\x9A\x84\xE7\x8B\x97\xE7\xAA\xA9" /* 金窩銀窩不如自己的狗窩 */ ); chewing_interval_Enumerate(ctx); ok(chewing_interval_hasNext(ctx) == 1, "shall have next interval"); chewing_interval_Get(ctx, &it); ok(it.from == 0 && it.to == 11, "interval (%d, %d) shall be (0, 11)", it.from, it.to); chewing_delete(ctx); }
int faft_context_interval_has_next(FAFTContext *ctx) { return chewing_interval_hasNext(ctx); }
void test_null() { int ret; char *buf; const char *const_buf; int *key; unsigned short *phone; start_testcase(NULL, fd); chewing_Reset(NULL); // shall not crash ret = chewing_set_KBType(NULL, 0); ok(ret == -1, "chewing_set_KBType() returns `%d' shall be `%d'", ret, -1); ret = chewing_get_KBType(NULL); ok(ret == -1, "chewing_get_KBType() returns `%d' shall be `%d'", ret, -1); buf = chewing_get_KBString(NULL); ok(strcmp(buf, "") == 0, "chewing_get_KBString() returns `%s' shall be `%s'", buf, ""); chewing_free(buf); chewing_delete(NULL); // shall not crash chewing_free(NULL); // shall not crash chewing_set_candPerPage(NULL, 0); // shall not crash ret = chewing_get_candPerPage(NULL); ok(ret == -1, "chewing_get_candPerPage() returns `%d' shall be `%d'", ret, -1); chewing_set_maxChiSymbolLen(NULL, 0); // shall not crash ret = chewing_get_maxChiSymbolLen(NULL); ok(ret == -1, "chewing_get_maxChiSymbolLen() returns `%d' shall be `%d'", ret, -1); chewing_set_selKey(NULL, NULL, 0); // shall not crash key = chewing_get_selKey(NULL); ok(key == NULL, "chewing_get_selKey() returns NULL"); chewing_free(key); chewing_set_addPhraseDirection(NULL, 0); // shall not crash ret = chewing_get_addPhraseDirection(NULL); ok(ret == -1, "chewing_get_addPhraseDirection() returns `%d' shall be `%d'", ret, -1); chewing_set_spaceAsSelection(NULL, 0); // shall not crash ret = chewing_get_spaceAsSelection(NULL); ok(ret == -1, "chewing_get_spaceAsSelection() returns `%d' shall be `%d'", ret, -1); chewing_set_escCleanAllBuf(NULL, 0); // shall not crash ret = chewing_get_escCleanAllBuf(NULL); ok(ret == -1, "chewing_get_escCleanAllBuf() returns `%d' shall be `%d'", ret, -1); chewing_set_autoShiftCur(NULL, 0); // shall not crash ret = chewing_get_autoShiftCur(NULL); ok(ret == -1, "chewing_get_autoShiftCur() returns `%d' shall be `%d'", ret, -1); chewing_set_easySymbolInput(NULL, 0); // shall not crash ret = chewing_get_easySymbolInput(NULL); ok(ret == -1, "chewing_get_easySymbolInput() returns `%d' shall be `%d'", ret, -1); chewing_set_phraseChoiceRearward(NULL, 0); ret = chewing_get_phraseChoiceRearward(NULL); ok(ret == -1, "chewing_get_phraseChoiceRearward() returns `%d' shall be `%d'", ret, -1); chewing_set_ChiEngMode(NULL, 0); // shall not crash ret = chewing_get_ChiEngMode(NULL); ok(ret == -1, "chewing_get_ChiEngMode() returns `%d' shall be `%d'", ret, -1); chewing_set_ShapeMode(NULL, 0); // shall not crash ret = chewing_handle_Space(NULL); ok(ret == -1, "chewing_handle_Space() returns `%d' shall be `%d'", ret, -1); ret = chewing_handle_Esc(NULL); ok(ret == -1, "chewing_handle_Esc() returns `%d' shall be `%d'", ret, -1); ret = chewing_handle_Enter(NULL); ok(ret == -1, "chewing_handle_Enter() returns `%d' shall be `%d'", ret, -1); ret = chewing_handle_Del(NULL); ok(ret == -1, "chewing_handle_Del() returns `%d' shall be `%d'", ret, -1); ret = chewing_handle_Backspace(NULL); ok(ret == -1, "chewing_handle_Backspace() returns `%d' shall be `%d'", ret, -1); ret = chewing_handle_Up(NULL); ok(ret == -1, "chewing_handle_Up() returns `%d' shall be `%d'", ret, -1); ret = chewing_handle_Down(NULL); ok(ret == -1, "chewing_handle_Down() returns `%d' shall be `%d'", ret, -1); ret = chewing_handle_ShiftLeft(NULL); ok(ret == -1, "chewing_handle_ShiftLeft() returns `%d' shall be `%d'", ret, -1); ret = chewing_handle_Left(NULL); ok(ret == -1, "chewing_handle_Left() returns `%d' shall be `%d'", ret, -1); ret = chewing_handle_ShiftRight(NULL); ok(ret == -1, "chewing_handle_ShiftRight() returns `%d' shall be `%d'", ret, -1); ret = chewing_handle_Right(NULL); ok(ret == -1, "chewing_handle_Right() returns `%d' shall be `%d'", ret, -1); ret = chewing_handle_Tab(NULL); ok(ret == -1, "chewing_handle_Tab() returns `%d' shall be `%d'", ret, -1); ret = chewing_handle_DblTab(NULL); ok(ret == -1, "chewing_handle_DblTab() returns `%d' shall be `%d'", ret, -1); ret = chewing_handle_Capslock(NULL); ok(ret == -1, "chewing_handle_Capslock() returns `%d' shall be `%d'", ret, -1); ret = chewing_handle_Home(NULL); ok(ret == -1, "chewing_handle_Home() returns `%d' shall be `%d'", ret, -1); ret = chewing_handle_PageUp(NULL); ok(ret == -1, "chewing_handle_PageUp() returns `%d' shall be `%d'", ret, -1); ret = chewing_handle_PageDown(NULL); ok(ret == -1, "chewing_handle_PageDown() returns `%d' shall be `%d'", ret, -1); ret = chewing_handle_Default(NULL, 0); ok(ret == -1, "chewing_handle_Default() returns `%d' shall be `%d'", ret, -1); ret = chewing_handle_CtrlNum(NULL, 0); ok(ret == -1, "chewing_handle_CtrlNum() returns `%d' shall be `%d'", ret, -1); ret = chewing_handle_ShiftSpace(NULL); ok(ret == -1, "chewing_handle_ShiftSpace() returns `%d' shall be `%d'", ret, -1); ret = chewing_handle_Numlock(NULL, 0); ok(ret == -1, "chewing_handle_Numlock() returns `%d' shall be `%d'", ret, -1); phone = chewing_get_phoneSeq(NULL); ok(phone == NULL, "chewing_get_phoneSeq() returns NULL"); chewing_free(phone); ret = chewing_get_phoneSeqLen(NULL); ok(ret == -1, "chewing_get_phoneSeqLen() returns `%d' shall be `%d'", ret, -1); chewing_set_logger(NULL, NULL, NULL); ret = chewing_userphrase_enumerate(NULL); ok(ret == -1, "chewing_userphrase_enumerate() returns `%d' shall be `%d'", ret, -1); ret = chewing_userphrase_has_next(NULL, NULL, NULL); ok(ret == 0, "chewing_userphrase_has_next() returns `%d' shall be `%d'", ret, 0); ret = chewing_userphrase_get(NULL, NULL, 0, NULL, 0); ok(ret == -1, "chewing_userphrase_get() returns `%d' shall be `%d'", ret, -1); ret = chewing_userphrase_add(NULL, NULL, NULL); ok(ret == -1, "chewing_userphrase_add() returns `%d' shall be `%d'", ret, -1); ret = chewing_userphrase_remove(NULL, NULL, NULL); ok(ret == -1, "chewing_userphrase_remove() returns `%d' shall be `%d'", ret, -1); ret = chewing_userphrase_lookup(NULL, NULL, NULL); ok(ret == 0, "chewing_userphrase_lookup() returns `%d' shall be `%d'", ret, 0); ret = chewing_cand_open(NULL); ok(ret == -1, "chewing_cand_open() returns `%d' shall be `%d'", ret, -1); ret = chewing_cand_close(NULL); ok(ret == -1, "chewing_cand_open() returns `%d' shall be `%d'", ret, -1); ret = chewing_cand_choose_by_index(NULL, 0); ok(ret == -1, "chewing_cand_choose_by_index() returns `%d' shall be `%d'", ret, -1); ret = chewing_cand_list_first(NULL); ok(ret == -1, "chewing_cand_list_first() returns `%d' shall be `%d'", ret, -1); ret = chewing_cand_list_last(NULL); ok(ret == -1, "chewing_cand_list_last() returns `%d' shall be `%d'", ret, -1); ret = chewing_cand_list_has_next(NULL); ok(ret == 0, "chewing_cand_list_has_next() returns `%d' shall be `%d'", ret, 0); ret = chewing_cand_list_has_prev(NULL); ok(ret == 0, "chewing_cand_list_has_prev() returns `%d' shall be `%d'", ret, 0); ret = chewing_cand_list_next(NULL); ok(ret == -1, "chewing_cand_list_next() returns `%d' shall be `%d'", ret, -1); ret = chewing_cand_list_prev(NULL); ok(ret == -1, "chewing_cand_list_prev() returns `%d' shall be `%d'", ret, -1); ret = chewing_commit_preedit_buf(NULL); ok(ret == -1, "chewing_commit_preedit_buf() returns `%d' shall be `%d'", ret, -1); ret = chewing_clean_preedit_buf(NULL); ok(ret == -1, "chewing_clean_preedit_buf() returns `%d' shall be `%d'", ret, -1); ret = chewing_clean_bopomofo_buf(NULL); ok(ret == -1, "chewing_clean_bopomofo_buf() returns `%d' shall be `%d'", ret, -1); ret = chewing_commit_Check(NULL); ok(ret == -1, "chewing_commit_Check() returns `%d' shall be `%d'", ret, -1); buf = chewing_commit_String(NULL); ok(strcmp(buf, "") == 0, "chewing_commit_String() returns `%s' shall be `%s'", buf, ""); chewing_free(buf); const_buf = chewing_commit_String_static(NULL); ok(strcmp(const_buf, "") == 0, "chewing_commit_String() returns `%s' shall be `%s'", const_buf, ""); ret = chewing_buffer_Check(NULL); ok(ret == -1, "chewing_buffer_Check() returns `%d' shall be `%d'", ret, -1); ret = chewing_buffer_Len(NULL); ok(ret == -1, "chewing_buffer_Len() returns `%d' shall be `%d'", ret, -1); buf = chewing_buffer_String(NULL); ok(strcmp(buf, "") == 0, "chewing_buffer_String() returns `%s' shall be `%s'", buf, ""); chewing_free(buf); const_buf = chewing_buffer_String_static(NULL); ok(strcmp(const_buf, "") == 0, "chewing_buffer_String_static() returns `%s' shall be `%s'", const_buf, ""); const_buf = chewing_bopomofo_String_static(NULL); ok(strcmp(const_buf, "") == 0, "chewing_bopomofo_String_static() returns `%s' shall be `%s'", const_buf, ""); BEGIN_IGNORE_DEPRECATIONS buf = chewing_zuin_String(NULL, NULL); END_IGNORE_DEPRECATIONS ok(strcmp(buf, "") == 0, "chewing_zuin_String() returns `%s' shall be `%s'", buf, ""); chewing_free(buf); ret = chewing_bopomofo_Check(NULL); ok(ret == -1, "chewing_bopomofo_Check() returns `%d' shall be `%d'", ret, -1); BEGIN_IGNORE_DEPRECATIONS chewing_zuin_Check(NULL); // shall not crash END_IGNORE_DEPRECATIONS ret = chewing_cursor_Current(NULL); ok(ret == -1, "chewing_cursor_Current() returns `%d' shall be `%d'", ret, -1); ret = chewing_cand_CheckDone(NULL); ok(ret == -1, "chewing_cand_CheckDone() returns `%d' shall be `%d'", ret, -1); ret = chewing_cand_TotalPage(NULL); ok(ret == -1, "chewing_cand_TotalPage() returns `%d' shall be `%d'", ret, -1); ret = chewing_cand_ChoicePerPage(NULL); ok(ret == -1, "chewing_cand_ChoicePerPage() returns `%d' shall be `%d'", ret, -1); ret = chewing_cand_TotalChoice(NULL); ok(ret == -1, "chewing_cand_TotalChoice() returns `%d' shall be `%d'", ret, -1); ret = chewing_cand_CurrentPage(NULL); ok(ret == -1, "chewing_cand_CurrentPage() returns `%d' shall be `%d'", ret, -1); chewing_cand_Enumerate(NULL); // shall not crash ret = chewing_cand_hasNext(NULL); ok(ret == -1, "chewing_cand_hasNext() returns `%d' shall be `%d'", ret, -1); const_buf = chewing_cand_String_static(NULL); ok(strcmp(const_buf, "") == 0, "chewing_cand_String_static() returns `%s' shall be `%s'", const_buf, ""); buf = chewing_cand_String(NULL); ok(strcmp(buf, "") == 0, "chewing_cand_String() returns `%s' shall be `%s'", buf, ""); chewing_free(buf); chewing_interval_Enumerate(NULL); // shall not crash ret = chewing_interval_hasNext(NULL); ok(ret == -1, "chewing_interval_hasNext() returns `%d' shall be `%d'", ret, -1); chewing_interval_Get(NULL, NULL); // shall not crash ret = chewing_aux_Check(NULL); ok(ret == -1, "chewing_aux_Check() returns `%d' shall be `%d'", ret, -1); ret = chewing_aux_Length(NULL); ok(ret == -1, "chewing_aux_Length() returns `%d' shall be `%d'", ret, -1); const_buf = chewing_aux_String_static(NULL); ok(strcmp(const_buf, "") == 0, "chewing_aux_String_static() returns `%s' shall be `%s'", const_buf, ""); buf = chewing_aux_String(NULL); ok(strcmp(buf, "") == 0, "chewing_aux_String() returns `%s' shall be `%s'", buf, ""); chewing_free(buf); ret = chewing_keystroke_CheckIgnore(NULL); ok(ret == -1, "chewing_keystroke_CheckIgnore() returns `%d' shall be `%d'", ret, -1); ret = chewing_keystroke_CheckAbsorb(NULL); ok(ret == -1, "chewing_keystroke_CheckAbsorb() returns `%d' shall be `%d'", ret, -1); chewing_kbtype_Enumerate(NULL); // shall not crash ret = chewing_kbtype_hasNext(NULL); ok(ret == -1, "chewing_kbtype_hasNext() returns `%d' shall be `%d'", ret, -1); const_buf = chewing_kbtype_String_static(NULL); ok(strcmp(const_buf, "") == 0, "chewing_kbtype_String_static() returns `%s' shall be `%s'", const_buf, ""); buf = chewing_kbtype_String(NULL); ok(strcmp(buf, "") == 0, "chewing_kbtype_String() returns `%s' shall be `%s'", buf, ""); chewing_free(buf); }