Changeset: ecf699f1046c for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ecf699f1046c
Modified Files:
        gdk/gdk_atoms.c
Branch: default
Log Message:

Merge with Oct2014 branch.


diffs (122 lines):

diff --git a/gdk/gdk_atoms.c b/gdk/gdk_atoms.c
--- a/gdk/gdk_atoms.c
+++ b/gdk/gdk_atoms.c
@@ -583,56 +583,47 @@ numFromStr(const char *src, int *len, vo
        int sz = ATOMsize(tp);
 #ifdef HAVE_HGE
        hge base = 0;
-       hge maxdiv10 = 0;       /* max value / 10 */
+       const hge maxdiv10 = GDK_hge_max / 10;
 #else
        lng base = 0;
-       lng maxdiv10 = 0;       /* max value / 10 */
+       const lng maxdiv10 = LL_CONSTANT(922337203685477580); /*7*/
 #endif
-       int maxmod10 = 7;       /* max value % 10 */
-       int sign = 1;
+       const int maxmod10 = 7; /* max value % 10 */
+       int sign;
 
        atommem(void, sz);
        while (GDKisspace(*p))
                p++;
-       memcpy(*dst, ATOMnilptr(tp), sz);
-       if (p[0] == 'n' && p[1] == 'i' && p[2] == 'l') {
-               p += 3;
-               return (int) (p - src);
-       }
-       if (*p == '-') {
+       switch (*p) {
+       case 'n':
+               memcpy(*dst, ATOMnilptr(tp), sz);
+               if (p[1] == 'i' && p[2] == 'l') {
+                       p += 3;
+                       return (int) (p - src);
+               }
+               /* not a number */
+               return 0;
+       case '-':
                sign = -1;
                p++;
-       } else if (*p == '+') {
+               break;
+       case '+':
                p++;
+               /* fall through */
+       default:
+               sign = 1;
+               break;
        }
        if (!num10(*p)) {
                /* not a number */
+               memcpy(*dst, ATOMnilptr(tp), sz);
                return 0;
        }
-       switch (sz) {
-       case 1:
-               maxdiv10 = 12/*7*/;
-               break;
-       case 2:
-               maxdiv10 = 3276/*7*/;
-               break;
-       case 4:
-               maxdiv10 = 214748364/*7*/;
-               break;
-       case 8:
-               maxdiv10 = LL_CONSTANT(922337203685477580)/*7*/;
-               break;
-#ifdef HAVE_HGE
-       case 16:
-               maxdiv10 = GDK_hge_max / 10;
-               //         17014118346046923173168730371588410572/*7*/;
-               break;
-#endif
-       }
        do {
                if (base > maxdiv10 ||
                    (base == maxdiv10 && base10(*p) > maxmod10)) {
                        /* overflow */
+                       memcpy(*dst, ATOMnilptr(tp), sz);
                        return 0;
                }
                base = 10 * base + base10(*p);
@@ -642,21 +633,39 @@ numFromStr(const char *src, int *len, vo
        switch (sz) {
        case 1: {
                bte **dstbte = (bte **) dst;
+               if (base <= GDK_bte_min || base > GDK_bte_max) {
+                       **dstbte = bte_nil;
+                       return 0;
+               }
                **dstbte = (bte) base;
                break;
        }
        case 2: {
                sht **dstsht = (sht **) dst;
+               if (base <= GDK_sht_min || base > GDK_sht_max) {
+                       **dstsht = sht_nil;
+                       return 0;
+               }
                **dstsht = (sht) base;
                break;
        }
        case 4: {
                int **dstint = (int **) dst;
+               if (base <= GDK_int_min || base > GDK_int_max) {
+                       **dstint = int_nil;
+                       return 0;
+               }
                **dstint = (int) base;
                break;
        }
        case 8: {
                lng **dstlng = (lng **) dst;
+#ifdef HAVE_HGE
+               if (base <= GDK_lng_min || base > GDK_lng_max) {
+                       **dstlng = lng_nil;
+                       return 0;
+               }
+#endif
                **dstlng = (lng) base;
                if (p[0] == 'L' && p[1] == 'L')
                        p += 2;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to