/* *根据字串判断词库中是否有某个字/词,注意该函数会忽略拼音词组 */ RECORD *TableFindPhrase(const TableDict* tableDict, const char *strHZ) { RECORD *recTemp; char strTemp[UTF8_MAX_LENGTH + 1]; int i; //首先,先查找第一个汉字的编码 strncpy(strTemp, strHZ, fcitx_utf8_char_len(strHZ)); strTemp[fcitx_utf8_char_len(strHZ)] = '\0'; recTemp = tableDict->tableSingleHZ[CalHZIndex(strTemp)]; if (!recTemp) return (RECORD *) NULL; //然后根据该编码找到检索的起始点 i = 0; while (recTemp->strCode[0] != tableDict->recordIndex[i].cCode) i++; recTemp = tableDict->recordIndex[i].record; while (recTemp != tableDict->recordHead) { if (recTemp->strCode[0] != tableDict->recordIndex[i].cCode) break; if (!strcmp(recTemp->strHZ, strHZ)) { if (recTemp->type != RECORDTYPE_PINYIN) return recTemp; } recTemp = recTemp->next; } return (RECORD *) NULL; }
SkinImage* LoadImageWithText(FcitxClassicUI* classicui, FcitxSkin* sc, const char* name, const char* text, int w, int h, boolean active) { if (!text || *text == '\0') return NULL; UnloadSingleImage(sc, name); int len = fcitx_utf8_char_len(text); if (len == 1 && text[len] && fcitx_utf8_char_len(text + len) == 1) len = 2; char* iconText = strndup(text, len); FcitxLog(DEBUG, "%s", iconText); cairo_surface_t* newsurface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, w, h); cairo_t* c = cairo_create(newsurface); int min = w > h? h: w; min = min * 0.7; cairo_set_operator(c, CAIRO_OPERATOR_SOURCE); cairo_set_source_rgba(c ,1, 1, 1, 0.0); cairo_paint(c); FcitxConfigColor color; if (sc->skinMainBar.bUseCustomTextIconColor) { if (active) color = sc->skinMainBar.textIconColor[0]; else color = sc->skinMainBar.textIconColor[1]; } else color = sc->skinFont.menuFontColor[1]; int textw, texth; FcitxCairoTextContext* ctc = FcitxCairoTextContextCreate(c); FcitxCairoTextContextSet(ctc, classicui->font, min, false); FcitxCairoTextContextStringSizeStrict(ctc, iconText, &textw, &texth); FcitxCairoTextContextOutputString(ctc, iconText, (w - textw) * 0.5, 0, &color); FcitxCairoTextContextFree(ctc); cairo_destroy(c); SkinImage* image = fcitx_utils_malloc0(sizeof(SkinImage)); image->name = strdup(name); image->image = newsurface; image->textIcon = true; HASH_ADD_KEYPTR(hh, sc->imageTable, image->name, strlen(image->name), image); return image; }
unsigned int CalHZIndex(char *strHZ) { unsigned int iutf = 0; int l = fcitx_utf8_char_len(strHZ); unsigned char* utf = (unsigned char*) strHZ; unsigned int *res; int idx; if (l == 2) { iutf = *utf++ << 8; iutf |= *utf++; } else if (l == 3) { iutf = *utf++ << 16; iutf |= *utf++ << 8; iutf |= *utf++; } else if (l == 4) { iutf = *utf++ << 24; iutf |= *utf++ << 16; iutf |= *utf++ << 8; iutf |= *utf++; } res = bsearch(&iutf, fcitx_utf8_in_gb18030, 63360, sizeof(int), cmpi); if (res) idx = res - fcitx_utf8_in_gb18030; else idx = 63361; return idx; }
char* ProcessFullWidthChar(void* arg, const char* str) { FcitxFullWidthChar* fwchar = (FcitxFullWidthChar*)arg; FcitxProfile* profile = FcitxInstanceGetProfile(fwchar->owner); if (profile->bUseFullWidthChar) { size_t i = 0, ret_len = 0, len = fcitx_utf8_strlen(str); char* ret = (char *) fcitx_utils_malloc0(sizeof(char) * (UTF8_MAX_LENGTH * len + 1)); const char* ps = str; ret[0] = '\0'; for (; i < len; ++i) { int wc; int chr_len = fcitx_utf8_char_len(ps); char *nps; nps = fcitx_utf8_get_char(ps , &wc); if (chr_len == 1 && ps[0] >= '\x20' && ps[0] <= '\x7e') { strcat(ret, sCornerTrans[ps[0] - 32]); ret_len += strlen(sCornerTrans[ps[0] - 32]); } else { strncat(ret, ps, chr_len); ret_len += chr_len; } ps = nps; } ret[ret_len] = '\0'; return ret; } else return NULL; }
/** * @brief Get the non-utf8 cursor pos for fcitx * * @return int **/ static int FcitxChewingGetRawCursorPos(char * str, int upos) { unsigned int i; int pos = 0; for (i = 0; i < upos; i++) { pos += fcitx_utf8_char_len(fcitx_utf8_get_nth_char(str, i)); } return pos; }
/** * 该函数装载data/gbks2t.tab的简体转繁体的码表, * 然后按码表将GBK字符转换成GBK繁体字符。 * * WARNING: 该函数返回新分配内存字符串,请调用者 * 注意释放。 */ char *ConvertGBKTradition2Simple(FcitxChttrans* transState, const char *strHZ) { if (strHZ == NULL) return NULL; switch (transState->engine) { case ENGINE_OPENCC: #ifdef ENABLE_OPENCC do { if (transState->odt2s == NULL) { OpenCCInit(transState); if (transState->odt2s == NULL) { break; } } char * res = OpenCCConvert(transState->odt2s, strHZ, (size_t) - 1); if (!res || res == (char *) - 1) { return NULL; } return res; } while(0); #endif case ENGINE_NATIVE: { FILE *fp; char *ret; int i, len, ret_len; const char *ps; if (!transState->t2s_table) { char *strBuf = NULL; size_t bufLen = 0; fp = FcitxXDGGetFileWithPrefix("data", TABLE_GBKS2T, "r", NULL); if (!fp) { ret = (char *) malloc(sizeof(char) * (strlen(strHZ) + 1)); strcpy(ret, strHZ); return ret; } while (getline(&strBuf, &bufLen, fp) != -1) { simple2trad_t *t2s = NULL; char *ps; uint32_t wc; ps = fcitx_utf8_get_char(strBuf, &wc); HASH_FIND_INT(transState->s2t_table, &wc, t2s); if (t2s) { continue; } t2s = (simple2trad_t*) malloc(sizeof(simple2trad_t)); fcitx_utf8_get_char(ps, &wc); t2s->wc = wc; t2s->len = fcitx_utf8_char_len(strBuf); strncpy(t2s->str, strBuf, t2s->len); t2s->str[t2s->len] = '\0'; HASH_ADD_INT(transState->t2s_table, wc, t2s); } fcitx_utils_free(strBuf); } i = 0; len = fcitx_utf8_strlen(strHZ); ret_len = 0; ret = fcitx_utils_malloc0(UTF8_MAX_LENGTH * len + 1); ps = strHZ; ret[0] = '\0'; for (; i < len; ++i) { uint32_t wc; simple2trad_t *t2s = NULL; int chr_len = fcitx_utf8_char_len(ps); char *nps; nps = fcitx_utf8_get_char(ps , &wc); HASH_FIND_INT(transState->t2s_table, &wc, t2s); if (t2s) { strcat(ret, t2s->str); ret_len += t2s->len; } else { strncat(ret, ps, chr_len); ret_len += chr_len; } ps = nps; } ret[ret_len] = '\0'; return ret; } } return NULL; }
/** * 该函数装载data/gbks2t.tab的简体转繁体的码表, * 然后按码表将GBK字符转换成GBK繁体字符。 * * WARNING: 该函数返回新分配内存字符串,请调用者 * 注意释放。 */ char *ConvertGBKTradition2Simple(FcitxChttrans* transState, const char *strHZ) { if (strHZ == NULL) return NULL; switch (transState->engine) { case ENGINE_OPENCC: #ifdef _ENABLE_OPENCC { if (transState->odt2s == NULL) { transState->odt2s = opencc_open(OPENCC_DEFAULT_CONFIG_TRAD_TO_SIMP); if (transState->odt2s == NULL) { opencc_perror(_("OpenCC initialization error")); return NULL; } } char * res = opencc_convert_utf8(transState->odt2s, strHZ, (size_t) - 1); if (res == (char *) - 1) { opencc_perror(_("OpenCC error")); return NULL; } return res; } #endif case ENGINE_NATIVE: { FILE *fp; char *ret; int i, len, ret_len; char *strBuf = NULL; size_t bufLen = 0; const char *ps; if (!transState->t2s_table) { len = 0; fp = FcitxXDGGetFileWithPrefix("data", TABLE_GBKS2T, "r", NULL); if (!fp) { ret = (char *) malloc(sizeof(char) * (strlen(strHZ) + 1)); strcpy(ret, strHZ); return ret; } while (getline(&strBuf, &bufLen, fp) != -1) { simple2trad_t *t2s; char *ps; unsigned int wc; ps = fcitx_utf8_get_char(strBuf, &wc); t2s = (simple2trad_t*) malloc(sizeof(simple2trad_t)); fcitx_utf8_get_char(ps, &wc); t2s->wc = wc; t2s->len = fcitx_utf8_char_len(strBuf); strncpy(t2s->str, strBuf, t2s->len); t2s->str[t2s->len] = '\0'; HASH_ADD_INT(transState->t2s_table, wc, t2s); } if (strBuf) free(strBuf); } i = 0; len = fcitx_utf8_strlen(strHZ); ret_len = 0; ret = (char *) fcitx_utils_malloc0(sizeof(char) * (UTF8_MAX_LENGTH * len + 1)); ps = strHZ; ret[0] = '\0'; for (; i < len; ++i) { unsigned int wc; simple2trad_t *t2s = NULL; int chr_len = fcitx_utf8_char_len(ps); char *nps; nps = fcitx_utf8_get_char(ps , &wc); HASH_FIND_INT(transState->t2s_table, &wc, t2s); if (t2s) { strcat(ret, t2s->str); ret_len += t2s->len; } else { strncat(ret, ps, chr_len); ret_len += chr_len; } ps = nps; } ret[ret_len] = '\0'; return ret; } } return NULL; }
boolean TableCreatePhraseCode(TableDict* tableDict, char *strHZ) { unsigned char i; unsigned char i1, i2; size_t iLen; char strTemp[UTF8_MAX_LENGTH + 1] = {'\0', }; RECORD *recTemp; boolean bCanntFindCode = false; iLen = fcitx_utf8_strlen(strHZ); if (iLen >= tableDict->iCodeLength) { i2 = tableDict->iCodeLength; i1 = 1; } else { i2 = iLen; i1 = 0; } for (i = 0; i < tableDict->iCodeLength - 1; i++) { if (tableDict->rule[i].iWords == i2 && tableDict->rule[i].iFlag == i1) break; } if (i == tableDict->iCodeLength - 1) return true; int codeIdx = 0; for (i1 = 0; i1 < tableDict->iCodeLength; i1++) { int clen; char* ps; if (tableDict->rule[i].rule[i1].iFlag) { ps = fcitx_utf8_get_nth_char(strHZ, tableDict->rule[i].rule[i1].iWhich - 1); clen = fcitx_utf8_char_len(ps); strncpy(strTemp, ps, clen); } else { ps = fcitx_utf8_get_nth_char(strHZ, iLen - tableDict->rule[i].rule[i1].iWhich); clen = fcitx_utf8_char_len(ps); strncpy(strTemp, ps, clen); } int hzIndex = CalHZIndex(strTemp); if (tableDict->tableSingleHZ[hzIndex]) { if (tableDict->tableSingleHZCons[hzIndex]) recTemp = tableDict->tableSingleHZCons[hzIndex]; else recTemp = tableDict->tableSingleHZ[hzIndex]; } else { bCanntFindCode = true; break; } if (strlen(recTemp->strCode) >= tableDict->rule[i].rule[i1].iIndex) { tableDict->strNewPhraseCode[codeIdx] = recTemp->strCode[tableDict->rule[i].rule[i1].iIndex - 1]; codeIdx++; } } return bCanntFindCode; }
void CreatePYBase(void) { _PyStruct *head, *pyList, *temp, *t; char strPY[7], strHZ[UTF8_MAX_LENGTH * 80 + 1], strMap[3]; int iIndex, iCount, i; int iBaseCount; int s = 0; int tt = 0; head = (_PyStruct *) malloc(sizeof(_PyStruct)); head->prev = head; head->next = head; iBaseCount = 0; while (PYTable_template[iBaseCount].strPY[0] != '\0') iBaseCount++; for (iIndex = 0; iIndex < iBaseCount; iIndex++) YY[iIndex] = 0; iIndex = 0; while (!feof(fps)) { fscanf(fps, "%s", strPY); fscanf(fps, "%s\n", strHZ); if (MapPY(&pyconfig, strPY, strMap, PY_PARSE_INPUT_SYSTEM)) { for (i = 0; i < iBaseCount; i++) if ((!strcmp(PYTable_template[i].strPY, strPY)) && PYTable_template[i].control == PYTABLE_NONE) YY[i] += 1; iIndex++; if (fcitx_utf8_strlen(strHZ) > 1) { int8_t charLen = fcitx_utf8_char_len(strHZ); fprintf(stderr, "%s length is larger that 1, truncated to ", strHZ); strHZ[charLen] = '\0'; fprintf(stderr, "%s.\n", strHZ); } temp = (_PyStruct *) malloc(sizeof(_PyStruct)); strcpy(temp->strHZ, strHZ); strcpy(temp->strPY, strMap); pyList = head->prev; while (pyList != head) { if (strcmp(pyList->strPY, strMap) <= 0) break; pyList = pyList->prev; } temp->next = pyList->next; temp->prev = pyList; pyList->next->prev = temp; pyList->next = temp; } else fprintf(stderr, "%s Error!!!!\n", strPY); } iCount = 0; for (i = 0; i < iBaseCount; i++) { if (YY[i]) iCount++; } fwrite(&iCount, sizeof(int), 1, fp1); printf("Groups: %d\n", iCount); iAllCount = iIndex; pyList = head->next; strcpy(strPY, pyList->strPY); iCount = 0; t = pyList; while (pyList != head) { if (!strcmp(strPY, pyList->strPY)) { iCount++; } else { tt++; fwrite(strPY, sizeof(char) * 2, 1, fp1); fwrite(&iCount, sizeof(int), 1, fp1); for (i = 0; i < iCount; i++) { int8_t len = strlen(t->strHZ); fwrite(&len, sizeof(int8_t), 1, fp1); fwrite(t->strHZ, sizeof(char) * len , 1, fp1); t = t->next; } s += iCount; t = pyList; iCount = 1; strcpy(strPY, pyList->strPY); } pyList = pyList->next; } fwrite(strPY, sizeof(char) * 2, 1, fp1); fwrite(&iCount, sizeof(int), 1, fp1); for (i = 0; i < iCount; i++) { int8_t len = strlen(t->strHZ); fwrite(&len, sizeof(int8_t), 1, fp1); fwrite(t->strHZ, sizeof(char) * len , 1, fp1); t = t->next; } s += iCount; fclose(fp1); fclose(fps); }
void CreatePYPhrase(void) { char strPY[256]; char strPhrase[256]; char strMap[256]; ParsePYStruct strTemp; int iIndex, i, s1, s2, j, k; _PyPhrase *phrase, *t, *tt; FILE *f = fopen("pyERROR", "w"); FILE *fg = fopen("pyPhrase.ok", "w"); int kkk; unsigned int uIndex, uTemp; FcitxPinyinConfig pyconfig; memset(&pyconfig, 0 , sizeof(pyconfig)); InitMHPY(&pyconfig.MHPY_C, MHPY_C_TEMPLATE); InitMHPY(&pyconfig.MHPY_S, MHPY_S_TEMPLATE); InitPYTable(&pyconfig); s1 = 0; s2 = 0; uIndex = 0; printf("Start Loading Phrase...\n"); while (!feof(fpt)) { fscanf(fpt, "%s", strPY); fscanf(fpt, "%s\n", strPhrase); if (strlen(strPhrase) < 3) continue; ParsePY(&pyconfig, strPY, &strTemp, PY_PARSE_INPUT_SYSTEM, false); s2++; kkk = 0; if (strTemp.iHZCount != fcitx_utf8_strlen(strPhrase) || (strTemp.iMode & PARSE_ABBR)) { fprintf(f, "%s %s\n", strPY, strPhrase); continue; } strMap[0] = '\0'; for (iIndex = 0; iIndex < strTemp.iHZCount; iIndex++) strcat(strMap, strTemp.strMap[iIndex]); for (iIndex = 0; iIndex < iPYFACount; iIndex++) { if (!strncmp(PYFAList[iIndex].strMap, strMap, 2)) { for (i = 0; i < PYFAList[iIndex].iHZCount; i++) { if (!fcitx_utf8_strncmp(PYFAList[iIndex].pyBase[i].strHZ, strPhrase, 1)) { t = PYFAList[iIndex].pyBase[i].phrase; for (j = 0; j < PYFAList[iIndex].pyBase[i].iPhraseCount; j++) { tt = t; t = t->next; if (!strcmp(t->strMap, strMap + 2) && !strcmp(t->strPhrase, strPhrase + fcitx_utf8_char_len(strPhrase))) { printf("\n\t%d: %s %s ----->deleted.\n", s2, strPY, strPhrase); goto _next; } if (strcmp(t->strMap, strMap + 2) > 0) { t = tt; break; } } phrase = (_PyPhrase *) malloc(sizeof(_PyPhrase)); phrase->strPhrase = (char *) malloc(sizeof(char) * (strlen(strPhrase) - fcitx_utf8_char_len(strPhrase) + 1)); phrase->strMap = (char *) malloc(sizeof(char) * ((strTemp.iHZCount - 1) * 2 + 1)); phrase->uIndex = uIndex++; strcpy(phrase->strPhrase, strPhrase + fcitx_utf8_char_len(strPhrase)); strcpy(phrase->strMap, strMap + 2); tt = t->next; t->next = phrase; phrase->next = tt; PYFAList[iIndex].pyBase[i].iPhraseCount++; s1++; kkk = 1; _next: ; } } } } if (!kkk) fprintf(f, "%s %s %s\n", strPY, strPhrase, (char *)(strTemp.strPYParsed)); else fprintf(fg, "%s %s\n", strPY, strPhrase); } printf("%d Phrases, %d Converted!\nWriting Phrase file ...", s2, s1); for (i = 0; i < iPYFACount; i++) { for (j = 0; j < PYFAList[i].iHZCount; j++) { iIndex = PYFAList[i].pyBase[j].iPhraseCount; if (iIndex) { int8_t clen = strlen(PYFAList[i].pyBase[j].strHZ); fwrite(&i, sizeof(int), 1, fp2); fwrite(&clen, sizeof(int8_t), 1, fp2); fwrite(PYFAList[i].pyBase[j].strHZ, sizeof(char) * clen, 1, fp2); fwrite(&iIndex, sizeof(int), 1, fp2); t = PYFAList[i].pyBase[j].phrase->next; for (k = 0; k < PYFAList[i].pyBase[j].iPhraseCount; k++) { int slen = strlen(t->strPhrase); iIndex = strlen(t->strMap); fwrite(&iIndex, sizeof(int), 1, fp2); fwrite(t->strMap, sizeof(char), iIndex, fp2); fwrite(&slen, sizeof(int), 1, fp2); fwrite(t->strPhrase, sizeof(char), strlen(t->strPhrase), fp2); uTemp = uIndex - 1 - t->uIndex; fwrite(&uTemp, sizeof(unsigned int), 1, fp2); t = t->next; } } } } printf("\nOK!\n"); fclose(fp2); fclose(fpt); }