From 6f67bb961688ba66d05da61ef8c80da0d50faa96 Mon Sep 17 00:00:00 2001 From: Bowon Ryu Date: Tue, 28 Jun 2016 19:46:51 +0900 Subject: [PATCH] Fix compilation error on windows os. Since the windows platform doesn't have dlfcn.h, it failed to compile on it. Instead we ignore the header inclusion on Windows os. Acutally, This change come up with upstream partial migration about Evil. Change-Id: If3498ee7bacb8b59ff0e135ddcca872bd439c956 --- configure.ac | 20 +- m4/efl_check_funcs.m4 | 6 +- src/Makefile_Evil.am | 35 +- src/bin/evil/evil_test_dlfcn.c | 1 - src/bin/evil/evil_test_link.c | 1 + src/lib/eina/eina_module.c | 2 +- src/lib/eina/eina_prefix.c | 2 +- src/lib/eo/eo.c | 2 +- src/lib/ethumb/ethumb.c | 1 - src/lib/evil/Evil.h | 110 +-- src/lib/evil/dirent.h | 4 + src/lib/evil/dlfcn.c | 348 -------- src/lib/evil/dlfcn.h | 268 ------ src/lib/evil/evil_dirent.c | 11 +- src/lib/evil/evil_fcntl.c | 9 +- src/lib/evil/evil_inet.c | 1 - src/lib/evil/evil_inet.h | 14 - src/lib/evil/evil_langinfo.c | 6 +- src/lib/evil/evil_libgen.c | 3 +- src/lib/evil/evil_macro.h | 88 +- src/lib/evil/evil_macro_pop.h | 64 +- src/lib/evil/evil_main.c | 8 +- src/lib/evil/evil_mman.c | 7 +- src/lib/evil/evil_private.h | 6 - src/lib/evil/evil_pwd.c | 9 +- src/lib/evil/evil_stdio.c | 5 +- src/lib/evil/evil_stdio.h | 15 - src/lib/evil/evil_stdlib.c | 5 +- src/lib/evil/evil_stdlib.h | 4 + src/lib/evil/evil_string.c | 17 +- src/lib/evil/evil_string.h | 22 - src/lib/evil/evil_time.c | 6 +- src/lib/evil/evil_time.h | 10 - src/lib/evil/evil_unistd.c | 49 +- src/lib/evil/evil_unistd.h | 88 -- src/lib/evil/evil_util.c | 16 +- src/lib/evil/gdtoa/README | 357 -------- src/lib/evil/gdtoa/README.mingw | 20 - src/lib/evil/gdtoa/arithchk.c | 192 ---- src/lib/evil/gdtoa/dmisc.c | 196 ----- src/lib/evil/gdtoa/dtoa.c | 750 ---------------- src/lib/evil/gdtoa/g__fmt.c | 142 --- src/lib/evil/gdtoa/g_dfmt.c | 90 -- src/lib/evil/gdtoa/g_ffmt.c | 88 -- src/lib/evil/gdtoa/g_xfmt.c | 143 --- src/lib/evil/gdtoa/gd_arith.h | 6 - src/lib/evil/gdtoa/gd_qnan.h | 12 - src/lib/evil/gdtoa/gdtoa.c | 733 --------------- src/lib/evil/gdtoa/gdtoa.h | 121 --- src/lib/evil/gdtoa/gdtoa_fltrnds.h | 18 - src/lib/evil/gdtoa/gdtoaimp.h | 645 -------------- src/lib/evil/gdtoa/gethex.c | 340 ------- src/lib/evil/gdtoa/gmisc.c | 76 -- src/lib/evil/gdtoa/hd_init.c | 49 -- src/lib/evil/gdtoa/hexnan.c | 139 --- src/lib/evil/gdtoa/misc.c | 860 ------------------ src/lib/evil/gdtoa/qnan.c | 116 --- src/lib/evil/gdtoa/smisc.c | 149 ---- src/lib/evil/gdtoa/strtodg.c | 979 --------------------- src/lib/evil/gdtoa/strtof.c | 77 -- src/lib/evil/gdtoa/strtopx.c | 119 --- src/lib/evil/gdtoa/sum.c | 91 -- src/lib/evil/gdtoa/ulp.c | 61 -- src/lib/evil/regex/regcomp.c | 3 +- src/lib/evil/sys/mman.h | 3 + src/modules/evas/engines/gl_common/evas_gl_api.c | 5 +- .../evas/engines/gl_common/evas_gl_api_ext.c | 4 +- .../evas/engines/gl_common/evas_gl_api_gles1.c | 4 +- .../evas/engines/gl_common/evas_gl_common.h | 6 +- .../evas/engines/gl_common/evas_gl_context.c | 2 +- src/modules/evas/engines/gl_common/evas_gl_core.c | 5 +- src/modules/evas/engines/gl_generic/evas_engine.c | 2 +- .../evas/engines/software_generic/evas_engine.c | 4 +- .../engines/software_generic/evas_native_tbm.c | 2 +- src/tests/evas/evas_test_evasgl.c | 5 +- src/tests/evil/evil_suite.c | 89 +- src/tests/evil/evil_test_dlfcn.c | 1 - 77 files changed, 192 insertions(+), 7775 deletions(-) delete mode 100644 src/lib/evil/dlfcn.c delete mode 100644 src/lib/evil/dlfcn.h delete mode 100644 src/lib/evil/gdtoa/README delete mode 100644 src/lib/evil/gdtoa/README.mingw delete mode 100644 src/lib/evil/gdtoa/arithchk.c delete mode 100644 src/lib/evil/gdtoa/dmisc.c delete mode 100644 src/lib/evil/gdtoa/dtoa.c delete mode 100644 src/lib/evil/gdtoa/g__fmt.c delete mode 100644 src/lib/evil/gdtoa/g_dfmt.c delete mode 100644 src/lib/evil/gdtoa/g_ffmt.c delete mode 100644 src/lib/evil/gdtoa/g_xfmt.c delete mode 100644 src/lib/evil/gdtoa/gd_arith.h delete mode 100644 src/lib/evil/gdtoa/gd_qnan.h delete mode 100644 src/lib/evil/gdtoa/gdtoa.c delete mode 100644 src/lib/evil/gdtoa/gdtoa.h delete mode 100644 src/lib/evil/gdtoa/gdtoa_fltrnds.h delete mode 100644 src/lib/evil/gdtoa/gdtoaimp.h delete mode 100644 src/lib/evil/gdtoa/gethex.c delete mode 100644 src/lib/evil/gdtoa/gmisc.c delete mode 100644 src/lib/evil/gdtoa/hd_init.c delete mode 100644 src/lib/evil/gdtoa/hexnan.c delete mode 100644 src/lib/evil/gdtoa/misc.c delete mode 100644 src/lib/evil/gdtoa/qnan.c delete mode 100644 src/lib/evil/gdtoa/smisc.c delete mode 100644 src/lib/evil/gdtoa/strtodg.c delete mode 100644 src/lib/evil/gdtoa/strtof.c delete mode 100644 src/lib/evil/gdtoa/strtopx.c delete mode 100644 src/lib/evil/gdtoa/sum.c delete mode 100644 src/lib/evil/gdtoa/ulp.c diff --git a/configure.ac b/configure.ac index ce42ec9..2b47394 100755 --- a/configure.ac +++ b/configure.ac @@ -709,8 +709,6 @@ fi AM_CONDITIONAL([WANT_SYSTEMD], [test "${want_systemd}" = "yes"]) AM_CONDITIONAL([HAVE_SYSTEMD], [test "${want_systemd}" = "yes" -a "${have_systemd_pkg}" = "yes"]) #### Platform-dependent -DL_LIBS="" -DL_INTERNAL_LIBS="" #### Evil EFL_LIB_START_OPTIONAL([Evil], [test "${have_windows}" = "yes"]) @@ -724,11 +722,7 @@ EFL_SELECT_WINDOWS_VERSION ### Checks for libraries -EFL_ADD_LIBS([EVIL], [-lole32 -lws2_32 -lsecur32 -luuid]) -EVIL_DLFCN_LIBS="-lpsapi" - - -AC_SUBST([EVIL_DLFCN_LIBS]) +EFL_ADD_LIBS([EVIL], [-lpsapi -lole32 -lws2_32 -lsecur32 -luuid]) ### Checks for header files @@ -738,7 +732,7 @@ AC_SUBST([EVIL_DLFCN_LIBS]) ### Checks for compiler characteristics -EVIL_DLFCN_CPPFLAGS="-DEFL_EVIL_DLFCN_BUILD -DPSAPI_VERSION=1" +EVIL_CPPFLAGS="-DPSAPI_VERSION=1" # TODO: should we have these at EFL (global?) # Note: these warnings should not be used with C++ code EVIL_CFLAGS_WRN="-Wdeclaration-after-statement -Wmissing-prototypes -Wstrict-prototypes -Wredundant-decls" @@ -749,7 +743,7 @@ if test "x${have_win32}" = "xyes" ; then EVIL_CXXFLAGS="-fno-rtti -fno-exceptions -DSECURITY_WIN32 ${EVIL_CXXFLAGS}" fi -AC_SUBST([EVIL_DLFCN_CPPFLAGS]) +AC_SUBST([EVIL_CPPFLAGS]) AC_SUBST([EVIL_CFLAGS_WRN]) AC_SUBST([EVIL_CXXFLAGS]) @@ -757,9 +751,6 @@ AC_SUBST([EVIL_CXXFLAGS]) ### Checks for library functions -DL_LIBS="lib/evil/libdl.la" -DL_INTERNAL_LIBS="lib/evil/libdl.la" - EFL_LIB_END_OPTIONAL([Evil]) AC_SUBST([USE_EVIL_CFLAGS]) @@ -2793,7 +2784,10 @@ EFL_INTERNAL_DEPEND_PKG([ECORE_INPUT], [ecore]) EFL_INTERNAL_DEPEND_PKG([ECORE_INPUT], [eo]) EFL_INTERNAL_DEPEND_PKG([ECORE_INPUT], [eina]) -EFL_ADD_LIBS([ECORE_INPUT], [-ludev]) +if test "x${have_win32}" = "xno" ; then + EFL_ADD_LIBS([ECORE_INPUT], [-ludev]) +fi + ### Checks for header files ### Checks for types diff --git a/m4/efl_check_funcs.m4 b/m4/efl_check_funcs.m4 index e538db7..d48e02c 100644 --- a/m4/efl_check_funcs.m4 +++ b/m4/efl_check_funcs.m4 @@ -71,7 +71,7 @@ esac case "$host_os" in mingw*) $2="yes" - EFL_ADD_LIBS([$1], [lib/evil/libdl.la]) + EFL_ADD_LIBS([$1], [-levil]) ;; *) EFL_FIND_LIB_FOR_CODE([$1], [$dllibs], [$2], [[ @@ -100,7 +100,7 @@ esac case "$host_os" in mingw*) $2="yes" - EFL_ADD_LIBS([$1], [lib/evil/libdl.la]) + EFL_ADD_LIBS([$1], [-levil]) ;; *) EFL_FIND_LIB_FOR_CODE([$1], [$dllibs], [$2], [[ @@ -125,7 +125,7 @@ esac case "$host_os" in mingw*) $2="yes" - EFL_ADD_LIBS([$1], [lib/evil/libdl.la]) + EFL_ADD_LIBS([$1], [-levil]) ;; *) EFL_FIND_LIB_FOR_CODE([$1], [$dllibs], [$2], [[ diff --git a/src/Makefile_Evil.am b/src/Makefile_Evil.am index 4f9ae3f..e6120cd 100644 --- a/src/Makefile_Evil.am +++ b/src/Makefile_Evil.am @@ -2,16 +2,19 @@ if HAVE_WINDOWS ### Library -lib_LTLIBRARIES += lib/evil/libevil.la lib/evil/libdl.la +lib_LTLIBRARIES += lib/evil/libevil.la install_evilheadersdir = $(includedir)/evil-@VMAJ@ dist_install_evilheaders_DATA = \ lib/evil/Evil.h \ +lib/evil/evil_dlfcn.h \ lib/evil/evil_fcntl.h \ lib/evil/evil_inet.h \ lib/evil/evil_langinfo.h \ +lib/evil/evil_locale.h \ lib/evil/evil_macro.h \ lib/evil/evil_macro_pop.h \ +lib/evil/evil_macro_wrapper.h \ lib/evil/evil_main.h \ lib/evil/evil_stdio.h \ lib/evil/evil_stdlib.h \ @@ -20,7 +23,6 @@ lib/evil/evil_time.h \ lib/evil/evil_unistd.h \ lib/evil/evil_util.h \ lib/evil/dirent.h \ -lib/evil/dlfcn.h \ lib/evil/fnmatch.h \ lib/evil/pwd.h @@ -30,11 +32,13 @@ lib/evil/sys/mman.h lib_evil_libevil_la_SOURCES = \ lib/evil/evil_dirent.c \ +lib/evil/evil_dlfcn.c \ lib/evil/evil_fcntl.c \ lib/evil/evil_fnmatch.c \ lib/evil/evil_fnmatch_list_of_states.c \ lib/evil/evil_inet.c \ lib/evil/evil_langinfo.c \ +lib/evil/evil_locale.c \ lib/evil/evil_link_xp.cpp \ lib/evil/evil_main.c \ lib/evil/evil_mman.c \ @@ -48,6 +52,7 @@ lib/evil/evil_util.c \ lib/evil/evil_private.h \ lib/evil/evil_fnmatch_private.h +lib_evil_libevil_la_CPPFLAGS = @EVIL_CPPFLAGS@ lib_evil_libevil_la_CFLAGS = @EVIL_CFLAGS@ @EVIL_CFLAGS_WRN@ -D__USE_MINGW_ANSI_STDIO lib_evil_libevil_la_CXXFLAGS = @EVIL_CXXFLAGS@ @EVIL_CFLAGS@ lib_evil_libevil_la_LIBADD = @EVIL_LIBS@ @@ -68,23 +73,11 @@ lib/evil/regex/cname.h \ lib/evil/regex/regex2.h \ lib/evil/regex/utils.h -lib_evil_libevil_la_CPPFLAGS = \ +lib_evil_libevil_la_CPPFLAGS += \ -I$(top_srcdir)/src/lib/evil \ -I$(top_srcdir)/src/lib/evil/regex \ -DPOSIX_MISTAKE -#libdl - -lib_evil_libdl_la_SOURCES = lib/evil/dlfcn.c - -lib_evil_libdl_la_CPPFLAGS = \ --I$(top_builddir)/src/lib/efl \ -@EVIL_CFLAGS@ \ -@EVIL_DLFCN_CPPFLAGS@ -lib_evil_libdl_la_LIBADD = @USE_EVIL_LIBS@ @EVIL_DLFCN_LIBS@ -lib_evil_libdl_la_LDFLAGS = @EFL_LTLIBRARY_FLAGS@ -lib_evil_libdl_la_DEPENDENCIES = @USE_EVIL_INTERNAL_LIBS@ - ### Binary bin_PROGRAMS += bin/evil/evil_suite bin/evil/test_evil @@ -114,15 +107,15 @@ bin/evil/evil_test_realpath.h \ bin/evil/evil_test_util.h -#suite_SOURCES += bin/evil/memcpy_glibc_i686.S # see EXTRA_DIST below! +#suite_SOURCES += bin/evil/memcpy_glibc_i686.S # see EXTRA_DIST2 below! bin_evil_evil_suite_CPPFLAGS = -I$(top_builddir)/src/lib/efl @EVIL_CFLAGS@ -bin_evil_evil_suite_LDADD = @USE_EVIL_LIBS@ @DL_LIBS@ -lm -bin_evil_evil_suite_DEPENDENCIES = @USE_EVIL_INTERNAL_LIBS@ @DL_INTERNAL_LIBS@ +bin_evil_evil_suite_LDADD = @USE_EVIL_LIBS@ -lm +bin_evil_evil_suite_DEPENDENCIES = @USE_EVIL_INTERNAL_LIBS@ bin_evil_test_evil_SOURCES = bin/evil/test_evil.c bin_evil_test_evil_LDADD = @USE_EVIL_LIBS@ -bin_evil_test_evil_DEPENDENCIES = @USE_EVIL_INTERNAL_LIBS@ @DL_INTERNAL_LIBS@ +bin_evil_test_evil_DEPENDENCIES = @USE_EVIL_INTERNAL_LIBS@ ### Unit tests @@ -144,8 +137,8 @@ tests_evil_evil_suite_CPPFLAGS = \ -DTESTS_BUILD_DIR=PACKAGE_BUILD_DIR \ @CHECK_CFLAGS@ \ @EVIL_CFLAGS@ -tests_evil_evil_suite_LDADD = @USE_EVIL_LIBS@ @DL_LIBS@ @CHECK_LIBS@ -tests_evil_evil_suite_DEPENDENCIES = @USE_EVIL_INTERNAL_LIBS@ @DL_INTERNAL_LIBS@ +tests_evil_evil_suite_LDADD = @USE_EVIL_LIBS@ @CHECK_LIBS@ +tests_evil_evil_suite_DEPENDENCIES = @USE_EVIL_INTERNAL_LIBS@ endif diff --git a/src/bin/evil/evil_test_dlfcn.c b/src/bin/evil/evil_test_dlfcn.c index b84a9eb..605f5c4 100644 --- a/src/bin/evil/evil_test_dlfcn.c +++ b/src/bin/evil/evil_test_dlfcn.c @@ -3,7 +3,6 @@ #endif /* HAVE_CONFIG_H */ #include -#include #include diff --git a/src/bin/evil/evil_test_link.c b/src/bin/evil/evil_test_link.c index 868e9f2..0aa4966 100644 --- a/src/bin/evil/evil_test_link.c +++ b/src/bin/evil/evil_test_link.c @@ -2,6 +2,7 @@ # include "config.h" #endif /* HAVE_CONFIG_H */ +#include #include #include diff --git a/src/lib/eina/eina_module.c b/src/lib/eina/eina_module.c index 2cfcde7..41d1fb3 100644 --- a/src/lib/eina/eina_module.c +++ b/src/lib/eina/eina_module.c @@ -27,7 +27,7 @@ #include #include -#ifdef HAVE_DLOPEN +#if defined HAVE_DLOPEN && ! defined _WIN32 # include #endif diff --git a/src/lib/eina/eina_prefix.c b/src/lib/eina/eina_prefix.c index a01b5fa..2165d05 100644 --- a/src/lib/eina/eina_prefix.c +++ b/src/lib/eina/eina_prefix.c @@ -37,7 +37,7 @@ #include #include -#ifdef HAVE_DLADDR +#if defined HAVE_DLADDR && ! defined _WIN32 # include #endif diff --git a/src/lib/eo/eo.c b/src/lib/eo/eo.c index 22120cd..fcaf6e7 100644 --- a/src/lib/eo/eo.c +++ b/src/lib/eo/eo.c @@ -2,7 +2,7 @@ # include #endif -#ifdef HAVE_DLADDR +#if defined HAVE_DLADDR && ! defined _WIN32 # include #endif diff --git a/src/lib/ethumb/ethumb.c b/src/lib/ethumb/ethumb.c index 7d21b0c..4e2c5a7 100644 --- a/src/lib/ethumb/ethumb.c +++ b/src/lib/ethumb/ethumb.c @@ -41,7 +41,6 @@ #include #include #include -#include #include #include diff --git a/src/lib/evil/Evil.h b/src/lib/evil/Evil.h index ff69452..837803c 100644 --- a/src/lib/evil/Evil.h +++ b/src/lib/evil/Evil.h @@ -73,6 +73,8 @@ * @li @ref Evil_Mman * @li @ref Evil_Unistd_Group * @li @ref Evil_Dlfcn + * @li @ref Evil_Langinfo_Group + * @li @ref Evil_Locale_Group * @li @ref Evil_Pwd_Group * @li @ref Evil_Stdio_Group * @li @ref Evil_Main_Group @@ -98,52 +100,19 @@ extern "C" { #include #undef WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include -#include -#include +#include /* for mkdir in evil_macro_wrapper */ -#ifdef _MSC_VER - -# include - -# define F_OK 0 /* Check for file existence */ -# define X_OK 1 /* MS access() doesn't check for execute permission. */ -# define W_OK 2 /* Check for write permission */ -# define R_OK 4 /* Check for read permission */ - -typedef DWORD pid_t; -typedef unsigned short mode_t; - -typedef unsigned short uint16_t; -typedef unsigned int uint32_t; -typedef signed int int32_t; -typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; -typedef SSIZE_T ssize_t; - -# define strdup(s) _strdup(s) -# define unlink(filename) _unlink(filename) -# define fileno(f) _fileno(f) -# define fdopen(fd,m) _fdopen((fd),(m)) -# define access(p,m) _access((p),(m)) -# define hypot(x,y) _hypot((x),(y)) -# define tzset _tzset - -#endif /* _MSC_VER */ - typedef unsigned long uid_t; typedef unsigned long gid_t; #include "evil_macro.h" +#include "evil_dlfcn.h" #include "evil_fcntl.h" #include "evil_inet.h" #include "evil_langinfo.h" +#include "evil_locale.h" #include "evil_main.h" #include "evil_stdlib.h" #include "evil_stdio.h" @@ -151,56 +120,57 @@ typedef unsigned long gid_t; #include "evil_time.h" #include "evil_unistd.h" #include "evil_util.h" -#include "evil_macro_pop.h" - -#if (defined(_WIN32) && !defined(_UWIN) && !defined(__CYGWIN__)) -# if defined(_MSC_VER) || defined(__MINGW32__) - -# ifdef S_ISDIR -# undef S_ISDIR -# endif -# ifdef S_ISREG -# undef S_ISREG -# endif +#ifndef S_ISDIR # define S_ISDIR(m) (((m) & _S_IFMT) == _S_IFDIR) +#endif + +#ifndef S_ISREG # define S_ISREG(m) (((m) & _S_IFMT) == _S_IFREG) +#endif -# define S_ISLNK(m) 0 +#define S_ISLNK(m) 0 -# define S_IRUSR _S_IRUSR -# define S_IWUSR _S_IWUSR -# define S_IXUSR _S_IXUSR +#define S_IRUSR _S_IRUSR +#ifndef S_IRGRP # define S_IRGRP S_IRUSR +#endif +#ifndef S_IROTH # define S_IROTH S_IRUSR +#endif + +#define S_IWUSR _S_IWUSR +#ifndef S_IWGRP # define S_IWGRP S_IWUSR +#endif +#ifndef S_IWOTH # define S_IWOTH S_IWUSR +#endif + +#define S_IXUSR _S_IXUSR +#ifndef S_IXGRP # define S_IXGRP S_IXUSR +#endif +#ifndef S_IXOTH # define S_IXOTH S_IXUSR +#endif -# define _S_IRWXU (_S_IREAD | _S_IWRITE | _S_IEXEC) -# define _S_IXUSR _S_IEXEC -# define _S_IWUSR _S_IWRITE -# define _S_IRUSR _S_IREAD - -#define S_IRWXO _S_IRWXU -#define S_IRWXG _S_IRWXU - - /* -# define close(fd) _close(fd) -# define read(fd,buffer,count) _read((fd),(buffer),(count)) -# define write(fd,buffer,count) _write((fd),(buffer),(count)) -# define unlink(filename) _unlink((filename)) -# define lstat(f,s) _stat((f),(s)) - */ - -# endif +#define _S_IRWXU (_S_IREAD | _S_IWRITE | _S_IEXEC) +#ifndef S_IRWXG +# define S_IRWXG _S_IRWXU #endif +#ifndef S_IRWXO +# define S_IRWXO _S_IRWXU +#endif + +#define _S_IXUSR _S_IEXEC +#define _S_IWUSR _S_IWRITE +#define _S_IRUSR _S_IREAD #define sigsetjmp(Env, Save) setjmp(Env) -#undef EAPI -#define EAPI +#include "evil_macro_wrapper.h" +#include "evil_macro_pop.h" #ifdef __cplusplus } diff --git a/src/lib/evil/dirent.h b/src/lib/evil/dirent.h index 1ccc4bd..9c58019 100644 --- a/src/lib/evil/dirent.h +++ b/src/lib/evil/dirent.h @@ -133,6 +133,10 @@ EAPI struct dirent *readdir(DIR *dir); #endif /* __cplusplus */ +#undef EAPI +#define EAPI + + /** * @} diff --git a/src/lib/evil/dlfcn.c b/src/lib/evil/dlfcn.c deleted file mode 100644 index ae8687e..0000000 --- a/src/lib/evil/dlfcn.c +++ /dev/null @@ -1,348 +0,0 @@ -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif /* HAVE_CONFIG_H */ - -#include - -#ifdef _MSC_VER -# include -#endif /* _MSC_VER */ - -#ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -#endif -#include -#undef WIN32_LEAN_AND_MEAN - -#include /* EnumProcessModules(Ex) */ - -#include "Evil.h" -#include "evil_private.h" - -#include "dlfcn.h" - - -static char *_dl_err = NULL; -static int _dl_err_viewed = 0; - -static void -_dl_get_last_error(char *desc) -{ - char *str; - size_t l1; - size_t l2; - - str = evil_last_error_get(); - - l1 = strlen(desc); - l2 = strlen(str); - - if (_dl_err) - free(_dl_err); - - _dl_err = (char *)malloc(sizeof(char) * (l1 + l2 + 1)); - if (!_dl_err) - _dl_err = strdup("not enough resource"); - else - { - memcpy(_dl_err, desc, l1); - memcpy(_dl_err + l1, str, l2); - _dl_err[l1 + l2] = '\0'; - } - free(str); - _dl_err_viewed = 0; -} - -void * -dlopen(const char* path, int mode EVIL_UNUSED) -{ - HMODULE module = NULL; - - if (!path) - { - module = GetModuleHandle(NULL); - if (!module) - _dl_get_last_error("GetModuleHandle returned: "); - } - else - { - char *new_path; - size_t l; - unsigned int i; - - /* according to MSDN, we must change the slash to backslash */ - l = strlen(path); - new_path = (char *)malloc(sizeof(char) * (l + 1)); - if (!new_path) - { - if (_dl_err) - free(_dl_err); - _dl_err = strdup("not enough resource"); - _dl_err_viewed = 0; - return NULL; - } - for (i = 0; i <= l; i++) - { - if (path[i] == '/') - new_path[i] = '\\'; - else - new_path[i] = path[i]; - } -#ifdef UNICODE - { - wchar_t *wpath; - - wpath = evil_char_to_wchar(new_path); - module = LoadLibrary(wpath); - free(wpath); - } -#else - module = LoadLibraryEx(new_path, NULL, - LOAD_WITH_ALTERED_SEARCH_PATH); -#endif /* ! UNICODE */ - if (!module) - _dl_get_last_error("LoadLibraryEx returned: "); - - free(new_path); - } - - return module; -} - -int -dlclose(void* handle) -{ - if (FreeLibrary(handle)) - return 0; - else - { - _dl_get_last_error("FreeLibrary returned: "); - return -1; - } -} - -void * -dlsym(void *handle, const char *symbol) -{ - FARPROC fp = NULL; - LPCTSTR new_symbol; - - if (!symbol || !*symbol) return NULL; - -#ifdef UNICODE - new_symbol = evil_char_to_wchar(symbol); -#else - new_symbol = symbol; -#endif /* UNICODE */ - - if (handle == RTLD_DEFAULT) - { - HMODULE modules[1024]; - DWORD needed; - DWORD i; - - /* TODO: use EnumProcessModulesEx() on Windows >= Vista */ - if (!EnumProcessModules(GetCurrentProcess(), - modules, sizeof(modules), &needed)) - { -#ifdef UNICODE - _dl_get_last_error("EnumProcessModules returned: "); - free((void *)new_symbol); -#endif /* UNICODE */ - return NULL; - } - - for (i = 0; i < (needed / sizeof(HMODULE)); i++) - { - fp = GetProcAddress(modules[i], new_symbol); - if (fp) break; - } - } - else - fp = GetProcAddress(handle, new_symbol); - -#ifdef UNICODE - free((void *)new_symbol); -#endif /* UNICODE */ - - if (!fp) - _dl_get_last_error("GetProcAddress returned: "); - - return fp; -} - -char * -dlerror (void) -{ - if (!_dl_err_viewed) - { - _dl_err_viewed = 1; - return _dl_err; - } - else - { - if (_dl_err) - free(_dl_err); - return NULL; - } -} - -#ifdef _GNU_SOURCE - -static char _dli_fname[MAX_PATH]; -static char _dli_sname[MAX_PATH]; /* a symbol should have at most 255 char */ - -static int -_dladdr_comp(const void *p1, const void *p2) -{ - return ( *(int *)p1 - *(int *)p2); -} - -int -dladdr (const void *addr EVIL_UNUSED, Dl_info *info) -{ - TCHAR tpath[PATH_MAX]; - MEMORY_BASIC_INFORMATION mbi; - unsigned char *base; - char *path; - size_t length; - - IMAGE_NT_HEADERS *nth; - IMAGE_EXPORT_DIRECTORY *ied; - DWORD *addresses; - WORD *ordinals; - DWORD *names; - DWORD *tmp; - DWORD res; - DWORD rva_addr; - DWORD i; - - if (!info) - return 0; - - info->dli_fname = NULL; - info->dli_fbase = NULL; - info->dli_sname = NULL; - info->dli_saddr = NULL; - - /* Get the name and base address of the module */ - - if (!VirtualQuery(addr, &mbi, sizeof(mbi))) - { - _dl_get_last_error("VirtualQuery returned: "); - return 0; - } - - if (mbi.State != MEM_COMMIT) - return 0; - - if (!mbi.AllocationBase) - return 0; - - base = (unsigned char *)mbi.AllocationBase; - - if (!GetModuleFileName((HMODULE)base, (LPTSTR)&tpath, PATH_MAX)) - { - _dl_get_last_error("GetModuleFileName returned: "); - return 0; - } - -# ifdef UNICODE - path = evil_wchar_to_char(tpath); -# else - path = tpath; -# endif /* ! UNICODE */ - - length = strlen(path); - if (length >= PATH_MAX) - { - length = PATH_MAX - 1; - path[PATH_MAX - 1] = '\0'; - } - - memcpy(_dli_fname, path, length + 1); - info->dli_fname = (const char *)_dli_fname; - info->dli_fbase = base; - -# ifdef UNICODE - free(path); -# endif /* ! UNICODE */ - - /* get the name and the address of the required symbol */ - - if (((IMAGE_DOS_HEADER *)base)->e_magic != IMAGE_DOS_SIGNATURE) - { - SetLastError(1276); - return 0; - } - - nth = (IMAGE_NT_HEADERS *)(base + ((IMAGE_DOS_HEADER *)base)->e_lfanew); - if (nth->Signature != IMAGE_NT_SIGNATURE) - { - SetLastError(1276); - return 0; - } - - /* no exported symbols ? it's an EXE and we exit without error */ - if (nth->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress == 0) - { - return 1; - } - - /* we assume now that the PE file is well-formed, so checks only when needed */ - ied = (IMAGE_EXPORT_DIRECTORY *)(base + nth->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); - addresses = (DWORD *)(base + ied->AddressOfFunctions); - ordinals = (WORD *)(base + ied->AddressOfNameOrdinals); - names = (DWORD *)(base + ied->AddressOfNames); - - /* the addresses are not ordered, so we need to order them */ - tmp = malloc(ied->NumberOfFunctions * sizeof(DWORD)); - if (!tmp) - { - SetLastError(8); - return 0; - } - - memcpy(tmp, addresses, ied->NumberOfFunctions * sizeof(DWORD)); - qsort(tmp, ied->NumberOfFunctions, sizeof(DWORD), _dladdr_comp); - rva_addr = (unsigned char *)addr - base; - res = (DWORD)(-1); - for (i = 0; i < ied->NumberOfFunctions; i++) - { - if (tmp[i] < rva_addr) - continue; - - res = tmp[i]; - break; - } - - /* if rva_addr is too high, we store the latest address */ - if (res == (DWORD)(-1)) - res = tmp[ied->NumberOfFunctions - 1]; - - free(tmp); - - for (i = 0; i < ied->NumberOfNames; i++) - { - if (addresses[ordinals[i]] == res) - { - char *name; - - name = (char *)(base + names[i]); - length = strlen(name); - if (length >= PATH_MAX) - { - length = PATH_MAX - 1; - name[PATH_MAX - 1] = '\0'; - } - memcpy(_dli_sname, name, length + 1); - info->dli_sname = (const char *)_dli_sname; - info->dli_saddr = base + res; - return 1; - } - } - - return 0; -} - -#endif /* _GNU_SOURCE */ diff --git a/src/lib/evil/dlfcn.h b/src/lib/evil/dlfcn.h deleted file mode 100644 index 349a9b4..0000000 --- a/src/lib/evil/dlfcn.h +++ /dev/null @@ -1,268 +0,0 @@ -#ifndef __EVIL_DLFCN_H__ -#define __EVIL_DLFCN_H__ - - -#include - - -#ifdef EAPI -# undef EAPI -#endif /* EAPI */ - -#ifdef _WIN32 -# ifdef EFL_EVIL_DLFCN_BUILD -# ifdef DLL_EXPORT -# define EAPI __declspec(dllexport) -# else -# define EAPI -# endif /* ! DLL_EXPORT */ -# else -# define EAPI __declspec(dllimport) -# endif /* ! EFL_EVIL_DLFCN_BUILD */ -#endif /* _WIN32 */ - - -#ifdef __cplusplus -extern "C" { -#endif - - -/** - * @file dlfcn.h - * @brief The file that provides functions to manage dynamic-link libraries - * @defgroup Evil_Dlfcn Functions that manage dynamic-link libraries. - * @ingroup Evil - * -x * This header provides functions to load and unload dynamic-link - * libaries, to get the address of a symbol, and to get diagnostic - * information. - */ - - -/** - * @def RTLD_LAZY - * Lazy function call binding. - */ -# define RTLD_LAZY 0x00001 /* lazy function call binding */ - -/** - * @def RTLD_NOW - * Immediate function call binding. - */ -# define RTLD_NOW 0x00002 /* immediate function call binding */ - -/** - * @def RTLD_GLOBAL - * Symbols in this dlopen'ed obj are visible to other dlopen'ed objs. - */ -# define RTLD_GLOBAL 0x00100 /* symbols in this dlopen'ed obj are visible - to other dlopen'ed objs */ - -/** - * @def RTLD_NODELETE - * Symbols are not deleted when closed. - */ -#define RTLD_NODELETE 0x01000 /* do not delete object when closed. */ - -#ifdef _GNU_SOURCE - -/** - * @def RTLD_DEFAULT - * Symbols are searched in all the DLL opened by the current process. - * This symbol is defined only when _GNU_SOURCE was defined before - * including dlfcn.h. - */ -#define RTLD_DEFAULT ((void*)1) /* search the symbol on all the DLL of the current process */ - -/** - * @typedef Dl_info - * @brief A structure that stores infomation of a calling process. - * This typedef is defined only when _GNU_SOURCE was defined before - * including dlfcn.h. - */ -typedef struct Dl_info Dl_info; - -/** - * @struct Dl_info - * @brief A structure that stores infomation of a calling process. - * This structure is defined only when _GNU_SOURCE was defined before - * including dlfcn.h. - */ -struct Dl_info -{ - const char *dli_fname; /**< Filename of defining object */ - void *dli_fbase; /**< Load address of that object */ - const char *dli_sname; /**< Name of nearest lower symbol */ - void *dli_saddr; /**< Exact value of nearest symbol */ -}; - -#endif /* _GNU_SOURCE */ - -/** - * @brief Map a specified executable module (either a .dll or .exe file) - * into the address space of the user process. - * - * @param path Name of the module. - * @param mode Unused. - * @return A pointer that represent the module, or @c NULL on failure. - * - * Map a specified executable module (either a .dll or .exe file) - * into the address space of the user process. If @p path is @c NULL, - * then the module corresponding to the current process is returned. - * Otherwise the module specified by @p path is loaded if it exists. - * If not, @c NULL is returned. The directory separators can be forward - * slash, or backward ones. Mapping a module can map other modules. - * @p mode is unused. - * - * If an error occurred, an error string can be retrived with dlerror(). - * - * According to the OS, the search order of the module can change, - * according to the value of SafeDllSearchMode. - * - * - For Windows Vista, Windows Server 2003, and Windows XP SP2: - * SafeDLLSearchMode is enabled by default. - * - For Windows XP and Windows 2000 SP4: SafeDLLSearchMode is disabled - * by default. - * - * If SafeDllSearchMode is enabled - * - The directory from which the application loaded. - * - The system directory. Use the GetSystemDirectory() function - * to get the path of this directory. - * - The 16-bit system directory. There is no function that obtains - * the path of this directory, but it is searched. - * - The Windows directory. Use the GetWindowsDirectory() function - * to get the path of this directory. - * - The current directory. - * - The directories that are listed in the PATH environment variable. - * Note that this does not include the per-application path specified - * by the App Paths registry key. - * - * If SafeDllSearchMode is disabled - * - The directory from which the application loaded. - * - The current directory. - * - The system directory. Use the GetSystemDirectory() function - * to get the path of this directory. - * - The 16-bit system directory. There is no function that obtains - * the path of this directory, but it is searched. - * - The Windows directory. Use the GetWindowsDirectory() function - * to get the path of this directory. - * - The directories that are listed in the PATH environment variable. - * Note that this does not include the per-application path specified - * by the App Paths registry key. - * - * Conformity: None. - * - * Supported OS: Windows Vista, Windows XP or Windows 2000 - * Professional. - * - * @ingroup Evil_Dlfcn - */ -EAPI void *dlopen(const char* path, int mode); - -/** - * @brief Close a dynamic-link library. - * - * @param handle Handle that references a dynamic-link library. - * @return O on sucess, -1 otherwise. - * - * Release a reference to the dynamic-link library referenced - * by @p handle. If the reference count drops to 0, the handle is - * removed from the address space and is rendered invalid. @p handle - * is the value returned by a previous call to dlopen(). - * - * If no error occurred, the returned value is 0, otherwise the - * returned value is -1 and an error string can be retrived with - * dlerror(). - * - * Conformity: None. - * - * Supported OS: Windows Vista, Windows XP or Windows 2000 - * Professional. - * - * @ingroup Evil_Dlfcn - */ -EAPI int dlclose(void* handle); - -/** - * @brief Get the address of a symbol. - * - * @param handle Handle that references a dynamic-link library. - * @param symbol @c NULL-terminated string. - * @return O on sucess, NULL otherwise. - * - * Return the address of the code or data location specified by the - * string @p symbol. @p handle references a library that contains - * the function or variable @p symbol. - * - * If no error occurred, the returned value is the code or data - * location, otherwise the returned value is NULL and an error - * string can be retrived with dlerror(). - * - * Conformity: None. - * - * Supported OS: Windows Vista, Windows XP or Windows 2000 - * Professional. - * - * @ingroup Evil_Dlfcn - */ -EAPI void *dlsym(void* handle, const char* symbol); - -#ifdef _GNU_SOURCE - -/** - * @brief Resolve module and function pointers from the given function - * pointer address. - * - * @param addr A function pointer. - * @param info Pointer to the #Dl_info to fill. - * @return 1 on success, 0 otherwise. - * - * Fill @p info with the absolute name of the module which has the - * fonction pointer @p addr, the base address of that module, the name - * and address of the symbol. If no symbol matching @p addr could be - * found (as in an EXE file), then dli_sname and dli_saddr are set to - * NULL and the function returns 1. See #Dl_info for more informations. - * - * This function is available only when _GNU_SOURCE was defined before - * including dlfcn.h. - * - * Conformity: None. - * - * Supported OS: Windows Vista, Windows XP. - * - * @ingroup Evil_Dlfcn - */ -EAPI int dladdr (const void *addr, Dl_info *info); - -#endif /* _GNU_SOURCE */ - -/** - * @brief Get diagnostic information - * - * @return A @c NULL-terminated string if an error occurred, @c NULL - * otherwise. - * - * Return a @c NULL-terminated character string describing the last - * error that occurred on this thread during a call to dlopen(), - * dlsym(), or dlclose(). If no such error has occurred, dlerror() - * returns a null pointer. At each call to dlerror(), the error - * indication is reset. Thus in the case of two calls to dlerror(), - * where the second call follows the first immediately, the second - * call will always return a null pointer. - * - * Conformity: None. - * - * Supported OS: Windows Vista, Windows XP or Windows 2000 - * Professional. - * - * @ingroup Evil_Dlfcn - */ -EAPI char *dlerror (void); - - -#ifdef __cplusplus -} -#endif - - -#endif /* __EVIL_DLFCN_H__ */ diff --git a/src/lib/evil/evil_dirent.c b/src/lib/evil/evil_dirent.c index 6dcfca2..6f6b86a 100644 --- a/src/lib/evil/evil_dirent.c +++ b/src/lib/evil/evil_dirent.c @@ -2,10 +2,19 @@ # include "config.h" #endif /* HAVE_CONFIG_H */ +#include #include #include +#include -#include "Evil.h" +#ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +#endif +#include +#undef WIN32_LEAN_AND_MEAN + +#include "evil_macro.h" +#include "evil_stdio.h" struct DIR diff --git a/src/lib/evil/evil_fcntl.c b/src/lib/evil/evil_fcntl.c index 169d1926..188e476 100644 --- a/src/lib/evil/evil_fcntl.c +++ b/src/lib/evil/evil_fcntl.c @@ -3,16 +3,13 @@ #endif /* HAVE_CONFIG_H */ #include - -#ifdef _MSC_VER -# include /* for _get_osfhandle _lseek and _locking */ -#endif - #include #include /* for ioctlsocket */ +#include -#include "Evil.h" +#include "evil_macro.h" +#include "evil_fcntl.h" /* diff --git a/src/lib/evil/evil_inet.c b/src/lib/evil/evil_inet.c index 05d130c..54cee3d 100644 --- a/src/lib/evil/evil_inet.c +++ b/src/lib/evil/evil_inet.c @@ -40,7 +40,6 @@ #include "evil_macro.h" #include "evil_inet.h" -#include "evil_private.h" #ifndef EMSGSIZE # define EMSGSIZE WSAEMSGSIZE diff --git a/src/lib/evil/evil_inet.h b/src/lib/evil/evil_inet.h index 6858a83..fb4e072 100644 --- a/src/lib/evil/evil_inet.h +++ b/src/lib/evil/evil_inet.h @@ -90,13 +90,6 @@ EAPI int evil_inet_pton(int af, const char *src, void *dst); /** - * @def inet_pton(x,y,z) - * - * Wrapper around evil_inet_pton(). - */ -#define inet_pton(x,y,z) evil_inet_pton(x,y,z) - -/** * @brief Convert IPv4 and IPv6 addresses from binary to text form. * * @param af The address family. @@ -136,13 +129,6 @@ EAPI int evil_inet_pton(int af, const char *src, void *dst); */ EAPI const char *evil_inet_ntop(int af, const char *src, void *dst, size_t size); -/** - * @def inet_ntop(x,y,z,s) - * - * Wrapper around evil_inet_ntop(). - */ -#define inet_ntop(x,y,z,s) evil_inet_ntop(x,y,z,s) - #endif /* _WIN32_WINNT >= _WIN32_WINNT_VISTA */ diff --git a/src/lib/evil/evil_langinfo.c b/src/lib/evil/evil_langinfo.c index 2cec67a..25a863a 100644 --- a/src/lib/evil/evil_langinfo.c +++ b/src/lib/evil/evil_langinfo.c @@ -2,7 +2,11 @@ # include "config.h" #endif /* HAVE_CONFIG_H */ -#include "Evil.h" +#include +#include + +#include "evil_macro.h" +#include "evil_langinfo.h" static char * diff --git a/src/lib/evil/evil_libgen.c b/src/lib/evil/evil_libgen.c index 779193f..d96ba5b 100644 --- a/src/lib/evil/evil_libgen.c +++ b/src/lib/evil/evil_libgen.c @@ -4,7 +4,8 @@ #include -#include "Evil.h" +#include "evil_macro.h" +#include "evil_libgen.h" char _evil_basename_buf[PATH_MAX]; char _evil_dirname_buf[PATH_MAX]; diff --git a/src/lib/evil/evil_macro.h b/src/lib/evil/evil_macro.h index d5a1af6..70de652 100644 --- a/src/lib/evil/evil_macro.h +++ b/src/lib/evil/evil_macro.h @@ -3,89 +3,21 @@ #ifdef EAPI # undef EAPI -#endif /* EAPI */ +#endif -#ifdef _WIN32 -# ifdef EFL_EVIL_BUILD -# ifdef DLL_EXPORT -# define EAPI __declspec(dllexport) -# else -# define EAPI -# endif /* ! DLL_EXPORT */ +#ifdef EFL_EVIL_BUILD +# ifdef DLL_EXPORT +# define EAPI __declspec(dllexport) # else -# define EAPI __declspec(dllimport) -# endif /* ! EFL_EVIL_BUILD */ -#endif /* _WIN32 */ +# define EAPI +# endif +#else +# define EAPI __declspec(dllimport) +#endif #ifndef PATH_MAX # define PATH_MAX MAX_PATH -#endif /* PATH_MAX */ - - -#if defined(_INTTYPES_H_) && defined(PRId64) - -#undef PRId64 -#undef PRIdLEAST64 -#undef PRIdFAST64 -#undef PRIdMAX -#undef PRIi64 -#undef PRIiLEAST64 -#undef PRIiFAST64 -#undef PRIiMAX -#undef PRIo64 -#undef PRIoLEAST64 -#undef PRIoFAST64 -#undef PRIoMAX -#undef PRIu64 -#undef PRIuLEAST64 -#undef PRIuFAST64 -#undef PRIuMAX -#undef PRIx64 -#undef PRIxLEAST64 -#undef PRIxFAST64 -#undef PRIxMAX -#undef PRIX64 -#undef PRIXLEAST64 -#undef PRIXFAST64 -#undef PRIXMAX - -#undef SCNd64 -#undef SCNdLEAST64 -#undef SCNdFAST64 -#undef SCNdMAX -#undef SCNi64 -#undef SCNiLEAST64 -#undef SCNiFAST64 -#undef SCNiMAX -#undef SCNo64 -#undef SCNoLEAST64 -#undef SCNoFAST64 -#undef SCNoMAX -#undef SCNx64 -#undef SCNxLEAST64 -#undef SCNxFAST64 -#undef SCNxMAX -#undef SCNu64 -#undef SCNuLEAST64 -#undef SCNuFAST64 -#undef SCNuMAX - -#ifdef _WIN64 -#undef PRIdPTR -#undef PRIiPTR -#undef PRIoPTR -#undef PRIuPTR -#undef PRIxPTR -#undef PRIXPTR - -#undef SCNdPTR -#undef SCNiPTR -#undef SCNoPTR -#undef SCNxPTR -#undef SCNuPTR -#endif /* _WIN64 */ - -#endif /* defined(_INTTYPES_H_) && defined(PRId64) */ +#endif #endif /* __EVIL_MACRO_H__ */ diff --git a/src/lib/evil/evil_macro_pop.h b/src/lib/evil/evil_macro_pop.h index bad78db..0fb9122 100644 --- a/src/lib/evil/evil_macro_pop.h +++ b/src/lib/evil/evil_macro_pop.h @@ -1,68 +1,8 @@ #ifndef __EVIL_MACRO_POP_H__ #define __EVIL_MACRO_POP_H__ -/* Redefine to GNU specific PRI... and SCN... macros. */ - -#define PRId64 "lld" -#define PRIdLEAST64 "lld" -#define PRIdFAST64 "lld" -#define PRIdMAX "lld" -#define PRIi64 "lli" -#define PRIiLEAST64 "lli" -#define PRIiFAST64 "lli" -#define PRIiMAX "lli" -#define PRIo64 "llo" -#define PRIoLEAST64 "llo" -#define PRIoFAST64 "llo" -#define PRIoMAX "llo" -#define PRIu64 "llu" -#define PRIuLEAST64 "llu" -#define PRIuFAST64 "llu" -#define PRIuMAX "llu" -#define PRIx64 "llx" -#define PRIxLEAST64 "llx" -#define PRIxFAST64 "llx" -#define PRIxMAX "llx" -#define PRIX64 "llX" -#define PRIXLEAST64 "llX" -#define PRIXFAST64 "llX" -#define PRIXMAX "llX" - -#define SCNd64 "lld" -#define SCNdLEAST64 "lld" -#define SCNdFAST64 "lld" -#define SCNdMAX "lld" -#define SCNi64 "lli" -#define SCNiLEAST64 "lli" -#define SCNiFAST64 "lli" -#define SCNiMAX "lli" -#define SCNo64 "llo" -#define SCNoLEAST64 "llo" -#define SCNoFAST64 "llo" -#define SCNoMAX "llo" -#define SCNx64 "llx" -#define SCNxLEAST64 "llx" -#define SCNxFAST64 "llx" -#define SCNxMAX "llx" -#define SCNu64 "llu" -#define SCNuLEAST64 "llu" -#define SCNuFAST64 "llu" -#define SCNuMAX "llu" - -#ifdef _WIN64 -#define PRIdPTR "lld" -#define PRIiPTR "lli" -#define PRIoPTR "llo" -#define PRIuPTR "llu" -#define PRIxPTR "llx" -#define PRIXPTR "llX" - -#define SCNdPTR "lld" -#define SCNiPTR "lli" -#define SCNoPTR "llo" -#define SCNxPTR "llx" -#define SCNuPTR "llu" -#endif /* _WIN64 */ +#undef EAPI +#define EAPI #endif /* __EVIL_MACRO_POP_H__ */ diff --git a/src/lib/evil/evil_main.c b/src/lib/evil/evil_main.c index 79d4e34..2b7ae51 100644 --- a/src/lib/evil/evil_main.c +++ b/src/lib/evil/evil_main.c @@ -2,13 +2,17 @@ # include #endif +#include + #ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN #endif #include #undef WIN32_LEAN_AND_MEAN -#include "Evil.h" +#include "evil_macro.h" +#include "evil_unistd.h" +#include "evil_main.h" #include "evil_private.h" @@ -18,6 +22,8 @@ extern LONGLONG _evil_time_freq; extern LONGLONG _evil_time_count; extern long _evil_time_second; +long _evil_systemtime_to_time(SYSTEMTIME st); + int evil_init(void) { diff --git a/src/lib/evil/evil_mman.c b/src/lib/evil/evil_mman.c index 8d6dcdb..fca3c72 100644 --- a/src/lib/evil/evil_mman.c +++ b/src/lib/evil/evil_mman.c @@ -5,10 +5,7 @@ #include #include #include - -#ifndef _MSC_VER -# include -#endif +#include #ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN @@ -16,7 +13,7 @@ #include #undef WIN32_LEAN_AND_MEAN -# include +#include #include "evil_macro.h" #include "sys/mman.h" diff --git a/src/lib/evil/evil_private.h b/src/lib/evil/evil_private.h index 0f8b6d1..560b4e2 100644 --- a/src/lib/evil/evil_private.h +++ b/src/lib/evil/evil_private.h @@ -14,12 +14,6 @@ extern "C" { # endif #endif -long _evil_systemtime_to_time(SYSTEMTIME st); - -void _evil_error_display(const char *fct, LONG res); - -void _evil_last_error_display(const char *fct); - #ifdef __cplusplus } #endif diff --git a/src/lib/evil/evil_pwd.c b/src/lib/evil/evil_pwd.c index 5b323f4..841c106 100644 --- a/src/lib/evil/evil_pwd.c +++ b/src/lib/evil/evil_pwd.c @@ -2,11 +2,14 @@ # include "config.h" #endif /* HAVE_CONFIG_H */ +#include +#include + #define _POSIX #include #include -#include "Evil.h" +#include "evil_macro.h" #include "pwd.h" @@ -57,10 +60,10 @@ getpwnam(const char *n) pw.pw_name = user_name; snprintf(user_gecos, sizeof(user_gecos), "%s,,,", user_name); pw.pw_gecos = user_gecos; - pw.pw_dir = (char *)evil_homedir_get(); + pw.pw_dir = getenv("USERPROFILE"); pw.pw_shell = getenv("SHELL"); if (!pw.pw_shell) - pw.pw_shell = "sh"; + pw.pw_shell = "cmd.exe"; return &pw; } diff --git a/src/lib/evil/evil_stdio.c b/src/lib/evil/evil_stdio.c index c30f0dc..5919d0c 100644 --- a/src/lib/evil/evil_stdio.c +++ b/src/lib/evil/evil_stdio.c @@ -3,8 +3,11 @@ #endif /* HAVE_CONFIG_H */ #include +#include +#include -#include "Evil.h" +#include "evil_macro.h" +#include "evil_stdio.h" #include "evil_private.h" #undef rename diff --git a/src/lib/evil/evil_stdio.h b/src/lib/evil/evil_stdio.h index f1de75a..7b61a33 100644 --- a/src/lib/evil/evil_stdio.h +++ b/src/lib/evil/evil_stdio.h @@ -10,7 +10,6 @@ * * This header provides functions ported from Unix in stdio.h. * - * */ #define EVIL_PATH_SEP_SWAP(p, s1, s2) \ @@ -45,13 +44,6 @@ EAPI int evil_rename(const char *src, const char *dst); /** - * @def rename(src, dest) - * - * Wrapper around evil_rename(). - */ -#define rename(src, dst) evil_rename(src, dst) - -/** * @brief Wrap the _mkdir() function on Windows. * * @param[in] dirname The new dir name. @@ -64,12 +56,5 @@ EAPI int evil_rename(const char *src, const char *dst); */ EAPI int evil_mkdir(const char *dirname, mode_t mode); -/** - * @def mkdir(dirname, mode) - * - * Wrapper around evil_mkdir(). - */ -#define mkdir(dirname, mode) evil_mkdir(dirname, mode) - #endif /* __EVIL_STDIO_H__ */ diff --git a/src/lib/evil/evil_stdlib.c b/src/lib/evil/evil_stdlib.c index 5f84453..bcafb3a 100644 --- a/src/lib/evil/evil_stdlib.c +++ b/src/lib/evil/evil_stdlib.c @@ -19,7 +19,6 @@ #include "evil_macro.h" #include "evil_stdlib.h" -#include "evil_private.h" /* * Environment variable related functions @@ -194,12 +193,16 @@ mkstemps(char *__template, int suffixlen) return -1; } +#if __MINGW64_VERSION_MAJOR < 4 + int mkstemp(char *__template) { return mkstemps(__template, 0); } +#endif + char * realpath(const char *file_name, char *resolved_name) { diff --git a/src/lib/evil/evil_stdlib.h b/src/lib/evil/evil_stdlib.h index 316347a..6f98489 100644 --- a/src/lib/evil/evil_stdlib.h +++ b/src/lib/evil/evil_stdlib.h @@ -67,6 +67,8 @@ EAPI int unsetenv(const char *name); * */ +#if __MINGW64_VERSION_MAJOR < 4 + /** * @brief Create a unique temporary file name. * @@ -99,6 +101,8 @@ EAPI int unsetenv(const char *name); */ EAPI int mkstemp(char *__template); +#endif + /** * @brief create an unique temporary directory * diff --git a/src/lib/evil/evil_string.c b/src/lib/evil/evil_string.c index 151f8e5..634565b 100644 --- a/src/lib/evil/evil_string.c +++ b/src/lib/evil/evil_string.c @@ -2,8 +2,12 @@ # include "config.h" #endif /* HAVE_CONFIG_H */ -#include "Evil.h" -#include "evil_private.h" +#include +#include +#include + +#include "evil_macro.h" +#include "evil_string.h" /* @@ -54,15 +58,6 @@ strrstr (const char *str, const char *substr) return ret; } -#ifdef _MSC_VER - -int strcasecmp(const char *s1, const char *s2) -{ - return lstrcmpi(s1, s2); -} - -#endif /* _MSC_VER */ - char *strcasestr(const char *haystack, const char *needle) { size_t length_needle; diff --git a/src/lib/evil/evil_string.h b/src/lib/evil/evil_string.h index 6de66e9..e1bf65b 100644 --- a/src/lib/evil/evil_string.h +++ b/src/lib/evil/evil_string.h @@ -73,28 +73,6 @@ EAPI int ffs(int i); */ EAPI char *strrstr (const char *str, const char *substr); -#ifdef _MSC_VER - -/** - * @brief Compare two string, ignoring case. - * - * @param s1 The first string to compare. - * @param s2 The first string to compare. - * @return - * - * This function compares the two strings @p s1 and @p s2, ignoring - * the case of the characters. It returns an integer less than, equal - * to, or greater than zero if s1 is found, respectively, to be less - * than, to match, or be greater than s2. - * - * Conformity: Non applicable. - * - * Supported OS: Windows XP (vc++ only) - */ -EAPI int strcasecmp(const char *s1, const char *s2); - -#endif /* _MSC_VER */ - /** * @brief Locate a substring into a string, ignoring case. * diff --git a/src/lib/evil/evil_time.c b/src/lib/evil/evil_time.c index a6984bf..76c5a58 100644 --- a/src/lib/evil/evil_time.c +++ b/src/lib/evil/evil_time.c @@ -7,7 +7,9 @@ #include #include -#include "Evil.h" +#include "evil_macro.h" +#include "evil_time.h" +#include "evil_macro_wrapper.h" #include "evil_private.h" struct tm * @@ -312,7 +314,7 @@ strptime(const char *buf, const char *fmt, struct tm *tm) continue; #ifndef TIME_MAX -# if INTPTR_MAX == 0xffffffffffffffff +# ifdef _WIN64 # define TIME_MAX INT64_MAX # else # define TIME_MAX INT32_MAX diff --git a/src/lib/evil/evil_time.h b/src/lib/evil/evil_time.h index c65115a..34607de 100644 --- a/src/lib/evil/evil_time.h +++ b/src/lib/evil/evil_time.h @@ -35,16 +35,6 @@ EAPI struct tm *evil_localtime_r(const time_t *timep, struct tm *result); /** - * @def localtime_r(t, r) - * - * Wrapper around evil_localtime_r(). - */ -#ifdef localtime_r -# undef localtime_r -#endif -#define localtime_r(t, r) evil_localtime_r(t, r) - -/** * @brief Convert a string representation of time to a time tm structure . * * @param buf The string to convert. diff --git a/src/lib/evil/evil_unistd.c b/src/lib/evil/evil_unistd.c index 71f6e2c..27f6825 100644 --- a/src/lib/evil/evil_unistd.c +++ b/src/lib/evil/evil_unistd.c @@ -3,6 +3,8 @@ #endif /* HAVE_CONFIG_H */ #include +#include +# include #ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN @@ -10,14 +12,8 @@ #include #undef WIN32_LEAN_AND_MEAN -# include - -#ifdef _MSC_VER -# include /* for _getcwd */ -#endif - -#include "Evil.h" -#include "evil_private.h" +#include "evil_macro.h" +#include "evil_unistd.h" LONGLONG _evil_time_freq; @@ -25,6 +21,8 @@ LONGLONG _evil_time_count; long _evil_time_second; +long _evil_systemtime_to_time(SYSTEMTIME st); + long _evil_systemtime_to_time(SYSTEMTIME st) { @@ -64,41 +62,6 @@ evil_time_get(void) return (double)_evil_time_second + (double)(count.QuadPart - _evil_time_count)/ (double)_evil_time_freq; } -#ifdef _MSC_VER -int -evil_gettimeofday(struct timeval *tp, void *tzp EVIL_UNUSED) -{ - LARGE_INTEGER count; - LONGLONG diff; - - QueryPerformanceCounter(&count); - diff = count.QuadPart - _evil_time_count; - tp->tv_sec = _evil_time_second + (long)(diff / _evil_time_freq); - tp->tv_usec = (long)(((diff % _evil_time_freq) * 1000000ll) / _evil_time_freq); - - return 1; -} - -int -evil_usleep(unsigned long usec) -{ - Sleep(usec / 1000); - return 0; -} - - -/* - * Process identifer related functions - * - */ - -pid_t -getpid(void) -{ - return (pid_t)GetCurrentProcessId(); -} -#endif - /* * File related functions * diff --git a/src/lib/evil/evil_unistd.h b/src/lib/evil/evil_unistd.h index f658416..dbc6cfe 100644 --- a/src/lib/evil/evil_unistd.h +++ b/src/lib/evil/evil_unistd.h @@ -36,80 +36,6 @@ */ EAPI double evil_time_get(void); -#ifdef _MSC_VER - -/** - * @brief Retrieve the time since the Evil library has been - * initialized. - * - * @param tp Structure to fill. - * @param tzp Unused. - * @return Always 1. - * - * The function fills @p tp with the time spent since the Evil library - * has been initialized. It uses a high-resolution timer and then can - * have a precision up to the nano-second. The precision is processor - * dependant. This function can be used to benchmark parts of code in - * with high precision. This function always returns 1. - * - * Conformity: Not appliclable. - * - * Supported OS: Windows XP. - */ -EAPI int evil_gettimeofday(struct timeval * tp, void * tzp); - -/** - * @def gettimeofday(tp,tzp) - * - * Wrapper around evil_gettimeofday(). - */ -#define gettimeofday(tp,tzp) evil_gettimeofday((tp),(tzp)) - -/** - * @brief Suspend the execution of the calling process for microsecond - * intervals. - * - * @param usec The interval in microseconds. - * @return Always 0 (success). - * - * This function suspends the execution of the calling process for (at - * least) @p usec microseconds. - * - * Conformity: Not appliclable. - * - * Supported OS: Windows XP. - */ -EAPI int evil_usleep(unsigned long usec); - -/** - * @def usleep(usec) - * - * Wrapper around evil_usleep(). - */ -#define usleep(usec) evil_usleep(usec); - -/* - * Process identifer related functions - * - */ - -/** - * @brief Return the process identifier of the calling process. - * - * @return The process ID. - * - * Return the process identifier of the calling process. Until - * the process terminates, the process identifier uniquely - * identifies the process throughout the system. - * - * Conformity: Not appliclable. - * - * Supported OS: Windows XP. - */ -EAPI pid_t getpid(void); - -#endif - /* * Symbolic links and directory related functions @@ -187,13 +113,6 @@ EAPI ssize_t readlink(const char *path, char *buf, size_t bufsiz); */ EAPI char *evil_getcwd(char *buffer, size_t size); -/** - * @def getcwd(b,s) - * - * Wrapper around evil_getcwd(). - */ -#define getcwd(b,s) evil_getcwd((b),(s)) - /* * Sockets and pipe related functions * @@ -240,13 +159,6 @@ EAPI void evil_sockets_shutdown(void); */ EAPI int evil_pipe(int *fds); -/** - * @def pipe(fds) - * - * Wrapper around evil_pipe(). - */ -#define pipe(fds) evil_pipe(fds) - /** * @} diff --git a/src/lib/evil/evil_util.c b/src/lib/evil/evil_util.c index 0fff26d..ebbe0ad 100644 --- a/src/lib/evil/evil_util.c +++ b/src/lib/evil/evil_util.c @@ -16,9 +16,11 @@ #include "evil_macro.h" #include "evil_util.h" -#include "evil_private.h" +/* static void _evil_error_display(const char *fct, LONG res); */ +static void _evil_last_error_display(const char *fct); + wchar_t * evil_char_to_wchar(const char *text) { @@ -159,16 +161,6 @@ evil_format_message(long err) return disp; } -void -_evil_error_display(const char *fct, LONG res) -{ - char *error; - - error = evil_format_message(res); - fprintf(stderr, "[Evil] [%s] ERROR (%ld): %s\n", fct, res, error); - free(error); -} - char * evil_last_error_get(void) { @@ -178,7 +170,7 @@ evil_last_error_get(void) return evil_format_message(err); } -void +static void _evil_last_error_display(const char *fct) { char *error; diff --git a/src/lib/evil/gdtoa/README b/src/lib/evil/gdtoa/README deleted file mode 100644 index ce8be55..0000000 --- a/src/lib/evil/gdtoa/README +++ /dev/null @@ -1,357 +0,0 @@ -This directory contains source for a library of binary -> decimal -and decimal -> binary conversion routines, for single-, double-, -and extended-precision IEEE binary floating-point arithmetic, and -other IEEE-like binary floating-point, including "double double", -as in - - T. J. Dekker, "A Floating-Point Technique for Extending the - Available Precision", Numer. Math. 18 (1971), pp. 224-242 - -and - - "Inside Macintosh: PowerPC Numerics", Addison-Wesley, 1994 - -The conversion routines use double-precision floating-point arithmetic -and, where necessary, high precision integer arithmetic. The routines -are generalizations of the strtod and dtoa routines described in - - David M. Gay, "Correctly Rounded Binary-Decimal and - Decimal-Binary Conversions", Numerical Analysis Manuscript - No. 90-10, Bell Labs, Murray Hill, 1990; - http://cm.bell-labs.com/cm/cs/what/ampl/REFS/rounding.ps.gz - -(based in part on papers by Clinger and Steele & White: see the -references in the above paper). - -The present conversion routines should be able to use any of IEEE binary, -VAX, or IBM-mainframe double-precision arithmetic internally, but I (dmg) -have so far only had a chance to test them with IEEE double precision -arithmetic. - -The core conversion routines are strtodg for decimal -> binary conversions -and gdtoa for binary -> decimal conversions. These routines operate -on arrays of unsigned 32-bit integers of type ULong, a signed 32-bit -exponent of type Long, and arithmetic characteristics described in -struct FPI; FPI, Long, and ULong are defined in gdtoa.h. File arith.h -is supposed to provide #defines that cause gdtoa.h to define its -types correctly. File arithchk.c is source for a program that -generates a suitable arith.h on all systems where I've been able to -test it. - -The core conversion routines are meant to be called by helper routines -that know details of the particular binary arithmetic of interest and -convert. The present directory provides helper routines for 5 variants -of IEEE binary floating-point arithmetic, each indicated by one or -two letters: - - f IEEE single precision - d IEEE double precision - x IEEE extended precision, as on Intel 80x87 - and software emulations of Motorola 68xxx chips - that do not pad the way the 68xxx does, but - only store 80 bits - xL IEEE extended precision, as on Motorola 68xxx chips - Q quad precision, as on Sun Sparc chips - dd double double, pairs of IEEE double numbers - whose sum is the desired value - -For decimal -> binary conversions, there are three families of -helper routines: one for round-nearest (or the current rounding -mode on IEEE-arithmetic systems that provide the C99 fegetround() -function, if compiled with -DHonor_FLT_ROUNDS): - - strtof - strtod - strtodd - strtopd - strtopf - strtopx - strtopxL - strtopQ - -one with rounding direction specified: - - strtorf - strtord - strtordd - strtorx - strtorxL - strtorQ - -and one for computing an interval (at most one bit wide) that contains -the decimal number: - - strtoIf - strtoId - strtoIdd - strtoIx - strtoIxL - strtoIQ - -The latter call strtoIg, which makes one call on strtodg and adjusts -the result to provide the desired interval. On systems where native -arithmetic can easily make one-ulp adjustments on values in the -desired floating-point format, it might be more efficient to use the -native arithmetic. Routine strtodI is a variant of strtoId that -illustrates one way to do this for IEEE binary double-precision -arithmetic -- but whether this is more efficient remains to be seen. - -Functions strtod and strtof have "natural" return types, float and -double -- strtod is specified by the C standard, and strtof appears -in the stdlib.h of some systems, such as (at least some) Linux systems. -The other functions write their results to their final argument(s): -to the final two argument for the strtoI... (interval) functions, -and to the final argument for the others (strtop... and strtor...). -Where possible, these arguments have "natural" return types (double* -or float*), to permit at least some type checking. In reality, they -are viewed as arrays of ULong (or, for the "x" functions, UShort) -values. On systems where long double is the appropriate type, one can -pass long double* final argument(s) to these routines. The int value -that these routines return is the return value from the call they make -on strtodg; see the enum of possible return values in gdtoa.h. - -Source files g_ddfmt.c, misc.c, smisc.c, strtod.c, strtodg.c, and ulp.c -should use true IEEE double arithmetic (not, e.g., double extended), -at least for storing (and viewing the bits of) the variables declared -"double" within them. - -One detail indicated in struct FPI is whether the target binary -arithmetic departs from the IEEE standard by flushing denormalized -numbers to 0. On systems that do this, the helper routines for -conversion to double-double format (when compiled with -Sudden_Underflow #defined) penalize the bottom of the exponent -range so that they return a nonzero result only when the least -significant bit of the less significant member of the pair of -double values returned can be expressed as a normalized double -value. An alternative would be to drop to 53-bit precision near -the bottom of the exponent range. To get correct rounding, this -would (in general) require two calls on strtodg (one specifying -126-bit arithmetic, then, if necessary, one specifying 53-bit -arithmetic). - -By default, the core routine strtodg and strtod set errno to ERANGE -if the result overflows to +Infinity or underflows to 0. Compile -these routines with NO_ERRNO #defined to inhibit errno assignments. - -Routine strtod is based on netlib's "dtoa.c from fp", and -(f = strtod(s,se)) is more efficient for some conversions than, say, -strtord(s,se,1,&f). Parts of strtod require true IEEE double -arithmetic with the default rounding mode (round-to-nearest) and, on -systems with IEEE extended-precision registers, double-precision -(53-bit) rounding precision. If the machine uses (the equivalent of) -Intel 80x87 arithmetic, the call - _control87(PC_53, MCW_PC); -does this with many compilers. Whether this or another call is -appropriate depends on the compiler; for this to work, it may be -necessary to #include "float.h" or another system-dependent header -file. - -Source file strtodnrp.c gives a strtod that does not require 53-bit -rounding precision on systems (such as Intel IA32 systems) that may -suffer double rounding due to use of extended-precision registers. -For some conversions this variant of strtod is less efficient than the -one in strtod.c when the latter is run with 53-bit rounding precision. - -The values that the strto* routines return for NaNs are determined by -gd_qnan.h, which the makefile generates by running the program whose -source is qnan.c. Note that the rules for distinguishing signaling -from quiet NaNs are system-dependent. For cross-compilation, you need -to determine arith.h and gd_qnan.h suitably, e.g., using the -arithmetic of the target machine. - -C99's hexadecimal floating-point constants are recognized by the -strto* routines (but this feature has not yet been heavily tested). -Compiling with NO_HEX_FP #defined disables this feature. - -When compiled with -DINFNAN_CHECK, the strto* routines recognize C99's -NaN and Infinity syntax. Moreover, unless No_Hex_NaN is #defined, the -strto* routines also recognize C99's NaN(...) syntax: they accept -(case insensitively) strings of the form NaN(x), where x is a string -of hexadecimal digits and spaces; if there is only one string of -hexadecimal digits, it is taken for the fraction bits of the resulting -NaN; if there are two or more strings of hexadecimal digits, each -string is assigned to the next available sequence of 32-bit words of -fractions bits (starting with the most significant), right-aligned in -each sequence. - -For binary -> decimal conversions, I've provided just one family -of helper routines: - - g_ffmt - g_dfmt - g_ddfmt - g_xfmt - g_xLfmt - g_Qfmt - -which do a "%g" style conversion either to a specified number of decimal -places (if their ndig argument is positive), or to the shortest -decimal string that rounds to the given binary floating-point value -(if ndig <= 0). They write into a buffer supplied as an argument -and return either a pointer to the end of the string (a null character) -in the buffer, if the buffer was long enough, or 0. Other forms of -conversion are easily done with the help of gdtoa(), such as %e or %f -style and conversions with direction of rounding specified (so that, if -desired, the decimal value is either >= or <= the binary value). -On IEEE-arithmetic systems that provide the C99 fegetround() function, -if compiled with -DHonor_FLT_ROUNDS, these routines honor the current -rounding mode. - -For an example of more general conversions based on dtoa(), see -netlib's "printf.c from ampl/solvers". - -For double-double -> decimal, g_ddfmt() assumes IEEE-like arithmetic -of precision max(126, #bits(input)) bits, where #bits(input) is the -number of mantissa bits needed to represent the sum of the two double -values in the input. - -The makefile creates a library, gdtoa.a. To use the helper -routines, a program only needs to include gdtoa.h. All the -source files for gdtoa.a include a more extensive gdtoaimp.h; -among other things, gdtoaimp.h has #defines that make "internal" -names end in _D2A. To make a "system" library, one could modify -these #defines to make the names start with __. - -Various comments about possible #defines appear in gdtoaimp.h, -but for most purposes, arith.h should set suitable #defines. - -Systems with preemptive scheduling of multiple threads require some -manual intervention. On such systems, it's necessary to compile -dmisc.c, dtoa.c gdota.c, and misc.c with MULTIPLE_THREADS #defined, -and to provide (or suitably #define) two locks, acquired by -ACQUIRE_DTOA_LOCK(n) and freed by FREE_DTOA_LOCK(n) for n = 0 or 1. -(The second lock, accessed in pow5mult, ensures lazy evaluation of -only one copy of high powers of 5; omitting this lock would introduce -a small probability of wasting memory, but would otherwise be harmless.) -Routines that call dtoa or gdtoa directly must also invoke freedtoa(s) -to free the value s returned by dtoa or gdtoa. It's OK to do so whether -or not MULTIPLE_THREADS is #defined, and the helper g_*fmt routines -listed above all do this indirectly (in gfmt_D2A(), which they all call). - -By default, there is a private pool of memory of length 2000 bytes -for intermediate quantities, and MALLOC (see gdtoaimp.h) is called only -if the private pool does not suffice. 2000 is large enough that MALLOC -is called only under very unusual circumstances (decimal -> binary -conversion of very long strings) for conversions to and from double -precision. For systems with preemptively scheduled multiple threads -or for conversions to extended or quad, it may be appropriate to -#define PRIVATE_MEM nnnn, where nnnn is a suitable value > 2000. -For extended and quad precisions, -DPRIVATE_MEM=20000 is probably -plenty even for many digits at the ends of the exponent range. -Use of the private pool avoids some overhead. - -Directory test provides some test routines. See its README. -I've also tested this stuff (except double double conversions) -with Vern Paxson's testbase program: see - - V. Paxson and W. Kahan, "A Program for Testing IEEE Binary-Decimal - Conversion", manuscript, May 1991, - ftp://ftp.ee.lbl.gov/testbase-report.ps.Z . - -(The same ftp directory has source for testbase.) - -Some system-dependent additions to CFLAGS in the makefile: - - HU-UX: -Aa -Ae - OSF (DEC Unix): -ieee_with_no_inexact - SunOS 4.1x: -DKR_headers -DBad_float_h - -If you want to put this stuff into a shared library and your -operating system requires export lists for shared libraries, -the following would be an appropriate export list: - - dtoa - freedtoa - g_Qfmt - g_ddfmt - g_dfmt - g_ffmt - g_xLfmt - g_xfmt - gdtoa - strtoIQ - strtoId - strtoIdd - strtoIf - strtoIx - strtoIxL - strtod - strtodI - strtodg - strtof - strtopQ - strtopd - strtopdd - strtopf - strtopx - strtopxL - strtorQ - strtord - strtordd - strtorf - strtorx - strtorxL - -When time permits, I (dmg) hope to write in more detail about the -present conversion routines; for now, this README file must suffice. -Meanwhile, if you wish to write helper functions for other kinds of -IEEE-like arithmetic, some explanation of struct FPI and the bits -array may be helpful. Both gdtoa and strtodg operate on a bits array -described by FPI *fpi. The bits array is of type ULong, a 32-bit -unsigned integer type. Floating-point numbers have fpi->nbits bits, -with the least significant 32 bits in bits[0], the next 32 bits in -bits[1], etc. These numbers are regarded as integers multiplied by -2^e (i.e., 2 to the power of the exponent e), where e is the second -argument (be) to gdtoa and is stored in *exp by strtodg. The minimum -and maximum exponent values fpi->emin and fpi->emax for normalized -floating-point numbers reflect this arrangement. For example, the -P754 standard for binary IEEE arithmetic specifies doubles as having -53 bits, with normalized values of the form 1.xxxxx... times 2^(b-1023), -with 52 bits (the x's) and the biased exponent b represented explicitly; -b is an unsigned integer in the range 1 <= b <= 2046 for normalized -finite doubles, b = 0 for denormals, and b = 2047 for Infinities and NaNs. -To turn an IEEE double into the representation used by strtodg and gdtoa, -we multiply 1.xxxx... by 2^52 (to make it an integer) and reduce the -exponent e = (b-1023) by 52: - - fpi->emin = 1 - 1023 - 52 - fpi->emax = 1046 - 1023 - 52 - -In various wrappers for IEEE double, we actually write -53 + 1 rather -than -52, to emphasize that there are 53 bits including one implicit bit. -Field fpi->rounding indicates the desired rounding direction, with -possible values - FPI_Round_zero = toward 0, - FPI_Round_near = unbiased rounding -- the IEEE default, - FPI_Round_up = toward +Infinity, and - FPI_Round_down = toward -Infinity -given in gdtoa.h. - -Field fpi->sudden_underflow indicates whether strtodg should return -denormals or flush them to zero. Normal floating-point numbers have -bit fpi->nbits in the bits array on. Denormals have it off, with -exponent = fpi->emin. Strtodg provides distinct return values for normals -and denormals; see gdtoa.h. - -Compiling g__fmt.c, strtod.c, and strtodg.c with -DUSE_LOCALE causes -the decimal-point character to be taken from the current locale; otherwise -it is '.'. - -Source files dtoa.c and strtod.c in this directory are derived from -netlib's "dtoa.c from fp" and are meant to function equivalently. -When compiled with Honor_FLT_ROUNDS #defined (on systems that provide -FLT_ROUNDS and fegetround() as specified in the C99 standard), they -honor the current rounding mode. Because FLT_ROUNDS is buggy on some -(Linux) systems -- not reflecting calls on fesetround(), as the C99 -standard says it should -- when Honor_FLT_ROUNDS is #defined, the -current rounding mode is obtained from fegetround() rather than from -FLT_ROUNDS, unless Trust_FLT_ROUNDS is also #defined. - -Compile with -DUSE_LOCALE to use the current locale; otherwise -decimal points are assumed to be '.'. With -DUSE_LOCALE, unless -you also compile with -DNO_LOCALE_CACHE, the details about the -current "decimal point" character string are cached and assumed not -to change during the program's execution. - -Please send comments to David M. Gay (dmg at acm dot org, with " at " -changed at "@" and " dot " changed to "."). diff --git a/src/lib/evil/gdtoa/README.mingw b/src/lib/evil/gdtoa/README.mingw deleted file mode 100644 index b41d1fd..0000000 --- a/src/lib/evil/gdtoa/README.mingw +++ /dev/null @@ -1,20 +0,0 @@ -The gdtoa code here is based on David M. Gay's original -gdtoa source at http://www.netlib.org/fp/ from Sep. 27, -2010. The major changes between the original source and -the mingw port here include: - -* IBM, CRAY and VAX code removed. -* KR_headers, ANSI, Void and Char ifdefs are removed. -* gdtoa symbols are prepended with "__". -* g_xfmt() uses __fpclassifyl() instead of interpreting - the flags bit-wise. -* lo0bits() and hi0bits() of misc.c replaced by wrappers - to gcc's __builtin_clz() -* The double/ulong union renamed from U to dbl_union - (grep'ped better..) -* A few compiler warning fixes here and there. -* A few other insignificant changes (if any..) - -MinGW specific compile-time definitions are at the top of -gdtoaimp.h and gdtoa.h headers. - diff --git a/src/lib/evil/gdtoa/arithchk.c b/src/lib/evil/gdtoa/arithchk.c deleted file mode 100644 index 901bab1..0000000 --- a/src/lib/evil/gdtoa/arithchk.c +++ /dev/null @@ -1,192 +0,0 @@ -/**************************************************************** -Copyright (C) 1997, 1998 Lucent Technologies -All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appear in all -copies and that both that the copyright notice and this -permission notice and warranty disclaimer appear in supporting -documentation, and that the name of Lucent or any of its entities -not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. -IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY -SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER -IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. -****************************************************************/ - -/* Try to deduce arith.h from arithmetic properties. */ -#ifdef MINGW_BUILD_GEN - -#include - - static int dalign; - typedef struct -Akind { - char *name; - int kind; - } Akind; - - static Akind -IEEE_8087 = { "IEEE_8087", 1 }, -IEEE_MC68k = { "IEEE_MC68k", 2 }, -IBM = { "IBM", 3 }, -VAX = { "VAX", 4 }, -CRAY = { "CRAY", 5}; - - static Akind * -Lcheck() -{ - union { - double d; - long L[2]; - } u; - struct { - double d; - long L; - } x[2]; - - if (sizeof(x) > 2*(sizeof(double) + sizeof(long))) - dalign = 1; - u.L[0] = u.L[1] = 0; - u.d = 1e13; - if (u.L[0] == 1117925532 && u.L[1] == -448790528) - return &IEEE_MC68k; - if (u.L[1] == 1117925532 && u.L[0] == -448790528) - return &IEEE_8087; - if (u.L[0] == -2065213935 && u.L[1] == 10752) - return &VAX; - if (u.L[0] == 1267827943 && u.L[1] == 704643072) - return &IBM; - return 0; - } - - static Akind * -icheck() -{ - union { - double d; - int L[2]; - } u; - struct { - double d; - int L; - } x[2]; - - if (sizeof(x) > 2*(sizeof(double) + sizeof(int))) - dalign = 1; - u.L[0] = u.L[1] = 0; - u.d = 1e13; - if (u.L[0] == 1117925532 && u.L[1] == -448790528) - return &IEEE_MC68k; - if (u.L[1] == 1117925532 && u.L[0] == -448790528) - return &IEEE_8087; - if (u.L[0] == -2065213935 && u.L[1] == 10752) - return &VAX; - if (u.L[0] == 1267827943 && u.L[1] == 704643072) - return &IBM; - return 0; - } - -char *emptyfmt = ""; /* avoid possible warning message with printf("") */ - - static Akind * -ccheck() -{ - union { - double d; - long L; - } u; - long Cray1; - - /* Cray1 = 4617762693716115456 -- without overflow on non-Crays */ - Cray1 = printf(emptyfmt) < 0 ? 0 : 4617762; - if (printf(emptyfmt, Cray1) >= 0) - Cray1 = 1000000*Cray1 + 693716; - if (printf(emptyfmt, Cray1) >= 0) - Cray1 = 1000000*Cray1 + 115456; - u.d = 1e13; - if (u.L == Cray1) - return &CRAY; - return 0; - } - - static int -fzcheck() -{ - double a, b; - int i; - - a = 1.; - b = .1; - for(i = 155;; b *= b, i >>= 1) { - if (i & 1) { - a *= b; - if (i == 1) - break; - } - } - b = a * a; - return b == 0.; - } - - int -main() -{ - Akind *a = 0; - int Ldef = 0; - FILE *f; - -#ifdef WRITE_ARITH_H /* for Symantec's buggy "make" */ - f = fopen("arith.h", "w"); - if (!f) { - printf("Cannot open arith.h\n"); - return 1; - } -#else - f = stdout; -#endif - - if (sizeof(double) == 2*sizeof(long)) - a = Lcheck(); - else if (sizeof(double) == 2*sizeof(int)) { - Ldef = 1; - a = icheck(); - } - else if (sizeof(double) == sizeof(long)) - a = ccheck(); - if (a) { - fprintf(f, "#define %s\n#define Arith_Kind_ASL %d\n", - a->name, a->kind); - if (Ldef) - fprintf(f, "#define Long int\n#define Intcast (int)(long)\n"); - if (dalign) - fprintf(f, "#define Double_Align\n"); - if (sizeof(char*) == 8) - fprintf(f, "#define X64_bit_pointers\n"); -#ifndef NO_LONG_LONG - if (sizeof(long long) < 8) -#endif - fprintf(f, "#define NO_LONG_LONG\n"); - if (a->kind <= 2 && fzcheck()) - fprintf(f, "#define Sudden_Underflow\n"); -#ifdef WRITE_ARITH_H /* for Symantec's buggy "make" */ - fclose(f); -#endif - return 0; - } - fprintf(f, "/* Unknown arithmetic */\n"); -#ifdef WRITE_ARITH_H /* for Symantec's buggy "make" */ - fclose(f); -#endif - return 1; - } -#endif /* MINGW_BUILD_GEN */ - diff --git a/src/lib/evil/gdtoa/dmisc.c b/src/lib/evil/gdtoa/dmisc.c deleted file mode 100644 index c61e9fa..0000000 --- a/src/lib/evil/gdtoa/dmisc.c +++ /dev/null @@ -1,196 +0,0 @@ -/**************************************************************** - -The author of this software is David M. Gay. - -Copyright (C) 1998 by Lucent Technologies -All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appear in all -copies and that both that the copyright notice and this -permission notice and warranty disclaimer appear in supporting -documentation, and that the name of Lucent or any of its entities -not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. -IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY -SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER -IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - -****************************************************************/ - -/* Please send bug reports to David M. Gay (dmg at acm dot org, - * with " at " changed at "@" and " dot " changed to "."). */ - -#include "gdtoaimp.h" - -#ifndef MULTIPLE_THREADS -char *dtoa_result; -#endif - -char *rv_alloc (int i) -{ - int j, k, *r; - - j = sizeof(ULong); - for(k = 0; - (int) (sizeof(Bigint) - sizeof(ULong) - sizeof(int)) + j <= i; - j <<= 1) - k++; - r = (int*)Balloc(k); - *r = k; - return -#ifndef MULTIPLE_THREADS - dtoa_result = -#endif - (char *)(r+1); -} - -char *nrv_alloc (char *s, char **rve, int n) -{ - char *rv, *t; - - t = rv = rv_alloc(n); - while((*t = *s++) !=0) - t++; - if (rve) - *rve = t; - return rv; -} - -/* freedtoa(s) must be used to free values s returned by dtoa - * when MULTIPLE_THREADS is #defined. It should be used in all cases, - * but for consistency with earlier versions of dtoa, it is optional - * when MULTIPLE_THREADS is not defined. - */ - -void __freedtoa (char *s) -{ - Bigint *b = (Bigint *)((int *)s - 1); - b->maxwds = 1 << (b->k = *(int*)b); - Bfree(b); -#ifndef MULTIPLE_THREADS - if (s == dtoa_result) - dtoa_result = 0; -#endif -} - -int quorem (Bigint *b, Bigint *S) -{ - int n; - ULong *bx, *bxe, q, *sx, *sxe; -#ifdef ULLong - ULLong borrow, carry, y, ys; -#else - ULong borrow, carry, y, ys; -#ifdef Pack_32 - ULong si, z, zs; -#endif -#endif - - n = S->wds; -#ifdef DEBUG - /*debug*/ if (b->wds > n) - /*debug*/ Bug("oversize b in quorem"); -#endif - if (b->wds < n) - return 0; - sx = S->x; - sxe = sx + --n; - bx = b->x; - bxe = bx + n; - q = *bxe / (*sxe + 1); /* ensure q <= true quotient */ -#ifdef DEBUG - /*debug*/ if (q > 9) - /*debug*/ Bug("oversized quotient in quorem"); -#endif - if (q) { - borrow = 0; - carry = 0; - do { -#ifdef ULLong - ys = *sx++ * (ULLong)q + carry; - carry = ys >> 32; - y = *bx - (ys & 0xffffffffUL) - borrow; - borrow = y >> 32 & 1UL; - *bx++ = y & 0xffffffffUL; -#else -#ifdef Pack_32 - si = *sx++; - ys = (si & 0xffff) * q + carry; - zs = (si >> 16) * q + (ys >> 16); - carry = zs >> 16; - y = (*bx & 0xffff) - (ys & 0xffff) - borrow; - borrow = (y & 0x10000) >> 16; - z = (*bx >> 16) - (zs & 0xffff) - borrow; - borrow = (z & 0x10000) >> 16; - Storeinc(bx, z, y); -#else - ys = *sx++ * q + carry; - carry = ys >> 16; - y = *bx - (ys & 0xffff) - borrow; - borrow = (y & 0x10000) >> 16; - *bx++ = y & 0xffff; -#endif -#endif - } while(sx <= sxe); - - if (!*bxe) { - bx = b->x; - while(--bxe > bx && !*bxe) - --n; - b->wds = n; - } - } - - if (cmp(b, S) >= 0) { - q++; - borrow = 0; - carry = 0; - bx = b->x; - sx = S->x; - do { -#ifdef ULLong - ys = *sx++ + carry; - carry = ys >> 32; - y = *bx - (ys & 0xffffffffUL) - borrow; - borrow = y >> 32 & 1UL; - *bx++ = y & 0xffffffffUL; -#else -#ifdef Pack_32 - si = *sx++; - ys = (si & 0xffff) + carry; - zs = (si >> 16) + (ys >> 16); - carry = zs >> 16; - y = (*bx & 0xffff) - (ys & 0xffff) - borrow; - borrow = (y & 0x10000) >> 16; - z = (*bx >> 16) - (zs & 0xffff) - borrow; - borrow = (z & 0x10000) >> 16; - Storeinc(bx, z, y); -#else - ys = *sx++ + carry; - carry = ys >> 16; - y = *bx - (ys & 0xffff) - borrow; - borrow = (y & 0x10000) >> 16; - *bx++ = y & 0xffff; -#endif -#endif - } while(sx <= sxe); - - bx = b->x; - bxe = bx + n; - if (!*bxe) { - while(--bxe > bx && !*bxe) - --n; - b->wds = n; - } - } - return q; -} diff --git a/src/lib/evil/gdtoa/dtoa.c b/src/lib/evil/gdtoa/dtoa.c deleted file mode 100644 index 2906bd9..0000000 --- a/src/lib/evil/gdtoa/dtoa.c +++ /dev/null @@ -1,750 +0,0 @@ -/**************************************************************** - -The author of this software is David M. Gay. - -Copyright (C) 1998, 1999 by Lucent Technologies -All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appear in all -copies and that both that the copyright notice and this -permission notice and warranty disclaimer appear in supporting -documentation, and that the name of Lucent or any of its entities -not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. -IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY -SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER -IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - -****************************************************************/ - -/* Please send bug reports to David M. Gay (dmg at acm dot org, - * with " at " changed at "@" and " dot " changed to "."). */ - -#include "gdtoaimp.h" - -/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string. - * - * Inspired by "How to Print Floating-Point Numbers Accurately" by - * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126]. - * - * Modifications: - * 1. Rather than iterating, we use a simple numeric overestimate - * to determine k = floor(log10(d)). We scale relevant - * quantities using O(log2(k)) rather than O(k) multiplications. - * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't - * try to generate digits strictly left to right. Instead, we - * compute with fewer bits and propagate the carry if necessary - * when rounding the final digit up. This is often faster. - * 3. Under the assumption that input will be rounded nearest, - * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22. - * That is, we allow equality in stopping tests when the - * round-nearest rule will give the same floating-point value - * as would satisfaction of the stopping test with strict - * inequality. - * 4. We remove common factors of powers of 2 from relevant - * quantities. - * 5. When converting floating-point integers less than 1e16, - * we use floating-point arithmetic rather than resorting - * to multiple-precision integers. - * 6. When asked to produce fewer than 15 digits, we first try - * to get by with floating-point arithmetic; we resort to - * multiple-precision integer arithmetic only if we cannot - * guarantee that the floating-point calculation has given - * the correctly rounded result. For k requested digits and - * "uniformly" distributed input, the probability is - * something like 10^(k-15) that we must resort to the Long - * calculation. - */ - -#ifdef Honor_FLT_ROUNDS -#undef Check_FLT_ROUNDS -#define Check_FLT_ROUNDS -#else -#define Rounding Flt_Rounds -#endif - -char *__dtoa (double d0, int mode, int ndigits, int *decpt, int *sign, char **rve) -{ - /* Arguments ndigits, decpt, sign are similar to those - of ecvt and fcvt; trailing zeros are suppressed from - the returned string. If not null, *rve is set to point - to the end of the return value. If d is +-Infinity or NaN, - then *decpt is set to 9999. - - mode: - 0 ==> shortest string that yields d when read in - and rounded to nearest. - 1 ==> like 0, but with Steele & White stopping rule; - e.g. with IEEE P754 arithmetic , mode 0 gives - 1e23 whereas mode 1 gives 9.999999999999999e22. - 2 ==> max(1,ndigits) significant digits. This gives a - return value similar to that of ecvt, except - that trailing zeros are suppressed. - 3 ==> through ndigits past the decimal point. This - gives a return value similar to that from fcvt, - except that trailing zeros are suppressed, and - ndigits can be negative. - 4,5 ==> similar to 2 and 3, respectively, but (in - round-nearest mode) with the tests of mode 0 to - possibly return a shorter string that rounds to d. - With IEEE arithmetic and compilation with - -DHonor_FLT_ROUNDS, modes 4 and 5 behave the same - as modes 2 and 3 when FLT_ROUNDS != 1. - 6-9 ==> Debugging modes similar to mode - 4: don't try - fast floating-point estimate (if applicable). - - Values of mode other than 0-9 are treated as mode 0. - - Sufficient space is allocated to the return value - to hold the suppressed trailing zeros. - */ - - int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1, - j, j2, k, k0, k_check, leftright, m2, m5, s2, s5, - spec_case, try_quick; - Long L; -#ifndef Sudden_Underflow - int denorm; - ULong x; -#endif - Bigint *b, *b1, *delta, *mlo, *mhi, *S; - union _dbl_union d, d2, eps; - double ds; - char *s, *s0; -#ifdef SET_INEXACT - int inexact, oldinexact; -#endif -#ifdef Honor_FLT_ROUNDS /*{*/ - int Rounding; -#ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */ - Rounding = Flt_Rounds; -#else /*}{*/ - Rounding = 1; - switch(fegetround()) { - case FE_TOWARDZERO: Rounding = 0; break; - case FE_UPWARD: Rounding = 2; break; - case FE_DOWNWARD: Rounding = 3; - } -#endif /*}}*/ -#endif /*}*/ - -#ifndef MULTIPLE_THREADS - if (dtoa_result) { - __freedtoa(dtoa_result); - dtoa_result = 0; - } -#endif - d.d = d0; - if (word0(&d) & Sign_bit) { - /* set sign for everything, including 0's and NaNs */ - *sign = 1; - word0(&d) &= ~Sign_bit; /* clear sign bit */ - } - else - *sign = 0; - - if ((word0(&d) & Exp_mask) == Exp_mask) - { - /* Infinity or NaN */ - *decpt = 9999; - if (!word1(&d) && !(word0(&d) & 0xfffff)) - return nrv_alloc("Infinity", rve, 8); - return nrv_alloc("NaN", rve, 3); - } - if (!dval(&d)) { - *decpt = 1; - return nrv_alloc("0", rve, 1); - } - -#ifdef SET_INEXACT - try_quick = oldinexact = get_inexact(); - inexact = 1; -#endif -#ifdef Honor_FLT_ROUNDS - if (Rounding >= 2) { - if (*sign) - Rounding = Rounding == 2 ? 0 : 2; - else - if (Rounding != 2) - Rounding = 0; - } -#endif - - b = d2b(dval(&d), &be, &bbits); -#ifdef Sudden_Underflow - i = (int)(word0(&d) >> Exp_shift1 & (Exp_mask>>Exp_shift1)); -#else - if (( i = (int)(word0(&d) >> Exp_shift1 & (Exp_mask>>Exp_shift1)) )!=0) { -#endif - dval(&d2) = dval(&d); - word0(&d2) &= Frac_mask1; - word0(&d2) |= Exp_11; - - /* log(x) ~=~ log(1.5) + (x-1.5)/1.5 - * log10(x) = log(x) / log(10) - * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10)) - * log10(&d) = (i-Bias)*log(2)/log(10) + log10(&d2) - * - * This suggests computing an approximation k to log10(&d) by - * - * k = (i - Bias)*0.301029995663981 - * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 ); - * - * We want k to be too large rather than too small. - * The error in the first-order Taylor series approximation - * is in our favor, so we just round up the constant enough - * to compensate for any error in the multiplication of - * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077, - * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14, - * adding 1e-13 to the constant term more than suffices. - * Hence we adjust the constant term to 0.1760912590558. - * (We could get a more accurate k by invoking log10, - * but this is probably not worthwhile.) - */ - - i -= Bias; -#ifndef Sudden_Underflow - denorm = 0; - } - else { - /* d is denormalized */ - - i = bbits + be + (Bias + (P-1) - 1); - x = i > 32 ? word0(&d) << (64 - i) | word1(&d) >> (i - 32) - : word1(&d) << (32 - i); - dval(&d2) = x; - word0(&d2) -= 31*Exp_msk1; /* adjust exponent */ - i -= (Bias + (P-1) - 1) + 1; - denorm = 1; - } -#endif - ds = (dval(&d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981; - k = (int)ds; - if (ds < 0. && ds != k) - k--; /* want k = floor(ds) */ - k_check = 1; - if (k >= 0 && k <= Ten_pmax) { - if (dval(&d) < tens[k]) - k--; - k_check = 0; - } - j = bbits - i - 1; - if (j >= 0) { - b2 = 0; - s2 = j; - } - else { - b2 = -j; - s2 = 0; - } - if (k >= 0) { - b5 = 0; - s5 = k; - s2 += k; - } - else { - b2 -= k; - b5 = -k; - s5 = 0; - } - if (mode < 0 || mode > 9) - mode = 0; - -#ifndef SET_INEXACT -#ifdef Check_FLT_ROUNDS - try_quick = Rounding == 1; -#else - try_quick = 1; -#endif -#endif /*SET_INEXACT*/ - - if (mode > 5) { - mode -= 4; - try_quick = 0; - } - leftright = 1; - ilim = ilim1 = -1; /* Values for cases 0 and 1; done here to */ - /* silence erroneous "gcc -Wall" warning. */ - switch(mode) { - case 0: - case 1: - i = 18; - ndigits = 0; - break; - case 2: - leftright = 0; - /* no break */ - case 4: - if (ndigits <= 0) - ndigits = 1; - ilim = ilim1 = i = ndigits; - break; - case 3: - leftright = 0; - /* no break */ - case 5: - i = ndigits + k + 1; - ilim = i; - ilim1 = i - 1; - if (i <= 0) - i = 1; - } - s = s0 = rv_alloc(i); - -#ifdef Honor_FLT_ROUNDS - if (mode > 1 && Rounding != 1) - leftright = 0; -#endif - - if (ilim >= 0 && ilim <= Quick_max && try_quick) { - - /* Try to get by with floating-point arithmetic. */ - - i = 0; - dval(&d2) = dval(&d); - k0 = k; - ilim0 = ilim; - ieps = 2; /* conservative */ - if (k > 0) { - ds = tens[k&0xf]; - j = k >> 4; - if (j & Bletch) { - /* prevent overflows */ - j &= Bletch - 1; - dval(&d) /= bigtens[n_bigtens-1]; - ieps++; - } - for(; j; j >>= 1, i++) - if (j & 1) { - ieps++; - ds *= bigtens[i]; - } - dval(&d) /= ds; - } - else if (( j2 = -k )!=0) { - dval(&d) *= tens[j2 & 0xf]; - for(j = j2 >> 4; j; j >>= 1, i++) - if (j & 1) { - ieps++; - dval(&d) *= bigtens[i]; - } - } - if (k_check && dval(&d) < 1. && ilim > 0) { - if (ilim1 <= 0) - goto fast_failed; - ilim = ilim1; - k--; - dval(&d) *= 10.; - ieps++; - } - dval(&eps) = ieps*dval(&d) + 7.; - word0(&eps) -= (P-1)*Exp_msk1; - if (ilim == 0) { - S = mhi = 0; - dval(&d) -= 5.; - if (dval(&d) > dval(&eps)) - goto one_digit; - if (dval(&d) < -dval(&eps)) - goto no_digits; - goto fast_failed; - } -#ifndef No_leftright - if (leftright) { - /* Use Steele & White method of only - * generating digits needed. - */ - dval(&eps) = 0.5/tens[ilim-1] - dval(&eps); - for(i = 0;;) { - L = dval(&d); - dval(&d) -= L; - *s++ = '0' + (int)L; - if (dval(&d) < dval(&eps)) - goto ret1; - if (1. - dval(&d) < dval(&eps)) - goto bump_up; - if (++i >= ilim) - break; - dval(&eps) *= 10.; - dval(&d) *= 10.; - } - } - else { -#endif - /* Generate ilim digits, then fix them up. */ - dval(&eps) *= tens[ilim-1]; - for(i = 1;; i++, dval(&d) *= 10.) { - L = (Long)(dval(&d)); - if (!(dval(&d) -= L)) - ilim = i; - *s++ = '0' + (int)L; - if (i == ilim) { - if (dval(&d) > 0.5 + dval(&eps)) - goto bump_up; - else if (dval(&d) < 0.5 - dval(&eps)) { - while(*--s == '0'); - s++; - goto ret1; - } - break; - } - } -#ifndef No_leftright - } -#endif - fast_failed: - s = s0; - dval(&d) = dval(&d2); - k = k0; - ilim = ilim0; - } - - /* Do we have a "small" integer? */ - - if (be >= 0 && k <= Int_max) { - /* Yes. */ - ds = tens[k]; - if (ndigits < 0 && ilim <= 0) { - S = mhi = 0; - if (ilim < 0 || dval(&d) <= 5*ds) - goto no_digits; - goto one_digit; - } - for(i = 1;; i++, dval(&d) *= 10.) { - L = (Long)(dval(&d) / ds); - dval(&d) -= L*ds; -#ifdef Check_FLT_ROUNDS - /* If FLT_ROUNDS == 2, L will usually be high by 1 */ - if (dval(&d) < 0) { - L--; - dval(&d) += ds; - } -#endif - *s++ = '0' + (int)L; - if (!dval(&d)) { -#ifdef SET_INEXACT - inexact = 0; -#endif - break; - } - if (i == ilim) { -#ifdef Honor_FLT_ROUNDS - if (mode > 1) - switch(Rounding) { - case 0: goto ret1; - case 2: goto bump_up; - } -#endif - dval(&d) += dval(&d); -#ifdef ROUND_BIASED - if (dval(&d) >= ds) -#else - if (dval(&d) > ds || (dval(&d) == ds && L & 1)) -#endif - { - bump_up: - while(*--s == '9') - if (s == s0) { - k++; - *s = '0'; - break; - } - ++*s++; - } - break; - } - } - goto ret1; - } - - m2 = b2; - m5 = b5; - mhi = mlo = 0; - if (leftright) { - i = -#ifndef Sudden_Underflow - denorm ? be + (Bias + (P-1) - 1 + 1) : -#endif - 1 + P - bbits; - b2 += i; - s2 += i; - mhi = i2b(1); - } - if (m2 > 0 && s2 > 0) { - i = m2 < s2 ? m2 : s2; - b2 -= i; - m2 -= i; - s2 -= i; - } - if (b5 > 0) { - if (leftright) { - if (m5 > 0) { - mhi = pow5mult(mhi, m5); - b1 = mult(mhi, b); - Bfree(b); - b = b1; - } - if (( j = b5 - m5 )!=0) - b = pow5mult(b, j); - } - else - b = pow5mult(b, b5); - } - S = i2b(1); - if (s5 > 0) - S = pow5mult(S, s5); - - /* Check for special case that d is a normalized power of 2. */ - - spec_case = 0; - if ((mode < 2 || leftright) -#ifdef Honor_FLT_ROUNDS - && Rounding == 1 -#endif - ) { - if (!word1(&d) && !(word0(&d) & Bndry_mask) -#ifndef Sudden_Underflow - && word0(&d) & (Exp_mask & ~Exp_msk1) -#endif - ) { - /* The special case */ - b2 += Log2P; - s2 += Log2P; - spec_case = 1; - } - } - - /* Arrange for convenient computation of quotients: - * shift left if necessary so divisor has 4 leading 0 bits. - * - * Perhaps we should just compute leading 28 bits of S once - * and for all and pass them and a shift to quorem, so it - * can do shifts and ors to compute the numerator for q. - */ -#ifdef Pack_32 - if (( i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f )!=0) - i = 32 - i; -#else - if (( i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0xf )!=0) - i = 16 - i; -#endif - if (i > 4) { - i -= 4; - b2 += i; - m2 += i; - s2 += i; - } - else if (i < 4) { - i += 28; - b2 += i; - m2 += i; - s2 += i; - } - if (b2 > 0) - b = lshift(b, b2); - if (s2 > 0) - S = lshift(S, s2); - if (k_check) { - if (cmp(b,S) < 0) { - k--; - b = multadd(b, 10, 0); /* we botched the k estimate */ - if (leftright) - mhi = multadd(mhi, 10, 0); - ilim = ilim1; - } - } - if (ilim <= 0 && (mode == 3 || mode == 5)) { - if (ilim < 0 || cmp(b,S = multadd(S,5,0)) <= 0) { - /* no digits, fcvt style */ - no_digits: - k = -1 - ndigits; - goto ret; - } - one_digit: - *s++ = '1'; - k++; - goto ret; - } - if (leftright) { - if (m2 > 0) - mhi = lshift(mhi, m2); - - /* Compute mlo -- check for special case - * that d is a normalized power of 2. - */ - - mlo = mhi; - if (spec_case) { - mhi = Balloc(mhi->k); - Bcopy(mhi, mlo); - mhi = lshift(mhi, Log2P); - } - - for(i = 1;;i++) { - dig = quorem(b,S) + '0'; - /* Do we yet have the shortest decimal string - * that will round to d? - */ - j = cmp(b, mlo); - delta = diff(S, mhi); - j2 = delta->sign ? 1 : cmp(b, delta); - Bfree(delta); -#ifndef ROUND_BIASED - if (j2 == 0 && mode != 1 && !(word1(&d) & 1) -#ifdef Honor_FLT_ROUNDS - && Rounding >= 1 -#endif - ) { - if (dig == '9') - goto round_9_up; - if (j > 0) - dig++; -#ifdef SET_INEXACT - else if (!b->x[0] && b->wds <= 1) - inexact = 0; -#endif - *s++ = dig; - goto ret; - } -#endif - if (j < 0 || (j == 0 && mode != 1 -#ifndef ROUND_BIASED - && !(word1(&d) & 1) -#endif - )) { - if (!b->x[0] && b->wds <= 1) { -#ifdef SET_INEXACT - inexact = 0; -#endif - goto accept_dig; - } -#ifdef Honor_FLT_ROUNDS - if (mode > 1) - switch(Rounding) { - case 0: goto accept_dig; - case 2: goto keep_dig; - } -#endif /*Honor_FLT_ROUNDS*/ - if (j2 > 0) { - b = lshift(b, 1); - j2 = cmp(b, S); -#ifdef ROUND_BIASED - if (j2 >= 0 /*)*/ -#else - if ((j2 > 0 || (j2 == 0 && dig & 1)) -#endif - && dig++ == '9') - goto round_9_up; - } - accept_dig: - *s++ = dig; - goto ret; - } - if (j2 > 0) { -#ifdef Honor_FLT_ROUNDS - if (!Rounding) - goto accept_dig; -#endif - if (dig == '9') { /* possible if i == 1 */ - round_9_up: - *s++ = '9'; - goto roundoff; - } - *s++ = dig + 1; - goto ret; - } -#ifdef Honor_FLT_ROUNDS - keep_dig: -#endif - *s++ = dig; - if (i == ilim) - break; - b = multadd(b, 10, 0); - if (mlo == mhi) - mlo = mhi = multadd(mhi, 10, 0); - else { - mlo = multadd(mlo, 10, 0); - mhi = multadd(mhi, 10, 0); - } - } - } - else - for(i = 1;; i++) { - *s++ = dig = quorem(b,S) + '0'; - if (!b->x[0] && b->wds <= 1) { -#ifdef SET_INEXACT - inexact = 0; -#endif - goto ret; - } - if (i >= ilim) - break; - b = multadd(b, 10, 0); - } - - /* Round off last digit */ - -#ifdef Honor_FLT_ROUNDS - switch(Rounding) { - case 0: goto trimzeros; - case 2: goto roundoff; - } -#endif - b = lshift(b, 1); - j = cmp(b, S); -#ifdef ROUND_BIASED - if (j >= 0) -#else - if (j > 0 || (j == 0 && dig & 1)) -#endif - { - roundoff: - while(*--s == '9') - if (s == s0) { - k++; - *s++ = '1'; - goto ret; - } - ++*s++; - } - else { -#ifdef Honor_FLT_ROUNDS - trimzeros: -#endif - while(*--s == '0'); - s++; - } - ret: - Bfree(S); - if (mhi) { - if (mlo && mlo != mhi) - Bfree(mlo); - Bfree(mhi); - } - ret1: -#ifdef SET_INEXACT - if (inexact) { - if (!oldinexact) { - word0(&d) = Exp_1 + (70 << Exp_shift); - word1(&d) = 0; - dval(&d) += 1.; - } - } - else if (!oldinexact) - clear_inexact(); -#endif - Bfree(b); - *s = 0; - *decpt = k + 1; - if (rve) - *rve = s; - return s0; -} diff --git a/src/lib/evil/gdtoa/g__fmt.c b/src/lib/evil/gdtoa/g__fmt.c deleted file mode 100644 index 49bd95a..0000000 --- a/src/lib/evil/gdtoa/g__fmt.c +++ /dev/null @@ -1,142 +0,0 @@ -/**************************************************************** - -The author of this software is David M. Gay. - -Copyright (C) 1998 by Lucent Technologies -All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appear in all -copies and that both that the copyright notice and this -permission notice and warranty disclaimer appear in supporting -documentation, and that the name of Lucent or any of its entities -not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. -IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY -SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER -IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - -****************************************************************/ - -/* Please send bug reports to David M. Gay (dmg at acm dot org, - * with " at " changed at "@" and " dot " changed to "."). */ - -#include "gdtoaimp.h" - -#ifdef USE_LOCALE -#include "locale.h" -#endif - -char *__g__fmt (char *b, char *s, char *se, int decpt, ULong sign, size_t blen) -{ - int i, j, k; - char *be, *s0; - size_t len; -#ifdef USE_LOCALE -#ifdef NO_LOCALE_CACHE - char *decimalpoint = localeconv()->decimal_point; - size_t dlen = strlen(decimalpoint); -#else - char *decimalpoint; - static char *decimalpoint_cache; - static size_t dlen; - if (!(s0 = decimalpoint_cache)) { - s0 = localeconv()->decimal_point; - dlen = strlen(s0); - if ((decimalpoint_cache = (char*)MALLOC(strlen(s0) + 1))) { - strcpy(decimalpoint_cache, s0); - s0 = decimalpoint_cache; - } - } - decimalpoint = s0; -#endif -#else -#define dlen 0 -#endif - s0 = s; - len = (se-s) + dlen + 6; /* 6 = sign + e+dd + trailing null */ - if (blen < len) - goto ret0; - be = b + blen - 1; - if (sign) - *b++ = '-'; - if (decpt <= -4 || decpt > se - s + 5) { - *b++ = *s++; - if (*s) { -#ifdef USE_LOCALE - while((*b = *decimalpoint++)) - ++b; -#else - *b++ = '.'; -#endif - while((*b = *s++) !=0) - b++; - } - *b++ = 'e'; - /* sprintf(b, "%+.2d", decpt - 1); */ - if (--decpt < 0) { - *b++ = '-'; - decpt = -decpt; - } - else - *b++ = '+'; - for(j = 2, k = 10; 10*k <= decpt; j++, k *= 10){} - for(;;) { - i = decpt / k; - if (b >= be) - goto ret0; - *b++ = i + '0'; - if (--j <= 0) - break; - decpt -= i*k; - decpt *= 10; - } - *b = 0; - } - else if (decpt <= 0) { -#ifdef USE_LOCALE - while((*b = *decimalpoint++)) - ++b; -#else - *b++ = '.'; -#endif - if (be < b - decpt + (se - s)) - goto ret0; - for(; decpt < 0; decpt++) - *b++ = '0'; - while((*b = *s++) != 0) - b++; - } - else { - while((*b = *s++) != 0) { - b++; - if (--decpt == 0 && *s) { -#ifdef USE_LOCALE - while((*b = *decimalpoint++)) - ++b; -#else - *b++ = '.'; -#endif - } - } - if (b + decpt > be) { - ret0: - b = 0; - goto ret; - } - for(; decpt > 0; decpt--) - *b++ = '0'; - *b = 0; - } - ret: - __freedtoa(s0); - return b; -} diff --git a/src/lib/evil/gdtoa/g_dfmt.c b/src/lib/evil/gdtoa/g_dfmt.c deleted file mode 100644 index 50ed708..0000000 --- a/src/lib/evil/gdtoa/g_dfmt.c +++ /dev/null @@ -1,90 +0,0 @@ -/**************************************************************** - -The author of this software is David M. Gay. - -Copyright (C) 1998 by Lucent Technologies -All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appear in all -copies and that both that the copyright notice and this -permission notice and warranty disclaimer appear in supporting -documentation, and that the name of Lucent or any of its entities -not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. -IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY -SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER -IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - -****************************************************************/ - -/* Please send bug reports to David M. Gay (dmg at acm dot org, - * with " at " changed at "@" and " dot " changed to "."). */ - -#include "gdtoaimp.h" - -char *__g_dfmt (char *buf, double *d, int ndig, size_t bufsize) -{ - static FPI fpi0 = { 53, 1-1023-53+1, 2046-1023-53+1, 1, 0, Int_max }; - char *b, *s, *se; - ULong bits[2], *L, sign; - int decpt, ex, i, mode; -#ifdef Honor_FLT_ROUNDS -#include "gdtoa_fltrnds.h" -#else -#define fpi &fpi0 -#endif - - if (ndig < 0) - ndig = 0; - if ((int) bufsize < ndig + 10) - return 0; - - L = (ULong*)d; - sign = L[_0] & 0x80000000L; - if ((L[_0] & 0x7ff00000) == 0x7ff00000) { - /* Infinity or NaN */ - if (bufsize < 10) - return 0; - if (L[_0] & 0xfffff || L[_1]) { - return strcp(buf, "NaN"); - } - b = buf; - if (sign) - *b++ = '-'; - return strcp(b, "Infinity"); - } - if (L[_1] == 0 && (L[_0] ^ sign) == 0 /*d == 0.*/) { - b = buf; -#ifndef IGNORE_ZERO_SIGN - if (L[_0] & 0x80000000L) - *b++ = '-'; -#endif - *b++ = '0'; - *b = 0; - return b; - } - bits[0] = L[_1]; - bits[1] = L[_0] & 0xfffff; - if ( (ex = (L[_0] >> 20) & 0x7ff) !=0) - bits[1] |= 0x100000; - else - ex = 1; - ex -= 0x3ff + 52; - mode = 2; - if (ndig <= 0) - mode = 0; - i = STRTOG_Normal; - if (sign) - i = STRTOG_Normal | STRTOG_Neg; - s = __gdtoa(fpi, ex, bits, &i, mode, ndig, &decpt, &se); - return __g__fmt(buf, s, se, decpt, sign, bufsize); -} diff --git a/src/lib/evil/gdtoa/g_ffmt.c b/src/lib/evil/gdtoa/g_ffmt.c deleted file mode 100644 index f3f7c24..0000000 --- a/src/lib/evil/gdtoa/g_ffmt.c +++ /dev/null @@ -1,88 +0,0 @@ -/**************************************************************** - -The author of this software is David M. Gay. - -Copyright (C) 1998 by Lucent Technologies -All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appear in all -copies and that both that the copyright notice and this -permission notice and warranty disclaimer appear in supporting -documentation, and that the name of Lucent or any of its entities -not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. -IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY -SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER -IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - -****************************************************************/ - -/* Please send bug reports to David M. Gay (dmg at acm dot org, - * with " at " changed at "@" and " dot " changed to "."). */ - -#include "gdtoaimp.h" - -char *__g_ffmt (char *buf, float *f, int ndig, size_t bufsize) -{ - static FPI fpi0 = { 24, 1-127-24+1, 254-127-24+1, 1, 0, 6 }; - char *b, *s, *se; - ULong bits[1], *L, sign; - int decpt, ex, i, mode; -#ifdef Honor_FLT_ROUNDS -#include "gdtoa_fltrnds.h" -#else -#define fpi &fpi0 -#endif - - if (ndig < 0) - ndig = 0; - if ((int) bufsize < ndig + 10) - return 0; - - L = (ULong*)f; - sign = L[0] & 0x80000000L; - if ((L[0] & 0x7f800000) == 0x7f800000) { - /* Infinity or NaN */ - if (L[0] & 0x7fffff) { - return strcp(buf, "NaN"); - } - b = buf; - if (sign) - *b++ = '-'; - return strcp(b, "Infinity"); - } - if (*f == 0.) { - b = buf; -#ifndef IGNORE_ZERO_SIGN - if (L[0] & 0x80000000L) - *b++ = '-'; -#endif - *b++ = '0'; - *b = 0; - return b; - } - bits[0] = L[0] & 0x7fffff; - if ( (ex = (L[0] >> 23) & 0xff) !=0) - bits[0] |= 0x800000; - else - ex = 1; - ex -= 0x7f + 23; - mode = 2; - if (ndig <= 0) { - if (bufsize < 16) - return 0; - mode = 0; - } - i = STRTOG_Normal; - s = __gdtoa(fpi, ex, bits, &i, mode, ndig, &decpt, &se); - return __g__fmt(buf, s, se, decpt, sign, bufsize); -} diff --git a/src/lib/evil/gdtoa/g_xfmt.c b/src/lib/evil/gdtoa/g_xfmt.c deleted file mode 100644 index da11a58..0000000 --- a/src/lib/evil/gdtoa/g_xfmt.c +++ /dev/null @@ -1,143 +0,0 @@ -/**************************************************************** - -The author of this software is David M. Gay. - -Copyright (C) 1998 by Lucent Technologies -All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appear in all -copies and that both that the copyright notice and this -permission notice and warranty disclaimer appear in supporting -documentation, and that the name of Lucent or any of its entities -not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. -IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY -SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER -IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - -****************************************************************/ - -/* Please send bug reports to David M. Gay (dmg at acm dot org, - * with " at " changed at "@" and " dot " changed to "."). */ - -#include "gdtoaimp.h" - -#undef _0 -#undef _1 - -/* one or the other of IEEE_MC68k or IEEE_8087 should be #defined */ - -#ifdef IEEE_MC68k -#define _0 0 -#define _1 1 -#define _2 2 -#define _3 3 -#define _4 4 -#endif -#ifdef IEEE_8087 -#define _0 4 -#define _1 3 -#define _2 2 -#define _3 1 -#define _4 0 -#endif - -char *__g_xfmt (char *buf, void *V, int ndig, size_t bufsize) -{ - static FPI fpi0 = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, 0, Int_max }; - char *b, *s, *se; - ULong bits[2], sign; - UShort *L; - int decpt, ex, i, mode; -#if defined(__MINGW32__) || defined(__MINGW64__) - int fptype = __fpclassifyl (*(long double*) V); -#endif /* MinGW */ -#ifdef Honor_FLT_ROUNDS -#include "gdtoa_fltrnds.h" -#else -#define fpi &fpi0 -#endif - - if (ndig < 0) - ndig = 0; - if ((int) bufsize < ndig + 10) - return 0; - - L = (UShort *)V; - sign = L[_0] & 0x8000; - ex = L[_0] & 0x7fff; - bits[1] = (L[_1] << 16) | L[_2]; - bits[0] = (L[_3] << 16) | L[_4]; - -#if defined(__MINGW32__) || defined(__MINGW64__) - if (fptype & FP_NAN) { - /* NaN or Inf */ - if (fptype & FP_NORMAL) { - b = buf; - *b++ = sign ? '-': '+'; - strncpy (b, "Infinity", ndig ? ndig : 8); - return (buf + strlen (buf)); - } - strncpy (buf, "NaN", ndig ? ndig : 3); - return (buf + strlen (buf)); - } - else if (fptype & FP_NORMAL) { - /* Normal or subnormal */ - if (fptype & FP_ZERO) { - i = STRTOG_Denormal; - ex = 1; - } - else - i = STRTOG_Normal; - } -#else - if (ex != 0) { - if (ex == 0x7fff) { - /* Infinity or NaN */ - if (bits[0] | bits[1]) - b = strcp(buf, "NaN"); - else { - b = buf; - if (sign) - *b++ = '-'; - b = strcp(b, "Infinity"); - } - return b; - } - i = STRTOG_Normal; - } - else if (bits[0] | bits[1]) { - i = STRTOG_Denormal; - ex = 1; - } -#endif - else { - /* i = STRTOG_Zero; */ - b = buf; -#ifndef IGNORE_ZERO_SIGN - if (sign) - *b++ = '-'; -#endif - *b++ = '0'; - *b = 0; - return b; - } - ex -= 0x3fff + 63; - mode = 2; - if (ndig <= 0) { - if (bufsize < 32) - return 0; - mode = 0; - } - s = __gdtoa(fpi, ex, bits, &i, mode, ndig, &decpt, &se); - return __g__fmt(buf, s, se, decpt, sign, bufsize); -} diff --git a/src/lib/evil/gdtoa/gd_arith.h b/src/lib/evil/gdtoa/gd_arith.h deleted file mode 100644 index f86e633..0000000 --- a/src/lib/evil/gdtoa/gd_arith.h +++ /dev/null @@ -1,6 +0,0 @@ -#define IEEE_8087 -#define Arith_Kind_ASL 1 -#define Double_Align -#ifdef _WIN64 -#define X64_bit_pointers -#endif /* w64 */ diff --git a/src/lib/evil/gdtoa/gd_qnan.h b/src/lib/evil/gdtoa/gd_qnan.h deleted file mode 100644 index 87eba8f..0000000 --- a/src/lib/evil/gdtoa/gd_qnan.h +++ /dev/null @@ -1,12 +0,0 @@ -#define f_QNAN 0xffc00000 -#define d_QNAN0 0x0 -#define d_QNAN1 0xfff80000 -#define ld_QNAN0 0x0 -#define ld_QNAN1 0xc0000000 -#define ld_QNAN2 0xffff -#define ld_QNAN3 0x0 -#define ldus_QNAN0 0x0 -#define ldus_QNAN1 0x0 -#define ldus_QNAN2 0x0 -#define ldus_QNAN3 0xc000 -#define ldus_QNAN4 0xffff diff --git a/src/lib/evil/gdtoa/gdtoa.c b/src/lib/evil/gdtoa/gdtoa.c deleted file mode 100644 index cf9c290..0000000 --- a/src/lib/evil/gdtoa/gdtoa.c +++ /dev/null @@ -1,733 +0,0 @@ -/**************************************************************** - -The author of this software is David M. Gay. - -Copyright (C) 1998, 1999 by Lucent Technologies -All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appear in all -copies and that both that the copyright notice and this -permission notice and warranty disclaimer appear in supporting -documentation, and that the name of Lucent or any of its entities -not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. -IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY -SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER -IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - -****************************************************************/ - -/* Please send bug reports to David M. Gay (dmg at acm dot org, - * with " at " changed at "@" and " dot " changed to "."). */ - -#include "gdtoaimp.h" - -static Bigint *bitstob (ULong *bits, int nbits, int *bbits) -{ - int i, k; - Bigint *b; - ULong *be, *x, *x0; - - i = ULbits; - k = 0; - while(i < nbits) { - i <<= 1; - k++; - } -#ifndef Pack_32 - if (!k) - k = 1; -#endif - b = Balloc(k); - be = bits + ((nbits - 1) >> kshift); - x = x0 = b->x; - do { - *x++ = *bits & ALL_ON; -#ifdef Pack_16 - *x++ = (*bits >> 16) & ALL_ON; -#endif - } while(++bits <= be); - i = x - x0; - while(!x0[--i]) - if (!i) { - b->wds = 0; - *bbits = 0; - goto ret; - } - b->wds = i + 1; - *bbits = i*ULbits + 32 - hi0bits(b->x[i]); - ret: - return b; -} - -/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string. - * - * Inspired by "How to Print Floating-Point Numbers Accurately" by - * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126]. - * - * Modifications: - * 1. Rather than iterating, we use a simple numeric overestimate - * to determine k = floor(log10(d)). We scale relevant - * quantities using O(log2(k)) rather than O(k) multiplications. - * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't - * try to generate digits strictly left to right. Instead, we - * compute with fewer bits and propagate the carry if necessary - * when rounding the final digit up. This is often faster. - * 3. Under the assumption that input will be rounded nearest, - * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22. - * That is, we allow equality in stopping tests when the - * round-nearest rule will give the same floating-point value - * as would satisfaction of the stopping test with strict - * inequality. - * 4. We remove common factors of powers of 2 from relevant - * quantities. - * 5. When converting floating-point integers less than 1e16, - * we use floating-point arithmetic rather than resorting - * to multiple-precision integers. - * 6. When asked to produce fewer than 15 digits, we first try - * to get by with floating-point arithmetic; we resort to - * multiple-precision integer arithmetic only if we cannot - * guarantee that the floating-point calculation has given - * the correctly rounded result. For k requested digits and - * "uniformly" distributed input, the probability is - * something like 10^(k-15) that we must resort to the Long - * calculation. - */ - -char *__gdtoa (FPI *fpi, int be, ULong *bits, int *kindp, int mode, int ndigits, - int *decpt, char **rve) -{ - /* Arguments ndigits and decpt are similar to the second and third - arguments of ecvt and fcvt; trailing zeros are suppressed from - the returned string. If not null, *rve is set to point - to the end of the return value. If d is +-Infinity or NaN, - then *decpt is set to 9999. - be = exponent: value = (integer represented by bits) * (2 to the power of be). - - mode: - 0 ==> shortest string that yields d when read in - and rounded to nearest. - 1 ==> like 0, but with Steele & White stopping rule; - e.g. with IEEE P754 arithmetic , mode 0 gives - 1e23 whereas mode 1 gives 9.999999999999999e22. - 2 ==> max(1,ndigits) significant digits. This gives a - return value similar to that of ecvt, except - that trailing zeros are suppressed. - 3 ==> through ndigits past the decimal point. This - gives a return value similar to that from fcvt, - except that trailing zeros are suppressed, and - ndigits can be negative. - 4-9 should give the same return values as 2-3, i.e., - 4 <= mode <= 9 ==> same return as mode - 2 + (mode & 1). These modes are mainly for - debugging; often they run slower but sometimes - faster than modes 2-3. - 4,5,8,9 ==> left-to-right digit generation. - 6-9 ==> don't try fast floating-point estimate - (if applicable). - - Values of mode other than 0-9 are treated as mode 0. - - Sufficient space is allocated to the return value - to hold the suppressed trailing zeros. - */ - - int bbits, b2, b5, be0, dig, i, ieps, ilim, ilim0, ilim1, inex; - int j, j2, k, k0, k_check, kind, leftright, m2, m5, nbits; - int rdir, s2, s5, spec_case, try_quick; - Long L; - Bigint *b, *b1, *delta, *mlo, *mhi, *mhi1, *S; - double d2, ds; - char *s, *s0; - union _dbl_union d, eps; - -#ifndef MULTIPLE_THREADS - if (dtoa_result) { - __freedtoa(dtoa_result); - dtoa_result = 0; - } -#endif - inex = 0; - kind = *kindp &= ~STRTOG_Inexact; - switch(kind & STRTOG_Retmask) { - case STRTOG_Zero: - goto ret_zero; - case STRTOG_Normal: - case STRTOG_Denormal: - break; - case STRTOG_Infinite: - *decpt = -32768; - return nrv_alloc("Infinity", rve, 8); - case STRTOG_NaN: - *decpt = -32768; - return nrv_alloc("NaN", rve, 3); - default: - return 0; - } - b = bitstob(bits, nbits = fpi->nbits, &bbits); - be0 = be; - if ( (i = trailz(b)) !=0) { - rshift(b, i); - be += i; - bbits -= i; - } - if (!b->wds) { - Bfree(b); - ret_zero: - *decpt = 1; - return nrv_alloc("0", rve, 1); - } - - dval(&d) = b2d(b, &i); - i = be + bbits - 1; - word0(&d) &= Frac_mask1; - word0(&d) |= Exp_11; - - /* log(x) ~=~ log(1.5) + (x-1.5)/1.5 - * log10(x) = log(x) / log(10) - * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10)) - * log10(&d) = (i-Bias)*log(2)/log(10) + log10(d2) - * - * This suggests computing an approximation k to log10(&d) by - * - * k = (i - Bias)*0.301029995663981 - * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 ); - * - * We want k to be too large rather than too small. - * The error in the first-order Taylor series approximation - * is in our favor, so we just round up the constant enough - * to compensate for any error in the multiplication of - * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077, - * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14, - * adding 1e-13 to the constant term more than suffices. - * Hence we adjust the constant term to 0.1760912590558. - * (We could get a more accurate k by invoking log10, - * but this is probably not worthwhile.) - */ - ds = (dval(&d)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981; - - /* correct assumption about exponent range */ - if ((j = i) < 0) - j = -j; - if ((j -= 1077) > 0) - ds += j * 7e-17; - - k = (int)ds; - if (ds < 0. && ds != k) - k--; /* want k = floor(ds) */ - k_check = 1; - word0(&d) += (be + bbits - 1) << Exp_shift; - if (k >= 0 && k <= Ten_pmax) { - if (dval(&d) < tens[k]) - k--; - k_check = 0; - } - j = bbits - i - 1; - if (j >= 0) { - b2 = 0; - s2 = j; - } - else { - b2 = -j; - s2 = 0; - } - if (k >= 0) { - b5 = 0; - s5 = k; - s2 += k; - } - else { - b2 -= k; - b5 = -k; - s5 = 0; - } - if (mode < 0 || mode > 9) - mode = 0; - try_quick = 1; - if (mode > 5) { - mode -= 4; - try_quick = 0; - } - else if (i >= -4 - Emin || i < Emin) - try_quick = 0; - leftright = 1; - ilim = ilim1 = -1; /* Values for cases 0 and 1; done here to */ - /* silence erroneous "gcc -Wall" warning. */ - switch(mode) { - case 0: - case 1: - i = (int)(nbits * .30103) + 3; - ndigits = 0; - break; - case 2: - leftright = 0; - /* no break */ - case 4: - if (ndigits <= 0) - ndigits = 1; - ilim = ilim1 = i = ndigits; - break; - case 3: - leftright = 0; - /* no break */ - case 5: - i = ndigits + k + 1; - ilim = i; - ilim1 = i - 1; - if (i <= 0) - i = 1; - } - s = s0 = rv_alloc(i); - - if ( (rdir = fpi->rounding - 1) !=0) { - if (rdir < 0) - rdir = 2; - if (kind & STRTOG_Neg) - rdir = 3 - rdir; - } - - /* Now rdir = 0 ==> round near, 1 ==> round up, 2 ==> round down. */ - - if (ilim >= 0 && ilim <= Quick_max && try_quick && !rdir -#ifndef IMPRECISE_INEXACT - && k == 0 -#endif - ) { - - /* Try to get by with floating-point arithmetic. */ - - i = 0; - d2 = dval(&d); - k0 = k; - ilim0 = ilim; - ieps = 2; /* conservative */ - if (k > 0) { - ds = tens[k&0xf]; - j = k >> 4; - if (j & Bletch) { - /* prevent overflows */ - j &= Bletch - 1; - dval(&d) /= bigtens[n_bigtens-1]; - ieps++; - } - for(; j; j >>= 1, i++) - if (j & 1) { - ieps++; - ds *= bigtens[i]; - } - } - else { - ds = 1.; - if ( (j2 = -k) !=0) { - dval(&d) *= tens[j2 & 0xf]; - for(j = j2 >> 4; j; j >>= 1, i++) - if (j & 1) { - ieps++; - dval(&d) *= bigtens[i]; - } - } - } - if (k_check && dval(&d) < 1. && ilim > 0) { - if (ilim1 <= 0) - goto fast_failed; - ilim = ilim1; - k--; - dval(&d) *= 10.; - ieps++; - } - dval(&eps) = ieps*dval(&d) + 7.; - word0(&eps) -= (P-1)*Exp_msk1; - if (ilim == 0) { - S = mhi = 0; - dval(&d) -= 5.; - if (dval(&d) > dval(&eps)) - goto one_digit; - if (dval(&d) < -dval(&eps)) - goto no_digits; - goto fast_failed; - } -#ifndef No_leftright - if (leftright) { - /* Use Steele & White method of only - * generating digits needed. - */ - dval(&eps) = ds*0.5/tens[ilim-1] - dval(&eps); - for(i = 0;;) { - L = (Long)(dval(&d)/ds); - dval(&d) -= L*ds; - *s++ = '0' + (int)L; - if (dval(&d) < dval(&eps)) { - if (dval(&d)) - inex = STRTOG_Inexlo; - goto ret1; - } - if (ds - dval(&d) < dval(&eps)) - goto bump_up; - if (++i >= ilim) - break; - dval(&eps) *= 10.; - dval(&d) *= 10.; - } - } - else { -#endif - /* Generate ilim digits, then fix them up. */ - dval(&eps) *= tens[ilim-1]; - for(i = 1;; i++, dval(&d) *= 10.) { - if ( (L = (Long)(dval(&d)/ds)) !=0) - dval(&d) -= L*ds; - *s++ = '0' + (int)L; - if (i == ilim) { - ds *= 0.5; - if (dval(&d) > ds + dval(&eps)) - goto bump_up; - else if (dval(&d) < ds - dval(&eps)) { - if (dval(&d)) - inex = STRTOG_Inexlo; - goto clear_trailing0; - } - break; - } - } -#ifndef No_leftright - } -#endif - fast_failed: - s = s0; - dval(&d) = d2; - k = k0; - ilim = ilim0; - } - - /* Do we have a "small" integer? */ - - if (be >= 0 && k <= fpi->int_max) { - /* Yes. */ - ds = tens[k]; - if (ndigits < 0 && ilim <= 0) { - S = mhi = 0; - if (ilim < 0 || dval(&d) <= 5*ds) - goto no_digits; - goto one_digit; - } - for(i = 1;; i++, dval(&d) *= 10.) { - L = dval(&d) / ds; - dval(&d) -= L*ds; -#ifdef Check_FLT_ROUNDS - /* If FLT_ROUNDS == 2, L will usually be high by 1 */ - if (dval(&d) < 0) { - L--; - dval(&d) += ds; - } -#endif - *s++ = '0' + (int)L; - if (dval(&d) == 0.) - break; - if (i == ilim) { - if (rdir) { - if (rdir == 1) - goto bump_up; - inex = STRTOG_Inexlo; - goto ret1; - } - dval(&d) += dval(&d); -#ifdef ROUND_BIASED - if (dval(&d) >= ds) -#else - if (dval(&d) > ds || (dval(&d) == ds && L & 1)) -#endif - { - bump_up: - inex = STRTOG_Inexhi; - while(*--s == '9') - if (s == s0) { - k++; - *s = '0'; - break; - } - ++*s++; - } - else { - inex = STRTOG_Inexlo; - clear_trailing0: - while(*--s == '0'){} - ++s; - } - break; - } - } - goto ret1; - } - - m2 = b2; - m5 = b5; - mhi = mlo = 0; - if (leftright) { - i = nbits - bbits; - if (be - i++ < fpi->emin && mode != 3 && mode != 5) { - /* denormal */ - i = be - fpi->emin + 1; - if (mode >= 2 && ilim > 0 && ilim < i) - goto small_ilim; - } - else if (mode >= 2) { - small_ilim: - j = ilim - 1; - if (m5 >= j) - m5 -= j; - else { - s5 += j -= m5; - b5 += j; - m5 = 0; - } - if ((i = ilim) < 0) { - m2 -= i; - i = 0; - } - } - b2 += i; - s2 += i; - mhi = i2b(1); - } - if (m2 > 0 && s2 > 0) { - i = m2 < s2 ? m2 : s2; - b2 -= i; - m2 -= i; - s2 -= i; - } - if (b5 > 0) { - if (leftright) { - if (m5 > 0) { - mhi = pow5mult(mhi, m5); - b1 = mult(mhi, b); - Bfree(b); - b = b1; - } - if ( (j = b5 - m5) !=0) - b = pow5mult(b, j); - } - else - b = pow5mult(b, b5); - } - S = i2b(1); - if (s5 > 0) - S = pow5mult(S, s5); - - /* Check for special case that d is a normalized power of 2. */ - - spec_case = 0; - if (mode < 2) { - if (bbits == 1 && be0 > fpi->emin + 1) { - /* The special case */ - b2++; - s2++; - spec_case = 1; - } - } - - /* Arrange for convenient computation of quotients: - * shift left if necessary so divisor has 4 leading 0 bits. - * - * Perhaps we should just compute leading 28 bits of S once - * and for all and pass them and a shift to quorem, so it - * can do shifts and ors to compute the numerator for q. - */ - i = ((s5 ? hi0bits(S->x[S->wds-1]) : ULbits - 1) - s2 - 4) & kmask; - m2 += i; - if ((b2 += i) > 0) - b = lshift(b, b2); - if ((s2 += i) > 0) - S = lshift(S, s2); - if (k_check) { - if (cmp(b,S) < 0) { - k--; - b = multadd(b, 10, 0); /* we botched the k estimate */ - if (leftright) - mhi = multadd(mhi, 10, 0); - ilim = ilim1; - } - } - if (ilim <= 0 && mode > 2) { - if (ilim < 0 || cmp(b,S = multadd(S,5,0)) <= 0) { - /* no digits, fcvt style */ - no_digits: - k = -1 - ndigits; - inex = STRTOG_Inexlo; - goto ret; - } - one_digit: - inex = STRTOG_Inexhi; - *s++ = '1'; - k++; - goto ret; - } - if (leftright) { - if (m2 > 0) - mhi = lshift(mhi, m2); - - /* Compute mlo -- check for special case - * that d is a normalized power of 2. - */ - - mlo = mhi; - if (spec_case) { - mhi = Balloc(mhi->k); - Bcopy(mhi, mlo); - mhi = lshift(mhi, 1); - } - - for(i = 1;;i++) { - dig = quorem(b,S) + '0'; - /* Do we yet have the shortest decimal string - * that will round to d? - */ - j = cmp(b, mlo); - delta = diff(S, mhi); - j2 = delta->sign ? 1 : cmp(b, delta); - Bfree(delta); -#ifndef ROUND_BIASED - if (j2 == 0 && !mode && !(bits[0] & 1) && !rdir) { - if (dig == '9') - goto round_9_up; - if (j <= 0) { - if (b->wds > 1 || b->x[0]) - inex = STRTOG_Inexlo; - } - else { - dig++; - inex = STRTOG_Inexhi; - } - *s++ = dig; - goto ret; - } -#endif - if (j < 0 || (j == 0 && !mode -#ifndef ROUND_BIASED - && !(bits[0] & 1) -#endif - )) { - if (rdir && (b->wds > 1 || b->x[0])) { - if (rdir == 2) { - inex = STRTOG_Inexlo; - goto accept; - } - while (cmp(S,mhi) > 0) { - *s++ = dig; - mhi1 = multadd(mhi, 10, 0); - if (mlo == mhi) - mlo = mhi1; - mhi = mhi1; - b = multadd(b, 10, 0); - dig = quorem(b,S) + '0'; - } - if (dig++ == '9') - goto round_9_up; - inex = STRTOG_Inexhi; - goto accept; - } - if (j2 > 0) { - b = lshift(b, 1); - j2 = cmp(b, S); -#ifdef ROUND_BIASED - if (j2 >= 0 /*)*/ -#else - if ((j2 > 0 || (j2 == 0 && dig & 1)) -#endif - && dig++ == '9') - goto round_9_up; - inex = STRTOG_Inexhi; - } - if (b->wds > 1 || b->x[0]) - inex = STRTOG_Inexlo; - accept: - *s++ = dig; - goto ret; - } - if (j2 > 0 && rdir != 2) { - if (dig == '9') { /* possible if i == 1 */ - round_9_up: - *s++ = '9'; - inex = STRTOG_Inexhi; - goto roundoff; - } - inex = STRTOG_Inexhi; - *s++ = dig + 1; - goto ret; - } - *s++ = dig; - if (i == ilim) - break; - b = multadd(b, 10, 0); - if (mlo == mhi) - mlo = mhi = multadd(mhi, 10, 0); - else { - mlo = multadd(mlo, 10, 0); - mhi = multadd(mhi, 10, 0); - } - } - } - else - for(i = 1;; i++) { - *s++ = dig = quorem(b,S) + '0'; - if (i >= ilim) - break; - b = multadd(b, 10, 0); - } - - /* Round off last digit */ - - if (rdir) { - if (rdir == 2 || (b->wds <= 1 && !b->x[0])) - goto chopzeros; - goto roundoff; - } - b = lshift(b, 1); - j = cmp(b, S); -#ifdef ROUND_BIASED - if (j >= 0) -#else - if (j > 0 || (j == 0 && dig & 1)) -#endif - { - roundoff: - inex = STRTOG_Inexhi; - while(*--s == '9') - if (s == s0) { - k++; - *s++ = '1'; - goto ret; - } - ++*s++; - } - else { - chopzeros: - if (b->wds > 1 || b->x[0]) - inex = STRTOG_Inexlo; - while(*--s == '0'){} - ++s; - } - ret: - Bfree(S); - if (mhi) { - if (mlo && mlo != mhi) - Bfree(mlo); - Bfree(mhi); - } - ret1: - Bfree(b); - *s = 0; - *decpt = k + 1; - if (rve) - *rve = s; - *kindp |= inex; - return s0; -} diff --git a/src/lib/evil/gdtoa/gdtoa.h b/src/lib/evil/gdtoa/gdtoa.h deleted file mode 100644 index ef72bf9..0000000 --- a/src/lib/evil/gdtoa/gdtoa.h +++ /dev/null @@ -1,121 +0,0 @@ -/**************************************************************** - -The author of this software is David M. Gay. - -Copyright (C) 1998 by Lucent Technologies -All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appear in all -copies and that both that the copyright notice and this -permission notice and warranty disclaimer appear in supporting -documentation, and that the name of Lucent or any of its entities -not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. -IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY -SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER -IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - -****************************************************************/ - -/* Please send bug reports to David M. Gay (dmg at acm dot org, - * with " at " changed at "@" and " dot " changed to "."). */ - -/* Modified by Danny Smith for inclusion in libmingwex.a - Aug 2006 */ - -/* Modified by Vincent Torri for inclusion in Evil - February 2012 */ - -#ifndef GDTOA_H_INCLUDED -#define GDTOA_H_INCLUDED - -#include "gd_arith.h" -#include /* for size_t */ - -#if defined(__MINGW32__) || defined(__MINGW64__) -/* keep the 'Long' definition as 'long' for compatibility - * with older/other software. long in w64 is 32 bits anyway.. - */ -#define Long long /* Windows long is 32 bit */ -#undef NO_LONG_LONG /* we have long long type */ -#endif /* MinGW */ - -#ifndef Long -#define Long int -#endif -#ifndef ULong -typedef unsigned Long ULong; -#endif -#ifndef UShort -typedef unsigned short UShort; -#endif - -enum { /* return values from strtodg */ - STRTOG_Zero = 0, - STRTOG_Normal = 1, - STRTOG_Denormal = 2, - STRTOG_Infinite = 3, - STRTOG_NaN = 4, - STRTOG_NaNbits = 5, - STRTOG_NoNumber = 6, - STRTOG_Retmask = 7, - - /* The following may be or-ed into one of the above values. */ - - STRTOG_Neg = 0x08, /* does not affect STRTOG_Inexlo or STRTOG_Inexhi */ - STRTOG_Inexlo = 0x10, /* returned result rounded toward zero */ - STRTOG_Inexhi = 0x20, /* returned result rounded away from zero */ - STRTOG_Inexact = 0x30, - STRTOG_Underflow= 0x40, - STRTOG_Overflow = 0x80 -}; - -typedef struct -FPI { - int nbits; - int emin; - int emax; - int rounding; - int sudden_underflow; - int int_max; -} FPI; - -enum { /* FPI.rounding values: same as FLT_ROUNDS */ - FPI_Round_zero = 0, - FPI_Round_near = 1, - FPI_Round_up = 2, - FPI_Round_down = 3 -}; - -#ifdef __cplusplus -extern "C" { -#endif - -extern char* __dtoa (double d, int mode, int ndigits, int *decpt, - int *sign, char **rve); -extern char* __gdtoa (FPI *fpi, int be, ULong *bits, int *kindp, - int mode, int ndigits, int *decpt, char **rve); -extern void __freedtoa (char *); - -extern float __evil_strtof (const char *, char **); -extern long double __evil_strtold (const char *, char **); -extern int __strtodg (const char *, char **, FPI *, Long *, ULong *); - -extern char* __g__fmt (char*, char*, char*, int, ULong, size_t); -extern char* __g_dfmt (char*, double*, int, size_t); -extern char* __g_ffmt (char*, float*, int, size_t); -extern char* __g_xfmt (char*, void*, int, size_t); - -#ifdef __cplusplus -} -#endif -#endif /* GDTOA_H_INCLUDED */ diff --git a/src/lib/evil/gdtoa/gdtoa_fltrnds.h b/src/lib/evil/gdtoa/gdtoa_fltrnds.h deleted file mode 100644 index 28c474e..0000000 --- a/src/lib/evil/gdtoa/gdtoa_fltrnds.h +++ /dev/null @@ -1,18 +0,0 @@ - FPI *fpi, fpi1; - int Rounding; -#ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */ - Rounding = Flt_Rounds; -#else /*}{*/ - Rounding = 1; - switch(fegetround()) { - case FE_TOWARDZERO: Rounding = 0; break; - case FE_UPWARD: Rounding = 2; break; - case FE_DOWNWARD: Rounding = 3; - } -#endif /*}}*/ - fpi = &fpi0; - if (Rounding != 1) { - fpi1 = fpi0; - fpi = &fpi1; - fpi1.rounding = Rounding; - } diff --git a/src/lib/evil/gdtoa/gdtoaimp.h b/src/lib/evil/gdtoa/gdtoaimp.h deleted file mode 100644 index 3a06c20..0000000 --- a/src/lib/evil/gdtoa/gdtoaimp.h +++ /dev/null @@ -1,645 +0,0 @@ -/**************************************************************** - -The author of this software is David M. Gay. - -Copyright (C) 1998-2000 by Lucent Technologies -All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appear in all -copies and that both that the copyright notice and this -permission notice and warranty disclaimer appear in supporting -documentation, and that the name of Lucent or any of its entities -not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. -IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY -SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER -IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - -****************************************************************/ - -/* This is a variation on dtoa.c that converts arbitary binary - floating-point formats to and from decimal notation. It uses - double-precision arithmetic internally, so there are still - various #ifdefs that adapt the calculations to the native - double-precision arithmetic (any of IEEE, VAX D_floating, - or IBM mainframe arithmetic). - - Please send bug reports to David M. Gay (dmg at acm dot org, - with " at " changed at "@" and " dot " changed to "."). - */ - -/* On a machine with IEEE extended-precision registers, it is - * necessary to specify double-precision (53-bit) rounding precision - * before invoking strtod or dtoa. If the machine uses (the equivalent - * of) Intel 80x87 arithmetic, the call - * _control87(PC_53, MCW_PC); - * does this with many compilers. Whether this or another call is - * appropriate depends on the compiler; for this to work, it may be - * necessary to #include "float.h" or another system-dependent header - * file. - */ - -/* strtod for IEEE-, VAX-, and IBM-arithmetic machines. - * - * This strtod returns a nearest machine number to the input decimal - * string (or sets errno to ERANGE). With IEEE arithmetic, ties are - * broken by the IEEE round-even rule. Otherwise ties are broken by - * biased rounding (add half and chop). - * - * Inspired loosely by William D. Clinger's paper "How to Read Floating - * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 112-126]. - * - * Modifications: - * - * 1. We only require IEEE, IBM, or VAX double-precision - * arithmetic (not IEEE double-extended). - * 2. We get by with floating-point arithmetic in a case that - * Clinger missed -- when we're computing d * 10^n - * for a small integer d and the integer n is not too - * much larger than 22 (the maximum integer k for which - * we can represent 10^k exactly), we may be able to - * compute (d*10^k) * 10^(e-k) with just one roundoff. - * 3. Rather than a bit-at-a-time adjustment of the binary - * result in the hard case, we use floating-point - * arithmetic to determine the adjustment to within - * one bit; only in really hard cases do we need to - * compute a second residual. - * 4. Because of 3., we don't need a large table of powers of 10 - * for ten-to-e (just some small tables, e.g. of 10^k - * for 0 <= k <= 22). - */ - -/* - * #define IEEE_8087 for IEEE-arithmetic machines where the least - * significant byte has the lowest address. - * #define IEEE_MC68k for IEEE-arithmetic machines where the most - * significant byte has the lowest address. - * #define Long int on machines with 32-bit ints and 64-bit longs. - * #define Sudden_Underflow for IEEE-format machines without gradual - * underflow (i.e., that flush to zero on underflow). - * #define IBM for IBM mainframe-style floating-point arithmetic. - * #define VAX for VAX-style floating-point arithmetic (D_floating). - * #define No_leftright to omit left-right logic in fast floating-point - * computation of dtoa and gdtoa. This will cause modes 4 and 5 to be - * treated the same as modes 2 and 3 for some inputs. - * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3. - * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines - * that use extended-precision instructions to compute rounded - * products and quotients) with IBM. - * #define ROUND_BIASED for IEEE-format with biased rounding and arithmetic - * that rounds toward +Infinity. - * #define ROUND_BIASED_without_Round_Up for IEEE-format with biased - * rounding when the underlying floating-point arithmetic uses - * unbiased rounding. This prevent using ordinary floating-point - * arithmetic when the result could be computed with one rounding error. - * #define Inaccurate_Divide for IEEE-format with correctly rounded - * products but inaccurate quotients, e.g., for Intel i860. - * #define NO_LONG_LONG on machines that do not have a "long long" - * integer type (of >= 64 bits). On such machines, you can - * #define Just_16 to store 16 bits per 32-bit Long when doing - * high-precision integer arithmetic. Whether this speeds things - * up or slows things down depends on the machine and the number - * being converted. If long long is available and the name is - * something other than "long long", #define Llong to be the name, - * and if "unsigned Llong" does not work as an unsigned version of - * Llong, #define #ULLong to be the corresponding unsigned type. - * #define KR_headers for old-style C function headers. - * #define Bad_float_h if your system lacks a float.h or if it does not - * define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP, - * FLT_RADIX, FLT_ROUNDS, and DBL_MAX. - * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n) - * if memory is available and otherwise does something you deem - * appropriate. If MALLOC is undefined, malloc will be invoked - * directly -- and assumed always to succeed. - * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making - * memory allocations from a private pool of memory when possible. - * When used, the private pool is PRIVATE_MEM bytes long: 2304 bytes, - * unless #defined to be a different length. This default length - * suffices to get rid of MALLOC calls except for unusual cases, - * such as decimal-to-binary conversion of a very long string of - * digits. When converting IEEE double precision values, the - * longest string gdtoa can return is about 751 bytes long. For - * conversions by strtod of strings of 800 digits and all gdtoa - * conversions of IEEE doubles in single-threaded executions with - * 8-byte pointers, PRIVATE_MEM >= 7400 appears to suffice; with - * 4-byte pointers, PRIVATE_MEM >= 7112 appears adequate. - * #define NO_INFNAN_CHECK if you do not wish to have INFNAN_CHECK - * #defined automatically on IEEE systems. On such systems, - * when INFNAN_CHECK is #defined, strtod checks - * for Infinity and NaN (case insensitively). - * When INFNAN_CHECK is #defined and No_Hex_NaN is not #defined, - * strtodg also accepts (case insensitively) strings of the form - * NaN(x), where x is a string of hexadecimal digits (optionally - * preceded by 0x or 0X) and spaces; if there is only one string - * of hexadecimal digits, it is taken for the fraction bits of the - * resulting NaN; if there are two or more strings of hexadecimal - * digits, each string is assigned to the next available sequence - * of 32-bit words of fractions bits (starting with the most - * significant), right-aligned in each sequence. - * Unless GDTOA_NON_PEDANTIC_NANCHECK is #defined, input "NaN(...)" - * is consumed even when ... has the wrong form (in which case the - * "(...)" is consumed but ignored). - * #define MULTIPLE_THREADS if the system offers preemptively scheduled - * multiple threads. In this case, you must provide (or suitably - * #define) two locks, acquired by ACQUIRE_DTOA_LOCK(n) and freed - * by FREE_DTOA_LOCK(n) for n = 0 or 1. (The second lock, accessed - * in pow5mult, ensures lazy evaluation of only one copy of high - * powers of 5; omitting this lock would introduce a small - * probability of wasting memory, but would otherwise be harmless.) - * You must also invoke freedtoa(s) to free the value s returned by - * dtoa. You may do so whether or not MULTIPLE_THREADS is #defined. - * #define IMPRECISE_INEXACT if you do not care about the setting of - * the STRTOG_Inexact bits in the special case of doing IEEE double - * precision conversions (which could also be done by the strtog in - * dtoa.c). - * #define NO_HEX_FP to disable recognition of C9x's hexadecimal - * floating-point constants. - * #define -DNO_ERRNO to suppress setting errno (in strtod.c and - * strtodg.c). - * #define NO_STRING_H to use private versions of memcpy. - * On some K&R systems, it may also be necessary to - * #define DECLARE_SIZE_T in this case. - * #define USE_LOCALE to use the current locale's decimal_point value. - */ - -#ifndef GDTOAIMP_H_INCLUDED -#define GDTOAIMP_H_INCLUDED -#include "gdtoa.h" -#include "gd_qnan.h" - -#if defined(__MINGW32__) || defined(__MINGW64__) -#define MULTIPLE_THREADS 1 -#define USE_LOCALE 1 -#define NO_LOCALE_CACHE 1 -#endif /* MinGW */ - -#ifdef Honor_FLT_ROUNDS -#include -#endif - -#ifdef DEBUG -#include -#define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);} -#endif - -#include -#include - -#ifdef MALLOC -extern void *MALLOC (size_t); -#else -#define MALLOC malloc -#endif - -#undef IEEE_Arith -#undef Avoid_Underflow -#ifdef IEEE_MC68k -#define IEEE_Arith -#endif -#ifdef IEEE_8087 -#define IEEE_Arith -#endif - -#include - -#ifdef NO_ERRNO -#define SET_ERRNO(x) -#else -#define SET_ERRNO(x) \ - errno = (x) -#endif - -#ifdef Bad_float_h - -#ifdef IEEE_Arith -#define DBL_DIG 15 -#define DBL_MAX_10_EXP 308 -#define DBL_MAX_EXP 1024 -#define FLT_RADIX 2 -#define DBL_MAX 1.7976931348623157e+308 -#endif - -#ifdef IBM -#define DBL_DIG 16 -#define DBL_MAX_10_EXP 75 -#define DBL_MAX_EXP 63 -#define FLT_RADIX 16 -#define DBL_MAX 7.2370055773322621e+75 -#endif - -#ifdef VAX -#define DBL_DIG 16 -#define DBL_MAX_10_EXP 38 -#define DBL_MAX_EXP 127 -#define FLT_RADIX 2 -#define DBL_MAX 1.7014118346046923e+38 -#define n_bigtens 2 -#endif - -#ifndef LONG_MAX -#define LONG_MAX 2147483647 -#endif - -#else /* ifndef Bad_float_h */ -#include -#endif /* Bad_float_h */ - -#ifdef IEEE_Arith -#define Scale_Bit 0x10 -#define n_bigtens 5 -#endif - -#ifdef IBM -#define n_bigtens 3 -#endif - -#ifdef VAX -#define n_bigtens 2 -#endif - -#ifndef __MATH_H__ -#include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1 -Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined. -#endif - -typedef union _dbl_union { double d; ULong L[2]; } dbl_union; - -#ifdef IEEE_8087 -#define word0(x) (x)->L[1] -#define word1(x) (x)->L[0] -#else -#define word0(x) (x)->L[0] -#define word1(x) (x)->L[1] -#endif -#define dval(x) (x)->d - -/* The following definition of Storeinc is appropriate for MIPS processors. - * An alternative that might be better on some machines is - * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff) - */ -#if defined(IEEE_8087) + defined(VAX) -#define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \ -((unsigned short *)a)[0] = (unsigned short)c, a++) -#else -#define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \ -((unsigned short *)a)[1] = (unsigned short)c, a++) -#endif - -/* #define P DBL_MANT_DIG */ -/* Ten_pmax = floor(P*log(2)/log(5)) */ -/* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */ -/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */ -/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */ - -#ifdef IEEE_Arith -#define Exp_shift 20 -#define Exp_shift1 20 -#define Exp_msk1 0x100000 -#define Exp_msk11 0x100000 -#define Exp_mask 0x7ff00000 -#define P 53 -#define Bias 1023 -#define Emin (-1022) -#define Exp_1 0x3ff00000 -#define Exp_11 0x3ff00000 -#define Ebits 11 -#define Frac_mask 0xfffff -#define Frac_mask1 0xfffff -#define Ten_pmax 22 -#define Bletch 0x10 -#define Bndry_mask 0xfffff -#define Bndry_mask1 0xfffff -#define LSB 1 -#define Sign_bit 0x80000000 -#define Log2P 1 -#define Tiny0 0 -#define Tiny1 1 -#define Quick_max 14 -#define Int_max 14 - -#ifndef Flt_Rounds -#ifdef FLT_ROUNDS -#define Flt_Rounds FLT_ROUNDS -#else -#define Flt_Rounds 1 -#endif -#endif /*Flt_Rounds*/ - -#else /* ifndef IEEE_Arith */ -#undef Sudden_Underflow -#define Sudden_Underflow -#ifdef IBM -#undef Flt_Rounds -#define Flt_Rounds 0 -#define Exp_shift 24 -#define Exp_shift1 24 -#define Exp_msk1 0x1000000 -#define Exp_msk11 0x1000000 -#define Exp_mask 0x7f000000 -#define P 14 -#define Bias 65 -#define Exp_1 0x41000000 -#define Exp_11 0x41000000 -#define Ebits 8 /* exponent has 7 bits, but 8 is the right value in b2d */ -#define Frac_mask 0xffffff -#define Frac_mask1 0xffffff -#define Bletch 4 -#define Ten_pmax 22 -#define Bndry_mask 0xefffff -#define Bndry_mask1 0xffffff -#define LSB 1 -#define Sign_bit 0x80000000 -#define Log2P 4 -#define Tiny0 0x100000 -#define Tiny1 0 -#define Quick_max 14 -#define Int_max 15 -#else /* VAX */ -#undef Flt_Rounds -#define Flt_Rounds 1 -#define Exp_shift 23 -#define Exp_shift1 7 -#define Exp_msk1 0x80 -#define Exp_msk11 0x800000 -#define Exp_mask 0x7f80 -#define P 56 -#define Bias 129 -#define Exp_1 0x40800000 -#define Exp_11 0x4080 -#define Ebits 8 -#define Frac_mask 0x7fffff -#define Frac_mask1 0xffff007f -#define Ten_pmax 24 -#define Bletch 2 -#define Bndry_mask 0xffff007f -#define Bndry_mask1 0xffff007f -#define LSB 0x10000 -#define Sign_bit 0x8000 -#define Log2P 1 -#define Tiny0 0x80 -#define Tiny1 0 -#define Quick_max 15 -#define Int_max 15 -#endif /* IBM, VAX */ -#endif /* IEEE_Arith */ - -#ifndef IEEE_Arith -#define ROUND_BIASED -#else -#ifdef ROUND_BIASED_without_Round_Up -#undef ROUND_BIASED -#define ROUND_BIASED -#endif -#endif - -#ifdef RND_PRODQUOT -#define rounded_product(a,b) a = rnd_prod(a, b) -#define rounded_quotient(a,b) a = rnd_quot(a, b) -extern double rnd_prod(double, double), rnd_quot(double, double); -#else -#define rounded_product(a,b) a *= b -#define rounded_quotient(a,b) a /= b -#endif - -#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1)) -#define Big1 0xffffffff - -#undef Pack_16 -#ifndef Pack_32 -#define Pack_32 -#endif - -#ifdef NO_LONG_LONG -#undef ULLong -#ifdef Just_16 -#undef Pack_32 -#define Pack_16 -/* When Pack_32 is not defined, we store 16 bits per 32-bit Long. - * This makes some inner loops simpler and sometimes saves work - * during multiplications, but it often seems to make things slightly - * slower. Hence the default is now to store 32 bits per Long. - */ -#endif -#else /* long long available */ -#ifndef Llong -#define Llong long long -#endif -#ifndef ULLong -#define ULLong unsigned Llong -#endif -#endif /* NO_LONG_LONG */ - -#ifdef Pack_32 -#define ULbits 32 -#define kshift 5 -#define kmask 31 -#define ALL_ON 0xffffffff -#else -#define ULbits 16 -#define kshift 4 -#define kmask 15 -#define ALL_ON 0xffff -#endif - -#ifndef MULTIPLE_THREADS -#define ACQUIRE_DTOA_LOCK(n) /*nothing*/ -#define FREE_DTOA_LOCK(n) /*nothing*/ -#endif - -#define Kmax 9 - -#define Bigint __Bigint -struct -Bigint { - struct Bigint *next; - int k, maxwds, sign, wds; - ULong x[1]; -}; -typedef struct Bigint Bigint; - -#ifdef NO_STRING_H -#ifdef DECLARE_SIZE_T -typedef unsigned int size_t; -#endif -extern void memcpy_D2A (void*, const void*, size_t); -#define Bcopy(x,y) memcpy_D2A(&x->sign,&y->sign,y->wds*sizeof(ULong) + 2*sizeof(int)) -#else /* !NO_STRING_H */ -#define Bcopy(x,y) memcpy(&x->sign,&y->sign,y->wds*sizeof(ULong) + 2*sizeof(int)) -#endif /* NO_STRING_H */ - -#ifdef __GNUC__ -static inline int -__lo0bits_D2A (ULong *y) -{ - int ret = __builtin_ctz(*y); - *y = *y >> ret; - return ret; -} - -static inline int -__hi0bits_D2A (ULong y) -{ - return __builtin_clz(y); -} -#endif - -#define Balloc __Balloc_D2A -#define Bfree __Bfree_D2A -#define ULtoQ __ULtoQ_D2A -#define ULtof __ULtof_D2A -#define ULtod __ULtod_D2A -#define ULtodd __ULtodd_D2A -#define ULtox __ULtox_D2A -#define ULtoxL __ULtoxL_D2A -#define any_on __any_on_D2A -#define b2d __b2d_D2A -#define bigtens __bigtens_D2A -#define cmp __cmp_D2A -#define copybits __copybits_D2A -#define d2b __d2b_D2A -#define decrement __decrement_D2A -#define diff __diff_D2A -#define dtoa_result __dtoa_result_D2A -#define gethex __gethex_D2A -#define hexdig __hexdig_D2A -#define hexnan __hexnan_D2A -#define hi0bits_D2A __hi0bits_D2A -#define hi0bits(x) __hi0bits_D2A((ULong)(x)) -#define i2b __i2b_D2A -#define increment __increment_D2A -#define lo0bits __lo0bits_D2A -#define lshift __lshift_D2A -#define match __match_D2A -#define mult __mult_D2A -#define multadd __multadd_D2A -#define nrv_alloc __nrv_alloc_D2A -#define pow5mult __pow5mult_D2A -#define quorem __quorem_D2A -#define ratio __ratio_D2A -#define rshift __rshift_D2A -#define rv_alloc __rv_alloc_D2A -#define s2b __s2b_D2A -#define set_ones __set_ones_D2A -#define strcp_D2A __strcp_D2A -#define strcp __strcp_D2A -#define strtoIg __strtoIg_D2A -#define sum __sum_D2A -#define tens __tens_D2A -#define tinytens __tinytens_D2A -#define tinytens __tinytens_D2A -#define trailz __trailz_D2A -#define ulp __ulp_D2A - -#define hexdig_init_D2A __mingw_hexdig_init_D2A - -extern char *dtoa_result; -extern const double bigtens[], tens[], tinytens[]; -extern unsigned char hexdig[]; - -extern Bigint *Balloc (int); -extern void Bfree (Bigint*); -extern void ULtof (ULong*, ULong*, Long, int); -extern void ULtod (ULong*, ULong*, Long, int); -extern void ULtodd (ULong*, ULong*, Long, int); -extern void ULtoQ (ULong*, ULong*, Long, int); -extern void ULtox (UShort*, ULong*, Long, int); -extern void ULtoxL (ULong*, ULong*, Long, int); -extern ULong any_on (Bigint*, int); -extern double b2d (Bigint*, int*); -extern int cmp (Bigint*, Bigint*); -extern void copybits (ULong*, int, Bigint*); -extern Bigint *d2b (double, int*, int*); -extern void decrement (Bigint*); -extern Bigint *diff (Bigint*, Bigint*); -extern int gethex (const char**, FPI*, Long*, Bigint**, int); -extern void hexdig_init_D2A(void); -extern int hexnan (const char**, FPI*, ULong*); -#ifndef __GNUC__ -extern int hi0bits_D2A (ULong); -#endif -extern Bigint *i2b (int); -extern Bigint *increment (Bigint*); -#ifndef __GNUC__ -extern int lo0bits (ULong*); -#endif -extern Bigint *lshift (Bigint*, int); -extern int match (const char**, char*); -extern Bigint *mult (Bigint*, Bigint*); -extern Bigint *multadd (Bigint*, int, int); -extern char *nrv_alloc (char*, char **, int); -extern Bigint *pow5mult (Bigint*, int); -extern int quorem (Bigint*, Bigint*); -extern double ratio (Bigint*, Bigint*); -extern void rshift (Bigint*, int); -extern char *rv_alloc (int); -extern Bigint *s2b (const char*, int, int, ULong, int); -extern Bigint *set_ones (Bigint*, int); -extern char *strcp (char*, const char*); -extern Bigint *sum (Bigint*, Bigint*); -extern int trailz (Bigint*); -extern double ulp (dbl_union *); - -#ifdef __cplusplus -} -#endif -/* - * NAN_WORD0 and NAN_WORD1 are only referenced in strtod.c. Prior to - * 20050115, they used to be hard-wired here (to 0x7ff80000 and 0, - * respectively), but now are determined by compiling and running - * qnan.c to generate gd_qnan.h, which specifies d_QNAN0 and d_QNAN1. - * Formerly gdtoaimp.h recommended supplying suitable -DNAN_WORD0=... - * and -DNAN_WORD1=... values if necessary. This should still work. - * (On HP Series 700/800 machines, -DNAN_WORD0=0x7ff40000 works.) - */ -#ifdef IEEE_Arith -#ifndef NO_INFNAN_CHECK -#undef INFNAN_CHECK -#define INFNAN_CHECK -#endif -#ifdef IEEE_MC68k -#define _0 0 -#define _1 1 -#ifndef NAN_WORD0 -#define NAN_WORD0 d_QNAN0 -#endif -#ifndef NAN_WORD1 -#define NAN_WORD1 d_QNAN1 -#endif -#else -#define _0 1 -#define _1 0 -#ifndef NAN_WORD0 -#define NAN_WORD0 d_QNAN1 -#endif -#ifndef NAN_WORD1 -#define NAN_WORD1 d_QNAN0 -#endif -#endif -#else -#undef INFNAN_CHECK -#endif - -#undef SI -#ifdef Sudden_Underflow -#define SI 1 -#else -#define SI 0 -#endif - -#endif /* GDTOAIMP_H_INCLUDED */ diff --git a/src/lib/evil/gdtoa/gethex.c b/src/lib/evil/gdtoa/gethex.c deleted file mode 100644 index 2761754..0000000 --- a/src/lib/evil/gdtoa/gethex.c +++ /dev/null @@ -1,340 +0,0 @@ -/**************************************************************** - -The author of this software is David M. Gay. - -Copyright (C) 1998 by Lucent Technologies -All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appear in all -copies and that both that the copyright notice and this -permission notice and warranty disclaimer appear in supporting -documentation, and that the name of Lucent or any of its entities -not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. -IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY -SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER -IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - -****************************************************************/ - -/* Please send bug reports to David M. Gay (dmg at acm dot org, - * with " at " changed at "@" and " dot " changed to "."). */ - -#include "gdtoaimp.h" - -#ifdef USE_LOCALE -#include "locale.h" -#endif - -int gethex (const char **sp, FPI *fpi, Long *expo, Bigint **bp, int sign) -{ - Bigint *b; - const unsigned char *decpt, *s0, *s, *s1; - int big, esign, havedig, irv, j, k, n, n0, nbits, up, zret; - ULong L, lostbits, *x; - Long e, e1; -#ifdef USE_LOCALE - int i; - const unsigned char *decimalpoint; -#ifdef NO_LOCALE_CACHE - decimalpoint = (unsigned char *)localeconv()->decimal_point; -#else - static unsigned char *decimalpoint_cache; - if (!(s0 = decimalpoint_cache)) { - s0 = (unsigned char *)localeconv()->decimal_point; - decimalpoint_cache = (unsigned char *) - MALLOC(strlen((char *)s0) + 1); - if (decimalpoint_cache) { - strcpy((char *)decimalpoint_cache, (char *)s0); - s0 = decimalpoint_cache; - } - } - decimalpoint = s0; -#endif -#endif - - if (!hexdig['0']) - hexdig_init_D2A(); - *bp = 0; - havedig = 0; - s0 = *(const unsigned char **)sp + 2; - while(s0[havedig] == '0') - havedig++; - s0 += havedig; - s = s0; - decpt = 0; - zret = 0; - e = 0; - if (hexdig[*s]) - havedig++; - else { - zret = 1; -#ifdef USE_LOCALE - for(i = 0; decimalpoint[i]; ++i) { - if (s[i] != decimalpoint[i]) - goto pcheck; - } - decpt = s += i; -#else - if (*s != '.') - goto pcheck; - decpt = ++s; -#endif - if (!hexdig[*s]) - goto pcheck; - while(*s == '0') - s++; - if (hexdig[*s]) - zret = 0; - havedig = 1; - s0 = s; - } - while(hexdig[*s]) - s++; -#ifdef USE_LOCALE - if (*s == *decimalpoint && !decpt) { - for(i = 1; decimalpoint[i]; ++i) { - if (s[i] != decimalpoint[i]) - goto pcheck; - } - decpt = s += i; -#else - if (*s == '.' && !decpt) { - decpt = ++s; -#endif - while(hexdig[*s]) - s++; - }/*}*/ - if (decpt) - e = -(((Long)(s-decpt)) << 2); - pcheck: - s1 = s; - big = esign = 0; - switch(*s) { - case 'p': - case 'P': - switch(*++s) { - case '-': - esign = 1; - /* no break */ - case '+': - s++; - } - if ((n = hexdig[*s]) == 0 || n > 0x19) { - s = s1; - break; - } - e1 = n - 0x10; - while((n = hexdig[*++s]) !=0 && n <= 0x19) { - if (e1 & 0xf8000000) - big = 1; - e1 = 10*e1 + n - 0x10; - } - if (esign) - e1 = -e1; - e += e1; - } - *sp = (char*)s; - if (!havedig) - *sp = (char*)s0 - 1; - if (zret) - return STRTOG_Zero; - if (big) { - if (esign) { - switch(fpi->rounding) { - case FPI_Round_up: - if (sign) - break; - goto ret_tiny; - case FPI_Round_down: - if (!sign) - break; - goto ret_tiny; - } - goto retz; - ret_tiny: - b = Balloc(0); - b->wds = 1; - b->x[0] = 1; - goto dret; - } - switch(fpi->rounding) { - case FPI_Round_near: - goto ovfl1; - case FPI_Round_up: - if (!sign) - goto ovfl1; - goto ret_big; - case FPI_Round_down: - if (sign) - goto ovfl1; - goto ret_big; - } - ret_big: - nbits = fpi->nbits; - n0 = n = nbits >> kshift; - if (nbits & kmask) - ++n; - for(j = n, k = 0; j >>= 1; ++k); - *bp = b = Balloc(k); - b->wds = n; - for(j = 0; j < n0; ++j) - b->x[j] = ALL_ON; - if (n > n0) - b->x[j] = ULbits >> (ULbits - (nbits & kmask)); - *expo = fpi->emin; - return STRTOG_Normal | STRTOG_Inexlo; - } - n = s1 - s0 - 1; - for(k = 0; n > (1 << (kshift-2)) - 1; n >>= 1) - k++; - b = Balloc(k); - x = b->x; - n = 0; - L = 0; -#ifdef USE_LOCALE - for(i = 0; decimalpoint[i+1]; ++i); -#endif - while(s1 > s0) { -#ifdef USE_LOCALE - if (*--s1 == decimalpoint[i]) { - s1 -= i; - continue; - } -#else - if (*--s1 == '.') - continue; -#endif - if (n == ULbits) { - *x++ = L; - L = 0; - n = 0; - } - L |= (hexdig[*s1] & 0x0f) << n; - n += 4; - } - *x++ = L; - b->wds = n = x - b->x; - n = ULbits*n - hi0bits(L); - nbits = fpi->nbits; - lostbits = 0; - x = b->x; - if (n > nbits) { - n -= nbits; - if (any_on(b,n)) { - lostbits = 1; - k = n - 1; - if (x[k>>kshift] & 1 << (k & kmask)) { - lostbits = 2; - if (k > 0 && any_on(b,k)) - lostbits = 3; - } - } - rshift(b, n); - e += n; - } - else if (n < nbits) { - n = nbits - n; - b = lshift(b, n); - e -= n; - x = b->x; - } - if (e > fpi->emax) { - ovfl: - Bfree(b); - ovfl1: - SET_ERRNO(ERANGE); - return STRTOG_Infinite | STRTOG_Overflow | STRTOG_Inexhi; - } - irv = STRTOG_Normal; - if (e < fpi->emin) { - irv = STRTOG_Denormal; - n = fpi->emin - e; - if (n >= nbits) { - switch (fpi->rounding) { - case FPI_Round_near: - if (n == nbits && (n < 2 || any_on(b,n-1))) - goto one_bit; - break; - case FPI_Round_up: - if (!sign) - goto one_bit; - break; - case FPI_Round_down: - if (sign) { - one_bit: - x[0] = b->wds = 1; - dret: - *bp = b; - *expo = fpi->emin; - SET_ERRNO(ERANGE); - return STRTOG_Denormal | STRTOG_Inexhi - | STRTOG_Underflow; - } - } - Bfree(b); - retz: - SET_ERRNO(ERANGE); - return STRTOG_Zero | STRTOG_Inexlo | STRTOG_Underflow; - } - k = n - 1; - if (lostbits) - lostbits = 1; - else if (k > 0) - lostbits = any_on(b,k); - if (x[k>>kshift] & 1 << (k & kmask)) - lostbits |= 2; - nbits -= n; - rshift(b,n); - e = fpi->emin; - } - if (lostbits) { - up = 0; - switch(fpi->rounding) { - case FPI_Round_zero: - break; - case FPI_Round_near: - if (lostbits & 2 - && (lostbits | x[0]) & 1) - up = 1; - break; - case FPI_Round_up: - up = 1 - sign; - break; - case FPI_Round_down: - up = sign; - } - if (up) { - k = b->wds; - b = increment(b); - x = b->x; - if (irv == STRTOG_Denormal) { - if (nbits == fpi->nbits - 1 - && x[nbits >> kshift] & 1 << (nbits & kmask)) - irv = STRTOG_Normal; - } - else if (b->wds > k - || ((n = nbits & kmask) !=0 - && hi0bits(x[k-1]) < 32-n)) { - rshift(b,1); - if (++e > fpi->emax) - goto ovfl; - } - irv |= STRTOG_Inexhi; - } - else - irv |= STRTOG_Inexlo; - } - *bp = b; - *expo = e; - return irv; -} diff --git a/src/lib/evil/gdtoa/gmisc.c b/src/lib/evil/gdtoa/gmisc.c deleted file mode 100644 index 157e872..0000000 --- a/src/lib/evil/gdtoa/gmisc.c +++ /dev/null @@ -1,76 +0,0 @@ -/**************************************************************** - -The author of this software is David M. Gay. - -Copyright (C) 1998 by Lucent Technologies -All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appear in all -copies and that both that the copyright notice and this -permission notice and warranty disclaimer appear in supporting -documentation, and that the name of Lucent or any of its entities -not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. -IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY -SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER -IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - -****************************************************************/ - -/* Please send bug reports to David M. Gay (dmg at acm dot org, - * with " at " changed at "@" and " dot " changed to "."). */ - -#include "gdtoaimp.h" - -void rshift (Bigint *b, int k) -{ - ULong *x, *x1, *xe, y; - int n; - - x = x1 = b->x; - n = k >> kshift; - if (n < b->wds) { - xe = x + b->wds; - x += n; - if (k &= kmask) { - n = ULbits - k; - y = *x++ >> k; - while(x < xe) { - *x1++ = (y | (*x << n)) & ALL_ON; - y = *x++ >> k; - } - if ((*x1 = y) !=0) - x1++; - } - else - while(x < xe) - *x1++ = *x++; - } - if ((b->wds = x1 - b->x) == 0) - b->x[0] = 0; -} - -int trailz (Bigint *b) -{ - ULong L, *x, *xe; - int n = 0; - - x = b->x; - xe = x + b->wds; - for(n = 0; x < xe && !*x; x++) - n += ULbits; - if (x < xe) { - L = *x; - n += lo0bits(&L); - } - return n; -} diff --git a/src/lib/evil/gdtoa/hd_init.c b/src/lib/evil/gdtoa/hd_init.c deleted file mode 100644 index 5ee0caa..0000000 --- a/src/lib/evil/gdtoa/hd_init.c +++ /dev/null @@ -1,49 +0,0 @@ -/**************************************************************** - -The author of this software is David M. Gay. - -Copyright (C) 2000 by Lucent Technologies -All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appear in all -copies and that both that the copyright notice and this -permission notice and warranty disclaimer appear in supporting -documentation, and that the name of Lucent or any of its entities -not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. -IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY -SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER -IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - -****************************************************************/ - -/* Please send bug reports to David M. Gay (dmg at acm dot org, - * with " at " changed at "@" and " dot " changed to "."). */ - -#include "gdtoaimp.h" - -unsigned char hexdig[256]; - -static void htinit (unsigned char *h, unsigned char *s, int inc) -{ - int i, j; - for(i = 0; (j = s[i]) !=0; i++) - h[j] = i + inc; -} - -void hexdig_init_D2A (void) -{ -#define USC (unsigned char *) - htinit(hexdig, USC "0123456789", 0x10); - htinit(hexdig, USC "abcdef", 0x10 + 10); - htinit(hexdig, USC "ABCDEF", 0x10 + 10); -} diff --git a/src/lib/evil/gdtoa/hexnan.c b/src/lib/evil/gdtoa/hexnan.c deleted file mode 100644 index 4fa4c77..0000000 --- a/src/lib/evil/gdtoa/hexnan.c +++ /dev/null @@ -1,139 +0,0 @@ -/**************************************************************** - -The author of this software is David M. Gay. - -Copyright (C) 2000 by Lucent Technologies -All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appear in all -copies and that both that the copyright notice and this -permission notice and warranty disclaimer appear in supporting -documentation, and that the name of Lucent or any of its entities -not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. -IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY -SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER -IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - -****************************************************************/ - -/* Please send bug reports to David M. Gay (dmg at acm dot org, - * with " at " changed at "@" and " dot " changed to "."). */ - -#include "gdtoaimp.h" - -static void L_shift (ULong *x, ULong *x1, int i) -{ - int j; - - i = 8 - i; - i <<= 2; - j = ULbits - i; - do { - *x |= x[1] << j; - x[1] >>= i; - } while(++x < x1); -} - -int hexnan (const char **sp, FPI *fpi, ULong *x0) -{ - ULong c, h, *x, *x1, *xe; - const char *s; - int havedig, hd0, i, nbits; - - if (!hexdig['0']) - hexdig_init_D2A(); - nbits = fpi->nbits; - x = x0 + (nbits >> kshift); - if (nbits & kmask) - x++; - *--x = 0; - x1 = xe = x; - havedig = hd0 = i = 0; - s = *sp; - /* allow optional initial 0x or 0X */ - while((c = *(const unsigned char*)(s+1)) && c <= ' ') - ++s; - if (s[1] == '0' && (s[2] == 'x' || s[2] == 'X') - && *(const unsigned char*)(s+3) > ' ') - s += 2; - while((c = *(const unsigned char*)++s)) { - if (!(h = hexdig[c])) { - if (c <= ' ') { - if (hd0 < havedig) { - if (x < x1 && i < 8) - L_shift(x, x1, i); - if (x <= x0) { - i = 8; - continue; - } - hd0 = havedig; - *--x = 0; - x1 = x; - i = 0; - } - while(*(const unsigned char*)(s+1) <= ' ') - ++s; - if (s[1] == '0' && (s[2] == 'x' || s[2] == 'X') - && *(const unsigned char*)(s+3) > ' ') - s += 2; - continue; - } - if (/*(*/ c == ')' && havedig) { - *sp = s + 1; - break; - } -#ifndef GDTOA_NON_PEDANTIC_NANCHECK - do { - if (/*(*/ c == ')') { - *sp = s + 1; - break; - } - } while((c = *++s)); -#endif - return STRTOG_NaN; - } - havedig++; - if (++i > 8) { - if (x <= x0) - continue; - i = 1; - *--x = 0; - } - *x = (*x << 4) | (h & 0xf); - } - if (!havedig) - return STRTOG_NaN; - if (x < x1 && i < 8) - L_shift(x, x1, i); - if (x > x0) { - x1 = x0; - do *x1++ = *x++; - while(x <= xe); - do *x1++ = 0; - while(x1 <= xe); - } - else { - /* truncate high-order word if necessary */ - if ( (i = nbits & (ULbits-1)) !=0) - *xe &= ((ULong)0xffffffff) >> (ULbits - i); - } - for(x1 = xe;; --x1) { - if (*x1 != 0) - break; - if (x1 == x0) { - *x1 = 1; - break; - } - } - return STRTOG_NaNbits; -} diff --git a/src/lib/evil/gdtoa/misc.c b/src/lib/evil/gdtoa/misc.c deleted file mode 100644 index 43f31ce..0000000 --- a/src/lib/evil/gdtoa/misc.c +++ /dev/null @@ -1,860 +0,0 @@ -/**************************************************************** - -The author of this software is David M. Gay. - -Copyright (C) 1998, 1999 by Lucent Technologies -All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appear in all -copies and that both that the copyright notice and this -permission notice and warranty disclaimer appear in supporting -documentation, and that the name of Lucent or any of its entities -not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. -IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY -SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER -IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - -****************************************************************/ - -/* Please send bug reports to David M. Gay (dmg at acm dot org, - * with " at " changed at "@" and " dot " changed to "."). */ - - -#if defined(__MINGW32__) || defined(__MINGW64__) -/* we have to include windows.h before gdtoa - headers, otherwise defines cause conflicts. */ -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif -#include - -#define NLOCKS 2 - -#ifdef USE_WIN32_SL -/* Use spin locks. */ -static long dtoa_sl[NLOCKS]; - -#define ACQUIRE_DTOA_LOCK(n) \ - while (InterlockedCompareExchange (&dtoa_sl[n], 1, 0) != 0) \ - Sleep (0); -#define FREE_DTOA_LOCK(n) InterlockedExchange (&dtoa_sl[n], 0); - -#else /* USE_WIN32_SL */ - -#include -static CRITICAL_SECTION dtoa_CritSec[NLOCKS]; -static long dtoa_CS_init = 0; -/* - 1 = initializing - 2 = initialized - 3 = deleted -*/ -static void dtoa_lock_cleanup (void) -{ - long last_CS_init = InterlockedExchange (&dtoa_CS_init,3); - if (2 == last_CS_init) { - int i; - for (i = 0; i < NLOCKS; i++) - DeleteCriticalSection (&dtoa_CritSec[i]); - } -} - -static void dtoa_lock (int n) -{ - if (2 == dtoa_CS_init) { - EnterCriticalSection (&dtoa_CritSec[n]); - return; - } - else if (0 == dtoa_CS_init) { - long last_CS_init = InterlockedExchange (&dtoa_CS_init, 1); - if (0 == last_CS_init) { - int i; - for (i = 0; i < NLOCKS; i++) - InitializeCriticalSection (&dtoa_CritSec[i]); - atexit (dtoa_lock_cleanup); - dtoa_CS_init = 2; - } - else if (2 == last_CS_init) - dtoa_CS_init = 2; - } - /* Another thread is initializing. Wait. */ - while (1 == dtoa_CS_init) - Sleep (1); - - /* It had better be initialized now. */ - if (2 == dtoa_CS_init) - EnterCriticalSection(&dtoa_CritSec[n]); -} - -static void dtoa_unlock (int n) -{ - if (2 == dtoa_CS_init) - LeaveCriticalSection (&dtoa_CritSec[n]); -} - -#define ACQUIRE_DTOA_LOCK(n) dtoa_lock(n) -#define FREE_DTOA_LOCK(n) dtoa_unlock(n) -#endif /* USE_WIN32_SL */ - -#endif /* __MINGW32__ / __MINGW64__ */ - -#include "gdtoaimp.h" - -static Bigint *freelist[Kmax+1]; -#ifndef Omit_Private_Memory -#ifndef PRIVATE_MEM -#define PRIVATE_MEM 2304 -#endif -#define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double)) -static double private_mem[PRIVATE_mem], *pmem_next = private_mem; -#endif - -Bigint *Balloc (int k) -{ - int x; - Bigint *rv; -#ifndef Omit_Private_Memory - unsigned int len; -#endif - - ACQUIRE_DTOA_LOCK(0); - /* The k > Kmax case does not need ACQUIRE_DTOA_LOCK(0), */ - /* but this case seems very unlikely. */ - if (k <= Kmax && (rv = freelist[k]) !=0) { - freelist[k] = rv->next; - } - else { - x = 1 << k; -#ifdef Omit_Private_Memory - rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong)); - if (rv == NULL) - return NULL; -#else - len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1) - /sizeof(double); - if (k <= Kmax - && (size_t) (pmem_next - private_mem + len) <= PRIVATE_mem) - { - rv = (Bigint*)pmem_next; - pmem_next += len; - } - else - { - rv = (Bigint*)MALLOC(len*sizeof(double)); - if (rv == NULL) - return NULL; - } -#endif - rv->k = k; - rv->maxwds = x; - } - FREE_DTOA_LOCK(0); - rv->sign = rv->wds = 0; - return rv; -} - -void Bfree (Bigint *v) -{ - if (v) { - if (v->k > Kmax) - free((void*)v); - else { - ACQUIRE_DTOA_LOCK(0); - v->next = freelist[v->k]; - freelist[v->k] = v; - FREE_DTOA_LOCK(0); - } - } -} - -/* lo0bits(): Shift y so lowest bit is 1 and return the - * number of bits y was shifted. - * With GCC, we use an inline wrapper for __builtin_clz() - */ -#ifndef __GNUC__ -int lo0bits (ULong *y) -{ - int k; - ULong x = *y; - - if (x & 7) { - if (x & 1) - return 0; - if (x & 2) { - *y = x >> 1; - return 1; - } - *y = x >> 2; - return 2; - } - k = 0; - if (!(x & 0xffff)) { - k = 16; - x >>= 16; - } - if (!(x & 0xff)) { - k += 8; - x >>= 8; - } - if (!(x & 0xf)) { - k += 4; - x >>= 4; - } - if (!(x & 0x3)) { - k += 2; - x >>= 2; - } - if (!(x & 1)) { - k++; - x >>= 1; - if (!x) - return 32; - } - *y = x; - return k; -} -#endif /* __GNUC__ */ - -Bigint *multadd (Bigint *b, int m, int a) /* multiply by m and add a */ -{ - int i, wds; -#ifdef ULLong - ULong *x; - ULLong carry, y; -#else - ULong carry, *x, y; -#ifdef Pack_32 - ULong xi, z; -#endif -#endif - Bigint *b1; - - wds = b->wds; - x = b->x; - i = 0; - carry = a; - do { -#ifdef ULLong - y = *x * (ULLong)m + carry; - carry = y >> 32; - *x++ = y & 0xffffffffUL; -#else -#ifdef Pack_32 - xi = *x; - y = (xi & 0xffff) * m + carry; - z = (xi >> 16) * m + (y >> 16); - carry = z >> 16; - *x++ = (z << 16) + (y & 0xffff); -#else - y = *x * m + carry; - carry = y >> 16; - *x++ = y & 0xffff; -#endif -#endif - } while(++i < wds); - if (carry) { - if (wds >= b->maxwds) { - b1 = Balloc(b->k+1); - if (b1 == NULL) - return NULL; - Bcopy(b1, b); - Bfree(b); - b = b1; - } - b->x[wds++] = carry; - b->wds = wds; - } - return b; -} - -/* hi0bits(); - * With GCC, we use an inline wrapper for __builtin_clz() - */ -#ifndef __GNUC__ -int hi0bits_D2A (ULong x) -{ - int k = 0; - - if (!(x & 0xffff0000)) { - k = 16; - x <<= 16; - } - if (!(x & 0xff000000)) { - k += 8; - x <<= 8; - } - if (!(x & 0xf0000000)) { - k += 4; - x <<= 4; - } - if (!(x & 0xc0000000)) { - k += 2; - x <<= 2; - } - if (!(x & 0x80000000)) { - k++; - if (!(x & 0x40000000)) - return 32; - } - return k; -} -#endif /* __GNUC__ */ - -Bigint *i2b (int i) -{ - Bigint *b; - - b = Balloc(1); - if (b == NULL) - return NULL; - b->x[0] = i; - b->wds = 1; - return b; -} - -Bigint *mult (Bigint *a, Bigint *b) -{ - Bigint *c; - int k, wa, wb, wc; - ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0; - ULong y; -#ifdef ULLong - ULLong carry, z; -#else - ULong carry, z; -#ifdef Pack_32 - ULong z2; -#endif -#endif - - if (a->wds < b->wds) { - c = a; - a = b; - b = c; - } - k = a->k; - wa = a->wds; - wb = b->wds; - wc = wa + wb; - if (wc > a->maxwds) - k++; - c = Balloc(k); - if (c == NULL) - return NULL; - for(x = c->x, xa = x + wc; x < xa; x++) - *x = 0; - xa = a->x; - xae = xa + wa; - xb = b->x; - xbe = xb + wb; - xc0 = c->x; -#ifdef ULLong - for(; xb < xbe; xc0++) { - if ( (y = *xb++) !=0) { - x = xa; - xc = xc0; - carry = 0; - do { - z = *x++ * (ULLong)y + *xc + carry; - carry = z >> 32; - *xc++ = z & 0xffffffffUL; - } while(x < xae); - *xc = carry; - } - } -#else -#ifdef Pack_32 - for(; xb < xbe; xb++, xc0++) { - if ( (y = *xb & 0xffff) !=0) { - x = xa; - xc = xc0; - carry = 0; - do { - z = (*x & 0xffff) * y + (*xc & 0xffff) + carry; - carry = z >> 16; - z2 = (*x++ >> 16) * y + (*xc >> 16) + carry; - carry = z2 >> 16; - Storeinc(xc, z2, z); - } while(x < xae); - *xc = carry; - } - if ( (y = *xb >> 16) !=0) { - x = xa; - xc = xc0; - carry = 0; - z2 = *xc; - do { - z = (*x & 0xffff) * y + (*xc >> 16) + carry; - carry = z >> 16; - Storeinc(xc, z, z2); - z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry; - carry = z2 >> 16; - } while(x < xae); - *xc = z2; - } - } -#else - for(; xb < xbe; xc0++) { - if ( (y = *xb++) !=0) { - x = xa; - xc = xc0; - carry = 0; - do { - z = *x++ * y + *xc + carry; - carry = z >> 16; - *xc++ = z & 0xffff; - } while(x < xae); - *xc = carry; - } - } -#endif -#endif - for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ; - c->wds = wc; - return c; -} - -static Bigint *p5s; - -Bigint *pow5mult (Bigint *b, int k) -{ - Bigint *b1, *p5, *p51; - int i; - static int p05[3] = { 5, 25, 125 }; - - if ( (i = k & 3) !=0) - { - b = multadd(b, p05[i-1], 0); - if (b == NULL) - return NULL; - } - if (!(k >>= 2)) - return b; - if ((p5 = p5s) == 0) { - /* first time */ -#ifdef MULTIPLE_THREADS - ACQUIRE_DTOA_LOCK(1); - if (!(p5 = p5s)) { - p5 = p5s = i2b(625); - if (p5 == NULL) - return NULL; - p5->next = 0; - } - FREE_DTOA_LOCK(1); -#else - p5 = p5s = i2b(625); - if (p5 == NULL) - return NULL; - p5->next = 0; -#endif - } - for(;;) { - if (k & 1) { - b1 = mult(b, p5); - if (b1 == NULL) - return NULL; - Bfree(b); - b = b1; - } - if (!(k >>= 1)) - break; - if ((p51 = p5->next) == 0) { -#ifdef MULTIPLE_THREADS - ACQUIRE_DTOA_LOCK(1); - if (!(p51 = p5->next)) { - p51 = p5->next = mult(p5,p5); - if (p51 == NULL) - return NULL; - p51->next = 0; - } - FREE_DTOA_LOCK(1); -#else - p51 = p5->next = mult(p5,p5); - if (p51 == NULL) - return NULL; - p51->next = 0; -#endif - } - p5 = p51; - } - return b; -} - -Bigint *lshift (Bigint *b, int k) -{ - int i, k1, n, n1; - Bigint *b1; - ULong *x, *x1, *xe, z; - - n = k >> kshift; - k1 = b->k; - n1 = n + b->wds + 1; - for(i = b->maxwds; n1 > i; i <<= 1) - k1++; - b1 = Balloc(k1); - if (b1 == NULL) - return NULL; - x1 = b1->x; - for(i = 0; i < n; i++) - *x1++ = 0; - x = b->x; - xe = x + b->wds; - if (k &= kmask) { -#ifdef Pack_32 - k1 = 32 - k; - z = 0; - do { - *x1++ = *x << k | z; - z = *x++ >> k1; - } while(x < xe); - if ((*x1 = z) !=0) - ++n1; -#else - k1 = 16 - k; - z = 0; - do { - *x1++ = *x << k & 0xffff | z; - z = *x++ >> k1; - } while(x < xe); - if (*x1 = z) - ++n1; -#endif - } - else do - *x1++ = *x++; - while(x < xe); - b1->wds = n1 - 1; - Bfree(b); - return b1; -} - -int cmp (Bigint *a, Bigint *b) -{ - ULong *xa, *xa0, *xb, *xb0; - int i, j; - - i = a->wds; - j = b->wds; -#ifdef DEBUG - if (i > 1 && !a->x[i-1]) - Bug("cmp called with a->x[a->wds-1] == 0"); - if (j > 1 && !b->x[j-1]) - Bug("cmp called with b->x[b->wds-1] == 0"); -#endif - if (i -= j) - return i; - xa0 = a->x; - xa = xa0 + j; - xb0 = b->x; - xb = xb0 + j; - for(;;) { - if (*--xa != *--xb) - return *xa < *xb ? -1 : 1; - if (xa <= xa0) - break; - } - return 0; -} - -Bigint *diff (Bigint *a, Bigint *b) -{ - Bigint *c; - int i, wa, wb; - ULong *xa, *xae, *xb, *xbe, *xc; -#ifdef ULLong - ULLong borrow, y; -#else - ULong borrow, y; -#ifdef Pack_32 - ULong z; -#endif -#endif - - i = cmp(a,b); - if (!i) { - c = Balloc(0); - if (c == NULL) - return NULL; - c->wds = 1; - c->x[0] = 0; - return c; - } - if (i < 0) { - c = a; - a = b; - b = c; - i = 1; - } - else - i = 0; - c = Balloc(a->k); - if (c == NULL) - return NULL; - c->sign = i; - wa = a->wds; - xa = a->x; - xae = xa + wa; - wb = b->wds; - xb = b->x; - xbe = xb + wb; - xc = c->x; - borrow = 0; -#ifdef ULLong - do { - y = (ULLong)*xa++ - *xb++ - borrow; - borrow = y >> 32 & 1UL; - *xc++ = y & 0xffffffffUL; - } while(xb < xbe); - while(xa < xae) { - y = *xa++ - borrow; - borrow = y >> 32 & 1UL; - *xc++ = y & 0xffffffffUL; - } -#else -#ifdef Pack_32 - do { - y = (*xa & 0xffff) - (*xb & 0xffff) - borrow; - borrow = (y & 0x10000) >> 16; - z = (*xa++ >> 16) - (*xb++ >> 16) - borrow; - borrow = (z & 0x10000) >> 16; - Storeinc(xc, z, y); - } while(xb < xbe); - while(xa < xae) { - y = (*xa & 0xffff) - borrow; - borrow = (y & 0x10000) >> 16; - z = (*xa++ >> 16) - borrow; - borrow = (z & 0x10000) >> 16; - Storeinc(xc, z, y); - } -#else - do { - y = *xa++ - *xb++ - borrow; - borrow = (y & 0x10000) >> 16; - *xc++ = y & 0xffff; - } while(xb < xbe); - while(xa < xae) { - y = *xa++ - borrow; - borrow = (y & 0x10000) >> 16; - *xc++ = y & 0xffff; - } -#endif -#endif - while(!*--xc) - wa--; - c->wds = wa; - return c; -} - -double b2d (Bigint *a, int *e) -{ - ULong *xa, *xa0, w, y, z; - int k; - union _dbl_union d; -#define d0 word0(&d) -#define d1 word1(&d) - - xa0 = a->x; - xa = xa0 + a->wds; - y = *--xa; -#ifdef DEBUG - if (!y) Bug("zero y in b2d"); -#endif - k = hi0bits(y); - *e = 32 - k; -#ifdef Pack_32 - if (k < Ebits) { - d0 = Exp_1 | y >> (Ebits - k); - w = xa > xa0 ? *--xa : 0; - d1 = y << ((32-Ebits) + k) | w >> (Ebits - k); - goto ret_d; - } - z = xa > xa0 ? *--xa : 0; - if (k -= Ebits) { - d0 = Exp_1 | y << k | z >> (32 - k); - y = xa > xa0 ? *--xa : 0; - d1 = z << k | y >> (32 - k); - } - else { - d0 = Exp_1 | y; - d1 = z; - } -#else - if (k < Ebits + 16) { - z = xa > xa0 ? *--xa : 0; - d0 = Exp_1 | y << k - Ebits | z >> Ebits + 16 - k; - w = xa > xa0 ? *--xa : 0; - y = xa > xa0 ? *--xa : 0; - d1 = z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k; - goto ret_d; - } - z = xa > xa0 ? *--xa : 0; - w = xa > xa0 ? *--xa : 0; - k -= Ebits + 16; - d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k; - y = xa > xa0 ? *--xa : 0; - d1 = w << k + 16 | y << k; -#endif - ret_d: - return dval(&d); -#undef d0 -#undef d1 -} - -Bigint *d2b (double dd, int *e, int *bits) -{ - Bigint *b; - union _dbl_union d; -#ifndef Sudden_Underflow - int i; -#endif - int de, k; - ULong *x, y, z; -#define d0 word0(&d) -#define d1 word1(&d) - d.d = dd; - -#ifdef Pack_32 - b = Balloc(1); -#else - b = Balloc(2); -#endif - if (b == NULL) - return NULL; - x = b->x; - - z = d0 & Frac_mask; - d0 &= 0x7fffffff; /* clear sign bit, which we ignore */ -#ifdef Sudden_Underflow - de = (int)(d0 >> Exp_shift); - z |= Exp_msk11; -#else - if ( (de = (int)(d0 >> Exp_shift)) !=0) - z |= Exp_msk1; -#endif -#ifdef Pack_32 - if ( (y = d1) !=0) { - if ( (k = lo0bits(&y)) !=0) { - x[0] = y | z << (32 - k); - z >>= k; - } - else - x[0] = y; -#ifndef Sudden_Underflow - i = -#endif - b->wds = (x[1] = z) !=0 ? 2 : 1; - } - else { - k = lo0bits(&z); - x[0] = z; -#ifndef Sudden_Underflow - i = -#endif - b->wds = 1; - k += 32; - } -#else - if ( (y = d1) !=0) { - if ( (k = lo0bits(&y)) !=0) - if (k >= 16) { - x[0] = y | z << 32 - k & 0xffff; - x[1] = z >> k - 16 & 0xffff; - x[2] = z >> k; - i = 2; - } - else { - x[0] = y & 0xffff; - x[1] = y >> 16 | z << 16 - k & 0xffff; - x[2] = z >> k & 0xffff; - x[3] = z >> k+16; - i = 3; - } - else { - x[0] = y & 0xffff; - x[1] = y >> 16; - x[2] = z & 0xffff; - x[3] = z >> 16; - i = 3; - } - } - else { -#ifdef DEBUG - if (!z) - Bug("Zero passed to d2b"); -#endif - k = lo0bits(&z); - if (k >= 16) { - x[0] = z; - i = 0; - } - else { - x[0] = z & 0xffff; - x[1] = z >> 16; - i = 1; - } - k += 32; - } - while(!x[i]) - --i; - b->wds = i + 1; -#endif -#ifndef Sudden_Underflow - if (de) { -#endif - *e = de - Bias - (P-1) + k; - *bits = P - k; -#ifndef Sudden_Underflow - } - else { - *e = de - Bias - (P-1) + 1 + k; -#ifdef Pack_32 - *bits = 32*i - hi0bits(x[i-1]); -#else - *bits = (i+2)*16 - hi0bits(x[i]); -#endif - } -#endif - return b; -#undef d0 -#undef d1 -} - -const double -bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 }; -const double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128, 1e-256 }; - -const double -tens[] = { - 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, - 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, - 1e20, 1e21, 1e22 -}; - -char *strcp_D2A (char *a, const char *b) -{ - while((*a = *b++)) - a++; - return a; -} - -#ifdef NO_STRING_H -void *memcpy_D2A (void *a1, void *b1, size_t len) -{ - char *a = (char*)a1, *ae = a + len; - char *b = (char*)b1, *a0 = a; - while(a < ae) - *a++ = *b++; - return a0; -} -#endif /* NO_STRING_H */ - diff --git a/src/lib/evil/gdtoa/qnan.c b/src/lib/evil/gdtoa/qnan.c deleted file mode 100644 index c6bc3fe..0000000 --- a/src/lib/evil/gdtoa/qnan.c +++ /dev/null @@ -1,116 +0,0 @@ -/**************************************************************** - -The author of this software is David M. Gay. - -Copyright (C) 2005 by David M. Gay -All Rights Reserved - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that the copyright notice and this permission notice and warranty -disclaimer appear in supporting documentation, and that the name of -the author or any of his current or former employers not be used in -advertising or publicity pertaining to distribution of the software -without specific, written prior permission. - -THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN -NO EVENT SHALL THE AUTHOR OR ANY OF HIS CURRENT OR FORMER EMPLOYERS BE -LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY -DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -SOFTWARE. - -****************************************************************/ - -/* Please send bug reports to David M. Gay (dmg at acm dot org, - * with " at " changed at "@" and " dot " changed to "."). */ - -/* Program to compute quiet NaNs of various precisions (float, */ -/* double, and perhaps long double) on the current system, */ -/* provided the system uses binary IEEE (P754) arithmetic. */ -/* Note that one system's quiet NaN may be a signaling NaN on */ -/* another system. The IEEE arithmetic standards (P754, P854) */ -/* do not specify how to distinguish signaling NaNs from quiet */ -/* ones, and this detail varies across systems. The computed */ -/* NaN values are encoded in #defines for values for an */ -/* unsigned 32-bit integer type, called Ulong below, and */ -/* (for long double) perhaps as unsigned short values. Once */ -/* upon a time, there were PC compilers for Intel CPUs that */ -/* had sizeof(long double) = 10. Are such compilers still */ -/* distributed? */ - -#include -#include "gd_arith.h" - -#ifndef Long -#define Long long -#endif - -typedef unsigned Long Ulong; - -#undef HAVE_IEEE -#ifdef IEEE_8087 -#define _0 1 -#define _1 0 -#define HAVE_IEEE -#endif -#ifdef IEEE_MC68k -#define _0 0 -#define _1 1 -#define HAVE_IEEE -#endif - -#define UL (unsigned long) - -#ifdef MINGW_BUILD_GEN - int -main(void) -{ -#ifdef HAVE_IEEE - typedef union { - float f; - double d; - Ulong L[4]; -#ifndef NO_LONG_LONG -/* need u[8] instead of u[5] for 64 bit */ - unsigned short u[8]; - long double D; -#endif - } U; - U a, b, c; - int i; - a.L[0]=a.L[1]=a.L[2]=a.L[3]=0; - b.L[0]=b.L[1]=b.L[2]=b.L[3]=0; - c.L[0]=c.L[1]=c.L[2]=c.L[3]=0; - - a.L[0] = b.L[0] = 0x7f800000; - c.f = a.f - b.f; - printf("#define f_QNAN 0x%lx\n", UL c.L[0]); - a.L[_0] = b.L[_0] = 0x7ff00000; - a.L[_1] = b.L[_1] = 0; - c.d = a.d - b.d; /* quiet NaN */ - printf("#define d_QNAN0 0x%lx\n", UL c.L[0]); - printf("#define d_QNAN1 0x%lx\n", UL c.L[1]); -#ifdef NO_LONG_LONG - for(i = 0; i < 4; i++) - printf("#define ld_QNAN%d 0xffffffff\n", i); - for(i = 0; i < 5; i++) - printf("#define ldus_QNAN%d 0xffff\n", i); -#else - b.D = c.D = a.d; - if (printf("") < 0) - c.D = 37; /* never executed; just defeat optimization */ - a.L[2] = a.L[3] = 0; - a.D = b.D - c.D; - for(i = 0; i < 4; i++) - printf("#define ld_QNAN%d 0x%lx\n", i, UL a.L[i]); - for(i = 0; i < 5; i++) - printf("#define ldus_QNAN%d 0x%x\n", i, a.u[i]); -#endif -#endif /* HAVE_IEEE */ - return 0; - } -#endif diff --git a/src/lib/evil/gdtoa/smisc.c b/src/lib/evil/gdtoa/smisc.c deleted file mode 100644 index 1d09b44..0000000 --- a/src/lib/evil/gdtoa/smisc.c +++ /dev/null @@ -1,149 +0,0 @@ -/**************************************************************** - -The author of this software is David M. Gay. - -Copyright (C) 1998, 1999 by Lucent Technologies -All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appear in all -copies and that both that the copyright notice and this -permission notice and warranty disclaimer appear in supporting -documentation, and that the name of Lucent or any of its entities -not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. -IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY -SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER -IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - -****************************************************************/ - -/* Please send bug reports to David M. Gay (dmg at acm dot org, - * with " at " changed at "@" and " dot " changed to "."). */ - -#include "gdtoaimp.h" - -Bigint *s2b (const char *s, int nd0, int nd, ULong y9, int dplen) -{ - Bigint *b; - int i, k; - Long x, y; - - x = (nd + 8) / 9; - for(k = 0, y = 1; x > y; y <<= 1, k++) ; -#ifdef Pack_32 - b = Balloc(k); - b->x[0] = y9; - b->wds = 1; -#else - b = Balloc(k+1); - b->x[0] = y9 & 0xffff; - b->wds = (b->x[1] = y9 >> 16) ? 2 : 1; -#endif - - i = 9; - if (9 < nd0) { - s += 9; - do b = multadd(b, 10, *s++ - '0'); - while(++i < nd0); - s += dplen; - } - else - s += dplen + 9; - for(; i < nd; i++) - b = multadd(b, 10, *s++ - '0'); - return b; -} - -double ratio (Bigint *a, Bigint *b) -{ - union _dbl_union da, db; - int k, ka, kb; - - dval(&da) = b2d(a, &ka); - dval(&db) = b2d(b, &kb); - k = ka - kb + ULbits*(a->wds - b->wds); - if (k > 0) - word0(&da) += k*Exp_msk1; - else { - k = -k; - word0(&db) += k*Exp_msk1; - } - return dval(&da) / dval(&db); -} - -#ifdef INFNAN_CHECK - -int match (const char **sp, char *t) -{ - int c, d; - const char *s = *sp; - - while( (d = *t++) !=0) { - if ((c = *++s) >= 'A' && c <= 'Z') - c += 'a' - 'A'; - if (c != d) - return 0; - } - *sp = s + 1; - return 1; -} -#endif /* INFNAN_CHECK */ - -void copybits (ULong *c, int n, Bigint *b) -{ - ULong *ce, *x, *xe; -#ifdef Pack_16 - int nw, nw1; -#endif - - ce = c + ((n-1) >> kshift) + 1; - x = b->x; -#ifdef Pack_32 - xe = x + b->wds; - while(x < xe) - *c++ = *x++; -#else - nw = b->wds; - nw1 = nw & 1; - for(xe = x + (nw - nw1); x < xe; x += 2) - Storeinc(c, x[1], x[0]); - if (nw1) - *c++ = *x; -#endif - while(c < ce) - *c++ = 0; -} - -ULong any_on (Bigint *b, int k) -{ - int n, nwds; - ULong *x, *x0, x1, x2; - - x = b->x; - nwds = b->wds; - n = k >> kshift; - if (n > nwds) - n = nwds; - else if (n < nwds && (k &= kmask)) { - x1 = x2 = x[n]; - x1 >>= k; - x1 <<= k; - if (x1 != x2) - return 1; - } - x0 = x; - x += n; - while(x > x0) - if (*--x) - return 1; - return 0; -} diff --git a/src/lib/evil/gdtoa/strtodg.c b/src/lib/evil/gdtoa/strtodg.c deleted file mode 100644 index 42ab9df..0000000 --- a/src/lib/evil/gdtoa/strtodg.c +++ /dev/null @@ -1,979 +0,0 @@ -/**************************************************************** - -The author of this software is David M. Gay. - -Copyright (C) 1998-2001 by Lucent Technologies -All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appear in all -copies and that both that the copyright notice and this -permission notice and warranty disclaimer appear in supporting -documentation, and that the name of Lucent or any of its entities -not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. -IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY -SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER -IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - -****************************************************************/ - -/* Please send bug reports to David M. Gay (dmg at acm dot org, - * with " at " changed at "@" and " dot " changed to "."). */ - -#include "gdtoaimp.h" - -#ifdef USE_LOCALE -#include "locale.h" -#endif - -static const int -fivesbits[] = { 0, 3, 5, 7, 10, 12, 14, 17, 19, 21, - 24, 26, 28, 31, 33, 35, 38, 40, 42, 45, - 47, 49, 52 -}; - -Bigint *increment (Bigint *b) -{ - ULong *x, *xe; - Bigint *b1; -#ifdef Pack_16 - ULong carry = 1, y; -#endif - - x = b->x; - xe = x + b->wds; -#ifdef Pack_32 - do { - if (*x < (ULong)0xffffffffL) { - ++*x; - return b; - } - *x++ = 0; - } while(x < xe); -#else - do { - y = *x + carry; - carry = y >> 16; - *x++ = y & 0xffff; - if (!carry) - return b; - } while(x < xe); - if (carry) -#endif - { - if (b->wds >= b->maxwds) { - b1 = Balloc(b->k+1); - Bcopy(b1,b); - Bfree(b); - b = b1; - } - b->x[b->wds++] = 1; - } - return b; -} - -void decrement (Bigint *b) -{ - ULong *x, *xe; -#ifdef Pack_16 - ULong borrow = 1, y; -#endif - - x = b->x; - xe = x + b->wds; -#ifdef Pack_32 - do { - if (*x) { - --*x; - break; - } - *x++ = 0xffffffffL; - } while(x < xe); -#else - do { - y = *x - borrow; - borrow = (y & 0x10000) >> 16; - *x++ = y & 0xffff; - } while(borrow && x < xe); -#endif -} - -static int all_on (Bigint *b, int n) -{ - ULong *x, *xe; - - x = b->x; - xe = x + (n >> kshift); - while(x < xe) - if ((*x++ & ALL_ON) != ALL_ON) - return 0; - if (n &= kmask) - return ((*x | (ALL_ON << n)) & ALL_ON) == ALL_ON; - return 1; -} - -Bigint *set_ones (Bigint *b, int n) -{ - int k; - ULong *x, *xe; - - k = (n + ((1 << kshift) - 1)) >> kshift; - if (b->k < k) { - Bfree(b); - b = Balloc(k); - } - k = n >> kshift; - if (n &= kmask) - k++; - b->wds = k; - x = b->x; - xe = x + k; - while(x < xe) - *x++ = ALL_ON; - if (n) - x[-1] >>= ULbits - n; - return b; -} - -static int rvOK (dbl_union *d, FPI *fpi, Long *expo, ULong *bits, - int exact, int rd, int *irv) -{ - Bigint *b; - ULong carry, inex, lostbits; - int bdif, e, j, k, k1, nb, rv; - - carry = rv = 0; - b = d2b(dval(d), &e, &bdif); - bdif -= nb = fpi->nbits; - e += bdif; - if (bdif <= 0) { - if (exact) - goto trunc; - goto ret; - } - if (P == nb) { - if ( -#ifndef IMPRECISE_INEXACT - exact && -#endif - fpi->rounding == -#ifdef RND_PRODQUOT - FPI_Round_near -#else - Flt_Rounds -#endif - ) goto trunc; - goto ret; - } - switch(rd) { - case 1: /* round down (toward -Infinity) */ - goto trunc; - case 2: /* round up (toward +Infinity) */ - break; - default: /* round near */ - k = bdif - 1; - if (k < 0) - goto trunc; - if (!k) { - if (!exact) - goto ret; - if (b->x[0] & 2) - break; - goto trunc; - } - if (b->x[k>>kshift] & ((ULong)1 << (k & kmask))) - break; - goto trunc; - } - /* "break" cases: round up 1 bit, then truncate; bdif > 0 */ - carry = 1; - trunc: - inex = lostbits = 0; - if (bdif > 0) { - if ( (lostbits = any_on(b, bdif)) !=0) - inex = STRTOG_Inexlo; - rshift(b, bdif); - if (carry) { - inex = STRTOG_Inexhi; - b = increment(b); - if ( (j = nb & kmask) !=0) - j = ULbits - j; - if (hi0bits(b->x[b->wds - 1]) != j) { - if (!lostbits) - lostbits = b->x[0] & 1; - rshift(b, 1); - e++; - } - } - } - else if (bdif < 0) - b = lshift(b, -bdif); - if (e < fpi->emin) { - k = fpi->emin - e; - e = fpi->emin; - if (k > nb || fpi->sudden_underflow) { - b->wds = inex = 0; - *irv = STRTOG_Underflow | STRTOG_Inexlo; - } - else { - k1 = k - 1; - if (k1 > 0 && !lostbits) - lostbits = any_on(b, k1); - if (!lostbits && !exact) - goto ret; - lostbits |= - carry = b->x[k1>>kshift] & (1 << (k1 & kmask)); - rshift(b, k); - *irv = STRTOG_Denormal; - if (carry) { - b = increment(b); - inex = STRTOG_Inexhi | STRTOG_Underflow; - } - else if (lostbits) - inex = STRTOG_Inexlo | STRTOG_Underflow; - } - } - else if (e > fpi->emax) { - e = fpi->emax + 1; - *irv = STRTOG_Infinite | STRTOG_Overflow | STRTOG_Inexhi; - SET_ERRNO(ERANGE); - b->wds = inex = 0; - } - *expo = e; - copybits(bits, nb, b); - *irv |= inex; - rv = 1; - ret: - Bfree(b); - return rv; -} - -static int mantbits (dbl_union *d) -{ - ULong L; - if ( (L = word1(d)) !=0) - return P - lo0bits(&L); - L = word0(d) | Exp_msk1; - return P - 32 - lo0bits(&L); -} - -int __strtodg (const char *s00, char **se, FPI *fpi, Long *expo, ULong *bits) -{ - int abe, abits, asub; - int bb0, bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, decpt, denorm; - int dsign, e, e1, e2, emin, esign, finished, i, inex, irv; - int j, k, nbits, nd, nd0, nf, nz, nz0, rd, rvbits, rve, rve1, sign; - int sudden_underflow; - const char *s, *s0, *s1; - double adj0, tol; - Long L; - union _dbl_union adj, rv; - ULong *b, *be, y, z; - Bigint *ab, *bb, *bb1, *bd, *bd0, *bs, *delta, *rvb, *rvb0; -#ifdef USE_LOCALE /*{{*/ -#ifdef NO_LOCALE_CACHE - char *decimalpoint = localeconv()->decimal_point; - int dplen = strlen(decimalpoint); -#else - char *decimalpoint; - static char *decimalpoint_cache; - static int dplen; - if (!(s0 = decimalpoint_cache)) { - s0 = localeconv()->decimal_point; - if ((decimalpoint_cache = (char*)MALLOC(strlen(s0) + 1))) { - strcpy(decimalpoint_cache, s0); - s0 = decimalpoint_cache; - } - dplen = strlen(s0); - } - decimalpoint = (char*)s0; -#endif /*NO_LOCALE_CACHE*/ -#else /*USE_LOCALE}{*/ -#define dplen 1 -#endif /*USE_LOCALE}}*/ - - irv = STRTOG_Zero; - denorm = sign = nz0 = nz = 0; - dval(&rv) = 0.; - rvb = 0; - nbits = fpi->nbits; - for(s = s00;;s++) switch(*s) { - case '-': - sign = 1; - /* no break */ - case '+': - if (*++s) - goto break2; - /* no break */ - case 0: - sign = 0; - irv = STRTOG_NoNumber; - s = s00; - goto ret; - case '\t': - case '\n': - case '\v': - case '\f': - case '\r': - case ' ': - continue; - default: - goto break2; - } - break2: - if (*s == '0') { -#ifndef NO_HEX_FP - switch(s[1]) { - case 'x': - case 'X': - irv = gethex(&s, fpi, expo, &rvb, sign); - if (irv == STRTOG_NoNumber) { - s = s00; - sign = 0; - } - goto ret; - } -#endif - nz0 = 1; - while(*++s == '0') ; - if (!*s) - goto ret; - } - sudden_underflow = fpi->sudden_underflow; - s0 = s; - y = z = 0; - for(decpt = nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++) - if (nd < 9) - y = 10*y + c - '0'; - else if (nd < 16) - z = 10*z + c - '0'; - nd0 = nd; -#ifdef USE_LOCALE - if (c == *decimalpoint) { - for(i = 1; decimalpoint[i]; ++i) - if (s[i] != decimalpoint[i]) - goto dig_done; - s += i; - c = *s; -#else - if (c == '.') { - c = *++s; -#endif - decpt = 1; - if (!nd) { - for(; c == '0'; c = *++s) - nz++; - if (c > '0' && c <= '9') { - s0 = s; - nf += nz; - nz = 0; - goto have_dig; - } - goto dig_done; - } - for(; c >= '0' && c <= '9'; c = *++s) { - have_dig: - nz++; - if (c -= '0') { - nf += nz; - for(i = 1; i < nz; i++) - if (nd++ < 9) - y *= 10; - else if (nd <= DBL_DIG + 1) - z *= 10; - if (nd++ < 9) - y = 10*y + c; - else if (nd <= DBL_DIG + 1) - z = 10*z + c; - nz = 0; - } - } - }/*}*/ - dig_done: - e = 0; - if (c == 'e' || c == 'E') { - if (!nd && !nz && !nz0) { - irv = STRTOG_NoNumber; - s = s00; - goto ret; - } - s00 = s; - esign = 0; - switch(c = *++s) { - case '-': - esign = 1; - case '+': - c = *++s; - } - if (c >= '0' && c <= '9') { - while(c == '0') - c = *++s; - if (c > '0' && c <= '9') { - L = c - '0'; - s1 = s; - while((c = *++s) >= '0' && c <= '9') - L = 10*L + c - '0'; - if (s - s1 > 8 || L > 19999) - /* Avoid confusion from exponents - * so large that e might overflow. - */ - e = 19999; /* safe for 16 bit ints */ - else - e = (int)L; - if (esign) - e = -e; - } - else - e = 0; - } - else - s = s00; - } - if (!nd) { - if (!nz && !nz0) { -#ifdef INFNAN_CHECK - /* Check for Nan and Infinity */ - if (!decpt) - switch(c) { - case 'i': - case 'I': - if (match(&s,"nf")) { - --s; - if (!match(&s,"inity")) - ++s; - irv = STRTOG_Infinite; - goto infnanexp; - } - break; - case 'n': - case 'N': - if (match(&s, "an")) { - irv = STRTOG_NaN; - *expo = fpi->emax + 1; -#ifndef No_Hex_NaN - if (*s == '(') /*)*/ - irv = hexnan(&s, fpi, bits); -#endif - goto infnanexp; - } - } -#endif /* INFNAN_CHECK */ - irv = STRTOG_NoNumber; - s = s00; - } - goto ret; - } - - irv = STRTOG_Normal; - e1 = e -= nf; - rd = 0; - switch(fpi->rounding & 3) { - case FPI_Round_up: - rd = 2 - sign; - break; - case FPI_Round_zero: - rd = 1; - break; - case FPI_Round_down: - rd = 1 + sign; - } - - /* Now we have nd0 digits, starting at s0, followed by a - * decimal point, followed by nd-nd0 digits. The number we're - * after is the integer represented by those digits times - * 10**e */ - - if (!nd0) - nd0 = nd; - k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1; - dval(&rv) = y; - if (k > 9) - dval(&rv) = tens[k - 9] * dval(&rv) + z; - bd0 = 0; - if (nbits <= P && nd <= DBL_DIG) { - if (!e) { - if (rvOK(&rv, fpi, expo, bits, 1, rd, &irv)) - goto ret; - } - else if (e > 0) { - if (e <= Ten_pmax) { - i = fivesbits[e] + mantbits(&rv) <= P; - /* rv = */ rounded_product(dval(&rv), tens[e]); - if (rvOK(&rv, fpi, expo, bits, i, rd, &irv)) - goto ret; - e1 -= e; - goto rv_notOK; - } - i = DBL_DIG - nd; - if (e <= Ten_pmax + i) { - /* A fancier test would sometimes let us do - * this for larger i values. - */ - e2 = e - i; - e1 -= i; - dval(&rv) *= tens[i]; - /* rv = */ rounded_product(dval(&rv), tens[e2]); - if (rvOK(&rv, fpi, expo, bits, 0, rd, &irv)) - goto ret; - e1 -= e2; - } - } -#ifndef Inaccurate_Divide - else if (e >= -Ten_pmax) { - /* rv = */ rounded_quotient(dval(&rv), tens[-e]); - if (rvOK(&rv, fpi, expo, bits, 0, rd, &irv)) - goto ret; - e1 -= e; - } -#endif - } - rv_notOK: - e1 += nd - k; - - /* Get starting approximation = rv * 10**e1 */ - - e2 = 0; - if (e1 > 0) { - if ( (i = e1 & 15) !=0) - dval(&rv) *= tens[i]; - if (e1 &= ~15) { - e1 >>= 4; - while(e1 >= (1 << (n_bigtens-1))) { - e2 += ((word0(&rv) & Exp_mask) - >> Exp_shift1) - Bias; - word0(&rv) &= ~Exp_mask; - word0(&rv) |= Bias << Exp_shift1; - dval(&rv) *= bigtens[n_bigtens-1]; - e1 -= 1 << (n_bigtens-1); - } - e2 += ((word0(&rv) & Exp_mask) >> Exp_shift1) - Bias; - word0(&rv) &= ~Exp_mask; - word0(&rv) |= Bias << Exp_shift1; - for(j = 0; e1 > 0; j++, e1 >>= 1) - if (e1 & 1) - dval(&rv) *= bigtens[j]; - } - } - else if (e1 < 0) { - e1 = -e1; - if ( (i = e1 & 15) !=0) - dval(&rv) /= tens[i]; - if (e1 &= ~15) { - e1 >>= 4; - while(e1 >= (1 << (n_bigtens-1))) { - e2 += ((word0(&rv) & Exp_mask) - >> Exp_shift1) - Bias; - word0(&rv) &= ~Exp_mask; - word0(&rv) |= Bias << Exp_shift1; - dval(&rv) *= tinytens[n_bigtens-1]; - e1 -= 1 << (n_bigtens-1); - } - e2 += ((word0(&rv) & Exp_mask) >> Exp_shift1) - Bias; - word0(&rv) &= ~Exp_mask; - word0(&rv) |= Bias << Exp_shift1; - for(j = 0; e1 > 0; j++, e1 >>= 1) - if (e1 & 1) - dval(&rv) *= tinytens[j]; - } - } - rvb = d2b(dval(&rv), &rve, &rvbits); /* rv = rvb * 2^rve */ - rve += e2; - if ((j = rvbits - nbits) > 0) { - rshift(rvb, j); - rvbits = nbits; - rve += j; - } - bb0 = 0; /* trailing zero bits in rvb */ - e2 = rve + rvbits - nbits; - if (e2 > fpi->emax + 1) - goto huge; - rve1 = rve + rvbits - nbits; - if (e2 < (emin = fpi->emin)) { - denorm = 1; - j = rve - emin; - if (j > 0) { - rvb = lshift(rvb, j); - rvbits += j; - } - else if (j < 0) { - rvbits += j; - if (rvbits <= 0) { - if (rvbits < -1) { - ufl: - rvb->wds = 0; - rvb->x[0] = 0; - *expo = emin; - irv = STRTOG_Underflow | STRTOG_Inexlo; - goto ret; - } - rvb->x[0] = rvb->wds = rvbits = 1; - } - else - rshift(rvb, -j); - } - rve = rve1 = emin; - if (sudden_underflow && e2 + 1 < emin) - goto ufl; - } - - /* Now the hard part -- adjusting rv to the correct value.*/ - - /* Put digits into bd: true value = bd * 10^e */ - - bd0 = s2b(s0, nd0, nd, y, dplen); - - for(;;) { - bd = Balloc(bd0->k); - Bcopy(bd, bd0); - bb = Balloc(rvb->k); - Bcopy(bb, rvb); - bbbits = rvbits - bb0; - bbe = rve + bb0; - bs = i2b(1); - - if (e >= 0) { - bb2 = bb5 = 0; - bd2 = bd5 = e; - } - else { - bb2 = bb5 = -e; - bd2 = bd5 = 0; - } - if (bbe >= 0) - bb2 += bbe; - else - bd2 -= bbe; - bs2 = bb2; - j = nbits + 1 - bbbits; - i = bbe + bbbits - nbits; - if (i < emin) /* denormal */ - j += i - emin; - bb2 += j; - bd2 += j; - i = bb2 < bd2 ? bb2 : bd2; - if (i > bs2) - i = bs2; - if (i > 0) { - bb2 -= i; - bd2 -= i; - bs2 -= i; - } - if (bb5 > 0) { - bs = pow5mult(bs, bb5); - bb1 = mult(bs, bb); - Bfree(bb); - bb = bb1; - } - bb2 -= bb0; - if (bb2 > 0) - bb = lshift(bb, bb2); - else if (bb2 < 0) - rshift(bb, -bb2); - if (bd5 > 0) - bd = pow5mult(bd, bd5); - if (bd2 > 0) - bd = lshift(bd, bd2); - if (bs2 > 0) - bs = lshift(bs, bs2); - asub = 1; - inex = STRTOG_Inexhi; - delta = diff(bb, bd); - if (delta->wds <= 1 && !delta->x[0]) - break; - dsign = delta->sign; - delta->sign = finished = 0; - L = 0; - i = cmp(delta, bs); - if (rd && i <= 0) { - irv = STRTOG_Normal; - if ( (finished = dsign ^ (rd&1)) !=0) { - if (dsign != 0) { - irv |= STRTOG_Inexhi; - goto adj1; - } - irv |= STRTOG_Inexlo; - if (rve1 == emin) - goto adj1; - for(i = 0, j = nbits; j >= ULbits; - i++, j -= ULbits) { - if (rvb->x[i] & ALL_ON) - goto adj1; - } - if (j > 1 && lo0bits(rvb->x + i) < j - 1) - goto adj1; - rve = rve1 - 1; - rvb = set_ones(rvb, rvbits = nbits); - break; - } - irv |= dsign ? STRTOG_Inexlo : STRTOG_Inexhi; - break; - } - if (i < 0) { - /* Error is less than half an ulp -- check for - * special case of mantissa a power of two. - */ - irv = dsign - ? STRTOG_Normal | STRTOG_Inexlo - : STRTOG_Normal | STRTOG_Inexhi; - if (dsign || bbbits > 1 || denorm || rve1 == emin) - break; - delta = lshift(delta,1); - if (cmp(delta, bs) > 0) { - irv = STRTOG_Normal | STRTOG_Inexlo; - goto drop_down; - } - break; - } - if (i == 0) { - /* exactly half-way between */ - if (dsign) { - if (denorm && all_on(rvb, rvbits)) { - /*boundary case -- increment exponent*/ - rvb->wds = 1; - rvb->x[0] = 1; - rve = emin + nbits - (rvbits = 1); - irv = STRTOG_Normal | STRTOG_Inexhi; - denorm = 0; - break; - } - irv = STRTOG_Normal | STRTOG_Inexlo; - } - else if (bbbits == 1) { - irv = STRTOG_Normal; - drop_down: - /* boundary case -- decrement exponent */ - if (rve1 == emin) { - irv = STRTOG_Normal | STRTOG_Inexhi; - if (rvb->wds == 1 && rvb->x[0] == 1) - sudden_underflow = 1; - break; - } - rve -= nbits; - rvb = set_ones(rvb, rvbits = nbits); - break; - } - else - irv = STRTOG_Normal | STRTOG_Inexhi; - if ((bbbits < nbits && !denorm) || !(rvb->x[0] & 1)) - break; - if (dsign) { - rvb = increment(rvb); - j = kmask & (ULbits - (rvbits & kmask)); - if (hi0bits(rvb->x[rvb->wds - 1]) != j) - rvbits++; - irv = STRTOG_Normal | STRTOG_Inexhi; - } - else { - if (bbbits == 1) - goto undfl; - decrement(rvb); - irv = STRTOG_Normal | STRTOG_Inexlo; - } - break; - } - if ((dval(&adj) = ratio(delta, bs)) <= 2.) { - adj1: - inex = STRTOG_Inexlo; - if (dsign) { - asub = 0; - inex = STRTOG_Inexhi; - } - else if (denorm && bbbits <= 1) { - undfl: - rvb->wds = 0; - rve = emin; - irv = STRTOG_Underflow | STRTOG_Inexlo; - break; - } - adj0 = dval(&adj) = 1.; - } - else { - adj0 = dval(&adj) *= 0.5; - if (dsign) { - asub = 0; - inex = STRTOG_Inexlo; - } - if (dval(&adj) < 2147483647.) { - L = adj0; - adj0 -= L; - switch(rd) { - case 0: - if (adj0 >= .5) - goto inc_L; - break; - case 1: - if (asub && adj0 > 0.) - goto inc_L; - break; - case 2: - if (!asub && adj0 > 0.) { - inc_L: - L++; - inex = STRTOG_Inexact - inex; - } - } - dval(&adj) = L; - } - } - y = rve + rvbits; - - /* adj *= ulp(&rv); */ - /* if (asub) rv -= adj; else rv += adj; */ - - if (!denorm && rvbits < nbits) { - rvb = lshift(rvb, j = nbits - rvbits); - rve -= j; - rvbits = nbits; - } - ab = d2b(dval(&adj), &abe, &abits); - if (abe < 0) - rshift(ab, -abe); - else if (abe > 0) - ab = lshift(ab, abe); - rvb0 = rvb; - if (asub) { - /* rv -= adj; */ - j = hi0bits(rvb->x[rvb->wds-1]); - rvb = diff(rvb, ab); - k = rvb0->wds - 1; - if (denorm) - /* do nothing */; - else if (rvb->wds <= k - || hi0bits( rvb->x[k]) > - hi0bits(rvb0->x[k])) { - /* unlikely; can only have lost 1 high bit */ - if (rve1 == emin) { - --rvbits; - denorm = 1; - } - else { - rvb = lshift(rvb, 1); - --rve; - --rve1; - L = finished = 0; - } - } - } - else { - rvb = sum(rvb, ab); - k = rvb->wds - 1; - if (k >= rvb0->wds - || hi0bits(rvb->x[k]) < hi0bits(rvb0->x[k])) { - if (denorm) { - if (++rvbits == nbits) - denorm = 0; - } - else { - rshift(rvb, 1); - rve++; - rve1++; - L = 0; - } - } - } - Bfree(ab); - Bfree(rvb0); - if (finished) - break; - - z = rve + rvbits; - if (y == z && L) { - /* Can we stop now? */ - tol = dval(&adj) * 5e-16; /* > max rel error */ - dval(&adj) = adj0 - .5; - if (dval(&adj) < -tol) { - if (adj0 > tol) { - irv |= inex; - break; - } - } - else if (dval(&adj) > tol && adj0 < 1. - tol) { - irv |= inex; - break; - } - } - bb0 = denorm ? 0 : trailz(rvb); - Bfree(bb); - Bfree(bd); - Bfree(bs); - Bfree(delta); - } - if (!denorm && (j = nbits - rvbits)) { - if (j > 0) - rvb = lshift(rvb, j); - else - rshift(rvb, -j); - rve -= j; - } - *expo = rve; - Bfree(bb); - Bfree(bd); - Bfree(bs); - Bfree(bd0); - Bfree(delta); - if (rve > fpi->emax) { - switch(fpi->rounding & 3) { - case FPI_Round_near: - goto huge; - case FPI_Round_up: - if (!sign) - goto huge; - break; - case FPI_Round_down: - if (sign) - goto huge; - } - /* Round to largest representable magnitude */ - Bfree(rvb); - rvb = 0; - irv = STRTOG_Normal | STRTOG_Inexlo; - *expo = fpi->emax; - b = bits; - be = b + ((fpi->nbits + 31) >> 5); - while(b < be) - *b++ = -1; - if ((j = fpi->nbits & 0x1f)) - *--be >>= (32 - j); - goto ret; - huge: - rvb->wds = 0; - irv = STRTOG_Infinite | STRTOG_Overflow | STRTOG_Inexhi; - SET_ERRNO(ERANGE); - infnanexp: - *expo = fpi->emax + 1; - } - ret: - if (denorm) { - if (sudden_underflow) { - rvb->wds = 0; - irv = STRTOG_Underflow | STRTOG_Inexlo; - SET_ERRNO(ERANGE); - } - else { - irv = (irv & ~STRTOG_Retmask) | - (rvb->wds > 0 ? STRTOG_Denormal : STRTOG_Zero); - if (irv & STRTOG_Inexact) { - irv |= STRTOG_Underflow; - SET_ERRNO(ERANGE); - } - } - } - if (se) - *se = (char *)s; - if (sign) - irv |= STRTOG_Neg; - if (rvb) { - copybits(bits, nbits, rvb); - Bfree(rvb); - } - return irv; -} diff --git a/src/lib/evil/gdtoa/strtof.c b/src/lib/evil/gdtoa/strtof.c deleted file mode 100644 index 71be222..0000000 --- a/src/lib/evil/gdtoa/strtof.c +++ /dev/null @@ -1,77 +0,0 @@ -/**************************************************************** - -The author of this software is David M. Gay. - -Copyright (C) 1998, 2000 by Lucent Technologies -All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appear in all -copies and that both that the copyright notice and this -permission notice and warranty disclaimer appear in supporting -documentation, and that the name of Lucent or any of its entities -not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. -IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY -SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER -IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - -****************************************************************/ - -/* Please send bug reports to David M. Gay (dmg at acm dot org, - * with " at " changed at "@" and " dot " changed to "."). */ - -#include "gdtoaimp.h" - -float __evil_strtof (const char *s, char **sp) -{ - static FPI fpi0 = { 24, 1-127-24+1, 254-127-24+1, 1, SI, Int_max }; - ULong bits[1]; - Long expo; - int k; - union { ULong L[1]; float f; } u = { { 0 } }; -#ifdef Honor_FLT_ROUNDS -#include "gdtoa_fltrnds.h" -#else -#define fpi &fpi0 -#endif - - k = __strtodg(s, sp, fpi, &expo, bits); - switch(k & STRTOG_Retmask) { - case STRTOG_NoNumber: - case STRTOG_Zero: - u.L[0] = 0; - break; - - case STRTOG_Normal: - case STRTOG_NaNbits: - u.L[0] = (bits[0] & 0x7fffff) | ((expo + 0x7f + 23) << 23); - break; - - case STRTOG_Denormal: - u.L[0] = bits[0]; - break; - - case STRTOG_Infinite: - u.L[0] = 0x7f800000; - break; - - case STRTOG_NaN: - u.L[0] = f_QNAN; - } - if (k & STRTOG_Neg) - u.L[0] |= 0x80000000L; - return u.f; -} - -/* float __cdecl */ -/* __evil_strtof (const char * __restrict__ src, char ** __restrict__ endptr) */ -/* __attribute__((alias("__strtof"))); */ diff --git a/src/lib/evil/gdtoa/strtopx.c b/src/lib/evil/gdtoa/strtopx.c deleted file mode 100644 index 68b3ab3..0000000 --- a/src/lib/evil/gdtoa/strtopx.c +++ /dev/null @@ -1,119 +0,0 @@ -/**************************************************************** - -The author of this software is David M. Gay. - -Copyright (C) 1998, 2000 by Lucent Technologies -All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appear in all -copies and that both that the copyright notice and this -permission notice and warranty disclaimer appear in supporting -documentation, and that the name of Lucent or any of its entities -not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. -IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY -SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER -IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - -****************************************************************/ - -/* Please send bug reports to David M. Gay (dmg at acm dot org, - * with " at " changed at "@" and " dot " changed to "."). */ - -#include "gdtoaimp.h" - -#undef _0 -#undef _1 - -/* one or the other of IEEE_MC68k or IEEE_8087 should be #defined */ - -#ifdef IEEE_MC68k -#define _0 0 -#define _1 1 -#define _2 2 -#define _3 3 -#define _4 4 -#endif -#ifdef IEEE_8087 -#define _0 4 -#define _1 3 -#define _2 2 -#define _3 1 -#define _4 0 -#endif - -typedef union lD { - UShort L[5]; - long double D; -} lD; - -static int __strtopx (const char *s, char **sp, lD *V) -{ - static FPI fpi0 = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, SI, Int_max }; - ULong bits[2]; - Long expo; - int k; - UShort *L = & (V->L[0]); -#ifdef Honor_FLT_ROUNDS -#include "gdtoa_fltrnds.h" -#else -#define fpi &fpi0 -#endif - V->D = 0.0L; - - k = __strtodg(s, sp, fpi, &expo, bits); - switch(k & STRTOG_Retmask) { - case STRTOG_NoNumber: - case STRTOG_Zero: - L[0] = L[1] = L[2] = L[3] = L[4] = 0; - break; - - case STRTOG_Denormal: - L[_0] = 0; - goto normal_bits; - - case STRTOG_Normal: - case STRTOG_NaNbits: - L[_0] = expo + 0x3fff + 63; - normal_bits: - L[_4] = (UShort)bits[0]; - L[_3] = (UShort)(bits[0] >> 16); - L[_2] = (UShort)bits[1]; - L[_1] = (UShort)(bits[1] >> 16); - break; - - case STRTOG_Infinite: - L[_0] = 0x7fff; - L[_1] = 0x8000; - L[_2] = L[_3] = L[_4] = 0; - break; - - case STRTOG_NaN: - L[0] = ldus_QNAN0; - L[1] = ldus_QNAN1; - L[2] = ldus_QNAN2; - L[3] = ldus_QNAN3; - L[4] = ldus_QNAN4; - } - if (k & STRTOG_Neg) - L[_0] |= 0x8000; - return k; -} - -long double __cdecl -__evil_strtold (const char * __restrict__ src, char ** __restrict__ endptr) -{ - lD ret; - ret.D = 0.0L; - __strtopx(src, endptr, &ret); - return ret.D; -} diff --git a/src/lib/evil/gdtoa/sum.c b/src/lib/evil/gdtoa/sum.c deleted file mode 100644 index 8823541..0000000 --- a/src/lib/evil/gdtoa/sum.c +++ /dev/null @@ -1,91 +0,0 @@ -/**************************************************************** - -The author of this software is David M. Gay. - -Copyright (C) 1998 by Lucent Technologies -All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appear in all -copies and that both that the copyright notice and this -permission notice and warranty disclaimer appear in supporting -documentation, and that the name of Lucent or any of its entities -not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. -IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY -SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER -IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - -****************************************************************/ - -/* Please send bug reports to David M. Gay (dmg at acm dot org, - * with " at " changed at "@" and " dot " changed to "."). */ - -#include "gdtoaimp.h" - -Bigint *sum (Bigint *a, Bigint *b) -{ - Bigint *c; - ULong carry, *xc, *xa, *xb, *xe, y; -#ifdef Pack_32 - ULong z; -#endif - - if (a->wds < b->wds) { - c = b; b = a; a = c; - } - c = Balloc(a->k); - c->wds = a->wds; - carry = 0; - xa = a->x; - xb = b->x; - xc = c->x; - xe = xc + b->wds; -#ifdef Pack_32 - do { - y = (*xa & 0xffff) + (*xb & 0xffff) + carry; - carry = (y & 0x10000) >> 16; - z = (*xa++ >> 16) + (*xb++ >> 16) + carry; - carry = (z & 0x10000) >> 16; - Storeinc(xc, z, y); - } while(xc < xe); - xe += a->wds - b->wds; - while(xc < xe) { - y = (*xa & 0xffff) + carry; - carry = (y & 0x10000) >> 16; - z = (*xa++ >> 16) + carry; - carry = (z & 0x10000) >> 16; - Storeinc(xc, z, y); - } -#else - do { - y = *xa++ + *xb++ + carry; - carry = (y & 0x10000) >> 16; - *xc++ = y & 0xffff; - } while(xc < xe); - xe += a->wds - b->wds; - while(xc < xe) { - y = *xa++ + carry; - carry = (y & 0x10000) >> 16; - *xc++ = y & 0xffff; - } -#endif - if (carry) { - if (c->wds == c->maxwds) { - b = Balloc(c->k + 1); - Bcopy(b, c); - Bfree(c); - c = b; - } - c->x[c->wds++] = 1; - } - return c; -} diff --git a/src/lib/evil/gdtoa/ulp.c b/src/lib/evil/gdtoa/ulp.c deleted file mode 100644 index bfa9bde..0000000 --- a/src/lib/evil/gdtoa/ulp.c +++ /dev/null @@ -1,61 +0,0 @@ -/**************************************************************** - -The author of this software is David M. Gay. - -Copyright (C) 1998, 1999 by Lucent Technologies -All Rights Reserved - -Permission to use, copy, modify, and distribute this software and -its documentation for any purpose and without fee is hereby -granted, provided that the above copyright notice appear in all -copies and that both that the copyright notice and this -permission notice and warranty disclaimer appear in supporting -documentation, and that the name of Lucent or any of its entities -not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. -IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY -SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER -IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - -****************************************************************/ - -/* Please send bug reports to David M. Gay (dmg at acm dot org, - * with " at " changed at "@" and " dot " changed to "."). */ - -#include "gdtoaimp.h" - -double ulp (dbl_union *x) -{ - Long L; - union _dbl_union a; - - L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1; -#ifndef Sudden_Underflow - if (L > 0) { -#endif - word0(&a) = L; - word1(&a) = 0; -#ifndef Sudden_Underflow - } - else { - L = -L >> Exp_shift; - if (L < Exp_shift) { - word0(&a) = 0x80000 >> L; - word1(&a) = 0; - } - else { - word0(&a) = 0; - L -= Exp_shift; - word1(&a) = L >= 31 ? 1 : 1 << (31 - L); - } - } -#endif - return dval(&a); -} diff --git a/src/lib/evil/regex/regcomp.c b/src/lib/evil/regex/regcomp.c index 080d292..c1b7850 100644 --- a/src/lib/evil/regex/regcomp.c +++ b/src/lib/evil/regex/regcomp.c @@ -1179,9 +1179,10 @@ register cset *cs; register char *cp; { register char *fp = mcfind(cs, cp); - register size_t len = strlen(fp); + register size_t len; assert(fp != NULL); + len = strlen(fp); (void) memmove(fp, fp + len + 1, cs->smultis - (fp + len + 1 - cs->multis)); cs->smultis -= len; diff --git a/src/lib/evil/sys/mman.h b/src/lib/evil/sys/mman.h index 575f126..0a36ebf 100644 --- a/src/lib/evil/sys/mman.h +++ b/src/lib/evil/sys/mman.h @@ -148,5 +148,8 @@ EAPI int munmap(void *addr, #endif +#include + + #endif /* __EVIL_SYS_MMAN_H__ */ diff --git a/src/modules/evas/engines/gl_common/evas_gl_api.c b/src/modules/evas/engines/gl_common/evas_gl_api.c index cd92fa7..ecb513a 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_api.c +++ b/src/modules/evas/engines/gl_common/evas_gl_api.c @@ -1,7 +1,10 @@ #define GL_ERRORS_NODEF 1 #include "evas_gl_core_private.h" #include "evas_gl_api_ext.h" -#include + +#ifndef _WIN32 +# include +#endif #define EVGL_FUNC_BEGIN() if (UNLIKELY(_need_context_restore)) _context_restore() diff --git a/src/modules/evas/engines/gl_common/evas_gl_api_ext.c b/src/modules/evas/engines/gl_common/evas_gl_api_ext.c index f41400b..f9f4259 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_api_ext.c +++ b/src/modules/evas/engines/gl_common/evas_gl_api_ext.c @@ -1,7 +1,9 @@ #include "evas_gl_api_ext.h" -#include +#ifndef _WIN32 +# include +#endif #define EVGL_FUNC_BEGIN() if (UNLIKELY(_need_context_restore)) _context_restore() diff --git a/src/modules/evas/engines/gl_common/evas_gl_api_gles1.c b/src/modules/evas/engines/gl_common/evas_gl_api_gles1.c index 28d4784..0619c03 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_api_gles1.c +++ b/src/modules/evas/engines/gl_common/evas_gl_api_gles1.c @@ -1,7 +1,9 @@ #define GL_ERRORS_NODEF 1 #include "evas_gl_core_private.h" -#include +#ifndef _WIN32 +# include +#endif #define EVGL_FUNC_BEGIN() if (UNLIKELY(_need_context_restore)) _context_restore() diff --git a/src/modules/evas/engines/gl_common/evas_gl_common.h b/src/modules/evas/engines/gl_common/evas_gl_common.h index ea05425..9461b8f 100755 --- a/src/modules/evas/engines/gl_common/evas_gl_common.h +++ b/src/modules/evas/engines/gl_common/evas_gl_common.h @@ -777,7 +777,11 @@ void pt_unref(Evas_GL_Texture_Pool *pt); //#define GL_ERRORS_TRACE 1 #ifdef GL_ERRORS -#include + +# ifndef _WIN32 +# include +# endif + static inline void __evas_gl_errdyn(int err, const char *file, const char *func, int line, const char *op) { diff --git a/src/modules/evas/engines/gl_common/evas_gl_context.c b/src/modules/evas/engines/gl_common/evas_gl_context.c index c0e7fe2..1e8c4a1 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_context.c +++ b/src/modules/evas/engines/gl_common/evas_gl_context.c @@ -1,7 +1,7 @@ #define _EVAS_GL_CONTEXT_C #include "evas_gl_private.h" -#ifdef HAVE_DLSYM +#if defined HAVE_DLSYM && ! defined _WIN32 # include /* dlopen,dlclose,etc */ #else # error gl_common should not get compiled if dlsym is not found on the system! diff --git a/src/modules/evas/engines/gl_common/evas_gl_core.c b/src/modules/evas/engines/gl_common/evas_gl_core.c index 4a07eba..91c6f61 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_core.c +++ b/src/modules/evas/engines/gl_common/evas_gl_core.c @@ -1,5 +1,8 @@ #include "evas_gl_core_private.h" -#include + +#ifndef _WIN32 +# include +#endif // EVGL GL Format Pair typedef struct _GL_Format diff --git a/src/modules/evas/engines/gl_generic/evas_engine.c b/src/modules/evas/engines/gl_generic/evas_engine.c index 8fe092c..0ccea59 100644 --- a/src/modules/evas/engines/gl_generic/evas_engine.c +++ b/src/modules/evas/engines/gl_generic/evas_engine.c @@ -5,7 +5,7 @@ #include "ector_cairo_software_surface.eo.h" -#ifdef HAVE_DLSYM +#if defined HAVE_DLSYM && ! defined _WIN32 # include /* dlopen,dlclose,etc */ #else # error gl_x11 should not get compiled if dlsym is not found on the system! diff --git a/src/modules/evas/engines/software_generic/evas_engine.c b/src/modules/evas/engines/software_generic/evas_engine.c index 3c0e5e4..3857dd1 100644 --- a/src/modules/evas/engines/software_generic/evas_engine.c +++ b/src/modules/evas/engines/software_generic/evas_engine.c @@ -11,9 +11,11 @@ #include "ector_cairo_software_surface.eo.h" -#ifdef HAVE_DLSYM +#if defined HAVE_DLSYM && ! defined _WIN32 # include /* dlopen,dlclose,etc */ +#endif +#if defined HAVE_DLSYM # define EVAS_GL 1 # define EVAS_GL_NO_GL_H_CHECK 1 # include "Evas_GL.h" diff --git a/src/modules/evas/engines/software_generic/evas_native_tbm.c b/src/modules/evas/engines/software_generic/evas_native_tbm.c index 07b4414..b6931a9 100644 --- a/src/modules/evas/engines/software_generic/evas_native_tbm.c +++ b/src/modules/evas/engines/software_generic/evas_native_tbm.c @@ -2,7 +2,7 @@ #include "evas_private.h" #include "evas_native_common.h" -#ifdef HAVE_DLSYM +#if defined HAVE_DLSYM && ! defined _WIN32 # include /* dlopen,dlclose,etc */ #else # warning native_tbm should not get compiled if dlsym is not found on the system! diff --git a/src/tests/evas/evas_test_evasgl.c b/src/tests/evas/evas_test_evasgl.c index 8b75777..3263cfa 100644 --- a/src/tests/evas/evas_test_evasgl.c +++ b/src/tests/evas/evas_test_evasgl.c @@ -11,7 +11,10 @@ #endif #include -#include + +#ifndef _WIN32 +# include +#endif #define EFL_GFX_FILTER_BETA #include "evas_suite.h" diff --git a/src/tests/evil/evil_suite.c b/src/tests/evil/evil_suite.c index 2699bee..bc8bd79 100644 --- a/src/tests/evil/evil_suite.c +++ b/src/tests/evil/evil_suite.c @@ -23,18 +23,10 @@ #include #include -#include - #include "evil_suite.h" +#include "../efl_check.h" -typedef struct _Evil_Test_Case Evil_Test_Case; -struct _Evil_Test_Case -{ - const char *test_case; - void (*build)(TCase *tc); -}; - -static const Evil_Test_Case etc[] = { +static const Efl_Test_Case etc[] = { /* { "Dirent", evil_test_dirent }, */ { "Dlfcn", evil_test_dlfcn }, /* { "Fcntl", evil_test_fcntl }, */ @@ -54,85 +46,18 @@ static const Evil_Test_Case etc[] = { { NULL, NULL } }; -static void -_list_tests(void) -{ - const Evil_Test_Case *itr = etc; - fputs("Available Test Cases:\n", stderr); - for (; itr->test_case; itr++) - fprintf(stderr, "\t%s\n", itr->test_case); -} - -static unsigned char -_use_test(int argc, const char **argv, const char *test_case) -{ - if (argc < 1) - return 1; - - for (; argc > 0; argc--, argv++) - if (strcmp(test_case, *argv) == 0) - return 1; - - return 0; -} - -Suite * -evil_build_suite(int argc, const char **argv) -{ - TCase *tc; - Suite *s; - int i; - - s = suite_create("Evil"); - - for (i = 0; etc[i].test_case; ++i) - { - if (!_use_test(argc, argv, etc[i].test_case)) - continue; - - tc = tcase_create(etc[i].test_case); -#ifndef _WIN32 - tcase_set_timeout(tc, 0); -#endif - - etc[i].build(tc); - suite_add_tcase(s, tc); - } - - return s; -} - int main(int argc, char **argv) { - Suite *s; - SRunner *sr; - int i, failed_count; + int failed_count; - for (i = 1; i < argc; i++) - if ((strcmp(argv[i], "-h") == 0) || - (strcmp(argv[i], "--help") == 0)) - { - fprintf(stderr, "Usage:\n\t%s [test_case1 .. [test_caseN]]\n", - argv[0]); - _list_tests(); - return 0; - } - else if ((strcmp(argv[i], "-l") == 0) || - (strcmp(argv[i], "--list") == 0)) - { - _list_tests(); - return 0; - } + if (!_efl_test_option_disp(argc, argv, etc)) + return 0; putenv("EFL_RUN_IN_TREE=1"); - s = evil_build_suite(argc - 1, (const char **)argv + 1); - sr = srunner_create(s); - srunner_set_xml(sr, TESTS_BUILD_DIR "/check-results.xml"); - srunner_run_all(sr, CK_ENV); - failed_count = srunner_ntests_failed(sr); - srunner_free(sr); + failed_count = _efl_suite_build_and_run(argc - 1, (const char **)argv + 1, + "Evil", etc); return (failed_count == 0) ? 0 : 255; } diff --git a/src/tests/evil/evil_test_dlfcn.c b/src/tests/evil/evil_test_dlfcn.c index 28ee5b5..0d0980e 100644 --- a/src/tests/evil/evil_test_dlfcn.c +++ b/src/tests/evil/evil_test_dlfcn.c @@ -20,7 +20,6 @@ # include "config.h" #endif -#include #include #include "evil_suite.h" -- 2.7.4