Changeset: f66320f463bb for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f66320f463bb
Modified Files:
clients/mapiclient/mclient.c
cmake/monetdb-defines.cmake
monetdb5/modules/atoms/str.c
monetdb_config.h.in
Branch: default
Log Message:
Use Posix function wcwidth if available to determine display width of
characters.
diffs (104 lines):
diff --git a/clients/mapiclient/mclient.c b/clients/mapiclient/mclient.c
--- a/clients/mapiclient/mclient.c
+++ b/clients/mapiclient/mclient.c
@@ -47,6 +47,10 @@
#include <locale.h>
+#ifdef HAVE_WCWIDTH
+#include <wchar.h>
+#endif
+
#ifdef HAVE_ICONV
#include <iconv.h>
#ifdef HAVE_NL_LANGINFO
@@ -413,6 +417,14 @@ utf8strlenmax(char *s, char *e, size_t m
c = (c << 6) | (*s & 0x3F);
if (--n == 0) {
/* last byte of a multi-byte character */
+#ifdef HAVE_WCWIDTH
+ n = wcwidth(c);
+ if (n >= 0)
+ len += n;
+ else
+ len++; /* assume width 1 if
unprintable */
+ n = 0;
+#else
len++;
/* this list was created by combining
* the code points marked as
@@ -546,7 +558,7 @@ utf8strlenmax(char *s, char *e, size_t m
len++;
else if (0x0080 <= c && c <= 0x009F)
len += 5;
-
+#endif
}
} else if ((*s & 0xE0) == 0xC0) {
assert(n == 0);
diff --git a/cmake/monetdb-defines.cmake b/cmake/monetdb-defines.cmake
--- a/cmake/monetdb-defines.cmake
+++ b/cmake/monetdb-defines.cmake
@@ -118,6 +118,7 @@ function(monetdb_configure_defines)
check_function_exists("task_info" HAVE_TASK_INFO)
check_function_exists("times" HAVE_TIMES)
check_function_exists("uname" HAVE_UNAME)
+ check_symbol_exists("wcwidth" "wchar.h" HAVE_WCWIDTH)
# Some libc versions on Linux distributions don't have it
check_symbol_exists("semtimedop" "sys/types.h;sys/ipc.h;sys/sem.h"
HAVE_SEMTIMEDOP)
cmake_push_check_state()
diff --git a/monetdb5/modules/atoms/str.c b/monetdb5/modules/atoms/str.c
--- a/monetdb5/modules/atoms/str.c
+++ b/monetdb5/modules/atoms/str.c
@@ -69,6 +69,9 @@
#include <iconv.h>
#include <locale.h>
#endif
+#ifdef HAVE_WCWIDTH
+#include <wchar.h>
+#endif
#include "mal_interpreter.h"
#include "utf8.h"
@@ -3164,6 +3167,7 @@ str_strlen(const char *restrict s)
return (int) pos;
}
+/* return the display width of s */
int
UTF8_strwidth(const char *restrict s)
{
@@ -3184,6 +3188,14 @@ UTF8_strwidth(const char *restrict s)
c = (c << 6) | (*s & 0x3F);
if (--n == 0) {
/* last byte of a multi-byte character */
+#ifdef HAVE_WCWIDTH
+ n = wcwidth(c);
+ if (n >= 0)
+ len += n;
+ else
+ len++; /* assume width 1 if
unprintable */
+ n = 0;
+#else
len++;
/* this list was created by combining
* the code points marked as
@@ -3299,6 +3311,7 @@ UTF8_strwidth(const char *restrict s)
(0x20000 <= c && c <= 0x2FFFD) ||
(0x30000 <= c && c <= 0x3FFFD))
len++;
+#endif
}
} else if ((*s & 0xE0) == 0xC0) {
assert(n == 0);
diff --git a/monetdb_config.h.in b/monetdb_config.h.in
--- a/monetdb_config.h.in
+++ b/monetdb_config.h.in
@@ -172,6 +172,7 @@
#cmakedefine HAVE_TIMES 1
#cmakedefine HAVE_TM_GMTOFF 1
#cmakedefine HAVE_UNAME 1
+#cmakedefine HAVE_WCWIDTH 1
// #cmakedefine HAVE_SEMTIMEDOP
#cmakedefine HAVE_PTHREAD_KILL 1
#cmakedefine HAVE_PTHREAD_SETNAME_NP 1
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]