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

📄 pack.c

📁 CBS(小区广播)程序实现手稿
💻 C
📖 第 1 页 / 共 5 页
字号:
//***************************************		
int FlatUnPackGetFPartPos(int handle)
{
	return PackControl[handle].WorkingPos;
}

//***********************************
//	判断是否已到输入流的末尾		*
//		1:已到,0:未到			*
//***********************************
int FlatUnPackEOI(int handle)
{
	if(PackControl[handle].EOIPos>=PackControl[handle].StreamLen)
		return 1;
	else return 0;
}

//***************************************************		
//置当前解包指针 Pos 若为正后移,为负前移			*
//Pos 位移,mode 0:从输入流算起,1:从当前位置算起	*
//返回值	新指针位置								*
//***************************************************		
int FlatUnPackSetFPartPos(int handle,int pos,int mode)
{
	if(mode)	PackControl[handle].WorkingPos+=pos;
	else		PackControl[handle].WorkingPos=pos;
	PackControl[handle].EOIPos=PackControl[handle].WorkingPos;
	return PackControl[handle].WorkingPos;
}

//***************************************************		
//在解包指针的位置处读一个V部分参数,然后指针后移	*
//handle:解包句柄,format:F类描述串,len:该V部分长度*
//para1:各编程数据									*
//返回值	V部分解出的字节数						*
//***************************************************		
int FlatUnPackVPart(int handle,BYTE *format,int * len,...)
{
	int x;
	int k,r,t;
	BYTE *i,*j;

								//取当前工作指针所指地址
	i=PackControl[handle].StreamPtr+PackControl[handle].WorkingPos;
								//若当前为第一个V参数,置F部分长度
	if(!PackControl[handle].Vencounted)
		PackControl[handle].FpartLen=PackControl[handle].WorkingPos;

	if(PackControl[handle].Lflag)
	{
		r=0;					//取出偏移长度
		memcpy(&r,i,2);
		j=i+r;					//将指针指向V部分长度字节
		t=0;					//取出V部分长度
		memcpy(&t,j,2);
		*len=t;					//赋给len
								//调用处理F类描述符的程序对之进行处理
		k=SubCommonSubUnFlatPack(j+2,format,strlen(format),((int *)&format)+2,&x);
		if(PackControl[handle].WorkingPos+k+r+2>PackControl[handle].StreamLen) return 0;
								//指针后移
		PackControl[handle].EOIPos=PackControl[handle].WorkingPos+2+t+r;
		PackControl[handle].WorkingPos+=2;
	}
	else
	{
		j=i+(*i);				//将指针指向V部分长度字节
		*len=*j++;				//取出V部分长度
								//调用处理F类描述符的程序对之进行处理
		k=SubCommonSubUnFlatPack(j,format,strlen(format),((int *)&format)+2,&x);
		if(PackControl[handle].WorkingPos+k+*i+1>PackControl[handle].StreamLen) return 0;
								//指针后移
		PackControl[handle].EOIPos=PackControl[handle].WorkingPos+1+(*i)+(*len);
		PackControl[handle].WorkingPos+=1;
	}
								//已处理的V参数个数加一
	PackControl[handle].Vencounted+=1;
	return k;
}

//***********************************************		
//取当前V部分的净长度,取出后解包指针不动		*
//返回值	若>=0:成功,否则失败				*
//***********************************************		
int FlatUnPackGetVPartLEN(int handle)
{
	BYTE * i;
	int k,j;
								//取当前工作指针所指地址								
	i=PackControl[handle].StreamPtr+PackControl[handle].WorkingPos;
	if(PackControl[handle].Lflag)
	{
		j=0;					//取出偏移长度
		memcpy(&j,i,2);			//j为偏移长度
		k=0;					//取出V部分长度
		memcpy(&k,i+j,2);		//k为V部分长度
	}
	else k=*(i+i[0]);
	return k;
}

