platform/macclassic.c
changeset 166 ed10fe7cb16e
parent 162 06ed1dc94f73
child 169 34829282ffe8
--- a/platform/macclassic.c	Thu Apr 04 17:55:13 2002 +0000
+++ b/platform/macclassic.c	Thu Apr 04 17:56:20 2002 +0000
@@ -73,7 +73,7 @@
 
     /* 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 @@
     {
         /* 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 @@
 } /* __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_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 @@
 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 */