summaryrefslogtreecommitdiff
path: root/soltools/mkdepend/collectdircontent.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'soltools/mkdepend/collectdircontent.cxx')
-rwxr-xr-xsoltools/mkdepend/collectdircontent.cxx83
1 files changed, 83 insertions, 0 deletions
diff --git a/soltools/mkdepend/collectdircontent.cxx b/soltools/mkdepend/collectdircontent.cxx
new file mode 100755
index 000000000000..c9308faf0562
--- /dev/null
+++ b/soltools/mkdepend/collectdircontent.cxx
@@ -0,0 +1,83 @@
+#include "collectdircontent.hxx"
+
+PathFilePair IncludesCollection::split_path(const string& filePath) {
+ string sepU = "/";
+ string sepW = "\\";
+ string::size_type pos = filePath.rfind (sepU);
+ string::size_type posW = filePath.rfind (sepW);
+ if ((posW != string::npos) && ((posW > pos) || (pos == string::npos))) pos = posW;
+ if (pos != string::npos) {
+ string dirName = filePath.substr(0, pos);
+ return PathFilePair(dirName, filePath.substr(pos + 1, filePath.length()));
+ } else
+ return PathFilePair(".", filePath);
+};
+
+void IncludesCollection::add_to_collection(const string& dirPath) {
+ DirContent dirContent;
+#if defined( WNT )
+ WIN32_FIND_DATA FindFileData;
+ HANDLE hFind;
+ hFind = FindFirstFile((dirPath + "\\*").c_str(), &FindFileData);
+ if (hFind == INVALID_HANDLE_VALUE) {
+ // Invalid File Handle - no need to try it anymore
+ allIncludes.insert(EntriesPair(dirPath, DirContent()));
+ return;
+ };
+ do {
+ string winFileName(FindFileData.cFileName);
+ transform(winFileName.begin(), winFileName.end(), winFileName.begin(), ::tolower);
+ dirContent.insert(winFileName);
+ } while (FindNextFile(hFind, &FindFileData));
+#else
+ DIR *pdir;
+ dirent *pent;
+ pdir = opendir(dirPath.c_str()); //"." refers to the current dir
+ if (!pdir) {
+ // Invalid File Handle - no need to try it anymore
+ allIncludes.insert(EntriesPair(dirPath, DirContent()));
+ return;
+ }
+ while ((pent = readdir(pdir))) {
+ dirContent.insert(pent->d_name);
+ };
+#endif // defined( WNT )
+ allIncludes.insert(EntriesPair(dirPath, dirContent));
+};
+
+bool IncludesCollection::exists(string filePath) {
+#if defined( WNT )
+ transform(filePath.begin(), filePath.end(), filePath.begin(), ::tolower);
+#endif // defined( WNT )
+ PathFilePair dirFile = split_path(filePath);
+ string dirPath = dirFile.first;
+ string fileName = dirFile.second;
+ DirMap::iterator mapIter = allIncludes.find(dirPath);
+ if (mapIter == allIncludes.end()) {
+ add_to_collection(dirPath);
+ mapIter = allIncludes.find(dirPath);
+ };
+ DirContent dirContent = (*mapIter).second;
+ DirContent::iterator dirIter = dirContent.find(fileName);
+ if (dirIter == dirContent.end()) {
+ return false;
+ } else {
+ return true;
+ };
+ //return false;
+};
+
+extern "C" {
+
+ IncludesCollection * create_IncludesCollection() {
+ return new IncludesCollection;
+ }
+
+ void delete_IncludesCollection(IncludesCollection *m) {
+ delete m;
+ }
+
+ int call_IncludesCollection_exists(IncludesCollection* m, const char * filePath) {
+ return m->exists(filePath);
+ }
+}