Changeset: ce8952f92ee7 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ce8952f92ee7
Modified Files:
sql/backends/monet5/sql_result.c
Branch: Jul2015
Log Message:
Return display width for character strings.
diffs (126 lines):
diff --git a/sql/backends/monet5/sql_result.c b/sql/backends/monet5/sql_result.c
--- a/sql/backends/monet5/sql_result.c
+++ b/sql/backends/monet5/sql_result.c
@@ -230,6 +230,91 @@ sql_timestamp_tostr(void *TS_RES, char *
}
static int
+STRwidth(const char *s)
+{
+ int len = 0;
+ int c;
+ int n;
+
+ if (GDK_STRNIL(s))
+ return int_nil;
+ c = 0;
+ n = 0;
+ while (*s != 0) {
+ if ((*s & 0x80) == 0) {
+ assert(n == 0);
+ len++;
+ n = 0;
+ } else if ((*s & 0xC0) == 0x80) {
+ c = (c << 6) | (*s & 0x3F);
+ if (--n == 0) {
+ /* last byte of a multi-byte character */
+ len++;
+ /* the following code points are all East
+ * Asian Fullwidth and East Asian Wide
+ * characters as defined in Unicode 8.0 */
+ if ((0x1100 <= c && c <= 0x115F) ||
+ c == 0x2329 ||
+ c == 0x232A ||
+ (0x2E80 <= c && c <= 0x2E99) ||
+ (0x2E9B <= c && c <= 0x2EF3) ||
+ (0x2F00 <= c && c <= 0x2FD5) ||
+ (0x2FF0 <= c && c <= 0x2FFB) ||
+ (0x3000 <= c && c <= 0x303E) ||
+ (0x3041 <= c && c <= 0x3096) ||
+ (0x3099 <= c && c <= 0x30FF) ||
+ (0x3105 <= c && c <= 0x312D) ||
+ (0x3131 <= c && c <= 0x318E) ||
+ (0x3190 <= c && c <= 0x31BA) ||
+ (0x31C0 <= c && c <= 0x31E3) ||
+ (0x31F0 <= c && c <= 0x321E) ||
+ (0x3220 <= c && c <= 0x3247) ||
+ (0x3250 <= c && c <= 0x4DBF) ||
+ (0x4E00 <= c && c <= 0xA48C) ||
+ (0xA490 <= c && c <= 0xA4C6) ||
+ (0xA960 <= c && c <= 0xA97C) ||
+ (0xAC00 <= c && c <= 0xD7A3) ||
+ (0xF900 <= c && c <= 0xFAFF) ||
+ (0xFE10 <= c && c <= 0xFE19) ||
+ (0xFE30 <= c && c <= 0xFE52) ||
+ (0xFE54 <= c && c <= 0xFE66) ||
+ (0xFE68 <= c && c <= 0xFE6B) ||
+ (0xFF01 <= c && c <= 0xFFE6) ||
+ (0x1B000 <= c && c <= 0x1B001) ||
+ (0x1F200 <= c && c <= 0x1F202) ||
+ (0x1F210 <= c && c <= 0x1F23A) ||
+ (0x1F240 <= c && c <= 0x1F248) ||
+ (0x1F250 <= c && c <= 0x1F251) ||
+ (0x20000 <= c && c <= 0x2FFFD) ||
+ (0x30000 <= c && c <= 0x3FFFD))
+ len++;
+ }
+ } else if ((*s & 0xE0) == 0xC0) {
+ assert(n == 0);
+ n = 1;
+ c = *s & 0x1F;
+ } else if ((*s & 0xF0) == 0xE0) {
+ assert(n == 0);
+ n = 2;
+ c = *s & 0x0F;
+ } else if ((*s & 0xF8) == 0xF0) {
+ assert(n == 0);
+ n = 3;
+ c = *s & 0x07;
+ } else if ((*s & 0xFC) == 0xF8) {
+ assert(n == 0);
+ n = 4;
+ c = *s & 0x03;
+ } else {
+ assert(0);
+ n = 0;
+ }
+ s++;
+ }
+ return len;
+}
+
+static int
bat_max_strlength(BAT *b)
{
BUN p, q;
@@ -238,8 +323,7 @@ bat_max_strlength(BAT *b)
BATiter bi = bat_iterator(b);
BATloop(b, p, q) {
- str v = (str) BUNtail(bi, p);
- STRLength(&l, &v);
+ l = STRwidth((const char *) BUNtail(bi, p));
if (l == int_nil)
l = 0;
@@ -582,8 +666,7 @@ static void *
return NULL;
}
if (col->type.digits > 0 && len > 0 && len > (int)
col->type.digits) {
- str v = c->data;
- STRLength(&len, &v);
+ len = STRwidth(c->data);
if (len > (int) col->type.digits)
return NULL;
}
@@ -1390,9 +1473,7 @@ export_length(stream *s, int mtype, int
*/
}
} else if (p) {
- str v = (str) p;
-
- STRLength(&l, &v);
+ l = STRwidth((const char *) p);
if (l == int_nil)
l = 0;
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list