5128eecc9f 2011-02-23 kinaba: #ifndef AFX_LZHTOOL_H__31F8AA01_3F84_11D4_8D96_8AB5A6462337__INCLUDED_ 5128eecc9f 2011-02-23 kinaba: #define AFX_LZHTOOL_H__31F8AA01_3F84_11D4_8D96_8AB5A6462337__INCLUDED_ 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: // Lzh Archive Extraction ... ( XacRett #39 SubSet ) 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: class CLzhTool 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: public: 5128eecc9f 2011-02-23 kinaba: //-- 外向きインターフェイス -------------- 5128eecc9f 2011-02-23 kinaba: bool Extract( const char* aname, const char* dll, kiPath& dll_rel_path ); 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: public: 5128eecc9f 2011-02-23 kinaba: //-- CRC 計算 --------------------------- 5128eecc9f 2011-02-23 kinaba: static bool crcinit; 5128eecc9f 2011-02-23 kinaba: static unsigned short crctable[256]; 5128eecc9f 2011-02-23 kinaba: static void init_crc_table(){ 5128eecc9f 2011-02-23 kinaba: if( !crcinit ) 5128eecc9f 2011-02-23 kinaba: for( unsigned short i=0,j,r; i!=256; i++ ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: r = i; 5128eecc9f 2011-02-23 kinaba: for( j=0; j!=8; j++ ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: if( r&1 ) r = ((r>>1)^0xA001); 5128eecc9f 2011-02-23 kinaba: else r>>=1; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: crctable[i] = r; 5128eecc9f 2011-02-23 kinaba: }} 5128eecc9f 2011-02-23 kinaba: CLzhTool() { init_crc_table(); } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: private: 5128eecc9f 2011-02-23 kinaba: //-- 内部処理 5128eecc9f 2011-02-23 kinaba: int FindHeader( const char* fname, const BYTE* hdr, DWORD siz ); 5128eecc9f 2011-02-23 kinaba: bool ReadHeader( unsigned char* buf ); 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: WORD crc; 5128eecc9f 2011-02-23 kinaba: BYTE sum; 5128eecc9f 2011-02-23 kinaba: void UpdateCRC( BYTE *p,int n ) 5128eecc9f 2011-02-23 kinaba: {while( n-- )crc = crctable[(crc^(*p++))&0xff] ^ (crc >> 8);} 5128eecc9f 2011-02-23 kinaba: void UpdateSum( BYTE *p,int n ) 5128eecc9f 2011-02-23 kinaba: {while( n-- )sum+=*(p++);} 5128eecc9f 2011-02-23 kinaba: int fread_crc( BYTE* p,int n) 5128eecc9f 2011-02-23 kinaba: {n=fread(p,1,n,lzh);if(n==-1)n=0; 5128eecc9f 2011-02-23 kinaba: UpdateCRC(p,n);UpdateSum(p,n);return n;} 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: FILE *lzh,*out; 5128eecc9f 2011-02-23 kinaba: BYTE h_Level; // ヘッダレベル 5128eecc9f 2011-02-23 kinaba: char h_FileName[MAX_PATH*2]; // ファイル名(パス付き) 5128eecc9f 2011-02-23 kinaba: char h_Method[6]; // 圧縮法 "-lh5-" など。 5128eecc9f 2011-02-23 kinaba: DWORD h_CompSize; // 圧縮されたサイズ 5128eecc9f 2011-02-23 kinaba: DWORD h_OrigSize; // 元のサイズ 5128eecc9f 2011-02-23 kinaba: WORD h_Attrib; // 属性 5128eecc9f 2011-02-23 kinaba: DWORD h_Update; // 更新日時(h0,h1:ftime h2:time_t) 5128eecc9f 2011-02-23 kinaba: }; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: #endif