📄 pack.c
字号:
//***************************************
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 + -