home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 2 / 2181 / scandir.c < prev   
Encoding:
C/C++ Source or Header  |  1990-12-28  |  1.8 KB  |  79 lines

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