[Mplayer-cvslog] CVS: main/linux scandir.c,NONE,1.1 Makefile,1.5,1.6

Jürgen Keil CVS jkeil at mplayerhq.hu
Tue Nov 26 19:31:53 CET 2002


Update of /cvsroot/mplayer/main/linux
In directory mail:/var/tmp.root/cvs-serv29944

Modified Files:
	Makefile 
Added Files:
	scandir.c 
Log Message:
Add a scandir() implementation for systems that do not have it in libc.


--- NEW FILE ---
/*
 * scandir, alphasort - scan a directory
 *
 * implementation for systems that do not have it in libc
 */

#include "../config.h"

#ifndef	HAVE_SCANDIR

#include <sys/types.h>
#include <dirent.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>

/*
 * convenience helper function for scandir's |compar()| function: 
 * sort directory entries using strcoll(3)
 */
int
alphasort(const void *_a, const void *_b)
{
    struct dirent **a = (struct dirent **)_a;
    struct dirent **b = (struct dirent **)_b;
    return strcoll((*a)->d_name, (*b)->d_name);
}


#define strverscmp(a,b) strcoll(a,b) /* for now */

/*
 * convenience helper function for scandir's |compar()| function: 
 * sort directory entries using GNU |strverscmp()|
 */
int
versionsort(const void *_a, const void *_b)
{
    struct dirent **a = (struct dirent **)_a;
    struct dirent **b = (struct dirent **)_b;
    return strverscmp((*a)->d_name, (*b)->d_name);
}

/*
 * The scandir() function reads the directory dirname and builds an
 * array of pointers to directory entries using malloc(3).  It returns
 * the number of entries in the array.  A pointer to the array of
 * directory entries is stored in the location referenced by namelist.
 *
 * The select parameter is a pointer to a user supplied subroutine
 * which is called by scandir() to select which entries are to be
 * included in the array.  The select routine is passed a pointer to
 * a directory entry and should return a non-zero value if the
 * directory entry is to be included in the array.  If select is null,
 * then all the directory entries will be included.
 *
 * The compar parameter is a pointer to a user supplied subroutine
 * which is passed to qsort(3) to sort the completed array.  If this
 * pointer is null, the array is not sorted.
 */
int
scandir(const char *dirname,
	struct dirent ***ret_namelist,
	int (*select)(const struct dirent *),
	int (*compar)(const struct dirent **, const struct dirent **))
{
    int i, len;
    int used, allocated;
    DIR *dir;
    struct dirent *ent, *ent2;
    struct dirent **namelist = NULL;

    if ((dir = opendir(dirname)) == NULL)
	return -1;

    used = 0;
    allocated = 2;
    namelist = malloc(allocated * sizeof(struct dirent *));
    if (!namelist)
	goto error;

    while ((ent = readdir(dir)) != NULL) {

	if (select != NULL && !select(ent))
	    continue;

	/* duplicate struct direct for this entry */
	len = offsetof(struct dirent, d_name) + strlen(ent->d_name) + 1;
	if ((ent2 = malloc(len)) == NULL)
	    return -1;
	
	if (used >= allocated) {
	    allocated *= 2;
	    namelist = realloc(namelist, allocated * sizeof(struct dirent *));
	    if (!namelist)
		goto error;
	}
	memcpy(ent2, ent, len);
	namelist[used++] = ent2;
    }
    closedir(dir);

    if (compar)
	qsort(namelist, used, sizeof(struct dirent *),
	      (int (*)(const void *, const void *)) compar);

    *ret_namelist = namelist;
    return used;


error:
    if (namelist) {
	for (i = 0; i < used; i++) 
	    free(namelist[i]);
	free(namelist);
    }
    return -1;
}
#endif


#if	STANDALONE_MAIN
int
main(int argc, char **argv)
{
	struct dirent **namelist;
	int i, n;

	n = scandir("/etc", &namelist, NULL, alphasort);

	for (i = 0; i < n; i++)
		printf("%s\n", namelist[i]->d_name);
}
#endif

Index: Makefile
===================================================================
RCS file: /cvsroot/mplayer/main/linux/Makefile,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- Makefile	22 Aug 2002 23:29:42 -0000	1.5
+++ Makefile	26 Nov 2002 18:31:30 -0000	1.6
@@ -3,7 +3,7 @@
 
 LIBNAME = libosdep.a
 
-SRCS=getch2.c timer-lx.c shmem.c strsep.c # timer.c
+SRCS=getch2.c timer-lx.c shmem.c strsep.c scandir.c # timer.c
 OBJS=$(SRCS:.c=.o)
 
 ifeq ($(TARGET_ARCH_X86),yes)




More information about the MPlayer-cvslog mailing list