summaryrefslogtreecommitdiff
path: root/strings
diff options
context:
space:
mode:
authorunknown <bar@noter.intranet.mysql.r18.ru>2004-09-25 15:29:33 +0500
committerunknown <bar@noter.intranet.mysql.r18.ru>2004-09-25 15:29:33 +0500
commit1325786818858aed23bf68c856006fbeb3b19206 (patch)
tree9403ba9745ae3bb3e45523fd3c5dcce277710279 /strings
parentc0bb6a38828434ae2411e4a0cc16786d18936c21 (diff)
downloadmariadb-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.c1
-rw-r--r--strings/ctype-bin.c1
-rw-r--r--strings/ctype-euc_kr.c1
-rw-r--r--strings/ctype-gb2312.c1
-rw-r--r--strings/ctype-gbk.c1
-rw-r--r--strings/ctype-latin1.c1
-rw-r--r--strings/ctype-simple.c7
-rw-r--r--strings/ctype-sjis.c1
-rw-r--r--strings/ctype-tis620.c1
-rw-r--r--strings/ctype-ucs2.c185
-rw-r--r--strings/ctype-ujis.c1
-rw-r--r--strings/ctype-utf8.c1
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
};