X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2Fdocstream.h;h=460a9b7393011b7a0d23ff8f9780cc70dd908294;hb=9c1142c88061ed357b8f15bc151707a07303f3ea;hp=6da05e36a84e7d6a7ac3c2e9ef62a071903bb489;hpb=ecef54500d4d77baf4fa47eac2253679875ac08c;p=lyx.git diff --git a/src/support/docstream.h b/src/support/docstream.h index 6da05e36a8..460a9b7393 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"); @@ -83,86 +85,18 @@ typedef std::basic_istringstream idocstringstream; /// 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; };