Skip to content

Latest commit

 

History

History
964 lines (781 loc) · 29.1 KB

macclassic.c

File metadata and controls

964 lines (781 loc) · 29.1 KB
 
1
2
3
/*
* MacOS Classic support routines for PhysicsFS.
*
Mar 11, 2007
Mar 11, 2007
4
* Please see the file LICENSE.txt in the source's root directory.
5
6
7
8
*
* This file written by Ryan C. Gordon.
*/
Jan 31, 2003
Jan 31, 2003
9
#include <stdio.h>
10
11
#include <stdlib.h>
#include <string.h>
Dec 29, 2003
Dec 29, 2003
12
#include <ctype.h>
Apr 6, 2002
Apr 6, 2002
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/*
* Most of the API calls in here are, according to ADC, available since
* MacOS 8.1. I don't think I used any MacOS 9 or CarbonLib-specific
* functions. There might be one or two 8.5 calls, and perhaps when the
* ADC docs say "Available in MacOS 8.1" they really mean "this works
* with System 6, but we don't want to hear about it at this point."
*
* IsAliasFile() showed up in MacOS 8.5. You can duplicate this code with
* PBGetCatInfoSync(), which is an older API, if you hope the bits in the
* catalog info never change (which they won't for, say, MacOS 8.1).
* See Apple Technote FL-30:
* http://developer.apple.com/technotes/fl/fl_30.html
*
* If you want to use weak pointers and Gestalt, and choose the correct
* code to use during __PHYSFS_platformInit(), I'll accept a patch, but
* chances are, it wasn't worth the time it took to write this, let alone
* implement that.
*/
33
34
35
36
/*
* Please note that I haven't tried this code with CarbonLib or under
* MacOS X at all. The code in unix.c is known to work with Darwin,
Apr 6, 2002
Apr 6, 2002
37
38
* and you may or may not be better off using that, especially since
* mutexes are no-ops in this file. Patches welcome.
Apr 6, 2002
Apr 6, 2002
40
#ifdef __PHYSFS_CARBONIZED__ /* this is currently not defined anywhere. */
41
42
43
44
45
#include <Carbon.h>
#else
#include <OSUtils.h>
#include <Processes.h>
#include <Files.h>
Apr 2, 2002
Apr 2, 2002
46
47
48
#include <TextUtils.h>
#include <Resources.h>
#include <MacMemory.h>
Apr 3, 2002
Apr 3, 2002
49
#include <Events.h>
Apr 5, 2002
Apr 5, 2002
50
#include <DriverGestalt.h>
Apr 6, 2002
Apr 6, 2002
51
#include <Aliases.h>
52
53
54
55
56
57
58
59
#endif
#define __PHYSICSFS_INTERNAL__
#include "physfs_internal.h"
const char *__PHYSFS_platformDirSeparator = ":";
Jul 28, 2002
Jul 28, 2002
60
Jul 28, 2002
Jul 28, 2002
61
static const char *get_macos_error_string(OSErr err)
Jul 28, 2002
Jul 28, 2002
62
63
64
65
66
67
{
if (err == noErr)
return(NULL);
switch (err)
{
Jul 28, 2002
Jul 28, 2002
68
69
70
71
72
case fnfErr: return(ERR_NO_SUCH_FILE);
case notOpenErr: return(ERR_NO_SUCH_VOLUME);
case dirFulErr: return(ERR_DIRECTORY_FULL);
case dskFulErr: return(ERR_DISK_FULL);
case nsvErr: return(ERR_NO_SUCH_VOLUME);
Jul 28, 2002
Jul 28, 2002
73
74
75
76
77
case ioErr: return(ERR_IO_ERROR);
case bdNamErr: return(ERR_BAD_FILENAME);
case fnOpnErr: return(ERR_NOT_A_HANDLE);
case eofErr: return(ERR_PAST_EOF);
case posErr: return(ERR_SEEK_OUT_OF_RANGE);
Jul 28, 2002
Jul 28, 2002
78
79
80
81
82
case tmfoErr: return(ERR_TOO_MANY_HANDLES);
case wPrErr: return(ERR_VOL_LOCKED_HW);
case fLckdErr: return(ERR_FILE_LOCKED);
case vLckdErr: return(ERR_VOL_LOCKED_SW);
case fBsyErr: return(ERR_FILE_OR_DIR_BUSY);
Jan 31, 2003
Jan 31, 2003
83
case dupFNErr: return(ERR_FILE_EXISTS);
Jul 28, 2002
Jul 28, 2002
84
85
86
87
88
89
90
91
92
93
94
95
case opWrErr: return(ERR_FILE_ALREADY_OPEN_W);
case rfNumErr: return(ERR_INVALID_REFNUM);
case gfpErr: return(ERR_GETTING_FILE_POS);
case volOffLinErr: return(ERR_VOLUME_OFFLINE);
case permErr: return(ERR_PERMISSION_DENIED);
case volOnLinErr: return(ERR_VOL_ALREADY_ONLINE);
case nsDrvErr: return(ERR_NO_SUCH_DRIVE);
case noMacDskErr: return(ERR_NOT_MAC_DISK);
case extFSErr: return(ERR_VOL_EXTERNAL_FS);
case fsRnErr: return(ERR_PROBLEM_RENAME);
case badMDBErr: return(ERR_BAD_MASTER_BLOCK);
case wrPermErr: return(ERR_PERMISSION_DENIED);
Jul 28, 2002
Jul 28, 2002
96
case memFullErr: return(ERR_OUT_OF_MEMORY);
Jul 28, 2002
Jul 28, 2002
97
98
99
100
101
case dirNFErr: return(ERR_NO_SUCH_PATH);
case tmwdoErr: return(ERR_TOO_MANY_HANDLES);
case badMovErr: return(ERR_CANT_MOVE_FORBIDDEN);
case wrgVolTypErr: return(ERR_WRONG_VOL_TYPE);
case volGoneErr: return(ERR_SERVER_VOL_LOST);
Jul 28, 2002
Jul 28, 2002
102
case errFSNameTooLong: return(ERR_BAD_FILENAME);
Jul 28, 2002
Jul 28, 2002
103
case errFSNotAFolder: return(ERR_NOT_A_DIR);
Jan 31, 2003
Jan 31, 2003
104
/*case errFSNotAFile: return(ERR_NOT_A_FILE);*/
Jul 28, 2002
Jul 28, 2002
105
106
107
108
109
110
case fidNotFound: return(ERR_FILE_ID_NOT_FOUND);
case fidExists: return(ERR_FILE_ID_EXISTS);
case afpAccessDenied: return(ERR_ACCESS_DENIED);
case afpNoServer: return(ERR_SERVER_NO_RESPOND);
case afpUserNotAuth: return(ERR_USER_AUTH_FAILED);
case afpPwdExpiredErr: return(ERR_PWORD_EXPIRED);
Jul 28, 2002
Jul 28, 2002
111
112
113
114
115
116
117
case paramErr:
case errFSBadFSRef:
case errFSBadBuffer:
case errFSMissingName:
case errFSBadPosMode:
case errFSBadAllocFlags:
Jan 31, 2003
Jan 31, 2003
118
119
120
case errFSBadItemCount:
case errFSBadSearchParams:
case afpDenyConflict:
Jul 28, 2002
Jul 28, 2002
121
return(ERR_PHYSFS_BAD_OS_CALL);
Jul 28, 2002
Jul 28, 2002
122
Jul 28, 2002
Jul 28, 2002
123
default: return(ERR_MACOS_GENERIC);
Jul 28, 2002
Jul 28, 2002
124
125
126
} /* switch */
return(NULL);
Jul 28, 2002
Jul 28, 2002
127
} /* get_macos_error_string */
Jul 28, 2002
Jul 28, 2002
128
129
Jul 28, 2002
Jul 28, 2002
130
static OSErr oserr(OSErr retval)
Jul 28, 2002
Jul 28, 2002
131
{
Jan 31, 2003
Jan 31, 2003
132
char buf[sizeof (ERR_MACOS_GENERIC) + 32];
Jul 28, 2002
Jul 28, 2002
133
const char *errstr = get_macos_error_string(retval);
Jan 31, 2003
Jan 31, 2003
134
if (strcmp(errstr, ERR_MACOS_GENERIC) == 0)
Jul 28, 2002
Jul 28, 2002
135
{
Mar 16, 2005
Mar 16, 2005
136
sprintf(buf, ERR_MACOS_GENERIC, (int) retval);
Jul 28, 2002
Jul 28, 2002
137
138
139
140
errstr = buf;
} /* if */
if (errstr != NULL)
Jul 28, 2002
Jul 28, 2002
141
__PHYSFS_setError(errstr);
Jul 28, 2002
Jul 28, 2002
142
Jul 28, 2002
Jul 28, 2002
143
return(retval);
Jul 28, 2002
Jul 28, 2002
144
145
146
} /* oserr */
Apr 5, 2002
Apr 5, 2002
147
148
static struct ProcessInfoRec procInfo;
static FSSpec procfsspec;
149
150
151
int __PHYSFS_platformInit(void)
{
Apr 5, 2002
Apr 5, 2002
152
153
OSErr err;
ProcessSerialNumber psn;
Jul 28, 2002
Jul 28, 2002
154
BAIL_IF_MACRO(oserr(GetCurrentProcess(&psn)) != noErr, NULL, 0);
Apr 5, 2002
Apr 5, 2002
155
156
157
158
159
memset(&procInfo, '\0', sizeof (ProcessInfoRec));
memset(&procfsspec, '\0', sizeof (FSSpec));
procInfo.processInfoLength = sizeof (ProcessInfoRec);
procInfo.processAppSpec = &procfsspec;
err = GetProcessInformation(&psn, &procInfo);
Jul 28, 2002
Jul 28, 2002
160
BAIL_IF_MACRO(oserr(err) != noErr, NULL, 0);
Apr 5, 2002
Apr 5, 2002
161
return(1); /* we're golden. */
162
163
164
165
166
167
168
169
170
} /* __PHYSFS_platformInit */
int __PHYSFS_platformDeinit(void)
{
return(1); /* always succeed. */
} /* __PHYSFS_platformDeinit */
Apr 5, 2002
Apr 5, 2002
171
172
173
174
/*
* CD detection code is borrowed from Apple Technical Q&A DV18.
* http://developer.apple.com/qa/dv/dv18.html
*/
Sep 29, 2004
Sep 29, 2004
175
void __PHYSFS_platformDetectAvailableCDs(PHYSFS_StringCallback cb, void *data)
Sep 29, 2004
Sep 29, 2004
177
Apr 5, 2002
Apr 5, 2002
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
DriverGestaltParam pb;
DrvQEl *dqp;
OSErr status;
pb.csCode = kDriverGestaltCode;
pb.driverGestaltSelector = kdgDeviceType;
dqp = (DrvQEl *) GetDrvQHdr()->qHead;
while (dqp != NULL)
{
pb.ioCRefNum = dqp->dQRefNum;
pb.ioVRefNum = dqp->dQDrive;
status = PBStatusSync((ParmBlkPtr) &pb);
if ((status == noErr) && (pb.driverGestaltResponse == kdgCDType))
{
Str63 volName;
Sep 29, 2004
Sep 29, 2004
194
size_t size;
Apr 5, 2002
Apr 5, 2002
195
196
197
198
199
200
201
HParamBlockRec hpbr;
memset(&hpbr, '\0', sizeof (HParamBlockRec));
hpbr.volumeParam.ioNamePtr = volName;
hpbr.volumeParam.ioVRefNum = dqp->dQDrive;
hpbr.volumeParam.ioVolIndex = 0;
if (PBHGetVInfoSync(&hpbr) == noErr)
{
Sep 29, 2004
Sep 29, 2004
202
203
204
size = (size_t) volName[0]; /* convert to ASCIZ string... */
memmove(&volName[0], &volName[1], size);
volName[size] = '\0';
Mar 14, 2005
Mar 14, 2005
205
cb(data, (const char *) volName);
Apr 5, 2002
Apr 5, 2002
206
207
208
209
210
} /* if */
} /* if */
dqp = (DrvQEl *) dqp->qLink;
} /* while */
211
212
213
} /* __PHYSFS_platformDetectAvailableCDs */
Apr 6, 2002
Apr 6, 2002
214
static char *convFSSpecToPath(FSSpec *spec, int includeFile)
215
216
217
218
219
220
{
char *ptr;
char *retval = NULL;
UInt32 retLength = 0;
CInfoPBRec infoPB;
Str255 str255;
Apr 6, 2002
Apr 6, 2002
221
222
223
224
str255[0] = spec->name[0];
memcpy(&str255[1], &spec->name[1], str255[0]);
225
memset(&infoPB, '\0', sizeof (CInfoPBRec));
Apr 5, 2002
Apr 5, 2002
226
infoPB.dirInfo.ioNamePtr = str255; /* put name in here. */
Apr 6, 2002
Apr 6, 2002
227
228
229
infoPB.dirInfo.ioVRefNum = spec->vRefNum; /* ID of bin's volume. */
infoPB.dirInfo.ioDrParID = spec->parID; /* ID of bin's dir. */
infoPB.dirInfo.ioFDirIndex = (includeFile) ? 0 : -1;
230
231
232
233
234
235
/* walk the tree back to the root dir (volume), building path string... */
do
{
/* check parent dir of what we last looked at... */
infoPB.dirInfo.ioDrDirID = infoPB.dirInfo.ioDrParID;
Jul 28, 2002
Jul 28, 2002
236
if (oserr(PBGetCatInfoSync(&infoPB)) != noErr)
237
238
{
if (retval != NULL)
Mar 14, 2005
Mar 14, 2005
239
allocator.Free(retval);
Jul 28, 2002
Jul 28, 2002
240
return(NULL);
Apr 6, 2002
Apr 6, 2002
242
243
244
infoPB.dirInfo.ioFDirIndex = -1; /* look at parent dir next time. */
245
246
/* allocate more space for the retval... */
retLength += str255[0] + 1; /* + 1 for a ':' or null char... */
Mar 14, 2005
Mar 14, 2005
247
ptr = (char *) allocator.Malloc(retLength);
248
249
250
if (ptr == NULL)
{
if (retval != NULL)
Mar 14, 2005
Mar 14, 2005
251
allocator.Free(retval);
252
253
254
255
256
257
258
259
260
261
BAIL_MACRO(ERR_OUT_OF_MEMORY, NULL);
} /* if */
/* prepend new dir to retval and cleanup... */
memcpy(ptr, &str255[1], str255[0]);
ptr[str255[0]] = '\0'; /* null terminate it. */
if (retval != NULL)
{
strcat(ptr, ":");
strcat(ptr, retval);
Mar 14, 2005
Mar 14, 2005
262
allocator.Free(retval);
263
264
265
266
267
} /* if */
retval = ptr;
} while (infoPB.dirInfo.ioDrDirID != fsRtDirID);
return(retval);
Apr 6, 2002
Apr 6, 2002
268
269
270
271
272
273
274
275
276
277
} /* convFSSpecToPath */
char *__PHYSFS_platformCalcBaseDir(const char *argv0)
{
FSSpec spec;
/* Get the name of the binary's parent directory. */
FSMakeFSSpec(procfsspec.vRefNum, procfsspec.parID, procfsspec.name, &spec);
return(convFSSpecToPath(&spec, 0));
278
279
280
281
282
283
} /* __PHYSFS_platformCalcBaseDir */
char *__PHYSFS_platformGetUserName(void)
{
char *retval = NULL;
Apr 2, 2002
Apr 2, 2002
284
285
286
287
288
289
StringHandle strHandle;
short origResourceFile = CurResFile();
/* use the System resource file. */
UseResFile(0);
/* apparently, -16096 specifies the username. */
Jan 31, 2003
Jan 31, 2003
290
strHandle = GetString(-16096);
Apr 2, 2002
Apr 2, 2002
291
UseResFile(origResourceFile);
Jul 28, 2002
Jul 28, 2002
292
BAIL_IF_MACRO(strHandle == NULL, NULL, NULL);
Apr 2, 2002
Apr 2, 2002
293
294
HLock((Handle) strHandle);
Mar 14, 2005
Mar 14, 2005
295
retval = (char *) allocator.Malloc((*strHandle)[0] + 1);
Apr 2, 2002
Apr 2, 2002
296
297
298
299
300
301
302
303
304
if (retval == NULL)
{
HUnlock((Handle) strHandle);
BAIL_MACRO(ERR_OUT_OF_MEMORY, NULL);
} /* if */
memcpy(retval, &(*strHandle)[1], (*strHandle)[0]);
retval[(*strHandle)[0]] = '\0'; /* null-terminate it. */
HUnlock((Handle) strHandle);
305
306
307
308
309
310
return(retval);
} /* __PHYSFS_platformGetUserName */
char *__PHYSFS_platformGetUserDir(void)
{
Apr 6, 2002
Apr 6, 2002
311
#if 0
312
return(NULL); /* bah...use default behaviour, I guess. */
Apr 6, 2002
Apr 6, 2002
313
314
315
316
#else
/* (Hmm. Default behaviour is broken in the base library. :) ) */
return(__PHYSFS_platformCalcBaseDir(NULL));
#endif
317
318
319
320
321
322
323
324
325
326
327
} /* __PHYSFS_platformGetUserDir */
PHYSFS_uint64 __PHYSFS_platformGetThreadID(void)
{
return(1); /* single threaded. */
} /* __PHYSFS_platformGetThreadID */
int __PHYSFS_platformStricmp(const char *x, const char *y)
{
Dec 29, 2003
Dec 29, 2003
328
329
330
331
332
333
334
335
336
337
338
339
340
int ux, uy;
do
{
ux = toupper((int) *x);
uy = toupper((int) *y);
if (ux != uy)
return((ux > uy) ? 1 : -1);
x++;
y++;
} while ((ux) && (uy));
return(0);
341
342
343
} /* __PHYSFS_platformStricmp */
Dec 29, 2003
Dec 29, 2003
344
int __PHYSFS_platformStrnicmp(const char *x, const char *y, PHYSFS_uint32 len)
Nov 9, 2003
Nov 9, 2003
345
{
Dec 29, 2003
Dec 29, 2003
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
int ux, uy;
if (!len)
return(0);
do
{
ux = toupper((int) *x);
uy = toupper((int) *y);
if (ux != uy)
return((ux > uy) ? 1 : -1);
x++;
y++;
len--;
} while ((ux) && (uy) && (len));
return(0);
} /* __PHYSFS_platformStrnicmp */
Nov 9, 2003
Nov 9, 2003
364
365
Apr 6, 2002
Apr 6, 2002
366
static OSErr fnameToFSSpecNoAlias(const char *fname, FSSpec *spec)
Apr 4, 2002
Apr 4, 2002
367
{
Apr 4, 2002
Apr 4, 2002
368
OSErr err;
Apr 4, 2002
Apr 4, 2002
369
Str255 str255;
Jul 11, 2002
Jul 11, 2002
370
int needColon = (strchr(fname, ':') == NULL);
Apr 5, 2002
Apr 5, 2002
371
int len = strlen(fname) + ((needColon) ? 1 : 0);
Apr 4, 2002
Apr 4, 2002
372
373
374
375
376
if (len > 255)
return(bdNamErr);
/* !!! FIXME: What happens with relative pathnames? */
Apr 5, 2002
Apr 5, 2002
377
378
379
380
381
382
383
str255[0] = len;
memcpy(&str255[1], fname, len);
/* probably just a volume name, which seems to need a ':' at the end. */
if (needColon)
str255[len] = ':';
Jul 28, 2002
Jul 28, 2002
384
err = oserr(FSMakeFSSpec(0, 0, str255, spec));
Apr 4, 2002
Apr 4, 2002
385
return(err);
Apr 6, 2002
Apr 6, 2002
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
} /* fnameToFSSpecNoAlias */
static OSErr fnameToFSSpec(const char *fname, FSSpec *spec)
{
Boolean alias = 0;
Boolean folder = 0;
OSErr err = fnameToFSSpecNoAlias(fname, spec);
if (err == dirNFErr) /* might be an alias in the middle of the path. */
{
/*
* Has to be at least two ':' chars, or we wouldn't get a
* dir-not-found condition. (no ':' means it was just a volume,
* just one ':' means we would have gotten a fnfErr, if anything.
*/
char *ptr;
char *start;
char *path = alloca(strlen(fname) + 1);
strcpy(path, fname);
ptr = strchr(path, ':');
Jul 23, 2002
Jul 23, 2002
407
BAIL_IF_MACRO(!ptr, ERR_NO_SUCH_FILE, err); /* just in case */
Apr 6, 2002
Apr 6, 2002
408
ptr = strchr(ptr + 1, ':');
Jul 23, 2002
Jul 23, 2002
409
BAIL_IF_MACRO(!ptr, ERR_NO_SUCH_FILE, err); /* just in case */
Apr 6, 2002
Apr 6, 2002
410
411
*ptr = '\0';
err = fnameToFSSpecNoAlias(path, spec); /* get first dir. */
Jul 28, 2002
Jul 28, 2002
412
BAIL_IF_MACRO(oserr(err) != noErr, NULL, err);
Apr 6, 2002
Apr 6, 2002
413
414
415
start = ptr;
ptr = strchr(start + 1, ':');
Jul 11, 2002
Jul 11, 2002
416
/* Now check each element of the path for aliases... */
Apr 6, 2002
Apr 6, 2002
417
418
419
420
421
422
423
424
425
do
{
CInfoPBRec infoPB;
memset(&infoPB, '\0', sizeof (CInfoPBRec));
infoPB.dirInfo.ioNamePtr = spec->name;
infoPB.dirInfo.ioVRefNum = spec->vRefNum;
infoPB.dirInfo.ioDrDirID = spec->parID;
infoPB.dirInfo.ioFDirIndex = 0;
err = PBGetCatInfoSync(&infoPB);
Jul 11, 2002
Jul 11, 2002
426
if (err != noErr) /* not an alias, really just a bogus path. */
Apr 6, 2002
Apr 6, 2002
427
428
429
430
431
return(fnameToFSSpecNoAlias(fname, spec)); /* reset */
if ((infoPB.dirInfo.ioFlAttrib & kioFlAttribDirMask) != 0)
spec->parID = infoPB.dirInfo.ioDrDirID;
Jul 11, 2002
Jul 11, 2002
432
if (ptr != NULL) /* terminate string after next element. */
Apr 6, 2002
Apr 6, 2002
433
*ptr = '\0';
Jul 11, 2002
Jul 11, 2002
434
Apr 6, 2002
Apr 6, 2002
435
436
437
438
439
440
441
442
443
*start = strlen(start + 1); /* make it a pstring. */
err = FSMakeFSSpec(spec->vRefNum, spec->parID,
(const unsigned char *) start, spec);
if (err != noErr) /* not an alias, really a bogus path. */
return(fnameToFSSpecNoAlias(fname, spec)); /* reset */
err = ResolveAliasFileWithMountFlags(spec, 1, &folder, &alias, 0);
if (err != noErr) /* not an alias, really a bogus path. */
return(fnameToFSSpecNoAlias(fname, spec)); /* reset */
Jul 11, 2002
Jul 11, 2002
444
445
start = ptr; /* move to the next element. */
Apr 6, 2002
Apr 6, 2002
446
447
448
449
450
451
452
if (ptr != NULL)
ptr = strchr(start + 1, ':');
} while (start != NULL);
} /* if */
else /* there's something there; make sure final file is not an alias. */
{
Jul 28, 2002
Jul 28, 2002
453
BAIL_IF_MACRO(oserr(err) != noErr, NULL, err);
Apr 6, 2002
Apr 6, 2002
454
err = ResolveAliasFileWithMountFlags(spec, 1, &folder, &alias, 0);
Jul 28, 2002
Jul 28, 2002
455
BAIL_IF_MACRO(oserr(err) != noErr, NULL, err);
Apr 6, 2002
Apr 6, 2002
456
457
458
} /* else */
return(noErr); /* w00t. */
Apr 4, 2002
Apr 4, 2002
459
460
461
} /* fnameToFSSpec */
462
463
int __PHYSFS_platformExists(const char *fname)
{
Apr 4, 2002
Apr 4, 2002
464
465
FSSpec spec;
return(fnameToFSSpec(fname, &spec) == noErr);
466
467
468
469
470
} /* __PHYSFS_platformExists */
int __PHYSFS_platformIsSymLink(const char *fname)
{
Apr 6, 2002
Apr 6, 2002
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
OSErr err;
FSSpec spec;
Boolean a = 0;
Boolean f = 0;
CInfoPBRec infoPB;
char *ptr;
char *dir = alloca(strlen(fname) + 1);
BAIL_IF_MACRO(dir == NULL, ERR_OUT_OF_MEMORY, 0);
strcpy(dir, fname);
ptr = strrchr(dir, ':');
if (ptr == NULL) /* just a volume name? Can't be a symlink. */
return(0);
/* resolve aliases up to the actual file... */
*ptr = '\0';
Jul 25, 2002
Jul 25, 2002
486
BAIL_IF_MACRO(fnameToFSSpec(dir, &spec) != noErr, NULL, 0);
Apr 6, 2002
Apr 6, 2002
487
488
489
490
491
492
493
*ptr = strlen(ptr + 1); /* ptr is now a pascal string. Yikes! */
memset(&infoPB, '\0', sizeof (CInfoPBRec));
infoPB.dirInfo.ioNamePtr = spec.name;
infoPB.dirInfo.ioVRefNum = spec.vRefNum;
infoPB.dirInfo.ioDrDirID = spec.parID;
infoPB.dirInfo.ioFDirIndex = 0;
Jul 28, 2002
Jul 28, 2002
494
BAIL_IF_MACRO(oserr(PBGetCatInfoSync(&infoPB)) != noErr, NULL, 0);
Apr 6, 2002
Apr 6, 2002
495
496
497
err = FSMakeFSSpec(spec.vRefNum, infoPB.dirInfo.ioDrDirID,
(const unsigned char *) ptr, &spec);
Jul 28, 2002
Jul 28, 2002
498
499
BAIL_IF_MACRO(oserr(err) != noErr, NULL, 0);
BAIL_IF_MACRO(oserr(IsAliasFile(&spec, &a, &f)) != noErr, NULL, 0);
Apr 6, 2002
Apr 6, 2002
500
return(a);
501
502
503
504
505
} /* __PHYSFS_platformIsSymlink */
int __PHYSFS_platformIsDirectory(const char *fname)
{
Apr 4, 2002
Apr 4, 2002
506
507
FSSpec spec;
CInfoPBRec infoPB;
Apr 4, 2002
Apr 4, 2002
508
OSErr err;
Apr 4, 2002
Apr 4, 2002
509
Jul 25, 2002
Jul 25, 2002
510
BAIL_IF_MACRO(fnameToFSSpec(fname, &spec) != noErr, NULL, 0);
Apr 4, 2002
Apr 4, 2002
511
512
513
memset(&infoPB, '\0', sizeof (CInfoPBRec));
infoPB.dirInfo.ioNamePtr = spec.name; /* put name in here. */
infoPB.dirInfo.ioVRefNum = spec.vRefNum; /* ID of file's volume. */
Apr 4, 2002
Apr 4, 2002
514
infoPB.dirInfo.ioDrDirID = spec.parID; /* ID of bin's dir. */
Apr 4, 2002
Apr 4, 2002
515
infoPB.dirInfo.ioFDirIndex = 0; /* file (not parent) info. */
Apr 4, 2002
Apr 4, 2002
516
err = PBGetCatInfoSync(&infoPB);
Jul 28, 2002
Jul 28, 2002
517
BAIL_IF_MACRO(oserr(err) != noErr, NULL, 0);
Apr 4, 2002
Apr 4, 2002
518
return((infoPB.dirInfo.ioFlAttrib & kioFlAttribDirMask) != 0);
519
520
521
522
523
524
525
} /* __PHYSFS_platformIsDirectory */
char *__PHYSFS_platformCvtToDependent(const char *prepend,
const char *dirName,
const char *append)
{
Apr 3, 2002
Apr 3, 2002
526
527
528
529
530
int len = ((prepend) ? strlen(prepend) : 0) +
((append) ? strlen(append) : 0) +
strlen(dirName) + 1;
const char *src;
char *dst;
Mar 14, 2005
Mar 14, 2005
531
char *retval = (char *) allocator.Malloc(len);
Apr 3, 2002
Apr 3, 2002
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
BAIL_IF_MACRO(retval == NULL, ERR_OUT_OF_MEMORY, NULL);
if (prepend != NULL)
{
strcpy(retval, prepend);
dst = retval + strlen(retval);
} /* if */
else
{
*retval = '\0';
dst = retval;
} /* else */
for (src = dirName; *src; src++, dst++)
*dst = ((*src == '/') ? ':' : *src);
*dst = '\0';
return(retval);
550
551
552
553
554
} /* __PHYSFS_platformCvtToDependent */
void __PHYSFS_platformTimeslice(void)
{
Apr 3, 2002
Apr 3, 2002
555
SystemTask();
556
557
558
} /* __PHYSFS_platformTimeslice */
Sep 29, 2004
Sep 29, 2004
559
560
561
/* returns int so we can use BAIL*MACRO... */
static int macClassicEnumerateFiles(const char *dirname,
int omitSymLinks,
Sep 18, 2005
Sep 18, 2005
562
563
PHYSFS_EnumFilesCallback callback,
const char *origdir,
Sep 29, 2004
Sep 29, 2004
564
void *callbackdata)
Apr 5, 2002
Apr 5, 2002
566
567
UInt16 i;
UInt16 max;
Apr 4, 2002
Apr 4, 2002
568
569
570
FSSpec spec;
CInfoPBRec infoPB;
Str255 str255;
Apr 5, 2002
Apr 5, 2002
571
long dirID;
Apr 4, 2002
Apr 4, 2002
572
Jul 25, 2002
Jul 25, 2002
573
BAIL_IF_MACRO(fnameToFSSpec(dirname, &spec) != noErr, NULL, 0);
Apr 4, 2002
Apr 4, 2002
574
Apr 5, 2002
Apr 5, 2002
575
576
577
578
579
580
/* get the dir ID of what we want to enumerate... */
memset(&infoPB, '\0', sizeof (CInfoPBRec));
infoPB.dirInfo.ioNamePtr = spec.name; /* name of dir to enum. */
infoPB.dirInfo.ioVRefNum = spec.vRefNum; /* ID of file's volume. */
infoPB.dirInfo.ioDrDirID = spec.parID; /* ID of dir. */
infoPB.dirInfo.ioFDirIndex = 0; /* file (not parent) info. */
Jul 28, 2002
Jul 28, 2002
581
BAIL_IF_MACRO(oserr(PBGetCatInfoSync(&infoPB)) != noErr, NULL, NULL);
Apr 5, 2002
Apr 5, 2002
582
583
584
585
586
587
588
589
if ((infoPB.dirInfo.ioFlAttrib & kioFlAttribDirMask) == 0)
BAIL_MACRO(ERR_NOT_A_DIR, NULL);
dirID = infoPB.dirInfo.ioDrDirID;
max = infoPB.dirInfo.ioDrNmFls;
for (i = 1; i <= max; i++)
Apr 4, 2002
Apr 4, 2002
590
{
Sep 29, 2004
Sep 29, 2004
591
size_t size;
Apr 6, 2002
Apr 6, 2002
592
593
594
595
FSSpec aliasspec;
Boolean alias = 0;
Boolean folder = 0;
Apr 4, 2002
Apr 4, 2002
596
597
memset(&infoPB, '\0', sizeof (CInfoPBRec));
str255[0] = 0;
Apr 5, 2002
Apr 5, 2002
598
599
600
601
infoPB.dirInfo.ioNamePtr = str255; /* store name in here. */
infoPB.dirInfo.ioVRefNum = spec.vRefNum; /* ID of dir's volume. */
infoPB.dirInfo.ioDrDirID = dirID; /* ID of dir. */
infoPB.dirInfo.ioFDirIndex = i; /* next file's info. */
Apr 4, 2002
Apr 4, 2002
602
if (PBGetCatInfoSync(&infoPB) != noErr)
Apr 5, 2002
Apr 5, 2002
603
continue; /* skip this file. Oh well. */
Apr 4, 2002
Apr 4, 2002
604
Apr 6, 2002
Apr 6, 2002
605
606
607
608
609
610
611
612
613
614
if (FSMakeFSSpec(spec.vRefNum, dirID, str255, &aliasspec) != noErr)
continue; /* skip it. */
if (IsAliasFile(&aliasspec, &alias, &folder) != noErr)
continue; /* skip it. */
if ((alias) && (omitSymLinks))
continue;
/* still here? Add it to the list. */
Sep 29, 2004
Sep 29, 2004
615
616
617
size = (size_t) str255[0]; /* (convert to ASCIZ string...) */
memmove(&str255[0], &str255[1], size);
str255[size] = '\0';
Sep 18, 2005
Sep 18, 2005
618
callback(callbackdata, origdir, (const char *) str255);
Apr 5, 2002
Apr 5, 2002
619
} /* for */
Mar 14, 2005
Mar 14, 2005
620
621
return(1);
Sep 29, 2004
Sep 29, 2004
622
} /* macClassicEnumerateFiles */
Apr 4, 2002
Apr 4, 2002
623
Sep 29, 2004
Sep 29, 2004
624
625
626
void __PHYSFS_platformEnumerateFiles(const char *dirname,
int omitSymLinks,
Sep 18, 2005
Sep 18, 2005
627
628
PHYSFS_EnumFilesCallback callback,
const char *origdir,
Sep 29, 2004
Sep 29, 2004
629
630
void *callbackdata)
{
Sep 18, 2005
Sep 18, 2005
631
632
macClassicEnumerateFiles(dirname, omitSymLinks, callback,
origdir, callbackdata);
633
634
635
636
637
} /* __PHYSFS_platformEnumerateFiles */
char *__PHYSFS_platformCurrentDir(void)
{
Apr 3, 2002
Apr 3, 2002
638
639
640
641
642
643
644
/*
* I don't think MacOS has a concept of "current directory", beyond
* what is grafted on by a given standard C library implementation,
* so just return the base dir.
* We don't use this for anything crucial at the moment anyhow.
*/
return(__PHYSFS_platformCalcBaseDir(NULL));
645
646
647
648
649
} /* __PHYSFS_platformCurrentDir */
char *__PHYSFS_platformRealPath(const char *path)
{
Apr 6, 2002
Apr 6, 2002
650
651
652
653
654
655
656
657
/*
* fnameToFSSpec() will resolve any symlinks to get to the real
* file's FSSpec, which, when converted, will contain the real
* direct path to a given file. convFSSpecToPath() mallocs a
* return value buffer.
*/
FSSpec spec;
Jul 25, 2002
Jul 25, 2002
658
BAIL_IF_MACRO(fnameToFSSpec(path, &spec) != noErr, NULL, NULL);
Apr 6, 2002
Apr 6, 2002
659
return(convFSSpecToPath(&spec, 1));
660
661
662
663
664
} /* __PHYSFS_platformRealPath */
int __PHYSFS_platformMkDir(const char *path)
{
Apr 5, 2002
Apr 5, 2002
665
666
667
668
669
SInt32 val = 0;
FSSpec spec;
OSErr err = fnameToFSSpec(path, &spec);
BAIL_IF_MACRO(err == noErr, ERR_FILE_EXISTS, 0);
Jul 25, 2002
Jul 25, 2002
670
BAIL_IF_MACRO(err != fnfErr, NULL, 0);
Apr 5, 2002
Apr 5, 2002
671
672
err = DirCreate(spec.vRefNum, spec.parID, spec.name, &val);
Jul 28, 2002
Jul 28, 2002
673
BAIL_IF_MACRO(oserr(err) != noErr, NULL, 0);
Apr 5, 2002
Apr 5, 2002
674
return(1);
675
676
677
} /* __PHYSFS_platformMkDir */
Apr 5, 2002
Apr 5, 2002
678
679
680
681
682
683
static SInt16 *macDoOpen(const char *fname, SInt8 perm, int createIfMissing)
{
int created = 0;
SInt16 *retval = NULL;
FSSpec spec;
OSErr err = fnameToFSSpec(fname, &spec);
Jul 25, 2002
Jul 25, 2002
684
BAIL_IF_MACRO((err != noErr) && (err != fnfErr), NULL, NULL);
Apr 5, 2002
Apr 5, 2002
685
686
if (err == fnfErr)
{
Jul 23, 2002
Jul 23, 2002
687
BAIL_IF_MACRO(!createIfMissing, ERR_NO_SUCH_FILE, NULL);
Apr 5, 2002
Apr 5, 2002
688
689
err = HCreate(spec.vRefNum, spec.parID, spec.name,
procInfo.processSignature, 'BINA');
Jul 28, 2002
Jul 28, 2002
690
BAIL_IF_MACRO(oserr(err) != noErr, NULL, NULL);
Apr 5, 2002
Apr 5, 2002
691
692
693
created = 1;
} /* if */
Mar 14, 2005
Mar 14, 2005
694
retval = (SInt16 *) allocator.Malloc(sizeof (SInt16));
Apr 5, 2002
Apr 5, 2002
695
696
697
698
699
700
701
if (retval == NULL)
{
if (created)
HDelete(spec.vRefNum, spec.parID, spec.name);
BAIL_MACRO(ERR_OUT_OF_MEMORY, NULL);
} /* if */
Jan 31, 2003
Jan 31, 2003
702
err = HOpenDF(spec.vRefNum, spec.parID, spec.name, perm, retval);
Jul 28, 2002
Jul 28, 2002
703
if (oserr(err) != noErr)
Apr 5, 2002
Apr 5, 2002
704
{
Mar 14, 2005
Mar 14, 2005
705
allocator.Free(retval);
Apr 5, 2002
Apr 5, 2002
706
707
if (created)
HDelete(spec.vRefNum, spec.parID, spec.name);
Jul 28, 2002
Jul 28, 2002
708
return(NULL);
Apr 5, 2002
Apr 5, 2002
709
710
711
712
713
714
} /* if */
return(retval);
} /* macDoOpen */
715
716
void *__PHYSFS_platformOpenRead(const char *filename)
{
Apr 5, 2002
Apr 5, 2002
717
718
719
SInt16 *retval = macDoOpen(filename, fsRdPerm, 0);
if (retval != NULL) /* got a file; seek to start. */
{
Jul 28, 2002
Jul 28, 2002
720
if (oserr(SetFPos(*retval, fsFromStart, 0)) != noErr)
Apr 5, 2002
Apr 5, 2002
721
722
{
FSClose(*retval);
Jul 28, 2002
Jul 28, 2002
723
return(NULL);
Apr 5, 2002
Apr 5, 2002
724
725
726
727
} /* if */
} /* if */
return((void *) retval);
728
729
730
731
732
} /* __PHYSFS_platformOpenRead */
void *__PHYSFS_platformOpenWrite(const char *filename)
{
Apr 5, 2002
Apr 5, 2002
733
734
735
SInt16 *retval = macDoOpen(filename, fsRdWrPerm, 1);
if (retval != NULL) /* got a file; truncate it. */
{
Jul 28, 2002
Jul 28, 2002
736
737
if ((oserr(SetEOF(*retval, 0)) != noErr) ||
(oserr(SetFPos(*retval, fsFromStart, 0)) != noErr))
Apr 5, 2002
Apr 5, 2002
738
739
{
FSClose(*retval);
Jul 28, 2002
Jul 28, 2002
740
return(NULL);
Apr 5, 2002
Apr 5, 2002
741
742
743
744
} /* if */
} /* if */
return((void *) retval);
745
746
747
748
749
} /* __PHYSFS_platformOpenWrite */
void *__PHYSFS_platformOpenAppend(const char *filename)
{
Apr 5, 2002
Apr 5, 2002
750
751
752
SInt16 *retval = macDoOpen(filename, fsRdWrPerm, 1);
if (retval != NULL) /* got a file; seek to end. */
{
Jul 28, 2002
Jul 28, 2002
753
if (oserr(SetFPos(*retval, fsFromLEOF, 0)) != noErr)
Apr 5, 2002
Apr 5, 2002
754
755
{
FSClose(*retval);
Jul 28, 2002
Jul 28, 2002
756
return(NULL);
Apr 5, 2002
Apr 5, 2002
757
758
759
760
} /* if */
} /* if */
return(retval);
761
762
763
764
765
766
} /* __PHYSFS_platformOpenAppend */
PHYSFS_sint64 __PHYSFS_platformRead(void *opaque, void *buffer,
PHYSFS_uint32 size, PHYSFS_uint32 count)
{
Apr 5, 2002
Apr 5, 2002
767
SInt16 ref = *((SInt16 *) opaque);
Mar 16, 2005
Mar 16, 2005
768
SInt32 br = size*count;
Apr 5, 2002
Apr 5, 2002
769
Mar 16, 2005
Mar 16, 2005
770
771
BAIL_IF_MACRO(oserr(FSRead(ref, &br, buffer)) != noErr, NULL, br/size);
BAIL_IF_MACRO(br != size*count, NULL, br/size); /* !!! FIXME: seek back if only read part of an object! */
Apr 5, 2002
Apr 5, 2002
772
773
return(count);
774
775
776
777
778
779
} /* __PHYSFS_platformRead */
PHYSFS_sint64 __PHYSFS_platformWrite(void *opaque, const void *buffer,
PHYSFS_uint32 size, PHYSFS_uint32 count)
{
Apr 5, 2002
Apr 5, 2002
780
SInt16 ref = *((SInt16 *) opaque);
Mar 16, 2005
Mar 16, 2005
781
SInt32 bw = size*count;
Apr 5, 2002
Apr 5, 2002
782
Mar 16, 2005
Mar 16, 2005
783
784
BAIL_IF_MACRO(oserr(FSWrite(ref, &bw, buffer)) != noErr, NULL, bw/size);
BAIL_IF_MACRO(bw != size*count, NULL, bw/size); /* !!! FIXME: seek back if only wrote part of an object! */
Apr 5, 2002
Apr 5, 2002
785
786
return(count);
787
788
789
790
791
} /* __PHYSFS_platformWrite */
int __PHYSFS_platformSeek(void *opaque, PHYSFS_uint64 pos)
{
Apr 5, 2002
Apr 5, 2002
792
793
SInt16 ref = *((SInt16 *) opaque);
OSErr err = SetFPos(ref, fsFromStart, (SInt32) pos);
Jul 28, 2002
Jul 28, 2002
794
BAIL_IF_MACRO(oserr(err) != noErr, NULL, 0);
Apr 5, 2002
Apr 5, 2002
795
return(1);
796
797
798
799
800
} /* __PHYSFS_platformSeek */
PHYSFS_sint64 __PHYSFS_platformTell(void *opaque)
{
Apr 5, 2002
Apr 5, 2002
801
802
SInt16 ref = *((SInt16 *) opaque);
SInt32 curPos;
Jul 28, 2002
Jul 28, 2002
803
BAIL_IF_MACRO(oserr(GetFPos(ref, &curPos)) != noErr, NULL, -1);
Apr 5, 2002
Apr 5, 2002
804
return((PHYSFS_sint64) curPos);
805
806
807
808
809
} /* __PHYSFS_platformTell */
PHYSFS_sint64 __PHYSFS_platformFileLength(void *opaque)
{
Apr 5, 2002
Apr 5, 2002
810
811
SInt16 ref = *((SInt16 *) opaque);
SInt32 eofPos;
Jul 28, 2002
Jul 28, 2002
812
BAIL_IF_MACRO(oserr(GetEOF(ref, &eofPos)) != noErr, NULL, -1);
Apr 5, 2002
Apr 5, 2002
813
return((PHYSFS_sint64) eofPos);
814
815
816
817
818
} /* __PHYSFS_platformFileLength */
int __PHYSFS_platformEOF(void *opaque)
{
Apr 5, 2002
Apr 5, 2002
819
820
SInt16 ref = *((SInt16 *) opaque);
SInt32 eofPos, curPos;
Jul 28, 2002
Jul 28, 2002
821
822
BAIL_IF_MACRO(oserr(GetEOF(ref, &eofPos)) != noErr, NULL, 1);
BAIL_IF_MACRO(oserr(GetFPos(ref, &curPos)) != noErr, NULL, 1);
Apr 5, 2002
Apr 5, 2002
823
return(curPos >= eofPos);
824
825
826
827
828
} /* __PHYSFS_platformEOF */
int __PHYSFS_platformFlush(void *opaque)
{
Apr 5, 2002
Apr 5, 2002
829
830
831
832
SInt16 ref = *((SInt16 *) opaque);
ParamBlockRec pb;
memset(&pb, '\0', sizeof (ParamBlockRec));
pb.ioParam.ioRefNum = ref;
Jul 28, 2002
Jul 28, 2002
833
BAIL_IF_MACRO(oserr(PBFlushFileSync(&pb)) != noErr, NULL, 0);
Apr 5, 2002
Apr 5, 2002
834
return(1);
835
836
837
838
839
} /* __PHYSFS_platformFlush */
int __PHYSFS_platformClose(void *opaque)
{
Apr 5, 2002
Apr 5, 2002
840
841
842
SInt16 ref = *((SInt16 *) opaque);
SInt16 vRefNum;
Str63 volName;
Jul 28, 2002
Jul 28, 2002
843
int flushVol = 0;
Apr 5, 2002
Apr 5, 2002
844
Jul 28, 2002
Jul 28, 2002
845
846
847
848
849
850
851
852
853
854
if (GetVRefNum(ref, &vRefNum) == noErr)
{
HParamBlockRec hpbr;
memset(&hpbr, '\0', sizeof (HParamBlockRec));
hpbr.volumeParam.ioNamePtr = volName;
hpbr.volumeParam.ioVRefNum = vRefNum;
hpbr.volumeParam.ioVolIndex = 0;
if (PBHGetVInfoSync(&hpbr) == noErr)
flushVol = 1;
} /* if */
Apr 5, 2002
Apr 5, 2002
855
Jul 28, 2002
Jul 28, 2002
856
BAIL_IF_MACRO(oserr(FSClose(ref)) != noErr, NULL, 0);
Mar 14, 2005
Mar 14, 2005
857
allocator.Free(opaque);
Apr 5, 2002
Apr 5, 2002
858
Jul 28, 2002
Jul 28, 2002
859
860
861
if (flushVol)
FlushVol(volName, vRefNum); /* update catalog info, etc. */
Apr 5, 2002
Apr 5, 2002
862
return(1);
863
864
865
866
867
} /* __PHYSFS_platformClose */
int __PHYSFS_platformDelete(const char *path)
{
Apr 5, 2002
Apr 5, 2002
868
869
FSSpec spec;
OSErr err;
Jul 25, 2002
Jul 25, 2002
870
BAIL_IF_MACRO(fnameToFSSpec(path, &spec) != noErr, NULL, 0);
Apr 5, 2002
Apr 5, 2002
871
err = HDelete(spec.vRefNum, spec.parID, spec.name);
Jul 28, 2002
Jul 28, 2002
872
BAIL_IF_MACRO(oserr(err) != noErr, NULL, 0);
Apr 5, 2002
Apr 5, 2002
873
return(1);
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
} /* __PHYSFS_platformDelete */
void *__PHYSFS_platformCreateMutex(void)
{
return((void *) 0x0001); /* no mutexes on MacOS Classic. */
} /* __PHYSFS_platformCreateMutex */
void __PHYSFS_platformDestroyMutex(void *mutex)
{
/* no mutexes on MacOS Classic. */
} /* __PHYSFS_platformDestroyMutex */
int __PHYSFS_platformGrabMutex(void *mutex)
{
return(1); /* no mutexes on MacOS Classic. */
} /* __PHYSFS_platformGrabMutex */
void __PHYSFS_platformReleaseMutex(void *mutex)
{
/* no mutexes on MacOS Classic. */
} /* __PHYSFS_platformReleaseMutex */
May 25, 2002
May 25, 2002
900
901
902
PHYSFS_sint64 __PHYSFS_platformGetLastModTime(const char *fname)
{
May 25, 2002
May 25, 2002
903
904
905
906
FSSpec spec;
CInfoPBRec infoPB;
UInt32 modDate;
Jul 25, 2002
Jul 25, 2002
907
908
if (fnameToFSSpec(fname, &spec) != noErr)
return(-1); /* fnameToFSSpec() sets physfs error message. */
May 25, 2002
May 25, 2002
909
910
911
912
913
914
memset(&infoPB, '\0', sizeof (CInfoPBRec));
infoPB.dirInfo.ioNamePtr = spec.name;
infoPB.dirInfo.ioVRefNum = spec.vRefNum;
infoPB.dirInfo.ioDrDirID = spec.parID;
infoPB.dirInfo.ioFDirIndex = 0;
Jul 28, 2002
Jul 28, 2002
915
BAIL_IF_MACRO(oserr(PBGetCatInfoSync(&infoPB)) != noErr, NULL, -1);
May 25, 2002
May 25, 2002
916
917
918
919
920
921
922
923
924
modDate = ((infoPB.dirInfo.ioFlAttrib & kioFlAttribDirMask) != 0) ?
infoPB.dirInfo.ioDrMdDat : infoPB.hFileInfo.ioFlMdDat;
/* epoch is different on MacOS. They use Jan 1, 1904, apparently. */
/* subtract seconds between those epochs, counting leap years. */
modDate -= 2082844800;
return((PHYSFS_sint64) modDate);
May 25, 2002
May 25, 2002
925
926
} /* __PHYSFS_platformGetLastModTime */
Mar 14, 2005
Mar 14, 2005
927
928
929
930
931
932
933
934
935
936
937
938
939
940
/* !!! FIXME: Don't use C runtime for allocators? */
int __PHYSFS_platformAllocatorInit(void)
{
return(1); /* always succeeds. */
} /* __PHYSFS_platformAllocatorInit */
void __PHYSFS_platformAllocatorDeinit(void)
{
/* no-op */
} /* __PHYSFS_platformAllocatorInit */
Sep 6, 2005
Sep 6, 2005
941
void *__PHYSFS_platformAllocatorMalloc(PHYSFS_uint64 s)
Mar 14, 2005
Mar 14, 2005
942
{
Jan 1, 2006
Jan 1, 2006
943
BAIL_IF_MACRO(__PHYSFS_ui64FitsAddressSpace(s), ERR_OUT_OF_MEMORY, NULL);
Mar 14, 2005
Mar 14, 2005
944
#undef malloc
Sep 6, 2005
Sep 6, 2005
945
return(malloc((size_t) s));
Mar 14, 2005
Mar 14, 2005
946
947
948
} /* __PHYSFS_platformMalloc */
Sep 6, 2005
Sep 6, 2005
949
void *__PHYSFS_platformAllocatorRealloc(void *ptr, PHYSFS_uint64 s)
Mar 14, 2005
Mar 14, 2005
950
{
Jan 1, 2006
Jan 1, 2006
951
BAIL_IF_MACRO(__PHYSFS_ui64FitsAddressSpace(s), ERR_OUT_OF_MEMORY, NULL);
Mar 14, 2005
Mar 14, 2005
952
#undef realloc
Sep 6, 2005
Sep 6, 2005
953
return(realloc(ptr, (size_t) s));
Mar 14, 2005
Mar 14, 2005
954
955
956
957
958
959
960
961
962
} /* __PHYSFS_platformRealloc */
void __PHYSFS_platformAllocatorFree(void *ptr)
{
#undef free
free(ptr);
} /* __PHYSFS_platformAllocatorFree */
Apr 5, 2002
Apr 5, 2002
963
/* end of macclassic.c ... */