View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0001340 | OpenMPT | libopenmpt | public | 2020-06-12 07:59 | 2022-07-03 14:25 |
Reporter | manx | Assigned To | manx | ||
Priority | normal | Severity | minor | Reproducibility | have not tried |
Status | new | Resolution | open | ||
Product Version | OpenMPT 1.30.01.00 / libopenmpt 0.6.0 (upgrade first) | ||||
Target Version | OpenMPT 1.?? (libopenmpt 1.0) (goals) | ||||
Summary | 0001340: Require C++17 std::filesystem | ||||
Description | This will remove support for | ||||
Tags | No tags attached. | ||||
Has the bug occurred in previous versions? | |||||
Tested code revision (in case you know it) | |||||
Support for Clang 5, Clang 6, and GCC 7 has already been removed due to missing |
|
path-v5.patch (38,345 bytes)
Index: common/FileReader.cpp =================================================================== --- common/FileReader.cpp (revision 13999) +++ common/FileReader.cpp (working copy) @@ -45,7 +45,7 @@ #ifdef MPT_ONDISKFILEWRAPPER_NO_CREATEFILE - mpt::ofstream f(tempName, std::ios::binary); + std::ofstream f(tempName, std::ios::binary); if(!f) { throw std::runtime_error("Error creating temporary file."); Index: common/Logging.cpp =================================================================== --- common/Logging.cpp (revision 13999) +++ common/Logging.cpp (working copy) @@ -125,7 +125,7 @@ #endif if(mpt::log::FileEnabled) { - static std::optional<mpt::ofstream> s_logfile; + static std::optional<std::ofstream> s_logfile; if(!s_logfile) { s_logfile.emplace(P_("mptrack.log"), std::ios::app); @@ -315,7 +315,7 @@ // sort according to index in case of overflows std::stable_sort(Entries.begin(), Entries.end()); - mpt::ofstream f(filename); + std::ofstream f(filename); f << "Build: OpenMPT " << mpt::ToCharset(mpt::CharsetLogfile, Build::GetVersionStringExtended()) << std::endl; Index: common/mptFileIO.cpp =================================================================== --- common/mptFileIO.cpp (revision 13999) +++ common/mptFileIO.cpp (working copy) @@ -34,18 +34,6 @@ -#if !defined(MPT_BUILD_SILENCE_LIBOPENMPT_CONFIGURATION_WARNINGS) - -#if defined(MPT_FSTREAM_NO_WCHAR) -#if MPT_GCC_BEFORE(9,1,0) -MPT_WARNING("Warning: MinGW with GCC earlier than 9.1 detected. Standard library does neither provide std::fstream wchar_t overloads nor std::filesystem with wchar_t support. Unicode filename support is thus unavailable.") -#endif // MPT_GCC_AT_LEAST(9,1,0) -#endif // MPT_FSTREAM_NO_WCHAR - -#endif // !MPT_BUILD_SILENCE_LIBOPENMPT_CONFIGURATION_WARNINGS - - - #ifdef MODPLUG_TRACKER #if MPT_OS_WINDOWS bool SetFilesystemCompression(HANDLE hFile) @@ -287,7 +275,7 @@ LazyFileRef & LazyFileRef::operator = (const std::vector<std::byte> &data) { - mpt::ofstream file(m_Filename, std::ios::binary); + std::ofstream file(m_Filename, std::ios::binary); file.exceptions(std::ios_base::failbit | std::ios_base::badbit); mpt::IO::WriteRaw(file, mpt::as_span(data)); mpt::IO::Flush(file); @@ -296,7 +284,7 @@ LazyFileRef & LazyFileRef::operator = (const std::vector<char> &data) { - mpt::ofstream file(m_Filename, std::ios::binary); + std::ofstream file(m_Filename, std::ios::binary); file.exceptions(std::ios_base::failbit | std::ios_base::badbit); mpt::IO::WriteRaw(file, mpt::as_span(data)); mpt::IO::Flush(file); @@ -305,7 +293,7 @@ LazyFileRef & LazyFileRef::operator = (const std::string &data) { - mpt::ofstream file(m_Filename, std::ios::binary); + std::ofstream file(m_Filename, std::ios::binary); file.exceptions(std::ios_base::failbit | std::ios_base::badbit); mpt::IO::WriteRaw(file, mpt::as_span(data)); mpt::IO::Flush(file); @@ -314,7 +302,7 @@ LazyFileRef::operator std::vector<std::byte> () const { - mpt::ifstream file(m_Filename, std::ios::binary); + std::ifstream file(m_Filename, std::ios::binary); if(!mpt::IO::IsValid(file)) { return std::vector<std::byte>(); @@ -329,7 +317,7 @@ LazyFileRef::operator std::vector<char> () const { - mpt::ifstream file(m_Filename, std::ios::binary); + std::ifstream file(m_Filename, std::ios::binary); if(!mpt::IO::IsValid(file)) { return std::vector<char>(); @@ -344,7 +332,7 @@ LazyFileRef::operator std::string () const { - mpt::ifstream file(m_Filename, std::ios::binary); + std::ifstream file(m_Filename, std::ios::binary); if(!mpt::IO::IsValid(file)) { return std::string(); Index: common/mptFileIO.h =================================================================== --- common/mptFileIO.h (revision 13999) +++ common/mptFileIO.h (working copy) @@ -17,11 +17,6 @@ #include "../common/mptPathString.h" #include "../common/mptIO.h" -#if defined(MPT_FSTREAM_NO_WCHAR) -#if MPT_GCC_AT_LEAST(9,1,0) -#include <filesystem> -#endif // MPT_GCC_AT_LEAST(9,1,0) -#endif // MPT_FSTREAM_NO_WCHAR #include <fstream> #include <ios> #include <ostream> @@ -63,117 +58,6 @@ namespace mpt { -namespace detail -{ - -template<typename Tbase> -inline void fstream_open(Tbase & base, const mpt::PathString & filename, std::ios_base::openmode mode) -{ - #if defined(MPT_FSTREAM_NO_WCHAR) - #if MPT_GCC_AT_LEAST(9,1,0) - base.open(static_cast<std::filesystem::path>(filename.AsNative()), mode); - #else // !MPT_GCC_AT_LEAST(9,1,0) - // Warning: MinGW with GCC earlier than 9.1 detected. Standard library does neither provide std::fstream wchar_t overloads nor std::filesystem with wchar_t support. Unicode filename support is thus unavailable. - base.open(mpt::ToCharset(mpt::Charset::Locale, filename.AsNative()).c_str(), mode); - #endif // MPT_GCC_AT_LEAST(9,1,0) - #else // !MPT_FSTREAM_NO_WCHAR - base.open(filename.AsNativePrefixed().c_str(), mode); - #endif // MPT_FSTREAM_NO_WCHAR -} - -} // namespace detail - -class SafeOutputFile; - -// We cannot rely on implicit conversion of mpt::PathString to std::filesystem::path when constructing std::fstream -// because of broken overload implementation in GCC libstdc++ 8, 9, 10. -// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95642 -// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90704 - -class fstream - : public std::fstream -{ -private: - typedef std::fstream Tbase; -public: - friend SafeOutputFile; -public: - fstream() {} - fstream(const mpt::PathString & filename, std::ios_base::openmode mode = std::ios_base::in | std::ios_base::out) - { - detail::fstream_open<Tbase>(*this, filename, mode); - } - void open(const mpt::PathString & filename, std::ios_base::openmode mode = std::ios_base::in | std::ios_base::out) - { - detail::fstream_open<Tbase>(*this, filename, mode); - } - void open(const char * filename, std::ios_base::openmode mode = std::ios_base::in | std::ios_base::out) = delete; - void open(const std::string & filename, std::ios_base::openmode mode = std::ios_base::in | std::ios_base::out) = delete; -#if MPT_OS_WINDOWS - void open(const wchar_t * filename, std::ios_base::openmode mode = std::ios_base::in | std::ios_base::out) = delete; - void open(const std::wstring & filename, std::ios_base::openmode mode = std::ios_base::in | std::ios_base::out) = delete; -#endif -}; - -class ifstream - : public std::ifstream -{ -private: - typedef std::ifstream Tbase; -public: - friend SafeOutputFile; -public: - ifstream() {} - ifstream(const mpt::PathString & filename, std::ios_base::openmode mode = std::ios_base::in) - { - detail::fstream_open<Tbase>(*this, filename, mode); - } - void open(const mpt::PathString & filename, std::ios_base::openmode mode = std::ios_base::in) - { - detail::fstream_open<Tbase>(*this, filename, mode); - } - void open(const char * filename, std::ios_base::openmode mode = std::ios_base::in) = delete; - void open(const std::string & filename, std::ios_base::openmode mode = std::ios_base::in) = delete; -#if MPT_OS_WINDOWS - void open(const wchar_t * filename, std::ios_base::openmode mode = std::ios_base::in) = delete; - void open(const std::wstring & filename, std::ios_base::openmode mode = std::ios_base::in) = delete; -#endif -}; - -class ofstream - : public std::ofstream -{ -private: - typedef std::ofstream Tbase; -public: - friend SafeOutputFile; -public: - ofstream() {} - ofstream(const mpt::PathString & filename, std::ios_base::openmode mode = std::ios_base::out) - { - detail::fstream_open<Tbase>(*this, filename, mode); - } -#if MPT_COMPILER_MSVC -protected: - ofstream(FILE * file) - : std::ofstream(file) - { - } - -#endif // MPT_COMPILER_MSVC -public: - void open(const mpt::PathString & filename, std::ios_base::openmode mode = std::ios_base::out) - { - detail::fstream_open<Tbase>(*this, filename, mode); - } - void open(const char * filename, std::ios_base::openmode mode = std::ios_base::out) = delete; - void open(const std::string & filename, std::ios_base::openmode mode = std::ios_base::out) = delete; -#if MPT_OS_WINDOWS - void open(const wchar_t * filename, std::ios_base::openmode mode = std::ios_base::out) = delete; - void open(const std::wstring & filename, std::ios_base::openmode mode = std::ios_base::out) = delete; -#endif -}; - enum class FlushMode { None = 0, // no explicit flushes at all @@ -195,7 +79,7 @@ #if MPT_COMPILER_MSVC std::FILE *m_f = nullptr; #endif // MPT_COMPILER_MSVC - mpt::ofstream m_s; + std::ofstream m_s; #if MPT_COMPILER_MSVC static mpt::tstring convert_mode(std::ios_base::openmode mode, FlushMode flushMode); std::FILE * internal_fopen(const mpt::PathString &filename, std::ios_base::openmode mode, FlushMode flushMode); @@ -212,22 +96,22 @@ { if(!stream().is_open()) { - stream().setstate(mpt::ofstream::failbit); + stream().setstate(std::ofstream::failbit); } } - mpt::ofstream& stream() + std::ofstream& stream() { return m_s; } - operator mpt::ofstream& () + operator std::ofstream& () { return stream(); } - const mpt::ofstream& stream() const + const std::ofstream& stream() const { return m_s; } - operator const mpt::ofstream& () const + operator const std::ofstream& () const { return stream(); } @@ -279,7 +163,7 @@ { private: mpt::PathString m_Filename; - mpt::ifstream m_File; + std::ifstream m_File; bool m_IsValid; bool m_IsCached; std::vector<std::byte> m_Cache; Index: common/mptPathString.cpp =================================================================== --- common/mptPathString.cpp (revision 13999) +++ common/mptPathString.cpp (working copy) @@ -34,8 +34,17 @@ #endif #endif + OPENMPT_NAMESPACE_BEGIN + +#if !defined(MPT_BUILD_SILENCE_LIBOPENMPT_CONFIGURATION_WARNINGS) +#if MPT_GCC_BEFORE(9,1,0) && MPT_OS_WINDOWS && defined(UNICODE) && defined(MPT_FSTREAM_NO_WCHAR) +MPT_WARNING("Warning: MinGW with GCC earlier than 9.1 detected. Standard library does neither provide std::fstream wchar_t overloads nor std::filesystem with wchar_t support. Unicode filename support is thus unavailable.") +#endif +#endif // !MPT_BUILD_SILENCE_LIBOPENMPT_CONFIGURATION_WARNINGS + + #if MPT_OS_WINDOWS namespace mpt Index: common/mptPathString.h =================================================================== --- common/mptPathString.h (revision 13999) +++ common/mptPathString.h (working copy) @@ -12,6 +12,9 @@ #include "BuildSettings.h" +#if !MPT_GCC_BEFORE(9,1,0) +#include <filesystem> +#endif #include <vector> #include "FlagSet.h" @@ -28,6 +31,8 @@ namespace mpt { + + #if MPT_OS_WINDOWS typedef mpt::winstring RawPathString; #else // !MPT_OS_WINDOWS @@ -103,8 +108,62 @@ std::size_t Length() const { return path.size(); } +#if MPT_GCC_BEFORE(9,1,0) + // GCC before 9.1.0 has experimental std::filesystem, which requires linking an additional library. + // Avoid it. +#if MPT_OS_WINDOWS +#if defined(UNICODE) && !defined(MPT_FSTREAM_NO_WCHAR) + operator std::wstring() const + { + return ToWide(); + } +#else + operator std::string() const + { + return ToLocale(); + } +#endif +#else // !MPT_OS_WINDOWS + operator mpt::RawPathString() const + { + return AsNative(); + } +#endif // MPT_OS_WINDOWS + +#else // GCC >= 9.1.0 || other + + operator std::filesystem::path() const + { + return std::filesystem::path{path}; + } + + // work-around for GCC bug https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95642 / https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90704 + // include work-around also for other compilers. + mpt::PathString & make_preferred() + { + *this = mpt::PathString::FromFsPath(std::filesystem::path{path}.make_preferred()); + return *this; + } + mpt::PathString filename() const + { + return mpt::PathString::FromFsPath(std::filesystem::path{path}.filename()); + } + std::filesystem::path c_str() const + { + return std::filesystem::path{path}; + } + +#endif // GCC < 9.1.0 + +#if MPT_OS_WINDOWS + static PathString FromFsPath(const std::string &path) { return PathString(mpt::ToWin(mpt::Charset::Locale, path)); } + static PathString FromFsPath(const std::wstring &path) { return PathString(mpt::ToWin(path)); } +#else // !MPT_OS_WINDOWS + static PathString FromFsPath(const std::string &path) { return PathString(path); } +#endif // MPT_OS_WINDOWS + public: #if MPT_OS_WINDOWS Index: installer/signtool/signtool.cpp =================================================================== --- installer/signtool/signtool.cpp (revision 13999) +++ installer/signtool/signtool.cpp (working copy) @@ -100,7 +100,7 @@ mpt::crypto::keystore keystore(mpt::crypto::keystore::domain::user); mpt::crypto::asymmetric::rsassa_pss<>::managed_private_key key(keystore, keyname); mpt::SafeOutputFile sfo(mpt::PathString::FromUnicode(filename)); - mpt::ofstream & fo = sfo.stream(); + std::ofstream & fo = sfo.stream(); mpt::IO::WriteText(fo, mpt::ToCharset(mpt::Charset::UTF8, key.get_public_key_data().as_jwk())); fo.flush(); } else if(args[1] == U_("sign")) @@ -117,7 +117,7 @@ mpt::crypto::asymmetric::rsassa_pss<>::managed_private_key key(keystore, keyname); std::vector<std::byte> data; { - mpt::ifstream fi(mpt::PathString::FromUnicode(inputfilename)); + std::ifstream fi(mpt::PathString::FromUnicode(inputfilename)); fi.imbue(std::locale::classic()); fi.exceptions(std::ios::badbit); while(!mpt::IO::IsEof(fi)) @@ -133,7 +133,7 @@ { std::vector<std::byte> signature = key.sign(mpt::as_span(data)); mpt::SafeOutputFile sfo(mpt::PathString::FromUnicode(outputfilename)); - mpt::ofstream & fo = sfo.stream(); + std::ofstream & fo = sfo.stream(); mpt::IO::WriteRaw(fo, mpt::as_span(signature)); fo.flush(); } else if(mode == U_("jws_compact")) @@ -140,7 +140,7 @@ { mpt::ustring signature = key.jws_compact_sign(mpt::as_span(data)); mpt::SafeOutputFile sfo(mpt::PathString::FromUnicode(outputfilename)); - mpt::ofstream & fo = sfo.stream(); + std::ofstream & fo = sfo.stream(); mpt::IO::WriteText(fo, mpt::ToCharset(mpt::Charset::UTF8, signature)); fo.flush(); } else if(mode == U_("jws")) @@ -147,7 +147,7 @@ { mpt::ustring signature = key.jws_sign(mpt::as_span(data)); mpt::SafeOutputFile sfo(mpt::PathString::FromUnicode(outputfilename)); - mpt::ofstream & fo = sfo.stream(); + std::ofstream & fo = sfo.stream(); mpt::IO::WriteText(fo, mpt::ToCharset(mpt::Charset::UTF8, signature)); fo.flush(); } else Index: misc/mptWine.cpp =================================================================== --- misc/mptWine.cpp (revision 13999) +++ misc/mptWine.cpp (working copy) @@ -260,7 +260,7 @@ // write the script to disk mpt::PathString scriptFilenameWindows = dirWindows + P_("script.sh"); { - mpt::ofstream tempfile(scriptFilenameWindows, std::ios::binary); + std::ofstream tempfile(scriptFilenameWindows, std::ios::binary); tempfile << script; tempfile.flush(); if(!tempfile) @@ -280,7 +280,7 @@ // create a wrapper that will call the script and gather result. mpt::PathString wrapperstarterFilenameWindows = dirWindows + P_("wrapperstarter.sh"); { - mpt::ofstream tempfile(wrapperstarterFilenameWindows, std::ios::binary); + std::ofstream tempfile(wrapperstarterFilenameWindows, std::ios::binary); std::string wrapperstarterscript; wrapperstarterscript += std::string() + "#!/usr/bin/env sh" "\n"; wrapperstarterscript += std::string() + "exec /usr/bin/env sh " + dirPosixEscape + "wrapper.sh" "\n"; @@ -294,7 +294,7 @@ mpt::PathString wrapperFilenameWindows = dirWindows + P_("wrapper.sh"); std::string cleanupscript; { - mpt::ofstream tempfile(wrapperFilenameWindows, std::ios::binary); + std::ofstream tempfile(wrapperFilenameWindows, std::ios::binary); std::string wrapperscript; if(!flags[ExecFlagSilent]) { @@ -387,7 +387,7 @@ // create a wrapper that will find a suitable terminal and run the wrapper script in the terminal window. mpt::PathString terminalWrapperFilenameWindows = dirWindows + P_("terminal.sh"); { - mpt::ofstream tempfile(terminalWrapperFilenameWindows, std::ios::binary); + std::ofstream tempfile(terminalWrapperFilenameWindows, std::ios::binary); // NOTE: // Modern terminals detach themselves from the invoking shell if another instance is already present. // This means we cannot rely on terminal invocation being syncronous. @@ -589,7 +589,7 @@ int exitCode = 0; { - mpt::ifstream exitFile(dirWindows + P_("exit"), std::ios::binary); + std::ifstream exitFile(dirWindows + P_("exit"), std::ios::binary); if(!exitFile) { throw mpt::Wine::Exception("Script .exit file not found."); @@ -608,7 +608,7 @@ std::string outputString; if(!flags[ExecFlagInteractive]) { - mpt::ifstream outputFile(dirWindows + P_("out"), std::ios::binary); + std::ifstream outputFile(dirWindows + P_("out"), std::ios::binary); if(outputFile) { outputFile.seekg(0, std::ios::end); @@ -625,7 +625,7 @@ std::string errorString; if(flags[ExecFlagSplitOutput]) { - mpt::ifstream errorFile(dirWindows + P_("err"), std::ios::binary); + std::ifstream errorFile(dirWindows + P_("err"), std::ios::binary); if(errorFile) { errorFile.seekg(0, std::ios::end); Index: mptrack/AutoSaver.cpp =================================================================== --- mptrack/AutoSaver.cpp (revision 13999) +++ mptrack/AutoSaver.cpp (working copy) @@ -159,7 +159,7 @@ ScopedLogCapturer logcapturer(modDoc, _T(""), nullptr, false); bool success = false; - mpt::ofstream f(fileName, std::ios::binary); + std::ofstream f(fileName, std::ios::binary); if(f) { switch(modDoc.GetSoundFile().GetBestSaveFormat()) @@ -196,7 +196,7 @@ path = GetPath(); } - std::vector<mpt::RawPathString> foundfiles; + std::vector<mpt::winstring> foundfiles; mpt::PathString searchPattern = path + mpt::PathString::FromCString(modDoc.GetTitle()).SanitizeComponent() + P_(".AutoSave.*"); // Find all autosave files for this document, and delete the oldest ones if there are more than the user wants. @@ -209,7 +209,7 @@ { if(!(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { - foundfiles.push_back(findData.cFileName); + foundfiles.push_back(mpt::String::ReadWinBuf(findData.cFileName)); } } while(FindNextFile(hFindFile, &findData)); FindClose(hFindFile); Index: mptrack/CommandSet.cpp =================================================================== --- mptrack/CommandSet.cpp (revision 13999) +++ mptrack/CommandSet.cpp (working copy) @@ -1497,7 +1497,7 @@ */ mpt::SafeOutputFile sf(filename, std::ios::out, mpt::FlushModeFromBool(TrackerSettings::Instance().MiscFlushFileBuffersOnSave)); - mpt::ofstream& f = sf; + std::ofstream& f = sf; if(!f) { ErrorBox(IDS_CANT_OPEN_FILE_FOR_WRITING); @@ -1710,7 +1710,7 @@ bool CCommandSet::LoadFile(const mpt::PathString &filename) { - mpt::ifstream fin(filename); + std::ifstream fin(filename); if(fin.fail()) { Reporting::Warning(MPT_TFORMAT("Can't open key bindings file {} for reading. Default key bindings will be used.")(filename)); Index: mptrack/Ctrl_ins.cpp =================================================================== --- mptrack/Ctrl_ins.cpp (revision 13999) +++ mptrack/Ctrl_ins.cpp (working copy) @@ -2088,7 +2088,7 @@ { ScopedLogCapturer logcapturer(m_modDoc); mpt::SafeOutputFile sf(fileName, std::ios::binary, mpt::FlushModeFromBool(TrackerSettings::Instance().MiscFlushFileBuffersOnSave)); - mpt::ofstream &f = sf; + std::ofstream &f = sf; if(!f) { ok = false; Index: mptrack/Ctrl_smp.cpp =================================================================== --- mptrack/Ctrl_smp.cpp (revision 13999) +++ mptrack/Ctrl_smp.cpp (working copy) @@ -1500,7 +1500,7 @@ try { mpt::SafeOutputFile sf(fileName, std::ios::binary, mpt::FlushModeFromBool(TrackerSettings::Instance().MiscFlushFileBuffersOnSave)); - mpt::ofstream &f = sf; + std::ofstream &f = sf; if(!f) { ok = false; Index: mptrack/ExceptionHandler.cpp =================================================================== --- mptrack/ExceptionHandler.cpp (revision 13999) +++ mptrack/ExceptionHandler.cpp (working copy) @@ -314,7 +314,7 @@ { mpt::SafeOutputFile sf(crashDirectory.path + P_("error.txt"), std::ios::binary, mpt::FlushMode::Full); - mpt::ofstream& f = sf; + std::ofstream& f = sf; f.imbue(std::locale::classic()); f << mpt::String::Replace(mpt::ToCharset(mpt::Charset::UTF8, errorMessage), "\n", "\r\n"); } @@ -321,7 +321,7 @@ { mpt::SafeOutputFile sf(crashDirectory.path + P_("threads.txt"), std::ios::binary, mpt::FlushMode::Full); - mpt::ofstream& f = sf; + std::ofstream& f = sf; f.imbue(std::locale::classic()); f << MPT_FORMAT("current : {}")(mpt::fmt::hex0<8>(GetCurrentThreadId())) << "\r\n"; f << MPT_FORMAT("GUI : {}")(mpt::fmt::hex0<8>(mpt::log::Trace::GetThreadId(mpt::log::Trace::ThreadKindGUI))) << "\r\n"; @@ -338,7 +338,7 @@ { mpt::SafeOutputFile sf(crashDirectory.path + P_("active-settings.txt"), std::ios::binary, mpt::FlushMode::Full); - mpt::ofstream& f = sf; + std::ofstream& f = sf; f.imbue(std::locale::classic()); if(theApp.GetpSettings()) { @@ -403,7 +403,7 @@ { mpt::SafeOutputFile sf(crashDirectory.path + P_("about-openmpt.txt"), std::ios::binary, mpt::FlushMode::Full); - mpt::ofstream& f = sf; + std::ofstream& f = sf; f.imbue(std::locale::classic()); f << mpt::ToCharset(mpt::Charset::UTF8, CAboutDlg::GetTabText(0)); } @@ -410,7 +410,7 @@ { mpt::SafeOutputFile sf(crashDirectory.path + P_("about-components.txt"), std::ios::binary, mpt::FlushMode::Full); - mpt::ofstream& f = sf; + std::ofstream& f = sf; f.imbue(std::locale::classic()); f << mpt::ToCharset(mpt::Charset::UTF8, CAboutDlg::GetTabText(1)); } Index: mptrack/FileDialog.h =================================================================== --- mptrack/FileDialog.h (revision 13999) +++ mptrack/FileDialog.h (working copy) @@ -23,12 +23,12 @@ using PathList = std::vector<mpt::PathString>; protected: - mpt::RawPathString m_defaultExtension; - mpt::RawPathString m_defaultFilename; - mpt::RawPathString m_extFilter; - mpt::RawPathString m_lastPreviewFile; - mpt::RawPathString m_workingDirectory; - mpt::RawPathString m_extension; + mpt::winstring m_defaultExtension; + mpt::winstring m_defaultFilename; + mpt::winstring m_extFilter; + mpt::winstring m_lastPreviewFile; + mpt::winstring m_workingDirectory; + mpt::winstring m_extension; PathList m_filenames; PathList m_places; int *m_filterIndex = nullptr; Index: mptrack/GeneralConfigDlg.cpp =================================================================== --- mptrack/GeneralConfigDlg.cpp (revision 13999) +++ mptrack/GeneralConfigDlg.cpp (working copy) @@ -116,7 +116,7 @@ mpt::PathString file; while(scanner.Next(file)) { - mpt::RawPathString fileW = file.AsNative(); + mpt::winstring fileW = file.AsNative(); fileW = fileW.substr(basePath.Length()); ::SendMessage(m_defaultTemplate.m_hWnd, CB_ADDSTRING, 0, (LPARAM)fileW.c_str()); } @@ -203,7 +203,7 @@ dlg.WorkingDirectory(basePath); } else { - if(defaultFile.AsNative().find_first_of(_T("/\\")) == mpt::RawPathString::npos) + if(defaultFile.AsNative().find_first_of(_T("/\\")) == mpt::winstring::npos) { // Relative path defaultFile = basePath + defaultFile; Index: mptrack/mod2midi.cpp =================================================================== --- mptrack/mod2midi.cpp (revision 13999) +++ mptrack/mod2midi.cpp (working copy) @@ -368,11 +368,11 @@ SNDMIXPLUGIN tempoTrackPlugin; VSTPluginLib m_plugFactory; CSoundFile &m_sndFile; - mpt::ofstream &m_file; + std::ofstream &m_file; const bool m_wasInstrumentMode; public: - Conversion(CSoundFile &sndFile, const InstrMap &instrMap, mpt::ofstream &file, bool overlappingInstruments) + Conversion(CSoundFile &sndFile, const InstrMap &instrMap, std::ofstream &file, bool overlappingInstruments) : m_oldInstruments(sndFile.GetNumInstruments()) , m_plugFactory(nullptr, true, {}, {}, {}) , m_sndFile(sndFile) Index: mptrack/mod2midi.h =================================================================== --- mptrack/mod2midi.h (revision 13999) +++ mptrack/mod2midi.h (working copy) @@ -62,11 +62,11 @@ { public: CSoundFile &m_sndFile; - mpt::ofstream &m_file; + std::ofstream &m_file; const MidiExport::InstrMap &m_instrMap; public: - CDoMidiConvert(CSoundFile &sndFile, mpt::ofstream &f, const MidiExport::InstrMap &instrMap, CWnd *parent = nullptr) + CDoMidiConvert(CSoundFile &sndFile, std::ofstream &f, const MidiExport::InstrMap &instrMap, CWnd *parent = nullptr) : CProgressDialog(parent) , m_sndFile(sndFile) , m_file(f) Index: mptrack/Mod2wave.cpp =================================================================== --- mptrack/Mod2wave.cpp (revision 13999) +++ mptrack/Mod2wave.cpp (working copy) @@ -1018,7 +1018,7 @@ float normalizePeak = 0.0f; const mpt::PathString normalizeFileName = mpt::CreateTempFileName(P_("OpenMPT")); - std::optional<mpt::fstream> normalizeFile; + std::optional<std::fstream> normalizeFile; if(m_Settings.normalize) { // Ensure this temporary file is marked as temporary in the file system, to increase the chance it will never be written to disk Index: mptrack/mod2wave.h =================================================================== --- mptrack/mod2wave.h (revision 13999) +++ mptrack/mod2wave.h (working copy) @@ -119,13 +119,13 @@ public: const CWaveConvertSettings &m_Settings; CSoundFile &m_SndFile; - mpt::ofstream &fileStream; + std::ofstream &fileStream; const CString &caption; uint64 m_dwSongLimit; bool m_bGivePlugsIdleTime; public: - CDoWaveConvert(CSoundFile &sndFile, mpt::ofstream &f, const CString &caption, const CWaveConvertSettings &settings, CWnd *parent = NULL) + CDoWaveConvert(CSoundFile &sndFile, std::ofstream &f, const CString &caption, const CWaveConvertSettings &settings, CWnd *parent = NULL) : CProgressDialog(parent) , m_Settings(settings) , m_SndFile(sndFile) Index: mptrack/Moddoc.cpp =================================================================== --- mptrack/Moddoc.cpp (revision 13999) +++ mptrack/Moddoc.cpp (working copy) @@ -300,7 +300,7 @@ try { mpt::SafeOutputFile sf(filename, std::ios::binary, mpt::FlushModeFromBool(TrackerSettings::Instance().MiscFlushFileBuffersOnSave)); - mpt::ofstream &f = sf; + std::ofstream &f = sf; if(f) { f.exceptions(f.exceptions() | std::ios::badbit | std::ios::failbit); @@ -1764,7 +1764,7 @@ try { mpt::SafeOutputFile safeFileStream(thisName, std::ios::binary, mpt::FlushModeFromBool(TrackerSettings::Instance().MiscFlushFileBuffersOnSave)); - mpt::ofstream &f = safeFileStream; + std::ofstream &f = safeFileStream; f.exceptions(f.exceptions() | std::ios::badbit | std::ios::failbit); if(!f) @@ -1915,7 +1915,7 @@ try { mpt::SafeOutputFile sf(dlg.GetFirstFile(), std::ios::binary, mpt::FlushModeFromBool(TrackerSettings::Instance().MiscFlushFileBuffersOnSave)); - mpt::ofstream &f = sf; + std::ofstream &f = sf; f.exceptions(f.exceptions() | std::ios::badbit | std::ios::failbit); if(!f.good()) @@ -1994,7 +1994,7 @@ try { mpt::SafeOutputFile sf(filename, std::ios::binary, mpt::FlushModeFromBool(TrackerSettings::Instance().MiscFlushFileBuffersOnSave)); - mpt::ofstream &f = sf; + std::ofstream &f = sf; if(f) { f.exceptions(f.exceptions() | std::ios::badbit | std::ios::failbit); Index: mptrack/Modedit.cpp =================================================================== --- mptrack/Modedit.cpp (revision 13999) +++ mptrack/Modedit.cpp (working copy) @@ -1148,7 +1148,7 @@ try { mpt::SafeOutputFile sf(fileName, std::ios::binary, mpt::FlushModeFromBool(TrackerSettings::Instance().MiscFlushFileBuffersOnSave)); - mpt::ofstream &f = sf; + std::ofstream &f = sf; f.exceptions(f.exceptions() | std::ios::badbit | std::ios::failbit); if(f) ok = mpt::IO::WriteRaw(f, s.GetString(), s.GetLength()); Index: mptrack/MPTrackWine.cpp =================================================================== --- mptrack/MPTrackWine.cpp (revision 13999) +++ mptrack/MPTrackWine.cpp (working copy) @@ -699,7 +699,7 @@ { std::string fn = "libopenmpt_native_support.so"; - mpt::ofstream f(wine.PathToWindows(nativeSearchPath) + P_("\\") + mpt::PathString::FromUTF8(fn), std::ios::binary); + std::ofstream f(wine.PathToWindows(nativeSearchPath) + P_("\\") + mpt::PathString::FromUTF8(fn), std::ios::binary); f.write(&result.filetree[fn][0], result.filetree[fn].size()); f.flush(); if(!f) @@ -709,7 +709,7 @@ } { std::string fn = "openmpt_wine_wrapper.dll"; - mpt::ofstream f(paths.AppData_Wine_WineVersion_OpenMPTVersion + P_("\\") + mpt::PathString::FromUTF8(fn), std::ios::binary); + std::ofstream f(paths.AppData_Wine_WineVersion_OpenMPTVersion + P_("\\") + mpt::PathString::FromUTF8(fn), std::ios::binary); f.write(&result.filetree[fn][0], result.filetree[fn].size()); f.flush(); if(!f) @@ -719,7 +719,7 @@ } { std::string fn = "success.txt"; - mpt::ofstream f(paths.AppData_Wine_WineVersion_OpenMPTVersion + P_("\\") + mpt::PathString::FromUTF8(fn), std::ios::binary); + std::ofstream f(paths.AppData_Wine_WineVersion_OpenMPTVersion + P_("\\") + mpt::PathString::FromUTF8(fn), std::ios::binary); f.imbue(std::locale::classic()); f << std::string("1"); f.flush(); Index: mptrack/Settings.cpp =================================================================== --- mptrack/Settings.cpp (revision 13999) +++ mptrack/Settings.cpp (working copy) @@ -412,7 +412,7 @@ static std::vector<char> ReadFile(const mpt::PathString &filename) { - mpt::ifstream s(filename, std::ios::binary); + std::ifstream s(filename, std::ios::binary); std::vector<char> result; while(s) { @@ -428,7 +428,7 @@ { static_assert(sizeof(wchar_t) == 2); mpt::SafeOutputFile sinifile(filename, std::ios::binary, mpt::FlushMode::Full); - mpt::ofstream& inifile = sinifile; + std::ofstream& inifile = sinifile; const uint8 UTF16LE_BOM[] = { 0xff, 0xfe }; inifile.write(reinterpret_cast<const char*>(UTF16LE_BOM), 2); inifile.write(reinterpret_cast<const char*>(str.c_str()), str.length() * sizeof(std::wstring::value_type)); Index: mptrack/TrackerSettings.cpp =================================================================== --- mptrack/TrackerSettings.cpp (revision 13999) +++ mptrack/TrackerSettings.cpp (working copy) @@ -837,7 +837,7 @@ std::unique_ptr<CTuningCollection> TrackerSettings::LoadLocalTunings() { std::unique_ptr<CTuningCollection> s_pTuningsSharedLocal = std::make_unique<CTuningCollection>(); - mpt::ifstream f( + std::ifstream f( PathTunings.GetDefaultDir() + P_("local_tunings") + mpt::PathString::FromUTF8(CTuningCollection::s_FileExtension) Index: mptrack/TuningDialog.cpp =================================================================== --- mptrack/TuningDialog.cpp (revision 13999) +++ mptrack/TuningDialog.cpp (working copy) @@ -616,7 +616,7 @@ try { mpt::SafeOutputFile sfout(dlg.GetFirstFile(), std::ios::binary, mpt::FlushModeFromBool(TrackerSettings::Instance().MiscFlushFileBuffersOnSave)); - mpt::ofstream &fout = sfout; + std::ofstream &fout = sfout; fout.exceptions(fout.exceptions() | std::ios::badbit | std::ios::failbit); if(tuningFilter != -1 && filterIndex == tuningFilter) @@ -696,7 +696,7 @@ try { mpt::SafeOutputFile sfout(fileName, std::ios::binary, mpt::FlushModeFromBool(TrackerSettings::Instance().MiscFlushFileBuffersOnSave)); - mpt::ofstream &fout = sfout; + std::ofstream &fout = sfout; fout.exceptions(fout.exceptions() | std::ios::badbit | std::ios::failbit); if(tuning.Serialize(fout) != Tuning::SerializationResult::Success) { @@ -789,7 +789,7 @@ const bool bIsScl = (mpt::PathString::CompareNoCase(fileExt, P_(".scl")) == 0); const bool bIsTc = (mpt::PathString::CompareNoCase(fileExt, mpt::PathString::FromUTF8(CTuningCollection::s_FileExtension)) == 0); - mpt::ifstream fin(file, std::ios::binary); + std::ifstream fin(file, std::ios::binary); // "HSCT", 0x01, 0x00, 0x00, 0x00 const uint8 magicTColdV1 [] = { 'H', 'S', 'C', 'T',0x01,0x00,0x00,0x00 }; @@ -1554,7 +1554,7 @@ { MPT_ASSERT(result == nullptr); result = nullptr; - mpt::ifstream iStrm(filename, std::ios::in | std::ios::binary); + std::ifstream iStrm(filename, std::ios::in | std::ios::binary); if(!iStrm) { return enSclImportFailUnableToOpenFile; Index: mptrack/UpdateCheck.cpp =================================================================== --- mptrack/UpdateCheck.cpp (revision 13999) +++ mptrack/UpdateCheck.cpp (working copy) @@ -1314,7 +1314,7 @@ std::array<std::byte, 512/8> expected; std::copy(binhash.begin(), binhash.end(), expected.begin()); mpt::crypto::hash::SHA512 hash; - mpt::ifstream f(updateFilename, std::ios::binary); + std::ifstream f(updateFilename, std::ios::binary); f.imbue(std::locale::classic()); f.exceptions(std::ios::badbit); while(!mpt::IO::IsEof(f)) Index: pluginBridge/BridgeWrapper.cpp =================================================================== --- pluginBridge/BridgeWrapper.cpp (revision 13999) +++ pluginBridge/BridgeWrapper.cpp (working copy) @@ -188,7 +188,7 @@ PluginArch BridgeWrapper::GetPluginBinaryType(const mpt::PathString &pluginPath) { PluginArch type = PluginArch_unknown; - mpt::ifstream file(pluginPath, std::ios::in | std::ios::binary); + std::ifstream file(pluginPath, std::ios::in | std::ios::binary); if(file.is_open()) { IMAGE_DOS_HEADER dosHeader; Index: soundlib/Dlsbank.cpp =================================================================== --- soundlib/Dlsbank.cpp (revision 13999) +++ soundlib/Dlsbank.cpp (working copy) @@ -533,7 +533,7 @@ { RIFFCHUNKID riff; if(filename.empty()) return false; - mpt::ifstream f(filename, std::ios::binary); + std::ifstream f(filename, std::ios::binary); if(!f) { return false; @@ -1532,7 +1532,7 @@ return false; } - mpt::ifstream f(m_szFileName, std::ios::binary); + std::ifstream f(m_szFileName, std::ios::binary); if(!f) { return false; Index: soundlib/plugins/PlugInterface.cpp =================================================================== --- soundlib/plugins/PlugInterface.cpp (revision 13999) +++ soundlib/plugins/PlugInterface.cpp (working copy) @@ -655,7 +655,7 @@ try { mpt::SafeOutputFile sf(dlg.GetFirstFile(), std::ios::binary, mpt::FlushModeFromBool(TrackerSettings::Instance().MiscFlushFileBuffersOnSave)); - mpt::ofstream &f = sf; + std::ofstream &f = sf; f.exceptions(f.exceptions() | std::ios::badbit | std::ios::failbit); if(f.good() && VSTPresets::SaveFile(f, *this, isBank)) return true; Index: soundlib/SampleFormatFLAC.cpp =================================================================== --- soundlib/SampleFormatFLAC.cpp (revision 13999) +++ soundlib/SampleFormatFLAC.cpp (working copy) @@ -485,7 +485,7 @@ static FLAC__StreamEncoderWriteStatus StreamEncoderWriteCallback(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data) { - mpt::ofstream & file = *reinterpret_cast<mpt::ofstream*>(client_data); + std::ofstream & file = *reinterpret_cast<std::ofstream*>(client_data); MPT_UNUSED_VARIABLE(encoder); MPT_UNUSED_VARIABLE(samples); MPT_UNUSED_VARIABLE(current_frame); @@ -497,7 +497,7 @@ } static FLAC__StreamEncoderSeekStatus StreamEncoderSeekCallback(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data) { - mpt::ofstream & file = *reinterpret_cast<mpt::ofstream*>(client_data); + std::ofstream & file = *reinterpret_cast<std::ofstream*>(client_data); MPT_UNUSED_VARIABLE(encoder); if(!mpt::in_range<mpt::IO::Offset>(absolute_byte_offset)) { @@ -511,7 +511,7 @@ } static FLAC__StreamEncoderTellStatus StreamEncoderTellCallback(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data) { - mpt::ofstream & file = *reinterpret_cast<mpt::ofstream*>(client_data); + std::ofstream & file = *reinterpret_cast<std::ofstream*>(client_data); MPT_UNUSED_VARIABLE(encoder); mpt::IO::Offset pos = mpt::IO::TellWrite(file); if(pos < 0) Index: test/test.cpp =================================================================== --- test/test.cpp (revision 13999) +++ test/test.cpp (working copy) @@ -365,7 +365,7 @@ #if MPT_TEST_HAS_FILESYSTEM #if !MPT_OS_DJGPP mpt::PathString version_mk = GetPathPrefix() + P_("libopenmpt/libopenmpt_version.mk"); - mpt::ifstream f(version_mk, std::ios::in); + std::ifstream f(version_mk, std::ios::in); VERIFY_EQUAL(f ? true : false, true); std::map<std::string, std::string> fields; std::string line; @@ -4143,7 +4143,7 @@ static TSoundFileContainer CreateSoundFileContainer(const mpt::PathString &filename) { - mpt::ifstream stream(filename, std::ios::binary); + std::ifstream stream(filename, std::ios::binary); FileReader file = make_FileReader(&stream); std::shared_ptr<CSoundFile> pSndFile = std::make_shared<CSoundFile>(); pSndFile->Create(file, CSoundFile::loadCompleteModule); @@ -4159,19 +4159,19 @@ static void SaveIT(const TSoundFileContainer &sndFile, const mpt::PathString &filename) { - mpt::ofstream f(filename, std::ios::binary); + std::ofstream f(filename, std::ios::binary); sndFile->SaveIT(f, filename, false); } static void SaveXM(const TSoundFileContainer &sndFile, const mpt::PathString &filename) { - mpt::ofstream f(filename, std::ios::binary); + std::ofstream f(filename, std::ios::binary); sndFile->SaveXM(f, false); } static void SaveS3M(const TSoundFileContainer &sndFile, const mpt::PathString &filename) { - mpt::ofstream f(filename, std::ios::binary); + std::ofstream f(filename, std::ios::binary); sndFile->SaveS3M(f); } doc-require-filesystem-v1.patch (3,181 bytes)
Index: common/CompilerDetect.h =================================================================== --- common/CompilerDetect.h (revision 14145) +++ common/CompilerDetect.h (working copy) @@ -51,8 +51,8 @@ #define MPT_GCC_AT_LEAST(major,minor,patch) (MPT_COMPILER_GCC_VERSION >= MPT_COMPILER_MAKE_VERSION3((major),(minor),(patch))) #define MPT_GCC_BEFORE(major,minor,patch) (MPT_COMPILER_GCC_VERSION < MPT_COMPILER_MAKE_VERSION3((major),(minor),(patch))) -#if MPT_GCC_BEFORE(8,1,0) -#error "GCC version 8.1 required" +#if MPT_GCC_BEFORE(9,1,0) +#error "GCC version 9.1 required" #endif #elif defined(_MSC_VER) Index: libopenmpt/dox/changelog.md =================================================================== --- libopenmpt/dox/changelog.md (revision 14145) +++ libopenmpt/dox/changelog.md (working copy) @@ -23,10 +23,12 @@ `EMSCRIPTEN_TARGET=all` which provides WebAssembly as well as fallback to JavaScript in a single build. + * [**Regression**] Full C++17 support, including `std::filesystem`, is now + required to build libopenmpt. * [**Regression**] `Makefile` `CONFIG=emscripten` does not support `EMSCRIPTEN_TARGET=asmjs` or `EMSCRIPTEN_TARGET=asmjs128m` any more because support has been removed from current Emscripten versions. - * [**Regression**] Support for GCC 7 has been removed. + * [**Regression**] Support for GCC 7, 8 has been removed. * [**Regression**] Support for Clang 5, 6 has been removed. * [**Regression**] Support for Emscripten versions older than 1.39.7 has been removed. Index: libopenmpt/dox/dependencies.md =================================================================== --- libopenmpt/dox/dependencies.md (revision 14145) +++ libopenmpt/dox/dependencies.md (working copy) @@ -11,13 +11,13 @@ * Supported compilers for building libopenmpt: * **Microsoft Visual Studio 2017** or higher, running on a x86-64 build system (other target systems are supported) - * **GCC 8.1** or higher + * **GCC 9.1** or higher * **Clang 7** or higher - * **MinGW-W64 8.1** or higher (it is recommended to preferably use + * **MinGW-W64 9.1** or higher (it is recommended to preferably use posix threading model as opposed to win32 threading model, or at least have mingw-std-threads available otherwise) * **emscripten 1.39.1** or higher - * **DJGPP GCC 8.1** or higher + * **DJGPP GCC 9.1** or higher * any other **C++17 compliant** compiler libopenmpt makes the following assumptions about the C++ implementation @@ -73,10 +73,10 @@ * Supported compilers for building openmpt123: * **Microsoft Visual Studio 2017** or higher, running on a x86-64 build system (other target systems are supported) - * **GCC 8.1** or higher + * **GCC 9.1** or higher * **Clang 7** or higher - * **MinGW-W64 8.1** or higher - * **DJGPP GCC 8.1** or higher + * **MinGW-W64 9.1** or higher + * **DJGPP GCC 9.1** or higher * any **C++17 compliant** compiler * Live sound output requires one of: * **PulseAudio** |
|
First steps:
|
|
Turns out it is not really feasible to migrate mpt::PathString to std::filesystem::path for now. |
|
Date Modified | Username | Field | Change |
---|---|---|---|
2020-06-12 07:59 | manx | New Issue | |
2020-06-12 07:59 | manx | Status | new => assigned |
2020-06-12 07:59 | manx | Assigned To | => manx |
2020-06-12 08:00 | manx | Relationship added | related to 0001240 |
2020-06-12 18:02 | manx | Status | assigned => acknowledged |
2020-08-05 13:55 | manx | Note Added: 0004414 | |
2020-08-05 13:55 | manx | Description Updated | |
2020-11-28 19:57 | manx | Target Version | OpenMPT 1.30.01.00 / libopenmpt 0.6.0 (upgrade first) => OpenMPT 1.31.01.00 / libopenmpt 0.7.0 (upgrade first) |
2021-02-14 10:47 | manx | Note Added: 0004633 | |
2021-02-14 10:47 | manx | File Added: path-v5.patch | |
2021-02-14 10:47 | manx | File Added: doc-require-filesystem-v1.patch | |
2021-06-05 15:22 | manx | Note Added: 0004789 | |
2021-06-20 11:09 | manx | Relationship added | child of 0000925 |
2022-06-25 17:18 | manx | Relationship deleted | child of 0000925 |
2022-06-25 17:18 | manx | Target Version | OpenMPT 1.31.01.00 / libopenmpt 0.7.0 (upgrade first) => OpenMPT 1.?? (libopenmpt 1.0) (goals) |
2022-06-25 17:19 | manx | Note Added: 0005227 | |
2022-06-25 17:20 | manx | Relationship added | related to 0001607 |
2022-07-03 14:25 | manx | Status | acknowledged => new |