added implementations of fl_wcwidth_() and fl_wcwidth() to src/fl_utf.c

these supercede the old fl_wcwidth() code in src/xutf8/fl_wcwidth.c.
also added corresponding declarations to FL/fl_utf.c, and updated
src/Fl_Text_Buffer.c to enable the call to fl_wcwidth()



git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@7551 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
engelsman 2010-04-20 21:43:31 +00:00
parent d50ca53788
commit a10e58a690
3 changed files with 56 additions and 2 deletions

View File

@ -142,6 +142,15 @@ FL_EXPORT int fl_utf8locale();
* type of the src text. */
FL_EXPORT int fl_utf8test(const char *src, unsigned len);
/* XX: return width of "raw" ucs character in columns.
* for internal use only */
FL_EXPORT int fl_wcwidth_(unsigned int ucs);
/* XX: return width of utf-8 character string in columns.
* NOTE: this may also do C1 control character (0x80 to 0x9f) to CP1252 mapping,
* depending on original build options */
FL_EXPORT int fl_wcwidth(const char *src);
/* OD: Return true if the character is non-spacing */
FL_EXPORT unsigned int fl_nonspacing(unsigned int ucs);

View File

@ -1025,8 +1025,8 @@ int Fl_Text_Buffer::character_width(const char *src, int indent, int tabDist)
int len = fl_utf8len(c);
int ret = 0;
unsigned int ucs = fl_utf8decode(src, src+len, &ret);
int width = 1; // mk_wcwidth((wchar_t)ucs); // FIXME
// fprintf(stderr, "mk_wcwidth(%x) -> %d (%d, %d, %s)\n", ucs, width, len, ret, s);
int width = fl_wcwidth_(ucs); // FIXME
// fprintf(stderr, "mk_wcwidth(%x) -> %d (%d, %d, %s)\n", ucs, width, len, ret, src);
return width;
}
if ((c & 0x80) && !(c & 0x40)) { // other byte of UTF-8 sequence

View File

@ -856,6 +856,51 @@ int fl_utf8test(const char* src, unsigned srclen) {
return ret;
}
/* forward declare mk_wcwidth() as static so the name is not visible.
*/
static int mk_wcwidth(unsigned int ucs);
/* include the c source directly so it's contents are only visible here
*/
#include "xutf8/mk_wcwidth.c"
/** wrapper to adapt Markus Kuhn's implementation of wcwidth() for FLTK
\param [in] ucs Unicode character value
\returns width of character in columns
This is an implementation of wcwidth() and wcswidth()
(defined in IEEE Std 1002.1-2001) for Unicode.
See http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c
WARNING: this function returns widths for "raw" Unicode characters.
It does not even try to map C1 control characters (0x80 to 0x9F) to
CP1252, and C0/C1 control characters and DEL will return -1.
*/
int fl_wcwidth_(unsigned int ucs) {
return mk_wcwidth(ucs);
}
/** extended wrapper around fl_wcwidth_(unsigned int ucs) function.
\param[in] src pointer to start of UTF-8 byte sequence
\returns width of character in columns
Depending on build options, this function may map C1 control
characters (0x80 to 0x9f) to CP1252, and return the width of
that character instead. This is not the same behaviour as
fl_wcwidth_(unsigned int ucs) .
Note that other control characters and DEL will still return -1,
so if you want different behaviour, you need to test for those
characters before calling fl_wcwidth(), and handle them separately.
*/
int fl_wcwidth(const char* src) {
int len = fl_utf8len(*src);
int ret = 0;
unsigned int ucs = fl_utf8decode(src, src+len, &ret);
int width = fl_wcwidth_(ucs);
return width;
}
/** @} */
/*