輸入法的主導模塊以動態連接庫(libimpi.a)的形式存在,和各輸入法模塊連接成單獨的可執行文件。對於每一個具體的輸入法,只需要按照一定的數據結構就可以鏈接成為新的可執行文件,並且添加到炎黃中文平台上。這些數據結構包括外部變量和外部函數。
1、外部變量
數組extcode[]:字符串類型,表示輸入的外碼串;
數組candstr[]:字符串類型,表示重碼的待選串;
數組result[]:字符串類型,表示得到的結果串;
數組imname[]:字符串類型,表示輸入法的名稱;
數組imdscrpt[]:字符串類型,表示對輸入法的描述。
變量maxeclen:整型,表示外碼的最大長度;
變量eclen:整型,表示外碼的長度。
這些變量的定義如下所示:
extern int maxeclen; /* The maximum length of external code */ extern int eclen; /* The length of external code */ extern char extcode[]; /* External code */ extern char candstr[]; /* Candinate string */ extern char result[]; /* Result string */
2、外部函數
外部函數一共有四個,它們分別是IMInit()、IMCleanup()、IMSelect()和IMFilter()。這四個函數的定義分別如下所示:
int IMInit(); int IMClearup(); int IMSelect(int select); int IMFilter(int ch); 其中IMInit()函數用來完成輸入法的初始化工作;IMClearup()函數用來對輸入法被釋放時的情況進行處理; IMSelect()函數用來處理當前輸入法被選中的情況;IMFilter()是輸入法的核心函數,用來對接收的字符串進行過濾,得到正確的輸入結果。
下面以區位輸入法為例對此進行簡單的介紹。
准備工作
首先需要取得libimpi.a文件,然後可以創建一個qvwei目錄。
代碼編寫
編譯一個qvwei.c文件,接著對輸入法進行初始化,這時候的qvwei.c如下所示:
/* The qvwei input method */ #include #include #include #include #include "impi.h" char imname[] = "區位"; char imdscrpt[] = "區位輸入法"; static void reset(); static void append(int ch); static void comp_appe(int prevch, int ch); int IMInit() { return 0; } int IMClearup() { return 0; } int IMSelect(select) int select; { return 0; } int IMFilter(ch) int ch; { }
接下來的工作就是編寫IMInit()、IMClearup()、IMSelect()和IMFilter()這四個函數了。
在IMInit()函數中添加如下的代碼:
maxeclen = 5; reset(); return 0;
由於區位輸入法比較簡單,IMClearup()和IMSelect()函數都不需要額外添加代碼,在IMFilter()這個函數中加入如下的處理代碼:
candstr[0] = '\0'; result[0] = '\0'; /* process currnet keystroke */ if (isdigit(ch)) { if ((eclen == 1) || (eclen == 3)) comp_appe(extcode[eclen - 1], ch); else append(ch); if (eclen == 4) { int qv, wei; qv = (extcode[0] - '0') * 10 + (extcode[1] - '0'); wei = (extcode[2] - '0') * 10 + (extcode[3] - '0'); reset(); result[0] = qv + 0xa0; result[1] = wei + 0xa0; result[2] = '\0'; } } else { if ((ch == KEY_BACKSPACE) && (eclen > 0)) extcode[--eclen] = '\0'; else { result[0] = ch; result[1] = '\0'; } } /* generate candinates */ if ((eclen > 0) && (eclen < 4)) { int qv, wei, i, w; char buf[3]; char *p; if (eclen > 1) qv = (extcode[0] - '0') * 10 + (extcode[1] - '0'); else if (extcode[0] == '0') qv = 1; else qv = (extcode[0] - '0') * 10; wei = (eclen < 3) ? 0 : (extcode[2] - '0') * 10; p = candstr; for (i = 0; i 0) && (w