//*******************************************
//	预置V部分指针的值						*
//使之指向当前V部分的净内容起始处			*
//注意:在调用FlatUnPackVContinue函数之前	*
//		必须调用此函数						*
//*******************************************
int FlatUnPackVSet(int handle)
{
	BYTE * i;
	int j;

									//取当前工作指针所指地址								
	i=PackControl[handle].StreamPtr+PackControl[handle].WorkingPos;
	if(PackControl[handle].Lflag)	//有 L 描述符的情况
	{
		j=0;						//取出偏移长度
		memcpy(&j,i,2);				//j为偏移长度
		PackControl[handle].VPartPos=PackControl[handle].WorkingPos+j+2;
	}
	else							//无 L 描述符的情况 
		PackControl[handle].VPartPos=PackControl[handle].WorkingPos+i[0]+1;
	return 0;
}

//***************************************
//		取当前V部分的净内容				*
//	V部分指针移动,但当前工作指针不动	*
//	返回值	V部分解出的字节数  =0:出错	*
//***************************************
int FlatUnPackVContinue(int handle,BYTE *format,...)
{
	int x;
	int m;
	BYTE * j;
							//取当前V部分指针所指向的内容
	j=PackControl[handle].StreamPtr+PackControl[handle].VPartPos;
							//调用处理F类描述符的程序对之进行处理
	m=SubCommonSubUnFlatPack(j,format,strlen(format),((int *)&format)+1,&x);
	if(PackControl[handle].VPartPos+m+2>PackControl[handle].StreamLen) return 0;
							//指针后移
	PackControl[handle].VPartPos+=m;
	return m;
}

//***************************************************		
//取当前V部分的净内容的指针,取出后解包指针不动		*
//返回值	若==0:失败,否则成功					*
//***************************************************		
BYTE * FlatUnPackGetVPartBODY(int handle)
{
	BYTE * i;  
	int k;
								//取当前工作指针所指地址								
	i=PackControl[handle].StreamPtr+PackControl[handle].WorkingPos;
	if(PackControl[handle].Lflag)
	{
		k=0;
		memcpy(&k,i,2);
		return (i+k+2);
	}
	else return (i+i[0]+1);
}

//***********************************		
//	使解包指针移到下一个V部分处		*		
//	返回值	无意义					*
//***********************************		
int FlatUnPackSkipVPart(int handle)
{
	int r,t;
	BYTE *i,*j;
								//取当前工作指针所指地址
	i=PackControl[handle].StreamPtr+PackControl[handle].WorkingPos;
								//指针后移
	if(PackControl[handle].Lflag)
	{
		r=0;					//取出偏移长度
		memcpy(&r,i,2);
		j=i+r;					//将指针指向V部分长度字节
		t=0;					//取出V部分长度
		memcpy(&t,j,2);
		PackControl[handle].EOIPos=PackControl[handle].WorkingPos+2+t+r;
		PackControl[handle].WorkingPos+=2;
	}
	else
	{
		j=i+(*i);				//将指针指向V部分长度字节
		PackControl[handle].EOIPos=PackControl[handle].WorkingPos+1+(*i)+(*j);
		PackControl[handle].WorkingPos++;
	}
								//已处理的V参数个数加一
	PackControl[handle].VPartPos=0;
	PackControl[handle].Vencounted++;
	return 1;
}

//***************************************************		
//在解包指针的位置处读一个O部分参数,然后指针后移	*
//handle:解包句柄,format:F类描述串,len:该O部分长度*
//para1:各编程数据	name:O部分名字					*
//返回值	O部分解出的字节数						*
//***************************************************		
int FlatUnPackOPart(int handle,BYTE *format,int *name,int * len,...)
{
	int x;
	int k,m;
	BYTE * j;
								//若当前为第一个O参数,将当前工作指针置于O部分起始处
	if(PackControl[handle].Lflag)		//有 L 描述符的情况
	{
		if(!PackControl[handle].Oencounted)
		{
			k=0;
			memcpy(&k,PackControl[handle].StreamPtr+PackControl[handle].WorkingPos,2);
			PackControl[handle].WorkingPos+=k;
		}
										//取出O部分参数名
		*name=*(PackControl[handle].StreamPtr+PackControl[handle].WorkingPos);
		*len=0;							//取当前O部分的净长度
		memcpy(len,PackControl[handle].StreamPtr+PackControl[handle].WorkingPos+1,2);
										//取当前O部分的净内容的指针
		j=PackControl[handle].StreamPtr+PackControl[handle].WorkingPos+3;
								//调用处理F类描述符的程序对之进行处理
		m=SubCommonSubUnFlatPack(j,format,strlen(format),((int *)&format)+3,&x);
		if(PackControl[handle].WorkingPos+m+3>PackControl[handle].StreamLen) return 0;
								//指针后移
		PackControl[handle].WorkingPos+=(*len)+3;
		PackControl[handle].EOIPos=PackControl[handle].WorkingPos;
	}
	else								//无 L 描述符的情况 
	{
		if(!PackControl[handle].Oencounted)
			PackControl[handle].WorkingPos+=*(PackControl[handle].StreamPtr
											+PackControl[handle].WorkingPos);
										//取出O部分参数名
		*name=*(PackControl[handle].StreamPtr+PackControl[handle].WorkingPos);
										//取当前O部分的净长度
		*len=*(PackControl[handle].StreamPtr+PackControl[handle].WorkingPos+1);
										//取当前O部分的净内容的指针
		j=PackControl[handle].StreamPtr+PackControl[handle].WorkingPos+2;
								//调用处理F类描述符的程序对之进行处理
		m=SubCommonSubUnFlatPack(j,format,strlen(format),((int *)&format)+3,&x);
		if(PackControl[handle].WorkingPos+m+2>PackControl[handle].StreamLen) return 0;
								//指针后移
		PackControl[handle].WorkingPos+=(*len)+2;
		PackControl[handle].EOIPos=PackControl[handle].WorkingPos;
	}
	return m;
}

