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
43 char* filename
= "data.zip";
44 arc
= zip_aropenf(filename
);
46 fatal_error("loader: unable to load data archive \"%s\" (%s)\n", filename
, zip_geterror());
48 boot_msg("loader: ... OK\n");
55 reader
* data_open(char* dir
, char* filename
){
58 strcat(buf
, filename
);
59 return loader_open(buf
);
62 reader
* loader_open(char* filename
){
63 char buf
[1024] = "data/";
65 strncpy(buf
+L
,filename
,1024-L
);
68 reader
* rd
= xmalloc(sizeof(reader
));
69 rd
->f
= zip_fopen(arc
, filename
);
71 error_msg("loader_open: can't open %s (%s)\n", filename
, zip_geterror());
79 void loader_close(reader
* rd
){
85 int loader_read(reader
* rd
, void* buf
, int count
){
86 int n
= zip_fread(rd
->f
, buf
, count
);
88 error_msg("loader_read: %s\n", zip_geterror());
94 unsigned char* loader_readall(char* filename
, int* size
){
95 reader
* rd
= loader_open(filename
);
98 /* somehow read all of rd into a buffer and return it */
101 error_msg("loader_readall: not yet implemented\n");
105 int loader_readline(reader
* rd
, char* buf
, int size
){
111 n
= loader_read(rd
, &c
, 1);
112 if(n
== 0){ /* end of file */
118 error_msg("loader_readline: %s\n", zip_geterror());
122 if(c
== '\r'){ /* CRLF ? */
123 n
= loader_read(rd
, &c
, 1);
124 if(n
== 0){ /* file ended with CR... well take it */
130 error_msg("loader_readline: %s\n", zip_geterror());
135 error_msg("loader_readline: I cannot read lines ending in CR and not CRLF\n");
143 if(c
== '\n'){ /* LF */
152 error_msg("loader_readline: buffer size too small\n");
156 int loader_scanline(reader
* rd
, char* format
, ...){
161 if(loader_readline(rd
, buf
, 256) < 0){
165 va_start(ap
, format
);
166 ret
= vsscanf(buf
,format
,ap
);
176 int read_bytes(reader
* rd
, unsigned char* buf
, int count
){
177 int n
= loader_read(rd
, buf
, count
);
179 error_msg("read_bytes: read error\n");
183 error_msg("read_bytes: end of file reached prematurely (%d out of %d read)\n", n
, count
);
191 int read_byte(reader
* rd
, int* out
){
193 int n
= loader_read(rd
, &c
, 1);
195 error_msg("read_byte: read error\n");
204 int read_short(reader
* rd
, int* out
){
206 int n
= loader_read(rd
, c
, 2);
209 error_msg("read_byte: read error\n");
213 error_msg("read_short: end of file reached prematurely\n");
217 *out
= (c
[0]<<8) | c
[1];
222 int read_int(reader
* rd
, int* out
){
224 int n
= loader_read(rd
, c
, 4);
227 error_msg("read_byte: read error\n");
231 error_msg("read_int: end of file reached prematurely\n");
235 *out
= (c
[0]<<24) | (c
[1]<<16) | (c
[2]<<8) | c
[3];
240 int read_string(reader
* rd
, char** out
){
242 if(read_int(rd
, (int*)&L
) < 0){
248 if(read_bytes(rd
, (unsigned char*)*out
, L
) < 0){
259 list
* loader_readdir(char* path
){
260 zip_dir
* dir
= zip_opendir(arc
, path
);
262 error_msg("loader_readdir: unable to open '%s' (%s)\n",
263 path
, zip_geterror());
267 list
* dirs
= empty();
269 char* entry
= zip_readdir(dir
);
270 if(entry
== NULL
) break;
271 else push(dirs
, entry
);
277 void loader_freedirlist(list
* dirs
){