X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2Fdocstring.h;h=8c9a1f56d016bf930128a0c9bf5a6eb3045505bb;hb=848c89564fce9c4bfec79b915746dc6bc47abc3d;hp=9f54f0eaaa1c45b1062e6b4b6550a19f201e4ba0;hpb=c46b7d89553209b8df4e9de392ee07ef711f092f;p=lyx.git diff --git a/src/support/docstring.h b/src/support/docstring.h index 9f54f0eaaa..8c9a1f56d0 100644 --- a/src/support/docstring.h +++ b/src/support/docstring.h @@ -4,11 +4,8 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * Provide a set of typedefs for commonly used things like sizes and - * indices wile trying to stay compatible with types used - * by the standard containers. - * - * \author André Pönitz + * \author Lars Gullik Bjønnes + * \author Georg Baum * * Full author contact details are available in file CREDITS. */ @@ -16,13 +13,205 @@ #ifndef LYX_DOCSTRING_H #define LYX_DOCSTRING_H -#include +#include "support/types.h" + #include +#include namespace lyx { -typedef std::basic_string docstring; +/// String type for storing the main text in UCS4 encoding +typedef std::basic_string docstring; + +/// Creates a docstring from a C string of ASCII characters +docstring const from_ascii(char const *); + +/// Creates a docstring from a std::string of ASCII characters +docstring const from_ascii(std::string const &); + +/// Creates a std::string of ASCII characters from a docstring +std::string const to_ascii(docstring const &); + +/// Creates a docstring from a UTF8 string. This should go eventually. +docstring const from_utf8(std::string const &); + +/// Creates a UTF8 string from a docstring. This should go eventually. +std::string const to_utf8(docstring const &); + +/// convert \p s from the encoding of the locale to ucs4. +docstring const from_local8bit(std::string const & s); + +/// Exception thrown by to_local8bit if the string could not be converted +class to_local8bit_failure : public std::bad_cast { +public: + to_local8bit_failure() throw() : std::bad_cast() {} + virtual ~to_local8bit_failure() throw() {} + virtual const char* what() const throw(); +}; + +/** + * Convert \p s from ucs4 to the encoding of the locale. + * This may fail and throw an exception, the caller is expected to act + * appropriately. + */ +std::string const to_local8bit(docstring const & s); + +/// convert \p s from the encoding of the file system to ucs4. +docstring const from_filesystem8bit(std::string const & s); + +/// convert \p s from ucs4 to the encoding of the file system. +std::string const to_filesystem8bit(docstring const & s); + +/// normalize \p s to precomposed form c +docstring const normalize_c(docstring const & s); + +/// Compare a docstring with a C string of ASCII characters +bool operator==(lyx::docstring const &, char const *); + +/// Compare a C string of ASCII characters with a docstring +inline bool operator==(char const * l, lyx::docstring const & r) { return r == l; } + +/// Compare a docstring with a C string of ASCII characters +inline bool operator!=(lyx::docstring const & l, char const * r) { return !(l == r); } +/// Compare a C string of ASCII characters with a docstring +inline bool operator!=(char const * l, lyx::docstring const & r) { return !(r == l); } + +/// Concatenate a docstring and a C string of ASCII characters +lyx::docstring operator+(lyx::docstring const &, char const *); + +/// Concatenate a C string of ASCII characters and a docstring +lyx::docstring operator+(char const *, lyx::docstring const &); + +/// Concatenate a docstring and a single ASCII character +lyx::docstring operator+(lyx::docstring const & l, char r); + +/// Concatenate a single ASCII character and a docstring +lyx::docstring operator+(char l, lyx::docstring const & r); + +/// Append a C string of ASCII characters to a docstring +lyx::docstring & operator+=(lyx::docstring &, char const *); + +/// Append a single ASCII character to a docstring +lyx::docstring & operator+=(lyx::docstring & l, char r); + +} // namespace lyx + + +#if ! defined(USE_WCHAR_T) && defined(__GNUC__) && defined(__GNUC_MINOR__) && __GNUC__ == 3 && __GNUC_MINOR__ < 4 +// Missing char_traits methods in gcc 3.3 and older. Taken from gcc 4.2svn. +namespace std { + +template void +char_traits::assign(char_type & c1, char_type const & c2) +{ + c1 = c2; +} + + +template bool +char_traits::eq(char_type const & c1, char_type const & c2) +{ + return c1 == c2; } + +template bool +char_traits::lt(char_type const & c1, char_type const & c2) +{ + return c1 < c2; +} + + +template int +char_traits::compare(char_type const * s1, char_type const * s2, std::size_t n) +{ + for (std::size_t i = 0; i < n; ++i) + if (lt(s1[i], s2[i])) + return -1; + else if (lt(s2[i], s1[i])) + return 1; + return 0; +} + + +template std::size_t +char_traits::length(char_type const * p) +{ + std::size_t i = 0; + while (!eq(p[i], char_type())) + ++i; + return i; +} + + +template typename char_traits::char_type const * +char_traits::find(char_type const * s, size_t n, char_type const & a) +{ + for (std::size_t i = 0; i < n; ++i) + if (eq(s[i], a)) + return s + i; + return 0; +} + + +template typename char_traits::char_type * +char_traits::move(char_type * s1, char_type const * s2, std::size_t n) +{ + return static_cast(std::memmove(s1, s2, n * sizeof(char_type))); +} + + +template typename char_traits::char_type * +char_traits::copy(char_type * s1, char_type const * s2, std::size_t n) +{ + std::copy(s2, s2 + n, s1); + return s1; +} + + +template typename char_traits::char_type * +char_traits::assign(char_type * s, std::size_t n, char_type a) +{ + std::fill_n(s, n, a); + return s; +} + + +template typename char_traits::char_type +char_traits::to_char_type(int_type const & c) +{ + return static_cast(c); +} + + +template typename char_traits::int_type +char_traits::to_int_type(char_type const & c) +{ + return static_cast(c); +} + + +template bool +char_traits::eq_int_type(int_type const & c1, int_type const & c2) +{ + return c1 == c2; +} + + +template typename char_traits::int_type +char_traits::eof() +{ + return static_cast(EOF); +} + + +template typename char_traits::int_type +char_traits::not_eof(int_type const & c) +{ + return !eq_int_type(c, eof()) ? c : to_int_type(char_type()); +} + +} +#endif #endif