Mercurial > kinput2.yaz
diff lib/Xsj3clib/dict.c @ 0:92745d501b9a
initial import from kinput2-v3.1
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Mon, 08 Mar 2010 04:44:30 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/Xsj3clib/dict.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,674 @@ +#ifndef lint +static char *rcsid = "$Id: dict.c,v 2.0 1992/02/13 18:33:19 nao Exp $"; +#endif +/* + * Copyright 1991 Sony Corporation + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Sony not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Sony makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SONY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SONY + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * Author: Naoshi Suzuki, SONY Corporation. (nao@sm.sony.co.jp) + */ + +#include "common.h" +#include "util.h" +#include "segment.h" + +extern Xsj3cCVServerIF serverIF[SERVER_NUM]; +extern wchar *_Xsj3cStoreWchar(); + +void _Xsj3cFlushDictMsg(); +Xsj3cDictData _Xsj3cCreateDictData(); +void _Xsj3cFreeDictData(); + +int Xsj3cGetDictMsgNum(); +Xsj3cDictMsg Xsj3cGetDictMsgs(); +wchar *Xsj3cGetDictMsg(); +void Xsj3cDictRegister(); +void Xsj3cDictClear(); +void Xsj3cEndDict(); + +Xsj3cHinsi _Xsj3cHinsiInit(); +int Xsj3cGetHinsiNum(); +Xsj3cHinsi Xsj3cGetHinsis(); +wchar *Xsj3cGetHinsi(); +int Xsj3cSetHinsi(); +void Xsj3cEndHinsi(); + +static Xsj3cDictMsg _Xsj3cDictMsgInit(); +static void _Xsj3cSetDictMsg(); + +static Xsj3cDictMsg dictmsglist[SERVER_NUM] = {NULL}; +static int dictmsgnum[SERVER_NUM] = {0}; + +static Xsj3cHinsi hinsilist[SERVER_NUM] = {NULL}; +static int hinsinum[SERVER_NUM] = {0}; + +typedef struct _dict_hinsi { + int code; + char *string; +} Sj3HinsiRec, *Sj3HinsiPtr; + +static Sj3HinsiRec sj3_hinsi_list[] = { + SJ3_H_NRMNOUN, "\225\201\222\312\226\274\216\214", + SJ3_H_PRONOUN, "\221\343\226\274\216\214", + SJ3_H_LNAME, "\225\143\216\232", + SJ3_H_FNAME, "\226\274\221\117", + SJ3_H_LOCNAME, "\222\156\226\274", + SJ3_H_PREFIC, "\214\247\201\136\213\346\226\274", + SJ3_H_RENTAI, "\230\101\221\314\216\214", + SJ3_H_CONJUNC, "\220\332\221\261\216\214", + SJ3_H_SUBNUM, "\217\225\220\224\216\214", + SJ3_H_NUMERAL, "\220\224\216\214", + SJ3_H_PREFIX, "\220\332\223\252\214\352", + SJ3_H_POSTFIX, "\220\332\224\366\214\352", + SJ3_H_ADVERB, "\225\233\216\214", + SJ3_H_ADJECT, "\214\140\227\145\216\214", + SJ3_H_ADJVERB, "\214\140\227\145\223\256\216\214", + SJ3_H_SILVERB, "\203\124\225\317\223\256\216\214", + SJ3_H_ZILVERB, "\203\125\225\317\223\256\216\214", + SJ3_H_ONEVERB, "\210\352\222\151\223\256\216\214", + SJ3_H_KAVERB, "\203\112\215\163\214\334\222\151\223\256\216\214", + SJ3_H_GAVERB, "\203\113\215\163\214\334\222\151\223\256\216\214", + SJ3_H_SAVERB, "\203\124\215\163\214\334\222\151\223\256\216\214", + SJ3_H_TAVERB, "\203\136\215\163\214\334\222\151\223\256\216\214", + SJ3_H_NAVERB, "\203\151\215\163\214\334\222\151\223\256\216\214", + SJ3_H_BAVERB, "\203\157\215\163\214\334\222\151\223\256\216\214", + SJ3_H_MAVERB, "\203\175\215\163\214\334\222\151\223\256\216\214", + SJ3_H_RAVERB, "\203\211\215\163\214\334\222\151\223\256\216\214", + SJ3_H_WAVERB, "\203\217\215\163\214\334\222\151\223\256\216\214", + SJ3_H_SINGLE, "\222\120\212\277\216\232", +}; + +typedef struct _dict_status { + Xsj3cdMode state; + Xsj3cdMode value; + char *string; +} Sj3DictStatusRec, *Sj3DictStatusPtr; + +static Sj3DictStatusRec sj3_dict_status[] = { + REG_STATE|CLR_STATE, SJ3_DICT_INPUT, + " \224\315\210\315\216\167\222\350/\223\307\202\335\223\374\227\ +\315:[\223\307\202\335]", + /* $BHO0O;XDj(B/$BFI$_F~NO(B:[$BFI$_(B] */ + REG_STATE|CLR_STATE, SJ3_DICT_YOMI, + " [\223\307\202\335]", + /* [$BFI$_(B] */ + REG_STATE|CLR_STATE, SJ3_DICT_HINSI, + " [\225\151\216\214]", + /* [$BIJ;l(B] */ + REG_STATE|CLR_STATE, SJ3_DICT_CONFIRM, + " [ok ?]", + /* [ok ?] */ + REG_STATE, SJ3_TOUROKU_SUCCESSED, + ":\223\157\230\136\202\265\202\334\202\265\202\275", + /* $BEPO?$7$^$7$?(B */ + CLR_STATE, SJ3_SYOUKYO_SUCCESSED, + ":\217\301\213\216\202\265\202\334\202\265\202\275", + /* $B>C5n$7$^$7$?(B */ + REG_STATE|CLR_STATE, SJ3_NO_YOMI_STR, + ":\223\307\202\335\225\266\216\232\227\361\202\252\202\240\202\350\ +\202\334\202\271\202\361", + /* $BFI$_J8;zNs$,$"$j$^$;$s(B */ + REG_STATE|CLR_STATE, SJ3_LONG_YOMI_STR, + ":\223\307\202\335\225\266\216\232\227\361\202\252\222\267\202\267\ +\202\254\202\334\202\267", + /* $BFI$_J8;zNs$,D9$9$.$^$9(B */ + REG_STATE|CLR_STATE, SJ3_DICT_ERROR, + ":\216\253\217\221\202\326\202\314\217\221\202\253\215\236\202\335\ +\202\252\217\157\227\210\202\334\202\271\202\361", + /* $B<-=q$X$N=q$-9~$_$,=PMh$^$;$s(B */ + REG_STATE|CLR_STATE, SJ3_DICT_LOCKED, + ":\216\253\217\221\202\252\203\215\203\142\203\116\202\263\202\352\ +\202\304\202\242\202\334\202\267", + /* $B<-=q$,%m%C%/$5$l$F$$$^$9(B */ + REG_STATE|CLR_STATE, SJ3_BAD_YOMI_STR, + ":\223\307\202\335\225\266\216\232\227\361\202\311\225\163\220\263\ +\202\310\225\266\216\232\202\252\212\334\202\334\202\352\202\304\202\242\ +\202\334\202\267", + /* $BFI$_J8;zNs$KIT@5$JJ8;z$,4^$^$l$F$$$^$9(B */ + REG_STATE|CLR_STATE, SJ3_BAD_KANJI_STR, + ":\212\277\216\232\225\266\216\232\227\361\202\311\225\163\220\263\ +\202\310\225\266\216\232\202\252\212\334\202\334\202\352\202\304\202\242\ +\202\351\202\251\222\267\202\267\202\254\202\334\202\267", + /* $B4A;zJ8;zNs$KIT@5$JJ8;z$,4^$^$l$F$$$k$+D9$9$.$^$9(B */ + REG_STATE|CLR_STATE, SJ3_BAD_HINSI_CODE, + ":\225\151\216\214\203\122\201\133\203\150\202\252\225\163\220\263\ +\202\305\202\267", + /* $BIJ;l%3!<%I$,IT@5$G$9(B */ + REG_STATE, SJ3_WORD_EXIST, + ":\223\157\230\136\215\317\202\314\217\156\214\352\202\305\202\267", + /* $BEPO?:Q$N=O8l$G$9(B */ + CLR_STATE, SJ3_WORD_NOT_EXIST, + ":\217\156\214\352\202\252\223\157\230\136\202\263\202\352\202\304\ +\202\242\202\334\202\271\202\361", + /* $B=O8l$,EPO?$5$l$F$$$^$;$s(B */ + REG_STATE, SJ3_DOUON_FULL, + ":\202\261\202\352\210\310\217\343\223\257\211\271\214\352\202\360\ +\223\157\230\136\202\305\202\253\202\334\202\271\202\361", + /* $B$3$l0J>eF12;8l$rEPO?$G$-$^$;$s(B */ + REG_STATE, SJ3_DICT_FULL, + ":\202\261\202\352\210\310\217\343\216\253\217\221\202\311\223\157\ +\230\136\202\305\202\253\202\334\202\271\202\361", + /* $B$3$l0J>e<-=q$KEPO?$G$-$^$;$s(B */ + REG_STATE, SJ3_INDEX_FULL, + ":\202\261\202\352\210\310\217\343 INDEX \202\311\223\157\230\136\202\ +\305\202\253\202\334\202\271\202\361", + /* $B$3$l0J>e(B INDEX $B$KEPO?$G$-$^$;$s(B */ + REG_STATE, SJ3_TOUROKU_FAILED, + ":\216\253\217\221\202\326\202\314\223\157\230\136\202\311\216\270\ +\224\163\202\265\202\334\202\265\202\275", + /* $B<-=q$X$NEPO?$K<:GT$7$^$7$?(B */ + CLR_STATE, SJ3_SYOUKYO_FAILED, + ":\216\253\217\221\202\251\202\347\202\314\217\301\213\216\202\311\ +\216\270\224\163\202\265\202\334\202\265\202\275", + /* $B<-=q$+$i$N>C5n$K<:GT$7$^$7$?(B */ +}; + +/* + * _Xsj3cCreateDictData() + */ +Xsj3cDictData +_Xsj3cCreateDictData(buf, mode) + Xsj3cBuf buf; + Xsj3cdMode mode; +{ + register Xsj3cDictData dict; + + if (buf->dict) + return buf->dict; + if ((dict = (Xsj3cDictData)malloc(sizeof(Xsj3cDictDataRec))) == NULL) + Xsj3cError("Failed to allocate data for DictMode."); + if ((dict->seg = (Xsj3cSeg)Xsj3cCreateSegment(buf)) == NULL) + Xsj3cError("Failed to allocate segment for dictionary."); + if ((dict->msg = (Xsj3cDictMsg) + calloc(DICT_STR_NUM, sizeof(Xsj3cDictMsgRec))) == NULL) + Xsj3cError("Failed to allocate message buffer for dictionary."); + dict->mode = mode; + dict->status = DICT_INPUT; + dict->value = SJ3_DICT_INPUT; + dict->n_dict = 0; + return (dict); +} + +/* + * _Xsj3cFreeDictData() + */ +void +_Xsj3cFreeDictData(buf) + Xsj3cBuf buf; +{ + if (!buf->dict) + return ; + Xsj3cFreeSegment(buf->dict->seg); + buf->dict->seg = NULL; + free (buf->dict->msg); + free (buf->dict); + buf->dict = NULL; +} + +/* + * _Xsj3cDictMsgInit() + */ +static Xsj3cDictMsg +_Xsj3cDictMsgInit(buf) + Xsj3cBuf buf; +{ + wchar data[KANABUFSIZ]; + register int i; + + if (dictmsglist[buf->server]) { + return (dictmsglist[buf->server]); + } + switch(buf->server) { + case SERVER_SJ3: + default: + dictmsgnum[SERVER_SJ3] + = sizeof(sj3_dict_status)/sizeof(Sj3DictStatusRec); + break; + } + if ((dictmsglist[buf->server] = + (Xsj3cDictMsg)calloc(dictmsgnum[buf->server], + sizeof(Sj3DictStatusRec))) == NULL) { + Xsj3cError("Failed to allocate hinsi data"); + } + switch(buf->server) { + case SERVER_SJ3: + default: + for (i = 0; i < dictmsgnum[SERVER_SJ3]; i++) { + dictmsglist[buf->server][i].len = _Xsj3cmPStowOUT(buf, data, + (unsigned char *)sj3_dict_status[i].string); + dictmsglist[buf->server][i].data + = _Xsj3cStoreWchar(data, dictmsglist[buf->server][i].len + 1); + dictmsglist[buf->server][i].attr = SEG_NORMAL; + if (!dictmsglist[buf->server][i].data) + Xsj3cError("Failed to allocate hinsi data"); + } + break; + } + return (dictmsglist[buf->server]); +} + +/* + * Xsj3cGetDictMsgNum() + */ +int +Xsj3cGetDictMsgNum(buf) + Xsj3cBuf buf; +{ + switch (buf->dict->status) { + case DICT_INPUT: + case DICT_HINSI: + if (buf->dict->seg->num > 0) + return (DICT_STR_YOMI + 1); + else + return (DICT_STR_MSG1 + 1); + case DICT_CONFIRM: + if (buf->dict->mode == REG_STATE) + return (DICT_STR_NUM); + else + return (DICT_STR_MSG2 + 1); + case DICT_END: + if (buf->dict->seg->num > 0) { + if (buf->curhinsi < 0) + return (DICT_STR_MSG2 + 1); + else + return (DICT_STR_NUM); + } else { + return (DICT_STR_MSG1 + 1); + } + default: + return (NULL); + } +} + +/* + * _Xsj3cFlushDictMsg() + */ +void +_Xsj3cFlushDictMsg(buf) + Xsj3cBuf buf; +{ + if (!dictmsglist[buf->server]) { + dictmsglist[buf->server] = _Xsj3cDictMsgInit(buf); + } + + switch (buf->dict->status) { + case DICT_INPUT: + case DICT_HINSI: + if (buf->dict->seg->num > 0) { + _Xsj3cSetDictMsg(buf, DICT_STR_YOMI); + } else { + _Xsj3cSetDictMsg(buf, DICT_STR_MODE); + _Xsj3cSetDictMsg(buf, DICT_STR_MSG1); + } + break; + case DICT_CONFIRM: + if (buf->dict->mode == REG_STATE) { + _Xsj3cSetDictMsg(buf, DICT_STR_MSG1); + _Xsj3cSetDictMsg(buf, DICT_STR_MSG2); + _Xsj3cSetDictMsg(buf, DICT_STR_HINSI); + _Xsj3cSetDictMsg(buf, DICT_STR_MSG3); + } else { + _Xsj3cSetDictMsg(buf, DICT_STR_MSG1); + _Xsj3cSetDictMsg(buf, DICT_STR_MSG2); + } + break; + case DICT_END: + if (buf->dict->seg->num > 0) { + if (buf->dict->seg->num > DICT_YOMI_MAX) { + _Xsj3cSetDictMsg(buf, DICT_STR_MSG2); + } else { + if (buf->dict->mode == REG_STATE) { + _Xsj3cSetDictMsg(buf, DICT_STR_MSG1); + _Xsj3cSetDictMsg(buf, DICT_STR_MSG3); + } else { + if (buf->curhinsi < 0) { + _Xsj3cSetDictMsg(buf, DICT_STR_MSG2); + } else { + _Xsj3cSetDictMsg(buf, DICT_STR_MSG1); + _Xsj3cSetDictMsg(buf, DICT_STR_MSG2); + _Xsj3cSetDictMsg(buf, DICT_STR_HINSI); + _Xsj3cSetDictMsg(buf, DICT_STR_MSG3); + } + } + } + } else { + _Xsj3cSetDictMsg(buf, DICT_STR_MSG1); + } + break; + default: + break; + } +} + +/* + * Xsj3cGetDictMsgs() + */ +Xsj3cDictMsg +Xsj3cGetDictMsgs(buf) + Xsj3cBuf buf; +{ + return (buf->dict->msg); +} + +/* + * Xsj3cGetDictMsg() + */ +wchar * +Xsj3cGetDictMsg(buf, n, len, attr) + Xsj3cBuf buf; + int n; + int *len; + int *attr; +{ + *attr = buf->dict->msg[n].attr; + *len = buf->dict->msg[n].len; + return (buf->dict->msg[n].data); +} + +static void +_Xsj3cSetDictMsg(buf, n) + Xsj3cBuf buf; + Xsj3cdMode n; +{ + Xsj3csMode mode; + register int i; + int value; + + switch (n) { + case DICT_STR_MODE: + mode = (buf->dict->mode == REG_STATE ? MODE_TOROKU : MODE_SYOUKYO); + buf->dict->msg[DICT_STR_MODE].data = buf->modestr[mode]; + buf->dict->msg[DICT_STR_MODE].len = buf->modelen[mode]; + buf->dict->msg[DICT_STR_MODE].attr = SEG_REVERSED; + return; + case DICT_STR_MSG1: + if (buf->dict->status == DICT_INPUT) { + value = SJ3_DICT_INPUT; + } else { + if (buf->dict->seg->num > 0) + value = SJ3_DICT_YOMI; + else + value = buf->dict->value; + } + break; + case DICT_STR_YOMI: + buf->dict->msg[DICT_STR_YOMI].data = buf->dict->seg->disp; + buf->dict->msg[DICT_STR_YOMI].len = buf->dict->seg->dnum; + buf->dict->msg[DICT_STR_YOMI].attr = SEG_UNDER_LINE; + return; + case DICT_STR_MSG2: + if (buf->dict->mode == CLR_STATE && buf->dict->status == DICT_CONFIRM) { + value = SJ3_DICT_CONFIRM; + } else { + if (buf->curhinsi < 0) + value = buf->dict->value; + else + value = SJ3_DICT_HINSI; + } + break; + case DICT_STR_HINSI: + buf->dict->msg[DICT_STR_HINSI].data = buf->hinsi[buf->curhinsi].data; + buf->dict->msg[DICT_STR_HINSI].len = buf->hinsi[buf->curhinsi].len; + buf->dict->msg[DICT_STR_HINSI].attr = SEG_NORMAL; + return; + case DICT_STR_MSG3: + if (buf->dict->mode == REG_STATE && buf->dict->status == DICT_CONFIRM) { + value = SJ3_DICT_CONFIRM; + } else { + value = buf->dict->value; + } + break; + default: + value = buf->dict->value; + break; + } + + switch(buf->server) { + case SERVER_SJ3: + default: + for (i = 0; i < dictmsgnum[SERVER_SJ3]; i++) { + if ((buf->dict->mode & sj3_dict_status[i].state) && + value == sj3_dict_status[i].value) + break; + } + break; + } + if (i >= dictmsgnum[buf->server]) + Xsj3cError("Cannot find message for now status %s.",_Xsj3cItoa(value)); + else + buf->dict->msg[n] = dictmsglist[buf->server][i]; +} + +void +Xsj3cDictRegister(buf) + Xsj3cBuf buf; +{ + wchar disp[KANABUFSIZ]; + unsigned char kana[KANJIBUFSIZ], kanji[KANJIBUFSIZ]; + register int i; + + disp[0] = '\0'; + for (i = buf->curseg; i <= buf->curseg + buf->dict->n_dict; i++) { + _Xsj3cWcat(disp, buf->input[i]->disp); + } + buf->dict->n_dict = 0; + _Xsj3cwOUTtomPS(buf, kanji, disp); + if (buf->gakusyuu) + _Xsj3cClearDcid(buf); + _Xsj3cwPStomPS(buf, kana, buf->dict->seg->yomi); + + switch (buf->server) { + case SERVER_SJ3: + default: + if ((buf->dict->value + = serverIF[buf->server].func[FUNC_REGISTER](kana, kanji, + sj3_hinsi_list[buf->curhinsi].code)) == 0) { + buf->dict->value = SJ3_TOUROKU_SUCCESSED; + } else if (buf->dict->value < 0) { + Xsj3cWarning("sj3serv is down. reconnect please"); + buf->dict->value = SJ3_TOUROKU_FAILED; + } + break; + } + _Xsj3cFlushDictMsg(buf); +} + +void +Xsj3cDictClear(buf) + Xsj3cBuf buf; +{ + wchar disp[KANABUFSIZ]; + unsigned char kana[KANJIBUFSIZ], kanji[KANJIBUFSIZ]; + register int i; + Sj3HinsiPtr hp; + + disp[0] = '\0'; + for (i = buf->curseg; i <= buf->curseg + buf->dict->n_dict; i++) { + _Xsj3cWcat(disp, buf->input[i]->disp); + } + buf->dict->n_dict = 0; + _Xsj3cwOUTtomPS(buf, kanji, disp); + if (buf->gakusyuu) + _Xsj3cClearDcid(buf); + _Xsj3cwPStomPS(buf, kana, buf->dict->seg->yomi); + + switch (buf->server) { + case SERVER_SJ3: + default: + for (hp = sj3_hinsi_list, i = 0; hp->code > 0; hp++, i++) { + if ((buf->dict->value + = serverIF[buf->server].func[FUNC_CLEAR](kana, kanji, + hp->code)) == 0) { + buf->dict->value = SJ3_SYOUKYO_SUCCESSED; + buf->curhinsi = i; + _Xsj3cFlushDictMsg(buf); + return; + } else if (buf->dict->value < 0) { + Xsj3cWarning("sj3serv is down. reconnect please"); + buf->dict->value = SJ3_SYOUKYO_FAILED; + buf->curhinsi = -1; + _Xsj3cFlushDictMsg(buf); + return; + } else if (buf->dict->value != SJ3_WORD_NOT_EXIST) { + buf->curhinsi = -1; + _Xsj3cFlushDictMsg(buf); + return; + } + } + break; + } + + buf->curhinsi = -1; + _Xsj3cFlushDictMsg(buf); + return; +} + +/* + * Xsj3cEndDict() + * End dictionary mode(DictMode) and back to ConvedMode. + */ +void +Xsj3cEndDict(buf) + Xsj3cBuf buf; +{ + _Xsj3cFreeDictData(buf); + buf->convmode = ConvedModeMask; +} + +/* + * _Xsj3cHinsiInit() + * Initialize hinsi data. + */ +Xsj3cHinsi +_Xsj3cHinsiInit(buf) + Xsj3cBuf buf; +{ + wchar data[KANABUFSIZ]; + register int i; + + if (hinsilist[buf->server]) { + return(hinsilist[buf->server]); + } + + switch (buf->server) { + case SERVER_SJ3: + default: + hinsinum[SERVER_SJ3]= sizeof(sj3_hinsi_list)/sizeof(Sj3HinsiRec); + break; + } + + if ((hinsilist[buf->server] + = (Xsj3cHinsi)calloc(hinsinum[buf->server], sizeof(Xsj3cHinsiRec))) + == NULL) { + Xsj3cError("Failed to allocate hinsi data"); + } + + switch (buf->server) { + case SERVER_SJ3: + default: + for (i = 0; i < hinsinum[buf->server]; i++) { + hinsilist[buf->server][i].len = _Xsj3cmPStowOUT(buf, data, + (unsigned char *)sj3_hinsi_list[i].string); + hinsilist[buf->server][i].data + = _Xsj3cStoreWchar(data, hinsilist[buf->server][i].len + 1); + if (!hinsilist[buf->server][i].data) + Xsj3cError("Failed to allocate hinsi data"); + } + break; + } + + return (hinsilist[buf->server]); +} + +/* + * Xsj3cGetHinsiNum() + * Return hinsi data total number. + */ +int +Xsj3cGetHinsiNum(buf, cur) + Xsj3cBuf buf; + int *cur; +{ + if (!buf->hinsi) { + buf->hinsi = _Xsj3cHinsiInit(buf); + } + *cur = 0; + return (hinsinum[buf->server]); +} + +/* + * Xsj3cGetHinsis() + * Return hinsi data structure. + */ +Xsj3cHinsi +Xsj3cGetHinsis(buf) + Xsj3cBuf buf; +{ + if (!buf->hinsi) { + buf->hinsi = _Xsj3cHinsiInit(buf); + } + return (buf->hinsi); +} + +/* + * Xsj3cGetHinsi() + * Set the appointed (by 1st argument) hinsi to 2nd argument. + */ +wchar * +Xsj3cGetHinsi(buf, n, len) + Xsj3cBuf buf; + int n; + int *len; +{ + if (!buf->hinsi) { + buf->hinsi = _Xsj3cHinsiInit(buf); + } + *len = buf->hinsi[n].len; + return (buf->hinsi[n].data); +} + +/* + * Xsj3cSetHinsi() + * Set the selected hinsi. + */ +int +Xsj3cSetHinsi(buf, sel_hinsi, changed, flush) + Xsj3cBuf buf; + int sel_hinsi; + int *changed; + int *flush; +{ + buf->curhinsi = sel_hinsi; + _Xsj3cFlushDictMsg(buf); + *changed = OFF; + *flush = OFF; + return 0; +} + +/* + * Xsj3cEndHinsi() + * End hinsi select mode(SelectMode) and back to ConvedMode. + */ +void +Xsj3cEndHinsi(buf) + Xsj3cBuf buf; +{ + buf->convmode = DictModeMask; +}