欢迎大家光临【无师自通-教程网】您的到来是我们的荣幸。本站提供photoshop教程,ps教程,flash教程,cad教程,网页制作教程,excel教程,asp教程,vb教程,3d教程,c语言教程,html教程,coreldraw教程,dreamweaver教程,java教程,3dmax教程 等各种教程为主题的内容和服务,相信您会在这里找到您所需要的东东。无师自通伴您一生-谢谢您的光临!!
网站地图 设为首页
简繁切换 加入收藏
栏目待定 留言本站
您现在的位置: 无师自通-教程网 >> 操作系统 >> Linux >> 中文化 >> 教程正文

  没有公告

教程: Linux教程-中文化-炎黄中文平台的输入法添加 更多...
教程: Linux教程-中文化-炎黄中文平台的输入法添加
在炎黄中文平台上,用户可以自行添加输入法。炎黄中文平台的输入部分的程序设计使用了一个主导模块作为和平台的接口,它和各输入法模块之间采用统一的、规范的界面。各个输入法可看作是一个个过滤,输入ASCII码,返回得到的汉字。

输入法的主导模块以动态连接库(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] = '';
result[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] = '';

}

}

else
{

if ((ch == KEY_BACKSPACE) && (eclen > 0))
extcode[--eclen] = '';
else
{
result[0] = ch;
result[1] = '';
}

}

/* 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 <= 9; i )

{
w = wei i;
if ((w > 0) && (w <= 94))
{

buf[0] = qv 0xa0;
buf[1] = wei i 0xa0;
buf[2] = '';

p = sprintf(p, " %d: %s", i, buf);

}

}

}

return 0;

上面的代码中用到了另外三个函数,这三个函数可以定义为局部函数,它们的实现代码如下所示:

static void reset(void)

{

eclen = 0;
extcode[0] = '';
candstr[0] = '';
result[0] = '';

}

static void append(ch)
int ch;

{

extcode[eclen ] = ch;
extcode[eclen] = '';

}

static void comp_appe(prevch, ch)
int prevch;
int ch;

{

if (prevch == '0')

{

if (ch != '0')

append(ch);

}

else if (prevch == '9')

{

if (ch <= '4')
append(ch);

}

else

append(ch);

}

把上面的代码拼接起来,就是一个完整的qvwei.c文件。

编译和链接
最后可以编写一个MakeFile来创建可执行的输入法文件。一个Makefile的例子如下所示:

qvwei:

cc –c qvwei.c

cc –o $@ qvwei.o libimpi.a

strip $@

[1] [2] 下一页

教程录入:admin    责任编辑:admin 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     
     
     
     

    dos入门教程

    dos入门教程-2

    dos入门教程-1
    免责声明!本站资料大部分来自于互联网,其版权归原作者或其他合法者所有.如内容涉及或侵犯了您的权益,请通知本人,我将尽快处理!.欢迎您的光临。
    辽ICP备07003958号
    无师自通,伴你一生-教程网