Mercurial > otakunoraifu
diff system/file_impl.h @ 0:223b71206888
Initial import
author | thib |
---|---|
date | Fri, 01 Aug 2008 16:32:45 +0000 |
parents | |
children | 5f548e5957a8 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/system/file_impl.h @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2004 Kazunori "jagarl" Ueno + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + + +#ifndef __FILE_IMPL_H__ +#define __FILE_IMPL_H__ + +#include<vector> + +struct ARCFILE_ATOM { + char* filename; + char* filename_lower; + off_t offset; + int arcsize; + int filesize; + int private_data; + bool operator <(const ARCFILE_ATOM& to) const { + return strcmp(filename_lower, to.filename_lower) < 0; + } + bool operator <(char* const to) const { + return strcmp(filename_lower, to) < 0; + } +}; + +class ARCFILE { +protected: + char* arcname; + char* filenames_orig; + int list_point; + std::vector<ARCFILE_ATOM> arc_atom; + typedef std::vector<ARCFILE_ATOM>::iterator iterator; + ARCFILE* next; /* FILESEARCH の一つの型が複数の ARCFILE を持つとき、リストをつくる */ + /* arcname に指定されたファイル/ディレクトリの内容チェック */ + virtual int CheckFileDeal(void); + virtual void ListupFiles(int fname_len); + virtual ARCINFO* MakeARCINFO(ARCFILE_ATOM&); + iterator SearchName(const char* f, const char* ext=0); +public: + ARCFILE(char* fname); + void SetNext(ARCFILE* _next) { next = _next;} + ARCFILE* Next(void) { return next; } + void Init(void); + virtual ~ARCFILE(); + /* ファイル検索 */ + class ARCINFO* Find(const char* fname, const char* ext); + /* ファイルリストの出力 */ + int Deal(void) { Init(); return arc_atom.size(); } + void ListFiles(FILE* out); + void InitList(void); + char* ListItem(void); +}; + +class SCN2kFILE : public ARCFILE { +protected: + virtual int CheckFileDeal(void); + virtual void ListupFiles(int fname_len); + virtual ARCINFO* MakeARCINFO(ARCFILE_ATOM& atom); +public: + SCN2kFILE(char* fname) : ARCFILE(fname) {} + virtual ~SCN2kFILE() {} +}; + +class CattleyaFILE : public ARCFILE { + bool is_compress; + /* header の Huffman 木構築用 */ + char* bitbuf; + char* bitbuf_end; + int ltree[0x400]; + int rtree[0x400]; + int treecnt; + int bitcnt; + int GetBit(void); + int GetCh(void); + void SetBuf(char* buf, int len); + int MakeTree(void); + int Decode(int seed); + +protected: + virtual int CheckFileDeal(void); + virtual void ListupFiles(int fname_len); + virtual ARCINFO* MakeARCINFO(ARCFILE_ATOM& atom); +public: + CattleyaFILE(char* fname) : ARCFILE(fname) {is_compress = false;} + virtual ~CattleyaFILE() {} +}; + +class NULFILE : public ARCFILE { +protected: + virtual int CheckFileDeal(void); + virtual void ListupFiles(int fname_len); + virtual ARCINFO* MakeARCINFO(ARCFILE_ATOM& atom); +public: + NULFILE() : ARCFILE("") {} + virtual ~NULFILE() {} +}; +class DIRFILE : public ARCFILE { +protected: + virtual int CheckFileDeal(void); + virtual void ListupFiles(int fname_len); + virtual ARCINFO* MakeARCINFO(ARCFILE_ATOM& atom); +public: + DIRFILE(char* fname) : ARCFILE(fname) {} + virtual ~DIRFILE() {} + FILE* Open(const char* fname); /* FILE* を開く */ + char* SearchFile(const char* dirname); /* ファイル検索 */ +}; +class ARCINFO_AVG32 : public ARCINFO { + ARCINFO_AVG32(const char* name, ARCFILE_ATOM& atom) : ARCINFO(name, atom) { + } + virtual bool ExecExtract(void); + friend class ARCFILE; +}; +class ARCINFO2k : public ARCINFO { + static char decode_seed[256]; + static char decode_seed2[16]; +protected: + ARCINFO2k(const char* name, ARCFILE_ATOM& atom) : ARCINFO(name,atom) { + } + virtual bool ExecExtract(void); + friend class SCN2kFILE; +}; + +class ARCINFOZ : public ARCINFO { +protected: + ARCINFOZ(const char* name, ARCFILE_ATOM& atom) : ARCINFO(name, atom) { + } + virtual bool ExecExtract(void); + friend class DaemonBaneFILE; + friend class CattleyaFILE; +}; + +#endif /* __FILE_IMPL_H__ */