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

📄 execcomm.cpp

📁 vt100终端仿真程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:

			//根据判断得FuncNo
			if (i==strlen(CommLine)-1)
			{
				pNew->FuncNo=g_nFuncNo;
				g_nFuncNo++;
			}
			else
				pNew->FuncNo=0;
			pParent->pLeft =pNew;
			pParent=pNew;
		}
		else				//有节点
		{
			pSon=pParent->pLeft;
			while(pSon->pRight !=NULL && pSon->Value !=CommLine[i])
				pSon=pSon->pRight;
			
			if (pSon->Value !=CommLine[i])
			{
				pNew=(pNode)malloc(sizeof(Node));
				pNew->pLeft=NULL;
				pNew->pRight=NULL;
				pNew->Value=CommLine[i];

				//根据判断得Type
				if (CommLine[i]!='\xff')
				{
					pNew->Type=0;		
				}
				else
					pNew->Type=1;

				//根据判断得FuncNo
				if (i==strlen(CommLine)-1)
				{
					pNew->FuncNo=g_nFuncNo;
					g_nFuncNo++;
				}
				else
					pNew->FuncNo=0;
				pSon->pRight =pNew;
				pParent=pNew;
			}
			else
				pParent=pSon;
		}

	}
	return 0;
}

///////////////////////////////////////////////////////////////////
//解释字符流
int OutputComm(char * szCommand)
{
	unsigned int i;
	int j;
	int retVal;
	int CommLen;

	for (i=0;i<strlen(szCommand);i++)
	{
		if (szCommand[i]!='\x1b')
		{
//			printf("%c ",szCommand[i]);
//			MessageBox(NULL,_T("??"),_T(""),MB_OK);
		}
		else
		{
			CommLen=0;
			retVal=SearchComm(pRoot,szCommand+i,&CommLen);
			if (retVal==0)
				i=i+CommLen-1;
			else
			{
				for (j=0;j<50;j++)
					g_iArrPara[j]=0;
				ParaNum=1;		//参数起始下标
				fStartPara=0;	//参数状态

				CommLen=0;
				retVal=SearchComm1(pRoot1,szCommand+i,&CommLen);
				if (retVal==0)
					i=i+CommLen-1;
				else 
					i=i+CommLen-2;
			}
		}
	}
	return 0;
}
/*
//////////////////////////////////////////////////////////////////////////////
//无参数命令分析
int SearchComm(pNode pHead, char * szCommand, int * CommLen)
{
//	int i;
//	int nRetVal;
	pNode pParent;

	char Msg[128];

	if (szCommand[0]==0x00)
		return 1;
	if (pHead==NULL)
		return 1;
	pParent=pHead->pLeft;
	(*CommLen)++;
	while (pParent->Value !=szCommand[0] && pParent->pRight!=NULL)
		 pParent=pParent->pRight;

	if (pParent->Value!=szCommand[0])
	{
//		printf("%c ",szCommand[0]);
//		SearchComm(pRoot,szCommand+1);
		return 1;
	}
	else
	{
		if (pParent->FuncNo==0)
			return SearchComm(pParent,szCommand+1,CommLen);
		else
		{
			sprintf(Msg,"FUNC[%d] ",pParent->FuncNo );
			MessageBox(NULL,Msg,NULL,MB_OK);
			return 0;
//			SearchComm(pRoot,szCommand+1);
		}
	}
	return 0;	
}



///////////////////////////////////////////////////////////////////////////////////////
//带参数命令分析
int SearchComm1(pNode pHead, char * szCommand, int * CommLen)
{
	int i;
//	int nRetVal;
	pNode pParent;
	char Msg[128];
	char Para[10];

	if (szCommand[0]==0x00)
		return 1;
	if (pHead==NULL)
		return 1;

	if (pHead->Type ==0 || ((szCommand[0]<0x30 || szCommand[0]>0x39) && szCommand[0]!=';'))
		pParent=pHead->pLeft;//节点类型为非参数节点或为参数节点但接收字符不为参数字符时,二叉树下查
	else
		pParent=pHead;//否则为参数节点且接收到参数字符,二叉树节点不变

	(*CommLen)++;	//命令长度加一
	
	while (pParent->pRight!=NULL)
	{	 
		if (pParent->Type ==0 && pParent->Value ==szCommand[0])//非参数节点时,在二叉树中查询到输入字符时结束
			break;
		if (pParent->Type ==1 && (szCommand[0] <=0x39 && szCommand[0] >= 0x30 || szCommand[0] ==';'))
			break;//参数节点且输入为参数字符时结束
		pParent=pParent->pRight;
	}

	//fStartPara:参数接收标志
	//			0:非参数节点
	//			1:参数节点可接收数字或';'或结束参数输入
	//			2:参数节点只能接收数字
	if (pParent->Type ==0) //非参数节点分析
	{
		if (pParent->Value!=szCommand[0]||fStartPara==2)//命令分析错误
		{
//			printf("%c ",szCommand[0]);
//			SearchComm1(pRoot,pRoot,szCommand+1);
			return 1;
		}
		else//命令分析正确
		{
			fStartPara=0;//
			if (pParent->FuncNo==0)//未到页节点继续查询
				return SearchComm1(pParent,szCommand+1,CommLen);
			else//命令分析完毕,功能函数调用
			{
				sprintf(Msg,"FUNC[%d](",pParent->FuncNo );
//				SearchComm1(pRoot,pRoot,szCommand+1);
				g_iArrPara[0]=ParaNum;
				for (i=0;i<=ParaNum;i++)
				{
					sprintf(Para,"%d,",g_iArrPara[i]);
					strcat(Msg,Para);
				}
				strcat(Msg,")");

				MessageBox(NULL,Msg,NULL,MB_OK);
//				printf(") ");
				return 0;
			}
		}
	}
	else//参数节点分析
	{
		if (pParent->Type ==1 && (szCommand[0] <=0x39 && szCommand[0] >= 0x30 || szCommand[0] ==';'))//输入为参数或分隔符
		{
			if (szCommand[0]>=0x30 && szCommand[0]<=0x39)//输入为数字
			{
				g_iArrPara[ParaNum]=g_iArrPara[ParaNum]*10+(szCommand[0]-0x30);//计算参数
				if (fStartPara==0||fStartPara==2)//进入参数接收状态
					fStartPara=1;
			}

			if (szCommand[0]==';')//输入为分号,下一输入必为数字
			{
				if (fStartPara==1)
				{
					ParaNum++;	
					fStartPara=2;
				}
				else
					return 1;
			}

			if (pParent->FuncNo==0)//命令未结束,继续分析
				return SearchComm1(pParent,szCommand+1,CommLen);
			else//命令分析结束,调用功能函数
			{
				sprintf(Msg,"FUNC[%d](",pParent->FuncNo );
//				SearchComm1(pRoot,pRoot,szCommand+1);
				g_iArrPara[0]=ParaNum;
				for (i=0;i<=ParaNum;i++)
				{
					sprintf(Para,"%d,",g_iArrPara[i]);
					strcat(Msg,Para);
				}
				strcat(Msg,")");

				MessageBox(NULL,Msg,NULL,MB_OK);
//				printf(") ");
				return 0;
			}
		}
		else//该节点为参数节点
		{
//			printf("%c ",szCommand[0]);
//			SearchComm1(pRoot,pRoot,szCommand+1);
			return 1;
		}

	}
	return 0;	
}
*/
//////////////////////////////////////////////////////////////////////////////
//无参数命令分析
int SearchComm(pNode pHead, char * szCommand, int * CommLen)
{
//	int i;
//	int nRetVal;
	pNode pParent=NULL;

//	char Msg[128];

	if (szCommand[0]==0x00)
	{
		pCurrNode=pHead;
		return 0;
	}
	if (pHead==NULL)
	{
		pCurrNode=pRoot;		
		return 1;
	}
	pParent=pHead->pLeft;

	(*CommLen)++;
	szCurrCommand[strlen(szCurrCommand)]=szCommand[0];

	while (pParent->Value !=szCommand[0] && pParent->pRight!=NULL)
		 pParent=pParent->pRight;

	if (pParent->Value!=szCommand[0])
	{
//		printf("%c ",szCommand[0]);
//		SearchComm(pRoot,szCommand+1);
		pCurrNode=pRoot;
		return 1;
	}
	else
	{
		if (pParent->FuncNo==0)
			return SearchComm(pParent,szCommand+1,CommLen);
		else
		{
//			sprintf(Msg,"FUNC[%d] ",pParent->FuncNo );
//			MessageBox(NULL,Msg,NULL,MB_OK);
			CmdFun[pParent->FuncNo -1]();
			pCurrNode=pRoot;
			return 0;
//			SearchComm(pRoot,szCommand+1);
		}
	}

	return 0;	
}

