#define GetHeaderByte(N) Header[N] #define GetHeaderWord(N) (Header[N]+((UWORD)Header[N+1]<<8)) #define GetHeaderDword(N) (Header[N]+((UWORD)Header[N+1]<<8)+\ ((UDWORD)Header[N+2]<<16)+\ ((UDWORD)Header[N+3]<<24)) int IsProcessFile(int ComparePath) { int Wildcards; char PathArg[NM],NameArg[NM]; char PathArc[NM],NameArc[NM]; for (NextArgName(ARG_RESET);NextArgName(ARG_NEXT);) { Wildcards=SplitPath(ArgName,PathArg,NameArg,1); SplitPath(ArcFileName,PathArc,NameArc,1); if (!ExclCheck(ArcFileName) && CmpName(NameArg,NameArc,0)) if ((ComparePath==NOT_COMPARE_PATH && *PathArg==0) || (stricomp(PathArg,PathArc)==0 || Wildcards && strnicomp (PathArg,PathArc,strlen(PathArg))==0 )) return(1); } return(0); } int ReadBlock(int BlockType) { struct NewFileHeader SaveFileHead; int Size,ReadSubBlock=0; static int LastBlock; BrokenFileHeader=0; memcpy(&SaveFileHead,&NewLhd,sizeof(SaveFileHead)); if (BlockType & READSUBBLOCK) ReadSubBlock=1; BlockType &= 0xff; if (ArcFormat==OLD) { memset(&OldLhd,0,sizeof(OldLhd)); CurBlockPos=ftell(ArcPtr); Size=ReadHeader(FILE_HEAD); if (Size != 0) if (OldLhd.Method > SIZEOF_SHORTBLOCKHEAD || OldLhd.NameSize==0 || OldLhd.NameSize > 80 || OldLhd.UnpVer==0 || OldLhd.UnpVer > 20 || OldLhd.HeadSize <= 21 || OldLhd.Flags<8 && OldLhd.HeadSize!=21+OldLhd.NameSize) return(0); NewLhd.HeadType=FILE_HEAD; NewLhd.HeadSize=OldLhd.HeadSize; NewLhd.Flags=OldLhd.Flags|LONG_BLOCK; NewLhd.PackSize=OldLhd.PackSize; NewLhd.UnpSize=OldLhd.UnpSize; NewLhd.FileTime=OldLhd.FileTime; NewLhd.UnpVer=(OldLhd.UnpVer==2) ? 13 : 10; NewLhd.Method=OldLhd.Method+0x30; NewLhd.NameSize=OldLhd.NameSize; NewLhd.FileAttr=OldLhd.FileAttr; NewLhd.FileCRC=OldLhd.FileCRC; if (Size!=0) NextBlockPos=CurBlockPos+OldLhd.HeadSize+OldLhd.PackSize; } else { while (1) { CurBlockPos=ftell(ArcPtr); Size=ReadHeader(FILE_HEAD); if (Size!=0) { if (NewLhd.HeadSize 0 && BlockType!=SUB_HEAD) LastBlock=BlockType; if (Size==0 || BlockType==ALL_HEAD || NewLhd.HeadType==BlockType || (NewLhd.HeadType==SUB_HEAD && ReadSubBlock && LastBlock==BlockType)) break; tseek(ArcPtr,NextBlockPos,SEEK_SET); } } BlockHead.HeadCRC=NewLhd.HeadCRC; BlockHead.HeadType=NewLhd.HeadType; BlockHead.Flags=NewLhd.Flags; BlockHead.HeadSize=NewLhd.HeadSize; BlockHead.DataSize=NewLhd.PackSize; if (BlockType!=NewLhd.HeadType) BlockType=ALL_HEAD; switch(BlockType) { case FILE_HEAD: if (Size>0) { NewLhd.NameSize=Min(NewLhd.NameSize,sizeof(ArcFileName)-1); tread(ArcPtr,ArcFileName,NewLhd.NameSize); ArcFileName[NewLhd.NameSize]=0; if (ArcFormat==NEW && NewLhd.HeadCRC!=(UWORD)~CRC(HeaderCRC,&ArcFileName[0],NewLhd.NameSize,CRC32)) { BrokenFileHeader=1; mprintf(MBrokFileHead,ArcFileName); } if (Opt.ConvertNames==NAMES_UPPERCASE) strupper(ArcFileName); if (Opt.ConvertNames==NAMES_LOWERCASE) strlower(ArcFileName); Size+=NewLhd.NameSize; ConvertUnknownHeader(); } break; default: memcpy(&NewLhd,&SaveFileHead,sizeof(NewLhd)); tseek(ArcPtr,CurBlockPos,SEEK_SET); break; } return(Size); } int ReadHeader(int BlockType) { int Size; unsigned char Header[64]; switch(BlockType) { case MAIN_HEAD: if (ArcFormat==OLD) { Size=tread(ArcPtr,Header,SIZEOF_OLDMHD); memcpy(OldMhd.Mark,Header,4); OldMhd.HeadSize=GetHeaderWord(4); OldMhd.Flags=GetHeaderByte(6); } else { Size=tread(ArcPtr,Header,SIZEOF_NEWMHD); NewMhd.HeadCRC=GetHeaderWord(0); NewMhd.HeadType=GetHeaderByte(2); NewMhd.Flags=GetHeaderWord(3); NewMhd.HeadSize=GetHeaderWord(5); NewMhd.Reserved=GetHeaderWord(7); NewMhd.Reserved1=GetHeaderDword(9); HeaderCRC=CRC(0xFFFFFFFFL,&Header[2],SIZEOF_NEWMHD-2,CRC32); } break; case FILE_HEAD: if (ArcFormat==OLD) { Size=tread(ArcPtr,Header,SIZEOF_OLDLHD); OldLhd.PackSize=GetHeaderDword(0); OldLhd.UnpSize=GetHeaderDword(4); OldLhd.FileCRC=GetHeaderWord(8); OldLhd.HeadSize=GetHeaderWord(10); OldLhd.FileTime=GetHeaderDword(12); OldLhd.FileAttr=GetHeaderByte(16); OldLhd.Flags=GetHeaderByte(17); OldLhd.UnpVer=GetHeaderByte(18); OldLhd.NameSize=GetHeaderByte(19); OldLhd.Method=GetHeaderByte(20); } else { Size=tread(ArcPtr,Header,SIZEOF_NEWLHD); NewLhd.HeadCRC=GetHeaderWord(0); NewLhd.HeadType=GetHeaderByte(2); NewLhd.Flags=GetHeaderWord(3); NewLhd.HeadSize=GetHeaderWord(5); NewLhd.PackSize=GetHeaderDword(7); NewLhd.UnpSize=GetHeaderDword(11); NewLhd.HostOS=GetHeaderByte(15); NewLhd.FileCRC=GetHeaderDword(16); NewLhd.FileTime=GetHeaderDword(20); NewLhd.UnpVer=GetHeaderByte(24); NewLhd.Method=GetHeaderByte(25); NewLhd.NameSize=GetHeaderWord(26); NewLhd.FileAttr=GetHeaderDword(28); HeaderCRC=CRC(0xFFFFFFFFL,&Header[2],SIZEOF_NEWLHD-2,CRC32); } break; case COMM_HEAD: Size=tread(ArcPtr,Header,SIZEOF_COMMHEAD); CommHead.HeadCRC=GetHeaderWord(0); CommHead.HeadType=GetHeaderByte(2); CommHead.Flags=GetHeaderWord(3); CommHead.HeadSize=GetHeaderWord(5); CommHead.UnpSize=GetHeaderWord(7); CommHead.UnpVer=GetHeaderByte(9); CommHead.Method=GetHeaderByte(10); CommHead.CommCRC=GetHeaderWord(11); HeaderCRC=CRC(0xFFFFFFFFL,&Header[2],SIZEOF_COMMHEAD-2,CRC32); break; case PROTECT_HEAD: Size=tread(ArcPtr,Header,SIZEOF_PROTECTHEAD); ProtectHead.HeadCRC=GetHeaderWord(0); ProtectHead.HeadType=GetHeaderByte(2); ProtectHead.Flags=GetHeaderWord(3); ProtectHead.HeadSize=GetHeaderWord(5); ProtectHead.DataSize=GetHeaderDword(7); ProtectHead.Version=GetHeaderByte(11); ProtectHead.RecSectors=GetHeaderWord(12); ProtectHead.TotalBlocks=GetHeaderDword(14); memcpy(ProtectHead.Mark,&Header[18],8); HeaderCRC=CRC(0xFFFFFFFFL,&Header[2],SIZEOF_PROTECTHEAD-2,CRC32); break; case ALL_HEAD: Size=tread(ArcPtr,Header,SIZEOF_SHORTBLOCKHEAD); BlockHead.HeadCRC=GetHeaderWord(0); BlockHead.HeadType=GetHeaderByte(2); BlockHead.Flags=GetHeaderWord(3); BlockHead.HeadSize=GetHeaderWord(5); if (BlockHead.Flags & LONG_BLOCK) { Size+=tread(ArcPtr,&Header[7],4); BlockHead.DataSize=GetHeaderDword(7); } break; } return(Size); }