summaryrefslogtreecommitdiffstats
path: root/soltools/mkdepend/collectdircontent.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'soltools/mkdepend/collectdircontent.cxx')
-rw-r--r--soltools/mkdepend/collectdircontent.cxx93
1 files changed, 93 insertions, 0 deletions
diff --git a/soltools/mkdepend/collectdircontent.cxx b/soltools/mkdepend/collectdircontent.cxx
new file mode 100644
index 000000000..7ea5fa272
--- /dev/null
+++ b/soltools/mkdepend/collectdircontent.cxx
@@ -0,0 +1,93 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+#include "collectdircontent.hxx"
+#include <rtl/character.hxx>
+
+using namespace std;
+
+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(_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 {
+ 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(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);
+ 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);
+ 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: */