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_byte(reader
* rd
){
178 loader_read(rd
, &c
, 1);
182 int read_short(reader
* rd
){
183 unsigned char c
[2] = {0,0};
184 loader_read(rd
, c
+0, 1);
185 loader_read(rd
, c
+1, 1);
186 return (c
[0]<<8) | c
[1];
189 int read_int(reader
* rd
){
190 unsigned char c
[4] = {0,0,0,0};
191 loader_read(rd
, c
+0, 1);
192 loader_read(rd
, c
+1, 1);
193 loader_read(rd
, c
+2, 1);
194 loader_read(rd
, c
+3, 1);
195 return (c
[0]<<24) | (c
[1]<<16) | (c
[2]<<8) | c
[3];
198 char* read_string(reader
* rd
){
199 unsigned int L
= read_int(rd
);
200 if(L
==0) return NULL
;
201 char* S
= xmalloc(L
+1);
203 loader_read(rd
, S
, L
);
209 list
* loader_readdir(char* path
){
210 zip_dir
* dir
= zip_opendir(arc
, path
);
212 error_msg("loader_readdir: unable to open '%s' (%s)\n",
213 path
, zip_geterror());
217 list
* dirs
= empty();
219 char* entry
= zip_readdir(dir
);
220 if(entry
== NULL
) break;
221 else push(dirs
, entry
);
227 void loader_freedirlist(list
* dirs
){