diff options
author | unknown <bar@noter.intranet.mysql.r18.ru> | 2004-09-25 15:29:33 +0500 |
---|---|---|
committer | unknown <bar@noter.intranet.mysql.r18.ru> | 2004-09-25 15:29:33 +0500 |
commit | 1325786818858aed23bf68c856006fbeb3b19206 (patch) | |
tree | 9403ba9745ae3bb3e45523fd3c5dcce277710279 /strings | |
parent | c0bb6a38828434ae2411e4a0cc16786d18936c21 (diff) | |
download | mariadb-git-1325786818858aed23bf68c856006fbeb3b19206.tar.gz |
Incorporating new faster string->number converter functions
into MY_CHARSET_INFO structure.
Diffstat (limited to 'strings')
-rw-r--r-- | strings/ctype-big5.c | 1 | ||||
-rw-r--r-- | strings/ctype-bin.c | 1 | ||||
-rw-r--r-- | strings/ctype-euc_kr.c | 1 | ||||
-rw-r--r-- | strings/ctype-gb2312.c | 1 | ||||
-rw-r--r-- | strings/ctype-gbk.c | 1 | ||||
-rw-r--r-- | strings/ctype-latin1.c | 1 | ||||
-rw-r--r-- | strings/ctype-simple.c | 7 | ||||
-rw-r--r-- | strings/ctype-sjis.c | 1 | ||||
-rw-r--r-- | strings/ctype-tis620.c | 1 | ||||
-rw-r--r-- | strings/ctype-ucs2.c | 185 | ||||
-rw-r--r-- | strings/ctype-ujis.c | 1 | ||||
-rw-r--r-- | strings/ctype-utf8.c | 1 |
12 files changed, 201 insertions, 1 deletions
diff --git a/strings/ctype-big5.c b/strings/ctype-big5.c index a7226c10ce3..8345c53202c 100644 --- a/strings/ctype-big5.c +++ b/strings/ctype-big5.c @@ -6306,6 +6306,7 @@ static MY_CHARSET_HANDLER my_charset_big5_handler= my_strntoll_8bit, my_strntoull_8bit, my_strntod_8bit, + my_strtoll10_8bit, my_scan_8bit }; diff --git a/strings/ctype-bin.c b/strings/ctype-bin.c index 42dc0ab086d..7d17f62c8d0 100644 --- a/strings/ctype-bin.c +++ b/strings/ctype-bin.c @@ -465,6 +465,7 @@ static MY_CHARSET_HANDLER my_charset_handler= my_strntoll_8bit, my_strntoull_8bit, my_strntod_8bit, + my_strtoll10_8bit, my_scan_8bit }; diff --git a/strings/ctype-euc_kr.c b/strings/ctype-euc_kr.c index 0bf9a5210ea..ee792d9c3e4 100644 --- a/strings/ctype-euc_kr.c +++ b/strings/ctype-euc_kr.c @@ -8673,6 +8673,7 @@ static MY_CHARSET_HANDLER my_charset_handler= my_strntoll_8bit, my_strntoull_8bit, my_strntod_8bit, + my_strtoll10_8bit, my_scan_8bit }; diff --git a/strings/ctype-gb2312.c b/strings/ctype-gb2312.c index 726f9fd464c..f17cc94723f 100644 --- a/strings/ctype-gb2312.c +++ b/strings/ctype-gb2312.c @@ -5724,6 +5724,7 @@ static MY_CHARSET_HANDLER my_charset_handler= my_strntoll_8bit, my_strntoull_8bit, my_strntod_8bit, + my_strtoll10_8bit, my_scan_8bit }; diff --git a/strings/ctype-gbk.c b/strings/ctype-gbk.c index 8a7df87c024..0be56e8d946 100644 --- a/strings/ctype-gbk.c +++ b/strings/ctype-gbk.c @@ -9955,6 +9955,7 @@ static MY_CHARSET_HANDLER my_charset_handler= my_strntoll_8bit, my_strntoull_8bit, my_strntod_8bit, + my_strtoll10_8bit, my_scan_8bit }; diff --git a/strings/ctype-latin1.c b/strings/ctype-latin1.c index aea517811ab..5f1850b7772 100644 --- a/strings/ctype-latin1.c +++ b/strings/ctype-latin1.c @@ -403,6 +403,7 @@ static MY_CHARSET_HANDLER my_charset_handler= my_strntoll_8bit, my_strntoull_8bit, my_strntod_8bit, + my_strtoll10_8bit, my_scan_8bit }; diff --git a/strings/ctype-simple.c b/strings/ctype-simple.c index 58535cbfc69..a9c2b07d05b 100644 --- a/strings/ctype-simple.c +++ b/strings/ctype-simple.c @@ -1283,6 +1283,12 @@ static my_bool my_coll_init_simple(CHARSET_INFO *cs, } +longlong my_strtoll10_8bit(CHARSET_INFO *cs __attribute__((unused)), + const char *nptr, char **endptr, int *error) +{ + return 0; /* my_strtoll10(nptr, endptr, error); */ +} + MY_CHARSET_HANDLER my_charset_8bit_handler= { @@ -1309,6 +1315,7 @@ MY_CHARSET_HANDLER my_charset_8bit_handler= my_strntoll_8bit, my_strntoull_8bit, my_strntod_8bit, + my_strtoll10_8bit, my_scan_8bit }; diff --git a/strings/ctype-sjis.c b/strings/ctype-sjis.c index 8ed2e9d9c0b..55ff8ac28fe 100644 --- a/strings/ctype-sjis.c +++ b/strings/ctype-sjis.c @@ -4604,6 +4604,7 @@ static MY_CHARSET_HANDLER my_charset_handler= my_strntoll_8bit, my_strntoull_8bit, my_strntod_8bit, + my_strtoll10_8bit, my_scan_8bit }; diff --git a/strings/ctype-tis620.c b/strings/ctype-tis620.c index 420c5b5582e..a2ba4783591 100644 --- a/strings/ctype-tis620.c +++ b/strings/ctype-tis620.c @@ -946,6 +946,7 @@ static MY_CHARSET_HANDLER my_charset_handler= my_strntoll_8bit, my_strntoull_8bit, my_strntod_8bit, + my_strtoll10_8bit, my_scan_8bit }; diff --git a/strings/ctype-ucs2.c b/strings/ctype-ucs2.c index 1b3dd296867..3247e1d7424 100644 --- a/strings/ctype-ucs2.c +++ b/strings/ctype-ucs2.c @@ -18,6 +18,7 @@ /* UCS2 support. Written by Alexander Barkov <bar@mysql.com> */ #include <my_global.h> +#include <my_sys.h> #include "m_string.h" #include "m_ctype.h" #include <errno.h> @@ -852,7 +853,6 @@ bs: return (negative ? -((longlong) res) : (longlong) res); } - double my_strntod_ucs2(CHARSET_INFO *cs __attribute__((unused)), char *nptr, uint length, char **endptr, int *err) @@ -1000,6 +1000,188 @@ cnv: } +#undef ULONGLONG_MAX +#define ULONGLONG_MAX (~(ulonglong) 0) +#define MAX_NEGATIVE_NUMBER ((ulonglong) LL(0x8000000000000000)) +#define INIT_CNT 9 +#define LFACTOR ULL(1000000000) +#define LFACTOR1 ULL(10000000000) +#define LFACTOR2 ULL(100000000000) + +static unsigned long lfactor[9]= +{ + 1L, 10L, 100L, 1000L, 10000L, 100000L, 1000000L, 10000000L, 100000000L +}; + + +longlong my_strtoll10_ucs2(CHARSET_INFO *cs __attribute__((unused)), + const char *nptr, char **endptr, int *error) +{ + const char *s, *end, *start, *n_end, *true_end; + unsigned char c; + unsigned long i, j, k; + ulonglong li; + int negative; + ulong cutoff, cutoff2, cutoff3; + + s= nptr; + /* If fixed length string */ + if (endptr) + { + /* Make sure string length is even */ + end= s + ((*endptr - s) / 2) * 2; + while (s < end && !s[0] && (s[1] == ' ' || s[1] == '\t')) + s+= 2; + if (s == end) + goto no_conv; + } + else + { + /* We don't support null terminated strings in UCS2 */ + goto no_conv; + } + + /* Check for a sign. */ + negative= 0; + if (!s[0] && s[1] == '-') + { + *error= -1; /* Mark as negative number */ + negative= 1; + s+= 2; + if (s == end) + goto no_conv; + cutoff= MAX_NEGATIVE_NUMBER / LFACTOR2; + cutoff2= (MAX_NEGATIVE_NUMBER % LFACTOR2) / 100; + cutoff3= MAX_NEGATIVE_NUMBER % 100; + } + else + { + *error= 0; + if (!s[0] && s[1] == '+') + { + s+= 2; + if (s == end) + goto no_conv; + } + cutoff= ULONGLONG_MAX / LFACTOR2; + cutoff2= ULONGLONG_MAX % LFACTOR2 / 100; + cutoff3= ULONGLONG_MAX % 100; + } + + /* Handle case where we have a lot of pre-zero */ + if (!s[0] && s[1] == '0') + { + i= 0; + do + { + s+= 2; + if (s == end) + goto end_i; /* Return 0 */ + } + while (!s[0] && s[1] == '0'); + n_end= s + 2 * INIT_CNT; + } + else + { + /* Read first digit to check that it's a valid number */ + if (s[0] || (c= (s[1]-'0')) > 9) + goto no_conv; + i= c; + s+= 2; + n_end= s + 2 * (INIT_CNT-1); + } + + /* Handle first 9 digits and store them in i */ + if (n_end > end) + n_end= end; + for (; s != n_end ; s+= 2) + { + if (s[0] || (c= (s[1]-'0')) > 9) + goto end_i; + i= i*10+c; + } + if (s == end) + goto end_i; + + /* Handle next 9 digits and store them in j */ + j= 0; + start= s; /* Used to know how much to shift i */ + n_end= true_end= s + 2 * INIT_CNT; + if (n_end > end) + n_end= end; + do + { + if (s[0] || (c= (s[1]-'0')) > 9) + goto end_i_and_j; + j= j*10+c; + s+= 2; + } while (s != n_end); + if (s == end) + { + if (s != true_end) + goto end_i_and_j; + goto end3; + } + if (s[0] || (c= (s[1]-'0')) > 9) + goto end3; + + /* Handle the next 1 or 2 digits and store them in k */ + k=c; + s+= 2; + if (s == end || s[0] || (c= (s[1]-'0')) > 9) + goto end4; + k= k*10+c; + s+= 2; + *endptr= (char*) s; + + /* number string should have ended here */ + if (s != end && !s[0] && (c= (s[1]-'0')) <= 9) + goto overflow; + + /* Check that we didn't get an overflow with the last digit */ + if (i > cutoff || (i == cutoff && ((j > cutoff2 || j == cutoff2) && + k > cutoff3))) + goto overflow; + li=i*LFACTOR2+ (ulonglong) j*100 + k; + return (longlong) li; + +overflow: /* *endptr is set here */ + *error= MY_ERRNO_ERANGE; + return negative ? LONGLONG_MIN : (longlong) ULONGLONG_MAX; + +end_i: + *endptr= (char*) s; + return (negative ? ((longlong) -(long) i) : (longlong) i); + +end_i_and_j: + li= (ulonglong) i * lfactor[(uint) (s-start) / 2] + j; + *endptr= (char*) s; + return (negative ? -((longlong) li) : (longlong) li); + +end3: + li=(ulonglong) i*LFACTOR+ (ulonglong) j; + *endptr= (char*) s; + return (negative ? -((longlong) li) : (longlong) li); + +end4: + li=(ulonglong) i*LFACTOR1+ (ulonglong) j * 10 + k; + *endptr= (char*) s; + if (negative) + { + if (li > MAX_NEGATIVE_NUMBER) + goto overflow; + return -((longlong) li); + } + return (longlong) li; + +no_conv: + /* There was no number to convert. */ + *error= MY_ERRNO_EDOM; + *endptr= (char *) nptr; + return 0; +} + + static uint my_numchars_ucs2(CHARSET_INFO *cs __attribute__((unused)), const char *b, const char *e) @@ -1439,6 +1621,7 @@ MY_CHARSET_HANDLER my_charset_ucs2_handler= my_strntoll_ucs2, my_strntoull_ucs2, my_strntod_ucs2, + my_strtoll10_ucs2, my_scan_8bit }; diff --git a/strings/ctype-ujis.c b/strings/ctype-ujis.c index 514f28275ca..94673a20795 100644 --- a/strings/ctype-ujis.c +++ b/strings/ctype-ujis.c @@ -8493,6 +8493,7 @@ static MY_CHARSET_HANDLER my_charset_handler= my_strntoll_8bit, my_strntoull_8bit, my_strntod_8bit, + my_strtoll10_8bit, my_scan_8bit }; diff --git a/strings/ctype-utf8.c b/strings/ctype-utf8.c index 5e339725b1a..62e97d51328 100644 --- a/strings/ctype-utf8.c +++ b/strings/ctype-utf8.c @@ -2091,6 +2091,7 @@ MY_CHARSET_HANDLER my_charset_utf8_handler= my_strntoll_8bit, my_strntoull_8bit, my_strntod_8bit, + my_strtoll10_8bit, my_scan_8bit }; |