From 46443af24862b50276982add6d9dd3aaec0e2a13 Mon Sep 17 00:00:00 2001 From: Kenichi Ishigaki Date: Fri, 27 Apr 2012 14:08:40 +0000 Subject: [PATCH] take plus/minus signs into account --- dbdimp.c | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/dbdimp.c b/dbdimp.c index f00fb69..e7f91fc 100644 --- a/dbdimp.c +++ b/dbdimp.c @@ -171,17 +171,19 @@ static int sqlite_is_number(pTHX_ const char *v, int sql_type) { const char *z = v; + const char *d = v; int neg; int digit = 0; int precision = 0; + int has_plus = 0; char format[10]; if (sql_type != SQLITE_NULL) { while (*z == ' ') { z++; v++; } } - if (*z == '-') { neg = 1; z++; } - else if (*z == '+') { neg = 0; z++; } + if (*z == '-') { neg = 1; z++; d++; } + else if (*z == '+') { neg = 0; z++; d++; has_plus = 1; } else { neg = 0; } if (!isdigit(*z)) return 0; z++; @@ -191,24 +193,24 @@ sqlite_is_number(pTHX_ const char *v, int sql_type) if (digit == 19) { int c; char tmp[22]; - strncpy(tmp, v, z - v + 1); - c = memcmp(tmp, "922337203685477580", 18) * 10; + strncpy(tmp, d, z - d + 1); + c = memcmp(tmp, "922337203685477580", 18); if (c == 0) { - c = tmp[18] - '8'; + c = tmp[18] - '7' - neg; } - if (c < neg) return 0; + if (c > 0) return 0; } #else - if (digit > 11) return 0; /* too large for i32 */ - if (digit == 11) { + if (digit > 10) return 0; /* too large for i32 */ + if (digit == 10) { int c; char tmp[14]; - strncpy(tmp, v, z - v + 1); - c = memcmp(tmp, "2147483648", 10) * 10; + strncpy(tmp, d, z - d + 1); + c = memcmp(tmp, "214748364", 9); if (c == 0) { - c = tmp[10] - '8'; + c = tmp[9] - '7' - neg; } - if (c < neg) return 0; + if (c > 0) return 0; } #endif if (*z == '.') { @@ -224,12 +226,12 @@ sqlite_is_number(pTHX_ const char *v, int sql_type) } #if defined(USE_64_BIT_INT) - if (strEQ(form("%lli", atoll(v)), v)) return 1; + if (strEQ(form((has_plus ? "+%lli" : "%lli"), atoll(v)), v)) return 1; #else - if (strEQ(form("%i", atoi(v)), v)) return 1; + if (strEQ(form((has_plus ? "+%i" : "%i"), atoi(v)), v)) return 1; #endif if (precision || sql_type == SQLITE_FLOAT) { - sprintf(format, "%%.%df", precision); + sprintf(format, (has_plus ? "+%%.%df" : "%%.%df"), precision); if (strEQ(form(format, atof(v)), v)) return 2; } return 0;