/* 22/07/88 : Jacques Gelinas Routine generale pour le balayage d'un repertoire DOS */ #include #include #include #include #include "vfs.h" /* Retourne le nombre de fichier trouve Subdir indique si on doit chercher les sous-directory */ static int loc_dir ( const char *path, char *addpath, const WILD_SELECT *select, int subdir, /* profondeur de recherche, 0 = pas de sous-direct */ int (*fct)(const FILEINFO *info,const char *path,const char *add , int nbf), int depfirst) { char dirpath[160]; int nbsous = 0; /* nombre dans sous-repertoire */ int nbcur = 0; /* nombre de fichier trouve dans repertoire */ path_make (path,addpath,dirpath); path_stripsep (dirpath,dirpath); { DIR *dir = opendir (dirpath[0] == '\0' ? "." : dirpath); if (dir != NULL){ struct dirent *entr; while ((entr=readdir(dir))!=NULL){ if (strcmp(entr->d_name,".") != 0 && strcmp(entr->d_name,"..") != 0){ char fname[PATH_MAX]; FILEINFO info; int selok = wild_testall(entr->d_name,select); path_make (dirpath,entr->d_name,fname); file_statinfo (fname,&info); #if 0 // Le seul client de ca, c'est dircmd qui lie les // dates en format DOS. info.date = date_unix2dos(info.date); #endif if (!depfirst && selok){ int ok; if (fct != NULL){ ok = (*fct) (&info,path,addpath,nbcur); }else{ ok = 1; } if (ok < 0) break; nbcur += ok; } if (info.type == FILETYPE_DIR && subdir>0){ char newadd[160]; path_make (addpath,info.name,newadd); path_addback (newadd,newadd); nbsous += loc_dir (path,newadd,select ,subdir-1,fct,depfirst); } if (depfirst && selok){ int ok; if (fct != NULL){ ok = (*fct) (&info,path,addpath,nbcur); }else{ ok = 1; } if (ok < 0) break; nbcur += ok; } } } closedir (dir); } } return (nbcur + nbsous); } /* Extrait certain fichier d'un r‚pertoire Retourne le nombre de fichier trouve Subdir indique si on doit chercher les sous-directory Fct est appel‚ pour chaque fichier ou r‚pertoire extrait. La fonction retourne 1 si le fichier est accept‚, 0 sinon. nbf indique combien de fichier ont ‚t‚ trouv‚ dans le r‚pertoire courant … date. select et noselect sont termin‚ par NULL. */ int dir_gen ( const char *path, /* r‚pertoire … chercher */ const char *select[], /* wildcard de s‚lection */ const char *noselect[], /* wildcard … exclure */ int subdir, /* profondeur de recherche 0,1,... */ int (*fct)(const FILEINFO *info,const char *path,const char *add , int nbf), /* Fonction de validation ou de collecte */ /* Si NULL, agit comme un compteur */ int depfirst) /* cherche les sous-r‚pertoires avant de les */ /* mentionn‚ */ { char fullpath[160]; WILD_SELECT sel; int ret; wild_setall (select,noselect,&sel); path_addback (path,fullpath); ret = loc_dir(fullpath,"",&sel,subdir,fct,depfirst); wild_unsetall (&sel); return (ret); } /* Comme dir_gen, mais aussi les fichiers cach‚s. Pour UNIX, ca fait pas de diff‚rence. Simplement par compatibilit‚ avec tool/osdos */ int dir_gen_h ( const char *path, /* r‚pertoire … chercher */ const char *select[], /* wildcard de s‚lection */ const char *noselect[], /* wildcard … exclure */ int subdir, /* profondeur de recherche 0,1,... */ int (*fct)(const FILEINFO *info,const char *path,const char *add , int nbf), /* Fonction de validation ou de collecte */ /* Si NULL, agit comme un compteur */ int depfirst) /* cherche les sous-r‚pertoires avant de les */ /* mentionn‚ */ { return dir_gen (path,select,noselect,subdir,fct,depfirst); } /* Extrait certain fichier d'un r‚pertoire Retourne le nombre de fichier trouve Subdir indique si on doit chercher les sous-directory Batie … partir de dir_gen(). */ int dir ( const char *path, const char *select, /* wildcard */ int subdir, int (*fct)(const FILEINFO *info,const char *path,const char *add ,int nbf)) { static const char *tbuns[]={NULL}; const char *tbsel[2]; tbsel[0] = select; tbsel[1] = NULL; return dir_gen (path,tbsel,tbuns,subdir,fct,0); } #ifdef TEST static int prt (const FILEINFO *info, const char *path, const char *add ,int nb) { printf (" %s :%s: :%s: :%s:\n" ,info->type == FILETYPE_DIR ? "dir" : " " ,path,add,info->name); return (1); } #include int main (int argc, char *argv[]) { int nbf; static const char *tbsel[]={"*",NULL}; static const char *tbuns[]={"*.o",NULL}; nbf = dir ("/home/solucor/jack","*",0,prt); printf ("Nombre de fichier %d\n",nbf); nbf = dir ("/","*",0,prt); printf ("Nombre de fichier %d\n",nbf); nbf = dir ("/home/solucor/jack","*.c",10,prt); printf ("Nombre de fichier %d\n",nbf); nbf = dir_gen ("/home/solucor/jack",tbsel,tbuns,10,prt,0); printf ("Nombre de fichier %d\n",nbf); return 0; } #endif