//*******************************************
//	预置O部分指针的值						*
//使之指向当前O部分的净内容起始处			*
//注意:在调用FlatUnPackOContinue函数之前	*
//		必须调用此函数						*
//*******************************************
int FlatUnPackOSet(int handle)
{
	if(PackControl[handle].Lflag)		//有 L 描述符的情况
		PackControl[handle].OPartPos=PackControl[handle].WorkingPos+3;
	else								//无 L 描述符的情况 
		PackControl[handle].OPartPos=PackControl[handle].WorkingPos+2;
	return 0;
}

//***************************************
//		取当前O部分的净内容				*
//	O部分指针移动,但当前工作指针不动	*
//	返回值	O部分解出的字节数  =0:出错	*
//***************************************
int FlatUnPackOContinue(int handle,BYTE *format,...)
{
	int x;
	int m;
	BYTE * j;
							//取当前O部分指针所指向的内容
	j=PackControl[handle].StreamPtr+PackControl[handle].OPartPos;
							//调用处理F类描述符的程序对之进行处理
	m=SubCommonSubUnFlatPack(j,format,strlen(format),((int*)&format)+1,&x);
	if(PackControl[handle].OPartPos+m+2>PackControl[handle].StreamLen) return 0;
							//指针后移
	PackControl[handle].OPartPos+=m;
	return m;
}

//***************************************		
//	取当前O部分的参数名					*
//返回值	若>=0:成功,否则失败		*	
//***************************************	
int FlatUnPackGetOPartNAME(int handle)
{
	int k;
								//若当前为第一个O参数,将当前工作指针置于O部分起始处
	if(PackControl[handle].Lflag)		//有 L 描述符的情况
	{
		if(!PackControl[handle].Oencounted)
		{
			k=0;
			memcpy(&k,PackControl[handle].StreamPtr+PackControl[handle].WorkingPos,2);
			PackControl[handle].WorkingPos+=k;
		}
	}
	else								//无 L 描述符的情况 
	{
		if(!PackControl[handle].Oencounted)
			PackControl[handle].WorkingPos+=*(PackControl[handle].StreamPtr
											+PackControl[handle].WorkingPos);
	}
										//取出O部分参数名
	return *(PackControl[handle].StreamPtr+PackControl[handle].WorkingPos);
}

//***********************************************		
//	取当前O部分的净长度,取出后解包指针不动		*
// 返回值	若>=0:成功,否则失败				*
//***********************************************		
int FlatUnPackGetOPartLEN(int handle)
{
	int k;

	if(PackControl[handle].Lflag)
	{
		k=0;
		memcpy(&k,PackControl[handle].StreamPtr+PackControl[handle].WorkingPos+1,2);
		return k;
	}
	else
		return *(PackControl[handle].StreamPtr+PackControl[handle].WorkingPos+1);
}

