X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2Fdocstream.h;h=409c7557a85cbdd8a854f80f127a2f6c58dd0bee;hb=e781628575276d48d71df6ebb44aad56f12d21f4;hp=b7e30409b368f6304bf97d00e4e69673b75e2582;hpb=d703d9057432ebce6f7cd73cbe6c0e71b241c0f1;p=lyx.git diff --git a/src/support/docstream.h b/src/support/docstream.h index b7e30409b3..409c7557a8 100644 --- a/src/support/docstream.h +++ b/src/support/docstream.h @@ -12,16 +12,8 @@ #ifndef LYX_DOCSTREAM_H #define LYX_DOCSTREAM_H -#include "TexRow.h" #include "support/docstring.h" -#if defined(_MSC_VER) && (_MSC_VER >= 1600) -// Ugly workaround for MSVC10 STL bug: -// std::numpunct has a hardcoded dllimport in definition, but we wanna it with 32 bit -// so we can't import it and must define it but then the compiler complains. -#include "support/numpunct_lyx_char_type.h" -#endif - #include #include @@ -48,12 +40,19 @@ typedef std::basic_istream idocstream; */ typedef std::basic_ostream odocstream; +struct SetEnc; + /// File stream for reading UTF8-encoded files with automatic conversion to /// UCS4. +/// Buffering must be switched off if the encoding is changed after +/// construction by calling rdbuf()->pubsetbuf(0, 0). class ifdocstream : public std::basic_ifstream { typedef std::basic_ifstream base; public: ifdocstream(); + /// Create a stream with a specific encoding \p enc. + /// We must not pass \p enc as string, to avoid confusing it with a file name. + explicit ifdocstream(SetEnc const & enc); explicit ifdocstream(const char* s, std::ios_base::openmode mode = std::ios_base::in, std::string const & encoding = "UTF-8"); @@ -67,6 +66,9 @@ class ofdocstream : public std::basic_ofstream { typedef std::basic_ofstream base; public: ofdocstream(); + /// Create a stream with a specific encoding \p enc. + /// We must not pass \p enc as string, to avoid confusing it with a file name. + explicit ofdocstream(SetEnc const & enc); explicit ofdocstream(const char* s, std::ios_base::openmode mode = std::ios_base::out|std::ios_base::trunc, std::string const & encoding = "UTF-8"); @@ -80,92 +82,21 @@ public: /// UCS4 input stringstream typedef std::basic_istringstream idocstringstream; -/// UCS4 output stringstream -typedef std::basic_ostringstream odocstringstream; - /// UCS4 output manipulator typedef odocstream & (*odocstream_manip)(odocstream &); -/** Wrapper class for odocstream. - This class is used to automatically count the lines of the exported latex - code and also to ensure that no blank lines may be inadvertently output. - To this end, use the special variables "breakln" and "safebreakln" as if - they were iomanip's to ensure that the next output will start at the - beginning of a line. Using "breakln", a '\n' char will be output if needed, - while using "safebreakln", "%\n" will be output if needed. - The class also records the last output character. - */ - -class otexstream { -public: - /// - otexstream(odocstream & os, TexRow & texrow) - : os_(os), texrow_(texrow), - canbreakline_(false), protectspace_(false), lastchar_(0) {} - /// - odocstream & os() { return os_; } - /// - TexRow & texrow() { return texrow_; } - /// - void put(char_type const & c); - /// - void canBreakLine(bool breakline) { canbreakline_ = breakline; } - /// - bool canBreakLine() const { return canbreakline_; } - /// - void protectSpace(bool protectspace) { protectspace_ = protectspace; } - /// - bool protectSpace() const { return protectspace_; } - /// - void lastChar(char_type const & c) { lastchar_ = c; } - /// - char_type lastChar() const { return lastchar_; } -private: - /// - odocstream & os_; - /// - TexRow & texrow_; - /// - bool canbreakline_; - /// - bool protectspace_; - /// - char_type lastchar_; -}; - -/// Helper structs for breaking a line -struct BreakLine { - char n; -}; - -struct SafeBreakLine { - char n; -}; - -extern BreakLine breakln; -extern SafeBreakLine safebreakln; - -/// -otexstream & operator<<(otexstream &, BreakLine); -/// -otexstream & operator<<(otexstream &, SafeBreakLine); -/// -otexstream & operator<<(otexstream &, odocstream_manip); -/// -otexstream & operator<<(otexstream &, docstring const &); -/// -otexstream & operator<<(otexstream &, std::string const &); -/// -otexstream & operator<<(otexstream &, char const *); -/// -otexstream & operator<<(otexstream &, char); -/// -template -otexstream & operator<<(otexstream & ots, Type value); /// Helper struct for changing stream encoding struct SetEnc { - SetEnc(std::string const & e) : encoding(e) {} + /** + * It is important that this constructor is explicit. + * Otherwise the attempt to output a std::string to an odocstream + * would compile, but cause a (probably failing) encoding change + * instead of string output (we do not define + * operator<<(odocstream &, std::string) since we want to avoid + * outputting strings with unspecified encoding) + */ + explicit SetEnc(std::string const & e) : encoding(e) {} std::string encoding; }; @@ -183,6 +114,6 @@ SetEnc setEncoding(std::string const & encoding); odocstream & operator<<(odocstream & os, SetEnc e); idocstream & operator<<(idocstream & os, SetEnc e); -} +} // namespace lyx #endif