From 992321a07e91f7b2899bb2343b64445bf8f6ea28 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Thu, 4 Apr 2002 17:56:20 +0000 Subject: [PATCH] More work. More to go. --- platform/macclassic.c | 80 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 75 insertions(+), 5 deletions(-) diff --git a/platform/macclassic.c b/platform/macclassic.c index f3f76a1..0e4d557 100644 --- a/platform/macclassic.c +++ b/platform/macclassic.c @@ -73,7 +73,7 @@ char *__PHYSFS_platformCalcBaseDir(const char *argv0) /* Get the name of the binary's parent directory. */ memset(&infoPB, '\0', sizeof (CInfoPBRec)); - infoPB.dirInfo.ioNamePtr = str255; /* put name in here. */ + 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 = -1; /* get dir (not file) info. */ @@ -83,7 +83,7 @@ char *__PHYSFS_platformCalcBaseDir(const char *argv0) { /* check parent dir of what we last looked at... */ infoPB.dirInfo.ioDrDirID = infoPB.dirInfo.ioDrParID; - if (PBGetCatInfoAsync(&infoPB) != noErr) + if (PBGetCatInfoSync(&infoPB) != noErr) { if (retval != NULL) free(retval); @@ -163,9 +163,25 @@ int __PHYSFS_platformStricmp(const char *x, const char *y) } /* __PHYSFS_platformStricmp */ +static OSErr fnameToFSSpec(const char *fname, FSSpec *spec) +{ + Str255 str255; + int len = strlen(fname); + if (len > 255) + return(bdNamErr); + + /* !!! FIXME: What happens with relative pathnames? */ + + str255[0] = strlen(fname); + memcpy(&str255[1], fname, str255[0]); + return(FSMakeFSSpec(0, 0, str255, spec)); +} /* fnameToFSSpec */ + + int __PHYSFS_platformExists(const char *fname) { - BAIL_MACRO(ERR_NOT_IMPLEMENTED, 0); + FSSpec spec; + return(fnameToFSSpec(fname, &spec) == noErr); } /* __PHYSFS_platformExists */ @@ -177,7 +193,17 @@ int __PHYSFS_platformIsSymLink(const char *fname) int __PHYSFS_platformIsDirectory(const char *fname) { - BAIL_MACRO(ERR_NOT_IMPLEMENTED, 0); + FSSpec spec; + CInfoPBRec infoPB; + + BAIL_IF_MACRO(fnameToFSSpec(fname, &spec) != noErr, ERR_OS_ERROR, 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.ioDrParID = spec.parID; /* ID of bin's dir. */ + infoPB.dirInfo.ioFDirIndex = 0; /* file (not parent) info. */ + BAIL_IF_MACRO(PBGetCatInfoSync(&infoPB) != noErr, ERR_OS_ERROR, 0); + return((infoPB.dirInfo.ioFlAttrib & kioFlAttribDirMask) != 0); } /* __PHYSFS_platformIsDirectory */ @@ -221,7 +247,51 @@ void __PHYSFS_platformTimeslice(void) LinkedStringList *__PHYSFS_platformEnumerateFiles(const char *dirname, int omitSymLinks) { - BAIL_MACRO(ERR_NOT_IMPLEMENTED, NULL); + LinkedStringList *retval = NULL; + LinkedStringList *l = NULL; + LinkedStringList *prev = NULL; + UInt16 i = 0; + FSSpec spec; + CInfoPBRec infoPB; + Str255 str255; + + BAIL_IF_MACRO(fnameToFSSpec(dirname, &spec) != noErr, ERR_OS_ERROR, 0); + + while (1) + { + memset(&infoPB, '\0', sizeof (CInfoPBRec)); + str255[0] = 0; + infoPB.dirInfo.ioNamePtr = str255; /* store name in here. */ + infoPB.dirInfo.ioVRefNum = spec.vRefNum; /* ID of file's volume. */ + infoPB.dirInfo.ioDrParID = spec.parID; /* ID of bin's dir. */ + infoPB.dirInfo.ioFDirIndex = ++i; /* file (not parent) info. */ + if (PBGetCatInfoSync(&infoPB) != noErr) + break; + + l = (LinkedStringList *) malloc(sizeof (LinkedStringList)); + if (l == NULL) + break; + + l->str = (char *) malloc(str255[0] + 1); + if (l->str == NULL) + { + free(l); + break; + } /* if */ + + memcpy(l->str, &str255[1], str255[0]); + l->str[str255[0]] = '\0'; + + if (retval == NULL) + retval = l; + else + prev->next = l; + + prev = l; + l->next = NULL; + } /* while */ + + return(retval); } /* __PHYSFS_platformEnumerateFiles */