📄 61t9_input.c
字号:
//==========================================================================//
// 文件名称: 61T9_Input.c //
// 功能描述: T9拼音输入法模块 //
// 维护记录: 2005-11-10 v1.0 //
//==========================================================================//
// //
// 小丑 Mz出品 //
// All Rights Reserved //
// V1.0 //
//声 明: //
// 以下代码仅提供给网友免费学习使用,非商业用途 //
//--------------------------------------------------------------------------//
//描 述: //
// 1、根据网友张凯、徐文军先生的PY输入法子程序改编,增加索引、完善主程//
// 序、修改输入法信息收集的数据整合,使之更方便不同用户使用不同的显//
// 示器接口API,并使之可在unSP IDE下进行仿真。 //
// 2、由于unSP IDE不支持中文的调试信息输出,所以在调试时,用户是看不到//
// 信息的,不过本工程还是保留了此项功能,以便后续有可能的情况:) //
// 3、用户想看调试结果时,最好在断点处,观察Temp_HZGet当中的元素,在 //
// IDE的变量观察窗当中可以看到中文。 //
// 4、按键对应(根据我自己的手机设置的,全部在PC的小键盘操作): //
// Num /:上一拼音?*:下一拼音 //
// 7:pqrs 8:tuv 9:wxyz -:前翻页 //
// 4:ghi 5:jkl 6:mno +:后翻页 //
// 1:? 2:abc 3:def 回车键:输入确认,每一次输入都以回车结束//
// 0:删掉一个字母 .和空格:输入状态和选字状态切换 //
//--------------------------------------------------------------------------//
#include <string.h>
#include <stdio.h>
#include "PY_mb.h"
#include "61T9PY_index.h"
//
struct T9PY_Show Temp_HZGet;
//========================================================================
// 语法格式: unsigned char t9PY_ime(char *strInput_t9PY_str)
// 实现功能: 查找完全匹配的索引数据,for T9
// 参数: char *strInput_t9PY_str 当前输入的字符串
// 返回值: 输出完全匹配的字符串个数,为0时表示无结果
//========================================================================
unsigned char t9PY_ime(char *strInput_t9PY_str)
{
struct T9PY_Index *cpHZ,*cpHZedge,*cpHZTemp;
unsigned char i,j,cInputStrLength;
Temp_HZGet.CPT9_PY_Number = 0; //完全匹配组数
j = 0; //j为匹配最大值
cInputStrLength=strlen(strInput_t9PY_str); //输入拼音串长度//
if(*strInput_t9PY_str=='\0')return(0); //如果输入空字符返回0//
cpHZ=&(t9PY_index2[0]); //查首字母索引//
cpHZedge=(struct T9PY_Index*)(t9PY_index2+sizeof(t9PY_index2)/sizeof(t9PY_index2[0]));
// strInput_t9PY_str++; //指向拼音串第二个字母//
while(cpHZ < cpHZedge) //待查询记录条数
{
for(i=0;i<cInputStrLength;i++)
{
if(*(strInput_t9PY_str+i)!=*((*cpHZ).t9PY_T9+i)) //检查字符串匹配
{
if (i+1 > j)
{
j=i+1; //j为匹配最大值
cpHZTemp=cpHZ;
}
break; //发现字母串不配,退出//
}
}
if((i==cInputStrLength) && (Temp_HZGet.CPT9_PY_Number<16)) //字母串全配,最多8组
{
Temp_HZGet.CPT9_PY_Mb[Temp_HZGet.CPT9_PY_Number] = cpHZ;
Temp_HZGet.CPT9_PY_Number++;
}
cpHZ++;
}
if(j!=cInputStrLength) //不完全匹配输出最多匹配的1组
Temp_HZGet.CPT9_PY_Mb[0]=cpHZTemp;
return (Temp_HZGet.CPT9_PY_Number); //输出完全匹配组数,0为无果而终//
}
//========================================================================
// 语法格式: void T9PY_Get(void)
// 实现功能: T9输入法控制程序,包括显示控制和检索等,用户可以修改里面的
// 有关显示部分的代码,使用printf和scanf仅为调试而已
// 参数: 无
// 返回值: 无
//========================================================================
void T9PY_Get(void)
{
unsigned char temp; //中间变量
unsigned int Update_flag=0;
//....just for test
char name[1];
//....end
char tempchar;
struct T9PY_Index *cpTemp;
//初始化有关拼音输入时刷新及最终结果的结构体
for(temp=0;temp<8;temp++)
Temp_HZGet.PY_String[temp] = 0;
Temp_HZGet.PY_String_Index = 0;
Temp_HZGet.HZ_Add = 0;
Temp_HZGet.HZ_GB[1] = 0;
Temp_HZGet.PY_T9Number = 0;
Temp_HZGet.HZ_Select = 0;
Temp_HZGet.HZ_Over = 0;
printf ("请按键:2-abc 3-def 4-ghi 5-jkl 6-mno 7-pqrs 8-tuv 9-wxyz \n"); //
while(!(Temp_HZGet.HZ_Over))
{
scanf( "%s",name);
tempchar = *name;
if(tempchar!=0)
{
Update_flag = 1; //显示刷新标志位
switch (tempchar)
{
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': //符合要求的拼音字母输入,则进行设整
if (~Temp_HZGet.HZ_Select)
{
Temp_HZGet.PY_String[Temp_HZGet.PY_String_Index] = tempchar;
Temp_HZGet.PY_String_Index++;
Temp_HZGet.HZ_Add = 0;
if(!(t9PY_ime(Temp_HZGet.PY_String)))
{ //若输入无效,则删掉当前输入的字母
Temp_HZGet.PY_String_Index--;
Temp_HZGet.PY_String[Temp_HZGet.PY_String_Index] = 0;
t9PY_ime(Temp_HZGet.PY_String);//重新调整
}
}
break;
case '/': //符合索引的拼音串的索引号指向下一个
if(Temp_HZGet.PY_T9Number > 0)Temp_HZGet.PY_T9Number--;
break;
case '*': //符合索引的拼音串的索引号指向上一个
Temp_HZGet.PY_T9Number++;
if(Temp_HZGet.PY_T9Number > Temp_HZGet.CPT9_PY_Number)Temp_HZGet.PY_T9Number--;
break;
case '-': //汉字显示时向上翻页
if(Temp_HZGet.HZ_Add > 12) Temp_HZGet.HZ_Add -= 12;
break;
case '+': //汉字显示时向下翻页
if(Temp_HZGet.HZ_Add < strlen((*cpTemp).PY_mb)-12) Temp_HZGet.HZ_Add+=12;
break;
case '0': //按0键,则删除刚输入的一个字母
if(Temp_HZGet.PY_String_Index>0) Temp_HZGet.PY_String_Index--;
Temp_HZGet.PY_String[Temp_HZGet.PY_String_Index] = 0x00;
Temp_HZGet.HZ_Add = 0;
t9PY_ime(Temp_HZGet.PY_String);
break;
case '.': //输入状态和选字状态切换
case '\n':
case '=':
Temp_HZGet.HZ_Select ^=1;
break;
default:
Update_flag = 0; //假如是没有定义的键按下,则不允许显示刷新
break;
}
}
//....可在此处清看门狗
if(Update_flag!=0) //当显示刷新非零时,表示有效键按下了,需要刷新
{
Update_flag = 0; //置零
if (Temp_HZGet.HZ_Select) //已有回车键按下后,即当前处于选字状态
{
printf ("选");
cpTemp=(struct T9PY_Index *)Temp_HZGet.CPT9_PY_Mb[Temp_HZGet.PY_T9Number];
if((cpTemp != PY_mb_space) && (tempchar>='1') && (tempchar<='9'))
{ //判断当前的按键是否符合选字要求?即在选字状态下有1~9键按下
Temp_HZGet.HZ_Over = 1; //结束标识置1
Temp_HZGet.PY_T9Number = 0;
//获取拼音输入结果,得到的是汉字的GB码,十六位
Temp_HZGet.HZ_GB[0] = *((*cpTemp).PY_mb+Temp_HZGet.HZ_Add+(tempchar-'1'));
printf ("\n");
}
else
{ //显示当前可选的汉字,用户可根据自己的显示器接口函数修改代码
printf (":");
printf ((*cpTemp).PY_mb+Temp_HZGet.HZ_Add);
}
}
else
{ //以下代码显示当前的拼音字母串,用户可据自己的显示器接口修改
printf ("拼");
for(temp = Temp_HZGet.PY_T9Number;temp<Temp_HZGet.CPT9_PY_Number;temp++)
{ //可加入显示控制,以控制当前一行显示多少个串
cpTemp=(struct T9PY_Index *)Temp_HZGet.CPT9_PY_Mb[temp];
printf (":");
printf ((*(cpTemp)).PY);
}
printf ("\n"); //.....
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -