annotate system/file.h @ 41:4c832144b3f2

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