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

📄 parse.c

📁 brew中开发的个人小游戏
💻 C
字号:
#include "vacation.h"
//////////////////////////////////////////////////////////////////////////
/*
 *	
 */

//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
/*
 *	function:获得菜单项unicode数据
 *	得到:pApp->pMainMenuItem->"****"->"****"->"****"->"****"
 */
void GetMainMenuItem(CTheApp* pApp)
{
	uint16 l,l1;
	char* p;
	char* q;
	
	char	chV[50];
	char	chIdView[5];
	char	chIdMenuItem[10];
	MenuItem*	pTemp,*pTail;
	
	CleanMainMenuItemList(pApp);
	
	p=MEMSTR(pApp->pszReceiveData,"<u>",STRLEN(pApp->pszReceiveData));
	while(p)
	{
		p+=3;
		q=MEMSTR(p,"</u>",STRLEN(p));
		l=q-p;
		l1=l;		//用于保持这个值
		MEMSET(chV,0,50);
		MEMCPY(chV,p,l);
		
		p=MEMSTR(q,"<idView>",STRLEN(q));
		p+=8;
		q=MEMSTR(p,"</idView>",STRLEN(p));
		l=q-p;
		MEMSET(chIdView,0,5);
		MEMCPY(chIdView,p,l);
		
		p=MEMSTR(q,"<idMenuItem>",STRLEN(q));
		p+=12;
		q=MEMSTR(p,"</idMenuItem>",STRLEN(p));
		l=q-p;
		MEMSET(chIdMenuItem,0,10);
		MEMCPY(chIdMenuItem,p,l);
		
		//链表末尾插入
		if((pTemp=(MenuItem*)MALLOC(sizeof(MenuItem)))==NULL)
		{
			if(pApp->pMainMenuItem)
			{
				CleanMainMenuItemList(pApp);
				pApp->pMainMenuItem=NULL;
			}
			if(pApp->pszReceiveData)
			{
				FREE(pApp->pszReceiveData);
				pApp->pszReceiveData=NULL;
			}
			ISHELL_SendEvent(pApp->a.m_pIShell,AEECLSID_VACATION,EVT_USER,USEREVT_MEMORY_FAILED,0);
			return;
		}
		pTemp->link=NULL;
      	if((pTemp->content=(AECHAR*)MALLOC(l1/2+2))==NULL)
		{
			if(pApp->pMainMenuItem)
			{
				CleanMainMenuItemList(pApp);
				pApp->pMainMenuItem=NULL;
			}
			if(pApp->pszReceiveData)
			{
				FREE(pApp->pszReceiveData);
				pApp->pszReceiveData=NULL;
			}
			ISHELL_SendEvent(pApp->a.m_pIShell,AEECLSID_VACATION,EVT_USER,USEREVT_MEMORY_FAILED,0);
			return;
		}
		MEMSET(pTemp->content,0,l1/2+2);
		ConvertAECHAR(chV,l1,pTemp->content);
		MEMSET(pTemp->idView,0,5);
		MEMCPY(pTemp->idView,chIdView,5);
		MEMSET(pTemp->idMenuItem,0,10);
		MEMCPY(pTemp->idMenuItem,chIdMenuItem,10);

		if(pApp->pMainMenuItem==NULL)
			pApp->pMainMenuItem=pTemp;
		else
		{
			pTail=pApp->pMainMenuItem;
			while(pTail->link)
				pTail=pTail->link;
			pTail->link=pTemp;
		}
		p=MEMSTR(q,"<u>",STRLEN(q));
	}
	if(pApp->pszReceiveData)//释放接收到的数据,这些数据是用于主菜单,已没用
	{
		FREE(pApp->pszReceiveData);
		pApp->pszReceiveData=NULL;
	}
	return;
}
//////////////////////////////////////////////////////////////////////////
void GetSubMenuItem(CTheApp* pApp)
{
	uint16 l,l1;
	char* p;
	char* q;
	
	char	chV[100];
	char	chIdView[5];
	char	chIdMenuItem[10];
	MenuItem*	pTemp,*pTail;
	
	CleanSubMenuItemList(pApp);
	//log(pApp,pApp->pszReceiveData);
	p=MEMSTR(pApp->pszReceiveData,"<u>",STRLEN(pApp->pszReceiveData));
	while(p)
	{
		p+=3;
		q=MEMSTR(p,"</u>",STRLEN(p));
		l=q-p;
		l1=l;		//用于保持这个值
		MEMSET(chV,0,100);
		MEMCPY(chV,p,l);
		
		p=MEMSTR(q,"<idView>",STRLEN(q));
		p+=8;
		q=MEMSTR(p,"</idView>",STRLEN(p));
		l=q-p;
		MEMSET(chIdView,0,5);
		MEMCPY(chIdView,p,l);
		
		p=MEMSTR(q,"<idContext>",STRLEN(q));
		p+=11;
		q=MEMSTR(p,"</idContext>",STRLEN(p));
		l=q-p;
		MEMSET(chIdMenuItem,0,10);
		MEMCPY(chIdMenuItem,p,l);
		
		
		if((pTemp=(MenuItem*)MALLOC(sizeof(MenuItem)))==NULL)
		{//memory allocate error
			if(pApp->pSubMenuItem)
			{
				CleanSubMenuItemList(pApp);
				pApp->pSubMenuItem=NULL;
			}
			if(pApp->pszReceiveData)
			{
				FREE(pApp->pszReceiveData);
				pApp->pszReceiveData=NULL;
			}
			if(pApp->pIMenuCtl)
			{
				IMENUCTL_Release(pApp->pIMenuCtl);
				pApp->pIMenuCtl=NULL;
			}
			if(pApp->pMainMenuItem)
			{
				CleanMainMenuItemList(pApp);
				pApp->pSubMenuItem=NULL;
			}
			ISHELL_SendEvent(pApp->a.m_pIShell,AEECLSID_VACATION,EVT_USER,USEREVT_MEMORY_FAILED,0);
			return;
		}
		pTemp->link=NULL;
		if((pTemp->content=MALLOC(l1/2+2))==NULL)
		{
			if(pApp->pSubMenuItem)
			{
				CleanSubMenuItemList(pApp);
				pApp->pSubMenuItem=NULL;
			}
			if(pApp->pszReceiveData)
			{
				FREE(pApp->pszReceiveData);
				pApp->pszReceiveData=NULL;
			}
			if(pApp->pIMenuCtl)
			{
				IMENUCTL_Release(pApp->pIMenuCtl);
				pApp->pIMenuCtl=NULL;
			}
			if(pApp->pMainMenuItem)
			{
				CleanMainMenuItemList(pApp);
				pApp->pSubMenuItem=NULL;
			}
			ISHELL_SendEvent(pApp->a.m_pIShell,AEECLSID_VACATION,EVT_USER,USEREVT_MEMORY_FAILED,0);
			return;
		}
		MEMSET(pTemp->content,0,l1/2+2);
		ConvertAECHAR(chV,l1,pTemp->content);
		MEMSET(pTemp->idView,0,5);
		MEMCPY(pTemp->idView,chIdView,5);
		MEMSET(pTemp->idMenuItem,0,10);
		MEMCPY(pTemp->idMenuItem,chIdMenuItem,10);

		if(pApp->pSubMenuItem==NULL)
			pApp->pSubMenuItem=pTemp;
		else
		{
			pTail=pApp->pSubMenuItem;
			while(pTail->link)
				pTail=pTail->link;
			pTail->link=pTemp;
		}
		p=MEMSTR(q,"<u>",STRLEN(q));
	}
	if(pApp->pszReceiveData)//释放接收到的数据,这些数据是用于子菜单,已没用
	{
		FREE(pApp->pszReceiveData);
		pApp->pszReceiveData=NULL;
	}
	return;
}
//////////////////////////////////////////////////////////////////////////
/*
void GetMainMenuItem(CTheApp* pApp)
{
	uint16 l;
	char* p;
	char* q;
	char* pV=NULL;
	MenuItem*	pTemp,*pTail;
	
	CleanMainMenuItemList(pApp);
	
	p=MEMSTR(pApp->pszReceiveData,"<u>",STRLEN(pApp->pszReceiveData));
	while(p)
	{
		p+=3;
		q=MEMSTR(p,"</u>",STRLEN(p));
		l=q-p;
        pV=MALLOC(l+2);
		MEMSET(pV,0,l+2);
		MEMCPY(pV,p,l);
		
		
		pTemp=(MenuItem*)MALLOC(sizeof(MenuItem));//list末尾插入
		pTemp->link=NULL;
		pTemp->content=MALLOC(l/2+2);
		MEMSET(pTemp->content,0,l/2+2);
		//MEMCPY(pTemp->content,p,l);
		ConvertAECHAR(pV,l,pTemp);
		FREE(pV);

		if(pApp->pMainMenuItem==NULL)
			pApp->pMainMenuItem=pTemp;
		else
		{
			pTail=pApp->pMainMenuItem;
			while(pTail->link)
				pTail=pTail->link;
			pTail->link=pTemp;
		}
		p=MEMSTR(q,"<u>",STRLEN(q));
	}
	return;
}
*/
//////////////////////////////////////////////////////////////////////////
/*
 *	function:清除菜单项内存
 *	清除:pApp->pMainMenuItem->"****"->"****"->"****"->"****".
 */
