diff --git a/src/cli/main.cpp b/src/cli/main.cpp index 2d9ca92..9779cae 100644 --- a/src/cli/main.cpp +++ b/src/cli/main.cpp @@ -343,7 +343,7 @@ int HLCmdLineApp::run ( const int argc, const char*argv[] ) CmdLineOptions options ( argc, argv ); // set data directory path, where /langDefs and /themes reside - string dataDirPath = ( options.getDataDir().empty() ) ? Platform::getAppPath() :options.getDataDir(); + string dataDirPath = options.getDataDir(); if ( options.printVersion() ) { printVersionInfo(options.quietMode()); diff --git a/src/core/datadir.cpp b/src/core/datadir.cpp index 558b66f..0841557 100644 --- a/src/core/datadir.cpp +++ b/src/core/datadir.cpp @@ -67,7 +67,13 @@ void DataDir::initSearchDirectories ( const string &userDefinedDir ) #endif #else +#ifndef __MINGW32__ possibleDirs.push_back(Platform::getAppPath()); //not needed because of fallback in searchFile +#else + possibleDirs.emplace_back(getSystemDataPath()); + const std::string prefix = Platform::getPrefixPath(); + possibleDirs.push_back(prefix + "etc\\highlight\\"); +#endif #endif } @@ -138,8 +144,10 @@ const string DataDir::getSystemDataPath ( ) #else return LSB_DATA_DIR; #endif -#else +#elif !defined(__MINGW32__) return Platform::getAppPath(); +#else + return Platform::getPrefixPath() + "share\\highlight\\"; #endif } @@ -155,7 +163,11 @@ const string DataDir::getExtDir() const string DataDir::getDocDir() { +#ifndef __MINGW32__ return getSystemDataPath(); +#else + return getSystemDataPath() + "share\\doc\\highlight\\"; +#endif } const string DataDir::getEncodingHint (const string &syntax) { diff --git a/src/core/platform_fs.cpp b/src/core/platform_fs.cpp index f2abf35..d66f800 100644 --- a/src/core/platform_fs.cpp +++ b/src/core/platform_fs.cpp @@ -61,6 +61,15 @@ std::string getAppPath() } #endif +std::string getPrefixPath() +{ + std::string prefix = getAppPath(); + prefix.pop_back(); + while (!prefix.empty() && (prefix.back() != '\\')) + prefix.pop_back(); + return prefix; +} + std::string getHomePath() { return ""; @@ -368,7 +377,12 @@ int wildcmp ( const char *wild, const char *data ) bool fileExists(const string &fName) { struct stat fileInfo; - return !stat(fName.c_str(),&fileInfo); + // MinGW’s stat() doesn’t work on paths with + // - trailing separator (https://sourceforge.net/p/mingw-w64/bugs/810/) + // - mix of forward (/) and back slashes (\\) + const string path = (fName.back() != pathSeparator) ? + fName : fName.substr(0, fName.size() - 1); + return stat(path.c_str(), &fileInfo) == 0; } //-D_FILE_OFFSET_BITS=64 @@ -376,7 +390,9 @@ bool fileExists(const string &fName) off_t fileSize(const string& fName) { struct stat fileInfo; - if(stat(fName.c_str(), &fileInfo) != 0) { + const string path = (fName.back() != pathSeparator) ? + fName : fName.substr(0, fName.size() - 1); + if (stat(path.c_str(), &fileInfo) != 0) { return 0; } return fileInfo.st_size; diff --git a/src/include/platform_fs.h b/src/include/platform_fs.h index 1ebc010..7120c03 100644 --- a/src/include/platform_fs.h +++ b/src/include/platform_fs.h @@ -29,6 +29,8 @@ extern const char pathSeparator; std::string getAppPath(); +std::string getPrefixPath(); + std::string getHomePath(); std::string getTempFilePath();