/* 22/07/88 : Jacques Gelinas Routine generale pour le balayage d'un repertoire DOS */ #include #include #include #include #include "tool.h" #include "../common/commun.h" #ifdef XENIX_COMP #include #include #include #include /* LACUNE DANS la librairie XENIX sur sco unix 3.2 */ DIR *opendir (char *fname) { DIR *ret = NULL; static DIR dir[20]; int i; for (i=0; i<20; i++){ if (dir[i].dd_fd <= 0) break; } assert (i<20); dir[i].dd_fd = open (fname,O_RDONLY); if (dir[i].dd_fd != -1){ ret = &dir[i]; } return ret; } struct dirent *readdir (DIR *dir) { static struct dirent entry; struct dirent *ret = NULL; while (1){ struct direct direc; int len = read (dir->dd_fd,&direc,sizeof(direc)); if (len < sizeof(direc)) break; if (direc.d_ino > 0) { strcpy (entry.d_name,direc.d_name); ret = &entry; break; } } return ret; } static int closedir (DIR *dir) { int ret = close (dir->dd_fd); dir->dd_fd = 0; return ret; } #endif /* 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[MAXSIZ_PATH]; FILEINFO info; int selok = wild_testall(entr->d_name,select); path_make (dirpath,entr->d_name,fname); file_statinfo (fname,&info); 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. */ export 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 */ export 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(). */ export 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