1*cdf0e10cSrcweir #include "collectdircontent.hxx" 2*cdf0e10cSrcweir 3*cdf0e10cSrcweir PathFilePair IncludesCollection::split_path(const string& filePath) { 4*cdf0e10cSrcweir string sepU = "/"; 5*cdf0e10cSrcweir string sepW = "\\"; 6*cdf0e10cSrcweir string::size_type pos = filePath.rfind (sepU); 7*cdf0e10cSrcweir string::size_type posW = filePath.rfind (sepW); 8*cdf0e10cSrcweir if ((posW != string::npos) && ((posW > pos) || (pos == string::npos))) pos = posW; 9*cdf0e10cSrcweir if (pos != string::npos) { 10*cdf0e10cSrcweir string dirName = filePath.substr(0, pos); 11*cdf0e10cSrcweir return PathFilePair(dirName, filePath.substr(pos + 1, filePath.length())); 12*cdf0e10cSrcweir } else 13*cdf0e10cSrcweir return PathFilePair(".", filePath); 14*cdf0e10cSrcweir }; 15*cdf0e10cSrcweir 16*cdf0e10cSrcweir void IncludesCollection::add_to_collection(const string& dirPath) { 17*cdf0e10cSrcweir DirContent dirContent; 18*cdf0e10cSrcweir #if defined( WNT ) 19*cdf0e10cSrcweir WIN32_FIND_DATA FindFileData; 20*cdf0e10cSrcweir HANDLE hFind; 21*cdf0e10cSrcweir hFind = FindFirstFile((dirPath + "\\*").c_str(), &FindFileData); 22*cdf0e10cSrcweir if (hFind == INVALID_HANDLE_VALUE) { 23*cdf0e10cSrcweir // Invalid File Handle - no need to try it anymore 24*cdf0e10cSrcweir allIncludes.insert(EntriesPair(dirPath, DirContent())); 25*cdf0e10cSrcweir return; 26*cdf0e10cSrcweir }; 27*cdf0e10cSrcweir do { 28*cdf0e10cSrcweir string winFileName(FindFileData.cFileName); 29*cdf0e10cSrcweir transform(winFileName.begin(), winFileName.end(), winFileName.begin(), ::tolower); 30*cdf0e10cSrcweir dirContent.insert(winFileName); 31*cdf0e10cSrcweir } while (FindNextFile(hFind, &FindFileData)); 32*cdf0e10cSrcweir #else 33*cdf0e10cSrcweir DIR *pdir; 34*cdf0e10cSrcweir dirent *pent; 35*cdf0e10cSrcweir pdir = opendir(dirPath.c_str()); //"." refers to the current dir 36*cdf0e10cSrcweir if (!pdir) { 37*cdf0e10cSrcweir // Invalid File Handle - no need to try it anymore 38*cdf0e10cSrcweir allIncludes.insert(EntriesPair(dirPath, DirContent())); 39*cdf0e10cSrcweir return; 40*cdf0e10cSrcweir } 41*cdf0e10cSrcweir while ((pent = readdir(pdir))) { 42*cdf0e10cSrcweir dirContent.insert(pent->d_name); 43*cdf0e10cSrcweir }; 44*cdf0e10cSrcweir #endif // defined( WNT ) 45*cdf0e10cSrcweir allIncludes.insert(EntriesPair(dirPath, dirContent)); 46*cdf0e10cSrcweir }; 47*cdf0e10cSrcweir 48*cdf0e10cSrcweir bool IncludesCollection::exists(string filePath) { 49*cdf0e10cSrcweir #if defined( WNT ) 50*cdf0e10cSrcweir transform(filePath.begin(), filePath.end(), filePath.begin(), ::tolower); 51*cdf0e10cSrcweir #endif // defined( WNT ) 52*cdf0e10cSrcweir PathFilePair dirFile = split_path(filePath); 53*cdf0e10cSrcweir string dirPath = dirFile.first; 54*cdf0e10cSrcweir string fileName = dirFile.second; 55*cdf0e10cSrcweir DirMap::iterator mapIter = allIncludes.find(dirPath); 56*cdf0e10cSrcweir if (mapIter == allIncludes.end()) { 57*cdf0e10cSrcweir add_to_collection(dirPath); 58*cdf0e10cSrcweir mapIter = allIncludes.find(dirPath); 59*cdf0e10cSrcweir }; 60*cdf0e10cSrcweir DirContent dirContent = (*mapIter).second; 61*cdf0e10cSrcweir DirContent::iterator dirIter = dirContent.find(fileName); 62*cdf0e10cSrcweir if (dirIter == dirContent.end()) { 63*cdf0e10cSrcweir return false; 64*cdf0e10cSrcweir } else { 65*cdf0e10cSrcweir return true; 66*cdf0e10cSrcweir }; 67*cdf0e10cSrcweir //return false; 68*cdf0e10cSrcweir }; 69*cdf0e10cSrcweir 70*cdf0e10cSrcweir extern "C" { 71*cdf0e10cSrcweir 72*cdf0e10cSrcweir IncludesCollection * create_IncludesCollection() { 73*cdf0e10cSrcweir return new IncludesCollection; 74*cdf0e10cSrcweir } 75*cdf0e10cSrcweir 76*cdf0e10cSrcweir void delete_IncludesCollection(IncludesCollection *m) { 77*cdf0e10cSrcweir delete m; 78*cdf0e10cSrcweir } 79*cdf0e10cSrcweir 80*cdf0e10cSrcweir int call_IncludesCollection_exists(IncludesCollection* m, const char * filePath) { 81*cdf0e10cSrcweir return m->exists(filePath); 82*cdf0e10cSrcweir } 83*cdf0e10cSrcweir } 84