root/system/file.h

Revision 65:4416cfac86ae, 7.3 KB (checked in by Thibaut Girka <thib@…>, 18 months ago)
Convert EUC-JP files to UTF8
Line 
1/*  file.h  : KANON の圧瞮ファむル・PDT ファむル画像ファむルの展開の
2 *            ためのクラス
3 *     class FileSearcher : ファむルの管理を行う
4 *     class ARCINFO : 曞庫ファむルの䞭の぀のファむルを扱うクラス
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 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.
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
54static 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
59static 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
64static 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
78static 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**  FileSearcher:
91**      曞庫ファむルディレクトリを含め、
92**      党ファむルの管理を行う。
93**
94**      最初に、蚭定ファむルからファむルの皮類ごずに
95**      実際に入っおいるディレクトリ、曞庫を蚭定する
96**
97**      以降はFind() メ゜ッドで実際のファむルの内容を埗る
98**
99*/
100
101/* ARCFILE ず DIRFILE はファむル皮類ごずの情報 */
102class ARCFILE;
103class DIRFILE;
104class SCN2kFILE;
105/* ARCINFO はファむルを読み蟌むために必芁 */
106class ARCINFO;
107class ARCFILE_ATOM;
108
109class KeyHolder {
110        public:
111                static KeyHolder* GetInstance(void);
112                static void Quit(void);
113
114                void SetKey(char[16]);
115                void SetKey2(char[33]);
116                void GuessKey(char*);
117
118        private:
119                KeyHolder(){}
120                ~KeyHolder(){}
121
122        public:
123                const char* GetKey(void);
124
125        private:
126                char key[16];
127                static KeyHolder* _singleton;
128};
129
130class FileSearcher {
131        public:
132#define TYPEMAX 14
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};
150
151        public:
152                static FileSearcher* GetInstance(void);
153                static void Quit(void);
154
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);
170
171        private:
172                FileSearcher(void);
173                ~FileSearcher();
174
175        private:
176                /* InitRoot() の時点で初期化される倉数 */
177                DIRFILE* root_dir;
178                DIRFILE* dat_dir;
179                ARCFILE* searcher[TYPEMAX];
180                /* ファむルの存圚䜍眮の information */
181                ARCTYPE is_archived[TYPEMAX];
182                const char* filenames[TYPEMAX];
183                /* デフォルトの information */
184                static ARCTYPE default_is_archived[TYPEMAX];
185                static const char* default_dirnames[TYPEMAX];
186                static FileSearcher *_singleton;
187};
188
189class ARCINFO {
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;
200
201        protected:
202                ARCINFO(const char* arcfile, ARCFILE_ATOM& from); // only from ARCFILE
203                friend class ARCFILE;
204                friend class DIRFILE;
205
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 の堎合、ファむルを開く */
220};
221
222class GRPCONV {
223        public:
224                int width;
225                int height;
226                bool is_mask;
227
228                const char* filename;
229                const char* data;
230                int datalen;
231
232                int Width(void) { return width;}
233                int Height(void) { return height;}
234                bool IsMask(void) { return is_mask;}
235
236                GRPCONV(void);
237                virtual ~GRPCONV();
238                void Init(const char* fname, const char* data, int dlen, int width, int height, bool is_mask);
239
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);
251};
252
253#endif // !defined(__KANON_FILE_H__)
Note: See TracBrowser for help on using the browser.