X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fsupport%2Fdocstream.cpp;h=04b57045b24d2fed98bea7c4bb1aa52359512deb;hb=41a8994da902031a743373c1c57d028b7c900797;hp=b07ac56a320dea157d5723e8214ea4a9aac1e12c;hpb=990446c0e1d784ef9e067f109d4eaef08a9237b4;p=lyx.git diff --git a/src/support/docstream.cpp b/src/support/docstream.cpp index b07ac56a32..04b57045b2 100644 --- a/src/support/docstream.cpp +++ b/src/support/docstream.cpp @@ -32,15 +32,15 @@ std::locale::id numpunct::id; namespace std { // Implementation of numpunct defined in numpunct_lyx_char_type.h typedef basic_string string_type; - + string_type numpunct::truename() const -{ - return lyx::from_ascii(numpunct::truename()); +{ + return lyx::from_ascii(numpunct::truename()); } - + string_type numpunct::falsename() const -{ - return lyx::from_ascii(numpunct::falsename()); +{ + return lyx::from_ascii(numpunct::falsename()); } } // namespace std @@ -88,6 +88,7 @@ public: } else out_cd_ = (iconv_t)(-1); } + string const & encoding() const { return encoding_; } protected: virtual ~iconv_codecvt_facet() { @@ -280,7 +281,7 @@ private: inbytesleft, to, outbytesleft); if (converted == (size_t)(-1)) { switch(errno) { - case 0: + case 0: // As strange as it may seem, this // does happen on windows when parsing // comments with accented chars in @@ -306,7 +307,7 @@ private: string encoding_; }; -} // namespace anon +} // namespace namespace lyx { @@ -333,6 +334,12 @@ ifdocstream::ifdocstream() : base() } +ifdocstream::ifdocstream(SetEnc const & enc) : base() +{ + setEncoding(*this, enc.encoding, in); +} + + ifdocstream::ifdocstream(const char* s, ios_base::openmode mode, string const & encoding) : base() @@ -348,6 +355,12 @@ ofdocstream::ofdocstream(): base() } +ofdocstream::ofdocstream(SetEnc const & enc) : base() +{ + setEncoding(*this, enc.encoding, out); +} + + ofdocstream::ofdocstream(const char* s, ios_base::openmode mode, string const & encoding) : base() @@ -375,37 +388,51 @@ odocstream & operator<<(odocstream & os, SetEnc e) if (has_facet(os.rdbuf()->getloc())) { // This stream must be a file stream, since we never imbue // any other stream with a locale having a iconv_codecvt_facet. + iconv_codecvt_facet const & facet = + use_facet(os.rdbuf()->getloc()); + + // FIXME Changing the codecvt facet of an open file is allowed, + // but unsafe for facets that use internal state (see the thread + // "iostreams: Does imbue() need to be called before open()?" + // in comp.std.c++. + // Currently it seems to work with gcc and MSVC, but not with + // clang on OS X. + // Avoid imbueing with the same encoding again if possible. + if (facet.encoding() == e.encoding) + return os; + // Flush the stream so that all pending output is written // with the old encoding. os.flush(); + locale locale(os.rdbuf()->getloc(), new iconv_codecvt_facet(e.encoding, ios_base::out)); - // 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? os.imbue(locale); } return os; } -//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(); + iconv_codecvt_facet const & facet = + use_facet(is.rdbuf()->getloc()); + + // FIXME Changing the codecvt facet of an open file is allowed, + // but unsafe for facets that use internal state (see the thread + // "iostreams: Does imbue() need to be called before open()?" + // in comp.std.c++. + // Currently it seems to work with gcc and MSVC, but not with + // clang on OS X. + // Avoid imbueing with the same encoding again if possible. + if (facet.encoding() == e.encoding) + return is; + 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; @@ -420,7 +447,7 @@ odocstream & operator<<(odocstream & os, char c) } #endif -} +} // namespace lyx #if ! defined(USE_WCHAR_T) && defined(__GNUC__)