mariadb/strings/atof.c
unknown 16115af97c Changed to use my_global.h
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
2001-09-14 02:54:33 +03:00

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