wbx.cpp

来自「vt100终端仿真程序」· C++ 代码 · 共 498 行

CPP
498
字号
// Wbx.cpp: implementation of the CWbx class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"

#include <malloc.h>

#include "vt100.h"
#include "codeconvert.h"

#include "Wbx.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

extern CCodeConvert csCodeConv;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CWbx::CWbx()
{

}

CWbx::~CWbx()
{

}

int CWbx::Init()
{
	int iNum,iLen;
	FILE *hFile;
	char szTemp[600];

	iIndex=0;
	memset(szGbBuf1,0,sizeof(szGbBuf1));
	memset(szGbBuf2,0,sizeof(szGbBuf2));
	memset(szGbBuf3,0,sizeof(szGbBuf3));

	hFile=fopen("\\disk\\wbx.txt","r");
	if(hFile==NULL)
		return 1;

	fgets(szGbBuf1,60,hFile);
	szGbBuf1[50]=0;
	for(iNum=0;iNum<25;iNum++){
		if(!feof(hFile)){
			fgets(&szGbBuf2[iNum][0],60,hFile);
			szGbBuf2[iNum][50]=0;
		}
	}
	if(iNum<25){
		fclose(hFile);
		return 2;
	}

	for(iNum=0;iNum<625;iNum++){
		if(!feof(hFile)){
			memset(szTemp,0,sizeof(szTemp));
			fgets(szTemp,600,hFile);
			iLen=strlen(szTemp);
			szTemp[iLen-1]=0;
			if((szGbBuf3[iNum]=(char *)malloc(iLen))==NULL){
				break;
			}
			else{
				strcpy(szGbBuf3[iNum],szTemp);
			}
		}
	}
	if(iNum<625){
		fclose(hFile);
		return 2;
	}

	fclose(hFile);

	return 0;
}

int CWbx::Release()
{
	int iNum;

	for(iNum=0;iNum<625;iNum++){
		free(szGbBuf3[iNum]);
	}
	
	return 0;
}

int CWbx::PageUp()
{
	int iLen,iLoop,iNum,iRow,iCol;
	
	iLen=strlen(szCurCode);
	switch(iLen){
	case 1:
		iRow=szCurCode[0]-'a';
		iCol=szEndCode[0]-'a'-strlen(szGbBuf)/2+1;
		if(iCol<0)
			return 0;
		
		szEndCode[0]=szEndCode[0]-strlen(szGbBuf)/2;

		if((iCol-8)==-1){
			szGbBuf[0]=szGbBuf1[iRow*2];
			szGbBuf[1]=szGbBuf1[iRow*2+1];
		}
		else{
			szGbBuf[0]=szGbBuf2[iRow][iCol*2-16];
			szGbBuf[1]=szGbBuf2[iRow][iCol*2-15];
		}

		for(iNum=2;iNum<16;iNum++){
			szGbBuf[iNum]=szGbBuf2[iRow][(iCol+1)*2-16];
			szGbBuf[iNum+1]=szGbBuf2[iRow][(iCol+1)*2-15];
			szGbBuf[iNum+2]=0;
			iNum++;
			iCol++;
		}

		break;

	case 2:
		iNum=0;
		while(strncmp(szCurWbBuf3+iNum*2,szEndCode,2)!=0){
			iNum++;
		}

		iCol=(iNum+1)*2-strlen(szGbBuf);
		if(iCol<0)
			return 0;

		if((iCol-16)<0){
			iRow=szCurCode[0]-'a';
			iNum=szCurCode[1]-'a';

			szGbBuf[0]=szGbBuf2[iRow][iNum*2];
			szGbBuf[1]=szGbBuf2[iRow][iNum*2+1];
		}
		else{
			szGbBuf[0]=szCurGbBuf3[iCol-14];
			szGbBuf[1]=szCurGbBuf3[iCol-13];
		}

		iLoop=2;
		while(iLoop<16){
			szGbBuf[iLoop]=szCurGbBuf3[iCol-14];
			szGbBuf[iLoop+1]=szCurGbBuf3[iCol-13];
			szGbBuf[iLoop+2]=0;
			iLoop+=2;iCol+=2;
		}
		strncpy(szEndCode,szCurWbBuf3+iCol-16,2);

		break;

	default:
		return 1;
	}

	return 0;
}