void CleanMainMenuItemList(CTheApp* pApp)
{
	MenuItem*	pTemp;
	while(pApp->pMainMenuItem)
	{
		pTemp=pApp->pMainMenuItem;
		pApp->pMainMenuItem=pTemp->link;
		if(pTemp->content)
		{
			FREE(pTemp->content);
			pTemp->content=NULL;
		}
		FREE(pTemp);
		pTemp=NULL;
	}
	return;
}
//////////////////////////////////////////////////////////////////////////
void CleanSubMenuItemList(CTheApp* pApp)
{
	MenuItem*	pTemp;
	while(pApp->pSubMenuItem)
	{
		pTemp=pApp->pSubMenuItem;
		pApp->pSubMenuItem=pTemp->link;
		if(pTemp->content)
		{
			FREE(pTemp->content);
			pTemp->content=NULL;
		}
		FREE(pTemp);
		pTemp=NULL;
	}
	return;
}

//////////////////////////////////////////////////////////////////////////
/*
 *	function:将ascii码表示的unicode转换成真正的16位unicode.
 *  import:pV-指向ascii码字符串,l-字符串长度
 *  export:pMI->content-菜单项unicode值
 *  use example:
 */
void ConvertAECHAR(char* pV,uint16 l,AECHAR* pMI)
{
	uint16 i,j;
	uint16 a;
	char c;
	
	j=0;
	while(j<l)
	{
		a=0;
		//此处最好过滤掉回车换行
		//if(pMI[j]==0x0d||pMI[j]==0x0d)
		//	j+=2;
		//if(pMI)
		//------------------
		for(i=0;i<=3;i++)
		{
			c=pV[j+i];
			if((c>=0x30)&&(c<=0x39))
				c^=0x30;
			if((c>=0x41)&&(c<=0x46))
				c-=0x37;
			//此处没有考虑小写字母的情形
			a<<=4;
			a|=c;
		}
		pMI[j/4]|=a;
		j+=4;
	}
}
/*
 void ConvertAECHAR(char* pV,uint16 l,MenuItem* pMI)
{
	uint16 i,j;
	uint16 a;
	char c;

	j=0;
	while(j<l)
	{
		a=0;
		for(i=0;i<=3;i++)
		{
			c=pV[j+i];
			if((c>=0x30)&&(c<=0x39))
				c^=0x30;
			if((c>=0x41)&&(c<=0x46))
				c-=0x37;
			//此处没有考虑小写字母的情形
			a<<=4;
			a|=c;
		}
		pMI->content[j/4]|=a;
		j+=4;
	}
}
 */
//////////////////////////////////////////////////////////////////////////
int Str2Int(char* pCh)
{
	int Result=0;
	char* p;
	p=pCh;
	while(*p)
	{
		Result=10*Result+(*p-0x30);
		p++;
	}
	return Result;
}
///////////////////////////////////////////////////////////////////////////
//限制数字不超过7位
///////////////////////////////////////////
void Int2Str(char a[],uint16 x)
{
	int i,j;
	uint16 b;
	char c;
	char r[7]={0};
	b=x;
	for(i=0;i<=6;i++)
	{
		c=(char)(b%10)+0x30;
		r[i]=c;
		b=b/10;
	}
	i=6;
	while(1)
	{
		if((i<0)||(r[i]^0x30))
			break;
		i--;	
	}
	if(i>=0)
	{
		j=0;
		for(i;i>=0;i--)
		{
			a[j]=r[i];
			j++;
		}
	}
	return;
}

⌨️ 快捷键说明

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