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

Reply via email to