Artifact Content

Not logged in

Artifact c145f6b51ea7d9825a60107360d36a8bea08f858


#ifndef AFX_ZIPTOOL_H__4C5F3720_4483_11D4_8D96_88668194683D__INCLUDED_
#define AFX_ZIPTOOL_H__4C5F3720_4483_11D4_8D96_88668194683D__INCLUDED_

// Zip Archive Extraction ... ( XacRett #39 SubSet )

// ローカルヘッダ
struct ZipLocalHeader
{
	// 'P' 'K' 03 04
	 WORD ver; // version_needed_to_extract
	 WORD flg; // general_purpose_bit_flag
	 WORD mhd; // compression_method
	 WORD tim; // last_modified_file_time
	 WORD dat; // last_modified_file_date
	DWORD crc; // crc32
	DWORD csz; // compressed-size
	DWORD usz; // uncompressed-size
	 WORD fnl; // filename-len
	 WORD exl; // extra_field_length

	char fnm[MAX_PATH];
//	BYTE ext[];
};

// 圧縮メソッドの種類
enum ZipMethod
{
	Stored,		// 0
	Shrunk,		// 1
	Reduced1,	// 2-5
	Reduced2,
	Reduced3,
	Reduced4,
	Imploded,	// 6
	Tokenized,	// 7 ( not supported )
	Deflated,	// 8
	EnhDeflated,// 9 ( not supported )
	DclImploded,//10 ( not supported )

	Err=178     // this value is used by xacrett (^^;
};

class CZipTool
{

public:
	//-- 外向きインターフェイス --------------
	bool Extract( const char* aname, const char* dll, kiPath& dll_rel_path );

private: //-- Zip内部処理用 -----------------------

// CRC
	DWORD crc32( DWORD crc, const BYTE* dat, int len );
// ファイルIO
	FILE *zip,*out;
	void zipwrite( BYTE* dat, int len )
		{ fwrite( dat, 1, len, out ); }
	int zipread( BYTE* dat, int len )
		{ return fread( dat, 1, len, zip ); }
// bit-reader
	unsigned long bitbuf;
	int bits_left;
	bool bits_eof;

	void initbits()
		{
			bits_eof=false, bits_left=0, bitbuf=0;
		}
	int getbits( int n )
		{
			if( n <= bits_left )
			{
				int c = (int)(bitbuf & ((1<<n)-1));
				bitbuf >>= n;
				bits_left -= n;
				return c;
			}
			return fillbits( n );
		}
	int fillbits( int n )
		{
			BYTE next;

			if( !zipread( &next,1 ) )
				bits_eof = true;
			else
			{
				bitbuf |= (next<<bits_left);
				bits_left += 8;

				if( zipread( &next,1 ) )
				{
					bitbuf |= (next<<bits_left);
					bits_left += 8;
				}
			}

			int c = (int)(bitbuf & ((1<<n)-1));
			bitbuf >>= n;
			bits_left -= n;
			return c;
		}

// 展開アルゴリズム
	void Unstore( DWORD usz, DWORD csz );
	void Inflate( DWORD usz, DWORD csz );

// ヘッダ処理
// 面倒なのでCentralDirectory系は一切無視!

	// 現在のファイル位置からヘッダとして読む
	bool read_header( ZipLocalHeader* hdr );
	// ヘッダ位置を探し出して読む
	bool doHeader( ZipLocalHeader* hdr );
};

#endif