diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 05:54:39 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 05:54:39 +0000 |
commit | 267c6f2ac71f92999e969232431ba04678e7437e (patch) | |
tree | 358c9467650e1d0a1d7227a21dac2e3d08b622b2 /soltools/mkdepend/collectdircontent.cxx | |
parent | Initial commit. (diff) | |
download | libreoffice-267c6f2ac71f92999e969232431ba04678e7437e.tar.xz libreoffice-267c6f2ac71f92999e969232431ba04678e7437e.zip |
Adding upstream version 4:24.2.0.upstream/4%24.2.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'soltools/mkdepend/collectdircontent.cxx')
-rw-r--r-- | soltools/mkdepend/collectdircontent.cxx | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/soltools/mkdepend/collectdircontent.cxx b/soltools/mkdepend/collectdircontent.cxx new file mode 100644 index 0000000000..2f64520b77 --- /dev/null +++ b/soltools/mkdepend/collectdircontent.cxx @@ -0,0 +1,92 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +#include "collectdircontent.hxx" +#include <rtl/character.hxx> + +PathFilePair IncludesCollection::split_path(const std::string& filePath) { + std::string sepU = "/"; + std::string sepW = "\\"; + std::string::size_type pos = filePath.rfind (sepU); + std::string::size_type posW = filePath.rfind (sepW); + if ((posW != std::string::npos) && ((posW > pos) || (pos == std::string::npos))) pos = posW; + if (pos != std::string::npos) { + std::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 std::string& dirPath) { + DirContent dirContent; +#if defined(_WIN32) + 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 { + std::string winFileName(FindFileData.cFileName); + transform( + winFileName.begin(), winFileName.end(), winFileName.begin(), + [](char c) { + return rtl::toAsciiLowerCase(static_cast<unsigned char>(c)); + }); + 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); + } + closedir(pdir); +#endif // defined( _WIN32 ) + allIncludes.insert(EntriesPair(dirPath, dirContent)); +} + +bool IncludesCollection::exists(std::string filePath) { +#if defined(_WIN32) + transform( + filePath.begin(), filePath.end(), filePath.begin(), + [](char c) { + return rtl::toAsciiLowerCase(static_cast<unsigned char>(c)); + }); +#endif // defined( _WIN32 ) + PathFilePair dirFile = split_path(filePath); + std::string dirPath = dirFile.first; + std::string fileName = dirFile.second; + DirMap::iterator mapIter = allIncludes.find(dirPath); + if (mapIter == allIncludes.end()) { + add_to_collection(dirPath); + mapIter = allIncludes.find(dirPath); + } + assert(mapIter != allIncludes.end()); + DirContent dirContent = (*mapIter).second; + DirContent::iterator dirIter = dirContent.find(fileName); + return dirIter != dirContent.end(); +} + +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); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |