0022749: Segfault in HashCode() of Standard_Transient
[occt.git] / src / Standard / Standard_osd_ffi.c
CommitLineData
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
66extern 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
101DIR *dirp;
102struct dirent *dp;
103
104void tri(int taille, char *list,int l_tab);
105int strcmp_joker(char *s1, char *s2);
106
107int
108osd_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
179int
180strcmp_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
225static int
226compar(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
243void
244tri(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>
263static struct _find_t zeptr ;
264
265#else
266
267#ifdef VAC
268static LPWIN32_FIND_DATA zeptr ;
269#else
270static struct _finddata_t zeptr ;
271#endif
272
273#endif
274#ifdef VAC
275HANDLE dirp;
276#else
277ptrdiff_t dirp;
278#endif
279
280char filespec[255];
281
282
283int
284osd_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