设为首页 友情链接
在线留言 发表文章
加入收藏 广告联系

刺猬首页

| 专案技术 | 网络技术 | 图形图象 | 网络编程 | 网页设计 | 操作系统 | 服务器 | 技术白皮书 | 在线实验室 | 刺猬论坛 |
小说专版  | 数据库 | 设计赏析 | 存储频道 | 网络安全 | 私服架设 |  Solaris | 网站评估 | PC维护技巧 | 下载中心 | 博 客 |
专   题: | Linux | java | cisco | 防病毒 | 刀片 | SOA | iscsi | ASP.NET | SQL | Oracle |
您现在的位置: IT公社 IT community >> Linux专题 >> Linux应用技巧 >> 教程正文 用户登录 新用户注册
专 题 栏 目
最 新 热 门
最 新 推 荐
相 关 文 章
Linux中的Ftp客户端──…
Linux操作系统下APE格式…
教你在Linux操作系统下也…
配置VNC 使window下vnc访…
浅谈Linux操作系统KDE桌…
在Linux操作系统下用Win…
linux虚拟光驱介绍
用语言控制Linux:Linux…
用语言控制Linux:Linux…
Windows打印机管理向Lin…
  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] = '\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 <= 9; i++) 

  { 

  w = wei + i; 

  if ((w > 0) && (w <= 94)) 

  { 

  buf[0] = qv + 0xa0; 

  buf[1] = wei + i + 0xa0; 

  buf[2] = '\0'; 

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

  } 

  } 

  }

  return 0;

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

static void reset(void) 

  { 

  eclen = 0; 

  extcode[0] = '\0'; 

  candstr[0] = '\0'; 

  result[0] = '\0'; 

  } 

  static void append(ch) 

  int ch; 

  {

  extcode[eclen++] = ch; 

  extcode[eclen] = '\0'; 

  } 

  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 $@ 

  rm ?f *.o

然后只需要在这个目录下键入make,就可以创建一个可执行的qvwei文件。在运行炎黄中文平台之后运行这个qvwei文件,就可以把这个输入法添加到炎黄中文平台中,平台会自动给这个输入法分配切换快捷键。

注意事项:

1:随同打包的还有四个文件,它们分别是impi.c、impi.h、incommon.c和imcommon.h,它们的作用是用来生成libimpi.a。提供这四个函数源代码的用意是方便用户对输入法的理解。但是绝对不要改变这四个文件并且重新编译libimi.a,否则炎黄中文平台有可能无法识别新生成的输入法。

2:以上只是一个简单的示例,针对不同的输入法类型,输入法的核心代码可能要复杂得多。

Linux联盟收集整理

频道声明:本频道的文章除部分特别声明禁止转载的专稿外,可以自由转载.但请务必注明出出处和原始作者 文章版权归本频道与文章作者所有.对于被频道转载文章的个人和网站,我们表示深深的谢意。

原始作者:佚名 录入时间:2007-1-3 3:55:27
信息来源:不详 投稿信箱:itqoo@126.com
教程录入:itqoo    责任编辑:itqoo 
  • 上一个教程:

  • 下一个教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    - 关于我们 - 合作伙伴 - 友情链接 - 广告刊登 - 投稿热线 - 在线留言版权声明联系方式 -
    IT公社版权所有 粤ICP备05127012号
    Copyrigh@2005-2006 itqoo.com.Inc All Rights Reserved  推荐分辨率 1024*768
    联系站长:E-Mail:itqoo@126.com     MSN:urchincc@hotmail.com    QQ:点击这里给我发消息
    特别感谢:亿太网络提供空间支持