home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / C / Applications / Moscow ML 1.42 / e_mac / e_dirent.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-05-18  |  3.0 KB  |  127 lines  |  [TEXT/CWIE]

  1. /* e_dirent.c */
  2. /* 03Sep95  e */
  3. /* based on MacOS.dep.c   14Aug93  e */
  4.  
  5. #include <Files.h>
  6. #include <errno.h>
  7. #include "dirent.h"
  8. #include "os_mac_str.h"
  9.  
  10. DIR *opendir( const char *dn )
  11. { FSSpec fss;
  12.   unsigned char pbuf[256];
  13.   CInfoPBRec pb;
  14.   DIR *dp;
  15.   int o;
  16.   short cur_vol;
  17.   long cur_dir;
  18.     
  19.     if( *dn == 0 ) goto labelMakeRoot;
  20.  
  21.     c_to_p( (char *)dn, pbuf );
  22.     HGetVol( NULL, &cur_vol, &cur_dir );
  23.     errno = FSMakeFSSpec( cur_vol, cur_dir, pbuf, &fss );
  24.     if ( errno )
  25.     {    if ( errno == -120 && strspn(dn,":") == strlen(dn) )
  26.         { /* all ":" => the "root" */
  27. labelMakeRoot:
  28.           errno = 0;
  29.           pb.dirInfo.ioDrDirID = -1;
  30.           fss.vRefNum = -1;
  31.           pb.dirInfo.ioDrNmFls = 4; /* fix? */
  32.           o = 2;
  33.           goto labelDNalloc;
  34.         }
  35.         return NULL;
  36.     }
  37.     /* set-up paramter block to get # of files/folders */
  38.     pb.dirInfo.ioVRefNum = fss.vRefNum;
  39.     pb.dirInfo.ioDrDirID = fss.parID;
  40.     pb.dirInfo.ioNamePtr = fss.name;
  41.     pb.dirInfo.ioFDirIndex = 0;    /* use name & vRefNum & dirID */
  42.     
  43.     /* get number of files/folders in dir */
  44.     if ( PBGetCatInfoSync(&pb) )
  45.         return NULL;
  46.     if ((pb.dirInfo.ioFlAttrib & 0x10) == 0)
  47.        return NULL; /* not a directory */
  48.     o = 1;
  49.  
  50. labelDNalloc:
  51. #if 0
  52.     /* why did I do this? */
  53.     for ( m = -1, n = 0; n < qDFDs; n++ )
  54.     {    dp = &open_dirs[n];
  55.         if ( dp->openp )
  56.         {    if ( (dp->dirID == pb.dirInfo.ioDrDirID)
  57.                  && (dp->ioVRefNum == fss.vRefNum)
  58.                  && (dp->openp == o) )
  59.                 return dp;
  60.         }
  61.         else if (m < 0) m = n;
  62.     }
  63.     if (m < 0) return NULL; /* no more room */
  64.     dp = &open_dirs[m];
  65. #else
  66.     dp = (DIR *)NewPtr( sizeof(DIR) );
  67.     if( dp == NULL ) return NULL; /* no more room */
  68. #endif
  69.     dp->dirID = pb.dirInfo.ioDrDirID;
  70.     dp->ioVRefNum = fss.vRefNum;
  71.     dp->numFiles = pb.dirInfo.ioDrNmFls;
  72.     dp->index = 1;
  73.     dp->openp = o;
  74.     return dp;
  75. }
  76.  
  77. int closedir( DIR *dp )
  78. {
  79.     if( dp == NULL || dp->openp == 0 )
  80.       return NULL;   /* not a (DIR *) or not open */
  81.     dp->openp = 0; /* not open any more */
  82.     DisposePtr( (Ptr )dp );
  83.     return 0;
  84. }
  85.  
  86. void rewinddir( DIR *dp )
  87. {
  88.     if( dp == NULL || dp->openp == 0 )
  89.       return;      /* not a (DIR *) or not open */
  90.     dp->index = 1;
  91. }
  92.  
  93. struct dirent *readdir( DIR *dp )
  94. {    
  95.     unsigned char *p = (unsigned char *)&dp->entry.d_name[-1];    
  96.  
  97.     if( dp == NULL || dp->openp == 0 )
  98.       return NULL;   /* not a (DIR *) or not open */
  99.     
  100.     dp->entry.d_namlen = 0;
  101.     if ( dp->openp == 2 )
  102.     {    VolumeParam pb;
  103.         pb.ioCompletion = 0;
  104.         pb.ioNamePtr = p;
  105.         pb.ioVolIndex = dp->index;
  106.         if ( PBGetVInfoSync((ParmBlkPtr)&pb) )
  107.           return NULL;
  108.         dp->entry.d_fileno = 0; /* ?? */
  109.     }
  110.     else
  111.     {    CInfoPBRec pb;
  112.         pb.dirInfo.ioNamePtr = p;
  113.         pb.dirInfo.ioVRefNum = dp->ioVRefNum;
  114.         pb.dirInfo.ioDrDirID = dp->dirID;
  115.         pb.dirInfo.ioFDirIndex = dp->index;
  116.         if( dp->index > dp->numFiles || PBGetCatInfoSync(&pb) )
  117.           return NULL;
  118.         dp->entry.d_fileno = pb.dirInfo.ioDrDirID;
  119.     }
  120.     p = &p[p[0]+1];  /* just past last char */
  121.     do *p++ = 0;  /* write the trailing NUL */
  122.     while( ((int )p & 3) != 0 ); /* pad out */
  123.     dp->entry.d_reclen = p - (unsigned char *)&dp->entry;
  124.     dp->index++; /* increment file/volume index */
  125.     return &dp->entry;    
  126. }
  127.