* src/buffer.C
(Buffer::insertStringAsLines): Uncomment isPrintable test
* src/support/lstrings.C
(compare_no_case): Use char_type and not int for the docstring version
(ascii_tolower): Convert to a template
(compare_ascii_no_case): Do not use a template anymore, because we
need int for the string version and char_type for the docstring
version as intermediate type
(lowercase): Use towlower if possible
(uppercase): Use towupper if possible
* src/support/textutils.h
(isLetterChar): Use iswalpha if possible
(isPrintable): Use iswprint if possible
(isPrintableNonspace): Use iswprint and iswspace if possible
(isDigit): Use iswdigit if possible
* src/paragraph.C
(Paragraph::asString): remove obsolete FIXME
(Paragraph::transformChar): add FIXME
* configure.ac: Add definition of LIBC_WCTYPE_USES_UCS4 to config.h
* development/cmake/config.h.cmake: ditto
* development/scons/SConstruct: ditto
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@15893
a592a061-630c-0410-9148-
cb99ea01b6c8
# define WANT_GETFILEATTRIBUTESEX_WRAPPER 1
#endif
+#if defined(HAVE_WCHAR_T) && SIZEOF_WCHAR_T == 4
+# define LIBC_WCTYPE_USES_UCS4
+#endif
+
#endif
])
# define WANT_GETFILEATTRIBUTESEX_WRAPPER 1
#endif
+#if defined(HAVE_WCHAR_T) && SIZEOF_WCHAR_T == 4
+# define LIBC_WCTYPE_USES_UCS4
+#endif
+
#if defined(MAKE_INTL_LIB) && defined(_MSC_VER)
#define __attribute__(x)
#define inline
# define WANT_GETFILEATTRIBUTESEX_WRAPPER 1
#endif
+#if defined(HAVE_WCHAR_T) && SIZEOF_WCHAR_T == 4
+# define LIBC_WCTYPE_USES_UCS4
+#endif
+
#endif
'''
)
}
space_inserted = true;
}
-/* FIXME: not needed anymore?
} else if (!isPrintable(*cit)) {
// Ignore unprintables
continue;
-*/
} else {
// just insert the character
par.insertChar(pos, *cit, font, params().trackChanges);
for (pos_type i = beg; i < end; ++i) {
value_type const c = getUChar(buffer.params(), i);
- // FIXME: isPrintable does not work for lyx::char_type
if (isPrintable(c))
os.put(c);
else if (c == META_INSET)
{
if (!Encodings::is_arabic(c))
if (lyxrc.font_norm_type == LyXRC::ISO_8859_6_8 && isDigit(c))
+ // FIXME UNICODE What does this do?
return c + (0xb0 - '0');
else
return c;
#include <algorithm>
#include <sstream>
+#ifdef LIBC_WCTYPE_USES_UCS4
+// We can use the libc ctype functions because we unset the LC_CTYPE
+// category of the current locale in gettext.C
+#include <wctype.h>
+#else
+// Steal some code from somewhere else, e.g. glib (look at gunicode.h)
+// The code that we currently use does not really work.
+#endif
+
+
using lyx::docstring;
using std::transform;
docstring::const_iterator p2 = s2.begin();
while (p != s.end() && p2 != s2.end()) {
- int const lc1 = tolower(*p);
- int const lc2 = tolower(*p2);
+ char_type const lc1 = lowercase(*p);
+ char_type const lc2 = lowercase(*p2);
if (lc1 != lc2)
return (lc1 < lc2) ? -1 : 1;
++p;
namespace {
-int ascii_tolower(int c) {
+template<typename Char>
+Char ascii_tolower(Char c) {
if (c >= 'A' && c <= 'Z')
return c - 'A' + 'a';
return c;
}
+}
-template<typename String> inline
-int do_compare_ascii_no_case(String const & s, String const & s2)
+
+int compare_ascii_no_case(string const & s, string const & s2)
{
- typename String::const_iterator p = s.begin();
- typename String::const_iterator p2 = s2.begin();
+ string::const_iterator p = s.begin();
+ string::const_iterator p2 = s2.begin();
while (p != s.end() && p2 != s2.end()) {
int const lc1 = ascii_tolower(*p);
return 1;
}
-}
-
-int compare_ascii_no_case(string const & s, string const & s2)
+int compare_ascii_no_case(docstring const & s, docstring const & s2)
{
- return do_compare_ascii_no_case(s, s2);
-}
+ docstring::const_iterator p = s.begin();
+ docstring::const_iterator p2 = s2.begin();
+ while (p != s.end() && p2 != s2.end()) {
+ char_type const lc1 = ascii_tolower(*p);
+ char_type const lc2 = ascii_tolower(*p2);
+ if (lc1 != lc2)
+ return (lc1 < lc2) ? -1 : 1;
+ ++p;
+ ++p2;
+ }
-int compare_ascii_no_case(docstring const & s, docstring const & s2)
-{
- return do_compare_ascii_no_case(s, s2);
+ if (s.size() == s2.size())
+ return 0;
+ if (s.size() < s2.size())
+ return -1;
+ return 1;
}
return char(toupper(c));
}
-// FIXME for lowercase() and uppercase() function below:
+
+// FIXME UNICODE
+// for lowercase() and uppercase() function below when wchar_t is not used:
// 1) std::tolower() and std::toupper() are templates that
// compile fine with char_type. With the test (c >= 256) we
// do not trust these function to do the right thing with
char_type lowercase(char_type c)
{
+#ifdef LIBC_WCTYPE_USES_UCS4
+ return towlower(c);
+#else
if (c >= 256)
return c;
return tolower(c);
+#endif
}
char_type uppercase(char_type c)
{
+#ifdef LIBC_WCTYPE_USES_UCS4
+ return towupper(c);
+#else
if (c >= 256)
return c;
return toupper(c);
+#endif
}
#include "support/types.h"
+#ifdef LIBC_WCTYPE_USES_UCS4
+// We can use the libc ctype functions because we unset the LC_CTYPE
+// category of the current locale in gettext.C
+#include <wctype.h>
+#else
+// Steal some code from somewhere else, e.g. glib (look at gunicode.h)
+// The code that we currently use does not really work.
+#endif
+
namespace lyx {
/// return true if the char is a line separator
inline
-bool isLineSeparatorChar(lyx::char_type c)
+bool isLineSeparatorChar(char_type c)
{
return c == ' ';
}
/// return true if a char is alphabetical (including accented chars)
inline
-bool isLetterChar(lyx::char_type c)
+bool isLetterChar(char_type c)
{
+#ifdef LIBC_WCTYPE_USES_UCS4
+ return iswalpha(c);
+#else
+ // FIXME UNICODE This is wrong!
return (c >= 'A' && c <= 'Z')
|| (c >= 'a' && c <= 'z')
|| (c >= 192 && c < 256); // in iso-8859-x these are accented chars
+#endif
}
-/// return true if the char is printable (masked to 7-bit ASCII)
+/// return true if the char is printable
inline
-bool isPrintable(lyx::char_type c)
+bool isPrintable(char_type c)
{
+#ifdef LIBC_WCTYPE_USES_UCS4
+ return iswprint(c);
+#else
+ // FIXME UNICODE This is wrong!
return (c & 127) >= ' ';
+#endif
}
-/// return true if the char is printable and not a space (masked to 7-bit ASCII)
+/// return true if the char is printable and not a space
inline
-bool isPrintableNonspace(lyx::char_type c)
+bool isPrintableNonspace(char_type c)
{
+#ifdef LIBC_WCTYPE_USES_UCS4
+ return iswprint(c) && !iswspace(c);
+#else
+ // FIXME UNICODE This is wrong!
return (c & 127) > ' ';
+#endif
}
+
/// return true if a unicode char is a digit.
inline
-bool isDigit(lyx::char_type ch)
+bool isDigit(char_type c)
{
- return ch >= '0' && ch <= '9';
+#ifdef LIBC_WCTYPE_USES_UCS4
+ return iswdigit(c);
+#else
+ // FIXME UNICODE This is wrong!
+ return c >= '0' && c <= '9';
+#endif
}