annotate system/file.h @ 18:4d7486cb20a9

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