home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume1 / 8712 / 15 / scandir.c < prev   
C/C++ Source or Header  |  1990-07-13  |  2KB  |  77 lines

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