Slightly better patch.
Georg
Index: src/support/docstring.C =================================================================== --- src/support/docstring.C (Revision 14975) +++ src/support/docstring.C (Arbeitskopie) @@ -15,9 +15,80 @@ #include <boost/assert.hpp> +#include <locale> + + +#ifdef __GCC__ +namespace { + +/// ctype facet for UCS4 streams. Widening and narrowing is restricted to +/// ASCII, since we do not need anything else. +class ascii_ctype_facet : public std::ctype<boost::uint32_t> +{ +public: + typedef boost::uint32_t char_type; + explicit ascii_ctype_facet(size_t refs = 0) + : std::ctype<char_type>(refs) {} +protected: + virtual ~ascii_ctype_facet() {} + virtual char_type do_widen(char c) const + { + if (static_cast<unsigned char>(c) < 128) + return c; + throw std::bad_cast(); + } + virtual char const * do_widen(char const * lo, char const * hi, + char_type * dest) const + { + while (lo < hi) { + if (static_cast<unsigned char>(*lo) >= 128) + throw std::bad_cast(); + *dest = *lo; + ++lo; + ++dest; + } + return hi; + } + virtual char do_narrow(char_type wc, char) const + { + if (wc < 128) + return static_cast<char>(wc); + throw std::bad_cast(); + } + virtual char_type const * do_narrow(char_type const * lo, + char_type const * hi, char, char * dest) const + { + while (lo < hi) { + if (*lo < 128) + *dest = static_cast<char>(*lo); + else + throw std::bad_cast(); + ++lo; + ++dest; + } + return hi; + } +}; + +} +#endif + namespace lyx { +void init_docstring() +{ +#ifdef __GCC__ + // Add our own ctype facet to the global locale, since + // std::ctype<boost::uint32_t> of gcc throws bad casts in + // do_widen/do_narrow even for ASCII characters. + std::locale global; + std::locale locale(global, new ascii_ctype_facet); + std::locale::global(locale); +#endif +} + + docstring const from_ascii(char const * ascii) { docstring s; Index: src/support/docstring.h =================================================================== --- src/support/docstring.h (Revision 14975) +++ src/support/docstring.h (Arbeitskopie) @@ -18,6 +18,9 @@ namespace lyx { +/// Installs locale facets that are needed for dealing with docstrings +void init_docstring(); + /// String type for storing the main text in UCS4 encoding typedef std::basic_string<boost::uint32_t> docstring; Index: src/main.C =================================================================== --- src/main.C (Revision 14975) +++ src/main.C (Arbeitskopie) @@ -15,6 +15,7 @@ #include "lyx_main.h" #include "gettext.h" +#include "support/docstring.h" #include "support/os.h" #include <boost/filesystem/path.hpp> @@ -44,5 +45,7 @@ int main(int argc, char * argv[]) // initialize for internationalized version *EK* locale_init(); + lyx::init_docstring(); + return LyX::exec(argc, argv); }