From 328c15189d661503fbf6561731e550064e6a5567 Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 28 Oct 2022 19:52:33 -0400 Subject: [PATCH] cmGeneratedFileStream: Add support for a temporary alternate encoding The Ninja generator needs to be able to write some file content in a different encoding than the rest of the file. Add a method to do this. --- Source/cmGeneratedFileStream.cxx | 14 ++++++++++++++ Source/cmGeneratedFileStream.h | 6 ++++++ 2 files changed, 20 insertions(+) diff --git a/Source/cmGeneratedFileStream.cxx b/Source/cmGeneratedFileStream.cxx index 6212bbde2b..215c3c24be 100644 --- a/Source/cmGeneratedFileStream.cxx +++ b/Source/cmGeneratedFileStream.cxx @@ -239,6 +239,20 @@ void cmGeneratedFileStream::SetTempExt(std::string const& ext) this->TempExt = ext; } +void cmGeneratedFileStream::WriteAltEncoding(std::string const& data, + Encoding encoding) +{ +#ifndef CMAKE_BOOTSTRAP + std::locale prevLocale = + this->imbue(std::locale(this->getloc(), new codecvt(encoding))); + this->write(data.data(), data.size()); + this->imbue(prevLocale); +#else + static_cast(encoding); + this->write(data.data(), data.size()); +#endif +} + void cmGeneratedFileStream::WriteRaw(std::string const& data) { #ifndef CMAKE_BOOTSTRAP diff --git a/Source/cmGeneratedFileStream.h b/Source/cmGeneratedFileStream.h index bb7e3bf52f..77fd7ef46a 100644 --- a/Source/cmGeneratedFileStream.h +++ b/Source/cmGeneratedFileStream.h @@ -147,6 +147,12 @@ public: */ void SetTempExt(std::string const& ext); + /** + * Write a specific string using an alternate encoding. + * Afterward, the original encoding is restored. + */ + void WriteAltEncoding(std::string const& data, Encoding encoding); + /** * Writes the given string directly to the file without changing the * encoding.