From 7ee008e150bc5bcf76082d726f719ee0fdfda982 Mon Sep 17 00:00:00 2001 From: SulfurNitride Date: Wed, 11 Feb 2026 02:37:39 -0600 Subject: Fluorine Manager: full Linux port of Mod Organizer 2 Complete native Linux port with FUSE-based virtual filesystem, Proton/umu-run integration, and Flatpak packaging. Key features: - FUSE VFS replacing Windows USVFS (in-process + standalone helper for Flatpak) - Proton/GE-Proton/umu-run launcher with env var forwarding - Flatpak support (sandbox-aware VFS, NXM handler, umu-run) - Wine prefix management UI - Case-insensitive path resolution for Linux filesystems - QSettings-safe INI handling (avoids Bethesda INI corruption) - Portable instance support with auto-generated launcher scripts Co-Authored-By: Claude Opus 4.6 --- libs/archive/src/formatter.h | 121 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 libs/archive/src/formatter.h (limited to 'libs/archive/src/formatter.h') diff --git a/libs/archive/src/formatter.h b/libs/archive/src/formatter.h new file mode 100644 index 0000000..0776bee --- /dev/null +++ b/libs/archive/src/formatter.h @@ -0,0 +1,121 @@ +/* +Mod Organizer archive handling + +Copyright (C) 2020 MO2 Team. All rights reserved. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 3 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef ARCHIVE_FORMAT_H +#define ARCHIVE_FORMAT_H + +// This header specialize formatter() for some useful types. It should not be +// exposed outside of the library. It also contains some useful methods for +// string manipulation. + +#include + +#include +#include +#include +#include + +template <> +struct std::formatter : std::formatter +{ + template + auto format(std::string const& s, FormatContext& ctx) const + { + return std::formatter::format( + std::wstring(s.begin(), s.end()), ctx); + } +}; + +template <> +struct std::formatter : std::formatter +{ + template + auto format(std::exception const& ex, FormatContext& ctx) const + { + return std::formatter::format(ex.what(), ctx); + } +}; + +template <> +struct std::formatter : std::formatter +{ + template + auto format(std::error_code const& ec, FormatContext& ctx) const + { + return std::formatter::format(ec.message(), ctx); + } +}; + +template <> +struct std::formatter + : std::formatter +{ + template + auto format(std::filesystem::path const& path, FormatContext& ctx) const + { + return std::formatter::format(path.wstring(), ctx); + } +}; + +namespace ArchiveStrings +{ + +/** + * @brief Join the element of the given container using the given separator. + * + * @param c The container. Must be satisfy standard container requirements. + * @param sep The separator. + * + * @return a string containing the element joint, or an empty string if c + * is empty. + */ +template +std::wstring join(C const& c, std::wstring const& sep) +{ + auto begin = std::begin(c), end = std::end(c); + + if (begin == end) { + return {}; + } + std::wstring r = *begin++; + for (; begin != end; ++begin) { + r += *begin + sep; + } + + return r; +} + +/** + * @brief Conver the given string to lowercase. + * + * @param s The string to convert. + * + * @return the converted string. + */ +inline std::wstring towlower(std::wstring s) +{ + std::transform(std::begin(s), std::end(s), std::begin(s), [](wchar_t c) { + return static_cast(::towlower(c)); + }); + return s; +} +} // namespace ArchiveStrings + +#endif -- cgit v1.3.1