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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list