Mercurial > otakunoraifu
comparison system/file.h @ 0:223b71206888
Initial import
author | thib |
---|---|
date | Fri, 01 Aug 2008 16:32:45 +0000 |
parents | |
children | 3a6aaeab7b4e |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:223b71206888 |
---|---|
1 /* file.h : KANON の圧縮ファイル・PDT ファイル(画像ファイル)の展開の | |
2 * ためのクラス | |
3 * class FILESEARCH : ファイルの管理を行う | |
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 * | |
22 * You should have received a copy of the GNU General Public License | |
23 * along with this program; if not, write to the Free Software | |
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
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 | |
37 #include<stdio.h> | |
38 #include<stdlib.h> | |
39 #include<string.h> | |
40 #include<sys/types.h> | |
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 /********************************************* | |
90 ** FILESEARCH: | |
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; | |
108 class FILESEARCH { | |
109 public: | |
110 #define TYPEMAX 14 | |
111 enum FILETYPE { | |
112 /* 一応、0 - 15 まで reserved */ | |
113 ALL = 1, /* dat/ 以下のファイル(デフォルトの検索先) */ | |
114 ROOT= 2, /* ゲームのインストールディレクトリ */ | |
115 PDT = 3, /* default: PDT/ */ | |
116 SCN = 4, /* default: DAT/SEEN.TXT */ | |
117 ANM = 5, /* default: DAT/ALLANM.ANL */ | |
118 ARD = 6, /* default: DAT/ALLARD.ARD */ | |
119 CUR = 7, /* default: DAT/ALLCUR.CUR */ | |
120 MID = 8, /* default: ALL */ | |
121 WAV = 9, /* default: ALL */ | |
122 KOE = 10, /* default: KOE/ */ | |
123 BGM = 11, /* default: BGM */ | |
124 MOV = 12, /* default : MOV */ | |
125 GAN = 13 /* default : MOV */ | |
126 }; | |
127 enum ARCTYPE {ATYPE_DIR, ATYPE_ARC, ATYPE_SCN2k}; | |
128 private: | |
129 /* InitRoot() の時点で初期化される変数 */ | |
130 DIRFILE* root_dir; | |
131 DIRFILE* dat_dir; | |
132 ARCFILE* searcher[TYPEMAX]; | |
133 /* ファイルの存在位置の information */ | |
134 ARCTYPE is_archived[TYPEMAX]; | |
135 char* filenames[TYPEMAX]; | |
136 /* デフォルトの information */ | |
137 static ARCTYPE default_is_archived[TYPEMAX]; | |
138 static char* default_dirnames[TYPEMAX]; | |
139 public: | |
140 FILESEARCH(void); | |
141 ~FILESEARCH(); | |
142 /* 初めにゲームのデータがあるディレクトリを設定する必要がある */ | |
143 int InitRoot(char* root); | |
144 /* ファイルの型ごとの情報をセットする */ | |
145 void SetFileInformation(FILETYPE type, ARCTYPE is_arc, | |
146 char* filename); | |
147 /* 複数のファイルを一つの型に関連づける */ | |
148 void AppendFileInformation(FILETYPE type, ARCTYPE is_arc, | |
149 char* filename); | |
150 ARCFILE* MakeARCFILE(ARCTYPE tp, char* filename); | |
151 /* fname で指定された名前のファイルを検索 */ | |
152 class ARCINFO* Find(FILETYPE type, const char* fname, const char* ext=0); | |
153 /* ある種類のファイルをすべてリストアップ | |
154 ** 末尾は NULL pointer | |
155 */ | |
156 char** ListAll(FILETYPE type); | |
157 }; | |
158 | |
159 class ARCINFO { | |
160 protected: | |
161 /* ファイルそのものの情報 */ | |
162 ARCFILE_ATOM& info; | |
163 char* arcfile; | |
164 /* mmap している場合、その情報 */ | |
165 bool use_mmap; | |
166 char* mmapped_memory; | |
167 int fd; | |
168 /* ファイル内容の入っているバッファ */ | |
169 const char* data; | |
170 | |
171 protected: | |
172 ARCINFO(const char* arcfile, ARCFILE_ATOM& from); // only from ARCFILE | |
173 friend class ARCFILE; | |
174 friend class DIRFILE; | |
175 | |
176 virtual bool ExecExtract(void); | |
177 public: | |
178 /* dest は256byte 程度の余裕があること */ | |
179 static void Extract(char*& dest, char*& src, char* destend, char* srcend); | |
180 static void Extract2k(char*& dest, char*& src, char* destend, char* srcend); | |
181 virtual ~ARCINFO(); | |
182 /* 必要なら Read 前に呼ぶことで処理を分割できる */ | |
183 int Size(void) const; | |
184 char* CopyRead(void); /* Read() して内容のコピーを返す */ | |
185 const char* Read(void); | |
186 /* ファイルが regular file の場合、ファイル名を帰す */ | |
187 /* そうでないなら 0 を帰す */ | |
188 const char* Path(void) const; | |
189 FILE* OpenFile(int* length=0) const; /* 互換性のため:raw file の場合、ファイルを開く */ | |
190 }; | |
191 | |
192 class GRPCONV { | |
193 public: | |
194 int width; | |
195 int height; | |
196 bool is_mask; | |
197 | |
198 const char* filename; | |
199 const char* data; | |
200 int datalen; | |
201 | |
202 int Width(void) { return width;} | |
203 int Height(void) { return height;} | |
204 bool IsMask(void) { return is_mask;} | |
205 | |
206 GRPCONV(void); | |
207 virtual ~GRPCONV(); | |
208 void Init(const char* fname, const char* data, int dlen, int width, int height, bool is_mask); | |
209 | |
210 virtual bool Read(char* image) = 0; | |
211 static GRPCONV* AssignConverter(const char* inbuf, int inlen, const char* fname); | |
212 static GRPCONV* AssignConverter(ARCINFO* info) { | |
213 const char* dat = info->Read(); | |
214 if (dat == 0) return 0; | |
215 return AssignConverter(dat, info->Size(), "???"); | |
216 } | |
217 void CopyRGBA(char* image, const char* from); | |
218 void CopyRGB(char* image, const char* from); | |
219 void CopyRGBA_rev(char* image, const char* from); | |
220 void CopyRGB_rev(char* image, const char* from); | |
221 }; | |
222 | |
223 extern FILESEARCH file_searcher; | |
224 | |
225 #endif // !defined(__KANON_FILE_H__) |