///////////////////////////////////////////////////////////////////////////////////////
//带参数命令分析
int SearchComm1(pNode pHead, char * szCommand, int * CommLen)
{
//	int i;
//	int nRetVal;
	pNode pParent=NULL;
//	char Msg[128];
//	char Para[10];

	if (szCommand[0]==0x00)
	{
		pCurrNode=pHead;
		fTree=1;
		return 0;
	}
	if (pHead==NULL)
	{
		pCurrNode=pRoot;
		fTree=0;
		return 1;
	}

	if (pHead->Type ==0 || ((szCommand[0]<0x30 || szCommand[0]>0x39) && szCommand[0]!=';'))
		pParent=pHead->pLeft;
	else
		pParent=pHead;

	(*CommLen)++;
//	szCurrCommand[strlen(szCurrCommand)]=szCommand[0];
	
	
	while (pParent->pRight!=NULL)
	{	 
		if (pParent->Type ==0 && pParent->Value ==szCommand[0])
			break;
		if (pParent->Type ==1 && (szCommand[0] <=0x39 && szCommand[0] >= 0x30 || szCommand[0] ==';'))
			break;
		pParent=pParent->pRight;
	}
	if (pParent->Type ==0)
	{
		if (pParent->Value!=szCommand[0]||fStartPara==2)
		{
//			printf("%c ",szCommand[0]);
//			SearchComm1(pRoot,pRoot,szCommand+1);
			pCurrNode=pRoot;
			fTree=0;
			
#ifdef UNICODE
			TCHAR wcCmd[10];

			mbstowcs(wcCmd,szCommand,sizeof(wcCmd));
//			MessageBox(NULL,wcCmd,NULL,MB_OK);
#else
//			MessageBox(NULL,szCommand,NULL,MB_OK);
#endif
			return 1;
		}
		else
		{
			fStartPara=0;
			if (pParent->FuncNo==0)
				return SearchComm1(pParent,szCommand+1,CommLen);
			else
			{
//				sprintf(Msg,"FUNC[%d](",pParent->FuncNo );
//				SearchComm1(pRoot,pRoot,szCommand+1);
				g_iArrPara[0]=ParaNum;
//				for (i=0;i<=ParaNum;i++)
//				{
//					sprintf(Para,"%d,",g_iArrPara[i]);
//					strcat(Msg,Para);
//				}
//				strcat(Msg,")");

//				MessageBox(NULL,Msg,NULL,MB_OK);
				CmdFun[pParent->FuncNo -1]();
				pCurrNode=pRoot;
				fTree=0;
//				printf(") ");
				return 0;
			}
		}
	}
	else
	{
		if (pParent->Type ==1 && (szCommand[0] <=0x39 && szCommand[0] >= 0x30 || szCommand[0] ==';'))
		{
			if (szCommand[0]>=0x30 && szCommand[0]<=0x39)
			{
				g_iArrPara[ParaNum]=g_iArrPara[ParaNum]*10+(szCommand[0]-0x30);
				if (fStartPara==0||fStartPara==2)
					fStartPara=1;
			}

			if (szCommand[0]==';')
			{
				if (fStartPara==1)
				{
					ParaNum++;	
					fStartPara=2;
				}
				else
				{
					pCurrNode=pRoot;
					fTree=0;

#ifdef UNICODE
					TCHAR wcCmd[10];

					mbstowcs(wcCmd,szCommand,sizeof(wcCmd));
//					MessageBox(NULL,wcCmd,NULL,MB_OK);
#else
//					MessageBox(NULL,szCommand,NULL,MB_OK);
#endif

					return 1;
				}
			}

			if (pParent->FuncNo==0)
				return SearchComm1(pParent,szCommand+1,CommLen);
			else
			{
//				sprintf(Msg,"FUNC[%d](",pParent->FuncNo );
//				SearchComm1(pRoot,pRoot,szCommand+1);
//				g_iArrPara[0]=ParaNum;
//				for (i=0;i<=ParaNum;i++)
//				{
//					sprintf(Para,"%d,",g_iArrPara[i]);
//					strcat(Msg,Para);
//				}
//				strcat(Msg,")");

//				MessageBox(NULL,Msg,NULL,MB_OK);
//				printf(") ");
				CmdFun[pParent->FuncNo-1]();
				pCurrNode=pRoot;
				fTree=0;
				return 0;
			}
		}
		else
		{
//			printf("%c ",szCommand[0]);
//			SearchComm1(pRoot,pRoot,szCommand+1);
			pCurrNode=pRoot;
			fTree=0;
			return 1;
		}

	}
	return 0;	
}

⌨️ 快捷键说明

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