|  | #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); | 
|  | } | 
|  | } |