This is scandir.c in view mode; [Download] [Up]
/* ** SCANDIR ** Scan a directory, collecting all (selected) items into a an array. */ #include <sys/types.h> #include <stdio.h> #include "pdftw.h" #ifdef RCSID static char RCS[] = "$Header: /proj/wais/wais-8-b2/lib/RCS/scandir.c,v 1.1 91/07/17 16:38:01 jonathan Exp $"; #endif /* RCSID */ /* Initial guess at directory size. */ #define INITIAL_SIZE 20 extern char *malloc(); extern char *realloc(); extern char *strcpy(); int scandir(name, list, selector, sorter) char *name; struct dirent ***list; int (*selector)(); int (*sorter)(); { register struct dirent **names; register struct dirent *entp; register DIR *dirp; register int i; register int size; /* Get initial list space and open directory. */ size = INITIAL_SIZE; names = (struct dirent **)malloc(size * sizeof names[0]); if (names == NULL) return -1; dirp = opendir(name); if (dirp == NULL) return -1; /* Read entries in the directory. */ for (i = 0; entp = readdir(dirp); ) if (selector == NULL || (*selector)(entp)) { /* User wants them all, or he wants this one. */ if (++i >= size) { size <<= 1; names = (struct dirent **) realloc((char *)names, size * sizeof names[0]); if (names == NULL) { closedir(dirp); return -1; } } /* Copy the entry. */ #ifdef DIRSIZ names[i - 1] = (struct dirent *)malloc(DIRSIZ(entp)); #else names[i - 1] = (struct dirent *)malloc(sizeof(struct dirent) + strlen(entp->d_name)+1); #endif if (names[i - 1] == NULL) { closedir(dirp); return -1; } names[i - 1]->d_ino = entp->d_ino; names[i - 1]->d_reclen = entp->d_reclen; #ifndef USE_DIRENT names[i - 1]->d_namlen = entp->d_namlen; #endif (void)strcpy(names[i - 1]->d_name, entp->d_name); } /* Close things off. */ names[i] = NULL; *list = names; closedir(dirp); /* Sort? */ if (i && sorter) qsort((char *)names, i, sizeof names[0], sorter); return i; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.