2 Cantaveria - action adventure platform game
3 Copyright (C) 2009 2010 Evan Rinehart
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public License
7 as published by the Free Software Foundation; either version 2
8 of the License, or (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to
18 The Free Software Foundation, Inc.
19 51 Franklin Street, Fifth Floor
20 Boston, MA 02110-1301, USA
44 void loader_data_mode(int flag
){
45 if(flag
== 0) data_mode
= 0;
46 if(flag
== 1) data_mode
= 1;
50 const char* filename
= "data.zip";
51 arc
= zip_aropenf(filename
);
53 fatal_error("loader: unable to load data archive \"%s\" (%s)\n", filename
, zip_geterror());
55 boot_msg("loader: game data found\n");
62 reader
* loader_opend(const char* filename
){
63 char buf
[1024] = "data/";
65 strncpy(buf
+L
,filename
,1024-L
);
68 reader
* rd
= xmalloc(sizeof(reader
));
70 rd
->zf
= zip_fopen(arc
, filename
);
72 error_msg("loader_open: can't open %s (%s)\n", filename
, zip_geterror());
79 reader
* loader_openf(const char* path
){
80 reader
* rd
= xmalloc(sizeof(reader
));
82 rd
->ff
= fopen(path
, "r");
84 error_msg("loader_fopen: can't open %s\n", path
);
91 reader
* loader_open(const char* filename
){
93 return loader_openf(filename
);
95 else if(data_mode
== 1){
96 return loader_opend(filename
);
99 error_msg("loader_open: inconsistent data_mode\n");
104 void loader_close(reader
* rd
){
105 if(rd
->ff
) fclose(rd
->ff
);
106 if(rd
->zf
) zip_fclose(rd
->zf
);
111 int loader_read(reader
* rd
, void* buf
, int count
){
113 int n
= zip_fread(rd
->zf
, buf
, count
);
115 error_msg("loader_read: %s\n", zip_geterror());
121 int n
= fread(buf
, 1, count
, rd
->ff
);
123 error_msg("loader_read: read error\n");
129 error_msg("loader_read: inconsistent reader\n");
134 unsigned char* loader_readall(const char* filename
, int* size
){
135 reader
* rd
= loader_open(filename
);
138 /* somehow read all of rd into a buffer and return it */
141 error_msg("loader_readall: not yet implemented\n");
145 int loader_readline(reader
* rd
, char* buf
, int size
){
151 n
= loader_read(rd
, &c
, 1);
152 if(n
== 0){ /* end of file */
158 error_msg("loader_readline: %s\n", zip_geterror());
162 if(c
== '\r'){ /* CRLF ? */
163 n
= loader_read(rd
, &c
, 1);
164 if(n
== 0){ /* file ended with CR... well take it */
170 error_msg("loader_readline: %s\n", zip_geterror());
175 error_msg("loader_readline: I cannot read lines ending in CR and not CRLF\n");
183 if(c
== '\n'){ /* LF */
192 error_msg("loader_readline: buffer size too small\n");
196 int loader_scanline(reader
* rd
, const char* format
, ...){
201 if(loader_readline(rd
, buf
, 256) < 0){
205 va_start(ap
, format
);
206 ret
= vsscanf(buf
,format
,ap
);
212 int loader_feof(reader
* rd
){
214 return zip_feof(rd
->zf
);
220 error_msg("loader_feof: inconsistent reader\n");
227 int read_bytes(reader
* rd
, unsigned char* buf
, int count
){
228 int n
= loader_read(rd
, buf
, count
);
230 error_msg("read_bytes: read error\n");
234 error_msg("read_bytes: end of file reached prematurely (%d out of %d read)\n", n
, count
);
242 int read_byte(reader
* rd
, int* out
){
244 int n
= loader_read(rd
, &c
, 1);
246 error_msg("read_byte: read error\n");
255 int read_short(reader
* rd
, int* out
){
257 int n
= loader_read(rd
, c
, 2);
260 error_msg("read_byte: read error\n");
264 error_msg("read_short: end of file reached prematurely\n");
268 *out
= (c
[0]<<8) | c
[1];
273 int read_int(reader
* rd
, int* out
){
275 int n
= loader_read(rd
, c
, 4);
278 error_msg("read_byte: read error\n");
282 error_msg("read_int: end of file reached prematurely\n");
286 *out
= (c
[0]<<24) | (c
[1]<<16) | (c
[2]<<8) | c
[3];
291 int read_string(reader
* rd
, char** out
){
294 if(read_int(rd
, (int*)&L
) < 0){
301 if(read_bytes(rd
, (unsigned char*)*out
, L
) < 0){
312 list
* loader_readdir(const char* path
){
313 zip_dir
* dir
= zip_opendir(arc
, path
);
315 error_msg("loader_readdir: unable to open '%s' (%s)\n",
316 path
, zip_geterror());
320 list
* dirs
= empty();
322 char* entry
= zip_readdir(dir
);
323 if(entry
== NULL
) break;
324 else push(dirs
, entry
);
330 void loader_freedirlist(list
* dirs
){