From 40f5f4e12f0e76dccf7d4c4d81407cdf91713484 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Sun, 16 Nov 2008 19:25:26 +0000 Subject: [PATCH] add support for changing encoding on idocstream git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@27579 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/support/docstream.cpp | 22 ++++++++++++++++++++++ src/support/docstream.h | 1 + 2 files changed, 23 insertions(+) diff --git a/src/support/docstream.cpp b/src/support/docstream.cpp index e5120bc63b..cc8fbc9f80 100644 --- a/src/support/docstream.cpp +++ b/src/support/docstream.cpp @@ -345,6 +345,28 @@ odocstream & operator<<(odocstream & os, SetEnc e) } +//CHECKME: I just copied the code above, and have no idea whether it +//is correct... (JMarc) +idocstream & operator<<(idocstream & is, SetEnc e) +{ + if (has_facet(is.rdbuf()->getloc())) { + // This stream must be a file stream, since we never imbue + // any other stream with a locale having a iconv_codecvt_facet. + // Flush the stream so that all pending output is written + // with the old encoding. + //is.flush(); + locale locale(is.rdbuf()->getloc(), + new iconv_codecvt_facet(e.encoding, ios_base::in)); + // FIXME Does changing the codecvt facet of an open file + // stream always work? It does with gcc 4.1, but I have read + // somewhere that it does not with MSVC. + // What does the standard say? + is.imbue(locale); + } + return is; +} + + #if ! defined(USE_WCHAR_T) odocstream & operator<<(odocstream & os, char c) { diff --git a/src/support/docstream.h b/src/support/docstream.h index 11eee7422c..c15b27c288 100644 --- a/src/support/docstream.h +++ b/src/support/docstream.h @@ -90,6 +90,7 @@ SetEnc setEncoding(std::string const & encoding); \endcode */ odocstream & operator<<(odocstream & os, SetEnc e); +idocstream & operator<<(idocstream & os, SetEnc e); } -- 2.39.2