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__)