2 Copyright (c) 1998-1999 Matra Datavision
3 Copyright (c) 1999-2014 OPEN CASCADE SAS
5 This file is part of Open CASCADE Technology software library.
7 This library is free software; you can redistribute it and / or modify it
8 under the terms of the GNU Lesser General Public version 2.1 as published
9 by the Free Software Foundation, with special exception defined in the file
10 OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 distribution for complete text of the license and disclaimer of any warranty.
13 Alternatively, this file may be used under the terms of Open CASCADE
14 commercial license or contractual agreement.
17 /**********************************************************
25 /** Fichier : OSD_FFI.C (SUN/UNIX)
27 /** Titre : osd_ffi_(dir, name, tab_res, max, l_dir, l_name, l_tab)
29 /** char *dir, *nmae, *tab-res;
33 /** int l_dir, l_name, l_tab;
37 /** Nombre de fichier trouve (1 ou plus)
43 /** Role : Trouver tous les fichier qui ont le meme nom que 'name' sachant
45 /** que 'name' peut etre un nom de fichier comportant le caractere
55 /** integer nb_fichier, osd_ffi
57 /** character*80 dir, name
59 /** character*80 tab_res(100)
69 /** nb_fichier = osd_ffi(dir, name, tab_res, 100)
73 /** Modifs : - sga 28/04/92 correction bug closedir
75 /** - asi 11/04/90 correction de strcmp_joker
77 /** - fsa 26/04/90 ajout du tri du tableau tab_res
79 /** par ordre aphabethique
81 /** - asi 06/09/90 ajout de la directorie aux noms de fichier
85 /** - J.P. TIRAULT le 3-Avril-1992 : Faire le close du directory
87 /** apres l'avoir ouvert.
91 /*************************************************************/
92 #if defined(_MSC_VER) && !defined(WNT)
93 #error "Wrong compiler options has been detected. Add /DWNT option for proper compilation!!!!!"
102 /* This hack is required to get HP's c89 to include a definition for DIR */
104 # ifndef _INCLUDE_POSIX_SOURCE
105 # define _INCLUDE_POSIX_SOURCE
110 #include <sys/types.h>
111 #include <sys/stat.h>
117 # define NAMLEN(dirent) strlen((dirent)->d_name)
119 extern char *vmsify PARAMS ((char *name, int type));
122 # define dirent direct
123 # define NAMLEN(dirent) (dirent)->d_namlen
124 # ifdef HAVE_SYS_NDIR_H
125 # include <sys/ndir.h>
127 # ifdef HAVE_SYS_DIR_H
128 # include <sys/dir.h>
133 # ifdef HAVE_VMSDIR_H
135 # endif /* HAVE_VMSDIR_H */
138 /* In GNU systems, <dirent.h> defines this macro for us. */
141 # define NAMLEN(d) _D_NAMLEN(d)
144 #if (defined (POSIX) || defined (VMS) || defined (WINDOWS32)) && !defined (__GNU_LIBRARY__)
145 /* Posix does not require that the d_ino field be present, and some
146 systems do not provide it. */
147 # define REAL_DIR_ENTRY(dp) 1
148 # define FAKE_DIR_ENTRY(dp)
150 # define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
151 # define FAKE_DIR_ENTRY(dp) (dp->d_ino = 1)
157 void tri(int taille, char *list,int l_tab);
158 int strcmp_joker(char *s1, char *s2);
161 osd_ffi(char *dir, char *name, char *tab_res, int *max, int l_dir, int l_name, int l_tab)
163 char file[255], directory[255];
164 int ii, jj, kk, nb_file;
166 /***** Le Nom de la directory ******/
172 for (ii=0; ii<l_dir && ii<255 && *dir != ' '; ii++)
173 directory[ii] = *(dir++);
177 /***** Le Nom de fichier recherche *******/
178 for (ii=0; ii<l_name && ii<255 && *name != ' '; ii++)
179 file[ii] = *(name++);
182 /****** On ouvre le directory pour trouver les fichiers ********/
184 if ((dirp = opendir(directory)) != NULL){
185 while ((nb_file < *max) && (dp=readdir(dirp))) {
186 /*====== Si on trouve un fichier qui lui ressemble ==========*/
187 if(strcmp_joker(file,dp->d_name) == 0) {
188 /*======= On copie sa valeur ========*/
189 /* avec la directorie */
190 /* jj tab_res, kk la ligne ,ii le nom */
191 jj = nb_file * l_tab;
193 if (directory[0] != '.') {
194 for (; kk<l_tab && directory[kk] != 0; kk++,jj++)
195 *(tab_res + jj) = directory[kk];
196 if (directory[kk-1] != '/') *(tab_res + (jj++)) = '/';
198 for (ii=0; (kk)<l_tab && *(dp->d_name+ii); ii++,jj++,kk++)
199 *(tab_res + jj) = *(dp->d_name + ii);
200 /*======= En completant avec blanc ======*/
201 for (; kk<l_tab ; jj++,kk++)
202 *(tab_res + jj) = ' ';
207 /***** tri du tableau tab_res par ordre alpha *****/
210 tri( nb_file , tab_res ,l_tab );
215 /***********************************************
219 * Title: STRCMP_JOKER(ch1,ch2)
220 * Role : Compare ch1 with ch2
221 * ch1 can have the joker caracter '*'
222 * res = 0 they are identical
224 * Modif: asi 11/04/90 correction
225 ***********************************************/
233 strcmp_joker(char *s1, char *s2)
235 char *c1=NULL,*c2=NULL; /* sauvegardes */
237 int deb = 1; /* 0 si 1er car est le joker, 1 sinon */
242 while(*s1 == JOKER) s1++;
244 while(*s2 && *s2 != *s1) s2++;
247 else return(0); /* s1 fini par un jocker */
249 else { /* comparaison de 2 car */
252 /* 1ere chaine pas de joker au debut */
253 if (deb) return (res);
254 else { /* on recherche la meme chaine plus loin */
256 while(*s2 && *s2 != *s1) s2++;
262 while(*s1 == JOKER) s1++;
266 /**************************************************
270 * Titre : COMPAR (ch1,ch2)
271 * Role : Comparer ch1 avec ch2
272 * retourne : 0 si chaines identiques
273 * >0 si ch2 avant ch1
274 * <0 si ch1 avant ch2
276 **************************************************/
279 compar(char *ch1, char *ch2)
281 /* int strcmp(char *cha, const char *chb); */
283 return(strcmp(ch1,ch2));
286 /**************************************************
290 * Titre : TRI (taille,list,l_tab)
291 * Role : Tri un tableau de chaines par ordre
294 **************************************************/
297 tri(int taille, char *list,int l_tab)
299 qsort( list , taille , l_tab ,(int (*)(const void *,const void *)) compar );
311 #include <windows.h> // added for VAC++ version -ChG 07081997
316 static struct _find_t zeptr ;
321 static LPWIN32_FIND_DATA zeptr ;
323 static struct _finddata_t zeptr ;
337 osd_ffi_(char *dir, char *name, char *tab_res, int *max, int l_dir, int l_name, int l_tab)
339 char file[255], directory[255];
340 int ii, jj, kk, nb_file;
347 /***** Le Nom de la directory ******/
354 for (ii=0; ii<l_dir && ii<255 && *dir != ' '; ii++) {
355 directory[ii] = *(dir++);
356 if ( directory [ii] == '\\' ) directory [ii] = '/' ;
361 /***** Le Nom de fichier recherche *******/
362 for (ii=0; ii<l_name && ii<255 && *name != ' '; ii++)
363 file[ii] = *(name++);
366 /****** On ouvre le directory pour trouver les fichiers ********/
369 strcpy(filespec, directory );
370 strcat(filespec, file );
373 if ((dirp = FindFirstFile(filespec, zeptr)) != INVALID_HANDLE_VALUE ) {
375 if ((dirp = _findfirst(filespec, &zeptr)) != -1 ) {
378 while (nb_file < *max && (! fini ) ) {
380 /*====== Si on trouve un fichier qui lui ressemble ==========*/
383 /*======= On copie sa valeur ========*/
384 /* avec la directorie */
385 /* jj tab_res, kk la ligne ,ii le nom */
386 jj = nb_file * l_tab;
388 if (directory[0] != '.') {
389 for (; kk<l_tab && directory[kk] != 0; kk++,jj++)
390 *(tab_res + jj) = directory[kk];
392 if (directory[kk-1] != '/') *(tab_res + (jj++)) = '/';
396 for (ii=0; (kk)<l_tab && *((*zeptr).cFileName+ii); ii++,jj++,kk++)
397 *(tab_res + jj) = *((*zeptr).cFileName + ii);
399 for (ii=0; (kk)<l_tab && *(zeptr.name+ii); ii++,jj++,kk++)
400 *(tab_res + jj) = *(zeptr.name + ii);
403 /*======= En completant avec blanc ======*/
405 for (; kk<l_tab ; jj++,kk++)
406 *(tab_res + jj) = ' ';
410 fini = FindNextFile(dirp, zeptr );
412 fini = _findnext(dirp, &zeptr );
416 /***** pas de tri du tableau tab_res par ordre alpha *****/
419 if (dirp != INVALID_HANDLE_VALUE) FindClose(dirp);
421 if (dirp) _findclose(dirp);