⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 infertt.c

📁 汉字在计算机内存放分为两种情况
💻 C
📖 第 1 页 / 共 3 页
字号:
/********************************************************************************\
*2005.6.13
*Designed for DT 
*author:zhangxy
*
\********************************************************************************/


#include "cellview.h"
#include "StrLrView.h"
#include "hzindex.h"
#include "InferTt.h"

#ifdef _WIN32
#include "Windows.h"
#else
#include <task.h>
#include <semaphor.h>
#include <main_task.h>
#include <osg.h>
#endif

/*#define TT_DEBUT  1*/

#ifndef NULL
#define NULL  0
#endif

#define HZBUF_LEN  130
#define INF_TXT_TOP  490


pLRVIEW    lrview0 = NULL;  /* 拼音输入区*//*应该建为内存保管型*/
pLRVIEW    lrview1 = NULL; /* 选择区*//*应该开辟为内存保管型*/
pCELLVIEW  cellview = NULL;/*汉字编辑区*/

static char  cmatrix[7][6]; /*max matrix to hold chars*/
static char  *BtnDef[] ={
 " ",
 ",.?!:@",
 "abc",
 "def",
 "ghi",
 "jkl",
 "mno",
 "pqrs",
 "tuv",
 "wxyz"
};

enum{
WAIT_ENTERN = 1,/*等待输入*/
ASC_ENTERNING,/*拼音输入*/
HZ_ENTERNING,/*汉字输入*/
SYMBAL_ENTERNING /*符号输入状态*/
};

static char *curpick ;/*用户当前选取字符串*/
static char picklen ;/*用户已经输入次数*/
static char *hzbuf ;/*汉字内码缓冲*/
static char tt_type = HZMODE;/*当前操作类型*/
static char tt_status = WAIT_ENTERN;/*当前输入法状态*/
static char useropt = 1;/*用户返回操作1:确定 0:取消*/

static semaphore_t *    tt_semphore;
static task_t	*	 tt_task;
typedef void (*Function)(void*);


static  int FindC(char *,char );
static  int InCbc6(char );
static  int InCbc5(char );
static  int InCbc4(char );
static  int InCbc3(char );
static  int InCbc2(char );
static  int InCbc1(char );
static  int DoStage1(char *);
static  int DoStage2(char *);
static  int DoStage3(char *);
static  int DoStage4(char *);
static  int DoStage5(char *);
static  int DoStage6(char *);

static  void AddHzToLr(pLRVIEW,char *);/*把内码加入某个LR*/

static  int DefDic(int ,char *);/*由输入产生字典内容*/

static  void AddPickToList(void);/*用户输入加入LR1或cellview*/	
static  int ProcessDic(void);/*处理字典,组合拼音输入LR0*/
static  void InferAddToLr(void *,char *);/*当前的词以及当前词的后续添加入LR0中*/
static  int  ValidAtIndex(char *);/*拼写不存在但存在后续或拼写存在者返回TRUE*/


static  void DrawLr1Text(void * ,int ,int  ,int ,int );
static void DrawLr1Cell(void *,int ,int ,int ,int ,int ,int );
static  void DrawLr0Text(void *,int ,int  ,int ,int );
static void DrawLr0Cell(void *,int ,int ,int ,int ,int ,int );
/*lr0,lr1复用此绘画框架,*/
static void DrawLr0Frame(void *);

void  	OkOnLrView1(int );/*发生在lrview1上的OK事件处理*/
void  	OkOnLrView0(int );/*发生在lrview上的OK事件处理*/
void 	decopt(void);/*汉字输入的反向操作*/
void 	SetCurPick(int );/*当前用户拣选字符串*/
/*
 infer  tt 的UI线程
*/
static void  TT_MainTask(void );/*INFERTT的主任务*/

