mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 05:22:25 +01:00
16115af97c
Fixed problem with LIKE with latin1_de Added parsing support of UNSIGNED LONG LONG Docs/manual.texi: Changelog client/client_priv.h: Changed to use my_global.h client/completion_hash.cc: Changed to use my_global.h client/errmsg.c: Changed to use my_global.h client/get_password.c: Changed to use my_global.h client/mysqldump.c: Changed to use my_global.h client/mysqlshow.c: Changed to use my_global.h client/mysqltest.c: Changed to use my_global.h client/password.c: Changed to use my_global.h client/readline.cc: Changed to use my_global.h client/sql_string.cc: Changed to use my_global.h client/thimble.cc: Changed to use my_global.h client/thread_test.c: Changed to use my_global.h dbug/dbug.c: Changed to use my_global.h dbug/dbug_analyze.c: Changed to use my_global.h dbug/example1.c: Changed to use my_global.h dbug/example2.c: Changed to use my_global.h dbug/example3.c: Changed to use my_global.h dbug/factorial.c: Changed to use my_global.h dbug/main.c: Changed to use my_global.h dbug/sanity.c: Changed to use my_global.h extra/comp_err.c: Changed to use my_global.h extra/my_print_defaults.c: Changed to use my_global.h extra/perror.c: Changed to use my_global.h extra/replace.c: Changed to use my_global.h extra/resolve_stack_dump.c: Changed to use my_global.h extra/resolveip.c: Changed to use my_global.h fs/libmysqlfs.h: Changed to use my_global.h fs/mysqlcorbafs.h: Changed to use my_global.h heap/hp_test1.c: Changed to use my_global.h include/Makefile.am: Changed to use my_global.h include/m_ctype.h: Changed to use my_global.h include/my_base.h: Changed to use my_global.h innobase/include/univ.i: Changed to use my_global.h libmysql/dll.c: Changed to use my_global.h libmysql/errmsg.c: Changed to use my_global.h libmysql/get_password.c: Changed to use my_global.h libmysql/libmysql.c: Changed to use my_global.h libmysql/net.c: Changed to use my_global.h libmysql/password.c: Changed to use my_global.h libmysqld/lib_sql.cc: Changed to use my_global.h libmysqld/lib_vio.c: Changed to use my_global.h libmysqld/libmysqld.c: Changed to use my_global.h mysql-test/mysql-test-run.sh: Changed to use latin1 as default character set mysql-test/r/ctype_latin1_de.result: Changed to use my_global.h mysql-test/r/func_like.result: New test mysql-test/t/ctype_latin1_de.test: Added test of part keys mysql-test/t/func_like.test: New test mysys/checksum.c: Changed to use my_global.h mysys/getopt.c: Changed to use my_global.h mysys/getopt1.c: Changed to use my_global.h mysys/make-conf.c: Changed to use my_global.h mysys/my_alloc.c: Changed to use my_global.h mysys/my_clock.c: Changed to use my_global.h mysys/my_compress.c: Changed to use my_global.h mysys/mysys_priv.h: Changed to use my_global.h mysys/test_charset.c: Changed to use my_global.h mysys/testhash.c: Changed to use my_global.h mysys/thr_alarm.c: Changed to use my_global.h mysys/thr_mutex.c: Changed to use my_global.h regex/debug.c: Changed to use my_global.h regex/main.c: Changed to use my_global.h regex/regcomp.c: Changed to use my_global.h regex/regerror.c: Changed to use my_global.h regex/regexec.c: Changed to use my_global.h regex/regexp.c: Changed to use my_global.h regex/regfree.c: Changed to use my_global.h regex/reginit.c: Changed to use my_global.h sql/cache_manager.cc: Changed to use my_global.h sql/gen_lex_hash.cc: Changed to use my_global.h sql/ha_berkeley.cc: Fixed problem with UNIQUE keys that could contain NULL sql/ha_gemini.h: Changed to use my_global.h sql/handler.cc: Fixed problem after merge sql/item.cc: Added Item_unit sql/item.h: Added Item_uint sql/matherr.c: Changed to use my_global.h sql/md5.c: Changed to use my_global.h sql/mini_client.cc: Changed to use my_global.h sql/my_lock.c: Changed to use my_global.h sql/mysql_priv.h: Changed to use my_global.h sql/net_serv.cc: Changed to use my_global.h sql/password.c: Changed to use my_global.h sql/sql_lex.cc: Added parsing support of UNSIGNED LONG LONG sql/sql_show.cc: Changed to use my_global.h sql/sql_string.cc: Changed to use my_global.h sql/sql_yacc.yy: Added usage of Int_uint sql/stacktrace.c: Changed to use my_global.h sql/udf_example.cc: Changed to use my_global.h strings/atof.c: Changed to use my_global.h strings/bchange.c: Changed to use my_global.h strings/bcmp.c: Changed to use my_global.h strings/bfill.c: Changed to use my_global.h strings/bmove.c: Changed to use my_global.h strings/bmove512.c: Changed to use my_global.h strings/bmove_upp.c: Changed to use my_global.h strings/ctype-big5.c: Changed to use my_global.h strings/ctype-czech.c: Changed to use my_global.h strings/ctype-euc_kr.c: Changed to use my_global.h strings/ctype-gb2312.c: Changed to use my_global.h strings/ctype-gbk.c: Changed to use my_global.h strings/ctype-latin1_de.c: Fixed problem with LIKE strings/ctype-sjis.c: Changed to use my_global.h strings/ctype-tis620.c: Changed to use my_global.h strings/ctype-ujis.c: Changed to use my_global.h strings/ctype.c: Changed to use my_global.h strings/do_ctype.c: Changed to use my_global.h strings/int2str.c: Changed to use my_global.h strings/is_prefix.c: Changed to use my_global.h strings/llstr.c: Changed to use my_global.h strings/longlong2str.c: Changed to use my_global.h strings/r_strinstr.c: Changed to use my_global.h strings/str2int.c: Changed to use my_global.h strings/str_test.c: Changed to use my_global.h strings/strappend.c: Changed to use my_global.h strings/strcend.c: Changed to use my_global.h strings/strcont.c: Changed to use my_global.h strings/strend.c: Changed to use my_global.h strings/strfill.c: Changed to use my_global.h strings/strings-not-used.h: Changed to use my_global.h strings/strinstr.c: Changed to use my_global.h strings/strmake.c: Changed to use my_global.h strings/strmov.c: Changed to use my_global.h strings/strnlen.c: Changed to use my_global.h strings/strnmov.c: Changed to use my_global.h strings/strstr.c: Changed to use my_global.h strings/strto.c: Changed to use my_global.h strings/strtol.c: Changed to use my_global.h strings/strtoll.c: Changed to use my_global.h strings/strtoul.c: Changed to use my_global.h strings/strtoull.c: Changed to use my_global.h strings/strxmov.c: Changed to use my_global.h strings/strxnmov.c: Changed to use my_global.h strings/udiv.c: Changed to use my_global.h tools/mysqlmanager.c: Changed to use my_global.h vio/test-ssl.c: Changed to use my_global.h vio/test-sslclient.c: Changed to use my_global.h vio/test-sslserver.c: Changed to use my_global.h vio/test-ssl: Changed to use my_global.h vio/vio.c: Changed to use my_global.h vio/viosocket.c: Changed to use my_global.h vio/viossl.c: Changed to use my_global.h vio/viosslfactories.c: Changed to use my_global.h vio/viotest-ssl.c: Changed to use my_global.h
208 lines
4.9 KiB
C
208 lines
4.9 KiB
C
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Library General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2 of the License, or (at your option) any later version.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Library General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Library General Public
|
|
License along with this library; if not, write to the Free
|
|
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
|
MA 02111-1307, USA */
|
|
|
|
/*
|
|
A quicker atof. About 2-10 times faster than standard atof on sparc.
|
|
This don't handle iee-options (NaN...) and the presission :s is a little
|
|
less for some high exponential numbers (+-1 at 14th place).
|
|
Returns 0.0 if overflow or wrong number.
|
|
Must be inited with init_my_atof to handle possibly overflows.
|
|
*/
|
|
|
|
#include <my_global.h>
|
|
#ifdef USE_MY_ATOF /* Skipp if we don't want it */
|
|
#include <m_ctype.h>
|
|
#include <floatingpoint.h>
|
|
#include <signal.h>
|
|
|
|
/* Read a double. If float is wrong return 0.
|
|
float ::= [space]* [sign] {digit}+ decimal-point {digit}+ [exponent] |
|
|
[sign] {digit}+ [decimal-point {digit}*] exponent |
|
|
[sign] {digit}+ decimal-point [{digit}*] exponent |
|
|
[sign] decimal-point {digit}* exponent |
|
|
exponent :: = exponent-marker [sign] {digit}+
|
|
exponent-marker ::= E e
|
|
*/
|
|
|
|
|
|
#define is_exponent_marker(ch) (ch == 'E' || ch == 'e')
|
|
|
|
static void my_atof_overflow _A((int sig,int code, struct sigcontext *scp,
|
|
char *addr));
|
|
static int parse_sign _A((char **str));
|
|
static void parse_float_number_part _A((char **str,double *number, int *length));
|
|
static void parse_decimal_number_part _A((char **str,double *number));
|
|
static int parse_int_number_part _A((char **str,uint *number));
|
|
|
|
static int volatile overflow,in_my_atof;
|
|
static sigfpe_handler_type old_overflow_handler;
|
|
|
|
void init_my_atof()
|
|
{
|
|
old_overflow_handler = (sigfpe_handler_type)
|
|
ieee_handler("get", "overflow", old_overflow_handler);
|
|
VOID(ieee_handler("set", "overflow", my_atof_overflow));
|
|
return;
|
|
}
|
|
|
|
static void my_atof_overflow(sig, code, scp, addr)
|
|
int sig;
|
|
int code;
|
|
struct sigcontext *scp;
|
|
char *addr;
|
|
{
|
|
if (!in_my_atof)
|
|
old_overflow_handler(sig,code,scp,addr);
|
|
else
|
|
overflow=1;
|
|
return;
|
|
}
|
|
|
|
double my_atof(src)
|
|
const char *src;
|
|
{
|
|
int sign, exp_sign; /* is number negative (+1) or positive (-1) */
|
|
int length_before_point;
|
|
double after_point; /* Number after decimal point and before exp */
|
|
uint exponent; /* Exponent value */
|
|
double exp_log,exp_val;
|
|
char *tmp_src;
|
|
double result_number;
|
|
|
|
tmp_src = (char*) src;
|
|
while (isspace(tmp_src[0]))
|
|
tmp_src++; /* Skipp pre-space */
|
|
sign = parse_sign(&tmp_src);
|
|
overflow=0;
|
|
in_my_atof=1;
|
|
parse_float_number_part(&tmp_src, &result_number, &length_before_point);
|
|
if (*tmp_src == '.')
|
|
{
|
|
tmp_src++;
|
|
parse_decimal_number_part(&tmp_src, &after_point);
|
|
result_number += after_point;
|
|
}
|
|
else if (length_before_point == 0)
|
|
{
|
|
in_my_atof=0;
|
|
return 0.0;
|
|
}
|
|
if (is_exponent_marker(*tmp_src))
|
|
{
|
|
tmp_src++;
|
|
exp_sign = parse_sign(&tmp_src);
|
|
overflow|=parse_int_number_part(&tmp_src, &exponent);
|
|
|
|
exp_log=10.0; exp_val=1.0;
|
|
for (;;)
|
|
{
|
|
if (exponent & 1)
|
|
{
|
|
exp_val*= exp_log;
|
|
exponent--;
|
|
}
|
|
if (!exponent)
|
|
break;
|
|
exp_log*=exp_log;
|
|
exponent>>=1;
|
|
}
|
|
if (exp_sign < 0)
|
|
result_number*=exp_val;
|
|
else
|
|
result_number/=exp_val;
|
|
}
|
|
if (sign > 0)
|
|
result_number= -result_number;
|
|
|
|
in_my_atof=0;
|
|
if (overflow)
|
|
return 0.0;
|
|
return result_number;
|
|
}
|
|
|
|
|
|
static int parse_sign(str)
|
|
char **str;
|
|
{
|
|
if (**str == '-')
|
|
{
|
|
(*str)++;
|
|
return 1;
|
|
}
|
|
if (**str == '+')
|
|
(*str)++;
|
|
return -1;
|
|
}
|
|
|
|
/* Get number with may be separated with ',' */
|
|
|
|
static void parse_float_number_part(str, number, length)
|
|
char **str;
|
|
double *number;
|
|
int *length;
|
|
{
|
|
*number = 0;
|
|
*length = 0;
|
|
|
|
for (;;)
|
|
{
|
|
while (isdigit(**str))
|
|
{
|
|
(*length)++;
|
|
*number = (*number * 10) + (**str - '0');
|
|
(*str)++;
|
|
}
|
|
if (**str != ',')
|
|
return; /* Skipp possibly ',' */
|
|
(*str)++;
|
|
}
|
|
}
|
|
|
|
static void parse_decimal_number_part(str, number)
|
|
char **str;
|
|
double *number;
|
|
{
|
|
double exp_log;
|
|
|
|
*number = 0;
|
|
exp_log=1/10.0;
|
|
while (isdigit(**str))
|
|
{
|
|
*number+= (**str - '0')*exp_log;
|
|
exp_log/=10;
|
|
(*str)++;
|
|
}
|
|
}
|
|
|
|
/* Parses int suitably for exponent */
|
|
|
|
static int parse_int_number_part(str, number)
|
|
char **str;
|
|
uint *number;
|
|
{
|
|
*number = 0;
|
|
while (isdigit(**str))
|
|
{
|
|
if (*number >= ((uint) ~0)/10)
|
|
return 1; /* Don't overflow */
|
|
*number = (*number * 10) + **str - '0';
|
|
(*str)++;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
#endif
|