0029252: Coding rules - eliminate GCC compiler warnings -Wformat-overflow
[occt.git] / src / OSD / OSD_DirectoryIterator.cxx
1 // Copyright (c) 1998-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15 #ifndef _WIN32
16
17
18 #include <OSD_Directory.hxx>
19 #include <OSD_DirectoryIterator.hxx>
20 #include <OSD_OSDError.hxx>
21 #include <OSD_Path.hxx>
22 #include <OSD_WhoAmI.hxx>
23 #include <TCollection_AsciiString.hxx>
24
25 #include <dirent.h>
26 #include <stdio.h>
27 #include <sys/stat.h>
28
29 OSD_DirectoryIterator::OSD_DirectoryIterator() 
30 : myFlag(false),
31   myDescr(0),
32   myEntry(0),
33   myInit(0)
34 {
35 }
36
37 OSD_DirectoryIterator::OSD_DirectoryIterator(const OSD_Path& where,
38                                              const TCollection_AsciiString& Mask)
39 : myFlag(false),
40   myDescr(0),
41   myEntry(0),
42   myInit(0)
43 {
44  Initialize(where, Mask) ;
45 }
46
47 // For Windows NT compatibility -----------
48 void OSD_DirectoryIterator :: Destroy () {}
49 //-----------------------------------------
50
51 void OSD_DirectoryIterator::Initialize(const OSD_Path& where,
52                                    const TCollection_AsciiString& Mask){
53
54  myFlag = Standard_False;
55  where.SystemName(myPlace);
56  if (myPlace.Length()==0) myPlace = ".";
57  myMask = Mask;
58  if (myDescr) {
59    closedir((DIR *)myDescr) ;
60    myDescr = NULL ;
61  }
62  myInit = 1 ;
63 }
64
65 // Is there another directory entry ?
66
67 Standard_Boolean OSD_DirectoryIterator::More(){
68  if (myInit) {
69    myInit = 0 ;
70    myDescr = (Standard_Address) opendir(myPlace.ToCString()); 
71    if (myDescr) {            // LD : Si repertoire inaccessible retourner False
72      myFlag = Standard_True;
73      myInit = 0 ;
74      Next();          // Now find first entry
75    }
76  }
77  return myFlag;
78 }
79
80 // Private :  See if directory name matches with a mask (like "*.c")
81 // LD : reecrit (original dans OSD_FileIterator.cxx)
82
83
84 static int strcmp_joker(const char *Mask,const char *Name)
85 {
86   const char *p, *s ;
87
88   for(p = Mask,s = Name ; *p && *p != '*' ; p++,s++)
89     if (*p != *s) return 0 ;
90   if (!*p) return !(*s) ;
91   while (*p == '*') p++ ;
92   if (!*p) return 1 ;
93   for (;*s; s++)
94     if (strcmp_joker(p,s)) return 1 ;
95   return 0 ;
96 }
97
98 // Find next directory entry in current directory
99
100 void OSD_DirectoryIterator::Next(){
101 int again = 1;
102 struct stat stat_buf;
103  myFlag = false;   // Initialize to nothing found
104
105  do{
106     myEntry = readdir((DIR *)myDescr);
107
108     if (!myEntry){   // No file found
109      myEntry = NULL;              // Keep pointer clean
110      myFlag = Standard_False;   // No more files/directory
111      closedir((DIR *)myDescr) ;       // so close directory
112      myDescr = NULL;
113      again = 0;
114     }
115     else {
116 //     if (!strcmp(entry->d_name,".")) continue;     LD : on prend ces 
117 //     if (!strcmp(entry->d_name,"..")) continue;         2 directories.
118
119      // Is it a directory ?
120      const TCollection_AsciiString aFullName = myPlace + "/" + ((struct dirent* )myEntry)->d_name;
121      stat(aFullName.ToCString(), &stat_buf);
122      if (S_ISDIR(stat_buf.st_mode))   // Ensure me it's not a file
123       if (strcmp_joker(myMask.ToCString(), ((struct dirent *)myEntry)->d_name)){
124                                                          // Does it follow mask ?
125        myFlag = Standard_True;
126        again = 0;
127      }
128     }
129
130  } while (again);
131
132 }
133
134
135 // Get Name of selected directory
136
137 OSD_Directory OSD_DirectoryIterator::Values(){
138 OSD_Path thisvalue;
139 TCollection_AsciiString Name;
140 TCollection_AsciiString Ext;
141 Standard_Integer position;
142
143  if (myEntry) Name = ((struct dirent *)myEntry)->d_name ;
144
145  position = Name.Search(".");
146
147  if (position != -1){
148   Ext = Name.Split(position - 1) ;   // Debug LD
149 //  Ext.Remove(1,position);
150 //  Name.Remove( position,Ext.Length()+1);
151  }
152
153  thisvalue.SetValues("", "", "", "", "", Name,Ext);
154  TheIterator.SetPath (thisvalue);
155
156  return (TheIterator);
157 }
158
159
160 void OSD_DirectoryIterator::Reset(){
161  myError.Reset();
162 }
163
164 Standard_Boolean OSD_DirectoryIterator::Failed()const{
165  return( myError.Failed());
166 }
167
168 void OSD_DirectoryIterator::Perror() {
169  myError.Perror();
170 }
171
172
173 Standard_Integer OSD_DirectoryIterator::Error()const{
174  return( myError.Error());
175 }
176
177 #else
178
179 //------------------------------------------------------------------------
180 //-------------------  Windows NT sources for OSD_DirectoryIterator ------
181 //------------------------------------------------------------------------
182
183
184 #include <windows.h>
185
186
187 #include <OSD_Directory.hxx>
188 #include <OSD_DirectoryIterator.hxx>
189 #include <OSD_OSDError.hxx>
190 #include <OSD_Path.hxx>
191 #include <TCollection_AsciiString.hxx>
192 #include <TCollection_ExtendedString.hxx>
193
194 #define _FD (  ( PWIN32_FIND_DATAW )myData  )
195
196 void _osd_wnt_set_error ( OSD_Error&, OSD_WhoAmI, ... );
197
198 OSD_DirectoryIterator :: OSD_DirectoryIterator (
199                           const OSD_Path&                where,
200                           const TCollection_AsciiString& Mask
201                          ) {
202
203  myFlag   = Standard_False;
204  myHandle = INVALID_HANDLE_VALUE;
205
206  where.SystemName ( myPlace );
207
208  if (  myPlace.Length () == 0  ) myPlace = ".";
209
210  myMask = Mask;
211  myData = NULL;
212
213 }  // end constructor
214
215 void OSD_DirectoryIterator :: Destroy () {
216
217  if ( myData != NULL ) HeapFree (  GetProcessHeap (), 0, myData  );
218
219  if (  myHandle != INVALID_HANDLE_VALUE  )
220
221   FindClose (  ( HANDLE )myHandle  );
222
223 }  // end  OSD_DirectoryIterator :: Destroy
224
225 Standard_Boolean OSD_DirectoryIterator :: More () {
226
227  if (  myHandle == INVALID_HANDLE_VALUE  ) {
228  
229   TCollection_AsciiString wc = myPlace + "/" + myMask;
230
231   myData = HeapAlloc (
232             GetProcessHeap (), HEAP_GENERATE_EXCEPTIONS, sizeof ( WIN32_FIND_DATAW )
233            );
234
235   // make wchar_t string from UTF-8
236   TCollection_ExtendedString wcW(wc);
237   myHandle = FindFirstFileExW (wcW.ToWideString(), FindExInfoStandard, (PWIN32_FIND_DATAW)myData, FindExSearchNameMatch, NULL, 0);
238
239   if ( myHandle == INVALID_HANDLE_VALUE )
240
241     _osd_wnt_set_error ( myError, OSD_WDirectoryIterator );
242   
243   else {
244   
245    myFlag      = Standard_True;
246    myFirstCall = Standard_True;
247
248    Next ();
249
250   }  // end else
251   
252  } else if ( !myFlag ) {
253  
254   FindClose (  ( HANDLE )myHandle  );
255   myHandle = INVALID_HANDLE_VALUE;
256  
257  }  // end if
258
259  return myFlag;
260
261 }  // end OSD_DirectoryIterator :: More
262
263 void OSD_DirectoryIterator :: Next () {
264
265  if ( ! myFirstCall || ! ( _FD -> dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) ) {
266  
267   do {
268   
269    if (   !FindNextFileW (  ( HANDLE )myHandle, _FD  )   ) {
270    
271     myFlag = Standard_False;
272
273     break;
274    
275    }  // end if
276   
277   } while (  !( _FD -> dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )  );
278  
279  }  // end if
280  
281  myFirstCall = Standard_False;
282
283 }  // end  OSD_DirectoryIterator :: Next
284
285 OSD_Directory OSD_DirectoryIterator :: Values () {
286
287  // make UTF-8 string
288  TCollection_AsciiString aFileName
289    (TCollection_ExtendedString( (Standard_ExtString) _FD -> cFileName) );
290  TheIterator.SetPath (   OSD_Path ( aFileName )   );
291
292  return TheIterator;
293
294 }  // end  OSD_DirectoryIterator :: Values
295
296 Standard_Boolean OSD_DirectoryIterator :: Failed () const {
297
298  return myError.Failed ();
299
300 }  // end OSD_DirectoryIterator :: Failed
301
302 void OSD_DirectoryIterator :: Reset () {
303
304  myError.Reset ();
305
306 }  // end OSD_DirectoryIterator :: Reset
307
308 void OSD_DirectoryIterator :: Perror () {
309
310  myError.Perror ();
311
312 }  // end OSD_DirectoryIterator :: Perror
313
314 Standard_Integer OSD_DirectoryIterator :: Error () const {
315
316  return myError.Error ();
317
318 }  // end OSD_DirectoryIterator :: Error
319
320 // For compatibility with UNIX version
321 OSD_DirectoryIterator::OSD_DirectoryIterator() {}
322
323 void OSD_DirectoryIterator::Initialize(
324                              const OSD_Path&,
325                              const TCollection_AsciiString&){}
326
327 #endif