1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
int scandir(const char *dir, struct dirent ***namelist,
int (*select)(const struct dirent *),
int (*compar)(const struct dirent **, const struct dirent **)) {
DIR* d;
struct dirent *D;
int num=0;
if (!(d=opendir(dir)))
return -1;
*namelist=0;
while ((D=readdir(d))) {
if (select==0 || select(D)) {
struct dirent **tmp;
++num;
/* printf("realloc %p,%d -> ",*namelist,num*sizeof(struct dirent**)); */
if (!(tmp=realloc(*namelist,num*sizeof(struct dirent**))) ||
!(tmp[num-1]=malloc(sizeof(struct dirent)))) {
int i;
for (i=0; i<num-1; ++i) free(tmp[i]);
free(*namelist);
closedir(d);
return -1;
}
memccpy(tmp[num-1]->d_name,D->d_name,0,NAME_MAX);
*namelist=tmp;
/* printf("%p; tmp[num-1(%d)]=%p\n",*namelist,num-1,tmp[num-1]); */
}
}
closedir(d);
#if 0
{
int i;
puts("pre-qsort:\n");
for (i=0; i<num-1; ++i) {
puts((*namelist)[i]->d_name);
}
puts("post-qsort:\n");
}
#endif
// qsort(&(*namelist)[0],num,sizeof(struct dirent*),(int (*)(const void*,const void*))(compar));
if (compar)
qsort(*namelist,num,sizeof(struct dirent*),(int (*)(const void*,const void*))(compar));
return num;
}
|