int CWbx::Select(int iIndex,WORD *pwGbCode)
{

	if(strlen(szGbBuf)!=0){
		*pwGbCode=MAKEWORD((unsigned char)szGbBuf[iIndex*2],(unsigned char)szGbBuf[iIndex*2+1]);
	}

	return 0;
}

int CWbx::SearchCode(char *pszInBuf)
{
	int iLen,iBufLen,iLoop;
	int iRow,iCol;

	strcpy(szCurCode,pszInBuf);
	iLen=strlen(szCurCode);
	switch(iLen){
	case 1:
		memset(szGbBuf,0,sizeof(szGbBuf));
		memset(szEndCode,0,sizeof(szEndCode));

		//get 1 
		iCol=szCurCode[0]-'a';
		szGbBuf[0]=szGbBuf1[iCol*2];
		szGbBuf[1]=szGbBuf1[iCol*2+1];

		//get 2,max to 7
		iRow=iCol;
		strncpy(szGbBuf+2,szGbBuf2[iRow],14);
		szEndCode[0]='a'+6;

		break;
		
	case 2:
		memset(szGbBuf,0,sizeof(szGbBuf));
		memset(szEndCode,0,sizeof(szEndCode));

		iRow=szCurCode[0]-'a';
		iCol=szCurCode[1]-'a';

		//get 2
		szGbBuf[0]=szGbBuf2[iRow][iCol*2];
		szGbBuf[1]=szGbBuf2[iRow][iCol*2+1];

		//get 3 , max to 7
		GetGbBuf3();

		iBufLen=strlen(szCurGbBuf3);
		if(iBufLen==0)
			break;;

		if(iBufLen>14){
			strncpy(szGbBuf+2,szCurGbBuf3,14);
			szEndCode[0]=szCurWbBuf3[12];
			szEndCode[1]=szCurWbBuf3[13];
		}
		else{
			strcpy(szGbBuf+2,szCurGbBuf3);
			szEndCode[0]=szCurWbBuf3[iBufLen-2];
			szEndCode[1]=szCurWbBuf3[iBufLen-1];
		}

		break;

	case 3:
		iLen=0;
		while(szCurWbBuf3[iLen]!=szCurCode[2]&&iLen<strlen(szCurWbBuf3)){
			iLen+=2;
		}

		if(iLen<strlen(szCurWbBuf3)){
			memset(szGbBuf,0,sizeof(szGbBuf));
			memset(szEndCode,0,sizeof(szEndCode));

			iLoop=0;
			while(szCurWbBuf3[iLen]==szCurCode[2]){
				szGbBuf[iLoop]=szCurGbBuf3[iLen];
				szGbBuf[iLoop+1]=szCurGbBuf3[iLen+1];
				iLen+=2;iLoop+=2;
			}
		}
		else{
			szCurCode[2]=0;
		}
		
		break;

	case 4:
		iLen=0;
		while((szCurWbBuf3[iLen]!=szCurCode[2]||szCurWbBuf3[iLen+1]!=szCurCode[3])&&iLen<strlen(szCurWbBuf3)){
			iLen+=2;
		}

		if(iLen<strlen(szCurWbBuf3)){
			memset(szGbBuf,0,sizeof(szGbBuf));
			memset(szEndCode,0,sizeof(szEndCode));

			iLoop=0;
			while(szCurWbBuf3[iLen+1]==szCurCode[3]){
				szGbBuf[iLoop]=szCurGbBuf3[iLen];
				szGbBuf[iLoop+1]=szCurGbBuf3[iLen+1];
				iLen+=2;iLoop+=2;
			}
		}
		else
			szCurCode[3]=0;

		break;

	default:
		memset(szGbBuf,0,sizeof(szGbBuf));
		memset(szEndCode,0,sizeof(szEndCode));

		break;

	}

	return 0;
}

