Commit b226e15a authored by unknown's avatar unknown

Merge abarkov@work.mysql.com:/home/bk/mysql-4.1

into bar.mysql.r18.ru:/usr/home/bar/mysql-4.1.wrk

parents 5b62dfcd 641c7ff9
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
#include "m_string.h" #include "m_string.h"
#include "m_ctype.h" #include "m_ctype.h"
#include "my_sys.h" /* defines errno */ #include "my_sys.h" /* defines errno */
#include <errno.h>
#ifdef HAVE_CHARSET_utf8 #ifdef HAVE_CHARSET_utf8
#define HAVE_UNIDATA #define HAVE_UNIDATA
...@@ -2118,7 +2118,7 @@ static int my_ucs2_uni (CHARSET_INFO *cs __attribute__((unused)) , ...@@ -2118,7 +2118,7 @@ static int my_ucs2_uni (CHARSET_INFO *cs __attribute__((unused)) ,
my_wc_t * pwc, const uchar *s, const uchar *e) my_wc_t * pwc, const uchar *s, const uchar *e)
{ {
if (s+2 > e) /* Need 2 characters */ if (s+2 > e) /* Need 2 characters */
return MY_CS_ILSEQ; return MY_CS_TOOFEW(0);
*pwc= ((unsigned char)s[0]) * 256 + ((unsigned char)s[1]); *pwc= ((unsigned char)s[0]) * 256 + ((unsigned char)s[1]);
return 2; return 2;
...@@ -2441,458 +2441,469 @@ static int my_snprintf_ucs2(CHARSET_INFO *cs __attribute__((unused)) ...@@ -2441,458 +2441,469 @@ static int my_snprintf_ucs2(CHARSET_INFO *cs __attribute__((unused))
return my_vsnprintf_ucs2(to, n, fmt, args); return my_vsnprintf_ucs2(to, n, fmt, args);
} }
#define MY_ERRNO(x)
long my_strntol_ucs2(CHARSET_INFO *cs, long my_strntol_ucs2(CHARSET_INFO *cs,
const char *nptr, uint l, char **endptr, int base) const char *nptr, uint l, char **endptr, int base)
{ {
int negative; int negative=0;
register ulong cutoff;
register unsigned int cutlim;
register ulong i;
register const char *s;
register unsigned char c;
const char *save, *e;
int overflow; int overflow;
int cnv;
my_wc_t wc;
register unsigned int cutlim;
register ulong cutoff;
register ulong res;
register const char *s=nptr;
register const char *e=nptr+l;
const char *save;
if (base < 0 || base == 1 || base > 36) do {
base = 10; if ((cnv=cs->mb_wc(cs,&wc,s,e))>0)
s = nptr;
e = nptr+l;
for ( ; s<e && my_isspace(cs, *s) ; s++);
if (s == e)
{ {
goto noconv; switch (wc)
}
/* Check for a sign. */
if (*s == '-')
{ {
negative = 1; case ' ' : break;
++s; case '\t': break;
case '-' : negative= !negative; break;
case '+' : break;
default : goto bs;
} }
else if (*s == '+') }
else /* No more characters or bad multibyte sequence */
{ {
negative = 0; if (endptr !=NULL )
++s; *endptr = (char*)s;
my_errno = (cnv==MY_CS_ILSEQ) ? EILSEQ : EDOM;
return 0;
} }
else s+=cnv;
negative = 0; } while (1);
if (base == 16 && s[0] == '0' && my_toupper(cs,s[1]) == 'X') bs:
s += 2;
if (base == 0) if (base <= 0 || base == 1 || base > 36)
{
if (*s == '0')
{
if (my_toupper(cs,s[1]) == 'X')
{
s += 2;
base = 16;
}
else
base = 8;
}
else
base = 10; base = 10;
}
overflow = 0;
res = 0;
save = s; save = s;
cutoff = ((ulong)~0L) / (unsigned long int) base; cutoff = ((ulong)~0L) / (unsigned long int) base;
cutlim = (uint) (((ulong)~0L) % (unsigned long int) base); cutlim = (uint) (((ulong)~0L) % (unsigned long int) base);
overflow = 0; do {
i = 0; if ((cnv=cs->mb_wc(cs,&wc,s,e))>0)
for (c = *s; s != e; c = *++s)
{ {
if (my_isdigit(cs,c)) s+=cnv;
c -= '0'; if ( wc>='0' && wc<='9')
else if (my_isalpha(cs,c)) wc -= '0';
c = my_toupper(cs,c) - 'A' + 10; else if ( wc>='A' && wc<='Z')
wc = wc - 'A' + 10;
else if ( wc>='a' && wc<='z')
wc = wc - 'a' + 10;
else else
break; break;
if (c >= base) if ((int)wc >= base)
break; break;
if (i > cutoff || (i == cutoff && c > cutlim)) if (res > cutoff || (res == cutoff && wc > cutlim))
overflow = 1; overflow = 1;
else else
{ {
i *= (ulong) base; res *= (ulong) base;
i += c; res += wc;
} }
} }
else if (cnv==MY_CS_ILSEQ)
if (s == save) {
goto noconv; if (endptr !=NULL )
*endptr = (char*)s;
my_errno=EILSEQ;
return 0;
}
else
{
/* No more characters */
break;
}
} while(1);
if (endptr != NULL) if (endptr != NULL)
*endptr = (char *) s; *endptr = (char *) s;
if (s == save)
{
my_errno=EDOM;
return 0L;
}
if (negative) if (negative)
{ {
if (i > (ulong) LONG_MIN) if (res > (ulong) LONG_MIN)
overflow = 1; overflow = 1;
} }
else if (i > (ulong) LONG_MAX) else if (res > (ulong) LONG_MAX)
overflow = 1; overflow = 1;
if (overflow) if (overflow)
{ {
MY_ERRNO(ERANGE); my_errno=(ERANGE);
return negative ? LONG_MIN : LONG_MAX; return negative ? LONG_MIN : LONG_MAX;
} }
return (negative ? -((long) i) : (long) i); return (negative ? -((long) res) : (long) res);
noconv:
MY_ERRNO(EDOM);
if (endptr != NULL)
*endptr = (char *) nptr;
return 0L;
} }
ulong my_strntoul_ucs2(CHARSET_INFO *cs, ulong my_strntoul_ucs2(CHARSET_INFO *cs,
const char *nptr, uint l, char **endptr, int base) const char *nptr, uint l, char **endptr, int base)
{ {
int negative; int negative=0;
register ulong cutoff;
register unsigned int cutlim;
register ulong i;
register const char *s;
register unsigned char c;
const char *save, *e;
int overflow; int overflow;
int cnv;
my_wc_t wc;
register unsigned int cutlim;
register ulong cutoff;
register ulong res;
register const char *s=nptr;
register const char *e=nptr+l;
const char *save;
if (base < 0 || base == 1 || base > 36) do {
base = 10; if ((cnv=cs->mb_wc(cs,&wc,s,e))>0)
s = nptr;
e = nptr+l;
for( ; s<e && my_isspace(cs, *s); s++);
if (s==e)
{ {
goto noconv; switch (wc)
}
if (*s == '-')
{ {
negative = 1; case ' ' : break;
++s; case '\t': break;
case '-' : negative= !negative; break;
case '+' : break;
default : goto bs;
} }
else if (*s == '+') }
else /* No more characters or bad multibyte sequence */
{ {
negative = 0; if (endptr !=NULL )
++s; *endptr = (char*)s;
my_errno = (cnv==MY_CS_ILSEQ) ? EILSEQ : EDOM;
return 0;
} }
else s+=cnv;
negative = 0; } while (1);
if (base == 16 && s[0] == '0' && my_toupper(cs,s[1]) == 'X') bs:
s += 2;
if (base == 0) if (base <= 0 || base == 1 || base > 36)
{
if (*s == '0')
{
if (my_toupper(cs,s[1]) == 'X')
{
s += 2;
base = 16;
}
else
base = 8;
}
else
base = 10; base = 10;
}
overflow = 0;
res = 0;
save = s; save = s;
cutoff = ((ulong)~0L) / (unsigned long int) base; cutoff = ((ulong)~0L) / (unsigned long int) base;
cutlim = (uint) (((ulong)~0L) % (unsigned long int) base); cutlim = (uint) (((ulong)~0L) % (unsigned long int) base);
overflow = 0;
i = 0;
for (c = *s; s != e; c = *++s) do {
if ((cnv=cs->mb_wc(cs,&wc,s,e))>0)
{ {
if (my_isdigit(cs,c)) s+=cnv;
c -= '0'; if ( wc>='0' && wc<='9')
else if (my_isalpha(cs,c)) wc -= '0';
c = my_toupper(cs,c) - 'A' + 10; else if ( wc>='A' && wc<='Z')
wc = wc - 'A' + 10;
else if ( wc>='a' && wc<='z')
wc = wc - 'a' + 10;
else else
break; break;
if (c >= base) if ((int)wc >= base)
break; break;
if (i > cutoff || (i == cutoff && c > cutlim)) if (res > cutoff || (res == cutoff && wc > cutlim))
overflow = 1; overflow = 1;
else else
{ {
i *= (ulong) base; res *= (ulong) base;
i += c; res += wc;
} }
} }
else if (cnv==MY_CS_ILSEQ)
if (s == save) {
goto noconv; if (endptr !=NULL )
*endptr = (char*)s;
my_errno=EILSEQ;
return 0;
}
else
{
/* No more characters */
break;
}
} while(1);
if (endptr != NULL) if (endptr != NULL)
*endptr = (char *) s; *endptr = (char *) s;
if (s == save)
{
my_errno=EDOM;
return 0L;
}
if (overflow) if (overflow)
{ {
MY_ERRNO(ERANGE); my_errno=(ERANGE);
return ((ulong)~0L); return ((ulong)~0L);
} }
return (negative ? -((long) i) : (long) i); return (negative ? -((long) res) : (long) res);
noconv:
MY_ERRNO(EDOM);
if (endptr != NULL)
*endptr = (char *) nptr;
return 0L;
} }
longlong my_strntoll_ucs2(CHARSET_INFO *cs __attribute__((unused)),
longlong my_strntoll_ucs2(CHARSET_INFO *cs,
const char *nptr, uint l, char **endptr, int base) const char *nptr, uint l, char **endptr, int base)
{ {
int negative; int negative=0;
int overflow;
int cnv;
my_wc_t wc;
register ulonglong cutoff; register ulonglong cutoff;
register unsigned int cutlim; register unsigned int cutlim;
register ulonglong i; register ulonglong res;
register const char *s, *e; register const char *s=nptr;
register unsigned char c; register const char *e=nptr+l;
const char *save; const char *save;
int overflow;
if (base < 0 || base == 1 || base > 36) do {
base = 10; if ((cnv=cs->mb_wc(cs,&wc,s,e))>0)
s = nptr;
e = nptr+l;
for(; s<e && my_isspace(cs,*s); s++);
if (s == e)
{ {
goto noconv; switch (wc)
}
if (*s == '-')
{ {
negative = 1; case ' ' : break;
++s; case '\t': break;
case '-' : negative= !negative; break;
case '+' : break;
default : goto bs;
} }
else if (*s == '+') }
else /* No more characters or bad multibyte sequence */
{ {
negative = 0; if (endptr !=NULL )
++s; *endptr = (char*)s;
my_errno = (cnv==MY_CS_ILSEQ) ? EILSEQ : EDOM;
return 0;
} }
else s+=cnv;
negative = 0; } while (1);
if (base == 16 && s[0] == '0' && my_toupper(cs,s[1]) == 'X') bs:
s += 2;
if (base == 0) if (base <= 0 || base == 1 || base > 36)
{
if (*s == '0')
{
if (my_toupper(cs,s[1]) == 'X')
{
s += 2;
base = 16;
}
else
base = 8;
}
else
base = 10; base = 10;
}
overflow = 0;
res = 0;
save = s; save = s;
cutoff = (~(ulonglong) 0) / (unsigned long int) base; cutoff = (~(ulonglong) 0) / (unsigned long int) base;
cutlim = (uint) ((~(ulonglong) 0) % (unsigned long int) base); cutlim = (uint) ((~(ulonglong) 0) % (unsigned long int) base);
overflow = 0; do {
i = 0; if ((cnv=cs->mb_wc(cs,&wc,s,e))>0)
for (c = *s; s != e; c = *++s)
{ {
if (my_isdigit(cs,c)) s+=cnv;
c -= '0'; if ( wc>='0' && wc<='9')
else if (my_isalpha(cs,c)) wc -= '0';
c = my_toupper(cs,c) - 'A' + 10; else if ( wc>='A' && wc<='Z')
wc = wc - 'A' + 10;
else if ( wc>='a' && wc<='z')
wc = wc - 'a' + 10;
else else
break; break;
if (c >= base) if ((int)wc >= base)
break; break;
if (i > cutoff || (i == cutoff && c > cutlim)) if (res > cutoff || (res == cutoff && wc > cutlim))
overflow = 1; overflow = 1;
else else
{ {
i *= (ulonglong) base; res *= (ulonglong) base;
i += c; res += wc;
} }
} }
else if (cnv==MY_CS_ILSEQ)
if (s == save) {
goto noconv; if (endptr !=NULL )
*endptr = (char*)s;
my_errno=EILSEQ;
return 0;
}
else
{
/* No more characters */
break;
}
} while(1);
if (endptr != NULL) if (endptr != NULL)
*endptr = (char *) s; *endptr = (char *) s;
if (s == save)
{
my_errno=EDOM;
return 0L;
}
if (negative) if (negative)
{ {
if (i > (ulonglong) LONGLONG_MIN) if (res > (ulonglong) LONGLONG_MIN)
overflow = 1; overflow = 1;
} }
else if (i > (ulonglong) LONGLONG_MAX) else if (res > (ulonglong) LONGLONG_MAX)
overflow = 1; overflow = 1;
if (overflow) if (overflow)
{ {
MY_ERRNO(ERANGE); my_errno=(ERANGE);
return negative ? LONGLONG_MIN : LONGLONG_MAX; return negative ? LONGLONG_MIN : LONGLONG_MAX;
} }
return (negative ? -((longlong) i) : (longlong) i); return (negative ? -((longlong)res) : (longlong)res);
noconv:
MY_ERRNO(EDOM);
if (endptr != NULL)
*endptr = (char *) nptr;
return 0L;
} }
ulonglong my_strntoull_ucs2(CHARSET_INFO *cs, ulonglong my_strntoull_ucs2(CHARSET_INFO *cs,
const char *nptr, uint l, char **endptr, int base) const char *nptr, uint l, char **endptr, int base)
{ {
int negative; int negative=0;
int overflow;
int cnv;
my_wc_t wc;
register ulonglong cutoff; register ulonglong cutoff;
register unsigned int cutlim; register unsigned int cutlim;
register ulonglong i; register ulonglong res;
register const char *s, *e; register const char *s=nptr;
register unsigned char c; register const char *e=nptr+l;
const char *save; const char *save;
int overflow;
if (base < 0 || base == 1 || base > 36)
base = 10;
s = nptr;
e = nptr+l;
for(; s<e && my_isspace(cs,*s); s++); do {
if ((cnv=cs->mb_wc(cs,&wc,s,e))>0)
if (s == e)
{ {
goto noconv; switch (wc)
}
if (*s == '-')
{ {
negative = 1; case ' ' : break;
++s; case '\t': break;
case '-' : negative= !negative; break;
case '+' : break;
default : goto bs;
} }
else if (*s == '+') }
else /* No more characters or bad multibyte sequence */
{ {
negative = 0; if (endptr !=NULL )
++s; *endptr = (char*)s;
my_errno = (cnv==MY_CS_ILSEQ) ? EILSEQ : EDOM;
return 0;
} }
else s+=cnv;
negative = 0; } while (1);
if (base == 16 && s[0] == '0' && my_toupper(cs,s[1]) == 'X') bs:
s += 2;
if (base == 0) if (base <= 0 || base == 1 || base > 36)
{
if (*s == '0')
{
if (my_toupper(cs,s[1]) == 'X')
{
s += 2;
base = 16;
}
else
base = 8;
}
else
base = 10; base = 10;
}
overflow = 0;
res = 0;
save = s; save = s;
cutoff = (~(ulonglong) 0) / (unsigned long int) base; cutoff = (~(ulonglong) 0) / (unsigned long int) base;
cutlim = (uint) ((~(ulonglong) 0) % (unsigned long int) base); cutlim = (uint) ((~(ulonglong) 0) % (unsigned long int) base);
overflow = 0; do {
i = 0; if ((cnv=cs->mb_wc(cs,&wc,s,e))>0)
for (c = *s; s != e; c = *++s)
{ {
if (my_isdigit(cs,c)) s+=cnv;
c -= '0'; if ( wc>='0' && wc<='9')
else if (my_isalpha(cs,c)) wc -= '0';
c = my_toupper(cs,c) - 'A' + 10; else if ( wc>='A' && wc<='Z')
wc = wc - 'A' + 10;
else if ( wc>='a' && wc<='z')
wc = wc - 'a' + 10;
else else
break; break;
if (c >= base) if ((int)wc >= base)
break; break;
if (i > cutoff || (i == cutoff && c > cutlim)) if (res > cutoff || (res == cutoff && wc > cutlim))
overflow = 1; overflow = 1;
else else
{ {
i *= (ulonglong) base; res *= (ulonglong) base;
i += c; res += wc;
} }
} }
else if (cnv==MY_CS_ILSEQ)
if (s == save) {
goto noconv; if (endptr !=NULL )
*endptr = (char*)s;
my_errno=EILSEQ;
return 0;
}
else
{
/* No more characters */
break;
}
} while(1);
if (endptr != NULL) if (endptr != NULL)
*endptr = (char *) s; *endptr = (char *) s;
if (s == save)
{
my_errno=EDOM;
return 0L;
}
if (overflow) if (overflow)
{ {
MY_ERRNO(ERANGE); my_errno=(ERANGE);
return (~(ulonglong) 0); return (~(ulonglong) 0);
} }
return (negative ? -((longlong) i) : (longlong) i); return (negative ? -((longlong) res) : (longlong) res);
noconv:
MY_ERRNO(EDOM);
if (endptr != NULL)
*endptr = (char *) nptr;
return 0L;
} }
double my_strntod_ucs2(CHARSET_INFO *cs __attribute__((unused)), double my_strntod_ucs2(CHARSET_INFO *cs __attribute__((unused)),
const char *s, uint l, char **e) const char *nptr, uint l, char **endptr)
{ {
char buf[256]; char buf[256];
double res; double res;
register char *b=buf;
register const char *s=nptr;
register const char *e=nptr+l;
my_wc_t wc;
int cnv;
if((l+1)>sizeof(buf)) if((l+1)>sizeof(buf))
{ {
if (e) if (endptr)
memcpy(*e,s,sizeof(s)); *endptr=(char*)nptr;
my_errno=ERANGE;
return 0; return 0;
} }
strncpy(buf,s,l);
buf[l]='\0'; while ((cnv=cs->mb_wc(cs,&wc,s,e))>0)
res=strtod(buf,e); {
if (e) s+=cnv;
memcpy(*e,*e-buf+s,sizeof(s)); if (wc < 128)
{
*b++=wc;
}
else
break;
}
*b='\0';
res=strtod(buf,endptr);
if (endptr)
*endptr=(char*) (*endptr-buf+nptr);
return res; return res;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment