7fd59977 |
1 | /********************************************************** |
2 | * RBA 12/10/88 |
3 | * --- -------- |
4 | * |
5 | * Fichier : OSD_FFI.C (SUN/UNIX) |
6 | * Titre : osd_ffi_(dir, name, tab_res, max, l_dir, l_name, l_tab) |
7 | * char *dir, *nmae, *tab-res; |
8 | * int *max; |
9 | * int l_dir, l_name, l_tab; |
10 | * Retour: |
11 | * Nombre de fichier trouve (1 ou plus) |
12 | * 0 sinon. |
13 | * |
14 | * Role : Trouver tous les fichier qui ont le meme nom que 'name' sachant |
15 | * que 'name' peut etre un nom de fichier comportant le caractere |
16 | * joker '*'. |
17 | * Exemple : |
18 | * Appel en Fortran |
19 | * |
20 | * integer nb_fichier, osd_ffi |
21 | * character*80 dir, name |
22 | * character*80 tab_res(100) |
23 | * .... |
24 | * .... |
25 | * name = 'TOTO*.*' |
26 | * .... |
27 | * nb_fichier = osd_ffi(dir, name, tab_res, 100) |
28 | * |
29 | * Modifs : - sga 28/04/92 correction bug closedir |
30 | * - asi 11/04/90 correction de strcmp_joker |
31 | * - fsa 26/04/90 ajout du tri du tableau tab_res |
32 | * par ordre aphabethique |
33 | * - asi 06/09/90 ajout de la directorie aux noms de fichier |
34 | * retourne |
35 | * - J.P. TIRAULT le 3-Avril-1992 : Faire le close du directory |
36 | * apres l'avoir ouvert. |
37 | * |
38 | ************************************************************/ |
39 | #if defined(_MSC_VER) && !defined(WNT) |
40 | #error "Wrong compiler options has been detected. Add /DWNT option for proper compilation!!!!!" |
41 | #endif |
42 | |
43 | #ifndef WNT |
44 | |
45 | #ifdef HAVE_CONFIG_H |
46 | # include <config.h> |
47 | #endif |
48 | |
49 | /* This hack is required to get HP's c89 to include a definition for DIR */ |
50 | #ifdef __hpux |
51 | # ifndef _INCLUDE_POSIX_SOURCE |
52 | # define _INCLUDE_POSIX_SOURCE |
53 | # endif |
54 | #endif |
55 | |
56 | #include <stdio.h> |
57 | #include <sys/types.h> |
58 | #include <sys/stat.h> |
59 | #include <stdlib.h> |
60 | #include <string.h> |
61 | |
62 | #ifdef HAVE_DIRENT_H |
63 | # include <dirent.h> |
64 | # define NAMLEN(dirent) strlen((dirent)->d_name) |
65 | # ifdef VMS |
66 | extern char *vmsify PARAMS ((char *name, int type)); |
67 | # endif |
68 | #else |
69 | # define dirent direct |
70 | # define NAMLEN(dirent) (dirent)->d_namlen |
71 | # ifdef HAVE_SYS_NDIR_H |
72 | # include <sys/ndir.h> |
73 | # endif |
74 | # ifdef HAVE_SYS_DIR_H |
75 | # include <sys/dir.h> |
76 | # endif |
77 | # ifdef HAVE_NDIR_H |
78 | # include <ndir.h> |
79 | # endif |
80 | # ifdef HAVE_VMSDIR_H |
81 | # include "vmsdir.h" |
82 | # endif /* HAVE_VMSDIR_H */ |
83 | #endif |
84 | |
85 | /* In GNU systems, <dirent.h> defines this macro for us. */ |
86 | #ifdef _D_NAMLEN |
87 | # undef NAMLEN |
88 | # define NAMLEN(d) _D_NAMLEN(d) |
89 | #endif |
90 | |
91 | #if (defined (POSIX) || defined (VMS) || defined (WINDOWS32)) && !defined (__GNU_LIBRARY__) |
92 | /* Posix does not require that the d_ino field be present, and some |
93 | systems do not provide it. */ |
94 | # define REAL_DIR_ENTRY(dp) 1 |
95 | # define FAKE_DIR_ENTRY(dp) |
96 | #else |
97 | # define REAL_DIR_ENTRY(dp) (dp->d_ino != 0) |
98 | # define FAKE_DIR_ENTRY(dp) (dp->d_ino = 1) |
99 | #endif /* POSIX */ |
100 | |
101 | DIR *dirp; |
102 | struct dirent *dp; |
103 | |
104 | void tri(int taille, char *list,int l_tab); |
105 | int strcmp_joker(char *s1, char *s2); |
106 | |
107 | int |
108 | osd_ffi(char *dir, char *name, char *tab_res, int *max, int l_dir, int l_name, int l_tab) |
109 | { |
110 | char file[255], directory[255]; |
111 | int ii, jj, kk, nb_file; |
112 | |
113 | /***** Le Nom de la directory ******/ |
114 | if (*dir == ' ') { |
115 | directory[0] = '.'; |
116 | directory[1] = 0; |
117 | } |
118 | else { |
119 | for (ii=0; ii<l_dir && ii<255 && *dir != ' '; ii++) |
120 | directory[ii] = *(dir++); |
121 | directory[ii]=0; |
122 | } |
123 | |
124 | /***** Le Nom de fichier recherche *******/ |
125 | for (ii=0; ii<l_name && ii<255 && *name != ' '; ii++) |
126 | file[ii] = *(name++); |
127 | file[ii]=0; |
128 | |
129 | /****** On ouvre le directory pour trouver les fichiers ********/ |
130 | nb_file=0; |
131 | if ((dirp = opendir(directory)) != NULL){ |
132 | while ((nb_file < *max) && (dp=readdir(dirp))) { |
133 | /*====== Si on trouve un fichier qui lui ressemble ==========*/ |
134 | if(strcmp_joker(file,dp->d_name) == 0) { |
135 | /*======= On copie sa valeur ========*/ |
136 | /* avec la directorie */ |
137 | /* jj tab_res, kk la ligne ,ii le nom */ |
138 | jj = nb_file * l_tab; |
139 | kk = 0; |
140 | if (directory[0] != '.') { |
141 | for (; kk<l_tab && directory[kk] != 0; kk++,jj++) |
142 | *(tab_res + jj) = directory[kk]; |
143 | if (directory[kk-1] != '/') *(tab_res + (jj++)) = '/'; |
144 | } |
145 | for (ii=0; (kk)<l_tab && *(dp->d_name+ii); ii++,jj++,kk++) |
146 | *(tab_res + jj) = *(dp->d_name + ii); |
147 | /*======= En completant avec blanc ======*/ |
148 | for (; kk<l_tab ; jj++,kk++) |
149 | *(tab_res + jj) = ' '; |
150 | nb_file++; |
151 | } |
152 | } |
153 | } |
154 | /***** tri du tableau tab_res par ordre alpha *****/ |
155 | if (dirp){ |
156 | closedir(dirp); |
157 | tri( nb_file , tab_res ,l_tab ); |
158 | } |
159 | return(nb_file); |
160 | } |
161 | |
162 | /*********************************************** |
163 | * RBA Date: 27/06/88 |
164 | * --- --------- |
165 | * |
166 | * Title: STRCMP_JOKER(ch1,ch2) |
167 | * Role : Compare ch1 with ch2 |
168 | * ch1 can have the joker caracter '*' |
169 | * res = 0 they are identical |
170 | * res <>0 otherwise |
171 | * Modif: asi 11/04/90 correction |
172 | ***********************************************/ |
173 | |
174 | |
175 | #define TRUE 1 |
176 | #define FALSE 0 |
177 | #define JOKER '*' |
178 | |
179 | int |
180 | strcmp_joker(char *s1, char *s2) |
181 | { |
182 | char *c1=NULL,*c2=NULL; /* sauvegardes */ |
183 | int res; |
184 | int deb = 1; /* 0 si 1er car est le joker, 1 sinon */ |
185 | |
186 | while (*s2) { |
187 | if (*s1 == JOKER) { |
188 | deb = 0; |
189 | while(*s1 == JOKER) s1++; |
190 | if (*s1) { |
191 | while(*s2 && *s2 != *s1) s2++; |
192 | c1 = s1, c2 = s2; |
193 | } |
194 | else return(0); /* s1 fini par un jocker */ |
195 | } |
196 | else { /* comparaison de 2 car */ |
197 | res = *s1++ - *s2++; |
198 | if (res != 0) { |
199 | /* 1ere chaine pas de joker au debut */ |
200 | if (deb) return (res); |
201 | else { /* on recherche la meme chaine plus loin */ |
202 | s1 = c1, s2 = ++c2; |
203 | while(*s2 && *s2 != *s1) s2++; |
204 | c2 = s2; |
205 | } |
206 | } |
207 | } |
208 | } |
209 | while(*s1 == JOKER) s1++; |
210 | return(*s1 - *s2); |
211 | } |
212 | |
213 | /************************************************** |
214 | * FSA date: 26/04/90 |
215 | * --- --------- |
216 | * |
217 | * Titre : COMPAR (ch1,ch2) |
218 | * Role : Comparer ch1 avec ch2 |
219 | * retourne : 0 si chaines identiques |
220 | * >0 si ch2 avant ch1 |
221 | * <0 si ch1 avant ch2 |
222 | * Modif : |
223 | **************************************************/ |
224 | |
225 | static int |
226 | compar(char *ch1, char *ch2) |
227 | { |
228 | /* int strcmp(char *cha, const char *chb); */ |
229 | |
230 | return(strcmp(ch1,ch2)); |
231 | } |
232 | |
233 | /************************************************** |
234 | * FSA date: 26/04/90 |
235 | * --- --------- |
236 | * |
237 | * Titre : TRI (taille,list,l_tab) |
238 | * Role : Tri un tableau de chaines par ordre |
239 | * alphabetique |
240 | * Modif : |
241 | **************************************************/ |
242 | |
243 | void |
244 | tri(int taille, char *list,int l_tab) |
245 | { |
246 | qsort( list , taille , l_tab ,(int (*)(const void *,const void *)) compar ); |
247 | } |
248 | |
249 | #else |
250 | // VERSION WNT |
251 | // |
252 | #include <io.h> |
253 | #include <stdlib.h> |
254 | #include <string.h> |
255 | #include <stddef.h> |
256 | |
257 | #ifdef VAC |
258 | #include <windows.h> // added for VAC++ version -ChG 07081997 |
259 | #endif |
260 | |
261 | #ifdef DOS |
262 | #include <dos.h> |
263 | static struct _find_t zeptr ; |
264 | |
265 | #else |
266 | |
267 | #ifdef VAC |
268 | static LPWIN32_FIND_DATA zeptr ; |
269 | #else |
270 | static struct _finddata_t zeptr ; |
271 | #endif |
272 | |
273 | #endif |
274 | #ifdef VAC |
275 | HANDLE dirp; |
276 | #else |
277 | ptrdiff_t dirp; |
278 | #endif |
279 | |
280 | char filespec[255]; |
281 | |
282 | |
283 | int |
284 | osd_ffi_(char *dir, char *name, char *tab_res, int *max, int l_dir, int l_name, int l_tab) |
285 | { |
286 | char file[255], directory[255]; |
287 | int ii, jj, kk, nb_file; |
288 | #ifdef VAC |
289 | BOOL fini ; |
290 | #else |
291 | int fini ; |
292 | #endif |
293 | |
294 | /***** Le Nom de la directory ******/ |
295 | if (*dir == ' ') { |
296 | directory[0] = '.'; |
297 | directory[1] = '/'; |
298 | directory[2] = 0 ; |
299 | } |
300 | else { |
301 | for (ii=0; ii<l_dir && ii<255 && *dir != ' '; ii++) { |
302 | directory[ii] = *(dir++); |
303 | if ( directory [ii] == '\\' ) directory [ii] = '/' ; |
304 | } |
305 | directory[ii]=0; |
306 | } |
307 | |
308 | /***** Le Nom de fichier recherche *******/ |
309 | for (ii=0; ii<l_name && ii<255 && *name != ' '; ii++) |
310 | file[ii] = *(name++); |
311 | file[ii]=0; |
312 | |
313 | /****** On ouvre le directory pour trouver les fichiers ********/ |
314 | nb_file=0; |
315 | |
316 | strcpy(filespec, directory ); |
317 | strcat(filespec, file ); |
318 | |
319 | #ifdef VAC |
320 | if ((dirp = FindFirstFile(filespec, zeptr)) != INVALID_HANDLE_VALUE ) { |
321 | #else |
322 | if ((dirp = _findfirst(filespec, &zeptr)) != -1 ) { |
323 | #endif |
324 | fini = 0 ; |
325 | while (nb_file < *max && (! fini ) ) { |
326 | |
327 | /*====== Si on trouve un fichier qui lui ressemble ==========*/ |
328 | |
329 | |
330 | /*======= On copie sa valeur ========*/ |
331 | /* avec la directorie */ |
332 | /* jj tab_res, kk la ligne ,ii le nom */ |
333 | jj = nb_file * l_tab; |
334 | kk = 0; |
335 | if (directory[0] != '.') { |
336 | for (; kk<l_tab && directory[kk] != 0; kk++,jj++) |
337 | *(tab_res + jj) = directory[kk]; |
338 | |
339 | if (directory[kk-1] != '/') *(tab_res + (jj++)) = '/'; |
340 | } |
341 | |
342 | #ifdef VAC |
343 | for (ii=0; (kk)<l_tab && *((*zeptr).cFileName+ii); ii++,jj++,kk++) |
344 | *(tab_res + jj) = *((*zeptr).cFileName + ii); |
345 | #else |
346 | for (ii=0; (kk)<l_tab && *(zeptr.name+ii); ii++,jj++,kk++) |
347 | *(tab_res + jj) = *(zeptr.name + ii); |
348 | #endif |
349 | |
350 | /*======= En completant avec blanc ======*/ |
351 | |
352 | for (; kk<l_tab ; jj++,kk++) |
353 | *(tab_res + jj) = ' '; |
354 | nb_file++; |
355 | |
356 | #ifdef VAC |
357 | fini = FindNextFile(dirp, zeptr ); |
358 | #else |
359 | fini = _findnext(dirp, &zeptr ); |
360 | #endif |
361 | } |
362 | } |
363 | /***** pas de tri du tableau tab_res par ordre alpha *****/ |
364 | |
365 | #ifdef VAC |
366 | if (dirp != INVALID_HANDLE_VALUE) FindClose(dirp); |
367 | #else |
368 | if (dirp) _findclose(dirp); |
369 | #endif |
370 | |
371 | return(nb_file); |
372 | } |
373 | #endif |
374 | |