int CWbx::GetDispBuf(wchar_t *pszDispBuf)
{
	int iLen,iLoop,iCol,iRow;
	wchar_t wszTemp[80];
	WORD wGB;

	wcscpy(pszDispBuf,TEXT("五笔:"));
	memset(wszTemp,0,sizeof(wszTemp));
	mbstowcs(wszTemp,szCurCode,sizeof(szCurCode));
	wcscat(pszDispBuf,wszTemp);
	wcscat(pszDispBuf,TEXT(" "));

	iLen=strlen(szCurCode);
	switch(iLen){
	case 1:
		if((szEndCode[0]-'a')==6){
			wcscat(pszDispBuf,TEXT("0:"));
			wGB=MAKEWORD((unsigned char)szGbBuf[0],(unsigned char)szGbBuf[1]);
			csCodeConv.GBToUnicode(wGB,pszDispBuf+wcslen(pszDispBuf));
			pszDispBuf[wcslen(pszDispBuf)]=' ';
			
			for(iLoop=0;iLoop<7;iLoop++){
				pszDispBuf[wcslen(pszDispBuf)]='1'+iLoop;
				pszDispBuf[wcslen(pszDispBuf)]=':';
				wGB=MAKEWORD((unsigned char)szGbBuf[iLoop*2+2],(unsigned char)szGbBuf[iLoop*2+3]);
				csCodeConv.GBToUnicode(wGB,pszDispBuf+wcslen(pszDispBuf));
				pszDispBuf[wcslen(pszDispBuf)]='a'+iLoop;
				pszDispBuf[wcslen(pszDispBuf)]=' ';
			}
		}
		else{
			iCol=szEndCode[0]-'a'-strlen(szGbBuf)/2+1;
			for(iLoop=0;iLoop<strlen(szGbBuf)/2;iLoop++){
				pszDispBuf[wcslen(pszDispBuf)]='0'+iLoop;
				pszDispBuf[wcslen(pszDispBuf)]=':';
				wGB=MAKEWORD((unsigned char)szGbBuf[iLoop*2],(unsigned char)szGbBuf[iLoop*2+1]);
				csCodeConv.GBToUnicode(wGB,pszDispBuf+wcslen(pszDispBuf));
				pszDispBuf[wcslen(pszDispBuf)]='a'+iCol;
				pszDispBuf[wcslen(pszDispBuf)]=' ';
				iCol++;
			}
		}

		break;

	case 2:
		iCol=0;
		while(strncmp(szCurWbBuf3+iCol*2,szEndCode,2)!=0){
			iCol++;
		}

		if(iCol==6){
			wcscat(pszDispBuf,TEXT("0:"));
			wGB=MAKEWORD((unsigned char)szGbBuf[0],(unsigned char)szGbBuf[1]);
			csCodeConv.GBToUnicode(wGB,pszDispBuf+wcslen(pszDispBuf));
			pszDispBuf[wcslen(pszDispBuf)]=' ';
			
			for(iLoop=0;iLoop<7;iLoop++){
				pszDispBuf[wcslen(pszDispBuf)]='1'+iLoop;
				pszDispBuf[wcslen(pszDispBuf)]=':';
				wGB=MAKEWORD((unsigned char)szGbBuf[iLoop*2+2],(unsigned char)szGbBuf[iLoop*2+3]);
				csCodeConv.GBToUnicode(wGB,pszDispBuf+wcslen(pszDispBuf));
				pszDispBuf[wcslen(pszDispBuf)]=szCurWbBuf3[iLoop*2];
				pszDispBuf[wcslen(pszDispBuf)]=szCurWbBuf3[iLoop*2+1];
				pszDispBuf[wcslen(pszDispBuf)]=' ';
			}
		}
		else{
			iCol=iCol-strlen(szGbBuf)/2+1;
			for(iLoop=0;iLoop<strlen(szGbBuf)/2;iLoop++){
				pszDispBuf[wcslen(pszDispBuf)]='0'+iLoop;
				pszDispBuf[wcslen(pszDispBuf)]=':';
				wGB=MAKEWORD((unsigned char)szGbBuf[iLoop*2],(unsigned char)szGbBuf[iLoop*2+1]);
				csCodeConv.GBToUnicode(wGB,pszDispBuf+wcslen(pszDispBuf));
				pszDispBuf[wcslen(pszDispBuf)]=szCurWbBuf3[iCol*2];
				pszDispBuf[wcslen(pszDispBuf)]=szCurWbBuf3[iCol*2+1];
				pszDispBuf[wcslen(pszDispBuf)]=' ';
				iCol++;
			}
		}

		break;

	case 3:
		iCol=0;
		while(szCurWbBuf3[iCol]!=szCurCode[2]&&iCol<strlen(szCurWbBuf3)){
			iCol+=2;
		}
	
		for(iLoop=0;iLoop<strlen(szGbBuf)/2;iLoop++){
			pszDispBuf[wcslen(pszDispBuf)]='0'+iLoop;
			pszDispBuf[wcslen(pszDispBuf)]=':';
			wGB=MAKEWORD((unsigned char)szGbBuf[iLoop*2],(unsigned char)szGbBuf[iLoop*2+1]);
			csCodeConv.GBToUnicode(wGB,pszDispBuf+wcslen(pszDispBuf));
			pszDispBuf[wcslen(pszDispBuf)]=szCurWbBuf3[iCol+1];
			pszDispBuf[wcslen(pszDispBuf)]=' ';
			iCol+=2;
		}

		break;

	case 4:
		iCol=0;
		while((szCurWbBuf3[iCol]!=szCurCode[2]||szCurWbBuf3[iCol+1]!=szCurCode[3])&&iLen<strlen(szCurWbBuf3)){
			iCol+=2;
		}

		for(iLoop=0;iLoop<strlen(szGbBuf)/2;iLoop++){
			pszDispBuf[wcslen(pszDispBuf)]='0'+iLoop;
			pszDispBuf[wcslen(pszDispBuf)]=':';
			wGB=MAKEWORD((unsigned char)szGbBuf[iLoop*2],(unsigned char)szGbBuf[iLoop*2+1]);
			csCodeConv.GBToUnicode(wGB,pszDispBuf+wcslen(pszDispBuf));
			pszDispBuf[wcslen(pszDispBuf)]=' ';
			iCol+=2;
		}

		break;
	}

	return 0;
}

