diff --git a/soltools/mkdepend/collectdircontent.cxx b/soltools/mkdepend/collectdircontent.cxx new file mode 100755 index 000000000000..50da374841cd --- /dev/null +++ b/soltools/mkdepend/collectdircontent.cxx @@ -0,0 +1,79 @@ +#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; + } + + int call_IncludesCollection_exists(IncludesCollection* m, const char * filePath) { + return m->exists(filePath); + } +}