From 0ed7bbc3cf4fac064abb066ab69ec86feca38e13 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Wed, 14 Mar 2007 07:20:59 +0000 Subject: [PATCH] Dropped classic Mac OS support. Mac OS X remains supported, though. --- CHANGELOG.txt | 3 + CWProjects.sit | Bin 23891 -> 0 bytes INSTALL.txt | 29 +- physfsMPW.make | 145 ------- physfs_platforms.h | 2 +- platform/macclassic.c | 960 ------------------------------------------ 6 files changed, 12 insertions(+), 1127 deletions(-) delete mode 100755 CWProjects.sit delete mode 100644 physfsMPW.make delete mode 100644 platform/macclassic.c diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 86546cf6..5eaadeae 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -2,6 +2,9 @@ * CHANGELOG. */ +03142007 - Dropped classic Mac OS support. It's just too hard to find a working + Mac OS 9 install and reasonable development tools, so it's not + worth it. If you still target OS 8 or 9, please use PhysicsFS 1.0. 03112007 - Removed zlib_license_change.txt ... it's in Subversion and the 1.0 branch for history's sake. Added shared and static build options to CMakeLists.txt, and the expected "make install" target. diff --git a/CWProjects.sit b/CWProjects.sit deleted file mode 100755 index 73897e2db3c496550efe5ec580164ffd6c55ffb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23891 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�IYMij1?x+6O$WX;x>iJ(7dKx1RYqA{ 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 -#include -#include -#include - -/* - * Most of the API calls in here are, according to ADC, available since - * Mac OS 8.1. I don't think I used any Mac OS 9 or CarbonLib-specific - * functions. There might be one or two 8.5 calls, and perhaps when the - * ADC docs say "Available in Mac OS 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 Mac OS 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, Mac OS 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. - */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "physfs_internal.h" - -const char *__PHYSFS_platformDirSeparator = ":"; - - -static const char *get_macos_error_string(OSErr err) -{ - if (err == noErr) - return(NULL); - - switch (err) - { - 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); - 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); - 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); - case dupFNErr: return(ERR_FILE_EXISTS); - 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); - case memFullErr: return(ERR_OUT_OF_MEMORY); - 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); - case errFSNameTooLong: return(ERR_BAD_FILENAME); - case errFSNotAFolder: return(ERR_NOT_A_DIR); - /*case errFSNotAFile: return(ERR_NOT_A_FILE);*/ - 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); - - case paramErr: - case errFSBadFSRef: - case errFSBadBuffer: - case errFSMissingName: - case errFSBadPosMode: - case errFSBadAllocFlags: - case errFSBadItemCount: - case errFSBadSearchParams: - case afpDenyConflict: - return(ERR_PHYSFS_BAD_OS_CALL); - - default: return(ERR_MACOS_GENERIC); - } /* switch */ - - return(NULL); -} /* get_macos_error_string */ - - -static OSErr oserr(OSErr retval) -{ - char buf[sizeof (ERR_MACOS_GENERIC) + 32]; - const char *errstr = get_macos_error_string(retval); - if (errstr != NULL) - { - if (strcmp(errstr, ERR_MACOS_GENERIC) == 0) - { - sprintf(buf, ERR_MACOS_GENERIC, (int) retval); - errstr = buf; - } /* if */ - - __PHYSFS_setError(errstr); - } /* if */ - return(retval); -} /* oserr */ - - -static struct ProcessInfoRec procInfo; -static FSSpec procfsspec; - -int __PHYSFS_platformInit(void) -{ - OSErr err; - ProcessSerialNumber psn; - BAIL_IF_MACRO(oserr(GetCurrentProcess(&psn)) != noErr, NULL, 0); - memset(&procInfo, '\0', sizeof (ProcessInfoRec)); - memset(&procfsspec, '\0', sizeof (FSSpec)); - procInfo.processInfoLength = sizeof (ProcessInfoRec); - procInfo.processAppSpec = &procfsspec; - err = GetProcessInformation(&psn, &procInfo); - BAIL_IF_MACRO(oserr(err) != noErr, NULL, 0); - return(1); /* we're golden. */ -} /* __PHYSFS_platformInit */ - - -int __PHYSFS_platformDeinit(void) -{ - return(1); /* always succeed. */ -} /* __PHYSFS_platformDeinit */ - - -/* - * CD detection code is borrowed from Apple Technical Q&A DV18. - * http://developer.apple.com/qa/dv/dv18.html - */ -void __PHYSFS_platformDetectAvailableCDs(PHYSFS_StringCallback cb, void *data) -{ - - 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; - size_t size; - HParamBlockRec hpbr; - memset(&hpbr, '\0', sizeof (HParamBlockRec)); - hpbr.volumeParam.ioNamePtr = volName; - hpbr.volumeParam.ioVRefNum = dqp->dQDrive; - hpbr.volumeParam.ioVolIndex = 0; - if (PBHGetVInfoSync(&hpbr) == noErr) - { - size = (size_t) volName[0]; /* convert to ASCIZ string... */ - memmove(&volName[0], &volName[1], size); - volName[size] = '\0'; - cb(data, (const char *) volName); - } /* if */ - } /* if */ - - dqp = (DrvQEl *) dqp->qLink; - } /* while */ -} /* __PHYSFS_platformDetectAvailableCDs */ - - -static char *convFSSpecToPath(FSSpec *spec, int includeFile) -{ - char *ptr; - char *retval = NULL; - UInt32 retLength = 0; - CInfoPBRec infoPB; - Str255 str255; - - str255[0] = spec->name[0]; - memcpy(&str255[1], &spec->name[1], str255[0]); - - memset(&infoPB, '\0', sizeof (CInfoPBRec)); - infoPB.dirInfo.ioNamePtr = str255; /* put name in here. */ - 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; - - /* 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; - if (oserr(PBGetCatInfoSync(&infoPB)) != noErr) - { - if (retval != NULL) - allocator.Free(retval); - return(NULL); - } /* if */ - - infoPB.dirInfo.ioFDirIndex = -1; /* look at parent dir next time. */ - - /* allocate more space for the retval... */ - retLength += str255[0] + 1; /* + 1 for a ':' or null char... */ - ptr = (char *) allocator.Malloc(retLength); - if (ptr == NULL) - { - if (retval != NULL) - allocator.Free(retval); - 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); - allocator.Free(retval); - } /* if */ - retval = ptr; - } while (infoPB.dirInfo.ioDrDirID != fsRtDirID); - - return(retval); -} /* 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)); -} /* __PHYSFS_platformCalcBaseDir */ - - -char *__PHYSFS_platformGetUserName(void) -{ - char *retval = NULL; - StringHandle strHandle; - short origResourceFile = CurResFile(); - - /* use the System resource file. */ - UseResFile(0); - /* apparently, -16096 specifies the username. */ - strHandle = GetString(-16096); - UseResFile(origResourceFile); - BAIL_IF_MACRO(strHandle == NULL, NULL, NULL); - - HLock((Handle) strHandle); - retval = (char *) allocator.Malloc((*strHandle)[0] + 1); - 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); - - return(retval); -} /* __PHYSFS_platformGetUserName */ - - -char *__PHYSFS_platformGetUserDir(void) -{ -#if 0 - return(NULL); /* bah...use default behaviour, I guess. */ -#else - /* (Hmm. Default behaviour is broken in the base library. :) ) */ - return(__PHYSFS_platformCalcBaseDir(NULL)); -#endif -} /* __PHYSFS_platformGetUserDir */ - - -PHYSFS_uint64 __PHYSFS_platformGetThreadID(void) -{ - return(1); /* single threaded. */ -} /* __PHYSFS_platformGetThreadID */ - - -int __PHYSFS_platformStricmp(const char *x, const char *y) -{ - 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); -} /* __PHYSFS_platformStricmp */ - - -int __PHYSFS_platformStrnicmp(const char *x, const char *y, PHYSFS_uint32 len) -{ - 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 */ - - -static OSErr fnameToFSSpecNoAlias(const char *fname, FSSpec *spec) -{ - OSErr err; - Str255 str255; - int needColon = (strchr(fname, ':') == NULL); - int len = strlen(fname) + ((needColon) ? 1 : 0); - if (len > 255) - return(bdNamErr); - - /* !!! FIXME: What happens with relative pathnames? */ - - 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] = ':'; - - err = oserr(FSMakeFSSpec(0, 0, str255, spec)); - return(err); -} /* 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, ':'); - BAIL_IF_MACRO(!ptr, ERR_NO_SUCH_FILE, err); /* just in case */ - ptr = strchr(ptr + 1, ':'); - BAIL_IF_MACRO(!ptr, ERR_NO_SUCH_FILE, err); /* just in case */ - *ptr = '\0'; - err = fnameToFSSpecNoAlias(path, spec); /* get first dir. */ - BAIL_IF_MACRO(oserr(err) != noErr, NULL, err); - start = ptr; - ptr = strchr(start + 1, ':'); - - /* Now check each element of the path for aliases... */ - 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); - if (err != noErr) /* not an alias, really just a bogus path. */ - return(fnameToFSSpecNoAlias(fname, spec)); /* reset */ - - if ((infoPB.dirInfo.ioFlAttrib & kioFlAttribDirMask) != 0) - spec->parID = infoPB.dirInfo.ioDrDirID; - - if (ptr != NULL) /* terminate string after next element. */ - *ptr = '\0'; - - *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 */ - - start = ptr; /* move to the next element. */ - if (ptr != NULL) - ptr = strchr(start + 1, ':'); - } while (start != NULL); - } /* if */ - - else /* there's something there; make sure final file is not an alias. */ - { - BAIL_IF_MACRO(oserr(err) != noErr, NULL, err); - err = ResolveAliasFileWithMountFlags(spec, 1, &folder, &alias, 0); - BAIL_IF_MACRO(oserr(err) != noErr, NULL, err); - } /* else */ - - return(noErr); /* w00t. */ -} /* fnameToFSSpec */ - - -int __PHYSFS_platformExists(const char *fname) -{ - FSSpec spec; - return(fnameToFSSpec(fname, &spec) == noErr); -} /* __PHYSFS_platformExists */ - - -int __PHYSFS_platformIsSymLink(const char *fname) -{ - 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'; - BAIL_IF_MACRO(fnameToFSSpec(dir, &spec) != noErr, NULL, 0); - - *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; - BAIL_IF_MACRO(oserr(PBGetCatInfoSync(&infoPB)) != noErr, NULL, 0); - - err = FSMakeFSSpec(spec.vRefNum, infoPB.dirInfo.ioDrDirID, - (const unsigned char *) ptr, &spec); - BAIL_IF_MACRO(oserr(err) != noErr, NULL, 0); - BAIL_IF_MACRO(oserr(IsAliasFile(&spec, &a, &f)) != noErr, NULL, 0); - return(a); -} /* __PHYSFS_platformIsSymlink */ - - -int __PHYSFS_platformIsDirectory(const char *fname) -{ - FSSpec spec; - CInfoPBRec infoPB; - OSErr err; - - BAIL_IF_MACRO(fnameToFSSpec(fname, &spec) != noErr, NULL, 0); - memset(&infoPB, '\0', sizeof (CInfoPBRec)); - infoPB.dirInfo.ioNamePtr = spec.name; /* put name in here. */ - infoPB.dirInfo.ioVRefNum = spec.vRefNum; /* ID of file's volume. */ - infoPB.dirInfo.ioDrDirID = spec.parID; /* ID of bin's dir. */ - infoPB.dirInfo.ioFDirIndex = 0; /* file (not parent) info. */ - err = PBGetCatInfoSync(&infoPB); - BAIL_IF_MACRO(oserr(err) != noErr, NULL, 0); - return((infoPB.dirInfo.ioFlAttrib & kioFlAttribDirMask) != 0); -} /* __PHYSFS_platformIsDirectory */ - - -char *__PHYSFS_platformCvtToDependent(const char *prepend, - const char *dirName, - const char *append) -{ - int len = ((prepend) ? strlen(prepend) : 0) + - ((append) ? strlen(append) : 0) + - strlen(dirName) + 1; - const char *src; - char *dst; - char *retval = (char *) allocator.Malloc(len); - 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); -} /* __PHYSFS_platformCvtToDependent */ - - -void __PHYSFS_platformTimeslice(void) -{ - SystemTask(); -} /* __PHYSFS_platformTimeslice */ - - -/* returns int so we can use BAIL*MACRO... */ -static int macClassicEnumerateFiles(const char *dirname, - int omitSymLinks, - PHYSFS_EnumFilesCallback callback, - const char *origdir, - void *callbackdata) -{ - UInt16 i; - UInt16 max; - FSSpec spec; - CInfoPBRec infoPB; - Str255 str255; - long dirID; - - BAIL_IF_MACRO(fnameToFSSpec(dirname, &spec) != noErr, NULL, 0); - - /* 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. */ - BAIL_IF_MACRO(oserr(PBGetCatInfoSync(&infoPB)) != noErr, NULL, NULL); - - 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++) - { - size_t size; - FSSpec aliasspec; - Boolean alias = 0; - Boolean folder = 0; - - memset(&infoPB, '\0', sizeof (CInfoPBRec)); - str255[0] = 0; - 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. */ - if (PBGetCatInfoSync(&infoPB) != noErr) - continue; /* skip this file. Oh well. */ - - 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. */ - size = (size_t) str255[0]; /* (convert to ASCIZ string...) */ - memmove(&str255[0], &str255[1], size); - str255[size] = '\0'; - callback(callbackdata, origdir, (const char *) str255); - } /* for */ - - return(1); -} /* macClassicEnumerateFiles */ - - -void __PHYSFS_platformEnumerateFiles(const char *dirname, - int omitSymLinks, - PHYSFS_EnumFilesCallback callback, - const char *origdir, - void *callbackdata) -{ - macClassicEnumerateFiles(dirname, omitSymLinks, callback, - origdir, callbackdata); -} /* __PHYSFS_platformEnumerateFiles */ - - -char *__PHYSFS_platformCurrentDir(void) -{ - /* - * I don't think Mac OS 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)); -} /* __PHYSFS_platformCurrentDir */ - - -char *__PHYSFS_platformRealPath(const char *path) -{ - /* - * 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; - BAIL_IF_MACRO(fnameToFSSpec(path, &spec) != noErr, NULL, NULL); - return(convFSSpecToPath(&spec, 1)); -} /* __PHYSFS_platformRealPath */ - - -int __PHYSFS_platformMkDir(const char *path) -{ - SInt32 val = 0; - FSSpec spec; - OSErr err = fnameToFSSpec(path, &spec); - - BAIL_IF_MACRO(err == noErr, ERR_FILE_EXISTS, 0); - BAIL_IF_MACRO(err != fnfErr, NULL, 0); - - err = DirCreate(spec.vRefNum, spec.parID, spec.name, &val); - BAIL_IF_MACRO(oserr(err) != noErr, NULL, 0); - return(1); -} /* __PHYSFS_platformMkDir */ - - -static SInt16 *macDoOpen(const char *fname, SInt8 perm, int createIfMissing) -{ - int created = 0; - SInt16 *retval = NULL; - FSSpec spec; - OSErr err = fnameToFSSpec(fname, &spec); - BAIL_IF_MACRO((err != noErr) && (err != fnfErr), NULL, NULL); - if (err == fnfErr) - { - BAIL_IF_MACRO(!createIfMissing, ERR_NO_SUCH_FILE, NULL); - err = HCreate(spec.vRefNum, spec.parID, spec.name, - procInfo.processSignature, 'BINA'); - BAIL_IF_MACRO(oserr(err) != noErr, NULL, NULL); - created = 1; - } /* if */ - - retval = (SInt16 *) allocator.Malloc(sizeof (SInt16)); - if (retval == NULL) - { - if (created) - HDelete(spec.vRefNum, spec.parID, spec.name); - BAIL_MACRO(ERR_OUT_OF_MEMORY, NULL); - } /* if */ - - err = HOpenDF(spec.vRefNum, spec.parID, spec.name, perm, retval); - if (oserr(err) != noErr) - { - allocator.Free(retval); - if (created) - HDelete(spec.vRefNum, spec.parID, spec.name); - return(NULL); - } /* if */ - - return(retval); -} /* macDoOpen */ - - -void *__PHYSFS_platformOpenRead(const char *filename) -{ - SInt16 *retval = macDoOpen(filename, fsRdPerm, 0); - if (retval != NULL) /* got a file; seek to start. */ - { - if (oserr(SetFPos(*retval, fsFromStart, 0)) != noErr) - { - FSClose(*retval); - return(NULL); - } /* if */ - } /* if */ - - return((void *) retval); -} /* __PHYSFS_platformOpenRead */ - - -void *__PHYSFS_platformOpenWrite(const char *filename) -{ - SInt16 *retval = macDoOpen(filename, fsRdWrPerm, 1); - if (retval != NULL) /* got a file; truncate it. */ - { - if ((oserr(SetEOF(*retval, 0)) != noErr) || - (oserr(SetFPos(*retval, fsFromStart, 0)) != noErr)) - { - FSClose(*retval); - return(NULL); - } /* if */ - } /* if */ - - return((void *) retval); -} /* __PHYSFS_platformOpenWrite */ - - -void *__PHYSFS_platformOpenAppend(const char *filename) -{ - SInt16 *retval = macDoOpen(filename, fsRdWrPerm, 1); - if (retval != NULL) /* got a file; seek to end. */ - { - if (oserr(SetFPos(*retval, fsFromLEOF, 0)) != noErr) - { - FSClose(*retval); - return(NULL); - } /* if */ - } /* if */ - - return(retval); -} /* __PHYSFS_platformOpenAppend */ - - -PHYSFS_sint64 __PHYSFS_platformRead(void *opaque, void *buffer, - PHYSFS_uint32 size, PHYSFS_uint32 count) -{ - SInt16 ref = *((SInt16 *) opaque); - SInt32 br = size*count; - - 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! */ - - return(count); -} /* __PHYSFS_platformRead */ - - -PHYSFS_sint64 __PHYSFS_platformWrite(void *opaque, const void *buffer, - PHYSFS_uint32 size, PHYSFS_uint32 count) -{ - SInt16 ref = *((SInt16 *) opaque); - SInt32 bw = size*count; - - 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! */ - - return(count); -} /* __PHYSFS_platformWrite */ - - -int __PHYSFS_platformSeek(void *opaque, PHYSFS_uint64 pos) -{ - SInt16 ref = *((SInt16 *) opaque); - OSErr err = SetFPos(ref, fsFromStart, (SInt32) pos); - BAIL_IF_MACRO(oserr(err) != noErr, NULL, 0); - return(1); -} /* __PHYSFS_platformSeek */ - - -PHYSFS_sint64 __PHYSFS_platformTell(void *opaque) -{ - SInt16 ref = *((SInt16 *) opaque); - SInt32 curPos; - BAIL_IF_MACRO(oserr(GetFPos(ref, &curPos)) != noErr, NULL, -1); - return((PHYSFS_sint64) curPos); -} /* __PHYSFS_platformTell */ - - -PHYSFS_sint64 __PHYSFS_platformFileLength(void *opaque) -{ - SInt16 ref = *((SInt16 *) opaque); - SInt32 eofPos; - BAIL_IF_MACRO(oserr(GetEOF(ref, &eofPos)) != noErr, NULL, -1); - return((PHYSFS_sint64) eofPos); -} /* __PHYSFS_platformFileLength */ - - -int __PHYSFS_platformEOF(void *opaque) -{ - SInt16 ref = *((SInt16 *) opaque); - SInt32 eofPos, curPos; - BAIL_IF_MACRO(oserr(GetEOF(ref, &eofPos)) != noErr, NULL, 1); - BAIL_IF_MACRO(oserr(GetFPos(ref, &curPos)) != noErr, NULL, 1); - return(curPos >= eofPos); -} /* __PHYSFS_platformEOF */ - - -int __PHYSFS_platformFlush(void *opaque) -{ - SInt16 ref = *((SInt16 *) opaque); - ParamBlockRec pb; - memset(&pb, '\0', sizeof (ParamBlockRec)); - pb.ioParam.ioRefNum = ref; - BAIL_IF_MACRO(oserr(PBFlushFileSync(&pb)) != noErr, NULL, 0); - return(1); -} /* __PHYSFS_platformFlush */ - - -int __PHYSFS_platformClose(void *opaque) -{ - SInt16 ref = *((SInt16 *) opaque); - SInt16 vRefNum; - Str63 volName; - int flushVol = 0; - - 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 */ - - BAIL_IF_MACRO(oserr(FSClose(ref)) != noErr, NULL, 0); - allocator.Free(opaque); - - if (flushVol) - FlushVol(volName, vRefNum); /* update catalog info, etc. */ - - return(1); -} /* __PHYSFS_platformClose */ - - -int __PHYSFS_platformDelete(const char *path) -{ - FSSpec spec; - OSErr err; - BAIL_IF_MACRO(fnameToFSSpec(path, &spec) != noErr, NULL, 0); - err = HDelete(spec.vRefNum, spec.parID, spec.name); - BAIL_IF_MACRO(oserr(err) != noErr, NULL, 0); - return(1); -} /* __PHYSFS_platformDelete */ - - -void *__PHYSFS_platformCreateMutex(void) -{ - return((void *) 0x0001); /* no mutexes on Mac OS classic. */ -} /* __PHYSFS_platformCreateMutex */ - - -void __PHYSFS_platformDestroyMutex(void *mutex) -{ - /* no mutexes on Mac OS classic. */ -} /* __PHYSFS_platformDestroyMutex */ - - -int __PHYSFS_platformGrabMutex(void *mutex) -{ - return(1); /* no mutexes on Mac OS classic. */ -} /* __PHYSFS_platformGrabMutex */ - - -void __PHYSFS_platformReleaseMutex(void *mutex) -{ - /* no mutexes on Mac OS classic. */ -} /* __PHYSFS_platformReleaseMutex */ - - -PHYSFS_sint64 __PHYSFS_platformGetLastModTime(const char *fname) -{ - FSSpec spec; - CInfoPBRec infoPB; - UInt32 modDate; - - if (fnameToFSSpec(fname, &spec) != noErr) - return(-1); /* fnameToFSSpec() sets physfs error message. */ - - memset(&infoPB, '\0', sizeof (CInfoPBRec)); - infoPB.dirInfo.ioNamePtr = spec.name; - infoPB.dirInfo.ioVRefNum = spec.vRefNum; - infoPB.dirInfo.ioDrDirID = spec.parID; - infoPB.dirInfo.ioFDirIndex = 0; - BAIL_IF_MACRO(oserr(PBGetCatInfoSync(&infoPB)) != noErr, NULL, -1); - - modDate = ((infoPB.dirInfo.ioFlAttrib & kioFlAttribDirMask) != 0) ? - infoPB.dirInfo.ioDrMdDat : infoPB.hFileInfo.ioFlMdDat; - - /* epoch is different on Mac OS. They use Jan 1, 1904, apparently. */ - /* subtract seconds between those epochs, counting leap years. */ - modDate -= 2082844800; - - return((PHYSFS_sint64) modDate); -} /* __PHYSFS_platformGetLastModTime */ - - -/* !!! 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 */ - - -void *__PHYSFS_platformAllocatorMalloc(PHYSFS_uint64 s) -{ - BAIL_IF_MACRO(__PHYSFS_ui64FitsAddressSpace(s), ERR_OUT_OF_MEMORY, NULL); - #undef malloc - return(malloc((size_t) s)); -} /* __PHYSFS_platformMalloc */ - - -void *__PHYSFS_platformAllocatorRealloc(void *ptr, PHYSFS_uint64 s) -{ - BAIL_IF_MACRO(__PHYSFS_ui64FitsAddressSpace(s), ERR_OUT_OF_MEMORY, NULL); - #undef realloc - return(realloc(ptr, (size_t) s)); -} /* __PHYSFS_platformRealloc */ - - -void __PHYSFS_platformAllocatorFree(void *ptr) -{ - #undef free - free(ptr); -} /* __PHYSFS_platformAllocatorFree */ - -#endif /* PHYSFS_PLATFORM_MACCLASSIC */ - -/* end of macclassic.c ... */ -