Directory.cxx 5.21 KB
Newer Older
1
2
3
4
5
/*=========================================================================

  Program:   KWSys - Kitware System Library
  Module:    Directory.cxx

Brad King's avatar
Brad King committed
6
7
  Copyright (c) Kitware, Inc., Insight Consortium.  All rights reserved.
  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
8

Brad King's avatar
Brad King committed
9
10
     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11
12
13
     PURPOSE.  See the above copyright notices for more information.

=========================================================================*/
14
15
#include "kwsysPrivate.h"
#include KWSYS_HEADER(Directory.hxx)
16

17
#include KWSYS_HEADER(Configure.hxx)
Brad King's avatar
Brad King committed
18

19
20
#include KWSYS_HEADER(stl/string)
#include KWSYS_HEADER(stl/vector)
21

22
23
24
25
26
27
28
// Work-around CMake dependency scanning limitation.  This must
// duplicate the above list of headers.
#if 0
# include "Directory.hxx.in"
# include "Configure.hxx.in"
# include "kwsys_stl.hxx.in"
# include "kwsys_stl_string.hxx.in"
29
# include "kwsys_stl_vector.hxx.in"
30
31
#endif

32
33
34
35
36
37
38
39
namespace KWSYS_NAMESPACE
{

//----------------------------------------------------------------------------
class DirectoryInternals
{
public:
  // Array of Files
40
  kwsys_stl::vector<kwsys_stl::string> Files;
Mathieu Malaterre's avatar
Mathieu Malaterre committed
41

42
  // Path to Open'ed directory
43
  kwsys_stl::string Path;
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
};

//----------------------------------------------------------------------------
Directory::Directory()
{
  this->Internal = new DirectoryInternals;
}

//----------------------------------------------------------------------------
Directory::~Directory()
{
  delete this->Internal;
}

//----------------------------------------------------------------------------
59
unsigned long Directory::GetNumberOfFiles() const
60
{
Brad King's avatar
Brad King committed
61
  return static_cast<unsigned long>(this->Internal->Files.size());
62
63
64
}

//----------------------------------------------------------------------------
65
const char* Directory::GetFile(unsigned long dindex) const
66
67
68
69
70
71
72
73
{
  if ( dindex >= this->Internal->Files.size() )
    {
    return 0;
    }
  return this->Internal->Files[dindex].c_str();
}

74
75
76
77
78
79
//----------------------------------------------------------------------------
const char* Directory::GetPath() const
{
  return this->Internal->Path.c_str();
}

80
81
82
//----------------------------------------------------------------------------
void Directory::Clear()
{
83
  this->Internal->Path.resize(0);
84
85
86
  this->Internal->Files.clear();
}

87
88
} // namespace KWSYS_NAMESPACE

89
90
// First microsoft compilers

91
#if defined(_MSC_VER) || defined(__WATCOMC__)
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <windows.h>
#include <io.h>
#include <ctype.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>

namespace KWSYS_NAMESPACE
{

bool Directory::Load(const char* name)
{
107
  this->Clear();
108
109
110
111
112
#if _MSC_VER < 1300
  long srchHandle;
#else
  intptr_t srchHandle;
#endif
113
114
  char* buf;
  size_t n = strlen(name);
Mathieu Malaterre's avatar
Mathieu Malaterre committed
115
  if ( name[n - 1] == '/' )
116
117
118
    {
    buf = new char[n + 1 + 1];
    sprintf(buf, "%s*", name);
Mathieu Malaterre's avatar
Mathieu Malaterre committed
119
    }
120
121
122
123
124
125
  else
    {
    buf = new char[n + 2 + 1];
    sprintf(buf, "%s/*", name);
    }
  struct _finddata_t data;      // data of current file
Mathieu Malaterre's avatar
Mathieu Malaterre committed
126

127
  // Now put them into the file array
128
  srchHandle = _findfirst(buf, &data);
129
  delete [] buf;
Mathieu Malaterre's avatar
Mathieu Malaterre committed
130

131
132
133
134
  if ( srchHandle == -1 )
    {
    return 0;
    }
Mathieu Malaterre's avatar
Mathieu Malaterre committed
135

136
  // Loop through names
Mathieu Malaterre's avatar
Mathieu Malaterre committed
137
  do
138
    {
139
    this->Internal->Files.push_back(data.name);
Mathieu Malaterre's avatar
Mathieu Malaterre committed
140
    }
141
  while ( _findnext(srchHandle, &data) != -1 );
142
  this->Internal->Path = name;
143
144
145
  return _findclose(srchHandle) != -1;
}

146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
unsigned long Directory::GetNumberOfFilesInDirectory(const char* name)
{
#if _MSC_VER < 1300
  long srchHandle;
#else
  intptr_t srchHandle;
#endif
  char* buf;
  size_t n = strlen(name);
  if ( name[n - 1] == '/' )
    {
    buf = new char[n + 1 + 1];
    sprintf(buf, "%s*", name);
    }
  else
    {
    buf = new char[n + 2 + 1];
    sprintf(buf, "%s/*", name);
    }
  struct _finddata_t data;      // data of current file

  // Now put them into the file array
  srchHandle = _findfirst(buf, &data);
  delete [] buf;

  if ( srchHandle == -1 )
    {
    return 0;
    }

  // Loop through names
  unsigned long count = 0;
  do
    {
    count++;
    }
  while ( _findnext(srchHandle, &data) != -1 );
  _findclose(srchHandle);
  return count;
}

187
188
189
190
191
192
193
194
} // namespace KWSYS_NAMESPACE

#else

// Now the POSIX style directory access

#include <sys/types.h>
#include <dirent.h>
195

Alexander Neundorf's avatar
   
Alexander Neundorf committed
196
197
198
199
200
201
202
203
204
/* There is a problem with the Portland compiler, large file
support and glibc/Linux system headers: 
http://www.pgroup.com/userforum/viewtopic.php?
p=1992&sid=f16167f51964f1a68fe5041b8eb213b6
*/
#if defined(__PGI) && defined(__USE_FILE_OFFSET64)
# define dirent dirent64
#endif

205
206
207
208
209
namespace KWSYS_NAMESPACE
{

bool Directory::Load(const char* name)
{
210
  this->Clear();
211
212
213
214
215
   
  if (!name)
    {
    return 0;
    }
216
217
218
219
220
221
222
223
224
  DIR* dir = opendir(name);

  if (!dir)
    {
    return 0;
    }

  for (dirent* d = readdir(dir); d; d = readdir(dir) )
    {
225
    this->Internal->Files.push_back(d->d_name);
226
    }
227
  this->Internal->Path = name;
228
229
230
  closedir(dir);
  return 1;
}
231

232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
unsigned long Directory::GetNumberOfFilesInDirectory(const char* name)
{
  DIR* dir = opendir(name);

  if (!dir)
    {
    return 0;
    }

  unsigned long count = 0;
  for (dirent* d = readdir(dir); d; d = readdir(dir) )
    {
    count++;
    }
  closedir(dir);
  return count;
}

250
251
252
} // namespace KWSYS_NAMESPACE

#endif