home *** CD-ROM | disk | FTP | other *** search
/ Atari FTP / ATARI_FTP_0693.zip / ATARI_FTP_0693 / Mint / mntlib32.zoo / scandir.c < prev    next >
C/C++ Source or Header  |  1992-09-05  |  2KB  |  87 lines

  1. /*
  2. **  SCANDIR
  3. **  Scan a directory, collecting all (selected) items into a an array.
  4. */
  5.  
  6. #include <compiler.h>
  7. #include <stdlib.h>    /* for qsort */
  8. #include <string.h>
  9. #ifdef __TURBOC__
  10. #include <sys\types.h>
  11. #include <sys\dir.h>
  12. #else
  13. #include <sys/types.h>
  14. #include <sys/dir.h>
  15. #endif
  16.  
  17. #ifndef NULL
  18. #define NULL 0
  19. #endif
  20.  
  21. /* Initial guess at directory size. */
  22. #define INITIAL_SIZE    20
  23.  
  24. int scandir __PROTO((char *name, struct direct ***list,
  25.     int (*selector)(struct direct *),
  26.     int (*sorter)(const void *, const void *)));
  27.  
  28. int
  29. scandir(name, list, selector, sorter)
  30.     char          *name;
  31.     struct direct    ***list;
  32.     int             (*selector) __PROTO((struct direct *));
  33.     int             (*sorter) __PROTO((const void *, const void *));
  34. {
  35.     register struct direct     **names;
  36.     register struct direct      *entp;
  37.     register DIR      *dirp;
  38.     register int       i;
  39.     register int       size;
  40.  
  41.     /* Get initial list space and open directory. */
  42.     size = INITIAL_SIZE;
  43.     names = (struct direct **)malloc(size * sizeof names[0]);
  44.     if (names == NULL)
  45.     return -1;
  46.     dirp = opendir(name);
  47.     if (dirp == NULL)
  48.     return -1;
  49.  
  50.     /* Read entries in the directory. */
  51.     for (i = 0; (entp = readdir(dirp)) != NULL; )
  52.     if (selector == NULL || (*selector)(entp)) {
  53.         /* User wants them all, or he wants this one. */
  54.         if (++i >= size) {
  55.         size <<= 1;
  56.         names = (struct direct **)
  57.             realloc((char *)names, size * sizeof names[0]);
  58.         if (names == NULL) {
  59.             closedir(dirp);
  60.             return -1;
  61.         }
  62.         }
  63.  
  64.         /* Copy the entry. */
  65.         names[i - 1] = (struct direct *)malloc(DIRSIZ(entp));
  66.         if (names[i - 1] == NULL) {
  67.         closedir(dirp);
  68.         return -1;
  69.         }
  70.         names[i - 1]->d_ino = entp->d_ino;
  71.         names[i - 1]->d_reclen = entp->d_reclen;
  72.         names[i - 1]->d_namlen = entp->d_namlen;
  73.         (void)strcpy(names[i - 1]->d_name, entp->d_name);
  74.     }
  75.  
  76.     /* Close things off. */
  77.     names[i] = NULL;
  78.     *list = names;
  79.     closedir(dirp);
  80.  
  81.     /* Sort? */
  82.     if (i && sorter)
  83.     qsort((char *)names, i, sizeof names[0], sorter);
  84.  
  85.     return i;
  86. }
  87.