Directory.cxx 3.48 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
58
59
};

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

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

//----------------------------------------------------------------------------
unsigned long Directory::GetNumberOfFiles()
{
Brad King's avatar
Brad King committed
60
  return static_cast<unsigned long>(this->Internal->Files.size());
61
62
63
64
65
66
67
68
69
70
71
72
73
74
}

//----------------------------------------------------------------------------
const char* Directory::GetFile(unsigned long dindex)
{
  if ( dindex >= this->Internal->Files.size() )
    {
    return 0;
    }
  return this->Internal->Files[dindex].c_str();
}

} // namespace KWSYS_NAMESPACE

75
76
// First microsoft compilers

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

} // namespace KWSYS_NAMESPACE

#else

// Now the POSIX style directory access

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

140
141
142
143
144
145
146
147
148
149
150
151
152
153
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) )
    {
154
    this->Internal->Files.push_back(d->d_name);
155
    }
156
  this->Internal->Path = name;
157
158
159
  closedir(dir);
  return 1;
}
160

161
162
163
} // namespace KWSYS_NAMESPACE

#endif