//***************************************************		
//	取当前O部分的净内容的指针,取出后解包指针不动	*
//	返回值	若>=0:成功,否则失败					*
//***************************************************		
BYTE * FlatUnPackGetOPartBODY(int handle)
{
	if(PackControl[handle].Lflag)
		return (PackControl[handle].StreamPtr+PackControl[handle].WorkingPos+3);
	return (PackControl[handle].StreamPtr+PackControl[handle].WorkingPos+2);
}

//***********************************		
//	使解包指针移到下一个O部分		*	
//	返回值	若1:成功,0:失败		*
//***********************************		
int FlatUnPackSkipOPart(int handle)
{
	int i;

	if(PackControl[handle].Lflag)
	{
		i=0;					//取当前O部分的长度
		memcpy(&i,PackControl[handle].StreamPtr+PackControl[handle].WorkingPos+1,2);
								//若越界,返回0
		if((PackControl[handle].WorkingPos+i+3)>PackControl[handle].StreamLen) return 0;
								//指针后移至下一个O部分
		PackControl[handle].WorkingPos+=i+3;
	}
	else
	{
								//取当前O部分的长度
		i=*(PackControl[handle].StreamPtr+PackControl[handle].WorkingPos+1);
								//若越界,返回0
		if((PackControl[handle].WorkingPos+i+2)>PackControl[handle].StreamLen) return 0;
								//指针后移至下一个O部分
		PackControl[handle].WorkingPos+=i+2;
	}
								//已处理的O参数个数加一
	PackControl[handle].OPartPos=0;
	PackControl[handle].Oencounted++;
	return 1;
}


//*******************************		
//			结束解包			*
//	返回值	输入流的字节数		*
//*******************************		
int FlatUnPackEnd(int handle)
{
	return(PackControl[handle].WorkingPos);
}

//*******************************		
//		释放解包句柄			*
//	返回值	若0:成功,1:失败	*
//*******************************		
int FlatUnPackRelease(int handle)
{
	if(FreeFlatResource(handle))
		return 1;
	else return 0;
}

//	SOLIDP~1 C          17,608  12-16-98  21:45 SolidPack.c
//***********************************************************
//			词法分析器										*
//从左到右扫描描述串,把描述串中的单字符描述符或字符描述符	*
//变成一个内部标识。										*
//format->描述串,ScanPos:当前工作指针						*	
//***********************************************************
struct Token_t GetToken(BYTE *format,int *ScanPos)
{
	int width;
	struct Token_t Token;
											//根据格式串当前工作指针扫描格式串
	for(;*(format+ScanPos[0]);ScanPos[0]++) //直至串尾
	{
		width=0;
		switch(*(format+ScanPos[0]))
		{
											//处理十六进制和二进制数
		case '0':						
			ScanPos[0]++;
			if(*(format+ScanPos[0])=='b'||(*(format+ScanPos[0])=='B'))
				for(ScanPos[0]++;*(format+ScanPos[0])>='0'&&(*(format+ScanPos[0])<='9');
																			ScanPos[0]++)
					width=width*2+(*(format+ScanPos[0])-'0');
			else if(*(format+ScanPos[0])=='x'||(*(format+ScanPos[0])=='X'))
			{
				for(ScanPos[0]++;(*(format+ScanPos[0])>='0'&&(*(format+ScanPos[0])<='9'))||
					(*(format+ScanPos[0])>='a'&&(*(format+ScanPos[0])<='f'))||
					(*(format+ScanPos[0])>='A'&&(*(format+ScanPos[0])<='F'));ScanPos[0]++)
				{
					if(*(format+ScanPos[0])>='0'&&(*(format+ScanPos[0])<='9'))
						width=width*16+(*(format+ScanPos[0])-'0');
					else if(*(format+ScanPos[0])>='a'&&(*(format+ScanPos[0])<='f'))
						width=width*16+(*(format+ScanPos[0])-'a'+10);
					else
						width=width*16+(*(format+ScanPos[0])-'A'+10);
				}
			}
			else 
				for(ScanPos[0]++;*(format+ScanPos[0])>='0'&&(*(format+ScanPos[0])<='9');
																			ScanPos[0]++)
					width=width*10+(*(format+ScanPos[0])-'0');
			Token.Class=PACK_KEY_NUMBER;
			Token.Value=width;
			return Token;
											//处理十进制数
		case '1':
		case '2':

⌨️ 快捷键说明

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