Skip to content

Latest commit

 

History

History
549 lines (435 loc) · 14.8 KB

archiver_wad.c

File metadata and controls

549 lines (435 loc) · 14.8 KB
 
Dec 15, 2003
Dec 15, 2003
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/*
* WAD support routines for PhysicsFS.
*
* This driver handles DOOM engine archives ("wads").
* This format (but not this driver) was designed by id Software for use
* with the DOOM engine.
* The specs of the format are from the unofficial doom specs v1.666
* found here: http://www.gamers.org/dhs/helpdocs/dmsp1666.html
* The format of the archive: (from the specs)
*
* A WAD file has three parts:
* (1) a twelve-byte header
* (2) one or more "lumps"
* (3) a directory or "info table" that contains the names, offsets, and
* sizes of all the lumps in the WAD
*
* The header consists of three four-byte parts:
* (a) an ASCII string which must be either "IWAD" or "PWAD"
* (b) a 4-byte (long) integer which is the number of lumps in the wad
* (c) a long integer which is the file offset to the start of
* the directory
*
* The directory has one 16-byte entry for every lump. Each entry consists
* of three parts:
*
* (a) a long integer, the file offset to the start of the lump
* (b) a long integer, the size of the lump in bytes
* (c) an 8-byte ASCII string, the name of the lump, padded with zeros.
* For example, the "DEMO1" entry in hexadecimal would be
* (44 45 4D 4F 31 00 00 00)
*
* Note that there is no way to tell if an opened WAD archive is a
* IWAD or PWAD with this archiver.
* I couldn't think of a way to provide that information, without being too
* hacky.
* I don't think it's really that important though.
*
*
Mar 11, 2007
Mar 11, 2007
39
* Please see the file LICENSE.txt in the source's root directory.
Dec 15, 2003
Dec 15, 2003
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
*
* This file written by Travis Wells, based on the GRP archiver by
* Ryan C. Gordon.
*/
#if (defined PHYSFS_SUPPORTS_WAD)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "physfs.h"
#define __PHYSICSFS_INTERNAL__
#include "physfs_internal.h"
typedef struct
{
Dec 18, 2003
Dec 18, 2003
57
char name[18];
Dec 15, 2003
Dec 15, 2003
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
PHYSFS_uint32 startPos;
PHYSFS_uint32 size;
} WADentry;
typedef struct
{
char *filename;
PHYSFS_sint64 last_mod_time;
PHYSFS_uint32 entryCount;
PHYSFS_uint32 entryOffset;
WADentry *entries;
} WADinfo;
typedef struct
{
void *handle;
WADentry *entry;
PHYSFS_uint32 curPos;
} WADfileinfo;
Sep 26, 2004
Sep 26, 2004
79
static void WAD_dirClose(dvoid *opaque)
Dec 15, 2003
Dec 15, 2003
80
{
Sep 26, 2004
Sep 26, 2004
81
WADinfo *info = ((WADinfo *) opaque);
Mar 14, 2005
Mar 14, 2005
82
83
84
allocator.Free(info->filename);
allocator.Free(info->entries);
allocator.Free(info);
Dec 15, 2003
Dec 15, 2003
85
86
87
} /* WAD_dirClose */
Aug 21, 2010
Aug 21, 2010
88
static PHYSFS_sint64 WAD_read(fvoid *opaque, void *buffer, PHYSFS_uint64 len)
Dec 15, 2003
Dec 15, 2003
89
{
Sep 26, 2004
Sep 26, 2004
90
WADfileinfo *finfo = (WADfileinfo *) opaque;
Aug 21, 2010
Aug 21, 2010
91
92
const WADentry *entry = finfo->entry;
const PHYSFS_uint64 bytesLeft = (PHYSFS_uint64)(entry->size-finfo->curPos);
Dec 15, 2003
Dec 15, 2003
93
94
PHYSFS_sint64 rc;
Aug 21, 2010
Aug 21, 2010
95
96
if (bytesLeft < len)
len = bytesLeft;
Dec 15, 2003
Dec 15, 2003
97
Aug 21, 2010
Aug 21, 2010
98
rc = __PHYSFS_platformRead(finfo->handle, buffer, len);
Dec 15, 2003
Dec 15, 2003
99
if (rc > 0)
Aug 21, 2010
Aug 21, 2010
100
finfo->curPos += (PHYSFS_uint32) rc;
Dec 15, 2003
Dec 15, 2003
101
Jan 28, 2010
Jan 28, 2010
102
return rc;
Dec 15, 2003
Dec 15, 2003
103
104
105
} /* WAD_read */
Aug 21, 2010
Aug 21, 2010
106
static PHYSFS_sint64 WAD_write(fvoid *f, const void *buf, PHYSFS_uint64 len)
Dec 15, 2003
Dec 15, 2003
107
108
109
110
111
{
BAIL_MACRO(ERR_NOT_SUPPORTED, -1);
} /* WAD_write */
Sep 26, 2004
Sep 26, 2004
112
static int WAD_eof(fvoid *opaque)
Dec 15, 2003
Dec 15, 2003
113
{
Sep 26, 2004
Sep 26, 2004
114
WADfileinfo *finfo = (WADfileinfo *) opaque;
Dec 15, 2003
Dec 15, 2003
115
WADentry *entry = finfo->entry;
Jan 28, 2010
Jan 28, 2010
116
return (finfo->curPos >= entry->size);
Dec 15, 2003
Dec 15, 2003
117
118
119
} /* WAD_eof */
Sep 26, 2004
Sep 26, 2004
120
static PHYSFS_sint64 WAD_tell(fvoid *opaque)
Dec 15, 2003
Dec 15, 2003
121
{
Jan 28, 2010
Jan 28, 2010
122
return ((WADfileinfo *) opaque)->curPos;
Dec 15, 2003
Dec 15, 2003
123
124
125
} /* WAD_tell */
Sep 26, 2004
Sep 26, 2004
126
static int WAD_seek(fvoid *opaque, PHYSFS_uint64 offset)
Dec 15, 2003
Dec 15, 2003
127
{
Sep 26, 2004
Sep 26, 2004
128
WADfileinfo *finfo = (WADfileinfo *) opaque;
Dec 15, 2003
Dec 15, 2003
129
130
131
132
133
134
135
136
137
WADentry *entry = finfo->entry;
int rc;
BAIL_IF_MACRO(offset < 0, ERR_INVALID_ARGUMENT, 0);
BAIL_IF_MACRO(offset >= entry->size, ERR_PAST_EOF, 0);
rc = __PHYSFS_platformSeek(finfo->handle, entry->startPos + offset);
if (rc)
finfo->curPos = (PHYSFS_uint32) offset;
Jan 28, 2010
Jan 28, 2010
138
return rc;
Dec 15, 2003
Dec 15, 2003
139
140
141
} /* WAD_seek */
Sep 26, 2004
Sep 26, 2004
142
static PHYSFS_sint64 WAD_fileLength(fvoid *opaque)
Dec 15, 2003
Dec 15, 2003
143
{
Sep 26, 2004
Sep 26, 2004
144
WADfileinfo *finfo = (WADfileinfo *) opaque;
Jan 28, 2010
Jan 28, 2010
145
return ((PHYSFS_sint64) finfo->entry->size);
Dec 15, 2003
Dec 15, 2003
146
147
148
} /* WAD_fileLength */
Sep 26, 2004
Sep 26, 2004
149
static int WAD_fileClose(fvoid *opaque)
Dec 15, 2003
Dec 15, 2003
150
{
Sep 26, 2004
Sep 26, 2004
151
WADfileinfo *finfo = (WADfileinfo *) opaque;
Dec 15, 2003
Dec 15, 2003
152
BAIL_IF_MACRO(!__PHYSFS_platformClose(finfo->handle), NULL, 0);
Mar 14, 2005
Mar 14, 2005
153
allocator.Free(finfo);
Jan 28, 2010
Jan 28, 2010
154
return 1;
Dec 15, 2003
Dec 15, 2003
155
156
157
} /* WAD_fileClose */
Aug 21, 2010
Aug 21, 2010
158
159
160
161
162
163
static inline int readAll(void *fh, void *buf, const PHYSFS_uint64 len)
{
return (__PHYSFS_platformRead(fh, buf, len) == len);
} /* readAll */
Dec 15, 2003
Dec 15, 2003
164
165
166
167
168
169
170
171
172
173
174
static int wad_open(const char *filename, int forWriting,
void **fh, PHYSFS_uint32 *count,PHYSFS_uint32 *offset)
{
PHYSFS_uint8 buf[4];
*fh = NULL;
BAIL_IF_MACRO(forWriting, ERR_ARC_IS_READ_ONLY, 0);
*fh = __PHYSFS_platformOpenRead(filename);
BAIL_IF_MACRO(*fh == NULL, NULL, 0);
Aug 21, 2010
Aug 21, 2010
175
if (!readAll(*fh, buf, 4))
Dec 15, 2003
Dec 15, 2003
176
177
178
179
180
181
182
183
goto openWad_failed;
if (memcmp(buf, "IWAD", 4) != 0 && memcmp(buf, "PWAD", 4) != 0)
{
__PHYSFS_setError(ERR_UNSUPPORTED_ARCHIVE);
goto openWad_failed;
} /* if */
Aug 21, 2010
Aug 21, 2010
184
if (!readAll(*fh, count, sizeof (PHYSFS_uint32)))
Dec 15, 2003
Dec 15, 2003
185
186
187
188
goto openWad_failed;
*count = PHYSFS_swapULE32(*count);
Aug 21, 2010
Aug 21, 2010
189
if (!readAll(*fh, offset, sizeof (PHYSFS_uint32)))
Dec 15, 2003
Dec 15, 2003
190
191
192
193
goto openWad_failed;
*offset = PHYSFS_swapULE32(*offset);
Jan 28, 2010
Jan 28, 2010
194
return 1;
Dec 15, 2003
Dec 15, 2003
195
196
197
198
199
200
201
openWad_failed:
if (*fh != NULL)
__PHYSFS_platformClose(*fh);
*count = -1;
*fh = NULL;
Jan 28, 2010
Jan 28, 2010
202
return 0;
Dec 15, 2003
Dec 15, 2003
203
204
205
206
207
208
209
210
211
212
213
214
} /* wad_open */
static int WAD_isArchive(const char *filename, int forWriting)
{
void *fh;
PHYSFS_uint32 fileCount,offset;
int retval = wad_open(filename, forWriting, &fh, &fileCount,&offset);
if (fh != NULL)
__PHYSFS_platformClose(fh);
Jan 28, 2010
Jan 28, 2010
215
return retval;
Dec 15, 2003
Dec 15, 2003
216
217
218
219
220
} /* WAD_isArchive */
static int wad_entry_cmp(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two)
{
Feb 20, 2008
Feb 20, 2008
221
222
223
if (one != two)
{
const WADentry *a = (const WADentry *) _a;
Jan 28, 2010
Jan 28, 2010
224
return strcmp(a[one].name, a[two].name);
Feb 20, 2008
Feb 20, 2008
225
226
227
} /* if */
return 0;
Dec 15, 2003
Dec 15, 2003
228
229
230
231
232
} /* wad_entry_cmp */
static void wad_entry_swap(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two)
{
Feb 20, 2008
Feb 20, 2008
233
234
235
236
237
238
239
240
241
if (one != two)
{
WADentry tmp;
WADentry *first = &(((WADentry *) _a)[one]);
WADentry *second = &(((WADentry *) _a)[two]);
memcpy(&tmp, first, sizeof (WADentry));
memcpy(first, second, sizeof (WADentry));
memcpy(second, &tmp, sizeof (WADentry));
} /* if */
Dec 15, 2003
Dec 15, 2003
242
243
244
245
246
247
248
249
250
} /* wad_entry_swap */
static int wad_load_entries(const char *name, int forWriting, WADinfo *info)
{
void *fh = NULL;
PHYSFS_uint32 fileCount;
PHYSFS_uint32 directoryOffset;
WADentry *entry;
Dec 29, 2003
Dec 29, 2003
251
char lastDirectory[9];
Dec 18, 2003
Dec 18, 2003
252
253
lastDirectory[8] = 0; /* Make sure lastDirectory stays null-terminated. */
Dec 15, 2003
Dec 15, 2003
254
255
256
BAIL_IF_MACRO(!wad_open(name, forWriting, &fh, &fileCount,&directoryOffset), NULL, 0);
info->entryCount = fileCount;
Mar 14, 2005
Mar 14, 2005
257
info->entries = (WADentry *) allocator.Malloc(sizeof(WADentry)*fileCount);
Dec 15, 2003
Dec 15, 2003
258
259
260
261
262
263
264
265
266
267
if (info->entries == NULL)
{
__PHYSFS_platformClose(fh);
BAIL_MACRO(ERR_OUT_OF_MEMORY, 0);
} /* if */
__PHYSFS_platformSeek(fh,directoryOffset);
for (entry = info->entries; fileCount > 0; fileCount--, entry++)
{
Aug 21, 2010
Aug 21, 2010
268
269
270
if ( (!readAll(fh, &entry->startPos, sizeof (PHYSFS_uint32))) ||
(!readAll(fh, &entry->size, sizeof (PHYSFS_uint32))) ||
(!readAll(fh, &entry->name, 8)) )
Dec 15, 2003
Dec 15, 2003
271
272
{
__PHYSFS_platformClose(fh);
Jan 28, 2010
Jan 28, 2010
273
return 0;
Dec 15, 2003
Dec 15, 2003
274
275
276
277
278
279
280
281
282
283
284
} /* if */
entry->name[8] = '\0'; /* name might not be null-terminated in file. */
entry->size = PHYSFS_swapULE32(entry->size);
entry->startPos = PHYSFS_swapULE32(entry->startPos);
} /* for */
__PHYSFS_platformClose(fh);
__PHYSFS_sort(info->entries, info->entryCount,
wad_entry_cmp, wad_entry_swap);
Jan 28, 2010
Jan 28, 2010
285
return 1;
Dec 15, 2003
Dec 15, 2003
286
287
288
} /* wad_load_entries */
Sep 26, 2004
Sep 26, 2004
289
static void *WAD_openArchive(const char *name, int forWriting)
Dec 15, 2003
Dec 15, 2003
290
291
{
PHYSFS_sint64 modtime = __PHYSFS_platformGetLastModTime(name);
Mar 14, 2005
Mar 14, 2005
292
WADinfo *info = (WADinfo *) allocator.Malloc(sizeof (WADinfo));
Dec 15, 2003
Dec 15, 2003
293
Sep 26, 2004
Sep 26, 2004
294
BAIL_IF_MACRO(info == NULL, ERR_OUT_OF_MEMORY, NULL);
Dec 15, 2003
Dec 15, 2003
295
296
memset(info, '\0', sizeof (WADinfo));
Mar 14, 2005
Mar 14, 2005
297
info->filename = (char *) allocator.Malloc(strlen(name) + 1);
Mar 13, 2005
Mar 13, 2005
298
GOTO_IF_MACRO(!info->filename, ERR_OUT_OF_MEMORY, WAD_openArchive_failed);
Dec 15, 2003
Dec 15, 2003
299
300
301
302
303
304
if (!wad_load_entries(name, forWriting, info))
goto WAD_openArchive_failed;
strcpy(info->filename, name);
info->last_mod_time = modtime;
Jan 28, 2010
Jan 28, 2010
305
return info;
Dec 15, 2003
Dec 15, 2003
306
307
WAD_openArchive_failed:
Sep 26, 2004
Sep 26, 2004
308
if (info != NULL)
Dec 15, 2003
Dec 15, 2003
309
{
Sep 26, 2004
Sep 26, 2004
310
if (info->filename != NULL)
Mar 14, 2005
Mar 14, 2005
311
allocator.Free(info->filename);
Sep 26, 2004
Sep 26, 2004
312
if (info->entries != NULL)
Mar 14, 2005
Mar 14, 2005
313
314
allocator.Free(info->entries);
allocator.Free(info);
Dec 15, 2003
Dec 15, 2003
315
316
} /* if */
Jan 28, 2010
Jan 28, 2010
317
return NULL;
Dec 15, 2003
Dec 15, 2003
318
319
320
} /* WAD_openArchive */
Sep 29, 2004
Sep 29, 2004
321
static void WAD_enumerateFiles(dvoid *opaque, const char *dname,
Sep 18, 2005
Sep 18, 2005
322
323
int omitSymLinks, PHYSFS_EnumFilesCallback cb,
const char *origdir, void *callbackdata)
Dec 15, 2003
Dec 15, 2003
324
{
Sep 26, 2004
Sep 26, 2004
325
WADinfo *info = ((WADinfo *) opaque);
Dec 15, 2003
Dec 15, 2003
326
327
328
WADentry *entry = info->entries;
PHYSFS_uint32 max = info->entryCount;
PHYSFS_uint32 i;
Sep 29, 2004
Sep 29, 2004
329
const char *name;
Dec 18, 2003
Dec 18, 2003
330
char *sep;
Dec 15, 2003
Dec 15, 2003
331
Sep 29, 2004
Sep 29, 2004
332
if (*dname == '\0') /* root directory enumeration? */
Dec 18, 2003
Dec 18, 2003
333
334
335
{
for (i = 0; i < max; i++, entry++)
{
Sep 29, 2004
Sep 29, 2004
336
337
name = entry->name;
if (strchr(name, '/') == NULL)
Sep 18, 2005
Sep 18, 2005
338
cb(callbackdata, origdir, name);
Dec 18, 2003
Dec 18, 2003
339
340
341
342
343
344
} /* for */
} /* if */
else
{
for (i = 0; i < max; i++, entry++)
{
Sep 29, 2004
Sep 29, 2004
345
346
name = entry->name;
sep = strchr(name, '/');
Dec 18, 2003
Dec 18, 2003
347
348
if (sep != NULL)
{
Sep 29, 2004
Sep 29, 2004
349
if (strncmp(dname, name, (sep - name)) == 0)
Oct 12, 2005
Oct 12, 2005
350
cb(callbackdata, origdir, sep + 1);
Dec 18, 2003
Dec 18, 2003
351
352
353
} /* if */
} /* for */
} /* else */
Dec 15, 2003
Dec 15, 2003
354
355
356
} /* WAD_enumerateFiles */
Feb 15, 2010
Feb 15, 2010
357
static WADentry *wad_find_entry(const WADinfo *info, const char *name)
Dec 15, 2003
Dec 15, 2003
358
359
360
361
362
363
364
365
366
367
368
369
{
WADentry *a = info->entries;
PHYSFS_sint32 lo = 0;
PHYSFS_sint32 hi = (PHYSFS_sint32) (info->entryCount - 1);
PHYSFS_sint32 middle;
int rc;
while (lo <= hi)
{
middle = lo + ((hi - lo) / 2);
rc = strcmp(name, a[middle].name);
if (rc == 0) /* found it! */
Jan 28, 2010
Jan 28, 2010
370
return &a[middle];
Dec 15, 2003
Dec 15, 2003
371
372
373
374
375
376
377
378
379
380
else if (rc > 0)
lo = middle + 1;
else
hi = middle - 1;
} /* while */
BAIL_MACRO(ERR_NO_SUCH_FILE, NULL);
} /* wad_find_entry */
Sep 26, 2004
Sep 26, 2004
381
static int WAD_exists(dvoid *opaque, const char *name)
Dec 15, 2003
Dec 15, 2003
382
{
Jan 28, 2010
Jan 28, 2010
383
return (wad_find_entry((WADinfo *) opaque, name) != NULL);
Dec 15, 2003
Dec 15, 2003
384
385
386
} /* WAD_exists */
Sep 26, 2004
Sep 26, 2004
387
static int WAD_isDirectory(dvoid *opaque, const char *name, int *fileExists)
Dec 15, 2003
Dec 15, 2003
388
{
Sep 26, 2004
Sep 26, 2004
389
WADentry *entry = wad_find_entry(((WADinfo *) opaque), name);
Dec 18, 2003
Dec 18, 2003
390
391
392
393
394
395
396
397
if (entry != NULL)
{
char *n;
*fileExists = 1;
/* Can't be a directory if it's a subdirectory. */
if (strchr(entry->name, '/') != NULL)
Jan 28, 2010
Jan 28, 2010
398
return 0;
Dec 18, 2003
Dec 18, 2003
399
400
401
402
403
404
/* Check if it matches "MAP??" or "E?M?" ... */
n = entry->name;
if ((n[0] == 'E' && n[2] == 'M') ||
(n[0] == 'M' && n[1] == 'A' && n[2] == 'P' && n[6] == 0))
{
Jan 28, 2010
Jan 28, 2010
405
return 1;
Dec 18, 2003
Dec 18, 2003
406
} /* if */
Jan 28, 2010
Jan 28, 2010
407
return 0;
Dec 18, 2003
Dec 18, 2003
408
409
410
411
} /* if */
else
{
*fileExists = 0;
Jan 28, 2010
Jan 28, 2010
412
return 0;
Dec 18, 2003
Dec 18, 2003
413
} /* else */
Dec 15, 2003
Dec 15, 2003
414
415
416
} /* WAD_isDirectory */
Sep 26, 2004
Sep 26, 2004
417
static int WAD_isSymLink(dvoid *opaque, const char *name, int *fileExists)
Dec 15, 2003
Dec 15, 2003
418
{
Sep 26, 2004
Sep 26, 2004
419
*fileExists = WAD_exists(opaque, name);
Jan 28, 2010
Jan 28, 2010
420
return 0; /* never symlinks in a wad. */
Dec 15, 2003
Dec 15, 2003
421
422
423
} /* WAD_isSymLink */
Sep 26, 2004
Sep 26, 2004
424
static PHYSFS_sint64 WAD_getLastModTime(dvoid *opaque,
Dec 15, 2003
Dec 15, 2003
425
426
427
const char *name,
int *fileExists)
{
Sep 26, 2004
Sep 26, 2004
428
WADinfo *info = ((WADinfo *) opaque);
Dec 15, 2003
Dec 15, 2003
429
430
431
432
PHYSFS_sint64 retval = -1;
*fileExists = (wad_find_entry(info, name) != NULL);
if (*fileExists) /* use time of WAD itself in the physical filesystem. */
Sep 26, 2004
Sep 26, 2004
433
retval = info->last_mod_time;
Dec 15, 2003
Dec 15, 2003
434
Jan 28, 2010
Jan 28, 2010
435
return retval;
Dec 15, 2003
Dec 15, 2003
436
437
438
} /* WAD_getLastModTime */
Sep 26, 2004
Sep 26, 2004
439
static fvoid *WAD_openRead(dvoid *opaque, const char *fnm, int *fileExists)
Dec 15, 2003
Dec 15, 2003
440
{
Sep 26, 2004
Sep 26, 2004
441
WADinfo *info = ((WADinfo *) opaque);
Dec 15, 2003
Dec 15, 2003
442
443
444
445
446
447
448
WADfileinfo *finfo;
WADentry *entry;
entry = wad_find_entry(info, fnm);
*fileExists = (entry != NULL);
BAIL_IF_MACRO(entry == NULL, NULL, NULL);
Mar 14, 2005
Mar 14, 2005
449
finfo = (WADfileinfo *) allocator.Malloc(sizeof (WADfileinfo));
Sep 26, 2004
Sep 26, 2004
450
BAIL_IF_MACRO(finfo == NULL, ERR_OUT_OF_MEMORY, NULL);
Dec 15, 2003
Dec 15, 2003
451
452
453
454
455
finfo->handle = __PHYSFS_platformOpenRead(info->filename);
if ( (finfo->handle == NULL) ||
(!__PHYSFS_platformSeek(finfo->handle, entry->startPos)) )
{
Mar 14, 2005
Mar 14, 2005
456
allocator.Free(finfo);
Jan 28, 2010
Jan 28, 2010
457
return NULL;
Dec 15, 2003
Dec 15, 2003
458
459
460
461
} /* if */
finfo->curPos = 0;
finfo->entry = entry;
Jan 28, 2010
Jan 28, 2010
462
return finfo;
Dec 15, 2003
Dec 15, 2003
463
464
465
} /* WAD_openRead */
Sep 26, 2004
Sep 26, 2004
466
static fvoid *WAD_openWrite(dvoid *opaque, const char *name)
Dec 15, 2003
Dec 15, 2003
467
468
469
470
471
{
BAIL_MACRO(ERR_NOT_SUPPORTED, NULL);
} /* WAD_openWrite */
Sep 26, 2004
Sep 26, 2004
472
static fvoid *WAD_openAppend(dvoid *opaque, const char *name)
Dec 15, 2003
Dec 15, 2003
473
474
475
476
477
{
BAIL_MACRO(ERR_NOT_SUPPORTED, NULL);
} /* WAD_openAppend */
Sep 26, 2004
Sep 26, 2004
478
static int WAD_remove(dvoid *opaque, const char *name)
Dec 15, 2003
Dec 15, 2003
479
480
481
482
483
{
BAIL_MACRO(ERR_NOT_SUPPORTED, 0);
} /* WAD_remove */
Sep 26, 2004
Sep 26, 2004
484
static int WAD_mkdir(dvoid *opaque, const char *name)
Dec 15, 2003
Dec 15, 2003
485
486
487
488
{
BAIL_MACRO(ERR_NOT_SUPPORTED, 0);
} /* WAD_mkdir */
Sep 29, 2004
Sep 29, 2004
489
Aug 22, 2010
Aug 22, 2010
490
static int WAD_stat(dvoid *opaque, const char *filename, int *exists,
Feb 15, 2010
Feb 15, 2010
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
PHYSFS_Stat *stat)
{
const WADinfo *info = (const WADinfo *) opaque;
const WADentry *entry = wad_find_entry(info, filename);
*exists = (entry != 0);
if (!entry)
return 0;
stat->filesize = entry->size;
stat->filetype = PHYSFS_FILETYPE_REGULAR;
stat->accesstime = 0;
stat->modtime = ((WADinfo *) opaque)->last_mod_time;
stat->createtime = ((WADinfo *) opaque)->last_mod_time;
stat->readonly = 1; /* WADs are always readonly */
Aug 21, 2010
Aug 21, 2010
507
return 1;
Feb 15, 2010
Feb 15, 2010
508
509
510
} /* WAD_stat */
Sep 29, 2004
Sep 29, 2004
511
512
513
const PHYSFS_ArchiveInfo __PHYSFS_ArchiveInfo_WAD =
{
"WAD",
Mar 16, 2005
Mar 16, 2005
514
WAD_ARCHIVE_DESCRIPTION,
Sep 29, 2004
Sep 29, 2004
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
"Travis Wells <traviswells@mchsi.com>",
"http://www.3dmm2.com/doom/",
};
const PHYSFS_Archiver __PHYSFS_Archiver_WAD =
{
&__PHYSFS_ArchiveInfo_WAD,
WAD_isArchive, /* isArchive() method */
WAD_openArchive, /* openArchive() method */
WAD_enumerateFiles, /* enumerateFiles() method */
WAD_exists, /* exists() method */
WAD_isDirectory, /* isDirectory() method */
WAD_isSymLink, /* isSymLink() method */
WAD_getLastModTime, /* getLastModTime() method */
WAD_openRead, /* openRead() method */
WAD_openWrite, /* openWrite() method */
WAD_openAppend, /* openAppend() method */
WAD_remove, /* remove() method */
WAD_mkdir, /* mkdir() method */
WAD_dirClose, /* dirClose() method */
Aug 22, 2010
Aug 22, 2010
536
WAD_stat, /* stat() method */
Sep 29, 2004
Sep 29, 2004
537
538
539
540
541
542
WAD_read, /* read() method */
WAD_write, /* write() method */
WAD_eof, /* eof() method */
WAD_tell, /* tell() method */
WAD_seek, /* seek() method */
WAD_fileLength, /* fileLength() method */
Aug 22, 2010
Aug 22, 2010
543
WAD_fileClose /* fileClose() method */
Sep 29, 2004
Sep 29, 2004
544
545
};
Dec 15, 2003
Dec 15, 2003
546
547
548
#endif /* defined PHYSFS_SUPPORTS_WAD */
/* end of wad.c ... */