#include #include #include "dirlist.h" int mystrcmp(dirinfo* f1, dirinfo* f2) { if((f1->isdir && f2->isdir) || (!(f1->isdir) && !(f2->isdir))) return strcmp(f1->filename,f2->filename); else return f1->isdir?-1:1; } void sortlist(dirinfo** result, int n) { if(n<=1) return; dirinfo* ref = result[0]; dirinfo* tmp; int c,i; int start = 0; int end = n-1; for(i=1;i<=end;i++) { c=mystrcmp(ref,result[i]); if(c<0) { tmp=result[end]; result[end]=result[i]; result[i]=tmp; end--; i--; } else if(c>0) { tmp=result[start]; result[start]=result[i]; result[i]=tmp; start++; } } sortlist(result,start); sortlist(result+start+1,n-start-1); } int isdir(char* path) { struct stat s; s.st_mode=0; stat(path, &s); return s.st_mode & S_IFDIR; } int hascontent(char* path, int dironly) { DIR* dir; struct dirent *dent; int r=0; if (dir = opendir(path)) { char cpath[PATH_SIZE]; getcwd(cpath,PATH_SIZE); chdir(path); while((dent=readdir(dir))!=NULL && !r) if(strcmp(dent->d_name,".") && strcmp(dent->d_name,"..")) r=dironly?isdir(dent->d_name):1; closedir(dir); chdir(cpath); } return r; } int dirlist(char* path, dirinfo** result, int dironly) { DIR* dir; int i=0; struct dirent *dent; if (!(dir = opendir(path))) return -1; chdir(path); while((dent=readdir(dir))!=NULL) { if(strcmp(dent->d_name,".") && strcmp(dent->d_name,"..")) { dirinfo* dirname = (dirinfo*) malloc(sizeof(dirinfo)); strcpy(dirname->filename, (char*) dent->d_name); dirname->isdir=isdir(dent->d_name)?1:0; if(dirname->isdir || !dironly) { dirname->content=0; dirname->content=(dirname->isdir && hascontent(dent->d_name/*newpath*/,dironly)); if(result) result[i] = dirname; i++; } } } closedir(dir); if(result) sortlist(result,i); return i; }