/*
启动输入法,获得输入法的输入
*/
static  void ShowTTFrame(void);
int  TTEx(char *inistr,char *buf)
{
	/*初始化内码缓冲区*/
  /*初始化编辑及输入控件*/
	 CreateIndex();
	 cellview = CreateMultiView(120,395,240 ,24);
 	 lrview0 =  CreateLrList(120,435,240*2,80,25,0);/*建立容载型LRLIST*/
	 lrview1 =  CreateLrList(120,435,240*2,80,60,0);
	 
	 /*全局控制字,必需在这里初始化*/
	 curpick = NULL;/*用户当前选取字符串*/
 	 picklen  = 0;/*用户已经输入次数*/
	 hzbuf = NULL;/*汉字内码缓冲*/
	 tt_type = HZMODE;/*当前操作类型*/
 	 tt_status = WAIT_ENTERN;/*当前输入法状态*/
	 useropt = 1;/*用户返回操作1:确定 0:取消*/
	 
	 LockLrList(lrview1);/*将LR1置为锁定状态*/
 	 hzbuf	=(char*) malloc(HZBUF_LEN);
 	 
	 lrview0->OwnerDrawCell = DrawLr0Cell;
	 lrview0->OwnerDrawFrame = DrawLr0Frame;
	 
	 lrview1->OwnerDrawCell = DrawLr1Cell;
	 lrview1->OwnerDrawFrame = DrawLr0Frame;
	 
	 
	 if(inistr) SetTT(inistr);
	 
	/* GFMDrawRectangle(0, 0, 680, 550, 0, TRUE);*/
	 ShowTTFrame();
	 /*启动TT进程开始接受消息*/  
	  tt_semphore = semaphore_create_fifo (0);
	  tt_task = task_create((Function)TT_MainTask,NULL, 2048,6,"tt_task",0 );
	  
	 
	  semaphore_wait(tt_semphore);/*停止UI用户进程*/
	  
	  
	  task_kill(tt_task, 2, 0);
	  task_wait(&tt_task, 1, TIMEOUT_INFINITY);
	  task_delete(tt_task);
          
         
          semaphore_delete(tt_semphore);

  /*从编辑控件中拷贝输入字符入buf*/
  /*回收缓冲及控件资源*/
  	 if(useropt)
         GetViewChars(cellview,buf);   
         DestroyIndex();
         
         ReleaseMultiView(cellview);
         DeleteLrList(lrview0);
         DeleteLrList(lrview1);
         free(hzbuf);
         
         lrview0 = NULL;
         lrview1 = NULL;
         cellview = NULL;
         hzbuf = NULL;
         
       /*  GFMDrawRectangle(120, 375, 510, 30, 0, TRUE);  	
	 GFMDrawRectangle(120, 375, 510, 80, 0, TRUE);  /*擦除界面*/	 
	    
         
  	return useropt;
}
int  TT(char *buf)
{
    TTEx(NULL,buf);
}


