ftp.nice.ch/pub/next/connectivity/infosystems/WAIStation.1.9.6.N.b.tar.gz#/WAIS/lib/scandir.c

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.