summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/libcruft/scandir.c
blob: fac7eaa7f96773f3dc2ee38190a81e07bc4c15a2 (plain)
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
This c#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; }