Mercurial > otakunoraifu
annotate system/file.h @ 57:6d9146f56ccf
* Move some opcodes
* Merge last changes from xclannad
author | Thibaut GIRKA <thib@sitedethib.com> |
---|---|
date | Sat, 14 Nov 2009 23:31:51 +0100 |
parents | ddbcbd000206 |
children | 4416cfac86ae |
rev | line source |
---|---|
0 | 1 /* file.h : KANON の圧縮ファイル・PDT ファイル(画像ファイル)の展開の |
2 * ためのクラス | |
53
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
3 * class FileSearcher : ファイルの管理を行う |
0 | 4 * class ARCINFO : 書庫ファイルの中の1つのファイルを扱うクラス |
5 * class PDTCONV : PDT ファイルの展開を行う。 | |
6 */ | |
7 | |
8 /* | |
9 * | |
10 * Copyright (C) 2000- Kazunori Ueno(JAGARL) <jagarl@creator.club.ne.jp> | |
11 * | |
12 * This program is free software; you can redistribute it and/or modify | |
13 * it under the terms of the GNU General Public License as published by | |
14 * the Free Software Foundation; either version 2 of the License, or | |
15 * (at your option) any later version. | |
16 * | |
17 * This program is distributed in the hope that it will be useful, | |
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
20 * GNU General Public License for more details. | |
21 * | |
27 | 22 * You should have received a copy of the GNU General Public License along |
23 * with this program; if not, write to the Free Software Foundation, Inc., | |
24 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
0 | 25 * |
26 */ | |
27 | |
28 #ifndef __KANON_FILE_H__ | |
29 #define __KANON_FILE_H__ | |
30 | |
31 #ifndef DIR_SPLIT | |
32 #define DIR_SPLIT '/' /* UNIX */ | |
33 #endif | |
34 | |
35 // read 'KANON' compressed file | |
36 | |
52 | 37 #include <stdio.h> |
38 #include <stdlib.h> | |
39 #include <string.h> | |
40 #include <sys/types.h> | |
0 | 41 |
42 #ifdef HAVE_CONFIG_H | |
43 # include "config.h" | |
44 #endif | |
45 | |
46 #if defined(__sparc) || defined(sparc) | |
47 # if !defined(WORDS_BIGENDIAN) | |
48 # define WORDS_BIGENDIAN 1 | |
49 # endif | |
50 #endif | |
51 | |
52 #define INT_SIZE 4 | |
53 | |
54 static int read_little_endian_int(const char* buf) { | |
55 const unsigned char *p = (const unsigned char *) buf; | |
56 return (p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0]; | |
57 } | |
58 | |
59 static int read_little_endian_short(const char* buf) { | |
60 const unsigned char *p = (const unsigned char *) buf; | |
61 return (p[1] << 8) | p[0]; | |
62 } | |
63 | |
64 static int write_little_endian_int(char* buf, int number) { | |
65 int c = read_little_endian_int(buf); | |
66 unsigned char *p = (unsigned char *) buf; | |
67 unsigned int unum = (unsigned int) number; | |
68 p[0] = unum & 255; | |
69 unum >>= 8; | |
70 p[1] = unum & 255; | |
71 unum >>= 8; | |
72 p[2] = unum & 255; | |
73 unum >>= 8; | |
74 p[3] = unum & 255; | |
75 return c; | |
76 } | |
77 | |
78 static int write_little_endian_short(char* buf, int number) { | |
79 int c = read_little_endian_short(buf); | |
80 unsigned char *p = (unsigned char *) buf; | |
81 unsigned int unum = (unsigned int) number; | |
82 p[0] = unum & 255; | |
83 unum >>= 8; | |
84 p[1] = unum & 255; | |
85 return c; | |
86 } | |
87 | |
88 | |
89 /********************************************* | |
53
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
90 ** FileSearcher: |
0 | 91 ** 書庫ファイル/ディレクトリを含め、 |
92 ** 全ファイルの管理を行う。 | |
93 ** | |
94 ** 最初に、設定ファイルからファイルの種類ごとに | |
95 ** 実際に入っているディレクトリ、書庫を設定する | |
96 ** | |
97 ** 以降はFind() メソッドで実際のファイルの内容を得る | |
98 ** | |
99 */ | |
100 | |
101 /* ARCFILE と DIRFILE はファイル種類ごとの情報 */ | |
102 class ARCFILE; | |
103 class DIRFILE; | |
104 class SCN2kFILE; | |
105 /* ARCINFO はファイルを読み込むために必要 */ | |
106 class ARCINFO; | |
107 class ARCFILE_ATOM; | |
35 | 108 |
53
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
109 class KeyHolder { |
52 | 110 public: |
53
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
111 static KeyHolder* GetInstance(void); |
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
112 static void Quit(void); |
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
113 |
52 | 114 void SetKey(char[16]); |
115 void SetKey2(char[33]); | |
116 void GuessKey(char*); | |
53
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
117 |
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
118 private: |
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
119 KeyHolder(){} |
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
120 ~KeyHolder(){} |
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
121 |
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
122 public: |
52 | 123 const char* GetKey(void); |
53
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
124 |
52 | 125 private: |
126 char key[16]; | |
53
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
127 static KeyHolder* _singleton; |
35 | 128 }; |
129 | |
53
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
130 class FileSearcher { |
52 | 131 public: |
0 | 132 #define TYPEMAX 14 |
52 | 133 enum FILETYPE { |
134 /* 一応、0 - 15 まで reserved */ | |
135 ALL = 1, /* dat/ 以下のファイル(デフォルトの検索先) */ | |
136 ROOT= 2, /* ゲームのインストールディレクトリ */ | |
137 PDT = 3, /* default: PDT/ */ | |
138 SCN = 4, /* default: DAT/SEEN.TXT */ | |
139 ANM = 5, /* default: DAT/ALLANM.ANL */ | |
140 ARD = 6, /* default: DAT/ALLARD.ARD */ | |
141 CUR = 7, /* default: DAT/ALLCUR.CUR */ | |
142 MID = 8, /* default: ALL */ | |
143 WAV = 9, /* default: ALL */ | |
144 KOE = 10, /* default: KOE/ */ | |
145 BGM = 11, /* default: BGM */ | |
146 MOV = 12, /* default : MOV */ | |
147 GAN = 13 /* default : MOV */ | |
148 }; | |
149 enum ARCTYPE {ATYPE_DIR, ATYPE_ARC, ATYPE_SCN2k}; | |
53
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
150 |
52 | 151 public: |
53
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
152 static FileSearcher* GetInstance(void); |
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
153 static void Quit(void); |
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
154 |
52 | 155 /* 初めにゲームのデータがあるディレクトリを設定する必要がある */ |
156 int InitRoot(char* root); | |
157 /* ファイルの型ごとの情報をセットする */ | |
158 void SetFileInformation(FILETYPE type, ARCTYPE is_arc, | |
159 char* filename); | |
160 /* 複数のファイルを一つの型に関連づける */ | |
161 void AppendFileInformation(FILETYPE type, ARCTYPE is_arc, | |
162 char* filename); | |
163 ARCFILE* MakeARCFILE(ARCTYPE tp, const char* filename); | |
164 /* fname で指定された名前のファイルを検索 */ | |
165 class ARCINFO* Find(FILETYPE type, const char* fname, const char* ext=0); | |
166 /* ある種類のファイルをすべてリストアップ | |
167 ** 末尾は NULL pointer | |
168 */ | |
169 char** ListAll(FILETYPE type); | |
53
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
170 |
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
171 private: |
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
172 FileSearcher(void); |
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
173 ~FileSearcher(); |
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
174 |
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
175 private: |
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
176 /* InitRoot() の時点で初期化される変数 */ |
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
177 DIRFILE* root_dir; |
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
178 DIRFILE* dat_dir; |
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
179 ARCFILE* searcher[TYPEMAX]; |
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
180 /* ファイルの存在位置の information */ |
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
181 ARCTYPE is_archived[TYPEMAX]; |
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
182 const char* filenames[TYPEMAX]; |
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
183 /* デフォルトの information */ |
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
184 static ARCTYPE default_is_archived[TYPEMAX]; |
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
185 static const char* default_dirnames[TYPEMAX]; |
ddbcbd000206
* MuSys, AyuSysConfig, FileSearcher (former FILESEARCHER) and KeyHolder (former KEYHOLDER) are now singletons
thib
parents:
52
diff
changeset
|
186 static FileSearcher *_singleton; |
0 | 187 }; |
188 | |
189 class ARCINFO { | |
52 | 190 protected: |
191 /* ファイルそのものの情報 */ | |
192 ARCFILE_ATOM& info; | |
193 char* arcfile; | |
194 /* mmap している場合、その情報 */ | |
195 bool use_mmap; | |
196 char* mmapped_memory; | |
197 int fd; | |
198 /* ファイル内容の入っているバッファ */ | |
199 const char* data; | |
0 | 200 |
52 | 201 protected: |
202 ARCINFO(const char* arcfile, ARCFILE_ATOM& from); // only from ARCFILE | |
203 friend class ARCFILE; | |
204 friend class DIRFILE; | |
0 | 205 |
52 | 206 virtual bool ExecExtract(void); |
207 public: | |
208 /* dest は256byte 程度の余裕があること */ | |
209 static void Extract(char*& dest, char*& src, char* destend, char* srcend); | |
210 static void Extract2k(char*& dest, char*& src, char* destend, char* srcend); | |
211 virtual ~ARCINFO(); | |
212 /* 必要なら Read 前に呼ぶことで処理を分割できる */ | |
213 int Size(void) const; | |
214 char* CopyRead(void); /* Read() して内容のコピーを返す */ | |
215 const char* Read(void); | |
216 /* ファイルが regular file の場合、ファイル名を帰す */ | |
217 /* そうでないなら 0 を帰す */ | |
218 const char* Path(void) const; | |
219 FILE* OpenFile(int* length=0) const; /* 互換性のため:raw file の場合、ファイルを開く */ | |
0 | 220 }; |
221 | |
222 class GRPCONV { | |
52 | 223 public: |
224 int width; | |
225 int height; | |
226 bool is_mask; | |
0 | 227 |
52 | 228 const char* filename; |
229 const char* data; | |
230 int datalen; | |
0 | 231 |
52 | 232 int Width(void) { return width;} |
233 int Height(void) { return height;} | |
234 bool IsMask(void) { return is_mask;} | |
0 | 235 |
52 | 236 GRPCONV(void); |
237 virtual ~GRPCONV(); | |
238 void Init(const char* fname, const char* data, int dlen, int width, int height, bool is_mask); | |
0 | 239 |
52 | 240 virtual bool Read(char* image) = 0; |
241 static GRPCONV* AssignConverter(const char* inbuf, int inlen, const char* fname); | |
242 static GRPCONV* AssignConverter(ARCINFO* info) { | |
243 const char* dat = info->Read(); | |
244 if (dat == 0) return 0; | |
245 return AssignConverter(dat, info->Size(), info->Path()); //FIXME: Is it really okay? | |
246 } | |
247 void CopyRGBA(char* image, const char* from); | |
248 void CopyRGB(char* image, const char* from); | |
249 void CopyRGBA_rev(char* image, const char* from); | |
250 void CopyRGB_rev(char* image, const char* from); | |
0 | 251 }; |
252 | |
253 #endif // !defined(__KANON_FILE_H__) |