Directory.cxx 3.65 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
29
30
// 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"
#endif

31
32
33
34
35
36
37
38
namespace KWSYS_NAMESPACE
{

//----------------------------------------------------------------------------
class DirectoryInternals
{
public:
  // Array of Files
39
  kwsys_stl::vector<kwsys_stl::string> Files;
40
41
  
  // Path to Open'ed directory
42
  kwsys_stl::string Path;
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
};

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

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

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

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

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

79
80
} // namespace KWSYS_NAMESPACE

81
82
// First microsoft compilers

83
#if defined(_MSC_VER) || defined(__WATCOMC__)
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#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)
{
99
100
101
102
103
#if _MSC_VER < 1300
  long srchHandle;
#else
  intptr_t srchHandle;
#endif
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
  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
119
  srchHandle = _findfirst(buf, &data);
120
121
122
123
124
125
126
127
128
129
  delete [] buf;
  
  if ( srchHandle == -1 )
    {
    return 0;
    }
  
  // Loop through names
  do 
    {
130
    this->Internal->Files.push_back(data.name);
131
132
    } 
  while ( _findnext(srchHandle, &data) != -1 );
133
  this->Internal->Path = name;
134
135
136
137
138
139
140
141
142
143
144
  return _findclose(srchHandle) != -1;
}

} // namespace KWSYS_NAMESPACE

#else

// Now the POSIX style directory access

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

146
147
148
149
150
151
152
153
154
155
156
157
158
159
namespace KWSYS_NAMESPACE
{

bool Directory::Load(const char* name)
{
  DIR* dir = opendir(name);

  if (!dir)
    {
    return 0;
    }

  for (dirent* d = readdir(dir); d; d = readdir(dir) )
    {
160
    this->Internal->Files.push_back(d->d_name);
161
    }
162
  this->Internal->Path = name;
163
164
165
  closedir(dir);
  return 1;
}
166

167
168
169
} // namespace KWSYS_NAMESPACE

#endif