/*****************************************************************************\

TT状态机

\******************************************************************************/
extern UINT32 MainTaskQueue;
static void  TT_MainTask(void)/*INFERTT的主任务*/
{
	int ret;
	T_FTA_Event  event;
	char *tbuf[] = {
	                	"当前模式:汉字输入",
	                	"当前模式:ABC输入",
	                	"当前模式:123输入"	
	               };
	
	while (1)
	{
		ret = DTOS_DRV_ReceiveMessage(MainTaskQueue, &event);
		if ( ret != SUCCESS )
		{
			continue;
	        }
	        
	        switch(event.code)
	        {
	        	
	         case BUTTON_MENU:
	         DelFromCellView(cellview);
	         break;
	         case 0x2EH:
	         case BUTTON_F3:/*暂作为输入法之间的切换*/
	                {
	                
	                   tt_type ++;
	                   tt_type %= 3;
	                   /*
	                   切换TT到别的状态
	                   */
	                   tt_status = WAIT_ENTERN;
	                   picklen = 0;
	                   
	                   LockLrList(lrview0);
	                   LockLrList(lrview1);
	                   FreeLrListItems(lrview1);
	                   FreeLrListItems(lrview0);
	                   ShowLrList(lrview0);
	                   
	                 
                           FNTDrawText(0, 0, 270,  INF_TXT_TOP, tbuf[tt_type] );	
                           FNTDrawText(0, 0, 125,  INF_TXT_TOP, "OK键确定");
          		   FNTDrawText(0, 0, 460,  INF_TXT_TOP, "退出/返回键取消");
	                }
	          	break;
	         case BUTTON_SELECT:
		 	{
		 	   if(tt_status == WAIT_ENTERN)
  		 	  /*激发信号量退出TT*/
  		 	      semaphore_signal(tt_semphore);

  		 	   else
		 	   switch(tt_type)
  		 	   {
  		 	   	case HZMODE:/*汉字操作*/
  		 	   	{
  		 	     	  if(tt_status == ASC_ENTERNING)/*假如是拼音输入状态,则进入汉字输入状态*/
  		 	     	  {     
  		 	     	  	
  		 	     	        if(picklen >  0)/*正确状态判断*/
  		 	     	        {
  		 	     	          	
  		 	     	  		tt_status = HZ_ENTERNING;
  		 	     	  		/*锁定LR0*/
  		 	     	  		LockLrList(lrview0);
  		 	     	  		ShowLrList(lrview0);/*擦掉*/
  		 	     	                      
  		 	     	  		/*解锁LR1,把选定的汗字负给LR1,然后显示LR1*/
  		 	     	  		UnLockLrList(lrview1);
  		 	     	  		FreeLrListItems(lrview1);
  		 	     	  		memset(hzbuf,0,HZBUF_LEN);
  		 	     	  	
  		 	     	  	 	     	  	
  		 	     	  		GetHzRangeBySpell( GetLrListData(lrview0,lrview0->coursorx + lrview0->baseindex),hzbuf);
  		 	     	  	
  		 	     	  		AddHzToLr(lrview1,hzbuf);
  		 	     	  		ShowLrList(lrview1);
  		 	     	  	}else
  		 	     	  		{
  		 	     	  		tt_status = WAIT_ENTERN;
  		 	     	  		 FNTDrawText(0, 0, 270,  INF_TXT_TOP, tbuf[tt_type] );
  		 	     	  		FNTDrawText(0, 0, 125,  INF_TXT_TOP, "OK键确定");
          					FNTDrawText(0, 0, 460,  INF_TXT_TOP, "退出/返回键取消");
  		 	     	  		}
  		 	        		#ifdef TT_DEBUT
						FNTDrawText(rand() % 6, 0, 60, 320, "tt_status == ASC_ENTERNING");
						#endif	
  		 	     	  	
  		 	     	  	/*FreeLrListItems(lrview0);/*转入汉字显示时晴空拼音列表*/
  		 	     	  		
  		 	     	  }else if(tt_status == HZ_ENTERNING ||tt_status == SYMBAL_ENTERNING)
  		 	     	  {
  		 	     	  	/*将选定的汉字交给编辑区*/
  		 	     	  	/*清空,锁定,并隐藏LR1,清空并解锁LR0*/
  		 	     	  	char *data = GetLrListData(lrview1,lrview1->coursorx + lrview1->baseindex);
  		 	     	  	AddToCellView(cellview,data);
  		 	     	  	LockLrList(lrview1);
  		 	     	  	ShowLrList(lrview1);
  		 	     	  	FreeLrListItems(lrview1);
  		 	     	  	
  		 	     	  	
  		 	     	   	tt_status = WAIT_ENTERN;    
  		 	     	   	/*UlockLrList(lrview0);/*允许绘画LR0*/
  		 	     	   	/*****//*重设输入字长*/
  		 	     	   	picklen = 0;  	
  		 	     	   	#ifdef TT_DEBUT
				         FNTDrawText(rand() % 6, 0, 60, 340, "tt_status == HZ_ENTERNING ||tt_status == SYMBAL_ENTERNING)");
					#endif	
					FNTDrawText(0, 0, 270,  INF_TXT_TOP, tbuf[tt_type] );
  		 	     	   	FNTDrawText(0, 0, 125,  INF_TXT_TOP, "OK键确定");
          				FNTDrawText(0, 0, 460,  INF_TXT_TOP, "退出/返回键取消");
  		 	     	  }
  		 	   	}break;
  		 	   	case ASCMODE:
  		 	   	{
  		 	   	   if(tt_status == ASC_ENTERNING ||tt_status == SYMBAL_ENTERNING)
  		 	     	  {
  		 	     	  	/*将选定的拼音交给编辑区*/
  		 	     	  	char *data = GetLrListData(lrview1,lrview1->coursorx+lrview1->baseindex);
  		 	     	  	AddToCellView(cellview,data);
  		 	     	  	/*清空,锁定,并隐藏LR1,清空并解锁LR0*/
  		 	     	  	LockLrList(lrview1);
  		 	     	  	ShowLrList(lrview1);
  		 	     	  	FreeLrListItems(lrview1);
  		 	     	  	
  		 	     	  	/*UnLockLrList(lrview0);*/
  		 	     	   	tt_status = WAIT_ENTERN; 
  		 	     	   	 FNTDrawText(0, 0, 270,  INF_TXT_TOP, tbuf[tt_type] );
  		 	     	   	FNTDrawText(0, 0, 125,  INF_TXT_TOP, "OK键确定");
          				FNTDrawText(0, 0, 460,  INF_TXT_TOP, "退出/返回键取消");
  		 	     	   	 #ifdef TT_DEBUT
				         FNTDrawText(rand() % 6, 0, 60, 340, "ASCMODE:tt_status == ASC_ENTERNING ||tt_status == SYMBAL_ENTERNING");
					#endif	     	
  		 	     	  }
  		 	     	  
  		 	   	}break;
  		 	   	
  		 	  }
  		 	  
  		 	 
		 	}
			break;
		 case BUTTON_PAGEDOWN :
		 {
		        if(((tt_type == ASCMODE)&&tt_status == ASC_ENTERNING) || tt_status == SYMBAL_ENTERNING || tt_status == HZ_ENTERNING)
			 {
				 	
				 	UnLockLrList(lrview1);
				 	MoveLrCursor(lrview1,-lrview1->ospnum,0);
				 	ShowLrList(lrview1);
		
			 }
			if(tt_status == ASC_ENTERNING && tt_type == HZMODE)
			 {
				 	 UnLockLrList(lrview0);
				 	 MoveLrCursor(lrview0,-lrview0->ospnum,0);
				 	 ShowLrList(lrview0);
	  		 }
	  	}
		 	break;	
    		 case BUTTON_PAGEUP:
    		 {
    		  	if(((tt_type == ASCMODE)&&tt_status == ASC_ENTERNING) || tt_status == SYMBAL_ENTERNING || tt_status == HZ_ENTERNING)
			 {
				 	
				 	UnLockLrList(lrview1);
				 	MoveLrCursor(lrview1,lrview1->ospnum,0);
				 	ShowLrList(lrview1);
		
			 }
			if(tt_status == ASC_ENTERNING && tt_type == HZMODE)
			 {
				 	 UnLockLrList(lrview0);
				 	 MoveLrCursor(lrview0,lrview0->ospnum,0);
				 	 ShowLrList(lrview0);
	  		 }
	  	}
    		 	break;
		 case BUTTON_CURSOR_UP:
		 {
		 	#ifdef TT_DEBUT
		 	FNTDrawText(2, 0, 60, 160, "BUTTON_CURSOR_UP");
		 	#endif
		 	if(tt_status == WAIT_ENTERN)
		 	{
		 	   MoveCursor(cellview,0,-1);	
	  		  /* DrawCellFrame(cellview);*/
		 	}	
		 }       
			break;
		 case BUTTON_CURSOR_DOWN:
		 	#ifdef TT_DEBUT
		 	FNTDrawText(2, 0, 60, 160, "BUTTON_CURSOR_DOWN");
		 	#endif
			if(tt_status == WAIT_ENTERN)
		 	{
		 	   MoveCursor(cellview,0,1);
		 	  
	  		   /*DrawCellFrame(cellview);*/	
		 	}	
			break;
		 case BUTTON_CURSOR_LEFT:
			{   
				
				#ifdef TT_DEBUT
				FNTDrawText(2, 0, 60, 160, "BUTTON_CURSOR_LEFT");
				#endif
				if(tt_status == WAIT_ENTERN)
				{
				 MoveCursor(cellview,-1,0);	
				
	  			/* DrawCellFrame(cellview);*/
				}
				 
				if(((tt_type == ASCMODE)&&tt_status == ASC_ENTERNING) || tt_status == SYMBAL_ENTERNING || tt_status == HZ_ENTERNING)
				 {
				 	
				 	UnLockLrList(lrview1);
				 	MoveLrCursor(lrview1,-1,0);
				 	ShowLrList(lrview1);
		
				 }
				if(tt_status == ASC_ENTERNING && tt_type == HZMODE)
				 {
				 	 UnLockLrList(lrview0);
				 	 MoveLrCursor(lrview0,-1,0);
				 	 ShowLrList(lrview0);
	  
				 }
			}
			break;
		 case BUTTON_CURSOR_RIGHT:
			{
				#ifdef TT_DEBUT
				FNTDrawText(2, 0, 60, 160, "BUTTON_CURSOR_RIGHT");
				#endif
				if(tt_status == WAIT_ENTERN)
				{
				 MoveCursor(cellview,1,0);
				
	  			 /*DrawCellFrame(cellview);*/
				} 
				if(((tt_type == ASCMODE)&&tt_status == ASC_ENTERNING) || tt_status == SYMBAL_ENTERNING || tt_status == HZ_ENTERNING)
				{
					 UnLockLrList(lrview1);
					 MoveLrCursor(lrview1,1,0);
					 ShowLrList(lrview1);
	 
				 	
				}
				if(tt_status == ASC_ENTERNING && tt_type == HZMODE)
				{
					 UnLockLrList(lrview0);
				 	 MoveLrCursor(lrview0,1,0);
				 	 ShowLrList(lrview0);
	 
				}	
			}
			break;	 
		 case  BUTTON_EXIT :
		 case  BUTTON_CANCEL:
		 { 
		 	
		 	
		     if(tt_status == WAIT_ENTERN)/*无输入状态等待退出*/
		    {
		    	
		    	 useropt = 0;
		    	/*激发信号量退出任务*/
		    	 semaphore_signal(tt_semphore);
		    }
		    
		    if(tt_status == HZ_ENTERNING)
		    {
		      	LockLrList(lrview1);
		      	FreeLrListItems(lrview1);
		      	ShowLrList(lrview1);/*清空隐藏LR1*/
		      	
		      	ProcessDic();
		      	UnLockLrList(lrview0);/*显示上次的信息*/
		      	ShowLrList(lrview0);
		      	tt_status = ASC_ENTERNING;
		      	#ifdef TT_DEBUT
				FNTDrawText(rand() % 6, 0, 60, 240, "tt_status ==HZ_ENTERNING");
			#endif
			
			 
  		 	     		  	
		      
		    }else if(tt_type == HZMODE && tt_status == ASC_ENTERNING)
		    {	
		    	
		    	 FreeLrListItems(lrview0);/*先清空上次的内容*/
		    	 
		    	 #ifdef TT_DEBUT
		    	 {
		    	  char buf[4];
		    	  sprintf(buf,"Pick len = %d",picklen);
			  FNTDrawText(rand() % 6, 0, 60, 340, buf);
			 }
			 #endif
			 
		         decopt();/*反操作*/
		         
		         UnLockLrList(lrview0);/*显示上次的信息*/
		      	 ShowLrList(lrview0);/*画出新的*/
		      	 
		      	 #ifdef TT_DEBUT
		      	 {
		      	  char buf[4];
		    	  sprintf(buf,"Pick len = %d",picklen);
			  FNTDrawText(rand() % 6, 0, 60, 360, buf);
			 }
			 #endif
			 
		      	 #ifdef TT_DEBUT
				FNTDrawText(rand() % 6, 0, 60, 260, "tt_type == HZMODE && tt_status == ASC_ENTERNING");
			 #endif
			 
		      	 if(picklen <= 0)
		      	 {
		      	     FNTDrawText(0, 0, 270,  INF_TXT_TOP, tbuf[tt_type] );
		      	     FNTDrawText(0, 0, 125,  INF_TXT_TOP, "OK键确定");
          		     FNTDrawText(0, 0, 460,  INF_TXT_TOP, "退出/返回键取消");	
		      	 }
		    }
		    else if( tt_status == SYMBAL_ENTERNING)
		    {
		      	 LockLrList(lrview1);/*当前是符号输入状态就解除此状态*/
		      	 FreeLrListItems(lrview1);
		      	 ShowLrList(lrview1); 
		      	 tt_status = WAIT_ENTERN;
		      	 FNTDrawText(0, 0, 270,  INF_TXT_TOP, tbuf[tt_type] ); 
		      	 FNTDrawText(0, 0, 125,  INF_TXT_TOP, "OK键确定");
          		 FNTDrawText(0, 0, 460,  INF_TXT_TOP, "退出/返回键取消");
		      	 #ifdef TT_DEBUT
				FNTDrawText(rand() % 6, 0, 60, 280, "tt_status == SYMBAL_ENTERNING");
			#endif
		      	 	
		    }/*else if(tt_type == HZTYPE && tt_status == WAIT_ENTERN)
		      /*激活UI退出*/ ;
		    if(tt_status == ASC_ENTERNING && tt_type == ASCMODE  )
		    {
		    	 LockLrList(lrview1);
		      	 FreeLrListItems(lrview1);
		      	 ShowLrList(lrview1); 
		      	 tt_status = WAIT_ENTERN; 
		      	 
		      	 FNTDrawText(0, 0, 270,  INF_TXT_TOP, tbuf[tt_type] );
		      	 FNTDrawText(0, 0, 125,  INF_TXT_TOP, "OK键确定");
          		 FNTDrawText(0, 0, 460,  INF_TXT_TOP, "退出/返回键取消");
		      	#ifdef TT_DEBUT
				FNTDrawText(rand() % 6, 0, 60, 300, "tt_status == ASC_ENTERNING && tt_type == ASCMODE");
			#endif	
		    }
		    
		    
		 }
		 break;
	  	 case BUTTON_0:/*空格键*/
  	   	 case BUTTON_1:/*符号键*/
  		 case BUTTON_2:
  		 case BUTTON_3:
  		 case BUTTON_4:
  		 case BUTTON_5:
  		 case BUTTON_6:
  		 case BUTTON_7:
  		 case BUTTON_8:
  		 case BUTTON_9:
  		 {     
  		 	
  		 	/*if(BUTTON_2 <= event.code && event.code<= BUTTON_9)*/
  		 	switch(tt_type)
  		 	{  
  		 	   case ASCMODE:
  		 	   {
  		 	   	
  		 	   	 
  		 	   	if( tt_status == WAIT_ENTERN)
  		 	     	{
  		 	     		if(event.code != 0)
  		 	     		{
  		 	     			SetCurPick(event.code);
  		 	     			UnLockLrList(lrview1);
  		 	     			FreeLrListItems(lrview1);
  		 	     			AddPickToList();/*把选定的字符加入LR1*/
  		 	     			ShowLrList(lrview1);
  		 	     		
  		 	     			if(event.code == 1)
  		 	     		 	tt_status = SYMBAL_ENTERNING;
  		 	     			else 
  		 	     		 	tt_status = ASC_ENTERNING;
  		 	     		 }else
  		 	     		 {
  		 	     		 	SetCurPick(event.code);
  		 	     			ProcessPick();
  		 	     		 } 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -