home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_progs / fileutil / sed.lzh / SED / DIR.C < prev    next >
C/C++ Source or Header  |  1991-08-16  |  2KB  |  83 lines

  1. /*
  2.  *
  3.  * BSD-like directory searching routines
  4.  * Edwin Hoogerbeets 1989
  5.  *
  6.  */
  7. #ifdef AMIGA
  8. #include <stdio.h>
  9. #include "dir.h"
  10. #include <exec/memory.h>
  11.  
  12. extern char *malloc();
  13. extern char *free();
  14. extern struct FileLock *Lock();
  15. extern char  *AllocMem();
  16.  
  17. static struct direct direntry;
  18.  
  19. #define FIBSIZE (long)sizeof(struct FileInfoBlock)
  20.  
  21. DIR *opendir(filename)
  22. char *filename;
  23. {
  24.   DIR *dir;
  25.  
  26.   if ( !(dir = (DIR *) malloc(sizeof(DIR))) ) {
  27.     return(NULL);
  28.   }
  29.  
  30.   /* needs to be long word aligned, so AllocMem must be used */
  31.   if ( !(dir->fib = (struct FileInfoBlock *)
  32.                                    AllocMem(FIBSIZE,MEMF_CLEAR)) ) {
  33.     free(dir);
  34.     return(NULL);
  35.   }
  36.  
  37.   if ( !(dir->lock = Lock(filename,ACCESS_READ)) ) {
  38.     FreeMem(dir->fib,FIBSIZE);
  39.     free(dir);
  40.     return(NULL);
  41.   }
  42.  
  43.   Examine(dir->lock,dir->fib);
  44.   strncpy(dir->name,filename,31L);
  45.  
  46.   return(dir);
  47. }
  48.  
  49. struct direct *readdir(dir)
  50. DIR *dir;
  51. {
  52.   if ( dir ) {
  53.     if ( ExNext(dir->lock,dir->fib) ) {
  54.       strcpy(direntry.d_name,dir->fib->fib_FileName);
  55.       direntry.d_namlen = strlen(direntry.d_name);
  56.  
  57.       /* inode number emulation! */
  58.       direntry.d_ino = dir->fib->fib_DiskKey;
  59.  
  60.       direntry.d_reclen = sizeof(struct direct) - MAXNAMELEN +
  61.                           direntry.d_namlen + 1;
  62.  
  63.       return(&direntry);
  64.     } else {
  65.       return(NULL);
  66.     }
  67.   } else {
  68.     return(NULL);
  69.   }
  70. }
  71.  
  72. void closedir(dir)
  73. DIR *dir;
  74. {
  75.   if ( dir ) {
  76.     UnLock(dir->lock);
  77.     FreeMem(dir->fib,FIBSIZE);
  78.     free(dir);
  79.   }
  80. }
  81.  
  82. #endif /* AMIGA */
  83.