int CWbx::GetGbBuf3()
{
	int iLen,iNum;
	int iRow,iCol;

	iLen=strlen(szCurCode);
	iRow=szCurCode[0]-'a';
	iCol=szCurCode[1]-'a';
	iRow=iRow*25+iCol;
	
	memset(szCurWbBuf3,0,sizeof(szCurWbBuf3));
	memset(szCurGbBuf3,0,sizeof(szCurGbBuf3));

	if(iLen==2){
		iNum=0;iLen=0;
		while(szGbBuf3[iRow][iNum]!=0){
			while((unsigned char)szGbBuf3[iRow][iNum]>=0xa1){
				szCurWbBuf3[iLen]=szCurWbBuf3[iLen-2];
				szCurWbBuf3[iLen+1]=szCurWbBuf3[iLen-1];
				szCurGbBuf3[iLen]=szGbBuf3[iRow][iNum];
				szCurGbBuf3[iLen+1]=szGbBuf3[iRow][iNum+1];
				iNum+=2;iLen+=2;
			}
			szCurWbBuf3[iLen]=szGbBuf3[iRow][iNum];
			szCurWbBuf3[iLen+1]=szGbBuf3[iRow][iNum+1];
			szCurGbBuf3[iLen]=szGbBuf3[iRow][iNum+2];
			szCurGbBuf3[iLen+1]=szGbBuf3[iRow][iNum+3];
			
			iNum+=4;iLen+=2;
		}
	}

	return 0;
}



int CWbx::PageDown()
{
	int iLen,iLoop,iNum,iRow;
	
	iLen=strlen(szCurCode);
	switch(iLen){
	case 1:
		iNum=0;
		iRow=szCurCode[0]-'a';
		iLoop=(szEndCode[0]-'a'+1)*2;
		while(szGbBuf2[iRow][iLoop]!=0&&iNum<16){
			szGbBuf[iNum]=szGbBuf2[iRow][iLoop];
			szGbBuf[iNum+1]=szGbBuf2[iRow][iLoop+1];
			szGbBuf[iNum+2]=0;
			iLoop+=2;iNum+=2;
		}
		szEndCode[0]=szEndCode[0]+iNum/2;

		break;

	case 2:
		iNum=0;
		while(strncmp(szCurWbBuf3+iNum*2,szEndCode,2)!=0){
			iNum++;
		}
		
		iLoop=0;
		iNum=(iNum+1)*2;
		while(iNum<strlen(szCurGbBuf3)&&iLoop<16){
			szGbBuf[iLoop]=szCurGbBuf3[iNum];
			szGbBuf[iLoop+1]=szCurGbBuf3[iNum+1];
			szGbBuf[iLoop+2]=0;
			iLoop+=2;iNum+=2;
		}
		strncpy(szEndCode,szCurWbBuf3+iNum-2,2);

		break;

	default:
		return 1;
	}

	return 0;
}



⌨️ 快捷键说明

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