Branch data Line data Source code
1 : : //- Class: CubitDirIterator
2 : : //- Description: Class with functions to get files from a directory, etc.
3 : :
4 : : #include "CubitDirIterator.hpp"
5 : : #include "CubitString.hpp"
6 : :
7 : : #ifdef _WIN32
8 : : #include <sys/types.h>
9 : : #include <sys/stat.h>
10 : : #include <windows.h>
11 : : #else
12 : : #include <sys/types.h>
13 : : #include <sys/stat.h>
14 : : #include <dirent.h>
15 : : #include <cstdlib>
16 : : #include <sys/param.h>
17 : : #include <unistd.h>
18 : : #include <pwd.h>
19 : : #include <fnmatch.h>
20 : : #endif
21 : : #include <errno.h>
22 : : #include <string.h>
23 : :
24 : : struct CubitDirIterator::Helper
25 : : {
26 : 0 : Helper()
27 : : {
28 : : #ifdef _WIN32
29 : : mFileHandle = INVALID_HANDLE_VALUE;
30 : : #else
31 : 0 : mDirHandle = NULL;
32 : 0 : mFileHandle = NULL;
33 : : #endif
34 : 0 : }
35 : :
36 : : #ifdef _WIN32
37 : : WIN32_FIND_DATAW mDirHandle;
38 : : HANDLE mFileHandle;
39 : : #else
40 : : DIR* mDirHandle;
41 : : dirent* mFileHandle;
42 : : #endif
43 : : };
44 : :
45 : :
46 : 0 : CubitDirIterator::CubitDirIterator(const CubitString& path, const CubitString& pattern)
47 : : {
48 [ # # ][ # # ]: 0 : this->mHelper = new Helper;
49 [ # # ]: 0 : open(path, pattern);
50 : 0 : }
51 : :
52 : 0 : CubitDirIterator::~CubitDirIterator()
53 : : {
54 [ # # ]: 0 : cleanup();
55 : 0 : delete this->mHelper;
56 [ # # ]: 0 : }
57 : :
58 : 0 : void CubitDirIterator::open(const CubitString& path, const CubitString& pattern)
59 : : {
60 : 0 : cleanup();
61 : :
62 [ # # ]: 0 : if(pattern.length())
63 : 0 : mPattern = pattern;
64 : : else
65 [ # # ]: 0 : mPattern = "";
66 : :
67 : 0 : this->atEnd = false;
68 : : #ifdef _WIN32
69 : : CubitString p = path;
70 : : if (p.get_at(p.length()-1) != '\\')
71 : : p += "\\";
72 : : p += mPattern.length() == 0 ? "*" : mPattern;
73 : : this->mHelper->mFileHandle = FindFirstFileW(CubitString::toUtf16(p).c_str(), &this->mHelper->mDirHandle);
74 : : if(this->mHelper->mFileHandle == INVALID_HANDLE_VALUE)
75 : : this->atEnd = true;
76 : : #else
77 : 0 : this->mHelper->mDirHandle = opendir(path.c_str());
78 [ # # ]: 0 : if(this->mHelper->mDirHandle)
79 : : {
80 [ # # ]: 0 : do
81 : : {
82 : 0 : this->mHelper->mFileHandle = readdir(this->mHelper->mDirHandle);
83 [ # # # # ]: 0 : } while (this->mHelper->mFileHandle &&
84 [ # # ]: 0 : (mPattern.length() != 0 &&
85 : 0 : fnmatch(mPattern.c_str(), this->mHelper->mFileHandle->d_name, 0))
86 : : );
87 : : }
88 [ # # ][ # # ]: 0 : if(!this->mHelper->mDirHandle || !this->mHelper->mFileHandle)
89 : 0 : this->atEnd = true;
90 : : #endif
91 : 0 : }
92 : :
93 : 0 : void CubitDirIterator::cleanup()
94 : : {
95 : : #ifdef _WIN32
96 : : if(this->mHelper->mFileHandle != 0)
97 : : FindClose(this->mHelper->mFileHandle);
98 : : this->mHelper->mFileHandle = 0;
99 : : #else
100 [ # # ]: 0 : if(this->mHelper->mDirHandle)
101 : 0 : closedir(this->mHelper->mDirHandle);
102 : 0 : this->mHelper->mFileHandle = 0;
103 : 0 : this->mHelper->mDirHandle = 0;
104 : : #endif
105 : 0 : }
106 : :
107 : 0 : bool CubitDirIterator::has_next()
108 : : {
109 : 0 : return !this->atEnd;
110 : : }
111 : :
112 : 0 : CubitString CubitDirIterator::next()
113 : : {
114 : 0 : CubitString file;
115 [ # # ]: 0 : if(this->atEnd)
116 : 0 : return file;
117 : :
118 : : #ifdef _WIN32
119 : : file = CubitString::toUtf8(this->mHelper->mDirHandle.cFileName);
120 : : BOOL result = FindNextFileW(this->mHelper->mFileHandle, &this->mHelper->mDirHandle);
121 : : if(result == 0)
122 : : this->atEnd = true;
123 : : #else
124 [ # # ][ # # ]: 0 : file = this->mHelper->mFileHandle->d_name;
[ # # ]
125 [ # # ]: 0 : do
126 : : {
127 [ # # ]: 0 : this->mHelper->mFileHandle = readdir(this->mHelper->mDirHandle);
128 [ # # ][ # # ]: 0 : } while (this->mHelper->mFileHandle &&
129 [ # # ][ # # ]: 0 : (mPattern.length() != 0 &&
130 [ # # ][ # # ]: 0 : fnmatch(mPattern.c_str(), this->mHelper->mFileHandle->d_name, 0))
131 : : );
132 [ # # ]: 0 : if(this->mHelper->mFileHandle == 0)
133 : 0 : this->atEnd = true;
134 : : #endif
135 : 0 : return file;
136 : : }
137 : :
|