archive.cpp

来自「国外网站上的一些精典的C程序」· C++ 代码 · 共 102 行

CPP
102
字号
/***  ARCHIVE.CPP****   Written by Jari Laaksonen (2:221/360.20), 2 Sep 1994**   Based on the code by Heinz Ozwirk and David Gersic.****   Free for all participants of the C_ECHO & other conferences where**   this code is posted. Released to SNIPPETS by the authors.****   See the file WhichArc.DOC about archive types and file offsets**   for self extracting archives.*/#include "archive.hpp"#include "whicharc.h"int Archive::Scan (FILE *fp, char *szBuff, long flen){      if (offset > flen)            return 0;      int rc;      rc = SeekFile (fp, szBuff, offset);      if (rc > 0)            rc = Check (szBuff);      return (rc > UNKNOWN ? sfxtype : rc);}// Generic fingerprint check.// LHA and PAK/ARC needs more complicated checking// If some new archiver needs different check algorithm, derive a new// class from class Archive and write a new Check() function.int Archive::Check (char *szBuff){      char *p;      p = fingerprint;      while (*p)      {            if (*p != *szBuff)                  return UNKNOWN;            p++;            szBuff++;      }      return type;}int LhaArchive::Check (char *szBuff){      int i, c;      for (c = 0, i = szBuff[0]; i--; c += (szBuff + 2)[i])            ;      if (          ((unsigned char) (c & 0x00FF)) == szBuff[1]          && szBuff[2] == fingerprint[0]          && szBuff[3] == fingerprint[1]          && szBuff[4] == fingerprint[2]          && szBuff[6] == fingerprint[3]         )      {            if (szBuff[5] > '1')            {                  sfxtype = SFXLHA;                  return LHA;            }            else            {                  sfxtype = SFXLHARC;                  return LHARC;            }      }      else  return UNKNOWN;}int PakArchive::Check (char *szBuff){      if (szBuff[0] == 0x1A)      {            if (szBuff[1] == 0x0A || szBuff[1] == 0x0B)            {                  sfxtype = SFXPAK;                  return PAK;            }            else if (szBuff[1] > 0x14)            {                  sfxtype = SFXARC6;                  return ARC6;            }            else            {                  sfxtype = SFXARC;                  return ARC;            }      }      else  return UNKNOWN;}

⌨️ 快捷键说明

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