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